ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwppbmRleCBlM2MyMWY5Li5hODM0NTY4IDEwMDY0NAotLS0gYS9DSEFOR0VMT0cKKysrIGIvQ0hBTkdFTE9HCkBAIC0xLDMgKzEsMzA5NSBAQAorY29tbWl0IDA3M2UxYjUwOTk4MGNlZmU2ZjUzYzJkN2ZiYmNkMTM1ZGYxZTM5MjQKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEF1ZyAxNCAxMDozMjo1OSAyMDA3IC0wNTAwCisKKyAgICBGaXggaW5pdHJkL2R0YiBpbnRlcmFjdGlvbgorCisgICAgVGhlIG9yaWdpbmFsIGNvZGUgd291bGQgd3JvbmdseSByZWxvY2F0ZSB0aGUgYmxvYiB0byBiZSByaWdodCBiZWZvcmUKKyAgICB0aGUgaW5pdHJkIGlmIGl0IGV4aXN0ZWQuICBUaGUgYmxvYiAqbXVzdCogYmUgd2l0aGluIENGR19CT09UTUFQU1osCisgICAgaWYgaXQgaXMgZGVmaW5lZC4gIFNvIHdlIG1ha2UgdHdvIGNoYW5nZXM6CisKKyAgICAxKSBmbGFnIHRoZSBibG9iIGZvciByZWxvY2F0aW9uIHdoZW5ldmVyIGl0cyBhZGRyZXNzIGlzIGFib3ZlIEJPT1RNQVBTWgorCisgICAgMikgSWYgdGhlIGJsb2IgaXMgYmVpbmcgcmVsb2NhdGVkLCByZWxvY2F0ZSBpdCBiZWZvcmUga2JkLCBub3QgaW5pdHJkCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlNTRiOTcwMTczNzY5MzA3YTExNmJkMzQwMjhiNmQwYzJlZWEyYTRlCitBdXRob3I6IFBldGVyIFBlYXJzZSA8cGV0ZXIucGVhcnNlQGFybS5jb20+CitEYXRlOglUdWUgQXVnIDE0IDE1OjQwOjAwIDIwMDcgKzAxMDAKKworICAgIFN1cHBseSBzcGkgaW50ZXJmYWNlIGluIGF0NDUuYworCitjb21taXQgMGM0MmYzNmYxNTA3NGJkOTgwOGE3ZGJkN2VmNjExZmFkOWJmNTM3YworQXV0aG9yOiBQZXRlciBQZWFyc2UgPHBldGVyLnBlYXJzZUBhcm0uY29tPgorRGF0ZToJVHVlIEF1ZyAxNCAxMDo0NjozMiAyMDA3ICswMTAwCisKKyAgICBSZXBsYWNlIGxvc3QgZW5kIG9mIGF0NDUuYy4KKworY29tbWl0IDY1ZDdhZGE2NDU1N2U3NjA5NGI0ZmQzYmFkMzBhMGYxOGY1ZmIyYjIKK0F1dGhvcjogUGV0ZXIgUGVhcnNlIDxwZXRlci5wZWFyc2VAYXJtLmNvbT4KK0RhdGU6CVR1ZSBBdWcgMTQgMTA6MzA6MDYgMjAwNyArMDEwMAorCisgICAgVXBkYXRlIE1ha2VmaWxlcyBmb3IgbWVyZ2VkIGFuZCBzcGxpdCBhdDQ1LmMuCisKK2NvbW1pdCAzNDU0Y2VjZTJkYjU3Y2I5ZWI3MDg3OTk1ZjdlNzMwNjZhMTYzZjcxCitBdXRob3I6IFBldGVyIFBlYXJzZSA8cGV0ZXIucGVhcnNlQGFybS5jb20+CitEYXRlOglUdWUgQXVnIDE0IDEwOjIxOjA2IDIwMDcgKzAxMDAKKworICAgIERlbGV0ZSB0aGUgbWVyZ2VkIGZpbGVzLgorCitjb21taXQgZGNiZmQyZTU2NDlmOTdhYTA0ZmJiYzZlYTJiMDA4YWE0NDg2ZTIyNQorQXV0aG9yOiBQZXRlciBQZWFyc2UgPHBldGVyLnBlYXJzZUBhcm0uY29tPgorRGF0ZToJVHVlIEF1ZyAxNCAxMDoxNDowNSAyMDA3ICswMTAwCisKKyAgICBBZGQgdGhlIGZpbGVzLgorCitjb21taXQgZDRmYzYwMTJmZDBhNWMyMTFiODI1NjkxZjQ0YjA2ZjgwMzJjMDU1MQorQXV0aG9yOiBQZXRlciBQZWFyc2UgPHBldGVyLnBlYXJzZUBhcm0uY29tPgorRGF0ZToJVHVlIEF1ZyAxNCAxMDoxMDo1MiAyMDA3ICswMTAwCisKKyAgICBBZGQgTUFDSF9UWVBFIHJlY29yZHMgZm9yIHNldmVyYWwgQVQ5MSBib2FyZHMuCisgICAgTWVyZ2UgdG8gdHdvIGF0NDUuYyBmaWxlcyBpbnRvIGEgY29tbW9uIGZpbGUsIHNwbGl0IHRvIGF0NDUuYyBhbmQgc3BpLmMKKyAgICBGaXggc3BlbGxpbmcgZXJyb3IgaW4gRE05MTYxIFBIWSBTdXBwb3J0LgorICAgIEluaXRpYWxpemUgYXQ5MXJtOTIwMCBib2FyZCAoYW5kIHNldCBMRUQpLgorICAgIEFkZCBQSU8gY29udHJvbCBmb3IgYXQ5MXJtOTIwMGRrIExFRHMgYW5kIE11eC4KKyAgICBDaGFuZ2UgZGF0YWZsYXNoIHBhcnRpdGlvbiBib3VuZGFyaWVzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBMaW51eCAyLjYuCisKKyAgICBTaWduZWQtb2ZmLWJ5OglQZXRlciBQZWFyc2UgPHBldGVyLnBlYXJzZUBhcm0uY29tPgorICAgIFNpZ25lZC1vZmYtYnk6CVVsZiBTYW11ZWxzc29uIDx1bGZAYXRtZWwuY29tPgorCitjb21taXQgNGVmMzVlNTNjNjkzNTU2YzU0YjBjMjJkNmY4NzNkZTg3YmFkZTI1MworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVHVlIEF1ZyAxNCAwOTo1NDo0NiAyMDA3ICswMjAwCisKKyAgICBDb2Rpbmcgc3R5bGUgY2xlYW51cCwgdXBkYXRlIENIQU5HRUxPRworCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDg1ZWI1Y2FmNmI5MDZmN2VjNWI1NDgxNGU4YzdjNzRmNTU5ODZiYjcKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVR1ZSBBdWcgMTQgMDk6NDc6MjcgMjAwNyArMDIwMAorCisgICAgQ29kaW5nIHN0eWxlIGNsZWFudXA7IHJlYnVpbGQgQ0hBTkdFTE9HCisKK2NvbW1pdCA3ZjNmMmJkMmRjMDhlMGIwNWUxODU2NjJjYTJlMmQyODM3NTcxMDRhCitBdXRob3I6IFJhbmR5IFZpbnNvbiA8cnZpbnNvbkBsaW51eGJveC4obm9uZSk+CitEYXRlOglUdWUgRmViIDI3IDE5OjQyOjIyIDIwMDcgLTA3MDAKKworICAgIDg1eHhDRFM6IEFkZCBtYWtlIHRhcmdldHMgZm9yIGxlZ2FjeSBzeXN0ZW1zLgorCisgICAgVGhlIFBDSSBJRCBzZWxlY3QgdmFsdWVzIG9uIHRoZSBBcmNhZGlhIG1haW4gYm9hcmQgZGlmZmVyIGRlcGVuZGluZworICAgIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBoYXJkd2FyZS4gVGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gc3VwcG9ydHMKKyAgICBSZXYgMy4xLiBUaGUgbGVnYWN5IHRhcmdldCBzdXBwb3J0cyBSZXYgMi54LgorCisgICAgU2lnbmVkLW9mZi1ieSBSYW5keSBWaW5zb24gPHJ2aW5zb25AbXZpc3RhLmNvbT4KKworY29tbWl0IGU0MTA5NGM3ZTM4MTc3Yzc1NWZiZDliMTgyMDE4MDY5NjE0ZjA4MGQKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEF1ZyAxNCAwMTo1MDowOSAyMDA3IC0wNTAwCisKKyAgICA4NXh4Q0RTOiBFbmFibGUgdGhlIFZJQSBQQ0ktdG8tSVNBIGJyaWRnZS4KKworICAgIEF1dGhvcjogUmFuZHkgVmluc29uIDxydmluc29uQGxpbnV4Ym94Lihub25lKT4KKworICAgIEVuYWJsZSB0aGUgUENJLXRvLUlTQSBicmlkZ2UgaW4gdGhlIFZJQSBTb3V0aGJyaWRnZSBsb2NhdGVkIG9uIHRoZQorICAgIEFyY2FkaWEgbWFpbiBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJhbmR5IFZpbnNvbiA8cnZpbnNvbkBtdmlzdGEuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFlvcmsgU3VuIDx5b3Jrc3VuQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkYTlkNDYxMGQ3NmU1MmM0ZDIwYThmM2Q4NDMzNDM5YTdmY2Y1YjcxCitBdXRob3I6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBBdWcgMTQgMDA6MTQ6MjUgMjAwNyAtMDUwMAorCisgICAgQWRkIHN1cHBvcnQgZm9yIFVFQyB0byA4NTY4CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIYWl5aW5nIFdhbmcgPEhhaXlpbmcuV2FuZ0BmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGM1OWU0MDkxZmZlMDE0ODM5OGI5ZTlmZjE0YTAxOWVhMDM4Yjc0MzIKK0F1dGhvcjogSGFpeWluZyBXYW5nIDxIYWl5aW5nLldhbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdW4gMTkgMTQ6MTg6MzQgMjAwNyAtMDQwMAorCisgICAgQWRkIFBDSSBzdXBwb3J0IGZvciBNUEM4NTY4TURTIGJvYXJkCisKKyAgICBUaGlzIHBhdGNoIGlzIGFnYWluc3QgdS1ib290LW1wYzg1eHguZ2l0IG9mIHd3dy5kZW54LmNvbQorCisgICAgU2lnbmVkLW9mZi1ieTogSGFpeWluZyBXYW5nIDxIYWl5aW5nLldhbmdAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBFYm9ueSBaaHUgPGVib255LnpodUBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDExMWQ2MzgyYzk5ZmRlYTA4YzIzMTJlZWVhZTg3ODY5NDVlMTg5YQorQXV0aG9yOiBIYWl5aW5nIFdhbmcgPEhhaXlpbmcuV2FuZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1biAxOSAxNDoxODozMiAyMDA3IC0wNDAwCisKKyAgICBFbXBpcmljYWxseSBzZXQgY3BvIGFuZCBjbGtfYWRqdXN0IGZvciBtcGM4NXh4IEREUjIgc3VwcG9ydAorCisgICAgVGhpcyBwYXRjaCBpcyBhZ2FpbnN0IHUtYm9vdC1tcGM4NXh4LmdpdCBvZiB3d3cuZGVueC5jb20KKworICAgIFNldHRpbmcgY3BvIHRvIDB4OSBmb3IgZnJlcXVlbmNpZXMgaGlnaGVyIHRoYW4gMzMzTUh6IGlzIHZlcmlmaWVkIG9uCisgICAgYm90aCBNUEM4NTQ4Q0RTIGJvYXJkIGFuZCBNUEM4NTY4TURTIGJvYXJkLCBlc3BlY2lhbGx5IGZvciBzdXBwb3J0aW5nCisgICAgNTMzTUh6IEREUjIuCisKKyAgICBTZXR0aW5nIGNsa19hZGp1c3QgdG8gMHg2KDMvNCBsYXRlIGN5Y2xlKSBmb3IgTVBDODU2OE1EUyBib2FyZCBpcyBmb3IKKyAgICBERFIyIG9uIGFsbCBjdXJyZW50IGJvYXJkIHZlcnNpb25zIGVzcGVjaWFsbHkgdmVyIDEuOTIgb3IgbGF0ZXIgdG8gYnJpbmcKKyAgICB1cC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhaXlpbmcgV2FuZyA8SGFpeWluZy5XYW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzZGIwYmVmNTllYWIxMTU1ODAxNjE4Y2VmNWM0ODFlOTc1NTNiNTk3CitBdXRob3I6IEt1bWFyIEdhbGEgPGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc+CitEYXRlOglUdWUgQXVnIDcgMTg6MDc6MjcgMjAwNyAtMDUwMAorCisgICAgVXNlIGFuIGFic29sdXRlIGFkZHJlc3Mgd2hlbiBqdW1waW5nIG91dCBvZiA0ayBib290IHBhZ2UKKworICAgIE9uIGU1MDAgd2hlbiB3ZSBsZWF2ZSB0aGUgNGsgYm9vdCBwYWdlIHdlIHNob3VsZCB1c2UgYW4gYWJzb2x1dGUgYWRkcmVzcyBzaW5jZQorICAgIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIGJvYXJkIGNvZGUgbWF5IHdhbnQgdXMgdG8gYmUgcmVhbGx5IHJ1bm5pbmcgYXQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLdW1hciBHYWxhIDxnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnPgorCitjb21taXQgMzk5ODBjNjEwYzlhNGMzODE5MDdjOWUxZDFiOWMwZTFjMGRjYTU3YQorQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gQXVnIDEzIDE0OjQ5OjU5IDIwMDcgLTA1MDAKKworICAgIE1QQzg1eHggQkEgYml0cyBub3Qgc2V0IGZvciAzLWJpdCBiYW5rIGFkZHJlc3MgRElNTQorCisgICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoZSBudW1iZXIgb2YgYmFuayBhZGRyZXNzIGJpdHMKKyAgICAoQkEpIGluIHRoZSBwcm9jZXNzb3IuIFRoZSBkZWZhdWx0IGFzc3VtZXMgMiBsb2dpY2FsIGJhbmsgYml0cy4gVGhpcworICAgIHdvcmtzIGZpbmUgZm9yIGEgRElNTSB0aGF0IHVzZXMgZGV2aWNlcyB3aXRoIDQgaW50ZXJuYWwgYmFua3MgKFNQRAorICAgIGJ5dGUxNyA9IDB4NCkgYnV0IG5lZWRzIHRvIGJlIHNldCBhcHByb3ByaWF0ZWx5IGZvciBhIERJTU0gdGhhdCB1c2VzCisgICAgZGV2aWNlcyB3aXRoIDggaW50ZXJuYWwgYmFua3MgKFNQRCBieXRlMTcgPSAweDgpLgorCisgICAgU2lnbmVkLW9mZi1ieTogR3JlZyBEYXZpcyA8RGF2aXNHQGVtYmVkZGVkcGxhbmV0LmNvbT4KKworY29tbWl0IDZjNTQzNTk3YmI0YjFlY2Y1ZDg1ODlmN2FiYjBmMzk5MjlmYjdmZDEKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEF1ZyAxMyAxNDozODowNiAyMDA3IC0wNTAwCisKKyAgICBGaXggbWlub3IgODV4eCB3YXJuaW5ncworCisgICAgU29tZSBwYXRjaGVzIGhhZCBpbnNlcnRlZCB3YXJuaW5ncyBpbnRvIHRoZSBidWlsZDoKKyAgICAqIG1wYzg1NjBhZHMgZGVjbGFyZWQgZGF0YSB3aXRob3V0IHVzaW5nIGl0CisgICAgKiBjcHVfaW5pdCBkZWNsYXJlZCBlY20gYW5kIGltbWFwIHdpdGhvdXQgdXNpbmcgaXQgaW4gYWxsIENPTkZJR3MKKyAgICAqIE1QQzg1NDhDRFMuaCBoYWQgaXRzIGRlZmF1bHQgZmlsZW5hbWVzIGNoYW5nZWQgc28gdGhhdCB0aGV5IGNvbnRhaW5lZAorICAgICAgIlxtIiBpbiB0aGUgcGF0aHMuICBNYWRlIHRoZSBkZWZhdWx0cyBub3QgV2luZG93cy1zcGVjaWZpYyAob3IKKyAgICAgIGFueXRoaW5nLXNwZWNpZmljKQorCisgICAgU2lnbmVkLW9mZi1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZjJjZmY2YjEwNGY4MmI5OTNiZWY2MDg2Y2UwYzk3MTU5YmJlMWFkZAorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1bCAyNyAwMTo1MDo1MiAyMDA3IC0wNTAwCisKKyAgICA4NTQ4Y2RzIFBDSUUgc3VwcG9ydC4KKworICAgIE1ha2UgdGhlIGVhcmx5IEwxIGNhY2hlIHN0YWNrIHJlZ2lvbiBndWFyZGVkIHRvIHByZXZlbnQgc3BlY3VsYXRpdmUKKyAgICBmZXRjaGVzIG91dHNpZGUgdGhlIGxvY2tlZCByYW5nZS4KKworICAgIFVzZSBfUEhZUyBkZWZpbmVzLCBub3QgX01FTSBmb3IgY3B1LXNpZGUgUENJIG1lbW9yeSBtYXBwZWQgcmVnaW9ucy4KKyAgICBpbml0LlMgd2hpdGVzcGFjZSBjbGVhbnVwLgorCisgICAgQWxsb3cgVEVYVF9CQVNFIHZhbHVlIHRvIGJlIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUuICBUaGlzIGFsbG93cyBpdAorICAgIHRvIGJlIHNldCB0byAweGZmZmMwMDAwIHdoaWNoIGN1dHMgdGhlIHVib290IGJpbmFyeSBpbiBoYWxmLgorCisgICAgQ2xlYXIgYW5kIGVuYWJsZSBsYmMgYW5kIGVjbSBlcnJvcnMuCisKKyAgICBVcGRhdGUgbGFzdF9idXNubyBpbiBkZXZpY2UtdHJlZSBmb3IgcGNpIGFuZCBwY2llLgorCisgICAgUmVtb3ZlIGxvYWQgb2Ygb2Jzb2xldGUgY3B1L21wYzg1eHgvcGNpLjAKKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDgzN2YxYmEwNWNmYjI0OGFiYTVhYjhlMWZiMWJmZWVmYTA3ZDU5NjIKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMDE6NTA6NTEgMjAwNyAtMDUwMAorCisgICAgODU0NGRzIFBDSUUgc3VwcG9ydAorCisgICAgUENJMSBMQVcgbWFwcGluZyBzaG91bGQgdXNlIENGR19QQ0kxX01FTV9QSFkgYW5kIG5vdCBfQkFTRSBhZGRyZXNzLgorCisgICAgRW5hYmxlIExCQyBhbmQgRUNNIGVycm9ycyBhbmQgY2xlYXIgZXJyb3IgcmVnaXN0ZXJzLgorCisgICAgQWRkIHRmdHBmbGFzaCBlbnYgdmFyIHRvIGdldCB1Ym9vdCBmcm9tIHRmdHAgc2VydmVyIGFuZCBmbGFzaCBpdC4KKworICAgIEFkZCBwY2kvcGNpZSBjb252ZW5pZW5jZSBlbnYgdmFycyB0byBkaXNwbGF5IHJlZ2lzdGVyIHNwYWNlOgorICAgICAgInJ1biBwY2llM3JlZ3MiIHRvIHNlZSBhbGwgcGNpZTMgY2NzciByZWdpc3RlcnMKKyAgICAgICJydW4gcGNpZTNjZmciIHRvIHNlZSBhbGwgY2ZnIHJlZ2lzdGVycworICAgIFdoaXRlc3BhY2UgY2xlYW51cCBhbmQgTVBDODU0NERTLmgKKworICAgIEVuYWJsZSBDT05GSUdfSU5URVJSVVBUUy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDYxYTIxZTk4MGE3YjkxODg0MjRkMDRmMWMyNjVmZGM1YzIxYzdlODUKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEF1ZyAxNCAwMTozNDoyMSAyMDA3IC0wNTAwCisKKyAgICA4NXh4IHN0YXJ0LlMgY2xlYW51cCBhbmQgZXhjZXB0aW9uIHN1cHBvcnQKKworICAgIEZyb206IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisKKyAgICBTdXBwb3J0IGV4dGVybmFsIGludGVycnVwdHMgZnJvbSBwbGF0Zm9ybSB0byBlbGltaW5hdGUgc3lzdGVtIGhhbmdzLgorICAgIERlZmluZSBDT05GSUdfSU5URVJSVVBUUyBib2FyZCBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZS4KKyAgICBFbmFibGUgZWNtLCBkZHIsIGxiYywgYW5kIHBjaS9wY2llIGVycm9yIGludGVycnVwdHMgaW4gUElDLgorCisgICAgUmVtb3ZlIGV4dHJhIGNwdSBpbml0aWFsaXphdGlvbiByZWR1bmRhbnQgd2l0aCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbi4KKyAgICBXaGl0ZXNwYWNlIGNsZWFudXAuCisKKyAgICBEZWZpbmUgYW5kIHVzZSBfU1RBUlRfT0ZGU0VUIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBwcm9jZXNzb3JzIHVzaW5nCisgICAgcHBjX2FzbS50bXBsCisKKyAgICBNb3ZlIGFkZGl0aW9uYWwgY29kZSBmcm9tIC50ZXh0IHRvIGJvb3QgcGFnZSB0byBtYWtlIHJvb20gZm9yCisgICAgZXhjZXB0aW9uIHZlY3RvcnMgYXQgc3RhcnQgb2YgaW1hZ2UuCisKKyAgICBIYW5kbGUgTWFjaGluZSBDaGVjaywgRXh0ZXJuYWwgYW5kIENyaXRpY2FsIGV4Y2VwdGlvbnMuCisKKyAgICBGaXggZTUwMCBtYWNoaW5lIGNoZWNrIGVycm9yIGRldGVybWluYXRpb24gaW4gdHJhcHMuYworCisgICAgVEVYVF9CQVNFIGNhbiBub3cgYmUgMHhmZmZjXzAwMDAgLSB3aGljaCBjdXRzIGJpbmFyeSBpbWFnZSBpbiBoYWxmLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBBY2tlZC1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgN2JkMzBmYzRhNjQ3NWI0MWQ2Njc5YWUzYWFmYzlmYTUwNTI2MGM0NworQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgQXVnIDE0IDAxOjMzOjE4IDIwMDcgLTA1MDAKKworICAgIEFkZCBNUEM4NTQ0RFMgUkVBRE1FCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0MGM3ZjliMGRlNGUzMDAzNzBhZGZjNzA0MTI4ZmEwZjc5YTE0M2I2CitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDI3IDAxOjUwOjQ4IDIwMDcgLTA1MDAKKworICAgIDg1eHggYWxsb3cgZGVidWdnZXIgdG8gY29uZmlndXJlIGRkci4KKworICAgIE9ubHkgY2hlY2sgZm9yIG1wYzg1NDggcmV2IDEgd2hlbiBjb21waWxlZCBmb3IgODU0OC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDI5MzcyZmYzOGM1YmFhYjdkMGUzYThjMTRmZTExZmExOTRhMzg3MDQKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMDE6NTA6NDcgMjAwNyAtMDUwMAorCisgICAgbXBjODV4eCBMMiBjYWNoZSByZXBvcnRpbmcgYW5kIFNSQU0gcmVsb2NhdGlvbiBvcHRpb24uCisKKyAgICBBbGxvdyBkZWJ1Z2dlciB0byBvdmVycmlkZSBmbGFzaCBjczAvY3MxIHNldHRpbmdzIHRvIGVuYWJsZSBhbHRlcm5hdGUKKyAgICBib290IHJlZ2lvbnMKKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQxZjBmOGZiMWFiOTJmMGNiYTdkMzI5ZGU5MDA3MGY4MjJmODI5OWYKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMDE6NTA6NDYgMjAwNyAtMDUwMAorCisgICAgZTUwMCBuZWVkcyBwcGNfYXNtLnRtcCBNQ0tfRVhDRVBUSU9OCisKKyAgICBBbHdheXMgZGVmaW5lIE1DS19FWENFUFRJT04gbWFjcm8gLSBzbyBlNTAwIGNhbiB1c2UgaXQgdG9vLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBBY2tlZC1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNTNhNWM0MjRiZjg2NTViN2I0ZTJjMzA1YTQ0MTk2MzI1OWEyNmE4MQorQXV0aG9yOiBEYXZpZCBVcGRlZ3JhZmYgPGRhdmVAY3JheS5jb20+CitEYXRlOglNb24gSnVuIDExIDEwOjQxOjA3IDIwMDcgLTA1MDAKKworICAgIG11bHRpY2FzdCB0ZnRwOiBSRkMyMDkwCisKKyAgICBJbXBsZW1lbnRlZCBJRVRGIFJGQzIwOTAsIE11bHRpY2FzdCBURlRQLiAgSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICAgIG9uIFJlYWx0ZWsgUlRMODEzOSBhbmQgRnJlZXNjYWxlIFRTRUMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBVcGRlZ3JhZmYgPGRhdmVAY3JheS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQmVuIFdhcnJlbiA8YndhcnJlbkBxc3RyZWFtcy5jb20+CisKK2NvbW1pdCA1ZDExMGYwYWE2OWYwNjVlZTM4NmVjMTg0MGRmZWUxZThjYzQ2YmMxCitBdXRob3I6IFdpbHNvbiBDYWxsYW4gPHdjYWxsYW5Ac2F2YW50YXYuY29tPgorRGF0ZToJU2F0IEp1bCAyOCAxMDo1NjoxMyAyMDA3IC0wNDAwCisKKyAgICBOZXcgQ09ORklHX0JPT1RQX1NFUlZFUklQIG9wdGlvbgorCisgICAgQWRkZWQgQ09ORklHX0JPT1RQX1NFUlZFUklQIHRvIGFsbG93IHRoZSB0ZnRwIHNlcnZlciB0byBiZSBkaWZmZXJlbnQKKyAgICBmcm9tIHRoZSBib290cCBzZXJ2ZXIKKworICAgIFNpZ25lZC1vZmYtYnk6IFdpbHNvbiBDYWxsYW4gPHdjYWxsYW5Ac2F2YW50YXYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEJlbiBXYXJyZW4gPGJ3YXJyZW5AcXN0cmVhbXMuY29tPgorCitjb21taXQgNTBjY2E4Yjk3NmVjNzQwNjk4NjAyMDhjMzZlNjRjZThmNGQ1ZTRjMQorQXV0aG9yOiBNaWtlIFJhcG9wb3J0IDxtaWtlQGNvbXB1bGFiLmNvLmlsPgorRGF0ZToJU3VuIEF1ZyAxMiAwODo0ODoyNyAyMDA3ICswMzAwCisKKyAgICBBZGQgYWJpbGl0eSB0byB0YWtlIE1BQyBhZGRyZXNzIGZyb20gdGhlIGVudmlyb25tZW50IHRvIERNOTAwMCBkcml2ZXIKKworICAgIFNpZ25lZC1vZmYtYnk6IE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+CisgICAgU2lnbmVkLW9mZi1ieTogQmVuIFdhcnJlbiA8YndhcnJlbkBxc3RyZWFtcy5jb20+CisKK2NvbW1pdCBiZTVkNzJkMTBkNDc2MDkzMjYyMjYyMjUxODFlMzAxZmI5YTMzYjU4CitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglNb24gQXVnIDEzIDIxOjU3OjUzIDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLiBVcGRhdGUgQ0hBTkdFTE9HLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGNjYTM0OTY3Y2JkMTNmZjZiZDM1MmJlMjllM2YxY2M4OGFiMjRjMDUKK0F1dGhvcjogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KK0RhdGU6CVNhdCBBdWcgMTEgMDY6NTQ6NTggMjAwNyAtMDUwMAorCisgICAgTW9kaWZ5IFNCQzg2NDFEIHRvIHVzZSBuZXcgRnJlZXNjYWxlIFBDSSByb3V0aW5lcworCisgICAgUENJLUV4cHJlc3Mgc29ja2V0cyAxIGFuZCAyIHZlcmlmaWVkIHdvcmtpbmcgd2l0aCBJbnRlbCBQcm8vMTAwMCBQVAorICAgIGFkYXB0ZXIuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb2UgSGFtbWFuIDxqb2UuaGFtbWFuQGVtYmVkZGVkc3BlY2lhbHRpZXMuY29tPgorICAgIFNpZ25kZS1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhMDg0NTgzMDNlN2Y5ZGI2N2YyOTY5ODAwMzZkMzI5MmMzNWNiNDVjCitBdXRob3I6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorRGF0ZToJRnJpIEp1biAyOSAxODozODo1MSAyMDA3ICswMjAwCisKKyAgICBhdG1lbF9tY2k6IEZpeCBkYXRhIHRpbWVvdXQgdmFsdWUKKworICAgIENhbGN1bGF0ZSB0aGUgZGF0YSB0aW1lb3V0IGJhc2VkIG9uIHZhbHVlcyBmcm9tIHRoZSBDU0QgaW5zdGVhZCBvZgorICAgIGp1c3QgdXNpbmcgYSBoYXJkY29kZWQgRFRPUiB2YWx1ZS4gVGhpcyBpcyBhIGJhY2twb3J0IG9mIGEgc2ltaWxhciBmaXgKKyAgICBpbiBCU1AgMi4wLCB3aXRoIG9uZSBhZGRpdGlvbmFsIGZpeDogdGhlIERUT0NZQyB2YWx1ZSBpcyByb3VuZGVkIHVwCisgICAgaW5zdGVhZCBvZiBkb3duLgorCisgICAgU2lnbmVkLW9mZi1ieTogSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+CisKK2NvbW1pdCAwYmE4ZWVkMjhiNTc1NjI2YjE3ZTBhNzg4MmY5MjNiODNlMGQ3NTg0CitBdXRob3I6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorRGF0ZToJTW9uIEF1ZyAxMyAxNzoyMjozMSAyMDA3ICswMjAwCisKKyAgICBBVlIzMjogSW5jbHVkZSA8ZGl2NjQuaD4gaW5zdGVhZCBvZiA8YXNtL2RpdjY0Lmg+CisKKyAgICBpbmNsdWRlL2FzbS1hdnIzMi9kaXY2NC5oIHdhcyByZWNlbnRseSBtb3ZlZCB0byBpbmNsdWRlL2RpdjY0LmgsIGJ1dAorICAgIGNwdS9hdDMyYXAvaW50ZXJydXB0cy5jIHdhc24ndCBwcm9wZXJseSB1cGRhdGVkIChhbiBlYXJsaWVyIHZlcnNpb24gb2YKKyAgICB0aGUgcGF0Y2ggd2FzIG1lcmdlZCBwZXJoYXBzPykKKworICAgIFRoaXMgcGF0Y2ggdXBkYXRlcyBjcHUvYXQzMmFwL2ludGVycnVwdHMuYyBzbyB0aGF0IHRoZSBhdnIzMiBwb3J0CisgICAgY29tcGlsZXMgYWdhaW4uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KKworY29tbWl0IGYwZDEyNDZlZDdjYjVhODg1MjIyNDRjNTk2ZDdhZTdlNmYxNjEyODMKK0F1dGhvcjogSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+CitEYXRlOglXZWQgSnVuIDI3IDEzOjM0OjI2IDIwMDcgKzAyMDAKKworICAgIGF0bWVsX21jaTogVXNlIDUxMiBieXRlIGJsb2Nrc2l6ZSBpZiBwb3NzaWJsZQorCisgICAgSW5zdGVhZCBvZiBhbHdheXMgdXNpbmcgdGhlIGxhcmdlc3QgYmxvY2tzaXplIHRoZSBjYXJkIHN1cHBvcnRzLCBjaGVjaworICAgIGlmIGl0IGNhbiBzdXBwb3J0IHNtYWxsZXIgYmxvY2sgc2l6ZXMgYW5kIHVzZSA1MTIgYnl0ZXMgaWYgcG9zc2libGUuCisgICAgTW9zdCBjYXJkcyBkbyBzdXBwb3J0IHRoaXMsIGFuZCBvdGhlciBwYXJ0cyBvZiB1LWJvb3Qgc2VlbSB0byBoYXZlCisgICAgdHJvdWJsZSB3aXRoIGJsb2NrIHNpemVzIGRpZmZlcmVudCBmcm9tIDUxMiBieXRlcy4KKworICAgIEFsc28gZW5hYmxlIHVuZGVycnVuL292ZXJydW4gcHJvdGVjdGlvbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorICAgIEFja2VkLWJ5OiBIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxoY2VndHZlZHRAYXRtZWwuY29tPgorCitjb21taXQgOTk4NmJjM2U0MGU4OTliZWEzNzJhOTlhMmJjYTQwNzFiZGYyZTI0YgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJU3VuIEF1ZyAxMiAyMTozNDo1MCAyMDA3ICswMjAwCisKKyAgICBVcGRhdGUgQ0hBTkdFTE9HCisKK2NvbW1pdCA3N2QxOWE4YmYzYjBiMWU0MDFjYjlmMjNjODFlMmVmNDE5NzA1YzFhCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTdW4gQXVnIDEyIDIxOjM0OjM0IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGFsaWdubWVudCBvZiBvdXRwdXQsIDJuZCB0cnkuCisgICAgQWxzbyB1cGRhdGUgQ0hBTkdFTE9HCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNmIzMDlmMjJhNzI0ZmFkODQxOGU4MTE3NTFhMDc0MWI4OTM0MTljZgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJU3VuIEF1ZyAxMiAyMDozNTo0OSAyMDA3ICswMjAwCisKKyAgICBNaW5vciBhbGlnbm1lbnQgb2Ygb3V0cHV0CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNmY2ZDdiOWM4NTU5ZTI0MWU4ZDIzMjYyMTU0MmI4YjU5Njk5YjA3YgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJU3VuIEF1ZyAxMiAxODoyODoxOCAyMDA3ICswMjAwCisKKyAgICBDbGVhbnVwIG91dHB1dCBvbiBBRFM1MTIxIGJvYXJkCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rCisKK2NvbW1pdCBhNGQyNjM2ZjJhODU5MjQ1ZWQzYTQwMWYyNjE4OWRhMmRmZGE0Y2ViCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTdW4gQXVnIDEyIDE1OjExOjM4IDIwMDcgKzAyMDAKKworICAgIEFkYXB0IGJvYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGZpeCBrZXJuZWwgY3Jhc2ggb24gTUNDMjAwIGJvYXJkLgorCisgICAgVGhlIHVwZGF0ZSBwcm9jZWR1cmUgd2FzIG1vZGlmaWVkIHRvIHR1cm4gb2ZmIHRoZSBVU0Igc3Vic3lzdGVtCisgICAgYmVmb3JlIGV4aXQgZm9yIE1DQzIwMCBhbmQgVFJBQi4gVGhpcyBpcyBuZWNlc3NhcnkgYXMgb3RoZXJ3aXNlIHRoZQorICAgIFVTQiBjb250cm9sbGVyIGNvbnRpbnVlcyB0byB3cml0ZSBwZXJpb2RpY2FsbHkgdG8gc3lzdGVtIG1lbW9yeSEKKworICAgIE1DQzIwMC1zcGVjaWZpYyBub3RlczoKKyAgICAtIHRoZSBwYXRjaCBkaXNhYmxlcyB0aGUgbWFnaWMga2V5IGNoZWNrIGZvciBNQ0MyMDAKKyAgICAtIHRoZSBwYXRjaCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIG1hZGUKKyAgICAgIGZvciB0aGUgbmV3IHJldmlzaW9uIG9mIHRoZSBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFNlcmdlaSBQb3NlbGVub3YgPHNwb3NlbGVub3ZAZW1jcmFmdC5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGUyN2YzYTZlZmI5ZGI1YTUzMzIyM2IwNWM2MjlmZjRhYzhkOTIxYmYKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVN1biBBdWcgMTIgMTQ6NDc6NTQgMjAwNyArMDIwMAorCisgICAgQWRqdXN0IGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBBRFM1MTIxIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGFmYWFjODZmZTI5NDhhYzg0Y2Q5YTEyYmJlZDg4M2IzYzY4M2U3ZDkKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVN1biBBdWcgMTIgMTQ6Mjc6MzkgMjAwNyArMDIwMAorCisgICAgQ2xlYW4gdXAgc29tZSByZW1haW5pbmcgQ0ZHX0NNRF8gLT4gQ09ORklHX0NNRF8gaXNzdWVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDVmZTZiZTYyMDhkZGE4NTJjMzU2NGUzODRiZDc4ZDc1Nzg0ZGVhM2UKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVR1ZSBBdWcgNyAyMToxNDoyMiAyMDA3IC0wNDAwCisKKyAgICBJbXByb3ZlIGVycm9yIHByaW50IG1lc3NhZ2VzLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDk5ZGZmY2EzYjc1OTBhMTZhMDBiYzQ3NWM4NjBiNjdiMmEzZjE0NjIKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTcgMTM6NTc6MDQgMjAwNyAtMDUwMAorCisgICAgZmR0OiBhbGxvdyBmb3IgYnVpbGRzIHRoYXQgZG9uJ3Qgd2FudCBlbnYgYW5kIGJkX3Qgbm9kZXMKKworICAgIHByb3RlY3QgZmR0X2VudiBhbmQgZmR0X2JkX3QgaW52b2NhdGlvbnMsIGZpeCBjb2RpbmdzdHlsZSB3aGlsZSBpbiB0aGUKKyAgICBhcmVhLgorCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDkxMTQ4YmY3YWViYTE0MmQ2ZjM0ODgwNWRiNzYyNWRiN2RhNjRkNmYKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTcgMTM6NTY6NTMgMjAwNyAtMDUwMAorCisgICAgZmR0OiBkbyBib2FyZCBzZXR1cCBiYXNlZCBvbiBmZHQgYWRkcmVzcyBzcGVjaWZpZWQgb24gYm9vdG0gbGluZQorCisgICAgVGhlIGxhc3QgZmR0IHBhdGNoIHRvIGJvb3RtIGRpZCBib2FyZCBzZXR1cCBiYXNlZCBvbiB0aGUgYWRkcmVzcworICAgIHNwZWNpZmllZCBieSBhIHByaW9yIGZkdCBhZGRyZXNzIGNvbW1hbmQgaW52b2NhdGlvbi4gIFRoZSBib290bQorICAgIGNvZGUsIGFzIGl0cyBjYWxsIHRvIGZkdF9jaG9zZW4gZG9lcywgc2hvdWxkIHVzZSB0aGUgZmR0IHNwZWNpZmllZAorICAgIGJ5IHRoZSB1c2VyIG9uIHRoZSBib290bSBjb21tYW5kLiAgTm90ZSB0aGlzIHJlc3RvcmVzIGZ1bGwKKyAgICBmdW5jdGlvbmFsaXR5IGZvciB0aGUgODM2MCdzIGV4aXN0aW5nIGRlZmF1bHQgYm9vdCBlbnZpcm9ubWVudAorICAgIHZhbHVlcywgZS5nLiAncnVuIG5mc2Jvb3QnIChpLmUuIG5vIGhhdmluZyB0byAnZmR0IGFkZHIgJGZkdGFkZHInCisgICAgYmVmb3JlIGJvb3RpbmcgYSBrZXJuZWwpLgorCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGUxMjVhMmZmYzIwOWRkMzQ3OTRlMzI2YzcxNzU2NTgyNTNiZWFkZjMKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMjA6NDA6MzkgMjAwNyAtMDQwMAorCisgICAgQ2FsbCBmdF9ib2FyZF9zZXR1cCgpIGZyb20gdGhlIGJvb3RtIGNvbW1hbmQuCisKKyAgICBJbiB0aGUgcGF0Y2ggdGl0bGVkICJDcmVhdGUgbmV3IGZkdCBib2FyZHNldHVwIGNvbW1hbmQuLi4iIEkgcmVtb3ZlZCB0aGUKKyAgICBjYWxsIHRvIGZ0X2JvYXJkX3NldHVwKCkgZnJvbSB0aGUgcm91dGluZSBmZHRfY2hvc2VuKCksIGJ1dCBJIGZvcmdvdAorICAgIHRvIGFkZCBhIGRpcmVjdCBjYWxsIGJhY2sgaW50byBjbWRfYm9vdG0uYworCisgICAgVGhpcyBmaXhlcyB0aGUgb3ZlcnNpZ2h0IGJ5IGFkZGluZyB0aGUgZGlyZWN0IGNhbGwgdG8gdGhlIGJvb3RtIGNvbW1hbmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgZmQ2MWU1NWRkOGNiNTJjZTNmZjkxYjM5MTdhZjI2ZTI0YjZiMDg0NQorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJTW9uIEp1biAyNSAyMzoyNToyOCAyMDA3IC0wNDAwCisKKyAgICBDcmVhdGUgbmV3IGZkdCBib2FyZHNldHVwIGNvbW1hbmQsIGZpeCBidWcgcGFyc2luZyBbXSBmb3JtIG9mIHNldCB2YWx1ZXMuCisKKyAgICBQcmV2aW91c2x5IGZ0X2JvYXJkX3NldHVwKCkgd2FzIGNhbGxlZCBieSBmZHRfY2hvc2VuKCkgd2hpY2ggd2FzIG5vdAorICAgIHJlYWxseSBjb3JyZWN0bHkgc3RydWN0dXJlZC4gIFRoaXMgc3BsaXRzIGZ0X2JvYXJkX3NldHVwKCkgb3V0IGJ5IGNyZWF0aW5nCisgICAgYSBuZXcgZmR0IGJvYXJkc2V0dXAgY29tbWFuZC4KKworICAgIEZpeCBhIGJ1ZyB3aGVuIHBhcnNpbmcgZmR0IHNldCBjb21tYW5kIHZhbHVlcyB3aGljaCBoYXZlIHRoZSBzcXVhcmUKKyAgICBicmFja2V0IGZvcm0gWzAwIDExIDIyIDMzXSAtIHRoZSBsZW5ndGggd2FzIHVwZGF0ZWQgaW5jb3JyZWN0bHkgaW4gd2hlbgorICAgIHBhcnNpbmcgdGhhdCBmb3JtLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDZmMzVkZWQ5ZTg1NDkzNTk1ZTBlYjY2YTgyYjUwMmE5NTMyNmQwNDkKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CU1vbiBKdW4gMjUgMjA6NTU6NTggMjAwNyAtMDQwMAorCisgICAgVGlnaHRlbiB1cCB0aGUgZXJyb3IgbWVzc2FnZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgYzQ1ODc0YjA1YWFlODk3YTZjMjlkMWE5N2Q0YmI3MDhmY2EyNzU2YworQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJTW9uIEp1biAyNSAxOTo1MjoyMyAyMDA3IC0wNDAwCisKKyAgICBBc3RoZXRpYyBpbXByb3ZlbWVudHM6IGVycm9yIG1lc3NhZ2VzIGFuZCBsaW5lIGxlbmd0aHMuCisKKyAgICBUaWdodGVuIHVwIHRoZSBlcnJvciBtZXNzYWdlcywgc3BsaXQgb3Zlcmxlbmd0aCBsaW5lcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCAzNWVjMzk4ZjE2ZTE3ZGY2MDBlZGMxYjM4YzFlOWU2MmMxNWM5YWExCitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglGcmkgTWF5IDI1IDIyOjA4OjU3IDIwMDcgLTA0MDAKKworICAgIEZpeCBmZHRfY2hvc2VuKCkgdG8gY2FsbCBmdF9ib2FyZF9zZXR1cCgpLCBjbGVhbiB1cCBsb25nIGxpbmVzLgorCisgICAgVGhlIGZkdF9jaG9zZW4oKSBmdW5jdGlvbiB3YXMgYWRkaW5nL3NldGluZyBzb21lIHByb3BlcnRpZXMgYWQtaG9jCisgICAgICBpbXByb3Blcmx5IGFuZCBkdXBsaWNhdGVkIChwb29ybHkpIHdoYXQgd2FzIGRvbmUgaW4gZnRfYm9hcmRfc2V0dXAoKQorCisgICAgQ2xlYW4gdXAgbG9uZyBsaW5lcyAoc2V0dGluZyBwcm9wZXJ0aWVzLCBwcmludGluZyBlcnJvcnMpLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDA2ZTE5YTA3NzAxYzk2OGYxNWQ3MmMwODNiNTg3MmExYTExYzdiMDEKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CU1vbiBNYXkgMjEgMjM6Mjc6MTYgMjAwNyAtMDQwMAorCisgICAgRm9yIGZkdF9maW5kX25vZGVfYnlfcGF0aCgpLCBoYW5kbGUgdGhlIHJvb3QgcGF0aCBwcm9wZXJseS4KKworICAgIEFsc28gcmVtb3ZlcyB0aGUgc3BlY2lhbCBjYXNlIHJvb3QgcGF0aCBkZXRlY3Rpb24gaW4gY21kX2ZkdC5jIHNpbmNlIGl0CisgICAgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCA5Njc1ZWU3MjA4YWI5NjVkMTNlYThkODI2MmQ3N2FjNDE2MGVmNTQ5CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglUaHUgTWF5IDE3IDIzOjU0OjM2IDIwMDcgLTA0MDAKKworICAgIEFkZCBmZHRfZmluZF9ub2RlX2J5X3R5cGUoKSBhbmQgZmR0X2ZpbmRfY29tcGF0aWJsZV9ub2RlKCkgdG8gTElCRkRUCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BncmFuZGVnZ2VyLmNvbT4KKyAgICBBY2tlZC1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDFhODYxMTY5YmMzNzU4ZjlkZTNhZWFkNjJiMDU4NzM2YzY4OTEyNDYKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVdlZCBKdW4gNiAyMjo0Nzo1OCAyMDA3IC0wNDAwCisKKyAgICBSZXBsYWNlIGZkdF9ub2RlX29mZnNldCgpIHdpdGggZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkuCisKKyAgICBUaGUgbmV3IG5hbWUgbWF0Y2hlcyBtb3JlIGNsb3NlbHkgdGhlIGtlcm5lbCdzIG5hbWUsIHdoaWNoIGlzIGFsc28KKyAgICBhIG11Y2ggYmV0dGVyIGRlc2NyaXB0aW9uLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgICAgQWNrZWQtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCBhZGRkOGNlODMwNzhjMjVmMGVjYTVmMjNhZGJkZmM2NGNhNTBhMjQzCitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglXZWQgTWF5IDE2IDIyOjM5OjU5IDIwMDcgLTA0MDAKKworICAgIEZpeCBjbWRfZmR0IGxpbmUgbGVuZ3RocywgcmVmYWN0b3IgY29kZS4KKworICAgIEJyZWFrIGxpbmVzIHRoYXQgd2VyZSBncmVhdGVyIHRoYW4gODAgY2hhcmFjdGVycyBpbiBsZW5ndGguCisgICAgTW92ZSB0aGUgZmR0IHByaW50IGFuZCBwcm9wZXJ0eSBwYXJzaW5nIGNvZGUgdG8gc2VwYXJhdGUgc3RhdGljIGZ1bmN0aW9ucworICAgICAgdG8gcmVkdWNlIGNvZGluZyBjbHV0dGVyIGluIHRoZSBmZHRfY21kIGhhbmRsaW5nIGJvZHkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgMjUxMTQwMzNhYjIxNzg4ODEwYzQ4YmE0ZGYxMDNiNjQ5ZGExMjIzYgorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJU2F0IE1heSAxMiAwOTo0NzoyNSAyMDA3IC0wNDAwCisKKyAgICBGRFQgY29tbWFuZCBpbXByb3ZlbWVudHMuCisKKyAgICBGaXggImZkdCBzZXQiIHNvIHRoYXQgaXQgd2lsbCBjcmVhdGUgYSBub24tZXhpc3RpbmcgcHJvcGVydHkuCisgICAgQWRkICJmZHQgbWtub2RlIiB0byBjcmVhdGUgbm9kZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgMzhlYjUwOGU4ZTgxMWUyZTU3NjI4ZjQ0NWRlM2EyNGEyM2M3ZDgwNAorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJU2F0IE1heSAxMiAwOTo0NTo0NiAyMDA3IC0wNDAwCisKKyAgICBSZW9yZ2FuaXplIGFuZCBmaXggcHJvYmxlbXMgKHJldHVybnMpIGluIHRoZSBib290bSBjb21tYW5kLgorCisgICAgRG8gKk5PVCogcmV0dXJuIGFmdGVyIHRoZSAicG9pbnQgb2Ygbm8gcmV0dXJuIiBoYXMgYmVlbiBwYXNzZWQuCisgICAgICBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgdGhlIGJvYXJkIG11c3QgYmUgcmVzZXQgYWZ0ZXIgdGhhdCBwb2ludC4KKyAgICBNb3ZlIHRoZSAiVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXgiIGRlYnVnIG1lc3NhZ2UgYmFjayB0byB3aGVyZSBpdAorICAgICAgYmVsb25nczoganVzdCBiZWZvcmUgdHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gbGludXguCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgODljODc1N2Q4ZjIxM2M0NzcwOWJkYzRlZmUwNjk1MjYzYTYwODBhNgorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJVHVlIE1heSA4IDIxOjI3OjM1IDIwMDcgLTA0MDAKKworICAgIEZpeCBidWdzIGluIHRoZSBDT05GSUdfT0ZfTElCRkRUCisKKyAgICBTdHVwaWQgY29kaW5nIG1pc3Rha2VzIChpZGVudGlmaWVkIGJ5IFRpbXVyIFRhYmksIHRoYW5rcykuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgNmJlMDdjYzFjYTQ1ODI3OGM4NWVjZGJmMWEwNTM2Y2ZmNGM3MDFlYworQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJV2VkIEFwciAyNSAyMjo0NzoxNSAyMDA3IC0wNDAwCisKKyAgICBJbXByb3ZlIGZkdCBtb3ZlIGxlbmd0aCBoYW5kbGluZy4KKworICAgIE1ha2UgdGhlIGxlbmd0aCBwYXJhbWV0ZXIgb3B0aW9uYWw6IGlmIG5vdCBzcGVjaWZpZWQsIGRvIHRoZSBtb3ZlIHVzaW5nCisgICAgdGhlIGN1cnJlbnQgc2l6ZSB1bmNoYW5nZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgYmI5MzBlNzZmZWE2Y2Y4OWNhMmQ5OGUyZjdjN2E2MDQzZDc5MzI3ZAorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJV2VkIEFwciAyNSAyMjoyMzozNiAyMDA3IC0wNDAwCisKKyAgICBNaW5vciBjb2RlIGNsZWFuIHVwLgorCisgICAgRGVjbGFyZSB0aGUgdmFyaWFibGUgZmR0IHByb3Blcmx5IGFzIGV4dGVybi4KKyAgICBDYWxsIHRoZSAic2V0X2ZuIiBmdW5jdGlvbiBwb2ludGVyIHRoZSAic2hvcnQgd2F5IiB3aXRob3V0IHRoZSBmdWxsCisgICAgICBkZXJlZmVyZW5jaW5nIHN5bnRheC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCBiYTI0ZTJhYzNiZGI1YzQ4OWYzYzc4N2U3NTQyYjY0NzRjNGQ2NWM2CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglXZWQgQXByIDI1IDIxOjI0OjI3IDIwMDcgLTA0MDAKKworICAgIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMsIG1vcmUgaW5mb3JtYXRpdmUuCisKKyAgICBQcmludCBtb3JlIHRoYW4gdGhlIHJhdyBsaWJmZHQgZXJyb3IgbWVzc2FnZSBzdHJpbmdzLiAgVGhpcyBpcyBlc3BlY2lhbGx5CisgICAgdXNlZnVsIGZvciBjbHVpbmcgaW4gdGhlIHVzZXIgd2hlbiB0aGUgYm9vdG0gY29tbWFuZCBhYm9ydHMgZHVlIHRvCisgICAgYmxvYiBwcm9ibGVtcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCA4MDk2YjNiOGY3NzJjMTg5NGRkZWRhOWRiY2VmZjZhODgyNjQ3M2E0CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglGcmkgQXByIDIwIDIyOjQ2OjUzIDIwMDcgLTA0MDAKKworICAgIGxpYmZkdDogQ29uZGl0aW9uYWxseSBjb21waWxlIGJhc2VkIG9uIENPTkZJR19PRl9MSUJGRFQKKworICAgIFRoaXMgaXMgdGhlIHdheSB1LWJvb3QgcmVkdWNlcyBjb25maWd1cmVkLW91dCBjb2RlLiAgQXQgV29sZmdhbmcKKyAgICBHcmFuZGVnZ2VyIGFuZCBXb2xmZ2FuZyBEZW5rJ3MgcmVxdWVzdCwgbWFrZSBsaWJmZHQgY29uZm9ybS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCA5MjNlZmQyODY0MTFlZDA1MmQ5ZTA3NGY1OWY4OTg2ZDYwODEwNjFjCitBdXRob3I6IEJydWNlIEFkbGVyIDxicnVjZS5hZGxlckBjY3B1LmNvbT4KK0RhdGU6CUZyaSBBdWcgMTAgMTQ6NTQ6NDcgMjAwNyAtMDcwMAorCisgICAgYWRkIGltYWdlIHNpemUgYW5kIGRlc2NyaXB0b3JzIGZvciBTcGFydGFuIDNFIEZQR0EgY2hpcHMKKworICAgIFNwYXJ0YW4gM0UgaW1hZ2Ugc2l6ZXMgdGFrZW4gZnJvbSBUYWJsZSAxLTQgaW4gWGlsaW54IFVHMzMyICh2MS4xKQorCisgICAgU2lnbmVkLW9mZiBieTogQnJ1Y2UgQWRsZXIgPGJydWNlLmFkbGVyQGNjcHUuY29tPgorCitjb21taXQgZmI1NjU3OWZmZTdlZjMyNzViNzAzNmJiN2I5MjRlNWEwZDMyYmQ3MAorQXV0aG9yOiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEF1ZyAxMCAxNTozNDo0OCAyMDA3IC0wNTAwCisKKyAgICBtYWtlIE1BS0VBTEwgbW9yZSBpbW11bmUgdG8gbWVyZ2UgY29uZmxpY3RzCisKKyAgICAuLmJ5IHBsYWNpbmcgYm9hcmQgZW50cmllcyBvbmUgcGVyIGxpbmUsIGFzIHN1Z2dlc3RlZCBieSBqZGwuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgMjYyODExNGVjNTY0Zjk2OWYzNGI1ZjcxMDVmYmQxNjhjYjhjOWMzZgorQXV0aG9yOiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEF1ZyAxMCAxMzoyODoyNSAyMDA3IC0wNTAwCisKKyAgICBSRUFETUU6IFJlbW92ZSBvdXRkYXRlZCBjcHUgdHlwZSwgYm9hcmQgdHlwZSwgYW5kIE5BTUVfY29uZmlnIGxpc3RzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDliYjU5OTEyZDIxYWFjYjUwN2ViODFmZDIxZmI3YWY2NTBjNzA2YworQXV0aG9yOiBEYXZlIExpdSA8cjYzMjM4QGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgQXVnIDEwIDE1OjQ4OjU5IDIwMDcgKzA4MDAKKworICAgIG1wYzgzeHg6IFN1cHByZXNzIHRoZSB3YXJuaW5nICdidXJzdGxlbicKKworICAgIHN1cHByZXNzIHRoZSB3YXJuaW5nICdidXJzdGxlbicgb2Ygc3BkX3NkcmFtLgorCisgICAgU2lnbmVkLW9mZi1ieTogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGM2NDZiYmE2NDY1YTQ1YzYwNzQ2ZDRjYzE2MDJjZDA2YzE5NjBmMmQKK0F1dGhvcjogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KK0RhdGU6CVRodSBBdWcgOSAxNToxMTowMyAyMDA3IC0wNTAwCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgU0JDODY0MUQuIENvbmZpZyBmaWxlcy4KKworICAgIEFkZCBzdXBwb3J0IGZvciBXaW5kIFJpdmVyJ3MgU0JDODY0MUQgcmVmZXJlbmNlIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZiBieTogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KKyAgICBBY2tlZC1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAgICBBY2tlZC1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDhhYzI3MzI3MWQ1NzMyMWY5MDUwNWM3YTUxY2RiMWVmMjExM2I2MjgKK0F1dGhvcjogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KK0RhdGU6CVRodSBBdWcgOSAxNToxMDo1MyAyMDA3IC0wNTAwCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgU0JDODY0MUQuICBCb2FyZCBmaWxlcy4KKworICAgIEFkZCBzdXBwb3J0IGZvciBXaW5kIFJpdmVyJ3MgU0JDODY0MUQgcmVmZXJlbmNlIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZiBieTogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KKyAgICBBY2tlZC1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAgICBBY2tlZC1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGMyYzBhYjRhZmY4NjYyMmI4MzdhNDhhMGU1NjAzNTFmOWFmYWZiOTUKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEF1ZyAxMCAyMDozNDo1OCAyMDA3ICswMjAwCisKKyAgICBDb25kaW5nIHN0eWxlIGNsZWFudXAKKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGM3NGIyMTA4ZTMxZmUwOWJkMWM1ZDI5MWMzY2YzNjA1MTBkNGYxM2UKK0F1dGhvcjogU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CitEYXRlOglGcmkgQXVnIDEwIDIwOjI2OjE4IDIwMDcgKzAyMDAKKworICAgIFtBUk1dIFRJIERhVmluY2kgc3VwcG9ydCwgaG9wZWZ1bGx5IGZpbmFsCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZyBEYVZpbmNpIGJvYXJkczoKKyAgICAtIERWX0VWTQorICAgIC0gU0NITU9PR0lFCisgICAgLSBTT05BVEEKKworICAgIENoYW5nZXM6CisKKyAgICAtIFNwbGl0IGludG8gc2VwYXJhdGUgYm9hcmQgZGlyZWN0b3JpZXMKKyAgICAtIFJlbW92ZWQgY2hhbmdlcyB0byBNVERfREVCVUcgKG9yIHdoYXRldmVyIGl0J3MgY2FsbGVkKQorICAgIC0gTmV3IENPTkZJR19DTUQgcGFydHkgbGluZSBmb2xsb3dlZAorICAgIC0gU29tZSBjb3NtZXRpYyBmaXhlcywgY2xlYW51cCBldGMuCisgICAgLSBQYXRjaGVzIGFnYWluc3QgdGhlIGxhdGVzdCBVLUJvb3QgdHJlZSBhcyBvZiBub3cuCisgICAgLSBGaXhlZCBDT05GSUdfQ01EX05FVCBpbiBuZXQgZmlsZXMuCisgICAgLSBGaXhlZCBDT05GSUdfQ01EX0VFUFJPTSBmb3Igc2NobW9vZ2llLgorICAgIC0gTWFkZSBzdXJlIGl0IGNvbXBpbGVzIGFuZCB3b3JrcyAoZm9yY2VlbnYoKSBsaW5rIHByb2JsZW0pIG9uIFNDSE1PT0dJRSBhbmQKKyAgICAgICBEVl9FVk0uIENhbid0IGNoZWNrIGlmIGl0IHdvcmtzIG9uIFNPTkFUQSwgZG9uJ3QgaGF2ZSBhIGJvYXJkIGFueSBtb3JlLAorICAgICAgIGJ1dCBpdCBhdCBsZWFzdCBjb21waWxlcy4KKworICAgIEhlcmUgaXMgYW4gZXhjZXJwdCBmcm9tIHNlc3Npb24gbG9nIG9uIFNDSE1PT0dJRS4uLgorCisgICAgVS1Cb290IDEuMi4wLWc2YzMzYzc4NS1kaXJ0eSAoQXVnICA3IDIwMDcgLSAxMzowNzoxNykKKworICAgIERSQU06ICAxMjggTUIKKyAgICBOQU5EOiAgMTI4IE1pQgorICAgIEluOiAgICBzZXJpYWwKKyAgICBPdXQ6ICAgc2VyaWFsCisgICAgRXJyOiAgIHNlcmlhbAorICAgIEFSTSBDbG9jayA6IDI5N01IegorICAgIEREUiBDbG9jayA6IDE2Mk1IegorICAgIEVUSCBQSFkgICA6IERQODM4NDggQCAweDAxCisgICAgVS1Cb290ID4gaXByb2JlCisgICAgVmFsaWQgY2hpcCBhZGRyZXNzZXM6IDFCIDM4IDNBIDNEIDNGIDUwIDVEIDZGCisgICAgVS1Cb290ID4gcGluZyAxOTIuMTY4LjI1My4xMAorICAgIGhvc3QgMTkyLjE2OC4yNTMuMTAgaXMgYWxpdmUKKyAgICBVLUJvb3QgPgorCisgICAgU2lnbmVkLW9mZi1ieTogU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgICAgQWNrZWQtYnk6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZ21haWwuY29tPgorICAgIEFja2VkLWJ5OiBaYWNoIFNhZGVja2kgPFphY2guU2FkZWNraUByaXBjb2RlLmNvbT4KKyAgICBBY2tlZC1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgMmU0ZDk0ZjFlM2MyOTYxNDI4OTY3YTMzYjZmZjI1MjA1NjgzOTFiMworQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1bCAyNyAwMTo1MDo0NSAyMDA3IC0wNTAwCisKKyAgICBmc2xfcGNpX2luaXQgY2xlYW51cC4KKworICAgIERvIG5vdCBlbmFibGUgbm9ybWFsIGVycm9ycyBjcmVhdGVkIGR1cmluZyBwcm9iZSAobWFzdGVyIGFib3J0LCBwZXJyLAorICAgIGFuZCBwY2llIEludmFsaWQgQ29uZmlndXJhdGlvbiBhY2Nlc3MpLgorCisgICAgQWRkIENPTkZJR19QQ0lfTk9TQ0FOIGJvYXJkIG9wdGlvbiB0byBwcmV2ZW50IGJ1cyBzY2FuLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBBY2tlZC1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTM2YjNlNjliNjY3YzNlYjlhNjFlY2U0ZTc4NjQ3ZDNmY2U5ZmMyYQorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1bCAyNyAwMTo1MDo0NCAyMDA3IC0wNTAwCisKKyAgICBwY2lhdXRvX3NldHVwX2RldmljZSBiYXJzX251bSBmaXgKKworICAgIFBhc3NpbmcgYmFyc19udW09MCB0byBwY2lhdXRvX3NldHVwX2RldmljZSBzaG91bGQgYXNzaWduIG5vIGJhcnMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorICAgIEFja2VkLWJ5OiBTaGlueWEgS3VyaWJheWFzaGkgPHNoaW55YS5rdXJpYmF5YXNoaUBuZWNlbC5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGNmMGIxODVlNThjYTBhZWM4YWUyYjJhODgwNGVjMGVmNThlZTIxZDQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBBdWcgNiAxNzozOTo0NCAyMDA3IC0wNTAwCisKKyAgICA4NjQxaHBjbjogRG8gY29ycmVjdCBzaXplZCBwb2ludGVyIG1hdGguCisKKyAgICBXaGVuIEkgcmViYXNlZCBFZCdzIHBhdGNoIGFuZCBjbGVhbmVkIHVwIGEgZmV3IGNvbXBpbGF0aW9uCisgICAgcHJvYmxlbXMsIEkgYXBwYXJlbnRseSByZWJhc2VkIG15IGJyYWluIG9uIGNyYWNrIGZpcnN0LgorICAgIEZpeCB0aGF0IGJ5IGRvaW5nIChjaGFyICopIHNpemVkIHBvaW50ZXIgbWF0aCBhcyBuZWVkZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgY2ZjN2E3ZjViYjMyNzNjOTk1MTE3M2M3ODgwMDFkNDUxMThmMTQxZgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVGh1IEF1ZyAyIDE0OjQyOjIwIDIwMDcgLTA1MDAKKworICAgIGNwdS84Nnh4IGZpeGVzLgorCisgICAgUmVtb3ZlIHJldiAxIGZpeGVzLgorICAgIEFsd2F5cyBzZXQgUElDR0NSX01PREUuCisgICAgRW5hYmxlIG1hY2hpbmUgY2hlY2sgYW5kIHByb3ZpZGUgYm9hcmQgY29uZmlnIG9wdGlvbgorICAgIHRvIHNldCBhbmQgaGFuZGxlIFNvQyBlcnJvciBpbnRlcnJ1cHRzLgorCisgICAgSW5jbHVkZSBNU1NTUjAgaW4gZXJyb3IgbWVzc2FnZS4KKworICAgIElzb2xhdGUgYSBSQU1CT09UIGJpdCBvZiBjb2RlIHdpdGggI2lmZGVmIENGR19SQU1CT09ULgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgM2E2ZDU2YzIwOTg5ZmUyNzM2MGFmZTc0M2JkMmE3YWQ0ZDc2ZTQ4ZgorQXV0aG9yOiBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGdvb2dsZW1haWwuY29tPgorRGF0ZToJVGh1IEF1ZyAyIDE3OjQyOjA4IDIwMDcgKzAyMDAKKworICAgIE1ha2UgdXNlIG9mIGdlbmVyaWMgNjRiaXQgZGl2aXNpb24gaW4gbmFuZF91dGlsLmMKKworICAgIFVzZSBnZW5lcmljIDY0Yml0IGRpdmlzaW9uIGluIG5hbmRfdXRpbC5jLiBUaGlzIG1ha2VzIG5hbmRfdXRpbC5jCisgICAgaW5kZXBlbmRlbnQgb2YgYW55IHRvb2xjaGFpbiA2NGJpdCBkaXZpc2lvbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZ21haWwuY29tPgorCitjb21taXQgZjdjMDg2ZTk0ZThjZTlhYWQ3MjY4YWY5N2Y3M2FhNjg4NDY4NmYyNworQXV0aG9yOiBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGdvb2dsZW1haWwuY29tPgorRGF0ZToJVGh1IEF1ZyAyIDE3OjQxOjE0IDIwMDcgKzAyMDAKKworICAgIE1vdmUgNjRiaXQgZGl2aXNpb24gZnJvbSBhdnIzMiB0byBnZW5lcmljIGxpYgorCisgICAgTW92ZSB0aGUgNjRiaXQgZGl2aXNpb24gZnJvbSBsaWJfYXZyMzIgdG8gbGliX2dlbmVyaWMuIFdpdGggdGhpcywgYWxsCisgICAgYm9hcmRzIGNhbiBkb19kaXYvX19kaXY2NF8zMiBpZiBuZWVkZWQsIG5vdCBvbmx5IGF2ciBvbmUuIENvZGUgaXMgcHV0CisgICAgdG8gbGliX2dlbmVyaWMsIHNvIG5vIGxhcmdlciBtZW1vcnkgZm9vdHByaW50IGlmIG5vdCB1c2VkLiBObyBjb2RlCisgICAgbW9kaWZpY2F0aW9ucy4gVGhhbmtzIGZvciBwcm9wb3NhbCBieSBIw6V2YXJkIFNraW5uZW1vZW4uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGdtYWlsLmNvbT4KKworY29tbWl0IDk5YzJmZGFiOTFiYzYzM2U0NmZiNDFkYmFhNjI5Zjg3Y2NmNmUwMGYKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBBdWcgNiAxODoxODozNCAyMDA3IC0wNTAwCisKKyAgICBtcGM4M3h4OiBmaXggSVRYW0dQXSBPPWJ1aWxkZGlyIGJ1aWxkcworCisgICAgbWFrZTogKioqIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgYC93b3JrL3dkL3RtcC9ib2FyZC9tcGM4MzQ5aXR4L3UtYm9vdC5sZHMnLCBuZWVkZWQgYnkgYC93b3JrL3dkL3RtcC91LWJvb3QnLiAgU3RvcC4KKworICAgIEJvdGggdGhlIElUWCBhbmQgSVRYLUdQIGZhaWwgd2hlbiB5b3UgdXNlICJtYWtlIE89PHNvbWUgZGlyPiAuLi4iIG9yCisgICAgIkJVSUxEX0RJUj08c29tZSBkaXI+IC4vTUFLRUFMTCAuLi4iCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDdlOGJjODQ2NzU5ZTAzN2I4YWYwZTVmOWM5ZjljZmE3YTEwNTBjMworQXV0aG9yOiBEYXZlIExpdSA8cjYzMjM4QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgQXVnIDEgMTU6MDA6NTkgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogQ29ycmVjdCB0aGUgUkVBRE1FIGZvciBERFIgRUNDCisKKyAgICBVcGRhdGUgdGhlIFJFQURNRSBmb3IgRERSIEVDQywgY2hhbmdlIHRoZSBuYW1lCisgICAgdG8gUkVBRE1FLm1wYzgzeHguZGRyZWNjLgorCisgICAgU2lnbmVkLW9mZi1ieTogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGFhYjhjNjdkMmRlZmVmNzNkYzI2YWIwN2YwYzNhZmQxYjA1ZDAxOQorQXV0aG9yOiBEYXZlIExpdSA8cjYzMjM4QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgQXVnIDEgMTU6MDA6MTUgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogQ29uc29saWRhdGUgdGhlIEVDQyBzdXBwb3J0IG9mIDgzeHgKKworICAgIFJlbW92ZSB0aGUgZHVwbGljYXRlZCBzb3VyY2UgY29kZSBvZiBlY2MgY29tbWFuZCBvbiB0aGUgPGJvYXJkPi5jLAorICAgIGZvciByZXVzZWQsIG1vdmUgdGhlc2UgY29kZSB0byBjcHUvbXBjODN4eCBkaXJlY3RvcnkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAwMzY1NzVjNTQ0Y2YxYjY5NjU0ZDhmYjMzNGJkYTY5YzZmZjNkYTM2CitBdXRob3I6IERhdmUgTGl1IDxyNjMyMzhAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVNhdCBBdWcgNCAxMzozNzozOSAyMDA3ICswODAwCisKKyAgICBtcGM4M3h4OiBDb3JyZWN0IHRoZSBidXJzdCBsZW5ndGggZm9yIEREUjIgd2l0aCAzMiBiaXRzCisKKyAgICBUaGUgYnVyc3QgbGVuZ3RoIHNob3VsZCBiZSA0IGZvciBERFIyIHdpdGggMzIgYml0cyBidXMKKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxYzI3NGM0ZTA1YjZkYzliMjRlZGM4YWE2MThiMDJmNjA3ZWU2ZWVkCitBdXRob3I6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDI1IDE5OjI1OjMzIDIwMDcgLTA1MDAKKworICAgIG1wYzgzeHg6IGFkZCBzdXBwb3J0IGZvciB0aGUgTVBDODMyM0UgUkRCCisKKyAgICBNUEM4MzIzRSBiYXNlZCBib2FyZCB3aXRoIDY0TUIgZml4ZWQgU0RSQU0sIDE2TUIgZmxhc2gsCisgICAgZml2ZSAxMC8xMDAgZXRoZXJuZXQgcG9ydHMgY29ubmVjdGVkIHZpYSBhbiBJQ1BsdXMgSVAxNzVDCisgICAgc3dpdGNoLCBvbmUgUENJIHNsb3QsIGFuZCBzZXJpYWwuICBGZWF0dXJlcyBub3Qgc3VwcG9ydGVkCisgICAgaW4gdGhpcyBwYXRjaCBhcmUgU0QgY2FyZCBpbnRlcmZhY2UsIDIgVVNCIHBvcnRzLCBhbmQgdGhlCisgICAgdHdvIHBob25lIHBvcnRzLgorCisgICAgU2lnbmVkLW9mZi1ieTogTWljaGFlbCBCYXJrb3dza2kgPG1pY2hhZWwuYmFya293c2tpQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDM0M2Q5MTAwOWQ1NWZjNWIzZmY4Y2M5NDA1OTdhZjZjNmFhMWQzNTkKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMjUgMTk6MjU6MjggMjAwNyAtMDUwMAorCisgICAgbXBjODN4eDogZml4dXAgZ2VuZXJpYyBwY2kgZm9yIGxpYmZkdAorCisgICAgYWRkIGxpYmZkdCBzdXBwb3J0IHRvIHRoZSBnZW5lcmljIDgzeHggcGNpIGNvZGUKKworICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmNTdhYzdhN2IzNzEwOTI0NWI2OWRiODA4MzllYmVlMjYxNzk5NjZhCitBdXRob3I6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDI1IDE5OjI1OjIyIDIwMDcgLTA1MDAKKworICAgIG1wYzgzeHg6IGZpeCA4MzYwIGFuZCBjcHUgZnVuY3Rpb25zIHRvIHVwZGF0ZSBmZHQgYmVpbmcgcGFzc2VkCisKKyAgICAuLmFuZCBub3QgdGhlIGdsb2JhbCBmZHQuIFJlbmFtZSBsb2NhbCBmZHQgdmFycyB0byBibG9iIHNvIGFzIG5vdCB0bworICAgIGJlIGNvbmZ1c2VkIHdpdGggdGhlIGdsb2JhbCB2YXIgd2l0aCB0aGUgc2FtZSB0aHJlZS1sZXR0ZXIgbmFtZS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA4YmU0MDQ0NTlhNmI3Mzk1NDE1YTU3YmIzNWU4Mzc3ZTNiMmI1YWNiCitBdXRob3I6IEplcnJ5IFZhbiBCYXJlbiA8Z3ZiLnVib290QGdtYWlsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMTozNDoyNCAyMDA3IC0wNDAwCisKKyAgICBtcGM4M3h4OiBGaXggZXJyb3JzIHdoZW4gQ09ORklHX09GX0xJQkZEVCBpcyBlbmFibGVkCisKKyAgICBTZXZlcmFsIG5vZGUgc3RyaW5ncyB3ZXJlIG5vdCBjb3JyZWN0ICh0cmFpbGluZyBzbGFzaGVzIGFuZCBwcm9wZXJ0aWVzCisgICAgICBpbiB0aGUgc3RyaW5ncykKKyAgICBBZGRlZCBzZXR0aW5nIG9mIHRoZSB0aW1lYmFzZS1mcmVxdWVuY3kuCisgICAgSW1wcm92ZWQgZXJyb3IgbWVzc2FnZXMgYW5kIHVzZSBkZWJ1ZygpIGluc3RlYWQgb2YgcHJpbnRmKCkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAyNmQwMmM5YmJhYzE3NTFjNWUxOTI5NGYwMDAxMDBiNDhkNDNhOTIwCitBdXRob3I6IEplcnJ5IFZhbiBCYXJlbiA8Z3ZiLnVib290QGdtYWlsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMToyNzozMCAyMDA3IC0wNDAwCisKKyAgICBtcGM4M3h4OiBSZXBsYWNlIGZkdF9ub2RlX29mZnNldCgpIHdpdGggZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkuCisKKyAgICBUaGUgbmV3IG5hbWUgbWF0Y2hlcyBtb3JlIGNsb3NlbHkgdGhlIGtlcm5lbCdzIG5hbWUsIHdoaWNoIGlzIGFsc28KKyAgICBhIG11Y2ggYmV0dGVyIGRlc2NyaXB0aW9uLgorCisgICAgVGhlc2UgYXJlIHRoZSBtcGM4M3h4IGNoYW5nZXMgbWFkZSBuZWNlc3NhcnkgYnkgdGhlIGZ1bmN0aW9uIG5hbWUgY2hhbmdlLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgICAgQWNrZWQtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDliZTM5YTY3YzlmOGZlZjcxMDdmNWRmMDlkNjczMDA1ZjA0ZDA5NjMKK0F1dGhvcjogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdW4gMjUgMTA6NDE6NTYgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogQWRkIHN1cHBvcnQgZm9yIHRoZSBkaXNwbGF5IG9mIHJlc2V0IHN0YXR1cworCisgICAgODN4eCBwcm9jZXNzb3IgZmFtaWx5IGhhcyBtYW55IHJlc2V0IHNvdXJjZXMsIHN1Y2ggYXMKKyAgICBwb3dlciBvbiByZXNldCwgc29mdHdhcmUgaGFyZCByZXNldCwgc29mdHdhcmUgc29mdCByZXNldCwKKyAgICBKVEFHLCBidXMgbW9uaXRvciwgc29mdHdhcmUgd2F0Y2hkb2csIGNoZWNrIHN0b3AgcmVzZXQsCisgICAgZXh0ZXJuYWwgaGFyZCByZXNldCwgZXh0ZXJuYWwgc29mdHdhcmUgcmVzZXQuCisgICAgc29tZXRpbWVzLCB0byBmaWd1cmUgb3V0IHRoZSBmYXVsdCBvZiBzeXN0ZW0sIHdlIG5lZWQgdG8KKyAgICBrbm93IHRoZSBjYXVzZSBvZiByZXNldCBlYXJseSBiZWZvcmUgdGhlIHByb21wdCBvZgorICAgIHUtYm9vdCBwcmVzZW50LgorCisgICAgU2lnbmVkLW9mZi1ieTogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZmY5NjU4ZDcwNDliZjhjOGU4ZTBhMDVkYmU1ZTlmN2U5MWFhNWE1ZAorQXV0aG9yOiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1biAyNSAxMDo0MTowNCAyMDA3ICswODAwCisKKyAgICBtcGM4M3h4OiBGaXggdGhlIGFsaWduIGJ1ZyBvZiBTRE1BIGJ1ZmZlcgorCisgICAgQWNjb3JkaW5nIHRvIHRoZSBsYXRlc3QgdXNlciBtYW51YWwsIHRoZSBTRE1BIHRlbXBvcmFyeQorICAgIGJ1ZmZlciBiYXNlIGFkZHJlc3MgbXVzdCBiZSA0S0IgYWxpZ25lZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDY2ZGMyYzJkYzUxZjhiODhiYjhlMjMxYmM4MGNkOTJlYWUxZDY0NzYKK0F1dGhvcjogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdW4gMjUgMTM6MjE6MTIgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogUmV2aXNlIHRoZSBNUEM4MzYwRU1EUyByZWFkbWUgZG9jCisKKyAgICBXaGVuIHRoZSByZXYyLnggc2lsaWNvbiBtb3VudCBvbiB0aGUgTVBDODM2MEVNRFMgYmFvcmQsCisgICAgYW5kIGlmIHlvdSBhcmUgdXNpbmcgdGhlIHUtYm9vdCB2ZXJzaW9uIGFmdGVyIHRoZSBjb21taXQKKyAgICAzZmMwYmQxNTkxMDNiNTM2ZTFjNTRjNmY0NDU3YTA5YjNhYmE2NmNhLgorICAgIHRvIG1ha2UgdGhlIGV0aGVybmV0IGludGVyZmFjZSB1c2FibGUsIHdlIGhhdmUgdG8gc2V0dXAKKyAgICB0aGUganVtcGVycyBjb3JyZWN0bHkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlNzM5YmM5NTc5N2FhYzRmZWZjNGM3NWI1NWM3Yzc4ZTU5ZDNlYTljCitBdXRob3I6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDMgMTM6NDY6MzIgMjAwNyAtMDUwMAorCisgICAgRlNMIEkyQyBkcml2ZXIgcHJvZ3JhbXMgdGhlIHR3byBJMkMgYnVzc2VzIGRpZmZlcmVudGx5CisKKyAgICBUaGUgaTJjX2luaXQoKSBmdW5jdGlvbiBpbiBmc2xfaTJjLmMgcHJvZ3JhbXMgdGhlIHR3byBJMkMgYnVzc2VzIGRpZmZlcmVudGx5LgorICAgIFRoZSBzZWNvbmQgSTJDIGJ1cyBoYXMgaXRzIHNsYXZlIGFkZHJlc3MgcHJvZ3JhbW1lZCBpbmNvcnJlY3RseSBhbmQgaXMKKyAgICBtaXNzaW5nIGEgNS11cyBkZWxheS4KKworICAgIFNpZ25lZC1vZmYtYnk6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGRmMzNmNmI0ZDZkNjM2OTNkZDkyMDA4MDhiMjQyZGUxYjg2Y2I4ZTgKK0F1dGhvcjogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMyAxMzowNDozNCAyMDA3IC0wNTAwCisKKyAgICBVcGRhdGUgU0NDUiBwcm9ncmFtbWluZyBpbiBjcHVfaW5pdF9mKCkgdG8gc3VwcG9ydCBhbGwgODN4eCBwcm9jZXNzb3JzCisKKyAgICBVcGRhdGUgdGhlIGNwdV9pbml0X2YoKSBmdW5jdGlvbiBpbiBjcHUvbXBjODN4eC9jcHVfaW5pdC5jIHRvIHByb2dyYW0gdGhlCisgICAgYml0ZmllbGRzIGZvciBhbGwgODN4eCBwcm9jZXNzb3JzLglUaGUgY29kZSB0byB1cGRhdGUgc29tZSBiaXRmaWVsZHMgd2FzCisgICAgY29tcGlsZWQgb25seSBvbiBzb21lIHByb2Nlc3NvcnMuICBOb3csIHRoZSBiaXRmaWVsZHMgYXJlIHByb2dyYW1tZWQgYXMgbG9uZworICAgIGFzIHRoZSBjb3JyZXNwb25kaW5nIENGR19TQ0NSIG9wdGlvbiBpcyBkZWZpbmVkIGluIHRoZSBib2FyZCBoZWFkZXIgZmlsZS4KKyAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIGJvYXJkIGhlYWRlciBmaWxlIHNob3VsZCBub3QgZGVmaW5lIGFueSBDRkdfU0NDUiBtYWNyb3MKKyAgICBmb3IgYml0ZmllbGRzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhhdCBwcm9jZXNzb3IsIG90aGVyd2lzZSB0aGUgU0NDUiB3aWxsIGJlCisgICAgcHJvZ3JhbW1lZCBpbmNvcnJlY3RseS4KKworICAgIFNpZ25lZC1vZmYtYnk6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDk1NDYyNjY5OTlmMGI5YjUxMzcyNjM2NjE0MjExYjg4ZDkwZjBmMjUKK0F1dGhvcjogTWFydGluIEtyYXVzZSA8bWFydGluLmtyYXVzZUB0cXMuZGU+CitEYXRlOglGcmkgSnVuIDIyIDEzOjA0OjIyIDIwMDcgKzAyMDAKKworICAgIFRRTTgzNHg6IGNsZWFudXAgY29uZmlndXJhdG9uCisKKyAgICBSZW1vdmUgaXJyaXRhdGluZyAjdW5kZWYgREVCVUcKKworICAgIFNpZ25lZC1vZmYtYnk6IE1hcnRpbiBLcmF1c2UgPG1hcnRpbi5rcmF1c2VAdHFzLmRlPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1ZDQ5N2U2YmYwZjViZjYzNzI5YjRhNDdiM2ZkNzg2ZDNjNzdhMWJjCitBdXRob3I6IGRhdmlkLnNhYWRhIDxEYXZpZC5TYWFkYUBlY2l0ZWxlLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTggMDk6MDk6NTMgMjAwNyAtMDcwMAorCisgICAgTVBDODN4eDogRml4IG1ha2VmaWxlIHRvIGdlbmVyYXRlIGNvbmZpZy5oIGZpbGUgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeQorCisgICAgTVBDODN4eDogRml4IHRoZSBNYWtlZmlsZSBjb25maWcgc2VjdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIGluY2x1ZGUvY29uZmlnLmgKKyAgICBmaWxlIGluIHRoZSBidWlsZCBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgc291cmNlIGRpcmVjdG9yeS4KKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNhYWRhIDxkYXZpZC5zYWFkYUBlY2l0ZWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgMWRlZDAyNDJlNDM3MjU5MzY2NzkyZDUyYjdlOWQxZTE5MzFkOGZhNQorQXV0aG9yOiBMZWUgTmlwcGVyIDxMZWUuTmlwcGVyQGZyZWVzY2FsZS5jb20+CitEYXRlOglUaHUgSnVuIDE0IDIwOjA3OjMzIDIwMDcgLTA1MDAKKworICAgIG1wYzgzeHg6IEFkZCBzdXBwb3J0IGZvciA4MzYwIHNpbGljb24gcmV2aXNpb24gMi4xCisKKyAgICBUaGlzIGNoYW5nZSBhZGRzIDgzNjAgc2lsaWNvbiByZXZpc2lvbiAyLjEgc3VwcG9ydCB0byB1LWJvb3QuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBMZWUgTmlwcGVyIDxsZWUubmlwcGVyQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGEyMjgwNjQ2OWE4ZjJiNjljODI5ZjRmZDUzNjFmZGViZDBjYjAxYjQKK0F1dGhvcjogS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KK0RhdGU6CVdlZCBBdWcgOCAwNDoxNDoyOCAyMDA3IC0wNTAwCisKKyAgICBUcmVhdCBwcGM2NCBob3N0IGFzIHBwYworCisgICAgU2lnbmVkLW9mZi1ieTogS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KKworY29tbWl0IDBkYzQyNzliMDhmZjgyNDcyYmVjMmUyYzkwODU4NjAyNDU5ZmViZTgKK0F1dGhvcjogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBBdWcgOCAwOTowMTo0NiAyMDA3ICswODAwCisKKyAgICBNaW5vciBmaXggZm9yIGJpb3MgZW11bGF0b3IgbWFrZWZpbGUKKworICAgIEFkZCAkKG9iaikgdG8gTElCIGF2b2lkaW5nIG9iamVjdHMgYmUgYnVpbHQgaW4gdGhlIHNvdXJjZSBkaXIKKworICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjZTk4MWRjODU3YWRmYzgwMzZjYTJmNmQ1ZDVhMDZjMmE4YWE3N2Q2CitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgQXVnIDggMDg6MzM6MTEgMjAwNyArMDgwMAorCisgICAgQWRkIENPTkZJR19CSU9TRU1VIGRlZmluZSB0byBndWFyZCBhbGwgdGhlIGJpb3MgZW11bGF0b3IgY29kZQorCisgICAgU2lnbmVkLW9mZi1ieTogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKworICAgIFRoaXMgcGF0Y2ggZml4IHRoZSBjb21waWxlIGlzc3VlIG9uIHRoZSBib2FyZCB0aGF0IGRpZCBub3QgZW5hYmxlIHRoZSBiaW9zIGVtdWxhdG9yCisKK2NvbW1pdCBlZDgxMDY0MzM1MjJmMmVhODkzM2U5ODA4MzQ2ODYwZDA2MWQ3NzMxCitBdXRob3I6IFphY2ggU2FkZWNraSA8WmFjaC5TYWRlY2tpQHJpcGNvZGUuY29tPgorRGF0ZToJVHVlIEp1bCAzMSAxMjoyNzoyNSAyMDA3IC0wNTAwCisKKyAgICB0c2VjOiBmaXggbXVsdGlwbGUgUEhZIHN1cHBvcnQKKworICAgIFRoZSBjaGFuZ2UgZW50aXRsZWQgIlJlZHVjZSBDT05GSUdfTVBDOFlYWF9UU0VDeCB0byBDT05GSUdfVFNFQ3giCisgICAgYnJva2UgbXVsdGlwbGUgUEhZIHN1cHBvcnQgaW4gdHNlYy5jLiAgVGhpcyBmaXhlcyBpdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFphY2ggU2FkZWNraSA8WmFjaC5TYWRlY2tpQHJpcGNvZGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkY2I4NGI3MjA4YWRlMGJiZWJiZWI1NmJlYzljMmM2NGY4YjJlZWRlCitBdXRob3I6IEpvZSBIYW1tYW4gPGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20+CitEYXRlOglUaHUgQXVnIDkgMDk6MDg6MTggMjAwNyAtMDUwMAorCisgICAgdHNlYzogQWxsb3cgVGVuIEJpdCBJbnRlcmZhY2UgYWRkcmVzcyB0byBiZSBjb25maWd1cmFibGUKKworICAgIEFsbG93IHRoZSBhZGRyZXNzIG9mIHRoZSBUZW4gQml0IEludGVyZmFjZSAoVEJJKSB0byBiZSBjaGFuZ2VkIGluIHRoZQorICAgIGV2ZW50IG9mIGEgY29uZmxpY3Qgd2l0aCBhbm90aGVyIGRldmljZS4KKworICAgIFNpZ25lZC1vZmYgYnk6IEpvZSBIYW1tYW4gPGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20+CisKK2NvbW1pdCA3YzRjMzcyMmEzOGQ0MGIwY2Y1MzdkZGFlNzJiMDRmNDA4OGIxOTBjCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgQXVnIDcgMTY6MTc6MDYgMjAwNyArMDgwMAorCisgICAgQWRkIENPTkZJR19CSU9TRU1VIGRlZmluZSB0byBndWFyZCBhbGwgdGhlIGJpb3MgZW11bGF0b3IgY29kZQorCisgICAgVGhpcyBwYXRjaCBmaXggdGhlIGNvbXBpbGUgaXNzdWUgb24gdGhlIGJvYXJkIHRoYXQgZGlkIG5vdCBlbmFibGUgdGhlIGJpb3MgZW11bGF0b3IKKworY29tbWl0IGJmMTA2MGVhNGY5ZWFhN2U3ZDE2NGE3MGE3ZDZmMjg5Mzk4ODIwNTMKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVR1ZSBBdWcgNyAxNjowMjoxMyAyMDA3ICswMjAwCisKKyAgICBGaXggbWlzc2luZyBicmFjZSBlcnJvciBpbiBmcy9mYXQvZmF0LmMKKyAgICBbcG9pbnRlZCBvdXQgYnkgUm9kZXJpayBXaWxkZW5idXJnXQorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDZjMzNjNzg1NTdjYTZmOGRhNjhjMDFjZTMzZTI3ODY5NTE5N2QzZjQKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CU1vbiBBdWcgNiAyMzoyMTowNSAyMDA3ICswMjAwCisKKyAgICBGaXhlZCB0eXBvIGluIFJFQURNRSAocG9pbnRlZCBvdXQgYnkgTWFydGluIEpvc3QpLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDljN2U0YjA2MjE0ZGI2MWJiMjFmMWJjYmU1N2M5NzUxOTY2OWJhYWUKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CU1vbiBBdWcgNiAwMjoxNzozNiAyMDA3ICswMjAwCisKKyAgICBDb2Rpbmcgc3R5bGUgY2xlYW51cC4gVXBkYXRlIENIQU5HRUxPRy4KKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKK2NvbW1pdCAyMjE4MzhjYzdlYjE3ODM3MGZmNjJhYTA1OTIwYTU4MmUxMmFjMzIyCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDA5OjAzOjIyIDIwMDcgKzA4MDAKKworICAgIFJlbW92ZSB0aGUgYmlvcyBlbXVsYXRvciBmcm9tIE1BSSBib2FyZC4KKworICAgIFRoZSBiaW9zIGVtdWxhdG9yIGluIHRoZSBNQUkgYm9hcmQgY2FuIG5vdCBwYXNzIGNvbXBpbGUKKyAgICBhbmQgaGF2ZSBhIGxvdCBvZiBjcmFwIGluIGl0LiByZW1vdmUgaXQgYW5kIHdpbGwgaGF2ZSBhCisgICAgY2xlYW4gYW5kIHNtYWxsIGJpb3MgZW11bGF0b3IgaW4gdGhlIGRyaXZlcnMgZGlyZWN0b3J5CisgICAgd2hpY2ggY2FuIGJlIHVlc2VkIGZvciBldmVyeSBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1NjE4MzMyNDA5YmI5NmY0NDQ4ZDE3MTI4OTkzNjlmYzgwYzBiNDg5CitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDEzIDEyOjE0OjU5IDIwMDcgKzA4MDAKKworICAgIEZpeCBzb21lIGNvbXBpbGUgaXNzdWVzIGZvciBNQUkgYm9hcmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMGY0NjBhMWVlMTQ4YjY0OGVlMjQyYzMxNTc2NTAyODdkNDI5NjI2MAorQXV0aG9yOiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1bCAxMyAxMjoxNDo1OCAyMDA3ICswODAwCisKKyAgICBDb25maWd1cmF0aW9ucyBmb3IgQVRJIHZpZGVvIGNhcmQgQklPUyBlbXVsYXRvcgorCisgICAgVGhpcyBwYXRjaCBhZGQgZGVmaW5pdGlvbiBvZiB0aGUgQklPUyBlbXVsYXRvciBhbmQgdGhlIEFUSSBmcmFtZWJ1ZmZlcgorICAgIGRyaXZlciBmb3IgTVBDODY0MUhQQ04gYm9hcmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlY2U5MmY4NTA1M2I4ZGY2MTNlZGNmMDViMjZhNDE2Y2JjM2Q2MjljCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDYgMDg6MzQ6NTYgMjAwNyArMDgwMAorCisgICAgVGhpcyBpcyBhIEJJT1MgZW11bGF0b3IsIHBvcnRpbmcgZnJvbSBTY2lUZWNoIGZvciB1LWJvb3QsIG1haW5seSBmb3IKKyAgICBBVEkgdmlkZW8gY2FyZCBCSU9TLiBhbmQgY2FuIGJlIHVzZWQgZm9yIHg4NiBjb2RlIGVtdWxhdGlvbiBieSBzb21lCisgICAgbW9kaWZpY2F0aW9ucy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1MDcyMTg4YWNhYmRlMzE3OGZhYzdmNWE1OTcxNTBlNmU3NGZkNDBjCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDYgMDg6MzM6MzMgMjAwNyArMDgwMAorCisgICAgVGhpcyBpcyBhIGZyYW1lYnVmZmVyIGRyaXZlciBmb3IgQVRJIHZpZGVvIGNhcmQsIGNhbiB3b3JrIGZvciBQQ0k5MjAwLAorICAgIFgzMDAsIFg3MDAsIFg4MDAgQVRJIHZpZGVvIGNhcmRzLgorCisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNTcyOGJlMzg5ZTY1ZmQ0N2YzNGIzM2MyNTk2MjcxZWI0ZGI3NTFhZQorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJTW9uIEF1ZyA2IDAxOjAxOjQ5IDIwMDcgKzAyMDAKKworICAgIENvZGluZyBzdHlsZSBjbGVhbnVwLiBVcGRhdGUgQ0hBTkdFTE9HLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDgwOTJmZWY0YzI5YjM5NTk1OGJiNjQ5NjQ3ZGE3ZTM3NzU3MzE1MTcKK0F1dGhvcjogTWFydGluIEtyYXVzZSA8TWFydGluLktyYXVzZUB0cXMuZGU+CitEYXRlOglUdWUgRGVjIDEyIDE0OjI2OjAxIDIwMDYgKzAxMDAKKworICAgIEFkZCBmdW5jdGlvbnMgdG8gbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMKKworICAgIEFkZGl0aW9uYWxseSBleHBvcnQgdGhlIGZvbGxvd2luZyBmdWN0aW9ucyAodG8gbWFrZSB0cmFiX2NvbmZpZyBidWlsZCBhZ2Fpbik6CisgICAgLSBzaW1wbGVfc3RydG9sKCkKKyAgICAtIHN0cmNtcCgpCisKKyAgICBBbHNvIGJ1bXAgdGhlIEFCSSB2ZXJzaW9uIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UKKworICAgIFNpZ25lZC1vZmYtYnk6IE1hcnRpbiBLcmF1c2UgPG1hcnRpbi5rcmF1c2VAdHFzLmRlPgorCitjb21taXQgNjNjZWM1ODE0ZmFiNWQyYjFjODY5ODIzMjc0MzM4MDdhNWFjMDI0OQorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVGh1IEF1ZyAyIDE0OjA5OjQ5IDIwMDcgLTA1MDAKKworICAgIE1ha2UgTVBDODY0MSdzIFBDSS9QQ0ktRSBkcml2ZXIgYSBjb21tb24gZHJpdmVyIGZvciBtYW55IEZTTCBwYXJ0cy4KKworICAgIEFsbCBvZiB0aGUgUENJL1BDSS1FeHByZXNzIGRyaXZlciBhbmQgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0CisgICAgd2FzIGluIHRoZSBNUEM4NjQxSFBDTiBwb3J0IGhhcyBub3cgYmVlbiBtb3ZlZCBpbnRvIHRoZSBjb21tb24KKyAgICBkcml2ZXJzL2ZzbF9wY2lfaW5pdC5jLiAgSW4gYSBzdWJzZXF1ZW50IHBhdGNoLCB0aGlzIHdpbGwgYmUKKyAgICB1dGlsaXplZCBieSB0aGUgODV4eCBwb3J0cyBhcyB3ZWxsLgorCisgICAgQ29tbW9uIFBDSS1FIElNTUFQIHJlZ2lzdGVyIGJsb2NrcyBmb3IgRlNMIDg1eHgvODZ4eCBhcmUgYWRkZWQuCisKKyAgICBBbHNvIGVuYWJsZSB0aGUgc2Vjb25kIFBDSS1FeHByZXNzIGNvbnRyb2xsZXIgb24gODY0MQorICAgIGJ5IGdldHRpbmcgaXRzIEJBVFMgYW5kIENGR18gc2V0dXAgcmlnaHQuCisKKyAgICBGaXhlZCBhIHUxNiB2ZW5kb3IgY29tcGlsZXIgd2FybmluZyBpbiBBSENJIGRyaXZlciB0b28uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDg2YjExNmIxYjFlMTY1Y2E0ODQwZGFlZmVkMzZkMmUzYjg0NjAxNzMKK0F1dGhvcjogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KK0RhdGU6CUZyaSBBdWcgMyAxMjowODoxNiAyMDA3ICswMjAwCisKKyAgICBjbTFfcXAxIC0+IGNtNTIwMDogc2luZ2xlIFUtQm9vdCBpbWFnZSBmb3IgbW9kdWxlcyBmcm9tIHRoZSBjbTUyMDAgZmFtaWx5LgorCisgICAgQWRkIHRoZSBhYmlsaXR5IGZvciBtb2R1bGVzIGZyb20gdGhlIFNjaGluZGxlciBjbTUyMDAgZmFtaWx5IHRvIHVzZSBhCisgICAgc2luZ2xlIFUtQm9vdCBpbWFnZToKKyAgICAtIHJlbmFtZSBjbTFfcXAxIHRvIGNtNTIwMAorICAgIC0gYWRkIHJ1bi10aW1lIG1vZHVsZSBkZXRlY3Rpb24KKyAgICAtIHBhcmFtZXRyaXplIFNEUkFNIGNvbmZpZ3VyYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBtb2R1bGUgd2UgYXJlIHJ1bm5pbmcgb24KKworICAgIEZldyBtaW5vciwgYm9hcmQtc3BlY2lmaWMgZml4ZXMgaW5jbHVkZWQgaW4gdGhpcyBwYXRjaDoKKyAgICAtIGJldHRlciBNQUMgYWRkcmVzcyBoYW5kbGluZworICAgIC0gdXBkYXRlZCBkZWZhdWx0IGVudmlyb25tZW50ICgndXBkYXRlJyBjb21tYW5kIHVzZXMgK3tmaWxlc2l6ZX0gbm93KQorICAgIC0gaW1wcm92ZWQgZXJyb3IgbWVzc2FnZXMgaW4gdGhlIGF1dG8tdXBkYXRlIGNvZGUKKyAgICAtIGFsbG93IGJvb3RpbmcgVS1Cb290IGZyb20gUkFNIChDRkdfUkFNQk9PVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFBpb3RyIEtydXN6eW5za2kgPHBwa0BzZW1paGFsZi5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KKworY29tbWl0IGM3ZTcxN2ViYzJiMDQ0ZDdhNzEwNjI1NTJjOWRjMGY1NGVhOWI3NzkKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEF1ZyAzIDA0OjA1OjI1IDIwMDcgLTA1MDAKKworICAgIEFkZCBNYXJ2ZWxsIDExNDkgUEhZIHN1cHBvcnQgdG8gdGhlIFRTRUMKKworY29tbWl0IGIxYjU0ZTM1MjAyOGVkMzcwYzNhYTk1ZDZmZGViOWQ2NGM1ZDJmODYKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBBdWcgMiAyMToyNzo0NiAyMDA3ICswMjAwCisKKyAgICBDb2Rpbmcgc3R5bGUgY2xlYW51cCwgdXBkYXRlIENIQU5HRUxPRworCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDYzZTIyNzY0ZDJmODY1M2Y2ODg4OGM2NjdlYjY1YjM5OTZiNTI2ODAKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBBdWcgMiAxMDoxMToxOCAyMDA3ICswMjAwCisKKyAgICBNaW5vciBjbGVhbnVwIG9mIDxib2FyZD5fbmFuZCBidWlsZCBydWxlcy4KKworY29tbWl0IGNkZDkxN2E0M2RhNmZhN2ZjOGY1NGEzY2M5ZjQyMGNlNWVjZjMxOTcKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBBdWcgMiAwMDo0ODo0NSAyMDA3ICswMjAwCisKKyAgICBGaXggYnVpbGQgZXJyb3JzIGFuZCB3YXJuaW5ncyAvIGNvZGUgY2xlYW51cC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKK2NvbW1pdCA4OTkzZTU0YjZmMzk3OTczNzk0ZjNkNmY0N2QzYjNjMGM5OGRkNGY2CitBdXRob3I6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CitEYXRlOglGcmkgSnVsIDI3IDE0OjQzOjU5IDIwMDcgKzAyMDAKKworICAgIFtBRFM1MTIxXSBTdXBwb3J0IGZvciB0aGUgQURTNTEyMSBib2FyZAorCisgICAgVGhlIGZvbGxvd2luZyBNUEM1MTIxZSBzdWJzeXN0ZW1zIGFyZSBzdXBwb3J0ZWQ6CisKKyAgICAtIGxvdy1sZXZlbCBDUFUgaW5pdAorICAgIC0gTk9SIEJvb3QgRmxhc2ggKGNvbW1vbiBDRkkgZHJpdmVyKQorICAgIC0gRERSIFNEUkFNCisgICAgLSBGRUMKKyAgICAtIEkyQworICAgIC0gV2F0Y2hkb2cKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogSmFuIFdyb2JlbCA8d3JyQHNlbWloYWxmLmNvbT4KKworY29tbWl0IDE4NjNjZmI3YjEwMGJhMGVlMzQwMTc5OTQ1N2EwMWRjMDU4NzQ1ZjgKK0F1dGhvcjogUmFmYWwgSmF3b3Jvd3NraSA8cmFqQHNlbWloYWxmLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMTQ6MjI6MDQgMjAwNyArMDIwMAorCisgICAgW1BQQ10gUmVtb3ZlIHVudXNlZCBNU1JfVVNFUiBkZWZpbml0aW9uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBSYWZhbCBKYXdvcm93c2tpIDxyYWpAc2VtaWhhbGYuY29tPgorCitjb21taXQgY2MzMDIzYjlmOTVkN2FjOTU5YTc2NDQ3MWE2NTAwMTA2MmFlY2Y0MQorQXV0aG9yOiBSYWZhbCBKYXdvcm93c2tpIDxyYWpAc2VtaWhhbGYuY29tPgorRGF0ZToJVGh1IEp1bCAxOSAxNzoxMjoyOCAyMDA3ICswMjAwCisKKyAgICBGaXggYnJlYWthZ2Ugb2YgOHh4IGJvYXJkcyBmcm9tIHJlY2VudCBjb21taXQuCisKKyAgICBUaGlzIHBhdGNoIGZpeGVzIHRoZSBuZWdhdGl2ZSBjb25zZXF1ZW5jZXMgZm9yIDh4eCBvZiB0aGUgcmVjZW50CisgICAgInBwYzR4eDogQ2xlYW4gdXAgNDQwIGV4Y2VwdGlvbnMgaGFuZGxpbmciIGNvbW1pdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CisKK2NvbW1pdCAzYTZjYWI4NDRjZjc0Zjc2NjM5ZDc5NWUwYmU4NzE3ZTAyYzg2YWY3CitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTYXQgSnVsIDE0IDIyOjUxOjAyIDIwMDcgKzAyMDAKKworICAgIFVwZGF0ZSBDSEFOR0VMT0cKKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKK2NvbW1pdCAwMTE1OTUzMDc3MzFhN2E2N2E3NDQ1ZDEwN2MyNzlkMDMxZThhYjk3CitBdXRob3I6IEhlaWtvIFNjaG9jaGVyIDxoc0Bwb2xsdXguZGVueC5kZT4KK0RhdGU6CVNhdCBKdWwgMTQgMDE6MDY6NTggMjAwNyArMDIwMAorCisgICAgW1BDUzQ0MEVQXQktIGZpeCBjb21waWxlIGVycm9yLCBpZiBCVUlMRF9ESVIgaXMgdXNlZAorCitjb21taXQgZmFkNjM0MDcxNTRmNDYyNDZjZTgwZDUzYTljNjY5YTQ0MzYyYWM2NworQXV0aG9yOiBIZWlrbyBTY2hvY2hlciA8aHNAcG9sbHV4LmRlbnguZGU+CitEYXRlOglGcmkgSnVsIDEzIDA5OjU0OjE3IDIwMDcgKzAyMDAKKworICAgIG1ha2Ugc2hvd19ib290X3Byb2dyZXNzICgpIHdlYWsuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KKworY29tbWl0IDkwNzkwMjQ3MjM5MWI2Y2ExODc2ZWMzMDA2ODc1NjJlY2FmNDU5YjEKK0F1dGhvcjogSGVpa28gU2Nob2NoZXIgPGhzQHBvbGx1eC5kZW54LmRlPgorRGF0ZToJRnJpIEp1bCAxMyAwODoyNjowNSAyMDA3ICswMjAwCisKKyAgICBbUENTNDQwRVBdCS0gVGhlIERJQUcgTEVEcyBhcmUgbm93IGJsaW5raW5nLCBpZiBhbiBlcnJvciBvY2N1cgorCQktIGZpeCBjb21waWxlIGVycm9yLCBpZiBCVUlMRF9ESVIgaXMgdXNlZAorCisgICAgU2lnbmVkLW9mZi1ieTogSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+CisKK2NvbW1pdCAyMzlmMDVlZTRkZDRjZmUwYjUwZjI1MWI1MzNkY2ViZTllNjdjMzYwCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglUaHUgSnVsIDEyIDAxOjQ1OjM0IDIwMDcgKzAyMDAKKworICAgIFVwZGF0ZSBDSEFOR0VMT0csIG1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDVhNTZhZjNiNTIyYmE0N2ZiMzNhM2ZlZTg0ZDIzYmYxZTU0Mjk2NTQKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1biA4IDE2OjQxOjE4IDIwMDcgLTA1MDAKKworICAgIFJlbW92ZSBlcnJvbmVvdXMgZXJyYXRhIGNvZGUgZnJvbSBNYXJ2ZWwgODhFMTExMVMgZHJpdmVyCisKKyAgICBUaGUgTWFydmVsIDg4RTExMTFTIGRyaXZlciBmb3IgdGhlIFRTRUMgd2FzIGNvcGllZCBmcm9tIHRoZQorICAgIDg4RTExMDEgZHJpdmVyLCBhbmQgaW5jbHVkZWQgYSBmaXggZm9yIGFuIGVycmF0dW0gd2hpY2ggZG9lcyBub3QKKyAgICBleGlzdCBvbiB0aGF0IHBhcnQuICBOb3cgaXQgaXMgcmVtb3ZlZAorCisgICAgU2lnbmVkLW9mZi1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTgyZWZjZjIzZmQwMzY0N2UwMWUyZmJlMjhhN2EzNjIzOTE1NmNjMAorQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVuIDUgMTY6Mzg6NDQgMjAwNyAtMDUwMAorCisgICAgRnJvbTogZXJhbiBsaWJlcnR5IDxlcmFuLmxpYmVydHlAZ21haWwuY29tPgorCisgICAgYWRkcyB0aGUgcmVzZXQgcmVnaXN0ZXIgdG8gODV4eCBpbW1hcAorCisgICAgU2lnbmVkLW9mZi1ieTogRXJhbiBMaWJlcnR5IDxlcmFuLmxpYmVydHlAZ21haWwuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGQzZWMwZDk0M2EwNDViZGI5OWUxNTllN2JiYzc3NDMwZTA5ZjExZDcKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVGh1IE1heSAxMCAxNzo1MDowMSAyMDA3IC0wNTAwCisKKyAgICBQb2xpc2hlZCB0aGUgODV4eCBBRFMgY29uZmlnIGZpbGVzCisKKyAgICBNYWRlIHRoZSBib290IGNvbW1hbmRzIHVzZSBkZXZpY2UgdHJlZXMgYnkgZGVmYXVsdC4KKyAgICBBbHNvIG1vdmVkIHRoZSByYW1kaXNrIHRvIDEwMDAwMDAgKEkgdGhpbmsgdGhlIHByZXZpb3VzIGFkZHJlc3MKKyAgICB3YXMgZ2V0dGluZyBvdmVycmlkZGVuIGR1cmluZyBib290KS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGJmYjM3YjMyZDFiMGIwM2YxODA3N2RiYTQ5Y2M2NmE2ZTc2ZmEwMzgKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBNYXkgOSAxMTowMzozMiAyMDA3IC0wNTAwCisKKyAgICA4NTQ0ZHM6IEZpeCBNYWtlZmlsZSBhZnRlciBtb3ZpbmcgcGl4aXMgdG8gYm9hcmQvZnJlZXNjYWxlLgorCisgICAgVGhlIE9CSlRSRUUgIT0gU1JDVFJFRSBidWlsZCBzY2VuYXJpbyB3YXMgYnJva2VuLgorICAgIFRoaXMgZml4ZXMgaXQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAyYTNjZWU0M2MzYjcxZmE1YjhkOTFkYjE5ZjA1MDY3ODY1MjkwZjNlCitBdXRob3I6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBNYXkgOSAwMDo1NDoyMCAyMDA3IC0wNTAwCisKKyAgICB0c2VjOiBGaXggUEhZIGNvZGUgdG8gbWF0Y2ggZmlyc3QgZHJpdmVyCisKKyAgICBKYXJyb2xkIFdlbiBub3RpY2VkIHRoYXQgdGhlIGdlbmVyaWMgUEhZIGNvZGUgYWx3YXlzIG1hdGNoZXMKKyAgICB1bmRlciB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4gIENoYW5nZSBpdCBzbyB0aGUgZmlyc3QgbWF0Y2gKKyAgICB3aW5zLCBhbmQgKm9ubHkqIHVua25vd24gUEhZcyB0cmlnZ2VyIHRoZSBnZW5lcmljIGRyaXZlcgorCisgICAgU2lnbmVkLW9mZi1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgY2NjMDkxYWFjNjFhMzhjZDk5OGQ1NzVkOTJmNzIzMmUyNTZkNjMxMgorQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgTWF5IDggMTc6Mjc6NDMgMjAwNyAtMDUwMAorCisgICAgQWRkIHN1cHBvcnQgZm9yIENQTSBkZXZpY2UgdHJlZSBjb25maWd1cmF0aW9uIHRvIDg1NjAgQURTCisKKyAgICAqIEFkZHMgY29kZSB0byBtb2RpZnkgQ1BNIGZyZXF1ZW5jaWVzCisgICAgKiBDbGVhbnMgdXAgdGhlIGNvbmZpZyBmaWxlIHRvICNkZWZpbmUgVFNFQyBhbmQgKGZvciBub3cpICN1bmRlZiBGQ0MKKyAgICAqIEFkZHMgdGhlIE1JSSBjb21tYW5kIGZvciBhbGwgODU2MCBBRFMgY29uZmlndXJhdGlvbnMKKyAgICAqIFVwZGF0ZXMgY29uZmlnIGZpbGUgdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBjb21tYW5kcyBmb3IgYm9vdGluZworICAgICAgd2l0aCBhIGRldmljZSB0cmVlCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBWaXRhbHkgQm9yZHVnIDx2Ym9yZHVnQHJ1Lm12aXN0YS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNzUwN2Q1NmNjYWY3YWFlMWM0NzQzNDJhOWE1NTQwMTY1Y2Q3ZTlkOQorQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgTWF5IDggMTc6MjM6MDIgMjAwNyAtMDUwMAorCisgICAgRml4IE1hcnZlbGwgODhlMTE0NSBQSFkgaW5pdCBjb2RlCisKKyAgICBGaXggYSBidWcgaW4gdGhlIE1hcnZlbGwgODhlMTE0NSBQSFkgaW5pdCBjb2RlIGluIHRoZSBUU0VDIGRyaXZlcgorICAgIHdoZXJlIHRoZSByZXNldCB3YXMgYmVpbmcgZG9uZSBhZnRlciB0aGUgZXJyYXRhIGNvZGUgaW5zdGVhZCBvZgorICAgIGJlZm9yZS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhaXlpbmcgV2FuZyA8aGFpeWluZy53YW5nQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNWRjMjEwZGVjNWJhY2U5OGE1MGI2YmE5MDUzNDc4OTAwOTFhOWJiMAorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1bCAxMSAxNDo1MjoxNiAyMDA3IC0wNTAwCisKKyAgICBBZGQgc2ltcGxlIGFnZW50L2VuZC1wb2ludCBjb25maWd1cmF0aW9uIGluIFBDSSBBdXRvQ29uZmlnIGZvciBQQ0lfQ0xBU1NfUFJPQ0VTU09SX1BPV0VSUEMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZThiODVmM2JhNGNkODkzMGUwYTJmZWEyMTAwYzgxNWQ2NDIwMTc2NQorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1bCAxMSAxNDo1MjowOCAyMDA3IC0wNTAwCisKKyAgICBwY2lhdXRvIHNldHVwIGJyaWRnZQorCisgICAgVGhlIFAyUCBicmlkZ2UgYnVzIG51bWJlcnMgcHJvZ3JhbW1lZCBpbnRvIHRoZSBkZXZpY2UgYXJlIHJlbGF0aXZlIHRvCisgICAgaG9zZS0+Zmlyc3RfYnVzbm8uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNTcxZjQ5ZmE3MTcwMDRjYTQyNjhiNGUyNDA1N2VmYzdiZjlmOTg3YgorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1bCAxMSAxNDo1MjowMSAyMDA3IC0wNTAwCisKKyAgICBTdXBwb3J0IFBDSWUgZXh0ZW5kZWQgY29uZmlnIHJlZ2lzdGVycworCisgICAgRlNMIFBDSWUgYmxvY2sgaGFzIGV4dGVuZGVkIGNmZyByZWdpc3RlcnMgaW4gdGhlIDEwMCBhbmQgNDAwIHJhbmdlLgorICAgIEZvciBleGFtcGxlLCB0byByZWFkIHRoZSBMVFNTTSByZWdpc3RlcjogcGNpIGRpc3BsYXkgPGJ1c24+LjAgNDA0IDEKKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiYTVmZWIxMjU4MWJiMjkxMmNlMzAxZTQ4NjZiNzFmODQ2ZTlmYzA3CitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDExIDE0OjUxOjQ4IDIwMDcgLTA1MDAKKworICAgIE1pbm9yIGltcHJvdmVtZW50cyB0byBkcml2ZXJzL3BjaV9hdXRvLmMKKworICAgIC0gTWFrZSBwY2lhdXRvX3twcmUscG9zdH1zY2FuX3NldHVwX2JyaWRnZSBub24tc3RhdGljCisgICAgLSBBZGRlZCBwaHlzaWNhbCBhZGRyZXNzIGRpc3BsYXkgaW4gZGVidWcgbWVzc2FnZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDBlODFhZGRhYjdiYjc0ZDIwZGRmNjgxY2U5YmFiYzg4MGE4MjhlZQorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1bCAxMSAxNDo1MTozNSAyMDA3IC0wNTAwCisKKyAgICBTdGFydCBwY2kgaG9zZSBzY2FuIGZyb20gaG9zZS0+Y3VycmVudF9idXNuby4KKworICAgIEVuc3VyZSBob3NlLT5jdXJyZW50X2J1c25vIGlzIG5vdCBsZXNzIHRoYW4gZmlyc3RfYnVzbm8uICBUaGlzIGZpeGVzCisgICAgYnJva2VuIGJvYXJkIGNvZGUgd2hpY2ggbGVhdmVzIGN1cnJlbnRfYnVzbm89MCB3aGVuIGZpcnN0X2J1c25vIGlzCisgICAgZ3JlYXRlciB0aGFuIDAgZm9yIHRoZSBjYXNlcyB3aXRoIG11bHRpcGxlIGNvbnRyb2xsZXJzLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDM4NjViMWZiNzg0M2EwOGFkNDlhNjMxOWEzNjQxNTc1MjI3NmZmNDgKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJV2VkIEp1bCAxMSAxMjoxMzo1MyAyMDA3ICswMjAwCisKKyAgICBGaXggc29tZSBjb21waWxlIHByb2JsZW1zIGludHJvZHVjZWQgYnkgdGhlIGxhdGVzdCBDRkdfQ01EX3h4eCBjbGVhbnVwCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCBmYTFkZjMwODkyNmE2ZjcwZTM1MDRjNTc1MTRlZjI3YWMzMWZkMTNhCitBdXRob3I6IEJhcnRsb21pZWogU2lla2EgPHR1ckBzZW1paGFsZi5jb20+CitEYXRlOglXZWQgSnVsIDExIDIwOjExOjA3IDIwMDcgKzAyMDAKKworICAgIENNMS5RUDE6IFN1cHBvcnQgZm9yIHRoZSBTY2hpbmRsZXIgQ00xLlFQMSBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFBpb3RyIEtydXN6eW5za2kgPHBwa0BzZW1paGFsZi5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KKworY29tbWl0IDk2ZTFkNzViZTgxOTNjYTc5ZTQyMTVhMzY4YmY5ZDdmMjM2MjQ1MGYKK0F1dGhvcjogSGVpa28gU2Nob2NoZXIgPGhzQHBvbGx1eC5kZW54LmRlPgorRGF0ZToJV2VkIEp1bCAxMSAxODozOToxMSAyMDA3ICswMjAwCisKKyAgICBbUENTNDQwRVBdCS0gU2hvdyBvbiB0aGUgRElBRyBMRURzLCBpZiB0aGUgU0hBMSBjaGVjayBmYWlsZWQKKwkJLSBub3cgdGhlIEZsYXNoIFNUIE0yOVcwNDBCIGlzIHN1cHBvcnRlZCAobm90IHRlc3RlZCkKKwkJLSBmaXggdGhlICJsZWQiIGNvbW1hbmQKKwkJLSBmaXggY29tcGlsZSBlcnJvciwgaWYgQlVJTERfRElSIGlzIHVzZWQKKworICAgIFNpZ25lZC1vZmYtYnk6IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorCitjb21taXQgZTk1MTQ3NTFjZmE1Y2NlNjFlYTY5OWZhMGQzZWIzNzg5OGE1ZWViNQorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglTdW4gSnVsIDggMTM6NDQ6MjcgMjAwNyArMDIwMAorCisgICAgRml4IG1hbGxvYyBwcm9ibGVtIGludHJvZHVjZWQgd2l0aCB0aGUgcmVsb2NhdGlvbiBmaXh1cCBmb3IgdGhlIFBQQyBwbGF0Zm9ybQorCisgICAgVGhlIHJlbG9jYXRpb24gZml4dXAgZGlkbid0IGhhbmRsZSB0aGUgbWFsbG9jIHBvaW50ZXIgaW5pdGlhbGl6YXRpb24KKyAgICBjb3JyZWN0bHkuIFRoaXMgcGF0Y2ggZml4ZXMgdGhpcyBwcm9ibGVtLiBUZXN0ZWQgc3VjY2Vzc2Z1bGx5IG9uIDR4eC4KKyAgICBUaGUgcmVsb2NhdGlvbiBmaXh1cCBwYXRjaGVzIGZvciA0eHggd2lsbCBmb2xsb3cgc29vbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGIzYWZmMGNiOWVjZjIzNmQ3ZThjOTM3NjFkZDFkYWRmNjgzN2E1ODIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTE6MTk6NTAgMjAwNyAtMDUwMAorCisgICAgZGlzay8gZG9jLyBsaWJfKi8gYW5kIHRvb2xzLzogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgRml4ZWQgc29tZSBicm9rZW4gaW5zdGFuY2VzIG9mICIjaWZkZWYgQ01EX0NGR19JREUiIHRvby4KKyAgICBUaG9zZSBhbHdheXMgZXZhbHVhdGVkIFRSVUUsIGFuZCB0aHVzIHdlcmUgYWx3YXlzIGNvbXBpbGVkCisgICAgZXZlbiB3aGVuIElERSByZWFsbHkgd2Fzbid0IGRlZmluZWQvd2FudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGRkYjVkODZmMDIxNWJjYjZjMjkzNTEwYzUwZWIwNTBlOTI4ODNiN2EKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTE6MTM6MjEgMjAwNyAtMDUwMAorCisgICAgZHJpdmVycy86IFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIEZpeGVkIHNvbWUgYnJva2VuIGluc3RhbmNlcyBvZiAiI2lmZGVmIENNRF9DRkdfSURFIiB0b28uCisgICAgVGhvc2UgYWx3YXlzIGV2YWx1YXRlZCBUUlVFLCBhbmQgdGh1cyB3ZXJlIGFsd2F5cyBjb21waWxlZAorICAgIGV2ZW4gd2hlbiBJREUgcmVhbGx5IHdhc24ndCBkZWZpbmVkL3dhbnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmNDBhN2YzZTM4ODhiNDJhNDM2NzRiMDk5ZTU0NzAwMjJjOGM1NDRjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDExOjA3OjU2IDIwMDcgLTA1MDAKKworICAgIGZzLzogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgRml4ZWQgc29tZSBicm9rZW4gaW5zdGFuY2VzIG9mICIjaWZkZWYgQ01EX0NGR19JREUiIHRvby4KKyAgICBUaG9zZSBhbHdheXMgZXZhbHVhdGVkIFRSVUUsIGFuZCB0aHVzIHdlcmUgYWx3YXlzIGNvbXBpbGVkCisgICAgZXZlbiB3aGVuIElERSByZWFsbHkgd2Fzbid0IGRlZmluZWQvd2FudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDYxMGYyZTljMjhhOWMxMDFlMDlmYTFiNzgxNDNjZjVmMDBlZDE1OTMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTE6MDU6MDIgMjAwNyAtMDUwMAorCisgICAgbmV0LzogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgRml4ZWQgc29tZSBicm9rZW4gaW5zdGFuY2VzIG9mICIjaWZkZWYgQ01EX0NGR19JREUiIHRvby4KKyAgICBUaG9zZSBhbHdheXMgZXZhbHVhdGVkIFRSVUUsIGFuZCB0aHVzIHdlcmUgYWx3YXlzIGNvbXBpbGVkCisgICAgZXZlbiB3aGVuIElERSByZWFsbHkgd2Fzbid0IGRlZmluZWQvd2FudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDkwMjUzMTc4ODM3NjA0NmRhMjEyYWZkMTY2MWNmZmI2MmYzZGFhMWMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTE6MDI6NDQgMjAwNyAtMDUwMAorCisgICAgY29tbW9uLzogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgRml4ZWQgc29tZSBicm9rZW4gaW5zdGFuY2VzIG9mICIjaWZkZWYgQ01EX0NGR19JREUiIHRvby4KKyAgICBUaG9zZSBhbHdheXMgZXZhbHVhdGVkIFRSVUUsIGFuZCB0aHVzIHdlcmUgYWx3YXlzIGNvbXBpbGVkCisgICAgZXZlbiB3aGVuIElERSByZWFsbHkgd2Fzbid0IGRlZmluZWQvd2FudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGQzOWI1NzQxNTgzOGM3M2ZiMGEzN2VjYTg0ZGUzYzY4YmE5OTA1ODYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTA6NDg6MjIgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW2otel0qOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNzdhMzE4NTQ1ZDU3YWVmYTg0NDc1MjQ2NWI5NGM3ZTA5YTNmMjZkMAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMDozOToxMCAyMDA3IC0wNTAwCisKKyAgICBib2FyZC9bQS1aYS1pXSo6IFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIEZpeGVkIHNvbWUgYnJva2VuIGluc3RhbmNlcyBvZiAiI2lmZGVmIENNRF9DRkdfSURFIiB0b28uCisgICAgVGhvc2UgYWx3YXlzIGV2YWx1YXRlZCBUUlVFLCBhbmQgdGh1cyB3ZXJlIGFsd2F5cyBjb21waWxlZAorICAgIGV2ZW4gd2hlbiBJREUgcmVhbGx5IHdhc24ndCBkZWZpbmVkL3dhbnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAwNjhiNjBhMGViN2U3M2IyNDNjYTU1Mzk5ZjJhN2RmNzZlMmMzZjNkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDEwOjI3OjM5IDIwMDcgLTA1MDAKKworICAgIGNwdS8gcnRjLyBpbmNsdWRlLzogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDA3OWExMzZjMzU4ODgxNDc4NDU2MWQ2ZTQ4NTY5NzBlZTgyZDZlMmEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTA6MTI6MTAgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1twLXpdKiArIG1pc2M6IENsZWFudXAgQk9PVFAgYW5kIGxpbmdlcmluZyBDRkdfQ01EXyouCisKKyAgICBFeHBsaWNpdGx5IGFkZCBpbiBkZWZhdWx0IENPTkZJR19CT09UUF8qIG9wdGlvbnMgd2hlcmUgY21kX2NvbmZkZWZzLmgKKyAgICB1c2VkIHRvIGJlIGluY2x1ZGVkIGJ1dCBDT05GSUdfQk9PVFBfTUFTSyB3YXMgbm90IGRlZmluZWQuCisKKyAgICBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgN2Y1YzAxNTc3NDAwYzc0Y2M1YmFjNzRmNDFkZDBkM2M3OWRmNjIzYworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAwOTozODowMiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW2ctb10qOiBDbGVhbnVwIEJPT1RQIGFuZCBsaW5nZXJpbmcgQ0ZHX0NNRF8qLgorCisgICAgRXhwbGljaXRseSBhZGQgaW4gZGVmYXVsdCBDT05GSUdfQk9PVFBfKiBvcHRpb25zIHdoZXJlIGNtZF9jb25mZGVmcy5oCisgICAgdXNlZCB0byBiZSBpbmNsdWRlZCBidXQgQ09ORklHX0JPT1RQX01BU0sgd2FzIG5vdCBkZWZpbmVkLgorCisgICAgUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDgwZmY0Zjk5Yjg0YjY0ZWRjYTNmZDEwZGEzNjVlYzE0OTNiZTFjOTUKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMDk6Mjk6MDEgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1thLWVdKjogQ2xlYW51cCBCT09UUCBhbmQgbGluZ2VyaW5nIENGR19DTURfKi4KKworICAgIEV4cGxpY2l0bHkgYWRkIGluIGRlZmF1bHQgQ09ORklHX0JPT1RQXyogb3B0aW9ucyB3aGVyZSBjbWRfY29uZmRlZnMuaAorICAgIHVzZWQgdG8gYmUgaW5jbHVkZWQgYnV0IENPTkZJR19CT09UUF9NQVNLIHdhcyBub3QgZGVmaW5lZC4KKworICAgIFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhMWFhMGJiNTAyZTI1ZmQ1OThiNWUwY2NkZmIyYzE3NDkyMWQ3MTRhCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDA5OjIyOjIzIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bUC1aXSo6IENsZWFudXAgQk9PVFAgYW5kIGxpbmdlcmluZyBDRkdfQ01EXyouCisKKyAgICBFeHBsaWNpdGx5IGFkZCBpbiBkZWZhdWx0IENPTkZJR19CT09UUF8qIG9wdGlvbnMgd2hlcmUgY21kX2NvbmZkZWZzLmgKKyAgICB1c2VkIHRvIGJlIGluY2x1ZGVkIGJ1dCBDT05GSUdfQk9PVFBfTUFTSyB3YXMgbm90IGRlZmluZWQuCisKKyAgICBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjU5ZTJmNjczNjIzMmEwOGFjY2E4Nzg1YzIwNmUyYjRkOWNkMDdkNworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAwOToxMDo0OSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW0otT10qOiBDbGVhbnVwIEJPT1RQIGFuZCBsaW5nZXJpbmcgQ0ZHX0NNRF8qLgorCisgICAgRXhwbGljaXRseSBhZGQgaW4gZGVmYXVsdCBDT05GSUdfQk9PVFBfKiBvcHRpb25zIHdoZXJlIGNtZF9jb25mZGVmcy5oCisgICAgdXNlZCB0byBiZSBpbmNsdWRlZCBidXQgQ09ORklHX0JPT1RQX01BU0sgd2FzIG5vdCBkZWZpbmVkLgorCisgICAgUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDExNzk5NDM0YzVmZjE1YTYxMjU3N2JiMWFkMWY0ZWExYTA1OTVlNGIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMDk6MDI6NTcgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1tBLUldKjogQ2xlYW51cCBCT09UUCBhbmQgbGluZ2VyaW5nIENGR19DTURfKi4KKworICAgIEV4cGxpY2l0bHkgYWRkIGluIGRlZmF1bHQgQ09ORklHX0JPT1RQXyogb3B0aW9ucyB3aGVyZSBjbWRfY29uZmRlZnMuaAorICAgIHVzZWQgdG8gYmUgaW5jbHVkZWQgYnV0IENPTkZJR19CT09UUF9NQVNLIHdhcyBub3QgZGVmaW5lZC4KKworICAgIFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxZmU4MGQ3OWM1YzRlNTJkMzQxMGE3YWI0Yjg1MTVkYTA5NWNkYWIzCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMjI6MDg6MzQgMjAwNyAtMDUwMAorCisgICAgRmluYWxseSByZXRpcmUgY21kX2NvbmZkZWZzLmggYW5kIENPTkZJR19CT09UUF9NQVNLIQorCisgICAgQWxsIG9mIHRoZSBjaG9pY2VzIGZvciBDT05GSUdfQk9PVFBfIGFyZSBub3cgZG9jdW1lbnRlZCBpbgorICAgIHRoZSBSRUFETUUgZmlsZS4gIFlvdSBtdXN0IG5vdyBpbmRpdmlkdWFsbHkgc2VsZWN0IGV4YWN0bHkKKyAgICB0aGUgc2V0IHRoYXQgeW91IHdhbnQgdXNpbmcgYSBzZXJpZXMgb2YKKwkjZGVmaW5lIENPTkZJR19CT09UUF88eD4KKyAgICBzdGF0ZW1lbnRzIGluIHRoZSBib2FyZCBwb3J0IGNvbmZpZyBmaWxlcyBub3cuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDNiOGMxYTc0M2RjZDMxNjI1Yzk5ZTZhNDQ1OTBmMjA3ZWIwMDAyOAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDIxOjU3OjMxIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bbS16XSo6IERpcmVjdGx5IHVzZSBDT05GSUdfQk9PVFBfKiBzeW1ib2xzIHJhdGhlciB0aGFuIENPTkZJR19CT09UUF9NQVNLLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDJmZDkwY2U1NzViMDJkMTg5Y2JmNDQzYzg1MzA5YmNkMDAxYWEzOTMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAyMTo0ODoyNiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW2EtbV0qOiBEaXJlY3RseSB1c2UgQ09ORklHX0JPT1RQXyogc3ltYm9scyByYXRoZXIgdGhhbiBDT05GSUdfQk9PVFBfTUFTSy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzN2Q0YmI3MDU4NjY1OWRlZGVmMTY1OGNlMWJlZDA3MWJlMDk4YWVjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMjE6Mzg6MDIgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1tULVpdKjogRGlyZWN0bHkgdXNlIENPTkZJR19CT09UUF8qIHN5bWJvbHMgcmF0aGVyIHRoYW4gQ09ORklHX0JPT1RQX01BU0suCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMTgyMjVlOGRkMTk1MGJkNmRiZjM1MDExZTQzNmRiN2Y0NzRjMTg3ZAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDIxOjMxOjI0IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bUC1TXSo6IERpcmVjdGx5IHVzZSBDT05GSUdfQk9PVFBfKiBzeW1ib2xzIHJhdGhlciB0aGFuIENPTkZJR19CT09UUF9NQVNLLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDdiZTA0NGU0ZWE2NDRiMGVmMWM0ODZkYWRjMWE0YzI2NjViNDM3NGQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAyMToyNDoxOSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW0gtTl0qOiBEaXJlY3RseSB1c2UgQ09ORklHX0JPT1RQXyogc3ltYm9scyByYXRoZXIgdGhhbiBDT05GSUdfQk9PVFBfTUFTSy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1ZDJlYmUxYjNlZjAwNTVjNjYxYmIxYTBkMjUyYmYyNTIzODAwNjlmCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMjE6MTY6NTMgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1tBLUddKjogRGlyZWN0bHkgdXNlIENPTkZJR19CT09UUF8qIHN5bWJvbHMgcmF0aGVyIHRoYW4gQ09ORklHX0JPT1RQX01BU0suCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZjU1ZjdmOGQ4M2YzNjAyMWFiMWYwZTNkNzM4ZjVkOGM4MDgzYTdlMworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE5OjEyOjMwIDIwMDcgLTA1MDAKKworICAgIFJldGlyZSBDT05GSUdfQ09NTUFORFMgZmluYWxseS4KKyAgICBTdHJpcCBvbGQgQ0ZHX0NNRF8qIHN5bWJvbHMgb3V0LgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGI1NTAxZjdkNzIwZmVkOTlhYjBiNDJjODNmNWRlYTUyODY4Y2UwMDcKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxOToxMDowMyAyMDA3IC0wNTAwCisKKyAgICBVcGRhdGUgUkVBRE1FLiogdG8gcmVmZXJlbmNlIG5ldyBDT05GSUdfQ01EXyogbmFtZXMgbm93LgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQ0MzEyODNjN2U2ZDU0YWUxODBkNDY2ZTUxYmYyZDk3NDcxYTBhZDkKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxOTowNjowMCAyMDA3IC0wNTAwCisKKyAgICBjcHUvbSo6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDNhMWVkMWUxZjkyMmM0MTliYjcxZjdkZjQ5NDlkNzgzYWRlMzY5ZmEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxODo1NzoyMiAyMDA3IC0wNTAwCisKKyAgICBjcHUvWzdhLWxuLXpdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYWIzYWJjYmFiZDg0MDkyOGZiMWViNTEyMjExOGNhNDY2YjVlNTAxMworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjQ1OjE2IDIwMDcgLTA1MDAKKworICAgIGJvYXJkL1txLXpdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgM2ZlMDAxMDlhNWYxMmRlNTViNmUyNWIxZjk4ZGZjMjRiYzkwOTBjOQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjM4OjM5IDIwMDcgLTA1MDAKKworICAgIGJvYXJkL1ttLXBdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYzUwOGE0Y2VmZDhhOTUzZmM2NDk1NzY1MDUwNmEwMzVlNmUzZDlkMQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjMxOjI4IDIwMDcgLTA1MDAKKworICAgIGJvYXJkL1tmLWxdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYjkzMDcyNjJmOGE5ZjNiNWM5ZTE1YTYwNjdlYWRjMTc0MDcxNDZmNgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjI0OjU1IDIwMDcgLTA1MDAKKworICAgIGJvYXJkL1tkLWVdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZmNlYzJlYjkzZTEyNjQwMDAwOTcyOTMyOGU3OTdmMTJiYzk0ZjFmZAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjE5OjA5IDIwMDcgLTA1MDAKKworICAgIGJvYXJkL1tBLVphLWNdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYTU5MzgxNGYyYmUwYzljZGMzMTMzY2Q1NTBiMTY3YjhhOTg4MzI4ZgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjEwOjUwIDIwMDcgLTA1MDAKKworICAgIHJ0Yy86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDY3MzUwNTY4ZjlkNDZlNjZjMjE4MjlmMzUxM2IzZGIwY2FlYjk0OGIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxODowNTozOCAyMDA3IC0wNTAwCisKKyAgICBsaWJfe2FybSxhdnIzMixibGFja2ZpbixnZW5lcmljLGkzODZ9LzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgN2RlZjZiMzRmOTEwZjA4ZDdlZjBhMTQ2NDZkYTA2NzcxOTIzN2NhMgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjAyOjExIDIwMDcgLTA1MDAKKworICAgIGxpYl97bTY4ayxtaWNyb2JsYXplLG1pcHMscHBjfS86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGRkNjBkMTIyM2I5OWE4OGE3MjE2ZjNlMDQxZmU0MDYzNGFkNGMyYmIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxNzo1Njo1MCAyMDA3IC0wNTAwCisKKyAgICBmcy86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGM5MTg5OGJiYzUwNWFmZjNlMTJhODA3YWY4OGU3NmRhMThlZmI3ZWUKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxNzo0NjowOSAyMDA3IC0wNTAwCisKKyAgICB0b29scy86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDY0M2QxYWIyMzk2MDk1MGI1MmUwYTI4MDNjMmQzZWE0YzU1OGZhMDEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxNzo0NToxNCAyMDA3IC0wNTAwCisKKyAgICBuZXQvOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjYjUxYzBiZjg4Zjk1YTFiY2E2ODMyNGIwMTI2ZjhlZWQ4YjQzMjczCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTc6Mzk6NDIgMjAwNyAtMDUwMAorCisgICAgZHJpdmVycy9bbi16XSo6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDA3ZDM4YTE3ZTk2NGFlYzRjNzgyN2YwZWU5YTU4M2JjOGNjMWFkNmIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxNzozMDowMSAyMDA3IC0wNTAwCisKKyAgICBkcml2ZXJzL1thLW1dKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgY2RlNWM2NGQxN2NmNDgzNGFhN2I1YzM3M2YyODhiYzdkYWQyN2IyOQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjIyOjM3IDIwMDcgLTA1MDAKKworICAgIGRpc2svOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2MzkyMjFjNzZjODgyMTViZDU1YWY4M2FkMTc0ZmMzMGQxOTQwZjhmCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTc6MTU6NDkgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworICAgIE1vc3RseSByZW1vdmVkIGZyb20gY29tbWVudHMgaGVyZS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0ZWYyMThmNmZkZjhkNzQ3ZjQ1ODlkYTUyNTJiMDA0ZTdkMmMyODc2CitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglUdWUgSnVsIDEwIDAwOjAxOjI4IDIwMDcgKzAyMDAKKworICAgIENvZGluZyBzdHlsZSBjbGVhbnVwOyB1cGRhdGUgQ0hBTkdFTE9HLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGMzNTE3ZjkxOWQwZjYxNjUwY2YzMDI3ZmQ0ZmFmMGY2MzExNDJmNmMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxODoxMDowOCAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vKiBub24tY21kKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZmQ5YmNhYTM1YmU2NGZlNDFhNDIyM2ZkYjZlY2RiYWQ1MjQ3MGIzOQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE4OjA1OjM5IDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi9jbWRfW3AteF0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYzc2ZmU0NzQyNWFmYzdkNWQ2NzBmZjA1Mzk4MjNjODVkNjVkOWM0MgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE4OjAyOjIzIDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi9jbWRfW2ktbl0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYmFhMjZkYjQxMTM2NzliODA5NzBmZjQ0N2Q5MWNjMTAyMTc3NDJhNgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE3OjUxOjM5IDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi9jbWRfW2FmXSo6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhZjA3NWVlOTZlNTJkZGE3YjZiY2E2YzkzNzU4OGFlYWFlYzVmMmNkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTc6MDI6MDEgMjAwNyAtMDUwMAorCisgICAgQ2xlYXIgdXAgY29uZnVzaW9uIG92ZXIgdGhlIENNRF9QT1NUIGFuZCBQT1NUX0RJQUcgbWVzcy4KKworICAgIEZvciBzb21lIHJlYXNvbiwgQ09ORklHX1BPU1QgcGVybWVhdGVkIGFzIENPTkZJR19DTURfUE9TVF9ESUFHCisgICAgd2hlbiBpdCByZWFsbHkgbWVhbnMganVzdCBDT05GSUdfQ01EX0RJQUcuCVRoZXJlIGlzIG5vIENNRF9QT1NULgorICAgIENsZWFyIHRoaXMgbWVzcyB1cCBzb21lLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGIzNjMxNDg3MTA1YTU3YWI3Y2JhZGZjMjZlZmJhZjk2NzYyNzUwMTgKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNTo0NTowOCAyMDA3IC0wNTAwCisKKyAgICBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgb2xkIGNtZF9jb25mZGVmcy5oIGluY2x1ZGUgZmlsZS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhMjJkNGRhOTVlMjAwNDliNGRhYTFjMmEwMjJmNjFlOGE3MmYyZmI2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTU6NDI6NTkgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBDYXRjaCBzb21lIENPTkZJR19DTURfKiBjb252ZXJzaW9uIHN0cmFnZ2xlcnMuCisKKyAgICBVc2UgbmV3IENPTkZJR19DTURfKiBpbiBsd21vbjUuaCBib2FyZCBjb25maWcgZmlsZS4KKyAgICBGaXggQ09ORklHX0NNRF8qIHR5cG8gYnJhaW5kYW1hZ2UgaW4gb21hcDE1MTBpbm4uaAorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGE1NTYyOTAxNjYxYmQ0MjhmN2U1ZmViMzMzZjc5NjM3MmNiODEwMTkKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNTozMTo1NyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgW1RVVldaWVpdKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZmU3Zjc4MmQ1YjhjNjRhMDE5NWM2OGMzMWEwYTExZDRmNjQxMzU1ZQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE1OjAyOjQ0IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBTKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZTlhMGY4ZjE1YzExZjMzNzk2N2FhMDYwMGFkNmU4YWYzMzAzN2Y1MAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE1OjEyOjQwIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBSKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMTJhYTlmZDIzZDcyNGJkNmFiODhlMWJhYTBkYjM1MTMzYTI3MzAzZgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE0OjU1OjA3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBRKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYWNmMDI2OTc3OTQyMmYzZTE0N2QyZGRmYjQ5OWM5ZjZmZjEwYWQ1ZQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE0OjQ5OjQ0IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBQKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZTE4YTEwNjFhODYzMGNiNjc5OTVmZGY5OWFmZDNmYjUwZDFiMTg3ZAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE0OjIxOjQzIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBbTk9dKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgODM1M2UxMzliZmFkOTA1OWM1NGY1YjI0MjFmMWEzMDkwZTE1YTJlMgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE0OjE0OjE3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBNKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMzQ4ZjI1OGYyNDI1MzQzM2U0YTIzMDJhMGJiY2ViNjc0MGE2NzI0NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDEzOjQ2OjE4IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBbSUpLTF0qIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2YzRmNGRhOWJmYzlmOTQwM2Y1NGZjZTY3OGVkMDM2NGI3Yzg2YTZhCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTA6MDk6MzUgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIEgqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2MGEwODc2YjUxMDZiMzQyMjBlNDU5YzIwOGJiZjY0ODA3MzMwNmMwCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTYXQgSnVsIDcgMjE6MDQ6MjYgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIEYqIGFuZCBHKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGNhYTcxNTYyODI2YTI0NjZlODk0Yzg2OGQxMzI1MDlkY2RhODQ0NAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU2F0IEp1bCA3IDIwOjU2OjA1IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBFKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgM2MzMjI3ZjNjNzM3NTAyMzExYjI1YjcyMDg0NTczOTAxY2JiZjE3ZAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU2F0IEp1bCA3IDIwOjQwOjQzIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBEKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDljZjdlOGVlN2VmOTQzZmRmZTg2NmNlMjg0MTBiMGJmYmY2YTI2YworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVGh1IEp1bCA1IDE5OjUyOjM1IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBDKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGU4YjJhNmUzMzI5OGRjZGIxMGJkZGE0OGRiMjVlNTNjMzA4OWViYQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVGh1IEp1bCA1IDE5OjMyOjA3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBCKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDk4ZmY5YTIyODQ4NWJkNGI5ZjIzZDA2NmJhZGEyNjhmOWFkZDFkZAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVGh1IEp1bCA1IDE5OjEzOjUyIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBBKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaW5jZSBBRFM4NjAuaCBpbmNsdWRlcyAiYm9hcmQvZmFkcy9mYWRzLmgiIHdpdGggcmFtaWZpY2F0aW9ucworICAgIG9uIHRoZSBDT05GSUdfQ09NTUFORCB0cmVhdG1lbnQsIGl0IHRvbyBoYXMgdG8gYmUgYWRqdXN0ZWQgdG8KKyAgICBleGNsdWRlIGFscmVhZHkgY29uZmlndXJlZCBjb21tYW5kcyBpbiB0aGlzIHNhbWUgY29tbWl0LgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDZiMGExNzRhMWU2ZjU1ZTFmNWExZmJiMjIzY2RhZDc2NDVhNDY0NmUKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEp1bCA2IDA5OjQ1OjQ3IDIwMDcgKzAyMDAKKworICAgIEZpeCBwcm9ibGVtIHdpdGggZ2V0L3NldGRjciBjb21tYW5kcyBpbnRyb2R1Y2VkIGJ5IGNmZyBwYXRjaGVzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCBmMTE1MmY4YzI4ZGI0YTIyMDg3YzIxYzYxOGEzZjdiYWE0OGU5YTRmCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglGcmkgSnVsIDYgMDI6NTA6MTkgMjAwNyArMDIwMAorCisgICAgQ29kZSBjbGVhbnVwIGFuZCBkZWZhdWx0IGNvbmZpZyB1cGRhdGUgZm9yIFNUQyBHUDMgU1NBIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGU0ZGJlMWIyMTVmNWM2YzQ2MmU3NjkwOWQyNDBiZDk2NDcyYjg0ZGUKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBKdWwgNSAxNzo1NjoyNyAyMDA3ICswMjAwCisKKyAgICBGaXhpbmcgc29tZSB0eXBvcyBldGMuIGludHJvZHVjZWQgbWFpbmx5IGJ5IGNmZyBwYXRjaGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGI2YjQ2ODQ1NDY4MDlmODljOGJhYzcyODYzY2E0OWI1ZmQ4YWMwY2QKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBKdWwgNSAxMToxMjoxNiAyMDA3ICswMjAwCisKKyAgICBNaW5vciBjb2Rpbmcgc3R5bGUgY2xlYW51cC4gVXBkYXRlIENIQU5HRUxPRy4KKworY29tbWl0IGRjYTNiM2Q2ZDYzOTZiNjdlNWU4NGFmNTM0NTIxNjQ5MjNjNzM0NDMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMzo0NiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgW3Ytel0qIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2YzE4ZWI5ODA0YjUyNWYzZTRmM2JiM2QwMTRkZDY5YTIwMGQ5ZmE3CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzM6MzggMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIHQqIGFuZCB1KiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDZkYTFlOTZiN2RiMTRmNGZjZDJjOTI1NDRlN2MwODYyMDI0YmM3NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjMwIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBzKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTBjYzNlYjZkMmJlODU2ZDlkZGQ4MTQzNmRlOWNmMzQzYmM2YjVjOAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjIzIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBxKiBhbmQgciogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDI2YTM0NTYwZDU2YTlkZjViYzJhZTIzNTI1ZDkyMjk3MzYxMzQ3NTcKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMzoxNyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgcCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGE1Y2IyMzA5MmE3ZDMxNDkwYTMzZDRlYzg3MTQ2OGI2M2JhYmZhM2MKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMzoxMyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgbyogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDkyOWEyYmZkMTQyNzM3MDAzYThmYzMyZTFiODZlMWYyYzE4NTAyNTcKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMzowNyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgbiogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDVkYzExYTUxMTk2MGQ0OTBmN2YwMWZmZDc0NmVkZmU2Mjc3Zjk5YjAKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMzowMSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgbSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDliYmIxYzA4MjBjMWZiZDM4MTFhYjZlZTRiYTBmNmM2Zjc2YjI3ZTQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjo1NyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgbCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGJjMjM0YzEyOWZhMDRmYjlmYTMzNTMwOTMwZTVjYmM2MDg0Y2Q0N2EKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjo1MSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgaiogYW5kIGsqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxZDJjNmJjNDkxOTY5ZjhkOGZiMzRjOGUzMGU4YmVhN2EyYWY5YzMxCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzI6MzIgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIGkqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0OGQ1ZDEwMmEyZjJlNjE5YzkyMDUwYjlhZWRiYjY5Njg5MTg1YmMwCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzI6MjUgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIGgqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3MmViMGVmYWVkNzA0OGFmY2M2MWZjNmYwMDg1YzQ5Mzk0YjVkYzM2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzI6MTkgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIGcqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxYmVjM2QzMDAyZDNiYmJhZTZmMjQ2OGEwZjczNzZkYjExMjBkMzNlCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzI6MTAgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIGUqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhYjk5OWJhMWIzMWViZTc4ZGQxNjM3NDM5NGE1NWQ3YzZlNWFhNmU0CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzI6MDMgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIGQqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzN2U0ZjI0Yjg3ZmEyNTVhZTQ1NmQxOTNiN2NkMjNjMThkZDFkNTZiCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzE6NTYgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIGMqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiYTIzNTFmOWQxZTg0MWJkMDBlYTZkYWQxZTNjMTZkMDI1OWFkMjY0CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzE6NDkgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIGIqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAwYjM2MWM5MTY2MTdhZmY3OWU2NDdiNDBmMGU0MzM2MWUwYmJhY2NmCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzE6NDIgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIGEqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiNzMwY2RhODJlMzYyZGY2YTIyZjRjNTljMGE5Yjk3ZTg4NWIxMDE0CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzE6MzUgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiBtcGM1eHggYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGQ3OTRjZmVmZWFkNWZjMTc3Y2Y0ZjQxMTY0ZTgwMzgyZTljOTQ4NGEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMToxNSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgNTIwMCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZWYwZGY1MmFiNDllZWE0YTMwYzE1MDg3ZmQyN2Q1NGMxZDk0NmYyYworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMxOjA3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gU1R4IGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA4NjZlMzA4OWJmYzgyNmJiNGRjNzQ2MzdmOGFhZDg3YTNiYWI3OWZjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzA6NTggMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiBzYmMqIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAyNjk0NjkwZTI4NWFjYWEzNDkyMmY1NWY0YjVhZTAzMGRhNjBjNTVhCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzA6NTAgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiBUUU0gYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDFjYzRjNDU4MzI5NzY1YjU4ZTU4NGExOTgyMWU3OTZiM2MxMGU5NzYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMDoyOCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIDgyeHggYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDhlYTU0OTlhZmRhYmEwYWNmNjA5MjNkZDk5MDAxYzM5OWQ0YTdjOGUKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMDowNiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIDgzeHggYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGI0NDg5NjIxNWEwOWM2MGZhNDBjYWU5MDZmN2VkMjA3YmJjMmM0OTIKK0F1dGhvcjogU2VyZ2VpIFBvc2VsZW5vdiA8c3Bvc2VsZW5vdkBlbWNyYWZ0LmNvbT4KK0RhdGU6CVRodSBKdWwgNSAwODoxNzozNyAyMDA3ICswMjAwCisKKyAgICBNZXJnZWQgUE9TVCBmcmFtZXdvcmsgd2l0aCB0aGUgY3VycmVudCBUT1QuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTZXJnZWkgUG9zZWxlbm92IDxzcG9zZWxlbm92QGVtY3JhZnQuY29tPgorCitjb21taXQgYjI0NjI5ZmEzNzcyMTRkNjNiYjQwZDEzNjBlMzU0YjZkM2U0YWY1NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1biAxMyAxMzoyMzoxNSAyMDA3IC0wNTAwCisKKyAgICBtcGM4Nnh4OiBSZW1vdmUgb2xkIENGR19DTURfKiByZWZlcmVuY2VzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQ2MTc1ZDk3NjRkYTEyOWJiNGZkMzQxY2QyNTU0ZGM3ZDU1ZjViMmEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdW4gMTMgMTM6MjI6NTQgMjAwNyAtMDUwMAorCisgICAgQWRkIE1QQzg1NjhNRFMgdG8gTUFLRUFMTCA4NXh4IHRhcmdldC4KKworICAgIEl0IHdhcyBtaXNzaW5nIGZyb20gdGhlIG9yaWdpbmFsIHBvcnQgc3VibWlzc2lvbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAyODM1ZTUxOGM5NjllNTEyNGJhMTE3NGVlZjNlODM3NWUxMmZhN2Q1CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVuIDEzIDEzOjIyOjA4IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gODV4eCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNTZiMzA0YWMyMDkxNjg5NTA2MDg4YTlhZTY3ZjYzZmQ2MzAwY2YxNgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1biAxMyAxMzoyMTozNyAyMDA3IC0wNTAwCisKKyAgICBGaXggI2lmIHR5cG8gaW4gQ09ORklHX0NNRF8qIGNoYW5nZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZjc4MGI4MzMxNmQ5YWYxZjYxZDcxY2M4OGIxOTE3YjM4N2I5Yjk5NQorQXV0aG9yOiBOaWtsYXVzIEdpZ2VyIDxuaWtsYXVzZ2lnZXJAZ214LmNoPgorRGF0ZToJV2VkIEp1biAyNyAxODoxMTozOCAyMDA3ICswMjAwCisKKyAgICByZXN1Ym1pdDogcHBjNHh4OiBSZW1vdmUgc2VxdW9pYS9zZXF1aW9hLmguIENsZWFudXAgcHBjNDQwLmggZm9yIFBQQzQ0MEVQWAorCisgICAgU2lnbmVkLW9mZi1ieTogTmlrbGF1cyBHaWdlciA8bmlrbGF1cy5naWdlckBuZXN0YWwuY29tPgorCitjb21taXQgMDRlNmMzOGI3NjZlYWEyZjMyODc1NjE1NjNjOWUyMTVlMGMzYTBkNAorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglXZWQgSnVsIDQgMTA6MDY6MzAgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBVcGRhdGUgbHdtb241IGJvYXJkCisKKyAgICAtIEFkZCBvcHRpb25hbCBFQ0MgZ2VuZXJhdGlvbiByb3V0aW5lIHRvIHByZXNlcnZlIGV4aXN0aW5nCisgICAgICBSQU0gdmFsdWVzLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIExpbnV4IGxvZy1idWZmZXIgc3VwcG9ydAorICAgIC0gQWRkIG9wdGlvbmFsIEREUjIgc2V0dXAgd2l0aCBDTD00CisgICAgLSBHUElPNTAgbm90IHVzZWQgYW55bW9yZQorICAgIC0gTGltZSByZWdpc3RlciBzZXR1cCBhZGRlZAorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgNjgxMGEzNDY3N2RiYzQ0NjMzNGY1ZTQ1MWYxNjgyNDI2ZGQzM2I0OQorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MTc6MjggMjAwNyAtMDYwMAorCisgICAgRml4IE1ha2VmaWxlIHRvIHVzZSAkKE1LQ09ORklHKSBtYWNybyBmb3IgYWxsIGJvYXJkIHBvcnRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA5MGIxYjJkNjliOTM5NmZmMmYwMTE2NWViYzE2YzlhNTk0ZWI1OTI2CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDoxNzoyOCAyMDA3IC0wNjAwCisKKyAgICBGaXggTWFrZWZpbGUgdG8gdXNlICQoTUtDT05GSUcpIG1hY3JvIGZvciBhbGwgYm9hcmQgcG9ydHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDA1NzAwNGY0YTQ4NjM1NTRkNTZjYzU2MjY4YmZhN2M3ZDk3MzhlMjcKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjM0OjQ5IDIwMDcgLTA2MDAKKworICAgIENvcnJlY3QgZml4dXAgcmVsb2NhdGlvbiBmb3IgbXBjODN4eAorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgNWFmNjFiMmY0YjgzOGEwNWY3OWJlMjc0ZjNlNWE2NmVkZDJkOWM5NgorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6NDQgMjAwNyAtMDYwMAorCisgICAgQ29ycmVjdCBmaXh1cCByZWxvY2F0aW9uIGZvciBtcGM4MjYwCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBmM2E1MmZlMDU5MjM5MzVkYjg2OTg1ZGFmOTQzOGUyZjcwYWMzOWFhCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDozOSAyMDA3IC0wNjAwCisKKyAgICBDb3JyZWN0IGZpeHVwIHJlbG9jYXRpb24gZm9yIG1wYzgyNHgKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGE4NWRkMjU0YzA1NzdmY2ExMzYyN2M0NmU5M2ZjMmFkNGM0ZjFmMDAKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjM0OjM0IDIwMDcgLTA2MDAKKworICAgIENvcnJlY3QgZml4dXAgcmVsb2NhdGlvbiBmb3IgbXBjODIyMAorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgNmY3NTc2YjIwZWNmMGQwNDBjM2FjM2IwMzJiNWNiYzg2MGUzOGE5MAorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6MjkgMjAwNyAtMDYwMAorCisgICAgQ29ycmVjdCBmaXh1cCByZWxvY2F0aW9uIGZvciBNUEM1eHh4CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCAzNjQ5Y2Q5OWJhODE1YjY2MDE4Njg3MzU3NjU2MDJmMDBlZjM2OTJiCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDoyNCAyMDA3IC0wNjAwCisKKyAgICBDb3JyZWN0IHJlbG9jYXRpb24gZml4dXAgZm9yIG1wYzV4eAorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgZjgyYjNiNjMwNGI2MjBlZjdlMjhiZmFhMWVhODg3YTJhZDJmYTMyNQorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6MTkgMjAwNyAtMDYwMAorCisgICAgRG9uJ3Qgc2V0IGdkLT5yZWxvY19vZmYgaWYgcmVsb2NhdGlvbiBvZiAuZml4dXAgd29ya3MgY29ycmVjdGx5CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBlMWE2MTQ0YzMyZGM3ZGU3M2JjZGQzMzk5NWRlMDE0OGNiZDBiZDI4CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDoxNCAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjODN4eCBsaW5rZXIgc2NyaXB0cworCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgMTdlMzJmYzM5MDhiZjcwODlkM2YxNmZjODJhMWMzYWU2NzRkZDY1YgorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6MDkgMjAwNyAtMDYwMAorCisgICAgQ29uc29saWRhdGUgbXBjODI2MCBsaW5rZXIgc2NyaXB0cworCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgYWY3ZDM4YjM5MzY5MGQ3ZWVhZjQxOGFjODVhMWU4MzFhNTBkNWZkMAorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6MDQgMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzgyNHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGY5NGEzYWVjZWJjNDBjYTA5MzljN2Q2NmQwMTAwMDljZjUxYmU5ZTIKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjU5IDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM4MjR4IGxpbmtlciBzY3JpcHRzICgzIG9mIDQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBhNzFjMDg0ZjNhYzdmZWRmMTQ0NTM3ZGIyYjJkYTQ3MzIzMDY4ODMzCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzo1MyAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjODI0eCBsaW5rZXIgc2NyaXB0cyAoMiBvZiA0KQorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgZjY3MGExNTQ2OGQxMzY1MjQxZDQwMDIyYjk0MDhlMTAwNDE4MWY1ZQorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzM6NDggMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzgyNHggbGlua2VyIHNjcmlwdHMgKDEgb2YgNCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDA5NTU1YmQ0NWEwNGMwZTU0ZjE3MjUyOGQyMWJjMTg4OTY1NTBkMjgKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjQzIDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM4MjIwIGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA1ZWZiOTkyZjA0NmU1MTIyNWM5M2Q1MmY4MGZlY2JlNDMzYWJkNzg5CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzozOCAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjNXh4eCBsaW5rZXIgc2NyaXB0cyAoMyBvZiAzKQorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgMDdjMTNkZmVmNjViMzE2NDdlNjlkOGI2MWRhYTFlZWM1OThhZGQxYQorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzM6MzMgMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzV4eHggbGlua2VyIHNjcmlwdHMgKDIgb2YgMykKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGI0ZjY3NTEzYTYyNGNlODU4NjZjNjZjNTc1YmQyZDlkNzk3N2Q3ZjAKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjI4IDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM1eHh4IGxpbmtlciBzY3JpcHRzICgxIG9mIDMpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBiN2Q4ZTA1Zjg2NzUyNDliNWYyMDhhYTczYmFiZWVkMzg0YTQ1MTlkCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzoyMyAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjNXh4IGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA0MTZhMGI2ZDQwZjZlYmEzYTJmYzU0NzI1M2MxNmJkYTI4ZDkyMmY3CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzoxOCAyMDA3IC0wNjAwCisKKyAgICBDb25zb2xpZGF0ZSBtcGM4M3h4IGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA1ZmM1OTE3NWI5Mjg4M2VkNWQyNjY2YTA0ZTZiYzQ5ZTcwYTRhMzY1CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzoxMyAyMDA3IC0wNjAwCisKKyAgICBDb25zb2xpZGF0ZSBtcGM4MjYwIGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA3MzdmOWViMDJkNzMzNWRmMmIzZTRkN2E0ZDMzNDg3ODRkMWRhMjA3CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzowOCAyMDA3IC0wNjAwCisKKyAgICBDb25zb2xpZGF0ZSBtcGM4MjR4IGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA5Yzc1N2I3ODlhNTlhODU1ZGI1N2I0NDhkZDgyNTMyOWM0ZTljNGEwCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzowMyAyMDA3IC0wNjAwCisKKyAgICBDb25zb2xpZGF0ZSBtcGM4MjIwIGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBkMTgxYzlhMTVjZDQxODYzZmUyNDg0MGQxNzg0ODQyOWYyN2QzYzhjCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMjo1OCAyMDA3IC0wNjAwCisKKyAgICBDb25zb2xpZGF0ZSBtcGM1eHh4IGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCAyODdhYzkyNGFkYjcyOTFiZWJlNTA4NjY1MmEzNjJhMzBhYjI4YjEzCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMjo1MyAyMDA3IC0wNjAwCisKKyAgICBDb25zb2xpZGF0ZSBtcGM1eHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDUyYjg3MDRkMDI0NWU1ODlmODZkNDYyZTllYzI1YWViN2VjYmJiZGQKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVdlZCBKdWwgNCAwMDo0Mzo1MyAyMDA3ICswMjAwCisKKyAgICBGaXggYSBmZXcgZmlsZSBwZXJtaXNzaW9uIHByb2JsZW1zLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDc4ZTBjZjJkZTdiZTdmMWVhZWViNjIyZWI2MWZkNTBlNGQ1ZTIwNWMKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVdlZCBKdWwgNCAwMDozODozOCAyMDA3ICswMjAwCisKKyAgICBNaW5vciBjb2Rpbmcgc3R5bGUgY2xlYW51cC4gUmVidWlsZCBDSEFOR0VMT0cgZmlsZS4KKworY29tbWl0IDJmOWMxOWU0OTZhY2I2YmI1MGQ5Mjk5ZTFhYWIzNzc2MjVkNDhjMzgKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6NDQgMjAwNyAtMDUwMAorCisgICAgY29uZmlncy8gbXBjODZ4eDogUmV3cml0ZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB1c2luZyBuZXcgQ09ORklHX0NNRC0qIHN0eWxlLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDYwMmFkM2IzM2Q5Y2VlZjgzZGJhYjQ2YmU2ODY0NmQ2NDVkNjM3ZWUKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6MzkgMjAwNyAtMDUwMAorCisgICAgUkVBRE1FOiBSZXdyaXRlIGNvbW1hbmQgbGluZSBjb25maWcgdG8gdXNlIENPTkZJR19DTURfKiBuYW1lcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3MmEwNzRjZWM2OGU1YmFkNjBkNjMyMDZjMDUwOTc0ZTA4YWZkODA0CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAzOjM0IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvIG5vbi1jb25maWc6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNWZjZjU0M2UwYjY2MjhjNzZmZjQ4NzA1YjFiMDU2NmJmZDExNTA3YgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzoyOCAyMDA3IC0wNTAwCisKKyAgICB0b29scy8gOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDkxMDdlYmUwZDM1MjQyMDg5NWFiNjliNzE1Njk3YmRlYmM4Y2FmNTAKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6MjMgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW2stel0qOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDVlMzc4MDAzZDU5MmVhODI4ZWM2OWQ2ZGVmY2Q0ZGU3OTA5NmRkNWMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6MTkgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW01hLWldKjogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3MzcxODQxMTRlYzljOWUwYWI5NGQ2NzEzNTM2MTI2MDczYmQyNDcyCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAzOjE1IDIwMDcgLTA1MDAKKworICAgIGNwdS8gbm9uLW1wYyo6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZjQ4MDcwZmU1ZmU0NDBkZmI1ZWU1MjY4YzkyMGRlNzBlNDhlYTMyNworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzowOCAyMDA3IC0wNTAwCisKKyAgICBjcHUvbXBjKi8gOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDBjNTA1ZGIwYTBkYzFmNjcwYjEzY2UzYjRkM2ZiZjFlYzViM2NiZDIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6MDMgMjAwNyAtMDUwMAorCisgICAgbGliXyovOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDczZjAzMjAyMWVjNWYxM2NkYThmYWE0ZTM0YjZkZTgwOTYwZWI4NmYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDI6NTggMjAwNyAtMDUwMAorCisgICAgbGliX3BwYy86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOThiNzkwMDNjMjFjMjU3ODIwNjAwMzI1NmRlNGU3ODFkNmIzNmNhOAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjo1MyAyMDA3IC0wNTAwCisKKyAgICBydGMvOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDZlMjExNWFjYjZhODkyZDUzYTY4ODFiZjI1M2FlNDFkM2RmMzkxNTYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDI6NDkgMjAwNyAtMDUwMAorCisgICAgbmV0LzogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0NWNkYjliNzJjOTQ2NTVjNzMwOGI0NjRhMjY2NjA1N2MwYjI4NmUwCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAyOjM0IDIwMDcgLTA1MDAKKworICAgIGRpc2svOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDRlMTA5YWU5ODI5NGE1Y2E3ZmY4NDhiNzY1MmM3YmZkNDAyM2E5NGEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDI6MjAgMjAwNyAtMDUwMAorCisgICAgZnMvOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGQ1YmU0M2RlOTNmZjkwNWM0NjVlNTA5ZDQ1YTMxNjRlZjQ4ZDI2ZTcKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDI6MTAgMjAwNyAtMDUwMAorCisgICAgZHJpdmVycy86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYjQ1Mzk2MGQ0ZmRiODdiMzk3MGQ5NjExOWI5MGRmMmVkMDI0ZmM0YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjowNSAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vIG5vbi1jbWQ6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjVjNDUwYjQ3YTYyNjU5ZDUyMmNmYThmNGZhMWU0ZTVjNjBkY2NkMAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMTo1NCAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vY21kX1tpLXpdKiA6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYTc2YWRjODE0MmMxZDk1NjM4NWExMDllMGI3MGY5MzE5ZWRlNGQ2NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMTo0MyAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vY21kX1thLWZdKiA6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZWM2M2IxMGI2MWZkNjgyMzhkNGMxNWMxY2QwNGMwYjM4MjI4ZTJjMQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMTozNCAyMDA3IC0wNTAwCisKKyAgICBJbnRyb2R1Y2UgaW5pdGlhbCB2ZXJzaW9ucyBvZiBuZXcgQ29tbWFuZCBDb25maWcgZmlsZXMuCisKKyAgICBEZXJpdmUgdGhyZWUgbmV3IGZpbGVzIGZyb20gY21kX2NvbmZkZWZzLmg6CisJY29uZmlnX2Jvb3RwLmggLSBIYXMgQk9PVFAgcmVsYXRlZCBjb25maWcgb3B0aW9ucywgbm90IGNvbW1hbmRzCisJY29uZmlnX2NtZF9hbGwuaCAtIEhhcyBhIENPTkZJR19DTURfKiBkZWZpbml0aW9uIGZvciBldmVyeSBjb21tYW5kCisJY29uZmlnX2NtZF9kZWZhdWx0LmggLSBIYXMgYSBDT05GSUdfQ01EXyogZGVmaW5pdGlvbiBmb3IgZGVmYXVsdCBjbWRzLgorCisgICAgRm9yIG5vdywgaW5jbHVkZSAiY29uZmlnX2Jvb3RwLmgiIGZvciBjb21wYXRhYmlsaXR5IHVudGlsIGFsbAorICAgIHVzZXJzIG9mIGl0IGRpcmVjdGx5IGluY2x1ZGUgaXQgcHJvcGVybHkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMWYyYTA1ODk4NjU4OTAwZGM1NzE3NzYxZTI3YWJmMjA1MmU2N2UxMworQXV0aG9yOiBNdXNodGFxIEtoYW4gPG11c2h0YXFrXzkyMUB5YWhvby5jby5pbj4KK0RhdGU6CVNhdCBKdW4gMzAgMTg6NTA6NDggMjAwNyArMDIwMAorCisgICAgRml4IFMtQVRBIHN1cHBvcnQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBtdXNodGFxIGtoYW4gPG11c2h0YXFrXzkyMUB5YWhvby5jby5pbj4KKworY29tbWl0IGE1ZDcxZTI5MGYzNjczMjY5YmU4ZWVmYjRlYzQ0ZjUzNDEyZjk0NjEKK0F1dGhvcjogSGVpa28gU2Nob2NoZXIgPGhzQHBvbGx1eC5kZW54LmRlPgorRGF0ZToJTW9uIEp1biAyNSAxOToxMTozNyAyMDA3ICswMjAwCisKKyAgICBbUENTNDQwRVBdCWdldCByaWQgb2YgQ09ORklHX1BQQzR4eF9VU0VfU1BEX0REUl9JTklUX0hBTkcKKworICAgIFNpZ25lZC1vZmYtYnk6IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorCitjb21taXQgYTFiZDYyMDBlY2NkM2EwMjA0MGE5NTVkNWY0M2QzZWUxZmM5ZjkzYgorQXV0aG9yOiBOaWtsYXVzIEdpZ2VyIDxuaWtsYXVzLmdpZ2VyQG5lc3RhbC5jb20+CitEYXRlOglNb24gSnVuIDI1IDE3OjAzOjEzIDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogUFBDNDQwRVB4IEVtaXQgRERSMCByZWdpc3RlcnMgb24gbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQKKworICAgIFRoaXMgcGF0Y2ggcHJpbnRzIHRoZSBERFIgc3RhdHVzIHJlZ2lzdGVycyB1cG9uIG1hY2hpbmUgY2hlY2sKKyAgICBpbnRlcnJ1cHQgb24gdGhlIDQ0MEVQeC9HUnguIFRoaXMgY2FuIGJlIHVzZWZ1bCBlc3BlY2lhbGx5IHdoZW4KKyAgICBFQ0Mgc3VwcG9ydCBpcyBlbmFibGVkLgorCisgICAgSSBhZGRlZCBzb21lIHNtYWxsIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIHBhdGNoIGZyb20gTmlrbGF1cyB0bworICAgIG1ha2UgaXQgY29tcGlsZSBjbGVhbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IE5pa2xhdXMgR2lnZXIgPG5pa2xhdXMuZ2lnZXJAbmVzdGFsLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCA4MDcwMThmYjdmYWNlYjQyOWNlMGNiNDdiYWEyMDczNzQ2YjMzYTRlCitBdXRob3I6IE5pa2xhdXMgR2lnZXIgPG5pa2xhdXMuZ2lnZXJAbmVzdGFsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMjUgMTY6NTA6NTUgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBGaXggTz1idWlsZGlyIGJ1aWxkcworCisgICAgVGhpcyBwYXRjaCBmaXhlcyB0aGUgcHJvYmxlbSB0byBhc3NlbWJsZSBjcHUvcHBjNHh4L3N0YXJ0LlMKKyAgICBleHBlcmllbmNlZCBsYXN0IHdlZWsgd2hlcmUgYnVpbGRpbmcgZmFpbGVkIGhhdmluZyBzcGVjaWZpZWQKKyAgICBPPS4uL2J1aWxkLnNlcXVvaWEuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBOaWtsYXVzIEdpZ2VyIDxuaWtsYXVzLmdpZ2VyQG5lc3RhbC5jb20+CisKK2NvbW1pdCA0NjZmZmYxYTdiYjVmZTc2NGEwNjQ1MDYyNmY2MDk4MjE5ZjQ0NmI4CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CU1vbiBKdW4gMjUgMTU6NTc6MzkgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBBZGQgcGNpX3ByZV9pbml0KCkgZm9yIDQwNSBib2FyZHMKKworICAgIFRoaXMgcGF0Y2ggcmVtb3ZlcyB0aGUgQ0ZHX1BDSV9QUkVfSU5JVCBvcHRpb24gY29tcGxldGVseSwgc2luY2UKKyAgICBpdCdzIG5vdCBuZWVkZWQgYW55bW9yZSB3aXRoIHRoZSBwYXRjaCBmcm9tIE1hdHRoaWFzIEZ1Y2hzIHdpdGgKKyAgICB0aGUgIndlYWsiIHBjaV9wcmVfaW5pdCgpIGltcGxlbWVudGF0aW9uLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgNmYzNWM1MzE2NjIxM2MyNGE1YTBlMjM5MGVkODYxMTM2ZmY3Mzg3MAorQXV0aG9yOiBNYXR0aGlhcyBGdWNocyA8bWF0dGhpYXMuZnVjaHNAZXNkLWVsZWN0cm9uaWNzLmNvbT4KK0RhdGU6CVN1biBKdW4gMjQgMTc6NDE6MjEgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBNYWludGVuYW5jZSBwYXRjaCBmb3IgZXNkJ3MgQ1BDSTQwNSBkZXJpdmF0cworCisgICAgLWFkZCBwY2lfcHJlX2luaXQoKSBmb3IgcGNpIGludGVycnVwdCBmaXh1cCBjb2RlCisgICAgLWRpc2FibGUgcGh5IHNsZWVwIG1vZGUgdmlhIHJlc2V0X3BoeSgpIGZ1bmN0aW9uCisgICAgLXVzZSBjb3JyZWN0IGlvIGFjY2Vzc29ycworICAgIC1jbGVhbnVwCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBNYXR0aGlhcyBGdWNocyA8bWF0dGhpYXMuZnVjaHNAZXNkLWVsZWN0cm9uaWNzLmNvbT4KKworY29tbWl0IDVhMWM5ZmYwYzQ0MzA1YjU3Y2I0ZDhmOTM2OWJiYTkwYmNmMGUxZjgKK0F1dGhvcjogTWF0dGhpYXMgRnVjaHMgPG1hdHRoaWFzLmZ1Y2hzQGVzZC1lbGVjdHJvbmljcy5jb20+CitEYXRlOglTdW4gSnVuIDI0IDE3OjIzOjQxIDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogQWRkIHBjaV9wcmVfaW5pdCgpIGZvciA0MDUgYm9hcmRzCisKKyAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgY2FsbGluZyBhIHBsYXR0Zm9ybSBkZXBlbmRhbnQKKyAgICBwY2lfcHJlX2luaXQoKSBmdW5jdGlvbiBmb3IgNDA1IGJvYXJkcy4gVGhpcyBjYW4gYmUgdXNlZCB0bworICAgIG1vdmUgdGhlIGN1cnJlbnQgcGNpXzQwNWdwX2ZpeHVwX2lycSgpIGZ1bmN0aW9uIGludG8gdGhlCisgICAgYm9hcmQgY29kZS4KKworICAgIFRoaXMgcGF0Y2ggYWxzbyBtYWtlcyB0aGUgQ0ZHX1BDSV9QUkVfSU5JVCBkZWZpbmUgb2Jzb2xldGUuCisgICAgQSBkZWZhdWx0IGZ1bmN0aW9uIHdpdGggJ3dlYWsnIGF0dHJpYnV0ZSBpcyB1c2VkIHdoZW4KKyAgICBhIGJvYXJkIHNwZWNpZmljIHBjaV9wcmVfaW5pdCgpIGlzIG5vdCBpbXBsZW1lbnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IE1hdHRoaWFzIEZ1Y2hzIDxtYXR0aGlhcy5mdWNoc0Blc2QtZWxlY3Ryb25pY3MuY29tPgorCitjb21taXQgMTYzNmQxYzg1MjljMDA2ZDEwNjI4N2NmYmMyMGNkMGEyNDZmZTFjYgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJRnJpIEp1biAyMiAyMzo1OTowMCAyMDA3ICswMjAwCisKKyAgICBDb2Rpbmcgc3R5bGtlIGNsZWFudXA7IHJlYnVpbGQgQ0hBTkdFTE9HCisKIGNvbW1pdCAyZGM2NDQ1MWI0YzA4ZmZkNjE5MzcyYWJmZGMyNTA2YTJlMjM2M2I5CiBBdXRob3I6IElnb3IgTGlzaXRzaW4gPGlnb3JAZW1jcmFmdC5jb20+CiBEYXRlOglXZWQgQXByIDE4IDE0OjU1OjE5IDIwMDcgKzA0MDAKQEAgLTIyLDYgKzMxMTQsMzQgQEAKICAgICBTaWduZWQtb2ZmLWJ5OiBJZ29yIExpc2l0c2luIDxpZ29yQGVtY3JhZnQuY29tPgogICAgIC0tCiAKK2NvbW1pdCA1NjZhNDk0ZjU5MmFlM2IzYzA3ODVkOTBkNGUxYmE0NTU3NDg4MGM0CitBdXRob3I6IEhlaWtvIFNjaG9jaGVyIDxoc0Bwb2xsdXguZGVueC5kZT4KK0RhdGU6CUZyaSBKdW4gMjIgMTk6MTE6NTQgMjAwNyArMDIwMAorCisgICAgW1BDUzQ0MEVQXQkgICAgdXBncmFkZSB0aGUgUENTNDQwRVAgYm9hcmQ6CisJCSAgICAtIFNob3cgb24gdGhlIFN0YXR1cyBMRURzLCBzb21lIFN0YXRlcyBvZiB0aGUgYm9hcmQuCisJCSAgICAtIEdldCB0aGUgTUFDIGFkZHJlc3NlcyBmcm9tIHRoZSBFRVByb20KKwkJICAgIC0gdXNlIFBSRUJPT1QKKwkJICAgIC0gdXNlIHRoZSBDRiBvbiB0aGUgYm9hcmQuCisJCSAgICAtIGNoZWNrIHRoZSBVLUJvb3QgaW1hZ2UgaW4gdGhlIEZsYXNoIHdpdGggYSBTSEExCisJCSAgICAgIGNoZWNrc3VtLgorCQkgICAgLSB1c2UgZHluYW1pYyBUTEIgZW50cmllcyBnZW5lcmF0aW9uIGZvciB0aGUgU0RSQU0KKworICAgIFNpZ25lZC1vZmYtYnk6IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorCitjb21taXQgM2ExZjVjODFiMGI5NTU3ODE3YTc4OWJlY2U4Mzk5MDU1ODFjMjIwNQorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglGcmkgSnVuIDIyIDE2OjU4OjQwIDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogRml4IHByb2JsZW0gd2l0aCBleHRlbmRlZCBwcm9ncmFtX3RsYigpIGZ1bnRpb24KKworICAgIFRoZSByZWNlbnRseSBleHRlbmRlZCBwcm9ncmFtX3RsYigpIGZ1bmN0aW9uIGhhZCBhIHByb2JsZW0gd2hlbgorICAgIG11bHRpcGxlIFRMQidzIGhhZCB0byBiZSBzZXR1cCAoZm9yIGV4YW1wbGUgd2l0aCA1MTJNQiBvZiBTRFJBTSkuIFRoZQorICAgIHZpcnR1YWwgYWRkcmVzcyB3YXMgbm90IGluY3JlbWVudGVkLiBUaGlzIHBhdGNoIGZpeGVzIHRoaXMgaXNzdWUKKyAgICBhbmQgaXMgdGVzdGVkIG9uIEthdG1haSB3aXRoIDUxMk1CIFNEUkFNLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCiBjb21taXQgMDIwMzJlOGYxNDc1MWExYTc1MWIwOTI0MGE0ZjFjZjlmOGEyMDc3ZgogQXV0aG9yOiBSYWZhbCBKYXdvcm93c2tpIDxyYWpAc2VtaWhhbGYuY29tPgogRGF0ZToJRnJpIEp1biAyMiAxNDo1ODowNCAyMDA3ICswMjAwCkBAIC0xNjEsNiArMzI4MSwxNCBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogRGV0bGV2IFp1bmRlbCA8ZHp1QGRlbnguZGU+CiAKK2NvbW1pdCA5Yjc0NjRhMmM4ODYxNGUxMDYxZjUwOWM0ODkzMGEzZDI0MGQxYTM1CitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVuIDExIDE1OjE0OjI0IDIwMDcgKzAyMDAKKworICAgIFVTQjogVGhpcyBwYXRjaCBmaXggcmVhZGwgaW4gb2hjaSBzd2FwIHJlZyBhY2Nlc3MuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorCiBjb21taXQgOGY4NDE2ZmFkYTlmYWY5NGI5YTkyZjIxZmU2MDAwNjQzY2I1MjFkNQogQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgogRGF0ZToJRnJpIEp1biA4IDE0OjUyOjIyIDIwMDcgKzAyMDAKQEAgLTE4OCw2ICszMzE2LDI2IEBACiAgICAgU2lnbmVkLW9mZi1ieTogQmVub2l0IE1vbmluIDxibW9uaW5AYWRlbmVvLmV1PgogICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KIAorY29tbWl0IGY1MzllZGMwNzZjZmU1MmJmZjkxOWRkNTEyYmE4ZDdhZjBlMjIwOTIKK0F1dGhvcjogVmFkaW0gQmVuZGVidXJ5IDx2YmVuZGViQGdvb2dsZS5jb20+CitEYXRlOglUaHUgTWF5IDI0IDE1OjUyOjI1IDIwMDcgLTA3MDAKKworICAgIGNvc21ldGljIGNoYW5nZXMgdG8gYmNtNTcweCBkcml2ZXIKKworICAgIFRoaXMgaXMgYSBjb3NtZXRpYyBvbmx5IGNoYW5nZXMgc3VibWlzc2lvbi4KKyAgICBJdCBhZmZlY3RzIGZpbGVzIHJlbGV2YW50IHRvIGJjbTU3MHggZHJpdmVyLgorICAgIHRoZSBjb21tYW5kcyB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgY2hhbmdlIHdhcworCisgICAgY2QgZHJpdmVycworICAgIExpbmRlbnQgLXBjcyAtbDgwICBiY201NzB4LmMgICBiY201NzB4X2xtLmggICBiY201NzB4X21tLmgJdGlnb24zLmMgIHRpZ29uMy5oCisKKyAgICBUaGUgQk1XIHRhcmdldCAodGhlIG9ubHkgb25lIHVzaW5nIHRoaXMgY2hpcCBzbyBmYXIpIGJ1aWxkcyBjbGVhbmx5LCB0aGUKKyAgICBgYmVmb3JlIGFuZCBhZnRlcicgZ2VuZXJhdGVkIG9iamVjdCBmaWxlcyBmb3IgZHJpdmVycy9iY201NzB4LmMgYW5kCisgICAgZHJpdmVycy90aWdvbjMubyBhcmUgaWRlbnRpY2FsIGFzIHJlcG9ydGVkIGJ5IG9iamR1bXAgLWQKKworICAgIFNpZ25lZC1vZmYtYnk6IFZhZGltIEJlbmRlYnVyeSA8dmJlbmRlYkBnb29nbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEJlbiBXYXJyZW4gPGJ3YXJyZW5AcXN0cmVhbXMuY29tPgorCiBjb21taXQgNzI1NjcxY2NkMmNkMDRjOWViYzUwYzllNWE5NGRkOGNiYWRlNjZiNwogQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgogRGF0ZToJV2VkIEp1biA2IDE2OjI2OjU2IDIwMDcgKzAyMDAKQEAgLTE5Niw2ICszMzQ0LDMwIEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgogCitjb21taXQgMTlkNzYzYzM1ZTBiNTU2OGVhZjBiOGFkYmY3YTY4Y2NmZTdmYTI0MworQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJV2VkIEp1biA2IDExOjQ5OjQ0IDIwMDcgKzAyMDAKKworICAgIFRSQUIsIFVTQjogdXBkYXRlIHRyYWIgYm9hcmQgY29uZmlndXJhdGlvbiBmb3IgdXNlIG9mIGdlbmVyaWMgb2hjaSBkcml2ZXIKKworY29tbWl0IGRhY2U0NWFjZDFjMTM1N2RhYTkzMjIwOTlkMDdjOWE5ZTA4YjAwMjQKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CVdlZCBKdW4gNiAxMTo0OTo0MyAyMDA3ICswMjAwCisKKyAgICBVU0I6IG9oY2kgZml4ZXMgYW5kIGNsZWFudXAgZm9yIHBwYzR4eCBhbmQgeW9zZW1pdGUgYm9hcmQuCisKK2NvbW1pdCA3MjY1NzU3MGI2MTYzNWM3NGZhMGMzZjBlOWU3ZDA2NzFhOWQwOGRmCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglXZWQgSnVuIDYgMTE6NDk6NDMgMjAwNyArMDIwMAorCisgICAgVVNCOiBvaGNpIGZpeGVzIGFuZCBjbGVhbnVwIGZvciBtcGM1eHh4IGFuZCBJY2VDdWJlIGJvYXJkIGNvbmZpZworCitjb21taXQgZmM0M2JlNDc4ZjJhYTM3Y2UzOGFjZDg1MzU1MDM4ODY2ZTQxNjJhZgorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJV2VkIEp1biA2IDExOjQ5OjM1IDIwMDcgKzAyMDAKKworICAgIFVTQi9PSENJOiBlbmRpYW5uZXNzIGNsZWFudXAgaW4gdGhlIGdlbmVyaWMgb2hjaSBkcml2ZXIKKwogY29tbWl0IGM0NDBiZmU2ZDZkOTJkNjY0NzhhN2U4NDQwMmIzMWY0ODQxMzYxN2IKIEF1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogRGF0ZToJV2VkIEp1biA2IDExOjQyOjEzIDIwMDcgKzAyMDAKQEAgLTIxNiw2ICszMzg4LDczIEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiAKK2NvbW1pdCAxODEzNTEyNWY5MDk5NDhiODVkMWQ2ODgxYWI0YWMwZWZiNGExYzU4CitBdXRob3I6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorRGF0ZToJV2VkIEp1biA2IDEwOjA4OjE0IDIwMDcgKzAyMDAKKworICAgIEZpbGVzIGluY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3tiaWcsbGl0dGxlfV9lbmRpYW4uaCBkZWZpbmUKKyAgICBfX0JJR19FTkRJQU4gYW5kIF9fTElUVExFX0VORElBTi4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorCitjb21taXQgYTgxZDFjMGI4NWIxM2U5ZDQ1ZjJkODdkZTk2YTUxYTZlMGVmMGY4MgorQXV0aG9yOiBaaGFuZyBXZWkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1biA2IDEwOjA4OjE0IDIwMDcgKzAyMDAKKworICAgIEFkZCBVU0IgUENJLU9IQ0ksIFVTQiBrZXlib2FyZCBhbmQgZXZlbnQgcG9sbCBzdXBwb3J0IHRvIHRoZQorICAgIE1QQzg2NDFIUENOIGJvYXJkIGNvbmZpZyBmaWxlLgorCisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDRkYWUxNGNlOGZiZGYzODAwMTdkYzU0ZjE3MjIxOGU3ZDJhY2M4ODkKK0F1dGhvcjogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdW4gNiAxMDowODoxNCAyMDA3ICswMjAwCisKKyAgICBVU0IgUENJLU9IQ0ksIGludGVycnVwdCBwaXBlIGFuZCB1c2IgZXZlbnQgcG9sbCBzdXBwb3J0CisKKyAgICBUaGlzIHBhdGNoIGFkZGVkIFVTQiBQQ0ktT0hDSSBjaGlwcyBzdXBwb3J0LCBpbnRlcnJ1cHQgcGlwZSBzdXBwb3J0CisgICAgYW5kIHVzYiBldmVudCBwb2xsIHN1cHBvcnQuIEZvciBzdXBwb3J0aW5nIHRoZSBVU0IgaW50ZXJydXB0IHBpcGUsIHRoZQorICAgIGdsb2JlIHVyYl9wcml2IGlzIG1vdmVkIHRvIHB1cmIgaW4gZWQgc3RydWN0LiBOb3csIHdlIGNhbiBwcm9jZXNzCisgICAgc2V2ZXJhbCB1cmJzIGF0IG9uZSB0aW1lLiBUaGUgaW50ZXJydXB0IHBpcGUgc3VwcG9ydCBjb2RlcyBhcmUgcG9ydGVkCisgICAgZnJvbSBMaW51eCBrZXJuZWwgMi40LgorCisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGZkY2ZhYTFiMDIyNjhiMjg5OWUzNzRiMzVhZGY5MzZjOTExYTQ3ZWIKK0F1dGhvcjogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdW4gNiAxMDowODoxMyAyMDA3ICswMjAwCisKKyAgICBVU0IgZXZlbnQgcG9sbCBzdXBwb3J0CisKKyAgICBUaGlzIHBhdGNoIGFkZHMgVVNCIGV2ZW50IHBvbGwgc3VwcG9ydCwgd2hpY2ggY291bGQgYmUgdXNlZCBpbiB1c2JrYmQKKyAgICBhbmQgb3RoZXIgdXNiIGRldmljZXMgZHJpdmVyIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHQKKyAgICBwcm9jZXNzaW5nIGlzIHN1cHBvcnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20KKworY29tbWl0IDlhMWQwMGZhNDdjMWUwNWUzZmRiNjBiMzMyMTNhZjRlMThkNGMxOGUKK0F1dGhvcjogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CitEYXRlOglXZWQgSnVuIDYgMTA6MDg6MTIgMjAwNyArMDIwMAorCisgICAgSVNQMTE2eDogZGVsYXkgZm9yIGNyYXBweSBVU0Iga2V5cworCisgICAgVXNpbmcgc29tZSAodmVyeSkgc2xvdyBVU0Iga2V5cyBjYXVzZSB0aGUgVVNCIGhvc3QgY29udHJvbGxlciBidWZmZXJzCisgICAgYXJlIG5vdCByZWFkeSB0byBiZSByZWFkIGJ5IHRoZSBDUFUgc28gd2UgbmVlZCBhbiBleHRyYSBkZWxheSBiZWZvcmUKKyAgICByZWFkaW5nIHRoZSBVU0Igc3RvcmFnZSBkYXRhLgorCisgICAgU2lnbmVkLW9mZi1ieTogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisKK2NvbW1pdCAwOTQ0NDE0MzY3MGM5YzIyNDNjYjdhYmE5ZjcwYjM3MTNkMzNiZWQxCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglXZWQgSnVuIDYgMTA6MDg6MTIgMjAwNyArMDIwMAorCisgICAgQ2hhbmdlIGR1cGxpY2F0ZSB1c2JfY3B1X2luaXRfZmFpbCB0byB1c2JfYm9hcmRfaW5pdF9mYWlsCisKKyAgICBUaGFua3MgdG8gTGlldyBUc2kgQ2h1bmcgPFRzaS1jaHVuZy5MaWV3QGZyZWVzY2FsZS5jb20+IGZvciBwb2ludGluZworICAgIHRoaXMgb3V0LgorCisgICAgU2lnbmVkLW9mZi1ieTogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KKwogY29tbWl0IDMyOTIyY2RjNDcwZmRmZDM5YmVhMGMxYzRmNTgyZDNmYjM0MDQyMWUKIEF1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KIERhdGU6CVR1ZSBKdW4gNSAxMjozMDo1MiAyMDA3IC0wNTAwCkBAIC0yNDcsNiArMzQ4NiwzNSBAQAogICAgIFNpZ25lZC1vZmYtYnk6IEJlbm9pdCBNb25pbiA8Ym1vbmluQGFkZW5lby5ldT4KICAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiAKK2NvbW1pdCA1YjEzMTNmYjI3NThmZmNlOGI2MjQ0NTdmNzc3ZDhjYzY3MDk2MDhkCitBdXRob3I6IE5pa2l0YSBWLiBZb3VzaGNoZW5rbyA8eW91c2hAZGViaWFuLm9yZz4KK0RhdGU6CVdlZCBNYXkgMjMgMTI6NDU6MTkgMjAwNyArMDQwMAorCisgICAgZml4IGNvbXBpbGF0aW9uIHByb2JsZW0gZm9yIG1wYzgzNDlpdHggQ0ZHX1JBTUJPT1QKKworICAgIEN1cnJlbnQgaW5jbHVkZS9jb25maWdzL01QQzgzNDlJVFguaCBkb2VzIGNvbnRhaW4gc29tZSBzdXBwb3J0IGZvciBidWlsZGluZworICAgIGltYWdlIHRoYXQgd2lsbCBiZSBzdGFydGVkIGZyb20gbWVtb3J5ICh3aXRob3V0IHB1dHRpbmcgaW4gaW50byBmbGFzaCkuCisgICAgSXQgY291bGQgYmUgdHJpZ2dlcmVkIGJ5IGJ1aWxkaW5nIHdpdGggVEVYVF9CQVNFIHNldCB0byBhIGxvdyB2YWx1ZS4KKworICAgIEhvd2V2ZXIsIHRoaXMgc3VwcG9ydCBpcyBpbmNvbXBsZXRlOiB1c2luZyBvZiBsb3cgVEVYVF9CQVNFIGNhdXNlcworICAgIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gbWFjcm9zIGluIGluY29uc2lzdGVudCB3YXksIHdoaWNoIGxhdGVyIGxlYWRzCisgICAgdG8gY29tcGlsYXRpb24gZXJyb3JzLiBJbiBwYXJ0aWN1bGFyLiBmbGFzaCBzdXBwb3J0IGlzIGJlaW5nIGRpc2FibGVkLAorICAgIGJ1dCB0aGVuIGZsYXNoIHN0cnVjdHVyZXMgZ2V0IHJlZmVyZW5jZWQuCisKKyAgICBUaGlzIHBhdGNoIGZpeGVzIHRoaXMsIG1ha2luZyBpdCBwb3NzaWJsZSB0byBidWlsZCB3aXRoIGxvdyBURVhUX0JBU0UuCisKKyAgICBTaWduZWQtT2ZmLUJ5OiBOaWtpdGEgWW91c2hjaGVua28gPHlvdXNoQGRlYmlhbi5vcmc+CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOGEzNjRmMDk3MGRlNDk5NDlkNjM1ZTYwYWNjZjQ2M2M2NDQzZWY4YworQXV0aG9yOiBOaWtpdGEgVi4gWW91c2hjaGVua28gPHlvdXNoQGRlYmlhbi5vcmc+CitEYXRlOglXZWQgTWF5IDIzIDEyOjQ1OjI1IDIwMDcgKzA0MDAKKworICAgIGFkZCBtaXNzaW5nICdjb25zb2xlJyB2YXIgdG8gZGVmYXVsdCBtcGM4MzQ5aXR4IGNvbmZpZworCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKwogY29tbWl0IDE4ZDE1NmViMzdjOTBmYWRjOGVjN2E4MWEzYjg5MTc2MTYxZjg1YjcKIEF1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogRGF0ZToJRnJpIEp1biAxIDE2OjE4OjE3IDIwMDcgKzAyMDAKQEAgLTUyNiw2ICszNzk0LDE0IEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiAKK2NvbW1pdCA4MjJkNTUzNjViYjU1N2UwODRkMGUzMzYyNWE2ZGVkY2M4NjYxMTBiCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgTWF5IDIzIDE0OjA5OjQ2IDIwMDcgLTA1MDAKKworICAgIEFkZCBMSVNUXzg2eHggTUFLRUFMTCB0YXJnZXQgZm9yIFBvd2VyUEMgYnVpbGRzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKwogY29tbWl0IDlmMDA3N2FiZDY5ZjdhN2M3NTZhOTE1Yjk2MTAzNzMwMmJlM2U2ZjIKIEF1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogRGF0ZToJVHVlIE1heSAyMiAxMjo0ODowOSAyMDA3ICswMjAwCkBAIC01NzQsNiArMzg1MCwxNyBAQAogCiAgICAgTWFrZWZpbGUgcGVybWlzc2lvbnMKIAorY29tbWl0IDI1NWEzNTc3Yzg0ODcwNjQ0MWRhZWUwMTc0NTQzZWZlMjA1YTc3ZjgKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBNYXkgMTYgMTY6NTI6MTkgMjAwNyAtMDUwMAorCisgICAgUmVkdWNlIENPTkZJR19NUEM4WVhYX1RTRUN4IHRvIENPTkZJR19UU0VDeAorCisgICAgRm9yIGFsbCBwcmFjdGljYWwgdS1ib290IHB1cnBvc2VzLCBUU0VDcyBkb24ndCBkaWZmZXIgdGhyb3VnaG91dCB0aGUKKyAgICBtcGM4WzM1Nl14eCBmYW1pbGllczsgcmVkdWNlIENPTkZJR19NUEM4WVhYX1RTRUN4IHRvIENPTkZJR19UU0VDeC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKIGNvbW1pdCA3MDEyNGMyNjAyYWUyZDRjNWQzZGJhMDViNDgyZDkxNTQ4MjQyZGU4CiBBdXRob3I6IFN0ZWZhbm8gQmFiaWMgPHNiYWJpY0BkZW54LmRlPgogRGF0ZToJV2VkIE1heSAxNiAxNDo0OToxMiAyMDA3ICswMjAwCkBAIC02MTUsNiArMzkwMiwxMDkgQEAKIAogICAgIENvZGluZyBTdHlsZSBDbGVhbnVwLCBuZXcgQ0hBTkdFTE9HCiAKK2NvbW1pdCAzMTYyZWI4MzY5MDNjOGIyNDdmZGM3NDcwZGQzOWJmYTY5OTZmNDk1CitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglUdWUgTWF5IDE1IDIzOjM4OjA1IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLgorCitjb21taXQgNjZkOWRiZWMxY2MyN2Q2Mzk4ZWU2Y2Y4NDYzOWRiZTE0OTcxMjUxZQorQXV0aG9yOiBtdXNodGFxIGtoYW4gPG11c2h0YXFfa0Bwcm9jc3lzLmNvbT4KK0RhdGU6CUZyaSBBcHIgMjAgMTQ6MjM6MDIgMjAwNyArMDUzMAorCisgICAgQWRkIGRyaXZlciBmb3IgUy1BVEEtY29udHJvbGxlciBvbiBJbnRlbCBwcm9jZXNzb3JzIHdpdGggU291dGgKKyAgICBCcmlkZ2UsIElDSC01LCBJQ0gtNiBhbmQgSUNILTcuCisKKyAgICBJbXBsZW1lbnRhdGlvbjoKKworICAgIDEuIENvZGUgaXMgZGl2aWRlZCBpbiB0byB0d28gZmlsZXMuIEFsbCBmdW5jdGlvbnMsIHdoaWNoIGFyZQorICAgICAgIGNvbnRyb2xsZXIgc3BlY2lmaWMgYXJlIGtlcHQgaW4gImRyaXZlcnMvYXRhX3BpaXguYyIgZmlsZSBhbmQKKyAgICAgICBmdW5jdGlvbnMsIHdoaWNoIGFyZSBub3QgY29udHJvbGxlciBzcGVjaWZpYywgYXJlIGtlcHQgaW4KKyAgICAgICAiY29tbW9uL2NtZF9zYXRhLmMiIGZpbGUuCisKKyAgICAyLiBSZWFkaW5nIGFuZCBXcml0aW5nIGZyb20gdGhlIFMtQVRBIGRyaXZlIGlzIGRvbmUgdXNpbmcgUElPIG1ldGhvZC4KKworICAgIDMuIERyaXZlciBjYW4gYmUgY29uZmlndXJlZCBmb3IgNDgtYml0IGFkZHJlc3NpbmcgYnkgZGVmaW5pbmcgbWFjcm8KKyAgICAgICBDT05GSUdfTEJBNDgsIGlmIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQgZHJpdmVyIHVzZXMgdGhlIDI4LWJpdAorICAgICAgIGFkZHJlc3NpbmcuCisKKyAgICA0LiBTLUFUQSByZWFkIGZ1bmN0aW9uIGlzIGhvb2tlZCB0byB0aGUgRmlsZSBzeXN0ZW0sIGNvbW1hbmRzIGxpa2UKKyAgICAgICBleHQybHMgYW5kIGV4dDJsb2FkIGZpbGUgY2FuIGJlIHVzZWQuIFRoaXMgaGFzIGJlZW4gdGVzdGVkLgorCisgICAgNS4gVS1Cb290IGNvbW1hbmQgIlNBVEFfaW5pdCIgaXMgYWRkZWQsIHdoaWNoIGluaXRpYWxpemVzIHRoZSBTLUFUQQorICAgICAgIGNvbnRyb2xsZXIgYW5kIGlkZW50aWZpZXMgdGhlIFMtQVRBIGRyaXZlcyBjb25uZWN0ZWQgdG8gaXQuCisKKyAgICA2LiBVLUJvb3QgY29tbWFuZCAic2F0YSIgaXMgYWRkZWQsIHdoaWNoIGlzIHVzZWQgdG8gcmVhZC93cml0ZSwgcHJpbnQKKyAgICAgICBwYXJ0aXRpb24gdGFibGUgYW5kIGdldCBpbmZvIGFib3V0IHRoZSBkcml2ZXMgcHJlc2VudC4gVGhpcyBJIGhhdmUKKyAgICAgICBpbXBsZW1lbnRlZCBpbiBzYW1lIHdheSBhcyAiaWRlIiBjb21tYW5kIGlzIGltcGxlbWVudGVkIGluIFUtQm9vdC4KKworICAgIDcuIFRoaXMgZHJpdmVyIGlzIGZvciBTLUFUQSBpbiBuYXRpdmUgbW9kZS4KKworICAgIDguIFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIE5hdGl2ZSBjb21tYW5kIHF1ZXVpbmcgYW5kCisgICAgICAgSG90LXBsdWdnaW5nLgorCisgICAgU2lnbmVkLW9mZi1ieTogTXVzaHRhcSBLaGFuIDxtdXNodGFxX2tAcHJvY3N5cy5jb20+CisKK2NvbW1pdCA2NDRlNmZiNGViOGJlOTBlYTA0YmEzNGI2NDNhOGJmMDE5ZDY4MGUwCitBdXRob3I6IG11c2h0YXEga2hhbiA8bXVzaHRhcV9rQHByb2NzeXMuY29tPgorRGF0ZToJTW9uIEFwciAzMCAxNTo1NzoyMiAyMDA3ICswNTMwCisKKyAgICBGaXhlcyBidWcgY2xlYXJpbmcgdGhlIGJzcyBzZWN0aW9uIGZvciBpMzg2CisKKyAgICBIaSwKKyAgICBUaGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29kZSBvZiBjbGVhcmluZyB0aGUgYnNzIHNlY3Rpb24gZm9yIHByb2Nlc3NvcgorICAgIGkzODYuKEZpbGU6IGNwdS9pMzg2L3N0YXJ0LlMpCisgICAgSW4gdGhlIGNvZGUsIGJzc19zdGFydCBhZGRyIChzdGFydGluZyBhZGRyIG9mIGJzcyBzZWN0aW9uKSBpcyBwdXQgaW50bworICAgIHRoZSByZWdpc3RlciAlZWF4LCBidXQgdGhlIGNvZGUgd2hpY2ggY2xlYXJzIHRoZSBic3Mgc2VjdGlvbiByZWZlcnMgdG8KKyAgICB0aGUgYWRkciBwb2ludGVkIGJ5ICVlZGkuCisKKyAgICBUaGlzIHBhdGNoIGZpeGVzIHRoaXMgYnVnIGJ5IHB1dHRpbmcgYnNzX3N0YXJ0IGludG8gJWVkaSByZWdpc3Rlci4KKworICAgIFNpZ25lZC1vZmYtYnk6IE11c2h0YXEgS2hhbiA8bXVzaHRhcV9rQHByb2NzeXMuY29tPgorCitjb21taXQgYzMyNDNjZjdiNDkwMDU3Mjc3ZDYxYWNmZmU0YWQwOTQ2ZjllYjRhNAorQXV0aG9yOiBKb2UgSGFtbWFuIDxqb2UuaGFtbWFuQGVtYmVkZGVkc3BlY2lhbHRpZXMuY29tPgorRGF0ZToJTW9uIEFwciAzMCAxNjo0NzoyOCAyMDA3IC0wNTAwCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgQkNNNTQ2NCBRdWFkIFBoeQorCisgICAgQWRkZWQgc3VwcG9ydCBmb3IgQnJvYWRjb20ncyBCQ001NDY0IFF1YWQgUGh5CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb2UgSGFtbWFuIDxqb2UuaGFtbWFuQGVtYmVkZGVkc3BlY2lhbHRpZXMuY29tPgorCitjb21taXQgMWIzMDViZGM3NTRjODQ2OGUxZDVkODU4ZjVkY2Y4YTdhMGE0YmI3YQorQXV0aG9yOiBaYW5nIFJveS1yNjE5MTEgPHRpZS1mZWkuemFuZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIE1heSA5IDA4OjEwOjU3IDIwMDcgKzA4MDAKKworICAgIFNlYXJjaCB0aGUgZXhjZXB0aW9uIHRhYmxlIHdpdGggbGluZWFyIGFsZ29yaXRobQorCisgICAgU2VhcmNoIHRoZSBleGNlcHRpb24gdGFibGUgd2l0aCBsaW5lYXIgYWxnb3JpdGhtIGluc3RlYWQgb2YKKyAgICBiaXNlY3RpbmcgYWxnb3JpdGhtLgorICAgIEJlY2F1c2UgdGhlIGV4Y2VwdGlvbiB0YWJsZSBtaWdodCBiZSB1bnNvcnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJveSBaYW5nIDx0aWUtZmVpLnphbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDVkZmFhNTBlYjgxOTY4NmJmYmExOTI3ZThjNWI4YTcwYTRkNjVmZDMKK0F1dGhvcjogQXVicmV5LkxpIDxhdWJyZXkuYWRpQGdtYWlsLmNvbT4KK0RhdGU6CU1vbiBNYXkgMTQgMTE6NDc6MzUgMjAwNyArMDgwMAorCisgICAgRml4IGNvbXBpbGF0aW9uIGlzc3VlcyBvbiBNQUNPU1gKKworICAgIFNpbmdlZC1vZmYtYnk6IE1hcmMgSG9mZm1hbiA8TWFyYy5Ib2ZmbWFuQGFuYWxvZy5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQXVicmV5IExpIDxhdWJyZXkuYWRpQGdtYWlsLmNvbT4KKworY29tbWl0IDU2ZmQ3MTYyOTg1YzQxMjMxN2JiZjc2M2EyMjVmYmEyM2M2NGZkMzEKK0F1dGhvcjogU3RlcGhlbiBXaWxsaWFtcyA8c3RldmVAaWNhcnVzLmNvbT4KK0RhdGU6CVR1ZSBNYXkgMTUgMDc6NTU6NDIgMjAwNyAtMDcwMAorCisgICAgRml4IGZvciBjb21waWxlIG9mIEpTRSB0YXJnZXQKKworICAgIFRoZSBhdHRhY2hlZCBwYXRjaCBmaXhlcyB0aGUgY29tcGlsZSBvZiB0aGUgSlNFIGJvYXJkIGluIHRoZQorICAgIGRlbnggZ2l0IGFzIG9mIDE0IG1heSAyMDA3LiBJdCBpcyBhbiBleHRyZW1lbHkgc2ltcGxlIHBhdGNoLAorICAgIGl0IGp1c3QgYWRkcyB0aGUgbWlzc2luZyBkZWZpbmUgb2YgQ0ZHX1NZU1RFTUFDRV9XSURUSC4KKworICAgICBGaXggdG8gY29tcGlsZSBKU0UgYWdhaW5zdCAyMDA3MDUxNCBnaXQgb2YgdS1ib290CisKIGNvbW1pdCA2MTkzNjY2N2U4NmEyNTBhZTEyZmQyZGMxODlkMzU4OGYwYTU5ZTBiCiBBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KIERhdGU6CUZyaSBNYXkgMTEgMTI6MDE6NDkgMjAwNyArMDIwMApAQCAtODEyLDYgKzQyMDIsMTIgQEAKIAogICAgIG5ldzogYWRkIHdyaXRpbmcgdG8gbXNyIHJlZ2lzdGVyCiAKK2NvbW1pdCAzYTYxOWRkN2JlZDAzZThiNGQyMmEzOTExZjkwZmQxMmFmNTM3NmMyCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglNb24gTWF5IDcgMTY6NDM6NTYgMjAwNyArMDIwMAorCisgICAgRml4IGFuIGFuY2llbnQgQ0hBTkdFTE9HIGNvbmZsaWN0CisKIGNvbW1pdCBhYzRjZDU5ZDU5YzliZjNmODljYjdhMzQ0YWJmODE4NGQ2NzhmNTYyCiBBdXRob3I6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CiBEYXRlOglTYXQgTWF5IDUgMDg6MTI6MzAgMjAwNyArMDIwMApAQCAtOTU0LDYgKzQzNTAsMjAgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KIAorY29tbWl0IDJmNTUwYWI5NzY0MDUzMDBmNWIwN2JmMjg5MDgwMDg0MGQwYWEwNWYKK0F1dGhvcjogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVNhdCBNYXkgNSAwODoxMjozMCAyMDA3ICswMjAwCisKKyAgICA1eHh4OiB3cml0ZSBNQUMgYWRkcmVzcyB0byBtYWMtYWRkcmVzcyBhbmQgbG9jYWwtbWFjLWFkZHJlc3MKKworICAgIFNvbWUgZGV2aWNlIHRyZWVzIGhhdmUgYSBtYWMtYWRkcmVzcyBwcm9wZXJ0eSwgc29tZSBoYXZlIGxvY2FsLW1hYy1hZGRyZXNzLAorICAgIGFuZCBzb21lIGhhdmUgYm90aC4gIFRvIHN1cHBvcnQgYWxsIG9mIHRoZXNlIGRldmljZSB0cmVlcywgZnRwX2NwdV9zZXR1cCgpCisgICAgc2hvdWxkIHdyaXRlIHRoZSBNQUMgYWRkcmVzcyB0byBtYWMtYWRkcmVzcyBhbmQgbG9jYWwtbWFjLWFkZHJlc3MsIGlmIHRoZXkKKyAgICBleGlzdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKwogY29tbWl0IGE3OTg4NjU5MDU5M2JhMWQ2NjdjODQwY2FhNDk0MGM2MTYzOWYxOGYKIEF1dGhvcjogVGhvbWFzIEtub2Jsb2NoIDxrbm9ibG9jaEBzaWVtZW5zLmNvbT4KIERhdGU6CVNhdCBNYXkgNSAwNzowNDo0MiAyMDA3ICswMjAwCkBAIC0xMDE3LDYgKzQ0MjcsMzAgQEAKIAogICAgIFNpZ25lZC1vZmYtYnkgRGFuIE1hbGVrLCA8ZGFuQGVtYmVkZGVkYWxsZXkuY29tPgogCitjb21taXQgZjIxMzRmOGU5ZWIwMDZiZGNkNzI5ZTg5ZjMwOWMwN2IyZmE0NTE4MAorQXV0aG9yOiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KK0RhdGU6CVdlZCBNYXkgMiAxMzozMTo1MyAyMDA3ICswMjAwCisKKyAgICBtYWNiOiBEb24ndCByZXN0YXJ0IGF1dG9uZWdvdGlhdGlvbiBpZiB3ZSBhbHJlYWR5IGhhdmUgbGluaworCisgICAgUmV3b3JrIG1hY2JfcGh5X2luaXQgc28gdGhhdCBpdCBkb2Vzbid0IGF0dGVtcHQgdG8gcmUtbmVnb3RpYXRlIGlmIHRoZQorICAgIGxpbmsgaXMgYWxyZWFkeSB1cC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorCitjb21taXQgMDRmY2I1ZDM4YmM5MDc3OWNkOWE3MTBkNjA3MDIwNzU5ODZmMGUyOQorQXV0aG9yOiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KK0RhdGU6CVdlZCBNYXkgMiAxMzoyMjozOCAyMDA3ICswMjAwCisKKyAgICBtYWNiOiBJbnRyb2R1Y2UgYSBmZXcgYmFycmllcnMgd2hlbiBkZWFsaW5nIHdpdGggRE1BIGRlc2NyaXB0b3JzCisKKyAgICBUaGVyZSB3ZXJlIGEgZmV3IHRoZW9yZXRpY2FsIHBvc3NpYmlsaXRpZXMgdGhhdCB0aGUgY29tcGlsZXIgbWlnaHQKKyAgICBvcHRpbWl6ZSBhd2F5IERNQSBkZXNjcmlwdG9yIHJlYWRzIGFuZC9vciB3cml0ZXMgYW5kIHRodXMgY2F1c2UKKyAgICBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMgd2l0aCB0aGUgaGFyZHdhcmUuIEluc2VydCBiYXJyaWVycyB3aGVyZQorICAgIHdlIGRlcGVuZCBvbiByZWFkcy93cml0ZXMgYWN0dWFsbHkgaGl0dGluZyBtZW1vcnkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KKwogY29tbWl0IGZmYTYyMWEwZDEyYTFjY2Q4MWM5MzZjNTY3Zjg5MTdhMjEzNzg3YTgKIEF1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgogRGF0ZToJU2F0IEZlYiAyNCAwMTowODoxMyAyMDA3IC0wNjAwCkBAIC0xMTE3LDEyICs0NTUxLDM1IEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiAKK2NvbW1pdCA4NjRhYTZhNmE0NjZmY2I5MmJmMzJiMWQ3ZGJhNzljZDcwOWI1MmM5CitBdXRob3I6IEdyemVnb3J6IFdpYW5lY2tpIDxncnplZ29yei53aWFuZWNraUBnbWFpbC5jb20+CitEYXRlOglTdW4gQXByIDI5IDE0OjAxOjU0IDIwMDcgKzAyMDAKKworICAgIFtQQVRDSF0gVXNlIFBWUiB0byBkaXN0aW5ndWlzaCBNUEM1MjAwQiBmcm9tIE1QQzUyMDAgaW4gYm9vdCBtZXNzYWdlCisKKyAgICBNUEM1MjAwQiBzeXN0ZW1zIGFyZSBpbmNvcnJlY3RseSByZXBvcnRlZCBhcyBNUEM1MjAwIGluIFUtQm9vdCBzdGFydC11cAorICAgIG1lc3NhZ2UuIFVzZSBQVlIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvIHZhcmlhbnRzLCBhbmQgcHJpbnQgcHJvcGVyIENQVQorICAgIGluZm9ybWF0aW9uLgorCisgICAgU2lnbmVkLW9mZi1ieTogR3J6ZWdvcnogV2lhbmVja2kgPGdyemVnb3J6LndpYW5lY2tpQGdtYWlsLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKwogY29tbWl0IDVjNWQzMjQyOTM1Y2YzNTQzYWYwMTE0MjYyNzQ5NDQzNDgzNGNmOTgKIEF1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KIERhdGU6CVdlZCBBcHIgMjUgMTI6MzQ6MzggMjAwNyAtMDUwMAogCiAgICAgbXBjODN4eDogbWlub3IgZml4dXBzIGZvciA4MzEzcmRiIGludHJvZHVjdGlvbgogCitjb21taXQgYWRhNGQ0MDA5MWY2ZWQ0YTRmMDA0MGUwOGQyMGRiMjE5NjdlNGE2NworQXV0aG9yOiBMYWRpc2xhdiBNaWNobCA8bGFkaXNAbGludXgtbWlwcy5vcmc+CitEYXRlOglXZWQgQXByIDI1IDE2OjAxOjI2IDIwMDcgKzAyMDAKKworICAgIFtQQVRDSF0gc2ltcGxpZnkgc2lsZW50IGNvbnNvbGUKKworICAgIFNpZ25lZC1vZmYtYnk6IExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KKyAgICBBY2tlZC1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCiBjb21taXQgMTQ0ODc2YTM4MGY1NzU2ZjU3NDEyY2FmNzRjMWQ2ZGMyMDFkZDc5NgogQXV0aG9yOiBNaWNoYWwgU2ltZWsgPG1vbnN0ckBtb25zdHIuZXU+CiBEYXRlOglUdWUgQXByIDI0IDIzOjAxOjAyIDIwMDcgKzAyMDAKQEAgLTE0MTksNiArNDg3Niw2OSBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogU2NvdHQgV29vZCA8c2NvdHR3b29kQGZyZWVzY2FsZS5jb20+CiAKK2NvbW1pdCA3ZmM0YzcxYTE0M2JlODY2NmQ3MDgwM2ZiMjVhZTYwMzc5Yzk1NjIyCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CU1vbiBBcHIgMjMgMTU6Mzk6NTkgMjAwNyArMDIwMAorCisgICAgRml4IGZpbGUgbW9kZQorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgMzgyNTc5ODhhYmZlNzRkNDU5Y2EyYWQ3NDhiMTA5Y2EwNGU0ZWZlMQorQXV0aG9yOiBTZXJnZWkgU2h0eWx5b3YgPHNzaHR5bHlvdkBydS5tdmlzdGEuY29tPgorRGF0ZToJTW9uIEFwciAyMyAxNTozMDozOSAyMDA3ICswMjAwCisKKyAgICBbUEFUQ0hdIEF2b2lkIGFzc2lnbmluZyBQQ0kgcmVzb3VyY2VzIGZyb20gemVybyBhZGRyZXNzCisKKyAgICBJZiBhIFBDSSBJREUgY2FyZCBoYXBwZW5zIHRvIGdldCBhIHplcm8gYWRkcmVzcyBhc3NpZ25lZCB0byBpdCwgdGhlIExpbnV4IElERQorICAgIGNvcmUgY29tcGxhaW5zIGFuZCBJREUgZHJpdmVycyBmYWlscyB0byB3b3JrLiAgQWxzbywgYXNzaWduaW5nIHplcm8gdG8gYSBCQVIKKyAgICB3YXMgaWxsZWdhbCBhY2NvcmRpbmcgdG8gUENJIDIuMSAodGhlIGxhdGVyIHJldmlzaW9ucyBzZWVtIHRvIGhhdmUgZXhjbHVkZWQgdGhlCisgICAgc2VudGVuY2UgYWJvdXQgIjAiIGJlaW5nIGNvbnNpZGVyZWQgYW4gaW52YWxpZCBhZGRyZXNzKSAtLSBzbywgdXNlIGEgcmVhc29uYWJsZQorICAgIHN0YXJ0aW5nIHZhbHVlIG9mIDB4MTAwMCAodGhhdCdzIHdoYXQgdGhlIG1vc3QgTGludXggYXJjaHMgYXJlIHVzaW5nKS4KKworICAgIEFsdGVybmF0aXZlbHksIG9uZSBtaWdodCBoYXZlIGZpeGVkIHRoZSBjYWxscyB0byBwY2lfc2V0X3JlZ2lvbigpIGluZGl2aWR1YWxseQorICAgIChzb21lIGNvZGUgZXZlbiBzZWVtcyB0byBoYXZlIHRha2VuIGNhcmUgb2YgdGhpcyBpc3N1ZSkgYnV0IHRoYXQgd291bGQgaGF2ZQorICAgIGJlZW4gYSBsb3QgbW9yZSB3b3JrLiA6LSkKKworICAgIFNpZ25lZC1vZmYtYnk6IFNlcmdlaSBTaHR5bHlvdiA8c3NodHlseW92QHJ1Lm12aXN0YS5jb20+CisgICAgQWNrZWQtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGFmYjkwM2EyZWI5NDM2YmFhOTI3MGNjYzBjMjcwODJkODY0OTdkODkKK0F1dGhvcjogSmVmZnJleSBNYW5uIDxtYW5uakBlbWJlZGRlZHBsYW5ldC5jb20+CitEYXRlOglNb24gQXByIDIzIDE0OjAwOjExIDIwMDcgKzAyMDAKKworICAgIFtwYXRjaF0gc2V0ZW52KC4uLikgY2FuIGRlbGV0ZSBlbnZpcm9ubWVudGFsdmFyaWFibGVzCisKKyAgICB1cGRhdGUgc2V0ZW52KCkgZnVuY3Rpb24gc28gdGhhdCBlbnRlcmluZyBhIE5VTEwgdmFsdWUgZm9yIHRoZQorICAgIHZhcmlhYmxlJ3MgdmFsdWUgd2lsbCBkZWxldGUgdGhlIGVudmlyb25tZW50YWwgdmFyaWFibGUKKworICAgIFNpZ25lZC1vZmYtYnk6IEplZmZyZXkgTWFubiA8bWFubmpAZW1iZWRkZWRwbGFuZXQuY29tPgorICAgIEFja2VkLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAzNmYxMDRlNWNhYTc0N2Q1NjhlZmYyNmIzNjk1NjVhZjU3YzJmZmE2CitBdXRob3I6IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KK0RhdGU6CU1vbiBBcHIgMjMgMTM6NTQ6MjQgMjAwNyArMDIwMAorCisgICAgW3BhdGNoXSB1c2UgdW5zaWduZWQgY2hhciBpbiBzbWM5MTExMSBkcml2ZXIgZm9yIG1hYworCisgICAgdGhlIHZfbWFjIHZhcmlhYmxlIGluIHRoZSBzbWM5MTExMSBkcml2ZXIgaXMgZGVjbGFyZWQgYXMgYSBzaWduZWQgY2hhciAuLi4KKyAgICB0aGlzIGNhdXNlcyBwcm9ibGVtcyB3aGVuIG9uZSBvZiB0aGUgYnl0ZXMgaW4gdGhlIE1BQyBpcyAic2lnbmVkIiBsaWtlIDB4RTAKKyAgICBiZWNhdXNlIHdoZW4gaXQgZ2V0cyBwcmludGVkIG91dCwgeW91IGdldCBhIGRpc3BsYXkgbGlrZToKKyAgICAweEZGRkZGRkUwIGFuZCB0aGF0J3Mgbm8gZ29vZAorCisgICAgU2lnbmVkLW9mZi1ieTogTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorCitjb21taXQgZDk4YzA4ODVhZDYxN2ZjY2YyMWU3YzI2ZWY4Y2I3MjhmYmZiMjQ1OQorQXV0aG9yOiBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBlbm5lZW5uZS5jb20+CitEYXRlOglNb24gQXByIDIzIDEzOjEwOjUyIDIwMDcgKzAyMDAKKworICAgIFVTQjogKEFub3RoZXIpIGRlbGF5IGZvciBjcmFwcHkgVVNCIGtleXMuCisKKyAgICBTb21lIFVTQiBrZXlzIGFyZSBzbG93IGluIGdpdmluZyBiYWNrIGFuIGFuc3dlciB3aGVuIHRoZSBSb290IEhVQgorICAgIGVuYWJsZXMgcG93ZXIgbGluZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBsaW51eC5pdD4KKwogY29tbWl0IDMyM2JmYThmNDM2ZGMzYmM1NzE4N2M5YjE0ODhiYzMxNDZmZjE1MjIKIEF1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogRGF0ZToJTW9uIEFwciAyMyAxMjowMDoyMiAyMDA3ICswMjAwCkBAIC0yMDg0LDYgKzU2MDQsMjIgQEAKIAogICAgIE1pbm9yIGNsZWFudXAuCiAKK2NvbW1pdCA4MjJhZjM1MWFkMmJhYmM3ZDk5MDMzMzYxYTVmY2FjZDMwZjZiYzc4CitBdXRob3I6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGVubmVlbm5lLmNvbT4KK0RhdGU6CVR1ZSBBcHIgMyAxNDoyNzoxOCAyMDA3ICswMjAwCisKKyAgICBTdXBwb3J0IGZvciB0aGUgUGhpbGlwcyBJU1AxMTZ4IEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikKKworICAgIFNpZ25lZC1vZmYtYnk6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGVubmVlbm5lLmNvbT4KKworY29tbWl0IGVkZjU4NTFiZTZjMTdjMDMxZDRmNzFkZDViMGExMjA0MGI3YzUwYzgKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CVR1ZSBBcHIgMyAxNDoyNzowOCAyMDA3ICswMjAwCisKKyAgICBVU0I6IGNsZWFudXAgbW9uYWhhbnMgdXNiIHN1cHBvcnQuIFJlbW92ZSBkZWFkIGNvZGUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorCiBjb21taXQgYTY1YzU3NjhlNTUzNzUzMGJkMTc4MGFmM2QzZmRkYzMxMTNhMTYzYwogQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiBEYXRlOglNb24gQXByIDIgMTA6MDk6MzAgMjAwNyArMDIwMApAQCAtMjI1Myw2ICs1Nzg5LDIzIEBACiAKICAgICBQQVRDSDogUmVzb2x2ZSBHUEwgbGljZW5zZSBwcm9ibGVtCiAKK2NvbW1pdCBhZTAwYmI0YjI5NDRkYzY0YTQ4NWVkNzJhMTk3NTRiMTFhZjdjMjIzCitBdXRob3I6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGVubmVlbm5lLmNvbT4KK0RhdGU6CU1vbiBNYXIgMjYgMTI6MDM6MzYgMjAwNyArMDIwMAorCisgICAgUFhBOiBweGEyN3ggVVNCIE9IQ0kgc3VwcG9ydAorCisgICAgU2lnbmVkLW9mZi1ieTogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisKK2NvbW1pdCBhZTc5ZjYwNjc3YzIwODMyNjUzNTY0N2RjYmQ1YzNlYzQwZGJjYjBiCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglNb24gTWFyIDI2IDExOjIxOjA1IDIwMDcgKzAyMDAKKworICAgIFVTQjogcmVtb3ZlIHRoZSBTM0MyNFgwX21lcmdlICNkZWZpbmUsIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIHdoaWxlCisgICAgbWVyZ2luZyBPSENJIGRyaXZlcnMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorCiBjb21taXQgMTc5ODA0OTUyMmY1OTQwMTNhZWEyOTQ1N2Q0Njc5NDI5OGM2YWUxNQogQXV0aG9yOiBNaWNoYWwgU2ltZWsgPHJvb3RAbW9uc3RyLmV1PgogRGF0ZToJTW9uIE1hciAyNiAwMTozOTowNyAyMDA3ICswMjAwCkBAIC00Mzc4LDYgKzc5MzEsMzQgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KIAorY29tbWl0IDU4YjQ4NTc3NjY5OGMzZDcxZWM1YTIxNWUzOTIxMjNiNGMxNWFmYTMKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CU1vbiBOb3YgMjcgMTE6NTE6MjEgMjAwNiArMDEwMAorCisgICAgQWRkIGEgc21hbGwgUkVBRE1FIHdpdGggaW5mb3JtYXRpb24gb24gdGhlIGdlbmVyaWMgb2hjaSBkcml2ZXIuCisKK2NvbW1pdCBhZTNiNzcwZTRlYWU4ZTk4YjZlOWUyOTY2MmUxOGM0N2ZkZjAxNzFmCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglNb24gTm92IDI3IDExOjQ2OjQ2IDIwMDYgKzAxMDAKKworICAgIEZpeCBzb21lIGVuZGlhbm5lc3MgaXNzdWVzIHJlbGF0ZWQgdG8gdGhlIGdlbmVyaWMgb2hjaSBkcml2ZXIKKworY29tbWl0IDdiNTliM2M3YThjZTJlNGI1NjdhYmY5OWMxY2Q2NjdiZjM1Yjk0MTgKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CU1vbiBOb3YgMjcgMTE6NDQ6NTggMjAwNiArMDEwMAorCisgICAgSW50cm9kdWNlZCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gQ09ORklHX1VTQl9PSENJX05FVyBpbiBvcmRlciB0byBiZSBhYmxlCisgICAgdG8gY2hvb3NlIGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIGdlbmVyaWMgT0hDSSBkcml2ZXJzLgorCitjb21taXQgNTNlMzM2ZTlmZmM1MTAzNWJkYzRlNTg2NzYzMWIzMzc4NzYxYjRkZgorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJTW9uIE5vdiAyNyAxMTo0MzowOSAyMDA2ICswMTAwCisKKyAgICBNb2RpZmllZCB0aGUgbXBjNXh4eCBhbmQgdGhlIHBwYzR4eCBjcHUgdG8gdXNlIHRoZSBnZW5lcmljIE9IQ0kgZHJpdmVyCisgICAgYW5kIGFkYXB0ZWQgYm9hcmQgY29uZmlncyBUUU01MjAwIGFuZCB5b3NlbWl0ZSBhY2NvcmRpbmdseS4gVGhpcyBjb21taXQKKyAgICBhbHNvIG1ha2VzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb290IGh1YiBwb3J0cyBjb25maWd1cmFibGUKKyAgICAoQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTKS4KKwogY29tbWl0IDc4ZDYyMGViYjU4NzFkMjUyMjcwZGVkZmFkNjBjNjU2ODk5M2I3ODAKIEF1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAYXRsYXMuZGVueC5kZT4KIERhdGU6CVRodSBOb3YgMjMgMjI6NTg6NTggMjAwNiArMDEwMApAQCAtNjEzNSw2ICs5NzE2LDEyIEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgogCitjb21taXQgOTlkNzBlM2E0N2FmZmI5YmFlMDQxYTJjYWVjZTdjZDUxNmUyMTNiMworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBwb2xsdXguZGVueC5kZT4KK0RhdGU6CU1vbiBKdW4gMjYgMTE6MDY6MDAgMjAwNiArMDIwMAorCisgICAgTW9yZSBjb2RlIGNsZWFudXAKKwogY29tbWl0IDY4NDYyM2NlOTJjNWZkMzJlN2RiMmQ2ZTAxNjk0NWE2N2M1ZmZhYmEKIEF1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KIERhdGU6CVRodSBKdW4gMjIgMDg6NTE6NDYgMjAwNiAtMDUwMApAQCAtNjE1OSw2ICs5NzQ2LDI4IEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgogCitjb21taXQgMzg2ZWRhMDIyNDczMzk0YWQ4ZjM2Yjg2ZjJiZGM5YjRjYjgxNjI5MQorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBwb2xsdXguZGVueC5kZT4KK0RhdGU6CVdlZCBKdW4gMTQgMTg6MTQ6NTYgMjAwNiArMDIwMAorCisgICAgQ29kZSBjbGVhbnVwCisKK2NvbW1pdCAxNmM4ZDVlNzZhZTBmNzhmMzlhNjA2MDg1NzRhZGZlMGZlYjljYzcwCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQHBvbGx1eC5kZW54LmRlPgorRGF0ZToJV2VkIEp1biAxNCAxNzo0NTo1MyAyMDA2ICswMjAwCisKKyAgICBWYXJpb3VzIFVTQiByZWxhdGVkIHBhdGNoZXMKKyAgICAtIEFkZCBzdXBwb3J0IGZvciBtcGM4eHggVVNCIGRldmljZS4KKyAgICAtIEFkZCBzdXBwb3J0IGZvciBDb21tb24gRGV2aWNlIENsYXNzIC0gQWJzdHJhY3QgQ29udHJvbCBNb2RlbCBVU0IgY29uc29sZS4KKyAgICAtIEFkZCBzdXBwb3J0IGZvciBmbG93IGNvbnRyb2wgaW4gVVNCIHNsYXZlIGRldmljZXMuCisgICAgLSBBZGQgc3VwcG9ydCBmb3Igc3dpdGNoaW5nIGJldHdlZW4gZ3NlcmlhbCBhbmQgY2RjX2FjbSB1c2luZyBlbnZpcm9ubWVudC4KKyAgICAtIE1pbm9yIGNoYW5nZXMgdG8gdXNiZGNvcmVfb21hcDE1MTAuYyB1c2JkY29yZV9vbWFwMTUxMC5oCisgICAgLSBVcGRhdGUgdXNiY29yZSBzbGlnaHRseSB0byBlYXNlIGhvc3QgZW51bWVyYXRpb24uCisgICAgLSBGaXggbm9uLXBvcnRhYmxlIGVuZGlhbiBwcm9ibGVtcyBpbiB1c2JkY29yZSBhbmQgdXNiZGNvcmVfZXAwLgorICAgIC0gQWRkIEFkZGVyVVNCX2NvbmZpZyBhcyBhIGRlZmNvbmZpZyB0byBlbmFibGUgdXNhZ2Ugb2YgdGhlIFVTQiBjb25zb2xlCisgICAgICBieSBkZWZhdWx0IHdpdGggdGhlIEFkZGVyODd4IFUtQm9vdCBwb3J0LgorICAgIFBhdGNoZXMgYnkgQnJ5YW4gTydEb25vZ2h1ZSA8Ym9kb25vZ2h1ZUBjb2RlaGVybWl0LmllPiwgMjkgTWF5IDIwMDYKKwogY29tbWl0IDhlY2M5NzE2MThmNTYwMjlhZDk5ZDM1MTZmOGIyOTdhNmVkNTg5NzEKIEF1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KIERhdGU6CVdlZCBKdW4gNyAxMDo1Mzo1NSAyMDA2IC0wNTAwCkBAIC02MjM3LDYgKzk4NDYsMTIgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CiAKK2NvbW1pdCBkZGY4M2EyZmNlZjFhNjcwYzQ1ZmM1ODUxMTlkY2MxZmUwNjJjNGE5CitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglUdWUgTWF5IDMwIDE2OjU2OjE0IDIwMDYgKzAyMDAKKworICAgIFN1cHBvcnQgZ2VuZXJpYyBPSENJIHN1cHBvcnQgZm9yIHRoZSBzM2MyNHgwIGNwdS4KKwogY29tbWl0IDM4Y2VlMTJkY2ZjYzI1NzM3MWM5MDFjN2UxM2U1OGVjYWIwYTM1ZDgKIEF1dGhvcjogSGFpeWluZyBXYW5nIDxIYWl5aW5nLldhbmdAZnJlZXNjYWxlLmNvbT4KIERhdGU6CVR1ZSBNYXkgMzAgMDk6MTA6MzIgMjAwNiAtMDUwMApAQCAtNjI4Niw2ICs5OTAxLDI5IEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgogCitjb21taXQgMzAxZjFhYTM4NGQwZWRjYWU2YTIyZmQ5YWRiOTMzYWQ3MTY5NWVjYworQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJVHVlIE1heSAyMyAxMzozODozNSAyMDA2ICswMjAwCisKKyAgICBDaGFuZ2VkIHRoZSBtcDJ1c2IgKGF0OTFybTkyMDApIGJvYXJkIHRvIHVzZSB0aGUgZ2VuZXJpYyBPSENJIGRyaXZlci4gU29tZQorICAgIGZpeGVzIHRvIHRoZSBsYXR0ZXIuCisKK2NvbW1pdCAyNGUzNzY0NWU3Mzc4YjIwZmE4ZjIwZTI5OTZjOGZiOGU5MGM3MGM5CitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglUdWUgTWF5IDIzIDEwOjMzOjExIDIwMDYgKzAyMDAKKworICAgIE1vcmUgY2xlYW51cCBmb3IgdGhlIGRlbHRhIGJvYXJkIGFuZCB0aGUgZ2VuZXJpYyB1c2Jfb2hjaSBkcml2ZXIuIEFkZGVkCisgICAgQ0ZHX1VTQl9CT0FSRF9JTklUIGFuZCBDRkdfVVNCX0NQVV9JTklUIGZvciBlbmFibGluZyBib2FyZCBhbmQgY3B1IHNwZWNpZmljCisgICAgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXAgaG9va3MgcmVzcGVjdGl2ZWx5LgorCitjb21taXQgM2UzMjZlY2U5ZWJhODE4NGY1ZDQ4YWE0ZmI4Nzc2MGE4ZjZmMGYxMAorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJTW9uIE1heSAyMiAxNjozMzo1NCAyMDA2ICswMjAwCisKKyAgICBUaGlzIHBhdGNoIGFkZHMgVVNCIHN0b3JhZ2Ugc3VwcG9ydCBmb3IgdGhlIGRlbHRhIGJvYXJkLiBUaGlzIGlzIHRoZSBmaXJzdAorICAgIGJvYXJkIHRvIG1ha2UgdXNlIG9mIGEgZ2VuZXJpYyBPSENJIGRyaXZlciwgdGhhdCBjYWxscyBob29rcyBmb3IgYm9hcmQKKyAgICBkZXBlbmRhbnQgaW5pdGlhbGl6YXRpb24uCisKIGNvbW1pdCAxNGUzNzA4MWZmM2NhYzdlYmU2ZTkzODM2NTIzNDI5ODUzYjZiMjkyCiBBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CiBEYXRlOglGcmkgTWF5IDE5IDEzOjI4OjM5IDIwMDYgLTA1MDAKZGlmZiAtLWdpdCBhL0NIQU5HRUxPRy1iZWZvcmUtVS1Cb290LTEuMS41IGIvQ0hBTkdFTE9HLWJlZm9yZS1VLUJvb3QtMS4xLjUKaW5kZXggNzI3YTdiNi4uMjQwNDE0OCAxMDA2NDQKLS0tIGEvQ0hBTkdFTE9HLWJlZm9yZS1VLUJvb3QtMS4xLjUKKysrIGIvQ0hBTkdFTE9HLWJlZm9yZS1VLUJvb3QtMS4xLjUKQEAgLTQzOCw2ICs0MzgsMjAgQEAKIAogKiBDYWxsIHNlcmlhbF9pbml0aWFsaXplKCkgYmVmb3JlIGZpcnN0IGRlYnVnKCkgaXMgdXNlZC4KIAorKiBDb2RlIGNsZWFudXAKKworKiBWYXJpb3VzIFVTQiByZWxhdGVkIHBhdGNoZXMKKyAgLSBBZGQgc3VwcG9ydCBmb3IgbXBjOHh4IFVTQiBkZXZpY2UuCisgIC0gQWRkIHN1cHBvcnQgZm9yIENvbW1vbiBEZXZpY2UgQ2xhc3MgLSBBYnN0cmFjdCBDb250cm9sIE1vZGVsIFVTQiBjb25zb2xlLgorICAtIEFkZCBzdXBwb3J0IGZvciBmbG93IGNvbnRyb2wgaW4gVVNCIHNsYXZlIGRldmljZXMuCisgIC0gQWRkIHN1cHBvcnQgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIGdzZXJpYWwgYW5kIGNkY19hY20gdXNpbmcgZW52aXJvbm1lbnQuCisgIC0gTWlub3IgY2hhbmdlcyB0byB1c2JkY29yZV9vbWFwMTUxMC5jIHVzYmRjb3JlX29tYXAxNTEwLmgKKyAgLSBVcGRhdGUgdXNiY29yZSBzbGlnaHRseSB0byBlYXNlIGhvc3QgZW51bWVyYXRpb24uCisgIC0gRml4IG5vbi1wb3J0YWJsZSBlbmRpYW4gcHJvYmxlbXMgaW4gdXNiZGNvcmUgYW5kIHVzYmRjb3JlX2VwMC4KKyAgLSBBZGQgQWRkZXJVU0JfY29uZmlnIGFzIGEgZGVmY29uZmlnIHRvIGVuYWJsZSB1c2FnZSBvZiB0aGUgVVNCIGNvbnNvbGUKKyAgICBieSBkZWZhdWx0IHdpdGggdGhlIEFkZGVyODd4IFUtQm9vdCBwb3J0LgorICBQYXRjaCBieSBCcnlhbiBPJ0Rvbm9naHVlIDxib2Rvbm9naHVlQGNvZGVoZXJtaXQuaWU+LCAyOSBNYXkgMjAwNgorCiAqIENsZWFudXAgdHJhYiBib2FyZCBmb3IgR0NDLTQueAogCiAqIFZvaWNlQmx1ZSB1cGRhdGU6IHVzZSBuZXcgTVREIGZsYXNoIHBhcnRpdGlvbmluZyBtZXRob2RzLCB1c2UgbW9yZQpkaWZmIC0tZ2l0IGEvQ1JFRElUUyBiL0NSRURJVFMKaW5kZXggN2FmMWI4MC4uYjA4MzA1YiAxMDA2NDQKLS0tIGEvQ1JFRElUUworKysgYi9DUkVESVRTCkBAIC0xNjAsNiArMTYwLDExIEBACiBFOiBUaG9tYXNGQGh5cGVyaW9uLWVudGVydGFpbm1lbnQuY29tCiBEOiBTdXBwb3J0IGZvciBBbWlnYU9uZQogCitOOiBOaWtsYXVzIEdpZ2VyCitFOiBuaWtsYXVzLmdpZ2VyQG5ldHN0YWwuY29tCitEOiBTdXBwb3J0IGZvciBIQ1UoeCkgYm9hcmRzCitXOiB3d3cubmV0c3RhbC5jb20KKwogTjogUGF1bCBHb3J0bWFrZXIKIEU6IHBhdWwuZ29ydG1ha2VyQHdpbmRyaXZlci5jb20KIEQ6IFN1cHBvcnQgZm9yIFdSUyBTQkM4MzQ3LzgzNDkgYm9hcmRzCkBAIC0yNTIsNiArMjU3LDEwIEBACiBEOiBTdXBwb3J0IGZvciBBZGRlci1JSSBNUEM4NTJUIGV2YWx1YXRpb24gYm9hcmQKIFc6IGh0dHA6Ly93d3cuZm9yY2Vjb21wdXRlcnMuY29tCiAKK046IFNlcmdleSBLdWJ1c2h5bgorRToga3NpQGtvaTgubmV0CitEOiBTdXBwb3J0IGZvciB2YXJpb3VzIFRJIERhVmluY2kgYmFzZWQgYm9hcmRzLgorCiBOOiBCZXJuaGFyZCBLdWhuCiBFOiBia3VobkBtZXRyb3dlcmtzLmNvbQogRCBTdXBwb3J0IGZvciBDb2xkZmlyZSBDUFU7IFN1cHBvcnQgZm9yIE1vdG9yb2xhIE01MjcyQzMgYW5kIE01MjgyRVZCIGJvYXJkcwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA2OTNiMTE1Li5mODEyNDMxIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTYwLDYgKzE2MCwxMSBAQAogCVdVSDQwNQkJCVBQQzQwNUVQCiAJQ01TNzAwICAgICAgICAgICAgICAgICAgUFBDNDA1RVAKIAorTmlrbGF1cyBHaWdlciA8bmlrbGF1cy5naWdlckBuZXRzdGFsLmNvbT4KKworICAgICAgICBIQ1U0ICAgICAgICAgICAgICAgICAgICBQUEM0MDVHUHIKKyAgICAgICAgSENVNSAgICAgICAgICAgICAgICAgICAgUFBDNDQwRVB4CisKIEZyYW5rIEdvdHRzY2hsaW5nIDxmZ290dHNjaGxpbmdAZWx0ZWMuZGU+CiAKIAlNSFBDCQkJTVBDOHh4CkBAIC0xNzksNiArMTg0LDEwIEBACiAKIAlNVlMxCQkJTVBDODIzCiAKK0pvZSBIYW1tYW4gPGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20+CisKKwlzYmM4NjQxZAkJTVBDODY0MUQKKwogS2xhdXMgSGV5ZGVjayA8aGV5ZGVja0BraWViYWNrLXBldGVyLmRlPgogCiAJS1VQNEsJCQlNUEM4NTUKQEAgLTI0OCw2ICsyNTcsNyBAQAogSm9obiBPdGtlbiA8am90a2VuQHNvZnRhZHZhbmNlcy5jb20+CiAKIAlsdWFuCQkJUFBDNDQwU1AKKwl0YWlodQkJCVBQQzQwNUVQCiAKIEtlaXRoIE91dHdhdGVyIDxLZWl0aF9PdXR3YXRlckBtdmlzLmNvbT4KIApAQCAtMjkyLDYgKzMwMiw3IEBACiAJd2FsbnV0CQkJUFBDNDA1R1AKIAl5ZWxsb3dzdG9uZQkJUFBDNDQwR1IKIAl5b3NlbWl0ZQkJUFBDNDQwRVAKKwl6ZXVzCQkJUFBDNDA1RVAKIAogCVAzTTc1MAkJCVBQQzc1MEZYL0dYL0dMCiAKQEAgLTQ0NCw2ICs0NTUsMTIgQEAKIAogCW9tYXAxNjEwaDIJCUFSTTkyNkVKUwogCitTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKworCURWLUVWTQkJCUFSTTkyNkVKUworCVNPTkFUQQkJCUFSTTkyNkVKUworCVNDSE1PT0dJRQkJQVJNOTI2RUpTCisKIFByYWthc2ggS3VtYXIgPHByYWthc2hAZW1iZWR4LmNvbT4KIAogCWNlcmYyNTAJCQl4c2NhbGUKZGlmZiAtLWdpdCBhL01BS0VBTEwgYi9NQUtFQUxMCmluZGV4IGY5MzFlMWQuLjEyMTlmYjMgMTAwNzU1Ci0tLSBhL01BS0VBTEwKKysrIGIvTUFLRUFMTApAQCAtMjYsMTE1ICsyNiwyODUgQEAKICMjIE1QQzV4eCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfNXh4PSIJXAotCWNtaV9tcGM1eHgJCQkJCQkJXAorTElTVF81eHg9IgkJXAorCWNtaV9tcGM1eHgJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBNUEM1eHh4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF81eHh4PSIJXAotCUJDMzQ1MAkJY3BjaTUyMDAJRVZBTDUyMDAJZm8zMDAJCVwKLQlpY2VjdWJlXzUxMDAJaWNlY3ViZV81MjAwCWxpdGU1MjAwYgltY2MyMDAJCVwKLQltZWNwNTIwMAltb3Rpb25wcm8JbzJkbnQJCXBmNTIwMAkJXAotCVBNNTIwCQlUQjUyMDAJCVRvdGFsNTEwMAlUb3RhbDUyMDAJXAotCVRvdGFsNTIwMF9SZXYyCVRRTTUyMDAJCVRRTTUyMDBfQglUUU01MjAwUwlcCi0JdjM4YgkJCQkJCQkJXAorTElTVF81eHh4PSIJCVwKKwlCQzM0NTAJCVwKKwljbTUyMDAJCVwKKwljcGNpNTIwMAlcCisJRVZBTDUyMDAJXAorCWZvMzAwCQlcCisJaWNlY3ViZV81MTAwCVwKKwlpY2VjdWJlXzUyMDAJXAorCWxpdGU1MjAwYglcCisJbWNjMjAwCQlcCisJbWVjcDUyMDAJXAorCW1vdGlvbnBybwlcCisJbzJkbnQJCVwKKwlwZjUyMDAJCVwKKwlQTTUyMAkJXAorCVRCNTIwMAkJXAorCVRvdGFsNTEwMAlcCisJVG90YWw1MjAwCVwKKwlUb3RhbDUyMDBfUmV2MglcCisJVFFNNTIwMAkJXAorCVRRTTUyMDBfQglcCisJVFFNNTIwMFMJXAorCXYzOGIJCVwKKyIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgTVBDNTEyeCBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0xJU1RfNTEyeD0iCQlcCisJYWRzNTEyMQkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBNUEM4eHggU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTElTVF84eHg9IglcCi0JQWRkZXI4N3gJR0VOSUVUVgkJTUJYODYwVAkJUjM2ME1QSQkJXAotCUFkZGVySUkJCUdUSAkJTUhQQwkJUkJDODIzCQlcCi0JQURTODYwCQloZXJtZXMJCU1QQzg2eEFEUwlybXUJCVwKLQlBTVg4NjAJCUlBRDIxMAkJTVBDODg1QURTCVJQWENsYXNzaWMJXAotCWMybW9uCQlJQ1U4NjJfMTAwTUh6CU1WUzEJCVJQWGxpdGUJCVwKLQlDQ00JCUlQODYwCQlORVRQSE9ORQlSUFhsaXRlX0RXCVwKLQljb2dlbnRfbXBjOHh4CUlWTUwyNAkJTkVUVEEJCVJSdmlzaW9uCVwKLQlFTFBUODYwCQlJVk1MMjRfMTI4CU5FVFRBMgkJU004NTAJCVwKLQlFUDg4eAkJSVZNTDI0XzI1NglORVRUQV9JU0ROCXNwYzE5MjAJCVwKLQlFU1RFRU0xOTJFCUlWTVM4CQlORVRWSUEJCVNQRDgyM1RTCVwKLQlFVFgwOTQJCUlWTVM4XzEyOAlORVRWSUFfVjIJc3ZtX3NjOHh4CVwKLQlGQURTODIzCQlJVk1TOF8yNTYJTlg4MjMJCVNYTkk4NTVUCVwKLQlGQURTODUwU0FSCUtVUDRLCQlwY3VfZQkJVE9QODYwCQlcCi0JRkFEUzg2MFQJS1VQNFgJCVFTODIzCQlUUU04MjNMCQlcCi0JRkxBR0FETQkJTEFOVEVDCQlRUzg1MAkJVFFNODIzTF9MQ0QJXAotCUZQUzg1MEwJCWx3bW9uCQlRUzg2MFQJCVRRTTg1MEwJCVwKLQlHRU44NjBUCQlNQlgJCXF1YW50dW0JCVRRTTg1NUwJCVwKLQlHRU44NjBUX1NDCQkJCQlUUU04NjBMCQlcCi0JCQkJCQkJVFFNODg1RAkJXAotCQkJCQkJCXVjMTAwCQlcCi0JCQkJCQkJdjM3CQlcCitMSVNUXzh4eD0iCQlcCisJQWRkZXI4N3gJXAorCUFkZGVySUkJCVwKKwlBRFM4NjAJCVwKKwlBTVg4NjAJCVwKKwljMm1vbgkJXAorCUNDTQkJXAorCWNvZ2VudF9tcGM4eHgJXAorCUVMUFQ4NjAJCVwKKwlFUDg4eAkJXAorCUVTVEVFTTE5MkUJXAorCUVUWDA5NAkJXAorCUZBRFM4MjMJCVwKKwlGQURTODUwU0FSCVwKKwlGQURTODYwVAlcCisJRkxBR0FETQkJXAorCUZQUzg1MEwJCVwKKwlHRU44NjBUCQlcCisJR0VOODYwVF9TQwlcCisJR0VOSUVUVgkJXAorCUdUSAkJXAorCWhlcm1lcwkJXAorCUlBRDIxMAkJXAorCUlDVTg2Ml8xMDBNSHoJXAorCUlQODYwCQlcCisJSVZNTDI0CQlcCisJSVZNTDI0XzEyOAlcCisJSVZNTDI0XzI1NglcCisJSVZNUzgJCVwKKwlJVk1TOF8xMjgJXAorCUlWTVM4XzI1NglcCisJS1VQNEsJCVwKKwlLVVA0WAkJXAorCUxBTlRFQwkJXAorCWx3bW9uCQlcCisJTUJYCQlcCisJTUJYODYwVAkJXAorCU1IUEMJCVwKKwlNUEM4NnhBRFMJXAorCU1QQzg4NUFEUwlcCisJTVZTMQkJXAorCU5FVFBIT05FCVwKKwlORVRUQQkJXAorCU5FVFRBMgkJXAorCU5FVFRBX0lTRE4JXAorCU5FVFZJQQkJXAorCU5FVFZJQV9WMglcCisJTlg4MjMJCVwKKwlwY3VfZQkJXAorCVFTODIzCQlcCisJUVM4NTAJCVwKKwlRUzg2MFQJCVwKKwlxdWFudHVtCQlcCisJUjM2ME1QSQkJXAorCVJCQzgyMwkJXAorCXJtdQkJXAorCVJQWENsYXNzaWMJXAorCVJQWGxpdGUJCVwKKwlSUFhsaXRlX0RXCVwKKwlSUnZpc2lvbglcCisJU004NTAJCVwKKwlzcGMxOTIwCQlcCisJU1BEODIzVFMJXAorCXN2bV9zYzh4eAlcCisJU1hOSTg1NVQJXAorCVRPUDg2MAkJXAorCVRRTTgyM0wJCVwKKwlUUU04MjNMX0xDRAlcCisJVFFNODUwTAkJXAorCVRRTTg1NUwJCVwKKwlUUU04NjBMCQlcCisJVFFNODg1RAkJXAorCXVjMTAwCQlcCisJdjM3CQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFBQQzR4eCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfNHh4PSIJXAotCWFjYWRpYQkJYWNhZGlhX25hbmQJQURDSU9QCQlhbHByCQlcCi0JQVAxMDAwCQlBUjQwNQkJQVNINDA1CQliYW1ib28JCVwKLQliYW1ib29fbmFuZAlidWJpbmdhCQlDQU5CVAkJQ01TNzAwCQlcCi0JQ1BDSTJEUAkJQ1BDSTQwNQkJQ1BDSTQwNTIJQ1BDSTQwNUFCCVwKLQlDUENJNDA1RFQJQ1BDSTQ0MAkJQ1BDSUlTRVI0CUNSQVlMMQkJXAotCWNzYjI3MgkJY3NiNDcyCQlEQVNBX1NJTQlEUDQwNQkJXAotCURVNDA1CQllYm9ueQkJRVJJQwkJRVhCSVRHRU4JXAotCUcyMDAwCQlISDQwNQkJSFVCNDA1CQlKU0UJCVwKLQlLQVJFRgkJa2F0bWFpCQlsdWFuCQlsd21vbjUJCVwKLQlNRVRST0JPWAlNSVA0MDUJCU1JUDQwNVQJCU1MMgkJXAotCW1sMzAwCQlvY290ZWEJCU9DUlRDCQlPUlNHCQlcCi0JcDNwNDQwCQlQQ0k0MDUJCXBjczQ0MGVwCVBJUDQwNQkJXAotCVBMVTQwNQkJUE1DNDA1CQlQUENoYW1lbGVvbkVWQglzYmM0MDUJCVwKLQlzYzMJCXNlcXVvaWEJCXNlcXVvaWFfbmFuZAl0YWlzaGFuCQlcCi0JVk9INDA1CQlWT000MDUJCVc3T0xNQwkJVzdPTE1HCQlcCi0Jd2FsbnV0CQlXVUg0MDUJCVhQRURJVEUxSwl5ZWxsb3dzdG9uZQlcCi0JeW9zZW1pdGUJeXVjY2EJCQkJCQlcCitMSVNUXzR4eD0iCQlcCisJYWNhZGlhCQlcCisJYWNhZGlhX25hbmQJXAorCUFEQ0lPUAkJXAorCWFscHIJCVwKKwlBUDEwMDAJCVwKKwlBUjQwNQkJXAorCUFTSDQwNQkJXAorCWJhbWJvbwkJXAorCWJhbWJvb19uYW5kCVwKKwlidWJpbmdhCQlcCisJQ0FOQlQJCVwKKwlDTVM3MDAJCVwKKwlDUENJMkRQCQlcCisJQ1BDSTQwNQkJXAorCUNQQ0k0MDUyCVwKKwlDUENJNDA1QUIJXAorCUNQQ0k0MDVEVAlcCisJQ1BDSTQ0MAkJXAorCUNQQ0lJU0VSNAlcCisJQ1JBWUwxCQlcCisJY3NiMjcyCQlcCisJY3NiNDcyCQlcCisJREFTQV9TSU0JXAorCURQNDA1CQlcCisJRFU0MDUJCVwKKwllYm9ueQkJXAorCUVSSUMJCVwKKwlFWEJJVEdFTglcCisJRzIwMDAJCVwKKwloY3U0CQlcCisJaGN1NQkJXAorCUhINDA1CQlcCisJSFVCNDA1CQlcCisJSlNFCQlcCisJS0FSRUYJCVwKKwlrYXRtYWkJCVwKKwlsdWFuCQlcCisJbHdtb241CQlcCisJTUVUUk9CT1gJXAorCU1JUDQwNQkJXAorCU1JUDQwNVQJCVwKKwlNTDIJCVwKKwltbDMwMAkJXAorCW9jb3RlYQkJXAorCU9DUlRDCQlcCisJT1JTRwkJXAorCXAzcDQ0MAkJXAorCVBDSTQwNQkJXAorCXBjczQ0MGVwCVwKKwlQSVA0MDUJCVwKKwlQTFU0MDUJCVwKKwlQTUM0MDUJCVwKKwlQUENoYW1lbGVvbkVWQglcCisJc2JjNDA1CQlcCisJc2MzCQlcCisJc2VxdW9pYQkJXAorCXNlcXVvaWFfbmFuZAlcCisJdGFpaHUJCVwKKwl0YWlzaGFuCQlcCisJVk9INDA1CQlcCisJVk9NNDA1CQlcCisJVzdPTE1DCQlcCisJVzdPTE1HCQlcCisJd2FsbnV0CQlcCisJV1VINDA1CQlcCisJWFBFRElURTFLCVwKKwl5ZWxsb3dzdG9uZQlcCisJeW9zZW1pdGUJXAorCXl1Y2NhCQlcCisJemV1cwkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBNUEM4MjIwIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF84MjIwPSIJXAotCUFsYXNrYTgyMjAJWXVrb244MjIwCQkJCQlcCitMSVNUXzgyMjA9IgkJXAorCUFsYXNrYTgyMjAJXAorCVl1a29uODIyMAlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1QQzgyNHggU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzgyNHg9IglcCi0JQTMwMDAJCWJhcmNvCQlCTVcJCUNQQzQ1CQlcCi0JQ1U4MjQJCWRlYnJpcwkJZVhhbGlvbgkJSElEREVOX0RSQUdPTglcCi0JCQlNT1VTU0UJCU1VU0VOS0kJCU1WQkxVRQkJXAotCU9YQwkJUE42MgkJU2FuZHBvaW50ODI0MAlTYW5kcG9pbnQ4MjQ1CVwKLQlzYmM4MjQwCQlTTDgyNDUJCXV0eDgyNDUJCQkJXAorTElTVF84MjR4PSIJCVwKKwlBMzAwMAkJXAorCWJhcmNvCQlcCisJQk1XCQlcCisJQ1BDNDUJCVwKKwlDVTgyNAkJXAorCWRlYnJpcwkJXAorCWVYYWxpb24JCVwKKwlISURERU5fRFJBR09OCVwKKwlNT1VTU0UJCVwKKwlNVVNFTktJCQlcCisJTVZCTFVFCQlcCisJT1hDCQlcCisJUE42MgkJXAorCVNhbmRwb2ludDgyNDAJXAorCVNhbmRwb2ludDgyNDUJXAorCXNiYzgyNDAJCVwKKwlTTDgyNDUJCVwKKwl1dHg4MjQ1CQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1QQzgyNjAgU3lzdGVtcyAoaW5jbHVkZXMgODI1MCwgODI1NSBldGMuKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzgyNjA9IglcCi0JYXRjCQljb2dlbnRfbXBjODI2MAlDUFU4NgkJQ1BVODcJCVwKLQllcDgyNDgJCWVwODI2MAkJZXA4Mnh4bQkJZ3c4MjYwCQlcCi0JaHltb2QJCUlQSEFTRTQ1MzkJSVNQQU4JCU1QQzgyNjBBRFMJXAotCU1QQzgyNjZBRFMJTVBDODI3MkFEUwlQTTgyNgkJUE04MjgJCVwKLQlwcG1jODI2MAlSYXR0bGVyODI0OAlSUFhzdXBlcglyc2Rwcm90bwlcCi0Jc2Fjc25nCQlzYmM4MjYwCQlTQ00JCVRRTTgyNjBfQUMJXAotCVRRTTgyNjBfQUQJVFFNODI2MF9BRQlaUEMxOTAwCQkJCVwKK0xJU1RfODI2MD0iCQlcCisJYXRjCQlcCisJY29nZW50X21wYzgyNjAJXAorCUNQVTg2CQlcCisJQ1BVODcJCVwKKwllcDgyNDgJCVwKKwllcDgyNjAJCVwKKwllcDgyeHhtCQlcCisJZ3c4MjYwCQlcCisJaHltb2QJCVwKKwlJUEhBU0U0NTM5CVwKKwlJU1BBTgkJXAorCU1QQzgyNjBBRFMJXAorCU1QQzgyNjZBRFMJXAorCU1QQzgyNzJBRFMJXAorCVBNODI2CQlcCisJUE04MjgJCVwKKwlwcG1jODI2MAlcCisJUmF0dGxlcjgyNDgJXAorCVJQWHN1cGVyCVwKKwlyc2Rwcm90bwlcCisJc2Fjc25nCQlcCisJc2JjODI2MAkJXAorCVNDTQkJXAorCVRRTTgyNjBfQUMJXAorCVRRTTgyNjBfQUQJXAorCVRRTTgyNjBfQUUJXAorCVpQQzE5MDAJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDODN4eCBTeXN0ZW1zIChpbmNsdWRlcyA4MzQ5LCBldGMuKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzgzeHg9IglcCi0JTVBDODMxM0VSREIJTVBDODMyWEVNRFMJTVBDODM0OUVNRFMJTVBDODM0OUlUWAlcCi0JTVBDODM0OUlUWEdQCU1QQzgzNjBFTURTCXNiYzgzNDkJCVRRTTgzNHgJCVwKK0xJU1RfODN4eD0iCQlcCisJTVBDODMxM0VSREJfMzMJXAorCU1QQzgzMTNFUkRCXzY2CVwKKwlNUEM4MzJYRU1EUwlcCisJTVBDODM0OUVNRFMJXAorCU1QQzgzNDlJVFgJXAorCU1QQzgzNDlJVFhHUAlcCisJTVBDODM2MEVNRFMJXAorCXNiYzgzNDkJCVwKKwlUUU04MzR4CQlcCiAiCiAKIApAQCAtMTQyLDEyMyArMzEyLDIyNyBAQAogIyMgTVBDODV4eCBTeXN0ZW1zIChpbmNsdWRlcyA4NTQwLCA4NTYwIGV0Yy4pCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfODV4eD0iCVwKLQlNUEM4NTQwQURTCU1QQzg1NDBFVkFMCU1QQzg1NDFDRFMJTVBDODU0NERTCVwKLQlNUEM4NTQ4Q0RTCU1QQzg1NTVDRFMJTVBDODU2MEFEUwlQTTg1NAkJXAotCVBNODU2CQlzYmM4NTQwCQlzYmM4NTYwCQlzdHhncDMJCVwKLQlzdHhzc2EJCVRRTTg1NDAJCVRRTTg1NDEJCVRRTTg1NTUJCVwKLQlUUU04NTYwCQkJCQkJCQlcCitMSVNUXzg1eHg9IgkJXAorCU1QQzg1NDBBRFMJXAorCU1QQzg1NDBFVkFMCVwKKwlNUEM4NTQxQ0RTCVwKKwlNUEM4NTQ0RFMJXAorCU1QQzg1NDhDRFMJXAorCU1QQzg1NTVDRFMJXAorCU1QQzg1NjBBRFMJXAorCU1QQzg1NjhNRFMJXAorCVBNODU0CQlcCisJUE04NTYJCVwKKwlzYmM4NTQwCQlcCisJc2JjODU2MAkJXAorCXN0eGdwMwkJXAorCXN0eHNzYQkJXAorCVRRTTg1NDAJCVwKKwlUUU04NTQxCQlcCisJVFFNODU1NQkJXAorCVRRTTg1NjAJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDODZ4eCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfODZ4eD0iCVwKLSAgICBNUEM4NjQxSFBDTglcCitMSVNUXzg2eHg9IgkJXAorCU1QQzg2NDFIUENOCVwKKwlTQkM4NjQxRAlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIDc0eHgvN3h4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF83NHh4PSIJXAotCURCNjQzNjAJCURCNjQ0NjAJCUVWQjY0MjYwCVAzRzQJCVwKLQlwM203NDQ4CQlQQ0lQUEMyCQlQQ0lQUEM2CQlaVU1BCQlcCi0JbXBjNzQ0OGhwYzIKK0xJU1RfNzR4eD0iCQlcCisJREI2NDM2MAkJXAorCURCNjQ0NjAJCVwKKwlFVkI2NDI2MAlcCisJbXBjNzQ0OGhwYzIJXAorCVAzRzQJCVwKKwlwM203NDQ4CQlcCisJUENJUFBDMgkJXAorCVBDSVBQQzYJCVwKKwlaVU1BCQlcCiAiCiAKLUxJU1RfN3h4PSIJXAotCUJBQjd4eAkJQ1BDSTc1MAkJRUxQUEMJCXAzbTc1MAkJXAotCXBwbWM3eHgJCQkJCQkJCVwKK0xJU1RfN3h4PSIJCVwKKwlCQUI3eHgJCVwKKwlDUENJNzUwCQlcCisJRUxQUEMJCVwKKwlwM203NTAJCVwKKwlwcG1jN3h4CQlcCiAiCiAKLUxJU1RfcHBjPSIke0xJU1RfNXh4fSAgJHtMSVNUXzV4eHh9CQlcCi0JICAke0xJU1RfOHh4fQkJCQlcCi0JICAke0xJU1RfODIyMH0gJHtMSVNUXzgyNHh9ICR7TElTVF84MjYwfSBcCi0JICAke0xJU1RfODN4eH0JCQkJXAotCSAgJHtMSVNUXzg1eHh9CQkJCVwKLQkgICR7TElTVF84Nnh4fQkJCQlcCi0JICAke0xJU1RfNHh4fQkJCQlcCi0JICAke0xJU1RfNzR4eH0gJHtMSVNUXzd4eH0iCitMSVNUX3BwYz0iCQlcCisJJHtMSVNUXzV4eH0JXAorCSR7TElTVF81eHh4fQlcCisJJHtMSVNUXzh4eH0JXAorCSR7TElTVF84MjIwfQlcCisJJHtMSVNUXzgyNHh9CVwKKwkke0xJU1RfODI2MH0JXAorCSR7TElTVF84M3h4fQlcCisJJHtMSVNUXzg1eHh9CVwKKwkke0xJU1RfODZ4eH0JXAorCSR7TElTVF80eHh9CVwKKwkke0xJU1RfNzR4eH0JXAorCSR7TElTVF83eHh9CVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgU3Ryb25nQVJNIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9TQT0iYXNzYWJldCBkbnAxMTEwIGdjcGx1cyBsYXJ0IHNoYW5ub24iCitMSVNUX1NBPSIJCVwKKwlhc3NhYmV0CQlcCisJZG5wMTExMAkJXAorCWdjcGx1cwkJXAorCWxhcnQJCVwKKwlzaGFubm9uCQlcCisiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEFSTTcgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX0FSTTc9IglcCi0JYXJtYWRpbGxvCUIyCQllcDczMTIJCWV2YjQ1MTAJCVwKLQlpbXBhNwkJaW50ZWdyYXRvcmFwCWFwNwkJYXA3MjB0CQlcCi0JbHBjMjI5MnNvZGltbQltb2RuZXQ1MAlTTU40MgkJCQlcCitMSVNUX0FSTTc9IgkJXAorCWFwNwkJXAorCWFwNzIwdAkJXAorCWFybWFkaWxsbwlcCisJQjIJCVwKKwllcDczMTIJCVwKKwlldmI0NTEwCQlcCisJaW1wYTcJCVwKKwlpbnRlZ3JhdG9yYXAJXAorCWxwYzIyOTJzb2RpbW0JXAorCW1vZG5ldDUwCVwKKwlTTU40MgkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBBUk05IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9BUk05PSIJXAotCWF0OTFybTkyMDBkawljbWNfcHUyCQkJCQkJXAotCWFwOTIwdAkJYXA5MjJfWEExMAlhcDkyNmVqcwlhcDk0NmVzCQlcCi0JYXA5NjYJCWNwOTIwdAkJY3A5MjJfWEExMAljcDkyNmVqcwlcCi0JY3A5NDZlcwkJY3A5NjYJCWxwZDdhNDAwCW1wMnVzYgkJXAotCW14MWFkcwkJbXgxZnMyCQluZXRzdGFyCQlvbWFwMTUxMGlubglcCi0Jb21hcDE2MTBoMglvbWFwMTYxMGlubglvbWFwNzMwcDIJc2JjMjQxMHgJXAotCXNjYjkzMjgJCXNtZGsyNDAwCXNtZGsyNDEwCXRyYWIJCVwKLQlWQ01BOQkJdmVyc2F0aWxlCXZlcnNhdGlsZWFiCXZlcnNhdGlsZXBiCVwKLQl2b2ljZWJsdWUJCQkJCQkJXAorTElTVF9BUk05PSIJCQlcCisJYXQ5MXJtOTIwMGRrCQlcCisJY21jX3B1MgkJCVwKKwlhcDkyMHQJCQlcCisJYXA5MjJfWEExMAkJXAorCWFwOTI2ZWpzCQlcCisJYXA5NDZlcwkJCVwKKwlhcDk2NgkJCVwKKwljcDkyMHQJCQlcCisJY3A5MjJfWEExMAkJXAorCWNwOTI2ZWpzCQlcCisJY3A5NDZlcwkJCVwKKwljcDk2NgkJCVwKKwlscGQ3YTQwMAkJXAorCW1wMnVzYgkJCVwKKwlteDFhZHMJCQlcCisJbXgxZnMyCQkJXAorCW5ldHN0YXIJCQlcCisJb21hcDE1MTBpbm4JCVwKKwlvbWFwMTYxMGgyCQlcCisJb21hcDE2MTBpbm4JCVwKKwlvbWFwNzMwcDIJCVwKKwlzYmMyNDEweAkJXAorCXNjYjkzMjgJCQlcCisJc21kazI0MDAJCVwKKwlzbWRrMjQxMAkJXAorCXRyYWIJCQlcCisJVkNNQTkJCQlcCisJdmVyc2F0aWxlCQlcCisJdmVyc2F0aWxlYWIJCVwKKwl2ZXJzYXRpbGVwYgkJXAorCXZvaWNlYmx1ZQkJXAorCWRhdmluY2lfZHZldm0JCVwKKwlkYXZpbmNpX3NjaG1vb2dpZQlcCisJZGF2aW5jaV9zb25hdGEJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQVJNMTAgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTElTVF9BUk0xMD0iCVwKLQlpbnRlZ3JhdG9yY3AJY3AxMDI2CQkJCQkJXAorTElTVF9BUk0xMD0iCQlcCisJaW50ZWdyYXRvcmNwCVwKKwljcDEwMjYJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQVJNMTEgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTElTVF9BUk0xMT0iCVwKLQljcDExMzYJCW9tYXAyNDIwaDQJCQkJCVwKK0xJU1RfQVJNMTE9IgkJXAorCWNwMTEzNgkJXAorCW9tYXAyNDIwaDQJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBYc2NhbGUgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX3B4YT0iCVwKLQlhZHN2aXgJCWNlcmYyNTAJCWNyYWRsZQkJY3NiMjI2CQlcCi0JZGVsdGEJCWlubm9rb20JCWx1YmJvY2sJCXBsZWIyCQlcCi0JcHhhMjU1X2lkcAl3ZXBlcDI1MAl4YWVuaWF4CQl4bTI1MAkJXAotCXhzZW5naW5lCXp5bG9uaXRlCQkJCQlcCitMSVNUX3B4YT0iCQlcCisJYWRzdml4CQlcCisJY2VyZjI1MAkJXAorCWNyYWRsZQkJXAorCWNzYjIyNgkJXAorCWRlbHRhCQlcCisJaW5ub2tvbQkJXAorCWx1YmJvY2sJCVwKKwlwbGViMgkJXAorCXB4YTI1NV9pZHAJXAorCXdlcGVwMjUwCVwKKwl4YWVuaWF4CQlcCisJeG0yNTAJCVwKKwl4c2VuZ2luZQlcCisJenlsb25pdGUJXAogIgogCi1MSVNUX2l4cD0iaXhkcDQyNQlpeGRwZzQyNQlwZG5iMwkJc2NwdSIKK0xJU1RfaXhwPSIJCVwKKwlpeGRwNDI1CQlcCisJaXhkcGc0MjUJXAorCXBkbmIzCQlcCisJc2NwdQkJXAorIgogCiAKLUxJU1RfYXJtPSIJXAotCSR7TElTVF9TQX0JCQkJCQkJXAotCSR7TElTVF9BUk03fSAke0xJU1RfQVJNOX0gJHtMSVNUX0FSTTEwfSAke0xJU1RfQVJNMTF9CQlcCi0JJHtMSVNUX3B4YX0gJHtMSVNUX2l4cH0JCQkJCQlcCitMSVNUX2FybT0iCQlcCisJJHtMSVNUX1NBfQlcCisJJHtMSVNUX0FSTTd9CVwKKwkke0xJU1RfQVJNOX0JXAorCSR7TElTVF9BUk0xMH0JXAorCSR7TElTVF9BUk0xMX0JXAorCSR7TElTVF9weGF9CVwKKwkke0xJU1RfaXhwfQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1JUFMgU3lzdGVtcwkJKGRlZmF1bHQgPSBiaWcgZW5kaWFuKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX21pcHM0a2M9ImluY2FpcCIKK0xJU1RfbWlwczRrYz0iCQlcCisJaW5jYWlwCQlcCisiCiAKLUxJU1RfbWlwczVrYz0icHVycGxlIgorTElTVF9taXBzNWtjPSIJCVwKKwlwdXJwbGUJCVwKKyIKIAotTElTVF9hdTF4eDA9ImRiYXUxMDAwIGRiYXUxMTAwIGRiYXUxNTAwIGRiYXUxNTUwIGRiYXUxNTUwX2VsIGd0aDIiCitMSVNUX2F1MXh4MD0iCQlcCisJZGJhdTEwMDAJXAorCWRiYXUxMTAwCVwKKwlkYmF1MTUwMAlcCisJZGJhdTE1NTAJXAorCWRiYXUxNTUwX2VsCVwKKwlndGgyCQlcCisiCiAKLUxJU1RfbWlwcz0iJHtMSVNUX21pcHM0a2N9ICR7TElTVF9taXBzNWtjfSAke0xJU1RfYXUxeHgwfSIKK0xJU1RfbWlwcz0iCQlcCisJJHtMSVNUX21pcHM0a2N9CVwKKwkke0xJU1RfbWlwczVrY30JXAorCSR7TElTVF9hdTF4eDB9CVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTUlQUyBTeXN0ZW1zCQkobGl0dGxlIGVuZGlhbikKQEAgLTI2OCwzNiArNTQyLDU1IEBACiAKIExJU1RfbWlwczVrY19lbD0iIgogCi1MSVNUX2F1MXh4MF9lbD0iZGJhdTE1NTBfZWwiCitMSVNUX2F1MXh4MF9lbD0iCVwKKwlkYmF1MTU1MF9lbAlcCisiCiAKLUxJU1RfbWlwc19lbD0iJHtMSVNUX21pcHM0a2NfZWx9ICR7TElTVF9taXBzNWtjX2VsfSAke0xJU1RfYXUxeHgwX2VsfSIKK0xJU1RfbWlwc19lbD0iCQkJXAorCSR7TElTVF9taXBzNGtjX2VsfQlcCisJJHtMSVNUX21pcHM1a2NfZWx9CVwKKwkke0xJU1RfYXUxeHgwX2VsfQlcCisiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIGkzODYgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX0k0ODY9InNjNTIwX2NkcCBzYzUyMF9zcHVuayBzYzUyMF9zcHVua19yZWwiCitMSVNUX0k0ODY9IgkJXAorCXNjNTIwX2NkcAlcCisJc2M1MjBfc3B1bmsJXAorCXNjNTIwX3NwdW5rX3JlbAlcCisiCiAKLUxJU1RfeDg2PSIke0xJU1RfSTQ4Nn0iCitMSVNUX3g4Nj0iCQlcCisJJHtMSVNUX0k0ODZ9CVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTklPUyBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1Rfbmlvcz0iCVwKLQlBRE5QRVNDMQkJQUROUEVTQzFfYmFzZV8zMgkJCVwKLQlBRE5QRVNDMV9ETlBFVkEyX2Jhc2VfMzIJCQkJCVwKLQlESzFDMjAJCQlESzFDMjBfc3RhbmRhcmRfMzIJCQlcCi0JREsxUzEwCQkJREsxUzEwX3N0YW5kYXJkXzMyIERLMVMxMF9tdHhfbGRrXzIwCVwKK0xJU1Rfbmlvcz0iCQkJXAorCUFETlBFU0MxCQlcCisJQUROUEVTQzFfYmFzZV8zMglcCisJQUROUEVTQzFfRE5QRVZBMl9iYXNlXzMyXAorCURLMUMyMAkJCVwKKwlESzFDMjBfc3RhbmRhcmRfMzIJXAorCURLMVMxMAkJCVwKKwlESzFTMTBfc3RhbmRhcmRfMzIJXAorCURLMVMxMF9tdHhfbGRrXzIwCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTmlvcy1JSSBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfbmlvczI9IglcCi0JRVAxQzIwCQlFUDFTMTAJCUVQMVM0MAkJCQlcCi0JUENJNTQ0MQkJUEsxQzIwCQkJCQkJXAorTElTVF9uaW9zMj0iCQlcCisJRVAxQzIwCQlcCisJRVAxUzEwCQlcCisJRVAxUzQwCQlcCisJUENJNTQ0MQkJXAorCVBLMUMyMAkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0zMDUsMzEgKzU5OCw0NCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBMSVNUX21pY3JvYmxhemU9IglcCi0Jc3V6YWt1CQltbDQwMQkJeHVwdjJwCisJc3V6YWt1CQlcCisJbWw0MDEJCVwKKwl4dXB2MnAJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQ29sZEZpcmUgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX2NvbGRmaXJlPSIJXAotCWNvYnJhNTI3MglFQitNQ0YtRVYxMjMJRUIrTUNGLUVWMTIzX2ludGVybmFsCQlcCi0JaWRtcgkJTTUyNzFFVkIJTTUyNzJDMwkJTTUyODJFVkIJXAotCVRBU1JFRwkJcjUyMDAJCU01MjcxRVZCCQkJXAorTElTVF9jb2xkZmlyZT0iCQkJXAorCWNvYnJhNTI3MgkJXAorCUVCK01DRi1FVjEyMwkJXAorCUVCK01DRi1FVjEyM19pbnRlcm5hbAlcCisJaWRtcgkJCVwKKwlNNTI3MUVWQgkJXAorCU01MjcyQzMJCQlcCisJTTUyODJFVkIJCVwKKwlUQVNSRUcJCQlcCisJcjUyMDAJCQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEFWUjMyIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9hdnIzMj0iYXRzdGsxMDAyIgorTElTVF9hdnIzMj0iCQlcCisJYXRzdGsxMDAyCVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQmxhY2tmaW4gU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX2JsYWNrZmluPSIgXAotCWJmNTMzLWV6a2l0CWJmNTMzLXN0YW1wCWJmNTM3LXN0YW1wCWJmNTYxLWV6a2l0CVwKK0xJU1RfYmxhY2tmaW49IgkJXAorCWJmNTMzLWV6a2l0CVwKKwliZjUzMy1zdGFtcAlcCisJYmY1Mzctc3RhbXAJXAorCWJmNTYxLWV6a2l0CVwKICIKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNjUsNyArNjcxLDcgQEAKIAltaWNyb2JsYXplfCBcCiAJbWlwc3xtaXBzX2VsfCBcCiAJbmlvc3xuaW9zMnwgXAotCXBwY3w1eHh8NXh4eHw4eHh8ODIyMHw4MjR4fDgyNjB8ODN4eHw4NXh4fDg2eHh8NHh4fDd4eHw3NHh4fCBcCisJcHBjfDV4eHw1eHh4fDUxMnh8OHh4fDgyMjB8ODI0eHw4MjYwfDgzeHh8ODV4eHw4Nnh4fDR4eHw3eHh8NzR4eHwgXAogCXg4NnxJNDg2KQogCQkJZm9yIHRhcmdldCBpbiBgZXZhbCBlY2hvICckTElTVF8nJHthcmd9YAogCQkJZG8KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNjI2MjgzZi4uOWRlZTk0OCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTM0LDYgKzM0LDcgQEAKIAkgICAgLWUgcy9hcm0uKi9hcm0vIFwKIAkgICAgLWUgcy9zYTExMC9hcm0vIFwKIAkgICAgLWUgcy9wb3dlcnBjL3BwYy8gXAorCSAgICAtZSBzL3BwYzY0L3BwYy8gXAogCSAgICAtZSBzL21hY3BwYy9wcGMvKQogCiBIT1NUT1MgOj0gJChzaGVsbCB1bmFtZSAtcyB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgXApAQCAtMTIyLDcgKzEyMyw3IEBACiBDUk9TU19DT01QSUxFID0KIGVsc2UKIGlmZXEgKCQoQVJDSCkscHBjKQotQ1JPU1NfQ09NUElMRSA9IHBvd2VycGMtbGludXgtCitDUk9TU19DT01QSUxFID0gcHBjXzh4eC0KIGVuZGlmCiBpZmVxICgkKEFSQ0gpLGFybSkKIENST1NTX0NPTVBJTEUgPSBhcm0tbGludXgtCkBAIC0yMDUsMTEgKzIwNiwxNSBAQAogTElCUyArPSBydGMvbGlicnRjLmEKIExJQlMgKz0gZHR0L2xpYmR0dC5hCiBMSUJTICs9IGRyaXZlcnMvbGliZHJpdmVycy5hCitMSUJTICs9IGRyaXZlcnMvYmlvc19lbXVsYXRvci9saWJhdGliaW9zZW11LmEKIExJQlMgKz0gZHJpdmVycy9uYW5kL2xpYm5hbmQuYQogTElCUyArPSBkcml2ZXJzL25hbmRfbGVnYWN5L2xpYm5hbmRfbGVnYWN5LmEKIGlmZXEgKCQoQ1BVKSxtcGM4M3h4KQogTElCUyArPSBkcml2ZXJzL3FlL3FlLmEKIGVuZGlmCitpZmVxICgkKENQVSksbXBjODV4eCkKK0xJQlMgKz0gZHJpdmVycy9xZS9xZS5hCitlbmRpZgogTElCUyArPSBkcml2ZXJzL3NrOThsaW4vbGlic2s5OGxpbi5hCiBMSUJTICs9IHBvc3QvbGlicG9zdC5hIHBvc3QvZHJpdmVycy9saWJwb3N0ZHJpdmVycy5hCiBMSUJTICs9ICQoc2hlbGwgaWYgWyAtZCBwb3N0L2xpYl8kKEFSQ0gpIF07IHRoZW4gZWNobyBcCkBAIC0yNDcsNyArMjUyLDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotQUxMID0gJChvYmopdS1ib290LnNyZWMgJChvYmopdS1ib290LmJpbiAkKG9iailTeXN0ZW0ubWFwICQoVV9CT09UX05BTkQpCitBTEwgKz0gJChvYmopdS1ib290LnNyZWMgJChvYmopdS1ib290LmJpbiAkKG9iailTeXN0ZW0ubWFwICQoVV9CT09UX05BTkQpCiAKIGFsbDoJCSQoQUxMKQogCkBAIC0yNjcsNiArMjcyLDkgQEAKIAkJCXNlZCAtZSAncy8iWwkgXSokJC8gZm9yICQoQk9BUkQpIGJvYXJkIi8nKSBcCiAJCS1kICQ8ICRACiAKKyQob2JqKXUtYm9vdC5zaGExOgkkKG9iail1LWJvb3QuYmluCisJCSQob2JqKXRvb2xzL3Vic2hhMSAkKG9iail1LWJvb3QuYmluCisKICQob2JqKXUtYm9vdC5kaXM6CSQob2JqKXUtYm9vdAogCQkkKE9CSkRVTVApIC1kICQ8ID4gJEAKIApAQCAtNDI2LDcgKzQzNCw3IEBACiAJQCQoTUtDT05GSUcpIGp1cGl0ZXIgcHBjIG1wYzV4eHgganVwaXRlcgogCiB2MzhiX2NvbmZpZzogdW5jb25maWcKLQlALi9ta2NvbmZpZyAtYSB2MzhiIHBwYyBtcGM1eHh4IHYzOGIKKwlAJChNS0NPTkZJRykgLWEgdjM4YiBwcGMgbXBjNXh4eCB2MzhiCiAKIGlua2E0eDBfY29uZmlnOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSBpbmthNHgwIHBwYyBtcGM1eHh4IGlua2E0eDAKQEAgLTUyOSw2ICs1MzcsOSBAQAogc21tYWNvNF9jb25maWc6IHVuY29uZmlnCiAJQCQoTUtDT05GSUcpIC1hIHNtbWFjbzQgcHBjIG1wYzV4eHggdHFtNTIwMAogCitjbTUyMDBfY29uZmlnOgl1bmNvbmZpZworCUAuL21rY29uZmlnIC1hIGNtNTIwMCBwcGMgbXBjNXh4eCBjbTUyMDAKKwogc3BpZXZhbF9jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpIC1hIHNwaWV2YWwgcHBjIG1wYzV4eHggdHFtNTIwMAogCkBAIC02MzEsNiArNjQyLDEzIEBACiAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgTVBDNTEyeCBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCithZHM1MTIxX2NvbmZpZzogdW5jb25maWcKKwlAJChNS0NPTkZJRykgYWRzNTEyMSBwcGMgbXBjNTEyeCBhZHM1MTIxCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDOHh4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtNjQzLDYgKzY2MSw5IEBACiAJQGVjaG8gIiNkZWZpbmUgQ09ORklHX01QQzg1MlQiID4gJChvYmopaW5jbHVkZS9jb25maWcuaCkKIAlAJChNS0NPTkZJRykgLWEgQWRkZXIgcHBjIG1wYzh4eCBhZGRlcgogCitBZGRlclVTQl9jb25maWc6CXVuY29uZmlnCisJQC4vbWtjb25maWcgLWEgQWRkZXJVU0IgcHBjIG1wYzh4eCBhZGRlcgorCiBBRFM4NjBfY29uZmlnICAgICBcCiBGQURTODIzX2NvbmZpZyAgICBcCiBGQURTODUwU0FSX2NvbmZpZyBcCkBAIC0xMDE3LDkgKzEwMzgsOCBAQAogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBwcGM0eHggYWNhZGlhIGFtY2MKIAogYWNhZGlhX25hbmRfY29uZmlnOgl1bmNvbmZpZwotCUBta2RpciAtcCAkKG9iailpbmNsdWRlCi0JQG1rZGlyIC1wICQob2JqKW5hbmRfc3BsCi0JQG1rZGlyIC1wICQob2JqKWJvYXJkL2FtY2MvYWNhZGlhCisJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUgJChvYmopYm9hcmQvYW1jYy9hY2FkaWEKKwlAbWtkaXIgLXAgJChvYmopbmFuZF9zcGwvYm9hcmQvYW1jYy9hY2FkaWEKIAlAZWNobyAiI2RlZmluZSBDT05GSUdfTkFORF9VX0JPT1QiID4gJChvYmopaW5jbHVkZS9jb25maWcuaAogCUAkKE1LQ09ORklHKSAtbiAkQCAtYSBhY2FkaWEgcHBjIHBwYzR4eCBhY2FkaWEgYW1jYwogCUBlY2hvICJURVhUX0JBU0UgPSAweDAxMDAwMDAwIiA+ICQob2JqKWJvYXJkL2FtY2MvYWNhZGlhL2NvbmZpZy50bXAKQEAgLTEwMjksNyArMTA0OSw3IEBACiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBhZGNpb3AgZXNkCiAKIGFscHJfY29uZmlnOgl1bmNvbmZpZwotCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBhbHByIHByb2RyaXZlCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBhbHByIHByb2RyaXZlCiAKIEFQMTAwMF9jb25maWc6dW5jb25maWcKIAlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgcHBjNHh4IGFwMTAwMCBhbWlyaXgKQEAgLTEwNDcsOSArMTA2Nyw4IEBACiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBiYW1ib28gYW1jYwogCiBiYW1ib29fbmFuZF9jb25maWc6CXVuY29uZmlnCi0JQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKLQlAbWtkaXIgLXAgJChvYmopbmFuZF9zcGwKLQlAbWtkaXIgLXAgJChvYmopYm9hcmQvYW1jYy9iYW1ib28KKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZSAkKG9iailib2FyZC9hbWNjL2JhbWJvbworCUBta2RpciAtcCAkKG9iailuYW5kX3NwbC9ib2FyZC9hbWNjL2JhbWJvbwogCUBlY2hvICIjZGVmaW5lIENPTkZJR19OQU5EX1VfQk9PVCIgPiAkKG9iailpbmNsdWRlL2NvbmZpZy5oCiAJQCQoTUtDT05GSUcpIC1uICRAIC1hIGJhbWJvbyBwcGMgcHBjNHh4IGJhbWJvbyBhbWNjCiAJQGVjaG8gIlRFWFRfQkFTRSA9IDB4MDEwMDAwMDAiID4gJChvYmopYm9hcmQvYW1jYy9iYW1ib28vY29uZmlnLnRtcApAQCAtMTEyMyw2ICsxMTQyLDEyIEBACiBHMjAwMF9jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBnMjAwMAogCitoY3U0X2NvbmZpZzoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgcHBjNHh4IGhjdTQgbmV0c3RhbAorCitoY3U1X2NvbmZpZzoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgcHBjNHh4IGhjdTUgbmV0c3RhbAorCiBISDQwNV9jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBoaDQwNSBlc2QKIApAQCAtMTIzMCw5ICsxMjU1LDggQEAKIAogc2VxdW9pYV9uYW5kX2NvbmZpZyBcCiByYWluaWVyX25hbmRfY29uZmlnOiB1bmNvbmZpZwotCUBta2RpciAtcCAkKG9iailpbmNsdWRlCi0JQG1rZGlyIC1wICQob2JqKW5hbmRfc3BsCi0JQG1rZGlyIC1wICQob2JqKWJvYXJkL2FtY2Mvc2VxdW9pYQorCUBta2RpciAtcCAkKG9iailpbmNsdWRlICQob2JqKWJvYXJkL2FtY2Mvc2VxdW9pYQorCUBta2RpciAtcCAkKG9iailuYW5kX3NwbC9ib2FyZC9hbWNjL3NlcXVvaWEKIAlAZWNobyAiI2RlZmluZSBDT05GSUdfTkFORF9VX0JPT1QiID4gJChvYmopaW5jbHVkZS9jb25maWcuaAogCUBlY2hvICIjZGVmaW5lIENPTkZJR18kJChlY2hvICQoc3Vic3QgLCwkKEA6X2NvbmZpZz0pKSB8IFwKIAkJdHIgJ1s6bG93ZXI6XScgJ1s6dXBwZXI6XScpIiA+PiAkKG9iailpbmNsdWRlL2NvbmZpZy5oCkBAIC0xMjQxLDcgKzEyNjUsMTAgQEAKIAlAZWNobyAiQ09ORklHX05BTkRfVV9CT09UID0geSIgPj4gJChvYmopaW5jbHVkZS9jb25maWcubWsKIAogc2MzX2NvbmZpZzp1bmNvbmZpZwotCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBzYzMKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgcHBjNHh4IHNjMworCit0YWlodV9jb25maWc6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCB0YWlodSBhbWNjCiAKIHRhaXNoYW5fY29uZmlnOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBwcGM0eHggdGFpc2hhbiBhbWNjCkBAIC0xMjgwLDYgKzEzMDcsOSBAQAogeXVjY2FfY29uZmlnOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBwcGM0eHggeXVjY2EgYW1jYwogCit6ZXVzX2NvbmZpZzoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgcHBjNHh4IHpldXMKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDODIyMCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xNDA3LDcgKzE0MzcsNyBAQAogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4MjYwIGVwODI2MAogCiBlcDgyeHhtX2NvbmZpZzoJdW5jb25maWcKLQlALi9ta2NvbmZpZyAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4MjYwIGVwODJ4eG0KKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgbXBjODI2MCBlcDgyeHhtCiAKIGd3ODI2MF9jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzgyNjAgZ3c4MjYwCkBAIC0xNjQ4LDM4ICsxNjc4LDQzIEBACiAKIE1QQzgzMTNFUkRCXzMzX2NvbmZpZyBcCiBNUEM4MzEzRVJEQl82Nl9jb25maWc6IHVuY29uZmlnCi0JQGVjaG8gIiIgPmluY2x1ZGUvY29uZmlnLmggOyBcCisJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKKwlAZWNobyAiIiA+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgXzMzXywkQCkiIF0gOyB0aGVuIFwKIAkJZWNobyAtbiAiLi4uMzNNIC4uLiIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ0ZHXzMzTUhaIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ0ZHXzMzTUhaIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF82Nl8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLjY2TS4uLiIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ0ZHXzY2TUhaIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ0ZHXzY2TUhaIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOwogCUAkKE1LQ09ORklHKSAtYSBNUEM4MzEzRVJEQiBwcGMgbXBjODN4eCBtcGM4MzEzZXJkYgogCitNUEM4MzIzRVJEQl9jb25maWc6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpIC1hIE1QQzgzMjNFUkRCIHBwYyBtcGM4M3h4IG1wYzgzMjNlcmRiIGZyZWVzY2FsZQorCiBNUEM4MzJYRU1EU19jb25maWcgXAogTVBDODMyWEVNRFNfSE9TVF8zM19jb25maWcgXAogTVBDODMyWEVNRFNfSE9TVF82Nl9jb25maWcgXAogTVBDODMyWEVNRFNfU0xBVkVfY29uZmlnOgl1bmNvbmZpZwotCUBlY2hvICIiID5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCUBta2RpciAtcCAkKG9iailpbmNsdWRlCisJQGVjaG8gIiIgPiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF9IT1NUXywkQCkiIF0gOyB0aGVuIFwKIAkJZWNobyAtbiAiLi4uIFBDSSBIT1NUICIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSSIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0kiID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlmaSA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgX1NMQVZFXywkQCkiIF0gOyB0aGVuIFwKIAkJZWNobyAiLi4uUENJIFNMQVZFIDY2TSIgIDsgXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0kiID4+aW5jbHVkZS9jb25maWcuaCA7IFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJU0xBVkUiID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSVNMQVZFIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF8zM18sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLjMzTSAuLi4iIDsgXAotCQllY2hvICIjZGVmaW5lIFBDSV8zM00iID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBQQ0lfMzNNIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF82Nl8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLjY2TS4uLiIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgUENJXzY2TSIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIFBDSV82Nk0iID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlmaSA7CiAJQCQoTUtDT05GSUcpIC1hIE1QQzgzMlhFTURTIHBwYyBtcGM4M3h4IG1wYzgzMnhlbWRzCiAKQEAgLTE3MDQsMjMgKzE3MzksMjQgQEAKIE1QQzgzNjBFTURTX0hPU1RfMzNfY29uZmlnIFwKIE1QQzgzNjBFTURTX0hPU1RfNjZfY29uZmlnIFwKIE1QQzgzNjBFTURTX1NMQVZFX2NvbmZpZzoJdW5jb25maWcKLQlAZWNobyAiIiA+aW5jbHVkZS9jb25maWcuaCA7IFwKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUBlY2hvICIiID4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfSE9TVF8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLiBQQ0kgSE9TVCAiIDsgXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0kiID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF9TTEFWRV8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gIi4uLlBDSSBTTEFWRSA2Nk0iICA7IFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSVNMQVZFIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0lTTEFWRSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfMzNfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvIC1uICIuLi4zM00gLi4uIiA7IFwKLQkJZWNobyAiI2RlZmluZSBQQ0lfMzNNIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgUENJXzMzTSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfNjZfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvIC1uICIuLi42Nk0uLi4iIDsgXAotCQllY2hvICIjZGVmaW5lIFBDSV82Nk0iID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBQQ0lfNjZNIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOwogCUAkKE1LQ09ORklHKSAtYSBNUEM4MzYwRU1EUyBwcGMgbXBjODN4eCBtcGM4MzYwZW1kcwogCkBAIC0xNzQ2LDEwICsxNzgyLDEwIEBACiAJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKIAlAZWNobyAiIiA+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgXzMzXywkQCkiIF0gOyB0aGVuIFwKLQkJZWNobyAtbiAiLi4uIDMzIE1IeiBQQ0kiIDsgXAorCQllY2hvICIuLi4gMzMgTUh6IFBDSSIgOyBcCiAJZWxzZSBcCiAJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1NZU0NMS182Nk0iID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKLQkJZWNobyAtbiAiLi4uIDY2IE1IeiBQQ0kiIDsgXAorCQllY2hvICIuLi4gNjYgTUh6IFBDSSIgOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF9zbGF2ZV8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSV9TTEFWRSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXApAQCAtMTc2MiwxNyArMTc5OCwzOCBAQAogTVBDODU2MEFEU19jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg1eHggbXBjODU2MGFkcwogCitNUEM4NTQxQ0RTX2xlZ2FjeV9jb25maWcgXAogTVBDODU0MUNEU19jb25maWc6CXVuY29uZmlnCi0JQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg1eHggbXBjODU0MWNkcyBjZHMKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUBlY2hvICIiID4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAorCWlmIFsgIiQoZmluZHN0cmluZyBfbGVnYWN5XywkQCkiIF0gOyB0aGVuIFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfTEVHQUNZIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIi4uLiBsZWdhY3kiIDsgXAorCWZpCisJQCQoTUtDT05GSUcpIC1hIE1QQzg1NDFDRFMgcHBjIG1wYzg1eHggbXBjODU0MWNkcyBjZHMKIAogTVBDODU0NERTX2NvbmZpZzoJdW5jb25maWcKIAlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgbXBjODV4eCBtcGM4NTQ0ZHMgZnJlZXNjYWxlCiAKK01QQzg1NDhDRFNfbGVnYWN5X2NvbmZpZyBcCiBNUEM4NTQ4Q0RTX2NvbmZpZzoJdW5jb25maWcKLQlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgbXBjODV4eCBtcGM4NTQ4Y2RzIGNkcworCUBta2RpciAtcCAkKG9iailpbmNsdWRlCisJQGVjaG8gIiIgPiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCisJaWYgWyAiJChmaW5kc3RyaW5nIF9sZWdhY3lfLCRAKSIgXSA7IHRoZW4gXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19MRUdBQ1kiID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiLi4uIGxlZ2FjeSIgOyBcCisJZmkKKwlAJChNS0NPTkZJRykgLWEgTVBDODU0OENEUyBwcGMgbXBjODV4eCBtcGM4NTQ4Y2RzIGNkcwogCitNUEM4NTU1Q0RTX2xlZ2FjeV9jb25maWcgXAogTVBDODU1NUNEU19jb25maWc6CXVuY29uZmlnCi0JQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg1eHggbXBjODU1NWNkcyBjZHMKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUBlY2hvICIiID4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAorCWlmIFsgIiQoZmluZHN0cmluZyBfbGVnYWN5XywkQCkiIF0gOyB0aGVuIFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfTEVHQUNZIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIi4uLiBsZWdhY3kiIDsgXAorCWZpCisJQCQoTUtDT05GSUcpIC1hIE1QQzg1NTVDRFMgcHBjIG1wYzg1eHggbXBjODU1NWNkcyBjZHMKIAogTVBDODU2OE1EU19jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg1eHggbXBjODU2OG1kcwpAQCAtMTg0Myw4ICsxOTAwLDEwIEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIE1QQzg2NDFIUENOX2NvbmZpZzogICAgdW5jb25maWcKLQlALi9ta2NvbmZpZyAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4Nnh4IG1wYzg2NDFocGNuCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg2eHggbXBjODY0MWhwY24KIAorc2JjODY0MWRfY29uZmlnOgl1bmNvbmZpZworCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgcHBjIG1wYzg2eHggc2JjODY0MWQKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgNzR4eC83eHggU3lzdGVtcwpAQCAtMjAwMCw2ICsyMDU5LDE1IEBACiBvbWFwNTkxMm9za19jb25maWcgOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm05MjZlanMgb21hcDU5MTJvc2sgTlVMTCBvbWFwCiAKK2RhdmluY2lfZHZldm1fY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIGR2LWV2bSBkYXZpbmNpIGRhdmluY2kKKworZGF2aW5jaV9zY2htb29naWVfY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIHNjaG1vb2dpZSBkYXZpbmNpIGRhdmluY2kKKworZGF2aW5jaV9zb25hdGFfY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIHNvbmF0YSBkYXZpbmNpIGRhdmluY2kKKwogb21hcDE2MTBpbm5fY29uZmlnIFwKIG9tYXAxNjEwaW5uX2NzMGJvb3RfY29uZmlnIFwKIG9tYXAxNjEwaW5uX2NzM2Jvb3RfY29uZmlnIFwKQEAgLTIwMTAsMTMgKzIwNzgsMTMgQEAKIG9tYXAxNjEwaDJfY3NfYXV0b2Jvb3RfY29uZmlnOgl1bmNvbmZpZwogCUBta2RpciAtcCAkKG9iailpbmNsdWRlCiAJQGlmIFsgIiQoZmluZHN0cmluZyBfY3MwYm9vdF8sICRAKSIgXSA7IHRoZW4gXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19DUzBfQk9PVCIgPj4gLiQob2JqKS9pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19DUzBfQk9PVCIgPj4gLiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJCWVjaG8gIi4uLiBjb25maWd1cmVkIGZvciBDUzAgYm9vdCI7IFwKIAllbGlmIFsgIiQoZmluZHN0cmluZyBfY3NfYXV0b2Jvb3RfLCAkQCkiIF0gOyB0aGVuIFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfQ1NfQVVUT0JPT1QiID4+ICQob2JqKS4vaW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfQ1NfQVVUT0JPT1QiID4+ICQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJCWVjaG8gIi4uLiBjb25maWd1cmVkIGZvciBDU19BVVRPIGJvb3QiOyBcCiAJZWxzZSBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX0NTM19CT09UIiA+PiAkKG9iaikuL2luY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX0NTM19CT09UIiA+PiAkKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCQllY2hvICIuLi4gY29uZmlndXJlZCBmb3IgQ1MzIGJvb3QiOyBcCiAJZmk7CiAJQCQoTUtDT05GSUcpIC1hICQoY2FsbCB4dHJhY3Rfb21hcDE2MTB4eHgsJEApIGFybSBhcm05MjZlanMgb21hcDE2MTBpbm4gTlVMTCBvbWFwCkBAIC0yMTg1LDExICsyMjUzLDEyIEBACiAKIHBkbmIzX2NvbmZpZyBcCiBzY3B1X2NvbmZpZzogICAgdW5jb25maWcKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQogCUBpZiBbICIkKGZpbmRzdHJpbmcgc2NwdV8sJEApIiBdIDsgdGhlbiBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX1NDUFUiICAgICAgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19TQ1BVIiAgICAgID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAkJZWNobyAiLi4uIG9uIFNDUFUgYm9hcmQgdmFyaWFudCIgOyBcCiAJZWxzZSBcCi0JCT5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQk+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlmaQogCUAkKE1LQ09ORklHKSAtYSBwZG5iMyBhcm0gaXhwIHBkbmIzIHByb2RyaXZlCiAKQEAgLTI0MTEsMTQgKzI0ODAsMTYgQEAKIAlAJChNS0NPTkZJRykgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgc3V6YWt1IEF0bWFya1RlY2hubwogCiBtbDQwMV9jb25maWc6CXVuY29uZmlnCi0JQCA+aW5jbHVkZS9jb25maWcuaAotCUBlY2hvICIjZGVmaW5lIENPTkZJR19NTDQwMSAxIiA+PiBpbmNsdWRlL2NvbmZpZy5oCi0JQC4vbWtjb25maWcgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgbWw0MDEgeGlsaW54CisJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKKwlAID4kKG9iailpbmNsdWRlL2NvbmZpZy5oCisJQGVjaG8gIiNkZWZpbmUgQ09ORklHX01MNDAxIDEiID4+ICQob2JqKWluY2x1ZGUvY29uZmlnLmgKKwlAJChNS0NPTkZJRykgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgbWw0MDEgeGlsaW54CiAKIHh1cHYycF9jb25maWc6CXVuY29uZmlnCi0JQCA+aW5jbHVkZS9jb25maWcuaAotCUBlY2hvICIjZGVmaW5lIENPTkZJR19YVVBWMlAgMSIgPj4gaW5jbHVkZS9jb25maWcuaAotCUAuL21rY29uZmlnIC1hICQoQDpfY29uZmlnPSkgbWljcm9ibGF6ZSBtaWNyb2JsYXplIHh1cHYycCB4aWxpbngKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUAgPiQob2JqKWluY2x1ZGUvY29uZmlnLmgKKwlAZWNobyAiI2RlZmluZSBDT05GSUdfWFVQVjJQIDEiID4+ICQob2JqKWluY2x1ZGUvY29uZmlnLmgKKwlAJChNS0NPTkZJRykgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgeHVwdjJwIHhpbGlueAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBCbGFja2ZpbgpAQCAtMjQ0Myw3ICsyNTE0LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogYXRzdGsxMDAyX2NvbmZpZwk6CXVuY29uZmlnCi0JQC4vbWtjb25maWcgJChAOl9jb25maWc9KSBhdnIzMiBhdDMyYXAgYXRzdGsxMDAwIGF0bWVsIGF0MzJhcDcwMDAKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhdnIzMiBhdDMyYXAgYXRzdGsxMDAwIGF0bWVsIGF0MzJhcDcwMDAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMjQ2MCw3ICsyNTMxLDcgQEAKIAkgICAgICAkKG9iailleGFtcGxlcy9zbWM5MTExMV9lZXByb20gJChvYmopZXhhbXBsZXMvaW50ZXJydXB0IFwKIAkgICAgICAkKG9iailleGFtcGxlcy90ZXN0X2J1cnN0CiAJcm0gLWYgJChvYmopdG9vbHMvaW1nMnNyZWMgJChvYmopdG9vbHMvbWtpbWFnZSAkKG9iail0b29scy9lbnZjcmMgXAotCQkkKG9iail0b29scy9nZW5fZXRoX2FkZHIKKwkJJChvYmopdG9vbHMvZ2VuX2V0aF9hZGRyICQob2JqKXRvb2xzL3Vic2hhMQogCXJtIC1mICQob2JqKXRvb2xzL21wYzg2eF9jbGsgJChvYmopdG9vbHMvbmNiCiAJcm0gLWYgJChvYmopdG9vbHMvZWFzeWxvZ28vZWFzeWxvZ28gJChvYmopdG9vbHMvYm1wX2xvZ28KIAlybSAtZiAkKG9iail0b29scy9nZGIvYXN0ZXN0ICQob2JqKXRvb2xzL2dkYi9nZGJjb250ICQob2JqKXRvb2xzL2dkYi9nZGJzZW5kCkBAIC0yNDgzLDcgKzI1NTQsNyBAQAogCXJtIC1mICQoT0JKUykgJChvYmopKi5iYWsgJChvYmopY3RhZ3MgJChvYmopZXRhZ3MgJChvYmopVEFHUyAkKG9iailpbmNsdWRlL3ZlcnNpb25fYXV0b2dlbmVyYXRlZC5oCiAJcm0gLWZyICQob2JqKSouKn4KIAlybSAtZiAkKG9iail1LWJvb3QgJChvYmopdS1ib290Lm1hcCAkKG9iail1LWJvb3QuaGV4ICQoQUxMKQotCXJtIC1mICQob2JqKXRvb2xzL2NyYzMyLmMgJChvYmopdG9vbHMvZW52aXJvbm1lbnQuYyAkKG9iail0b29scy9lbnYvY3JjMzIuYworCXJtIC1mICQob2JqKXRvb2xzL2NyYzMyLmMgJChvYmopdG9vbHMvZW52aXJvbm1lbnQuYyAkKG9iail0b29scy9lbnYvY3JjMzIuYyAkKG9iail0b29scy9zaGExLmMKIAlybSAtZiAkKG9iail0b29scy9pbmNhLXN3YXAtYnl0ZXMgJChvYmopY3B1L21wYzgyNHgvYmVkYnVnXzYwM2UuYwogCXJtIC1mICQob2JqKWluY2x1ZGUvYXNtL3Byb2MgJChvYmopaW5jbHVkZS9hc20vYXJjaCAkKG9iailpbmNsdWRlL2FzbQogCVsgISAtZCAkKE9CSlRSRUUpL25hbmRfc3BsIF0gfHwgZmluZCAkKG9iailuYW5kX3NwbCAtbG5hbWUgIioiIC1wcmludCB8IHhhcmdzIHJtIC1mCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggYmI1YjQ2ZS4uMjkxYjMwNCAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMjI4LDExMyArMjI4LDkgQEAKIAogVGhlIGZvbGxvd2luZyBvcHRpb25zIG5lZWQgdG8gYmUgY29uZmlndXJlZDoKIAotLSBDUFUgVHlwZToJRGVmaW5lIGV4YWN0bHkgb25lIG9mCistIENQVSBUeXBlOglEZWZpbmUgZXhhY3RseSBvbmUsIGUuZy4gQ09ORklHX01QQzg1WFguCiAKLQkJUG93ZXJQQyBiYXNlZCBDUFVzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNPTkZJR19NUEM4MjMsCUNPTkZJR19NUEM4NTAsCUNPTkZJR19NUEM4NTUsCUNPTkZJR19NUEM4NjAKLQlvcglDT05GSUdfTVBDNXh4Ci0Jb3IJQ09ORklHX01QQzgyMjAKLQlvcglDT05GSUdfTVBDODI0WCwgQ09ORklHX01QQzgyNjAKLQlvcglDT05GSUdfTVBDODV4eAotCW9yCUNPTkZJR19JT1A0ODAKLQlvcglDT05GSUdfNDA1R1AKLQlvcglDT05GSUdfNDA1RVAKLQlvcglDT05GSUdfNDQwCi0Jb3IJQ09ORklHX01QQzc0eHgKLQlvcglDT05GSUdfNzUwRlgKLQotCQlBUk0gYmFzZWQgQ1BVczoKLQkJLS0tLS0tLS0tLS0tLS0tCi0JCUNPTkZJR19TQTExMTAKLQkJQ09ORklHX0FSTTcKLQkJQ09ORklHX1BYQTI1MAotCQlDT05GSUdfQ1BVX01PTkFIQU5TCi0KLQkJTWljcm9CbGF6ZSBiYXNlZCBDUFVzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNPTkZJR19NSUNST0JMQVpFCi0KLQkJTmlvcy0yIGJhc2VkIENQVXM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ09ORklHX05JT1MyCi0KLQkJQVZSMzIgYmFzZWQgQ1BVczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlDT05GSUdfQVQzMkFQCi0KLS0gQm9hcmQgVHlwZToJRGVmaW5lIGV4YWN0bHkgb25lIG9mCi0KLQkJUG93ZXJQQyBiYXNlZCBib2FyZHM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JCUNPTkZJR19BRENJT1AJCUNPTkZJR19GUFM4NjBMCQlDT05GSUdfT1hDCi0JCUNPTkZJR19BRFM4NjAJCUNPTkZJR19HRU44NjBUCQlDT05GSUdfUENJNDA1Ci0JCUNPTkZJR19BTVg4NjAJCUNPTkZJR19HRU5JRVRWCQlDT05GSUdfUENJUFBDMgotCQlDT05GSUdfQVAxMDAwCQlDT05GSUdfR1RICQlDT05GSUdfUENJUFBDNgotCQlDT05GSUdfQVI0MDUJCUNPTkZJR19ndzgyNjAJCUNPTkZJR19wY3VfZQotCQlDT05GSUdfQkFCN3h4CQlDT05GSUdfaGVybWVzCQlDT05GSUdfUElQNDA1Ci0JCUNPTkZJR19CQzM0NTAJCUNPTkZJR19oeW1vZAkJQ09ORklHX1BNODI2Ci0JCUNPTkZJR19jMm1vbgkJQ09ORklHX0lBRDIxMAkJQ09ORklHX3BwbWM4MjYwCi0JCUNPTkZJR19DQU5CVAkJQ09ORklHX0lDVTg2MgkJQ09ORklHX1FTODIzCi0JCUNPTkZJR19DQ00JCUNPTkZJR19JUDg2MAkJQ09ORklHX1FTODUwCi0JCUNPTkZJR19DTUkJCUNPTkZJR19JUEhBU0U0NTM5CUNPTkZJR19RUzg2MFQKLQkJQ09ORklHX2NvZ2VudF9tcGM4MjYwCUNPTkZJR19JVk1MMjQJCUNPTkZJR19SQkM4MjMKLQkJQ09ORklHX2NvZ2VudF9tcGM4eHgJQ09ORklHX0lWTUwyNF8xMjgJQ09ORklHX1JQWENsYXNzaWMKLQkJQ09ORklHX0NQQ0k0MDUJCUNPTkZJR19JVk1MMjRfMjU2CUNPTkZJR19SUFhsaXRlCi0JCUNPTkZJR19DUENJNDA1MgkJQ09ORklHX0lWTVM4CQlDT05GSUdfUlBYc3VwZXIKLQkJQ09ORklHX0NQQ0lJU0VSNAlDT05GSUdfSVZNUzhfMTI4CUNPTkZJR19yc2Rwcm90bwotCQlDT05GSUdfQ1BVODYJCUNPTkZJR19JVk1TOF8yNTYJQ09ORklHX3NhY3NuZwotCQlDT05GSUdfQ1JBWUwxCQlDT05GSUdfSlNFCQlDT05GSUdfU2FuZHBvaW50ODI0MAotCQlDT05GSUdfQ1NCMjcyCQlDT05GSUdfTEFOVEVDCQlDT05GSUdfU2FuZHBvaW50ODI0NQotCQlDT05GSUdfQ1U4MjQJCUNPTkZJR19MSVRFNTIwMEIJQ09ORklHX3NiYzgyNjAKLQkJQ09ORklHX0RBU0FfU0lNCQlDT05GSUdfbHdtb24JCUNPTkZJR19zYmM4NTYwCi0JCUNPTkZJR19EQjY0MzYwCQlDT05GSUdfTUJYCQlDT05GSUdfU004NTAKLQkJQ09ORklHX0RCNjQ0NjAJCUNPTkZJR19NQlg4NjBUCQlDT05GSUdfU1BEODIzVFMKLQkJQ09ORklHX0RVNDA1CQlDT05GSUdfTUhQQwkJQ09ORklHX1NUWEdQMwotCQlDT05GSUdfRFVFVF9BRFMJCUNPTkZJR19NSVA0MDUJCUNPTkZJR19TWE5JODU1VAotCQlDT05GSUdfRUJPTlkJCUNPTkZJR19NT1VTU0UJCUNPTkZJR19UUU04MjNMCi0JCUNPTkZJR19FTFBQQwkJQ09ORklHX01QQzgyNjBBRFMJQ09ORklHX1RRTTgyNjAKLQkJQ09ORklHX0VMUFQ4NjAJCUNPTkZJR19NUEM4NTQwQURTCUNPTkZJR19UUU04NTBMCi0JCUNPTkZJR19lcDgyNjAJCUNPTkZJR19NUEM4NTQwRVZBTAlDT05GSUdfVFFNODU1TAotCQlDT05GSUdfRVJJQwkJQ09ORklHX01QQzg1NjBBRFMJQ09ORklHX1RRTTg2MEwKLQkJQ09ORklHX0VTVEVFTTE5MkUJQ09ORklHX01VU0VOS0kJCUNPTkZJR19UVFRlY2gKLQkJQ09ORklHX0VUWDA5NAkJQ09ORklHX01WUzEJCUNPTkZJR19VVFg4MjQ1Ci0JCUNPTkZJR19FVkI2NDI2MAkJQ09ORklHX05FVFBIT05FCQlDT05GSUdfVjM3Ci0JCUNPTkZJR19GQURTODIzCQlDT05GSUdfTkVUVEEJCUNPTkZJR19XN09MTUMKLQkJQ09ORklHX0ZBRFM4NTBTQVIJQ09ORklHX05FVFZJQQkJQ09ORklHX1c3T0xNRwotCQlDT05GSUdfRkFEUzg2MFQJCUNPTkZJR19OWDgyMwkJQ09ORklHX1dBTE5VVAotCQlDT05GSUdfRkxBR0FETQkJQ09ORklHX09DUlRDCQlDT05GSUdfWlBDMTkwMAotCQlDT05GSUdfRlBTODUwTAkJQ09ORklHX09SU0cJCUNPTkZJR19aVU1BCi0KLQkJQVJNIGJhc2VkIGJvYXJkczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlDT05GSUdfQVJNQURJTExPLAlDT05GSUdfQVQ5MVJNOTIwMERLLAlDT05GSUdfQ0VSRjI1MCwKLQkJQ09ORklHX0NTQjYzNywJCUNPTkZJR19ERUxUQSwJCUNPTkZJR19ETlAxMTEwLAotCQlDT05GSUdfRVA3MzEyLAkJQ09ORklHX0gyX09NQVAxNjEwLAlDT05GSUdfSEhQX0NSQURMRSwKLQkJQ09ORklHX0lNUEE3LAkgICAgQ09ORklHX0lOTk9WQVRPUk9NQVAxNTEwLAlDT05GSUdfSU5OT1ZBVE9ST01BUDE2MTAsCi0JCUNPTkZJR19LQjkyMDIsCQlDT05GSUdfTEFSVCwJCUNPTkZJR19MUEQ3QTQwMCwKLQkJQ09ORklHX0xVQkJPQ0ssCQlDT05GSUdfT1NLX09NQVA1OTEyLAlDT05GSUdfT01BUDI0MjBINCwKLQkJQ09ORklHX1BMRUIyLAkJQ09ORklHX1NIQU5OT04sCQlDT05GSUdfUDJfT01BUDczMCwKLQkJQ09ORklHX1NNREsyNDAwLAlDT05GSUdfU01ESzI0MTAsCUNPTkZJR19UUkFCLAotCQlDT05GSUdfVkNNQTkKLQotCQlNaWNyb0JsYXplIGJhc2VkIGJvYXJkczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkJQ09ORklHX1NVWkFLVQotCi0JCU5pb3MtMiBiYXNlZCBib2FyZHM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JCUNPTkZJR19QQ0k1NDQxIENPTkZJR19QSzFDMjAKLQkJQ09ORklHX0VQMUMyMCBDT05GSUdfRVAxUzEwIENPTkZJR19FUDFTNDAKLQotCQlBVlIzMiBiYXNlZCBib2FyZHM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlDT05GSUdfQVRTVEsxMDAwCistIEJvYXJkIFR5cGU6CURlZmluZSBleGFjdGx5IG9uZSwgZS5nLiBDT05GSUdfTVBDODU0MEFEUy4KIAogLSBDUFUgRGF1Z2h0ZXJib2FyZCBUeXBlOiAoaWYgQ09ORklHX0FUU1RLMTAwMCBpcyBkZWZpbmVkKQogCQlEZWZpbmUgZXhhY3RseSBvbmUgb2YKQEAgLTU0MSw3ICs0MzcsNyBAQAogCQkJQ0ZHX0NPTlNPTEVfQkxJTktfQ09VTlQgYmxpbmsgaW50ZXJ2YWwgKGNmLiBpODA0Mi5jKQogCQkJQ09ORklHX0NPTlNPTEVfVElNRQlkaXNwbGF5IHRpbWUvZGF0ZSBpbmZvIGluCiAJCQkJCQl1cHBlciByaWdodCBjb3JuZXIKLQkJCQkJCShyZXF1aXJlcyBDRkdfQ01EX0RBVEUpCisJCQkJCQkocmVxdWlyZXMgQ09ORklHX0NNRF9EQVRFKQogCQkJQ09ORklHX1ZJREVPX0xPR08JZGlzcGxheSBMaW51eCBsb2dvIGluCiAJCQkJCQl1cHBlciBsZWZ0IGNvcm5lcgogCQkJQ09ORklHX1ZJREVPX0JNUF9MT0dPCXVzZSBibXBfbG9nby5oIGluc3RlYWQgb2YKQEAgLTY0NSwxMDMgKzU0MSw5NiBAQAogCQl0aW1lIG9uIG90aGVycy4gVGhpcyBzZXR0aW5nICNkZWZpbmUncyB0aGUgaW5pdGlhbAogCQl2YWx1ZSBvZiB0aGUgImxvYWRzX2VjaG8iIGVudmlyb25tZW50IHZhcmlhYmxlLgogCi0tIEtnZGIgU2VyaWFsIEJhdWRyYXRlOiAoaWYgQ0ZHX0NNRF9LR0RCIGlzIGRlZmluZWQpCistIEtnZGIgU2VyaWFsIEJhdWRyYXRlOiAoaWYgQ09ORklHX0NNRF9LR0RCIGlzIGRlZmluZWQpCiAJCUNPTkZJR19LR0RCX0JBVURSQVRFCiAJCVNlbGVjdCBvbmUgb2YgdGhlIGJhdWRyYXRlcyBsaXN0ZWQgaW4KIAkJQ0ZHX0JBVURSQVRFX1RBQkxFLCBzZWUgYmVsb3cuCiAKIC0gTW9uaXRvciBGdW5jdGlvbnM6Ci0JCUNPTkZJR19DT01NQU5EUwotCQlNb3N0IG1vbml0b3IgZnVuY3Rpb25zIGNhbiBiZSBzZWxlY3RlZCAob3IKLQkJZGUtc2VsZWN0ZWQpIGJ5IGFkanVzdGluZyB0aGUgZGVmaW5pdGlvbiBvZgotCQlDT05GSUdfQ09NTUFORFM7IHRvIHNlbGVjdCBpbmRpdmlkdWFsIGZ1bmN0aW9ucywKLQkJI2RlZmluZSBDT05GSUdfQ09NTUFORFMgYnkgIk9SImluZyBhbnkgb2YgdGhlCi0JCWZvbGxvd2luZyB2YWx1ZXM6CisJCU1vbml0b3IgY29tbWFuZHMgY2FuIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkCisJCWZyb20gdGhlIGJ1aWxkIGJ5IHVzaW5nIHRoZSAjaW5jbHVkZSBmaWxlcworCQkiY29uZmlnX2NtZF9hbGwuaCIgYW5kICN1bmRlZidpbmcgdW53YW50ZWQKKwkJY29tbWFuZHMsIG9yIHVzaW5nICJjb25maWdfY21kX2RlZmF1bHQuaCIKKwkJYW5kIGF1Z21lbnRpbmcgd2l0aCBhZGRpdGlvbmFsICNkZWZpbmUncworCQlmb3Igd2FudGVkIGNvbW1hbmRzLgogCi0JCSNkZWZpbmUgZW5hYmxlcyBjb21tYW5kczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlDRkdfQ01EX0FTS0VOVgkqIGFzayBmb3IgZW52IHZhcmlhYmxlCi0JCUNGR19DTURfQVVUT1NDUklQVCBBdXRvc2NyaXB0IFN1cHBvcnQKLQkJQ0ZHX0NNRF9CREkJICBiZGluZm8KLQkJQ0ZHX0NNRF9CRURCVUcJKiBJbmNsdWRlIEJlZEJ1ZyBEZWJ1Z2dlcgotCQlDRkdfQ01EX0JNUAkqIEJNUCBzdXBwb3J0Ci0JCUNGR19DTURfQlNQCSogQm9hcmQgc3BlY2lmaWMgY29tbWFuZHMKLQkJQ0ZHX0NNRF9CT09URAkgIGJvb3RkCi0JCUNGR19DTURfQ0FDSEUJKiBpY2FjaGUsIGRjYWNoZQotCQlDRkdfQ01EX0NPTlNPTEUJICBjb25pbmZvCi0JCUNGR19DTURfREFURQkqIHN1cHBvcnQgZm9yIFJUQywgZGF0ZS90aW1lLi4uCi0JCUNGR19DTURfREhDUAkqIERIQ1Agc3VwcG9ydAotCQlDRkdfQ01EX0RJQUcJKiBEaWFnbm9zdGljcwotCQlDRkdfQ01EX0RPQwkqIERpc2stT24tQ2hpcCBTdXBwb3J0Ci0JCUNGR19DTURfRFRUCSogRGlnaXRhbCBUaGVybSBhbmQgVGhlcm1vc3RhdAotCQlDRkdfQ01EX0VDSE8JICBlY2hvIGFyZ3VtZW50cwotCQlDRkdfQ01EX0VFUFJPTQkqIEVFUFJPTSByZWFkL3dyaXRlIHN1cHBvcnQKLQkJQ0ZHX0NNRF9FTEYJKiBib290ZWxmLCBib290dngKLQkJQ0ZHX0NNRF9FTlYJICBzYXZlZW52Ci0JCUNGR19DTURfRkRDCSogRmxvcHB5IERpc2sgU3VwcG9ydAotCQlDRkdfQ01EX0ZBVAkqIEZBVCBwYXJ0aXRpb24gc3VwcG9ydAotCQlDRkdfQ01EX0ZET1MJKiBEb3MgZGlza2V0dGUgU3VwcG9ydAotCQlDRkdfQ01EX0ZMQVNICSAgZmxpbmZvLCBlcmFzZSwgcHJvdGVjdAotCQlDRkdfQ01EX0ZQR0EJICBGUEdBIGRldmljZSBpbml0aWFsaXphdGlvbiBzdXBwb3J0Ci0JCUNGR19DTURfSFdGTE9XCSogUlRTL0NUUyBodyBmbG93IGNvbnRyb2wKLQkJQ0ZHX0NNRF9JMkMJKiBJMkMgc2VyaWFsIGJ1cyBzdXBwb3J0Ci0JCUNGR19DTURfSURFCSogSURFIGhhcmRkaXNrIHN1cHBvcnQKLQkJQ0ZHX0NNRF9JTUkJICBpbWluZm8KLQkJQ0ZHX0NNRF9JTUxTCSAgTGlzdCBhbGwgZm91bmQgaW1hZ2VzCi0JCUNGR19DTURfSU1NQVAJKiBJTU1SIGR1bXAgc3VwcG9ydAotCQlDRkdfQ01EX0lSUQkqIGlycWluZm8KLQkJQ0ZHX0NNRF9JVEVTVAkgIEludGVnZXIvc3RyaW5nIHRlc3Qgb2YgMiB2YWx1ZXMKLQkJQ0ZHX0NNRF9KRkZTMgkqIEpGRlMyIFN1cHBvcnQKLQkJQ0ZHX0NNRF9LR0RCCSoga2dkYgotCQlDRkdfQ01EX0xPQURCCSAgbG9hZGIKLQkJQ0ZHX0NNRF9MT0FEUwkgIGxvYWRzCi0JCUNGR19DTURfTUVNT1JZCSAgbWQsIG1tLCBubSwgbXcsIGNwLCBjbXAsIGNyYywgYmFzZSwKLQkJCQkgIGxvb3AsIGxvb3B3LCBtdGVzdAotCQlDRkdfQ01EX01JU0MJICBNaXNjIGZ1bmN0aW9ucyBsaWtlIHNsZWVwIGV0YwotCQlDRkdfQ01EX01NQwkqIE1NQyBtZW1vcnkgbWFwcGVkIHN1cHBvcnQKLQkJQ0ZHX0NNRF9NSUkJKiBNSUkgdXRpbGl0eSBjb21tYW5kcwotCQlDRkdfQ01EX05BTkQJKiBOQU5EIHN1cHBvcnQKLQkJQ0ZHX0NNRF9ORVQJICBib290cCwgdGZ0cGJvb3QsIHJhcnBib290Ci0JCUNGR19DTURfUENJCSogcGNpaW5mbwotCQlDRkdfQ01EX1BDTUNJQQkqIFBDTUNJQSBzdXBwb3J0Ci0JCUNGR19DTURfUElORwkqIHNlbmQgSUNNUCBFQ0hPX1JFUVVFU1QgdG8gbmV0d29yayBob3N0Ci0JCUNGR19DTURfUE9SVElPCSogUG9ydCBJL08KLQkJQ0ZHX0NNRF9SRUdJTkZPICogUmVnaXN0ZXIgZHVtcAotCQlDRkdfQ01EX1JVTgkgIHJ1biBjb21tYW5kIGluIGVudiB2YXJpYWJsZQotCQlDRkdfQ01EX1NBVkVTCSogc2F2ZSBTIHJlY29yZCBkdW1wCi0JCUNGR19DTURfU0NTSQkqIFNDU0kgU3VwcG9ydAotCQlDRkdfQ01EX1NEUkFNCSogcHJpbnQgU0RSQU0gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotCQkJCSAgKHJlcXVpcmVzIENGR19DTURfSTJDKQotCQlDRkdfQ01EX1NFVEdFVERDUiBTdXBwb3J0IGZvciBEQ1IgUmVnaXN0ZXIgYWNjZXNzICg0eHggb25seSkKLQkJQ0ZHX0NNRF9TUEkJKiBTUEkgc2VyaWFsIGJ1cyBzdXBwb3J0Ci0JCUNGR19DTURfVVNCCSogVVNCIHN1cHBvcnQKLQkJQ0ZHX0NNRF9WRkQJKiBWRkQgc3VwcG9ydCAoVFJBQikKLQkJQ0ZHX0NNRF9CU1AJKiBCb2FyZCBTUGVjaWZpYyBmdW5jdGlvbnMKLQkJQ0ZHX0NNRF9DRFAJKiBDaXNjbyBEaXNjb3ZlciBQcm90b2NvbCBzdXBwb3J0Ci0JCUNGR19DTURfRlNMCSogTWljcm9ibGF6ZSBGU0wgc3VwcG9ydAotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlDRkdfQ01EX0FMTAlhbGwKKwkJVGhlIGRlZmF1bHQgY29tbWFuZCBjb25maWd1cmF0aW9uIGluY2x1ZGVzIGFsbCBjb21tYW5kcworCQlleGNlcHQgdGhvc2UgbWFya2VkIGJlbG93IHdpdGggYSAiKiIuCiAKLQkJQ09ORklHX0NNRF9ERkwJRGVmYXVsdCBjb25maWd1cmF0aW9uOyBhdCB0aGUgbW9tZW50Ci0JCQkJdGhpcyBpcyBpbmNsdWRlcyBhbGwgY29tbWFuZHMsIGV4Y2VwdAotCQkJCXRoZSBvbmVzIG1hcmtlZCB3aXRoICIqIiBpbiB0aGUgbGlzdAotCQkJCWFib3ZlLgorCQlDT05GSUdfQ01EX0FTS0VOVgkqIGFzayBmb3IgZW52IHZhcmlhYmxlCisJCUNPTkZJR19DTURfQVVUT1NDUklQVAkgIEF1dG9zY3JpcHQgU3VwcG9ydAorCQlDT05GSUdfQ01EX0JESQkJICBiZGluZm8KKwkJQ09ORklHX0NNRF9CRURCVUcJKiBJbmNsdWRlIEJlZEJ1ZyBEZWJ1Z2dlcgorCQlDT05GSUdfQ01EX0JNUAkJKiBCTVAgc3VwcG9ydAorCQlDT05GSUdfQ01EX0JTUAkJKiBCb2FyZCBzcGVjaWZpYyBjb21tYW5kcworCQlDT05GSUdfQ01EX0JPT1RECSAgYm9vdGQKKwkJQ09ORklHX0NNRF9DQUNIRQkqIGljYWNoZSwgZGNhY2hlCisJCUNPTkZJR19DTURfQ09OU09MRQkgIGNvbmluZm8KKwkJQ09ORklHX0NNRF9EQVRFCQkqIHN1cHBvcnQgZm9yIFJUQywgZGF0ZS90aW1lLi4uCisJCUNPTkZJR19DTURfREhDUAkJKiBESENQIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9ESUFHCQkqIERpYWdub3N0aWNzCisJCUNPTkZJR19DTURfRE9DCQkqIERpc2stT24tQ2hpcCBTdXBwb3J0CisJCUNPTkZJR19DTURfRFRUCQkqIERpZ2l0YWwgVGhlcm0gYW5kIFRoZXJtb3N0YXQKKwkJQ09ORklHX0NNRF9FQ0hPCQkgIGVjaG8gYXJndW1lbnRzCisJCUNPTkZJR19DTURfRUVQUk9NCSogRUVQUk9NIHJlYWQvd3JpdGUgc3VwcG9ydAorCQlDT05GSUdfQ01EX0VMRgkJKiBib290ZWxmLCBib290dngKKwkJQ09ORklHX0NNRF9FTlYJCSAgc2F2ZWVudgorCQlDT05GSUdfQ01EX0ZEQwkJKiBGbG9wcHkgRGlzayBTdXBwb3J0CisJCUNPTkZJR19DTURfRkFUCQkqIEZBVCBwYXJ0aXRpb24gc3VwcG9ydAorCQlDT05GSUdfQ01EX0ZET1MJCSogRG9zIGRpc2tldHRlIFN1cHBvcnQKKwkJQ09ORklHX0NNRF9GTEFTSAkgIGZsaW5mbywgZXJhc2UsIHByb3RlY3QKKwkJQ09ORklHX0NNRF9GUEdBCQkgIEZQR0EgZGV2aWNlIGluaXRpYWxpemF0aW9uIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9IV0ZMT1cJKiBSVFMvQ1RTIGh3IGZsb3cgY29udHJvbAorCQlDT05GSUdfQ01EX0kyQwkJKiBJMkMgc2VyaWFsIGJ1cyBzdXBwb3J0CisJCUNPTkZJR19DTURfSURFCQkqIElERSBoYXJkZGlzayBzdXBwb3J0CisJCUNPTkZJR19DTURfSU1JCQkgIGltaW5mbworCQlDT05GSUdfQ01EX0lNTFMJCSAgTGlzdCBhbGwgZm91bmQgaW1hZ2VzCisJCUNPTkZJR19DTURfSU1NQVAJKiBJTU1SIGR1bXAgc3VwcG9ydAorCQlDT05GSUdfQ01EX0lSUQkJKiBpcnFpbmZvCisJCUNPTkZJR19DTURfSVRFU1QJICBJbnRlZ2VyL3N0cmluZyB0ZXN0IG9mIDIgdmFsdWVzCisJCUNPTkZJR19DTURfSkZGUzIJKiBKRkZTMiBTdXBwb3J0CisJCUNPTkZJR19DTURfS0dEQgkJKiBrZ2RiCisJCUNPTkZJR19DTURfTE9BREIJICBsb2FkYgorCQlDT05GSUdfQ01EX0xPQURTCSAgbG9hZHMKKwkJQ09ORklHX0NNRF9NRU1PUlkJICBtZCwgbW0sIG5tLCBtdywgY3AsIGNtcCwgY3JjLCBiYXNlLAorCQkJCQkgIGxvb3AsIGxvb3B3LCBtdGVzdAorCQlDT05GSUdfQ01EX01JU0MJCSAgTWlzYyBmdW5jdGlvbnMgbGlrZSBzbGVlcCBldGMKKwkJQ09ORklHX0NNRF9NTUMJCSogTU1DIG1lbW9yeSBtYXBwZWQgc3VwcG9ydAorCQlDT05GSUdfQ01EX01JSQkJKiBNSUkgdXRpbGl0eSBjb21tYW5kcworCQlDT05GSUdfQ01EX05BTkQJCSogTkFORCBzdXBwb3J0CisJCUNPTkZJR19DTURfTkVUCQkgIGJvb3RwLCB0ZnRwYm9vdCwgcmFycGJvb3QKKwkJQ09ORklHX0NNRF9QQ0kJCSogcGNpaW5mbworCQlDT05GSUdfQ01EX1BDTUNJQQkJKiBQQ01DSUEgc3VwcG9ydAorCQlDT05GSUdfQ01EX1BJTkcJCSogc2VuZCBJQ01QIEVDSE9fUkVRVUVTVCB0byBuZXR3b3JrCisJCQkJCSAgaG9zdAorCQlDT05GSUdfQ01EX1BPUlRJTwkqIFBvcnQgSS9PCisJCUNPTkZJR19DTURfUkVHSU5GTwkqIFJlZ2lzdGVyIGR1bXAKKwkJQ09ORklHX0NNRF9SVU4JCSAgcnVuIGNvbW1hbmQgaW4gZW52IHZhcmlhYmxlCisJCUNPTkZJR19DTURfU0FWRVMJKiBzYXZlIFMgcmVjb3JkIGR1bXAKKwkJQ09ORklHX0NNRF9TQ1NJCQkqIFNDU0kgU3VwcG9ydAorCQlDT05GSUdfQ01EX1NEUkFNCSogcHJpbnQgU0RSQU0gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgorCQkJCQkgIChyZXF1aXJlcyBDT05GSUdfQ01EX0kyQykKKwkJQ09ORklHX0NNRF9TRVRHRVREQ1IJICBTdXBwb3J0IGZvciBEQ1IgUmVnaXN0ZXIgYWNjZXNzCisJCQkJCSAgKDR4eCBvbmx5KQorCQlDT05GSUdfQ01EX1NQSQkJKiBTUEkgc2VyaWFsIGJ1cyBzdXBwb3J0CisJCUNPTkZJR19DTURfVVNCCQkqIFVTQiBzdXBwb3J0CisJCUNPTkZJR19DTURfVkZECQkqIFZGRCBzdXBwb3J0IChUUkFCKQorCQlDT05GSUdfQ01EX0JTUAkJKiBCb2FyZCBTUGVjaWZpYyBmdW5jdGlvbnMKKwkJQ09ORklHX0NNRF9DRFAJCSogQ2lzY28gRGlzY292ZXIgUHJvdG9jb2wgc3VwcG9ydAorCQlDT05GSUdfQ01EX0ZTTAkJKiBNaWNyb2JsYXplIEZTTCBzdXBwb3J0CiAKLQkJSWYgeW91IGRvbid0IGRlZmluZSBDT05GSUdfQ09NTUFORFMgaXQgZGVmYXVsdHMgdG8KLQkJQ09ORklHX0NNRF9ERkwgaW4gaW5jbHVkZS9jbWRfY29uZmRlZnMuaC4gQSBib2FyZCBjYW4KLQkJb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgaW4gdGhlIHJlc3BlY3RpdmUKLQkJaW5jbHVkZSBmaWxlLgogCiAJCUVYQU1QTEU6IElmIHlvdSB3YW50IGFsbCBmdW5jdGlvbnMgZXhjZXB0IG9mIG5ldHdvcmsKIAkJc3VwcG9ydCB5b3UgY2FuIHdyaXRlOgogCi0JCSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDRkdfQ01EX0FMTCAmIH5DRkdfQ01EX05FVCkKKwkJI2luY2x1ZGUgImNvbmZpZ19jbWRfYWxsLmgiCisJCSN1bmRlZiBDT05GSUdfQ01EX05FVAogCiAJT3RoZXIgQ29tbWFuZHM6CiAJCWZkdCAoZmxhdHRlbmVkIGRldmljZSB0cmVlKSBjb21tYW5kOiBDT05GSUdfT0ZfTElCRkRUCiAKIAlOb3RlOglEb24ndCBlbmFibGUgdGhlICJpY2FjaGUiIGFuZCAiZGNhY2hlIiBjb21tYW5kcwotCQkoY29uZmlndXJhdGlvbiBvcHRpb24gQ0ZHX0NNRF9DQUNIRSkgdW5sZXNzIHlvdSBrbm93CisJCShjb25maWd1cmF0aW9uIG9wdGlvbiBDT05GSUdfQ01EX0NBQ0hFKSB1bmxlc3MgeW91IGtub3cKIAkJd2hhdCB5b3UgKGFuZCB5b3VyIFUtQm9vdCB1c2VycykgYXJlIGRvaW5nLiBEYXRhCiAJCWNhY2hlIGNhbm5vdCBiZSBlbmFibGVkIG9uIHN5c3RlbXMgbGlrZSB0aGUgOHh4IG9yCiAJCTgyNjAgKHdoZXJlIGFjY2Vzc2VzIHRvIHRoZSBJTU1SIHJlZ2lvbiBtdXN0IGJlCkBAIC03NjksNyArNjU4LDcgQEAKIAogLSBSZWFsLVRpbWUgQ2xvY2s6CiAKLQkJV2hlbiBDRkdfQ01EX0RBVEUgaXMgc2VsZWN0ZWQsIHRoZSB0eXBlIG9mIHRoZSBSVEMKKwkJV2hlbiBDT05GSUdfQ01EX0RBVEUgaXMgc2VsZWN0ZWQsIHRoZSB0eXBlIG9mIHRoZSBSVEMKIAkJaGFzIHRvIGJlIHNlbGVjdGVkLCB0b28uIERlZmluZSBleGFjdGx5IG9uZSBvZiB0aGUKIAkJZm9sbG93aW5nIG9wdGlvbnM6CiAKQEAgLTc5MCwxNCArNjc5LDE0IEBACiAJCVdoZW4gQ09ORklHX1RJTUVTVEFNUCBpcyBzZWxlY3RlZCwgdGhlIHRpbWVzdGFtcAogCQkoZGF0ZSBhbmQgdGltZSkgb2YgYW4gaW1hZ2UgaXMgcHJpbnRlZCBieSBpbWFnZQogCQljb21tYW5kcyBsaWtlIGJvb3RtIG9yIGltaW5mby4gVGhpcyBvcHRpb24gaXMKLQkJYXV0b21hdGljYWxseSBlbmFibGVkIHdoZW4geW91IHNlbGVjdCBDRkdfQ01EX0RBVEUgLgorCQlhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiB5b3Ugc2VsZWN0IENPTkZJR19DTURfREFURSAuCiAKIC0gUGFydGl0aW9uIFN1cHBvcnQ6CiAJCUNPTkZJR19NQUNfUEFSVElUSU9OIGFuZC9vciBDT05GSUdfRE9TX1BBUlRJVElPTgogCQlhbmQvb3IgQ09ORklHX0lTT19QQVJUSVRJT04KIAotCQlJZiBJREUgb3IgU0NTSSBzdXBwb3J0CWlzICBlbmFibGVkICAoQ0ZHX0NNRF9JREUgIG9yCi0JCUNGR19DTURfU0NTSSkgeW91IG11c3QgY29uZmlndXJlIHN1cHBvcnQgZm9yIGF0IGxlYXN0CisJCUlmIElERSBvciBTQ1NJIHN1cHBvcnQJaXMgIGVuYWJsZWQgIChDT05GSUdfQ01EX0lERSBvcgorCQlDT05GSUdfQ01EX1NDU0kpIHlvdSBtdXN0IGNvbmZpZ3VyZSBzdXBwb3J0IGZvciBhdCBsZWFzdAogCQlvbmUgcGFydGl0aW9uIHR5cGUgYXMgd2VsbC4KIAogLSBJREUgUmVzZXQgbWV0aG9kOgpAQCAtOTAwLDYgKzc4OSw3MSBAQAogCQkJQ09ORklHX1VTQl9DT05GSUcKIAkJCQlmb3IgZGlmZmVyZW50aWFsIGRyaXZlcnM6IDB4MDAwMDEwMDAKIAkJCQlmb3Igc2luZ2xlIGVuZGVkIGRyaXZlcnM6IDB4MDAwMDUwMDAKKwkJCUNGR19VU0JfRVZFTlRfUE9MTAorCQkJCU1heSBiZSBkZWZpbmVkIHRvIGFsbG93IGludGVycnVwdCBwb2xsaW5nCisJCQkJaW5zdGVhZCBvZiB1c2luZyBhc3luY2hyb25vdXMgaW50ZXJydXB0cworCistIFVTQiBEZXZpY2U6CisJCURlZmluZSB0aGUgYmVsb3cgaWYgeW91IHdpc2ggdG8gdXNlIHRoZSBVU0IgY29uc29sZS4KKwkJT25jZSBmaXJtd2FyZSBpcyByZWJ1aWx0IGZyb20gYSBzZXJpYWwgY29uc29sZSBpc3N1ZSB0aGUKKwkJY29tbWFuZCAic2V0ZW52IHN0ZGluIHVzYnR0eTsgc2V0ZW52IHN0ZG91dCB1c2J0dHkiIGFuZAorCQlhdHRhY2ggeW91ciB1c2IgY2FibGUuIFRoZSBVbml4IGNvbW1hbmQgImRtZXNnIiBzaG91bGQgcHJpbnQKKwkJaXQgaGFzIGZvdW5kIGEgbmV3IGRldmljZS4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHVzYnR0eQorCQljYW4gYmUgc2V0IHRvIGdzZXJpYWwgb3IgY2RjX2FjbSB0byBlbmFibGUgeW91ciBkZXZpY2UgdG8KKwkJYXBwZWFyIHRvIGEgVVNCIGhvc3QgYXMgYSBMaW51eCBnc2VyaWFsIGRldmljZSBvciBhCisJCUNvbW1vbiBEZXZpY2UgQ2xhc3MgQWJzdHJhY3QgQ29udHJvbCBNb2RlbCBzZXJpYWwgZGV2aWNlLgorCQlJZiB5b3Ugc2VsZWN0IHVzYnR0eSA9IGdzZXJpYWwgeW91IHNob3VsZCBiZSBhYmxlIHRvIGVudW1lcmF0ZQorCQlhIExpbnV4IGhvc3QgYnkKKwkJIyBtb2Rwcm9iZSB1c2JzZXJpYWwgdmVuZG9yPTB4VmVuZG9ySUQgcHJvZHVjdD0weFByb2R1Y3RJRAorCQllbHNlIGlmIHVzaW5nIGNkY19hY20sIHNpbXBseSBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAorCQl2YXJpYWJsZSB1c2J0dHkgdG8gYmUgY2RjX2FjbSBzaG91bGQgc3VmZmljZS4gVGhlIGZvbGxvd2luZworCQltaWdodCBiZSBkZWZpbmVkIGluIFlvdXJCb2FyZE5hbWUuaAorCisJCQlDT05GSUdfVVNCX0RFVklDRQorCQkJRGVmaW5lIHRoaXMgdG8gYnVpbGQgYSBVREMgZGV2aWNlCisKKwkJCUNPTkZJR19VU0JfVFRZCisJCQlEZWZpbmUgdGhpcyB0byBoYXZlIGEgdHR5IHR5cGUgb2YgZGV2aWNlIGF2YWlsYWJsZSB0bworCQkJdGFsayB0byB0aGUgVURDIGRldmljZQorCisJCQlDRkdfQ09OU09MRV9JU19JTl9FTlYKKwkJCURlZmluZSB0aGlzIGlmIHlvdSB3YW50IHN0ZGluLCBzdGRvdXQgJi9vciBzdGRlcnIgdG8KKwkJCWJlIHNldCB0byB1c2J0dHkuCisKKwkJCW1wYzh4eDoKKwkJCQlDRkdfVVNCX0VYVENfQ0xLIDB4QkxBSAorCQkJCURlcml2ZSBVU0IgY2xvY2sgZnJvbSBleHRlcm5hbCBjbG9jayAiYmxhaCIKKwkJCQktIENGR19VU0JfRVhUQ19DTEsgMHgwMgorCisJCQkJQ0ZHX1VTQl9CUkdfQ0xLIDB4QkxBSAorCQkJCURlcml2ZSBVU0IgY2xvY2sgZnJvbSBicmdjbGsKKwkJCQktIENGR19VU0JfQlJHX0NMSyAweDA0CisKKwkJSWYgeW91IGhhdmUgYSBVU0ItSUYgYXNzaWduZWQgVmVuZG9ySUQgdGhlbiB5b3UgbWF5IHdpc2ggdG8KKwkJZGVmaW5lIHlvdXIgb3duIHZlbmRvciBzcGVjaWZpYyB2YWx1ZXMgZWl0aGVyIGluIEJvYXJkTmFtZS5oCisJCW9yIGRpcmVjdGx5IGluIHVzYmRfdmVuZG9yX2luZm8uaC4gSWYgeW91IGRvbid0IGRlZmluZQorCQlDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIsIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRSwKKwkJQ09ORklHX1VTQkRfVkVORE9SSUQgYW5kIENPTkZJR19VU0JEX1BST0RVQ1RJRCwgdGhlbiBVLUJvb3QKKwkJc2hvdWxkIHByZXRlbmQgdG8gYmUgYSBMaW51eCBkZXZpY2UgdG8gaXQncyB0YXJnZXQgaG9zdC4KKworCQkJQ09ORklHX1VTQkRfTUFOVUZBQ1RVUkVSCisJCQlEZWZpbmUgdGhpcyBzdHJpbmcgYXMgdGhlIG5hbWUgb2YgeW91ciBjb21wYW55IGZvcgorCQkJLSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIgIm15IGNvbXBhbnkiCisKKwkJCUNPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQorCQkJRGVmaW5lIHRoaXMgc3RyaW5nIGFzIHRoZSBuYW1lIG9mIHlvdXIgcHJvZHVjdAorCQkJLSBDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUgImFjbWUgdXNiIGRldmljZSIKKworCQkJQ09ORklHX1VTQkRfVkVORE9SSUQKKwkJCURlZmluZSB0aGlzIGFzIHlvdXIgYXNzaWduZWQgVmVuZG9yIElEIGZyb20gdGhlIFVTQgorCQkJSW1wbGVtZW50b3JzIEZvcnVtLiBUaGlzICptdXN0KiBiZSBhIGdlbnVpbmUgVmVuZG9yIElECisJCQl0byBhdm9pZCBwb2xsdXRpbmcgdGhlIFVTQiBuYW1lc3BhY2UuCisJCQktIENPTkZJR19VU0JEX1ZFTkRPUklEIDB4RkZGRgorCisJCQlDT05GSUdfVVNCRF9QUk9EVUNUSUQKKwkJCURlZmluZSB0aGlzIGFzIHRoZSB1bmlxdWUgUHJvZHVjdCBJRAorCQkJZm9yIHlvdXIgZGV2aWNlCisJCQktIENPTkZJR19VU0JEX1BST0RVQ1RJRCAweEZGRkYKIAogCiAtIE1NQyBTdXBwb3J0OgpAQCAtOTA3LDggKzg2MSw4IEBACiAJCWVuYWJsZSB0aGlzIGRlZmluZSBDT05GSUdfTU1DLiBUaGUgTU1DIGNhbiBiZQogCQlhY2Nlc3NlZCBmcm9tIHRoZSBib290IHByb21wdCBieSBtYXBwaW5nIHRoZSBkZXZpY2UKIAkJdG8gcGh5c2ljYWwgbWVtb3J5IHNpbWlsYXIgdG8gZmxhc2guIENvbW1hbmQgbGluZSBpcwotCQllbmFibGVkIHdpdGggQ0ZHX0NNRF9NTUMuIFRoZSBNTUMgZHJpdmVyIGFsc28gd29ya3Mgd2l0aAotCQl0aGUgRkFUIGZzLiBUaGlzIGlzIGVuYWJsZWQgd2l0aCBDRkdfQ01EX0ZBVC4KKwkJZW5hYmxlZCB3aXRoIENPTkZJR19DTURfTU1DLiBUaGUgTU1DIGRyaXZlciBhbHNvIHdvcmtzIHdpdGgKKwkJdGhlIEZBVCBmcy4gVGhpcyBpcyBlbmFibGVkIHdpdGggQ09ORklHX0NNRF9GQVQuCiAKIC0gSm91cm5hbGluZyBGbGFzaCBmaWxlc3lzdGVtIHN1cHBvcnQ6CiAJCUNPTkZJR19KRkZTMl9OQU5ELCBDT05GSUdfSkZGUzJfTkFORF9PRkYsIENPTkZJR19KRkZTMl9OQU5EX1NJWkUsCkBAIC0xMTEyLDYgKzEwNjYsMTYgQEAKIAkJRGVmaW5lcyBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZUlQIGFkZHJlc3Mgb2YgYSBURlRQCiAJCXNlcnZlciB0byBjb250YWN0IHdoZW4gdXNpbmcgdGhlICJ0ZnRib290IiBjb21tYW5kLgogCistIE11bHRpY2FzdCBURlRQIE1vZGU6CisJCUNPTkZJR19NQ0FTVF9URlRQCisKKwkJRGVmaW5lcyB3aGV0aGVyIHlvdSB3YW50IHRvIHN1cHBvcnQgbXVsdGljYXN0IFRGVFAgYXMgcGVyCisJCXJmYy0yMDkwOyBmb3IgZXhhbXBsZSB0byB3b3JrIHdpdGggYXRmdHAuICBMZXRzIGxvdHMgb2YgdGFyZ2V0cworCQl0ZnRwIGRvd24gdGhlIHNhbWUgYm9vdCBpbWFnZSBjb25jdXJyZW50bHkuICBOb3RlOiB0aGUgZXRoZXJuZXQKKwkJZHJpdmVyIGluIHVzZSBtdXN0IHByb3ZpZGUgYSBmdW5jdGlvbjogbWNhc3QoKSB0byBqb2luL2xlYXZlIGEKKwkJbXVsdGljYXN0IGdyb3VwLgorCisJCUNPTkZJR19CT09UUF9SQU5ET01fREVMQVkKIC0gQk9PVFAgUmVjb3ZlcnkgTW9kZToKIAkJQ09ORklHX0JPT1RQX1JBTkRPTV9ERUxBWQogCkBAIC0xMTIzLDcgKzEwODcsNyBAQAogCQlib290LCB0aHVzIGZsb29kaW5nIHRoZSBCT09UUCBzZXJ2ZXIuIERlZmluaW5nCiAJCUNPTkZJR19CT09UUF9SQU5ET01fREVMQVkgY2F1c2VzIGEgcmFuZG9tIGRlbGF5IHRvIGJlCiAJCWluc2VydGVkIGJlZm9yZSBzZW5kaW5nIG91dCBCT09UUCByZXF1ZXN0cy4gVGhlCi0JCWZvbGxvd2luZyBkZWxheXMgYXJlIGluc3RlcnRlZCB0aGVuOgorCQlmb2xsb3dpbmcgZGVsYXlzIGFyZSBpbnNlcnRlZCB0aGVuOgogCiAJCTFzdCBCT09UUCByZXF1ZXN0OglkZWxheSAwIC4uLiAxIHNlYwogCQkybmQgQk9PVFAgcmVxdWVzdDoJZGVsYXkgMCAuLi4gMiBzZWMKQEAgLTExMzIsMTAgKzEwOTYsMjQgQEAKIAkJQk9PVFAgcmVxdWVzdHM6CQlkZWxheSAwIC4uLiA4IHNlYwogCiAtIERIQ1AgQWR2YW5jZWQgT3B0aW9uczoKLQkJQ09ORklHX0JPT1RQX01BU0sKKwkJWW91IGNhbiBmaW5lIHR1bmUgdGhlIERIQ1AgZnVuY3Rpb25hbGl0eSBieSBkZWZpbmluZworCQlDT05GSUdfQk9PVFBfKiBzeW1ib2xzOgogCi0JCVlvdSBjYW4gZmluZSB0dW5lIHRoZSBESENQIGZ1bmN0aW9uYWxpdHkgYnkgYWRkaW5nCi0JCXRoZXNlIGZsYWdzIHRvIHRoZSBDT05GSUdfQk9PVFBfTUFTSyBkZWZpbmU6CisJCUNPTkZJR19CT09UUF9TVUJORVRNQVNLCisJCUNPTkZJR19CT09UUF9HQVRFV0FZCisJCUNPTkZJR19CT09UUF9IT1NUTkFNRQorCQlDT05GSUdfQk9PVFBfTklTRE9NQUlOCisJCUNPTkZJR19CT09UUF9CT09UUEFUSAorCQlDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisJCUNPTkZJR19CT09UUF9ETlMKKwkJQ09ORklHX0JPT1RQX0ROUzIKKwkJQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKKwkJQ09ORklHX0JPT1RQX05UUFNFUlZFUgorCQlDT05GSUdfQk9PVFBfVElNRU9GRlNFVAorCQlDT05GSUdfQk9PVFBfVkVORE9SRVgKKworCQlDT05GSUdfQk9PVFBfU0VSVkVSSVAgLSBURlRQIHNlcnZlciB3aWxsIGJlIHRoZSBzZXJ2ZXJpcAorCQllbnZpcm9ubWVudCB2YXJpYWJsZSwgbm90IHRoZSBCT09UUCBzZXJ2ZXIuCiAKIAkJQ09ORklHX0JPT1RQX0ROUzIgLSBJZiBhIERIQ1AgY2xpZW50IHJlcXVlc3RzIHRoZSBETlMKIAkJc2VydmVyaXAgZnJvbSBhIERIQ1Agc2VydmVyLCBpdCBpcyBwb3NzaWJsZSB0aGF0IG1vcmUKQEAgLTExNDQsMTUgKzExMjIsMTQgQEAKIAkJc2VydmVyaXAgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQKIAkJdmFyaWFibGUgImRuc2lwMiIuIFRoZSBmaXJzdCBETlMgc2VydmVyaXAgaXMgYWx3YXlzCiAJCXN0b3JlZCBpbiB0aGUgdmFyaWFibGUgImRuc2lwIiwgd2hlbiBDT05GSUdfQk9PVFBfRE5TCi0JCWlzIGFkZGVkIHRvIHRoZSBDT05GSUdfQk9PVFBfTUFTSy4KKwkJaXMgZGVmaW5lZC4KIAogCQlDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSAtIFNvbWUgREhDUCBzZXJ2ZXJzIGFyZSBjYXBhYmxlCiAJCXRvIGRvIGEgZHluYW1pYyB1cGRhdGUgb2YgYSBETlMgc2VydmVyLiBUbyBkbyB0aGlzLCB0aGV5CiAJCW5lZWQgdGhlIGhvc3RuYW1lIG9mIHRoZSBESENQIHJlcXVlc3Rlci4KLQkJSWYgQ09ORklHX0JPT1BfU0VORF9IT1NUTkFNRSBpcyBhZGRlZCB0byB0aGUKLQkJQ09ORklHX0JPT1RQX01BU0ssIHRoZSBjb250ZW50IG9mIHRoZSAiaG9zdG5hbWUiCi0JCWVudmlyb25tZW50IHZhcmlhYmxlIGlzIHBhc3NlZCBhcyBvcHRpb24gMTIgdG8KLQkJdGhlIERIQ1Agc2VydmVyLgorCQlJZiBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSBpcyBkZWZpbmVkLCB0aGUgY29udGVudAorCQlvZiB0aGUgImhvc3RuYW1lIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwYXNzZWQgYXMKKwkJb3B0aW9uIDEyIHRvIHRoZSBESENQIHNlcnZlci4KIAogIC0gQ0RQIE9wdGlvbnM6CiAJCUNPTkZJR19DRFBfREVWSUNFX0lECkBAIC0xMjIwLDcgKzExOTcsNyBAQAogCQlpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBJMkMgZHJpdmVyIGZvciB0aGUgc2VsZWN0ZWQgY3B1LgogCiAJCVRoaXMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIGkyYyBjb21tYW5kcyBhdCB0aGUgdS1ib290Ci0JCWNvbW1hbmQgbGluZSAoYXMgbG9uZyBhcyB5b3Ugc2V0IENGR19DTURfSTJDIGluCisJCWNvbW1hbmQgbGluZSAoYXMgbG9uZyBhcyB5b3Ugc2V0IENPTkZJR19DTURfSTJDIGluCiAJCUNPTkZJR19DT01NQU5EUykgYW5kIGNvbW11bmljYXRlIHdpdGggaTJjIGJhc2VkIHJlYWx0aW1lCiAJCWNsb2NrIGNoaXBzLiBTZWUgY29tbW9uL2NtZF9pMmMuYyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKIAkJY29tbWFuZCBsaW5lIGludGVyZmFjZS4KQEAgLTE2OTksMjggKzE2NzYsNjkgQEAKICAgLTMxCXBvc3QvcG9zdC5jCQlQT1NUIHRlc3QgZmFpbGVkLCBkZXRlY3RlZCBieSBwb3N0X291dHB1dF9iYWNrbG9nKCkKICAgLTMyCXBvc3QvcG9zdC5jCQlQT1NUIHRlc3QgZmFpbGVkLCBkZXRlY3RlZCBieSBwb3N0X3J1bl9zaW5nbGUoKQogCi0gICAtMQljb21tb24vY21kX2RvYy5jCUJhZCB1c2FnZSBvZiAiZG9jIiBjb21tYW5kCi0gICAtMQljb21tb24vY21kX2RvYy5jCU5vIGJvb3QgZGV2aWNlCi0gICAtMQljb21tb24vY21kX2RvYy5jCVVua25vd24gQ2hpcCBJRCBvbiBib290IGRldmljZQotICAgLTEJY29tbW9uL2NtZF9kb2MuYwlSZWFkIEVycm9yIG9uIGJvb3QgZGV2aWNlCi0gICAtMQljb21tb24vY21kX2RvYy5jCUltYWdlIGhlYWRlciBoYXMgYmFkIG1hZ2ljIG51bWJlcgorICAgMzQJY29tbW9uL2NtZF9kb2MuYwliZWZvcmUgbG9hZGluZyBhIEltYWdlIGZyb20gYSBET0MgZGV2aWNlCisgIC0zNQljb21tb24vY21kX2RvYy5jCUJhZCB1c2FnZSBvZiAiZG9jIiBjb21tYW5kCisgICAzNQljb21tb24vY21kX2RvYy5jCWNvcnJlY3QgdXNhZ2Ugb2YgImRvYyIgY29tbWFuZAorICAtMzYJY29tbW9uL2NtZF9kb2MuYwlObyBib290IGRldmljZQorICAgMzYJY29tbW9uL2NtZF9kb2MuYwljb3JyZWN0IGJvb3QgZGV2aWNlCisgIC0zNwljb21tb24vY21kX2RvYy5jCVVua25vd24gQ2hpcCBJRCBvbiBib290IGRldmljZQorICAgMzcJY29tbW9uL2NtZF9kb2MuYwljb3JyZWN0IGNoaXAgSUQgZm91bmQsIGRldmljZSBhdmFpbGFibGUKKyAgLTM4CWNvbW1vbi9jbWRfZG9jLmMJUmVhZCBFcnJvciBvbiBib290IGRldmljZQorICAgMzgJY29tbW9uL2NtZF9kb2MuYwlyZWFkaW5nIEltYWdlIGhlYWRlciBmcm9tIERPQyBkZXZpY2UgT0sKKyAgLTM5CWNvbW1vbi9jbWRfZG9jLmMJSW1hZ2UgaGVhZGVyIGhhcyBiYWQgbWFnaWMgbnVtYmVyCisgICAzOQljb21tb24vY21kX2RvYy5jCUltYWdlIGhlYWRlciBoYXMgY29ycmVjdCBtYWdpYyBudW1iZXIKKyAgLTQwCWNvbW1vbi9jbWRfZG9jLmMJRXJyb3IgcmVhZGluZyBJbWFnZSBmcm9tIERPQyBkZXZpY2UKKyAgIDQwCWNvbW1vbi9jbWRfZG9jLmMJSW1hZ2UgaGVhZGVyIGhhcyBjb3JyZWN0IG1hZ2ljIG51bWJlcgorICAgNDEJY29tbW9uL2NtZF9pZGUuYwliZWZvcmUgbG9hZGluZyBhIEltYWdlIGZyb20gYSBJREUgZGV2aWNlCisgIC00Mgljb21tb24vY21kX2lkZS5jCUJhZCB1c2FnZSBvZiAiaWRlIiBjb21tYW5kCisgICA0Mgljb21tb24vY21kX2lkZS5jCWNvcnJlY3QgdXNhZ2Ugb2YgImlkZSIgY29tbWFuZAorICAtNDMJY29tbW9uL2NtZF9pZGUuYwlObyBib290IGRldmljZQorICAgNDMJY29tbW9uL2NtZF9pZGUuYwlib290IGRldmljZSBmb3VuZAorICAtNDQJY29tbW9uL2NtZF9pZGUuYwlEZXZpY2Ugbm90IGF2YWlsYWJsZQorICAgNDQJY29tbW9uL2NtZF9pZGUuYwlEZXZpY2UgYXZhaWxhYmxlCisgIC00NQljb21tb24vY21kX2lkZS5jCXdyb25nIHBhcnRpdGlvbiBzZWxlY3RlZAorICAgNDUJY29tbW9uL2NtZF9pZGUuYwlwYXJ0aXRpb24gc2VsZWN0ZWQKKyAgLTQ2CWNvbW1vbi9jbWRfaWRlLmMJVW5rbm93biBwYXJ0aXRpb24gdGFibGUKKyAgIDQ2CWNvbW1vbi9jbWRfaWRlLmMJdmFsaWQgcGFydGl0aW9uIHRhYmxlIGZvdW5kCisgIC00Nwljb21tb24vY21kX2lkZS5jCUludmFsaWQgcGFydGl0aW9uIHR5cGUKKyAgIDQ3CWNvbW1vbi9jbWRfaWRlLmMJY29ycmVjdCBwYXJ0aXRpb24gdHlwZQorICAtNDgJY29tbW9uL2NtZF9pZGUuYwlFcnJvciByZWFkaW5nIEltYWdlIEhlYWRlciBvbiBib290IGRldmljZQorICAgNDgJY29tbW9uL2NtZF9pZGUuYwlyZWFkaW5nIEltYWdlIEhlYWRlciBmcm9tIElERSBkZXZpY2UgT0sKKyAgLTQ5CWNvbW1vbi9jbWRfaWRlLmMJSW1hZ2UgaGVhZGVyIGhhcyBiYWQgbWFnaWMgbnVtYmVyCisgICA0OQljb21tb24vY21kX2lkZS5jCUltYWdlIGhlYWRlciBoYXMgY29ycmVjdCBtYWdpYyBudW1iZXIKKyAgLTUwCWNvbW1vbi9jbWRfaWRlLmMJSW1hZ2UgaGVhZGVyIGhhcyBiYWQJIGNoZWNrc3VtCisgICA1MAljb21tb24vY21kX2lkZS5jCUltYWdlIGhlYWRlciBoYXMgY29ycmVjdCBjaGVja3N1bQorICAtNTEJY29tbW9uL2NtZF9pZGUuYwlFcnJvciByZWFkaW5nIEltYWdlIGZyb20gSURFIGRldmljZQorICAgNTEJY29tbW9uL2NtZF9pZGUuYwlyZWFkaW5nIEltYWdlIGZyb20gSURFIGRldmljZSBPSworICAgNTIJY29tbW9uL2NtZF9uYW5kLmMJYmVmb3JlIGxvYWRpbmcgYSBJbWFnZSBmcm9tIGEgTkFORCBkZXZpY2UKKyAgLTUzCWNvbW1vbi9jbWRfbmFuZC5jCUJhZCB1c2FnZSBvZiAibmFuZCIgY29tbWFuZAorICAgNTMJY29tbW9uL2NtZF9uYW5kLmMJY29ycmVjdCB1c2FnZSBvZiAibmFuZCIgY29tbWFuZAorICAtNTQJY29tbW9uL2NtZF9uYW5kLmMJTm8gYm9vdCBkZXZpY2UKKyAgIDU0CWNvbW1vbi9jbWRfbmFuZC5jCWJvb3QgZGV2aWNlIGZvdW5kCisgIC01NQljb21tb24vY21kX25hbmQuYwlVbmtub3duIENoaXAgSUQgb24gYm9vdCBkZXZpY2UKKyAgIDU1CWNvbW1vbi9jbWRfbmFuZC5jCWNvcnJlY3QgY2hpcCBJRCBmb3VuZCwgZGV2aWNlIGF2YWlsYWJsZQorICAtNTYJY29tbW9uL2NtZF9uYW5kLmMJRXJyb3IgcmVhZGluZyBJbWFnZSBIZWFkZXIgb24gYm9vdCBkZXZpY2UKKyAgIDU2CWNvbW1vbi9jbWRfbmFuZC5jCXJlYWRpbmcgSW1hZ2UgSGVhZGVyIGZyb20gTkFORCBkZXZpY2UgT0sKKyAgLTU3CWNvbW1vbi9jbWRfbmFuZC5jCUltYWdlIGhlYWRlciBoYXMgYmFkIG1hZ2ljIG51bWJlcgorICAgNTcJY29tbW9uL2NtZF9uYW5kLmMJSW1hZ2UgaGVhZGVyIGhhcyBjb3JyZWN0IG1hZ2ljIG51bWJlcgorICAtNTgJY29tbW9uL2NtZF9uYW5kLmMJRXJyb3IgcmVhZGluZyBJbWFnZSBmcm9tIE5BTkQgZGV2aWNlCisgICA1OAljb21tb24vY21kX25hbmQuYwlyZWFkaW5nIEltYWdlIGZyb20gTkFORCBkZXZpY2UgT0sKIAotICAgLTEJY29tbW9uL2NtZF9pZGUuYwlCYWQgdXNhZ2Ugb2YgImlkZSIgY29tbWFuZAotICAgLTEJY29tbW9uL2NtZF9pZGUuYwlObyBib290IGRldmljZQotICAgLTEJY29tbW9uL2NtZF9pZGUuYwlVbmtub3duIGJvb3QgZGV2aWNlCi0gICAtMQljb21tb24vY21kX2lkZS5jCVVua25vd24gcGFydGl0aW9uIHRhYmxlCi0gICAtMQljb21tb24vY21kX2lkZS5jCUludmFsaWQgcGFydGl0aW9uIHR5cGUKLSAgIC0xCWNvbW1vbi9jbWRfaWRlLmMJUmVhZCBFcnJvciBvbiBib290IGRldmljZQotICAgLTEJY29tbW9uL2NtZF9pZGUuYwlJbWFnZSBoZWFkZXIgaGFzIGJhZCBtYWdpYyBudW1iZXIKKyAgLTYwCWNvbW1vbi9lbnZfY29tbW9uLmMJRW52aXJvbm1lbnQgaGFzIGEgYmFkIENSQywgdXNpbmcgZGVmYXVsdAogCi0gICAtMQljb21tb24vY21kX25hbmQuYwlCYWQgdXNhZ2Ugb2YgIm5hbmQiIGNvbW1hbmQKLSAgIC0xCWNvbW1vbi9jbWRfbmFuZC5jCU5vIGJvb3QgZGV2aWNlCi0gICAtMQljb21tb24vY21kX25hbmQuYwlVbmtub3duIENoaXAgSUQgb24gYm9vdCBkZXZpY2UKLSAgIC0xCWNvbW1vbi9jbWRfbmFuZC5jCVJlYWQgRXJyb3Igb24gYm9vdCBkZXZpY2UKLSAgIC0xCWNvbW1vbi9jbWRfbmFuZC5jCUltYWdlIGhlYWRlciBoYXMgYmFkIG1hZ2ljIG51bWJlcgorICAgNjQJbmV0L2V0aC5jCQlzdGFydGluZyB3aXRoIEV0aGVybmV0Y29uZmlndXJhdGlvbi4KKyAgLTY0CW5ldC9ldGguYwkJbm8gRXRoZXJuZXQgZm91bmQuCisgICA2NQluZXQvZXRoLmMJCUV0aGVybmV0IGZvdW5kLgogCi0gICAtMQljb21tb24vZW52X2NvbW1vbi5jCUVudmlyb25tZW50IGhhcyBhIGJhZCBDUkMsIHVzaW5nIGRlZmF1bHQKLQorICAtODAJY29tbW9uL2NtZF9uZXQuYwl1c2FnZSB3cm9uZworICAgODAJY29tbW9uL2NtZF9uZXQuYwliZWZvcmUgY2FsbGluZyBOZXRMb29wKCkKKyAgLTgxCWNvbW1vbi9jbWRfbmV0LmMJc29tZSBlcnJvciBpbiBOZXRMb29wKCkgb2NjdXJlZAorICAgODEJY29tbW9uL2NtZF9uZXQuYwlOZXRMb29wKCkgYmFjayB3aXRob3V0IGVycm9yCisgIC04Mgljb21tb24vY21kX25ldC5jCXNpemUgPT0gMCAoRmlsZSB3aXRoIHNpemUgMCBsb2FkZWQpCisgICA4Mgljb21tb24vY21kX25ldC5jCXRyeWluZyBhdXRvbWF0aWMgYm9vdAorICAgODMJY29tbW9uL2NtZF9uZXQuYwlydW5uaW5nIGF1dG9zY3JpcHQKKyAgLTgzCWNvbW1vbi9jbWRfbmV0LmMJc29tZSBlcnJvciBpbiBhdXRvbWF0aWMgYm9vdCBvciBhdXRvc2NyaXB0CisgICA4NAljb21tb24vY21kX25ldC5jCWVuZCB3aXRob3V0IGVycm9ycwogCiBNb2RlbSBTdXBwb3J0OgogLS0tLS0tLS0tLS0tLS0KQEAgLTIzMjgsNyArMjM0Niw3IEBACiAKIC0gQ09ORklHX0xPT1BXCiAJCUFkZCB0aGUgImxvb3B3IiBtZW1vcnkgY29tbWFuZC4gVGhpcyBvbmx5IHRha2VzIGVmZmVjdCBpZgotCQl0aGUgbWVtb3J5IGNvbW1hbmRzIGFyZSBhY3RpdmF0ZWQgZ2xvYmFsbHkgKENGR19DTURfTUVNKS4KKwkJdGhlIG1lbW9yeSBjb21tYW5kcyBhcmUgYWN0aXZhdGVkIGdsb2JhbGx5IChDT05GSUdfQ01EX01FTSkuCiAKIC0gQ09ORklHX01YX0NZQ0xJQwogCQlBZGQgdGhlICJtZGMiIGFuZCAibXdjIiBtZW1vcnkgY29tbWFuZHMuIFRoZXNlIGFyZSBjeWNsaWMKQEAgLTIzNDIsNyArMjM2MCw3IEBACiAJCVRoaXMgY29tbWFuZCB3aWxsIHdyaXRlIDEyMzQ1Njc4IHRvIGFkZHJlc3MgMTAwIGFsbCAxMCBtcy4KIAogCQlUaGlzIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHRoZSBtZW1vcnkgY29tbWFuZHMgYXJlIGFjdGl2YXRlZAotCQlnbG9iYWxseSAoQ0ZHX0NNRF9NRU0pLgorCQlnbG9iYWxseSAoQ09ORklHX0NNRF9NRU0pLgogCiAtIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQKIC0gQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QKQEAgLTIzODIsMzQgKzI0MDAsNyBAQAogCW1ha2UgTkFNRV9jb25maWcKIAogd2hlcmUgIk5BTUVfY29uZmlnIiBpcyB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGV4aXN0aW5nCi1jb25maWd1cmF0aW9uczsgdGhlIGZvbGxvd2luZyBuYW1lcyBhcmUgc3VwcG9ydGVkOgotCi0JQURDSU9QX2NvbmZpZwkJRlBTODYwTF9jb25maWcJCW9tYXA3MzBwMl9jb25maWcKLQlBRFM4NjBfY29uZmlnCQlHRU44NjBUX2NvbmZpZwkJcGN1X2VfY29uZmlnCi0JQWxhc2thODIyMF9jb25maWcKLQlBUjQwNV9jb25maWcJCUdFTklFVFZfY29uZmlnCQlQSVA0MDVfY29uZmlnCi0JYXQ5MXJtOTIwMGRrX2NvbmZpZwlHVEhfY29uZmlnCQlRUzgyM19jb25maWcKLQlDQU5CVF9jb25maWcJCWhlcm1lc19jb25maWcJCVFTODUwX2NvbmZpZwotCWNtaV9tcGM1eHhfY29uZmlnCWh5bW9kX2NvbmZpZwkJUVM4NjBUX2NvbmZpZwotCWNvZ2VudF9jb21tb25fY29uZmlnCUlQODYwX2NvbmZpZwkJUlBYbGl0ZV9jb25maWcKLQljb2dlbnRfbXBjODI2MF9jb25maWcJSVZNTDI0X2NvbmZpZwkJUlBYbGl0ZV9EV19jb25maWcKLQljb2dlbnRfbXBjOHh4X2NvbmZpZwlJVk1TOF9jb25maWcJCVJQWHN1cGVyX2NvbmZpZwotCUNQQ0k0MDVfY29uZmlnCQlKU0VfY29uZmlnCQlyc2Rwcm90b19jb25maWcKLQlDUENJSVNFUjRfY29uZmlnCUxBTlRFQ19jb25maWcJCVNhbmRwb2ludDgyNDBfY29uZmlnCi0JY3NiMjcyX2NvbmZpZwkJbHdtb25fY29uZmlnCQlzYmM4MjYwX2NvbmZpZwotCUNVODI0X2NvbmZpZwkJTUJYODYwVF9jb25maWcJCXNiYzg1NjBfMzNfY29uZmlnCi0JRFVFVF9BRFNfY29uZmlnCQlNQlhfY29uZmlnCQlzYmM4NTYwXzY2X2NvbmZpZwotCUVCT05ZX2NvbmZpZwkJbXBjNzQ0OGhwYzJfY29uZmlnCVNNODUwX2NvbmZpZwotCUVMUFQ4NjBfY29uZmlnCQlNUEM4MjYwQURTX2NvbmZpZwlTUEQ4MjNUU19jb25maWcKLQlFU1RFRU0xOTJFX2NvbmZpZwlNUEM4NTQwQURTX2NvbmZpZwlzdHhncDNfY29uZmlnCi0JRVRYMDk0X2NvbmZpZwkJTVBDODU0MEVWQUxfY29uZmlnCVNYTkk4NTVUX2NvbmZpZwotCUZBRFM4MjNfY29uZmlnCQlOTVBDODU2MEFEU19jb25maWcJVFFNODIzTF9jb25maWcKLQlGQURTODUwU0FSX2NvbmZpZwlORVRWSUFfY29uZmlnCQlUUU04NTBMX2NvbmZpZwotCUZBRFM4NjBUX2NvbmZpZwkJb21hcDE1MTBpbm5fY29uZmlnCVRRTTg1NUxfY29uZmlnCi0JRlBTODUwTF9jb25maWcJCW9tYXAxNjEwaDJfY29uZmlnCVRRTTg2MExfY29uZmlnCi0JCQkJb21hcDE2MTBpbm5fY29uZmlnCXdhbG51dF9jb25maWcKLQkJCQlvbWFwNTkxMm9za19jb25maWcJWXVrb244MjIwX2NvbmZpZwotCQkJCW9tYXAyNDIwaDRfY29uZmlnCVpQQzE5MDBfY29uZmlnCitjb25maWd1cmF0aW9uczsgc2VlIHRoZSBtYWluIE1ha2VmaWxlIGZvciBzdXBwb3J0ZWQgbmFtZXMuCiAKIE5vdGU6IGZvciBzb21lIGJvYXJkIHNwZWNpYWwgY29uZmlndXJhdGlvbiBuYW1lcyBtYXkgZXhpc3Q7IGNoZWNrIGlmCiAgICAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBib2FyZCB2ZW5kb3I7IGZvcgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9BbWlnYU9uZUczU0UuYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvQW1pZ2FPbmVHM1NFLmMKaW5kZXggNDBmNDFjNy4uYjQ3MjE3NiAxMDA2NDQKLS0tIGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9BbWlnYU9uZUczU0UuYworKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL0FtaWdhT25lRzNTRS5jCkBAIC0zMCw0OSArMzAsNDkgQEAKICNpbmNsdWRlICJtZW1pby5oIgogI2luY2x1ZGUgInZpYTY4Ni5oIgogCi1fX2FzbSgiIC5nbG9ibCBzZW5kX2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCXNlbmRfa2I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsaXMgICAgIHI5LCAweGZlMDAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JCWxpICAgICAgcjQsIDB4MTAgICAgICAgICMgcmV0cmllcyAgICAgICAgICAgXG4KLQkJbXRjdHIgICByNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCWlkbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsYnogICAgIHI0LCAweDY0KHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWFuZGkuICAgcjQsIHI0LCAweDAyICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYm5lICAgICBpZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCXJlYWR5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlzdGIgICAgIHIzLCAweDYwKHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JY2hlY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWxieiAgICAgcjQsIDB4NjQocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYW5kaS4gICByNCwgcjQsIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQliZXEgICAgIGNoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JCWxieiAgICAgcjQsIDB4NjAocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJY21wd2kgICByNCwgMHhmYSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQliZXEgICAgIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JCWJkbnogICAgaWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJCQkJCQkgICAgXG4KLQkJbGkgICAgICByMywgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JZG9uZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWxpICAgICAgcjMsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCS5nbG9ibCB0ZXN0X2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCXRlc3Rfa2I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQltZmxyICAgIHIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWxpICAgICAgcjMsIDB4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYmwgICAgICBzZW5kX2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsaSAgICAgIHIzLCAweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWJsICAgICAgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJbXRsciAgICByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0iKTsKK19fYXNtX18oIiAuZ2xvYmwgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAJCSAgICBcbiAiCisJInNlbmRfa2I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWxpcyAgICAgcjksIDB4ZmUwMCAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJCQkJCQkgICAgXG4gIgorCSIJbGkgICAgICByNCwgMHgxMCAgICAgICAgIyByZXRyaWVzICAgICAgICAgICBcbiAiCisJIgltdGN0ciAgIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCQkJCQkJICAgIFxuICIKKwkiaWRsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJbGJ6ICAgICByNCwgMHg2NChyOSkgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglhbmRpLiAgIHI0LCByNCwgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJuZSAgICAgaWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCisJInJlYWR5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCXN0YiAgICAgcjMsIDB4NjAocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJCQkJCQkgICAgXG4gIgorCSJjaGVjazogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglsYnogICAgIHI0LCAweDY0KHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWFuZGkuICAgcjQsIHI0LCAweDAxICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmVxICAgICBjaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIgkJCQkJCSAgICBcbiAiCisJIglsYnogICAgIHI0LCAweDYwKHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWNtcHdpICAgcjQsIDB4ZmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmVxICAgICBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisKKwkiCWJkbnogICAgaWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCisJIglsaSAgICAgIHIzLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCisJImRvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWxpICAgICAgcjMsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisKKwkiLmdsb2JsIHRlc3Rfa2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSJ0ZXN0X2tiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIgltZmxyICAgIHIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWxpICAgICAgcjMsIDB4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmwgICAgICBzZW5kX2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglsaSAgICAgIHIzLCAweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJsICAgICAgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJbXRsciAgICByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyk7CiAKIAogaW50IGNoZWNrYm9hcmQgKHZvaWQpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2NtZF9ib290YS5jIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9jbWRfYm9vdGEuYwppbmRleCAxNDNiYmEyLi40MGM5NTFkIDEwMDY0NAotLS0gYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2NtZF9ib290YS5jCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvY21kX2Jvb3RhLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FPTkVHM1NFKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQU1JR0FPTkVHM1NFKSAmJiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogVV9CT09UX0NNRCgKIAlib290YSwgICAzLCAgICAgIDEsICAgICAgZG9fYm9vdGEsCiAJImJvb3RhICAgLSBib290IGFuIEFtaWdhIGtlcm5lbFxuIiwKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdmlkZW8uYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdmlkZW8uYwppbmRleCBmNjMyN2Y3Li5mYzI3YzY4IDEwMDY0NAotLS0gYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpZGVvLmMKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS92aWRlby5jCkBAIC01Niw2ICs1Niw3IEBACiBpbnQgIHZpZGVvX2NvbHModm9pZCk7CiAKIGNoYXIgKnByb21wdF9zdHJpbmcgPSAiPT4iOwordW5zaWduZWQgY2hhciB2aWRlb19nZXRfYXR0cih2b2lkKTsKIAogdm9pZCB2aWRlb19zZXRfY29sb3IodW5zaWduZWQgY2hhciBhdHRyKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvYmlvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvYmlvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFlYjY0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2Jpb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKgotICogTW9zdGx5IGRvbmUgYWZ0ZXIgdGhlIFNjaXRlY2ggQmlvcyBlbXVsYXRpb24KLSAqIFdyaXR0ZW4gYnkgSGFucy1K9nJnIEZyaWVkZW4KLSAqIEh5cGVyaW9uIEVudGVydGFpbm1lbnQKLSAqLwotI2luY2x1ZGUgIng4NmVtdS5oIgotI2luY2x1ZGUgImdsdWUuaCIKLQotI3VuZGVmIERFQlVHCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgUFJJTlRGKGZtdCwgYXJncy4uLikgcHJpbnRmKGZtdCwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIFBSSU5URihmbXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2RlZmluZSBCSU9TX1NFRyAweEZGRjAKLSNkZWZpbmUgUENJQklPU19TVUNDRVNTRlVMIDAKLSNkZWZpbmUgUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EIDB4ODYKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVCWVRFOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVV09SRDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKLQotdHlwZWRlZiBjaGFyIEJZVEU7Ci10eXBlZGVmIHNob3J0IFdPUlQ7Ci10eXBlZGVmIGxvbmcgTE9ORzsKLQotc3RhdGljIGlubGluZSBVQllURSByZWFkX2J5dGUodm9sYXRpbGUgVUJZVEUqIGZyb20pCi17Ci0gICAgaW50IHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibGJ6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVQllURSl4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfYnl0ZSh2b2xhdGlsZSBVQllURSAqdG8sIGludCB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0YiAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKLX0KLQotc3RhdGljIGlubGluZSBVV09SRCByZWFkX3dvcmRfbGl0dGxlKHZvbGF0aWxlIFVXT1JEICpmcm9tKQotewotICAgIGludCB4OwotICAgIGFzbSB2b2xhdGlsZSAoImxoYnJ4ICUwLDAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJyIiAoZnJvbSksICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVXT1JEKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVVdPUkQgcmVhZF93b3JkX2JpZyh2b2xhdGlsZSBVV09SRCAqZnJvbSkKLXsKLSAgICBpbnQgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsaHogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVXT1JEKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93b3JkX2xpdHRsZSh2b2xhdGlsZSBVV09SRCAqdG8sIGludCB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0aGJyeCAlMSwwLCUyXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCksICJyIiAodG8pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dvcmRfYmlnKHZvbGF0aWxlIFVXT1JEICp0bywgaW50IHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3RoICUxLCUwXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCkpOwotfQotCi1zdGF0aWMgaW5saW5lIFVMT05HIHJlYWRfbG9uZ19saXR0bGUodm9sYXRpbGUgVUxPTkcgKmZyb20pCi17Ci0gICAgdW5zaWduZWQgbG9uZyB4OwotICAgIGFzbSB2b2xhdGlsZSAoImx3YnJ4ICUwLDAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJyIiAoZnJvbSksICJtIigqZnJvbSkpOwotICAgIHJldHVybiAoVUxPTkcpeDsKLX0KLQotc3RhdGljIGlubGluZSBVTE9ORyByZWFkX2xvbmdfYmlnKHZvbGF0aWxlIFVMT05HICpmcm9tKQotewotICAgIHVuc2lnbmVkIGxvbmcgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsd3ogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVMT05HKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9sb25nX2xpdHRsZSh2b2xhdGlsZSBVTE9ORyAqdG8sIFVMT05HIHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3R3YnJ4ICUxLDAsJTJcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSwgInIiICh0bykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbG9uZ19iaWcodm9sYXRpbGUgVUxPTkcgKnRvLCBVTE9ORyB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0dyAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKLX0KLQotI2RlZmluZSBwb3J0X3RvX21lbShmcm9tKSAoMHhGRTAwMDAwMHwoZnJvbSkpCi0jZGVmaW5lIGluX2J5dGUoZnJvbSkgcmVhZF9ieXRlKCAoVUJZVEUgKilwb3J0X3RvX21lbShmcm9tKSkKLSNkZWZpbmUgaW5fd29yZChmcm9tKSByZWFkX3dvcmRfbGl0dGxlKChVV09SRCAqKXBvcnRfdG9fbWVtKGZyb20pKQotI2RlZmluZSBpbl9sb25nKGZyb20pIHJlYWRfbG9uZ19saXR0bGUoKFVMT05HICopcG9ydF90b19tZW0oZnJvbSkpCi0jZGVmaW5lIG91dF9ieXRlKHRvLCB2YWwpIHdyaXRlX2J5dGUoKFVCWVRFICopcG9ydF90b19tZW0odG8pLCB2YWwpCi0jZGVmaW5lIG91dF93b3JkKHRvLCB2YWwpIHdyaXRlX3dvcmRfbGl0dGxlKChVV09SRCAqKXBvcnRfdG9fbWVtKHRvKSwgdmFsKQotI2RlZmluZSBvdXRfbG9uZyh0bywgdmFsKSB3cml0ZV9sb25nX2xpdHRsZSgoVUxPTkcgKilwb3J0X3RvX21lbSh0byksIHZhbCkKLQotc3RhdGljIHZvaWQgWDg2QVBJIHVuZGVmaW5lZF9pbnRyKGludCBpbnRubykKLXsKLSAgICBleHRlcm4gdTE2IEExX3Jkdyh1MzIgYWRkcik7Ci0gICAgaWYgKEExX3JkdyhpbnRubyAqIDQgKyAyKSA9PSBCSU9TX1NFRykKLSAgICB7Ci0JUFJJTlRGKCJVbmRlZmluZWQgaW50ZXJydXB0ICV4aCBjYWxsZWQgQVggPSAleGgsIEJYID0gJXhoLCBDWCA9ICV4aCwgRFggPSAleGhcbiIsCi0JICAgaW50bm8sIE0ueDg2LlJfQVgsIE0ueDg2LlJfQlgsIE0ueDg2LlJfQ1gsIE0ueDg2LlJfRFgpOwotCVg4NkVNVV9oYWx0X3N5cygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCVBSSU5URigiQ2FsbGluZyBpbnRlcnJ1cHQgJXhoLCBBTD0leGgsIEFIPSV4aFxuIiwgaW50bm8sIE0ueDg2LlJfQUwsIE0ueDg2LlJfQUgpOwotCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQ0MihpbnQgaW50bm8pOwotc3RhdGljIHZvaWQgWDg2QVBJIGludDE1KGludCBpbnRubyk7Ci0KLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQxMChpbnQgaW50bm8pCi17Ci0gICAgaWYgKEExX3JkdyhpbnRubyo0KzIpID09IEJJT1NfU0VHKQotCWludDQyKGludG5vKTsKLSAgICBlbHNlCi0gICAgewotCVBSSU5URigiaW50MTA6IGJyYW5jaGluZyB0byAlMDRYOiUwNFgsIEFMPSV4aCwgQUg9JXhoXG4iLCBBMV9yZHcoaW50bm8qNCsyKSwgQTFfcmR3KGludG5vKjQpLAotCSAgICAgICBNLng4Ni5SX0FMLCBNLng4Ni5SX0FIKTsKLQlYODZFTVVfcHJlcGFyZUZvckludChpbnRubyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50MUEoaW50IGludG5vKQotewotICAgIGludCBkZXZpY2U7Ci0KLSAgICBzd2l0Y2goTS54ODYuUl9BWCkKLSAgICB7Ci0gICAgY2FzZSAweEIxMDE6IC8qIFBDSSBCaW9zIFByZXNlbnQ/ICovCi0JTS54ODYuUl9BTCAgPSAweDAwOwotCU0ueDg2LlJfRURYID0gMHgyMDQ5NDM1MDsKLQlNLng4Ni5SX0JYICA9IDB4MDIxMDsKLQlNLng4Ni5SX0NMICA9IDM7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlicmVhazsKLSAgICBjYXNlIDB4QjEwMjogLyogRmluZCBkZXZpY2UgKi8KLQlkZXZpY2UgPSBteXBjaV9maW5kX2RldmljZShNLng4Ni5SX0RYLCBNLng4Ni5SX0NYLCBNLng4Ni5SX1NJKTsKLQlpZiAoZGV2aWNlICE9IC0xKQotCXsKLQkgICAgTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQkgICAgTS54ODYuUl9CSCA9IG15cGNpX2J1cyhkZXZpY2UpOwotCSAgICBNLng4Ni5SX0JMID0gbXlwY2lfZGV2Zm4oZGV2aWNlKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgTS54ODYuUl9BSCA9IFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQl9Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMDM6IC8qIEZpbmQgUENJIGNsYXNzIGNvZGUgKi8KLQlNLng4Ni5SX0FIID0gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCS8qcHJpbnRmKCJGaW5kIGJ5IGNsYXNzIG5vdCB5ZXQgaW1wbG1lbnRlZCIpOyAqLwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCWJyZWFrOwotICAgIGNhc2UgMHhCMTA4OiAvKiByZWFkIGNvbmZpZyBieXRlICovCi0JTS54ODYuUl9DTCA9IG15cGNpX3JlYWRfY2ZnX2J5dGUoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50ZigicmVhZF9jb25maWdfYnl0ZSAleCwleCwleCAtPiAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgKi8KLQkvKgkgICAgTS54ODYuUl9DTCk7ICovCi0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMDk6IC8qIHJlYWQgY29uZmlnIHdvcmQgKi8KLQlNLng4Ni5SX0NYID0gbXlwY2lfcmVhZF9jZmdfd29yZChNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJKTsKLQlNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCS8qcHJpbnRmKCJyZWFkX2NvbmZpZ193b3JkICV4LCV4LCV4IC0+ICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCAqLwotCS8qCSAgICBNLng4Ni5SX0NYKTsgKi8KLQlicmVhazsKLSAgICBjYXNlIDB4QjEwQTogLyogcmVhZCBjb25maWcgZHdvcmQgKi8KLQlNLng4Ni5SX0VDWCA9IG15cGNpX3JlYWRfY2ZnX2xvbmcoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50ZigicmVhZF9jb25maWdfbG9uZyAleCwleCwleCAtPiAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgKi8KLQkvKiAgICBNLng4Ni5SX0VDWCk7ICovCi0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMEI6IC8qIHdyaXRlIGNvbmZpZyBieXRlICovCi0JbXlwY2lfd3JpdGVfY2ZnX2J5dGUoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgTS54ODYuUl9DTCk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50Zigid3JpdGVfY29uZmlnX2J5dGUgJXgsJXgsJXggPC0gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCi0JLyogICAgTS54ODYuUl9DTCk7ICovCi0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMEM6IC8qIHdyaXRlIGNvbmZpZyB3b3JkICovCi0JbXlwY2lfd3JpdGVfY2ZnX3dvcmQoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgTS54ODYuUl9DWCk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50Zigid3JpdGVfY29uZmlnX3dvcmQgJXgsJXgsJXggPC0gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCi0JLyoJICAgIE0ueDg2LlJfQ1gpOyAqLwotCWJyZWFrOwotICAgIGNhc2UgMHhCMTBEOiAvKiB3cml0ZSBjb25maWcgZHdvcmQgKi8KLQlteXBjaV93cml0ZV9jZmdfbG9uZyhNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0VDWCk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50Zigid3JpdGVfY29uZmlnX2xvbmcgJXgsJXgsJXggPC0gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCi0JLyoJICAgIE0ueDg2LlJfRUNYKTsgKi8KLQlicmVhazsKLSAgICBkZWZhdWx0OgotCVBSSU5URigiQklPUyBpbnQgJXhoOiBVbmtub3duIGZ1bmN0aW9uIEFYPSUwNHhoXG4iLCBpbnRubywgTS54ODYuUl9BWCk7Ci0KLSAgICB9Ci19Ci0KLXZvaWQgYmlvc19pbml0KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgWDg2RU1VX2ludHJGdW5jcyBiaW9zX2ludHJfdGFiWzI1Nl07Ci0KLSAgICBmb3IgKGk9MDsgaTwyNTY7IGkrKykKLSAgICB7Ci0Jd3JpdGVfbG9uZ19saXR0bGUoTS5tZW1fYmFzZStpKjQsIEJJT1NfU0VHPDwxNik7Ci0JYmlvc19pbnRyX3RhYltpXSA9IHVuZGVmaW5lZF9pbnRyOwotICAgIH0KLQotICAgIGJpb3NfaW50cl90YWJbMHgxMF0gPSBpbnQxMDsKLSAgICBiaW9zX2ludHJfdGFiWzB4MUFdID0gaW50MUE7Ci0gICAgYmlvc19pbnRyX3RhYlsweDQyXSA9IGludDQyOwotICAgIGJpb3NfaW50cl90YWJbMHgxNV0gPSBpbnQxNTsKLQotICAgIGJpb3NfaW50cl90YWJbMHg2RF0gPSBpbnQ0MjsKLQotICAgIFg4NkVNVV9zZXR1cEludHJGdW5jcyhiaW9zX2ludHJfdGFiKTsKLSAgICB2aWRlb19pbml0KCk7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgc2V0dXBfNDB4MjVbXSA9Ci17Ci0gICAgMHgzOCwgMHgyOCwgMHgyZCwgMHgwYSwgMHgxZiwgNiwgMHgxOSwKLSAgICAweDFjLCAyLCA3LCA2LCA3LCAwLCAwLCAwLCAwCi19OwotCi11bnNpZ25lZCBjaGFyIHNldHVwXzgweDI1W10gPQotewotICAgIDB4NzEsIDB4NTAsIDB4NWEsIDB4MGEsIDB4MWYsIDYsIDB4MTksCi0gICAgMHgxYywgMiwgNywgNiwgNywgMCwgMCwgMCwgMAotfTsKLQotdW5zaWduZWQgY2hhciBzZXR1cF9ncmFwaGljc1tdID0KLXsKLSAgICAweDM4LCAweDI4LCAweDIwLCAweDBhLCAweDdmLCA2LCAweDY0LAotICAgIDB4NzAsIDIsIDEsIDYsIDcsIDAsIDAsIDAsIDAKLX07Ci0KLXVuc2lnbmVkIGNoYXIgc2V0dXBfYndbXSA9Ci17Ci0gICAgMHg2MSwgMHg1MCwgMHg1MiwgMHgwZiwgMHgxOSwgNiwgMHgxOSwKLSAgICAweDE5LCAyLCAweDBkLCAweDBiLCAweDBjLCAwLCAwLCAwLCAwCi19OwotCi11bnNpZ25lZCBjaGFyICogc2V0dXBfbW9kZXNbXSA9Ci17Ci0gICAgc2V0dXBfNDB4MjUsICAgICAvKiBtb2RlIDA6IDQweDI1IGJ3IHRleHQgKi8KLSAgICBzZXR1cF80MHgyNSwgICAgIC8qIG1vZGUgMTogNDB4MjUgY29sIHRleHQgKi8KLSAgICBzZXR1cF84MHgyNSwgICAgIC8qIG1vZGUgMjogODB4MjUgYncgdGV4dCAqLwotICAgIHNldHVwXzgweDI1LCAgICAgLyogbW9kZSAzOiA4MHgyNSBjb2wgdGV4dCAqLwotICAgIHNldHVwX2dyYXBoaWNzLCAgLyogbW9kZSA0OiAzMjB4MjAwIGNvbCBncmFwaGljcyAqLwotICAgIHNldHVwX2dyYXBoaWNzLCAgLyogbW9kZSA1OiAzMjB4MjAwIGJ3IGdyYXBoaWNzICovCi0gICAgc2V0dXBfZ3JhcGhpY3MsICAvKiBtb2RlIDY6IDY0MHgyMDAgYncgZ3JhcGhpY3MgKi8KLSAgICBzZXR1cF9idyAgICAgICAgIC8qIG1vZGUgNzogODB4MjUgbW9ubyB0ZXh0ICovCi19OwotCi11bnNpZ25lZCBpbnQgc2V0dXBfY29sc1tdID0KLXsKLSAgICA0MCwgNDAsIDgwLCA4MCwgNDAsIDQwLCA4MCwgODAKLX07Ci0KLXVuc2lnbmVkIGNoYXIgc2V0dXBfbW9kZXNldHNbXSA9Ci17Ci0gICAgIDB4MkMsIDB4MjgsIDB4MkQsIDB4MjksIDB4MkEsIDB4MkUsIDB4MUUsIDB4MjkKLX07Ci0KLXVuc2lnbmVkIGludCBzZXR1cF9idWZzaXplW10gPQotewotICAgIDIwNDgsIDIwNDgsIDQwOTYsIDIwOTYsIDE2Mzg0LCAxNjM4NCwgMTYzODQsIDQwOTYKLX07Ci0KLXZvaWQgYmlvc19zZXRfbW9kZShpbnQgbW9kZSkKLXsKLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyIG1vZGVfc2V0ID0gc2V0dXBfbW9kZXNldHNbbW9kZV07IC8qIENvbnRyb2wgcmVnaXN0ZXIgdmFsdWUgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpzZXR1cF9yZWdzID0gc2V0dXBfbW9kZXNbbW9kZV07IC8qIFJlZ2lzdGVyIDNENCBBcnJheSAqLwotCi0gICAgLyogU3dpdGNoIHZpZGVvIG9mZiAqLwotICAgIG91dF9ieXRlKDB4M0Q4LCBtb2RlX3NldCAmIDB4MzcpOwotCi0gICAgLyogU2V0IHVwIHBhcmFtZXRlcnMgYXQgM0Q0aCAqLwotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotCW91dF9ieXRlKDB4M0Q0LCAodW5zaWduZWQgY2hhcilpKTsKLQlvdXRfYnl0ZSgweDNENSwgKnNldHVwX3JlZ3MpOwotCXNldHVwX3JlZ3MrKzsKLSAgICB9Ci0KLSAgICAvKiBFbmFibGUgdmlkZW8gKi8KLSAgICBvdXRfYnl0ZSgweDNEOCwgbW9kZV9zZXQpOwotCi0gICAgLyogU2V0IG92ZXJzY2FuICovCi0gICAgaWYgKG1vZGUgPT0gNikgb3V0X2J5dGUoMHgzRDksIDB4M0YpOwotICAgIGVsc2UgICAgICAgICAgIG91dF9ieXRlKDB4M0Q5LCAweDMwKTsKLX0KLQotc3RhdGljIHZvaWQgYmlvc19wcmludF9zdHJpbmcodm9pZCkKLXsKLSAgICBleHRlcm4gdm9pZCB2aWRlb19iaW9zX3ByaW50X3N0cmluZyhjaGFyICpzdHJpbmcsIGludCB4LCBpbnQgeSwgaW50IGF0dHIsIGludCBjb3VudCk7Ci0gICAgY2hhciAqcyA9IChjaGFyICopKE0ueDg2LlJfRVM8PDQpICsgTS54ODYuUl9CUDsKLSAgICBpbnQgYXR0cjsKLSAgICBpZiAoTS54ODYuUl9BTCAmIDB4MDIpIGF0dHIgPSAtIDE7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICBhdHRyID0gTS54ODYuUl9CTDsKLSAgICB2aWRlb19iaW9zX3ByaW50X3N0cmluZyhzLCBNLng4Ni5SX0RILCBNLng4Ni5SX0RMLCBhdHRyLCBNLng4Ni5SX0NYKTsKLX0KLQotc3RhdGljIHZvaWQgWDg2QVBJIGludDQyKGludCBpbnRubykKLXsKLSAgICBzd2l0Y2ggKE0ueDg2LlJfQUgpCi0gICAgewotICAgIGNhc2UgMHgwMDoKLQliaW9zX3NldF9tb2RlKE0ueDg2LlJfQUwpOwotCWJyZWFrOwotICAgIGNhc2UgMHgxMzoKLQliaW9zX3ByaW50X3N0cmluZygpOwotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JUFJJTlRGKCJXYXJuaW5nOiBWSURFTyBCSU9TIGludGVycnVwdCAleGggdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiAleGgsIEFMID0gJXhoXG4iLAotCSAgICAgICBpbnRubywgTS54ODYuUl9BSCwgTS54ODYuUl9BTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50MTUoaW50IGludG5vKQotewotICAgIFBSSU5URigiQ2FsbGVkIGludGVycnVwdCAxNWg6IEFYID0gJXhoLCBCWCA9ICV4aCwgQ1ggPSAleGgsIERYID0gJXhoXG4iLAotCSAgIE0ueDg2LlJfQVgsIE0ueDg2LlJfQlgsIE0ueDg2LlJfQ1gsIE0ueDg2LlJfRFgpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzgwZjBkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8cGNpLmg+Ci0jaW5jbHVkZSA8NzR4eF83eHguaD4KLQotCi0jaWZkZWYgREVCVUcKLSN1bmRlZiBERUJVRwotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBQUklOVEYoZm9ybWF0LCBhcmdzLi4uKSBfcHJpbnRmKGZvcm1hdCAsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBQUklOVEYoZm9ybWF0LCBhcmdjLi4uKQotI2VuZGlmCi0KLXN0YXRpYyBwY2lfZGV2X3QgdG9fcGNpKGludCBidXMsIGludCBkZXZmbikKLXsKLSAgICByZXR1cm4gUENJX0JERihidXMsIChkZXZmbj4+MyksIGRldmZuJjMpOwotfQotCi1pbnQgbXlwY2lfZmluZF9kZXZpY2UoaW50IHZlbmRvciwgaW50IHByb2R1Y3QsIGludCBpbmRleCkKLXsKLSAgICByZXR1cm4gcGNpX2ZpbmRfZGV2aWNlKHZlbmRvciwgcHJvZHVjdCwgaW5kZXgpOwotfQotCi1pbnQgbXlwY2lfYnVzKGludCBkZXZpY2UpCi17Ci0gICAgcmV0dXJuIFBDSV9CVVMoZGV2aWNlKTsKLX0KLQotaW50IG15cGNpX2RldmZuKGludCBkZXZpY2UpCi17Ci0gICAgcmV0dXJuIChQQ0lfREVWKGRldmljZSk8PDMpIHwgUENJX0ZVTkMoZGV2aWNlKTsKLX0KLQotCi0jZGVmaW5lIG15cGNpX3JlYWRfZnVuYyh0eXBlLCBzaXplKQkJCQlcCi10eXBlIG15cGNpX3JlYWRfY2ZnXyMjc2l6ZSMjKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCkJXAotewkJCQkJCQkJXAotICAgIHR5cGUgYzsJCQkJCQkJXAotICAgIHBjaV9yZWFkX2NvbmZpZ18jI3NpemUjIyh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgJmMpOwlcCi0gICAgcmV0dXJuIGM7CQkJCQkJCVwKLX0KLQotI2RlZmluZSBteXBjaV93cml0ZV9mdW5jKHR5cGUsIHNpemUpCQkJCVwKLXZvaWQgbXlwY2lfd3JpdGVfY2ZnXyMjc2l6ZSMjKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgaW50IHZhbHVlKQlcCi17CQkJCQkJCQlcCi0gICAgcGNpX3dyaXRlX2NvbmZpZ18jI3NpemUjIyh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgdmFsdWUpOwlcCi19Ci0KLW15cGNpX3JlYWRfZnVuYyh1OCxieXRlKTsKLW15cGNpX3JlYWRfZnVuYyh1MTYsd29yZCk7Ci0KLW15cGNpX3dyaXRlX2Z1bmModTgsYnl0ZSk7Ci1teXBjaV93cml0ZV9mdW5jKHUxNix3b3JkKTsKLQotdTMyIG15cGNpX3JlYWRfY2ZnX2xvbmcoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0KQotewotICAgIHUzMiBjOwotICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgJmMpOwotICAgIHJldHVybiBjOwotfQotCi12b2lkIG15cGNpX3dyaXRlX2NmZ19sb25nKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgaW50IHZhbHVlKQotewotICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQodG9fcGNpKGJ1cywgZGV2Zm4pLCBvZmZzZXQsIHZhbHVlKTsKLX0KLQotdm9pZCBfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnczsKLSAgICBjaGFyIGJ1ZltDRkdfUEJTSVpFXTsKLQotICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gICAgKHZvaWQpdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOwotICAgIHZhX2VuZChhcmdzKTsKLQotICAgIHByaW50ZihidWYpOwotfQotCi1jaGFyICpfZ2V0ZW52KGNoYXIgKm5hbWUpCi17Ci0gICAgcmV0dXJuIGdldGVudihuYW1lKTsKLX0KLQotdW5zaWduZWQgbG9uZyBnZXRfYmFyX3NpemUocGNpX2Rldl90IGRldiwgaW50IG9mZnNldCkKLXsKLSAgICB1MzIgYmFyX2JhY2ssIGJhcl92YWx1ZTsKLQotICAgIC8qICBTYXZlIG9sZCBCQVIgdmFsdWUgKi8KLSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsICZiYXJfYmFjayk7Ci0KLSAgICAvKiAgV3JpdGUgYWxsIDEncy4gKi8KLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgb2Zmc2V0LCB+MCk7Ci0KLSAgICAvKiAgTm93IHJlYWQgYmFjayB0aGUgcmVsZXZhbnQgYml0cyAqLwotICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIG9mZnNldCwgJmJhcl92YWx1ZSk7Ci0KLSAgICAvKiAgUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLwotICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsIGJhcl9iYWNrKTsKLQotICAgIGlmIChiYXJfdmFsdWUgPT0gMCkgcmV0dXJuIDB4RkZGRkZGRkY7IC8qICBUaGlzIEJBUiBpcyBkaXNhYmxlZCAqLwotCi0gICAgaWYgKChiYXJfdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWSkKLSAgICB7Ci0JLyogIFRoaXMgaXMgYSBtZW1vcnkgc3BhY2UgQkFSLiBNYXNrIGl0IG91dCBzbyB3ZSBnZXQgdGhlIHNpemUgb2YgaXQgKi8KLQlyZXR1cm4gfihiYXJfdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKSArIDE7Ci0gICAgfQotCi0gICAgLyogIE5vdCBzdWl0YWJsZSAqLwotICAgIHJldHVybiAweEZGRkZGRkZGOwotfQotCi12b2lkIGVuYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUodm9pZCkKLXsKLSAgICB1OCBjZmc7Ci0gICAgcGNpX2Rldl90IGFydCA9IFBDSV9CREYoMCwwLDApOwotCi0gICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCAmY2ZnKTsKLSAgICAvKiBjZmcgfD0gMHgwODsgKi8KLSAgICBjZmcgfD0gMHgyMDsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCBjZmcpOwotfQotCi12b2lkIGRpc2FibGVfY29tcGF0aWJpbGl0eV9ob2xlKHZvaWQpCi17Ci0gICAgdTggY2ZnOwotICAgIHBjaV9kZXZfdCBhcnQgPSBQQ0lfQkRGKDAsMCwwKTsKLQotICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGFydCwgMHg1NCwgJmNmZyk7Ci0gICAgLyogY2ZnICY9IH4weDA4OyAqLwotICAgIGNmZyAmPSB+MHgyMDsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCBjZmcpOwotfQotCi12b2lkIG1hcF9yb20ocGNpX2Rldl90IGRldiwgdTMyIGFkZHJlc3MpCi17Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgYWRkcmVzc3xQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKLX0KLQotdm9pZCB1bm1hcF9yb20ocGNpX2Rldl90IGRldikKLXsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAwKTsKLX0KLQotdm9pZCBiYXRfbWFwKHU4IGJhdG51bSwgdTMyIGFkZHJlc3MsIHUzMiBsZW5ndGgpCi17Ci0gICAgdTMyIHRlbXAgPSBhZGRyZXNzOwotICAgIGFkZHJlc3MgJj0gMHhGRkZFMDAwMDsKLSAgICB0ZW1wICAgICY9IDB4MDAwMUZGRkY7Ci0gICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEgKSA+PiAxNzsKLSAgICBsZW5ndGggPDw9IDI7Ci0KLSAgICBzd2l0Y2ggKGJhdG51bSkKLSAgICB7Ci0gICAgY2FzZSAwOgotCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAwLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMCwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAxLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMSwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAyLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMiwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOgotCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAzLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMywgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7Ci0JYnJlYWs7Ci0gICAgfQotfQotCi1pbnQgZmluZF9pbWFnZSh1MzIgcm9tX2FkZHJlc3MsIHUzMiByb21fc2l6ZSwgdm9pZCAqKmltYWdlLCB1MzIgKmltYWdlX3NpemUpOwotCi1pbnQgYXR0ZW1wdF9tYXBfcm9tKHBjaV9kZXZfdCBkZXYsIHZvaWQgKmNvcHlfYWRkcmVzcykKLXsKLSAgICB1MzIgcm9tX3NpemUgICAgICA9IDA7Ci0gICAgdTMyIHJvbV9hZGRyZXNzICAgPSAwOwotICAgIHUzMiBiYXJfc2l6ZSAgICAgID0gMDsKLSAgICB1MzIgYmFyX2JhY2t1cCAgICA9IDA7Ci0gICAgaW50IGksajsKLSAgICB2b2lkICppbWFnZSAgICAgICA9IDA7Ci0gICAgdTMyIGltYWdlX3NpemUgICAgPSAwOwotICAgIGludCBkaWRfY29ycmVjdCAgID0gMDsKLSAgICB1MzIgcHJlZmV0Y2hfYWRkciA9IDA7Ci0gICAgdTMyIHByZWZldGNoX3NpemUgPSAwOwotICAgIHUzMiBwcmVmZXRjaF9pZHggID0gMDsKLQotICAgIC8qICBHZXQgdGhlIHNpemUgb2YgdGhlIGV4cGFuc2lvbiByb20gKi8KLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAweEZGRkZGRkZGKTsKLSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZyb21fc2l6ZSk7Ci0gICAgaWYgKChyb21fc2l6ZSAmIDB4MDEpID09IDApCi0gICAgewotCVBSSU5URigiTm8gUk9NXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByb21fc2l6ZSAmPSAweEZGRkZGODAwOwotICAgIHJvbV9zaXplID0gKH5yb21fc2l6ZSkrMTsKLQotICAgIFBSSU5URigiUk9NIFNpemUgaXMgJWRLXG4iLCByb21fc2l6ZS8xMDI0KTsKLQotICAgIC8qCi0gICAgICogVHJ5IHRvIGZpbmQgYSBwbGFjZSBmb3IgdGhlIFJPTS4gV2UgYWx3YXlzIGF0dGVtcHQgdG8gdXNlCi0gICAgICogb25lIG9mIHRoZSBjYXJkJ3MgYmFzZXMgZm9yIHRoaXMsIGFzIHRoaXMgd2lsbCBiZSBpbiBhbnkKLSAgICAgKiBicmlkZ2UncyByZXNvdXJjZSByYW5nZSBhcyB3ZWxsIGFzIGJlaW5nIGZyZWUgb2YgY29uZmxpY3RzCi0gICAgICogd2l0aCBvdGhlciBjYXJkcy4gSW4gYSBncmFwaGljcyBjYXJkIGl0IGlzIHZlcnkgdW5saWtlbHkKLSAgICAgKiB0aGF0IHRoZXJlIHdvbid0IGJlIGFueSBiYXNlIGFkZHJlc3MgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8KLSAgICAgKiBob2xkIHRoZSByb20uCi0gICAgICoKLSAgICAgKiBGSVhNRTogVG8gd29yayBhcm91bmQgdGhpcywgdGhlb3JldGljYWxseSB0aGUgbGFyZ2VzdCBiYXNlCi0gICAgICogY291bGQgYmUgdXNlZCBpZiBub25lIGlzIGZvdW5kIGluIHRoZSBsb29wIGJlbG93LgotICAgICAqLwotCi0gICAgZm9yIChpID0gUENJX0JBU0VfQUREUkVTU18wOyBpIDw9IFBDSV9CQVNFX0FERFJFU1NfNTsgaSArPSA0KQotICAgIHsKLQliYXJfc2l6ZSA9IGdldF9iYXJfc2l6ZShkZXYsIGkpOwotCVBSSU5URigiUENJX0JBU0VfQUREUkVTU18lZCBpcyAlZEsgbGFyZ2VcbiIsCi0JICAgICAgIChpIC0gUENJX0JBU0VfQUREUkVTU18wKS80LAotCSAgICAgICBiYXJfc2l6ZS8xMDI0KTsKLQlpZiAoYmFyX3NpemUgIT0gMHhGRkZGRkZGRiAmJiBiYXJfc2l6ZSA+PSByb21fc2l6ZSkKLQl7Ci0JICAgIFBSSU5URigiRm91bmQgYSBtYXRjaCBmb3Igcm9tIHNpemVcbiIpOwotCSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpLCAmcm9tX2FkZHJlc3MpOwotCSAgICByb21fYWRkcmVzcyAmPSAweEZGRkZGRkYwOwotCSAgICBpZiAocm9tX2FkZHJlc3MgIT0gMCAmJiByb21fYWRkcmVzcyAhPSAweEZGRkZGRkYwKSBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHJvbV9hZGRyZXNzID09IDAgfHwgcm9tX2FkZHJlc3MgPT0gMHhGRkZGRkZGMCkKLSAgICB7Ci0JUFJJTlRGKCJObyBzdWl0YWJsZSByb20gYWRkcmVzcyBmb3VuZFxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogIERpc2FibGUgdGhlIEJBUiAqLwotICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGksICZiYXJfYmFja3VwKTsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgaSwgMCk7Ci0KLSAgICAvKiAgTWFwIFJPTSAqLwotICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsIHJvbV9hZGRyZXNzIHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRSk7Ci0KLSAgICAvKiAgQ29weSB0aGUgcm9tIHRvIGEgcGxhY2UgaW4gdGhlIGVtdWxhdG9yIHNwYWNlICovCi0gICAgUFJJTlRGKCJDbGFpbWluZyBCQVQgMlxuIik7Ci0gICAgYmF0X21hcCgyLCByb21fYWRkcmVzcywgcm9tX3NpemUpOwotICAgIC8qIHNob3dfYmF0X21hcHBpbmcoKTsgKi8KLQotICAgIGlmICgwID09IGZpbmRfaW1hZ2Uocm9tX2FkZHJlc3MsIHJvbV9zaXplLCAmaW1hZ2UsICZpbWFnZV9zaXplKSkKLSAgICB7Ci0JUFJJTlRGKCJObyB4ODYgQklPUyBpbWFnZSBmb3VuZFxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUFJJTlRGKCJDb3B5aW5nICVsZCBieXRlcyBmcm9tIDB4JWx4IHRvIDB4JWx4XG4iLCAobG9uZylpbWFnZV9zaXplLCAobG9uZylpbWFnZSwgKGxvbmcpY29weV9hZGRyZXNzKTsKLQotICAgIC8qIG1lbWNweShjb3B5X2FkZHJlc3MsIHJvbV9hZGRyZXNzLCByb21fc2l6ZSk7ICovCi0gICAgewotCXVuc2lnbmVkIGNoYXIgKmZyb20gPSAodW5zaWduZWQgY2hhciAqKWltYWdlOyAvKiByb21fYWRkcmVzczsgKi8KLQl1bnNpZ25lZCBjaGFyICp0byA9ICh1bnNpZ25lZCBjaGFyICopY29weV9hZGRyZXNzOwotCWZvciAoaj0wOyBqPGltYWdlX3NpemUgLypyb21fc2l6ZSovOyBqKyspCi0JewotCSAgICAqdG8rKyA9ICpmcm9tKys7Ci0JfQotICAgIH0KLQotICAgIFBSSU5URigiQ29weSBpcyBkb25lXG4iKTsKLQotICAgIC8qICBVbm1hcCB0aGUgUk9NIGFuZCByZXN0b3JlIHRoZSBCQVIgKi8KLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAwKTsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgaSwgYmFyX2JhY2t1cCk7Ci0KLSAgICAvKiAgRklYTUU6IFNob3VsZG4ndCBiZSBuZWVkZWQgYW55bW9yZSovCi0gICAgLyogYmF0X21hcCgyLCAweDgwMDAwMDAwLCAyNTYqMTAyNCoxMDI0KTsKLSAgICAgICBzaG93X2JhdF9tYXBwaW5nKCk7ICovCi0KLSAgICAvKgotICAgICAqIFNpbmNlIG1vc3QgY2FyZHMgY2FuIHByb2JhYmx5IG9ubHkgZG8gMTYgYml0IElPIGFkZHJlc3NpbmcsIHdlCi0gICAgICogY29ycmVjdCB0aGVpciBJTyBiYXNlIGludG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUuCi0gICAgICogVGhpcyBzaG91bGQgZG8gZm9yIG1vc3QuCi0gICAgICovCi0gICAgZm9yIChpID0gUENJX0JBU0VfQUREUkVTU18wOyBpIDw9IFBDSV9CQVNFX0FERFJFU1NfNTsgaSArPSA0KQotICAgIHsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGksICZ2YWx1ZSk7Ci0JaWYgKHZhbHVlICYgMHgwMSkgLyogIElPICovCi0JewotCSAgICBkaWRfY29ycmVjdCA9IDE7Ci0JICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBpLCAweDEwMDEpOwotCSAgICBicmVhazsKLQl9Ci0KLQlpZiAodmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkKLQl7Ci0JICAgIHByZWZldGNoX2lkeCA9IGk7Ci0JICAgIHByZWZldGNoX2FkZHIgPSB2YWx1ZSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7Ci0JICAgIHByZWZldGNoX3NpemUgPSBnZXRfYmFyX3NpemUoZGV2LCBpKTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKDEpIC8qIGRpZF9jb3JyZWN0KSAqLwotICAgIHsKLQlleHRlcm4gcGNpX2Rldl90IHBjaV9maW5kX2JyaWRnZV9mb3JfYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1c25yKTsKLQlpbnQgYnVzbnIgPSBQQ0lfQlVTKGRldik7Ci0JaWYgKGJ1c25yKQotCXsKLQkgICAgcGNpX2Rldl90IGJyaWRnZTsKLQkgICAgUFJJTlRGKCJOZWVkIHRvIGNvcnJlY3QgYnJpZGdlIGRldmljZSBmb3IgSU8gcmFuZ2UgY2hhbmdlXG4iKTsKLQkgICAgYnJpZGdlID0gcGNpX2ZpbmRfYnJpZGdlX2Zvcl9idXMoTlVMTCwgYnVzbnIpOwotCSAgICBpZiAoYnJpZGdlID09IFBDSV9BTllfSUQpCi0JICAgIHsKLQkJUFJJTlRGKCJEaWRuJ3QgZmluZCBicmlkZ2UuIEhvcGUgdGhhdCdzIE9LXG4iKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJLyoKLQkJICogU2V0IHVwcGVyIEkvTyBiYXNlL2xpbWl0IHRvIDAKLQkJICovCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MzAsIDB4MDApOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDMxLCAweDAwKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgzMiwgMHgwMCk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MzMsIDB4MDApOwotCQlpZiAoZGlkX2NvcnJlY3QpCi0JCXsKLQkJICAgIC8qCi0JCSAgICAgKiBzZXQgbG93ZXIgSS9PIGJhc2UgdG8gMTAwMAotCQkgICAgICogVGhhdCBpcywgYml0cyAwOjMgYXJlIHNldCB0byAwMDAxIGJ5IGRlZmF1bHQuCi0JCSAgICAgKiBiaXRzIDc6NCBjb250YWluIEkvTyBhZGRyZXNzIGJpdHMgMTU6MTIKLQkJICAgICAqIGFsbCBvdGhlcnMgYXJlIGFzc3VtZWQgMC4KLQkJICAgICAqLwotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgxQywgMHgxMSk7Ci0JCSAgICAvKgotCQkgICAgICogU2V0IGxvd2VyIEkvTyBsaW1pdCB0byAxRkZGCi0JCSAgICAgKiBUaGF0IGlzLCBiaXRzIDA6MyBhcmUgcmVzZXJ2ZWQgYW5kIGFsd2F5cyAwMDAwCi0JCSAgICAgKiBCaXRzIDc6NCBjb250YWluIEkvTyBhZGRyZXNzIGJpdHMgMTU6MTIKLQkJICAgICAqIEFsbCBvdGhlcnMgYXJlIGFzc3VtZWQgRi4KLQkJICAgICAqLwotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgxRCwgMHgxMCk7Ci0JCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDBELCAweDIwKTsKLQkJICAgIFBSSU5URigiQ29ycmVjdGVkIGJyaWRnZSByZXNvdXJjZSByYW5nZSBvZiBicmlkZ2UgYXQgJTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkgICBQQ0lfQlVTKGJyaWRnZSksIFBDSV9ERVYoYnJpZGdlKSwgUENJX0ZVTkMoYnJpZGdlKSk7Ci0KLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIC8qCi0JCSAgICAgKiBUaGlzIGNhcmQgZG9lc24ndCBoYXZlIEkvTywgd2UgZGlzYWJsZSBJL08gZm9yd2FyZGluZwotCQkgICAgICovCi0JCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDFDLCAweDExKTsKLQkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MUQsIDB4MDApOwotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgUENJX0lOVEVSUlVQVF9MSU5FLCAwKTsKLQkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfUElOLCAwKTsKLQkJICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ09NTUFORCwgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfSU8pOwotCQkgICAgUFJJTlRGKCJEaXNhYmxlZCBicmlkZ2UgcmVzb3VyY2UgcmFuZ2Ugb2YgYnJpZGdlIGF0ICUwMng6JTAyeDolMDJ4XG4iLAotCQkJICAgUENJX0JVUyhicmlkZ2UpLCBQQ0lfREVWKGJyaWRnZSksIFBDSV9GVU5DKGJyaWRnZSkpOwotCi0JCX0KLQkgICAgfQotCSAgICAvKgotCSAgICAgKiBDb3JyZWN0IHRoZSBwcmVmZXRjaGFibGUgbWVtb3J5IGJhc2UsIHdoaWNoIGlzIG5vdCBzZXQgY29ycmVjdGx5IGJ5Ci0JICAgICAqIHRoZSBVLUJvb3QgYXV0b2NvbmZpZyBzdHVmZgotCSAgICAgKi8KLQkgICAgaWYgKHByZWZldGNoX2lkeCkKLQkgICAgewotLyogCQlQUklOVEYoIlNldHRpbmcgcHJlZmV0Y2hhYmxlIHJhbmdlIHRvICV4LCAleCAoJXggYW5kICV4KVxuIiwgKi8KLS8qIAkJICAgICAgIHByZWZldGNoX2FkZHIsIHByZWZldGNoX2FkZHIrcHJlZmV0Y2hfc2l6ZSwgKi8KLS8qIAkJICAgICAgIHByZWZldGNoX2FkZHI+PjE2LCAocHJlZmV0Y2hfYWRkcitwcmVmZXRjaF9zaXplKT4+MTYpOyAqLwotLyogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgKHByZWZldGNoX2FkZHI+PjE2KSk7ICovCi0vKiAJCXBjaV93cml0ZV9jb25maWdfd29yZChicmlkZ2UsIFBDSV9QUkVGX01FTU9SWV9MSU1JVCwgKHByZWZldGNoX2FkZHIrcHJlZmV0Y2hfc2l6ZSk+PjE2KTsgKi8KLQkgICAgfQotCi0JICAgIHBjaV93cml0ZV9jb25maWdfd29yZChicmlkZ2UsIFBDSV9QUkVGX01FTU9SWV9CQVNFLCAweDEwMDApOwotCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfTElNSVQsIDB4MDAwMCk7Ci0KLQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHhEMCwgMHgwQSk7Ci0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4RDMsIDB4MDQpOwotCi0JICAgIC8qCi0JICAgICAqIFNldCB0aGUgaW50ZXJydXB0IHBpbiB0byAwCi0JICAgICAqLwotI2lmIDAKLQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAwKTsKLQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sIDApOwotI2VuZGlmCi0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfTElORSwgMCk7Ci0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfUElOLCAwKTsKLQotCX0KLSAgICB9Ci0KLSAgICAvKiBGaW5hbGx5LCBlbmFibGUgdGhlIGNhcmQncyBJTyBhbmQgbWVtb3J5IHJlc3BvbnNlICovCi0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DT01NQU5ELCBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9JTyk7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMCk7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDApOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBmaW5kX2ltYWdlKHUzMiByb21fYWRkcmVzcywgdTMyIHJvbV9zaXplLCB2b2lkICoqaW1hZ2UsIHUzMiAqaW1hZ2Vfc2l6ZSkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAqcm9tID0gKHVuc2lnbmVkIGNoYXIgKilyb21fYWRkcmVzczsKLSAgICAvKiBpZiAoKnJvbSAhPSAweDU1IHx8ICoocm9tKzEpICE9IDB4QUEpIHJldHVybiAwOyAvKiBObyBiaW9zIHJvbSB0aGlzIGlzLCB5ZXMuICovICovCi0KLSAgICBmb3IgKDs7KQotICAgIHsKLQl1bnNpZ25lZCBzaG9ydCBwY2lfZGF0YV9vZmZzZXQgPSAqKHJvbSsweDE4KSArIDI1NiAqICoocm9tKzB4MTkpOwotCXVuc2lnbmVkIHNob3J0IHBjaV9pbWFnZV9sZW5ndGggPSAoKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTApICsgMjU2ICogKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTEpKSAqIDUxMjsKLQl1bnNpZ25lZCBjaGFyIHBjaV9pbWFnZV90eXBlID0gKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTQpOwotCWlmICgqcm9tICE9IDB4NTUgfHwgKihyb20rMSkgIT0gMHhBQSkKLQl7Ci0JICAgIFBSSU5URigiSW52YWxpZCBoZWFkZXIgdGhpcyBpc1xuIik7Ci0JICAgIHJldHVybiAwOwotCX0KLQlQUklOVEYoIkltYWdlICVpOiBUeXBlICVkICglcylcbiIsIGkrKywgcGNpX2ltYWdlX3R5cGUsCi0JICAgICAgIHBjaV9pbWFnZV90eXBlPT0wID8gIng4NiIgOgotCSAgICAgICBwY2lfaW1hZ2VfdHlwZT09MSA/ICJPcGVuRmlybXdhcmUiIDoKLQkgICAgICAgIlVua25vd24iKTsKLQlpZiAocGNpX2ltYWdlX3R5cGUgPT0gMCkKLQl7Ci0JICAgICppbWFnZSA9IHJvbTsKLQkgICAgKmltYWdlX3NpemUgPSBwY2lfaW1hZ2VfbGVuZ3RoOwotCSAgICByZXR1cm4gMTsKLQl9Ci0KLQlpZiAoKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTUpICYgMHg4MCkKLQl7Ci0JICAgIFBSSU5URigiTEFTVCBpbWFnZSBlbmNvdW50ZXJlZCwgbm8gaW1hZ2UgZm91bmRcbiIpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0KLQlyb20gKz0gcGNpX2ltYWdlX2xlbmd0aDsKLSAgICB9Ci19Ci0KLXZvaWQgc2hvd19iYXRfbWFwcGluZyh2b2lkKQotewotICAgIHUzMiBkYmF0MHUsIGRiYXQwbCwgaWJhdDB1LCBpYmF0MGw7Ci0gICAgdTMyIGRiYXQxdSwgZGJhdDFsLCBpYmF0MXUsIGliYXQxbDsKLSAgICB1MzIgZGJhdDJ1LCBkYmF0MmwsIGliYXQydSwgaWJhdDJsOwotICAgIHUzMiBkYmF0M3UsIGRiYXQzbCwgaWJhdDN1LCBpYmF0M2w7Ci0gICAgdTMyIG1zciwgaGlkMCwgbDJjcl9yZWc7Ci0KLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdHUgJTAsMCIgOiAiPXIiIChkYmF0MHUpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdGwgJTAsMCIgOiAiPXIiIChkYmF0MGwpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdHUgJTAsMCIgOiAiPXIiIChpYmF0MHUpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdGwgJTAsMCIgOiAiPXIiIChpYmF0MGwpKTsKLQotICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0dSAlMCwxIiA6ICI9ciIgKGRiYXQxdSkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0bCAlMCwxIiA6ICI9ciIgKGRiYXQxbCkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0dSAlMCwxIiA6ICI9ciIgKGliYXQxdSkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0bCAlMCwxIiA6ICI9ciIgKGliYXQxbCkpOwotCi0gICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXR1ICUwLDIiIDogIj1yIiAoZGJhdDJ1KSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXRsICUwLDIiIDogIj1yIiAoZGJhdDJsKSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXR1ICUwLDIiIDogIj1yIiAoaWJhdDJ1KSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXRsICUwLDIiIDogIj1yIiAoaWJhdDJsKSk7Ci0KLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdHUgJTAsMyIgOiAiPXIiIChkYmF0M3UpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdGwgJTAsMyIgOiAiPXIiIChkYmF0M2wpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdHUgJTAsMyIgOiAiPXIiIChpYmF0M3UpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdGwgJTAsMyIgOiAiPXIiIChpYmF0M2wpKTsKLQotICAgIF9fYXNtIHZvbGF0aWxlICgibWZtc3IgJTAiICAgICA6ICI9ciIgKG1zcikpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZzcHIgJTAsMTAwOCI6ICI9ciIgKGhpZDApKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mc3ByICUwLDEwMTciOiAiPXIiIChsMmNyX3JlZykpOwotCi0gICAgcHJpbnRmKCJkYmF0MHU6ICUwOHggZGJhdDBsOiAlMDh4IGliYXQwdTogJTA4eCBpYmF0MGw6ICUwOHhcbiIsCi0JICAgZGJhdDB1LCBkYmF0MGwsIGliYXQwdSwgaWJhdDBsKTsKLSAgICBwcmludGYoImRiYXQxdTogJTA4eCBkYmF0MWw6ICUwOHggaWJhdDF1OiAlMDh4IGliYXQxbDogJTA4eFxuIiwKLQkgICBkYmF0MXUsIGRiYXQxbCwgaWJhdDF1LCBpYmF0MWwpOwotICAgIHByaW50ZigiZGJhdDJ1OiAlMDh4IGRiYXQybDogJTA4eCBpYmF0MnU6ICUwOHggaWJhdDJsOiAlMDh4XG4iLAotCSAgIGRiYXQydSwgZGJhdDJsLCBpYmF0MnUsIGliYXQybCk7Ci0gICAgcHJpbnRmKCJkYmF0M3U6ICUwOHggZGJhdDNsOiAlMDh4IGliYXQzdTogJTA4eCBpYmF0M2w6ICUwOHhcbiIsCi0JICAgZGJhdDN1LCBkYmF0M2wsIGliYXQzdSwgaWJhdDNsKTsKLQotICAgIHByaW50ZigiXG5NU1I6ICUwOHggICBISUQwOiAlMDh4ICAgTDJDUjogJTA4eCBcbiIsIG1zcixoaWQwLCBsMmNyX3JlZyk7Ci19Ci0KLQotdm9pZCByZW1vdmVfaW5pdF9kYXRhKHZvaWQpCi17Ci0gICAgY2hhciAqczsKLQotICAgIC8qICBJbnZhbGlkYXRlIGFuZCBkaXNhYmxlIGRhdGEgY2FjaGUgKi8KLSAgICBpbnZhbGlkYXRlX2wxX2RhdGFfY2FjaGUoKTsKLSAgICBkY2FjaGVfZGlzYWJsZSgpOwotCi0gICAgcyA9IGdldGVudigieDg2X2NhY2hlIik7Ci0KLSAgICBpZiAoIXMpCi0gICAgewotCWljYWNoZV9lbmFibGUoKTsKLQlkY2FjaGVfZW5hYmxlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHMpCi0gICAgewotCWlmIChzdHJjbXAocywgImRjYWNoZSIpPT0wKQotCXsKLQkgICAgZGNhY2hlX2VuYWJsZSgpOwotCX0KLQllbHNlIGlmIChzdHJjbXAocywgImljYWNoZSIpID09IDApCi0JewotCSAgICBpY2FjaGVfZW5hYmxlKCk7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChzLCAib24iKT09IDAgfHwgc3RyY21wKHMsICJib3RoIikgPT0gMCkKLQl7Ci0JICAgIGRjYWNoZV9lbmFibGUoKTsKLQkgICAgaWNhY2hlX2VuYWJsZSgpOwotCX0KLSAgICB9Ci0KLSAgICAvKiAgIHNob3dfYmF0X21hcHBpbmcoKTsqLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODVlZmUxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNpZm5kZWYgR0xVRV9ICi0jZGVmaW5lIEdMVUVfSAotCi10eXBlZGVmIHVuc2lnbmVkIGludCBwY2lfZGV2X3Q7Ci0KLWludCBteXBjaV9maW5kX2RldmljZShpbnQgdmVuZG9yLCBpbnQgcHJvZHVjdCwgaW50IGluZGV4KTsKLWludCBteXBjaV9idXMoaW50IGRldmljZSk7Ci1pbnQgbXlwY2lfZGV2Zm4oaW50IGRldmljZSk7Ci11bnNpZ25lZCBsb25nIGdldF9iYXJfc2l6ZShwY2lfZGV2X3QgZGV2LCBpbnQgb2Zmc2V0KTsKLQotdTggICBteXBjaV9yZWFkX2NmZ19ieXRlKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCk7Ci11MTYgIG15cGNpX3JlYWRfY2ZnX3dvcmQoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0KTsKLXUzMiAgbXlwY2lfcmVhZF9jZmdfbG9uZyhpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQpOwotCi12b2lkIG15cGNpX3dyaXRlX2NmZ19ieXRlKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgdTggdmFsdWUpOwotdm9pZCBteXBjaV93cml0ZV9jZmdfd29yZChpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsIHUxNiB2YWx1ZSk7Ci12b2lkIG15cGNpX3dyaXRlX2NmZ19sb25nKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgdTMyIHZhbHVlKTsKLQotdm9pZCBfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLWNoYXIgKl9nZXRlbnYoY2hhciAqbmFtZSk7Ci0KLXZvaWQgKm1hbGxvYyhzaXplX3Qgc2l6ZSk7Ci12b2lkIG1lbXNldCh2b2lkICphZGRyLCBpbnQgdmFsdWUsIHNpemVfdCBzaXplKTsKLXZvaWQgbWVtY3B5KHZvaWQgKnRvLCB2b2lkICpmcm9tLCBzaXplX3QgbnVtYnl0ZXMpOwotaW50ICBzdHJjbXAoY2hhciAqLCBjaGFyICopOwotCi12b2lkIGVuYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUodm9pZCk7Ci12b2lkIGRpc2FibGVfY29tcGF0aWJpbGl0eV9ob2xlKHZvaWQpOwotCi12b2lkIG1hcF9yb20ocGNpX2Rldl90IGRldiwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKLXZvaWQgdW5tYXBfcm9tKHBjaV9kZXZfdCBkZXYpOwotaW50ICBhdHRlbXB0X21hcF9yb20ocGNpX2Rldl90IGRldiwgdm9pZCAqY29weV9hZGRyZXNzKTsKLQotI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRSAweDAxICAgIC8qIDAgPSBtZW1vcnksIDEgPSBJL08gKi8KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gMHgwMQotI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkgMHgwMAotI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyAgICAgICh+MHgwZlVMKQotCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMCAgICAgIDB4MTAgICAgLyogMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzEgICAgICAweDE0ICAgIC8qIDMyIGJpdHMgW2h0eXBlIDAsMSBvbmx5XSAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzIgICAgICAweDE4ICAgIC8qIDMyIGJpdHMgW2h0eXBlIDAgb25seV0gKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18zICAgICAgMHgxYyAgICAvKiAzMiBiaXRzICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNCAgICAgIDB4MjAgICAgLyogMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzUgICAgICAweDI0ICAgIC8qIDMyIGJpdHMgKi8KLSNkZWZpbmUgUENJX0JVUyhkKSAgICAgICgoKGQpID4+IDE2KSAmIDB4ZmYpCi0jZGVmaW5lIFBDSV9ERVYoZCkgICAgICAoKChkKSA+PiAxMSkgJiAweDFmKQotI2RlZmluZSBQQ0lfRlVOQyhkKSAgICAgKCgoZCkgPj4gOCkgJiAweDcpCi0jZGVmaW5lIFBDSV9CREYoYixkLGYpICAoKGIpIDw8IDE2IHwgKGQpIDw8IDExIHwgKGYpIDw8IDgpCi0KLSNkZWZpbmUgUENJX0FOWV9JRCAofjApCi0jZGVmaW5lIFBDSV9ST01fQUREUkVTUyAgICAgICAgIDB4MzAgICAgLyogQml0cyAzMS4uMTEgYXJlIGFkZHJlc3MsIDEwLi4xIHJlc2VydmVkICovCi0jZGVmaW5lIFBDSV9ST01fQUREUkVTU19FTkFCTEUgMHgwMQotCi0jZGVmaW5lIE9GRihhZGRyKSAoKGFkZHIpICYgMHhGRkZGKQotI2RlZmluZSBTRUcoYWRkcikgKCgoYWRkcik+PjQpICYweEYwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmMzMS1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmMzMS1kMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzZkMTM4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjMzEtZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyAzLjEuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XEJDMzslQkMzX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxCQzM7JUJDM19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDM19QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1NOQVA9Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDM19QQVRIJVxCSU47JURFRlBBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzNfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkMzX1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkMzX1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyAzLjEgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjkzOWY0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM0X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX0JDNT0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGNyZWF0ZWZpbGVzCi1jYWxsIHdpbjMyc2RrLmJhdCBib3JsYW5kCi0KLTpjcmVhdGVmaWxlcwotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDQuNSAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQ2NTE3ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDE2IGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX0JDNT0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDQuNSAxNiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1kMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmIyYzc5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMzIgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfQkM1PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNC41IDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKERQTUkzMikuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXNucC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0ZDdjMDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1zbnAuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX0JDNT0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9MQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgU25hcCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTBiZDNjYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDNDslQkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQzQ7JUJDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9MQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9Ci0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMzIgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdnhkLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdnhkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI1OWZhNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXZ4ZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDMyIGJpdCBXaW5kb3dzIFZ4RCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxWWERcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFZYRFxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPTEKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMzItYml0IFZ4RCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ3OTliNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDE2IGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4xNlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9MQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMTYgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YzE5OWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS13MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfQkM1PQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGNyZWF0ZWZpbGVzCi1jYWxsIHdpbjMyc2RrLmJhdCBib3JsYW5kCi0KLTpjcmVhdGVmaWxlcwotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDQuNSAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtYzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmEwZmRlMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWMzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBDX0lOQ0xVREU9JUJDNV9QQVRIJVxJTkNMVURFCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBjcmVhdGVmaWxlcwotY2FsbCB3aW4zMnNkay5iYXQgYm9ybGFuZAotCi06Y3JlYXRlZmlsZXMKLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzYjUwMzguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAxNiBiaXQgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMTYuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAxNiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTIxZjkzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtZDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChEUE1JMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbXguYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzI0MWZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc214LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNNWDMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTVgzMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9MQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IFNNWCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoU01YMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjNhY2QyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCBTbmFwIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC10bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZGNjMzcyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcQkM1OyVCQzVfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXEJDNTslQkM1X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0xCi1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCi1SRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCi1SRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKLVJFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcwotUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKLVJFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0Ci1SRU0gd29yayB0b28gd2VsbCkuCi1SRU0KLVJFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKLVJFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCi0KLVNFVCBET1NTVFlMRT0KLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC12eGQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC12eGQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMzU2OTExLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdnhkLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVlhEXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xWWERcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0xCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgV2luZG93cyAoVnhEKSBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Q3OWQ4Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0gQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAxNiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4xNlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMxNi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfQkM1PTEKLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAxNiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGI4Y2VjOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBDX0lOQ0xVREU9JUJDNV9QQVRIJVxJTkNMVURFCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKLWNhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKLQotOmNyZWF0ZWZpbGVzCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC14MTEuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC14MTEuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmZlYjJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAteDExLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTA5NDI4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIENfSU5DTFVERT0lQkNCNV9QQVRIJVxJTkNMVURFCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKLWNhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKLQotOmNyZWF0ZWZpbGVzCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhMTNlN2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDE2IGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmsuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMTYgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtZDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtZDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDAwMTdkNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQ0I1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKERQTUkzMikuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXNteC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXNteC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiOTY5YTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbXguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTVgzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTVgzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9MQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFNNWCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoU01YMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2I4ZmYyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBTbmFwIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS10bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGUzNjAxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAzMiBiaXQgbW9kZSB3aXRoIFBoYXIgTGFwIFROVAotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9MQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdnhkLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdnhkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhkZTU4Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXZ4ZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVlhEXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFZYRFxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPTEKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBXaW5kb3dzIChWeEQpIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzBkMDA0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSBAZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMTYgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMxNi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfQkM1PTEKLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCAxNiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg3NjBlMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBDX0lOQ0xVREU9JUJDQjVfUEFUSCVcSU5DTFVERQotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBjcmVhdGVmaWxlcwotY2FsbCB3aW4zMnNkay5iYXQgYm9ybGFuZAotCi06Y3JlYXRlZmlsZXMKLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTk4YzFhMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZjE5NzNkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi1pZiBbICQjIC1sdCAxIF0gfHwgKCBbICIkMSIgIT0gZ2NjLWxpbnV4IF0gJiYgWyAiJDEiICE9IHFueDQgXSApIDsgdGhlbgotCWVjaG8gVXNhZ2U6ICQwIGNvbXBpbGVyX25hbWUgW0RNQUtFIGNvbW1hbmRzXQotCWVjaG8KLQllY2hvIEN1cnJlbnQgY29tcGlsZXJzOgotCWVjaG8gIiAgZ2NjLWxpbnV4ICAtIEdOVSBDL0MrKyAyLjcgb3IgaGlnaGVyLCAzMiBiaXQiCi0JZWNobyAiICBxbng0ICAtIFdhdGNvbSBDL0MrKyAxMC42IG9yIGhpZ2hlciwgMzIgYml0IgotCWV4aXQgMQotZmkKLQotdW5zZXQgREJHIE9QVCBPUFRfU0laRSBCVUlMRF9ETEwgSU1QT1JUX0RMTCBGUFUgQ0hFQ0tTIEJFVEEKLS4gJHsxfS5zaAotCi1zaGlmdAotZG1ha2UgJCogJiYgZXhpdCAwCi0KLWVjaG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotZWNobyAqIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LiAqCi1lY2hvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWV4aXQgMQotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMjkwOTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1AZWNobyBvZmYKLXJlbSBEaXNhYmxlIGNoZWNrZWQgYnVpbGQgYW5kIGJ1aWxkIHJlbGVhc2UgY29kZQotc2V0IENIRUNLRUQ9Ci1jYWxsIGJ1aWxkX2l0LmJhdCAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfZGIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfZGIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjMyNTI5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkX2RiLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gRW5hYmxlIGNoZWNrZWQgYnVpbGQgYW5kIGJ1aWxkIGRlYnVnIGNvZGUKLXNldCBDSEVDS0VEPTEKLWNhbGwgYnVpbGRfaXQuYmF0ICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZF9pdC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZF9pdC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhNjE5YjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfaXQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLUBlY2hvIG9mZgotcmVtIEdlbmVyaWMgYmF0Y2ggZmlsZSB0byBidWlsZCBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoaXMgYmF0Y2ggZmlsZQotcmVtIGFzc3VtZXMgdGhhdCB0aGUgY29ycmVjdCBiYXRjaCBmaWxlcyBleGlzdCB0byBzZXR1cCB0aGUgYXBwcm9wcmlhdGUKLXJlbSBjb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIGFuZCB0aGF0IHRoZSBETUFLRS5FWEUgcHJvZ3JhbSBpcyBhdmFpbGFibGUKLXJlbSBzb21ld2hlcmUgb24gdGhlIHBhdGguCi1yZW0KLXJlbSBCdWlsZHMgYXMgcmVsZWFzZSBvciBkZWJ1ZyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBDSEVDS0VECi1yZW0gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0KLXJlbSBVbnNldCBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgY2hhbmdlIHRoZSBjb21waWxlIHByb2Nlc3MKLXNldCBEQkc9Ci1zZXQgT1BUPQotc2V0IE9QVF9TSVpFPQotc2V0IEJVSUxEX0RMTD0KLXNldCBJTVBPUlRfRExMPQotc2V0IEZQVT0KLXNldCBDSEVDS1M9Ci1zZXQgQkVUQT0KLQotaWYgJTE9PWJjMzEtZDE2IGdvdG8gYmMzMS1kMTYKLWlmICUxPT1iYzQ1LWQxNiBnb3RvIGJjNDUtZDE2Ci1pZiAlMT09YmM0NS1kMzIgZ290byBiYzQ1LWQzMgotaWYgJTE9PWJjNDUtdG50IGdvdG8gYmM0NS10bnQKLWlmICUxPT1iYzQ1LXcxNiBnb3RvIGJjNDUtdzE2Ci1pZiAlMT09YmM0NS13MzIgZ290byBiYzQ1LXczMgotaWYgJTE9PWJjNDUtYzMyIGdvdG8gYmM0NS1jMzIKLWlmICUxPT1iYzQ1LXZ4ZCBnb3RvIGJjNDUtdnhkCi1pZiAlMT09YmM0NS1zbnAgZ290byBiYzQ1LXNucAotaWYgJTE9PWJjNTAtZDE2IGdvdG8gYmM1MC1kMTYKLWlmICUxPT1iYzUwLWQzMiBnb3RvIGJjNTAtZDMyCi1pZiAlMT09YmM1MC10bnQgZ290byBiYzUwLXRudAotaWYgJTE9PWJjNTAtdzE2IGdvdG8gYmM1MC13MTYKLWlmICUxPT1iYzUwLXczMiBnb3RvIGJjNTAtdzMyCi1pZiAlMT09YmM1MC1jMzIgZ290byBiYzUwLWMzMgotaWYgJTE9PWJjNTAtdnhkIGdvdG8gYmM1MC12eGQKLWlmICUxPT1iYzUwLXNucCBnb3RvIGJjNTAtc25wCi1pZiAlMT09Z2NjMi1kMzIgZ290byBnY2MyLWQzMgotaWYgJTE9PWdjYzItdzMyIGdvdG8gZ2NjMi13MzIKLWlmICUxPT1nY2MyLWMzMiBnb3RvIGdjYzItYzMyCi1pZiAlMT09Z2NjMi1saW51eCBnb3RvIGdjYzItbGludXgKLWlmICUxPT12YzQwLWQxNiBnb3RvIHZjNDAtZDE2Ci1pZiAlMT09dmM0MC10bnQgZ290byB2YzQwLXRudAotaWYgJTE9PXZjNDAtdzE2IGdvdG8gdmM0MC13MTYKLWlmICUxPT12YzQwLXczMiBnb3RvIHZjNDAtdzMyCi1pZiAlMT09dmM0MC1jMzIgZ290byB2YzQwLWMzMgotaWYgJTE9PXZjNDAtZHJ2OXggZ290byB2YzQwLWRydjl4Ci1pZiAlMT09dmM0MC1kcnZudCBnb3RvIHZjNDAtZHJ2bnQKLWlmICUxPT12YzQwLXJ0dCBnb3RvIHZjNDAtcnR0Ci1pZiAlMT09dmM0MC1zbnAgZ290byB2YzQwLXNucAotaWYgJTE9PXZjNTAtZDE2IGdvdG8gdmM1MC1kMTYKLWlmICUxPT12YzUwLXRudCBnb3RvIHZjNTAtdG50Ci1pZiAlMT09dmM1MC13MTYgZ290byB2YzUwLXcxNgotaWYgJTE9PXZjNTAtdzMyIGdvdG8gdmM1MC13MzIKLWlmICUxPT12YzUwLWMzMiBnb3RvIHZjNTAtYzMyCi1pZiAlMT09dmM1MC1kcnY5eCBnb3RvIHZjNTAtZHJ2OXgKLWlmICUxPT12YzUwLWRydm50IGdvdG8gdmM1MC1kcnZudAotaWYgJTE9PXZjNTAtcnR0IGdvdG8gdmM1MC1ydHQKLWlmICUxPT12YzUwLXNucCBnb3RvIHZjNTAtc25wCi1pZiAlMT09dmM2MC1kMTYgZ290byB2YzYwLWQxNgotaWYgJTE9PXZjNjAtdG50IGdvdG8gdmM2MC10bnQKLWlmICUxPT12YzYwLXcxNiBnb3RvIHZjNjAtdzE2Ci1pZiAlMT09dmM2MC13MzIgZ290byB2YzYwLXczMgotaWYgJTE9PXZjNjAtYzMyIGdvdG8gdmM2MC1jMzIKLWlmICUxPT12YzYwLWRydjl4IGdvdG8gdmM2MC1kcnY5eAotaWYgJTE9PXZjNjAtZHJ2bnQgZ290byB2YzYwLWRydm50Ci1pZiAlMT09dmM2MC1kcnZ3MmsgZ290byB2YzYwLWRydncyawotaWYgJTE9PXZjNjAtcnR0IGdvdG8gdmM2MC1ydHQKLWlmICUxPT12YzYwLXNucCBnb3RvIHZjNjAtc25wCi1pZiAlMT09d2MxMGFkMTYgZ290byB3YzEwYWQxNgotaWYgJTE9PXdjMTBhZDMyIGdvdG8gd2MxMGFkMzIKLWlmICUxPT13YzEwYXRudCBnb3RvIHdjMTBhdG50Ci1pZiAlMT09d2MxMGF3MTYgZ290byB3YzEwYXcxNgotaWYgJTE9PXdjMTBhdzMyIGdvdG8gd2MxMGF3MzIKLWlmICUxPT13YzEwYWMzMiBnb3RvIHdjMTBhYzMyCi1pZiAlMT09d2MxMGFvMzIgZ290byB3YzEwYW8zMgotaWYgJTE9PXdjMTBhcDMyIGdvdG8gd2MxMGFwMzIKLWlmICUxPT13YzEwYXNucCBnb3RvIHdjMTBhc25wCi1pZiAlMT09d2MxMC1kMTYgZ290byB3YzEwLWQxNgotaWYgJTE9PXdjMTAtZDMyIGdvdG8gd2MxMC1kMzIKLWlmICUxPT13YzEwLXRudCBnb3RvIHdjMTAtdG50Ci1pZiAlMT09d2MxMC13MTYgZ290byB3YzEwLXcxNgotaWYgJTE9PXdjMTAtdzMyIGdvdG8gd2MxMC13MzIKLWlmICUxPT13YzEwLWMzMiBnb3RvIHdjMTAtYzMyCi1pZiAlMT09d2MxMC1vMzIgZ290byB3YzEwLW8zMgotaWYgJTE9PXdjMTAtcDMyIGdvdG8gd2MxMC1wMzIKLWlmICUxPT13YzEwLXNucCBnb3RvIHdjMTAtc25wCi1pZiAlMT09d2MxMS1kMTYgZ290byB3YzExLWQxNgotaWYgJTE9PXdjMTEtZDMyIGdvdG8gd2MxMS1kMzIKLWlmICUxPT13YzExLXRudCBnb3RvIHdjMTEtdG50Ci1pZiAlMT09d2MxMS13MTYgZ290byB3YzExLXcxNgotaWYgJTE9PXdjMTEtdzMyIGdvdG8gd2MxMS13MzIKLWlmICUxPT13YzExLWMzMiBnb3RvIHdjMTEtYzMyCi1pZiAlMT09d2MxMS1vMzIgZ290byB3YzExLW8zMgotaWYgJTE9PXdjMTEtcDMyIGdvdG8gd2MxMS1wMzIKLWlmICUxPT13YzExLXNucCBnb3RvIHdjMTEtc25wCi0KLWVjaG8gVXNhZ2U6IEJVSUxEICdjb21waWxlcl9uYW1lJyBbRE1BS0UgY29tbWFuZHNdCi1lY2hvLgotZWNobyBXaGVyZSAnY29tcGlsZXJfbmFtZScgaXMgb2YgdGhlIGZvcm0gY29tcC1vcywgd2hlcmUKLWVjaG8gJ2NvbXAnIGRlZmluZXMgdGhlIGNvbXBpbGVyIGFuZCAnb3MnIGRlZmluZXMgdGhlIE9TIGVudmlyb25tZW50LgotZWNobyBGb3IgaW5zdGFuY2UgJ2JjNTAtdzMyJyBpcyBmb3IgQm9ybGFuZCBDKysgNS4wIGZvciBXaW4zMi4KLWVjaG8gVGhlIHZhbHVlIG9mICdjb21wJyBjYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci1lY2hvLgotZWNobyAgICBiYzQ1IC0gQm9ybGFuZCBDKysgNC41eAotZWNobyAgICBiYzUwIC0gQm9ybGFuZCBDKysgNS54Ci1lY2hvICAgIHZjNDAgLSBWaXN1YWwgQysrIDQueAotZWNobyAgICB2YzUwIC0gVmlzdWFsIEMrKyA1LngKLWVjaG8gICAgdmM2MCAtIFZpc3VhbCBDKysgNi54Ci1lY2hvICAgIHdjMTAgLSBXYXRjb20gQysrIDEwLjYKLWVjaG8gICAgd2MxMSAtIFdhdGNvbSBDKysgMTEuMAotZWNobyAgICBnY2MyIC0gR05VIEMvQysrIDIuOXgKLWVjaG8uCi1lY2hvIFRoZSB2YWx1ZSBvZiAnb3MnIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLWVjaG8uCi1lY2hvICAgIGQxNiAgIC0gMTYtYml0IERPUwotZWNobyAgICBkMzIgICAtIDMyLWJpdCBET1MKLWVjaG8gICAgdzE2ICAgLSAxNi1iaXQgV2luZG93cyBHVUkgbW9kZQotZWNobyAgICBjMzIgICAtIDMyLWJpdCBXaW5kb3dzIGNvbnNvbGUgbW9kZQotZWNobyAgICB3MzIgICAtIDMyLWJpdCBXaW5kb3dzIEdVSSBtb2RlCi1lY2hvICAgIG8xNiAgIC0gMTYtYml0IE9TLzIgY29uc29sZSBtb2RlCi1lY2hvICAgIG8zMiAgIC0gMzItYml0IE9TLzIgY29uc29sZSBtb2RlCi1lY2hvICAgIHAzMiAgIC0gMzItYml0IE9TLzIgUHJlc2VudGF0aW9uIE1hbmFnZXIKLWVjaG8gICAgc25wICAgLSAzMi1iaXQgU2NpVGVjaCBTbmFwIGFwcGxpY2F0aW9uCi1lY2hvICAgIGxpbnV4IC0gMzItYml0IExpbnV4IGFwcGxpY2F0aW9uCi1nb3RvIGVuZAotCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVtIFNldHVwIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBpbGVyCi0KLTpiYzMxLWQxNgotY2FsbCBiYzMxLWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LWQxNgotY2FsbCBiYzQ1LWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LWQzMgotY2FsbCBiYzQ1LWQzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LXRudAotY2FsbCBiYzQ1LXRudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LXcxNgotY2FsbCBiYzQ1LXcxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LXczMgotY2FsbCBiYzQ1LXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LWMzMgotY2FsbCBiYzQ1LWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LXZ4ZAotY2FsbCBiYzQ1LXZ4ZC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLWQxNgotY2FsbCBiYzUwLWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLWQzMgotY2FsbCBiYzUwLWQzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLXRudAotY2FsbCBiYzUwLXRudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLXcxNgotY2FsbCBiYzUwLXcxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLXczMgotY2FsbCBiYzUwLXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLWMzMgotY2FsbCBiYzUwLWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLXZ4ZAotY2FsbCBiYzUwLXZ4ZC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpnY2MyLWQzMgotY2FsbCBnY2MyLWQzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpnY2MyLXczMgotY2FsbCBnY2MyLXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpnY2MyLWMzMgotY2FsbCBnY2MyLWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpnY2MyLWxpbnV4Ci1jYWxsIGdjYzItbGludXguYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC1kMTYKLWNhbGwgc2M3MC1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC13MTYKLWNhbGwgc2M3MC13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC10bnQKLWNhbGwgc2M3MC10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC13MzIKLWNhbGwgc2M3MC13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC1jMzIKLWNhbGwgc2M3MC1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC1kMTYKLWNhbGwgdmM0MC1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC10bnQKLWNhbGwgdmM0MC10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC13MTYKLWNhbGwgdmM0MC13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC13MzIKLWNhbGwgdmM0MC13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC1jMzIKLWNhbGwgdmM0MC1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC1kcnY5eAotY2FsbCB2YzQwLWRydjl4LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNDAtZHJ2bnQKLWNhbGwgdmM0MC1kcnZudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzQwLXJ0dAotY2FsbCB2YzQwLXJ0dC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLWQxNgotY2FsbCB2YzUwLWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLXRudAotY2FsbCB2YzUwLXRudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLXcxNgotY2FsbCB2YzUwLXcxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLXczMgotY2FsbCB2YzUwLXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLWMzMgotY2FsbCB2YzUwLWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLWRydjl4Ci1jYWxsIHZjNTAtZHJ2OXguYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM1MC1kcnZudAotY2FsbCB2YzUwLWRydm50LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNTAtcnR0Ci1jYWxsIHZjNTAtcnR0LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtZDE2Ci1jYWxsIHZjNjAtZDE2LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtdG50Ci1jYWxsIHZjNjAtdG50LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtdzE2Ci1jYWxsIHZjNjAtdzE2LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtdzMyCi1jYWxsIHZjNjAtdzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtYzMyCi1jYWxsIHZjNjAtYzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtZHJ2OXgKLWNhbGwgdmM2MC1kcnY5eC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzYwLWRydm50Ci1jYWxsIHZjNjAtZHJ2bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM2MC1kcnZ3MmsKLWNhbGwgdmM2MC1kcnZ3MmsuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM2MC1ydHQKLWNhbGwgdmM2MC1ydHQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFkMTYKLWNhbGwgd2MxMGFkMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFkMzIKLWNhbGwgd2MxMGFkMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGF0bnQKLWNhbGwgd2MxMGF0bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGF3MTYKLWNhbGwgd2MxMGF3MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGF3MzIKLWNhbGwgd2MxMGF3MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFjMzIKLWNhbGwgd2MxMGFjMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFvMzIKLWNhbGwgd2MxMGFvMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFwMzIKLWNhbGwgd2MxMGFwMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1kMTYKLWNhbGwgd2MxMC1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1kMzIKLWNhbGwgd2MxMC1kMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC10bnQKLWNhbGwgd2MxMC10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC13MTYKLWNhbGwgd2MxMC13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC13MzIKLWNhbGwgd2MxMC13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1jMzIKLWNhbGwgd2MxMC1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1vMzIKLWNhbGwgd2MxMC1vMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1wMzIKLWNhbGwgd2MxMC1wMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1kMTYKLWNhbGwgd2MxMS1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1kMzIKLWNhbGwgd2MxMS1kMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS10bnQKLWNhbGwgd2MxMS10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS13MTYKLWNhbGwgd2MxMS13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS13MzIKLWNhbGwgd2MxMS13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1jMzIKLWNhbGwgd2MxMS1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1vMzIKLWNhbGwgd2MxMS1vMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1wMzIKLWNhbGwgd2MxMS1wMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06Y29tcGlsZWl0Ci1rX3JtIC1mICoubGliICouYQotZG1ha2UgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKLWlmIGVycm9ybGV2ZWwgMSBnb3RvIGVycm9yZW5kCi1nb3RvIGVuZAotCi06ZXJyb3JlbmQKLWVjaG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotZWNobyAqIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LiAqCi1lY2hvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTplbmQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkZHJ2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkZHJ2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY0ZjRkNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGRydi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUBlY2hvIG9mZgotJTEKLWNkICUzCi0lNCAlNSAlNiAlNyAlOCAlOQotJTIKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyMjAyM2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMhIC9iaW4vc2gKLQotY2QgJDEKLVBST0c9JDIKLXNoaWZ0IDIKLXJtIC1mICoubGliICouYQotJFBST0cgJCoKLVJFVD0kPwotY2QgLi4KLWV4aXQgJFJFVApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGl0LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTUwYjY0OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGl0LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQGVjaG8gb2ZmCi1jZCAlMQota19ybSAtZiAqLmxpYiAqLmEKLXNoaWZ0IDEKLSUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcC5lbnYgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcC5lbnYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMmMzZDguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZGpncHAuZW52CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIz0gRG9uJ3QgZWRpdCB0aGlzIGxpbmUgdW5sZXNzIHlvdSBtb3ZlIGRqZ3BwLmVudiBvdXRzaWRlCi0jPSBvZiB0aGUgZGpncHAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gIElmIHlvdSBkbyBtb3ZlCi0jPSBpdCwgc2V0IERKRElSIHRvIHRoZSBkaXJlY3RvcnkgeW91IGluc3RhbGxlZCBESkdQUCBpbi4KLSM9Ci1ESkRJUj0lOi8+REpHUFAlCi0KLStVU0VSPWRvc3VzZXIKLStUTVBESVI9JURKRElSJS90bXAKLStFTVUzODc9JURKRElSJS9iaW4vZW11Mzg3LmR4ZQotK0xGTj15Ci0KLVtiaXNvbl0KLUJJU09OX0hBSVJZPSVESkRJUiUvbGliL2Jpc29uLmhhaQotQklTT05fU0lNUExFPSVESkRJUiUvbGliL2Jpc29uLnNpbQotCi1bY3BwXQotQ1BMVVNfSU5DTFVERV9QQVRIPSUvPjtDUExVU19JTkNMVURFX1BBVEglaW5jbHVkZTslU0NJVEVDSCUvaW5jbHVkZTslUFJJVkFURSUvaW5jbHVkZTsuOyVESkRJUiUvbGFuZy9jeHg7JURKRElSJS9pbmNsdWRlOyVESkRJUiUvY29udHJpYi9ncngyMC9pbmNsdWRlCi1DX0lOQ0xVREVfUEFUSD0lLz47Q19JTkNMVURFX1BBVEglaW5jbHVkZTslU0NJVEVDSCUvaW5jbHVkZTslUFJJVkFURSUvaW5jbHVkZTsuOyVESkRJUiUvaW5jbHVkZTslREpESVIlL2NvbnRyaWIvZ3J4MjAvaW5jbHVkZQotT0JKQ1BMVVNfSU5DTFVERV9QQVRIPSUvPjtPQkpDUExVU19JTkNMVURFX1BBVEglJURKRElSJS9pbmNsdWRlOyVESkRJUiUvbGFuZy9vYmpjCi1PQkpDX0lOQ0xVREVfUEFUSD0lLz47T0JKQ19JTkNMVURFX1BBVEglJURKRElSJS9pbmNsdWRlOyVESkRJUiUvbGFuZy9vYmpjCi0KLVtnY2NdCi1DT01QSUxFUl9QQVRIPSUvPjtDT01QSUxFUl9QQVRIJSVESkRJUiUvYmluCi1MSUJSQVJZX1BBVEg9JS8+O0xJQlJBUllfUEFUSCUlREpESVIlL2xpYjslREpESVIlL2NvbnRyaWIvZ3J4MjAvbGliOyVTQ0lURUNIJS9saWIvcmVsZWFzZS9kb3MzMi9kajIKLQotW2luZm9dCi1JTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KLUlORk9fQ09MT1JTPTB4MWYuMHgzMQotCi1bZW1hY3NdCi1JTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KLQotW2xlc3NdCi1MRVNTQklORk1UPSprPCVYPgotTEVTU0NIQVJERUY9OGJjY2NiY2MxMmJjNWI5NS5iMTI3LmIKLUxFU1M9JUxFU1MlIC1oNSR5NSREZDIuMCREdTE0LjAkRHM0LjckRGs5LjAkCi0KLVtsb2NhdGVdCi0rTE9DQVRFX1BBVEg9JURKRElSJS9saWIvbG9jYXRlZGIuZGF0Ci0KLVtsc10KLStMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKLVtkaXJdCi0rTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6Ci1bdmRpcl0KLStMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2RqZ3BwX2RiLmVudiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2RqZ3BwX2RiLmVudgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3OTJjOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcF9kYi5lbnYKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jPSBEb24ndCBlZGl0IHRoaXMgbGluZSB1bmxlc3MgeW91IG1vdmUgZGpncHAuZW52IG91dHNpZGUKLSM9IG9mIHRoZSBkamdwcCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgSWYgeW91IGRvIG1vdmUKLSM9IGl0LCBzZXQgREpESVIgdG8gdGhlIGRpcmVjdG9yeSB5b3UgaW5zdGFsbGVkIERKR1BQIGluLgotIz0KLURKRElSPSU6Lz5ESkdQUCUKLQotK1VTRVI9ZG9zdXNlcgotK1RNUERJUj0lREpESVIlL3RtcAotK0VNVTM4Nz0lREpESVIlL2Jpbi9lbXUzODcuZHhlCi0rTEZOPXkKLQotW2Jpc29uXQotQklTT05fSEFJUlk9JURKRElSJS9saWIvYmlzb24uaGFpCi1CSVNPTl9TSU1QTEU9JURKRElSJS9saWIvYmlzb24uc2ltCi0KLVtjcHBdCi1DUExVU19JTkNMVURFX1BBVEg9JS8+O0NQTFVTX0lOQ0xVREVfUEFUSCVpbmNsdWRlOyVTQ0lURUNIJS9pbmNsdWRlOyVQUklWQVRFJS9pbmNsdWRlOy47JURKRElSJS9sYW5nL2N4eDslREpESVIlL2luY2x1ZGU7JURKRElSJS9jb250cmliL2dyeDIwL2luY2x1ZGUKLUNfSU5DTFVERV9QQVRIPSUvPjtDX0lOQ0xVREVfUEFUSCVpbmNsdWRlOyVTQ0lURUNIJS9pbmNsdWRlOyVQUklWQVRFJS9pbmNsdWRlOy47JURKRElSJS9pbmNsdWRlOyVESkRJUiUvY29udHJpYi9ncngyMC9pbmNsdWRlCi1PQkpDUExVU19JTkNMVURFX1BBVEg9JS8+O09CSkNQTFVTX0lOQ0xVREVfUEFUSCUlREpESVIlL2luY2x1ZGU7JURKRElSJS9sYW5nL29iamMKLU9CSkNfSU5DTFVERV9QQVRIPSUvPjtPQkpDX0lOQ0xVREVfUEFUSCUlREpESVIlL2luY2x1ZGU7JURKRElSJS9sYW5nL29iamMKLQotW2djY10KLUNPTVBJTEVSX1BBVEg9JS8+O0NPTVBJTEVSX1BBVEglJURKRElSJS9iaW4KLUxJQlJBUllfUEFUSD0lLz47TElCUkFSWV9QQVRIJSVESkRJUiUvbGliOyVESkRJUiUvY29udHJpYi9ncngyMC9saWI7JVNDSVRFQ0glL2xpYi9kZWJ1Zy9kb3MzMi9kajIKLQotW2luZm9dCi1JTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KLUlORk9fQ09MT1JTPTB4MWYuMHgzMQotCi1bZW1hY3NdCi1JTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KLQotW2xlc3NdCi1MRVNTQklORk1UPSprPCVYPgotTEVTU0NIQVJERUY9OGJjY2NiY2MxMmJjNWI5NS5iMTI3LmIKLUxFU1M9JUxFU1MlIC1oNSR5NSREZDIuMCREdTE0LjAkRHM0LjckRGs5LjAkCi0KLVtsb2NhdGVdCi0rTE9DQVRFX1BBVEg9JURKRElSJS9saWIvbG9jYXRlZGIuZGF0Ci0KLVtsc10KLStMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKLVtkaXJdCi0rTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6Ci1bdmRpcl0KLStMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2ZpbmRpbnQzLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2ZpbmRpbnQzLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmUxNTA2Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9maW5kaW50My5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wZXJsIGM6XHNjaXRlY2hcc3JjXHBlcmxcZmluZGludDMucGVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtYmVvcy5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1iZW9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MWZmZDkzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1iZW9zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHQ0MvRysrIGZvciBCZU9TCi0KLWlmIFsgIiRDSEVDS0VEIiA9ICIxIiBdOyB0aGVuCi0gICAgZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1lbHNlCi0gICAgZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1maQotCi1leHBvcnQgTUFLRVNUQVJUVVA9JFNDSVRFQ0gvbWFrZWRlZnMvZ2NjX2Jlb3MubWsKLWV4cG9ydCBJTkNMVURFPSItSWluY2x1ZGUgLUkkU0NJVEVDSC9pbmNsdWRlIC1JJFBSSVZBVEUvaW5jbHVkZSIKLWV4cG9ydCBVU0VfWDExPTAKLWV4cG9ydCBVU0VfQkVPUz0xCi0KLWVjaG8gR0NDIEJlT1MgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1mcmVlYnNkLnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWZyZWVic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4MTZhNWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWZyZWVic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEdDQy9HKysgZm9yIEZyZWVCU0QKLQotaWYgWyAiJENIRUNLRUQiID0gIjEiIF07IHRoZW4KLSAgICBlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWVsc2UKLSAgICBlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWZpCi0KLWV4cG9ydCBNQUtFU1RBUlRVUD0kU0NJVEVDSC9tYWtlZGVmcy9nY2NfZnJlZWJzZC5tawotZXhwb3J0IElOQ0xVREU9Ii1JaW5jbHVkZSAtSSRTQ0lURUNIL2luY2x1ZGUgLUkkUFJJVkFURS9pbmNsdWRlIgotZXhwb3J0IFVTRV9YMTE9MQotZXhwb3J0IFVTRV9GUkVFQlNEPTEKLQotZWNobyBHQ0MgRnJlZUJTRCBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWxpbnV4LnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWxpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2E0YzQ5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1saW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggR0NDL0crKyBmb3IgTGludXgKLQotaWYgWyAiJENIRUNLRUQiID0gIjEiIF07IHRoZW4KLSAgICBlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWVsc2UKLSAgICBlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWZpCi0KLWV4cG9ydCBNQUtFU1RBUlRVUD0kU0NJVEVDSC9tYWtlZGVmcy9nY2NfbGludXgubWsKLWV4cG9ydCBJTkNMVURFPSJpbmNsdWRlOyRTQ0lURUNIL2luY2x1ZGU7JFBSSVZBVEUvaW5jbHVkZSIKLWV4cG9ydCBVU0VfTElOVVg9MQotCi1pZiBbICJ4JExJQkMiID0geCBdOyB0aGVuCi0JZWNobyAiR0NDIExpbnV4IGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChnbGliKSIKLWVsc2UKLQllY2hvICJHQ0MgTGludXggY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKGxpYmM1KSIKLWZpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzYzQ3ODMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1jMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEdOVSBDIGNvbXBpbGVyCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxyZWxlYXNlXHdpbjMyXGdjYzIKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXGRlYnVnXHdpbjMyXGdjYzIKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlCi1zZXQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXG1ha2VkZWZzXGdjY193aW4zMi5tawotc2V0IE1BS0VfTU9ERT0KLXNldCBVU0VfV0lOMTY9Ci1zZXQgVVNFX1dJTjMyPTEKLXNldCBXSU4zMl9HVUk9Ci1zZXQgVVNFX1NOQVA9Ci1zZXQgR0NDX0xJQkJBU0U9Z2NjMgotUEFUSCAlU0NJVEVDSF9CSU4lOyVHQ0MyX1BBVEglXE5BVElWRVxCSU47JURFRlBBVEglCi0KLWVjaG8gR0NDIDIuOS54IDMyLWJpdCBXaW4zMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWRvcy5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWRvcy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2I4YmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1kb3MuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIERKR1BQIDIuMDIKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXHJlbGVhc2VcZG9zMzJcZGoyCi0lU0NJVEVDSCVcYmluLWRvc1xrX2NwICVTQ0lURUNIJVxCSU5cREpHUFAuRU5WICVESl9QQVRIJVxESkdQUC5FTlYKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXGRlYnVnXGRvczMyXGRqMgotJVNDSVRFQ0glXGJpbi1kb3Nca19jcCAlU0NJVEVDSCVcQklOXERKR1BQX0RCLkVOViAlREpfUEFUSCVcREpHUFAuRU5WCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IERKR1BQPSVESl9QQVRIJVxESkdQUC5FTlYKLXNldCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JURKX1BBVEglXElOQ0xVREU7Ci1zZXQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXERKMzIuTUsKLXNldCBVU0VfV0lOMTY9Ci1zZXQgVVNFX1dJTjMyPQotc2V0IFdJTjMyX0dVST0KLXNldCBVU0VfU05BUD0KLXNldCBESl9MSUJCQVNFPWRqMgotUEFUSCAlU0NJVEVDSF9CSU4lOyVESl9QQVRIJVxCSU47JURFRlBBVEglCi0KLWVjaG8gREpHUFAgMi4wMiAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoRFBNSSkuCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItbGludXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1saW51eC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlYjJhYjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1saW51eC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggR05VIEMgY3Jvc3MtY29tcGlsZXIKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXHJlbGVhc2Vcd2luMzJcZ2NjMgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcZGVidWdcd2luMzJcZ2NjMgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGUKLXNldCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcZ2NjX2xpbnV4Lm1rCi1zZXQgTUFLRV9NT0RFPVVOSVgKLXNldCBVU0VfV0lOMTY9Ci1zZXQgVVNFX1dJTjMyPQotc2V0IFdJTjMyX0dVST0KLXNldCBVU0VfU05BUD0KLXNldCBHQ0NfTElCQkFTRT1nY2MyCi1QQVRIICVTQ0lURUNIX0JJTiU7JUdDQzJfUEFUSCVcY3Jvc3MtbGludXhcaTM4Ni1yZWRoYXQtbGludXhcQklOOyVERUZQQVRIJQotCi1lY2hvIEdDQyAyLjkueCAzMi1iaXQgTGludXggY29uc29sZSBjcm9zcyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi13MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGIzMWFhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHTlUgQyBjb21waWxlcgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJccmVsZWFzZVx3aW4zMlxnY2MyCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxkZWJ1Z1x3aW4zMlxnY2MyCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZQotc2V0IE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1xnY2Nfd2luMzIubWsKLXNldCBNQUtFX01PREU9Ci1zZXQgVVNFX1dJTjE2PQotc2V0IFVTRV9XSU4zMj0xCi1zZXQgV0lOMzJfR1VJPTEKLXNldCBVU0VfU05BUD0KLXNldCBHQ0NfTElCQkFTRT1nY2MyCi1QQVRIICVTQ0lURUNIX0JJTiU7JUdDQzJfUEFUSCVcTkFUSVZFXEJJTjslREVGUEFUSCUKLQotZWNobyBHQ0MgMi45LnggMzItYml0IFdpbjMyIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbWFrZWxpYi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tYWtlbGliLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMxNjczNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tYWtlbGliLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLWNhbGwgd2MxMS1kMzIuYmF0Ci0KLWNkIGM6XHByaXZhdGVcc3JjXGxpY2Vuc2UKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXHBtCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xjb25zb2xlCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xudWNsZXVzCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1x6bGliCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi0KLWNkIGM6XHByaXZhdGVcc3JjXGdyYXBoaWNzXHJlZjJkCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxwcml2YXRlXHNyY1xkcnZsaWIKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLQotY2FsbCB3YzExLXczMi5iYXQKLQotY2QgYzpccHJpdmF0ZVxzcmNcbGljZW5zZQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNccG0KLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXGNvbnNvbGUKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXG51Y2xldXMKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXHpsaWIKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLQotY2QgYzpccHJpdmF0ZVxzcmNcZ3JhcGhpY3NccmVmMmQKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHByaXZhdGVcc3JjXGRydmxpYgotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotCi1jYWxsIHdjMTAtZDMyLmJhdAotCi1jZCBjOlxwcml2YXRlXHNyY1xsaWNlbnNlCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xwbQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcY29uc29sZQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcbnVjbGV1cwotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcemxpYgotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotCi1jZCBjOlxwcml2YXRlXHNyY1xncmFwaGljc1xyZWYyZAotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpccHJpdmF0ZVxzcmNcZHJ2bGliCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi0KLWNkIFxwcml2YXRlXHNyY1xncmFwaGljc1xkcml2ZXJzCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tZWx0b2Jqcy5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL21lbHRvYmpzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDE4MDRiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL21lbHRvYmpzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIwotIyBUaGlzIHNjcmlwdCBnZW5lcmF0ZXMgYSBzaW5nbGUgb2JqZWN0IGZpbGUgZnJvbSBhIHNldCBvZiBsaWJyYXJpZXMgKCouYSBmaWxlcykKLSMgVXNhZ2U6IG1lbHRvYmpzLnNoIHRhcmdldC5vIGxpYnJhcnkxLmEgbGlicmFyeTIuYSAuLi4KLSMKLSMgKEMpIFNjaVRlY2ggU29mdHdhcmUsIEluYy4gMTk5OAotIwotCi1UTVBESVI9L3RtcC9tZWx0JCQKLVRBUkdFVD0kMQotVEFSR0VURElSPSRQV0QKLXNoaWZ0Ci1ta2RpciAkVE1QRElSCi0KLWNkICRUTVBESVIKLQotZm9yIGEgaW4gJCoKLWRvCi0gICAgYXIgeCAkYQotZG9uZQotbGQgLXIgLW8gJFRBUkdFVERJUi8kVEFSR0VUICoubwotCi1ybSAtZnIgJFRNUERJUgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL250ZGRrLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL250ZGRrLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdjMGQ3OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9udGRkay5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1AZWNobyBvZmYKLVJFTTogU2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTWljcm9zb2Z0IFdpbmRvd3MgTlQgRERLIGRldmVsb3BtZW50LgotUkVNOiBOb3RlIHRoYXQgd2UgaGF2ZSBoYXJkIGNvZGVkIHRoaXMgZm9yIFdpbmRvd3MgTlQgaTM4NiBkZXZlbG9wbWVudC4KLQotU0VUIFVTRV9OVERSVj0xCi1TRVQgVVNFX1cyS0RSVj0KLVNFVCBCQVNFRElSPSVOVF9EREtST09UJQotU0VUIFBBVEg9JUJBU0VESVIlXGJpbjslUEFUSCUKLVNFVCBOVE1BS0VFTlY9JUJBU0VESVIlXGluYwotU0VUIEJVSUxEX01BS0VfUFJPR1JBTT1ubWFrZS5leGUKLVNFVCBCVUlMRF9ERUZBVUxUPS1laSAtbm1ha2UgLWkKLVNFVCBCVUlMRF9ERUZBVUxUX1RBUkdFVFM9LTM4NgotU0VUIF9PQkpfRElSPW9iagotU0VUIE5FV19DUlRTPTEKLVNFVCBfTlRST09UPSVCQVNFRElSJQotU0VUIElOQ0xVREU9JUJBU0VESVIlXGluYzslSU5DTFVERSUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkCi0KLVJFTTogc2V0IHVwIGFuIE5UIGZyZWUgYnVpbGQgZW52aXJvbm1lbnQKLVNFVCBEREtCVUlMREVOVj1mcmVlCi1TRVQgQ19ERUZJTkVTPS1EX0lEV0JVSUxECi1TRVQgTlREQkdGSUxFUz0xCi1TRVQgTlRERUJVRz0KLVNFVCBOVERFQlVHVFlQRT0KLVNFVCBNU0NfT1BUSU1JWkFUSU9OPQotc2V0IExJQj0lQkFTRURJUiVcbGliXGkzODZcZnJlZTslU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXE5URFJWXFZDNjslTVNWQ0RpciVcTElCOy4KLQotZ290byBkb25lCi0KLTpjaGVja2VkCi0KLVJFTTogc2V0IHVwIGFuIE5UIGNoZWNrZWQgYnVpbGQgZW52aXJvbm1lbnQKLVNFVCBEREtCVUlMREVOVj1jaGVja2VkCi1TRVQgQ19ERUZJTkVTPS1EX0lEV0JVSUxEIC1EUkRSREJHIC1EU1JWREJHCi1TRVQgTlREQkdGSUxFUz0KLVNFVCBOVERFQlVHPW50c2QKLVNFVCBOVERFQlVHVFlQRT1ib3RoCi1TRVQgTVNDX09QVElNSVpBVElPTj0vT2QgL09pCi1zZXQgTElCPSVCQVNFRElSJVxsaWJcaTM4NlxmcmVlOyVTQ0lURUNIX0xJQiVcTElCXERFQlVHXE5URFJWXFZDNjslTVNWQ0RpciVcTElCOy4KLQotOmRvbmUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3FueDQuc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbng0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDNjNGQ5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3FueDQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyBmb3IgUU5YNAotCi1pZiBbICIkQ0hFQ0tFRCIgPSAiMSIgXTsgdGhlbgotICAgIGVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZWxzZQotICAgIGVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZmkKLQotZXhwb3J0IE1BS0VTVEFSVFVQPSRTQ0lURUNIL21ha2VkZWZzL3FueDQubWsKLWV4cG9ydCBJTkNMVURFPSItSSRTQ0lURUNIL2luY2x1ZGUgLUkkUFJJVkFURS9pbmNsdWRlIC1JL3Vzci9pbmNsdWRlIgotZXhwb3J0IFVTRV9RTlg9MQotZXhwb3J0IFVTRV9RTlg0PTEKLWV4cG9ydCBXQ19MSUJCQVNFPXdjMTAKLQotZWNobyBRbnggNCBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbnhudG8uc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbnhudG8uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxMTRmOWUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vcW54bnRvLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgZm9yIFFOWCBOZXV0cmlubwotCi1pZiBbICIkQ0hFQ0tFRCIgPSAiMSIgXTsgdGhlbgotICAgIGVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZWxzZQotICAgIGVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZmkKLQotaWYgWyBYJEdDQ19QQVRIID0gIlgiIF07IHRoZW4KLQlleHBvcnQgR0NDX1BBVEg9L3Vzci9nY2MvYmluCi1maQotCi1leHBvcnQgTUFLRVNUQVJUVVA9JFNDSVRFQ0gvbWFrZWRlZnMvcW54bnRvLm1rCi1leHBvcnQgSU5DTFVERT0iLUkkU0NJVEVDSC9pbmNsdWRlIC1JJFBSSVZBVEUvaW5jbHVkZSAtSS91c3IvbnRvL2luY2x1ZGUiCi1leHBvcnQgVVNFX0JJT1M9MQkjIFZCSU9TIGxpYiBpcyB0aW55IHVuZGVyIE5ldXRyaW5vLCBhbHdheXMgaW5jbHVkZSBpdAotZXhwb3J0IFVTRV9RTlg9MQotZXhwb3J0IFVTRV9RTlhOVE89MQotCi1lY2hvIFFueCBOZXV0cmlubyBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtYmVvcy5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWJlb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhMjcyZDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtYmVvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBCZU9TIFZFUlNJT04KLSMgU2V0IHRoZSBwbGFjZSB3aGVyZSBTY2lUZWNoIFNvZnR3YXJlIGlzIGluc3RhbGxlZCwgYW5kIHdoZXJlIGVhY2gKLSMgb2YgdGhlIHN1cHBvcnRlZCBjb21waWxlcnMgaXMgaW5zdGFsbGVkLiBUaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSMgYXJlIHVzZWQgYnkgdGhlIGJhdGNoIGZpbGVzIGluIHRoZSBTQ0lURUNIXEJJTiBkaXJlY3RvcnkuCi0jCi0jIE1vZGlmeSB0aGUgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgY29tcGlsZXIgY29uZmlndXJhdGlvbiAoeW91IHNob3VsZAotIyBvbmx5IG5lZWQgdG8gY2hhbmdlIHRoaW5ncyBpbiB0aGlzIGJhdGNoIGZpbGUpLgotIwotIyBUaGlzIHZlcnNpb24gaXMgZm9yIGEgbm9ybWFsIEJlT1MgaW5zdGFsbGF0aW9uLgotCi0jIFRoZSBTQ0lURUNIIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBiYXRjaCBmaWxlcywgbWFrZWZpbGUgc3RhcnR1cHMsCi0jIGluY2x1ZGUgZmlsZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGZvdW5kIHdoZW4gY29tcGlsaW5nLgotCi1leHBvcnQgU0NJVEVDSD0kTUdMX1JPT1QgCi0KLSMgVGhlIFNDSVRFQ0hfTElCIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSB0aGUgU2NpVGVjaCBsaWJyYXJpZXMgbGl2ZQotIyBmb3IgaW5zdGFsbGF0aW9uIGFuZCBsaW5raW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB0aGUgc291cmNlIGFuZAotIyBpbmNsdWRlIGZpbGVzIG9uIGxvY2FsIG1hY2hpbmVzIGZvciBjb21waWxpbmcgYW5kIGhhdmUgdGhlIGxpYnJhcmllcwotIyBsb2NhdGVkIG9uIGEgY29tbW9uIG5ldHdvcmsgbWFjaGluZSAoZm9yIG5ldHdvcmsgYnVpbGRzKS4KLQotZXhwb3J0IFNDSVRFQ0hfTElCPSRTQ0lURUNICi0KLSMgVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0Ci0jIGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKLQotZXhwb3J0IFBSSVZBVEU9JEhPTUUvcHJpdmF0ZQotCi0jIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5Ci0jIGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCi0jIGNvbXBpbGVycy4KLQotZXhwb3J0IEdDQ19QQVRIPS9ib290L2RldmVsb3AvdG9vbHMvZ251cHJvL2JpbgotCi0jIEFkZCB0aGUgU2NpdGVjaCBiaW4gcGF0aCB0byB0aGUgY3VycmVudCBQQVRICi1leHBvcnQgUEFUSD0kU0NJVEVDSC9iaW46JFNDSVRFQ0gvYmluLWJlb3M6JFBBVEgKLSNpZiBbICJ4JExJQkMiID0geCBdOyB0aGVuCi0jCWV4cG9ydCBQQVRIPSRQQVRIOiRTQ0lURUNIL2Jpbi1iZW9zL2dsaWJjCi0jZWxzZQotIwlleHBvcnQgUEFUSD0kUEFUSDokU0NJVEVDSC9iaW4tYmVvcy9saWJjCi0jZmkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWZyZWVic2Quc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1mcmVlYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTIwNzQ4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWZyZWVic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgTElOVVggVkVSU0lPTgotIyBTZXQgdGhlIHBsYWNlIHdoZXJlIFNjaVRlY2ggU29mdHdhcmUgaXMgaW5zdGFsbGVkLCBhbmQgd2hlcmUgZWFjaAotIyBvZiB0aGUgc3VwcG9ydGVkIGNvbXBpbGVycyBpcyBpbnN0YWxsZWQuIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcwotIyBhcmUgdXNlZCBieSB0aGUgYmF0Y2ggZmlsZXMgaW4gdGhlIFNDSVRFQ0hcQklOIGRpcmVjdG9yeS4KLSMKLSMgTW9kaWZ5IHRoZSBhcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBjb21waWxlciBjb25maWd1cmF0aW9uICh5b3Ugc2hvdWxkCi0jIG9ubHkgbmVlZCB0byBjaGFuZ2UgdGhpbmdzIGluIHRoaXMgYmF0Y2ggZmlsZSkuCi0jCi0jIFRoaXMgdmVyc2lvbiBpcyBmb3IgYSBub3JtYWwgTGludXggaW5zdGFsbGF0aW9uLgotCi0jIFRoZSBTQ0lURUNIIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBiYXRjaCBmaWxlcywgbWFrZWZpbGUgc3RhcnR1cHMsCi0jIGluY2x1ZGUgZmlsZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGZvdW5kIHdoZW4gY29tcGlsaW5nLgotCi1leHBvcnQgU0NJVEVDSD0kTUdMX1JPT1QgCi0KLSMgVGhlIFNDSVRFQ0hfTElCIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSB0aGUgU2NpVGVjaCBsaWJyYXJpZXMgbGl2ZQotIyBmb3IgaW5zdGFsbGF0aW9uIGFuZCBsaW5raW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB0aGUgc291cmNlIGFuZAotIyBpbmNsdWRlIGZpbGVzIG9uIGxvY2FsIG1hY2hpbmVzIGZvciBjb21waWxpbmcgYW5kIGhhdmUgdGhlIGxpYnJhcmllcwotIyBsb2NhdGVkIG9uIGEgY29tbW9uIG5ldHdvcmsgbWFjaGluZSAoZm9yIG5ldHdvcmsgYnVpbGRzKS4KLQotZXhwb3J0IFNDSVRFQ0hfTElCPSRTQ0lURUNICi0KLSMgVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0Ci0jIGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKLQotZXhwb3J0IFBSSVZBVEU9JEhPTUUvcHJpdmF0ZQotCi0jIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5Ci0jIGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCi0jIGNvbXBpbGVycy4KLQotZXhwb3J0IEdDQ19QQVRIPS91c3IvYmluCi0KLSMgQWRkIHRoZSBTY2l0ZWNoIGJpbiBwYXRoIHRvIHRoZSBjdXJyZW50IFBBVEgKLWV4cG9ydCBQQVRIPSRTQ0lURUNIL2JpbjokU0NJVEVDSC9iaW4tZnJlZWJzZDokUEFUSApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtbGludXguc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1saW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVjYmYxZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1saW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBMSU5VWCBWRVJTSU9OCi0jIFNldCB0aGUgcGxhY2Ugd2hlcmUgU2NpVGVjaCBTb2Z0d2FyZSBpcyBpbnN0YWxsZWQsIGFuZCB3aGVyZSBlYWNoCi0jIG9mIHRoZSBzdXBwb3J0ZWQgY29tcGlsZXJzIGlzIGluc3RhbGxlZC4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0jIGFyZSB1c2VkIGJ5IHRoZSBiYXRjaCBmaWxlcyBpbiB0aGUgU0NJVEVDSFxCSU4gZGlyZWN0b3J5LgotIwotIyBNb2RpZnkgdGhlIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gKHlvdSBzaG91bGQKLSMgb25seSBuZWVkIHRvIGNoYW5nZSB0aGluZ3MgaW4gdGhpcyBiYXRjaCBmaWxlKS4KLSMKLSMgVGhpcyB2ZXJzaW9uIGlzIGZvciBhIG5vcm1hbCBMaW51eCBpbnN0YWxsYXRpb24uCi0KLSMgVGhlIFNDSVRFQ0ggdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIGJhdGNoIGZpbGVzLCBtYWtlZmlsZSBzdGFydHVwcywKLSMgaW5jbHVkZSBmaWxlcyBhbmQgc291cmNlIGZpbGVzIHdpbGwgYmUgZm91bmQgd2hlbiBjb21waWxpbmcuCi0KLWV4cG9ydCBTQ0lURUNIPSRNR0xfUk9PVCAKLQotIyBUaGUgU0NJVEVDSF9MSUIgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHRoZSBTY2lUZWNoIGxpYnJhcmllcyBsaXZlCi0jIGZvciBpbnN0YWxsYXRpb24gYW5kIGxpbmtpbmcuIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIHRoZSBzb3VyY2UgYW5kCi0jIGluY2x1ZGUgZmlsZXMgb24gbG9jYWwgbWFjaGluZXMgZm9yIGNvbXBpbGluZyBhbmQgaGF2ZSB0aGUgbGlicmFyaWVzCi0jIGxvY2F0ZWQgb24gYSBjb21tb24gbmV0d29yayBtYWNoaW5lIChmb3IgbmV0d29yayBidWlsZHMpLgotCi1leHBvcnQgU0NJVEVDSF9MSUI9JFNDSVRFQ0gKLQotIyBUaGUgUFJJVkFURSB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgcmVzaWRlIHRoYXQKLSMgZG8gbm90IGxpdmUgaW4gdGhlIHB1YmxpYyBzb3VyY2UgdHJlZQotCi1leHBvcnQgUFJJVkFURT0kSE9NRS9wcml2YXRlCi0KLSMgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGxvY2F0aW9ucyBvZiBhbGwgdGhlIGNvbXBpbGVycyB0aGF0IHlvdSBtYXkKLSMgYmUgdXNpbmcuIENoYW5nZSB0aGVtIHRvIHJlZmxlY3Qgd2hlcmUgeW91IGhhdmUgaW5zdGFsbGVkIHlvdXIKLSMgY29tcGlsZXJzLgotCi1leHBvcnQgR0NDX1BBVEg9L3Vzci9iaW4KLWV4cG9ydCBURU1QPS90bXAgVE1QPS90bXAKLQotIyBBZGQgdGhlIFNjaXRlY2ggYmluIHBhdGggdG8gdGhlIGN1cnJlbnQgUEFUSAotZXhwb3J0IFBBVEg9JFNDSVRFQ0gvYmluOiRTQ0lURUNIL2Jpbi1saW51eDokUEFUSAotaWYgWyAieCRMSUJDIiA9IHggXTsgdGhlbgotCWV4cG9ydCBQQVRIPSRTQ0lURUNIL2Jpbi1saW51eC9nbGliYzokUEFUSAotZWxzZQotCWV4cG9ydCBQQVRIPSRTQ0lURUNIL2Jpbi1saW51eC9saWJjOiRQQVRICi1maQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtcW54LnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtcW54LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDczMTA5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLXFueC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBRTlggNCBWRVJTSU9OCi0jIFNldCB0aGUgcGxhY2Ugd2hlcmUgU2NpVGVjaCBTb2Z0d2FyZSBpcyBpbnN0YWxsZWQsIGFuZCB3aGVyZSBlYWNoCi0jIG9mIHRoZSBzdXBwb3J0ZWQgY29tcGlsZXJzIGlzIGluc3RhbGxlZC4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0jIGFyZSB1c2VkIGJ5IHRoZSBiYXRjaCBmaWxlcyBpbiB0aGUgU0NJVEVDSFxCSU4gZGlyZWN0b3J5LgotIwotIyBNb2RpZnkgdGhlIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gKHlvdSBzaG91bGQKLSMgb25seSBuZWVkIHRvIGNoYW5nZSB0aGluZ3MgaW4gdGhpcyBiYXRjaCBmaWxlKS4KLSMKLSMgVGhpcyB2ZXJzaW9uIGlzIGZvciBhIG5vcm1hbCBMaW51eCBpbnN0YWxsYXRpb24uCi0KLSMgVGhlIFNDSVRFQ0ggdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIGJhdGNoIGZpbGVzLCBtYWtlZmlsZSBzdGFydHVwcywKLSMgaW5jbHVkZSBmaWxlcyBhbmQgc291cmNlIGZpbGVzIHdpbGwgYmUgZm91bmQgd2hlbiBjb21waWxpbmcuCi0KLWV4cG9ydCBTQ0lURUNIPSRNR0xfUk9PVCAKLQotIyBUaGUgU0NJVEVDSF9MSUIgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHRoZSBTY2lUZWNoIGxpYnJhcmllcyBsaXZlCi0jIGZvciBpbnN0YWxsYXRpb24gYW5kIGxpbmtpbmcuIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIHRoZSBzb3VyY2UgYW5kCi0jIGluY2x1ZGUgZmlsZXMgb24gbG9jYWwgbWFjaGluZXMgZm9yIGNvbXBpbGluZyBhbmQgaGF2ZSB0aGUgbGlicmFyaWVzCi0jIGxvY2F0ZWQgb24gYSBjb21tb24gbmV0d29yayBtYWNoaW5lIChmb3IgbmV0d29yayBidWlsZHMpLgotCi1leHBvcnQgU0NJVEVDSF9MSUI9JFNDSVRFQ0gKLQotIyBUaGUgUFJJVkFURSB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgcmVzaWRlIHRoYXQKLSMgZG8gbm90IGxpdmUgaW4gdGhlIHB1YmxpYyBzb3VyY2UgdHJlZQotCi1leHBvcnQgUFJJVkFURT0kSE9NRS9wcml2YXRlCi0KLSMgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGxvY2F0aW9ucyBvZiBhbGwgdGhlIGNvbXBpbGVycyB0aGF0IHlvdSBtYXkKLSMgYmUgdXNpbmcuIENoYW5nZSB0aGVtIHRvIHJlZmxlY3Qgd2hlcmUgeW91IGhhdmUgaW5zdGFsbGVkIHlvdXIKLSMgY29tcGlsZXJzLgotCi1leHBvcnQgV0MxMF9QQVRIPS91c3Ivd2F0Y29tLzEwLjYvdXNyCi0KLSMgQWRkIHRoZSBTY2l0ZWNoIGJpbiBwYXRoIHRvIHRoZSBjdXJyZW50IFBBVEgKLWV4cG9ydCBQQVRIPSRTQ0lURUNIL2JpbjokU0NJVEVDSC9iaW4tcW54OiRQQVRICmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhMjEwMWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNOj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJFTTogTWFzdGVyIGJhdGNoIGZpbGUgdG8gc2V0IHVwIGFsbCBuZWNlc3NhcnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvcgotUkVNOiB0aGUgU2NpVGVjaCBtYWtlZmlsZSB1dGlsaXRpZXMuIFRoaXMgYmF0Y2ggZmlsZSBzaG91bGQgYmUgZXhlY3V0ZWQKLVJFTTogKmZpcnN0KiBiZWZvcmUgYW55IG90aGVyIGJhdGNoIGZpbGVzIHdoZW4geW91IHN0YXJ0IGEgY29tbWFuZCBzaGVsbC4KLVJFTTogWW91IHNob3VsZCBub3QgbmVlZCB0byBtb2RpZnkgYW55IGJhdGNoIGZpbGVzIGV4Y2VwdCB0aGlzIG9uZSB0bwotUkVNOiBjb25maWd1cmUgdGhlIG1ha2VmaWxlIHV0aWxpdGllcy4KLVJFTTo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJFTTogU2V0IHRoZSBwbGFjZSB3aGVyZSBTY2lUZWNoIFNvZnR3YXJlIGlzIGluc3RhbGxlZCwgYW5kIHdoZXJlIGVhY2gKLVJFTTogb2YgdGhlIHN1cHBvcnRlZCBjb21waWxlcnMgaXMgaW5zdGFsbGVkLiBUaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLVJFTTogYXJlIHVzZWQgYnkgdGhlIGJhdGNoIGZpbGVzIGluIHRoZSBTQ0lURUNIXEJJTiBkaXJlY3RvcnkuCi1SRU06Ci1SRU06IE1vZGlmeSB0aGUgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgY29tcGlsZXIgY29uZmlndXJhdGlvbiAoeW91IHNob3VsZAotUkVNOiBvbmx5IG5lZWQgdG8gY2hhbmdlIHRoaW5ncyBpbiB0aGlzIGJhdGNoIGZpbGUpLgotUkVNOgotUkVNOiBUaGlzIHZlcnNpb24gaXMgZm9yIGEgbm9ybWFsIE1TRE9TIGluc3RhbGxhdGlvbi4KLQotUkVNOiBUaGUgU0NJVEVDSCB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgYmF0Y2ggZmlsZXMsIG1ha2VmaWxlIHN0YXJ0dXBzLAotUkVNOiBpbmNsdWRlIGZpbGVzIGFuZCBzb3VyY2UgZmlsZXMgd2lsbCBiZSBmb3VuZCB3aGVuIGNvbXBpbGluZy4KLQotU0VUIFNDSVRFQ0g9Yzpcc2NpdGVjaAotCi1SRU06IFRoZSBTQ0lURUNIX0xJQiB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgdGhlIFNjaVRlY2ggbGlicmFyaWVzIGxpdmUKLVJFTTogZm9yIGluc3RhbGxhdGlvbiBhbmQgbGlua2luZy4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgdGhlIHNvdXJjZSBhbmQKLVJFTTogaW5jbHVkZSBmaWxlcyBvbiBsb2NhbCBtYWNoaW5lcyBmb3IgY29tcGlsaW5nIGFuZCBoYXZlIHRoZSBsaWJyYXJpZXMKLVJFTTogbG9jYXRlZCBvbiBhIGNvbW1vbiBuZXR3b3JrIG1hY2hpbmUgKGZvciBuZXR3b3JrIGJ1aWxkcykuCi0KLVNFVCBTQ0lURUNIX0xJQj0lU0NJVEVDSCUKLQotUkVNOiBUaGUgUFJJVkFURSB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgcmVzaWRlIHRoYXQKLVJFTTogZG8gbm90IGxpdmUgaW4gdGhlIHB1YmxpYyBzb3VyY2UgdHJlZQotCi1TRVQgUFJJVkFURT1jOlxwcml2YXRlCi0KLVJFTTogVGhlIGZvbGxvd2luZyBzZXRzIHVwIHRoZSBwYXRoIHRvIHRoZSBTY2lUZWNoIGNvbW1hbmQgbGluZSB1dGlsaXRpZXMKLVJFTTogZm9yIHRoZSBkZXZlbG9wbWVudCBvcGVyYXRpbmcgc3lzdGVtLiBXZSBzZWxlY3QgZWl0aGVyIERPUyBob3N0ZWQKLVJFTTogdG9vbHMgb3IgV2luMzIgaG9zdGVkIHRvb2xzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBhcmUgcnVubmluZwotUkVNOiBvbiBOVCBvciBub3QuIFdpbmRvd3MgOXggdXNlcnMgY2FuIHVzZSB0aGUgV2luMzIgaG9zdGVkIHRvb2xzIGJ1dAotUkVNOiB0aGV5IHJ1biBzbG93ZXIsIGJ1dCB5b3Ugd2lsbCBoYXZlIGxvbmcgZmlsZW5hbWVzIGlmIHlvdSBkbyB0aGlzLgotCi1JRiAuJU9TJT09LldpbmRvd3NfTlQgZ290byBXaW4zMl9wYXRoCi1JRiBOT1QgLiVXSU5ESVIlPT0uIGdvdG8gV2luMzJfcGF0aAotU0VUIFNDSVRFQ0hfQklOPSVTQ0lURUNIJVxiaW47JVNDSVRFQ0glXGJpbi1kb3MKLWdvdG8gcGF0aF9zZXQKLQotUkVNOiBUaGUgZm9sbG93aW5nIHNldHMgdXAgdGhlIHBhdGggdG8gdGhlIFNjaVRlY2ggY29tbWFuZCBsaW5lIHV0aWxpdGllcwotUkVNOiBmb3IgdGhlIGRldmVsb3BtZW50IG9wZXJhdGluZyBzeXN0ZW0uIFRoaXMgdmVyc2lvbiB1c2VzIHRoZSBXaW4zMgotUkVNOiBob3N0ZWQgdG9vbHMgYnkgZGVmYXVsdCwgc28geW91IGNhbiB1c2UgbG9uZyBmaWxlbmFtZXMuCi0KLTpXaW4zMl9wYXRoCi1TRVQgU0NJVEVDSF9CSU49JVNDSVRFQ0glXGJpbjslU0NJVEVDSCVcYmluLXdpbjMyCi0KLTpwYXRoX3NldAotCi1SRU06IFNldCB0aGUgVE1QIHZhcmlhYmxlIGZvciBkbWFrZSBpZiB0aGlzIGlzIG5vdCBhbHJlYWR5IHNldAotCi1TRVQgVE1QPSVTQ0lURUNIJQotCi1SRU06IFNldCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHVzZSB0aGUgTmV0d2lkZSBBc3NlbWJsZXIKLVJFTTogKE5BU00pIHByb3ZpZGVkIHdpdGggdGhlIE1HTCB0b29scyB0byBidWlsZCBhbGwgYXNzZW1ibGVyIG1vZHVsZXMuCi1SRU06IElmIHlvdSBoYXZlIFR1cmJvIEFzc2VtYmxlciA0LjAgb3IgbGF0ZXIgYW5kIHlvdSB3aXNoIHRvIHVzZSBpdCwKLVJFTTogeW91IGNhbiB1c2UgaXQgYnkgcmVtb3ZpbmcgdGhlIGZvbGxvd2luZyBsaW5lLgotCi1TRVQgVVNFX05BU009MQotCi1SRU06IFRoZSBmb2xsb3dpbmcgaXMgdXNlZCB0byBzZXQgdXAgRERLIGRpcmVjdG9yaWVzIGZvciBkZXZpY2UgZHJpdmVyCi1SRU06IGRldmVsb3BtZW50LiBUaGV5IGNhbiBzYWZlbHkgYmUgaWdub3JlZCB1bmxlc3MgeW91IGFyZSB1c2luZyB0aGUKLVJFTTogU2NpVGVjaCBtYWtlZmlsZSB1dGlsaXRpZXMgdG8gYnVpbGQgZGV2aWNlIGRyaXZlcnMuCi0KLVNFVCBEREtEUklWRT1jOgotU0VUIE1TU0RLPWM6XGNcd2luMzJzZGsKLVNFVCBXOTVfRERLUk9PVD1jOlxjXDk1ZGRrCi1TRVQgVzk4X0RES1JPT1Q9YzpcY1w5OGRkawotU0VUIE5UX0RES1JPT1Q9YzpcY1xudGRkawotU0VUIFcyS19EREtST09UPWM6XGNcMjAwMGRkawotU0VUIE1BU01fUk9PVD1jOlxjXG1hc202MTEKLVNFVCBWVE9PTFNEPWM6XGNcdnRkOTUKLVNFVCBTT0ZUSUNFX1BBVEg9YzpcY1xzaW50Ci0KLVJFTTogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGxvY2F0aW9ucyBvZiBhbGwgdGhlIGNvbXBpbGVycyB0aGF0IHlvdSBtYXkKLVJFTTogYmUgdXNpbmcuIENoYW5nZSB0aGVtIHRvIHJlZmxlY3Qgd2hlcmUgeW91IGhhdmUgaW5zdGFsbGVkIHlvdXIKLVJFTTogY29tcGlsZXJzLgotCi1TRVQgQkMzX1BBVEg9YzpcY1xiYzMKLVNFVCBCQzRfUEFUSD1jOlxjXGJjNDUKLVNFVCBCQzVfUEFUSD1jOlxjXGJjNTAKLVNFVCBCQ0I1X1BBVEg9YzpcY1xiY2I1MAotU0VUIFZDX1BBVEg9YzpcY1xtc3ZjCi1TRVQgVkM0X1BBVEg9YzpcY1x2YzQyCi1TRVQgVkM1X1BBVEg9YzpcY1x2YzUwCi1TRVQgVkM2X1BBVEg9YzpcY1x2YzYwCi1TRVQgU0M3MF9QQVRIPWM6XGNcc2M3NQotU0VUIFdDMTBBX1BBVEg9YzpcY1x3YzEwYQotU0VUIFdDMTBfUEFUSD1jOlxjXHdjMTAKLVNFVCBXQzExX1BBVEg9YzpcY1x3YzExCi1TRVQgVE5UX1BBVEg9YzpcY1x0bnQKLVNFVCBESl9QQVRIPWM6XGNcZGpncHAKLVNFVCBHQ0MyX1BBVEg9YzpcdW5peFx1c3IKLQotUkVNOiBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBJREUgYW5kIGNvbXBpbGVyIHBhdGgKLVJFTTogdG9vbHMgZm9yIFZpc3VhbCBDKysuIElmIHlvdSBkbyBhIHN0YW5kYXJkIGluc3RhbGxhdGlvbiwgeW91IHdvbnQKLVJFTTogbmVlZCB0byBjaGFuZ2UgdGhpcy4gSWYgaG93ZXZlciB5b3UgZGlkIGEgY3VzdG9tIGluc3RhbGwgYW5kIGNoYW5nZWQKLVJFTTogdGhlIHBhdGhzIHRvIHRoZXNlIGRpcmVjdG9yeSwgeW91IHdpbGwgbmVlZCB0byBtb2RpZnkgdGhpcyB0byBzdWl0LgotCi1TRVQgVkM1X01TRGV2RGlyPSVWQzVfUEFUSCVcc2hhcmVkaWRlCi1TRVQgVkM1X01TVkNEaXI9JVZDNV9QQVRIJVx2YwotU0VUIFZDNl9NU0RldkRpcj0lVkM2X1BBVEglXGNvbW1vblxtc2Rldjk4Ci1TRVQgVkM2X01TVkNEaXI9JVZDNl9QQVRIJVx2Yzk4Ci0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtYzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzFmN2Q4ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWMzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxWQzQ7JVZDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkM0X1BBVEglCi1zZXQgQ19JTkNMVURFPSVWQzRfUEFUSCVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLXNldCBJTklUPSVWQzRfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPVZDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzRfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCi1jYWxsIHdpbjMyc2RrLmJhdAotCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDQuMiAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgxNzQ5My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcVkM0OyVWQ19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcVkM0OyVWQ19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQ19QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT1WQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslVkNfUEFUSCVcQklOOyVERUZQQVRIJSVWQ19DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgMS41MmMgMTYgRE9TIGJpdCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2OXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1kcnY5eC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZTM1MjEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1kcnY5eC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCi0KLVJFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQKLWNhbGwgdmM0MC1jMzIuYmF0ID4gTlVMCi0KLVJFTTogRXh0cmEgc3R1ZmYgdG8gc2V0IHVwIGZvciBXaW5kb3dzIDl4IERESyBkZXZlbG9wbWVudAotc2V0IE1BU1RFUl9NQUtFPTEKLXNldCBEREtST09UPSVXOTVfRERLUk9PVCUKLXNldCBTREtST09UPSVNU1NESyUKLXNldCBDMTZfUk9PVD0lVkNfUEFUSCUKLXNldCBDMzJfUk9PVD0lVkM0X1BBVEglCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpjaGVja2VkX2J1aWxkCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA0LjIgV2luZG93cyA5eCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydm50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2I2NzgwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1SRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50ICh3aXRoIFBsYXRmb3JtIFNESykKLWNhbGwgdmM0MC1jMzIuYmF0IHNkayA+IE5VTAotCi1SRU06IEV4dHJhIHN0dWZmIHRvIHNldCB1cCBmb3IgV2luZG93cyBOVCBEREsgZGV2ZWxvcG1lbnQKLVNFVCBCQVNFRElSPSVOVF9EREtST09UJQotU0VUIFBBVEg9JU5UX0RES1JPT1QlXGJpbjslUEFUSCUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmNoZWNrZWRfYnVpbGQKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDQuMiBXaW5kb3dzIE5UIGRyaXZlciBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk5NzA0NC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDNF9QQVRIJQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFCi1zZXQgSU5JVD0lVkM0X1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0xCi1TRVQgVkNfTElCQkFTRT1WQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM0X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgNC4yIFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBmYzkzNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXENPRkZMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzRfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkM0X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDNF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPVZDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzRfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9Ci0KLWVjaG8gVmlzdWFsIEMrKyA0LjIgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4NDlhMjAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFZDNDslVkNfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XFZDNDslVkNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5JVD0lVkNfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSwotU0VUIFVTRV9XSU4xNj0xCi1TRVQgVVNFX1dJTjMyPQotU0VUIFZDX0xJQkJBU0U9VkM0Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQ19QQVRIJVxCSU47JURFRlBBVEglJVZDX0NEX1BBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyAxLjUyYyAxNiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5M2E2MjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxWQzQ7JVZDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDNF9QQVRIJQotc2V0IENfSU5DTFVERT0lVkM0X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1zZXQgSU5JVD0lVkM0X1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9VkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDNF9QQVRIJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXgxMS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0MjBhNTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC14MTEuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1TRVQgTElCPSVWQzRfUEFUSCVcTElCOy4KLVNFVCBUT09MUk9PVERJUj0lVkM0X1BBVEglCi1TRVQgSU5DTFVERT1ceGNcaW5jbHVkZTslVkM0X1BBVEglXElOQ0xVREUKLVNFVCBJTklUPSVWQzRfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT1WQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM0X1BBVEglXEJJTjslREVGUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDQuMiBYMTEgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZDI3YjkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1jMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDUuMCAzMiBiaXQgZWRpdGlvbgotCi1TRVQgTVNEZXZEaXI9JVZDNV9NU0RldkRpciUKLVNFVCBNU1ZDRGlyPSVWQzVfTVNWQ0RpciUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM1OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcVkM1OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lTVNWQ0RpciUKLXNldCBDX0lOQ0xVREU9JU1TVkNEaXIlXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1zZXQgSU5JVD0lTVNWQ0RpciUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNS4wIDMyLWJpdCBXaW5kb3dzIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3ODljNTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFZDNTslVkNfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFZDNTslVkNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5JVD0lVkNfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2LWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnY5eC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWRydjl4LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdhNGExNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWRydjl4LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudAotY2FsbCB2YzYwLWMzMi5iYXQgPiBOVUwKLQotUkVNOiBFeHRyYSBzdHVmZiB0byBzZXQgdXAgZm9yIFdpbmRvd3MgOXggRERLIGRldmVsb3BtZW50Ci1zZXQgTUFTVEVSX01BS0U9MQotc2V0IERES1JPT1Q9JVc5NV9EREtST09UJQotc2V0IFNES1JPT1Q9JU1TU0RLJQotc2V0IEMxNl9ST09UPSVWQ19QQVRIJQotc2V0IEMzMl9ST09UPSVWQzZfUEFUSCUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmNoZWNrZWRfYnVpbGQKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDYuMCBXaW5kb3dzIDl4IGRyaXZlciBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnZudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YjJmMjUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnZudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLVJFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQgKHdpdGggUGxhdGZvcm0gU0RLKQotY2FsbCB2YzYwLWMzMi5iYXQgc2RrID4gTlVMCi0KLVJFTTogTm93IHNldHVwIHN0dWZmIGZvciB0aGUgTlQgRERLIGJ1aWxkIGVudmlyb25tZW50Ci1jYWxsIG50ZGRrLmJhdAotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06Y2hlY2tlZF9idWlsZAotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNi4wIFdpbmRvd3MgTlQgZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1ydHQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1ydHQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmIyZmIxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtcnR0LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA1LjAgMzIgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM1OyVWQzVfUEFUSCVcVkNcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNTslVkM1X1BBVEglXFZDXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzVfUEFUSCVcVkMKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkM1X1BBVEglXFZDXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDNV9QQVRIJVxWQwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9MQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDNV9QQVRIJVxWQ1xCSU47JVZDNV9QQVRIJVxTSEFSRURJREVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyA1LjAgUlRUYXJnZXQtMzIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXNucC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyZDJlMTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1zbnAuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmIFJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdAotZWRpdGlvbgotCi1TRVQgTVNEZXZEaXI9JVZDNV9NU0RldkRpciUKLVNFVCBNU1ZDRGlyPSVWQzVfTVNWQ0RpciUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxWQzU7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKLXNldCBJTklUPSVNU1ZDRGlyJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9MQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgNS4wIFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXRudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMDkxOTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC10bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDUuMCAzMiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxWQzU7JVZDNV9QQVRIJVxWQ1xMSUI7JVROVF9QQVRIJVxDT0ZGTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcVkM1OyVWQzVfUEFUSCVcVkNcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzVfUEFUSCVcVkMKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkM1X1BBVEglXFZDXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDNV9QQVRIJVxWQwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzVfUEFUSCVcVkNcQklOOyVWQzVfUEFUSCVcU0hBUkVESURFXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPQotCi1lY2hvIFZpc3VhbCBDKysgNS4wIDMyLWJpdCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKHdpdGggVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJhYjQ5NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcVkM1OyVWQ19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcVkM1OyVWQ19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQ19QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC13MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwN2JjNWU1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA1LjAgMzIgYml0IGVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzVfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM1X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCi1zZXQgQ19JTkNMVURFPSVNU1ZDRGlyJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotc2V0IElOSVQ9JU1TVkNEaXIlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQotY2FsbCB3aW4zMnNkay5iYXQKLQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA1LjAgMzItYml0IFdpbmRvd3MgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmUyODZiZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdCBlZGl0aW9uCi0KLVNFVCBMSUI9JVZDNV9QQVRIJVxWQ1xMSUI7LgotU0VUIFRPT0xST09URElSPSVWQzVfUEFUSCVcVkMKLVNFVCBJTkNMVURFPVx4Y1xpbmNsdWRlOyVWQzVfUEFUSCVcVkNcSU5DTFVERQotU0VUIElOSVQ9JVZDNV9QQVRIJVxWQwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzVfUEFUSCVcVkNcQklOOyVWQzVfUEFUSCVcU0hBUkVESURFXEJJTjslREVGUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDUuMCBYMTEgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ODQxN2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1jMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgotCi1TRVQgTVNEZXZEaXI9JVZDNl9NU0RldkRpciUKLVNFVCBNU1ZDRGlyPSVWQzZfTVNWQ0RpciUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lTVNWQ0RpciUKLXNldCBDX0lOQ0xVREU9JU1TVkNEaXIlXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLXNldCBJTklUPSVNU1ZDRGlyJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM2Ci1QQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQotY2FsbCB3aW4zMnNkay5iYXQKLQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA2LjAgMzItYml0IFdpbmRvd3MgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA4NTVlMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQ19QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT12YzYKLVBBVEggJVNDSVRFQ0hfQklOJTslVkNfUEFUSCVcQklOOyVERUZQQVRIJSVWQ19DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgMS41MmMgMTYtYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydjl4LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZHJ2OXguYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2E0YTE0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZHJ2OXguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgotCi1SRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50Ci1jYWxsIHZjNjAtYzMyLmJhdCA+IE5VTAotCi1SRU06IEV4dHJhIHN0dWZmIHRvIHNldCB1cCBmb3IgV2luZG93cyA5eCBEREsgZGV2ZWxvcG1lbnQKLXNldCBNQVNURVJfTUFLRT0xCi1zZXQgRERLUk9PVD0lVzk1X0RES1JPT1QlCi1zZXQgU0RLUk9PVD0lTVNTREslCi1zZXQgQzE2X1JPT1Q9JVZDX1BBVEglCi1zZXQgQzMyX1JPT1Q9JVZDNl9QQVRIJQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06Y2hlY2tlZF9idWlsZAotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNi4wIFdpbmRvd3MgOXggZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydm50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdiMmYyNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydm50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudCAod2l0aCBQbGF0Zm9ybSBTREspCi1jYWxsIHZjNjAtYzMyLmJhdCBzZGsgPiBOVUwKLQotUkVNOiBOb3cgc2V0dXAgc3R1ZmYgZm9yIHRoZSBOVCBEREsgYnVpbGQgZW52aXJvbm1lbnQKLWNhbGwgbnRkZGsuYmF0Ci0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpjaGVja2VkX2J1aWxkCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA2LjAgV2luZG93cyBOVCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydncyay5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydncyay5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzMDQyOTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZ3MmsuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgotCi1SRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50ICh3aXRoIFBsYXRmb3JtIFNESykKLWNhbGwgdmM2MC1jMzIuYmF0IHNkayA+IE5VTAotCi1SRU06IE5vdyBzZXR1cCBzdHVmZiBmb3IgdGhlIE5UIERESyBidWlsZCBlbnZpcm9ubWVudAotY2FsbCB3MmtkZGsuYmF0Ci0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpjaGVja2VkX2J1aWxkCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA2LjAgV2luZG93cyBXaW5kb3dzIDIwMDAgZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzQ4ZWY5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzZfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM2X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxWQzY7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVNU1ZDRGlyJQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFCi1zZXQgSU5JVD0lTVNWQ0RpciUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBWQ19MSUJCQVNFPXZjNgotUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDYuMCBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC10bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDhiNWUzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcVkM2OyVWQzZfUEFUSCVcVkM5OFxMSUI7JVROVF9QQVRIJVxDT0ZGTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcVkM2OyVWQzZfUEFUSCVcVkM5OFxMSUI7JVROVF9QQVRIJVxDT0ZGTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDNl9QQVRIJVxWQzk4Ci1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDNl9QQVRIJVxWQzk4XElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDNl9QQVRIJVxWQzk4Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM2IFBBVEgKLSVTQ0lURUNIX0JJTiU7JVZDNl9QQVRIJVxWQzk4XEJJTjslVkM2X1BBVEglXENPTU1PTlxNU0RFVjk4XEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPQotCi1lY2hvIFZpc3VhbCBDKysgNi4wIDMyLWJpdCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKHdpdGggVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAxNzVjMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQ19QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM2Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC13MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZjhlN2FiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzZfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM2X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCi1zZXQgQ19JTkNMVURFPSVNU1ZDRGlyJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1zZXQgSU5JVD0lTVNWQ0RpciUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT12YzYKLVBBVEggJVNDSVRFQ0hfQklOJTslTVNWQ0RpciVcQklOOyVNU0RldkRpciVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCi1jYWxsIHdpbjMyc2RrLmJhdAotCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDYuMCAzMi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdiMjNkMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLVNFVCBMSUI9JVZDNl9QQVRIJVxWQzk4XExJQjsuCi1TRVQgVE9PTFJPT1RESVI9JVZDNl9QQVRIJVxWQzk4Ci1TRVQgSU5DTFVERT1ceGNcaW5jbHVkZTslVkM2X1BBVEglXFZDOThcSU5DTFVERTsKLVNFVCBJTklUPSVWQzZfUEFUSCVcVkM5OAotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNgotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzZfUEFUSCVcVkM5OFxCSU47JVZDNl9QQVRIJVxDT01NT05cTVNERVY5OFxCSU47JURFRlBBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyA2LjAgWDExIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdzJrZGRrLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3cya2Rkay5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyODU4ZDEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdzJrZGRrLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNOiBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBNaWNyb3NvZnQgV2luZG93cyBOVCBEREsgZGV2ZWxvcG1lbnQuCi1SRU06IE5vdGUgdGhhdCB3ZSBoYXZlIGhhcmQgY29kZWQgdGhpcyBmb3IgV2luZG93cyBOVCBpMzg2IGRldmVsb3BtZW50LgotCi1TRVQgVVNFX05URFJWPTEKLVNFVCBVU0VfVzJLRFJWPTEKLVNFVCBCQVNFRElSPSVXMktfRERLUk9PVCUKLVNFVCBQQVRIPSVCQVNFRElSJVxiaW47JVBBVEglCi1TRVQgTlRNQUtFRU5WPSVCQVNFRElSJVxpbmMKLVNFVCBCVUlMRF9NQUtFX1BST0dSQU09bm1ha2UuZXhlCi1TRVQgQlVJTERfREVGQVVMVD0tZWkgLW5tYWtlIC1pCi1TRVQgQlVJTERfREVGQVVMVF9UQVJHRVRTPS0zODYKLVNFVCBfT0JKX0RJUj1vYmoKLVNFVCBORVdfQ1JUUz0xCi1TRVQgX05UUk9PVD0lQkFTRURJUiUKLVNFVCBJTkNMVURFPSVCQVNFRElSJVxpbmM7JUJBU0VESVIlXGluY1xkZGs7JUlOQ0xVREUlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZAotCi1SRU06IHNldCB1cCBhbiBOVCBmcmVlIGJ1aWxkIGVudmlyb25tZW50Ci1TRVQgRERLQlVJTERFTlY9ZnJlZQotU0VUIENfREVGSU5FUz0tRF9JRFdCVUlMRAotU0VUIE5UREJHRklMRVM9MQotU0VUIE5UREVCVUc9Ci1TRVQgTlRERUJVR1RZUEU9Ci1TRVQgTVNDX09QVElNSVpBVElPTj0KLXNldCBMSUI9JUJBU0VESVIlXGxpYmZyZVxpMzg2OyVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVzJLRFJWXFZDNjslTVNWQ0RpciVcTElCOy4KLQotZ290byBkb25lCi0KLTpjaGVja2VkCi0KLVJFTTogc2V0IHVwIGFuIE5UIGNoZWNrZWQgYnVpbGQgZW52aXJvbm1lbnQKLVNFVCBEREtCVUlMREVOVj1jaGVja2VkCi1TRVQgQ19ERUZJTkVTPS1EX0lEV0JVSUxEIC1EUkRSREJHIC1EU1JWREJHCi1TRVQgTlREQkdGSUxFUz0KLVNFVCBOVERFQlVHPW50c2QKLVNFVCBOVERFQlVHVFlQRT1ib3RoCi1TRVQgTVNDX09QVElNSVpBVElPTj0vT2QgL09pCi1zZXQgTElCPSVCQVNFRElSJVxsaWJjaGtcaTM4NjslU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXMktEUlZcVkM2OyVNU1ZDRGlyJVxMSUI7LgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDczOGYzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwX1BBVEglXEg7JVdDMTBfUEFUSCVcSFxOVDsKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgV2luMzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWM1M2E5MC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUgKERPUzRHVykKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcV0MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxXQzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwX1BBVEglXEg7JVdDMTBfUEFUSCVcSFxXSU47Ci1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDE2LWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1kMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWM3MjEwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZSAoRE9TNEdXKQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcRE9TOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxET1M7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSDsKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVESl9QQVRIJVxCSU47JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKERPUzRHVykKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzlkZWNlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtbzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAxNi1iaXQgT1MvMiBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxyZWxlYXNlXG9zMjE2XHdjMTA7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJcZGVidWdcb3MyMTZcd2MxMDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxlZGRhdAotU0VUIElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZTslV0MxMF9QQVRIJVxoXG9zMjslV0MxMF9QQVRIJVxoCi1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXG1ha2VkZWZzXHdjMTYubWsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PTEKLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPXdjMTAKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDE2LWJpdCBPUy8yIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtbzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtbzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQwNGI0Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLW8zMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzItYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIzMlx3YzEwOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjMyXHdjMTA7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBfUEFUSCVcaFxvczI7JVdDMTBfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzMyLm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9MQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT13YzEwCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiAzMi1iaXQgT1MvMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTcwNTdkZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXAzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzItYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIzMlx3YzEwOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjMyXHdjMTA7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBfUEFUSCVcaFxvczI7JVdDMTBfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzMyLm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9MQotU0VUIFVTRV9PUzJHVUk9MQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9d2MxMAotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IE9TLzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcW54LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcW54LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDZmODY1OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXFueC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUgKFFOWCA0KQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxRTlg0XFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxRTlg7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcUU5YNFxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcUU5YOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwX1BBVEglXFFIOwotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PTEKLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVESl9QQVRIJVxCSU47JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IFFOWCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZmRlNjI0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxICi1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXRudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxMmYwNDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC10bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxET1M7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7JVROVF9QQVRIJVxJTkNMVURFCi1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPTEKLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9MQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDMyLWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGJhODcxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAxNiBiaXQgV2luZG93cyBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFdDMTA7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcV0MxMDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcV0lOOwotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiAxNi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODM5YmRkZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiBXaW4zMiBHVUkgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXgxMS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjNzgzZDguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC14MTEuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlCi0KLVNFVCBMSUI9JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT0lV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiBYMTEgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlMGMyNGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFjMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxOVDsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSBXaW4zMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWVjYjY3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMzIgYml0IG1vZGUgKERPUzRHVykKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcV0MxMEE7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcV0MxMEE7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOyVXQzEwQV9QQVRIJVxIXFdJTjsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMTYtYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWQzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWQzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1MmI3OWEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMiBiaXQgbW9kZSAoRE9TNEdXKQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcRE9TOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxET1M7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOwotU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoRE9TNEdXKQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTczNTFkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhbzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMTYtYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIxNlx3YzEwOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjE2XHdjMTA7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwQV9QQVRIJVxoXG9zMjslV0MxMEFfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MxNi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9MQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFdDX0xJQkJBU0U9d2MxMAotU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjBhIDE2LWJpdCBPUy8yIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhbzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhbzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNjYWE1OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYW8zMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQUFfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBBQV9QQVRIJVxoXG9zMjslV0MxMEFBX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTBBQV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzMyLm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9MQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotU0VUIEVEUEFUSD0lV0MxMEFBX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBQV9QQVRIJVxCSU5OVDslV0MxMEFBNl9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSAzMi1iaXQgT1MvMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhcDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhcDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQyMWM2Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXAzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwX1BBVEglXGhcb3MyOyVXQzEwX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMzItYml0IE9TLzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhmODU3Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyIGJpdCBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQotU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF0bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF0bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMmIzMjE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcRE9TOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxOVDslVE5UX1BBVEglXElOQ0xVREUKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPTEKLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFdDX0xJQkJBU0U9V0MxMEEKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9MQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQwMTFjYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDE2IGJpdCBXaW5kb3dzIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcV0MxMEE7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcV0MxMEE7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOyVXQzEwQV9QQVRIJVxIXFdJTjsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9MQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMTYtYml0IFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlMTRkYmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF3MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxOVDsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgV2luMzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzUzMTI5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1TRVQgQ19JTkNMVURFPSVXQzExX1BBVEglXEg7JVdDMTFfUEFUSCVcSFxOVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfV0lOMzg2PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIFdpbjMyIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzM4YWRhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNFVHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAxNiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxXQzExOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFdDMTE7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSDslV0MxMV9QQVRIJVxIXFdJTjsKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MxNi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMQotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgMTYtYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWQzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWQzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YTU0ZDQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyIGJpdCBtb2RlIChET1M0R1cpCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxET1M7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XERPUzsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxIOwotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURKX1BBVEglXEJJTjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoRE9TNEdXKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtbzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtbzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDQ2NzU0YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8xNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMTYtYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIxNlx3YzExOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjE2XHdjMTE7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTFfUEFUSCVcaFxvczI7JVdDMTFfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzE2Lm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0xCi1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT13YzExCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCAxNi1iaXQgT1MvMiBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8zMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8zMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3ZjVkYzcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMTsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzExOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzExX1BBVEglXGhcb3MyOyVXQzExX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9d2MxMQotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgMzItYml0IE9TLzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXAzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXAzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0OGNiYmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1wMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMTsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzExOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzExX1BBVEglXGhcb3MyOyVXQzExX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPXdjMTEKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDMyLWJpdCBPUy8yIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXFueC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXFueC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmZDYwZmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1xbnguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyIGJpdCBtb2RlIChRTlggNCkKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcUU5YNFxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcUU5YOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFFOWDRcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XFFOWDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxRSDsKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0xCi1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREpfUEFUSCVcQklOOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDMyLWJpdCBRTlggY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQyYWM1Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSAotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0xCi1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRkYmYyNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcRE9TOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzExX1BBVEglXEg7JVdDMTFfUEFUSCVcSFxOVDslVE5UX1BBVEglXElOQ0xVREUKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9MQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCi1SRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCi1SRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKLVJFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcwotUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKLVJFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0Ci1SRU0gd29yayB0b28gd2VsbCkuCi1SRU0KLVJFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKLVJFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCi0KLVNFVCBET1NTVFlMRT0xCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2NWM3MGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS13MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDE2IGJpdCBXaW5kb3dzIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcV0MxMTsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4xNlxXQzExOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzExX1BBVEglXEg7JVdDMTFfUEFUSCVcSFxXSU47Ci1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9MQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTEKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzY0Y2RiZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIENfSU5DTFVERT0lV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcTlQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTEKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQotY2FsbCB3aW4zMnNkay5iYXQKLQotOmRvbmUKLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgV2luMzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzI1NjlhMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCBXaW4zMiBHVUkgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2luMzJzZGsuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2luMzJzZGsuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzdmMDE3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3dpbjMyc2RrLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNOiBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBNaWNyb3NvZnQgUGxhdGZvcm0gU0RLIGRldmVsb3BtZW50Ci1SRU06IE5vdGUgdGhhdCB3ZSBoYXZlIGhhcmQgY29kZWQgdGhpcyBmb3IgV2luZG93cyBOVCBpMzg2IGRldmVsb3BtZW50LgotCi1TRVQgTVNUT09MUz0lTVNTREslCi1TRVQgRFhTREtST09UPSVNU1RPT0xTJQotU0VUIElORVRTREs9JU1TVE9PTFMlCi1TRVQgQktPRkZJQ0U9JU1TVE9PTFMlCi1TRVQgQkFTRU1BS0U9JUJLT0ZGSUNFJVxJTkNMVURFXEJLT2ZmaWNlLk1hawotU0VUIElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVNU1RPT0xTJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1pZiAuJTElPT0uYm9ybGFuZCBnb3RvIGJvcmxhbmQKLVNFVCBMSUI9JU1TVE9PTFMlXExJQjslTElCJQotZ290byBub3Rib3JsYW5kCi06Ym9ybGFuZAotU0VUIExJQj0lTVNUT09MUyVcTElCXEJPUkxBTkQ7JUxJQiUKLTpub3Rib3JsYW5kCi1TRVQgUEFUSD0lTVNUT09MUyVcQmluXDslTVNUT09MUyVcQmluXFdpbk5UOyVQQVRIJQotU0VUIENQVT1pMzg2Ci0KLWVjaG8gTWljcm9zb2Z0IFBsYXRmb3JtIFNESyBzdXBwb3J0IGVuYmFibGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL2Jpb3NlbXUuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9iaW9zZW11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzMzYTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL2Jpb3NlbXUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSByZWFsIG1vZGUgeDg2IEJJT1MgZW11bGF0b3IsIHdoaWNoIGlzCi0qICAgICAgICAgICAgICAgdXNlZCB0byB3YXJtYm9vdCBhbnkgbnVtYmVyIG9mIFZHQSBjb21wYXRpYmxlIFBDSS9BR1AKLSogICAgICAgICAgICAgICBjb250cm9sbGVycyB1bmRlciBhbnkgT1MsIG9uIGFueSBwcm9jZXNzb3IgZmFtaWx5IHRoYXQKLSogICAgICAgICAgICAgICBzdXBwb3J0cyBQQ0kuIFdlIGFsc28gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY2FsbAotKiAgICAgICAgICAgICAgIHJlYWwgbW9kZSBCSU9TIGZ1bmN0aW9ucyBhbmQgSW50IDEwaCBmdW5jdGlvbnMgKGluY2x1ZGluZwotKiAgICAgICAgICAgICAgIHRoZSBWRVNBIEJJT1MpLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0JJT1NFTVVfSAotI2RlZmluZSBfX0JJT1NFTVVfSAotCi0jaW5jbHVkZSAieDg2ZW11LmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJwY2lsaWIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBwYWNrKDEpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgVkdBCi1jb250cm9sbGVyLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYWxsb3cgdGhlIFZHQSBjb250cm9sbGVyIHRvIGJlCi1zd2FwcGVkIG9uIHRoZSBmbHkgd2l0aGluIHRoZSBCSU9TIGVtdWxhdG9yLgotCi1IRUFERVI6Ci1iaW9zZW11LmgKLQotTUVNQkVSUzoKLXBjaUluZm8gICAgICAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYmxvY2sgZm9yIHRoZSBjb250cm9sbGVyCi1CSU9TSW1hZ2UgICAgICAgLSBQb2ludGVyIHRvIGEgcmVhZC93cml0ZSBjb3B5IG9mIHRoZSBCSU9TIGltYWdlCi1CSU9TSW1hZ2VMZW4gICAgLSBMZW5ndGggb2YgdGhlIEJJT1MgaW1hZ2UKLUxvd01lbSAgICAgICAgICAtIENvcHkgb2Yga2V5IGxvdyBtZW1vcnkgYXJlYXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgUENJRGV2aWNlSW5mbyAgICpwY2lJbmZvOwotICAgIHZvaWQgICAgICAgICAgICAqQklPU0ltYWdlOwotICAgIHVsb25nICAgICAgICAgICBCSU9TSW1hZ2VMZW47Ci0gICAgdWNoYXIgICAgICAgICAgIExvd01lbVsxNTM2XTsKLSAgICB9IEJFX1ZHQUluZm87Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBmb3IgdGhlIEJJT1MgZW11bGF0b3Igc3lzdGVtCi1lbnZpcm9ubWVudCBhcyB1c2VkIGJ5IHRoZSBYODYgZW11bGF0b3IgbGlicmFyeS4KLQotSEVBREVSOgotYmlvc2VtdS5oCi0KLU1FTUJFUlM6Ci12Z2FJbmZvICAgICAgICAgLSBWR0EgQklPUyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLWJpb3NtZW1fYmFzZSAgICAtIEJhc2Ugb2YgdGhlIEJJT1MgaW1hZ2UKLWJpb3NtZW1fbGltaXQgICAtIExpbWl0IG9mIHRoZSBCSU9TIGltYWdlCi1idXNtZW1fYmFzZSAgICAgLSBCYXNlIG9mIHRoZSBWR0EgYnVzIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCRV9WR0FJbmZvICAgICAgdmdhSW5mbzsKLSAgICB1bG9uZyAgICAgICAgICAgYmlvc21lbV9iYXNlOwotICAgIHVsb25nICAgICAgICAgICBiaW9zbWVtX2xpbWl0OwotICAgIHVsb25nICAgICAgICAgICBidXNtZW1fYmFzZTsKLSAgICB9IEJFX3N5c0VudjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdHJ1Y3R1cmUgZGVmaW5pbmcgYWxsIHRoZSBCSU9TIEVtdWxhdG9yIEFQSSBmdW5jdGlvbnMgYXMgZXhwb3J0ZWQgZnJvbQotdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwuCi17c2VjcmV0fQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGR3U2l6ZTsKLSAgICBpYm9vbCAgIChQTUFQSVAgQkVfaW5pdCkodTMyIGRlYnVnRmxhZ3MsaW50IG1lbVNpemUsQkVfVkdBSW5mbyAqaW5mbyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIEJFX3NldFZHQSkoQkVfVkdBSW5mbyAqaW5mbyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIEJFX2dldFZHQSkoQkVfVkdBSW5mbyAqaW5mbyk7Ci0gICAgdm9pZCAqICAoUE1BUElQIEJFX21hcFJlYWxQb2ludGVyKSh1aW50IHJfc2VnLHVpbnQgcl9vZmYpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBCRV9nZXRWRVNBQnVmKSh1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKTsKLSAgICB2b2lkICAgIChQTUFQSVAgQkVfY2FsbFJlYWxNb2RlKSh1aW50IHNlZyx1aW50IG9mZixSTVJFR1MgKnJlZ3MsUk1TUkVHUyAqc3JlZ3MpOwotICAgIGludCAgICAgKFBNQVBJUCBCRV9pbnQ4NikoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQpOwotICAgIGludCAgICAgKFBNQVBJUCBCRV9pbnQ4NngpKGludCBpbnRubyxSTVJFR1MgKmluLFJNUkVHUyAqb3V0LFJNU1JFR1MgKnNyZWdzKTsKLSAgICB2b2lkICogIHJlc2VydmVkMTsKLSAgICB2b2lkICAgIChQTUFQSVAgQkVfZXhpdCkodm9pZCk7Ci0gICAgfSBCRV9leHBvcnRzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHBvaW50ZXIgdHlwZSBmb3IgdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwgaW5pdGlhbGlzYXRpb24gZW50cnkgcG9pbnQuCi17c2VjcmV0fQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgQkVfZXhwb3J0cyAqIChQTUFQSVAgQkVfaW5pdExpYnJhcnlfdCkoUE1faW1wb3J0cyAqUE1JbXApOwotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIHtzZWNyZXR9IEdsb2JhbCBCSU9TIGVtdWxhdG9yIHN5c3RlbSBlbnZpcm9ubWVudCAqLwotZXh0ZXJuIEJFX3N5c0VudiBfQkVfZW52OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBCSU9TIGVtdWxhdG9yIGxpYnJhcnkgZW50cnkgcG9pbnRzICovCi0KLWlib29sICAgUE1BUEkgQkVfaW5pdCh1MzIgZGVidWdGbGFncyxpbnQgbWVtU2l6ZSxCRV9WR0FJbmZvICppbmZvKTsKLXZvaWQgICAgUE1BUEkgQkVfc2V0VkdBKEJFX1ZHQUluZm8gKmluZm8pOwotdm9pZCAgICBQTUFQSSBCRV9nZXRWR0EoQkVfVkdBSW5mbyAqaW5mbyk7Ci12b2lkICAgIFBNQVBJIEJFX3NldERlYnVnRmxhZ3ModTMyIGRlYnVnRmxhZ3MpOwotdm9pZCAqICBQTUFQSSBCRV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpOwotdm9pZCAqICBQTUFQSSBCRV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpOwotdm9pZCAgICBQTUFQSSBCRV9jYWxsUmVhbE1vZGUodWludCBzZWcsdWludCBvZmYsUk1SRUdTICpyZWdzLFJNU1JFR1MgKnNyZWdzKTsKLWludCAgICAgUE1BUEkgQkVfaW50ODYoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQpOwotaW50ICAgICBQTUFQSSBCRV9pbnQ4NngoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQsUk1TUkVHUyAqc3JlZ3MpOwotdm9pZCAgICBQTUFQSSBCRV9leGl0KHZvaWQpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0JJT1NFTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL2V2ZW50LmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvZXZlbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlYWM4Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvZXZlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0gZXZlbnQgbGlicmFyeQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0VWRU5UX0gKLSNkZWZpbmUgX19FVkVOVF9ICi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKiAnQycgY2FsbGluZyBjb252ZW50aW9ucyBhbHdheXMgKi8KLQotI2RlZmluZSBFVlRBUEkgIF9BU01BUEkKLSNkZWZpbmUgRVZUQVBJUCBfQVNNQVBJUAotCi0vKiBFdmVudCBtZXNzYWdlIG1hc2tzIGZvciBrZXlEb3duIGV2ZW50cyAqLwotCi0jZGVmaW5lIEVWVF9BU0NJSU1BU0sgICAweDAwRkYgICAgICAvKiBBU0NJSSBjb2RlIG9mIGtleSBwcmVzc2VkICAgICAgICAqLwotI2RlZmluZSBFVlRfU0NBTk1BU0sgICAgMHhGRjAwICAgICAgLyogU2NhbiBjb2RlIG9mIGtleSBwcmVzc2VkICAgICAgICAgKi8KLSNkZWZpbmUgRVZUX0NPVU5UTUFTSyAgIDB4N0ZGRjAwMDBMIC8qIENvdW50IGZvciBLRVlSRVBFQVQncyAgICAgICAgICAgICovCi0KLS8qIE1hY3JvcyB0byBleHRyYWN0IHZhbHVlcyBmcm9tIHRoZSBtZXNzYWdlIGZpZWxkcyAqLwotCi0jZGVmaW5lIEVWVF9hc2NpaUNvZGUobSkgICAgKCAodWNoYXIpIChtICYgRVZUX0FTQ0lJTUFTSykgKQotI2RlZmluZSBFVlRfc2NhbkNvZGUobSkgICAgICggKHVjaGFyKSAoIChtICYgRVZUX1NDQU5NQVNLKSA+PiA4ICkgKQotI2RlZmluZSBFVlRfcmVwZWF0Q291bnQobSkgICggKHNob3J0KSAoIChtICYgRVZUX0NPVU5UTUFTSykgPj4gMTYgKSApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lcyB0aGUgc2V0IG9mIEFTQ0lJIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZSBldmVudCBsaWJyYXJ5IGZ1bmN0aW9ucwotaW4gdGhlIG1lc3NhZ2UgZmllbGQuIFVzZSB0aGUgRVZUX2FzY2lpQ29kZSBtYWNybyB0byBleHRyYWN0IHRoZSBjb2RlCi1mcm9tIHRoZSBldmVudCBzdHJ1Y3R1cmUuCi0KLUhFQURFUjoKLWV2ZW50LmgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEFTQ0lJX2N0cmxBICAgICAgICAgICAgID0gMHgwMSwKLSAgICBBU0NJSV9jdHJsQiAgICAgICAgICAgICA9IDB4MDIsCi0gICAgQVNDSUlfY3RybEMgICAgICAgICAgICAgPSAweDAzLAotICAgIEFTQ0lJX2N0cmxEICAgICAgICAgICAgID0gMHgwNCwKLSAgICBBU0NJSV9jdHJsRSAgICAgICAgICAgICA9IDB4MDUsCi0gICAgQVNDSUlfY3RybEYgICAgICAgICAgICAgPSAweDA2LAotICAgIEFTQ0lJX2N0cmxHICAgICAgICAgICAgID0gMHgwNywKLSAgICBBU0NJSV9iYWNrc3BhY2UgICAgICAgICA9IDB4MDgsCi0gICAgQVNDSUlfY3RybEggICAgICAgICAgICAgPSAweDA4LAotICAgIEFTQ0lJX3RhYiAgICAgICAgICAgICAgID0gMHgwOSwKLSAgICBBU0NJSV9jdHJsSSAgICAgICAgICAgICA9IDB4MDksCi0gICAgQVNDSUlfY3RybEogICAgICAgICAgICAgPSAweDBBLAotICAgIEFTQ0lJX2N0cmxLICAgICAgICAgICAgID0gMHgwQiwKLSAgICBBU0NJSV9jdHJsTCAgICAgICAgICAgICA9IDB4MEMsCi0gICAgQVNDSUlfZW50ZXIgICAgICAgICAgICAgPSAweDBELAotICAgIEFTQ0lJX2N0cmxNICAgICAgICAgICAgID0gMHgwRCwKLSAgICBBU0NJSV9jdHJsTiAgICAgICAgICAgICA9IDB4MEUsCi0gICAgQVNDSUlfY3RybE8gICAgICAgICAgICAgPSAweDBGLAotICAgIEFTQ0lJX2N0cmxQICAgICAgICAgICAgID0gMHgxMCwKLSAgICBBU0NJSV9jdHJsUSAgICAgICAgICAgICA9IDB4MTEsCi0gICAgQVNDSUlfY3RybFIgICAgICAgICAgICAgPSAweDEyLAotICAgIEFTQ0lJX2N0cmxTICAgICAgICAgICAgID0gMHgxMywKLSAgICBBU0NJSV9jdHJsVCAgICAgICAgICAgICA9IDB4MTQsCi0gICAgQVNDSUlfY3RybFUgICAgICAgICAgICAgPSAweDE1LAotICAgIEFTQ0lJX2N0cmxWICAgICAgICAgICAgID0gMHgxNiwKLSAgICBBU0NJSV9jdHJsVyAgICAgICAgICAgICA9IDB4MTcsCi0gICAgQVNDSUlfY3RybFggICAgICAgICAgICAgPSAweDE4LAotICAgIEFTQ0lJX2N0cmxZICAgICAgICAgICAgID0gMHgxOSwKLSAgICBBU0NJSV9jdHJsWiAgICAgICAgICAgICA9IDB4MUEsCi0gICAgQVNDSUlfZXNjICAgICAgICAgICAgICAgPSAweDFCLAotICAgIEFTQ0lJX3NwYWNlICAgICAgICAgICAgID0gMHgyMCwKLSAgICBBU0NJSV9leGNsYW1hdGlvbiAgICAgICA9IDB4MjEsIC8qICEgKi8KLSAgICBBU0NJSV9xdW90ZSAgICAgICAgICAgICA9IDB4MjIsIC8qICIgKi8KLSAgICBBU0NJSV9wb3VuZCAgICAgICAgICAgICA9IDB4MjMsIC8qICMgKi8KLSAgICBBU0NJSV9kb2xsYXIgICAgICAgICAgICA9IDB4MjQsIC8qICQgKi8KLSAgICBBU0NJSV9wZXJjZW50ICAgICAgICAgICA9IDB4MjUsIC8qICUgKi8KLSAgICBBU0NJSV9hbXBlcnNhbmQgICAgICAgICA9IDB4MjYsIC8qICYgKi8KLSAgICBBU0NJSV9hcG9zdHJvcGhlICAgICAgICA9IDB4MjcsIC8qICcgKi8KLSAgICBBU0NJSV9sZWZ0QnJhY2UgICAgICAgICA9IDB4MjgsIC8qICggKi8KLSAgICBBU0NJSV9yaWdodEJyYWNlICAgICAgICA9IDB4MjksIC8qICkgKi8KLSAgICBBU0NJSV90aW1lcyAgICAgICAgICAgICA9IDB4MkEsIC8qICogKi8KLSAgICBBU0NJSV9wbHVzICAgICAgICAgICAgICA9IDB4MkIsIC8qICsgKi8KLSAgICBBU0NJSV9jb21tYSAgICAgICAgICAgICA9IDB4MkMsIC8qICwgKi8KLSAgICBBU0NJSV9taW51cyAgICAgICAgICAgICA9IDB4MkQsIC8qIC0gKi8KLSAgICBBU0NJSV9wZXJpb2QgICAgICAgICAgICA9IDB4MkUsIC8qIC4gKi8KLSAgICBBU0NJSV9kaXZpZGUgICAgICAgICAgICA9IDB4MkYsIC8qIC8gKi8KLSAgICBBU0NJSV8wICAgICAgICAgICAgICAgICA9IDB4MzAsCi0gICAgQVNDSUlfMSAgICAgICAgICAgICAgICAgPSAweDMxLAotICAgIEFTQ0lJXzIgICAgICAgICAgICAgICAgID0gMHgzMiwKLSAgICBBU0NJSV8zICAgICAgICAgICAgICAgICA9IDB4MzMsCi0gICAgQVNDSUlfNCAgICAgICAgICAgICAgICAgPSAweDM0LAotICAgIEFTQ0lJXzUgICAgICAgICAgICAgICAgID0gMHgzNSwKLSAgICBBU0NJSV82ICAgICAgICAgICAgICAgICA9IDB4MzYsCi0gICAgQVNDSUlfNyAgICAgICAgICAgICAgICAgPSAweDM3LAotICAgIEFTQ0lJXzggICAgICAgICAgICAgICAgID0gMHgzOCwKLSAgICBBU0NJSV85ICAgICAgICAgICAgICAgICA9IDB4MzksCi0gICAgQVNDSUlfY29sb24gICAgICAgICAgICAgPSAweDNBLCAvKiA6ICovCi0gICAgQVNDSUlfc2VtaWNvbG9uICAgICAgICAgPSAweDNCLCAvKiA7ICovCi0gICAgQVNDSUlfbGVzc1RoYW4gICAgICAgICAgPSAweDNDLCAvKiA8ICovCi0gICAgQVNDSUlfZXF1YWxzICAgICAgICAgICAgPSAweDNELCAvKiA9ICovCi0gICAgQVNDSUlfZ3JlYXRlclRoYW4gICAgICAgPSAweDNFLCAvKiA+ICovCi0gICAgQVNDSUlfcXVlc3Rpb24gICAgICAgICAgPSAweDNGLCAvKiA/ICovCi0gICAgQVNDSUlfYXQgICAgICAgICAgICAgICAgPSAweDQwLCAvKiBAICovCi0gICAgQVNDSUlfQSAgICAgICAgICAgICAgICAgPSAweDQxLAotICAgIEFTQ0lJX0IgICAgICAgICAgICAgICAgID0gMHg0MiwKLSAgICBBU0NJSV9DICAgICAgICAgICAgICAgICA9IDB4NDMsCi0gICAgQVNDSUlfRCAgICAgICAgICAgICAgICAgPSAweDQ0LAotICAgIEFTQ0lJX0UgICAgICAgICAgICAgICAgID0gMHg0NSwKLSAgICBBU0NJSV9GICAgICAgICAgICAgICAgICA9IDB4NDYsCi0gICAgQVNDSUlfRyAgICAgICAgICAgICAgICAgPSAweDQ3LAotICAgIEFTQ0lJX0ggICAgICAgICAgICAgICAgID0gMHg0OCwKLSAgICBBU0NJSV9JICAgICAgICAgICAgICAgICA9IDB4NDksCi0gICAgQVNDSUlfSiAgICAgICAgICAgICAgICAgPSAweDRBLAotICAgIEFTQ0lJX0sgICAgICAgICAgICAgICAgID0gMHg0QiwKLSAgICBBU0NJSV9MICAgICAgICAgICAgICAgICA9IDB4NEMsCi0gICAgQVNDSUlfTSAgICAgICAgICAgICAgICAgPSAweDRELAotICAgIEFTQ0lJX04gICAgICAgICAgICAgICAgID0gMHg0RSwKLSAgICBBU0NJSV9PICAgICAgICAgICAgICAgICA9IDB4NEYsCi0gICAgQVNDSUlfUCAgICAgICAgICAgICAgICAgPSAweDUwLAotICAgIEFTQ0lJX1EgICAgICAgICAgICAgICAgID0gMHg1MSwKLSAgICBBU0NJSV9SICAgICAgICAgICAgICAgICA9IDB4NTIsCi0gICAgQVNDSUlfUyAgICAgICAgICAgICAgICAgPSAweDUzLAotICAgIEFTQ0lJX1QgICAgICAgICAgICAgICAgID0gMHg1NCwKLSAgICBBU0NJSV9VICAgICAgICAgICAgICAgICA9IDB4NTUsCi0gICAgQVNDSUlfViAgICAgICAgICAgICAgICAgPSAweDU2LAotICAgIEFTQ0lJX1cgICAgICAgICAgICAgICAgID0gMHg1NywKLSAgICBBU0NJSV9YICAgICAgICAgICAgICAgICA9IDB4NTgsCi0gICAgQVNDSUlfWSAgICAgICAgICAgICAgICAgPSAweDU5LAotICAgIEFTQ0lJX1ogICAgICAgICAgICAgICAgID0gMHg1QSwKLSAgICBBU0NJSV9sZWZ0U3F1YXJlQnJhY2UgICA9IDB4NUIsIC8qIFsgKi8KLSAgICBBU0NJSV9iYWNrU2xhc2ggICAgICAgICA9IDB4NUMsIC8qIFwgKi8KLSAgICBBU0NJSV9yaWdodFNxdWFyZUJyYWNlICA9IDB4NUQsIC8qIF0gKi8KLSAgICBBU0NJSV9jYXJldCAgICAgICAgICAgICA9IDB4NUUsIC8qIF4gKi8KLSAgICBBU0NJSV91bmRlcnNjb3JlICAgICAgICA9IDB4NUYsIC8qIF8gKi8KLSAgICBBU0NJSV9sZWZ0QXBvc3Ryb3BoZSAgICA9IDB4NjAsIC8qIGAgKi8KLSAgICBBU0NJSV9hICAgICAgICAgICAgICAgICA9IDB4NjEsCi0gICAgQVNDSUlfYiAgICAgICAgICAgICAgICAgPSAweDYyLAotICAgIEFTQ0lJX2MgICAgICAgICAgICAgICAgID0gMHg2MywKLSAgICBBU0NJSV9kICAgICAgICAgICAgICAgICA9IDB4NjQsCi0gICAgQVNDSUlfZSAgICAgICAgICAgICAgICAgPSAweDY1LAotICAgIEFTQ0lJX2YgICAgICAgICAgICAgICAgID0gMHg2NiwKLSAgICBBU0NJSV9nICAgICAgICAgICAgICAgICA9IDB4NjcsCi0gICAgQVNDSUlfaCAgICAgICAgICAgICAgICAgPSAweDY4LAotICAgIEFTQ0lJX2kgICAgICAgICAgICAgICAgID0gMHg2OSwKLSAgICBBU0NJSV9qICAgICAgICAgICAgICAgICA9IDB4NkEsCi0gICAgQVNDSUlfayAgICAgICAgICAgICAgICAgPSAweDZCLAotICAgIEFTQ0lJX2wgICAgICAgICAgICAgICAgID0gMHg2QywKLSAgICBBU0NJSV9tICAgICAgICAgICAgICAgICA9IDB4NkQsCi0gICAgQVNDSUlfbiAgICAgICAgICAgICAgICAgPSAweDZFLAotICAgIEFTQ0lJX28gICAgICAgICAgICAgICAgID0gMHg2RiwKLSAgICBBU0NJSV9wICAgICAgICAgICAgICAgICA9IDB4NzAsCi0gICAgQVNDSUlfcSAgICAgICAgICAgICAgICAgPSAweDcxLAotICAgIEFTQ0lJX3IgICAgICAgICAgICAgICAgID0gMHg3MiwKLSAgICBBU0NJSV9zICAgICAgICAgICAgICAgICA9IDB4NzMsCi0gICAgQVNDSUlfdCAgICAgICAgICAgICAgICAgPSAweDc0LAotICAgIEFTQ0lJX3UgICAgICAgICAgICAgICAgID0gMHg3NSwKLSAgICBBU0NJSV92ICAgICAgICAgICAgICAgICA9IDB4NzYsCi0gICAgQVNDSUlfdyAgICAgICAgICAgICAgICAgPSAweDc3LAotICAgIEFTQ0lJX3ggICAgICAgICAgICAgICAgID0gMHg3OCwKLSAgICBBU0NJSV95ICAgICAgICAgICAgICAgICA9IDB4NzksCi0gICAgQVNDSUlfeiAgICAgICAgICAgICAgICAgPSAweDdBLAotICAgIEFTQ0lJX2xlZnRDdXJseUJyYWNlICAgID0gMHg3QiwgLyogeyAqLwotICAgIEFTQ0lJX3ZlcnRpY2FsQmFyICAgICAgID0gMHg3QywgLyogfCAqLwotICAgIEFTQ0lJX3JpZ2h0Q3VybHlCcmFjZSAgID0gMHg3RCwgLyogfSAqLwotICAgIEFTQ0lJX3RpbGRlICAgICAgICAgICAgID0gMHg3RSAgLyogfiAqLwotICAgIH0gRVZUX2FzY2lpQ29kZXNUeXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZXMgdGhlIHNldCBvZiBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZSBldmVudCBsaWJyYXJ5IGZ1bmN0aW9ucwotaW4gdGhlIG1lc3NhZ2UgZmllbGQuIFVzZSB0aGUgRVZUX3NjYW5Db2RlIG1hY3JvIHRvIGV4dHJhY3QgdGhlIGNvZGUKLWZyb20gdGhlIGV2ZW50IHN0cnVjdHVyZS4gTm90ZSB0aGF0IHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIHdpbGwgYmUgdGhlCi1zYW1lIGFjcm9zcyBhbGwga2V5Ym9hcmRzIChhc3N1bWluZyB0aGUgcGxhY2VtZW50IG9mIGtleXMgb24gYSAxMDEga2V5IFVTCi1rZXlib2FyZCksIGJ1dCB0aGUgdHJhbnNsYXRlZCBBU0NJSSB2YWx1ZXMgbWF5IGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24KLXRoZSBjb3VudHJ5IGNvZGUgcGFnZXMgaW4gdXNlLgotCi1OT1RFOiAgIFNjYW4gY29kZXMgaW4gdGhlIGV2ZW50IGxpYnJhcnkgYXJlIG5vdCByZWFsbHkgaGFyZHdhcmUgc2NhbiBjb2RlcywKLQlidXQgcmF0aGVyIHZpcnR1YWwgc2NhbiBjb2RlcyBhcyBnZW5lcmF0ZWQgYnkgYSBsb3cgbGV2ZWwga2V5Ym9hcmQKLQlpbnRlcmZhY2UgZHJpdmVyLiBBbGwgdmlydHVhbCBjb2RlcyBiZWdpbiB3aXRoIHNjYW4gY29kZSAweDYwIGFuZAotCXJhbmdlIHVwIGZyb20gdGhlcmUuCi0KLUhFQURFUjoKLWV2ZW50LmgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEtCX3BhZEVudGVyICAgICAgICAgICAgID0gMHg2MCwgLyogS2V5cGFkIGtleXMgKi8KLSAgICBLQl9wYWRNaW51cyAgICAgICAgICAgICA9IDB4NEEsCi0gICAgS0JfcGFkUGx1cyAgICAgICAgICAgICAgPSAweDRFLAotICAgIEtCX3BhZFRpbWVzICAgICAgICAgICAgID0gMHgzNywKLSAgICBLQl9wYWREaXZpZGUgICAgICAgICAgICA9IDB4NjEsCi0gICAgS0JfcGFkTGVmdCAgICAgICAgICAgICAgPSAweDYyLAotICAgIEtCX3BhZFJpZ2h0ICAgICAgICAgICAgID0gMHg2MywKLSAgICBLQl9wYWRVcCAgICAgICAgICAgICAgICA9IDB4NjQsCi0gICAgS0JfcGFkRG93biAgICAgICAgICAgICAgPSAweDY1LAotICAgIEtCX3BhZEluc2VydCAgICAgICAgICAgID0gMHg2NiwKLSAgICBLQl9wYWREZWxldGUgICAgICAgICAgICA9IDB4NjcsCi0gICAgS0JfcGFkSG9tZSAgICAgICAgICAgICAgPSAweDY4LAotICAgIEtCX3BhZEVuZCAgICAgICAgICAgICAgID0gMHg2OSwKLSAgICBLQl9wYWRQYWdlVXAgICAgICAgICAgICA9IDB4NkEsCi0gICAgS0JfcGFkUGFnZURvd24gICAgICAgICAgPSAweDZCLAotICAgIEtCX3BhZENlbnRlciAgICAgICAgICAgID0gMHg0QywKLSAgICBLQl9GMSAgICAgICAgICAgICAgICAgICA9IDB4M0IsIC8qIEZ1bmN0aW9uIGtleXMgKi8KLSAgICBLQl9GMiAgICAgICAgICAgICAgICAgICA9IDB4M0MsCi0gICAgS0JfRjMgICAgICAgICAgICAgICAgICAgPSAweDNELAotICAgIEtCX0Y0ICAgICAgICAgICAgICAgICAgID0gMHgzRSwKLSAgICBLQl9GNSAgICAgICAgICAgICAgICAgICA9IDB4M0YsCi0gICAgS0JfRjYgICAgICAgICAgICAgICAgICAgPSAweDQwLAotICAgIEtCX0Y3ICAgICAgICAgICAgICAgICAgID0gMHg0MSwKLSAgICBLQl9GOCAgICAgICAgICAgICAgICAgICA9IDB4NDIsCi0gICAgS0JfRjkgICAgICAgICAgICAgICAgICAgPSAweDQzLAotICAgIEtCX0YxMCAgICAgICAgICAgICAgICAgID0gMHg0NCwKLSAgICBLQl9GMTEgICAgICAgICAgICAgICAgICA9IDB4NTcsCi0gICAgS0JfRjEyICAgICAgICAgICAgICAgICAgPSAweDU4LAotICAgIEtCX2xlZnQgICAgICAgICAgICAgICAgID0gMHg0QiwgLyogQ3Vyc29yIGNvbnRyb2wga2V5cyAqLwotICAgIEtCX3JpZ2h0ICAgICAgICAgICAgICAgID0gMHg0RCwKLSAgICBLQl91cCAgICAgICAgICAgICAgICAgICA9IDB4NDgsCi0gICAgS0JfZG93biAgICAgICAgICAgICAgICAgPSAweDUwLAotICAgIEtCX2luc2VydCAgICAgICAgICAgICAgID0gMHg1MiwKLSAgICBLQl9kZWxldGUgICAgICAgICAgICAgICA9IDB4NTMsCi0gICAgS0JfaG9tZSAgICAgICAgICAgICAgICAgPSAweDQ3LAotICAgIEtCX2VuZCAgICAgICAgICAgICAgICAgID0gMHg0RiwKLSAgICBLQl9wYWdlVXAgICAgICAgICAgICAgICA9IDB4NDksCi0gICAgS0JfcGFnZURvd24gICAgICAgICAgICAgPSAweDUxLAotICAgIEtCX2NhcHNMb2NrICAgICAgICAgICAgID0gMHgzQSwKLSAgICBLQl9udW1Mb2NrICAgICAgICAgICAgICA9IDB4NDUsCi0gICAgS0Jfc2Nyb2xsTG9jayAgICAgICAgICAgPSAweDQ2LAotICAgIEtCX2xlZnRTaGlmdCAgICAgICAgICAgID0gMHgyQSwKLSAgICBLQl9yaWdodFNoaWZ0ICAgICAgICAgICA9IDB4MzYsCi0gICAgS0JfbGVmdEN0cmwgICAgICAgICAgICAgPSAweDFELAotICAgIEtCX3JpZ2h0Q3RybCAgICAgICAgICAgID0gMHg2QywKLSAgICBLQl9sZWZ0QWx0ICAgICAgICAgICAgICA9IDB4MzgsCi0gICAgS0JfcmlnaHRBbHQgICAgICAgICAgICAgPSAweDZELAotICAgIEtCX2xlZnRXaW5kb3dzICAgICAgICAgID0gMHg1QiwKLSAgICBLQl9yaWdodFdpbmRvd3MgICAgICAgICA9IDB4NUMsCi0gICAgS0JfbWVudSAgICAgICAgICAgICAgICAgPSAweDVELAotICAgIEtCX3N5c1JlcSAgICAgICAgICAgICAgID0gMHg1NCwKLSAgICBLQl9lc2MgICAgICAgICAgICAgICAgICA9IDB4MDEsIC8qIE5vcm1hbCBrZXlib2FyZCBrZXlzICovCi0gICAgS0JfMSAgICAgICAgICAgICAgICAgICAgPSAweDAyLAotICAgIEtCXzIgICAgICAgICAgICAgICAgICAgID0gMHgwMywKLSAgICBLQl8zICAgICAgICAgICAgICAgICAgICA9IDB4MDQsCi0gICAgS0JfNCAgICAgICAgICAgICAgICAgICAgPSAweDA1LAotICAgIEtCXzUgICAgICAgICAgICAgICAgICAgID0gMHgwNiwKLSAgICBLQl82ICAgICAgICAgICAgICAgICAgICA9IDB4MDcsCi0gICAgS0JfNyAgICAgICAgICAgICAgICAgICAgPSAweDA4LAotICAgIEtCXzggICAgICAgICAgICAgICAgICAgID0gMHgwOSwKLSAgICBLQl85ICAgICAgICAgICAgICAgICAgICA9IDB4MEEsCi0gICAgS0JfMCAgICAgICAgICAgICAgICAgICAgPSAweDBCLAotICAgIEtCX21pbnVzICAgICAgICAgICAgICAgID0gMHgwQywKLSAgICBLQl9lcXVhbHMgICAgICAgICAgICAgICA9IDB4MEQsCi0gICAgS0JfYmFja1NsYXNoICAgICAgICAgICAgPSAweDJCLAotICAgIEtCX2JhY2tzcGFjZSAgICAgICAgICAgID0gMHgwRSwKLSAgICBLQl90YWIgICAgICAgICAgICAgICAgICA9IDB4MEYsCi0gICAgS0JfUSAgICAgICAgICAgICAgICAgICAgPSAweDEwLAotICAgIEtCX1cgICAgICAgICAgICAgICAgICAgID0gMHgxMSwKLSAgICBLQl9FICAgICAgICAgICAgICAgICAgICA9IDB4MTIsCi0gICAgS0JfUiAgICAgICAgICAgICAgICAgICAgPSAweDEzLAotICAgIEtCX1QgICAgICAgICAgICAgICAgICAgID0gMHgxNCwKLSAgICBLQl9ZICAgICAgICAgICAgICAgICAgICA9IDB4MTUsCi0gICAgS0JfVSAgICAgICAgICAgICAgICAgICAgPSAweDE2LAotICAgIEtCX0kgICAgICAgICAgICAgICAgICAgID0gMHgxNywKLSAgICBLQl9PICAgICAgICAgICAgICAgICAgICA9IDB4MTgsCi0gICAgS0JfUCAgICAgICAgICAgICAgICAgICAgPSAweDE5LAotICAgIEtCX2xlZnRTcXVhcmVCcmFjZSAgICAgID0gMHgxQSwKLSAgICBLQl9yaWdodFNxdWFyZUJyYWNlICAgICA9IDB4MUIsCi0gICAgS0JfZW50ZXIgICAgICAgICAgICAgICAgPSAweDFDLAotICAgIEtCX0EgICAgICAgICAgICAgICAgICAgID0gMHgxRSwKLSAgICBLQl9TICAgICAgICAgICAgICAgICAgICA9IDB4MUYsCi0gICAgS0JfRCAgICAgICAgICAgICAgICAgICAgPSAweDIwLAotICAgIEtCX0YgICAgICAgICAgICAgICAgICAgID0gMHgyMSwKLSAgICBLQl9HICAgICAgICAgICAgICAgICAgICA9IDB4MjIsCi0gICAgS0JfSCAgICAgICAgICAgICAgICAgICAgPSAweDIzLAotICAgIEtCX0ogICAgICAgICAgICAgICAgICAgID0gMHgyNCwKLSAgICBLQl9LICAgICAgICAgICAgICAgICAgICA9IDB4MjUsCi0gICAgS0JfTCAgICAgICAgICAgICAgICAgICAgPSAweDI2LAotICAgIEtCX3NlbWljb2xvbiAgICAgICAgICAgID0gMHgyNywKLSAgICBLQl9hcG9zdHJvcGhlICAgICAgICAgICA9IDB4MjgsCi0gICAgS0JfWiAgICAgICAgICAgICAgICAgICAgPSAweDJDLAotICAgIEtCX1ggICAgICAgICAgICAgICAgICAgID0gMHgyRCwKLSAgICBLQl9DICAgICAgICAgICAgICAgICAgICA9IDB4MkUsCi0gICAgS0JfViAgICAgICAgICAgICAgICAgICAgPSAweDJGLAotICAgIEtCX0IgICAgICAgICAgICAgICAgICAgID0gMHgzMCwKLSAgICBLQl9OICAgICAgICAgICAgICAgICAgICA9IDB4MzEsCi0gICAgS0JfTSAgICAgICAgICAgICAgICAgICAgPSAweDMyLAotICAgIEtCX2NvbW1hICAgICAgICAgICAgICAgID0gMHgzMywKLSAgICBLQl9wZXJpb2QgICAgICAgICAgICAgICA9IDB4MzQsCi0gICAgS0JfZGl2aWRlICAgICAgICAgICAgICAgPSAweDM1LAotICAgIEtCX3NwYWNlICAgICAgICAgICAgICAgID0gMHgzOSwKLSAgICBLQl90aWxkZSAgICAgICAgICAgICAgICA9IDB4MjkKLSAgICB9IEVWVF9zY2FuQ29kZXNUeXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZXMgdGhlIG1hc2sgZm9yIHRoZSBqb3lzdGljayBheGVzIHRoYXQgYXJlIHByZXNlbnQKLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0pPWV9BWElTX1gxICAgICAtIEpveXN0aWNrIDEsIFggYXhpcyBpcyBwcmVzZW50Ci1FVlRfSk9ZX0FYSVNfWTEgICAgIC0gSm95c3RpY2sgMSwgWSBheGlzIGlzIHByZXNlbnQKLUVWVF9KT1lfQVhJU19YMiAgICAgLSBKb3lzdGljayAyLCBYIGF4aXMgaXMgcHJlc2VudAotRVZUX0pPWV9BWElTX1kyICAgICAtIEpveXN0aWNrIDIsIFkgYXhpcyBpcyBwcmVzZW50Ci1FVlRfSk9ZX0FYSVNfQUxMICAgIC0gTWFzayBmb3IgYWxsIGF4ZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9KT1lfQVhJU19YMSAgICAgPSAweDAwMDAwMDAxLAotICAgIEVWVF9KT1lfQVhJU19ZMSAgICAgPSAweDAwMDAwMDAyLAotICAgIEVWVF9KT1lfQVhJU19YMiAgICAgPSAweDAwMDAwMDA0LAotICAgIEVWVF9KT1lfQVhJU19ZMiAgICAgPSAweDAwMDAwMDA4LAotICAgIEVWVF9KT1lfQVhJU19BTEwgICAgPSAweDAwMDAwMDBGCi0gICAgfSBFVlRfZXZlbnRKb3lBeGlzVHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBldmVudCBtZXNzYWdlIG1hc2tzIGZvciBqb3lzdGljayBldmVudHMKLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0pPWTFfQlVUVE9OQSAgICAtIEpveXN0aWNrIDEsIGJ1dHRvbiBBIGlzIGRvd24KLUVWVF9KT1kxX0JVVFRPTkIgICAgLSBKb3lzdGljayAxLCBidXR0b24gQiBpcyBkb3duCi1FVlRfSk9ZMl9CVVRUT05BICAgIC0gSm95c3RpY2sgMiwgYnV0dG9uIEEgaXMgZG93bgotRVZUX0pPWTJfQlVUVE9OQiAgICAtIEpveXN0aWNrIDIsIGJ1dHRvbiBCIGlzIGRvd24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9KT1kxX0JVVFRPTkEgICAgPSAweDAwMDAwMDAxLAotICAgIEVWVF9KT1kxX0JVVFRPTkIgICAgPSAweDAwMDAwMDAyLAotICAgIEVWVF9KT1kyX0JVVFRPTkEgICAgPSAweDAwMDAwMDA0LAotICAgIEVWVF9KT1kyX0JVVFRPTkIgICAgPSAweDAwMDAwMDA4Ci0gICAgfSBFVlRfZXZlbnRKb3lNYXNrVHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBldmVudCBtZXNzYWdlIG1hc2tzIGZvciBtb3VzZSBldmVudHMKLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0xFRlRCTUFTSyAgIC0gTGVmdCBidXR0b24gaXMgaGVsZCBkb3duCi1FVlRfUklHSFRCTUFTSyAgLSBSaWdodCBidXR0b24gaXMgaGVsZCBkb3duCi1FVlRfTUlERExFQk1BU0sgLSBNaWRkbGUgYnV0dG9uIGlzIGhlbGQgZG93bgotRVZUX0JPVEhCTUFTSyAgIC0gQm90aCBsZWZ0IGFuZCByaWdodCBoZWxkIGRvd24gdG9nZXRoZXIKLUVWVF9BTExCTUFTSyAgICAtIEFsbCBidXR0b25zIHByZXNzZWQKLUVWVF9EQkxDTElDSyAgICAtIFNldCBpZiBtb3VzZSBkb3duIGV2ZW50IHdhcyBhIGRvdWJsZSBjbGljawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgRVZUX0xFRlRCTUFTSyAgID0gMHgwMDAwMDAwMSwKLSAgICBFVlRfUklHSFRCTUFTSyAgPSAweDAwMDAwMDAyLAotICAgIEVWVF9NSURETEVCTUFTSyA9IDB4MDAwMDAwMDQsCi0gICAgRVZUX0JPVEhCTUFTSyAgID0gMHgwMDAwMDAwNywKLSAgICBFVlRfQUxMQk1BU0sgICAgPSAweDAwMDAwMDA3LAotICAgIEVWVF9EQkxDTElDSyAgICA9IDB4MDAwMTAwMDAKLSAgICB9IEVWVF9ldmVudE1vdXNlTWFza1R5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lcyB0aGUgZXZlbnQgbW9kaWZpZXIgbWFza3MuIFRoZXNlIGFyZSB0aGUgbWFza3MgdXNlZCB0byBleHRyYWN0Ci10aGUgbW9kaWZpZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgbW9kaWZpZXJzIGZpZWxkIG9mIHRoZSBldmVudF90IHN0cnVjdHVyZS4KLU5vdGUgdGhhdCB0aGUgdmFsdWVzIGluIHRoZSBtb2RpZmllcnMgZmllbGQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlc2UKLW1vZGlmaWVyIGtleXMgYXQgdGhlIHRpbWUgdGhlIGV2ZW50IG9jY3VycmVkLCBub3QgdGhlIHRpbWUgeW91IGRlY2lkZWQKLXRvIHByb2Nlc3MgdGhlIGV2ZW50LgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLU1FTUJFUlM6Ci1FVlRfTEVGVEJVVCAgICAgLSBTZXQgaWYgbGVmdCBtb3VzZSBidXR0b24gd2FzIGRvd24KLUVWVF9SSUdIVEJVVCAgICAtIFNldCBpZiByaWdodCBtb3VzZSBidXR0b24gd2FzIGRvd24KLUVWVF9NSURETEVCVVQgICAtIFNldCBpZiB0aGUgbWlkZGxlIGJ1dHRvbiB3YXMgZG93bgotRVZUX1JJR0hUU0hJRlQgIC0gU2V0IGlmIHJpZ2h0IHNoaWZ0IHdhcyBkb3duCi1FVlRfTEVGVFNISUZUICAgLSBTZXQgaWYgbGVmdCBzaGlmdCB3YXMgZG93bgotRVZUX1JJR0hUQ1RSTCAgIC0gU2V0IGlmIHJpZ2h0IGN0cmwga2V5IHdhcyBkb3duCi1FVlRfUklHSFRBTFQgICAgLSBTZXQgaWYgcmlnaHQgYWx0IGtleSB3YXMgZG93bgotRVZUX0xFRlRDVFJMICAgIC0gU2V0IGlmIGxlZnQgY3RybCBrZXkgd2FzIGRvd24KLUVWVF9MRUZUQUxUICAgICAtIFNldCBpZiBsZWZ0IGFsdCBrZXkgd2FzIGRvd24KLUVWVF9TSElGVEtFWSAgICAtIE1hc2sgZm9yIGFueSBzaGlmdCBrZXkgZG93bgotRVZUX0NUUkxTVEFURSAgIC0gU2V0IGlmIGN0cmwga2V5IHdhcyBkb3duCi1FVlRfQUxUU1RBVEUgICAgLSBTZXQgaWYgYWx0IGtleSB3YXMgZG93bgotRVZUX0NBUFNMT0NLICAgIC0gQ2FwcyBsb2NrIGlzIGFjdGl2ZQotRVZUX05VTUxPQ0sgICAgIC0gTnVtIGxvY2sgaXMgYWN0aXZlCi1FVlRfU0NST0xMTE9DSyAgLSBTY3JvbGwgbG9jayBpcyBhY3RpdmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9MRUZUQlVUICAgICA9IDB4MDAwMDAwMDEsCi0gICAgRVZUX1JJR0hUQlVUICAgID0gMHgwMDAwMDAwMiwKLSAgICBFVlRfTUlERExFQlVUICAgPSAweDAwMDAwMDA0LAotICAgIEVWVF9SSUdIVFNISUZUICA9IDB4MDAwMDAwMDgsCi0gICAgRVZUX0xFRlRTSElGVCAgID0gMHgwMDAwMDAxMCwKLSAgICBFVlRfUklHSFRDVFJMICAgPSAweDAwMDAwMDIwLAotICAgIEVWVF9SSUdIVEFMVCAgICA9IDB4MDAwMDAwNDAsCi0gICAgRVZUX0xFRlRDVFJMICAgID0gMHgwMDAwMDA4MCwKLSAgICBFVlRfTEVGVEFMVCAgICAgPSAweDAwMDAwMTAwLAotICAgIEVWVF9TSElGVEtFWSAgICA9IDB4MDAwMDAwMTgsCi0gICAgRVZUX0NUUkxTVEFURSAgID0gMHgwMDAwMDBBMCwKLSAgICBFVlRfQUxUU1RBVEUgICAgPSAweDAwMDAwMTQwLAotICAgIEVWVF9TQ1JPTExMT0NLICA9IDB4MDAwMDAyMDAsCi0gICAgRVZUX05VTUxPQ0sgICAgID0gMHgwMDAwMDQwMCwKLSAgICBFVlRfQ0FQU0xPQ0sgICAgPSAweDAwMDAwODAwCi0gICAgfSBFVlRfZXZlbnRNb2RNYXNrVHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBldmVudCBjb2RlcyByZXR1cm5lZCBpbiB0aGUgZXZlbnRfdCBzdHJ1Y3R1cmVzIHdoYXQgZmllbGQuIE5vdGUKLXRoYXQgdGhlc2UgYXJlIGRlZmluZWQgYXMgYSBzZXQgb2YgbXV0dWFsbHkgZXhsdXNpdmUgYml0IGZpZWxkcywgc28geW91Ci1jYW4gdGVzdCBmb3IgbXVsdGlwbGUgZXZlbnQgdHlwZXMgdXNpbmcgdGhlIGNvbWJpbmVkIGV2ZW50IG1hc2tzIGRlZmluZWQKLWluIHRoZSBFVlRfZXZlbnRNYXNrVHlwZSBlbnVtZXJhdGlvbi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX05VTExFVlQgICAgIC0gQSBudWxsIGV2ZW50Ci1FVlRfS0VZRE9XTiAgICAgLSBLZXkgZG93biBldmVudAotRVZUX0tFWVJFUEVBVCAgIC0gS2V5IHJlcGVhdCBldmVudAotRVZUX0tFWVVQICAgICAgIC0gS2V5IHVwIGV2ZW50Ci1FVlRfTU9VU0VET1dOICAgLSBNb3VzZSBkb3duIGV2ZW50Ci1FVlRfTU9VU0VBVVRPICAgLSBNb3VzZSBkb3duIGF1dG9yZXBlYXQgZXZlbnQKLUVWVF9NT1VTRVVQICAgICAtIE1vdXNlIHVwIGV2ZW50Ci1FVlRfTU9VU0VNT1ZFICAgLSBNb3VzZSBtb3ZlbWVudCBldmVudAotRVZUX0pPWUNMSUNLICAgIC0gSm95c3RpY2sgYnV0dG9uIHN0YXRlIGNoYW5nZSBldmVudAotRVZUX0pPWU1PVkUgICAgIC0gSm95c3RpY2sgbW92ZW1lbnQgZXZlbnQKLUVWVF9VU0VSRVZUICAgICAtIEZpcnN0IHVzZXIgZXZlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9OVUxMRVZUICAgICA9IDB4MDAwMDAwMDAsCi0gICAgRVZUX0tFWURPV04gICAgID0gMHgwMDAwMDAwMSwKLSAgICBFVlRfS0VZUkVQRUFUICAgPSAweDAwMDAwMDAyLAotICAgIEVWVF9LRVlVUCAgICAgICA9IDB4MDAwMDAwMDQsCi0gICAgRVZUX01PVVNFRE9XTiAgID0gMHgwMDAwMDAwOCwKLSAgICBFVlRfTU9VU0VBVVRPICAgPSAweDAwMDAwMDEwLAotICAgIEVWVF9NT1VTRVVQICAgICA9IDB4MDAwMDAwMjAsCi0gICAgRVZUX01PVVNFTU9WRSAgID0gMHgwMDAwMDA0MCwKLSAgICBFVlRfSk9ZQ0xJQ0sgICAgPSAweDAwMDAwMDgwLAotICAgIEVWVF9KT1lNT1ZFICAgICA9IDB4MDAwMDAxMDAsCi0gICAgRVZUX1VTRVJFVlQgICAgID0gMHgwMDAwMDIwMAotICAgIH0gRVZUX2V2ZW50VHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBldmVudCBjb2RlIG1hc2tzIHlvdSBjYW4gdXNlIHRvIHRlc3QgZm9yIG11bHRpcGxlIHR5cGVzIG9mCi1ldmVudHMsIHNpbmNlIHRoZSBldmVudCBjb2RlcyBhcmUgbXV0dWFsbHkgZXhsdXNpdmUgYml0IGZpZWxkcy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0tFWUVWVCAgICAgIC0gTWFzayBmb3IgYW55IGtleSBldmVudAotRVZUX01PVVNFRVZUICAgIC0gTWFzayBmb3IgYW55IG1vdXNlIGV2ZW50Ci1FVlRfTU9VU0VDTElDSyAgLSBNYXNrIGZvciBhbnkgbW91c2UgY2xpY2sgZXZlbnQKLUVWVF9KT1lFVlQgICAgICAtIE1hc2sgZm9yIGFueSBqb3lzdGljayBldmVudAotRVZUX0VWRVJZRVZUICAgIC0gTWFzayBmb3IgYW55IGV2ZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBFVlRfS0VZRVZUICAgICAgPSAoRVZUX0tFWURPV04gfCBFVlRfS0VZUkVQRUFUIHwgRVZUX0tFWVVQKSwKLSAgICBFVlRfTU9VU0VFVlQgICAgPSAoRVZUX01PVVNFRE9XTiB8IEVWVF9NT1VTRUFVVE8gfCBFVlRfTU9VU0VVUCB8IEVWVF9NT1VTRU1PVkUpLAotICAgIEVWVF9NT1VTRUNMSUNLICA9IChFVlRfTU9VU0VET1dOIHwgRVZUX01PVVNFVVApLAotICAgIEVWVF9KT1lFVlQgICAgICA9IChFVlRfSk9ZQ0xJQ0sgfCBFVlRfSk9ZTU9WRSksCi0gICAgRVZUX0VWRVJZRVZUICAgID0gMHg3RkZGRkZGRgotICAgIH0gRVZUX2V2ZW50TWFza1R5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhbiBldmVudCBleHRyYWN0ZWQgZnJvbQotdGhlIGV2ZW50IHF1ZXVlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLU1FTUJFUlM6Ci13aGljaCAgICAgICAtIFdpbmRvdyBpZGVudGlmaWVyIGZvciBtZXNzYWdlIGZvciB1c2UgYnkgaGlnaCBsZXZlbCB3aW5kb3cgbWFuYWdlcgotCSAgICAgIGNvZGUgKGkuZS4gTWVnYVZpc2lvbiBHVUkgb3IgV2luZG93cyBBUEkpLgotd2hhdCAgICAgICAgLSBUeXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuIFdpbGwgYmUgb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBieQotCSAgICAgIHRoZSBFVlRfZXZlbnRUeXBlIGVudW1lcmF0aW9uLgotd2hlbiAgICAgICAgLSBUaW1lIHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBzdGFydHVwCi13aGVyZV94ICAgICAtIFggY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgY3Vyc29yIGxvY2F0aW9uIGF0IHRoZSB0aW1lIG9mIHRoZSBldmVudAotCSAgICAgIChpbiBzY3JlZW4gY29vcmRpbmF0ZXMpLiBGb3Igam95c3RpY2sgZXZlbnRzIHRoaXMgcmVwcmVzZW50cwotCSAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgam95c3RpY2sgWCBheGlzLgotd2hlcmVfeSAgICAgLSBZIGNvb3JkaW5hdGUgb2YgdGhlIG1vdXNlIGN1cnNvciBsb2NhdGlvbiBhdCB0aGUgdGltZSBvZiB0aGUgZXZlbnQKLQkgICAgICAoaW4gc2NyZWVuIGNvb3JkaW5hdGVzKS4gRm9yIGpveXN0aWNrIGV2ZW50cyB0aGlzIHJlcHJlc2VudHMKLQkgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGpveXN0aWNrIFkgYXhpcy4KLXJlbGF0aXZlX3ggIC0gUmVsYXRpdmUgbW92ZW1lbnQgb2YgdGhlIG1vdXNlIGN1cnNvciBpbiB0aGUgWCBkaXJlY3Rpb24gKGluCi0JICAgICAgdW5pdHMgb2YgbWlja2V5cywgb3IgMS8yMDB0aCBvZiBhbiBpbmNoKS4gRm9yIGpveXN0aWNrIGV2ZW50cwotCSAgICAgIHRoaXMgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhlIHNlY29uZCBqb3lzdGljayBYIGF4aXMuCi1yZWxhdGl2ZV95ICAtIFJlbGF0aXZlIG1vdmVtZW50IG9mIHRoZSBtb3VzZSBjdXJzb3IgaW4gdGhlIFkgZGlyZWN0aW9uIChpbgotCSAgICAgIHVuaXRzIG9mIG1pY2tleXMsIG9yIDEvMjAwdGggb2YgYW4gaW5jaCkuIEZvciBqb3lzdGljayBldmVudHMKLQkgICAgICB0aGlzIHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQgam95c3RpY2sgWSBheGlzLgotbWVzc2FnZSAgICAgLSBFdmVudCBzcGVjaWZpYyBtZXNzYWdlIGZvciB0aGUgZXZlbnQuIEZvciB1c2UgZXZlbnRzIHRoaXMgY2FuIGJlCi0JICAgICAgYW55IHVzZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24uIEZvciBrZXlib2FyZCBldmVudHMgdGhpcyBjb250YWlucwotCSAgICAgIHRoZSBBU0NJSSBjb2RlIGluIGJpdHMgMC03LCB0aGUga2V5Ym9hcmQgc2NhbiBjb2RlIGluIGJpdHMgOC0xNSBhbmQKLQkgICAgICB0aGUgY2hhcmFjdGVyIHJlcGVhdCBjb3VudCBpbiBiaXRzIDE2LTMwLiBZb3UgY2FuIHVzZSB0aGUKLQkgICAgICBFVlRfYXNjaWlDb2RlLCBFVlRfc2NhbkNvZGUgYW5kIEVWVF9yZXBlYXRDb3VudCBtYWNyb3MgdG8gZXh0cmFjdAotCSAgICAgIHRoaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWVzc2FnZSBmaWVsZC4gRm9yIG1vdXNlIGV2ZW50cyB0aGlzCi0JICAgICAgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggYnV0dG9uIHdhcyBwcmVzc2VkLCBhbmQgd2lsbCBiZSBhCi0JICAgICAgY29tYmluYXRpb24gb2YgdGhlIGZsYWdzIGRlZmluZWQgYnkgdGhlIEVWVF9ldmVudE1vdXNlTWFza1R5cGUKLQkgICAgICBlbnVtZXJhdGlvbi4gRm9yIGpveXN0aWNrIGV2ZW50cywgdGhpcyBjb25hdGlucyBpbmZvcm1hdGlvbgotCSAgICAgIGFib3V0IHdoaWNoIGJ1dHRvbnMgd2VyZSBwcmVzc2VkLCBhbmQgd2lsbCBiZSBhIGNvbWJpbmF0aW9uIG9mCi0JICAgICAgdGhlIGZsYWdzIGRlZmluZWQgYnkgdGhlIEVWVF9ldmVudEpveU1hc2tUeXBlIGVudW1lcmF0aW9uLgotbW9kaWZpZXJzICAgLSBDb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQKLQkgICAgICBzaGlmdCBtb2RpZmllcnMgKEN0cmwsIEFsdCBhbmQgU2hpZnQga2V5cykgd2hlbiB0aGUgZXZlbnQKLQkgICAgICBvY2N1cnJlZC4gRm9yIG1vdXNlIGV2ZW50cyBpdCB3aWxsIGFsc28gY29udGFpbiB0aGUgc3RhdGUgb2YKLQkgICAgICB0aGUgbW91c2UgYnV0dG9ucy4gV2lsbCBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZAotCSAgICAgIGJ5IHRoZSBFVlRfZXZlbnRNb2RNYXNrVHlwZSBlbnVtZXJhdGlvbi4KLW5leHQgICAgICAgIC0gSW50ZXJuYWwgdXNlOyBkbyBub3QgdXNlLgotcHJldiAgICAgICAgLSBJbnRlcm5hbCB1c2U7IGRvIG5vdCB1c2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgICAgIHdoaWNoOwotICAgIHVsb25nICAgICAgIHdoYXQ7Ci0gICAgdWxvbmcgICAgICAgd2hlbjsKLSAgICBpbnQgICAgICAgICB3aGVyZV94OwotICAgIGludCAgICAgICAgIHdoZXJlX3k7Ci0gICAgaW50ICAgICAgICAgcmVsYXRpdmVfeDsKLSAgICBpbnQgICAgICAgICByZWxhdGl2ZV95OwotICAgIHVsb25nICAgICAgIG1lc3NhZ2U7Ci0gICAgdWxvbmcgICAgICAgbW9kaWZpZXJzOwotICAgIGludCAgICAgICAgIG5leHQ7Ci0gICAgaW50ICAgICAgICAgcHJldjsKLSAgICB9IGV2ZW50X3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gZW50cnkgaW4gdGhlIGNvZGUgcGFnZSB0YWJsZS4gQSB0YWJsZSBvZiB0cmFuc2xhdGlvbgotY29kZXMgZm9yIHNjYW4gY29kZXMgdG8gQVNDSUkgY29kZXMgaXMgcHJvdmlkZWQgaW4gdGhpcyB0YWJsZSB0byBiZSB1c2VkCi1ieSB0aGUga2V5Ym9hcmQgZXZlbnQgbGlicmFyaWVzLiBPbiBzb21lIE9TJ2VzIHRoZSBrZXlib2FyZCB0cmFuc2xhdGlvbiBpcwotaGFuZGxlZCBieSB0aGUgT1MsIGJ1dCBmb3IgRE9TIGFuZCBlbWJlZGRlZCBzeXN0ZW1zIHlvdSBtdXN0IHJlZ2lzdGVyIGEKLWRpZmZlcmVudCBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBrZXlib2FyZHMKLW90aGVyIHRoYW4gdGhlIFVTIEVuZ2xpc2gga2V5Ym9hcmQgKHRoZSBkZWZhdWx0KS4KLQotTk9URTogICBFbnRyaWVzIGluIGNvZGUgcGFnZSB0YWJsZXMgKm11c3QqIGJlIGluIGFzY2VuZGluZyBvcmRlciBmb3IgdGhlCi0Jc2NhbiBjb2RlcyBhcyB3ZSBkbyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIHRhYmxlcyBmb3IgdGhlIEFTQ0lJCi0JY29kZSBlcXVpdmFsZW50cy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdHJhbnNsYXRlIChyZWFsbHkgdGhlIHZpcnR1YWwgc2NhbiBjb2RlKS4KLWFzY2lpQ29kZSAgIC0gQVNDSUkgY29kZSBmb3IgdGhpcyBzY2FuIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVjaGFyICAgICAgIHNjYW5Db2RlOwotICAgIHVjaGFyICAgICAgIGFzY2lpQ29kZTsKLSAgICB9IGNvZGVwYWdlX2VudHJ5X3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUuIFRoZSB0YWJsZQotY29udGFpbnMgdHJhbnNsYXRpb24gdGFibGVzIGZvciBub3JtYWwga2V5cywgc2hpZnRlZCBrZXlzIGFuZCBjdHJsIGtleXMuCi1UaGUgQ3RybCBrZXkgYWx3YXlzIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIHNoaWZ0IHRhYmxlLCBhbmQgdGhlIHNoaWZ0Ci10YWJsZSBpcyB1c2VkIHdoZW4gdGhlIHNoaWZ0IGtleSBpcyBkb3duIG9yIHRoZSBDQVBTTE9DSyBrZXkgaXMgZG93bi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY29kZSBwYWdlIHRhYmxlIChpZTogIlVTIEVuZ2xpc2giKQotbm9ybWFsICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciB0cmFuc2xhdGluZyBub3JtYWwga2V5cwotbm9ybWFsTGVuICAgICAgIC0gTGVuZ3RoIG9mIG5vcm1hbCB0cmFuc2xhdGlvbiB0YWJsZQotY2FwcyAgICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciB0cmFuc2xhdGluZyBrZXlzIHdoZW4gQ0FQU0xPQ0sgaXMgZG93bgotY2Fwc0xlbiAgICAgICAgIC0gTGVuZ3RoIG9mIENBUFNMT0NLIHRyYW5zbGF0aW9uIHRhYmxlCi1zaGlmdCAgICAgICAgICAgLSBDb2RlIHBhZ2UgZm9yIHNoaWZ0ZWQga2V5cyAoaWU6IHNoaWZ0IGtleSBpcyBoZWxkIGRvd24pCi1zaGlmdExlbiAgICAgICAgLSBMZW5ndGggb2Ygc2hpZnRlZCB0cmFuc2xhdGlvbiB0YWJsZQotc2hpZnRDYXBzICAgICAgIC0gQ29kZSBwYWdlIGZvciBzaGlmdGVkIGtleXMgd2hlbiBDQVBTTE9DSyBpcyBkb3duCi1zaGlmdENhcHNMZW4gICAgLSBMZW5ndGggb2Ygc2hpZnRlZCBDQVBTTE9DSyB0cmFuc2xhdGlvbiB0YWJsZQotY3RybCAgICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciBjdHJsJ2VkIGtleXMgKGllOiBjdHJsIGtleSBpcyBoZWxkIGRvd24pCi1jdHJsTGVuICAgICAgICAgLSBMZW5ndGggb2YgY3RybCdlZCB0cmFuc2xhdGlvbiB0YWJsZQotbnVtUGFkICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciBOVU1MT0NLJ2VkIGtleXBhZCBrZXlzCi1udW1QYWRMZW4gICAgICAgLSBMZW5ndGggb2YgTlVNTE9DSydlZCB0cmFuc2xhdGlvbiB0YWJsZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICAgICAgICAgICAgICAgIG5hbWVbMjBdOwotICAgIGNvZGVwYWdlX2VudHJ5X3QgICAgKm5vcm1hbDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG5vcm1hbExlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpjYXBzOwotICAgIGludCAgICAgICAgICAgICAgICAgY2Fwc0xlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpzaGlmdDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHNoaWZ0TGVuOwotICAgIGNvZGVwYWdlX2VudHJ5X3QgICAgKnNoaWZ0Q2FwczsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHNoaWZ0Q2Fwc0xlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpjdHJsOwotICAgIGludCAgICAgICAgICAgICAgICAgY3RybExlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpudW1QYWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBudW1QYWRMZW47Ci0gICAgfSBjb2RlcGFnZV90OwotCi0vKiB7c2VjcmV0fSAqLwotdHlwZWRlZiBpYm9vbCAoRVZUQVBJUCBfRVZUX3VzZXJFdmVudEZpbHRlcikoZXZlbnRfdCAqZXZ0KTsKLS8qIHtzZWNyZXR9ICovCi10eXBlZGVmIHZvaWQgKEVWVEFQSVAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyKShpbnQgeCxpbnQgeSk7Ci0vKiB7c2VjcmV0fSAqLwotdHlwZWRlZiB2b2lkIChFVlRBUElQIF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2spKHZvaWQgKnBhcmFtcyk7Ci0KLS8qIE1hY3JvIHRvIGZpbmQgdGhlIHNpemUgb2YgYSBzdGF0aWMgYXJyYXkgKi8KLQotI2RlZmluZSBFVlRfQVJSX1NJWkUoYSkgICAgICAgICAoc2l6ZW9mKGEpL3NpemVvZigoYSlbMF0pKQotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIFN0YW5kYXJkIGNvZGUgcGFnZSB0YWJsZXMgKi8KLQotZXh0ZXJuIGNvZGVwYWdlX3QgX0NQX1VTX0VuZ2xpc2g7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFB1YmxpYyBBUEkgZnVuY3Rpb25zIGZvciB1c2VyIGFwcGxpY2F0aW9ucyAqLwotCi1pYm9vbCAgIEVWVEFQSSBFVlRfZ2V0TmV4dChldmVudF90ICpldnQsdWxvbmcgbWFzayk7Ci1pYm9vbCAgIEVWVEFQSSBFVlRfcGVla05leHQoZXZlbnRfdCAqZXZ0LHVsb25nIG1hc2spOwotaWJvb2wgICBFVlRBUEkgRVZUX3Bvc3QodWxvbmcgd2hpY2gsdWxvbmcgd2hhdCx1bG9uZyBtZXNzYWdlLHVsb25nIG1vZGlmaWVycyk7Ci12b2lkICAgIEVWVEFQSSBFVlRfZmx1c2godWxvbmcgbWFzayk7Ci12b2lkICAgIEVWVEFQSSBFVlRfaGFsdChldmVudF90ICpldnQsdWxvbmcgbWFzayk7Ci1pYm9vbCAgIEVWVEFQSSBFVlRfaXNLZXlEb3duKHVjaGFyIHNjYW5Db2RlKTsKLXZvaWQgICAgRVZUQVBJIEVWVF9zZXRNb3VzZVBvcyhpbnQgeCxpbnQgeSk7Ci12b2lkICAgIEVWVEFQSSBFVlRfZ2V0TW91c2VQb3MoaW50ICp4LGludCAqeSk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGVuYWJsZS9kaXNhYmxlIHVwZGF0aW5nIG9mIGtleWJvYXJkIExFRCBzdGF0dXMgaW5kaWNhdG9ycyAqLwotCi12b2lkICAgIEVWVEFQSSBFVlRfYWxsb3dMRURTKGlib29sIGVuYWJsZSk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGluc3RhbGwgYSBjdXN0b20ga2V5Ym9hcmQgY29kZSBwYWdlLiBEZWZhdWx0IGlzIFVTIEVuZ2xpc2ggKi8KLQotY29kZXBhZ2VfdCAqRVZUQVBJIEVWVF9nZXRDb2RlUGFnZSh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIEVWVF9zZXRDb2RlUGFnZShjb2RlcGFnZV90ICpwYWdlKTsKLQotLyogRnVuY3Rpb25zIGZvciBmaW5lIGdyYWluZWQgam95c3RpY2sgY2FsaWJyYXRpb24gKi8KLQotdm9pZCAgICBFVlRBUEkgRVZUX3BvbGxKb3lzdGljayh2b2lkKTsKLWludCAgICAgRVZUQVBJIEVWVF9qb3lJc1ByZXNlbnQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBFVlRfam95U2V0VXBwZXJMZWZ0KHZvaWQpOwotdm9pZCAgICBFVlRBUEkgRVZUX2pveVNldExvd2VyUmlnaHQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBFVlRfam95U2V0Q2VudGVyKHZvaWQpOwotCi0vKiBJbnN0YWxsIHVzZXIgc3VwcGxpZWQgZXZlbnQgZmlsdGVyIGNhbGxiYWNrICovCi0KLXZvaWQgICAgRVZUQVBJIEVWVF9zZXRVc2VyRXZlbnRGaWx0ZXIoX0VWVF91c2VyRXZlbnRGaWx0ZXIgZmlsdGVyKTsKLQotLyogSW5zdGFsbCB1c2VyIHN1cHBsaWVkIGV2ZW50IGhlYXJ0YmVhdCBjYWxsYmFjayBmdW5jdGlvbiAqLwotCi12b2lkICAgIEVWVEFQSSBFVlRfc2V0SGVhcnRCZWF0Q2FsbGJhY2soX0VWVF9oZWFydEJlYXRDYWxsYmFjayBjYWxsYmFjayx2b2lkICpwYXJhbXMpOwotdm9pZCAgICBFVlRBUEkgRVZUX2dldEhlYXJ0QmVhdENhbGxiYWNrKF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgKmNhbGxiYWNrLHZvaWQgKipwYXJhbXMpOwotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMgdG8gaW5pdGlhbGlzZSBhbmQga2lsbCB0aGUgZXZlbnQgbWFuYWdlci4gTUdMCi0gKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5ldmVyIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IGFzIHRoZSBNR0wKLSAqIGxpYnJhcmllcyBkbyBpdCBmb3IgeW91LgotICovCi0KLS8qIHtzZWNyZXR9ICovCi12b2lkICAgIEVWVEFQSSBFVlRfaW5pdChfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKTsKLS8qIHtzZWNyZXR9ICovCi12b2lkICAgIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZShpbnQgeFJlcyxpbnQgeVJlcyk7Ci0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBFVlRBUEkgRVZUX3N1c3BlbmQodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBFVlRBUEkgRVZUX3Jlc3VtZSh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi12b2lkICAgIEVWVEFQSSBFVlRfZXhpdCh2b2lkKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLwotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIF9fRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL210cnIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9tdHJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTgxMmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL210cnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSBkZWZpbmluZyB0aGUgZXh0ZXJuYWwgcmluZyAwIGhlbHBlciBmdW5jdGlvbnMKLSogICAgICAgICAgICAgICBuZWVkZWQgYnkgdGhlIE1UUlIgbW9kdWxlLiBUaGVzZSBmdW5jdGlvbnMgbWF5IGJlIGluY2x1ZGVkCi0qICAgICAgICAgICAgICAgZGlyZWN0bHkgZm9yIG5hdGl2ZSByaW5nIDAgZGV2aWNlIGRyaXZlcnMsIG9yIHRoZXkgbWF5Ci0qICAgICAgICAgICAgICAgYmUgY2FsbHMgZG93biB0byBhIHJpbmcgMCBoZWxwZXIgZGV2aWNlIGRyaXZlciB3aGVyZQotKiAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIChvciB0aGUgZW50aXJlIE1UUlIgbW9kdWxlIG1heSBiZSBsb2NhdGVkIGluCi0qICAgICAgICAgICAgICAgdGhlIGRldmljZSBkcml2ZXIgaWYgdGhlIGRldmljZSBkcml2ZXIgaXMgMzItYml0KS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19NVFJSX0gKLSNkZWZpbmUgX19NVFJSX0gKLQotI2luY2x1ZGUgInNjaXRlY2guaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMgKHJlcXVpcmVzIHJpbmcgMCBhY2Nlc3Mgb3IgaGVscGVyIGZ1bmN0aW9ucyEpICovCi0KLXZvaWQgICAgTVRSUl9pbml0KHZvaWQpOwotaW50ICAgICBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZSh1bG9uZyBiYXNlLHVsb25nIHNpemUsdWludCB0eXBlKTsKLQotLyogRXh0ZXJuYWwgYXNzZW1ibGVyIGhlbHBlciBmdW5jdGlvbnMgKi8KLQotaWJvb2wgICBfQVNNQVBJIF9NVFJSX2lzUmluZzAodm9pZCk7Ci11bG9uZyAgIF9BU01BUEkgX01UUlJfZGlzYWJsZUludCh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBfTVRSUl9yZXN0b3JlSW50KHVsb25nIGZsYWdzKTsKLXVsb25nICAgX0FTTUFQSSBfTVRSUl9zYXZlQ1I0KHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKTsKLXVjaGFyICAgX0FTTUFQSSBfTVRSUl9nZXRDeDg2KHVjaGFyIHJlZyk7Ci12b2lkICAgIF9BU01BUEkgX01UUlJfc2V0Q3g4Nih1Y2hhciByZWcsdWNoYXIgZGF0YSk7Ci0jaWZkZWYgIF9fMTZCSVRfXwotdm9pZCAgICBfQVNNQVBJIF9NVFJSX3JlYWRNU1IodWxvbmcgcmVnLCB1bG9uZyBmYXIgKmVheCwgdWxvbmcgZmFyICplZHgpOwotI2Vsc2UKLXZvaWQgICAgX0FTTUFQSSBfTVRSUl9yZWFkTVNSKHVsb25nIHJlZywgdWxvbmcgKmVheCwgdWxvbmcgKmVkeCk7Ci0jZW5kaWYKLXZvaWQgICAgX0FTTUFQSSBfTVRSUl93cml0ZU1TUih1bG9uZyByZWcsIHVsb25nIGVheCwgdWxvbmcgZWR4KTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAgLyogX19NVFJSX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wY2lsaWIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wY2lsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4ZjhlZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcGNpbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIGludGVyZmFjZSByb3V0aW5lcyB0byB0aGUgUENJIGJ1cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19QQ0lMSUJfSAotI2RlZmluZSBfX1BDSUxJQl9ICi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKiBEZWZpbmVzIGZvciBQQ0lEZXZpY2VJbmZvLkhlYWRlclR5cGUgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQQ0lfZGV2aWNlVHlwZSAgICAgICAgICAgICAgICAgID0gMHgwMCwKLSAgICBQQ0lfYnJpZGdlVHlwZSAgICAgICAgICAgICAgICAgID0gMHgwMSwKLSAgICBQQ0lfY2FyZEJ1c0JyaWRnZVR5cGUgICAgICAgICAgID0gMHgwMiwKLSAgICBQQ0lfbXVsdGlGdW5jdGlvblR5cGUgICAgICAgICAgID0gMHg4MAotICAgIH0gUENJSGVhZGVyVHlwZUZsYWdzOwotCi0vKiBEZWZpbmVzIGZvciBQQ0lEZXZpY2VJbmZvLkNvbW1hbmQgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQQ0lfZW5hYmxlSU9TcGFjZSAgICAgICAgICAgICAgID0gMHgwMDAxLAotICAgIFBDSV9lbmFibGVNZW1vcnlTcGFjZSAgICAgICAgICAgPSAweDAwMDIsCi0gICAgUENJX2VuYWJsZUJ1c01hc3RlciAgICAgICAgICAgICA9IDB4MDAwNCwKLSAgICBQQ0lfZW5hYmxlU3BlY2lhbEN5bGNlcyAgICAgICAgID0gMHgwMDA4LAotICAgIFBDSV9lbmFibGVXcml0ZUFuZEludmFsaWRhdGUgICAgPSAweDAwMTAsCi0gICAgUENJX2VuYWJsZVZHQUNvbXBhdGlibGVQYWxldHRlICA9IDB4MDAyMCwKLSAgICBQQ0lfZW5hYmxlUGFyaXR5ICAgICAgICAgICAgICAgID0gMHgwMDQwLAotICAgIFBDSV9lbmFibGVXYWl0Q3ljbGUgICAgICAgICAgICAgPSAweDAwODAsCi0gICAgUENJX2VuYWJsZVNlcnIgICAgICAgICAgICAgICAgICA9IDB4MDEwMCwKLSAgICBQQ0lfZW5hYmxlRmFzdEJhY2tUb0JhY2sgICAgICAgID0gMHgwMjAwCi0gICAgfSBQQ0lDb21tYW5kRmxhZ3M7Ci0KLS8qIERlZmluZXMgZm9yIFBDSURldmljZUluZm8uU3RhdHVzICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUENJX3N0YXR1c0NhcGFiaWxpdGllc0xpc3QgICAgICA9IDB4MDAxMCwKLSAgICBQQ0lfc3RhdHVzNjZNaHpDYXBhYmxlICAgICAgICAgID0gMHgwMDIwLAotICAgIFBDSV9zdGF0dXNVREZTdXBwb3J0ZWQgICAgICAgICAgPSAweDAwNDAsCi0gICAgUENJX3N0YXR1c0Zhc3RCYWNrVG9CYWNrICAgICAgICA9IDB4MDA4MCwKLSAgICBQQ0lfc3RhdHVzRGF0YVBhcml0eURldGVjdGVkICAgID0gMHgwMTAwLAotICAgIFBDSV9zdGF0dXNEZXZTZWwgICAgICAgICAgICAgICAgPSAweDA2MDAsCi0gICAgUENJX3N0YXR1c1NpZ25hbGVkVGFyZ2V0QWJvcnQgICA9IDB4MDgwMCwKLSAgICBQQ0lfc3RhdHVzUmVjaWV2ZWRUYXJnZXRBYm9ydCAgID0gMHgxMDAwLAotICAgIFBDSV9zdGF0dXNSZWNpZXZlZE1hc3RlckFib3J0ICAgPSAweDIwMDAsCi0gICAgUENJX3N0YXR1c1NpZ25hbGVkU3lzdGVtRXJyb3IgICA9IDB4NDAwMCwKLSAgICBQQ0lfc3RhdHVzRGV0ZWN0ZWRQYXJpdHlFcnJvciAgID0gMHg4MDAwCi0gICAgfSBQQ0lTdGF0dXNGbGFnczsKLQotLyogUENJIGNhcGFiaWxpdHkgSURzICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUENJX2NhcHNQb3dlck1hbmFnZW1lbnQgICAgICAgICA9IDB4MDEsCi0gICAgUENJX2NhcHNBR1AgICAgICAgICAgICAgICAgICAgICA9IDB4MDIsCi0gICAgUENJX2NhcHNNU0kgICAgICAgICAgICAgICAgICAgICA9IDB4MDUKLSAgICB9IFBDSUNhcHNUeXBlOwotCi0vKiBQQ0kgQUdQIHJhdGUgZGVmaW5pdGlvbnMgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQQ0lfQUdQUmF0ZTFYICAgICAgICAgICAgICAgICAgID0gMHgxLAotICAgIFBDSV9BR1BSYXRlMlggICAgICAgICAgICAgICAgICAgPSAweDIsCi0gICAgUENJX0FHUFJhdGU0WCAgICAgICAgICAgICAgICAgICA9IDB4NAotICAgIH0gUENJQUdQUmF0ZVR5cGU7Ci0KLS8qIE5PVEU6IFdlIGRlZmluZSBhbGwgYml0ZmllbGQncyBhcyB1aW50J3MsIHNwZWNpZmljYWxseSBzbyB0aGF0IHRoZSBJQk0KLSAqICAgICAgIFZpc3VhbCBBZ2UgQysrIGNvbXBpbGVyIGRvZXMgbm90IGNvbXBsYWluLiBXZSBuZWVkIHRoZW0gdG8gYmUKLSAqICAgICAgIDMyLWJpdHMgd2lkZSwgYW5kIHRoaXMgaXMgdGhlIHdpZHRoIG9mIGFuIHVuc2lnbmVkIGludGVnZXIsIGJ1dAotICogICAgICAgd2UgY2FuJ3QgdXNlIGEgdWxvbmcgdG8gbWFrZSB0aGlzIGV4cGxpY2l0IG9yIHdlIGdldCBlcnJvcnMuCi0gKi8KLQotLyogU3RydWN0dXJlIGRlZmluaW5nIGEgUENJIHNsb3QgaWRlbnRpZmllciAqLwotCi10eXBlZGVmIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotCXVpbnQgICAgWmVybzoyOwotCXVpbnQgICAgUmVnaXN0ZXI6NjsKLQl1aW50ICAgIEZ1bmN0aW9uOjM7Ci0JdWludCAgICBEZXZpY2U6NTsKLQl1aW50ICAgIEJ1czo4OwotCXVpbnQgICAgUmVzZXJ2ZWQ6NzsKLQl1aW50ICAgIEVuYWJsZToxOwotCX0gcDsKLSAgICB1bG9uZyAgIGk7Ci0gICAgfSBQQ0lzbG90OwotCi0vKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIHJlZ3VsYXIgKHR5cGUgMCkgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKLSAqIGxheW91dC4gV2UgdXNlIHRoaXMgaW4gYSB1bmlvbiBiZWxvdyBzbyB3ZSBjYW4gZGVzY3JpYmUgYWxsIHR5cGVzIG9mCi0gKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZXMgd2l0aCBhIHNpbmdsZSBzdHJ1Y3R1cmUuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxMDsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMTQ7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczE4OwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxQzsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMjA7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczI0OwotICAgIHVsb25nICAgQ2FyZGJ1c0NJU1BvaW50ZXI7Ci0gICAgdXNob3J0ICBTdWJTeXN0ZW1WZW5kb3JJRDsKLSAgICB1c2hvcnQgIFN1YlN5c3RlbUlEOwotICAgIHVsb25nICAgUk9NQmFzZUFkZHJlc3M7Ci0gICAgdWNoYXIgICBDYXBhYmlsaXRpZXNQb2ludGVyOwotICAgIHVjaGFyICAgcmVzZXJ2ZWQxOwotICAgIHVjaGFyICAgcmVzZXJ2ZWQyOwotICAgIHVjaGFyICAgcmVzZXJ2ZWQzOwotICAgIHVsb25nICAgcmVzZXJ2ZWQ0OwotICAgIHVjaGFyICAgSW50ZXJydXB0TGluZTsKLSAgICB1Y2hhciAgIEludGVycnVwdFBpbjsKLSAgICB1Y2hhciAgIE1pbmltdW1HcmFudDsKLSAgICB1Y2hhciAgIE1heGltdW1MYXRlbmN5OwotCi0gICAgLyogVGhlc2UgYXJlIG5vdCBpbiB0aGUgYWN0dWFsIGNvbmZpZyBzcGFjZSwgYnV0IHdlIGVudW1lcmF0ZSB0aGVtICovCi0gICAgdWxvbmcgICBCYXNlQWRkcmVzczEwTGVuOwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxNExlbjsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMThMZW47Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczFDTGVuOwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MyMExlbjsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMjRMZW47Ci0gICAgdWxvbmcgICBST01CYXNlQWRkcmVzc0xlbjsKLSAgICB9IFBDSVR5cGUwSW5mbzsKLQotLyogU3RydWN0dXJlIGRlZmluaW5nIFBDSSB0byBQQ0kgYnJpZGdlICh0eXBlIDEpIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCi0gKiBsYXlvdXQuIFdlIHVzZSB0aGlzIGluIGEgdW5pb24gYmVsb3cgc28gd2UgY2FuIGRlc2NyaWJlIGFsbCB0eXBlcyBvZgotICogUENJIGNvbmZpZ3VyYXRpb24gc3BhY2VzIHdpdGggYSBzaW5nbGUgc3RydWN0dXJlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMTA7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczE0OwotICAgIHVjaGFyICAgUHJpbWFyeUJ1c051bWJlcjsKLSAgICB1Y2hhciAgIFNlY29uZGF5QnVzTnVtYmVyOwotICAgIHVjaGFyICAgU3Vib3JkaW5hdGVCdXNOdW1iZXI7Ci0gICAgdWNoYXIgICBTZWNvbmRhcnlMYXRlbmN5VGltZXI7Ci0gICAgdWNoYXIgICBJT0Jhc2U7Ci0gICAgdWNoYXIgICBJT0xpbWl0OwotICAgIHVzaG9ydCAgU2Vjb25kYXJ5U3RhdHVzOwotICAgIHVzaG9ydCAgTWVtb3J5QmFzZTsKLSAgICB1c2hvcnQgIE1lbW9yeUxpbWl0OwotICAgIHVzaG9ydCAgUHJlZmV0Y2hhYmxlTWVtb3J5QmFzZTsKLSAgICB1c2hvcnQgIFByZWZldGNoYWJsZU1lbW9yeUxpbWl0OwotICAgIHVsb25nICAgUHJlZmV0Y2hhYmxlQmFzZUhpOwotICAgIHVsb25nICAgUHJlZmV0Y2hhYmxlTGltaXRIaTsKLSAgICB1c2hvcnQgIElPQmFzZUhpOwotICAgIHVzaG9ydCAgSU9MaW1pdEhpOwotICAgIHVjaGFyICAgQ2FwYWJpbGl0aWVzUG9pbnRlcjsKLSAgICB1Y2hhciAgIHJlc2VydmVkMTsKLSAgICB1Y2hhciAgIHJlc2VydmVkMjsKLSAgICB1Y2hhciAgIHJlc2VydmVkMzsKLSAgICB1bG9uZyAgIFJPTUJhc2VBZGRyZXNzOwotICAgIHVjaGFyICAgSW50ZXJydXB0TGluZTsKLSAgICB1Y2hhciAgIEludGVycnVwdFBpbjsKLSAgICB1c2hvcnQgIEJyaWRnZUNvbnRyb2w7Ci0gICAgfSBQQ0lUeXBlMUluZm87Ci0KLS8qIFBDSSB0byBDYXJkQnVzIGJyaWRnZSAodHlwZSAyKSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBTb2NrZXRSZWdpc3RlcnNCYXNlQWRkcmVzczsKLSAgICB1Y2hhciAgIENhcGFiaWxpdGllc1BvaW50ZXI7Ci0gICAgdWNoYXIgICByZXNlcnZlZDE7Ci0gICAgdXNob3J0ICBTZWNvbmRhcnlTdGF0dXM7Ci0gICAgdWNoYXIgICBQcmltYXJ5QnVzOwotICAgIHVjaGFyICAgU2Vjb25kYXJ5QnVzOwotICAgIHVjaGFyICAgU3Vib3JkaW5hdGVCdXM7Ci0gICAgdWNoYXIgICBTZWNvbmRhcnlMYXRlbmN5OwotICAgIHN0cnVjdCAgewotCXVsb25nICAgQmFzZTsKLQl1bG9uZyAgIExpbWl0OwotCX0gUmFuZ2VbNF07Ci0gICAgdWNoYXIgICBJbnRlcnJ1cHRMaW5lOwotICAgIHVjaGFyICAgSW50ZXJydXB0UGluOwotICAgIHVzaG9ydCAgQnJpZGdlQ29udHJvbDsKLSAgICB9IFBDSVR5cGUySW5mbzsKLQotLyogU3RydWN0dXJlIGRlZmluaW5nIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBpbmZvcm1hdGlvbiBmb3IgYQotICogc2luZ2xlIFBDSSBkZXZpY2Ugb24gdGhlIFBDSSBidXMuIFdlIGVudW1lcmF0ZSBhbGwgdGhpcyBpbmZvcm1hdGlvbgotICogZm9yIGFsbCBQQ0kgZGV2aWNlcyBvbiB0aGUgYnVzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgICAgICAgICAgICAgIGR3U2l6ZTsKLSAgICBQQ0lzbG90ICAgICAgICAgICAgIHNsb3Q7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICBtZWNoMTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIFZlbmRvcklEOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgRGV2aWNlSUQ7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBDb21tYW5kOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgU3RhdHVzOwotICAgIHVjaGFyICAgICAgICAgICAgICAgUmV2SUQ7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBJbnRlcmZhY2U7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBTdWJDbGFzczsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIEJhc2VDbGFzczsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIENhY2hlTGluZVNpemU7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBMYXRlbmN5VGltZXI7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBIZWFkZXJUeXBlOwotICAgIHVjaGFyICAgICAgICAgICAgICAgQklTVDsKLSAgICB1bmlvbiB7Ci0JUENJVHlwZTBJbmZvICAgIHR5cGUwOwotCVBDSVR5cGUxSW5mbyAgICB0eXBlMTsKLQlQQ0lUeXBlMkluZm8gICAgdHlwZTI7Ci0JfSB1OwotICAgIH0gUENJRGV2aWNlSW5mbzsKLQotLyogUENJIENhcGFiaWxpdHkgaGVhZGVyIHN0cnVjdHVyZS4gQWxsIFBDSSBjYXBhYmlsaXRpZXMgaGF2ZSB0aGUKLSAqIGZvbGxvd2luZyBoZWFkZXIuCi0gKgotICogY2Fwc0lEIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgdGhlIHN0cnVjdHVyZSBhcyBkZWZpbmUgYWJvdmUuCi0gKgotICogbmV4dCBpcyB0aGUgb2Zmc2V0IGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICgweDQwLTB4RkMpIG9mIHRoZQotICogbmV4dCBjYXBhYmlsaXR5IHN0cnVjdHVyZSBpbiB0aGUgbGlzdCwgb3IgMHgwMCBpZiB0aGVyZSBhcmUgbm8gbW9yZQotICogZW50cmllcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWNoYXIgICBjYXBzSUQ7Ci0gICAgdWNoYXIgICBuZXh0OwotICAgIH0gUENJQ2Fwc0hlYWRlcjsKLQotLyogU3RydWN0dXJlIGRlZmluaW5nIHRoZSBQQ0kgQUdQIHN0YXR1cyByZWdpc3RlciBjb250ZW50cyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludCAgICByYXRlOjM7Ci0gICAgdWludCAgICByc3ZkMToxOwotICAgIHVpbnQgICAgZmFzdFdyaXRlOjE7Ci0gICAgdWludCAgICBmb3VyR0I6MTsKLSAgICB1aW50ICAgIHJzdmQyOjM7Ci0gICAgdWludCAgICBzaWRlQmFuZEFkZHJlc3Npbmc6MTsKLSAgICB1aW50ICAgIHJzdmQzOjE0OwotICAgIHVpbnQgICAgcmVxdWVzdFF1ZXVlRGVwdGhNYXhpbXVtOjg7Ci0gICAgfSBQQ0lBR1BTdGF0dXM7Ci0KLS8qIFN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUENJIEFHUCBjb21tYW5kIHJlZ2lzdGVyIGNvbnRlbnRzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1aW50ICAgIHJhdGU6MzsKLSAgICB1aW50ICAgIHJzdmQxOjE7Ci0gICAgdWludCAgICBmYXN0V3JpdGVFbmFibGU6MTsKLSAgICB1aW50ICAgIGZvdXJHQkVuYWJsZToxOwotICAgIHVpbnQgICAgcnN2ZDI6MjsKLSAgICB1aW50ICAgIEFHUEVuYWJsZToxOwotICAgIHVpbnQgICAgU0JBRW5hYmxlOjE7Ci0gICAgdWludCAgICByc3ZkMzoxNDsKLSAgICB1aW50ICAgIHJlcXVlc3RRdWV1ZURlcHRoOjg7Ci0gICAgfSBQQ0lBR1BDb21tYW5kOwotCi0vKiBBR1AgQ2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFBDSUNhcHNIZWFkZXIgICBoOwotICAgIHVzaG9ydCAgICAgICAgICBtYWpNaW47Ci0gICAgUENJQUdQU3RhdHVzICAgIEFHUFN0YXR1czsKLSAgICBQQ0lBR1BDb21tYW5kICAgQUdQQ29tbWFuZDsKLSAgICB9IFBDSUFHUENhcGFiaWxpdHk7Ci0KLS8qIFN0cnVjdHVyZSBmb3Igb2J0YWluaW5nIHRoZSBQQ0kgSVJRIHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVjaGFyICAgYnVzOwotICAgIHVjaGFyICAgZGV2aWNlOwotICAgIHVjaGFyICAgbGlua0E7Ci0gICAgdXNob3J0ICBtYXBBOwotICAgIHVjaGFyICAgbGlua0I7Ci0gICAgdXNob3J0ICBtYXBCOwotICAgIHVjaGFyICAgbGlua0M7Ci0gICAgdXNob3J0ICBtYXBDOwotICAgIHVjaGFyICAgbGlua0Q7Ci0gICAgdXNob3J0ICBtYXBEOwotICAgIHVjaGFyICAgc2xvdDsKLSAgICB1Y2hhciAgIHJlc2VydmVkOwotICAgIH0gUENJUm91dGVJbmZvOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdXNob3J0ICAgICAgICAgIEJ1ZmZlclNpemU7Ci0gICAgUENJUm91dGVJbmZvICAgICpEYXRhQnVmZmVyOwotICAgIH0gUENJUm91dGluZ09wdGlvbnNCdWZmZXI7Ci0KLSNkZWZpbmUgTlVNX1BDSV9SRUcgICAgICAgICAgICAgICAgIChzaXplb2YoUENJRGV2aWNlSW5mbykgLyA0KSAtIDEwCi0jZGVmaW5lIFBDSV9CUklER0VfQ0xBU1MgICAgICAgICAgICAweDA2Ci0jZGVmaW5lIFBDSV9IT1NUX0JSSURHRV9TVUJDTEFTUyAgICAweDAwCi0jZGVmaW5lIFBDSV9FQVJMWV9WR0FfQ0xBU1MgICAgICAgICAweDAwCi0jZGVmaW5lIFBDSV9FQVJMWV9WR0FfU1VCQ0xBU1MgICAgICAweDAxCi0jZGVmaW5lIFBDSV9ESVNQTEFZX0NMQVNTICAgICAgICAgICAweDAzCi0jZGVmaW5lIFBDSV9ESVNQTEFZX1ZHQV9TVUJDTEFTUyAgICAweDAwCi0jZGVmaW5lIFBDSV9ESVNQTEFZX1hHQV9TVUJDTEFTUyAgICAweDAxCi0jZGVmaW5lIFBDSV9ESVNQTEFZX09USEVSX1NVQkNMQVNTICAweDgwCi0jZGVmaW5lIFBDSV9NTV9DTEFTUyAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIFBDSV9BVURJT19TVUJDTEFTUyAgICAgICAgICAweDAxCi0KLS8qIE1hY3JvcyB0byBkZXRlY3Qgc3BlY2lmaWMgY2xhc3NlcyBvZiBkZXZpY2VzICovCi0KLSNkZWZpbmUgUENJX0lTXzNETEFCU19OT05WR0FfQ0xBU1MocGNpKSBcCi0gICAoKChwY2kpLT5CYXNlQ2xhc3MgPT0gUENJX0RJU1BMQVlfQ0xBU1MgJiYgKHBjaSktPlN1YkNsYXNzID09IFBDSV9ESVNQTEFZX09USEVSX1NVQkNMQVNTKSBcCi0gJiYgKChwY2kpLT5WZW5kb3JJRCA9PSAweDNEM0QgfHwgKHBjaSktPlZlbmRvcklEID09IDB4MTA0QykpCi0KLSNkZWZpbmUgUENJX0lTX0RJU1BMQVlfQ0xBU1MocGNpKSBcCi0gICAoKChwY2kpLT5CYXNlQ2xhc3MgPT0gUENJX0RJU1BMQVlfQ0xBU1MgJiYgKHBjaSktPlN1YkNsYXNzID09IFBDSV9ESVNQTEFZX1ZHQV9TVUJDTEFTUykgXAotIHx8ICgocGNpKS0+QmFzZUNsYXNzID09IFBDSV9ESVNQTEFZX0NMQVNTICYmIChwY2kpLT5TdWJDbGFzcyA9PSBQQ0lfRElTUExBWV9YR0FfU1VCQ0xBU1MpIFwKLSB8fCAoKHBjaSktPkJhc2VDbGFzcyA9PSBQQ0lfRUFSTFlfVkdBX0NMQVNTICYmIChwY2kpLT5TdWJDbGFzcyA9PSBQQ0lfRUFSTFlfVkdBX1NVQkNMQVNTKSBcCi0gfHwgUENJX0lTXzNETEFCU19OT05WR0FfQ0xBU1MocGNpKSkKLQotLyogRnVuY3Rpb24gY29kZXMgdG8gcGFzcyB0byBQQ0lfYWNjZXNzUmVnICovCi0KLSNkZWZpbmUgUENJX1JFQURfQllURSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUENJX1JFQURfV09SRCAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUENJX1JFQURfRFdPUkQgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUENJX1dSSVRFX0JZVEUgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUENJX1dSSVRFX1dPUkQgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUENJX1dSSVRFX0RXT1JEICAgICAgICAgICAgIDUKLQotLyogTWFjcm9zIHRvIHJlYWQvd3JpdGUgUENJIHJlZ2lzdGVycy4gVGhlc2UgYXNzdW1lIGEgZ2xvYmFsIFBDSSBhcnJheQotICogb2YgZGV2aWNlIGluZm9ybWF0aW9uLgotICovCi0KLSNkZWZpbmUgUENJX3JlYWRQQ0lSZWdCKGluZGV4LGRldmljZSkgICBcCi0gICAgUENJX2FjY2Vzc1JlZyhpbmRleCwwLDAsJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXSkKLQotI2RlZmluZSBQQ0lfcmVhZFBDSVJlZ1coaW5kZXgsZGV2aWNlKSAgIFwKLSAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LDAsMSwmUENJW0RldmljZUluZGV4W2RldmljZV1dKQotCi0jZGVmaW5lIFBDSV9yZWFkUENJUmVnTChpbmRleCxkZXZpY2UpICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoaW5kZXgsMCwyLCZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0pCi0KLSNkZWZpbmUgUENJX3dyaXRlUENJUmVnQihpbmRleCx2YWx1ZSxkZXZpY2UpICAgIFwKLSAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LHZhbHVlLDMsJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXSkKLQotI2RlZmluZSBQQ0lfd3JpdGVQQ0lSZWdXKGluZGV4LHZhbHVlLGRldmljZSkgICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoaW5kZXgsdmFsdWUsNCwmUENJW0RldmljZUluZGV4W2RldmljZV1dKQotCi0jZGVmaW5lIFBDSV93cml0ZVBDSVJlZ0woaW5kZXgsdmFsdWUsZGV2aWNlKSAgICBcCi0gICAgUENJX2FjY2Vzc1JlZyhpbmRleCx2YWx1ZSw1LCZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0pCi0KLSNwcmFnbWEgcGFjaygpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotLyogRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgUENJIGRldmljZXMgaW4gdGhlIHN5c3RlbSAqLwotCi1pbnQgICAgIF9BU01BUEkgUENJX2dldE51bURldmljZXModm9pZCk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgZGV2aWNlIG9uIHRoZSBQQ0kgYnVzICovCi0KLWludCAgICAgX0FTTUFQSSBQQ0lfZW51bWVyYXRlKFBDSURldmljZUluZm8gaW5mb1tdKTsKLQotLyogRnVuY3Rpb24gdG8gYWNjZXNzIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwotCi11bG9uZyAgIF9BU01BUEkgUENJX2FjY2Vzc1JlZyhpbnQgaW5kZXgsdWxvbmcgdmFsdWUsaW50IGZ1bmMsUENJRGV2aWNlSW5mbyAqaW5mbyk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGdldCBQQ0kgSVJRIHJvdXRpbmcgb3B0aW9ucyBmb3IgYSBjYXJkICovCi0KLWludCAgICAgX0FTTUFQSSBQQ0lfZ2V0SVJRUm91dGluZ09wdGlvbnMoaW50IG51bURldmljZXMsUENJUm91dGVJbmZvICpidWZmZXIpOwotCi0vKiBGdW5jdGlvbiB0byByZS1yb3V0ZSB0aGUgUENJIElSUSBzZXR0aW5nIGZvciBhIGRldmljZSAqLwotCi1pYm9vbCAgIF9BU01BUEkgUENJX3NldEhhcmR3YXJlSVJRKFBDSURldmljZUluZm8gKmluZm8sdWludCBpbnRQaW4sdWludCBJUlEpOwotCi0vKiBGdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHNwZWNpYWwgY3lsZSBvbiB0aGUgc3BlY2lmaWVkIFBDSSBidXMgKi8KLQotdm9pZCAgICBfQVNNQVBJIFBDSV9nZW5lcmF0ZVNwZWNpYWxDeWxlKHVpbnQgYnVzLHVsb25nIHNwZWNpYWxDeWNsZURhdGEpOwotCi0vKiBGdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgYSBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCi0KLXVsb25nICAgX0FTTUFQSSBQQ0lfZmluZEJBUlNpemUoaW50IGJhcixQQ0lEZXZpY2VJbmZvICpwY2kpOwotCi0vKiBGdW5jdGlvbiB0byByZWFkIGEgYmxvY2sgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzICovCi0KLXZvaWQgICAgX0FTTUFQSSBQQ0lfcmVhZFJlZ0Jsb2NrKFBDSURldmljZUluZm8gKmluZm8saW50IGluZGV4LHZvaWQgKmRzdCxpbnQgY291bnQpOwotCi0vKiBGdW5jdGlvbiB0byB3cml0ZSBhIGJsb2NrIG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycyAqLwotCi12b2lkICAgIF9BU01BUEkgUENJX3dyaXRlUmVnQmxvY2soUENJRGV2aWNlSW5mbyAqaW5mbyxpbnQgaW5kZXgsdm9pZCAqc3JjLGludCBjb3VudCk7Ci0KLS8qIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgMzItYml0IFBDSSBCSU9TIGVudHJ5IHBvaW50ICovCi0KLXVsb25nICAgX0FTTUFQSSBQQ0lCSU9TX2dldEVudHJ5KHZvaWQpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAgLyogX19QQ0lMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtX2hlbHAuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV9oZWxwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNmEyYmEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtX2hlbHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMiwgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSBmb3IgdGhlIFNjaVRlY2ggUG9ydGFiaWxpdHkgTWFuYWdlciAzMi1iaXQKLSogICAgICAgICAgICAgICBoZWxwZXIgVnhEIGZvciBXaW5kb3dzIDl4IGZvciBhbmQgdGhlIDE2LWJpdCByaW5nIDAKLSogICAgICAgICAgICAgICBoZWxwZXIgZGV2aWNlIGRyaXZlciBmb3IgT1MvMi4KLSoKLSogICAgICAgICAgICAgICBUaGlzIGZpbGUgZG9jdW1lbnRzIGFsbCB0aGUgcHVibGljIHNlcnZpY2VzIHVzZWQgYnkgdGhlCi0qICAgICAgICAgICAgICAgU2NpVGVjaCBQb3J0YWJpbGl0eSBNYW5hZ2VyIGxpYnJhcnkgYW5kIFNjaVRlY2ggTnVjbGV1cwotKiAgICAgICAgICAgICAgIGxvYWRlciBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1BNSEVMUF9ICi0jZGVmaW5lIF9fUE1IRUxQX0gKLQotLyogSW5jbHVkZSB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0KLSNpbmNsdWRlICJzZGQvc2RkdmVyLmgiCi0jZGVmaW5lIFBNSEVMUF9NYWpvciAgICAgICAgICAgIFNERF9SRUxFQVNFX01BSk9SCi0jZGVmaW5lIFBNSEVMUF9NaW5vciAgICAgICAgICAgIFNERF9SRUxFQVNFX01JTk9SCi0jZGVmaW5lIFBNSEVMUF9WRVJTSU9OICAgICAgICAgICgoUE1IRUxQX01ham9yIDw8IDgpIHwgUE1IRUxQX01pbm9yKQotCi0jaWZkZWYgIF9fT1MyX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogUHVibGljIE9TLzIgU3VwcG9ydCBmdW5jdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKiBOYW1lIG9mIGRldmljZSBkcml2ZXIgKi8KLQotI2RlZmluZSBQTUhFTFBfTkFNRSAgICAgICAgICAgICAgICAgKFBTWikic2RkaGVscCQiCi0KLS8qIE1haW4gSU9DVEwgZnVuY3Rpb24gdG8gdGFsayB0byBkZXZpY2UgZHJpdmVyICovCi0KLSNkZWZpbmUgUE1IRUxQX0lPQ1RMICAgICAgICAgICAgICAgIDB4MDA4MAotCi0vKiBNYWNybyBkZWZpbml0aW9uIGZvciBkZWZpbmluZyBJT0NUTCBmdW5jdGlvbiBjb250cm9sIGNvZGVzIGZvciB0aGUgU0RESEVMUAotICogZGV2aWNlIGRyaXZlciBmb3IgT1MvMi4gU2ltaWxhciB0byB0aGF0IHVzZWQgZm9yIHRoZSBET1MvV2luMzIgdmVyc2lvbi4KLSAqLwotCi0jZGVmaW5lIFBNSEVMUF9DVExfQ09ERShuYW1lLHZhbHVlKSBcCi0gICAgUE1IRUxQXyMjbmFtZSA9IHZhbHVlCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgLyogVmVyc2lvbiBmdW5jdGlvbiB1c2VkIGJ5IGFsbCBkcml2ZXJzICovCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVFZFUiAgICAgICAgICAgICAgICAgICAgICAsMHgwMDAxKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoTUFQUEhZUyAgICAgICAgICAgICAgICAgICAgICwweDAwMDIpLAotICAgIFBNSEVMUF9DVExfQ09ERShBTExPQ0xPQ0tFRCAgICAgICAgICAgICAgICAgLDB4MDAwMyksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEZSRUVMT0NLRUQgICAgICAgICAgICAgICAgICAsMHgwMDA0KSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoR0VUR0RUMzIgICAgICAgICAgICAgICAgICAgICwweDAwMDUpLAotICAgIFBNSEVMUF9DVExfQ09ERShNQUxMT0NTSEFSRUQgICAgICAgICAgICAgICAgLDB4MDAwNyksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEZSRUVTSEFSRUQgICAgICAgICAgICAgICAgICAsMHgwMDA4KSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoTUFQVE9QUk9DRVNTICAgICAgICAgICAgICAgICwweDAwMDkpLAotICAgIFBNSEVMUF9DVExfQ09ERShGUkVFUEhZUyAgICAgICAgICAgICAgICAgICAgLDB4MDAwQSksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEZMVVNIVExCICAgICAgICAgICAgICAgICAgICAsMHgwMDBCKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoU0FWRUNSNCAgICAgICAgICAgICAgICAgICAgICwweDAwMEMpLAotICAgIFBNSEVMUF9DVExfQ09ERShSRVNUT1JFQ1I0ICAgICAgICAgICAgICAgICAgLDB4MDAwRCksCi0gICAgUE1IRUxQX0NUTF9DT0RFKFJFQURNU1IgICAgICAgICAgICAgICAgICAgICAsMHgwMDBFKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoV1JJVEVNU1IgICAgICAgICAgICAgICAgICAgICwweDAwMEYpLAotICAgIFBNSEVMUF9DVExfQ09ERShHRVRQSFlTSUNBTEFERFIgICAgICAgICAgICAgLDB4MDAxMCksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVFBIWVNJQ0FMQUREUlJBTkdFICAgICAgICAsMHgwMDExKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoTE9DS1BBR0VTICAgICAgICAgICAgICAgICAgICwweDAwMTIpLAotICAgIFBNSEVMUF9DVExfQ09ERShVTkxPQ0tQQUdFUyAgICAgICAgICAgICAgICAgLDB4MDAxMyksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVFNIQVJFREVYUCAgICAgICAgICAgICAgICAsMHgwMDQyKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoU0VUU0hBUkVERVhQICAgICAgICAgICAgICAgICwweDAwNDMpLAotICAgIFBNSEVMUF9DVExfQ09ERShHRVRTVEFDS1NXSVRDSFJUTiAgICAgICAgICAgLDB4MDA0NCksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVEJVSUxETk8gICAgICAgICAgICAgICAgICAsMHgwMDUwKSwKLSAgICB9IFBNSEVMUF9jdGxDb2RlczsKLQotI2Vsc2UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogUHVibGljIERPUy9XaW5kb3dzIFN1cHBvcnQgZnVuY3Rpb25zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgIERFVklDRV9NQUlOCi0jaW5jbHVkZSA8dnRvb2xzYy5oPgotI2RlZmluZSBQTUhFTFBfSW5pdF9PcmRlciAgIChWRERfSU5JVF9PUkRFUi0xKQotI2RlZmluZSBSRVRVUk5fTE9OR1MobikgICAgICpwLT5kaW9jX2J5dGVzcmV0ID0gKG4pICogc2l6ZW9mKHVsb25nKQotI2VuZGlmICAvKiBERVZJQ0VfTUFJTiAqLwotI2luY2x1ZGUgInNjaXRlY2guaCIKLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0KLS8qIFdlIGNvbm5lY3QgdG8gdGhlIFNEREhFTFAuVlhEIG1vZHVsZSBpZiBpdCBpcyBzdGF0aWNseSBsb2FkZWQgKGFzIHBhcnQKLSAqIG9mIFNjaVRlY2ggRGlzcGxheSBEb2N0b3IpLCBvdGhlcndpc2Ugd2UgZHluYW1pY2FsbHkgbG9hZCB0aGUgUE1IRUxQLlZYRAotICogcHVibGljIGhlbHBlciBWeEQuCi0gKi8KLQotI2RlZmluZSBQTUhFTFBfRGV2aWNlSUQgICAgICAgICAweDAwMDAKLSNkZWZpbmUgU0RESEVMUF9EZXZpY2VJRCAgICAgICAgMHgzREY4Ci0jZGVmaW5lIFZYRExEUl9EZXZpY2VJRCAgICAgICAgIDB4MDAyNwotI2RlZmluZSBTRERIRUxQX01PRFVMRSAgICAgICAgICAiU0RESEVMUCIKLSNkZWZpbmUgU0RESEVMUF9OQU1FICAgICAgICAgICAgIlNEREhFTFAuVlhEIgotI2RlZmluZSBQTUhFTFBfTU9EVUxFICAgICAgICAgICAiUE1IRUxQIgotI2RlZmluZSBQTUhFTFBfTkFNRSAgICAgICAgICAgICAiUE1IRUxQLlZYRCIKLSNkZWZpbmUgUE1IRUxQX0REQk5BTUUgICAgICAgICAgInBtaGVscCAgIgotI2RlZmluZSBTRERIRUxQX01PRFVMRV9QQVRIICAgICAiXFxcXC5cXCIgU0RESEVMUF9NT0RVTEUKLSNkZWZpbmUgUE1IRUxQX01PRFVMRV9QQVRIICAgICAgIlxcXFwuXFwiIFBNSEVMUF9NT0RVTEUKLSNkZWZpbmUgUE1IRUxQX1ZYRF9QQVRIICAgICAgICAgIlxcXFwuXFwiIFBNSEVMUF9OQU1FCi0KLS8qIE1hY3JvIGRlZmluaXRpb24gZm9yIGRlZmluaW5nIElPQ1RMIGZ1bmN0aW9uIGNvbnRyb2wgY29kZXMgZm9yIHRoZSBQTUhFTFAKLSAqIGRldmljZSBkcml2ZXJzIGZvciBXaW5kb3dzIDl4IGFuZCBOVC4gVGhpcyBtYWNybyBpcyBiYXNpY2FsbHkgZGVyaXZlZCBmcm9tCi0gKiB0aGUgQ1RMX0NPREUgbWFjcm8gaW4gdGhlIFdpbmRvd3MgMjAwMCBEREssIGJ1dCB3ZSBoYXJkIGNvZGUgaXQgaGVyZSB0bwotICogYXZvaWQgaGF2aW5nIHRvICNpbmNsdWRlIGFueSBvZiB0aGUgV2luZG93cyAyMDAwIERESyBoZWFkZXIgZmlsZXMuIFdlIGFsc28KLSAqIGRlZmluZSBib3RoIGEgMTYtYml0IGFuZCAzMi1iaXQgdmVyc2lvbiBvZiB0aGUgY29udHJvbCBjb2RlIHdpdGhpbiB0aGUgc2FtZQotICogbWFjcm8gdG8gc2ltcGxpZnkgZnV0dXJlIGFkZGl0aW9ucy4KLSAqCi0gKiBFc3NlbnRpYWxseSB0aGUgV2luMzIgbWFjcm8gd291bGQgbm9ybWFsbHkgZXhwYW5kIHRvIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogIENUTF9DT0RFKEZJTEVfREVWSUNFX1ZJREVPLDB4ODAwK3ZhbHVlLE1FVEhPRF9CVUZGRVJFRCxGSUxFX0FOWV9BQ0NFU1MpCi0gKi8KLQotI2RlZmluZSBQTUhFTFBfQ1RMX0NPREUobmFtZSx2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUE1IRUxQXyMjbmFtZSA9IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQTUhFTFBfIyNuYW1lIyMzMiA9ICgoMHgyMyA8PCAxNikgfCAoMCA8PCAxNCkgfCAoKDB4ODAwK3ZhbHVlKSA8PCAyKSB8ICgwKSkKLQotdHlwZWRlZiBlbnVtIHsKLSAgICAvKiBJbmNsdWRlIGFsbCB0aGUgY29udHJvbCBjb2Rlcy4gV2Uga2VlcCB0aGVtIGluIGEgc2VwYXJhdGUgaGVhZGVyCi0gICAgICogZmlsZSBzbyB3ZSBjYW4gaW5jbHVkZSB0aGVtIGluIG11bHRpcGxlIHBsYWNlcyB0byBtYWtlIHRoaXMKLSAgICAgKiBtb3JlIHZlcnNhdGlsZS4KLSAgICAgKi8KLSAgICAjaW5jbHVkZSAicG1fd2N0bC5oIgotICAgIH0gUE1IRUxQX2N0bENvZGVzOwotCi0vKiBGb3IgcmVhbCBtb2RlIFZ4RCBjYWxscywgd2UgcHV0IHRoZSBmdW5jdGlvbiBudW1iZXIgaW50byB0aGUgaGlnaAotICogb3JkZXIgd29yZCBvZiBFQVgsIGFuZCBhIHZhbHVlIG9mIDB4NEZGRiBpbiBBWC4gVGhpcyBhbGxvd3Mgb3VyCi0gKiBWeEQgaGFuZGxlciB3aGljaCBpcyBzZXQgdXAgdG8gaGFuZGxlIEludCAxMCdzIHRvIHJlY29nbmlzZSBhIG5hdGl2ZQotICogUE1IRUxQIEFQSSBjYWxsIGZyb20gYSByZWFsIG1vZGUgRE9TIHByb2dyYW0uCi0gKi8KLQotI2lmZGVmICBSRUFMTU9ERQotI2RlZmluZSBBUElfTlVNKG51bSkgICAgKCgodWxvbmcpKG51bSkgPDwgMTYpIHwgMHg0RkZGKQotI2Vsc2UKLSNkZWZpbmUgQVBJX05VTShudW0pICAgIChudW0pCi0jZW5kaWYKLQotI2VuZGlmICAvKiAhX19PUzJfXyAqLwotCi0jZW5kaWYgIC8qIF9fUE1IRUxQX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV93Y3RsLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1fd2N0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFhMTVlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV93Y3RsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMiwgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIHRvIGRlZmluZSBhbGwgdGhlIGNvbnRyb2wgY29kZXMgZm9yIHRoZSBET1MKLSogICAgICAgICAgICAgICBhbmQgV2luMzIgZGV2aWNlIGRyaXZlciBBUEkncyBmb3IgY2FsbGluZyBmcm9tIHJpbmcgMwotKiAgICAgICAgICAgICAgIGludG8gdGhlIHJpbmcgMCBkZXZpY2UgZHJpdmVycy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFZlcnNpb24gZnVuY3Rpb24gdXNlZCBieSBhbGwgZHJpdmVycyAqLwotUE1IRUxQX0NUTF9DT0RFKEdFVFZFUiAgICAgICAgICAgICAgICAgICAgICAsMHgwMDAwKSwKLQotLyogRnVuY3Rpb25zIHVzZWQgYnkgb2Jzb2xldGUgMTYtYml0IERPUyBUU1IgKi8KLVBNSEVMUF9DVExfQ09ERShSRFJFR0IgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwMyksCi1QTUhFTFBfQ1RMX0NPREUoV1JSRUdCICAgICAgICAgICAgICAgICAgICAgICwweDAwMDQpLAotUE1IRUxQX0NUTF9DT0RFKFJEUkVHVyAgICAgICAgICAgICAgICAgICAgICAsMHgwMDA1KSwKLVBNSEVMUF9DVExfQ09ERShXUlJFR1cgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwNiksCi1QTUhFTFBfQ1RMX0NPREUoUkRSRUdMICAgICAgICAgICAgICAgICAgICAgICwweDAwMDgpLAotUE1IRUxQX0NUTF9DT0RFKFdSUkVHTCAgICAgICAgICAgICAgICAgICAgICAsMHgwMDA5KSwKLQotLyogRnVuY3Rpb25zIHVzZWQgYnkgb2Jzb2xldGUgV2luRGlyZWN0ICovCi1QTUhFTFBfQ1RMX0NPREUoTUFQUEhZUyAgICAgICAgICAgICAgICAgICAgICwweDAwMEYpLAotUE1IRUxQX0NUTF9DT0RFKEdFVFZFU0FCVUYgICAgICAgICAgICAgICAgICAsMHgwMDEzKSwKLQotLyogRnVuY3Rpb25zIHVzZWQgYnkgUE0gbGlicmFyeSAqLwotUE1IRUxQX0NUTF9DT0RFKERQTUlJTlQ4NiAgICAgICAgICAgICAgICAgICAsMHgwMDE0KSwKLVBNSEVMUF9DVExfQ09ERShJTlQ4NiAgICAgICAgICAgICAgICAgICAgICAgLDB4MDAxNSksCi1QTUhFTFBfQ1RMX0NPREUoSU5UODZYICAgICAgICAgICAgICAgICAgICAgICwweDAwMTYpLAotUE1IRUxQX0NUTF9DT0RFKENBTExSRUFMTU9ERSAgICAgICAgICAgICAgICAsMHgwMDE3KSwKLVBNSEVMUF9DVExfQ09ERShBTExPQ0xPQ0tFRCAgICAgICAgICAgICAgICAgLDB4MDAxOCksCi1QTUhFTFBfQ1RMX0NPREUoRlJFRUxPQ0tFRCAgICAgICAgICAgICAgICAgICwweDAwMTkpLAotUE1IRUxQX0NUTF9DT0RFKEVOQUJMRUxGQkNPTUIgICAgICAgICAgICAgICAsMHgwMDFBKSwKLVBNSEVMUF9DVExfQ09ERShHRVRQSFlTSUNBTEFERFIgICAgICAgICAgICAgLDB4MDAxQiksCi1QTUhFTFBfQ1RMX0NPREUoTUFMTE9DU0hBUkVEICAgICAgICAgICAgICAgICwweDAwMUQpLAotUE1IRUxQX0NUTF9DT0RFKEZSRUVTSEFSRUQgICAgICAgICAgICAgICAgICAsMHgwMDFGKSwKLVBNSEVMUF9DVExfQ09ERShMT0NLREFUQVBBR0VTICAgICAgICAgICAgICAgLDB4MDAyMCksCi1QTUhFTFBfQ1RMX0NPREUoVU5MT0NLREFUQVBBR0VTICAgICAgICAgICAgICwweDAwMjEpLAotUE1IRUxQX0NUTF9DT0RFKExPQ0tDT0RFUEFHRVMgICAgICAgICAgICAgICAsMHgwMDIyKSwKLVBNSEVMUF9DVExfQ09ERShVTkxPQ0tDT0RFUEFHRVMgICAgICAgICAgICAgLDB4MDAyMyksCi1QTUhFTFBfQ1RMX0NPREUoR0VUQ0FMTEdBVEUgICAgICAgICAgICAgICAgICwweDAwMjQpLAotUE1IRUxQX0NUTF9DT0RFKFNFVENOVFBBVEggICAgICAgICAgICAgICAgICAsMHgwMDI1KSwKLVBNSEVMUF9DVExfQ09ERShHRVRQREIgICAgICAgICAgICAgICAgICAgICAgLDB4MDAyNiksCi1QTUhFTFBfQ1RMX0NPREUoRkxVU0hUTEIgICAgICAgICAgICAgICAgICAgICwweDAwMjcpLAotUE1IRUxQX0NUTF9DT0RFKEdFVFBIWVNJQ0FMQUREUlJBTkdFICAgICAgICAsMHgwMDI4KSwKLVBNSEVMUF9DVExfQ09ERShBTExPQ1BBR0UgICAgICAgICAgICAgICAgICAgLDB4MDAyOSksCi1QTUhFTFBfQ1RMX0NPREUoRlJFRVBBR0UgICAgICAgICAgICAgICAgICAgICwweDAwMkEpLAotUE1IRUxQX0NUTF9DT0RFKEVOQUJMRVJJTkczSU9QTCAgICAgICAgICAgICAsMHgwMDJCKSwKLVBNSEVMUF9DVExfQ09ERShESVNBQkxFUklORzNJT1BMICAgICAgICAgICAgLDB4MDAyQyksCi1QTUhFTFBfQ1RMX0NPREUoR0FTRVRMT0NBTFBBVEggICAgICAgICAgICAgICwweDAwMkQpLAotUE1IRUxQX0NUTF9DT0RFKEdBR0VURVhQT1JUUyAgICAgICAgICAgICAgICAsMHgwMDJFKSwKLVBNSEVMUF9DVExfQ09ERShHQVRIVU5LICAgICAgICAgICAgICAgICAgICAgLDB4MDAyRiksCi1QTUhFTFBfQ1RMX0NPREUoU0VUTlVDTEVVU1BBVEggICAgICAgICAgICAgICwweDAwMzApLApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtYXBpLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkYWNlNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fUE1BUElfSAotI2RlZmluZSBfX1BNQVBJX0gKLQotI2luY2x1ZGUgInNjaXRlY2guaCIKLSNpbmNsdWRlICJwY2lsaWIuaCIKLSNpbmNsdWRlICJ6dGltZXJjLmgiCi0jaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19PUzJfVkREX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIFR5cGVkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBZb3Ugd2lsbCBuZWVkIHRvIGRlZmluZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBiZWZvcmUgeW91IGNvbXBpbGUgdGhpcwotICogbGlicmFyeSBmb3IgaXQgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgRE9TIGV4dGVuZGVyIHRoYXQgeW91IGFyZQotICogdXNpbmcgd2hlbiBjb21waWxpbmcgZm9yIGV4dGVuZGVkIERPUzoKLSAqCi0gKiAgICAgIFROVCAgICAgICAgIC0gUGhhciBMYXAgVE5UIERPUyBFeHRlbmRlcgotICogICAgICBET1M0R1cgICAgICAtIFJhdGlvbmFsIERPUy80R1csIERPUy80R1cgUHJvLCBDYXVzZXdheSBhbmQgUE1PREUvVwotICogICAgICBESkdQUCAgICAgICAtIERKR1BQIHBvcnQgb2YgR05VIEMrKwotICoKLSAqIElmIG5vbmUgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoaWNoIG9wZXJhdGluZwotICogc3lzdGVtIGlzIGJlaW5nIHRhcmdldHRlZCBhbmQgdGhlIGZvbGxvd2luZyB3aWxsIGJlIGRlZmluZWQgKHByb3ZpZGVkIGJ5Ci0gKiBzY2l0ZWNoLmggaGVhZGVyIGZpbGUpOgotICoKLSAqICAgICAgX19NU0RPUzE2X18gICAgIC0gRGVmYXVsdCBmb3IgMTYgYml0IE1TRE9TIG1vZGUKLSAqICAgICAgX19NU0RPUzMyX18gICAgIC0gRGVmYXVsdCBmb3IgMzIgYml0IE1TRE9TCi0gKiAgICAgIF9fV0lORE9XUzE2X18gICAtIERlZmF1bHQgZm9yIDE2IGJpdCBXaW5kb3dzCi0gKiAgICAgIF9fV0lORE9XUzMyX18gICAtIERlZmF1bHQgZm9yIDMyIGJpdCBXaW5kb3dzCi0gKgotICogT25lIG9mIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgZm9yIHlvdSB0byBzZWxlY3QKLSAqIHdoaWNoIG1lbW9yeSBtb2RlbCBpcyBpbiBlZmZlY3Q6Ci0gKgotICogICAgICBSRUFMTU9ERSAgICAtIDE2IGJpdCByZWFsIG1vZGUgKGxhcmdlIG1lbW9yeSBtb2RlbCkKLSAqICAgICAgUE0yODYgICAgICAgLSAxNiBwcm90ZWN0ZWQgbW9kZSAobGFyZ2UgbWVtb3J5IG1vZGVsKQotICogICAgICBQTTM4NiAgICAgICAtIDMyIHByb3RlY3RlZCBtb2RlIChmbGF0IG1lbW9yeSBtb2RlbCkKLSAqLwotCi0jaWYgZGVmaW5lZChfX1VOSVhfXykgJiYgIWRlZmluZWQoX01BWF9QQVRIKQotI2RlZmluZSBfTUFYX1BBVEggMjU2Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVE5UKSB8fCBkZWZpbmVkKERPU1gpIHx8IGRlZmluZWQoWDMyVk0pIHx8IGRlZmluZWQoRFBNSTMyKSAgICAgIFwKLSAgICB8fCBkZWZpbmVkKERPUzRHVykgfHwgZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChfX1dJTkRPV1MzMl9fKSAgICAgICAgICBcCi0gICAgfHwgZGVmaW5lZChfX01TRE9TMzJfXykgfHwgZGVmaW5lZChfX1VOSVhfXykgfHwgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSBcCi0gICAgfHwgZGVmaW5lZChfXzMyQklUX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKSB8fCBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLSNkZWZpbmUgUE0zODYKLSNlbGlmIGRlZmluZWQoRFBNSTE2KSB8fCBkZWZpbmVkKF9fV0lORE9XUzE2X18pCi0jZGVmaW5lIFBNMjg2Ci0jZWxzZQotI2RlZmluZSBSRUFMTU9ERQotI2VuZGlmCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKiBQcm92aWRlIHRoZSB0eXBlZGVmcyBmb3IgdGhlIFBNX2ludDM4NiBmdW5jdGlvbnMsIHdoaWNoIGlzc3VlIG5hdGl2ZQotICogaW50ZXJydXB0cyBpbiByZWFsIG9yIHByb3RlY3RlZCBtb2RlIGFuZCBjYW4gcGFzcyBleHRlbmRlZCByZWdpc3RlcnMKLSAqIGFyb3VuZC4KLSAqLwotCi1zdHJ1Y3QgX1BNRFdPUkRSRUdTIHsKLSAgICB1bG9uZyAgIGVheCxlYngsZWN4LGVkeCxlc2ksZWRpLGNmbGFnOwotICAgIH07Ci0KLXN0cnVjdCBfUE1XT1JEUkVHUyB7Ci0gICAgdXNob3J0ICBheCxheF9oaTsKLSAgICB1c2hvcnQgIGJ4LGJ4X2hpOwotICAgIHVzaG9ydCAgY3gsY3hfaGk7Ci0gICAgdXNob3J0ICBkeCxkeF9oaTsKLSAgICB1c2hvcnQgIHNpLHNpX2hpOwotICAgIHVzaG9ydCAgZGksZGlfaGk7Ci0gICAgdXNob3J0ICBjZmxhZyxjZmxhZ19oaTsKLSAgICB9OwotCi1zdHJ1Y3QgX1BNQllURVJFR1MgewotICAgIHVjaGFyICAgYWwsIGFoOyB1c2hvcnQgYXhfaGk7Ci0gICAgdWNoYXIgICBibCwgYmg7IHVzaG9ydCBieF9oaTsKLSAgICB1Y2hhciAgIGNsLCBjaDsgdXNob3J0IGN4X2hpOwotICAgIHVjaGFyICAgZGwsIGRoOyB1c2hvcnQgZHhfaGk7Ci0gICAgfTsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgc3RydWN0ICBfUE1EV09SRFJFR1MgZTsKLSAgICBzdHJ1Y3QgIF9QTVdPUkRSRUdTICB4OwotICAgIHN0cnVjdCAgX1BNQllURVJFR1MgIGg7Ci0gICAgfSBQTVJFR1M7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1c2hvcnQgIGVzOwotICAgIHVzaG9ydCAgY3M7Ci0gICAgdXNob3J0ICBzczsKLSAgICB1c2hvcnQgIGRzOwotICAgIHVzaG9ydCAgZnM7Ci0gICAgdXNob3J0ICBnczsKLSAgICB9IFBNU1JFR1M7Ci0KLS8qIFByb3ZpZGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWFsIG1vZGUgcmVnaXN0ZXIgc3RydWN0dXJlcyBwYXNzZWQgdG8KLSAqIHRoZSBQTV9pbnQ4NigpIGFuZCBQTV9pbnQ4NngoKSByb3V0aW5lcy4gTm90ZSB0aGF0IHdlIHByb3ZpZGUgb3VyIG93bgotICogZnVuY3Rpb25zIHRvIGRvIHRoaXMgZm9yIDE2LWJpdCBjb2RlIHRoYXQgY2FsbHMgdGhlIFBNX2ludDM4NiBmdW5jdGlvbnMuCi0gKi8KLQotdHlwZWRlZiBQTVJFR1MgIFJNUkVHUzsKLXR5cGVkZWYgUE1TUkVHUyBSTVNSRUdTOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbG9uZyAgICBlZGk7Ci0gICAgbG9uZyAgICBlc2k7Ci0gICAgbG9uZyAgICBlYnA7Ci0gICAgbG9uZyAgICByZXNlcnZlZDsKLSAgICBsb25nICAgIGVieDsKLSAgICBsb25nICAgIGVkeDsKLSAgICBsb25nICAgIGVjeDsKLSAgICBsb25nICAgIGVheDsKLSAgICBzaG9ydCAgIGZsYWdzOwotICAgIHNob3J0ICAgZXMsZHMsZnMsZ3MsaXAsY3Msc3Asc3M7Ci0gICAgfSBEUE1JX3JlZ3M7Ci0KLSNpZmRlZiAgX19NU0RPU19fCi0vKiBSZWdpc3RlciBzdHJ1Y3R1cmUgcGFzc2VkIHRvIFBNX1Z4RENhbGwgZnVuY3Rpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGVheDsKLSAgICB1bG9uZyAgIGVieDsKLSAgICB1bG9uZyAgIGVjeDsKLSAgICB1bG9uZyAgIGVkeDsKLSAgICB1bG9uZyAgIGVzaTsKLSAgICB1bG9uZyAgIGVkaTsKLSAgICB1c2hvcnQgIGRzLGVzOwotICAgIH0gVlhEX3JlZ3M7Ci0jZW5kaWYKLQotI2RlZmluZSBQTV9NQVhfRFJJVkUgICAgICAgICAgICAgICAgMwotI2RlZmluZSBQTV9NQVhfUEFUSCAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIFBNX0ZJTEVfSU5WQUxJRCAgICAgICAgICAgICAodm9pZCopMHhGRkZGRkZGRgotCi0vKiBTdHJ1Y3R1cmUgZm9yIGdlbmVyaWMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhbmQgbWFuYWdlbWVudC4gQWxzbyB0aGUgc2FtZQotICogdmFsdWVzIGFyZSBwYXNzZWQgdG8gUE1fc2V0RmlsZUF0dHIgdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgZHdTaXplOwotICAgIHVsb25nICAgYXR0cmliOwotICAgIHVsb25nICAgc2l6ZUxvOwotICAgIHVsb25nICAgc2l6ZUhpOwotICAgIGNoYXIgICAgbmFtZVtQTV9NQVhfUEFUSF07Ci0gICAgfSBQTV9maW5kRGF0YTsKLQotLyogTWFjcm8gdG8gY29tcHV0ZSB0aGUgYnl0ZSBvZmZzZXQgb2YgYSBmaWVsZCBpbiBhIHN0cnVjdHVyZSBvZiB0eXBlIHR5cGUgKi8KLQotI2RlZmluZSBQTV9GSUVMRF9PRkZTRVQodHlwZSxmaWVsZCkgKChsb25nKSYoKCh0eXBlKikwKS0+ZmllbGQpKQotCi0vKiBNYXJjdG8gdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgYmFzZSBvZiB0aGUgc3RydWN0dXJlIGdpdmVuIGl0cyB0eXBlLAotICogYW5kIGFuIGFkZHJlc3Mgb2YgYSBmaWVsZCB3aXRoaW4gdGhlIHN0cnVjdHVyZS4KLSAqLwotCi0jZGVmaW5lIFBNX0NPTlRBSU5JTkdfUkVDT1JEKGFkZHJlc3MsIHR5cGUsIGZpZWxkKSAgICAgIFwKLSAgICAoKHR5cGUqKSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChjaGFyKikoYWRkcmVzcykgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGNoYXIqKSgmKCh0eXBlKikwKS0+ZmllbGQpKSkKLQotLyogRmxhZ3Mgc3RvcmVkIGluIHRoZSBQTV9maW5kRGF0YSBzdHJ1Y3R1cmUsIGFuZCBhbHNvIHZhbHVlcyBwYXNzZWQgdG8KLSAqIFBNX3NldEZpbGVBdHRyIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzLgotICovCi0KLSNkZWZpbmUgUE1fRklMRV9OT1JNQUwgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE1fRklMRV9SRUFET05MWSAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUE1fRklMRV9ESVJFQ1RPUlkgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUE1fRklMRV9BUkNISVZFICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUE1fRklMRV9ISURERU4gICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUE1fRklMRV9TWVNURU0gICAgICAgICAgICAgIDB4MDAwMDAwMTAKLQotLyogRmxhZ3MgcmV0dXJuZWQgYnkgdGhlIFBNX3NwbGl0cGF0aCBmdW5jdGlvbiAqLwotCi0jZGVmaW5lIFBNX0hBU19XSUxEQ0FSRFMgMHgwMQotI2RlZmluZSBQTV9IQVNfRVhURU5TSU9OIDB4MDIKLSNkZWZpbmUgUE1fSEFTX0ZJTEVOQU1FICAweDA0Ci0jZGVmaW5lIFBNX0hBU19ESVJFQ1RPUlkgMHgwOAotI2RlZmluZSBQTV9IQVNfRFJJVkUgICAgIDB4MTAKLQotLyogU3RydWN0dXJlIHBhc3NlZCB0byB0aGUgUE1fc2V0RmlsZVRpbWUgZnVuY3Rpb25zICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc2hvcnQgICBzZWM7ICAgICAgICAvKiBTZWNvbmRzICovCi0gICAgc2hvcnQgICBtaW47ICAgICAgICAvKiBNaW51dGVzICovCi0gICAgc2hvcnQgICBob3VyOyAgICAgICAvKiBIb3VyICgwLS0yMykgKi8KLSAgICBzaG9ydCAgIGRheTsgICAgICAgIC8qIERheSBvZiBtb250aCAoMS0tMzEpICovCi0gICAgc2hvcnQgICBtb247ICAgICAgICAvKiBNb250aCAoMC0tMTEpICovCi0gICAgc2hvcnQgICB5ZWFyOyAgICAgICAvKiBZZWFyIChjYWxlbmRhciB5ZWFyIG1pbnVzIDE5MDApICovCi0gICAgfSBQTV90aW1lOwotCi0vKiBEZWZpbmUgYSBtYWNybyBmb3IgY3JlYXRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMgZnJvbSBzZWdtZW50Om9mZnNldCAqLwotCi0jZGVmaW5lIE1LX1BIWVMocyxvKSAgKCgodWxvbmcpKHMpIDw8IDQpICsgKHVsb25nKShvKSkKLQotLyogRGVmaW5lIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgbW9kZXMgc3VwcG9ydGVkLiBUaGlzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlCi0gKiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdHlwZSBhdCBydW50aW1lIHdoaWNoIHdpbGwgY29udGFpbgotICogb25lIG9mIHRoZXNlIHZhbHVlcy4KLSAqLwotCi10eXBlZGVmIGVudW0gewotICAgIFBNX3JlYWxNb2RlLAotICAgIFBNXzI4NiwKLSAgICBQTV8zODYKLSAgICB9IFBNX21vZGVfZW51bTsKLQotLyogRGVmaW5lIHR5cGVzIHBhc3NlZCB0byBQTV9lbmFibGVXcml0ZUNvbWJpbmUgKi8KLQotI2RlZmluZSBQTV9NVFJSX1VOQ0FDSEFCTEUgIDAKLSNkZWZpbmUgUE1fTVRSUl9XUkNPTUIgICAgICAxCi0jZGVmaW5lIFBNX01UUlJfV1JUSFJPVUdIICAgNAotI2RlZmluZSBQTV9NVFJSX1dSUFJPVCAgICAgIDUKLSNkZWZpbmUgUE1fTVRSUl9XUkJBQ0sgICAgICA2Ci0jZGVmaW5lIFBNX01UUlJfTUFYICAgICAgICAgNgotCi0vKiBFcnJvciBjb2RlcyByZXR1cm5lZCBieSBQTV9lbmFibGVXcml0ZUNvbWJpbmUgKi8KLQotI2RlZmluZSBQTV9NVFJSX0VSUl9PSyAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUE1fTVRSUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAtMQotI2RlZmluZSBQTV9NVFJSX0VSUl9QQVJBTVMgICAgICAgICAgICAgIC0yCi0jZGVmaW5lIFBNX01UUlJfRVJSX05PVF80S0JfQUxJR05FRCAgICAgLTMKLSNkZWZpbmUgUE1fTVRSUl9FUlJfQkVMT1dfMU1CICAgICAgICAgICAtNAotI2RlZmluZSBQTV9NVFJSX0VSUl9OT1RfQUxJR05FRCAgICAgICAgIC01Ci0jZGVmaW5lIFBNX01UUlJfRVJSX09WRVJMQVAgICAgICAgICAgICAgLTYKLSNkZWZpbmUgUE1fTVRSUl9FUlJfVFlQRV9NSVNNQVRDSCAgICAgICAtNwotI2RlZmluZSBQTV9NVFJSX0VSUl9OT05FX0ZSRUUgICAgICAgICAgIC04Ci0jZGVmaW5lIFBNX01UUlJfRVJSX05PV1JDT01CICAgICAgICAgICAgLTkKLSNkZWZpbmUgUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVCAgICAgICAtMTAKLQotLyogVmFsdWVzIHBhc3NlZCB0byB0aGUgUE1fRE1BQ1Byb2dyYW0gZnVuY3Rpb24gKi8KLQotI2RlZmluZSBQTV9ETUFfUkVBRF9PTkVTSE9UICAgICAweDQ0ICAgIC8qIE9uZS1zaG90IERNQSByZWFkICAgICAgICAqLwotI2RlZmluZSBQTV9ETUFfV1JJVEVfT05FU0hPVCAgICAweDQ4ICAgIC8qIE9uZS1zaG90IERNQSB3cml0ZSAgICAgICAqLwotI2RlZmluZSBQTV9ETUFfUkVBRF9BVVRPSU5JVCAgICAweDU0ICAgIC8qIEF1dG8taW5pdCBETUEgcmVhZCAgICAgICAqLwotI2RlZmluZSBQTV9ETUFfV1JJVEVfQVVUT0lOSVQgICAweDU4ICAgIC8qIEF1dG8taW5pdCBETUEgd3JpdGUgICAgICAqLwotCi0vKiBGbGFncyBwYXNzZWQgdG8gc3VzcGVuZCBhcHBsaWNhdGlvbiBjYWxsYmFjayAqLwotCi0jZGVmaW5lIFBNX0RFQUNUSVZBVEUgICAgICAgMQotI2RlZmluZSBQTV9SRUFDVElWQVRFICAgICAgIDIKLQotLyogUmV0dXJuIGNvZGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiByZXR1cm4gZnJvbSB0aGUgc3VzcGVuZCBhcHBsaWNhdGlvbgotICogY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIHRoZSBQTSBsaWJyYXJ5LiBTZWUgdGhlIE1HTCBkb2N1bWVudGF0aW9uIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi0jZGVmaW5lIFBNX1NVU1BFTkRfQVBQICAgICAgMAotI2RlZmluZSBQTV9OT19TVVNQRU5EX0FQUCAgIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHR5cGUgdmFsdWVzIHBhc3NlZCB0byB0aGUgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsCi1mdW5jdGlvbiwgdG8gZGVmaW5lIGhvdyB0aGUgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcgc2hvdWxkIGJlIGhhbmRsZWQuCi0KLVRoZSBQTV9hZ3BVbmNhY2hlZCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZCBhcwotdW5jYWNoZWQgbWVtb3J5LgotCi1UaGUgUE1fYWdwV3JpdGVDb21iaW5lIHR5cGUgaW5kaWNhdGVzIHRoYXQgd3JpdGUgY29tYmluaW5nIHNob3VsZCBiZSBlbmFibGVkCi1mb3IgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcuIFRoaXMgaXMgdXNlZCBmb3IgZnJhbWVidWZmZXIgd3JpdGUgY29tYmluZyBhbmQKLXNwZWVkcyB1cCBkaXJlY3QgZnJhbWVidWZmZXIgd3JpdGVzIHRvIHRoZSBtZW1vcnkuCi0KLVRoZSBQTV9hZ3BJbnRlbERDQUNIRSB0eXBlIGluZGljYXRlcyB0aGF0IG1lbW9yeSBzaG91bGQgY29tZSBmcm9tIHRoZSBJbnRlbAotaTgxeCBEaXNwbGF5IENhY2hlIChvciBEQ0FDSEUpIG1lbW9yeSBwb29sLiBUaGlzIGZsYWcgaXMgc3BlY2lmaWMgdG8gdGhlCi1JbnRlbCBpODEwIGFuZCBpODE1IGNvbnRyb2xsZXJzLCBhbmQgc2hvdWxkIG5vdCBiZSBwYXNzZWQgZm9yIGFueSBvdGhlcgotY29udHJvbGxlciB0eXBlLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLU1FTUJFUlM6Ci1QTV9hZ3BVbmNhY2hlZCAgICAgIC0gSW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeSBzaG91bGQgYmUgdW5jYWNoZWQKLVBNX2FncFdyaXRlQ29tYmluZSAgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVtb3J5IHNob3VsZCBiZSB3cml0ZSBjb21iaW5lZAotUE1fYWdwSW50ZWxEQ0FDSEUgICAtIEluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkgc2hvdWxkIGNvbWUgZnJvbSBEQ0FDSEUgcG9vbAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgUE1fYWdwVW5jYWNoZWQsCi0gICAgUE1fYWdwV3JpdGVDb21iaW5lLAotICAgIFBNX2FncEludGVsRENBQ0hFCi0gICAgfSBQTV9hZ3BNZW1vcnlUeXBlOwotCi0vKiBEZWZpbmVzIHRoZSBzaXplIG9mIGFuIHN5c3RlbSBtZW1vcnkgcGFnZSAqLwotCi0jZGVmaW5lIFBNX1BBR0VfU0laRSAgICAgICAgNDA5NgotCi0vKiBUeXBlIGRlZmluaXRpb24gZm9yIGEgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFBNX3BoeXNBZGRyOwotCi0vKiBEZWZpbmUgYSBiYWQgcGh5c2ljYWwgYWRkcmVzcyByZXR1cm5lZCBieSBtYXAgcGh5c2ljYWwgZnVuY3Rpb25zICovCi0KLSNkZWZpbmUgUE1fQkFEX1BIWVNfQUREUkVTUyAweEZGRkZGRkZGCi0KLS8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIDEyLWJ5dGUgbG9jayBoYW5kbGUgZm9yIGxvY2tpbmcgbGluZWFyIG1lbW9yeSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBoWzNdOwotICAgIH0gUE1fbG9ja0hhbmRsZTsKLQotLyogJ0MnIGNhbGxpbmcgY29udmVudGlvbnMgYWx3YXlzICAgICAgICovCi0KLSNkZWZpbmUgUE1BUEkgICBfQVNNQVBJCi0jZGVmaW5lIFBNQVBJUCAgX0FTTUFQSVAKLQotLyogSW50ZXJuYWwgdHlwZWRlZiB0byBvdmVycmlkZSBEUE1JX2ludDg2IGhhbmRsZXIgKi8KLQotdHlwZWRlZiBpYm9vbCAoUE1BUElQIERQTUlfaGFuZGxlcl90KShEUE1JX3JlZ3MgKnJlZ3MpOwotdm9pZCBQTUFQSSBEUE1JX3NldEludDEwSGFuZGxlcihEUE1JX2hhbmRsZXJfdCBoYW5kbGVyKTsKLQotLyogVHlwZSBkZWZpbml0aW9ucyBmb3IgYSB3aW5kb3cgaGFuZGxlIGZvciBjb25zb2xlIG1vZGVzICovCi0KLSNpZiAgICAgZGVmaW5lZChfX0RSSVZFUl9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLXR5cGVkZWYgdm9pZCAgICAgICAgKlBNX0hXTkQ7ICAgLyogUG9pbnRlciBmb3IgcG9ydGFibGUgZHJpdmVycyAgICAgICAgICovCi10eXBlZGVmIHZvaWQgICAgICAgICpQTV9NT0RVTEU7IC8qIE1vZHVsZSBoYW5kbGUgZm9yIHBvcnRhYmxlIGRyaXZlcnMgICAqLwotI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XU19fKQotI2lmZGVmICBERUNMQVJFX0hBTkRMRQotdHlwZWRlZiBIV05EICAgICAgICBQTV9IV05EOyAgICAvKiBSZWFsIHdpbmRvdyBoYW5kbGUgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgSElOU1RBTkNFICAgUE1fTU9EVUxFOyAgLyogV2luMzIgRExMIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICovCi0jZWxzZQotdHlwZWRlZiB2b2lkICAgICAgICAqUE1fSFdORDsgICAvKiBQbGFjZSBob2xkZXIgaWYgd2luZG93cy5oIG5vdCBpbmNsdWRlZCAqLwotdHlwZWRlZiB2b2lkICAgICAgICAqUE1fTU9EVUxFOyAvKiBQbGFjZSBob2xkZXIgaWYgd2luZG93cy5oIG5vdCBpbmNsdWRlZCAqLwotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19VU0VfWDExX18pCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgV2luZG93ICAgICAgKndpbmRvdzsKLSAgICBEaXNwbGF5ICAgICAqZGlzcGxheTsKLSAgICB9IFBNX0hXTkQ7ICAgICAgICAgICAgICAgICAgLyogWDExIHdpbmRvdyBoYW5kbGUgKi8KLSNlbGlmICAgZGVmaW5lZChfX09TMl9fKQotdHlwZWRlZiB2b2lkICAgICpQTV9IV05EOwotdHlwZWRlZiB2b2lkICAgICpQTV9NT0RVTEU7Ci0jZWxpZiAgIGRlZmluZWQoX19MSU5VWF9fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBDb25zb2xlIGlkIGZvciBmdWxsc2NyZWVuIExpbnV4ICovCi10eXBlZGVmIHZvaWQgICAgKlBNX01PRFVMRTsKLSNlbGlmICAgZGVmaW5lZChfX1FOWF9fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBDb25zb2xlIGlkIGZvciBmdWxsc2NyZWVuIFFOWCAqLwotdHlwZWRlZiB2b2lkICAgICpQTV9NT0RVTEU7Ci0jZWxpZiAgIGRlZmluZWQoX19SVFRBUkdFVF9fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBQbGFjZWhvbGRlciBmb3IgUlRUYXJnZXQtMzIgKi8KLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOwotI2VsaWYgICBkZWZpbmVkKF9fUkVBTERPU19fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBQbGFjZWhvbGRlciBmb3IgZnVsbHNjcmVlbiBET1MgKi8KLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOyAgICAgLyogUGxhY2Vob2xkZXIgZm9yIGZ1bGxzY3JlZW4gRE9TICovCi0jZWxpZiAgIGRlZmluZWQoX19TTVgzMl9fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBQbGFjZWhvbGRlciBmb3IgZnVsbHNjcmVlbiBTTVggKi8KLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOwotI2VsaWYgICBkZWZpbmVkKF9fU05BUF9fKQotdHlwZWRlZiB2b2lkICAgICpQTV9IV05EOwotdHlwZWRlZiB2b2lkICAgICpQTV9NT0RVTEU7Ci0jZWxzZQotI2Vycm9yICBQTSBsaWJyYXJ5IG5vdCBwb3J0ZWQgdG8gdGhpcyBwbGF0Zm9ybSB5ZXQhCi0jZW5kaWYKLQotLyogVHlwZSBkZWZpbml0aW9uIGZvciBjb2RlIHBvaW50ZXJzICovCi0KLXR5cGVkZWYgdm9pZCAoKl9fY29kZVB0cikoKTsKLQotLyogVHlwZSBkZWZpbml0aW9uIGZvciBhIEMgYmFzZWQgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQotdHlwZWRlZiB2b2lkIChQTUFQSVAgUE1faW50SGFuZGxlcikodm9pZCk7Ci10eXBlZGVmIGlib29sIChQTUFQSVAgUE1faXJxSGFuZGxlcikodm9pZCk7Ci0KLS8qIEhhcmR3YXJlIElSUSBoYW5kbGUgdXNlZCB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBoYXJkd2FyZSBJUlEgKi8KLQotdHlwZWRlZiB2b2lkICpQTV9JUlFIYW5kbGU7Ci0KLS8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGZhdGFsIGNsZWFudXAgaGFuZGxlciAqLwotCi10eXBlZGVmIHZvaWQgKFBNQVBJUCBQTV9mYXRhbENsZWFudXBIYW5kbGVyKSh2b2lkKTsKLQotLyogVHlwZSBkZWZpZmluaXRpb24gZm9yIHNhdmUgc3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQotdHlwZWRlZiBpbnQgKFBNQVBJUCBQTV9zYXZlU3RhdGVfY2IpKGludCBmbGFncyk7Ci0KLS8qIFR5cGUgZGVmaW5pbnRpb24gZm9yIGVudW0gd3JpdGUgY29tYmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQotdHlwZWRlZiB2b2lkIChQTUFQSVAgUE1fZW51bVdyaXRlQ29tYmluZV90KSh1bG9uZyBiYXNlLHVsb25nIGxlbmd0aCx1aW50IHR5cGUpOwotCi0vKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgYWxsIHRoZSBQTSBBUEkgZnVuY3Rpb25zIGFzIGV4cG9ydGVkIHRvCi0gKiB0aGUgYmluYXJ5IHBvcnRhYmxlIERMTCdzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGR3U2l6ZTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0TW9kZVR5cGUpKHZvaWQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9nZXRCSU9TUG9pbnRlcikodm9pZCk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2dldEEwMDAwUG9pbnRlcikodm9pZCk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX21hcFBoeXNpY2FsQWRkcikodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX21hbGxvY1NoYXJlZCkobG9uZyBzaXplKTsKLSAgICB2b2lkICogIHJlc2VydmVkMTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZVNoYXJlZCkodm9pZCAqcHRyKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fbWFwVG9Qcm9jZXNzKSh2b2lkICpsaW5lYXIsdWxvbmcgbGltaXQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9tYXBSZWFsUG9pbnRlcikodWludCByX3NlZyx1aW50IHJfb2ZmKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fYWxsb2NSZWFsU2VnKSh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9mcmVlUmVhbFNlZykodm9pZCAqbWVtKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fYWxsb2NMb2NrZWRNZW0pKHVpbnQgc2l6ZSx1bG9uZyAqcGh5c0FkZHIsaWJvb2wgY29udGlndW91cyxpYm9vbCBiZWxvdzE2TWVnKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZUxvY2tlZE1lbSkodm9pZCAqcCx1aW50IHNpemUsaWJvb2wgY29udGlndW91cyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2NhbGxSZWFsTW9kZSkodWludCBzZWcsdWludCBvZmYsIFJNUkVHUyAqcmVncyxSTVNSRUdTICpzcmVncyk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2ludDg2KShpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1faW50ODZ4KShpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LFJNU1JFR1MgKnNyZWdzKTsKLSAgICB2b2lkICAgIChQTUFQSVAgRFBNSV9pbnQ4NikoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9hdmFpbGFibGVNZW1vcnkpKHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9nZXRWRVNBQnVmKSh1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKTsKLSAgICBsb25nICAgIChQTUFQSVAgUE1fZ2V0T1NUeXBlKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZmF0YWxFcnJvcikoY29uc3QgY2hhciAqbXNnKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0QmFua0EpKGludCBiYW5rKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0QmFua0FCKShpbnQgYmFuayk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldENSVFN0YXJ0KShpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCk7Ci0gICAgY2hhciAqICAoUE1BUElQIFBNX2dldEN1cnJlbnRQYXRoKShjaGFyICpwYXRoLGludCBtYXhMZW4pOwotICAgIGNvbnN0IGNoYXIgKiAoUE1BUElQIFBNX2dldFZCRUFGUGF0aCkodm9pZCk7Ci0gICAgY29uc3QgY2hhciAqIChQTUFQSVAgUE1fZ2V0TnVjbGV1c1BhdGgpKHZvaWQpOwotICAgIGNvbnN0IGNoYXIgKiAoUE1BUElQIFBNX2dldE51Y2xldXNDb25maWdQYXRoKSh2b2lkKTsKLSAgICBjb25zdCBjaGFyICogKFBNQVBJUCBQTV9nZXRVbmlxdWVJRCkodm9pZCk7Ci0gICAgY29uc3QgY2hhciAqIChQTUFQSVAgUE1fZ2V0TWFjaGluZU5hbWUpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBWRl9hdmFpbGFibGUpKHZvaWQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBWRl9pbml0KSh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpOwotICAgIHZvaWQgICAgKFBNQVBJUCBWRl9leGl0KSh2b2lkKTsKLSAgICBQTV9IV05EIChQTUFQSVAgUE1fb3BlbkNvbnNvbGUpKFBNX0hXTkQgaHduZFVzZXIsaW50IGRldmljZSxpbnQgeFJlcyxpbnQgeVJlcyxpbnQgYnBwLGlib29sIGZ1bGxTY3JlZW4pOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9nZXRDb25zb2xlU3RhdGVTaXplKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2F2ZUNvbnNvbGVTdGF0ZSkodm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUpKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9jbG9zZUNvbnNvbGUpKFBNX0hXTkQgaHduZENvbnNvbGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKShpbnQgeCxpbnQgeSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldE9TU2NyZWVuV2lkdGgpKGludCB3aWR0aCxpbnQgaGVpZ2h0KTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZW5hYmxlV3JpdGVDb21iaW5lKSh1bG9uZyBiYXNlLHVsb25nIGxlbmd0aCx1aW50IHR5cGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9iYWNrc2xhc2gpKGNoYXIgKmZpbGVuYW1lKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fbG9ja0RhdGFQYWdlcykodm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fdW5sb2NrRGF0YVBhZ2VzKSh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9sb2NrQ29kZVBhZ2VzKShfX2NvZGVQdHIgcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fdW5sb2NrQ29kZVBhZ2VzKShfX2NvZGVQdHIgcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIpKFBNX2ludEhhbmRsZXIgaWgsaW50IGZyZXF1ZW5jeSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3kpKGludCBmcmVxdWVuY3kpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9kb0JJT1NQT1NUKSh1c2hvcnQgYXhWYWwsdWxvbmcgQklPU1BoeXNBZGRyLHZvaWQgKkJJT1NQdHIsdWxvbmcgQklPU0xlbik7Ci0gICAgY2hhciAgICAoUE1BUElQIFBNX2dldEJvb3REcml2ZSkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVQaHlzaWNhbEFkZHIpKHZvaWQgKnB0cix1bG9uZyBsaW1pdCk7Ci0gICAgdWNoYXIgICAoUE1BUElQIFBNX2lucGIpKGludCBwb3J0KTsKLSAgICB1c2hvcnQgIChQTUFQSVAgUE1faW5wdykoaW50IHBvcnQpOwotICAgIHVsb25nICAgKFBNQVBJUCBQTV9pbnBkKShpbnQgcG9ydCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX291dHBiKShpbnQgcG9ydCx1Y2hhciB2YWwpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9vdXRwdykoaW50IHBvcnQsdXNob3J0IHZhbCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX291dHBkKShpbnQgcG9ydCx1bG9uZyB2YWwpOwotICAgIHZvaWQgKiAgcmVzZXJ2ZWQyOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2spKFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9oYXZlQklPU0FjY2Vzcykodm9pZCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2tiaGl0KSh2b2lkKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0Y2gpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9maW5kQlBEKShjb25zdCBjaGFyICpkbGxuYW1lLGNoYXIgKmJwZHBhdGgpOwotICAgIHVsb25nICAgKFBNQVBJUCBQTV9nZXRQaHlzaWNhbEFkZHIpKHZvaWQgKnApOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zbGVlcCkodWxvbmcgbWlsbGlzZWNvbmRzKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0Q09NUG9ydCkoaW50IHBvcnQpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9nZXRMUFRQb3J0KShpbnQgcG9ydCk7Ci0gICAgUE1fTU9EVUxFIChQTUFQSVAgUE1fbG9hZExpYnJhcnkpKGNvbnN0IGNoYXIgKnN6RExMTmFtZSk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2dldFByb2NBZGRyZXNzKShQTV9NT0RVTEUgaE1vZHVsZSxjb25zdCBjaGFyICpzelByb2NOYW1lKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZUxpYnJhcnkpKFBNX01PRFVMRSBoTW9kdWxlKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUENJX2VudW1lcmF0ZSkoUENJRGV2aWNlSW5mbyBpbmZvW10pOwotICAgIHVsb25nICAgKFBNQVBJUCBQQ0lfYWNjZXNzUmVnKShpbnQgaW5kZXgsdWxvbmcgdmFsdWUsaW50IGZ1bmMsUENJRGV2aWNlSW5mbyAqaW5mbyk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBDSV9zZXRIYXJkd2FyZUlSUSkoUENJRGV2aWNlSW5mbyAqaW5mbyx1aW50IGludFBpbix1aW50IElSUSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBDSV9nZW5lcmF0ZVNwZWNpYWxDeWxlKSh1aW50IGJ1cyx1bG9uZyBzcGVjaWFsQ3ljbGVEYXRhKTsKLSAgICB2b2lkICogIHJlc2VydmVkMzsKLSAgICB1bG9uZyAgIChQTUFQSVAgUENJQklPU19nZXRFbnRyeSkodm9pZCk7Ci0gICAgdWludCAgICAoUE1BUElQIENQVV9nZXRQcm9jZXNzb3JUeXBlKSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgQ1BVX2hhdmVNTVgpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBDUFVfaGF2ZTNETm93KSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgQ1BVX2hhdmVTU0UpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBDUFVfaGF2ZVJEVFNDKSh2b2lkKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgQ1BVX2dldFByb2Nlc3NvclNwZWVkKShpYm9vbCBhY2N1cmF0ZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFpUaW1lckluaXQpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBMWlRpbWVyT24pKHZvaWQpOwotICAgIHVsb25nICAgKFBNQVBJUCBMWlRpbWVyTGFwKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgTFpUaW1lck9mZikodm9pZCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIExaVGltZXJDb3VudCkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIExaVGltZXJPbkV4dCkoTFpUaW1lck9iamVjdCAqdG0pOwotICAgIHVsb25nICAgKFBNQVBJUCBMWlRpbWVyTGFwRXh0KShMWlRpbWVyT2JqZWN0ICp0bSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIExaVGltZXJPZmZFeHQpKExaVGltZXJPYmplY3QgKnRtKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgTFpUaW1lckNvdW50RXh0KShMWlRpbWVyT2JqZWN0ICp0bSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFVMWlRpbWVyT24pKHZvaWQpOwotICAgIHVsb25nICAgKFBNQVBJUCBVTFpUaW1lckxhcCkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFVMWlRpbWVyT2ZmKSh2b2lkKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgVUxaVGltZXJDb3VudCkodm9pZCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIFVMWlJlYWRUaW1lKSh2b2lkKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgVUxaRWxhcHNlZFRpbWUpKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFVMWlRpbWVyUmVzb2x1dGlvbikodWxvbmcgKnJlc29sdXRpb24pOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9maW5kRmlyc3RGaWxlKShjb25zdCBjaGFyICpmaWxlbmFtZSxQTV9maW5kRGF0YSAqZmluZERhdGEpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9maW5kTmV4dEZpbGUpKHZvaWQgKmhhbmRsZSxQTV9maW5kRGF0YSAqZmluZERhdGEpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9maW5kQ2xvc2UpKHZvaWQgKmhhbmRsZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX21ha2VwYXRoKShjaGFyICpwLGNvbnN0IGNoYXIgKmRyaXZlLGNvbnN0IGNoYXIgKmRpcixjb25zdCBjaGFyICpuYW1lLGNvbnN0IGNoYXIgKmV4dCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX3NwbGl0cGF0aCkoY29uc3QgY2hhciAqZm4sY2hhciAqZHJpdmUsY2hhciAqZGlyLGNoYXIgKm5hbWUsY2hhciAqZXh0KTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fZHJpdmVWYWxpZCkoY2hhciBkcml2ZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2dldGRjd2QpKGludCBkcml2ZSxjaGFyICpkaXIsaW50IGxlbik7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldEZpbGVBdHRyKShjb25zdCBjaGFyICpmaWxlbmFtZSx1aW50IGF0dHJpYik7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX21rZGlyKShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX3JtZGlyKShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgdWludCAgICAoUE1BUElQIFBNX2dldEZpbGVBdHRyKShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2dldEZpbGVUaW1lKShjb25zdCBjaGFyICpmaWxlbmFtZSxpYm9vbCBnbXRUaW1lLFBNX3RpbWUgKnRpbWUpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9zZXRGaWxlVGltZSkoY29uc3QgY2hhciAqZmlsZW5hbWUsaWJvb2wgZ210VGltZSxQTV90aW1lICp0aW1lKTsKLSAgICBjaGFyICogIChQTUFQSVAgQ1BVX2dldFByb2Nlc3Nvck5hbWUpKHZvaWQpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9nZXRWR0FTdGF0ZVNpemUpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zYXZlVkdBU3RhdGUpKHZvaWQgKnN0YXRlQnVmKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fcmVzdG9yZVZHQVN0YXRlKShjb25zdCB2b2lkICpzdGF0ZUJ1Zik7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3ZnYUJsYW5rRGlzcGxheSkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3ZnYVVuYmxhbmtEaXNwbGF5KSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fYmxvY2tVbnRpbFRpbWVvdXQpKHVsb25nIG1pbGxpc2Vjb25kcyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9hZGQ2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9zdWI2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9tdWw2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9kaXY2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9zaHI2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fc2FyNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKLSAgICB2b2lkICAgIChQTUFQSVAgX1BNX3NobDY0KSh1MzIgYV9sb3csczMyIGFfaGlnaCxzMzIgc2hpZnQsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9uZWc2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIFBDSV9maW5kQkFSU2l6ZSkoaW50IGJhcixQQ0lEZXZpY2VJbmZvICpwY2kpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQQ0lfcmVhZFJlZ0Jsb2NrKShQQ0lEZXZpY2VJbmZvICppbmZvLGludCBpbmRleCx2b2lkICpkc3QsaW50IGNvdW50KTsKLSAgICB2b2lkICAgIChQTUFQSVAgUENJX3dyaXRlUmVnQmxvY2spKFBDSURldmljZUluZm8gKmluZm8saW50IGluZGV4LHZvaWQgKnNyYyxpbnQgY291bnQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9mbHVzaFRMQikodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3VzZUxvY2FsTWFsbG9jKSh2b2lkICogKCptYWxsb2MpKHNpemVfdCBzaXplKSx2b2lkICogKCpjYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSksdm9pZCAqICgqcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKSx2b2lkICgqZnJlZSkodm9pZCAqcCkpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9tYWxsb2MpKHNpemVfdCBzaXplKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9yZWFsbG9jKSh2b2lkICpwdHIsc2l6ZV90IHNpemUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9mcmVlKSh2b2lkICpwKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UpKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcyk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2FsbG9jUGFnZSkoaWJvb2wgbG9ja2VkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZVBhZ2UpKHZvaWQgKnApOwotICAgIHVsb25nICAgKFBNQVBJUCBQTV9hZ3BJbml0KSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fYWdwRXhpdCkodm9pZCk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2FncFJlc2VydmVQaHlzaWNhbCkodWxvbmcgbnVtUGFnZXMsaW50IHR5cGUsdm9pZCAqKnBoeXNDb250ZXh0LFBNX3BoeXNBZGRyICpwaHlzQWRkcik7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2FncFJlbGVhc2VQaHlzaWNhbCkodm9pZCAqcGh5c0NvbnRleHQpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9hZ3BDb21taXRQaHlzaWNhbCkodm9pZCAqcGh5c0NvbnRleHQsdWxvbmcgbnVtUGFnZXMsdWxvbmcgc3RhcnRPZmZzZXQsUE1fcGh5c0FkZHIgKnBoeXNBZGRyKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fYWdwRnJlZVBoeXNpY2FsKSh2b2lkICpwaHlzQ29udGV4dCx1bG9uZyBudW1QYWdlcyx1bG9uZyBzdGFydE9mZnNldCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBDSV9nZXROdW1EZXZpY2VzKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0TG9jYWxCUERQYXRoKShjb25zdCBjaGFyICpwYXRoKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fbG9hZERpcmVjdERyYXcpKGludCBkZXZpY2UpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV91bmxvYWREaXJlY3REcmF3KShpbnQgZGV2aWNlKTsKLSAgICBQTV9IV05EIChQTUFQSVAgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdykodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2RvU3VzcGVuZEFwcCkodm9pZCk7Ci0gICAgfSBQTV9pbXBvcnRzOwotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLSNpZmRlZiAgX19XSU4zMl9WWERfXwotI2RlZmluZSBWRVNBX0JVRl9TSVpFIDEwMjQKLWV4dGVybiB1Y2hhciAqX1BNX3JtQnVmQWRkcjsKLSNlbmRpZgotCi0vKiB7c2VjcmV0fSBQb2ludGVyIHRvIGdsb2JhbCBleHBvcnRzIHN0cnVjdHVyZS4KLSAqIFNob3VsZCBub3QgYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBwcm9ncmFtcy4KLSAqLwotZXh0ZXJuIFBNX2ltcG9ydHMgX1ZBUkFQSSBfUE1faW1wb3J0czsKLQotLyoge3NlY3JldH0gKi8KLWV4dGVybiB2b2lkICogKCpfX1BNX21hbGxvYykoc2l6ZV90IHNpemUpOwotLyoge3NlY3JldH0gKi8KLWV4dGVybiB2b2lkICogKCpfX1BNX2NhbGxvYykoc2l6ZV90IG5lbGVtLHNpemVfdCBzaXplKTsKLS8qIHtzZWNyZXR9ICovCi1leHRlcm4gdm9pZCAqICgqX19QTV9yZWFsbG9jKSh2b2lkICpwdHIsc2l6ZV90IHNpemUpOwotLyoge3NlY3JldH0gKi8KLWV4dGVybiB2b2lkICgqX19QTV9mcmVlKSh2b2lkICpwKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUm91dGluZSB0byBpbml0aWFsaXNlIHRoZSBob3N0IHNpZGUgUE0gbGlicmFyeS4gTm90ZSB1c2VkIGZyb20gRExMJ3MgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9pbml0KHZvaWQpOwotCi0vKiBSb3V0aW5lIHRvIHJldHVybiBlaXRoZXIgUE1fcmVhbE1vZGUsIFBNXzI4NiBvciBQTV8zODYgKi8KLQotaW50ICAgICBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKTsKLQotLyogUm91dGluZSB0byByZXR1cm4gYSBzZWxlY3RvciB0byB0aGUgQklPUyBkYXRhIGFyZWEgYXQgc2VnbWVudCAweDQwICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gcmV0dXJuIGEgbGluZWFyIHBvaW50ZXIgdG8gdGhlIFZHQSBmcmFtZSBidWZmZXIgbWVtb3J5ICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpOwotCi0vKiBSb3V0aW5lcyB0byBtYXAvZnJlZSBwaHlzaWNhbCBtZW1vcnkgaW50byB0aGUgY3VycmVudCBEUyBzZWdtZW50LiBJbgotICogc29tZSBlbnZpcm9ubWVudHMgKDMyLWJpdCBET1MgaXMgb25lKSwgYWZ0ZXIgdGhlIG1hcHBpbmcgaGFzIGJlZW4KLSAqIGFsbG9jYXRlZCwgaXQgY2Fubm90IGJlIGZyZWVkLiBIZW5jZSB5b3Ugc2hvdWxkIG9ubHkgYWxsb2NhdGUgdGhlCi0gKiBtYXBwaW5nIG9uY2UgYW5kIGNhY2hlIHRoZSB2YWx1ZSBmb3IgdXNlIGJ5IG90aGVyIHBhcnRzIG9mIHlvdXIKLSAqIGFwcGxpY2F0aW9uLiBJZiB0aGUgbWFwcGluZyBjYW5ub3QgYmUgY3JlYXRlZWQsIHRoaXMgZnVuY3Rpb24gd2lsbAotICogcmV0dXJuIGEgTlVMTCBwb2ludGVyLgotICoKLSAqIFRoaXMgcm91dGluZSB3aWxsIGFsc28gd29yayBmb3IgbWVtb3J5IGFkZHJlc3NlcyBiZWxvdyAxTWIsIGJ1dCB0aGUKLSAqIG1hcHBlZCBhZGRyZXNzIGNhbm5vdCBjcm9zcyB0aGUgMU1iIGJvdW5kYXJ5LgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpOwotdm9pZCAgICBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCk7Ci0KLS8qIFJvdXRpbmUgdG8gZGV0ZXJtaW5lIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIGFkZHJlc3MuIEl0IGlzCi0gKiB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGUgZW50aXJlIGFkZHJlc3MgcmFuZ2UgZm9yIGEgbGluZWFyCi0gKiBibG9jayBvZiBtZW1vcnkgaXMgcGFnZSBhbGlnbmVkIGlmIHRoYXQgaXMgcmVxdWlyZWQuCi0gKi8KLQotdWxvbmcgICBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCk7Ci1pYm9vbCAgIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcyk7Ci0KLS8qIFJvdXRpbmVzIGZvciBtZW1vcnkgYWxsb2NhdGlvbi4gQnkgZGVmYXVsdCB0aGVzZSBmdW5jdGlvbnMgdXNlIHRoZSByZWd1bGFyCi0gKiBDIHJ1bnRpbWUgbGlicmFyeSBtYWxsb2MvZnJlZSBmdW5jdGlvbnMsIGJ1dCB5b3UgY2FuIHVzZSB0aGUKLSAqIFBNX3VzZUxvY2FsTWFsbG9jIGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0b3Igd2l0aAotICogeW91ciBvd24gbWVtb3J5IGFsbG9jYXRvci4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IGFsbCBtZW1vcnkgYWxsb2NhdGlvbgotICogdXNlZCBieSBTY2lUZWNoIHByb2R1Y3RzIHdpbGwgdXNlIHlvdXIgb3ZlcnJpZGRlbiBtZW1vcnkgYWxsb2NhdG9yCi0gKiBmdW5jdGlvbnMuCi0gKgotICogTm90ZSB0aGF0IEJQRCBmaWxlcyBhdXRvbWF0aWNhbGx5IG1hcCB0aGUgQyBydW50aW1lIGxpYnJhcnkKLSAqIG1hbGxvYy9jYWxsb2MvcmVhbGxvYy9mcmVlIGNhbGxzIGZyb20gaW5zaWRlIHRoZSBCUEQgdG8gdGhlIFBNIGxpYnJhcnkKLSAqIHZlcnNpb25zIGJ5IGRlZmF1bHQuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV91c2VMb2NhbE1hbGxvYyh2b2lkICogKCptYWxsb2MpKHNpemVfdCBzaXplKSx2b2lkICogKCpjYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSksdm9pZCAqICgqcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKSx2b2lkICgqZnJlZSkodm9pZCAqcCkpOwotdm9pZCAqICBQTUFQSSBQTV9tYWxsb2Moc2l6ZV90IHNpemUpOwotdm9pZCAqICBQTUFQSSBQTV9jYWxsb2Moc2l6ZV90IG5lbGVtLHNpemVfdCBzaXplKTsKLXZvaWQgKiAgUE1BUEkgUE1fcmVhbGxvYyh2b2lkICpwdHIsc2l6ZV90IHNpemUpOwotdm9pZCAgICBQTUFQSSBQTV9mcmVlKHZvaWQgKnApOwotCi0vKiBSb3V0aW5lIHRvIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGluIHRoZSBnbG9iYWwgc2hhcmVkIHJlZ2lvbiB0aGF0Ci0gKiBpcyBjb21tb24gdG8gYWxsIHRhc2tzIGFuZCBhY2Nlc3NpYmxlIGZyb20gcmluZyAwIGNvZGUuCi0gKi8KLQotdm9pZCAqICBQTUFQSSBQTV9tYWxsb2NTaGFyZWQobG9uZyBzaXplKTsKLQotLyogUm91dGluZSB0byBmcmVlIHRoZSBhbGxvY2F0ZWQgc2hhcmVkIG1lbW9yeSBibG9jayAqLwotCi12b2lkICAgIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKTsKLQotLyogQXR0YWNoIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgbGluZWFyIG1hcHBpbmcgdG8gYSBuZXcgcHJvY2VzcyAqLwotCi12b2lkICogIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpsaW5lYXIsdWxvbmcgbGltaXQpOwotCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCBieXRlLCB3b3JkIGFuZCBsb25nIHZhbHVlcyBmcm9tIGEgY2hhciBwb2ludGVyICovCi0KLSNkZWZpbmUgUE1fZ2V0Qnl0ZShwKSAgICAgICAqKCh2b2xhdGlsZSB1Y2hhciopKHApKQotI2RlZmluZSBQTV9nZXRXb3JkKHApICAgICAgICooKHZvbGF0aWxlIHVzaG9ydCopKHApKQotI2RlZmluZSBQTV9nZXRMb25nKHApICAgICAgICooKHZvbGF0aWxlIHVsb25nKikocCkpCi0jZGVmaW5lIFBNX3NldEJ5dGUocCx2KSAgICAgUE1fZ2V0Qnl0ZShwKSA9ICh2KQotI2RlZmluZSBQTV9zZXRXb3JkKHAsdikgICAgIFBNX2dldFdvcmQocCkgPSAodikKLSNkZWZpbmUgUE1fc2V0TG9uZyhwLHYpICAgICBQTV9nZXRMb25nKHApID0gKHYpCi0KLS8qIFJvdXRpbmUgZm9yIGFjY2Vzc2luZyBhIGxvdyAxTWIgbWVtb3J5IGJsb2NrLiBZb3UgZG9udCBuZWVkIHRvIGZyZWUgdGhpcwotICogcG9pbnRlciwgYnV0IGluIDE2IGJpdCBwcm90ZWN0ZWQgbW9kZSB0aGUgc2VsZWN0b3IgYWxsb2NhdGVkIHdpbGwgYmUKLSAqIHJlLXVzZWQgdGhlIG5leHQgdGltZSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKTsKLQotLyogUm91dGluZSB0byBhbGxvY2F0ZSBhIGJsb2NrIG9mIGNvbnZlbnRpb25hbCBtZW1vcnkgYmVsb3cgdGhlIDFNYgotICogbGltaXQgc28gdGhhdCBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSByZWFsIG1vZGUuIEVuc3VyZSB0aGF0IHlvdSBmcmVlCi0gKiB0aGUgc2VnbWVudCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIGl0LgotICoKLSAqIFRoaXMgcm91dGluZSByZXR1cm5zIGEgc2VsZWN0b3IgYW5kIG9mZnNldCB0byB0aGUgc2VnbWVudCB0aGF0IGhhcyBiZWVuCi0gKiBhbGxvY2F0ZWQsIGFuZCBhbHNvIHJldHVybnMgdGhlIHJlYWwgbW9kZSBzZWdtZW50IGFuZCBvZmZzZXQgd2hpY2ggY2FuCi0gKiBiZSBwYXNzZWQgdG8gcmVhbCBtb2RlIHJvdXRpbmVzLiBXaWxsIHJldHVybiAwIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUKLSAqIGFsbG9jYXRlZC4KLSAqCi0gKiBQbGVhc2Ugbm90ZSB0aGF0IHdpdGggc29tZSBET1MgZXh0ZW5kZXJzLCBtZW1vcnkgYWxsb2NhdGVkIHdpdGggdGhlCi0gKiBmb2xsb3dpbmcgZnVuY3Rpb24gY2Fubm90IGJlIGZyZWVkLCBoZW5jZSBpdCB3aWxsIGJlIGFsbG9jYXRlZCBmb3IgdGhlCi0gKiBsaWZlIG9mIHlvdXIgcHJvZ3JhbS4gVGh1cyBpZiB5b3UgbmVlZCB0byBjYWxsIGEgYnVuY2ggb2YgZGlmZmVyZW50Ci0gKiByZWFsLW1vZGUgcm91dGluZXMgaW4geW91ciBwcm9ncmFtLCBhbGxvY2F0ZSBhIHNpbmdsZSBsYXJnZSBidWZmZXIgYXQKLSAqIHByb2dyYW0gc3RhcnR1cCB0aGF0IGNhbiBiZSByZS11c2VkIHRocm91Z2hvdXQgdGhlIHByb2dyYW0gZXhlY3V0aW9uLgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZik7Ci12b2lkICAgIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSk7Ci0KLS8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQgbWVtb3J5LCBhbmQgcmV0dXJuIGJvdGggdGhlCi0gKiBsaW5lYXIgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiB0aGUgbWVtb3J5LiBZb3Ugc2hvdWxkIGFsd2F5cwotICogYWxsb2NhdGUgbG9ja2VkIG1lbW9yeSBibG9ja3MgaW4gcGFnZSBzaXplZCBjaHVua3MgKGllOiA0SyBvbiBJQTMyKS4KLSAqIElmIHRoZSBtZW1vcnkgaXMgbm90IGNvbnRpZ3VvdXMsIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZQotICogUE1fZ2V0UGh5c2ljYWxBZGRyIGZ1bmN0aW9uIHRvIGdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBsaW5lYXIKLSAqIHBhZ2VzIHdpdGhpbiB0aGUgbWVtb3J5IGJsb2NrICh0aGUgcmV0dXJuZWQgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlCi0gKiBmb3IgdGhlIGZpcnN0IGFkZHJlc3MgaW4gdGhlIG1lbW9yeSBibG9jayBvbmx5KS4KLSAqLwotCi12b2lkICogIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKHVpbnQgc2l6ZSx1bG9uZyAqcGh5c0FkZHIsaWJvb2wgY29udGlndW91cyxpYm9vbCBiZWxvdzE2TWVnKTsKLXZvaWQgICAgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKTsKLQotLyogUm91dGluZSB0byBhbGxvY2F0ZSBhbmQgZnJlZSBwYWdlZCBzaXplZCBibG9ja3Mgb2Ygc2hhcmVkIG1lbW9yeS4KLSAqIEFkZHJlc3NhYmxlIGZyb20gYWxsIHByb2Nlc3NlcywgYnV0IG5vdCBmcm9tIGEgcmluZyAwIGNvbnRleHQKLSAqIHVuZGVyIE9TLzIuIE5vdGUgdGhhdCB1bmRlciBPUy8yIFBNX21hcFNoYXJlZFBhZ2VzIG11c3QgYmUgY2FsbGVkCi0gKiB0byBtYXAgdGhlIG1lbW9yeSBibG9ja3MgaW50byB0aGUgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIHNwYWNlCi0gKiBvZiBlYWNoIGNvbm5lY3RpbmcgcHJvY2Vzcy4KLSAqLwotCi12b2lkICogIFBNQVBJIFBNX2FsbG9jUGFnZShpYm9vbCBsb2NrZWQpOwotdm9pZCAgICBQTUFQSSBQTV9mcmVlUGFnZSh2b2lkICpwKTsKLSNpZmRlZiBfX09TMl9fCi12b2lkICAgIFBNQVBJIFBNX21hcFNoYXJlZFBhZ2VzKHZvaWQpOwotI2VuZGlmCi0KLS8qIFJvdXRpbmUgdG8gcmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlIEJJT1Mgb24gdGhlIGhvc3QgT1MgKi8KLQotaWJvb2wgICBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKTsKLQotLyogUm91dGluZSB0byBjYWxsIGEgcmVhbCBtb2RlIGFzc2VtYmx5IGxhbmd1YWdlIHByb2NlZHVyZS4gUmVnaXN0ZXIKLSAqIHZhbHVlcyBhcmUgcGFzc2VkIGluIGFuZCBvdXQgaW4gdGhlICdyZWdzJyBhbmQgJ3NyZWdzJyBzdHJ1Y3R1cmVzLiBXZQotICogZG8gbm90IHByb3ZpZGUgYW55IG1ldGhvZCBvZiBjb3B5aW5nIGRhdGEgZnJvbSB0aGUgcHJvdGVjdGVkIG1vZGUgc3RhY2sKLSAqIHRvIHRoZSByZWFsIG1vZGUgc3RhY2ssIHNvIGlmIHlvdSBuZWVkIHRvIHBhc3MgZGF0YSB0byByZWFsIG1vZGUsIHlvdSB3aWxsCi0gKiBuZWVkIHRvIHdyaXRlIGEgcmVhbCBtb2RlIGFzc2VtYmx5IGxhbmd1YWdlIGhvb2sgdG8gcmVjaWV2ZSB0aGUgdmFsdWVzCi0gKiBpbiByZWdpc3RlcnMsIGFuZCB0byBwYXNzIHRoZSBkYXRhIHRocm91Z2ggYSByZWFsIG1vZGUgYmxvY2sgYWxsb2NhdGVkCi0gKiB3aXRoIHRoZSBQTV9hbGxvY1JlYWxTZWcoKSByb3V0aW5lLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKnJlZ3MsUk1TUkVHUyAqc3JlZ3MpOwotCi0vKiBSb3V0aW5lcyB0byBnZW5lcmF0ZSByZWFsIG1vZGUgaW50ZXJydXB0cyB1c2luZyB0aGUgc2FtZSBpbnRlcmZhY2UgdGhhdAotICogaXMgdXNlZCBieSBpbnQ4NigpIGFuZCBpbnQ4NngoKSBpbiByZWFsbW9kZS4gVGhpcyByb3V0aW5lIGlzIG5lZWQgdG8KLSAqIGNhbGwgY2VydGFpbiBCSU9TIGFuZCBET1MgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgc29tZQotICogRE9TIGV4dGVuZGVycy4gTm8gdHJhbnNsYXRpb24gaXMgZG9uZSBvbiBhbnkgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcywKLSAqIHNvIHRoZXkgbXVzdCBiZSBjb3JyZWN0bHkgc2V0IHVwIGFuZCB0cmFuc2xhdGVkIGJ5IHRoZSBjYWxsaW5nIHByb2dyYW0uCi0gKgotICogTm9ybWFsbHkgdGhlIERPUyBleHRlbmRlcnMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBub3JtYWwgaW50ODYoKQotICogZnVuY3Rpb24gZGlyZWN0bHkgYW5kIHdpbGwgcGFzcyBvbiB1bmhhbmRsZWQgY2FsbHMgdG8gcmVhbCBtb2RlIHRvIGJlCi0gKiBoYW5kbGVkIGJ5IHRoZSByZWFsIG1vZGUgaGFuZGxlci4gSG93ZXZlciBjYWxscyB0byBpbnQ4NngoKSB3aXRoIHJlYWwKLSAqIG1vZGUgc2VnbWVudCB2YWx1ZXMgdG8gYmUgbG9hZGVkIHdpbGwgY2F1c2UgYSBHUEYgaWYgdXNlZCB3aXRoIHRoZQotICogc3RhbmRhcmQgaW50ODZ4KCksIHNvIHlvdSBzaG91bGQgdXNlIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBrbm93IHlvdQotICogd2FudCB0byBjYWxsIGEgcmVhbCBtb2RlIGhhbmRsZXIuCi0gKi8KLQotaW50ICAgICBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KTsKLWludCAgICAgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsUk1TUkVHUyAqc3JlZ3MpOwotCi0vKiBSb3V0aW5lIHRvIGdlbmVyYXRlIGEgcmVhbCBtb2RlIGludGVycnVwdC4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlCi0gKiBhYm92ZSBmdW5jdGlvbiwgYnV0IHRha2VzIGEgRFBNSV9yZWdzIHN0cnVjdHVyZSBmb3IgdGhlIHJlZ2lzdGVycwotICogd2hpY2ggaGFzIGEgbG90IG1vcmUgaW5mb3JtYXRpb24uIEl0IGlzIG9ubHkgYXZhaWxhYmxlIGZyb20gMzItYml0Ci0gKiBwcm90ZWN0ZWQgbW9kZS4KLSAqLwotCi12b2lkICAgIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpOwotCi0vKiBGdW5jdGlvbiB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgcGh5c2ljYWwgYW5kIHRvdGFsIG1lbW9yeS4KLSAqIFRoZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlICpvbmx5KiB2YWxpZCBiZWZvcmUgeW91IGhhdmUgbWFkZSBhbnkKLSAqIGNhbGxzIHRvIG1hbGxvYygpIGFuZCBmcmVlKCkuIElmIHlvdSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgZXhhY3RseSBob3cKLSAqIG11Y2ggbWVtb3J5IGlzIGN1cnJlbnRseSBhbGxvY2F0ZWQsIHlvdSBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0bwotICogZ2V0IHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZSBhbmQgdGhlbiBrZWVwIHRyYWNrIG9mCi0gKiB0aGUgYXZhaWxhYmxlIG1lbW9yeSBldmVyeSB0aW1lIHlvdSBjYWxsIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCk7Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiBhIGdsb2JhbCBWRVNBIHJlYWwgbW9kZSB0cmFuc2ZlciBidWZmZXIgZm9yIHVzZQotICogYnkgYXBwbGljYXRpb25zLgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKTsKLQotLyogSGFuZGxlIGZhdGFsIGVycm9yIGNvbmRpdGlvbnMgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZyk7Ci0KLS8qIEZ1bmN0aW9uIHRvIHNldCBhIGNsZWFudXAgZXJyb3IgaGFuZGxlciBjYWxsZWQgd2hlbiBQTV9mYXRhbEVycm9yCi0gKiBpcyBjYWxsZWQuIFRoaXMgYWxsb3dzIHVzIHRvIHRoZSBjb25zb2xlIGJhY2sgaW50byBhIG5vcm1hbCBzdGF0ZQotICogaWYgd2UgZ2V0IGEgZmFpbHVyZSBmcm9tIGRlZXAgaW5zaWRlIGEgQlBEIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMKLSAqIG5vdCBleHBvcnRlZCB0byBCUEQgZmlsZXMsIGFuZCBpcyBvbmx5IHVzZWQgYnkgY29kZSBjb21waWxlZCBmb3IgdGhlCi0gKiBPUy4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKFBNX2ZhdGFsQ2xlYW51cEhhbmRsZXIgY2xlYW51cCk7Ci0KLS8qIFJldHVybiB0aGUgT1MgdHlwZSBmbGFnIGFzIGRlZmluZWQgaW4gPGRydmxpYi9vcy9vcy5oPiAqLwotCi1sb25nICAgIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIHNldCBhIFZCRSBiYW5rIHZpYSBhbiBJbnQgMTBoICovCi0KLXZvaWQgICAgUE1BUEkgUE1fc2V0QmFua0EoaW50IGJhbmspOwotdm9pZCAgICBQTUFQSSBQTV9zZXRCYW5rQUIoaW50IGJhbmspOwotdm9pZCAgICBQTUFQSSBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCk7Ci0KLS8qIFJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAqLwotCi1jaGFyICogIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKGNoYXIgKnBhdGgsaW50IG1heExlbik7Ci0KLS8qIFJldHVybiBwYXRocyB0byB0aGUgVkJFL0FGIGFuZCBOdWNsZXVzIGRpcmVjdG9yaWVzICovCi0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCk7Ci1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCk7Ci1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCk7Ci0KLS8qIEZpbmQgdGhlIHBhdGggdG8gYSBiaW5hcnkgcG9ydGFibGUgRExMICovCi0KLXZvaWQgICAgUE1BUEkgUE1fc2V0TG9jYWxCUERQYXRoKGNvbnN0IGNoYXIgKnBhdGgpOwotaWJvb2wgICBQTUFQSSBQTV9maW5kQlBEKGNvbnN0IGNoYXIgKmRsbG5hbWUsY2hhciAqYnBkcGF0aCk7Ci0KLS8qIFJldHVybnMgdGhlIGRyaXZlIGxldHRlciBvZiB0aGUgYm9vdCBkcml2ZSBmb3IgRE9TLCBPUy8yIGFuZCBXaW5kb3dzICovCi0KLWNoYXIgICAgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpOwotCi0vKiBSZXR1cm4gYSBuZXR3b3JrIHVuaXF1ZSBtYWNoaW5lIGlkZW50aWZpZXIgYXMgYSBzdHJpbmcgKi8KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpOwotCi0vKiBSZXR1cm4gdGhlIG5ldHdvcmsgbWFjaGluZSBuYW1lIGFzIGEgc3RyaW5nICovCi0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIGluc3RhbGwgYW5kIHJlbW92ZSB0aGUgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXIKLSAqIGVtdWxhdGlvbiBjb2RlLiBGb3IgdW5zdXBwb3J0ZWQgRE9TIGV4dGVuZGVycyBhbmQgd2hlbiBydW5uaW5nIHVuZGVyCi0gKiBhIERQTUkgaG9zdCBsaWtlIFdpbmRvd3Mgb3IgT1MvMiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIE5VTEwuCi0gKi8KLQotaWJvb2wgICBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCk7Ci12b2lkICogIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKTsKLXZvaWQgICAgUE1BUEkgVkZfZXhpdCh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIHdhaXQgZm9yIGEga2V5cHJlc3MgYW5kIHJlYWQgYSBrZXkgZm9yIGNvbW1hbmQgbGluZQotICogZW52aXJvbm1lbnRzIHN1Y2ggYXMgRE9TLCBXaW4zMiBjb25zb2xlIGFuZCBVbml4LgotICovCi0KLWludCAgICAgUE1BUEkgUE1fa2JoaXQodm9pZCk7Ci1pbnQgICAgIFBNQVBJIFBNX2dldGNoKHZvaWQpOwotCi0vKiBGdW5jdGlvbnMgdG8gY3JlYXRlIGVpdGhlciBhIGZ1bGxzY3JlZW4gb3Igd2luZG93ZWQgY29uc29sZSBvbiB0aGUKLSAqIGRlc2t0b3AsIGFuZCB0byBhbGxvdyB0aGUgcmVzb2x1dGlvbiBvZiBmdWxsc2NyZWVuIGNvbnNvbGVzIHRvIGJlCi0gKiBjaGFuZ2VkIG9uIHRoZSBmbHkgd2l0aG91dCBjbG9zaW5nIHRoZSBjb25zb2xlLiBGb3Igbm9uLXdpbmRvd2VkCi0gKiBlbnZpcm9ubWVudHMgKHN1Y2ggYXMgYSBMaW51eCBvciBPUy8yIGZ1bGxzY3JlZW4gY29uc29sZSksIHRoZXNlCi0gKiBmdW5jdGlvbnMgZW5hYmxlIGNvbnNvbGUgZ3JhcGhpY3MgbW9kZSBhbmQgcmVzdG9yZSBjb25zb2xlIHRleHQgbW9kZS4KLSAqCi0gKiBUaGUgc3VzcGVuZCBhcHBsaWNhdGlvbiBjYWxsYmFjayBpcyB1c2VkIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0bwotICogc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGZ1bGxzY3JlZW4gY29uc29sZSBtb2RlIHRvIGFsbG93IHRlbXBvcmFyeQotICogc3dpdGNoaW5nIHRvIGFub3RoZXIgY29uc29sZSBvciBiYWNrIHRvIHRoZSByZWd1bGFyIEdVSSBkZXNrdG9wLiBJdAotICogaXMgYWxzbyBjYWxsZWQgdG8gcmVzdG9yZSB0aGUgZnVsbHNjcmVlbiBncmFwaGljcyBzdGF0ZSBhZnRlciB0aGUKLSAqIGZ1bGxzY3JlZW4gY29uc29sZSByZWdhaW5zIHRoZSBmb2N1cy4KLSAqCi0gKiBUaGUgZGV2aWNlIHBhcmFtZXRlciBhbGxvd3MgZm9yIHRoZSBjb25zb2xlIHRvIGJlIG9wZW5lZCBvbiBhIGRpZmZlcmVudAotICogZGlzcGxheSBjb250cm9sbGVycyAoMCBpcyBhbHdheXMgdGhlIHByaW1hcnkgY29udHJvbGxlcikuCi0gKi8KLQotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZShQTV9IV05EIGh3bmRVc2VyLGludCBkZXZpY2UsaW50IHhSZXMsaW50IHlSZXMsaW50IGJwcCxpYm9vbCBmdWxsU2NyZWVuKTsKLWludCAgICAgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKTsKLXZvaWQgICAgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpOwotdm9pZCAgICBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBod25kQ29uc29sZSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBtb2RpZnkgT1MgY29uc29sZSBpbmZvcm1hdGlvbiAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oaW50IHgsaW50IHkpOwotdm9pZCAgICBQTUFQSSBQTV9zZXRPU1NjcmVlbldpZHRoKGludCB3aWR0aCxpbnQgaGVpZ2h0KTsKLQotLyogRnVuY3Rpb24gdG8gZW1hYmxlIEludGVsIFBQcm8vUElJIHdyaXRlIGNvbWJpbmluZyAqLwotCi1pbnQgICAgIFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSh1bG9uZyBiYXNlLHVsb25nIGxlbmd0aCx1aW50IHR5cGUpOwotaW50ICAgICBQTUFQSSBQTV9lbnVtV3JpdGVDb21iaW5lKFBNX2VudW1Xcml0ZUNvbWJpbmVfdCBjYWxsYmFjayk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHBhdGggc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgYSBmaWxlbmFtZSAoaWYgbm90IHByZXNlbnQpICovCi0KLXZvaWQgICAgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKmZpbGVuYW1lKTsKLQotLyogUm91dGluZXMgdG8gbG9jayBhbmQgdW5sb2NrIHJlZ2lvbnMgb2YgbWVtb3J5IHVuZGVyIGEgdmlydHVhbCBtZW1vcnkKLSAqIGVudmlyb25tZW50LiBUaGVzZSByb3V0aW5lcyBfbXVzdF8gYmUgdXNlZCB0byBsb2NrIGFsbCBoYXJkd2FyZQotICogYW5kIG1vdXNlIGludGVycnVwdCBoYW5kbGVycyBpbnN0YWxsZWQsIF9BTkRfIGFueSBnbG9iYWwgZGF0YSB0aGF0Ci0gKiB0aGVzZSBoYW5kbGVyIG1hbmlwdWxhdGUsIHNvIHRoYXQgdGhleSB3aWxsIGFsd2F5cyBiZSBwcmVzZW50IGluIG1lbW9yeQotICogdG8gaGFuZGxlIHRoZSBpbmNvbWluZyBpbnRlcnJ1cHRzLgotICoKLSAqIE5vdGUgdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gY2FsbCB0aGUgY29ycmVjdCByb3V0aW5lIGRlcGVuZGluZyBvbgotICogd2hldGhlciB0aGUgYXJlYSBiZWluZyBsb2NrZWQgaXMgY29kZSBvciBkYXRhLCBzbyB0aGF0IHVuZGVyIDMyIGJpdAotICogUE0gd2Ugd2lsbCBnZXQgdGhlIHNlbGVjdG9yIHZhbHVlIGNvcnJlY3QuCi0gKi8KLQotaW50ICAgICBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7Ci1pbnQgICAgIFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOwotaW50ICAgICBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKF9fY29kZVB0ciBwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOwotaW50ICAgICBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXMoX19jb2RlUHRyIHAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7Ci0KLS8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIHJlbW92ZSBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJydXB0IGhhbmRsZXJzLiBUaGUKLSAqIGZyZXF1ZW5jeSBvZiB0aGUgcmVhbCB0aW1lIGNsb2NrIGNhbiBiZSBjaGFuZ2VkIGJ5IGNhbGxpbmcKLSAqIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVueSwgYW5kIHRoZSB2YWx1ZSBjYW4gYmUgYW55IHBvd2VyIG9mIDIgdmFsdWUKLSAqIGZyb20gMkh6IHRvIDgxOTJIei4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKLSAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KLSAqCi0gKiBOT1RFOiBVc2VyIHNwYWNlIHZlcnNpb25zIG9mIHRoZSBQTSBsaWJyYXJ5IHNob3VsZCBmYWlsIHRoZXNlIGZ1bmN0aW9ucy4KLSAqLwotCi1pYm9vbCAgIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgaWgsaW50IGZyZXF1ZW5jeSk7Ci12b2lkICAgIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koaW50IGZyZXF1ZW5jeSk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKTsKLQotLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKLSAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KLSAqCi0gKiBOT1RFOiBVc2VyIHNwYWNlIHZlcnNpb25zIG9mIHRoZSBQTSBsaWJyYXJ5IHNob3VsZCBmYWlsIHRoZXNlIGZ1bmN0aW9ucy4KLSAqLwotCi1QTV9JUlFIYW5kbGUgUE1BUEkgUE1fc2V0SVJRSGFuZGxlcihpbnQgSVJRLFBNX2lycUhhbmRsZXIgaWgpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlSVJRSGFuZGxlcihQTV9JUlFIYW5kbGUgaXJxSGFuZGxlKTsKLQotLyogRnVuY3Rpb25zIHRvIHByb2dyYW0gRE1BIHVzaW5nIHRoZSBsZWdhY3kgSVNBIERNQSBjb250cm9sbGVyICovCi0KLXZvaWQgICAgUE1BUEkgUE1fRE1BQ0VuYWJsZShpbnQgY2hhbm5lbCk7Ci12b2lkICAgIFBNQVBJIFBNX0RNQUNEaXNhYmxlKGludCBjaGFubmVsKTsKLXZvaWQgICAgUE1BUEkgUE1fRE1BQ1Byb2dyYW0oaW50IGNoYW5uZWwsaW50IG1vZGUsdWxvbmcgYnVmZmVyUGh5cyxpbnQgY291bnQpOwotdWxvbmcgICBQTUFQSSBQTV9ETUFDUG9zaXRpb24oaW50IGNoYW5uZWwpOwotCi0vKiBGdW5jdGlvbiB0byBwb3N0IHNlY29uZGFyeSBncmFwaGljcyBjb250cm9sbGVycyB1c2luZyB0aGUgQklPUyAqLwotCi1pYm9vbCAgIFBNQVBJIFBNX2RvQklPU1BPU1QodXNob3J0IGF4VmFsLHVsb25nIEJJT1NQaHlzQWRkcix2b2lkICptYXBwZWRCSU9TLHVsb25nIEJJT1NMZW4pOwotCi0vKiBGdW5jdGlvbiB0byBpbml0IHRoZSBBR1AgZnVuY3Rpb25zIGFuZCByZXR1cm4gdGhlIEFHUCBhcGVydHVyZSBzaXplIGluIE1CICovCi0KLXVsb25nICAgUE1BUEkgUE1fYWdwSW5pdCh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fYWdwRXhpdCh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIHJlc2VydmUgYW5kIHJlbGVhc2UgcGh5c2ljYWwgQUdQIG1lbW9yeSByYW5nZXMgKi8KLQotaWJvb2wgICBQTUFQSSBQTV9hZ3BSZXNlcnZlUGh5c2ljYWwodWxvbmcgbnVtUGFnZXMsaW50IHR5cGUsdm9pZCAqKnBoeXNDb250ZXh0LFBNX3BoeXNBZGRyICpwaHlzQWRkcik7Ci1pYm9vbCAgIFBNQVBJIFBNX2FncFJlbGVhc2VQaHlzaWNhbCh2b2lkICpwaHlzQ29udGV4dCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBjb21taXQgYW5kIGZyZWUgcGh5c2ljYWwgQUdQIG1lbW9yeSByYW5nZXMgKi8KLQotaWJvb2wgICBQTUFQSSBQTV9hZ3BDb21taXRQaHlzaWNhbCh2b2lkICpwaHlzQ29udGV4dCx1bG9uZyBudW1QYWdlcyx1bG9uZyBzdGFydE9mZnNldCxQTV9waHlzQWRkciAqcGh5c0FkZHIpOwotaWJvb2wgICBQTUFQSSBQTV9hZ3BGcmVlUGh5c2ljYWwodm9pZCAqcGh5c0NvbnRleHQsdWxvbmcgbnVtUGFnZXMsdWxvbmcgc3RhcnRPZmZzZXQpOwotCi0vKiBGdW5jdGlvbnMgdG8gZG8gSS9PIHBvcnQgbWFuaXB1bGF0aW9uIGRpcmVjdGx5IGZyb20gQyBjb2RlLiBUaGVzZQotICogZnVuY3Rpb25zIGFyZSBwb3J0YWJsZSBhbmQgd2lsbCB3b3JrIG9uIGFueSBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlCi0gKiB0byBhY2Nlc3MgSS9PIHNwYWNlIHJlZ2lzdGVycyBvbiBQQ0kgZGV2aWNlcy4KLSAqLwotCi11Y2hhciAgIFBNQVBJIFBNX2lucGIoaW50IHBvcnQpOwotdXNob3J0ICBQTUFQSSBQTV9pbnB3KGludCBwb3J0KTsKLXVsb25nICAgUE1BUEkgUE1faW5wZChpbnQgcG9ydCk7Ci12b2lkICAgIFBNQVBJIFBNX291dHBiKGludCBwb3J0LHVjaGFyIHZhbCk7Ci12b2lkICAgIFBNQVBJIFBNX291dHB3KGludCBwb3J0LHVzaG9ydCB2YWwpOwotdm9pZCAgICBQTUFQSSBQTV9vdXRwZChpbnQgcG9ydCx1bG9uZyB2YWwpOwotCi0vKiBGdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBJL08gcG9ydCBsb2NhdGlvbnMgZm9yIENPTSBhbmQgTFBUIHBvcnRzLgotICogVGhlIGZ1bmN0aW9ucyBhcmUgemVybyBiYXNlZCwgc28gZm9yIENPTTEgb3IgTFBUMSBwYXNzIGluIGEgdmFsdWUgb2YgMCwKLSAqIGZvciBDT00yIG9yIExQVDIgcGFzcyBpbiBhIHZhbHVlIG9mIDEgZXRjLgotICovCi0KLWludCAgICAgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCk7Ci1pbnQgICAgIFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpOwotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMgdGhhdCBuZWVkIHByb3RvdHlwZXMgKi8KLQotdm9pZCAgICBQTUFQSSBfUE1fZ2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyAqcmVhbGlzcik7Ci12b2lkICAgIFBNQVBJIF9QTV9zZXRSTXZlY3QoaW50IGludG5vLCBsb25nIHJlYWxpc3IpOwotdm9pZCAgICBQTUFQSSBfUE1fZnJlZU1lbW9yeU1hcHBpbmdzKHZvaWQpOwotCi0vKiBGdW5jdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBkZWJ1ZyBsb2cgZmlsZSBsb2NhdGlvbiAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldERlYnVnTG9nKGNvbnN0IGNoYXIgKmxvZ0ZpbGVQYXRoKTsKLQotLyogRnVuY3Rpb24gdG8gcHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIG1pbGxpc2Vjb25kcyAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcyk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGJsb2NrIHVudGlsICdtaWxsaXNlY29uZHMnIGhhdmUgcGFzc2VkIHNpbmNlIGxhc3QgY2FsbCAqLwotCi12b2lkICAgIFBNQVBJIFBNX2Jsb2NrVW50aWxUaW1lb3V0KHVsb25nIG1pbGxpc2Vjb25kcyk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3IgZGlyZWN0b3J5IHRyYXZlcnNhbCBhbmQgbWFuYWdlbWVudCAqLwotCi12b2lkICogIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsUE1fZmluZERhdGEgKmZpbmREYXRhKTsKLWlib29sICAgUE1BUEkgUE1fZmluZE5leHRGaWxlKHZvaWQgKmhhbmRsZSxQTV9maW5kRGF0YSAqZmluZERhdGEpOwotdm9pZCAgICBQTUFQSSBQTV9maW5kQ2xvc2Uodm9pZCAqaGFuZGxlKTsKLXZvaWQgICAgUE1BUEkgUE1fbWFrZXBhdGgoY2hhciAqcCxjb25zdCBjaGFyICpkcml2ZSxjb25zdCBjaGFyICpkaXIsY29uc3QgY2hhciAqbmFtZSxjb25zdCBjaGFyICpleHQpOwotaW50ICAgICBQTUFQSSBQTV9zcGxpdHBhdGgoY29uc3QgY2hhciAqZm4sY2hhciAqZHJpdmUsY2hhciAqZGlyLGNoYXIgKm5hbWUsY2hhciAqZXh0KTsKLWlib29sICAgUE1BUEkgUE1fZHJpdmVWYWxpZChjaGFyIGRyaXZlKTsKLXZvaWQgICAgUE1BUEkgUE1fZ2V0ZGN3ZChpbnQgZHJpdmUsY2hhciAqZGlyLGludCBsZW4pOwotdWludCAgICBQTUFQSSBQTV9nZXRGaWxlQXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci12b2lkICAgIFBNQVBJIFBNX3NldEZpbGVBdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVpbnQgYXR0cmliKTsKLWlib29sICAgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsaWJvb2wgZ21UaW1lLFBNX3RpbWUgKnRpbWUpOwotaWJvb2wgICBQTUFQSSBQTV9zZXRGaWxlVGltZShjb25zdCBjaGFyICpmaWxlbmFtZSxpYm9vbCBnbVRpbWUsUE1fdGltZSAqdGltZSk7Ci1pYm9vbCAgIFBNQVBJIFBNX21rZGlyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLWlib29sICAgUE1BUEkgUE1fcm1kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotCi0vKiBGdW5jdGlvbnMgdG8gaGFuZGxlIGxvYWRpbmcgT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyAqLwotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoY29uc3QgY2hhciAqc3pETExOYW1lKTsKLXZvaWQgKiAgUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoUE1fTU9EVUxFIGhNb2R1bGUsY29uc3QgY2hhciAqc3pQcm9jTmFtZSk7Ci12b2lkICAgIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KFBNX01PRFVMRSBoTW9kdWxlKTsKLQotLyogRnVuY3Rpb25zIGFuZCBtYWNyb3MgZm9yIDY0LWJpdCBhcml0aG1ldGljICovCi0KLXZvaWQgICAgUE1BUEkgX1BNX2FkZDY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fc3ViNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci12b2lkICAgIFBNQVBJIF9QTV9tdWw2NCh1MzIgYV9sb3csczMyIGFfaGlnaCx1MzIgYl9sb3csczMyIGJfaGlnaCxfX2k2NCAqcmVzdWx0KTsKLXZvaWQgICAgUE1BUEkgX1BNX2RpdjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fc2hyNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fc2FyNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fc2hsNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fbmVnNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0jaWZkZWYgX19OQVRJVkVfSU5UNjRfXwotI2RlZmluZSBQTV9hZGQ2NChyLGEsYikgICAgIChyKSA9IChhKSArIChiKQotI2RlZmluZSBQTV9hZGQ2NF8zMihyLGEsYikgIChyKSA9IChhKSArIChiKQotI2RlZmluZSBQTV9zdWI2NChyLGEsYikgICAgIChyKSA9IChhKSAtIChiKQotI2RlZmluZSBQTV9zdWI2NF8zMihyLGEsYikgIChyKSA9IChhKSAtIChiKQotI2RlZmluZSBQTV9tdWw2NChyLGEsYikgICAgIChyKSA9IChhKSAqIChiKQotI2RlZmluZSBQTV9tdWw2NF8zMihyLGEsYikgIChyKSA9IChhKSAqIChiKQotI2RlZmluZSBQTV9kaXY2NChyLGEsYikgICAgIChyKSA9IChhKSAvIChiKQotI2RlZmluZSBQTV9kaXY2NF8zMihyLGEsYikgIChyKSA9IChhKSAvIChiKQotI2RlZmluZSBQTV9zaHI2NChyLGEscykgICAgIChyKSA9IChhKSA+PiAocykKLSNkZWZpbmUgUE1fc2FyNjQocixhLHMpICAgICAocikgPSAoKHM2NCkoYSkpID4+IChzKQotI2RlZmluZSBQTV9zaGw2NChyLGEscykgICAgIChyKSA9ICh1NjQpKGEpIDw8IChzKQotI2RlZmluZSBQTV9uZWc2NChyLGEscykgICAgIChyKSA9IC0oYSkKLSNkZWZpbmUgUE1fbm90NjQocixhLHMpICAgICAocikgPSB+KGEpCi0jZGVmaW5lIFBNX2VxNjQoYSxiKSAgICAgICAgKGEpID09IChiKQotI2RlZmluZSBQTV9ndDY0KGEsYikgICAgICAgIChhKSA+IChiKQotI2RlZmluZSBQTV9sdDY0KGEsYikgICAgICAgIChhKSA8IChiKQotI2RlZmluZSBQTV9nZXE2NChhLGIpICAgICAgIChhKSA+PSAoYikKLSNkZWZpbmUgUE1fbGVxNjQoYSxiKSAgICAgICAoYSkgPD0gKGIpCi0jZGVmaW5lIFBNXzY0dG8zMihhKSAgICAgICAgKHUzMikoYSkKLSNkZWZpbmUgUE1fNjR0b3MzMihhKSAgICAgICAoczMyKShhKQotI2RlZmluZSBQTV9zZXQ2NChhLGIsYykgICAgIChhKSA9ICgodTY0KShiKSA8PCAzMikgKyAoYykKLSNkZWZpbmUgUE1fc2V0NjRfMzIoYSxiKSAgICAoYSkgPSAoYikKLSNlbHNlCi0jZGVmaW5lIFBNX2FkZDY0KHIsYSxiKSAgICAgX1BNX2FkZDY0KChhKS5sb3csKGEpLmhpZ2gsKGIpLmxvdywoYikuaGlnaCwmKHIpKQotI2RlZmluZSBQTV9hZGQ2NF8zMihyLGEsYikgIF9QTV9hZGQ2NCgoYSkubG93LChhKS5oaWdoLGIsMCwmKHIpKQotI2RlZmluZSBQTV9zdWI2NChyLGEsYikgICAgIF9QTV9zdWI2NCgoYSkubG93LChhKS5oaWdoLChiKS5sb3csKGIpLmhpZ2gsJihyKSkKLSNkZWZpbmUgUE1fc3ViNjRfMzIocixhLGIpICBfUE1fc3ViNjQoKGEpLmxvdywoYSkuaGlnaCxiLDAsJihyKSkKLSNkZWZpbmUgUE1fbXVsNjQocixhLGIpICAgICBfUE1fbXVsNjQoKGEpLmxvdywoYSkuaGlnaCwoYikubG93LChiKS5oaWdoLCYocikpCi0jZGVmaW5lIFBNX211bDY0XzMyKHIsYSxiKSAgX1BNX211bDY0KChhKS5sb3csKGEpLmhpZ2gsYiwwLCYocikpCi0jZGVmaW5lIFBNX2RpdjY0KHIsYSxiKSAgICAgX1BNX2RpdjY0KChhKS5sb3csKGEpLmhpZ2gsKGIpLmxvdywoYikuaGlnaCwmKHIpKQotI2RlZmluZSBQTV9kaXY2NF8zMihyLGEsYikgIF9QTV9kaXY2NCgoYSkubG93LChhKS5oaWdoLGIsMCwmKHIpKQotI2RlZmluZSBQTV9zaHI2NChyLGEscykgICAgIF9QTV9zaHI2NCgoYSkubG93LChhKS5oaWdoLHMsJihyKSkKLSNkZWZpbmUgUE1fc2FyNjQocixhLHMpICAgICBfUE1fc2FyNjQoKGEpLmxvdywoYSkuaGlnaCxzLCYocikpCi0jZGVmaW5lIFBNX3NobDY0KHIsYSxzKSAgICAgX1BNX3NobDY0KChhKS5sb3csKGEpLmhpZ2gscywmKHIpKQotI2RlZmluZSBQTV9uZWc2NChyLGEscykgICAgIF9QTV9uZWc2NCgoYSkubG93LChhKS5oaWdoLCYocikpCi0jZGVmaW5lIFBNX25vdDY0KHIsYSxzKSAgICAgKHIpLmxvdyA9IH4oYSkubG93LCAocikuaGlnaCA9IH4oYSkuaGlnaAotI2RlZmluZSBQTV9lcTY0KGEsYikgICAgICAgICgoYSkubG93ID09IChiKS5sb3cgJiYgKGEpLmhpZ2ggPT0gKGIpLmhpZ2gpCi0jZGVmaW5lIFBNX2d0NjQoYSxiKSAgICAgICAgKCgoYSkuaGlnaCA+IChiKS5oaWdoKSB8fCAoKGEpLmhpZ2ggPT0gKGIpLmhpZ2ggJiYgKGEpLmxvdyA+IChiKS5sb3cpKQotI2RlZmluZSBQTV9sdDY0KGEsYikgICAgICAgICgoKGEpLmhpZ2ggPCAoYikuaGlnaCkgfHwgKChhKS5oaWdoID09IChiKS5oaWdoICYmIChhKS5sb3cgPCAoYikubG93KSkKLSNkZWZpbmUgUE1fZ2VxNjQoYSxiKSAgICAgICAoUE1fZXE2NChhLGIpIHx8IFBNX2d0NjQoYSxiKSkKLSNkZWZpbmUgUE1fbGVxNjQoYSxiKSAgICAgICAoUE1fZXE2NChhLGIpIHx8IFBNX2x0NjQoYSxiKSkKLSNkZWZpbmUgUE1fNjR0bzMyKGEpICAgICAgICAodTMyKShhLmxvdykKLSNkZWZpbmUgUE1fNjR0b3MzMihhKSAgICAgICAoKGEpLmhpZ2ggPCAwKSA/IC0oYSkubG93IDogKGEpLmxvdykKLSNkZWZpbmUgUE1fc2V0NjQoYSxiLGMpICAgICAoYSkuaGlnaCA9IChiKSwgKGEpLmxvdyA9IChjKQotI2RlZmluZSBQTV9zZXQ2NF8zMihhLGIpICAgIChhKS5oaWdoID0gMCwgKGEpLmxvdyA9IChiKQotI2VuZGlmCi0KLS8qIEZ1bmN0aW9uIHRvIGVuYWJsZSBJT1BMIGFjY2VzcyBpZiByZXF1aXJlZCAqLwotCi1pbnQgICAgIFBNQVBJIFBNX3NldElPUEwoaW50IGlvcGwpOwotCi0vKiBGdW5jdGlvbiB0byBmbHVzaCB0aGUgVExCIGFuZCBDUFUgY2FjaGVzICovCi0KLXZvaWQgICAgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCk7Ci0KLS8qIERPUyBzcGVjaWZpYyBmdWNudGlvbnMgKi8KLQotI2lmZGVmICBfX01TRE9TX18KLXVpbnQgICAgUE1BUEkgUE1IRUxQX2dldFZlcnNpb24odm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX1Z4RENhbGwoVlhEX3JlZ3MgKnJlZ3MpOwotI2VuZGlmCi0KLS8qIEZ1bmN0aW9ucyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBWR0EgaGFyZHdhcmUgc3RhdGUgKi8KLQotaW50ICAgICBQTUFQSSBQTV9nZXRWR0FTdGF0ZVNpemUodm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX3NhdmVWR0FTdGF0ZSh2b2lkICpzdGF0ZUJ1Zik7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVWR0FTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1Zik7Ci12b2lkICAgIFBNQVBJIFBNX3ZnYUJsYW5rRGlzcGxheSh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fdmdhVW5ibGFua0Rpc3BsYXkodm9pZCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBsb2FkIGFuZCB1bmxvYWQgRGlyZWN0RHJhdyBsaWJyYXJpZXMuIE9ubHkgdXNlZCBvbgotICogV2luZG93cyBwbGF0Zm9ybXMuCi0gKi8KLQotdm9pZCAqICBQTUFQSSBQTV9sb2FkRGlyZWN0RHJhdyhpbnQgZGV2aWNlKTsKLXZvaWQgICAgUE1BUEkgUE1fdW5sb2FkRGlyZWN0RHJhdyhpbnQgZGV2aWNlKTsKLVBNX0hXTkQgUE1BUEkgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdyh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fZG9TdXNwZW5kQXBwKHZvaWQpOwotCi0vKiBGdW5jdGlvbnMgdG8gaW5zdGFsbCwgc3RhcnQsIHN0b3AgYW5kIHJlbW92ZSBOVCBzZXJ2aWNlcy4gVmFsaWQgb25seQotICogZm9yIFdpbjMyIGFwcHMgcnVubmluZyBvbiBXaW5kb3dzIE5ULgotICovCi0KLSNpZmRlZiBfX1dJTkRPV1MzMl9fCi11bG9uZyAgIFBNQVBJIFBNX2luc3RhbGxTZXJ2aWNlKGNvbnN0IGNoYXIgKnN6RHJpdmVyTmFtZSxjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lLGNvbnN0IGNoYXIgKnN6TG9hZEdyb3VwLHVsb25nIGR3U2VydmljZVR5cGUpOwotdWxvbmcgICBQTUFQSSBQTV9zdGFydFNlcnZpY2UoY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSk7Ci11bG9uZyAgIFBNQVBJIFBNX3N0b3BTZXJ2aWNlKGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpOwotdWxvbmcgICBQTUFQSSBQTV9yZW1vdmVTZXJ2aWNlKGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpOwotI2VuZGlmCi0KLS8qIFJvdXRpbmVzIHRvIGdlbmVyYXRlIG5hdGl2ZSBpbnRlcnJ1cHRzIChpZTogcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0cwotICogZm9yIHByb3RlY3RlZCBtb2RlIGFwcHMpIHVzaW5nIGFuIGludGVyZmFjZSB0aGUgc2FtZSBhcyB0aGF0IHVzZSBieQotICogaW50ODYoKSBhbmQgaW50ODZ4KCkgaW4gcmVhbG1vZGUuIFRoZXNlIHJvdXRpbmVzIGFyZSByZXF1aXJlZCBiZWNhdXNlCi0gKiBtYW55IDMyIGJpdCBjb21waWxlcnMgdXNlIGRpZmZlcmVudCByZWdpc3RlciBzdHJ1Y3R1cmVzIGFuZCBkaWZmZXJlbnQKLSAqIGZ1bmN0aW9ucyBjYXVzaW5nIG1ham9yIHBvcnRhYmlsaXR5IGhlYWRhY2hlcy4gVGh1cyB3ZSBwcm92aWRlIG91cgotICogb3duIGFuZCBzb2x2ZSBpdCBhbGwgaW4gb25lIGZlbGwgc3dvb3AsIGFuZCB3ZSBhbHNvIGdldCBhIHJvdXRpbmUgdG8KLSAqIHB1dCBzdHVmZiBpbnRvIDMyIGJpdCByZWdpc3RlcnMgZnJvbSByZWFsIG1vZGUgOy0pCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zZWdyZWFkKFBNU1JFR1MgKnNyZWdzKTsKLWludCAgICAgUE1BUEkgUE1faW50Mzg2KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQpOwotaW50ICAgICBQTUFQSSBQTV9pbnQzODZ4KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQsUE1TUkVHUyAqc3JlZ3MpOwotCi0vKiBDYWxsIHRoZSBYODYgZW11bGF0b3Igb3IgdGhlIHJlYWwgQklPUyBpbiBvdXIgdGVzdCBoYXJuZXNzICovCi0KLSNpZiBkZWZpbmVkKFRFU1RfSEFSTkVTUykgJiYgIWRlZmluZWQoUE1MSUIpCi0jZGVmaW5lIFBNX21hcFJlYWxQb2ludGVyKHJfc2VnLHJfb2ZmKSAgICAgIF9QTV9pbXBvcnRzLlBNX21hcFJlYWxQb2ludGVyKHJfc2VnLHJfb2ZmKQotI2RlZmluZSBQTV9nZXRWRVNBQnVmKGxlbixyc2VnLHJvZmYpICAgICAgICBfUE1faW1wb3J0cy5QTV9nZXRWRVNBQnVmKGxlbixyc2VnLHJvZmYpCi0jZGVmaW5lIFBNX2NhbGxSZWFsTW9kZShzZWcsb2ZmLHJlZ3Msc3JlZ3MpIF9QTV9pbXBvcnRzLlBNX2NhbGxSZWFsTW9kZShzZWcsb2ZmLHJlZ3Msc3JlZ3MpCi0jZGVmaW5lIFBNX2ludDg2KGludG5vLGluLG91dCkgICAgICAgICAgICAgIF9QTV9pbXBvcnRzLlBNX2ludDg2KGludG5vLGluLG91dCkKLSNkZWZpbmUgUE1faW50ODZ4KGludG5vLGluLG91dCxzcmVncykgICAgICAgX1BNX2ltcG9ydHMuUE1faW50ODZ4KGludG5vLGluLG91dCxzcmVncykKLSNlbmRpZgotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICovCi0jZW5kaWYKLQotLyogSW5jbHVkZSBPUyBleHRlbnNpb25zIGZvciBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KLQotI2lmIGRlZmluZWQoX19SRUFMRE9TX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQotI2luY2x1ZGUgInBtaW50LmgiCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fUE1BUElfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW1wLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1pbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3ZjVlNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1pbXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBkZWNsYXJpbmcgYWxsIHRoZSBQTSBpbXBvcnRzIHN0cnVjdHVyZSBmb3IgdGhlCi0qICAgICAgICAgICAgICAgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBQTSBsaWJyYXJ5LiBJbmNsdWRlZCBpbiBhbGwgY29kZQotKiAgICAgICAgICAgICAgIHRoYXQgbmVlZHMgdG8gcGFzcyB0aGUgUE0gaW1wb3J0cyB0byBCUEQgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1QTV9pbXBvcnRzICBfVkFSQVBJIF9QTV9pbXBvcnRzID0gewotICAgIHNpemVvZihQTV9pbXBvcnRzKSwKLSAgICBQTV9nZXRNb2RlVHlwZSwKLSAgICBQTV9nZXRCSU9TUG9pbnRlciwKLSAgICBQTV9nZXRBMDAwMFBvaW50ZXIsCi0gICAgUE1fbWFwUGh5c2ljYWxBZGRyLAotICAgIFBNX21hbGxvY1NoYXJlZCwKLSAgICBOVUxMLAotICAgIFBNX2ZyZWVTaGFyZWQsCi0gICAgUE1fbWFwVG9Qcm9jZXNzLAotICAgIFBNX21hcFJlYWxQb2ludGVyLAotICAgIFBNX2FsbG9jUmVhbFNlZywKLSAgICBQTV9mcmVlUmVhbFNlZywKLSAgICBQTV9hbGxvY0xvY2tlZE1lbSwKLSAgICBQTV9mcmVlTG9ja2VkTWVtLAotICAgIFBNX2NhbGxSZWFsTW9kZSwKLSAgICBQTV9pbnQ4NiwKLSAgICBQTV9pbnQ4NngsCi0gICAgRFBNSV9pbnQ4NiwKLSAgICBQTV9hdmFpbGFibGVNZW1vcnksCi0gICAgUE1fZ2V0VkVTQUJ1ZiwKLSAgICBQTV9nZXRPU1R5cGUsCi0gICAgUE1fZmF0YWxFcnJvciwKLSAgICBQTV9zZXRCYW5rQSwKLSAgICBQTV9zZXRCYW5rQUIsCi0gICAgUE1fc2V0Q1JUU3RhcnQsCi0gICAgUE1fZ2V0Q3VycmVudFBhdGgsCi0gICAgUE1fZ2V0VkJFQUZQYXRoLAotICAgIFBNX2dldE51Y2xldXNQYXRoLAotICAgIFBNX2dldE51Y2xldXNDb25maWdQYXRoLAotICAgIFBNX2dldFVuaXF1ZUlELAotICAgIFBNX2dldE1hY2hpbmVOYW1lLAotICAgIFZGX2F2YWlsYWJsZSwKLSAgICBWRl9pbml0LAotICAgIFZGX2V4aXQsCi0gICAgUE1fb3BlbkNvbnNvbGUsCi0gICAgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSwKLSAgICBQTV9zYXZlQ29uc29sZVN0YXRlLAotICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUsCi0gICAgUE1fY2xvc2VDb25zb2xlLAotICAgIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24sCi0gICAgUE1fc2V0T1NTY3JlZW5XaWR0aCwKLSAgICBQTV9lbmFibGVXcml0ZUNvbWJpbmUsCi0gICAgUE1fYmFja3NsYXNoLAotICAgIFBNX2xvY2tEYXRhUGFnZXMsCi0gICAgUE1fdW5sb2NrRGF0YVBhZ2VzLAotICAgIFBNX2xvY2tDb2RlUGFnZXMsCi0gICAgUE1fdW5sb2NrQ29kZVBhZ2VzLAotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyLAotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3ksCi0gICAgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyLAotICAgIFBNX2RvQklPU1BPU1QsCi0gICAgUE1fZ2V0Qm9vdERyaXZlLAotICAgIFBNX2ZyZWVQaHlzaWNhbEFkZHIsCi0gICAgUE1faW5wYiwKLSAgICBQTV9pbnB3LAotICAgIFBNX2lucGQsCi0gICAgUE1fb3V0cGIsCi0gICAgUE1fb3V0cHcsCi0gICAgUE1fb3V0cGQsCi0gICAgTlVMTCwKLSAgICBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2ssCi0gICAgUE1faGF2ZUJJT1NBY2Nlc3MsCi0gICAgUE1fa2JoaXQsCi0gICAgUE1fZ2V0Y2gsCi0gICAgUE1fZmluZEJQRCwKLSAgICBQTV9nZXRQaHlzaWNhbEFkZHIsCi0gICAgUE1fc2xlZXAsCi0gICAgUE1fZ2V0Q09NUG9ydCwKLSAgICBQTV9nZXRMUFRQb3J0LAotICAgIFBNX2xvYWRMaWJyYXJ5LAotICAgIFBNX2dldFByb2NBZGRyZXNzLAotICAgIFBNX2ZyZWVMaWJyYXJ5LAotICAgIFBDSV9lbnVtZXJhdGUsCi0gICAgUENJX2FjY2Vzc1JlZywKLSAgICBQQ0lfc2V0SGFyZHdhcmVJUlEsCi0gICAgUENJX2dlbmVyYXRlU3BlY2lhbEN5bGUsCi0gICAgTlVMTCwKLSAgICBQQ0lCSU9TX2dldEVudHJ5LAotICAgIENQVV9nZXRQcm9jZXNzb3JUeXBlLAotICAgIENQVV9oYXZlTU1YLAotICAgIENQVV9oYXZlM0ROb3csCi0gICAgQ1BVX2hhdmVTU0UsCi0gICAgQ1BVX2hhdmVSRFRTQywKLSAgICBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQsCi0gICAgWlRpbWVySW5pdCwKLSAgICBMWlRpbWVyT24sCi0gICAgTFpUaW1lckxhcCwKLSAgICBMWlRpbWVyT2ZmLAotICAgIExaVGltZXJDb3VudCwKLSAgICBMWlRpbWVyT25FeHQsCi0gICAgTFpUaW1lckxhcEV4dCwKLSAgICBMWlRpbWVyT2ZmRXh0LAotICAgIExaVGltZXJDb3VudEV4dCwKLSAgICBVTFpUaW1lck9uLAotICAgIFVMWlRpbWVyTGFwLAotICAgIFVMWlRpbWVyT2ZmLAotICAgIFVMWlRpbWVyQ291bnQsCi0gICAgVUxaUmVhZFRpbWUsCi0gICAgVUxaRWxhcHNlZFRpbWUsCi0gICAgVUxaVGltZXJSZXNvbHV0aW9uLAotICAgIFBNX2ZpbmRGaXJzdEZpbGUsCi0gICAgUE1fZmluZE5leHRGaWxlLAotICAgIFBNX2ZpbmRDbG9zZSwKLSAgICBQTV9tYWtlcGF0aCwKLSAgICBQTV9zcGxpdHBhdGgsCi0gICAgUE1fZHJpdmVWYWxpZCwKLSAgICBQTV9nZXRkY3dkLAotICAgIFBNX3NldEZpbGVBdHRyLAotICAgIFBNX21rZGlyLAotICAgIFBNX3JtZGlyLAotICAgIFBNX2dldEZpbGVBdHRyLAotICAgIFBNX2dldEZpbGVUaW1lLAotICAgIFBNX3NldEZpbGVUaW1lLAotICAgIENQVV9nZXRQcm9jZXNzb3JOYW1lLAotICAgIFBNX2dldFZHQVN0YXRlU2l6ZSwKLSAgICBQTV9zYXZlVkdBU3RhdGUsCi0gICAgUE1fcmVzdG9yZVZHQVN0YXRlLAotICAgIFBNX3ZnYUJsYW5rRGlzcGxheSwKLSAgICBQTV92Z2FVbmJsYW5rRGlzcGxheSwKLSAgICBQTV9ibG9ja1VudGlsVGltZW91dCwKLSAgICBfUE1fYWRkNjQsCi0gICAgX1BNX3N1YjY0LAotICAgIF9QTV9tdWw2NCwKLSAgICBfUE1fZGl2NjQsCi0gICAgX1BNX3NocjY0LAotICAgIF9QTV9zYXI2NCwKLSAgICBfUE1fc2hsNjQsCi0gICAgX1BNX25lZzY0LAotICAgIFBDSV9maW5kQkFSU2l6ZSwKLSAgICBQQ0lfcmVhZFJlZ0Jsb2NrLAotICAgIFBDSV93cml0ZVJlZ0Jsb2NrLAotICAgIFBNX2ZsdXNoVExCLAotICAgIFBNX3VzZUxvY2FsTWFsbG9jLAotICAgIFBNX21hbGxvYywKLSAgICBQTV9jYWxsb2MsCi0gICAgUE1fcmVhbGxvYywKLSAgICBQTV9mcmVlLAotICAgIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlLAotICAgIFBNX2FsbG9jUGFnZSwKLSAgICBQTV9mcmVlUGFnZSwKLSAgICBQTV9hZ3BJbml0LAotICAgIFBNX2FncEV4aXQsCi0gICAgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsLAotICAgIFBNX2FncFJlbGVhc2VQaHlzaWNhbCwKLSAgICBQTV9hZ3BDb21taXRQaHlzaWNhbCwKLSAgICBQTV9hZ3BGcmVlUGh5c2ljYWwsCi0gICAgUENJX2dldE51bURldmljZXMsCi0gICAgUE1fc2V0TG9jYWxCUERQYXRoLAotI2lmZGVmIF9fV0lORE9XUzMyX18KLSAgICBQTV9sb2FkRGlyZWN0RHJhdywKLSAgICBQTV91bmxvYWREaXJlY3REcmF3LAotICAgIFBNX2dldERpcmVjdERyYXdXaW5kb3csCi0gICAgUE1fZG9TdXNwZW5kQXBwLAotI2Vsc2UKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotI2VuZGlmCi0gICAgfTsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbWludC5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNzZkYWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUmVhbCBtb2RlIGFuZCAxNi8zMiBiaXQgUHJvdGVjdGVkIE1vZGUKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgdGhlIGludGVycnVwdCBoYW5kbGluZyBleHRlbnNpb25zIHRvIHRoZSBPUwotKiAgICAgICAgICAgICAgIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeS4gVGhlc2UgZXh0ZW5zaW9ucyBpbmNsdWRlcwotKiAgICAgICAgICAgICAgIHNpbXBsaWZpZWQgaW50ZXJydXB0IGhhbmRsaW5nLCBhbGxvd2luZyBhbGwgY29tbW9uIGludGVycnVwdAotKiAgICAgICAgICAgICAgIGhhbmRsZXJzIHRvIGJlIGhvb2tlZCBhbmQgaGFuZGxlZCBkaXJlY3RseSB3aXRoIG5vcm1hbCBDCi0qICAgICAgICAgICAgICAgZnVuY3Rpb25zLCBib3RoIGluIDE2IGJpdCBhbmQgMzIgYml0IG1vZGVzLiBOb3RlIGhvd2V2ZXIgdGhhdAotKiAgICAgICAgICAgICAgIHNpbXBsaWZpZWQgaGFuZGxpbmcgZG9lcyBub3QgbWVhbiBzbG93IHBlcmZvcm1hbmNlISBBbGwgbG93Ci0qICAgICAgICAgICAgICAgbGV2ZWwgaW50ZXJydXB0IGhhbmRsaW5nIGlzIGRvbmUgZWZmaWNpZW50bHkgaW4gYXNzZW1ibGVyCi0qICAgICAgICAgICAgICAgZm9yIHNwZWVkICh3ZWxsIGFjdHVhbGx5IG5lY2Vzc2FyeSB0byBpbnN1bGF0ZSB0aGUKLSogICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBmcm9tIHRoZSBsYWNrIG9mIGZhciBwb2ludGVycyBpbiAzMiBiaXQgUE0pLiBUaGUKLSogICAgICAgICAgICAgICBpbnRlcnJ1cHQgaGFuZGxlcnMgY3VycmVudGx5IHN1cHBvcnRlZCBhcmU6Ci0qCi0qICAgICAgICAgICAgICAgICAgIE1vdXNlICgweDMzIGNhbGxiYWNrKQotKiAgICAgICAgICAgICAgICAgICBUaW1lciBUaWNrICgweDgpCi0qICAgICAgICAgICAgICAgICAgIEtleWJvYXJkICgweDkgYW5kIDB4MTUpCi0qICAgICAgICAgICAgICAgICAgIENvbnRyb2wgQy9CcmVhayAoMHgyMy8weDFCKQotKiAgICAgICAgICAgICAgICAgICBDcml0aWNhbCBFcnJvciAoMHgyNCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19QTUlOVF9ICi0jZGVmaW5lIF9fUE1JTlRfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIFR5cGVkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgX19TTVgzMl9fCi0vKiBQQyBpbnRlcnJ1cHRzIChFbnN1cmUgY29uc2lzdGVudCB3aXRoIHBtZS5pbmMpICovCi0jZGVmaW5lIFBNX0lSUTAgICAgICAweDQwCi0jZGVmaW5lIFBNX0lSUTEgICAgICAoUE1fSVJRMCsxKQotI2RlZmluZSBQTV9JUlE2ICAgICAgKFBNX0lSUTArNikKLSNkZWZpbmUgUE1fSVJRMTQgICAgIChQTV9JUlEwKzE0KQotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGludGVycnVwdCBoYW5kbGVycyB0aGF0IHdlIHN1cHBvcnQgICAgICovCi0KLXR5cGVkZWYgdWludCAgICAoUE1BUElQIFBNX2NyaXRpY2FsSGFuZGxlcikodWludCBheFZhbHVlLHVpbnQgZGlWYWx1ZSk7Ci10eXBlZGVmIHZvaWQgICAgKFBNQVBJUCBQTV9icmVha0hhbmRsZXIpKHVpbnQgYnJlYWtIaXQpOwotdHlwZWRlZiBzaG9ydCAgIChQTUFQSVAgUE1fa2V5MTVIYW5kbGVyKShzaG9ydCBzY2FuQ29kZSk7Ci10eXBlZGVmIHZvaWQgICAgKFBNQVBJUCBQTV9tb3VzZUhhbmRsZXIpKHVpbnQgZXZlbnQsIHVpbnQgYnV0c3RhdGUsaW50IHgsaW50IHksaW50IG1pY2tleVgsaW50IG1pY2tleVkpOwotCi0vKiBDcmVhdGUgYSB0eXBlIGZvciByZXByZXNlbnRpbmcgZmFyIHBvaW50ZXJzIGluIGJvdGggMTYgYW5kIDMyIGJpdAotICogcHJvdGVjdGVkIG1vZGUuCi0gKi8KLQotI2lmZGVmICBQTTM4NgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGxvbmcgICAgb2ZmOwotICAgIHNob3J0ICAgc2VsOwotICAgIH0gUE1GQVJQVFI7Ci0jZGVmaW5lIFBNTlVMTCAgezAsMH0KLSNlbHNlCi10eXBlZGVmIHZvaWQgKlBNRkFSUFRSOwotI2RlZmluZSBQTU5VTEwgIE5VTEwKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIFJvdXRpbmUgdG8gbG9hZCBzYXZlIGRlZmF1bHQgZGF0YSBzZWdtZW50IHNlbGVjdG9yIHZhbHVlIGludG8gYSBjb2RlCi0gKiBzZWdtZW50IHZhcmlhYmxlLCBhbmQgYW5vdGhlciB0byBsb2FkIHRoZSB2YWx1ZSBpbnRvIHRoZSBEUyByZWdpc3Rlci4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX2xvYWREUyh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fc2F2ZURTKHZvaWQpOwotCi0vKiBSb3V0aW5lIHRvIGluc3RhbGwgYSBtb3VzZSBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZS4gVGhlCi0gKiBtb3VzZSBoYW5kbGVyIHJvdXRpbmUgaXMgYSBub3JtYWwgQyBmdW5jdGlvbiwgYW5kIHRoZSBQTSBsaWJyYXJ5Ci0gKiB3aWxsIHRha2UgY2FyZSBvZiBwYXNzaW5nIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgdG8gdGhlIGZ1bmN0aW9uLAotICogYW5kIHN3aXRjaGluZyB0byBhIGxvY2FsIHN0YWNrLgotICoKLSAqIE5vdGUgdGhhdCB5b3UgX211c3RfIGxvY2sgdGhlIG1lbW9yeSBjb250YWluaW5nIHRoZSBtb3VzZSBpbnRlcnJ1cHQKLSAqIGhhbmRsZXIgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCi0gKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCi0gKi8KLQotaW50ICAgICBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssUE1fbW91c2VIYW5kbGVyIG1oKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKTsKLQotLyogUm91dGluZSB0byByZXNldCB0aGUgbW91c2UgZHJpdmVyLCBhbmQgcmUtaW5zdGFsbCB0aGUgY3VycmVudAotICogbW91c2UgaW50ZXJydXB0IGhhbmRsZXIgaWYgb25lIHdhcyBjdXJyZW50bHkgaW5zdGFsbGVkIChzaW5jZSB0aGUKLSAqIG1vdXNlIHJlc2V0IHdpbGwgYXV0b21hdGljYWxseSByZW1vdmUgdGhpcyBoYW5kbGVyLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KTsKLQotLyogUm91dGluZSB0byByZXNldCB0aGUgbW91c2UgZHJpdmVyLCBhbmQgcmUtaW5zdGFsbCB0aGUgY3VycmVudAotICogbW91c2UgaW50ZXJydXB0IGhhbmRsZXIgaWYgb25lIHdhcyBjdXJyZW50bHkgaW5zdGFsbGVkIChzaW5jZSB0aGUKLSAqIG1vdXNlIHJlc2V0IHdpbGwgYXV0b21hdGljYWxseSByZW1vdmUgdGhpcyBoYW5kbGVyLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KTsKLQotLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIHRpbWVyIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKLSAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldFRpbWVySGFuZGxlcihQTV9pbnRIYW5kbGVyIGloKTsKLXZvaWQgICAgUE1BUEkgUE1fY2hhaW5QcmV2VGltZXIodm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIGtleWJvYXJkIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKLSAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBpaCk7Ci12b2lkICAgIFBNQVBJIFBNX2NoYWluUHJldktleSh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGhvb2sgYW5kIHVuaG9vayB0aGUgYWx0ZXJuYXRlIEludCAxNWgga2V5Ym9hcmQgaW50ZXJjZXB0Ci0gKiBjYWxsb3V0IHJvdXRpbmUuIFlvdXIgZXZlbnQgaGFuZGxlciB3aWxsIG5lZWQgdG8gcmV0dXJuIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogIHNjYW5Db2RlICAgIC0gTGV0IHRoZSBCSU9TIHByb2Nlc3Mgc2NhbiBjb2RlIChjaGFpbnMgdG8gcHJldmlvdXMgaGFuZGxlcikKLSAqICAwICAgICAgICAgICAtIFlvdSBoYXZlIHByb2Nlc3NlZCB0aGUgc2NhbiBjb2RlIHNvIGZsdXNoIGZyb20gQklPUwotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYWxsIERPUyBleHRlbmRlcnMsIGJ1dCBkb2VzCi0gKiB3b3JrIHVuZGVyIHJlYWwgbW9kZSwgRE9TNEdXIGFuZCBYMzItVk0uIEl0IGRvZXMgbm90IHdvcmsgdW5kZXIgdGhlCi0gKiBQb3dlclBhY2sgMzIgYml0IERPUyBleHRlbmRlcnMuIElmIHlvdSBmaWd1cmUgb3V0IGhvdyB0byBkbyBpdCBsZXQgdXMga25vdyEKLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIgaWgpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKHZvaWQpOwotCi0vKiBSb3V0aW5lcyB0byBpbnN0YWxsIGFuZCByZW1vdmUgdGhlIGNvbnRyb2wgYy9icmVhayBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKiBJbnRlcnJ1cHQgaGFuZGxpbmcgaXMgcGVyZm9ybWVkIGJ5IHRoZSBQTS9Qcm8gbGlicmFyeSwgYW5kIHlvdSBjYW4gY2FsbAotICogdGhlIHN1cHBsaWVkIHJvdXRpbmVzIHRvIHRlc3QgdGhlIHN0YXR1cyBvZiB0aGUgQ3RybC1DIGFuZCBDdHJsLUJyZWFrCi0gKiBmbGFncy4gSWYgeW91IHBhc3MgdGhlIHZhbHVlIFRSVUUgZm9yICdjbGVhckZsYWcnIHRvIHRoZXNlIHJvdXRpbmVzLAotICogdGhlIGludGVybmFsIGZsYWdzIHdpbGwgYmUgcmVzZXQgaW4gb3JkZXIgdG8gY2F0Y2ggYW5vdGhlciBDdHJsLUMgb3IKLSAqIEN0cmwtQnJlYWsgaW50ZXJydXB0LgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKTsKLWludCAgICAgUE1BUEkgUE1fY3RybENIaXQoaW50IGNsZWFyRmxhZyk7Ci1pbnQgICAgIFBNQVBJIFBNX2N0cmxCcmVha0hpdChpbnQgY2xlYXJGbGFnKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKTsKLQotLyogUm91dGluZSB0byBpbnN0YWxsIGFuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIHRoYXQgd2lsbCBjYWxsIHlvdXIKLSAqIGNvZGUgZGlyZWN0bHkuIFRoaXMgaXMgbm90IGF2YWlsYWJsZSB1bmRlciBhbGwgRE9TIGV4dGVuZGVycywgYnV0IGRvZXMKLSAqIHdvcmsgdW5kZXIgcmVhbCBtb2RlLCBET1M0R1cgYW5kIFgzMi1WTS4gSXQgZG9lcyBub3Qgd29yayB1bmRlciB0aGUKLSAqIFBvd2VyUGFjayAzMiBiaXQgRE9TIGV4dGVuZGVycy4gSWYgeW91IGZpZ3VyZSBvdXQgaG93IHRvIGRvIGl0IGxldCB1cyBrbm93IQotICoKLSAqIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGVpdGhlciBpbnN0YWxsIG9uZSBvciB0aGUgb3RoZXIsIGJ1dCBub3QgYm90aCEKLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKTsKLQotLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIHRoZSBjcml0aWNhbCBlcnJvciBoYW5kbGVyLiBUaGUgaW50ZXJydXB0Ci0gKiBpcyBoYW5kbGVkIGJ5IHRoZSBQTS9Qcm8gbGlicmFyeSwgYW5kIHRoZSBvcGVyYXRpb24gd2lsbCBhbHdheXMgYmUgZmFpbGVkLgotICogWW91IGNhbiBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBjcml0aWNhbCBlcnJvciBoYW5kbGVyIHdpdGggdGhlCi0gKiBhcHByb3ByaWF0ZSBmdW5jdGlvbi4gSWYgeW91IHBhc3MgdGhlIHZhbHVlIFRSVUUgZm9yICdjbGVhckZsYWcnLCB0aGUKLSAqIGludGVybmFsIGZsYWcgd2lsbCBiZSByZXNldCByZWFkeSB0byBjYXRjaCBhbm90aGVyIGNyaXRpY2FsIGVycm9yLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKTsKLWludCAgICAgUE1BUEkgUE1fY3JpdGljYWxFcnJvcihpbnQgKmF4VmFsdWUsIGludCAqZGlWYWx1ZSwgaW50IGNsZWFyRmxhZyk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gaW5zdGFsbCBhbiBhbHRlcm5hdGUgY3JpdGljYWwgaGFuZGxlciB0aGF0IHdpbGwgY2FsbCB5b3VyCi0gKiBjb2RlIGRpcmVjdGx5LiBUaGlzIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYWxsIERPUyBleHRlbmRlcnMsIGJ1dCBkb2VzCi0gKiB3b3JrIHVuZGVyIHJlYWwgbW9kZSwgRE9TNEdXIGFuZCBYMzItVk0uIEl0IGRvZXMgbm90IHdvcmsgdW5kZXIgdGhlCi0gKiBQb3dlclBhY2sgMzIgYml0IERPUyBleHRlbmRlcnMuIElmIHlvdSBmaWd1cmUgb3V0IGhvdyB0byBkbyBpdCBsZXQgdXMga25vdyEKLSAqCi0gKiBOb3RlIHRoYXQgeW91IHNob3VsZCBlaXRoZXIgaW5zdGFsbCBvbmUgb3IgdGhlIG90aGVyLCBidXQgbm90IGJvdGghCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlcik7Ci0KLS8qIEZ1bmN0aW9ucyB0byBtYW5hZ2UgcHJvdGVjdGVkIG1vZGUgb25seSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKTsKLXZvaWQgICAgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpaCk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fUE1JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3NjaXRlY2guaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNWVlZTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3NjaXRlY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDcxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgR2VuZXJhbCBoZWFkZXIgZmlsZSBmb3Igb3BlcmF0aW5nIHN5c3RlbSBwb3J0YWJsZSBjb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1NDSVRFQ0hfSAotI2RlZmluZSBfX1NDSVRFQ0hfSAotCi0vKiBXZSBoYXZlIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0byBpZGVudGlmeSB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQ6Ci0gKgotICogIF9fMTZCSVRfXyAgICAgICBDb21waWxpbmcgZm9yIDE2IGJpdCBjb2RlIChhbnkgZW52aXJvbm1lbnQpCi0gKiAgX18zMkJJVF9fICAgICAgIENvbXBpbGluZyBmb3IgMzIgYml0IGNvZGUgKGFueSBlbnZpcm9ubWVudCkKLSAqICBfX01TRE9TX18gICAgICAgQ29tcGlsaW5nIGZvciBNUy1ET1MgKGluY2x1ZGVzIF9fV0lORE9XUzE2X18sIF9fV0lOMzg2X18pCi0gKiAgX19SRUFMRE9TX18gICAgIENvbXBpbGluZyBmb3IgTVMtRE9TIChleGNsdWRlcyBfX1dJTkRPV1MxNl9fKQotICogIF9fTVNET1MxNl9fICAgICBDb21waWxpbmcgZm9yIDE2IGJpdCBNUy1ET1MKLSAqICBfX01TRE9TMzJfXyAgICAgQ29tcGlsaW5nIGZvciAzMiBiaXQgTVMtRE9TCi0gKiAgX19XSU5ET1dTX18gICAgIENvbXBpbGluZyBmb3IgV2luZG93cwotICogIF9fV0lORE9XUzE2X18gICBDb21waWxpbmcgZm9yIDE2IGJpdCBXaW5kb3dzIChfX01TRE9TX18gYWxzbyBkZWZpbmVkKQotICogIF9fV0lORE9XUzMyX18gICBDb21waWxpbmcgZm9yIDMyIGJpdCBXaW5kb3dzCi0gKiAgX19XSU4zMl9WWERfXyAgIENvbXBpbGluZyBmb3IgYSAzMi1iaXQgQyBiYXNlZCBWeEQKLSAqICBfX05UX0RSSVZFUl9fICAgQ29tcGlsaW5nIGZvciBhIDMyLWJpdCBDIGJhc2VkIE5UIGRldmljZSBkcml2ZXIKLSAqICBfX09TMl9fICAgICAgICAgQ29tcGlsaW5nIGZvciBPUy8yCi0gKiAgX19PUzJfMTZfXyAgICAgIENvbXBpbGluZyBmb3IgMTYgYml0IE9TLzIKLSAqICBfX09TMl8zMl9fICAgICAgQ29tcGlsaW5nIGZvciAzMiBiaXQgT1MvMgotICogIF9fVU5JWF9fICAgICAgICBDb21waWxpbmcgZm9yIFVuaXgKLSAqICBfX1FOWF9fICAgICAgICAgQ29tcGlsaW5nIGZvciB0aGUgUU5YIHJlYWx0aW1lIE9TIChVbml4IGNvbXBhdGlibGUpCi0gKiAgX19MSU5VWF9fICAgICAgIENvbXBpbGluZyBmb3IgdGhlIExpbnV4IE9TIChVbml4IGNvbXBhdGlibGUpCi0gKiAgX19GUkVFQlNEX18gICAgIENvbXBpbGluZyBmb3IgdGhlIEZyZWVCU0QgT1MgKFVuaXggY29tcGF0aWJsZSkKLSAqICBfX0JFT1NfXyAgICAgICAgQ29tcGlsaW5nIGZvciB0aGUgQmVPUyAoVW5peCBjb21wYXRpYmxlKQotICogIF9fU01YMzJfXyAgICAgICBDb21waWxpbmcgZm9yIHRoZSBTTVggMzItYml0IFJlYWwgVGltZSBPUwotICogIF9fRU5FQV9PU0VfXyAgICBDb21waWxpbmcgZm9yIHRoZSBPU0UgZW1iZWRkZWQgT1MKLSAqICBfX1JUVEFSR0VUX18gICAgQ29tcGlsaW5nIGZvciB0aGUgUlRUYXJnZXQgMzItYml0IGVtYmVkZGVkIE9TCi0gKiAgX19NQUNPU19fICAgICAgIENvbXBpbGluZyBmb3IgdGhlIE1hY09TIHBsYXRmb3JtIChQb3dlclBDKQotICogIF9fRFJJVkVSX18gICAgICBDb21waWxpbmcgZm9yIGEgMzItYml0IGJpbmFyeSBjb21wYXRpYmxlIGRyaXZlcgotICogIF9fQ09OU09MRV9fICAgICBDb21waWxpbmcgZm9yIGEgZnVsbHNjcmVlbiBPUyBjb25zb2xlIG1vZGUKLSAqICBfX1NOQVBfXyAgICAgICAgQ29tcGlsaW5nIGFzIGEgU25hcCBleGVjdXRlYWJsZSBvciBkeW5hbWljIGxpYnJhcnkKLSAqCi0gKiAgX19JTlRFTF9fICAgICAgIENvbXBpbGluZyBmb3IgSW50ZWwgQ1BVJ3MKLSAqICBfX0FMUEhBX18gICAgICAgQ29tcGlsaW5nIGZvciBERUMgQWxwaGEgQ1BVJ3MKLSAqICBfX01JUFNfXyAgICAgICAgQ29tcGlsaW5nIGZvciBNSVBTIENQVSdzCi0gKiAgX19QUENfXyAgICAgICAgIENvbXBpbGluZyBmb3IgUG93ZXJQQyBDUFUncwotICogIF9fTUM2OEtfXyAgICAgICBDb21waWxpbmcgZm9yIE1vdG9yb2xhIDY4MHgwCi0gKgotICogIF9fQklHX0VORElBTl9fICBDb21waWxpbmcgZm9yIGEgYmlnIGVuZGlhbiBwcm9jZXNzb3IKLSAqCi0gKi8KLQotI2lmZGVmICBfX1NDX18KLSNpZiAgICAgX19JTlRTSVpFID09IDQKLSNkZWZpbmUgX19TQzM4Nl9fCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBEZXRlcm1pbmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgY29tcGlsZXIgc3BlY2lmaWMgKi8KLQotI2lmZGVmICBfX0dOVUNfXwotI2lmZGVmICBfX2NwbHVzcGx1cwotLyogRysrIGN1cnJlbnRseSBmdWNrcyB0aGlzIHVwISAqLwotI2RlZmluZSBfX2NkZWNsCi0jZGVmaW5lIF9fc3RkY2FsbAotI2Vsc2UKLSN1bmRlZiAgX19jZGVjbAotI3VuZGVmICBfX3N0ZGNhbGwKLSNkZWZpbmUgX19jZGVjbCAgICAgX19hdHRyaWJ1dGVfXyAoKGNkZWNsKSkKLSNkZWZpbmUgX19zdGRjYWxsICAgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKQotI2VuZGlmCi0jZGVmaW5lIF9fRkxBVF9fICAgICAgICAgICAgLyogR0NDIGlzIGFsd2F5cyAzMiBiaXQgZmxhdCBtb2RlbCAgICAgICAgICAqLwotI2RlZmluZSBfX0hBU19CT09MX18gICAgICAgIC8qIExhdGVzdCBHTlUgQysrIGhhcyBpYm9vbCB0eXBlICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19IQVNfTE9OR19MT05HX18gICAvKiBHTlUgQyBzdXBwb3J0cyBsb25nIGxvbmcgdHlwZSAgICAgICAgICAgICovCi0jaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgICAgLyogQnJpbmcgaW4gZm9yIGRlZmluaXRpb24gb2YgTlVMTCAgICAgICAgICAqLwotI2VuZGlmCi0KLSNpZmRlZiAgX19CT1JMQU5EQ19fCi0jaWYgKF9fQk9STEFORENfXyA+PSAweDUwMCkgfHwgZGVmaW5lZChDTEFTU0xJQl9ERUZTX0gpCi0jZGVmaW5lIF9fSEFTX0JPT0xfXyAgICAgICAgLyogQm9ybGFuZCBDKysgNS4wIGRlZmluZXMgaWJvb2wgdHlwZSAgICAgICAqLwotI2VuZGlmCi0jaWYgKF9fQk9STEFORENfXyA+PSAweDUwMikgJiYgIWRlZmluZWQoVlRPT0xTRCkgJiYgIWRlZmluZWQoX19TTVgzMl9fKQotI2RlZmluZSBfX0hBU19JTlQ2NF9fICAgICAgIC8qIEJvcmxhbmQgQysrIDUuMDIgc3VwcG9ydHMgX19pbnQ2NCB0eXBlICAgKi8KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKFZUT09MU0QpICYmICFkZWZpbmVkKF9fU01YMzJfXykKLSNkZWZpbmUgX19IQVNfSU5UNjRfXyAgICAgICAvKiBWaXN1YWwgQysrIHN1cHBvcnRzIF9faW50NjQgdHlwZSAgICAgICAgICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmIChfX1dBVENPTUNfXyA+PSAxMTAwKSAmJiAhZGVmaW5lZChWVE9PTFNEKSAmJiAhZGVmaW5lZChfX1NNWDMyX18pCi0jZGVmaW5lIF9fSEFTX0lOVDY0X18gICAgICAgLyogV2F0Y29tIEMrKyAxMS4wIHN1cHBvcnRzIF9faW50NjQgdHlwZSAgICAqLwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEZXRlcm1pbmUgdGhlIGNvbXBpbGUgdGltZSBlbnZpcm9ubWVudC4gVGhpcyBtdXN0IGJlIGRvbmUgZm9yIGVhY2gKLSAqIHN1cHBvcnRlZCBwbGF0Zm9ybSBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgYXQgY29tcGlsZSB0aW1lIHRoZSB0YXJnZXQKLSAqIGVudmlyb25tZW50LCBob3BlZnVsbHkgd2l0aG91dCByZXF1aXJpbmcgI2RlZmluZSdzIGZyb20gdGhlIHVzZXIuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiAzMi1iaXQgYmluYXJ5IGNvbXBhdGlibGUgZHJpdmVyLiBDb21waWxlZCBhcyBXaW4zMiwgYnV0IGFzIE9TIG5ldXRyYWwgKi8KLSNpZmRlZiAgX19EUklWRVJfXwotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSN1bmRlZiAgX19XSU5ET1dTX18KLSN1bmRlZiAgX1dJTjMyCi0jdW5kZWYgIF9fV0lOMzJfXwotI3VuZGVmICBfX05UX18KLQotLyogMzItYml0IFNuYXAgZXhlIG9yIGRsbC4gQ29tcGlsZWQgYXMgV2luMzIsIGJ1dCBhcyBPUyBuZXV0cmFsICovCi0jZWxpZiAgIGRlZmluZWQoX19TTkFQX18pCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI3VuZGVmICBfX1dJTkRPV1NfXwotI3VuZGVmICBfV0lOMzIKLSN1bmRlZiAgX19XSU4zMl9fCi0jdW5kZWYgIF9fTlRfXwotCi0vKiAzMi1iaXQgV2luZG93cyBWeEQgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fdnRvb2xzZF9oXykgfHwgZGVmaW5lZChWVE9PTFNEKQotI2luY2x1ZGUgPHZ0b29sc2MuaD4KLSNkZWZpbmUgX19XSU4zMl9WWERfXwotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNkZWZpbmUgX01BWF9QQVRIICAgMjU2Ci0jdW5kZWYgX19XSU5ET1dTMzJfXwotCi0vKiAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXIgY29tcGlsZSBlbnZpcm9ubWVudDogVE9ETyEhICovCi0jZWxpZiAgIGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJudGRyaXZlci5oIgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNkZWZpbmUgX01BWF9QQVRIICAgMjU2Ci0jdW5kZWYgX19XSU5ET1dTMzJfXwotCi0vKiAzMi1iaXQgU01YIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX1NNWDMyX18pCi0jaWZuZGVmIF9fTVNET1NfXwotI2RlZmluZSBfX01TRE9TX18KLSNlbmRpZgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19DT05TT0xFX18KLSNkZWZpbmUgX19DT05TT0xFX18KLSNlbmRpZgotCi0vKiAzMi1iaXQgRW5lYSBPU0UgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX0VORUFfT1NFX18pCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0KLS8qIDMyLWJpdCBSVFRhcmdldC0zMiBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLQotLyogMzItYml0IGV4dGVuZGVkIERPUyBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19NU0RPU19fKSB8fCBkZWZpbmVkKF9fTVNET1MzMl9fKSB8fCBkZWZpbmVkKF9fRE9TX18pIHx8IGRlZmluZWQoX19EUE1JMzJfXykgfHwgKGRlZmluZWQoTV9JODYpICYmICghZGVmaW5lZChfX1NDMzg2X18pICYmICFkZWZpbmVkKE1fSTM4NikpKSB8fCBkZWZpbmVkKFROVCkKLSNpZm5kZWYgX19NU0RPU19fCi0jZGVmaW5lIF9fTVNET1NfXwotI2VuZGlmCi0jaWYgICAgIGRlZmluZWQoX19NU0RPUzMyX18pIHx8IGRlZmluZWQoX18zODZfXykgfHwgZGVmaW5lZChfX0ZMQVRfXykgfHwgZGVmaW5lZChfX05UX18pIHx8IGRlZmluZWQoX19TQzM4Nl9fKQotI2lmbmRlZiBfX01TRE9TMzJfXwotI2RlZmluZSBfX01TRE9TMzJfXwotI2VuZGlmCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2lmbmRlZiBfX1JFQUxET1NfXwotI2RlZmluZSBfX1JFQUxET1NfXwotI2VuZGlmCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLQotLyogMTYtYml0IFdpbmRvd3MgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICAoZGVmaW5lZChfV2luZG93cykgfHwgZGVmaW5lZChfV0lORE9XUykpICYmICFkZWZpbmVkKF9fRFBNSTE2X18pCi0jaWZuZGVmIF9fMTZCSVRfXwotI2RlZmluZSBfXzE2QklUX18KLSNlbmRpZgotI2lmbmRlZiBfX1dJTkRPV1MxNl9fCi0jZGVmaW5lIF9fV0lORE9XUzE2X18KLSNlbmRpZgotI2lmbmRlZiBfX1dJTkRPV1NfXwotI2RlZmluZSBfX1dJTkRPV1NfXwotI2VuZGlmCi0jaWZuZGVmIF9fTVNET1NfXwotI2RlZmluZSBfX01TRE9TX18KLSNlbmRpZgotCi0vKiAxNi1iaXQgRE9TIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbHNlCi0jaWZuZGVmIF9fMTZCSVRfXwotI2RlZmluZSBfXzE2QklUX18KLSNlbmRpZgotI2lmbmRlZiBfX01TRE9TMTZfXwotI2RlZmluZSBfX01TRE9TMTZfXwotI2VuZGlmCi0jaWZuZGVmIF9fUkVBTERPU19fCi0jZGVmaW5lIF9fUkVBTERPU19fCi0jZW5kaWYKLSNpZm5kZWYgX19DT05TT0xFX18KLSNkZWZpbmUgX19DT05TT0xFX18KLSNlbmRpZgotI2VuZGlmCi0KLS8qIDMyLWJpdCBXaW5kb3dzIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fTlRfXykKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fV0lORE9XUzMyX18KLSNkZWZpbmUgX19XSU5ET1dTMzJfXwotI2VuZGlmCi0jaWZuZGVmIF9XSU4zMgotI2RlZmluZSBfV0lOMzIgICAgICAgICAgICAgICAgICAvKiBNaWNyb3NvZnQgV2luMzIgU0RLIGhlYWRlcnMgdXNlIF9XSU4zMiAqLwotI2VuZGlmCi0jaWZuZGVmIFdJTjMyCi0jZGVmaW5lIFdJTjMyICAgICAgICAgICAgICAgICAgIC8qIE9wZW5HTCBoZWFkZXJzIHVzZSBXSU4zMiAqLwotI2VuZGlmCi0jaWZuZGVmIF9fV0lORE9XU19fCi0jZGVmaW5lIF9fV0lORE9XU19fCi0jZW5kaWYKLQotLyogMzItYml0IE9TLzIgVkREIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLS8qIFdlJ3JlIGFzc3VtaW5nIChmb3Igbm93KSB0aGF0IENMMzg2IG11c3QgYmUgdXNlZCAqLwotI2VsaWYgICBkZWZpbmVkKE1TRE9TKSAmJiBkZWZpbmVkKE1fSTM4NikKLS8qIGZpeGVzIG5lY2Vzc2FyeSB0byBjb21waWxlIHdpdGggQ0wzODYgKi8KLSNkZWZpbmUgX19jZGVjbCAgX2NkZWNsCi10eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7Ci0KLSNpbmNsdWRlIDxtdmRtLmg+Ci0KLS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHNvbWV3aGVyZSBlbHNlLi4uICAgICAgICAgICAgICAgICAqLwotLyogSW5saW5lIGVsaWdpYmxlIGZ1bmN0aW9ucyAod2UgaGF2ZSBubyBDUlQgbGlicyBmb3IgQ0wzODYpICovCi0jcHJhZ21hIGludHJpbnNpYyAoc3RyY3B5LCBzdHJjbXAsIHN0cmxlbiwgc3RyY2F0KQotI3ByYWdtYSBpbnRyaW5zaWMgKG1lbWNtcCwgbWVtY3B5LCBtZW1zZXQpCi0KLSNkZWZpbmUgX19PUzJfVkREX18KLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jZGVmaW5lIENDSE1BWFBBVEggIDI1NgotI2RlZmluZSBfTUFYX1BBVEggICAyNTYKLSNpZm5kZWYgX19PUzJfXwotI2RlZmluZSBfX09TMl9fCi0jZW5kaWYKLSNpZm5kZWYgX19PUzJfMzJfXwotI2RlZmluZSBfX09TMl8zMl9fCi0jZW5kaWYKLQotLyogMTYtYml0IE9TLzIgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fT1MyXzE2X18pCi0jaWZuZGVmIF9fT1MyX18KLSNkZWZpbmUgX19PUzJfXwotI2VuZGlmCi0jaWZuZGVmIF9fMTZCSVRfXwotI2RlZmluZSBfXzE2QklUX18KLSNlbmRpZgotI2lmbmRlZiBfX09TMl9QTV9fCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLSNlbmRpZgotCi0vKiAzMi1iaXQgT1MvMiBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfXykgfHwgZGVmaW5lZChfX09TMl8zMl9fKQotI2lmbmRlZiBfX09TMl9fCi0jZGVmaW5lIF9fT1MyX18KLSNlbmRpZgotI2lmbmRlZiBfX09TMl8zMl9fCi0jZGVmaW5lIF9fT1MyXzMyX18KLSNlbmRpZgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19PUzJfUE1fXwotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogMzItYml0IFFOWCBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19RTlhfXykKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fVU5JWF9fCi0jZGVmaW5lIF9fVU5JWF9fCi0jZW5kaWYKLSNpZmRlZiAgX19HTlVDX18KLSNkZWZpbmUgc3RyaWNtcCBzdHJjYXNlY21wCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChfX1BIT1RPTl9fKSAmJiAhZGVmaW5lZChfX1gxMV9fKQotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogMzItYml0IExpbnV4IGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX0xJTlVYX18pIHx8IGRlZmluZWQobGludXgpCi0jaWZuZGVmIF9fTElOVVhfXwotI2RlZmluZSBfX0xJTlVYX18KLSNlbmRpZgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19VTklYX18KLSNkZWZpbmUgX19VTklYX18KLSNlbmRpZgotI2lmZGVmICBfX0dOVUNfXwotI2RlZmluZSBzdHJpY21wIHN0cmNhc2VjbXAKLSNlbmRpZgotI2lmbmRlZiBfX1gxMV9fCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLSNlbmRpZgotCi0vKiAzMi1iaXQgRnJlZUJTRCBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19GUkVFQlNEX18pCi0jaWZuZGVmIF9fRlJFRUJTRF9fCi0jZGVmaW5lIF9fRlJFRUJTRF9fCi0jZW5kaWYKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fVU5JWF9fCi0jZGVmaW5lIF9fVU5JWF9fCi0jZW5kaWYKLSNpZmRlZiAgX19HTlVDX18KLSNkZWZpbmUgc3RyaWNtcCBzdHJjYXNlY21wCi0jZW5kaWYKLSNpZm5kZWYgX19YMTFfXwotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogMzItYml0IEJlT1MgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fQkVPU19fKQotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19VTklYX18KLSNkZWZpbmUgX19VTklYX18KLSNlbmRpZgotI2lmZGVmICBfX0dOVUNfXwotI2RlZmluZSBzdHJpY21wIHN0cmNhc2VjbXAKLSNlbmRpZgotCi0vKiBVbnN1cHBvcnRlZCBPUyEgKi8KLSNlbHNlCi0jZXJyb3IgIFRoaXMgcGxhdGZvcm0gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQhCi0jZW5kaWYKLQotLyogRGV0ZXJtaW5lIHRoZSBDUFUgdHlwZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yICovCi0KLSNpZiAgICAgZGVmaW5lZChfX01fQUxQSEEpIHx8IGRlZmluZWQoX19BTFBIQV8pIHx8IGRlZmluZWQoX19BTFBIQSkgfHwgZGVmaW5lZChfX2FscGhhKQotI2lmbmRlZiBfX0FMUEhBX18KLSNkZWZpbmUgX19BTFBIQV9fCi0jZW5kaWYKLSNlbGlmICAgZGVmaW5lZChfX01fUFBDKSB8fCBkZWZpbmVkKF9fUE9XRVJDKQotI2lmbmRlZiBfX1BQQ19fCi0jZGVmaW5lIF9fUFBDX18KLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fTV9NUlgwMDApCi0jaWZuZGVmIF9fTUlQU19fCi0jZGVmaW5lIF9fTUlQU19fCi0jZW5kaWYKLSNlbHNlCi0jaWZuZGVmIF9fSU5URUxfXwotI2RlZmluZSBfX0lOVEVMX18gICAgICAgICAgICAgICAvKiBBc3N1bWUgSW50ZWwgaWYgbm90aGluZyBmb3VuZCAqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGRlZmluZXMgdG8gZGVmaW5lIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvcgotICogcHVibGljbHkgYWNjZXNpYmxlIGZ1bmN0aW9uczoKLSAqCi0gKiAgX1BVQkFQSSAgLSBDb21waWxlciBkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbnMgZm9yIGFsbCBwdWJsaWMgJ0MnIGZ1bmN0aW9ucwotICogIF9BU01BUEkgIC0gQ2FsbGluZyBjb252ZW50aW9ucyBmb3IgYWxsIHB1YmxpYyBhc3NlbWJsZXIgZnVuY3Rpb25zCi0gKiAgX1ZBUkFQSSAgLSBNb2RpZmllcnMgZm9yIHZhcmlhYmxlczsgV2F0Y29tIEMrKyBtYW5nbGVzIEMrKyBnbG9iYWxzCi0gKiAgX1NURENBTEwgLSBXaW4zMiBfX3N0ZGNhbGwgd2hlcmUgcG9zc2libGUsIF9fY2RlY2wgaWYgbm90IHN1cHBvcnRlZAotICovCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19TQ19fKQotI2RlZmluZSBfX1BBU0NBTCAgICBfX3N0ZGNhbGwKLSNlbHNlCi0jZGVmaW5lIF9fUEFTQ0FMICAgIF9fcGFzY2FsCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoTk9fU1REQ0FMTCkKLSNkZWZpbmUgX1NURENBTEwgICAgX19jZGVjbAotI2Vsc2UKLSNkZWZpbmUgX1NURENBTEwgICAgX19zdGRjYWxsCi0jZW5kaWYKLQotI2lmZGVmICBfX1dBVENPTUNfXwotI2lmIChfX1dBVENPTUNfXyA+PSAxMDUwKQotI2RlZmluZSBfVkFSQVBJICAgICBfX2NkZWNsCi0jZWxzZQotI2RlZmluZSBfVkFSQVBJCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIF9WQVJBUEkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0lCTUNfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQotI2RlZmluZSBQVFJfREVDTF9JTl9GUk9OVAotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgYWxsIHB1YmxpYyBmdW5jdGlvbnMuIEZvciBzaW1wbGljaXR5Ci0gKiB3ZSBkZWZpbmUgYWxsIHB1YmxpYyBmdW5jdGlvbnMgYXMgX19jZGVjbCBjYWxsaW5nIGNvbnZlbnRpb25zLCBzbyB0aGF0Ci0gKiB0aGV5IGFyZSB0aGUgc2FtZSBhY3Jvc3MgYWxsIGNvbXBpbGVycyBhbmQgcnVudGltZSBETEwncy4KLSAqLwotCi0jZGVmaW5lIF9QVUJBUEkgX19jZGVjbAotI2RlZmluZSBfQVNNQVBJIF9fY2RlY2wKLQotLyogRGV0ZXJtaW5lIHRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBhIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBhCi0gKiBjYWxsaW5nIGNvbnZlbnRpb25zIG92ZXJyaWRlLiBNb3N0IGNvbXBpbGVycyByZXF1aXJlIHRoZSBjYWxsaW5nCi0gKiBjb252ZW50aW9uIHRvIGJlIGRlY2xhcmVkIGluIGZyb250IG9mIHRoZSAnKicsIGJ1dCBvdGhlcnMgcmVxdWlyZQotICogaXQgdG8gYmUgZGVjbGFyZWQgYWZ0ZXIgdGhlICcqJy4gV2UgaGFuZGxlIGJvdGggaW4gaGVyZSBkZXBlbmRpbmcKLSAqIG9uIHdoYXQgdGhlIGNvbXBpbGVyIHJlcXVpcmVzLgotICovCi0KLSNpZmRlZiAgUFRSX0RFQ0xfSU5fRlJPTlQKLSNkZWZpbmUgX1BVQkFQSVAgICAgKiBfUFVCQVBJCi0jZGVmaW5lIF9BU01BUElQICAgICogX0FTTUFQSQotI2Vsc2UKLSNkZWZpbmUgX1BVQkFQSVAgICAgX1BVQkFQSSAqCi0jZGVmaW5lIF9BU01BUElQICAgIF9BU01BUEkgKgotI2VuZGlmCi0KLS8qIFVzZWZ1bCBtYWNyb3MgKi8KLQotI2RlZmluZSBQUklWQVRFIHN0YXRpYwotI2RlZmluZSBQVUJMSUMKLQotLyogVGhpcyBIQVMgdG8gYmUgMEwgZm9yIDE2LWJpdCByZWFsIG1vZGUgY29kZSB0byB3b3JrISEhICovCi0KLSNpZm5kZWYgTlVMTAotIyAgICAgICBkZWZpbmUgX05VTEwgMEwKLSMgICAgICAgZGVmaW5lIE5VTEwgX05VTEwKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgICAgICBkZWZpbmUgTUFYKGEsYikgKCAoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLSNlbmRpZgotI2lmbmRlZiBNSU4KLSMgICAgICAgZGVmaW5lIE1JTihhLGIpICggKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLSNpZm5kZWYgQUJTCi0jICAgICAgIGRlZmluZSBBQlMoYSkgICAoKGEpID49IDAgPyAoYSkgOiAtKGEpKQotI2VuZGlmCi0jaWZuZGVmIFNJR04KLSMgICAgICAgZGVmaW5lIFNJR04oYSkgICgoYSkgPiAwID8gMSA6IC0xKQotI2VuZGlmCi0KLS8qIEdlbmVyYWwgdHlwZWRlZnMgKi8KLQotI2lmbmRlZiBfX0dFTkRFRlMKLSNkZWZpbmUgX19HRU5ERUZTCi0jaWYgZGVmaW5lZChfX0JFT1NfXykKLSNpbmNsdWRlIDxTdXBwb3J0RGVmcy5oPgotI2Vsc2UKLSNpZmRlZiBfX0xJTlVYX18KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBfX1NUUklDVF9BTlNJX18KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1c2hvcnQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgdWxvbmc7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDsKLSNlbmRpZgotI2lmZGVmICBfX0tFUk5FTF9fCi0jZGVmaW5lIF9fR0VOREVGU18yCi0jZW5kaWYKLSNlbHNlCi0jaWYgIShkZWZpbmVkKF9fUU5YTlRPX18pICYmIGRlZmluZWQoR0VORVJBTF9TVFJVQ1QpKQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVzaG9ydDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICB1bG9uZzsKLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQ7Ci0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1Y2hhcjsKLSNlbmRpZgotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgIGlib29sOyAgICAgIC8qIEludGVnZXIgYm9vbGVhbiB0eXBlICAgICAgICAgKi8KLSNpZmRlZiAgVVNFX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IGZvciBvbGRlciBjb2RlICAgICAgICAgICovCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIGJvb2wgICAgICAgICAgICAgICAgaWJvb2wgICAgICAgLyogU3RhbmRhcmQgQyAgICAgICAgICAgICAgICAgICAqLwotI2Vsc2UKLSNpZm5kZWYgX19IQVNfQk9PTF9fCi0jZGVmaW5lIGJvb2wgICAgICAgICAgICAgICAgaWJvb2wgICAgICAgLyogT2xkZXIgQysrIGNvbXBpbGVycyAgICAgICAgICAqLwotI2VuZGlmCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgIC8qIFVTRV9CT09MICovCi0jZW5kaWYgIC8qIF9fR0VOREVGUyAqLwotCi0vKiBNb3JlIGdlbmVyYWwgdHlwZWRlZnMgY29tcGF0aWJsZSB3aXRoIExpbnV4IGtlcm5lbCBjb2RlICovCi0KLSNpZm5kZWYgX19HRU5ERUZTXzIKLSNkZWZpbmUgX19HRU5ERUZTXzIKLXR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBzODsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1ODsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBzMTY7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdTE2OwotI2lmZGVmICBfXzE2QklUX18KLXR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICBzMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgdTMyOwotI2Vsc2UKLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBzMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdTMyOwotI2VuZGlmCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTMyIGxvdzsKLSAgICBzMzIgaGlnaDsKLSAgICB9IF9faTY0OwotI2lmZGVmICBfX0hBU19MT05HX0xPTkdfXwotI2RlZmluZSBfX05BVElWRV9JTlQ2NF9fCi10eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICAgczY0OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHU2NDsKLSNlbGlmICAgZGVmaW5lZChfX0hBU19JTlQ2NF9fKSAmJiAhZGVmaW5lZChfXzE2QklUX18pCi0jZGVmaW5lIF9fTkFUSVZFX0lOVDY0X18KLXR5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICBzNjQ7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgdTY0OwotI2Vsc2UKLXR5cGVkZWYgX19pNjQgICAgICAgICAgICAgICBzNjQ7Ci10eXBlZGVmIF9faTY0ICAgICAgICAgICAgICAgdTY0OwotI2VuZGlmCi0jZW5kaWYKLQotLyogQm9vbGVhbiB0cnV0aCB2YWx1ZXMgKi8KLQotI3VuZGVmICBmYWxzZQotI3VuZGVmICB0cnVlCi0jdW5kZWYgIE5PCi0jdW5kZWYgIFlFUwotI3VuZGVmICBGQUxTRQotI3VuZGVmICBUUlVFCi0jZGVmaW5lIGZhbHNlICAgICAgIDAKLSNkZWZpbmUgdHJ1ZSAgICAgICAgMQotI2RlZmluZSBOTyAgICAgICAgICAwCi0jZGVmaW5lIFlFUyAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgMAotI2RlZmluZSBUUlVFICAgICAgICAxCi0KLS8qIElubGluZSBkZWJ1Z2dlciBpbnRlcnJ1cHRzIGZvciBXYXRjb20gQysrIGFuZCBCb3JsYW5kIEMrKyAqLwotCi0jaWZkZWYgIF9fV0FUQ09NQ19fCi12b2lkIERlYnVnSW50KHZvaWQpOwotI3ByYWdtYSBhdXggRGVidWdJbnQgPSAgICAgICAgICAgICAgXAotICAgICJpbnQgICAgMyI7Ci12b2lkIERlYnVnVnhEKHZvaWQpOwotI3ByYWdtYSBhdXggRGVidWdWeEQgPSAgICAgICAgICAgICAgXAotICAgICJpbnQgICAgMSI7Ci0jZWxpZiAgIGRlZmluZWQoX19CT1JMQU5EQ19fKQotI2RlZmluZSBEZWJ1Z0ludCgpICBfX2VtaXRfXygweENDKQotI2RlZmluZSBEZWJ1Z1Z4RCgpICB7X19lbWl0X18oMHhDRCk7IF9fZW1pdF9fKDB4MDEpO30KLSNlbGlmICAgZGVmaW5lZChfTVNDX1ZFUikKLSNkZWZpbmUgRGVidWdJbnQoKSAgX2FzbSBpbnQgMHgzCi0jZGVmaW5lIERlYnVnVnhEKCkgIF9hc20gaW50IDB4MQotI2VsaWYgICBkZWZpbmVkKF9fR05VQ19fKQotI2RlZmluZSBEZWJ1Z0ludCgpICBhc20gdm9sYXRpbGUgKCJpbnQgJDB4MyIpCi0jZGVmaW5lIERlYnVnVnhEKCkgIGFzbSB2b2xhdGlsZSAoImludCAkMHgxIikKLSNlbHNlCi12b2lkIF9BU01BUEkgRGVidWdJbnQodm9pZCk7Ci12b2lkIF9BU01BUEkgRGVidWdWeEQodm9pZCk7Ci0jZW5kaWYKLQotLyogTWFjcm9zIHRvIGJyZWFrIG9uY2UgYW5kIG5ldmVyIGJyZWFrIGFnYWluICovCi0KLSNkZWZpbmUgRGVidWdJbnRPbmNlKCkgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgaWJvb2wgZmlyc3RUaW1lID0gdHJ1ZTsgIFwKLSAgICBpZiAoZmlyc3RUaW1lKSB7ICAgICAgICAgICAgICAgIFwKLQlmaXJzdFRpbWUgPSBmYWxzZTsgICAgICAgICAgXAotCURlYnVnSW50KCk7ICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEZWJ1Z1Z4RE9uY2UoKSAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0YXRpYyBpYm9vbCBmaXJzdFRpbWUgPSB0cnVlOyAgXAotICAgIGlmIChmaXJzdFRpbWUpIHsgICAgICAgICAgICAgICAgXAotCWZpcnN0VGltZSA9IGZhbHNlOyAgICAgICAgICBcCi0JRGVidWdWeEQoKTsgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vKiBNYWNyb3MgZm9yIGxpbnV4IHN0cmluZyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyAqLwotCi0jaWZkZWYgIF9fTElOVVhfXwotI2RlZmluZSBzdHJpY21wIHN0cmNhc2VjbXAKLSNkZWZpbmUgc3RybmljbXAgc3RybmNhc2VjbXAKLSNlbmRpZgotCi0vKiBNYWNyb3MgZm9yIE5UIGRyaXZlciBzdHJpbmcgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgKi8KLQotI2lmZGVmIF9fTlRfRFJJVkVSX18KLSNkZWZpbmUgc3RyaWNtcCBfc3RyaWNtcAotI2RlZmluZSBzdHJuaWNtcCBfc3RybmljbXAKLSNlbmRpZgotCi0vKiBHZXQgcmlkIG9mIHNvbWUgaGVsYWNpb3VzbHkgYW5ub3lpbmcgVmlzdWFsIEMrKyB3YXJuaW5ncyEgKi8KLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fTVdFUktTX18pICYmICFkZWZpbmVkKF9fU0NfXykKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3NjEpICAgLyogaW50ZWdyYWwgc2l6ZSBtaXNtYXRjaCBpbiBhcmd1bWVudDsgY29udmVyc2lvbiBzdXBwbGllZCAqLwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDI0NCkgICAvKiBjb252ZXJzaW9uIGZyb20gJ3Vuc2lnbmVkIHNob3J0ICcgdG8gJ3Vuc2lnbmVkIGNoYXIgJywgcG9zc2libGUgbG9zcyBvZiBkYXRhICovCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MDE4KSAgIC8qICc8JyA6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaCAqLwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDMwNSkgICAvKiAnaW5pdGlhbGl6aW5nJyA6IHRydW5jYXRpb24gZnJvbSAnY29uc3QgZG91YmxlJyB0byAnZmxvYXQnICovCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFNldCBvZiBkZWJ1Z2dpbmcgbWFjcm9zIHVzZWQgYnkgdGhlIGxpYnJhcmllcy4gSWYgdGhlIGRlYnVnIGZsYWcgaXMKLSAqIHNldCwgdGhleSBhcmUgdHVybmVkIG9uIGRlcGVuZGluZyBvbiB0aGUgc2V0dGluZyBvZiB0aGUgZmxhZy4gVXNlciBjb2RlCi0gKiBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGNhbGxlZCB3aGVuIGEgY2hlY2sgZmFpbHMsIGFuZCB0aGUKLSAqIE1HTCBkb2VzIHRoaXMgc28gaXQgY2FuIHJlc3RvcmUgdGhlIHN5c3RlbSBmcm9tIGdyYXBoaWNzIG1vZGUgdG8gZGlzcGxheQotICogYW4gZXJyb3IgbWVzc2FnZS4gVGhlc2UgZnVuY3Rpb25zIGFsc28gbG9nIGluZm9ybWF0aW9uIHRvIHRoZQotICogc2NpdGVjaC5sb2cgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGhhcmQgZHJpdmUgd2hlbiBwcm9ibGVtcwotICogc2hvdyB1cC4KLSAqCi0gKiBJZiB5b3Ugc2V0IHRoZSB2YWx1ZSBvZiBDSEVDS0VEIHRvIGJlIDIsIGl0IHdpbGwgYWxzbyBlbmFibGUgY29kZSB0bwotICogaW5zZXJ0IGhhcmQgY29kZWQgZGVidWdnZXIgaW50ZXJydXB0IGludG8gdGhlIHNvdXJjZSBjb2RlIGF0IHRoZSBsaW5lIG9mCi0gKiBjb2RlIHdoZXJlIHRoZSBjaGVjayBmYWlsLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgcnVuIHRoZSBjb2RlIHVuZGVyIGEKLSAqIGRlYnVnZ2VyIGFzIGl0IHdpbGwgYnJlYWsgaW5zaWRlIHRoZSBkZWJ1Z2dlciBiZWZvcmUgZXhpdGluZyB3aXRoIGEKLSAqIGZhaWx1cmUgY29uZGl0aW9uLgotICoKLSAqIEFsc28gZm9yIGNvZGUgY29tcGlsZWQgdG8gcnVuIHVuZGVyIFdpbmRvd3MsIHdlIGFsc28gY2FsbCB0aGUKLSAqIE91dHB1dERlYnVnU3RyaW5nIGZ1bmN0aW9uIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHN5c3RlbSBkZWJ1Z2dlcgotICogc3VjaCBhcyBTb2Z0LUlDRSBvciBXREVCMzg2LiBIZW5jZSBpZiB5b3UgZ2V0IGFueSBub24tZmF0YWwgd2FybmluZ3MgeW91Ci0gKiB3aWxsIHNlZSB0aG9zZSBvbiB0aGUgZGVidWdnZXIgdGVybWluYWwgYXMgd2VsbCBhcyBpbiB0aGUgbG9nIGZpbGUuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLWV4dGVybiB2b2lkICgqX0NIS19mYWlsKShpbnQgZmF0YWwsY29uc3QgY2hhciAqbXNnLGNvbnN0IGNoYXIgKmNvbmQsY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7Ci12b2lkIF9DSEtfZGVmYXVsdEZhaWwoaW50IGZhdGFsLGNvbnN0IGNoYXIgKm1zZyxjb25zdCBjaGFyICpjb25kLGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpOwotCi0jaWZkZWYgIENIRUNLRUQKLSMgICAgICAgZGVmaW5lICBDSEsoeCkgICAgICB4Ci0jaWYgICAgIENIRUNLRUQgPiAxCi0jICAgICAgIGRlZmluZSAgQ0hFQ0socCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoKHApID8gKHZvaWQpMCA6IERlYnVnSW50KCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIF9DSEtfZmFpbCgxLCJDaGVjayBmYWlsZWQ6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgXAotCSAgICAjcCwgX19GSUxFX18sIF9fTElORV9fKSkKLSMgICAgICAgZGVmaW5lICBXQVJOKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgocCkgPyAodm9pZCkwIDogRGVidWdJbnQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgX0NIS19mYWlsKDAsIldhcm5pbmc6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgICAgICBcCi0JICAgICNwLCBfX0ZJTEVfXywgX19MSU5FX18pKQotI2Vsc2UKLSMgICAgICAgZGVmaW5lICBDSEVDSyhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgocCkgPyAodm9pZCkwIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgX0NIS19mYWlsKDEsIkNoZWNrIGZhaWxlZDogJyVzJywgZmlsZSAlcywgbGluZSAlZFxuIiwgICBcCi0JICAgICNwLCBfX0ZJTEVfXywgX19MSU5FX18pKQotIyAgICAgICBkZWZpbmUgIFdBUk4ocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChwKSA/ICh2b2lkKTAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBfQ0hLX2ZhaWwoMCwiV2FybmluZzogJyVzJywgZmlsZSAlcywgbGluZSAlZFxuIiwgICAgICAgIFwKLQkgICAgI3AsIF9fRklMRV9fLCBfX0xJTkVfXykpCi0jZW5kaWYKLSMgICAgICAgZGVmaW5lICBMT0dGQVRBTChtc2cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBfQ0hLX2ZhaWwoMSwiRmF0YWwgZXJyb3I6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgIFwKLQkgICAgbXNnLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jICAgICAgIGRlZmluZSAgTE9HV0FSTihtc2cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgX0NIS19mYWlsKDAsIldhcm5pbmc6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgICAgICBcCi0JICAgIG1zZywgX19GSUxFX18sIF9fTElORV9fKQotI2Vsc2UKLSMgICAgICAgZGVmaW5lICBDSEsoeCkKLSMgICAgICAgZGVmaW5lICBDSEVDSyhwKSAgICAgICAgKCh2b2lkKTApCi0jICAgICAgIGRlZmluZSAgV0FSTihwKSAgICAgICAgICgodm9pZCkwKQotIyAgICAgICBkZWZpbmUgIExPR0ZBVEFMKG1zZykgICAoKHZvaWQpMCkKLSMgICAgICAgZGVmaW5lICBMT0dXQVJOKG1zZykgICAgKCh2b2lkKTApCi0jZW5kaWYKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAgLyogX19TQ0lURUNIX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLm1hYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLm1hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhMmZjMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvc2NpdGVjaC5tYWMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIxICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgTmV0V2lkZSBBc3NlbWJsZXIgKE5BU00pIG9yIFR1cmJvIEFzc2VtYmxlciAoVEFTTSkKLTsqIEVudmlyb25tZW50OiBBbnkgSW50ZWwgRW52aXJvbm1lbnQKLTsqCi07KiBEZXNjcmlwdGlvbjogTWFjcm9zIHRvIHByb3ZpZGUgbWVtb3J5IG1vZGVsIGluZGVwZW5kYW50IGFzc2VtYmx5IGxhbmd1YWdlCi07KiAgICAgICAgICAgICAgbW9kdWxlIGZvciBDIHByb2dyYW1taW5nLiBTdXBwb3J0cyB0aGUgbGFyZ2UgYW5kIGZsYXQgbWVtb3J5Ci07KiAgICAgICAgICAgICAgbW9kZWxzLgotOyoKLTsqICAgICAgICAgICAgICBUaGUgZGVmaW5lcyB0aGF0IHlvdSBzaG91bGQgdXNlIHdoZW4gYXNzZW1ibGluZyBtb2R1bGVzIHRoYXQKLTsqICAgICAgICAgICAgICB1c2UgdGhpcyBtYWNybyBwYWNrYWdlIGFyZToKLTsqCi07KiAgICAgICAgICAgICAgICAgIF9fTEFSR0VfXyAgIEFzc2VtYmxlIGZvciAxNi1iaXQgbGFyZ2UgbW9kZWwKLTsqICAgICAgICAgICAgICAgICAgX19GTEFUX18gICAgQXNzZW1ibGUgZm9yIDMyLWJpdCBGTEFUIG1lbW9yeSBtb2RlbAotOyogICAgICAgICAgICAgICAgICBfX05PVV9fICAgICBObyB1bmRlcnNjb3JlIGZvciBhbGwgZXh0ZXJuYWwgQyBsYWJlbHMKLTsqICAgICAgICAgICAgICAgICAgX19OT1VfVkFSX18gTm8gdW5kZXJzY29yZSBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBvbmx5Ci07KgotOyogICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSBmb3IgMTYtYml0IGxhcmdlIG1lbW9yeSBtb2RlbCB3aXRoCi07KiAgICAgICAgICAgICAgbGVhZGluZyB1bmRlcnNjb3JlcyBmb3Igc3ltYm9sIG5hbWVzLgotOyoKLTsqICAgICAgICAgICAgICBUaGUgbWFpbiBpbnRlbnQgb2YgdGhlIG1hY3JvIGZpbGUgaXMgdG8gZW5hYmxlIHByb2dyYW1tZXJzCi07KiAgICAgICAgICAgICAgdG8gd3JpdGUgX29uZV8gc2V0IG9mIHNvdXJjZSB0aGF0IGNhbiBiZSBhc3NlbWJsZWQgdG8gcnVuCi07KiAgICAgICAgICAgICAgaW4gZWl0aGVyIDE2IGJpdCByZWFsIGFuZCBwcm90ZWN0ZWQgbW9kZXMgb3IgMzIgYml0Ci07KiAgICAgICAgICAgICAgcHJvdGVjdGVkIG1vZGUgd2l0aG91dCB0aGUgbmVlZCB0byByaWRkbGUgdGhlIGNvZGUgd2l0aAotOyogICAgICAgICAgICAgICdpZiBmbGF0bW9kZWwnIHN0eWxlIGNvbmRpdGlvbmFsIGFzc2VtYmx5IChpdCBpcyBzdGlsbCB0aGVyZQotOyogICAgICAgICAgICAgIGJ1dCBuaWNlbHkgaGlkZGVuIGJ5IGEgbWFjcm8gbGF5ZXIgdGhhdCBlbmhhbmNlcyB0aGUKLTsqICAgICAgICAgICAgICByZWFkYWJpbGl0eSBhbmQgdW5kZXJzdGFuZGFiaWxpdHkgb2YgdGhlIHJlc3VsdGluZyBjb2RlKS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi07IEluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb24gaW4gaGVyZSBkZXBlbmRpbmcgb24gdGhlIGFzc2VtYmxlci4gTkFTTQotOyBhcHBlYXJzIHRvIGFsd2F5cyB0cnkgYW5kIHBhcnNlIGNvZGUsIGV2ZW4gaWYgaXQgaXMgaW4gYSBub24tY29tcGlsaW5nCi07IGJsb2NrIG9mIGEgaWZkZWYgZXhwcmVzc2lvbiwgYW5kIGhlbmNlIGNyYXNoZXMgaWYgd2UgaW5jbHVkZSB0aGUgVEFTTQotOyBtYWNybyBwYWNrYWdlIGluIHRoZSBzYW1lIGhlYWRlciBmaWxlLiBIZW5jZSB3ZSBzcGxpdCB0aGUgbWFjcm9zIHVwIGludG8KLTsgdHdvIHNlcGFyYXRlIGhlYWRlciBmaWxlcy4KLQotaWZkZWYgX19OQVNNX01BSk9SX18KLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsgTWFjcm8gcGFja2FnZSB3aGVuIGNvbXBpbGluZyB3aXRoIE5BU00uCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi07IFR1cm4gb2ZmIHVuZGVyc2NvcmVzIGZvciBnbG9iYWxzIGlmIGRpc2FibGVkIGZvciBhbGwgZXh0ZXJuYWxzCi0KLSVpZmRlZiAgX19OT1VfXwotJWRlZmluZSBfX05PVV9WQVJfXwotJWVuZGlmCi0KLTsgRGVmaW5lIHRoZSBfX1dJTkRPV1NfXyBzeW1ib2wgaWYgd2UgYXJlIGNvbXBpbGluZyBmb3IgYW55IFdpbmRvd3MKLTsgZW52aXJvbm1lbnQKLQotJWlmZGVmICBfX1dJTkRPV1MxNl9fCi0lZGVmaW5lIF9fV0lORE9XU19fICAgICAgICAgMQotJWVuZGlmCi0laWZkZWYgIF9fV0lORE9XUzMyX18KLSVkZWZpbmUgX19XSU5ET1dTX18gICAgICAgICAxCi0lZGVmaW5lIF9fV0lORE9XUzMyXzM4Nl9fICAgMQotJWVuZGlmCi0KLTsgTWFjcm9zIGZvciBhY2Nlc3NpbmcgJ2dlbmVyaWMnIHJlZ2lzdGVycwotCi0laWZkZWYgIF9fRkxBVF9fCi0laWRlZmluZSBfYXggICAgZWF4Ci0laWRlZmluZSBfYnggICAgZWJ4Ci0laWRlZmluZSBfY3ggICAgZWN4Ci0laWRlZmluZSBfZHggICAgZWR4Ci0laWRlZmluZSBfc2kgICAgZXNpCi0laWRlZmluZSBfZGkgICAgZWRpCi0laWRlZmluZSBfYnAgICAgZWJwCi0laWRlZmluZSBfc3AgICAgZXNwCi0laWRlZmluZSBfZXMKLSVpZGVmaW5lIFVDSEFSICBCWVRFICAgICAgICA7IFNpemUgb2YgYSBjaGFyYWN0ZXIKLSVpZGVmaW5lIFVTSE9SVCBXT1JEICAgICAgICA7IFNpemUgb2YgYSBzaG9ydAotJWlkZWZpbmUgVUlOVCAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCi0laWRlZmluZSBVTE9ORyAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgbG9uZwotJWlkZWZpbmUgQk9PTCAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGJvb2xlYW4KLSVpZGVmaW5lIERQVFIgICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBkYXRhIHBvaW50ZXIKLSVpZGVmaW5lIEZEUFRSICBGV09SRCAgICAgICA7IFNpemUgb2YgYSBmYXIgZGF0YSBwb2ludGVyCi0laWRlZmluZSBORFBUUiAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgbmVhciBkYXRhIHBvaW50ZXIKLSVpZGVmaW5lIENQVFIgICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBjb2RlIHBvaW50ZXIKLSVpZGVmaW5lIEZDUFRSICBGV09SRCAgICAgICA7IFNpemUgb2YgYSBmYXIgY29kZSBwb2ludGVyCi0laWRlZmluZSBOQ1BUUiAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgbmVhciBjb2RlIHBvaW50ZXIKLSVpZGVmaW5lIEZQVFIgICBORUFSICAgICAgICA7IERpc3RhbmNlIGZvciBmdW5jdGlvbiBwb2ludGVycwotJWlkZWZpbmUgRFVJTlQgIGRkICAgICAgICAgIDsgRGVjbGFyZSBhIGludGVnZXIgdmFyaWFibGUKLSVpZGVmaW5lIGludHNpemUgNAotJWlkZWZpbmUgZmxhdG1vZGVsIDEKLSVlbHNlCi0laWRlZmluZSBfYXggICAgYXgKLSVpZGVmaW5lIF9ieCAgICBieAotJWlkZWZpbmUgX2N4ICAgIGN4Ci0laWRlZmluZSBfZHggICAgZHgKLSVpZGVmaW5lIF9zaSAgICBzaQotJWlkZWZpbmUgX2RpICAgIGRpCi0laWRlZmluZSBfYnAgICAgYnAKLSVpZGVmaW5lIF9zcCAgICBzcAotJWlkZWZpbmUgX2VzICAgIGVzOgotJWlkZWZpbmUgVUNIQVIgIEJZVEUgICAgICAgIDsgU2l6ZSBvZiBhIGNoYXJhY3RlcgotJWlkZWZpbmUgVVNIT1JUIFdPUkQgICAgICAgIDsgU2l6ZSBvZiBhIHNob3J0Ci0laWRlZmluZSBVSU5UICAgV09SRCAgICAgICAgOyBTaXplIG9mIGFuIGludGVnZXIKLSVpZGVmaW5lIFVMT05HICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBsb25nCi0laWRlZmluZSBCT09MICAgV09SRCAgICAgICAgOyBTaXplIG9mIGEgYm9vbGVhbgotJWlkZWZpbmUgRFBUUiAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGRhdGEgcG9pbnRlcgotJWlkZWZpbmUgRkRQVFIgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGZhciBkYXRhIHBvaW50ZXIKLSVpZGVmaW5lIE5EUFRSICBXT1JEICAgICAgICA7IFNpemUgb2YgYSBuZWFyIGRhdGEgcG9pbnRlcgotJWlkZWZpbmUgQ1BUUiAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGNvZGUgcG9pbnRlcgotJWlkZWZpbmUgRkNQVFIgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGZhciBjb2RlIHBvaW50ZXIKLSVpZGVmaW5lIE5DUFRSICBXT1JEICAgICAgICA7IFNpemUgb2YgYSBuZWFyIGNvZGUgcG9pbnRlcgotJWlkZWZpbmUgRlBUUiAgIEZBUiAgICAgICAgIDsgRGlzdGFuY2UgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzCi0laWRlZmluZSBEVUlOVCAgZHcgICAgICAgICAgOyBEZWNsYXJlIGEgaW50ZWdlciB2YXJpYWJsZQotJWlkZWZpbmUgaW50c2l6ZSAyCi0lZW5kaWYKLSVpZGVmaW5lIGludmVydCB+Ci0laWRlZmluZSBvZmZzZXQKLSVpZGVmaW5lIHVzZV9uYXNtCi0KLTsgQ29udmVydCBhbGwganVtcHMgdG8gbmVhciBqdW1wcywgc2luY2UgTkFTTSBkb2VzIG5vdCBzbyB0aGlzIGF1dG9tYXRpY2FsbHkKLQotJWlkZWZpbmUgam8gICAgIGpvIG5lYXIKLSVpZGVmaW5lIGpubyAgICBqbm8gbmVhcgotJWlkZWZpbmUganogICAgIGp6IG5lYXIKLSVpZGVmaW5lIGpueiAgICBqbnogbmVhcgotJWlkZWZpbmUgamUgICAgIGplIG5lYXIKLSVpZGVmaW5lIGpuZSAgICBqbmUgbmVhcgotJWlkZWZpbmUgamIgICAgIGpiICBuZWFyCi0laWRlZmluZSBqYmUgICAgamJlIG5lYXIKLSVpZGVmaW5lIGphICAgICBqYSAgbmVhcgotJWlkZWZpbmUgamFlICAgIGphZSBuZWFyCi0laWRlZmluZSBqbCAgICAgamwgIG5lYXIKLSVpZGVmaW5lIGpsZSAgICBqbGUgbmVhcgotJWlkZWZpbmUgamcgICAgIGpnICBuZWFyCi0laWRlZmluZSBqZ2UgICAgamdlIG5lYXIKLSVpZGVmaW5lIGpjICAgICBqYyAgbmVhcgotJWlkZWZpbmUgam5jICAgIGpuYyBuZWFyCi0laWRlZmluZSBqcyAgICAganMgIG5lYXIKLSVpZGVmaW5lIGpucyAgICBqbnMgbmVhcgotCi0laWZkZWYgIERPVUJMRQotJWlkZWZpbmUgICAgUkVBTCAgICBRV09SRAotJWlkZWZpbmUgICAgRFJFQUwgICBkcQotJWVsc2UKLSVpZGVmaW5lICAgIFJFQUwgICAgRFdPUkQKLSVpZGVmaW5lICAgIERSRUFMICAgZGQKLSVlbmRpZgotCi07IEJvb2xlYW4gdHJ1dGggdmFsdWVzIChzYW1lIGFzIHRob3NlIGluIGRlYnVnLmgpCi0KLSVpZGVmaW5lIEZhbHNlICAgICAgMAotJWlkZWZpbmUgVHJ1ZSAgICAgICAxCi0laWRlZmluZSBObyAgICAgICAgIDAKLSVpZGVmaW5lIFllcyAgICAgICAgMQotJWlkZWZpbmUgWWVzICAgICAgICAxCi0KLTsgTWFjcm8gdG8gYmUgaW52b2tlZCBhdCB0aGUgc3RhcnQgb2YgYWxsIG1vZHVsZXMgdG8gc2V0IHVwIHNlZ21lbnRzIGZvcgotOyBsYXRlciB1c2UuIERvZXMgbm90aGluZyBmb3IgTkFTTS4KLQotJWltYWNybyBoZWFkZXIgMQotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gYmVnaW4gYSBkYXRhIHNlZ21lbnQKLQotJWltYWNybyBiZWdkYXRhc2VnIDEKLSVpZmRlZiBfX0dOVUNfXwotc2VnbWVudCAuZGF0YSBwdWJsaWMgY2xhc3M9REFUQSB1c2UzMiBmbGF0Ci0lZWxzZQotJWlmZGVmIGZsYXRtb2RlbAotc2VnbWVudCBfREFUQSBwdWJsaWMgYWxpZ249NCBjbGFzcz1EQVRBIHVzZTMyIGZsYXQKLSVlbHNlCi1zZWdtZW50IF9EQVRBIHB1YmxpYyBhbGlnbj00IGNsYXNzPURBVEEgdXNlMTYKLSVlbmRpZgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBlbmQgYSBkYXRhIHNlZ21lbnQKLQotJWltYWNybyBlbmRkYXRhc2VnIDEKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGJlZ2luIGEgY29kZSBzZWdtZW50Ci0KLSVpbWFjcm8gYmVnY29kZXNlZyAxCi0laWZkZWYgX19QSUNfXwotJWlmZGVmIF9fTElOVVhfXwotICAgICAgICBleHRlcm4gX0dMT0JBTF9PRkZTRVRfVEFCTEVfCi0lZWxzZQotICAgICAgICBleHRlcm4gX19HTE9CQUxfT0ZGU0VUX1RBQkxFXwotJWVuZGlmCi0lZW5kaWYKLSVpZmRlZiBfX0dOVUNfXwotc2VnbWVudCAudGV4dCBwdWJsaWMgY2xhc3M9Q09ERSB1c2UzMiBmbGF0Ci0lZWxzZQotJWlmZGVmIGZsYXRtb2RlbAotc2VnbWVudCBfVEVYVCBwdWJsaWMgYWxpZ249MTYgY2xhc3M9Q09ERSB1c2UzMiBmbGF0Ci0lZWxzZQotc2VnbWVudCAlMV9URVhUIHB1YmxpYyBhbGlnbj0xNiBjbGFzcz1DT0RFIHVzZTE2Ci0lZW5kaWYKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gYmVnaW4gYSBuZWFyIGNvZGUgc2VnbWVudAotCi0laW1hY3JvIGJlZ2NvZGVzZWdfbmVhciAwCi0laWZkZWYgX19HTlVDX18KLXNlZ21lbnQgLnRleHQgcHVibGljIGNsYXNzPUNPREUgdXNlMzIgZmxhdAotJWVsc2UKLSVpZmRlZiBmbGF0bW9kZWwKLXNlZ21lbnQgX1RFWFQgcHVibGljIGFsaWduPTE2IGNsYXNzPUNPREUgdXNlMzIgZmxhdAotJWVsc2UKLXNlZ21lbnQgX1RFWFQgcHVibGljIGFsaWduPTE2IGNsYXNzPUNPREUgdXNlMTYKLSVlbmRpZgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBlbmQgYSBjb2RlIHNlZ21lbnQKLQotJWltYWNybyBlbmRjb2Rlc2VnIDEKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGVuZCBhIG5lYXIgY29kZSBzZWdtZW50Ci0KLSVpbWFjcm8gZW5kY29kZXNlZ19uZWFyIDAKLSVlbmRtYWNybwotCi07IE1hY3JvIGZvciBhbiBleHRlcm4gQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi0laW1hY3JvIGNleHRlcm4gMgotJWlmZGVmICBfX05PVV9WQVJfXwotZXh0ZXJuICUxCi0lZWxzZQotZXh0ZXJuIF8lMQotJWRlZmluZSAlMSBfJTEKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gY2V4dGVybmZ1bmMgMgotJWlmZGVmICBfX05PVV9fCi1leHRlcm4gJTEKLSVlbHNlCi1leHRlcm4gXyUxCi0lZGVmaW5lICUxIF8lMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyBmb3IgYSBwdWJsaWMgQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi0laW1hY3JvIGNwdWJsaWMgMQotJWlmZGVmICBfX05PVV9WQVJfXwotZ2xvYmFsICUxCi0lMToKLSVlbHNlCi1nbG9iYWwgXyUxCi1fJTE6Ci0lZGVmaW5lICUxIF8lMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyBmb3IgYW4gZ2xvYmFsIEMgc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotJWltYWNybyBjZ2xvYmFsIDEKLSVpZmRlZiAgX19OT1VfVkFSX18KLWdsb2JhbCAlMQotJWVsc2UKLWdsb2JhbCBfJTEKLSVkZWZpbmUgJTEgXyUxCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvIGZvciBhbiBnbG9iYWwgQyBmdW5jdGlvbiBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi0laW1hY3JvIGNnbG9iYWxmdW5jIDEKLSVpZmRlZiBfX1BJQ19fCi1nbG9iYWwgJTE6ZnVuY3Rpb24KLSVlbHNlCi0laWZkZWYgIF9fTk9VX18KLWdsb2JhbCAlMQotJWVsc2UKLWdsb2JhbCBfJTEKLSVkZWZpbmUgJTEgXyUxCi0lZW5kaWYKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gc3RhcnQgYSBDIGNhbGxhYmxlIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYmUgYSBmYXIgZnVuY3Rpb24gZm9yCi07IDE2LWJpdCBjb2RlLCBhbmQgYSBuZWFyIGZ1bmN0aW9uIGZvciAzMi1iaXQgY29kZS4KLQotJWltYWNybyBjcHJvY3N0YXRpYyAxCi0lcHVzaCBjcHJvYwotJTE6Ci0laWZkZWYgZmxhdG1vZGVsCi0lc3RhY2tzaXplIGZsYXQKLSVkZWZpbmUgcmV0IHJldG4KLSVlbHNlCi0lc3RhY2tzaXplIGxhcmdlCi0lZGVmaW5lIHJldCByZXRmCi0lZW5kaWYKLSVhc3NpZ24gJSRsb2NhbHNpemUgMAotJWVuZG1hY3JvCi0KLSVpbWFjcm8gY3Byb2NzdGFydCAxCi0lcHVzaCBjcHJvYwotICAgIGNnbG9iYWxmdW5jICUxCi0lMToKLSVpZmRlZiBmbGF0bW9kZWwKLSVzdGFja3NpemUgZmxhdAotJWRlZmluZSByZXQgcmV0bgotJWVsc2UKLSVzdGFja3NpemUgbGFyZ2UKLSVkZWZpbmUgcmV0IHJldGYKLSVlbmRpZgotJWFzc2lnbiAlJGxvY2Fsc2l6ZSAwCi0lZW5kbWFjcm8KLQotOyBUaGlzIG1hY3JvIHNldHMgdXAgYSBwcm9jZWR1cmUgdG8gYmUgZXhwb3J0ZWQgZnJvbSBhIDE2IGJpdCBETEwuIFNpbmNlIHRoZQotOyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBhbHdheXMgX2ZhciBfcGFzY2FsIGZvciAxNiBiaXQgRExMJ3MsIHdlIGFjdHVhbGx5Ci07IHJlbmFtZSB0aGlzIHJvdXRpbmUgd2l0aCBhbiBleHRyYSB1bmRlcnNjb3JlIHdpdGggJ0MnIGNhbGxpbmcgY29udmVudGlvbnMKLTsgYW5kIGEgc21hbGwgRExMIHN0dWIgd2lsbCBiZSBwcm92aWRlZCBieSB0aGUgaGlnaCBsZXZlbCBjb2RlIHRvIGNhbGwgdGhlCi07IGFzc2VtYmxlciByb3V0aW5lLgotCi0laW1hY3JvIGNwcm9jc3RhcnRkbGwxNiAxCi0laWZkZWYgIF9fV0lORE9XUzE2X18KLWNwcm9jc3RhcnQgIF8lMQotJWVsc2UKLWNwcm9jc3RhcnQgICUxCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIHN0YXJ0IGEgQyBjYWxsYWJsZSBuZWFyIGZ1bmN0aW9uLgotCi0laW1hY3JvIGNwcm9jbmVhciAxCi0lcHVzaCBjcHJvYwotICAgIGNnbG9iYWxmdW5jICUxCi0lMToKLSVkZWZpbmUgcmV0IHJldG4KLSVpZmRlZiBmbGF0bW9kZWwKLSVzdGFja3NpemUgZmxhdAotJWVsc2UKLSVzdGFja3NpemUgc21hbGwKLSVlbmRpZgotJWFzc2lnbiAlJGxvY2Fsc2l6ZSAwCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBzdGFydCBhIEMgY2FsbGFibGUgZmFyIGZ1bmN0aW9uLgotCi0laW1hY3JvIGNwcm9jZmFyIDEKLSVwdXNoIGNwcm9jCi0gICAgY2dsb2JhbGZ1bmMgJTEKLSUxOgotJWRlZmluZSByZXQgcmV0ZgotJWlmZGVmIGZsYXRtb2RlbAotJXN0YWNrc2l6ZSBmbGF0Ci0lZWxzZQotJXN0YWNrc2l6ZSBsYXJnZQotJWVuZGlmCi0lYXNzaWduICUkbG9jYWxzaXplIDAKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGVuZCBhIEMgZnVuY3Rpb24KLQotJWltYWNybyBjcHJvY2VuZCAwCi0lcG9wCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgZm9yIGVudGVyaW5nIGFuZCBleGl0aW5nIEMgY2FsbGFibGUgZnVuY3Rpb25zLiBOb3RlIHRoYXQgd2UgbXVzdAotOyBhbHdheXMgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgU0kgYW5kIERJIHJlZ2lzdGVycyBmb3IgQyBmdW5jdGlvbnMsIGFuZCBmb3IKLTsgMzIgYml0IEMgZnVuY3Rpb25zIHdlIGFsc28gbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIEVCWCBhbmQgY2xlYXIgdGhlCi07IGRpcmVjdGlvbiBmbGFnLgotCi0laW1hY3JvIGVudGVyX2MgMAotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSVpZm5pZG4gJSRsb2NhbHNpemUsMAotICAgICAgICBzdWIgICAgIF9zcCwlJGxvY2Fsc2l6ZQotJWVuZGlmCi0laWZkZWYgIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGVieAotJWVuZGlmCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIHB1c2ggICAgX2RpCi0lZW5kbWFjcm8KLQotJWltYWNybyBsZWF2ZV9jIDAKLSAgICAgICAgcG9wICAgICBfZGkKLSAgICAgICAgcG9wICAgICBfc2kKLSVpZmRlZiAgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIGNsZAotJWVuZGlmCi0laWZuaWRuICUkbG9jYWxzaXplLDAKLSAgICAgICAgbW92ICAgICBfc3AsX2JwCi0lZW5kaWYKLSAgICAgICAgcG9wICAgICBfYnAKLSVlbmRtYWNybwotCi0laW1hY3JvICAgdXNlX2VieCAwCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0lZW5kaWYKLSVlbmRtYWNybwotCi0laW1hY3JvICAgdW51c2VfZWJ4IDAKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcG9wICAgICBlYngKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm9zIGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyB0aGUgdmFsdWUgb2YgRFMsRVMsRlMsR1Mgd2hlbiBpdCBpcyB0bwotOyBiZSB1c2VkIGluIGFzc2VtYmx5IHJvdXRpbmVzLiBUaGlzIGV2YWx1YXRlcyB0byBub3RoaW5nIGluIHRoZSBmbGF0IG1lbW9yeQotOyBtb2RlbCwgYnV0IGlzIHNhdmVzIGFuZCByZXN0b3JlcyBEUyBpbiB0aGUgbGFyZ2UgbWVtb3J5IG1vZGVsLgotCi0laW1hY3JvIHVzZV9kcyAwCi0laWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGRzCi0lZW5kaWYKLSVlbmRtYWNybwotCi0laW1hY3JvIHVudXNlX2RzIDAKLSVpZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZHMKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gdXNlX2VzIDAKLSVpZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2ggICAgZXMKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gdW51c2VfZXMgMAotJWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcG9wICAgICBlcwotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgZm9yIGxvYWRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBkYXRhIHBvaW50ZXIgaW50byBhIHNlZ21lbnQgYW5kCi07IGluZGV4IHJlZ2lzdGVyIHBhaXIuIFRoZSAlaW1hY3JvIGV4cGxpY2l0bHkgbG9hZHMgRFMgb3IgRVMgaW4gdGhlIDE2IGJpdAotOyBtZW1vcnkgbW9kZWwsIG9yIGl0IHNpbXBseSBsb2FkcyB0aGUgb2Zmc2V0IGludG8gdGhlIHJlZ2lzdGVyIGluIHRoZSBmbGF0Ci07IG1lbW9yeSBtb2RlbCBzaW5jZSBEUyBhbmQgRVMgYWx3YXlzIHBvaW50IHRvIGFsbCBhZGRyZXNzYWJsZSBtZW1vcnkuIFlvdQotOyBtdXN0IHVzZSB0aGUgY29ycmVjdCBfUkVHIChpZTogX0JYKSAlaW1hY3JvcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4KLQotJWltYWNybyBfbGRzICAgIDIKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICAlMSwlMgotJWVsc2UKLSAgICAgICAgbGRzICAgICAlMSwlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIF9sZXMgIDIKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICAlMSwlMgotJWVsc2UKLSAgICAgICAgbGVzICAgICAlMSwlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgZm9yIGFkZGluZyBhbmQgc3VidHJhY3RpbmcgYSB2YWx1ZSBmcm9tIHJlZ2lzdGVycy4gVHdvIHZhbHVlIGFyZQotOyBwcm92aWRlZCwgb25lIGZvciAxNiBiaXQgbW9kZXMgYW5kIGFub3RoZXIgZm9yIDMyIGJpdCBtb2RlcyAodGhlIGV4dGVuZGVkCi07IHJlZ2lzdGVyIGlzIHVzZWQgaW4gMzIgYml0IG1vZGVzKS4KLQotJWltYWNybyAgIF9hZGQgIDMKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgYWRkICAgICBlJTEsICUzCi0lZWxzZQotICAgICAgICBhZGQgICAgICUxLCAlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyBfc3ViICAgIDMKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc3ViICAgICBlJTEsICUzCi0lZWxzZQotICAgICAgICBzdWIgICAgICUxLCAlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBjbGVhciB0aGUgaGlnaCBvcmRlciB3b3JkIGZvciB0aGUgMzIgYml0IGV4dGVuZGVkIHJlZ2lzdGVycy4KLTsgVGhpcyBpcyB1c2VkIHRvIGNvbnZlcnQgYW4gdW5zaWduZWQgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIDMyIGJpdAotOyB2YWx1ZSwgYW5kIHdpbGwgZXZhbHVhdGUgdG8gbm90aGluZyBpbiAxNiBiaXQgbW9kZXMuCi0KLSVpbWFjcm8gY2xyaGkgICAxCi0laWZkZWYgIGZsYXRtb2RlbAotICAgICAgICBtb3Z6eCAgIGUlMSwlMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyBzZ25oaSAgIDEKLSVpZmRlZiAgZmxhdG1vZGVsCi0gICAgICAgIG1vdnN4ICAgZSUxLCUxCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGxvYWQgYW4gZXh0ZW5kZWQgcmVnaXN0ZXIgd2l0aCBhbiBpbnRlZ2VyIHZhbHVlIGluIGVpdGhlciBtb2RlCi0KLSVpbWFjcm8gbG9hZGludCAyCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZSUxLCUyCi0lZWxzZQotICAgICAgICB4b3IgICAgIGUlMSxlJTEKLSAgICAgICAgbW92ICAgICAlMSwlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgdG8gbG9hZCBhbmQgc3RvcmUgaW50ZWdlciB2YWx1ZXMgd2l0aCBzdHJpbmcgaW5zdHJ1Y3Rpb25zCi0KLSVpbWFjcm8gTE9EU0lOVCAwCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIGxvZHNkCi0lZWxzZQotICAgICAgICBsb2RzdwotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyBTVE9TSU5UIDAKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc3Rvc2QKLSVlbHNlCi0gICAgICAgIHN0b3N3Ci0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvcyB0byBwcm92aWRlIHJlc2IsIHJlc3csIHJlc2QgY29tcGF0aWJpbGl0eSB3aXRoIE5BU00KLQotJWltYWNybyBkY2xiIDEKLXRpbWVzICUxIGRiIDAKLSVlbmRtYWNybwotCi0laW1hY3JvIGRjbHcgMQotdGltZXMgJTEgZHcgMAotJWVuZG1hY3JvCi0KLSVpbWFjcm8gZGNsZCAxCi10aW1lcyAlMSBkZCAwCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBnZXQgdGhlIGFkZHJlcyBvZiB0aGUgR09UIGZvciBMaW51eC9GcmVlQlNEIHNoYXJlZAotOyBsaWJyYXJpZXMgaW50byB0aGUgRUJYIHJlZ2lzdGVyLgotCi0laW1hY3JvICAgICBnZXRfR09UIDEKLSAgICAgICAgICAgIGNhbGwgICAgJSVnZXRnb3QKLSUlZ2V0Z290OiAgIHBvcCAgICAgJTEKLSAgICAgICAgICAgIGFkZCAgICAgJTEsX0dMT0JBTF9PRkZTRVRfVEFCTEVfKyQkLSUlZ2V0Z290IHdydCAuLmdvdHBjCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgYSAqbG9jYWwqIHZhcmlhYmxlIHRoYXQgaXMgZ2xvYmFsIHRvCi07IGEgc2luZ2xlIG1vZHVsZSBpbiBhIG1hbm5lciB0aGF0IHdpbGwgd29yayBjb3JyZWN0bHkgd2hlbiBjb21waWxlZAotOyBpbnRvIGEgTGludXggc2hhcmVkIGxpYnJhcnkuIE5vdGUgdGhhdCB0aGlzIHdpbGwgKm5vdCogd29yayBmb3IKLTsgdmFyaWFibGVzIHRoYXQgYXJlIGRlZmluZWQgYXMgZ2xvYmFsIHRvIGFsbCBtb2R1bGVzLiBGb3IgdGhhdAotOyB1c2UgdGhlIExFQV9HIG1hY3JvCi0KLSVtYWNybyAgICAgIExFQV9MICAgIDIKLSVpZmRlZiBfX1BJQ19fCi0gICAgICAgIGdldF9HT1QgJTEKLSAgICAgICAgbGVhICAgICAlMSxbJTErJTIgd3J0IC4uZ290b2ZmXQotJWVsc2UKLSAgICAgICAgbGVhICAgICAlMSxbJTJdCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IFNhbWUgbWFjcm8gYXMgYWJvdmUgYnV0IGZvciBnbG9iYWwgdmFyaWFibGVzIHB1YmxpYyB0byAqYWxsKgotOyBtb2R1bGVzLgotCi0lbWFjcm8gICAgICBMRUFfRyAgICAyCi0laWZkZWYgX19QSUNfXwotICAgICAgICBnZXRfR09UICUxCi0gICAgICAgIG1vdiAgICAgJTEsWyUxKyUyIHdydCAuLmdvdF0KLSVlbHNlCi0gICAgICAgIGxlYSAgICAgJTEsWyUyXQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBtYWNyb3MgdG8gZGVjbGFyZSBhc3NlbWJsZXIgZnVuY3Rpb24gc3R1YnMgZm9yIGZ1bmN0aW9uIHN0cnVjdHVyZXMKLQotJWltYWNybyBCRUdJTl9TVFVCU19ERUYgMgotYmVnZGF0YXNlZyAgX1NUVUJTCi0laWZkZWYgIF9fTk9VX1ZBUl9fCi1leHRlcm4gJTEKLSVkZWZpbmUgU1RVQlNfU1RBUlQgJTEKLSVlbHNlCi1leHRlcm4gXyUxCi0lZGVmaW5lIFNUVUJTX1NUQVJUIF8lMQotJWVuZGlmCi1lbmRkYXRhc2VnICBfU1RVQlMKLWJlZ2NvZGVzZWcgIF9TVFVCUwotJWFzc2lnbiBvZmYgJTIKLSVlbmRtYWNybwotCi0laW1hY3JvICAgREVDTEFSRV9TVFVCICAxCi0laWZkZWYgX19QSUNfXwotICAgICAgICBnbG9iYWwgJTE6ZnVuY3Rpb24KLSUxOgotICAgICAgICBnZXRfR09UIGVheAotICAgICAgICBtb3YgICAgIGVheCxbZWF4K1NUVUJTX1NUQVJUIHdydCAuLmdvdF0KLSAgICAgICAgam1wICAgICBbZWF4K29mZl0KLSVlbHNlCi0laWZkZWYgIF9fTk9VX18KLSAgICAgICAgZ2xvYmFsICUxCi0lMToKLSVlbHNlCi0gICAgICAgIGdsb2JhbCBfJTEKLV8lMToKLSVlbmRpZgotICAgICAgICBqbXAgICAgIFtEV09SRCBTVFVCU19TVEFSVCtvZmZdCi0lZW5kaWYKLSVhc3NpZ24gb2ZmIG9mZis0Ci0lZW5kbWFjcm8KLQotJWltYWNybyAgIFNLSVBfU1RVQiAgMQotJWFzc2lnbiBvZmYgb2ZmKzQKLSVlbmRtYWNybwotCi0laW1hY3JvIERFQ0xBUkVfU1REQ0FMTCAyCi0laWZkZWYgIFNURENBTExfTUFOR0xFCi0gICAgICAgIGdsb2JhbCBfJTFAJTIKLV8lMUAlMjoKLSVlbHNlCi0laWZkZWYgU1REQ0FMTF9VU0NPUkUKLSAgICAgICAgZ2xvYmFsIF8lMQotXyUxOgotJWVsc2UKLSAgICAgICAgZ2xvYmFsICUxCi0lMToKLSVlbmRpZgotJWVuZGlmCi0gICAgICAgIGptcCAgICAgW0RXT1JEIFNUVUJTX1NUQVJUK29mZl0KLSVhc3NpZ24gb2ZmIG9mZis0Ci0lZW5kbWFjcm8KLQotJWltYWNybyAgIEVORF9TVFVCU19ERUYgMAotZW5kY29kZXNlZyAgX1NUVUJTCi0lZW5kbWFjcm8KLQotOyBtYWNyb3MgdG8gZGVjbGFyZSBhc3NlbWJsZXIgaW1wb3J0IHN0dWJzIGZvciBiaW5hcnkgbG9hZGFibGUgZHJpdmVycwotCi0laW1hY3JvIEJFR0lOX0lNUE9SVFNfREVGICAgMQotQkVHSU5fU1RVQlNfREVGICUxLDQKLSVlbmRtYWNybwotCi0laW1hY3JvICAgREVDTEFSRV9JTVAgICAyCi1ERUNMQVJFX1NUVUIgICAgJTEKLSVlbmRtYWNybwotCi0laW1hY3JvICAgU0tJUF9JTVAgICAyCi1TS0lQX1NUVUIgICAgJTEKLSVlbmRtYWNybwotCi0laW1hY3JvICAgU0tJUF9JTVAyICAgMQotREVDTEFSRV9TVFVCICAgICUxCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIFNLSVBfSU1QMyAgIDEKLVNLSVBfU1RVQiAgICAlMQotJWVuZG1hY3JvCi0KLSVpbWFjcm8gICBFTkRfSU1QT1JUU19ERUYgMAotRU5EX1NUVUJTX0RFRgotJWVuZG1hY3JvCi0KLWVsc2UgICAgOyBfX05BU01fTUFKT1JfXwotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyBNYWNybyBwYWNrYWdlIHdoZW4gY29tcGlsaW5nIHdpdGggVEFTTS4KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLTsgVHVybiBvZmYgdW5kZXJzY29yZXMgZm9yIGdsb2JhbHMgaWYgZGlzYWJsZWQgZm9yIGFsbCBleHRlcm5hbHMKLQotaWZkZWYgICBfX05PVV9fCi1fX05PVV9WQVJfXyAgICAgICAgID0gMQotZW5kaWYKLQotOyBEZWZpbmUgdGhlIF9fV0lORE9XU19fIHN5bWJvbCBpZiB3ZSBhcmUgY29tcGlsaW5nIGZvciBhbnkgV2luZG93cwotOyBlbnZpcm9ubWVudAotCi1pZmRlZiAgIF9fV0lORE9XUzE2X18KLV9fV0lORE9XU19fICAgICAgICAgPSAxCi1lbmRpZgotaWZkZWYgICBfX1dJTkRPV1MzMl9fCi1fX1dJTkRPV1NfXyAgICAgICAgID0gMQotX19XSU5ET1dTMzJfMzg2X18gICA9IDEKLWVuZGlmCi1pZmRlZiAgIF9fV0lOMzg2X18KLV9fV0lORE9XU19fICAgICAgICAgPSAxCi1fX1dJTkRPV1MzMl8zODZfXyAgID0gMQotZW5kaWYKLWlmZGVmICAgX19WWERfXwotX19XSU5ET1dTX18gICAgICAgICA9IDEKLV9fV0lORE9XUzMyXzM4Nl9fICAgPSAxCi0gICAgICAgIE1BU00KLSAgICAgICAgLjM4NgotICAgICAgICBOT19TRUdNRU5UUyA9IDEKLSAgICAgICAgaW5jbHVkZSB2bW0uaW5jICAgICAgICAgOyBJR05PUkUgREVQRU5ECi0gICAgICAgIGluY2x1ZGUgdnNlZ21lbnQuaW5jICAgIDsgSUdOT1JFIERFUEVORAotICAgICAgICBJREVBTAotZW5kaWYKLQotOyBNYWNyb3MgZm9yIGFjY2Vzc2luZyAnZ2VuZXJpYycgcmVnaXN0ZXJzCi0KLWlmZGVmICAgX19GTEFUX18KLSAgICAgICAgX2F4ICAgICAgICAgRVFVIGVheCAgICAgOyBFQVggaXMgdXNlZCBmb3IgYWNjdW11bGF0b3IKLSAgICAgICAgX2J4ICAgICAgICAgRVFVIGVieCAgICAgOyBFQlggaXMgdXNlZCBmb3IgYWNjdW11bGF0b3IKLSAgICAgICAgX2N4ICAgICAgICAgRVFVIGVjeCAgICAgOyBFQ1ggaXMgdXNlZCBmb3IgbG9vcGluZwotICAgICAgICBfZHggICAgICAgICBFUVUgZWR4ICAgICA7IEVEWCBpcyB1c2VkIGZvciBkYXRhIHJlZ2lzdGVyCi0gICAgICAgIF9zaSAgICAgICAgIEVRVSBlc2kgICAgIDsgRVNJIGlzIHRoZSBzb3VyY2UgaW5kZXggcmVnaXN0ZXIKLSAgICAgICAgX2RpICAgICAgICAgRVFVIGVkaSAgICAgOyBFREkgaXMgdGhlIGRlc3RpbmF0aW9uIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIF9icCAgICAgICAgIEVRVSBlYnAgICAgIDsgRUJQIGlzIHVzZWQgZm9yIGJhc2UgcG9pbnRlciByZWdpc3RlcgotICAgICAgICBfc3AgICAgICAgICBFUVUgZXNwICAgICA7IEVTUCBpcyB1c2VkIGZvciBzdGFjayBwb2ludGVyIHJlZ2lzdGVyCi0gICAgICAgIF9lcyAgICAgICAgIEVRVSAgICAgICAgIDsgRVMgYW5kIERTIGFyZSB0aGUgc2FtZSBpbiAzMiBiaXQgUE0KLSAgICAgICAgdHlwZWRlZiBVQ0hBUiBCWVRFICAgICAgOyBTaXplIG9mIGEgY2hhcmFjdGVyCi0gICAgICAgIHR5cGVkZWYgVVNIT1JUIFdPUkQgICAgIDsgU2l6ZSBvZiBhIHNob3J0Ci0gICAgICAgIHR5cGVkZWYgVUlOVCBEV09SRCAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCi0gICAgICAgIHR5cGVkZWYgVUxPTkcgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIGxvbmcKLSAgICAgICAgdHlwZWRlZiBCT09MIERXT1JEICAgICAgOyBTaXplIG9mIGEgYm9vbGVhbgotICAgICAgICB0eXBlZGVmIERQVFIgRFdPUkQgICAgICA7IFNpemUgb2YgYSBkYXRhIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBGRFBUUiBGV09SRCAgICAgOyBTaXplIG9mIGEgZmFyIGRhdGEgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIE5EUFRSIERXT1JEICAgICA7IFNpemUgb2YgYSBuZWFyIGRhdGEgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIENQVFIgRFdPUkQgICAgICA7IFNpemUgb2YgYSBjb2RlIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBGQ1BUUiBGV09SRCAgICAgOyBTaXplIG9mIGEgZmFyIGNvZGUgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIE5DUFRSIERXT1JEICAgICA7IFNpemUgb2YgYSBuZWFyIGNvZGUgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIERVSU5UIERXT1JEICAgICA7IERlY2xhcmUgYSBpbnRlZ2VyIHZhcmlhYmxlCi0gICAgICAgIEZQVFIgICAgICAgIEVRVSBORUFSICAgIDsgRGlzdGFuY2UgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzCi0gICAgICAgIGludHNpemUgICAgID0gICA0ICAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCi0gICAgICAgIGZsYXRtb2RlbCAgID0gICAxICAgICAgIDsgVGhpcyBpcyBhIGZsYXQgbWVtb3J5IG1vZGVsCi0gICAgICAgIFAzODYgICAgICAgICAgICAgICAgICAgIDsgVHVybiBvbiAzODYgY29kZSBnZW5lcmF0aW9uCi0gICAgICAgIE1PREVMICAgICAgIEZMQVQgICAgICAgIDsgU2V0IHVwIGZvciAzMiBiaXQgc2ltcGxpZmllZCBGTEFUIG1vZGVsCi1lbHNlCi0gICAgICAgIF9heCAgICAgICAgIEVRVSBheCAgICAgIDsgQVggaXMgdXNlZCBmb3IgYWNjdW11bGF0b3IKLSAgICAgICAgX2J4ICAgICAgICAgRVFVIGJ4ICAgICAgOyBCWCBpcyB1c2VkIGZvciBhY2N1bXVsYXRvcgotICAgICAgICBfY3ggICAgICAgICBFUVUgY3ggICAgICA7IENYIGlzIHVzZWQgZm9yIGxvb3BpbmcKLSAgICAgICAgX2R4ICAgICAgICAgRVFVIGR4ICAgICAgOyBEWCBpcyB1c2VkIGZvciBkYXRhIHJlZ2lzdGVyCi0gICAgICAgIF9zaSAgICAgICAgIEVRVSBzaSAgICAgIDsgU0kgaXMgdGhlIHNvdXJjZSBpbmRleCByZWdpc3RlcgotICAgICAgICBfZGkgICAgICAgICBFUVUgZGkgICAgICA7IERJIGlzIHRoZSBkZXN0aW5hdGlvbiBpbmRleCByZWdpc3RlcgotICAgICAgICBfYnAgICAgICAgICBFUVUgYnAgICAgICA7IEJQIGlzIHVzZWQgZm9yIGJhc2UgcG9pbnRlciByZWdpc3RlcgotICAgICAgICBfc3AgICAgICAgICBFUVUgc3AgICAgICA7IFNQIGlzIHVzZWQgZm9yIHN0YWNrIHBvaW50ZXIgcmVnaXN0ZXIKLSAgICAgICAgX2VzICAgICAgICAgRVFVIGVzOiAgICAgOyBFUyBpcyB1c2VkIGZvciBzZWdtZW50IG92ZXJyaWRlCi0gICAgICAgIHR5cGVkZWYgVUNIQVIgQllURSAgICAgIDsgU2l6ZSBvZiBhIGNoYXJhY3RlcgotICAgICAgICB0eXBlZGVmIFVTSE9SVCBXT1JEICAgICA7IFNpemUgb2YgYSBzaG9ydAotICAgICAgICB0eXBlZGVmIFVJTlQgV09SRCAgICAgICA7IFNpemUgb2YgYW4gaW50ZWdlcgotICAgICAgICB0eXBlZGVmIFVMT05HIERXT1JEICAgICA7IFNpemUgb2YgYSBsb25nCi0gICAgICAgIHR5cGVkZWYgQk9PTCBXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGJvb2xlYW4KLSAgICAgICAgdHlwZWRlZiBEUFRSIERXT1JEICAgICAgOyBTaXplIG9mIGEgZGF0YSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgRkRQVFIgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIGZhciBkYXRhIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBORFBUUiBXT1JEICAgICAgOyBTaXplIG9mIGEgbmVhciBkYXRhIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBDUFRSIERXT1JEICAgICAgOyBTaXplIG9mIGEgY29kZSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgRkNQVFIgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIGZhciBjb2RlIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBOQ1BUUiBXT1JEICAgICAgOyBTaXplIG9mIGEgbmVhciBjb2RlIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBEVUlOVCBXT1JEICAgICAgOyBEZWNsYXJlIGEgaW50ZWdlciB2YXJpYWJsZQotICAgICAgICBGUFRSICAgICAgICBFUVUgRkFSICAgICA7IERpc3RhbmNlIGZvciBmdW5jdGlvbiBwb2ludGVycwotICAgICAgICBpbnRzaXplICAgICA9ICAgMiAgICAgICA7IFNpemUgb2YgYW4gaW50ZWdlcgotICAgICAgICBQMzg2ICAgICAgICAgICAgICAgICAgICA7IFR1cm4gb24gMzg2IGNvZGUgZ2VuZXJhdGlvbgotZW5kaWYKLSAgICAgICAgaW52ZXJ0ICAgICAgRVFVIG5vdAotCi07IFByb3ZpZGUgYSB0eXBlZGVmIGZvciByZWFsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKLQotaWZkZWYgICBET1VCTEUKLXR5cGVkZWYgUkVBTCAgICBRV09SRAotdHlwZWRlZiBEUkVBTCAgIFFXT1JECi1lbHNlCi10eXBlZGVmIFJFQUwgICAgRFdPUkQKLXR5cGVkZWYgRFJFQUwgICBEV09SRAotZW5kaWYKLQotOyBNYWNyb3MgdG8gYWNjZXNzIHRoZSBmbG9hdGluZyBwb2ludCBzdGFjayByZWdpc3RlcnMgdG8gY29udmVydCB0aGVtCi07IGZyb20gTkFTTSBzdHlsZSB0byBUQVNNIHN0eWxlCi0KLXN0MCAgICAgICAgIEVRVSAgICAgc3QoMCkKLXN0MSAgICAgICAgIEVRVSAgICAgc3QoMSkKLXN0MiAgICAgICAgIEVRVSAgICAgc3QoMikKLXN0MyAgICAgICAgIEVRVSAgICAgc3QoMykKLXN0NCAgICAgICAgIEVRVSAgICAgc3QoNCkKLXN0NSAgICAgICAgIEVRVSAgICAgc3QoNSkKLXN0NiAgICAgICAgIEVRVSAgICAgc3QoNikKLXN0NyAgICAgICAgIEVRVSAgICAgc3QoNykKLXN0OCAgICAgICAgIEVRVSAgICAgc3QoOCkKLQotOyBCb29sZWFuIHRydXRoIHZhbHVlcyAoc2FtZSBhcyB0aG9zZSBpbiBkZWJ1Zy5oKQotCi1pZm5kZWYgIF9fVlhEX18KLUZhbHNlICAgICAgID0gICAgICAgMAotVHJ1ZSAgICAgICAgPSAgICAgICAxCi1ObyAgICAgICAgICA9ICAgICAgIDAKLVllcyAgICAgICAgID0gICAgICAgMQotWWVzICAgICAgICAgPSAgICAgICAxCi1lbmRpZgotCi07IE1hY3JvcyBmb3IgdGhlIF9EQVRBIGRhdGEgc2VnbWVudC4gVGhpcyBzZWdtZW50IGNvbnRhaW5zIGluaXRpYWxpc2VkIGRhdGEuCi0KLU1BQ1JPICAgYmVnZGF0YXNlZyBuYW1lCi1pZmRlZiAgIF9fVlhEX18KLSAgICAgICAgTUFTTQotVlhEX0xPQ0tFRF9EQVRBX1NFRwotICAgICAgICBJREVBTAotZWxzZQotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgREFUQVNFRwotZWxzZQotU0VHTUVOVCBfREFUQSBEV09SRCBQVUJMSUMgVVNFMTYgJ0RBVEEnCi1lbmRpZgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBlbmRkYXRhc2VnIG5hbWUKLWlmZGVmICAgX19WWERfXwotICAgICAgICBNQVNNCi1WWERfTE9DS0VEX0RBVEFfRU5EUwotICAgICAgICBJREVBTAotZWxzZQotaWZuZGVmICBmbGF0bW9kZWwKLUVORFMgICAgX0RBVEEKLWVuZGlmCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIGZvciB0aGUgbWFpbiBjb2RlIHNlZ21lbnQuCi0KLU1BQ1JPICAgYmVnY29kZXNlZyBuYW1lCi1pZmRlZiAgIF9fVlhEX18KLSAgICAgICAgTUFTTQotVlhEX0xPQ0tFRF9DT0RFX1NFRwotICAgICAgICBJREVBTAotZWxzZQotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgQ09ERVNFRwotICAgICAgICBBU1NVTUUgIENTOkZMQVQsRFM6RkxBVCxTUzpGTEFUCi1lbHNlCi1TRUdNRU5UICZuYW1lJl9URVhUIFBBUkEgUFVCTElDIFVTRTE2ICdDT0RFJwotICAgICAgICBBU1NVTUUgQ1M6Jm5hbWUmX1RFWFQsRFM6X0RBVEEKLWVuZGlmCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIGZvciBhIG5lYXIgY29kZSBzZWdtZW50Ci0KLU1BQ1JPICAgYmVnY29kZXNlZ19uZWFyCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBDT0RFU0VHCi0gICAgICAgIEFTU1VNRSAgQ1M6RkxBVCxEUzpGTEFULFNTOkZMQVQKLWVsc2UKLVNFR01FTlQgX1RFWFQgUEFSQSBQVUJMSUMgVVNFMTYgJ0NPREUnCi0gICAgICAgIEFTU1VNRSBDUzpfVEVYVCxEUzpfREFUQQotZW5kaWYKLUVORE0KLQotTUFDUk8gICBlbmRjb2Rlc2VnIG5hbWUKLWlmZGVmICAgX19WWERfXwotICAgICAgICBNQVNNCi1WWERfTE9DS0VEX0NPREVfRU5EUwotICAgICAgICBJREVBTAotZWxzZQotaWZuZGVmICBmbGF0bW9kZWwKLUVORFMgICAgJm5hbWUmX1RFWFQKLWVuZGlmCi1lbmRpZgotRU5ETQotCi1NQUNSTyAgIGVuZGNvZGVzZWdfbmVhcgotaWZuZGVmICBmbGF0bW9kZWwKLUVORFMgICAgX1RFWFQKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm8gdG8gYmUgaW52b2tlZCBhdCB0aGUgc3RhcnQgb2YgYWxsIG1vZHVsZXMgdG8gc2V0IHVwIHNlZ21lbnRzIGZvcgotOyBsYXRlciB1c2UuCi0KLU1BQ1JPICAgaGVhZGVyIG5hbWUKLWJlZ2RhdGFzZWcgbmFtZQotZW5kZGF0YXNlZyBuYW1lCi1FTkRNCi0KLTsgTWFjcm8gZm9yIGFuIGV4dGVybiBDIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZwotOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQotOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCi07IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCi0KLU1BQ1JPICAgY2V4dGVybiBuYW1lLHNpemUKLWlmZGVmICAgX19OT1VfVkFSX18KLSAgICAgICAgRVhUUk4gICBuYW1lOnNpemUKLWVsc2UKLSAgICAgICAgRVhUUk4gICBfJm5hbWUmOnNpemUKLW5hbWUgICAgRVFVICAgICBfJm5hbWUmCi1lbmRpZgotRU5ETQotCi1NQUNSTyAgIGNleHRlcm5mdW5jIG5hbWUsc2l6ZQotaWZkZWYgICBfX05PVV9fCi0gICAgICAgIEVYVFJOICAgbmFtZTpzaXplCi1lbHNlCi0gICAgICAgIEVYVFJOICAgXyZuYW1lJjpzaXplCi1uYW1lICAgIEVRVSAgICAgXyZuYW1lJgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBzdGRleHRlcm5mdW5jICAgbmFtZSxudW1fYXJncyxzaXplCi1pZmRlZiAgIFNURENBTExfTUFOR0xFCi0gICAgICAgIEVYVFJOICAgXyZuYW1lJkAmbnVtX2FyZ3MmOnNpemUKLW5hbWUgICAgRVFVICAgICBfJm5hbWUmQCZudW1fYXJncwotZWxzZQotICAgICAgICBFWFRSTiAgIG5hbWU6c2l6ZQotZW5kaWYKLUVORE0KLQotOyBNYWNybyBmb3IgYSBwdWJsaWMgQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi1NQUNSTyAgIGNwdWJsaWMgbmFtZQotaWZkZWYgICBfX05PVV9WQVJfXwotbmFtZToKLSAgICAgICAgUFVCTElDICBuYW1lCi1lbHNlCi1fJm5hbWUmOgotICAgICAgICBQVUJMSUMgIF8mbmFtZSYKLW5hbWUgICAgRVFVICAgICBfJm5hbWUmCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIGZvciBhbiBnbG9iYWwgQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi1NQUNSTyAgIGNnbG9iYWwgbmFtZQotaWZkZWYgICBfX05PVV9WQVJfXwotICAgICAgICBQVUJMSUMgIG5hbWUKLWVsc2UKLSAgICAgICAgUFVCTElDICBfJm5hbWUmCi1uYW1lICAgIEVRVSAgICAgXyZuYW1lJgotZW5kaWYKLUVORE0KLQotOyBNYWNybyBmb3IgYW4gZ2xvYmFsIEMgZnVuY3Rpb24gc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotTUFDUk8gICBjZ2xvYmFsZnVuYyBuYW1lCi1pZmRlZiAgIF9fTk9VX18KLSAgICAgICAgUFVCTElDICBuYW1lCi1lbHNlCi0gICAgICAgIFBVQkxJQyAgXyZuYW1lJgotbmFtZSAgICBFUVUgICAgIF8mbmFtZSYKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm8gdG8gc3RhcnQgYSBDIGNhbGxhYmxlIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYmUgYSBmYXIgZnVuY3Rpb24gZm9yCi07IDE2LWJpdCBjb2RlLCBhbmQgYSBuZWFyIGZ1bmN0aW9uIGZvciAzMi1iaXQgY29kZS4KLQotTUFDUk8gICBjcHJvY3N0YXRpYyBuYW1lICAgICAgICA7IFNldCB1cCBtb2RlbCBpbmRlcGVuZGFudCBwcml2YXRlIHByb2MKLWlmZGVmIGZsYXRtb2RlbAotUFJPQyAgICBuYW1lIE5FQVIKLWVsc2UKLVBST0MgICAgbmFtZSBGQVIKLWVuZGlmCi1Mb2NhbFNpemUgICA9IDAKLUVORE0KLQotTUFDUk8gICBjcHJvY3N0YXJ0IG5hbWUgICAgICAgICA7IFNldCB1cCBtb2RlbCBpbmRlcGVuZGFudCBwcm9jCi1pZmRlZiBmbGF0bW9kZWwKLWlmZGVmICAgX19OT1VfXwotUFJPQyAgICBuYW1lIE5FQVIKLWVsc2UKLVBST0MgICAgXyZuYW1lJiBORUFSCi1lbmRpZgotZWxzZQotaWZkZWYgICBfX05PVV9fCi1QUk9DICAgIG5hbWUgRkFSCi1lbHNlCi1QUk9DICAgIF8mbmFtZSYgRkFSCi1lbmRpZgotZW5kaWYKLUxvY2FsU2l6ZSAgID0gMAotICAgICAgICBjZ2xvYmFsZnVuYyBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgY3Byb2NuZWFyIG5hbWUgICAgICAgICAgOyBTZXQgdXAgbmVhciBwcm9jCi1pZmRlZiAgIF9fTk9VX18KLVBST0MgICAgbmFtZSBORUFSCi1lbHNlCi1QUk9DICAgIF8mbmFtZSYgTkVBUgotZW5kaWYKLUxvY2FsU2l6ZSAgID0gMAotICAgICAgICBjZ2xvYmFsZnVuYyBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgY3Byb2NmYXIgbmFtZSAgICAgICAgICAgOyBTZXQgdXAgZmFyIHByb2MKLWlmZGVmICAgX19OT1VfXwotUFJPQyAgICBuYW1lIEZBUgotZWxzZQotUFJPQyAgICBfJm5hbWUmIEZBUgotZW5kaWYKLUxvY2FsU2l6ZSAgID0gMAotICAgICAgICBjZ2xvYmFsZnVuYyBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgY3Byb2NlbmQgICAgICAgICAgICAgICA7IEVuZCBwcm9jZWR1cmUgbWFjcm8KLUVORFAKLUVORE0KLQotOyBUaGlzIG1hY3JvIHNldHMgdXAgYSBwcm9jZWR1cmUgdG8gYmUgZXhwb3J0ZWQgZnJvbSBhIDE2IGJpdCBETEwuIFNpbmNlIHRoZQotOyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBhbHdheXMgX2ZhciBfcGFzY2FsIGZvciAxNiBiaXQgRExMJ3MsIHdlIGFjdHVhbGx5Ci07IHJlbmFtZSB0aGlzIHJvdXRpbmUgd2l0aCBhbiBleHRyYSB1bmRlcnNjb3JlIHdpdGggJ0MnIGNhbGxpbmcgY29udmVudGlvbnMKLTsgYW5kIGEgc21hbGwgRExMIHN0dWIgd2lsbCBiZSBwcm92aWRlZCBieSB0aGUgaGlnaCBsZXZlbCBjb2RlIHRvIGNhbGwgdGhlCi07IGFzc2VtYmxlciByb3V0aW5lLgotCi1NQUNSTyAgIGNwcm9jc3RhcnRkbGwxNiBuYW1lCi1pZmRlZiAgIF9fV0lORE9XUzE2X18KLWNwcm9jc3RhcnQgIF8mbmFtZSYKLWVsc2UKLWNwcm9jc3RhcnQgIG5hbWUKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIGZvciBlbnRlcmluZyBhbmQgZXhpdGluZyBDIGNhbGxhYmxlIGZ1bmN0aW9ucy4gTm90ZSB0aGF0IHdlIG11c3QKLTsgYWx3YXlzIHNhdmUgYW5kIHJlc3RvcmUgdGhlIFNJIGFuZCBESSByZWdpc3RlcnMgZm9yIEMgZnVuY3Rpb25zLCBhbmQgZm9yCi07IDMyIGJpdCBDIGZ1bmN0aW9ucyB3ZSBhbHNvIG5lZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSBFQlggYW5kIGNsZWFyIHRoZQotOyBkaXJlY3Rpb24gZmxhZy4KLQotTUFDUk8gICBzYXZlX2NfcmVncwotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgcHVzaCAgICBlYngKLWVuZGlmCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIHB1c2ggICAgX2RpCi1FTkRNCi0KLU1BQ1JPICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICBJRkRJRkkgIDxMb2NhbFNpemU+LDwwPgotICAgICAgICBzdWIgICAgIF9zcCxMb2NhbFNpemUKLSAgICBFTkRJRgotICAgICAgICBzYXZlX2NfcmVncwotRU5ETQotCi1NQUNSTyAgIHJlc3RvcmVfY19yZWdzCi0gICAgICAgIHBvcCAgICAgX2RpCi0gICAgICAgIHBvcCAgICAgX3NpCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBwb3AgICAgIGVieAotZW5kaWYKLUVORE0KLQotTUFDUk8gICBsZWF2ZV9jCi0gICAgICAgIHJlc3RvcmVfY19yZWdzCi0gICAgICAgIGNsZAotICAgIElGRElGSSAgPExvY2FsU2l6ZT4sPDA+Ci0gICAgICAgIG1vdiAgICAgX3NwLF9icAotICAgIEVORElGCi0gICAgICAgIHBvcCAgICAgX2JwCi1FTkRNCi0KLU1BQ1JPICAgdXNlX2VieAotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2ggICAgZWJ4Ci1lbmRpZgotRU5ETQotCi1NQUNSTyAgIHVudXNlX2VieAotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZWJ4Ci1lbmRpZgotRU5ETQotCi07IE1hY3JvcyBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgdGhlIHZhbHVlIG9mIERTLEVTLEZTLEdTIHdoZW4gaXQgaXMgdG8KLTsgYmUgdXNlZCBpbiBhc3NlbWJseSByb3V0aW5lcy4gVGhpcyBldmFsdWF0ZXMgdG8gbm90aGluZyBpbiB0aGUgZmxhdCBtZW1vcnkKLTsgbW9kZWwsIGJ1dCBpcyBzYXZlcyBhbmQgcmVzdG9yZXMgRFMgaW4gdGhlIGxhcmdlIG1lbW9yeSBtb2RlbC4KLQotTUFDUk8gICB1c2VfZHMKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcHVzaCAgICBkcwotZW5kaWYKLUVORE0KLQotTUFDUk8gICB1bnVzZV9kcwotaWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwb3AgICAgIGRzCi1lbmRpZgotRU5ETQotCi1NQUNSTyAgIHVzZV9lcwotaWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGVzCi1lbmRpZgotRU5ETQotCi1NQUNSTyAgIHVudXNlX2VzCi1pZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZXMKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIGZvciBsb2FkaW5nIHRoZSBhZGRyZXNzIG9mIGEgZGF0YSBwb2ludGVyIGludG8gYSBzZWdtZW50IGFuZAotOyBpbmRleCByZWdpc3RlciBwYWlyLiBUaGUgbWFjcm8gZXhwbGljaXRseSBsb2FkcyBEUyBvciBFUyBpbiB0aGUgMTYgYml0Ci07IG1lbW9yeSBtb2RlbCwgb3IgaXQgc2ltcGx5IGxvYWRzIHRoZSBvZmZzZXQgaW50byB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZsYXQKLTsgbWVtb3J5IG1vZGVsIHNpbmNlIERTIGFuZCBFUyBhbHdheXMgcG9pbnQgdG8gYWxsIGFkZHJlc3NhYmxlIG1lbW9yeS4gWW91Ci07IG11c3QgdXNlIHRoZSBjb3JyZWN0IF9SRUcgKGllOiBfQlgpIG1hY3JvcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4KLQotTUFDUk8gICBfbGRzICAgIHJlZywgYWRkcgotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgcmVnLGFkZHIKLWVsc2UKLSAgICAgICAgbGRzICAgICByZWcsYWRkcgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBfbGVzICAgIHJlZywgYWRkcgotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgcmVnLGFkZHIKLWVsc2UKLSAgICAgICAgbGVzICAgICByZWcsYWRkcgotZW5kaWYKLUVORE0KLQotOyBNYWNyb3MgZm9yIGFkZGluZyBhbmQgc3VidHJhY3RpbmcgYSB2YWx1ZSBmcm9tIHJlZ2lzdGVycy4gVHdvIHZhbHVlIGFyZQotOyBwcm92aWRlZCwgb25lIGZvciAxNiBiaXQgbW9kZXMgYW5kIGFub3RoZXIgZm9yIDMyIGJpdCBtb2RlcyAodGhlIGV4dGVuZGVkCi07IHJlZ2lzdGVyIGlzIHVzZWQgaW4gMzIgYml0IG1vZGVzKS4KLQotTUFDUk8gICBfYWRkICAgIHJlZywgdmFsMTYsIHZhbDMyCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgYWRkICAgICBlJnJlZyYsIHZhbDMyCi1lbHNlCi0gICAgICAgIGFkZCAgICAgcmVnLCB2YWwxNgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBfc3ViICAgIHJlZywgdmFsMTYsIHZhbDMyCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc3ViICAgICBlJnJlZyYsIHZhbDMyCi1lbHNlCi0gICAgICAgIHN1YiAgICAgcmVnLCB2YWwxNgotZW5kaWYKLUVORE0KLQotOyBNYWNybyB0byBjbGVhciB0aGUgaGlnaCBvcmRlciB3b3JkIGZvciB0aGUgMzIgYml0IGV4dGVuZGVkIHJlZ2lzdGVycy4KLTsgVGhpcyBpcyB1c2VkIHRvIGNvbnZlcnQgYW4gdW5zaWduZWQgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIDMyIGJpdAotOyB2YWx1ZSwgYW5kIHdpbGwgZXZhbHVhdGUgdG8gbm90aGluZyBpbiAxNiBiaXQgbW9kZXMuCi0KLU1BQ1JPICAgY2xyaGkgICByZWcKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdnp4ICAgZSZyZWcmLHJlZwotZW5kaWYKLUVORE0KLQotTUFDUk8gICBzZ25oaSAgIHJlZwotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgbW92c3ggICBlJnJlZyYscmVnCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIHRvIGxvYWQgYW4gZXh0ZW5kZWQgcmVnaXN0ZXIgd2l0aCBhbiBpbnRlZ2VyIHZhbHVlIGluIGVpdGhlciBtb2RlCi0KLU1BQ1JPICAgbG9hZGludCByZWcsdmFsCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlJnJlZyYsdmFsCi1lbHNlCi0gICAgICAgIHhvciAgICAgZSZyZWcmLGUmcmVnJgotICAgICAgICBtb3YgICAgIHJlZyx2YWwKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIHRvIGxvYWQgYW5kIHN0b3JlIGludGVnZXIgdmFsdWVzIHdpdGggc3RyaW5nIGluc3RydWN0aW9ucwotCi1NQUNSTyAgIExPRFNJTlQKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBsb2RzZAotZWxzZQotICAgICAgICBsb2RzdwotZW5kaWYKLUVORE0KLQotTUFDUk8gICBTVE9TSU5UCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc3Rvc2QKLWVsc2UKLSAgICAgICAgc3Rvc3cKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIHRvIHByb3ZpZGUgcmVzYiwgcmVzdywgcmVzZCBjb21wYXRpYmlsaXR5IHdpdGggTkFTTQotCi1NQUNSTyAgIGRjbGIgICAgY291bnQKLWRiICBjb3VudCBkdXAgKDApCi1FTkRNCi0KLU1BQ1JPICAgZGNsdyAgICBjb3VudAotZHcgIGNvdW50IGR1cCAoMCkKLUVORE0KLQotTUFDUk8gICBkY2xkICAgIGNvdW50Ci1kZCAgY291bnQgZHVwICgwKQotRU5ETQotCi07IE1hY3JvcyB0byBwcm92aWRlIHJlc2IsIHJlc3csIHJlc2QgY29tcGF0aWJpbGl0eSB3aXRoIE5BU00KLQotTUFDUk8gICByZXNiICAgIGNvdW50Ci1kYiAgY291bnQgZHVwICg/KQotRU5ETQotCi1NQUNSTyAgIHJlc3cgICAgY291bnQKLWR3ICBjb3VudCBkdXAgKD8pCi1FTkRNCi0KLU1BQ1JPICAgcmVzZCAgICBjb3VudAotZGQgIGNvdW50IGR1cCAoPykKLUVORE0KLQotOyBNYWNyb3MgdG8gZGVjbGFyZSBhc3NlbWJsZXIgc3R1YnMgZm9yIGZ1bmN0aW9uIHN0cnVjdHVyZXMKLQotTUFDUk8gICBCRUdJTl9TVFVCU19ERUYgbmFtZSwgZmlyc3RPZmZzZXQKLWJlZ2RhdGFzZWcgIF9TVFVCUwotaWZkZWYgICBfX05PVV9WQVJfXwotICAgICAgICBFWFRSTiAgIG5hbWU6RFdPUkQKLVNUVUJTX1NUQVJUID0gICBuYW1lCi1lbHNlCi0gICAgICAgIEVYVFJOICAgXyZuYW1lJjpEV09SRAotbmFtZSAgICBFUVUgICAgIF8mbmFtZSYKLVNUVUJTX1NUQVJUID0gICBfJm5hbWUKLWVuZGlmCi1lbmRkYXRhc2VnICBfU1RVQlMKLWJlZ2NvZGVzZWcgIF9TVFVCUwotb2ZmID0gZmlyc3RPZmZzZXQKLUVORE0KLQotTUFDUk8gICBERUNMQVJFX1NUVUIgICAgbmFtZQotaWZkZWYgICBfX05PVV9fCi1uYW1lOgotICAgICAgICBQVUJMSUMgIG5hbWUKLWVsc2UKLV8mbmFtZToKLSAgICAgICAgUFVCTElDICBfJm5hbWUKLWVuZGlmCi0gICAgICAgIGptcCAgICAgW0RXT1JEIFNUVUJTX1NUQVJUK29mZl0KLW9mZiA9IG9mZiArIDQKLUVORE0KLQotTUFDUk8gICBTS0lQX1NUVUIgICAgbmFtZQotb2ZmID0gb2ZmICsgNAotRU5ETQotCi1NQUNSTyAgIERFQ0xBUkVfU1REQ0FMTCBuYW1lLG51bV9hcmdzCi1pZmRlZiAgIFNURENBTExfTUFOR0xFCi1fJm5hbWUmQCZudW1fYXJncyY6Ci0gICAgICAgIFBVQkxJQyAgXyZuYW1lJkAmbnVtX2FyZ3MmCi1lbHNlCi1uYW1lOgotICAgICAgICBQVUJMSUMgIG5hbWUKLWVuZGlmCi0gICAgICAgIGptcCAgICAgW0RXT1JEIFNUVUJTX1NUQVJUK29mZl0KLW9mZiA9IG9mZiArIDQKLUVORE0KLQotTUFDUk8gICBFTkRfU1RVQlNfREVGCi1lbmRjb2Rlc2VnICBfU1RVQlMKLUVORE0KLQotTUFDUk8gICBCRUdJTl9JTVBPUlRTX0RFRiAgIG5hbWUKLUJFR0lOX1NUVUJTX0RFRiBuYW1lLDQKLUVORE0KLQotaWZuZGVmIExPQ0FMX0RFQ0xBUkVfSU1QCi1NQUNSTyAgIERFQ0xBUkVfSU1QIG5hbWUsIG51bUFyZ3MKLURFQ0xBUkVfU1RVQiAgICBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgU0tJUF9JTVAgbmFtZQotU0tJUF9TVFVCICAgICAgIG5hbWUKLUVORE0KLQotTUFDUk8gICBTS0lQX0lNUDIgbmFtZSwgbnVtQXJncwotREVDTEFSRV9TVFVCICAgIG5hbWUKLUVORE0KLQotTUFDUk8gICBTS0lQX0lNUDMgbmFtZQotU0tJUF9TVFVCICAgICAgIG5hbWUKLUVORE0KLWVuZGlmCi0KLU1BQ1JPICAgRU5EX0lNUE9SVFNfREVGCi1FTkRfU1RVQlNfREVGCi1FTkRNCi0KLU1BQ1JPICAgTEVBX0wgICAgcmVnLG5hbWUKLSAgICAgICAgbGVhICAgICByZWcsW25hbWVdCi1FTkRNCi0KLU1BQ1JPICAgTEVBX0cgICAgcmVnLG5hbWUKLSAgICAgICAgbGVhICAgICByZWcsW25hbWVdCi1FTkRNCi0KLWVuZGlmCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4N2Q0ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHB1YmxpYyBzcGVjaWZpYyBmdW5jdGlvbnMuCi0qICAgICAgICAgICAgICAgQW55IGFwcGxpY2F0aW9uIGxpbmtpbmcgYWdhaW5zdCB1cyBzaG91bGQgb25seQotKiAgICAgICAgICAgICAgIGluY2x1ZGUgdGhpcyBoZWFkZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfWDg2RU1VX0gKLSNkZWZpbmUgX19YODZFTVVfWDg2RU1VX0gKLQotI2lmZGVmIFNDSVRFQ0gKLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0jZGVmaW5lIFg4NkFQSSAgX0FTTUFQSQotI2RlZmluZSBYODZBUElQIF9BU01BUElQCi10eXBlZGVmIGludCBYODZFTVVfcGlvQWRkcjsKLSNlbHNlCi0jaW5jbHVkZSAieDg2ZW11L3R5cGVzLmgiCi0jZGVmaW5lIFg4NkFQSQotI2RlZmluZSBYODZBUElQICoKLSNlbmRpZgotI2luY2x1ZGUgIng4NmVtdS9yZWdzLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9udGVycyB0byBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbnMgdXNlZCBieSB0aGUKLWVtdWxhdG9yLiBUaGlzIGlzIHVzZWQgc28gdGhhdCB0aGUgdXNlciBwcm9ncmFtIGNhbiBob29rIGFsbCBwcm9ncmFtbWVkCi1JL08gZm9yIHRoZSBlbXVsYXRvciB0byBoYW5kbGVkIGFzIG5lY2Vzc2FyeSBieSB0aGUgdXNlciBwcm9ncmFtLiBCeQotZGVmYXVsdCB0aGUgZW11bGF0b3IgY29udGFpbnMgc2ltcGxlIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCBkbyBhY2Nlc3MgdGhlCi1oYXJkd2FyZSBpbiBhbnkgd2F5LiBUbyBhbGxvdyB0aGUgZW11YWx0b3IgYWNjZXNzIHRoZSBoYXJkd2FyZSwgeW91IHdpbGwKLW5lZWQgdG8gb3ZlcnJpZGUgdGhlIHByb2dyYW1tZWQgSS9PIGZ1bmN0aW9ucyB1c2luZyB0aGUgWDg2RU1VX3NldHVwUGlvRnVuY3MKLWZ1bmN0aW9uLgotCi1IRUFERVI6Ci14ODZlbXUuaAotCi1NRU1CRVJTOgotaW5iICAgICAtIEZ1bmN0aW9uIHRvIHJlYWQgYSBieXRlIGZyb20gYW4gSS9PIHBvcnQKLWludyAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgd29yZCBmcm9tIGFuIEkvTyBwb3J0Ci1pbmwgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGR3b3JkIGZyb20gYW4gSS9PIHBvcnQKLW91dGIgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGJ5dGUgdG8gYW4gSS9PIHBvcnQKLW91dHcgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIHdvcmQgdG8gYW4gSS9PIHBvcnQKLW91dGwgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGR3b3JkIHRvIGFuIEkvTyBwb3J0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHU4ICAgICAgKFg4NkFQSVAgaW5iKShYODZFTVVfcGlvQWRkciBhZGRyKTsKLSAgICB1MTYgICAgIChYODZBUElQIGludykoWDg2RU1VX3Bpb0FkZHIgYWRkcik7Ci0gICAgdTMyICAgICAoWDg2QVBJUCBpbmwpKFg4NkVNVV9waW9BZGRyIGFkZHIpOwotICAgIHZvaWQgICAgKFg4NkFQSVAgb3V0YikoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKTsKLSAgICB2b2lkICAgIChYODZBUElQIG91dHcpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUxNiB2YWwpOwotICAgIHZvaWQgICAgKFg4NkFQSVAgb3V0bCkoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTMyIHZhbCk7Ci0gICAgfSBYODZFTVVfcGlvRnVuY3M7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBwb250ZXJzIHRvIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zIHVzZWQgYnkgdGhlCi1lbXVsYXRvci4gVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGhlIHVzZXIgcHJvZ3JhbSBjYW4gaG9vayBhbGwgbWVtb3J5Ci1hY2Nlc3MgZnVuY3Rpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIGVtdWxhdG9yLiBCeSBkZWZhdWx0IHRoZSBlbXVsYXRvcgotY29udGFpbnMgc2ltcGxlIGZ1bmN0aW9ucyB0aGF0IG9ubHkgYWNjZXNzIHRoZSBpbnRlcm5hbCBtZW1vcnkgb2YgdGhlCi1lbXVsYXRvci4gSWYgeW91IG5lZWQgc3BlY2lhbGlzZWQgZnVuY3Rpb25zIHRvIGhhbmRsZSBhY2Nlc3MgdG8gZGlmZmVyZW50Ci10eXBlcyBvZiBtZW1vcnkgKGllOiBoYXJkd2FyZSBmcmFtZWJ1ZmZlciBhY2Nlc3NlcyBhbmQgQklPUyBtZW1vcnkgYWNjZXNzCi1ldGMpLCB5b3Ugd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgdXNpbmcgdGhlIFg4NkVNVV9zZXR1cE1lbUZ1bmNzCi1mdW5jdGlvbi4KLQotSEVBREVSOgoteDg2ZW11LmgKLQotTUVNQkVSUzoKLXJkYiAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgYnl0ZSBmcm9tIGFuIGFkZHJlc3MKLXJkdyAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgd29yZCBmcm9tIGFuIGFkZHJlc3MKLXJkbCAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgZHdvcmQgZnJvbSBhbiBhZGRyZXNzCi13cmIgICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSBieXRlIHRvIGFuIGFkZHJlc3MKLXdydyAgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIHdvcmQgdG8gYW4gYWRkcmVzcwotd3JsICAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgZHdvcmQgdG8gYW4gYWRkcmVzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCAgICAgIChYODZBUElQIHJkYikodTMyIGFkZHIpOwotICAgIHUxNiAgICAgKFg4NkFQSVAgcmR3KSh1MzIgYWRkcik7Ci0gICAgdTMyICAgICAoWDg2QVBJUCByZGwpKHUzMiBhZGRyKTsKLSAgICB2b2lkICAgIChYODZBUElQIHdyYikodTMyIGFkZHIsIHU4IHZhbCk7Ci0gICAgdm9pZCAgICAoWDg2QVBJUCB3cncpKHUzMiBhZGRyLCB1MTYgdmFsKTsKLSAgICB2b2lkICAgIChYODZBUElQIHdybCkodTMyIGFkZHIsIHUzMiB2YWwpOwotICAgIH0gWDg2RU1VX21lbUZ1bmNzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBIZXJlIGFyZSB0aGUgZGVmYXVsdCBtZW1vcnkgcmVhZCBhbmQgd3JpdGUKLSAgZnVuY3Rpb24gaW4gY2FzZSB0aGV5IGFyZSBuZWVkZWQgYXMgZmFsbGJhY2tzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHU4IFg4NkFQSSByZGIodTMyIGFkZHIpOwotZXh0ZXJuIHUxNiBYODZBUEkgcmR3KHUzMiBhZGRyKTsKLWV4dGVybiB1MzIgWDg2QVBJIHJkbCh1MzIgYWRkcik7Ci1leHRlcm4gdm9pZCBYODZBUEkgd3JiKHUzMiBhZGRyLCB1OCB2YWwpOwotZXh0ZXJuIHZvaWQgWDg2QVBJIHdydyh1MzIgYWRkciwgdTE2IHZhbCk7Ci1leHRlcm4gdm9pZCBYODZBUEkgd3JsKHUzMiBhZGRyLCB1MzIgdmFsKTsKLQotI3ByYWdtYSBwYWNrKCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgdm9pZCAoWDg2QVBJUCBYODZFTVVfaW50ckZ1bmNzKShpbnQgbnVtKTsKLWV4dGVybiBYODZFTVVfaW50ckZ1bmNzIF9YODZFTVVfaW50clRhYlsyNTZdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLXZvaWQgICAgWDg2RU1VX3NldHVwTWVtRnVuY3MoWDg2RU1VX21lbUZ1bmNzICpmdW5jcyk7Ci12b2lkICAgIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKFg4NkVNVV9waW9GdW5jcyAqZnVuY3MpOwotdm9pZCAgICBYODZFTVVfc2V0dXBJbnRyRnVuY3MoWDg2RU1VX2ludHJGdW5jcyBmdW5jc1tdKTsKLXZvaWQgICAgWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50IG51bSk7Ci0KLS8qIGRlY29kZS5jICovCi0KLXZvaWQgICAgWDg2RU1VX2V4ZWModm9pZCk7Ci12b2lkICAgIFg4NkVNVV9oYWx0X3N5cyh2b2lkKTsKLQotI2lmZGVmICBERUJVRwotI2RlZmluZSBIQUxUX1NZUygpICBcCi0gICAgcHJpbnRrKCJoYWx0X3N5czogZmlsZSAlcywgbGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKSwgXAotICAgIFg4NkVNVV9oYWx0X3N5cygpCi0jZWxzZQotI2RlZmluZSBIQUxUX1NZUygpICBYODZFTVVfaGFsdF9zeXMoKQotI2VuZGlmCi0KLS8qIERlYnVnIG9wdGlvbnMgKi8KLQotI2RlZmluZSBERUJVR19ERUNPREVfRiAgICAgICAgICAweDAwMDEgIC8qIHByaW50IGRlY29kZWQgaW5zdHJ1Y3Rpb24gICovCi0jZGVmaW5lIERFQlVHX1RSQUNFX0YgICAgICAgICAgIDB4MDAwMiAgLyogZHVtcCByZWdzIGJlZm9yZS9hZnRlciBleGVjdXRpb24gKi8KLSNkZWZpbmUgREVCVUdfU1RFUF9GICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIERFQlVHX0RJU0FTU0VNQkxFX0YgICAgIDB4MDAwOAotI2RlZmluZSBERUJVR19CUkVBS19GICAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgREVCVUdfU1ZDX0YgICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIERFQlVHX1NBVkVfQ1NfSVAgICAgICAgIDB4MDA0MAotI2RlZmluZSBERUJVR19GU19GICAgICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgREVCVUdfUFJPQ19GICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIERFQlVHX1NZU0lOVF9GICAgICAgICAgIDB4MDIwMCAvKiBiaW9zIHN5c3RlbSBpbnRlcnJ1cHRzLiAqLwotI2RlZmluZSBERUJVR19UUkFDRUNBTExfRiAgICAgICAweDA0MDAKLSNkZWZpbmUgREVCVUdfSU5TVFJVTUVOVF9GICAgICAgMHgwODAwCi0jZGVmaW5lIERFQlVHX01FTV9UUkFDRV9GICAgICAgIDB4MTAwMAotI2RlZmluZSBERUJVR19JT19UUkFDRV9GICAgICAgICAweDIwMDAKLSNkZWZpbmUgREVCVUdfVFJBQ0VDQUxMX1JFR1NfRiAgMHg0MDAwCi0jZGVmaW5lIERFQlVHX0RFQ09ERV9OT1BSSU5UX0YgIDB4ODAwMAotI2RlZmluZSBERUJVR19FWElUICAgICAgICAgICAgICAweDEwMDAwCi0jZGVmaW5lIERFQlVHX1NZU19GICAgICAgICAgICAgIChERUJVR19TVkNfRnxERUJVR19GU19GfERFQlVHX1BST0NfRikKLQotdm9pZCAgICBYODZFTVVfdHJhY2VfcmVncyh2b2lkKTsKLXZvaWQgICAgWDg2RU1VX3RyYWNlX3hyZWdzKHZvaWQpOwotdm9pZCAgICBYODZFTVVfZHVtcF9tZW1vcnkodTE2IHNlZywgdTE2IG9mZiwgdTMyIGFtdCk7Ci1pbnQgICAgIFg4NkVNVV90cmFjZV9vbih2b2lkKTsKLWludCAgICAgWDg2RU1VX3RyYWNlX29mZih2b2lkKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAgICAgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfWDg2RU1VX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvZnB1X3JlZ3MuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvZnB1X3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3YjAzYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L2ZwdV9yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIEZQVSByZWdpc3RlciBkZWZpbml0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfRlBVX1JFR1NfSAotI2RlZmluZSBfX1g4NkVNVV9GUFVfUkVHU19ICi0KLSNpZmRlZiBYODZfRlBVX1NVUFBPUlQKLQotI3ByYWdtYSBwYWNrKDEpCi0KLS8qIEJhc2ljIDgwODcgcmVnaXN0ZXIgY2FuIGhvbGQgYW55IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAqLwotCi11bmlvbiB4ODZfZnB1X3JlZ191IHsKLSAgICBzOCAgICAgICAgICAgICAgICAgIHRlbmJ5dGVzWzEwXTsKLSAgICBkb3VibGUgICAgICAgICAgICAgIGR2YWw7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICBmdmFsOwotICAgIHMxNiAgICAgICAgICAgICAgICAgc3ZhbDsKLSAgICBzMzIgICAgICAgICAgICAgICAgIGx2YWw7Ci0gICAgfTsKLQotc3RydWN0IHg4Nl9mcHVfcmVnIHsKLSAgICB1bmlvbiB4ODZfZnB1X3JlZ191IHJlZzsKLSAgICBjaGFyICAgICAgICAgICAgICAgIHRhZzsKLSAgICB9OwotCi0vKgotICogU2luY2Ugd2UgYXJlIG5vdCBnb2luZyB0byB3b3JyeSBhYm91dCB0aGUgcHJvYmxlbXMgb2YgYWxpYXNpbmcKLSAqIHJlZ2lzdGVycywgZXZlcnkgdGltZSBhIHJlZ2lzdGVyIGlzIG1vZGlmaWVkLCBpdHMgcmVzdWx0IHR5cGUgaXMKLSAqIHNldCBpbiB0aGUgdGFnIGZpZWxkcyBmb3IgdGhhdCByZWdpc3Rlci4gIElmIHNvbWUgb3BlcmF0aW9uCi0gKiBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIHR5cGUgaW4gYSB3YXkgaW5jb25zaXN0ZW50IHdpdGggaXRzIGN1cnJlbnQKLSAqIHN0b3JhZ2UgZm9ybWF0LCB0aGVuIHdlIGZsYWcgdGhlIG9wZXJhdGlvbi4gIElmIGNvbW1vbiwgd2UnbGwKLSAqIGF0dGVtcHQgdGhlIGNvbnZlcnNpb24uCi0gKi8KLQotI2RlZmluZSAgWDg2X0ZQVV9WQUxJRCAgICAgICAgICAweDgwCi0jZGVmaW5lICBYODZfRlBVX1JFR1RZUChyKSAgICAgICgocikgJiAweDdGKQotCi0jZGVmaW5lICBYODZfRlBVX1dPUkQgICAgICAgICAgIDB4MAotI2RlZmluZSAgWDg2X0ZQVV9TSE9SVCAgICAgICAgICAweDEKLSNkZWZpbmUgIFg4Nl9GUFVfTE9ORyAgICAgICAgICAgMHgyCi0jZGVmaW5lICBYODZfRlBVX0ZMT0FUICAgICAgICAgIDB4MwotI2RlZmluZSAgWDg2X0ZQVV9ET1VCTEUgICAgICAgICAweDQKLSNkZWZpbmUgIFg4Nl9GUFVfTERCTCAgICAgICAgICAgMHg1Ci0jZGVmaW5lICBYODZfRlBVX0JTRCAgICAgICAgICAgIDB4NgotCi0jZGVmaW5lICBYODZfRlBVX1NUS1RPUCAgMAotCi1zdHJ1Y3QgeDg2X2ZwdV9yZWdpc3RlcnMgewotICAgIHN0cnVjdCB4ODZfZnB1X3JlZyAgeDg2X2ZwdV9zdGFja1s4XTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHg4Nl9mcHVfZmxhZ3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICB4ODZfZnB1X2NvbmZpZzsgICAgICAgICAvKiByb3VuZGluZyBtb2RlcywgZXRjLiAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgeDg2X2ZwdV90b3MsIHg4Nl9mcHVfYm9zOwotICAgIH07Ci0KLSNwcmFnbWEgcGFjaygpCi0KLS8qCi0gKiBUaGVyZSBhcmUgdHdvIHZlcnNpb25zIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm8uCi0gKgotICogT25lIHZlcnNpb24gaXMgZm9yIG9wY29kZSBEOSwgZm9yIHdoaWNoIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzIKLSAqIGluc3RydWN0aW9ucyBlbmNvZGVkIGluIHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgb3Bjb2RlLgotICoKLSAqIFRoZSBvdGhlciB2ZXJzaW9uLCBkZWFscyB3aXRoIGFsbCB0aGUgb3RoZXIgNyBpODcgb3Bjb2RlcywgZm9yCi0gKiB3aGljaCB0aGVyZSBhcmUgb25seSAzMiBzdHJpbmdzIG5lZWRlZCB0byBkZXNjcmliZSB0aGUKLSAqIGluc3RydWN0aW9ucy4KLSAqLwotCi0jZW5kaWYgLyogWDg2X0ZQVV9TVVBQT1JUICovCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgREVDT0RFX1BSSU5USU5TVFIzMih0LG1vZCxyaCxybCkgICAgICAgXAotICAgIERFQ09ERV9QUklOVEYodFsobW9kPDwzKSsocmgpXSk7Ci0jIGRlZmluZSBERUNPREVfUFJJTlRJTlNUUjI1Nih0LG1vZCxyaCxybCkgICAgICBcCi0gICAgREVDT0RFX1BSSU5URih0Wyhtb2Q8PDYpKyhyaDw8MykrKHJsKV0pOwotI2Vsc2UKLSMgZGVmaW5lIERFQ09ERV9QUklOVElOU1RSMzIodCxtb2QscmgscmwpCi0jIGRlZmluZSBERUNPREVfUFJJTlRJTlNUUjI1Nih0LG1vZCxyaCxybCkKLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfRlBVX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS9yZWdzLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyMDE3Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L3JlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgeDg2IHJlZ2lzdGVyIGRlZmluaXRpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1g4NkVNVV9SRUdTX0gKLSNkZWZpbmUgX19YODZFTVVfUkVHU19ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKgotICogR2VuZXJhbCBFQVgsIEVCWCwgRUNYLCBFRFggdHlwZSByZWdpc3RlcnMuICBOb3RlIHRoYXQgZm9yCi0gKiBwb3J0YWJpbGl0eSwgYW5kIHNwZWVkLCB0aGUgaXNzdWUgb2YgYnl0ZSBzd2FwcGluZyBpcyBub3QgYWRkcmVzc2VkCi0gKiBpbiB0aGUgcmVnaXN0ZXJzLiAgQWxsIHJlZ2lzdGVycyBhcmUgc3RvcmVkIGluIHRoZSBkZWZhdWx0IGZvcm1hdAotICogYXZhaWxhYmxlIG9uIHRoZSBob3N0IG1hY2hpbmUuICBUaGUgb25seSBjcml0aWNhbCBpc3N1ZSBpcyB0aGF0IHRoZQotICogcmVnaXN0ZXJzIHNob3VsZCBsaW5lIHVwIEVYQUNUTFkgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZXkgZG8gaW4KLSAqIHRoZSAzODYuICBUaGF0IGlzOgotICoKLSAqIEVBWCAmIDB4ZmYgID09PSBBTAotICogRUFYICYgMHhmZmZmID09IEFYCi0gKgotICogZXRjLiAgVGhlIHJlc3VsdCBpcyB0aGF0IGFsb3Qgb2YgdGhlIGNhbGN1bGF0aW9ucyBjYW4gdGhlbiBiZQotICogZG9uZSB1c2luZyB0aGUgbmF0aXZlIGluc3RydWN0aW9uIHNldCBmdWxseS4KLSAqLwotCi0jaWZkZWYgIF9fQklHX0VORElBTl9fCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MzIgZV9yZWc7Ci0gICAgfSBJMzJfcmVnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MTYgZmlsbGVyMCwgeF9yZWc7Ci0gICAgfSBJMTZfcmVnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCBmaWxsZXIwLCBmaWxsZXIxLCBoX3JlZywgbF9yZWc7Ci0gICAgfSBJOF9yZWdfdDsKLQotI2Vsc2UgLyogIV9fQklHX0VORElBTl9fICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MzIgZV9yZWc7Ci0gICAgfSBJMzJfcmVnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MTYgeF9yZWc7Ci0gICAgfSBJMTZfcmVnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCBsX3JlZywgaF9yZWc7Ci0gICAgfSBJOF9yZWdfdDsKLQotI2VuZGlmIC8qIEJJR19FTkRJQU4gKi8KLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgSTMyX3JlZ190ICAgSTMyX3JlZzsKLSAgICBJMTZfcmVnX3QgICBJMTZfcmVnOwotICAgIEk4X3JlZ190ICAgIEk4X3JlZzsKLSAgICB9IGkzODZfZ2VuZXJhbF9yZWdpc3RlcjsKLQotc3RydWN0IGkzODZfZ2VuZXJhbF9yZWdzIHsKLSAgICBpMzg2X2dlbmVyYWxfcmVnaXN0ZXIgQSwgQiwgQywgRDsKLSAgICB9OwotCi10eXBlZGVmIHN0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyBHZW5fcmVnX3Q7Ci0KLXN0cnVjdCBpMzg2X3NwZWNpYWxfcmVncyB7Ci0gICAgaTM4Nl9nZW5lcmFsX3JlZ2lzdGVyIFNQLCBCUCwgU0ksIERJLCBJUDsKLSAgICB1MzIgRkxBR1M7Ci0gICAgfTsKLQotLyoKLSAqIFNlZ21lbnQgcmVnaXN0ZXJzIGhlcmUgcmVwcmVzZW50IHRoZSAxNiBiaXQgcXVhbnRpdGllcwotICogQ1MsIERTLCBFUywgU1MuCi0gKi8KLQotc3RydWN0IGkzODZfc2VnbWVudF9yZWdzIHsKLSAgICB1MTYgQ1MsIERTLCBTUywgRVMsIEZTLCBHUzsKLSAgICB9OwotCi0vKiA4IGJpdCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUl9BSCAgZ2VuLkEuSThfcmVnLmhfcmVnCi0jZGVmaW5lIFJfQUwgIGdlbi5BLkk4X3JlZy5sX3JlZwotI2RlZmluZSBSX0JIICBnZW4uQi5JOF9yZWcuaF9yZWcKLSNkZWZpbmUgUl9CTCAgZ2VuLkIuSThfcmVnLmxfcmVnCi0jZGVmaW5lIFJfQ0ggIGdlbi5DLkk4X3JlZy5oX3JlZwotI2RlZmluZSBSX0NMICBnZW4uQy5JOF9yZWcubF9yZWcKLSNkZWZpbmUgUl9ESCAgZ2VuLkQuSThfcmVnLmhfcmVnCi0jZGVmaW5lIFJfREwgIGdlbi5ELkk4X3JlZy5sX3JlZwotCi0vKiAxNiBiaXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJfQVggIGdlbi5BLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9CWCAgZ2VuLkIuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0NYICBnZW4uQy5JMTZfcmVnLnhfcmVnCi0jZGVmaW5lIFJfRFggIGdlbi5ELkkxNl9yZWcueF9yZWcKLQotLyogMzIgYml0IGV4dGVuZGVkIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSX0VBWCAgZ2VuLkEuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VCWCAgZ2VuLkIuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VDWCAgZ2VuLkMuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VEWCAgZ2VuLkQuSTMyX3JlZy5lX3JlZwotCi0vKiBzcGVjaWFsIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSX1NQICBzcGMuU1AuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0JQICBzcGMuQlAuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX1NJICBzcGMuU0kuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0RJICBzcGMuREkuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0lQICBzcGMuSVAuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0ZMRyBzcGMuRkxBR1MKLQotLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUl9TUCAgc3BjLlNQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9CUCAgc3BjLkJQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9TSSAgc3BjLlNJLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9ESSAgc3BjLkRJLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9JUCAgc3BjLklQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9GTEcgc3BjLkZMQUdTCi0KLS8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJfRVNQICBzcGMuU1AuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VCUCAgc3BjLkJQLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FU0kgIHNwYy5TSS5JMzJfcmVnLmVfcmVnCi0jZGVmaW5lIFJfRURJICBzcGMuREkuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VJUCAgc3BjLklQLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FRkxHIHNwYy5GTEFHUwotCi0vKiBzZWdtZW50IHJlZ2lzdGVycyAqLwotI2RlZmluZSBSX0NTICBzZWcuQ1MKLSNkZWZpbmUgUl9EUyAgc2VnLkRTCi0jZGVmaW5lIFJfU1MgIHNlZy5TUwotI2RlZmluZSBSX0VTICBzZWcuRVMKLSNkZWZpbmUgUl9GUyAgc2VnLkZTCi0jZGVmaW5lIFJfR1MgIHNlZy5HUwotCi0vKiBmbGFnIGNvbmRpdGlvbnMgICAqLwotI2RlZmluZSBGQl9DRiAweDAwMDEgICAgICAgICAgICAvKiBDQVJSWSBmbGFnICAqLwotI2RlZmluZSBGQl9QRiAweDAwMDQgICAgICAgICAgICAvKiBQQVJJVFkgZmxhZyAqLwotI2RlZmluZSBGQl9BRiAweDAwMTAgICAgICAgICAgICAvKiBBVVggIGZsYWcgICAqLwotI2RlZmluZSBGQl9aRiAweDAwNDAgICAgICAgICAgICAvKiBaRVJPIGZsYWcgICAqLwotI2RlZmluZSBGQl9TRiAweDAwODAgICAgICAgICAgICAvKiBTSUdOIGZsYWcgICAqLwotI2RlZmluZSBGQl9URiAweDAxMDAgICAgICAgICAgICAvKiBUUkFQIGZsYWcgICAqLwotI2RlZmluZSBGQl9JRiAweDAyMDAgICAgICAgICAgICAvKiBJTlRFUlJVUFQgRU5BQkxFIGZsYWcgKi8KLSNkZWZpbmUgRkJfREYgMHgwNDAwICAgICAgICAgICAgLyogRElSIGZsYWcgICAgKi8KLSNkZWZpbmUgRkJfT0YgMHgwODAwICAgICAgICAgICAgLyogT1ZFUkZMT1cgZmxhZyAqLwotCi0vKiA4MDI4NiBhbmQgYWJvdmUgYWx3YXlzIGhhdmUgYml0IzEgc2V0ICovCi0jZGVmaW5lIEZfQUxXQVlTX09OICAoMHgwMDAyKSAgIC8qIGZsYWcgYml0cyBhbHdheXMgb24gKi8KLQotLyoKLSAqIERlZmluZSBhIG1hc2sgZm9yIG9ubHkgdGhvc2UgZmxhZyBiaXRzIHdlIHdpbGwgZXZlciBwYXNzIGJhY2sKLSAqICh2aWEgUFVTSEYpCi0gKi8KLSNkZWZpbmUgRl9NU0sgKEZCX0NGfEZCX1BGfEZCX0FGfEZCX1pGfEZCX1NGfEZCX1RGfEZCX0lGfEZCX0RGfEZCX09GKQotCi0vKiBmb2xsb3dpbmcgYml0cyBtYXNrZWQgaW4gdG8gYSAxNmJpdCBxdWFudGl0eSAqLwotCi0jZGVmaW5lIEZfQ0YgMHgwMDAxICAgICAgICAgICAgIC8qIENBUlJZIGZsYWcgICovCi0jZGVmaW5lIEZfUEYgMHgwMDA0ICAgICAgICAgICAgIC8qIFBBUklUWSBmbGFnICovCi0jZGVmaW5lIEZfQUYgMHgwMDEwICAgICAgICAgICAgIC8qIEFVWCAgZmxhZyAgICovCi0jZGVmaW5lIEZfWkYgMHgwMDQwICAgICAgICAgICAgIC8qIFpFUk8gZmxhZyAgICovCi0jZGVmaW5lIEZfU0YgMHgwMDgwICAgICAgICAgICAgIC8qIFNJR04gZmxhZyAgICovCi0jZGVmaW5lIEZfVEYgMHgwMTAwICAgICAgICAgICAgIC8qIFRSQVAgZmxhZyAgICovCi0jZGVmaW5lIEZfSUYgMHgwMjAwICAgICAgICAgICAgIC8qIElOVEVSUlVQVCBFTkFCTEUgZmxhZyAqLwotI2RlZmluZSBGX0RGIDB4MDQwMCAgICAgICAgICAgICAvKiBESVIgZmxhZyAgICAqLwotI2RlZmluZSBGX09GIDB4MDgwMCAgICAgICAgICAgICAvKiBPVkVSRkxPVyBmbGFnICovCi0KLSNkZWZpbmUgVE9HR0xFX0ZMQUcoZmxhZykgICAgICAgKE0ueDg2LlJfRkxHIF49IChmbGFnKSkKLSNkZWZpbmUgU0VUX0ZMQUcoZmxhZykgICAgICAgICAgKE0ueDg2LlJfRkxHIHw9IChmbGFnKSkKLSNkZWZpbmUgQ0xFQVJfRkxBRyhmbGFnKSAgICAgICAgKE0ueDg2LlJfRkxHICY9IH4oZmxhZykpCi0jZGVmaW5lIEFDQ0VTU19GTEFHKGZsYWcpICAgICAgIChNLng4Ni5SX0ZMRyAmIChmbGFnKSkKLSNkZWZpbmUgQ0xFQVJBTExfRkxBRyhtKSAgICAgICAgKE0ueDg2LlJfRkxHID0gMCkKLQotI2RlZmluZSBDT05ESVRJT05BTF9TRVRfRkxBRyhDT05ELEZMQUcpIFwKLSAgaWYgKENPTkQpIFNFVF9GTEFHKEZMQUcpOyBlbHNlIENMRUFSX0ZMQUcoRkxBRykKLQotI2RlZmluZSBGX1BGX0NBTEMgMHgwMTAwMDAgICAgICAvKiBQQVJJVFkgZmxhZyBoYXMgYmVlbiBjYWxjZWQgICAgKi8KLSNkZWZpbmUgRl9aRl9DQUxDIDB4MDIwMDAwICAgICAgLyogWkVSTyBmbGFnIGhhcyBiZWVuIGNhbGNlZCAgICAgICovCi0jZGVmaW5lIEZfU0ZfQ0FMQyAweDA0MDAwMCAgICAgIC8qIFNJR04gZmxhZyBoYXMgYmVlbiBjYWxjZWQgICAgICAqLwotCi0jZGVmaW5lIEZfQUxMX0NBTEMgICAgICAweGZmMDAwMCAgICAgICAgLyogQWxsIGhhdmUgYmVlbiBjYWxjZWQgICAqLwotCi0vKgotICogRW11bGF0b3IgbWFjaGluZSBzdGF0ZS4KLSAqIFNlZ21lbnQgdXNhZ2UgY29udHJvbC4KLSAqLwotI2RlZmluZSBTWVNNT0RFX1NFR19EU19TUyAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNZU01PREVfU0VHT1ZSX0NTICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfRFMgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTWVNNT0RFX1NFR09WUl9FUyAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNZU01PREVfU0VHT1ZSX0ZTICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfR1MgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBTWVNNT0RFX1NFR09WUl9TUyAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFNZU01PREVfUFJFRklYX1JFUEUgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgU1lTTU9ERV9QUkVGSVhfUkVQTkUgICAgMHgwMDAwMDEwMAotI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9EQVRBICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFNZU01PREVfUFJFRklYX0FERFIgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgU1lTTU9ERV9JTlRSX1BFTkRJTkcgICAgMHgxMDAwMDAwMAotI2RlZmluZSBTWVNNT0RFX0VYVFJOX0lOVFIgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIFNZU01PREVfSEFMVEVEICAgICAgICAgIDB4NDAwMDAwMDAKLQotI2RlZmluZSBTWVNNT0RFX1NFR01BU0sgKFNZU01PREVfU0VHX0RTX1NTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfQ1MgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9EUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX0VTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfRlMgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9HUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX1NTKQotI2RlZmluZSBTWVNNT0RFX0NMUk1BU0sgKFNZU01PREVfU0VHX0RTX1NTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfQ1MgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9EUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX0VTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfRlMgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9HUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX1NTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9QUkVGSVhfREFUQSAgICB8IFwKLQkJCSBTWVNNT0RFX1BSRUZJWF9BRERSKQotCi0jZGVmaW5lICBJTlRSX1NZTkNIICAgICAgICAgICAweDEKLSNkZWZpbmUgIElOVFJfQVNZTkNIICAgICAgICAgIDB4MgotI2RlZmluZSAgSU5UUl9IQUxURUQgICAgICAgICAgMHg0Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzdHJ1Y3QgaTM4Nl9nZW5lcmFsX3JlZ3MgICAgZ2VuOwotICAgIHN0cnVjdCBpMzg2X3NwZWNpYWxfcmVncyAgICBzcGM7Ci0gICAgc3RydWN0IGkzODZfc2VnbWVudF9yZWdzICAgIHNlZzsKLSAgICAvKgotICAgICAqIE1PREUgY29udGFpbnMgaW5mb3JtYXRpb24gb246Ci0gICAgICogIFJFUEUgcHJlZml4ICAgICAgICAgICAgIDIgYml0cyAgcmVwZSxyZXBuZQotICAgICAqICBTRUdNRU5UIG92ZXJyaWRlcyAgICAgICA1IGJpdHMgIG5vcm1hbCxEUyxTUyxDUyxFUwotICAgICAqICBEZWxheWVkIGZsYWcgc2V0ICAgICAgICAzIGJpdHMgICh6ZXJvLCBzaWduZWQsIHBhcml0eSkKLSAgICAgKiAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgNiBiaXRzCi0gICAgICogIGludGVycnVwdCAjICAgICAgICAgICAgIDggYml0cyAgaW5zdHJ1Y3Rpb24gcmFpc2VkIGludGVycnVwdAotICAgICAqICBCSU9TIHZpZGVvIHNlZ3JlZ3MgICAgICA0IGJpdHMKLSAgICAgKiAgSW50ZXJydXB0IFBlbmRpbmcgICAgICAgMSBiaXRzCi0gICAgICogIEV4dGVybiBpbnRlcnJ1cHQgICAgICAgIDEgYml0cwotICAgICAqICBIYWx0ZWQgICAgICAgICAgICAgICAgICAxIGJpdHMKLSAgICAgKi8KLSAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTsKLSAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgaW50bm87Ci0gICAgdm9sYXRpbGUgaW50ICAgICAgICAgICAgICAgIGludHI7ICAgLyogbWFzayBvZiBwZW5kaW5nIGludGVycnVwdHMgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc7Ci0jaWZkZWYgREVCVUcKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s7Ci0gICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkX2lwOwotICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9jczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3BvczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cl9wb3M7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9idWZbMzJdOyAvKiBlbmNvZGVkIGJ5dGUgc3RyZWFtICAqLwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkX2J1ZlsyNTZdOyAvKiBkaXNhc3NlbWJsZWQgc3RyaW5ncyAqLwotI2VuZGlmCi0gICAgfSBYODZFTVVfcmVnczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdHJ1Y3R1cmUgbWFpbnRhaW5pbmcgdGhlIGVtdWxhdG9yIG1hY2hpbmUgc3RhdGUuCi0KLU1FTUJFUlM6Ci14ODYgICAgICAgICAgICAgLSBYODYgcmVnaXN0ZXJzCi1tZW1fYmFzZSAgICAgICAgLSBCYXNlIHJlYWwgbW9kZSBtZW1vcnkgZm9yIHRoZSBlbXVsYXRvcgotbWVtX3NpemUgICAgICAgIC0gU2l6ZSBvZiB0aGUgcmVhbCBtb2RlIG1lbW9yeSBibG9jayBmb3IgdGhlIGVtdWxhdG9yCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFg4NkVNVV9yZWdzICAgICB4ODY7Ci0gICAgdW5zaWduZWQgbG9uZyAgIG1lbV9iYXNlOwotICAgIHVuc2lnbmVkIGxvbmcgICBtZW1fc2l6ZTsKLSAgICB2b2lkKiAgICAgICAgICAgcHJpdmF0ZTsKLSAgICB9IFg4NkVNVV9zeXNFbnY7Ci0KLSNwcmFnbWEgcGFjaygpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotLyogR2xvYmFsIGVtdWxhdG9yIG1hY2hpbmUgc3RhdGUuCi0gKgotICogV2Uga2VlcCBpdCBnbG9iYWwgdG8gYXZvaWQgcG9pbnRlciBkZXJlZmVyZW5jZXMgaW4gdGhlIGNvZGUgZm9yIHNwZWVkLgotICovCi0KLWV4dGVybiAgICBYODZFTVVfc3lzRW52IF9YODZFTVVfZW52OwotI2RlZmluZSAgIE0gICAgICAgICAgICAgX1g4NkVNVV9lbnYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRnVuY3Rpb24gdG8gbG9nIGluZm9ybWF0aW9uIGF0IHJ1bnRpbWUgKi8KLQotLyp2b2lkICAgIHByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7ICovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS90eXBlcy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTE3YzU0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciB4ODYgZW11bGF0b3IgdHlwZSBkZWZpbml0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfVFlQRVNfSAotI2RlZmluZSBfX1g4NkVNVV9UWVBFU19ICi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQ3VycmVudGx5IG9ubHkgZm9yIExpbnV4LzMyYml0ICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoTk9fTE9OR19MT05HKQotI2RlZmluZSBfX0hBU19MT05HX0xPTkdfXwotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1ODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1MTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdTMyOwotI2lmZGVmIF9fSEFTX0xPTkdfTE9OR19fCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgdTY0OwotI2VuZGlmCi0KLXR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBzODsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBzMTY7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgczMyOwotI2lmZGVmIF9fSEFTX0xPTkdfTE9OR19fCi10eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICAgczY0OwotI2VuZGlmCi0KLS8qdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICB1aW50OyovCi10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgc2ludDsKLQotdHlwZWRlZiB1MTYgWDg2RU1VX3Bpb0FkZHI7Ci0KLSNlbmRpZiAgLyogX19YODZFTVVfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2dsaWJjLnNvL3JlYWRtZS50eHQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvZ2xpYmMuc28vcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvZ2xpYmMuc28vcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2dsaWJjL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODdlZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2dsaWJjL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvbGliYy5zby9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMuc28vcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvbGliYy5zby9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBmaWxlIGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODdlZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2dsaWJjLnNvL3JlYWRtZS50eHQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy5zby9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg3ZWZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2dsaWJjLnNvL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBmaWxlIGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvbGliYy5zby9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvbGliYy5zby9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg3ZWZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMuc28vcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNGZlNzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBCb3JsYW5kIEMrKyA0LnggMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2IGJpdCBET1MsCi0jICAgICAgICAgICAgICAgRFBNSTE2IERPUyBleHRlbmRlciBhbmQgMTYgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9XSU4xNiBVU0VfQkM1IEJDX0xJQkJBU0UgVVNFX1dJTjk1Ci0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGJjYwotICAgQ0ZMQUdTICAgICAgIDo9IC1tbCAtSD1iY2Muc3ltIC1pNjAgLWQgLWRjIC00IC1mMjg3Ci0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXgKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbQotLkVORElGCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9pSU5DTFVERSAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBiY2xpbmsgdGxpbmsuZXhlCi0gICBMREZMQUdTICAgICAgOj0gLWMKLSAgIFJDICAgICAgICAgICA6PSBicmMKLSAgIFJDRkxBR1MgICAgICA6PQotLklGICQoVVNFX0JDNSkKLS5JRiAkKFVTRV9XSU45NSkKLSAgIFdJTl9WRVJTSU9OICA6PSAtVjQuMAotLkVORElGCi0uRU5ESUYKLSAgIExJQlIgICAgICAgICA6PSB0bGliCi0gICBMSUJGTEFHUyAgICAgOj0gL0MgL1AzMgotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYgotICAgSUxJQkZMQUdTICAgIDo9IC1jCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC12Ci0gICBMREZMQUdTICAgICAgKz0gLXYKLSAgIEFTRkxBR1MgICAgICArPSAvemkKLSAgIExJQkZMQUdTICAgICArPSAvUDEyOAotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAteAotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtTzIgLWstCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMSAtay0KLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtREZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtREJFVEEKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYXMgV2luMTYKLS5JRiAkKFVTRV9XSU4xNikKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAtV0QgLUZzLSAtREJVSUxEX0RMTAotICAgQVNGTEFHUyAgICAgICs9IC1EQlVJTERfRExMCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1XIC1Gcy0KLS5FTkRJRgotICAgREVGX0xJQlMJCTo9IGltcG9ydC5saWIgbWF0aHdsLmxpYiBjd2wubGliCi0gICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCi0gICBMSUJfT1MgICAgICAgPSBXSU4xNgotLkVMU0UKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIERFRl9MSUJTICAgICA6PSBtYXRobC5saWIgZnA4Ny5saWIgY2wubGliCi0gICBMSUJfT1MgICAgICAgPSBET1MxNgotLkVORAotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX0RQTUkxNikKLVBNTElCICAgICAgICAgICA6PSBkcG1pMTZccG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotLkVORAotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKEJDX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGJjMTYubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2Q4MGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIEJvcmxhbmQgQysrIDMuMSB2ZXJzaW9uLiBTdXBwb3J0cyAxNiBiaXQgRE9TIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gYmNjCi0gICBDRkxBR1MgICAgICAgOj0gLW1sIC1IPWJjYy5zeW0gLWk2MCAtZAotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214Ci0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20KLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBiY2xpbmsgdGxpbmsuZXhlCi0gICBMREZMQUdTICAgICAgOj0gLWMKLSAgIExJQiAgICAgICAgICA6PSB0bGliCi0gICBMSUJGTEFHUyAgICAgOj0gL0MKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLXYKLSAgIExERkxBR1MgICAgICArPSAtdgotICAgQVNGTEFHUyAgICAgICs9IC96aQotICAgTElCRkxBR1MgICAgICs9IC9QMTI4Ci0uRUxTRQotICAgTERGTEFHUyAgICAgICs9IC14Ci0gICBBU0ZMQUdTICAgICAgKz0gL3EKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC0zIC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtMyAtTzEKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLWYyODcgLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtREZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtREJFVEEKLS5FTkQKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLQotIyBEZWZpbmUgdGhlIGRlZmF1bHQgbGlicmFyaWVzIHRvIGxpbmsgd2l0aAotICAgREVGX0xJQlMJCTo9IG1hdGhsLmxpYiBjbC5saWIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0VfRElSKVxkb3MxNlxiYzMKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGJjMy5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDZkZTFkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQm9ybGFuZCBDKysgNC4wIDMyIGJpdCB2ZXJzaW9uLiBTdXBwb3J0cyBCb3JsYW5kJ3MgRE9TIFBvd2VyCi0jICAgICAgICAgICAgICAgUGFjayBEUE1JMzIgRE9TIGV4dGVuZGVyLCBQaGFyIExhcCdzIFROVCBET1MgRXh0ZW5kZXIgYW5kCi0jICAgICAgICAgICAgICAgMzIgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9TTVgzMiBVU0VfVE5UIFVTRV9XSU4zMiBVU0VfQkM1IFVTRV9WWEQgQkNfTElCQkFTRQotLklNUE9SVCAuSUdOT1JFIDogVlRPT0xTRAotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGJjYzMyCi0uSUYgJChVU0VfVlhEKQotICAgQ0ZMQUdTICAgICAgIDo9IC00IC1pNjAgLWQgLXctc3R1Ci0uRUxTRQotICAgQ0ZMQUdTICAgICAgIDo9IC00IC1IPWJjYzMyLnN5bSAtaTYwIC1kIC13LXN0dQotLkVORElGCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTCQkJOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtZF9fRkxBVF9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteAotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL3ctcmVzIC93LW1jcCAvRF9fRkxBVF9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gYmNsaW5rIHRsaW5rMzIuZXhlCi0gICBMREZMQUdTICAgICAgOj0gLWMKLSAgIFJDICAgICAgICAgICA6PSBicmMzMgotLklGICQoVVNFX0JDNSkKLSAgIFdJTl9WRVJTSU9OICA6PSAtVjQuMAotICAgUkNGTEFHUyAgICAgIDo9IC0zMgotLkVMU0UKLSAgIFJDRkxBR1MgICAgICA6PSAtdzMyCi0uRU5ESUYKLSAgIExJQiAgICAgICAgICA6PSB0bGliCi0gICBMSUJGTEFHUyAgICAgOj0gL0MKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKLSAgIElMSUJGTEFHUyAgICA6PSAtYwotICAgSU5URUxfWDg2CTo9IDEKLSAgIE5NU1lNICAgCQk6PSAkKFNPRlRJQ0VfUEFUSClcbm1zeW0uZXhlCi0gICBOTVNZTUZMQUdTCTo9IC9UUkFOU0xBVEU6c291cmNlLHBhY2thZ2UsYWx3YXlzIC9QUk9NUFQgL1NPVVJDRTokKFNDSVRFQ0gpXHNyY1xwbTskKFNDSVRFQ0gpXHNyY1xwbVxjb21tb247JChTQ0lURUNIKVxzcmNccG1cd2luMzIKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLXYKLSAgIExERkxBR1MgICAgICArPSAtdgotICAgTElCRkxBR1MgICAgICs9IC9QMjU2Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBib3JsYW5kIC1nCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC96aQotLkVORElGCi0uRUxTRQotICAgTERGTEFHUyAgICAgICs9IC14Ci0gICBMSUJGTEFHUwkJKz0gL1AxMjgKLS5JRiAkKFVTRV9OQVNNKQotICAgQVNGTEFHUyAgICAgICs9IC1GIG51bGwKLS5FTFNFCi0gICBBU0ZMQUdTICAgICAgKz0gL3EKLS5FTkRJRgotLkVORAotCi0jIE9wdGlvbmFsbHkgZGlzYWJsZSBuYWdnaW5nIHdhcm5pbmdzIGlmIE1BWF9XQVJOIGlzIG5vdCBvbgotLklGICQoTUFYX1dBUk4pCi0uRUxTRQotICAgQ0ZMQUdTCQkrPSAtdy1hdXMgLXctcGFyIC13LWhpZCAtdy1waWEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zICgtNSAtTzIgYnJlYWtzIEJDKysgNC4wLTQuNSBzb21ldGltZXMpCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLU8yIC1rLQotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtNSAtTzEgLWstCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORAotCi0jIE9wdGlvbmFsbHkgdXNlIFBoYXIgTGFwJ3MgVE5UIERPUyBFeHRlbmRlciwgb3RoZXJ3aXNlIHVzZSB0aGUgRE9TIFBvd2VyIFBhY2sKLS5JRiAkKFVTRV9UTlQpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX01TRE9TX18KLSAgIERYX0NGTEFHUyAgICArPSAtRFROVAotICAgRFhfQVNGTEFHUyAgICs9IC1kVE5UCi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotICAgREVGX0xJQlMJCTo9IGltcG9ydDMyLmxpYiBjdzMyLmxpYiBkb3N4MzIubGliIHRudGFwaS5saWIKLS5FTElGICQoVVNFX1ZYRCkKLSAgIExERkxBR1MJCSs9IC1uIC1QLSAteAotICAgQ0ZMQUdTICAgICAgICs9IC1SVC0gLXgtIC1PaSAtVkMgLUkkKFZUT09MU0QpXElOQ0xVREUgLURJU18zMiAtRFdBTlRWWERXUkFQUyAtRFZUT09MU0QgLURXSU40MCAtRFdJTjQwX09SX0xBVEVSIC1EREVGU0VHPTEgLXpDX0xURVhUIC16QUxDT0RFIC16Ul9MREFUQSAtelRMQ09ERQotICAgREVGX0xJQlMJCTo9ICQoVlRPT0xTRClcbGliXGNmYmM0NDBkLmxpYiAkKFZUT09MU0QpXGxpYlx3cjBiYzQ0MC5saWIgJChWVE9PTFNEKVxsaWJcd3IxYmM0NDAubGliICQoVlRPT0xTRClcbGliXHdyMmJjNDQwLmxpYiAkKFZUT09MU0QpXGxpYlx3cjNiYzQ0MC5saWIgJChWVE9PTFNEKVxsaWJccnRiYzQ0MGQubGliCi0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX1ZYRF9fIC1kX19CT1JMQU5EQ19fPTEgLUkkKFZUT09MU0QpXElOQ0xVREUgLUkkKFZUT09MU0QpXExJQlxJTkNMVURFCi0gICBMSUJfT1MgICAgICAgPSBWWEQKLS5FTElGICQoVVNFX1dJTjMyKQotLklGICQoV0lOMzJfR1VJKQotLkVMU0UKLSAgICBDRkxBR1MgICAgICAgKz0gLURfX0NPTlNPTEVfXwotLkVORElGCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gLVdEIC1EQlVJTERfRExMCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLVcgLVdNCi0uRU5ESUYKLS5JRiAkKFVTRV9CQzUpCi0uRUxTRQotICAgQ0ZMQUdTCQkrPSAtRF9XSU4zMgotLkVORElGCi0gICBERUZfTElCUwkJOj0gaW1wb3J0MzIubGliIGN3MzJtdC5saWIKLSAgIERYX0FTRkxBR1MgICArPSAtZF9fV0lORE9XUzMyX18KLSAgIExJQl9PUyAgICAgICA9IFdJTjMyCi0uRUxJRiAkKFVTRV9TTVgzMikKLSAgIENGTEFHUyAgICAgICArPSAtRF9fU01YMzJfXyAtRFBNRTMyCi0gICBEWF9DRkxBR1MgICAgKz0KLSAgIERYX0FTRkxBR1MgICArPSAtZF9fU01YMzJfXyAtZERQTUkzMiAtZFBNRTMyCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBMSUJfT1MgICAgICAgPSBTTVgzMgotICAgREVGX0xJQlMgICAgIDo9IGN3MzJtdC5saWIKLS5FTFNFCi0gICBVU0VfRFBNSTMyICAgOj0gMQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19NU0RPU19fCi0gICBEWF9DRkxBR1MgICAgKz0gLVdYIC1ERFBNSTMyCi0gICBEWF9BU0ZMQUdTICAgKz0gLWREUE1JMzIKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIExJQl9PUyAgICAgICA9IERPUzMyCi0gICBERUZfTElCUwkJOj0KLS5FTkQKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChCQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfVE5UKQotUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0UpXHRudFxwbS5saWIKLS5FTElGICQoVVNFX0RQTUkzMikKLVBNTElCICAgICAgICAgICA6PSAkKExJQl9CQVNFKVxkcG1pMzJccG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0UpXHBtLmxpYgotLkVORAotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gYmMzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iY29zMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmNvczIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYWViN2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iY29zMi5taworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQm9ybGFuZCBDKysgMi4wIDMyLWJpdCBPUy8yIHZlcnNpb24uCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9PUzJHVUkgQkNfTElCQkFTRQotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGJjYwotICAgQ0ZMQUdTICAgICAgIDo9IC13LSAtNCAtSD1iY2MzMi5zeW0gLWk2MCAtZAotLklGICQoVVNFX05BU00pCi0gICBBUyAgICAgICAgICAgOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtZF9fRkxBVF9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19GTEFUX18gL0RfX09TMl9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gYmNsaW5rIHRsaW5rLmV4ZQotICAgTERGTEFHUyAgICAgIDo9IC1jCi0gICBSQyAgICAgICAgICAgOj0gYnJjYwotICAgUkNGTEFHUyAgICAgIDo9Ci0gICBMSUIgICAgICAgICAgOj0gdGxpYgotICAgTElCRkxBR1MgICAgIDo9IC9DIC9QMzIKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKLSAgIElMSUJGTEFHUyAgICA6PSAtYwotLklGICQoVVNFX09TMkdVSSkKLSAgIENGTEFHUwkJKz0gLURfX09TMl9QTV9fCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLXYKLSAgIExERkxBR1MgICAgICArPSAtdgotICAgTElCRkxBR1MgICAgICs9IC9QMTI4Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBib3JsYW5kCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC96aQotLkVORElGCi0uRUxTRQotICAgTERGTEFHUyAgICAgICs9IC14Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBudWxsCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ESUYKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1PMiAtay0KLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLU8xIC1rLQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBPcHRpb25hbGx5IHVzZSBQaGFyIExhcCdzIFROVCBET1MgRXh0ZW5kZXIsIG90aGVyd2lzZSB1c2UgdGhlIERPUyBQb3dlciBQYWNrCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gLXNkIC1zbSAtREJVSUxEX0RMTAotICAgQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1zbQotLkVORElGCi0gICBERUZfTElCUwk6PSBvczIubGliIGMybXQubGliCi0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX09TMl9fCi0gICBMSUJfT1MgICAgICAgPSBvczIzMgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUyAgICAgICAgICArPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChCQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfT1MyR1VJKQotREVGX0xJQlMgICAgICAgICs9IHBtX3BtLmxpYgotLkVMU0UKLURFRl9MSUJTICAgICAgICArPSBwbS5saWIKLS5FTkRJRgotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gYmNvczIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvY2wxNi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvY2wxNi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyOWExNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMTYubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIE1pY3Jvc29mdCBDIDYuMCAxNiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgMTYgYml0Ci0jICAgICAgICAgICAgICAgT1MvMiBkZXZlbG9wbWVudC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogVkNfTElCQkFTRQotLklNUE9SVCAuSUdOT1JFIDogVVNFX01BU00KLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gY2wgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncwotICAgQ0ZMQUdTICAgICAgIDo9IC93IC9HcwotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fQ09NTV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMSUYgJChVU0VfTUFTTSkKLSAgIEFTICAgICAgICAgICA6PSBtYXNtICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotICAgQVNGTEFHUyAgICAgIDo9IC9EX19DT01NX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gY2wgICAgICAgIyBMb2FkZXIgYW5kIGZsYWdzCi0gICBMREZMQUdTICAgICAgID0gJChDRkxBR1MpCi0gICBSQyAgICAgICAgICAgOj0gcmMgICAgICAgIyBXSW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCi0gICBSQ0ZMQUdTICAgICAgOj0KLSAgIExJQiAgICAgICAgICA6PSBsaWIgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9IC9OT0kgL05PRQotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYiAgICMgSW1wb3J0IGxpYnJhcmlhbgotICAgSUxJQkZMQUdTICAgIDo9IC9ub2lnbm9yZWNhc2UKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1ppICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL094Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC9GUGk4NyAvREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC9ERlBVMzg3IC9ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gL0RCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCA/Pz8/IEhvdyB0aGUgZnVjayBkbyB5b3UKLSMgc3BlY2lmeSBsaW5rZXIgb3B0aW9ucyBvbiB0aGUgQ0wgY29tbWFuZCBsaW5lPz8/Pz8KLQotLklGICQoU1RLU0laRSkKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBmb3IgMTYgYml0IFdpbmRvd3MKLS5JRiAkKFVTRV9XSU4xNikKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAvR0QgL0FsZncgL0RCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAvR0EgL0FMCi0uRU5ESUYKLSAgIERYX0FTRkxBR1MgICArPSAtRF9fV0lORE9XUzE2X18KLSAgIExJQl9PUyAgICAgICA9IFdJTjE2Ci0uRUxTRQotICAgVVNFX1JFQUxET1MJOj0gMQotICAgQ0ZMQUdTICAgICAgICs9IC9BTAotICAgTElCX09TICAgICAgID0gRE9TMTYKLS5FTkQKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSBwbS5saWIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBjbDE2Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMzg2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jbDM4Ni5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNTdmOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMzg2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgTWljcm9zb2Z0IDM4NiBDIDYuMCAzMiBiaXQuIFN1cHBvcnRzIDMyIGJpdAotIyAgICAgICAgICAgICAgIE9TLzIgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IENMX0xJQkJBU0UgVVNFX1ZERAotLklNUE9SVCAuSUdOT1JFIDogVVNFX01BU00KLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gY2wzODYgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncwotICAgIyBOQjogVGhlIC1aZiBmbGFnIGlzIEFCU09MVVRFTFkgTkVDRVNTQVJZIHRvIGNvbXBpbGUgSUJNJ3MgT1MvMiBoZWFkZXJzLgotICAgIyAgICAgSXQgaXNuJ3QgZG9jdW1lbnRlZCBhbnl3aGVyZSBidXQgb2J2aW91c2x5IGFkZHMgc3VwcG9ydCBmb3IgNDgtYml0Ci0gICAjICAgICBmYXIgcG9pbnRlcnMgKGllLiBfZmFyIGlzIHZhbGlkIGluIDMyLWJpdCBjb2RlKS4gR3JlYXQuCi0gICBDRkxBR1MgICAgICAgOj0gLUczcyAtWmYgLURfXzM4Nl9fCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9vaSAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMSUYgJChVU0VfTUFTTSkKLSAgIEFTICAgICAgICAgICA6PSBtYXNtICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBsaW5rMzg2ICAjIExpbmtlciBhbmQgZmxhZ3MKLSAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKLSAgIFJDICAgICAgICAgICA6PSByYyAgICAgICAjIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PQotICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gL05PSSAvTk9FCi0gICBJTElCICAgICAgICAgOj0gaW1wbGliICAgIyBJbXBvcnQgbGlicmFyaWFuCi0gICBJTElCRkxBR1MgICAgOj0gL25vaWdub3JlY2FzZQotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtWmkgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL094Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC9GUGk4NyAvREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC9ERlBVMzg3IC9ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gL0RCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCA/Pz8/IEhvdyB0aGUgZnVjayBkbyB5b3UKLSMgc3BlY2lmeSBsaW5rZXIgb3B0aW9ucyBvbiB0aGUgQ0wgY29tbWFuZCBsaW5lPz8/Pz8KLQotLklGICQoU1RLU0laRSkKLS5FTkRJRgotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUyAgICAgICAgICAgICAgICAgICs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfT1MgICAgICAgPSBvczIzMgotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChDTF9MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSyAgICA6PSBjbDM4Ni5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jb21tb24ubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NvbW1vbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzNzE1Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NvbW1vbi5taworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIENvbW1vbiBtYWtlZmlsZSB0YXJnZXRzIHVzZWQgYnkgYWxsIFNjaVRlY2ggU29mdHdhcmUKLSMgICAgICAgICAgICAgICBtYWtlZmlsZXMuIFRoaXMgZmlsZSBpbmNsdWRlcyB0YXJnZXRzIGZvciBjbGVhbmluZyB0aGUKLSMgICAgICAgICAgICAgICBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIG1haW50YWluaW5nIHRoZSBzb3VyY2UgZmlsZXMgd2l0aAotIyAgICAgICAgICAgICAgIFJDUy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgT3ZlcnJpZGUgZ2xvYmFsIE9wZW5HTCBpbmNsdWRlcyB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IE1HTCB2ZXJzaW9uCi0KLS5JRiAkKFVTRV9NR0xfT1BFTkdMKQotLklGICQoVU5JWF9IT1NUKQotQ0ZMQUdTCQkrPSAtSSQoU0NJVEVDSCkvaW5jbHVkZS9tZ2xnbAotREVQRU5EX0lOQwkrPSAkKFNDSVRFQ0gpL2luY2x1ZGUvbWdsZ2wKLS5FTFNFCi1DRkxBR1MJCSs9IC1JJChTQ0lURUNIKVxpbmNsdWRlXG1nbGdsCi1ERVBFTkRfSU5DCSs9ICQoU0NJVEVDSClcaW5jbHVkZS9tZ2xnbAotLkVORElGCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBhbGwgY29tcGlsZWQgRExMIGZpbGVzCi0KLS5JRiAkKFVOSVhfSE9TVCkKLS5JRiAkKENIRUNLRUQpCi1ETExfREVTVCAgICA6PSAkKFNDSVRFQ0hfTElCKS9yZWRpc3QvZGVidWcKLS5FTFNFCi1ETExfREVTVCAgICA6PSAkKFNDSVRFQ0hfTElCKS9yZWRpc3QvcmVsZWFzZQotLkVORElGCi0uRUxTRQotLklGICQoQ0hFQ0tFRCkKLURMTF9ERVNUICAgIDo9ICQoU0NJVEVDSF9MSUIpXHJlZGlzdFxkZWJ1ZwotLkVMU0UKLURMTF9ERVNUICAgIDo9ICQoU0NJVEVDSF9MSUIpXHJlZGlzdFxyZWxlYXNlCi0uRU5ESUYKLS5FTkRJRgotCi0jIFRhcmdldCB0byBidWlsZCB0aGUgbGlicmFyeSBhbmQgRExMIGZpbGUgaWYgc3BlY2lmaWVkCi0KLS5JRiAkKExJQkZJTEUpCi0KLWxpYjogJChMSUJGSUxFKQotCi0uSUYgJChETExGSUxFKQotCi0jIEJ1aWxkIGFuZCBpbnN0YWxsIGEgRExMIGZpbGUsIG9yIHNpbXBseSBidWlsZCBpbXBvcnQgbGlicmFyeSBhbmQgaW5zdGFsbAotCi0uSUYgJChCVUlMRF9ETEwpCi0KLSQoRExMRklMRSk6ICQoT0JKRUNUUykKLSQoTElCRklMRSk6ICQoRExMRklMRSkKLWluc3RhbGw6ICQoTElCRklMRSkgJChETExGSUxFKQotCSQoSU5TVEFMTCkgJChMSUJGSUxFKSAkKExJQl9ERVNUKSQoTElCX0VYVEVOREVSKQotCSQoSU5TVEFMTCkgJChETExGSUxFKSAkKERMTF9ERVNUKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChJTlNUQUxMKSAkKERMTEZJTEU6cy8uZGxsLy5ubXMpICQoRExMX0RFU1QpCi0uRU5ESUYKLS5FTFNFCi0KLSQoTElCRklMRSk6ICQoRExMX0RFU1QpXCQoRExMRklMRSkKLWluc3RhbGw6ICQoTElCRklMRSkKLQkkKElOU1RBTEwpICQoTElCRklMRSkgJChMSUJfREVTVCkkKExJQl9FWFRFTkRFUikKLQotLkVORElGCi0uRUxTRQotCi0uSUYgJChCVUlMRF9ETEwpCi0KLSMgQnVpbGQgYW5kIGluc3RhbGwgYSBVbml4IHNoYXJlZCBsaWJyYXJ5Ci0KLSQoTElCRklMRSk6ICQoT0JKRUNUUykKLWluc3RhbGw6ICQoTElCRklMRSkKLQkkKElOU1RBTEwpICQoTElCRklMRSkgJChMSUJfREVTVCkkKExJQl9FWFRFTkRFUikKLQkkKElOU1RBTEwpICQoTElCRklMRSkgJChETExfREVTVCkvJChMSUJGSUxFKS4kKFZFUlNJT04pCi0KLS5FTFNFCi0KLSMgQnVpbGQgYW5kIGluc3RhbGwgYSBub3JtYWwgbGlicmFyeSBmaWxlCi0KLS5JRiAkKFVTRV9ETEwpCi0uRUxTRQotJChMSUJGSUxFKTogJChPQkpFQ1RTKQotaW5zdGFsbDogJChMSUJGSUxFKQotCSQoSU5TVEFMTCkgJChMSUJGSUxFKSAkKExJQl9ERVNUKSQoTElCX0VYVEVOREVSKQotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotLkVORElGCi0KLSMgQnVpbGQgYW5kIGluc3RhbGwgYSBWeEQgZmlsZSwgaW5jbHVkaW5nIGRlYnVnIGluZm9ybWF0aW9uCi0KLS5JRiAkKFZYREZJTEUpCi0kKFZYREZJTEU6cy8udnhkLy5kbGwpOiAkKE9CSkVDVFMpCi0kKFZYREZJTEUpOiAkKFZYREZJTEU6cy8udnhkLy5kbGwpCi1pbnN0YWxsOiAkKFZYREZJTEUpCi0JJChJTlNUQUxMKSAkKFZYREZJTEUpICQoRExMX0RFU1QpCi0uSUYgJChEQkcpCi0JJChJTlNUQUxMKSAkKFZYREZJTEU6cy8udnhkLy5ubXMpICQoRExMX0RFU1QpCi0uRU5ESUYKLS5FTkRJRgotCi0jIENsZWFuIHVwIGRpcmVjdG9yeSByZW1vdmluZyBhbGwgZmlsZXMgbm90IG5lZWRlZCB0byBtYWtlIHRoZSBsaWJyYXJ5LgotCi1fX0NMRUFOX0ZJTEVTIDo9ICoub2JqICoubyAqLnN5bSAqLmJhayAqLnRkayAqLnN3cCAqLm1hcCAqLmVyciAqLmNzbSAqLmxpYiAqLmFwcyAqLm5tcyAqLnN5cwotX19DTEVBTl9GSUxFUyArPSAqLn4qICoudGQgKi50ciAqLnRyPyAqLnRkPyAqLnJ3cyAqLnJlcyAqLmV4cCAqLmlsayAqLnBkYiAqLnBjaCAqLmEgYmNjMzIuKgotX19DTEVBTl9GSUxFUyArPSAkKExJQkNMRUFOKQotX19DTEVBTkVYRV9GSUxFUyA6PSAkKF9fQ0xFQU5fRklMRVMpICokRSAqLmRydiAqLnJleCAqLmRsbCAqLnZ4ZCAqLm5tcyAqLnBlbCAqLnNtZiAqLnNvLioKLQotLlBIT05ZIGNsZWFuOgotCUAkKFJNKSAtZiAtUyAkKG1rdG1wICQoX19DTEVBTl9GSUxFUzp0IlxuIikpCi0KLS5QSE9OWSBjbGVhbmV4ZToKLQlAJChSTSkgLWYgLVMgJChta3RtcCAkKF9fQ0xFQU5FWEVfRklMRVM6dCJcbiIpKQotCi0jIERlZmluZSB0aGUgc291cmNlIGRpcmVjdG9yaWVzIHRvIGZpbmQgY29tbW9uIGZpbGVzCi0KLS5JRiAkKE5PX1NDSVRFQ0hfQ09NTU9OKQotLkVMU0UKLS5TT1VSQ0U6CQkgICAkKFNDSVRFQ0gpL3NyYy9jb21tb24KLS5FTkRJRgotCi0jIENyZWF0ZSB0aGUgaW5jbHVkZSBmaWxlIGRlcGVuZGVuY2llcyB1c2luZyB0aGUgTUtVVElMIG1ha2VkZXAgcHJvZ3JhbSBpZgotIyB0aGUgbGlzdCBvZiBkZXBlbmRlbnQgb2JqZWN0IGZpbGVzIGlzIGRlZmluZWQKLQotLklGICQoREVQRU5EX09CSikKLWRlcGVuZDoKLQlAJChSTSkgLWYgbWFrZWZpbGUuZGVwCi0uSUYgJChERVBFTkRfU1JDKQotLklGICQoREVQRU5EX0lOQykKLQlAbWFrZWRlcCAtYW1ha2VmaWxlLmRlcCAtciAtcyAtSUAkKG1rdG1wICQoREVQRU5EX0lOQzpzL1wvXFwpKSAtU0AkKG1rdG1wICQoREVQRU5EX1NSQzpzL1wvXFwpOyQoU0NJVEVDSCkvc3JjL2NvbW1vbikgQCQobWt0bXAgJChERVBFTkRfT0JKOnQiXG4iKVxuKQotLkVMU0UKLQlAbWFrZWRlcCAtYW1ha2VmaWxlLmRlcCAtciAtcyAtU0AkKG1rdG1wICQoREVQRU5EX1NSQzpzL1wvXFwpOyQoU0NJVEVDSCkvc3JjL2NvbW1vbikgQCQobWt0bXAgJChERVBFTkRfT0JKOnQiXG4iKVxuKQotLkVORElGCi0uRUxTRQotLklGICQoREVQRU5EX0lOQykKLQlAbWFrZWRlcCAtYW1ha2VmaWxlLmRlcCAtciAtcyAtSUAkKG1rdG1wICQoREVQRU5EX0lOQzpzL1wvXFwpKSAtU0AkKG1rdG1wICQoU0NJVEVDSCkvc3JjL2NvbW1vbikgQCQobWt0bXAgJChERVBFTkRfT0JKOnQiXG4iKVxuKQotLkVMU0UKLQlAbWFrZWRlcCAtYW1ha2VmaWxlLmRlcCAtciAtcyAtU0AkKG1rdG1wICQoU0NJVEVDSCkvc3JjL2NvbW1vbikgQCQobWt0bXAgJChERVBFTkRfT0JKOnQiXG4iKVxuKQotLkVORElGCi0uRU5ESUYKLQlAJChFQ0hPKSBPYmplY3QgZmlsZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGdlbmVyYXRlZC4KLS5FTkRJRgotCi0jIFNldCB1cCBmb3IgY29tcGlsaW5nIFNuYXAgZXhlY3V0ZWFibGVzIGFuZCBkeW5hbWljIGxpbmsgbGlicmFyaWVzCi0KLS5JRiAkKFVTRV9TTkFQKQotI0NGTEFHUyAgICAgCSs9IC1JJChQUklWQVRFKVxpbmNsdWRlXGRydmxpYiAtSSQoU0NJVEVDSClcaW5jbHVkZVxkcnZsaWIgLURfX1NOQVBfXwotQ0ZMQUdTICAgICAJKz0gLURfX1NOQVBfXwotQVNGTEFHUyAgIAkrPSAtZF9fU05BUF9fCi0jRVhFTElCUwkJKz0gc25hcCRMCi0uRU5ESUYKLQotIyBJbmNsdWRlIHJ1bGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBjb21waWxlcgotCi0uSU5DTFVERTogIiQoU0NJVEVDSCkvbWFrZWRlZnMvcnVsZXMvJChSVUxFU19NQUspIgotCi0jIEluY2x1ZGUgZmlsZSBkZXBlbmRlbmNpZXMKLQotLklOQ0xVREUgLklHTk9SRTogIm1ha2VmaWxlLmRlcCIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZW14Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9lbXgubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Njk3OTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9lbXgubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIE9TLzIgdmVyc2lvbiBmb3IgRU1YL0dOVSBDL0MrKy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgotIyBvbiB0aGUgY29tbWFuZCBsaW5lLgotX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKLS5TSUxFTlQgICAgICAgICA6PSB5ZXMKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCi0uSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBDUlRETEwgU0hXIEJFVEEgQ0hFQ0tFRCBOT19FWENFUFQgTk9fUlRUSQotLklNUE9SVCAuSUdOT1JFIDogRlVMTFNDUkVFTiBTSE9XX0FSR1MKLSAgIFRNUERJUiAgICAgICA6PSAkKFRFTVApCi0KLSMgU3RhbmRhcmQgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKLSAgIEwgICAgICAgICAgICA6PSAubGliICAgICAgICAgIyBMaWJyYXJpZXMKLSAgIEUgICAgICAgICAgICA6PSAuZXhlICAgICAgICAgIyBFeGVjdXRhYmxlcwotICAgTyAgICAgICAgICAgIDo9IC5vYmogICAgICAgICAjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgICAgICAgIyBBc3NlbWJsZXIgc291cmNlcwotICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAgICAgICAjIEMrKyBzb3VyY2VzCi0KLSMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCi0jIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgotIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCi0gICBMUCAgICAgICAgICAgOj0gICAgICAgICAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbCAgICAgICAgICAgIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gICAgICAgICAgICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogRU1YX0xJQkJBU0UgVVNFX09TMjMyIFVTRV9PUzJHVUkKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0gICBDQyAgICAgICAgICAgOj0gZ2NjCi0gICBDRkxBR1MgICAgICAgOj0gLVptdCAtWm9tZiAtV2FsbCAtSS4gLUkkKElOQ0xVREUpCi0gICBDWFggICAgICAgICAgOj0gZ2NjIC14IGMrKyAtZm5vLWV4Y2VwdGlvbnMgLWZuby1ydHRpCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgb2JqIC1GIG51bGwgLWRfX0ZMQVRfXyAtZF9fTk9VX18gLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvb2kgL0RfX0ZMQVRfXyAvRF9fTk9VX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBnY2MKLSAgIExEWFggICAgICAgICA6PSBnY2MgLXggYysrCi0gICBMREZMQUdTICAgICAgOj0gLUwuIC1ab21mIC1abXQKLSAgIExJQiAgICAgICAgICA6PSBlbXhvbWZhcgotICAgTElCRkxBR1MgICAgIDo9IC1wMzIgcmN2Ci0KLSAgIFlBQ0MgICAgICAgICA6PSBiaXNvbiAteQotICAgTEVYICAgICAgICAgIDo9IGZsZXgKLSAgIFNFRCAgICAgICAgICA6PSBzZWQKLQotIyBPcHRpb25hbGx5IHR1cm4gb2ZmIGV4Y2VwdGlvbnMgYW5kIFJUVEkgZm9yIEMrKyBjb2RlCi0uSUYgJChOT19FWENFUFQpCi0gICBDWFggICAgICAgICAgKz0gLWZuby1leGNlcHRpb25zCi0uRU5ESUYKLS5JRiAkKE5PX1JUVEkpCi0gICBDWFggICAgICAgICAgKz0gLWZuby1ydHRpCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcKLS5FTFNFCi0jIFdpdGhvdXQgLXMsIGVteCBhbHdheXMgcnVucyBMSU5LMzg2IHdpdGggdGhlIC9ERUJVRyBvcHRpb24KLSAgIENGTEFHUyAgICAgICArPSAtcwotICAgTERGTEFHUyAgICAgICs9IC1zCi0jIE5BU00gZG9lcyBub3Qgc3VwcG9ydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24geWV0Ci0gICBBU0ZMQUdTICAgICAgKz0KLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFRfTUFYKQotICAgQ0ZMQUdTICAgICAgICs9IC1PNgotLkVMSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PcwotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORElGCi0KLSMgRGlzYWJsZSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyeQotLklGICQoTk9fUlVOVElNRSkKLUNGTEFHUyAgICAgICAgICAgICAgICAgICs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKLS5FTkRJRgotCi0jIExpbmsgYWdhaW5zdCBFTVggRExMcyAoQ1JURExMPTEpIG9yIGxpbmsgd2l0aCBzdGF0aWMgQyBydW50aW1lIGxpYnJhcmllcwotLklGICQoQ1JURExMKQotICBMREZMQUdTICAgICAgICs9IC1aY3J0ZGxsCi0uRUxTRQotICBDRkxBR1MJCSs9IC1ac3lzCi0gIExERkxBR1MgICAgICAgKz0gLVpzeXMKLS5FTkRJRgotCi0jIFRhcmdldCBlbnZpcm9ubWVudCBkZXBlbmRhbnQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICArPSAtRF9fT1MyXzMyX18KLSAgIENGTEFHUyAgICAgICArPSAtRF9fT1MyX18KLSAgIEFTRkxBR1MgICAgICArPSAtZF9fT1MyX18KLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQikvbGliL2RlYnVnCi1DRkxBR1MgICAgICAgICAgKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUilcT1MyMzJcJChFTVhfTElCQkFTRSkKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCi0KLSMgQnVpbGQgMzItYml0IE9TLzIgYXBwcwotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC1aZGxsIC1EQlVJTERfRExMCi0gICBMREZMQUdTICAgICAgKz0gLVpkbGwKLSAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLkVMU0UKLS5JRiAkKFVTRV9PUzJHVUkpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX09TMl9QTV9fCi0gICBMREZMQUdTICAgICAgKz0gLVpsaW5rZXIgL1BNVFlQRTpQTQotLkVMU0UKLS5JRiAkKEZVTExTQ1JFRU4pCi0gICBMREZMQUdTICAgICAgKz0gLVpsaW5rZXIgL1BNVFlQRTpOT1ZJTwotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAtWmxpbmtlciAvUE1UWVBFOlZJTwotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IC1scG0KLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLICAgIDo9IGVteC5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfYmVvcy5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Jlb3MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjJmZGYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfYmVvcy5taworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQmVPUyB2ZXJzaW9uIGZvciBHTlUgQy9DKysuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERpc2FibGUgd2FybmluZ3MgZm9yIG1hY3JvcyByZWRlZmluZWQgaGVyZSB0aGF0IHdlcmUgZ2l2ZW4KLSMgb24gdGhlIGNvbW1hbmQgbGluZS4KLV9fLlNJTEVOVCAgICAgICA6PSAkKC5TSUxFTlQpCi0uU0lMRU5UICAgICAgICAgOj0geWVzCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZSBjb21tb24gdG8gYWxsIGNvbXBpbGVycwotLklNUE9SVCAuSUdOT1JFIDogVEVNUCBTSEVMTCBJTkNMVURFIExJQiBTQ0lURUNIIFBSSVZBVEUgU0NJVEVDSF9MSUIKLS5JTVBPUlQgLklHTk9SRSA6IERCRyBPUFQgT1BUX1NJWkUgU0hXIEJFVEEgQ0hFQ0tFRCBVU0VfWDExIFVTRV9MSU5VWAotLklNUE9SVCAuSUdOT1JFIDogVVNFX0VHQ1MgVVNFX1BHQ0MgU1RBVElDX0xJQlMgTElCQwotICAgVE1QRElSICAgICAgIDo9ICQoVEVNUCkKLQotIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotIwotIyBOT1RFOiBCZU9TIGRvZXMgbm90IHJlcXVpcmUgYW55IGV4dGVuaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQotIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAueCBleHRlbnNpb24gZm9yIGJ1aWxkaW5nCi0jICAgICAgIGV4ZWN1dGVhYmxlIGZpbGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBpbXBsaWNpdCBydWxlcyB0byBtYWtlIHRoZQotIyAgICAgICBtYWtlZmlsZXMgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuIFdoZW4geW91IGluc3RhbGwKLSMgICAgICAgdGhlIGZpbGVzIHRvIGEgbG9jYWwgYmluIGRpcmVjdG9yeSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byByZW1vdmUKLSMgICAgICAgdGhlIC54IGV4dGVuc2lvbi4KLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgRSAgICAgICAgICAgIDo9IC54ICAgCSMgRXhlY3V0YWJsZXMKLSAgIE8gICAgICAgICAgICA6PSAubyAgIAkjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgCSMgQXNzZW1ibGVyIHNvdXJjZXMKLSAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcwotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gCQkgICAgIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSB1c2UgdGhlIFVuaXggc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTEZMQUdTICAgOj0gLWMKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSBjcAotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIEJlT1MKLSAgIFVTRV9CRU9TICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZy4KLSAgIENDICAgICAgICAgICA6PSBnY2MKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbCAtSS4gLUlpbmNsdWRlICQoSU5DTFVERSkKLSAgIENYWCAgICAgICAgICA6PSBnKysKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLWYgZWxmIC1kX19GTEFUX18gLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlIC1kX19OT1VfXwotICAgTEQgICAgICAgICAgIDo9IGdjYwotICAgTERGTEFHUyAgICAgIDo9IC1MLgotICAgTElCICAgICAgICAgIDo9IGFyCi0gICBMSUJGTEFHUyAgICAgOj0gcmNzCi0KLSMgTGluayB0byBzdGF0aWMgbGlicmFyaWVzIGlmIHJlcXVlc3RlZAotLklGICQoU1RBVElDX0xJQlMpCi0gICBMREZMQUdTICAgICAgKz0gLXN0YXRpYwotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtTzYKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtTzEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkRJRgotCi0jIERpc2FibGUgc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcnkKLQotLklGICQoTk9fUlVOVElNRSkKLUNGTEFHUwkJCSs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKLS5FTkRJRgotCi0jIFRhcmdldCBlbnZpcm9ubWVudCBkZXBlbmRhbnQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICArPSAtRF9fQkVPU19fCi0gICBBU0ZMQUdTICAgICAgKz0gLWRfX0JFT1NfXyAtZF9fVU5JWF9fCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9kZWJ1ZwotQ0ZMQUdTCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvcmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0VfRElSKS9iZW9zL2djYwotTERGTEFHUyAgICAgICs9IC1MJChMSUJfREVTVCkKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSAtbHBtCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBnY2NfYmVvcy5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfZG9zLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfZG9zLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTU4OWM4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Rvcy5taworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgREpHUFAgVjIgcG9ydCBvZiBHTlUgQy9DKysgdG8gRE9TIHdpdGggRFBNSSBvbmx5LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBPdmVycmlkZSBzb21lIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCi0gICBMICAgICAgICAgICAgOj0gLmEgICAgICMgTGlicmFyaWVzCi0gICBPICAgICAgICAgICAgOj0gLm8gICAgICMgT2JqZWN0cwotCi0jIE92ZXJyaWRlIHRoZSBmaWxlIHByZWZpeC9zdWZmaXggZGVmaW5pdGlvbnMgZm9yIGxpYnJhcnkgbmFtaW5nLgotICAgTFAgICAgICAgICAgIDo9IGxpYgkJIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PQkJCSMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogREpfTElCQkFTRQotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGdjYyAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbAotICAgQVMJCQk6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgY29mZiAtRiBudWxsIC1kX19GTEFUX18gLWRfX0dOVUNfXyAtZFNURENBTExfVVNDT1JFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotICAgTEQgICAgICAgICAgIDo9IGRqX2xkICAgICMgTG9hZGVyIGFuZCBmbGFncwotICAgTERGTEFHUyAgICAgIDo9Ci0gICBMSUIgICAgICAgICAgOj0gYXIgICAgICAgIyBMaWJyYXJpYW4KLSAgIExJQkZMQUdTICAgICA6PSBycwotICAgVVNFX05BU00JCTo9IDEKLSAgIFVTRV9HQ0MJCTo9IDEKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcgICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLU8yCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORAotCi0jIERPUyBleHRlbmRlciBkZXBlbmRhbnQgZmxhZ3MKLSAgIERYX0NGTEFHUyAgICArPQotICAgRFhfQVNGTEFHUyAgICs9IC1kREpHUFAKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0VfRElSKVxET1MzMlwkKERKX0xJQkJBU0UpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gZGozMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfZnJlZWJzZC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2ZyZWVic2QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjRiODUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfZnJlZWJzZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgTGludXggdmVyc2lvbiBmb3IgR05VIEMvQysrLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBEaXNhYmxlIHdhcm5pbmdzIGZvciBtYWNyb3MgcmVkZWZpbmVkIGhlcmUgdGhhdCB3ZXJlIGdpdmVuCi0jIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1fXy5TSUxFTlQgICAgICAgOj0gJCguU0lMRU5UKQotLlNJTEVOVCAgICAgICAgIDo9IHllcwotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UgY29tbW9uIHRvIGFsbCBjb21waWxlcnMKLS5JTVBPUlQgLklHTk9SRSA6IFRFTVAgU0hFTEwgSU5DTFVERSBMSUIgU0NJVEVDSCBQUklWQVRFIFNDSVRFQ0hfTElCCi0uSU1QT1JUIC5JR05PUkUgOiBEQkcgT1BUIE9QVF9TSVpFIFNIVyBCRVRBIENIRUNLRUQgVVNFX1gxMSBVU0VfRlJFRUJTRAotLklNUE9SVCAuSUdOT1JFIDogVVNFX0VHQ1MgVVNFX1BHQ0MgU1RBVElDX0xJQlMKLSAgIFRNUERJUiAgICAgICA6PSAkKFRFTVApCi0KLSMgU3RhbmRhcmQgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKLSMKLSMgTk9URTogTGludXggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5pb24gZm9yIGV4ZWN1dGVhYmxlIGZpbGVzLCBidXQgeW91Ci0jICAgICAgIGNhbiB1c2UgYW4gZXh0ZW5zaW9uIGlmIHlvdSB3aXNoLiBXZSB1c2UgdGhlIC54IGV4dGVuc2lvbiBmb3IgYnVpbGRpbmcKLSMgICAgICAgZXhlY3V0ZWFibGUgZmlsZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGltcGxpY2l0IHJ1bGVzIHRvIG1ha2UgdGhlCi0jICAgICAgIG1ha2VmaWxlcyBzaW1wbGVyIGFuZCBtb3JlIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcy4gV2hlbiB5b3UgaW5zdGFsbAotIyAgICAgICB0aGUgZmlsZXMgdG8gYSBsb2NhbCBiaW4gZGlyZWN0b3J5LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHJlbW92ZQotIyAgICAgICB0aGUgLnggZXh0ZW5zaW9uLgotICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCi0gICBFICAgICAgICAgICAgOj0gLnggICAJIyBFeGVjdXRhYmxlcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cwotICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcwotICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCi0gICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCi0KLSMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCi0jIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgotIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCi0gICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKLSAgIFNIRUxMCQk6PSAvYmluL3NoCi0gICBTSEVMTEZMQUdTICAgOj0gLWMKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSBjcAotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIEZyZWVCU0QKLSAgIFVTRV9MSU5VWCAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZy4KLS5JRiAkKFVTRV9FR0NTKQotICAgQ0MgICAgICAgICAgIDo9IGVnY3MKLS5FTElGICQoVVNFX1BHQ0MpCi0gICBDQwkJOj0gcGdjYwotLkVMU0UKLSAgIENDICAgICAgICAgICA6PSBnY2MKLS5FTkRJRgotICAgQ0ZMQUdTICAgICAgIDo9IC1XYWxsIC1JLiAtSWluY2x1ZGUgJChJTkNMVURFKQotICAgQ1hYICAgICAgICAgIDo9IGcrKwotICAgQVMgICAgICAgICAgIDo9IG5hc20KLSMgVE9ETzogT24gZWFybGllciB2ZXJzaW9ucyBvZiBGcmVlQlNEICg8My4wKSBhLm91dCBpcyB1c2VkIGluc3RlYWQgb2YgRUxGCi0gICBBU0ZMQUdTICAgICAgOj0gLWYgZWxmIC1kX19GTEFUX18gLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlIC1kX19OT1VfXwotICAgTEQgICAgICAgICAgIDo9IGcrKwotICAgTERGTEFHUyAgICAgIDo9IC1MLgotICAgTElCICAgICAgICAgIDo9IGFyCi0gICBMSUJGTEFHUyAgICAgOj0gcmNzCi0KLSMgTGluayB0byBzdGF0aWMgbGlicmFyaWVzIGlmIHJlcXVlc3RlZAotLklGICQoU1RBVElDX0xJQlMpCi0gICBMREZMQUdTICAgICAgKz0gLXN0YXRpYwotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtTzYKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtTzEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkRJRgotCi0jIERpc2FibGUgc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcnkKLQotLklGICQoTk9fUlVOVElNRSkKLUNGTEFHUwkJCSs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKLS5FTkRJRgotCi0jIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBYMTEgb3Igbm9uLVgxMSBsaWIKLS5JRiAkKFVTRV9YMTEpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1gxMV9fCi0uRU5ESUYKLQotIyBUYXJnZXQgZW52aXJvbm1lbnQgZGVwZW5kYW50IGZsYWdzCi0gICBDRkxBR1MgICAgICAgKz0gLURfX0ZSRUVCU0RfXwotICAgQVNGTEFHUyAgICAgICs9IC1kX19GUkVFQlNEX18gLWRfX1VOSVhfXwotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKLUNGTEFHUwkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUikvZnJlZWJzZC9nY2MKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gZ2NjX2ZyZWVic2QubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2xpbnV4Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfbGludXgubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzRjZWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfbGludXgubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIExpbnV4IHZlcnNpb24gZm9yIEdOVSBDL0MrKy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL3N0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogR0NDMl9MSUJCQVNFCi0KLSMgT3ZlcnJpZGUgc29tZSBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotICAgTCAgICAgICAgICAgIDo9IC5hICAgICAjIExpYnJhcmllcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgICAjIE9iamVjdHMKLQotIyBPdmVycmlkZSB0aGUgZmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IG5hbWluZy4KLSAgIExQICAgICAgICAgICA6PSBsaWIJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0JCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmaW5lIHRoYXQgd2UgYXJlIGNvbXBpbGluZyBmb3IgTGludXgKLSAgIFVTRV9MSU5VWCAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZy4KLSAgIENDICAgICAgICAgICA6PSBnY2MKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbCAtSS4gLUlpbmNsdWRlIC1JJChTQ0lURUNIOnMsXCwvKS9pbmNsdWRlIC1JJChQUklWQVRFOnMsXCwvKS9pbmNsdWRlCi0gICBTSE9XX0NGTEFHUwk6PSAtYwotICAgQ1hYICAgICAgICAgIDo9IGcrKwotICAgQVMgICAgICAgICAgIDo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBlbGYgLWRfX0ZMQVRfXyAtZF9fR05VQ19fIC1paW5jbHVkZSAtaSQoU0NJVEVDSCkvaW5jbHVkZSAtZF9fTk9VX18KLSAgIFNIT1dfQVNGTEFHUwk6PSAtZiBlbGYKLSAgIExEICAgICAgICAgICA6PSBnY2MKLSAgIExEWFgJCQk6PSBnKysKLSAgIExERkxBR1MgICAgICA6PSAtTC4KLSAgIExJQiAgICAgICAgICA6PSBhcgotICAgTElCRkxBR1MgICAgIDo9IHJjcwotICAgWUFDQwkJCTo9IGJpc29uIC15Ci0gICBMRVgJCQk6PSBmbGV4Ci0gICBTRUQJCQk6PSBzZWQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcKLSAgIFNIT1dfQ0ZMQUdTICArPSAtZwotLkVMU0UKLSMgTkFTTSBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB5ZXQKLSAgIEFTRkxBR1MgICAgICArPQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVF9NQVgpCi0gICBDRkxBR1MgICAgICAgKz0gLU82Ci0gICBTSE9XX0NGTEFHUyAgKz0gLU82Ci0uRUxJRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtTzIKLSAgIFNIT1dfQ0ZMQUdTICArPSAtTzIKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLU8xCi0gICBTSE9XX0NGTEFHUyAgKz0gLU8xCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBTSE9XX0NGTEFHUyAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0gICBTSE9XX0FTRkxBR1MgKz0gLWRCRVRBCi0uRU5ESUYKLQotIyBEaXNhYmxlIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJ5Ci0KLS5JRiAkKE5PX1JVTlRJTUUpCi1DRkxBR1MJCQkrPSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jCi0uRU5ESUYKLQotIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgWDExIG9yIG5vbi1YMTEgbGliCi0uSUYgJChVU0VfWDExKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19YMTFfXwotLkVORElGCi0KLSMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncwotICAgQ0ZMQUdTICAgICAgICs9IC1EX19MSU5VWF9fCi0gICBBU0ZMQUdTICAgICAgKz0gLWRfX0xJTlVYX18gLWRfX1VOSVhfXwotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKLUNGTEFHUwkJICAgICs9IC1EQ0hFQ0tFRD0xCi1TSE9XX0NGTEFHUwkgICAgKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLS5JRiAkKExJQkMpCi0gICBMSUJfREVTVF9TSEFSRUQgIDo9ICQoTElCX0JBU0VfRElSKS9saW51eC9nY2MvbGliYy5zbwotICAgTElCX0RFU1RfU1RBVElDICA6PSAkKExJQl9CQVNFX0RJUikvbGludXgvZ2NjL2xpYmMKLS5FTFNFCi0gICBMSUJfREVTVF9TSEFSRUQgIDo9ICQoTElCX0JBU0VfRElSKS9saW51eC9nY2MvZ2xpYmMuc28KLSAgIExJQl9ERVNUX1NUQVRJQyAgOj0gJChMSUJfQkFTRV9ESVIpL2xpbnV4L2djYy9nbGliYwotLkVORElGCi0KLSMgTGluayB0byBzdGF0aWMgbGlicmFyaWVzIGlmIHJlcXVlc3RlZAotLklGICQoU1RBVElDX0xJQlNfQUxMKQotICAgTERGTEFHUyAgICAgICs9IC1zdGF0aWMKLSAgIFNUQVRJQ19MSUJTICA6PSAxCi0uRU5ESUYKLQotIyBMaW5rIHRvIHN0YXRpYyBsaWJyYXJpZXMgaWYgcmVxdWVzdGVkCi0uSUYgJChTVEFUSUNfTElCUykKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1RfU1RBVElDKQotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1RfU0hBUkVEKSAtTCQoTElCX0RFU1RfU1RBVElDKQotLkVORElGCi0KLSMgT3B0aW9uYWxseSBlbmFibGUgc29tZSAgZHluYW1pYyBsaWJyYXJpZXMgdG8gYmUgYnVpbHQKLS5JRiAkKEJVSUxEX0RMTCkKLS5JRiAkKFZFUlNJT05NQUopCi0uRUxTRQotICAgVkVSU0lPTk1BSgk6PSA1Ci0gICBWRVJTSU9OTUlOCTo9IDAKLS5FTkRJRgotICAgVkVSU0lPTiAgICAgIDo9ICQoVkVSU0lPTk1BSikuJChWRVJTSU9OTUlOKQotICAgTElCCQkgICAgOj0gZ2NjIC1zaGFyZWQKLSAgIExJQkZMQUdTCSAgICA6PQotICAgTAkJICAgIDo9IC5zbwotICAgQ0ZMQUdTCSAgICArPSAtZlBJQwotICAgU0hPV19DRkxBR1MJKz0gLWZQSUMKLSAgIEFTRkxBR1MgICAgICArPSAtRF9fUElDX18KLSAgIFNIT1dfQVNGTEFHUyArPSAtRF9fUElDX18KLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9ERVNUX1NIQVJFRCkKLS5FTFNFCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfREVTVF9TVEFUSUMpCi0uRU5ESUYKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSAtbHBtCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBnY2NfbGludXgubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX3dpbjMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2Nfd2luMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2NmOTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2Nfd2luMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIEN5Z3dpbiBwb3J0IG9mIEdOVSBDL0MrKyB0byBXaW4zMi4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogR0NDMl9MSUJCQVNFCi0KLSMgT3ZlcnJpZGUgc29tZSBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotICAgTCAgICAgICAgICAgIDo9IC5hICAgICAjIExpYnJhcmllcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgICAjIE9iamVjdHMKLQotIyBPdmVycmlkZSB0aGUgZmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IG5hbWluZy4KLSAgIExQICAgICAgICAgICA6PSBsaWIJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0JCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGdjYyAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbCAtSS4gLUlpbmNsdWRlIC1JJChTQ0lURUNIOnMsXCwvKS9pbmNsdWRlIC1JJChQUklWQVRFOnMsXCwvKS9pbmNsdWRlCi0gICBTSE9XX0NGTEFHUwk6PSAtYwotICAgQ1hYICAgICAgICAgIDo9IGcrKwotICAgQVMJCQk6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgY29mZiAtRiBudWxsIC1kX19GTEFUX18gLWRfX0dOVUNfXyAtZFNURENBTExfVVNDT1JFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotICAgU0hPV19BU0ZMQUdTCTo9IC1mIGNvZmYKLSAgIExEICAgICAgICAgICA6PSBnY2MgICAgCSMgTG9hZGVyIGFuZCBmbGFncwotICAgTERYWAkJCTo9IGcrKwotLklGICQoV0lOMzJfR1VJKQotICAgTERGTEFHUyAgICAgIDo9IC1MLiAtbXdpbmRvd3MgLWUgX21haW5DUlRTdGFydHVwCi0uRUxTRQotICAgTERGTEFHUyAgICAgIDo9IC1MLgotLkVORElGCi0gICBSQyAgICAgICAgICAgOj0gd2luZHJlcwotICAgUkNGTEFHUwkJOj0gLU8gY29mZgotICAgTElCICAgICAgICAgIDo9IGFyICAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gcmNzCi0gICBZQUNDCQkJOj0gYmlzb24gLXkKLSAgIExFWAkJCTo9IGZsZXgKLSAgIFNFRAkJCTo9IHNlZAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZwotICAgU0hPV19DRkxBR1MgICs9IC1nCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtTzYKLSAgIFNIT1dfQ0ZMQUdTICArPSAtTzYKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMgotICAgU0hPV19DRkxBR1MgICs9IC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtTzEKLSAgIFNIT1dfQ0ZMQUdTICArPSAtTzEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgU0hPV19DRkxBR1MgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotICAgU0hPV19BU0ZMQUdTICs9IC1kQkVUQQotLkVORElGCi0KLSMgRE9TIGV4dGVuZGVyIGRlcGVuZGFudCBmbGFncwotICAgRFhfQ0ZMQUdTICAgICs9Ci0gICBEWF9BU0ZMQUdTICAgKz0gLWRHQ0NfV0lOMzIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotU0hPV19DRkxBR1MJICAgICs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRV9ESVIpXFdJTjMyXCQoR0NDMl9MSUJCQVNFKQotICAgTERGTEFHUyAgICAgICs9IC1MJChMSUJfREVTVCkKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSAtbHBtCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBnY2Nfd2luMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvaGMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvaGMzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiMDY1YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2hjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIE1ldGF3YXJlIEhpZ2ggQy9DKysgMy4yMSAzMiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgUGhhciBMYXAncwotIyAgICAgICAgICAgICAgIFROVCBET1MgRXh0ZW5kZXIuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGhjMzg2ICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotICAgTEQgICAgICAgICAgIDo9IGhjMzg2Ci0gICBMREZMQUdTICAgICAgID0gJChDRkxBR1MpCi0gICBMSUIgICAgICAgICAgOj0gMzg2bGliICAgIyBUTlQgMzg2fGxpYiBMaWJyYXJpYW4KLSAgIExJQkZMQUdTICAgICA6PSAtVEMKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcgICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC01ODYgLU8KLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLTU4NiAtTzEKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLU8wCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLURGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgRE9TIGV4dGVuZGVyIGRlcGVuZGFudCBmbGFncwotICAgVVNFX1ROVCAgICAgIDo9IDEKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIERYX0NGTEFHUyAgICArPSAtRFROVAotICAgRFhfQVNGTEFHUyAgICs9IC1EVE5UCi0gICBMREZMQUdTICAgICAgKz0gLUxIOlxUTlRcTElCCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gdG50XHBtLmxpYgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXERPUzMyXEhDCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGhjMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54NC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4M2FmMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3FueDQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIFFOWCB2ZXJzaW9uIGZvciBXYXRjb20gQy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgotIyBvbiB0aGUgY29tbWFuZCBsaW5lLgotX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKLS5TSUxFTlQgICAgICAgICA6PSB5ZXMKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCi0uSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBDSEVDS0VEIFVTRV9RTlggVVNFX1FOWDQKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9QSE9UT04gVVNFX1gxMSBVU0VfQklPUyBTSE9XX0FSR1MgTUFYX1dBUk4gV0NfTElCQkFTRQotICAgVE1QRElSICAgICAgIDo9ICQoVEVNUCkKLQotIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotIwotIyBOT1RFOiBRbnggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5zaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQotIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAueCBleHRlbnNpb24gZm9yIGJ1aWxkaW5nCi0jICAgICAgIGV4ZWN1dGVhYmxlIGZpbGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBpbXBsaWNpdCBydWxlcyB0byBtYWtlIHRoZQotIyAgICAgICBtYWtlZmlsZXMgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuIFdoZW4geW91IGluc3RhbGwKLSMgICAgICAgdGhlIGZpbGVzIHRvIGEgbG9jYWwgYmluIGRpcmVjdG9yeSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byByZW1vdmUKLSMgICAgICAgdGhlIC54IGV4dGVuc2lvbi4KLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgRSAgICAgICAgICAgIDo9IC5leGUgICAJIyBFeGVjdXRhYmxlcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cwotICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcwotICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCi0gICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCi0KLSMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCi0jIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgotIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCi0gICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKLSAgIFNIRUxMCQk6PSAvYmluL3NoCi0gICBTSEVMTEZMQUdTICAgOj0gLWMKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSBjcAotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIFFOWAotICAgVVNFX1FOWCAgICAJOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0gICBDQyAgICAgICAgICAgOj0gd2NjMzg2Ci0gICBDRkxBR1MgICAgICAgOj0gLUkuIC1JaW5jbHVkZSAkKElOQ0xVREUpCi0gICBDWFggICAgICAgICAgOj0gd3BwMzg2Ci0gICBBUyAgICAgICAgICAgOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtZF9fRkxBVF9fIC1kU1REQ0FMTF9NQU5HTEUgLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlCi0gICBMRCAgICAgICAgICAgOj0gY2MKLSAgIExERkxBR1MgICAgICA6PSAtTC4KLSAgIExJQiAgICAgICAgICA6PSBhcgotICAgTElCRkxBR1MgICAgIDo9IHJjCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAtdzQKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLXcxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWQyCi0gICBMREZMQUdTICAgICAgKz0gLWcyCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmF0eC01ci1mcDUKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXNsbXItNXItZnA1Ci0uRUxJRiAkKE5PT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vZC01cgotLkVORAotCi0jIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBwaG90b24gb3Igbm9uLXBob3RvbiBsaWIKLS5JRiAkKFVTRV9QSE9UT04pCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1BIT1RPTl9fCi0uRU5ESUYKLQotIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgWDExIG9yIG5vbi1YMTEgbGliCi0uSUYgJChVU0VfWDExKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19YMTFfXwotLkVORElGCi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORElGCi0KLSMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncwotICAgQ0ZMQUdTICAgICAgICs9IC1EX19RTlhfXyAtRF9fVU5JWF9fCi0gICBBU0ZMQUdTICAgICAgKz0gLWRfX1FOWF9fIC1kX19VTklYX18KLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi0gIExJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKLSAgQ0ZMQUdTCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLSAgTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpL3FueDQvJChXQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0gICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IC1scG0KLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IHFueDQubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54bnRvLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9xbnhudG8ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjhlZDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9xbnhudG8ubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIFFOWCBOZXV0cmlubyB2ZXJzaW9uIGZvciBHTlUgQy9DKysKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgotIyBvbiB0aGUgY29tbWFuZCBsaW5lLgotX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKLS5TSUxFTlQgICAgICAgICA6PSB5ZXMKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCi0uSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBDSEVDS0VEIFVTRV9RTlggVVNFX1FOWE5UTwotLklNUE9SVCAuSUdOT1JFIDogVVNFX0VHQ1MgVVNFX1BIT1RPTiBVU0VfWDExIFVTRV9CSU9TCi0gICBUTVBESVIgICAgICAgOj0gJChURU1QKQotCi0jIFN0YW5kYXJkIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCi0jCi0jIE5PVEU6IFFueCBkb2VzIG5vdCByZXF1aXJlIGFueSBleHRlbnNpb24gZm9yIGV4ZWN1dGVhYmxlIGZpbGVzLCBidXQgeW91Ci0jICAgICAgIGNhbiB1c2UgYW4gZXh0ZW5zaW9uIGlmIHlvdSB3aXNoLiBXZSB1c2UgdGhlIC54IGV4dGVuc2lvbiBmb3IgYnVpbGRpbmcKLSMgICAgICAgZXhlY3V0ZWFibGUgZmlsZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGltcGxpY2l0IHJ1bGVzIHRvIG1ha2UgdGhlCi0jICAgICAgIG1ha2VmaWxlcyBzaW1wbGVyIGFuZCBtb3JlIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcy4gV2hlbiB5b3UgaW5zdGFsbAotIyAgICAgICB0aGUgZmlsZXMgdG8gYSBsb2NhbCBiaW4gZGlyZWN0b3J5LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHJlbW92ZQotIyAgICAgICB0aGUgLnggZXh0ZW5zaW9uLgotICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCi0gICBFICAgICAgICAgICAgOj0gLnggICAJIyBFeGVjdXRhYmxlcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cwotICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcwotICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCi0gICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCi0KLSMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCi0jIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgotIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCi0gICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKLSAgIFNIRUxMCQk6PSAvYmluL3NoCi0gICBTSEVMTEZMQUdTICAgOj0gLWMKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSBjcAotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIFFOWAotICAgVVNFX1FOWCAgICAJOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0gICBDQyAgICAgICAgICAgOj0gcWNjCi0gICBDRkxBR1MgICAgICAgOj0gLVZnY2NfbnRveDg2IC1JLiAtSWluY2x1ZGUgJChJTkNMVURFKQotICAgQ1BQRkxBR1MgICAgIDo9IC1WZ2NjX250b3g4NiAtSS4gLUlpbmNsdWRlICQoSU5DTFVERSkKLSAgIENYWCAgICAgICAgICA6PSBRQ0MKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgZWxmIC1kX19GTEFUX18gLWRfX0dOVUNfXyAtZFNURENBTExfTUFOR0xFIC1paW5jbHVkZSAtaSQoU0NJVEVDSCkvaW5jbHVkZSAtZF9fTk9VX18KLSAgIExEICAgICAgICAgICA6PSBxY2MKLSAgIExERkxBR1MgICAgICA6PSAtVmdjY19udG94ODYgLUwuIC1sbQotICAgTElCICAgICAgICAgIDo9IGFyCi0gICBMSUJGTEFHUyAgICAgOj0gcmMKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcyCi0gICBMREZMQUdTICAgICAgKz0gLWcyCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtT3QKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PcwotLkVORElGCi0KLSMgQ29tcGlsZSBmbGFnIGZvciB3aGV0aGVyIHRvIGJ1aWxkIHBob3RvbiBvciBub24tcGhvdG9uIGxpYgotLklGICQoVVNFX1BIT1RPTikKLSAgIENGTEFHUyAgICAgICArPSAtRF9fUEhPVE9OX18KLS5FTkRJRgotCi0jIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBYMTEgb3Igbm9uLVgxMSBsaWIKLS5JRiAkKFVTRV9YMTEpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1gxMV9fCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ESUYKLQotIyBUYXJnZXQgZW52aXJvbm1lbnQgZGVwZW5kYW50IGZsYWdzCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1FOWF9fIC1EX19VTklYX18KLSAgIEFTRkxBR1MgICAgICArPSAtZF9fUU5YX18gLWRfX1VOSVhfXwotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLSAgTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9kZWJ1ZwotICBDRkxBR1MJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotICBMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9ERVNUCTo9ICQoTElCX0JBU0VfRElSKS9xbnhudG8KLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gcW54bnRvLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWU5MTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJDwKLSUkTzogJSRQIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotJSREOiAgICAgIDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1DIC1Ud2QgYzBkbC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChFWEVMSUJTKVxuJCouZGVmKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCUikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgKyQoJjp0IiAmXG4rIilcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0lJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1DIC1Ud2UgJChXSU5fVkVSU0lPTikgYzB3bC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChFWEVMSUJTKVxuJCouZGVmKQotLkVMU0UKLSUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRkZSBjMGwub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoUE1MSUIpICQoREVGX0xJQlMpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZDA3MWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUykpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTKSkgLWMgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCUikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgKyQoJjp0IiAmXG4rIilcbikKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRFOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVGRlIGMwbC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChFWEVMSUJTKSkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjZTI1Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0uSUYgJChVU0VfVlhEKQotCi0jIEltcGxpY2l0IHJ1bGUgZ2VuZXJhdGlvbiB0byBidWlsZCBWeEQncwotCi0lJE86ICUuYyA7Ci0JJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJCg8OnMsLyxcKQotCUAkKFZUT09MU0QpXGJpblxzZWdhbGlhcy5leGUgLXAgJChWVE9PTFNEKVxpbmNsdWRlXGRlZmF1bHQuc2VnICRACi0KLSUkTzogJSRQIDsKLQkkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCi0JQCQoVlRPT0xTRClcYmluXHNlZ2FsaWFzLmV4ZSAtcCAkKFZUT09MU0QpXGluY2x1ZGVcZGVmYXVsdC5zZWcgJEAKLQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotCi0lJEw6IDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wIC0rJCg/OnQiICZcbi0rIilcbikKLQotJS5kbGw6IDsKLQlAJChDUCkgJChta3RtcCBFWFBPUlRTXG5fVGhlX0REQiBAMSkgJCouZGVmCi0JdGxpbmszMi5leGUgQCQobWt0bXAgJChMREZMQUdTKSAtVHBkICQoVlRPT0xTRDpzL1wvXFwpXGxpYlxpY3J0YmM0Lm9iaitcbiQoJjpzL1wvXFwpXG4kKi5kbGxcbiQqLm1hcFxuJChERUZfTElCUzpzL1wvXFwpICQoUE1MSUI6cy9cL1xcKSAkKEVYRUxJQlM6cy9cL1xcKVxuJCouZGVmKQotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmRlZikKLQotJS52eGQ6ICUuZGxsIDsKLQlAJChDUCkgJChta3RtcCBEWU5BTUlDXG5BVFRSSUIgSUNPREUgSU5JVFxuQVRUUklCIExDT0RFIExPQ0tFRFxuQVRUUklCIFBDT0RFIFBBR0VBQkxFXG5BVFRSSUIgU0NPREUgU1RBVElDXG5BVFRSSUIgREJPQ09ERSBERUJVR1xuTUVSR0UgSUNPREUgSU5JVERBVDAgSU5JVERBVEEpICQqLnBlbAotCUAkKFZUT09MU0QpXGJpblx2eGR2ZXIuZXhlICQqLnZyYyAkKi5yZXMKLQlAJChWVE9PTFNEKVxiaW5ccGVsZS5leGUgLWQgLXMgJCouc21mIC1jICQqLnBlbCAtbyAkQCAtayA0MDAgJCouZGxsCi0JQCQoVlRPT0xTRClcYmluXHNldGhkci5leGUgLW4gJCogLXggJEAgLXIgJCoucmVzCi0uSUYgJChEQkcpCi0JJChOTVNZTSkgL1RSQU5TOnNvdXJjZSxwYWNrYWdlIC9TT1VSQ0U6JChWWERTT1VSQ0UpICQqLnNtZgotLkVORElGCi0JQCQoUk0pIC1TICQobWt0bXAgJCoucGVsKQotCi0uRUxTRQotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMsIGxpYnJhcmllcyBhbmQgZXhlJ3MKLQotJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQoPDpzLC8sXCkKLS5JRiAkKFVTRV9OQVNNKQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0uSUYgJChJTVBPUlRfRExMKQotLkVMU0UKLS5JRiAkKE5PX1JVTlRJTUUpCi0lJEQ6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGQgLWFhICQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpXG4kKi5kZWYpCi0uRUxTRQotJSREOiA7Ci0JbWFrZWRlZiAkKEA6YikKLQkkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZCAtYWEgYzBkMzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlM6cy9cL1xcKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLklGICQoREJHKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLQl0ZHN0cnAzMiAkQAotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wICskKCY6dCIgJlxuKyIpXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotCi0uSUYgJChVU0VfV0lOMzIpCi0uSUYgJChXSU4zMl9HVUkpCi0lJEU6IDsKLQkkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZSAtYWEgJChXSU5fVkVSU0lPTikgYzB3MzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlM6cy9cL1xcKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLklGICQoREJHKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLQl0ZHN0cnAzMiAkQAotLkVORElGCi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQkkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZSAtYXAgYzB4MzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlM6cy9cL1xcKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLQl0ZHN0cnAzMiAkQAotLkVORElGCi0uRU5ESUYKLS5FTElGICQoVVNFX1ROVCkKLSUkRTogOwotCUAkKENQKSAkKG1rdG1wIHN0dWIgJ2dvdG50LmV4ZScpICQqLmRlZgotCUAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZSAtYXAgYzB4MzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlMpICQoUE1MSUI6cy9cL1xcKSAkKEVYRUxJQlMpXG4kKi5kZWYpCi0uSUYgJChET1NTVFlMRSkKLQlAbWFya3BoYXIgJEAKLS5FTkRJRgotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmRlZikKLS5FTElGICQoVVNFX1NNWDMyKQotJSRFOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVHBlIC1hcCBjMHgzMi5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLS5FTFNFCi0lJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGUgLWFwIGMweDMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLkVORAotCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmNvczIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2Jjb3MyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDczZmVjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmNvczIubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQoPDpzLC8sXCkKLS5JRiAkKFVTRV9OQVNNKQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0lJEQ6IDsKLQltYWtlZGVmICQoQDpiKQotCSQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVG9kIC1hYSBjMDJkLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCArJCgmOnQiICZcbisiKVxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLQotLklGICQoVVNFX09TMkdVSSkKLSUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRvZSAtYWEgYzAyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLkVMU0UKLSUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRvZSAtYXAgYzAyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2NsMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2NsMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODlhM2UuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgL25vbG9nbyAkKENGTEFHUykgL2MgJDwKLSUkTzogJSRQIDsgJChDQykgL25vbG9nbyAkKENGTEFHUykgL2MgJDwKLSUkTzogJSRBIDsgJChBUykgJChBU0ZMQUdTKSAkPCAkKiBOVUwgTlVMCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLSMlJEQ6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTOnMvXC9cXCkgLWUkQFxuJCgmOnQiXG4iOnMvXC9cXClcbiQoRVhFTElCUykpCi0jJSREOiA7ICQoTEQpICQoTERGTEFHUykgL0ZlJEAgJCYgJChFWEVMSUJTKQotJSREOiA7ICBsaW5rIEBkZWZhdWx0LnJzcAotCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiAgICAgIDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogICAgICA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAvbm9sb2dvICQoTElCRkxBR1MpICRAIEAkKG1rdG1wIC0rJCg/OnQiICZcbi0rIikgJlxuLCxcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0jJSRFOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLSUkRTogOyAkKExEKSBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoRVhFTElCUykpCi0uRUxTRQotJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSkKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDM4Ni5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvY2wzODYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGIyNzQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDM4Ni5taworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIC1ub2xvZ28gJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpIC1ub2xvZ28gJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpICQoQVNGTEFHUykgJDwgJCogTlVMIE5VTAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0jJSREOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUzpzL1wvXFwpIC1lJEBcbiQoJjp0IlxuIjpzL1wvXFwpXG4kKEVYRUxJQlMpKQotIyUkRDogOyAkKExEKSAkKExERkxBR1MpIC9GZSRAICQmICQoRVhFTElCUykKLSUkRDogOyAgbGluazM4NiBAZGVmYXVsdC5yc3AKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGRldmljZSBkcml2ZXIgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0lLlNZUzogOyAgbGluazM4NiBAZGVmYXVsdC5yc3AKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6ICAgICAgOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiAgICAgIDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsgJChMSUIpIC9ub2xvZ28gJChMSUJGTEFHUykgJEAgQCQobWt0bXAgLSskKD86dCIgJlxuLSsiKSAmXG4sLFxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9XSU4xNikKLSMlJEU6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQotJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLS5FTFNFCi0lJEU6IDsgJChMRCkgQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2RqMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2RqMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTE3YmIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9kajMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSAtYykgJCg8OnMsLyxcKQotJSRPOiAlJFAgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpIC1jKSAkKDw6cywvLFwpCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRMOiAgICAgIDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wICQoJjpzL1wvXFwpXG4pCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkRTogICAgICA7ICQoTEQpICQoTERGTEFHUykgJEAgQCQobWt0bXAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSAkKFBNTElCKSAtbHN0ZGN4eCAtbG0pCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2VteC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZW14Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQyMjNhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZW14Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jICAgICAgICAgICAgICAgT1MvMiB2ZXJzaW9uIGZvciBFTVgvR05VIEMvQysrLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7Ci0uSUYgJChTSE9XX0FSR1MpCi0JJChDQykgLWMgJChDRkxBR1MpICQoPDpzLFwsLykKLS5FTFNFCi0JQGVjaG8gJChDQykgLWMgJCg8OnMsXCwvKQotCUAkKENDKSAtYyAkKENGTEFHUykgJCg8OnMsXCwvKQotLkVORElGCi0KLSUkTzogJSRQIDsKLS5JRiAkKFNIT1dfQVJHUykKLQkkKENYWCkgLWMgJChDRkxBR1MpICQoPDpzLFwsLykKLS5FTFNFCi0JQGVjaG8gJChDWFgpIC1jICQoPDpzLFwsLykKLQlAJChDWFgpIC1jICQoQ0ZMQUdTKSAkKDw6cyxcLC8pCi0uRU5ESUYKLQotJSRPOiAlJEEgOwotLklGICQoVVNFX05BU00pCi0uSUYgJChTSE9XX0FSR1MpCi0JJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkKDw6cyxcLC8pCi0uRUxTRQotCUBlY2hvICQoQVMpICQoPDpzLFwsLykKLQlAJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTKSkgJCg8OnMsXCwvKQotLkVORElGCi0uRUxTRQotLklGICQoU0hPV19BUkdTKQotCi0gICAgJChBUykgIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotCUBlY2hvICQoQVMpICQoPDpzLC8sXCkKLSAgICAkKEFTKSAgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRMOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotCSQoTElCKSAkKExJQkZMQUdTKSAkQCAkKCY6cyxcLC8pCi0uRUxTRQotCUBlY2hvICQoTElCKSAkQAotCUAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgJCg/OnQiXG4iKSkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0lJEU6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKCY6cyxcLC8pICQoRVhFTElCUykgJChQTUxJQikgLWxncHAgLWxzdGRjcHAKLS5FTFNFCi0JQGVjaG8gJChMRCkgJEAKLQlAJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKCY6cyxcLC8pICQoRVhFTElCUykgJChQTUxJQikgLWxncHAgLWxzdGRjcHAKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfYmVvcy5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2Jlb3MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MWI2OTguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfYmVvcy5taworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzIGZyb20gc291cmNlIGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJFAgOyAkKENYWCkgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpICQoQVNGTEFHUykgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZQotJSRMOiAgICAgOyAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSUkRTogICAgIDsgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19mcmVlYnNkLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfZnJlZWJzZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0ZDIzNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19mcmVlYnNkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ1hYKSAkKENGTEFHUykgLWMgJDwKLSUkTzogJSRBIDsgJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlCi0lJEw6ICAgICA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCAkJgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZQotJSRFOiAgICAgOyAkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgLWxtCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19saW51eC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2xpbnV4Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjkxZmU1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2xpbnV4Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0uSUYgJChVU0VfQ1hYX0xJTktFUikKLUxECTo9ICQoTERYWCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKLSUkTzogJS5jIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKENDKSAtYyAkKENGTEFHUykgJDwKLS5FTFNFCi0gICAgQCQoRUNITykgJChDQykgJChTSE9XX0NGTEFHUykgJDwKLSAgICBAJChDQykgLWMgJChDRkxBR1MpICQ8Ci0uRU5ESUYKLQotJSRPOiAlJFAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQ1hYKSAtYyAkKENGTEFHUykgJDwKLS5FTFNFCi0gICAgQCQoRUNITykgJChDWFgpICQoU0hPV19DRkxBR1MpICQ8Ci0gICAgQCQoQ1hYKSAtYyAkKENGTEFHUykgJDwKLS5FTkRJRgotCi0lJE86ICUkQSA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAotLkVMU0UKLSAgICBAJChFQ0hPKSAkKEFTKSAkKFNIT1dfQVNGTEFHUykgJDwKLSAgICBAJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTKSkgJDwKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChMSUIpICQoTElCRkxBR1MpIC1XbCwtc29uYW1lLCRALiQoVkVSU0lPTk1BSikgLW8gJEAgJCYgJChMSUJTKQotLkVMU0UKLSAgICBAJChFQ0hPKSAkKExJQikgJEAKLSAgICBAJChMSUIpICQoTElCRkxBR1MpIC1XbCwtc29uYW1lLCRALiQoVkVSU0lPTk1BSikgLW8gJEAgJCYgJChMSUJTKQotLkVORElGCi0uRUxTRQotJSRMOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCAkJgotLkVMU0UKLSAgICBAJChFQ0hPKSAkKExJQikgJEAKLSAgICBAJChMSUIpICQoTElCRkxBR1MpICRAICQmCi0uRU5ESUYKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZQotJSRFOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoTEQpICQoTERGTEFHUykgLW8gJEAgJCYgJChFWEVMSUJTKSAkKFBNTElCKSAtbG0KLS5FTFNFCi0gICAgQCQoRUNITykgbGQgJEAKLSAgICBAJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpIC1sbQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY193aW4zMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX3dpbjMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODVkMTY2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX3dpbjMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0uSUYgJChVU0VfQ1hYX0xJTktFUikKLUxECTo9ICQoTERYWCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKLSUkTzogJS5jIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKENDKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLS5FTFNFCi0gICAgQCQoRUNITykgJChDQykgJChTSE9XX0NGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLSAgICBAJChDQykgLWMgJChDRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotJSRPOiAlJFAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQ1hYKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLS5FTFNFCi0gICAgQCQoRUNITykgJChDWFgpICQoU0hPV19DRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0gICAgQCQoQ1hYKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0lJE86ICUkQSA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChBUykgLW8gJChBU0ZMQUdTOnMvXC9cXCkgJCg8OnMsLyxcKQotLkVMU0UKLSAgICBAJChFQ0hPKSAkKEFTKSAkKFNIT1dfQVNGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLSAgICBAJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkPCAkKFJDRkxBR1MpIC1vICRACi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwKLSMgVE9ETyEKLSMlJEQ6IDsgK3JjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKLSUkTDogICAgIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKLS5FTFNFCi0gICAgQCQoRUNITykgJChMSUIpICRACi0gICAgQCQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAkKCY6cy9cL1xcKVxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0lJEU6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpIC1sbQotLkVMU0UKLSAgICBAJChFQ0hPKSBsZCAkQAotICAgIEAkKExEKSAkKExERkxBR1MpIC1vICRAIEAkKG1rdG1wICQoJjpzL1wvXFwpICQoRVhFTElCUykgJChQTUxJQikgLWxtKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2hjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2hjMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMWU5YWIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9oYzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRMOiAgICAgIDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wLCQqLnJzcCAtUiAkPykKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRFOiAgICAgIDsgJChMRCkgJChMREZMQUdTKSAtbyAkQCBAJChta3RtcCAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpIC1sZG9zeDMyLmxpYikKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvcW54NC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvcW54NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkYzAzNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueDQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgV2hldGhlciB0byBsaW5rIGluIHJlYWwgVkJJT1MgbGlicmFyeSwgb3IganVzdCB0aGUgc3R1YiBsaWJyYXJ5Ci0KLS5JRiAkKFVTRV9CSU9TKQotVkJJT1NMSUIgOj0gLWx2Ymlvcy5saWIKLS5FTFNFCi1WQklPU0xJQiA6PSAtbHZic3R1YnMubGliCi0uRU5ECi0KLSMgUmVxdWlyZSBzcGVjaWFsIHByaXZsZWRnZXMgZm9yIE51Y2xldXMgcHJvZ3JhbXMgKHJlcXVpcmVzIHJvb3QgYWNjZXNzKQotCi0uSUYgJChVU0VfTlVDTEVVUykKLUxERkxBR1MJCSs9IC1UMQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcwotJSRPOiAlLmMgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQ0MpICQoQ0ZMQUdTKSAkPAotLkVMU0UKLSAgICBAZWNobyAkKENDKSAtYyAkPAotCStAJChDQykgJChDRkxBR1MpICQ8ID4gL2Rldi9udWxsCi0uRU5ESUYKLQotJSRPOiAlJFAgOwotLklGICQoU0hPV19BUkdTKQotCSQoQ1hYKSAkKENGTEFHUykgJDwKLS5FTFNFCi0JQGVjaG8gJChDWFgpIC1jICQ8Ci0JK0AkKENYWCkgJChDRkxBR1MpICQ8ID4gL2Rldi9udWxsCi0uRU5ESUYKLQotJSRPOiAlJEEgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQVMpIC1vICRAICQoQVNGTEFHUykgJDwKLS5FTFNFCi0gICAgQGVjaG8gJChBUykgJDwKLQlAJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKLSUkTDogICAgIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKExJQikgJChMSUJGTEFHUykgLXEgJEAgJCYKLS5FTFNFCi0gICAgQGVjaG8gJChMSUIpICRACi0JK0AkKExJQikgJChMSUJGTEFHUykgLXEgJEAgJCYgPiAvZGV2L251bGwKLS5FTkRJRgotCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0lJEU6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpICQoVkJJT1NMSUIpCi0uRUxTRQotCUBlY2hvIHdsaW5rICRACi0JK0AkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgJChWQklPU0xJQikgPiAvZGV2L251bGwKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9xbnhudG8ubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueG50by5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzYWQxZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueG50by5taworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBXaGV0aGVyIHRvIGxpbmsgaW4gcmVhbCBWQklPUyBsaWJyYXJ5LCBvciBqdXN0IHRoZSBzdHViIGxpYnJhcnkKLQotLklGICQoVVNFX0JJT1MpCi1WQklPU0xJQiA6PSAtbHZiaW9zCi0uRUxTRQotVkJJT1NMSUIgOj0gLWx2YnN0dWJzCi0uRU5ECi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKLSUkTzogJSRQIDsgJChDWFgpICQoQ1BQRkxBR1MpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpIC1vICRAICQoQVNGTEFHUykgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZQotJSRMOiAgICAgOyAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSUkRTogICAgIDsgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpICQoVkJJT1NMSUIpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2JjZDguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9zYzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1MpKSAkKDw6cywvLFwpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLSUkRDogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wICQoJjpzL1wvXFwpICQoRVhFTElCUykpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wIC0rJCg/OnQiICZcbi0rIilcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0lJEU6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQotLkVMU0UKLSUkRTogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wICQoJjpzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvc2MzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvc2MzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzMTkwNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKLSUkTzogJSRQIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0uSUYgJChVU0VfTkFTTSkKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotJSREOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAsJCoubG5rICQoJjpzL1wvXFwpICQoRVhFTElCUykga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbm1tLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAtKyQoPzp0IiAmXG4tKyIpXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1ROVCkKLSUkRTogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wLCQqLmxuayAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQotLkVMSUYgJChVU0VfV0lOMzIpCi0lJEU6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCwkKi5sbmsgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2lubW0ubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIpCi0uRUxTRQotJSRFOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAsJCoubG5rICQoJjpzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmEzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmEzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyMDMxOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgIC1jIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpICAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ1BQKSAtYyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAgJCg8OnMsLyxcKQotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpICBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGhlbHAgZmlsZXMKLSUuaGxwOiAlLmlwZjsgJChJUEZDKSAkKElQRkNGTEFHUykgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEQ6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcbiQqLmRlZlxuKQotLkVMU0UKLSUkRDogOyAkKExEKSAvbm9mcmVlIC9ub2wgQCQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcbiQqLmRlZlxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsgJChMSUIpICQoTElCRkxBR1MpIEAkKG1rdG1wICRALSskKD86dCImXG4tKyI6cy9cL1xcKTspCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX09TMkdVSSkKLSUkRTogOwotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKLS5JRiAkKExYTElURSkKLQlseGxpdGUgJEAKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG5cbikKLS5JRiAkKExYTElURSkKLQlseGxpdGUgJEAKLS5FTkRJRgotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzY1Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YTM2NS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0MTgwMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzY1Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIC1jIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpICAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ1BQKSAtYyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAgJCg8OnMsLyxcKQotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEQ6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcbiQqLmRlZlxuKQotLkVMU0UKLSUkRDogOyAkKExEKSAvbm9mcmVlIC9ub2wgQCQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcbiQqLmRlZlxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpIC9vdXQ6JEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAvb3V0OiRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAvbm93YXJuOjg2IC9vdXQ6JEAgQCQobWt0bXAgJCg/OnQiXG4iOnMvXC9cXCkpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX09TMkdVSSkKLSUkRTogOwotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKLS5JRiAkKExYTElURSkKLQlseGxpdGUgJEAKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG5cbikKLS5JRiAkKExYTElURSkKLQlseGxpdGUgJEAKLS5FTkRJRgotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmMyNzAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgL25vbG9nbyAkKENGTEFHUykgL2MgJDwKLSUkTzogJSRQIDsgJChDQykgL25vbG9nbyAkKENGTEFHUykgL2MgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0lJEQ6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAtZSRAXG4kKCY6dCJcbiI6cy9cL1xcKVxuJChFWEVMSUJTKSkKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQikgJEAgL25vbG9nbyAkKExJQkZMQUdTKSBAJChta3RtcCArJCgmOnQiICZcbisiKSAmXG4sXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1dJTjE2KQotJSRFOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLSMlJEU6IDsgJChMRCkgQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQotLkVMU0UKLSUkRTogOyAkKExEKSBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmMzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmMWEwYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFR1cm4gb24gcHJlLWNvbXBpbGVkIGhlYWRlcnMgYXMgbmVjY2Vzc2FyeQotLklGICQoUFJFQ09NUF9IRFIpCi0gICBDRkxBR1MgICAgICAgKz0gLVlYIiQoUFJFQ09NUF9IRFIpIgotLkVORElGCi0KLSMgVHVybiBvbiBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYXMgbmVjZXNzYXJ5Ci0uSUYgJChVU0VfUlRUSSkKLQlDRkxBR1MJCSs9IC9HUgotLkVORElGCi0KLSMgVHVybiBvbiBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIGFzIG5lY2Vzc2FyeQotLklGICQoVVNFX0NQUEVYQ0VQVCkKLQlDRkxBR1MJCSs9IC9HWAotLkVORElGCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAvbm9sb2dvIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC9jICQoPDpzLC8sXCkKLSUkTzogJSRQIDsgJChDQykgL25vbG9nbyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAvYyAkKDw6cywvLFwpCi0uSUYgJChVU0VfTkFTTSkKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGVzIGZvciBidWlsZGluZyBOVCBkZXZpY2UgZHJpdmVycwotCi0lLnN5czogOwotCSQoTEQpIC9ub2xvZ28gQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6dCJcbiJzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykgJChERUZfTElCUykgJChMREVOREZMQUdTKSkKLS5JRiAkKERCRykKLS5JRiAkKFVTRV9TT0ZUSUNFKQotCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACi0uRU5ESUYKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotLklGICQoSU1QT1JUX0RMTCkKLS5FTFNFCi0uSUYgJChOT19SVU5USU1FKQotJSREOiA7ICQoTEQpIC9ub2xvZ28gQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6dCJcbiJzL1wvXFwpICQoRVhFTElCUykgJChERUZfTElCUykgJChMREVOREZMQUdTKSkKLS5FTFNFCi0lJEQ6IDsKLQltYWtlZGVmIC12ICQqCi0JJChMRCkgL25vbG9nbyBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjp0IlxuInMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAkKERFRl9MSUJTKSAkKExERU5ERkxBR1MpKQotLklGICQoREJHKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUuIE5vdGUgdGhhdAotIyB3ZSB1c2UgYSBzcGVjaWFsIC5WQ0QgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBFWFBPUlQgZGVmaW5pdGlvbnMgZm9yIHRoZQotIyBNaWNyb3NvZnQgY29tcGlsZXIsIHNpbmNlIHRoZSBMSUIgdXRpbGl0eSBhdXRvbWF0aWNhbGx5IGFkZHMgbGVhZGluZwotIyB1bmRlcnNjb3JlcyB0byBleHBvcnRlZCBmdW5jdGlvbnMuCi0uSUYgJChJTVBPUlRfRExMKQotJSRMOiA7Ci0JbWFrZWRlZiAtdiAkKD86YikKLSAgICBAJChSTSkgJEAKLQkkKElMSUIpICQoSUxJQkZMQUdTKSAvREVGOiQoPzpiKS5kZWYgL09VVDokQAotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCKSAkKExJQkZMQUdTKSAvb3V0OiRAIEAkKG1rdG1wICQoJjp0IlxuIilcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMzIpCi0lJEU6IDsKLQkkKExEKSAvbm9sb2dvIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCi0uSUYgJChEQkcpCi0uSUYgJChVU0VfU09GVElDRSkKLQkkKE5NU1lNKSAkKE5NU1lNRkxBR1MpOyQoU0lfU09VUkNFKSAkQAotLkVORElGCi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQlAJChMRCkgL25vbG9nbyBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjp0IlxuInMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAkKERFRl9MSUJTKSAkKExERU5ERkxBR1MpKQotLklGICQoRE9TU1RZTEUpCi0JQG1hcmtwaGFyICRACi0uRU5ESUYKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNhOTE3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTKSkgJDwKLSUkTzogJSRQIDsgJChDUFApIEAkKG1rdG1wICQoQ0ZMQUdTKSkgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgKyQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCArJD8KLS5FTFNFCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAsJCoucnNwICskKCY6dCJcbisiOnMvXC9cXClcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0uSUYgJChCVUlMRF9ETEwpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbmRvd3NfZGxsXG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCi0JQCQoUk0pIC1TICQobWt0bXAgJCoubG5rKQotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgd2luZG93c1xuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmxuaykKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgT1AgcXVpZXRcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSAkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCSQoTEQpICQoTERGTEFHUykgQCQqLmxuawotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmxuaykKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWI4ODE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCwgb3IgdXNlIGEgZGVmYXVsdCBzdGFjawotIyBvZiAyMDBrLiBUaGUgdXN1YWwgZGVmYXVsdCBzdGFjayBwcm92aWRlZCBieSBXYXRjb20gQysrIGlzICp3YXkqIHRvIHNtYWxsCi0jIGZvciByZWFsIDMyIGJpdCBjb2RlIGRldmVsb3BtZW50LiBXZSBhbHNvIG5lZWQgYSAqaHVnZSogc3RhY2sgZm9yIE9wZW5HTAotIyBzb2Z0d2FyZSByZW5kZXJpbmcgYWxzbyEKLS5JRiAkKFVTRV9RTlg0KQotICAgICMgTm90IG5lY2Vzc2FyeSBmb3IgUU5YIGNvZGUuCi0uRUxTRQotLklGICQoU1RLU0laRSkKLSAgICBMREZMQUdTCQkrPSBPUCBTVEFDSz0kKFNUS1NJWkUpCi0uRUxTRQotCUxERkxBR1MJCSs9IE9QIFNUQUNLPTIwNDgwMAotLkVORElGCi0uRU5ESUYKLQotIyBUdXJuIG9uIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBhcyBuZWNlc3NhcnkKLS5JRiAkKFVTRV9SVFRJKQotCUNQRkxBR1MJCSs9IC14cgotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIHByZS1jb21waWxlZCBoZWFkZXJzCi0uSUYgJChQUkVDT01QX0hEUikKLQlDRkxBR1MJCSs9IC1maHEKLS5FTkRJRgotCi0uSUYgJChVU0VfUU5YKQotIyBXaGV0aGVyIHRvIGxpbmsgaW4gcmVhbCBWQklPUyBsaWJyYXJ5LCBvciBqdXN0IHRoZSBzdHViIGxpYnJhcnkKLS5JRiAkKFVTRV9CSU9TKQotVkJJT1NMSUIgOj0gdmJpb3MubGliLAotLkVMU0UKLVZCSU9TTElCIDo9IHZic3R1YnMubGliLAotLkVORAotIyBSZXF1aXJlIHNwZWNpYWwgcHJpdmxlZGdlcyBmb3IgTnVjbGV1cyBwcm9ncmFtcyAocmVxdWlyZXMgcm9vdCBhY2Nlc3MpCi0uSUYgJChVU0VfTlVDTEVVUykKLUxERkxBR1MJCSs9IE9QIFBSSVY9MQotLkVORElGCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0uSUYgJChXQ19MSUJCQVNFKSA9PSBXQzEwQQotJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgJCg8OnMsLyxcKQotJSRPOiAlJFAgOyAkKENQUCkgJChDRkxBR1MpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUuYyA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLSUkTzogJSRQIDsgJChDUFApIEAkKG1rdG1wICQoQ1BGTEFHUzpzL1wvXFwpICQoQ0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGl0IHJ1bGUgdG8gY29tcGlsZSAuUyBhc3NlbWJsZXIgZmlsZXMuIFRoZSBmaXJzdCB2ZXJzaW9uCi0jIHVzZXMgR0FTIGRpcmVjdGx5IGFuZCB0aGUgc2Vjb25kIHVzZXMgYSBwcmUtcHJvY2Vzc29yIHRvCi0jIHByb2R1Y2UgTkFTTSBjb2RlLgotCi0uSUYgJChVU0VfR0FTKQotLklGICQoV0NfTElCQkFTRSkgPT0gV0MxMQotJSRPOiAlJFMgOyAkKEdBUykgLWMgQCQobWt0bXAgJChHQVNfRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSMgQmxhY2sgbWFnaWMgdG8gYnVpbGQgYXNtIHNvdXJjZXMgd2l0aCBXYXRjb20gMTAuNiAocmVxdWlyZXMgc2VkKQotJSRPOiAlJFMgOwotCSQoR0FTKSAtYyBAJChta3RtcCAkKEdBU19GTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0Jd2Rpc2FzbSBcXCAtYSAkKCo6cywvLFwpLm8gPiAkKCo6cywvLFwpLmxzdAotCXNlZCAtZSAicy9cLnRleHQvX1RFWFQvOyBzL1wuZGF0YS9fREFUQS87IHMvXC5ic3MvX0JTUy87IHMvXC4zODYvXC41ODYvOyBzL2xhciAqZWN4LGN4L2xhciBlY3gsZWN4LyIgJCgqOnMsLyxcKS5sc3QgPiAkKCo6cywvLFwpLmFzbQotCXdhc20gXFwgJChXRkxBR1MpIC16cSAtZnI9bnVsIC1mcDMgLWZvPSRAICQoKjpzLC8sXCkuYXNtCi0JJChSTSkgLVMgJChta3RtcCAkKCo6cywvLFwpLm8pCi0JJChSTSkgLVMgJChta3RtcCAkKCo6cywvLFwpLmxzdCkKLQkkKFJNKSAtUyAkKG1rdG1wICQoKjpzLC8sXCkuYXNtKQotLkVORElGCi0uRUxTRQotJSRPOiAlJFMgOwotCUBnY3BwIC1ETkFTTV9BU1NFTUJMRVIgLURfX1dBVENPTUNfXyAtRVAgJCg8OnMsLyxcKSA+ICQoKjpzLC8sXCkuYXNtCi0JbmFzbSBAJChta3RtcCAtZiBvYmogLW8gJEApICQoKjpzLC8sXCkuYXNtCi0JQCQoUk0pIC1TICQobWt0bXAgJCgqOnMsLyxcKS5hc20pCi0uRU5ESUYKLQotIyBTcGVjaWFsIHRhcmdldCB0byBidWlsZCBkbGxzdGFydC5hc20gdXNpbmcgQm9ybGFuZCBUQVNNCi1kbGxzdGFydC5vYmo6IGRsbHN0YXJ0LmFzbQotCSQoRExMX1RBU00pIEAkKG1rdG1wIC90IC9teCAvbSAvRF9fRkxBVF9fIC9pJChTQ0lURUNIKVxJTkNMVURFIC9xKSAkKFBSSVZBVEUpXHNyY1xjb21tb25cZGxsc3RhcnQuYXNtCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLS5JRiAkKElNUE9SVF9ETEwpCi0uRUxTRQotLklGICQoVVNFX09TMjMyKQotJSREOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyBvczJ2MiBkbGxcbk4gJEBcbkYgJCgmOnQiLFxuIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uRUxJRiAkKFVTRV9XSU4zMikKLSUkRDogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgbnRfZGxsXG5OICRAXG5GICQoJjp0IixcbiI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoREVGTElCUykkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMU0UKLSUkRDogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgd2luMzg2XG5OICQqLnJleFxuRiAkKCY6dCIsXG4iOnMvXC9cXClcbkxJQlIgJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCi0Jd2JpbmQgJCogLWQgLXEgLW4KLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6IDsKLQlAJChSTSkgJEAKLQkkKElMSUIpICQoSUxJQkZMQUdTKSAkQCArJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogOwotCUAkKFJNKSAkQAotCSQoSUxJQikgJChJTElCRkxBR1MpICRAICskPwotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCwkKi5yc3AgKyQoJjp0IlxuKyI6cy9cL1xcKVxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9YMzIpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCSQoTEQpICQoTERGTEFHUykgQCQqLmxuawotCXgzMmZpeCAkQAotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uRUxJRiAkKFVTRV9PUzIzMikKLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG9zMnYyX3BtXG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLklGICQoTFhMSVRFKQotIAlseGxpdGUgJEAKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgb3MydjJcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uSUYgJChMWExJVEUpCi0gCWx4bGl0ZSAkQAotLkVORElGCi0uRU5ESUYKLS5FTElGICQoVVNFX1NOQVApCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG50XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChERUZMSUJTKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uRUxJRiAkKFVTRV9XSU4zMikKLS5JRiAkKFdJTjMyX0dVSSkKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgd2luOTVcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoREVGTElCUykkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgbnRcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoREVGTElCUykkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVORElGCi0uRUxJRiAkKFVTRV9XSU4zODYpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbjM4NlxuTiAkKi5yZXhcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpIHdiaW5kICQqLnJleCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMSUYgJChVU0VfVE5UKQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgZG9zeDMyLmxpYix0bnRhcGkubGliLCQoUE1MSUIpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQkkKExEKSBAJCoubG5rCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5JRiAkKERPU1NUWUxFKQotCUBtYXJrcGhhciAkQAotLkVORElGCi0uRUxJRiAkKFVTRV9RTlg0KQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKFZCSU9TTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JQCtpZiBleGlzdCAkKi5leGUgYXR0cmliIC1zICQqLmV4ZSA+IE5VTAotCSQoTEQpIEAkKi5sbmsKLQlAYXR0cmliICtzICQqLmV4ZQotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uRUxTRQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCSQoTEQpIEAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3NjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3NjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OWFkNDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBTeW1hbnRlYyBDKysgNi54LzcueCAxNiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgMTYgYml0IERPUwotIyAgICAgICAgICAgICAgIGFuZCAxNiBiaXQgV2luZG93cyBkZXZlbG9wbWVudC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogU0NfTElCQkFTRQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBzYyAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gLW1sIC1KbQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fQ09NTV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotICAgTEQgICAgICAgICAgIDo9IHNjICAgICAgICMgTG9hZGVyIGFuZCBmbGFncwotICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQotICAgUkMgICAgICAgICAgIDo9IHJjYyAgICAgICMgV0luZG93cyByZXNvdXJjZSBjb21waWxlcgotICAgUkNGTEFHUyAgICAgIDo9ICAgICAgICAgICMgTWFyayBhcyBXaW4zMiBjb21wYXRpYmxlIHJlc291cmNlcwotICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gL04gL0IKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIgICAjIEltcG9ydCBsaWJyYXJpYW4KLSAgIElMSUJGTEFHUyAgICA6PQotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZyAgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLW8rYWxsCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1vK3NwYWNlCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1mZiAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3IC1ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgVXNlciBhIGxhcmdlciBzdGFjayBpZiByZXF1ZXN0ZWQKLQotLklGICQoU1RLU0laRSkKLSAgICBMREZMQUdTICAgICArPSA9JChTVEtTSVpFKQotLkVORElGCi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGZvciAxNiBiaXQgV2luZG93cwotLklGICQoVVNFX1dJTjE2KQotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC1XRCAtREJVSUxEX0RMTAotICAgQVNGTEFHUyAgICAgICs9IC1EQlVJTERfRExMCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1XQQotLkVORElGCi0gICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCi0gICBMSUJfT1MgICAgICAgPSBXSU4xNgotLkVMU0UKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIExJQl9PUyAgICAgICA9IERPUzE2Ci0uRU5ECi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gcG0ubGliCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoU0NfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gc2MxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E3NTcwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc2MzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgU3ltYW50ZWMgQysrIDYueC83LnggMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIHRoZSBET1NYCi0jICAgICAgICAgICAgICAgZXh0ZW5kZXIsIEZsYXNoVGVrIFgzMiBhbmQgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyCi0jICAgICAgICAgICAgICAgYW5kIDMyIGJpdCBXaW5kb3dzIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBVU0VfVE5UIFVTRV9YMzIgVVNFX1gzMlZNIFNDX0xJQkJBU0UKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBzYyAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gLUptCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXggICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVORElGCi0uSUYgJChVU0VfV0lOMzIpCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19GTEFUX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvREVTX05PVF9EUyAvRF9fQ09NTV9fIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBzYyAgICAgICAjIExvYWRlciBhbmQgZmxhZ3MKLSAgIExEX0ZMQUdTICAgICAgPQotICAgUkMgICAgICAgICAgIDo9IHJjYyAgICAgICMgV0luZG93cyByZXNvdXJjZSBjb21waWxlcgotICAgUkNGTEFHUyAgICAgIDo9IC0zMiAgICAgICMgTWFyayBhcyBXaW4zMiBjb21wYXRpYmxlIHJlc291cmNlcwotICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gL04gL0IKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIgICAjIEltcG9ydCBsaWJyYXJpYW4KLSAgIElMSUJGTEFHUyAgICA6PQotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZyAgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyIChGbGFzaFZpZXcpCi0uSUYgJChVU0VfVE5UKQotICAgTERGTEFHUyAgICAgICs9IC1mdWxsc3ltICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIFROVCAzODZsaW5rIGxpbmtlcgotLkVORAotLklGICQoVVNFX1gzMikgb3IgJChVU0VfWDMyVk0pCi0gICBMREZMQUdTICAgICAgKz0gLUwvbWFwICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgRmxhc2hWaWV3IGRlYnVnZ2VyCi0uRU5ECi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLW8rYWxsCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1vK3NwYWNlCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1mZiAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3IC1ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgVXNlciBhIGxhcmdlciBzdGFjayBpZiByZXF1ZXN0ZWQKLQotLklGICQoU1RLU0laRSkKLSAgICBMREZMQUdTICAgICArPSA9JChTVEtTSVpFKQotLkVORElGCi0KLS5JRiAkKFVTRV9UTlQpICAgICAgICAgICAgICAgICAgIyBVc2UgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyCi0gICBDRkxBR1MgICAgICAgKz0gLW1wCi0gICBEWF9DRkxBR1MgICAgKz0gLURUTlQKLSAgIEFTRkxBR1MgICAgICArPSAvRF9fRkxBVF9fCi0gICBEWF9BU0ZMQUdTICAgKz0gLURUTlQKLSAgIExEICAgICAgICAgICA6PSAzODZsaW5rCi0gICBMREZMQUdTICAgICAgKz0gQHNjMzIuZG9zIC1leGUgJEAKLSAgIExJQl9PUyAgICAgICA9IERPUzMyCi0uRUxJRiAkKFVTRV9YMzJWTSkgICAgICAgICAgICAgICMgVXNlIEZsYXNoVGVrIFgtMzJWTSBET1MgZXh0ZW5kZXIKLSAgIENGTEFHUyAgICAgICArPSAtbXgKLSAgIERYX0NGTEFHUyAgICArPSAtRFgzMlZNCi0gICBBU0ZMQUdTICAgICAgKz0gL0RfX1gzODZfXwotICAgRFhfQVNGTEFHUyAgICs9IC1EWDMyVk0KLSAgIExEICAgICAgICAgICA6PSBzYwotICAgTERGTEFHUyAgICAgICs9ICQoQ0ZMQUdTKSB4MzJ2LmxpYgotICAgTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX1gzMikgICAgICAgICAgICAgICAgIyBVc2UgRmxhc2hUZWsgWC0zMiBET1MgZXh0ZW5kZXIKLSAgIENGTEFHUyAgICAgICArPSAtbXgKLSAgIERYX0NGTEFHUyAgICArPSAtRFgzMlZNCi0gICBBU0ZMQUdTICAgICAgKz0gL0RfX1gzODZfXwotICAgRFhfQVNGTEFHUyAgICs9IC1EWDMyVk0KLSAgIExEICAgICAgICAgICA6PSBzYwotICAgTERGTEFHUyAgICAgICs9ICQoQ0ZMQUdTKSB4MzIubGliCi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotLkVMSUYgJChVU0VfV0lOMzIpICAgICAgICAgICAgICAjIEJ1aWxkIDMyIGJpdCBXaW5kb3dzIE5UIGFwcAotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC1XRCAtbW4KLSAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtV0EgLW1uCi0uRU5ESUYKLSAgIERYX0FTRkxBR1MgICArPSAtRF9fV0lORE9XUzMyX18KLSAgIExJQl9PUyAgICAgICA9IFdJTjMyCi0uRUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIGRlZmF1bHQgU3ltYW50ZWMgRE9TWCBleHRlbmRlcgotICAgVVNFX0RPU1ggICAgIDo9IDEKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIENGTEFHUyAgICAgICArPSAtbXgKLSAgIERYX0NGTEFHUyAgICArPSAtRERPU1gKLSAgIEFTRkxBR1MgICAgICArPSAvRF9fWDM4Nl9fCi0gICBEWF9BU0ZMQUdTICAgKz0gLURET1NYCi0gICBMRCAgICAgICAgICAgOj0gc2MKLSAgIExERkxBR1MgICAgICArPSAkKENGTEFHUykKLSAgIExJQl9PUyAgICAgICA9IERPUzMyCi0uRU5ECi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfVE5UKQotUE1MSUIgICAgICAgICAgIDo9IHRudFxwbS5saWIKLS5FTElGICQoVVNFX1gzMikKLVBNTElCICAgICAgICAgICA6PSB4MzJccG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IGRvc3hccG0ubGliCi0uRU5ECi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoU0NfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gc2MzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zdGFydHVwLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zdGFydHVwLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIyYmEyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc3RhcnR1cC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQ29tbW9uIHN0YXJ0dXAgc2NyaXB0IHRoYXQgZGVmaW5lcyBhbGwgdmFyaWFibGVzIGNvbW1vbiB0bwotIwkJCQlhbGwgc3RhcnR1cCBzY3JpcHRzLiBUaGVzZSBkZWZpbmUgdGhlIERNQUtFIHJ1bnRpbWUKLSMJCQkJZW52aXJvbm1lbnQgYW5kIHRoZSB2YWx1ZXMgYXJlIGRlcGVuZGFudCBvbiB0aGUgdmVyc2lvbiBvZgotIwkJCQlETUFLRSBpbiB1c2UuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERpc2FibGUgd2FybmluZ3MgZm9yIG1hY3JvcyByZWRlZmluZWQgaGVyZSB0aGF0IHdlcmUgZ2l2ZW4KLSMgb24gdGhlIGNvbW1hbmQgbGluZS4KLV9fLlNJTEVOVCAgICAgICA6PSAkKC5TSUxFTlQpCi0uU0lMRU5UICAgICAgICAgOj0geWVzCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZSBjb21tb24gdG8gYWxsIGNvbXBpbGVycwotLklNUE9SVCAuSUdOT1JFIDogVEVNUCBTSEVMTCBDT01TUEVDIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBVU0VfV0lOMzIgRlBVIEJVSUxEX0RMTCBCVUlMRF9GT1JfRExMCi0uSU1QT1JUIC5JR05PUkUgOiBJTVBPUlRfRExMIFVTRV9UQVNNWCBXSU4zMl9HVUkgVVNFX1dJTjE2IFVTRV9OQVNNIENIRUNLRUQKLS5JTVBPUlQgLklHTk9SRSA6IE9TMl9TSEVMTCBTT0ZUSUNFX1BBVEggTUFYX1dBUk4gVVNFX1NPRlRJQ0UgVVNFX1RBU00zMgotLklNUE9SVCAuSUdOT1JFIDogRExMX1NUQVJUX1RBU00gVVNFX1NOQVAgVVNFX1gxMSBVU0VfTElOVVggU1RBVElDX0xJQlMgTElCQwotLklNUE9SVCAuSUdOT1JFIDogU0hPV19BUkdTIEJPT1RfU1RSQVBfRE1BS0UKLSAgIFRNUERJUiA6PSAkKFRFTVApCi0KLSMgRGV0ZXJtaW5lIGlmIHRoZSBob3N0IG1hY2hpbmUgaXMgYSBXaW5kb3dzL0RPUyBvciBVbml4IGJveAotLklGICQoQ09NU1BFQykKLSAgIFdJTjMyX0hPU1QgICA6PSAxCi0uRUxTRQotICAgVVNFX05BU00gICAgIDo9IDEKLSAgIFVOSVhfSE9TVCAgICA6PSAxCi0uRU5ESUYKLQotIyBTZXR1cCB0byBlaXRoZXIgdXNlciBOQVNNIG9yIFRBU00gYXMgdGhlIGFzc2VtYmxlcgotLklGICQoVVNFX05BU00pCi0uRUxTRQotICAgVVNFX1RBU00JCTo9IDEKLS5FTkRJRgotCi0uSUYgJChVTklYX0hPU1QpCi0jIFN0YW5kYXJkIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCi0jCi0jIE5PVEU6IExpbnV4L1VuaXggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5pb24gZm9yIGV4ZWN1dGVhYmxlIGZpbGVzLCBidXQgeW91Ci0jICAgICAgIGNhbiB1c2UgYW4gZXh0ZW5zaW9uIGlmIHlvdSB3aXNoLiBXZSB1c2UgdGhlIC5leGUgZXh0ZW5zaW9uIGZvciBidWlsZGluZwotIyAgICAgICBleGVjdXRlYWJsZSBmaWxlcyBzbyB0aGF0IHdlIGNhbiB1c2UgaW1wbGljaXQgcnVsZXMgdG8gbWFrZSB0aGUKLSMgICAgICAgbWFrZWZpbGVzIHNpbXBsZXIgYW5kIG1vcmUgcG9ydGFibGUgYmV0d2VlbiBzeXN0ZW1zIChleGUgYWxzbyBtYWtlcyBpdAotIyAgICAgICBlYXNpZXIgZm9yIGNyb3NzLWNvbXBpbGUvZGVidWdnaW5nIHNpdHVhdGlvbnMpLiBXaGVuIHlvdSBpbnN0YWxsCi0jICAgICAgIHRoZSBmaWxlcyB0byBhIGxvY2FsIGJpbiBkaXJlY3RvcnksIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gcmVtb3ZlCi0jICAgICAgIHRoZSAuZXhlIGV4dGVuc2lvbi4KLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgRSAgICAgICAgICAgIDo9IC5leGUgICAJIyBFeGVjdXRhYmxlcyBmb3IgZ2xpYmMKLSAgIE8gICAgICAgICAgICA6PSAubyAgIAkjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgCSMgQXNzZW1ibGVyIHNvdXJjZXMKLSAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcwotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gCQkgICAgIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSB1c2UgdGhlIFVuaXggc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTAkJOj0gL2Jpbi9zaAotICAgU0hFTExGTEFHUyAgIDo9IC1jCi0KLS5FTFNFCi0jIFN0YW5kYXJkIGZpbGUgRE9TL1dpbi9PUzIgc3VmZml4IGRlZmluaXRpb25zCi0gICBMICAgICAgICAgICAgOj0gLmxpYiAgIAkjIExpYnJhcmllcwotLklGICQoVVNFX1NOQVApCi0gICBFICAgICAgICAgICAgOj0gLnN4ZSAgIAkjIFNuYXAgRXhlY3V0YWJsZXMKLSAgIEQgICAgICAgICAgICA6PSAuc2xsICAJIyBTbmFwIER5bmFtaWMgTGluayBMaWJyYXJ5IGZpbGUKLS5FTFNFCi0gICBFICAgICAgICAgICAgOj0gLmV4ZSAgIAkjIEV4ZWN1dGFibGVzCi0gICBEICAgICAgICAgICAgOj0gLmRsbCAgIAkjIER5bmFtaWMgTGluayBMaWJyYXJ5IGZpbGUKLS5FTkRJRgotICAgTyAgICAgICAgICAgIDo9IC5vYmogICAJIyBPYmplY3RzCi0gICBBICAgICAgICAgICAgOj0gLmFzbSAgIAkjIEFzc2VtYmxlciBzb3VyY2VzCi0gICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCi0gICBSICAgICAgICAgICAgOj0gLnJlcyAgIAkjIENvbXBpbGVkIHJlc291cmNlIGZpbGUKLSAgIFMJCQk6PSAucwkJIyBBc3N5bnRheC5oIHN0eWxlIGFzc2VtYmxlcgotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IAkJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAJCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PSAubGliCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIHVzZSB0aGUgRE9TL1dpbi9PUzIgc3R5bGUgc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTCAgICAgICAgOj0gJChDT01TUEVDKQotICAgR1JPVVBTSEVMTCAgIDo9ICQoU0hFTEwpCi0gICBTSEVMTEZMQUdTICAgOj0gJChTV0lUQ0hBUiljCi0gICBHUk9VUEZMQUdTICAgOj0gJChTSEVMTEZMQUdTKQotICAgU0hFTExNRVRBUyAgIDo9ICoiPzw+Ci0uSUYgJChPUzJfU0hFTEwpCi0gICBHUk9VUFNVRkZJWCAgOj0gLmNtZAotLkVMU0UKLSAgIEdST1VQU1VGRklYICA6PSAuYmF0Ci0uRU5ESUYKLSAgIERJUlNFUFNUUiAgICA6PSBcXAotICAgRElWRklMRSAgICAgICA9ICQoVE1QRklMRTpzLC8sXCkKLQotLkVORElGCi0KLSMgU3RhbmRhcmQgVW5peCBzdHlsZSBzaGVsbCBjb21tYW5kcy4gU2luY2UgdGhlc2UgZG8gbm90IGV4aXN0IG9uCi0jIHJlZ3VsYXIgRE9TL1dpbi9PUzIgaW5zdGFsbGF0aW9ucyB3ZSB1c2Ugb3VyIG93biAnJyB2ZXJzaW9ucwotIyBpbnN0ZWFkLiBUbyBib29zdHJ0YXAgYSBuZXcgT1MgeW91IG1heSB3aXNoIHRvIHVzZSB0aGUgcmVndWxhcgotIyB1bml4IHZlcnNpb25zLgotCi0uSUYgJChCT09UX1NUUkFQX0RNQUtFKQotICAgQ1AJCQk6PSBjcAotICAgTUQJCQk6PSBta2RpcgotICAgUk0JCQk6PSBybQotICAgRUNITwkJCTo9IGVjaG8KLS5FTFNFCi0gICBDUAkJCTo9IGtfY3AKLSAgIE1ECQkJOj0ga19tZAotICAgUk0JCQk6PSBrX3JtCi0gICBFQ0hPCQkJOj0ga19lY2hvCi0uRU5ESUYKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSAkKENQKQotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmNhNTIzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmEzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIElCTSBWaXN1YWxBZ2UgQysrIDMuMCBPUy8yIDMyLWJpdCB2ZXJzaW9uLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBWQV9MSUJCQVNFIFVTRV9PUzIzMiBVU0VfT1MyR1VJIEZVTExTQ1JFRU4gTk9PUFQgTUFYX1dBUk4KLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBpY2MKLSAgIENQUCAgICAgICAgICA6PSBpY2MKLSAgIENGTEFHUyAgICAgICA6PSAvUSAvRzUgL0dsKyAvRmkgL1NpIC9KLSAvU3MrIC9TcDEgL0dtKyAvSS4KLS5JRiAkKFVTRV9OQVNNKQotICAgQVMgICAgICAgICAgIDo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBvYmogLUYgbnVsbCAtZF9fRkxBVF9fIC1kU1REQ0FMTF9NQU5HTEUgLWRfX05PVV9WQVJfXyAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTFNFCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXgKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbQotLkVORElGCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19GTEFUX18gL0RTVERDQUxMX01BTkdMRSAvRF9fTk9VX1ZBUl9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gaWxpbmsKLSAgIExERkxBR1MgICAgICAgPSAvbm9pIC9leGVwYWNrOjIgL3BhY2tjb2RlIC9wYWNrZGF0YSAvYWxpZ246MzIgL21hcCAvbm9lCi0gICBSQyAgICAgICAgICAgOj0gcmMKLSAgIFJDRkxBR1MgICAgICA6PSAtbiAteDIKLSAgIExJQiAgICAgICAgICA6PSBpbGliCi0gICBMSUJGTEFHUyAgICAgOj0gL25vbG9nbwotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYgotICAgSUxJQkZMQUdTICAgIDo9IC9ub2xvZ28KLSAgIElQRkMgICAgICAgICA6PSBpcGZjCi0gICBJUEZDRkxBR1MgICAgOj0KLSAgIElCTUNPQkogICAgICA6PSAxCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAvVzMKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gL1cxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1RpCi0gICBMREZMQUdTICAgICAgKz0gL0RFCi0uRUxTRQotLklGICQoVVNFX1RBU00pCi0gICBBU0ZMQUdTICAgICAgKz0gL3EKLS5FTkRJRgotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL0dmaSAvTyAvT2kKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gL0dmaSAvTyAvT2MKLS5FTElGICQoTk9PUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL08tCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMgb3B0aW1pc2VkIGZvciBQZW50aXVtCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBCdWlsZCAzMi1iaXQgT1MvMiBhcHBzCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gL0dlLSAvREJVSUxEX0RMTAotICAgTERGTEFHUyAgICAgICs9IC9ETEwgL05PRQotICAgQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotLklGICQoVVNFX09TMkdVSSkKLSAgIENGTEFHUyAgICAgICArPSAtRF9fT1MyX1BNX18KLSAgIExERkxBR1MgICAgICArPSAvUE1UWVBFOlBNCi0uRUxTRQotLklGICQoRlVMTFNDUkVFTikKLSAgIExERkxBR1MgICAgICArPSAvUE1UWVBFOk5PVklPCi0uRUxTRQotICAgTERGTEFHUyAgICAgICs9IC9QTVRZUEU6VklPCi0uRU5ESUYKLS5FTkRJRgotLkVORElGCi0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX09TMl9fCi0gICBMSUJfT1MgICAgICAgPSBvczIzMgotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX09TMkdVSSkKLS5JRiAkKFVTRV9TRERQTURMTCkKLSNOb3RlOiBUaGlzIGlzIE9LIGZvciBub3cgYnV0IG1pZ2h0IG5lZWQgdG8gYmUgY2hhbmdlZCBpZiB0aGUgR1VJIFBNIGxpYnJhcnkKLSMgICAgICB3ZXJlIHJlYWxseSBkaWZmZXJlbnQKLVBNTElCICAgICAgICAgICA6PSBzZGRwbWxpYi5saWIKLS5FTFNFCi1QTUxJQiAgICAgICAgICAgOj0gcG1fcG0ubGliCi0uRU5ESUYKLS5FTFNFCi0uSUYgJChVU0VfU0REUE1ETEwpCi1QTUxJQiAgICAgICAgICAgOj0gc2RkcG1saWIubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotLkVORElGCi0uRU5ESUYKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MgICAgICAgICAgKz0gL0RDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoVkFfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsgICAgOj0gdmEzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTM2NS5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmEzNjUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMmVjY2IuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTM2NS5taworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBJQk0gVmlzdWFsQWdlIEMrKyAzLjY1IE9TLzIgMzItYml0IHZlcnNpb24uCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFZBX0xJQkJBU0UgVVNFX09TMjMyIFVTRV9PUzJHVUkgRlVMTFNDUkVFTiBOT09QVCBNQVhfV0FSTgotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGljYwotICAgQ1BQICAgICAgICAgIDo9IGljYwotICAgQ0ZMQUdTICAgICAgIDo9IC9RIC9HNWwgL0ZpIC9TaSAvSi0gL1NzKyAvU3AxIC9HbSsgL0kuCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgb2JqIC1GIG51bGwgLWRfX0ZMQVRfXyAtZFNURENBTExfTUFOR0xFIC1kX19OT1VfVkFSX18gLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214Ci0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20KLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTkRJRgotICAgTEQgICAgICAgICAgIDo9IGlsaW5rCi0gICBMREZMQUdTICAgICAgID0gL25vaSAvZXhlcGFjayAvcGFja2NvZGUgL3BhY2tkYXRhIC9hbGlnbjozMiAvbWFwIC9ub2UKLSAgIFJDICAgICAgICAgICA6PSByYwotICAgUkNGTEFHUyAgICAgIDo9IC9ub2xvZ28KLSAgIExJQiAgICAgICAgICA6PSBpbGliCi0gICBMSUJGTEFHUyAgICAgOj0gL25vbG9nbwotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYgotICAgSUxJQkZMQUdTICAgIDo9IC9ub2xvZ28KLSAgIElCTUNPQkogICAgICA6PSAxCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAvVzMKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gL1cxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1RpCi0gICBMREZMQUdTICAgICAgKz0gL0RFCi0uRUxTRQotLklGICQoVVNFX1RBU00pCi0gICBBU0ZMQUdTICAgICAgKz0gL3EKLS5FTkRJRgotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL0dmaSAvTyAvT2kKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gL0dmaSAvTyAvT2MKLS5FTElGICQoTk9PUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL08tCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMgb3B0aW1pc2VkIGZvciBQZW50aXVtCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBCdWlsZCAzMi1iaXQgT1MvMiBhcHBzCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gL0dtZS0gL0RCVUlMRF9ETEwKLSAgIExERkxBR1MgICAgICArPSAvRExMIC9OT0UKLSAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLkVMU0UKLS5JRiAkKFVTRV9PUzJHVUkpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX09TMl9QTV9fCi0gICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpQTQotLkVMU0UKLS5JRiAkKEZVTExTQ1JFRU4pCi0gICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpOT1ZJTwotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAvUE1UWVBFOlZJTwotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotICAgRFhfQVNGTEFHUyAgICs9IC1kX19PUzJfXwotICAgTElCX09TICAgICAgID0gb3MyMzIKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKFVTRV9PUzJHVUkpCi1QTUxJQiAgICAgICAgICAgOj0gcG1fcG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotLkVORElGCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTICAgICAgICAgICs9IC9EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFZBX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLICAgIDo9IHZhMzY1Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxM2JmOWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxLnggMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2IGJpdAotIyAgICAgICAgICAgICAgIERPUyBhbmQgV2luZG93cyBkZXZlbG9wbWVudC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogVkNfTElCQkFTRQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBjbCAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gL1lYIC93IC9HMyAvR3MKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0NPTU1fXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBjbCAgICAgICAjIExvYWRlciBhbmQgZmxhZ3MKLSAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKLSAgIFJDICAgICAgICAgICA6PSByYyAgICAgICAjIFdJbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PQotICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gL05PSSAvTk9FCi0gICBJTElCICAgICAgICAgOj0gaW1wbGliICAgIyBJbXBvcnQgbGlicmFyaWFuCi0gICBJTElCRkxBR1MgICAgOj0gL25vaWdub3JlY2FzZQotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAvWWQgL1ppICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL094Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC9GUGk4NyAvREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC9ERlBVMzg3IC9ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gL0RCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCA/Pz8/IEhvdyB0aGUgZnVjayBkbyB5b3UKLSMgc3BlY2lmeSBsaW5rZXIgb3B0aW9ucyBvbiB0aGUgQ0wgY29tbWFuZCBsaW5lPz8/Pz8KLQotLklGICQoU1RLU0laRSkKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBmb3IgMTYgYml0IFdpbmRvd3MKLS5JRiAkKFVTRV9XSU4xNikKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAvR0QgL0FsZncgL0RCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAvR0EgL0FMCi0uRU5ESUYKLSAgIERYX0FTRkxBR1MgICArPSAtRF9fV0lORE9XUzE2X18KLSAgIExJQl9PUyAgICAgICA9IFdJTjE2Ci0uRUxTRQotICAgVVNFX1JFQUxET1MJOj0gMQotICAgQ0ZMQUdTICAgICAgICs9IC9BTAotICAgTElCX09TICAgICAgID0gRE9TMTYKLS5FTkQKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSBwbS5saWIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSB2YzE2Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzkwNzEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAyLnggMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIFBoYXIgTGFwCi0jICAgICAgICAgICAgICAgVE5UIERPUyBFeHRlbmRlciBhbmQgMzIgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFROVF9QQVRIIFZDX0xJQkJBU0UgRE9TU1RZTEUgVVNFX1ROVCBVU0VfUlRUQVJHRVQgTVNWQ0RJUgotLklNUE9SVCAuSUdOT1JFIDogVVNFX1ZYRCBVU0VfTlREUlYgVVNFX1cyS0RSViBOVF9EREtST09UIFVTRV9SVFRJIFVTRV9DUFBFWENFUFQKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBjbCAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0KLS5JRiAkKFVTRV9OQVNNKQotICAgQVMJCQk6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgd2luMzIgLUYgbnVsbCAtZF9fRkxBVF9fIC1kU1REQ0FMTF9NQU5HTEUgLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBjbAotLklGICQoVVNFX1dJTjMyKQotICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQotLklGICQoVVNFX05URFJWKQotICAgTERFTkRGTEFHUyAgID0gLWxpbmsgL0lOQ1JFTUVOVEFMOk5PIC9EUklWRVIgL1NVQlNZU1RFTTpOQVRJVkUsNC4wMCAvVkVSU0lPTjo0LjAwIC9NQUNISU5FOkkzODYgL05PREVGQVVMVExJQiAvREVCVUdUWVBFOkNWIC9QREI6Tk9ORSAvQUxJR046MHgyMCAvQkFTRToweDEwMDAwIC9FTlRSWTpEcml2ZXJFbnRyeUA4Ci0JIy9NRVJHRTpfcGFnZT1wYWdlIC9NRVJHRTpfdGV4dD0udGV4dCAvTUVSR0U6LnJkYXRhPS50ZXh0Ci0uRUxJRiAkKFdJTjMyX0dVSSkKLSAgIExERU5ERkxBR1MgICA9IC1saW5rIC9JTkNSRU1FTlRBTDpOTyAvREVGOiQoQDpiKS5kZWYgL1NVQlNZU1RFTTpXSU5ET1dTIC9NQUNISU5FOkkzODYgL0RFQlVHVFlQRTpDViAvUERCOk5PTkUKLS5FTFNFCi0gICBMREVOREZMQUdTICAgPSAtbGluayAvSU5DUkVNRU5UQUw6Tk8gL1NVQlNZU1RFTTpDT05TT0xFIC9NQUNISU5FOkkzODYgL0RFQlVHVFlQRTpDViAvUERCOk5PTkUKLS5FTkRJRgotLkVMU0UKLSAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKLSAgIExERU5ERkxBR1MgICA6PSAtbGluayAtc3R1YjokKFROVF9QQVRIOnMvXC9cXClcXGJpblxcZ290bnQuZXhlIC9QREI6Tk9ORQotLkVORElGCi0gICBSQyAgICAgICAgICAgOj0gcmMgICAgICAgIyBXYXRjb20gcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PSAgICAgICAgICAjIE1hcmsgYXMgV2luMzIgY29tcGF0aWJsZSByZXNvdXJjZXMKLSAgIExJQiAgICAgICAgICA6PSBsaWIgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9Ci0gICBJTElCICAgICAgICAgOj0gbGliICAgICAgIyBJbXBvcnQgbGlicmFyaWFuCi0gICBJTElCRkxBR1MgICAgOj0gL01BQ0hJTkU6SVg4NgotICAgSU5URUxfWDg2CTo9IDEKLSAgIE5NU1lNICAgCQk6PSAkKFNPRlRJQ0VfUEFUSClcbm1zeW0uZXhlCi0uSUYgJChVU0VfTlREUlYpCi0gICBOTVNZTUZMQUdTCTo9IC9UUkFOU0xBVEU6c291cmNlLHBhY2thZ2UsYWx3YXlzIC9QUk9NUFQgL1NPVVJDRTokKE1TVkNESVIpXGNydFxzcmNcaW50ZWw7JChTQ0lURUNIKVxzcmNccG07JChTQ0lURUNIKVxzcmNccG1cY29tbW9uOyQoU0NJVEVDSClcc3JjXHBtXG50ZHJ2Ci0uRUxTRQotICAgTk1TWU1GTEFHUwk6PSAvVFJBTlNMQVRFOnNvdXJjZSxwYWNrYWdlLGFsd2F5cyAvUFJPTVBUIC9TT1VSQ0U6JChTQ0lURUNIKVxzcmNccG07JChTQ0lURUNIKVxzcmNccG1cY29tbW9uOyQoU0NJVEVDSClcc3JjXHBtXHdpbjMyCi0uRU5ESUYKLQotIyBTZXQgdGhlIGNvbXBpbGVyIHdhcm5pbmcgbGV2ZWwKLS5JRiAkKE1BWF9XQVJOKQotICAgQ0ZMQUdTICAgICAgICs9IC1XMwotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtVzEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAvWWQgL1ppICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0uSUYgJChVU0VfVEFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAvemkgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBhc3NlbWJsZXIKLS5FTkRJRgotLkVMU0UKLS5JRiAkKFVTRV9UQVNNKQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORElGCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKFZDX0xJQkJBU0UpID09IHZjNQotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9HNiAvTzIgL094IC9PaS0KLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gL0c2IC9PMQotLkVORAotLkVMU0UKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAvRzUgL08yIC9PeAotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAvRzUgL08xCi0uRU5ECi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gL0RGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAvREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBVc2UgYSBsYXJnZXIgc3RhY2sgZHVyaW5nIGxpbmtpbmcgaWYgcmVxdWVzdGVkLCBvciB1c2UgYSBkZWZhdWx0IHN0YWNrCi0jIG9mIDUway4gVGhlIHVzdWFsIGRlZmF1bHQgc3RhY2sgcHJvdmlkZWQgYnkgVmlzdWFsIEMrKyBpcyAqd2F5KiB0byBzbWFsbAotIyBmb3IgcmVhbCAzMiBiaXQgY29kZSBkZXZlbG9wbWVudC4KLQotLklGICQoVVNFX1dJTjMyKQotCSMgTm90IG5lY2Vzc2FyeSBmb3IgV2luMzIgY29kZS4KLS5FTFNFCi0uSUYgJChTVEtTSVpFKQotCUxERU5ERkxBR1MgICs9IC9TVEFDSzokKFNUS1NJWkUpCi0uRUxTRQotCUxERU5ERkxBR1MgICs9IC9TVEFDSzo1MTIwMAotLkVORElGCi0uRU5ESUYKLQotIyBET1MgZXh0ZW5kZXIgZGVwZW5kYW50IGZsYWdzCi0uSUYgJChVU0VfTlREUlYpCQkJCSMgQnVpbGQgMzIgYml0IFdpbmRvd3MgTlQgZHJpdmVyCi0gICBDRkxBR1MgICAgICAgKz0gL0xEIC9abCAvR3kgL0d6IC9HRiAvRF9fTlRfRFJJVkVSX18gL0RfWDg2Xz0xIC9EaTM4Nj0xCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1FJZgotLkVORElGCi0gICBBU0ZMQUdTICAgICAgKz0KLSAgIERFRl9MSUJTCQk6PSBpbnQ2NC5saWIgbnRvc2tybmwubGliIGhhbC5saWIKLSAgIERYX0FTRkxBR1MgICArPSAtZF9fTlRfRFJJVkVSX18KLS5JRiAkKFVTRV9XMktEUlYpCQkJCSMgQnVpbGQgMzIgYml0IFdpbmRvd3MgMjAwMCBkcml2ZXIKLSAgIExJQl9PUyAgICAgICA9IFcyS0RSVgotLkVMU0UKLSAgIExJQl9PUyAgICAgICA9IE5URFJWCi0uRU5ESUYKLS5FTElGICQoVVNFX1dJTjMyKSAgICAgICAgICAgICAgIyBCdWlsZCAzMiBiaXQgV2luZG93cyBOVCBhcHAKLS5JRiAkKFdJTjMyX0dVSSkKLS5FTFNFCi0gICAgQ0ZMQUdTICAgICAgICs9IC1EX19DT05TT0xFX18KLS5FTkRJRgotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC9NVCAvTEQgL0RCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLklGICQoTk9fUlVOVElNRSkKLSAgIExERU5ERkxBR1MgICArPSAvTk9ERUZBVUxUTElCCi0gICBDRkxBR1MgCQkrPSAvWmwKLSAgIERFRl9MSUJTCQk6PQotLkVMU0UKLSAgIERFRl9MSUJTCQk6PSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdpbm1tLmxpYiBjb21kbGczMi5saWIgY29tY3RsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdmVyc2lvbi5saWIgd2luc3Bvb2wubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIHJwY3J0NC5saWIKLS5FTkRJRgotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAvTVQKLSAgIERFRl9MSUJTCQk6PSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdpbm1tLmxpYiBjb21kbGczMi5saWIgY29tY3RsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdmVyc2lvbi5saWIgd2luc3Bvb2wubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIHJwY3J0NC5saWIKLS5FTkRJRgotICAgRFhfQVNGTEFHUyAgICs9IC1kX19XSU5ET1dTMzJfXwotICAgTElCX09TICAgICAgID0gV0lOMzIKLS5FTElGICQoVVNFX1JUVEFSR0VUKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19SVFRBUkdFVF9fCi0gICBEWF9DRkxBR1MgICAgKz0KLSAgIERYX0FTRkxBR1MgICArPSAtZF9fUlRUQVJHRVRfXwotICAgVVNFX1JFQUxET1MJOj0KLSAgIExJQl9PUyAgICAgICA9IFJUVDMyCi0gICBERUZfTElCUyAgICAgOj0gY3czMm10LmxpYgotLkVMU0UKLSAgIFVTRV9UTlQgICAgICA6PSAxCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBDRkxBR1MgICAgICAgKz0gL01UIC9EX19NU0RPUzMyX18KLSAgIERYX0NGTEFHUyAgICArPSAtRFROVAotICAgRFhfQVNGTEFHUyAgICs9IC1kVE5UCi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotICAgREVGX0xJQlMJCTo9IGRvc3gzMi5saWIgdG50YXBpLmxpYgotLkVORElGCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gL0RDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoVkNfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX1ROVCkKLVBNTElCICAgICAgICAgICA6PSAkKExJQl9CQVNFOnMvXC9cXClcXHRudFxccG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0U6cy9cL1xcKVxccG0ubGliCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IHZjMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvd2MxNi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvd2MxNi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxNmY0Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMTYubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIFdhdGNvbSBDKysgMTAueCAxNiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgMTYtYml0IERPUywKLSMgICAgICAgICAgICAgICAxNi1iaXQgV2luZG93cyBkZXZlbG9wbWVudCBhbmQgMTYtYml0IE9TLzIgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFdDX0xJQkJBU0UgVVNFX1dJTjE2IFVTRV9PUzIxNiBVU0VfT1MyR1VJCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IHdjYyAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENQUCAgICAgICAgICA6PSB3cHAgICAgICAjIEMrKy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PSAtbWwtenEtai13Mi1zLWZoIC1maHEKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0xBUkdFX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0gICBMRCAgICAgICAgICAgOj0gd2xpbmsgICAgIyBMb2FkZXIgYW5kIGZsYWdzCi0gICBMREZMQUdTICAgICAgID0KLSAgIFJDICAgICAgICAgICA6PSB3cmMgICAgICAjIFdhdGNvbSByZXNvdXJjZSBjb21waWxlcgotICAgUkNGTEFHUyAgICAgIDo9IC9idD13aW5kb3dzCi0gICBMSUIgICAgICAgICAgOj0gd2xpYiAgICAgIyBMaWJyYXJpYW4KLSAgIExJQkZMQUdTICAgICA6PSAtcQotICAgSUxJQiAgICAgICAgIDo9IHdsaWIgICAgICMgSW1wb3J0IGxpYnJhcmlhbgotICAgSUxJQkZMQUdTICAgIDo9IC1jCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1kMiAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEMgY29tcGlsZXIKLSAgIExJQkZMQUdTICAgICArPSAtcD0xMjggICAjIExhcmdlciBwYWdlIHNpemUgZm9yIGxpYnJhcmllcyB3aXRoIGRlYnVnIGluZm8hCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0gICBMREZMQUdTICAgICAgKz0gRCBBICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgbGlua2VyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXR4LTUKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXNsbXItNQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zIG9wdGltaXNlZCBmb3IgUGVudGl1bQotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLWZwaTg3LWZwNS1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLURGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZAotCi0uSUYgJChTVEtTSVpFKQotICAgIExERkxBR1MgICAgICs9IE9QIFNUQUNLPSQoU1RLU0laRSkKLS5FTkRJRgotCi0uSUYgJChVU0VfT1MyMTYpCi0uSUYgJChCVUlMRF9ETEwpCi0gICAgQ0ZMQUdTICAgICAgICs9IC1iZC1idD1vczItREJVSUxEX0RMTAotICAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgICBDRkxBR1MgICAgICAgKz0gLWJ0PW9zMgotLkVORElGCi0gICAgRFhfQVNGTEFHUyAgICs9IC1EX19PUzIxNl9fCi0gICAgTElCX09TICAgICAgID0gb3MyMTYKLS5FTElGICQoVVNFX1dJTjE2KQotLklGICQoQlVJTERfRExMKQotICAgIENGTEFHUyAgICAgICArPSAtYmQtYnQ9d2luZG93cy1EX1dJTkRPV1MtREJVSUxEX0RMTAotICAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgICBDRkxBR1MgICAgICAgKz0gLWJ0PXdpbmRvd3MtRF9XSU5ET1dTCi0uRU5ESUYKLSAgICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCi0gICAgTElCX09TICAgICAgID0gV0lOMTYKLS5FTFNFCi0gICAgVVNFX1JFQUxET1MgIDo9IDEKLQlMSUJfT1MgICAgICAgPSBET1MxNgotLkVORAotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYiwKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChXQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSB3YzE2Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTc1Y2EuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBXYXRjb20gQysrIDEwLnggMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIFJhdGlvbmFsJ3MgRE9TNEdXCi0jICAgICAgICAgICAgICAgRE9TIEV4dGVuZGVyLCBQTU9ERS9XLCBDYXVzZXdheSwgRmxhc2hUZWsncyBYMzItVk0sCi0jICAgICAgICAgICAgICAgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyLCAzMi1iaXQgV2luZG93cyBkZXZlbG9wbWVudCBhbmQKLSMJCQkJMzItYml0IE9TLzIgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9UTlQgVVNFX1gzMiBVU0VfWDMyVk0gVVNFX1BNT0RFVyBTVEtDQUxMIFVTRV9DQVVTRVdBWQotLklNUE9SVCAuSUdOT1JFIDogVVNFX1dJTjM4NiBVU0VfT1MyMzIgVVNFX09TMkdVSSBXQ19MSUJCQVNFIE5PT1BUIERPU1NUWUxFCi0uSU1QT1JUIC5JR05PUkUgOiBPUzJfU0hFTEwgVVNFX0NPREVWSUVXIFVTRV9ET1MzMkEgVVNFX1FOWDQgTEVBVkVfTElOS0ZJTEUKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIFNldHVwIHNwZWNpYWwgZW52aXJvbm1lbnQgZm9yIFFOWCA0IChVbml4J2lzaCkKLS5JRiAkKFVTRV9RTlg0KQotICAgVVNFX1FOWCAgICAJOj0gMQotICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCi0gICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IGxpYgkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gLmEJICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0uRU5ESUYKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gd2NjMzg2Ci0gICBDUFAgICAgICAgICAgOj0gd3BwMzg2Ci0gICBDRkxBR1MgICAgICAgOj0gLXpxLWotcy1mcGk4NwotLklGICQoVVNFX05BU00pCi0gICBBUwkJCTo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBvYmogLWRfX0ZMQVRfXyAtZFNURENBTExfTUFOR0xFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0gICBETExfVEFTTSAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteAotICAgRExMX1RBU00gICAgIDo9IHRhc214Ci0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20KLSAgIERMTF9UQVNNICAgICA6PSB0YXNtCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL3ctcmVzIC93LW1jcCAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0gICBHQVMJCQk6PSBnY2MKLSAgIEdBU19GTEFHUyAJOj0gLURfX1dBVENPTUNfXyAtRF9fU1dfM1MgLURfX1NXX1MgLVVfX0dOVUNfXyAtVURKR1BQIC1VX191bml4X18gLVdhbGwgLUkuIC1JJChTQ0lURUNIKVxpbmNsdWRlIC14IGFzc2VtYmxlci13aXRoLWNwcAotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gd2xpbmsKLSAgIExERkxBR1MgICAgICAgPQotLklGICQoVVNFX09TMjMyKQotICAgUkMgICAgICAgICAgIDo9IHJjCi0uRUxTRQotICAgUkMgICAgICAgICAgIDo9IHdyYwotLkVORElGCi0uSUYgJChVU0VfV0lOMzIpCi0gICBSQ0ZMQUdTICAgICAgOj0gLXEgL2J0PW50Ci0uRUxJRiAkKFVTRV9PUzIzMikKLS5JRiAkKFVTRV9PUzJHVUkpCi0gICBDRkxBR1MJCSs9IC1EX19PUzJfUE1fXwotLkVORElGCi0uRUxTRQotICAgUkNGTEFHUyAgICAgIDo9IC1xCi0uRU5ESUYKLSAgIExJQiAgICAgICAgICA6PSB3bGliCi0gICBMSUJGTEFHUyAgICAgOj0gLXEKLSAgIElMSUIgICAgICAgICA6PSB3bGliCi0gICBJTElCRkxBR1MgICAgOj0gLWMKLSAgIElOVEVMX1g4Ngk6PSAxCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAtdzQKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLXcxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uIChDb2RldmlldyBmb3JtYXQpCi0uSUYgJChEQkcpCi0uSUYgJChVU0VfV0lOMzIpCi0uSUYgJChVU0VfQ09ERVZJRVcpCi0gICBDRkxBR1MgICAgICAgKz0gLWQyIC1oYwotICAgTERGTEFHUyAgICAgICs9IEQgQ09ERVZJRVcgT1BUIENWUEFDSwotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtZDIKLSAgIExERkxBR1MJCSs9IEQgQQotLkVORElGCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1kMgotICAgTERGTEFHUwkJKz0gRCBBCi0uRU5ESUYKLSAgIExJQkZMQUdTICAgICArPSAtcD03NjgKLS5JRiAkKFVTRV9OQVNNKQotICAgQVNGTEFHUyAgICAgICs9IC1GIGJvcmxhbmQgLWcKLS5FTFNFCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVNGTEFHUyAgICAgICs9IC9xCQkjIFRBU00zMiBmdWNrcyB1cCBXYXRjb20gQysrIGRlYnVnIGluZm8KLS5FTElGICQoT1MyX1NIRUxMKQotICAgQVNGTEFHUyAgICAgICs9IC9xCQkjIFRBU00gZm9yIE9TLzIgZnVja3MgdXAgV2F0Y29tIEMrKyBkZWJ1ZyBpbmZvCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC96aQotLkVORElGCi0uRU5ESUYKLS5FTFNFCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBudWxsCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ESUYKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucyAod2l0aCBvciB3aXRob3V0IHN0YWNrIGNvbnZlbnRpb25zKQotLklGICQoU1RLQ0FMTCkKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtb25hdHgtNXMtZnA1Ci0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmFzbG1yLTVzLWZwNQotLkVMSUYgJChOT09QVCkKLSAgIENGTEFHUyAgICAgICArPSAtb2QtNXMKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLTNzCi0uRU5ECi0uRUxTRQotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmF0eC01ci1mcDUKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXNsbXItNXItZnA1Ci0uRUxJRiAkKE5PT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vZC01cgotLkVORAotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zIG9wdGltaXNlZCBmb3IgUGVudGl1bQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ECi0KLS5JRiAkKFVTRV9UTlQpICAgICAgICAgICAgICAgICAgIyBVc2UgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyCi0JQ0ZMQUdTICAgICAgICs9IC1idD1udCAtRFROVAotCUFTRkxBR1MgICAJICs9IC1kVE5UCi0JTERGTEFHUyAgICAgICs9IFNZUyBOVCBPUCBTVFVCPUdPVE5ULkVYRQotCUxJQl9PUyAgICAgICA9IERPUzMyCi0uRUxJRiAkKFVTRV9YMzJWTSkgICAgICAgICAgICAgICMgVXNlIEZsYXNoVGVrIFgtMzJWTSBET1MgZXh0ZW5kZXIKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCUxERkxBR1MgICAgICArPSBTWVMgWDMyUlYKLSAgICBEWF9DRkxBR1MgICAgKz0gLURYMzJWTQotCURYX0FTRkxBR1MgICArPSAtZFgzMlZNCi0gICAgTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX1gzMikgICAgICAgICAgICAgICAgIyBVc2UgRmxhc2hUZWsgWC0zMiBET1MgZXh0ZW5kZXIKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCUxERkxBR1MgICAgICArPSBTWVMgWDMyUgotICAgIERYX0NGTEFHUyAgICArPSAtRFgzMlZNCi0JRFhfQVNGTEFHUyAgICs9IC1kWDMyVk0KLSAgICBMSUJfT1MgICAgICAgPSBET1MzMgotLkVMSUYgJChVU0VfUU5YNCkgICAgICAgICAgICAgICAjIEJ1aWxkIFFOWCA0IGFwcAotCUNGTEFHUyAgICAgICArPSAtYnQ9cW54Mzg2Ci0JTERGTEFHUyAgICAgICs9IFNZUyBRTlgzODZGTEFUIE9QIENBU0VFWEFDVCBPUCBPRkZTRVQ9NDBrIE9QIFNUQUNLPTMyawotICAgIENGTEFHUyAgICAJICs9IC1EX19RTlhfXyAtRF9fVU5JWF9fCi0JQVNGTEFHUyAgIAkgKz0gLWRfX1FOWF9fIC1kX19VTklYX18KLSAgICBMSUJfT1MgICAgICAgPSBRTlg0Ci0uRUxJRiAkKFVTRV9PUzIzMikKLS5JRiAkKEJVSUxEX0RMTCkKLQlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW9zMi1zZy1EQlVJTERfRExMCi0JQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotCUNGTEFHUyAgICAgICArPSAtYm0tYnQ9b3MyLXNnCi0uRU5ESUYKLQlEWF9BU0ZMQUdTICAgKz0gLWRfX09TMl9fCi0gICAgTElCX09TICAgICAgID0gb3MyMzIKLS5FTElGICQoVVNFX1NOQVApICAgICAgICAgICAgICAgIyBCdWlsZCAzMiBiaXQgU25hcCBhcHAKLS5JRiAkKEJVSUxEX0RMTCkKLQlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW50LURCVUlMRF9ETEwKLQlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0JQ0ZMQUdTICAgICAgICs9IC1ibS1idD1udC1EX1dJTjMyCi0uRU5ESUYKLQlMREZMQUdTCSAgICAgKz0gT1Agbm9kZWZhdWx0bGlicwotLklGICQoU1RLQ0FMTCkKLQlERUZMSUJTCQkgOj0gY2xpYjNzLmxpYixtYXRoM3MubGliLG5vZW11Mzg3LmxpYiwKLS5FTFNFCi0JREVGTElCUwkJIDo9IGNsaWIzci5saWIsbWF0aDNyLmxpYixub2VtdTM4Ny5saWIsCi0uRU5ESUYKLQlMSUJfT1MgICAgICAgPSBTTkFQCi0uRUxJRiAkKFVTRV9XSU4zMikgICAgICAgICAgICAgICMgQnVpbGQgMzIgYml0IFdpbmRvd3MgTlQgYXBwCi0uSUYgJChXSU4zMl9HVUkpCi0uRUxTRQotICAgIENGTEFHUyAgICAgICArPSAtRF9fQ09OU09MRV9fCi0uRU5ESUYKLS5JRiAkKEJVSUxEX0RMTCkKLQlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW50LXNnLURCVUlMRF9ETEwgLURfV0lOMzIKLQlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0JQ0ZMQUdTICAgICAgICs9IC1ibS1idD1udC1zZy1EX1dJTjMyCi0uRU5ESUYKLQlEWF9BU0ZMQUdTICAgKz0gLWRfX1dJTkRPV1MzMl9fCi0JTElCX09TICAgICAgID0gV0lOMzIKLSAgICBERUZMSUJTCSAgICAgOj0ga2VybmVsMzIubGliLHVzZXIzMi5saWIsZ2RpMzIubGliLGFkdmFwaTMyLmxpYixzaGVsbDMyLmxpYix3aW5tbS5saWIsY29tZGxnMzIubGliLGNvbWN0bDMyLmxpYixvbGUzMi5saWIsb2xlYXV0MzIubGliLHZlcnNpb24ubGliLHdpbnNwb29sLmxpYix1dWlkLmxpYix3c29jazMyLmxpYixycGNydDQubGliLAotLkVMSUYgJChVU0VfV0lOMzg2KSAgICAgICAgICAgICAjIEJ1aWxkIDMyIGJpdCBXaW4zODYgZXh0ZW5kZWQgYXBwCi0uSUYgJChCVUlMRF9ETEwpCi0gICAgQ0ZMQUdTICAgICAgICs9IC1iZC1idD13aW5kb3dzLURCVUlMRF9ETEwKLQlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0gICAgQ0ZMQUdTICAgICAgICs9IC1idD13aW5kb3dzCi0uRU5ESUYKLQlEWF9BU0ZMQUdTICAgKz0gLWRfX1dJTjM4Nl9fCi0gICAgTElCX09TICAgICAgID0gV0lOMzg2Ci0uRUxJRiAkKFVTRV9QTU9ERVcpICAgICAgICAgICAgICMgUE1PREUvVwotCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCi0JVVNFX0RPUzRHVyAgIDo9IDEKLQlVU0VfUkVBTERPUyAgOj0gMQotCUxERkxBR1MgICAgICArPSBTWVMgUE1PREVXCi0JRFhfQ0ZMQUdTICAgICs9IC1ERE9TNEdXCi0JRFhfQVNGTEFHUyAgICs9IC1kRE9TNEdXCi0JTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX0NBVVNFV0FZKSAgICAgICAgICAgIyBDYXVzZXdheQotCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCi0JVVNFX0RPUzRHVyAgIDo9IDEKLQlVU0VfUkVBTERPUyAgOj0gMQotCUxERkxBR1MgICAgICArPSBTWVMgQ0FVU0VXQVkKLQlEWF9DRkxBR1MgICAgKz0gLURET1M0R1cKLQlEWF9BU0ZMQUdTICAgKz0gLWRET1M0R1cKLQlMSUJfT1MgICAgICAgPSBET1MzMgotLkVMSUYgJChVU0VfRE9TMzJBKSAgICAgICAgICAgICAjIERPUzMyL0EKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCVVTRV9ET1M0R1cgICA6PSAxCi0JVVNFX1JFQUxET1MgIDo9IDEKLQlMREZMQUdTICAgICAgKz0gU1lTIERPUzMyQQotCURYX0NGTEFHUyAgICArPSAtRERPUzRHVwotCURYX0FTRkxBR1MgICArPSAtZERPUzRHVwotCUxJQl9PUyAgICAgICA9IERPUzMyCi0uRUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIERPUzRHVwotCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCi0JVVNFX0RPUzRHVyAgIDo9IDEKLQlVU0VfUkVBTERPUyAgOj0gMQotCUxERkxBR1MgICAgICArPSBTWVMgRE9TNEcKLQlEWF9DRkxBR1MgICAgKz0gLURET1M0R1cKLQlEWF9BU0ZMQUdTICAgKz0gLWRET1M0R1cKLQlMSUJfT1MgICAgICAgPSBET1MzMgotLkVORAotCi0jIERpc2FibGUgbGlua2luZyB0byBkZWZhdWx0IEMgcnVudGltZSBsaWJyYXJ5IGFuZCBQTSBsaWJyYXJ5Ci0KLS5JRiAkKE5PX1JVTlRJTUUpCi1MREZMQUdTCQkJICs9IE9QIG5vZGVmYXVsdGxpYnMKLURFRkxJQlMgICAgICAgICAgOj0KLS5FTFNFCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE0gbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfU05BUCkgICAgICAgICAgICAgICAJIyBCdWlsZCAzMiBiaXQgU25hcCBhcHAgb3IgZGxsCi1QTUxJQiAgICAgICAgICAgOj0KLS5FTElGICQoVVNFX1dJTjMyKQotLklGICQoU1RLQ0FMTCkKLVBNTElCICAgICAgICAgICA6PSBzcG0ubGliLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBwbS5saWIsCi0uRU5ESUYKLS5FTElGICQoVVNFX09TMjMyKQotLklGICQoU1RLQ0FMTCkKLS5JRiAkKFVTRV9PUzJHVUkpCi1QTUxJQiAgICAgICAgICAgOj0gc3BtX3BtLmxpYiwKLS5FTFNFCi1QTUxJQiAgICAgICAgICAgOj0gc3BtLmxpYiwKLS5FTkRJRgotLkVMU0UKLS5JRiAkKFVTRV9PUzJHVUkpCi1QTUxJQiAgICAgICAgICAgOj0gcG1fcG0ubGliLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBwbS5saWIsCi0uRU5ESUYKLS5FTkRJRgotLkVMSUYgJChVU0VfUU5YNCkKLS5JRiAkKFNUS0NBTEwpCi1QTUxJQiAgICAgICAgICAgOj0gbGlic3BtLmEsCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IGxpYnBtLmEsCi0uRU5ESUYKLS5FTElGICQoVVNFX1ROVCkKLS5JRiAkKFNUS0NBTEwpCi1QTUxJQiAgICAgICAgICAgOj0gdG50XHNwbS5saWIsCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHRudFxwbS5saWIsCi0uRU5ESUYKLS5FTElGICQoVVNFX1gzMikKLS5JRiAkKFNUS0NBTEwpCi1QTUxJQiAgICAgICAgICAgOj0geDMyXHNwbS5saWIsCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHgzMlxwbS5saWIsCi0uRU5ESUYKLS5FTFNFCi0uSUYgJChTVEtDQUxMKQotUE1MSUIgICAgICAgICAgIDo9IGRvczRnd1xzcG0ubGliLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBkb3M0Z3dccG0ubGliLAotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFdDX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotICAgIExERkxBR1MgKz0gb3AgbWFwCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSB3YzMyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jlc3lzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jlc3lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTJjZTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iZXN5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgQklPUyBlbXVsYXRvciBJL08gYW5kIG1lbW9yeSBhY2Nlc3MKLSogICAgICAgICAgICAgICBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmlvc2VtdWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogTWFjcm9zIHRvIHJlYWQgYW5kIHdyaXRlIHZhbHVlcyB0byB4ODYgYnVzIG1lbW9yeS4gUmVwbGFjZSB0aGVzZSBhcwotICogbmVjZXNzYXJ5IGlmIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIHRvIGFjY2VzcyBtZW1vcnkgb3ZlcgotICogdGhlIGJ1cyBvbiBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yIGZhbWlseS4KLSAqLwotCi0jZGVmaW5lIHJlYWRiKGJhc2Usb2ZmKSAgICAgKigodTgqKSgodTMyKShiYXNlKSArIChvZmYpKSkKLSNkZWZpbmUgcmVhZHcoYmFzZSxvZmYpICAgICAqKCh1MTYqKSgodTMyKShiYXNlKSArIChvZmYpKSkKLSNkZWZpbmUgcmVhZGwoYmFzZSxvZmYpICAgICAqKCh1MzIqKSgodTMyKShiYXNlKSArIChvZmYpKSkKLSNkZWZpbmUgd3JpdGViKHYsYmFzZSxvZmYpICAqKCh1OCopKCh1MzIpKGJhc2UpICsgKG9mZikpKSA9ICh2KQotI2RlZmluZSB3cml0ZXcodixiYXNlLG9mZikgICooKHUxNiopKCh1MzIpKGJhc2UpICsgKG9mZikpKSA9ICh2KQotI2RlZmluZSB3cml0ZWwodixiYXNlLG9mZikgICooKHUzMiopKCh1MzIpKGJhc2UpICsgKG9mZikpKSA9ICh2KQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIERFQlVHX01FTSgpICAgICAgICAoTS54ODYuZGVidWcgJiBERUJVR19NRU1fVFJBQ0VfRikKLSNlbHNlCi0jIGRlZmluZSBERUJVR19NRU0oKQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLQotUkVUVVJOUzoKLUJ5dGUgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KLQotUkVNQVJLUzoKLVJlYWRzIGEgYnl0ZSB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5Ci1yZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBYODZBUEkgQkVfcmRiKAotICAgIHUzMiBhZGRyKQotewotICAgIHU4IHZhbCA9IDA7Ci0KLSAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7Ci0JdmFsID0gKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0JdmFsID0gcmVhZGIoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciAtIDB4QTAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDEpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLQl2YWwgPSAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpOwotCX0KLURCKCBpZiAoREVCVUdfTUVNKCkpCi0JcHJpbnRrKCIlIzA4eCAxIC0+ICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotCi1SRVRVUk5TOgotV29yZCB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgotCi1SRU1BUktTOgotUmVhZHMgYSB3b3JkIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKLXJlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBYODZBUEkgQkVfcmR3KAotICAgIHUzMiBhZGRyKQotewotICAgIHUxNiB2YWwgPSAwOwotCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkgICAgYWRkciAtPSAweEMwMDAwOwotCSAgICB2YWwgPSAoICoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIpIHwKLQkJICAgKCoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gKih1MTYqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgewotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkgICAgYWRkciAtPSAweEEwMDAwOwotCSAgICB2YWwgPSAoIHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIpIHwKLQkJICAgKHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAxKSA8PCA4KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gcmVhZHcoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciAtIDB4QTAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDIpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgIHZhbCA9ICggKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKSB8Ci0JCSAgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gKih1MTYqKShNLm1lbV9iYXNlICsgYWRkcik7Ci0JfQotREIoIGlmIChERUJVR19NRU0oKSkKLQlwcmludGsoIiUjMDh4IDIgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICByZXR1cm4gdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi0KLVJFVFVSTlM6Ci1Mb25nIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1SZWFkcyBhIGxvbmcgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQotcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIFg4NkFQSSBCRV9yZGwoCi0gICAgdTMyIGFkZHIpCi17Ci0gICAgdTMyIHZhbCA9IDA7Ci0KLSAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MykgewotCSAgICBhZGRyIC09IDB4QzAwMDA7Ci0JICAgIHZhbCA9ICggKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciArIDApIHwKLQkJICAgKCoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSB8Ci0JCSAgICgqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyICsgMikgPDwgMTYpIHwKLQkJICAgKCoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAzKSA8PCAyNCkpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHZhbCA9ICoodTMyKikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7Ci0JfQotICAgIGVsc2UgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4RkZGRkYpIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgzKSB7Ci0JICAgIGFkZHIgLT0gMHhBMDAwMDsKLQkgICAgdmFsID0gKCByZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyKSB8Ci0JCSAgIChyZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyICsgMSkgPDwgIDgpIHwKLQkJICAgKHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAyKSA8PCAxNikgfAotCQkgICAocmVhZGIoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDMpIDw8IDI0KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gcmVhZGwoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciAtIDB4QTAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDQpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgzKSB7Ci0JICAgIHZhbCA9ICggKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgfAotCQkgICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPDwgOCkgfAotCQkgICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPDwgMTYpIHwKLQkJICAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpIDw8IDI0KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gKih1MzIqKShNLm1lbV9iYXNlICsgYWRkcik7Ci0JfQotREIoIGlmIChERUJVR19NRU0oKSkKLQlwcmludGsoIiUjMDh4IDQgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICByZXR1cm4gdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi12YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGJ5dGUgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQotcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZBUEkgQkVfd3JiKAotICAgIHUzMiBhZGRyLAotICAgIHU4IHZhbCkKLXsKLURCKCBpZiAoREVCVUdfTUVNKCkpCi0JcHJpbnRrKCIlIzA4eCAxIDwtICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotCSoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKSA9IHZhbDsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgewotCXdyaXRlYih2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUtMSkgewotREIoICAgICBwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotdmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKLXJlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2QVBJIEJFX3dydygKLSAgICB1MzIgYWRkciwKLSAgICB1MTYgdmFsKQotewotREIoIGlmIChERUJVR19NRU0oKSkKLQlwcmludGsoIiUjMDh4IDIgPC0gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCSAgICBhZGRyIC09IDB4QzAwMDA7Ci0JICAgICoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAwKSA9ICh2YWwgPj4gMCkgJiAweGZmOwotCSAgICAqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyICsgMSkgPSAodmFsID4+IDgpICYgMHhmZjsKLQkgICAgfQotCWVsc2UKLSNlbmRpZgotCSAgICAqKHUxNiopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApID0gdmFsOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCSAgICBhZGRyIC09IDB4QTAwMDA7Ci0JICAgIHdyaXRlYih2YWwgPj4gMCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkcik7Ci0JICAgIHdyaXRlYih2YWwgPj4gOCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHdyaXRldyh2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUtMikgewotREIoICAgICBwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApID0gKHZhbCA+PiAwKSAmIDB4ZmY7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgKih1MTYqKShNLm1lbV9iYXNlICsgYWRkcikgPSB2YWw7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi12YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGxvbmcgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQotcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZBUEkgQkVfd3JsKAotICAgIHUzMiBhZGRyLAotICAgIHUzMiB2YWwpCi17Ci1EQiggaWYgKERFQlVHX01FTSgpKQotCXByaW50aygiJSMwOHggNCA8LSAlI3hcbiIsIGFkZHIsIHZhbCk7KQotICAgIGlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgIGFkZHIgLT0gMHhDMDAwMDsKLQkgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgPSAodmFsID4+ICAwKSAmIDB4ZmY7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiAgOCkgJiAweGZmOwotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAyKSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKLQkgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMykgPSAodmFsID4+IDI0KSAmIDB4ZmY7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgKih1MzIqKShNLm1lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApID0gdmFsOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MykgewotCSAgICBhZGRyIC09IDB4QTAwMDA7Ci0JICAgIHdyaXRlYih2YWwgPj4gIDAsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIpOwotCSAgICB3cml0ZWIodmFsID4+ICA4LCBfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyICsgMSk7Ci0JICAgIHdyaXRlYih2YWwgPj4gMTYsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAxKTsKLQkgICAgd3JpdGViKHZhbCA+PiAyNCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHdyaXRlbCh2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUtNCkgewotREIoICAgICBwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApID0gKHZhbCA+PiAgMCkgJiAweGZmOwotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKLQkgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPSAodmFsID4+IDE2KSAmIDB4ZmY7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpID0gKHZhbCA+PiAyNCkgJiAweGZmOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgICoodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOwotCX0KLX0KLQotLyogRGVidWcgZnVuY3Rpb25zIHRvIGRvIElTQS9QQ0kgYnVzIHBvcnQgSS9PICovCi0KLSNpZmRlZiAgREVCVUcKLSNkZWZpbmUgREVCVUdfSU8oKSAgICAgICAgICAoTS54ODYuZGVidWcgJiBERUJVR19JT19UUkFDRV9GKQotCi11OCBYODZBUEkgQkVfaW5iKGludCBwb3J0KQotewotICAgIHU4IHZhbCA9IFBNX2lucGIocG9ydCk7Ci0gICAgaWYgKERFQlVHX0lPKCkpCi0JcHJpbnRrKCIlMDRYOiUwNFg6ICBpbmIuJTA0WCAtPiAlMDJYXG4iLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgKHVzaG9ydClwb3J0LCB2YWwpOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLXUxNiBYODZBUEkgQkVfaW53KGludCBwb3J0KQotewotICAgIHUxNiB2YWwgPSBQTV9pbnB3KHBvcnQpOwotICAgIGlmIChERUJVR19JTygpKQotCXByaW50aygiJTA0WDolMDRYOiAgaW53LiUwNFggLT4gJTA0WFxuIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsICh1c2hvcnQpcG9ydCwgdmFsKTsKLSAgICByZXR1cm4gdmFsOwotfQotCi11MzIgWDg2QVBJIEJFX2lubChpbnQgcG9ydCkKLXsKLSAgICB1MzIgdmFsID0gUE1faW5wZChwb3J0KTsKLSAgICBpZiAoREVCVUdfSU8oKSkKLQlwcmludGsoIiUwNFg6JTA0WDogIGlubC4lMDRYIC0+ICUwOFhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBYODZBUEkgQkVfb3V0YihpbnQgcG9ydCwgdTggdmFsKQotewotICAgIGlmIChERUJVR19JTygpKQotCXByaW50aygiJTA0WDolMDRYOiBvdXRiLiUwNFggPC0gJTAyWFxuIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsICh1c2hvcnQpcG9ydCwgdmFsKTsKLSAgICBQTV9vdXRwYihwb3J0LHZhbCk7Ci19Ci0KLXZvaWQgWDg2QVBJIEJFX291dHcoaW50IHBvcnQsIHUxNiB2YWwpCi17Ci0gICAgaWYgKERFQlVHX0lPKCkpCi0JcHJpbnRrKCIlMDRYOiUwNFg6IG91dHcuJTA0WCA8LSAlMDRYXG4iLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgKHVzaG9ydClwb3J0LCB2YWwpOwotICAgIFBNX291dHB3KHBvcnQsdmFsKTsKLX0KLQotdm9pZCBYODZBUEkgQkVfb3V0bChpbnQgcG9ydCwgdTMyIHZhbCkKLXsKLSAgICBpZiAoREVCVUdfSU8oKSkKLQlwcmludGsoIiUwNFg6JTA0WDogb3V0bC4lMDRYIDwtICUwOFhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7Ci0gICAgUE1fb3V0cGQocG9ydCx2YWwpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY0YTRiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgaW1wbGVtZW50aW5nIHRoZSBCSU9TIHNwZWNpZmljIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiaW9zZW11aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCi0KLVJFTUFSS1M6Ci1IYW5kbGVyIGZvciB1bmRlZmluZWQgaW50ZXJydXB0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBYODZBUEkgdW5kZWZpbmVkX2ludHIoCi0gICAgaW50IGludG5vKQotewotICAgIGlmIChCRV9yZHcoaW50bm8gKiA0ICsgMikgPT0gQklPU19TRUcpCi0JcHJpbnRrKCJiaW9zRW11OiB1bmRlZmluZWQgaW50ZXJydXB0ICV4aCBjYWxsZWQhXG4iLGludG5vKTsKLSAgICBlbHNlCi0JWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50bm8pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgc3lzdGVtIEJJT1MgSW50IDEwaCAodGhlIGRlZmF1bHQgaXMgc3RvcmVkCi1pbiB0aGUgSW50IDQyaCB2ZWN0b3IgYnkgdGhlIHN5c3RlbSBCSU9TIGF0IGJvb3R1cCkuIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUKLWEgc21hbGwgbnVtYmVyIG9mIHNwZWNpYWwgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEJJT1MgZHVyaW5nIFBPU1QgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50NDIoCi0gICAgaW50IGludG5vKQotewotICAgIGlmIChNLng4Ni5SX0FIID09IDB4MTIgJiYgTS54ODYuUl9CTCA9PSAweDMyKSB7Ci0JaWYgKE0ueDg2LlJfQUwgPT0gMCkgewotCSAgICAvKiBFbmFibGUgQ1BVIGFjY2Vzc2VzIHRvIHZpZGVvIG1lbW9yeSAqLwotCSAgICBQTV9vdXRwYigweDNjMiwgUE1faW5wYigweDNjYykgfCAodTgpMHgwMik7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCWVsc2UgaWYgKE0ueDg2LlJfQUwgPT0gMSkgewotCSAgICAvKiBEaXNhYmxlIENQVSBhY2Nlc3NlcyB0byB2aWRlbyBtZW1vcnkgKi8KLQkgICAgUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpICYgKHU4KX4weDAyKTsKLQkgICAgcmV0dXJuOwotCSAgICB9Ci0jaWZkZWYgIERFQlVHCi0JZWxzZSB7Ci0JICAgIHByaW50aygiYmlvc0VtdS9iaW9zLmludDQyOiB1bmtub3duIGZ1bmN0aW9uIEFIPTB4MTIsIEJMPTB4MzIsIEFMPSUjMDJ4XG4iLE0ueDg2LlJfQUwpOwotCSAgICB9Ci0jZW5kaWYKLQl9Ci0jaWZkZWYgIERFQlVHCi0gICAgZWxzZSB7Ci0JcHJpbnRrKCJiaW9zRW11L2Jpb3MuaW50NDI6IHVua25vd24gZnVuY3Rpb24gQUg9JSMwMngsIEFMPSUjMDJ4LCBCTD0lIzAyeFxuIixNLng4Ni5SX0FILCBNLng4Ni5SX0FMLCBNLng4Ni5SX0JMKTsKLQl9Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IHN5c3RlbSBCSU9TIEludCAxMGguIElmIHRoZSBQT1NUIGNvZGUKLWhhcyBub3QgeWV0IHJlLXZlY3RvcmVkIHRoZSBJbnQgMTBoIEJJT1MgaW50ZXJydXB0IHZlY3Rvciwgd2UgaGFuZGxlIHRoaXMKLWJ5IHNpbXBseSBjYWxsaW5nIHRoZSBpbnQ0MiBpbnRlcnJ1cHQgaGFuZGxlciBhYm92ZS4gVmVyeSBlYXJseSBpbiB0aGUKLUJJT1MgUE9TVCBwcm9jZXNzLCB0aGUgdmVjdG9yIGdldHMgcmVwbGFjZWQgYW5kIHdlIHNpbXBseSBsZXQgdGhlIHJlYWwKLW1vZGUgaW50ZXJydXB0IGhhbmRsZXIgcHJvY2VzcyB0aGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQxMCgKLSAgICBpbnQgaW50bm8pCi17Ci0gICAgaWYgKEJFX3JkdyhpbnRubyAqIDQgKyAyKSA9PSBCSU9TX1NFRykKLQlpbnQ0MihpbnRubyk7Ci0gICAgZWxzZQotCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKLX0KLQotLyogUmVzdWx0IGNvZGVzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUyAqLwotCi0jZGVmaW5lIFNVQ0NFU1NGVUwgICAgICAgICAgMHgwMAotI2RlZmluZSBGVU5DX05PVF9TVVBQT1JUICAgIDB4ODEKLSNkZWZpbmUgQkFEX1ZFTkRPUl9JRCAgICAgICAweDgzCi0jZGVmaW5lIERFVklDRV9OT1RfRk9VTkQgICAgMHg4NgotI2RlZmluZSBCQURfUkVHSVNURVJfTlVNQkVSIDB4ODcKLSNkZWZpbmUgU0VUX0ZBSUxFRCAgICAgICAgICAweDg4Ci0jZGVmaW5lIEJVRkZFUl9UT09fU01BTEwgICAgMHg4OQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgSW50IDFBaCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHJlYWwKLW1vZGUgY29kZSwgd2hpY2ggcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFBDSSBCSU9TIGZ1bmN0aW9ucy4gU2luY2Ugd2Ugb25seQotd2FudCB0byBhbGxvdyB0aGUgcmVhbCBtb2RlIEJJT1MgY29kZSAqb25seSogc2VlIHRoZSBQQ0kgY29uZmlnIHNwYWNlIGZvcgotaXRzIG93biBkZXZpY2UsIHdlIG9ubHkgcmV0dXJuIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWMgUENJIGNvbmZpZwotc3BhY2UgdGhhdCB3ZSBoYXZlIHBhc3NlZCBpbiB0byB0aGUgaW5pdCBmdW5jdGlvbi4gVGhpcyBzb2x2ZXMgcHJvYmxlbXMKLXdoZW4gdXNpbmcgdGhlIEJJT1MgdG8gd2FybSBib290IGEgc2Vjb25kYXJ5IGFkYXB0ZXIgd2hlbiB0aGVyZSBpcyBhbgotaWRlbnRpY2FsIGFkYXB0ZXIgYmVmb3JlIGl0IG9uIHRoZSBidXMgKHNvbWUgQklPUydlcyBnZXQgY29uZnVzZWQgaW4gdGhpcwotY2FzZSkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgWDg2QVBJIGludDFBKAotICAgIHVudXNlZCkKLXsKLSAgICB1MTYgcGNpU2xvdDsKLQotICAgIC8qIEZhaWwgaWYgbm8gUENJIGRldmljZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkICovCi0gICAgaWYgKCFfQkVfZW52LnZnYUluZm8ucGNpSW5mbykKLQlyZXR1cm47Ci0gICAgcGNpU2xvdCA9ICh1MTYpKF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5zbG90LmkgPj4gOCk7Ci0gICAgc3dpdGNoIChNLng4Ni5SX0FYKSB7Ci0JY2FzZSAweEIxMDE6ICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgYmlvcyBwcmVzZW50PyAqLwotCSAgICBNLng4Ni5SX0FMICA9IDB4MDA7ICAgICAgICAgLyogbm8gY29uZmlnIHNwYWNlL3NwZWNpYWwgY3ljbGUgZ2VuZXJhdGlvbiBzdXBwb3J0ICovCi0JICAgIE0ueDg2LlJfRURYID0gMHgyMDQ5NDM1MDsgICAvKiAiIElDUCIgKi8KLQkgICAgTS54ODYuUl9CWCAgPSAweDAyMTA7ICAgICAgIC8qIFZlcnNpb24gMi4xMCAqLwotCSAgICBNLng4Ni5SX0NMICA9IDA7ICAgICAgICAgICAgLyogTWF4IGJ1cyBudW1iZXIgaW4gc3lzdGVtICovCi0JICAgIENMRUFSX0ZMQUcoRl9DRik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMHhCMTAyOiAgICAgICAgICAgICAgICAgICAgLyogRmluZCBQQ0kgZGV2aWNlICovCi0JICAgIE0ueDg2LlJfQUggPSBERVZJQ0VfTk9UX0ZPVU5EOwotCSAgICBpZiAoTS54ODYuUl9EWCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+VmVuZG9ySUQgJiYKLQkJICAgIE0ueDg2LlJfQ1ggPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPkRldmljZUlEICYmCi0JCSAgICBNLng4Ni5SX1NJID09IDApIHsKLQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7Ci0JCU0ueDg2LlJfQlggPSBwY2lTbG90OwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMDM6ICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIFBDSSBjbGFzcyBjb2RlICovCi0JICAgIE0ueDg2LlJfQUggPSBERVZJQ0VfTk9UX0ZPVU5EOwotCSAgICBpZiAoTS54ODYuUl9DTCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+SW50ZXJmYWNlICYmCi0JCSAgICBNLng4Ni5SX0NIID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5TdWJDbGFzcyAmJgotCQkgICAgKHU4KShNLng4Ni5SX0VDWCA+PiAxNikgPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPkJhc2VDbGFzcykgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJTS54ODYuUl9CWCA9IHBjaVNsb3Q7Ci0JCX0KLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCSAgICBicmVhazsKLQljYXNlIDB4QjEwODogICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgY29uZmlndXJhdGlvbiBieXRlICovCi0JICAgIE0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOwotCSAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7Ci0JCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOwotCQlNLng4Ni5SX0NMID0gKHU4KVBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwwLFBDSV9SRUFEX0JZVEUsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMDk6ICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGNvbmZpZ3VyYXRpb24gd29yZCAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJTS54ODYuUl9DWCA9ICh1MTYpUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLDAsUENJX1JFQURfV09SRCxfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7Ci0JCX0KLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCSAgICBicmVhazsKLQljYXNlIDB4QjEwQTogICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgY29uZmlndXJhdGlvbiBkd29yZCAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJTS54ODYuUl9FQ1ggPSAodTMyKVBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwwLFBDSV9SRUFEX0RXT1JELF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKLQkJfQotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMHhCMTBCOiAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgY29uZmlndXJhdGlvbiBieXRlICovCi0JICAgIE0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOwotCSAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7Ci0JCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOwotCQlQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksTS54ODYuUl9DTCxQQ0lfV1JJVEVfQllURSxfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7Ci0JCX0KLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCSAgICBicmVhazsKLQljYXNlIDB4QjEwQzogICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGNvbmZpZ3VyYXRpb24gd29yZCAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLE0ueDg2LlJfQ1gsUENJX1dSSVRFX1dPUkQsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMEQ6ICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZSBjb25maWd1cmF0aW9uIGR3b3JkICovCi0JICAgIE0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOwotCSAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7Ci0JCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOwotCQlQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksTS54ODYuUl9FQ1gsUENJX1dSSVRFX0RXT1JELF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKLQkJfQotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIHByaW50aygiYmlvc0VtdS9iaW9zLmludDFhOiB1bmtub3duIGZ1bmN0aW9uIEFYPSUjMDR4XG4iLCBNLng4Ni5SX0FYKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgQklPUyBlbXVsYXRpb24gZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMKLVBDSSBkaXNwbGF5IGRldmljZS4gV2UgaW5zdWxhdGUgdGhlIHJlYWwgbW9kZSBCSU9TIGZyb20gYW55IG90aGVyIGRldmljZXMKLW9uIHRoZSBidXMsIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGNvcnJlY3RseSB0aGlua2luZyB0aGF0IGl0IGlzIHRoZSBvbmx5Ci1kZXZpY2UgcHJlc2VudCBvbiB0aGUgYnVzIChpZTogYXZvaWRpbmcgYW55IGFkYXB0ZXJzIHByZXNlbnQgaW4gZnJvbSBvZgotdGhlIGRldmljZSB3ZSBhcmUgdHJ5aW5nIHRvIGNvbnRyb2wpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0JFX2Jpb3NfaW5pdCgKLSAgICB1MzIgKmludHJUYWIpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIFg4NkVNVV9pbnRyRnVuY3MgICAgYmlvc19pbnRyX3RhYlsyNTZdOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0JaW50clRhYltpXSA9IEJJT1NfU0VHIDw8IDE2OwotCWJpb3NfaW50cl90YWJbaV0gPSB1bmRlZmluZWRfaW50cjsKLQl9Ci0gICAgYmlvc19pbnRyX3RhYlsweDEwXSA9IGludDEwOwotICAgIGJpb3NfaW50cl90YWJbMHgxQV0gPSBpbnQxQTsKLSAgICBiaW9zX2ludHJfdGFiWzB4NDJdID0gaW50NDI7Ci0gICAgWDg2RU1VX3NldHVwSW50ckZ1bmNzKGJpb3NfaW50cl90YWIpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3NlbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MjcwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3NlbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIGltcGxlbWVudGluZyB0aGUgc3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucy4gVGhpcwotKiAgICAgICAgICAgICAgIG1vZHVsZSBpcyBhbHdheXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbiB0aGUgT1MgZGVwZWRlbnQKLSogICAgICAgICAgICAgICBsaWJyYXJpZXMsIGFuZCBuZXZlciBpbiBhIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmlvc2VtdWkuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotQkVfc3lzRW52ICAgICAgICAgICBfQkVfZW52OwotI2lmZGVmICBfX0RSSVZFUl9fCi1QTV9pbXBvcnRzICBfVkFSQVBJIF9QTV9pbXBvcnRzOwotI2VuZGlmCi1zdGF0aWMgWDg2RU1VX21lbUZ1bmNzIF9CRV9tZW0gPSB7Ci0gICAgQkVfcmRiLAotICAgIEJFX3JkdywKLSAgICBCRV9yZGwsCi0gICAgQkVfd3JiLAotICAgIEJFX3dydywKLSAgICBCRV93cmwsCi0gICAgfTsKLSNpZmRlZiAgREVCVUcKLXN0YXRpYyBYODZFTVVfcGlvRnVuY3MgX0JFX3BpbyA9IHsKLSAgICBCRV9pbmIsCi0gICAgQkVfaW53LAotICAgIEJFX2lubCwKLSAgICBCRV9vdXRiLAotICAgIEJFX291dHcsCi0gICAgQkVfb3V0bCwKLSAgICB9OwotI2Vsc2UKLXN0YXRpYyBYODZFTVVfcGlvRnVuY3MgX0JFX3BpbyA9IHsKLSAgICAodm9pZCopUE1faW5wYiwKLSAgICAodm9pZCopUE1faW5wdywKLSAgICAodm9pZCopUE1faW5wZCwKLSAgICAodm9pZCopUE1fb3V0cGIsCi0gICAgKHZvaWQqKVBNX291dHB3LAotICAgICh2b2lkKilQTV9vdXRwZCwKLSAgICB9OwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgT0ZGKGFkZHIpICAgICAgICh1MTYpKCgoYWRkcikgPj4gMCkgJiAweGZmZmYpCi0jZGVmaW5lIFNFRyhhZGRyKSAgICAgICAodTE2KSgoKGFkZHIpID4+IDQpICYgMHhmMDAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWRlYnVnRmxhZ3MgIC0gRmxhZ3MgdG8gZW5hYmxlIGRlYnVnZ2luZyBvcHRpb25zIChkZWJ1ZyBidWlsZHMgb25seSkKLW1lbVNpemUgICAgIC0gQW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgcmVhbCBtb2RlIG1hY2hpbmUKLWluZm8gICAgICAgIC0gUG9pbnRlciB0byBkZWZhdWx0IFZHQSBkZXZpY2UgaW5mb3JtYXRpb24KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIGluaXRpYWxpc2VzIHRoZSBCRWxpYiwgYW5kIHVzZXMgdGhlIHBhc3NlZCBpbgotQklPUyBpbWFnZSBhcyB0aGUgQklPUyB0aGF0IGlzIHVzZWQgYW5kIGVtdWxhdGVkIGF0IDB4QzAwMDAuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgQkVfaW5pdCgKLSAgICB1MzIgZGVidWdGbGFncywKLSAgICBpbnQgbWVtU2l6ZSwKLSAgICBCRV9WR0FJbmZvICppbmZvKQotewotI2lmbmRlZiBfX0RSSVZFUl9fCi0gICAgUE1faW5pdCgpOwotI2VuZGlmCi0gICAgbWVtc2V0KCZNLDAsc2l6ZW9mKE0pKTsKLSAgICBpZiAobWVtU2l6ZSA8IDIwNDgwKQotCVBNX2ZhdGFsRXJyb3IoIkVtdWxhdG9yIHJlcXVpcmVzIGF0IGxlYXN0IDIwS2Igb2YgbWVtb3J5IVxuIik7Ci0gICAgaWYgKChNLm1lbV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpbWFsbG9jKG1lbVNpemUpKSA9PSBOVUxMKQotCVBNX2ZhdGFsRXJyb3IoIk91dCBvZiBtZW1vcnkhIik7Ci0gICAgTS5tZW1fc2l6ZSA9IG1lbVNpemU7Ci0gICAgX0JFX2Vudi5idXNtZW1fYmFzZSA9ICh1bG9uZylQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweDVGRkZGLHRydWUpOwotICAgIE0ueDg2LmRlYnVnID0gZGVidWdGbGFnczsKLSAgICBfQkVfYmlvc19pbml0KCh1MzIqKWluZm8tPkxvd01lbSk7Ci0gICAgWDg2RU1VX3NldHVwTWVtRnVuY3MoJl9CRV9tZW0pOwotICAgIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKCZfQkVfcGlvKTsKLSAgICBCRV9zZXRWR0EoaW5mbyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZGVidWdGbGFncyAgLSBGbGFncyB0byBlbmFibGUgZGVidWdnaW5nIG9wdGlvbnMgKGRlYnVnIGJ1aWxkcyBvbmx5KQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGVuYWJsZSBsb2dnaW5nIGFuZCBkZWJ1ZyBmbGFncwotb24gYSBmdW5jdGlvbiBjYWxsIGJhc2lzLCBzbyB3ZSBjYW4gc3BlY2lmaWNhbGx5IGVuYWJsZSBsb2dnaW5nIG9ubHkKLWZvciBzcGVjaWZpYyBmdW5jdGlvbnMgdGhhdCBhcmUgY2F1c2luZyBwcm9ibGVtcyBpbiBkZWJ1ZyBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgQkVfc2V0RGVidWdGbGFncygKLSAgICB1MzIgZGVidWdGbGFncykKLXsKLSAgICBNLng4Ni5kZWJ1ZyA9IGRlYnVnRmxhZ3M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBQb2ludGVyIHRvIFZHQSBkZXZpY2UgaW5mb3JtYXRpb24gdG8gbWFrZSBjdXJyZW50Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHNldHMgdGhlIFZHQSBCSU9TIGZ1bmN0aW9ucyBpbiB0aGUgZW11bGF0b3IgdG8gcG9pbnQgdG8gdGhlCi1zcGVjaWZpYyBWR0EgQklPUyBpbiB1c2UuIFRoaXMgaW5jbHVkZXMgc3dhcHBpbmcgdGhlIEJJT1MgaW50ZXJydXB0Ci12ZWN0b3JzLCBCSU9TIGltYWdlIGFuZCBCSU9TIGRhdGEgYXJlYSB0byB0aGUgbmV3IEJJT1MuIFRoaXMgYWxsb3dzIHRoZQotcmVhbCBtb2RlIEJJT1MgdG8gYmUgc3dhcHBlZCB3aXRob3V0IHJlc2V0dGluZyB0aGUgZW50aXJlIGVtdWxhdG9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgQkVfc2V0VkdBKAotICAgIEJFX1ZHQUluZm8gKmluZm8pCi17Ci0gICAgX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8gPSBpbmZvLT5wY2lJbmZvOwotICAgIF9CRV9lbnYudmdhSW5mby5CSU9TSW1hZ2UgPSBpbmZvLT5CSU9TSW1hZ2U7Ci0gICAgaWYgKGluZm8tPkJJT1NJbWFnZSkgewotCV9CRV9lbnYuYmlvc21lbV9iYXNlID0gKHVsb25nKWluZm8tPkJJT1NJbWFnZTsKLQlfQkVfZW52LmJpb3NtZW1fbGltaXQgPSAweEMwMDAwICsgaW5mby0+QklPU0ltYWdlTGVuLTE7Ci0JfQotICAgIGVsc2UgewotCV9CRV9lbnYuYmlvc21lbV9iYXNlID0gX0JFX2Vudi5idXNtZW1fYmFzZSArIDB4MjAwMDA7Ci0JX0JFX2Vudi5iaW9zbWVtX2xpbWl0ID0gMHhDN0ZGRjsKLQl9Ci0gICAgaWYgKCooKHUzMiopaW5mby0+TG93TWVtKSA9PSAwKQotCV9CRV9iaW9zX2luaXQoKHUzMiopaW5mby0+TG93TWVtKTsKLSAgICBtZW1jcHkoKHU4KilNLm1lbV9iYXNlLGluZm8tPkxvd01lbSxzaXplb2YoaW5mby0+TG93TWVtKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBQb2ludGVyIHRvIFZHQSBkZXZpY2UgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgY3VycmVudAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBWR0EgQklPUyBmdW5jdGlvbnMgY3VycmVudGx5IGFjdGl2ZSBpbiB0aGUKLWVtdWxhdG9yLCBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZCBhdCBhIGxhdGVyIGRhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBCRV9nZXRWR0EoCi0gICAgQkVfVkdBSW5mbyAqaW5mbykKLXsKLSAgICBpbmZvLT5wY2lJbmZvID0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm87Ci0gICAgaW5mby0+QklPU0ltYWdlID0gX0JFX2Vudi52Z2FJbmZvLkJJT1NJbWFnZTsKLSAgICBtZW1jcHkoaW5mby0+TG93TWVtLCh1OCopTS5tZW1fYmFzZSxzaXplb2YoaW5mby0+TG93TWVtKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcl9zZWcgICAtIFNlZ21lbnQgZm9yIHBvaW50ZXIgdG8gY29udmVydAotcl9vZmYgICAtIE9mZnNldCBmb3IgcG9pbnRlciB0byBjb252ZXJ0Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIG1hcHMgYSByZWFsIG1vZGUgcG9pbnRlciBpbiB0aGUgZW11bGF0b3IgbWVtb3J5IHRvIGEgcHJvdGVjdGVkCi1tb2RlIHBvaW50ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXJlY3RseSBhY2Nlc3MgdGhlIG1lbW9yeS4KLQotTk9URTogICBUaGUgbWVtb3J5IGlzICphbHdheXMqIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzb24gb24gbm9uLXg4NgotCXN5c3RlbXMgeW91IHdpbGwgbmVlZCB0byBkbyBlbmRpYW4gdHJhbnNsYXRpb25zIHRvIGFjY2VzcyB0aGlzCi0JbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBCRV9tYXBSZWFsUG9pbnRlcigKLSAgICB1aW50IHJfc2VnLAotICAgIHVpbnQgcl9vZmYpCi17Ci0gICAgdTMyIGFkZHIgPSAoKHUzMilyX3NlZyA8PCA0KSArIHJfb2ZmOwotCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotCXJldHVybiAodm9pZCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0JcmV0dXJuICh2b2lkKikoX0JFX2Vudi5idXNtZW1fYmFzZSArIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgcmV0dXJuICh2b2lkKikoTS5tZW1fYmFzZSArIGFkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWxlbiAgICAgLSBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgVkVTQSBidWZmZXIKLXJzZWcgICAgLSBQbGFjZSB0byBzdG9yZSBWRVNBIGJ1ZmZlciBzZWdtZW50Ci1yb2ZmICAgIC0gUGxhY2UgdG8gc3RvcmUgVkVTQSBidWZmZXIgb2Zmc2V0Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGluIHJlYWwKLW1vZGUgZW11bGF0b3IgbWVtb3J5LiBUaGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgaXMgYWx3YXlzIDEwMjQgYnl0ZXMgbG9uZywKLWFuZCBsb2NhdGVkIGF0IDE1S2IgaW50byB0aGUgc3RhcnQgb2YgdGhlIHJlYWwgbW9kZSBtZW1vcnkgKDE2S2IgaXMgd2hlcmUKLXdlIHB1dCB0aGUgcmVhbCBtb2RlIGNvZGUgd2UgZXhlY3V0ZSBmb3IgaXNzdWluZyBpbnRlcnJ1cHRzKS4KLQotTk9URTogICBUaGUgbWVtb3J5IGlzICphbHdheXMqIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzb24gb24gbm9uLXg4NgotCXN5c3RlbXMgeW91IHdpbGwgbmVlZCB0byBkbyBlbmRpYW4gdHJhbnNsYXRpb25zIHRvIGFjY2VzcyB0aGlzCi0JbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBCRV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgKmxlbiA9IDEwMjQ7Ci0gICAgKnJzZWcgPSBTRUcoMHgwM0MwMCk7Ci0gICAgKnJvZmYgPSBPRkYoMHgwM0MwMCk7Ci0gICAgcmV0dXJuICh2b2lkKikoTS5tZW1fYmFzZSArICgodTMyKSpyc2VnIDw8IDQpICsgKnJvZmYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNsZWFucyB1cCBhbmQgZXhpdHMgdGhlIGVtdWxhdG9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgQkVfZXhpdCh2b2lkKQotewotICAgIGZyZWUoKHZvaWQqKU0ubWVtX2Jhc2UpOwotICAgIFBNX2ZyZWVQaHlzaWNhbEFkZHIoKHZvaWQqKV9CRV9lbnYuYnVzbWVtX2Jhc2UsMHg1RkZGRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2VnICAgICAtIFNlZ21lbnQgb2YgY29kZSB0byBjYWxsCi1vZmYgICAgIC0gT2Zmc2V0IG9mIGNvZGUgdG8gY2FsbAotcmVncyAgICAtIFJlYWwgbW9kZSByZWdpc3RlcnMgdG8gbG9hZAotc3JlZ3MgICAtIFJlYWwgbW9kZSBzZWdtZW50IHJlZ2lzdGVycyB0byBsb2FkCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAotYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KLU9uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiB0aGUgc2FtZQotc3RydWN0dXJlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIEJFX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKnJlZ3MsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgTS54ODYuUl9FQVggPSByZWdzLT5lLmVheDsKLSAgICBNLng4Ni5SX0VCWCA9IHJlZ3MtPmUuZWJ4OwotICAgIE0ueDg2LlJfRUNYID0gcmVncy0+ZS5lY3g7Ci0gICAgTS54ODYuUl9FRFggPSByZWdzLT5lLmVkeDsKLSAgICBNLng4Ni5SX0VTSSA9IHJlZ3MtPmUuZXNpOwotICAgIE0ueDg2LlJfRURJID0gcmVncy0+ZS5lZGk7Ci0gICAgTS54ODYuUl9EUyA9IHNyZWdzLT5kczsKLSAgICBNLng4Ni5SX0VTID0gc3JlZ3MtPmVzOwotICAgIE0ueDg2LlJfRlMgPSBzcmVncy0+ZnM7Ci0gICAgTS54ODYuUl9HUyA9IHNyZWdzLT5nczsKLSAgICBNLng4Ni5SX0NTID0gKHUxNilzZWc7Ci0gICAgTS54ODYuUl9JUCA9ICh1MTYpb2ZmOwotICAgIE0ueDg2LlJfU1MgPSBTRUcoTS5tZW1fc2l6ZSAtIDEpOwotICAgIE0ueDg2LlJfU1AgPSBPRkYoTS5tZW1fc2l6ZSAtIDEpOwotICAgIFg4NkVNVV9leGVjKCk7Ci0gICAgcmVncy0+ZS5jZmxhZyA9IE0ueDg2LlJfRUZMRyAmIEZfQ0Y7Ci0gICAgcmVncy0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKLSAgICByZWdzLT5lLmVieCA9IE0ueDg2LlJfRUJYOwotICAgIHJlZ3MtPmUuZWN4ID0gTS54ODYuUl9FQ1g7Ci0gICAgcmVncy0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKLSAgICByZWdzLT5lLmVzaSA9IE0ueDg2LlJfRVNJOwotICAgIHJlZ3MtPmUuZWRpID0gTS54ODYuUl9FREk7Ci0gICAgc3JlZ3MtPmRzID0gTS54ODYuUl9EUzsKLSAgICBzcmVncy0+ZXMgPSBNLng4Ni5SX0VTOwotICAgIHNyZWdzLT5mcyA9IE0ueDg2LlJfRlM7Ci0gICAgc3JlZ3MtPmdzID0gTS54ODYuUl9HUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciB0byBleGVjdXRlCi1pbiAgICAgIC0gUmVhbCBtb2RlIHJlZ2lzdGVycyB0byBsb2FkCi1vdXQgICAgIC0gUGxhY2UgdG8gc3RvcmUgcmVzdWx0aW5nIHJlYWwgbW9kZSByZWdpc3RlcnMKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIGNhbGxzIGEgcmVhbCBtb2RlIGludGVycnVwdCBmdW5jdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MsCi1hbmQgbG9hZHMgYWxsIHRoZSB4ODYgcmVnaXN0ZXJzIGZyb20gdGhlIHBhc3NlZCBpbiByZWdpc3RlcnMgc3RydWN0dXJlLgotT24gZXhpdCB0aGUgcmVnaXN0ZXJzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgYXJlIHJldHVybmVkIGluIG91dCBzdHVjdHVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgQkVfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgTS54ODYuUl9FQVggPSBpbi0+ZS5lYXg7Ci0gICAgTS54ODYuUl9FQlggPSBpbi0+ZS5lYng7Ci0gICAgTS54ODYuUl9FQ1ggPSBpbi0+ZS5lY3g7Ci0gICAgTS54ODYuUl9FRFggPSBpbi0+ZS5lZHg7Ci0gICAgTS54ODYuUl9FU0kgPSBpbi0+ZS5lc2k7Ci0gICAgTS54ODYuUl9FREkgPSBpbi0+ZS5lZGk7Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAwXSA9IDB4Q0Q7Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAxXSA9ICh1OClpbnRubzsKLSAgICAoKHU4KilNLm1lbV9iYXNlKVsweDQwMDJdID0gMHhDMzsKLSAgICBNLng4Ni5SX0NTID0gU0VHKDB4MDQwMDApOwotICAgIE0ueDg2LlJfSVAgPSBPRkYoMHgwNDAwMCk7Ci0gICAgTS54ODYuUl9TUyA9IFNFRyhNLm1lbV9zaXplIC0gMSk7Ci0gICAgTS54ODYuUl9TUCA9IE9GRihNLm1lbV9zaXplIC0gMSk7Ci0gICAgWDg2RU1VX2V4ZWMoKTsKLSAgICBvdXQtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOwotICAgIG91dC0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKLSAgICBvdXQtPmUuZWJ4ID0gTS54ODYuUl9FQlg7Ci0gICAgb3V0LT5lLmVjeCA9IE0ueDg2LlJfRUNYOwotICAgIG91dC0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKLSAgICBvdXQtPmUuZXNpID0gTS54ODYuUl9FU0k7Ci0gICAgb3V0LT5lLmVkaSA9IE0ueDg2LlJfRURJOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW50bm8gICAtIEludGVycnVwdCBudW1iZXIgdG8gZXhlY3V0ZQotaW4gICAgICAtIFJlYWwgbW9kZSByZWdpc3RlcnMgdG8gbG9hZAotb3V0ICAgICAtIFBsYWNlIHRvIHN0b3JlIHJlc3VsdGluZyByZWFsIG1vZGUgcmVnaXN0ZXJzCi1zcmVncyAgIC0gUmVhbCBtb2RlIHNlZ21lbnQgcmVnaXN0ZXJzIHRvIGxvYWQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIGNhbGxzIGEgcmVhbCBtb2RlIGludGVycnVwdCBmdW5jdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MsCi1hbmQgbG9hZHMgYWxsIHRoZSB4ODYgcmVnaXN0ZXJzIGZyb20gdGhlIHBhc3NlZCBpbiByZWdpc3RlcnMgc3RydWN0dXJlLgotT24gZXhpdCB0aGUgcmVnaXN0ZXJzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgYXJlIHJldHVybmVkIGluIG91dCBzdHVjdHVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgQkVfaW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIE0ueDg2LlJfRUFYID0gaW4tPmUuZWF4OwotICAgIE0ueDg2LlJfRUJYID0gaW4tPmUuZWJ4OwotICAgIE0ueDg2LlJfRUNYID0gaW4tPmUuZWN4OwotICAgIE0ueDg2LlJfRURYID0gaW4tPmUuZWR4OwotICAgIE0ueDg2LlJfRVNJID0gaW4tPmUuZXNpOwotICAgIE0ueDg2LlJfRURJID0gaW4tPmUuZWRpOwotICAgIE0ueDg2LlJfRFMgPSBzcmVncy0+ZHM7Ci0gICAgTS54ODYuUl9FUyA9IHNyZWdzLT5lczsKLSAgICBNLng4Ni5SX0ZTID0gc3JlZ3MtPmZzOwotICAgIE0ueDg2LlJfR1MgPSBzcmVncy0+Z3M7Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAwXSA9IDB4Q0Q7Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAxXSA9ICh1OClpbnRubzsKLSAgICAoKHU4KilNLm1lbV9iYXNlKVsweDQwMDJdID0gMHhDMzsKLSAgICBNLng4Ni5SX0NTID0gU0VHKDB4MDQwMDApOwotICAgIE0ueDg2LlJfSVAgPSBPRkYoMHgwNDAwMCk7Ci0gICAgTS54ODYuUl9TUyA9IFNFRyhNLm1lbV9zaXplIC0gMSk7Ci0gICAgTS54ODYuUl9TUCA9IE9GRihNLm1lbV9zaXplIC0gMSk7Ci0gICAgWDg2RU1VX2V4ZWMoKTsKLSAgICBvdXQtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOwotICAgIG91dC0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKLSAgICBvdXQtPmUuZWJ4ID0gTS54ODYuUl9FQlg7Ci0gICAgb3V0LT5lLmVjeCA9IE0ueDg2LlJfRUNYOwotICAgIG91dC0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKLSAgICBvdXQtPmUuZXNpID0gTS54ODYuUl9FU0k7Ci0gICAgb3V0LT5lLmVkaSA9IE0ueDg2LlJfRURJOwotICAgIHNyZWdzLT5kcyA9IE0ueDg2LlJfRFM7Ci0gICAgc3JlZ3MtPmVzID0gTS54ODYuUl9FUzsKLSAgICBzcmVncy0+ZnMgPSBNLng4Ni5SX0ZTOwotICAgIHNyZWdzLT5ncyA9IE0ueDg2LlJfR1M7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotI2lmZGVmICBfX0RSSVZFUl9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW1wdHkgbG9nIGZ1bmN0aW9uIGZvciBiaW5hcnkgcG9ydGFibGUgRExMLiBUaGUgQlBEIGlzIGNvbXBpbGVkIHdpdGhvdXQKLWRlYnVnIGluZm9ybWF0aW9uLCBzbyB2ZXJ5IGxpdHRsZSBpcyBsb2dnZWQgYW55d2F5IHNvIGl0IGlzIHNpbXBsZXIgdGhpcwotd2F5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcHJpbnRrKGNvbnN0IGNoYXIgKm1zZywgLi4uKQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZhdGFsIGVycm9yIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBub24taW1wb3J0ZWQgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZQotZHJpdmVyLiBXZSBsZWF2ZSB0aGlzIHRvIGEgcnVudGltZSBlcnJvciBzbyB0aGF0IG9sZGVyIGFwcGxpY2F0aW9ucyBhbmQKLXNoZWxsIGRyaXZlcnMgd2lsbCB3b3JrIHdpdGggbmV3ZXIgYnBkIGRyaXZlcnMgcHJvdmlkZWQgbm8gbmV3ZXIgZnVuY3Rpb25zCi1hcmUgcmVxdWlyZWQgYnkgdGhlIGRyaXZlciBpdHNlbGYuIElmIHRoZXkgYXJlLCB0aGUgYXBwbGljYXRpb24gb3Igc2hlbGwKLWRyaXZlciBuZWVkcyB0byBiZSByZWNvbXBpbGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9QTV9mYXRhbEVycm9ySGFuZGxlcih2b2lkKQotewotICAgIFBNX2ZhdGFsRXJyb3IoIlVuc3VwcG9ydGVkIFBNX2ltcG9ydHMgaW1wb3J0IGZ1bmN0aW9uIGNhbGxlZCEgUGxlYXNlIHJlLWNvbXBpbGUhXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iZUltcCAgIC0gQkUgbGlicmFyeSBpbXBvcnRzCi1iZUltcCAgIC0gR2VuZXJpYyBlbXVsYXRvciBpbXBvcnRzCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIGV4cG9ydGVkIGZ1bmN0aW9uIGxpc3QKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIEJJT1MgZW11bGF0b3IgbGlicmFyeSBhbmQgcmV0dXJucyB0aGUgbGlzdCBvZgotbG9hZGVyIGxpYnJhcnkgZXhwb3J0ZWQgZnVuY3Rpb25zLgote3NlY3JldH0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CRV9leHBvcnRzICogX0NFWFBPUlQgQkVfaW5pdExpYnJhcnkoCi0gICAgUE1faW1wb3J0cyAqcG1JbXApCi17Ci0gICAgc3RhdGljIEJFX2V4cG9ydHMgX0JFX2V4cG9ydHMgPSB7Ci0Jc2l6ZW9mKEJFX2V4cG9ydHMpLAotCUJFX2luaXQsCi0JQkVfc2V0VkdBLAotCUJFX2dldFZHQSwKLQlCRV9tYXBSZWFsUG9pbnRlciwKLQlCRV9nZXRWRVNBQnVmLAotCUJFX2NhbGxSZWFsTW9kZSwKLQlCRV9pbnQ4NiwKLQlCRV9pbnQ4NngsCi0JTlVMTCwKLQlCRV9leGl0LAotCX07Ci0gICAgaW50ICAgICBpLG1heDsKLSAgICB1bG9uZyAgICpwOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbGwgZGVmYXVsdCBpbXBvcnRzIHRvIHBvaW50IHRvIGZhdGFsIGVycm9yIGhhbmRsZXIgKi8KLSAgICAvKiBmb3IgdXB3YXJkcyBjb21wYXRpYmlsaXR5LiAqLwotICAgIG1heCA9IHNpemVvZihfUE1faW1wb3J0cykvc2l6ZW9mKEJFX2luaXRMaWJyYXJ5X3QpOwotICAgIGZvciAoaSA9IDAscCA9ICh1bG9uZyopJl9QTV9pbXBvcnRzOyBpIDwgbWF4OyBpKyspCi0JKnArKyA9ICh1bG9uZylfUE1fZmF0YWxFcnJvckhhbmRsZXI7Ci0KLSAgICAvKiBOb3cgY29weSBhbGwgb3VyIGltcG9ydGVkIGZ1bmN0aW9ucyAqLwotICAgIG1lbWNweSgmX1BNX2ltcG9ydHMscG1JbXAsTUlOKHNpemVvZihfUE1faW1wb3J0cykscG1JbXAtPmR3U2l6ZSkpOwotICAgIHJldHVybiAmX0JFX2V4cG9ydHM7Ci19Ci0KLSNlbmRpZiAgLyogX19EUklWRVJfXyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11aS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2VkZWJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvc2VtdWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBJbnRlcm5hbCBoZWFkZXIgZmlsZSBmb3IgdGhlIEJJT1MgZW11bGF0b3IgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19CSU9TRU1VSV9ICi0jZGVmaW5lIF9fQklPU0VNVUlfSAotCi0jaW5jbHVkZSA8Ymlvc2VtdS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgREIoeCkgICB4Ci0jZWxzZQotI2RlZmluZSBEQih4KQotI2VuZGlmCi0KLSNkZWZpbmUgQklPU19TRUcgICAgICAgIDB4ZmZmMAotCi0jZGVmaW5lIE0gICAgICAgICAgICAgICBfWDg2RU1VX2VudgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBiaW9zLmMgKi8KLQotdm9pZCAgICBfQkVfYmlvc19pbml0KHUzMiAqaW50clRhYik7Ci12b2lkICAgIF9CRV9zZXR1cF9mdW5jcyh2b2lkKTsKLQotLyogYmVzeXMuYyAqLwotCi11OCAgICAgIFg4NkFQSSBCRV9yZGIodTMyIGFkZHIpOwotdTE2ICAgICBYODZBUEkgQkVfcmR3KHUzMiBhZGRyKTsKLXUzMiAgICAgWDg2QVBJIEJFX3JkbCh1MzIgYWRkcik7Ci12b2lkICAgIFg4NkFQSSBCRV93cmIodTMyIGFkZHIsdTggdmFsKTsKLXZvaWQgICAgWDg2QVBJIEJFX3dydyh1MzIgYWRkcix1MTYgdmFsKTsKLXZvaWQgICAgWDg2QVBJIEJFX3dybCh1MzIgYWRkcix1MzIgdmFsKTsKLSNpZmRlZiAgREVCVUcKLXU4ICAgICAgWDg2QVBJIEJFX2luYihpbnQgcG9ydCk7Ci11MTYgICAgIFg4NkFQSSBCRV9pbncoaW50IHBvcnQpOwotdTMyICAgICBYODZBUEkgQkVfaW5sKGludCBwb3J0KTsKLXZvaWQgICAgWDg2QVBJIEJFX291dGIoaW50IHBvcnQsIHU4IHZhbCk7Ci12b2lkICAgIFg4NkFQSSBCRV9vdXR3KGludCBwb3J0LCB1MTYgdmFsKTsKLXZvaWQgICAgWDg2QVBJIEJFX291dGwoaW50IHBvcnQsIHUzMiB2YWwpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0JJT1NFTVVJX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDczMGIyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotIyAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotIwotIyAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSMgIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSMgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSMgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotIyAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotIyAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotIyAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSMgIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0jICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0jICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0jICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotIyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotIyAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0jICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0jICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LiBSZXF1aXJlcwotIyAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFNvZnR3YXJlIG1ha2VmaWxlIGRlZmluaXRpb25zIHBhY2thZ2UgdG8gYmUKLSMgICAgICAgICAgICAgICBpbnN0YWxsZWQsIHdoaWNoIHVzZXMgdGhlIERNQUtFIG1ha2UgcHJvZ3JhbS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLS5JTVBPUlQgLklHTk9SRTogREVCVUcKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIHRoZSBsaXN0cyBvZiBvYmplY3QgZmlsZXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURMTF9PQkpTICAgICAgICA9IGRsbHN0YXJ0JE8gX3BtX2ltcCRPCi1CSU9TX09CSlMgICAgICAgPSBiaW9zZW11JE8gYmlvcyRPIGJlc3lzJE8KLVg4Nl9PQkpTICAgICAgICA9IHN5cyRPIGRlY29kZSRPIG9wcyRPIG9wczIkTyBwcmltX29wcyRPIGZwdSRPIGRlYnVnJE8KLUNGTEFHUyAgICAgICAgICArPSAtRFNDSVRFQ0ggLUkkKFNDSVRFQ0gpXHNyY1x4ODZlbXUKLQotLklGICQoQlVJTERfRExMKQotCi1DRkxBR1MgICAgICAgICAgKz0gLUkkKFBSSVZBVEUpXGluY2x1ZGVcZHJ2bGliIC1JJChTQ0lURUNIKVxpbmNsdWRlXGRydmxpYiAtRF9fRFJJVkVSX18KLUFTRkxBR1MgICAgICAgICArPSAtZF9fRFJJVkVSX18KLUVYRUxJQlMgICAgICAgICA9IGRydmxpYiRMCi0KLS5FTFNFCi0KLS5JRiAkKERFQlVHKQotQ0ZMQUdTICAgICAgICAgICs9IC1EREVCVUcKLS5FTkRJRgotT0JKRUNUUyAgICAgICAgID0gJChCSU9TX09CSlMpICQoWDg2X09CSlMpCi1MSUJDTEVBTiAgICAgICAgPSAqLmRsbCAqLmxpYiAqLmEKLUxJQkZJTEUgICAgICAgICA9ICQoTFApYmlvc2VtdSRMCi0KLS5FTkRJRgotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTYW1wbGUgdGVzdCBwcm9ncmFtcwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsOiAkKExJQkZJTEUpIHdhcm1ib290JEUKLQotd2FybWJvb3QkRTogd2FybWJvb3QkTyAkKExJQkZJTEUpCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRhcmdldCB0byBidWlsZCB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCB0YXJnZXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWJpb3NlbXUuZGxsOiAkKERMTF9PQkpTKSAkKEJJT1NfT0JKUykgJChYODZfT0JKUykKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGFyZ2V0IHRvIGJ1aWxkIGFsbCBJbnRlbCBiaW5hcnkgZHJpdmVycwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLlBIT05ZIG1rZHJ2OgotICAgIEBidWlsZCB3YzExLXczMiBiaW9zZW11LmRsbCAtdSBCVUlMRF9ETEw9MSBOT19SVU5USU1FPTEgT1BUPTEKLSAgICBAJChDUCkgYmlvc2VtdS5kbGwgJChQUklWQVRFKVxudWNsZXVzXGdyYXBoaWNzXGJpb3NlbXUuYnBkCi0gICAgQGRtYWtlIGNsZWFuZXhlCi0KLS5QSE9OWSBkYjoKLSAgICBAYnVpbGQgd2MxMS13MzIgYmlvc2VtdS5kbGwgQlVJTERfRExMPTEgTk9fUlVOVElNRT0xIE9QVD0xCi0gICAgQCQoQ1ApIGJpb3NlbXUuZGxsICQoUFJJVkFURSlcbnVjbGV1c1xncmFwaGljc1xiaW9zZW11LmJwZAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHRvIGNyZWF0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvcgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotREVQRU5EX09CSiAgICAgID0gd2FybWJvb3QkTyAkKEJJT1NfT0JKUykgJChYODZfT0JKUykgJChETExfT0JKUykKLURFUEVORF9TUkMgICAgICA9ICQoU0NJVEVDSCkvc3JjL3g4NmVtdTskKFBSSVZBVEUpL3NyYy9jb21tb24KLS5TT1VSQ0U6ICAgICAgICAgICQoU0NJVEVDSCkvc3JjL3g4NmVtdSAkKFBSSVZBVEUpL3NyYy9jb21tb24KLQotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL2NvbW1vbi5tayIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUuY3Jvc3MgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlLmNyb3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQxMDAzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUuY3Jvc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1DQyA9IHBwYy1lbGYzMi1nY2MKLUFSID0gcHBjLWVsZjMyLWFyCi0KLUNGTEFHUyA9IC1EX19EUklWRVJfXyAtSS4uLy4uL2luY2x1ZGUgLURERUJVRyAtSS4KLQotQklPU19PQkpTID0gYmlvc2VtdS5vIGJpb3MubyBiZXN5cy5vCi1YODZfT0JKUyA9IHN5cy5vIGRlY29kZS5vIG9wcy5vIHByaW1fb3BzLm8gZnB1Lm8gZGVidWcubwotCi1saWJiaW9zLmE6ICQoQklPU19PQkpTKQotCSQoQVIpIHJjcyBsaWJiaW9zLmEgJChCSU9TX09CSlMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS93YXJtYm9vdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS93YXJtYm9vdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ1ZmI4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvd2FybWJvb3QuYworKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCB3YXJtIGJvb3Rpbmcgb2YgYWxsIFBDSS9BR1AgY29udHJvbGxlcnMKLSogICAgICAgICAgICAgICBvbiB0aGUgYnVzLiBXZSB1c2UgdGhlIHg4NiByZWFsIG1vZGUgZW11bGF0b3IgdG8gcnVuIHRoZQotKiAgICAgICAgICAgICAgIEJJT1Mgb24gdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjb250cm9sbGVycyB0byBicmluZwotKiAgICAgICAgICAgICAgIHRoZSBjYXJkcyB1cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgImJpb3NlbXUuaCIKLSNpZm5kZWYgX01BWF9QQVRICi0jZGVmaW5lIF9NQVhfUEFUSCAyNTYKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgUENJRGV2aWNlSW5mbyAgICBQQ0lbTUFYX1BDSV9ERVZJQ0VTXTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bVBDSSA9IC0xOwotc3RhdGljIGludCAgICAgICAgICAgICAgQnJpZGdlSW5kZXhbTUFYX1BDSV9ERVZJQ0VTXSA9IHswfTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bUJyaWRnZXM7Ci1zdGF0aWMgUENJQnJpZGdlSW5mbyAgICAqQUdQQnJpZGdlID0gTlVMTDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIERldmljZUluZGV4W01BWF9QQ0lfREVWSUNFU10gPSB7MH07Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1EZXZpY2VzOwotc3RhdGljIHUzMiAgICAgICAgICAgICAgZGVidWdGbGFncyA9IDA7Ci1zdGF0aWMgQkVfVkdBSW5mbyAgICAgICBWR0FJbmZvW01BWF9QQ0lfREVWSUNFU10gPSB7ezB9fTsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIHVzZVY4NiA9IGZhbHNlOwotc3RhdGljIGlib29sICAgICAgICAgICAgZm9yY2VQb3N0ID0gZmFsc2U7Ci0KLS8qIExlbmd0aCBvZiB0aGUgQklPUyBpbWFnZSAqLwotCi0jZGVmaW5lIE1BWF9CSU9TTEVOICAgICAgICAgKDY0ICogMTAyNEwpCi0jZGVmaW5lIEZJTkFMX0JJT1NMRU4gICAgICAgKDMyICogMTAyNEwpCi0KLS8qIE1hY3JvIHRvIGRldGVybWluZSBpZiB0aGUgVkdBIGlzIGVuYWJsZWQgYW5kIHJlc3BvbmRpbmcgKi8KLQotI2RlZmluZSBWR0FfTk9UX0FDVElWRSgpICAgIChmb3JjZVBvc3QgfHwgKFBNX2lucGIoMHgzQ0MpID09IDB4RkYpIHx8ICgoUE1faW5wYigweDNDQykgJiAweDIpID09IDApKQotCi0jZGVmaW5lIEVOQUJMRV9ERVZJQ0UoZGV2aWNlKSAgIFwKLSAgICBQQ0lfd3JpdGVQQ0lSZWdCKDB4NCxQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uQ29tbWFuZCB8IDB4NyxkZXZpY2UpCi0KLSNkZWZpbmUgRElTQUJMRV9ERVZJQ0UoZGV2aWNlKSAgXAotICAgIFBDSV93cml0ZVBDSVJlZ0IoMHg0LDAsZGV2aWNlKQotCi0vKiBNYWNyb3MgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIEFHUCBWR0EgcmVzb3VyY2VzICovCi0KLSNkZWZpbmUgRU5BQkxFX0FHUF9WR0EoKSAgICBcCi0gICAgUENJX2FjY2Vzc1JlZygweDNFLEFHUEJyaWRnZS0+QnJpZGdlQ29udHJvbCB8IDB4OCxQQ0lfV1JJVEVfV09SRCwoUENJRGV2aWNlSW5mbyopQUdQQnJpZGdlKQotCi0jZGVmaW5lIERJU0FCTEVfQUdQX1ZHQSgpICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoMHgzRSxBR1BCcmlkZ2UtPkJyaWRnZUNvbnRyb2wgJiB+MHg4LFBDSV9XUklURV9XT1JELChQQ0lEZXZpY2VJbmZvKilBR1BCcmlkZ2UpCi0KLSNkZWZpbmUgUkVTVE9SRV9BR1BfVkdBKCkgICBcCi0gICAgUENJX2FjY2Vzc1JlZygweDNFLEFHUEJyaWRnZS0+QnJpZGdlQ29udHJvbCxQQ0lfV1JJVEVfV09SRCwoUENJRGV2aWNlSW5mbyopQUdQQnJpZGdlKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVRoZSBhZGRyZXNzIHRvIHVzZSB0byBtYXAgdGhlIHNlY29uZGFyeSBCSU9TIChQQ0kvQUdQIGRldmljZXMpCi0KLVJFTUFSS1M6Ci1TZWFyY2hlcyBhbGwgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIGZvciB0aGUgZGV2aWNlIGxvb2tpbmcgZm9yIGEKLW1lbW9yeSBtYXBwaW5nIHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3VyIFJPTSBCSU9TLiBXZSB1c3VhbGx5IGVuZCB1cAotZmluZGluZyB0aGUgZnJhbWVidWZmZXIgbWFwcGluZyAodXN1YWxseSBCQVIgMHgxMCksIGFuZCB3ZSB1c2UgdGhpcyBtYXBwaW5nCi10byBtYXAgdGhlIEJJT1MgZm9yIHRoZSBkZXZpY2UgaW50by4gV2UgdXNlIGEgbWFwcGluZyB0aGF0IGlzIGFscmVhZHkKLWFzc2lnbmVkIHRvIHRoZSBkZXZpY2UgdG8gZW5zdXJlIHRoZSBtZW1vcnkgcmFuZ2Ugd2lsbCBiZSBwYXNzZWQgdGhyb3VnaAotYnkgYW55IFBDSS0+UENJIG9yIEFHUC0+UENJIGJyaWRnZSB0aGF0IG1heSBiZSBwcmVzZW50LgotCi1OT1RFOiBVc3VhbGx5IHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBBR1AgZGV2aWNlcywgYnV0IGl0IG1heSBiZQotICAgICAgdXNlZCBmb3IgUENJIGRldmljZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBQT1NUJ2VkIGFuZCB0aGUgQklPUwotICAgICAgUk9NIGJhc2UgYWRkcmVzcyBoYXMgYmVlbiB6ZXJvJ2VkIG91dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgUENJX2ZpbmRCSU9TQWRkcigKLSAgICBpbnQgZGV2aWNlKQotewotICAgIHVsb25nICAgYmFzZSxzaXplOwotICAgIGludCAgICAgYmFyOwotCi0gICAgZm9yIChiYXIgPSAweDEwOyBiYXIgPD0gMHgxNDsgYmFyKyspIHsKLQliYXNlID0gUENJX3JlYWRQQ0lSZWdMKGJhcixkZXZpY2UpICYgfjB4RkY7Ci0JaWYgKCEoYmFzZSAmIDB4MSkpIHsKLQkgICAgUENJX3dyaXRlUENJUmVnTChiYXIsMHhGRkZGRkZGRixkZXZpY2UpOwotCSAgICBzaXplID0gUENJX3JlYWRQQ0lSZWdMKGJhcixkZXZpY2UpICYgfjB4RkY7Ci0JICAgIHNpemUgPSB+c2l6ZSsxOwotCSAgICBQQ0lfd3JpdGVQQ0lSZWdMKGJhciwwLGRldmljZSk7Ci0JICAgIGlmIChzaXplID49IE1BWF9CSU9TTEVOKQotCQlyZXR1cm4gYmFzZTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZS13cml0ZXMgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIGZvciB0aGUgc2Vjb25kYXJ5IFBDSSBjb250cm9sbGVyCi13aXRoIHRoZSB2YWx1ZXMgZnJvbSBvdXIgaW5pdGlhbCBQQ0kgYnVzIGVudW1lcmF0aW9uLiBUaGlzIGZpeGVzIHVwIHRoZQotdmFsdWVzIGFmdGVyIHdlIGhhdmUgUE9TVCdlZCB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkgY29udHJvbGxlciBCSU9TLCB3aGljaAotbWF5IGhhdmUgaW5jb3JyZWN0bHkgcmUtcHJvZ3JhbW1lZCB0aGUgYmFzZSByZWdpc3RlcnMgdGhlIHNhbWUgYXMgdGhlCi1wcmltYXJ5IGRpc3BsYXkgY29udHJvbGxlciAodGhlIGNhc2UgZm9yIGlkZW50aWNhbCBTMyBjYXJkcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX1BDSV9maXh1cFNlY29uZGFyeUJBUnModm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1EZXZpY2VzOyBpKyspIHsKLQlQQ0lfd3JpdGVQQ0lSZWdMKDB4MTAsUENJW0RldmljZUluZGV4W2ldXS5CYXNlQWRkcmVzczEwLGkpOwotCVBDSV93cml0ZVBDSVJlZ0woMHgxNCxQQ0lbRGV2aWNlSW5kZXhbaV1dLkJhc2VBZGRyZXNzMTQsaSk7Ci0JUENJX3dyaXRlUENJUmVnTCgweDE4LFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MxOCxpKTsKLQlQQ0lfd3JpdGVQQ0lSZWdMKDB4MUMsUENJW0RldmljZUluZGV4W2ldXS5CYXNlQWRkcmVzczFDLGkpOwotCVBDSV93cml0ZVBDSVJlZ0woMHgyMCxQQ0lbRGV2aWNlSW5kZXhbaV1dLkJhc2VBZGRyZXNzMjAsaSk7Ci0JUENJX3dyaXRlUENJUmVnTCgweDI0LFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MyNCxpKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIEJJT1MgUE9TVCBjb2RlIG9uIHRoZSBjb250cm9sbGVyLiBXZSBhc3N1bWUgdGhhdAotYXQgdGhpcyBzdGFnZSB0aGUgY29udHJvbGxlciBoYXMgaXRzIEkvTyBhbmQgbWVtb3J5IHNwYWNlIGVuYWJsZWQgYW5kCi10aGF0IGFsbCBvdGhlciBjb250cm9sbGVycyBhcmUgaW4gYSBkaXNhYmxlZCBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBQQ0lfZG9CSU9TUE9TVCgKLSAgICBpbnQgZGV2aWNlLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSB2YWx1ZSB0byBzdG9yZSBpbiBBWCBmb3IgQklPUyBQT1NUICovCi0gICAgcmVncy54LmF4ID0gKHUxNikoUENJW0RldmljZUluZGV4W2RldmljZV1dLnNsb3QuaSA+PiA4KTsKLSAgICBpZiAodXNlVjg2KSB7Ci0JLyogUG9zdCB0aGUgQklPUyB1c2luZyB0aGUgUE0gZnVuY3Rpb25zIChpZTogdjg2IG1vZGUgb24gTGludXgpICovCi0JaWYgKCFQTV9kb0JJT1NQT1NUKHJlZ3MueC5heCxCSU9TUGh5c0FkZHIsbWFwcGVkQklPUyxCSU9TTGVuKSkgewotCSAgICAvKiBJZiB0aGUgUE0gZnVuY3Rpb24gZmFpbHMsIHRoaXMgcHJvYmFibHkgbWVhbnMgYXJlIHdlIGFyZSBvbiAqLwotCSAgICAvKiBET1MgYW5kIGNhbid0IHJlLW1hcCB0aGUgcmVhbCBtb2RlIDB4QzAwMDAgcmVnaW9uLiBJbiB0aGlzZSAqLwotCSAgICAvKiBjYXNlIGlmIHRoZSBkZXZpY2UgaXMgdGhlIHByaW1hcnksIHdlIGNhbiB1c2UgdGhlIHJlYWwgKi8KLQkgICAgLyogQklPUyBhdCAweEMwMDAwIGRpcmVjdGx5LiAqLwotCSAgICBpZiAoZGV2aWNlID09IDApCi0JCVBNX2RvQklPU1BPU1QocmVncy54LmF4LDB4QzAwMDAsbWFwcGVkQklPUyxCSU9TTGVuKTsKLQkgICAgfQotCX0KLSAgICBlbHNlIHsKLQkvKiBTZXR1cCB0aGUgWDg2IGVtdWxhdG9yIGZvciB0aGUgVkdBIEJJT1MgKi8KLQlCRV9zZXRWR0EoJlZHQUluZm9bZGV2aWNlXSk7Ci0KLQkvKiBFeGVjdXRlIHRoZSBCSU9TIFBPU1QgY29kZSAqLwotCUJFX2NhbGxSZWFsTW9kZSgweEMwMDAsMHgwMDAzLCZyZWdzLCZzcmVncyk7Ci0KLQkvKiBDbGVhbnVwIGFuZCBleGl0ICovCi0JQkVfZ2V0VkdBKCZWR0FJbmZvW2RldmljZV0pOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1UcnVlIGlmIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZCwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotTG9hZHMgYW5kIFBPU1QncyB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIEJJT1MsIGRpcmVjdGx5IGZyb20gdGhlIEJJT1MKLWltYWdlIHdlIGNhbiBleHRyYWN0IG92ZXIgdGhlIFBDSSBidXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIFBDSV9wb3N0Q29udHJvbGxlcnModm9pZCkKLXsKLSAgICBpbnQgICAgIGRldmljZTsKLSAgICB1bG9uZyAgIEJJT1NJbWFnZUxlbixtYXBwZWRCSU9TUGh5czsKLSAgICB1Y2hhciAgICptYXBwZWRCSU9TLCpjb3B5T2ZCSU9TOwotICAgIGNoYXIgICAgZmlsZW5hbWVbX01BWF9QQVRIXTsKLSAgICBGSUxFICAgICpmOwotCi0gICAgLyogRGlzYWJsZSB0aGUgcHJpbWFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgYW5kIEFHUCBWR0EgcGFzcy10aHJvdWdoICovCi0gICAgRElTQUJMRV9ERVZJQ0UoMCk7Ci0gICAgaWYgKEFHUEJyaWRnZSkKLQlESVNBQkxFX0FHUF9WR0EoKTsKLQotICAgIC8qIE5vdyBQT1NUIGFsbCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzICovCi0gICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBOdW1EZXZpY2VzOyBkZXZpY2UrKykgewotCS8qIFNraXAgdGhlIGRldmljZSBpZiBpdCBpcyBub3QgZW5hYmxlZCAocHJvYmFibHkgYW4gSVNBIGRldmljZSkgKi8KLQlpZiAoRGV2aWNlSW5kZXhbZGV2aWNlXSA9PSAtMSkKLQkgICAgY29udGludWU7Ci0KLQkvKiBFbmFibGUgc2Vjb25kYXJ5IGRpc3BsYXkgY29udHJvbGxlci4gSWYgdGhlIHNlY29uZGFyeSBjb250cm9sbGVyICovCi0JLyogaXMgb24gdGhlIEFHUCBidXMsIHRoZW4gZW5hYmxlIFZHQSByZXNvdXJjZXMgZm9yIHRoZSBBR1AgZGV2aWNlLiAqLwotCUVOQUJMRV9ERVZJQ0UoZGV2aWNlKTsKLQlpZiAoQUdQQnJpZGdlICYmIEFHUEJyaWRnZS0+U2Vjb25kYXlCdXNOdW1iZXIgPT0gUENJW0RldmljZUluZGV4W2RldmljZV1dLnNsb3QucC5CdXMpCi0JICAgIEVOQUJMRV9BR1BfVkdBKCk7Ci0KLQkvKiBDaGVjayBpZiB0aGUgY29udHJvbGxlciBoYXMgYWxyZWFkeSBiZWVuIFBPU1QnZWQgKi8KLQlpZiAoVkdBX05PVF9BQ1RJVkUoKSkgewotCSAgICAvKiBGaW5kIGEgdmlhYmxlIHBsYWNlIHRvIG1hcCB0aGUgc2Vjb25kYXJ5IFBDSSBCSU9TIGltYWdlIGFuZCBtYXAgaXQgKi8KLQkgICAgcHJpbnRrKCJEZXZpY2UgJWQgbm90IGVuYWJsZWQsIHNvIGF0dGVtcHRpbmcgd2FybSBib290IGl0XG4iLCBkZXZpY2UpOwotCi0JICAgIC8qIEZvciBBR1AgZGV2aWNlcyAoYW5kIFBDSSBkZXZpY2VzIHRoYXQgZG8gaGF2ZSB0aGUgUk9NIGJhc2UgKi8KLQkgICAgLyogYWRkcmVzcyB6ZXJvJ2VkIG91dCkgd2UgaGF2ZSB0byBtYXAgdGhlIEJJT1MgdG8gYSBsb2NhdGlvbiAqLwotCSAgICAvKiB0aGF0IGlzIHBhc3NlZCBieSB0aGUgQUdQIGJyaWRnZSB0byB0aGUgYnVzLiBTb21lIEFHUCBkZXZpY2VzICovCi0JICAgIC8qIGhhdmUgdGhlIFJPTSBiYXNlIGFkZHJlc3MgYWxyZWFkeSBzZXQgdXAgZm9yIHVzLCBhbmQgc29tZSAqLwotCSAgICAvKiBkbyBub3QgKHdlIG1hcCB0byBvbmUgb2YgdGhlIGV4aXN0aW5nIEJBUiBsb2NhdGlvbnMgaW4gKi8KLQkgICAgLyogdGhpcyBjYXNlKS4gKi8KLQkgICAgbWFwcGVkQklPUyA9IE5VTEw7Ci0JICAgIGlmIChQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uUk9NQmFzZUFkZHJlc3MgIT0gMCkKLQkJbWFwcGVkQklPU1BoeXMgPSBQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uUk9NQmFzZUFkZHJlc3MgJiB+MHhGOwotCSAgICBlbHNlCi0JCW1hcHBlZEJJT1NQaHlzID0gUENJX2ZpbmRCSU9TQWRkcihkZXZpY2UpOwotCSAgICBwcmludGsoIk1hcHBpbmcgQklPUyBpbWFnZSB0byAweCUwOFhcbiIsIG1hcHBlZEJJT1NQaHlzKTsKLQkgICAgbWFwcGVkQklPUyA9IFBNX21hcFBoeXNpY2FsQWRkcihtYXBwZWRCSU9TUGh5cyxNQVhfQklPU0xFTi0xLGZhbHNlKTsKLQkgICAgUENJX3dyaXRlUENJUmVnTCgweDMwLG1hcHBlZEJJT1NQaHlzIHwgMHgxLGRldmljZSk7Ci0JICAgIEJJT1NJbWFnZUxlbiA9IG1hcHBlZEJJT1NbMl0gKiA1MTI7Ci0JICAgIGlmICgoY29weU9mQklPUyA9IG1hbGxvYyhCSU9TSW1hZ2VMZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIG1lbWNweShjb3B5T2ZCSU9TLG1hcHBlZEJJT1MsQklPU0ltYWdlTGVuKTsKLQkgICAgUE1fZnJlZVBoeXNpY2FsQWRkcihtYXBwZWRCSU9TLE1BWF9CSU9TTEVOLTEpOwotCi0JICAgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBjb3B5IG9mIEJJT1MgZnJvbSBzZWNvbmRhcnkgY29udHJvbGxlcnMgKi8KLQkgICAgVkdBSW5mb1tkZXZpY2VdLnBjaUluZm8gPSAmUENJW0RldmljZUluZGV4W2RldmljZV1dOwotCSAgICBWR0FJbmZvW2RldmljZV0uQklPU0ltYWdlID0gY29weU9mQklPUzsKLQkgICAgVkdBSW5mb1tkZXZpY2VdLkJJT1NJbWFnZUxlbiA9IEJJT1NJbWFnZUxlbjsKLQotCSAgICAvKiBSZXN0b3JlIGRldmljZSBtYXBwaW5ncyAqLwotCSAgICBQQ0lfd3JpdGVQQ0lSZWdMKDB4MzAsUENJW0RldmljZUluZGV4W2RldmljZV1dLlJPTUJhc2VBZGRyZXNzLGRldmljZSk7Ci0JICAgIFBDSV93cml0ZVBDSVJlZ0woMHgxMCxQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uQmFzZUFkZHJlc3MxMCxkZXZpY2UpOwotCSAgICBQQ0lfd3JpdGVQQ0lSZWdMKDB4MTQsUENJW0RldmljZUluZGV4W2RldmljZV1dLkJhc2VBZGRyZXNzMTQsZGV2aWNlKTsKLQotCSAgICAvKiBOb3cgZXhlY3V0ZSB0aGUgQklPUyBQT1NUIGZvciB0aGUgZGV2aWNlICovCi0JICAgIGlmIChjb3B5T2ZCSU9TWzBdID09IDB4NTUgJiYgY29weU9mQklPU1sxXSA9PSAweEFBKSB7Ci0JCXByaW50aygiRXhlY3V0aW5nIEJJT1MgUE9TVCBmb3IgY29udHJvbGxlci5cbiIpOwotCQlQQ0lfZG9CSU9TUE9TVChkZXZpY2UsbWFwcGVkQklPU1BoeXMsY29weU9mQklPUyxCSU9TSW1hZ2VMZW4pOwotCQl9Ci0KLQkgICAgLyogUmVzZXQgdGhlIHNpemUgb2YgdGhlIEJJT1MgaW1hZ2UgdG8gdGhlIGZpbmFsIHNpemUgKi8KLQkgICAgVkdBSW5mb1tkZXZpY2VdLkJJT1NJbWFnZUxlbiA9IEZJTkFMX0JJT1NMRU47Ci0KLQkgICAgLyogU2F2ZSB0aGUgQklPUyBhbmQgaW50ZXJydXB0IHZlY3RvciBpbmZvcm1hdGlvbiB0byBkaXNrICovCi0JICAgIHNwcmludGYoZmlsZW5hbWUsIiVzL2Jpb3MuJTAyZCIsUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKSxkZXZpY2UpOwotCSAgICBpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwid2IiKSkgIT0gTlVMTCkgewotCQlmd3JpdGUoY29weU9mQklPUywxLEZJTkFMX0JJT1NMRU4sZik7Ci0JCWZ3cml0ZShWR0FJbmZvW2RldmljZV0uTG93TWVtLDEsc2l6ZW9mKFZHQUluZm9bZGV2aWNlXS5Mb3dNZW0pLGYpOwotCQlmY2xvc2UoZik7Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgY29weSBvZiBCSU9TIGZyb20gc2Vjb25kYXJ5IGNvbnRyb2xsZXJzICovCi0JICAgIGlmICgoY29weU9mQklPUyA9IG1hbGxvYyhGSU5BTF9CSU9TTEVOKSkgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICBWR0FJbmZvW2RldmljZV0ucGNpSW5mbyA9ICZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV07Ci0JICAgIFZHQUluZm9bZGV2aWNlXS5CSU9TSW1hZ2UgPSBjb3B5T2ZCSU9TOwotCSAgICBWR0FJbmZvW2RldmljZV0uQklPU0ltYWdlTGVuID0gRklOQUxfQklPU0xFTjsKLQotCSAgICAvKiBMb2FkIHRoZSBCSU9TIGFuZCBpbnRlcnJ1cHQgdmVjdG9yIGluZm9ybWF0aW9uIGZyb20gZGlzayAqLwotCSAgICBzcHJpbnRmKGZpbGVuYW1lLCIlcy9iaW9zLiUwMmQiLFBNX2dldE51Y2xldXNDb25maWdQYXRoKCksZGV2aWNlKTsKLQkgICAgaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsInJiIikpICE9IE5VTEwpIHsKLQkJZnJlYWQoY29weU9mQklPUywxLEZJTkFMX0JJT1NMRU4sZik7Ci0JCWZyZWFkKFZHQUluZm9bZGV2aWNlXS5Mb3dNZW0sMSxzaXplb2YoVkdBSW5mb1tkZXZpY2VdLkxvd01lbSksZik7Ci0JCWZjbG9zZShmKTsKLQkJfQotCSAgICB9Ci0KLQkvKiBGaXggdXAgYWxsIHRoZSBzZWNvbmRhcnkgUENJIGJhc2UgYWRkcmVzcyByZWdpc3RlcnMgKi8KLQkvKiAocmVzdG9yZXMgdGhlbSBhbGwgZnJvbSB0aGUgdmFsdWVzIHdlIHJlYWQgcHJldmlvdXNseSkgKi8KLQlfUENJX2ZpeHVwU2Vjb25kYXJ5QkFScygpOwotCi0JLyogRGlzYWJsZSB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXIgYW5kIEFHUCBWR0EgcGFzcy10aHJvdWdoICovCi0JRElTQUJMRV9ERVZJQ0UoZGV2aWNlKTsKLQlpZiAoQUdQQnJpZGdlKQotCSAgICBESVNBQkxFX0FHUF9WR0EoKTsKLQl9Ci0KLSAgICAvKiBSZWVuYWJsZSBwcmltYXJ5IGRpc3BsYXkgY29udHJvbGxlciBhbmQgcmVzZXQgQUdQIGJyaWRnZSBjb250cm9sICovCi0gICAgaWYgKEFHUEJyaWRnZSkKLQlSRVNUT1JFX0FHUF9WR0EoKTsKLSAgICBFTkFCTEVfREVWSUNFKDApOwotCi0gICAgLyogRnJlZSBwaHlzaWNhbCBCSU9TIGltYWdlIG1hcHBpbmcgKi8KLSAgICBQTV9mcmVlUGh5c2ljYWxBZGRyKG1hcHBlZEJJT1MsTUFYX0JJT1NMRU4tMSk7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBYODYgZW11bGF0b3IgQklPUyBpbmZvIHRvIHByaW1hcnkgY29udHJvbGxlciAqLwotICAgIGlmICghdXNlVjg2KQotCUJFX3NldFZHQSgmVkdBSW5mb1swXSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW51bWVyYXRlcyB0aGUgUENJIGJ1cyBhbmQgZHVtcHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRvIHRoZQotbG9nIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRW51bWVyYXRlUENJKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGksaW5kZXg7Ci0gICAgUENJQnJpZGdlSW5mbyAgICppbmZvOwotCi0gICAgcHJpbnRrKCJEaXNwbGF5aW5nIGVudW1lcmF0aW9uIG9mIFBDSSBidXMgKCVkIGRldmljZXMsICVkIGRpc3BsYXkgZGV2aWNlcylcbiIsCi0JTnVtUENJLCBOdW1EZXZpY2VzKTsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKQotCXByaW50aygiICBEaXNwbGF5IGRldmljZSAlZCBpcyBQQ0kgZGV2aWNlICVkXG4iLGluZGV4LERldmljZUluZGV4W2luZGV4XSk7Ci0gICAgcHJpbnRrKCJcbiIpOwotICAgIHByaW50aygiQnVzIFNsb3QgRm5jIERldmljZUlEICBTdWJTeXN0ZW0gUmV2IENsYXNzIElSUSBJbnQgQ21kXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspIHsKLQlwcmludGsoIiUyZCAgICUyZCAgJTJkICAlMDRYOiUwNFggJTA0WDolMDRYICUwMlggICUwMlg6JTAyWCAlMDJYICAlMDJYICAlMDRYICAgIiwKLQkgICAgUENJW2ldLnNsb3QucC5CdXMsCi0JICAgIFBDSVtpXS5zbG90LnAuRGV2aWNlLAotCSAgICBQQ0lbaV0uc2xvdC5wLkZ1bmN0aW9uLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLlN1YlN5c3RlbVZlbmRvcklELAotCSAgICBQQ0lbaV0uU3ViU3lzdGVtSUQsCi0JICAgIFBDSVtpXS5SZXZJRCwKLQkgICAgUENJW2ldLkJhc2VDbGFzcywKLQkgICAgUENJW2ldLlN1YkNsYXNzLAotCSAgICBQQ0lbaV0uSW50ZXJydXB0TGluZSwKLQkgICAgUENJW2ldLkludGVycnVwdFBpbiwKLQkgICAgUENJW2ldLkNvbW1hbmQpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQkgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpbmRleCA8IE51bURldmljZXMpCi0JICAgIHByaW50aygiPC0gJWRcbiIsIGluZGV4KTsKLQllbHNlCi0JICAgIHByaW50aygiXG4iKTsKLQl9Ci0gICAgcHJpbnRrKCJcbiIpOwotICAgIHByaW50aygiRGV2aWNlSUQgIFN0YXQgSWZjIENjaCBMYXQgSGRyIEJJU1RcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50aygiJTA0WDolMDRYICUwNFggICUwMlggICUwMlggICUwMlggICUwMlggICUwMlggICAiLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLlN0YXR1cywKLQkgICAgUENJW2ldLkludGVyZmFjZSwKLQkgICAgUENJW2ldLkNhY2hlTGluZVNpemUsCi0JICAgIFBDSVtpXS5MYXRlbmN5VGltZXIsCi0JICAgIFBDSVtpXS5IZWFkZXJUeXBlLAotCSAgICBQQ0lbaV0uQklTVCk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRrKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRrKCJcbiIpOwotCX0KLSAgICBwcmludGsoIlxuIik7Ci0gICAgcHJpbnRrKCJEZXZpY2VJRCAgQmFzZTEwaCAgQmFzZTE0aCAgQmFzZTE4aCAgQmFzZTFDaCAgQmFzZTIwaCAgQmFzZTI0aCAgUk9NQmFzZVxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JcHJpbnRrKCIlMDRYOiUwNFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAiLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMTAsCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczE0LAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxOCwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMUMsCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczIwLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MyNCwKLQkgICAgUENJW2ldLlJPTUJhc2VBZGRyZXNzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQotCSAgICBwcmludGsoIjwtICVkXG4iLCBpbmRleCk7Ci0JZWxzZQotCSAgICBwcmludGsoIlxuIik7Ci0JfQotICAgIHByaW50aygiXG4iKTsKLSAgICBwcmludGsoIkRldmljZUlEICBCQVIxMExlbiBCQVIxNExlbiBCQVIxOExlbiBCQVIxQ0xlbiBCQVIyMExlbiBCQVIyNExlbiBST01MZW5cbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50aygiJTA0WDolMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggIiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczEwTGVuLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxNExlbiwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMThMZW4sCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczFDTGVuLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MyMExlbiwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMjRMZW4sCi0JICAgIFBDSVtpXS5ST01CYXNlQWRkcmVzc0xlbik7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRrKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRrKCJcbiIpOwotCX0KLSAgICBwcmludGsoIlxuIik7Ci0gICAgcHJpbnRrKCJEaXNwbGF5aW5nIGVudW1lcmF0aW9uIG9mICVkIGJyaWRnZSBkZXZpY2VzXG4iLE51bUJyaWRnZXMpOwotICAgIHByaW50aygiXG4iKTsKLSAgICBwcmludGsoIkRldmljZUlEICBQIyBTIyBCIyBJT0IgIElPTCAgTWVtQmFzZSAgTWVtTGltaXQgUHJlQmFzZSAgUHJlTGltaXQgQ3RybFxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bUJyaWRnZXM7IGkrKykgewotCWluZm8gPSAoUENJQnJpZGdlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtpXV07Ci0JcHJpbnRrKCIlMDRYOiUwNFggJTAyWCAlMDJYICUwMlggJTA0WCAlMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA0WFxuIiwKLQkgICAgaW5mby0+VmVuZG9ySUQsCi0JICAgIGluZm8tPkRldmljZUlELAotCSAgICBpbmZvLT5QcmltYXJ5QnVzTnVtYmVyLAotCSAgICBpbmZvLT5TZWNvbmRheUJ1c051bWJlciwKLQkgICAgaW5mby0+U3Vib3JkaW5hdGVCdXNOdW1iZXIsCi0JICAgICgodTE2KWluZm8tPklPQmFzZSA8PCA4KSAmIDB4RjAwMCwKLQkgICAgaW5mby0+SU9MaW1pdCA/Ci0JCSgodTE2KWluZm8tPklPTGltaXQgPDwgOCkgfCAweEZGRiA6IDAsCi0JICAgICgodTMyKWluZm8tPk1lbW9yeUJhc2UgPDwgMTYpICYgMHhGRkYwMDAwMCwKLQkgICAgaW5mby0+TWVtb3J5TGltaXQgPwotCQkoKHUzMilpbmZvLT5NZW1vcnlMaW1pdCA8PCAxNikgfCAweEZGRkZGIDogMCwKLQkgICAgKCh1MzIpaW5mby0+UHJlZmV0Y2hhYmxlTWVtb3J5QmFzZSA8PCAxNikgJiAweEZGRjAwMDAwLAotCSAgICBpbmZvLT5QcmVmZXRjaGFibGVNZW1vcnlMaW1pdCA/Ci0JCSgodTMyKWluZm8tPlByZWZldGNoYWJsZU1lbW9yeUxpbWl0IDw8IDE2KSB8IDB4RkZGRkYgOiAwLAotCSAgICBpbmZvLT5CcmlkZ2VDb250cm9sKTsKLQl9Ci0gICAgcHJpbnRrKCJcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLU51bWJlciBvZiBkaXNwbGF5IGRldmljZXMgZm91bmQuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGVudW1lcmF0ZXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGlzcGxheSBkZXZpY2VzIG9uIHRoZQotUENJIGJ1cywgYW5kIHJldHVybnMgdGhlIG51bWJlciBmb3VuZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVEZXZpY2VzKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGksajsKLSAgICBQQ0lCcmlkZ2VJbmZvICAgKmluZm87Ci0KLSAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQsIGVudW1lcmF0ZSBhbGwgKi8KLSAgICAvKiBkZXZpY2VzIG9uIHRoZSBQQ0kgYnVzLiAqLwotICAgIGlmIChOdW1QQ0kgPT0gLTEpIHsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BDSV9ERVZJQ0VTOyBpKyspCi0JICAgIFBDSVtpXS5kd1NpemUgPSBzaXplb2YoUENJW2ldKTsKLQlpZiAoKE51bVBDSSA9IFBDSV9lbnVtZXJhdGUoUENJLE1BWF9QQ0lfREVWSUNFUykpID09IDApCi0JICAgIHJldHVybiAtMTsKLQotCS8qIEJ1aWxkIGEgbGlzdCBvZiBhbGwgUENJIGJyaWRnZSBkZXZpY2VzICovCi0JZm9yIChpID0gMCxOdW1CcmlkZ2VzID0gMCxCcmlkZ2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKLQkgICAgaWYgKFBDSVtpXS5CYXNlQ2xhc3MgPT0gUENJX0JSSURHRV9DTEFTUykgewotCQlpZiAoTnVtQnJpZGdlcyA8IE1BWF9QQ0lfREVWSUNFUykKLQkJICAgIEJyaWRnZUluZGV4W051bUJyaWRnZXMrK10gPSBpOwotCQl9Ci0JICAgIH0KLQotCS8qIE5vdyBidWlsZCBhIGxpc3Qgb2YgYWxsIGRpc3BsYXkgY2xhc3MgZGV2aWNlcyAqLwotCWZvciAoaSA9IDAsTnVtRGV2aWNlcyA9IDEsRGV2aWNlSW5kZXhbMF0gPSAtMTsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JICAgIGlmIChQQ0lfSVNfRElTUExBWV9DTEFTUygmUENJW2ldKSkgewotCQlpZiAoKFBDSVtpXS5Db21tYW5kICYgMHgzKSA9PSAweDMpIHsKLQkJICAgIERldmljZUluZGV4WzBdID0gaTsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBpZiAoTnVtRGV2aWNlcyA8IE1BWF9QQ0lfREVWSUNFUykKLQkJCURldmljZUluZGV4W051bURldmljZXMrK10gPSBpOwotCQkgICAgfQotCQlpZiAoUENJW2ldLnNsb3QucC5CdXMgIT0gMCkgewotCQkgICAgLyogVGhpcyBkZXZpY2UgaXMgb24gYSBkaWZmZXJlbnQgYnVzIHRoYW4gdGhlIHByaW1hcnkgKi8KLQkJICAgIC8qIFBDSSBidXMsIHNvIGl0IGlzIHByb2JhYmx5IGFuIEFHUCBkZXZpY2UuIEZpbmQgdGhlICovCi0JCSAgICAvKiBBR1AgYnVzIGRldmljZSB0aGF0IGNvbnRyb2xzIHRoYXQgYnVzIHNvIHdlIGNhbiAqLwotCQkgICAgLyogY29udHJvbCBpdC4gKi8KLQkJICAgIGZvciAoaiA9IDA7IGogPCBOdW1CcmlkZ2VzOyBqKyspIHsKLQkJCWluZm8gPSAoUENJQnJpZGdlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtqXV07Ci0JCQlpZiAoaW5mby0+U2Vjb25kYXlCdXNOdW1iZXIgPT0gUENJW2ldLnNsb3QucC5CdXMpIHsKLQkJCSAgICBBR1BCcmlkZ2UgPSBpbmZvOwotCQkJICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkvKiBFbnVtZXJhdGUgYWxsIFBDSSBhbmQgYnJpZGdlIGRldmljZXMgdG8gbG9nIGZpbGUgKi8KLQlFbnVtZXJhdGVQQ0koKTsKLQl9Ci0gICAgcmV0dXJuIE51bURldmljZXM7Ci19Ci0KLUZJTEUgKmxvZ2ZpbGU7Ci0KLXZvaWQgcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJncHRyOwotICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKLSAgICB2ZnByaW50Zihsb2dmaWxlLCBmbXQsIGFyZ3B0cik7Ci0gICAgZmZsdXNoKGxvZ2ZpbGUpOwotICAgIHZhX2VuZChhcmdwdHIpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCi17Ci0gICAgd2hpbGUgKGFyZ2MgPiAxKSB7Ci0JaWYgKHN0cmljbXAoYXJndlsxXSwiLXVzZXY4NiIpID09IDApIHsKLQkgICAgdXNlVjg2ID0gdHJ1ZTsKLQkgICAgfQotCWVsc2UgaWYgKHN0cmljbXAoYXJndlsxXSwiLWZvcmNlIikgPT0gMCkgewotCSAgICBmb3JjZVBvc3QgPSB0cnVlOwotCSAgICB9Ci0jaWZkZWYgIERFQlVHCi0JZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItZGVjb2RlIikgPT0gMCkgewotCSAgICBkZWJ1Z0ZsYWdzIHw9IERFQlVHX0RFQ09ERV9GOwotCSAgICB9Ci0JZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItaW90cmFjZSIpID09IDApIHsKLQkgICAgZGVidWdGbGFncyB8PSBERUJVR19JT19UUkFDRV9GOwotCSAgICB9Ci0jZW5kaWYKLQllbHNlIHsKLQkgICAgcHJpbnRmKCJVc2FnZTogd2FybWJvb3QgWy11c2V2ODZdIFstZm9yY2VdIFstZGVjb2RlXSBbLWlvdHJhY2VdXG4iKTsKLQkgICAgZXhpdCgtMSk7Ci0JICAgIH0KLQlhcmdjLS07Ci0JYXJndisrOwotCX0KLSAgICBpZiAoKGxvZ2ZpbGUgPSBmb3Blbigid2FybWJvb3QubG9nIiwidyIpKSA9PSBOVUxMKQotCWV4aXQoMSk7Ci0KLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKCF1c2VWODYpIHsKLQkvKiBJbml0aWFsaXNlIHRoZSB4ODYgQklPUyBlbXVsYXRvciAqLwotCUJFX2luaXQoZmFsc2UsZGVidWdGbGFncyw2NTUzNiwmVkdBSW5mb1swXSk7Ci0JfQotCi0gICAgLyogRW51bWVyYXRlIGFsbCBkZXZpY2VzICh3aGljaCBQT1NUJ3MgdGhlbSBhdCB0aGUgc2FtZSB0aW1lKSAqLwotICAgIGlmIChQQ0lfZW51bWVyYXRlRGV2aWNlcygpIDwgMSkgewotCXByaW50aygiTm8gUENJIGRpc3BsYXkgZGV2aWNlcyBmb3VuZCFcbiIpOwotCXJldHVybiAtMTsKLQl9Ci0KLSAgICAvKiBQb3N0IGFsbCB0aGUgZGlzcGxheSBjb250cm9sbGVyIEJJT1MnZXMgKi8KLSAgICBQQ0lfcG9zdENvbnRyb2xsZXJzKCk7Ci0KLSAgICAvKiBDbGVhbnVwIGFuZCBleGl0IHRoZSBlbXVsYXRvciAqLwotICAgIGlmICghdXNlVjg2KQotCUJFX2V4aXQoKTsKLSAgICBmY2xvc2UobG9nZmlsZSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2FhX2ltcC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2FhX2ltcC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTkwMjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19hYV9pbXAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBBdWRpbyBBcmNoaXRlY3R1cmUKLTsqCi07KiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLTsqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci07KiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci07KiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotOyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLTsqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLTsqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci07KiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotOyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAzMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi07KgotOyogRGVzY3JpcHRpb246IE1vZHVsZSB0byBpbXBsZW1lbnQgdGhlIGltcG9ydCBzdHVicyBmb3IgYWxsIHRoZSBOdWNsZXVzCi07KiAgICAgICAgICAgICAgQXVkaW8gQVBJIGZ1bmN0aW9ucyBmb3IgSW50ZWwgYmluYXJ5IGNvbXBhdGlibGUgZHJpdmVycy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLUJFR0lOX0lNUE9SVFNfREVGICAgX0FBX2V4cG9ydHMKLVNLSVBfSU1QICAgIEFBX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBBQV9lcnJvck1zZyAgICAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotU0tJUF9JTVAgICAgQUFfZ2V0RGF5c0xlZnQgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEFBX3JlZ2lzdGVyTGljZW5zZSAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBBQV9lbnVtZXJhdGVEZXZpY2VzICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotU0tJUF9JTVAgICAgQUFfbG9hZERyaXZlciAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLURFQ0xBUkVfSU1QIEFBX3VubG9hZERyaXZlcgotREVDTEFSRV9JTVAgQUFfc2F2ZU9wdGlvbnMKLUVORF9JTVBPUlRTX0RFRgotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYV9pbXAuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYV9pbXAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzE3NjAwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fZ2FfaW1wLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotOyoKLTsqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotOyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLTsqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLTsqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci07KiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotOyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotOyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLTsqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci07KiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KLTsqCi07KiBEZXNjcmlwdGlvbjogTW9kdWxlIHRvIGltcGxlbWVudCB0aGUgaW1wb3J0IHN0dWJzIGZvciBhbGwgdGhlIE51Y2xldXMKLTsqICAgICAgICAgICAgICBHcmFwaGljcyBBUEkgZnVuY3Rpb25zIGZvciBJbnRlbCBiaW5hcnkgY29tcGF0aWJsZSBkcml2ZXJzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotQkVHSU5fSU1QT1JUU19ERUYgICBfX0dBX2V4cG9ydHMKLVNLSVBfSU1QICAgIEdBX3N0YXR1cywwICAgICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2Vycm9yTXNnLDEgICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2dldERheXNMZWZ0LDEgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX3JlZ2lzdGVyTGljZW5zZSwyICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2VudW1lcmF0ZURldmljZXMsMSAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2xvYWREcml2ZXIsMiAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLURFQ0xBUkVfSU1QIEdBX3NldEFjdGl2ZURldmljZSwxCi1TS0lQX0lNUCAgICBHQV9yZXNlcnZlZDEsMCAgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1ERUNMQVJFX0lNUCBHQV91bmxvYWREcml2ZXIsMQotREVDTEFSRV9JTVAgUkVGMkRfbG9hZERyaXZlciw2Ci1ERUNMQVJFX0lNUCBSRUYyRF91bmxvYWREcml2ZXIsMgotREVDTEFSRV9JTVAgR0FfbG9hZFJlZjJkLDUKLURFQ0xBUkVfSU1QIEdBX3VubG9hZFJlZjJkLDEKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9Jbml0LDEKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9PbiwwCi1ERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvU2NoZWR1bGVGbGlwLDIKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9HZXRGbGlwU3RhdHVzLDAKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9XYWl0VGlsbEZsaXBwZWQsMAotREVDTEFSRV9JTVAgR0Ffc29mdFN0ZXJlb09mZiwwCi1ERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvRXhpdCwwCi1ERUNMQVJFX0lNUCBHQV9zYXZlTW9kZVByb2ZpbGUsMgotREVDTEFSRV9JTVAgR0Ffc2F2ZU9wdGlvbnMsMgotREVDTEFSRV9JTVAgR0Ffc2F2ZUNSVENUaW1pbmdzLDEKLURFQ0xBUkVfSU1QIEdBX3Jlc3RvcmVDUlRDVGltaW5ncywxCi1ERUNMQVJFX0lNUCBERENfaW5pdCwxCi1ERUNMQVJFX0lNUCBERENfcmVhZEVESUQsNQotREVDTEFSRV9JTVAgRURJRF9wYXJzZSwzCi1ERUNMQVJFX0lNUCBNQ1NfYmVnaW4sMQotREVDTEFSRV9JTVAgTUNTX2dldENhcGFiaWxpdGllc1N0cmluZywyCi1ERUNMQVJFX0lNUCBNQ1NfaXNDb250cm9sU3VwcG9ydGVkLDEKLURFQ0xBUkVfSU1QIE1DU19lbmFibGVDb250cm9sLDIKLURFQ0xBUkVfSU1QIE1DU19nZXRDb250cm9sTWF4LDIKLURFQ0xBUkVfSU1QIE1DU19nZXRDb250cm9sVmFsdWUsMgotREVDTEFSRV9JTVAgTUNTX2dldENvbnRyb2xWYWx1ZXMsMwotREVDTEFSRV9JTVAgTUNTX3NldENvbnRyb2xWYWx1ZSwyCi1ERUNMQVJFX0lNUCBNQ1Nfc2V0Q29udHJvbFZhbHVlcywzCi1ERUNMQVJFX0lNUCBNQ1NfcmVzZXRDb250cm9sLDEKLURFQ0xBUkVfSU1QIE1DU19zYXZlQ3VycmVudFNldHRpbmdzLDAKLURFQ0xBUkVfSU1QIE1DU19nZXRUaW1pbmdSZXBvcnQsMwotREVDTEFSRV9JTVAgTUNTX2dldFNlbGZUZXN0UmVwb3J0LDMKLURFQ0xBUkVfSU1QIE1DU19lbmQsMAotU0tJUF9JTVAgICAgR0FfbG9hZEluR1VJLDEgICAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotREVDTEFSRV9JTVAgRERDX3dyaXRlRURJRCw2Ci1ERUNMQVJFX0lNUCBHQV91c2VEb3VibGVTY2FuLDEKLURFQ0xBUkVfSU1QIEdBX2dldE1heFJlZnJlc2hSYXRlLDQKLURFQ0xBUkVfSU1QIEdBX2NvbXB1dGVDUlRDVGltaW5ncyw2Ci1ERUNMQVJFX0lNUCBHQV9hZGRNb2RlLDUKLURFQ0xBUkVfSU1QIEdBX2FkZFJlZnJlc2gsNQotREVDTEFSRV9JTVAgR0FfZGVsTW9kZSw1Ci1ERUNMQVJFX0lNUCBOX2dldExvZ05hbWUsMAotU0tJUF9JTVAyICAgTl9sb2cKLURFQ0xBUkVfSU1QIE1EQlhfZ2V0RXJyQ29kZSwwCi1ERUNMQVJFX0lNUCBNREJYX2dldEVycm9yTXNnLDAKLURFQ0xBUkVfSU1QIE1EQlhfb3BlbiwxCi1ERUNMQVJFX0lNUCBNREJYX2Nsb3NlLDAKLURFQ0xBUkVfSU1QIE1EQlhfZmlyc3QsMQotREVDTEFSRV9JTVAgTURCWF9sYXN0LDEKLURFQ0xBUkVfSU1QIE1EQlhfbmV4dCwxCi1ERUNMQVJFX0lNUCBNREJYX3ByZXYsMQotREVDTEFSRV9JTVAgTURCWF9pbnNlcnQsMQotREVDTEFSRV9JTVAgTURCWF91cGRhdGUsMQotREVDTEFSRV9JTVAgTURCWF9mbHVzaCwwCi1ERUNMQVJFX0lNUCBNREJYX2ltcG9ydElORiwyCi1TS0lQX0lNUCAgICBHQV9nZXRHbG9iYWxPcHRpb25zLDIgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1ERUNMQVJFX0lNUCBHQV9zZXRHbG9iYWxPcHRpb25zLDEKLURFQ0xBUkVfSU1QIEdBX3NhdmVHbG9iYWxPcHRpb25zLDEKLURFQ0xBUkVfSU1QIEdBX2dldEludGVybmFsTmFtZSwxCi1ERUNMQVJFX0lNUCBHQV9nZXROdWNsZXVzQ29uZmlnUGF0aCwwCi1ERUNMQVJFX0lNUCBHQV9nZXRGYWtlUENJSUQsMAotU0tJUF9JTVAgICAgR0FfbG9hZExpYnJhcnksMyAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotU0tJUF9JTVAgICAgR0FfaXNPRU1WZXJzaW9uLDEgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotREVDTEFSRV9JTVAgR0FfaXNMaXRlVmVyc2lvbiwxCi1ERUNMQVJFX0lNUCBHQV9nZXREaXNwbGF5U2VyaWFsTm8sMQotREVDTEFSRV9JTVAgR0FfZ2V0RGlzcGxheVVzZXJOYW1lLDEKLVNLSVBfSU1QICAgIEdBX2dldEN1cnJlbnREcml2ZXIsMSAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2dldEN1cnJlbnRSZWYyZCwxICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2dldExpY2Vuc2VkRGV2aWNlcywxICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLURFQ0xBUkVfSU1QIEREQ19pbml0RXh0LDIKLURFQ0xBUkVfSU1QIE1DU19iZWdpbkV4dCwyCi1ERUNMQVJFX0lNUCBHQV9sb2FkUmVnaW9uTWdyLDMKLURFQ0xBUkVfSU1QIEdBX3VubG9hZFJlZ2lvbk1nciwxCi1ERUNMQVJFX0lNUCBHQV9nZXRQcm9jQWRkcmVzcywyCi1ERUNMQVJFX0lNUCBHQV9lbmFibGVWQkVNb2RlLDUKLURFQ0xBUkVfSU1QIEdBX2Rpc2FibGVWQkVNb2RlLDUKLURFQ0xBUkVfSU1QIEdBX2xvYWRNb2RlUHJvZmlsZSwyCi1ERUNMQVJFX0lNUCBHQV9nZXRDUlRDVGltaW5ncyw0Ci1ERUNMQVJFX0lNUCBHQV9zZXRDUlRDVGltaW5ncyw0Ci1ERUNMQVJFX0lNUCBHQV9zZXREZWZhdWx0UmVmcmVzaCw2Ci1ERUNMQVJFX0lNUCBHQV9zYXZlTW9uaXRvckluZm8sMgotREVDTEFSRV9JTVAgR0FfZGV0ZWN0UG5QTW9uaXRvciwzCi1TS0lQX0lNUDMgICBHQV9xdWVyeUZ1bmN0aW9ucwotU0tJUF9JTVAzICAgUkVGMkRfcXVlcnlGdW5jdGlvbnMKLUVORF9JTVBPUlRTX0RFRgotCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2dhdGltZXIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYXRpbWVyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5NGE2Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2dhdGltZXIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi07KgotOyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci07KiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotOyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotOyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLTsqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci07KiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci07KiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotOyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLTsqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgTkFTTSBvciBUQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibHkgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBOdWNsZXVzIGxpYnJhcnkgZm9yCi07KiAgICAgICAgICAgICAgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1pbmcgc3VwcG9ydCBmdW5jdGlvbnMgcHJvdmlkZWQgYnkKLTsqICAgICAgICAgICAgICB0aGUgSW50ZWwgUGVudGl1bSBhbmQgY29tcGF0aWJsZSBwcm9jZXNzb3JzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICBfZ2F0aW1lcgotCi1iZWdjb2Rlc2VnICBfZ2F0aW1lcgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gbUNQVV9JRCAwCi1kYiAgMDBGaCwwQTJoCi0lZW5kbWFjcm8KLWVsc2UKLU1BQ1JPICAgbUNQVV9JRAotZGIgIDAwRmgsMEEyaAotRU5ETQotZW5kaWYKLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvIG1SRFRTQyAwCi1kYiAgMDBGaCwwMzFoCi0lZW5kbWFjcm8KLWVsc2UKLU1BQ1JPICAgbVJEVFNDCi1kYiAgMDBGaCwwMzFoCi1FTkRNCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBib29sIF9HQV9oYXZlQ1BVSUQodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgaWYgd2UgaGF2ZSBzdXBwb3J0IGZvciB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0dBX2hhdmVDUFVJRAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG9yaWdpbmFsIEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBtb3YgICAgIGVjeCwgZWF4Ci0gICAgICAgIHhvciAgICAgZWF4LCAyMDAwMDBoICAgICAgICA7IEZsaXAgSUQgYml0IGluIEVGTEFHUwotICAgICAgICBwdXNoICAgIGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKLSAgICAgICAgcG9wZmQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgbmV3IEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBTdG9yZSBuZXcgRUZMQUdTIGluIEVBWAotICAgICAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICAgICAgOyBDYW4gbm90IHRvZ2dsZSBJRCBiaXQsCi0gICAgICAgIGpueiAgICAgQEAxICAgICAgICAgICAgICAgICA7IFByb2Nlc3Nvcj04MDQ4NgotICAgICAgICBtb3YgICAgIGVheCwwICAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgQ1BVSUQgc3VwcG9ydAotICAgICAgICBqbXAgICAgIEBARG9uZQotQEAxOiAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgOyBXZSBoYXZlIENQVUlEIHN1cHBvcnQKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWludCBfR0FfZ2V0Q1BVSURGZWF0dXJlcyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyB0aGUgQ1BVIHR5cGUgdXNpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9HQV9nZXRDUFVJREZlYXR1cmVzCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAotICAgICAgICBjbXAgICAgIGVheCwgMSAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMSBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKLSAgICAgICAgamwgICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICB4b3IgICAgIGVheCwgZWF4Ci0gICAgICAgIGluYyAgICAgZWF4Ci0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKLSAgICAgICAgbW92ICAgICBlYXgsIGVkeAotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICBqbXAgICAgIEBARG9uZQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkICBfR0FfcmVhZFRpbWVTdGFtcChHQV9sYXJnZUludGVnZXIgKnRpbWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyB0aGUgdGltZSBzdGFtcCBjb3VudGVyIGFuZCByZXR1cm5zIHRoZSA2NC1iaXQgcmVzdWx0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9HQV9yZWFkVGltZVN0YW1wCi0KLSAgICAgICAgbVJEVFNDCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArNF0gICAgIDsgQWNjZXNzIGRpcmVjdGx5IHdpdGhvdXQgc3RhY2sgZnJhbWUKLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTl91aW50MzIgR0FfVGltZXJEaWZmZXJlbmNlKEdBX2xhcmdlSW50ZWdlciAqYSxHQV9sYXJnZUludGVnZXIgKmIpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byA2NC1iaXQgbnVtYmVycyAoYS1iKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEdBX1RpbWVyRGlmZmVyZW5jZQotCi0gICAgICAgIEFSRyAgICAgYTpEUFRSLCBiOkRQVFIsIHQ6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVjeCxbYV0KLSAgICAgICAgbW92ICAgICBlYXgsW2VjeF0gICAgICAgOyBFQVggOj0gYi5sb3cKLSAgICAgICAgbW92ICAgICBlY3gsW2JdCi0gICAgICAgIHN1YiAgICAgZWF4LFtlY3hdCi0gICAgICAgIG1vdiAgICAgZWR4LGVheCAgICAgICAgIDsgRURYIDo9IGxvdyBkaWZmZXJlbmNlCi0gICAgICAgIG1vdiAgICAgZWN4LFthXQotICAgICAgICBtb3YgICAgIGVheCxbZWN4KzRdICAgICA7IEVDWCA6PSBiLmhpZ2gKLSAgICAgICAgbW92ICAgICBlY3gsW2JdCi0gICAgICAgIHNiYiAgICAgZWF4LFtlY3grNF0gICAgIDsgRUFYIDo9IGhpZ2ggZGlmZmVyZW5jZQotICAgICAgICBtb3YgICAgIGVheCxlZHggICAgICAgICA7IFJldHVybiBsb3cgcGFydAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVlfVElNRVIgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZX1RJTUVSCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9PU19kZWxheTgyNTMoTl91aW50MzIgbWljcm9TZWNvbmRzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERlbGF5cyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzLCBieSBkaXJlY3RseSBwcm9ncmFtbWluZwotOyB0aGUgODI1MyB0aW1lciBjaGlwcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfT1NfZGVsYXk4MjUzCi0KLSAgICAgICAgQVJHICAgICBtaWNyb1NlYzpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotCi07IFN0YXJ0IHRpbWVyIDIgY291bnRpbmcKLQotICAgICAgICBtb3YgICAgIF9heCxbbWljcm9TZWNdICAgICAgOyBFQVggOj0gY291bnQgaW4gbWljcm9zZWNvbmRzCi0gICAgICAgIG1vdiAgICAgZWN4LDExOTYKLSAgICAgICAgbXVsICAgICBlY3gKLSAgICAgICAgbW92ICAgICBlY3gsMTAwMAotICAgICAgICBkaXYgICAgIGVjeAotICAgICAgICBtb3YgICAgIGVjeCxlYXggICAgICAgICAgICAgOyBFQ1ggOj0gY291bnQgaW4gdGltZXIgdGlja3MKLSAgICAgICAgaW4gICAgICBhbCw2MWgKLSAgICAgICAgb3IgICAgICBhbCwxCi0gICAgICAgIG91dCAgICAgNjFoLGFsCi0KLTsgU2V0IHRoZSB0aW1lciAyIGNvdW50IHRvIDAgYWdhaW4gdG8gc3RhcnQgdGhlIHRpbWluZyBpbnRlcnZhbC4KLQotICAgICAgICBtb3YgICAgIGFsLDEwMTEwMTAwYiAgICAgICAgOyBzZXQgdXAgdG8gbG9hZCBpbml0aWFsICh0aW1lciAyKQotICAgICAgICBvdXQgICAgIDQzaCxhbCAgICAgICAgICAgICAgOyB0aW1lciBjb3VudAotICAgICAgICBERUxBWV9USU1FUgotICAgICAgICBzdWIgICAgIGFsLGFsCi0gICAgICAgIG91dCAgICAgNDJoLGFsICAgICAgICAgICAgICA7IGxvYWQgY291bnQgbHNiCi0gICAgICAgIERFTEFZX1RJTUVSCi0gICAgICAgIG91dCAgICAgNDJoLGFsICAgICAgICAgICAgICA7IGxvYWQgY291bnQgbXNiCi0gICAgICAgIHhvciAgICAgZGksZGkgICAgICAgICAgICAgICA7IEFsbG93IG1heCA2NEsgbG9vcCBpdGVyYXRpb25zCi0KLUBATG9vcFN0YXJ0OgotICAgICAgICBkZWMgICAgIGRpICAgICAgICAgICAgICAgICAgOyBUaGlzIGlzIGEgZ3VhcmQgYWdhaW5zdCB0aGUgcG9zc2liaWxpdHkgdGhhdAotICAgICAgICBqeiAgICAgIEBATG9vcEVuZCAgICAgICAgICAgOyBzb21lb25lIGVnLiBzdG9wcGVkIHRoZSB0aW1lciBiZWhpbmQgb3VyIGJhY2suCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEFmdGVyIDY0SyBpdGVyYXRpb25zIHdlIGJhaWwgb3V0IG5vIG1hdHRlciB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IChhbmQgaG9wZSBpdCB3YXNuJ3QgdG9vIHNvb24pCi0gICAgICAgIG1vdiAgICAgYWwsMDAwMDAwMDBiICAgICAgICA7IGxhdGNoIHRpbWVyIDAKLSAgICAgICAgb3V0ICAgICA0M2gsYWwKLSAgICAgICAgREVMQVlfVElNRVIKLSAgICAgICAgaW4gICAgICBhbCw0MmggICAgICAgICAgICAgIDsgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICBERUxBWV9USU1FUgotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIGluICAgICAgYWwsNDJoICAgICAgICAgICAgICA7IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICB4Y2hnICAgIGFoLGFsCi0gICAgICAgIG5lZyAgICAgYXggICAgICAgICAgICAgICAgICA7IENvbnZlcnQgZnJvbSBjb3VudGRvd24gcmVtYWluaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICB0byBlbGFwc2VkIGNvdW50Ci0gICAgICAgIGNtcCAgICAgYXgsY3ggICAgICAgICAgICAgICA7IEhhcyBkZWxheSBleHBpcmVkPwotICAgICAgICBqYiAgICAgIEBATG9vcFN0YXJ0ICAgICAgICAgOyBObywgc28gbG9vcCB0aWxsIGRvbmUKLQotOyBTdG9wIHRpbWVyIDIgZnJvbSBjb3VudGluZwotQEBMb29wRW5kOgotICAgICAgICBpbiAgICAgIGFsLDYxSAotICAgICAgICBhbmQgICAgIGFsLDBGRWgKLSAgICAgICAgb3V0ICAgICA2MUgsYWwKLQotOyBTb21lIHByb2dyYW1zIGhhdmUgYSBwcm9ibGVtIGlmIHdlIGNoYW5nZSB0aGUgY29udHJvbCBwb3J0OyBiZXR0ZXIgY2hhbmdlIGl0Ci07IHRvIHNvbWV0aGluZyB0aGV5IGV4cGVjdCAobW9kZSAzIC0gc3F1YXJlIHdhdmUgZ2VuZXJhdG9yKS4uLgotICAgICAgICBtb3YgICAgIGFsLDBCNmgKLSAgICAgICAgb3V0ICAgICA0M2gsYWwKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfZ2F0aW1lcgotCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX3BtX2ltcC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX3BtX2ltcC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjExNzkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19wbV9pbXAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotOyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLTsqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLTsqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci07KiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotOyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotOyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLTsqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci07KiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KLTsqCi07KiBEZXNjcmlwdGlvbjogTW9kdWxlIHRvIGltcGxlbWVudCB0aGUgaW1wb3J0IHN0dWJzIGZvciBhbGwgdGhlIFBNCi07KiAgICAgICAgICAgICAgQVBJIGZ1bmN0aW9ucyBmb3IgSW50ZWwgYmluYXJ5IHBvcnRhYmxlIGRyaXZlcnMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1CRUdJTl9JTVBPUlRTX0RFRiAgIF9QTV9pbXBvcnRzCi1ERUNMQVJFX0lNUCBQTV9nZXRNb2RlVHlwZSwwCi1ERUNMQVJFX0lNUCBQTV9nZXRCSU9TUG9pbnRlciwwCi1ERUNMQVJFX0lNUCBQTV9nZXRBMDAwMFBvaW50ZXIsMAotREVDTEFSRV9JTVAgUE1fbWFwUGh5c2ljYWxBZGRyLDAKLURFQ0xBUkVfSU1QIFBNX21hbGxvY1NoYXJlZCwwCi1TS0lQX0lNUCAgICBfUE1fcmVzZXJ2ZWQxLDAKLURFQ0xBUkVfSU1QIFBNX2ZyZWVTaGFyZWQsMAotREVDTEFSRV9JTVAgUE1fbWFwVG9Qcm9jZXNzLDAKLURFQ0xBUkVfSU1QIFBNX21hcFJlYWxQb2ludGVyLDAKLURFQ0xBUkVfSU1QIFBNX2FsbG9jUmVhbFNlZywwCi1ERUNMQVJFX0lNUCBQTV9mcmVlUmVhbFNlZywwCi1ERUNMQVJFX0lNUCBQTV9hbGxvY0xvY2tlZE1lbSwwCi1ERUNMQVJFX0lNUCBQTV9mcmVlTG9ja2VkTWVtLDAKLURFQ0xBUkVfSU1QIFBNX2NhbGxSZWFsTW9kZSwwCi1ERUNMQVJFX0lNUCBQTV9pbnQ4NiwwCi1ERUNMQVJFX0lNUCBQTV9pbnQ4NngsMAotREVDTEFSRV9JTVAgRFBNSV9pbnQ4NiwwCi1ERUNMQVJFX0lNUCBQTV9hdmFpbGFibGVNZW1vcnksMAotREVDTEFSRV9JTVAgUE1fZ2V0VkVTQUJ1ZiwwCi1ERUNMQVJFX0lNUCBQTV9nZXRPU1R5cGUsMAotREVDTEFSRV9JTVAgUE1fZmF0YWxFcnJvciwwCi1ERUNMQVJFX0lNUCBQTV9zZXRCYW5rQSwwCi1ERUNMQVJFX0lNUCBQTV9zZXRCYW5rQUIsMAotREVDTEFSRV9JTVAgUE1fc2V0Q1JUU3RhcnQsMAotREVDTEFSRV9JTVAgUE1fZ2V0Q3VycmVudFBhdCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRWQkVBRlBhdGgsMAotREVDTEFSRV9JTVAgUE1fZ2V0TnVjbGV1c1BhdGgsMAotREVDTEFSRV9JTVAgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgsMAotREVDTEFSRV9JTVAgUE1fZ2V0VW5pcXVlSUQsMAotREVDTEFSRV9JTVAgUE1fZ2V0TWFjaGluZU5hbWUsMAotREVDTEFSRV9JTVAgVkZfYXZhaWxhYmxlLDAKLURFQ0xBUkVfSU1QIFZGX2luaXQsMAotREVDTEFSRV9JTVAgVkZfZXhpdCwwCi1ERUNMQVJFX0lNUCBQTV9vcGVuQ29uc29sZSwwCi1ERUNMQVJFX0lNUCBQTV9nZXRDb25zb2xlU3RhdGVTaXplLDAKLURFQ0xBUkVfSU1QIFBNX3NhdmVDb25zb2xlU3RhdGUsMAotREVDTEFSRV9JTVAgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSwwCi1ERUNMQVJFX0lNUCBQTV9jbG9zZUNvbnNvbGUsMAotREVDTEFSRV9JTVAgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbiwwCi1ERUNMQVJFX0lNUCBQTV9zZXRPU1NjcmVlbldpZHRoLDAKLURFQ0xBUkVfSU1QIFBNX2VuYWJsZVdyaXRlQ29tYmluZSwwCi1ERUNMQVJFX0lNUCBQTV9iYWNrc2xhc2gsMAotREVDTEFSRV9JTVAgUE1fbG9ja0RhdGFQYWdlcywwCi1ERUNMQVJFX0lNUCBQTV91bmxvY2tEYXRhUGFnZXMsMAotREVDTEFSRV9JTVAgUE1fbG9ja0NvZGVQYWdlcywwCi1ERUNMQVJFX0lNUCBQTV91bmxvY2tDb2RlUGFnZXMsMAotREVDTEFSRV9JTVAgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIsMAotREVDTEFSRV9JTVAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSwwCi1ERUNMQVJFX0lNUCBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIsMAotREVDTEFSRV9JTVAgUE1fZG9CSU9TUE9TVCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRCb290RHJpdmUsMAotREVDTEFSRV9JTVAgUE1fZnJlZVBoeXNpY2FsQWRkciwwCi1ERUNMQVJFX0lNUCBQTV9pbnBiLDAKLURFQ0xBUkVfSU1QIFBNX2lucHcsMAotREVDTEFSRV9JTVAgUE1faW5wZCwwCi1ERUNMQVJFX0lNUCBQTV9vdXRwYiwwCi1ERUNMQVJFX0lNUCBQTV9vdXRwdywwCi1ERUNMQVJFX0lNUCBQTV9vdXRwZCwwCi1TS0lQX0lNUCAgICBfUE1fcmVzZXJ2ZWQyLDAKLURFQ0xBUkVfSU1QIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjaywwCi1ERUNMQVJFX0lNUCBQTV9oYXZlQklPU0FjY2VzcywwCi1ERUNMQVJFX0lNUCBQTV9rYmhpdCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRjaCwwCi1ERUNMQVJFX0lNUCBQTV9maW5kQlBELDAKLURFQ0xBUkVfSU1QIFBNX2dldFBoeXNpY2FsQWRkciwwCi1ERUNMQVJFX0lNUCBQTV9zbGVlcCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRDT01Qb3J0LDAKLURFQ0xBUkVfSU1QIFBNX2dldExQVFBvcnQsMAotREVDTEFSRV9JTVAgUE1fbG9hZExpYnJhcnksMAotREVDTEFSRV9JTVAgUE1fZ2V0UHJvY0FkZHJlc3MsMAotREVDTEFSRV9JTVAgUE1fZnJlZUxpYnJhcnksMAotREVDTEFSRV9JTVAgUENJX2VudW1lcmF0ZSwwCi1ERUNMQVJFX0lNUCBQQ0lfYWNjZXNzUmVnLDAKLURFQ0xBUkVfSU1QIFBDSV9zZXRIYXJkd2FyZUlSUSwwCi1ERUNMQVJFX0lNUCBQQ0lfZ2VuZXJhdGVTcGVjaWFsQ3lsZSwwCi1TS0lQX0lNUCAgICBfUE1fcmVzZXJ2ZWQzLDAKLURFQ0xBUkVfSU1QIFBDSUJJT1NfZ2V0RW50cnksMAotREVDTEFSRV9JTVAgQ1BVX2dldFByb2Nlc3NvclR5cGUsMAotREVDTEFSRV9JTVAgQ1BVX2hhdmVNTVgsMAotREVDTEFSRV9JTVAgQ1BVX2hhdmUzRE5vdywwCi1ERUNMQVJFX0lNUCBDUFVfaGF2ZVNTRSwwCi1ERUNMQVJFX0lNUCBDUFVfaGF2ZVJEVFNDLDAKLURFQ0xBUkVfSU1QIENQVV9nZXRQcm9jZXNzb3JTcGVlZCwwCi1ERUNMQVJFX0lNUCBaVGltZXJJbml0LDAKLURFQ0xBUkVfSU1QIExaVGltZXJPbiwwCi1ERUNMQVJFX0lNUCBMWlRpbWVyTGFwLDAKLURFQ0xBUkVfSU1QIExaVGltZXJPZmYsMAotREVDTEFSRV9JTVAgTFpUaW1lckNvdW50LDAKLURFQ0xBUkVfSU1QIExaVGltZXJPbkV4dCwwCi1ERUNMQVJFX0lNUCBMWlRpbWVyTGFwRXh0LDAKLURFQ0xBUkVfSU1QIExaVGltZXJPZmZFeHQsMAotREVDTEFSRV9JTVAgTFpUaW1lckNvdW50RXh0LDAKLURFQ0xBUkVfSU1QIFVMWlRpbWVyT24sMAotREVDTEFSRV9JTVAgVUxaVGltZXJMYXAsMAotREVDTEFSRV9JTVAgVUxaVGltZXJPZmYsMAotREVDTEFSRV9JTVAgVUxaVGltZXJDb3VudCwwCi1ERUNMQVJFX0lNUCBVTFpSZWFkVGltZSwwCi1ERUNMQVJFX0lNUCBVTFpFbGFwc2VkVGltZSwwCi1ERUNMQVJFX0lNUCBVTFpUaW1lclJlc29sdXRpb24sMAotREVDTEFSRV9JTVAgUE1fZmluZEZpcnN0RmlsZSwwCi1ERUNMQVJFX0lNUCBQTV9maW5kTmV4dEZpbGUsMAotREVDTEFSRV9JTVAgUE1fZmluZENsb3NlLDAKLURFQ0xBUkVfSU1QIFBNX21ha2VwYXRoLDAKLURFQ0xBUkVfSU1QIFBNX3NwbGl0cGF0aCwwCi1ERUNMQVJFX0lNUCBQTV9kcml2ZVZhbGlkLDAKLURFQ0xBUkVfSU1QIFBNX2dldGRjd2QsMAotREVDTEFSRV9JTVAgUE1fc2V0RmlsZUF0dHIsMAotREVDTEFSRV9JTVAgUE1fbWtkaXIsMAotREVDTEFSRV9JTVAgUE1fcm1kaXIsMAotREVDTEFSRV9JTVAgUE1fZ2V0RmlsZUF0dHIsMAotREVDTEFSRV9JTVAgUE1fZ2V0RmlsZVRpbWUsMAotREVDTEFSRV9JTVAgUE1fc2V0RmlsZVRpbWUsMAotREVDTEFSRV9JTVAgQ1BVX2dldFByb2Nlc3Nvck5hbWUsMAotREVDTEFSRV9JTVAgUE1fZ2V0VkdBU3RhdGVTaXplLDAKLURFQ0xBUkVfSU1QIFBNX3NhdmVWR0FTdGF0ZSwwCi1ERUNMQVJFX0lNUCBQTV9yZXN0b3JlVkdBU3RhdGUsMAotREVDTEFSRV9JTVAgUE1fdmdhQmxhbmtEaXNwbGF5LDAKLURFQ0xBUkVfSU1QIFBNX3ZnYVVuYmxhbmtEaXNwbGF5LDAKLURFQ0xBUkVfSU1QIFBNX2Jsb2NrVW50aWxUaW1lb3V0LDAKLURFQ0xBUkVfSU1QIF9QTV9hZGQ2NCwwCi1ERUNMQVJFX0lNUCBfUE1fc3ViNjQsMAotREVDTEFSRV9JTVAgX1BNX211bDY0LDAKLURFQ0xBUkVfSU1QIF9QTV9kaXY2NCwwCi1ERUNMQVJFX0lNUCBfUE1fc2hyNjQsMAotREVDTEFSRV9JTVAgX1BNX3NhcjY0LDAKLURFQ0xBUkVfSU1QIF9QTV9zaGw2NCwwCi1ERUNMQVJFX0lNUCBfUE1fbmVnNjQsMAotREVDTEFSRV9JTVAgUENJX2ZpbmRCQVJTaXplLDAKLURFQ0xBUkVfSU1QIFBDSV9yZWFkUmVnQmxvY2ssMAotREVDTEFSRV9JTVAgUENJX3dyaXRlUmVnQmxvY2ssMAotREVDTEFSRV9JTVAgUE1fZmx1c2hUTEIsMAotREVDTEFSRV9JTVAgUE1fdXNlTG9jYWxNYWxsb2MsMAotREVDTEFSRV9JTVAgUE1fbWFsbG9jLDAKLURFQ0xBUkVfSU1QIFBNX2NhbGxvYywwCi1ERUNMQVJFX0lNUCBQTV9yZWFsbG9jLDAKLURFQ0xBUkVfSU1QIFBNX2ZyZWUsMAotREVDTEFSRV9JTVAgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UsMAotREVDTEFSRV9JTVAgUE1fYWxsb2NQYWdlLDAKLURFQ0xBUkVfSU1QIFBNX2ZyZWVQYWdlLDAKLURFQ0xBUkVfSU1QIFBNX2FncEluaXQsMAotREVDTEFSRV9JTVAgUE1fYWdwRXhpdCwwCi1ERUNMQVJFX0lNUCBQTV9hZ3BSZXNlcnZlUGh5c2ljYWwsMAotREVDTEFSRV9JTVAgUE1fYWdwUmVsZWFzZVBoeXNpY2FsLDAKLURFQ0xBUkVfSU1QIFBNX2FncENvbW1pdFBoeXNpY2FsLDAKLURFQ0xBUkVfSU1QIFBNX2FncEZyZWVQaHlzaWNhbCwwCi1ERUNMQVJFX0lNUCBQQ0lfZ2V0TnVtRGV2aWNlcywwCi1ERUNMQVJFX0lNUCBQTV9zZXRMb2NhbEJQRFBhdGgsMAotREVDTEFSRV9JTVAgUE1fbG9hZERpcmVjdERyYXcsMAotREVDTEFSRV9JTVAgUE1fdW5sb2FkRGlyZWN0RHJhdywwCi1ERUNMQVJFX0lNUCBQTV9nZXREaXJlY3REcmF3V2luZG93LDAKLURFQ0xBUkVfSU1QIFBNX2RvU3VzcGVuZEFwcCwwCi1FTkRfSU1QT1JUU19ERUYKLQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhYmVvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhYmVvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDU2OThhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWJlb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgKHZvaWQpZGV2aWNlOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlIHsKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCWdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0JdmFsdWUtPmxvdyA9IHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Ci0JdmFsdWUtPmhpZ2ggPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWRvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmQyZjMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE1TRE9TCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIE1TRE9TIG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUgRE9TCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGliLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwM2IyMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBBdWRpbyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55IDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBlbnZpcm9ubWVudAotKgotKiBEZXNjcmlwdGlvbjogIEMgbW9kdWxlIGZvciB0aGUgR3JhcGhpY3MgQWNjZWxlcmF0b3IgRHJpdmVyIEFQSS4gVXNlcwotKiAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFBNIGxpYnJhcnkgZm9yIGludGVyZmFjaW5nIHdpdGggRE9TCi0qICAgICAgICAgICAgICAgZXh0ZW5kZXIgc3BlY2lmaWMgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvYXVkaW8uaCIKLSNpZmRlZiBfX1dJTjMyX1ZYRF9fCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIFRFU1RfSEFSTkVTUwotZXh0ZXJuIFBNX2ltcG9ydHMgICBfVkFSQVBJIF9QTV9pbXBvcnRzOwotI2Vsc2UKLUFBX2V4cG9ydHMgIF9WQVJBUEkgX0FBX2V4cG9ydHM7Ci1zdGF0aWMgaW50ICAgICAgICAgIGxvYWRlZCA9IGZhbHNlOwotc3RhdGljIFBFX01PRFVMRSAgICAqaE1vZEJQRCA9IE5VTEw7Ci0KLSNpZmRlZiAgX19EUklWRVJfXwotZXh0ZXJuIFBNX2ltcG9ydHMgX1BNX2ltcG9ydHM7Ci0jZWxzZQotI2luY2x1ZGUgInBtaW1wLmgiCi0jZW5kaWYKLQotc3RhdGljIE5faW1wb3J0cyBfTl9pbXBvcnRzID0gewotICAgIHNpemVvZihOX2ltcG9ydHMpLAotICAgIF9PU19kZWxheSwKLSAgICB9OwotCi0jaWZkZWYgIF9fRFJJVkVSX18KLWV4dGVybiBBQV9pbXBvcnRzIF9BQV9pbXBvcnRzOwotI2Vsc2UKLXN0YXRpYyBBQV9pbXBvcnRzIF9BQV9pbXBvcnRzID0gewotICAgIHNpemVvZihBQV9pbXBvcnRzKSwKLSAgICB9OwotI2VuZGlmCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBETExfTkFNRSAgICAgICAgImF1ZGlvLmJwZCIKLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmF0YWwgZXJyb3IgaGFuZGxlciBmb3Igbm9uLWV4cG9ydGVkIEFBX2V4cG9ydHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0FBX2ZhdGFsRXJyb3JIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5zdXBwb3J0ZWQgTnVjbGV1cyBleHBvcnQgZnVuY3Rpb24gY2FsbGVkISBQbGVhc2UgdXBncmFkZSB5b3VyIGNvcHkgb2YgTnVjbGV1cyFcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvYWRzIHRoZSBOdWNsZXVzIGJpbmFyeSBwb3J0YWJsZSBETEwgaW50byBtZW1vcnkgYW5kIGluaXRpbGlzZXMgaXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIExvYWREcml2ZXIodm9pZCkKLXsKLSAgICBBQV9pbml0TGlicmFyeV90ICAgIEFBX2luaXRMaWJyYXJ5OwotICAgIEFBX2V4cG9ydHMgICAgICAgICAgKmFhRXhwOwotICAgIGNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgICAgICAgICAgICAgYnBkcGF0aFtQTV9NQVhfUEFUSF07Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpLG1heDsKLSAgICB1bG9uZyAgICAgICAgICAgICAgICpwOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCB0aGUgZHJpdmVyICovCi0gICAgaWYgKGxvYWRlZCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICBQTV9pbml0KCk7Ci0gICAgX0FBX2V4cG9ydHMuZHdTaXplID0gc2l6ZW9mKF9BQV9leHBvcnRzKTsKLQotICAgIC8qIE9wZW4gdGhlIEJQRCBmaWxlICovCi0gICAgaWYgKCFQTV9maW5kQlBEKERMTF9OQU1FLGJwZHBhdGgpKQotCXJldHVybiBmYWxzZTsKLSAgICBzdHJjcHkoZmlsZW5hbWUsYnBkcGF0aCk7Ci0gICAgc3RyY2F0KGZpbGVuYW1lLERMTF9OQU1FKTsKLSAgICBpZiAoKGhNb2RCUEQgPSBQRV9sb2FkTGlicmFyeShmaWxlbmFtZSxmYWxzZSkpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICgoQUFfaW5pdExpYnJhcnkgPSAoQUFfaW5pdExpYnJhcnlfdClQRV9nZXRQcm9jQWRkcmVzcyhoTW9kQlBELCJfQUFfaW5pdExpYnJhcnkiKSkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgYnBkcGF0aFtzdHJsZW4oYnBkcGF0aCktMV0gPSAwOwotICAgIGlmIChzdHJjbXAoYnBkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKSA9PSAwKQotCXN0cmNweShicGRwYXRoLFBNX2dldE51Y2xldXNDb25maWdQYXRoKCkpOwotICAgIGVsc2UgewotCVBNX2JhY2tzbGFzaChicGRwYXRoKTsKLQlzdHJjYXQoYnBkcGF0aCwiY29uZmlnIik7Ci0JfQotICAgIGlmICgoYWFFeHAgPSBBQV9pbml0TGlicmFyeShicGRwYXRoLGZpbGVuYW1lLCZfUE1faW1wb3J0cywmX05faW1wb3J0cywmX0FBX2ltcG9ydHMpKSA9PSBOVUxMKQotCVBNX2ZhdGFsRXJyb3IoIkFBX2luaXRMaWJyYXJ5IGZhaWxlZCFcbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbGwgZGVmYXVsdCBpbXBvcnRzIHRvIHBvaW50IHRvIGZhdGFsIGVycm9yIGhhbmRsZXIKLSAgICAgKiBmb3IgdXB3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQgY29weSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLgotICAgICAqLwotICAgIG1heCA9IHNpemVvZihfQUFfZXhwb3J0cykvc2l6ZW9mKEFBX2luaXRMaWJyYXJ5X3QpOwotICAgIGZvciAoaSA9IDAscCA9ICh1bG9uZyopJl9BQV9leHBvcnRzOyBpIDwgbWF4OyBpKyspCi0JKnArKyA9ICh1bG9uZylfQUFfZmF0YWxFcnJvckhhbmRsZXI7Ci0gICAgbWVtY3B5KCZfQUFfZXhwb3J0cyxhYUV4cCxNSU4oc2l6ZW9mKF9BQV9leHBvcnRzKSxhYUV4cC0+ZHdTaXplKSk7Ci0gICAgbG9hZGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgc3R1YiBlbnRyeSBwb2ludHMgdGhhdCB0aGUgYXBwbGljYXRpb24gY2FsbHMgdG8KLSAqIGluaXRpYWxpc2UgdGhlIE51Y2xldXMgbG9hZGVyIGxpYnJhcnksIGFuZCB3ZSB1c2UgdGhpcyB0byBsb2FkIG91cgotICogZHJpdmVyIERMTCBmcm9tIGRpc2sgYW5kIGluaXRpYWxpc2UgdGhlIGxpYnJhcnkgdXNpbmcgaXQuCi0gKi8KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEFBX3N0YXR1cyh2b2lkKQotewotICAgIGlmICghbG9hZGVkKQotCXJldHVybiBuRHJpdmVyTm90Rm91bmQ7Ci0gICAgcmV0dXJuIF9BQV9leHBvcnRzLkFBX3N0YXR1cygpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotY29uc3QgY2hhciAqIE5BUEkgQUFfZXJyb3JNc2coCi0gICAgTl9pbnQzMiBzdGF0dXMpCi17Ci0gICAgaWYgKCFsb2FkZWQpCi0JcmV0dXJuICJVbmFibGUgdG8gbG9hZCBOdWNsZXVzIGRldmljZSBkcml2ZXIhIjsKLSAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfZXJyb3JNc2coc3RhdHVzKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEFBX2dldERheXNMZWZ0KHZvaWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKCkpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiBfQUFfZXhwb3J0cy5BQV9nZXREYXlzTGVmdCgpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgQUFfcmVnaXN0ZXJMaWNlbnNlKHVjaGFyICpsaWNlbnNlKQotewotICAgIGlmICghTG9hZERyaXZlcigpKQotCXJldHVybiAwOwotICAgIHJldHVybiBfQUFfZXhwb3J0cy5BQV9yZWdpc3RlckxpY2Vuc2UobGljZW5zZSk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBBQV9lbnVtZXJhdGVEZXZpY2VzKHZvaWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIF9BQV9leHBvcnRzLkFBX2VudW1lcmF0ZURldmljZXMoKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLUFBX2RldkN0eCAqIE5BUEkgQUFfbG9hZERyaXZlcihOX2ludDMyIGRldmljZUluZGV4KQotewotICAgIGlmICghTG9hZERyaXZlcigpKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiBfQUFfZXhwb3J0cy5BQV9sb2FkRHJpdmVyKGRldmljZUluZGV4KTsKLX0KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTl91aW50MzIgICAgbG93OwotICAgIE5fdWludDMyICAgIGhpZ2g7Ci0gICAgfSBBQV9sYXJnZUludGVnZXI7Ci0KLXZvaWQgICAgTkFQSSBfT1NfZGVsYXk4MjUzKE5fdWludDMyIG1pY3JvU2Vjb25kcyk7Ci1pYm9vbCAgIE5BUEkgX0dBX2hhdmVDUFVJRCh2b2lkKTsKLXVpbnQgICAgTkFQSSBfR0FfZ2V0Q1BVSURGZWF0dXJlcyh2b2lkKTsKLXZvaWQgICAgTkFQSSBfR0FfcmVhZFRpbWVTdGFtcChBQV9sYXJnZUludGVnZXIgKnRpbWUpOwotI2RlZmluZSBDUFVfSGF2ZVJEVFNDICAgMHgwMDAwMDAxMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGVsYXlzIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWNyb3NlY29uZHMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgX09TX2RlbGF5KAotICAgIE5fdWludDMyIG1pY3JvU2Vjb25kcykKLXsKLSAgICBzdGF0aWMgaWJvb2wgICAgaW5pdGVkID0gZmFsc2U7Ci0gICAgTFpUaW1lck9iamVjdCAgIHRtOwotCi0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQlpZiAoIWluaXRlZCkgewotCSAgICBaVGltZXJJbml0KCk7Ci0JICAgIGluaXRlZCA9IHRydWU7Ci0JICAgIH0KLQlMWlRpbWVyT25FeHQoJnRtKTsKLQl3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9TZWNvbmRzKQotCSAgICA7Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0JfQotICAgIGVsc2UKLQlfT1NfZGVsYXk4MjUzKG1pY3JvU2Vjb25kcyk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaW51eC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkNDY4ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgICh2b2lkKWRldmljZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwKQotewotICAgICh2b2lkKWdhRXhwOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkKLQloYXZlUkRUU0MgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZSB7Ci0Jc3RydWN0IHRpbWV2YWwgdDsKLQlnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotCXZhbHVlLT5sb3cgPSB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFvczIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYW9zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWM4YzlmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYW9zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgT1MvMiAzMi1iaXQKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgT1MvMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfU1VCCi0jZGVmaW5lIElOQ0xfVklPCi0jZGVmaW5lIElOQ0xfS0JECi0jaW5jbHVkZSA8b3MyLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBIRklMRSAgICAgICAgaFNEREhlbHA7Ci1zdGF0aWMgdWxvbmcgICAgICAgIG91dExlbjsgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotc3RhdGljIHVsb25nICAgICAgICByZXN1bHQ7ICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbW1vbiBncmFwaGljcyBkcml2ZXIgbG9hZGVkIGluIHRoZQotaGVscGVyIFZ4RC4gVGhlIG1lbW9yeSBmb3IgdGhlIFZ4RCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgcHJvY2Vzc2VzIHZpYQotdGhlIFZ4RCwgc28gdGhhdCB0aGUgVnhELCAxNi1iaXQgY29kZSBhbmQgMzItYml0IGNvZGUgYWxsIHNlZSB0aGUgc2FtZQotc3RhdGUgd2hlbiBhY2Nlc3NpbmcgdGhlIGdyYXBoaWNzIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgIC8qIEluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgYW5kIGNvbm5lY3QgdG8gb3VyIHJ1bnRpbWUgRExMJ3MgKi8KLSAgICBQTV9pbml0KCk7Ci0KLSAgICAvKiBPcGVuIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlciAqLwotICAgIGlmIChEb3NPcGVuKFBNSEVMUF9OQU1FLCZoU0RESGVscCwmcmVzdWx0LDAsMCwKLQkgICAgRklMRV9PUEVOLCBPUEVOX1NIQVJFX0RFTllOT05FIHwgT1BFTl9BQ0NFU1NfUkVBRFdSSVRFLAotCSAgICBOVUxMKSkKLQlQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBTRERIRUxQJCBoZWxwZXIgZGV2aWNlIGRyaXZlciEiKTsKLSAgICBvdXRMZW4gPSBzaXplb2YocmVzdWx0KTsKLSAgICBEb3NEZXZJT0N0bChoU0RESGVscCxQTUhFTFBfSU9DVEwsUE1IRUxQX0dFVFNIQVJFRElORk8sCi0JTlVMTCwgMCwgTlVMTCwKLQkmcmVzdWx0LCBvdXRMZW4sICZvdXRMZW4pOwotICAgIERvc0Nsb3NlKGhTRERIZWxwKTsKLSAgICBpZiAocmVzdWx0KSB7Ci0JLyogV2UgaGF2ZSBmb3VuZCB0aGUgc2hhcmVkIE51Y2xldXMgcGFja2V0LiBCZWNhdXNlIG5vdCBhbGwgcHJvY2Vzc2VzCi0JICogbWFwIHRvIFNERFBNSS5ETEwsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd2UgY29ubmVjdCB0byB0aGlzCi0JICogRExMIHNvIHRoYXQgaXQgZ2V0cyBtYXBwZWQgaW50byBvdXIgYWRkcmVzcyBzcGFjZSAodGhhdCBpcwotCSAqIHdoZXJlIHRoZSBzaGFyZWQgTnVjbGV1cyBwYWNrZXQgaXMgbG9jYXRlZCkuIFNpbXBseSBkb2luZyBhCi0JICogRG9zTG9hZE1vZHVsZSBvbiBpdCBpcyBlbm91Z2ggZm9yIHRoaXMuCi0JICovCi0JSE1PRFVMRSBoTW9kU0REUE1JOwotCWNoYXIgICAgYnVmWzgwXTsKLQlEb3NMb2FkTW9kdWxlKChQU1opYnVmLHNpemVvZihidWYpLChQU1opIlNERFBNSS5ETEwiLCZoTW9kU0REUE1JKTsKLQl9Ci0gICAgcmV0dXJuIChHQV9zaGFyZWRJbmZvKilyZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlEb3NUbXJRdWVyeVRpbWUoKFFXT1JEKil2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFxbnguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXFueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzUzMWJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXFueC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlgKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgUU5YIG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotI2luY2x1ZGUgPHRpbWUuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlib29sICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UgewotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQotCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7Ci0JdmFsdWUtPmxvdyA9ICh0cy50dl9uc2VjIC8gMTAwMCArIHRzLnR2X3NlYyAqIDEwMDAwMDApOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFydHQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXJ0dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVhNjdhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXJ0dC5jCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBSVFRhcmdldC0zMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgICh2b2lkKWRldmljZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwKQotewotICAgICh2b2lkKWdhRXhwOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhc214LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFzbXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzMDYwZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFzbXguYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgc214MzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgc214MzIgcGxhdGZvcm0gLS0gbm8gdnhEIHN1cHBvcnQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhdnhkLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF2eGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxYjAyYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF2eGQuYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIFdpbjMyIFZ4RCdzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGludGVybmFsIHNoYXJlZCBpbmZvIHN0cnVjdHVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgc3RhdGljIEdBX3NoYXJlZEluZm8gc2hhcmVkID0gezAsLTF9OwotICAgIHJldHVybiAmc2hhcmVkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JaGF2ZVJEVFNDID0gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlCi0JVlREX0dldF9SZWFsX1RpbWUoJnZhbHVlLT5oaWdoLCZ2YWx1ZS0+bG93KTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXdpbjMyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF3aW4zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDFkZjRhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXdpbjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBTVFJJQ1QKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIEdBX01BWF9ERVZJQ0VTID4gNAotI2Vycm9yIEdBX01BWF9ERVZJQ0VTIGhhcyBjaGFuZ2VkIQotI2VuZGlmCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLXN0YXRpYyBHQV9sYXJnZUludGVnZXIgIGNvdW50RnJlcTsKLXN0YXRpYyBHQV9sb2FkRHJpdmVyX3QgIE9SR19HQV9sb2FkRHJpdmVyOwotZXh0ZXJuIEhBTkRMRSAgICAgICAgICAgX1BNX2hEZXZpY2U7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUdldCB0aGUgY3VycmVudCBncmFwaGljcyBkcml2ZXIgaW1wb3J0cyBmcm9tIHRoZSBWeEQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbW1vbiBncmFwaGljcyBkcml2ZXIgbG9hZGVkIGluIHRoZQotaGVscGVyIFZ4RC4gVGhlIG1lbW9yeSBmb3IgdGhlIFZ4RCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgcHJvY2Vzc2VzIHZpYQotdGhlIFZ4RCwgc28gdGhhdCB0aGUgVnhELCAxNi1iaXQgY29kZSBhbmQgMzItYml0IGNvZGUgYWxsIHNlZSB0aGUgc2FtZQotc3RhdGUgd2hlbiBhY2Nlc3NpbmcgdGhlIGdyYXBoaWNzIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsyXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gZGV2aWNlOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRTSEFSRURJTkZPMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKSB7Ci0JcmV0dXJuIChHQV9zaGFyZWRJbmZvKilvdXRCdWZbMF07Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIHNvZnR3YXJlIHN0ZXJlbyBtb2R1bGUgYnkgZWl0aGVyIGNhbGxpbmcKLXRoZSBOdWNsZXVzIGxpYnJhcmllcyBkaXJlY3RseSwgb3IgY2FsbGluZyBpbnRvIHRoZSBWeEQgaWYgd2UgYXJlIHJ1bm5pbmcKLW9uIHRoZSBzaGFyZWQgTnVjbGV1cyBsaWJyYXJpZXMgbG9hZGVkIGJ5IHRoZSBXaW5kb3dzIFZ4RC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgTkFQSSBfR0Ffc29mdFN0ZXJlb0luaXQoCi0gICAgR0FfZGV2Q3R4ICpkYykKLXsKLSAgICBpZiAoX1BNX2hEZXZpY2UpIHsKLQlEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0JRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotCURXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotCWluQnVmWzBdID0gKHVsb25nKWRjOwotCWlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HQVNURVJFT0lOSVQzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JCW91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpIHsKLQkgICAgcmV0dXJuIG91dEJ1ZlswXTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB0dXJucyBvbiBzb2Z0d2FyZSBzdGVyZW8gbW9kZSwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9Pbih2b2lkKQotewotICAgIGlmIChfUE1faERldmljZSkgewotCURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPT04zMiwgTlVMTCwgMCwKLQkgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc2NoZWR1bGVzIGEgc29mdHdhcmUgc3RlcmVvIG1vZGUgcGFnZSBmbGlwLCBlaXRoZXIgZGlyZWN0bHkKLW9yIHZpYSB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9TY2hlZHVsZUZsaXAoCi0gICAgTl91aW50MzIgbGVmdEFkZHIsCi0gICAgTl91aW50MzIgcmlnaHRBZGRyKQotewotICAgIGlmIChfUE1faERldmljZSkgewotCURXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLQlEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLQlpbkJ1ZlswXSA9ICh1bG9uZylsZWZ0QWRkcjsKLQlpbkJ1ZlsxXSA9ICh1bG9uZylyaWdodEFkZHI7Ci0JRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9GTElQMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBOVUxMLCAwLCAmY291bnQsIE5VTEwpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHR1cm5zIG9mZiBzb2Z0d2FyZSBzdGVyZW8gbW9kZSwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBOX2ludDMyIE5BUEkgX0dBX3NvZnRTdGVyZW9HZXRGbGlwU3RhdHVzKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9oRGV2aWNlKSB7Ci0JRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotCURXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotCWlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HQVNURVJFT0ZMSVBTVEFUVVMzMiwgTlVMTCwgMCwKLQkJb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkgewotCSAgICByZXR1cm4gb3V0QnVmWzBdOwotCSAgICB9Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gdHVybnMgb2ZmIHNvZnR3YXJlIHN0ZXJlbyBtb2RlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIHRoZSBWeEQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTkFQSSBfR0Ffc29mdFN0ZXJlb1dhaXRUaWxsRmxpcHBlZCh2b2lkKQotewotICAgIHdoaWxlICghX0dBX3NvZnRTdGVyZW9HZXRGbGlwU3RhdHVzKCkpCi0JOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gdHVybnMgb2ZmIHNvZnR3YXJlIHN0ZXJlbyBtb2RlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIHRoZSBWeEQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTkFQSSBfR0Ffc29mdFN0ZXJlb09mZih2b2lkKQotewotICAgIGlmIChfUE1faERldmljZSkgewotCURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPT0ZGMzIsIE5VTEwsIDAsCi0JICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRpc2FibGUgdGhlIHNvZnR3YXJlIHN0ZXJlbyBoYW5kbGVyLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhCi10aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9FeGl0KHZvaWQpCi17Ci0gICAgaWYgKF9QTV9oRGV2aWNlKSB7Ci0JRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9FWElUMzIsIE5VTEwsIDAsCi0JICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XZSBob29rIHRoaXMgZnVuY3Rpb24gaW4gaGVyZSBzbyB0aGF0IHdlIGNhbiBhdm9pZCB0aGUgbWVtb3J5IGRldGVjdCBhbmQKLW90aGVyIGRlc3RydWN0aXZlIHNlcXVlbmNlcyBpbiB0aGUgZHJpdmVycyBpZiB3ZSBhcmUgbG9hZGluZyB0aGUgZHJpdmVyCi1mcm9tIGEgV2luMzIgYXBwbGljYXRpb24gKG91ciBkaXNwbGF5IGRyaXZlcnMgaW4gY29udHJhc3QgbG9hZCB0aGVtIGluc2lkZQotdGhlIFZ4RCBkaXJlY3RseSwgYnV0IHRoZSBjb250cm9sIHBhbmVsIGFwcGxldHMgdXNlIHRoaXMgZnVuY3Rpb24pLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBHQV9kZXZDdHggKiBOQVBJIF9HQV9sb2FkRHJpdmVyKAotICAgIE5faW50MzIgZGV2aWNlSW5kZXgsCi0gICAgTl9pbnQzMiBzaGFyZWQpCi17Ci0gICAgR0FfZGV2Q3R4ICAgKmRjOwotICAgIERXT1JEICAgICAgIGluQnVmWzFdOwotICAgIERXT1JEICAgICAgIG91dEJ1ZlsxXTsKLSAgICBOX2ludDMyICAgICB0b3RhbE1lbW9yeSA9IDAsb2xkSU9QTDsKLQotICAgIGlmIChkZXZpY2VJbmRleCA+PSBHQV9NQVhfREVWSUNFUykKLQlQTV9mYXRhbEVycm9yKCJEZXZpY2VJbmRleCB0b28gbGFyZ2UgaW4gR0FfbG9hZERyaXZlciEiKTsKLSAgICBQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBkZXZpY2VJbmRleDsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUTUVNU0laRTMyLAotCSAgICBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgTlVMTCwgTlVMTCkpCi0JdG90YWxNZW1vcnkgPSBvdXRCdWZbMF07Ci0gICAgaWYgKHRvdGFsTWVtb3J5ID09IDApCi0JdG90YWxNZW1vcnkgPSA4MTkyOwotICAgIF9HQV9leHBvcnRzLkdBX2ZvcmNlTWVtU2l6ZSh0b3RhbE1lbW9yeSxzaGFyZWQpOwotICAgIG9sZElPUEwgPSBQTV9zZXRJT1BMKDMpOwotICAgIGRjID0gT1JHX0dBX2xvYWREcml2ZXIoZGV2aWNlSW5kZXgsc2hhcmVkKTsKLSAgICBQTV9zZXRJT1BMKG9sZElPUEwpOwotICAgIHJldHVybiBkYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIGVsc2UgaWYgKFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIqKSZjb3VudEZyZXEpKSB7Ci0JaGF2ZVJEVFNDID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FncGxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FncGxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzZlZWRjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hZ3BsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgZW52aXJvbm1lbnQKLSoKLSogRGVzY3JpcHRpb246ICBDIG1vZHVsZSBmb3IgdGhlIEdyYXBoaWNzIEFjY2VsZXJhdG9yIERyaXZlciBBUEkuIFVzZXMKLSogICAgICAgICAgICAgICB0aGUgU2NpVGVjaCBQTSBsaWJyYXJ5IGZvciBpbnRlcmZhY2luZyB3aXRoIERPUwotKiAgICAgICAgICAgICAgIGV4dGVuZGVyIHNwZWNpZmljIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9hZ3AuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBERUJVR19BR1BfRFJJVkVSCi1zdGF0aWMgQUdQX2V4cG9ydHMgIF9BR1BfZXhwb3J0czsKLXN0YXRpYyBpbnQgICAgICAgICAgbG9hZGVkID0gZmFsc2U7Ci1zdGF0aWMgUEVfTU9EVUxFICAgICpoTW9kQlBEID0gTlVMTDsKLQotc3RhdGljIE5faW1wb3J0cyBfTl9pbXBvcnRzID0gewotICAgIHNpemVvZihOX2ltcG9ydHMpLAotICAgIF9PU19kZWxheSwKLSAgICB9OwotCi1zdGF0aWMgQUdQX2ltcG9ydHMgX0FHUF9pbXBvcnRzID0gewotICAgIHNpemVvZihBR1BfaW1wb3J0cyksCi0gICAgfTsKLSNlbmRpZgotCi0jaW5jbHVkZSAicG1pbXAuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBETExfTkFNRSAgICAgICAgImFncC5icGQiCi0KLSNpZm5kZWYgREVCVUdfQUdQX0RSSVZFUgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GYXRhbCBlcnJvciBoYW5kbGVyIGZvciBub24tZXhwb3J0ZWQgR0FfZXhwb3J0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfQUdQX2ZhdGFsRXJyb3JIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5zdXBwb3J0ZWQgQUdQIGV4cG9ydCBmdW5jdGlvbiBjYWxsZWQhIFBsZWFzZSB1cGdyYWRlIHlvdXIgY29weSBvZiBBR1AhXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zaGFyZWQgIC0gVHJ1ZSB0byBsb2FkIHRoZSBkcml2ZXIgaW50byBzaGFyZWQgbWVtb3J5LgotCi1SRU1BUktTOgotTG9hZHMgdGhlIE51Y2xldXMgYmluYXJ5IHBvcnRhYmxlIERMTCBpbnRvIG1lbW9yeSBhbmQgaW5pdGlsaXNlcyBpdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgTG9hZERyaXZlcih2b2lkKQotewotICAgIEFHUF9pbml0TGlicmFyeV90ICAgQUdQX2luaXRMaWJyYXJ5OwotICAgIEFHUF9leHBvcnRzICAgICAgICAgKmFncEV4cDsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW1BNX01BWF9QQVRIXTsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGJwZHBhdGhbUE1fTUFYX1BBVEhdOwotICAgIGludCAgICAgICAgICAgICAgICAgaSxtYXg7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICAqcDsKLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQgdGhlIGRyaXZlciAqLwotICAgIGlmIChsb2FkZWQpCi0JcmV0dXJuIHRydWU7Ci0gICAgUE1faW5pdCgpOwotCi0gICAgLyogT3BlbiB0aGUgQlBEIGZpbGUgKi8KLSAgICBpZiAoIVBNX2ZpbmRCUEQoRExMX05BTUUsYnBkcGF0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsRExMX05BTUUpOwotICAgIGlmICgoaE1vZEJQRCA9IFBFX2xvYWRMaWJyYXJ5KGZpbGVuYW1lLGZhbHNlKSkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKChBR1BfaW5pdExpYnJhcnkgPSAoQUdQX2luaXRMaWJyYXJ5X3QpUEVfZ2V0UHJvY0FkZHJlc3MoaE1vZEJQRCwiX0FHUF9pbml0TGlicmFyeSIpKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICBicGRwYXRoW3N0cmxlbihicGRwYXRoKS0xXSA9IDA7Ci0gICAgaWYgKHN0cmNtcChicGRwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpID09IDApCi0Jc3RyY3B5KGJwZHBhdGgsUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKSk7Ci0gICAgZWxzZSB7Ci0JUE1fYmFja3NsYXNoKGJwZHBhdGgpOwotCXN0cmNhdChicGRwYXRoLCJjb25maWciKTsKLQl9Ci0gICAgaWYgKChhZ3BFeHAgPSBBR1BfaW5pdExpYnJhcnkoYnBkcGF0aCxmaWxlbmFtZSxHQV9nZXRTeXN0ZW1QTUltcG9ydHMoKSwmX05faW1wb3J0cywmX0FHUF9pbXBvcnRzKSkgPT0gTlVMTCkKLQlQTV9mYXRhbEVycm9yKCJBR1BfaW5pdExpYnJhcnkgZmFpbGVkIVxuIik7Ci0gICAgX0FHUF9leHBvcnRzLmR3U2l6ZSA9IHNpemVvZihfQUdQX2V4cG9ydHMpOwotICAgIG1heCA9IHNpemVvZihfQUdQX2V4cG9ydHMpL3NpemVvZihBR1BfaW5pdExpYnJhcnlfdCk7Ci0gICAgZm9yIChpID0gMCxwID0gKHVsb25nKikmX0FHUF9leHBvcnRzOyBpIDwgbWF4OyBpKyspCi0JKnArKyA9ICh1bG9uZylfQUdQX2ZhdGFsRXJyb3JIYW5kbGVyOwotICAgIG1lbWNweSgmX0FHUF9leHBvcnRzLGFncEV4cCxNSU4oc2l6ZW9mKF9BR1BfZXhwb3J0cyksYWdwRXhwLT5kd1NpemUpKTsKLSAgICBsb2FkZWQgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBzdHViIGVudHJ5IHBvaW50cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYWxscyB0bwotICogaW5pdGlhbGlzZSB0aGUgTnVjbGV1cyBsb2FkZXIgbGlicmFyeSwgYW5kIHdlIHVzZSB0aGlzIHRvIGxvYWQgb3VyCi0gKiBkcml2ZXIgRExMIGZyb20gZGlzayBhbmQgaW5pdGlhbGlzZSB0aGUgbGlicmFyeSB1c2luZyBpdC4KLSAqLwotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgQUdQX3N0YXR1cyh2b2lkKQotewotICAgIGlmICghbG9hZGVkKQotCXJldHVybiBuRHJpdmVyTm90Rm91bmQ7Ci0gICAgcmV0dXJuIF9BR1BfZXhwb3J0cy5BR1Bfc3RhdHVzKCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1jb25zdCBjaGFyICogTkFQSSBBR1BfZXJyb3JNc2coCi0gICAgTl9pbnQzMiBzdGF0dXMpCi17Ci0gICAgaWYgKCFsb2FkZWQpCi0JcmV0dXJuICJVbmFibGUgdG8gbG9hZCBOdWNsZXVzIGRldmljZSBkcml2ZXIhIjsKLSAgICByZXR1cm4gX0FHUF9leHBvcnRzLkFHUF9lcnJvck1zZyhzdGF0dXMpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotQUdQX2RldkN0eCAqIE5BUEkgQUdQX2xvYWREcml2ZXIoTl9pbnQzMiBkZXZpY2VJbmRleCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoKSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gX0FHUF9leHBvcnRzLkFHUF9sb2FkRHJpdmVyKGRldmljZUluZGV4KTsKLX0KLQotLyoge3NlY3JldH0gKi8KLXZvaWQgTkFQSSBBR1BfdW5sb2FkRHJpdmVyKAotICAgIEFHUF9kZXZDdHggKmRjKQotewotICAgIGlmIChsb2FkZWQpCi0JX0FHUF9leHBvcnRzLkFHUF91bmxvYWREcml2ZXIoZGMpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotdm9pZCBOQVBJIEFHUF9nZXRHbG9iYWxPcHRpb25zKAotICAgIEFHUF9nbG9iYWxPcHRpb25zICpvcHRpb25zKQotewotICAgIGlmIChMb2FkRHJpdmVyKCkpCi0JX0FHUF9leHBvcnRzLkFHUF9nZXRHbG9iYWxPcHRpb25zKG9wdGlvbnMpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotdm9pZCBOQVBJIEFHUF9zZXRHbG9iYWxPcHRpb25zKAotICAgIEFHUF9nbG9iYWxPcHRpb25zICpvcHRpb25zKQotewotICAgIGlmIChMb2FkRHJpdmVyKCkpCi0JX0FHUF9leHBvcnRzLkFHUF9zZXRHbG9iYWxPcHRpb25zKG9wdGlvbnMpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotdm9pZCBOQVBJIEFHUF9zYXZlR2xvYmFsT3B0aW9ucygKLSAgICBBR1BfZ2xvYmFsT3B0aW9ucyAqb3B0aW9ucykKLXsKLSAgICBpZiAobG9hZGVkKQotCV9BR1BfZXhwb3J0cy5BR1Bfc2F2ZUdsb2JhbE9wdGlvbnMob3B0aW9ucyk7Ci19Ci0jZW5kaWYKLQotLyoge3NlY3JldH0gKi8KLXZvaWQgTkFQSSBfT1NfZGVsYXk4MjUzKE5fdWludDMyIG1pY3JvU2Vjb25kcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZWxheXMgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBfT1NfZGVsYXkoCi0gICAgTl91aW50MzIgbWljcm9TZWNvbmRzKQotewotICAgIHN0YXRpYyBpYm9vbCAgICBpbml0ZWQgPSBmYWxzZTsKLSAgICBzdGF0aWMgaWJvb2wgICAgaGF2ZVJEVFNDOwotICAgIExaVGltZXJPYmplY3QgICB0bTsKLQotICAgIGlmICghaW5pdGVkKSB7Ci0jaWZuZGVmIF9fV0lOMzJfVlhEX18KLQkvKiBUaGlzIGhhcyBiZWVuIGNhdXNpbmcgcHJvYmxlbXMgaW4gVnhEJ3MgZm9yIHNvbWUgcmVhc29uLCBzbyBmb3Igbm93ICovCi0JLyogd2UgYXZvaWQgdXNpbmcgaXQuICovCi0JaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQkgICAgWlRpbWVySW5pdCgpOwotCSAgICBoYXZlUkRUU0MgPSB0cnVlOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIGhhdmVSRFRTQyA9IGZhbHNlOwotCWluaXRlZCA9IHRydWU7Ci0JfQotICAgIGlmIChoYXZlUkRUU0MpIHsKLQlMWlRpbWVyT25FeHQoJnRtKTsKLQl3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9TZWNvbmRzKQotCSAgICA7Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0JfQotICAgIGVsc2UKLQlfT1NfZGVsYXk4MjUzKG1pY3JvU2Vjb25kcyk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY2VudGVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY2VudGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTE3YzIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2NlbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgRGlzcGxheSBEb2N0b3IgV2luZG93cyBJbnRlcmZhY2UgQ29kZQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBpcyBhIHByb3ByaWV0YXJ5IHRyYWRlIHNlY3JldCBvZiAgICAgfAotKiAgfFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCBDaGljbywgQ0EgOTU5MjggfAotKiAgfFVTQSAod3d3LnNjaXRlY2hzb2Z0LmNvbSkuICBBTlkgVU5BVVRIT1JJWkVEIFBPU1NFU1NJT04sIFVTRSwgICAgICAgfAotKiAgfFZJRVdJTkcsIENPUFlJTkcsIE1PRElGSUNBVElPTiBPUiBESVNTRU1JTkFUSU9OIE9GIFRISVMgQ09ERSBJUyAgICAgfAotKiAgfFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXLiAgVW5sZXNzIHlvdSBoYXZlIGN1cnJlbnQsIGV4cHJlc3MgICAgICAgfAotKiAgfHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFNjaVRlY2ggdG8gcG9zc2VzcyBvciB1c2UgdGhpcyBjb2RlLCB5b3UgfAotKiAgfG1heSBiZSBzdWJqZWN0IHRvIGNpdmlsIGFuZC9vciBjcmltaW5hbCBwZW5hbHRpZXMuICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfElmIHlvdSByZWNlaXZlZCB0aGlzIGNvZGUgaW4gZXJyb3Igb3IgeW91IHdvdWxkIGxpa2UgdG8gcmVwb3J0ICAgICAgfAotKiAgfGltcHJvcGVyIHVzZSwgcGxlYXNlIGltbWVkaWF0ZWx5IGNvbnRhY3QgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBhdCAgfAotKiAgfDUzMC04OTQtODQwMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEMrKyAzLjAKLSogRW52aXJvbm1lbnQ6ICBXaW4xNgotKgotKiBEZXNjcmlwdGlvbjogIERpYWxvZyBkcml2ZW4gY29uZmlndXJhdGlvbiBwcm9ncmFtIGZvciBVbmlWQkUgYW5kCi0qICAgICAgICAgICAgICAgV2luRGlyZWN0IFByb2Zlc3Npb25hbCBwcm9kdWN0cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjZW50ZXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBfRVhQT1JUIENlbnRlcldpbmRvdyhIV05EIGhXbmRDZW50ZXIsIEhXTkQgcGFyZW50LCBCT09MIHJlcGFpbnQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIENlbnRlcldpbmRvdwotKiBQYXJhbWV0ZXJzOiAgIGhXbmRDZW50ZXIgIC0gV2luZG93IHRvIGNlbnRlcgotKiAgICAgICAgICAgICAgIHBhcmVudCAgICAgIC0gSGFuZGxlIGZvciBwYXJlbnQgd2luZG93Ci0qICAgICAgICAgICAgICAgcmVwYWludCAgICAgLSB0cnVlIGlmIHdpbmRvdyBzaG91bGQgYmUgcmUtcGFpbnRlZAotKgotKiBEZXNjcmlwdGlvbjogIENlbnRlcnMgdGhlIHNwZWNpZmllZCB3aW5kb3cgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlCi0qICAgICAgICAgICAgICAgc3BlY2lmaWVkIHBhcmVudCB3aW5kb3cuIElmIHRoZSBwYXJlbnQgd2luZG93IGlzIE5VTEwsIHRoZW4KLSogICAgICAgICAgICAgICB3ZSBjZW50ZXIgaXQgdXNpbmcgdGhlIERlc2t0b3Agd2luZG93LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBIV05EICAgIGhXbmRQYXJlbnQgPSAocGFyZW50ID8gcGFyZW50IDogR2V0RGVza3RvcFdpbmRvdygpKTsKLSAgICBSRUNUICAgIFJlY3RQYXJlbnQ7Ci0gICAgUkVDVCAgICBSZWN0Q2VudGVyOwotICAgIGludCAgICAgQ2VudGVyWCxDZW50ZXJZLEhlaWdodCxXaWR0aDsKLQotICAgIEdldFdpbmRvd1JlY3QoaFduZFBhcmVudCwgJlJlY3RQYXJlbnQpOwotICAgIEdldFdpbmRvd1JlY3QoaFduZENlbnRlciwgJlJlY3RDZW50ZXIpOwotCi0gICAgV2lkdGggPSAoUmVjdENlbnRlci5yaWdodCAtIFJlY3RDZW50ZXIubGVmdCk7Ci0gICAgSGVpZ2h0ID0gKFJlY3RDZW50ZXIuYm90dG9tIC0gUmVjdENlbnRlci50b3ApOwotICAgIENlbnRlclggPSAoKFJlY3RQYXJlbnQucmlnaHQgLSBSZWN0UGFyZW50LmxlZnQpIC0gV2lkdGgpIC8gMjsKLSAgICBDZW50ZXJZID0gKChSZWN0UGFyZW50LmJvdHRvbSAtIFJlY3RQYXJlbnQudG9wKSAtIEhlaWdodCkgLyAyOwotCi0gICAgaWYgKChDZW50ZXJYIDwgMCkgfHwgKENlbnRlclkgPCAwKSkgewotCS8qIFRoZSBDZW50ZXIgV2luZG93IGlzIHNtYWxsZXIgdGhhbiB0aGUgcGFyZW50IHdpbmRvdy4gKi8KLQlpZiAoaFduZFBhcmVudCAhPSBHZXREZXNrdG9wV2luZG93KCkpIHsKLQkgICAgLyogSWYgdGhlIHBhcmVudCB3aW5kb3cgaXMgbm90IHRoZSBkZXNrdG9wIHVzZSB0aGUgZGVza3RvcCBzaXplLiAqLwotCSAgICBDZW50ZXJYID0gKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pIC0gV2lkdGgpIC8gMjsKLQkgICAgQ2VudGVyWSA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSAtIEhlaWdodCkgLyAyOwotCSAgICB9Ci0JQ2VudGVyWCA9IChDZW50ZXJYIDwgMCkgPyAwOiBDZW50ZXJYOwotCUNlbnRlclkgPSAoQ2VudGVyWSA8IDApID8gMDogQ2VudGVyWTsKLQl9Ci0gICAgZWxzZSB7Ci0JQ2VudGVyWCArPSBSZWN0UGFyZW50LmxlZnQ7Ci0JQ2VudGVyWSArPSBSZWN0UGFyZW50LnRvcDsKLQl9Ci0KLSAgICAvKiBDb3B5IHRoZSB2YWx1ZXMgaW50byBSZWN0Q2VudGVyICovCi0gICAgUmVjdENlbnRlci5sZWZ0ID0gQ2VudGVyWDsKLSAgICBSZWN0Q2VudGVyLnJpZ2h0ID0gQ2VudGVyWCArIFdpZHRoOwotICAgIFJlY3RDZW50ZXIudG9wID0gQ2VudGVyWTsKLSAgICBSZWN0Q2VudGVyLmJvdHRvbSA9IENlbnRlclkgKyBIZWlnaHQ7Ci0KLSAgICAvKiBNb3ZlIHRoZSB3aW5kb3cgdG8gdGhlIG5ldyBsb2NhdGlvbiAqLwotICAgIE1vdmVXaW5kb3coaFduZENlbnRlciwgUmVjdENlbnRlci5sZWZ0LCBSZWN0Q2VudGVyLnRvcCwKLQkgICAgKFJlY3RDZW50ZXIucmlnaHQgLSBSZWN0Q2VudGVyLmxlZnQpLAotCSAgICAoUmVjdENlbnRlci5ib3R0b20gLSBSZWN0Q2VudGVyLnRvcCksIHJlcGFpbnQpOwotfQotCi12b2lkIF9FWFBPUlQgQ2VudGVyTG9nbyhIV05EIGhXbmRMb2dvLCBIV05EIGhXbmRQYXJlbnQsIGludCBDZW50ZXJZKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBDZW50ZXJMb2dvCi0qIFBhcmFtZXRlcnM6ICAgaFduZExvZ28gICAgLSBXaW5kb3cgdG8gY2VudGVyCi0qICAgICAgICAgICAgICAgaFduZFBhcmVudCAgLSBIYW5kbGUgZm9yIHBhcmVudCB3aW5kb3cKLSogICAgICAgICAgICAgICBDZW50ZXJZICAgICAtIFRvcCBjb29yZGluYXRlIGZvciBsb2dvCi0qCi0qIERlc2NyaXB0aW9uOiAgQ2VudGVycyB0aGUgc3BlY2lmaWVkIHdpbmRvdyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUKLSogICAgICAgICAgICAgICBzcGVjaWZpZWQgcGFyZW50IHdpbmRvdyBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24gb25seS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUkVDVCAgICBSZWN0UGFyZW50OwotICAgIFJFQ1QgICAgUmVjdENlbnRlcjsKLSAgICBpbnQgICAgIENlbnRlclgsSGVpZ2h0LFdpZHRoOwotCi0gICAgR2V0V2luZG93UmVjdChoV25kUGFyZW50LCAmUmVjdFBhcmVudCk7Ci0gICAgR2V0V2luZG93UmVjdChoV25kTG9nbywgJlJlY3RDZW50ZXIpOwotICAgIFdpZHRoID0gKFJlY3RDZW50ZXIucmlnaHQgLSBSZWN0Q2VudGVyLmxlZnQpOwotICAgIEhlaWdodCA9IChSZWN0Q2VudGVyLmJvdHRvbSAtIFJlY3RDZW50ZXIudG9wKTsKLSAgICBDZW50ZXJYID0gKChSZWN0UGFyZW50LnJpZ2h0IC0gUmVjdFBhcmVudC5sZWZ0KSAtIFdpZHRoKSAvIDI7Ci0KLSAgICAvKiBDb3B5IHRoZSB2YWx1ZXMgaW50byBSZWN0Q2VudGVyICovCi0gICAgUmVjdENlbnRlci5sZWZ0ID0gQ2VudGVyWDsKLSAgICBSZWN0Q2VudGVyLnJpZ2h0ID0gQ2VudGVyWCArIFdpZHRoOwotICAgIFJlY3RDZW50ZXIudG9wID0gQ2VudGVyWTsKLSAgICBSZWN0Q2VudGVyLmJvdHRvbSA9IENlbnRlclkgKyBIZWlnaHQ7Ci0KLSAgICAvKiBNb3ZlIHRoZSB3aW5kb3cgdG8gdGhlIG5ldyBsb2NhdGlvbiAqLwotICAgIE1vdmVXaW5kb3coaFduZExvZ28sIFJlY3RDZW50ZXIubGVmdCwgUmVjdENlbnRlci50b3AsCi0JICAgIChSZWN0Q2VudGVyLnJpZ2h0IC0gUmVjdENlbnRlci5sZWZ0KSwKLQkgICAgKFJlY3RDZW50ZXIuYm90dG9tIC0gUmVjdENlbnRlci50b3ApLCBmYWxzZSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY21kbGluZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2NtZGxpbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxZTVlMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY21kbGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvZGUgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSwKLSogICAgICAgICAgICAgICBleHRyYWN0aW5nIG9wdGlvbnMgYW5kIHBhcmFtZXRlcnMgaW4gc3RhbmRhcmQgU3lzdGVtIFYKLSogICAgICAgICAgICAgICBzdHlsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiY21kbGluZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQgICAgIG5leHRhcmd2ICAgID0gICAxOyAgICAgICAgICAvKiBJbmRleCBpbnRvIGFyZ3YgYXJyYXkgICAgICAgICAgICAqLwotY2hhciAgICAqbmV4dGNoYXIgICA9ICAgTlVMTDsgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGNoYXJhY3RlciAgICAgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBJU19TV0lUQ0hfQ0hBUihjKSAgICAgICAoKGMpID09ICctJykKLSNkZWZpbmUgSVNfTk9UX1NXSVRDSF9DSEFSKGMpICAgKChjKSAhPSAnLScpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIHNwZWNpZmljIG9wdGlvbnMKLQotSEVBREVSOgotY21kbGluZS5oCi0KLVBBUkFNRVRFUlM6Ci1hcmdjICAgICAgICAtIFZhbHVlIHBhc3NlZCB0byBwcm9ncmFtIHRocm91Z2ggYXJnYyB2YXJpYWJsZQotYXJndiAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBhcmd2IGFycmF5IHBhc3NlZCB0byB0aGUgcHJvZ3JhbQotZm9ybWF0ICAgICAgLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgY29tbWFuZCBsaW5lCi1hcmd1bWVudCAgICAtIFBvaW50ZXIgdG8gb3B0aW9uYWwgYXJndW1lbnQgb24gY29tbWFuZCBsaW5lCi0KLVJFVFVSTlM6Ci1DaGFyYWN0ZXIgY29kZSByZXByZXNlbnRpbmcgdGhlIG5leHQgb3B0aW9uIHBhcnNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkKLWdldGNtZG9wdC4gUmV0dXJucyBBTExET05FICgtMSkgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBwYXJhbWV0ZXJzIHRvIGJlIHBhcnNlZAotb24gdGhlIGNvbW1hbmQgbGluZSwgUEFSQU1FVEVSICgtMikgd2hlbiB0aGUgYXJndW1lbnQgYmVpbmcgcGFyc2VkIGlzIGEKLXBhcmFtZXRlciBhbmQgbm90IGFuIG9wdGlvbiBzd2l0Y2ggYW5kIGxhc3RseSBJTlZBTElEICgtMykgaWYgYW4gZXJyb3IKLW9jY3VyZWQgd2hpbGUgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gc3dpdGNoZXMgaW4gVU5JWCBTeXN0ZW0gViBzdHlsZS4KLVdoZW4gZ2V0Y21kb3B0IGlzIGNhbGxlZCwgaXQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIGNvZGUgb2YgdGhlIG5leHQgdmFsaWQKLW9wdGlvbiB0aGF0IGlzIHBhcnNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXMgc3BlY2lmaWVkIGJ5IHRoZSBGb3JtYXQKLXN0cmluZy4gVGhlIGZvcm1hdCBzdHJpbmcgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICAgICJhYmNkOmU6ZjoiCi0KLXdoZXJlIGEsYiBhbmQgYyByZXByZXNlbnQgc2luZ2xlIHN3aXRjaCBzdHlsZSBvcHRpb25zIGFuZCB0aGUgY2hhcmFjdGVyCi1jb2RlIHJldHVybmVkIGJ5IGdldGNtZG9wdCBpcyB0aGUgb25seSB2YWx1ZSByZXR1cm5lZC4gQWxzbyBkLCBlIGFuZCBmCi1yZXByZXNlbnQgb3B0aW9ucyB0aGF0IGV4cGVjdCBhcmd1bWVudHMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlbSBvbiB0aGUKLWNvbW1hbmQgbGluZS4gVGhlIGFyZ3VtZW50IHRoYXQgZm9sbG93cyB0aGUgb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMKLXJldHVybmVkIHZpYSBhIHJlZmVyZW5jZSBpbiB0aGUgcG9pbnRlciBhcmd1bWVudC4gVGh1cyBhIHZhbGlkIGNvbW1hbmQgbGluZQotZm9yIHRoaXMgZm9ybWF0IHN0cmluZyBtaWdodCBiZToKLQotICAgIG15cHJvZ3JhbSAtYWRsaW5lcyAtYiAtZiBmb3JtYXQgaW5maWxlIG91dGZpbGUKLQotd2hlcmUgYSBhbmQgYiB3aWxsIGJlIHJldHVybmVkIGFzIHNpbmdsZSBjaGFyYWN0ZXIgb3B0aW9ucyB3aXRoIG5vIGFyZ3VtZW50LAotd2hpbGUgZCBpcyByZXR1cm5lZCB3aXRoIHRoZSBhcmd1bWVudCBsaW5lcyBhbmQgZiBpcyByZXR1cm5lZCB3aXRoIHRoZQotYXJndW1lbnQgZm9ybWF0LgotCi1XaGVuIGdldGNtZG9wdCByZXR1cm5zIHdpdGggUEFSQU1FVEVSICh3ZSBhdHRlbXB0ZWQgdG8gcGFyc2UgYSBwYXJhbXRlciwgbm90Ci1hbiBvcHRpb24pLCB0aGUgZ2xvYmFsIHZhcmlhYmxlIE5leHRBcmd2IHdpbGwgaG9sZCBhbiBpbmRleCBpbiB0aGUgYXJndgotYXJyYXkgdG8gdGhlIGFyZ3VtZW50IG9uIHRoZSBjb21tYW5kIGxpbmUgQUZURVIgdGhlIG9wdGlvbnMsIGllIGluIHRoZQotYWJvdmUgZXhhbXBsZSB0aGUgc3RyaW5nICdpbmZpbGUnLiBJZiB0aGUgcGFyYW1ldGVyIGlzIHN1Y2Nlc3NmdWxseSB1c2VkLAotTmV4dEFyZ3Ygc2hvdWxkIGJlIGluY3JlbWVudGVkIGFuZCBnZXRjbWRvcHQgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwYXJzZSBhbnkKLW1vcmUgb3B0aW9ucy4gVGh1cyB5b3UgY2FuIGFsc28gaGF2ZSBvcHRpb25zIGludGVyc3BlcnNlZCB0aHJvdWdodCB0aGUKLWNvbW1hbmQgbGluZS4gZWc6Ci0KLSAgICBteXByb2dyYW0gLWFkbGluZXMgaW5maWxlIC1iIG91dGZpbGUgLWYgZm9ybWF0Ci0KLWNhbiBiZSBtYWRlIHRvIGJlIGEgdmFsaWQgZm9ybSBvZiB0aGUgYWJvdmUgY29tbWFuZCBsaW5lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBnZXRjbWRvcHQoCi0gICAgaW50IGFyZ2MsCi0gICAgY2hhciAqKmFyZ3YsCi0gICAgY2hhciAqZm9ybWF0LAotICAgIGNoYXIgKiphcmd1bWVudCkKLXsKLSAgICBjaGFyICAgIGNoOwotICAgIGNoYXIgICAgKmZvcm1hdGNoYXI7Ci0KLSAgICBpZiAoYXJnYyA+IG5leHRhcmd2KSB7Ci0JaWYgKG5leHRjaGFyID09IE5VTEwpIHsKLQkgICAgbmV4dGNoYXIgPSBhcmd2W25leHRhcmd2XTsgICAgICAvKiBJbmRleCBuZXh0IGFyZ3VtZW50ICAgICAgKi8KLQkgICAgaWYgKG5leHRjaGFyID09IE5VTEwpIHsKLQkJbmV4dGFyZ3YrKzsKLQkJcmV0dXJuIEFMTERPTkU7ICAgICAgICAgICAgIC8qIE5vIG1vcmUgb3B0aW9ucyAgICAgICAgICAqLwotCQl9Ci0JICAgIGlmIChJU19OT1RfU1dJVENIX0NIQVIoKm5leHRjaGFyKSkgewotCQluZXh0Y2hhciA9IE5VTEw7Ci0JCXJldHVybiBQQVJBTUVURVI7ICAgICAgICAgICAvKiBXZSBoYXZlIGEgcGFyYW1ldGVyICAgICAgKi8KLQkJfQotCSAgICBuZXh0Y2hhcisrOyAgICAgICAgICAgICAgICAgICAgIC8qIE1vdmUgcGFzdCBzd2l0Y2ggb3BlcmF0b3IgKi8KLQkgICAgaWYgKElTX1NXSVRDSF9DSEFSKCpuZXh0Y2hhcikpIHsKLQkJbmV4dGNoYXIgPSBOVUxMOwotCQlyZXR1cm4gSU5WQUxJRDsgICAgICAgICAgICAgLyogSWdub3JlIHJlc3Qgb2YgbGluZSAgICAgICovCi0JCX0KLQkgICAgfQotCWlmICgoY2ggPSAqKG5leHRjaGFyKyspKSA9PSAwKSB7Ci0JICAgIG5leHRjaGFyID0gTlVMTDsKLQkgICAgcmV0dXJuIElOVkFMSUQ7ICAgICAgICAgICAgICAgICAvKiBObyBvcHRpb25zIG9uIGxpbmUgICAgICAgKi8KLQkgICAgfQotCi0JaWYgKGNoID09ICc6JyB8fCAgKGZvcm1hdGNoYXIgPSBzdHJjaHIoZm9ybWF0LCBjaCkpID09IE5VTEwpCi0JICAgIHJldHVybiBJTlZBTElEOwotCi0JaWYgKCooKytmb3JtYXRjaGFyKSA9PSAnOicpIHsgICAvKiBFeHBlY3QgYW4gYXJndW1lbnQgYWZ0ZXIgb3B0aW9uICovCi0JICAgIG5leHRhcmd2Kys7Ci0JICAgIGlmICgqbmV4dGNoYXIgPT0gMCkgewotCQlpZiAoYXJnYyA8PSBuZXh0YXJndikKLQkJICAgIHJldHVybiBJTlZBTElEOwotCQluZXh0Y2hhciA9IGFyZ3ZbbmV4dGFyZ3YrK107Ci0JCX0KLQkgICAgKmFyZ3VtZW50ID0gbmV4dGNoYXI7Ci0JICAgIG5leHRjaGFyID0gTlVMTDsKLQkgICAgfQotCWVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIGEgc3dpdGNoIHN0eWxlIG9wdGlvbiAgICAqLwotCSAgICBpZiAoKm5leHRjaGFyID09IDApIHsKLQkJbmV4dGFyZ3YrKzsKLQkJbmV4dGNoYXIgPSBOVUxMOwotCQl9Ci0JICAgICphcmd1bWVudCA9IE5VTEw7Ci0JICAgIH0KLQlyZXR1cm4gY2g7ICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSBvcHRpb24gc3BlY2lmaWVyICAgICAgKi8KLQl9Ci0gICAgbmV4dGNoYXIgPSBOVUxMOwotICAgIG5leHRhcmd2Kys7Ci0gICAgcmV0dXJuIEFMTERPTkU7ICAgICAgICAgICAgICAgICAvKiBubyBhcmd1bWVudHMgb24gY29tbWFuZCBsaW5lICAgICAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9wdGFyciAgICAgIC0gRGVzY3JpcHRpb24gZm9yIHRoZSBvcHRpb24gd2UgYXJlIHBhcnNpbmcKLWFyZ3VtZW50ICAgIC0gU3RyaW5nIHRvIHBhcnNlCi0KLVJFVFVSTlM6Ci1JTlZBTElEIG9uIGVycm9yLCBBTExET05FIG9uIHN1Y2Nlc3MuCi0KLVJFTUFSS1M6Ci1QYXJzZXMgdGhlIGFyZ3VtZW50IHN0cmluZyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYXJndW1lbnQgdGhhdCBpcwotZXhwZWN0ZWQsIGZpbGxpbmcgaW4gdGhlIGFyZ3VtZW50IGZvciB0aGF0IG9wdGlvbi4gTm90ZSB0aGF0IHRvIHBhcnNlIGEKLXN0cmluZywgd2Ugc2ltcGx5IHJldHVybiBhIHBvaW50ZXIgdG8gYXJndW1lbnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwYXJzZV9vcHRpb24oCi0gICAgT3B0aW9uICpvcHRhcnIsCi0gICAgY2hhciAqYXJndW1lbnQpCi17Ci0gICAgaW50ICAgICBudW1fcmVhZDsKLQotICAgIHN3aXRjaCAoKGludCkob3B0YXJyLT50eXBlKSkgewotCWNhc2UgT1BUX0lOVEVHRVI6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlZCIsKGludCopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9IRVg6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIleCIsKGludCopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9PQ1RBTDoKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVvIiwoaW50KilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX1VOU0lHTkVEOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJXUiLCh1aW50KilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX0xJTlRFR0VSOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWxkIiwobG9uZyopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9MSEVYOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWx4IiwobG9uZyopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9MT0NUQUw6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlbG8iLChsb25nKilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX0xVTlNJR05FRDoKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVsdSIsKHVsb25nKilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX0ZMT0FUOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWYiLChmbG9hdCopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9ET1VCTEU6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlbGYiLChkb3VibGUqKW9wdGFyci0+YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBPUFRfTERPVUJMRToKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVMZiIsKGxvbmcgZG91YmxlKilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX1NUUklORzoKLQkgICAgbnVtX3JlYWQgPSAxOyAgICAgICAgICAgLyogVGhpcyBhbHdheXMgd29ya3MgICAgKi8KLQkgICAgKigoY2hhcioqKW9wdGFyci0+YXJnKSA9IGFyZ3VtZW50OwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gSU5WQUxJRDsKLQl9Ci0KLSAgICBpZiAobnVtX3JlYWQgPT0gMCkKLQlyZXR1cm4gSU5WQUxJRDsKLSAgICBlbHNlCi0JcmV0dXJuIEFMTERPTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1IRUFERVI6Ci1jbWRsaW5lLmgKLQotUEFSQU1FVEVSUzoKLWFyZ2MgICAgICAgIC0gTnVtYmVyIG9mIGFyZ3VtZW50cyBvbiBjb21tYW5kIGxpbmUKLWFyZ3YgICAgICAgIC0gQXJyYXkgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotbnVtX29wdCAgICAgLSBOdW1iZXIgb2Ygb3B0aW9ucyBpbiBvcHRpb24gYXJyYXkKLW9wdGFyciAgICAgIC0gQXJyYXkgdG8gc3BlY2lmeSBob3cgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZQotZG9fcGFyYW0gICAgLSBSb3V0aW5lIHRvIGhhbmRsZSBhIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIKLQotUkVUVVJOUzoKLUFMTERPTkUsIElOVkFMSUQgb3IgSEVMUAotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhY2NvcmRpbmcgdG8gYSB0YWJsZSBvZiBvcHRpb25zLiBUaGlzCi1yb3V0aW5lIGNhbGxzIGdldGNtZG9wdCBhYm92ZSB0byBwYXJzZSBlYWNoIGluZGl2aWR1YWwgb3B0aW9uIGFuZCBhdHRlbXB0cwotdG8gcGFyc2UgZWFjaCBvcHRpb24gaW50byBhIHZhcmlhYmxlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4gVGhlIHJvdXRpbmUKLWNhbiBwYXJzZSBpbnRlZ2VycyBhbmQgbG9uZyBpbnRlZ2VycyBpbiBlaXRoZXIgZGVjaW1hbCwgb2N0YWwsIGhleGFkZWNpbWFsCi1ub3RhdGlvbiwgdW5zaWduZWQgaW50ZWdlcnMgYW5kIHVuc2lnbmVkIGxvbmdzLCBzdHJpbmdzIGFuZCBvcHRpb24gc3dpdGNoZXMuCi1PcHRpb24gc3dpdGNoZXMgYXJlIHNpbXBseSBib29sZWFuIHZhcmlhYmxlcyB0aGF0IGdldCB0dXJuZWQgb24gaWYgdGhlCi1zd2l0Y2ggd2FzIHBhcnNlZC4KLQotUGFyYW1ldGVycyBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZSBieSBjYWxsaW5nIGEgdXNlciBzdXBwbGllZAotcm91dGluZSBkb19wYXJhbSgpIHRvIGhhbmRsZSBlYWNoIHBhcmFtZXRlciBhcyBpdCBpcyBlbmNvdW50ZXJlZC4gVGhlCi1yb3V0aW5lIGRvX3BhcmFtKCkgc2hvdWxkIGFjY2VwdCBhIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlciBvbiB0aGUgY29tbWFuZAotbGluZSBhbmQgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgaG93IG1hbnkgcGFyYW1ldGVycyBoYXZlIGJlZW4gZW5jb3VudGVyZWQKLShpZTogMSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIDEwIGlmIGl0IGlzIHRoZSAxMHRoIGV0YyksIGFuZCByZXR1cm4KLUFMTERPTkUgdXBvbiBzdWNjZXNzZnVsbHkgcGFyc2luZyBpdCBvciBJTlZBTElEIGlmIHRoZSBwYXJhbWV0ZXIgd2FzIGludmFsaWQuCi0KLVdlIHJldHVybiBlaXRoZXIgQUxMRE9ORSBpZiBhbGwgdGhlIG9wdGlvbnMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLAotSU5WQUxJRCBpZiBhbiBpbnZhbGlkIG9wdGlvbiB3YXMgZW5jb3VudGVyZWQgb3IgSEVMUCBpZiBhbnkgb2YgLWgsIC1IIG9yCi0tPyB3ZXJlIHByZXNlbnQgb24gdGhlIGNvbW1hbmQgbGluZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZ2V0YXJncygKLSAgICBpbnQgYXJnYywKLSAgICBjaGFyICphcmd2W10sCi0gICAgaW50IG51bV9vcHQsCi0gICAgT3B0aW9uIG9wdGFycltdLAotICAgIGludCAoKmRvX3BhcmFtKSgKLQljaGFyICpwYXJhbSwKLQlpbnQgbnVtKSkKLXsKLSAgICBpbnQgICAgIGksb3B0OwotICAgIGNoYXIgICAgKmFyZ3VtZW50OwotICAgIGludCAgICAgcGFyYW1fbnVtID0gMTsKLSAgICBjaGFyICAgIGNtZHN0cltNQVhBUkcqMiArIDRdOwotCi0gICAgLyogQnVpbGQgdGhlIGNvbW1hbmQgc3RyaW5nIGZyb20gdGhlIGFycmF5IG9mIG9wdGlvbnMgICAqLwotCi0gICAgc3RyY3B5KGNtZHN0ciwiaEg/Iik7Ci0gICAgZm9yIChpID0gMCxvcHQgPSAzOyBpIDwgbnVtX29wdDsgaSsrLG9wdCsrKSB7Ci0JY21kc3RyW29wdF0gPSBvcHRhcnJbaV0ub3B0OwotCWlmIChvcHRhcnJbaV0udHlwZSAhPSBPUFRfU1dJVENIKSB7Ci0JICAgIGNtZHN0clsrK29wdF0gPSAnOic7Ci0JICAgIH0KLQl9Ci0gICAgY21kc3RyW29wdF0gPSAnXDAnOwotCi0gICAgZm9yICg7OykgewotCW9wdCA9IGdldGNtZG9wdChhcmdjLGFyZ3YsY21kc3RyLCZhcmd1bWVudCk7Ci0Jc3dpdGNoIChvcHQpIHsKLQkgICAgY2FzZSAnSCc6Ci0JICAgIGNhc2UgJ2gnOgotCSAgICBjYXNlICc/JzoKLQkJcmV0dXJuIEhFTFA7Ci0JICAgIGNhc2UgQUxMRE9ORToKLQkJcmV0dXJuIEFMTERPTkU7Ci0JICAgIGNhc2UgSU5WQUxJRDoKLQkJcmV0dXJuIElOVkFMSUQ7Ci0JICAgIGNhc2UgUEFSQU1FVEVSOgotCQlpZiAoZG9fcGFyYW0gPT0gTlVMTCkKLQkJICAgIHJldHVybiBJTlZBTElEOwotCQlpZiAoZG9fcGFyYW0oYXJndltuZXh0YXJndl0scGFyYW1fbnVtKSA9PSBJTlZBTElEKQotCQkgICAgcmV0dXJuIElOVkFMSUQ7Ci0JCW5leHRhcmd2Kys7Ci0JCXBhcmFtX251bSsrOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQotCQkvKiBTZWFyY2ggZm9yIHRoZSBvcHRpb24gaW4gdGhlIG9wdGlvbiBhcnJheS4gV2UgYXJlCi0JCSAqIGd1YXJhbnRlZWQgdG8gZmluZCBpdC4KLQkJICovCi0KLQkJZm9yIChpID0gMDsgaSA8IG51bV9vcHQ7IGkrKykgewotCQkgICAgaWYgKG9wdGFycltpXS5vcHQgPT0gb3B0KQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCWlmIChvcHRhcnJbaV0udHlwZSA9PSBPUFRfU1dJVENIKQotCQkgICAgKigoaWJvb2wqKW9wdGFycltpXS5hcmcpID0gdHJ1ZTsKLQkJZWxzZSB7Ci0JCSAgICBpZiAocGFyc2Vfb3B0aW9uKCZvcHRhcnJbaV0sYXJndW1lbnQpID09IElOVkFMSUQpCi0JCQlyZXR1cm4gSU5WQUxJRDsKLQkJICAgIH0KLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1IRUFERVI6Ci1jbWRsaW5lLmgKLQotUEFSQU1FVEVSUzoKLW51bV9vcHQgLSBOdW1iZXIgb2Ygb3B0aW9ucyBpbiB0aGUgdGFibGUKLW9wdGFyciAgLSBUYWJsZSBvZiBvcHRpb24gZGVzY3JpcHRpb25zCi0KLVJFTUFSS1M6Ci1QcmludHMgdGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggb3B0aW9uIGluIGEgc3RhbmRhcmQgZm9ybWF0IHRvIHRoZSBzdGFuZGFyZAotb3V0cHV0IGRldmljZS4gVGhlIGRlc2NyaXB0aW9uIGZvciBlYWNoIG9wdGlvbiBpcyBvYnRhaW5lZCBmcm9tIHRoZSB0YWJsZQotb2Ygb3B0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHByaW50X2Rlc2MoCi0gICAgaW50IG51bV9vcHQsCi0gICAgT3B0aW9uIG9wdGFycltdKQotewotICAgIGludCAgICAgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fb3B0OyBpKyspIHsKLQlpZiAob3B0YXJyW2ldLnR5cGUgPT0gT1BUX1NXSVRDSCkKLQkgICAgcHJpbnRmKCIgIC0lYyAgICAgICAlc1xuIixvcHRhcnJbaV0ub3B0LG9wdGFycltpXS5kZXNjKTsKLQllbHNlCi0JICAgIHByaW50ZigiICAtJWM8YXJnPiAgJXNcbiIsb3B0YXJyW2ldLm9wdCxvcHRhcnJbaV0uZGVzYyk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotSEVBREVSOgotY21kbGluZS5oCi0KLVBBUkFNRVRFUlM6Ci1tb2R1bGVOYW1lICAtIE1vZHVsZSBuYW1lIGZvciBwcm9ncmFtCi1jbWRMaW5lICAgICAtIENvbW1hbmQgbGluZSB0byBwYXJzZQotcGFyZ2MgICAgICAgLSBQb2ludGVyIHRvICdhcmdjJyBwYXJhbWV0ZXIKLXBhcmd2ICAgICAgIC0gUG9pbnRlciB0byAnYXJndicgcGFyYW1ldGVyCi1tYXhBcmdjICAgICAtIE1heGltdW0gYXJndiBhcnJheSBpbmRleAotCi1SRU1BUktTOgotUGFyc2VzIGEgY29tbWFuZCBsaW5lIGZyb20gYSBzaW5nbGUgc3RyaW5nIGludG8gdGhlIEMgc3R5bGUgJ2FyZ2MnIGFuZAotJ2FyZ3YnIGZvcm1hdC4gTW9zdCB1c2VmdWwgZm9yIFdpbmRvd3MgcHJvZ3JhbXMgd2hlcmUgdGhlIGNvbW1hbmQgbGluZQotaXMgcGFzc2VkIGluIHZlcmJhdGltLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBwYXJzZV9jb21tYW5kbGluZSgKLSAgICBjaGFyICptb2R1bGVOYW1lLAotICAgIGNoYXIgKmNtZExpbmUsCi0gICAgaW50ICpwYXJnYywKLSAgICBjaGFyICphcmd2W10sCi0gICAgaW50IG1heEFyZ3YpCi17Ci0gICAgc3RhdGljIGNoYXIgc3RyWzUxMl07Ci0gICAgc3RhdGljIGNoYXIgZmlsZW5hbWVbMjYwXTsKLSAgICBjaGFyICAgICAgICAqcHJldldvcmQgPSBOVUxMOwotICAgIGlib29sICAgICAgICBpblF1b3RlID0gRkFMU0U7Ci0gICAgaWJvb2wgICAgICAgIG5vU3RyaXAgPSBGQUxTRTsKLSAgICBpbnQgICAgICAgICBhcmdjOwotCi0gICAgYXJnYyA9IDA7Ci0gICAgc3RyY3B5KGZpbGVuYW1lLG1vZHVsZU5hbWUpOwotICAgIGFyZ3ZbYXJnYysrXSA9IGZpbGVuYW1lOwotICAgIGNtZExpbmUgPSBzdHJuY3B5KHN0ciwgY21kTGluZSwgc2l6ZW9mKHN0ciktMSk7Ci0gICAgd2hpbGUgKCpjbWRMaW5lKSB7Ci0Jc3dpdGNoICgqY21kTGluZSkgewotCSAgICBjYXNlICciJyA6Ci0JCWlmIChwcmV2V29yZCAhPSBOVUxMKSB7Ci0JCSAgICBpZiAoaW5RdW90ZSkgewotCQkJaWYgKCFub1N0cmlwKQotCQkJICAgICpjbWRMaW5lID0gJ1wwJzsKLQkJCWFyZ3YgW2FyZ2MrK10gPSBwcmV2V29yZDsKLQkJCXByZXZXb3JkID0gTlVMTDsKLQkJCX0KLQkJICAgIGVsc2UKLQkJCW5vU3RyaXAgPSBUUlVFOwotCQkgICAgfQotCQlpblF1b3RlID0gIWluUXVvdGU7Ci0JCWJyZWFrOwotCSAgICBjYXNlICcgJyA6Ci0JICAgIGNhc2UgJ1x0JyA6Ci0JCWlmICghaW5RdW90ZSkgewotCQkgICAgaWYgKHByZXZXb3JkICE9IE5VTEwpIHsKLQkJCSpjbWRMaW5lID0gJ1wwJzsKLQkJCWFyZ3YgW2FyZ2MrK10gPSBwcmV2V29yZDsKLQkJCXByZXZXb3JkID0gTlVMTDsKLQkJCW5vU3RyaXAgPSBGQUxTRTsKLQkJCX0KLQkJICAgIH0KLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQgOgotCQlpZiAocHJldldvcmQgPT0gTlVMTCkKLQkJICAgIHByZXZXb3JkID0gY21kTGluZTsKLQkJYnJlYWs7Ci0JCX0KLQlpZiAoYXJnYyA+PSBtYXhBcmd2IC0gMSkKLQkgICAgYnJlYWs7Ci0JY21kTGluZSsrOwotCX0KLQotICAgIGlmICgocHJldldvcmQgIT0gTlVMTCB8fCAoaW5RdW90ZSAmJiBwcmV2V29yZCAhPSBOVUxMKSkgJiYgYXJnYyA8IG1heEFyZ3YgLSAxKSB7Ci0JKmNtZExpbmUgPSAnXDAnOwotCWFyZ3YgW2FyZ2MrK10gPSBwcmV2V29yZDsKLQl9Ci0gICAgYXJndlthcmdjXSA9IE5VTEw7Ci0KLSAgICAvKiBSZXR1cm4gdXBkYXRlZCBwYXJhbWV0ZXJzICovCi0gICAgcmV0dXJuICgqcGFyZ2MgPSBhcmdjKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWJlb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWJlb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzNGJkMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FiZW9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKLVBNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KLW9mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAotdGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQotbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKLXsKLSAgICAvKiBUT0RPOiBXZSBtYXkgdmVyeSB3ZWxsIHdhbnQgdG8gcHJvdmlkZSBhIHN5c3RlbSBzaGFyZWQgbGlicmFyeSAqLwotICAgIC8qICAgICAgIHRoYXQgZXBvcnRzIHRoZSBQTSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIE51Y2xldXMgbGlicmFyeSAqLwotICAgIC8qICAgICAgIGZvciBCZU9TIGhlcmUuIFRoYXQgd2lsbCBlbGltaW5hdGUgZmF0YWwgZXJyb3JzIGxvYWRpbmcgbmV3ICovCi0gICAgLyogICAgICAgZHJpdmVycyBvbiBCZU9TISAqLwotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlIHsKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCWdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0JdmFsdWUtPmxvdyA9IHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Ci0JdmFsdWUtPmhpZ2ggPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWRvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYmU3NzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBNU0RPUwotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBNU0RPUyBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtX2hlbHAuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotTm90aGluZyB0byBkbyBoZXJlIGZvciBET1MuIEJhc2ljYWxseSBzaW5jZSBET1MgaGFzIG5vIHN5c3RlbSB3aWRlIHNoYXJlZAotbGlicmFyeSBtZWNoYW5pc20gd2UgYXJlIGVzc2VudGlhbGx5IHNjcmV3ZWQgaWYgdGhlIGJpbmFyeSBBUEkgY2hhbmdlcy4KLUJ5IGRlZmF1bHQgZm9yIDMyLWJpdCBET1MgYXBwcyB0aGUgbG9jYWwgTnVjbGV1cyBkcml2ZXJzIHNob3VsZCBhbHdheXMgYmUKLXVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUgc3lzdGVtIHdpZGUgTnVjbGV1cyBkcml2ZXJzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmICFkZWZpbmVkKFRFU1RfSEFSTkVTUykgJiYgIWRlZmluZWQoVkJFVEVTVCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZSBET1MKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FsaWIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmVhY2MzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55IDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBlbnZpcm9ubWVudAotKgotKiBEZXNjcmlwdGlvbjogIEMgbW9kdWxlIGZvciB0aGUgR3JhcGhpY3MgQWNjZWxlcmF0b3IgRHJpdmVyIEFQSS4gVXNlcwotKiAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFBNIGxpYnJhcnkgZm9yIGludGVyZmFjaW5nIHdpdGggRE9TCi0qICAgICAgICAgICAgICAgZXh0ZW5kZXIgc3BlY2lmaWMgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi1HQV9leHBvcnRzICBfVkFSQVBJIF9fR0FfZXhwb3J0czsKLXN0YXRpYyBpbnQgICAgICAgICAgbG9hZGVkID0gZmFsc2U7Ci1zdGF0aWMgUEVfTU9EVUxFICAgICpoTW9kQlBEID0gTlVMTDsKLQotc3RhdGljIE5faW1wb3J0cyBfTl9pbXBvcnRzID0gewotICAgIHNpemVvZihOX2ltcG9ydHMpLAotICAgIF9PU19kZWxheSwKLSAgICB9OwotCi1zdGF0aWMgR0FfaW1wb3J0cyBfR0FfaW1wb3J0cyA9IHsKLSAgICBzaXplb2YoR0FfaW1wb3J0cyksCi0gICAgR0FfZ2V0U2hhcmVkSW5mbywKLSAgICBHQV9UaW1lckluaXQsCi0gICAgR0FfVGltZXJSZWFkLAotICAgIEdBX1RpbWVyRGlmZmVyZW5jZSwKLSAgICB9OwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRExMX05BTUUgICAgICAgICJncmFwaGljcy5icGQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyBubyBsb25nZXIgdXNlZCBidXQgd2UgbXVzdCBpbXBsZW1lbnQgaXQgYW5kIHJldHVybiBOVUxMCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGJpbmFyeSBkcml2ZXJzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmF0YWwgZXJyb3IgaGFuZGxlciBmb3Igbm9uLWV4cG9ydGVkIEdBX2V4cG9ydHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0dBX2ZhdGFsRXJyb3JIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5zdXBwb3J0ZWQgTnVjbGV1cyBleHBvcnQgZnVuY3Rpb24gY2FsbGVkISBQbGVhc2UgdXBncmFkZSB5b3VyIGNvcHkgb2YgTnVjbGV1cyFcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNoYXJlZCAgLSBUcnVlIHRvIGxvYWQgdGhlIGRyaXZlciBpbnRvIHNoYXJlZCBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1Mb2FkcyB0aGUgTnVjbGV1cyBiaW5hcnkgcG9ydGFibGUgRExMIGludG8gbWVtb3J5IGFuZCBpbml0aWxpc2VzIGl0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBMb2FkRHJpdmVyKAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBHQV9pbml0TGlicmFyeV90ICAgIEdBX2luaXRMaWJyYXJ5OwotICAgIEdBX2V4cG9ydHMgICAgICAgICAgKmdhRXhwOwotICAgIGNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgICAgICAgICAgICAgYnBkcGF0aFtQTV9NQVhfUEFUSF07Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpLG1heDsKLSAgICB1bG9uZyAgICAgICAgICAgICAgICpwOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCB0aGUgZHJpdmVyICovCi0gICAgaWYgKGxvYWRlZCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICBQTV9pbml0KCk7Ci0KLSAgICAvKiBGaXJzdCB0cnkgdG8gc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSBzeXN0ZW0gd2lkZSBzaGFyZWQgZXhwb3J0cwotICAgICAqIGlmIHRoZXkgYXJlIGF2YWlsYWJsZS4gVW5kZXIgT1MvMiB0aGlzIGNvbm5lY3RzIHRvIG91ciBnbG9iYWwKLSAgICAgKiBzaGFyZWQgTnVjbGV1cyBsb2FkZXIgaW4gU0REUE1JLkRMTC4KLSAgICAgKi8KLSAgICBfX0dBX2V4cG9ydHMuZHdTaXplID0gc2l6ZW9mKF9fR0FfZXhwb3J0cyk7Ci0gICAgaWYgKEdBX2dldFNoYXJlZEV4cG9ydHMoJl9fR0FfZXhwb3J0cyxzaGFyZWQpKQotCXJldHVybiBsb2FkZWQgPSB0cnVlOwotCi0gICAgLyogT3BlbiB0aGUgQlBEIGZpbGUgKi8KLSAgICBpZiAoIVBNX2ZpbmRCUEQoRExMX05BTUUsYnBkcGF0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsRExMX05BTUUpOwotICAgIGlmICgoaE1vZEJQRCA9IFBFX2xvYWRMaWJyYXJ5KGZpbGVuYW1lLHNoYXJlZCkpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICgoR0FfaW5pdExpYnJhcnkgPSAoR0FfaW5pdExpYnJhcnlfdClQRV9nZXRQcm9jQWRkcmVzcyhoTW9kQlBELCJfR0FfaW5pdExpYnJhcnkiKSkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgYnBkcGF0aFtzdHJsZW4oYnBkcGF0aCktMV0gPSAwOwotICAgIGlmIChzdHJjbXAoYnBkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKSA9PSAwKQotCXN0cmNweShicGRwYXRoLFBNX2dldE51Y2xldXNDb25maWdQYXRoKCkpOwotICAgIGVsc2UgewotCVBNX2JhY2tzbGFzaChicGRwYXRoKTsKLQlzdHJjYXQoYnBkcGF0aCwiY29uZmlnIik7Ci0JfQotICAgIGlmICgoZ2FFeHAgPSBHQV9pbml0TGlicmFyeShzaGFyZWQsYnBkcGF0aCxmaWxlbmFtZSxHQV9nZXRTeXN0ZW1QTUltcG9ydHMoKSwmX05faW1wb3J0cywmX0dBX2ltcG9ydHMpKSA9PSBOVUxMKQotCVBNX2ZhdGFsRXJyb3IoIkdBX2luaXRMaWJyYXJ5IGZhaWxlZCFcbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbGwgZGVmYXVsdCBpbXBvcnRzIHRvIHBvaW50IHRvIGZhdGFsIGVycm9yIGhhbmRsZXIKLSAgICAgKiBmb3IgdXB3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQgY29weSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLgotICAgICAqLwotICAgIG1heCA9IHNpemVvZihfX0dBX2V4cG9ydHMpL3NpemVvZihHQV9pbml0TGlicmFyeV90KTsKLSAgICBmb3IgKGkgPSAwLHAgPSAodWxvbmcqKSZfX0dBX2V4cG9ydHM7IGkgPCBtYXg7IGkrKykKLQkqcCsrID0gKHVsb25nKV9HQV9mYXRhbEVycm9ySGFuZGxlcjsKLSAgICBtZW1jcHkoJl9fR0FfZXhwb3J0cyxnYUV4cCxNSU4oc2l6ZW9mKF9fR0FfZXhwb3J0cyksZ2FFeHAtPmR3U2l6ZSkpOwotICAgIGxvYWRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHN0dWIgZW50cnkgcG9pbnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIHRvCi0gKiBpbml0aWFsaXNlIHRoZSBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LCBhbmQgd2UgdXNlIHRoaXMgdG8gbG9hZCBvdXIKLSAqIGRyaXZlciBETEwgZnJvbSBkaXNrIGFuZCBpbml0aWFsaXNlIHRoZSBsaWJyYXJ5IHVzaW5nIGl0LgotICovCi0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBHQV9zdGF0dXModm9pZCkKLXsKLSAgICBpZiAoIWxvYWRlZCkKLQlyZXR1cm4gbkRyaXZlck5vdEZvdW5kOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0Ffc3RhdHVzKCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1jb25zdCBjaGFyICogTkFQSSBHQV9lcnJvck1zZygKLSAgICBOX2ludDMyIHN0YXR1cykKLXsKLSAgICBpZiAoIWxvYWRlZCkKLQlyZXR1cm4gIlVuYWJsZSB0byBsb2FkIE51Y2xldXMgZGV2aWNlIGRyaXZlciEiOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZXJyb3JNc2coc3RhdHVzKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEdBX2dldERheXNMZWZ0KE5faW50MzIgc2hhcmVkKQotewotICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2dldERheXNMZWZ0KHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBHQV9yZWdpc3RlckxpY2Vuc2UodWNoYXIgKmxpY2Vuc2UsTl9pbnQzMiBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9yZWdpc3RlckxpY2Vuc2UobGljZW5zZSxzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaWJvb2wgTkFQSSBHQV9sb2FkSW5HVUkoTl9pbnQzMiBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfbG9hZEluR1VJKHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBHQV9lbnVtZXJhdGVEZXZpY2VzKE5faW50MzIgc2hhcmVkKQotewotICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQotCXJldHVybiAwOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZW51bWVyYXRlRGV2aWNlcyhzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotR0FfZGV2Q3R4ICogTkFQSSBHQV9sb2FkRHJpdmVyKE5faW50MzIgZGV2aWNlSW5kZXgsTl9pbnQzMiBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9sb2FkRHJpdmVyKGRldmljZUluZGV4LHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi12b2lkIE5BUEkgR0FfZ2V0R2xvYmFsT3B0aW9ucygKLSAgICBHQV9nbG9iYWxPcHRpb25zICpvcHRpb25zLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBpZiAoTG9hZERyaXZlcihzaGFyZWQpKQotCV9fR0FfZXhwb3J0cy5HQV9nZXRHbG9iYWxPcHRpb25zKG9wdGlvbnMsc2hhcmVkKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLVBFX01PRFVMRSAqIE5BUEkgR0FfbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pCUEROYW1lLAotICAgIHVsb25nICpzaXplLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoc2hhcmVkKSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2xvYWRMaWJyYXJ5KHN6QlBETmFtZSxzaXplLHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1HQV9kZXZDdHggKiBOQVBJIEdBX2dldEN1cnJlbnREcml2ZXIoCi0gICAgTl9pbnQzMiBkZXZpY2VJbmRleCkKLXsKLSAgICAvKiBCYWlsIGZvciBvbGRlciBkcml2ZXJzIHRoYXQgZGlkbid0IGV4cG9ydCB0aGlzIGZ1bmN0aW9uISAqLwotICAgIGlmICghX19HQV9leHBvcnRzLkdBX2dldEN1cnJlbnREcml2ZXIpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9nZXRDdXJyZW50RHJpdmVyKGRldmljZUluZGV4KTsKLX0KLQotLyoge3NlY3JldH0gKi8KLVJFRjJEX2RyaXZlciAqIE5BUEkgR0FfZ2V0Q3VycmVudFJlZjJkKAotICAgIE5faW50MzIgZGV2aWNlSW5kZXgpCi17Ci0gICAgLyogQmFpbCBmb3Igb2xkZXIgZHJpdmVycyB0aGF0IGRpZG4ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiEgKi8KLSAgICBpZiAoIV9fR0FfZXhwb3J0cy5HQV9nZXRDdXJyZW50UmVmMmQpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9nZXRDdXJyZW50UmVmMmQoZGV2aWNlSW5kZXgpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgR0FfaXNPRU1WZXJzaW9uKGlib29sIHNoYXJlZCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoc2hhcmVkKSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2lzT0VNVmVyc2lvbihzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotTl91aW50MzIgKiBOQVBJIEdBX2dldExpY2Vuc2VkRGV2aWNlcyhpYm9vbCBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9nZXRMaWNlbnNlZERldmljZXMoc2hhcmVkKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhbGludXguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTRlODUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogV2UgbWF5IHZlcnkgd2VsbCB3YW50IHRvIHByb3ZpZGUgYSBzeXN0ZW0gc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICB0aGF0IGVwb3J0cyB0aGUgUE0gZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBOdWNsZXVzIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICBmb3IgTGludXggaGVyZS4gVGhhdCB3aWxsIGVsaW1pbmF0ZSBmYXRhbCBlcnJvcnMgbG9hZGluZyBuZXcgKi8KLSAgICAvKiAgICAgICBkcml2ZXJzIG9uIExpbnV4ISAqLwotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlIHsKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCWdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0JdmFsdWUtPmxvdyA9IHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Ci0JdmFsdWUtPmhpZ2ggPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYW50ZHJ2LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FudGRydi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBmNzM3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYW50ZHJ2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBOVCBkZXZpY2UgZHJpdmVyCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIE5UIGRldmljZSBkcml2ZXJzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCi0gICAgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzLCBvciB0aGUgaW50ZXJuYWwgdmVyc2lvbiBpZiBub25lCi0KLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQloYXZlUkRUU0MgPSB0cnVlOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlLZVF1ZXJ5U3lzdGVtVGltZSgoTEFSR0VfSU5URUdFUiopdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhb3MyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FvczIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlNjUwMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FvczIuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE9TLzIgMzItYml0Ci0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIE9TLzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotI2RlZmluZSBJTkNMX0RPUwotI2RlZmluZSBJTkNMX1NVQgotI2RlZmluZSBJTkNMX1ZJTwotI2RlZmluZSBJTkNMX0tCRAotI2luY2x1ZGUgPG9zMi5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgaGF2ZVJEVFNDID0gZmFsc2U7Ci1zdGF0aWMgdWxvbmcgICAgcGFybXNbM107ICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi1zdGF0aWMgdWxvbmcgICAgcmVzdWx0WzRdOyAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZnVuYyAgICAgICAgLSBIZWxwZXIgZGV2aWNlIGRyaXZlciBmdW5jdGlvbiB0byBjYWxsCi0KLVJFVFVSTlM6Ci1GaXJzdCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciBpbiBwYXJtc091dFswXQotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gb3BlbiBvdXIgaGVscGVyIGRldmljZSBkcml2ZXIsIGNhbGwgaXQgYW5kIGNsb3NlIHRoZSBmaWxlCi1oYW5kbGUuIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIG9wZW4gdGhlIGRldmljZSBkcml2ZXIgZm9yIGV2ZXJ5IGNhbGwgYmVjYXVzZQotb2YgdHdvIHByb2JsZW1zOgotCi0gMS4gV2UgY2Fubm90IG9wZW4gYSBzaW5nbGUgZmlsZSBoYW5kbGUgaW4gYSBETEwgdGhhdCBpcyBzaGFyZWQgYW1vbmdzdAotICAgIHByb2dyYW1zLCBzaW5jZSBldmVyeSBwcm9jZXNzIG11c3QgaGF2ZSBpdCdzIG93biBvcGVuIGZpbGUgaGFuZGxlLgotCi0gMi4gRm9yIHNvbWUgcmVhc29uIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBsaW1pdCBvZiBhYm91dCAxMiBvcGVuIGZpbGUKLSAgICBoYW5kbGVzIG9uIGEgZGV2aWNlIGRyaXZlciBpbiB0aGUgc3lzdGVtLiBIZW5jZSB3aGVuIHdlIG9wZW4gbW9yZQotICAgIHRoYW4gYWJvdXQgMTIgZmlsZSBoYW5kbGVzIHRoaW5ncyBzdGFydCB0byBnbyB2ZXJ5IHN0cmFuZ2UuCi0KLUhlbmNlIHdlIHNpbXBseSBvcGVuIHRoZSBmaWxlIGhhbmRsZSBldmVyeSB0aW1lIHRoYXQgd2UgbmVlZCB0byBjYWxsIHRoZQotZGV2aWNlIGRyaXZlciB0byB3b3JrIGFyb3VuZCB0aGVzZSBwcm9ibGVtcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgQ2FsbFNEREhlbHAoCi0gICAgaW50IGZ1bmMpCi17Ci0gICAgc3RhdGljIHVsb25nICAgIGluTGVuOyAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotICAgIHN0YXRpYyB1bG9uZyAgICBvdXRMZW47ICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLSAgICBIRklMRSAgICAgICAgICAgaFNEREhlbHA7Ci0KLSAgICAvKiBJZiB0aGlzIGNvZGUgaW4gaGVyZSBmYWlscywgd2UgYXJlIHNjcmV3ZWQhIE1hbnkgb2Ygb3VyIGRyaXZlcnMKLSAgICAgKiB1c2UgdGhpcyBjb2RlIGFuZCBkb24ndCBoYXZlIGEgQyBsaWJyYXJ5LCBzbyB3ZSBzaW1wbHkgYXNzdW1lIHdlCi0gICAgICogY2FuJ3QgZmFpbCBoZXJlLgotICAgICAqLwotICAgIERvc09wZW4oUE1IRUxQX05BTUUsJmhTRERIZWxwLCZyZXN1bHRbMF0sMCwwLAotCSAgICBGSUxFX09QRU4sIE9QRU5fU0hBUkVfREVOWU5PTkUgfCBPUEVOX0FDQ0VTU19SRUFEV1JJVEUsCi0JICAgIE5VTEwpOwotICAgIERvc0RldklPQ3RsKGhTRERIZWxwLFBNSEVMUF9JT0NUTCxmdW5jLAotCSAgICAgJnBhcm1zLCBpbkxlbiA9IHNpemVvZihwYXJtcyksICZpbkxlbiwKLQkgICAgJnJlc3VsdCwgb3V0TGVuID0gc2l6ZW9mKHJlc3VsdCksICZvdXRMZW4pOwotICAgIERvc0Nsb3NlKGhTRERIZWxwKTsKLSAgICByZXR1cm4gcmVzdWx0WzBdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUZvciBPUy8yIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBiZWNhdXNlIE51Y2xldXMgaXMgYWx3YXlzCi1sb2FkZWQgdmlhIHRoZSBzaGFyZWQgU0REUE1JIGRyaXZlciB3aGVuIFNERCBpcyBsb2FkZWQgc28gd2UgZG9uJ3QgbmVlZAotYSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1nYUV4cCAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucwotc2hhcmVkICAtIFRydWUgaWYgY29ubmVjdGluZyB0byB0aGUgc2hhcmVkLCBnbG9iYWwgTnVjbGV1cyBkcml2ZXIKLQotUkVNQVJLUzoKLUZvciBPUy8yIGlmIFNERCBpcyBsb2FkZWQgd2UgKmFsd2F5cyogY29ubmVjdCB0byB0aGUgc2hhcmVkIE51Y2xldXMgZnVuY3Rpb25zCi1jb250YWluZWQgd2l0aGluIHRoZSBTRERQTUkgZHJpdmVyLiBUaGlzIGFsbG93cyB0aGUgTnVjbGV1cyBmdW5jdGlvbnMgY29udGFpbmVkCi13aXRoaW4gdGhpcyBkcml2ZXIgdG8gYmUgdXRpbGlzZWQgYnkgYWxsIE51Y2xldXMgYXBwcyBpbiB0aGUgc3lzdGVtIGFuZAotbWFpbnRhaW5zIGEgY29uc2lzdGVudCBzdGF0ZSBiZXR3ZWVuIHZlcnNpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgLyogSW4gdGVzdCBoYXJuZXNzIG1vZGUsIHdlIG5lZWQgdG8gbG9hZCBhIGxvY2FsIGNvcHkgb2YgTnVjbGV1cyAqLwotI2lmICFkZWZpbmVkIChURVNUX0hBUk5FU1MpIHx8IGRlZmluZWQgKERFQlVHX1NERFBNSSkKLSAgICBITU9EVUxFICAgICBoTW9kU0REUE1JOwotICAgIGNoYXIgICAgICAgIGJ1Zls4MF07Ci0gICAgR0FfZXhwb3J0cyAgKmV4cDsKLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgYW5kIGNvbm5lY3QgdG8gb3VyIHJ1bnRpbWUgRExMJ3MgKi8KLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKENhbGxTRERIZWxwKFBNSEVMUF9HRVRTSEFSRURFWFApICE9IDApIHsKLQkvKiBXZSBoYXZlIGZvdW5kIHRoZSBzaGFyZWQgTnVjbGV1cyBleHBvcnRzLiBCZWNhdXNlIG5vdCBhbGwgcHJvY2Vzc2VzCi0JICogbWFwIHRvIFNERFBNSS5ETEwsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd2UgY29ubmVjdCB0byB0aGlzCi0JICogRExMIHNvIHRoYXQgaXQgZ2V0cyBtYXBwZWQgaW50byBvdXIgYWRkcmVzcyBzcGFjZSAodGhhdCBpcwotCSAqIHdoZXJlIHRoZSBzaGFyZWQgTnVjbGV1cyBsb2FkZXIgY29kZSBpcyBsb2NhdGVkKS4gU2ltcGx5IGRvaW5nIGEKLQkgKiBEb3NMb2FkTW9kdWxlIG9uIGl0IGlzIGVub3VnaCBmb3IgdGhpcy4KLQkgKi8KLQlEb3NMb2FkTW9kdWxlKChQU1opYnVmLHNpemVvZihidWYpLChQU1opIlNERFBNSS5ETEwiLCZoTW9kU0REUE1JKTsKLQlleHAgPSAoR0FfZXhwb3J0cyopcmVzdWx0WzBdOwotCW1lbWNweShnYUV4cCxleHAsTUlOKGdhRXhwLT5kd1NpemUsZXhwLT5kd1NpemUpKTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0jZW5kaWYKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlEb3NUbXJRdWVyeVRpbWUoKFFXT1JEKil2YWx1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT24gT1MvMiwgd2UgbmVlZCBzcGVjaWFsIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpZiB3ZSBidWlsZCBTRERQTUkgaW4KLXRlc3QgaGFybmVzcyBtb2RlLiBCdXQgaWYgd2UgYnVpbGQgR0FUZXN0IGV0Yy4gaW4gdGVzdCBtb2RlLCB3ZSB3YW50IHRvIHVzZQotdGhlIG5vcm1hbCBDIHJ1bnRpbWUgZnVuY3Rpb25zLCBzbyByb3V0ZSB0aGVtIGJhY2sgaGVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBkZWZpbmVkIChURVNUX0hBUk5FU1MpICYmICFkZWZpbmVkIChERUJVR19TRERQTUkpCi0KLS8qIFVuZGVmaW5lIHRoZXNlIG1hY3JvcyBmaXJzdCBvciB3ZSdsbCByZWN1cnNlIHRvIGhlbGwhICovCi0jdW5kZWYgbWFsbG9jCi0jdW5kZWYgY2FsbG9jCi0jdW5kZWYgcmVhbGxvYwotI3VuZGVmIGZyZWUKLQotdm9pZCAqU0REUE1JX21hbGxvYyhzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgKlNERFBNSV9jYWxsb2Moc2l6ZV90IG51bSwgc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gY2FsbG9jKG51bSwgc2l6ZSk7Ci19Ci0KLXZvaWQgU0REUE1JX2ZyZWUodm9pZCAqcHRyKSB7Ci0gICAgZnJlZShwdHIpOwotfQotCi12b2lkICpTRERQTUlfcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gICAgcmV0dXJuIHJlYWxsb2MocHRyLCBzaXplKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FxbnguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXFueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjVkNjYyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXFueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIFFOWCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogV2UgbWF5IHZlcnkgd2VsbCB3YW50IHRvIHByb3ZpZGUgYSBzeXN0ZW0gc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICB0aGF0IGVwb3J0cyB0aGUgUE0gZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBOdWNsZXVzIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICBmb3IgUU5YIGhlcmUuIFRoYXQgd2lsbCBlbGltaW5hdGUgZmF0YWwgZXJyb3JzIGxvYWRpbmcgbmV3ICovCi0gICAgLyogICAgICAgZHJpdmVycyBvbiBRTlghICovCi0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UgewotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQotCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7Ci0JdmFsdWUtPmxvdyA9ICh0cy50dl9uc2VjIC8gMTAwMCArIHRzLnR2X3NlYyAqIDEwMDAwMDApOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FydHQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXJ0dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQxZjU5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXJ0dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgUlRUYXJnZXQtMzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKLVBNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KLW9mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAotdGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQotbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKLXsKLSAgICByZXR1cm4gJl9QTV9pbXBvcnRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgICh2b2lkKWdhRXhwOwotICAgICh2b2lkKXNoYXJlZDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfcXVlcnlGdW5jdGlvbnMoCi0gICAgR0FfZGV2Q3R4ICpkYywKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAotICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhc214LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FzbXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzMTk0MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FzbXguYworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIHNteDMyCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIHNteDMyIHBsYXRmb3JtIC0tIG5vIHZ4RCBzdXBwb3J0LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhdnhkLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F2eGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4YmE4ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F2eGQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBWeEQncy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JaGF2ZVJEVFNDID0gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlCi0JVlREX0dldF9SZWFsX1RpbWUoJnZhbHVlLT5oaWdoLCZ2YWx1ZS0+bG93KTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXdpbjMyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F3aW4zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ0MzM0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXdpbjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBTVFJJQ1QKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBETExfTkFNRSAgICAgICAgIm5nYV93MzIuZGxsIgotCi1leHRlcm4gSEFORExFICAgICAgICAgICBfUE1faERldmljZTsKLXN0YXRpYyBITU9EVUxFICAgICAgICAgIGhNb2RETEwgPSBOVUxMOwotc3RhdGljIGlib29sICAgICAgICAgICAgdXNlUmluZzBEcml2ZXIgPSBmYWxzZTsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLXN0YXRpYyBHQV9sYXJnZUludGVnZXIgIGNvdW50RnJlcTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2FkcyB0aGUgc2hhcmVkICJuZ2FfdzMyLmRsbCIgbGlicmFyeSBmcm9tIGRpc2sgYW5kIGNvbm5lY3RzIHRvIGl0LiBUaGlzCi1saWJyYXJ5IGlzICphbHdheXMqIGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBOdWNsZXVzCi1ncmFwaGljcy5icGQgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgTG9hZFNoYXJlZERMTCh2b2lkKQotewotICAgIGNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgICAgICAgICAgICAgYnBkcGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgbG9hZGVkIHRoZSBETEwgKi8KLSAgICBpZiAoaE1vZERMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICBQTV9pbml0KCk7Ci0KLSAgICAvKiBPcGVuIHRoZSBETEwgZmlsZSAqLwotICAgIGlmICghUE1fZmluZEJQRChETExfTkFNRSxicGRwYXRoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgc3RyY3B5KGZpbGVuYW1lLGJwZHBhdGgpOwotICAgIHN0cmNhdChmaWxlbmFtZSxETExfTkFNRSk7Ci0gICAgaWYgKChoTW9kRExMID0gTG9hZExpYnJhcnkoZmlsZW5hbWUpKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgotCi1Ob3RlIHRoYXQgZm9yIFdpbjMyIHdlIGFsc28gY2FsbCBpbnRvIHRoZSBsb2FkZWQgUE1IRUxQIGRldmljZSBkcml2ZXIKLWFzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIGxvY2FsIE51Y2xldXMgcGF0aCBmb3Igc3lzdGVtIHdpZGUgTnVjbGV1cwotZHJpdmVycy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsxXTsKLSAgICBEV09SRCAgIG91dEJ1ZlsxXSxvdXRDbnQ7Ci0KLSAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Ci0gICAgaWYgKF9QTV9oRGV2aWNlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JaW5CdWZbMF0gPSAoRFdPUkQpcGF0aDsKLQlEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HQVNFVExPQ0FMUEFUSDMyLAotCSAgICBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJm91dENudCwgTlVMTCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKLVBNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KLW9mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAotdGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQotbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKLXsKLSAgICBQTV9pbXBvcnRzICogcG1JbXA7Ci0gICAgUE1faW1wb3J0cyAqIChOQVBJUCBfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKSh2b2lkKTsKLQotICAgIGlmIChMb2FkU2hhcmVkRExMKCkpIHsKLQkvKiBOb3RlIHRoYXQgVmlzdWFsIEMrKyBidWlsZCBETEwncyB3aXRoIG9ubHkgYSBzaW5nbGUgdW5kZXJzY29yZSBpbiBmcm9udAotCSAqIG9mIHRoZSBleHBvcnRlZCBuYW1lIHdoaWxlIFdhdGNvbSBDIHByb3ZpZGVzIHR3byBvZiB0aGVtLiBXZSBjaGVjayBmb3IKLQkgKiBib3RoIHRvIGFsbG93IHdvcmtpbmcgd2l0aCBlaXRoZXIgY29tcGlsZWQgRExMLgotCSAqLwotCWlmICgoX0dBX2dldFN5c3RlbVBNSW1wb3J0cyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoTW9kRExMLCJfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzIikpICE9IE5VTEwpIHsKLQkgICAgaWYgKChfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fR0FfZ2V0U3lzdGVtUE1JbXBvcnRzIikpICE9IE5VTEwpIHsKLQkJcG1JbXAgPSBfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKCk7Ci0JCW1lbWNweSgmX1BNX2ltcG9ydHMscG1JbXAsTUlOKF9QTV9pbXBvcnRzLmR3U2l6ZSxwbUltcC0+ZHdTaXplKSk7Ci0JCXJldHVybiBwbUltcDsKLQkJfQotCSAgICB9Ci0JfQotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZ2FFeHAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMKLXNoYXJlZCAgLSBUcnVlIGlmIGNvbm5lY3RpbmcgdG8gdGhlIHNoYXJlZCwgZ2xvYmFsIE51Y2xldXMgZHJpdmVyCi0KLVJFTUFSS1M6Ci1Gb3IgV2luMzIgaWYgd2UgYXJlIGNvbm5lY3RpbmcgdG8gdGhlIHNoYXJlZCwgZ2xvYmFsIE51Y2xldXMgZHJpdmVyIChsb2FkZWQKLWF0IHJpbmcgMCkgdGhlbiB3ZSBuZWVkIHRvIGxvYWQgYSBzcGVjaWFsIG5nYV93MzIuZGxsIGxpYnJhcnkgd2hpY2ggY29udGFpbnMKLXRodW5rcyB0byBjYWxsIGRvd24gaW50byB0aGUgUmluZyAwIGRldmljZSBkcml2ZXIgYXMgbmVjZXNzYXJ5LiBJZiB3ZSBhcmUKLWNvbm5lY3RpbmcgdG8gdGhlIGFwcGxpY2F0aW9uIGxvY2FsIE51Y2xldXMgZHJpdmVycyAoaWU6IE51Y2xldXMgb24gRGlyZWN0RHJhdwotZW11bGF0aW9uIGxheWVyKSB0aGVuIHdlIGRvIG5vdGhpbmcgaGVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgIEdBX2V4cG9ydHMgKiBleHA7Ci0gICAgR0FfZXhwb3J0cyAqIChOQVBJUCBfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzKSh2b2lkKTsKLQotICAgIHVzZVJpbmcwRHJpdmVyID0gZmFsc2U7Ci0gICAgaWYgKHNoYXJlZCkgewotCWlmICghTG9hZFNoYXJlZERMTCgpKQotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gbG9hZCAiIERMTF9OQU1FICIhIik7Ci0JaWYgKChfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9HQV9nZXRTeXN0ZW1HQUV4cG9ydHMiKSkgPT0gTlVMTCkKLQkgICAgaWYgKChfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fR0FfZ2V0U3lzdGVtR0FFeHBvcnRzIikpID09IE5VTEwpCi0JCVBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBsb2FkICIgRExMX05BTUUgIiEiKTsKLQlleHAgPSBfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzKCk7Ci0JbWVtY3B5KGdhRXhwLGV4cCxNSU4oZ2FFeHAtPmR3U2l6ZSxleHAtPmR3U2l6ZSkpOwotCXVzZVJpbmcwRHJpdmVyID0gdHJ1ZTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgc3RhdGljIGlib29sIChOQVBJUCBfR0FfcXVlcnlGdW5jdGlvbnMpKEdBX2RldkN0eCAqZGMsTl91aW50MzIgaWQsdm9pZCBfRkFSXyAqZnVuY3MpID0gTlVMTDsKLQotICAgIGlmICh1c2VSaW5nMERyaXZlcikgewotCS8qIENhbGwgdGhlIHZlcnNpb24gaW4gbmdhX3czMi5kbGwgaWYgaXQgaXMgbG9hZGVkICovCi0JaWYgKCFfR0FfcXVlcnlGdW5jdGlvbnMpIHsKLQkgICAgaWYgKChfR0FfcXVlcnlGdW5jdGlvbnMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaE1vZERMTCwiX0dBX3F1ZXJ5RnVuY3Rpb25zIikpID09IE5VTEwpCi0JCWlmICgoX0dBX3F1ZXJ5RnVuY3Rpb25zID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fR0FfcXVlcnlGdW5jdGlvbnMiKSkgPT0gTlVMTCkKLQkJICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBnZXQgZXhwb3J0cyBmcm9tICIgRExMX05BTUUgIiEiKTsKLQkgICAgfQotCXJldHVybiBfR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotCX0KLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAotICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgc3RhdGljIGlib29sIChOQVBJUCBfUkVGMkRfcXVlcnlGdW5jdGlvbnMpKFJFRjJEX2RyaXZlciAqcmVmMmQsTl91aW50MzIgaWQsdm9pZCBfRkFSXyAqZnVuY3MpID0gTlVMTDsKLQotICAgIGlmICh1c2VSaW5nMERyaXZlcikgewotCS8qIENhbGwgdGhlIHZlcnNpb24gaW4gbmdhX3czMi5kbGwgaWYgaXQgaXMgbG9hZGVkICovCi0JaWYgKCFfUkVGMkRfcXVlcnlGdW5jdGlvbnMpIHsKLQkgICAgaWYgKChfUkVGMkRfcXVlcnlGdW5jdGlvbnMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaE1vZERMTCwiX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zIikpID09IE5VTEwpCi0JCWlmICgoX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fUkVGMkRfcXVlcnlGdW5jdGlvbnMiKSkgPT0gTlVMTCkKLQkJICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBnZXQgZXhwb3J0cyBmcm9tICIgRExMX05BTUUgIiEiKTsKLQkgICAgfQotCXJldHVybiBfUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotCX0KLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JaGF2ZVJEVFNDID0gdHJ1ZTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgZWxzZSBpZiAoUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopJmNvdW50RnJlcSkpIHsKLQloYXZlUkRUU0MgPSBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZQotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKil2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ3RmY2FsYy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2d0ZmNhbGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1NDdlOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ3RmY2FsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFZFU0EgR2VuZXJhbGl6ZWQgVGltaW5nIEZvcm11bGEgKEdURikKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAxLjEKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIERldmVsb3BlZCBieTogU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueS4KLSoKLSogRGVzY3JpcHRpb246ICBDIG1vZHVsZSBmb3IgZ2VuZXJhdGluZyBHVEYgY29tcGF0aWJsZSB0aW1pbmdzIGdpdmVuIGEgc2V0Ci0qICAgICAgICAgICAgICAgb2YgaW5wdXQgcmVxdWlyZW1lbnRzLiBUcmFuc2xhdGVkIGZyb20gdGhlIG9yaWdpbmFsIEdURgotKiAgICAgICAgICAgICAgIDEuMTQgc3ByZWFkc2hlZXQgZGVmaW5pdGlvbi4KLSoKLSogICAgICAgICAgICAgICBDb21waWxlIHdpdGggI2RlZmluZSBURVNUSU5HIHRvIGJ1aWxkIGEgY29tbWFuZCBsaW5lIHRlc3QKLSogICAgICAgICAgICAgICBwcm9ncmFtLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFRoZSBjb2RlIGluIGhlcmUgaGFzIGJlZW4gd3JpdHRlbiBmb3IgY2xhcml0eSBhbmQKLSogICAgICAgICAgICAgICAgICAgICB0byBmb2xsb3cgdGhlIG9yaWdpbmFsIEdURiBzcGVjIGFzIGNsb3NlbHkgYXMKLSogICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJndGYuaCIKLSNpZm5kZWYgX19XSU4zMl9WWERfXwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIEdURl9jb25zdGFudHMgR0MgPSB7Ci0gICAgMS44LCAgICAgICAgICAgICAgICAgICAgLyogTWFyZ2luIHNpemUgYXMgcGVyY2VudGFnZSBvZiBkaXNwbGF5ICAgICAqLwotICAgIDgsICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBjZWxsIGdyYW51bGFyaXR5ICAgICAgICAgICAgICAgKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAvKiBNaW5pbXVtIGZyb250IHBvcmNoIGluIGxpbmVzL2NoYXJzICAgICAgICovCi0gICAgMywgICAgICAgICAgICAgICAgICAgICAgLyogV2lkdGggb2YgViBzeW5jIGluIGxpbmVzICAgICAgICAgICAgICAgICAqLwotICAgIDgsICAgICAgICAgICAgICAgICAgICAgIC8qIFdpZHRoIG9mIEggc3luYyBhcyBwZXJjZW50IG9mIHRvdGFsICAgICAgKi8KLSAgICA1NTAsICAgICAgICAgICAgICAgICAgICAvKiBNaW5pbXVtIHZlcnRpY2FsIHN5bmMgKyBiYWNrIHBvcmNoICh1cykgICovCi0gICAgNjAwLCAgICAgICAgICAgICAgICAgICAgLyogQmxhbmtpbmcgZm9ybXVsYSBncmFkaWVudCAgICAgICAgICAgICAgICAqLwotICAgIDQwLCAgICAgICAgICAgICAgICAgICAgIC8qIEJsYW5raW5nIGZvcm11bGEgb2Zmc2V0ICAgICAgICAgICAgICAgICAgKi8KLSAgICAxMjgsICAgICAgICAgICAgICAgICAgICAvKiBCbGFua2luZyBmb3JtdWxhIHNjYWxpbmcgZmFjdG9yICAgICAgICAgICovCi0gICAgMjAsICAgICAgICAgICAgICAgICAgICAgLyogQmxhbmtpbmcgZm9ybXVsYSBzY2FsaW5nIGZhY3RvciB3ZWlnaHQgICAqLwotICAgIH07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBfX1dJTjMyX1ZYRF9fCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYSBWeEQsIHNvIHdlIHN0dWIgdGhlbSBvdXQgc28gdGhpcwotICogbW9kdWxlIHdpbGwgYXQgbGVhc3QgY29tcGlsZS4gQ2FsbGluZyB0aGUgZnVuY3Rpb25zIGluIGhlcmUgd2lsbCBkbwotICogc29tZXRoaW5nIHdpZXJkIQotICovCi1kb3VibGUgc3FydChkb3VibGUgeCkKLXsgcmV0dXJuIHg7IH0KLQotZG91YmxlIGZsb29yKGRvdWJsZSB4KQoteyByZXR1cm4geDsgfQotCi1kb3VibGUgcG93KGRvdWJsZSB4LGRvdWJsZSB5KQoteyByZXR1cm4geCp5OyB9Ci0jZW5kaWYKLQotc3RhdGljIGRvdWJsZSByb3VuZChkb3VibGUgdikKLXsKLSAgICByZXR1cm4gZmxvb3IodiArIDAuNSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdldEludGVybmFsQ29uc3RhbnRzKEdURl9jb25zdGFudHMgKmMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEdldEludGVybmFsQ29uc3RhbnRzCi0qIFBhcmFtZXRlcnM6ICAgYyAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGludGVybmFsIGNvbnN0YW50cwotKgotKiBEZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgdGhlIHJvdW5kZWQsIGludGVybmFsIHNldCBvZiBHVEYgY29uc3RhbnRzLgotKiAgICAgICAgICAgICAgIFRoZXNlIGNvbnN0YW50cyBhcmUgZGlmZmVyZW50IHRvIHRoZSByZWFsIEdURiBjb25zdGFudHMKLSogICAgICAgICAgICAgICB0aGF0IGNhbiBiZSBzZXQgdXAgZm9yIHRoZSBtb25pdG9yLiBUaGUgY2FsY3VsYXRpb25zIHRvCi0qICAgICAgICAgICAgICAgZ2V0IHRoZXNlIHJlYWwgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSAnV29yayBBcmVhJwotKiAgICAgICAgICAgICAgIGFmdGVyIHRoZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIEV4Y2VsIHNwcmVhZHNoZWV0LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBjLT5tYXJnaW4gPSBHQy5tYXJnaW47Ci0gICAgYy0+Y2VsbEdyYW4gPSByb3VuZChHQy5jZWxsR3Jhbik7Ci0gICAgYy0+bWluUG9yY2ggPSByb3VuZChHQy5taW5Qb3JjaCk7Ci0gICAgYy0+dlN5bmNScWQgPSByb3VuZChHQy52U3luY1JxZCk7Ci0gICAgYy0+aFN5bmMgPSBHQy5oU3luYzsKLSAgICBjLT5taW5WU3luY0JQID0gR0MubWluVlN5bmNCUDsKLSAgICBpZiAoR0MuayA9PSAwKQotCWMtPmsgPSAwLjAwMTsKLSAgICBlbHNlCi0JYy0+ayA9IEdDLms7Ci0gICAgYy0+bSA9IChjLT5rIC8gMjU2KSAqIEdDLm07Ci0gICAgYy0+YyA9IChHQy5jIC0gR0MuaikgKiAoYy0+ayAvIDI1NikgKyBHQy5qOwotICAgIGMtPmogPSBHQy5qOwotfQotCi12b2lkIEdURl9jYWxjVGltaW5ncyhkb3VibGUgaFBpeGVscyxkb3VibGUgdkxpbmVzLGRvdWJsZSBmcmVxLAotICAgIGludCB0eXBlLGlib29sIHdhbnRNYXJnaW5zLGlib29sIHdhbnRJbnRlcmxhY2UsR1RGX3RpbWluZ3MgKnQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEdURl9jYWxjVGltaW5ncwotKiBQYXJhbWV0ZXJzOiAgIGhQaXhlbHMgICAgIC0gWCByZXNvbHV0aW9uCi0qICAgICAgICAgICAgICAgdkxpbmVzICAgICAgLSBZIHJlc29sdXRpb24KLSogICAgICAgICAgICAgICBmcmVxICAgICAgICAtIEZyZXF1ZW5jeSAoSHosIEtIeiBvciBNSHogZGVwZW5kaW5nIG9uIHR5cGUpCi0qICAgICAgICAgICAgICAgdHlwZSAgICAgICAgLSAxIC0gdmVydGljYWwsIDIgLSBob3Jpem9udGFsLCAzIC0gZG90IGNsb2NrCi0qICAgICAgICAgICAgICAgbWFyZ2lucyAgICAgLSBUcnVlIGlmIG1hcmdpbnMgc2hvdWxkIGJlIGdlbmVyYXRlZAotKiAgICAgICAgICAgICAgIGludGVybGFjZSAgIC0gVHJ1ZSBpZiBpbnRlcmxhY2VkIHRpbWluZ3MgdG8gYmUgZ2VuZXJhdGVkCi0qICAgICAgICAgICAgICAgdCAgICAgICAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIHRpbWluZ3MKLSoKLSogRGVzY3JpcHRpb246ICBDYWxjdWxhdGVzIGEgc2V0IG9mIEdURiB0aW1pbmcgcGFyYW1ldGVycyBnaXZlbiBhIHNwZWNpZmllZAotKiAgICAgICAgICAgICAgIHJlc29sdXRpb24gYW5kIHZlcnRpY2FsIGZyZXF1ZW5jeS4gVGhlIGhvcml6b250YWwgZnJlcXVlbmN5Ci0qICAgICAgICAgICAgICAgYW5kIGRvdCBjbG9jayB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoaXMKLSogICAgICAgICAgICAgICByb3V0aW5lcy4KLSoKLSogICAgICAgICAgICAgICBGb3IgaW50ZXJsYWNlZCBtb2RlcyB0aGUgQ1JUQyBwYXJhbWV0ZXJzIGFyZSBjYWxjdWxhdGVkIGZvcgotKiAgICAgICAgICAgICAgIGEgc2luZ2xlIGZpZWxkLCBzbyB3aWxsIGJlIGhhbGYgd2hhdCB3b3VsZCBiZSB1c2VkIGluCi0qICAgICAgICAgICAgICAgYSBub24taW50ZXJsYWNlZCBtb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBkb3VibGUgICAgICAgICAgaW50ZXJsYWNlLHZGaWVsZFJhdGUsaFBlcmlvZDsKLSAgICBkb3VibGUgICAgICAgICAgdG9wTWFyZ2luTGluZXMsYm90TWFyZ2luTGluZXM7Ci0gICAgZG91YmxlICAgICAgICAgIGxlZnRNYXJnaW5QaXhlbHMscmlnaHRNYXJnaW5QaXhlbHM7Ci0gICAgZG91YmxlICAgICAgICAgIGhQZXJpb2RFc3QsdlN5bmNCUCx2QmFja1BvcmNoOwotICAgIGRvdWJsZSAgICAgICAgICB2VG90YWxMaW5lcyx2RmllbGRSYXRlRXN0OwotICAgIGRvdWJsZSAgICAgICAgICBoVG90YWxQaXhlbHMsaFRvdGFsQWN0aXZlUGl4ZWxzLGhCbGFua1BpeGVsczsKLSAgICBkb3VibGUgICAgICAgICAgaWRlYWxEdXR5Q3ljbGUsaFN5bmNXaWR0aCxoU3luY0JQLGhCYWNrUG9yY2g7Ci0gICAgZG91YmxlICAgICAgICAgIGlkZWFsSFBlcmlvZDsKLSAgICBkb3VibGUgICAgICAgICAgdkZyZXEsaEZyZXEsZG90Q2xvY2s7Ci0gICAgR1RGX2NvbnN0YW50cyAgIGM7Ci0KLSAgICAvKiBHZXQgcm91bmRlZCBHVEYgY29uc3RhbnRzIHVzZWQgZm9yIGludGVybmFsIGNhbGN1bGF0aW9ucyAqLwotICAgIEdldEludGVybmFsQ29uc3RhbnRzKCZjKTsKLQotICAgIC8qIE1vdmUgaW5wdXQgcGFyYW1ldGVycyBpbnRvIGFwcHJvcHJpYXRlIHZhcmlhYmxlcyAqLwotICAgIHZGcmVxID0gaEZyZXEgPSBkb3RDbG9jayA9IGZyZXE7Ci0KLSAgICAvKiBSb3VuZCBwaXhlbHMgdG8gY2hhcmFjdGVyIGNlbGwgZ3JhbnVsYXJpdHkgKi8KLSAgICBoUGl4ZWxzID0gcm91bmQoaFBpeGVscyAvIGMuY2VsbEdyYW4pICogYy5jZWxsR3JhbjsKLQotICAgIC8qIEZvciBpbnRlcmxhY2VkIG1vZGUgaGFsdmUgdGhlIHZlcnRpY2FsIHBhcmFtZXRlcnMsIGFuZCBkb3VibGUKLSAgICAgKiB0aGUgcmVxdWlyZWQgZmllbGQgcmVmcmVzaCByYXRlLgotICAgICAqLwotICAgIHZGaWVsZFJhdGUgPSB2RnJlcTsKLSAgICBpbnRlcmxhY2UgPSAwOwotICAgIGlmICh3YW50SW50ZXJsYWNlKQotCWRvdENsb2NrICo9IDI7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIGxpbmVzIGZvciBtYXJnaW5zICovCi0gICAgaWYgKHdhbnRNYXJnaW5zKSB7Ci0JdG9wTWFyZ2luTGluZXMgPSByb3VuZChjLm1hcmdpbiAvIDEwMCAqIHZMaW5lcyk7Ci0JYm90TWFyZ2luTGluZXMgPSByb3VuZChjLm1hcmdpbiAvIDEwMCAqIHZMaW5lcyk7Ci0JfQotICAgIGVsc2UgewotCXRvcE1hcmdpbkxpbmVzID0gMDsKLQlib3RNYXJnaW5MaW5lcyA9IDA7Ci0JfQotCi0gICAgaWYgKHR5cGUgIT0gR1RGX2xvY2tQRikgewotCWlmICh0eXBlID09IEdURl9sb2NrVkYpIHsKLQkgICAgLyogRXN0aW1hdGUgdGhlIGhvcml6b250YWwgcGVyaW9kICovCi0JICAgIGhQZXJpb2RFc3QgPSAoKDEvdkZpZWxkUmF0ZSkgLSAoYy5taW5WU3luY0JQLzEwMDAwMDApKSAvCi0JCSh2TGluZXMgKyAoMip0b3BNYXJnaW5MaW5lcykgKyBjLm1pblBvcmNoICsgaW50ZXJsYWNlKSAqIDEwMDAwMDA7Ci0KLQkgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHZTeW5jICsgYmFjayBwb3JjaCAqLwotCSAgICB2U3luY0JQID0gcm91bmQoYy5taW5WU3luY0JQIC8gaFBlcmlvZEVzdCk7Ci0JICAgIH0KLQllbHNlIGlmICh0eXBlID09IEdURl9sb2NrSEYpIHsKLQkgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHZTeW5jICsgYmFjayBwb3JjaCAqLwotCSAgICB2U3luY0JQID0gcm91bmQoKGMubWluVlN5bmNCUCAqIGhGcmVxKSAvIDEwMDApOwotCSAgICB9Ci0KLQkvKiBGaW5kIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIFYgYmFjayBwb3JjaCBhbG9uZSAqLwotCXZCYWNrUG9yY2ggPSB2U3luY0JQIC0gYy52U3luY1JxZDsKLQotCS8qIEZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgdmVydGljYWwgcGVyaW9kICovCi0JdlRvdGFsTGluZXMgPSB2TGluZXMgKyB0b3BNYXJnaW5MaW5lcyArIGJvdE1hcmdpbkxpbmVzICsgdlN5bmNCUAotCSAgICArIGludGVybGFjZSArIGMubWluUG9yY2g7Ci0KLQlpZiAodHlwZSA9PSBHVEZfbG9ja1ZGKSB7Ci0JICAgIC8qIEVzdGltYXRlIHRoZSB2ZXJ0aWNhbCBmcmVxdWVuY3kgKi8KLQkgICAgdkZpZWxkUmF0ZUVzdCA9IDEwMDAwMDAgLyAoaFBlcmlvZEVzdCAqIHZUb3RhbExpbmVzKTsKLQotCSAgICAvKiBGaW5kIHRoZSBhY3R1YWwgaG9yaXpvbnRhbCBwZXJpb2QgKi8KLQkgICAgaFBlcmlvZCA9IChoUGVyaW9kRXN0ICogdkZpZWxkUmF0ZUVzdCkgLyB2RmllbGRSYXRlOwotCi0JICAgIC8qIEZpbmQgdGhlIGFjdHVhbCB2ZXJ0aWNhbCBmaWVsZCBmcmVxdWVuY3kgKi8KLQkgICAgdkZpZWxkUmF0ZSA9IDEwMDAwMDAgLyAoaFBlcmlvZCAqIHZUb3RhbExpbmVzKTsKLQkgICAgfQotCWVsc2UgaWYgKHR5cGUgPT0gR1RGX2xvY2tIRikgewotCSAgICAvKiBGaW5kIHRoZSBhY3R1YWwgdmVydGljYWwgZmllbGQgZnJlcXVlbmN5ICovCi0JICAgIHZGaWVsZFJhdGUgPSAoaEZyZXEgLyB2VG90YWxMaW5lcykgKiAxMDAwOwotCSAgICB9Ci0JfQotCi0gICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgbGVmdCBhbmQgcmlnaHQgbWFyZ2lucyAqLwotICAgIGlmICh3YW50TWFyZ2lucykgewotCWxlZnRNYXJnaW5QaXhlbHMgPSByb3VuZChoUGl4ZWxzICogYy5tYXJnaW4pIC8gKDEwMCAqIGMuY2VsbEdyYW4pOwotCXJpZ2h0TWFyZ2luUGl4ZWxzID0gcm91bmQoaFBpeGVscyAqIGMubWFyZ2luKSAvICgxMDAgKiBjLmNlbGxHcmFuKTsKLQl9Ci0gICAgZWxzZSB7Ci0JbGVmdE1hcmdpblBpeGVscyA9IDA7Ci0JcmlnaHRNYXJnaW5QaXhlbHMgPSAwOwotCX0KLQotICAgIC8qIEZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgcGl4ZWxzIGluIGltYWdlICsgbWFyZ2lucyAqLwotICAgIGhUb3RhbEFjdGl2ZVBpeGVscyA9IGhQaXhlbHMgKyBsZWZ0TWFyZ2luUGl4ZWxzICsgcmlnaHRNYXJnaW5QaXhlbHM7Ci0KLSAgICBpZiAodHlwZSA9PSBHVEZfbG9ja1ZGKSB7Ci0JLyogRmluZCB0aGUgaWRlYWwgYmxhbmtpbmcgZHV0eSBjeWNsZSAqLwotCWlkZWFsRHV0eUN5Y2xlID0gYy5jIC0gKChjLm0gKiBoUGVyaW9kKSAvIDEwMDApOwotCX0KLSAgICBlbHNlIGlmICh0eXBlID09IEdURl9sb2NrSEYpIHsKLQkvKiBGaW5kIHRoZSBpZGVhbCBibGFua2luZyBkdXR5IGN5Y2xlICovCi0JaWRlYWxEdXR5Q3ljbGUgPSBjLmMgLSAoYy5tIC8gaEZyZXEpOwotCX0KLSAgICBlbHNlIGlmICh0eXBlID09IEdURl9sb2NrUEYpIHsKLQkvKiBGaW5kIGlkZWFsIGhvcml6b250YWwgcGVyaW9kIGZyb20gYmxhbmtpbmcgZHV0eSBjeWNsZSBmb3JtdWxhICovCi0JaWRlYWxIUGVyaW9kID0gKCgoYy5jIC0gMTAwKSArIChzcXJ0KChwb3coMTAwLWMuYywyKSkgKwotCSAgICAoMC40ICogYy5tICogKGhUb3RhbEFjdGl2ZVBpeGVscyArIHJpZ2h0TWFyZ2luUGl4ZWxzICsKLQkgICAgbGVmdE1hcmdpblBpeGVscykgLyBkb3RDbG9jaykpKSkgLyAoMiAqIGMubSkpICogMTAwMDsKLQotCS8qIEZpbmQgdGhlIGlkZWFsIGJsYW5raW5nIGR1dHkgY3ljbGUgKi8KLQlpZGVhbER1dHlDeWNsZSA9IGMuYyAtICgoYy5tICogaWRlYWxIUGVyaW9kKSAvIDEwMDApOwotCX0KLQotICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gYmxhbmtpbmcgdGltZSAqLwotICAgIGhCbGFua1BpeGVscyA9IHJvdW5kKChoVG90YWxBY3RpdmVQaXhlbHMgKiBpZGVhbER1dHlDeWNsZSkgLwotCSgoMTAwIC0gaWRlYWxEdXR5Q3ljbGUpICogYy5jZWxsR3JhbikpICogYy5jZWxsR3JhbjsKLQotICAgIC8qIEZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBwaXhlbHMgKi8KLSAgICBoVG90YWxQaXhlbHMgPSBoVG90YWxBY3RpdmVQaXhlbHMgKyBoQmxhbmtQaXhlbHM7Ci0KLSAgICAvKiBGaW5kIHRoZSBob3Jpem9udGFsIGJhY2sgcG9yY2ggKi8KLSAgICBoQmFja1BvcmNoID0gcm91bmQoKGhCbGFua1BpeGVscyAvIDIpIC8gYy5jZWxsR3JhbikgKiBjLmNlbGxHcmFuOwotCi0gICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBzeW5jIHdpZHRoICovCi0gICAgaFN5bmNXaWR0aCA9IHJvdW5kKCgoYy5oU3luYy8xMDApICogaFRvdGFsUGl4ZWxzKSAvIGMuY2VsbEdyYW4pICogYy5jZWxsR3JhbjsKLQotICAgIC8qIEZpbmQgdGhlIGhvcml6b250YWwgc3luYyArIGJhY2sgcG9yY2ggKi8KLSAgICBoU3luY0JQID0gaEJhY2tQb3JjaCArIGhTeW5jV2lkdGg7Ci0KLSAgICBpZiAodHlwZSA9PSBHVEZfbG9ja1BGKSB7Ci0JLyogRmluZCB0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKi8KLQloRnJlcSA9IChkb3RDbG9jayAvIGhUb3RhbFBpeGVscykgKiAxMDAwOwotCi0JLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHZTeW5jICsgYmFjayBwb3JjaCAqLwotCXZTeW5jQlAgPSByb3VuZCgoYy5taW5WU3luY0JQICogaEZyZXEpIC8gMTAwMCk7Ci0KLQkvKiBGaW5kIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIFYgYmFjayBwb3JjaCBhbG9uZSAqLwotCXZCYWNrUG9yY2ggPSB2U3luY0JQIC0gYy52U3luY1JxZDsKLQotCS8qIEZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgdmVydGljYWwgcGVyaW9kICovCi0JdlRvdGFsTGluZXMgPSB2TGluZXMgKyB0b3BNYXJnaW5MaW5lcyArIGJvdE1hcmdpbkxpbmVzICsgdlN5bmNCUAotCSAgICArIGludGVybGFjZSArIGMubWluUG9yY2g7Ci0KLQkvKiBGaW5kIHRoZSBhY3R1YWwgdmVydGljYWwgZmllbGQgZnJlcXVlbmN5ICovCi0JdkZpZWxkUmF0ZSA9IChoRnJlcSAvIHZUb3RhbExpbmVzKSAqIDEwMDA7Ci0JfQotICAgIGVsc2UgewotCWlmICh0eXBlID09IEdURl9sb2NrVkYpIHsKLQkgICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKi8KLQkgICAgaEZyZXEgPSAxMDAwIC8gaFBlcmlvZDsKLQkgICAgfQotCWVsc2UgaWYgKHR5cGUgPT0gR1RGX2xvY2tIRikgewotCSAgICAvKiBGaW5kIHRoZSBob3Jpem9udGFsIGZyZXF1ZW5jeSAqLwotCSAgICBoUGVyaW9kID0gMTAwMCAvIGhGcmVxOwotCSAgICB9Ci0KLQkvKiBGaW5kIHRoZSBwaXhlbCBjbG9jayBmcmVxdWVuY3kgKi8KLQlkb3RDbG9jayA9IGhUb3RhbFBpeGVscyAvIGhQZXJpb2Q7Ci0JfQotCi0gICAgLyogUmV0dXJuIHRoZSBjb21wdXRlZCBmcmVxdWVuY2llcyAqLwotICAgIHQtPnZGcmVxID0gdkZpZWxkUmF0ZTsKLSAgICB0LT5oRnJlcSA9IGhGcmVxOwotICAgIHQtPmRvdENsb2NrID0gZG90Q2xvY2s7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIHZlcnRpY2FsIHRpbWluZyBwYXJhbWV0ZXJzICovCi0gICAgdC0+aC5oVG90YWwgPSAoaW50KWhUb3RhbFBpeGVsczsKLSAgICB0LT5oLmhEaXNwID0gKGludCloVG90YWxBY3RpdmVQaXhlbHM7Ci0gICAgdC0+aC5oU3luY1N0YXJ0ID0gdC0+aC5oVG90YWwgLSAoaW50KWhTeW5jQlA7Ci0gICAgdC0+aC5oU3luY0VuZCA9IHQtPmguaFRvdGFsIC0gKGludCloQmFja1BvcmNoOwotICAgIHQtPmguaEZyb250UG9yY2ggPSB0LT5oLmhTeW5jU3RhcnQgLSB0LT5oLmhEaXNwOwotICAgIHQtPmguaFN5bmNXaWR0aCA9IChpbnQpaFN5bmNXaWR0aDsKLSAgICB0LT5oLmhCYWNrUG9yY2ggPSAoaW50KWhCYWNrUG9yY2g7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIHZlcnRpY2FsIHRpbWluZyBwYXJhbWV0ZXJzICovCi0gICAgdC0+di52VG90YWwgPSAoaW50KXZUb3RhbExpbmVzOwotICAgIHQtPnYudkRpc3AgPSAoaW50KXZMaW5lczsKLSAgICB0LT52LnZTeW5jU3RhcnQgPSB0LT52LnZUb3RhbCAtIChpbnQpdlN5bmNCUDsKLSAgICB0LT52LnZTeW5jRW5kID0gdC0+di52VG90YWwgLSAoaW50KXZCYWNrUG9yY2g7Ci0gICAgdC0+di52RnJvbnRQb3JjaCA9IHQtPnYudlN5bmNTdGFydCAtIHQtPnYudkRpc3A7Ci0gICAgdC0+di52U3luY1dpZHRoID0gKGludCljLnZTeW5jUnFkOwotICAgIHQtPnYudkJhY2tQb3JjaCA9IChpbnQpdkJhY2tQb3JjaDsKLSAgICBpZiAod2FudEludGVybGFjZSkgewotCS8qIEhhbHZlIHRoZSB0aW1pbmdzIGZvciBpbnRlcmxhY2VkIG1vZGVzICovCi0JdC0+di52VG90YWwgLz0gMjsKLQl0LT52LnZEaXNwIC89IDI7Ci0JdC0+di52U3luY1N0YXJ0IC89IDI7Ci0JdC0+di52U3luY0VuZCAvPSAyOwotCXQtPnYudkZyb250UG9yY2ggLz0gMjsKLQl0LT52LnZTeW5jV2lkdGggLz0gMjsKLQl0LT52LnZCYWNrUG9yY2ggLz0gMjsKLQl0LT5kb3RDbG9jayAvPSAyOwotCX0KLQotICAgIC8qIE1hcmsgYXMgR1RGIHRpbWluZyB1c2luZyB0aGUgc3luYyBwb2xhcml0aWVzICovCi0gICAgdC0+aW50ZXJsYWNlID0gKHdhbnRJbnRlcmxhY2UpID8gJ0knIDogJ04nOwotICAgIHQtPmhTeW5jUG9sID0gJy0nOwotICAgIHQtPnZTeW5jUG9sID0gJysnOwotfQotCi12b2lkIEdURl9nZXRDb25zdGFudHMoR1RGX2NvbnN0YW50cyAqY29uc3RhbnRzKQoteyAqY29uc3RhbnRzID0gR0M7IH0KLQotdm9pZCBHVEZfc2V0Q29uc3RhbnRzKEdURl9jb25zdGFudHMgKmNvbnN0YW50cykKLXsgR0MgPSAqY29uc3RhbnRzOyB9Ci0KLSNpZmRlZiAgVEVTVElOR19HVEYKLQotdm9pZCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBGSUxFICAgICAgICAqZjsKLSAgICBkb3VibGUgICAgICB4UGl4ZWxzLHlQaXhlbHMsZnJlcTsKLSAgICBpYm9vbCAgICAgICBpbnRlcmxhY2U7Ci0gICAgR1RGX3RpbWluZ3MgdDsKLQotICAgIGlmIChhcmdjICE9IDUgJiYgYXJnYyAhPSA2KSB7Ci0JcHJpbnRmKCJVc2FnZTogR1RGQ0FMQyA8eFBpeGVscz4gPHlQaXhlbHM+IDxmcmVxPiBbW0h6XSBbS0h6XSBbTUh6XV0gW0ldXG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJ3aGVyZSA8eFBpeGVscz4gaXMgdGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBvZiB0aGUgbW9kZSwgPHlQaXhlbHM+IGlzIHRoZVxuIik7Ci0JcHJpbnRmKCJ2ZXJ0aWNhbCByZXNvbHV0aW9uIG9mIHRoZSBtb2RlLiBUaGUgPGZyZXE+IHZhbHVlIHdpbGwgYmUgdGhlIGZyZXF1ZW5jeSB0b1xuIik7Ci0JcHJpbnRmKCJkcml2ZSB0aGUgY2FsY3VsYXRpb25zLCBhbmQgd2lsbCBiZSBlaXRoZXIgdGhlIHZlcnRpY2FsIGZyZXF1ZW5jeSAoaW4gSHopXG4iKTsKLQlwcmludGYoInRoZSBob3Jpem9udGFsIGZyZXF1ZW5jeSAoaW4gS0h6KSBvciB0aGUgZG90IGNsb2NrIChpbiBNSHopLiBUbyBnZW5lcmF0ZVxuIik7Ci0JcHJpbnRmKCJ0aW1pbmdzIGZvciBhbiBpbnRlcmxhY2VkIG1vZGUsIGFkZCAnSScgdG8gdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLlxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiRm9yIGV4YW1wbGUgdG8gZ2VuZXJhdGUgdGltaW5ncyBmb3IgNjQweDQ4MCBhdCA2MEh6IHZlcnRpY2FsOlxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiICAgIEdURkNBTEMgNjQwIDQ4MCA2MCBIelxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiRm9yIGV4YW1wbGUgdG8gZ2VuZXJhdGUgdGltaW5ncyBmb3IgNjQweDQ4MCBhdCAzMS41S0h6IGhvcml6b250YWw6XG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCIgICAgR1RGQ0FMQyA2NDAgNDgwIDMxLjUgS0h6XG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJGb3IgZXhhbXBsZSB0byBnZW5lcmF0ZSB0aW1pbmdzIGZvciA2NDB4NDgwIHdpdGggYSAyNS4xNzVNaHogZG90IGNsb2NrOlxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiICAgIEdURkNBTEMgNjQwIDQ4MCAyNS4xNzUgTUh6XG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJHVEZDQUxDIHdpbGwgcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSByZXN1bHRzIGZvdW5kLCBhbmQgZHVtcCB0aGUgQ1JUQ1xuIik7Ci0JcHJpbnRmKCJ2YWx1ZXMgdG8gdGhlIFVWQ09ORklHLkNSVCBmaWxlIGluIHRoZSBmb3JtYXQgdXNlZCBieSBTY2lUZWNoIERpc3BsYXkgRG9jdG9yLlxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0KLSAgICAvKiBHZXQgdmFsdWVzIGZyb20gY29tbWFuZCBsaW5lICovCi0gICAgeFBpeGVscyA9IGF0b2YoYXJndlsxXSk7Ci0gICAgeVBpeGVscyA9IGF0b2YoYXJndlsyXSk7Ci0gICAgZnJlcSA9IGF0b2YoYXJndlszXSk7Ci0gICAgaW50ZXJsYWNlID0gKChhcmdjID09IDYpICYmIChhcmd2WzVdWzBdID09ICdJJykpOwotCi0gICAgLyogQ29tcHV0ZSB0aGUgQ1JUQyB0aW1pbmdzICovCi0gICAgaWYgKHRvdXBwZXIoYXJndls0XVswXSkgPT0gJ0gnKQotCUdURl9jYWxjVGltaW5ncyh4UGl4ZWxzLHlQaXhlbHMsZnJlcSxHVEZfbG9ja1ZGLGZhbHNlLGludGVybGFjZSwmdCk7Ci0gICAgZWxzZSBpZiAodG91cHBlcihhcmd2WzRdWzBdKSA9PSAnSycpCi0JR1RGX2NhbGNUaW1pbmdzKHhQaXhlbHMseVBpeGVscyxmcmVxLEdURl9sb2NrSEYsZmFsc2UsaW50ZXJsYWNlLCZ0KTsKLSAgICBlbHNlIGlmICh0b3VwcGVyKGFyZ3ZbNF1bMF0pID09ICdNJykKLQlHVEZfY2FsY1RpbWluZ3MoeFBpeGVscyx5UGl4ZWxzLGZyZXEsR1RGX2xvY2tQRixmYWxzZSxpbnRlcmxhY2UsJnQpOwotICAgIGVsc2UgewotCXByaW50ZigiVW5rbm93biBjb21tYW5kIGxpbmUhXG4iKTsKLQlleGl0KDEpOwotCX0KLQotICAgIC8qIER1bXAgc3VtbWFyeSBpbmZvIHRvIHN0YW5kYXJkIG91dHB1dCAqLwotICAgIHByaW50ZigiQ1JUQyB2YWx1ZXMgZm9yICUuMGZ4JS4wZiBAICUuMmYgJXNcbiIsIHhQaXhlbHMsIHlQaXhlbHMsIGZyZXEsIGFyZ3ZbNF0pOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIiAgaFRvdGFsICAgICAgPSAlLTRkICAgIHZUb3RhbCAgICAgID0gJS00ZFxuIiwKLQl0LmguaFRvdGFsLCB0LnYudlRvdGFsKTsKLSAgICBwcmludGYoIiAgaERpc3AgICAgICAgPSAlLTRkICAgIHZEaXNwICAgICAgID0gJS00ZFxuIiwKLQl0LmguaERpc3AsIHQudi52RGlzcCk7Ci0gICAgcHJpbnRmKCIgIGhTeW5jU3RhcnQgID0gJS00ZCAgICB2U3luY1N0YXJ0ICA9ICUtNGRcbiIsCi0JdC5oLmhTeW5jU3RhcnQsIHQudi52U3luY1N0YXJ0KTsKLSAgICBwcmludGYoIiAgaFN5bmNFbmQgICAgPSAlLTRkICAgIHZTeW5jRW5kICAgID0gJS00ZFxuIiwKLQl0LmguaFN5bmNFbmQsIHQudi52U3luY0VuZCk7Ci0gICAgcHJpbnRmKCIgIGhGcm9udFBvcmNoID0gJS00ZCAgICB2RnJvbnRQb3JjaCA9ICUtNGRcbiIsCi0JdC5oLmhGcm9udFBvcmNoLCB0LnYudkZyb250UG9yY2gpOwotICAgIHByaW50ZigiICBoU3luY1dpZHRoICA9ICUtNGQgICAgdlN5bmNXaWR0aCAgPSAlLTRkXG4iLAotCXQuaC5oU3luY1dpZHRoLCB0LnYudlN5bmNXaWR0aCk7Ci0gICAgcHJpbnRmKCIgIGhCYWNrUG9yY2ggID0gJS00ZCAgICB2QmFja1BvcmNoICA9ICUtNGRcbiIsCi0JdC5oLmhCYWNrUG9yY2gsIHQudi52QmFja1BvcmNoKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCIgIEludGVybGFjZWQgID0gJXNcbiIsICh0LmludGVybGFjZSA9PSAnSScpID8gIlllcyIgOiAiTm8iKTsKLSAgICBwcmludGYoIiAgSCBzeW5jIHBvbCAgPSAlY1xuIiwgdC5oU3luY1BvbCk7Ci0gICAgcHJpbnRmKCIgIFYgc3luYyBwb2wgID0gJWNcbiIsIHQudlN5bmNQb2wpOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIiAgVmVydCBmcmVxICAgPSAlLjJmIEh6XG4iLCB0LnZGcmVxKTsKLSAgICBwcmludGYoIiAgSG9yaXogZnJlcSAgPSAlLjJmIEtIelxuIiwgdC5oRnJlcSk7Ci0gICAgcHJpbnRmKCIgIERvdCBDbG9jayAgID0gJS4yZiBNaHpcbiIsICAgIHQuZG90Q2xvY2spOwotCi0gICAgLyogRHVtcCB0byBmaWxlIGluIGZvcm1hdCB1c2VkIGJ5IFNjaVRlY2ggRGlzcGxheSBEb2N0b3IgKi8KLSAgICBpZiAoKGYgPSBmb3BlbigiVVZDT05GSUcuQ1JUIiwidyIpKSAhPSBOVUxMKSB7Ci0JZnByaW50ZihmLCAiWyUuMGYgJS4wZl1cbiIsIHhQaXhlbHMsIHlQaXhlbHMpOwotCWZwcmludGYoZiwgIiVkICVkICVkICVkICclYycgJXNcbiIsCi0JICAgIHQuaC5oVG90YWwsIHQuaC5oRGlzcCwKLQkgICAgdC5oLmhTeW5jU3RhcnQsIHQuaC5oU3luY0VuZCwKLQkgICAgdC5oU3luY1BvbCwgKHQuaW50ZXJsYWNlID09ICdJJykgPyAiSSIgOiAiTkkiKTsKLQlmcHJpbnRmKGYsICIlZCAlZCAlZCAlZCAnJWMnXG4iLAotCSAgICB0LnYudlRvdGFsLCB0LnYudkRpc3AsCi0JICAgIHQudi52U3luY1N0YXJ0LCB0LnYudlN5bmNFbmQsCi0JICAgIHQudlN5bmNQb2wpOwotCWZwcmludGYoZiwgIiUuMmZcbiIsIHQuZG90Q2xvY2spOwotCWZjbG9zZShmKTsKLQl9Ci19Ci0KLSNlbmRpZiAgLyogVEVTVElORyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2xpYmNpbXAuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9saWJjaW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNzNhZDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2xpYmNpbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNR0wgR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgdG8gaW1wbGVtZW50IGEgdGhlIE9TIHNwZWNpZmljIHNpZGUgb2YgdGhlIEJpbmFyeQotKiAgICAgICAgICAgICAgIFBvcnRhYmxlIERMTCBDIHJ1bnRpbWUgbGlicmFyeS4gVGhlIGZ1bmN0aW9ucyBpbiBoZXJlCi0qICAgICAgICAgICAgICAgYXJlIGltcG9ydGVkIGludG8gdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwncyB0byBpbXBsZW1lbnQKLSogICAgICAgICAgICAgICBPUyBzcGVjaWZpYyBzZXJ2aWNlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotI2luY2x1ZGUgImRydmxpYi9wZWxvYWRlci5oIgotI2luY2x1ZGUgImRydmxpYi9hdHRyaWIuaCIKLSNpbmNsdWRlICJkcnZsaWIvbGliYy9pbml0LmgiCi0jZGVmaW5lIF9fQlVJTERJTkdfUEVfTE9BREVSX18KLSNpbmNsdWRlICJkcnZsaWIvbGliYy9maWxlLmgiCi0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKQotI2luY2x1ZGUgInZ4ZGZpbGUuaCIKLSNlbmRpZgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19VTklYX18pCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgotI2luY2x1ZGUgImRydmxpYi9hdHRyaWIuaCIKLSNpbmNsdWRlICJkcnZsaWIvbGliYy9pbml0LmgiCi0jZGVmaW5lIF9fQlVJTERJTkdfUEVfTE9BREVSX18KLSNpbmNsdWRlICJkcnZsaWIvbGliYy9maWxlLmgiCi0jaWYgZGVmaW5lZChfX1dJTkRPV1NfXykgfHwgZGVmaW5lZChUTlQpIHx8IGRlZmluZWQoX19SVFRBUkdFVF9fKQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFNUUklDVAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2lmZGVmICBfX01TRE9TX18KLSNpbmNsdWRlIDxkb3MuaD4KLSNlbmRpZgotI2lmZGVmICBfX09TMl9fCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfU1VCCi0jaW5jbHVkZSA8b3MyLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBObyB0ZXh0IG9yIGJpbmFyeSBtb2RlcyBmb3IgVW5peCAqLwotCi0jaWZuZGVmIE9fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZICAgIDAKLSNkZWZpbmUgT19URVhUICAgICAgMAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNkZWZpbmUgTUFYX0ZJTEVTICAgMTYKLXN0YXRpYyBGSUxFICpvcGVuSGFuZGxlc1tNQVhfRklMRVNdID0ge05VTEx9OwotI2VuZGlmCi0KLS8qIDxzdGRsaWIuaD4gc3R1YiBmdW5jdGlvbnMgKi8KLXZvaWQgICAgX0NERUNMIHN0dWJfYWJvcnQodm9pZCk7Ci1pbnQgICAgIF9DREVDTCBzdHViX2F0ZXhpdCh2b2lkICgqKSh2b2lkKSk7Ci12b2lkICogIF9DREVDTCBzdHViX2NhbGxvYyhzaXplX3QgX25lbGVtLCBzaXplX3QgX3NpemUpOwotdm9pZCAgICBfQ0RFQ0wgc3R1Yl9leGl0KGludCBfc3RhdHVzKTsKLXZvaWQgICAgX0NERUNMIHN0dWJfZnJlZSh2b2lkICpfcHRyKTsKLWNoYXIgKiAgX0NERUNMIHN0dWJfZ2V0ZW52KGNvbnN0IGNoYXIgKl9uYW1lKTsKLXZvaWQgKiAgX0NERUNMIHN0dWJfbWFsbG9jKHNpemVfdCBfc2l6ZSk7Ci12b2lkICogIF9DREVDTCBzdHViX3JlYWxsb2Modm9pZCAqX3B0ciwgc2l6ZV90IF9zaXplKTsKLWludCAgICAgX0NERUNMIHN0dWJfc3lzdGVtKGNvbnN0IGNoYXIgKl9zKTsKLWludCAgICAgX0NERUNMIHN0dWJfcHV0ZW52KGNvbnN0IGNoYXIgKl92YWwpOwotCi0vKiA8bGliYy9maWxlLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgICAgIF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKTsKLWludCAgICAgX0NERUNMIHN0dWJfYWNjZXNzKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX2Ftb2RlKTsKLWludCAgICAgX0NERUNMIHN0dWJfY2xvc2UoaW50IF9maWxkZXMpOwotb2ZmX3QgICBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpOwotc2l6ZV90ICBfQ0RFQ0wgc3R1Yl9yZWFkKGludCBfZmlsZGVzLCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKTsKLWludCAgICAgX0NERUNMIHN0dWJfdW5saW5rKGNvbnN0IGNoYXIgKl9wYXRoKTsKLXNpemVfdCAgX0NERUNMIHN0dWJfd3JpdGUoaW50IF9maWxkZXMsIGNvbnN0IHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpOwotaW50ICAgICBfQ0RFQ0wgc3R1Yl9pc2F0dHkoaW50IF9maWxkZXMpOwotCi0vKiA8c3RkaW8uaD4gc3R1YiBmdW5jdGlvbnMgKi8KLWludCAgICAgX0NERUNMIHN0dWJfcmVtb3ZlKGNvbnN0IGNoYXIgKl9maWxlbmFtZSk7Ci1pbnQgICAgIF9DREVDTCBzdHViX3JlbmFtZShjb25zdCBjaGFyICpfb2xkLCBjb25zdCBjaGFyICpfbmV3KTsKLQotLyogPHRpbWUuaD4gc3R1YiBmdW5jdGlvbnMgKi8KLXRpbWVfdCAgX0NERUNMIHN0dWJfdGltZSh0aW1lX3QgKl90b2QpOwotCi0vKiA8c2lnbmFsLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgICAgIF9DREVDTCBzdHViX3JhaXNlKGludCk7Ci12b2lkICogIF9DREVDTCBzdHViX3NpZ25hbChpbnQsIHZvaWQgKik7Ci0KLS8qIDxkcnZsaWIvYXR0cmliLmg+IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBzdHViX09TX3NldGZpbGVhdHRyICAgIF9PU19zZXRmaWxlYXR0cgotI2RlZmluZSBzdHViX09TX2dldGN1cnJlbnRkYXRlIF9PU19nZXRjdXJyZW50ZGF0ZQotCi1MSUJDX2ltcG9ydHMgICAgX1ZBUkFQSSBfX19pbXBvcnRzID0gewotICAgIHNpemVvZihMSUJDX2ltcG9ydHMpLAotCi0gICAgLyogPHN0ZGxpYi5oPiBleHBvcnRzICovCi0gICAgc3R1Yl9hYm9ydCwKLSAgICBzdHViX2F0ZXhpdCwKLSAgICBzdHViX2NhbGxvYywKLSAgICBzdHViX2V4aXQsCi0gICAgc3R1Yl9mcmVlLAotICAgIHN0dWJfZ2V0ZW52LAotICAgIHN0dWJfbWFsbG9jLAotICAgIHN0dWJfcmVhbGxvYywKLSAgICBzdHViX3N5c3RlbSwKLSAgICBzdHViX3B1dGVudiwKLQotICAgIC8qIDxsaWJjL2ZpbGUuaD4gZXhwb3J0cyAqLwotICAgIHN0dWJfb3BlbiwKLSAgICBzdHViX2FjY2VzcywKLSAgICBzdHViX2Nsb3NlLAotICAgIHN0dWJfbHNlZWssCi0gICAgc3R1Yl9yZWFkLAotICAgIHN0dWJfdW5saW5rLAotICAgIHN0dWJfd3JpdGUsCi0gICAgc3R1Yl9pc2F0dHksCi0KLSAgICAvKiA8c3RkaW8uaD4gZXhwb3J0cyAqLwotICAgIHN0dWJfcmVtb3ZlLAotICAgIHN0dWJfcmVuYW1lLAotCi0gICAgLyogPHNpZ25hbC5oPiBmdW5jdGlvbnMgKi8KLSAgICBzdHViX3JhaXNlLAotICAgIHN0dWJfc2lnbmFsLAotCi0gICAgLyogPHRpbWUuaD4gZXhwb3J0cyAqLwotICAgIHN0dWJfdGltZSwKLQotICAgIC8qIDxkcnZsaWIvYXR0cmliLmg+IGV4cG9ydHMgKi8KLSAgICBzdHViX09TX3NldGZpbGVhdHRyLAotICAgIHN0dWJfT1NfZ2V0Y3VycmVudGRhdGUsCi0gICAgfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0dWIgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogPHN0ZGxpYi5oPiBzdHViIGZ1bmN0aW9ucyAqLwotdm9pZCBfQ0RFQ0wgc3R1Yl9hYm9ydCh2b2lkKQotewotI2lmICFkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotaW50IF9DREVDTCBzdHViX2F0ZXhpdCh2b2lkICgqZnVuYykodm9pZCkpCi17Ci0jaWYgIWRlZmluZWQoIF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgcmV0dXJuIGF0ZXhpdCgodm9pZCgqKSh2b2lkKSlmdW5jKTsKLSNlbHNlCi0gICAgcmV0dXJuIC0xOwotI2VuZGlmCi19Ci0KLXZvaWQgKiBfQ0RFQ0wgc3R1Yl9jYWxsb2Moc2l6ZV90IF9uZWxlbSwgc2l6ZV90IF9zaXplKQoteyByZXR1cm4gX19QTV9jYWxsb2MoX25lbGVtLF9zaXplKTsgfQotCi12b2lkIF9DREVDTCBzdHViX2V4aXQoaW50IF9zdGF0dXMpCi17Ci0jaWYgIWRlZmluZWQoIF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgZXhpdChfc3RhdHVzKTsKLSNlbmRpZgotfQotCi12b2lkIF9DREVDTCBzdHViX2ZyZWUodm9pZCAqX3B0cikKLXsgX19QTV9mcmVlKF9wdHIpOyB9Ci0KLWNoYXIgKiBfQ0RFQ0wgc3R1Yl9nZXRlbnYoY29uc3QgY2hhciAqX25hbWUpCi17Ci0jaWYgZGVmaW5lZCggX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotICAgIHJldHVybiBOVUxMOwotI2Vsc2UKLSAgICByZXR1cm4gZ2V0ZW52KF9uYW1lKTsKLSNlbmRpZgotfQotCi12b2lkICogX0NERUNMIHN0dWJfbWFsbG9jKHNpemVfdCBfc2l6ZSkKLXsgcmV0dXJuIF9fUE1fbWFsbG9jKF9zaXplKTsgfQotCi12b2lkICogX0NERUNMIHN0dWJfcmVhbGxvYyh2b2lkICpfcHRyLCBzaXplX3QgX3NpemUpCi17IHJldHVybiBfX1BNX3JlYWxsb2MoX3B0cixfc2l6ZSk7IH0KLQotaW50IF9DREVDTCBzdHViX3N5c3RlbShjb25zdCBjaGFyICpfcykKLXsKLSNpZiBkZWZpbmVkKF9fV0lORE9XU19fKSB8fCBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykgfHwgZGVmaW5lZChfX1NNWDMyX18pIHx8IGRlZmluZWQoX19SVFRBUkdFVF9fKQotICAgICh2b2lkKV9zOwotICAgIHJldHVybiAtMTsKLSNlbHNlCi0gICAgcmV0dXJuIHN5c3RlbShfcyk7Ci0jZW5kaWYKLX0KLQotaW50IF9DREVDTCBzdHViX3B1dGVudihjb25zdCBjaGFyICpfdmFsKQotewotI2lmIGRlZmluZWQoIF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSAgICByZXR1cm4gLTE7Ci0jZWxzZQotICAgIHJldHVybiBwdXRlbnYoKGNoYXIqKV92YWwpOwotI2VuZGlmCi19Ci0KLXRpbWVfdCBfQ0RFQ0wgc3R1Yl90aW1lKHRpbWVfdCAqX3RvZCkKLXsKLSNpZiBkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgcmV0dXJuIDA7Ci0jZWxzZQotICAgIHJldHVybiB0aW1lKF90b2QpOwotI2VuZGlmCi19Ci0KLSNpZiAgICAgZGVmaW5lZChfX01TRE9TX18pCi0KLSNpZiBkZWZpbmVkKFROVCkgJiYgZGVmaW5lZChfTVNDX1ZFUikKLQotdm9pZCBfQ0RFQ0wgX09TX3NldGZpbGVhdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVuc2lnbmVkIGF0dHJpYikKLXsgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCAoRFdPUkQpYXR0cmliKTsgfQotCi0jZWxzZQotCi12b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQoteyBfZG9zX3NldGZpbGVhdHRyKGZpbGVuYW1lLGF0dHJpYik7IH0KLQotI2VuZGlmCi0KLSNlbGlmICAgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKQotCi0jZGVmaW5lIFVTRV9MT0NBTF9GSUxFSU8KLSNkZWZpbmUgVVNFX0xPQ0FMX0dFVERBVEUKLQotLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50IF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKQotewotICAgIGNoYXIgICAgbW9kZVsxMF07Ci0gICAgaW50ICAgICBpOwotCi0gICAgLyogRmluZCBhbiBlbXB0eSBmaWxlIGhhbmRsZSB0byB1c2UgKi8KLSAgICBmb3IgKGkgPSAzOyBpIDwgTUFYX0ZJTEVTOyBpKyspIHsKLQlpZiAoIW9wZW5IYW5kbGVzW2ldKQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKG9wZW5IYW5kbGVzW2ldKQotCXJldHVybiAtMTsKLQotICAgIC8qIEZpbmQgdGhlIG9wZW4gZmxhZ3MgdG8gdXNlICovCi0gICAgaWYgKF9vZmxhZyAmIF9fX09fVFJVTkMpCi0Jc3RyY3B5KG1vZGUsInciKTsKLSAgICBlbHNlIGlmIChfb2ZsYWcgJiBfX19PX0NSRUFUKQotCXN0cmNweShtb2RlLCJhIik7Ci0gICAgZWxzZQotCXN0cmNweShtb2RlLCJyIik7Ci0gICAgaWYgKF9vZmxhZyAmIF9fX09fQklOQVJZKQotCXN0cmNhdChtb2RlLCJiIik7Ci0gICAgaWYgKF9vZmxhZyAmIF9fX09fVEVYVCkKLQlzdHJjYXQobW9kZSwidCIpOwotCi0gICAgLyogT3BlbiB0aGUgZmlsZSBhbmQgc3RvcmUgdGhlIGZpbGUgaGFuZGxlICovCi0gICAgaWYgKChvcGVuSGFuZGxlc1tpXSA9IGZvcGVuKF9wYXRoLG1vZGUpKSA9PSBOVUxMKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gaTsKLX0KLQotaW50IF9DREVDTCBzdHViX2FjY2Vzcyhjb25zdCBjaGFyICpfcGF0aCwgaW50IF9hbW9kZSkKLXsgcmV0dXJuIC0xOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9jbG9zZShpbnQgX2ZpbGRlcykKLXsKLSAgICBpZiAoX2ZpbGRlcyA+PSAzICYmIG9wZW5IYW5kbGVzW19maWxkZXNdKSB7Ci0JZmNsb3NlKG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLQlvcGVuSGFuZGxlc1tfZmlsZGVzXSA9IE5VTEw7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1vZmZfdCBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpCi17Ci0gICAgaWYgKF9maWxkZXMgPj0gMykgewotCWZzZWVrKG9wZW5IYW5kbGVzW19maWxkZXNdLF9vZmZzZXQsX3doZW5jZSk7Ci0JcmV0dXJuIGZ0ZWxsKG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXNpemVfdCBfQ0RFQ0wgc3R1Yl9yZWFkKGludCBfZmlsZGVzLCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpCi0JcmV0dXJuIGZyZWFkKF9idWYsMSxfbmJ5dGUsb3BlbkhhbmRsZXNbX2ZpbGRlc10pOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgX0NERUNMIHN0dWJfdW5saW5rKGNvbnN0IGNoYXIgKl9wYXRoKQotewotICAgIFdPUkQgZXJyb3I7Ci0KLSAgICBpZiAoaW5pdENvbXBsZXRlKSB7Ci0JaWYgKFIwX0RlbGV0ZUZpbGUoKGNoYXIqKV9wYXRoLDAsJmVycm9yKSkKLQkgICAgcmV0dXJuIDA7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICBlbHNlCi0JcmV0dXJuIGlfcmVtb3ZlKF9wYXRoKTsKLX0KLQotc2l6ZV90IF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpCi0JcmV0dXJuIGZ3cml0ZShfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLSAgICByZXR1cm4gX25ieXRlOwotfQotCi1pbnQgX0NERUNMIHN0dWJfaXNhdHR5KGludCBfZmlsZGVzKQoteyByZXR1cm4gMDsgfQotCi0vKiA8c3RkaW8uaD4gc3R1YiBmdW5jdGlvbnMgKi8KLWludCBfQ0RFQ0wgc3R1Yl9yZW1vdmUoY29uc3QgY2hhciAqX2ZpbGVuYW1lKQoteyByZXR1cm4gc3R1Yl91bmxpbmsoX2ZpbGVuYW1lKTsgfQotCi1pbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCi17IHJldHVybiAtMTsgfQotCi12b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQotewotICAgIFdPUkQgZXJyb3I7Ci0gICAgaWYgKGluaXRDb21wbGV0ZSkKLQlSMF9TZXRGaWxlQXR0cmlidXRlcygoY2hhciopZmlsZW5hbWUsYXR0cmliLCZlcnJvcik7Ci19Ci0KLS8qIFJldHVybiB0aGUgY3VycmVudCBkYXRlIGluIGRheXMgc2luY2UgMS8xLzE5ODAgKi8KLXVsb25nIF9DREVDTCBfT1NfZ2V0Y3VycmVudGRhdGUodm9pZCkKLXsKLSAgICBEV09SRCAgIGRhdGU7Ci0gICAgVlREX0dldF9EYXRlX0FuZF9UaW1lKCZkYXRlKTsKLSAgICByZXR1cm4gZGF0ZTsKLX0KLQotI2VsaWYgICBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0KLSNkZWZpbmUgVVNFX0xPQ0FMX0ZJTEVJTwotI2RlZmluZSBVU0VfTE9DQUxfR0VUREFURQotCi0vKiA8bGliYy9maWxlLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfb3Blbihjb25zdCBjaGFyICpfcGF0aCwgaW50IF9vZmxhZywgdW5zaWduZWQgX21vZGUpCi17Ci0gICAgY2hhciAgICBtb2RlWzEwXTsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICAvKiBGaW5kIGFuIGVtcHR5IGZpbGUgaGFuZGxlIHRvIHVzZSAqLwotICAgIGZvciAoaSA9IDM7IGkgPCBNQVhfRklMRVM7IGkrKykgewotCWlmICghb3BlbkhhbmRsZXNbaV0pCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAob3BlbkhhbmRsZXNbaV0pCi0JcmV0dXJuIC0xOwotCi0gICAgLyogRmluZCB0aGUgb3BlbiBmbGFncyB0byB1c2UgKi8KLSAgICBpZiAoX29mbGFnICYgX19fT19UUlVOQykKLQlzdHJjcHkobW9kZSwidyIpOwotICAgIGVsc2UgaWYgKF9vZmxhZyAmIF9fX09fQ1JFQVQpCi0Jc3RyY3B5KG1vZGUsImEiKTsKLSAgICBlbHNlCi0Jc3RyY3B5KG1vZGUsInIiKTsKLSAgICBpZiAoX29mbGFnICYgX19fT19CSU5BUlkpCi0Jc3RyY2F0KG1vZGUsImIiKTsKLSAgICBpZiAoX29mbGFnICYgX19fT19URVhUKQotCXN0cmNhdChtb2RlLCJ0Iik7Ci0KLSAgICAvKiBPcGVuIHRoZSBmaWxlIGFuZCBzdG9yZSB0aGUgZmlsZSBoYW5kbGUgKi8KLSAgICBpZiAoKG9wZW5IYW5kbGVzW2ldID0gZm9wZW4oX3BhdGgsbW9kZSkpID09IE5VTEwpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiBpOwotfQotCi1pbnQgX0NERUNMIHN0dWJfY2xvc2UoaW50IF9maWxkZXMpCi17Ci0gICAgaWYgKF9maWxkZXMgPj0gMyAmJiBvcGVuSGFuZGxlc1tfZmlsZGVzXSkgewotCWZjbG9zZShvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0Jb3BlbkhhbmRsZXNbX2ZpbGRlc10gPSBOVUxMOwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotb2ZmX3QgX0NERUNMIHN0dWJfbHNlZWsoaW50IF9maWxkZXMsIG9mZl90IF9vZmZzZXQsIGludCBfd2hlbmNlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpIHsKLQlmc2VlayhvcGVuSGFuZGxlc1tfZmlsZGVzXSxfb2Zmc2V0LF93aGVuY2UpOwotCXJldHVybiBmdGVsbChvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1zaXplX3QgX0NERUNMIHN0dWJfcmVhZChpbnQgX2ZpbGRlcywgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsKLSAgICBpZiAoX2ZpbGRlcyA+PSAzKQotCXJldHVybiBmcmVhZChfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc2l6ZV90IF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpCi0JcmV0dXJuIGZ3cml0ZShfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLSAgICByZXR1cm4gX25ieXRlOwotfQotCi1pbnQgX0NERUNMIHN0dWJfYWNjZXNzKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX2Ftb2RlKQoteyByZXR1cm4gLTE7IH0KLQotaW50IF9DREVDTCBzdHViX2lzYXR0eShpbnQgX2ZpbGRlcykKLXsgcmV0dXJuIDA7IH0KLQotaW50IF9DREVDTCBzdHViX3VubGluayhjb25zdCBjaGFyICpfcGF0aCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qIDxzdGRpby5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50IF9DREVDTCBzdHViX3JlbW92ZShjb25zdCBjaGFyICpfZmlsZW5hbWUpCi17IHJldHVybiBzdHViX3VubGluayhfZmlsZW5hbWUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9yZW5hbWUoY29uc3QgY2hhciAqX29sZCwgY29uc3QgY2hhciAqX25ldykKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCi17Ci0gICAgdWludCBfYXR0ciA9IDA7Ci0gICAgaWYgKGF0dHJpYiAmIF9fQV9SRE9OTFkpCi0JX2F0dHIgfD0gRklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7Ci0gICAgaWYgKGF0dHJpYiAmIF9fQV9ISURERU4pCi0JX2F0dHIgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBfX0FfU1lTVEVNKQotCV9hdHRyIHw9IEZJTEVfQVRUUklCVVRFX1NZU1RFTTsKLSAgICBQTV9zZXRGaWxlQXR0cihmaWxlbmFtZSxfYXR0cik7Ci19Ci0KLS8qIFJldHVybiB0aGUgY3VycmVudCBkYXRlIGluIGRheXMgc2luY2UgMS8xLzE5ODAgKi8KLXVsb25nIF9DREVDTCBfT1NfZ2V0Y3VycmVudGRhdGUodm9pZCkKLXsKLSAgICBUSU1FX0ZJRUxEUyB0bTsKLSAgICBfaW50NjQgICAgICBjb3VudCxjb3VudF8xXzFfMTk4MDsKLQotICAgIHRtLlllYXIgICAgICAgICA9IDE5ODA7Ci0gICAgdG0uTW9udGggICAgICAgID0gMTsKLSAgICB0bS5EYXkgICAgICAgICAgPSAxOwotICAgIHRtLkhvdXIgICAgICAgICA9IDA7Ci0gICAgdG0uTWludXRlICAgICAgID0gMDsKLSAgICB0bS5TZWNvbmQgICAgICAgPSAwOwotICAgIHRtLk1pbGxpc2Vjb25kcyA9IDA7Ci0gICAgdG0uV2Vla2RheSAgICAgID0gMDsKLSAgICBSdGxUaW1lRmllbGRzVG9UaW1lKCZ0bSwoUExBUkdFX0lOVEVHRVIpJmNvdW50XzFfMV8xOTgwKTsKLSAgICBLZVF1ZXJ5U3lzdGVtVGltZSgoUExBUkdFX0lOVEVHRVIpJmNvdW50KTsKLSAgICByZXR1cm4gKHVsb25nKSggKGNvdW50IC0gY291bnRfMV8xXzE5ODApIC8gKChfaW50NjQpMjQgKiAoX2ludDY0KTM2MDAgKiAoX2ludDY0KTEwMDAwMDAwKSApOwotfQotCi0jZWxpZiAgIGRlZmluZWQoX19XSU5ET1dTMzJfXykgfHwgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0KLXZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCi17IFNldEZpbGVBdHRyaWJ1dGVzKChMUFNUUilmaWxlbmFtZSwgKERXT1JEKWF0dHJpYik7IH0KLQotI2VsaWYgICBkZWZpbmVkKF9fT1MyX18pCi0KLSNkZWZpbmUgVVNFX0xPQ0FMX0ZJTEVJTwotCi0jaWZuZGVmIFdfT0sKLSNkZWZpbmUgV19PSyAgICAgICAgICAgICAgICAgICAgMHgwMgotI2VuZGlmCi0KLXZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCi17Ci0gICAgRklMRVNUQVRVUzMgczsKLSAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJnMsc2l6ZW9mKHMpKSkKLQlyZXR1cm47Ci0gICAgcy5hdHRyRmlsZSA9IGF0dHJpYjsKLSAgICBEb3NTZXRQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJnMsc2l6ZW9mKHMpLDBMKTsKLX0KLQotLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIEJVRl9TSVpFICAgIDQwOTYKLQotLyogTm90ZTogdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdGFuZGFyZCBVbml4LWlzaCBoYW5kbGUtYmFzZWQgSS9PIGlzbid0Ci0gKiAgICAgICBjb21wbGV0ZSAtIGJ1dCB0aGF0IHdhc24ndCB0aGUgaW50ZW50IGVpdGhlci4gTm90ZSBhbHNvIHRoYXQgd2UKLSAqICAgICAgIGRvbid0IHByZXNlbnRseSBzdXBwb3J0IHRleHQgZmlsZSBJL08sIHNvIGFsbCB0ZXh0IGZpbGVzIGVuZAotICogICAgICAgdXAgaW4gVW5peCBmb3JtYXQgKGFuZCBhcmUgbm90IHRyYW5zbGF0ZWQhKS4KLSAqLwotaW50IF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKQotewotICAgIEhGSUxFICAgaGFuZGxlOwotICAgIFVMT05HICAgZXJyb3IsIGFjdGlvbnRha2VuLCBvcGVuZmxhZywgb3Blbm1vZGU7Ci0gICAgY2hhciAgICBwYXRoW1BNX01BWF9QQVRIXTsKLQotICAgIC8qIERldGVybWluZSBvcGVuIGZsYWdzICovCi0gICAgaWYgKF9vZmxhZyAmIF9fX09fQ1JFQVQpIHsKLQlpZiAoX29mbGFnICYgX19fT19FWENMKQotCSAgICBvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX0ZBSUxfSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQllbHNlIGlmIChfb2ZsYWcgJiBfX19PX1RSVU5DKQotCSAgICBvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQllbHNlCi0JICAgIG9wZW5mbGFnID0gT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFMgfCBPUEVOX0FDVElPTl9DUkVBVEVfSUZfTkVXOwotCX0KLSAgICBlbHNlIGlmIChfb2ZsYWcgJiBfX19PX1RSVU5DKQotCW9wZW5mbGFnID0gT1BFTl9BQ1RJT05fUkVQTEFDRV9JRl9FWElTVFM7Ci0gICAgZWxzZQotCW9wZW5mbGFnID0gT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFM7Ci0KLSAgICAvKiBEZXRlcm1pbmUgb3BlbiBtb2RlIGZsYWdzICovCi0gICAgaWYgKF9vZmxhZyAmIF9fX09fUkRPTkxZKQotCW9wZW5tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBPUEVOX1NIQVJFX0RFTllOT05FOwotICAgIGVsc2UgaWYgKF9vZmxhZyAmIF9fX09fV1JPTkxZKQotCW9wZW5tb2RlID0gT1BFTl9BQ0NFU1NfV1JJVEVPTkxZIHwgT1BFTl9TSEFSRV9ERU5ZV1JJVEU7Ci0gICAgZWxzZQotCW9wZW5tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9ERU5ZV1JJVEU7Ci0KLSAgICAvKiBDb3B5IHRoZSBwYXRoIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrLiBXZSBuZWVkIHRvIGRvIHRoaXMKLSAgICAgKiBmb3IgT1MvMiBhcyB3aGVuIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQgaW50byBzaGFyZWQga2VybmVsCi0gICAgICogbWVtb3J5LCB3ZSBjYW4ndCBwYXNzIGFuIGFkZHJlc3MgZnJvbSB0aGF0IG1lbW9yeSByYW5nZSB0bwotICAgICAqIHRoaXMgZnVuY3Rpb24uCi0gICAgICovCi0gICAgc3RyY3B5KHBhdGgsX3BhdGgpOwotICAgIGlmIChEb3NPcGVuKHBhdGgsICZoYW5kbGUsICZhY3Rpb250YWtlbiwgMCwgRklMRV9OT1JNQUwsCi0JICAgIG9wZW5mbGFnLCBvcGVubW9kZSwgTlVMTCkgIT0gTk9fRVJST1IpCi0JcmV0dXJuIC0xOwotCi0gICAgLyogSGFuZGxlIGFwcGVuZCBtb2RlIG9mIG9wZXJhdGlvbiAqLwotICAgIGlmIChfb2ZsYWcgJiBfX19PX0FQUEVORCkgewotCWlmIChEb3NTZXRGaWxlUHRyKGhhbmRsZSwgMCwgRklMRV9FTkQsICZlcnJvcikgIT0gTk9fRVJST1IpCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgcmV0dXJuIGhhbmRsZTsKLX0KLQotaW50IF9DREVDTCBzdHViX2FjY2Vzcyhjb25zdCBjaGFyICpfcGF0aCwgaW50IF9hbW9kZSkKLXsKLSAgICBjaGFyICAgICAgICBwYXRoW1BNX01BWF9QQVRIXTsKLSAgICBGSUxFU1RBVFVTICBmczsKLQotICAgIC8qIENvcHkgdGhlIHBhdGggdG8gYSB2YXJpYWJsZSBvbiB0aGUgc3RhY2suIFdlIG5lZWQgdG8gZG8gdGhpcwotICAgICAqIGZvciBPUy8yIGFzIHdoZW4gdGhlIGRyaXZlcnMgYXJlIGxvYWRlZCBpbnRvIHNoYXJlZCBrZXJuZWwKLSAgICAgKiBtZW1vcnksIHdlIGNhbid0IHBhc3MgYW4gYWRkcmVzcyBmcm9tIHRoYXQgbWVtb3J5IHJhbmdlIHRvCi0gICAgICogdGhpcyBmdW5jdGlvbi4KLSAgICAgKi8KLSAgICBzdHJjcHkocGF0aCxfcGF0aCk7Ci0gICAgaWYgKERvc1F1ZXJ5UGF0aEluZm8ocGF0aCwgRklMX1NUQU5EQVJELCAmZnMsIHNpemVvZihmcykpICE9IE5PX0VSUk9SKQotCXJldHVybiAtMTsKLSAgICBpZiAoKF9hbW9kZSAmIFdfT0spICYmIChmcy5hdHRyRmlsZSAmIEZJTEVfUkVBRE9OTFkpKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKQotewotICAgIGlmIChEb3NDbG9zZShfZmlsZGVzKSAhPSBOT19FUlJPUikKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLW9mZl90IF9DREVDTCBzdHViX2xzZWVrKGludCBfZmlsZGVzLCBvZmZfdCBfb2Zmc2V0LCBpbnQgX3doZW5jZSkKLXsKLSAgICBVTE9ORyAgY2JBY3R1YWwsIG9yaWdpbjsKLQotICAgIHN3aXRjaCAoX3doZW5jZSkgewotCWNhc2UgU0VFS19DVVI6Ci0JICAgIG9yaWdpbiA9IEZJTEVfQ1VSUkVOVDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBTRUVLX0VORDoKLQkgICAgb3JpZ2luID0gRklMRV9FTkQ7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIG9yaWdpbiA9IEZJTEVfQkVHSU47Ci0JfQotICAgIGlmIChEb3NTZXRGaWxlUHRyKF9maWxkZXMsIF9vZmZzZXQsIG9yaWdpbiwgJmNiQWN0dWFsKSAhPSBOT19FUlJPUikKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIGNiQWN0dWFsOwotfQotCi1zaXplX3QgX0NERUNMIHN0dWJfcmVhZChpbnQgX2ZpbGRlcywgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsKLSAgICBVTE9ORyAgIGNiQWN0dWFsID0gMCxjYlJlYWQ7Ci0gICAgdWNoYXIgICAqcCA9IF9idWY7Ci0gICAgdWNoYXIgICBmaWxlX2lvX2J1ZltCVUZfU0laRV07Ci0KLSAgICAvKiBXZSBuZWVkIHRvIHBlcmZvcm0gdGhlIHBoeXNpY2FsIHJlYWQgaW4gY2h1bmtzIGludG8gYQotICAgICAqIGEgdGVtcG9yYXJ5IHN0YXRpYyBidWZmZXIsIHNpbmNlIHRoZSBidWZmZXIgcGFzc2VkIGluIG1heSBiZQotICAgICAqIGluIGtlcm5lbCBzcGFjZSBhbmQgd2lsbCBjYXVzZSBEb3NSZWFkIHRvIGJhaWwgaW50ZXJuYWxseS4KLSAgICAgKi8KLSAgICB3aGlsZSAoX25ieXRlID4gQlVGX1NJWkUpIHsKLQlpZiAoRG9zUmVhZChfZmlsZGVzLCBmaWxlX2lvX2J1ZiwgQlVGX1NJWkUsICZjYlJlYWQpICE9IE5PX0VSUk9SKQotCSAgICByZXR1cm4gLTE7Ci0JY2JBY3R1YWwgKz0gY2JSZWFkOwotCW1lbWNweShwLGZpbGVfaW9fYnVmLEJVRl9TSVpFKTsKLQlwICs9IEJVRl9TSVpFOwotCV9uYnl0ZSAtPSBCVUZfU0laRTsKLQl9Ci0gICAgaWYgKF9uYnl0ZSkgewotCWlmIChEb3NSZWFkKF9maWxkZXMsIGZpbGVfaW9fYnVmLCBfbmJ5dGUsICZjYlJlYWQpICE9IE5PX0VSUk9SKQotCSAgICByZXR1cm4gLTE7Ci0JY2JBY3R1YWwgKz0gY2JSZWFkOwotCW1lbWNweShwLGZpbGVfaW9fYnVmLF9uYnl0ZSk7Ci0JfQotICAgIHJldHVybiBjYkFjdHVhbDsKLX0KLQotc2l6ZV90IF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQotewotICAgIFVMT05HICAgY2JBY3R1YWwgPSAwLGNiV3JpdGU7Ci0gICAgdWNoYXIgICAqcCA9IChQVk9JRClfYnVmOwotICAgIHVjaGFyICAgZmlsZV9pb19idWZbQlVGX1NJWkVdOwotCi0gICAgLyogV2UgbmVlZCB0byBwZXJmb3JtIHRoZSBwaHlzaWNhbCB3cml0ZSBpbiBjaHVua3MgZnJvbSBhCi0gICAgICogYSB0ZW1wb3Jhcnkgc3RhdGljIGJ1ZmZlciwgc2luY2UgdGhlIGJ1ZmZlciBwYXNzZWQgaW4gbWF5IGJlCi0gICAgICogaW4ga2VybmVsIHNwYWNlIGFuZCB3aWxsIGNhdXNlIERvc1dyaXRlIHRvIGJhaWwgaW50ZXJuYWxseS4KLSAgICAgKi8KLSAgICB3aGlsZSAoX25ieXRlID4gQlVGX1NJWkUpIHsKLQltZW1jcHkoZmlsZV9pb19idWYscCxCVUZfU0laRSk7Ci0JaWYgKERvc1dyaXRlKF9maWxkZXMsIGZpbGVfaW9fYnVmLCBCVUZfU0laRSwgJmNiV3JpdGUpICE9IE5PX0VSUk9SKQotCSAgICByZXR1cm4gLTE7Ci0JY2JBY3R1YWwgKz0gY2JXcml0ZTsKLQlwICs9IEJVRl9TSVpFOwotCV9uYnl0ZSAtPSBCVUZfU0laRTsKLQl9Ci0gICAgaWYgKF9uYnl0ZSkgewotCW1lbWNweShmaWxlX2lvX2J1ZixwLF9uYnl0ZSk7Ci0JaWYgKERvc1dyaXRlKF9maWxkZXMsIGZpbGVfaW9fYnVmLCBfbmJ5dGUsICZjYldyaXRlKSAhPSBOT19FUlJPUikKLQkgICAgcmV0dXJuIC0xOwotCWNiQWN0dWFsICs9IGNiV3JpdGU7Ci0JfQotICAgIHJldHVybiBjYkFjdHVhbDsKLX0KLQotaW50IF9DREVDTCBzdHViX3VubGluayhjb25zdCBjaGFyICpfcGF0aCkKLXsKLSAgICBjaGFyICAgIHBhdGhbUE1fTUFYX1BBVEhdOwotCi0gICAgLyogQ29weSB0aGUgcGF0aCB0byBhIHZhcmlhYmxlIG9uIHRoZSBzdGFjay4gV2UgbmVlZCB0byBkbyB0aGlzCi0gICAgICogZm9yIE9TLzIgYXMgd2hlbiB0aGUgZHJpdmVycyBhcmUgbG9hZGVkIGludG8gc2hhcmVkIGtlcm5lbAotICAgICAqIG1lbW9yeSwgd2UgY2FuJ3QgcGFzcyBhbiBhZGRyZXNzIGZyb20gdGhhdCBtZW1vcnkgcmFuZ2UgdG8KLSAgICAgKiB0aGlzIGZ1bmN0aW9uLgotICAgICAqLwotICAgIHN0cmNweShwYXRoLF9wYXRoKTsKLSAgICBpZiAoRG9zRGVsZXRlKHBhdGgpICE9IE5PX0VSUk9SKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IF9DREVDTCBzdHViX2lzYXR0eShpbnQgX2ZpbGRlcykKLXsKLSAgICBVTE9ORyAgaHR5cGUsIGZsYWdzOwotCi0gICAgaWYgKERvc1F1ZXJ5SFR5cGUoX2ZpbGRlcywgJmh0eXBlLCAmZmxhZ3MpICE9IE5PX0VSUk9SKQotCXJldHVybiAwOwotICAgIHJldHVybiAoKGh0eXBlICYgMHhGRikgPT0gSEFORFRZUEVfREVWSUNFKTsKLX0KLQotLyogPHN0ZGlvLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfcmVtb3ZlKGNvbnN0IGNoYXIgKl9wYXRoKQotewotICAgIGNoYXIgICAgcGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICAvKiBDb3B5IHRoZSBwYXRoIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrLiBXZSBuZWVkIHRvIGRvIHRoaXMKLSAgICAgKiBmb3IgT1MvMiBhcyB3aGVuIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQgaW50byBzaGFyZWQga2VybmVsCi0gICAgICogbWVtb3J5LCB3ZSBjYW4ndCBwYXNzIGFuIGFkZHJlc3MgZnJvbSB0aGF0IG1lbW9yeSByYW5nZSB0bwotICAgICAqIHRoaXMgZnVuY3Rpb24uCi0gICAgICovCi0gICAgc3RyY3B5KHBhdGgsX3BhdGgpOwotICAgIGlmIChEb3NEZWxldGUocGF0aCkgIT0gTk9fRVJST1IpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCi17Ci0gICAgY2hhciAgICBvbGRbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgbmV3W1BNX01BWF9QQVRIXTsKLQotICAgIC8qIENvcHkgdGhlIHBhdGggdG8gYSB2YXJpYWJsZSBvbiB0aGUgc3RhY2suIFdlIG5lZWQgdG8gZG8gdGhpcwotICAgICAqIGZvciBPUy8yIGFzIHdoZW4gdGhlIGRyaXZlcnMgYXJlIGxvYWRlZCBpbnRvIHNoYXJlZCBrZXJuZWwKLSAgICAgKiBtZW1vcnksIHdlIGNhbid0IHBhc3MgYW4gYWRkcmVzcyBmcm9tIHRoYXQgbWVtb3J5IHJhbmdlIHRvCi0gICAgICogdGhpcyBmdW5jdGlvbi4KLSAgICAgKi8KLSAgICBzdHJjcHkob2xkLF9vbGQpOwotICAgIHN0cmNweShuZXcsX25ldyk7Ci0gICAgaWYgKERvc01vdmUob2xkLCBuZXcpICE9IE5PX0VSUk9SKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2Vsc2UKLQotdm9pZCBfQ0RFQ0wgX09TX3NldGZpbGVhdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVuc2lnbmVkIGF0dHJpYikKLXsgLyogVW5hYmxlIHRvIHNldCBoaWRkZW4sIHN5c3RlbSBhdHRyaWJ1dGVzIG9uIFVuaXguICovIH0KLQotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX0xPQ0FMX0ZJTEVJTwotCi0vKiA8bGliYy9maWxlLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfb3Blbihjb25zdCBjaGFyICpfcGF0aCwgaW50IF9vZmxhZywgdW5zaWduZWQgX21vZGUpCi17Ci0gICAgaW50IG9mbGFnX3RhYltdID0gewotCV9fX09fUkRPTkxZLCAgICBPX1JET05MWSwKLQlfX19PX1dST05MWSwgICAgT19XUk9OTFksCi0JX19fT19SRFdSLCAgICAgIE9fUkRXUiwKLQlfX19PX0JJTkFSWSwgICAgT19CSU5BUlksCi0JX19fT19URVhULCAgICAgIE9fVEVYVCwKLQlfX19PX0NSRUFULCAgICAgT19DUkVBVCwKLQlfX19PX0VYQ0wsICAgICAgT19FWENMLAotCV9fX09fVFJVTkMsICAgICBPX1RSVU5DLAotCV9fX09fQVBQRU5ELCAgICBPX0FQUEVORCwKLQl9OwotICAgIGludCBpLG9mbGFnID0gMDsKLQotICAgIC8qIFRyYW5zbGF0ZSB0aGUgb2ZsYWcncyB0byB0aGUgT1MgZGVwZW5kZW50IHZlcnNpb25zICovCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihvZmxhZ190YWIpIC8gc2l6ZW9mKGludCk7IGkgKz0gMikgewotCWlmIChfb2ZsYWcgJiBvZmxhZ190YWJbaV0pCi0JICAgIG9mbGFnIHw9IG9mbGFnX3RhYltpKzFdOwotCX0KLSAgICByZXR1cm4gb3BlbihfcGF0aCxvZmxhZyxfbW9kZSk7Ci19Ci0KLWludCBfQ0RFQ0wgc3R1Yl9hY2Nlc3MoY29uc3QgY2hhciAqX3BhdGgsIGludCBfYW1vZGUpCi17IHJldHVybiBhY2Nlc3MoX3BhdGgsX2Ftb2RlKTsgfQotCi1pbnQgX0NERUNMIHN0dWJfY2xvc2UoaW50IF9maWxkZXMpCi17IHJldHVybiBjbG9zZShfZmlsZGVzKTsgfQotCi1vZmZfdCBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpCi17IHJldHVybiBsc2VlayhfZmlsZGVzLF9vZmZzZXQsX3doZW5jZSk7IH0KLQotc2l6ZV90IF9DREVDTCBzdHViX3JlYWQoaW50IF9maWxkZXMsIHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCi17IHJldHVybiByZWFkKF9maWxkZXMsX2J1ZixfbmJ5dGUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl91bmxpbmsoY29uc3QgY2hhciAqX3BhdGgpCi17IHJldHVybiB1bmxpbmsoX3BhdGgpOyB9Ci0KLXNpemVfdCBfQ0RFQ0wgc3R1Yl93cml0ZShpbnQgX2ZpbGRlcywgY29uc3Qgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsgcmV0dXJuIHdyaXRlKF9maWxkZXMsX2J1ZixfbmJ5dGUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9pc2F0dHkoaW50IF9maWxkZXMpCi17IHJldHVybiBpc2F0dHkoX2ZpbGRlcyk7IH0KLQotLyogPHN0ZGlvLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfcmVtb3ZlKGNvbnN0IGNoYXIgKl9maWxlbmFtZSkKLXsgcmV0dXJuIHJlbW92ZShfZmlsZW5hbWUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9yZW5hbWUoY29uc3QgY2hhciAqX29sZCwgY29uc3QgY2hhciAqX25ldykKLXsgcmV0dXJuIHJlbmFtZShfb2xkLF9uZXcpOyB9Ci0KLSNlbmRpZgotCi0jaWZuZGVmIFVTRV9MT0NBTF9HRVREQVRFCi0KLS8qIFJldHVybiB0aGUgY3VycmVudCBkYXRlIGluIGRheXMgc2luY2UgMS8xLzE5ODAgKi8KLXVsb25nIF9DREVDTCBfT1NfZ2V0Y3VycmVudGRhdGUodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdG0gcmVmVGltZTsKLSAgICByZWZUaW1lLnRtX3llYXIgPSA4MDsKLSAgICByZWZUaW1lLnRtX21vbiAgPSAwOwotICAgIHJlZlRpbWUudG1fbWRheSA9IDE7Ci0gICAgcmVmVGltZS50bV9ob3VyID0gMDsKLSAgICByZWZUaW1lLnRtX21pbiAgPSAwOwotICAgIHJlZlRpbWUudG1fc2VjICA9IDA7Ci0gICAgcmVmVGltZS50bV9pc2RzdCA9IC0xOwotICAgIHJldHVybiAodGltZShOVUxMKSAtIG1rdGltZSgmcmVmVGltZSkpIC8gKDI0ICogMzYwMEwpOwotfQotCi0jZW5kaWYKLQotaW50IF9DREVDTCBzdHViX3JhaXNlKGludCBzaWcpCi17Ci0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQotICAgIHJldHVybiAtMTsKLSNlbHNlCi0gICAgcmV0dXJuIHJhaXNlKHNpZyk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIF9fV0lORE9XUzMyX18KLXR5cGVkZWYgdm9pZCAoKl9fY29kZV9wdHIpKGludCk7Ci0jZWxzZQotdHlwZWRlZiB2b2lkICgqX19jb2RlX3B0cikoKTsKLSNlbmRpZgotCi12b2lkICogX0NERUNMIHN0dWJfc2lnbmFsKGludCBzaWcsIHZvaWQgKmhhbmRsZXIpCi17Ci0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQotICAgIHJldHVybiBOVUxMOwotI2Vsc2UKLSAgICByZXR1cm4gKHZvaWQqKXNpZ25hbChzaWcsKF9fY29kZV9wdHIpaGFuZGxlcik7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9tYWtlZmlsZSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhYzAzOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYgU2NpVGVjaCBTb2Z0d2FyZS4KLSMgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBEZXNjcmlwdG9uOiAgIE1ha2VmaWxlIGZvciBVbmlWQkUodG0pLCBVbmlQT1dFUih0bSksIFVWQkVMaWIodG0pIGFuZAotIyAgICAgICAgICAgICAgIERQTVNMaWIgbGlicmFyeSBmaWxlcy4gUmVxdWlyZXMgQm9ybGFuZCBDKysgNC41MiB0byBidWlsZAotIyAgICAgICAgICAgICAgIHNvbWUgY29tcG9uZW50cy4KLSMKLSMgJERhdGU6IDIwMDIvMTAvMDIgMTU6MzU6MjAgJCAkQXV0aG9yOiBoZnJpZWRlbiAkCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DRkxBR1MgKz0gLURURVNUSU5HX0dURgotCi1ndGZjYWxjJEU6ICBndGZjYWxjJE8KLQotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL2NvbW1vbi5tayIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9wZWxvYWRlci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL3BlbG9hZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzRiYjAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL3BlbG9hZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTUdMIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBhIHNpbXBsZSBQb3J0YWJsZSBCaW5hcnkgRExMIGxvYWRlcgotKiAgICAgICAgICAgICAgIGxpYnJhcnkuIFRoaXMgbGlicmFyeSBjYW4gYmUgdXNlZCB0byBsb2FkIFBFIERMTCdzIHVuZGVyCi0qICAgICAgICAgICAgICAgYW55IEludGVsIGJhc2VkIE9TLCBwcm92aWRlZCB0aGUgRExMJ3MgZG8gbm90IGhhdmUgYW55Ci0qICAgICAgICAgICAgICAgaW1wb3J0cyBpbiB0aGUgaW1wb3J0IHRhYmxlLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFRoaXMgbG9hZGVyIG1vZHVsZSBleHBlY3RzIHRoZSBETEwncyB0byBiZSBidWlsdCB3aXRoCi0qICAgICAgICAgICAgICAgICAgICAgV2F0Y29tIEMrKyBhbmQgbWF5IHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIHdpdGgKLSogICAgICAgICAgICAgICAgICAgICBETEwncyBsaW5rZWQgYnkgYW5vdGhlciBjb21waWxlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJkcnZsaWIvcGVsb2FkZXIuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgImRydmxpYi9saWJjL2luaXQuaCIKLSNpZiAoZGVmaW5lZChfX1dJTkRPV1MzMl9fKSB8fCBkZWZpbmVkKF9fRFJJVkVSX18pKSAmJiBkZWZpbmVkKENIRUNLRUQpCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNkZWZpbmUgU1RSSUNUCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiZHJ2bGliL3BlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgICAgICAgICAgcmVzdWx0ID0gUEVfb2s7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZiAgICAgICAgICAgLSBIYW5kbGUgdG8gb3BlbiBmaWxlIHRvIHJlYWQgZHJpdmVyIGZyb20KLXN0YXJ0T2Zmc2V0IC0gT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgZHJpdmVyIHdpdGhpbiB0aGUgZmlsZQotCi1SRVRVUk5TOgotSGFuZGxlIHRvIGxvYWRlZCBQRSBETEwsIG9yIE5VTEwgb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gbG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGxpYnJhcnkgZnJvbSBkaXNrLCByZWxvY2F0ZXMKLXRoZSBjb2RlIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgbGlicmFyeS4gVGhpcyBmdW5jdGlvbiBpcyB0aGUKLXNhbWUgYXMgdGhlIHJlZ3VsYXIgUEVfbG9hZExpYnJhcnkgZXhjZXB0IHRoYXQgaXQgdGFrZSBhIGhhbmRsZSB0byBhbgotb3BlbiBmaWxlIGFuZCBhbiBvZmZzZXQgd2l0aGluIHRoYXQgZmlsZSBmb3IgdGhlIERMTCB0byBsb2FkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgUEVfcmVhZEhlYWRlcigKLSAgICBGSUxFICpmLAotICAgIGxvbmcgc3RhcnRPZmZzZXQsCi0gICAgRklMRV9IRFIgKmZpbGVoZHIsCi0gICAgT1BUSU9OQUxfSERSICpvcHRoZHIpCi17Ci0gICAgRVhFX0hEUiBleGVoZHI7Ci0gICAgdWxvbmcgICBvZmZzZXQsc2lnbmF0dXJlOwotCi0gICAgLyogUmVhZCB0aGUgRVhFIGhlYWRlciBhbmQgY2hlY2sgZm9yIHZhbGlkIGhlYWRlciBzaWduYXR1cmUgKi8KLSAgICByZXN1bHQgPSBQRV9pbnZhbGlkRExMSW1hZ2U7Ci0gICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoJmV4ZWhkciwgMSwgc2l6ZW9mKGV4ZWhkciksIGYpICE9IHNpemVvZihleGVoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoZXhlaGRyLnNpZ25hdHVyZSAhPSAweDVBNEQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogTm93IHNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBQRSBoZWFkZXIgZGVmaW5lZCBhdCBvZmZzZXQgMHgzQwotICAgICAqIGluIHRoZSBNUy1ET1MgRVhFIGhlYWRlciwgYW5kIHJlYWQgdGhlIHNpZ25hdHVyZSBhbmQgY2hlY2sgaXQuCi0gICAgICovCi0gICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrMHgzQywgU0VFS19TRVQpOwotICAgIGlmIChmcmVhZCgmb2Zmc2V0LCAxLCBzaXplb2Yob2Zmc2V0KSwgZikgIT0gc2l6ZW9mKG9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIGZzZWVrKGYsIHN0YXJ0T2Zmc2V0K29mZnNldCwgU0VFS19TRVQpOwotICAgIGlmIChmcmVhZCgmc2lnbmF0dXJlLCAxLCBzaXplb2Yoc2lnbmF0dXJlKSwgZikgIT0gc2l6ZW9mKHNpZ25hdHVyZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmIChzaWduYXR1cmUgIT0gMHgwMDAwNDU1MCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBOb3cgcmVhZCB0aGUgUEUgZmlsZSBoZWFkZXIgYW5kIGNoZWNrIHRoYXQgaXQgaXMgY29ycmVjdCAqLwotICAgIGlmIChmcmVhZChmaWxlaGRyLCAxLCBzaXplb2YoKmZpbGVoZHIpLCBmKSAhPSBzaXplb2YoKmZpbGVoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoZmlsZWhkci0+TWFjaGluZSAhPSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCEoZmlsZWhkci0+Q2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV8zMkJJVF9NQUNISU5FKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCEoZmlsZWhkci0+Q2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV9ETEwpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoZnJlYWQob3B0aGRyLCAxLCBzaXplb2YoKm9wdGhkciksIGYpICE9IHNpemVvZigqb3B0aGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKG9wdGhkci0+TWFnaWMgIT0gMHgxMEIpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogU3VjY2Vzcywgc28gcmV0dXJuIHRydWUhICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZiAgICAgICAgICAgLSBIYW5kbGUgdG8gb3BlbiBmaWxlIHRvIHJlYWQgZHJpdmVyIGZyb20KLXN0YXJ0T2Zmc2V0IC0gT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgZHJpdmVyIHdpdGhpbiB0aGUgZmlsZQotCi1SRVRVUk5TOgotU2l6ZSBvZiB0aGUgRExMIGZpbGUgb24gZGlzaywgb3IgLTEgb24gZXJyb3IKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc2NhbnMgdGhlIGhlYWRlcnMgZm9yIGEgUG9ydGFibGUgQmluYXJ5IERMTCB0byBkZXRlcm1pbmUgdGhlCi1sZW5ndGggb2YgdGhlIERMTCBmaWxlIG9uIGRpc2suCi17c2VjcmV0fQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBFQVBJIFBFX2dldEZpbGVTaXplKAotICAgIEZJTEUgKmYsCi0gICAgdWxvbmcgc3RhcnRPZmZzZXQpCi17Ci0gICAgRklMRV9IRFIgICAgICAgIGZpbGVoZHI7Ci0gICAgT1BUSU9OQUxfSERSICAgIG9wdGhkcjsKLSAgICBTRUNUSU9OX0hEUiAgICAgc2VjdGhkcjsKLSAgICB1bG9uZyAgICAgICAgICAgc2l6ZTsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLQotICAgIC8qIFJlYWQgdGhlIFBFIGZpbGUgaGVhZGVycyBmcm9tIGRpc2sgKi8KLSAgICBpZiAoIVBFX3JlYWRIZWFkZXIoZixzdGFydE9mZnNldCwmZmlsZWhkciwmb3B0aGRyKSkKLQlyZXR1cm4gMHhGRkZGRkZGRjsKLQotICAgIC8qIFNjYW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMgc3VtbWluZyB1cCB0aGUgdG90YWwgc2l6ZSAqLwotICAgIHNpemUgPSBvcHRoZHIuU2l6ZU9mSGVhZGVyczsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZWhkci5OdW1iZXJPZlNlY3Rpb25zOyBpKyspIHsKLQlpZiAoZnJlYWQoJnNlY3RoZHIsIDEsIHNpemVvZihzZWN0aGRyKSwgZikgIT0gc2l6ZW9mKHNlY3RoZHIpKQotCSAgICByZXR1cm4gMHhGRkZGRkZGRjsKLQlzaXplICs9IHNlY3RoZHIuU2l6ZU9mUmF3RGF0YTsKLQl9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBpbnRvIG1lbW9yeSBmcm9tIGFuIG9wZW4gZmlsZQotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVBBUkFNRVRFUlM6Ci1mICAgICAgICAgICAtIEhhbmRsZSB0byBvcGVuIGZpbGUgdG8gcmVhZCBkcml2ZXIgZnJvbQotc3RhcnRPZmZzZXQgLSBPZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkcml2ZXIgd2l0aGluIHRoZSBmaWxlCi1zaXplICAgICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgbG9hZGVkCi1zaGFyZWQgICAgICAtIFRydWUgdG8gbG9hZCBtb2R1bGUgaW50byBzaGFyZWQgbWVtb3J5Ci0KLVJFVFVSTlM6Ci1IYW5kbGUgdG8gbG9hZGVkIFBFIERMTCwgb3IgTlVMTCBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBsb2FkcyBhIFBvcnRhYmxlIEJpbmFyeSBETEwgbGlicmFyeSBmcm9tIGRpc2ssIHJlbG9jYXRlcwotdGhlIGNvZGUgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGxvYWRlZCBsaWJyYXJ5LiBUaGlzIGZ1bmN0aW9uIGlzIHRoZQotc2FtZSBhcyB0aGUgcmVndWxhciBQRV9sb2FkTGlicmFyeSBleGNlcHQgdGhhdCBpdCB0YWtlIGEgaGFuZGxlIHRvIGFuCi1vcGVuIGZpbGUgYW5kIGFuIG9mZnNldCB3aXRoaW4gdGhhdCBmaWxlIGZvciB0aGUgRExMIHRvIGxvYWQuCi0KLVNFRSBBTFNPOgotUEVfbG9hZExpYnJhcnksIFBFX2dldFByb2NBZGRyZXNzLCBQRV9mcmVlTGlicmFyeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBFX01PRFVMRSAqIFBFQVBJIFBFX2xvYWRMaWJyYXJ5RXh0KAotICAgIEZJTEUgKmYsCi0gICAgdWxvbmcgc3RhcnRPZmZzZXQsCi0gICAgdWxvbmcgKnNpemUsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgIEZJTEVfSERSICAgICAgICBmaWxlaGRyOwotICAgIE9QVElPTkFMX0hEUiAgICBvcHRoZHI7Ci0gICAgU0VDVElPTl9IRFIgICAgIHNlY3RoZHI7Ci0gICAgdWxvbmcgICAgICAgICAgIG9mZnNldCxwYWdlT2Zmc2V0OwotICAgIHVsb25nICAgICAgICAgICB0ZXh0X29mZix0ZXh0X2FkZHIsdGV4dF9zaXplOwotICAgIHVsb25nICAgICAgICAgICBkYXRhX29mZixkYXRhX2FkZHIsZGF0YV9zaXplLGRhdGFfZW5kOwotICAgIHVsb25nICAgICAgICAgICBleHBvcnRfb2ZmLGV4cG9ydF9hZGRyLGV4cG9ydF9zaXplLGV4cG9ydF9lbmQ7Ci0gICAgdWxvbmcgICAgICAgICAgIHJlbG9jX29mZixyZWxvY19zaXplOwotICAgIHVsb25nICAgICAgICAgICBpbWFnZV9zaXplOwotICAgIGludCAgICAgICAgICAgICBpLGRlbHRhLG51bUZpeHVwczsKLSAgICB1c2hvcnQgICAgICAgICAgcmVsb2NUeXBlLCpmaXh1cDsKLSAgICBQRV9NT0RVTEUgICAgICAgKmhNb2QgPSBOVUxMOwotICAgIHZvaWQgICAgICAgICAgICAqcmVsb2MgPSBOVUxMOwotICAgIEJBU0VfUkVMT0NBVElPTiAqYmFzZVJlbG9jOwotICAgIEluaXRMaWJDX3QgICAgICBJbml0TGliQzsKLQotICAgIC8qIFJlYWQgdGhlIFBFIGZpbGUgaGVhZGVycyBmcm9tIGRpc2sgKi8KLSAgICBpZiAoIVBFX3JlYWRIZWFkZXIoZixzdGFydE9mZnNldCwmZmlsZWhkciwmb3B0aGRyKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFNjYW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMgYW5kIGZpbmQgdGhlIG5lY2Vzc2FyeSBzZWN0aW9ucyAqLwotICAgIHRleHRfb2ZmID0gZGF0YV9vZmYgPSByZWxvY19vZmYgPSBleHBvcnRfb2ZmID0gMDsKLSAgICB0ZXh0X2FkZHIgPSB0ZXh0X3NpemUgPSAwOwotICAgIGRhdGFfYWRkciA9IGRhdGFfc2l6ZSA9IGRhdGFfZW5kID0gMDsKLSAgICBleHBvcnRfYWRkciA9IGV4cG9ydF9zaXplID0gZXhwb3J0X2VuZCA9IDA7Ci0gICAgcmVsb2Nfc2l6ZSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGZpbGVoZHIuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKSB7Ci0JaWYgKGZyZWFkKCZzZWN0aGRyLCAxLCBzaXplb2Yoc2VjdGhkciksIGYpICE9IHNpemVvZihzZWN0aGRyKSkKLQkgICAgZ290byBFcnJvcjsKLQlpZiAoc3RyY21wKHNlY3RoZHIuTmFtZSwgIi5lZGF0YSIpID09IDAgfHwgc3RyY21wKHNlY3RoZHIuTmFtZSwgIi5yZGF0YSIpID09IDApIHsKLQkgICAgLyogRXhwb3J0cyBzZWN0aW9uICovCi0JICAgIGV4cG9ydF9vZmYgPSBzZWN0aGRyLlBvaW50ZXJUb1Jhd0RhdGE7Ci0JICAgIGV4cG9ydF9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKLQkgICAgZXhwb3J0X3NpemUgPSBzZWN0aGRyLlNpemVPZlJhd0RhdGE7Ci0JICAgIGV4cG9ydF9lbmQgPSBleHBvcnRfYWRkciArIGV4cG9ydF9zaXplOwotCSAgICB9Ci0JZWxzZSBpZiAoc3RyY21wKHNlY3RoZHIuTmFtZSwgIi5pZGF0YSIpID09IDApIHsKLQkgICAgLyogSW1wb3J0cyBzZWN0aW9uLCBpZ25vcmUgKi8KLQkgICAgfQotCWVsc2UgaWYgKHN0cmNtcChzZWN0aGRyLk5hbWUsICIucmVsb2MiKSA9PSAwKSB7Ci0JICAgIC8qIFJlbG9jYXRpb25zIHNlY3Rpb24gKi8KLQkgICAgcmVsb2Nfb2ZmID0gc2VjdGhkci5Qb2ludGVyVG9SYXdEYXRhOwotCSAgICByZWxvY19zaXplID0gc2VjdGhkci5TaXplT2ZSYXdEYXRhOwotCSAgICB9Ci0JZWxzZSBpZiAoIXRleHRfb2ZmICYmIHNlY3RoZHIuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfU0NOX0NOVF9DT0RFKSB7Ci0JICAgIC8qIENvZGUgc2VjdGlvbiAqLwotCSAgICB0ZXh0X29mZiA9IHNlY3RoZHIuUG9pbnRlclRvUmF3RGF0YTsKLQkgICAgdGV4dF9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKLQkgICAgdGV4dF9zaXplID0gc2VjdGhkci5TaXplT2ZSYXdEYXRhOwotCSAgICB9Ci0JZWxzZSBpZiAoIWRhdGFfb2ZmICYmIHNlY3RoZHIuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBKSB7Ci0JICAgIC8qIERhdGEgc2VjdGlvbiAqLwotCSAgICBkYXRhX29mZiA9IHNlY3RoZHIuUG9pbnRlclRvUmF3RGF0YTsKLQkgICAgZGF0YV9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKLQkgICAgZGF0YV9zaXplID0gc2VjdGhkci5TaXplT2ZSYXdEYXRhOwotCSAgICBkYXRhX2VuZCA9IGRhdGFfYWRkciArIGRhdGFfc2l6ZTsKLQkgICAgfQotCX0KLQotICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYWxsIHRoZSBzZWN0aW9ucyB3ZSBuZWVkICovCi0gICAgaWYgKCF0ZXh0X29mZiB8fCAhZGF0YV9vZmYgfHwgIWV4cG9ydF9vZmYgfHwgIXJlbG9jX29mZikgewotCXJlc3VsdCA9IFBFX2ludmFsaWRETExJbWFnZTsKLQlnb3RvIEVycm9yOwotCX0KLQotICAgIC8qIEZpbmQgdGhlIHNpemUgb2YgdGhlIGltYWdlIHRvIGxvYWQgYWxsb2NhdGUgbWVtb3J5IGZvciBpdCAqLwotICAgIGltYWdlX3NpemUgPSBNQVgoZXhwb3J0X2VuZCxkYXRhX2VuZCkgLSB0ZXh0X2FkZHI7Ci0gICAgKnNpemUgPSBzaXplb2YoUEVfTU9EVUxFKSArIGltYWdlX3NpemUgKyA0MDk2OwotICAgIGlmIChzaGFyZWQpCi0JaE1vZCA9IFBNX21hbGxvY1NoYXJlZCgqc2l6ZSk7Ci0gICAgZWxzZQotCWhNb2QgPSBQTV9tYWxsb2MoKnNpemUpOwotICAgIHJlbG9jID0gUE1fbWFsbG9jKHJlbG9jX3NpemUpOwotICAgIGlmICghaE1vZCB8fCAhcmVsb2MpIHsKLQlyZXN1bHQgPSBQRV9vdXRPZk1lbW9yeTsKLQlnb3RvIEVycm9yOwotCX0KLQotICAgIGhNb2QtPnRleHQgPSAodWNoYXIqKVJPVU5EXzRLKCh1bG9uZyloTW9kICsgc2l6ZW9mKFBFX01PRFVMRSkpOwotICAgIGhNb2QtPmRhdGEgPSAodWNoYXIqKSgodWxvbmcpaE1vZC0+dGV4dCArIChkYXRhX2FkZHIgLSB0ZXh0X2FkZHIpKTsKLSAgICBoTW9kLT5leHBvcnQgPSAodWNoYXIqKSgodWxvbmcpaE1vZC0+dGV4dCArIChleHBvcnRfYWRkciAtIHRleHRfYWRkcikpOwotICAgIGhNb2QtPnRleHRCYXNlID0gdGV4dF9hZGRyOwotICAgIGhNb2QtPmRhdGFCYXNlID0gZGF0YV9hZGRyOwotICAgIGhNb2QtPmV4cG9ydEJhc2UgPSBleHBvcnRfYWRkcjsKLSAgICBoTW9kLT5leHBvcnREaXIgPSBvcHRoZHIuRGF0YURpcmVjdG9yeVswXS5SZWxWaXJ0dWFsQWRkcmVzcyAtIGV4cG9ydF9hZGRyOwotICAgIGhNb2QtPnNoYXJlZCA9IHNoYXJlZDsKLQotICAgIC8qIE5vdyByZWFkIHRoZSBzZWN0aW9uIGltYWdlcyBmcm9tIGRpc2sgKi8KLSAgICByZXN1bHQgPSBQRV9pbnZhbGlkRExMSW1hZ2U7Ci0gICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrdGV4dF9vZmYsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoaE1vZC0+dGV4dCwgMSwgdGV4dF9zaXplLCBmKSAhPSB0ZXh0X3NpemUpCi0JZ290byBFcnJvcjsKLSAgICBmc2VlayhmLCBzdGFydE9mZnNldCtkYXRhX29mZiwgU0VFS19TRVQpOwotICAgIGlmIChmcmVhZChoTW9kLT5kYXRhLCAxLCBkYXRhX3NpemUsIGYpICE9IGRhdGFfc2l6ZSkKLQlnb3RvIEVycm9yOwotICAgIGZzZWVrKGYsIHN0YXJ0T2Zmc2V0K2V4cG9ydF9vZmYsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoaE1vZC0+ZXhwb3J0LCAxLCBleHBvcnRfc2l6ZSwgZikgIT0gZXhwb3J0X3NpemUpCi0JZ290byBFcnJvcjsKLSAgICBmc2VlayhmLCBzdGFydE9mZnNldCtyZWxvY19vZmYsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQocmVsb2MsIDEsIHJlbG9jX3NpemUsIGYpICE9IHJlbG9jX3NpemUpCi0JZ290byBFcnJvcjsKLQotICAgIC8qIE5vdyBwZXJmb3JtIHJlbG9jYXRpb25zIG9uIGFsbCBzZWN0aW9ucyBpbiB0aGUgaW1hZ2UgKi8KLSAgICBkZWx0YSA9ICh1bG9uZyloTW9kLT50ZXh0IC0gb3B0aGRyLkltYWdlQmFzZSAtIHRleHRfYWRkcjsKLSAgICBiYXNlUmVsb2MgPSAoQkFTRV9SRUxPQ0FUSU9OKilyZWxvYzsKLSAgICBmb3IgKDs7KSB7Ci0JLyogQ2hlY2sgZm9yIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiAqLwotCWlmICghYmFzZVJlbG9jLT5QYWdlUlZBIHx8ICFiYXNlUmVsb2MtPkJsb2NrU2l6ZSkKLQkgICAgYnJlYWs7Ci0KLQkvKiBEbyBmaXh1cHMgKi8KLQlwYWdlT2Zmc2V0ID0gYmFzZVJlbG9jLT5QYWdlUlZBIC0gaE1vZC0+dGV4dEJhc2U7Ci0JbnVtRml4dXBzID0gKGJhc2VSZWxvYy0+QmxvY2tTaXplIC0gc2l6ZW9mKEJBU0VfUkVMT0NBVElPTikpIC8gc2l6ZW9mKHVzaG9ydCk7Ci0JZml4dXAgPSAodXNob3J0KikoYmFzZVJlbG9jICsgMSk7Ci0JZm9yIChpID0gMDsgaSA8IG51bUZpeHVwczsgaSsrKSB7Ci0JICAgIHJlbG9jVHlwZSA9ICpmaXh1cCA+PiAxMjsKLQkgICAgaWYgKHJlbG9jVHlwZSkgewotCQlvZmZzZXQgPSBwYWdlT2Zmc2V0ICsgKCpmaXh1cCAmIDB4MEZGRik7Ci0JCSoodWxvbmcqKShoTW9kLT50ZXh0ICsgb2Zmc2V0KSArPSBkZWx0YTsKLQkJfQotCSAgICBmaXh1cCsrOwotCSAgICB9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgcmVsb2NhdGlvbiBibG9jayAqLwotCWJhc2VSZWxvYyA9IChCQVNFX1JFTE9DQVRJT04qKSgodWxvbmcpYmFzZVJlbG9jICsgYmFzZVJlbG9jLT5CbG9ja1NpemUpOwotCX0KLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGZvciB0aGUgbG9hZGVkIERMTCAqLwotICAgIHJlc3VsdCA9IFBFX3VuYWJsZVRvSW5pdExpYkM7Ci0gICAgaWYgKChJbml0TGliQyA9IChJbml0TGliQ190KVBFX2dldFByb2NBZGRyZXNzKGhNb2QsIl9Jbml0TGliQyIpKSA9PSBOVUxMKQotCWdvdG8gRXJyb3I7Ci0gICAgaWYgKCFJbml0TGliQygmX19faW1wb3J0cyxQTV9nZXRPU1R5cGUoKSkpCi0JZ290byBFcnJvcjsKLQotICAgIC8qIENsZWFuIHVwLCBjbG9zZSB0aGUgZmlsZSBhbmQgcmV0dXJuIHRoZSBsb2FkZWQgbW9kdWxlIGhhbmRsZSAqLwotICAgIFBNX2ZyZWUocmVsb2MpOwotICAgIHJlc3VsdCA9IFBFX29rOwotICAgIHJldHVybiBoTW9kOwotCi1FcnJvcjoKLSAgICBpZiAoc2hhcmVkKQotCVBNX2ZyZWVTaGFyZWQoaE1vZCk7Ci0gICAgZWxzZQotCVBNX2ZyZWUoaE1vZCk7Ci0gICAgUE1fZnJlZShyZWxvYyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBpbnRvIG1lbW9yeQotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVBBUkFNRVRFUlM6Ci1zekRMTE5hbWUgICAtIE5hbWUgb2YgdGhlIFBFIERMTCBsaWJyYXJ5IHRvIGxvYWQKLXNoYXJlZCAgICAgIC0gVHJ1ZSB0byBsb2FkIG1vZHVsZSBpbnRvIHNoYXJlZCBtZW1vcnkKLQotUkVUVVJOUzoKLUhhbmRsZSB0byBsb2FkZWQgUEUgRExMLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBsaWJyYXJ5IGZyb20gZGlzaywgcmVsb2NhdGVzCi10aGUgY29kZSBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbG9hZGVkIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24KLXdpbGwgb25seSB3b3JrIG9uIERMTCdzIHRoYXQgZG8gbm90IGhhdmUgYW55IGltcG9ydHMsIHNpbmNlIHdlIGRvbid0Ci1yZXNvbHZlIGltcG9ydCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBmdW5jdGlvbi4KLQotU0VFIEFMU086Ci1QRV9nZXRQcm9jQWRkcmVzcywgUEVfZnJlZUxpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QRV9NT0RVTEUgKiBQRUFQSSBQRV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgIFBFX01PRFVMRSAgICpoTW9kOwotCi0jaWYgKGRlZmluZWQoX19XSU5ET1dTMzJfXykgfHwgZGVmaW5lZChfX0RSSVZFUl9fKSkgJiYgZGVmaW5lZChDSEVDS0VEKQotICAgIGlmICghc2hhcmVkKSB7Ci0JUE1fTU9EVUxFICAgICAgIGhJbnN0OwotCUluaXRMaWJDX3QgICAgICBJbml0TGliQzsKLQotCS8qIEZvciBXaW4zMiBpZiBhcmUgYnVpbGRpbmcgY2hlY2tlZCBsaWJyYXJpZXMgZm9yIGRlYnVnZ2luZywgd2UgdXNlCi0JICogdGhlIHJlYWwgV2luMzIgRExMIGZ1bmN0aW9ucyBzbyB0aGF0IHdlIGNhbiBkZWJ1ZyB0aGUgcmVzdWx0aW5nIERMTAotCSAqIGZpbGVzIHdpdGggdGhlIFdpbjMyIGRlYnVnZ2Vycy4gTm90ZSB0aGF0IHdlIGNhbid0IGRvIHRoaXMgaWYKLQkgKiB3ZSBuZWVkIHRvIGxvYWQgdGhlIGZpbGVzIGludG8gYSBzaGFyZWQgbWVtb3J5IGNvbnRleHQuCi0JICovCi0JaWYgKChoSW5zdCA9IFBNX2xvYWRMaWJyYXJ5KHN6RExMTmFtZSkpID09IE5VTEwpIHsKLQkgICAgcmVzdWx0ID0gUEVfZmlsZU5vdEZvdW5kOwotCSAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JLyogSW5pdGlhbGlzZSB0aGUgQyBydW50aW1lIGxpYnJhcnkgZm9yIHRoZSBsb2FkZWQgRExMICovCi0JcmVzdWx0ID0gUEVfdW5hYmxlVG9Jbml0TGliQzsKLQlpZiAoKEluaXRMaWJDID0gKHZvaWQqKVBNX2dldFByb2NBZGRyZXNzKGhJbnN0LCJfSW5pdExpYkMiKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKCFJbml0TGliQygmX19faW1wb3J0cyxQTV9nZXRPU1R5cGUoKSkpCi0JICAgIHJldHVybiBOVUxMOwotCi0JLyogQWxsb2NhdGUgdGhlIFBFX01PRFVMRSBzdHJ1Y3R1cmUgKi8KLQlpZiAoKGhNb2QgPSBQTV9tYWxsb2Moc2l6ZW9mKCpoTW9kKSkpID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWhNb2QtPnRleHQgPSAodm9pZCopaEluc3Q7Ci0JaE1vZC0+c2hhcmVkID0gLTE7Ci0KLQkvKiBETEwgbG9hZGVkIHN1Y2Nlc3NmdWxseSBzbyByZXR1cm4gbW9kdWxlIGhhbmRsZSAqLwotCXJlc3VsdCA9IFBFX29rOwotCXJldHVybiBoTW9kOwotCX0KLSAgICBlbHNlCi0jZW5kaWYKLQl7Ci0JRklMRSAgICAgICAgKmY7Ci0JdWxvbmcgICAgICAgc2l6ZTsKLQotCS8qIEF0dGVtcHQgdG8gb3BlbiB0aGUgZmlsZSBvbiBkaXNrICovCi0JaWYgKHNoYXJlZCA8IDApCi0JICAgIHNoYXJlZCA9IDA7Ci0JaWYgKChmID0gZm9wZW4oc3pETExOYW1lLCJyYiIpKSA9PSBOVUxMKSB7Ci0JICAgIHJlc3VsdCA9IFBFX2ZpbGVOb3RGb3VuZDsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQloTW9kID0gUEVfbG9hZExpYnJhcnlFeHQoZiwwLCZzaXplLHNoYXJlZCk7Ci0JZmNsb3NlKGYpOwotCXJldHVybiBoTW9kOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGludG8gbWVtb3J5Ci0KLUhFQURFUjoKLXBlbG9hZGVyLmgKLQotUEFSQU1FVEVSUzoKLXN6RExMTmFtZSAgIC0gTmFtZSBvZiB0aGUgUEUgRExMIGxpYnJhcnkgdG8gbG9hZAotc2hhcmVkICAgICAgLSBUcnVlIHRvIGxvYWQgbW9kdWxlIGludG8gc2hhcmVkIG1lbW9yeQotCi1SRVRVUk5TOgotSGFuZGxlIHRvIGxvYWRlZCBQRSBETEwsIG9yIE5VTEwgb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHJlZ3VsYXIgUEVfbG9hZExpYnJhcnkgZnVuY3Rpb24sIGV4Y2VwdAotdGhhdCBpdCBsb29rcyBmb3IgdGhlIGRyaXZlcnMgaW4gdGhlIE1HTF9ST09UL2RyaXZlcnMgZGlyZWN0b3J5IG9yIGEKLS9kcml2ZXJzIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0KLVNFRSBBTFNPOgotUEVfbG9hZExpYnJhcnlNR0wsIFBFX2dldFByb2NBZGRyZXNzLCBQRV9mcmVlTGlicmFyeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBFX01PRFVMRSAqIFBFQVBJIFBFX2xvYWRMaWJyYXJ5TUdMKAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0jaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKLSAgICBQRV9NT0RVTEUgICAqaE1vZDsKLSNlbmRpZgotICAgIGNoYXIgICAgICAgIHBhdGhbMjU2XSA9ICIiOwotCi0gICAgLyogV2UgbG9vayBpbiB0aGUgJ2RyaXZlcnMnIGRpcmVjdG9yeSwgb3B0aW9uYWxseSB1bmRlciB0aGUgTUdMX1JPT1QKLSAgICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBkaXJlY3RvcnkuCi0gICAgICovCi0jaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKLSAgICBpZiAoZ2V0ZW52KCJNR0xfUk9PVCIpKSB7Ci0Jc3RyY3B5KHBhdGgsZ2V0ZW52KCJNR0xfUk9PVCIpKTsKLQlQTV9iYWNrc2xhc2gocGF0aCk7Ci0JfQotICAgIHN0cmNhdChwYXRoLCJkcml2ZXJzIik7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLHN6RExMTmFtZSk7Ci0gICAgaWYgKChoTW9kID0gUEVfbG9hZExpYnJhcnkocGF0aCxzaGFyZWQpKSAhPSBOVUxMKQotCXJldHVybiBoTW9kOwotI2VuZGlmCi0gICAgc3RyY3B5KHBhdGgsImRyaXZlcnMiKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsc3pETExOYW1lKTsKLSAgICByZXR1cm4gUEVfbG9hZExpYnJhcnkocGF0aCxzaGFyZWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1HZXRzIGEgZnVuY3Rpb24gYWRkcmVzcyBmcm9tIGEgUG9ydGFibGUgQmluYXJ5IERMTAotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVBBUkFNRVRFUlM6Ci1oTW9kdWxlICAgICAtIEhhbmRsZSB0byBhIGxvYWRlZCBQRSBETEwgbGlicmFyeQotc3pQcm9jTmFtZSAgLSBOYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGFkZHJlc3Mgb2YKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgbmFtZWQsIGV4cG9ydGVkIGZ1bmN0aW9uIGluIGEgbG9hZGVkIFBFCi1ETEwgbGlicmFyeSwgYW5kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gaXMKLW5vdCBmb3VuZCBpbiB0aGUgbGlicmFyeSwgdGhpcyBmdW5jdGlvbiByZXR1cm4gTlVMTC4KLQotU0VFIEFMU086Ci1QRV9sb2FkTGlicmFyeSwgUEVfZnJlZUxpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUEVBUEkgUEVfZ2V0UHJvY0FkZHJlc3MoCi0gICAgUEVfTU9EVUxFICpoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0jaWYgKGRlZmluZWQoX19XSU5ET1dTMzJfXykgfHwgZGVmaW5lZChfX0RSSVZFUl9fKSkgJiYgZGVmaW5lZChDSEVDS0VEKQotICAgIGlmIChoTW9kdWxlLT5zaGFyZWQgPT0gLTEpCi0JcmV0dXJuICh2b2lkKilQTV9nZXRQcm9jQWRkcmVzcyhoTW9kdWxlLT50ZXh0LHN6UHJvY05hbWUpOwotICAgIGVsc2UKLSNlbmRpZgotCXsKLQl1aW50ICAgICAgICAgICAgICAgIGk7Ci0JRVhQT1JUX0RJUkVDVE9SWSAgICAqZXhwb3J0czsKLQl1bG9uZyAgICAgICAgICAgICAgIGZ1bmNPZmZzZXQ7Ci0JdWxvbmcgICAgICAgICAgICAgICAqQWRkcmVzc1RhYmxlOwotCXVsb25nICAgICAgICAgICAgICAgKk5hbWVUYWJsZTsKLQl1c2hvcnQgICAgICAgICAgICAgICpPcmRpbmFsVGFibGU7Ci0JY2hhciAgICAgICAgICAgICAgICAqbmFtZTsKLQotCS8qIEZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGV4cG9ydCB0YWJsZXMgZnJvbSB0aGUgZXhwb3J0IHNlY3Rpb24gKi8KLQlpZiAoIWhNb2R1bGUpCi0JICAgIHJldHVybiBOVUxMOwotCWV4cG9ydHMgPSAoRVhQT1JUX0RJUkVDVE9SWSopKGhNb2R1bGUtPmV4cG9ydCArIGhNb2R1bGUtPmV4cG9ydERpcik7Ci0JQWRkcmVzc1RhYmxlID0gKHVsb25nKikoaE1vZHVsZS0+ZXhwb3J0ICsgZXhwb3J0cy0+QWRkcmVzc1RhYmxlUlZBIC0gaE1vZHVsZS0+ZXhwb3J0QmFzZSk7Ci0JTmFtZVRhYmxlID0gKHVsb25nKikoaE1vZHVsZS0+ZXhwb3J0ICsgZXhwb3J0cy0+TmFtZVRhYmxlUlZBIC0gaE1vZHVsZS0+ZXhwb3J0QmFzZSk7Ci0JT3JkaW5hbFRhYmxlID0gKHVzaG9ydCopKGhNb2R1bGUtPmV4cG9ydCArIGV4cG9ydHMtPk9yZGluYWxUYWJsZVJWQSAtIGhNb2R1bGUtPmV4cG9ydEJhc2UpOwotCi0JLyogU2VhcmNoIHRoZSBleHBvcnQgbmFtZSB0YWJsZSB0byBmaW5kIHRoZSBmdW5jdGlvbiBuYW1lICovCi0JZm9yIChpID0gMDsgaSA8IGV4cG9ydHMtPk51bWJlck9mTmFtZVBvaW50ZXJzOyBpKyspIHsKLQkgICAgbmFtZSA9IChjaGFyKikoaE1vZHVsZS0+ZXhwb3J0ICsgTmFtZVRhYmxlW2ldIC0gaE1vZHVsZS0+ZXhwb3J0QmFzZSk7Ci0JICAgIGlmIChzdHJjbXAobmFtZSxzelByb2NOYW1lKSA9PSAwKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpID09IGV4cG9ydHMtPk51bWJlck9mTmFtZVBvaW50ZXJzKQotCSAgICByZXR1cm4gTlVMTDsKLQlmdW5jT2Zmc2V0ID0gQWRkcmVzc1RhYmxlW09yZGluYWxUYWJsZVtpXV07Ci0JaWYgKCFmdW5jT2Zmc2V0KQotCSAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gKHZvaWQqKShoTW9kdWxlLT50ZXh0ICsgZnVuY09mZnNldCAtIGhNb2R1bGUtPnRleHRCYXNlKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUZyZWVzIGEgbG9hZGVkIFBvcnRhYmxlIEJpbmFyeSBETEwKLQotSEVBREVSOgotcGVsb2FkZXIuaAotCi1QQVJBTUVURVJTOgotaE1vZHVsZSAgICAgLSBIYW5kbGUgdG8gYSBsb2FkZWQgUEUgRExMIGxpYnJhcnkgdG8gZnJlZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBmcmVlcyBhIGxvYWRlZCBQRSBETEwgbGlicmFyeSBmcm9tIG1lbW9yeS4KLQotU0VFIEFMU086Ci1QRV9nZXRQcm9jQWRkcmVzcywgUEVfbG9hZExpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBFQVBJIFBFX2ZyZWVMaWJyYXJ5KAotICAgIFBFX01PRFVMRSAqaE1vZHVsZSkKLXsKLSAgICBUZXJtaW5hdGVMaWJDX3QgVGVybWluYXRlTGliQzsKLQotI2lmIChkZWZpbmVkKF9fV0lORE9XUzMyX18pIHx8IGRlZmluZWQoX19EUklWRVJfXykpICYmIGRlZmluZWQoQ0hFQ0tFRCkKLSAgICBpZiAoaE1vZHVsZS0+c2hhcmVkID09IC0xKSB7Ci0JLyogUnVuIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBleGl0IGNvZGUgb24gbW9kdWxlIHVubG9hZCAqLwotCWlmICgoVGVybWluYXRlTGliQyA9IChUZXJtaW5hdGVMaWJDX3QpUE1fZ2V0UHJvY0FkZHJlc3MoaE1vZHVsZS0+dGV4dCwiX1Rlcm1pbmF0ZUxpYkMiKSkgIT0gTlVMTCkKLQkgICAgVGVybWluYXRlTGliQygpOwotCVBNX2ZyZWVMaWJyYXJ5KGhNb2R1bGUtPnRleHQpOwotCVBNX2ZyZWUoaE1vZHVsZSk7Ci0JfQotICAgIGVsc2UKLSNlbmRpZgotCXsKLQlpZiAoaE1vZHVsZSkgewotCSAgICAvKiBSdW4gdGhlIEMgcnVudGltZSBsaWJyYXJ5IGV4aXQgY29kZSBvbiBtb2R1bGUgdW5sb2FkICovCi0JICAgIGlmICgoVGVybWluYXRlTGliQyA9IChUZXJtaW5hdGVMaWJDX3QpUEVfZ2V0UHJvY0FkZHJlc3MoaE1vZHVsZSwiX1Rlcm1pbmF0ZUxpYkMiKSkgIT0gTlVMTCkKLQkJVGVybWluYXRlTGliQygpOwotCSAgICBpZiAoaE1vZHVsZS0+c2hhcmVkKQotCQlQTV9mcmVlU2hhcmVkKGhNb2R1bGUpOwotCSAgICBlbHNlCi0JCVBNX2ZyZWUoaE1vZHVsZSk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoZSBsYXN0IG9wZXJhdGlvbgotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGZvciB0aGUgbGFzdCBvcGVyYXRpb24uCi0KLVNFRSBBTFNPOgotUEVfZ2V0UHJvY0FkZHJlc3MsIFBFX2xvYWRMaWJyYXJ5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBFQVBJIFBFX2dldEVycm9yKHZvaWQpCi17Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi92ZXNhdmJlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vdmVzYXZiZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjY5ZTVjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi92ZXNhdmJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICBUaGUgU3VwZXJWR0EgS2l0IC0gVW5pVkJFIFNvZnR3YXJlIERldmVsb3BtZW50IEtpdAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBJQk0gUEMgUmVhbCBNb2RlIGFuZCAxNi8zMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBhIEMgY2FsbGFibGUgaW50ZXJmYWNlIHRvIHRoZSBzdGFuZGFyZAotKiAgICAgICAgICAgICAgIFZFU0EgVkJFIHJvdXRpbmVzLiBZb3Ugc2hvdWxkIHJpcCBvdXQgdGhpcyBtb2R1bGUgYW5kIHVzZSBpdAotKiAgICAgICAgICAgICAgIGRpcmVjdGx5IGluIHlvdXIgb3duIGFwcGxpY2F0aW9ucywgb3IgeW91IGNhbiB1c2UgdGhlCi0qICAgICAgICAgICAgICAgaGlnaCBsZXZlbCBTREsgZnVuY3Rpb25zLgotKgotKiAgICAgICAgICAgICAgIE1VU1QgYmUgY29tcGlsZWQgaW4gdGhlIExBUkdFIG9yIEZMQVQgbW9kZWxzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAidmVzYXZiZS5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgVkJFX1NVQ0NFU1MgICAgIDB4MDA0RgotI2RlZmluZSBNQVhfTElOX1BUUlMgICAgMTAKLQotc3RhdGljIHVpbnQgICAgICAgICBWRVNBQnVmX2xlbiA9IDEwMjQ7LyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgKi8KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJpdmExMjg7ICAgIC8qIFRydWUgaWYgd2UgaGF2ZSBhIFJpdmExMjggICAgICAgICovCi1zdGF0aWMgVkJFX3N0YXRlICAgIGRlZlN0YXRlID0gezB9OyAvKiBEZWZhdWx0IHN0YXRlIGJ1ZmZlciAgICAgICAgICAgICAqLwotc3RhdGljIFZCRV9zdGF0ZSAgICAqc3RhdGUgPSAmZGVmU3RhdGU7IC8qIFBvaW50ZXIgdG8gY3VycmVudCBidWZmZXIgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgVkJFX3NoYXJlZCA9IDA7Ci0jaWZuZGVmIFJFQUxNT0RFCi1zdGF0aWMgY2hhciAgICAgICAgIGxvY2FsQnVmWzUxMl07ICAvKiBHbG9iYWwgUE0gc3RyaW5nIHRyYW5zbGF0ZSBidWYgICAqLwotI2RlZmluZSBNQVhfTE9DQUxfQlVGICZsb2NhbEJ1Zls1MTFdCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc3RhdGljIGZ1bmN0aW9uIGluIFdpbkRpcmVjdCBmb3IgcGFzc2luZyAzMi1iaXQgcmVnaXN0ZXJzIHRvIEJJT1MgKi8KLWludCBQTUFQSSBXRF9pbnQzODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCk7Ci0KLXZvaWQgVkJFQVBJIFZCRV9pbml0KHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9pbml0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSW5pdGlhbGlzZXMgdGhlIFZCRSB0cmFuc2ZlciBidWZmZXIgaW4gcmVhbCBtb2RlIERDLm1lbW9yeS4KLSogICAgICAgICAgICAgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBWRVNBVkJFIG1vZHVsZSBldmVyeSB0aW1lCi0qICAgICAgICAgICAgICAgaXQgbmVlZHMgdG8gdXNlIHRoZSB0cmFuc2ZlciBidWZmZXIsIHNvIHdlIHNpbXBseSBhbGxvY2F0ZQotKiAgICAgICAgICAgICAgIGl0IG9uY2UgYW5kIHRoZW4gcmV0dXJuLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoIXN0YXRlLT5WRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoc3RhdGUtPlZFU0FCdWZfcHRyID0gUE1fZ2V0VkVTQUJ1ZigmVkVTQUJ1Zl9sZW4sICZzdGF0ZS0+VkVTQUJ1Zl9yc2VnLCAmc3RhdGUtPlZFU0FCdWZfcm9mZikpID09IE5VTEwpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlZFU0FWQkUuQzogUmVhbCBtb2RlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCEiKTsKLQl9Ci19Ci0KLXZvaWQgKiBWQkVBUEkgVkJFX2dldFJNQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRSTUJ1ZgotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbG9jYXRpb24gYW5kIGxlbmd0aCBvZiB0aGUgcmVhbAotKiAgICAgICAgICAgICAgIG1vZGUgbWVtb3J5IGJ1ZmZlciBmb3IgY2FsbGluZyByZWFsIG1vZGUgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBzdGF0ZS0+VkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gc3RhdGUtPlZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gc3RhdGUtPlZFU0FCdWZfcHRyOwotfQotCi12b2lkIFZCRUFQSSBWQkVfc2V0U3RhdGVCdWZmZXIoVkJFX3N0YXRlICpzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0U3RhdGVCdWZmZXIKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZ1bmN0aW9ucyBzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBidWZmZXIgZm9yIHRoZQotKiAgICAgICAgICAgICAgIFZCRSBtb2R1bGUgdG8gdGhlIHBhc3NlZCBpbiBidWZmZXIuIEJ5IGRlZmF1bHQgdGhlIGludGVybmFsCi0qICAgICAgICAgICAgICAgZ2xvYmFsIGJ1ZmZlciBpcyB1c2VkLCBidXQgeW91IG11c3QgdXNlIHNlcGFyYXRlIGJ1ZmZlcnMKLSogICAgICAgICAgICAgICBmb3IgZWFjaCBkZXZpY2UgaW4gYSBtdWx0aS1jb250cm9sbGVyIGVudmlyb25tZW50LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBzdGF0ZSA9IHM7Ci19Ci0KLXZvaWQgVkJFQVBJIFZCRV9jYWxsRVNESShSTVJFR1MgKnJlZ3MsIHZvaWQgKmJ1ZmZlciwgaW50IHNpemUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9jYWxsRVNESQotKiBQYXJhbWV0ZXJzOiAgIHJlZ3MgICAgLSBSZWdpc3RlcnMgdG8gbG9hZCB3aGVuIGNhbGxpbmcgVkJFCi0qICAgICAgICAgICAgICAgYnVmZmVyICAtIEJ1ZmZlciB0byBjb3B5IFZCRSBpbmZvIGJsb2NrIHRvCi0qICAgICAgICAgICAgICAgc2l6ZSAgICAtIFNpemUgb2YgYnVmZmVyIHRvIGZpbGwKLSoKLSogRGVzY3JpcHRpb246ICBDYWxscyB0aGUgVkVTQSBWQkUgYW5kIHBhc3NlcyBpbiBhIGJ1ZmZlciBmb3IgdGhlIFZCRSB0bwotKiAgICAgICAgICAgICAgIHN0b3JlIGluZm9ybWF0aW9uIGluLCB3aGljaCBpcyB0aGVuIGNvcGllZCBpbnRvIHRoZSB1c2VycwotKiAgICAgICAgICAgICAgIGJ1ZmZlciBzcGFjZS4gVGhpcyB3b3JrcyBpbiBwcm90ZWN0ZWQgbW9kZSBhcyB0aGUgYnVmZmVyCi0qICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBWRVNBIFZCRSBpcyBhbGxvY2F0ZWQgaW4gY29udmVudGlvbmFsCi0qICAgICAgICAgICAgICAgbWVtb3J5LCBhbmQgaXMgdGhlbiBjb3BpZWQgaW50byB0aGUgdXNlcnMgbWVtb3J5IGJsb2NrLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVNSRUdTIHNyZWdzOwotCi0gICAgaWYgKCFzdGF0ZS0+VkVTQUJ1Zl9wdHIpCi0JUE1fZmF0YWxFcnJvcigiWW91ICpNVVNUKiBjYWxsIFZCRV9pbml0KCkgYmVmb3JlIHlvdSBjYW4gY2FsbCB0aGUgVkVTQVZCRS5DIG1vZHVsZSEiKTsKLSAgICBzcmVncy5lcyA9ICh1c2hvcnQpc3RhdGUtPlZFU0FCdWZfcnNlZzsKLSAgICByZWdzLT54LmRpID0gKHVzaG9ydClzdGF0ZS0+VkVTQUJ1Zl9yb2ZmOwotICAgIG1lbWNweShzdGF0ZS0+VkVTQUJ1Zl9wdHIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgUE1faW50ODZ4KDB4MTAsIHJlZ3MsIHJlZ3MsICZzcmVncyk7Ci0gICAgbWVtY3B5KGJ1ZmZlciwgc3RhdGUtPlZFU0FCdWZfcHRyLCBzaXplKTsKLX0KLQotI2lmbmRlZiBSRUFMTU9ERQotc3RhdGljIGNoYXIgKlZCRV9jb3B5U3RyVG9Mb2NhbChjaGFyICpwLGNoYXIgKnJlYWxQdHIsY2hhciAqbWF4KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfY29weVN0clRvTG9jYWwKLSogUGFyYW1ldGVyczogICBwICAgICAgIC0gRmxhdCBtb2RlbCBidWZmZXIgdG8gY29weSB0bwotKiAgICAgICAgICAgICAgIHJlYWxQdHIgLSBSZWFsIG1vZGUgcG9pbnRlciB0byBjb3B5Ci0qIFJldHVybnM6ICAgICAgUG9pbnRlciB0byB0aGUgbmV4dCBieXRlIGFmdGVyIHN0cmluZwotKgotKiBEZXNjcmlwdGlvbjogIENvcGllcyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlYWwgbW9kZSBsb2NhdGlvbiBwb2ludGVkIHRvCi0qICAgICAgICAgICAgICAgYnkgJ3JlYWxQdHInIGludG8gdGhlIGZsYXQgbW9kZWwgYnVmZmVyIHBvaW50ZWQgdG8gYnkKLSogICAgICAgICAgICAgICAncCcuIFdlIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgYnl0ZSBwYXN0IHRoZSBjb3BpZWQKLSogICAgICAgICAgICAgICBzdHJpbmcuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIHVjaGFyICAgKnY7Ci0KLSAgICB2ID0gUE1fbWFwUmVhbFBvaW50ZXIoKHVpbnQpKCh1bG9uZylyZWFsUHRyID4+IDE2KSwgKHVpbnQpKCh1bG9uZylyZWFsUHRyICYgMHhGRkZGKSk7Ci0gICAgd2hpbGUgKCp2ICE9IDAgJiYgcCA8IG1heCkKLQkqcCsrID0gKnYrKzsKLSAgICAqcCsrID0gMDsKLSAgICByZXR1cm4gcDsKLX0KLQotc3RhdGljIHZvaWQgVkJFX2NvcHlTaG9ydFRvTG9jYWwodXNob3J0ICpwLHVzaG9ydCAqcmVhbFB0cikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2NvcHlTaG9ydFRvTG9jYWwKLSogUGFyYW1ldGVyczogICBwICAgICAgIC0gRmxhdCBtb2RlbCBidWZmZXIgdG8gY29weSB0bwotKiAgICAgICAgICAgICAgIHJlYWxQdHIgLSBSZWFsIG1vZGUgcG9pbnRlciB0byBjb3B5Ci0qCi0qIERlc2NyaXB0aW9uOiAgQ29waWVzIHRoZSBtb2RlIHRhYmxlIGZyb20gcmVhbCBtb2RlIG1lbW9yeSB0byB0aGUgZmxhdAotKiAgICAgICAgICAgICAgIG1vZGVsIGJ1ZmZlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgdXNob3J0ICAqdjsKLQotICAgIHYgPSBQTV9tYXBSZWFsUG9pbnRlcigodWludCkoKHVsb25nKXJlYWxQdHIgPj4gMTYpLCh1aW50KSgodWxvbmcpcmVhbFB0ciAmIDB4RkZGRikpOwotICAgIHdoaWxlICgqdiAhPSAweEZGRkYpCi0JKnArKyA9ICp2Kys7Ci0gICAgKnAgPSAweEZGRkY7Ci19Ci0jZW5kaWYKLQotaW50IFZCRUFQSSBWQkVfZGV0ZWN0RVhUKFZCRV92Z2FJbmZvICp2Z2FJbmZvLGlib29sIGZvcmNlVW5pVkJFKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZGV0ZWN0Ci0qIFBhcmFtZXRlcnM6ICAgdmdhSW5mbyAtIFBsYWNlIHRvIHN0b3JlIHRoZSBWR0EgaW5mb3JtYXRpb24gYmxvY2sKLSogUmV0dXJuczogICAgICBWQkUgdmVyc2lvbiBudW1iZXIsIG9yIDAgaWYgbm90IGRldGVjdGVkLgotKgotKiBEZXNjcmlwdGlvbjogIERldGVjdHMgaWYgYSBWRVNBIFZCRSBpcyBvdXQgdGhlcmUgYW5kIGZ1bmN0aW9uaW5nCi0qICAgICAgICAgICAgICAgY29ycmVjdGx5LiBJZiB3ZSBkZXRlY3QgYSBWQkUgaW50ZXJmYWNlIHdlIHJldHVybiB0aGUKLSogICAgICAgICAgICAgICBWR0FJbmZvQmxvY2sgcmV0dXJuZWQgYnkgdGhlIFZCRSBhbmQgdGhlIFZCRSB2ZXJzaW9uIG51bWJlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjAwOyAgICAgLyogR2V0IFN1cGVyVkdBIGluZm9ybWF0aW9uICovCi0gICAgaWYgKGZvcmNlVW5pVkJFKSB7Ci0JcmVncy54LmJ4ID0gMHgxMjM0OwotCXJlZ3MueC5jeCA9IDB4NDMyMTsKLQl9Ci0gICAgZWxzZSB7Ci0JcmVncy54LmJ4ID0gMDsKLQlyZWdzLnguY3ggPSAwOwotCX0KLSAgICBzdHJuY3B5KHZnYUluZm8tPlZFU0FTaWduYXR1cmUsIlZCRTIiLDQpOwotICAgIFZCRV9jYWxsRVNESSgmcmVncywgdmdhSW5mbywgc2l6ZW9mKCp2Z2FJbmZvKSk7Ci0gICAgaWYgKHJlZ3MueC5heCAhPSBWQkVfU1VDQ0VTUykKLQlyZXR1cm4gMDsKLSAgICBpZiAoc3RybmNtcCh2Z2FJbmZvLT5WRVNBU2lnbmF0dXJlLCJWRVNBIiw0KSAhPSAwKQotCXJldHVybiAwOwotCi0gICAgLyogQ2hlY2sgZm9yIGJvZ3VzIEJJT1NlcyB0aGF0IHJldHVybiBhIFZCRSB2ZXJzaW9uIG51bWJlciB0aGF0IGlzCi0gICAgICogbm90IGNvcnJlY3QsIGFuZCBmaXggaXQgdXAuIFdlIGFsc28gY2hlY2sgdGhlIE9lbVZlbmRvck5hbWVQdHIgZm9yIGEKLSAgICAgKiB2YWxpZCB2YWx1ZSwgYW5kIGlmIGl0IGlzIGludmFsaWQgdGhlbiB3ZSBhbHNvIHJlc2V0IHRvIFZCRSAxLjIuCi0gICAgICovCi0gICAgaWYgKHZnYUluZm8tPlZFU0FWZXJzaW9uID49IDB4MjAwICYmIHZnYUluZm8tPk9lbVZlbmRvck5hbWVQdHIgPT0gMCkKLQl2Z2FJbmZvLT5WRVNBVmVyc2lvbiA9IDB4MTAyOwotI2lmbmRlZiBSRUFMTU9ERQotICAgIC8qIFJlbG9jYXRlIGFsbCB0aGUgaW5kaXJlY3QgaW5mb3JtYXRpb24gKG1vZGUgdGFibGVzLCBPRU0gc3RyaW5ncwotICAgICAqIGV0YykgZnJvbSB0aGUgbG93IDFNYiBtZW1vcnkgcmVnaW9uIGludG8gYSBzdGF0aWMgYnVmZmVyIGluCi0gICAgICogb3VyIGRlZmF1bHQgZGF0YSBzZWdtZW50LiBXZSBkbyB0aGlzIHRvIGluc3VsYXRlIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIGZyb20gbWFwcGluZyB0aGUgc3RyaW5ncyBmcm9tIHJlYWwgbW9kZSB0byBwcm90ZWN0ZWQgbW9kZS4KLSAgICAgKi8KLSAgICB7Ci0JY2hhciAqcCwqcDI7Ci0gICAgIHAyID0gVkJFX2NvcHlTdHJUb0xvY2FsKGxvY2FsQnVmLHZnYUluZm8tPk9lbVN0cmluZ1B0cixNQVhfTE9DQUxfQlVGKTsKLSAgICAgdmdhSW5mby0+T2VtU3RyaW5nUHRyID0gbG9jYWxCdWY7Ci0gICAgIGlmICh2Z2FJbmZvLT5WRVNBVmVyc2lvbiA+PSAweDIwMCkgewotCSBwID0gVkJFX2NvcHlTdHJUb0xvY2FsKHAyLHZnYUluZm8tPk9lbVZlbmRvck5hbWVQdHIsTUFYX0xPQ0FMX0JVRik7Ci0JIHZnYUluZm8tPk9lbVZlbmRvck5hbWVQdHIgPSBwMjsKLQkgcDIgPSBWQkVfY29weVN0clRvTG9jYWwocCx2Z2FJbmZvLT5PZW1Qcm9kdWN0TmFtZVB0cixNQVhfTE9DQUxfQlVGKTsKLQkgdmdhSW5mby0+T2VtUHJvZHVjdE5hbWVQdHIgPSBwOwotCSBwID0gVkJFX2NvcHlTdHJUb0xvY2FsKHAyLHZnYUluZm8tPk9lbVByb2R1Y3RSZXZQdHIsTUFYX0xPQ0FMX0JVRik7Ci0JIHZnYUluZm8tPk9lbVByb2R1Y3RSZXZQdHIgPSBwMjsKLQkgVkJFX2NvcHlTaG9ydFRvTG9jYWwoKHVzaG9ydCopcCx2Z2FJbmZvLT5WaWRlb01vZGVQdHIpOwotCSB2Z2FJbmZvLT5WaWRlb01vZGVQdHIgPSAodXNob3J0KilwOwotCSB9Ci0gICAgIGVsc2UgewotCSBWQkVfY29weVNob3J0VG9Mb2NhbCgodXNob3J0KilwMix2Z2FJbmZvLT5WaWRlb01vZGVQdHIpOwotCSB2Z2FJbmZvLT5WaWRlb01vZGVQdHIgPSAodXNob3J0KilwMjsKLQkgfQotICAgIH0KLSNlbmRpZgotICAgIHN0YXRlLT5WQkVNZW1vcnkgPSB2Z2FJbmZvLT5Ub3RhbE1lbW9yeSAqIDY0OwotCi0gICAgLyogQ2hlY2sgZm9yIFJpdmExMjggYmFzZWQgY2FyZHMgc2luY2UgdGhleSBoYXZlIGJyb2tlbiB0cmlwbGUgYnVmZmVyaW5nCi0gICAgICogYW5kIHN0ZXJlbyBzdXBwb3J0LgotICAgICAqLwotICAgIGhhdmVSaXZhMTI4ID0gZmFsc2U7Ci0gICAgaWYgKHZnYUluZm8tPlZFU0FWZXJzaW9uID49IDB4MzAwICYmCi0JICAgKHN0cnN0cih2Z2FJbmZvLT5PZW1TdHJpbmdQdHIsIk5WaWRpYSIpICE9IE5VTEwgfHwKLQkgICAgc3Ryc3RyKHZnYUluZm8tPk9lbVN0cmluZ1B0ciwiUml2YSIpICE9IE5VTEwpKSB7Ci0JaGF2ZVJpdmExMjggPSB0cnVlOwotCX0KLQotICAgIC8qIENoZWNrIGZvciBNYXRyb3ggRzQwMCBjYXJkcyB3aGljaCBjbGFpbSB0byBiZSBWQkUgMy4wCi0gICAgICogY29tcGxpYW50IHlldCB0aGV5IGRvbid0IGltcGxlbWVudCB0aGUgcmVmcmVzaCByYXRlIGNvbnRyb2wKLSAgICAgKiBmdW5jdGlvbnMuCi0gICAgICovCi0gICAgaWYgKHZnYUluZm8tPlZFU0FWZXJzaW9uID49IDB4MzAwICYmIChzdHJjbXAodmdhSW5mby0+T2VtUHJvZHVjdE5hbWVQdHIsIk1hdHJveCBHNDAwIikgPT0gMCkpCi0JdmdhSW5mby0+VkVTQVZlcnNpb24gPSAweDIwMDsKLSAgICByZXR1cm4gKHN0YXRlLT5WQkVWZXJzaW9uID0gdmdhSW5mby0+VkVTQVZlcnNpb24pOwotfQotCi1pbnQgVkJFQVBJIFZCRV9kZXRlY3QoVkJFX3ZnYUluZm8gKnZnYUluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9kZXRlY3QKLSogUGFyYW1ldGVyczogICB2Z2FJbmZvIC0gUGxhY2UgdG8gc3RvcmUgdGhlIFZHQSBpbmZvcm1hdGlvbiBibG9jawotKiBSZXR1cm5zOiAgICAgIFZCRSB2ZXJzaW9uIG51bWJlciwgb3IgMCBpZiBub3QgZGV0ZWN0ZWQuCi0qCi0qIERlc2NyaXB0aW9uOiAgRGV0ZWN0cyBpZiBhIFZFU0EgVkJFIGlzIG91dCB0aGVyZSBhbmQgZnVuY3Rpb25pbmcKLSogICAgICAgICAgICAgICBjb3JyZWN0bHkuIElmIHdlIGRldGVjdCBhIFZCRSBpbnRlcmZhY2Ugd2UgcmV0dXJuIHRoZQotKiAgICAgICAgICAgICAgIFZHQUluZm9CbG9jayByZXR1cm5lZCBieSB0aGUgVkJFIGFuZCB0aGUgVkJFIHZlcnNpb24gbnVtYmVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICByZXR1cm4gVkJFX2RldGVjdEVYVCh2Z2FJbmZvLGZhbHNlKTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9nZXRNb2RlSW5mbyhpbnQgbW9kZSxWQkVfbW9kZUluZm8gKm1vZGVJbmZvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0TW9kZUluZm8KLSogUGFyYW1ldGVyczogICBtb2RlICAgICAgICAtIFZCRSBtb2RlIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IKLSogICAgICAgICAgICAgICBtb2RlSW5mbyAgICAtIFBsYWNlIHRvIHN0b3JlIFZCRSBtb2RlIGluZm9ybWF0aW9uCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBmdW5jdGlvbiBmYWlsZWQuCi0qCi0qIERlc2NyaXB0aW9uOiAgT2J0YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHZpZGVvIG1vZGUgZnJvbSB0aGUKLSogICAgICAgICAgICAgICBWQkUuIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gdG8gZmluZCB0aGUgdmlkZW8gbW9kZQotKiAgICAgICAgICAgICAgIHlvdSB3aXNoIHRvIHNldCwgYXMgdGhlIG5ldyBWQkUgMi4wIG1vZGUgbnVtYmVycyBtYXkgYmUKLSogICAgICAgICAgICAgICBjb21wbGV0ZWx5IGFyYml0cmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIGludCAgICAgYml0czsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwMTsgICAgICAgICAgICAgLyogR2V0IG1vZGUgaW5mb3JtYXRpb24gICAgICAgICAqLwotICAgIHJlZ3MueC5jeCA9ICh1c2hvcnQpbW9kZTsKLSAgICBWQkVfY2FsbEVTREkoJnJlZ3MsIG1vZGVJbmZvLCBzaXplb2YoKm1vZGVJbmZvKSk7Ci0gICAgaWYgKHJlZ3MueC5heCAhPSBWQkVfU1VDQ0VTUykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKChtb2RlSW5mby0+TW9kZUF0dHJpYnV0ZXMgJiB2YmVNZEF2YWlsYWJsZSkgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBNYXAgb3V0IHRyaXBsZSBidWZmZXIgYW5kIHN0ZXJlbyBmbGFncyBmb3IgTlZpZGlhIFJpdmExMjgKLSAgICAgKiBjaGlwcy4KLSAgICAgKi8KLSAgICBpZiAoaGF2ZVJpdmExMjgpIHsKLQltb2RlSW5mby0+TW9kZUF0dHJpYnV0ZXMgJj0gfnZiZU1kVHJpcGxlQnVmOwotCW1vZGVJbmZvLT5Nb2RlQXR0cmlidXRlcyAmPSB+dmJlTWRTdGVyZW87Ci0JfQotCi0gICAgLyogU3VwcG9ydCBvbGQgc3R5bGUgUkdCIGRlZmluaXRpb25zIGZvciBWQkUgMS4xIEJJT1NlcyAqLwotICAgIGJpdHMgPSBtb2RlSW5mby0+Qml0c1BlclBpeGVsOwotICAgIGlmIChtb2RlSW5mby0+TWVtb3J5TW9kZWwgPT0gdmJlTWVtUEsgJiYgYml0cyA+IDgpIHsKLQltb2RlSW5mby0+TWVtb3J5TW9kZWwgPSB2YmVNZW1SR0I7Ci0Jc3dpdGNoIChiaXRzKSB7Ci0JICAgIGNhc2UgMTU6Ci0JCW1vZGVJbmZvLT5SZWRNYXNrU2l6ZSA9IDU7Ci0JCW1vZGVJbmZvLT5SZWRGaWVsZFBvc2l0aW9uID0gMTA7Ci0JCW1vZGVJbmZvLT5HcmVlbk1hc2tTaXplID0gNTsKLQkJbW9kZUluZm8tPkdyZWVuRmllbGRQb3NpdGlvbiA9IDU7Ci0JCW1vZGVJbmZvLT5CbHVlTWFza1NpemUgPSA1OwotCQltb2RlSW5mby0+Qmx1ZUZpZWxkUG9zaXRpb24gPSAwOwotCQltb2RlSW5mby0+UnN2ZE1hc2tTaXplID0gMTsKLQkJbW9kZUluZm8tPlJzdmRGaWVsZFBvc2l0aW9uID0gMTU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDE2OgotCQltb2RlSW5mby0+UmVkTWFza1NpemUgPSA1OwotCQltb2RlSW5mby0+UmVkRmllbGRQb3NpdGlvbiA9IDExOwotCQltb2RlSW5mby0+R3JlZW5NYXNrU2l6ZSA9IDU7Ci0JCW1vZGVJbmZvLT5HcmVlbkZpZWxkUG9zaXRpb24gPSA1OwotCQltb2RlSW5mby0+Qmx1ZU1hc2tTaXplID0gNTsKLQkJbW9kZUluZm8tPkJsdWVGaWVsZFBvc2l0aW9uID0gMDsKLQkJbW9kZUluZm8tPlJzdmRNYXNrU2l6ZSA9IDA7Ci0JCW1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiA9IDA7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDI0OgotCQltb2RlSW5mby0+UmVkTWFza1NpemUgPSA4OwotCQltb2RlSW5mby0+UmVkRmllbGRQb3NpdGlvbiA9IDE2OwotCQltb2RlSW5mby0+R3JlZW5NYXNrU2l6ZSA9IDg7Ci0JCW1vZGVJbmZvLT5HcmVlbkZpZWxkUG9zaXRpb24gPSA4OwotCQltb2RlSW5mby0+Qmx1ZU1hc2tTaXplID0gODsKLQkJbW9kZUluZm8tPkJsdWVGaWVsZFBvc2l0aW9uID0gMDsKLQkJbW9kZUluZm8tPlJzdmRNYXNrU2l6ZSA9IDA7Ci0JCW1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiA9IDA7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgLyogQ29udmVydCB0aGUgMzJrIGRpcmVjdCBjb2xvciBtb2RlcyBvZiBWQkUgMS4yKyBCSU9TZXMgdG8KLSAgICAgKiBiZSByZWNvZ25pc2VkIGFzIDE1IGJpdHMgcGVyIHBpeGVsIG1vZGVzLgotICAgICAqLwotICAgIGlmIChiaXRzID09IDE2ICYmIG1vZGVJbmZvLT5Sc3ZkTWFza1NpemUgPT0gMSkKLQltb2RlSW5mby0+Qml0c1BlclBpeGVsID0gMTU7Ci0KLSAgICAvKiBGaXggdXAgYm9ndXMgQklPUydlcyB0aGF0IHJlcG9ydCBpbmNvcnJlY3QgcmVzZXJ2ZWQgcGl4ZWwgbWFza3MKLSAgICAgKiBmb3IgMzJLIGNvbG9yIG1vZGVzLiBRdWl0ZSBhIG51bWJlciBvZiBCSU9TJ2VzIGhhdmUgdGhpcyBwcm9ibGVtLAotICAgICAqIGFuZCB0aGlzIGFmZmVjdHMgb3VyIE9TLzIgZHJpdmVycyBpbiBWQkUgZmFsbGJhY2sgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoYml0cyA9PSAxNSAmJiAobW9kZUluZm8tPlJzdmRNYXNrU2l6ZSAhPSAxIHx8IG1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiAhPSAxNSkpIHsKLQltb2RlSW5mby0+UnN2ZE1hc2tTaXplID0gMTsKLQltb2RlSW5mby0+UnN2ZEZpZWxkUG9zaXRpb24gPSAxNTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcgVkJFQVBJIFZCRV9nZXRQYWdlU2l6ZShWQkVfbW9kZUluZm8gKm1pKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0UGFnZVNpemUKLSogUGFyYW1ldGVyczogICBtaSAgLSBQb2ludGVyIHRvIG1vZGUgaW5mb3JtYXRpb24gYmxvY2sKLSogUmV0dXJuczogICAgICBDYWN1bGF0ZWQgcGFnZSBzaXplIGluIGJ5dGVzIHJvdW5kZWQgdG8gY29ycmVjdCBib3VuZGFyeQotKgotKiBEZXNjcmlwdGlvbjogIENvbXB1dGVzIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZQotKiAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGJsb2NrLCByb3VuZGVkIHVwIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeQotKiAgICAgICAgICAgICAgICg4aywgMTZrLCAzMmsgb3IgNjRrKS4gUGFnZXMgPj0gNjRrIGluIHNpemUgYXJlIGFsd2F5cwotKiAgICAgICAgICAgICAgIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgNjRrIGJvdW5kYXJ5IChzbyB0aGUgc3RhcnQgb2YgYQotKiAgICAgICAgICAgICAgIHBhZ2UgaXMgYWx3YXlzIGJhbmsgYWxpZ25lZCkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIGxvbmcgc2l6ZTsKLQotICAgIHNpemUgPSAobG9uZyltaS0+Qnl0ZXNQZXJTY2FuTGluZSAqIChsb25nKW1pLT5ZUmVzb2x1dGlvbjsKLSAgICBpZiAobWktPkJpdHNQZXJQaXhlbCA9PSA0KSB7Ci0JLyogV2UgaGF2ZSBhIDE2IGNvbG9yIHZpZGVvIG1vZGUsIHNvIHJvdW5kIHVwIHRoZSBwYWdlIHNpemUgdG8KLQkgKiA4aywgMTZrLCAzMmsgb3IgNjRrIGJvdW5kYXJpZXMgZGVwZW5kaW5nIG9uIGhvdyBsYXJnZSBpdCBpcy4KLQkgKi8KLQotCXNpemUgPSAoc2l6ZSArIDB4MUZGRkwpICYgMHhGRkZGRTAwMEw7Ci0JaWYgKHNpemUgIT0gMHgyMDAwKSB7Ci0JICAgIHNpemUgPSAoc2l6ZSArIDB4M0ZGRkwpICYgMHhGRkZGQzAwMEw7Ci0JICAgIGlmIChzaXplICE9IDB4NDAwMCkgewotCQlzaXplID0gKHNpemUgKyAweDdGRkZMKSAmIDB4RkZGRjgwMDBMOwotCQlpZiAoc2l6ZSAhPSAweDgwMDApCi0JCSAgICBzaXplID0gKHNpemUgKyAweEZGRkZMKSAmIDB4RkZGRjAwMDBMOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgZWxzZSBzaXplID0gKHNpemUgKyAweEZGRkZMKSAmIDB4RkZGRjAwMDBMOwotICAgIHJldHVybiBzaXplOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX3NldFZpZGVvTW9kZUV4dChpbnQgbW9kZSxWQkVfQ1JUQ0luZm8gKmNydGMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXRWaWRlb01vZGVFeHQKLSogUGFyYW1ldGVyczogICBtb2RlICAgIC0gU3VwZXJWR0EgdmlkZW8gbW9kZSB0byBzZXQuCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiB0aGUgbW9kZSB3YXMgc2V0LCBmYWxzZSBpZiBub3QuCi0qCi0qIERlc2NyaXB0aW9uOiAgQXR0ZW1wdHMgdG8gc2V0IHRoZSBzcGVjaWZpZWQgdmlkZW8gbW9kZS4gVGhpcyB2ZXJzaW9uCi0qICAgICAgICAgICAgICAgaW5jbHVkZXMgc3VwcG9ydCBmb3IgdGhlIFZCRS9Db3JlIDMuMCByZWZyZXNoIHJhdGUgY29udHJvbAotKiAgICAgICAgICAgICAgIG1lY2hhbmlzbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uIDwgMHgyMDAgJiYgbW9kZSA8IDB4MTAwKSB7Ci0JLyogU29tZSBWQkUgaW1wbGVtZW50YXRpb25zIGJhcmYgdGVycmlibHkgaWYgeW91IHRyeSB0byBzZXQgbm9uLVZCRQotCSAqIHZpZGVvIG1vZGVzIHdpdGggdGhlIFZCRSBzZXQgbW9kZSBjYWxsLiBWQkUgMi4wIGltcGxlbWVudGF0aW9ucwotCSAqIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlyZWdzLmguYWwgPSAodXNob3J0KW1vZGU7Ci0JcmVncy5oLmFoID0gMDsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQl9Ci0gICAgZWxzZSB7Ci0JaWYgKHN0YXRlLT5WQkVWZXJzaW9uIDwgMHgzMDAgJiYgKG1vZGUgJiB2YmVSZWZyZXNoQ3RybCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQlyZWdzLnguYXggPSAweDRGMDI7Ci0JcmVncy54LmJ4ID0gKHVzaG9ydCltb2RlOwotCWlmICgobW9kZSAmIHZiZVJlZnJlc2hDdHJsKSAmJiBjcnRjKQotCSAgICBWQkVfY2FsbEVTREkoJnJlZ3MsIGNydGMsIHNpemVvZigqY3J0YykpOwotCWVsc2UKLQkgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JaWYgKHJlZ3MueC5heCAhPSBWQkVfU1VDQ0VTUykKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXRWaWRlb01vZGUoaW50IG1vZGUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXRWaWRlb01vZGUKLSogUGFyYW1ldGVyczogICBtb2RlICAgIC0gU3VwZXJWR0EgdmlkZW8gbW9kZSB0byBzZXQuCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiB0aGUgbW9kZSB3YXMgc2V0LCBmYWxzZSBpZiBub3QuCi0qCi0qIERlc2NyaXB0aW9uOiAgQXR0ZW1wdHMgdG8gc2V0IHRoZSBzcGVjaWZpZWQgdmlkZW8gbW9kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuIFZCRV9zZXRWaWRlb01vZGVFeHQobW9kZSxOVUxMKTsKLX0KLQotaW50IFZCRUFQSSBWQkVfZ2V0VmlkZW9Nb2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRWaWRlb01vZGUKLSogUmV0dXJuczogICAgICBDdXJyZW50IHZpZGVvIG1vZGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjAzOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiByZWdzLnguYng7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0QmFuayhpbnQgd2luZG93LGludCBiYW5rKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0QmFuawotKiBQYXJhbWV0ZXJzOiAgIHdpbmRvdyAgLSBXaW5kb3cgdG8gc2V0Ci0qICAgICAgICAgICAgICAgYmFuayAgICAtIEJhbmsgbnVtYmVyIHRvIHNldCB3aW5kb3cgdG8KLSogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLmguYmggPSAwOwotICAgIHJlZ3MuaC5ibCA9IHdpbmRvdzsKLSAgICByZWdzLnguZHggPSBiYW5rOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWludCBWQkVBUEkgVkJFX2dldEJhbmsoaW50IHdpbmRvdykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX3NldEJhbmsKLSogUGFyYW1ldGVyczogICB3aW5kb3cgIC0gV2luZG93IHRvIHJlYWQKLSogUmV0dXJuczogICAgICBCYW5rIG51bWJlciBmb3IgdGhlIHdpbmRvdyAoLTEgb24gZmFpbHVyZSkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA1OwotICAgIHJlZ3MuaC5iaCA9IDE7Ci0gICAgcmVncy5oLmJsID0gd2luZG93OwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiByZWdzLnguZHg7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0UGl4ZWxzUGVyTGluZShpbnQgcGl4ZWxzUGVyTGluZSxpbnQgKm5ld0J5dGVzLAotICAgIGludCAqbmV3UGl4ZWxzLGludCAqbWF4U2NhbmxpbmVzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0UGl4ZWxzUGVyTGluZQotKiBQYXJhbWV0ZXJzOiAgIHBpeGVsc1BlckxpbmUgICAtIFBpeGVscyBwZXIgc2NhbmxpbmUKLSogICAgICAgICAgICAgICBuZXdCeXRlcyAgICAgICAgLSBTdG9yYWdlIGZvciBieXRlcyBwZXIgbGluZSB2YWx1ZSBzZXQKLSogICAgICAgICAgICAgICBuZXdQaXhlbHMgICAgICAgLSBTdG9yYWdlIGZvciBwaXhlbHMgcGVyIGxpbmUgdmFsdWUgc2V0Ci0qICAgICAgICAgICAgICAgbWF4U2NhbkxpbmVzICAgIC0gU3RvcmFnZSBmb3IgbWF4aW11bSBudW1iZXIgb2Ygc2NhbmxpbmVzCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCi0qCi0qIERlc2NyaXB0aW9uOiAgU2V0cyB0aGUgc2NhbmxpbmUgbGVuZ3RoIGZvciB0aGUgdmlkZW8gbW9kZSB0byB0aGUgc3BlY2lmaWVkCi0qICAgICAgICAgICAgICAgbnVtYmVyIG9mIHBpeGVscyBwZXIgc2NhbmxpbmUuIElmIHlvdSBuZWVkIG1vcmUgZ3JhbnVsYXJpdHkKLSogICAgICAgICAgICAgICBpbiBUcnVlQ29sb3IgbW9kZXMsIHVzZSB0aGUgVkJFX3NldEJ5dGVzUGVyTGluZSByb3V0aW5lCi0qICAgICAgICAgICAgICAgKG9ubHkgdmFsaWQgZm9yIFZCRSAyLjApLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDY7Ci0gICAgcmVncy5oLmJsID0gMDsKLSAgICByZWdzLnguY3ggPSBwaXhlbHNQZXJMaW5lOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICpuZXdCeXRlcyA9IHJlZ3MueC5ieDsKLSAgICAqbmV3UGl4ZWxzID0gcmVncy54LmN4OwotICAgICptYXhTY2FubGluZXMgPSByZWdzLnguZHg7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXRCeXRlc1BlckxpbmUoaW50IGJ5dGVzUGVyTGluZSxpbnQgKm5ld0J5dGVzLAotICAgIGludCAqbmV3UGl4ZWxzLGludCAqbWF4U2NhbmxpbmVzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0Qnl0ZXNQZXJMaW5lCi0qIFBhcmFtZXRlcnM6ICAgcGl4ZWxzUGVyTGluZSAgIC0gUGl4ZWxzIHBlciBzY2FubGluZQotKiAgICAgICAgICAgICAgIG5ld0J5dGVzICAgICAgICAtIFN0b3JhZ2UgZm9yIGJ5dGVzIHBlciBsaW5lIHZhbHVlIHNldAotKiAgICAgICAgICAgICAgIG5ld1BpeGVscyAgICAgICAtIFN0b3JhZ2UgZm9yIHBpeGVscyBwZXIgbGluZSB2YWx1ZSBzZXQKLSogICAgICAgICAgICAgICBtYXhTY2FuTGluZXMgICAgLSBTdG9yYWdlIGZvciBtYXhpbXVtIG51bWJlciBvZiBzY2FubGluZXMKLSogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKLSoKLSogRGVzY3JpcHRpb246ICBTZXRzIHRoZSBzY2FubGluZSBsZW5ndGggZm9yIHRoZSB2aWRlbyBtb2RlIHRvIHRoZSBzcGVjaWZpZWQKLSogICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW5saW5lICh2YWxpZCBmb3IgVkJFIDIuMCBvbmx5KS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA2OwotICAgIHJlZ3MuaC5ibCA9IDI7Ci0gICAgcmVncy54LmN4ID0gYnl0ZXNQZXJMaW5lOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICpuZXdCeXRlcyA9IHJlZ3MueC5ieDsKLSAgICAqbmV3UGl4ZWxzID0gcmVncy54LmN4OwotICAgICptYXhTY2FubGluZXMgPSByZWdzLnguZHg7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9nZXRTY2FubGluZUxlbmd0aChpbnQgKmJ5dGVzUGVyTGluZSxpbnQgKnBpeGVsc1BlckxpbmUsCi0gICAgaW50ICptYXhTY2FubGluZXMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTY2FubGluZUxlbmd0aAotKiBQYXJhbWV0ZXJzOiAgIGJ5dGVzUGVyTGluZSAgICAtIFN0b3JhZ2UgZm9yIGJ5dGVzIHBlciBzY2FubGluZQotKiAgICAgICAgICAgICAgIHBpeGVsc1BlckxpbmUgICAtIFN0b3JhZ2UgZm9yIHBpeGVscyBwZXIgc2NhbmxpbmUKLSogICAgICAgICAgICAgICBtYXhTY2FuTGluZXMgICAgLSBTdG9yYWdlIGZvciBtYXhpbXVtIG51bWJlciBvZiBzY2FubGluZXMKLSogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA2OwotICAgIHJlZ3MuaC5ibCA9IDE7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgKmJ5dGVzUGVyTGluZSA9IHJlZ3MueC5ieDsKLSAgICAqcGl4ZWxzUGVyTGluZSA9IHJlZ3MueC5jeDsKLSAgICAqbWF4U2NhbmxpbmVzID0gcmVncy54LmR4OwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfZ2V0TWF4U2NhbmxpbmVMZW5ndGgoaW50ICptYXhCeXRlcyxpbnQgKm1heFBpeGVscykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldE1heFNjYW5saW5lTGVuZ3RoCi0qIFBhcmFtZXRlcnM6ICAgbWF4Qnl0ZXMgICAgLSBNYXhpbXVtIHNjYW5saW5lIHdpZHRoIGluIGJ5dGVzCi0qICAgICAgICAgICAgICAgbWF4UGl4ZWxzICAgLSBNYXhpbXVtIHNjYW5saW5lIHdpZHRoIGluIHBpeGVscwotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgZnVuY3Rpb24gZmFpbGVkCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNjsKLSAgICByZWdzLmguYmwgPSAzOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICptYXhCeXRlcyA9IHJlZ3MueC5ieDsKLSAgICAqbWF4UGl4ZWxzID0gcmVncy54LmN4OwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0RGlzcGxheVN0YXJ0KGludCB4LGludCB5LGlib29sIHdhaXRWUlQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXREaXNwbGF5U3RhcnQKLSogUGFyYW1ldGVyczogICB4LHkgICAgIC0gUG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGRpc3BsYXkKLSogICAgICAgICAgICAgICB3YWl0VlJUIC0gVHJ1ZSB0byB3YWl0IGZvciByZXRyYWNlLCBmYWxzZSBpZiBub3QKLSogUmV0dXJuczogICAgICBUcnVlIGlmIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLgotKgotKiBEZXNjcmlwdGlvbjogIFNldHMgdGhlIG5ldyBzdGFydGluZyBkaXNwbGF5IHBvc2l0aW9uIHRvIGltcGxlbWVudAotKiAgICAgICAgICAgICAgIGhhcmR3YXJlIHNjcm9sbGluZy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA3OwotICAgIGlmICh3YWl0VlJUKQotCXJlZ3MueC5ieCA9IDB4ODA7Ci0gICAgZWxzZSByZWdzLnguYnggPSAweDAwOwotICAgIHJlZ3MueC5jeCA9IHg7Ci0gICAgcmVncy54LmR4ID0geTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX2dldERpc3BsYXlTdGFydChpbnQgKngsaW50ICp5KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0RGlzcGxheVN0YXJ0Ci0qIFBhcmFtZXRlcnM6ICAgeCx5IC0gUGxhY2UgdG8gc3RvcmUgc3RhcnRpbmcgYWRkcmVzcyB2YWx1ZQotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNzsKLSAgICByZWdzLnguYnggPSAweDAxOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICp4ID0gcmVncy54LmN4OwotICAgICp5ID0gcmVncy54LmR4OwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0RGlzcGxheVN0YXJ0QWx0KHVsb25nIHN0YXJ0QWRkcixpYm9vbCB3YWl0VlJUKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0RGlzcGxheVN0YXJ0QWx0Ci0qIFBhcmFtZXRlcnM6ICAgc3RhcnRBZGRyICAgLSAzMi1iaXQgc3RhcnRpbmcgYWRkcmVzcyBpbiBkaXNwbGF5IG1lbW9yeQotKiAgICAgICAgICAgICAgIHdhaXRWUlQgICAgIC0gVHJ1ZSB0byB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlLCBmYWxzZSBpZiBub3QKLSogUmV0dXJuczogICAgICBUcnVlIGlmIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBpZiBub3Qgc3VwcG9ydGVkLgotKgotKiBEZXNjcmlwdGlvbjogIFNldHMgdGhlIG5ldyBzdGFydGluZyBkaXNwbGF5IHBvc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQKLSogICAgICAgICAgICAgICAzMi1iaXQgZGlzcGxheSBzdGFydCBhZGRyZXNzLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcwotKiAgICAgICAgICAgICAgIGRpZmZlcmVudCB0aGUgdGhlIHZlcnNpb24gYWJvdmUsIHNpbmNlIGl0IHRha2VzIGEgMzItYml0Ci0qICAgICAgICAgICAgICAgYnl0ZSBvZmZzZXQgaW4gdmlkZW8gbWVtb3J5IGFzIHRoZSBzdGFydGluZyBhZGRyZXNzIHdoaWNoCi0qICAgICAgICAgICAgICAgZ2l2ZXMgdGhlIHByb2dyYW1tZXIgbWF4aW11bSBjb250cm9sIG92ZXIgdGhlIHN0YXQgYWRkcmVzcy4KLSoKLSogICAgICAgICAgICAgICBOT1RFOiBSZXF1aXJlcyBWQkUvQ29yZSAzLjAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MzAwKSB7Ci0JcmVncy54LmF4ID0gMHg0RjA3OwotCXJlZ3MueC5ieCA9IHdhaXRWUlQgPyAweDgyIDogMHgwMjsKLQlyZWdzLmUuZWN4ID0gc3RhcnRBZGRyOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW50IFZCRUFQSSBWQkVfZ2V0RGlzcGxheVN0YXJ0U3RhdHVzKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXREaXNwbGF5U3RhcnRTdGF0dXMKLSogUmV0dXJuczogICAgICAwIGlmIGxhc3QgZmxpcCBub3Qgb2NjdXJyZWQsIDEgaWYgYWxyZWFkeSBmbGlwcGVkCi0qICAgICAgICAgICAgICAgLTEgaWYgbm90IHN1cHBvcnRlZAotKgotKiBEZXNjcmlwdGlvbjogIFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgcHJldmlvdXMgZGlzcGxheSBzdGFydCByZXF1ZXN0LgotKiAgICAgICAgICAgICAgIElmIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIHRoZSBwcm9ncmFtbWVyIGNhbiBpbXBsZW1lbnQKLSogICAgICAgICAgICAgICBoYXJkd2FyZSB0cmlwbGUgYnVmZmVyaW5nIHVzaW5nIHRoaXMgZnVuY3Rpb24uCi0qCi0qICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgewotCXJlZ3MueC5heCA9IDB4NEYwNzsKLQlyZWdzLnguYnggPSAweDAwMDQ7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JaWYgKHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUykKLQkgICAgcmV0dXJuIChyZWdzLnguY3ggIT0gMCk7Ci0JfQotICAgIHJldHVybiAtMTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9lbmFibGVTdGVyZW9Nb2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9lbmFibGVTdGVyZW9Nb2RlCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBzdGVyZW8gbW9kZSBlbmFibGVkLCBmYWxzZSBpZiBub3Qgc3VwcG9ydGVkLgotKgotKiBEZXNjcmlwdGlvbjogIFB1dHMgdGhlIHN5c3RlbSBpbnRvIGhhcmR3YXJlIHN0ZXJlbyBtb2RlIGZvciBMQyBzaHV0dGVyCi0qICAgICAgICAgICAgICAgZ2xhc3Nlcywgd2hlcmUgdGhlIGRpc3BsYXkgc3dhcHMgYmV0d2VlbiB0d28gZGlzcGxheSBzdGFydAotKiAgICAgICAgICAgICAgIGFkZHJlc3NlcyBldmVyeSB2ZXJ0aWNhbCByZXRyYWNlLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKLQlyZWdzLnguYXggPSAweDRGMDc7Ci0JcmVncy54LmJ4ID0gMHgwMDA1OwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9kaXNhYmxlU3RlcmVvTW9kZSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZGlzYWJsZVN0ZXJlb01vZGUKLSogUmV0dXJuczogICAgICBUcnVlIGlmIHN0ZXJlbyBtb2RlIGRpc2FibGVkLCBmYWxzZSBpZiBub3Qgc3VwcG9ydGVkLgotKgotKiBEZXNjcmlwdGlvbjogIFB1dHMgdGhlIHN5c3RlbSBiYWNrIGludG8gbm9ybWFsLCBub24tc3RlcmVvIGRpc3BsYXkgbW9kZQotKiAgICAgICAgICAgICAgIGFmdGVyIGhhdmluZyBzdGVyZW8gbW9kZSBlbmFibGVkLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKLQlyZWdzLnguYXggPSAweDRGMDc7Ci0JcmVncy54LmJ4ID0gMHgwMDA2OwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXRTdGVyZW9EaXNwbGF5U3RhcnQodWxvbmcgbGVmdEFkZHIsdWxvbmcgcmlnaHRBZGRyLAotICAgIGlib29sIHdhaXRWUlQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXRTdGVyZW9EaXNwbGF5U3RhcnQKLSogUGFyYW1ldGVyczogICBsZWZ0QWRkciAgICAtIDMyLWJpdCBzdGFydCBhZGRyZXNzIGZvciBsZWZ0IGltYWdlCi0qICAgICAgICAgICAgICAgcmlnaHRBZGRyICAgLSAzMi1iaXQgc3RhcnQgYWRkcmVzcyBmb3IgcmlnaHQgaW1hZ2UKLSogICAgICAgICAgICAgICB3YWl0VlJUICAgICAtIFRydWUgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSwgZmFsc2UgaWYgbm90Ci0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgbm90IHN1cHBvcnRlZC4KLSoKLSogRGVzY3JpcHRpb246ICBTZXRzIHRoZSBuZXcgc3RhcnRpbmcgZGlzcGxheSBwb3NpdGlvbiB0byB0aGUgc3BlY2lmaWVkCi0qICAgICAgICAgICAgICAgMzItYml0IGRpc3BsYXkgc3RhcnQgYWRkcmVzcy4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLSogICAgICAgICAgICAgICBkaWZmZXJlbnQgdGhlIHRoZSB2ZXJzaW9uIGFib3ZlLCBzaW5jZSBpdCB0YWtlcyBhIDMyLWJpdAotKiAgICAgICAgICAgICAgIGJ5dGUgb2Zmc2V0IGluIHZpZGVvIG1lbW9yeSBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyB3aGljaAotKiAgICAgICAgICAgICAgIGdpdmVzIHRoZSBwcm9ncmFtbWVyIG1heGltdW0gY29udHJvbCBvdmVyIHRoZSBzdGF0IGFkZHJlc3MuCi0qCi0qICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgewotCXJlZ3MueC5heCA9IDB4NEYwNzsKLQlyZWdzLnguYnggPSB3YWl0VlJUID8gMHg4MyA6IDB4MDM7Ci0JcmVncy5lLmVjeCA9IGxlZnRBZGRyOwotCXJlZ3MuZS5lZHggPSByaWdodEFkZHI7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi11bG9uZyBWQkVBUEkgVkJFX2dldENsb3Nlc3RDbG9jayh1c2hvcnQgbW9kZSx1bG9uZyBwaXhlbENsb2NrKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0Q2xvc2VzdENsb2NrCi0qIFBhcmFtZXRlcnM6ICAgbW9kZSAgICAgICAgLSBWQkUgbW9kZSB0byBiZSB1c2VkIChpbmNsdWRlIHZiZUxpbmVhckJ1ZmZlcikKLSogICAgICAgICAgICAgICBwaXhlbENsb2NrICAtIERlc2lyZWQgcGl4ZWwgY2xvY2sKLSogUmV0dXJuczogICAgICBDbG9zZXN0IHBpeGVsIGNsb2NrIHRvIGRlc2lyZWQgY2xvY2sgKC0xIGlmIG5vdCBzdXBwb3J0ZWQpCi0qCi0qIERlc2NyaXB0aW9uOiAgQ2FsbHMgdGhlIFZCRS9Db3JlIDMuMCBpbnRlcmZhY2UgdG8gZGV0ZXJtaW5lIHRoZSBjbG9zZXN0Ci0qICAgICAgICAgICAgICAgcGl4ZWwgY2xvY2sgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZS4gVGhlIEJJT1Mgd2lsbCBhbHdheXMKLSogICAgICAgICAgICAgICBzZWFyY2ggZm9yIGEgcGl4ZWwgY2xvY2sgdGhhdCBpcyBubyBtb3JlIHRoYW4gMSUgYmVsb3cgdGhlCi0qICAgICAgICAgICAgICAgcmVxdWVzdGVkIGNsb2NrIG9yIHNvbWV3aGVyZSBoaWdoZXIgdGhhbiB0aGUgY2xvY2suIElmIHRoZQotKiAgICAgICAgICAgICAgIGNsb2NrIGlzIGhpZ2hlciBub3RlIHRoYXQgaXQgbWF5IHdlbGwgYmUgbWFueSBNaHogaGlnaGVyCi0qICAgICAgICAgICAgICAgdGhhdCByZXF1ZXN0ZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGhhdmUgdG8gY2hlY2sgdGhhdAotKiAgICAgICAgICAgICAgIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdWl0YWJsZSBmb3IgaXQncyBuZWVkcy4gVGhpcyBmdW5jdGlvbgotKiAgICAgICAgICAgICAgIHJldHVybnMgdGhlIGFjdHVhbCBwaXhlbCBjbG9jayB0aGF0IHdpbGwgYmUgcHJvZ3JhbW1lZCBieQotKiAgICAgICAgICAgICAgIHRoZSBoYXJkd2FyZS4KLSoKLSogICAgICAgICAgICAgICBOb3RlIHRoYXQgaWYgdGhlIHBpeGVsIGNsb2NrIHdpbGwgYmUgdXNlZCB3aXRoIGEgbGluZWFyCi0qICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgbW9kZSwgbWFrZSBzdXJlIHlvdSBwYXNzIGluIHRoZSBsaW5lYXIKLSogICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciBmbGFnIHRvIHRoaXMgZnVuY3Rpb24uCi0qCi0qICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgewotCXJlZ3MueC5heCA9IDB4NEYwQjsKLQlyZWdzLmguYmwgPSAweDAwOwotCXJlZ3MuZS5lY3ggPSBwaXhlbENsb2NrOwotCXJlZ3MueC5keCA9IG1vZGU7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JaWYgKHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUykKLQkgICAgcmV0dXJuIHJlZ3MuZS5lY3g7Ci0JfQotICAgIHJldHVybiAtMTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXREQUNXaWR0aChpbnQgd2lkdGgpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXREQUNXaWR0aAotKiBQYXJhbWV0ZXJzOiAgIHdpZHRoICAgLSBXaWR0aCB0byBzZXQgdGhlIERBQyB0bwotKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDg7Ci0gICAgcmVncy5oLmJsID0gMHgwMDsKLSAgICByZWdzLmguYmggPSB3aWR0aDsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi1pbnQgVkJFQVBJIFZCRV9nZXREQUNXaWR0aCh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0REFDV2lkdGgKLSogUmV0dXJuczogICAgICBDdXJyZW50IHdpZHRoIG9mIHRoZSBwYWxldHRlIERBQwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDg7Ci0gICAgcmVncy5oLmJsID0gMHgwMTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICBpZiAocmVncy54LmF4ICE9IFZCRV9TVUNDRVNTKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gcmVncy5oLmJoOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX3NldFBhbGV0dGUoaW50IHN0YXJ0LGludCBudW0sVkJFX3BhbGV0dGUgKnBhbCxpYm9vbCB3YWl0VlJUKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0UGFsZXR0ZQotKiBQYXJhbWV0ZXJzOiAgIHN0YXJ0ICAgLSBTdGFydGluZyBwYWxldHRlIGluZGV4IHRvIHByb2dyYW0KLSogICAgICAgICAgICAgICBudW0gICAgIC0gTnVtYmVyIG9mIHBhbGV0dGUgaW5kZXhlcyB0byBwcm9ncmFtCi0qICAgICAgICAgICAgICAgcGFsICAgICAtIFBhbGV0dGUgYnVmZmVyIGNvbnRhaW5pbmcgdmFsdWVzCi0qICAgICAgICAgICAgICAgd2FpdFZSVCAtIFdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UgZmxhZwotKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQotKgotKiBEZXNjcmlwdGlvbjogIFNldHMgYSBibG9jayBvZiBwYWxldHRlIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBWQkUgMi4wCi0qICAgICAgICAgICAgICAgQklPUy4gVGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgb24gVkJFIDEuMiBpbXBsZW1lbnRhdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwOTsKLSAgICByZWdzLmguYmwgPSB3YWl0VlJUID8gMHg4MCA6IDB4MDA7Ci0gICAgcmVncy54LmN4ID0gbnVtOwotICAgIHJlZ3MueC5keCA9IHN0YXJ0OwotICAgIFZCRV9jYWxsRVNESSgmcmVncywgcGFsLCBzaXplb2YoVkJFX3BhbGV0dGUpICogbnVtKTsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRCYW5rZWRQb2ludGVyKFZCRV9tb2RlSW5mbyAqbW9kZUluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRCYW5rZWRQb2ludGVyCi0qIFBhcmFtZXRlcnM6ICAgbW9kZUluZm8gICAgLSBNb2RlIGluZm8gYmxvY2sgZm9yIHZpZGVvIG1vZGUKLSogUmV0dXJuczogICAgICBTZWxlY3RvciB0byB0aGUgbGluZWFyIGZyYW1lYnVmZmVyICgwIG9uIGZhaWx1cmUpCi0qCi0qIERlc2NyaXB0aW9uOiAgUmV0dXJucyBhIG5lYXIgcG9pbnRlciB0byB0aGUgVkdBIGZyYW1lYnVmZmVyIGFyZWEuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIC8qIFdlIGp1c3QgbWFwIHRoZSBwb2ludGVyIGV2ZXJ5IHRpbWUsIHNpbmNlIHRoZSBwb2ludGVyIHdpbGwgYWx3YXlzCi0gICAgICogYmUgaW4gcmVhbCBtb2RlIG1lbW9yeSwgc28gd2Ugd29udCBhY3R1YWxseSBiZSBtYXBwaW5nIGFueSByZWFsCi0gICAgICogbWVtb3J5LgotICAgICAqCi0gICAgICogTk9URTogV2UgY2Fubm90IGN1cnJlbnRseSBtYXAgYSBuZWFyIHBvaW50ZXIgdG8gdGhlIGJhbmtlZCBmcmFtZQotICAgICAqICAgICAgIGJ1ZmZlciBmb3IgV2F0Y29tIFdpbjM4Niwgc28gd2UgY3JlYXRlIGEgMTY6MTYgZmFyIHBvaW50ZXIgdG8KLSAgICAgKiAgICAgICB0aGUgdmlkZW8gbWVtb3J5LiBBbGwgdGhlIGFzc2VtYmxlciBjb2RlIHdpbGwgcmVuZGVyIHRvIHRoZQotICAgICAqICAgICAgIHZpZGVvIG1lbW9yeSBieSBsb2FkaW5nIHRoZSBzZWxlY3RvciByYXRoZXIgdGhhbiB1c2luZyBhCi0gICAgICogICAgICAgbmVhciBwb2ludGVyLgotICAgICAqLwotICAgIHVsb25nIHNlZyA9ICh1c2hvcnQpbW9kZUluZm8tPldpbkFTZWdtZW50OwotICAgIGlmIChzZWcgIT0gMCkgewotCWlmIChzZWcgPT0gMHhBMDAwKQotCSAgICByZXR1cm4gKHZvaWQqKVBNX2dldEEwMDAwUG9pbnRlcigpOwotCWVsc2UKLQkgICAgcmV0dXJuICh2b2lkKilQTV9tYXBQaHlzaWNhbEFkZHIoc2VnIDw8IDQsMHhGRkZGLHRydWUpOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2lmbmRlZiBSRUFMTU9ERQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRMaW5lYXJQb2ludGVyKFZCRV9tb2RlSW5mbyAqbW9kZUluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRMaW5lYXJQb2ludGVyCi0qIFBhcmFtZXRlcnM6ICAgbW9kZUluZm8gICAgLSBNb2RlIGluZm8gYmxvY2sgZm9yIHZpZGVvIG1vZGUKLSogUmV0dXJuczogICAgICBTZWxlY3RvciB0byB0aGUgbGluZWFyIGZyYW1lYnVmZmVyICgwIG9uIGZhaWx1cmUpCi0qCi0qIERlc2NyaXB0aW9uOiAgUmV0dXJucyBhIG5lYXIgcG9pbnRlciB0byB0aGUgbGluZWFyIGZyYW1lYnVmZmVyIGZvciB0aGUgdmlkZW8KLSogICAgICAgICAgICAgICBtb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBzdGF0aWMgdWxvbmcgcGh5c1B0cltNQVhfTElOX1BUUlNdID0gezB9OwotICAgIHN0YXRpYyB2b2lkICpsaW5QdHJbTUFYX0xJTl9QVFJTXSA9IHswfTsKLSAgICBzdGF0aWMgaW50IG51bVB0cnMgPSAwOwotICAgIGludCBpOwotCi0gICAgLyogU2VhcmNoIGZvciBhbiBhbHJlYWR5IG1hcHBlZCBwb2ludGVyICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bVB0cnM7IGkrKykgewotCWlmIChwaHlzUHRyW2ldID09IG1vZGVJbmZvLT5QaHlzQmFzZVB0cikKLQkgICAgcmV0dXJuIGxpblB0cltpXTsKLQl9Ci0gICAgaWYgKG51bVB0cnMgPCBNQVhfTElOX1BUUlMpIHsKLQlwaHlzUHRyW251bVB0cnNdID0gbW9kZUluZm8tPlBoeXNCYXNlUHRyOwotCWxpblB0cltudW1QdHJzXSA9IFBNX21hcFBoeXNpY2FsQWRkcihtb2RlSW5mby0+UGh5c0Jhc2VQdHIsKHN0YXRlLT5WQkVNZW1vcnkgKiAxMDI0TCktMSx0cnVlKTsKLQlyZXR1cm4gbGluUHRyW251bVB0cnMrK107Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBJbml0UE1Db2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEluaXRQTUNvZGUgIC0gMzIgYml0IHByb3RlY3RlZCBtb2RlIHZlcnNpb24KLSoKLSogRGVzY3JpcHRpb246ICBGaW5kcyB0aGUgYWRkcmVzcyBvZiBhbmQgcmVsb2NhdGVzIHRoZSBwcm90ZWN0ZWQgbW9kZQotKiAgICAgICAgICAgICAgIGNvZGUgYmxvY2sgZnJvbSB0aGUgVkJFIDIuMCBpbnRvIGEgbG9jYWwgbWVtb3J5IGJsb2NrLiBUaGUKLSogICAgICAgICAgICAgICBtZW1vcnkgYmxvY2sgaXMgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkgYW5kIG11c3QgYmUgZnJlZWQKLSogICAgICAgICAgICAgICB3aXRoIFZCRV9mcmVlUE1Db2RlKCkgYWZ0ZXIgZ3JhcGhpY3MgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KLSoKLSogICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBidWZmZXIgX211c3RfIGJlIHJlY29waWVkIGFmdGVyIGVhY2ggbW9kZSBzZXQsCi0qICAgICAgICAgICAgICAgYXMgdGhlIHJvdXRpbmVzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZwotKiAgICAgICAgICAgICAgIHZpZGVvIG1vZGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgdWNoYXIgICAgICAgKmNvZGU7Ci0gICAgaW50ICAgICAgICAgcG1MZW47Ci0KLSAgICBpZiAoIXN0YXRlLT5wbUluZm8gJiYgc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgyMDApIHsKLQlyZWdzLnguYXggPSAweDRGMEE7Ci0JcmVncy54LmJ4ID0gMDsKLQlQTV9pbnQ4NngoMHgxMCwmcmVncywmcmVncywmc3JlZ3MpOwotCWlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JICAgIHJldHVybjsKLQlpZiAoVkJFX3NoYXJlZCkKLQkgICAgc3RhdGUtPnBtSW5mbyA9IFBNX21hbGxvY1NoYXJlZChyZWdzLnguY3gpOwotCWVsc2UKLQkgICAgc3RhdGUtPnBtSW5mbyA9IFBNX21hbGxvYyhyZWdzLnguY3gpOwotCWlmIChzdGF0ZS0+cG1JbmZvID09IE5VTEwpCi0JICAgIHJldHVybjsKLQlzdGF0ZS0+cG1JbmZvMzIgPSBzdGF0ZS0+cG1JbmZvOwotCXBtTGVuID0gcmVncy54LmN4OwotCi0JLyogUmVsb2NhdGUgdGhlIGJsb2NrIGludG8gb3VyIGxvY2FsIGRhdGEgc2VnbWVudCAqLwotCWNvZGUgPSBQTV9tYXBSZWFsUG9pbnRlcihzcmVncy5lcyxyZWdzLnguZGkpOwotCW1lbWNweShzdGF0ZS0+cG1JbmZvLGNvZGUscG1MZW4pOwotCi0JLyogTm93IGRvIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSBpbmZvcm1hdGlvbiB3ZSByZWNpZXZlIHRvIGVuc3VyZQotCSAqIHRoYXQgaXMgaXMgY29ycmVjdC4gU29tZSBCSU9TIHJldHVybiB0b3RhbGx5IGJvZ3VzIGluZm9ybWF0aW9uCi0JICogaW4gaGVyZSAoTWF0cm94IGlzIG9uZSkhIFVuZGVyIERPUyB0aGlzIHdvcmtzIE9LLCBidXQgdW5kZXIgT1MvMgotCSAqIHdlIGFyZSBzY3Jld2VkLgotCSAqLwotCWlmIChzdGF0ZS0+cG1JbmZvLT5zZXRXaW5kb3cgPj0gcG1MZW4gfHwKLQkgICAgc3RhdGUtPnBtSW5mby0+c2V0RGlzcGxheVN0YXJ0ID49IHBtTGVuIHx8Ci0JICAgIHN0YXRlLT5wbUluZm8tPnNldFBhbGV0dGUgPj0gcG1MZW4gfHwKLQkgICAgc3RhdGUtPnBtSW5mby0+SU9Qcml2SW5mbyA+PSBwbUxlbikgewotCSAgICBpZiAoVkJFX3NoYXJlZCkKLQkJUE1fZnJlZVNoYXJlZChzdGF0ZS0+cG1JbmZvKTsKLQkgICAgZWxzZQotCQlQTV9mcmVlKHN0YXRlLT5wbUluZm8pOwotCSAgICBzdGF0ZS0+cG1JbmZvMzIgPSBzdGF0ZS0+cG1JbmZvID0gTlVMTDsKLQkgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkvKiBSZWFkIHRoZSBJTyBwcml2ZWxlZGdlIGluZm8gYW5kIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvCi0JICogcGFzcyBhIHNlbGVjdG9yIHRvIE1NSU8gcmVnaXN0ZXJzIHRvIHRoZSBiYW5rIHN3aXRjaCBjb2RlLgotCSAqIFNpbmNlIHdlIG5vIGxvbmdlciBzdXBwb3J0IHNlbGVjdG9yIGFsbG9jYXRpb24sIHdlIG5vIGxvbmdlcgotCSAqIHN1cHBvcnQgdGhpcyBtZWNoYW5pc20gc28gd2UgZGlzYWJsZSB0aGUgcHJvdGVjdGVkIG1vZGUKLQkgKiBpbnRlcmZhY2UgaW4gdGhpcyBjYXNlLgotCSAqLwotCWlmIChzdGF0ZS0+cG1JbmZvLT5JT1ByaXZJbmZvICYmICFzdGF0ZS0+TU1JT1NlbCkgewotCSAgICB1c2hvcnQgKnAgPSAodXNob3J0KikoKHVjaGFyKilzdGF0ZS0+cG1JbmZvICsgc3RhdGUtPnBtSW5mby0+SU9Qcml2SW5mbyk7Ci0JICAgIHdoaWxlICgqcCAhPSAweEZGRkYpCi0JCXArKzsKLQkgICAgcCsrOwotCSAgICBpZiAoKnAgIT0gMHhGRkZGKQotCQlWQkVfZnJlZVBNQ29kZSgpOwotCSAgICB9Ci0JfQotfQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRTZXRCYW5rKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTZXRCYW5rCi0qIFJldHVybnM6ICAgICAgUG9pbnRlciB0byB0aGUgMzIgVkJFIDIuMCBiaXQgYmFuayBzd2l0Y2hpbmcgcm91dGluZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwKSB7Ci0JSW5pdFBNQ29kZSgpOwotCWlmIChzdGF0ZS0+cG1JbmZvKQotCSAgICByZXR1cm4gKHVjaGFyKilzdGF0ZS0+cG1JbmZvICsgc3RhdGUtPnBtSW5mby0+c2V0V2luZG93OwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFZCRUFQSSBWQkVfZ2V0U2V0RGlzcGxheVN0YXJ0KHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTZXREaXNwbGF5U3RhcnQKLSogUmV0dXJuczogICAgICBQb2ludGVyIHRvIHRoZSAzMiBWQkUgMi4wIGJpdCBDUlQgc3RhcnQgYWRkcmVzcyByb3V0aW5lLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgyMDApIHsKLQlJbml0UE1Db2RlKCk7Ci0JaWYgKHN0YXRlLT5wbUluZm8pCi0JICAgIHJldHVybiAodWNoYXIqKXN0YXRlLT5wbUluZm8gKyBzdGF0ZS0+cG1JbmZvLT5zZXREaXNwbGF5U3RhcnQ7Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRTZXRQYWxldHRlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTZXRQYWxldHRlCi0qIFJldHVybnM6ICAgICAgUG9pbnRlciB0byB0aGUgMzIgVkJFIDIuMCBiaXQgcGFsZXR0ZSBwcm9ncmFtbWluZyByb3V0aW5lLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgyMDApIHsKLQlJbml0UE1Db2RlKCk7Ci0JaWYgKHN0YXRlLT5wbUluZm8pCi0JICAgIHJldHVybiAodWNoYXIqKXN0YXRlLT5wbUluZm8gKyBzdGF0ZS0+cG1JbmZvLT5zZXRQYWxldHRlOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBWQkVBUEkgVkJFX2ZyZWVQTUNvZGUodm9pZCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2ZyZWVQTUNvZGUKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIHJvdXRpbmUgZnJlZXMgdGhlIHByb3RlY3RlZCBtb2RlIGNvZGUgYmxvY2tzIHRoYXQKLSogICAgICAgICAgICAgICB3ZSBjb3BpZWQgZnJvbSB0aGUgVkJFIDIuMCBpbnRlcmZhY2UuIFRoaXMgcm91dGluZSBtdXN0Ci0qICAgICAgICAgICAgICAgYmUgYWZ0ZXIgeW91IGhhdmUgZmluaXNoZWQgZ3JhcGhpY3MgcHJvY2Vzc2luZyB0byBmcmVlIHVwCi0qICAgICAgICAgICAgICAgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgcm91dGluZXMuIFRoaXMgaXMgbmVjZXNzYXJ5Ci0qICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgUE0gaW5mbyBtZW1vcnkgYmxvY2sgbXVzdCBiZSByZS1jb3BpZWQgYWZ0ZXIKLSogICAgICAgICAgICAgICBldmVyeSB2aWRlbyBtb2RlIHNldCBmcm9tIHRoZSBWQkUgMi4wIGltcGxlbWVudGF0aW9uLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoc3RhdGUtPnBtSW5mbykgewotCWlmIChWQkVfc2hhcmVkKQotCSAgICBQTV9mcmVlU2hhcmVkKHN0YXRlLT5wbUluZm8pOwotCWVsc2UKLQkgICAgUE1fZnJlZShzdGF0ZS0+cG1JbmZvKTsKLQlzdGF0ZS0+cG1JbmZvID0gTlVMTDsKLQlzdGF0ZS0+cG1JbmZvMzIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBWQkVBUEkgVkJFX3NoYXJlUE1Db2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zaGFyZVBNQ29kZQotKgotKiBEZXNjcmlwdGlvbjogIEVuYWJsZXMgaW50ZXJuYWwgc2hhcmluZyBvZiB0aGUgUE0gY29kZSBidWZmZXIgZm9yIE9TLzIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFZCRV9zaGFyZWQgPSB0cnVlOwotfQotCi0vKiBTZXQgb2YgY29kZSBzdHVicyB1c2VkIHRvIGJ1aWxkIHRoZSBmaW5hbCBiYW5rIHN3aXRjaCBjb2RlICovCi0KLSNkZWZpbmUgVkJFMjBfYWRqdXN0T2Zmc2V0ICA3Ci0KLXN0YXRpYyB1Y2hhciBWQkUyMEFfYmFua0Z1bmMzMl9TdGFydFtdID0gewotICAgIDB4NTMsMHg1MSwgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICBlYngsZWN4ICAgICAqLwotICAgIDB4OEIsMHhEMCwgICAgICAgICAgICAgICAgICAvKiAgbW92ICAgICBlZHgsZWF4ICAgICAqLwotICAgIDB4MzMsMHhEQiwgICAgICAgICAgICAgICAgICAvKiAgeG9yICAgICBlYngsZWJ4ICAgICAqLwotICAgIDB4QjEsMHgwMCwgICAgICAgICAgICAgICAgICAvKiAgbW92ICAgICBjbCwwICAgICAgICAqLwotICAgIDB4RDIsMHhFMiwgICAgICAgICAgICAgICAgICAvKiAgc2hsICAgICBkbCxjbCAgICAgICAqLwotICAgIH07Ci0KLXN0YXRpYyB1Y2hhciBWQkUyMF9iYW5rRnVuYzMyX0VuZFtdID0gewotICAgIDB4NTksMHg1QiwgICAgICAgICAgICAgICAgICAvKiAgcG9wICAgICBlY3gsZWJ4ICAgICAqLwotICAgIH07Ci0KLXN0YXRpYyB1Y2hhciBiYW5rRnVuYzMyWzEwMF07Ci0KLSNkZWZpbmUgY29weShwLGIsYSkgbWVtY3B5KGIsYSxzaXplb2YoYSkpOyAocCkgPSAoYikgKyBzaXplb2YoYSkKLQotaWJvb2wgVkJFQVBJIFZCRV9nZXRCYW5rRnVuYzMyKGludCAqY29kZUxlbix2b2lkICoqYmFua0Z1bmMsaW50IGR1YWxCYW5rcywKLSAgICBpbnQgYmFua0FkanVzdCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldEJhbmtGdW5jMzIKLSogUGFyYW1ldGVyczogICBjb2RlTGVuICAgICAtIFBsYWNlIHRvIHN0b3JlIGxlbmd0aCBvZiBjb2RlCi0qICAgICAgICAgICAgICAgYmFua0Z1bmMgICAgLSBQbGFjZSB0byBzdG9yZSBwb2ludGVyIHRvIGJhbmsgc3dpdGNoIGNvZGUKLSogICAgICAgICAgICAgICBkdWFsQmFua3MgICAtIFRydWUgaWYgZHVhbCBiYW5rcyBhcmUgaW4gZWZmZWN0Ci0qICAgICAgICAgICAgICAgYmFua0FkanVzdCAgLSBCYW5rIHNoaWZ0IGFkanVzdG1lbnQgZmFjdG9yCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBub3QgY29tcGF0aWJsZS4KLSoKLSogRGVzY3JpcHRpb246ICBDcmVhdGVzIGEgbG9jYWwgMzIgYml0IGJhbmsgc3dpdGNoIGZ1bmN0aW9uIGZyb20gdGhlCi0qICAgICAgICAgICAgICAgVkJFIDIuMCBiYW5rIHN3aXRjaCBjb2RlIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQotKiAgICAgICAgICAgICAgIHZpcnR1YWwgZmxhdCBmcmFtZWJ1ZmZlciBkZXZpY2VzIChkb2VzIG5vdCBoYXZlIGEgcmV0dXJuCi0qICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gYXQgdGhlIGVuZCBhbmQgdGFrZXMgdGhlIGJhbmsgbnVtYmVyIGluIEVBWAotKiAgICAgICAgICAgICAgIG5vdCBFRFgpLiBOb3RlIHRoYXQgdGhpcyAzMiBiaXQgY29kZSBjYW5ub3QgaW5jbHVkZSBpbnQgMTBoCi0qICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgVkJFIDIuMAotKiAgICAgICAgICAgICAgIG9yIGxhdGVyLgotKgotKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgMzIgYml0Ci0qICAgICAgICAgICAgICAgYmFuayBzd2l0Y2ggZnVuY3Rpb24sIHdoaWNoIHRoZSBzdGFuZGFyZCBWQkUgMi4wIHNwZWMKLSogICAgICAgICAgICAgICBkb2VzIG5vdCBwcm92aWRlLiBJbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgd2UgaGF2ZQotKiAgICAgICAgICAgICAgIGV4dGVuZGVkIHRoZSBWQkUgMi4wIHN0YXRlLT5wbUluZm8gc3RydWN0dXJlIGluIFVuaVZCRSA1LjIgaW4gYQotKiAgICAgICAgICAgICAgIHdheSB0byBzdXBwb3J0IHRoaXMsIGFuZCB3ZSBob3BlIHRoYXQgdGhpcyB3aWxsIGJlY29tZQotKiAgICAgICAgICAgICAgIGEgVkJFIDIuMCBhbW1lbmRtZW50LgotKgotKiAgICAgICAgICAgICAgIE5vdGUgYWxzbyB0aGF0IHdlIGNhbm5vdCBydW4gdGhlIGxpbmVhciBmcmFtZWJ1ZmZlcgotKiAgICAgICAgICAgICAgIGVtdWxhdGlvbiBjb2RlIHdpdGggYmFuayBzd2l0Y2hpbmcgcm91dGluZXMgdGhhdCByZXF1aXJlCi0qICAgICAgICAgICAgICAgYSBzZWxlY3RvciB0byB0aGUgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgcGFzc2VkIGluIEVTLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpbnQgICAgIGxlbjsKLSAgICB1Y2hhciAgICpjb2RlOwotICAgIHVjaGFyICAgKnA7Ci0KLSAgICBJbml0UE1Db2RlKCk7Ci0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwICYmIHN0YXRlLT5wbUluZm8zMiAmJiAhc3RhdGUtPk1NSU9TZWwpIHsKLQljb2RlID0gKHVjaGFyKilzdGF0ZS0+cG1JbmZvMzIgKyBzdGF0ZS0+cG1JbmZvMzItPnNldFdpbmRvdzsKLQlpZiAoc3RhdGUtPnBtSW5mbzMyLT5leHRlbnNpb25TaWcgPT0gVkJFMjBfRVhUX1NJRykKLQkgICAgbGVuID0gc3RhdGUtPnBtSW5mbzMyLT5zZXRXaW5kb3dMZW4tMTsKLQllbHNlIHsKLQkgICAgLyogV2UgYXJlIHJ1bm5pbmcgb24gYSBzeXN0ZW0gd2l0aG91dCB0aGUgVW5pVkJFIDUuMiBleHRlbnNpb24uCi0JICAgICAqIFdlIGRvIGFzIGJlc3Qgd2UgY2FuIGJ5IHNjYW5uaW5nIHRocm91Z2ggdGhlIGNvZGUgZm9yIHRoZQotCSAgICAgKiByZXQgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGguIFRoaXMgaXMgbm90IGZvb2xwcm9vZiwKLQkgICAgICogYnV0IGlzIHRoZSBiZXN0IHdlIGNhbiBkby4KLQkgICAgICovCi0JICAgIHAgPSBjb2RlOwotCSAgICB3aGlsZSAoKnAgIT0gMHhDMykKLQkJcCsrOwotCSAgICBsZW4gPSBwIC0gY29kZTsKLQkgICAgfQotCWlmICgobGVuICsgc2l6ZW9mKFZCRTIwQV9iYW5rRnVuYzMyX1N0YXJ0KSArIHNpemVvZihWQkUyMF9iYW5rRnVuYzMyX0VuZCkpID4gc2l6ZW9mKGJhbmtGdW5jMzIpKQotCSAgICBQTV9mYXRhbEVycm9yKCIzMi1iaXQgYmFuayBzd2l0Y2ggZnVuY3Rpb24gdG9vIGxvbmchIik7Ci0JY29weShwLGJhbmtGdW5jMzIsVkJFMjBBX2JhbmtGdW5jMzJfU3RhcnQpOwotCW1lbWNweShwLGNvZGUsbGVuKTsKLQlwICs9IGxlbjsKLQljb3B5KHAscCxWQkUyMF9iYW5rRnVuYzMyX0VuZCk7Ci0JKmNvZGVMZW4gPSBwIC0gYmFua0Z1bmMzMjsKLQliYW5rRnVuYzMyW1ZCRTIwX2FkanVzdE9mZnNldF0gPSAodWNoYXIpYmFua0FkanVzdDsKLQkqYmFua0Z1bmMgPSBiYW5rRnVuYzMyOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzYWZlMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogICoqKiBUT0RPOiBBREQgWU9VUiBPUyBFTlZJUk9OTUVOVCBOQU1FIEhFUkUgKioqCi0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyB0byBtZWFzdXJlIHRoZQotKiAgICAgICAgICAgICAgIENQVSBmcmVxdWVuY3kuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8T1MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbmNyZWFzZSB0aGUgdGhyZWFkIHByaW9yaXR5IHRvIG1heGltdW0sIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgU2V0TWF4VGhyZWFkUHJpb3JpdHkodm9pZCkKLXsKLSAgICB0aHJlYWRfaWQgdGhpZCA9IGZpbmRfdGhyZWFkKE5VTEwpOwotICAgIHRocmVhZF9pbmZvIHRpbmZvOwotICAgIGdldF90aHJlYWRfaW5mbyh0aGlkLCAmdGluZm8pOwotICAgIHNldF90aHJlYWRfcHJpb3JpdHkodGhpZCwgQl9SRUFMX1RJTUVfUFJJT1JJVFkpOwotICAgIHJldHVybiB0aW5mby5wcmlvcml0eTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHJlYWQgcHJpb3JpdHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVzdG9yZVRocmVhZFByaW9yaXR5KAotICAgIGludCBwcmlvcml0eSkKLXsKLSAgICB0aHJlYWRfaWQgdGhpZCA9IGZpbmRfdGhyZWFkKE5VTEwpOwotICAgIHNldF90aHJlYWRfcHJpb3JpdHkodGhpZCwgcHJpb3JpdHkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlciBpbiBoZXJlLiBZb3Ugc2hvdWxkIHRyeSB0byAqLwotICAgIC8qICAgICAgIG5vcm1hbGlzZSB0aGlzIHZhbHVlIHRvIGJlIGFyb3VuZCAxMDAsMDAwIHRpY2tzIHBlciBzZWNvbmQuICovCi0gICAgZnJlcS0+bG93ID0gMTAwMDAwMDsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0KLVRPRE86IEltcGxlbWVudCB0aGlzIHRvIHJlYWQgdGhlIGNvdW50ZXIuIEl0IHNob3VsZCBiZSBkb25lIGFzIGEgbWFjcm8KLSAgICAgIGZvciBhY2N1cmFjeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgeyAqKChiaWd0aW1lX3QqKSB0KSA9IHN5c3RlbV90aW1lKCk7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjNmMwYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQmVPUwotKgotKiBEZXNjcmlwdGlvbjogIEJlT1MgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgbm9uLURPUyBzeXN0ZW1zICovCi0jZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKLSNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKLQotUkVNQVJLUzoKLVRoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCi10aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIHlvdXIgT1MhICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBhcHBsaWNhdGlvbiBtZXNzYWdlIHF1ZXVlIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZWFkIGFsbCBrZXlib2FyZCBhbmQgbW91c2UgKi8KLSAgICAvKiAgICAgICBldmVudHMgZnJvbSB0aGUgT1Mgc3BlY2lmaWMgZXZlbnQgcXVldWUsIHRyYW5zbGF0ZSB0aGVtIGFuZCBwb3N0ICovCi0gICAgLyogICAgICAgdGhlbSBpbnRvIHRoZSBTY2lUZWNoIGV2ZW50IHF1ZXVlLiAqLwotICAgIC8qICovCi0gICAgLyogTk9URTogVGhlcmUgYXJlIGEgY291cGxlIG9mIGltcG9ydGFudCB0aGluZ3MgdGhhdCB0aGlzIGZ1bmN0aW9uIG11c3QgKi8KLSAgICAvKiAgICAgICB0YWtlIGNhcmUgb2Y6ICovCi0gICAgLyogKi8KLSAgICAvKiAgMS4gU3VwcG9ydCBmb3IgS0VZRE9XTiwgS0VZUkVQRUFUIGFuZCBLRVlVUCBpcyByZXF1aXJlZC4gKi8KLSAgICAvKiAqLwotICAgIC8qICAyLiBTdXBwb3J0IGZvciByZWFkaW5nIGhhcmR3YXJlIHNjYW4gY29kZSBhcyB3ZWxsIGFzIEFTQ0lJICovCi0gICAgLyogICAgIHRyYW5zbGF0ZWQgdmFsdWVzIGlzIHJlcXVpcmVkLiBHYW1lcyB1c2UgdGhlIHNjYW4gY29kZXMgcmF0aGVyICovCi0gICAgLyogICAgIHRoYW4gQVNDSUkgdmFsdWVzLiBTY2FuIGNvZGVzIGdvIGludG8gdGhlIGhpZ2ggb3JkZXIgYnl0ZSBvZiB0aGUgKi8KLSAgICAvKiAgICAga2V5Ym9hcmQgbWVzc2FnZSBmaWVsZC4gKi8KLSAgICAvKiAqLwotICAgIC8qICAzLiBTdXBwb3J0IGZvciBhdCBsZWFzdCByZWFkaW5nIG1vdXNlIG1vdGlvbiBkYXRhIChtaWNrZXlzKSBmcm9tIHRoZSAqLwotICAgIC8qICAgICBtb3VzZSBpcyByZXF1aXJlZC4gVXNpbmcgdGhlIG1pY2tleSB2YWx1ZXMsIHdlIGNhbiB0aGVuIHRyYW5zbGF0ZSAqLwotICAgIC8qICAgICB0byBtb3VzZSBjdXJzb3IgY29vcmRpbmF0ZXMgc2NhbGVkIHRvIHRoZSByYW5nZSBvZiB0aGUgY3VycmVudCAqLwotICAgIC8qICAgICBncmFwaGljcyBkaXNwbGF5IG1vZGUuIE1vdXNlIHZhbHVlcyBhcmUgc2NhbGVkIGJhc2VkIG9uIHRoZSAqLwotICAgIC8qICAgICBnbG9iYWwgJ3JhbmdlWCcgYW5kICdyYW5nZVknLiAqLwotICAgIC8qICovCi0gICAgLyogIDQuIFN1cHBvcnQgZm9yIGEgdGltZXN0YW1wIGZvciB0aGUgZXZlbnRzIGlzIHJlcXVpcmVkLCB3aGljaCBpcyAqLwotICAgIC8qICAgICBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHNvbWUgZXZlbnQgKHVzdWFsbHkgKi8KLSAgICAvKiAgICAgc3lzdGVtIHN0YXJ0dXApLiBUaGlzIGlzIHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQgKi8KLSAgICAvKiAgICAgKGllOiBhdCBpbnRlcnJ1cHQgdGltZSkgbm90IHdoZW4gaXQgd2FzIHN0dWZmIGludG8gdGhlIFNjaVRlY2ggKi8KLSAgICAvKiAgICAgZXZlbnQgcXVldWUuICovCi0gICAgLyogKi8KLSAgICAvKiAgNS4gU3VwcG9ydCBmb3IgbW91c2UgZG91YmxlIGNsaWNrIGV2ZW50cy4gSWYgdGhlIE9TIGhhcyBhIG5hdGl2ZSAqLwotICAgIC8qICAgICBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lIHRoaXMsIGl0IHNob3VsZCBiZSB1c2VkLiBPdGhlcndpc2UgdGhlICovCi0gICAgLyogICAgIHRpbWUgc3RhbXAgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmljIGV2ZW50IGNvZGUgKi8KLSAgICAvKiAgICAgdG8gZ2VuZXJhdGUgZG91YmxlIGNsaWNrIGV2ZW50cy4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBfbW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSAgICAvKiBUT0RPOiBEbyBhbnkgT1Mgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gaGVyZSAqLwotCi0gICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3Igbm9uIERPUyBzeXN0ZW1zICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0gICAgLyogVE9ETzogRG8gYW55IE9TIHNwZWNpZmljIGNsZWFudXAgaW4gaGVyZSAqLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDNkNzNlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3Mvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEJlT1MKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBpcyB3aGVyZSB5b3UgaW5jbHVkZSBPUyBzcGVjaWZpYyBoZWFkZXJzIGZvciB0aGUgZXZlbnQgaGFuZGxpbmcgKi8KLS8qIGxpYnJhcnkuICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2IxYjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEJlT1MKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qIFRPRE86IEluY2x1ZGUgYW55IEJlT1Mgc3BlY2lmaWMgaGVhZGVycyBoZXJlISAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIC8qIFRPRE86IERvIGFueSBpbml0aWFsaXNhdGlvbiBpbiBoZXJlLiBUaGlzIGluY2x1ZGVzIGdldHRpbmcgSU9QTCAqLwotICAgIC8qICAgICAgIGFjY2VzcyBmb3IgdGhlIHByb2Nlc3MgY2FsbGluZyBQTV9pbml0LiBUaGlzIHdpbGwgZ2V0IGNhbGxlZCAqLwotICAgIC8qICAgICAgIG1vcmUgdGhhbiBvbmNlLiAqLwotCi0gICAgLyogVE9ETzogSWYgeW91IHN1cHBvcnQgdGhlIHN1cHBsaWVkIE1UUlIgcmVnaXN0ZXIgc3R1ZmYgKHlvdSBuZWVkIHRvICovCi0gICAgLyogICAgICAgYmUgYXQgcmluZyAwIGZvciB0aGlzISksIHlvdSBzaG91bGQgaW5pdGlhbGlzZSBpdCBpbiBoZXJlLiAqLwotCi0vKiBNVFJSX2luaXQoKTsgKi8KLX0KLQotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsgcmV0dXJuIF9PU19CRU9TOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoteyByZXR1cm4gUE1fMzg2OyB9Ci0KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICcvJykgewotCXNbcG9zXSA9ICcvJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICAgLyogVE9ETzogSWYgeW91IGFyZSBydW5uaW5nIGluIGEgR1VJIGVudmlyb25tZW50IHdpdGhvdXQgYSBjb25zb2xlLCAqLwotICAgIC8qICAgICAgIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBicmluZyB1cCBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgKi8KLSAgICAvKiAgICAgICBib3ggYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4gKi8KLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7Ci0gICAgZXhpdCgxKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZikKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBmb3IgdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBrZXkgaXMgYXZhaWxhYmxlIHRvIGJlIHJlYWQuIFRoaXMgKi8KLSAgICAvKiAgICAgICBzaG91bGQgYmUgaW1wbGVtZW50ZWQsIGJ1dCBpcyBtb3N0bHkgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcyAqLwotICAgIC8qICAgICAgIHRoZXNlIGRheXMuICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIC8qIFRPRE86IFRoaXMgcmV0dXJucyB0aGUgQVNDSUkgY29kZSBvZiB0aGUga2V5IHByZXNzZWQuIFRoaXMgKi8KLSAgICAvKiAgICAgICBzaG91bGQgYmUgaW1wbGVtZW50ZWQsIGJ1dCBpcyBtb3N0bHkgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcyAqLwotICAgIC8qICAgICAgIHRoZXNlIGRheXMuICovCi0gICAgcmV0dXJuIDB4RDsKLX0KLQotaW50IFBNQVBJIFBNX29wZW5Db25zb2xlKHZvaWQpCi17Ci0gICAgLyogVE9ETzogT3BlbnMgdXAgYSBmdWxsc2NyZWVuIGNvbnNvbGUgZm9yIGdyYXBoaWNzIG91dHB1dC4gSWYgeW91ciAqLwotICAgIC8qICAgICAgIGNvbnNvbGUgZG9lcyBub3QgaGF2ZSBncmFwaGljcy90ZXh0IG1vZGVzLCB0aGlzIGNhbiBiZSBsZWZ0ICovCi0gICAgLyogICAgICAgZW1wdHkuIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBkaXNhYmxlIGNvbnNvbGUgc3dpdGNoaW5nICovCi0gICAgLyogICAgICAgd2hlbiBpbiBncmFwaGljcyBtb2RlcyBpZiB5b3UgY2FuIHN3aXRjaCBhd2F5IGZyb20gZnVsbHNjcmVlbiAqLwotICAgIC8qICAgICAgIGNvbnNvbGVzIChpZiB5b3Ugd2FudCB0byBhbGxvdyBzd2l0Y2hpbmcsIHRoaXMgY2FuIGJlIGRvbmUgKi8KLSAgICAvKiAgICAgICBlbHNld2hlcmUgd2l0aCBhIGZ1bGwgc2F2ZS9yZXN0b3JlIHN0YXRlIG9mIHRoZSBncmFwaGljcyBtb2RlKS4gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlIHN0YXRlIGJ1ZmZlciB1c2VkIHRvIHNhdmUgdGhlICovCi0gICAgLyogICAgICAgc3RhdGUgb2YgdGhlIGNvbnNvbGUgYmVmb3JlIGdvaW5nIGludG8gZ3JhcGhpY3MgbW9kZS4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLiAqLwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUodm9pZCAqc3RhdGVCdWYsaW50IGNvbnNvbGVfaWQpCi17Ci0gICAgLyogVE9ETzogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGludG8gdGhlIHN0YXRlIGJ1ZmZlci4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLiAqLwotICAgIC8qICAgICAgIFdlIHdpbGwgYWx3YXlzIHJlc3RvcmUgODB4MjUgdGV4dCBtb2RlIGFmdGVyIGJlaW5nIGluIGdyYXBoaWNzICovCi0gICAgLyogICAgICAgbW9kZSwgc28gaWYgcmVzdG9yaW5nIHRleHQgbW9kZSBpcyBhbGwgeW91IG5lZWQgdG8gZG8gdGhpcyBjYW4gKi8KLSAgICAvKiAgICAgICBiZSBsZWZ0IGVtcHR5LiAqLwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYsaW50IGNvbnNvbGVfaWQpCi17Ci0gICAgLyogVE9ETzogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgZnJvbSB0aGUgc3RhdGUgYnVmZmVyLiBUaGlzIGlzICovCi0gICAgLyogICAgICAgdXNlZCB0byByZXN0b3JlIHRoZSBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIHdoZW4gd2UgYXJlIGRvbmUuICovCi0gICAgLyogICAgICAgV2Ugd2lsbCBhbHdheXMgcmVzdG9yZSA4MHgyNSB0ZXh0IG1vZGUgYWZ0ZXIgYmVpbmcgaW4gZ3JhcGhpY3MgKi8KLSAgICAvKiAgICAgICBtb2RlLCBzbyBpZiByZXN0b3JpbmcgdGV4dCBtb2RlIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0aGlzIGNhbiAqLwotICAgIC8qICAgICAgIGJlIGxlZnQgZW1wdHkuICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKGludCBjb25zb2xlX2lkKQotewotICAgIC8qIFRPRE86IENsb3NlIHRoZSBjb25zb2xlIHdoZW4gd2UgYXJlIGRvbmUsIGdvaW5nIGJhY2sgdG8gdGV4dCBtb2RlLiAqLwotfQotCi12b2lkIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oaW50IHgsaW50IHkpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSBPUyBjb25zb2xlIGN1cnNvciBsb2NhdGlvbiB0byB0aGUgbmV3IHZhbHVlLiBUaGlzIGlzICovCi0gICAgLyogICAgICAgZ2VuZXJhbGx5IHVzZWQgZm9yIG5ldyBPUyBwb3J0cyAodXNlZCBtb3N0bHkgZm9yIERPUykuICovCi19Ci0KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIE9TIGNvbnNvbGUgc2NyZWVuIHdpZHRoLiBUaGlzIGlzIGdlbmVyYWxseSB1bnVzZWQgZm9yICovCi0gICAgLyogICAgICAgbmV3IE9TIHBvcnRzLiAqLwotfQotCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIGloLCBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEluc3RhbGwgYSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIuIE5vcm1hbGx5IHRoaXMgKi8KLSAgICAvKiAgICAgICB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgZnJvbSBtb3N0IE9TJ2VzIGluIHVzZXIgbGFuZCwgc28gYW4gKi8KLSAgICAvKiAgICAgICBhbHRlcm5hdGl2ZSBtZWNoYW5pc20gaXMgbmVlZGVkIHRvIGVuYWJsZSBzb2Z0d2FyZSBzdGVyZW8uICovCi0gICAgLyogICAgICAgSGVuY2UgbGVhdmUgdGhpcyB1bmltcGxlbWVudGVkIHVubGVzcyB5b3UgaGF2ZSBhIGhpZ2ggcHJpb3JpdHkgKi8KLSAgICAvKiAgICAgICBtZWNoYW5pc20gdG8gY2FsbCB0aGUgMzItYml0IGNhbGxiYWNrIHdoZW4gdGhlIHJlYWwgdGltZSBjbG9jayAqLwotICAgIC8qICAgICAgIGludGVycnVwdCBmaXJlcy4gKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBmcmVxdWVuY3kuIFVzZWQgZm9yIHN0ZXJlbyAqLwotICAgIC8qICAgICAgIExDIHNodXR0ZXIgZ2xhc3NlcyB3aGVuIGRvaW5nIHNvZnR3YXJlIHN0ZXJlby4gVXN1YWxseSBzZXRzICovCi0gICAgLyogICAgICAgdGhlIGZyZXF1ZW5jeSB0byBhcm91bmQgMjA0OCBIei4gKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXN0b3JlcyB0aGUgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIuICovCi19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17IHJldHVybiAnLyc7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoteyByZXR1cm4gUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKTsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBjaGFyICplbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3Vzci9saWIvbnVjbGV1cyI7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gYSB1bmlxdWUgSUQgZm9yIHRoZSBtYWNoaW5lLiBJZiBhIHVuaXF1ZSBJRCBpcyBub3QgKi8KLSAgICAvKiAgICAgICBhdmFpbGFibGUsIHJldHVybiB0aGUgbWFjaGluZSBuYW1lLiAqLwotICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOwotICAgIGdldGhvc3RuYW1lKGJ1ZiwgMTI4KTsKLSAgICByZXR1cm4gYnVmOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gdGhlIG5ldHdvcmsgbWFjaGluZSBuYW1lIGZvciB0aGUgbWFjaGluZS4gKi8KLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSAgICBnZXRob3N0bmFtZShidWYsIDEyOCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB2b2lkICpiYW5rUHRyOwotICAgIGlmICghYmFua1B0cikKLQliYW5rUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOwotICAgIHJldHVybiBiYW5rUHRyOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBtYXBzIGEgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgdG8gYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzIGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICovCi0KLSAgICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBhYmxlIHRvIGhhbmRsZSBhbnkgcGhzeWljYWwgYmFzZSAqLwotICAgIC8qICAgICAgIGFkZHJlc3MsIGFuZCBoZW5jZSB5b3Ugd2lsbCBoYXZlIHRvIGhhbmRsZSByb3VuZGluZyBvZiAqLwotICAgIC8qICAgICAgIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgdG8gYSBwYWdlIGJvdW5kYXJ5IChpZTogNEtiIG9uICovCi0gICAgLyogICAgICAgeDg2IENQVSdzKSB0byBiZSBhYmxlIHRvIHByb3Blcmx5IG1hcCBpbiB0aGUgbWVtb3J5ICovCi0gICAgLyogICAgICAgcmVnaW9uLiAqLwotCi0gICAgLyogTk9URTogSWYgcG9zc2libGUgdGhlIGlzQ2FjaGVkIGJpdCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgdGhhdCAqLwotICAgIC8qICAgICAgIHRoZSBQQ0QgKFBhZ2UgQ2FjaGUgRGlzYWJsZSkgYW5kIFBXVCAoUGFnZSBXcml0ZSBUaHJvdWdoKSAqLwotICAgIC8qICAgICAgIGJpdHMgYXJlIHNldCB0byBkaXNhYmxlIGNhY2hpbmcgZm9yIGEgbWVtb3J5IG1hcHBpbmcgdXNlZCAqLwotICAgIC8qICAgICAgIGZvciBNTUlPIHJlZ2lzdGVyIGFjY2Vzcy4gV2UgYWxzbyBkaXNhYmxlIGNhY2hpbmcgdXNpbmcgKi8KLSAgICAvKiAgICAgICB0aGUgTVRSUiByZWdpc3RlcnMgZm9yIFBlbnRpdW0gUHJvIGFuZCBsYXRlciBjaGlwc2V0cyBzbyBpZiAqLwotICAgIC8qICAgICAgIE1UUlIgc3VwcG9ydCBpcyBlbmFibGVkIGZvciB5b3VyIE9TIHRoZW4geW91IGNhbiBzYWZlbHkgaWdub3JlICovCi0gICAgLyogICAgICAgdGhlIGlzQ2FjaGVkIGZsYWcgYW5kIGFsd2F5cyBlbmFibGUgY2FjaGluZyBpbiB0aGUgcGFnZSAqLwotICAgIC8qICAgICAgIHRhYmxlcy4gKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIHByZXZpb3VzbHkgKi8KLSAgICAvKiAgICAgICBhbGxvY2F0ZWQgd2l0aCBQTV9tYXBQaHlzaWNhbEFkZHIoKSBpZiBhdCBhbGwgcG9zc2libGUuIElmICovCi0gICAgLyogICAgICAgeW91IGNhbid0IGZyZWUgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmdzLCBzaW1wbHkgZG8gbm90aGluZy4gKi8KLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciAqLwotICAgIC8qICAgICAgIGFkZHJlc3MuICovCi0gICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgLyogVE9ETzogUHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciBtaWxsaXNlY29uZHMgKi8KLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGlzIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gcHJvY2VzcyAqLwotICAgIC8qICAgICAgIHRoYXQgYWxsIGFjY2VzcyB0aGUgY29tbW9uIE51Y2xldXMgZHJpdmVycyB2aWEgYSBjb21tb24gZGlzcGxheSAqLwotICAgIC8qICAgICAgIGRyaXZlciBETEwuIElmIHlvdXIgT1MgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbWVtb3J5IChvciBpZiAqLwotICAgIC8qICAgICAgIHRoZSBkaXNwbGF5IGRyaXZlciBkb2VzIG5vdCBuZWVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgKi8KLSAgICAvKiAgICAgICBmb3IgZWFjaCBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UpLCB0aGlzIHNob3VsZCBqdXN0IGNhbGwgUE1fbWFsbG9jLiAqLwotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwdHIpCi17Ci0gICAgLyogVE9ETzogRnJlZSB0aGUgc2hhcmVkIG1lbW9yeSBibG9jay4gVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgY29udGV4dCAqLwotICAgIC8qICAgICAgIG9mIHRoZSBvcmlnaW5hbCBjYWxsaW5nIHByb2Nlc3MgdGhhdCBhbGxvY2F0ZWQgdGhlIHNoYXJlZCAqLwotICAgIC8qICAgICAgIG1lbW9yeSB3aXRoIFBNX21hbGxvY1NoYXJlZC4gU2ltcGx5IGNhbGwgZnJlZSBpZiB5b3UgZG8gbm90ICovCi0gICAgLyogICAgICAgbmVlZCB0aGlzLiAqLwotICAgIFBNX2ZyZWUocHRyKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYXAgYSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyAqLwotICAgIC8qICAgICAgIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyIGludG8gdGhlICovCi0gICAgLyogICAgICAgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiBJZiB0aGUgbWVtb3J5IG1hcHBpbmcgKi8KLSAgICAvKiAgICAgICBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyIGlzIGdsb2JhbCB0byBhbGwgcHJvY2Vzc2VzLCAqLwotICAgIC8qICAgICAgIHNpbXBseSByZXR1cm4gdGhlIHBvaW50ZXIuICovCi0gICAgcmV0dXJuIGJhc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLX0KLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotICAgIHJldHVybiAwOwotfQotCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotfQotCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQotewotICAgIC8qIFRPRE86IFJlcG9ydCB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnksIGJvdGggdGhlIGFtb3VudCBvZiAqLwotICAgIC8qICAgICAgIHBoeXNpY2FsIG1lbW9yeSBsZWZ0IGFuZCB0aGUgYW1vdW50IG9mIHZpcnR1YWwgbWVtb3J5IGxlZnQuICovCi0gICAgLyogICAgICAgSWYgdGhlIE9TIGRvZXMgbm90IHByb3ZpZGUgdGhlc2Ugc2VydmljZXMsIHJlcG9ydCAwJ3MuICovCi0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKHVpbnQgc2l6ZSx1bG9uZyAqcGh5c0FkZHIsaWJvb2wgY29udGlndW91cyxpYm9vbCBiZWxvdzE2TWVnKQotewotICAgIC8qIFRPRE86IEFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgb2YgdGhlIHNwZWNpZmllZCAqLwotICAgIC8qICAgICAgIHNpemUuIFRoaXMgaXMgdXNlZCBmb3IgYnVzIG1hc3RlciBvcGVyYXRpb25zLiBJZiB0aGlzIGlzIG5vdCAqLwotICAgIC8qICAgICAgIHN1cHBvcnRlZCBieSB0aGUgT1MsIHJldHVybiBOVUxMIGFuZCBidXMgbWFzdGVyaW5nIHdpbGwgbm90ICovCi0gICAgLyogICAgICAgYmUgdXNlZC4gKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKHZvaWQgKnAsdWludCBzaXplLGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgLyogVE9ETzogRnJlZSBhIG1lbW9yeSBibG9jayBhbGxvY2F0ZWQgd2l0aCBQTV9hbGxvY0xvY2tlZE1lbS4gKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQShpbnQgYmFuaykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQihpbnQgYmFuaykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi19Ci0KLWlib29sIFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSh1bG9uZyBiYXNlLHVsb25nIGxlbmd0aCx1aW50IHR5cGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZW5hYmxlIFBlbnRpdW0gUHJvIGFuZCBQZW50aXVtIElJIE1UUlIgKi8KLSAgICAvKiAgICAgICB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBwYXNzZWQgaW4gcGh5c2ljYWwgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIC8qICAgICAgIGFuZCBsZW5ndGguIE5vcm1hbGx5IHRoaXMgaXMgZG9uZSB2aWEgY2FsbHMgdG8gYW4gT1Mgc3BlY2lmaWMgKi8KLSAgICAvKiAgICAgICBkZXZpY2UgZHJpdmVyIGFzIHRoaXMgY2FuIG9ubHkgYmUgZG9uZSBhdCByaW5nIDAuICovCi0gICAgLyogKi8KLSAgICAvKiBOT1RFOiBUaGlzIGlzIGEgKnZlcnkqIGltcG9ydGFudCBmdW5jdGlvbiB0byBpbXBsZW1lbnQhIElmIHlvdSBkbyAqLwotICAgIC8qICAgICAgIG5vdCBpbXBsZW1lbnQsIGdyYXBoaWNzIHBlcmZvcm1hbmNlIG9uIHRoZSBsYXRlc3QgSW50ZWwgY2hpcHMgKi8KLSAgICAvKiAgICAgICB3aWxsIGJlIHNldmVybHkgaW1wYWlyZWQuIEZvciBzYW1wbGUgY29kZSB0aGF0IGNhbiBiZSB1c2VkICovCi0gICAgLyogICAgICAgZGlyZWN0bHkgaW4gYSByaW5nIDAgZGV2aWNlIGRyaXZlciwgc2VlIHRoZSBNU0RPUyBpbXBsZW1lbnRhdGlvbiAqLwotICAgIC8qICAgICAgIHdoaWNoIGluY2x1ZGVzIGFzc2VtYmxlciBjb2RlIHRvIGRvIHRoaXMgZGlyZWN0bHkgKGlmIHRoZSAqLwotICAgIC8qICAgICAgIHByb2dyYW0gaXMgcnVubmluZyBhdCByaW5nIDApLiAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCh1c2hvcnQgYXhWYWwsdWxvbmcgQklPU1BoeXNBZGRyLHZvaWQgKm1hcHBlZEJJT1MpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJ1biB0aGUgQklPUyBQT1NUIGNvZGUgb24gYSBzZWNvbmRhcnkgKi8KLSAgICAvKiAgICAgICBjb250cm9sbGVyIHRvIGluaXRpYWxpc2UgaXQgZm9yIHVzZS4gVGhpcyBpcyBub3QgbmVjZXNzYXJ5ICovCi0gICAgLyogICAgICAgZm9yIG11bHRpLWNvbnRyb2xsZXIgb3BlcmF0aW9uLCBidXQgaXQgd2lsbCBtYWtlIGl0IGEgbG90ICovCi0gICAgLyogICAgICAgbW9yZSBjb252ZW5pY2VudCBmb3IgZW5kIHVzZXJzIChvdGhlcndpc2UgdGhleSBoYXZlIHRvIGJvb3QgKi8KLSAgICAvKiAgICAgICB0aGUgc3lzdGVtIG9uY2Ugd2l0aCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXIgYXMgcHJpbWFyeSwgYW5kICovCi0gICAgLyogICAgICAgdGhlbiBib290IHdpdGggYm90aCBjb250cm9sbGVycyBpbnN0YWxsZWQpLiAqLwotICAgIC8qICovCi0gICAgLyogICAgICAgRXZlbiBpZiB5b3UgZG9uJ3Qgc3VwcG9ydCBmdWxsIEJJT1MgYWNjZXNzLCBpdCB3b3VsZCBiZSAqLwotICAgIC8qICAgICAgIGFkdmlzZWFibGUgdG8gYmUgYWJsZSB0byBQT1NUIHRoZSBzZWNvbmRhcnkgY29udHJvbGxlcnMgaW4gdGhlICovCi0gICAgLyogICAgICAgc3lzdGVtIHVzaW5nIHRoaXMgZnVuY3Rpb24gYXMgYSBtaW5pbXVtIHJlcXVpcmVtZW50LiBTb21lICovCi0gICAgLyogICAgICAgZ3JhcGhpY3MgaGFyZHdhcmUgaGFzIHJlZ2lzdGVycyB0aGF0IGNvbnRhaW4gdmFsdWVzIHRoYXQgb25seSAqLwotICAgIC8qICAgICAgIHRoZSBCSU9TIGtub3dzIGFib3V0LCB3aGljaCBtYWtlcyBicmluZyB1cCBhIGNhcmQgZnJvbSBjb2xkICovCi0gICAgLyogICAgICAgcmVzZXQgZGlmZmljdWx0IGlmIHRoZSBCSU9TIGhhcyBub3QgUE9TVCdlZCBpdC4gKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdWxvbmcgaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAodm9pZCloYW5kbGU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB1bG9uZyBoYW5kbGUpCi17Ci0gICAgKHZvaWQpaGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIGlmIChkcml2ZSA9PSAzKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgKHZvaWQpZHJpdmU7Ci0gICAgZ2V0Y3dkKGRpcixsZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBmaWxlICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpYXR0cmliOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzllZjJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7Ci0gICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKLSAgICBjb2RlTGVuID0gY29kZUxlbjsKLSAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI4YjczLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgKioqIFRPRE86IEFERCBZT1VSIE9TIEVOVklST05NRU5UIE5BTUUgSEVSRSAqKioKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1pUaW1lckluaXQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBEbyBhbnkgc3BlY2lmaWMgaW50ZXJuYWwgaW5pdGlhbGlzYXRpb24gaW4gaGVyZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0xaVGltZXJPbigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBTdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvIGlmICovCi0gICAgLyogICAgICAgcG9zc2libGUuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfTFpUaW1lckxhcCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBDb21wdXRlIHRoZSBsYXAgdGltZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWUgYW5kIHdoZW4gdGhlICovCi0gICAgLyogICAgICAgdGltZXIgd2FzIHN0YXJ0ZWQuICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RvcCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9MWlRpbWVyT2ZmKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIC8qIFRPRE86IFN0b3AgdGhlIHRpbWVyIGNvdW50aW5nLiBTaG91bGQgYmUgYSBtYWNybyBpZiBwb3NzaWJsZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCB0aW1pbmdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIC8qIFRPRE86IENvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBhbmQgcmV0dXJuIGl0LiBBbHdheXMgbWljcm9zZWNvbmRzLiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmVhZCB0aGUgbG9uZyBwZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MuIFRoZSByZXNvbHV0aW9uIG9mIHRoaXMgKi8KLSAgICAvKiAgICAgICB0aW1lciBzaG91bGQgYmUgYXJvdW5kIDEvMjAgb2YgYSBzZWNvbmQgZm9yIHRpbWluZyBsb25nICovCi0gICAgLyogICAgICAgcGVyaW9kcyBpZiBwb3NzaWJsZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29kZXBhZ2UvdXNfZW5nLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb2RlcGFnZS91c19lbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhODcxNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb2RlcGFnZS91c19lbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBLZXlib2FyZCB0cmFuc2xhdGlvbiBjb2RlIHBhZ2VzIGZvciBVUyBFbmdsaXNoIGtleWJvYXJkcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJldmVudC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIGFsbCBub3JtYWwga2V5IHRyYW5zbGF0aW9ucywgYW5kIGlzIHRoZSBmYWxsYmFjawotICogdGFibGUgaWYgdGhlIGtleSBpcyBub3QgZm91bmQgaW4gYW55IG9mIHRoZSBvdGhlciB0cmFuc2xhdGlvbiB0YWJsZXMuCi0gKiBJZiB0aGUgY29kZSBpcyBub3QgZm91bmQgaW4gdGhpcyB0YWJsZSwgdGhlIEFTQ0lJIGNvZGUgaXMgc2V0IHRvIDAgdG8KLSAqIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gQVNDSUkgY29kZSBlcXVpdmFsZW50IGZvciB0aGlzIGtleS4KLSAqLwotc3RhdGljIGNvZGVwYWdlX2VudHJ5X3QgVVNfbm9ybWFsW10gPSB7Ci0gICAgezB4MDEsICAweDFCfSwKLSAgICB7MHgwMiwgICcxJ30sCi0gICAgezB4MDMsICAnMid9LAotICAgIHsweDA0LCAgJzMnfSwKLSAgICB7MHgwNSwgICc0J30sCi0gICAgezB4MDYsICAnNSd9LAotICAgIHsweDA3LCAgJzYnfSwKLSAgICB7MHgwOCwgICc3J30sCi0gICAgezB4MDksICAnOCd9LAotICAgIHsweDBBLCAgJzknfSwKLSAgICB7MHgwQiwgICcwJ30sCi0gICAgezB4MEMsICAnLSd9LAotICAgIHsweDBELCAgJz0nfSwKLSAgICB7MHgwRSwgIDB4MDh9LAotICAgIHsweDBGLCAgMHgwOX0sCi0gICAgezB4MTAsICAncSd9LAotICAgIHsweDExLCAgJ3cnfSwKLSAgICB7MHgxMiwgICdlJ30sCi0gICAgezB4MTMsICAncid9LAotICAgIHsweDE0LCAgJ3QnfSwKLSAgICB7MHgxNSwgICd5J30sCi0gICAgezB4MTYsICAndSd9LAotICAgIHsweDE3LCAgJ2knfSwKLSAgICB7MHgxOCwgICdvJ30sCi0gICAgezB4MTksICAncCd9LAotICAgIHsweDFBLCAgJ1snfSwKLSAgICB7MHgxQiwgICddJ30sCi0gICAgezB4MUMsICAweDBEfSwKLSAgICB7MHgxRSwgICdhJ30sCi0gICAgezB4MUYsICAncyd9LAotICAgIHsweDIwLCAgJ2QnfSwKLSAgICB7MHgyMSwgICdmJ30sCi0gICAgezB4MjIsICAnZyd9LAotICAgIHsweDIzLCAgJ2gnfSwKLSAgICB7MHgyNCwgICdqJ30sCi0gICAgezB4MjUsICAnayd9LAotICAgIHsweDI2LCAgJ2wnfSwKLSAgICB7MHgyNywgICc7J30sCi0gICAgezB4MjgsICAnXCcnfSwKLSAgICB7MHgyOSwgICdgJ30sCi0gICAgezB4MkIsICAnXFwnfSwKLSAgICB7MHgyQywgICd6J30sCi0gICAgezB4MkQsICAneCd9LAotICAgIHsweDJFLCAgJ2MnfSwKLSAgICB7MHgyRiwgICd2J30sCi0gICAgezB4MzAsICAnYid9LAotICAgIHsweDMxLCAgJ24nfSwKLSAgICB7MHgzMiwgICdtJ30sCi0gICAgezB4MzMsICAnLCd9LAotICAgIHsweDM0LCAgJy4nfSwKLSAgICB7MHgzNSwgICcvJ30sCi0gICAgezB4MzcsICAnKid9LCAgICAgICAgICAgLyogS2V5cGFkICovCi0gICAgezB4MzksICAnICd9LAotICAgIHsweDRBLCAgJy0nfSwgICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIHsweDRFLCAgJysnfSwgICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIHsweDYwLCAgMHgwRH0sICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIHsweDYxLCAgJy8nfSwgICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIH07Ci0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3Igd2hlbiBDQVBTTE9DSyBpcyBhY3RpdmUgYW5kIHRoZSBzaGlmdCBvciBjdHJsCi0gKiBrZXlzIGFyZSBub3QgZG93bi4gSWYgdGhlIGNvZGUgaXMgbm90IGZvdW5kIGluIHRoaXMgdGFibGUsIHRoZSBub3JtYWwKLSAqIHRhYmxlIGFib3ZlIGlzIHRoZW4gc2VhcmNoZWQuCi0gKi8KLXN0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX2NhcHNbXSA9IHsKLSAgICB7MHgxMCwgICdRJ30sCi0gICAgezB4MTEsICAnVyd9LAotICAgIHsweDEyLCAgJ0UnfSwKLSAgICB7MHgxMywgICdSJ30sCi0gICAgezB4MTQsICAnVCd9LAotICAgIHsweDE1LCAgJ1knfSwKLSAgICB7MHgxNiwgICdVJ30sCi0gICAgezB4MTcsICAnSSd9LAotICAgIHsweDE4LCAgJ08nfSwKLSAgICB7MHgxOSwgICdQJ30sCi0gICAgezB4MUUsICAnQSd9LAotICAgIHsweDFGLCAgJ1MnfSwKLSAgICB7MHgyMCwgICdEJ30sCi0gICAgezB4MjEsICAnRid9LAotICAgIHsweDIyLCAgJ0cnfSwKLSAgICB7MHgyMywgICdIJ30sCi0gICAgezB4MjQsICAnSid9LAotICAgIHsweDI1LCAgJ0snfSwKLSAgICB7MHgyNiwgICdMJ30sCi0gICAgezB4MkMsICAnWid9LAotICAgIHsweDJELCAgJ1gnfSwKLSAgICB7MHgyRSwgICdDJ30sCi0gICAgezB4MkYsICAnVid9LAotICAgIHsweDMwLCAgJ0InfSwKLSAgICB7MHgzMSwgICdOJ30sCi0gICAgezB4MzIsICAnTSd9LAotICAgIH07Ci0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3Igd2hlbiBzaGlmdCBrZXkgaXMgZG93biwgYnV0IHRoZSBjdHJsIGtleSBpcyBub3QKLSAqIGRvd24gYW5kIENBUFNMT0NLIGlzIG5vdCBhY3RpdmUuIElmIHRoZSBjb2RlIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLAotICogdGhlIG5vcm1hbCB0YWJsZSBhYm92ZSBpcyB0aGVuIHNlYXJjaGVkLgotICovCi1zdGF0aWMgY29kZXBhZ2VfZW50cnlfdCBVU19zaGlmdFtdID0gewotICAgIHsweDAyLCAgJyEnfSwKLSAgICB7MHgwMywgICdAJ30sCi0gICAgezB4MDQsICAnIyd9LAotICAgIHsweDA1LCAgJyQnfSwKLSAgICB7MHgwNiwgICclJ30sCi0gICAgezB4MDcsICAnXid9LAotICAgIHsweDA4LCAgJyYnfSwKLSAgICB7MHgwOSwgICcqJ30sCi0gICAgezB4MEEsICAnKCd9LAotICAgIHsweDBCLCAgJyknfSwKLSAgICB7MHgwQywgICdfJ30sCi0gICAgezB4MEQsICAnKyd9LAotICAgIHsweDEwLCAgJ1EnfSwKLSAgICB7MHgxMSwgICdXJ30sCi0gICAgezB4MTIsICAnRSd9LAotICAgIHsweDEzLCAgJ1InfSwKLSAgICB7MHgxNCwgICdUJ30sCi0gICAgezB4MTUsICAnWSd9LAotICAgIHsweDE2LCAgJ1UnfSwKLSAgICB7MHgxNywgICdJJ30sCi0gICAgezB4MTgsICAnTyd9LAotICAgIHsweDE5LCAgJ1AnfSwKLSAgICB7MHgxQSwgICd7J30sCi0gICAgezB4MUIsICAnfSd9LAotICAgIHsweDFFLCAgJ0EnfSwKLSAgICB7MHgxRiwgICdTJ30sCi0gICAgezB4MjAsICAnRCd9LAotICAgIHsweDIxLCAgJ0YnfSwKLSAgICB7MHgyMiwgICdHJ30sCi0gICAgezB4MjMsICAnSCd9LAotICAgIHsweDI0LCAgJ0onfSwKLSAgICB7MHgyNSwgICdLJ30sCi0gICAgezB4MjYsICAnTCd9LAotICAgIHsweDI3LCAgJzonfSwKLSAgICB7MHgyOCwgICciJ30sCi0gICAgezB4MjksICAnfid9LAotICAgIHsweDJCLCAgJ3wnfSwKLSAgICB7MHgyQywgICdaJ30sCi0gICAgezB4MkQsICAnWCd9LAotICAgIHsweDJFLCAgJ0MnfSwKLSAgICB7MHgyRiwgICdWJ30sCi0gICAgezB4MzAsICAnQid9LAotICAgIHsweDMxLCAgJ04nfSwKLSAgICB7MHgzMiwgICdNJ30sCi0gICAgezB4MzMsICAnPCd9LAotICAgIHsweDM0LCAgJz4nfSwKLSAgICB7MHgzNSwgICc/J30sCi0gICAgfTsKLQotLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciB3aGVuIENBUFNMT0NLIGlzIGFjdGl2ZSBhbmQgdGhlIHNoaWZ0IGtleSBpcwotICogZG93biwgYnV0IHRoZSBjdHJsIGtleSBpcyBub3QuIElmIHRoZSBjb2RlIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLAotICogdGhlIHNoaWZ0IHRhYmxlIGFib3ZlIGlzIHRoZW4gc2VhcmNoZWQuCi0gKi8KLXN0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX3NoaWZ0Q2Fwc1tdID0gewotICAgIHsweDEwLCAgJ3EnfSwKLSAgICB7MHgxMSwgICd3J30sCi0gICAgezB4MTIsICAnZSd9LAotICAgIHsweDEzLCAgJ3InfSwKLSAgICB7MHgxNCwgICd0J30sCi0gICAgezB4MTUsICAneSd9LAotICAgIHsweDE2LCAgJ3UnfSwKLSAgICB7MHgxNywgICdpJ30sCi0gICAgezB4MTgsICAnbyd9LAotICAgIHsweDE5LCAgJ3AnfSwKLSAgICB7MHgxRSwgICdhJ30sCi0gICAgezB4MUYsICAncyd9LAotICAgIHsweDIwLCAgJ2QnfSwKLSAgICB7MHgyMSwgICdmJ30sCi0gICAgezB4MjIsICAnZyd9LAotICAgIHsweDIzLCAgJ2gnfSwKLSAgICB7MHgyNCwgICdqJ30sCi0gICAgezB4MjUsICAnayd9LAotICAgIHsweDI2LCAgJ2wnfSwKLSAgICB7MHgyQywgICd6J30sCi0gICAgezB4MkQsICAneCd9LAotICAgIHsweDJFLCAgJ2MnfSwKLSAgICB7MHgyRiwgICd2J30sCi0gICAgezB4MzAsICAnYid9LAotICAgIHsweDMxLCAgJ24nfSwKLSAgICB7MHgzMiwgICdtJ30sCi0gICAgfTsKLQotLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBhbGwga2V5IHRyYW5zbGF0aW9ucyB3aGVuIHRoZSBjdHJsIGtleSBpcyBkb3duLAotICogcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2YgdGhlIHNoaWZ0IGtleSBhbmQgQ0FQU0xPQ0suIElmIHRoZSBjb2RlIGlzCi0gKiBub3QgZm91bmQgaW4gdGhpcyB0YWJsZSwgdGhlIEFTQ0lJIGNvZGUgaXMgc2V0IHRvIDAgdG8gaW5kaWNhdGUgdGhhdAotICogdGhlcmUgaXMgbm8gQVNDSUkgY29kZSBlcXVpdmFsZW50IGZvciB0aGlzIGtleS4KLSAqLwotc3RhdGljIGNvZGVwYWdlX2VudHJ5X3QgVVNfY3RybFtdID0gewotICAgIHsweDAxLCAgMHgxQn0sCi0gICAgezB4MDYsICAweDFFfSwKLSAgICB7MHgwQywgIDB4MUZ9LAotICAgIHsweDBFLCAgMHg3Rn0sCi0gICAgezB4MTAsICAweDExfSwKLSAgICB7MHgxMSwgIDB4MTd9LAotICAgIHsweDEyLCAgMHgwNX0sCi0gICAgezB4MTMsICAweDEyfSwKLSAgICB7MHgxNCwgIDB4MTR9LAotICAgIHsweDE1LCAgMHgxOX0sCi0gICAgezB4MTYsICAweDE2fSwKLSAgICB7MHgxNywgIDB4MDl9LAotICAgIHsweDE4LCAgMHgwRn0sCi0gICAgezB4MTksICAweDEwfSwKLSAgICB7MHgxQSwgIDB4MUJ9LAotICAgIHsweDFCLCAgMHgxRH0sCi0gICAgezB4MUMsICAweDBBfSwKLSAgICB7MHgxRSwgIDB4MDF9LAotICAgIHsweDFGLCAgMHgxM30sCi0gICAgezB4MjAsICAweDA0fSwKLSAgICB7MHgyMSwgIDB4MDZ9LAotICAgIHsweDIyLCAgMHgwN30sCi0gICAgezB4MjMsICAweDA4fSwKLSAgICB7MHgyNCwgIDB4MEF9LAotICAgIHsweDI1LCAgMHgwQn0sCi0gICAgezB4MjYsICAweDBDfSwKLSAgICB7MHgyQiwgIDB4MUN9LAotICAgIHsweDJDLCAgMHgxQX0sCi0gICAgezB4MkQsICAweDE4fSwKLSAgICB7MHgyRSwgIDB4MDN9LAotICAgIHsweDJGLCAgMHgxNn0sCi0gICAgezB4MzAsICAweDAyfSwKLSAgICB7MHgzMSwgIDB4MEV9LAotICAgIHsweDMyLCAgMHgwRH0sCi0gICAgezB4MzksICAnICd9LAotICAgIH07Ci0KLXN0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX251bVBhZFtdID0gewotICAgIHsweDRDLCAgJzUnfSwKLSAgICB7MHg2MiwgICc0J30sCi0gICAgezB4NjMsICAnNid9LAotICAgIHsweDY0LCAgJzgnfSwKLSAgICB7MHg2NSwgICcyJ30sCi0gICAgezB4NjYsICAnMCd9LAotICAgIHsweDY3LCAgJy4nfSwKLSAgICB7MHg2OCwgICc3J30sCi0gICAgezB4NjksICAnMSd9LAotICAgIHsweDZBLCAgJzknfSwKLSAgICB7MHg2QiwgICczJ30sCi0gICAgfTsKLQotY29kZXBhZ2VfdCBfQ1BfVVNfRW5nbGlzaCA9IHsKLSAgICAiVVMgRW5nbGlzaCIsCi0gICAgVVNfbm9ybWFsLCAgICAgIEVWVF9BUlJfU0laRShVU19ub3JtYWwpLAotICAgIFVTX2NhcHMsICAgICAgICBFVlRfQVJSX1NJWkUoVVNfY2FwcyksCi0gICAgVVNfc2hpZnQsICAgICAgIEVWVF9BUlJfU0laRShVU19zaGlmdCksCi0gICAgVVNfc2hpZnRDYXBzLCAgIEVWVF9BUlJfU0laRShVU19zaGlmdENhcHMpLAotICAgIFVTX2N0cmwsICAgICAgICBFVlRfQVJSX1NJWkUoVVNfY3RybCksCi0gICAgVVNfbnVtUGFkLCAgICAgIEVWVF9BUlJfU0laRShVU19udW1QYWQpLAotICAgIH07CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWE4ZThmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSBjb250YWluaW5nIGNvZGUgY29tbW9uIHRvIGFsbCBwbGF0Zm9ybXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19PUzJfVkREX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHtzZWNyZXR9ICovCi1sb25nIF9WQVJBUEkgICAgX19fZHJ2X29zX3R5cGUgPSBfT1NfVU5TVVBQT1JURUQ7Ci1zdGF0aWMgY2hhciAgICAgbG9jYWxCUERQYXRoW1BNX01BWF9QQVRIXSA9ICIiOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIEJQRCBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLiBCeSBkZWZhdWx0IHRoZSBsb2NhbCBCUEQgcGF0aCBpcwotYWx3YXlzIHNldCB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgbm90IGluaXRpYWxpc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0TG9jYWxCUERQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIHN0cm5jcHkobG9jYWxCUERQYXRoLHBhdGgsc2l6ZW9mKGxvY2FsQlBEUGF0aCkpOwotICAgIGxvY2FsQlBEUGF0aFtzaXplb2YobG9jYWxCUERQYXRoKS0xXSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYnBkcGF0aCAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgYWN0dWFsIHBhdGggdG8gdGhlIGZpbGUKLWNhY2hlZHBhdGggIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGNhY2hlZCBCUEQgZHJpdmVyIHBhdGgKLXRyeXBhdGggICAgIC0gUGF0aCB0byB0cnkgdG8gZmluZCB0aGUgQlBEIGZpbGUgaW4KLXN1YnBhdGggICAgIC0gT3B0aW9uYWwgc3ViIHBhdGggdG8gYXBwZW5kIHRvIHRyeXBhdGgKLWRsbG5hbWUgICAgIC0gTmFtZSBvZiB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCB0byBsb2FkCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UcnlzIHRoZSBzcGVjaWZpZWQgcGF0aCB0byBzZWUgaWYgdGhlIEJQRCBmaWxlIGNhbiBiZSBmb3VuZCBvciBub3QuIElmIHNvLAotdGhlIHBhdGggdXNlZCBpcyByZXR1cm5lZCBpbiBicGRwYXRoIGFuZCBjYWNoZWRwYXRoLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBUcnlQYXRoKAotICAgIGNoYXIgKmJwZHBhdGgsCi0gICAgY2hhciAqY2FjaGVkcGF0aCwKLSAgICBjb25zdCBjaGFyICp0cnlwYXRoLAotICAgIGNvbnN0IGNoYXIgKnN1YnBhdGgsCi0gICAgY29uc3QgY2hhciAqZGxsbmFtZSkKLXsKLSAgICBjaGFyICAgIGZpbGVuYW1lWzI1Nl07Ci0gICAgRklMRSAgICAqZjsKLQotICAgIHN0cmNweShicGRwYXRoLCB0cnlwYXRoKTsKLSAgICBQTV9iYWNrc2xhc2goYnBkcGF0aCk7Ci0gICAgc3RyY2F0KGJwZHBhdGgsc3VicGF0aCk7Ci0gICAgUE1fYmFja3NsYXNoKGJwZHBhdGgpOwotICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsZGxsbmFtZSk7Ci0gICAgaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsInJiIikpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmIChjYWNoZWRwYXRoKQotCXN0cmNweShjYWNoZWRwYXRoLGJwZHBhdGgpOwotICAgIGZjbG9zZShmKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1UcnVlIGlmIGxvY2FsIG92ZXJyaWRlIGVuYWJsZWQsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRlc3RzIHRvIHNlZSBpZiB0aGUgbG9jYWwgb3ZlcnJpZGUgb3B0aW9uIGlzIGVuYWJsZWQsIGFuZCBpZiBzbyBpdCB3aWxsCi1sb29rIGZvciB0aGUgTnVjbGV1cyBkcml2ZXJzIGluIHRoZSBsb2NhbCBhcHBsaWNhdGlvbiBkaXJlY3RvcmllcyBpbgotcHJlZmVyZW5jZSB0byB0aGUgTnVjbGV1cyBzeXN0ZW0gZGlyZWN0b3JpZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIEdldExvY2FsT3ZlcnJpZGUodm9pZCkKLXsKLSAgICBjaGFyICAgICAgICAgICAgZmlsZW5hbWVbMjU2XTsKLSAgICBGSUxFICAgICAgICAgICAgKmY7Ci0gICAgc3RhdGljIGlib29sICAgIGxvY2FsX292ZXJyaWRlID0gLTE7Ci0KLSAgICBpZiAobG9jYWxfb3ZlcnJpZGUgPT0gLTEpIHsKLQlsb2NhbF9vdmVycmlkZSA9IGZhbHNlOwotCXN0cmNweShmaWxlbmFtZSxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLQlQTV9iYWNrc2xhc2goZmlsZW5hbWUpOwotCXN0cmNhdChmaWxlbmFtZSwiZ3JhcGhpY3MuaW5pIik7Ci0JaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsInIiKSkgIT0gTlVMTCkgewotCSAgICB3aGlsZSAoIWZlb2YoZikgJiYgZmdldHMoZmlsZW5hbWUsc2l6ZW9mKGZpbGVuYW1lKSxmKSkgewotCQlpZiAoc3RybmljbXAoZmlsZW5hbWUsInVzZWxvY2FsIiw4KSA9PSAwKSB7Ci0JCSAgICBsb2NhbF9vdmVycmlkZSA9ICgoKihmaWxlbmFtZSs5KSAtICcwJykgPT0gMSk7Ci0JCSAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICBmY2xvc2UoZik7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGxvY2FsX292ZXJyaWRlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVidWcgbG9nIGZpbGUuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLWRsbG5hbWUgLSBOYW1lIG9mIHRoZSBCaW5hcnkgUG9ydGFibGUgRExMIHRvIGxvYWQKLWJwZHBhdGggLSBQbGFjZSB0byBzdG9yZSB0aGUgYWN0dWFsIHBhdGggdG8gdGhlIGZpbGUKLQotUkVUVVJOUzoKLVRydWUgaWYgZm91bmQsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLUZpbmRzIHRoZSBsb2NhdGlvbiBvZiBhIHNwZWNpZmljIEJpbmFyeSBQb3J0YWJsZSBETEwsIGJ5IHNlYXJjaGluZyBhbGwKLXRoZSBzdGFuZGFyZCBTY2lUZWNoIE51Y2xldXMgZHJpdmVyIGxvY2F0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kQlBEKAotICAgIGNvbnN0IGNoYXIgKmRsbG5hbWUsCi0gICAgY2hhciAqYnBkcGF0aCkKLXsKLSAgICBzdGF0aWMgY2hhciBjYWNoZWRwYXRoW1BNX01BWF9QQVRIXSA9ICIiOwotCi0gICAgLyogT24gdGhlIGZpcnN0IGNhbGwgZGV0ZXJtaW5lIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlcnMgKi8KLSAgICBpZiAoY2FjaGVkcGF0aFswXSA9PSAwKSB7Ci0JLyogRmlyc3QgdHJ5IGluIHRoZSBnbG9iYWwgc3lzdGVtIE51Y2xldXMgZHJpdmVyIHBhdGggaWYKLQkgKiB0aGUgbG9jYWwgb3ZlcnJpZGUgc2V0dGluZyBpcyBub3QgZW5hYmxlZC4KLQkgKi8KLQlQTV9pbml0KCk7Ci0JaWYgKCFHZXRMb2NhbE92ZXJyaWRlKCkpIHsKLQkgICAgaWYgKFRyeVBhdGgoYnBkcGF0aCxjYWNoZWRwYXRoLFBNX2dldE51Y2xldXNQYXRoKCksIiIsZGxsbmFtZSkpCi0JCXJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkvKiBOZXh0IHRyeSBpbiB0aGUgbG9jYWwgYXBwbGljYXRpb24gZGlyZWN0b3J5IGlmIGF2YWlsYWJsZSAqLwotCWlmIChsb2NhbEJQRFBhdGhbMF0gIT0gMCkgewotCSAgICBpZiAoVHJ5UGF0aChicGRwYXRoLGNhY2hlZHBhdGgsbG9jYWxCUERQYXRoLCIiLGRsbG5hbWUpKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCWVsc2UgewotI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0JICAgIGNoYXIgICAgKm1nbF9yb290OwotCSAgICBpZiAoKG1nbF9yb290ID0gZ2V0ZW52KCJNR0xfUk9PVCIpKSAhPSBOVUxMKSB7Ci0JCWlmIChUcnlQYXRoKGJwZHBhdGgsY2FjaGVkcGF0aCxtZ2xfcm9vdCwiZHJpdmVycyIsZGxsbmFtZSkpCi0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJfQotI2VuZGlmCi0JICAgIFBNX2dldEN1cnJlbnRQYXRoKGJwZHBhdGgsUE1fTUFYX1BBVEgpOwotCSAgICBpZiAoVHJ5UGF0aChicGRwYXRoLGNhY2hlZHBhdGgsYnBkcGF0aCwiZHJpdmVycyIsZGxsbmFtZSkpCi0JCXJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkvKiBGaW5hbGx5IHRyeSBpbiB0aGUgZ2xvYmFsIHN5c3RlbSBwYXRoIGFnYWluIHNvIHRoYXQgd2UKLQkgKiB3aWxsIHN0aWxsIGZpbmQgdGhlIGRyaXZlcnMgaW4gdGhlIGdsb2JhbCBzeXN0ZW0gcGF0aCBpZgotCSAqIHRoZSBsb2NhbCBvdmVycmlkZSBvcHRpb24gaXMgb24sIGJ1dCB0aGUgYXBwbGljYXRpb24gZG9lcwotCSAqIG5vdCBoYXZlIGFueSBsb2NhbCBvdmVycmlkZSBkcml2ZXJzLgotCSAqLwotCWlmIChUcnlQYXRoKGJwZHBhdGgsY2FjaGVkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpLCIiLGRsbG5hbWUpKQotCSAgICByZXR1cm4gdHJ1ZTsKLQotCS8qIFdob29wcywgd2UgY2FuJ3QgZmluZCB0aGUgQlBEIGZpbGUhICovCi0JcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIC8qIEFsd2F5cyB0cnkgaW4gdGhlIHByZXZpb3VzbHkgZGlzY292ZXJlZCBwYXRoICovCi0gICAgcmV0dXJuIFRyeVBhdGgoYnBkcGF0aCxOVUxMLGNhY2hlZHBhdGgsIiIsZGxsbmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29waWVzIGEgc3RyaW5nIGludG8gYW5vdGhlciwgYW5kIHJldHVybnMgZGVzdCArIHN0cmxlbihzcmMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjaGFyICpfc3RwY3B5KAotICAgIGNoYXIgKl9kZXN0LAotICAgIGNvbnN0IGNoYXIgKl9zcmMpCi17Ci0gICAgaWYgKCFfZGVzdCB8fCAhX3NyYykKLQlyZXR1cm4gMDsKLSAgICB3aGlsZSAoKCpfZGVzdCsrID0gKl9zcmMrKykgIT0gMCkKLQk7Ci0gICAgcmV0dXJuIC0tX2Rlc3Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29waWVzIGEgc3RyaW5nIGludG8gYW5vdGhlciwgc3RvcHBpbmcgYXQgdGhlIG1heGltdW0gbGVuZ3RoLiBUaGUgc3RyaW5nCi1pcyBwcm9wZXJseSB0ZXJtaW5hdGVkICh1bmxpa2Ugc3RybmNweSkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2FmZV9zdHJuY3B5KAotICAgIGNoYXIgKmRzdCwKLSAgICBjb25zdCBjaGFyICpzcmMsCi0gICAgdW5zaWduZWQgbWF4bGVuKQotewotICAgIGlmIChkc3QpIHsKLQlpZihzdHJsZW4oc3JjKSA+PSBtYXhsZW4pIHsKLQkgICAgc3RybmNweShkc3QsIHNyYywgbWF4bGVuKTsKLQkgICAgZHN0W21heGxlbl0gPSAwOwotCSAgICB9Ci0JZWxzZQotCSAgICBzdHJjcHkoZHN0LCBzcmMpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZXRlcm1pbnMgaWYgdGhlIGRvdCBzZXBhcmF0b3IgaXMgcHJlc2VudCBpbiB0aGUgc3RyaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZmluZERvdCgKLSAgICBjaGFyICpwKQotewotICAgIGlmICgqKHAtMSkgPT0gJy4nKQotCXAtLTsKLSAgICBzd2l0Y2ggKCotLXApIHsKLQljYXNlICc6JzoKLQkgICAgaWYgKCoocC0yKSAhPSAnXDAnKQotCQlicmVhazsKLQljYXNlICcvJzoKLQljYXNlICdcXCc6Ci0JY2FzZSAnXDAnOgotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1NYWtlIGEgZnVsbCBwYXRobmFtZSBmcm9tIHNwbGl0IGNvbXBvbmVudHMuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBQbGFjZSB0byBzdG9yZSBmdWxsIHBhdGgKLWRyaXZlICAgLSBEcml2ZSBjb21wb25lbnQgZm9yIHBhdGgKLWRpciAgICAgLSBEaXJlY3RvcnkgY29tcG9uZW50IGZvciBwYXRoCi1uYW1lICAgIC0gRmlsZW5hbWUgY29tcG9uZW50IGZvciBwYXRoCi1leHQgICAgIC0gRXh0ZW5zaW9uIGNvbXBvbmVudCBmb3IgcGF0aAotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gbWFrZSBhIGZ1bGwgcGF0aG5hbWUgZnJvbSBzcGxpdCBjb21wb25lbnRzLiBVbmRlciBVbml4IHRoZQotZHJpdmUgY29tcG9uZW50IHdpbGwgdXN1YWxseSBiZSBlbXB0eS4gSWYgdGhlIGRyaXZlLCBkaXIsIG5hbWUsIG9yIGV4dAotcGFyYW1ldGVycyBhcmUgbnVsbCBvciBlbXB0eSwgdGhleSBhcmUgbm90IGluc2VydGVkIGluIHRoZSBwYXRoIHN0cmluZy4KLU90aGVyd2lzZSwgaWYgdGhlIGRyaXZlIGRvZXNuJ3QgZW5kIHdpdGggYSBjb2xvbiwgb25lIGlzIGluc2VydGVkIGluIHRoZQotcGF0aC4gSWYgdGhlIGRpciBkb2Vzbid0IGVuZCBpbiBhIHNsYXNoLCBvbmUgaXMgaW5zZXJ0ZWQgaW4gdGhlIHBhdGguCi1JZiB0aGUgZXh0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIGRvdCwgb25lIGlzIGluc2VydGVkIGluIHRoZSBwYXRoLgotCi1UaGUgbWF4aW11bSBzaXplcyBmb3IgdGhlIHBhdGggc3RyaW5nIGlzIGdpdmVuIGJ5IHRoZSBjb25zdGFudCBQTV9NQVhfUEFUSCwKLXdoaWNoIGluY2x1ZGVzIHNwYWNlIGZvciB0aGUgbnVsbC10ZXJtaW5hdG9yLgotCi1TRUUgQUxTTzoKLVBNX3NwbGl0UGF0aAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fbWFrZXBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBjb25zdCBjaGFyICpkcml2ZSwKLSAgICBjb25zdCBjaGFyICpkaXIsCi0gICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICBjb25zdCBjaGFyICpleHQpCi17Ci0gICAgaWYgKGRyaXZlICYmICpkcml2ZSkgewotCSpwYXRoKysgPSAqZHJpdmU7Ci0JKnBhdGgrKyA9ICc6JzsKLQl9Ci0gICAgaWYgKGRpciAmJiAqZGlyKSB7Ci0JcGF0aCA9IF9zdHBjcHkocGF0aCxkaXIpOwotCWlmICgqKHBhdGgtMSkgIT0gJ1xcJyAmJiAqKHBhdGgtMSkgIT0gJy8nKQotI2lmZGVmICBfX1VOSVhfXwotCSAgICAqcGF0aCsrID0gJy8nOwotI2Vsc2UKLQkgICAgKnBhdGgrKyA9ICdcXCc7Ci0jZW5kaWYKLQl9Ci0gICAgaWYgKG5hbWUpCi0JcGF0aCA9IF9zdHBjcHkocGF0aCxuYW1lKTsKLSAgICBpZiAoZXh0ICYmICpleHQpIHsKLQlpZiAoKmV4dCAhPSAnLicpCi0JICAgICpwYXRoKysgPSAnLic7Ci0JcGF0aCA9IF9zdHBjcHkocGF0aCxleHQpOwotCX0KLSAgICAqcGF0aCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVNwbGl0IGEgZnVsbCBwYXRobmFtZSBpbnRvIGNvbXBvbmVudHMuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBGdWxsIHBhdGggdG8gc3BsaXQKLWRyaXZlICAgLSBEcml2ZSBjb21wb25lbnQgZm9yIHBhdGgKLWRpciAgICAgLSBEaXJlY3RvcnkgY29tcG9uZW50IGZvciBwYXRoCi1uYW1lICAgIC0gRmlsZW5hbWUgY29tcG9uZW50IGZvciBwYXRoCi1leHQgICAgIC0gRXh0ZW5zaW9uIGNvbXBvbmVudCBmb3IgcGF0aAotCi1SRVRVUk5TOgotRmxhZ3MgaW5kaWNhdGluZyB3aGF0IGNvbXBvbmVudHMgd2VyZSBwYXJzZWQuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzcGxpdCBhIGZ1bGwgcGF0aG1hbWUgaW50byBzZXBhcmF0ZSBjb21wb25lbnRzIGluIHRoZSBmb3JtCi0KLSAgICBYOlxESVJcU1VCRElSXE5BTUUuRVhUCi0KLWFuZCBzcGxpdHMgcGF0aCBpbnRvIGl0cyBmb3VyIGNvbXBvbmVudHMuIEl0IHRoZW4gc3RvcmVzIHRob3NlIGNvbXBvbmVudHMKLWluIHRoZSBzdHJpbmdzIHBvaW50ZWQgdG8gYnkgZHJpdmUsIGRpciwgbmFtZSBhbmQgZXh0LiAoRWFjaCBjb21wb25lbnQgaXMKLXJlcXVpcmVkIGJ1dCBjYW4gYmUgYSBOVUxMLCB3aGljaCBtZWFucyB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgd2lsbCBiZQotcGFyc2VkIGJ1dCBub3Qgc3RvcmVkKS4KLQotVGhlIG1heGltdW0gc2l6ZXMgZm9yIHRoZXNlIHN0cmluZ3MgYXJlIGdpdmVuIGJ5IHRoZSBjb25zdGFudHMgUE1fTUFYX0RSSVZFCi1hbmQgUE1fTUFYX1BBVEguIFBNX01BWF9EUklWRSBpcyBhbHdheXMgNCwgYW5kIFBNX01BWF9QQVRIIGlzIHVzdWFsbHkgYXQKLWxlYXN0IDI1NiBjaGFyYWN0ZXJzLiBVbmRlciBVbml4IHRoZSBkaXIsIG5hbWUgYW5kIGV4dCBjb21wb25lbnRzIG1heSBiZQotdXAgdG8gdGhlIGZ1bGwgcGF0aCBpbiBsZW5ndGguCi0KLVNFRSBBTFNPOgotUE1fbWFrZVBhdGgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fc3BsaXRwYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgsCi0gICAgY2hhciAqZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGNoYXIgKm5hbWUsCi0gICAgY2hhciAqZXh0KQotewotICAgIGNoYXIgICAgKnA7Ci0gICAgaW50ICAgICB0ZW1wLHJldDsKLSAgICBjaGFyICAgIGJ1ZltQTV9NQVhfUEFUSCsyXTsKLQotICAgIC8qIFNldCBhbGwgc3RyaW5nIHRvIGRlZmF1bHQgdmFsdWUgemVybyAqLwotICAgIHJldCA9IDA7Ci0gICAgaWYgKGRyaXZlKSAgKmRyaXZlID0gMDsKLSAgICBpZiAoZGlyKSAgICAqZGlyID0gMDsKLSAgICBpZiAobmFtZSkgICAqbmFtZSA9IDA7Ci0gICAgaWYgKGV4dCkgICAgKmV4dCA9IDA7Ci0KLSAgICAvKiBDb3B5IGZpbGVuYW1lIGludG8gdGVtcGxhdGUgdXAgdG8gUE1fTUFYX1BBVEggY2hhcmFjdGVycyAqLwotICAgIHAgPSBidWY7Ci0gICAgaWYgKCh0ZW1wID0gc3RybGVuKHBhdGgpKSA+IFBNX01BWF9QQVRIKQotCXRlbXAgPSBQTV9NQVhfUEFUSDsKLSAgICAqcCsrID0gMDsKLSAgICBzdHJuY3B5KHAsIHBhdGgsIHRlbXApOwotICAgICoocCArPSB0ZW1wKSA9IDA7Ci0KLSAgICAvKiBTcGxpdCB0aGUgZmlsZW5hbWUgYW5kIGZpbGwgY29ycmVzcG9uZGluZyBub256ZXJvIHBvaW50ZXJzICovCi0gICAgdGVtcCA9IDA7Ci0gICAgZm9yICg7OykgewotCXN3aXRjaCAoKi0tcCkgewotCSAgICBjYXNlICcuJzoKLQkJaWYgKCF0ZW1wICYmICgqKHArMSkgPT0gJ1wwJykpCi0JCSAgICB0ZW1wID0gZmluZERvdChwKTsKLQkJaWYgKCghdGVtcCkgJiYgKChyZXQgJiBQTV9IQVNfRVhURU5TSU9OKSA9PSAwKSkgewotCQkgICAgcmV0IHw9IFBNX0hBU19FWFRFTlNJT047Ci0JCSAgICBzYWZlX3N0cm5jcHkoZXh0LCBwLCBQTV9NQVhfUEFUSCAtIDEpOwotCQkgICAgKnAgPSAwOwotCQkgICAgfQotCQljb250aW51ZTsKLQkgICAgY2FzZSAnOic6Ci0JCWlmIChwICE9ICZidWZbMl0pCi0JCSAgICBjb250aW51ZTsKLQkgICAgY2FzZSAnXDAnOgotCQlpZiAodGVtcCkgewotCQkgICAgaWYgKCorK3ApCi0JCQlyZXQgfD0gUE1fSEFTX0RJUkVDVE9SWTsKLQkJICAgIHNhZmVfc3RybmNweShkaXIsIHAsIFBNX01BWF9QQVRIIC0gMSk7Ci0JCSAgICAqcC0tID0gMDsKLQkJICAgIGJyZWFrOwotCQkgICAgfQotCSAgICBjYXNlICcvJzoKLQkgICAgY2FzZSAnXFwnOgotCQlpZiAoIXRlbXApIHsKLQkJICAgIHRlbXArKzsKLQkJICAgIGlmICgqKytwKQotCQkJcmV0IHw9IFBNX0hBU19GSUxFTkFNRTsKLQkJICAgIHNhZmVfc3RybmNweShuYW1lLCBwLCBQTV9NQVhfUEFUSCAtIDEpOwotCQkgICAgKnAtLSA9IDA7Ci0JCSAgICBpZiAoKnAgPT0gMCB8fCAoKnAgPT0gJzonICYmIHAgPT0gJmJ1ZlsyXSkpCi0JCQlicmVhazsKLQkJICAgIH0KLQkJY29udGludWU7Ci0JICAgIGNhc2UgJyonOgotCSAgICBjYXNlICc/JzoKLQkJaWYgKCF0ZW1wKQotCQkgICAgcmV0IHw9IFBNX0hBU19XSUxEQ0FSRFM7Ci0JICAgIGRlZmF1bHQ6Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JYnJlYWs7Ci0JfQotICAgIGlmICgqcCA9PSAnOicpIHsKLQlpZiAoYnVmWzFdKQotCSAgICByZXQgfD0gUE1fSEFTX0RSSVZFOwotCXNhZmVfc3RybmNweShkcml2ZSwgJmJ1ZlsxXSwgUE1fTUFYX0RSSVZFIC0gMSk7Ci0JfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUJsb2NrIHVudGlsIGEgc3BlY2lmaWMgdGltZSBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBjYWxsCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLW1pbGxpc2Vjb25kcyAgICAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgZm9yIGRlbGF5Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdGhlIGNhbGxpbmcgdGhyZWFkIG9yIHByb2Nlc3MgdW50aWwgdGhlIHNwZWNpZmllZAotbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgL2xhc3QvIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KLVRoZSBmaXJzdCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4gT24KLXN1YnNxdWVudCBjYWxscyBpdCB3aWxsIGJsb2NrIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZSBoYXMgZWxhcHNlZCwgb3IgaXQKLXdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB0aW1lIGhhcyBhbHJlYWR5IGVsYXBzZWQuCi0KLVRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIHByb3ZpZGUgY29uc3RhbnQgdGltZSBmdW5jdGlvbmFsaXR5IGluIGEKLXByb2dyYW0sIHN1Y2ggYXMgYSBmcmFtZSByYXRlIGxpbWl0ZXIgZm9yIGdyYXBoaWNzIGFwcGxpY2F0aW9ucyBldGMuCi0KLVNFRSBBTFNPOgotUE1fc2xlZXAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2Jsb2NrVW50aWxUaW1lb3V0KAotICAgIHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICB1bG9uZyAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBtaWxsaXNlY29uZHMgKiAxMDAwTCxtc0RlbGF5OwotICAgIHN0YXRpYyBMWlRpbWVyT2JqZWN0ICAgIHRtOwotICAgIHN0YXRpYyBpYm9vbCAgICAgICAgICAgIGZpcnN0VGltZSA9IHRydWU7Ci0KLSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0JZmlyc3RUaW1lID0gZmFsc2U7Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0JfQotICAgIGVsc2UgewotCWlmICgobXNEZWxheSA9IChtaWNyb3NlY29uZHMgLSBMWlRpbWVyTGFwRXh0KCZ0bSkpIC8gMTAwMEwpID4gMCkKLQkgICAgUE1fc2xlZXAobXNEZWxheSk7Ci0Jd2hpbGUgKExaVGltZXJMYXBFeHQoJnRtKSA8IG1pY3Jvc2Vjb25kcykKLQkgICAgOwotCUxaVGltZXJPZmZFeHQoJnRtKTsKLQlMWlRpbWVyT25FeHQoJnRtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2NwdWluZm8uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19jcHVpbmZvLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYmVkNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2NwdWluZm8uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIE5BU00gb3IgVEFTTSBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBJbnRlbCAzMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi07KgotOyogRGVzY3JpcHRpb246IENvZGUgdG8gZGV0ZXJtaW5lIHRoZSBJbnRlbCBwcm9jZXNzb3IgdHlwZS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIgotCi1oZWFkZXIgICAgICBfY3B1aW5mbwotCi1iZWdkYXRhc2VnICBfY3B1aW5mbyAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGRhdGEgc2VnbWVudAotCi1jYWNoZV9pZCAgICBkYiAgIjAxMjM0NTY3ODkwMTIzNDU2IgotaW50ZWxfaWQgICAgZGIgICJHZW51aW5lSW50ZWwiICAgICAgOyBJbnRlbCB2ZW5kb3IgSUQKLWN5cml4X2lkICAgIGRiICAiQ3lyaXhJbnN0ZWFkIiAgICAgIDsgQ3lyaXggdmVuZG9yIElECi1hbWRfaWQgICAgICBkYiAgIkF1dGhlbnRpY0FNRCIgICAgICA7IEFNRCB2ZW5kb3IgSUQKLWlkdF9pZCAgICAgIGRiICAiQ2VudGF1ckhhdWxzIiAgICAgIDsgSURUIHZlbmRvciBJRAotCi1DUFVfSURUICAgICBFUVUgMDEwMDBoICAgICAgICAgICAgICA7IEZsYWcgZm9yIElEVCBwcm9jZXNzb3JzCi1DUFVfQ3lyaXggICBFUVUgMDIwMDBoICAgICAgICAgICAgICA7IEZsYWcgZm9yIEN5cml4IHByb2Nlc3NvcnMKLUNQVV9BTUQgICAgIEVRVSAwNDAwMGggICAgICAgICAgICAgIDsgRmxhZyBmb3IgQU1EIHByb2Nlc3NvcnMKLUNQVV9JbnRlbCAgIEVRVSAwODAwMGggICAgICAgICAgICAgIDsgRmxhZyBmb3IgSW50ZWwgcHJvY2Vzc29ycwotCi1lbmRkYXRhc2VnICBfY3B1aW5mbwotCi1iZWdjb2Rlc2VnICBfY3B1aW5mbyAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gbUNQVV9JRCAwCi1kYiAgMDBGaCwwQTJoCi0lZW5kbWFjcm8KLWVsc2UKLU1BQ1JPICAgbUNQVV9JRAotZGIgIDAwRmgsMEEyaAotRU5ETQotZW5kaWYKLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvIG1SRFRTQyAwCi1kYiAgMDBGaCwwMzFoCi0lZW5kbWFjcm8KLWVsc2UKLU1BQ1JPICAgbVJEVFNDCi1kYiAgMDBGaCwwMzFoCi1FTkRNCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBib29sIF9DUFVfY2hlY2s4MDM4Nih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyBpZiB3ZSBoYXZlIGFuIGkzODYgcHJvY2Vzc29yLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfY2hlY2s4MDM4NgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICB4b3IgICAgIGVkeCxlZHggICAgICAgICAgICAgOyBFRFggPSAwLCBub3QgYW4gODAzODYKLSAgICAgICAgbW92ICAgICBieCwgc3AKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgYW5kICAgICBzcCwgfjMKLWVsc2UKLSAgICAgICAgYW5kICAgICBzcCwgbm90IDMKLWVuZGlmCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IFB1c2ggb3JpZ2luYWwgRUZMQUdTCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IEdldCBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgbW92ICAgICBlY3gsIGVheCAgICAgICAgICAgIDsgU2F2ZSBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgeG9yICAgICBlYXgsIDQwMDAwaCAgICAgICAgIDsgRmxpcCBBQyBiaXQgaW4gRUZMQUdTCi0gICAgICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICA7IFNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIHN0YWNrCi0gICAgICAgIHBvcGZkICAgICAgICAgICAgICAgICAgICAgICA7IFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG5ldyBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLSAgICAgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgICAgIDsgQ2FuJ3QgdG9nZ2xlIEFDIGJpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICBwcm9jZXNzb3I9ODAzODYKLSAgICAgICAgam56ICAgICBAQERvbmUgICAgICAgICAgICAgIDsgSnVtcCBpZiBub3QgYW4gODAzODYgcHJvY2Vzc29yCi0gICAgICAgIGluYyAgICAgZWR4ICAgICAgICAgICAgICAgICA7IFdlIGhhdmUgYW4gODAzODYKLQotQEBEb25lOiBwdXNoICAgIGVjeAotICAgICAgICBwb3BmZAotICAgICAgICBtb3YgICAgIHNwLCBieAotICAgICAgICBtb3YgICAgIGVheCwgZWR4Ci0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGJvb2wgX0NQVV9jaGVjazgwNDg2KHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIGlmIHdlIGhhdmUgYW4gaTQ4NiBwcm9jZXNzb3IuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9jaGVjazgwNDg2Ci0KLSAgICAgICAgZW50ZXJfYwotCi07IERpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGk0ODYgYW5kIFBlbnRpdW0gYnkgdGhlIGFiaWxpdHkgdG8gc2V0IHRoZSBJRCBmbGFnCi07IGluIHRoZSBFRkxBR1MgcmVnaXN0ZXIuIElmIHRoZSBJRCBmbGFnIGlzIHNldCwgdGhlbiB3ZSBjYW4gdXNlIHRoZSBDUFVJRAotOyBpbnN0cnVjdGlvbiB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIHZlcnNpb24gb2YgdGhlIGNoaXAuIE90aGVyd2lzZSB3ZQotOyBzaW1wbHkgaGF2ZSBhbiA4MDQ4Ni4KLQotOyBEaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBpNDg2IGFuZCBQZW50aXVtIGJ5IHRoZSBhYmlsaXR5IHRvIHNldCB0aGUgSUQgZmxhZwotOyBpbiB0aGUgRUZMQUdTIHJlZ2lzdGVyLiBJZiB0aGUgSUQgZmxhZyBpcyBzZXQsIHRoZW4gd2UgY2FuIHVzZSB0aGUgQ1BVSUQKLTsgaW5zdHJ1Y3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBjaGlwLiBPdGhlcndpc2Ugd2UKLTsgc2ltcGx5IGhhdmUgYW4gODA0ODYuCi0KLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG9yaWdpbmFsIEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBtb3YgICAgIGVjeCwgZWF4Ci0gICAgICAgIHhvciAgICAgZWF4LCAyMDAwMDBoICAgICAgICA7IEZsaXAgSUQgYml0IGluIEVGTEFHUwotICAgICAgICBwdXNoICAgIGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKLSAgICAgICAgcG9wZmQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgbmV3IEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBTdG9yZSBuZXcgRUZMQUdTIGluIEVBWAotICAgICAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICAgICAgOyBDYW4gbm90IHRvZ2dsZSBJRCBiaXQsCi0gICAgICAgIGpueiAgICAgQEAxICAgICAgICAgICAgICAgICA7IFByb2Nlc3Nvcj04MDQ4NgotICAgICAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgYSBQZW50aXVtCi0gICAgICAgIGptcCAgICAgQEBEb25lCi1AQDE6ICAgIG1vdiAgICAgZWF4LDAgICAgICAgICAgICAgICA7IFdlIGhhdmUgUGVudGl1bSBvciBsYXRlcgotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBib29sIF9DUFVfY2hlY2tDbG9uZSh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hlY2tzIGlmIHRoZSBpMzg2IG9yIGk0ODYgcHJvY2Vzc29yIGlzIGEgY2xvbmUgb3IgZ2VudWluZSBJbnRlbC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2NoZWNrQ2xvbmUKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBheCw1NTU1aCAgICAgICAgICAgIDsgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYSAzMi1iaXQgcHJvY2Vzc29yCi0gICAgICAgIHhvciAgICAgZHgsZHgKLSAgICAgICAgbW92ICAgICBjeCwyaAotICAgICAgICBkaXYgICAgIGN4ICAgICAgICAgICAgICAgICAgOyBQZXJmb3JtIERpdmlzaW9uCi0gICAgICAgIGNsYwotICAgICAgICBqbnogICAgIEBATm9DbG9uZQotICAgICAgICBqbXAgICAgIEBAQ2xvbmUKLUBATm9DbG9uZToKLSAgICAgICAgc3RjCi1AQENsb25lOgotICAgICAgICBwdXNoZmQKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgR2V0IHRoZSBmbGFncwotICAgICAgICBhbmQgICAgIGVheCwxCi0gICAgICAgIHhvciAgICAgZWF4LDEgICAgICAgICAgICAgICA7IEVBWD0wIGlzIHByb2JhYmx5IEludGVsLCBFQVg9MSBpcyBhIENsb25lCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgYm9vbCBfQ1BVX2hhdmVDUFVJRCh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyBpZiB3ZSBoYXZlIHN1cHBvcnQgZm9yIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2hhdmVDUFVJRAotCi0gICAgICAgIGVudGVyX2MKLQotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgbW92ICAgICBlY3gsIGVheAotICAgICAgICB4b3IgICAgIGVheCwgMjAwMDAwaCAgICAgICAgOyBGbGlwIElEIGJpdCBpbiBFRkxBR1MKLSAgICAgICAgcHVzaCAgICBlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrCi0gICAgICAgIHBvcGZkICAgICAgICAgICAgICAgICAgICAgICA7IFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG5ldyBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLSAgICAgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgICAgIDsgQ2FuIG5vdCB0b2dnbGUgSUQgYml0LAotICAgICAgICBqbnogICAgIEBAMSAgICAgICAgICAgICAgICAgOyBQcm9jZXNzb3I9ODA0ODYKLSAgICAgICAgbW92ICAgICBlYXgsMCAgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIENQVUlEIHN1cHBvcnQKLSAgICAgICAgam1wICAgICBAQERvbmUKLUBAMTogICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgV2UgaGF2ZSBDUFVJRCBzdXBwb3J0Ci1lbHNlCi0gICAgICAgIG1vdiAgICAgZWF4LDAgICAgICAgICAgICAgICA7IENQVUlEIHJlcXVpcmVzIDMyLWJpdCBwbW9kZQotZW5kaWYKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWludCBfQ1BVX2NoZWNrQ1BVSUQodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2NoZWNrQ1BVSUQKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECi0gICAgICAgIGNtcCAgICAgZWF4LCAxICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAotICAgICAgICBqbCAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIHhvciAgICAgZWF4LGVheCAgICAgICAgICAgICA7IEFzc3VtZSB2ZW5kb3IgaXMgdW5rbm93bgotCi07IENoZWNrIGZvciBHZW51aW5lSW50ZWwgcHJvY2Vzc29ycwotCi0gICAgICAgIExFQV9MICAgZXNpLGludGVsX2lkCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaV0sIGVieAotICAgICAgICBqbmUgICAgIEBATm90SW50ZWwKLSAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzRdLCBlZHgKLSAgICAgICAgam5lICAgICBAQE5vdEludGVsCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs4XSwgZWN4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RJbnRlbAotICAgICAgICBtb3YgICAgIGVheCxDUFVfSW50ZWwgICAgICAgOyBGbGFnIHRoYXQgd2UgaGF2ZSBHZW51aW5lSW50ZWwKLSAgICAgICAgam1wICAgICBAQEZvdW5kVmVuZG9yCi0KLTsgQ2hlY2sgZm9yIEN5cml4SW5zdGVhZCBwcm9jZXNzb3JzCi0KLUBATm90SW50ZWw6Ci0gICAgICAgIExFQV9MICAgZXNpLGN5cml4X2lkCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaV0sIGVieAotICAgICAgICBqbmUgICAgIEBATm90Q3lyaXgKLSAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzRdLCBlZHgKLSAgICAgICAgam5lICAgICBAQE5vdEN5cml4Ci0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs4XSwgZWN4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RDeXJpeAotICAgICAgICBtb3YgICAgIGVheCxDUFVfQ3lyaXggICAgICAgOyBGbGFnIHRoYXQgd2UgaGF2ZSBDeXJpeEluc3RlYWQKLSAgICAgICAgam1wICAgICBAQEZvdW5kVmVuZG9yCi0KLTsgQ2hlY2sgZm9yIEF1dGhlbnRpY0FNRCBwcm9jZXNzb3JzCi0KLUBATm90Q3lyaXg6Ci0gICAgICAgIExFQV9MICAgZXNpLGFtZF9pZAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2ldLCBlYngKLSAgICAgICAgam5lICAgICBAQE5vdEFNRAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krNF0sIGVkeAotICAgICAgICBqbmUgICAgIEBATm90QU1ECi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs4XSwgZWN4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RBTUQKLSAgICAgICAgbW92ICAgICBlYXgsQ1BVX0FNRCAgICAgICAgIDsgRmxhZyB0aGF0IHdlIGhhdmUgQXV0aGVudGljQU1ECi0gICAgICAgIGptcCAgICAgQEBGb3VuZFZlbmRvcgotCi07IENoZWNrIGZvciBDZW50YXVySGF1bHMgcHJvY2Vzc29ycwotCi1AQE5vdEFNRDoKLSAgICAgICAgTEVBX0wgICBlc2ksaWR0X2lkCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaV0sIGVieAotICAgICAgICBqbmUgICAgIEBATm90SURUCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs0XSwgZWR4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RJRFQKLSAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzhdLCBlY3gKLSAgICAgICAgam5lICAgICBAQE5vdElEVAotICAgICAgICBtb3YgICAgIGVheCxDUFVfSURUICAgICAgICAgOyBGbGFnIHRoYXQgd2UgaGF2ZSBBdXRoZW50aWNJRFQKLSAgICAgICAgam1wICAgICBAQEZvdW5kVmVuZG9yCi0KLUBATm90SURUOgotCi1AQEZvdW5kVmVuZG9yOgotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICB4b3IgICAgIGVheCwgZWF4Ci0gICAgICAgIGluYyAgICAgZWF4Ci0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKLSAgICAgICAgYW5kICAgICBlYXgsIDBGMDBoCi0gICAgICAgIHNociAgICAgZWF4LCA4ICAgICAgICAgICAgICA7IElzb2xhdGUgZmFtaWx5Ci0gICAgICAgIGFuZCAgICAgZWF4LCAwRmgKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgb3IgICAgICBlYXgsZWN4ICAgICAgICAgICAgIDsgQ29tYmluZSBpbiB0aGUgY2xvbmUgZmxhZwotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICBqbXAgICAgIEBARG9uZQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1aW50IF9DUFVfZ2V0Q1BVSURNb2RlbCh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyB0aGUgQ1BVIHR5cGUgdXNpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfZ2V0Q1BVSURNb2RlbAotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICB4b3IgICAgIGVheCwgZWF4ICAgICAgICAgICAgOyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQKLSAgICAgICAgY21wICAgICBlYXgsIDEgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIDEgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlECi0gICAgICAgIGpsICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgeG9yICAgICBlYXgsIGVheAotICAgICAgICBpbmMgICAgIGVheAotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgZmFtaWx5L21vZGVsL3N0ZXBwaW5nL2ZlYXR1cmVzCi0gICAgICAgIGFuZCAgICAgZWF4LCAwRjBoCi0gICAgICAgIHNociAgICAgZWF4LCA0ICAgICAgICAgICAgICA7IElzb2xhdGUgbW9kZWwKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgam1wICAgICBAQERvbmUKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWludCBfQ1BVX2dldENQVUlEU3RlcHBpbmcodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2dldENQVUlEU3RlcHBpbmcKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECi0gICAgICAgIGNtcCAgICAgZWF4LCAxICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAotICAgICAgICBqbCAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXgKLSAgICAgICAgaW5jICAgICBlYXgKLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGZhbWlseS9tb2RlbC9zdGVwcGluZy9mZWF0dXJlcwotICAgICAgICBhbmQgICAgIGVheCwgMDBGaCAgICAgICAgICAgOyBJc29sYXRlIHN0ZXBwaW5nCi1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIGptcCAgICAgQEBEb25lCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVpbnQgX0NQVV9nZXRDUFVJREZlYXR1cmVzKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIHRoZSBDUFUgdHlwZSB1c2luZyB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9nZXRDUFVJREZlYXR1cmVzCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAotICAgICAgICBjbXAgICAgIGVheCwgMSAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMSBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKLSAgICAgICAgamwgICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICB4b3IgICAgIGVheCwgZWF4Ci0gICAgICAgIGluYyAgICAgZWF4Ci0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKLSAgICAgICAgbW92ICAgICBlYXgsIGVkeAotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICBqbXAgICAgIEBARG9uZQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1aW50IF9DUFVfZ2V0Q2FjaGVTaXplKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIHRoZSBDUFUgY2FjaGUgc2l6ZSBmb3IgSW50ZWwgcHJvY2Vzc29ycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfZ2V0Q2FjaGVTaXplCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICB4b3IgICAgIGVheCwgZWF4ICAgICAgICAgICAgOyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQKLSAgICAgICAgY21wICAgICBlYXgsMiAgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIDIgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlECi0gICAgICAgIGpsICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgbW92ICAgICBlYXgsMgotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgY2FjaGUgZGVzY3JpcHRvcnMKLSAgICAgICAgTEVBX0wgICBlc2ksY2FjaGVfaWQgICAgICAgIDsgR2V0IGFkZHJlc3Mgb2YgY2FjaGUgSUQgKC1mUElDIGF3YXJlKQotICAgICAgICBzaHIgICAgIGVheCw4Ci0gICAgICAgIG1vdiAgICAgW2VzaSswXSxlYXgKLSAgICAgICAgbW92ICAgICBbZXNpKzNdLGVieAotICAgICAgICBtb3YgICAgIFtlc2krN10sZWN4Ci0gICAgICAgIG1vdiAgICAgW2VzaSsxMV0sZWR4Ci0gICAgICAgIHhvciAgICAgZWF4LGVheAotICAgICAgICBMRUFfTCAgIGVzaSxjYWNoZV9pZCAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBjYWNoZSBJRCAoLWZQSUMgYXdhcmUpCi0gICAgICAgIG1vdiAgICAgZWRpLDE1Ci1AQFNjYW5Mb29wOgotICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDFoCi0gICAgICAgIG1vdiAgICAgZWF4LDEyOAotICAgICAgICBqZSAgICAgIEBARG9uZQotICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDJoCi0gICAgICAgIG1vdiAgICAgZWF4LDI1NgotICAgICAgICBqZSAgICAgIEBARG9uZQotICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDNoCi0gICAgICAgIG1vdiAgICAgZWF4LDUxMgotICAgICAgICBqZSAgICAgIEBARG9uZQotICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDRoCi0gICAgICAgIG1vdiAgICAgZWF4LDEwMjQKLSAgICAgICAgamUgICAgICBAQERvbmUKLSAgICAgICAgY21wICAgICBbQllURSBlc2ldLDQ1aAotICAgICAgICBtb3YgICAgIGVheCwyMDQ4Ci0gICAgICAgIGplICAgICAgQEBEb25lCi0gICAgICAgIGluYyAgICAgZXNpCi0gICAgICAgIGRlYyAgICAgZWRpCi0gICAgICAgIGpueiAgICAgQEBTY2FuTG9vcAotCi1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIGptcCAgICAgQEBEb25lCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVpbnQgX0NQVV9oYXZlM0ROb3codm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2hhdmUzRE5vdwotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVheCw4MDAwMDAwMGggICAgICAgOyBRdWVyeSBmb3IgZXh0ZW5kZWQgZnVuY3Rpb25zCi0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBleHRlbmRlZCBmdW5jdGlvbiBsaW1pdAotICAgICAgICBjbXAgICAgIGVheCw4MDAwMDAwMWgKLSAgICAgICAgamJlICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgTm9wZSwgd2UgZG9udCBoYXZlIGZ1bmN0aW9uIDgwMDAwMDAwMWgKLSAgICAgICAgbW92ICAgICBlYXgsODAwMDAwMDFoICAgICAgIDsgU2V0dXAgZXh0ZW5kZWQgZnVuY3Rpb24gODAwMDAwMDAxaAotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBhbmQgZ2V0IHRoZSBpbmZvcm1hdGlvbgotICAgICAgICB0ZXN0ICAgIGVkeCw4MDAwMDAwMGggICAgICAgOyBCaXQgMzEgaXMgc2V0IGlmIDNETm93ISBwcmVzZW50Ci0gICAgICAgIGp6ICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IE5vcGUsIHdlIGRvbnQgaGF2ZSAzRE5vdyBzdXBwb3J0Ci0gICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICA7IFllcCwgd2UgaGF2ZSAzRE5vdyEgc3VwcG9ydCEKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgam1wICAgICBAQERvbmUKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX0NQVV9xdWlja1JEVFNDKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyB0aGUgdGltZSBzdGFtcCBjb3VudGVyIGFuZCByZXR1cm5zIHRoZSBsb3cgb3JkZXIgMzItYml0cwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfcXVpY2tSRFRTQwotCi0gICAgICAgIG1SRFRTQwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfQ1BVX3J1bkJTRkxvb3AodWxvbmcgaW50ZXJhdGlvbnMpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSdW5zIGEgbG9vcCBvZiBCU0YgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVyYXRpb25zCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9ydW5CU0ZMb29wCi0KLSAgICAgICAgQVJHICAgICBpdGVyYXRpb25zOlVMT05HCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2ggICAgX2J4Ci0KLSAgICAgICAgbW92ICAgICBlZHgsW2l0ZXJhdGlvbnNdCi0gICAgICAgIG1vdiAgICAgZWF4LDgwMDAwMDAwaAotICAgICAgICBtb3YgICAgIGVieCxlZHgKLQotICAgICAgICBBTElHTiAgIDQKLQotQEBsb29wOiBic2YgICAgIGVjeCxlYXgKLSAgICAgICAgZGVjICAgICBlYngKLSAgICAgICAgam56ICAgICBAQGxvb3AKLQotICAgICAgICBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCAgX0NQVV9yZWFkVGltZVN0YW1wKENQVV9sYXJnZUludGVnZXIgKnRpbWUpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgdGhlIHRpbWUgc3RhbXAgY291bnRlciBhbmQgcmV0dXJucyB0aGUgNjQtYml0IHJlc3VsdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX3JlYWRUaW1lU3RhbXAKLQotICAgICAgICBtUkRUU0MKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCs0XSAgICAgOyBBY2Nlc3MgZGlyZWN0bHkgd2l0aG91dCBzdGFjayBmcmFtZQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfQ1BVX2RpZmZUaW1lNjQoQ1BVX2xhcmdlSW50ZWdlciAqdDEsQ1BVX2xhcmdlSW50ZWdlciAqdDIsQ1BVX2xhcmdlSW50ZWdlciAqdCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIDY0LWJpdCBudW1iZXJzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfZGlmZlRpbWU2NAotCi0gICAgICAgIEFSRyAgICAgdDE6RFBUUiwgdDI6RFBUUiwgdDpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZWN4LFt0Ml0KLSAgICAgICAgbW92ICAgICBlYXgsW2VjeF0gICAgICAgOyBFQVggOj0gdDIubG93Ci0gICAgICAgIG1vdiAgICAgZWN4LFt0MV0KLSAgICAgICAgc3ViICAgICBlYXgsW2VjeF0KLSAgICAgICAgbW92ICAgICBlZHgsZWF4ICAgICAgICAgOyBFRFggOj0gbG93IGRpZmZlcmVuY2UKLSAgICAgICAgbW92ICAgICBlY3gsW3QyXQotICAgICAgICBtb3YgICAgIGVheCxbZWN4KzRdICAgICA7IEVDWCA6PSB0Mi5oaWdoCi0gICAgICAgIG1vdiAgICAgZWN4LFt0MV0KLSAgICAgICAgc2JiICAgICBlYXgsW2VjeCs0XSAgICAgOyBFQVggOj0gaGlnaCBkaWZmZXJlbmNlCi0KLSAgICAgICAgbW92ICAgICBlYngsW3RdICAgICAgICAgOyBTdG9yZSB0aGUgcmVzdWx0Ci0gICAgICAgIG1vdiAgICAgW2VieF0sZWR4ICAgICAgIDsgU3RvcmUgbG93IHBhcnQKLSAgICAgICAgbW92ICAgICBbZWJ4KzRdLGVheCAgICAgOyBTdG9yZSBoaWdoIHBhcnQKLSAgICAgICAgbW92ICAgICBlYXgsZWR4ICAgICAgICAgOyBSZXR1cm4gbG93IHBhcnQKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBSZXR1cm4gaW4gRFg6QVgKLWVuZGlmCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9DUFVfY2FsY01pY3JvU2VjKENQVV9sYXJnZUludGVnZXIgKmNvdW50LHVsb25nIGZyZXEpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ29tcHV0ZXMgdGhlIHZhbHVlIGluIG1pY3Jvc2Vjb25kcyBmb3IgdGhlIGVsYXBzZWQgdGltZSB3aXRoIG1heGltdW0KLTsgcHJlY2lzaW9uLiBUaGUgZm9ybXVsYSB3ZSB1c2UgaXM6Ci07Ci07ICAgdXMgPSAoKChkaWZmICogMHgxMDAwMDApIC8gZnJlcSkgKiAxMDAwMDAwKSAvIDB4MTAwMDAwKQotOwotOyBUaGUgcG93ZXIgb2YgdHdvIG11bHRpcGxlIGJlZm9yZSB0aGUgZmlyc3QgZGl2aWRlIGFsbG93cyB1cyB0byBzY2FsZSB0aGUKLTsgNjQtYml0IGRpZmZlcmVuY2UgdXNpbmcgc2ltcGxlIHNoaWZ0cywgYW5kIHRoZW4gdGhlIGRpdmlkZSBicmluZ3MgdGhlCi07IGZpbmFsIHJlc3VsdCBpbnRvIHRoZSByYW5nZSB0byBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfY2FsY01pY3JvU2VjCi0KLSAgICAgICAgQVJHICAgICBjb3VudDpEUFRSLCBmcmVxOlVMT05HCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZWN4LFtjb3VudF0KLSAgICAgICAgbW92ICAgICBlYXgsW2VjeF0gICAgICAgOyBFQVggOj0gbG93IHBhcnQKLSAgICAgICAgbW92ICAgICBlZHgsW2VjeCs0XSAgICAgOyBFRFggOj0gaGlnaCBwYXJ0Ci0gICAgICAgIHNobGQgICAgZWR4LGVheCwyMAotICAgICAgICBzaGwgICAgIGVheCwyMCAgICAgICAgICA7IGRpZmYgKiAweDEwMDAwMAotICAgICAgICBkaXYgICAgIFtEV09SRCBmcmVxXSAgICA7IChkaWZmICogMHgxMDAwMDApIC8gZnJlcQotICAgICAgICBtb3YgICAgIGVjeCwxMDAwMDAwCi0gICAgICAgIHhvciAgICAgZWR4LGVkeAotICAgICAgICBtdWwgICAgIGVjeCAgICAgICAgICAgICA7ICgoZGlmZiAqIDB4MTAwMDAwKSAvIGZyZXEpICogMTAwMDAwMCkKLSAgICAgICAgc2hyZCAgICBlYXgsZWR4LDIwICAgICAgOyAoKGRpZmYgKiAweDEwMDAwMCkgLyBmcmVxKSAqIDEwMDAwMDApIC8gMHgxMDAwMDAKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBSZXR1cm4gaW4gRFg6QVgKLWVuZGlmCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9DUFVfbXVsRGl2KHVsb25nIGEsdWxvbmcgYix1bG9uZyBjKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvbXB1dGVzIHRoZSBmb2xsb3dpbmcgd2l0aCA2NC1iaXQgaW50ZWdlciBwcmVjaXNpb246Ci07Ci07ICAgcmVzdWx0ID0gKGEgKiBiKSAvIGMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX211bERpdgotCi0gICAgICAgIEFSRyAgICAgYTpVTE9ORywgYjpVTE9ORywgYzpVTE9ORwotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBlYXgsW2FdCi0gICAgICAgIGltdWwgICAgW1VMT05HIGJdCi0gICAgICAgIGlkaXYgICAgW1VMT05HIGNdCi1pZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHNobGQgICAgZWR4LGVheCwxNiAgICAgIDsgUmV0dXJuIGluIERYOkFYCi1lbmRpZgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfY3B1aW5mbwotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19kbWEuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19kbWEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZlMWU4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fZG1hLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiAxNi8zMiBiaXQgUmluZyAwIGRldmljZSBkcml2ZXIKLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibGVyIHN1cHBvcnQgcm91dGluZXMgZm9yIElTQSBETUEgY29udHJvbGxlci4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9kbWEgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9kbWEgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBkYXRhIHNlZ21lbnQKLQotY3B1YmxpYyBfUE1fRE1BRGF0YVN0YXJ0Ci0KLTsgRE1BIHJlZ2lzdGVyIEkvTyBhZGRyZXNzZXMgZm9yIGNoYW5uZWxzIDAtNyAoZXhjZXB0IDQpCi0KLURNQUNfcGFnZSAgICAgICBkYiAwODdoLDA4M2gsMDgxaCwwODJoLCAtMSwwOEJoLDA4OWgsMDhBaAotRE1BQ19hZGRyICAgICAgIGRiIDAwMGgsMDAyaCwwMDRoLDAwNmgsIC0xLDBDNGgsMEM4aCwwQ0NoCi1ETUFDX2NudCAgICAgICAgZGIgMDAxaCwwMDNoLDAwNWgsMDA3aCwgLTEsMEM2aCwwQ0FoLDBDRWgKLURNQUNfbWFzayAgICAgICBkYiAwMEFoLDAwQWgsMDBBaCwwMEFoLCAtMSwwRDRoLDBENGgsMEQ0aAotRE1BQ19tb2RlICAgICAgIGRiIDAwQmgsMDBCaCwwMEJoLDAwQmgsIC0xLDBENmgsMEQ2aCwwRDZoCi1ETUFDX0ZGICAgICAgICAgZGIgMDBDaCwwMENoLDAwQ2gsMDBDaCwgLTEsMEQ4aCwwRDhoLDBEOGgKLQotY3B1YmxpYyBfUE1fRE1BRGF0YUVuZAotCi1lbmRkYXRhc2VnICBfZG1hCi0KLWJlZ2NvZGVzZWcgIF9kbWEgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotaWZkZWYgICBmbGF0bW9kZWwKLQotY3B1YmxpYyBfUE1fRE1BQ29kZVN0YXJ0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fRE1BQ0Rpc2FibGUoaW50IGNoYW5uZWwpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFza3MgRE1BIGNoYW5uZWwsIGluaGliaXRpbmcgRE1BIHRyYW5zZmVycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX0RNQUNEaXNhYmxlCi0KLSAgICAgICAgQVJHICAgICBjaGFubmVsOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlY3gsW2NoYW5uZWxdICAgICAgIDsgRUNYIGluZGV4ZXMgRE1BQyByZWdpc3RlciB0YWJsZXMKLSAgICAgICAgbW92ICAgICBkaCwwICAgICAgICAgICAgICAgIDsgREggPSAwIGZvciBETUFDIHJlZ2lzdGVyIHBvcnQgYWNjZXNzCi0gICAgICAgIG1vdiAgICAgYWwsY2wKLSAgICAgICAgYW5kICAgICBhbCwxMWIKLSAgICAgICAgb3IgICAgICBhbCwxMDBiICAgICAgICAgICAgIDsgQUwgPSAoY2hhbm5lbCAmIDMpIHwgInNldCBtYXNrIGJpdCIKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19tYXNrK2VjeF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9ETUFDRW5hYmxlKGludCBjaGFubmVsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFVubWFza3MgRE1BIGNoYW5uZWwsIGVuYWJsaW5nIERNQSB0cmFuc2ZlcnMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9ETUFDRW5hYmxlCi0KLSAgICAgICAgQVJHICAgICBjaGFubmVsOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlY3gsW2NoYW5uZWxdICAgICAgIDsgRUNYIGluZGV4ZXMgRE1BQyByZWdpc3RlciB0YWJsZXMKLSAgICAgICAgbW92ICAgICBkaCwwICAgICAgICAgICAgICAgIDsgREggPSAwIGZvciBETUFDIHJlZ2lzdGVyIHBvcnQgYWNjZXNzCi0gICAgICAgIG1vdiAgICAgYWwsY2wKLSAgICAgICAgYW5kICAgICBhbCwxMWIgICAgICAgICAgICAgIDsgQUwgPSAoY2hhbm5lbCAmIDMpLCAic2V0IG1hc2sgYml0Ij0wCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfbWFzaytlY3hdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fRE1BQ1Byb2dyYW0oaW50IGNoYW5uZWwsaW50IG1vZGUsdWxvbmcgYnVmZmVyUGh5cyxpbnQgY291bnQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUHVycG9zZTogUHJvZ3JhbSBETUEgY29udHJvbGxlciB0byBwZXJmb3JtIHRyYW5zZmVyIGZyb20gZmlyc3QgMTZNQgotOyBiYXNlZCBvbiBwcmV2aW91c2x5IHNlbGVjdGVkIG1vZGUgYW5kIGNoYW5uZWwuIERNQSB0cmFuc2ZlciBtYXkgYmUgZW5hYmxlZAotOyBieSBzdWJzZXF1ZW50IGNhbGwgdG8gUE1fRE1BQ0VuYWJsZS4KLTsKLTsgRW50cnk6ICAgIGNoYW5uZWwgLSBETUEgY2hhbm5lbCBpbiB1c2UgKDAtNykKLTsgICAgICAgICAgIG1vZGUgICAgLSBTZWxlY3RlZCBETUFNT0RFIHR5cGUgZm9yIHRyYW5zZmVyCi07ICAgICAgICAgICBidWZmZXIgIC0gMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRE1BIGJ1ZmZlcgotOyAgICAgICAgICAgY291bnQgICAtIERNQSBieXRlIGNvdW50ICgxLTY1NTM2IGJ5dGVzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX0RNQUNQcm9ncmFtCi0KLSAgICAgICAgQVJHICAgICBjaGFubmVsOlVJTlQsIG1vZGU6VUlOVCwgYnVmZmVyUGh5czpVTE9ORywgY291bnQ6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IERpc2FibGUgaW50ZXJydXB0cwotCi07IE1hc2sgRE1BIGNoYW5uZWwgdG8gZGlzYWJsZSBpdAotCi0gICAgICAgIG1vdiAgICAgZWJ4LFtjaGFubmVsXSAgICAgICA7IEVCWCBpbmRleGVzIERNQUMgcmVnaXN0ZXIgdGFibGVzCi0gICAgICAgIG1vdiAgICAgZGgsMCAgICAgICAgICAgICAgICA7IERIID0gMCBmb3IgRE1BQyByZWdpc3RlciBwb3J0IGFjY2VzcwotICAgICAgICBtb3YgICAgIGFsLGJsCi0gICAgICAgIGFuZCAgICAgYWwsMTFiCi0gICAgICAgIG9yICAgICAgYWwsMTAwYiAgICAgICAgICAgICA7IEFMID0gKGNoYW5uZWwgJiAzKSB8ICJzZXQgbWFzayBiaXQiCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfbWFzaytlYnhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLQotOyBHZW5lcmF0ZSBJT1cgdG8gY2xlYXIgRkYgdG9nZ2xlIHN0YXRlCi0KLSAgICAgICAgbW92ICAgICBhbCwwCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfRkYrZWJ4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0KLTsgQ29tcHV0ZSBidWZmZXIgYWRkcmVzcyB0byBwcm9ncmFtCi0KLSAgICAgICAgbW92ICAgICBlYXgsW2J1ZmZlclBoeXNdICAgIDsgQVggOj0gRE1BIGFkZHJlc3Mgb2Zmc2V0Ci0gICAgICAgIG1vdiAgICAgZWN4LGVheAotICAgICAgICBzaHIgICAgIGVjeCwxNiAgICAgICAgICAgICAgOyBDTCA6PSBidWZmZXJQaHlzID4+IDE2IChETUEgcGFnZSkKLSAgICAgICAgbW92ICAgICBlc2ksW2NvdW50XSAgICAgICAgIDsgRVNJID0gIyBvZiBieXRlcyB0byB0cmFuc2ZlcgotICAgICAgICBjbXAgICAgIGVieCw0ICAgICAgICAgICAgICAgOyAxNi1iaXQgY2hhbm5lbD8KLSAgICAgICAgamIgICAgICBAQFdyaXRlRE1BQyAgICAgICAgIDsgTm8sIHByb2dyYW0gRE1BQwotICAgICAgICBzaHIgICAgIGVheCwxICAgICAgICAgICAgICAgOyBZZXMsIGNvbnZlcnQgYWRkcmVzcyBhbmQgY291bnQKLSAgICAgICAgc2hyICAgICBlc2ksMSAgICAgICAgICAgICAgIDsgdG8gMTYtYml0LCAxMjhLL3BhZ2UgZm9ybWF0Ci0KLTsgU2V0IHRoZSBETUEgYWRkcmVzcyB3b3JkIChiaXRzIDAtMTUpCi0KLUBAV3JpdGVETUFDOgotICAgICAgICBtb3YgICAgIGRsLFtETUFDX2FkZHIrZWJ4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIG1vdiAgICAgYWwsYWgKLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi07IFNldCBETUEgdHJhbnNmZXIgY291bnQKLQotICAgICAgICBtb3YgICAgIGVheCxlc2kKLSAgICAgICAgZGVjICAgICBlYXggICAgICAgICAgICAgICAgIDsgRVNJID0gIyBvZiBieXRlcyB0byB0cmFuc2ZlciAtIDEKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19jbnQrZWJ4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIG1vdiAgICAgYWwsYWgKLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi07IFNldCBETUEgcGFnZSBieXRlIChiaXRzIDE2LTIzKQotCi0gICAgICAgIG1vdiAgICAgYWwsY2wKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19wYWdlK2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi07IFNldCB0aGUgRE1BIGNoYW5uZWwgbW9kZQotCi0gICAgICAgIG1vdiAgICAgYWwsYmwKLSAgICAgICAgYW5kICAgICBhbCwxMWIKLSAgICAgICAgb3IgICAgICBhbCxbQllURSBtb2RlXSAgICAgIDsgRUFYID0gKGNoYW5uZWwgJiAzKSB8IG1vZGUKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19tb2RlK2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IFNNUCBzYWZlIGludGVycnVwdCBzdGF0ZSByZXN0b3JlIQotICAgICAgICB0ZXN0ICAgIGVheCwyMDBoCi0gICAgICAgIGp6ICAgICAgQEAxCi0gICAgICAgIHN0aQotQEAxOiAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBQTUFQSSBQTV9ETUFDUG9zaXRpb24oaW50IGNoYW5uZWwpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBhIGRtYSB0cmFuc2Zlci4gSW50ZXJydXB0cyBzaG91bGQgYmUKLTsgZGlzYWJsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9ETUFDUG9zaXRpb24KLQotICAgICAgICBBUkcgICAgIGNoYW5uZWw6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBlY3gsW2NoYW5uZWxdICAgICAgIDsgRUNYIGluZGV4ZXMgRE1BQyByZWdpc3RlciB0YWJsZXMKLSAgICAgICAgbW92ICAgICBkaCwwICAgICAgICAgICAgICAgIDsgREggPSAwIGZvciBETUFDIHJlZ2lzdGVyIHBvcnQgYWNjZXNzCi0KLTsgR2VuZXJhdGUgSU9XIHRvIGNsZWFyIEZGIHRvZ2dsZSBzdGF0ZQotCi0gICAgICAgIG1vdiAgICAgYWwsMAotICAgICAgICBtb3YgICAgIGRsLFtETUFDX0ZGK2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgeG9yICAgICBlY3gsZWN4Ci0KLTsgTm93IHJlYWQgdGhlIGN1cnJlbnQgcG9zaXRpb24gZm9yIHRoZSBjaGFubmVsCi0KLUBAUmVhZExvb3A6Ci0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfY250K2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIG1vdiAgICAgY2wsYWwKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBtb3YgICAgIGNoLGFsICAgICAgICAgICAgICAgOyBFQ1ggOj0gZmlyc3QgY291bnQgcmVhZAotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIG1vdiAgICAgYWgsYWwKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICB4Y2hnICAgIGFsLGFoICAgICAgICAgICAgICAgOyBFQVggOj0gc2Vjb25kIGNvdW50IHJlYWQKLSAgICAgICAgc3ViICAgICBlY3gsZWF4Ci0gICAgICAgIGNtcCAgICAgZWN4LDQwaAotICAgICAgICBqZyAgICAgIEBAUmVhZExvb3AKLSAgICAgICAgY21wICAgICBlYngsNCAgICAgICAgICAgICAgIDsgMTYtYml0IGNoYW5uZWw/Ci0gICAgICAgIGpiICAgICAgQEBFeGl0ICAgICAgICAgICAgICA7IE5vLCB3ZSBhcmUgZG9uZQotICAgICAgICBzaGwgICAgIGVheCwxICAgICAgICAgICAgICAgOyBZZXMsIGFkanVzdCB0byBieXRlIGFkZHJlc3MKLQotQEBFeGl0OiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi0KLWNwdWJsaWMgX1BNX0RNQUNvZGVFbmQKLQotZW5kaWYKLQotZW5kY29kZXNlZyAgX2RtYQotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19pbnQ2NC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2ludDY0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlYzFiNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2ludDY0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBOQVNNIG9yIFRBU00gQXNzZW1ibGVyCi07KiBFbnZpcm9ubWVudDogSW50ZWwgMzIgYml0IFByb3RlY3RlZCBNb2RlLgotOyoKLTsqIERlc2NyaXB0aW9uOiBDb2RlIGZvciA2NC1iaXQgYXJoaXRobWV0aWMKLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIgotCi1oZWFkZXIgICAgICBfaW50NjQKLQotYmVnY29kZXNlZyAgX2ludDY0ICAgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotYV9sb3cgICAgICAgRVFVIDA0aCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgYV9sb3cgZGlyZWN0bHkgb24gc3RhY2sKLWFfaGlnaCAgICAgIEVRVSAwOGggICAgICAgICAgICAgICAgIDsgQWNjZXNzIGFfaGlnaCBkaXJlY3RseSBvbiBzdGFjawotYl9sb3cgICAgICAgRVFVIDBDaCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgYl9sb3cgZGlyZWN0bHkgb24gc3RhY2sKLXNoaWZ0ICAgICAgIEVRVSAwQ2ggICAgICAgICAgICAgICAgIDsgQWNjZXNzIHNoaWZ0IGRpcmVjdGx5IG9uIHN0YWNrCi1yZXN1bHRfMiAgICBFUVUgMENoICAgICAgICAgICAgICAgICA7IEFjY2VzcyByZXN1bHQgZGlyZWN0bHkgb24gc3RhY2sKLWJfaGlnaCAgICAgIEVRVSAxMGggICAgICAgICAgICAgICAgIDsgQWNjZXNzIGJfaGlnaCBkaXJlY3RseSBvbiBzdGFjawotcmVzdWx0XzMgICAgRVFVIDEwaCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgcmVzdWx0IGRpcmVjdGx5IG9uIHN0YWNrCi1yZXN1bHRfNCAgICBFUVUgMTRoICAgICAgICAgICAgICAgICA7IEFjY2VzcyByZXN1bHQgZGlyZWN0bHkgb24gc3RhY2sKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fYWRkNjQodTMyIGFfbG93LHUzMiBhX2hpZ2gsdTMyIGJfbG93LHUzMiBiX2hpZ2gsX191NjQgKnJlc3VsdCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBBZGRzIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fYWRkNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBhZGQgICAgIGVheCxbZXNwK2JfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgYWRjICAgICBlZHgsW2VzcCtiX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzRdCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3N1YjY0KHUzMiBhX2xvdyx1MzIgYV9oaWdoLHUzMiBiX2xvdyx1MzIgYl9oaWdoLF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU3VidHJhY3RzIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc3ViNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBzdWIgICAgIGVheCxbZXNwK2JfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgc2JiICAgICBlZHgsW2VzcCtiX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzRdCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX211bDY0KHUzMiBhX2hpZ2gsdTMyIGFfbG93LHUzMiBiX2hpZ2gsdTMyIGJfbG93LF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTXVsdGlwbGVzIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fbXVsNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfaGlnaF0KLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtiX2hpZ2hdCi0gICAgICAgIG9yICAgICAgZWN4LGVheAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK2JfbG93XQotICAgICAgICBqbnogICAgIEBARnVsbE11bHRpcGx5Ci0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYV9sb3ddICAgICAgICAgOyBFRFg6RUFYID0gYi5sb3cgKiBhLmxvdwotICAgICAgICBtdWwgICAgIGVjeAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF80XQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1AQEZ1bGxNdWx0aXBseToKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgbXVsICAgICBlY3ggICAgICAgICAgICAgICAgICAgICA7IEVEWDpFQVggPSBhLmhpZ2ggKiBiLmxvdwotICAgICAgICBtb3YgICAgIGVieCxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdys0XQotICAgICAgICBtdWwgICAgIFtEV09SRCBlc3ArYl9oaWdoKzRdICAgIDsgRURYOkVBWCA9IGIuaGlnaCAqIGEubG93Ci0gICAgICAgIGFkZCAgICAgZWJ4LGVheAotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93KzRdCi0gICAgICAgIG11bCAgICAgZWN4ICAgICAgICAgICAgICAgICAgICAgOyBFRFg6RUFYID0gYS5sb3cgKiBiLmxvdwotICAgICAgICBhZGQgICAgIGVkeCxlYngKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfNF0KLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fZGl2NjQodTMyIGFfbG93LHUzMiBhX2hpZ2gsdTMyIGJfbG93LHUzMiBiX2hpZ2gsX191NjQgKnJlc3VsdCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEaXZpZGVzIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fZGl2NjQKLQotICAgICAgICBwdXNoICAgIGVkaQotICAgICAgICBwdXNoICAgIGVzaQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICB4b3IgICAgIGVkaSxlZGkKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2hpZ2grMENoXQotICAgICAgICBvciAgICAgIGVheCxlYXgKLSAgICAgICAgam5zICAgICBAQEFOb3ROZWcKLQotOyBEaXZpZGVuZCBpcyBuZWdhdGl2ZSwgc28gbmVnYXRlIGl0IGFuZCBzYXZlIHJlc3VsdCBmb3IgbGF0ZXIKLQotICAgICAgICBpbmMgICAgIGVkaQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfbG93KzBDaF0KLSAgICAgICAgbmVnICAgICBlYXgKLSAgICAgICAgbmVnICAgICBlZHgKLSAgICAgICAgc2JiICAgICBlYXgsMAotICAgICAgICBtb3YgICAgIFtlc3ArYV9oaWdoKzBDaF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VzcCthX2xvdyswQ2hdLGVkeAotCi1AQEFOb3ROZWc6Ci0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYl9oaWdoKzBDaF0KLSAgICAgICAgb3IgICAgICBlYXgsZWF4Ci0gICAgICAgIGpucyAgICAgQEBCTm90TmVnCi0KLTsgRGl2aXNvciBpcyBuZWdhdGl2ZSwgc28gbmVnYXRlIGl0IGFuZCBzYXZlIHJlc3VsdCBmb3IgbGF0ZXIKLQotICAgICAgICBpbmMgICAgIGVkaQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2JfbG93KzBDaF0KLSAgICAgICAgbmVnICAgICBlYXgKLSAgICAgICAgbmVnICAgICBlZHgKLSAgICAgICAgc2JiICAgICBlYXgsMAotICAgICAgICBtb3YgICAgIFtlc3ArYl9oaWdoKzBDaF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VzcCtiX2xvdyswQ2hdLGVkeAotCi1AQEJOb3ROZWc6Ci0gICAgICAgIG9yICAgICAgZWF4LGVheAotICAgICAgICBqbnogICAgIEBAQkhpZ2hOb3RaZXJvCi0KLTsgYi5oaWdoIGlzIHplcm8sIHNvIGhhbmRsZSB0aGlzIGZhc3RlcgotCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArYl9sb3crMENoXQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfaGlnaCswQ2hdCi0gICAgICAgIHhvciAgICAgZWR4LGVkeAotICAgICAgICBkaXYgICAgIGVjeAotICAgICAgICBtb3YgICAgIGVieCxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdyswQ2hdCi0gICAgICAgIGRpdiAgICAgZWN4Ci0gICAgICAgIG1vdiAgICAgZWR4LGVieAotICAgICAgICBqbXAgICAgIEBAQkhpZ2haZXJvCi0KLUBAQkhpZ2hOb3RaZXJvOgotICAgICAgICBtb3YgICAgIGVieCxlYXgKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtiX2xvdyswQ2hdCi0gICAgICAgIG1vdiAgICAgZWR4LFtlc3ArYV9oaWdoKzBDaF0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdyswQ2hdCi0KLTsgU2hpZnQgdmFsdWVzIHJpZ2h0IHVudGlsIGIuaGlnaCBiZWNvbWVzIHplcm8KLQotQEBTaGlmdExvb3A6Ci0gICAgICAgIHNociAgICAgZWJ4LDEKLSAgICAgICAgcmNyICAgICBlY3gsMQotICAgICAgICBzaHIgICAgIGVkeCwxCi0gICAgICAgIHJjciAgICAgZWF4LDEKLSAgICAgICAgb3IgICAgICBlYngsZWJ4Ci0gICAgICAgIGpueiAgICAgQEBTaGlmdExvb3AKLQotOyBOb3cgY29tcGxldGUgdGhlIGRpdmlkZSBwcm9jZXNzCi0KLSAgICAgICAgZGl2ICAgICBlY3gKLSAgICAgICAgbW92ICAgICBlc2ksZWF4Ci0gICAgICAgIG11bCAgICAgW0RXT1JEIGVzcCtiX2hpZ2grMENoXQotICAgICAgICBtb3YgICAgIGVjeCxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCtiX2xvdyswQ2hdCi0gICAgICAgIG11bCAgICAgZXNpCi0gICAgICAgIGFkZCAgICAgZWR4LGVjeAotICAgICAgICBqYiAgICAgIEBAOAotICAgICAgICBjbXAgICAgIGVkeCxbZXNwK2FfaGlnaCswQ2hdCi0gICAgICAgIGphICAgICAgQEA4Ci0gICAgICAgIGpiICAgICAgQEA5Ci0gICAgICAgIGNtcCAgICAgZWF4LFtlc3ArYV9sb3crMENoXQotICAgICAgICBqYmUgICAgIEBAOQotQEA4OiAgICBkZWMgICAgIGVzaQotQEA5OiAgICB4b3IgICAgIGVkeCxlZHgKLSAgICAgICAgbW92ICAgICBlYXgsZXNpCi0KLUBAQkhpZ2haZXJvOgotICAgICAgICBkZWMgICAgIGVkaQotICAgICAgICBqbnogICAgIEBARG9uZQotCi07IFRoZSByZXN1bHQgbmVlZHMgdG8gYmUgbmVnYXRlZCBhcyBlaXRoZXIgYSBvciBiIHdhcyBuZWdhdGl2ZQotCi0gICAgICAgIG5lZyAgICAgZWR4Ci0gICAgICAgIG5lZyAgICAgZWF4Ci0gICAgICAgIHNiYiAgICAgZWR4LDAKLQotQEBEb25lOiBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVzaQotICAgICAgICBwb3AgICAgIGVkaQotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF80XQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfX2k2NCBfUE1fc2hyNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIHJpZ2h0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3NocjY0Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvd10KLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgY2wsW2VzcCtzaGlmdF0KLSAgICAgICAgc2hyZCAgICBlZHgsZWF4LGNsCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzNdCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9faTY0IF9QTV9zYXI2NCh1MzIgYV9sb3csczMyIGFfaGlnaCxzMzIgc2hpZnQsX191NjQgKnJlc3VsdCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTaGlmdCBhIDY0LWJpdCBudW1iZXIgcmlnaHQgKHNpZ25lZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc2FyNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgbW92ICAgICBjbCxbZXNwK3NoaWZ0XQotICAgICAgICBzYXIgICAgIGVkeCxjbAotICAgICAgICByY3IgICAgIGVheCxjbAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF8zXQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfX2k2NCBfUE1fc2hsNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIGxlZnQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc2hsNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgbW92ICAgICBjbCxbZXNwK3NoaWZ0XQotICAgICAgICBzaGxkICAgIGVkeCxlYXgsY2wKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfM10KLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX19pNjQgX1BNX25lZzY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIGxlZnQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fbmVnNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgbmVnICAgICBlYXgKLSAgICAgICAgbmVnICAgICBlZHgKLSAgICAgICAgc2JiICAgICBlYXgsMAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF8yXQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi0KLWVuZGNvZGVzZWcgIF9pbnQ2NAotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19qb3kuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19qb3kuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYxZWNmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fam95LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBJbnRlbCB4ODYsIGFueSBPUwotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJseSBsYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIGZvciByZWFkaW5nIGFuYWxvZ3VlCi07KiAgICAgICAgICAgICAgam95c3RpY2tzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgaWRlYWwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaWZkZWYgZmxhdG1vZGVsCi0KLWhlYWRlciAgX2pveSAgICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2NvZGVzZWcgIF9qb3kgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW5pdFRpbWVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTZXRzIHVwIDgyNTMgdGltZXIgMiAoUEMgc3BlYWtlcikgdG8gc3RhcnQgdGltaW5nLCBidXQgbm90IHByb2R1Y2Ugb3V0cHV0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljIGluaXRUaW1lcgotCi07IFN0YXJ0IHRpbWVyIDIgY291bnRpbmcKLQotICAgICAgICBpbiAgICAgIGFsLDYxaAotICAgICAgICBhbmQgICAgIGFsLDBGRGggICAgICAgICAgICAgOyBEaXNhYmxlIHNwZWFrZXIgb3V0cHV0IChqdXN0IGluIGNhc2UpCi0gICAgICAgIG9yICAgICAgYWwsMQotICAgICAgICBvdXQgICAgIDYxaCxhbAotCi07IFNldCB0aGUgdGltZXIgMiBjb3VudCB0byAwIGFnYWluIHRvIHN0YXJ0IHRoZSB0aW1pbmcgaW50ZXJ2YWwuCi0KLSAgICAgICAgbW92ICAgICBhbCwxMDExMDEwMGIgICAgICAgIDsgc2V0IHVwIHRvIGxvYWQgaW5pdGlhbCAodGltZXIgMikKLSAgICAgICAgb3V0ICAgICA0M2gsYWwgICAgICAgICAgICAgIDsgdGltZXIgY291bnQKLSAgICAgICAgc3ViICAgICBhbCxhbAotICAgICAgICBvdXQgICAgIDQyaCxhbCAgICAgICAgICAgICAgOyBsb2FkIGNvdW50IGxzYgotICAgICAgICBvdXQgICAgIDQyaCxhbCAgICAgICAgICAgICAgOyBsb2FkIGNvdW50IG1zYgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgcmVhZFRpbWVyMgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgdGhlIG51bWJlciBvZiB0aWNrcyBmcm9tIHRoZSA4MjUzIHRpbWVyIGNoaXAgdXNpbmcgY2hhbm5lbCAyIChQQwotOyBzcGVha2VyKS4gVGhpcyBpcyBub24tZGVzdHJ1Y3RpdmUgYW5kIGRvZXMgbm90IHNjcmV3IHVwIG90aGVyIGxpYnJhcmllcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXRpYyByZWFkVGltZXIKLQotICAgICAgICB4b3IgICAgIGFsLGFsICAgICAgICAgICAgICAgOyBMYXRjaCB0aW1lciAwIGNvbW1hbmQKLSAgICAgICAgb3V0ICAgICA0M2gsYWwgICAgICAgICAgICAgIDsgTGF0Y2ggdGltZXIKLSAgICAgICAgaW4gICAgICBhbCw0MmggICAgICAgICAgICAgIDsgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIGluICAgICAgYWwsNDJoICAgICAgICAgICAgICA7IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICB4Y2hnICAgIGFoLGFsCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGaAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgZXhpdFRpbWVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTdG9wcyB0aGUgODI1MyB0aW1lciAyIChQQyBzcGVha2VyKSBjb3VudGluZwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljIGV4aXRUaW1lcgotCi07IFN0b3AgdGltZXIgMiBmcm9tIGNvdW50aW5nCi0KLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgaW4gICAgICBhbCw2MWgKLSAgICAgICAgYW5kICAgICBhbCwwRkVoCi0gICAgICAgIG91dCAgICAgNjFoLGFsCi0gICAgICAgIAotOyBTb21lIHByb2dyYW1zIGhhdmUgYSBwcm9ibGVtIGlmIHdlIGNoYW5nZSB0aGUgY29udHJvbCBwb3J0OyBiZXR0ZXIgY2hhbmdlIGl0Ci07IHRvIHNvbWV0aGluZyB0aGV5IGV4cGVjdCAobW9kZSAzIC0gc3F1YXJlIHdhdmUgZ2VuZXJhdG9yKS4uLgotICAgICAgICBtb3YgICAgIGFsLDBCNmgKLSAgICAgICAgb3V0ICAgICA0M2gsYWwKLSAgICAgICAgCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX0VWVF9yZWFkSm95QXhpcyhpbnQgam1hc2ssaW50ICpheGlzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZ1bmN0aW9uIHRvIHBvbGwgdGhlIGpveXN0aWNrIHRvIHJlYWQgdGhlIGN1cnJlbnQgYXhpcyBwb3NpdGlvbnMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9yZWFkSm95QXhpcwotCi0gICAgICAgIEFSRyAgICAgam1hc2s6VUlOVCwgYXhpczpEUFRSCi0KLSAgICAgICAgTE9DQUwgICBmaXJzdFRpY2s6VUlOVCwgbGFzdFRpY2s6VUlOVCwgdG90YWxUaWNrczpVSU5UID0gTG9jYWxTaXplCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZWJ4LFtqbWFza10KLSAgICAgICAgbW92ICAgICBlZGksW2F4aXNdCi0gICAgICAgIG1vdiAgICAgZWN4LCgxMTkzMTgwLzEwMCkKLSAgICAgICAgYW5kICAgICBlYngsMDExMTFiICAgICAgICAgIDsgTWFzayBvdXQgc3VwcG9ydGVkIGF4ZXMKLSAgICAgICAgbW92ICAgICBkeCwyMDFoICAgICAgICAgICAgIDsgRFggOj0gam95c3RpY2sgSS9PIHBvcnQKLSAgICAgICAgY2FsbCAgICBpbml0VGltZXIgICAgICAgICAgIDsgU3RhcnQgdGltZXIgMiBjb3VudGluZwotICAgICAgICBjYWxsICAgIHJlYWRUaW1lciAgICAgICAgICAgOyBSZXR1cm5zIGNvdW50ZXIgaW4gRUFYCi0gICAgICAgIG1vdiAgICAgW2xhc3RUaWNrXSxlYXgKLQotQEBXYWl0U3RhYmxlOgotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIGFuZCAgICAgYWwsYmwgICAgICAgICAgICAgICA7IFdhaXQgZm9yIHRoZSBheGVzIGluIHF1ZXN0aW9uIHRvIGJlCi0gICAgICAgIGp6ICAgICAgQEBTdGFibGUgICAgICAgICAgICA7ICBkb25lIHJlYWRpbmcuLi4KLSAgICAgICAgY2FsbCAgICByZWFkVGltZXIgICAgICAgICAgIDsgUmV0dXJucyBjb3VudGVyIGluIEVBWAotICAgICAgICB4Y2hnICAgIGVheCxbbGFzdFRpY2tdCi0gICAgICAgIGNtcCAgICAgZWF4LFtsYXN0VGlja10KLSAgICAgICAgamIgICAgICBAQDEKLSAgICAgICAgc3ViICAgICBlYXgsW2xhc3RUaWNrXQotQEAxOiAgICBhZGQgICAgIFt0b3RhbFRpY2tzXSxlYXgKLSAgICAgICAgY21wICAgICBbdG90YWxUaWNrc10sZWN4ICAgIDsgQ2hlY2sgZm9yIHRpbWVvdXQKLSAgICAgICAgamFlICAgICBAQFN0YWJsZQotICAgICAgICBqbXAgICAgIEBAV2FpdFN0YWJsZQotCi1AQFN0YWJsZToKLSAgICAgICAgbW92ICAgICBhbCwwRkZoCi0gICAgICAgIG91dCAgICAgZHgsYWwgICAgICAgICAgICAgICA7IFN0YXJ0IGpveXN0aWNrIHJlYWRpbmcKLSAgICAgICAgY2FsbCAgICBpbml0VGltZXIgICAgICAgICAgIDsgU3RhcnQgdGltZXIgMiBjb3VudGluZwotICAgICAgICBjYWxsICAgIHJlYWRUaW1lciAgICAgICAgICAgOyBSZXR1cm5zIGNvdW50ZXIgaW4gRUFYCi0gICAgICAgIG1vdiAgICAgW2ZpcnN0VGlja10sZWF4ICAgICA7IFN0b3JlIGluaXRpYWwgY291bnQKLSAgICAgICAgbW92ICAgICBbbGFzdFRpY2tdLGVheAotICAgICAgICBtb3YgICAgIFtEV09SRCB0b3RhbFRpY2tzXSwwCi0gICAgICAgIGNsaQotCi1AQFBvbGxMb29wOgotICAgICAgICBpbiAgICAgIGFsLGR4ICAgICAgICAgICAgICAgOyBSZWFkIEpveXN0aWNrIHBvcnQKLSAgICAgICAgbm90ICAgICBhbAotICAgICAgICBhbmQgICAgIGFsLGJsICAgICAgICAgICAgICAgOyBNYXNrIG9mZiBjaGFubmVscyB3ZSBkb24ndCB3YW50IHRvIHJlYWQKLSAgICAgICAgam56ICAgICBAQEF4aXNGbGlwcGVkICAgICAgIDsgU2VlIGlmIGFueSBvZiB0aGUgY2hhbm5lbHMgZmxpcHBlZAotICAgICAgICBjYWxsICAgIHJlYWRUaW1lciAgICAgICAgICAgOyBSZXR1cm5zIGNvdW50ZXIgaW4gRUFYCi0gICAgICAgIHhjaGcgICAgZWF4LFtsYXN0VGlja10KLSAgICAgICAgY21wICAgICBlYXgsW2xhc3RUaWNrXQotICAgICAgICBqYiAgICAgIEBAMgotICAgICAgICBzdWIgICAgIGVheCxbbGFzdFRpY2tdCi1AQDI6ICAgIGFkZCAgICAgW3RvdGFsVGlja3NdLGVheAotICAgICAgICBjbXAgICAgIFt0b3RhbFRpY2tzXSxlY3ggICAgOyBDaGVjayBmb3IgdGltZW91dAotICAgICAgICBqYWUgICAgIEBAVGltZWRPdXQKLSAgICAgICAgam1wICAgICBAQFBvbGxMb29wCi0KLUBAQXhpc0ZsaXBwZWQ6Ci0gICAgICAgIHhvciAgICAgZXNpLGVzaQotICAgICAgICBtb3YgICAgIGFoLDEKLSAgICAgICAgdGVzdCAgICBhbCxhaAotICAgICAgICBqbnogICAgIEBAU3RvcmVDb3VudCAgICAgICAgOyBKb3lzdGljayAxLCBYIGF4aXMgZmxpcHBlZAotICAgICAgICBhZGQgICAgIGVzaSw0Ci0gICAgICAgIG1vdiAgICAgYWgsMgotICAgICAgICB0ZXN0ICAgIGFsLGFoCi0gICAgICAgIGpueiAgICAgQEBTdG9yZUNvdW50ICAgICAgICA7IEpveXN0aWNrIDEsIFkgYXhpcyBmbGlwcGVkCi0gICAgICAgIGFkZCAgICAgZXNpLDQKLSAgICAgICAgbW92ICAgICBhaCw0Ci0gICAgICAgIHRlc3QgICAgYWwsYWgKLSAgICAgICAgam56ICAgICBAQFN0b3JlQ291bnQgICAgICAgIDsgSm95c3RpY2sgMiwgWCBheGlzIGZsaXBwZWQKLSAgICAgICAgYWRkICAgICBlc2ksNCAgICAgICAgICAgICAgIDsgSm95c3RpY2sgMiwgWSBheGlzIGZsaXBwZWQKLSAgICAgICAgbW92ICAgICBhaCw4Ci0KLUBAU3RvcmVDb3VudDoKLSAgICAgICAgb3IgICAgICBiaCxhaCAgICAgICAgICAgICAgIDsgSW5kaWNhdGUgdGhpcyBheGlzIGlzIGFjdGl2ZQotICAgICAgICB4b3IgICAgIGJsLGFoICAgICAgICAgICAgICAgOyBVbm1hcmsgdGhlIGNoYW5uZWxzIHRoYXQganVzdCB0cmlwcGVkCi0gICAgICAgIGNhbGwgICAgcmVhZFRpbWVyICAgICAgICAgICA7IFJldHVybnMgY291bnRlciBpbiBFQVgKLSAgICAgICAgeGNoZyAgICBlYXgsW2xhc3RUaWNrXQotICAgICAgICBjbXAgICAgIGVheCxbbGFzdFRpY2tdCi0gICAgICAgIGpiICAgICAgQEAzCi0gICAgICAgIHN1YiAgICAgZWF4LFtsYXN0VGlja10KLUBAMzogICAgYWRkICAgICBbdG90YWxUaWNrc10sZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LFt0b3RhbFRpY2tzXQotICAgICAgICBtb3YgICAgIFtlZGkrZXNpXSxlYXggICAgICAgOyBSZWNvcmQgdGhlIHRpbWUgdGhpcyBjaGFubmVsIGZsaXBwZWQKLSAgICAgICAgY21wICAgICBibCwwICAgICAgICAgICAgICAgIDsgSWYgdGhlcmUgYXJlIG1vcmUgY2hhbm5lbHMgdG8gcmVhZCwKLSAgICAgICAgam5lICAgICBAQFBvbGxMb29wICAgICAgICAgIDsgICBrZWVwIGxvb3BpbmcKLQotQEBUaW1lZE91dDoKLSAgICAgICAgc3RpCi0gICAgICAgIGNhbGwgICAgZXhpdFRpbWVyICAgICAgICAgICA7IFN0b3AgdGltZXIgMiBjb3VudGluZwotICAgICAgICBtb3Z6eCAgIGVheCxiaCAgICAgICAgICAgICAgOyBSZXR1cm4gdGhlIG1hc2sgb2Ygd29ya2luZyBheGVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfRVZUX3JlYWRKb3lCdXR0b25zKHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRnVuY3Rpb24gdG8gcG9sbCB0aGUgY3VycmVudCBqb3lzdGljayBidXR0b25zCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9yZWFkSm95QnV0dG9ucwotCi0gICAgICAgIG1vdiAgICAgZHgsMDIwMWgKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBzaHIgICAgIGFsLDQKLSAgICAgICAgbm90ICAgICBhbAotICAgICAgICBhbmQgICAgIGVheCwwRmgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9qb3kKLQotZW5kaWYKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX210cnIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19tdHJyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwYTY5Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX210cnIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IDE2LzMyIGJpdCBSaW5nIDAgZGV2aWNlIGRyaXZlcgotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJsZXIgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyCi07KiAgICAgICAgICAgICAgKE1UUlIpIG1vZHVsZS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9tdHJyICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9tdHJyCi0KLWlmZGVmICAgRE9TNEdXCi0gICAgY2V4dGVybiBfUE1faGF2ZUNhdXNlV2F5LFVJTlQKLWVuZGlmCi0KLWVuZGRhdGFzZWcgIF9tdHJyCi0KLWJlZ2NvZGVzZWcgIF9tdHJyICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotUDU4NgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpYm9vbCBfTVRSUl9pc1JpbmcwKHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBhdCByaW5nIDAuIFRoaXMgY2hlY2sgaXMgb25seSByZWxldmFudAotOyBmb3IgMzItYml0IERPUzRHVyBhbmQgY29tcGF0aWJsZSBwcm9ncmFtcy4gSWYgd2UgYXJlIG5vdCBydW5uaW5nIHVuZGVyCi07IERPUzRHVywgdGhlbiB3ZSBzaW1wbHkgYXNzdW1lIHdlIGFyZSBhIHJpbmcgMCBkZXZpY2UgZHJpdmVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jbmVhciAgIF9NVFJSX2lzUmluZzAKLQotOyBBcmUgd2UgcnVubmluZyB1bmRlciBDYXVzZVdheT8KLQotaWZkZWYgICBET1M0R1cKLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIGFuZCAgICAgZWF4LDMKLSAgICAgICAgeG9yICAgICBlYXgsMwotICAgICAgICBqbnogICAgIEBARXhpdAotCi07IENhdXNlV2F5IHJ1bnMgdGhlIGFwcHMgYXQgcmluZyAzLCBidXQgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBzcGVjaWZpYwotOyByaW5nIDAgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UgbmVlZCB0byBnZXQgc3R1ZmYgZG9uZSB1bmRlciByZWFsIERPUy4KLQotICAgICAgICBtb3YgICAgIGVheCwxCi0gICAgICAgIGNtcCAgICAgW1VJTlQgX1BNX2hhdmVDYXVzZVdheV0sMAotICAgICAgICBqbnogICAgIEBARXhpdAotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLUBARXhpdDogbGVhdmVfYwotICAgICAgICByZXQKLWVsc2UKLWlmZGVmIF9fU01YMzJfXwotICAgICAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgICAgIDsgU01YIGlzIHJpbmcgMCEKLSAgICAgICAgcmV0Ci1lbHNlCi1pZmRlZiBfX1ZYRF9fCi0gICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICAgICAgOyBWeEQgaXMgcmluZyAwIQotICAgICAgICByZXQKLWVsc2UKLWlmZGVmIF9fTlRfRFJJVkVSX18KLSAgICAgICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgICAgICA7IE5UL1cySyBpcyByaW5nIDAhCi0gICAgICAgIHJldAotZWxzZQotZWxzZQotICAgICAgICB4b3IgICAgIGVheCxlYXggICAgICAgICAgICAgICAgIDsgQXNzdW1lIHJpbmcgMyBmb3IgMzItYml0IERPUwotICAgICAgICByZXQKLWVuZGlmCi1lbmRpZgotZW5kaWYKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9NVFJSX2Rpc2FibGVJbnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9kaXNhYmxlSW50Ci0KLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXQgZmxhZyB3b3JkIG9uIHN0YWNrCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIQotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGRlcG9zaXQgZmxhZyB3b3JkIGluIHJldHVybiByZWdpc3RlcgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfTVRSUl9yZXN0b3JlSW50KHVsb25nIHBzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlc3RvcmUgcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfcmVzdG9yZUludAotCi0gICAgICAgIEFSRyAgICAgcHM6VUxPTkcKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AgICAgICAgICA7IFNldCB1cCBzdGFjayBmcmFtZQotICAgICAgICBtb3YgICAgIGVjeCxbcHNdCi0gICAgICAgIHRlc3QgICAgZWN4LDIwMGggICAgICAgIDsgU01QIHNhZmUgaW50ZXJydXB0IGZsYWcgcmVzdG9yZSEKLSAgICAgICAganogICAgICBAQDEKLSAgICAgICAgc3RpCi1AQDE6ICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfTVRSUl9zYXZlQ1I0KHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2F2ZSB0aGUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciB0aGUgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykuIFdlIGFsc28KLTsgZGlzYWJsZSBhbmQgZmx1c2ggdGhlIGNhY2hlcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9zYXZlQ1I0Ci0KLSAgICAgICAgZW50ZXJfYwotCi07IFNhdmUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciBQYWdlIEdsb2JhbCBFbmFibGUgKGJpdCA3KQotCi0gICAgICAgIG1vdiAgICAgZWJ4LGNyNAotICAgICAgICBtb3YgICAgIGVheCxlYngKLSAgICAgICAgYW5kICAgICBhbCw3RmgKLSAgICAgICAgbW92ICAgICBjcjQsZWF4Ci0KLTsgRGlzYWJsZSBhbmQgZmx1c2ggY2FjaGVzCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IwCi0gICAgICAgIG9yICAgICAgZWF4LDQwMDAwMDAwaAotICAgICAgICB3YmludmQKLSAgICAgICAgbW92ICAgICBjcjAsZWF4Ci0gICAgICAgIHdiaW52ZAotCi07IFJldHVybiB2YWx1ZSBmcm9tIENSNAotCi0gICAgICAgIG1vdiAgICAgZWF4LGVieAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2F2ZSB0aGUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciB0aGUgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykuIFdlIGFsc28KLTsgZGlzYWJsZSBhbmQgZmx1c2ggdGhlIGNhY2hlcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9yZXN0b3JlQ1I0Ci0KLSAgICAgICAgQVJHICAgICBjcjRWYWw6VUxPTkcKLQotICAgICAgICBlbnRlcl9jCi0KLTsgRW5hYmxlIGNhY2hlcwotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMAotICAgICAgICBhbmQgICAgIGVheCwwQkZGRkZGRkZoCi0gICAgICAgIG1vdiAgICAgY3IwLGVheAotICAgICAgICBtb3YgICAgIGVheCxbY3I0VmFsXQotICAgICAgICBtb3YgICAgIGNyNCxlYXgKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX01UUlJfZ2V0Q3g4Nih1Y2hhciByZWcpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfZ2V0Q3g4NgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVDSEFSCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGFsLFtyZWddCi0gICAgICAgIG91dCAgICAgMjJoLGFsCi0gICAgICAgIGluICAgICAgYWwsMjNoCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9NVFJSX3NldEN4ODYodWNoYXIgcmVnLHVjaGFyIHZhbCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZSBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfc2V0Q3g4NgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVDSEFSLCB2YWw6VUNIQVIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgYWwsW3JlZ10KLSAgICAgICAgb3V0ICAgICAyMmgsYWwKLSAgICAgICAgbW92ICAgICBhbCxbdmFsXQotICAgICAgICBvdXQgICAgIDIzaCxhbAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3JlYWRNU1IodW9uZyByZWcsIHVsb25nIEZBUiAqZWF4LCB1bG9uZyBGQVIgKmVkeCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZXMgdGhlIHNwZWNpZmljIE1hY2hpbmUgU3RhdHVzIFJlZ2lzdGVyIHVzZWQgb24gdGhlIG5ld2VyIEludGVsCi07IFBlbnRpdW0gUHJvIGFuZCBQZW50aXVtIElJIG1vdGhlcmJvYXJkcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY25lYXIgICBfTVRSUl9yZWFkTVNSCi0KLSAgICAgICAgQVJHICAgICByZWc6VUxPTkcsIHZfZWF4OkRQVFIsIHZfZWR4OkRQVFIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWN4LFtyZWddCi0gICAgICAgIHJkbXNyCi0gICAgICAgIG1vdiAgICAgZWJ4LFt2X2VheF0KLSAgICAgICAgbW92ICAgICBbZWJ4XSxlYXgKLSAgICAgICAgbW92ICAgICBlYngsW3ZfZWR4XQotICAgICAgICBtb3YgICAgIFtlYnhdLGVkeAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3dyaXRlTVNSKHVvbmcgcmVnLCB1bG9uZyBlYXgsIHVsb25nIGVkeCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZXMgdGhlIHNwZWNpZmljIE1hY2hpbmUgU3RhdHVzIFJlZ2lzdGVyIHVzZWQgb24gdGhlIG5ld2VyIEludGVsCi07IFBlbnRpdW0gUHJvIGFuZCBQZW50aXVtIElJIG1vdGhlcmJvYXJkcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY25lYXIgICBfTVRSUl93cml0ZU1TUgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVMT05HLCB2X2VheDpVTE9ORywgdl9lZHg6VUxPTkcKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWN4LFtyZWddCi0gICAgICAgIG1vdiAgICAgZWF4LFt2X2VheF0KLSAgICAgICAgbW92ICAgICBlZHgsW3ZfZWR4XQotICAgICAgICB3cm1zcgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfbXRycgotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19wY2loZWxwLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fcGNpaGVscC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOGRiY2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19wY2loZWxwLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiBBbnkKLTsqCi07KiBEZXNjcmlwdGlvbjogSGVscGVyIGFzc2VtYmxlciBmdW5jdGlvbnMgZm9yIFBDSSBhY2Nlc3MgbW9kdWxlLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICBfcGNpbGliCi0KLWJlZ2NvZGVzZWcgIF9wY2lsaWIKLQotaWZkZWYgZmxhdG1vZGVsCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9BU01BUEkgX0JJT1MzMl9zZXJ2aWNlKAotOyAgIHVsb25nIHNlcnZpY2UsCi07ICAgdWxvbmcgZnVuYywKLTsgICB1bG9uZyAqcGh5c0Jhc2UsCi07ICAgdWxvbmcgKmxlbmd0aCwKLTsgICB1bG9uZyAqc2VydmljZU9mZnNldCwKLTsgICBQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENhbGwgdGhlIEJJT1MzMiBzZXJ2aWNlcyBkaXJlY3RvcnkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX0JJT1MzMl9zZXJ2aWNlCi0KLSAgICAgICAgQVJHICAgICBzZXJ2aWNlOlVMT05HLCBmdW5jOlVMT05HLCBwaHlzQmFzZTpEUFRSLCBsZW46RFBUUiwgb2ZmOkRQVFIsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCxbc2VydmljZV0KLSAgICAgICAgbW92ICAgICBlYngsW2Z1bmNdCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtlbnRyeV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRldPUkQgZW50cnldCi1lbmRpZgotICAgICAgICBtb3YgICAgIGVzaSxbcGh5c0Jhc2VdCi0gICAgICAgIG1vdiAgICAgW2VzaV0sZWJ4Ci0gICAgICAgIG1vdiAgICAgZXNpLFtsZW5dCi0gICAgICAgIG1vdiAgICAgW2VzaV0sZWN4Ci0gICAgICAgIG1vdiAgICAgZXNpLFtvZmZdCi0gICAgICAgIG1vdiAgICAgW2VzaV0sZWR4Ci0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVzaG9ydCBfQVNNQVBJIF9QQ0lCSU9TX2lzUHJlc2VudCh1bG9uZyBpX2VheCx1bG9uZyAqb19lZHgsdXNob3J0ICpvZWF4LAotOyAgIHVjaGFyICpvX2NsLFBDSUJJT1NfZW50cnkgZW50cnkpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDYWxsIHRoZSBQQ0kgQklPUyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgcHJlc2VudC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX1BDSUJJT1NfaXNQcmVzZW50Ci0KLSAgICAgICAgQVJHICAgICBpX2VheDpVTE9ORywgb19lZHg6RFBUUiwgb2VheDpEUFRSLCBvX2NsOkRQVFIsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCxbaV9lYXhdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIF9sZXMgICAgX3NpLFtvX2VkeF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sZWR4Ci0gICAgICAgIF9sZXMgICAgX3NpLFtvZWF4XQotICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAotICAgICAgICBfbGVzICAgIF9zaSxbb19jbF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sY2wKLSAgICAgICAgbW92ICAgICBheCxieAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfUENJQklPU19zZXJ2aWNlKHVsb25nIHJfZWF4LHVsb25nIHJfZWJ4LHVsb25nIHJfZWRpLHVsb25nIHJfZWN4LAotOyAgIFBDSUJJT1NfZW50cnkgZW50cnkpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDYWxsIHRoZSBQQ0kgQklPUyBzZXJ2aWNlcywgZWl0aGVyIHZpYSB0aGUgMzItYml0IHByb3RlY3RlZCBtb2RlIGVudHJ5Ci07IHBvaW50IG9yIHZpYSB0aGUgSW50IDFBaCAxNi1iaXQgaW50ZXJydXB0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICBfUENJQklPU19zZXJ2aWNlCi0KLSAgICAgICAgQVJHICAgICByX2VheDpVTE9ORywgcl9lYng6VUxPTkcsIHJfZWRpOlVMT05HLCByX2VjeDpVTE9ORywgZW50cnk6UVdPUkQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWF4LFtyX2VheF0KLSAgICAgICAgbW92ICAgICBlYngsW3JfZWJ4XQotICAgICAgICBtb3YgICAgIGVkaSxbcl9lZGldCi0gICAgICAgIG1vdiAgICAgZWN4LFtyX2VjeF0KLWlmZGVmICAgZmxhdG1vZGVsCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtlbnRyeV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRldPUkQgZW50cnldCi1lbmRpZgotZWxzZQotICAgICAgICBpbnQgICAgIDFBaAotZW5kaWYKLSAgICAgICAgbW92ICAgICBlYXgsZWN4Ci1pZm5kZWYgIGZsYXRtb2RlbAotICAgICAgICBzaGxkICAgIGVkeCxlYXgsMTYgICAgICA7IFJldHVybiByZXN1bHQgaW4gRFg6QVgKLWVuZGlmCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfUENJQklPU19nZXRSb3V0aW5nKFBDSVJvdXRpbmdPcHRpb25zQnVmZmVyICpidWYsUENJQklPU19lbnRyeSBlbnRyeSk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBHZXQgdGhlIHJvdXRpbmcgb3B0aW9ucyBmb3IgUENJIGRldmljZXMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX1BDSUJJT1NfZ2V0Um91dGluZwotCi0gICAgICAgIEFSRyAgICAgYnVmOkRQVFIsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCwwQjEwRWgKLSAgICAgICAgbW92ICAgICBieCwwCi0gICAgICAgIF9sZXMgICAgX2RpLFtidWZdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIG1vdnp4ICAgZWF4LGFoCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGlib29sIF9QQ0lCSU9TX3NldElSUShpbnQgYnVzRGV2LGludCBpbnRQaW4saW50IElSUSxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoYW5nZSB0aGUgSVJRIHJvdXRpbmcgZm9yIHRoZSBQQ0kgZGV2aWNlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgIF9QQ0lCSU9TX3NldElSUQotCi0gICAgICAgIEFSRyAgICAgYnVzRGV2OlVJTlQsIGludFBpbjpVSU5ULCBJUlE6VUlOVCwgZW50cnk6UVdPUkQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWF4LDBCMTBGaAotICAgICAgICBtb3YgICAgIGJ4LFtVU0hPUlQgYnVzRGV2XQotICAgICAgICBtb3YgICAgIGNsLFtCWVRFIGludFBpbl0KLSAgICAgICAgbW92ICAgICBjaCxbQllURSBJUlFdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIG1vdiAgICAgZWF4LDEKLSAgICAgICAgam5jICAgICBAQDEKLSAgICAgICAgeG9yICAgICBlYXgsZWF4ICAgICAgICAgOyBGdW5jdGlvbiBmYWlsZWQhCi1AQDE6ICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9QQ0lCSU9TX3NwZWNpYWxDeWNsZShpbnQgYnVzLHVsb25nIGRhdGEsUENJQklPU19lbnRyeSBlbnRyeSk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBHZW5lcmF0ZSBhIHNwZWNpYWwgY3ljbGUgdmlhIHRoZSBQQ0kgQklPUy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX1BDSUJJT1Nfc3BlY2lhbEN5Y2xlCi0KLSAgICAgICAgQVJHICAgICBidXM6VUlOVCwgZGF0YTpVTE9ORywgZW50cnk6UVdPUkQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWF4LDBCMTA2aAotICAgICAgICBtb3YgICAgIGJoLFtCWVRFIGJ1c10KLSAgICAgICAgbW92ICAgICBlY3gsW2RhdGFdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVzaG9ydCBfUENJX2dldENTKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgIF9QQ0lfZ2V0Q1MKLQotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1faW5wYihpbnQgcG9ydCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2lucGIKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICB4b3IgICAgIF9heCxfYXgKLSAgICAgICAgbW92ICAgICBfZHgsW3BvcnRdCi0gICAgICAgIGluICAgICAgYWwsZHgKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9pbnB3KGludCBwb3J0KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgYSB3b3JkIGZyb20gdGhlIHNwZWNpZmllZCBwb3J0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1faW5wdwotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHhvciAgICAgX2F4LF9heAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgaW4gICAgICBheCxkeAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgUE1faW5wZChpbnQgcG9ydCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIGEgd29yZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2lucGQKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgaW4gICAgICBlYXgsZHgKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBEWDpBWCA9IHJlc3VsdAotZW5kaWYKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fb3V0cGIoaW50IHBvcnQsaW50IHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGUgYSBieXRlIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9vdXRwYgotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBtb3YgICAgIF9heCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fb3V0cHcoaW50IHBvcnQsaW50IHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGUgYSB3b3JkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9vdXRwdwotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBtb3YgICAgIF9heCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsYXgKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fb3V0cGQoaW50IHBvcnQsdWxvbmcgdmFsdWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZSBhIHdvcmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX291dHBkCi0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIHZhbHVlOlVMT05HCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBtb3YgICAgIGVheCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsZWF4Ci0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcGNpbGliCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vYWdwLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vYWdwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2JjODguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL2FncC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBSaW5nIDAgZGV2aWNlIGRyaXZlcgotKgotKiBEZXNjcmlwdGlvbjogIEdlbmVyaWMgbW9kdWxlIHRvIGltcGxlbWVudCBBR1Agc3VwcG9ydCBmdW5jdGlvbnMgdXNpbmcgdGhlCi0qICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEFHUCBzdXBwb3J0IGRyaXZlcnMuIElmIHRoZSBPUyBwcm92aWRlcwotKiAgICAgICAgICAgICAgIG5hdGl2ZSBBR1Agc3VwcG9ydCwgdGhpcyBtb2R1bGUgc2hvdWxkICpOT1QqIGJlIHVzZWQuIEluc3RlYWQKLSogICAgICAgICAgICAgICB3cmFwcGVycyBzaG91bGQgYmUgcGxhY2VkIGFyb3VuZCB0aGUgT1Mgc3VwcG9ydCBmdW5jdGlvbnMKLSogICAgICAgICAgICAgICB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaWZuZGVmIFJFQUxNT0RFCi0jaW5jbHVkZSAibnVjbGV1cy9hZ3AuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIEFHUF9kZXZDdHggICAgICAgKmFncDsKLXN0YXRpYyBBR1BfZHJpdmVyRnVuY3MgIGRyaXZlcjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1TaXplIG9mIEFHUCBhcGVydHVyZSBpbiBNQiBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBBR1AgZHJpdmVyIGluIHRoZSBzeXN0ZW0gYW5kIHJldHVybnMgdGhlCi1zaXplIG9mIHRoZSBhdmFpbGFibGUgQUdQIGFwZXJ0dXJlIGluIG1lZ2FieXRlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9hZ3BJbml0KHZvaWQpCi17Ci0gICAgaWYgKChhZ3AgPSBBR1BfbG9hZERyaXZlcigwKSkgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICBkcml2ZXIuZHdTaXplID0gc2l6ZW9mKGRyaXZlcik7Ci0gICAgaWYgKCFhZ3AtPlF1ZXJ5RnVuY3Rpb25zKEFHUF9HRVRfRFJJVkVSRlVOQ1MsJmRyaXZlcikpCi0JcmV0dXJuIDA7Ci0gICAgc3dpdGNoIChkcml2ZXIuR2V0QXBlcnR1cmVTaXplKCkpIHsKLQljYXNlIGFncFNpemU0TUI6ICAgIHJldHVybiA0OwotCWNhc2UgYWdwU2l6ZThNQjogICAgcmV0dXJuIDg7Ci0JY2FzZSBhZ3BTaXplMTZNQjogICByZXR1cm4gMTY7Ci0JY2FzZSBhZ3BTaXplMzJNQjogICByZXR1cm4gMzI7Ci0JY2FzZSBhZ3BTaXplNjRNQjogICByZXR1cm4gNjQ7Ci0JY2FzZSBhZ3BTaXplMTI4TUI6ICByZXR1cm4gMTI4OwotCWNhc2UgYWdwU2l6ZTI1Nk1COiAgcmV0dXJuIDI1NjsKLQljYXNlIGFncFNpemU1MTJNQjogIHJldHVybiA1MTI7Ci0JY2FzZSBhZ3BTaXplMUdCOiAgICByZXR1cm4gMTAyNDsKLQljYXNlIGFncFNpemUyR0I6ICAgIHJldHVybiAyMDQ4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNsb3NlcyBkb3duIHRoZSBsb2FkZWQgQUdQIGRyaXZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2FncEV4aXQodm9pZCkKLXsKLSAgICBBR1BfdW5sb2FkRHJpdmVyKGFncCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbnVtUGFnZXMgICAgLSBOdW1iZXIgb2YgbWVtb3J5IHBhZ2VzIHRoYXQgc2hvdWxkIGJlIHJlc2VydmVkCi10eXBlICAgICAgICAtIFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlCi1waHlzQ29udGV4dCAtIFJldHVybnMgdGhlIHBoeXNpY2FsIGNvbnRleHQgaGFuZGxlIGZvciB0aGUgbWFwcGluZwotcGh5c0FkZHIgICAgLSBSZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbWFwcGluZwotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXNlcnZlcyBhIHJhbmdlIG9mIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzZXMgb24gdGhlIHN5c3RlbQotYnVzIHdoaWNoIHRoZSBBR1AgY29udHJvbGxlciB3aWxsIHJlc3BvbmQgdG8uIElmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMsCi10aGUgQUdQIGNvbnRyb2xsZXIgY2FuIHJlc3BvbmQgdG8gdGhlIHJlc2VydmVkIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2Ugb24KLXRoZSBidXMuIEhvd2V2ZXIgeW91IG11c3QgZmlyc3QgY2FsbCBBR1BfY29tbWl0UGh5c2ljYWwgdG8gY2F1c2UgdGhpcyBtZW1vcnkKLXRvIGFjdHVhbGx5IGJlIGNvbW1pdHRlZCBmb3IgdXNlIGJlZm9yZSBpdCBjYW4gYmUgYWNjZXNzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsKAotICAgIHVsb25nIG51bVBhZ2VzLAotICAgIGludCB0eXBlLAotICAgIHZvaWQgKipwaHlzQ29udGV4dCwKLSAgICBQTV9waHlzQWRkciAqcGh5c0FkZHIpCi17Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBQTV9hZ3BVbmNhY2hlZDoKLQkgICAgdHlwZSA9IGFncFVuY2FjaGVkOwotCSAgICBicmVhazsKLQljYXNlIFBNX2FncFdyaXRlQ29tYmluZToKLQkgICAgdHlwZSA9IGFncFdyaXRlQ29tYmluZTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9hZ3BJbnRlbERDQUNIRToKLQkgICAgdHlwZSA9IGFncEludGVsRENBQ0hFOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIHJldHVybiBkcml2ZXIuUmVzZXJ2ZVBoeXNpY2FsKG51bVBhZ2VzLHR5cGUscGh5c0NvbnRleHQscGh5c0FkZHIpID09IG5PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1waHlzQ29udGV4dCAtIFBoeXNpY2FsIEFHUCBjb250ZXh0IHRvIHJlbGVhc2UKLQotUkVUVVJOUzoKLVRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYSByYW5nZSBvZiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzc2VzIG9uIHRoZSBzeXN0ZW0KLWJ1cyB3aGljaCB0aGUgQUdQIGNvbnRyb2xsZXIgd2lsbCByZXNwb25kIHRvLiBBbGwgY29tbWl0dGVkIG1lbW9yeSBmb3IKLXRoZSBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlIGNvdmVyZWQgYnkgdGhlIGNvbnRleHQgd2lsbCBiZSByZWxlYXNlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9hZ3BSZWxlYXNlUGh5c2ljYWwoCi0gICAgdm9pZCAqcGh5c0NvbnRleHQpCi17Ci0gICAgcmV0dXJuIGRyaXZlci5SZWxlYXNlUGh5c2ljYWwocGh5c0NvbnRleHQpID09IG5PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1waHlzQ29udGV4dCAtIFBoeXNpY2FsIEFHUCBjb250ZXh0IHRvIGNvbW1pdCBtZW1vcnkgZm9yCi1udW1QYWdlcyAgICAtIE51bWJlciBvZiBwYWdlcyB0byBiZSBjb21taXR0ZWQKLXN0YXJ0T2Zmc2V0IC0gT2Zmc2V0IGluIHBhZ2VzIGludG8gdGhlIHJlc2VydmVkIHBoeXNpY2FsIGNvbnRleHQKLXBoeXNBZGRyICAgIC0gUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29tbWl0dGVkIG1lbW9yeQotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjb21taXRzIGludG8gdGhlIHNwZWNpZmllZCBwaHlzaWNhbCBjb250ZXh0IHRoYXQgd2FzIHByZXZpb3VzbHkKLXJlc2VydmVkIGJ5IGEgY2FsbCB0byBSZXNlcnZlUGh5c2ljYWwuIFlvdSBjYW4gdXNlIHRoZSBzdGFydE9mZnNldCBhbmQKLW51bVBhZ2VzIHBhcmFtZXRlcnMgdG8gb25seSBjb21taXQgcG9ydGlvbnMgb2YgdGhlIHJlc2VydmVkIG1lbW9yeSByYW5nZSBhdAotYSB0aW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2FncENvbW1pdFBoeXNpY2FsKAotICAgIHZvaWQgKnBoeXNDb250ZXh0LAotICAgIHVsb25nIG51bVBhZ2VzLAotICAgIHVsb25nIHN0YXJ0T2Zmc2V0LAotICAgIFBNX3BoeXNBZGRyICpwaHlzQWRkcikKLXsKLSAgICByZXR1cm4gZHJpdmVyLkNvbW1pdFBoeXNpY2FsKHBoeXNDb250ZXh0LG51bVBhZ2VzLHN0YXJ0T2Zmc2V0LHBoeXNBZGRyKSA9PSBuT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGh5c0NvbnRleHQgLSBQaHlzaWNhbCBBR1AgY29udGV4dCB0byBmcmVlIG1lbW9yeSBmb3IKLW51bVBhZ2VzICAgIC0gTnVtYmVyIG9mIHBhZ2VzIHRvIGJlIGZyZWVkCi1zdGFydE9mZnNldCAtIE9mZnNldCBpbiBwYWdlcyBpbnRvIHRoZSByZXNlcnZlZCBwaHlzaWNhbCBjb250ZXh0Ci0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGZyZWVzIG1lbW9yeSBwcmV2aW91c2x5IGNvbW1pdHRlZCBieSB0aGUgQ29tbWl0UGh5c2ljYWwKLWZ1bmN0aW9uLiBOb3RlIHRoYXQgeW91IGNhbiBmcmVlIGEgcG9ydGlvbiBvZiBhIG1lbW9yeSByYW5nZSB0aGF0IHdhcwotcHJldmlvdXNseSBjb21taXR0ZWQgaWYgeW91IHdpc2guCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fYWdwRnJlZVBoeXNpY2FsKAotICAgIHZvaWQgKnBoeXNDb250ZXh0LAotICAgIHVsb25nIG51bVBhZ2VzLAotICAgIHVsb25nIHN0YXJ0T2Zmc2V0KQotewotICAgIHJldHVybiBkcml2ZXIuRnJlZVBoeXNpY2FsKHBoeXNDb250ZXh0LG51bVBhZ2VzLHN0YXJ0T2Zmc2V0KSA9PSBuT0s7Ci19Ci0KLSNlbmRpZiAgLyogIVJFQUxNT0RFICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24va2V5Ym9hcmQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9rZXlib2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg2N2JkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9rZXlib2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIERpcmVjdCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBtb2R1bGUuIFRoaXMgbW9kdWxlIGNvbnRhaW5zCi0qICAgICAgICAgICAgICAgY29kZSB0byBwcm9jZXNzIHJhdyBzY2FuIGNvZGUgaW5mb3JtYXRpb24sIGNvbnZlcnQgaXQgdG8KLSogICAgICAgICAgICAgICB2aXJ0dWFsIHNjYW4gY29kZXMgYW5kIGRvIGNvZGUgcGFnZSB0cmFuc2xhdGlvbiB0byBBU0NJSQotKiAgICAgICAgICAgICAgIGZvciBkaWZmZXJlbnQgaW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXRzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIEtleWJvYXJkIHNjYW4gY29kZSB0byB0cmFuc2xhdGUKLXRhYmxlICAgICAgIC0gQ29kZSBwYWdlIHRhYmxlIHRvIHNlYXJjaAotY291bnQgICAgICAgLSBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29kZSBwYWdlIHRhYmxlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIHNjYW4gY29kZXMgZnJvbSBrZXlib2FyZCBzY2FuIGNvZGVzIHRvIEFTQ0lJCi1jb2RlcyB1c2luZyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIGNvZGUgcGFnZSB0YWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWNoYXIgdHJhbnNsYXRlU2NhbigKLSAgICB1Y2hhciBzY2FuQ29kZSwKLSAgICBjb2RlcGFnZV9lbnRyeV90ICp0YWJsZSwKLSAgICBpbnQgY291bnQpCi17Ci0gICAgY29kZXBhZ2VfZW50cnlfdCAgICAqdGVzdDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG4scGl2b3QsdmFsOwotCi0gICAgZm9yIChuID0gY291bnQ7IG4gPiAwOyApIHsKLQlwaXZvdCA9IG4gPj4gMTsKLQl0ZXN0ID0gdGFibGUgKyBwaXZvdDsKLQl2YWwgPSBzY2FuQ29kZSAtIHRlc3QtPnNjYW5Db2RlOwotCWlmICh2YWwgPCAwKQotCSAgICBuID0gcGl2b3Q7Ci0JZWxzZSBpZiAodmFsID09IDApCi0JICAgIHJldHVybiB0ZXN0LT5hc2NpaUNvZGU7Ci0JZWxzZSB7Ci0JICAgIHRhYmxlID0gdGVzdCArIDE7Ci0JICAgIG4gLT0gcGl2b3QgKyAxOwotCSAgICB9Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLXtzZWNyZXR9Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX21hc2tLZXlDb2RlKAotICAgIGV2ZW50X3QgKmV2dCkKLXsKLSAgICBpbnQgYXNjaWksc2NhbiA9IEVWVF9zY2FuQ29kZShldnQtPm1lc3NhZ2UpOwotCi0gICAgZXZ0LT5tZXNzYWdlICY9IH4weEZGOwotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9OVU1MT0NLKSB7Ci0JaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPm51bVBhZCxFVlQuY29kZVBhZ2UtPm51bVBhZExlbikpICE9IDApIHsKLQkgICAgZXZ0LT5tZXNzYWdlIHw9IGFzY2lpOwotCSAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0NUUkxTVEFURSkgewotCWV2dC0+bWVzc2FnZSB8PSB0cmFuc2xhdGVTY2FuKHNjYW4sRVZULmNvZGVQYWdlLT5jdHJsLEVWVC5jb2RlUGFnZS0+Y3RybExlbik7Ci0JcmV0dXJuOwotCX0KLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfQ0FQU0xPQ0spIHsKLQlpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpIHsKLQkgICAgaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPnNoaWZ0Q2FwcyxFVlQuY29kZVBhZ2UtPnNoaWZ0Q2Fwc0xlbikpICE9IDApIHsKLQkJZXZ0LT5tZXNzYWdlIHw9IGFzY2lpOwotCQlyZXR1cm47Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICBpZiAoKGFzY2lpID0gdHJhbnNsYXRlU2NhbihzY2FuLEVWVC5jb2RlUGFnZS0+Y2FwcyxFVlQuY29kZVBhZ2UtPmNhcHNMZW4pKSAhPSAwKSB7Ci0JCWV2dC0+bWVzc2FnZSB8PSBhc2NpaTsKLQkJcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX1NISUZUS0VZKSB7Ci0JaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPnNoaWZ0LEVWVC5jb2RlUGFnZS0+c2hpZnRMZW4pKSAhPSAwKSB7Ci0JICAgIGV2dC0+bWVzc2FnZSB8PSBhc2NpaTsKLQkgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIGV2dC0+bWVzc2FnZSB8PSB0cmFuc2xhdGVTY2FuKHNjYW4sRVZULmNvZGVQYWdlLT5ub3JtYWwsRVZULmNvZGVQYWdlLT5ub3JtYWxMZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IHdpdGggdGhlIHNwZWNpZmllZCBzY2FuIGNvZGUgaXMgYmVpbmcgaGVsZCBkb3duLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBfRVZUX2lzS2V5RG93bigKLSAgICB1Y2hhciBzY2FuQ29kZSkKLXsKLSAgICBpZiAoc2NhbkNvZGUgPiAweDdGKQotCXJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0JcmV0dXJuIEVWVC5rZXlUYWJsZVtzY2FuQ29kZV0gIT0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci13aGF0ICAgICAgICAtIEV2ZW50IGNvZGUKLW1lc3NhZ2UgICAgIC0gRXZlbnQgbWVzc2FnZSAoQVNDSUkgY29kZSBhbmQgc2NhbiBjb2RlKQotCi1SRU1BUktTOgotQWRkcyBhIG5ldyBrZXlib2FyZCBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbQotd2l0aGluIHRoZSBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSEKLQotTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCi0JYW5kIHdlIGxlYXZlIHRoZW0gT0ZGIHRoZSBlbnRpcmUgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGRLZXlFdmVudCgKLSAgICB1aW50IHdoYXQsCi0gICAgdWludCBtZXNzYWdlKQotewotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkvKiBTYXZlIGluZm9ybWF0aW9uIGluIGV2ZW50IHJlY29yZCAqLwotCWV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOwotCWV2dC53aGF0ID0gd2hhdDsKLQlldnQubWVzc2FnZSA9IG1lc3NhZ2UgfCAweDEwMDAwVUw7Ci0JZXZ0LndoZXJlX3ggPSAwOwotCWV2dC53aGVyZV95ID0gMDsKLQlldnQucmVsYXRpdmVfeCA9IDA7Ci0JZXZ0LnJlbGF0aXZlX3kgPSAwOwotCWV2dC5tb2RpZmllcnMgPSBFVlQua2V5TW9kaWZpZXJzOwotCWlmIChldnQud2hhdCA9PSBFVlRfS0VZUkVQRUFUKSB7Ci0JICAgIGlmIChFVlQub2xkS2V5ICE9IC0xKQotCQlFVlQuZXZ0cVtFVlQub2xkS2V5XS5tZXNzYWdlICs9IDB4MTAwMDBVTDsKLQkgICAgZWxzZSB7Ci0JCUVWVC5vbGRLZXkgPSBFVlQuZnJlZUhlYWQ7Ci0JCWFkZEV2ZW50KCZldnQpOyAgICAgICAgIC8qIEFkZCB0byB0YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KLQkJfQotCSAgICB9Ci0JZWxzZSB7Ci0jaWZkZWYgX19RTlhfXwotCSAgICBfRVZUX21hc2tLZXlDb2RlKCZldnQpOwotI2VuZGlmCi0JICAgIGFkZEV2ZW50KCZldnQpOyAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0JICAgIH0KLQlFVlQub2xkTW92ZSA9IC0xOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUga2V5Ym9hcmQgY29udHJvbGxlciB0byBzZXQgdGhlIHJlYWR5LWZvci13cml0ZQotYml0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQga2JXYWl0Rm9yV3JpdGVSZWFkeSh2b2lkKQotewotICAgIGludCB0aW1lb3V0ID0gODE5MjsKLSAgICB3aGlsZSAoKHRpbWVvdXQgPiAwKSAmJiAoUE1faW5wYigweDY0KSAmIDB4MDIpKQotCXRpbWVvdXQtLTsKLSAgICByZXR1cm4gKHRpbWVvdXQgPiAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUga2V5Ym9hcmQgY29udHJvbGxlciB0byBzZXQgdGhlIHJlYWR5LWZvci1yZWFkCi1iaXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBrYldhaXRGb3JSZWFkUmVhZHkodm9pZCkKLXsKLSAgICBpbnQgdGltZW91dCA9IDgxOTI7Ci0gICAgd2hpbGUgKCh0aW1lb3V0ID4gMCkgJiYgKCEoUE1faW5wYigweDY0KSAmIDB4MDEpKSkKLQl0aW1lb3V0LS07Ci0gICAgcmV0dXJuICh0aW1lb3V0ID4gMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZGF0YSAgICAtIERhdGEgdG8gc2VuZCB0byB0aGUga2V5Ym9hcmQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBkYXRhIGJ5dGUgdG8gdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBrYlNlbmREYXRhKAotICAgIHVjaGFyIGRhdGEpCi17Ci0gICAgaW50IHJlc2VuZHMgPSA0OwotICAgIGludCB0aW1lb3V0LCB0ZW1wOwotCi0gICAgZG8gewotCWlmICgha2JXYWl0Rm9yV3JpdGVSZWFkeSgpKQotCSAgICByZXR1cm4gMDsKLQlQTV9vdXRwYigweDYwLGRhdGEpOwotCXRpbWVvdXQgPSA4MTkyOwotCXdoaWxlICgtLXRpbWVvdXQgPiAwKSB7Ci0JICAgIGlmICgha2JXYWl0Rm9yUmVhZFJlYWR5KCkpCi0JCXJldHVybiAwOwotCSAgICB0ZW1wID0gUE1faW5wYigweDYwKTsKLQkgICAgaWYgKHRlbXAgPT0gMHhGQSkKLQkJcmV0dXJuIDE7Ci0JICAgIGlmICh0ZW1wID09IDB4RkUpCi0JCWJyZWFrOwotCSAgICB9Ci0JfSB3aGlsZSAoKHJlc2VuZHMtLSA+IDApICYmICh0aW1lb3V0ID4gMCkpOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vZGlmaWVycyAgIC0gS2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmUtcHJvZ3JhbXMgdGhlIExFRCdzIG9uIHRoZSBrZXlib2FyZCB0byB0aGUgdmFsdWVzIHN0b3JlZAotaW4gdGhlIHBhc3NlZCBpbiBtb2RpZmllciBmbGFncy4gSWYgdGhlICdhbGxvd0xFRFMnIGZsYWcgaXMgZmFsc2UsIHRoaXMKLWZ1bmN0aW9uIGRvZXMgbm90aGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzZXRMRURTKAotICAgIHVpbnQgbW9kaWZpZXJzKQotewotICAgIGlmIChFVlQuYWxsb3dMRURTKSB7Ci0JaWYgKCFrYlNlbmREYXRhKDB4RUQpIHx8ICFrYlNlbmREYXRhKChtb2RpZmllcnM+PjkpICYgNykpIHsKLQkgICAga2JTZW5kRGF0YSgweEY0KTsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBwcm9jZXNzIHJhdyBzY2FuIGNvZGVzIHJlYWQgZnJvbSB0aGUga2V5Ym9hcmQgY29udHJvbGxlci4KLQotTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCi0JYW5kIHdlIGxlYXZlIHRoZW0gT0ZGIHRoZSBlbnRpcmUgdGltZS4KLXtzZWNyZXR9Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwcm9jZXNzUmF3U2NhbkNvZGUoCi0gICAgaW50IHNjYW4pCi17Ci0gICAgc3RhdGljIGludCAgcGF1c2VMb29wID0gMDsKLSAgICBzdGF0aWMgaW50ICBleHRlbmRlZCA9IDA7Ci0gICAgaW50ICAgICAgICAgd2hhdDsKLQotICAgIGlmIChwYXVzZUxvb3ApIHsKLQkvKiBTa2lwIHNjYW4gY29kZXMgdW50aWwgdGhlIHBhdXNlIGtleSBzZXF1ZW5jZSBoYXMgYmVlbiByZWFkICovCi0JcGF1c2VMb29wLS07Ci0JfQotICAgIGVsc2UgaWYgKHNjYW4gPT0gMHhFMCkgewotCS8qIFRoaXMgc2lnbmFscyB0aGUgc3RhcnQgb2YgYW4gZXh0ZW5kZWQgc2NhbiBjb2RlIHNlcXVlbmNlICovCi0JZXh0ZW5kZWQgPSAxOwotCX0KLSAgICBlbHNlIGlmIChzY2FuID09IDB4RTEpIHsKLQkvKiBUaGUgUGF1c2Uga2V5IHNlbmRzIGEgc3RyYW5nZSBzY2FuIGNvZGUgc2VxdWVuY2UsIHdoaWNoIGlzOgotCSAqCi0JICogIEUxIDFEIDUyIEUxIDlEIEQyCi0JICoKLQkgKiBIb3dldmVyIHRoZXJlIGlzIG5ldmVyIGFueSByZWxlYXNlIGNvZGUgbm9yIGFueSBhdXRvLXJlcGVhdCBmb3IKLQkgKiB0aGlzIGtleS4gRm9yIHRoaXMgcmVhc29uIHdlIHNpbXBseSBpZ25vcmUgdGhlIGtleSBhbmQgc2tpcCB0aGUKLQkgKiBuZXh0IDUgc2NhbiBjb2RlcyByZWFkIGZyb20gdGhlIGtleWJvYXJkLgotCSAqLwotCXBhdXNlTG9vcCA9IDU7Ci0JfQotICAgIGVsc2UgewotCS8qIFByb2Nlc3MgdGhlIHNjYW4gY29kZSBub3JtYWxseSAoaXQgbWF5IGJlIGFuIGV4dGVuZGVkIGNvZGUKLQkgKiBob3dldmVyISkuIEJpdCA3IG1lYW5zIGtleSB3YXMgcmVsZWFzZWQsIGFuZCBiaXRzIDAtNiBhcmUgdGhlCi0JICogc2NhbiBjb2RlLgotCSAqLwotCXdoYXQgPSAoc2NhbiAmIDB4ODApID8gRVZUX0tFWVVQIDogRVZUX0tFWURPV047Ci0Jc2NhbiAmPSAweDdGOwotCWlmIChleHRlbmRlZCkgewotCSAgICBleHRlbmRlZCA9IDA7Ci0JICAgIGlmIChzY2FuID09IDB4MkEgfHwgc2NhbiA9PSAweDM2KSB7Ci0JCS8qIElnbm9yZSB0aGVzZSBleHRlbmRlZCBzY2FuIGNvZGUgc2VxdWVuY2VzLiBUaGVzZSBhcmUKLQkJICogdXNlZCBieSB0aGUga2V5Ym9hcmQgY29udHJvbGxlciB0byB3cmFwIGFyb3VuZCBjZXJ0YWluCi0JCSAqIGtleSBzZXF1ZW5jZXMgZm9yIHRoZSBrZXlwYWQgKGFuZCB3aGVuIE5VTUxPQ0sgaXMgZG93bgotCQkgKiBpbnRlcm5hbGx5KS4KLQkJICovCi0JCXJldHVybjsKLQkJfQotCi0JICAgIC8qIENvbnZlcnQgZXh0ZW5kZWQgY29kZXMgZm9yIGtleSBzZXF1ZW5jZXMgdGhhdCB3ZSBtYXAgdG8KLQkgICAgICogdmlydHVhbCBzY2FuIGNvZGVzIHNvIHRoZSB1c2VyIGNhbiBkZXRlY3QgdGhlbSBpbiB0aGVpcgotCSAgICAgKiBjb2RlLgotCSAgICAgKi8KLQkgICAgc3dpdGNoIChzY2FuKSB7Ci0JCWNhc2UgS0JfbGVmdEN0cmw6ICAgc2NhbiA9IEtCX3JpZ2h0Q3RybDsgICAgYnJlYWs7Ci0JCWNhc2UgS0JfbGVmdEFsdDogICAgc2NhbiA9IEtCX3JpZ2h0QWx0OyAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfZGl2aWRlOiAgICAgc2NhbiA9IEtCX3BhZERpdmlkZTsgICAgYnJlYWs7Ci0JCWNhc2UgS0JfZW50ZXI6ICAgICAgc2NhbiA9IEtCX3BhZEVudGVyOyAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfcGFkVGltZXM6ICAgc2NhbiA9IEtCX3N5c1JlcTsgICAgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBDb252ZXJ0IHJlZ3VsYXIgc2NhbiBjb2RlcyBmb3Iga2V5IHNlcXVlbmNlcyB0aGF0IHdlIG1hcCB0bwotCSAgICAgKiB2aXJ0dWFsIHNjYW4gY29kZXMgc28gdGhlIHVzZXIgY2FuIGRldGVjdCB0aGVtIGluIHRoZWlyCi0JICAgICAqIGNvZGUuCi0JICAgICAqLwotCSAgICBzd2l0Y2ggKHNjYW4pIHsKLQkJY2FzZSBLQl9sZWZ0OiAgICAgICBzY2FuID0gS0JfcGFkTGVmdDsgICAgICBicmVhazsKLQkJY2FzZSBLQl9yaWdodDogICAgICBzY2FuID0gS0JfcGFkUmlnaHQ7ICAgICBicmVhazsKLQkJY2FzZSBLQl91cDogICAgICAgICBzY2FuID0gS0JfcGFkVXA7ICAgICAgICBicmVhazsKLQkJY2FzZSBLQl9kb3duOiAgICAgICBzY2FuID0gS0JfcGFkRG93bjsgICAgICBicmVhazsKLQkJY2FzZSBLQl9pbnNlcnQ6ICAgICBzY2FuID0gS0JfcGFkSW5zZXJ0OyAgICBicmVhazsKLQkJY2FzZSBLQl9kZWxldGU6ICAgICBzY2FuID0gS0JfcGFkRGVsZXRlOyAgICBicmVhazsKLQkJY2FzZSBLQl9ob21lOiAgICAgICBzY2FuID0gS0JfcGFkSG9tZTsgICAgICBicmVhazsKLQkJY2FzZSBLQl9lbmQ6ICAgICAgICBzY2FuID0gS0JfcGFkRW5kOyAgICAgICBicmVhazsKLQkJY2FzZSBLQl9wYWdlVXA6ICAgICBzY2FuID0gS0JfcGFkUGFnZVVwOyAgICBicmVhazsKLQkJY2FzZSBLQl9wYWdlRG93bjogICBzY2FuID0gS0JfcGFkUGFnZURvd247ICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkvKiBEZXRlcm1pbmUgaWYgdGhlIGtleSBpcyBhbiBVUCwgRE9XTiBvciBSRVBFQVQgYW5kIG1haW50YWluIHRoZQotCSAqIHVwL2Rvd24gc3RhdHVzIG9mIGFsbCBrZXlzIGluIG91ciBnbG9iYWwga2V5IGFycmF5LgotCSAqLwotCWlmICh3aGF0ID09IEVWVF9LRVlET1dOKSB7Ci0JICAgIGlmIChFVlQua2V5VGFibGVbc2Nhbl0pCi0JCXdoYXQgPSBFVlRfS0VZUkVQRUFUOwotCSAgICBlbHNlCi0JCUVWVC5rZXlUYWJsZVtzY2FuXSA9IHNjYW47Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgRVZULmtleVRhYmxlW3NjYW5dID0gMDsKLQkgICAgfQotCi0JLyogSGFuZGxlIHNoaWZ0IGtleSBtb2RpZmllcnMgKi8KLQlpZiAod2hhdCAhPSBFVlRfS0VZUkVQRUFUKSB7Ci0JICAgIHN3aXRjaCAoc2NhbikgewotCQljYXNlIEtCX2NhcHNMb2NrOgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWURPV04pCi0JCQlFVlQua2V5TW9kaWZpZXJzIF49IEVWVF9DQVBTTE9DSzsKLQkJICAgIHNldExFRFMoRVZULmtleU1vZGlmaWVycyk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9udW1Mb2NrOgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWURPV04pCi0JCQlFVlQua2V5TW9kaWZpZXJzIF49IEVWVF9OVU1MT0NLOwotCQkgICAgc2V0TEVEUyhFVlQua2V5TW9kaWZpZXJzKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEtCX3Njcm9sbExvY2s6Ci0JCSAgICBpZiAod2hhdCA9PSBFVlRfS0VZRE9XTikKLQkJCUVWVC5rZXlNb2RpZmllcnMgXj0gRVZUX1NDUk9MTExPQ0s7Ci0JCSAgICBzZXRMRURTKEVWVC5rZXlNb2RpZmllcnMpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgS0JfbGVmdFNoaWZ0OgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWVVQKQotCQkJRVZULmtleU1vZGlmaWVycyAmPSB+RVZUX0xFRlRTSElGVDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX0xFRlRTSElGVDsKLQkJICAgIGJyZWFrOwotCQljYXNlIEtCX3JpZ2h0U2hpZnQ6Ci0JCSAgICBpZiAod2hhdCA9PSBFVlRfS0VZVVApCi0JCQlFVlQua2V5TW9kaWZpZXJzICY9IH5FVlRfUklHSFRTSElGVDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1JJR0hUU0hJRlQ7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9sZWZ0Q3RybDoKLQkJICAgIGlmICh3aGF0ID09IEVWVF9LRVlVUCkKLQkJCUVWVC5rZXlNb2RpZmllcnMgJj0gfkVWVF9MRUZUQ1RSTDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX0xFRlRDVFJMOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgS0JfcmlnaHRDdHJsOgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWVVQKQotCQkJRVZULmtleU1vZGlmaWVycyAmPSB+RVZUX1JJR0hUQ1RSTDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1JJR0hUQ1RSTDsKLQkJICAgIGJyZWFrOwotCQljYXNlIEtCX2xlZnRBbHQ6Ci0JCSAgICBpZiAod2hhdCA9PSBFVlRfS0VZVVApCi0JCQlFVlQua2V5TW9kaWZpZXJzICY9IH5FVlRfTEVGVEFMVDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX0xFRlRBTFQ7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9yaWdodEFsdDoKLQkJICAgIGlmICh3aGF0ID09IEVWVF9LRVlVUCkKLQkJCUVWVC5rZXlNb2RpZmllcnMgJj0gfkVWVF9SSUdIVEFMVDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1JJR0hUQUxUOwotCQkgICAgYnJlYWs7Ci0jaWZkZWYgU1VQUE9SVF9DVFJMX0FMVF9ERUwKLQkJY2FzZSBLQl9kZWxldGU6Ci0JCSAgICBpZiAoKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfQ1RSTFNUQVRFKSAmJiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9BTFRTVEFURSkpCi0JCQlSZWJvb3QoKTsKLQkJICAgIGJyZWFrOwotI2VuZGlmCi0JCX0KLQkgICAgfQotCi0JLyogQWRkIHRoZSB1bnRyYW5zbGF0ZWQga2V5IGNvZGUgdG8gdGhlIGV2ZW50IHF1ZXVlLiBBbGwKLQkgKiB0cmFuc2xhdGlvbiB0byBBU0NJSSBmcm9tIHRoZSBrZXkgY29kZXMgb2NjdXJzIHdoZW4gdGhlIGtleQotCSAqIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBxdWV1ZSwgc2F2aW5nIHRpbWUgaW4gdGhlIGxvdyBsZXZlbAotCSAqIGludGVycnVwdCBoYW5kbGVyLgotCSAqLwotCWFkZEtleUV2ZW50KHdoYXQsc2NhbiA8PCA4KTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUVuYWJsZXMvZGlzYWJsZXMgdGhlIHVwZGF0ZSBvZiB0aGUga2V5Ym9hcmQgTEVEIHN0YXR1cyBpbmRpY2F0b3JzLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1lbmFibGUgIC0gVHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGUKLQotUkVNQVJLUzoKLUVuYWJsZXMgdGhlIHVwZGF0ZSBvZiB0aGUga2V5Ym9hcmQgTEVEIHN0YXR1cyBpbmRpY2F0b3JzLiBTb21ldGltZXMgaXQgbWF5Ci1iZSBjb252ZW5pZW50IGluIHRoZSBhcHBsaWNhdGlvbiB0byB0dXJuIG9mZiB0aGUgdXBkYXRpbmcgb2YgdGhlIExFRAotc3RhdHVzIGluZGljYXRvcnMgKHN1Y2ggYXMgaWYgYSBnYW1lIGlzIHVzaW5nIHRoZSBDQVBTTE9DSyBrZXkgZm9yIHNvbWUKLWZ1bmN0aW9uKS4gUGFzc2luZyBpbiBhIHZhbHVlIG9mIEZBTFNFIHRvIHRoaXMgZnVuY3Rpb24gd2lsbCB0dXJuIG9mZiBhbGwKLXRoZSBMRURTLCBhbmQgc3RvcCB1cGRhdGluZyB0aGVtIHdoZW4gdGhlIGludGVybmFsIHN0YXR1cyBjaGFuZ2VzIChub3RlCi1ob3dldmVyIHRoYXQgaW50ZXJuYWxseSB3ZSBzdGlsbCBrZWVwIHRyYWNrIG9mIHRoZSB0b2dnbGUga2V5IHN0YXR1cyEpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9hbGxvd0xFRFMoCi0gICAgaWJvb2wgZW5hYmxlKQotewotICAgIEVWVC5hbGxvd0xFRFMgPSB0cnVlOwotICAgIGlmIChlbmFibGUpCi0Jc2V0TEVEUyhFVlQua2V5TW9kaWZpZXJzKTsKLSAgICBlbHNlCi0Jc2V0TEVEUygwKTsKLSAgICBFVlQuYWxsb3dMRURTID0gZW5hYmxlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL21hbGxvYy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL21hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VmMjIxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgZm9yIGltcGxlbWVudGluZyB0aGUgUE0gbGlicmFyeSBvdmVycmlkZWFibGUgbWVtb3J5Ci0qICAgICAgICAgICAgICAgYWxsb2NhdG9yIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkICogKCpfX1BNX21hbGxvYykoc2l6ZV90IHNpemUpICAgICAgICAgICAgICA9IG1hbGxvYzsKLXZvaWQgKiAoKl9fUE1fY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpID0gY2FsbG9jOwotdm9pZCAqICgqX19QTV9yZWFsbG9jKSh2b2lkICpwdHIsc2l6ZV90IHNpemUpICAgPSByZWFsbG9jOwotdm9pZCAoKl9fUE1fZnJlZSkodm9pZCAqcCkgICAgICAgICAgICAgICAgICAgICAgPSBmcmVlOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Vc2UgbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLW1hbGxvYyAgLSBQb2ludGVyIHRvIG5ldyBtYWxsb2Mgcm91dGluZSB0byB1c2UKLWNhbGxvYyAgLSBQb2ludGVyIHRvIG5ldyBjYWFsbG9jIHJvdXRpbmUgdG8gdXNlCi1yZWFsbG9jIC0gUG9pbnRlciB0byBuZXcgcmVhbGxvYyByb3V0aW5lIHRvIHVzZQotZnJlZSAgICAtIFBvaW50ZXIgdG8gbmV3IGZyZWUgcm91dGluZSB0byB1c2UKLQotUkVNQVJLUzoKLVRlbGxzIHRoZSBQTSBsaWJyYXJ5IHRvIHVzZSBhIHNldCBvZiB1c2VyIHNwZWNpZmllZCBtZW1vcnkgYWxsb2NhdGlvbgotcm91dGluZXMgaW5zdGVhZCBvZiB1c2luZyB0aGUgbm9ybWFsIG1hbGxvYy9jYWxsb2MvcmVhbGxvYy9mcmVlIHN0YW5kYXJkCi1DIGxpYnJhcnkgZnVuY3Rpb25zLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byB1c2UgYSB0aGlyZCBwYXJ0eQotZGVidWdnaW5nIG1hbGxvYyBsaWJyYXJ5IG9yIHBlcmhhcHMgYSBzZXQgb2YgZmFzdGVyIG1lbW9yeSBhbGxvY2F0aW9uCi1mdW5jdGlvbnMgd2l0aCB0aGUgUE0gbGlicmFyeSwgb3IgYW55IGFwcHMgdGhhdCB1c2UgdGhlIFBNIGxpYnJhcnkgKHN1Y2ggYXMKLXRoZSBNR0wpLiBPbmNlIHlvdSBoYXZlIHJlZ2lzdGVyZWQgeW91ciBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywgYWxsCi1jYWxscyB0byBQTV9tYWxsb2MsIFBNX2NhbGxvYywgUE1fcmVhbGxvYyBhbmQgUE1fZnJlZSB3aWxsIGJlIHJldmVjdG9yZWQgdG8KLXlvdXIgbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCi0KLVRoaXMgaXMgYWxzbyB1c2VmdWwgaWYgeW91IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBqdXN0IGhvdyBtdWNoIHBoeXNpY2FsCi1tZW1vcnkgeW91ciBwcm9ncmFtIGhhcyBiZWVuIHVzaW5nLiBZb3UgY2FuIHVzZSB0aGUgUE1fYXZhaWxhYmxlTWVtb3J5Ci1mdW5jdGlvbiB0byBmaW5kIG91dCBob3cgbXVjaCBwaHlzaWNhbCBtZW1vcnkgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIHByb2dyYW0KLXN0YXJ0cywgYW5kIHRoZW4geW91IGNhbiB1c2UgeW91ciBvd24gbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdG8KLWtlZXAgdHJhY2sgb2YgaG93IG11Y2ggbWVtb3J5IGhhcyBiZWVuIHVzZWQgYW5kIGZyZWVkLgotCi1OT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYXQgdGhlIHN0YXJ0IG9mIHlvdXIgYXBwbGljYXRpb24sCi0gICAgICBiZWZvcmUgeW91IGluaXRpYWxpc2UgYW55IG90aGVyIGNvbXBvbmVudHMgb3IgbGlicmFyaWVzLgotCi1OT1RFOiBDb2RlIGNvbXBpbGVkIGludG8gQmluYXJ5IFBvcnRhYmxlIERMTCdzIGFuZCBEcml2ZXJzIGF1dG9tYXRpY2FsbHkKLSAgICAgIGVuZCB1cCBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyB2aWEgdGhlIEJQRCBDIHJ1bnRpbWUgbGlicmFyeS4KLQotU0VFIEFMU086Ci1QTV9tYWxsb2MsIFBNX2NhbGxvYywgUE1fcmVhbGxvYywgUE1fZnJlZSwgUE1fYXZhaWxhYmxlTWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV91c2VMb2NhbE1hbGxvYygKLSAgICB2b2lkICogKCptYWxsb2MpKHNpemVfdCBzaXplKSwKLSAgICB2b2lkICogKCpjYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSksCi0gICAgdm9pZCAqICgqcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKSwKLSAgICB2b2lkICgqZnJlZSkodm9pZCAqcCkpCi17Ci0gICAgX19QTV9tYWxsb2MgPSBtYWxsb2M7Ci0gICAgX19QTV9jYWxsb2MgPSBjYWxsb2M7Ci0gICAgX19QTV9yZWFsbG9jID0gcmVhbGxvYzsKLSAgICBfX1BNX2ZyZWUgPSBmcmVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeS4KLQotSEVBREVSOgotcG1hcGkuaAotCi1QQVJBTUVURVJTOgotc2l6ZSAgICAtIFNpemUgb2YgYmxvY2sgdG8gYWxsb2NhdGUgaW4gYnl0ZXMKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gYWxsb2NhdGVkIGJsb2NrLCBvciBOVUxMIGlmIG91dCBvZiBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgb2YgbGVuZ3RoIHNpemUuIElmIHlvdSBoYXZlIGNoYW5nZWQgdGhlIG1lbW9yeQotYWxsb2NhdGlvbiByb3V0aW5lcyB3aXRoIHRoZSBQTV91c2VMb2NhbE1hbGxvYyBmdW5jdGlvbiwgdGhlbiBjYWxscyB0byB0aGlzCi1mdW5jdGlvbiB3aWxsIGFjdHVhbGx5IG1ha2UgY2FsbHMgdG8gdGhlIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCi10aGF0IHlvdSBoYXZlIHJlZ2lzdGVyZWQuCi0KLVNFRSBBTFNPOgotUE1fY2FsbG9jLCBQTV9yZWFsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2MoCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgcmV0dXJuIF9fUE1fbWFsbG9jKHNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1BbGxvY2F0ZSBhbmQgY2xlYXIgYSBsYXJnZSBtZW1vcnkgYmxvY2suCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLW5lbGVtICAgLSBudW1iZXIgb2YgY29udGlndW91cyBzaXplLWJ5dGUgdW5pdHMgdG8gYWxsb2NhdGUKLXNpemUgICAgLSBzaXplIG9mIHVuaXQgaW4gYnl0ZXMKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSBpZiBzdWNjZXNzZnVsLCBOVUxMIGlmIG91dCBvZiBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgb2YgbGVuZ3RoIChzaXplICogbmVsZW0pLCBhbmQgY2xlYXJzIHRoZQotYWxsb2NhdGVkIGFyZWEgd2l0aCB6ZXJvcyAoMCkuIElmIHlvdSBoYXZlIGNoYW5nZWQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uCi1yb3V0aW5lcyB3aXRoIHRoZSBQTV91c2VMb2NhbE1hbGxvYyBmdW5jdGlvbiwgdGhlbiBjYWxscyB0byB0aGlzIGZ1bmN0aW9uCi13aWxsIGFjdHVhbGx5IG1ha2UgY2FsbHMgdG8gdGhlIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHRoYXQgeW91Ci1oYXZlIHJlZ2lzdGVyZWQuCi0KLVNFRSBBTFNPOgotUE1fbWFsbG9jLCBQTV9yZWFsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9jYWxsb2MoCi0gICAgc2l6ZV90IG5lbGVtLAotICAgIHNpemVfdCBzaXplKQotewotICAgIHJldHVybiBfX1BNX2NhbGxvYyhuZWxlbSxzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmUtYWxsb2NhdGUgYSBibG9jayBvZiBtZW1vcnkKLQotSEVBREVSOgotcG1hcGkuaAotCi1QQVJBTUVURVJTOgotcHRyICAgICAtIFBvaW50ZXIgdG8gYmxvY2sgdG8gcmVzaXplCi1zaXplICAgIC0gc2l6ZSBvZiB1bml0IGluIGJ5dGVzCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBpZiBvdXQgb2YgbWVtb3J5LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFsbG9jYXRlcyBhIGJsb2NrIG9mIG1lbW9yeSB0aGF0IGhhcyBiZWVuIHByZXZpb3VzbHkgYmVlbgotYWxsb2NhdGVkIHRvIHRoZSBuZXcgb2Ygc2l6ZS4gVGhlIG5ldyBzaXplIG1heSBiZSBzbWFsbGVyIG9yIGxhcmdlciB0aGFuCi10aGUgb3JpZ2luYWwgYmxvY2sgb2YgbWVtb3J5LiBJZiB5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBtZW1vcnkgYWxsb2NhdGlvbgotcm91dGluZXMgd2l0aCB0aGUgUE1fdXNlTG9jYWxNYWxsb2MgZnVuY3Rpb24sIHRoZW4gY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgotd2lsbCBhY3R1YWxseSBtYWtlIGNhbGxzIHRvIHRoZSBsb2NhbCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB0aGF0IHlvdQotaGF2ZSByZWdpc3RlcmVkLgotCi1TRUUgQUxTTzoKLVBNX21hbGxvYywgUE1fY2FsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9yZWFsbG9jKAotICAgIHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSkKLXsKLSAgICByZXR1cm4gX19QTV9yZWFsbG9jKHB0cixzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotRnJlZXMgYSBibG9jayBvZiBtZW1vcnkuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLXAgICAtIFBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRvIGZyZWUKLQotUkVNQVJLUzoKLUZyZWVzIGEgYmxvY2sgb2YgbWVtb3J5IHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggZWl0aGVyIFBNX21hbGxvYywKLVBNX2NhbGxvYyBvciBQTV9yZWFsbG9jLgotCi1TRUUgQUxTTzoKLVBNX21hbGxvYywgUE1fY2FsbG9jLCBQTV9yZWFsbG9jLCBQTV91c2VMb2NhbE1hbGxvYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZSgKLSAgICB2b2lkICpwKQotewotICAgIF9fUE1fZnJlZShwKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tdHJyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vbXRyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWQ1ZjQ1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tdHJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgICAgICAgICAgICAgSGVhdmlseSBiYXNlZCBvbiBjb2RlIGNvcHlyaWdodCAoQykgUmljaGFyZCBHb29jaAotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBSaW5nIDAgZGV2aWNlIGRyaXZlcgotKgotKiBEZXNjcmlwdGlvbjogIEdlbmVyaWMgTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXIgKE1UUlIpIGZ1bmN0aW9ucyB0bwotKiAgICAgICAgICAgICAgIG1hbmlwdWxhdGUgdGhlIE1UUlIgcmVnaXN0ZXJzIG9uIHN1cHBvcnRlZCBDUFUncy4gVGhpcyBjb2RlCi0qICAgICAgICAgICAgICAgKm11c3QqIHJ1biBhdCByaW5nIDAsIHNvIHlvdSBjYW4ndCBub3JtYWxseSBpbmNsdWRlIHRoaXMKLSogICAgICAgICAgICAgICBjb2RlIGRpcmVjdGx5IGluIG5vcm1hbCBhcHBsaWNhdGlvbnMgKHRoZSBleGNlcHQgaXMgRE9TNEdXCi0qICAgICAgICAgICAgICAgYXBwcyB3aGljaCBydW4gYXQgcmluZyAwIHVuZGVyIHJlYWwgRE9TKS4gVGh1cyB0aGlzIGNvZGUKLSogICAgICAgICAgICAgICB3aWxsIG5vcm1hbGx5IGJlIGNvbXBpbGVkIGludG8gYSByaW5nIDAgZGV2aWNlIGRyaXZlciBmb3IKLSogICAgICAgICAgICAgICB0aGUgdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJ6dGltZXJjLmgiCi0jaW5jbHVkZSAibXRyci5oIgotCi0jaWZuZGVmIFJFQUxNT0RFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEludGVsIHByZS1kZWZpbmVkIE1UUlIgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgTlVNX0ZJWEVEX1JBTkdFUyAgICAgICAgODgKLSNkZWZpbmUgSU5URUxfY2FwX01TUiAgICAgICAgICAgMHgwRkUKLSNkZWZpbmUgSU5URUxfZGVmVHlwZV9NU1IgICAgICAgMHgyRkYKLSNkZWZpbmUgSU5URUxfZml4NjRLXzAwMDAwX01TUiAgMHgyNTAKLSNkZWZpbmUgSU5URUxfZml4MTZLXzgwMDAwX01TUiAgMHgyNTgKLSNkZWZpbmUgSU5URUxfZml4MTZLX0EwMDAwX01TUiAgMHgyNTkKLSNkZWZpbmUgSU5URUxfZml4NEtfQzAwMDBfTVNSICAgMHgyNjgKLSNkZWZpbmUgSU5URUxfZml4NEtfQzgwMDBfTVNSICAgMHgyNjkKLSNkZWZpbmUgSU5URUxfZml4NEtfRDAwMDBfTVNSICAgMHgyNkEKLSNkZWZpbmUgSU5URUxfZml4NEtfRDgwMDBfTVNSICAgMHgyNkIKLSNkZWZpbmUgSU5URUxfZml4NEtfRTAwMDBfTVNSICAgMHgyNkMKLSNkZWZpbmUgSU5URUxfZml4NEtfRTgwMDBfTVNSICAgMHgyNkQKLSNkZWZpbmUgSU5URUxfZml4NEtfRjAwMDBfTVNSICAgMHgyNkUKLSNkZWZpbmUgSU5URUxfZml4NEtfRjgwMDBfTVNSICAgMHgyNkYKLQotLyogTWFjcm9zIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgYSBwYXJpY3VsYXIgTVNSIHJlZ2lzdGVyICovCi0KLSNkZWZpbmUgSU5URUxfcGh5c0Jhc2VfTVNSKHJlZykgKDB4MjAwICsgMiAqIChyZWcpKQotI2RlZmluZSBJTlRFTF9waHlzTWFza19NU1IocmVnKSAoMHgyMDAgKyAyICogKHJlZykgKyAxKQotCi0vKiBDeXJpeCBDUFUgY29uZmlndXJhdGlvbiByZWdpc3RlciBpbmRleGVzICovCi0jZGVmaW5lIENYODZfQ0NSMCAweEMwCi0jZGVmaW5lIENYODZfQ0NSMSAweEMxCi0jZGVmaW5lIENYODZfQ0NSMiAweEMyCi0jZGVmaW5lIENYODZfQ0NSMyAweEMzCi0jZGVmaW5lIENYODZfQ0NSNCAweEU4Ci0jZGVmaW5lIENYODZfQ0NSNSAweEU5Ci0jZGVmaW5lIENYODZfQ0NSNiAweEVBCi0jZGVmaW5lIENYODZfRElSMCAweEZFCi0jZGVmaW5lIENYODZfRElSMSAweEZGCi0jZGVmaW5lIENYODZfQVJSX0JBU0UgMHhDNAotI2RlZmluZSBDWDg2X1JDUl9CQVNFIDB4REMKLQotLyogU3RydWN0dXJlIHRvIG1haW50YWluIG1hY2hpbmUgc3RhdGUgd2hpbGUgdXBkYXRpbmcgTVRSUiByZWdpc3RlcnMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgZmxhZ3M7Ci0gICAgdWxvbmcgICBkZWZUeXBlTG87Ci0gICAgdWxvbmcgICBkZWZUeXBlSGk7Ci0gICAgdWxvbmcgICBjcjRWYWw7Ci0gICAgdWxvbmcgICBjY3IzOwotICAgIH0gTVRSUkNvbnRleHQ7Ci0KLXN0YXRpYyBpbnQgICAgICBudW1NVFJSID0gLTE7Ci1zdGF0aWMgaW50ICAgICAgY3B1RmFtaWx5LGNwdVR5cGUsY3B1U3RlcHBpbmc7Ci1zdGF0aWMgdm9pZCAgICAgKCpnZXRNVFJSKSh1aW50IHJlZyx1bG9uZyAqYmFzZSx1bG9uZyAqc2l6ZSxpbnQgKnR5cGUpID0gTlVMTDsKLXN0YXRpYyB2b2lkICAgICAoKnNldE1UUlIpKHVpbnQgcmVnLHVsb25nIGJhc2UsdWxvbmcgc2l6ZSxpbnQgdHlwZSkgPSBOVUxMOwotc3RhdGljIGludCAgICAgICgqZ2V0RnJlZVJlZ2lvbikodWxvbmcgYmFzZSx1bG9uZyBzaXplKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotUmV0dXJucyBub24temVybyBpZiB3ZSBoYXZlIHRoZSB3cml0ZS1jb21iaW5pbmcgbWVtb3J5IHR5cGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IE1UUlJfaGF2ZVdyaXRlQ29tYmluZSh2b2lkKQotewotICAgIHVsb25nICAgY29uZmlnLGR1bW15OwotCi0gICAgc3dpdGNoIChjcHVGYW1pbHkpIHsKLQljYXNlIENQVV9BTUQ6Ci0JICAgIGlmIChjcHVUeXBlIDwgQ1BVX0FNREF0aGxvbikgewotCQkvKiBBTUQgSzYtMiBzdGVwcGluZyA4IGFuZCBsYXRlciBzdXBwb3J0IHRoZSBNVFJSIHJlZ2lzdGVycy4KLQkJICogVGhlIGVhcmxpZXIgSzYtMiBzdGVwcGluZ3MgKDMwME1oeiBtb2RlbHMpIGRvIG5vdAotCQkgKiBzdXBwb3J0IE1UUlIncy4KLQkJICovCi0JCWlmICgoY3B1VHlwZSA8IENQVV9BTURLNl8yKSB8fCAoY3B1VHlwZSA9PSBDUFVfQU1ESzZfMiAmJiBjcHVTdGVwcGluZyA8IDgpKQotCQkgICAgcmV0dXJuIDA7Ci0JCXJldHVybiAxOwotCQl9Ci0JICAgIC8qIEZhbGwgdGhyb3VnaCBmb3IgQU1EIEF0aGxvbiB3aGljaCB1c2VzIFA2IHN0eWxlIE1UUlIncyAqLwotCWNhc2UgQ1BVX0ludGVsOgotCSAgICBfTVRSUl9yZWFkTVNSKElOVEVMX2NhcF9NU1IsJmNvbmZpZywmZHVtbXkpOwotCSAgICByZXR1cm4gKGNvbmZpZyAmICgxIDw8IDEwKSk7Ci0JY2FzZSBDUFVfQ3lyaXg6Ci0JICAgIC8qIEN5cml4IDZ4ODYgYW5kIGxhdGVyIHN1cHBvcnQgdGhlIE1UUlIgcmVnaXN0ZXJzICovCi0JICAgIGlmIChjcHVUeXBlIDwgQ1BVX0N5cml4Nng4NikKLQkJcmV0dXJuIDA7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotCi1SRVRVUk5TOgotVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KLQotUkVNQVJLUzoKLUdlbmVyaWMgZnVuY3Rpb24gdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgYSBmcmVlIE1UUlIgcmVnaXN0ZXIgdG8gYmUgdXNlZAotZm9yIGNyZWF0aW5nIGEgbmV3IG1hcHBpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBHRU5FUklDX2dldEZyZWVSZWdpb24oCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplKQotewotICAgIGludCAgICAgaSxsdHlwZTsKLSAgICB1bG9uZyAgIGxiYXNlLGxzaXplOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1UUlI7IGkrKykgewotCWdldE1UUlIoaSwmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JaWYgKGxzaXplIDwgMSkKLQkgICAgcmV0dXJuIGk7Ci0JfQotICAgICh2b2lkKWJhc2U7Ci0gICAgKHZvaWQpc2l6ZTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLQotUkVUVVJOUzoKLVRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCi0KLVJFTUFSS1M6Ci1HZW5lcmljIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGEgZnJlZSBNVFJSIHJlZ2lzdGVyIHRvIGJlIHVzZWQKLWZvciBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgQU1ESzZfZ2V0RnJlZVJlZ2lvbigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUpCi17Ci0gICAgaW50ICAgICBpLGx0eXBlOwotICAgIHVsb25nICAgbGJhc2UsbHNpemU7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTVRSUjsgaSsrKSB7Ci0JZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKLQlpZiAobHNpemUgPCAxKQotCSAgICByZXR1cm4gaTsKLQl9Ci0gICAgKHZvaWQpYmFzZTsKLSAgICAodm9pZClzaXplOwotICAgIHJldHVybiAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotCi1SRVRVUk5TOgotVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KLQotUkVNQVJLUzoKLUN5cml4IHNwZWNpZmljIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGEgZnJlZSBNVFJSIHJlZ2lzdGVyIHRvIGJlCi11c2VkIGZvciBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgQ1lSSVhfZ2V0RnJlZVJlZ2lvbigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUpCi17Ci0gICAgaW50ICAgICBpLGx0eXBlOwotICAgIHVsb25nICAgbGJhc2UsIGxzaXplOwotCi0gICAgaWYgKHNpemUgPiAweDIwMDAwMDBVTCkgewotCS8qIElmIHdlIGFyZSB0byBzZXQgdXAgYSByZWdpb24gPjMyTSB0aGVuIGxvb2sgYXQgQVJSNyBpbW1lZGlhdGVseSAqLwotCWdldE1UUlIoNywmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JaWYgKGxzaXplIDwgMSkKLQkgICAgcmV0dXJuIDc7Ci0JfQotICAgIGVsc2UgewotCS8qIENoZWNrIEFSUjAtNiByZWdpc3RlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JICAgIGdldE1UUlIoaSwmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JICAgIGlmIChsc2l6ZSA8IDEpCi0JCXJldHVybiBpOwotCSAgICB9Ci0JLyogVHJ5IEFSUjcgYnV0IGl0cyBzaXplIG11c3QgYmUgYXQgbGVhc3QgMjU2SyAqLwotCWdldE1UUlIoNywmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JaWYgKChsc2l6ZSA8IDEpICYmIChzaXplID49IDB4NDAwMDApKQotCSAgICByZXR1cm4gaTsKLQl9Ci0gICAgKHZvaWQpYmFzZTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYyAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIG1hY2hpbmUgY29udGV4dCBhY3Jvc3MgdGhlIGNhbGwKLQotUkVNQVJLUzoKLVB1dHMgdGhlIHByb2Nlc3NvciBpbnRvIGEgc3RhdGUgd2hlcmUgTVRSUnMgY2FuIGJlIHNhZmVseSB1cGRhdGVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTVRSUl9iZWdpblVwZGF0ZSgKLSAgICBNVFJSQ29udGV4dCAqYykKLXsKLSAgICBjLT5mbGFncyA9IF9NVFJSX2Rpc2FibGVJbnQoKTsKLSAgICBpZiAoY3B1RmFtaWx5ICE9IENQVV9BTUQgfHwgKGNwdUZhbWlseSA9PSBDUFVfQU1EICYmIGNwdVR5cGUgPj0gQ1BVX0FNREF0aGxvbikpIHsKLQlzd2l0Y2ggKGNwdUZhbWlseSkgewotCSAgICBjYXNlIENQVV9JbnRlbDoKLQkgICAgY2FzZSBDUFVfQU1EOgotCQkvKiBEaXNhYmxlIE1UUlJzLCBhbmQgc2V0IHRoZSBkZWZhdWx0IHR5cGUgdG8gdW5jYWNoZWQgKi8KLQkJYy0+Y3I0VmFsID0gX01UUlJfc2F2ZUNSNCgpOwotCQlfTVRSUl9yZWFkTVNSKElOVEVMX2RlZlR5cGVfTVNSLCZjLT5kZWZUeXBlTG8sJmMtPmRlZlR5cGVIaSk7Ci0JCV9NVFJSX3dyaXRlTVNSKElOVEVMX2RlZlR5cGVfTVNSLGMtPmRlZlR5cGVMbyAmIDB4RjMwMFVMLGMtPmRlZlR5cGVIaSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIENQVV9DeXJpeDoKLQkJYy0+Y2NyMyA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1IzKTsKLQkJX01UUlJfc2V0Q3g4NihDWDg2X0NDUjMsICh1Y2hhcikoKGMtPmNjcjMgJiAweDBGKSB8IDB4MTApKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYyAgIC0gUGxhY2UgdG8gcmVzdG9yZSB0aGUgbWFjaGluZSBjb250ZXh0IGZyb20KLQotUkVNQVJLUzoKLVJlc3RvcmVzIHRoZSBwcm9jZXNzb3IgYWZ0ZXIgdXBkYXRpbmcgYW55IG9mIHRoZSByZWdpc3RlcnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBNVFJSX2VuZFVwZGF0ZSgKLSAgICBNVFJSQ29udGV4dCAqYykKLXsKLSAgICBpZiAoY3B1RmFtaWx5ICE9IENQVV9BTUQgfHwgKGNwdUZhbWlseSA9PSBDUFVfQU1EICYmIGNwdVR5cGUgPj0gQ1BVX0FNREF0aGxvbikpIHsKLQlQTV9mbHVzaFRMQigpOwotCXN3aXRjaCAoY3B1RmFtaWx5KSB7Ci0JICAgIGNhc2UgQ1BVX0ludGVsOgotCSAgICBjYXNlIENQVV9BTUQ6Ci0JCV9NVFJSX3dyaXRlTVNSKElOVEVMX2RlZlR5cGVfTVNSLGMtPmRlZlR5cGVMbyxjLT5kZWZUeXBlSGkpOwotCQlfTVRSUl9yZXN0b3JlQ1I0KGMtPmNyNFZhbCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIENQVV9DeXJpeDoKLQkJX01UUlJfc2V0Q3g4NihDWDg2X0NDUjMsKHVjaGFyKWMtPmNjcjMpOwotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgIC8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIChpZiBlbmFibGVkIHByZXZpb3VzbHkpICovCi0gICAgX01UUlJfcmVzdG9yZUludChjLT5mbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnICAgICAtIE1UUlIgcmVnaXN0ZXIgdG8gcmVhZAotYmFzZSAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgdHlwZSBvZiB0aGUgTVRSUiByZWdpc3RlcgotCi1SRU1BUktTOgotSW50ZWwgc3BlY2lmaWMgZnVuY3Rpb24gdG8gcmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBNVFJSIHJlZ2lzdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIElOVEVMX2dldE1UUlIoCi0gICAgdWludCByZWcsCi0gICAgdWxvbmcgKmJhc2UsCi0gICAgdWxvbmcgKnNpemUsCi0gICAgaW50ICp0eXBlKQotewotICAgIHVsb25nIGhpLG1hc2tMbyxiYXNlTG87Ci0KLSAgICBfTVRSUl9yZWFkTVNSKElOVEVMX3BoeXNNYXNrX01TUihyZWcpLCZtYXNrTG8sJmhpKTsKLSAgICBpZiAoKG1hc2tMbyAmIDB4ODAwKSA9PSAwKSB7Ci0JLyogTVRSUiBpcyBkaXNhYmxlZCwgc28gaXQgaXMgZnJlZSAqLwotCSpiYXNlID0gMDsKLQkqc2l6ZSA9IDA7Ci0JKnR5cGUgPSAwOwotCXJldHVybjsKLQl9Ci0gICAgX01UUlJfcmVhZE1TUihJTlRFTF9waHlzQmFzZV9NU1IocmVnKSwmYmFzZUxvLCZoaSk7Ci0gICAgbWFza0xvID0gKG1hc2tMbyAmIDB4RkZGRkYwMDBVTCk7Ci0gICAgKnNpemUgPSB+KG1hc2tMbyAtIDEpOwotICAgICpiYXNlID0gKGJhc2VMbyAmIDB4RkZGRkYwMDBVTCk7Ci0gICAgKnR5cGUgPSAoYmFzZUxvICYgMHhGRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnICAgICAtIE1UUlIgcmVnaXN0ZXIgdG8gc2V0Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRU1BUktTOgotSW50ZWwgc3BlY2lmaWMgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIE1UUlIgcmVnaXN0ZXIgdG8KLXRoZSBwYXNzZWQgaW4gYmFzZSwgc2l6ZSBhbmQgdHlwZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBJTlRFTF9zZXRNVFJSKAotICAgIHVpbnQgcmVnLAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICBpbnQgdHlwZSkKLXsKLSAgICBNVFJSQ29udGV4dCBjOwotCi0gICAgTVRSUl9iZWdpblVwZGF0ZSgmYyk7Ci0gICAgaWYgKHNpemUgPT0gMCkgewotCS8qIFRoZSBpbnZhbGlkIGJpdCBpcyBrZXB0IGluIHRoZSBtYXNrLCBzbyB3ZSBzaW1wbHkgY2xlYXIgdGhlCi0JICogcmVsZXZhbnQgbWFzayByZWdpc3RlciB0byBkaXNhYmxlIGEgcmFuZ2UuCi0JICovCi0JX01UUlJfd3JpdGVNU1IoSU5URUxfcGh5c01hc2tfTVNSKHJlZyksMCwwKTsKLQl9Ci0gICAgZWxzZSB7Ci0JX01UUlJfd3JpdGVNU1IoSU5URUxfcGh5c0Jhc2VfTVNSKHJlZyksYmFzZSB8IHR5cGUsMCk7Ci0JX01UUlJfd3JpdGVNU1IoSU5URUxfcGh5c01hc2tfTVNSKHJlZyksfihzaXplIC0gMSkgfCAweDgwMCwwKTsKLQl9Ci0gICAgTVRSUl9lbmRVcGRhdGUoJmMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURpc2FibGVkIGJhbmtlZCB3cml0ZSBjb21iaW5nIGZvciBJbnRlbCBwcm9jZXNzb3JzLiBXZSBhbHdheXMgZGlzYWJsZSB0aGlzCi1iZWNhdXNlIGl0IGludmFyaWFibHkgY2F1c2VzIHByb2JsZW1zIHdpdGggb2xkZXIgaGFyZHdhcmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgSU5URUxfZGlzYWJsZUJhbmtlZFdyaXRlQ29tYmluZSh2b2lkKQotewotICAgIE1UUlJDb250ZXh0IGM7Ci0KLSAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKLSAgICBfTVRSUl93cml0ZU1TUihJTlRFTF9maXgxNktfQTAwMDBfTVNSLDAsMCk7Ci0gICAgTVRSUl9lbmRVcGRhdGUoJmMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZyAgICAgLSBNVFJSIHJlZ2lzdGVyIHRvIHNldAotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLUludGVsIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBNVFJSIHJlZ2lzdGVyIHRvCi10aGUgcGFzc2VkIGluIGJhc2UsIHNpemUgYW5kIHR5cGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgQU1EX2dldE1UUlIoCi0gICAgdWludCByZWcsCi0gICAgdWxvbmcgKmJhc2UsCi0gICAgdWxvbmcgKnNpemUsCi0gICAgaW50ICp0eXBlKQotewotICAgIHVsb25nICAgbG93LGhpZ2g7Ci0KLSAgICAvKiAgVXBwZXIgZHdvcmQgaXMgcmVnaW9uIDEsIGxvd2VyIGlzIHJlZ2lvbiAwICAqLwotICAgIF9NVFJSX3JlYWRNU1IoMHhDMDAwMDA4NSwgJmxvdywgJmhpZ2gpOwotICAgIGlmIChyZWcgPT0gMSkKLQlsb3cgPSBoaWdoOwotCi0gICAgLyogRmluZCB0aGUgYmFzZSBhbmQgdHlwZSBmb3IgdGhlIHJlZ2lvbiAqLwotICAgICpiYXNlID0gbG93ICYgMHhGRkZFMDAwMDsKLSAgICAqdHlwZSA9IDA7Ci0gICAgaWYgKGxvdyAmIDEpCi0JKnR5cGUgPSBQTV9NVFJSX1VOQ0FDSEFCTEU7Ci0gICAgaWYgKGxvdyAmIDIpCi0JKnR5cGUgPSBQTV9NVFJSX1dSQ09NQjsKLSAgICBpZiAoKGxvdyAmIDMpID09IDApIHsKLQkqc2l6ZSA9IDA7Ci0JcmV0dXJuOwotCX0KLQotICAgIC8qIFRoaXMgbmVlZHMgYSBsaXR0bGUgZXhwbGFpbmluZy4gVGhlIHNpemUgaXMgc3RvcmVkIGFzIGFuCi0gICAgICogaW52ZXJ0ZWQgbWFzayBvZiBiaXRzIG9mIDEyOEsgZ3JhbnVsYXJpdHkgMTUgYml0cyBsb25nIG9mZnNldAotICAgICAqIDIgYml0cwotICAgICAqCi0gICAgICogU28gdG8gZ2V0IGEgc2l6ZSB3ZSBkbyBpbnZlcnQgdGhlIG1hc2sgYW5kIGFkZCAxIHRvIHRoZSBsb3dlc3QKLSAgICAgKiBtYXNrIGJpdCAoNCBhcyBpdHMgMiBiaXRzIGluKS4gVGhpcyBnaXZlcyB1cyBhIHNpemUgd2UgdGhlbiBzaGlmdAotICAgICAqIHRvIHR1cm4gaW50byAxMjhLIGJsb2NrcwotICAgICAqCi0gICAgICogIGVnICAgICAgICAgICAgICAxMTEgMTExMSAxMTExIDExMDAgICAgICBpcyA1MTJLCi0gICAgICoKLSAgICAgKiAgaW52ZXJ0ICAgICAgICAgIDAwMCAwMDAwIDAwMDAgMDAxMQotICAgICAqICArMSAgICAgICAgICAgICAgMDAwIDAwMDAgMDAwMCAwMTAwCi0gICAgICogICoxMjhLICAgLi4uCi0gICAgICovCi0gICAgbG93ID0gKH5sb3cpICYgMHgwRkZGQzsKLSAgICAqc2l6ZSA9IChsb3cgKyA0KSA8PCAxNTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byBzZXQKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1JbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3RlciB0bwotdGhlIHBhc3NlZCBpbiBiYXNlLCBzaXplIGFuZCB0eXBlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEFNRF9zZXRNVFJSKAotICAgIHVpbnQgcmVnLAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICBpbnQgdHlwZSkKLXsKLSAgICB1bG9uZyAgICAgICBsb3csaGlnaCxuZXdWYWw7Ci0gICAgTVRSUkNvbnRleHQgYzsKLQotICAgIE1UUlJfYmVnaW5VcGRhdGUoJmMpOwotICAgIF9NVFJSX3JlYWRNU1IoMHhDMDAwMDA4NSwgJmxvdywgJmhpZ2gpOwotICAgIGlmIChzaXplID09IDApIHsKLQkvKiBDbGVhciByZWdpc3RlciB0byBkaXNhYmxlICovCi0JaWYgKHJlZykKLQkgICAgaGlnaCA9IDA7Ci0JZWxzZQotCSAgICBsb3cgPSAwOwotCX0KLSAgICBlbHNlIHsKLQkvKiBTZXQgdGhlIHJlZ2lzdGVyIHRvIHRoZSBiYXNlIChhbHJlYWR5IHNoaWZ0ZWQgZm9yIHVzKSwgdGhlCi0JICogdHlwZSAob2ZmIGJ5IG9uZSkgYW5kIGFuIGludmVydGVkIGJpdG1hc2sgb2YgdGhlIHNpemUKLQkgKiBUaGUgc2l6ZSBpcyB0aGUgb25seSBvZGQgYml0LiBXZSBhcmUgZmVkIHNheSA1MTJLCi0JICogV2UgaW52ZXJ0IHRoaXMgYW5kIHdlIGdldCAxMTEgMTExMSAxMTExIDEwMTEgYnV0Ci0JICogaWYgeW91IHN1YnRyYWN0IG9uZSBhbmQgaW52ZXJ0IHlvdSBnZXQgdGhlIGRlc2lyZWQKLQkgKiAxMTEgMTExMSAxMTExIDExMDAgbWFzawotCSAqLwotCW5ld1ZhbCA9ICgoKH4oc2l6ZS0xKSkgPj4gMTUpICYgMHgwMDAxRkZGQykgfCBiYXNlIHwgKHR5cGUrMSk7Ci0JaWYgKHJlZykKLQkgICAgaGlnaCA9IG5ld1ZhbDsKLQllbHNlCi0JICAgIGxvdyA9IG5ld1ZhbDsKLQl9Ci0KLSAgICAvKiBUaGUgd3JpdGViYWNrIHJ1bGUgaXMgcXVpdGUgc3BlY2lmaWMuIFNlZSB0aGUgbWFudWFsLiBJdHMKLSAgICAgKiBkaXNhYmxlIGxvY2FsIGludGVycnVwdHMsIHdyaXRlIGJhY2sgdGhlIGNhY2hlLCBzZXQgdGhlIE1UUlIKLSAgICAgKi8KLSAgICBQTV9mbHVzaFRMQigpOwotICAgIF9NVFJSX3dyaXRlTVNSKDB4QzAwMDAwODUsIGxvdywgaGlnaCk7Ci0gICAgTVRSUl9lbmRVcGRhdGUoJmMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZyAgICAgLSBNVFJSIHJlZ2lzdGVyIHRvIHNldAotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLUludGVsIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBNVFJSIHJlZ2lzdGVyIHRvCi10aGUgcGFzc2VkIGluIGJhc2UsIHNpemUgYW5kIHR5cGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgQ1lSSVhfZ2V0TVRSUigKLSAgICB1aW50IHJlZywKLSAgICB1bG9uZyAqYmFzZSwKLSAgICB1bG9uZyAqc2l6ZSwKLSAgICBpbnQgKnR5cGUpCi17Ci0gICAgTVRSUkNvbnRleHQgYzsKLSAgICB1Y2hhciAgICAgICBhcnIgPSBDWDg2X0FSUl9CQVNFICsgcmVnKjM7Ci0gICAgdWNoYXIgICAgICAgcmNyLHNoaWZ0OwotCi0gICAgLyogU2F2ZSBmbGFncyBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0gICAgTVRSUl9iZWdpblVwZGF0ZSgmYyk7Ci0gICAgKCh1Y2hhciopYmFzZSlbM10gID0gX01UUlJfZ2V0Q3g4NihhcnIpOwotICAgICgodWNoYXIqKWJhc2UpWzJdICA9IF9NVFJSX2dldEN4ODYoKHVjaGFyKShhcnIrMSkpOwotICAgICgodWNoYXIqKWJhc2UpWzFdICA9IF9NVFJSX2dldEN4ODYoKHVjaGFyKShhcnIrMikpOwotICAgIHJjciA9IF9NVFJSX2dldEN4ODYoKHVjaGFyKShDWDg2X1JDUl9CQVNFICsgcmVnKSk7Ci0gICAgTVRSUl9lbmRVcGRhdGUoJmMpOwotCi0gICAgLyogRW5hYmxlIGludGVycnVwdHMgaWYgaXQgd2FzIGVuYWJsZWQgcHJldmlvdXNseSAqLwotICAgIHNoaWZ0ID0gKCh1Y2hhciopYmFzZSlbMV0gJiAweDBmOwotICAgICpiYXNlICY9IDB4RkZGRkYwMDBVTDsKLQotICAgIC8qIFBvd2VyIG9mIHR3bywgYXQgbGVhc3QgNEsgb24gQVJSMC1BUlI2LCAyNTZLIG9uIEFSUjcKLSAgICAgKiBOb3RlOiBzaGlmdD09MHhGIG1lYW5zIDRHLCB0aGlzIGlzIHVuc3VwcG9ydGVkLgotICAgICAqLwotICAgIGlmIChzaGlmdCkKLQkqc2l6ZSA9IChyZWcgPCA3ID8gMHg4MDBVTCA6IDB4MjAwMDBVTCkgPDwgc2hpZnQ7Ci0gICAgZWxzZQotCSpzaXplID0gMDsKLQotICAgIC8qIEJpdCAwIGlzIENhY2hlIEVuYWJsZSBvbiBBUlI3LCBDYWNoZSBEaXNhYmxlIG9uIEFSUjAtQVJSNiAqLwotICAgIGlmIChyZWcgPCA3KSB7Ci0Jc3dpdGNoIChyY3IpIHsKLQkgICAgY2FzZSAgMTogKnR5cGUgPSBQTV9NVFJSX1VOQ0FDSEFCTEU7IGJyZWFrOwotCSAgICBjYXNlICA4OiAqdHlwZSA9IFBNX01UUlJfV1JCQUNLOyAgICAgYnJlYWs7Ci0JICAgIGNhc2UgIDk6ICp0eXBlID0gUE1fTVRSUl9XUkNPTUI7ICAgICBicmVhazsKLQkgICAgY2FzZSAyNDoKLQkgICAgZGVmYXVsdDogKnR5cGUgPSBQTV9NVFJSX1dSVEhST1VHSDsgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIGVsc2UgewotCXN3aXRjaCAocmNyKSB7Ci0JICAgIGNhc2UgIDA6ICp0eXBlID0gUE1fTVRSUl9VTkNBQ0hBQkxFOyBicmVhazsKLQkgICAgY2FzZSAgODogKnR5cGUgPSBQTV9NVFJSX1dSQ09NQjsgICAgIGJyZWFrOwotCSAgICBjYXNlICA5OiAqdHlwZSA9IFBNX01UUlJfV1JCQUNLOyAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjU6Ci0JICAgIGRlZmF1bHQ6ICp0eXBlID0gUE1fTVRSUl9XUlRIUk9VR0g7ICBicmVhazsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byBzZXQKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1JbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3RlciB0bwotdGhlIHBhc3NlZCBpbiBiYXNlLCBzaXplIGFuZCB0eXBlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIENZUklYX3NldE1UUlIoCi0gICAgdWludCByZWcsCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIGludCB0eXBlKQotewotICAgIE1UUlJDb250ZXh0IGM7Ci0gICAgdWNoYXIgICAgICAgYXJyID0gQ1g4Nl9BUlJfQkFTRSArIHJlZyozOwotICAgIHVjaGFyICAgICAgIGFycl90eXBlLGFycl9zaXplOwotCi0gICAgLyogQ291bnQgZG93biBmcm9tIDMyTSAoQVJSMC1BUlI2KSBvciBmcm9tIDJHIChBUlI3KSAqLwotICAgIHNpemUgPj49IChyZWcgPCA3ID8gMTIgOiAxOCk7Ci0gICAgc2l6ZSAmPSAweDdGRkY7IC8qIE1ha2Ugc3VyZSBhcnJfc2l6ZSA8PSAxNCAqLwotICAgIGZvciAoYXJyX3NpemUgPSAwOyBzaXplOyBhcnJfc2l6ZSsrLCBzaXplID4+PSAxKQotCTsKLSAgICBpZiAocmVnIDwgNykgewotCXN3aXRjaCAodHlwZSkgewotCSAgICBjYXNlIFBNX01UUlJfVU5DQUNIQUJMRTogICAgYXJyX3R5cGUgPSAgMTsgYnJlYWs7Ci0JICAgIGNhc2UgUE1fTVRSUl9XUkNPTUI6ICAgICAgICBhcnJfdHlwZSA9ICA5OyBicmVhazsKLQkgICAgY2FzZSBQTV9NVFJSX1dSVEhST1VHSDogICAgIGFycl90eXBlID0gMjQ7IGJyZWFrOwotCSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgYXJyX3R5cGUgPSAgODsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgZWxzZSB7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JICAgIGNhc2UgUE1fTVRSUl9VTkNBQ0hBQkxFOiAgICBhcnJfdHlwZSA9ICAwOyBicmVhazsKLQkgICAgY2FzZSBQTV9NVFJSX1dSQ09NQjogICAgICAgIGFycl90eXBlID0gIDg7IGJyZWFrOwotCSAgICBjYXNlIFBNX01UUlJfV1JUSFJPVUdIOiAgICAgYXJyX3R5cGUgPSAyNTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICBhcnJfdHlwZSA9ICA5OyBicmVhazsKLQkgICAgfQotCX0KLSAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKLSAgICBfTVRSUl9zZXRDeDg2KCh1Y2hhcilhcnIsICAgICAoKHVjaGFyKikmYmFzZSlbM10pOwotICAgIF9NVFJSX3NldEN4ODYoKHVjaGFyKShhcnIrMSksICgodWNoYXIqKSZiYXNlKVsyXSk7Ci0gICAgX01UUlJfc2V0Q3g4NigodWNoYXIpKGFycisyKSwgKHVjaGFyKSgoKCh1Y2hhciopJmJhc2UpWzFdKSB8IGFycl9zaXplKSk7Ci0gICAgX01UUlJfc2V0Q3g4NigodWNoYXIpKENYODZfUkNSX0JBU0UgKyByZWcpLCAodWNoYXIpYXJyX3R5cGUpOwotICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PbiBDeXJpeCA2eDg2KE1YKSBhbmQgTUlJIHRoZSBBUlIzIGlzIHNwZWNpYWw6IGl0IGhhcyBjb25uZWN0aW9uCi13aXRoIHRoZSBTTU0gKFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUpIG1vZGUuIFNvIHdlIG5lZWQgdGhlIGZvbGxvd2luZzoKLUNoZWNrIHdoZXRoZXIgU01JX0xPQ0sgKENDUjMgYml0IDApIGlzIHNldAotICBpZiBpdCBpcyBzZXQsIEFSUjMgY2Fubm90IGJlIGNoYW5nZWQgIChpdCBjYW5ub3QgYmUgY2hhbmdlZCB1bnRpbCB0aGUKLSAgICBuZXh0IHByb2Nlc3NvciByZXNldCkKLSAgaWYgaXQgaXMgcmVzZXQsIHRoZW4gd2UgY2FuIGNoYW5nZSBpdCwgc2V0IGFsbCB0aGUgbmVlZGVkIGJpdHM6Ci0gICAtIGRpc2FibGUgYWNjZXNzIHRvIFNNTSBtZW1vcnkgdGhyb3VnaCBBUlIzIHJhbmdlIChDQ1IxIGJpdCA3IHJlc2V0KQotICAgLSBkaXNhYmxlIGFjY2VzcyB0byBTTU0gbWVtb3J5IChDQ1IxIGJpdCAyIHJlc2V0KQotICAgLSBkaXNhYmxlIFNNTSBtb2RlIChDQ1IxIGJpdCAxIHJlc2V0KQotICAgLSBkaXNhYmxlIHdyaXRlIHByb3RlY3Rpb24gb2YgQVJSMyAoQ0NSNiBiaXQgMSByZXNldCkKLSAgIC0gKG1heWJlKSBkaXNhYmxlIEFSUjMKLUp1c3QgdG8gYmUgc3VyZSwgd2UgZW5hYmxlIEFSUiB1c2FnZSBieSB0aGUgcHJvY2Vzc29yIChDQ1I1IGJpdCA1IHNldCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBDWVJJWF9pbml0QVJSKHZvaWQpCi17Ci0gICAgTVRSUkNvbnRleHQgYzsKLSAgICB1Y2hhciAgICAgICBjY3JbN107Ci0gICAgaW50ICAgICAgICAgY2NyY1s3XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwotCi0gICAgLyogQmVnaW4gdXBkYXRpbmcgKi8KLSAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKLQotICAgIC8qIFNhdmUgYWxsIENDUnMgbG9jYWxseSAqLwotICAgIGNjclswXSA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1IwKTsKLSAgICBjY3JbMV0gPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSMSk7Ci0gICAgY2NyWzJdID0gX01UUlJfZ2V0Q3g4NihDWDg2X0NDUjIpOwotICAgIGNjclszXSA9ICh1Y2hhciljLmNjcjM7Ci0gICAgY2NyWzRdID0gX01UUlJfZ2V0Q3g4NihDWDg2X0NDUjQpOwotICAgIGNjcls1XSA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1I1KTsKLSAgICBjY3JbNl0gPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSNik7Ci0gICAgaWYgKGNjclszXSAmIDEpCi0JY2NyY1szXSA9IDE7Ci0gICAgZWxzZSB7Ci0JLyogRGlzYWJsZSBTTU0gbW9kZSAoYml0IDEpLCBhY2Nlc3MgdG8gU01NIG1lbW9yeSAoYml0IDIpIGFuZAotCSAqIGFjY2VzcyB0byBTTU0gbWVtb3J5IHRocm91Z2ggQVJSMyAoYml0IDcpLgotCSAqLwotCWlmIChjY3JbNl0gJiAweDAyKSB7Ci0JICAgIGNjcls2XSAmPSAweEZEOwotCSAgICBjY3JjWzZdID0gMTsgICAgICAgIC8qIERpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiBvZiBBUlIzLiAqLwotCSAgICBfTVRSUl9zZXRDeDg2KENYODZfQ0NSNixjY3JbNl0pOwotCSAgICB9Ci0JfQotCi0gICAgLyogSWYgd2UgY2hhbmdlZCBDQ1IxIGluIG1lbW9yeSwgY2hhbmdlIGl0IGluIHRoZSBwcm9jZXNzb3IsIHRvby4gKi8KLSAgICBpZiAoY2NyY1sxXSkKLQlfTVRSUl9zZXRDeDg2KENYODZfQ0NSMSxjY3JbMV0pOwotCi0gICAgLyogRW5hYmxlIEFSUiB1c2FnZSBieSB0aGUgcHJvY2Vzc29yICovCi0gICAgaWYgKCEoY2NyWzVdICYgMHgyMCkpIHsKLQljY3JbNV0gfD0gMHgyMDsKLQljY3JjWzVdID0gMTsKLQlfTVRSUl9zZXRDeDg2KENYODZfQ0NSNSxjY3JbNV0pOwotCX0KLQotICAgIC8qIFdlIGFyZSBmaW5pc2hlZCB1cGRhdGluZyAqLwotICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBNVFJSIG1vZHVsZSwgYnkgZGV0ZWN0aW5nIHRoZSBwcm9jZXNzb3IgdHlwZSBhbmQgZGV0ZXJtaW5pbmcKLWlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIE1UUlIgZnVuY3Rpb25hbGl0eS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE1UUlJfaW5pdCh2b2lkKQotewotICAgIGludCAgICAgaSxjcHUsbHR5cGU7Ci0gICAgdWxvbmcgICBlYXgsZWR4LGxiYXNlLGxzaXplOwotCi0gICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgY29tcGF0aWJsZSBDUFUgKi8KLSAgICBpZiAobnVtTVRSUiA9PSAtMSkgewotCW51bU1UUlIgPSAwOwotCWlmICghX01UUlJfaXNSaW5nMCgpKQotCSAgICByZXR1cm47Ci0JY3B1ID0gQ1BVX2dldFByb2Nlc3NvclR5cGUoKTsKLQljcHVGYW1pbHkgPSBjcHUgJiBDUFVfZmFtaWx5TWFzazsKLQljcHVUeXBlID0gY3B1ICYgQ1BVX21hc2s7Ci0JY3B1U3RlcHBpbmcgPSAoY3B1ICYgQ1BVX3N0ZXBwaW5nTWFzaykgPj4gQ1BVX3N0ZXBwaW5nU2hpZnQ7Ci0Jc3dpdGNoIChjcHVGYW1pbHkpIHsKLQkgICAgY2FzZSBDUFVfSW50ZWw6Ci0JCS8qIEludGVsIFBlbnRpdW0gUHJvIGFuZCBsYXRlciBzdXBwb3J0IHRoZSBNVFJSIHJlZ2lzdGVycyAqLwotCQlpZiAoY3B1VHlwZSA8IENQVV9QZW50aXVtUHJvKQotCQkgICAgcmV0dXJuOwotCQlfTVRSUl9yZWFkTVNSKElOVEVMX2NhcF9NU1IsJmVheCwmZWR4KTsKLQkJbnVtTVRSUiA9IGVheCAmIDB4RkY7Ci0JCWdldE1UUlIgPSBJTlRFTF9nZXRNVFJSOwotCQlzZXRNVFJSID0gSU5URUxfc2V0TVRSUjsKLQkJZ2V0RnJlZVJlZ2lvbiA9IEdFTkVSSUNfZ2V0RnJlZVJlZ2lvbjsKLQkJSU5URUxfZGlzYWJsZUJhbmtlZFdyaXRlQ29tYmluZSgpOwotCQlicmVhazsKLQkgICAgY2FzZSBDUFVfQU1EOgotCQkvKiBBTUQgSzYtMiBhbmQgbGF0ZXIgc3VwcG9ydCB0aGUgTVRSUiByZWdpc3RlcnMgKi8KLQkJaWYgKChjcHVUeXBlIDwgQ1BVX0FNREs2XzIpIHx8IChjcHVUeXBlID09IENQVV9BTURLNl8yICYmIGNwdVN0ZXBwaW5nIDwgOCkpCi0JCSAgICByZXR1cm47Ci0JCWlmIChjcHVUeXBlIDwgQ1BVX0FNREF0aGxvbikgewotCQkgICAgbnVtTVRSUiA9IDI7ICAgICAgICAvKiBBTUQgQ1BVJ3MgaGF2ZSAyIE1UUlIncyAqLwotCQkgICAgZ2V0TVRSUiA9IEFNRF9nZXRNVFJSOwotCQkgICAgc2V0TVRSUiA9IEFNRF9zZXRNVFJSOwotCQkgICAgZ2V0RnJlZVJlZ2lvbiA9IEFNREs2X2dldEZyZWVSZWdpb247Ci0KLQkJICAgIC8qIEZvciBzb21lIHJlYXNvbiBzb21lIElCTSBzeXN0ZW1zIHdpdGggSzYtMiBwcm9jZXNzb3JzCi0JCSAgICAgKiBoYXZlIHdyaXRlIGNvbWJpbmVkIGVuYWJsZWQgZm9yIHRoZSBzeXN0ZW0gQklPUwotCQkgICAgICogcmVnaW9uIGZyb20gMHhFMDAwMCB0byAweEZGRkZGRi4gV2UgbmVlZCAqYm90aCogTVRSUidzCi0JCSAgICAgKiBmb3Igb3VyIG93biBncmFwaGljcyBkcml2ZXJzLCBzbyBpZiB3ZSBkZXRlY3QgYW55Ci0JCSAgICAgKiByZWdpb25zIGJlbG93IHRoZSAxTWVnIGJvdW5kYXJ5LCB3ZSByZW1vdmUgdGhlbQotCQkgICAgICogc28gd2UgY2FuIHVzZSB0aGlzIE1UUlIgcmVnaXN0ZXIgb3Vyc2VsdmVzLgotCQkgICAgICovCi0JCSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTVRSUjsgaSsrKSB7Ci0JCQlnZXRNVFJSKGksJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOwotCQkJaWYgKGxiYXNlIDwgMHgxMDAwMDApCi0JCQkgICAgc2V0TVRSUihpLDAsMCwwKTsKLQkJCX0KLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICAvKiBBTUQgQXRobG9uIHVzZXMgUDYgc3R5bGUgTVRSUidzICovCi0JCSAgICBfTVRSUl9yZWFkTVNSKElOVEVMX2NhcF9NU1IsJmVheCwmZWR4KTsKLQkJICAgIG51bU1UUlIgPSBlYXggJiAweEZGOwotCQkgICAgZ2V0TVRSUiA9IElOVEVMX2dldE1UUlI7Ci0JCSAgICBzZXRNVFJSID0gSU5URUxfc2V0TVRSUjsKLQkJICAgIGdldEZyZWVSZWdpb24gPSBHRU5FUklDX2dldEZyZWVSZWdpb247Ci0JCSAgICBJTlRFTF9kaXNhYmxlQmFua2VkV3JpdGVDb21iaW5lKCk7Ci0JCSAgICB9Ci0JCWJyZWFrOwotCSAgICBjYXNlIENQVV9DeXJpeDoKLQkJLyogQ3lyaXggNng4NiBhbmQgbGF0ZXIgc3VwcG9ydCB0aGUgTVRSUiByZWdpc3RlcnMgKi8KLQkJaWYgKGNwdVR5cGUgPCBDUFVfQ3lyaXg2eDg2IHx8IGNwdVR5cGUgPj0gQ1BVX0N5cml4TWVkaWFHWCkKLQkJICAgIHJldHVybjsKLQkJbnVtTVRSUiA9IDg7ICAgICAgICAvKiBDeXJpeCBDUFUncyBoYXZlIDggQVJSJ3MgKi8KLQkJZ2V0TVRSUiA9IENZUklYX2dldE1UUlI7Ci0JCXNldE1UUlIgPSBDWVJJWF9zZXRNVFJSOwotCQlnZXRGcmVlUmVnaW9uID0gQ1lSSVhfZ2V0RnJlZVJlZ2lvbjsKLQkJQ1lSSVhfaW5pdEFSUigpOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJcmV0dXJuOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICBpbnQgICAgIGk7Ci0gICAgaW50ICAgICBsdHlwZTsKLSAgICB1bG9uZyAgIGxiYXNlLGxzaXplLGxhc3Q7Ci0KLSAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBDUFUgdGhhdCBzdXBwb3J0cyBNVFJSJ3MgYW5kIHR5cGUgaXMgdmFsaWQgKi8KLSAgICBpZiAobnVtTVRSUiA8PSAwKSB7Ci0JaWYgKCFfTVRSUl9pc1JpbmcwKCkpCi0JICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOwotCXJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7Ci0JfQotICAgIGlmICh0eXBlID49IFBNX01UUlJfTUFYKQotCXJldHVybiBQTV9NVFJSX0VSUl9QQVJBTVM7Ci0KLSAgICAvKiBJZiB0aGUgdHlwZSBpcyBXQywgY2hlY2sgdGhhdCB0aGlzIHByb2Nlc3NvciBzdXBwb3J0cyBpdCAqLwotICAgIGlmICghTVRSUl9oYXZlV3JpdGVDb21iaW5lKCkpCi0JcmV0dXJuIFBNX01UUlJfRVJSX05PV1JDT01COwotCi0gICAgLyogQWRqdXN0IHRoZSBib3VuZGFyaWVzIGRlcGVuZGluZyBvbiB0aGUgQ1BVIHR5cGUgKi8KLSAgICBzd2l0Y2ggKGNwdUZhbWlseSkgewotCWNhc2UgQ1BVX0FNRDoKLQkgICAgaWYgKGNwdVR5cGUgPCBDUFVfQU1EQXRobG9uKSB7Ci0JCS8qIEFwcGx5IHRoZSBLNiBibG9jayBhbGlnbm1lbnQgYW5kIHNpemUgcnVsZXMuIEluIG9yZGVyOgotCQkgKiAgbyBVbmNhY2hlZCBvciBnYXRoZXJpbmcgb25seQotCQkgKiAgbyAxMjhLIG9yIGJpZ2dlciBibG9jawotCQkgKiAgbyBQb3dlciBvZiAyIGJsb2NrCi0JCSAqICBvIGJhc2Ugc3VpdGFibHkgYWxpZ25lZCB0byB0aGUgcG93ZXIKLQkJICovCi0JCWlmICh0eXBlID4gUE1fTVRSUl9XUkNPTUIgJiYgKHNpemUgPCAoMSA8PCAxNykgfHwgKHNpemUgJiB+KHNpemUtMSkpLXNpemUgfHwgKGJhc2UgJiAoc2l6ZS0xKSkpKQotCQkgICAgcmV0dXJuIFBNX01UUlJfRVJSX05PVF9BTElHTkVEOwotCQlicmVhazsKLQkJfQotCSAgICAvKiBGYWxsIHRocm91Z2ggZm9yIEFNRCBBdGhsb24gd2hpY2ggdXNlcyBQNiBzdHlsZSBNVFJSJ3MgKi8KLQljYXNlIENQVV9JbnRlbDoKLQljYXNlIENQVV9DeXJpeDoKLQkgICAgaWYgKChiYXNlICYgMHhGRkYpIHx8IChzaXplICYgMHhGRkYpKSB7Ci0JCS8qIEJhc2UgYW5kIHNpemUgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNEtiICovCi0JCXJldHVybiBQTV9NVFJSX0VSUl9OT1RfNEtCX0FMSUdORUQ7Ci0JCX0KLQkgICAgaWYgKGJhc2UgPCAweDEwMDAwMCkgewotCQkvKiBCYXNlIG11c3QgYmUgPj0gMU1iICovCi0JCXJldHVybiBQTV9NVFJSX0VSUl9CRUxPV18xTUI7Ci0JCX0KLQotCSAgICAvKiBDaGVjayB1cHBlciBiaXRzIG9mIGJhc2UgYW5kIGxhc3QgYXJlIGVxdWFsIGFuZCBsb3dlciBiaXRzCi0JICAgICAqIGFyZSAwIGZvciBiYXNlIGFuZCAxIGZvciBsYXN0Ci0JICAgICAqLwotCSAgICBsYXN0ID0gYmFzZSArIHNpemUgLSAxOwotCSAgICBmb3IgKGxiYXNlID0gYmFzZTsgIShsYmFzZSAmIDEpICYmIChsYXN0ICYgMSk7IGxiYXNlID0gbGJhc2UgPj4gMSwgbGFzdCA9IGxhc3QgPj4gMSkKLQkJOwotCSAgICBpZiAobGJhc2UgIT0gbGFzdCkgewotCQkvKiBCYXNlIGlzIG5vdCBhbGlnbmVkIG9uIHRoZSBjb3JyZWN0IGJvdW5kYXJ5ICovCi0JCXJldHVybiBQTV9NVFJSX0VSUl9OT1RfQUxJR05FRDsKLQkJfQotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotCX0KLQotICAgIC8qIFNlYXJjaCBmb3IgZXhpc3RpbmcgTVRSUiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NVFJSOyArK2kpIHsKLQlnZXRNVFJSKGksJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOwotCWlmIChsYmFzZSA9PSAwICYmIGxzaXplID09IDApCi0JICAgIGNvbnRpbnVlOwotCWlmIChiYXNlID4gbGJhc2UgKyAobHNpemUtMSkpCi0JICAgIGNvbnRpbnVlOwotCWlmICgoYmFzZSA8IGxiYXNlKSAmJiAoYmFzZStzaXplLTEgPCBsYmFzZSkpCi0JICAgIGNvbnRpbnVlOwotCi0JLyogQ2hlY2sgdGhhdCB3ZSBkb24ndCBvdmVybGFwIGFuIGV4aXN0aW5nIHJlZ2lvbiAqLwotCWlmICh0eXBlICE9IFBNX01UUlJfVU5DQUNIQUJMRSkgewotCSAgICBpZiAoKGJhc2UgPCBsYmFzZSkgfHwgKGJhc2Urc2l6ZS0xID4gbGJhc2UrbHNpemUtMSkpCi0JCXJldHVybiBQTV9NVFJSX0VSUl9PVkVSTEFQOwotCSAgICB9Ci0JZWxzZSBpZiAoYmFzZSA9PSBsYmFzZSAmJiBzaXplID09IGxzaXplKSB7Ci0JICAgIC8qIFRoZSByZWdpb24gYWxyZWFkeSBleGlzdHMgc28gbGVhdmUgaXQgYWxvbmUgKi8KLQkgICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOwotCSAgICB9Ci0KLQkvKiBOZXcgcmVnaW9uIGlzIGVuY2xvc2VkIGJ5IGFuIGV4aXN0aW5nIHJlZ2lvbiwgc28gb25seSBhbGxvdwotCSAqIGEgbmV3IHR5cGUgdG8gYmUgY3JlYXRlZCBpZiB3ZSBhcmUgc2V0dGluZyBhIHJlZ2lvbiB0byBiZQotCSAqIHVuY2FjaGVhYmxlIChzdWNoIGFzIE1NSU8gcmVnaXN0ZXJzIHdpdGhpbiBhIGZyYW1lYnVmZmVyKS4KLQkgKi8KLQlpZiAobHR5cGUgIT0gKGludCl0eXBlKSB7Ci0JICAgIGlmICh0eXBlID09IFBNX01UUlJfVU5DQUNIQUJMRSkKLQkJY29udGludWU7Ci0JICAgIHJldHVybiBQTV9NVFJSX0VSUl9UWVBFX01JU01BVENIOwotCSAgICB9Ci0JcmV0dXJuIFBNX01UUlJfRVJSX09LOwotCX0KLQotICAgIC8qIFNlYXJjaCBmb3IgYW4gZW1wdHkgTVRSUiAqLwotICAgIGlmICgoaSA9IGdldEZyZWVSZWdpb24oYmFzZSxzaXplKSkgPCAwKQotCXJldHVybiBQTV9NVFJSX0VSUl9OT05FX0ZSRUU7Ci0gICAgc2V0TVRSUihpLGJhc2Usc2l6ZSx0eXBlKTsKLSAgICByZXR1cm4gUE1fTVRSUl9FUlJfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotY2FsbGJhY2sgICAgLSBGdW5jdGlvbiB0byBjYWxsYmFjayB3aXRoIHdyaXRlIGNvbWJpbmUgaW5mb3JtYXRpb24KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgd3JpdGUgY29tYmluZSByZWdpb25zIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGUKLXByb2Nlc3Nvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW51bVdyaXRlQ29tYmluZSgKLSAgICBQTV9lbnVtV3JpdGVDb21iaW5lX3QgY2FsbGJhY2spCi17Ci0gICAgaW50ICAgICBpLGx0eXBlOwotICAgIHVsb25nICAgbGJhc2UsbHNpemU7Ci0KLSAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBDUFUgdGhhdCBzdXBwb3J0cyBNVFJSJ3MgYW5kIHR5cGUgaXMgdmFsaWQgKi8KLSAgICBpZiAobnVtTVRSUiA8PSAwKSB7Ci0JaWYgKCFfTVRSUl9pc1JpbmcwKCkpCi0JICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOwotCXJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7Ci0JfQotCi0gICAgLyogRW51bWVyYXRlIGFsbCBleGlzdGluZyBNVFJSJ3MgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTVRSUjsgKytpKSB7Ci0JZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKLQljYWxsYmFjayhsYmFzZSxsc2l6ZSxsdHlwZSk7Ci0JfQotICAgIHJldHVybiBQTV9NVFJSX0VSUl9PSzsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3BjaWxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3BjaWxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU0MmZjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9wY2lsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDc0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgZm9yIGludGVyZmFjaW5nIHRvIHRoZSBQQ0kgYnVzIGFuZCBjb25maWd1cmF0aW9uCi0qICAgICAgICAgICAgICAgc3BhY2UgcmVnaXN0ZXJzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAicGNpbGliLmgiCi0jaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIHBhY2soMSkKLQotLyogTGVuZ3RoIG9mIHRoZSBtZW1vcnkgbWFwcGluZyBmb3IgdGhlIFBDSSBCSU9TICovCi0KLSNkZWZpbmUgQklPU19MSU1JVCAgICAgICAgICAoMTI4ICogMTAyNEwgLSAxKQotCi0vKiBNYWNyb3MgZm9yIGFjY2Vzc2luZyB0aGUgUENJIEJJT1MgZnVuY3Rpb25zIGZyb20gMzItYml0IHByb3RlY3RlZCBtb2RlICovCi0KLSNkZWZpbmUgQklPUzMyX1NJR05BVFVSRSAgICAoKCh1bG9uZyknXycgPDwgMCkgKyAoKHVsb25nKSczJyA8PCA4KSArICgodWxvbmcpJzInIDw8IDE2KSArICgodWxvbmcpJ18nIDw8IDI0KSkKLSNkZWZpbmUgUENJX1NJR05BVFVSRSAgICAgICAoKCh1bG9uZyknUCcgPDwgMCkgKyAoKHVsb25nKSdDJyA8PCA4KSArICgodWxvbmcpJ0knIDw8IDE2KSArICgodWxvbmcpJyAnIDw8IDI0KSkKLSNkZWZpbmUgUENJX1NFUlZJQ0UgICAgICAgICAoKCh1bG9uZyknJCcgPDwgMCkgKyAoKHVsb25nKSdQJyA8PCA4KSArICgodWxvbmcpJ0MnIDw8IDE2KSArICgodWxvbmcpJ0knIDw8IDI0KSkKLSNkZWZpbmUgUENJX0JJT1NfUFJFU0VOVCAgICAweEIxMDEKLSNkZWZpbmUgRklORF9QQ0lfREVWSUNFICAgICAweEIxMDIKLSNkZWZpbmUgRklORF9QQ0lfQ0xBU1MgICAgICAweEIxMDMKLSNkZWZpbmUgR0VORVJBVEVfU1BFQ0lBTCAgICAweEIxMDYKLSNkZWZpbmUgUkVBRF9DT05GSUdfQllURSAgICAweEIxMDgKLSNkZWZpbmUgUkVBRF9DT05GSUdfV09SRCAgICAweEIxMDkKLSNkZWZpbmUgUkVBRF9DT05GSUdfRFdPUkQgICAweEIxMEEKLSNkZWZpbmUgV1JJVEVfQ09ORklHX0JZVEUgICAweEIxMEIKLSNkZWZpbmUgV1JJVEVfQ09ORklHX1dPUkQgICAweEIxMEMKLSNkZWZpbmUgV1JJVEVfQ09ORklHX0RXT1JEICAweEIxMEQKLSNkZWZpbmUgR0VUX0lSUV9ST1VUSU5HX09QVCAweEIxMEUKLSNkZWZpbmUgU0VUX1BDSV9JUlEgICAgICAgICAweEIxMEYKLQotLyogVGhpcyBpcyB0aGUgc3RhbmRhcmQgc3RydWN0dXJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGVudHJ5IHBvaW50IHRvIHRoZQotICogQklPUzMyIFNlcnZpY2UgRGlyZWN0b3J5LCBhcyBkb2N1bWVudGVkIGluIFBDSSAyLjEgQklPUyBTcGVjaWNpdGlvbi4KLSAqLwotCi10eXBlZGVmIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotCXVsb25nIHNpZ25hdHVyZTsgICAgICAgIC8qIF8zMl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVsb25nIGVudHJ5OyAgICAgICAgICAgIC8qIDMyIGJpdCBwaHlzaWNhbCBhZGRyZXNzICAgICAgICAgICAgICAqLwotCXVjaGFyIHJldmlzaW9uOyAgICAgICAgIC8qIFJldmlzaW9uIGxldmVsLCAwICAgICAgICAgICAgICAgICAgICAqLwotCXVjaGFyIGxlbmd0aDsgICAgICAgICAgIC8qIExlbmd0aCBpbiBwYXJhZ3JhcGhzIHNob3VsZCBiZSAwMSAgICAqLwotCXVjaGFyIGNoZWNrc3VtOyAgICAgICAgIC8qIEFsbCBieXRlcyBtdXN0IGFkZCB1cCB0byB6ZXJvICAgICAgICAqLwotCXVjaGFyIHJlc2VydmVkWzVdOyAgICAgIC8qIE11c3QgYmUgemVybyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCX0gZmllbGRzOwotICAgIGNoYXIgY2hhcnNbMTZdOwotICAgIH0gUENJX2Jpb3MzMjsKLQotLyogU3RydWN0dXJlIGZvciBhIGZhciBwb2ludGVyIHRvIGNhbGwgdGhlIFBDSSBCSU9TIHNlcnZpY2VzIHdpdGggKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgYWRkcmVzczsKLSAgICB1c2hvcnQgIHNlZ21lbnQ7Ci0gICAgfSBQQ0lCSU9TX2VudHJ5OwotCi0vKiBNYWNyb3MgdG8gY29weSBhIHN0cnVjdHVyZSB0aGF0IGluY2x1ZGVzIGR3U2l6ZSBtZW1iZXJzICovCi0KLSNkZWZpbmUgQ09QWV9TVFJVQ1RVUkUoZCxzKSBtZW1jcHkoZCxzLE1JTigocyktPmR3U2l6ZSwoZCktPmR3U2l6ZSkpCi0KLSNwcmFnbWEgcGFjaygpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1Y2hhciAgICAgICAgICAgICpCSU9TSW1hZ2UgPSBOVUxMOyAgLyogQklPUyBpbWFnZSBtYXBwaW5nICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgICAgICBQQ0lCSU9TVmVyc2lvbiA9IC0xOy8qIFBDSSBCSU9TIHZlcnNpb24gICAgICAgICAqLwotc3RhdGljIFBDSUJJT1NfZW50cnkgICAgUENJRW50cnk7ICAgICAgICAgICAvKiBQQ0kgc2VydmljZXMgZW50cnkgcG9pbnQgKi8KLXN0YXRpYyB1bG9uZyAgICAgICAgICAgIFBDSVBoeXNFbnRyeSA9IDA7ICAgLyogUGh5c2ljYWwgYWRkcmVzcyAgICAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBoZWxwZXIgZnVuY3Rpb25zICovCi0KLXVjaGFyICAgX0FTTUFQSSBfQklPUzMyX3NlcnZpY2UodWxvbmcgc2VydmljZSx1bG9uZyBmdW5jdGlvbix1bG9uZyAqcGh5c0Jhc2UsdWxvbmcgKmxlbmd0aCx1bG9uZyAqc2VydmljZU9mZnNldCxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLXVzaG9ydCAgX0FTTUFQSSBfUENJQklPU19pc1ByZXNlbnQodWxvbmcgaV9lYXgsdWxvbmcgKm9fZWR4LHVzaG9ydCAqb19heCx1Y2hhciAqb19jbCxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLXVsb25nICAgX0FTTUFQSSBfUENJQklPU19zZXJ2aWNlKHVsb25nIHJfZWF4LHVsb25nIHJfZWJ4LHVsb25nIHJfZWRpLHVsb25nIHJfZWN4LFBDSUJJT1NfZW50cnkgZW50cnkpOwotaW50ICAgICBfQVNNQVBJIF9QQ0lCSU9TX2dldFJvdXRpbmcoUENJUm91dGluZ09wdGlvbnNCdWZmZXIgKmJ1ZixQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLWlib29sICAgX0FTTUFQSSBfUENJQklPU19zZXRJUlEoaW50IGJ1c0RldixpbnQgaW50UGluLGludCBJUlEsUENJQklPU19lbnRyeSBlbnRyeSk7Ci11bG9uZyAgIF9BU01BUEkgX1BDSUJJT1Nfc3BlY2lhbEN5Y2xlKGludCBidXMsdWxvbmcgZGF0YSxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLXVzaG9ydCAgX0FTTUFQSSBfUENJX2dldENTKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFBDSSBCSU9TIGVudHJ5IHBvaW50LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9BU01BUEkgUENJQklPU19nZXRFbnRyeSh2b2lkKQoteyByZXR1cm4gUENJUGh5c0VudHJ5OyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaHdUeXBlICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBQQ0kgaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbSBmbGFncwotbGFzdEJ1cyAtIFBsYWNlIHRvIHN0b3JlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBQQ0kgYnVzIGluIHRoZSBzeXN0ZW0KLQotUkVUVVJOUzoKLVZlcnNpb24gbnVtYmVyIG9mIHRoZSBQQ0kgQklPUyBmb3VuZC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgUENJIEJJT1MgaXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtLCBhbmQgaWYKLXNvIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUyBkZXRlY3QgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQQ0lCSU9TX2RldGVjdCgKLSAgICB1Y2hhciAqaHdUeXBlLAotICAgIHVjaGFyICpsYXN0QnVzKQotewotICAgIHVsb25nICAgc2lnbmF0dXJlOwotICAgIHVzaG9ydCAgc3RhdCx2ZXJzaW9uOwotCi0jaWZuZGVmIF9fMTZCSVRfXwotICAgIFBDSUJJT1NfZW50cnkgICBCSU9TRW50cnkgPSB7MH07Ci0gICAgdWNoYXIgICAgICAgICAgICpCSU9TRW5kOwotICAgIFBDSV9iaW9zMzIgICAgICAqQklPU0RpcjsKLSAgICB1bG9uZyAgICAgICAgICAgcGh5c0Jhc2UsbGVuZ3RoLG9mZnNldDsKLQotICAgIC8qIEJhaWwgaWYgd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIG5vIEJJT1MgaXMgcHJlc2VudCAqLwotICAgIGlmIChQQ0lCSU9TVmVyc2lvbiA9PSAwKQotCXJldHVybiAwOwotCi0gICAgLyogRmlyc3Qgc2NhbiB0aGUgbWVtb3J5IGZyb20gMHhFMDAwMCB0byAweEZGRkZGIGxvb2tpbmcgZm9yIHRoZQotICAgICAqIEJJT1MzMiBzZXJ2aWNlIGRpcmVjdG9yeSwgc28gd2UgY2FuIGRldGVybWluZSBpZiB3ZSBjYW4gY2FsbCBpdAotICAgICAqIGZyb20gMzItYml0IHByb3RlY3RlZCBtb2RlLgotICAgICAqLwotICAgIGlmIChQQ0lCSU9TVmVyc2lvbiA9PSAtMSkgewotCVBDSUJJT1NWZXJzaW9uID0gMDsKLQlCSU9TSW1hZ2UgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhFMDAwMCxCSU9TX0xJTUlULGZhbHNlKTsKLQlpZiAoIUJJT1NJbWFnZSkKLQkgICAgcmV0dXJuIDA7Ci0JQklPU0VuZCA9IEJJT1NJbWFnZSArIDB4MjAwMDA7Ci0JZm9yIChCSU9TRGlyID0gKFBDSV9iaW9zMzIqKUJJT1NJbWFnZTsgQklPU0RpciA8IChQQ0lfYmlvczMyKilCSU9TRW5kOyBCSU9TRGlyKyspIHsKLQkgICAgdWNoYXIgICBzdW07Ci0JICAgIGludCAgICAgaSxsZW5ndGg7Ci0KLQkgICAgaWYgKEJJT1NEaXItPmZpZWxkcy5zaWduYXR1cmUgIT0gQklPUzMyX1NJR05BVFVSRSkKLQkJY29udGludWU7Ci0JICAgIGxlbmd0aCA9IEJJT1NEaXItPmZpZWxkcy5sZW5ndGggKiAxNjsKLQkgICAgaWYgKCFsZW5ndGgpCi0JCWNvbnRpbnVlOwotCSAgICBmb3IgKHN1bSA9IGkgPSAwOyBpIDwgbGVuZ3RoIDsgaSsrKQotCQlzdW0gKz0gQklPU0Rpci0+Y2hhcnNbaV07Ci0JICAgIGlmIChzdW0gIT0gMCkKLQkJY29udGludWU7Ci0JICAgIEJJT1NFbnRyeS5hZGRyZXNzID0gKHVsb25nKUJJT1NJbWFnZSArIChCSU9TRGlyLT5maWVsZHMuZW50cnkgLSAweEUwMDAwKTsKLQkgICAgQklPU0VudHJ5LnNlZ21lbnQgPSBfUENJX2dldENTKCk7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0KLQkvKiBJZiB3ZSBmb3VuZCB0aGUgQklPUzMyIGRpcmVjdG9yeSwgY2FsbCBpdCB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0JICogUENJIHNlcnZpY2VzLgotCSAqLwotCWlmIChCSU9TRW50cnkuYWRkcmVzcyA9PSAwKQotCSAgICByZXR1cm4gMDsKLQlpZiAoX0JJT1MzMl9zZXJ2aWNlKFBDSV9TRVJWSUNFLDAsJnBoeXNCYXNlLCZsZW5ndGgsJm9mZnNldCxCSU9TRW50cnkpICE9IDApCi0JICAgIHJldHVybiAwOwotCVBDSVBoeXNFbnRyeSA9IHBoeXNCYXNlICsgb2Zmc2V0OwotCVBDSUVudHJ5LmFkZHJlc3MgPSAodWxvbmcpQklPU0ltYWdlICsgKFBDSVBoeXNFbnRyeSAtIDB4RTAwMDApOwotCVBDSUVudHJ5LnNlZ21lbnQgPSBfUENJX2dldENTKCk7Ci0JfQotI2VuZGlmCi0gICAgLyogV2UgZm91bmQgdGhlIEJJT1MgZW50cnksIHNvIG5vdyBkbyB0aGUgdmVyc2lvbiBjaGVjayAqLwotICAgIHZlcnNpb24gPSBfUENJQklPU19pc1ByZXNlbnQoUENJX0JJT1NfUFJFU0VOVCwmc2lnbmF0dXJlLCZzdGF0LGxhc3RCdXMsUENJRW50cnkpOwotICAgIGlmICh2ZXJzaW9uID4gMCAmJiAoKHN0YXQgPj4gOCkgPT0gMCkgJiYgc2lnbmF0dXJlID09IFBDSV9TSUdOQVRVUkUpIHsKLQkqaHdUeXBlID0gc3RhdCAmIDB4RkY7Ci0JcmV0dXJuIFBDSUJJT1NWZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBjaGVjayBhZ2FpbnN0Ci1pbmRleCAgIC0gSW5kZXggb2YgdGhlIGN1cnJlbnQgZGV2aWNlIHRvIGNoZWNrCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIHRoZSBkZXZpY2UgaXMgYSBkdXBsaWNhdGUsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZ29lcyB0aHJvdWdoIHRoZSBsaXN0IG9mIGFsbCBkZXZpY2VzIHByZWNlZWRpbmcgdGhlIG5ld2x5Ci1mb3VuZCBkZXZpY2UgaW4gdGhlIGluZm8gc3RydWN0dXJlLCBhbmQgY2hlY2tzIHRoYXQgdGhlIGRldmljZSBpcyBub3QgYQotZHVwbGljYXRlIG9mIGEgcHJldmlvdXMgZGV2aWNlLiBTb21lIGRldmljZXMgaW5jb3JyZWN0bHkgZW51bWVyYXRlCi10aGVtc2VsdmVzIGF0IGRpZmZlcmVudCBmdW5jdGlvbiBhZGRyZXNzZXMgc28gd2UgY2hlY2sgaGVyZSB0byBleGNsdWRlCi10aG9zZSBjYXNlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgQ2hlY2tEdXBsaWNhdGUoCi0gICAgUENJRGV2aWNlSW5mbyAqaW5mbywKLSAgICBQQ0lEZXZpY2VJbmZvICpwcmV2KQotewotICAgIC8qIElnbm9yZSBkZXZpY2VzIHdpdGggYSB2ZW5kb3IgSUQgb2YgMCAqLwotICAgIGlmIChpbmZvLT5WZW5kb3JJRCA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgLyogTk9URTogV2Ugb25seSBjaGVjayBhZ2FpbnN0IHRoZSBjdXJyZW50IGRldmljZSBvbgotICAgICAqICAgICAgIHRoZSBidXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IGV4Y2x1ZGUKLSAgICAgKiAgICAgICBtdWx0aXBsZSBjb250cm9sbGVycyBvZiB0aGUgc2FtZSBkZXZpY2UgSUQuCi0gICAgICovCi0gICAgaWYgKGluZm8tPnNsb3QucC5CdXMgPT0gcHJldi0+c2xvdC5wLkJ1cyAmJgotCWluZm8tPnNsb3QucC5EZXZpY2UgPT0gcHJldi0+c2xvdC5wLkRldmljZSAmJgotCWluZm8tPkRldmljZUlEID09IHByZXYtPkRldmljZUlEKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCi1tYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKLQotUkVUVVJOUzoKLU51bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5Ci1vZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVNZWNoMSgKLSAgICBQQ0lEZXZpY2VJbmZvIGluZm9bXSkKLXsKLSAgICBpbnQgICAgICAgICAgICAgYnVzLGRldmljZSxmdW5jdGlvbixpLG51bUZvdW5kID0gMDsKLSAgICB1bG9uZyAgICAgICAgICAgKmxwLHRtcDsKLSAgICBQQ0lzbG90ICAgICAgICAgc2xvdCA9IHt7MCwwLDAsMCwwLDAsMX19OwotICAgIFBDSURldmljZUluZm8gICBwY2kscHJldiA9IHswfTsKLQotICAgIC8qIFRyeSBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAxICovCi0gICAgUE1fb3V0cGIoMHhDRkIsMHgwMSk7Ci0gICAgdG1wID0gUE1faW5wZCgweENGOCk7Ci0gICAgUE1fb3V0cGQoMHhDRjgsc2xvdC5pKTsKLSAgICBpZiAoKFBNX2lucGQoMHhDRjgpID09IHNsb3QuaSkgJiYgKFBNX2lucGQoMHhDRkMpICE9IDB4RkZGRkZGRkZVTCkpIHsKLQkvKiBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAxIC0gdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gKi8KLQlmb3IgKGJ1cyA9IDA7IGJ1cyA8IDg7IGJ1cysrKSB7Ci0JICAgIHNsb3QucC5CdXMgPSBidXM7Ci0JICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgMzI7IGRldmljZSsrKSB7Ci0JCXNsb3QucC5EZXZpY2UgPSBkZXZpY2U7Ci0JCWZvciAoZnVuY3Rpb24gPSAwOyBmdW5jdGlvbiA8IDg7IGZ1bmN0aW9uKyspIHsKLQkJICAgIHNsb3QucC5GdW5jdGlvbiA9IGZ1bmN0aW9uOwotCQkgICAgc2xvdC5wLlJlZ2lzdGVyID0gMDsKLQkJICAgIFBNX291dHBkKDB4Q0Y4LHNsb3QuaSk7Ci0JCSAgICBpZiAoUE1faW5wZCgweENGQykgIT0gMHhGRkZGRkZGRlVMKSB7Ci0JCQltZW1zZXQoJnBjaSwwLHNpemVvZihwY2kpKTsKLQkJCXBjaS5kd1NpemUgPSBzaXplb2YocGNpKTsKLQkJCXBjaS5tZWNoMSA9IDE7Ci0JCQlwY2kuc2xvdCA9IHNsb3Q7Ci0JCQlscCA9ICh1bG9uZyopJihwY2kuVmVuZG9ySUQpOwotCQkJZm9yIChpID0gMDsgaSA8IE5VTV9QQ0lfUkVHOyBpKyssIGxwKyspIHsKLQkJCSAgICBzbG90LnAuUmVnaXN0ZXIgPSBpOwotCQkJICAgIFBNX291dHBkKDB4Q0Y4LHNsb3QuaSk7Ci0JCQkgICAgKmxwID0gUE1faW5wZCgweENGQyk7Ci0JCQkgICAgfQotCQkJaWYgKCFDaGVja0R1cGxpY2F0ZSgmcGNpLCZwcmV2KSkgewotCQkJICAgIGlmIChpbmZvKQotCQkJCUNPUFlfU1RSVUNUVVJFKCZpbmZvW251bUZvdW5kXSwmcGNpKTsKLQkJCSAgICArK251bUZvdW5kOwotCQkJICAgIH0KLQkJCXByZXYgPSBwY2k7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JLyogRGlzYWJsZSBQQ0kgY29uZmlnIGN5Y2xlIG9uIGV4aXQgKi8KLQlQTV9vdXRwZCgweENGOCwwKTsKLQlyZXR1cm4gbnVtRm91bmQ7Ci0JfQotICAgIFBNX291dHBkKDB4Q0Y4LHRtcCk7Ci0KLSAgICAvKiBObyBoYXJkd2FyZSBhY2Nlc3MgbWVjaGFuaXNtIDEgZm91bmQgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCi1tYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKLQotUkVUVVJOUzoKLU51bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5Ci1vZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVNZWNoMigKLSAgICBQQ0lEZXZpY2VJbmZvIGluZm9bXSkKLXsKLSAgICBpbnQgICAgICAgICAgICAgYnVzLGRldmljZSxmdW5jdGlvbixpLG51bUZvdW5kID0gMDsKLSAgICB1c2hvcnQgICAgICAgICAgZGV2aWNlSU87Ci0gICAgdWxvbmcgICAgICAgICAgICpscDsKLSAgICBQQ0lzbG90ICAgICAgICAgc2xvdCA9IHt7MCwwLDAsMCwwLDAsMX19OwotICAgIFBDSURldmljZUluZm8gICBwY2kscHJldiA9IHswfTsKLQotICAgIC8qIFRyeSBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAyICovCi0gICAgUE1fb3V0cGIoMHhDRkIsMHgwMCk7Ci0gICAgUE1fb3V0cGIoMHhDRjgsMHgwMCk7Ci0gICAgUE1fb3V0cGIoMHhDRkEsMHgwMCk7Ci0gICAgaWYgKFBNX2lucGIoMHhDRjgpID09IDB4MDAgJiYgUE1faW5wYigweENGQikgPT0gMHgwMCkgewotCS8qIFBDSSBhY2Nlc3MgbWVjaGFuaXNtIDIgLSB0aGUgb2xkZXIgbWVjaGFuaXNtIGZvciBsZWdhY3kgYnVzc2VzICovCi0JZm9yIChidXMgPSAwOyBidXMgPCAyOyBidXMrKykgewotCSAgICBzbG90LnAuQnVzID0gYnVzOwotCSAgICBQTV9vdXRwYigweENGQSwodWNoYXIpYnVzKTsKLQkgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCAxNjsgZGV2aWNlKyspIHsKLQkJc2xvdC5wLkRldmljZSA9IGRldmljZTsKLQkJZGV2aWNlSU8gPSAweEMwMDAgKyAoZGV2aWNlIDw8IDgpOwotCQlmb3IgKGZ1bmN0aW9uID0gMDsgZnVuY3Rpb24gPCA4OyBmdW5jdGlvbisrKSB7Ci0JCSAgICBzbG90LnAuRnVuY3Rpb24gPSBmdW5jdGlvbjsKLQkJICAgIHNsb3QucC5SZWdpc3RlciA9IDA7Ci0JCSAgICBQTV9vdXRwYigweENGOCwodWNoYXIpKChmdW5jdGlvbiA8PCAxKSB8IDB4MTApKTsKLQkJICAgIGlmIChQTV9pbnBkKGRldmljZUlPKSAhPSAweEZGRkZGRkZGVUwpIHsKLQkJCW1lbXNldCgmcGNpLDAsc2l6ZW9mKHBjaSkpOwotCQkJcGNpLmR3U2l6ZSA9IHNpemVvZihwY2kpOwotCQkJcGNpLm1lY2gxID0gMDsKLQkJCXBjaS5zbG90ID0gc2xvdDsKLQkJCWxwID0gKHVsb25nKikmKHBjaS5WZW5kb3JJRCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BDSV9SRUc7IGkrKywgbHArKykgewotCQkJICAgIHNsb3QucC5SZWdpc3RlciA9IGk7Ci0JCQkgICAgKmxwID0gUE1faW5wZChkZXZpY2VJTyArIChpIDw8IDIpKTsKLQkJCSAgICB9Ci0JCQlpZiAoIUNoZWNrRHVwbGljYXRlKCZwY2ksJnByZXYpKSB7Ci0JCQkgICAgaWYgKGluZm8pCi0JCQkJQ09QWV9TVFJVQ1RVUkUoJmluZm9bbnVtRm91bmRdLCZwY2kpOwotCQkJICAgICsrbnVtRm91bmQ7Ci0JCQkgICAgfQotCQkJcHJldiA9IHBjaTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkvKiBEaXNhYmxlIFBDSSBjb25maWcgY3ljbGUgb24gZXhpdCAqLwotCVBNX291dHBiKDB4Q0Y4LDApOwotCXJldHVybiBudW1Gb3VuZDsKLQl9Ci0KLSAgICAvKiBObyBoYXJkd2FyZSBhY2Nlc3MgbWVjaGFuaXNtIDIgZm91bmQgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9ucyByZWFkcyBhIGNvbmZpZ3VyYXRpb24gZHdvcmQgdmlhIHRoZSBQQ0kgQklPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgUENJQklPU19yZWFkRFdPUkQoCi0gICAgaW50IGluZGV4LAotICAgIHVsb25nIHNsb3QpCi17Ci0gICAgcmV0dXJuICh1bG9uZylfUENJQklPU19zZXJ2aWNlKFJFQURfQ09ORklHX0RXT1JELHNsb3QgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCi1tYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKLQotUkVUVVJOUzoKLU51bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5Ci1vZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVCSU9TKAotICAgIFBDSURldmljZUluZm8gaW5mb1tdKQotewotICAgIHVjaGFyICAgICAgICAgICBod1R5cGUsbGFzdEJ1czsKLSAgICBpbnQgICAgICAgICAgICAgYnVzLGRldmljZSxmdW5jdGlvbixpLG51bUZvdW5kID0gMDsKLSAgICB1bG9uZyAgICAgICAgICAgKmxwOwotICAgIFBDSXNsb3QgICAgICAgICBzbG90ID0ge3swLDAsMCwwLDAsMCwxfX07Ci0gICAgUENJRGV2aWNlSW5mbyAgIHBjaSxwcmV2ID0gezB9OwotCi0gICAgaWYgKFBDSUJJT1NfZGV0ZWN0KCZod1R5cGUsJmxhc3RCdXMpKSB7Ci0JLyogUENJIEJJT1MgYWNjZXNzIC0gdGhlIHVsdGltYXRlIGZhbGxiYWNrICovCi0JZm9yIChidXMgPSAwOyBidXMgPD0gbGFzdEJ1czsgYnVzKyspIHsKLQkgICAgc2xvdC5wLkJ1cyA9IGJ1czsKLQkgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCAzMjsgZGV2aWNlKyspIHsKLQkJc2xvdC5wLkRldmljZSA9IGRldmljZTsKLQkJZm9yIChmdW5jdGlvbiA9IDA7IGZ1bmN0aW9uIDwgODsgZnVuY3Rpb24rKykgewotCQkgICAgc2xvdC5wLkZ1bmN0aW9uID0gZnVuY3Rpb247Ci0JCSAgICBpZiAoUENJQklPU19yZWFkRFdPUkQoMCxzbG90LmkpICE9IDB4RkZGRkZGRkZVTCkgewotCQkJbWVtc2V0KCZwY2ksMCxzaXplb2YocGNpKSk7Ci0JCQlwY2kuZHdTaXplID0gc2l6ZW9mKHBjaSk7Ci0JCQlwY2kubWVjaDEgPSAyOwotCQkJcGNpLnNsb3QgPSBzbG90OwotCQkJbHAgPSAodWxvbmcqKSYocGNpLlZlbmRvcklEKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fUENJX1JFRzsgaSsrLCBscCsrKQotCQkJICAgICpscCA9IFBDSUJJT1NfcmVhZERXT1JEKGkgPDwgMixzbG90LmkpOwotCQkJaWYgKCFDaGVja0R1cGxpY2F0ZSgmcGNpLCZwcmV2KSkgewotCQkJICAgIGlmIChpbmZvKQotCQkJCUNPUFlfU1RSVUNUVVJFKCZpbmZvW251bUZvdW5kXSwmcGNpKTsKLQkJCSAgICArK251bUZvdW5kOwotCQkJICAgIH0KLQkJCXByZXYgPSBwY2k7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgIC8qIFJldHVybiBudW1iZXIgb2YgZGV2aWNlcyBmb3VuZCAqLwotICAgIHJldHVybiBudW1Gb3VuZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCi1tYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKLQotUkVUVVJOUzoKLU51bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5Ci1vZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgX0FTTUFQSSBQQ0lfZW51bWVyYXRlKAotICAgIFBDSURldmljZUluZm8gaW5mb1tdKQotewotICAgIGludCBudW1Gb3VuZDsKLQotICAgIC8qIEZpcnN0IHRyeSB2aWEgdGhlIGRpcmVjdCBhY2Nlc3MgbWVjaGFuaXNtcyB3aGljaCBhcmUgZmFzdGVyIGlmIHdlCi0gICAgICogaGF2ZSB0aGVtIChuZWFybHkgYWx3YXlzKS4gVGhlIEJJT1MgaXMgdXNlZCBhcyBhIGZhbGxiYWNrLCBhbmQgZm9yCi0gICAgICogc3R1ZmYgd2UgY2FuJ3QgZG8gZGlyZWN0bHkuCi0gICAgICovCi0gICAgaWYgKChudW1Gb3VuZCA9IFBDSV9lbnVtZXJhdGVNZWNoMShpbmZvKSkgPT0gMCkgewotCWlmICgobnVtRm91bmQgPSBQQ0lfZW51bWVyYXRlTWVjaDIoaW5mbykpID09IDApIHsKLQkgICAgaWYgKChudW1Gb3VuZCA9IFBDSV9lbnVtZXJhdGVCSU9TKGluZm8pKSA9PSAwKQotCQlyZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gbnVtRm91bmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gZmlsbCBpbgotbWF4RGV2aWNlcyAgLSBNYXhpbXVtIG51bWJlciBvZiBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpbnRvIGFycmF5Ci0KLVJFVFVSTlM6Ci1OdW1iZXIgb2YgUENJIGRldmljZXMgZm91bmQgYW5kIGVudW1lcmF0ZWQgb24gdGhlIFBDSSBidXMsIDAgaWYgbm90IFBDSS4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIFBDSSBidXMgaW50byBhbiBhcnJheQotb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBibG9ja3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IF9BU01BUEkgUENJX2dldE51bURldmljZXModm9pZCkKLXsKLSAgICByZXR1cm4gUENJX2VudW1lcmF0ZShOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXIgLSBCYXNlIGFkZHJlc3MgdG8gbWVhc3VyZQotcGNpIC0gUENJIGRldmljZSB0byBhY2Nlc3MKLQotUkVUVVJOUzoKLVNpemUgb2YgdGhlIFBDSSBiYXNlIGFkZHJlc3MgaW4gYnl0ZXMKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gbWVhc3VyZXMgdGhlIHNpemUgb2YgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgaW4gYnl0ZXMsCi1ieSB3cml0aW5nIGFsbCBGJ3MgdG8gdGhlIHJlZ2lzdGVyLCBhbmQgcmVhZGluZyB0aGUgdmFsdWUgYmFjay4gVGhlIHNpemUKLW9mIHRoZSBiYXNlIGFkZHJlc3MgaXMgZGV0ZXJtaW5lcyBieSB0aGUgYml0cyB0aGF0IGFyZSBoYXJkd2lyZWQgdG8gemVybydzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9BU01BUEkgUENJX2ZpbmRCQVJTaXplKAotICAgIGludCBiYXIsCi0gICAgUENJRGV2aWNlSW5mbyAqcGNpKQotewotICAgIHVsb25nICAgYmFzZSxzaXplID0gMDsKLQotICAgIGJhc2UgPSBQQ0lfYWNjZXNzUmVnKGJhciwwLFBDSV9SRUFEX0RXT1JELHBjaSk7Ci0gICAgaWYgKGJhc2UgJiYgIShiYXNlICYgMHgxKSkgewotCS8qIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uIHNvbWUgZGV2aWNlcyBkb24ndCBwcm9wZXJseSBkZWNvZGUKLQkgKiB0aGVpciBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIChJbnRlbCBQQ0kvUENJIGJyaWRnZXMhKSwgYW5kCi0JICogd2UgcmVhZCBjb21wbGV0ZWx5IGJvZ3VzIHZhbHVlcy4gV2UgY2hlY2sgZm9yIHRoYXQgaGVyZQotCSAqIGFuZCBjbGVhciBvdXQgdGhvc2UgQkFSJ3MuCi0JICoKLQkgKiBXZSBjaGVjayBmb3IgdGhhdCBoZXJlIGJlY2F1c2UgYXQgbGVhc3QgdGhlIGxvdyAxMiBiaXRzCi0JICogb2YgdGhlIGFkZHJlc3MgcmFuZ2UgbXVzdCBiZSB6ZXJvcywgc2luY2UgdGhlIHBhZ2Ugc2l6ZQotCSAqIG9uIElBMzIgcHJvY2Vzc29ycyBpcyBhbHdheXMgNEtiLgotCSAqLwotCWlmICgoYmFzZSAmIDB4RkZGKSA9PSAwKSB7Ci0JICAgIFBDSV9hY2Nlc3NSZWcoYmFyLDB4RkZGRkZGRkYsUENJX1dSSVRFX0RXT1JELHBjaSk7Ci0JICAgIHNpemUgPSBQQ0lfYWNjZXNzUmVnKGJhciwwLFBDSV9SRUFEX0RXT1JELHBjaSkgJiB+MHhGRjsKLQkgICAgc2l6ZSA9IH5zaXplKzE7Ci0JICAgIFBDSV9hY2Nlc3NSZWcoYmFyLGJhc2UsUENJX1dSSVRFX0RXT1JELHBjaSk7Ci0JICAgIH0KLQl9Ci0gICAgcGNpLT5zbG90LnAuUmVnaXN0ZXIgPSAwOwotICAgIHJldHVybiBzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZGV4ICAgLSBEV09SRCBpbmRleCBvZiB0aGUgcmVnaXN0ZXIgdG8gYWNjZXNzCi12YWx1ZSAgIC0gVmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVyIGZvciB3cml0ZSBhY2Nlc3MKLWZ1bmMgICAgLSBGdW5jdGlvbiB0byBpbXBsZW1lbnQKLQotUkVUVVJOUzoKLVRoZSB2YWx1ZSByZWFkIGZyb20gdGhlIHJlZ2lzdGVyIGZvciByZWFkIG9wZXJhdGlvbnMKLQotUkVNQVJLUzoKLVRoZSBmdW5jdGlvbiBjb2RlIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3MKLQotY29kZSAgICAtIGZ1bmN0aW9uCi0wICAgICAgIC0gUmVhZCBCWVRFCi0xICAgICAgIC0gUmVhZCBXT1JECi0yICAgICAgIC0gUmVhZCBEV09SRAotMyAgICAgICAtIFdyaXRlIEJZVEUKLTQgICAgICAgLSBXcml0ZSBXT1JECi01ICAgICAgIC0gV3JpdGUgRFdPUkQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfQVNNQVBJIFBDSV9hY2Nlc3NSZWcoCi0gICAgaW50IGluZGV4LAotICAgIHVsb25nIHZhbHVlLAotICAgIGludCBmdW5jLAotICAgIFBDSURldmljZUluZm8gKmluZm8pCi17Ci0gICAgaW50IGlvYmFzZTsKLQotICAgIGlmIChpbmZvLT5tZWNoMSA9PSAyKSB7Ci0JLyogVXNlIFBDSSBCSU9TIGFjY2VzcyBzaW5jZSB3ZSBkb250IGhhdmUgZGlyZWN0IGhhcmR3YXJlIGFjY2VzcyAqLwotCXN3aXRjaCAoZnVuYykgewotCSAgICBjYXNlIFBDSV9SRUFEX0JZVEU6Ci0JCXJldHVybiAodWNoYXIpX1BDSUJJT1Nfc2VydmljZShSRUFEX0NPTkZJR19CWVRFLGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LDAsUENJRW50cnkpOwotCSAgICBjYXNlIFBDSV9SRUFEX1dPUkQ6Ci0JCXJldHVybiAodXNob3J0KV9QQ0lCSU9TX3NlcnZpY2UoUkVBRF9DT05GSUdfV09SRCxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKLQkgICAgY2FzZSBQQ0lfUkVBRF9EV09SRDoKLQkJcmV0dXJuICh1bG9uZylfUENJQklPU19zZXJ2aWNlKFJFQURfQ09ORklHX0RXT1JELGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LDAsUENJRW50cnkpOwotCSAgICBjYXNlIFBDSV9XUklURV9CWVRFOgotCQlfUENJQklPU19zZXJ2aWNlKFdSSVRFX0NPTkZJR19CWVRFLGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LHZhbHVlLFBDSUVudHJ5KTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUENJX1dSSVRFX1dPUkQ6Ci0JCV9QQ0lCSU9TX3NlcnZpY2UoV1JJVEVfQ09ORklHX1dPUkQsaW5mby0+c2xvdC5pID4+IDgsaW5kZXgsdmFsdWUsUENJRW50cnkpOwotCQlicmVhazsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfRFdPUkQ6Ci0JCV9QQ0lCSU9TX3NlcnZpY2UoV1JJVEVfQ09ORklHX0RXT1JELGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LHZhbHVlLFBDSUVudHJ5KTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgZWxzZSB7Ci0JLyogVXNlIGRpcmVjdCBoYXJkd2FyZSBhY2Nlc3MgbWVjaGFuaXNtcyAqLwotCWlmIChpbmZvLT5tZWNoMSkgewotCSAgICAvKiBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAxICovCi0JICAgIGlvYmFzZSA9IDB4Q0ZDICsgKGluZGV4ICYgMyk7Ci0JICAgIGluZm8tPnNsb3QucC5SZWdpc3RlciA9IGluZGV4ID4+IDI7Ci0JICAgIFBNX291dHBkKDB4Q0Y4LGluZm8tPnNsb3QuaSk7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogUENJIGFjY2VzcyBtZWNoYW5pc20gMiAqLwotCSAgICBQTV9vdXRwYigweENGOCwodWNoYXIpKChpbmZvLT5zbG90LnAuRnVuY3Rpb24gPDwgMSkgfCAweDEwKSk7Ci0JICAgIFBNX291dHBiKDB4Q0ZBLCh1Y2hhcilpbmZvLT5zbG90LnAuQnVzKTsKLQkgICAgaW9iYXNlID0gMHhDMDAwICsgKGluZm8tPnNsb3QucC5EZXZpY2UgPDwgOCkgKyBpbmRleDsKLQkgICAgfQotCXN3aXRjaCAoZnVuYykgewotCSAgICBjYXNlIFBDSV9SRUFEX0JZVEU6Ci0JICAgIGNhc2UgUENJX1JFQURfV09SRDoKLQkgICAgY2FzZSBQQ0lfUkVBRF9EV09SRDogICAgdmFsdWUgPSBQTV9pbnBkKGlvYmFzZSk7ICAgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfQllURTogICAgUE1fb3V0cGIoaW9iYXNlLCh1Y2hhcil2YWx1ZSk7ICBicmVhazsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfV09SRDogICAgUE1fb3V0cHcoaW9iYXNlLCh1c2hvcnQpdmFsdWUpOyBicmVhazsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfRFdPUkQ6ICAgUE1fb3V0cGQoaW9iYXNlLCh1bG9uZyl2YWx1ZSk7ICBicmVhazsKLQkgICAgfQotCVBNX291dHBkKDB4Q0Y4LDApOwotCX0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbnVtRGV2aWNlcyAgLSBOdW1iZXIgb2YgZGV2aWNlcyB0byBxdWVyeSBpbmZvIGZvcgotCi1SRVRVUk5TOgotMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciwgbnVtYmVyIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGlmIG51bURldmljZXMgPSAwCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBQQ0kgcm91dGluZyBpbmZvcm1hdGlvbi4gSWYgeW91IHBhc3MgYSB2YWx1ZSBvZgotMCBmb3IgbnVtRGV2aWNlcywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB3aXRoIHRoZSBudW1iZXIgb2YgZGV2aWNlcwotbmVlZGVkIGluIHRoZSByb3V0aW5nIGJ1ZmZlciB0aGF0IHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoZSBCSU9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9BU01BUEkgUENJX2dldElSUVJvdXRpbmdPcHRpb25zKAotICAgIGludCBudW1EZXZpY2VzLAotICAgIFBDSVJvdXRlSW5mbyAqYnVmZmVyKQotewotICAgIFBDSVJvdXRpbmdPcHRpb25zQnVmZmVyIGJ1ZjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZXQ7Ci0KLSAgICBpZiAoUENJUGh5c0VudHJ5KSB7Ci0JYnVmLkJ1ZmZlclNpemUgPSBudW1EZXZpY2VzICogc2l6ZW9mKFBDSVJvdXRlSW5mbyk7Ci0JYnVmLkRhdGFCdWZmZXIgPSBidWZmZXI7Ci0JaWYgKChyZXQgPSBfUENJQklPU19nZXRSb3V0aW5nKCZidWYsUENJRW50cnkpKSA9PSAweDg5KQotCSAgICByZXR1cm4gYnVmLkJ1ZmZlclNpemUgLyBzaXplb2YoUENJUm91dGVJbmZvKTsKLQlpZiAocmV0ICE9IDApCi0JICAgIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKLQl9Ci0KLSAgICAvKiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoaXMgdmlhIHRoZSBQQ0kgQklPUyBmdW5jdGlvbnMgKi8KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlCi1pbnRQaW4gIC0gVmFsdWUgdG8gc3RvcmUgaW4gdGhlIFBDSSBJbnRlcnJ1cHRQaW4gcmVnaXN0ZXIKLUlSUSAgICAgLSBOZXcgSVNBIElSUSB0byBtYXAgdGhlIFBDSSBpbnRlcnJ1cHQgdG8gKDAtMTUpCi0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIGlmIHRoaXMgZnVuY3Rpb24gZmFpbGVkLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBQQ0kgSVJRIHJvdXRpbmcgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlIHRvIHRoZQotZGVzaXJlZCBQQ0kgaW50ZXJydXB0IGFuZCB0aGUgZGVzaXJlZCBJU0EgYnVzIGNvbXBhdGlibGUgSVJRLiBUaGlzIGZ1bmN0aW9uCi1tYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgUENJIEJJT1MsIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsCi1mYWlsLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9BU01BUEkgUENJX3NldEhhcmR3YXJlSVJRKAotICAgIFBDSURldmljZUluZm8gKmluZm8sCi0gICAgdWludCBpbnRQaW4sCi0gICAgdWludCBJUlEpCi17Ci0gICAgaWYgKFBDSVBoeXNFbnRyeSkgewotCWlmIChfUENJQklPU19zZXRJUlEoaW5mby0+c2xvdC5pID4+IDgsaW50UGluLElSUSxQQ0lFbnRyeSkpIHsKLQkgICAgaW5mby0+dS50eXBlMC5JbnRlcnJ1cHRQaW4gPSBpbnRQaW47Ci0JICAgIGluZm8tPnUudHlwZTAuSW50ZXJydXB0TGluZSA9IElSUTsKLQkgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGlzIHZpYSB0aGUgUENJIEJJT1MgZnVuY3Rpb25zICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJ1cyAgICAgICAgICAgICAgICAgLSBCdXMgbnVtYmVyIHRvIGdlbmVyYXRlIHRoZSBzcGVjaWFsIGN5Y2xlIGZvcgotc3BlY2lhbEN5Y2xlRGF0YSAgICAtIERhdGEgdG8gc2VuZCBmb3IgdGhlIHNwZWNpYWwgY3lsZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYSBzcGVjaWFsIGN5Y2xlIG9uIHRoZSBzcGVjaWZpZWQgYnVzIHVzaW5nIHdpdGgKLXRoZSBzcGVjaWZpZWQgZGF0YS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgUENJX2dlbmVyYXRlU3BlY2lhbEN5bGUoCi0gICAgdWludCBidXMsCi0gICAgdWxvbmcgc3BlY2lhbEN5Y2xlRGF0YSkKLXsKLSAgICBpZiAoUENJUGh5c0VudHJ5KQotCV9QQ0lCSU9TX3NwZWNpYWxDeWNsZShidXMsc3BlY2lhbEN5Y2xlRGF0YSxQQ0lFbnRyeSk7Ci0gICAgLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGlzIHZpYSB0aGUgUENJIEJJT1MgZnVuY3Rpb25zICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYmxvY2sgZm9yIGRldmljZSB0byBhY2Nlc3MKLWluZGV4ICAgLSBJbmRleCBvZiByZWdpc3RlciB0byBzdGFydCByZWFkaW5nIGZyb20KLWRzdCAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgdmFsdWVzIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNlCi1jb3VudCAgIC0gQ291bnQgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIGNvbmZpZ3VyYXRpb24gc3BhY2UKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgYmxvY2sgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzCi1mcm9tIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGludG8gdGhlIHBhc3NlZCBpbiBkYXRhIGJsb2NrLiBUaGlzIGZ1bmN0aW9uCi13aWxsIHByb3Blcmx5IGhhbmRsZSByZWFkaW5nIG5vbi1EV09SRCBhbGlnbmVkIGRhdGEgZnJvbSB0aGUgY29uZmlndXJhdGlvbgotc3BhY2UgY29ycmVjdGx5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBQQ0lfcmVhZFJlZ0Jsb2NrKAotICAgIFBDSURldmljZUluZm8gKmluZm8sCi0gICAgaW50IGluZGV4LAotICAgIHZvaWQgKmRzdCwKLSAgICBpbnQgY291bnQpCi17Ci0gICAgdWNoYXIgICAqcGI7Ci0gICAgdWxvbmcgICAqcGQ7Ci0gICAgaW50ICAgICBpOwotICAgIGludCAgICAgc3RhcnRDb3VudCA9IChpbmRleCAmIDMpOwotICAgIGludCAgICAgbWlkZGxlQ291bnQgPSAoY291bnQgLSBzdGFydENvdW50KSA+PiAyOwotICAgIGludCAgICAgZW5kQ291bnQgPSBjb3VudCAtIG1pZGRsZUNvdW50ICogNCAtIHN0YXJ0Q291bnQ7Ci0KLSAgICBmb3IgKGkgPSAwLHBiID0gZHN0OyBpIDwgc3RhcnRDb3VudDsgaSsrLCBpbmRleCsrKSB7Ci0JKnBiKysgPSAodWNoYXIpUENJX2FjY2Vzc1JlZyhpbmRleCwwLFBDSV9SRUFEX0JZVEUsaW5mbyk7Ci0JfQotICAgIGZvciAoaSA9IDAscGQgPSAodWxvbmcqKXBiOyBpIDwgbWlkZGxlQ291bnQ7IGkrKywgaW5kZXggKz0gNCkgewotCSpwZCsrID0gKHVsb25nKVBDSV9hY2Nlc3NSZWcoaW5kZXgsMCxQQ0lfUkVBRF9EV09SRCxpbmZvKTsKLQl9Ci0gICAgZm9yIChpID0gMCxwYiA9ICh1Y2hhciopcGQ7IGkgPCBlbmRDb3VudDsgaSsrLCBpbmRleCsrKSB7Ci0JKnBiKysgPSAodWNoYXIpUENJX2FjY2Vzc1JlZyhpbmRleCwwLFBDSV9SRUFEX0JZVEUsaW5mbyk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZm8gICAgLSBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGJsb2NrIGZvciBkZXZpY2UgdG8gYWNjZXNzCi1pbmRleCAgIC0gSW5kZXggb2YgcmVnaXN0ZXIgdG8gc3RhcnQgcmVhZGluZyBmcm9tCi1kc3QgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHZhbHVlcyByZWFkIGZyb20gY29uZmlndXJhdGlvbiBzcGFjZQotY291bnQgICAtIENvdW50IG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgYSBibG9jayBvZiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMKLXRvIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGZyb20gdGhlIHBhc3NlZCBpbiBkYXRhIGJsb2NrLiBUaGlzIGZ1bmN0aW9uCi13aWxsIHByb3Blcmx5IGhhbmRsZSB3cml0aW5nIG5vbi1EV09SRCBhbGlnbmVkIGRhdGEgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLXNwYWNlIGNvcnJlY3RseS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgUENJX3dyaXRlUmVnQmxvY2soCi0gICAgUENJRGV2aWNlSW5mbyAqaW5mbywKLSAgICBpbnQgaW5kZXgsCi0gICAgdm9pZCAqc3JjLAotICAgIGludCBjb3VudCkKLXsKLSAgICB1Y2hhciAgICpwYjsKLSAgICB1bG9uZyAgICpwZDsKLSAgICBpbnQgICAgIGk7Ci0gICAgaW50ICAgICBzdGFydENvdW50ID0gKGluZGV4ICYgMyk7Ci0gICAgaW50ICAgICBtaWRkbGVDb3VudCA9IChjb3VudCAtIHN0YXJ0Q291bnQpID4+IDI7Ci0gICAgaW50ICAgICBlbmRDb3VudCA9IGNvdW50IC0gbWlkZGxlQ291bnQgKiA0IC0gc3RhcnRDb3VudDsKLQotICAgIGZvciAoaSA9IDAscGIgPSBzcmM7IGkgPCBzdGFydENvdW50OyBpKyssIGluZGV4KyspIHsKLQlQQ0lfYWNjZXNzUmVnKGluZGV4LCpwYisrLFBDSV9XUklURV9CWVRFLGluZm8pOwotCX0KLSAgICBmb3IgKGkgPSAwLHBkID0gKHVsb25nKilwYjsgaSA8IG1pZGRsZUNvdW50OyBpKyssIGluZGV4ICs9IDQpIHsKLQlQQ0lfYWNjZXNzUmVnKGluZGV4LCpwZCsrLFBDSV9XUklURV9EV09SRCxpbmZvKTsKLQl9Ci0gICAgZm9yIChpID0gMCxwYiA9ICh1Y2hhciopcGQ7IGkgPCBlbmRDb3VudDsgaSsrLCBpbmRleCsrKSB7Ci0JUENJX2FjY2Vzc1JlZyhpbmRleCwqcGIrKyxQQ0lfV1JJVEVfQllURSxpbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdW5peGlvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdW5peGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYTY2YTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3VuaXhpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSBjb250YWluaW5nIFVuaXggSS9PIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoge3NlY3JldH0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBESVIgICAgICpkOwotICAgIGNoYXIgICAgcGF0aFtQTV9NQVhfUEFUSF07Ci0gICAgY2hhciAgICBtYXNrW1BNX01BWF9QQVRIXTsKLSAgICB9IFBNX2ZpbmRIYW5kbGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW50ZXJuYWwgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgZmluZCBkYXRhIHRvIHRoZSBnZW5lcmljIGludGVyZmFjZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb252ZXJ0RmluZERhdGEoCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhLAotICAgIHN0cnVjdCBkaXJlbnQgKmJsaywKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIHVsb25nICAgICAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgY2hhciAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOwotCi0gICAgbWVtc2V0KGZpbmREYXRhLDAsZmluZERhdGEtPmR3U2l6ZSk7Ci0gICAgZmluZERhdGEtPmR3U2l6ZSA9IGR3U2l6ZTsKLSAgICBzdHJjcHkoZmlsZW5hbWUscGF0aCk7Ci0gICAgUE1fYmFja3NsYXNoKGZpbGVuYW1lKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsYmxrLT5kX25hbWUpOwotICAgIHN0YXQoZmlsZW5hbWUsJnN0KTsKLSAgICBpZiAoIShzdC5zdF9tb2RlICYgU19JV1JJVEUpKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9SRUFET05MWTsKLSAgICBpZiAoc3Quc3RfbW9kZSAmIFNfSUZESVIpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0RJUkVDVE9SWTsKLSAgICBmaW5kRGF0YS0+c2l6ZUxvID0gc3Quc3Rfc2l6ZTsKLSAgICBmaW5kRGF0YS0+c2l6ZUhpID0gMDsKLSAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+ZF9uYW1lLFBNX01BWF9QQVRIKTsKLSAgICBmaW5kRGF0YS0+bmFtZVtQTV9NQVhfUEFUSC0xXSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lcyBpZiBhIGZpbGUgbmFtZSBtYXRjaGVzIHRoZSBwYXNzZWQgaW4gcGF0dGVybi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgZmlsZW1hdGNoKAotICAgIGNoYXIgKnBhdHRlcm4sCi0gICAgY2hhciAqZGlycGF0aCwKLSAgICBzdHJ1Y3QgZGlyZW50ICpkaXJlKQotewotICAgIHN0cnVjdCBzdGF0IHN0OwotICAgIGludCAgICAgICAgIGkgPSAwLGogPSAwLGxhc3RjaGFyID0gJ1wwJzsKLSAgICBjaGFyICAgICAgICBmdWxscGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICBzdHJjcHkoZnVsbHBhdGgsZGlycGF0aCk7Ci0gICAgUE1fYmFja3NsYXNoKGZ1bGxwYXRoKTsKLSAgICBzdHJjYXQoZnVsbHBhdGgsIGRpcmUtPmRfbmFtZSk7Ci0gICAgaWYgKHN0YXQoZnVsbHBhdGgsICZzdCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgZm9yICg7IGkgPCAoaW50KXN0cmxlbihkaXJlLT5kX25hbWUpICYmIGogPCAoaW50KXN0cmxlbihwYXR0ZXJuKTsgaSsrLCBqKyspIHsKLQlpZiAocGF0dGVybltqXSA9PSAnKicgJiYgbGFzdGNoYXIgIT0gJ1xcJykgewotCSAgICBpZiAocGF0dGVybltqKzFdID09ICdcMCcpCi0JCXJldHVybiB0cnVlOwotCSAgICB3aGlsZSAoZGlyZS0+ZF9uYW1lW2krK10gIT0gcGF0dGVybltqKzFdKSB7Ci0JCWlmIChkaXJlLT5kX25hbWVbaV0gPT0gJ1wwJykKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICBpIC09IDI7Ci0JICAgIH0KLQllbHNlIGlmIChkaXJlLT5kX25hbWVbaV0gIT0gcGF0dGVybltqXSAmJgotCQkhKHBhdHRlcm5bal0gPT0gJz8nICYmIGxhc3RjaGFyICE9ICdcXCcpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JbGFzdGNoYXIgPSBwYXR0ZXJuW2ldOwotCX0KLSAgICBpZiAoaiA9PSAoaW50KXN0cmxlbihwYXR0ZXJuKSAmJiBpID09IChpbnQpc3RybGVuKGRpcmUtPmRfbmFtZSkpCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIFBNX2ZpbmRIYW5kbGUgICAqZDsKLSAgICBzdHJ1Y3QgZGlyZW50ICAgKmRpcmU7Ci0gICAgY2hhciAgICAgICAgICAgIG5hbWVbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgICAgICAgICBleHRbUE1fTUFYX1BBVEhdOwotCi0gICAgaWYgKChkID0gUE1fbWFsbG9jKHNpemVvZigqZCkpKSA9PSBOVUxMKQotCXJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci0gICAgUE1fc3BsaXRwYXRoKGZpbGVuYW1lLE5VTEwsZC0+cGF0aCxuYW1lLGV4dCk7Ci0gICAgc3RyY3B5KGQtPm1hc2ssbmFtZSk7Ci0gICAgc3RyY2F0KGQtPm1hc2ssZXh0KTsKLSAgICBpZiAoc3RybGVuKGQtPnBhdGgpID09IDApCi0Jc3RyY3B5KGQtPnBhdGgsICIuIik7Ci0gICAgaWYgKGQtPnBhdGhbc3RybGVuKGQtPnBhdGgpLTFdID09ICcvJykKLQlkLT5wYXRoW3N0cmxlbihkLT5wYXRoKS0xXSA9IDA7Ci0gICAgaWYgKChkLT5kID0gb3BlbmRpcihkLT5wYXRoKSkgIT0gTlVMTCkgewotCXdoaWxlICgoZGlyZSA9IHJlYWRkaXIoZC0+ZCkpICE9IE5VTEwpIHsKLQkgICAgaWYgKGZpbGVtYXRjaChkLT5tYXNrLGQtPnBhdGgsZGlyZSkpIHsKLQkJY29udmVydEZpbmREYXRhKGZpbmREYXRhLGRpcmUsZC0+cGF0aCk7Ci0JCXJldHVybiBkOwotCQl9Ci0JICAgIH0KLQljbG9zZWRpcihkLT5kKTsKLQl9Ci0gICAgUE1fZnJlZShkKTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBQTV9maW5kSGFuZGxlICAgKmQgPSBoYW5kbGU7Ci0gICAgc3RydWN0IGRpcmVudCAgICpkaXJlOwotCi0gICAgd2hpbGUgKChkaXJlID0gcmVhZGRpcihkLT5kKSkgIT0gTlVMTCkgewotCWlmIChmaWxlbWF0Y2goZC0+bWFzayxkLT5wYXRoLGRpcmUpKSB7Ci0JICAgIGNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxkaXJlLGQtPnBhdGgpOwotCSAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICBQTV9maW5kSGFuZGxlICAgKmQgPSBoYW5kbGU7Ci0KLSAgICBjbG9zZWRpcihkLT5kKTsKLSAgICBmcmVlKGQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIGlmIChkcml2ZSA9PSAzKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgKHZvaWQpZHJpdmU7Ci0gICAgZ2V0Y3dkKGRpcixsZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICBtb2RlX3QgICAgICBtb2RlOwotCi0gICAgc3RhdChmaWxlbmFtZSwmc3QpOwotICAgIG1vZGUgPSBzdC5zdF9tb2RlOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCW1vZGUgJj0gflNfSVdSSVRFOwotICAgIGVsc2UKLQltb2RlIHw9IFNfSVdSSVRFOwotICAgIGNobW9kKGZpbGVuYW1lLG1vZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICAgIHN0YXQoZmlsZW5hbWUsJnN0KTsKLSAgICBpZiAoc3Quc3RfbW9kZSAmIFNfSVdSSVRFKQotCXJldHVybiAwOwotICAgIHJldHVybiBQTV9GSUxFX1JFQURPTkxZOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUsMHgxRkYpID09IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX2dldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZ21UaW1lOwotICAgICh2b2lkKXRpbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fc2V0RmlsZVRpbWUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdmdhc3RhdGUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi92Z2FzdGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU2ZTlhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi92Z2FzdGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICAgICAgICAgICAgICAgICBQb3J0aW9ucyBjb3B5cmlnaHQgKEMpIEpvc2ggVmFuZGVyaG9vZgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIEZ1bmN0aW9ucyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBWR0EgaGFyZHdhcmUgc3RhdGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBWR0EgaW5kZXggcmVnaXN0ZXIgcG9ydHMgKi8KLSNkZWZpbmUgQ1JUX0kgICAweDNENCAgICAgICAvKiBDUlQgQ29udHJvbGxlciBJbmRleCAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFUVF9JVyAgMHgzQzAgICAgICAgLyogQXR0cmlidXRlIENvbnRyb2xsZXIgSW5kZXggJiBEYXRhICAgICAgICAqLwotI2RlZmluZSBHUkFfSSAgIDB4M0NFICAgICAgIC8qIEdyYXBoaWNzIENvbnRyb2xsZXIgSW5kZXggICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0VRX0kgICAweDNDNCAgICAgICAvKiBTZXF1ZW5jZXIgSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIFZHQSBkYXRhIHJlZ2lzdGVyIHBvcnRzICovCi0jZGVmaW5lIENSVF9EICAgMHgzRDUgICAgICAgLyogQ1JUIENvbnRyb2xsZXIgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAqLwotI2RlZmluZSBBVFRfUiAgIDB4M0MxICAgICAgIC8qIEF0dHJpYnV0ZSBDb250cm9sbGVyIERhdGEgUmVhZCBSZWdpc3RlciAgKi8KLSNkZWZpbmUgR1JBX0QgICAweDNDRiAgICAgICAvKiBHcmFwaGljcyBDb250cm9sbGVyIERhdGEgUmVnaXN0ZXIgICAgICAgICovCi0jZGVmaW5lIFNFUV9EICAgMHgzQzUgICAgICAgLyogU2VxdWVuY2VyIERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNSVNfUiAgIDB4M0NDICAgICAgIC8qIE1pc2MgT3V0cHV0IFJlYWQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTUlTX1cgICAweDNDMiAgICAgICAvKiBNaXNjIE91dHB1dCBXcml0ZSBSZWdpc3RlciAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElTMV9SICAgMHgzREEgICAgICAgLyogSW5wdXQgU3RhdHVzIFJlZ2lzdGVyIDEgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQRUxfSVcgIDB4M0M4ICAgICAgIC8qIFBFTCBXcml0ZSBJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEVMX0lSICAweDNDNyAgICAgICAvKiBQRUwgUmVhZCBJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBFTF9EICAgMHgzQzkgICAgICAgLyogUEVMIERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBzdGFuZGFyZCBWR0EgaW5kZXhlcyBtYXggY291bnRzICovCi0jZGVmaW5lIENSVF9DICAgMjQgICAgICAgICAgLyogMjQgIENSVCBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAgICAgICAqLwotI2RlZmluZSBBVFRfQyAgIDIxICAgICAgICAgIC8qIDIxICBBdHRyaWJ1dGUgQ29udHJvbGxlciBSZWdpc3RlcnMgICAgICAgKi8KLSNkZWZpbmUgR1JBX0MgICA5ICAgICAgICAgICAvKiA5ICAgR3JhcGhpY3MgQ29udHJvbGxlciBSZWdpc3RlcnMgICAgICAgICovCi0jZGVmaW5lIFNFUV9DICAgNSAgICAgICAgICAgLyogNSAgIFNlcXVlbmNlciBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNSVNfQyAgIDEgICAgICAgICAgIC8qIDEgICBNaXNjIE91dHB1dCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEFMX0MgICA3NjggICAgICAgICAvKiA3NjggUGFsZXR0ZSBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZPTlRfQyAgODE5MiAgICAgICAgLyogVG90YWwgc2l6ZSBvZiBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTSAgICAqLwotCi0vKiBWR0EgcmVnaXN0ZXJzIHNhdmluZyBpbmRleGVzICovCi0jZGVmaW5lIENSVCAgICAgMCAgICAgICAgICAgLyogQ1JUIENvbnRyb2xsZXIgUmVnaXN0ZXJzIHN0YXJ0ICAgICAgICAgICAqLwotI2RlZmluZSBBVFQgICAgIChDUlQrQ1JUX0MpIC8qIEF0dHJpYnV0ZSBDb250cm9sbGVyIFJlZ2lzdGVycyBzdGFydCAgICAgKi8KLSNkZWZpbmUgR1JBICAgICAoQVRUK0FUVF9DKSAvKiBHcmFwaGljcyBDb250cm9sbGVyIFJlZ2lzdGVycyBzdGFydCAgICAgICovCi0jZGVmaW5lIFNFUSAgICAgKEdSQStHUkFfQykgLyogU2VxdWVuY2VyIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNSVMgICAgIChTRVErU0VRX0MpIC8qIEdlbmVyYWwgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEFMICAgICAoTUlTK01JU19DKSAvKiBWR0EgUGFsZXR0ZSBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZPTlQgICAgKFBBTCtQQUxfQykgLyogVkdBIGZvbnQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBNYWNyb3MgZm9yIHBvcnQgSS9PIHdpdGggYXJndW1lbnRzIHJldmVyc2VkICovCi0KLSNkZWZpbmUgX3BvcnRfb3V0KHYscCkgIFBNX291dHBiKHAsKHVjaGFyKSh2KSkKLSNkZWZpbmUgX3BvcnRfaW4ocCkgICAgIFBNX2lucGIocCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBWR0Egc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRWR0FTdGF0ZVNpemUodm9pZCkKLXsKLSAgICByZXR1cm4gQ1JUX0MgKyBBVFRfQyArIEdSQV9DICsgU0VRX0MgKyBNSVNfQyArIFBBTF9DICsgRk9OVF9DOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlbGF5IGZvciBhIHNob3J0IHBlcmlvZCBvZiB0aW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHZnYV9kZWxheSh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgLyogRm9yIHRoZSBsb29wIGhlcmUgd2UgcHJvZ3JhbSB0aGUgUE9TVCByZWdpc3Rlci4gVGhlIGxlbmd0aCBvZiB0aGlzCi0gICAgICogZGVsYXkgaXMgZGVwZW5kYW50IG9ubHkgb24gSVNBIGJ1cyBzcGVlZCwgYnV0IGl0IGlzIGVub3VnaCBmb3IKLSAgICAgKiB3aGF0IHdlIG5lZWQuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8PSAxMDsgaSsrKQotCVBNX291dHBiKDB4ODAsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBvcnQgICAgLSBJL08gcG9ydCB0byByZWFkIHZhbHVlIGZyb20KLWluZGV4ICAgLSBQb3J0IGluZGV4IHRvIHJlYWQKLQotUkVUVVJOUzoKLUJ5dGUgcmVhZCBmcm9tICdwb3J0JyByZWdpc3RlciAnaW5kZXgnLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1c2hvcnQgdmdhX3JkaW54KAotICAgIHVzaG9ydCBwb3J0LAotICAgIHVzaG9ydCBpbmRleCkKLXsKLSAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7Ci0gICAgcmV0dXJuIFBNX2lucGIocG9ydCsxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wb3J0ICAgIC0gSS9PIHBvcnQgdG8gd3JpdGUgdG8KLWluZGV4ICAgLSBQb3J0IGluZGV4IHRvIHdyaXRlCi12YWx1ZSAgIC0gQnl0ZSB0byB3cml0ZSB0byBwb3J0Ci0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBieXRlIHZhbHVlIHRvIHRoZSAncG9ydCcgcmVnaXN0ZXIgJ2luZGV4Jy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB2Z2Ffd3JpbngoCi0gICAgdXNob3J0IHBvcnQsCi0gICAgdXNob3J0IGluZGV4LAotICAgIHVzaG9ydCB2YWx1ZSkKLXsKLSAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7Ci0gICAgUE1fb3V0cGIocG9ydCsxLCh1Y2hhcil2YWx1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgY29sb3IgcGFsZXR0ZSB2YWx1ZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB2Z2Ffc2F2ZXBhbGV0dGUoCi0gICAgdWNoYXIgKnBhbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIF9wb3J0X291dCgwLCBQRUxfSVIpOwotICAgIGZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykgewotCXZnYV9kZWxheSgpOwotCSpwYWwrKyA9IF9wb3J0X2luKFBFTF9EKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgY29sb3IgcGFsZXR0ZSB2YWx1ZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB2Z2FfcmVzdG9yZXBhbGV0dGUoCi0gICAgY29uc3QgdWNoYXIgKnBhbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIHJlc3RvcmUgc2F2ZWQgcGFsZXR0ZSAqLwotICAgIF9wb3J0X291dCgwLCBQRUxfSVcpOwotICAgIGZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykgewotCXZnYV9kZWxheSgpOwotCV9wb3J0X291dCgqcGFsKyssIFBFTF9EKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgZm9udCBkYXRhIGZyb20gdGhlIFZHQSBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHZnYV9zYXZlRm9udCgKLSAgICB1Y2hhciAqZGF0YSkKLXsKLSAgICB1Y2hhciAgICpBMDAwMFB0ciA9IFBNX2dldEEwMDAwUG9pbnRlcigpOwotICAgIHVjaGFyICAgc2F2ZVs3XTsKLQotICAgIC8qIEVuYWJsZSBhY2Nlc3MgdG8gY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICBzYXZlWzBdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAwKTsKLSAgICBzYXZlWzFdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAyKTsKLSAgICBzYXZlWzJdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDA0KTsKLSAgICBzYXZlWzNdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAwKTsKLSAgICBzYXZlWzRdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA0KTsKLSAgICBzYXZlWzVdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA1KTsKLSAgICBzYXZlWzZdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA2KTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCwweDAxKTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMiwweDA0KTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwNCwweDA3KTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCwweDAzKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNCwweDAyKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNSwweDAwKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNiwweDAwKTsKLQotICAgIC8qIENvcHkgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICBtZW1jcHkoZGF0YSxBMDAwMFB0cixGT05UX0MpOwotCi0gICAgLyogUmVzdG9yZSBWR0Egc3RhdGUgKi8KLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCxzYXZlWzBdKTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMixzYXZlWzFdKTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwNCxzYXZlWzJdKTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCxzYXZlWzNdKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNCxzYXZlWzRdKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNSxzYXZlWzVdKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNixzYXZlWzZdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Eb3dubG9hZHMgdGhlIGZvbnQgZGF0YSB0byB0aGUgVkdBIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdmdhX3Jlc3RvcmVGb250KAotICAgIGNvbnN0IHVjaGFyICpkYXRhKQotewotICAgIHVjaGFyICAgKkEwMDAwUHRyID0gUE1fZ2V0QTAwMDBQb2ludGVyKCk7Ci0KLSAgICAvKiBFbmFibGUgYWNjZXNzIHRvIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCi0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsMHgwMSk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDIsMHgwNCk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDQsMHgwNyk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsMHgwMyk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDQsMHgwMik7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDUsMHgwMCk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDYsMHgwMCk7Ci0KLSAgICAvKiBDb3B5IGZvbnQgYmFjayB0byBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTSAqLwotICAgIG1lbWNweShBMDAwMFB0cixkYXRhLEZPTlRfQyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgc3RhdGUgb2YgYWxsIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2F2ZVZHQVN0YXRlKAotICAgIHZvaWQgKnN0YXRlQnVmKQotewotICAgIHVjaGFyICAgKnJlZ3MgPSBzdGF0ZUJ1ZjsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICAvKiBTYXZlIHN0YXRlIG9mIFZHQSByZWdpc3RlcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgQ1JUX0M7IGkrKykgewotCV9wb3J0X291dChpLCBDUlRfSSk7Ci0JcmVnc1tDUlQgKyBpXSA9IF9wb3J0X2luKENSVF9EKTsKLQl9Ci0gICAgZm9yIChpID0gMDsgaSA8IEFUVF9DOyBpKyspIHsKLQlfcG9ydF9pbihJUzFfUik7Ci0JdmdhX2RlbGF5KCk7Ci0JX3BvcnRfb3V0KGksIEFUVF9JVyk7Ci0JdmdhX2RlbGF5KCk7Ci0JcmVnc1tBVFQgKyBpXSA9IF9wb3J0X2luKEFUVF9SKTsKLQl2Z2FfZGVsYXkoKTsKLQl9Ci0gICAgZm9yIChpID0gMDsgaSA8IEdSQV9DOyBpKyspIHsKLQlfcG9ydF9vdXQoaSwgR1JBX0kpOwotCXJlZ3NbR1JBICsgaV0gPSBfcG9ydF9pbihHUkFfRCk7Ci0JfQotICAgIGZvciAoaSA9IDA7IGkgPCBTRVFfQzsgaSsrKSB7Ci0JX3BvcnRfb3V0KGksIFNFUV9JKTsKLQlyZWdzW1NFUSArIGldID0gX3BvcnRfaW4oU0VRX0QpOwotCX0KLSAgICByZWdzW01JU10gPSBfcG9ydF9pbihNSVNfUik7Ci0KLSAgICAvKiBTYXZlIHRoZSBWR0EgcGFsZXR0ZSB2YWx1ZXMgKi8KLSAgICB2Z2Ffc2F2ZXBhbGV0dGUoJnJlZ3NbUEFMXSk7Ci0KLSAgICAvKiBTYXZlIHRoZSBWR0EgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICB2Z2Ffc2F2ZUZvbnQoJnJlZ3NbRk9OVF0pOwotCi0gICAgLyogVHVybiB0aGUgVkdBIGRpc3BsYXkgYmFjayBvbiAqLwotICAgIFBNX3ZnYVVuYmxhbmtEaXNwbGF5KCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0b3JlIHRoZSBzdGF0ZSBvZiBhbGwgVkdBIGNvbXBhdGlibGUgcmVnaXN0ZXJzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlVkdBU3RhdGUoCi0gICAgY29uc3Qgdm9pZCAqc3RhdGVCdWYpCi17Ci0gICAgY29uc3QgdWNoYXIgKnJlZ3MgPSBzdGF0ZUJ1ZjsKLSAgICBpbnQgICAgICAgICBpOwotCi0gICAgLyogQmxhbmsgdGhlIGRpc3BsYXkgYmVmb3JlIHdlIHN0YXJ0IHRoZSByZXN0b3JlICovCi0gICAgUE1fdmdhQmxhbmtEaXNwbGF5KCk7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBWR0EgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICB2Z2FfcmVzdG9yZUZvbnQoJnJlZ3NbRk9OVF0pOwotCi0gICAgLyogUmVzdG9yZSB0aGUgVkdBIHBhbGV0dGUgdmFsdWVzICovCi0gICAgdmdhX3Jlc3RvcmVwYWxldHRlKCZyZWdzW1BBTF0pOwotCi0gICAgLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycyAqLwotICAgIF9wb3J0X291dChyZWdzW01JU10sIE1JU19XKTsKLQotICAgIC8qIERlbGF5IHRvIGFsbG93IGNsb2NrIGNoYW5nZSB0byBzZXR0bGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQl2Z2FfZGVsYXkoKTsKLQotICAgIC8qIFN5bmNocm9ub3VzIHJlc2V0IG9uICovCi0gICAgX3BvcnRfb3V0KDB4MDAsU0VRX0kpOwotICAgIF9wb3J0X291dCgweDAxLFNFUV9EKTsKLQotICAgIC8qIFdyaXRlIHNlcWV1ZW5jZXIgcmVnaXN0ZXJzICovCi0gICAgX3BvcnRfb3V0KDEsIFNFUV9JKTsKLSAgICBfcG9ydF9vdXQocmVnc1tTRVEgKyAxXSB8IDB4MjAsIFNFUV9EKTsKLSAgICBmb3IgKGkgPSAyOyBpIDwgU0VRX0M7IGkrKykgewotCV9wb3J0X291dChpLCBTRVFfSSk7Ci0JX3BvcnRfb3V0KHJlZ3NbU0VRICsgaV0sIFNFUV9EKTsKLQl9Ci0KLSAgICAvKiBTeW5jaHJvbm91cyByZXNldCBvZmYgKi8KLSAgICBfcG9ydF9vdXQoMHgwMCxTRVFfSSk7Ci0gICAgX3BvcnRfb3V0KDB4MDMsU0VRX0QpOwotCi0gICAgLyogRGVwcm90ZWN0IENSVCByZWdpc3RlcnMgMC03IGFuZCB3cml0ZSBDUlRDICovCi0gICAgX3BvcnRfb3V0KDB4MTEsIENSVF9JKTsKLSAgICBfcG9ydF9vdXQoX3BvcnRfaW4oQ1JUX0QpICYgMHg3RiwgQ1JUX0QpOwotICAgIGZvciAoaSA9IDA7IGkgPCBDUlRfQzsgaSsrKSB7Ci0JX3BvcnRfb3V0KGksIENSVF9JKTsKLQlfcG9ydF9vdXQocmVnc1tDUlQgKyBpXSwgQ1JUX0QpOwotCX0KLSAgICBmb3IgKGkgPSAwOyBpIDwgR1JBX0M7IGkrKykgewotCV9wb3J0X291dChpLCBHUkFfSSk7Ci0JX3BvcnRfb3V0KHJlZ3NbR1JBICsgaV0sIEdSQV9EKTsKLQl9Ci0gICAgZm9yIChpID0gMDsgaSA8IEFUVF9DOyBpKyspIHsKLQlfcG9ydF9pbihJUzFfUik7ICAgICAgICAvKiByZXNldCBmbGlwLWZsb3AgKi8KLQl2Z2FfZGVsYXkoKTsKLQlfcG9ydF9vdXQoaSwgQVRUX0lXKTsKLQl2Z2FfZGVsYXkoKTsKLQlfcG9ydF9vdXQocmVnc1tBVFQgKyBpXSwgQVRUX0lXKTsKLQl2Z2FfZGVsYXkoKTsKLQl9Ci0KLSAgICAvKiBFbnN1cmUgdGhlIFZHQSBzY3JlZW4gaXMgdHVybmVkIG9uICovCi0gICAgUE1fdmdhVW5ibGFua0Rpc3BsYXkoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EaXNhYmxlcyB0aGUgVkdBIGRpc3BsYXkgZm9yIHNjcmVlbiBvdXRwdXQgbWFraW5nIGl0IGJsYW5rLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fdmdhQmxhbmtEaXNwbGF5KHZvaWQpCi17Ci0gICAgLyogVHVybiBzY3JlZW4gb2ZmICovCi0gICAgX3BvcnRfb3V0KDB4MDEsIFNFUV9JKTsKLSAgICBfcG9ydF9vdXQoX3BvcnRfaW4oU0VRX0QpIHwgMHgyMCwgU0VRX0QpOwotCi0gICAgLyogRGlzYWJsZSB2aWRlbyBvdXRwdXQgKi8KLSAgICBfcG9ydF9pbihJUzFfUik7Ci0gICAgdmdhX2RlbGF5KCk7Ci0gICAgIF9wb3J0X291dCgweDAwLCBBVFRfSVcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVuYWJsZXMgdGhlIFZHQSBkaXNwbGF5IGZvciBzY3JlZW4gb3V0cHV0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fdmdhVW5ibGFua0Rpc3BsYXkodm9pZCkKLXsKLSAgICAvKiBUdXJuIHNjcmVlbiBiYWNrIG9uICovCi0gICAgX3BvcnRfb3V0KDB4MDEsIFNFUV9JKTsKLSAgICBfcG9ydF9vdXQoX3BvcnRfaW4oU0VRX0QpICYgMHhERiwgU0VRX0QpOwotCi0gICAgLyogRW5hYmxlIHZpZGVvIG91dHB1dCAqLwotICAgIF9wb3J0X2luKElTMV9SKTsKLSAgICB2Z2FfZGVsYXkoKTsKLSAgICBfcG9ydF9vdXQoMHgyMCwgQVRUX0lXKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2MmU4MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTWFpbiBtb2R1bGUgdG8gaW1wbGVtZW50IHRoZSBaZW4gVGltZXIgc3VwcG9ydCBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAienRpbWVyLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fT1MyX1ZERF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRXh0ZXJuYWwgSW50ZWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLwotI2lmZGVmICBfX0lOVEVMX18KLS8qIHtzZWNyZXR9ICovCi1pYm9vbCAgIF9BU01BUEkgX0NQVV9oYXZlQ1BVSUQodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotaWJvb2wgICBfQVNNQVBJIF9DUFVfY2hlY2s4MDM4Nih2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi1pYm9vbCAgIF9BU01BUEkgX0NQVV9jaGVjazgwNDg2KHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXVpbnQgICAgX0FTTUFQSSBfQ1BVX2NoZWNrQ1BVSUQodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotdWludCAgICBfQVNNQVBJIF9DUFVfZ2V0Q1BVSURNb2RlbCh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi11aW50ICAgIF9BU01BUEkgX0NQVV9nZXRDUFVJRFN0ZXBwaW5nKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXVpbnQgICAgX0FTTUFQSSBfQ1BVX2dldENQVUlERmVhdHVyZXModm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotdWludCAgICBfQVNNQVBJIF9DUFVfZ2V0Q2FjaGVTaXplKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXVpbnQgICAgX0FTTUFQSSBfQ1BVX2hhdmUzRE5vdyh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi1pYm9vbCAgIF9BU01BUEkgX0NQVV9jaGVja0Nsb25lKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXZvaWQgICAgX0FTTUFQSSBfQ1BVX3JlYWRUaW1lU3RhbXAoQ1BVX2xhcmdlSW50ZWdlciAqdGltZSk7Ci0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBfQVNNQVBJIF9DUFVfcnVuQlNGTG9vcCh1bG9uZyBpdGVyYXRpb25zKTsKLS8qIHtzZWNyZXR9ICovCi11bG9uZyAgIF9BU01BUEkgX0NQVV9tdWxEaXYodWxvbmcgYSx1bG9uZyBiLHVsb25nIGMpOwotLyoge3NlY3JldH0gKi8KLXZvaWQgWlRpbWVyUXVpY2tJbml0KHZvaWQpOwotI2RlZmluZSBDUFVfSGF2ZU1NWCAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBDUFVfSGF2ZVJEVFNDICAgMHgwMDAwMDAxMAotI2RlZmluZSBDUFVfSGF2ZVNTRSAgICAgMHgwMjAwMDAwMAotI2VuZGlmCi0KLSNpZiAgICAgZGVmaW5lZChfX1NNWDMyX18pCi0jaW5jbHVkZSAic214L2NwdWluZm8uYyIKLSNlbGlmICAgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0jaW5jbHVkZSAicnR0YXJnZXQvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fUkVBTERPU19fKQotI2luY2x1ZGUgImRvcy9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJudGRydi9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19XSU4zMl9WWERfXykKLSNpbmNsdWRlICJ2eGQvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XUzMyX18pCi0jaW5jbHVkZSAid2luMzIvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX1ZERF9fKQotI2luY2x1ZGUgInZkZC9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfXykKLSNpbmNsdWRlICJvczIvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykKLSNpbmNsdWRlICJsaW51eC9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19RTlhfXykKLSNpbmNsdWRlICJxbngvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fQkVPU19fKQotI2luY2x1ZGUgImJlb3MvY3B1aW5mby5jIgotI2Vsc2UKLSNlcnJvciAgQ1BVIGxpYnJhcnkgbm90IHBvcnRlZCB0byB0aGlzIHBsYXRmb3JtIHlldCEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgaW50ZXJmYWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgYW4gSS9PIHBvcnQgbG9jYXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVjaGFyIHJkaW54KAotICAgIGludCBwb3J0LAotICAgIGludCBpbmRleCkKLXsKLSAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7Ci0gICAgcmV0dXJuIFBNX2lucGIocG9ydCsxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Xcml0ZSBhbiBJL08gcG9ydCBsb2NhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB3cmlueCgKLSAgICB1c2hvcnQgcG9ydCwKLSAgICB1c2hvcnQgaW5kZXgsCi0gICAgdXNob3J0IHZhbHVlKQotewotICAgIFBNX291dHBiKHBvcnQsKHVjaGFyKWluZGV4KTsKLSAgICBQTV9vdXRwYihwb3J0KzEsKHVjaGFyKXZhbHVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FbmFibGVzIHRoZSBDeXJpeCBDUFVJRCBpbnN0cnVjdGlvbiB0byBwcm9wZXJseSBkZXRlY3QgTWVkaWFHWCBhbmQgNng4NgotcHJvY2Vzc29ycy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfQ1BVX2VuYWJsZUN5cml4Q1BVSUQodm9pZCkKLXsKLSAgICB1Y2hhciAgIGNjcjM7Ci0KLSAgICBQTV9pbml0KCk7Ci0gICAgY2NyMyA9IHJkaW54KDB4MjIsMHhDMyk7Ci0gICAgd3JpbngoMHgyMiwweEMzLCh1Y2hhcikoY2NyMyB8IDB4MTApKTsKLSAgICB3cmlueCgweDIyLDB4RTgsKHVjaGFyKShyZGlueCgweDIyLDB4RTgpIHwgMHg4MCkpOwotICAgIHdyaW54KDB4MjIsMHhDMyxjY3IzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgdHlwZSBvZiBwcm9jZXNzb3IgaW4gdGhlIHN5c3RlbS4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLU51bWVyaWNhbCBpZGVudGlmaWVyIGZvciB0aGUgaW5zdGFsbGVkIHByb2Nlc3NvcgotCi1SRU1BUktTOgotUmV0dXJucyB0aGUgdHlwZSBvZiBwcm9jZXNzb3IgaW4gdGhlIHN5c3RlbS4gTm90ZSB0aGF0IGlmIHRoZSBDUFUgaXMgYW4KLXVua25vd24gUGVudGl1bSBmYW1pbHkgcHJvY2Vzc29yIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbiBlbnVtZXJhdGlvbiBmb3IsCi10aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiBDUFVfVW5rUGVudGl1bQotKGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIENQVUlEIGluc3RydWN0aW9uKS4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yU3BlZWQsIENQVV9oYXZlTU1YLCBDUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgWkFQSSBDUFVfZ2V0UHJvY2Vzc29yVHlwZSh2b2lkKQotewotI2lmICAgICBkZWZpbmVkKF9fSU5URUxfXykKLSAgICB1aW50ICAgICAgICAgICAgY3B1LHZlbmRvcixtb2RlbCxjYWNoZVNpemU7Ci0gICAgc3RhdGljIGlib29sICAgIGZpcnN0VGltZSA9IHRydWU7Ci0KLSAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkgewotCWNwdSA9IF9DUFVfY2hlY2tDUFVJRCgpOwotCXZlbmRvciA9IGNwdSAmIH5DUFVfbWFzazsKLQlpZiAodmVuZG9yID09IENQVV9JbnRlbCkgewotCSAgICAvKiBDaGVjayBmb3IgSW50ZWwgcHJvY2Vzc29ycyAqLwotCSAgICBzd2l0Y2ggKGNwdSAmIENQVV9tYXNrKSB7Ci0JCWNhc2UgNDogY3B1ID0gQ1BVX2k0ODY7ICAgICAgICAgYnJlYWs7Ci0JCWNhc2UgNTogY3B1ID0gQ1BVX1BlbnRpdW07ICAgICAgYnJlYWs7Ci0JCWNhc2UgNjoKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPT0gMSkKLQkJCWNwdSA9IENQVV9QZW50aXVtUHJvOwotCQkgICAgZWxzZSBpZiAobW9kZWwgPD0gNikgewotCQkJY2FjaGVTaXplID0gX0NQVV9nZXRDYWNoZVNpemUoKTsKLQkJCWlmICgobW9kZWwgPT0gNSAmJiBjYWNoZVNpemUgPT0gMCkgfHwKLQkJCSAgICAobW9kZWwgPT0gNSAmJiBjYWNoZVNpemUgPT0gMjU2KSB8fAotCQkJICAgIChtb2RlbCA9PSA2ICYmIGNhY2hlU2l6ZSA9PSAxMjgpKQotCQkJICAgIGNwdSA9IENQVV9DZWxlcm9uOwotCQkJZWxzZQotCQkJICAgIGNwdSA9IENQVV9QZW50aXVtSUk7Ci0JCQl9Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA+PSA3KSB7Ci0JCQkvKiBNb2RlbCA3ID09IFBlbnRpdW0gSUlJICovCi0JCQkvKiBNb2RlbCA4ID09IENlbGVyb24vUGVudGl1bSBJSUkgQ29wcGVybWluZSAqLwotCQkJY2FjaGVTaXplID0gX0NQVV9nZXRDYWNoZVNpemUoKTsKLQkJCWlmICgobW9kZWwgPT0gOCAmJiBjYWNoZVNpemUgPT0gMTI4KSkKLQkJCSAgICBjcHUgPSBDUFVfQ2VsZXJvbjsKLQkJCWVsc2UKLQkJCSAgICBjcHUgPSBDUFVfUGVudGl1bUlJSTsKLQkJCX0KLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgY3B1ID0gQ1BVX1Vua0ludGVsOwotCQl9Ci0JICAgIH0KLQllbHNlIGlmICh2ZW5kb3IgPT0gQ1BVX0N5cml4KSB7Ci0JICAgIC8qIENoZWNrIGZvciBDeXJpeCBwcm9jZXNzb3JzICovCi0JICAgIHN3aXRjaCAoY3B1ICYgQ1BVX21hc2spIHsKLQkJY2FzZSA0OgotCQkgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA9PSA0KQotCQkJY3B1ID0gQ1BVX0N5cml4TWVkaWFHWDsKLQkJICAgIGVsc2UKLQkJCWNwdSA9IENQVV9VbmtDeXJpeDsKLQkJICAgIGJyZWFrOwotCQljYXNlIDU6Ci0JCSAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpID09IDIpCi0JCQljcHUgPSBDUFVfQ3lyaXg2eDg2OwotCQkgICAgZWxzZSBpZiAobW9kZWwgPT0gNCkKLQkJCWNwdSA9IENQVV9DeXJpeE1lZGlhR1htOwotCQkgICAgZWxzZQotCQkJY3B1ID0gQ1BVX1Vua0N5cml4OwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgNjoKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPD0gMSkKLQkJCWNwdSA9IENQVV9DeXJpeDZ4ODZNWDsKLQkJICAgIGVsc2UKLQkJCWNwdSA9IENQVV9VbmtDeXJpeDsKLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgY3B1ID0gQ1BVX1Vua0N5cml4OwotCQl9Ci0JICAgIH0KLQllbHNlIGlmICh2ZW5kb3IgPT0gQ1BVX0FNRCkgewotCSAgICAvKiBDaGVjayBmb3IgQU1EIHByb2Nlc3NvcnMgKi8KLQkgICAgc3dpdGNoIChjcHUgJiBDUFVfbWFzaykgewotCQljYXNlIDQ6Ci0JCSAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpID09IDApCi0JCQljcHUgPSBDUFVfQU1EQW01eDg2OwotCQkgICAgZWxzZQotCQkJY3B1ID0gQ1BVX0FNREFtNDg2OwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgNToKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPD0gMykKLQkJCWNwdSA9IENQVV9BTURLNTsKLQkJICAgIGVsc2UgaWYgKG1vZGVsIDw9IDcpCi0JCQljcHUgPSBDUFVfQU1ESzY7Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA9PSA4KQotCQkJY3B1ID0gQ1BVX0FNREs2XzI7Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA9PSA5KQotCQkJY3B1ID0gQ1BVX0FNREs2X0lJSTsKLQkJICAgIGVsc2UgaWYgKG1vZGVsID09IDEzKSB7Ci0JCQlpZiAoX0NQVV9nZXRDUFVJRFN0ZXBwaW5nKCkgPD0gMykKLQkJCSAgICBjcHUgPSBDUFVfQU1ESzZfSUlJcGx1czsKLQkJCWVsc2UKLQkJCSAgICBjcHUgPSBDUFVfQU1ESzZfMnBsdXM7Ci0JCQl9Ci0JCSAgICBlbHNlCi0JCQljcHUgPSBDUFVfVW5rQU1EOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgNjoKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPT0gMykKLQkJCWNwdSA9IENQVV9BTUREdXJvbjsKLQkJICAgIGVsc2UKLQkJCWNwdSA9IENQVV9BTURBdGhsb247Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGNwdSA9IENQVV9VbmtBTUQ7Ci0JCX0KLQkgICAgfQotCWVsc2UgaWYgKHZlbmRvciA9PSBDUFVfSURUKSB7Ci0JICAgIC8qIENoZWNrIGZvciBJRFQgV2luQ2hpcCBwcm9jZXNzb3JzICovCi0JICAgIHN3aXRjaCAoY3B1ICYgQ1BVX21hc2spIHsKLQkJY2FzZSA1OgotCQkgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA8PSA0KQotCQkJY3B1ID0gQ1BVX1dpbkNoaXBDNjsKLQkJICAgIGVsc2UgaWYgKG1vZGVsID09IDgpCi0JCQljcHUgPSBDUFVfV2luQ2hpcDI7Ci0JCSAgICBlbHNlCi0JCQljcHUgPSBDUFVfVW5rSURUOwotCQkgICAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgICBjcHUgPSBDUFVfVW5rSURUOwotCQl9Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogQXNzdW1lIGEgUGVudGl1bSBjb21wYXRpYmxlIEludGVsIGNsb25lICovCi0JICAgIGNwdSA9IENQVV9QZW50aXVtOwotCSAgICB9Ci0JcmV0dXJuIGNwdSB8IHZlbmRvciB8IChfQ1BVX2dldENQVUlEU3RlcHBpbmcoKSA8PCBDUFVfc3RlcHBpbmdTaGlmdCk7Ci0JfQotICAgIGVsc2UgewotCWlmIChfQ1BVX2NoZWNrODAzODYoKSkKLQkgICAgY3B1ID0gQ1BVX2kzODY7Ci0JZWxzZSAgaWYgKF9DUFVfY2hlY2s4MDQ4NigpKSB7Ci0JICAgIC8qIElmIHdlIGdldCBoZXJlIHdlIG1heSBoYXZlIGEgQ3lyaXggcHJvY2Vzc29yIHNvIHdlIGNhbiB0cnkKLQkgICAgICogZW5hYmxpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uIGFuZCB0cnlpbmcgYWdhaW4uCi0JICAgICAqLwotCSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0JCWZpcnN0VGltZSA9IGZhbHNlOwotCQlfQ1BVX2VuYWJsZUN5cml4Q1BVSUQoKTsKLQkJcmV0dXJuIENQVV9nZXRQcm9jZXNzb3JUeXBlKCk7Ci0JCX0KLQkgICAgY3B1ID0gQ1BVX2k0ODY7Ci0JICAgIH0KLQllbHNlCi0JICAgIGNwdSA9IENQVV9QZW50aXVtOwotCWlmICghX0NQVV9jaGVja0Nsb25lKCkpCi0JICAgIHJldHVybiBjcHUgfCBDUFVfSW50ZWw7Ci0JcmV0dXJuIGNwdTsKLQl9Ci0jZWxpZiAgIGRlZmluZWQoX19BTFBIQV9fKQotICAgIHJldHVybiBDUFVfQWxwaGE7Ci0jZWxpZiAgIGRlZmluZWQoX19NSVBTX18pCi0gICAgcmV0dXJuIENQVV9NaXBzOwotI2VsaWYgICBkZWZpbmVkKF9fUFBDX18pCi0gICAgcmV0dXJuIENQVV9Qb3dlclBDOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIEludGVsIE1NWCBleHRlbnNpb25zLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBNTVggaXMgYXZhaWxhYmxlLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyB0aGUgSW50ZWwgTU1YIGV4dGVuZGVkCi1pbnN0cnVjdGlvbiBzZXQuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclR5cGUsIENQVV9nZXRQcm9jZXNzb3JTcGVlZCwgQ1BVX2hhdmUzRE5vdywgQ1BVX2hhdmVTU0UsCi1DUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFpBUEkgQ1BVX2hhdmVNTVgodm9pZCkKLXsKLSNpZmRlZiAgX19JTlRFTF9fCi0gICAgaWYgKF9DUFVfaGF2ZUNQVUlEKCkpCi0JcmV0dXJuIChfQ1BVX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlTU1YKSAhPSAwOwotICAgIHJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIEFNRCAzRE5vdyEgZXh0ZW5zaW9ucy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLVRydWUgaWYgM0ROb3chIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIEFNRCAzRE5vdyEgZXh0ZW5kZWQKLWluc3RydWN0aW9uIHNldC4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZU1NWCwgQ1BVX2hhdmVTU0UsCi1DUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFpBUEkgQ1BVX2hhdmUzRE5vdyh2b2lkKQotewotI2lmZGVmICBfX0lOVEVMX18KLSAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkKLQlyZXR1cm4gX0NQVV9oYXZlM0ROb3coKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyBJbnRlbCBLTkkgZXh0ZW5zaW9ucy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLVRydWUgaWYgSW50ZWwgS05JIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIEludGVsIEtOSSBleHRlbmRlZAotaW5zdHJ1Y3Rpb24gc2V0LgotCi1TRUUgQUxTTzoKLUNQVV9nZXRQcm9jZXNzb3JUeXBlLCBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQsIENQVV9oYXZlTU1YLCBDUFVfaGF2ZTNETm93LAotQ1BVX2dldFByb2Nlc3Nvck5hbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBaQVBJIENQVV9oYXZlU1NFKHZvaWQpCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIGlmIChfQ1BVX2hhdmVDUFVJRCgpKQotCXJldHVybiAoX0NQVV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVNTRSkgIT0gMDsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVRydWUgaWYgdGhlIFJUU0MgaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyB0aGUgSW50ZWwgUkRUU0MKLWluc3RydWN0aW9uLCBmb3IgaGlnaCBwcmVjaXNpb24gdGltaW5nLiBJZiB0aGUgcHJvY2Vzc29yIGlzIG5vdCBhbiBJbnRlbCBvcgotSW50ZWwgY2xvbmUgQ1BVLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS4KLQotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyBSRFRTQyBleHRlbnNpb25zLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBSVFNDIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIFJEVFNDIGluc3RydWN0aW9uCi1mb3IgcmVhZGluZyB0aGUgcHJvY2Vzc29yIHRpbWUgc3RhbXAgY291bnRlci4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZU1NWCwgQ1BVX2hhdmUzRE5vdywKLUNQVV9nZXRQcm9jZXNzb3JOYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgWkFQSSBDUFVfaGF2ZVJEVFNDKHZvaWQpCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIGlmIChfQ1BVX2hhdmVDUFVJRCgpKQotCXJldHVybiAoX0NQVV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwOwotICAgIHJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi19Ci0KLSNpZmRlZiAgX19JTlRFTF9fCi0KLSNkZWZpbmUgSVRFUkFUSU9OUyAgICAgIDE2MDAwCi0jZGVmaW5lIFNBTVBMSU5HUyAgICAgICAyCi0jZGVmaW5lIElOTkVSX0xPT1BTICAgICA0MDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JZiBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aW1lIHN0YW1wIHJlYWRpbmcsIGJ1dCBpcyBhdCBsZWFzdCBhIDM4NiBvcgotYWJvdmUsIHV0aWxpemUgbWV0aG9kIG9mIHRpbWluZyBhIGxvb3Agb2YgQlNGIGluc3RydWN0aW9ucyB3aGljaCB0YWtlIGEKLWtub3duIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIG9uIGkzODYodG0pLCBpNDg2KHRtKSwgYW5kIFBlbnRpdW0oUikKLXByb2Nlc3NvcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIEdldEJTRkNwdVNwZWVkKAotICAgIHVsb25nIGN5Y2xlcykKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyIHQwLHQxLGNvdW50X2ZyZXE7Ci0gICAgdWxvbmcgICB0aWNrczsgICAgICAgICAgICAgIC8qIE1pY3Jvc2Vjb25kcyBlbGFwc2VkIGR1cmluZyB0ZXN0ICAgICAqLwotICAgIHVsb25nICAgY3VycmVudDsgICAgICAgICAgICAvKiBWYXJpYWJsZSB0byBzdG9yZSB0aW1lIGVsYXBzZWQgICAgICAgKi8KLSAgICBpbnQgICAgIGksaixpUHJpb3JpdHk7Ci0gICAgdWxvbmcgICBsb3dlc3QgID0gKHVsb25nKS0xOwotCi0gICAgaVByaW9yaXR5ID0gU2V0TWF4VGhyZWFkUHJpb3JpdHkoKTsKLSAgICBHZXRDb3VudGVyRnJlcXVlbmN5KCZjb3VudF9mcmVxKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgU0FNUExJTkdTOyBpKyspIHsKLQlHZXRDb3VudGVyKCZ0MCk7Ci0JZm9yIChqID0gMDsgaiA8IElOTkVSX0xPT1BTOyBqKyspCi0JICAgIF9DUFVfcnVuQlNGTG9vcChJVEVSQVRJT05TKTsKLQlHZXRDb3VudGVyKCZ0MSk7Ci0JY3VycmVudCA9IHQxLmxvdyAtIHQwLmxvdzsKLQlpZiAoY3VycmVudCA8IGxvd2VzdCkKLQkgICAgbG93ZXN0ID0gY3VycmVudDsKLQl9Ci0gICAgUmVzdG9yZVRocmVhZFByaW9yaXR5KGlQcmlvcml0eSk7Ci0KLSAgICAvKiBDb21wdXRlIGZyZXF1ZW5jeSAqLwotICAgIHRpY2tzID0gX0NQVV9tdWxEaXYobG93ZXN0LDEwMDAwMDAsY291bnRfZnJlcS5sb3cpOwotICAgIGlmICgodGlja3MgJSBjb3VudF9mcmVxLmxvdykgPiAoY291bnRfZnJlcS5sb3cvMikpCi0JdGlja3MrKzsgICAgICAgICAgICAvKiBSb3VuZCB1cCBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAodGlja3MgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gKChjeWNsZXMqSU5ORVJfTE9PUFMpL3RpY2tzKTsKLX0KLQotI2RlZmluZSBUT0xFUkFOQ0UgICAgICAgMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9uIHByb2Nlc3NvcnMgc3VwcG9ydGluZyB0aGUgUmVhZCBUaW1lIFN0YW1wIG9wY29kZSwgY29tcGFyZSBlbGFwc2VkCi10aW1lIG9uIHRoZSBIaWdoLVJlc29sdXRpb24gQ291bnRlciB3aXRoIGVsYXBzZWQgY3ljbGVzIG9uIHRoZSBUaW1lCi1TdGFtcCBSZWdpc3Rlci4KLQotVGhlIGlubmVyIGxvb3AgcnVucyB1cCB0byAyMCB0aW1lcyBvcnVudGlsIHRoZSBhdmVyYWdlIG9mIHRoZSBwcmV2aW91cwotdGhyZWUgY2FsY3VsYXRlZCBmcmVxdWVuY2llcyBpcyB3aXRoaW4gMSBNSHogb2YgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbAotY2FsY3VsYXRlZCBmcmVxdWVuY2llcy4gVGhpcyByZXNhbXBsaW5nIGluY3JlYXNlcyB0aGUgYWNjdXJhY3kgb2YgdGhlCi1yZXN1bHRzIHNpbmNlIG91dHNpZGUgZmFjdG9ycyBjb3VsZCBhZmZlY3QgdGhpcyBjYWxjdWxhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgR2V0UkRUU0NDcHVTcGVlZCgKLSAgICBpYm9vbCBhY2N1cmF0ZSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHQwLHQxLHMwLHMxLGNvdW50X2ZyZXE7Ci0gICAgdTY0ICAgICAgICAgICAgICAgICBzdGFtcDAsIHN0YW1wMSwgdGlja3MwLCB0aWNrczE7Ci0gICAgdTY0ICAgICAgICAgICAgICAgICB0b3RhbF9jeWNsZXMsIGN5Y2xlcywgaHosIGZyZXE7Ci0gICAgdTY0ICAgICAgICAgICAgICAgICB0b3RhbF90aWNrcywgdGlja3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICB0cmllcyxpUHJpb3JpdHk7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICBtYXhDb3VudDsKLQotICAgIFBNX3NldDY0XzMyKHRvdGFsX2N5Y2xlcywwKTsKLSAgICBQTV9zZXQ2NF8zMih0b3RhbF90aWNrcywwKTsKLSAgICBtYXhDb3VudCA9IGFjY3VyYXRlID8gNjAwMDAwIDogMzAwMDA7Ci0gICAgaVByaW9yaXR5ID0gU2V0TWF4VGhyZWFkUHJpb3JpdHkoKTsKLSAgICBHZXRDb3VudGVyRnJlcXVlbmN5KCZjb3VudF9mcmVxKTsKLSAgICBQTV9zZXQ2NChmcmVxLGNvdW50X2ZyZXEuaGlnaCxjb3VudF9mcmVxLmxvdyk7Ci0gICAgZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMzsgdHJpZXMrKykgewotCS8qIExvb3AgdW50aWwgMTAwIHRpY2tzIGhhdmUgcGFzc2VkIHNpbmNlIGxhc3QgcmVhZCBvZiBoaS1yZXMKLQkgKiBjb3VudGVyLiBUaGlzIGFjY291bnRzIGZvciBvdmVyaGVhZCBsYXRlci4KLQkgKi8KLQlHZXRDb3VudGVyKCZ0MCk7Ci0JdDEubG93ID0gdDAubG93OwotCXQxLmhpZ2ggPSB0MC5oaWdoOwotCXdoaWxlICgodDEubG93IC0gdDAubG93KSA8IDEwMCkgewotCSAgICBHZXRDb3VudGVyKCZ0MSk7Ci0JICAgIF9DUFVfcmVhZFRpbWVTdGFtcCgmczApOwotCSAgICB9Ci0KLQkvKiBMb29wIHVudGlsIDMwMDAwIHRpY2tzIGhhdmUgcGFzc2VkIHNpbmNlIGxhc3QgcmVhZCBvZiBoaS1yZXMgY291bnRlci4KLQkgKiBUaGlzIGFsbG93cyBmb3IgZWxhcHNlZCB0aW1lIGZvciBzYW1wbGluZy4gRm9yIGEgaGktcmVzIGZyZXF1ZW5jeQotCSAqIG9mIDFNSHosIHRoaXMgaXMgYWJvdXQgMC4wMyBvZiBhIHNlY29uZC4gVGhlIGZyZXF1ZW5jeSByZXBvcnRlZAotCSAqIGJ5IHRoZSBPUyBkZXBlbmRlbnQgY29kZSBzaG91bGQgYmUgdHVuZWQgdG8gcHJvdmlkZSBhIGdvb2QKLQkgKiBzYW1wbGUgcGVyaW9kIGRlcGVuZGluZyBvbiB0aGUgYWNjdXJhY3kgb2YgdGhlIE9TIHRpbWVycyAoaWU6Ci0JICogaWYgdGhlIGFjY3VyYWN5IGlzIGxvd2VyLCBsb3dlciB0aGUgZnJlcXVlbmN5IHRvIHNwZW5kIG1vcmUgdGltZQotCSAqIGluIHRoZSBpbm5lciBsb29wIHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kpLgotCSAqLwotCXQwLmxvdyA9IHQxLmxvdzsKLQl0MC5oaWdoID0gdDEuaGlnaDsKLQl3aGlsZSAoKHQxLmxvdyAtIHQwLmxvdykgPCBtYXhDb3VudCkgewotCSAgICBHZXRDb3VudGVyKCZ0MSk7Ci0JICAgIF9DUFVfcmVhZFRpbWVTdGFtcCgmczEpOwotCSAgICB9Ci0KLQkvKiBGaW5kIHRoZSBkaWZmZXJlbmNlIGR1cmluZyB0aGUgdGltaW5nIGxvb3AgKi8KLQlQTV9zZXQ2NChzdGFtcDAsczAuaGlnaCxzMC5sb3cpOwotCVBNX3NldDY0KHN0YW1wMSxzMS5oaWdoLHMxLmxvdyk7Ci0JUE1fc2V0NjQodGlja3MwLHQwLmhpZ2gsdDAubG93KTsKLQlQTV9zZXQ2NCh0aWNrczEsdDEuaGlnaCx0MS5sb3cpOwotCVBNX3N1YjY0KGN5Y2xlcyxzdGFtcDEsc3RhbXAwKTsKLQlQTV9zdWI2NCh0aWNrcyx0aWNrczEsdGlja3MwKTsKLQotCS8qIFN1bSB1cCB0aGUgcmVzdWx0cyAqLwotCVBNX2FkZDY0KHRvdGFsX3RpY2tzLHRvdGFsX3RpY2tzLHRpY2tzKTsKLQlQTV9hZGQ2NCh0b3RhbF9jeWNsZXMsdG90YWxfY3ljbGVzLGN5Y2xlcyk7Ci0JfQotICAgIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpUHJpb3JpdHkpOwotCi0gICAgLyogQ29tcHV0ZSBmcmVxdWVuY3kgaW4gSHogKi8KLSAgICBQTV9tdWw2NChoeix0b3RhbF9jeWNsZXMsZnJlcSk7Ci0gICAgUE1fZGl2NjQoaHosaHosdG90YWxfdGlja3MpOwotICAgIHJldHVybiBQTV82NHRvMzIoaHopOwotfQotCi0jZW5kaWYgIC8qIF9fSU5URUxfXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBzcGVlZCBvZiB0aGUgcHJvY2Vzc29yIGluIE1Iei4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUEFSQU1FVEVSUzoKLWFjY3VyYXRlICAgIC0gVHJ1ZSBvZiB0aGUgc3BlZWQgc2hvdWxkIGJlIG1lYXN1cmVkIGFjY3VyYXRlbHkKLQotUkVUVVJOUzoKLVByb2Nlc3NvciBzcGVlZCBpbiBNSHouCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNwZWVkIG9mIHRoZSBDUFUgaW4gTUh6LiBOb3RlIHRoYXQgaWYgdGhlIHNwZWVkCi1jYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwLgotCi1JZiB0aGUgYWNjdXJhdGUgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3BlbmQgbG9uZ2VyCi1wcm9maWxpbmcgdGhlIHNwZWVkIG9mIHRoZSBDUFUsIGFuZCB3aWxsIG5vdCByb3VuZCB0aGUgQ1BVIHNwZWVkIHRoYXQgaXMKLXJlcG9ydGVkLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaGlnaGx5IGFjY3VyYXRlIHRpbWluZyB1c2luZyB0aGUgUGVudGl1bQotUkRUU0MgaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBkb2VzIHRha2UgYSBsb3QgbG9uZ2VyIGZvciB0aGUgcHJvZmlsaW5nIHRvCi1wcm9kdWNlIGFjY3VyYXRlIHJlc3VsdHMuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclNwZWVkSW5IeiwgQ1BVX2dldFByb2Nlc3NvclR5cGUsIENQVV9oYXZlTU1YLAotQ1BVX2dldFByb2Nlc3Nvck5hbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIENQVV9nZXRQcm9jZXNzb3JTcGVlZCgKLSAgICBpYm9vbCBhY2N1cmF0ZSkKLXsKLSNpZiBkZWZpbmVkKF9fSU5URUxfXykKLSAgICAvKiBOdW1iZXIgb2YgY3ljbGVzIG5lZWRlZCB0byBleGVjdXRlIGEgc2luZ2xlIEJTRiBpbnN0cnVjdGlvbiBvbiBpMzg2KwotICAgICAqIHByb2Nlc3NvcnMuCi0gICAgICovCi0gICAgdWxvbmcgICBjcHVTcGVlZDsKLSAgICB1aW50ICAgIGk7Ci0gICAgc3RhdGljICB1bG9uZyBpbnRlbF9jeWNsZXNbXSA9IHsKLQkxMTUsNDcsNDMsCi0JfTsKLSAgICBzdGF0aWMgIHVsb25nIGN5cml4X2N5Y2xlc1tdID0gewotCTM4LDM4LDUyLDUyLAotCX07Ci0gICAgc3RhdGljICB1bG9uZyBhbWRfY3ljbGVzW10gPSB7Ci0JNDksCi0JfTsKLSAgICBzdGF0aWMgIHVsb25nIGtub3duX3NwZWVkc1tdID0gewotCTEwMDAsOTUwLDkwMCw4NTAsODAwLDc1MCw3MDAsNjUwLDYwMCw1NTAsNTAwLDQ1MCw0MzMsNDAwLDM1MCwKLQkzMzMsMzAwLDI2NiwyMzMsMjAwLDE2NiwxNTAsMTMzLDEyMCwxMDAsOTAsNzUsNjYsNjAsNTAsMzMsMjAsMCwKLQl9OwotCi0gICAgaWYgKENQVV9oYXZlUkRUU0MoKSkgewotCWNwdVNwZWVkID0gKEdldFJEVFNDQ3B1U3BlZWQoYWNjdXJhdGUpICsgNTAwMDAwKSAvIDEwMDAwMDA7Ci0JfQotICAgIGVsc2UgewotCWludCB0eXBlID0gQ1BVX2dldFByb2Nlc3NvclR5cGUoKTsKLQlpbnQgcHJvY2Vzc29yID0gdHlwZSAmIENQVV9tYXNrOwotCWludCB2ZW5kb3IgPSB0eXBlICYgQ1BVX2ZhbWlseU1hc2s7Ci0JaWYgKHZlbmRvciA9PSBDUFVfSW50ZWwpCi0JICAgIGNwdVNwZWVkID0gR2V0QlNGQ3B1U3BlZWQoSVRFUkFUSU9OUyAqIGludGVsX2N5Y2xlc1twcm9jZXNzb3IgLSBDUFVfaTM4Nl0pOwotCWVsc2UgaWYgKHZlbmRvciA9PSBDUFVfQ3lyaXgpCi0JICAgIGNwdVNwZWVkID0gR2V0QlNGQ3B1U3BlZWQoSVRFUkFUSU9OUyAqIGN5cml4X2N5Y2xlc1twcm9jZXNzb3IgLSBDUFVfQ3lyaXg2eDg2XSk7Ci0JZWxzZSBpZiAodmVuZG9yID09IENQVV9BTUQpCi0JICAgIGNwdVNwZWVkID0gR2V0QlNGQ3B1U3BlZWQoSVRFUkFUSU9OUyAqIGFtZF9jeWNsZXNbMF0pOwotCWVsc2UKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0gICAgLyogTm93IG5vcm1hbGlzZSB0aGUgcmVzdWx0cyBnaXZlbiBrbm93biBwcm9jZXNzb3JzIHNwZWVkcywgaWYgdGhlCi0gICAgICogc3BlZWQgd2UgbWVhc3VyZSBpcyB3aXRoaW4gMk1IeiBvZiB0aGUgZXhwZWN0ZWQgdmFsdWVzCi0gICAgICovCi0gICAgaWYgKCFhY2N1cmF0ZSkgewotCWZvciAoaSA9IDA7IGtub3duX3NwZWVkc1tpXSAhPSAwOyBpKyspIHsKLQkgICAgaWYgKGNwdVNwZWVkID49IChrbm93bl9zcGVlZHNbaV0tMykgJiYgY3B1U3BlZWQgPD0gKGtub3duX3NwZWVkc1tpXSszKSkgewotCQlyZXR1cm4ga25vd25fc3BlZWRzW2ldOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGNwdVNwZWVkOwotI2Vsc2UKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBzcGVlZCBvZiB0aGUgcHJvY2Vzc29yIGluIEh6LgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotQWNjdXJhdGUgcHJvY2Vzc29yIHNwZWVkIGluIEh6LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhY2N1cmF0ZSBzcGVlZCBvZiB0aGUgQ1BVIGluIEh6LiBOb3RlIHRoYXQgaWYgdGhlCi1zcGVlZCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwLgotCi1UaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIENQVV9nZXRQcm9jZXNzb3JTcGVlZCBmdW5jdGlvbiwgZXhjZXB0IHRoYXQKLWl0IGF0dGVtcHRzIHRvIGFjY3VyYXRlbHkgbWVhc3VyZSB0aGUgQ1BVIHNwZWVkIGluIEh6LiBUaGlzIGlzIHVzZWQKLWludGVybmFsbHkgaW4gdGhlIFplbiBUaW1lciBsaWJyYXJpZXMgdG8gcHJvdmlkZSBhY2N1cmF0ZSByZWFsIHdvcmxkIHRpbWluZwotaW5mb3JtYXRpb24uIFRoaXMgaXMgaW1wb3J0YW50IGZvciBoaWdobHkgYWNjdXJhdGUgdGltaW5nIHVzaW5nIHRoZSBQZW50aXVtCi1SRFRTQyBpbnN0cnVjdGlvbiwgYnV0IGl0IGRvZXMgdGFrZSBhIGxvdCBsb25nZXIgZm9yIHRoZSBwcm9maWxpbmcgdG8KLXByb2R1Y2UgYWNjdXJhdGUgcmVzdWx0cy4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yU3BlZWQsIENQVV9nZXRQcm9jZXNzb3JUeXBlLCBDUFVfaGF2ZU1NWCwKLUNQVV9nZXRQcm9jZXNzb3JOYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBDUFVfZ2V0UHJvY2Vzc29yU3BlZWRJbkhaKAotICAgIGlib29sIGFjY3VyYXRlKQotewotI2lmIGRlZmluZWQoX19JTlRFTF9fKQotICAgIGlmIChDUFVfaGF2ZVJEVFNDKCkpIHsKLQlyZXR1cm4gR2V0UkRUU0NDcHVTcGVlZChhY2N1cmF0ZSk7Ci0JfQotICAgIHJldHVybiBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQoZmFsc2UpICogMTAwMDAwMDsKLSNlbHNlCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyBhIHN0cmluZyBkZWZpbmluZyB0aGUgc3BlZWQgYW5kIG5hbWUgb2YgdGhlIHByb2Nlc3Nvci4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLVByb2Nlc3NvciBuYW1lIHN0cmluZy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBFbmdsaXNoIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVlZCBhbmQgbmFtZSBvZiB0aGUKLUNQVS4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2hhdmVNTVgsIENQVV9nZXRQcm9jZXNzb3JOYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqIFpBUEkgQ1BVX2dldFByb2Nlc3Nvck5hbWUodm9pZCkKLXsKLSNpZiBkZWZpbmVkKF9fSU5URUxfXykKLSAgICBzdGF0aWMgaW50ICBjcHUsc3BlZWQgPSAtMTsKLSAgICBzdGF0aWMgY2hhciBuYW1lWzgwXTsKLQotICAgIGlmIChzcGVlZCA9PSAtMSkgewotCWNwdSA9IENQVV9nZXRQcm9jZXNzb3JUeXBlKCk7Ci0Jc3BlZWQgPSBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQoZmFsc2UpOwotCX0KLSAgICBzcHJpbnRmKG5hbWUsIiVkIE1IeiAiLCBzcGVlZCk7Ci0gICAgc3dpdGNoIChjcHUgJiBDUFVfbWFzaykgewotCWNhc2UgQ1BVX2kzODY6Ci0JICAgIHN0cmNhdChuYW1lLCJJbnRlbCBpMzg2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9pNDg2OgotCSAgICBzdHJjYXQobmFtZSwiSW50ZWwgaTQ4NiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfUGVudGl1bToKLQkgICAgc3RyY2F0KG5hbWUsIkludGVsIFBlbnRpdW0gcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1BlbnRpdW1Qcm86Ci0JICAgIHN0cmNhdChuYW1lLCJJbnRlbCBQZW50aXVtIFBybyBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfUGVudGl1bUlJOgotCSAgICBzdHJjYXQobmFtZSwiSW50ZWwgUGVudGl1bSBJSSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQ2VsZXJvbjoKLQkgICAgc3RyY2F0KG5hbWUsIkludGVsIENlbGVyb24gcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1BlbnRpdW1JSUk6Ci0JICAgIHN0cmNhdChuYW1lLCJJbnRlbCBQZW50aXVtIElJSSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfVW5rSW50ZWw6Ci0JICAgIHN0cmNhdChuYW1lLCJVbmtub3duIEludGVsIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9DeXJpeDZ4ODY6Ci0JICAgIHN0cmNhdChuYW1lLCJDeXJpeCA2eDg2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9DeXJpeDZ4ODZNWDoKLQkgICAgc3RyY2F0KG5hbWUsIkN5cml4IDZ4ODZNWCBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQ3lyaXhNZWRpYUdYOgotCSAgICBzdHJjYXQobmFtZSwiQ3lyaXggTWVkaWFHWCBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQ3lyaXhNZWRpYUdYbToKLQkgICAgc3RyY2F0KG5hbWUsIkN5cml4IE1lZGlhR1htIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9VbmtDeXJpeDoKLQkgICAgc3RyY2F0KG5hbWUsIlVua25vd24gQ3lyaXggcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREFtNDg2OgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEFtNDg2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTURBbTV4ODY6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgQW01eDg2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTURLNToKLQkgICAgc3RyY2F0KG5hbWUsIkFNRCBLNSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQU1ESzY6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzYgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREs2XzI6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzYtMiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQU1ESzZfSUlJOgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEs2LUlJSSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQU1ESzZfMnBsdXM6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzYtMisgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREs2X0lJSXBsdXM6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzYtSUlJKyBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfVW5rQU1EOgotCSAgICBzdHJjYXQobmFtZSwiVW5rbm93biBBTUQgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREF0aGxvbjoKLQkgICAgc3RyY2F0KG5hbWUsIkFNRCBBdGhsb24gcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNRER1cm9uOgotCSAgICBzdHJjYXQobmFtZSwiQU1EIER1cm9uIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9XaW5DaGlwQzY6Ci0JICAgIHN0cmNhdChuYW1lLCJJRFQgV2luQ2hpcCBDNiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfV2luQ2hpcDI6Ci0JICAgIHN0cmNhdChuYW1lLCJJRFQgV2luQ2hpcCAyIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9VbmtJRFQ6Ci0JICAgIHN0cmNhdChuYW1lLCJVbmtub3duIElEVCBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgc3RyY2F0KG5hbWUsIlVua25vd24gcHJvY2Vzc29yIik7Ci0JfQotICAgIGlmIChDUFVfaGF2ZU1NWCgpKQotCXN0cmNhdChuYW1lLCIgd2l0aCBNTVgoUikiKTsKLSAgICBpZiAoQ1BVX2hhdmUzRE5vdygpKQotCXN0cmNhdChuYW1lLCIsIDNETm93IShSKSIpOwotICAgIGlmIChDUFVfaGF2ZVNTRSgpKQotCXN0cmNhdChuYW1lLCIsIFNTRShSKSIpOwotICAgIHJldHVybiBuYW1lOwotI2Vsc2UKLSAgICByZXR1cm4gIlVua25vd24iOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kZWJ1Zy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYmYwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1haW4gbW9kdWxlIGNvbnRhaW5pbmcgZGVidWcgY2hlY2tpbmcgZmVhdHVyZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpZmRlZiAgX19XSU4zMl9WWERfXwotI2luY2x1ZGUgInZ4ZGZpbGUuaCIKLSNlbGlmIGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJudGRyaXZlci5oIgotI2VsaWYgZGVmaW5lZChfX09TMl9WRERfXykKLSNpbmNsdWRlICJ2ZGRmaWxlLmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoge3NlY3JldH0gKi8KLXZvaWQgKCpfQ0hLX2ZhaWwpKGludCBmYXRhbCxjb25zdCBjaGFyICptc2csY29uc3QgY2hhciAqY29uZCxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKSA9IF9DSEtfZGVmYXVsdEZhaWw7Ci1zdGF0aWMgY2hhciBsb2dGaWxlWzI1Nl0gPSAiIjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBDSEVDS0VECi12b2lkIF9DSEtfZGVmYXVsdEZhaWwoCi0gICAgaW50IGZhdGFsLAotICAgIGNvbnN0IGNoYXIgKm1zZywKLSAgICBjb25zdCBjaGFyICpjb25kLAotICAgIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgaW50IGxpbmUpCi17Ci0gICAgRklMRSAgICAqZjsKLSAgICBjaGFyICAgIGJ1ZlsyNTZdOwotCi0gICAgaWYgKGxvZ0ZpbGVbMF0gPT0gMCkgewotCXN0cmNweShsb2dGaWxlLFBNX2dldE51Y2xldXNQYXRoKCkpOwotCVBNX2JhY2tzbGFzaChsb2dGaWxlKTsKLQlzdHJjYXQobG9nRmlsZSwic2NpdGVjaC5sb2ciKTsKLQl9Ci0gICAgaWYgKChmID0gZm9wZW4obG9nRmlsZSwiYSsiKSkgIT0gTlVMTCkgewotI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX09TMl9WRERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotCXNwcmludGYoYnVmLG1zZyxjb25kLGZpbGUsbGluZSk7Ci0JZndyaXRlKGJ1ZiwxLHN0cmxlbihidWYpLGYpOwotI2Vsc2UKLQlmcHJpbnRmKGYsbXNnLGNvbmQsZmlsZSxsaW5lKTsKLSNlbmRpZgotCWZjbG9zZShmKTsKLQl9Ci0gICAgaWYgKGZhdGFsKSB7Ci0Jc3ByaW50ZihidWYsIkNoZWNrIGZhaWxlZDogY2hlY2sgJyVzJyBmb3IgZGV0YWlscyIsIGxvZ0ZpbGUpOwotCVBNX2ZhdGFsRXJyb3IoYnVmKTsKLQl9Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGRlYnVnIGxvZyBmaWxlLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1sb2dGaWxlUGF0aCAtIEZ1bGwgZmlsZSBhbmQgcGF0aCBuYW1lIHRvIGRlYnVnIGxvZyBmaWxlLgotCi1SRU1BUktTOgotU2V0cyB0aGUgbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGRlYnVnIGxvZyBmaWxlLiBUaGUgZGVidWcgbG9nIGZpbGUgaXMKLWNyZWF0ZWQgYW5kIHdyaXR0ZW4gdG8gd2hlbiBydW50aW1lIGNoZWNrcywgd2FybmluZ3MgYW5kIGZhaWx1cmUgY29uZGl0aW9ucwotYXJlIGxvZ2dlZCB0byBkaXNrIHdoZW4gY29kZSBpcyBjb21waWxlZCBpbiBDSEVDS0VEIG1vZGUuIEJ5IGRlZmF1bHQgdGhlCi1sb2cgZmlsZSBpcyBjYWxsZWQgJ3NjaXRlY2gubG9nJyBhbmQgZ29lcyBpbnRvIHRoZSBjdXJyZW50IFNjaVRlY2ggTnVjbGV1cwotcGF0aCBmb3IgdGhlIGFwcGxpY2F0aW9uLiBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZW5hbWUKLWFuZCBsb2NhdGlvbiBvZiB0aGUgZGVidWcgbG9nIGZpbGUgdG8geW91ciBvd24gYXBwbGljYXRpb24gc3BlY2lmaWMKLWRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldERlYnVnTG9nKAotICAgIGNvbnN0IGNoYXIgKmxvZ0ZpbGVQYXRoKQotewotICAgIHN0cmNweShsb2dGaWxlLGxvZ0ZpbGVQYXRoKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fZXZlbnQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19ldmVudC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGNhYWIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19ldmVudC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlcgotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAoTVMgRE9TKQotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJseSBsYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgZXZlbnQgbW9kdWxlLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgaWRlYWwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaWZkZWYgZmxhdG1vZGVsCi0KLWhlYWRlciAgX2V2ZW50ICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9ldmVudAotCi0gICAgY2V4dGVybiAgX0VWVF9iaW9zUHRyLERQVFIKLQotaWZkZWYgICBVU0VfTkFTTQotJWRlZmluZSBLQl9IRUFEICAgICBXT1JEIGVzaSswMUFoICAgOyBLZXlib2FyZCBidWZmZXIgaGVhZCBpbiBCSU9TIGRhdGEgYXJlYQotJWRlZmluZSBLQl9UQUlMICAgICBXT1JEIGVzaSswMUNoICAgOyBLZXlib2FyZCBidWZmZXIgdGFpbCBpbiBCSU9TIGRhdGEgYXJlYQotJWRlZmluZSBLQl9TVEFSVCAgICBXT1JEIGVzaSswODBoICAgOyBTdGFydCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLSVkZWZpbmUgS0JfRU5EICAgICAgV09SRCBlc2krMDgyaCAgIDsgRW5kIG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQotZWxzZQotS0JfSEVBRCAgICAgRVFVIFdPUkQgZXNpKzAxQWggICAgICAgOyBLZXlib2FyZCBidWZmZXIgaGVhZCBpbiBCSU9TIGRhdGEgYXJlYQotS0JfVEFJTCAgICAgRVFVIFdPUkQgZXNpKzAxQ2ggICAgICAgOyBLZXlib2FyZCBidWZmZXIgdGFpbCBpbiBCSU9TIGRhdGEgYXJlYQotS0JfU1RBUlQgICAgRVFVIFdPUkQgZXNpKzA4MGggICAgICAgOyBTdGFydCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLUtCX0VORCAgICAgIEVRVSBXT1JEIGVzaSswODJoICAgICAgIDsgRW5kIG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQotZW5kaWYKLQotZW5kZGF0YXNlZyAgX2V2ZW50Ci0KLWJlZ2NvZGVzZWcgIF9ldmVudCAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotICAgIGNwdWJsaWMgX0VWVF9jb2RlU3RhcnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IF9FVlRfZ2V0S2V5Q29kZSh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUga2V5IGNvZGUgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBrZXkgYnkgZXh0cmFjdGluZyBpdCBmcm9tCi07IHRoZSBCSU9TIGtleWJvYXJkIGJ1ZmZlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX2dldEtleUNvZGUKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBlc2ksW19FVlRfYmlvc1B0cl0KLSAgICAgICAgeG9yICAgICBlYngsZWJ4Ci0gICAgICAgIHhvciAgICAgZWF4LGVheAotICAgICAgICBtb3YgICAgIGJ4LFtLQl9IRUFEXQotICAgICAgICBjbXAgICAgIGJ4LFtLQl9UQUlMXQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgbW92ICAgICBheCxbZXNpK2VieF0gICAgOyBFQVggOj0gY2hhcmFjdGVyIGZyb20ga2V5Ym9hcmQgYnVmZmVyCi0gICAgICAgIGluYyAgICAgX2J4Ci0gICAgICAgIGluYyAgICAgX2J4Ci0gICAgICAgIGNtcCAgICAgYngsW0tCX0VORF0gICAgIDsgSGl0IHRoZSBlbmQgb2YgdGhlIGtleWJvYXJkIGJ1ZmZlcj8KLSAgICAgICAgamwgICAgICBAQDEKLSAgICAgICAgbW92ICAgICBieCxbS0JfU1RBUlRdCi1AQDE6ICAgIG1vdiAgICAgW0tCX0hFQURdLGJ4ICAgIDsgVXBkYXRlIGtleWJvYXJkIGJ1ZmZlciBoZWFkIHBvaW50ZXIKLQotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGlzIGZ1bmN0aW9uIHdvdWxkIG5vcm1hbGx5IGRvIG5vdGhpbmcsIGhvd2V2ZXIgZHVlIHRvIHN0cmFuZ2UgYnVncwotOyBpbiB0aGUgV2luZG93cyAzLjEgYW5kIE9TLzIgRE9TIGJveGVzLCB3ZSBkb24ndCBnZXQgYW55IGhhcmR3YXJlIGtleWJvYXJkCi07IGludGVycnVwdHMgdW5sZXNzIHdlIHBlcmlvZGljYWxseSBjYWxsIHRoZSBCSU9TIGtleWJvYXJkIGZ1bmN0aW9ucy4gSGVuY2UKLTsgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHRoYXQgd2UgY2hlY2sgZm9yIGV2ZW50cywgYW5kIHdvcmtzCi07IGFyb3VuZCB0aGlzIHByb2JsZW0gKGluIGVzc2VuY2UgaXQgdGVsbHMgdGhlIERPUyBWRE0gdG8gcHVtcCB0aGUKLTsga2V5Ym9hcmQgZXZlbnRzIHRvIG91ciBwcm9ncmFtIDstKS4KLTsKLTsgTm90ZSB0aGF0IHRoaXMgYnVnIGlzIG5vdCBwcmVzZW50IHVuZGVyIFdpbiA5eCBET1MgYm94ZXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9wdW1wTWVzc2FnZXMKLQotICAgICAgICBtb3YgICAgIGFoLDExaCAgICAgICAgICA7IEZ1bmN0aW9uIC0gQ2hlY2sga2V5Ym9hcmQgc3RhdHVzCi0gICAgICAgIGludCAgICAgMTZoICAgICAgICAgICAgIDsgQ2FsbCBCSU9TCi0gICAgICAgIAotICAgICAgICBtb3YgICAgIGF4LCAwQmggICAgICAgICA7IFJlc2V0IE1vdmUgTW91c2UKLSAgICAgICAgaW50ICAgICAzM2gKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfRVZUX2Rpc2FibGVJbnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX2Rpc2FibGVJbnQKLQotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFB1dCBmbGFnIHdvcmQgb24gc3RhY2sKLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBEaXNhYmxlIGludGVycnVwdHMhCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgZGVwb3NpdCBmbGFnIHdvcmQgaW4gcmV0dXJuIHJlZ2lzdGVyCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9FVlRfcmVzdG9yZUludChpbnQgcHMpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVzdG9yZSBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX3Jlc3RvcmVJbnQKLQotICAgICAgICBBUkcgICAgIHBzOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AgICAgICAgICA7IFNldCB1cCBzdGFjayBmcmFtZQotICAgICAgICBwdXNoICAgIFtEV09SRCBwc10KLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHByb2Nlc3NvciBzdGF0dXMgKGFuZCBpbnRlcnJ1cHRzKQotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IEVWVF9yZGlueChpbnQgcG9ydCxpbnQgaW5kZXgpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyBhbiBpbmRleGVkIHJlZ2lzdGVyIHZhbHVlIGZyb20gYW4gSS9PIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgRVZUX3JkaW54Ci0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIGluZGV4OlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlZHgsW3BvcnRdCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgaW5jICAgICBkeAotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIG1vdnp4ICAgZWF4LGFsCi0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIEVWVF93cmlueChpbnQgcG9ydCxpbnQgaW5kZXgsaW50IHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGVzIGFuIGluZGV4ZWQgcmVnaXN0ZXIgdmFsdWUgdG8gYW4gSS9PIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgRVZUX3dyaW54Ci0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIGluZGV4OlVJTlQsIHZhbHVlOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlZHgsW3BvcnRdCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG1vdiAgICAgYWgsW0JZVEUgdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsYXgKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLSAgICBjcHVibGljIF9FVlRfY29kZUVuZAotCi1lbmRjb2Rlc2VnICBfZXZlbnQKLQotZW5kaWYKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX2x6dGltZXIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19senRpbWVyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhOWM3OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX2x6dGltZXIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIE5BU00gb3IgVEFTTSBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBJQk0gUEMgKE1TIERPUykKLTsqCi07KiBEZXNjcmlwdGlvbjogVXNlcyB0aGUgODI1MyB0aW1lciBhbmQgdGhlIEJJT1MgdGltZS1vZi1kYXkgY291bnQgdG8gdGltZQotOyogICAgICAgICAgICAgIHRoZSBwZXJmb3JtYW5jZSBvZiBjb2RlIHRoYXQgdGFrZXMgbGVzcyB0aGFuIGFuIGhvdXIgdG8KLTsqICAgICAgICAgICAgICBleGVjdXRlLgotOyoKLTsqICAgICAgICAgICAgICBUaGUgcm91dGluZXMgaW4gdGhpcyBwYWNrYWdlIG9ubHkgd29ya3Mgd2l0aCBpbnRlcnJ1cHRzCi07KiAgICAgICAgICAgICAgZW5hYmxlZCwgYW5kIGluIGZhY3Qgd2lsbCBleHBsaWNpdGx5IHR1cm4gaW50ZXJydXB0cyBvbgotOyogICAgICAgICAgICAgIGluIG9yZGVyIHRvIGVuc3VyZSB3ZSBnZXQgYWNjdXJhdGUgcmVzdWx0cyBmcm9tIHRoZSB0aW1lci4KLTsqCi07KiAgRXh0ZXJuYWxseSAnQycgY2FsbGFibGUgcm91dGluZXM6Ci07KgotOyogIExaX3RpbWVyT246ICAgICBTYXZlcyB0aGUgQklPUyB0aW1lIG9mIGRheSBjb3VudCBhbmQgc3RhcnRzIHRoZQotOyogICAgICAgICAgICAgICAgICBsb25nIHBlcmlvZCBaZW4gVGltZXIuCi07KgotOyogIExaX3RpbWVyTGFwOiAgICBMYXRjaGVzIHRoZSBjdXJyZW50IGNvdW50LCBhbmQga2VlcHMgdGhlIHRpbWVyIHJ1bm5pbmcKLTsqCi07KiAgTFpfdGltZXJPZmY6ICAgIFN0b3BzIHRoZSBsb25nLXBlcmlvZCBaZW4gVGltZXIgYW5kIHNhdmVzIHRoZSB0aW1lcgotOyogICAgICAgICAgICAgICAgICBjb3VudCBhbmQgdGhlIEJJT1MgdGltZSBvZiBkYXkgY291bnQuCi07KgotOyogIExaX3RpbWVyQ291bnQ6ICBSZXR1cm5zIGFuIHVuc2lnbmVkIGxvbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lZCBjb3VudAotOyogICAgICAgICAgICAgICAgICBpbiBtaWNyb3NlY29uZHMuIElmIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlZCBkdXJpbmcKLTsqICAgICAgICAgICAgICAgICAgdGhlIHRpbWluZyBpbnRlcnZhbCwgTFpfdGltZXJDb3VudCB3aWxsIHJldHVybiB0aGUKLTsqICAgICAgICAgICAgICAgICAgdmFsdWUgMHhGRkZGRkZGRiAoYW4gaW52YWxpZCBjb3VudCkuCi07KgotOyogIE5vdGU6ICAgSWYgZWl0aGVyIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlcyBiZXR3ZWVuIGNhbGxzIHRvIExaX3RpbWVyT24KLTsqICAgICAgICAgIGFuZCBMWl90aW1lck9mZiwgYW4gZXJyb3IgaXMgcmVwb3J0ZWQuIEZvciB0aW1pbmcgY29kZSB0aGF0IHRha2VzCi07KiAgICAgICAgICBtb3JlIHRoYW4gYSBmZXcgbWludXRlcyB0byBleGVjdXRlLCB1c2UgdGhlIGxvdyByZXNvbHV0aW9uCi07KiAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY29kZSwgd2hpY2ggc2hvdWxkIGJlIGFjY3VyYXRlCi07KiAgICAgICAgICBlbm91Z2ggZm9yIG1vc3QgcHVycG9zZXMuCi07KgotOyogIE5vdGU6ICAgRWFjaCBibG9jayBvZiBjb2RlIGJlaW5nIHRpbWVkIHNob3VsZCBpZGVhbGx5IGJlIHJ1biBzZXZlcmFsCi07KiAgICAgICAgICB0aW1lcywgd2l0aCBhdCBsZWFzdCB0d28gc2ltaWxhciByZWFkaW5ncyByZXF1aXJlZCB0bwotOyogICAgICAgICAgZXN0YWJsaXNoIGEgdHJ1ZSBtZWFzdXJlbWVudCwgaW4gb3JkZXIgdG8gZWxpbWluYXRlIGFueQotOyogICAgICAgICAgdmFyaWFiaWxpdHkgY2F1c2VkIGJ5IGludGVycnVwdHMuCi07KgotOyogIE5vdGU6ICAgSW50ZXJydXB0cyBtdXN0IG5vdCBiZSBkaXNhYmxlZCBmb3IgbW9yZSB0aGFuIDU0IG1zIGF0IGEKLTsqICAgICAgICAgIHN0cmV0Y2ggZHVyaW5nIHRoZSB0aW1pbmcgaW50ZXJ2YWwuIEJlY2F1c2UgaW50ZXJydXB0cyBhcmUKLTsqICAgICAgICAgIGVuYWJsZWQsIGtleSwgbWljZSwgYW5kIG90aGVyIGRldmljZXMgdGhhdCBnZW5lcmF0ZSBpbnRlcnJ1cHRzCi07KiAgICAgICAgICBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nIHRoZSB0aW1pbmcgaW50ZXJ2YWwuCi07KgotOyogIE5vdGU6ICAgQW55IGV4dHJhIGNvZGUgcnVubmluZyBvZmYgdGhlIHRpbWVyIGludGVycnVwdCAoc3VjaCBhcwotOyogICAgICAgICAgc29tZSBtZW1vcnkgcmVzaWRlbnQgdXRpbGl0aWVzKSB3aWxsIGluY3JlYXNlIHRoZSB0aW1lCi07KiAgICAgICAgICBtZWFzdXJlZCBieSB0aGUgWmVuIFRpbWVyLgotOyoKLTsqICBOb3RlOiAgIFRoZXNlIHJvdXRpbmVzIGNhbiBpbnRyb2R1Y2UgaW5hY2N1cmFjaWVzIG9mIHVwIHRvIGEgZmV3Ci07KiAgICAgICAgICB0ZW50aHMgb2YgYSBzZWNvbmQgaW50byB0aGUgc3lzdGVtIGNsb2NrIGNvdW50IGZvciBlYWNoCi07KiAgICAgICAgICBjb2RlIHNlY3Rpb24gYmVpbmcgdGltZWQuIENvbnNlcXVlbnRseSwgaXQncyBhIGdvb2QgaWRlYSB0bwotOyogICAgICAgICAgcmVib290IGF0IHRoZSBjb25jbHVzaW9uIG9mIHRpbWluZyBzZXNzaW9ucy4gKFRoZQotOyogICAgICAgICAgYmF0dGVyeS1iYWNrZWQgY2xvY2ssIGlmIGFueSwgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBaZW4KLTsqICAgICAgICAgIHRpbWVyLikKLTsqCi07KiAgQWxsIHJlZ2lzdGVycyBhbmQgYWxsIGZsYWdzIGFyZSBwcmVzZXJ2ZWQgYnkgYWxsIHJvdXRpbmVzLCBleGNlcHQKLTsqICBpbnRlcnJ1cHRzIHdoaWNoIGFyZSBhbHdheXMgdHVybmVkIG9uCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIKLQotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsKLTsgRXF1YXRlcyB1c2VkIGJ5IGxvbmcgcGVyaW9kIFplbiBUaW1lcgotOwotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotOyBCYXNlIGFkZHJlc3Mgb2YgODI1MyB0aW1lciBjaGlwCi0KLUJBU0VfODI1MyAgICAgICBlcXUgICAgIDQwaAotCi07IFRoZSBhZGRyZXNzIG9mIHRoZSB0aW1lciAwIGNvdW50IHJlZ2lzdGVycyBpbiB0aGUgODI1MwotCi1USU1FUl8wXzgyNTMgICAgZXF1ICAgICBCQVNFXzgyNTMgKyAwCi0KLTsgVGhlIGFkZHJlc3Mgb2YgdGhlIG1vZGUgcmVnaXN0ZXIgaW4gdGhlIDgyNTMKLQotTU9ERV84MjUzICAgICAgIGVxdSAgICAgQkFTRV84MjUzICsgMwotCi07IFRoZSBhZGRyZXNzIG9mIHRoZSBCSU9TIHRpbWVyIGNvdW50IHZhcmlhYmxlIGluIHRoZSBCSU9TIGRhdGEgYXJlYS4KLQotVElNRVJfQ09VTlQgICAgIGVxdSAgICAgNkNoCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVkgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1lbmRpZgotCi1oZWFkZXIgICAgICBfbHp0aW1lcgotCi1iZWdkYXRhc2VnICBfbHp0aW1lcgotCi0gICAgICAgIGNleHRlcm4gIF9aVGltZXJCSU9TUHRyLERQVFIKLQotU3RhcnRCSU9TQ291bnQgICAgICBkZCAgMCAgICAgICA7IFN0YXJ0aW5nIEJJT1MgY291bnQgZHdvcmQKLUVuZEJJT1NDb3VudCAgICAgICAgZGQgIDAgICAgICAgOyBFbmRpbmcgQklPUyBjb3VudCBkd29yZAotRW5kVGltZWRDb3VudCAgICAgICBkdyAgMCAgICAgICA7IFRpbWVyIDAgY291bnQgYXQgdGhlIGVuZCBvZiB0aW1pbmcgcGVyaW9kCi0KLWVuZGRhdGFzZWcgIF9senRpbWVyCi0KLWJlZ2NvZGVzZWcgIF9senRpbWVyICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgTFpfdGltZXJPbih2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFN0YXJ0cyB0aGUgTG9uZyBwZXJpb2QgWmVuIHRpbWVyIGNvdW50aW5nLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIExaX3RpbWVyT24KLQotOyBTZXQgdGhlIHRpbWVyIDAgb2YgdGhlIDgyNTMgdG8gbW9kZSAyIChkaXZpZGUtYnktTiksIHRvIGNhdXNlCi07IGxpbmVhciBjb3VudGluZyByYXRoZXIgdGhhbiBjb3VudC1ieS10d28gY291bnRpbmcuIEFsc28gc3RvcHMKLTsgdGltZXIgMCB1bnRpbCB0aGUgdGltZXIgY291bnQgaXMgbG9hZGVkLCBleGNlcHQgb24gUFMvMiBjb21wdXRlcnMuCi0KLSAgICAgICAgbW92ICAgICBhbCwwMDExMDEwMGIgICAgICAgIDsgbW9kZSAyCi0gICAgICAgIG91dCAgICAgTU9ERV84MjUzLGFsCi0KLTsgU2V0IHRoZSB0aW1lciBjb3VudCB0byAwLCBzbyB3ZSBrbm93IHdlIHdvbid0IGdldCBhbm90aGVyIHRpbWVyCi07IGludGVycnVwdCByaWdodCBhd2F5LiBOb3RlOiB0aGlzIGludHJvZHVjZXMgYW4gaW5hY2N1cmFjeSBvZiB1cCB0byA1NCBtcwotOyBpbiB0aGUgc3lzdGVtIGNsb2NrIGNvdW50IGVhY2ggdGltZSBpdCBpcyBleGVjdXRlZC4KLQotICAgICAgICBERUxBWQotICAgICAgICBzdWIgICAgIGFsLGFsCi0gICAgICAgIG91dCAgICAgVElNRVJfMF84MjUzLGFsICAgICA7IGxzYgotICAgICAgICBERUxBWQotICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBtc2IKLQotOyBTdG9yZSB0aGUgdGltaW5nIHN0YXJ0IEJJT1MgY291bnQKLQotICAgICAgICB1c2VfZXMKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfWlRpbWVyQklPU1B0cl0KLWVsc2UKLSAgICAgICAgbGVzICAgICBieCxbX1pUaW1lckJJT1NQdHJdCi1lbmRpZgotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHdoaWxlIHdlIGdyYWIgdGhlIGNvdW50Ci0gICAgICAgIG1vdiAgICAgZWF4LFtfRVMgX2J4K1RJTUVSX0NPVU5UXQotICAgICAgICBzdGkKLSAgICAgICAgbW92ICAgICBbU3RhcnRCSU9TQ291bnRdLGVheAotICAgICAgICB1bnVzZV9lcwotCi07IFNldCB0aGUgdGltZXIgY291bnQgdG8gMCBhZ2FpbiB0byBzdGFydCB0aGUgdGltaW5nIGludGVydmFsLgotCi0gICAgICAgIG1vdiAgICAgYWwsMDAxMTAxMDBiICAgICAgICA7IHNldCB1cCB0byBsb2FkIGluaXRpYWwKLSAgICAgICAgb3V0ICAgICBNT0RFXzgyNTMsYWwgICAgICAgIDsgdGltZXIgY291bnQKLSAgICAgICAgREVMQVkKLSAgICAgICAgc3ViICAgICBhbCxhbAotICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBsb2FkIGNvdW50IGxzYgotICAgICAgICBERUxBWQotICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBsb2FkIGNvdW50IG1zYgotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIExaX3RpbWVyT2ZmKHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU3RvcHMgdGhlIGxvbmcgcGVyaW9kIFplbiB0aW1lciBhbmQgc2F2ZXMgY291bnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgTFpfdGltZXJPZmYKLQotOyBMYXRjaCB0aGUgdGltZXIgY291bnQuCi0KLSAgICAgICAgbW92ICAgICBhbCwwMDAwMDAwMGIgICAgICAgIDsgbGF0Y2ggdGltZXIgMAotICAgICAgICBvdXQgICAgIE1PREVfODI1MyxhbAotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBTdG9wIHRoZSBCSU9TIGNvdW50Ci0KLTsgUmVhZCB0aGUgQklPUyBjb3VudC4gKFNpbmNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCB0aGUgQklPUwotOyBjb3VudCB3b24ndCBjaGFuZ2UpLgotCi0gICAgICAgIHVzZV9lcwotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW19aVGltZXJCSU9TUHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfWlRpbWVyQklPU1B0cl0KLWVuZGlmCi0gICAgICAgIG1vdiAgICAgZWF4LFtfRVMgX2J4K1RJTUVSX0NPVU5UXQotICAgICAgICBtb3YgICAgIFtFbmRCSU9TQ291bnRdLGVheAotICAgICAgICB1bnVzZV9lcwotCi07IFJlYWQgb3V0IHRoZSBjb3VudCB3ZSBsYXRjaGVkIGVhcmxpZXIuCi0KLSAgICAgICAgaW4gICAgICBhbCxUSU1FUl8wXzgyNTMgICAgIDsgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICBERUxBWQotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIGluICAgICAgYWwsVElNRVJfMF84MjUzICAgICA7IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICB4Y2hnICAgIGFoLGFsCi0gICAgICAgIG5lZyAgICAgYXggICAgICAgICAgICAgICAgICA7IENvbnZlcnQgZnJvbSBjb3VudGRvd24gcmVtYWluaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICB0byBlbGFwc2VkIGNvdW50Ci0gICAgICAgIG1vdiAgICAgW0VuZFRpbWVkQ291bnRdLGF4Ci0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICA7IExldCB0aGUgQklPUyBjb3VudCBjb250aW51ZQotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bnNpZ25lZCBsb25nIExaX3RpbWVyTGFwKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMYXRjaGVzIHRoZSBjdXJyZW50IGNvdW50IGFuZCBjb252ZXJ0cyBpdCB0byBhIG1pY3Jvc2Vjb25kIHRpbWluZyB2YWx1ZSwKLTsgYnV0IGxlYXZlcyB0aGUgdGltZXIgc3RpbGwgcnVubmluZy4gV2UgZG9udCBjaGVjayBmb3IgYW5kIG92ZXJmbG93LAotOyB3aGVyZSB0aGUgdGltZSBoYXMgZ29uZSBvdmVyIGFuIGhvdXIgaW4gdGhpcyByb3V0aW5lLCBzaW5jZSB3ZSB3YW50IGl0Ci07IHRvIGV4ZWN1dGUgYXMgZmFzdCBhcyBwb3NzaWJsZS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBMWl90aW1lckxhcAotCi0gICAgICAgIHB1c2ggICAgZWJ4ICAgICAgICAgICAgICAgICA7IFNhdmUgRUJYIGZvciAzMiBiaXQgY29kZQotCi07IExhdGNoIHRoZSB0aW1lciBjb3VudC4KLQotICAgICAgICBtb3YgICAgIGFsLDAwMDAwMDAwYiAgICAgICAgOyBsYXRjaCB0aW1lciAwCi0gICAgICAgIG91dCAgICAgTU9ERV84MjUzLGFsCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IFN0b3AgdGhlIEJJT1MgY291bnQKLQotOyBSZWFkIHRoZSBCSU9TIGNvdW50LiAoU2luY2UgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHRoZSBCSU9TCi07IGNvdW50IHdvbnQgY2hhbmdlKS4KLQotICAgICAgICB1c2VfZXMKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfWlRpbWVyQklPU1B0cl0KLWVsc2UKLSAgICAgICAgbGVzICAgICBieCxbX1pUaW1lckJJT1NQdHJdCi1lbmRpZgotICAgICAgICBtb3YgICAgIGVheCxbX0VTIF9ieCtUSU1FUl9DT1VOVF0KLSAgICAgICAgbW92ICAgICBbRW5kQklPU0NvdW50XSxlYXgKLSAgICAgICAgdW51c2VfZXMKLQotOyBSZWFkIG91dCB0aGUgY291bnQgd2UgbGF0Y2hlZCBlYXJsaWVyLgotCi0gICAgICAgIGluICAgICAgYWwsVElNRVJfMF84MjUzICAgICA7IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgREVMQVkKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICBpbiAgICAgIGFsLFRJTUVSXzBfODI1MyAgICAgOyBtb3N0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgeGNoZyAgICBhaCxhbAotICAgICAgICBuZWcgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBDb252ZXJ0IGZyb20gY291bnRkb3duIHJlbWFpbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgdG8gZWxhcHNlZCBjb3VudAotICAgICAgICBtb3YgICAgIFtFbmRUaW1lZENvdW50XSxheAotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBMZXQgdGhlIEJJT1MgY291bnQgY29udGludWUKLQotOyBTZWUgaWYgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkIGFuZCBhZGp1c3QgdGhlIGZpbmlzaGluZyBCSU9TCi07IGNvdW50IGJ5IHRoZSBudW1iZXIgb2YgdGlja3MgaW4gMjQgaG91cnMuIFdlIHdvbnQgYmUgYWJsZSB0byBkZXRlY3QKLTsgbW9yZSB0aGFuIDI0IGhvdXJzLCBidXQgYXQgbGVhc3Qgd2UgY2FuIHRpbWUgYWNyb3NzIGEgbWlkbmlnaHQKLTsgYm91bmRhcnkKLQotICAgICAgICBtb3YgICAgIGVheCxbRW5kQklPU0NvdW50XSAgICAgIDsgSXMgZW5kIDwgc3RhcnQ/Ci0gICAgICAgIGNtcCAgICAgZWF4LFtTdGFydEJJT1NDb3VudF0KLSAgICAgICAgamFlICAgICBAQENhbGNCSU9TVGltZSAgICAgICAgICA7IE5vLCBjYWxjdWxhdGUgdGhlIHRpbWUgdGFrZW4KLQotOyBBZGp1c3QgdGhlIGZpbmlzaGluZyB0aW1lIGJ5IGFkZGluZyB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzCi07ICgxNTczMDQwKS4KLQotICAgICAgICBhZGQgICAgIFtEV09SRCBFbmRCSU9TQ291bnRdLDE4MDBCMGgKLQotOyBDb252ZXJ0IHRoZSBCSU9TIHRpbWUgdG8gbWljcm9zZWNvbmRzCi0KLUBAQ2FsY0JJT1NUaW1lOgotICAgICAgICBtb3YgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudF0KLSAgICAgICAgc3ViICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudF0KLSAgICAgICAgbW92ICAgICBkeCw1NDkyNSAgICAgICAgICAgIDsgTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBlYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBCSU9TIGNvdW50IHJlcHJlc2VudHMuCi0gICAgICAgIG11bCAgICAgZHgKLSAgICAgICAgbW92ICAgICBieCxheCAgICAgICAgICAgICAgIDsgc2V0IGFzaWRlIEJJT1MgY291bnQgaW4KLSAgICAgICAgbW92ICAgICBjeCxkeCAgICAgICAgICAgICAgIDsgIG1pY3Jvc2Vjb25kcwotCi07IENvbnZlcnQgdGltZXIgY291bnQgdG8gbWljcm9zZWNvbmRzCi0KLSAgICAgICAgcHVzaCAgICBfc2kKLSAgICAgICAgbW92ICAgICBheCxbRW5kVGltZWRDb3VudF0KLSAgICAgICAgbW92ICAgICBzaSw4MzgxCi0gICAgICAgIG11bCAgICAgc2kKLSAgICAgICAgbW92ICAgICBzaSwxMDAwMAotICAgICAgICBkaXYgICAgIHNpICAgICAgICAgICAgICAgICAgOyAqIDAuODM4MSA9ICogODM4MSAvIDEwMDAwCi0gICAgICAgIHBvcCAgICAgX3NpCi0KLTsgQWRkIHRoZSB0aW1lciBhbmQgQklPUyBjb3VudHMgdG9nZXRoZXIgdG8gZ2V0IGFuIG92ZXJhbGwgdGltZSBpbgotOyBtaWNyb3NlY29uZHMuCi0KLSAgICAgICAgYWRkICAgICBheCxieAotICAgICAgICBhZGMgICAgIGN4LDAKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBzaGwgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIGN4LGF4Ci0gICAgICAgIG1vdiAgICAgZWF4LGVjeCAgICAgICAgICAgICA7IEVBWCA6PSB0aW1lciBjb3VudAotZWxzZQotICAgICAgICBtb3YgICAgIGR4LGN4Ci1lbmRpZgotICAgICAgICBwb3AgICAgIGVieCAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIEVCWCBmb3IgMzIgYml0IGNvZGUKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVuc2lnbmVkIGxvbmcgTFpfdGltZXJDb3VudCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgYW4gdW5zaWduZWQgbG9uZyByZXByZXNlbnRpbmcgdGhlIG5ldCB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KLTsKLTsgSWYgYW4gaG91ciBoYXMgcGFzc2VkIHdoaWxlIHRpbWluZywgd2UgcmV0dXJuIDB4RkZGRkZGRkYgYXMgdGhlIGNvdW50Ci07ICh3aGljaCBpcyBub3QgYSBwb3NzaWJsZSBjb3VudCBpbiBpdHNlbGYpLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIExaX3RpbWVyQ291bnQKLQotICAgICAgICBwdXNoICAgIGVieCAgICAgICAgICAgICAgICAgOyBTYXZlIEVCWCBmb3IgMzIgYml0IGNvZGUKLQotOyBTZWUgaWYgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkIGFuZCBhZGp1c3QgdGhlIGZpbmlzaGluZyBCSU9TCi07IGNvdW50IGJ5IHRoZSBudW1iZXIgb2YgdGlja3MgaW4gMjQgaG91cnMuIFdlIHdvbnQgYmUgYWJsZSB0byBkZXRlY3QKLTsgbW9yZSB0aGFuIDI0IGhvdXJzLCBidXQgYXQgbGVhc3Qgd2UgY2FuIHRpbWUgYWNyb3NzIGEgbWlkbmlnaHQKLTsgYm91bmRhcnkKLQotICAgICAgICBtb3YgICAgIGVheCxbRW5kQklPU0NvdW50XSAgICAgIDsgSXMgZW5kIDwgc3RhcnQ/Ci0gICAgICAgIGNtcCAgICAgZWF4LFtTdGFydEJJT1NDb3VudF0KLSAgICAgICAgamFlICAgICBAQENoZWNrRm9ySG91ciAgICAgICAgICA7IE5vLCBjaGVjayBmb3IgaG91ciBwYXNzaW5nCi0KLTsgQWRqdXN0IHRoZSBmaW5pc2hpbmcgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiB0aWNrcyBpbiAyNCBob3VycwotOyAoMTU3MzA0MCkuCi0KLSAgICAgICAgYWRkICAgICBbRFdPUkQgRW5kQklPU0NvdW50XSwxODAwQjBoCi0KLTsgU2VlIGlmIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlZCBkdXJpbmcgdGltaW5nLiBJZiBzbywgbm90aWZ5IHRoZSB1c2VyLgotCi1AQENoZWNrRm9ySG91cjoKLSAgICAgICAgbW92ICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudCsyXQotICAgICAgICBjbXAgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudCsyXQotICAgICAgICBqeiAgICAgIEBAQ2FsY0JJT1NUaW1lICAgICAgOyBIb3VyIGNvdW50IGRpZG4ndCBjaGFuZ2UsIHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBldmVyeXRoaW5nIGlzIGZpbmUKLQotICAgICAgICBpbmMgICAgIGF4Ci0gICAgICAgIGNtcCAgICAgYXgsW1dPUkQgRW5kQklPU0NvdW50KzJdCi0gICAgICAgIGpueiAgICAgQEBUZXN0VG9vTG9uZyAgICAgICA7IFR3byBob3VyIGJvdW5kYXJpZXMgcGFzc2VkLCBzbyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIHJlc3VsdHMgYXJlIG5vIGdvb2QKLSAgICAgICAgbW92ICAgICBheCxbV09SRCBFbmRCSU9TQ291bnRdCi0gICAgICAgIGNtcCAgICAgYXgsW1dPUkQgU3RhcnRCSU9TQ291bnRdCi0gICAgICAgIGpiICAgICAgQEBDYWxjQklPU1RpbWUgICAgICA7IGEgc2luZ2xlIGhvdXIgYm91bmRhcnkgcGFzc2VkLiBUaGF0J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgT0ssIHNvIGxvbmcgYXMgdGhlIHRvdGFsIHRpbWUgd2Fzbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG1vcmUgdGhhbiBhbiBob3VyLgotCi07IE92ZXIgYW4gaG91ciBlbGFwc2VkIHBhc3NlZCBkdXJpbmcgdGltaW5nLCB3aGljaCByZW5kZXJzCi07IHRoZSByZXN1bHRzIGludmFsaWQuIE5vdGlmeSB0aGUgdXNlci4gVGhpcyBtaXNzZXMgdGhlIGNhc2Ugd2hlcmUgYQotOyBtdWx0aXBsZSBvZiAyNCBob3VycyBoYXMgcGFzc2VkLCBidXQgd2UnbGwgcmVseSBvbiB0aGUgcGVyc3BpY2FjaXR5IG9mCi07IHRoZSB1c2VyIHRvIGRldGVjdCB0aGF0IGNhc2UgOi0pLgotCi1AQFRlc3RUb29Mb25nOgotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYXgsMEZGRkZGRkZGaAotZWxzZQotICAgICAgICBtb3YgICAgIGF4LDBGRkZGaAotICAgICAgICBtb3YgICAgIGR4LDBGRkZGaAotZW5kaWYKLSAgICAgICAgam1wICAgICBzaG9ydCBAQERvbmUKLQotOyBDb252ZXJ0IHRoZSBCSU9TIHRpbWUgdG8gbWljcm9zZWNvbmRzCi0KLUBAQ2FsY0JJT1NUaW1lOgotICAgICAgICBtb3YgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudF0KLSAgICAgICAgc3ViICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudF0KLSAgICAgICAgbW92ICAgICBkeCw1NDkyNSAgICAgICAgICAgIDsgTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBlYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBCSU9TIGNvdW50IHJlcHJlc2VudHMuCi0gICAgICAgIG11bCAgICAgZHgKLSAgICAgICAgbW92ICAgICBieCxheCAgICAgICAgICAgICAgIDsgc2V0IGFzaWRlIEJJT1MgY291bnQgaW4KLSAgICAgICAgbW92ICAgICBjeCxkeCAgICAgICAgICAgICAgIDsgIG1pY3Jvc2Vjb25kcwotCi07IENvbnZlcnQgdGltZXIgY291bnQgdG8gbWljcm9zZWNvbmRzCi0KLSAgICAgICAgcHVzaCAgICBfc2kKLSAgICAgICAgbW92ICAgICBheCxbRW5kVGltZWRDb3VudF0KLSAgICAgICAgbW92ICAgICBzaSw4MzgxCi0gICAgICAgIG11bCAgICAgc2kKLSAgICAgICAgbW92ICAgICBzaSwxMDAwMAotICAgICAgICBkaXYgICAgIHNpICAgICAgICAgICAgICAgICAgOyAqIDAuODM4MSA9ICogODM4MSAvIDEwMDAwCi0gICAgICAgIHBvcCAgICAgX3NpCi0KLTsgQWRkIHRoZSB0aW1lciBhbmQgQklPUyBjb3VudHMgdG9nZXRoZXIgdG8gZ2V0IGFuIG92ZXJhbGwgdGltZSBpbgotOyBtaWNyb3NlY29uZHMuCi0KLSAgICAgICAgYWRkICAgICBheCxieAotICAgICAgICBhZGMgICAgIGN4LDAKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBzaGwgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIGN4LGF4Ci0gICAgICAgIG1vdiAgICAgZWF4LGVjeCAgICAgICAgICAgICA7IEVBWCA6PSB0aW1lciBjb3VudAotZWxzZQotICAgICAgICBtb3YgICAgIGR4LGN4Ci1lbmRpZgotCi1AQERvbmU6IHBvcCAgICAgZWJ4ICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgRUJYIGZvciAzMiBiaXQgY29kZQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotY3Byb2NzdGFydCAgIExaX2Rpc2FibGUKLSAgICAgICAgY2xpCi0gICAgICAgIHJldAotY3Byb2NlbmQKLQotY3Byb2NzdGFydCAgIExaX2VuYWJsZQotICAgICAgICBzdGkKLSAgICAgICAgcmV0Ci1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfbHp0aW1lcgotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiNWNmMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDY1NiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiBJQk0gUEMgUmVhbCBtb2RlIGFuZCAxNi8zMiBiaXQgcHJvdGVjdGVkIG1vZGUKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBQTSBsaWJyYXJ5IHNwZWNpZmljIHRvCi07KiAgICAgICAgICAgICAgTVNET1MuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3BtZG9zICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9wbWRvcwotCi1pZm5kZWYgIGZsYXRtb2RlbAotCi1zdHJ1YyAgIHJtcmVnc19zCi1heCAgICAgICAgICBkdyAgPwotYXhfaGlnaCAgICAgZHcgID8KLWJ4ICAgICAgICAgIGR3ICA/Ci1ieF9oaWdoICAgICBkdyAgPwotY3ggICAgICAgICAgZHcgID8KLWN4X2hpZ2ggICAgIGR3ICA/Ci1keCAgICAgICAgICBkdyAgPwotZHhfaGlnaCAgICAgZHcgID8KLXNpICAgICAgICAgIGR3ICA/Ci1zaV9oaWdoICAgICBkdyAgPwotZGkgICAgICAgICAgZHcgID8KLWRpX2hpZ2ggICAgIGR3ICA/Ci1jZmxhZyAgICAgICBkdyAgPwotY2ZsYWdfaGlnaCAgZHcgID8KLWVuZHMgICAgcm1yZWdzX3MKLVJNUkVHUyAgPSAocm1yZWdzX3MgUFRSIGVzOmJ4KQotCi1zdHJ1YyAgIHJtc3JlZ3NfcwotZXMgICAgICBkdyAgPwotY3MgICAgICBkdyAgPwotc3MgICAgICBkdyAgPwotZHMgICAgICBkdyAgPwotZW5kcyAgICBybXNyZWdzX3MKLVJNU1JFR1MgPSAocm1zcmVnc19zIFBUUiBlczpieCkKLQotZW5kaWYgICA7ICFmbGF0bW9kZWwKLQotaWZkZWYgZmxhdG1vZGVsCi0gICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKLSAgICBjZXh0ZXJuIF9QTV9WWERfb2ZmLFVJTlQKLSAgICBjZXh0ZXJuIF9QTV9WWERfc2VsLFVJTlQKLWlmZGVmICAgRE9TNEdXCi0gICAgY2V4dGVybiBfUE1faGF2ZUNhdXNlV2F5LFVJTlQKLWVuZGlmCi1lbmRpZgotaW50ZWxfaWQgICAgICAgIGRiICAiR2VudWluZUludGVsIiAgOyBJbnRlbCB2ZW5kb3IgSUQKLQotUE1IRUxQX0dFVFBEQiAgICAgICBFUVUgMDAyNmgKLVBNSEVMUF9GTFVTSFRMQiAgICAgRVFVIDAwMjdoCi0KLWVuZGRhdGFzZWcgIF9wbWRvcwotCi1QNTg2Ci0KLWJlZ2NvZGVzZWcgIF9wbWRvcyAgICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWlmbmRlZiAgZmxhdG1vZGVsCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fY2FsbFJlYWxNb2RlKHVuc2lnbmVkIHMsdW5zaWduZWQgbywgUk1SRUdTICpyZWdzLAotOyAgIFJNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2FsbHMgYSByZWFsIG1vZGUgcHJvY2VkdXJlLCBsb2FkaW5nIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcnMgdmFsdWVzCi07IGZyb20gdGhlIHBhc3NlZCBpbiBzdHJ1Y3R1cmVzLiBPbmx5IHRoZSBEUyBhbmQgRVMgcmVnaXN0ZXIgYXJlIGxvYWRlZAotOyBmcm9tIHRoZSBTUkVHUyBzdHJ1Y3R1cmUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY2FsbFJlYWxNb2RlCi0KLSAgICAgICAgQVJHICAgICBzOldPUkQsIG86V09SRCwgcmVnczpEV09SRCwgc3JlZ3M6RFdPUkQKLQotICAgICAgICBMT0NBTCAgIGFkZHI6RFdPUkQsIGJ4VmFsOldPUkQsIGVzVmFsOldPUkQsIGZsYWdzOldPUkQgPSBMb2NhbFNpemUKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcwotCi0gICAgICAgIG1vdiAgICAgYXgsW29dICAgICAgICAgICAgICA7IEJ1aWxkIHRoZSBhZGRyZXNzIHRvIGNhbGwgaW4gJ2FkZHInCi0gICAgICAgIG1vdiAgICAgW1dPUkQgYWRkcl0sYXgKLSAgICAgICAgbW92ICAgICBheCxbc10KLSAgICAgICAgbW92ICAgICBbV09SRCBhZGRyKzJdLGF4Ci0KLSAgICAgICAgbGVzICAgICBieCxbc3JlZ3NdCi0gICAgICAgIG1vdiAgICAgYXgsW1JNU1JFR1MuZHNdCi0gICAgICAgIG1vdiAgICAgZHMsYXggICAgICAgICAgICAgICA7IERTIDo9IHBhc3NlZCBpbiB2YWx1ZQotICAgICAgICBtb3YgICAgIGF4LFtSTVNSRUdTLmVzXQotICAgICAgICBtb3YgICAgIFtlc1ZhbF0sYXgKLSAgICAgICAgbGVzICAgICBieCxbcmVnc10KLSAgICAgICAgbW92ICAgICBheCxbUk1SRUdTLmJ4XQotICAgICAgICBtb3YgICAgIFtieFZhbF0sYXgKLSAgICAgICAgbW92ICAgICBheCxbUk1SRUdTLmF4XSAgICAgIDsgQVggOj0gcGFzc2VkIGluIHZhbHVlCi0gICAgICAgIG1vdiAgICAgY3gsW1JNUkVHUy5jeF0gICAgICA7IENYIDo9IHBhc3NlZCBpbiB2YWx1ZQotICAgICAgICBtb3YgICAgIGR4LFtSTVJFR1MuZHhdICAgICAgOyBEWCA6PSBwYXNzZWQgaW4gdmFsdWUKLSAgICAgICAgbW92ICAgICBzaSxbUk1SRUdTLnNpXSAgICAgIDsgU0kgOj0gcGFzc2VkIGluIHZhbHVlCi0gICAgICAgIG1vdiAgICAgZGksW1JNUkVHUy5kaV0gICAgICA7IERJIDo9IHBhc3NlZCBpbiB2YWx1ZQotICAgICAgICBwdXNoICAgIGJwCi0gICAgICAgIHB1c2ggICAgW2VzVmFsXQotICAgICAgICBwb3AgICAgIGVzICAgICAgICAgICAgICAgICAgOyBFUyA6PSBwYXNzZWQgaW4gdmFsdWUKLSAgICAgICAgbW92ICAgICBieCxbYnhWYWxdICAgICAgICAgIDsgQlggOj0gcGFzc2VkIGluIHZhbHVlCi0KLSAgICAgICAgY2FsbCAgICBbYWRkcl0gICAgICAgICAgICAgIDsgQ2FsbCB0aGUgc3BlY2lmaWVkIHJvdXRpbmUKLQotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIGZsYWdzIGZvciBsYXRlcgotICAgICAgICBwb3AgICAgIFtmbGFnc10KLQotICAgICAgICBwb3AgICAgIGJwCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcG9wICAgICBbZXNWYWxdCi0gICAgICAgIHB1c2ggICAgYngKLSAgICAgICAgcG9wICAgICBbYnhWYWxdCi0gICAgICAgIGxlcyAgICAgYngsW3NyZWdzXQotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHBvcCAgICAgW1JNU1JFR1MuZHNdICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBbZXNWYWxdCi0gICAgICAgIHBvcCAgICAgW1JNU1JFR1MuZXNdICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRVMKLSAgICAgICAgbGVzICAgICBieCxbcmVnc10KLSAgICAgICAgbW92ICAgICBbUk1SRUdTLmF4XSxheCAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBBWAotICAgICAgICBtb3YgICAgIFtSTVJFR1MuY3hdLGN4ICAgICAgOyBTYXZlIHZhbHVlIG9mIENYCi0gICAgICAgIG1vdiAgICAgW1JNUkVHUy5keF0sZHggICAgICA7IFNhdmUgdmFsdWUgb2YgRFgKLSAgICAgICAgbW92ICAgICBbUk1SRUdTLnNpXSxzaSAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBTSQotICAgICAgICBtb3YgICAgIFtSTVJFR1MuZGldLGRpICAgICAgOyBTYXZlIHZhbHVlIG9mIERJCi0gICAgICAgIG1vdiAgICAgYXgsW2ZsYWdzXSAgICAgICAgICA7IFJldHVybiBmbGFncwotICAgICAgICBhbmQgICAgIGF4LDFoICAgICAgICAgICAgICAgOyBJc29sYXRlIGNhcnJ5IGZsYWcKLSAgICAgICAgbW92ICAgICBbUk1SRUdTLmNmbGFnXSxheCAgIDsgU2F2ZSBjYXJyeSBmbGFnIHN0YXR1cwotICAgICAgICBtb3YgICAgIGF4LFtieFZhbF0KLSAgICAgICAgbW92ICAgICBbUk1SRUdTLmJ4XSxheCAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBCWAotCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NlZ3JlYWQoUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCBzZWdtZW50IHJlZ2lzdGVycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnRkbGwxNiBQTV9zZWdyZWFkCi0KLSAgICAgICAgQVJHICAgICBzcmVnczpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgYXgsZXMKLSAgICAgICAgX2xlcyAgICBfc2ksW3NyZWdzXQotICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzJdLGNzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krNF0sc3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs2XSxkcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzhdLGZzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMTBdLGdzCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOyBDcmVhdGUgYSB0YWJsZSBvZiB0aGUgMjU2IGRpZmZlcmVudCBpbnRlcnJ1cHQgY2FsbHMgdGhhdCB3ZSBjYW4ganVtcAotOyBpbnRvCi0KLWlmZGVmICAgVVNFX05BU00KLQotJWFzc2lnbiBpbnRubyAwCi0KLWludFRhYmxlOgotJXJlcCAgICAyNTYKLSAgICAgICAgZGIgICAgICAwQ0RoCi0gICAgICAgIGRiICAgICAgaW50bm8KLSVhc3NpZ24gaW50bm8gICBpbnRubyArIDEKLSAgICAgICAgcmV0Ci0gICAgICAgIG5vcAotJWVuZHJlcAotCi1lbHNlCi0KLWludG5vID0gMAotCi1pbnRUYWJsZToKLSAgICAgICAgUkVQVCAgICAyNTYKLSAgICAgICAgZGIgICAgICAwQ0RoCi0gICAgICAgIGRiICAgICAgaW50bm8KLWludG5vID0gaW50bm8gKyAxCi0gICAgICAgIHJldAotICAgICAgICBub3AKLSAgICAgICAgRU5ETQotCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfUE1fZ2VuSW50ICAgIC0gR2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGludGVycnVwdAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jbmVhciAgIF9QTV9nZW5JbnQKLQotICAgICAgICBwdXNoICAgIF9heCAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYXgKLSAgICAgICAgcHVzaCAgICBfYnggICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2J4Ci1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW1VJTlQgZXNwKzEyXSAgICAgICA7IEVCWCA6PSBpbnRlcnJ1cHQgbnVtYmVyCi1lbHNlCi0gICAgICAgIG1vdiAgICAgYngsc3AgICAgICAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgRVNQIGlzIHplcm9lZAotICAgICAgICBtb3YgICAgIGJ4LFtVSU5UIHNzOmJ4KzZdICAgICAgIDsgQlggOj0gaW50ZXJydXB0IG51bWJlcgotZW5kaWYKLSAgICAgICAgbW92ICAgICBfYXgsb2Zmc2V0IGludFRhYmxlICAgICA7IFBvaW50IHRvIGludGVycnVwdCBnZW5lcmF0aW9uIHRhYmxlCi0gICAgICAgIHNobCAgICAgX2J4LDIgICAgICAgICAgICAgICAgICAgOyBfQlggOj0gaW5kZXggaW50byB0YWJsZQotICAgICAgICBhZGQgICAgIF9heCxfYnggICAgICAgICAgICAgICAgIDsgX0FYIDo9IHBvaW50ZXIgdG8gaW50ZXJydXB0IGNvZGUKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICB4Y2hnICAgIGVheCxbZXNwKzRdICAgICAgICAgICAgIDsgUmVzdG9yZSBlYXgsIGFuZCBzZXQgZm9yIGludAotZWxzZQotICAgICAgICBtb3YgICAgIGJ4LHNwCi0gICAgICAgIHhjaGcgICAgYXgsW3NzOmJ4KzJdICAgICAgICAgICAgOyBSZXN0b3JlIGF4LCBhbmQgc2V0IGZvciBpbnQKLWVuZGlmCi0gICAgICAgIHBvcCAgICAgX2J4ICAgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIF9ieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2ludDM4NngoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCxQTVNSRUdTICpzcmVncykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElzc3VlcyBhIHNvZnR3YXJlIGludGVycnVwdCBpbiBwcm90ZWN0ZWQgbW9kZS4gVGhpcyByb3V0aW5lIGhhcyBiZWVuCi07IHdyaXR0ZW4gdG8gYWxsb3cgdXNlciBwcm9ncmFtcyB0byBsb2FkIENTIGFuZCBEUyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLTsgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1faW50Mzg2eAotCi0gICAgICAgIEFSRyAgICAgaW50bm86VUlOVCwgaW5wdHI6RFBUUiwgb3V0cHRyOkRQVFIsIHNyZWdzOkRQVFIKLQotICAgICAgICBMT0NBTCAgIGZsYWdzOlVJTlQsIHN2X2RzOlVJTlQsIHN2X2VzaTpVTE9ORyA9IExvY2FsU2l6ZQotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzICAgICAgICAgICAgICAgICAgOyBTYXZlIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIHB1c2ggICAgZnMKLSAgICAgICAgcHVzaCAgICBncwotCi0gICAgICAgIF9sZHMgICAgX3NpLFtzcmVnc10gICAgICAgICA7IERTOl9TSSAtPiBMb2FkIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgZXMsW19zaV0KLSAgICAgICAgbW92ICAgICBieCxbX3NpKzZdCi0gICAgICAgIG1vdiAgICAgW3N2X2RzXSxfYnggICAgICAgICA7IFNhdmUgdmFsdWUgb2YgdXNlciBEUyBvbiBzdGFjawotICAgICAgICBtb3YgICAgIGZzLFtfc2krOF0KLSAgICAgICAgbW92ICAgICBncyxbX3NpKzEwXQotCi0gICAgICAgIF9sZHMgICAgX3NpLFtpbnB0cl0gICAgICAgICA7IExvYWQgQ1BVIHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIGVheCxbX3NpXQotICAgICAgICBtb3YgICAgIGVieCxbX3NpKzRdCi0gICAgICAgIG1vdiAgICAgZWN4LFtfc2krOF0KLSAgICAgICAgbW92ICAgICBlZHgsW19zaSsxMl0KLSAgICAgICAgbW92ICAgICBlZGksW19zaSsyMF0KLSAgICAgICAgbW92ICAgICBlc2ksW19zaSsxNl0KLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgX2JwICAgICAgICAgICAgICAgICA7IFNvbWUgaW50ZXJydXB0cyB0cmFzaCB0aGlzIQotICAgICAgICBjbGMgICAgICAgICAgICAgICAgICAgICAgICAgOyBHZW5lcmF0ZSB0aGUgaW50ZXJydXB0Ci0gICAgICAgIHB1c2ggICAgW1VJTlQgaW50bm9dCi0gICAgICAgIG1vdiAgICAgZHMsW1dPUkQgc3ZfZHNdICAgICA7IFNldCB2YWx1ZSBvZiB1c2VyJ3MgRFMgc2VsZWN0b3IKLSAgICAgICAgY2FsbCAgICBfUE1fZ2VuSW50Ci0gICAgICAgIHBvcCAgICAgX2JwICAgICAgICAgICAgICAgICA7IFBvcCBpbnRubyBmcm9tIHN0YWNrIChmbGFncyB1bmNoYW5nZWQpCi0gICAgICAgIHBvcCAgICAgX2JwICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgdmFsdWUgb2Ygc3RhY2sgZnJhbWUgcG9pbnRlcgotICAgICAgICBwb3AgICAgIGRzICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHZhbHVlIG9mIERTCi0KLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBmbGFncyBmb3IgbGF0ZXIKLSAgICAgICAgcG9wICAgICBbVUlOVCBmbGFnc10KLSAgICAgICAgcHVzaCAgICBlc2kgICAgICAgICAgICAgICAgIDsgU2F2ZSBFU0kgZm9yIGxhdGVyCi0gICAgICAgIHBvcCAgICAgW0RXT1JEIHN2X2VzaV0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSBEUyBmb3IgbGF0ZXIKLSAgICAgICAgcG9wICAgICBbVUlOVCBzdl9kc10KLQotICAgICAgICBfbGRzICAgIF9zaSxbb3V0cHRyXSAgICAgICAgOyBTYXZlIENQVSByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBbX3NpXSxlYXgKLSAgICAgICAgbW92ICAgICBbX3NpKzRdLGVieAotICAgICAgICBtb3YgICAgIFtfc2krOF0sZWN4Ci0gICAgICAgIG1vdiAgICAgW19zaSsxMl0sZWR4Ci0gICAgICAgIHB1c2ggICAgW0RXT1JEIHN2X2VzaV0KLSAgICAgICAgcG9wICAgICBbRFdPUkQgX3NpKzE2XQotICAgICAgICBtb3YgICAgIFtfc2krMjBdLGVkaQotCi0gICAgICAgIG1vdiAgICAgX2J4LFtmbGFnc10gICAgICAgICA7IFJldHVybiBmbGFncwotICAgICAgICBhbmQgICAgIGVieCwxaCAgICAgICAgICAgICAgOyBJc29sYXRlIGNhcnJ5IGZsYWcKLSAgICAgICAgbW92ICAgICBbX3NpKzI0XSxlYnggICAgICAgIDsgU2F2ZSBjYXJyeSBmbGFnIHN0YXR1cwotCi0gICAgICAgIF9sZHMgICAgX3NpLFtzcmVnc10gICAgICAgICA7IFNhdmUgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBbX3NpXSxlcwotICAgICAgICBtb3YgICAgIF9ieCxbc3ZfZHNdCi0gICAgICAgIG1vdiAgICAgW19zaSs2XSxieCAgICAgICAgICA7IEdldCByZXR1cm5lZCBEUyBmcm9tIHN0YWNrCi0gICAgICAgIG1vdiAgICAgW19zaSs4XSxmcwotICAgICAgICBtb3YgICAgIFtfc2krMTBdLGdzCi0KLSAgICAgICAgcG9wICAgICBncyAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGZzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1pZm5kZWYgZmxhdG1vZGVsCi1fUE1fc2F2ZWREUyAgICAgZHcgIF9EQVRBICAgICAgICAgICA7IFNhdmVkIHZhbHVlIG9mIERTCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NhdmVEUyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2F2ZSB0aGUgdmFsdWUgb2YgRFMgaW50byBhIHNlY3Rpb24gb2YgdGhlIGNvZGUgc2VnbWVudCwgc28gdGhhdCB3ZSBjYW4KLTsgcXVpY2tseSBsb2FkIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBkYXRlIGluIHRoZSBQTV9sb2FkRFMoKSByb3V0aW5lIGZyb20KLTsgaW5zaWRlIGludGVycnVwdCBoYW5kbGVycyBldGMuIFRoZSBtZXRob2QgdG8gZG8gdGhpcyBpcyBkaWZmZXJlbnQKLTsgZGVwZW5kaW5nIG9uIHRoZSBET1MgZXh0ZW5kZXIgYmVpbmcgdXNlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1fc2F2ZURTCi0KLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIFtfUE1fc2F2ZWREU10sZHMgICAgOyBTdG9yZSBhd2F5IGluIGRhdGEgc2VnbWVudAotZW5kaWYKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fbG9hZERTKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSb3V0aW5lIHRvIGxvYWQgdGhlIERTIHJlZ2lzdGVyIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjdXJyZW50Ci07IERPUyBleHRlbmRlci4gT25seSB0aGUgRFMgcmVnaXN0ZXIgaXMgbG9hZGVkLCBub3QgdGhlIEVTIHJlZ2lzdGVyLCBzbwotOyBpZiB5b3Ugd2lzaCB0byBjYWxsIEMgY29kZSwgeW91IHdpbGwgbmVlZCB0byBhbHNvIGxvYWQgdGhlIEVTIHJlZ2lzdGVyCi07IGluIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1fbG9hZERTCi0KLSAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdIDsgV2UgY2FuIGFjY2VzcyB0aGUgcHJvcGVyIERTIHRocm91Z2ggQ1MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWlmZGVmIGZsYXRtb2RlbAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpYm9vbCBEUE1JX2FsbG9jYXRlQ2FsbGJhY2sodm9pZCAoKnBtY29kZSkoKSwgdm9pZCAqcm1yZWdzLCBsb25nICpSTUNCKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9EUE1JX2FsbG9jYXRlQ2FsbGJhY2sKLQotICAgICAgICBBUkcgICAgIHBtY29kZTpDUFRSLCBybXJlZ3M6RFBUUiwgUk1DQjpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLQotICAgICAgICBwdXNoICAgIGNzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgbW92ICAgICBlc2ksW3BtY29kZV0gICAgOyBEUzpFU0kgLT4gcHJvdGVjdGVkIG1vZGUgY29kZSB0byBjYWxsCi0gICAgICAgIG1vdiAgICAgZWRpLFtybXJlZ3NdICAgIDsgRVM6RURJIC0+IHJlYWwgbW9kZSByZWdpc3RlciBidWZmZXIKLSAgICAgICAgbW92ICAgICBheCwzMDNoICAgICAgICAgOyBBWCA6PSBhbGxvY2F0ZSByZWFsbW9kZSBjYWxsYmFjayBmdW5jdGlvbgotICAgICAgICBpbnQgICAgIDMxaAotICAgICAgICBtb3YgICAgIGVheCwwICAgICAgICAgICA7IFJldHVybiBmYWlsdXJlIQotICAgICAgICBqYyAgICAgIEBARmFpbAotCi0gICAgICAgIG1vdiAgICAgZWF4LFtSTUNCXQotICAgICAgICBzaGwgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIGN4LGR4Ci0gICAgICAgIG1vdiAgICAgW2VzOmVheF0sZWN4ICAgIDsgUmV0dXJuIHJlYWwgbW9kZSBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgIDsgUmV0dXJuIHN1Y2Nlc3MhCi0KLUBARmFpbDogcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgRFBNSV9mcmVlQ2FsbGJhY2sobG9uZyBSTUNCKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9EUE1JX2ZyZWVDYWxsYmFjawotCi0gICAgICAgIEFSRyAgICAgUk1DQjpVTE9ORwotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGN4LFtXT1JEIFJNQ0IrMl0KLSAgICAgICAgbW92ICAgICBkeCxbV09SRCBSTUNCXSAgOyBDWDpEWCA6PSByZWFsIG1vZGUgY2FsbGJhY2sKLSAgICAgICAgbW92ICAgICBheCwzMDRoCi0gICAgICAgIGludCAgICAgMzFoCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kaWYKLQotOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KLTsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCi07IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvICBERUxBWSAwCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0lZW5kbWFjcm8KLSVtYWNybyAgSU9ERUxBWU4gMQotJXJlcCAgICAlMQotICAgICAgICBERUxBWQotJWVuZHJlcAotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1tYWNybyAgIElPREVMQVlOICAgIE4KLSAgICByZXB0ICAgIE4KLSAgICAgICAgREVMQVkKLSAgICBlbmRtCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfUE1fcmVhZENNT1MoaW50IGluZGV4KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9yZWFkQ01PUwotCi0gICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgaW4gICAgICBhbCw3MWgKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICB4b3IgICAgIGFsLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQotICAgICAgICBzdGkKLSAgICAgICAgbW92ICAgICBhbCxhaCAgICAgICAgICAgICAgIDsgUmV0dXJuIHZhbHVlIGluIEFMCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV93cml0ZUNNT1MKLQotICAgICAgICBBUkcgICAgIGluZGV4OlVJTlQsIHZhbHVlOlVDSEFSCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2hmZAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZwotICAgICAgICBjbGkKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBtb3YgICAgIGFsLFt2YWx1ZV0KLSAgICAgICAgb3V0ICAgICA3MWgsYWwKLSAgICAgICAgeG9yICAgICBhbCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBOTUkKLSAgICAgICAgc3RpCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1pZmRlZiAgIGZsYXRtb2RlbAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX1BNX3BhZ2luZ0VuYWJsZWQodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgMSBpZiBwYWdpbmcgaXMgZW5hYmxlZCwgMCBpZiBub3Qgb3IgLTEgaWYgbm90IGF0IHJpbmcgMAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9wYWdpbmdFbmFibGVkCi0KLSAgICAgICAgbW92ICAgICBlYXgsLTEKLWlmZGVmICAgRE9TNEdXCi0gICAgICAgIG1vdiAgICAgY3gsY3MKLSAgICAgICAgYW5kICAgICBlY3gsMwotICAgICAgICBqeiAgICAgIEBAUmluZzAKLSAgICAgICAgY21wICAgICBbVUlOVCBfUE1faGF2ZUNhdXNlV2F5XSwwCi0gICAgICAgIGpueiAgICAgQEBSaW5nMAotICAgICAgICBqbXAgICAgIEBARXhpdAotCi1AQFJpbmcwOgotICAgICAgICBtb3YgICAgIGVheCxjcjAgICAgICAgICAgICAgICAgIDsgTG9hZCBDUjAKLSAgICAgICAgc2hyICAgICBlYXgsMzEgICAgICAgICAgICAgICAgICA7IElzb2xhdGUgcGFnaW5nIGVuYWJsZWQgYml0Ci1lbmRpZgotQEBFeGl0OiByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2dldFBEQiAtIFJldHVybiB0aGUgUGFnZSBUYWJsZSBEaXJlY3RvcnkgQmFzZSBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2dldFBEQgotCi1pZmRlZiAgIERPUzRHVwotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIGFuZCAgICAgZWF4LDMKLSAgICAgICAganogICAgICBAQFJpbmcwCi0gICAgICAgIGNtcCAgICAgW1VJTlQgX1BNX2hhdmVDYXVzZVdheV0sMAotICAgICAgICBqbnogICAgIEBAUmluZzAKLWVuZGlmCi0KLTsgQ2FsbCBWeEQgaWYgcnVubmluZyBhdCByaW5nIDMgaW4gYSBET1MgYm94Ci0KLSAgICAgICAgY21wICAgICBbV09SRCBfUE1fVlhEX3NlbF0sMAotICAgICAgICBqeiAgICAgIEBARmFpbAotICAgICAgICBtb3YgICAgIGVheCxQTUhFTFBfR0VUUERCCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgICAgZmFyIGR3b3JkIFtfUE1fVlhEX29mZl0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRkNQVFIgX1BNX1ZYRF9vZmZdCi1lbmRpZgotICAgICAgICByZXQKLQotQEBSaW5nMDoKLWlmZGVmICAgRE9TNEdXCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0gICAgICAgIHJldAotZW5kaWYKLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9mbHVzaFRMQiAtIEZsdXNoIHRoZSBUcmFuc2xhdGlvbiBMb29rYXNpZGUgYnVmZmVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fZmx1c2hUTEIKLQotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIGFuZCAgICAgZWF4LDMKLSAgICAgICAganogICAgICBAQFJpbmcwCi1pZmRlZiAgIERPUzRHVwotICAgICAgICBjbXAgICAgIFtVSU5UIF9QTV9oYXZlQ2F1c2VXYXldLDAKLSAgICAgICAgam56ICAgICBAQFJpbmcwCi1lbmRpZgotCi07IENhbGwgVnhEIGlmIHJ1bm5pbmcgYXQgcmluZyAzIGluIGEgRE9TIGJveAotCi0gICAgICAgIGNtcCAgICAgW1dPUkQgX1BNX1ZYRF9zZWxdLDAKLSAgICAgICAganogICAgICBAQEZhaWwKLSAgICAgICAgbW92ICAgICBlYXgsUE1IRUxQX0ZMVVNIVExCCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgICAgZmFyIGR3b3JkIFtfUE1fVlhEX29mZl0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRkNQVFIgX1BNX1ZYRF9vZmZdCi1lbmRpZgotICAgICAgICByZXQKLQotQEBSaW5nMDoKLWlmZGVmICAgRE9TNEdXCi0gICAgICAgIHdiaW52ZCAgICAgICAgICAgICAgICAgIDsgRmx1c2ggdGhlIENQVSBjYWNoZQotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgOyBGbHVzaCB0aGUgVExCCi1lbmRpZgotQEBGYWlsOiByZXQKLQotY3Byb2NlbmQKLQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fVnhEQ2FsbChWWERfcmVncyBmYXIgKnIsdWludCBvZmYsdWludCBzZWwpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9WeERDYWxsCi0KLSAgICAgICAgQVJHICAgICByOkRQVFIsIG9mZjpVSU5ULCBzZWw6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLQotOyBMb2FkIGFsbCByZWdpc3RlcnMgZnJvbSB0aGUgcmVnaXN0ZXJzIHN0cnVjdHVyZQotCi0gICAgICAgIG1vdiAgICAgZWJ4LFtyXQotICAgICAgICBtb3YgICAgIGVheCxbZWJ4KzBdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlYngrOF0KLSAgICAgICAgbW92ICAgICBlZHgsW2VieCsxMl0KLSAgICAgICAgbW92ICAgICBlc2ksW2VieCsxNl0KLSAgICAgICAgbW92ICAgICBlZGksW2VieCsyMF0KLSAgICAgICAgbW92ICAgICBlYngsW2VieCs0XSAgICAgICAgIDsgVHJhc2hlcyBCWCBzdHJ1Y3R1cmUgcG9pbnRlciEKLQotOyBDYWxsIHRoZSBWeEQgZW50cnkgcG9pbnQgKG9uIHN0YWNrKQotCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtvZmZdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZDUFRSIG9mZl0KLWVuZGlmCi0KLTsgU2F2ZSBhbGwgcmVnaXN0ZXJzIGJhY2sgaW4gdGhlIHN0cnVjdHVyZQotCi0gICAgICAgIHB1c2ggICAgZWJ4ICAgICAgICAgICAgICAgICA7IFB1c2ggRUJYIG9udG8gc3RhY2sgZm9yIGxhdGVyCi0gICAgICAgIG1vdiAgICAgZWJ4LFtyXQotICAgICAgICBtb3YgICAgIFtlYngrMF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VieCs4XSxlY3gKLSAgICAgICAgbW92ICAgICBbZWJ4KzEyXSxlZHgKLSAgICAgICAgbW92ICAgICBbZWJ4KzE2XSxlc2kKLSAgICAgICAgbW92ICAgICBbZWJ4KzIwXSxlZGkKLSAgICAgICAgcG9wICAgICBbRFdPUkQgZWJ4KzRdICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBFQlggZnJvbSBzdGFjawotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9wbWRvcwotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbWRvcy5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtZG9zLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3NDFmMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtZG9zLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDExMDUgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIFJlYWwgbW9kZSBhbmQgMTYvMzIgYml0IHByb3RlY3RlZCBtb2RlCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bwotOyogICAgICAgICAgICAgIE1TRE9TIGludGVycnVwdCBoYW5kbGluZy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbWRvcyAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLTsgRGVmaW5lIHRoZSBzaXplIG9mIG91ciBsb2NhbCBzdGFja3MuIEZvciByZWFsIG1vZGUgY29kZSB0aGV5IGNhbnQgYmUKLTsgdGhhdCBiaWcsIGJ1dCBmb3IgMzIgYml0IHByb3RlY3RlZCBtb2RlIGNvZGUgd2UgY2FuIG1ha2UgdGhlbSBuaWNlIGFuZAotOyBsYXJnZSBzbyB0aGF0IGNvbXBsZXggQyBmdW5jdGlvbnMgY2FuIGJlIHVzZWQuCi0KLWlmZGVmIGZsYXRtb2RlbAotTU9VU0VfU1RBQ0sgRVFVIDQwOTYKLVRJTUVSX1NUQUNLIEVRVSA0MDk2Ci1LRVlfU1RBQ0sgICBFUVUgMTAyNAotSU5UMTBfU1RBQ0sgRVFVIDEwMjQKLUlSUV9TVEFDSyAgIEVRVSAxMDI0Ci1lbHNlCi1NT1VTRV9TVEFDSyBFUVUgMTAyNAotVElNRVJfU1RBQ0sgRVFVIDUxMgotS0VZX1NUQUNLICAgRVFVIDI1NgotSU5UMTBfU1RBQ0sgRVFVIDI1NgotSVJRX1NUQUNLICAgRVFVIDI1NgotZW5kaWYKLQotaWZkZWYgICBVU0VfTkFTTQotCi07IE1hY3JvIHRvIGxvYWQgRFMgYW5kIEVTIHJlZ2lzdGVycyB3aXRoIGNvcnJlY3QgdmFsdWUuCi0KLSVpbWFjcm8gICBMT0FEX0RTIDAKLSVpZmRlZiAgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXQotICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KLSVlbHNlCi0gICAgICAgIHB1c2ggICAgYXgKLSAgICAgICAgbW92ICAgICBheCxfREFUQQotICAgICAgICBtb3YgICAgIGRzLGF4Ci0gICAgICAgIHBvcCAgICAgYXgKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTm90ZSB0aGF0IGludGVycnVwdHMgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGUgZm9sbG93aW5nIHN0YWNrCi07ICVpbWFjcm8gZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLCBidXQgd2UgZG8gbm90IGVuYWJsZSB0aGVtIGFnYWluLiBOb3JtYWxseQotOyB0aGVzZSAlaW1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gaW50ZXJydXB0IGhhbmRsZXJzIHNvIGludGVycnVwdHMgc2hvdWxkCi07IGFscmVhZHkgYmUgb2ZmLiBXZSB0dXJuIHRoZW0gYmFjayBvbiBleHBsaWNpdGx5IGxhdGVyIGlmIHRoZSB1c2VyIGNvZGUKLTsgbmVlZHMgdGhlbSB0byBiZSBiYWNrIG9uLgotCi07IE1hY3JvIHRvIHN3aXRjaCB0byBhIG5ldyBsb2NhbCBzdGFjay4KLQotJWltYWNybyBORVdTVEsgIDEKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgW3NlZ18lMV0sc3MKLSAgICAgICAgbW92ICAgICBbcHRyXyUxXSxfc3AKLSAgICAgICAgbW92ICAgICBbVGVtcFNlZ10sZHMKLSAgICAgICAgbW92ICAgICBzcyxbVGVtcFNlZ10KLSAgICAgICAgbW92ICAgICBfc3Asb2Zmc2V0ICUxCi0lZW5kbWFjcm8KLQotOyAlaW1hY3JvIHRvIHN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2suCi0KLSVpbWFjcm8gICBSRVNUU1RLICAgMQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBzcyxbc2VnXyUxXQotICAgICAgICBtb3YgICAgIF9zcCxbcHRyXyUxXQotJWVuZG1hY3JvCi0KLTsgJWltYWNybyB0byBzd2FwIHRoZSBjdXJyZW50IHN0YWNrIHdpdGggdGhlIG9uZSBzYXZlZCBhd2F5LgotCi0laW1hY3JvIFNXQVBTVEsgMQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBheCxzcwotICAgICAgICB4Y2hnICAgIGF4LFtzZWdfJTFdCi0gICAgICAgIG1vdiAgICAgc3MsYXgKLSAgICAgICAgeGNoZyAgICBfc3AsW3B0cl8lMV0KLSVlbmRtYWNybwotCi1lbHNlCi0KLTsgTWFjcm8gdG8gbG9hZCBEUyBhbmQgRVMgcmVnaXN0ZXJzIHdpdGggY29ycmVjdCB2YWx1ZS4KLQotTUFDUk8gICBMT0FEX0RTCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10KLSAgICAgICAgbW92ICAgICBlcyxbY3M6X1BNX3NhdmVkRFNdCi1lbHNlCi0gICAgICAgIHB1c2ggICAgYXgKLSAgICAgICAgbW92ICAgICBheCxfREFUQQotICAgICAgICBtb3YgICAgIGRzLGF4Ci0gICAgICAgIHBvcCAgICAgYXgKLWVuZGlmCi1FTkRNCi0KLTsgTm90ZSB0aGF0IGludGVycnVwdHMgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGUgZm9sbG93aW5nIHN0YWNrCi07IG1hY3JvIGZvciBjb3JyZWN0IG9wZXJhdGlvbiwgYnV0IHdlIGRvIG5vdCBlbmFibGUgdGhlbSBhZ2Fpbi4gTm9ybWFsbHkKLTsgdGhlc2UgbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiBpbnRlcnJ1cHQgaGFuZGxlcnMgc28gaW50ZXJydXB0cyBzaG91bGQKLTsgYWxyZWFkeSBiZSBvZmYuIFdlIHR1cm4gdGhlbSBiYWNrIG9uIGV4cGxpY2l0bHkgbGF0ZXIgaWYgdGhlIHVzZXIgY29kZQotOyBuZWVkcyB0aGVtIHRvIGJlIGJhY2sgb24uCi0KLTsgTWFjcm8gdG8gc3dpdGNoIHRvIGEgbmV3IGxvY2FsIHN0YWNrLgotCi1NQUNSTyAgIE5FV1NUSyAgc3RrbmFtZQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBbc2VnXyZzdGtuYW1lJl0sc3MKLSAgICAgICAgbW92ICAgICBbcHRyXyZzdGtuYW1lJl0sX3NwCi0gICAgICAgIG1vdiAgICAgW1RlbXBTZWddLGRzCi0gICAgICAgIG1vdiAgICAgc3MsW1RlbXBTZWddCi0gICAgICAgIG1vdiAgICAgX3NwLG9mZnNldCBzdGtuYW1lCi1FTkRNCi0KLTsgTWFjcm8gdG8gc3dpdGNoIGJhY2sgdG8gdGhlIG9sZCBzdGFjay4KLQotTUFDUk8gICBSRVNUU1RLIHN0a25hbWUKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgc3MsW3NlZ18mc3RrbmFtZSZdCi0gICAgICAgIG1vdiAgICAgX3NwLFtwdHJfJnN0a25hbWUmXQotRU5ETQotCi07IE1hY3JvIHRvIHN3YXAgdGhlIGN1cnJlbnQgc3RhY2sgd2l0aCB0aGUgb25lIHNhdmVkIGF3YXkuCi0KLU1BQ1JPICAgU1dBUFNUSyBzdGtuYW1lCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIGF4LHNzCi0gICAgICAgIHhjaGcgICAgYXgsW3NlZ18mc3RrbmFtZSZdCi0gICAgICAgIG1vdiAgICAgc3MsYXgKLSAgICAgICAgeGNoZyAgICBfc3AsW3B0cl8mc3RrbmFtZSZdCi1FTkRNCi0KLWVuZGlmCi0KLWJlZ2RhdGFzZWcgIF9wbWRvcwotCi1pZmRlZiBmbGF0bW9kZWwKLSAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAotZW5kaWYKLSAgICBjZXh0ZXJuIF9QTV9jcml0SGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fYnJlYWtIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV90aW1lckhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX3J0Y0hhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2tleUhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2tleTE1SGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fbW91c2VIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9pbnQxMEhhbmRsZXIsQ1BUUgotCi0gICAgY2V4dGVybiBfUE1fY3RybENQdHIsRFBUUgotICAgIGNleHRlcm4gX1BNX2N0cmxCUHRyLERQVFIKLSAgICBjZXh0ZXJuIF9QTV9jcml0UHRyLERQVFIKLQotICAgIGNleHRlcm4gX1BNX3ByZXZUaW1lcixGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZSVEMsRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2S2V5LEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldktleTE1LEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkJyZWFrLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkN0cmxDLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkNyaXRpY2FsLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxUaW1lcixVTE9ORwotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsUlRDLFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxLZXksVUxPTkcKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbEtleTE1LFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxJbnQxMCxVTE9ORwotCi1jcHVibGljIF9QTV9wbWRvc0RhdGFTdGFydAotCi07IEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgb2YgdGhlIGxvY2FsIHN0YWNrcyB0aGF0IHdlIG5lZWQuIFRoZXNlIHN0YWNrcwotOyBhcmUgbm90IHZlcnkgbGFyZ2UsIGJ1dCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIGZvciBtb3N0IHB1cnBvc2VzCi07IChnZW5lcmFsbHkgeW91IHdhbnQgdG8gaGFuZGxlIHRoZXNlIGludGVycnVwdHMgcXVpY2tseSwgc2ltcGx5IHN0b3JpbmcKLTsgdGhlIGluZm9ybWF0aW9uIGZvciBsYXRlciBhbmQgdGhlbiByZXR1cm5pbmcpLiBJZiB5b3UgbmVlZCBiaWdnZXIKLTsgc3RhY2tzIHRoZW4gY2hhbmdlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiBoZXJlLgotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgTU9VU0VfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotTXNTdGFjazogICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfTXNTdGFjayBEVUlOVCAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX01zU3RhY2sgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBJTlQxMF9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1JbnQxMFN0YWNrOiAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9JbnQxMFN0YWNrICBEVUlOVCAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfSW50MTBTdGFjayAgZHcgICAgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIFRJTUVSX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLVRtU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX1RtU3RhY2sgRFVJTlQgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19UbVN0YWNrIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgVElNRVJfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotUnRjU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfUnRjU3RhY2sgRFVJTlQgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX1J0Y1N0YWNrIGR3ICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci1SdGNJbnNpZGUgICBkdyAgICAgIDAgICAgICAgICAgIDsgQXJlIHdlIHN0aWxsIGhhbmRsaW5nIGN1cnJlbnQgaW50ZXJydXB0Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBLRVlfU1RBQ0sgICAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1LeVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9LeVN0YWNrIERVSU5UICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfS3lTdGFjayBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLUt5SW5zaWRlICAgIGR3ICAgICAgMCAgICAgICAgICAgOyBBcmUgd2Ugc3RpbGwgaGFuZGxpbmcgY3VycmVudCBpbnRlcnJ1cHQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIEtFWV9TVEFDSyAgICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLUt5MTVTdGFjazogICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX0t5MTVTdGFjayAgIERVSU5UICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19LeTE1U3RhY2sgICBkdyAgICAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi1UZW1wU2VnICAgICBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgc3RhY2sgc2VnbWVudAotCi1jcHVibGljIF9QTV9wbWRvc0RhdGFFbmQKLQotZW5kZGF0YXNlZyAgX3BtZG9zCi0KLWJlZ2NvZGVzZWcgIF9wbWRvcyAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotY3B1YmxpYyBfUE1fcG1kb3NDb2RlU3RhcnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fbW91c2VJU1IgLSBNb3VzZSBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnRlcnJ1cHQgc3Vicm91dGluZSBjYWxsZWQgYnkgdGhlIG1vdXNlIGRyaXZlciB1cG9uIGludGVycnVwdHMsIHRvCi07IGRpc3BhdGNoIGNvbnRyb2wgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBJbnRlcnJ1cHRzIGFyZSBvbgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgSXQgaXMgX2V4dHJlbWVseV8gaW1wb3J0YW50IHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBleHRlbmRlZCByZWdpc3RlcnMKLTsgYXMgdGhlc2UgbWF5IHdlbGwgYmUgdHJhc2hlZCBieSB0aGUgcm91dGluZXMgY2FsbGVkIGZyb20gaGVyZSBhbmQgbm90Ci07IHJlc3RvcmVkIGNvcnJlY3RseSBieSB0aGUgbW91c2UgaW50ZXJmYWNlIG1vZHVsZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIEZvciBtb3VzZSBoYW5kbGVycyB0aGlzIGlzIG5vdCBhCi07ICAgICAgIHByb2JsZW0sIGFzIHRoZSBtb3VzZSBkcml2ZXIgYXJiaXRyYXRlcyBjYWxscyB0byB0aGUgdXNlciBtb3VzZQotOyAgICAgICBoYW5kbGVyIGZvciB1cy4KLTsKLTsgRW50cnk6ICAgIEFYICAtIENvbmRpdGlvbiBtYXNrIGdpdmluZyByZWFzb24gZm9yIGNhbGwKLTsgICAgICAgICAgIEJYICAtIE1vdXNlIGJ1dHRvbiBzdGF0ZQotOyAgICAgICAgICAgQ1ggIC0gSG9yaXpvbnRhbCBjdXJzb3IgY29vcmRpbmF0ZQotOyAgICAgICAgICAgRFggIC0gVmVydGljYWwgY3Vyc29yIGNvb3JkaW5hdGUKLTsgICAgICAgICAgIFNJICAtIEhvcml6b250YWwgbWlja2V5IHZhbHVlCi07ICAgICAgICAgICBESSAgLSBWZXJ0aWNhbCBtaWNrZXkgdmFsdWUKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pZmRlZiAgIERKR1BQCi1jcHJvY3N0YXJ0ICBfUE1fbW91c2VJU1IKLWVsc2UKLWNwcm9jZmFyICAgIF9QTV9tb3VzZUlTUgotZW5kaWYKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgTkVXU1RLICBNc1N0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLQotOyBDYWxsIHRoZSBpbnN0YWxsZWQgaGlnaCBsZXZlbCBDIGNvZGUgcm91dGluZQotCi0gICAgICAgIGNscmhpICAgZHggICAgICAgICAgICAgIDsgQ2xlYXIgb3V0IGhpZ2ggb3JkZXIgdmFsdWVzCi0gICAgICAgIGNscmhpICAgY3gKLSAgICAgICAgY2xyaGkgICBieAotICAgICAgICBjbHJoaSAgIGF4Ci0gICAgICAgIHNnbmhpICAgc2kKLSAgICAgICAgc2duaGkgICBkaQotCi0gICAgICAgIHB1c2ggICAgX2RpCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIHB1c2ggICAgX2R4Ci0gICAgICAgIHB1c2ggICAgX2N4Ci0gICAgICAgIHB1c2ggICAgX2J4Ci0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgIDsgRW5hYmxlIGludGVycnVwdHMKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fbW91c2VIYW5kbGVyXQotICAgICAgICBfYWRkICAgIHNwLDEyLDI0Ci0KLSAgICAgICAgUkVTVFNUSyBNc1N0YWNrICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0KLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIHJldCAgICAgICAgICAgICAgICAgICAgIDsgV2UgYXJlIGRvbmUhIQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV90aW1lcklTUiAtIFRpbWVyIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgdGltZXIgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBNYWtlIHN1cmUgeW91ciBDIGNvZGUgZXhlY3V0ZXMgYXMKLTsgICAgICAgcXVpY2tseSBhcyBwb3NzaWJsZSwgc2luY2UgYSB0aW1lciBvdmVycnVuIHdpbGwgc2ltcGx5IGhhbmcgdGhlCi07ICAgICAgIHN5c3RlbS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fdGltZXJJU1IKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLQotICAgICAgICBORVdTVEsgIFRtU3RhY2sgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV90aW1lckhhbmRsZXJdCi0gICAgICAgIFJFU1RTVEsgVG1TdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotCi0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jaGFpblByZXZUaW1lciAtIENoYWluIHRvIHByZXZpb3VzIHRpbWVyIGludGVycnVwdCBhbmQgcmV0dXJuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDaGFpbnMgdG8gdGhlIHByZXZpb3VzIHRpbWVyIGludGVycnVwdCByb3V0aW5lIGFuZCByZXR1cm5zIGNvbnRyb2wKLTsgYmFjayB0byB0aGUgaGlnaCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jaGFpblByZXZUaW1lcgotCi1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxUaW1lcl0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICByZXQKLWVsc2UKLSAgICAgICAgU1dBUFNUSyBUbVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gcHJldmlvdXMgc3RhY2sKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIHN0YXRlIG9mIGludGVycnVwdCBmbGFnCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2VGltZXJdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2VGltZXJdCi1lbmRpZgotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgc3RhdGUgb2YgaW50ZXJydXB0IGZsYWcKLSAgICAgICAgU1dBUFNUSyBUbVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gQyBzdGFjayBhZ2FpbgotICAgICAgICByZXQKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVkgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi0lbWFjcm8gIElPREVMQVlOIDEKLSVyZXAgICAgJTEKLSAgICAgICAgREVMQVkKLSVlbmRyZXAKLSVlbmRtYWNybwotZWxzZQotbWFjcm8gICBERUxBWQotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotZW5kbQotbWFjcm8gICBJT0RFTEFZTiAgICBOCi0gICAgcmVwdCAgICBOCi0gICAgICAgIERFTEFZCi0gICAgZW5kbQotZW5kbQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fcnRjSVNSIC0gUmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgdGltZXIgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBNYWtlIHN1cmUgeW91ciBDIGNvZGUgZXhlY3V0ZXMgYXMKLTsgICAgICAgcXVpY2tseSBhcyBwb3NzaWJsZSwgc2luY2UgYSB0aW1lciBvdmVycnVuIHdpbGwgc2ltcGx5IGhhbmcgdGhlCi07ICAgICAgIHN5c3RlbS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fcnRjSVNSCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLTsgQ2xlYXIgcHJpb3JpdHkgaW50ZXJydXB0IGNvbnRyb2xsZXIgYW5kIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIHNvIHdlCi07IGRvbnQgbG9jayB0aGluZ3MgdXAgZm9yIGxvbmcuCi0KLSAgICAgICAgbW92ICAgICBhbCwyMGgKLSAgICAgICAgb3V0ICAgICAwQTBoLGFsCi0gICAgICAgIG91dCAgICAgMDIwaCxhbAotCi07IENsZWFyIHJlYWwtdGltZSBjbG9jayB0aW1lb3V0Ci0KLSAgICAgICAgaW4gICAgICBhbCw3MGggICAgICAgICAgICAgIDsgUmVhZCBDTU9TIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIHB1c2ggICAgX2F4ICAgICAgICAgICAgICAgICA7ICBhbmQgc2F2ZSBmb3IgbGF0ZXIKLSAgICAgICAgSU9ERUxBWU4gMwotICAgICAgICBtb3YgICAgIGFsLDBDaAotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIGluICAgICAgYWwsNzFoCi0KLTsgQ2FsbCB0aGUgQyBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbgotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgY21wICAgICBbQllURSBSdGNJbnNpZGVdLDEgIDsgQ2hlY2sgZm9yIG11dHVhbCBleGNsdXNpb24KLSAgICAgICAgamUgICAgICBAQEV4aXQKLSAgICAgICAgbW92ICAgICBbQllURSBSdGNJbnNpZGVdLDEKLSAgICAgICAgTkVXU1RLICBSdGNTdGFjayAgICAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBpbnRlcnJ1cHRzCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX3J0Y0hhbmRsZXJdCi0gICAgICAgIFJFU1RTVEsgUnRjU3RhY2sgICAgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgbW92ICAgICBbQllURSBSdGNJbnNpZGVdLDAKLQotQEBFeGl0OiBwb3AgICAgIF9heAotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZXN0b3JlIENNT1MgaW5kZXggcmVnaXN0ZXIKLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotaWZkZWYgZmxhdG1vZGVsCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9pcnFJU1JUZW1wbGF0ZSAtIEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIElSUSB0ZW1wbGF0ZQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIGFueSBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKLTsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCi07IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIE1ha2Ugc3VyZSB5b3VyIEMgY29kZSBleGVjdXRlcyBhcwotOyAgICAgICBxdWlja2x5IGFzIHBvc3NpYmxlLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9pcnFJU1JUZW1wbGF0ZQotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIG1vdiAgICAgZWJ4LDAgICAgICAgICAgIDsgUmVsb2NhdGlvbiBhZGp1c3RtZW50IGZhY3RvcgotICAgICAgICBqbXAgICAgIF9fSVJRRW50cnkKLQotOyBHbG9iYWwgdmFyaWFibGVzIHN0b3JlZCBpbiB0aGUgSVJRIHRodW5rIGNvZGUgc2VnbWVudAotCi1fQ0hhbmRsZXIgICAgICAgZGQgICAgICAwICAgICAgIDsgUG9pbnRlciB0byBDIGludGVycnVwdCBoYW5kbGVyCi1fUHJldklSUSAgICAgICAgZGQgICAgICAwICAgICAgIDsgUHJldmlvdXMgSVJRIGhhbmRsZXIKLSAgICAgICAgICAgICAgICBkZCAgICAgIDAKLV9JUlEgICAgICAgICAgICBkZCAgICAgIDAgICAgICAgOyBJUlEgd2UgYXJlIGhvb2tlZCBmb3IKLXB0cl9JUlFTdGFjayAgICBEVUlOVCAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfSVJRU3RhY2sgICAgZHcgICAgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLV9JbnNpZGUgICAgICAgICBkYiAgICAgIDAgICAgICAgOyBNdXR1YWwgZXhjbHVzaW9uIGZsYWcKLSAgICAgICAgQUxJR04gICA0Ci0gICAgICAgIGRjbGIgSVJRX1NUQUNLICAgICAgICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrCi1fSVJRU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLQotOyBDaGVjayBmb3IgYW5kIHJlamVjdCBzcHVyaW91cyBJUlEgNyBzaWduYWxzCi0KLV9fSVJRRW50cnk6Ci0gICAgICAgIGNtcCAgICAgW0JZVEUgY3M6ZWJ4K19JUlFdLDcgICAgOyBTcHVyaW91cyBJUlFzIG9jY3VyIG9ubHkgb24gSVJRIDcKLSAgICAgICAgam1wICAgICBAQFZhbGlkSVJRCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIG1vdiAgICAgYWwsMTAxMWIgICAgICAgICAgICA7IE9DVzM6IHJlYWQgSVNSCi0gICAgICAgIG91dCAgICAgMjBoLGFsICAgICAgICAgICAgICA7IChJbnRlbCBQZXJpcGhlcmFsIENvbXBvbmVudHMsIDE5OTEsCi0gICAgICAgIGluICAgICAgYWwsMjBoICAgICAgICAgICAgICA7IHAuIDMtMTg4KQotICAgICAgICBzaGwgICAgIGFsLDEgICAgICAgICAgICAgICAgOyBTZXQgQyA9IGJpdCA3IChJUlEgNykgb2YgSVNSIHJlZ2lzdGVyCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIGpjICAgICAgQEBWYWxpZElSUQotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotOyBTYXZlIGFsbCByZWdpc3RlcnMgZm9yIGR1cmF0aW9uIG9mIElSUSBoYW5kbGVyCi0KLUBAVmFsaWRJUlE6Ci0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0KLTsgU2VuZCBhbiBFT0kgdG8gdGhlIFBJQwotCi0gICAgICAgIG1vdiAgICAgYWwsMjBoICAgICAgICAgICAgICA7IFNlbmQgRU9JIHRvIFBJQwotICAgICAgICBjbXAgICAgIFtCWVRFIGVieCtfSVJRXSw4ICAgOyBDbGVhciBQSUMxIGZpcnN0IGlmIElSUSA+PSA4Ci0gICAgICAgIGpiICAgICAgQEAxCi0gICAgICAgIG91dCAgICAgMEEwaCxhbAotQEAxOiAgICBvdXQgICAgIDIwaCxhbAotCi07IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0KLSAgICAgICAgY21wICAgICBbQllURSBlYngrX0luc2lkZV0sMQotICAgICAgICBqZSAgICAgIEBAQ2hhaW5PbGRIYW5kbGVyCi0gICAgICAgIG1vdiAgICAgW0JZVEUgZWJ4K19JbnNpZGVdLDEKLQotOyBDYWxsIHRoZSBDIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uCi0KLSAgICAgICAgbW92ICAgICBbZWJ4K3NlZ19JUlFTdGFja10sc3MgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBtb3YgICAgIFtlYngrcHRyX0lSUVN0YWNrXSxlc3AKLSAgICAgICAgbW92ICAgICBbVGVtcFNlZ10sZHMKLSAgICAgICAgbW92ICAgICBzcyxbVGVtcFNlZ10KLSAgICAgICAgbGVhICAgICBlc3AsW2VieCtfSVJRU3RhY2tdCi0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBSZS1lbmFibGUgaW50ZXJydXB0cwotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBjYWxsICAgIFtEV09SRCBlYngrX0NIYW5kbGVyXQotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBzcyxbZWJ4K3NlZ19JUlFTdGFja10gICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgbW92ICAgICBlc3AsW2VieCtwdHJfSVJRU3RhY2tdCi0gICAgICAgIG9yICAgICAgZWF4LGVheAotICAgICAgICBqeiAgICAgIEBAQ2hhaW5PbGRIYW5kbGVyICAgOyBDaGFpbiBpZiBub3QgaGFuZGxlZCBmb3Igc2hhcmVkIElSUQotCi1AQEV4aXQ6IG1vdiAgICAgW0JZVEUgZWJ4K19JbnNpZGVdLDAKLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotQEBDaGFpbk9sZEhhbmRsZXI6Ci0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVieCtfUHJldklSUV0sMAotICAgICAgICBqeiAgICAgIEBARXhpdAotICAgICAgICBtb3YgICAgIFtCWVRFIGVieCtfSW5zaWRlXSwwCi0gICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCBlYngrX1ByZXZJUlFdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtEV09SRCBlYngrX1ByZXZJUlErNF0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgX1ByZXZJUlFdLGVheAotICAgICAgICBtb3YgICAgIFtEV09SRCBfUHJldklSUSs0XSxlYngKLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBqbXAgICAgIFtjczpfUHJldklSUV0gICAgICAgOyBDaGFpbiB0byBwcmV2aW91cyBJUlEgaGFuZGxlcgotCi1jcHJvY2VuZAotY3B1YmxpYyBfUE1faXJxSVNSVGVtcGxhdGVFbmQKLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2tleUlTUiAtIGtleWJvYXJkIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUga2V5Ym9hcmQgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBIb3dldmVyIHdlIGVuc3VyZSB3aXRoaW4gdGhpcyByb3V0aW5lCi07ICAgICAgIG11dHVhbCBleGNsdXNpb24gdG8gdGhlIGtleWJvYXJkIGhhbmRsaW5nIHJvdXRpbmUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2tleUlTUgotCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotCi0gICAgICAgIGNtcCAgICAgW0JZVEUgS3lJbnNpZGVdLDEgICA7IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0gICAgICAgIGplICAgICAgQEBSZWlzc3VlZAotCi0gICAgICAgIG1vdiAgICAgW0JZVEUgS3lJbnNpZGVdLDEKLSAgICAgICAgTkVXU1RLICBLeVN0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fa2V5SGFuZGxlcl0gICA7IENhbGwgQyBjb2RlCi0gICAgICAgIFJFU1RTVEsgS3lTdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotICAgICAgICBtb3YgICAgIFtCWVRFIEt5SW5zaWRlXSwwCi0KLUBARXhpdDogcG9wYWQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLTsgV2hlbiB0aGUgQklPUyBrZXlib2FyZCBoYW5kbGVyIG5lZWRzIHRvIGNoYW5nZSB0aGUgU0hJRlQgc3RhdHVzIGxpZ2h0cwotOyBvbiB0aGUga2V5Ym9hcmQsIGluIHRoZSBwcm9jZXNzIG9mIGRvaW5nIHRoaXMgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIKLTsgcmUtaXNzdWVzIGFub3RoZXIgaW50ZXJydXB0LCB3aGlsZSB0aGUgY3VycmVudCBoYW5kbGVyIGlzIHN0aWxsIGV4ZWN1dGluZy4KLTsgSWYgd2UgcmVjaWV2ZSBhbm90aGVyIGludGVycnVwdCB3aGlsZSBzdGlsbCBoYW5kbGluZyB0aGUgY3VycmVudCBvbmUsCi07IHRoZW4gc2ltcGx5IGNoYWluIGRpcmVjdGx5IHRvIHRoZSBwcmV2aW91cyBoYW5kbGVyLgotOwotOyBOb3RlIHRoYXQgZm9yIG1vc3QgRE9TIGV4dGVuZGVycywgdGhlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciB0aGF0IHdlCi07IGluc3RhbGwgdGFrZXMgY2FyZSBvZiB0aGlzIGZvciB1cy4KLQotQEBSZWlzc3VlZDoKLWlmZGVmICAgVE5UCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLSAgICAgICAgbW92ICAgICBheCwyNTBFaCAgICAgICAgOyBDYWxsIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnVuY3Rpb24KLSAgICAgICAgbW92ICAgICBlYngsW19QTV9wcmV2UmVhbEtleV0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotZWxzZQotICAgICAgICBwdXNoZgotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5XQotZW5kaWYKLWVuZGlmCi0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2NoYWluUHJldmtleSAtIENoYWluIHRvIHByZXZpb3VzIGtleSBpbnRlcnJ1cHQgYW5kIHJldHVybgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhaW5zIHRvIHRoZSBwcmV2aW91cyBrZXkgaW50ZXJydXB0IHJvdXRpbmUgYW5kIHJldHVybnMgY29udHJvbAotOyBiYWNrIHRvIHRoZSBoaWdoIGxldmVsIGludGVycnVwdCBoYW5kbGVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2NoYWluUHJldktleQotCi1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXldCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgcmV0Ci1lbHNlCi0KLTsgWUlLRVMhIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uLCB3aGVuIGV4ZWN1dGlvbiByZXR1cm5zIGZyb20gdGhlCi07IHByZXZpb3VzIGtleWJvYXJkIGhhbmRsZXIsIGludGVycnVwdHMgYXJlIHJlLWVuYWJsZWQhISBTaW5jZSB3ZSBleHBlY3QKLTsgaW50ZXJydXB0cyB0byByZW1haW4gb2ZmIGR1cmluZyB0aGUgZHVyYXRpb24gb2Ygb3VyIGhhbmRsZXIsIHRoaXMgY2FuCi07IGNhdXNlIGhhdm9jLiBIb3dldmVyIG91ciBzdGFjayBtYWNyb3MgYWx3YXlzIHR1cm4gb2ZmIGludGVycnVwdHMsIHNvIHRoZXkKLTsgd2lsbCBiZSBvZmYgd2hlbiB3ZSBleGl0IHRoaXMgcm91dGluZS4gT2J2aW91c2x5IHRoZXJlIGlzIGEgdGlueSB3ZWVueQotOyB3aW5kb3cgd2hlbiBpbnRlcnJ1cHRzIHdpbGwgYmUgZW5hYmxlZCwgYnV0IHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuCi07IGRvIGFib3V0IHRoaXMuCi0KLSAgICAgICAgU1dBUFNUSyBLeVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gcHJldmlvdXMgc3RhY2sKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5XQotZW5kaWYKLSAgICAgICAgU1dBUFNUSyBLeVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gQyBzdGFjayBhZ2FpbgotICAgICAgICByZXQKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2tleTE1SVNSIC0gSW50IDE1aCBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgaWYgd2UgaGF2ZSBiZWVuIGNhbGxlZCB0byBoYW5kbGUgdGhlIEludCAxNWgKLTsga2V5Ym9hcmQgaW50ZXJydXB0IGNhbGxvdXQgZnJvbSByZWFsIG1vZGUuCi07Ci07ICAgRW50cnk6ICBBWCAgLSBIYXJkd2FyZSBzY2FuIGNvZGUgdG8gcHJvY2VzcwotOyAgIEV4aXQ6ICAgQVggIC0gSGFyZHdhcmUgc2NhbiBjb2RlIHRvIHByb2Nlc3MgKDAgdG8gaWdub3JlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9rZXkxNUlTUgotCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBMT0FEX0RTCi0gICAgICAgIGNtcCAgICAgYWgsNEZoCi0gICAgICAgIGpueiAgICAgQEBOb3RPdXJzICAgICAgIDsgUXVpdCBpZiBub3Qga2V5Ym9hcmQgY2FsbG91dAotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0gICAgICAgIHhvciAgICAgYWgsYWggICAgICAgICAgIDsgQVggOj0gc2NhbiBjb2RlCi0gICAgICAgIE5FV1NUSyAgS3kxNVN0YWNrICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2tleTE1SGFuZGxlcl0gOyBDYWxsIEMgY29kZQotICAgICAgICBfYWRkICAgIHNwLDIsNAotICAgICAgICBSRVNUU1RLIEt5MTVTdGFjayAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgdGVzdCAgICBheCxheAotICAgICAgICBqeiAgICAgIEBAMQotICAgICAgICBzdGMgICAgICAgICAgICAgICAgICAgICA7IFNldCBjYXJyeSB0byBwcm9jZXNzIGFzIG5vcm1hbAotICAgICAgICBqbXAgICAgIEBAMgotQEAxOiAgICBjbGMgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGNhcnJ5IHRvIGlnbm9yZSBzY2FuIGNvZGUKLUBAMjogICAgcG9wYWQKLSAgICAgICAgam1wICAgICBAQEV4aXQgICAgICAgICAgOyBXZSBhcmUgZG9uZQotCi1AQE5vdE91cnM6Ci1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXkxNV0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotZWxzZQotICAgICAgICBwdXNoZgotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXkxNV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbX1BNX3ByZXZLZXkxNV0KLWVuZGlmCi1lbmRpZgotQEBFeGl0OiBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICByZXRmICAgIDQKLWVsc2UKLSAgICAgICAgcmV0ZiAgICAyCi1lbmRpZgotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9icmVha0lTUiAtIENvbnRyb2wgQnJlYWsgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDdHJsLUJyZWFrIGludGVycnVwdC4gV2Ugc2ltcGx5IHNldAotOyB0aGUgQ3RybC1CcmVhayBmbGFnIHRvIGEgMSBhbmQgbGVhdmUgKG5vdGUgdGhhdCB0aGlzIGlzIGFjY2Vzc2VkIHRocm91Z2gKLTsgYSBmYXIgcG9pbnRlciwgYXMgaXQgbWF5IHdlbGwgYmUgbG9jYXRlZCBpbiBjb252ZW50aW9uYWwgbWVtb3J5KS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fYnJlYWtJU1IKLQotICAgICAgICBzdGkKLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaCAgICBfYngKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxCUHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3RybEJQdHJdCi1lbmRpZgotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDEKLQotOyBSdW4gYWx0ZXJuYXRlIGJyZWFrIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdLDAKLSAgICAgICAgamUgICAgICBAQEV4aXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgbW92ICAgICBfYXgsMQotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgcG9wICAgICBfYXgKLSAgICAgICAgcG9wYWQKLQotQEBFeGl0OiBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2N0cmxCcmVha0hpdChpbnQgY2xlYXJGbGFnKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQ3RybC1CcmVhayBmbGFnIGFuZCBwb3NzaWJseSBjbGVhcnMgaXQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY3RybEJyZWFrSGl0Ci0KLSAgICAgICAgQVJHICAgICBjbGVhckZsYWc6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgcHVzaCAgICBlcwotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3RybEJQdHJdCi1lbHNlCi0gICAgICAgIGxlcyAgICAgYngsW19QTV9jdHJsQlB0cl0KLWVuZGlmCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCi0gICAgICAgIG1vdiAgICAgX2F4LFtfRVMgX2J4XQotICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDAKLQotQEBEb25lOiBwb3AgICAgIGVzCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2N0cmxDSVNSIC0gQ29udHJvbCBCcmVhayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIEN0cmwtQyBpbnRlcnJ1cHQuIFdlIHNpbXBseSBzZXQKLTsgdGhlIEN0cmwtQyBmbGFnIHRvIGEgMSBhbmQgbGVhdmUgKG5vdGUgdGhhdCB0aGlzIGlzIGFjY2Vzc2VkIHRocm91Z2gKLTsgYSBmYXIgcG9pbnRlciwgYXMgaXQgbWF5IHdlbGwgYmUgbG9jYXRlZCBpbiBjb252ZW50aW9uYWwgbWVtb3J5KS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fY3RybENJU1IKLQotICAgICAgICBzdGkKLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaCAgICBfYngKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxDUHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3RybENQdHJdCi1lbmRpZgotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDEKLQotOyBSdW4gYWx0ZXJuYXRlIGJyZWFrIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdLDAKLSAgICAgICAgamUgICAgICBAQEV4aXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgbW92ICAgICBfYXgsMAotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgcG9wICAgICBfYXgKLSAgICAgICAgcG9wYWQKLQotQEBFeGl0OiBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLSAgICAgICAgaXJldGQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2N0cmxDSGl0KGludCBjbGVhckZsYWcpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBDdHJsLUMgZmxhZyBhbmQgcG9zc2libHkgY2xlYXJzIGl0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2N0cmxDSGl0Ci0KLSAgICAgICAgQVJHICAgICBjbGVhckZsYWc6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgcHVzaCAgICBlcwotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3RybENQdHJdCi1lbHNlCi0gICAgICAgIGxlcyAgICAgYngsW19QTV9jdHJsQ1B0cl0KLWVuZGlmCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCi0gICAgICAgIG1vdiAgICAgX2F4LFtfRVMgX2J4XQotICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDAKLQotQEBEb25lOgotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2NyaXRpY2FsSVNSIC0gQ29udHJvbCBFcnJvciBoYW5kbGVyIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgTVNET1MgQ3JpdGljYWwgRXJyb3IgaW50ZXJydXB0LCB0byBkaXNwYXRjaAotOyBjb250cm9sIHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsCi07IHJlZ2lzdGVycyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gV2UgYWxzbyBwYXNzCi07IHRoZSB2YWx1ZXMgb2YgdGhlIEFYIGFuZCBESSByZWdpc3RlcnMgdG8gdGhlIGFzIHBvaW50ZXJzLCBzbyB0aGF0IHRoZQotOyB2YWx1ZXMgY2FuIGJlIG1vZGlmaWVkIGJlZm9yZSByZXR1cm5pbmcgdG8gTVNET1MuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2NyaXRpY2FsSVNSCi0KLSAgICAgICAgc3RpCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgX2J4ICAgICAgICAgICAgIDsgU2F2ZSByZWdpc3RlciB2YWx1ZXMgY2hhbmdlZAotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jcml0UHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3JpdFB0cl0KLWVuZGlmCi0gICAgICAgIG1vdiAgICAgW19FUyBfYnhdLGF4Ci0gICAgICAgIG1vdiAgICAgW19FUyBfYngrMl0sZGkKLQotOyBSdW4gYWx0ZXJuYXRlIGNyaXRpY2FsIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9jcml0SGFuZGxlcl0sMAotICAgICAgICBqZSAgICAgIEBATm9BbHRIYW5kbGVyCi0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIHB1c2ggICAgX2RpCi0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2NyaXRIYW5kbGVyXSAgOyBDYWxsIEMgY29kZQotICAgICAgICBfYWRkICAgIHNwLDQsOAotICAgICAgICBwb3BhZAotCi0gICAgICAgIHBvcCAgICAgX2J4Ci0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1AQE5vQWx0SGFuZGxlcjoKLSAgICAgICAgbW92ICAgICBheCwzICAgICAgICAgICAgOyBUZWxsIE1TRE9TIHRvIGZhaWwgdGhlIG9wZXJhdGlvbgotICAgICAgICBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2NyaXRpY2FsRXJyb3IoaW50ICpheFZhbCxpbnQgKmRpVmFsLGludCBjbGVhckZsYWcpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjcml0aWNhbCBlcnJvciBmbGFncywgYW5kIHRoZSB2YWx1ZXMgdGhhdAotOyBNU0RPUyBwYXNzZWQgaW4gdGhlIEFYIGFuZCBESSByZWdpc3RlcnMgdG8gb3VyIGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY3JpdGljYWxFcnJvcgotCi0gICAgICAgIEFSRyAgICAgYXhWYWw6RFBUUiwgZGlWYWw6RFBUUiwgY2xlYXJGbGFnOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIHB1c2ggICAgZXMKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2NyaXRQdHJdCi1lbHNlCi0gICAgICAgIGxlcyAgICAgYngsW19QTV9jcml0UHRyXQotZW5kaWYKLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHRoYW5rcyEKLSAgICAgICAgeG9yICAgICBfYXgsX2F4Ci0gICAgICAgIHhvciAgICAgX2RpLF9kaQotICAgICAgICBtb3YgICAgIGF4LFtfRVMgX2J4XQotICAgICAgICBtb3YgICAgIGRpLFtfRVMgX2J4KzJdCi0gICAgICAgIHRlc3QgICAgW0JZVEUgY2xlYXJGbGFnXSwxCi0gICAgICAgIGp6ICAgICAgQEBOb0NsZWFyCi0gICAgICAgIG1vdiAgICAgW1VMT05HIF9FUyBfYnhdLDAKLUBATm9DbGVhcjoKLSAgICAgICAgX2xlcyAgICBfYngsW2F4VmFsXQotICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxfYXgKLSAgICAgICAgX2xlcyAgICBfYngsW2RpVmFsXQotICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxfZGkKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9zZXRNb3VzZUhhbmRsZXIKLQotICAgICAgICBBUkcgICAgIG1vdXNlTWFzazpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIGVzCi0KLSAgICAgICAgbW92ICAgICBheCwwQ2ggICAgICAgICAgOyBBWCA6PSBGdW5jdGlvbiAxMiAtIGluc3RhbGwgaW50ZXJydXB0IHN1YgotICAgICAgICBtb3YgICAgIF9jeCxbbW91c2VNYXNrXSA7IENYIDo9IG1vdXNlIG1hc2sKLSAgICAgICAgbW92ICAgICBfZHgsb2Zmc2V0IF9QTV9tb3VzZUlTUgotICAgICAgICBwdXNoICAgIGNzCi0gICAgICAgIHBvcCAgICAgZXMgICAgICAgICAgICAgIDsgRVM6X0RYIC0+IG1vdXNlIGhhbmRsZXIKLSAgICAgICAgaW50ICAgICAzM2ggICAgICAgICAgICAgOyBDYWxsIG1vdXNlIGRyaXZlcgotCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotaWZkZWYgZmxhdG1vZGVsCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fbW91c2VQTUNCKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNb3VzZSByZWFsbW9kZSBjYWxsYmFjayByb3V0aW5lLiBVcG9uIGVudHJ5IHRvIHRoaXMgcm91dGluZSwgd2UgcmVjaWV2ZQotOyB0aGUgZm9sbG93aW5nIGZyb20gdGhlIERQTUkgc2VydmVyOgotOwotOyAgIEVudHJ5OiAgRFM6X1NJICAtPiBSZWFsIG1vZGUgc3RhY2sgYXQgdGltZSBvZiBjYWxsCi07ICAgICAgICAgICBFUzpfREkgIC0+IFJlYWwgbW9kZSByZWdpc3RlciBkYXRhIHN0cnVjdHVyZQotOyAgICAgICAgICAgU1M6X1NQICAtPiBMb2NrZWQgcHJvdGVjdGVkIG1vZGUgc3RhY2sgdG8gdXNlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX21vdXNlUE1DQgotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBtb3YgICAgIGVheCxbZXM6X2RpKzFDaF0gICAgOyBMb2FkIHJlZ2lzdGVyIHZhbHVlcyBmcm9tIHJlYWwgbW9kZQotICAgICAgICBtb3YgICAgIGVieCxbZXM6X2RpKzEwaF0KLSAgICAgICAgbW92ICAgICBlY3gsW2VzOl9kaSsxOGhdCi0gICAgICAgIG1vdiAgICAgZWR4LFtlczpfZGkrMTRoXQotICAgICAgICBtb3YgICAgIGVzaSxbZXM6X2RpKzA0aF0KLSAgICAgICAgbW92ICAgICBlZGksW2VzOl9kaV0KLSAgICAgICAgY2FsbCAgICBfUE1fbW91c2VJU1IgICAgICAgIDsgQ2FsbCB0aGUgbW91c2UgaGFuZGxlcgotICAgICAgICBwb3BhZAotCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOl9zaV0KLSAgICAgICAgbW92ICAgICBbZXM6X2RpKzJBaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gSVAgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGF4LFtkczpfc2krMl0KLSAgICAgICAgbW92ICAgICBbZXM6X2RpKzJDaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gQ1MgdmFsdWUKLSAgICAgICAgYWRkICAgICBbV09SRCBlczpfZGkrMkVoXSw0IDsgUmVtb3ZlIHJldHVybiBhZGRyZXNzIGZyb20gc3RhY2sKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgR28gYmFjayB0byByZWFsIG1vZGUhCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1faW50MTBQTUNCKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQxMCByZWFsbW9kZSBjYWxsYmFjayByb3V0aW5lLiBVcG9uIGVudHJ5IHRvIHRoaXMgcm91dGluZSwgd2UgcmVjaWV2ZQotOyB0aGUgZm9sbG93aW5nIGZyb20gdGhlIERQTUkgc2VydmVyOgotOwotOyAgIEVudHJ5OiAgRFM6RVNJICAtPiBSZWFsIG1vZGUgc3RhY2sgYXQgdGltZSBvZiBjYWxsCi07ICAgICAgICAgICBFUzpFREkgIC0+IFJlYWwgbW9kZSByZWdpc3RlciBkYXRhIHN0cnVjdHVyZQotOyAgICAgICAgICAgU1M6RVNQICAtPiBMb2NrZWQgcHJvdGVjdGVkIG1vZGUgc3RhY2sgdG8gdXNlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgICAgIF9QTV9pbnQxMFBNQ0IKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgZnMKLQotICAgICAgICBwdXNoZmQKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgbW92ICAgICBbZXM6ZWRpKzIwaF0sYXggICAgIDsgU2F2ZSByZXR1cm4gZmxhZyBzdGF0dXMKLSAgICAgICAgbW92ICAgICBheCxbZHM6ZXNpXQotICAgICAgICBtb3YgICAgIFtlczplZGkrMkFoXSxheCAgICAgOyBQbHVnIGluIHJldHVybiBJUCBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOmVzaSsyXQotICAgICAgICBtb3YgICAgIFtlczplZGkrMkNoXSxheCAgICAgOyBQbHVnIGluIHJldHVybiBDUyB2YWx1ZQotICAgICAgICBhZGQgICAgIFtXT1JEIGVzOmVkaSsyRWhdLDQgOyBSZW1vdmUgcmV0dXJuIGFkZHJlc3MgZnJvbSBzdGFjawotCi07IENhbGwgdGhlIGluc3RhbGwgaW50MTAgaGFuZGxlciBpbiBwcm90ZWN0ZWQgbW9kZS4gVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZAotOyB3aXRoIERTIHNldCB0byB0aGUgY3VycmVudCBkYXRhIHNlbGVjdG9yLCBhbmQgRVM6RURJIHBvaW50aW5nIHRoZSB0aGUKLTsgcmVhbCBtb2RlIERQTUkgcmVnaXN0ZXIgc3RydWN0dXJlIGF0IHRoZSB0aW1lIG9mIHRoZSBpbnRlcnJ1cHQuIFRoZQotOyBoYW5kbGUgbXVzdCBiZSB3cml0dGVuIGluIGFzc2VtYmxlciB0byBiZSBhYmxlIHRvIGV4dHJhY3QgdGhlIHJlYWwgbW9kZQotOyByZWdpc3RlciB2YWx1ZXMgZnJvbSB0aGUgc3RydWN0dXJlCi0KLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwb3AgICAgIGZzICAgICAgICAgICAgICAgICAgOyBGUzpFREkgLT4gcmVhbCBtb2RlIHJlZ2lzdGVycwotICAgICAgICBMT0FEX0RTCi0gICAgICAgIE5FV1NUSyAgSW50MTBTdGFjayAgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotCi0gICAgICAgIGNhbGwgICAgW19QTV9pbnQxMEhhbmRsZXJdCi0KLSAgICAgICAgUkVTVFNUSyBJbnQxMFN0YWNrICAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotICAgICAgICBwb3AgICAgIGZzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3BhZAotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBHbyBiYWNrIHRvIHJlYWwgbW9kZSEKLQotY3Byb2NlbmQKLQotZW5kaWYKLQotY3B1YmxpYyBfUE1fcG1kb3NDb2RlRW5kCi0KLWVuZGNvZGVzZWcgIF9wbWRvcwotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL192ZmxhdC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3ZmbGF0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5ODVhOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3ZmbGF0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgICAgICAgICAgQmFzZWQgb24gb3JpZ2luYWwgY29kZSBDb3B5cmlnaHQgMTk5NCBPdHRvIENocm9ucwotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIGxhdGVyCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZQotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgcGFnZSBmYXVsdCBoYW5kbGVyIGZvciB2aXJ0dWFsIGxpbmVhciBmcmFtZWJ1ZmZlcnMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotICAgICAgICBKVU1QUwotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfdmZsYXQgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1WRkxBVF9TVEFSVCAgICAgRVFVIDBGMDAwMDAwMGgKLVZGTEFUX0VORCAgICAgICBFUVUgMEYwM0ZGRkZGaAotUEFHRV9QUkVTRU5UICAgIEVRVSAxCi1QQUdFX05PVFBSRVNFTlQgRVFVIDAKLVBBR0VfUkVBRCAgICAgICBFUVUgMAotUEFHRV9XUklURSAgICAgIEVRVSAyCi0KLWlmZGVmICAgRE9TNEdXCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERPUzRHL1cgZmxhdCBsaW5lYXIgZnJhbWVidWZmZXIgZW11bGF0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYmVnZGF0YXNlZyAgX3ZmbGF0Ci0KLTsgTmVhciBwb2ludGVycyB0byB0aGUgcGFnZSBkaXJlY3RvcnkgYmFzZSBhbmQgb3VyIHBhZ2UgdGFibGVzLiBBbGwgb2YKLTsgdGhpcyBtZW1vcnkgaXMgYWx3YXlzIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IE1iIG9mIERPUyBtZW1vcnkuCi0KLVBEQlIgICAgICAgICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgUGFnZSBkaXJlY3RvcnkgYmFzZSByZWdpc3RlciAoQ1IzKQotYWNjZXNzUGFnZUFkZHIgIGRkICAwCi1hY2Nlc3NQYWdlVGFibGUgZGQgIDAKLQotOyBDYXVzZVdheSBwYWdlIGRpcmVjdG9yeSAmIDFzdCBwYWdlIHRhYmxlIGxpbmVhciBhZGRyZXNzZXMuCi0KLUNhdXNlV2F5RElSTGluZWFyIGRkIDAKLUNhdXNlV2F5MXN0TGluZWFyIGRkIDAKLQotOyBQbGFjZSB0byBzdG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIFBhZ2UgVGFibGUgRGlyZWN0b3J5IGJlZm9yZSB3ZQotOyBpbnRpYWxpc2VkIG91ciB2aXJ0dWFsIGJ1ZmZlciBjb2RlLgotCi1wYWdlRGlyZWN0b3J5OiAgcmVzZCAxMDI0ICAgICAgICAgICA7IFNhdmVkIHBhZ2UgdGFibGUgZGlyZWN0b3J5Ci0KLVZhbGlkQ1MgICAgICAgICBkdyAgMCAgICAgICAgICAgICAgIDsgVmFsaWQgQ1MgZm9yIHBhZ2UgZmF1bHRzCi1SaW5nMENTICAgICAgICAgZHcgIDAgICAgICAgICAgICAgICA7IE91ciByaW5nIDAgY29kZSBzZWxlY3RvcgotTGFzdFBhZ2UgICAgICAgIGRkICAwICAgICAgICAgICAgICAgOyBMYXN0IHBhZ2Ugd2UgbWFwcGVkIGluCi1CYW5rRnVuY0J1ZjogICAgcmVzYiAxMDEgICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIGJhbmsgc3dpdGNoIGNvZGUKLUJhbmtGdW5jUHRyICAgICBkZCAgb2Zmc2V0IEJhbmtGdW5jQnVmCi0KLUlOVDE0R2F0ZToKLUlOVDE0T2Zmc2V0ICAgICBkZCAgICAgIDAgICAgICAgICAgIDsgZWlwIG9mIG9yaWdpbmFsIHZlY3RvcgotSU5UMTRTZWxlY3RvciAgIGR3ICAgICAgMCAgICAgICAgICAgOyBjcyBvZiBvcmlnaW5hbCB2ZWN0b3IKLQotICAgICAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAotICAgICAgICBjZXh0ZXJuIFZGX2hhdmVDYXVzZVdheSxCT09MCi0KLWVuZGRhdGFzZWcgIF92ZmxhdAotCi1iZWdjb2Rlc2VnICBfdmZsYXQgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLSAgICAgICAgY2V4dGVybiBWRl9tYWxsb2MsRlBUUgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQRl9oYW5kbGVyNjRrIC0gUGFnZSBmYXVsdCBoYW5kbGVyIGZvciA2NGsgYmFua3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcwotOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCi07IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKLTsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKLTsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQotOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCi07IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKLTsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBQRl9oYW5kbGVyNjRrCi0KLTsgQ2hlY2sgaWYgdGhpcyBpcyBhIHByb2Nlc3NvciBleGVjZXB0aW9uIG9yIGEgcGFnZSBmYXVsdAotCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIG1vdiAgICAgYXgsW2NzOlZhbGlkQ1NdICAgICA7IFVzZSBDUyBvdmVycmlkZSB0byBhY2Nlc3MgZGF0YQotICAgICAgICBjbXAgICAgIFtzczplc3ArMTJdLGF4ICAgICAgOyBJcyB0aGlzIGEgcGFnZSBmYXVsdD8KLSAgICAgICAgam5lICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgTm9wZSwganVtcCB0byB0aGUgcHJldmlvdXMgaGFuZGxlcgotCi07IEdldCBhZGRyZXNzIG9mIHBhZ2UgZmF1bHQgYW5kIGNoZWNrIGlmIHdpdGhpbiBvdXIgaGFuZGxlcnMgcmFuZ2UKLQotICAgICAgICBtb3YgICAgIGVheCxjcjIgICAgICAgICAgICAgOyBFQlggaGFzIHBhZ2UgZmF1bHQgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgY21wICAgICBlYXgsVkZMQVRfU1RBUlQgICAgIDsgSXMgdGhlIGZhdWx0IGxlc3MgdGhhbiBvdXJzPwotICAgICAgICBqYiAgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKLSAgICAgICAgY21wICAgICBlYXgsVkZMQVRfRU5EICAgICAgIDsgSXMgdGhlIGZhdWx0IG1vcmUgdGhhbiBvdXJzPwotICAgICAgICBqYWUgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKLQotOyBUaGlzIGlzIG91ciBwYWdlIGZhdWx0LCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdAotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgbW92ICAgICBlYngsZWF4ICAgICAgICAgICAgIDsgRUJYIDo9IHBhZ2UgZmF1bHQgYWRkcmVzcwotICAgICAgICBhbmQgICAgIGVieCxpbnZlcnQgMEZGRkZoICAgOyBNYXNrIHRvIDY0ayBiYW5rIGJvdW5kYXJ5Ci0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXTsgTG9hZCBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KLQotOyBNYXAgaW4gdGhlIHBhZ2UgdGFibGUgZm9yIG91ciB2aXJ0dWFsIGZyYW1lYnVmZmVyIGFyZWEgZm9yIG1vZGlmaWNhdGlvbgotCi0gICAgICAgIG1vdiAgICAgZWRpLFtQREJSXSAgICAgICAgICA7IEVESSBwb2ludHMgdG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlZHgsZWJ4ICAgICAgICAgICAgIDsgRURYID0gbGluZWFyIGFkZHJlc3MKLSAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgIDsgRURYID0gb2Zmc2V0IHRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWR4LFtlZHgqNCtlZGldICAgICA7IEVEWCA9IHBoeXNpY2FsIHBhZ2UgdGFibGUgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGVheCxlZHgKLSAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KLSAgICAgICAgb3IgICAgICBlYXgsNwotICAgICAgICBtb3YgICAgIFtlZHhdLGVheAotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKLQotOyBNYXJrIGFsbCBwYWdlcyB2YWxpZCBmb3IgdGhlIG5ldyBwYWdlIGZhdWx0IGFyZWEKLQotICAgICAgICBtb3YgICAgIGVzaSxlYnggICAgICAgICAgICAgOyBFU0kgOj0gbGluZWFyIGFkZHJlc3MgZm9yIHBhZ2UKLSAgICAgICAgc2hyICAgICBlc2ksMTAKLSAgICAgICAgYW5kICAgICBlc2ksMEZGRmggICAgICAgICAgIDsgT2Zmc2V0IGludG8gcGFnZSB0YWJsZQotICAgICAgICBhZGQgICAgIGVzaSxbYWNjZXNzUGFnZUFkZHJdCi1pZmRlZiAgIFVTRV9OQVNNCi0lYXNzaWduIG9mZiAwCi0lcmVwIDE2Ci0gICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDAwMDAwMDAwMDFoIDsgRW5hYmxlIHBhZ2VzCi0lYXNzaWduIG9mZiBvZmYrNAotJWVuZHJlcAotZWxzZQotb2ZmID0gMAotUkVQVCAgICAxNgotICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwMDAwMDAwMDAxaCA7IEVuYWJsZSBwYWdlcwotb2ZmID0gb2ZmKzQKLUVORE0KLWVuZGlmCi0KLTsgTWFyayBhbGwgcGFnZXMgaW52YWxpZCBmb3IgdGhlIHByZXZpb3VzbHkgbWFwcGVkIGFyZWEKLQotICAgICAgICB4Y2hnICAgIGVzaSxbTGFzdFBhZ2VdICAgICAgOyBTYXZlIGxhc3QgcGFnZSBmb3IgbmV4dCBwYWdlIGZhdWx0Ci0gICAgICAgIHRlc3QgICAgZXNpLGVzaQotICAgICAgICBqeiAgICAgIEBARG9uZU1hcHBpbmcgICAgICAgOyBEb250IHVwZGF0ZSBpZiBmaXJzdCB0aW1lIHJvdW5kCi1pZmRlZiAgIFVTRV9OQVNNCi0lYXNzaWduIG9mZiAwCi0lcmVwIDE2Ci0gICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDBGRkZGRkZGRWggIDsgRGlzYWJsZSBwYWdlcwotJWFzc2lnbiBvZmYgb2ZmKzQKLSVlbmRyZXAKLWVsc2UKLW9mZiA9IDAKLVJFUFQgICAgMTYKLSAgICAgICAgYW5kICAgICBbRFdPUkQgZXNpK29mZl0sMEZGRkZGRkZFaCAgOyBEaXNhYmxlIHBhZ2VzCi1vZmYgPSBvZmYrNAotRU5ETQotZW5kaWYKLQotQEBEb25lTWFwcGluZzoKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICA7IEZsdXNoIHRoZSBUTEIKLQotOyBOb3cgcHJvZ3JhbSB0aGUgbmV3IFN1cGVyVkdBIHN0YXJ0aW5nIGJhbmsgYWRkcmVzcwotCi0gICAgICAgIG1vdiAgICAgZWF4LGVieCAgICAgICAgICAgICA7IEVBWCA6PSBwYWdlIGZhdWx0IGFkZHJlc3MKLSAgICAgICAgc2hyICAgICBlYXgsMTYKLSAgICAgICAgYW5kICAgICBlYXgsMEZGaCAgICAgICAgICAgIDsgTWFzayB0byAwLTI1NQotICAgICAgICBjYWxsICAgIFtCYW5rRnVuY1B0cl0gICAgICAgOyBDYWxsIHRoZSBiYW5rIHN3aXRjaCBmdW5jdGlvbgotCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3BhZAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBhZGQgICAgIGVzcCw0ICAgICAgICAgICAgICAgOyBQb3AgdGhlIGVycm9yIGNvZGUgZnJvbSBzdGFjawotICAgICAgICBpcmV0ZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gdG8gZmF1bHRpbmcgaW5zdHJ1Y3Rpb24KLQotQEBUb09sZEhhbmRsZXI6Ci0gICAgICAgIHBvcCAgICAgZWF4Ci1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGptcCBmYXIgZHdvcmQgW2NzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVsc2UKLSAgICAgICAgam1wICAgICBbRldPUkQgY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgotZW5kaWYKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUEZfaGFuZGxlcjRrICAtIFBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgNGsgYmFua3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcwotOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCi07IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKLTsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKLTsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQotOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCi07IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKLTsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBQRl9oYW5kbGVyNGsKLQotOyBGaWxsIGluIHdoZW4gd2UgaGF2ZSB0ZXN0ZWQgYWxsIHRoZSA2NEtiIGNvZGUKLQotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBqbXAgZmFyIGR3b3JkIFtjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCi1lbHNlCi0gICAgICAgIGptcCAgICAgW0ZXT1JEIGNzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgSW5zdGFsbEZhdWx0SGFuZGxlcih2b2lkICpiYXNlQWRkcixpbnQgYmFua1NpemUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnN0YWxsZXMgdGhlIHBhZ2UgZmF1bHQgaGFuZGxlciBkaXJlY3RseSBpbnQgdGhlIGludGVycnVwdCBkZXNjcmlwdG9yCi07IHRhYmxlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLiBUaGlzIG9mIGNvdXJzZSByZXF1aXJlcyByaW5nIDAgYWNjZXNzLAotOyBidXQgbm9uZSBvZiB0aGlzIHN0dWZmIHdpbGwgcnVuIHdpdGhvdXQgcmluZyAwIQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluc3RhbGxGYXVsdEhhbmRsZXIKLQotICAgICAgICBBUkcgICAgIGJhc2VBZGRyOlVMT05HLCBiYW5rU2l6ZTpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIExhc3RQYWdlXSwwICA7IE5vIHBhZ2VzIGhhdmUgYmVlbiBtYXBwZWQKLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICBtb3YgICAgIFtWYWxpZENTXSxheCAgICAgICAgOyBTYXZlIENTIHZhbHVlIGZvciBwYWdlIGZhdWx0cwotCi07IFB1dCBhZGRyZXNzIG9mIG91ciBwYWdlIGZhdWx0IGhhbmRsZXIgaW50byB0aGUgSURUIGRpcmVjdGx5Ci0KLSAgICAgICAgc3ViICAgICBlc3AsNiAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgc3BhY2Ugb24gc3RhY2sKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgc2lkdCAgICBbc3M6ZXNwXSAgICAgICAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVsc2UKLSAgICAgICAgc2lkdCAgICBbRldPUkQgc3M6ZXNwXSAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVuZGlmCi0gICAgICAgIHBvcCAgICAgYXggICAgICAgICAgICAgICAgICA7IGFkZCBlc3AsMgotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBBYnNvbHV0ZSBhZGRyZXNzIG9mIElEVAotICAgICAgICBhZGQgICAgIGVheCwxNCo4ICAgICAgICAgICAgOyBQb2ludCB0byBJbnQgIzE0Ci0KLTsgTm90ZSB0aGF0IEludGVycnVwdCBnYXRlcyBkbyBub3QgaGF2ZSB0aGUgaGlnaCBhbmQgbG93IHdvcmQgb2YgdGhlCi07IG9mZnNldCBpbiBhZGphY2VudCB3b3JkcyBpbiBtZW1vcnksIHRoZXJlIGFyZSA0IGJ5dGVzIHNlcGFyYXRpbmcgdGhlbS4KLQotICAgICAgICBtb3YgICAgIGVjeCxbZWF4XSAgICAgICAgICAgOyBHZXQgY3MgYW5kIGxvdyAxNiBiaXRzIG9mIG9mZnNldAotICAgICAgICBtb3YgICAgIGVkeCxbZWF4KzZdICAgICAgICAgOyBHZXQgaGlnaCAxNiBiaXRzIG9mIG9mZnNldCBpbiBkeAotICAgICAgICBzaGwgICAgIGVkeCwxNgotICAgICAgICBtb3YgICAgIGR4LGN4ICAgICAgICAgICAgICAgOyBlZHggaGFzIG9mZnNldAotICAgICAgICBtb3YgICAgIFtJTlQxNE9mZnNldF0sZWR4ICAgOyBTYXZlIG9mZnNldAotICAgICAgICBzaHIgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIFtJTlQxNFNlbGVjdG9yXSxjeCAgOyBTYXZlIG9yaWdpbmFsIGNzCi0gICAgICAgIG1vdiAgICAgW2VheCsyXSxjcyAgICAgICAgICA7IEluc3RhbGwgbmV3IGNzCi0gICAgICAgIG1vdiAgICAgZWR4LG9mZnNldCBQRl9oYW5kbGVyNjRrCi0gICAgICAgIGNtcCAgICAgW1VJTlQgYmFua1NpemVdLDQKLSAgICAgICAgam5lICAgICBAQDEKLSAgICAgICAgbW92ICAgICBlZHgsb2Zmc2V0IFBGX2hhbmRsZXI0awotQEAxOiAgICBtb3YgICAgIFtlYXhdLGR4ICAgICAgICAgICAgOyBJbnN0YWxsIGxvdyB3b3JkIG9mIG9mZnNldAotICAgICAgICBzaHIgICAgIGVkeCwxNgotICAgICAgICBtb3YgICAgIFtlYXgrNl0sZHggICAgICAgICAgOyBJbnN0YWxsIGhpZ2ggd29yZCBvZiBvZmZzZXQKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFJlbW92ZUZhdWx0SGFuZGxlcih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2xvc2VzIGRvd24gdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIgc2VydmljZXMgYW5kIHJlc3RvcmVzIHRoZSBwcmV2aW91cwotOyBwYWdlIGZhdWx0IGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUmVtb3ZlRmF1bHRIYW5kbGVyCi0KLSAgICAgICAgZW50ZXJfYwotCi07IFJlbW92ZSBwYWdlIGZhdWx0IGhhbmRsZXIgZnJvbSBJRFQKLQotICAgICAgICBzdWIgICAgIGVzcCw2ICAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBzcGFjZSBvbiBzdGFjawotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBzaWR0ICAgIFtzczplc3BdICAgICAgICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAotZWxzZQotICAgICAgICBzaWR0ICAgIFtGV09SRCBzczplc3BdICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAotZW5kaWYKLQotICAgICAgICBwb3AgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBhZGQgZXNwLDIKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgQWJzb2x1dGUgYWRkcmVzcyBvZiBJRFQKLSAgICAgICAgYWRkICAgICBlYXgsMTQqOCAgICAgICAgICAgIDsgUG9pbnQgdG8gSW50ICMxNAotICAgICAgICBtb3YgICAgIGN4LFtJTlQxNFNlbGVjdG9yXQotICAgICAgICBtb3YgICAgIFtlYXgrMl0sY3ggICAgICAgICAgOyBSZXN0b3JlIG9yaWdpbmFsIENTCi0gICAgICAgIG1vdiAgICAgZWR4LFtJTlQxNE9mZnNldF0KLSAgICAgICAgbW92ICAgICBbZWF4XSxkeCAgICAgICAgICAgIDsgSW5zdGFsbCBsb3cgd29yZCBvZiBvZmZzZXQKLSAgICAgICAgc2hyICAgICBlZHgsMTYKLSAgICAgICAgbW92ICAgICBbZWF4KzZdLGR4ICAgICAgICAgIDsgSW5zdGFsbCBoaWdoIHdvcmQgb2Ygb2Zmc2V0Ci0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBJbnN0YWxsQmFua0Z1bmMoaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnN0YWxscyB0aGUgYmFuayBzd2l0Y2ggZnVuY3Rpb24gYnkgcmVsb2NhdGluZyBpdCBpbnRvIG91ciBkYXRhIHNlZ21lbnQKLTsgYW5kIG1ha2luZyBpdCBpbnRvIGEgY2FsbGFibGUgZnVuY3Rpb24uIFdlIGRvIGl0IHRoaXMgd2F5IHRvIG1ha2UgdGhlCi07IGNvZGUgaWRlbnRpY2FsIHRvIHRoZSB3YXkgdGhhdCB0aGUgVmZsYXREIGRldmljZXMgd29yayB1bmRlciBXaW5kb3dzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluc3RhbGxCYW5rRnVuYwotCi0gICAgICAgIEFSRyAgICAgY29kZUxlbjpVSU5ULCBiYW5rRnVuYzpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZXNpLFtiYW5rRnVuY10gICAgICA7IENvcHkgdGhlIGNvZGUgaW50byBidWZmZXIKLSAgICAgICAgbW92ICAgICBlZGksb2Zmc2V0IEJhbmtGdW5jQnVmCi0gICAgICAgIG1vdiAgICAgZWN4LFtjb2RlTGVuXQotICAgIHJlcCBtb3ZzYgotICAgICAgICBtb3YgICAgIFtCWVRFIGVkaV0sMEMzaCAgICAgOyBUZXJtaW5hdGUgdGhlIGZ1bmN0aW9uIHdpdGggYSBuZWFyIHJldAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBJbml0UGFnaW5nKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbml0aWFsaXplcyBwYWdpbmcgc3lzdGVtLiBJZiBwYWdpbmcgaXMgbm90IGVuYWJsZWQsIGJ1aWxkcyBhIHBhZ2UgdGFibGUKLTsgZGlyZWN0b3J5IGFuZCBwYWdlIHRhYmxlcyBmb3IgcGh5c2ljYWwgbWVtb3J5Ci07Ci07ICAgRXhpdDogICAgICAgMCAgIC0gU3VjY2Vzc2Z1bAotOyAgICAgICAgICAgICAgIC0xICAtIENvdWxkbid0IGluaXRpYWxpemUgcGFnaW5nIG1lY2hhbmlzbQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluaXRQYWdpbmcKLQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBwdXNoICAgIGVzaQotICAgICAgICBwdXNoICAgIGVkaQotCi07IEFyZSB3ZSBydW5uaW5nIHVuZGVyIENhdXNlV2F5PwotCi0gICAgICAgIG1vdiAgICAgYXgsMEZGRjloCi0gICAgICAgIGludCAgICAgMzFoCi0gICAgICAgIGpjICAgICAgQEBOb3RDYXVzZXdheQotICAgICAgICBjbXAgICAgIGVjeCwiQ0FVUyIKLSAgICAgICAgam56ICAgICBAQE5vdENhdXNld2F5Ci0gICAgICAgIGNtcCAgICAgZWR4LCJFV0FZIgotICAgICAgICBqbnogICAgIEBATm90Q2F1c2V3YXkKLQotICAgICAgICBtb3YgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMQotICAgICAgICBtb3YgICAgIFtDYXVzZVdheURJUkxpbmVhcl0sZXNpCi0gICAgICAgIG1vdiAgICAgW0NhdXNlV2F5MXN0TGluZWFyXSxlZGkKLQotOyBDaGVjayBmb3IgRFBNSQotCi0gICAgICAgIG1vdiAgICAgYXgsMGZmMDBoCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgaW50ICAgICAzMWgKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBzaHIgICAgIGVkaSwyCi0gICAgICAgIGFuZCAgICAgZWRpLDMKLSAgICAgICAgY21wICAgICBlZGksMgotICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm90IHN1cHBvcnRlZCB1bmRlciBEUE1JCi0KLSAgICAgICAgbW92ICAgICBlYXgsW0NhdXNlV2F5RElSTGluZWFyXQotICAgICAgICBqbXAgICAgIEBAQ29weUNSMwotCi1AQE5vdENhdXNld2F5OgotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIHRlc3QgICAgYXgsMyAgICAgICAgICAgICAgICAgICAgOyBXaGljaCByaW5nIGFyZSB3ZSBydW5uaW5nCi0gICAgICAgIGpueiAgICAgQEBFcnJFeGl0ICAgICAgICAgICAgICAgOyBOZWVkcyB6ZXJvIHJpbmcgdG8gYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwYWdlIHRhYmxlcyAoQ1IzKQotICAgICAgICBtb3YgICAgIGVheCxjcjAgICAgICAgICAgICAgICAgIDsgTG9hZCBDUjAKLSAgICAgICAgdGVzdCAgICBlYXgsODAwMDAwMDBoICAgICAgICAgICA7IElzIHBhZ2luZyBlbmFibGVkPwotICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm8sIHdlIG11c3QgaGF2ZSBwYWdpbmchCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IzICAgICAgICAgICAgICAgICA7IExvYWQgZGlyZWN0b3J5IGFkZHJlc3MKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAotCi1AQENvcHlDUjM6Ci0gICAgICAgIG1vdiAgICAgW1BEQlJdLGVheCAgICAgICAgICAgICAgOyBTYXZlIGl0Ci0gICAgICAgIG1vdiAgICAgZXNpLGVheAotICAgICAgICBtb3YgICAgIGVkaSxvZmZzZXQgcGFnZURpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVjeCwxMDI0Ci0gICAgICAgIGNsZAotICAgICAgICByZXAgICAgIG1vdnNkICAgICAgICAgICAgICAgICAgIDsgQ29weSB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBkaXJlY3RvcnkKLSAgICAgICAgY21wICAgICBbRFdPUkQgYWNjZXNzUGFnZUFkZHJdLDA7IENoZWNrIGlmIHdlIGhhdmUgYWxsb2NhdGVkIHBhZ2UKLSAgICAgICAgam5lICAgICBAQEhhdmVSZWFsTWVtICAgICAgICAgICA7IHRhYmxlIGFscmVhZHkgKHdlIGNhbnQgZnJlZSBpdCkKLQotICAgICAgICBtb3YgICAgIGVheCwwMTAwaCAgICAgICAgICAgICAgIDsgRFBNSSBET1MgYWxsb2NhdGUKLSAgICAgICAgbW92ICAgICBlYngsODE5Mi8xNgotICAgICAgICBpbnQgICAgIDMxaCAgICAgICAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgODE5MiBieXRlcwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRmgKLSAgICAgICAgc2hsICAgICBlYXgsNCAgICAgICAgICAgICAgICAgICA7IEVBWCBwb2ludHMgdG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeQotICAgICAgICBhZGQgICAgIGVheCw0MDk1Ci0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduCi0gICAgICAgIG1vdiAgICAgW2FjY2Vzc1BhZ2VBZGRyXSxlYXgKLQotQEBIYXZlUmVhbE1lbToKLSAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXSAgICA7IEVBWCAtPiBwYWdlIHRhYmxlIGluIDFzdCBNYgotICAgICAgICBzaHIgICAgIGVheCwxMgotICAgICAgICBhbmQgICAgIGVheCwzRkZoICAgICAgICAgICAgICAgIDsgUGFnZSB0YWJsZSBvZmZzZXQKLSAgICAgICAgc2hsICAgICBlYXgsMgotICAgICAgICBjbXAgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMAotICAgICAgICBqeiAgICAgIEBATm90Q1cwCi0gICAgICAgIG1vdiAgICAgZWJ4LFtDYXVzZVdheTFzdExpbmVhcl0KLSAgICAgICAgam1wICAgICBAQFB1dDFzdAotCi1AQE5vdENXMDoKLSAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtlYnhdCi0gICAgICAgIGFuZCAgICAgZWJ4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIHRhYmxlIGZvciAxc3QgbWVnYWJ5dGUKLQotQEBQdXQxc3Q6Ci0gICAgICAgIGFkZCAgICAgZWF4LGVieAotICAgICAgICBtb3YgICAgIFthY2Nlc3NQYWdlVGFibGVdLGVheAotICAgICAgICBzdWIgICAgIGVheCxlYXggICAgICAgICAgICAgICAgIDsgTm8gZXJyb3IKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotQEBFcnJFeGl0OgotICAgICAgICBtb3YgICAgIGVheCwtMQotCi1AQEV4aXQ6IHBvcCAgICAgZWRpCi0gICAgICAgIHBvcCAgICAgZXNpCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIENsb3NlUGFnaW5nKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDbG9zZXMgdGhlIHBhZ2luZyBzeXN0ZW0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBDbG9zZVBhZ2luZwotCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIHB1c2ggICAgZXNpCi0gICAgICAgIHB1c2ggICAgZWRpCi0KLSAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXQotICAgICAgICBjYWxsICAgIEFjY2Vzc1BhZ2UgICAgICAgICAgICAgIDsgUmVzdG9yZSBBY2Nlc3NQYWdlIG1hcHBpbmcKLSAgICAgICAgbW92ICAgICBlZGksW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZXNpLG9mZnNldCBwYWdlRGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWN4LDEwMjQKLSAgICAgICAgY2xkCi0gICAgICAgIHJlcCAgICAgbW92c2QgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlIGRpcmVjdG9yeQotCi1AQEV4aXQ6IHBvcCAgICAgZWRpCi0gICAgICAgIHBvcCAgICAgZXNpCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBsb25nIEFjY2Vzc1BhZ2UobG9uZyBwaHlzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFwcyBhIGtub3duIHBhZ2UgdG8gZ2l2ZW4gcGh5c2ljYWwgbWVtb3J5Ci07ICAgRW50cnk6ICAgICAgRUFYIC0gUGh5c2ljYWwgbWVtb3J5Ci07ICAgRXhpdDogICAgICAgRUFYIC0gTGluZWFyIG1lbW9yeSBhZGRyZXNzIG9mIG1hcHBlZCBwaHlzIG1lbQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljICAgICBBY2Nlc3NQYWdlCi0KLSAgICAgICAgcHVzaCAgICBlZHgKLSAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KLSAgICAgICAgb3IgICAgICBlYXgsNwotICAgICAgICBtb3YgICAgIFtlZHhdLGVheAotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCi0gICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0KLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGxvbmcgR2V0UGh5c2ljYWxBZGRyZXNzKGxvbmcgbGluZWFyKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBsaW5lYXIgYWRkcmVzcwotOyAgIEVudHJ5OiAgICAgIEVBWCAtIExpbmVhciBhZGRyZXNzIHRvIGNvbnZlcnQKLTsgICBFeGl0OiAgICAgICBFQVggLSBQaHlzaWNhbCBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGF0aWMgICAgIEdldFBoeXNpY2FsQWRkcmVzcwotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIG1vdiAgICAgZWR4LGVheAotICAgICAgICBzaHIgICAgIGVkeCwyMiAgICAgICAgICAgICAgICAgIDsgRURYIGlzIHRoZSBkaXJlY3Rvcnkgb2Zmc2V0Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQotICAgICAgICBtb3YgICAgIGVkeCxbZWR4KjQrZWJ4XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgbW92ICAgICBlYXgsZWR4Ci0gICAgICAgIGNhbGwgICAgQWNjZXNzUGFnZSAgICAgICAgICAgICAgOyBBY2Nlc3MgdGhlIHBhZ2UgdGFibGUKLSAgICAgICAgbW92ICAgICBlZHgsZWF4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGFuZCAgICAgZWF4LDAzRkZoICAgICAgICAgICAgICAgOyBFQVggb2Zmc2V0IGludG8gcGFnZSB0YWJsZQotICAgICAgICBtb3YgICAgIGVheCxbZWR4K2VheCo0XSAgICAgICAgIDsgTG9hZCBwaHlzaWNhbCBhZGRyZXNzCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgQ3JlYXRlUGFnZVRhYmxlKGxvbmcgcGFnZURFbnRyeSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENyZWF0ZXMgYSBwYWdlIHRhYmxlIGZvciBzcGVjaWZpYyBhZGRyZXNzICg0TUIpCi07ICAgICAgIEVudHJ5OiAgRUFYIC0gUGFnZSBkaXJlY3RvcnkgZW50cnkgKHRvcCAxMC1iaXRzIG9mIGFkZHJlc3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGF0aWMgICAgIENyZWF0ZVBhZ2VUYWJsZQotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIHB1c2ggICAgZWRpCi0gICAgICAgIG1vdiAgICAgZWJ4LGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBlYXgsODE5MgotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBjYWxsICAgIFZGX21hbGxvYyAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBwYWdlIHRhYmxlIGRpcmVjdG9yeQotICAgICAgICBhZGQgICAgIGVzcCw0Ci0gICAgICAgIGFkZCAgICAgZWF4LDBGRkZoCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduICg0S0IpCi0gICAgICAgIG1vdiAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIHBhZ2UgdGFibGUgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgc3ViICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IEZpbGwgd2l0aCB6ZXJvCi0gICAgICAgIG1vdiAgICAgZWN4LDEwMjQKLSAgICAgICAgY2xkCi0gICAgICAgIHJlcCAgICAgc3Rvc2QgICAgICAgICAgICAgICAgICAgOyBDbGVhciBwYWdlIHRhYmxlCi0gICAgICAgIHN1YiAgICAgZWRpLDQwOTYKLSAgICAgICAgbW92ICAgICBlYXgsZWRpCi0gICAgICAgIGNhbGwgICAgR2V0UGh5c2ljYWxBZGRyZXNzCi0gICAgICAgIG1vdiAgICAgZWR4LFtQREJSXQotICAgICAgICBvciAgICAgIGVheCw3ICAgICAgICAgICAgICAgICAgIDsgUHJlc2VudC93cml0ZS91c2VyIGJpdAotICAgICAgICBtb3YgICAgIFtlZHgrZWJ4KjRdLGVheCAgICAgICAgIDsgU2F2ZSBwaHlzaWNhbCBhZGRyZXNzIGludG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotICAgICAgICBwb3AgICAgIGVkaQotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBNYXBQaHlzaWNhbDJMaW5lYXIodWxvbmcgcEFkZHIsIHVsb25nIGxBZGRyLCBpbnQgcGFnZXMsIGludCBmbGFncyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNYXBzIHBoeXNpY2FsIG1lbW9yeSBpbnRvIGxpbmVhciBtZW1vcnkKLTsgICBFbnRyeTogICAgICBwQWRkciAgIC0gUGh5c2ljYWwgYWRkcmVzcwotOyAgICAgICAgICAgICAgIGxBZGRyICAgLSBMaW5lYXIgYWRkcmVzcwotOyAgICAgICAgICAgICAgIHBhZ2VzICAgLSBOdW1iZXIgb2YgNEsgcGFnZXMgdG8gbWFwCi07ICAgICAgICAgICAgICAgZmxhZ3MgICAtIFBhZ2UgZmxhZ3MKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAgID0gICAgICAgcHJlc2VudAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAxICAgPSAgICAgICBSZWFkKDApL1dyaXRlKDEpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgTWFwUGh5c2ljYWwyTGluZWFyCi0KLSAgICAgICAgQVJHICAgICBwQWRkcjpVTE9ORywgbEFkZHI6VUxPTkcsIHBhZ2VzOlVJTlQsIHBmbGFnczpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIGFuZCAgICAgW1VMT05HIHBBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5Ci0gICAgICAgIGFuZCAgICAgW1VMT05HIGxBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5Ci0gICAgICAgIG1vdiAgICAgZWN4LFtwZmxhZ3NdCi0gICAgICAgIGFuZCAgICAgZWN4LDExYiAgICAgICAgICAgICAgICAgOyBKdXN0IHR3byBiaXRzCi0gICAgICAgIG9yICAgICAgZWN4LDEwMGIgICAgICAgICAgICAgICAgOyBTdXBlcnZpc29yIGJpdAotICAgICAgICBtb3YgICAgIFtwZmxhZ3NdLGVjeAotCi0gICAgICAgIG1vdiAgICAgZWR4LFtsQWRkcl0KLSAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgICAgICA7IEVEWCA9IERpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVzaSxbUERCUl0KLSAgICAgICAgbW92ICAgICBlZGksW3BhZ2VzXSAgICAgICAgICAgICA7IEVESSBwYWdlIGNvdW50Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtsQWRkcl0KLQotQEBDcmVhdGVMb29wOgotICAgICAgICBtb3YgICAgIGVjeCxbZXNpK2VkeCo0XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgdGVzdCAgICBlY3gsMSAgICAgICAgICAgICAgICAgICA7IElzIGl0IHByZXNlbnQ/Ci0gICAgICAgIGpueiAgICAgQEBUYWJsZU9LCi0gICAgICAgIG1vdiAgICAgZWF4LGVkeAotICAgICAgICBjYWxsICAgIENyZWF0ZVBhZ2VUYWJsZSAgICAgICAgIDsgQ3JlYXRlIGEgcGFnZSB0YWJsZQotQEBUYWJsZU9LOgotICAgICAgICBtb3YgICAgIGVheCxlYngKLSAgICAgICAgc2hyICAgICBlYXgsMTIKLSAgICAgICAgYW5kICAgICBlYXgsM0ZGaAotICAgICAgICBzdWIgICAgIGVheCwxMDI0Ci0gICAgICAgIG5lZyAgICAgZWF4ICAgICAgICAgICAgICAgICAgICAgOyBFQVggPSBwYWdlIGNvdW50IGluIHRoaXMgdGFibGUKLSAgICAgICAgaW5jICAgICBlZHggICAgICAgICAgICAgICAgICAgICA7IE5leHQgdGFibGUKLSAgICAgICAgbW92ICAgICBlYngsMCAgICAgICAgICAgICAgICAgICA7IE5leHQgdGltZSB3ZSdsbCBtYXAgMUsgcGFnZXMKLSAgICAgICAgc3ViICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICA7IFN1YnRyYWN0IG1hcHBlZCBwYWdlcyBmcm9tIHBhZ2UgY291bnQKLSAgICAgICAgam5zICAgICBAQENyZWF0ZUxvb3AgICAgICAgICAgICA7IENyZWF0ZSBtb3JlIHRhYmxlcyBpZiBuZWNlc3NhcnkKLQotICAgICAgICBtb3YgICAgIGVjeCxbcGFnZXNdICAgICAgICAgICAgIDsgRUNYID0gUGFnZSBjb3VudAotICAgICAgICBtb3YgICAgIGVzaSxbbEFkZHJdCi0gICAgICAgIHNociAgICAgZXNpLDEyICAgICAgICAgICAgICAgICAgOyBPZmZzZXQgcGFydCBpc24ndCBuZWVkZWQKLSAgICAgICAgbW92ICAgICBlZGksW3BBZGRyXQotQEBNYXBwaW5nTG9vcDoKLSAgICAgICAgbW92ICAgICBlYXgsZXNpCi0gICAgICAgIHNociAgICAgZWF4LDEwICAgICAgICAgICAgICAgICAgOyBFQVggPSBvZmZzZXQgdG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWF4LFtlYXgqNCtlYnhdICAgICAgICAgOyBFQVggPSBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgY2FsbCAgICBBY2Nlc3NQYWdlCi0gICAgICAgIG1vdiAgICAgZWJ4LGVzaQotICAgICAgICBhbmQgICAgIGVieCwzRkZoICAgICAgICAgICAgICAgIDsgRUJYID0gb2Zmc2V0IHRvIHBhZ2UgdGFibGUKLSAgICAgICAgbW92ICAgICBlZHgsZWRpCi0gICAgICAgIGFkZCAgICAgZWRpLDQwOTYgICAgICAgICAgICAgICAgOyBOZXh0IHBoeXNpY2FsIGFkZHJlc3MKLSAgICAgICAgaW5jICAgICBlc2kgICAgICAgICAgICAgICAgICAgICA7IE5leHQgbGluZWFyIHBhZ2UKLSAgICAgICAgb3IgICAgICBlZHgsW3BmbGFnc10gICAgICAgICAgICA7IFVwZGF0ZSBmbGFncy4uLgotICAgICAgICBtb3YgICAgIFtlYXgrZWJ4KjRdLGVkeCAgICAgICAgIDsgU3RvcmUgcGFnZSB0YWJsZSBlbnRyeQotICAgICAgICBsb29wICAgIEBATWFwcGluZ0xvb3AKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF92ZmxhdAotCi1lbmRpZgotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTE3YzcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIERPUwotKgotKiBEZXNjcmlwdGlvbjogIE1TRE9TIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIHRpbWluZyBmdW5jdGlvbiAqLwotCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBET1MgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRocmVhZCBwcmlvcml0aWVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBET1MgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRocmVhZCBwcmlvcml0aWVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpICAgICh2b2lkKShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICB1bG9uZyAgIHJlc29sdXRpb247Ci0KLSAgICBfX1pUaW1lckluaXQoKTsKLSAgICBVTFpUaW1lclJlc29sdXRpb24oJnJlc29sdXRpb24pOwotICAgIGZyZXEtPmxvdyA9ICh1bG9uZykoMTAwMDAwMDAwMDAuMCAvIHJlc29sdXRpb24pOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmxvdyA9IFVMWlJlYWRUaW1lKCkgKiAxMDAwMEw7ICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2OWQxMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgRE9TCi0qCi0qIERlc2NyaXB0aW9uOiAgMzItYml0IERPUyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaWJvb2wgX1ZBUkFQSSAgIF9FVlRfdXNlRXZlbnRzID0gdHJ1ZTsgIC8qIFRydWUgdG8gdXNlIGV2ZW50IGhhbmRsaW5nICAgKi8KLWlib29sIF9WQVJBUEkgICBfRVZUX2luc3RhbGxlZCA9IDA7ICAgICAvKiBFdmVudCBoYW5kZXJzIGluc3RhbGxlZD8gICAgICovCi11Y2hhciBfVkFSQVBJICAgKl9FVlRfYmlvc1B0ciA9IE5VTEw7ICAgLyogUG9pbnRlciB0byB0aGUgQklPUyBkYXRhIGFyZWEgKi8KLXN0YXRpYyBpYm9vbCAgICBoYXZlTW91c2UgPSBmYWxzZTsgICAgICAvKiBUcnVlIGlmIHdlIGhhdmUgYSBtb3VzZSAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLQotdm9pZCAgICBFVlRBUEkgX0VWVF9wb2xsSm95c3RpY2sodm9pZCk7Ci11aW50ICAgIEVWVEFQSSBfRVZUX2Rpc2FibGVJbnQodm9pZCk7Ci11aW50ICAgIEVWVEFQSSBfRVZUX3Jlc3RvcmVJbnQodWludCBmbGFncyk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NvZGVTdGFydCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY29kZUVuZCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY0NvZGVTdGFydCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY0NvZGVFbmQodm9pZCk7Ci1pbnQgICAgIEVWVEFQSSBfRVZUX2dldEtleUNvZGUodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKTsKLWludCAgICAgRVZUQVBJIEVWVF9yZGlueChpbnQgcG9ydCxpbnQgaW5kZXgpOwotdm9pZCAgICBFVlRBUEkgRVZUX3dyaW54KGludCBwb3J0LGludCBpbmRleCxpbnQgdmFsdWUpOwotCi0jaWZkZWYgTk9fS0VZQk9BUkRfSU5URVJSVVBUCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwdW1wIGFsbCBrZXlib2FyZCBtZXNzYWdlcyBmcm9tIHRoZSBCSU9TIGtleWJvYXJkCi1oYW5kbGVyIGludG8gb3VyIGV2ZW50IHF1ZXVlLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkIHVzaW5nIHRoZQotaW5zdGFsbGFibGUga2V5Ym9hcmQgaGFuZGxlciBpZiB0aGlzIGlzIGNhdXNpbmcgcHJvYmxlbXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRVZUQVBJIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCXVpbnQgICAga2V5LHBzOwotCi0JLyogU2luY2UgdGhlIGtleWJvYXJkIElTUiBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGlmIE5PX0lERV9CVUcgaGFzCi0JICogYmVlbiBkZWZpbmVkLCB3ZSBmaXJzdCBjaGVjayBmb3IgYW55IHBlbmRpbmcga2V5Ym9hcmQgZXZlbnRzCi0JICogaGVyZSwgYW5kIGlmIHRoZXJlIGFyZSBzb21lIGluc2VydCB0aGVtIGludG8gdGhlIGV2ZW50IHF1ZXVlIHRvCi0JICogYmUgcGlja2VkIHVwIGxhdGVyIC0gd2hhdCBhIGtsdWRnZS4KLQkgKi8KLQl3aGlsZSAoKGtleSA9IF9FVlRfZ2V0S2V5Q29kZSgpKSAhPSAwKSB7Ci0JCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JCWFkZEtleUV2ZW50KEVWVF9LRVlET1dOLCBrZXkpOwotCQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCQl9Ci0KLSAgICByZWdzLnguYXggPSAweDBCOyAgICAgICAgICAgLyogUmVzZXQgTW92ZSBNb3VzZSAqLwotICAgIFBNX2ludDg2KDB4MzMsJnJlZ3MsJnJlZ3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17Ci0gICAgcmV0dXJuICh1bG9uZylQTV9nZXRMb25nKF9FVlRfYmlvc1B0cisweDZDKSAqIDU1VUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVib290cyB0aGUgbWFjaGluZSBmcm9tIERPUyAod2FybSBib290KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlYm9vdCh2b2lkKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgdXNob3J0ICpyZWJvb3RUeXBlID0gUE1fbWFwUmVhbFBvaW50ZXIoMHg0MCwweDcyKTsKLSAgICAqcmVib290VHlwZSA9IDB4MTIzNDsKLSAgICBQTV9jYWxsUmVhbE1vZGUoMHhGRkZGLDB4MDAwMCwmcmVncywmc3JlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluY2x1ZGUgZ2VuZXJpYyByYXcgc2NhbmNvZGUga2V5Ym9hcmQgbW9kdWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU1VQUE9SVF9DVFJMX0FMVF9ERUwKLSNpbmNsdWRlICJjb21tb24va2V5Ym9hcmQuYyIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGZvb2xzIHRoZSBET1MgbW91c2UgZHJpdmVyIGludG8gdGhpbmtpbmcgdGhhdCBpdCBpcyBydW5uaW5nCi1pbiBncmFwaGljcyBtb2RlLCByYXRoZXIgdGhhbiB0ZXh0IG1vZGUgc28gd2UgYWx3YXlzIGdldCB2aXJ0dWFsIGNvb3JkaW5hdGVzCi1jb3JyZWN0bHkgcmF0aGVyIHRoYW4gY2hhcmFjdGVyIGNvb3JkaW5hdGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBfRVZUX2Zvb2xNb3VzZSh2b2lkKQotewotICAgIGludCBvbGRtb2RlID0gUE1fZ2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHg0OSk7Ci0gICAgUE1fc2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHg0OSwweDEwKTsKLSAgICBvbGRtb2RlIHw9IChFVlRfcmRpbngoMHgzQzQsMHgyKSA8PCA4KTsKLSAgICByZXR1cm4gb2xkbW9kZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHVuZm9vbHMgdGhlIERPUyBtb3VzZSBkcml2ZXIgYWZ0ZXIgd2UgaGF2ZSBmaW5pc2hlZCBjYWxsaW5nIGl0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF91bmZvb2xNb3VzZSgKLSAgICBpbnQgb2xkbW9kZSkKLXsKLSAgICBQTV9zZXRCeXRlKF9FVlRfYmlvc1B0cisweDQ5LG9sZG1vZGUpOwotCi0gICAgLyogU29tZSBtb3VzZSBkcml2ZXJzIHJlc2V0IHRoZSBwbGFuZSBtYXNrIHJlZ2lzdGVyIGZvciBWR0EgcGxhbmUgNAotICAgICAqIG1vZGVzLCB3aGljaCBzY3Jld3MgdXAgdGhlIGRpc3BsYXkgb24gc29tZSBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVycwotICAgICAqIGluIFN1cGVyVkdBIG1vZGVzLiBXZSByZXNldCB0aGUgdmFsdWUgYmFjayBhZ2FpbiBpbiBoZXJlIHRvIHNvbHZlCi0gICAgICogdGhlIHByb2JsZW0uCi0gICAgICovCi0gICAgRVZUX3dyaW54KDB4M0M0LDB4MixvbGRtb2RlID4+IDgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURldGVybWluZXMgaWYgd2UgaGF2ZSBhIG1vdXNlIGF0dGFjaGVkIGFuZCBmdW5jdGlvbmluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgZGV0ZWN0TW91c2Uodm9pZCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgUk1TUkVHUyBzcmVnczsKLSAgICB1Y2hhciAgICpwOwotICAgIGlib29sICAgcmV0dmFsOwotCi0gICAgcmVncy54LmF4ID0gMHgzNTMzOyAgICAgICAgICAgICAgICAgLyogR2V0IGludGVycnVwdCB2ZWN0b3IgMHgzMyAgICAqLwotICAgIFBNX2ludDg2eCgweDIxLCZyZWdzLCZyZWdzLCZzcmVncyk7Ci0KLSAgICAvKiBDaGVjayB0aGF0IGludGVycnVwdCB2ZWN0b3IgMHgzMyBpcyBub3QgYSB6ZXJvLCBhbmQgdGhhdCB0aGUgZmlyc3QKLSAgICAgKiBpbnN0cnVjdGlvbiBpbiB0aGUgaW50ZXJydXB0IHZlY3RvciBpcyBub3QgYW4gSVJFVCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIHAgPSBQTV9tYXBSZWFsUG9pbnRlcihzcmVncy5lcywgcmVncy54LmJ4KTsKLSAgICByZXR2YWwgPSAoKHNyZWdzLmVzICE9IDApIHx8IChyZWdzLnguYnggIT0gMCkpICYmIChQTV9nZXRCeXRlKHApICE9IDIwNyk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci13aGF0ICAgICAgICAtIEV2ZW50IGNvZGUKLW1lc3NhZ2UgICAgIC0gRXZlbnQgbWVzc2FnZQoteCx5ICAgICAgICAgLSBNb3VzZSBwb3NpdGlvbiBhdCB0aW1lIG9mIGV2ZW50Ci1idXRfc3RhdCAgICAtIE1vdXNlIGJ1dHRvbiBzdGF0dXMgYXQgdGltZSBvZiBldmVudAotCi1SRU1BUktTOgotQWRkcyBhIG5ldyBtb3VzZSBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB3aXRoaW4KLXRoZSBtb3VzZSBpbnRlcnJ1cHQgc3Vicm91dGluZSwgc28gaXQgbXVzdCBiZSBlZmZpY2llbnQuCi0KLU5PVEU6ICAgSW50ZXJydXB0cyBNVVNUIGJlIE9GRiB3aGlsZSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGVuc3VyZSB3ZSBoYXZlCi0JbXV0dWFsbHkgZXhjbHVzaXZlIGFjY2VzcyB0byBvdXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvcgotCWludGVycnVwdCBkcml2ZW4gc3lzdGVtcyAobGlrZSB1bmRlciBET1MpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkZE1vdXNlRXZlbnQoCi0gICAgdWludCB3aGF0LAotICAgIHVpbnQgbWVzc2FnZSwKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgbWlja2V5WCwKLSAgICBpbnQgbWlja2V5WSwKLSAgICB1aW50IGJ1dF9zdGF0KQotewotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkvKiBTYXZlIGluZm9ybWF0aW9uIGluIGV2ZW50IHJlY29yZC4gKi8KLQlldnQud2hlbiA9IF9FVlRfZ2V0VGlja3MoKTsKLQlldnQud2hhdCA9IHdoYXQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotCWV2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKLQlldnQud2hlcmVfeCA9IHg7ICAgICAgICAgICAgICAgIC8qIFNhdmUgbW91c2UgZXZlbnQgcG9zaXRpb24gICAgKi8KLQlldnQud2hlcmVfeSA9IHk7Ci0JZXZ0LnJlbGF0aXZlX3ggPSBtaWNrZXlYOwotCWV2dC5yZWxhdGl2ZV95ID0gbWlja2V5WTsKLQlldnQubW9kaWZpZXJzIHw9IEVWVC5rZXlNb2RpZmllcnM7Ci0JYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1hc2sgICAgICAgIC0gRXZlbnQgbWFzawotYnV0c3RhdGUgICAgLSBCdXR0b24gc3RhdGUKLXggICAgICAgICAgIC0gTW91c2UgeCBjb29yZGluYXRlCi15ICAgICAgICAgICAtIE1vdXNlIHkgY29vcmRpbmF0ZQotCi1SRU1BUktTOgotTW91c2UgZXZlbnQgaGFuZGxpbmcgcm91dGluZS4gVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgbW91c2UgZXZlbnQgb2NjdXJzLAotYW5kIHdlIGNhbGwgdGhlIGFkZE1vdXNlRXZlbnQoKSByb3V0aW5lIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbW91c2UgZXZlbnQKLXRvIHRoZSBldmVudCBxdWV1ZS4KLQotTm90ZTogSW50ZXJydXB0cyBhcmUgT04gd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtb3VzZSBkcml2ZXIgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFVlRBUEkgbW91c2VJU1IoCi0gICAgdWludCBtYXNrLAotICAgIHVpbnQgYnV0c3RhdGUsCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IG1pY2tleVgsCi0gICAgaW50IG1pY2tleVkpCi17Ci0gICAgdWludCAgICBwczsKLSAgICB1aW50ICAgIGJ1dHRvbk1hc2s7Ci0KLSAgICBpZiAobWFzayAmIDEpIHsKLQkvKiBTYXZlIHRoZSBjdXJyZW50IG1vdXNlIGNvb3JkaW5hdGVzICovCi0JRVZULm14ID0geDsgRVZULm15ID0geTsKLQotCS8qIElmIHRoZSBsYXN0IGV2ZW50IHdhcyBhIG1vdmVtZW50IGV2ZW50LCB0aGVuIG1vZGlmeSB0aGUgbGFzdAotCSAqIGV2ZW50IHJhdGhlciB0aGFuIHBvc3QgYSBuZXcgb25lLCBzbyB0aGF0IHRoZSBxdWV1ZSB3aWxsIG5vdAotCSAqIGJlY29tZSBzYXR1cmF0ZWQuIEJlZm9yZSB3ZSBtb2RpZnkgdGhlIGRhdGEgc3RydWN0dXJlcywgd2UKLQkgKiBNVVNUIGVuc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIG9mZi4KLQkgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWlmIChFVlQub2xkTW92ZSAhPSAtMSkgewotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeCA9IHg7ICAvKiBNb2RpZnkgZXhpc3Rpbmcgb25lICAqLwotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeSA9IHk7Ci0JICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV94ICs9IG1pY2tleVg7Ci0JICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV95ICs9IG1pY2tleVk7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgRVZULm9sZE1vdmUgPSBFVlQuZnJlZUhlYWQ7ICAgICAgICAgLyogU2F2ZSBpZCBvZiB0aGlzIG1vdmUgZXZlbnQgICAqLwotCSAgICBhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRU1PVkUsMCx4LHksbWlja2V5WCxtaWNrZXlZLGJ1dHN0YXRlKTsKLQkgICAgfQotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JfQotICAgIGlmIChtYXNrICYgMHgyQSkgewotCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JYnV0dG9uTWFzayA9IDA7Ci0JaWYgKG1hc2sgJiAyKSAgYnV0dG9uTWFzayB8PSBFVlRfTEVGVEJNQVNLOwotCWlmIChtYXNrICYgOCkgIGJ1dHRvbk1hc2sgfD0gRVZUX1JJR0hUQk1BU0s7Ci0JaWYgKG1hc2sgJiAzMikgYnV0dG9uTWFzayB8PSBFVlRfTUlERExFQk1BU0s7Ci0JYWRkTW91c2VFdmVudChFVlRfTU9VU0VET1dOLGJ1dHRvbk1hc2sseCx5LDAsMCxidXRzdGF0ZSk7Ci0JRVZULm9sZE1vdmUgPSAtMTsKLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCX0KLSAgICBpZiAobWFzayAmIDB4NTQpIHsKLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWJ1dHRvbk1hc2sgPSAwOwotCWlmIChtYXNrICYgMikgIGJ1dHRvbk1hc2sgfD0gRVZUX0xFRlRCTUFTSzsKLQlpZiAobWFzayAmIDgpICBidXR0b25NYXNrIHw9IEVWVF9SSUdIVEJNQVNLOwotCWlmIChtYXNrICYgMzIpIGJ1dHRvbk1hc2sgfD0gRVZUX01JRERMRUJNQVNLOwotCWFkZE1vdXNlRXZlbnQoRVZUX01PVVNFVVAsYnV0dG9uTWFzayx4LHksMCwwLGJ1dHN0YXRlKTsKLQlFVlQub2xkTW92ZSA9IC0xOwotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JfQotICAgIEVWVC5vbGRLZXkgPSAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1LZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbi4KLQotTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCi0JYW5kIHdlIGxlYXZlIHRoZW0gT0ZGIHRoZSBlbnRpcmUgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFVlRBUEkga2V5Ym9hcmRJU1Iodm9pZCkKLXsKLSAgICBwcm9jZXNzUmF3U2NhbkNvZGUoUE1faW5wYigweDYwKSk7Ci0gICAgUE1fb3V0cGIoMHgyMCwweDIwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgaW50ICAgICBpOwotCi0gICAgUE1faW5pdCgpOwotICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgX0VWVF9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBFVlRfcmVzdW1lKCk7Ci0KLSAgICAvKiBHcmFiIGFsbCBjaGFyYWN0ZXJzIHBlbmRpbmcgaW4gdGhlIGtleWJvYXJkIGJ1ZmZlciBhbmQgc3R1ZmYKLSAgICAgKiB0aGVtIGludG8gb3VyIGV2ZW50IGJ1ZmZlci4gVGhpcyBhbGxvd3MgdXMgdG8gcGljayB1cCBhbnkga2V5cHJlc3NlcwotICAgICAqIHdoaWxlIHRoZSBwcm9ncmFtIGlzIGluaXRpYWxpc2luZy4KLSAgICAgKi8KLSAgICB3aGlsZSAoKGkgPSBfRVZUX2dldEtleUNvZGUoKSkgIT0gMCkKLQlhZGRLZXlFdmVudChFVlRfS0VZRE9XTixpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgICAgICBsb2NrZWQgPSAwOwotICAgIGludCAgICAgICAgICAgICBzdGF0OwotICAgIHVjaGFyICAgICAgICAgICBtb2RzOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsgLyogVW51c2VkIGluIERPUyAqLwotCi0gICAgaWYgKF9FVlRfdXNlRXZlbnRzKSB7Ci0JLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgYW5kIGVuYWJsZSBvdXIgaW50ZXJydXB0IGhhbmRsZXJzICovCi0JaW5pdEV2ZW50UXVldWUoKTsKLSNpZm5kZWYgTk9fS0VZQk9BUkRfSU5URVJSVVBUCi0JUE1fc2V0S2V5SGFuZGxlcihrZXlib2FyZElTUik7Ci0jZW5kaWYKLSNpZm5kZWYgTk9fTU9VU0VfSU5URVJSVVBUCi0JaWYgKChoYXZlTW91c2UgPSBkZXRlY3RNb3VzZSgpKSAhPSAwKSB7Ci0JICAgIGludCBvbGRtb2RlID0gX0VWVF9mb29sTW91c2UoKTsKLQkgICAgUE1fc2V0TW91c2VIYW5kbGVyKDB4RkZGRixtb3VzZUlTUik7Ci0JICAgIF9FVlRfdW5mb29sTW91c2Uob2xkbW9kZSk7Ci0JICAgIH0KLSNlbmRpZgotCi0JLyogUmVhZCB0aGUga2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MgZnJvbSB0aGUgQklPUyB0byBnZXQgdGhlCi0JICogY29ycmVjdCBpbml0aWFsaXNhdGlvbiBzdGF0ZS4gVGhlIG9ubHkgc3RhdGUgd2UgY2FyZSBhYm91dCBpcwotCSAqIHRoZSBjb3JyZWN0IHRvZ2dsZSBzdGF0ZSBmbGFncyBzdWNoIGFzIFNDUk9MTExPQ0ssIE5VTUxPQ0sgYW5kCi0JICogQ0FQU0xPQ0suCi0JICovCi0JRVZULmtleU1vZGlmaWVycyA9IDA7Ci0JbW9kcyA9IFBNX2dldEJ5dGUoX0VWVF9iaW9zUHRyKzB4MTcpOwotCWlmIChtb2RzICYgMHgxMCkKLQkgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfU0NST0xMTE9DSzsKLQlpZiAobW9kcyAmIDB4MjApCi0JICAgIEVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX05VTUxPQ0s7Ci0JaWYgKG1vZHMgJiAweDQwKQotCSAgICBFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9DQVBTTE9DSzsKLQotCS8qIExvY2sgYWxsIG9mIHRoZSBjb2RlIGFuZCBkYXRhIHVzZWQgYnkgb3VyIHByb3RlY3RlZCBtb2RlIGludGVycnVwdAotCSAqIGhhbmRsaW5nIHJvdXRpbmVzLCBzbyB0aGF0IGl0IHdpbGwgY29udGludWUgdG8gd29yayBjb3JyZWN0bHkKLQkgKiB1bmRlciByZWFsIG1vZGUuCi0JICovCi0JaWYgKCFsb2NrZWQpIHsKLQkgICAgLyogSXQgaXMgZGlmZmljdWx0IHRvIGVuc3VyZSB0aGF0IHdlIGxvY2sgb3VyIGdsb2JhbCBkYXRhLCBzbyB3ZQotCSAgICAgKiBkbyB0aGlzIGJ5IHRha2luZyB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGxvY2tpbmcgYWxsIGRhdGEKLQkgICAgICogMktiIG9uIGVpdGhlciBzaWRlLiBUaGlzIHNob3VsZCBwcm9wZXJseSBjb3ZlciB0aGUgZ2xvYmFsIGRhdGEKLQkgICAgICogdXNlZCBieSB0aGUgbW9kdWxlICh0aGUgb3RoZXIgYWx0ZXJuYXRpdmUgaXMgdG8gZGVjbGFyZSB0aGUKLQkgICAgICogdmFyaWFibGVzIGluIGFzc2VtYmxlciwgaW4gd2hpY2ggY2FzZSB3ZSBrbm93IGl0IHdpbGwgYmUKLQkgICAgICogY29ycmVjdCkuCi0JICAgICAqLwotCSAgICBzdGF0ICA9ICFQTV9sb2NrRGF0YVBhZ2VzKCZFVlQsc2l6ZW9mKEVWVCksJmxoKTsKLQkgICAgc3RhdCB8PSAhUE1fbG9ja0RhdGFQYWdlcygmX0VWVF9iaW9zUHRyLHNpemVvZihfRVZUX2Jpb3NQdHIpLCZsaCk7Ci0JICAgIHN0YXQgfD0gIVBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilfRVZUX2NDb2RlU3RhcnQsKGludClfRVZUX2NDb2RlRW5kLShpbnQpX0VWVF9jQ29kZVN0YXJ0LCZsaCk7Ci0JICAgIHN0YXQgfD0gIVBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilfRVZUX2NvZGVTdGFydCwoaW50KV9FVlRfY29kZUVuZC0oaW50KV9FVlRfY29kZVN0YXJ0LCZsaCk7Ci0JICAgIGlmIChzdGF0KSB7Ci0JCVBNX2ZhdGFsRXJyb3IoIlBhZ2UgbG9ja2luZyBzZXJ2aWNlcyBmYWlsZWQgLSBpbnRlcnJ1cHQgaGFuZGxpbmcgbm90IHNhZmUhIik7Ci0JCWV4aXQoMSk7Ci0JCX0KLQkgICAgbG9ja2VkID0gMTsKLQkgICAgfQotCi0JLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotCXNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLQlzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLQlzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLQlfRVZUX2luc3RhbGxlZCA9IHRydWU7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChoYXZlTW91c2UpIHsKLQlpbnQgb2xkbW9kZSA9IF9FVlRfZm9vbE1vdXNlKCk7Ci0JUE1fcmVzZXRNb3VzZURyaXZlcigxKTsKLQlyZWdzLnguYXggPSA3OyAgLyogTW91c2UgZnVuY3Rpb24gNyAtIFNldCBob3Jpem9udGFsIG1pbiBhbmQgbWF4ICovCi0JcmVncy54LmN4ID0gMDsKLQlyZWdzLnguZHggPSB4UmVzOwotCVBNX2ludDg2KDB4MzMsJnJlZ3MsJnJlZ3MpOwotCXJlZ3MueC5heCA9IDg7ICAvKiBNb3VzZSBmdW5jdGlvbiA4IC0gU2V0IHZlcnRpY2FsIG1pbiBhbmQgbWF4ICAgKi8KLQlyZWdzLnguY3ggPSAwOwotCXJlZ3MueC5keCA9IHlSZXM7Ci0JUE1faW50ODYoMHgzMywmcmVncywmcmVncyk7Ci0JX0VWVF91bmZvb2xNb3VzZShvbGRtb2RlKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX3NldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKGhhdmVNb3VzZSkgewotCWludCBvbGRtb2RlID0gX0VWVF9mb29sTW91c2UoKTsKLQlyZWdzLnguYXggPSA0OyAgICAgIC8qIE1vdXNlIGZ1bmN0aW9uIDQgLSBTZXQgbW91c2UgcG9zaXRpb24gICAgKi8KLQlyZWdzLnguY3ggPSAqeDsgICAgIC8qIE5ldyBob3Jpem9udGFsIGNvb3JkaW5hdGUgICAgICAgICAgICAgICAgKi8KLQlyZWdzLnguZHggPSAqeTsgICAgIC8qIE5ldyB2ZXJ0aWNhbCBjb29yZGluYXRlICAgICAgICAgICAgICAgICAgKi8KLQlQTV9pbnQ4NigweDMzLCZyZWdzLCZyZWdzKTsKLQlfRVZUX3VuZm9vbE1vdXNlKG9sZG1vZGUpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICB1Y2hhciAgIG1vZHM7Ci0KLSAgICBpZiAoX0VWVF9pbnN0YWxsZWQpIHsKLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLQlQTV9yZXN0b3JlS2V5SGFuZGxlcigpOwotCWlmIChoYXZlTW91c2UpCi0JICAgIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIoKTsKLQlzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7Ci0Jc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7Ci0Jc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Ci0KLQkvKiBTZXQgdGhlIGtleWJvYXJkIG1vZGlmaWVyIGZsYWdzIGluIHRoZSBCSU9TIHRvIG91ciB2YWx1ZXMgKi8KLQlFVlRfYWxsb3dMRURTKHRydWUpOwotCW1vZHMgPSBQTV9nZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3KSAmIH4weDcwOwotCWlmIChFVlQua2V5TW9kaWZpZXJzICYgRVZUX1NDUk9MTExPQ0spCi0JICAgIG1vZHMgfD0gMHgxMDsKLQlpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9OVU1MT0NLKQotCSAgICBtb2RzIHw9IDB4MjA7Ci0JaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfQ0FQU0xPQ0spCi0JICAgIG1vZHMgfD0gMHg0MDsKLQlQTV9zZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3LG1vZHMpOwotCi0JLyogRmxhZyB0aGF0IHdlIGFyZSBubyBsb25nZXIgaW5zdGFsbGVkICovCi0JX0VWVF9pbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2V4aXQodm9pZCkKLXsKLSAgICBFVlRfc3VzcGVuZCgpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3Mvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlOGUwMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3Mvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBET1MKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDllMzQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDE2LzMyIGJpdCBET1MKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInp0aW1lcmMuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZG9zLmg+Ci0jaW5jbHVkZSA8Y29uaW8uaD4KLSNpZmRlZiAgX19HTlVDX18KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbmVhcnB0ci5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2VuZGlmCi0jaWZkZWYgIF9fQk9STEFORENfXwotI3ByYWdtYSB3YXJuIC1wYXIKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50ICAgICBvbGRNb2RlOwotICAgIGludCAgICAgb2xkNTBMaW5lczsKLSAgICB9IERPU19zdGF0ZUJ1ZjsKLQotI2RlZmluZSBNQVhfUk1fQkxPQ0tTICAgMTAKLQotc3RhdGljIHN0cnVjdCB7Ci0gICAgdm9pZCAgICAqcDsKLSAgICB1aW50ICAgIHRhZzsKLSAgICB9IHJtQmxvY2tzW01BWF9STV9CTE9DS1NdOwotCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAgICAgLyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLwotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcnNlZzsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9yb2ZmOyAgICAgICAgICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci11c2hvcnQgX1ZBUkFQSSAgX1BNX3NhdmVkRFMgPSAwOwotI2lmZGVmICBET1M0R1cKLXN0YXRpYyB1bG9uZyAgICBQREIgPSAwLCpwUERCID0gTlVMTDsKLSNlbmRpZgotI2lmbmRlZiBSRUFMTU9ERQotc3RhdGljIGNoYXIgICAgIFZYRF9uYW1lW10gPSBQTUhFTFBfTkFNRTsKLXN0YXRpYyBjaGFyICAgICBWWERfbW9kdWxlW10gPSBQTUhFTFBfTU9EVUxFOwotc3RhdGljIGNoYXIgICAgIFZYRF9EREJOYW1lW10gPSBQTUhFTFBfRERCTkFNRTsKLXN0YXRpYyB1aW50ICAgICBWWERfdmVyc2lvbiA9IC0xOwotc3RhdGljIHVpbnQgICAgIFZYRF9sb2FkT2ZmID0gMDsKLXN0YXRpYyB1aW50ICAgICBWWERfbG9hZFNlbCA9IDA7Ci11aW50IF9WQVJBUEkgICAgX1BNX1ZYRF9vZmYgPSAwOwotdWludCBfVkFSQVBJICAgIF9QTV9WWERfc2VsID0gMDsKLWludCBfVkFSQVBJICAgICBfUE1faGF2ZUNhdXNlV2F5ID0gLTE7Ci0KLS8qIE1lbW9yeSBtYXBwaW5nIGNhY2hlICovCi0KLSNkZWZpbmUgTUFYX01FTU9SWV9NQVBQSU5HUyAxMDAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIHBoeXNpY2FsOwotICAgIHVsb25nICAgbGluZWFyOwotICAgIHVsb25nICAgbGltaXQ7Ci0gICAgfSBtbWFwcGluZzsKLXN0YXRpYyBtbWFwcGluZyAgICAgbWFwc1tNQVhfTUVNT1JZX01BUFBJTkdTXSA9IHswfTsKLXN0YXRpYyBpbnQgICAgICAgICAgbnVtTWFwcyA9IDA7Ci0KLS8qIFBhZ2Ugc2l6ZWQgYmxvY2sgY2FjaGUgKi8KLQotI2RlZmluZSBQQUdFU19QRVJfQkxPQ0sgICAgIDEwMAotI2RlZmluZSBGUkVFTElTVF9ORVhUKHApICAgICgqKHZvaWQqKikocCkpCi10eXBlZGVmIHN0cnVjdCBwYWdlYmxvY2sgewotICAgIHN0cnVjdCBwYWdlYmxvY2sgICAgKm5leHQ7Ci0gICAgc3RydWN0IHBhZ2VibG9jayAgICAqcHJldjsKLSAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdFN0YXJ0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0RW5kOwotICAgIGludCAgICAgICAgICAgICAgICAgZnJlZUNvdW50OwotICAgIH0gcGFnZWJsb2NrOwotc3RhdGljIHBhZ2VibG9jayAgICAqcGFnZUJsb2NrcyA9IE5VTEw7Ci0jZW5kaWYKLQotLyogU3RhcnQgb2YgYWxsIHBhZ2UgdGFibGVzIGluIENhdXNlV2F5ICovCi0KLSNkZWZpbmUgQ1dfUEFHRV9UQUJMRV9TVEFSVCAoMTAyNFVMKjQwOTZVTCoxMDIzVUwpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLQotdWxvbmcgICBfQVNNQVBJIF9QTV9nZXRQREIodm9pZCk7Ci1pbnQgICAgIF9BU01BUEkgX1BNX3BhZ2luZ0VuYWJsZWQodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgX1BNX1Z4RENhbGwoVlhEX3JlZ3MgKnJlZ3MsdWludCBvZmYsdWludCBzZWwpOwotCi0jaWZuZGVmIFJFQUxNT0RFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUV4aXQgZnVuY3Rpb24gdG8gdW5sb2FkIHRoZSBkeW5hbWljYWxseSBsb2FkZWQgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgVW5sb2FkVnhEKHZvaWQpCi17Ci0gICAgUE1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgVlhEX3JlZ3MgICAgcjsKLQotICAgIHIuZWF4ID0gMjsKLSAgICByLmVieCA9IDA7Ci0gICAgci5lZHggPSAodWludClWWERfbW9kdWxlOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSNpZmRlZiAgX18xNkJJVF9fCi0gICAgci5kcyA9ICgodWxvbmcpVlhEX21vZHVsZSkgPj4gMTY7Ci0jZWxzZQotICAgIHIuZHMgPSBzcmVncy5kczsKLSNlbmRpZgotICAgIHIuZXMgPSBzcmVncy5lczsKLSAgICBfUE1fVnhEQ2FsbCgmcixWWERfbG9hZE9mZixWWERfbG9hZFNlbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXh0ZXJuYWwgZnVuY3Rpb24gdG8gY2FsbCB0aGUgUE1IRUxQIGhlbHBlciBWeEQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9WeERDYWxsKAotICAgIFZYRF9yZWdzICpyZWdzKQotewotICAgIGlmIChfUE1fVlhEX3NlbCAhPSAwIHx8IF9QTV9WWERfb2ZmICE9IDApCi0JX1BNX1Z4RENhbGwocmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotQkNEIGNvZGVkIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBWeEQsIG9yIDAgaWYgbm90IGxvYWRlZCAoaWU6IDB4MjAyIC0gMi4yKQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIFZ4RCB0aGF0IHdlIGhhdmUgY29ubmVjdGVkIHRvLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1IRUxQX2dldFZlcnNpb24odm9pZCkKLXsKLSAgICBWWERfcmVncyAgICByOwotCi0gICAgLyogQ2FsbCB0aGUgaGVscGVyIFZ4RCB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gbnVtYmVyICovCi0gICAgaWYgKF9QTV9WWERfc2VsICE9IDAgfHwgX1BNX1ZYRF9vZmYgIT0gMCkgewotCW1lbXNldCgmciwwLHNpemVvZihyKSk7Ci0Jci5lYXggPSBBUElfTlVNKFBNSEVMUF9HRVRWRVIpOwotCV9QTV9WeERDYWxsKCZyLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gVlhEX3ZlcnNpb24gPSAodWludClyLmVheDsKLQl9Ci0gICAgcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ29ubmVjdHMgdG8gdGhlIGhlbHBlciBWeEQgYW5kIHJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIHRoZSBWeEQgd2FzIGZvdW5kIGFuZCBsb2FkZWQsIGZhbHNlIG90aGVyd2lzZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY29ubmVjdHMgdG8gdGhlIFZ4RCAobG9hZGluZyBpdCBpZiBpdCBpcyBkeW5hbWljYWxseSBsb2FkYWJsZSkKLWFuZCByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBQTUhFTFBfY29ubmVjdCh2b2lkKQotewotICAgIFBNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUE1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgVlhEX3JlZ3MgICAgcjsKLQotICAgIC8qIEJhaWwgZWFybHkgaWYgd2UgaGF2ZSBhbHJlYWQgY29ubmVjdGVkICovCi0gICAgaWYgKFZYRF92ZXJzaW9uICE9IC0xKQotCXJldHVybiBWWERfdmVyc2lvbiAhPSAwOwotCi0gICAgLyogR2V0IHRoZSBzdGF0aWMgU0RESEVMUC5WWEQgZW50cnkgcG9pbnQgaWYgYXZhaWxhYmxlICovCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MTY4NDsKLSAgICByZWdzLnguYnggPSBTRERIRUxQX0RldmljZUlEOwotICAgIHJlZ3MueC5kaSA9IDA7Ci0gICAgc3JlZ3MuZXMgPSAwOwotICAgIFBNX2ludDM4NngoMHgyRiwmcmVncywmcmVncywmc3JlZ3MpOwotICAgIF9QTV9WWERfc2VsID0gc3JlZ3MuZXM7Ci0gICAgX1BNX1ZYRF9vZmYgPSByZWdzLnguZGk7Ci0gICAgaWYgKF9QTV9WWERfc2VsICE9IDAgfHwgX1BNX1ZYRF9vZmYgIT0gMCkgewotCWlmIChQTUhFTFBfZ2V0VmVyc2lvbigpID49IFBNSEVMUF9WRVJTSU9OKQotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiBlaXRoZXIgU0RESEVMUC5WWEQgaXMgbm90IGxvYWRlZCwgb3IgaXQgaXMgYW4KLSAgICAgKiBlYXJsaWVyIHZlcnNpb24uIEluIHRoaXMgY2FzZSB0cnkgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGUgUE1IRUxQLlZYRAotICAgICAqIGhlbHBlciBWeEQgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy54LmF4ID0gMHgxNjg0OwotICAgIHJlZ3MueC5ieCA9IFZYRExEUl9EZXZpY2VJRDsKLSAgICByZWdzLnguZGkgPSAwOwotICAgIHNyZWdzLmVzID0gMDsKLSAgICBQTV9pbnQzODZ4KDB4MkYsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKLSAgICBWWERfbG9hZFNlbCA9IHNyZWdzLmVzOwotICAgIFZYRF9sb2FkT2ZmID0gcmVncy54LmRpOwotICAgIGlmIChWWERfbG9hZFNlbCA9PSAwICYmIFZYRF9sb2FkT2ZmID09IDApCi0JcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKLSAgICByLmVheCA9IDE7Ci0gICAgci5lYnggPSAwOwotICAgIHIuZWR4ID0gKHVpbnQpVlhEX25hbWU7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHIuZHMgPSBzcmVncy5kczsKLSAgICByLmVzID0gc3JlZ3MuZXM7Ci0gICAgX1BNX1Z4RENhbGwoJnIsVlhEX2xvYWRPZmYsVlhEX2xvYWRTZWwpOwotICAgIGlmIChyLmVheCAhPSAwKQotCXJldHVybiBWWERfdmVyc2lvbiA9IDA7Ci0KLSAgICAvKiBHZXQgdGhlIGR5bmFtaWMgVnhEIGVudHJ5IHBvaW50IHNvIHdlIGNhbiBjYWxsIGl0ICovCi0gICAgYXRleGl0KFVubG9hZFZ4RCk7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MTY4NDsKLSAgICByZWdzLnguYnggPSAwOwotICAgIHJlZ3MuZS5lZGkgPSAodWludClWWERfRERCTmFtZTsKLSAgICBQTV9pbnQzODZ4KDB4MkYsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKLSAgICBfUE1fVlhEX3NlbCA9IHNyZWdzLmVzOwotICAgIF9QTV9WWERfb2ZmID0gcmVncy54LmRpOwotICAgIGlmIChfUE1fVlhEX3NlbCA9PSAwICYmIF9QTV9WWERfb2ZmID09IDApCi0JcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKLSAgICBpZiAoUE1IRUxQX2dldFZlcnNpb24oKSA+PSBQTUhFTFBfVkVSU0lPTikKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gVlhEX3ZlcnNpb24gPSAwOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4gRmlyc3Qgd2UgdHJ5IHRvIGNvbm5lY3QgdG8gYSBzdGF0aWMgU0RESEVMUC5WWEQKLWhlbHBlciBWeEQsIGFuZCBjaGVjayB0aGF0IGl0IGlzIGEgdmVyc2lvbiB3ZSBjYW4gdXNlLiBJZiBub3Qgd2UgdHJ5IHRvCi1keW5hbWljYWxseSBsb2FkIHRoZSBQTUhFTFAuVlhEIGhlbHBlciBWeEQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyB1bmRlciBDYXVzZVdheSB1bmRlciByZWFsIERPUyAqLwotICAgIGlmIChfUE1faGF2ZUNhdXNlV2F5ID09IC0xKSB7Ci0JLyogQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgRFBNSSBpbiB3aGljaCBjYXNlIHdlIHdpbGwgbm90IGJlCi0JICogYWJsZSB0byB1c2Ugb3VyIHNwZWNpYWwgcmluZyAwIENhdXNlV2F5IGZ1bmN0aW9ucy4KLQkgKi8KLQlfUE1faGF2ZUNhdXNlV2F5ID0gZmFsc2U7Ci0JcmVncy54LmF4ID0gMHhGRjAwOwotCVBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLQlpZiAocmVncy54LmNmbGFnIHx8ICEocmVncy5lLmVkaSAmIDgpKSB7Ci0JICAgIC8qIFdlIGFyZSBub3QgdW5kZXIgRFBNSSwgc28gbm93IGNoZWNrIGlmIENhdXNlV2F5IGlzIGFjdGl2ZSAqLwotCSAgICByZWdzLnguYXggPSAweEZGRjk7Ci0JICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLQkgICAgaWYgKCFyZWdzLnguY2ZsYWcgJiYgcmVncy5lLmVjeCA9PSAweDQzNDE1NTUzICYmIHJlZ3MuZS5lZHggPT0gMHg0NTU3NDE1OSkKLQkJX1BNX2hhdmVDYXVzZVdheSA9IHRydWU7Ci0JICAgIH0KLQotCS8qIE5vdyBjb25uZWN0IHRvIFBNSEVMUC5WWEQgYW5kIGluaXRpYWxpc2UgTVRSUiBtb2R1bGUgKi8KLQlpZiAoIVBNSEVMUF9jb25uZWN0KCkpCi0JICAgIE1UUlJfaW5pdCgpOwotCX0KLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0jaWZuZGVmIFJFQUxNT0RFCi0gICAgVlhEX3JlZ3MgICAgcmVnczsKLQotICAgIGlmIChQTUhFTFBfY29ubmVjdCgpKSB7Ci0JbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKLQlyZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX0VOQUJMRUxGQkNPTUIpOwotCXJlZ3MuZWJ4ID0gYmFzZTsKLQlyZWdzLmVjeCA9IHNpemU7Ci0JcmVncy5lZHggPSB0eXBlOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gcmVncy5lYXg7Ci0JfQotICAgIHJldHVybiBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZShiYXNlLHNpemUsdHlwZSk7Ci0jZWxzZQotICAgIHJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7Ci0jZW5kaWYKLX0KLQotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsgcmV0dXJuIHRydWU7IH0KLQotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsgcmV0dXJuIF9PU19ET1M7IH0KLQotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChSRUFMTU9ERSkKLSAgICByZXR1cm4gUE1fcmVhbE1vZGU7Ci0jZWxpZiBkZWZpbmVkKFBNMjg2KQotICAgIHJldHVybiBQTV8yODY7Ci0jZWxpZiBkZWZpbmVkKFBNMzg2KQotICAgIHJldHVybiBQTV8zODY7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgbXNnKTsKLSAgICBleGl0KDEpOwotfQotCi1zdGF0aWMgdm9pZCBFeGl0VkJFQnVmKHZvaWQpCi17Ci0gICAgaWYgKFZFU0FCdWZfcHRyKQotCVBNX2ZyZWVSZWFsU2VnKFZFU0FCdWZfcHRyKTsKLSAgICBWRVNBQnVmX3B0ciA9IDA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCi17Ci0gICAgaWYgKCFWRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoVkVTQUJ1Zl9wdHIgPSBQTV9hbGxvY1JlYWxTZWcoVkVTQUJ1Zl9sZW4sICZWRVNBQnVmX3JzZWcsICZWRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlhdGV4aXQoRXhpdFZCRUJ1Zik7Ci0JfQotICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKLSAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKLSAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQzODYoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gUE1faW50Mzg2eChpbnRubyxpbixvdXQsJnNyZWdzKTsKLX0KLQotLyogUm91dGluZXMgdG8gc2V0IGFuZCBnZXQgdGhlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgdmVjdG9ycywgYnkgbWFraW5nCi0gKiBkaXJlY3QgcmVhbCBtb2RlIGNhbGxzIHRvIERPUyBhbmQgYnlwYXNzaW5nIHRoZSBET1MgZXh0ZW5kZXJzIEFQSS4KLSAqIFRoaXMgaXMgdGhlIHNhZmVzdCB3YXkgdG8gaGFuZGxlIHRoaXMsIGFzIHNvbWUgc2VydmVycyB0cnkgdG8gYmUKLSAqIHNtYXJ0IGFib3V0IGNoYW5naW5nIHJlYWwgbW9kZSB2ZWN0b3JzLgotICovCi0KLXZvaWQgUE1BUEkgX1BNX2dldFJNdmVjdChpbnQgaW50bm8sIGxvbmcgKnJlYWxpc3IpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIFJNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICByZWdzLmguYWggPSAweDM1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIFBNX2ludDg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci0gICAgKnJlYWxpc3IgPSAoKGxvbmcpc3JlZ3MuZXMgPDwgMTYpIHwgcmVncy54LmJ4OwotfQotCi12b2lkIFBNQVBJIF9QTV9zZXRSTXZlY3QoaW50IGludG5vLCBsb25nIHJlYWxpc3IpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIFJNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICByZWdzLmguYWggPSAweDI1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIHNyZWdzLmRzID0gKGludCkocmVhbGlzciA+PiAxNik7Ci0gICAgcmVncy54LmR4ID0gKGludCkocmVhbGlzciAmIDB4RkZGRik7Ci0gICAgUE1faW50ODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBfUE1fYWRkUmVhbE1vZGVCbG9jayh2b2lkICptZW0sdWludCB0YWcpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JNX0JMT0NLUzsgaSsrKSB7Ci0JaWYgKHJtQmxvY2tzW2ldLnAgPT0gTlVMTCkgewotCSAgICBybUJsb2Nrc1tpXS5wID0gbWVtOwotCSAgICBybUJsb2Nrc1tpXS50YWcgPSB0YWc7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICBQTV9mYXRhbEVycm9yKCJUbyBtYW55IHJlYWwgbW9kZSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbnMhIik7Ci19Ci0KLXVpbnQgUE1BUEkgX1BNX2ZpbmRSZWFsTW9kZUJsb2NrKHZvaWQgKm1lbSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUk1fQkxPQ0tTOyBpKyspIHsKLQlpZiAocm1CbG9ja3NbaV0ucCA9PSBtZW0pCi0JICAgIHJldHVybiBybUJsb2Nrc1tpXS50YWc7Ci0JfQotICAgIFBNX2ZhdGFsRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHByaW9yIHJlYWwgbW9kZSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbiEiKTsKLSAgICByZXR1cm4gMDsKLX0KLQotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKLX0KLQotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsgcmV0dXJuICdDJzsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17IHJldHVybiAiYzpcXCI7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIGNoYXIgICAgICAgICplbnY7Ci0KLSAgICBpZiAoKGVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIikpICE9IE5VTEwpCi0JcmV0dXJuIGVudjsKLSAgICBpZiAoKGVudiA9IGdldGVudigiV0lOQk9PVERJUiIpKSAhPSBOVUxMKSB7Ci0JLyogUnVubmluZyBpbiBhIFdpbmRvd3MgOXggRE9TIGJveCBvciBET1MgbW9kZSAqLwotCXN0cmNweShwYXRoLGVudik7Ci0Jc3RyY2F0KHBhdGgsIlxcc3lzdGVtXFxudWNsZXVzIik7Ci0JcmV0dXJuIHBhdGg7Ci0JfQotICAgIGlmICgoZW52ID0gZ2V0ZW52KCJTeXN0ZW1Sb290IikpICE9IE5VTEwpIHsKLQkvKiBSdW5uaW5nIGluIGFuIE5ULzJLIERPUyBib3ggKi8KLQlzdHJjcHkocGF0aCxlbnYpOwotCXN0cmNhdChwYXRoLCJcXHN5c3RlbTMyXFxudWNsZXVzIik7Ci0JcmV0dXJuIHBhdGg7Ci0JfQotICAgIHJldHVybiAiYzpcXG51Y2xldXMiOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17IHJldHVybiAiRE9TIjsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsgcmV0dXJuICJET1MiOyB9Ci0KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIHJldHVybiBrYmhpdCgpOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICByZXR1cm4gZ2V0Y2goKTsKLX0KLQotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZShQTV9IV05EIGh3bmRVc2VyLGludCBkZXZpY2UsaW50IHhSZXMsaW50IHlSZXMsaW50IGJwcCxpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBET1MgKi8KLSAgICAodm9pZClod25kVXNlcjsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgKHZvaWQpeFJlczsKLSAgICAodm9pZCl5UmVzOwotICAgICh2b2lkKWJwcDsKLSAgICAodm9pZClmdWxsU2NyZWVuOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIHJldHVybiBzaXplb2YoRE9TX3N0YXRlQnVmKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgRE9TX3N0YXRlQnVmICAgICpzYiA9IHN0YXRlQnVmOwotCi0gICAgLyogU2F2ZSB0aGUgb2xkIHZpZGVvIG1vZGUgc3RhdGUgKi8KLSAgICByZWdzLmguYWggPSAweDBGOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIHNiLT5vbGRNb2RlID0gcmVncy5oLmFsICYgMHg3RjsKLSAgICBzYi0+b2xkNTBMaW5lcyA9IGZhbHNlOwotICAgIGlmIChzYi0+b2xkTW9kZSA9PSAweDMpIHsKLQlyZWdzLnguYXggPSAweDExMzA7Ci0JcmVncy54LmJ4ID0gMDsKLQlyZWdzLnguZHggPSAwOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXNiLT5vbGQ1MExpbmVzID0gKHJlZ3MuaC5kbCA9PSA0MiB8fCByZWdzLmguZGwgPT0gNDkpOwotCX0KLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIERPUyAqLwotICAgICh2b2lkKXNhdmVTdGF0ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgUk1SRUdTICAgICAgICAgICAgICByZWdzOwotICAgIGNvbnN0IERPU19zdGF0ZUJ1ZiAgKnNiID0gc3RhdGVCdWY7Ci0KLSAgICAvKiBSZXRvcmUgNTAgbGluZSBtb2RlIGlmIHNldCAqLwotICAgIGlmIChzYi0+b2xkNTBMaW5lcykgewotCXJlZ3MueC5heCA9IDB4MTExMjsKLQlyZWdzLnguYnggPSAwOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCX0KLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgRE9TICovCi0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MCx4KTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTEseSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldFdvcmQoX2Jpb3NQdHIrMHg0QSx3aWR0aCk7Ci0gICAgUE1fc2V0V29yZChfYmlvc1B0cisweDRDLHdpZHRoKjIpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NCxoZWlnaHQtMSk7Ci0gICAgaWYgKGhlaWdodCA+IDI1KSB7Ci0JUE1fc2V0V29yZChfYmlvc1B0cisweDYwLDB4MDYwNyk7Ci0JUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg1LDB4MDgpOwotCX0KLSAgICBlbHNlIHsKLQlQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NjAsMHgwRDBFKTsKLQlQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODUsMHgwMTYpOwotCX0KLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZChsb25nIHNpemUpCi17Ci0gICAgcmV0dXJuIFBNX21hbGxvYyhzaXplKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKHZvaWQgKnB0cikKLXsKLSAgICBQTV9mcmVlKHB0cik7Ci19Ci0KLSNkZWZpbmUgR2V0Uk1WZWN0KGludG5vLGlzcikgICAgKihpc3IpID0gKCh1bG9uZyopcm1aZXJvUHRyKVtpbnRub10KLSNkZWZpbmUgU2V0Uk1WZWN0KGludG5vLGlzcikgICAgKCh1bG9uZyopcm1aZXJvUHRyKVtpbnRub10gPSAoaXNyKQotCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIHN0YXRpYyBpbnQgICAgICBmaXJzdFRpbWUgPSB0cnVlOwotICAgIHN0YXRpYyB1Y2hhciAgICAqcm1aZXJvUHRyOwotICAgIGxvbmcgICAgICAgICAgICBDdXJyZW50MTAsQ3VycmVudDZELEN1cnJlbnQ0MjsKLSAgICBSTVJFR1MgICAgICAgICAgcmVnczsKLSAgICBSTVNSRUdTICAgICAgICAgc3JlZ3M7Ci0KLSAgICAvKiBDcmVhdGUgYSB6ZXJvIG1lbW9yeSBtYXBwaW5nIGZvciB1cyB0byB1c2UgKi8KLSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0Jcm1aZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHg3RkZGLHRydWUpOwotCWZpcnN0VGltZSA9IGZhbHNlOwotCX0KLQotICAgIC8qIFJlbWFwIHRoZSBzZWNvbmRhcnkgQklPUyB0byAweEMwMDAwIHBoeXNpY2FsICovCi0gICAgaWYgKEJJT1NQaHlzQWRkciAhPSAweEMwMDAwTCB8fCBCSU9TTGVuID4gMzI3NjgpIHsKLQkvKiBET1MgY2Fubm90IHZpcnR1YWxseSByZW1hcCB0aGUgQklPUywgc28gd2UgY2FuIG9ubHkgd29yayBpZiBhbGwKLQkgKiB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIGFyZSBpZGVudGljYWwsIGFuZCB3ZSB0aGVuIHVzZSB0aGUKLQkgKiBCSU9TIG9uIHRoZSBmaXJzdCBjb250cm9sbGVyIGZvciBhbGwgdGhlIHJlbWFpbmluZyBjb250cm9sbGVycy4KLQkgKgotCSAqIEZvciBPUydlcyB0aGF0IGRvIHZpcnR1YWwgbWVtb3J5LCBhbmQgcmVtYXBwaW5nIG9mIDB4QzAwMDAKLQkgKiBwaHlzaWNhbCAocGVyaGFwcyBhIGNvcHkgb24gd3JpdGUgbWFwcGluZykgc2hvdWxkIGJlIGFsbCB0aGF0Ci0JICogaXMgbmVlZGVkLgotCSAqLwotCXJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAvKiBTYXZlIGN1cnJlbnQgaGFuZGxlcnMgb2YgaW50IDEwaCBhbmQgNkRoICovCi0gICAgR2V0Uk1WZWN0KDB4MTAsJkN1cnJlbnQxMCk7Ci0gICAgR2V0Uk1WZWN0KDB4NkQsJkN1cnJlbnQ2RCk7Ci0KLSAgICAvKiBQT1NUIHRoZSBzZWNvbmRhcnkgQklPUyAqLwotICAgIEdldFJNVmVjdCgweDQyLCZDdXJyZW50NDIpOwotICAgIFNldFJNVmVjdCgweDEwLEN1cnJlbnQ0Mik7ICAvKiBSZXN0b3JlIGludCAxMGggdG8gU1RELUJJT1MgKi8KLSAgICByZWdzLnguYXggPSBheFZhbDsKLSAgICBQTV9jYWxsUmVhbE1vZGUoMHhDMDAwLDB4MDAwMywmcmVncywmc3JlZ3MpOwotCi0gICAgLyogUmVzdG9yZSBjdXJyZW50IGhhbmRsZXJzICovCi0gICAgU2V0Uk1WZWN0KDB4MTAsQ3VycmVudDEwKTsKLSAgICBTZXRSTVZlY3QoMHg2RCxDdXJyZW50NkQpOwotCi0gICAgLyogU2Vjb25kIHRoZSBwcmltYXJ5IEJJT1MgbWFwcGluIDE6MSBmb3IgMHhDMDAwMCBwaHlzaWNhbCAqLwotICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMEwpIHsKLQkvKiBET1MgZG9lcyBub3Qgc3VwcG9ydCB0aGlzICovCi0JKHZvaWQpbWFwcGVkQklPUzsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIHVsb25nICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBtaWxsaXNlY29uZHMgKiAxMDAwTDsKLSAgICBMWlRpbWVyT2JqZWN0ICAgdG07Ci0KLSAgICBMWlRpbWVyT25FeHQoJnRtKTsKLSAgICB3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9zZWNvbmRzKQotCTsKLSAgICBMWlRpbWVyT2ZmRXh0KCZ0bSk7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgKHZvaWQpaE1vZHVsZTsKLSAgICAodm9pZClzelByb2NOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLWludCBQTUFQSSBQTV9zZXRJT1BMKAotICAgIGludCBsZXZlbCkKLXsKLSAgICByZXR1cm4gbGV2ZWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW50ZXJuYWwgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgZmluZCBkYXRhIHRvIHRoZSBnZW5lcmljIGludGVyZmFjZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb252ZXJ0RmluZERhdGEoCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhLAotICAgIHN0cnVjdCBmaW5kX3QgKmJsaykKLXsKLSAgICB1bG9uZyAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7Ci0KLSAgICBtZW1zZXQoZmluZERhdGEsMCxmaW5kRGF0YS0+ZHdTaXplKTsKLSAgICBmaW5kRGF0YS0+ZHdTaXplID0gZHdTaXplOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX1JET05MWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfU1VCRElSKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ESVJFQ1RPUlk7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfQVJDSCkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9ISURERU4pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0hJRERFTjsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9TWVNURU0pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1NZU1RFTTsKLSAgICBmaW5kRGF0YS0+c2l6ZUxvID0gYmxrLT5zaXplOwotICAgIHN0cm5jcHkoZmluZERhdGEtPm5hbWUsYmxrLT5uYW1lLFBNX01BWF9QQVRIKTsKLSAgICBmaW5kRGF0YS0+bmFtZVtQTV9NQVhfUEFUSC0xXSA9IDA7Ci19Ci0KLSNkZWZpbmUgRklORF9NQVNLICAgKF9BX1JET05MWSB8IF9BX0FSQ0ggfCBfQV9TVUJESVIgfCBfQV9ISURERU4gfCBfQV9TWVNURU0pCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgc3RydWN0IGZpbmRfdCAqYmxrOwotCi0gICAgaWYgKChibGsgPSBQTV9tYWxsb2Moc2l6ZW9mKCpibGspKSkgPT0gTlVMTCkKLQlyZXR1cm4gUE1fRklMRV9JTlZBTElEOwotICAgIGlmIChfZG9zX2ZpbmRmaXJzdCgoY2hhciopZmlsZW5hbWUsRklORF9NQVNLLGJsaykgPT0gMCkgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOwotCXJldHVybiBibGs7Ci0JfQotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIHN0cnVjdCBmaW5kX3QgKmJsayA9IGhhbmRsZTsKLQotICAgIGlmIChfZG9zX2ZpbmRuZXh0KGJsaykgPT0gMCkgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICBQTV9mcmVlKGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIHJlZ3MuaC5kbCA9ICh1Y2hhcikoZHJpdmUgLSAnQScgKyAxKTsKLSAgICByZWdzLmguYWggPSAweDM2OyAgICAgICAgICAgICAgIC8qIEdldCBkaXNrIGluZm9ybWF0aW9uIHNlcnZpY2UgKi8KLSAgICBQTV9pbnQ4NigweDIxLCZyZWdzLCZyZWdzKTsKLSAgICByZXR1cm4gcmVncy54LmF4ICE9IDB4RkZGRjsgICAgIC8qIEFYID0gMHhGRkZGIGlmIGRpc2sgaXMgaW52YWxpZCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICB1aW50IG9sZERyaXZlLG1heERyaXZlczsKLSAgICBfZG9zX2dldGRyaXZlKCZvbGREcml2ZSk7Ci0gICAgX2Rvc19zZXRkcml2ZShkcml2ZSwmbWF4RHJpdmVzKTsKLSAgICBnZXRjd2QoZGlyLGxlbik7Ci0gICAgX2Rvc19zZXRkcml2ZShvbGREcml2ZSwmbWF4RHJpdmVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0jaWYgZGVmaW5lZChUTlQpICYmIGRlZmluZWQoX01TQ19WRVIpCi0gICAgRFdPUkQgYXR0ciA9IDA7Ci0KLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9BUkNISVZFOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07Ci0gICAgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCBhdHRyKTsKLSNlbHNlCi0gICAgdWludCBhdHRyID0gMDsKLQotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCWF0dHIgfD0gX0FfUkRPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JYXR0ciB8PSBfQV9BUkNIOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlhdHRyIHw9IF9BX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0JYXR0ciB8PSBfQV9TWVNURU07Ci0gICAgX2Rvc19zZXRmaWxlYXR0cihmaWxlbmFtZSxhdHRyKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSNpZmRlZiAgX19HTlVDX18KLSAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUsU19JUlVTUikgPT0gMDsKLSNlbHNlCi0gICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lKSA9PSAwOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEdlbmVyaWMgRFBNSSByb3V0aW5lcyBjb21tb24gdG8gMTYvMzIgYml0IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFJFQUxNT0RFCi11bG9uZyBQTUFQSSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIodWxvbmcgcGh5c0FkZHIsdWxvbmcgbGltaXQpCi17Ci0gICAgUE1SRUdTICByOwotICAgIGludCAgICAgaTsKLSAgICB1bG9uZyAgIGJhc2VBZGRyLGJhc2VPZnMscm91bmRlZExpbWl0OwotCi0gICAgLyogV2UgY2FuJ3QgbWFwIG1lbW9yeSBiZWxvdyAxTWIsIGJ1dCB0aGUgbGluZWFyIGFkZHJlc3MgYXJlIGFscmVhZHkKLSAgICAgKiBtYXBwZWQgMToxIGZvciB0aGlzIG1lbW9yeSBhbnl3YXkgc28gd2UganVzdCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcy4KLSAgICAgKi8KLSAgICBpZiAocGh5c0FkZHIgPCAweDEwMDAwMEwpCi0JcmV0dXJuIHBoeXNBZGRyOwotCi0gICAgLyogU2VhcmNoIHRhYmxlIG9mIGV4aXN0aW5nIG1hcHBpbmdzIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgbWFwcGVkCi0gICAgICogYSByZWdpb24gb2YgbWVtb3J5IHRoYXQgd2lsbCBzZXJ2ZSB0aGlzIHB1cnBvc2UuIFdlIGRvIHRoaXMgYmVjYXVzZQotICAgICAqIERQTUkgMC45IGRvZXMgbm90IGFsbG93IHVzIHRvIGZyZWUgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmdzLCBhbmQgaWYKLSAgICAgKiB0aGUgbWFwcGluZ3MgZ2V0IHJlLXVzZWQgaW4gdGhlIHByb2dyYW0gd2Ugd2FudCB0byBhdm9pZCBhbGxvY2F0aW5nCi0gICAgICogbW9yZSBtYXBwaW5ncyB0aGFuIG5lY2Vzc2FyeS4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwczsgaSsrKSB7Ci0JaWYgKG1hcHNbaV0ucGh5c2ljYWwgPT0gcGh5c0FkZHIgJiYgbWFwc1tpXS5saW1pdCA9PSBsaW1pdCkKLQkgICAgcmV0dXJuIG1hcHNbaV0ubGluZWFyOwotCX0KLQotICAgIC8qIEZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIHRhYmxlICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHM7IGkrKykgewotCWlmIChtYXBzW2ldLmxpbWl0ID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAoaSA9PSBudW1NYXBzKSB7Ci0JaSA9IG51bU1hcHMrKzsKLQlpZiAoaSA9PSBNQVhfTUVNT1JZX01BUFBJTkdTKQotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKLSAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIERQTUkgYXMgc29tZSBleHRlbmRlcnMKLSAgICAgKiB3aWxsIGZhaWwgdGhlIGNhbGxzIHVubGVzcyB0aGlzIGlzIHRoZSBjYXNlLiBJZiB3ZSByb3VuZCB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCi0gICAgICogdGhhdCB3ZSByZXR1cm4uCi0gICAgICovCi0gICAgYmFzZU9mcyA9IHBoeXNBZGRyICYgNDA5NTsKLSAgICBiYXNlQWRkciA9IHBoeXNBZGRyICYgfjQwOTU7Ci0gICAgcm91bmRlZExpbWl0ID0gKChsaW1pdCtiYXNlT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKLSAgICByLnguYXggPSAweDgwMDsKLSAgICByLnguYnggPSBiYXNlQWRkciA+PiAxNjsKLSAgICByLnguY3ggPSBiYXNlQWRkciAmIDB4RkZGRjsKLSAgICByLnguc2kgPSByb3VuZGVkTGltaXQgPj4gMTY7Ci0gICAgci54LmRpID0gcm91bmRlZExpbWl0ICYgMHhGRkZGOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDB4RkZGRkZGRkZVTDsKLSAgICBtYXBzW2ldLnBoeXNpY2FsID0gcGh5c0FkZHI7Ci0gICAgbWFwc1tpXS5saW1pdCA9IGxpbWl0OwotICAgIG1hcHNbaV0ubGluZWFyID0gKCh1bG9uZylyLnguYnggPDwgMTYpICsgci54LmN4ICsgYmFzZU9mczsKLSAgICByZXR1cm4gbWFwc1tpXS5saW5lYXI7Ci19Ci0KLWludCBQTUFQSSBEUE1JX3NldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsLHVsb25nIGxpbkFkZHIpCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gNzsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIHNldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgICAqLwotICAgIHIueC5ieCA9IHNlbDsKLSAgICByLnguY3ggPSBsaW5BZGRyID4+IDE2OwotICAgIHIueC5keCA9IGxpbkFkZHIgJiAweEZGRkY7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgaWYgKHIueC5jZmxhZykKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotdWxvbmcgUE1BUEkgRFBNSV9nZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSA2OyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgZ2V0IHNlbGVjdG9yIGJhc2UgYWRkcmVzcyAgICovCi0gICAgci54LmJ4ID0gc2VsOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIHJldHVybiAoKHVsb25nKXIueC5jeCA8PCAxNikgKyByLnguZHg7Ci19Ci0KLWludCBQTUFQSSBEUE1JX3NldFNlbGVjdG9yTGltaXQodXNob3J0IHNlbCx1bG9uZyBsaW1pdCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSA4OyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgc2V0IHNlbGVjdG9yIGxpbWl0ICAgICAgICAgICovCi0gICAgci54LmJ4ID0gc2VsOwotICAgIHIueC5jeCA9IGxpbWl0ID4+IDE2OwotICAgIHIueC5keCA9IGxpbWl0ICYgMHhGRkZGOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQgUE1BUEkgRFBNSV9jcmVhdGVTZWxlY3Rvcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0KQotewotICAgIHVpbnQgICAgc2VsOwotICAgIFBNUkVHUyAgcjsKLQotICAgIC8qIEFsbG9jYXRlIDEgZGVzY3JpcHRvciAqLwotICAgIHIueC5heCA9IDA7Ci0gICAgci54LmN4ID0gMTsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKSByZXR1cm4gMDsKLSAgICBzZWwgPSByLnguYXg7Ci0KLSAgICAvKiBTZXQgdGhlIGRlc2NyaXB0b3IgYWNjZXNzIHJpZ2h0cyAoZm9yIGEgMzIgYml0IHBhZ2UgZ3JhbnVsYXIKLSAgICAgKiBzZWdtZW50KS4KLSAgICAgKi8KLSAgICBpZiAobGltaXQgPj0gMHgxMDAwMEwpIHsKLQlyLnguYXggPSA5OwotCXIueC5ieCA9IHNlbDsKLQlyLnguY3ggPSAweDQwRjM7Ci0JUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0JfQotCi0gICAgLyogTWFwIHBoeXNpY2FsIG1lbW9yeSBhbmQgY3JlYXRlIHNlbGVjdG9yICovCi0gICAgaWYgKChiYXNlID0gRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKGJhc2UsbGltaXQpKSA9PSAweEZGRkZGRkZGVUwpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yQmFzZShzZWwsYmFzZSkpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yTGltaXQoc2VsLGxpbWl0KSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gc2VsOwotfQotCi12b2lkIFBNQVBJIERQTUlfZnJlZVNlbGVjdG9yKHVpbnQgc2VsKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDE7Ci0gICAgci54LmJ4ID0gc2VsOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotfQotCi1pbnQgUE1BUEkgRFBNSV9sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbikKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSAweDYwMDsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIExvY2sgTGluZWFyIFJlZ2lvbiAgICAgICovCi0gICAgci54LmJ4ID0gKGxpbmVhciA+PiAxNik7ICAgICAgICAgICAgLyogTGluZWFyIGFkZHJlc3MgaW4gQlg6Q1ggICAgICAqLwotICAgIHIueC5jeCA9IChsaW5lYXIgJiAweEZGRkYpOwotICAgIHIueC5zaSA9IChsZW4gPj4gMTYpOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBpbiBTSTpESSAgICAgICAgICAgICAgKi8KLSAgICByLnguZGkgPSAobGVuICYgMHhGRkZGKTsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICByZXR1cm4gKCFyLnguY2ZsYWcpOwotfQotCi1pbnQgUE1BUEkgRFBNSV91bmxvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDB4NjAxOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgVW5sb2NrIExpbmVhciBSZWdpb24gICAgKi8KLSAgICByLnguYnggPSAobGluZWFyID4+IDE2KTsgICAgICAgICAgICAvKiBMaW5lYXIgYWRkcmVzcyBpbiBCWDpDWCAgICAgICovCi0gICAgci54LmN4ID0gKGxpbmVhciAmIDB4RkZGRik7Ci0gICAgci54LnNpID0gKGxlbiA+PiAxNik7ICAgICAgICAgICAgICAgLyogTGVuZ3RoIGluIFNJOkRJICAgICAgICAgICAgICAqLwotICAgIHIueC5kaSA9IChsZW4gJiAweEZGRkYpOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIHJldHVybiAoIXIueC5jZmxhZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRqdXN0IHRoZSBwYWdlIHRhYmxlIGNhY2hpbmcgYml0cyBkaXJlY3RseS4gUmVxdWlyZXMgcmluZyAwIGFjY2VzcyBhbmQKLW9ubHkgd29ya3Mgd2l0aCBET1M0R1cgYW5kIGNvbXBhdGlibGUgZXh0ZW5kZXJzIChDYXVzZVdheSBhbHNvIHdvcmtzIHNpbmNlCi1pdCBoYXMgZGlyZWN0IHN1cHBvcnQgZm9yIHRoZSByaW5nIDAgaW5zdHJ1Y3Rpb25zIHdlIG5lZWQgZnJvbSByaW5nIDMpLiBXaWxsCi1ub3Qgd29yayBpbiBhIERPUyBib3gsIGJ1dCB3ZSBjYWxsIGludG8gdGhlIHJpbmcgMCBoZWxwZXIgVnhEIHNvIHdlIHNob3VsZAotbmV2ZXIgZ2V0IGhlcmUgaW4gYSBET1MgYm94IGFueXdheSAoYXNzdW1pbmcgdGhlIFZ4RCBpcyBwcmVzZW50KS4gSWYgd2UKLWRvIGdldCBoZXJlIGFuZCB3ZSBhcmUgaW4gd2luZG93cywgdGhpcyBjb2RlIHdpbGwgYmUgc2tpcHBlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBQTV9hZGp1c3RQYWdlVGFibGVzKAotICAgIHVsb25nIGxpbmVhciwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSNpZmRlZiAgRE9TNEdXCi0gICAgaW50ICAgICBzdGFydFBEQixlbmRQREIsaVBEQixzdGFydFBhZ2UsZW5kUGFnZSxzdGFydCxlbmQsaVBhZ2U7Ci0gICAgdWxvbmcgICBhbmRNYXNrLG9yTWFzayxwYWdlVGFibGUsKnBQYWdlVGFibGU7Ci0KLSAgICBhbmRNYXNrID0gfjB4MTg7Ci0gICAgb3JNYXNrID0gKGlzQ2FjaGVkKSA/IDB4MDAgOiAweDE4OwotICAgIGlmIChfUE1fcGFnaW5nRW5hYmxlZCgpID09IDEgJiYgKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCkgewotCWlmIChfUE1faGF2ZUNhdXNlV2F5KSB7Ci0JICAgIC8qIENhdXNlV2F5IGlzIGEgbGl0dGxlIGRpZmZlcmVudCBpbiB0aGUgcGFnZSB0YWJsZSBoYW5kbGluZy4KLQkgICAgICogVGhlIGNvZGUgdGhhdCB3ZSB1c2UgZm9yIERPUzRHL1cgZG9lcyBub3QgYXBwZWFyIHRvIHdvcmsKLQkgICAgICogd2l0aCBDYXVzZVdheSBjb3JyZWN0bHkgYXMgaXQgZG9lcyBub3QgYXBwZWFyIHRvIGFsbG93IHVzCi0JICAgICAqIHRvIG1hcCB0aGUgcGFnZSB0YWJsZXMgZGlyZWN0bHkuIEluc3RlYWQgd2UgY2FuIGRpcmVjdGx5Ci0JICAgICAqIGFjY2VzcyB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIGluIGV4dGVuZGVkIG1lbW9yeSB3aGVyZQotCSAgICAgKiBDYXVzZVdheSBhbHdheXMgbG9jYXRlcyB0aGVtIChzdGFydGluZyBhdCAxMDI0KjQwOTYqMTAyMykKLQkgICAgICovCi0JICAgIHN0YXJ0UGFnZSA9IChsaW5lYXIgPj4gMTIpOwotCSAgICBlbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKTsKLQkgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopQ1dfUEFHRV9UQUJMRV9TVEFSVDsKLQkgICAgZm9yIChpUGFnZSA9IHN0YXJ0UGFnZTsgaVBhZ2UgPD0gZW5kUGFnZTsgaVBhZ2UrKykKLQkJcFBhZ2VUYWJsZVtpUGFnZV0gPSAocFBhZ2VUYWJsZVtpUGFnZV0gJiBhbmRNYXNrKSB8IG9yTWFzazsKLQkgICAgfQotCWVsc2UgewotCSAgICBwUERCID0gKHVsb25nKilEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoUERCLDB4RkZGKTsKLQkgICAgaWYgKHBQREIpIHsKLQkJc3RhcnRQREIgPSAobGluZWFyID4+IDIyKSAmIDB4M0ZGOwotCQlzdGFydFBhZ2UgPSAobGluZWFyID4+IDEyKSAmIDB4M0ZGOwotCQllbmRQREIgPSAoKGxpbmVhcitsaW1pdCkgPj4gMjIpICYgMHgzRkY7Ci0JCWVuZFBhZ2UgPSAoKGxpbmVhcitsaW1pdCkgPj4gMTIpICYgMHgzRkY7Ci0JCWZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7Ci0JCSAgICBwYWdlVGFibGUgPSBwUERCW2lQREJdICYgfjB4RkZGOwotCQkgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRik7Ci0JCSAgICBzdGFydCA9IChpUERCID09IHN0YXJ0UERCKSA/IHN0YXJ0UGFnZSA6IDA7Ci0JCSAgICBlbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOwotCQkgICAgZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspCi0JCQlwUGFnZVRhYmxlW2lQYWdlXSA9IChwUGFnZVRhYmxlW2lQYWdlXSAmIGFuZE1hc2spIHwgb3JNYXNrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQlQTV9mbHVzaFRMQigpOwotCX0KLSNlbmRpZgotfQotCi12b2lkICogUE1BUEkgRFBNSV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICBQTVNSRUdTICAgICBzcmVnczsKLSAgICB1bG9uZyAgICAgICBsaW5BZGRyOwotICAgIHVsb25nICAgICAgIERTQmFzZUFkZHI7Ci0KLSAgICAvKiBHZXQgdGhlIGJhc2UgYWRkcmVzcyBmb3IgdGhlIGRlZmF1bHQgRFMgc2VsZWN0b3IgKi8KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgRFNCYXNlQWRkciA9IERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmRzKTsKLSAgICBpZiAoKGJhc2UgPCAweDEwMDAwMCkgJiYgKERTQmFzZUFkZHIgPT0gMCkpIHsKLQkvKiBEUyBpcyB6ZXJvIGJhc2VkLCBzbyB3ZSBjYW4gZGlyZWN0bHkgYWNjZXNzIHRoZSBmaXJzdCAxTWIgb2YKLQkgKiBzeXN0ZW0gbWVtb3J5IChsaWtlIHVuZGVyIERPUzRHVykuCi0JICovCi0JcmV0dXJuICh2b2lkKiliYXNlOwotCX0KLQotICAgIC8qIE1hcCB0aGUgbWVtb3J5IHRvIGEgbGluZWFyIGFkZHJlc3MgdXNpbmcgRFBNSSBmdW5jdGlvbiAweDgwMCAqLwotICAgIGlmICgobGluQWRkciA9IERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihiYXNlLGxpbWl0KSkgPT0gMHhGRkZGRkZGRikgewotCWlmIChiYXNlID49IDB4MTAwMDAwKQotCSAgICByZXR1cm4gTlVMTDsKLQkvKiBJZiB0aGUgbGluZWFyIGFkZHJlc3MgbWFwcGluZyBmYWlscyBidXQgd2UgYXJlIHRyeWluZyB0bwotCSAqIG1hcCBhbiBhcmVhIGluIHRoZSBmaXJzdCAxTWIgb2Ygc3lzdGVtIG1lbW9yeSwgdGhlbiB3ZSBtdXN0Ci0JICogYmUgcnVubmluZyB1bmRlciBhIFdpbmRvd3Mgb3IgT1MvMiBET1MgYm94LiBVbmRlciB0aGVzZQotCSAqIGVudmlyb25tZW50cyB3ZSBjYW4gdXNlIHRoZSBzZWdtZW50IHdyYXAgYXJvdW5kIGFzIGEgZmFsbGJhY2sKLQkgKiBtZWFzdXJlLCBhcyB0aGlzIGRvZXMgd29yayBwcm9wZXJseS4KLQkgKi8KLQlsaW5BZGRyID0gYmFzZTsKLQl9Ci0KLSAgICAvKiBOb3cgZXhwYW5kIHRoZSBkZWZhdWx0IERTIHNlbGVjdG9yIHRvIDRHYiBzbyB3ZSBjYW4gYWNjZXNzIGl0ICovCi0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yTGltaXQoc3JlZ3MuZHMsMHhGRkZGRkZGRlVMKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEZpbmFsbHkgZW5hYmxlIGNhY2hpbmcgZm9yIHRoZSBwYWdlIHRhYmxlcyB0aGF0IHdlIGp1c3QgbWFwcGVkIGluLAotICAgICAqIHNpbmNlIERPUzRHVyBhbmQgUE1PREUvVyBjcmVhdGUgdGhlIHBhZ2UgdGFibGUgZW50cmllcyB3aXRob3V0Ci0gICAgICogY2FjaGluZyBlbmFibGVkIHdoaWNoIGh1cnRzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbGluZWFyIGZyYW1lYnVmZmVyCi0gICAgICogYXMgaXQgZGlzYWJsZXMgd3JpdGUgY29tYmluaW5nIG9uIFBlbnRpdW0gUHJvIGFuZCBhYm92ZSBwcm9jZXNzb3JzLgotICAgICAqCi0gICAgICogRm9yIHRob3NlIHByb2Nlc3NvcnMgY2FjaGUgZGlzYWJsaW5nIGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggdGhlCi0gICAgICogTVRSUiByZWdpc3RlcnMgYW55d2F5ICh3ZSBjYW4gd3JpdGUgY29tYmluZSBhIHJlZ2lvbiBidXQgZGlzYWJsZQotICAgICAqIGNhY2hpbmcpIHNvIHRoYXQgTU1JTyByZWdpc3RlciByZWdpb25zIGRvIG5vdCBzY3JldyB1cC4KLSAgICAgKi8KLSAgICBpZiAoRFNCYXNlQWRkciA9PSAwKQotCVBNX2FkanVzdFBhZ2VUYWJsZXMobGluQWRkcixsaW1pdCxpc0NhY2hlZCk7Ci0KLSAgICAvKiBOb3cgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBpbnRvIHRoZSBkZWZhdWx0IERTICovCi0gICAgcmV0dXJuICh2b2lkKikobGluQWRkciAtIERTQmFzZUFkZHIpOwotfQotCi0jaWYgZGVmaW5lZChQTTM4NikKLQotLyogU29tZSBET1MgZXh0ZW5kZXIgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGNhbGxpbmcgYQotICogcmVhbCBtb2RlIHByb2NlZHVyZSBmcm9tIHByb3RlY3RlZCBtb2RlLiBIb3dldmVyIHdlIGNhbiBzaW11bGF0ZSB3aGF0Ci0gKiB3ZSBuZWVkIHRlbXBvcmFyaWx5IGhvb2tpbmcgdGhlIElOVCA2QWggdmVjdG9yIHdpdGggYSBzbWFsbCByZWFsIG1vZGUKLSAqIHN0dWIgdGhhdCB3aWxsIGNhbGwgb3VyIHJlYWwgbW9kZSBjb2RlIGZvciB1cy4KLSAqLwotCi1zdGF0aWMgdWNoYXIgaW50NkFIYW5kbGVyW10gPSB7Ci0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgIC8qICBfX1BNT0RFX2NhbGxSZWFsIHZhcmlhYmxlICAgICAgICAgICAqLwotICAgIDB4RkIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgc3RpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgLyogIGNhbGwgICAgW2NzOl9fUE1PREVfY2FsbFJlYWxdICAgICAgICovCi0gICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgIC8qICBpcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci1zdGF0aWMgdWNoYXIgKmNyUHRyID0gTlVMTDsgLyogUG9pbnRlciB0byBvZiBpbnQgNkEgaGFuZGxlciAgICAgICAgICovCi1zdGF0aWMgdWludCBjclJTZWcsY3JST2ZmOyAgLyogUmVhbCBtb2RlIHNlZzpvZmZzZXQgb2YgaGFuZGxlciAgICAgICovCi0KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIHVjaGFyICAgKnA7Ci0gICAgdWludCAgICBvbGRTZWcsb2xkT2ZmOwotCi0gICAgaWYgKCFjclB0cikgewotCS8qIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBtZW1vcnkgYmxvY2sgb25seSBvbmNlICovCi0JY3JQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGludDZBSGFuZGxlciksICZjclJTZWcsICZjclJPZmYpOwotCW1lbWNweShjclB0cixpbnQ2QUhhbmRsZXIsc2l6ZW9mKGludDZBSGFuZGxlcikpOwotCX0KLSAgICBQTV9zZXRXb3JkKGNyUHRyLG9mZik7ICAgICAgICAgICAgICAvKiBQbHVnIGluIGFkZHJlc3MgdG8gY2FsbCAgKi8KLSAgICBQTV9zZXRXb3JkKGNyUHRyKzIsc2VnKTsKLSAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoMCwweDZBICogNCk7Ci0gICAgb2xkT2ZmID0gUE1fZ2V0V29yZChwKTsgICAgICAgICAgICAgLyogU2F2ZSBvbGQgaGFuZGxlciBhZGRyZXNzICovCi0gICAgb2xkU2VnID0gUE1fZ2V0V29yZChwKzIpOwotICAgIFBNX3NldFdvcmQocCxjclJPZmYrNCk7ICAgICAgICAgICAgIC8qIEhvb2sgNkEgaGFuZGxlciAgICAgICAgICAqLwotICAgIFBNX3NldFdvcmQocCsyLGNyUlNlZyk7Ci0gICAgUE1faW50ODZ4KDB4NkEsIGluLCBpbiwgc3JlZ3MpOyAgICAgLyogQ2FsbCByZWFsIG1vZGUgY29kZSAgICAgICovCi0gICAgUE1fc2V0V29yZChwLG9sZE9mZik7ICAgICAgICAgICAgICAgLyogUmVzdG9yZSBvbGQgaGFuZGxlciAgICAgICovCi0gICAgUE1fc2V0V29yZChwKzIsb2xkU2VnKTsKLX0KLQotI2VuZGlmICAvKiBQTTM4NiAqLwotCi0jZW5kaWYgIC8qICFSRUFMTU9ERSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeS4gVGhlIG1lbW9yeQotbWF5IGJlIHJlcXVpcmVkIHRvIGJlIGJlbG93IHRoZSAxNk1lZyBib3VuZGFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNZWcpCi17Ci0gICAgdWNoYXIgICAgICAgICAgICpwLCpyb3VuZGVkUDsKLSAgICB1aW50ICAgICAgICAgICAgcl9zZWcscl9vZmY7Ci0gICAgdWludCAgICAgICAgICAgIHJvdW5kZWRTaXplID0gKHNpemUgKyA0ICsgMHhGRkYpICYgfjB4RkZGOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsgLyogVW51c2VkIGluIERPUyAqLwotI2lmbmRlZiBSRUFMTU9ERQotICAgIFZYRF9yZWdzICAgICAgICByZWdzOwotCi0gICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZSB0aGUKLSAgICAgKiBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgdGhhdCB3ZSBuZWVkLgotICAgICAqLwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9BTExPQ0xPQ0tFRCk7Ci0JcmVncy5lYnggPSBzaXplOwotCXJlZ3MuZWN4ID0gKHVsb25nKXBoeXNBZGRyOwotCXJlZ3MuZWR4ID0gY29udGlndW91cyB8IChiZWxvdzE2TWVnIDw8IDgpOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OwotCX0KLQotICAgIC8qIElmIHRoZSBtZW1vcnkgaXMgbm90IGNvbnRpZ3VvdXMsIHdlIHNpbXBseSBuZWVkIHRvIGFsbG9jYXRlIGl0Ci0gICAgICogdXNpbmcgcmVndWxhciBtZW1vcnkgYWxsb2NhdGlvbiBzZXJ2aWNlcywgYW5kIGxvY2sgaXQgZG93bgotICAgICAqIGluIG1lbW9yeS4KLSAgICAgKgotICAgICAqIEZvciBjb250aWd1b3VzIG1lbW9yeSBibG9ja3MsIHRoZSBvbmx5IHdheSB0byBndWFyYW50ZWUgY29udGlndW91cyBwaHlzaWNhbAotICAgICAqIG1lbW9yeSBhZGRyZXNzZXMgdW5kZXIgRE9TIGlzIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgYmVsb3cgdGhlCi0gICAgICogMU1lZyBib3VuZGFyeSBhcyByZWFsIG1vZGUgbWVtb3J5LgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHdlIG11c3QgcGFnZSBhbGlnbiB0aGUgbWVtb3J5IGJsb2NrLCBhbmQgd2UgYWxzbyBtdXN0Ci0gICAgICoga2VlcCB0cmFjayBvZiB0aGUgbm9uLWFsaWduZWQgcG9pbnRlciBzbyB3ZSBjYW4gcHJvcGVybHkgZnJlZQotICAgICAqIGl0IGxhdGVyLiBIZW5jZSB3ZSBhY3R1YWxseSBhbGxvY2F0ZSA0IGJ5dGVzIG1vcmUgdGhhbiB0aGUKLSAgICAgKiBzaXplIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgNEsgYm91bmRhcnkuCi0gICAgICovCi0gICAgaWYgKCFjb250aWd1b3VzKQotCXAgPSBQTV9tYWxsb2Mocm91bmRlZFNpemUpOwotICAgIGVsc2UKLSNlbmRpZgotCXAgPSBQTV9hbGxvY1JlYWxTZWcocm91bmRlZFNpemUsJnJfc2VnLCZyX29mZik7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICByb3VuZGVkUCA9ICh2b2lkKikoKCh1bG9uZylwICsgMHhGRkYpICYgfjB4RkZGKTsKLSAgICAqKCh1bG9uZyopKHJvdW5kZWRQICsgc2l6ZSkpID0gKHVsb25nKXA7Ci0gICAgUE1fbG9ja0RhdGFQYWdlcyhyb3VuZGVkUCxzaXplLCZsaCk7Ci0gICAgaWYgKCgqcGh5c0FkZHIgPSBQTV9nZXRQaHlzaWNhbEFkZHIocm91bmRlZFApKSA9PSAweEZGRkZGRkZGKSB7Ci0JUE1fZnJlZUxvY2tlZE1lbShyb3VuZGVkUCxzaXplLGNvbnRpZ3VvdXMpOwotCXJldHVybiBOVUxMOwotCX0KLQotICAgIC8qIERpc2FibGUgY2FjaGluZyBmb3IgdGhlIG1lbW9yeSBzaW5jZSBpdCBpcyBwcm9iYWJseSBhIERNQSBidWZmZXIgKi8KLSNpZm5kZWYgUkVBTE1PREUKLSAgICBQTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylyb3VuZGVkUCxzaXplLTEsZmFsc2UpOwotI2VuZGlmCi0gICAgcmV0dXJuIHJvdW5kZWRQOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBsb2NrZWQgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKQotewotI2lmbmRlZiBSRUFMTU9ERQotICAgIFZYRF9yZWdzICAgICAgICByZWdzOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsgLyogVW51c2VkIGluIERPUyAqLwotCi0gICAgaWYgKCFwKQotCXJldHVybjsKLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfRlJFRUxPQ0tFRCk7Ci0JcmVncy5lYnggPSAodWxvbmcpcDsKLQlyZWdzLmVjeCA9IHNpemU7Ci0JcmVncy5lZHggPSBjb250aWd1b3VzOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm47Ci0JfQotICAgIFBNX3VubG9ja0RhdGFQYWdlcyhwLHNpemUsJmxoKTsKLSAgICBpZiAoIWNvbnRpZ3VvdXMpCi0JZnJlZSgqKCh2b2lkKiopKCh1Y2hhciopcCArIHNpemUpKSk7Ci0gICAgZWxzZQotI2VuZGlmCi0JUE1fZnJlZVJlYWxTZWcoKigodm9pZCoqKSgoY2hhciopcCArIHNpemUpKSk7Ci19Ci0KLSNpZm5kZWYgUkVBTE1PREUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgbmV3IGJsb2NrIG9mIHBhZ2VzIGZvciB0aGUgcGFnZSBibG9jayBtYW5hZ2VyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBwYWdlYmxvY2sgKlBNX2FkZE5ld1BhZ2VCbG9jayh2b2lkKQotewotICAgIGludCAgICAgICAgIGksc2l6ZTsKLSAgICBwYWdlYmxvY2sgICAqbmV3QmxvY2s7Ci0gICAgY2hhciAgICAgICAgKnAsKm5leHQ7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgcGFnZSBibG9jaywgYW5kIGFkZCB0byBoZWFkIG9mIGxpc3QgKi8KLSAgICBzaXplID0gUEFHRVNfUEVSX0JMT0NLICogUE1fUEFHRV9TSVpFICsgKFBNX1BBR0VfU0laRS0xKSArIHNpemVvZihwYWdlYmxvY2spOwotICAgIGlmICgobmV3QmxvY2sgPSBQTV9tYWxsb2Moc2l6ZSkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbmV3QmxvY2stPnByZXYgPSBOVUxMOwotICAgIG5ld0Jsb2NrLT5uZXh0ID0gcGFnZUJsb2NrczsKLSAgICBpZiAocGFnZUJsb2NrcykKLQlwYWdlQmxvY2tzLT5wcmV2ID0gbmV3QmxvY2s7Ci0gICAgcGFnZUJsb2NrcyA9IG5ld0Jsb2NrOwotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgcGFnZSBhbGlnbmVkIGZyZWUgbGlzdCBmb3IgdGhlIHBhZ2UgYmxvY2sgKi8KLSAgICBuZXdCbG9jay0+ZnJlZUNvdW50ID0gUEFHRVNfUEVSX0JMT0NLOwotICAgIG5ld0Jsb2NrLT5mcmVlTGlzdCA9IHAgPSAoY2hhciopKCgodWxvbmcpKG5ld0Jsb2NrICsgMSkgKyAoUE1fUEFHRV9TSVpFLTEpKSAmIH4oUE1fUEFHRV9TSVpFLTEpKTsKLSAgICBuZXdCbG9jay0+ZnJlZUxpc3RTdGFydCA9IG5ld0Jsb2NrLT5mcmVlTGlzdDsKLSAgICBuZXdCbG9jay0+ZnJlZUxpc3RFbmQgPSBwICsgKFBBR0VTX1BFUl9CTE9DSy0xKSAqIFBNX1BBR0VfU0laRTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgUEFHRVNfUEVSX0JMT0NLOyBpKysscCA9IG5leHQpCi0JRlJFRUxJU1RfTkVYVChwKSA9IG5leHQgPSBwICsgUE1fUEFHRV9TSVpFOwotICAgIEZSRUVMSVNUX05FWFQocCAtIFBNX1BBR0VfU0laRSkgPSBOVUxMOwotICAgIHJldHVybiBuZXdCbG9jazsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAotICAgIGlib29sIGxvY2tlZCkKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICBWWERfcmVncyAgICAgICAgcmVnczsKLSAgICBwYWdlYmxvY2sgICAgICAgKmJsb2NrOwotICAgIHZvaWQgICAgICAgICAgICAqcDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KLQotICAgIC8qIENhbGwgdGhlIGhlbHBlciBWeEQgZm9yIHRoaXMgc2VydmljZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhIERPUyBib3ggKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfQUxMT0NQQUdFKTsKLQlyZWdzLmVieCA9IGxvY2tlZDsKLQlfUE1fVnhEQ2FsbCgmcmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci0JcmV0dXJuICh2b2lkKilyZWdzLmVheDsKLQl9Ci0KLSAgICAvKiBTY2FuIHRoZSBibG9jayBsaXN0IGxvb2tpbmcgZm9yIGFueSBmcmVlIGJsb2Nrcy4gQWxsb2NhdGUgYSBuZXcKLSAgICAgKiBwYWdlIGJsb2NrIGlmIG5vIGZyZWUgYmxvY2tzIGFyZSBmb3VuZC4KLSAgICAgKi8KLSAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgewotCWlmIChibG9jay0+ZnJlZUNvdW50KQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGJsb2NrID09IE5VTEwgJiYgKGJsb2NrID0gUE1fYWRkTmV3UGFnZUJsb2NrKCkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgYmxvY2stPmZyZWVDb3VudC0tOwotICAgIHAgPSBibG9jay0+ZnJlZUxpc3Q7Ci0gICAgYmxvY2stPmZyZWVMaXN0ID0gRlJFRUxJU1RfTkVYVChwKTsKLSAgICBpZiAobG9ja2VkKQotCVBNX2xvY2tEYXRhUGFnZXMocCxQTV9QQUdFX1NJWkUsJmxoKTsKLSAgICByZXR1cm4gcDsKLSNlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBhZ2UoCi0gICAgdm9pZCAqcCkKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICBWWERfcmVncyAgICByZWdzOwotICAgIHBhZ2VibG9jayAgICpibG9jazsKLQotICAgIC8qIENhbGwgdGhlIGhlbHBlciBWeEQgZm9yIHRoaXMgc2VydmljZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhIERPUyBib3ggKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfRlJFRVBBR0UpOwotCXJlZ3MuZWJ4ID0gKHVsb25nKXA7Ci0JX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOwotCXJldHVybjsKLQl9Ci0KLSAgICAvKiBGaXJzdCBmaW5kIHRoZSBwYWdlIGJsb2NrIHRoYXQgdGhpcyBwYWdlIGJlbG9uZ3MgdG8gKi8KLSAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgewotCWlmIChwID49IGJsb2NrLT5mcmVlTGlzdFN0YXJ0ICYmIHAgPD0gYmxvY2stPmZyZWVMaXN0RW5kKQotCSAgICBicmVhazsKLQl9Ci0gICAgQ0hFQ0soYmxvY2sgIT0gTlVMTCk7Ci0KLSAgICAvKiBOb3cgZnJlZSB0aGUgYmxvY2sgYnkgYWRkaW5nIGl0IHRvIHRoZSBmcmVlIGxpc3QgKi8KLSAgICBGUkVFTElTVF9ORVhUKHApID0gYmxvY2stPmZyZWVMaXN0OwotICAgIGJsb2NrLT5mcmVlTGlzdCA9IHA7Ci0gICAgaWYgKCsrYmxvY2stPmZyZWVDb3VudCA9PSBQQUdFU19QRVJfQkxPQ0spIHsKLQkvKiBJZiBhbGwgcGFnZXMgaW4gdGhlIHBhZ2UgYmxvY2sgYXJlIG5vdyBmcmVlLCBmcmVlIHRoZSBlbnRpcmUKLQkgKiBwYWdlIGJsb2NrIGl0c2VsZi4KLQkgKi8KLQlpZiAoYmxvY2sgPT0gcGFnZUJsb2NrcykgewotCSAgICAvKiBEZWxldGUgZnJvbSBoZWFkICovCi0JICAgIHBhZ2VCbG9ja3MgPSBibG9jay0+bmV4dDsKLQkgICAgaWYgKGJsb2NrLT5uZXh0KQotCQlibG9jay0+bmV4dC0+cHJldiA9IE5VTEw7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogRGVsZXRlIGZyb20gbWlkZGxlIG9mIGxpc3QgKi8KLQkgICAgQ0hFQ0soYmxvY2stPnByZXYgIT0gTlVMTCk7Ci0JICAgIGJsb2NrLT5wcmV2LT5uZXh0ID0gYmxvY2stPm5leHQ7Ci0JICAgIGlmIChibG9jay0+bmV4dCkKLQkJYmxvY2stPm5leHQtPnByZXYgPSBibG9jay0+cHJldjsKLQkgICAgfQotCVBNX2ZyZWUoYmxvY2spOwotCX0KLSNlbHNlCi0gICAgKHZvaWQpcDsKLSNlbmRpZgotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRE9TIFJlYWwgTW9kZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBSRUFMTU9ERQotCi0jaWZuZGVmIE1LX0ZQCi0jZGVmaW5lIE1LX0ZQKHMsbykgICggKHZvaWQgZmFyICopKCAoKHVsb25nKShzKSA8PCAxNikgKyBcCi0JCSAgICAodWxvbmcpKG8pICkpCi0jZW5kaWYKLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsgcmV0dXJuIE1LX0ZQKHJfc2VnLHJfb2ZmKTsgfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICByZXR1cm4gTUtfRlAoMHg0MCwwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiBNS19GUCgweEEwMDAsMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICB1aW50IHNlbCA9IGJhc2UgPj4gNDsKLSAgICB1aW50IG9mZiA9IGJhc2UgJiAweEY7Ci0gICAgbGltaXQgPSBsaW1pdDsKLSAgICByZXR1cm4gTUtfRlAoc2VsLG9mZik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCi17IHB0ciA9IHB0cjsgfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsKLSAgICByZXR1cm4gKCgoKHVsb25nKXAgPj4gMTYpIDw8IDQpICsgKHVzaG9ydClwKTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2Uodm9pZCAqcCx1bG9uZyBsZW5ndGgsdWxvbmcgKnBoeXNBZGRyZXNzKQoteyByZXR1cm4gZmFsc2U7IH0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoteyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17Ci0gICAgLyogQ2FsbCBtYWxsb2MoKSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB1cyAqLwotICAgIHZvaWQgKnAgPSBQTV9tYWxsb2Moc2l6ZSk7Ci0gICAgKnJfc2VnID0gRlBfU0VHKHApOwotICAgICpyX29mZiA9IEZQX09GRihwKTsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgaWYgKG1lbSkgUE1fZnJlZShtZW0pOwotfQotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICByZXR1cm4gUE1faW50Mzg2KGludG5vLGluLG91dCk7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICByZXR1cm4gUE1faW50Mzg2eChpbnRubyxpbixvdXQsc3JlZ3MpOwotfQotCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQotewotICAgIFBNUkVHUyByZWdzOwotCi0gICAgcmVncy5oLmFoID0gMHg0ODsKLSAgICByZWdzLnguYnggPSAweEZGRkY7Ci0gICAgUE1faW50ODYoMHgyMSwmcmVncywmcmVncyk7Ci0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gcmVncy54LmJ4ICogMTZVTDsKLX0KLQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBQaGFyIExhcCBUTlQgRE9TIEV4dGVuZGVyIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIFROVAotCi0jaW5jbHVkZSA8cGxkb3MzMi5oPgotI2luY2x1ZGUgPHBoYXJsYXAuaD4KLSNpbmNsdWRlIDxodzM4Ni5oPgotCi1zdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOwotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICBpZiAoIXplcm9QdHIpCi0JemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkYsdHJ1ZSk7Ci0gICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIDB4NDAwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB2b2lkICpiYW5rUHRyOwotICAgIGlmICghYmFua1B0cikKLQliYW5rUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOwotICAgIHJldHVybiBiYW5rUHRyOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgQ09ORklHX0lORiAgY29uZmlnOwotICAgIFVMT05HICAgICAgIG9mZnNldDsKLSAgICBpbnQgICAgICAgICBlcnI7Ci0gICAgdWxvbmcgICAgICAgYmFzZUFkZHIsYmFzZU9mcyxuZXdMaW1pdDsKLSAgICBWWERfcmVncyAgICByZWdzOwotCi0gICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZQotICAgICAqIHRoZSBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIG1hcCBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgRFBNSSBzZXJ2aWNlcy4KLSAgICAgKiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGhlbHBlciBWeEQgY2FuIHByb3Blcmx5IGRpc2FibGUgY2FjaGluZwotICAgICAqIHdoZXJlIG5lY2Vzc2FyeSwgd2hpY2ggd2UgY2FuIG9ubHkgZG8gZGlyZWN0bHkgaGVyZSBpZiB3ZSBhcmUKLSAgICAgKiBydW5uaW5nIGF0IHJpbmcgMCAoaWU6IHVuZGVyIHJlYWwgRE9TKS4KLSAgICAgKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24gPT0gLTEpCi0JUE1faW5pdCgpOwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9NQVBQSFlTKTsKLQlyZWdzLmVieCA9IGJhc2U7Ci0JcmVncy5lY3ggPSBsaW1pdDsKLQlyZWdzLmVkeCA9IGlzQ2FjaGVkOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OwotCX0KLQotICAgIC8qIFJvdW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgNEtiIGJvdW5kYXJ5IGFuZCB0aGUgbGltaXQgdG8gYQotICAgICAqIDRLYi0xIGJvdW5kYXJ5IGJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZXMgdG8gVE5ULiBJZiB3ZSByb3VuZCB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCi0gICAgICogdGhhdCB3ZSByZXR1cm4uCi0gICAgICovCi0gICAgYmFzZU9mcyA9IGJhc2UgJiA0MDk1OwotICAgIGJhc2VBZGRyID0gYmFzZSAmIH40MDk1OwotICAgIG5ld0xpbWl0ID0gKChsaW1pdCtiYXNlT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKLSAgICBfZHhfY29uZmlnX2luZigmY29uZmlnLCAoVUNIQVIqKSZjb25maWcpOwotICAgIGVyciA9IF9keF9tYXBfcGh5cyhjb25maWcuY19kc19zZWwsYmFzZUFkZHIsKG5ld0xpbWl0ICsgNDA5NSkgLyA0MDk2LCZvZmZzZXQpOwotICAgIGlmIChlcnIgPT0gMTMwKSB7Ci0JLyogSWYgdGhlIFROVCBmdW5jdGlvbiBmYWlsZWQsIHdlIGFyZSBydW5uaW5nIGluIGEgRFBNSSBlbnZpcm9ubWVudAotCSAqIGFuZCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHdvcmsuIEhvd2V2ZXIgd2Uga25vdyBob3cgdG8gaGFuZGxlCi0JICogRFBNSSBwcm9wZXJseSwgc28gd2UgdXNlIG91ciBnZW5lcmljIERQTUkgZnVuY3Rpb25zIHRvIGRvCi0JICogd2hhdCB0aGUgVE5UIHJ1bnRpbWUgbGlicmFyaWVzIGNhbid0LgotCSAqLwotCXJldHVybiBEUE1JX21hcFBoeXNpY2FsQWRkcihiYXNlLGxpbWl0LGlzQ2FjaGVkKTsKLQl9Ci0gICAgaWYgKGVyciA9PSAwKQotCXJldHVybiAodm9pZCopKG9mZnNldCArIGJhc2VPZnMpOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsgcmV0dXJuIDB4RkZGRkZGRkZVTDsgfQotCi1pYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSh2b2lkICpwLHVsb25nIGxlbmd0aCx1bG9uZyAqcGh5c0FkZHJlc3MpCi17IHJldHVybiBmYWxzZTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKHZvaWQgKmJhc2UsdWxvbmcgbGltaXQpCi17IHJldHVybiAodm9pZCopYmFzZTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQotewotICAgIGlmICghemVyb1B0cikKLQl6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRik7Ci0gICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIE1LX1BIWVMocl9zZWcscl9vZmYpKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17Ci0gICAgVVNIT1JUICBhZGRyLHQ7Ci0gICAgdm9pZCAgICAqcDsKLQotICAgIGlmIChfZHhfcmVhbF9hbGxvYygoc2l6ZSArIDB4RikgPj4gNCwmYWRkciwmdCkgIT0gMCkKLQlyZXR1cm4gMDsKLSAgICAqcl9zZWcgPSBhZGRyOyAgICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IGFkZHJlc3MgICAgKi8KLSAgICAqcl9vZmYgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mZnNldCAgICAgKi8KLSAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoKnJfc2VnLCpyX29mZik7Ci0gICAgX1BNX2FkZFJlYWxNb2RlQmxvY2socCxhZGRyKTsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgaWYgKG1lbSkgX2R4X3JlYWxfZnJlZShfUE1fZmluZFJlYWxNb2RlQmxvY2sobWVtKSk7Ci19Ci0KLSNkZWZpbmUgSU5EUE1JKHJlZykgICAgIHJtcmVncy5yZWcgPSByZWdzLT5yZWcKLSNkZWZpbmUgT1VURFBNSShyZWcpICAgIHJlZ3MtPnJlZyA9IHJtcmVncy5yZWcKLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQotewotICAgIFNXSV9SRUdTICAgIHJtcmVnczsKLQotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgSU5EUE1JKGVheCk7IElORFBNSShlYngpOyBJTkRQTUkoZWN4KTsgSU5EUE1JKGVkeCk7IElORFBNSShlc2kpOyBJTkRQTUkoZWRpKTsKLQotICAgIF9keF9yZWFsX2ludChpbnRubywmcm1yZWdzKTsKLQotICAgIE9VVERQTUkoZWF4KTsgT1VURFBNSShlYngpOyBPVVREUE1JKGVjeCk7IE9VVERQTUkoZWR4KTsgT1VURFBNSShlc2kpOyBPVVREUE1JKGVkaSk7Ci0gICAgcmVncy0+ZmxhZ3MgPSBybXJlZ3MuZmxhZ3M7Ci19Ci0KLSNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZwotI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZwotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBTV0lfUkVHUyAgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0KLSAgICBfZHhfcmVhbF9pbnQoaW50bm8sJnJtcmVncyk7Ci0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgU1dJX1JFR1MgICAgcm1yZWdzOwotCi0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIHJtcmVncy5lcyA9IHNyZWdzLT5lczsKLSAgICBybXJlZ3MuZHMgPSBzcmVncy0+ZHM7Ci0KLSAgICBfZHhfcmVhbF9pbnQoaW50bm8sJnJtcmVncyk7Ci0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIHNyZWdzLT5lcyA9IHJtcmVncy5lczsKLSAgICBzcmVncy0+Y3MgPSBybXJlZ3MuY3M7Ci0gICAgc3JlZ3MtPnNzID0gcm1yZWdzLnNzOwotICAgIHNyZWdzLT5kcyA9IHJtcmVncy5kczsKLSAgICBvdXQtPnguY2ZsYWcgPSBybXJlZ3MuZmxhZ3MgJiAweDE7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0gICAgdWludCAgICBkYXRhWzI1XTsKLQotICAgIHIueC5heCA9IDB4MjUyMDsgICAgICAgICAgICAgICAgLyogR2V0IGZyZWUgbWVtb3J5IGluZm8gKi8KLSAgICByLnguYnggPSAwOwotICAgIHIuZS5lZHggPSAodWludClkYXRhOwotICAgIFBNX2ludDM4NigweDIxLCAmciwgJnIpOwotICAgICpwaHlzaWNhbCA9IGRhdGFbMjFdICogNDA5NjsKLSAgICAqdG90YWwgPSBkYXRhWzIzXSAqIDQwOTY7Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogU3ltYW50ZWMgQysrIERPU1ggYW5kIEZsYXNoVGVrIFgtMzIvWC0zMlZNIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKERPU1gpIHx8IGRlZmluZWQoWDMyVk0pCi0KLSNpZmRlZiAgWDMyVk0KLSNpbmNsdWRlIDx4MzIuaD4KLQotI2RlZmluZSBfeDM4Nl9ta19wcm90ZWN0ZWRfcHRyKHApICAgX3gzMl9ta19wcm90ZWN0ZWRfcHRyKCh2b2lkKilwKQotI2RlZmluZSBfeDM4Nl9mcmVlX3Byb3RlY3RlZF9wdHIocCkgX3gzMl9mcmVlX3Byb3RlY3RlZF9wdHIocCkKLSNkZWZpbmUgX3gzODZfemVyb19iYXNlX3B0ciAgICAgICAgIF94MzJfemVyb19iYXNlX3B0cgotI2Vsc2UKLWV4dGVybiB2b2lkICpfeDM4Nl96ZXJvX2Jhc2VfcHRyOwotI2VuZGlmCi0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17Ci0gICAgcmV0dXJuICh2b2lkKikoKHVsb25nKV94Mzg2X3plcm9fYmFzZV9wdHIgKyBNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIuaC5haCA9IDB4NDg7ICAgICAgICAgICAgICAgICAgLyogRE9TIGZ1bmN0aW9uIDQ4aCAtIGFsbG9jYXRlIG1lbSAgKi8KLSAgICByLnguYnggPSAoc2l6ZSArIDB4RikgPj4gNDsgICAgIC8qIE51bWJlciBvZiBwYXJhZ3JhcGhzIHRvIGFsbG9jYXRlICovCi0gICAgUE1faW50Mzg2KDB4MjEsICZyLCAmcik7ICAgICAgICAvKiBDYWxsIERPUyBleHRlbmRlciAgICAgICAgICAgICAgICAqLwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIENvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgbWVtb3J5ICAgICovCi0gICAgKnJfc2VnID0gci5lLmVheDsKLSAgICAqcl9vZmYgPSAwOwotICAgIHJldHVybiBQTV9tYXBSZWFsUG9pbnRlcigqcl9zZWcsKnJfb2ZmKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgLyogQ2Fubm90IGRlLWFsbG9jYXRlIHRoaXMgbWVtb3J5ICovCi0gICAgbWVtID0gbWVtOwotfQotCi0jcHJhZ21hIHBhY2soMSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVzaG9ydCAgaW50bm87Ci0gICAgdXNob3J0ICBkczsKLSAgICB1c2hvcnQgIGVzOwotICAgIHVzaG9ydCAgZnM7Ci0gICAgdXNob3J0ICBnczsKLSAgICB1bG9uZyAgIGVheDsKLSAgICB1bG9uZyAgIGVkeDsKLSAgICB9IF9STVJFR1M7Ci0KLSNwcmFnbWEgcGFjaygpCi0KLSNkZWZpbmUgSU4ocmVnKSAgICAgcmVncy5lLnJlZyA9IGluLT5lLnJlZwotI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcmVncy5lLnJlZwotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBfUk1SRUdTIHJtcmVnczsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBwbXNyZWdzOwotCi0gICAgcm1yZWdzLmludG5vID0gaW50bm87Ci0gICAgcm1yZWdzLmVheCA9IGluLT5lLmVheDsKLSAgICBybXJlZ3MuZWR4ID0gaW4tPmUuZWR4OwotICAgIElOKGVieCk7IElOKGVjeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgcmVncy54LmF4ID0gMHgyNTExOwotICAgIHJlZ3MuZS5lZHggPSAodWludCkoJnJtcmVncyk7Ci0gICAgUE1fc2VncmVhZCgmcG1zcmVncyk7Ci0gICAgUE1faW50Mzg2eCgweDIxLCZyZWdzLCZyZWdzLCZwbXNyZWdzKTsKLQotICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBvdXQtPnguZHggPSBybXJlZ3MuZWR4OwotICAgIG91dC0+eC5jZmxhZyA9IHJlZ3MueC5jZmxhZzsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsIFJNU1JFR1MgKnNyZWdzKQotewotICAgIF9STVJFR1Mgcm1yZWdzOwotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHBtc3JlZ3M7Ci0KLSAgICBybXJlZ3MuaW50bm8gPSBpbnRubzsKLSAgICBybXJlZ3MuZWF4ID0gaW4tPmUuZWF4OwotICAgIHJtcmVncy5lZHggPSBpbi0+ZS5lZHg7Ci0gICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOwotICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKLSAgICBJTihlYngpOyBJTihlY3gpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIHJlZ3MueC5heCA9IDB4MjUxMTsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpKCZybXJlZ3MpOwotICAgIFBNX3NlZ3JlYWQoJnBtc3JlZ3MpOwotICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmcG1zcmVncyk7Ci0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgc3JlZ3MtPmVzID0gcm1yZWdzLmVzOwotICAgIHNyZWdzLT5kcyA9IHJtcmVncy5kczsKLSAgICBvdXQtPnguZHggPSBybXJlZ3MuZWR4OwotICAgIG91dC0+eC5jZmxhZyA9IHJlZ3MueC5jZmxhZzsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICByZXR1cm4gKHZvaWQqKSgodWxvbmcpX3gzODZfemVyb19iYXNlX3B0ciArIDB4NDAwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiAodm9pZCopKCh1bG9uZylfeDM4Nl96ZXJvX2Jhc2VfcHRyICsgMHhBMDAwMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICBWWERfcmVncyAgICByZWdzOwotCi0gICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZQotICAgICAqIHRoZSBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIG1hcCBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgRFBNSSBzZXJ2aWNlcy4KLSAgICAgKiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGhlbHBlciBWeEQgY2FuIHByb3Blcmx5IGRpc2FibGUgY2FjaGluZwotICAgICAqIHdoZXJlIG5lY2Vzc2FyeSwgd2hpY2ggd2UgY2FuIG9ubHkgZG8gZGlyZWN0bHkgaGVyZSBpZiB3ZSBhcmUKLSAgICAgKiBydW5uaW5nIGF0IHJpbmcgMCAoaWU6IHVuZGVyIHJlYWwgRE9TKS4KLSAgICAgKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24gPT0gLTEpCi0JUE1faW5pdCgpOwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9NQVBQSFlTKTsKLQlyZWdzLmVieCA9IGJhc2U7Ci0JcmVncy5lY3ggPSBsaW1pdDsKLQlyZWdzLmVkeCA9IGlzQ2FjaGVkOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OwotCX0KLQotICAgIGlmIChiYXNlID4gMHgxMDAwMDApCi0JcmV0dXJuIF94Mzg2X21hcF9waHlzaWNhbF9hZGRyZXNzKCh2b2lkKiliYXNlLGxpbWl0KTsKLSAgICByZXR1cm4gKHZvaWQqKSgodWxvbmcpX3gzODZfemVyb19iYXNlX3B0ciArIGJhc2UpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotICAgIC8qIE1hcHBpbmcgY2Fubm90IGJlIGZyZWVkICovCi19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQoteyByZXR1cm4gMHhGRkZGRkZGRlVMOyB9Ci0KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcykKLXsgcmV0dXJuIGZhbHNlOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKLXsgcmV0dXJuICh2b2lkKiliYXNlOyB9Ci0KLXVsb25nIF9jZGVjbCBfWDMyX2dldFBoeXNNZW0odm9pZCk7Ci0KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgLyogR2V0IHRvdGFsIG1lbW9yeSBhdmFpbGFibGUsIGluY2x1ZGluZyB2aXJ0dWFsIG1lbW9yeSAqLwotICAgIHJlZ3MueC5heCA9IDB4MzUwQjsKLSAgICBQTV9pbnQzODYoMHgyMSwmcmVncywmcmVncyk7Ci0gICAgKnRvdGFsID0gcmVncy5lLmVheDsKLQotICAgIC8qIEdldCBwaHlzaWNhbCBtZW1vcnkgYXZhaWxhYmxlICovCi0gICAgKnBoeXNpY2FsID0gX1gzMl9nZXRQaHlzTWVtKCk7Ci0gICAgaWYgKCpwaHlzaWNhbCA+ICp0b3RhbCkKLQkqcGh5c2ljYWwgPSAqdG90YWw7Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQm9ybGFuZCdzIERQTUkzMiwgV2F0Y29tIERPUzRHVyBhbmQgREpHUFAgRFBNSSBzdXBwb3J0IHJvdXRpbmVzICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKERQTUkzMikgfHwgZGVmaW5lZChET1M0R1cpIHx8IGRlZmluZWQoREpHUFApCi0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHg0MDAsMHhGRkZGLHRydWUpOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQotewotICAgIFZYRF9yZWdzICAgIHJlZ3M7Ci0KLSNpZmRlZiAgREpHUFAKLSAgICAvKiBFbmFibGUgbmVhciBwb2ludGVycyBmb3IgREpHUFAgVjIgKi8KLSAgICBfX2RqZ3BwX25lYXJwdHJfZW5hYmxlKCk7Ci0jZW5kaWYKLSAgICAvKiBJZiB3ZSBoYXZlIGNvbm5lY3RlZCB0byBvdXIgaGVscGVyIFZ4RCBpbiBhIFdpbmRvd3MgRE9TIGJveCwgdXNlCi0gICAgICogdGhlIGhlbHBlciBWeEQgc2VydmljZXMgdG8gbWFwIG1lbW9yeSBpbnN0ZWFkIG9mIHRoZSBEUE1JIHNlcnZpY2VzLgotICAgICAqIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgaGVscGVyIFZ4RCBjYW4gcHJvcGVybHkgZGlzYWJsZSBjYWNoaW5nCi0gICAgICogd2hlcmUgbmVjZXNzYXJ5LCB3aGljaCB3ZSBjYW4gb25seSBkbyBkaXJlY3RseSBoZXJlIGlmIHdlIGFyZQotICAgICAqIHJ1bm5pbmcgYXQgcmluZyAwIChpZTogdW5kZXIgcmVhbCBET1MpLgotICAgICAqLwotICAgIGlmIChWWERfdmVyc2lvbiA9PSAtMSkKLQlQTV9pbml0KCk7Ci0gICAgaWYgKFZYRF92ZXJzaW9uKSB7Ci0JbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKLQlyZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX01BUFBIWVMpOwotCXJlZ3MuZWJ4ID0gYmFzZTsKLQlyZWdzLmVjeCA9IGxpbWl0OwotCXJlZ3MuZWR4ID0gaXNDYWNoZWQ7Ci0JX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOwotCXJldHVybiAodm9pZCopcmVncy5lYXg7Ci0JfQotICAgIHJldHVybiBEUE1JX21hcFBoeXNpY2FsQWRkcihiYXNlLGxpbWl0LGlzQ2FjaGVkKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBNYXBwaW5nIGNhbm5vdCBiZSBmcmVlZCAqLwotICAgICh2b2lkKXB0cjsKLSAgICAodm9pZClsaW1pdDsKLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgdWxvbmcgICBwaHlzQWRkcjsKLSAgICBpZiAoIVBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHAsMSwmcGh5c0FkZHIpKQotCXJldHVybiAweEZGRkZGRkZGOwotICAgIHJldHVybiBwaHlzQWRkciB8ICgodWxvbmcpcCAmIDB4RkZGKTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIFZYRF9yZWdzICAgIHJlZ3M7Ci0gICAgdWxvbmcgICAgICAgcHRlOwotICAgIFBNU1JFR1MgICAgIHNyZWdzOwotICAgIHVsb25nICAgICAgIERTQmFzZUFkZHI7Ci0KLSAgICAvKiBJZiB3ZSBoYXZlIGNvbm5lY3RlZCB0byBvdXIgaGVscGVyIFZ4RCBpbiBhIFdpbmRvd3MgRE9TIGJveCwgdXNlIHRoZQotICAgICAqIGhlbHBlciBWeEQgc2VydmljZXMgdG8gZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhbiBhZGRyZXNzLgotICAgICAqLwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9HRVRQSFlTSUNBTEFERFJSQU5HRSk7Ci0JcmVncy5lYnggPSAodWxvbmcpcDsKLQlyZWdzLmVjeCA9ICh1bG9uZylsZW5ndGg7Ci0JcmVncy5lZHggPSAodWxvbmcpcGh5c0FkZHJlc3M7Ci0JX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOwotCXJldHVybiByZWdzLmVheDsKLQl9Ci0KLSAgICAvKiBGaW5kIGJhc2UgYWRkcmVzcyBmb3IgZGVmYXVsdCBEUyBzZWxlY3RvciAqLwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICBEU0Jhc2VBZGRyID0gRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpOwotCi0gICAgLyogT3RoZXJ3aXNlIGRpcmVjdGx5IGFjY2VzcyB0aGUgcGFnZSB0YWJsZXMgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAqIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzLiBOb3RlIHRoYXQgd2UgdG91Y2ggdGhlIG1lbW9yeSBiZWZvcmUKLSAgICAgKiBjYWxsaW5nLCBvdGhlcndpc2UgdGhlIG1lbW9yeSBtYXkgbm90IGJlIHBhZ2VkIGluIGNvcnJlY3RseS4KLSAgICAgKi8KLSAgICBwdGUgPSAqKCh1bG9uZyopcCk7Ci0jaWZkZWYgIERPUzRHVwotICAgIGlmIChfUE1fcGFnaW5nRW5hYmxlZCgpID09IDApIHsKLQlpbnQgICAgIGNvdW50OwotCXVsb25nICAgbGluQWRkciA9ICh1bG9uZylwOwotCi0JLyogV2hlbiBwYWdpbmcgaXMgZGlzYWJsZWQgcGh5c2ljYWw9bGluZWFyICovCi0JZm9yIChjb3VudCA9IChsZW5ndGgrMHhGRkYpID4+IDEyOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKLQkgICAgKnBoeXNBZGRyZXNzKysgPSBsaW5BZGRyOwotCSAgICBsaW5BZGRyICs9IDQwOTY7Ci0JICAgIH0KLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgZWxzZSBpZiAoKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCAmJiBEU0Jhc2VBZGRyID09IDApIHsKLQlpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKLQl1bG9uZyAgIHBhZ2VUYWJsZSwqcFBhZ2VUYWJsZSxsaW5BZGRyID0gKHVsb25nKXA7Ci0JdWxvbmcgICBsaW1pdCA9IGxlbmd0aC0xOwotCi0JcFBEQiA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRik7Ci0JaWYgKHBQREIpIHsKLQkgICAgc3RhcnRQREIgPSAobGluQWRkciA+PiAyMikgJiAweDNGRkw7Ci0JICAgIHN0YXJ0UGFnZSA9IChsaW5BZGRyID4+IDEyKSAmIDB4M0ZGTDsKLQkgICAgZW5kUERCID0gKChsaW5BZGRyK2xpbWl0KSA+PiAyMikgJiAweDNGRkw7Ci0JICAgIGVuZFBhZ2UgPSAoKGxpbkFkZHIrbGltaXQpID4+IDEyKSAmIDB4M0ZGTDsKLQkgICAgZm9yIChpUERCID0gc3RhcnRQREI7IGlQREIgPD0gZW5kUERCOyBpUERCKyspIHsKLQkJcGFnZVRhYmxlID0gcFBEQltpUERCXSAmIH4weEZGRkw7Ci0JCXBQYWdlVGFibGUgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYpOwotCQlzdGFydCA9IChpUERCID09IHN0YXJ0UERCKSA/IHN0YXJ0UGFnZSA6IDA7Ci0JCWVuZCA9IChpUERCID09IGVuZFBEQikgPyBlbmRQYWdlIDogMHgzRkZMOwotCQlmb3IgKGlQYWdlID0gc3RhcnQ7IGlQYWdlIDw9IGVuZDsgaVBhZ2UrKykKLQkJICAgICpwaHlzQWRkcmVzcysrID0gKHBQYWdlVGFibGVbaVBhZ2VdICYgfjB4RkZGKTsKLQkJfQotCSAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSNlbmRpZgotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQotewotICAgICh2b2lkKWxpbWl0OwotICAgIHJldHVybiAodm9pZCopYmFzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsKLSAgICBzdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOwotCi0gICAgaWYgKCF6ZXJvUHRyKQotCXplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyBNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIFBNUkVHUyAgICAgIHI7Ci0gICAgdm9pZCAgICAgICAgKnA7Ci0KLSAgICByLnguYXggPSAweDEwMDsgICAgICAgICAgICAgICAgIC8qIERQTUkgYWxsb2NhdGUgRE9TIG1lbW9yeSAgICAgICAgICovCi0gICAgci54LmJ4ID0gKHNpemUgKyAweEYpID4+IDQ7ICAgICAvKiBudW1iZXIgb2YgcGFyYWdyYXBocyAgICAgICAgICAgICAqLwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIERQTUkgY2FsbCBmYWlsZWQgICAgICAgICAgICAgICAgICovCi0gICAgKnJfc2VnID0gci54LmF4OyAgICAgICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCAgICAgICAgICAgICAgICAqLwotICAgICpyX29mZiA9IDA7Ci0gICAgcCA9IFBNX21hcFJlYWxQb2ludGVyKCpyX3NlZywqcl9vZmYpOwotICAgIF9QTV9hZGRSZWFsTW9kZUJsb2NrKHAsci54LmR4KTsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgaWYgKG1lbSkgewotCXIueC5heCA9IDB4MTAxOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgZnJlZSBET1MgbWVtb3J5ICAgICAgICAgKi8KLQlyLnguZHggPSBfUE1fZmluZFJlYWxNb2RlQmxvY2sobWVtKTsvKiBEWCA6PSBzZWxlY3RvciBmcm9tIDB4MTAwICAgICovCi0JUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0JfQotfQotCi1zdGF0aWMgRFBNSV9oYW5kbGVyX3QgICBEUE1JX2ludDEwID0gTlVMTDsKLQotdm9pZCBQTUFQSSBEUE1JX3NldEludDEwSGFuZGxlcihEUE1JX2hhbmRsZXJfdCBoYW5kbGVyKQotewotICAgIERQTUlfaW50MTAgPSBoYW5kbGVyOwotfQotCi12b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgUE1SRUdTICAgICAgcjsKLSAgICBQTVNSRUdTICAgICBzcjsKLQotICAgIGlmIChpbnRubyA9PSAweDEwICYmIERQTUlfaW50MTApIHsKLQlpZiAoRFBNSV9pbnQxMChyZWdzKSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICBQTV9zZWdyZWFkKCZzcik7Ci0gICAgci54LmF4ID0gMHgzMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGlzc3VlIHJlYWwgaW50ZXJydXB0ICAgICovCi0gICAgci5oLmJsID0gaW50bm87Ci0gICAgci5oLmJoID0gMDsKLSAgICByLnguY3ggPSAwOwotICAgIHNyLmVzID0gc3IuZHM7Ci0gICAgci5lLmVkaSA9ICh1aW50KXJlZ3M7Ci0gICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICAgICAgICAgICovCi19Ci0KLSNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZwotI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZwotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0KLSAgICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOyAgICAgIC8qIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KLQotICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOwotICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKLQotICAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7ICAgICAgLyogRFBNSSBpc3N1ZSByZWFsIGludGVycnVwdCAgICAqLwotCi0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBzcmVncy0+ZXMgPSBybXJlZ3MuZXM7Ci0gICAgc3JlZ3MtPmNzID0gcm1yZWdzLmNzOwotICAgIHNyZWdzLT5zcyA9IHJtcmVncy5zczsKLSAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLSNwcmFnbWEgcGFjaygxKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdWludCAgICBMYXJnZXN0QmxvY2tBdmFpbDsKLQl1aW50ICAgIE1heFVubG9ja2VkUGFnZTsKLQl1aW50ICAgIExhcmdlc3RMb2NrYWJsZVBhZ2U7Ci0JdWludCAgICBMaW5BZGRyU3BhY2U7Ci0JdWludCAgICBOdW1GcmVlUGFnZXNBdmFpbDsKLQl1aW50ICAgIE51bVBoeXNpY2FsUGFnZXNGcmVlOwotCXVpbnQgICAgVG90YWxQaHlzaWNhbFBhZ2VzOwotCXVpbnQgICAgRnJlZUxpbkFkZHJTcGFjZTsKLQl1aW50ICAgIFNpemVPZlBhZ2VGaWxlOwotCXVpbnQgICAgcmVzWzNdOwotCX0gTWVtSW5mbzsKLQotI3ByYWdtYSBwYWNrKCkKLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0gICAgUE1TUkVHUyBzcjsKLSAgICBNZW1JbmZvIG1lbUluZm87Ci0KLSAgICBQTV9zZWdyZWFkKCZzcik7Ci0gICAgci54LmF4ID0gMHg1MDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGdldCBmcmVlIG1lbW9yeSBpbmZvICovCi0gICAgc3IuZXMgPSBzci5kczsKLSAgICByLmUuZWRpID0gKHVpbnQpJm1lbUluZm87Ci0gICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICovCi0gICAgKnBoeXNpY2FsID0gbWVtSW5mby5OdW1QaHlzaWNhbFBhZ2VzRnJlZSAqIDQwOTY7Ci0gICAgKnRvdGFsID0gbWVtSW5mby5MYXJnZXN0QmxvY2tBdmFpbDsKLSAgICBpZiAoKnRvdGFsIDwgKnBoeXNpY2FsKQotCSpwaHlzaWNhbCA9ICp0b3RhbDsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgX18xNkJJVF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCi0gICAgaW50IGJhbmspCi17Ci0gICAgRFBNSV9yZWdzICAgcmVnczsKLSAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7Ci0gICAgcmVncy5lYXggPSAweDRGMDU7Ci0gICAgcmVncy5lYnggPSAweDAwMDA7Ci0gICAgcmVncy5lZHggPSBiYW5rOwotICAgIERQTUlfaW50ODYoMHgxMCwmcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAotICAgIGludCBiYW5rKQotewotICAgIERQTUlfcmVncyAgIHJlZ3M7Ci0gICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOwotICAgIHJlZ3MuZWF4ID0gMHg0RjA1OwotICAgIHJlZ3MuZWJ4ID0gMHgwMDAwOwotICAgIHJlZ3MuZWR4ID0gYmFuazsKLSAgICBEUE1JX2ludDg2KDB4MTAsJnJlZ3MpOwotICAgIHJlZ3MuZWF4ID0gMHg0RjA1OwotICAgIHJlZ3MuZWJ4ID0gMHgwMDAxOwotICAgIHJlZ3MuZWR4ID0gYmFuazsKLSAgICBEUE1JX2ludDg2KDB4MTAsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IHdhaXRWUlQpCi17Ci0gICAgRFBNSV9yZWdzICAgcmVnczsKLSAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7Ci0gICAgcmVncy5lYXggPSAweDRGMDc7Ci0gICAgcmVncy5lYnggPSB3YWl0VlJUOwotICAgIHJlZ3MuZWN4ID0geDsKLSAgICByZWdzLmVkeCA9IHk7Ci0gICAgRFBNSV9pbnQ4NigweDEwLCZyZWdzKTsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtZG9zLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvcG1kb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjYzJkYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvcG1kb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMTYvMzIgYml0IERPUwotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkb3MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBSRUFMTU9ERQotc3RhdGljIGludCAgZ2xvYmFsRGF0YVN0YXJ0OwotI2VuZGlmCi0KLVBNX2NyaXRpY2FsSGFuZGxlciAgX1ZBUkFQSSBfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOwotUE1fYnJlYWtIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9icmVha0hhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLVBNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fa2V5SGFuZGxlciA9IE5VTEw7Ci1QTV9rZXkxNUhhbmRsZXIgICAgIF9WQVJBUEkgX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci1QTV9tb3VzZUhhbmRsZXIgICAgIF9WQVJBUEkgX1BNX21vdXNlSGFuZGxlciA9IE5VTEw7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX2ludDEwSGFuZGxlciA9IE5VTEw7Ci1pbnQgICAgICAgICAgICAgICAgIF9WQVJBUEkgX1BNX21vdXNlTWFzazsKLQotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3RybENQdHI7ICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3RybC1DIGZsYWcgICAgICAqLwotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3RybEJQdHI7ICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3RybC1CcmVhayBmbGFnICAqLwotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3JpdFB0cjsgICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3JpdGljYWwgZXJyb3IgQmYqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldlRpbWVyID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgdGltZXIgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldlJUQyA9IFBNTlVMTDsgICAgICAgLyogUHJldmlvdXMgUlRDIGhhbmRsZXIgICAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldktleSA9IFBNTlVMTDsgICAgICAgLyogUHJldmlvdXMga2V5IGhhbmRsZXIgICAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldktleTE1ID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMga2V5MTUgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkJyZWFrID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgYnJlYWsgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkN0cmxDID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgQ3RybEMgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkNyaXRpY2FsID0gUE1OVUxMOyAgLyogUHJldmlvdXMgY3JpdGljYWwgaGFuZGxlciAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxUaW1lcjsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIHRpbWVyICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxSVEM7ICAgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIFJUQyAgICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxLZXk7ICAgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGtleSAgICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxLZXkxNTsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGtleTE1ICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxJbnQxMDsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGludCAxMGggICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0E7ICAgICAgICAgICAgLyogQ01PUyByZWdpc3RlciBBIGNvbnRlbnRzICAgICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0I7ICAgICAgICAgICAgLyogQ01PUyByZWdpc3RlciBCIGNvbnRlbnRzICAgICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkUlRDUElDMjsgICAgICAgICAgICAgLyogTWFzayB2YWx1ZSBmb3IgUlRDIElSUTggICAgICAqLwotCi0vKiBTdHJ1Y3R1cmUgdG8gbWFpbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXJzLAotICogaW5jbHVkZSBhIGNvcHkgb2YgdGhlIGhhcmR3YXJlIElSUSBhc3NlbWJsZXIgdGh1bmsgKG9uZSBmb3IgZWFjaAotICogaG9va2VkIGludGVycnVwdCBoYW5kbGVyKS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWNoYXIgICAgICAgSVJROwotICAgIHVjaGFyICAgICAgIElSUVZlY3Q7Ci0gICAgdWNoYXIgICAgICAgcHJldlBJQzsKLSAgICB1Y2hhciAgICAgICBwcmV2UElDMjsKLSAgICBQTUZBUlBUUiAgICBwcmV2SGFuZGxlcjsKLSAgICBsb25nICAgICAgICBwcmV2UmVhbGhhbmRsZXI7Ci0gICAgdWNoYXIgICAgICAgdGh1bmtbMV07Ci0gICAgLyogSVJRIGFzc2VtYmxlciB0aHVuayBmb2xsb3dzIC4uLiAqLwotICAgIH0gX1BNX0lSUUhhbmRsZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFscyBmb3IgbG9ja2luZyBpbnRlcnJ1cHQgaGFuZGxlcnMgaW4gX3BtZG9zLmFzbSAqLwotCi0jaWZuZGVmIFJFQUxNT0RFCi1leHRlcm4gaW50ICBfVkFSQVBJIF9QTV9wbWRvc0RhdGFTdGFydDsKLWV4dGVybiBpbnQgIF9WQVJBUEkgX1BNX3BtZG9zRGF0YUVuZDsKLWV4dGVybiBpbnQgIF9WQVJBUEkgX1BNX0RNQURhdGFTdGFydDsKLWV4dGVybiBpbnQgIF9WQVJBUEkgX1BNX0RNQURhdGFFbmQ7Ci12b2lkIF9BU01BUEkgX1BNX3BtZG9zQ29kZVN0YXJ0KHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9wbWRvc0NvZGVFbmQodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX0RNQUNvZGVTdGFydCh2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fRE1BQ29kZUVuZCh2b2lkKTsKLSNlbmRpZgotCi0vKiBQcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlcnMsIGFsc28gY2FsbGVkIGJ5IFBNIGNhbGxiYWNrcyBiZWxvdyAqLwotCi12b2lkIF9BU01BUEkgX1BNX3RpbWVySVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9ydGNJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2lycUlTUlRlbXBsYXRlKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9pcnFJU1JUZW1wbGF0ZUVuZCh2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fa2V5SVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9rZXkxNUlTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fYnJlYWtJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2N0cmxDSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9jcml0aWNhbElTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fbW91c2VJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2ludDEwUE1DQih2b2lkKTsKLQotLyogUHJvdGVjdGVkIG1vZGUgRFBNSSBjYWxsYmFjayBoYW5kbGVycyAqLwotCi12b2lkIF9BU01BUEkgX1BNX21vdXNlUE1DQih2b2lkKTsKLQotLyogUm91dGluZSB0byBpbnN0YWxsIGEgbW91c2UgaGFuZGxlciBmdW5jdGlvbiAqLwotCi12b2lkIF9BU01BUEkgX1BNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzayk7Ci0KLS8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgRFBNSSByZWFsIG1vZGUgY2FsbGJhY2sgcm91dGluZXMgKi8KLQotaWJvb2wgX0FTTUFQSSBfRFBNSV9hbGxvY2F0ZUNhbGxiYWNrKHZvaWQgKF9BU01BUEkgKnBtY29kZSkoKSx2b2lkICpybXJlZ3MsbG9uZyAqUk1DQik7Ci12b2lkIF9BU01BUEkgX0RQTUlfZnJlZUNhbGxiYWNrKGxvbmcgUk1DQik7Ci0KLS8qIERQTUkgaGVscGVyIGZ1bmN0aW9ucyBpbiBQTUxJVEUuQyAqLwotCi11bG9uZyAgIFBNQVBJIERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcih1bG9uZyBwaHlzQWRkcix1bG9uZyBsaW1pdCk7Ci1pbnQgICAgIFBNQVBJIERQTUlfc2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwsdWxvbmcgbGluQWRkcik7Ci11bG9uZyAgIFBNQVBJIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwpOwotaW50ICAgICBQTUFQSSBEUE1JX3NldFNlbGVjdG9yTGltaXQodXNob3J0IHNlbCx1bG9uZyBsaW1pdCk7Ci11aW50ICAgIFBNQVBJIERQTUlfY3JlYXRlU2VsZWN0b3IodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCk7Ci12b2lkICAgIFBNQVBJIERQTUlfZnJlZVNlbGVjdG9yKHVpbnQgc2VsKTsKLWludCAgICAgUE1BUEkgRFBNSV9sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbik7Ci1pbnQgICAgIFBNQVBJIERQTUlfdW5sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbik7Ci0KLS8qIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBDTU9TIHJlZ2lzdGVycyAqLwotCi11Y2hhciAgIFBNQVBJIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpOwotdm9pZCAgICBQTUFQSSBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBHZW5lcmljIHJvdXRpbmVzIGNvbW1vbiB0byBhbGwgZW52aXJvbm1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBQTUFQSSBQTV9yZXNldE1vdXNlRHJpdmVyKGludCBoYXJkUmVzZXQpCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUE1fbW91c2VIYW5kbGVyIG9sZEhhbmRsZXIgPSBfUE1fbW91c2VIYW5kbGVyOwotCi0gICAgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcigpOwotICAgIHJlZ3MueC5heCA9IGhhcmRSZXNldCA/IDAgOiAzMzsKLSAgICBQTV9pbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotICAgIGlmIChvbGRIYW5kbGVyKQotCVBNX3NldE1vdXNlSGFuZGxlcihfUE1fbW91c2VNYXNrLCBvbGRIYW5kbGVyKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCi17Ci0gICAgc3RhdGljIHNob3J0IGNvbnZlcnRbXSA9IHsKLQk4MTkyLAotCTQwOTYsCi0JMjA0OCwKLQkxMDI0LAotCTUxMiwKLQkyNTYsCi0JMTI4LAotCTY0LAotCTMyLAotCTE2LAotCTgsCi0JNCwKLQkyLAotCS0xLAotCX07Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBGaXJzdCBjbGVhciBhbnkgcGVuZGluZyBSVEMgdGltZW91dCBpZiBub3QgY2xlYXJlZCAqLwotICAgIF9QTV9yZWFkQ01PUygweDBDKTsKLSAgICBpZiAoZnJlcXVlbmN5ID09IDApIHsKLQkvKiBEaXNhYmxlIFJUQyB0aW1vdXQgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCICYgMHgwRik7Ci0JfQotICAgIGVsc2UgewotCS8qIENvbnZlcnQgZnJlcXVlbmN5IHZhbHVlIHRvIFJUQyBjbG9jayBpbmRleGVzICovCi0JZm9yIChpID0gMDsgY29udmVydFtpXSAhPSAtMTsgaSsrKSB7Ci0JICAgIGlmIChjb252ZXJ0W2ldID09IGZyZXF1ZW5jeSkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCS8qIFNldCBSVEMgdGltb3V0IHZhbHVlIGFuZCBlbmFibGUgdGltZW91dCAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSwweDIwIHwgKGkrMykpOwotCV9QTV93cml0ZUNNT1MoMHgwQiwoX1BNX29sZENNT1NSZWdCICYgMHgwRikgfCAweDQwKTsKLQl9Ci19Ci0KLSNpZm5kZWYgUkVBTE1PREUKLQotc3RhdGljIHZvaWQgUE1BUEkgbG9ja1BNSGFuZGxlcnModm9pZCkKLXsKLSAgICBzdGF0aWMgaW50ICAgICAgbG9ja2VkID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgc3RhdDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KLQotICAgIC8qIExvY2sgYWxsIG9mIHRoZSBjb2RlIGFuZCBkYXRhIHVzZWQgYnkgb3VyIHByb3RlY3RlZCBtb2RlIGludGVycnVwdAotICAgICAqIGhhbmRsaW5nIHJvdXRpbmVzLCBzbyB0aGF0IGl0IHdpbGwgY29udGludWUgdG8gd29yayBjb3JyZWN0bHkKLSAgICAgKiB1bmRlciByZWFsIG1vZGUuCi0gICAgICovCi0gICAgaWYgKCFsb2NrZWQpIHsKLQlQTV9zYXZlRFMoKTsKLQlzdGF0ICA9ICFQTV9sb2NrRGF0YVBhZ2VzKCZnbG9iYWxEYXRhU3RhcnQtMjA0OCw0MDk2LCZsaCk7Ci0Jc3RhdCB8PSAhUE1fbG9ja0RhdGFQYWdlcygmX1BNX3BtZG9zRGF0YVN0YXJ0LChpbnQpJl9QTV9wbWRvc0RhdGFFbmQgLSAoaW50KSZfUE1fcG1kb3NEYXRhU3RhcnQsJmxoKTsKLQlzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX1BNX3BtZG9zQ29kZVN0YXJ0LChpbnQpX1BNX3BtZG9zQ29kZUVuZC0oaW50KV9QTV9wbWRvc0NvZGVTdGFydCwmbGgpOwotCXN0YXQgfD0gIVBNX2xvY2tEYXRhUGFnZXMoJl9QTV9ETUFEYXRhU3RhcnQsKGludCkmX1BNX0RNQURhdGFFbmQgLSAoaW50KSZfUE1fRE1BRGF0YVN0YXJ0LCZsaCk7Ci0Jc3RhdCB8PSAhUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKV9QTV9ETUFDb2RlU3RhcnQsKGludClfUE1fRE1BQ29kZUVuZC0oaW50KV9QTV9ETUFDb2RlU3RhcnQsJmxoKTsKLQlpZiAoc3RhdCkgewotCSAgICBwcmludGYoIlBhZ2UgbG9ja2luZyBzZXJ2aWNlcyBmYWlsZWQgLSBpbnRlcnJ1cHQgaGFuZGxpbmcgbm90IHNhZmUhXG4iKTsKLQkgICAgZXhpdCgxKTsKLQkgICAgfQotCWxvY2tlZCA9IDE7Ci0JfQotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERPUyBSZWFsIE1vZGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgUkVBTE1PREUKLQotI2lmbmRlZiBNS19GUAotI2RlZmluZSBNS19GUChzLG8pICAoICh2b2lkIGZhciAqKSggKCh1bG9uZykocykgPDwgMTYpICsgXAotCQkgICAgKHVsb25nKShvKSApKQotI2VuZGlmCi0KLWludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLXsKLSAgICBQTV9zYXZlRFMoKTsKLSAgICBfUE1fbW91c2VIYW5kbGVyID0gbWg7Ci0gICAgX1BNX3NldE1vdXNlSGFuZGxlcihfUE1fbW91c2VNYXNrID0gbWFzayk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKQotewotICAgIHVuaW9uIFJFR1MgICAgICByZWdzOwotCi0gICAgaWYgKF9QTV9tb3VzZUhhbmRsZXIpIHsKLQlyZWdzLnguYXggPSAzMzsKLQlpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotCV9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKLXsKLSAgICBfUE1fZ2V0Uk12ZWN0KDB4OCwgKGxvbmcqKSZfUE1fcHJldlRpbWVyKTsKLSAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7Ci0gICAgX1BNX3NldFJNdmVjdCgweDgsIChsb25nKV9QTV90aW1lcklTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVRpbWVySGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fdGltZXJIYW5kbGVyKSB7Ci0JX1BNX3NldFJNdmVjdCgweDgsIChsb25nKV9QTV9wcmV2VGltZXIpOwotCV9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBfUE1fZ2V0Uk12ZWN0KDB4NzAsIChsb25nKikmX1BNX3ByZXZSVEMpOwotICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7Ci0gICAgX1BNX3NldFJNdmVjdCgweDcwLCAobG9uZylfUE1fcnRjSVNSKTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCi0gICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOwotICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCVBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JX1BNX3NldFJNdmVjdCgweDcwLCAobG9uZylfUE1fcHJldlJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIga2gpCi17Ci0gICAgX1BNX2dldFJNdmVjdCgweDksIChsb25nKikmX1BNX3ByZXZLZXkpOwotICAgIF9QTV9rZXlIYW5kbGVyID0ga2g7Ci0gICAgX1BNX3NldFJNdmVjdCgweDksIChsb25nKV9QTV9rZXlJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXlIYW5kbGVyKSB7Ci0JX1BNX3NldFJNdmVjdCgweDksIChsb25nKV9QTV9wcmV2S2V5KTsKLQlfUE1fa2V5SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIga2gpCi17Ci0gICAgX1BNX2dldFJNdmVjdCgweDE1LCAobG9uZyopJl9QTV9wcmV2S2V5MTUpOwotICAgIF9QTV9rZXkxNUhhbmRsZXIgPSBraDsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MTUsIChsb25nKV9QTV9rZXkxNUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5MTVIYW5kbGVyKSB7Ci0JX1BNX3NldFJNdmVjdCgweDE1LCAobG9uZylfUE1fcHJldktleTE1KTsKLQlfUE1fa2V5MTVIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCi17Ci0gICAgc3RhdGljIGludCAgY3RybENGbGFnLGN0cmxCRmxhZzsKLQotICAgIF9QTV9jdHJsQ1B0ciA9ICh1Y2hhciopJmN0cmxDRmxhZzsKLSAgICBfUE1fY3RybEJQdHIgPSAodWNoYXIqKSZjdHJsQkZsYWc7Ci0gICAgX1BNX2dldFJNdmVjdCgweDFCLCAobG9uZyopJl9QTV9wcmV2QnJlYWspOwotICAgIF9QTV9nZXRSTXZlY3QoMHgyMywgKGxvbmcqKSZfUE1fcHJldkN0cmxDKTsKLSAgICBfUE1fYnJlYWtIYW5kbGVyID0gYmg7Ci0gICAgX1BNX3NldFJNdmVjdCgweDFCLCAobG9uZylfUE1fYnJlYWtJU1IpOwotICAgIF9QTV9zZXRSTXZlY3QoMHgyMywgKGxvbmcpX1BNX2N0cmxDSVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2QnJlYWspIHsKLQlfUE1fc2V0Uk12ZWN0KDB4MUIsIChsb25nKV9QTV9wcmV2QnJlYWspOwotCV9QTV9zZXRSTXZlY3QoMHgyMywgKGxvbmcpX1BNX3ByZXZDdHJsQyk7Ci0JX1BNX3ByZXZCcmVhayA9IE5VTEw7Ci0JX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQotewotICAgIHN0YXRpYyAgc2hvcnQgY3JpdEJ1ZlsyXTsKLQotICAgIF9QTV9jcml0UHRyID0gKHVjaGFyKiljcml0QnVmOwotICAgIF9QTV9nZXRSTXZlY3QoMHgyNCwgKGxvbmcqKSZfUE1fcHJldkNyaXRpY2FsKTsKLSAgICBfUE1fY3JpdEhhbmRsZXIgPSBjaDsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MjQsIChsb25nKV9QTV9jcml0aWNhbElTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkNyaXRpY2FsKSB7Ci0JX1BNX3NldFJNdmVjdCgweDI0LCAobG9uZylfUE1fcHJldkNyaXRpY2FsKTsKLQlfUE1fcHJldkNyaXRpY2FsID0gTlVMTDsKLQlfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsgICAgICAvKiBEbyBub3RoaW5nIGZvciByZWFsIG1vZGUgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOyAgICAgIC8qIERvIG5vdGhpbmcgZm9yIHJlYWwgbW9kZSAqLwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsgICAgICAvKiBEbyBub3RoaW5nIGZvciByZWFsIG1vZGUgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsgICAgICAvKiBEbyBub3RoaW5nIGZvciByZWFsIG1vZGUgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKQotewotICAgIGxvbmcgdDsKLSAgICBfUE1fZ2V0Uk12ZWN0KGludG5vLCZ0KTsKLSAgICAqaXNyID0gKHZvaWQqKXQ7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCi17Ci0gICAgUE1fc2F2ZURTKCk7Ci0gICAgX1BNX3NldFJNdmVjdChpbnRubywobG9uZylpc3IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgX1BNX3NldFJNdmVjdChpbnRubywobG9uZylpc3IpOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFBoYXIgTGFwIFROVCBET1MgRXh0ZW5kZXIgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgVE5UCi0KLSNpbmNsdWRlIDxwbGRvczMyLmg+Ci0jaW5jbHVkZSA8cGhhcmxhcC5oPgotI2luY2x1ZGUgPGh3Mzg2Lmg+Ci0KLXN0YXRpYyBsb25nIHByZXZSZWFsQnJlYWs7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGJyZWFrIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbEN0cmxDOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBDdHJsQyBoYW5kbGVyICAgICAqLwotc3RhdGljIGxvbmcgcHJldlJlYWxDcml0aWNhbDsgICAvKiBQcmV2IHJlYWwgbW9kZSBjcml0aWNhbCBoYW5kbGVyICAgICAgKi8KLXN0YXRpYyB1Y2hhciAqbW91c2VQdHI7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgcmVhbCBtb2RlIHJvdXRpbmUgaXMgdXNlZCB0byBjYWxsIGEgMzIgYml0IHByb3RlY3RlZAotICogbW9kZSBGQVIgZnVuY3Rpb24gZnJvbSByZWFsIG1vZGUuIFdlIHVzZSB0aGlzIGZvciBwYXNzaW5nIHVwIGNvbnRyb2wKLSAqIGZyb20gdGhlIHJlYWwgbW9kZSBtb3VzZSBjYWxsYmFjayB0byBvdXIgcHJvdGVjdGVkIG1vZGUgY29kZS4KLSAqLwotCi1zdGF0aWMgVUNIQVIgcmVhbEhhbmRsZXJbXSA9IHsgICAgICAvKiBSZWFsIG1vZGUgY29kZSBnZW5lcmljIGhhbmRsZXIgICAqLwotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogX19QTV9jYWxsUHJvdHAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qIF9fUE1fcHJvdENTICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiBfX1BNX3Byb3RIYW5kbGVyICAgICAgICAgICAgICAgICAqLwotICAgIDB4NjYsMHg2MCwgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2hhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDFFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHg2QSwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICAwICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4NkEsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgMCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4RkYsMHgzNiwweDA0LDB4MDAsICAgICAgIC8qICBwdXNoICAgIFtjczpfX1BNX3Byb3RDU10gICAgICAgICovCi0gICAgMHg2NiwweDJFLDB4RkYsMHgzNiwweDA2LDB4MDAsICAvKiAgcHVzaCAgICBbY3M6X19QTV9wcm90SGFuZGxlcl0gICAqLwotICAgIDB4MkUsMHhGRiwweDFFLDB4MDAsMHgwMCwgICAgICAgLyogIGNhbGwgICAgW2NzOl9fUE1fY2FsbFByb3RwXSAgICAgKi8KLSAgICAweDgzLDB4QzQsMHgwQSwgICAgICAgICAgICAgICAgIC8qICBhZGQgICAgIHNwLDEwICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgxRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcG9wICAgICBkcyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4NjYsMHg2MSwgICAgICAgICAgICAgICAgICAgICAgLyogIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweENCLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICByZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgfTsKLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW5zdGFsbHMgdGhlIGFib3ZlIHJlYWxtb2RlIGNhbGxiYWNrIG1lY2hhbmlzbQotICogaW4gcmVhbCBtb2RlIG1lbW9yeSBmb3IgY2FsbGluZyB0aGUgcHJvdGVjdGVkIG1vZGUgcm91dGluZS4KLSAqLwotCi11Y2hhciAqIGluc3RhbGxDYWxsYmFjayh2b2lkIChQTUFQSSAqcG1DQikoKSx1aW50ICpyc2VnLCB1aW50ICpyb2ZmKQotewotICAgIENPTkZJR19JTkYgIGNvbmZpZzsKLSAgICBSRUFMUFRSICAgICByZWFsQnVmQWRyLGNhbGxQcm90cDsKLSAgICBVTE9ORyAgICAgICBidWZTaXplOwotICAgIEZBUlBUUiAgICAgIHByb3RCdWZBZHI7Ci0gICAgdWNoYXIgICAgICAgKnA7Ci0KLSAgICAvKiBHZXQgYWRkcmVzcyBvZiByZWFsIG1vZGUgcm91dGluZSB0byBjYWxsIHVwIHRvIHByb3RlY3RlZCBtb2RlICAgICovCi0gICAgX2R4X3JtbGlua19nZXQoJmNhbGxQcm90cCwgJnJlYWxCdWZBZHIsICZidWZTaXplLCAmcHJvdEJ1ZkFkcik7Ci0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLQotICAgIC8qIEZpbGwgaW4gdGhlIHZhbHVlcyBpbiB0aGUgcmVhbCBtb2RlIGNvZGUgc2VnbWVudCBzbyB0aGF0IGl0IHdpbGwKLSAgICAgKiBjYWxsIHRoZSBjb3JyZWN0IHJvdXRpbmUuCi0gICAgICovCi0gICAgKigoUkVBTFBUUiopJnJlYWxIYW5kbGVyWzBdKSA9IGNhbGxQcm90cDsKLSAgICAqKChVU0hPUlQqKSZyZWFsSGFuZGxlcls0XSkgPSBjb25maWcuY19jc19zZWw7Ci0gICAgKigoVUxPTkcqKSZyZWFsSGFuZGxlcls2XSkgPSAoVUxPTkcpcG1DQjsKLQotICAgIC8qIENvcHkgdGhlIHJlYWwgbW9kZSBoYW5kbGVyIHRvIHJlYWwgbW9kZSBtZW1vcnkgICAqLwotICAgIGlmICgocCA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YocmVhbEhhbmRsZXIpLHJzZWcscm9mZikpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbWVtY3B5KHAscmVhbEhhbmRsZXIsc2l6ZW9mKHJlYWxIYW5kbGVyKSk7Ci0KLSAgICAvKiBTa2lwIHBhc3QgZ2xvYmFsIHZhcmlhYmxzIGluIHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgKi8KLSAgICAqcm9mZiArPSAweDBBOwotICAgIHJldHVybiBwOwotfQotCi1pbnQgUE1BUEkgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCi17Ci0gICAgUk1SRUdTICAgICAgcmVnczsKLSAgICBSTVNSRUdTICAgICBzcmVnczsKLSAgICB1aW50ICAgICAgICByc2VnLHJvZmY7Ci0KLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIGlmICgobW91c2VQdHIgPSBpbnN0YWxsQ2FsbGJhY2soX1BNX21vdXNlSVNSLCAmcnNlZywgJnJvZmYpKSA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKLQotICAgIC8qIEluc3RhbGwgdGhlIHJlYWwgbW9kZSBtb3VzZSBoYW5kbGVyICAqLwotICAgIHNyZWdzLmVzID0gcnNlZzsKLSAgICByZWdzLnguZHggPSByb2ZmOwotICAgIHJlZ3MueC5jeCA9IF9QTV9tb3VzZU1hc2sgPSBtYXNrOwotICAgIHJlZ3MueC5heCA9IDB4QzsKLSAgICBQTV9pbnQ4NngoMHgzMywgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikgewotCXJlZ3MueC5heCA9IDMzOwotCVBNX2ludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7Ci0JUE1fZnJlZVJlYWxTZWcobW91c2VQdHIpOwotCV9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKQotewotICAgIEZBUlBUUiAgcGg7Ci0KLSAgICBfZHhfcG1pdl9nZXQoaW50bm8sICZwaCk7Ci0gICAgaXNyLT5zZWwgPSBGUF9TRUwocGgpOwotICAgIGlzci0+b2ZmID0gRlBfT0ZGKHBoKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRQTXZlY3QoaW50IGludG5vLCBQTV9pbnRIYW5kbGVyIGlzcikKLXsKLSAgICBDT05GSUdfSU5GICBjb25maWc7Ci0gICAgRkFSUFRSICAgICAgcGg7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICBfZHhfY29uZmlnX2luZigmY29uZmlnLCAoVUNIQVIqKSZjb25maWcpOwotICAgIEZQX1NFVChwaCwodWludClpc3IsY29uZmlnLmNfY3Nfc2VsKTsKLSAgICBfZHhfcG1pdl9zZXQoaW50bm8scGgpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgRkFSUFRSICBwaDsKLQotICAgIEZQX1NFVChwaCxpc3Iub2ZmLGlzci5zZWwpOwotICAgIF9keF9wbWl2X3NldChpbnRubyxwaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOwotICAgIF9QTV9nZXRSTXZlY3QoaW50bm8sIHJlYWxpc3IpOwotfQotCi1zdGF0aWMgdm9pZCByZXN0b3JlSVNSKGludCBpbnRubywgUE1GQVJQVFIgcG1pc3IsIGxvbmcgcmVhbGlzcikKLXsKLSAgICBfUE1fc2V0Uk12ZWN0KGludG5vLHJlYWxpc3IpOwotICAgIFBNX3Jlc3RvcmVQTXZlY3QoaW50bm8scG1pc3IpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRJU1IoaW50IGludG5vLCB2b2lkIChQTUFQSSAqaXNyKSgpKQotewotICAgIENPTkZJR19JTkYgIGNvbmZpZzsKLSAgICBGQVJQVFIgICAgICBwaDsKLQotICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLwotCi0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLSAgICBGUF9TRVQocGgsKHVpbnQpaXNyLGNvbmZpZy5jX2NzX3NlbCk7Ci0gICAgX2R4X2FwbWl2X3NldChpbnRubyxwaCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0VGltZXJIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgpCi17Ci0gICAgZ2V0SVNSKDB4OCwgJl9QTV9wcmV2VGltZXIsICZfUE1fcHJldlJlYWxUaW1lcik7Ci0gICAgX1BNX3RpbWVySGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDgsIF9QTV90aW1lcklTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVRpbWVySGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fdGltZXJIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDgsIF9QTV9wcmV2VGltZXIsIF9QTV9wcmV2UmVhbFRpbWVyKTsKLQlfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgsaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCi0gICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOwotICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKLQotICAgIC8qIFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyICovCi0gICAgZ2V0SVNSKDB4NzAsICZfUE1fcHJldlJUQywgJl9QTV9wcmV2UmVhbFJUQyk7Ci0gICAgX1BNX3J0Y0hhbmRsZXIgPSB0aDsKLSAgICBzZXRJU1IoMHg3MCwgX1BNX3J0Y0lTUik7Ci0KLSAgICAvKiBQcm9ncmFtIHRoZSByZWFsIHRpbWUgY2xvY2sgZGVmYXVsdCBmcmVxdWVuY3kgKi8KLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGZyZXF1ZW5jeSk7Ci0KLSAgICAvKiBVbm1hc2sgSVJROCBpbiB0aGUgUElDMiAqLwotICAgIF9QTV9vbGRSVENQSUMyID0gUE1faW5wYigweEExKTsKLSAgICBQTV9vdXRwYigweEExLF9QTV9vbGRSVENQSUMyICYgMHhGRSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9ydGNIYW5kbGVyKSB7Ci0JLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCKTsKLQlQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpOwotCi0JLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotCXJlc3RvcmVJU1IoMHg3MCwgX1BNX3ByZXZSVEMsIF9QTV9wcmV2UmVhbFJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIga2gpCi17Ci0gICAgZ2V0SVNSKDB4OSwgJl9QTV9wcmV2S2V5LCAmX1BNX3ByZXZSZWFsS2V5KTsKLSAgICBfUE1fa2V5SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDksIF9QTV9rZXlJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXlIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDksIF9QTV9wcmV2S2V5LCBfUE1fcHJldlJlYWxLZXkpOwotCV9QTV9rZXlIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0S2V5MTVIYW5kbGVyKFBNX2tleTE1SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHgxNSwgJl9QTV9wcmV2S2V5MTUsICZfUE1fcHJldlJlYWxLZXkxNSk7Ci0gICAgX1BNX2tleTE1SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDE1LCBfUE1fa2V5MTVJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleTE1SGFuZGxlcikgewotCXJlc3RvcmVJU1IoMHgxNSwgX1BNX3ByZXZLZXkxNSwgX1BNX3ByZXZSZWFsS2V5MTUpOwotCV9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKFBNX2JyZWFrSGFuZGxlciBiaCkKLXsKLSAgICBzdGF0aWMgaW50ICBjdHJsQ0ZsYWcsY3RybEJGbGFnOwotCi0gICAgX1BNX2N0cmxDUHRyID0gKHVjaGFyKikmY3RybENGbGFnOwotICAgIF9QTV9jdHJsQlB0ciA9ICh1Y2hhciopJmN0cmxCRmxhZzsKLSAgICBnZXRJU1IoMHgxQiwgJl9QTV9wcmV2QnJlYWssICZwcmV2UmVhbEJyZWFrKTsKLSAgICBnZXRJU1IoMHgyMywgJl9QTV9wcmV2Q3RybEMsICZwcmV2UmVhbEN0cmxDKTsKLSAgICBfUE1fYnJlYWtIYW5kbGVyID0gYmg7Ci0gICAgc2V0SVNSKDB4MUIsIF9QTV9icmVha0lTUik7Ci0gICAgc2V0SVNSKDB4MjMsIF9QTV9jdHJsQ0lTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkJyZWFrLnNlbCkgewotCXJlc3RvcmVJU1IoMHgxQiwgX1BNX3ByZXZCcmVhaywgcHJldlJlYWxCcmVhayk7Ci0JcmVzdG9yZUlTUigweDIzLCBfUE1fcHJldkN0cmxDLCBwcmV2UmVhbEN0cmxDKTsKLQlfUE1fcHJldkJyZWFrLnNlbCA9IDA7Ci0JX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQotewotICAgIHN0YXRpYyBzaG9ydCAgICBjcml0QnVmWzJdOwotCi0gICAgX1BNX2NyaXRQdHIgPSAodWNoYXIqKWNyaXRCdWY7Ci0gICAgZ2V0SVNSKDB4MjQsICZfUE1fcHJldkNyaXRpY2FsLCAmcHJldlJlYWxDcml0aWNhbCk7Ci0gICAgX1BNX2NyaXRIYW5kbGVyID0gY2g7Ci0gICAgc2V0SVNSKDB4MjQsIF9QTV9jcml0aWNhbElTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkNyaXRpY2FsLnNlbCkgewotCXJlc3RvcmVJU1IoMHgyNCwgX1BNX3ByZXZDcml0aWNhbCwgcHJldlJlYWxDcml0aWNhbCk7Ci0JX1BNX3ByZXZDcml0aWNhbC5zZWwgPSAwOwotCV9QTV9jcml0SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiAoX2R4X2xvY2tfcGdzbihwLGxlbikgPT0gMCk7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gKF9keF91bG9ja19wZ3NuKHAsbGVuKSA9PSAwKTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgQ09ORklHX0lORiAgY29uZmlnOwotICAgIEZBUlBUUiAgICAgIGZwOwotCi0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLSAgICBGUF9TRVQoZnAscCxjb25maWcuY19jc19zZWwpOwotICAgIHJldHVybiAoX2R4X2xvY2tfcGdzKGZwLGxlbikgPT0gMCk7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgQ09ORklHX0lORiAgY29uZmlnOwotICAgIEZBUlBUUiAgICAgIGZwOwotCi0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLSAgICBGUF9TRVQoZnAscCxjb25maWcuY19jc19zZWwpOwotICAgIHJldHVybiAoX2R4X3Vsb2NrX3BncyhmcCxsZW4pID09IDApOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFN5bWFudGVjIEMrKyBET1NYIGFuZCBGbGFzaFRlayBYLTMyL1gtMzJWTSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChET1NYKSB8fCBkZWZpbmVkKFgzMlZNKQotCi0jaWZkZWYgIFgzMlZNCi0jaW5jbHVkZSA8eDMyLmg+Ci0jZW5kaWYKLQotc3RhdGljIGxvbmcgcHJldlJlYWxCcmVhazsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgYnJlYWsgaGFuZGxlciAgICAgKi8KLXN0YXRpYyBsb25nIHByZXZSZWFsQ3RybEM7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIEN0cmxDIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbENyaXRpY2FsOyAgIC8qIFByZXYgcmVhbCBtb2RlIGNyaXRpY2FsIGhhbmRsZXIgICAgICAqLwotCi1zdGF0aWMgdWludCBtb3VzZVNlbCA9IDAsbW91c2VPZmY7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgcmVhbCBtb2RlIHJvdXRpbmUgaXMgdXNlZCB0byBjYWxsIGEgMzIgYml0IHByb3RlY3RlZAotICogbW9kZSBGQVIgZnVuY3Rpb24gZnJvbSByZWFsIG1vZGUuIFdlIHVzZSB0aGlzIGZvciBwYXNzaW5nIHVwIGNvbnRyb2wKLSAqIGZyb20gdGhlIHJlYWwgbW9kZSBtb3VzZSBjYWxsYmFjayB0byBvdXIgcHJvdGVjdGVkIG1vZGUgY29kZS4KLSAqLwotCi1zdGF0aWMgY2hhciByZWFsSGFuZGxlcltdID0geyAgICAgICAvKiBSZWFsIG1vZGUgY29kZSBnZW5lcmljIGhhbmRsZXIgICAqLwotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogX19QTV9jYWxsUHJvdHAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qIF9fUE1fcHJvdENTICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiBfX1BNX3Byb3RIYW5kbGVyICAgICAgICAgICAgICAgICAqLwotICAgIDB4MUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDZBLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoICAgIDAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHg2QSwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICAwICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MkUsMHhGRiwweDM2LDB4MDQsMHgwMCwgICAgICAgLyogIHB1c2ggICAgW2NzOl9fUE1fcHJvdENTXSAgICAgICAgKi8KLSAgICAweDY2LDB4MkUsMHhGRiwweDM2LDB4MDYsMHgwMCwgIC8qICBwdXNoICAgIFtjczpfX1BNX3Byb3RIYW5kbGVyXSAgICovCi0gICAgMHgyRSwweEZGLDB4MUUsMHgwMCwweDAwLCAgICAgICAvKiAgY2FsbCAgICBbY3M6X19QTV9jYWxsUHJvdHBdICAgICAqLwotICAgIDB4ODMsMHhDNCwweDBBLCAgICAgICAgICAgICAgICAgLyogIGFkZCAgICAgc3AsMTAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDFGLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBwb3AgICAgIGRzICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHhDQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGluc3RhbGxzIHRoZSBhYm92ZSByZWFsbW9kZSBjYWxsYmFjayBtZWNoYW5pc20KLSAqIGluIHJlYWwgbW9kZSBtZW1vcnkgZm9yIGNhbGxpbmcgdGhlIHByb3RlY3RlZCBtb2RlIHJvdXRpbmUuCi0gKi8KLQotaW50IGluc3RhbGxDYWxsYmFjayh2b2lkIChQTUFQSSAqcG1DQikoKSx1aW50ICpwc2VsLCB1aW50ICpwb2ZmLAotICAgIHVpbnQgKnJzZWcsIHVpbnQgKnJvZmYpCi17Ci0gICAgUE1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUE1TUkVHUyAgICAgICAgIHNyZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyNTBEOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICBQTV9pbnQzODZ4KDB4MjEsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsgICAgLyogR2V0IFJNIGNhbGxiYWNrIGFkZHJlc3MgICovCi0KLSAgICAvKiBGaWxsIGluIHRoZSB2YWx1ZXMgaW4gdGhlIHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgc28gdGhhdCBpdCB3aWxsCi0gICAgICogY2FsbCB0aGUgY29ycmVjdCByb3V0aW5lLgotICAgICAqLwotICAgICooKHVsb25nKikmcmVhbEhhbmRsZXJbMF0pID0gcmVncy5lLmVheDsKLSAgICAqKCh1c2hvcnQqKSZyZWFsSGFuZGxlcls0XSkgPSBzcmVncy5jczsKLSAgICAqKCh1bG9uZyopJnJlYWxIYW5kbGVyWzZdKSA9ICh1bG9uZylwbUNCOwotCi0gICAgLyogQ29weSB0aGUgcmVhbCBtb2RlIGhhbmRsZXIgdG8gcmVhbCBtb2RlIG1lbW9yeSAob25seSBhbGxvY2F0ZSB0aGUKLSAgICAgKiBidWZmZXIgb25jZSBzaW5jZSB3ZSBjYW50IGRlYWxsb2F0ZSBpdCB3aXRoIFgzMikuCi0gICAgICovCi0gICAgaWYgKCpwc2VsID09IDApIHsKLQlpZiAoIVBNX2FsbG9jUmVhbFNlZyhzaXplb2YocmVhbEhhbmRsZXIpLHBzZWwscG9mZixyc2VnLHJvZmYpKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgUE1fbWVtY3B5Zm4oKnBzZWwsKnBvZmYscmVhbEhhbmRsZXIsc2l6ZW9mKHJlYWxIYW5kbGVyKSk7Ci0KLSAgICAvKiBTa2lwIHBhc3QgZ2xvYmFsIHZhcmlhYmxlcyBpbiByZWFsIG1vZGUgY29kZSBzZWdtZW50ICovCi0gICAgKnJvZmYgKz0gMHgwQTsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQotewotICAgIFJNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgdWludCAgICByc2VnLHJvZmY7Ci0KLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIGlmICghaW5zdGFsbENhbGxiYWNrKF9QTV9tb3VzZUlTUiwgJm1vdXNlU2VsLCAmbW91c2VPZmYsICZyc2VnLCAmcm9mZikpCi0JcmV0dXJuIDA7Ci0gICAgX1BNX21vdXNlSGFuZGxlciA9IG1oOwotCi0gICAgLyogSW5zdGFsbCB0aGUgcmVhbCBtb2RlIG1vdXNlIGhhbmRsZXIgICovCi0gICAgc3JlZ3MuZXMgPSByc2VnOwotICAgIHJlZ3MueC5keCA9IHJvZmY7Ci0gICAgcmVncy54LmN4ID0gX1BNX21vdXNlTWFzayA9IG1hc2s7Ci0gICAgcmVncy54LmF4ID0gMHhDOwotICAgIFBNX2ludDg2eCgweDMzLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChfUE1fbW91c2VIYW5kbGVyKSB7Ci0JcmVncy54LmF4ID0gMzM7Ci0JUE1faW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLQlfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguYXggPSAweDI1MDI7ICAgICAgICAgLyogR2V0IFBNIGludGVycnVwdCB2ZWN0b3IgICAgICAgICAgICAgICovCi0gICAgcmVncy54LmN4ID0gaW50bm87Ci0gICAgUE1faW50Mzg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci0gICAgaXNyLT5zZWwgPSBzcmVncy5lczsKLSAgICBpc3ItPm9mZiA9IHJlZ3MuZS5lYng7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCi17Ci0gICAgUE1GQVJQVFIgICAgcG1pc3I7Ci0gICAgUE1TUkVHUyAgICAgc3JlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcG1pc3Iuc2VsID0gc3JlZ3MuY3M7Ci0gICAgcG1pc3Iub2ZmID0gKHVpbnQpaXNyOwotICAgIFBNX3Jlc3RvcmVQTXZlY3QoaW50bm8sIHBtaXNyKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MjUwNTsgICAgICAgICAvKiBTZXQgUE0gaW50ZXJydXB0IHZlY3RvciAgICAgICAgICAgICAgKi8KLSAgICByZWdzLnguY3ggPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IGlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IGlzci5vZmY7Ci0gICAgUE1faW50Mzg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOwotICAgIF9QTV9nZXRSTXZlY3QoaW50bm8scmVhbGlzcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3RvcmVJU1IoaW50IGludG5vLCBQTUZBUlBUUiBwbWlzciwgbG9uZyByZWFsaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MjUwNzsgICAgICAgICAvKiBTZXQgcmVhbCBhbmQgUE0gdmVjdG9ycyAgICAgICAgICAgICAgKi8KLSAgICByZWdzLnguY3ggPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IHBtaXNyLnNlbDsKLSAgICByZWdzLmUuZWR4ID0gcG1pc3Iub2ZmOwotICAgIHJlZ3MuZS5lYnggPSByZWFsaXNyOwotICAgIFBNX2ludDM4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRJU1IoaW50IGludG5vLCB2b2lkICppc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgICAgICovCi0KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy54LmF4ID0gMHgyNTA2OyAgICAgICAgIC8qIEhvb2sgcmVhbCBhbmQgcHJvdGVjdGVkIHZlY3RvcnMgICAgICAqLwotICAgIHJlZ3MueC5jeCA9IGludG5vOwotICAgIHNyZWdzLmRzID0gc3JlZ3MuY3M7Ci0gICAgcmVncy5lLmVkeCA9ICh1aW50KWlzcjsKLSAgICBQTV9pbnQzODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKLXsKLSAgICBnZXRJU1IoMHg4LCAmX1BNX3ByZXZUaW1lciwgJl9QTV9wcmV2UmVhbFRpbWVyKTsKLSAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7Ci0gICAgc2V0SVNSKDB4OCwgX1BNX3RpbWVySVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV90aW1lckhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4OCwgX1BNX3ByZXZUaW1lciwgX1BNX3ByZXZSZWFsVGltZXIpOwotCV9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBnZXRJU1IoMHg3MCwgJl9QTV9wcmV2UlRDLCAmX1BNX3ByZXZSZWFsUlRDKTsKLSAgICBfUE1fcnRjSGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDcwLCBfUE1fcnRjSVNSKTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCi0gICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOwotICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCVBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JcmVzdG9yZUlTUigweDcwLCBfUE1fcHJldlJUQywgX1BNX3ByZXZSZWFsUlRDKTsKLQlfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHg5LCAmX1BNX3ByZXZLZXksICZfUE1fcHJldlJlYWxLZXkpOwotICAgIF9QTV9rZXlIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4OSwgX1BNX2tleUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleUhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4OSwgX1BNX3ByZXZLZXksIF9QTV9wcmV2UmVhbEtleSk7Ci0JX1BNX2tleUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGtoKQotewotICAgIGdldElTUigweDE1LCAmX1BNX3ByZXZLZXkxNSwgJl9QTV9wcmV2UmVhbEtleTE1KTsKLSAgICBfUE1fa2V5MTVIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4MTUsIF9QTV9rZXkxNUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5MTVIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDE1LCBfUE1fcHJldktleTE1LCBfUE1fcHJldlJlYWxLZXkxNSk7Ci0JX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKQotewotICAgIHN0YXRpYyBpbnQgIGN0cmxDRmxhZyxjdHJsQkZsYWc7Ci0KLSAgICBfUE1fY3RybENQdHIgPSAodWNoYXIqKSZjdHJsQ0ZsYWc7Ci0gICAgX1BNX2N0cmxCUHRyID0gKHVjaGFyKikmY3RybEJGbGFnOwotICAgIGdldElTUigweDFCLCAmX1BNX3ByZXZCcmVhaywgJnByZXZSZWFsQnJlYWspOwotICAgIGdldElTUigweDIzLCAmX1BNX3ByZXZDdHJsQywgJnByZXZSZWFsQ3RybEMpOwotICAgIF9QTV9icmVha0hhbmRsZXIgPSBiaDsKLSAgICBzZXRJU1IoMHgxQiwgX1BNX2JyZWFrSVNSKTsKLSAgICBzZXRJU1IoMHgyMywgX1BNX2N0cmxDSVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2QnJlYWsuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDFCLCBfUE1fcHJldkJyZWFrLCBwcmV2UmVhbEJyZWFrKTsKLQlyZXN0b3JlSVNSKDB4MjMsIF9QTV9wcmV2Q3RybEMsIHByZXZSZWFsQ3RybEMpOwotCV9QTV9wcmV2QnJlYWsuc2VsID0gMDsKLQlfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihQTV9jcml0aWNhbEhhbmRsZXIgY2gpCi17Ci0gICAgc3RhdGljIHNob3J0ICAgIGNyaXRCdWZbMl07Ci0KLSAgICBfUE1fY3JpdFB0ciA9ICh1Y2hhciopY3JpdEJ1ZjsKLSAgICBnZXRJU1IoMHgyNCwgJl9QTV9wcmV2Q3JpdGljYWwsICZwcmV2UmVhbENyaXRpY2FsKTsKLSAgICBfUE1fY3JpdEhhbmRsZXIgPSBjaDsKLSAgICBzZXRJU1IoMHgyNCwgX1BNX2NyaXRpY2FsSVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2Q3JpdGljYWwuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDI0LCBfUE1fcHJldkNyaXRpY2FsLCBwcmV2UmVhbENyaXRpY2FsKTsKLQlfUE1fcHJldkNyaXRpY2FsLnNlbCA9IDA7Ci0JX1BNX2NyaXRIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIChfeDM4Nl9tZW1sb2NrKHAsbGVuKSA9PSAwKTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiAoX3gzODZfbWVtdW5sb2NrKHAsbGVuKSA9PSAwKTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIChfeDM4Nl9tZW1sb2NrKHAsbGVuKSA9PSAwKTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gKF94Mzg2X21lbXVubG9jayhwLGxlbikgPT0gMCk7Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQm9ybGFuZCdzIERQTUkzMiBET1MgUG93ZXIgUGFjayBFeHRlbmRlciBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgRFBNSTMyCi0jZGVmaW5lIEdFTkVSSUNfRFBNSTMyICAgICAgICAgIC8qIFVzZSBnZW5lcmljIDMyIGJpdCBEUE1JIHJvdXRpbmVzICovCi0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDIwNDsKLSAgICByZWdzLmguYmwgPSBpbnRubzsKLSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci0gICAgaXNyLT5zZWwgPSByZWdzLnguY3g7Ci0gICAgaXNyLT5vZmYgPSByZWdzLmUuZWR4OwotfQotCi12b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgcmVncy54LmF4ID0gMHgyMDU7ICAgICAgICAgIC8qIFNldCBwcm90ZWN0ZWQgbW9kZSB2ZWN0b3IgICAgICAgICovCi0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5jeCA9IHNyZWdzLmNzOwotICAgIHJlZ3MuZS5lZHggPSAodWludClpc3I7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyMDU7Ci0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgcmVncy54LmN4ID0gaXNyLnNlbDsKLSAgICByZWdzLmUuZWR4ID0gaXNyLm9mZjsKLSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFdhdGNvbSBDL0MrKyB3aXRoIFJhdGlvbmFsIERPUy80R1cgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIERPUzRHVwotI2RlZmluZSBHRU5FUklDX0RQTUkzMiAgICAgICAgICAvKiBVc2UgZ2VuZXJpYyAzMiBiaXQgRFBNSSByb3V0aW5lcyAqLwotCi0jZGVmaW5lIE1PVVNFX1NVUFBPUlRFRCAgICAgICAgIC8qIERPUzRHVyBkaXJlY3RseSBzdXBwb3J0cyBtb3VzZSAgICovCi0KLS8qIFdlIHVzZSB0aGUgbm9ybWFsIERPUyBzZXJ2aWNlcyB0byBzYXZlIGFuZCByZXN0b3JlIGludGVycnVwdHMgaGFuZGxlcnMKLSAqIGZvciBXYXRjb20gQysrLCBiZWNhdXNlIHVzaW5nIHRoZSBkaXJlY3QgRFBNSSBmdW5jdGlvbnMgZG9lcyBub3QKLSAqIGFwcGVhciB0byB3b3JrIHByb3Blcmx5LiBBdCBsZWFzdCBpZiB3ZSB1c2UgdGhlIERQTUkgZnVuY3Rpb25zLCB3ZQotICogZG9udCBnZXQgdGhlIGF1dG8tcGFzc3VwIGZlYXR1cmUgdGhhdCB3ZSBuZWVkIHRvIGNvcnJlY3RseSB0cmFwCi0gKiByZWFsIGFuZCBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHRzIHdpdGhvdXQgaW5zdGFsbGluZyBCaS1tb2RlbAotICogaW50ZXJydXB0IGhhbmRsZXJzLgotICovCi0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLmguYWggPSAweDM1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmc3JlZ3MpOwotICAgIGlzci0+c2VsID0gc3JlZ3MuZXM7Ci0gICAgaXNyLT5vZmYgPSByZWdzLmUuZWJ4OwotfQotCi12b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MuaC5haCA9IDB4MjU7Ci0gICAgcmVncy5oLmFsID0gaW50bm87Ci0gICAgc3JlZ3MuZHMgPSBzcmVncy5jczsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpaXNyOwotICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmc3JlZ3MpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy5oLmFoID0gMHgyNTsKLSAgICByZWdzLmguYWwgPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IGlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IGlzci5vZmY7Ci0gICAgUE1faW50Mzg2eCgweDIxLCZyZWdzLCZyZWdzLCZzcmVncyk7Ci19Ci0KLWludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLXsKLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKLSAgICBfUE1fc2V0TW91c2VIYW5kbGVyKF9QTV9tb3VzZU1hc2sgPSBtYXNrKTsKLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgaWYgKF9QTV9tb3VzZUhhbmRsZXIpIHsKLQlyZWdzLnguYXggPSAzMzsKLQlQTV9pbnQzODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLQlfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogREpHUFAgcG9ydCBvZiBHTlUgQysrIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBESkdQUAotI2RlZmluZSBHRU5FUklDX0RQTUkzMiAgICAgICAgICAvKiBVc2UgZ2VuZXJpYyAzMiBiaXQgRFBNSSByb3V0aW5lcyAqLwotCi12b2lkIFBNQVBJIFBNX2dldFBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSICppc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyMDQ7Ci0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotICAgIGlzci0+c2VsID0gcmVncy54LmN4OwotICAgIGlzci0+b2ZmID0gcmVncy5lLmVkeDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRQTXZlY3QoaW50IGludG5vLCBQTV9pbnRIYW5kbGVyIGlzcikKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIFBNX3NhdmVEUygpOwotICAgIHJlZ3MueC5heCA9IDB4MjA1OyAgICAgICAgICAvKiBTZXQgcHJvdGVjdGVkIG1vZGUgdmVjdG9yICAgICAgICAqLwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguY3ggPSBzcmVncy5jczsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpaXNyOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4MjA1OwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIHJlZ3MueC5jeCA9IGlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IGlzci5vZmY7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEdlbmVyaWMgMzIgYml0IERQTUkgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChHRU5FUklDX0RQTUkzMikKLQotc3RhdGljIGxvbmcgcHJldlJlYWxCcmVhazsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgYnJlYWsgaGFuZGxlciAgICAgKi8KLXN0YXRpYyBsb25nIHByZXZSZWFsQ3RybEM7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIEN0cmxDIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbENyaXRpY2FsOyAgIC8qIFByZXYgcmVhbCBtb2RlIGNyaXRpY2FsIGhhbmRsZXIgICAgICAqLwotCi0jaWZuZGVmIE1PVVNFX1NVUFBPUlRFRAotCi0vKiBUaGUgZm9sbG93aW5nIHJlYWwgbW9kZSByb3V0aW5lIGlzIHVzZWQgdG8gY2FsbCBhIDMyIGJpdCBwcm90ZWN0ZWQKLSAqIG1vZGUgRkFSIGZ1bmN0aW9uIGZyb20gcmVhbCBtb2RlLiBXZSB1c2UgdGhpcyBmb3IgcGFzc2luZyB1cCBjb250cm9sCi0gKiBmcm9tIHRoZSByZWFsIG1vZGUgbW91c2UgY2FsbGJhY2sgdG8gb3VyIHByb3RlY3RlZCBtb2RlIGNvZGUuCi0gKi8KLQotc3RhdGljIGxvbmcgbW91c2VSTUNCOyAgICAgICAgICAvKiBNb3VzZSByZWFsIG1vZGUgY2FsbGJhY2sgYWRkcmVzcyAgICAgKi8KLXN0YXRpYyB1Y2hhciAqbW91c2VQdHI7Ci1zdGF0aWMgY2hhciBtb3VzZVJlZ3NbMHgzMl07ICAgIC8qIFJlYWwgbW9kZSByZWdzIGZvciBtb3VzZSBjYWxsYmFjayAgICAqLwotc3RhdGljIHVjaGFyIG1vdXNlSGFuZGxlcltdID0gewotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAvKiBfcmVhbFJNQ0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgLyogIGNhbGwgICAgW2NzOl9yZWFsUk1DQl0gICAgICAgICAgICAgICovCi0gICAgMHhDQiwgICAgICAgICAgICAgICAgICAgICAgIC8qICByZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0KLWludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLXsKLSAgICBSTVJFR1MgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgIHNyZWdzOwotICAgIHVpbnQgICAgICAgIHJzZWcscm9mZjsKLQotICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLwotCi0gICAgLyogQ29weSB0aGUgcmVhbCBtb2RlIGhhbmRsZXIgdG8gcmVhbCBtb2RlIG1lbW9yeSAgICovCi0gICAgaWYgKChtb3VzZVB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YobW91c2VIYW5kbGVyKSwmcnNlZywmcm9mZikpID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgbWVtY3B5KG1vdXNlUHRyLG1vdXNlSGFuZGxlcixzaXplb2YobW91c2VIYW5kbGVyKSk7Ci0gICAgaWYgKCFfRFBNSV9hbGxvY2F0ZUNhbGxiYWNrKF9QTV9tb3VzZVBNQ0IsIG1vdXNlUmVncywgJm1vdXNlUk1DQikpCi0JUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIHJlYWwgbW9kZSBjYWxsYmFjayFcbiIpOwotICAgIFBNX3NldExvbmcobW91c2VQdHIsbW91c2VSTUNCKTsKLQotICAgIC8qIEluc3RhbGwgdGhlIHJlYWwgbW9kZSBtb3VzZSBoYW5kbGVyICAqLwotICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKLSAgICBzcmVncy5lcyA9IHJzZWc7Ci0gICAgcmVncy54LmR4ID0gcm9mZis0OwotICAgIHJlZ3MueC5jeCA9IF9QTV9tb3VzZU1hc2sgPSBtYXNrOwotICAgIHJlZ3MueC5heCA9IDB4QzsKLSAgICBQTV9pbnQ4NngoMHgzMywgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikgewotCXJlZ3MueC5heCA9IDMzOwotCVBNX2ludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7Ci0JUE1fZnJlZVJlYWxTZWcobW91c2VQdHIpOwotCV9EUE1JX2ZyZWVDYWxsYmFjayhtb3VzZVJNQ0IpOwotCV9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOwotICAgIF9QTV9nZXRSTXZlY3QoaW50bm8scmVhbGlzcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3RvcmVJU1IoaW50IGludG5vLCBQTUZBUlBUUiBwbWlzciwgbG9uZyByZWFsaXNyKQotewotICAgIF9QTV9zZXRSTXZlY3QoaW50bm8scmVhbGlzcik7Ci0gICAgUE1fcmVzdG9yZVBNdmVjdChpbnRubyxwbWlzcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldElTUihpbnQgaW50bm8sIHZvaWQgKCogUE1BUEkgcG1pc3IpKCkpCi17Ci0gICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCi0gICAgUE1fc2V0UE12ZWN0KGludG5vLHBtaXNyKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKLXsKLSAgICBnZXRJU1IoMHg4LCAmX1BNX3ByZXZUaW1lciwgJl9QTV9wcmV2UmVhbFRpbWVyKTsKLSAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7Ci0gICAgc2V0SVNSKDB4OCwgX1BNX3RpbWVySVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV90aW1lckhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4OCwgX1BNX3ByZXZUaW1lciwgX1BNX3ByZXZSZWFsVGltZXIpOwotCV9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBnZXRJU1IoMHg3MCwgJl9QTV9wcmV2UlRDLCAmX1BNX3ByZXZSZWFsUlRDKTsKLSAgICBfUE1fcnRjSGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDcwLCBfUE1fcnRjSVNSKTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCi0gICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOwotICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCVBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JcmVzdG9yZUlTUigweDcwLCBfUE1fcHJldlJUQywgX1BNX3ByZXZSZWFsUlRDKTsKLQlfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1QTV9JUlFIYW5kbGUgUE1BUEkgUE1fc2V0SVJRSGFuZGxlcigKLSAgICBpbnQgSVJRLAotICAgIFBNX2lycUhhbmRsZXIgaWgpCi17Ci0gICAgaW50ICAgICAgICAgICAgIHRodW5rU2l6ZSxQSUNtYXNrLGNoYWluUHJldmlvdXM7Ci0gICAgdWxvbmcgICAgICAgICAgIG9mZnNldEFkanVzdDsKLSAgICBfUE1fSVJRSGFuZGxlICAgKmhhbmRsZTsKLQotICAgIHRodW5rU2l6ZSA9ICh1bG9uZylfUE1faXJxSVNSVGVtcGxhdGVFbmQgLSAodWxvbmcpX1BNX2lycUlTUlRlbXBsYXRlOwotICAgIGlmICgoaGFuZGxlID0gUE1fbWFsbG9jKHNpemVvZihfUE1fSVJRSGFuZGxlKSArIHRodW5rU2l6ZSkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaGFuZGxlLT5JUlEgPSBJUlE7Ci0gICAgaGFuZGxlLT5wcmV2UElDID0gUE1faW5wYigweDIxKTsKLSAgICBoYW5kbGUtPnByZXZQSUMyID0gUE1faW5wYigweEExKTsKLSAgICBpZiAoSVJRIDwgOCkgewotCWhhbmRsZS0+SVJRVmVjdCA9IChJUlEgKyA4KTsKLQlQSUNtYXNrID0gKDEgPDwgSVJRKTsKLQljaGFpblByZXZpb3VzID0gKChoYW5kbGUtPnByZXZQSUMgJiBQSUNtYXNrKSA9PSAwKTsKLQl9Ci0gICAgZWxzZSB7Ci0JaGFuZGxlLT5JUlFWZWN0ID0gKDB4NjAgKyBJUlEgKyA4KTsKLQlQSUNtYXNrID0gKCgxIDw8IElSUSkgfCAweDQpOwotCWNoYWluUHJldmlvdXMgPSAoKGhhbmRsZS0+cHJldlBJQzIgJiAoUElDbWFzayA+PiA4KSkgPT0gMCk7Ci0JfQotCi0gICAgLyogQ29weSBhbmQgc2V0dXAgdGhlIGFzc2VtYmxlciB0aHVuayAqLwotICAgIG9mZnNldEFkanVzdCA9ICh1bG9uZyloYW5kbGUtPnRodW5rIC0gKHVsb25nKV9QTV9pcnFJU1JUZW1wbGF0ZTsKLSAgICBtZW1jcHkoaGFuZGxlLT50aHVuayxfUE1faXJxSVNSVGVtcGxhdGUsdGh1bmtTaXplKTsKLSAgICAqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMl0pID0gb2Zmc2V0QWRqdXN0OwotICAgICooKHVsb25nKikmaGFuZGxlLT50aHVua1sxMSswXSkgPSAodWxvbmcpaWg7Ci0gICAgaWYgKGNoYWluUHJldmlvdXMpIHsKLQkqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErNF0pID0gaGFuZGxlLT5wcmV2SGFuZGxlci5vZmY7Ci0JKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzExKzhdKSA9IGhhbmRsZS0+cHJldkhhbmRsZXIuc2VsOwotCX0KLSAgICBlbHNlIHsKLQkqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErNF0pID0gMDsKLQkqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErOF0pID0gMDsKLQl9Ci0gICAgKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzExKzEyXSkgPSBJUlE7Ci0KLSAgICAvKiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciAqLwotICAgIGdldElTUihoYW5kbGUtPklSUVZlY3QsICZoYW5kbGUtPnByZXZIYW5kbGVyLCAmaGFuZGxlLT5wcmV2UmVhbGhhbmRsZXIpOwotICAgIHNldElTUihoYW5kbGUtPklSUVZlY3QsIChQTV9pbnRIYW5kbGVyKWhhbmRsZS0+dGh1bmspOwotCi0gICAgLyogVW5tYXNrIHRoZSBJUlEgaW4gdGhlIFBJQyAqLwotICAgIFBNX291dHBiKDB4QTEsaGFuZGxlLT5wcmV2UElDMiAmIH4oUElDbWFzayA+PiA4KSk7Ci0gICAgUE1fb3V0cGIoMHgyMSxoYW5kbGUtPnByZXZQSUMgJiB+UElDbWFzayk7Ci0gICAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlSVJRSGFuZGxlcigKLSAgICBQTV9JUlFIYW5kbGUgaXJxSGFuZGxlKQotewotICAgIGludCAgICAgICAgICAgICBQSUNtYXNrOwotICAgIF9QTV9JUlFIYW5kbGUgICAqaGFuZGxlID0gaXJxSGFuZGxlOwotCi0gICAgLyogUmVzdG9yZSBQSUMgbWFzayBmb3IgdGhlIGludGVycnVwdCAqLwotICAgIGlmIChoYW5kbGUtPklSUSA8IDgpCi0JUElDbWFzayA9ICgxIDw8IGhhbmRsZS0+SVJRKTsKLSAgICBlbHNlCi0JUElDbWFzayA9ICgoMSA8PCBoYW5kbGUtPklSUSkgfCAweDQpOwotICAgIFBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiB+KFBJQ21hc2sgPj4gOCkpIHwgKGhhbmRsZS0+cHJldlBJQzIgJiAoUElDbWFzayA+PiA4KSkpOwotICAgIFBNX291dHBiKDB4MjEsKFBNX2lucGIoMHgyMSkgJiB+UElDbWFzaykgfCAoaGFuZGxlLT5wcmV2UElDICYgUElDbWFzaykpOwotCi0gICAgLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotICAgIHJlc3RvcmVJU1IoaGFuZGxlLT5JUlFWZWN0LCBoYW5kbGUtPnByZXZIYW5kbGVyLCBoYW5kbGUtPnByZXZSZWFsaGFuZGxlcik7Ci0KLSAgICAvKiBGaW5hbGx5IGZyZWUgdGhlIHRodW5rICovCi0gICAgUE1fZnJlZShoYW5kbGUpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHg5LCAmX1BNX3ByZXZLZXksICZfUE1fcHJldlJlYWxLZXkpOwotICAgIF9QTV9rZXlIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4OSwgX1BNX2tleUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleUhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4OSwgX1BNX3ByZXZLZXksIF9QTV9wcmV2UmVhbEtleSk7Ci0JX1BNX2tleUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGtoKQotewotICAgIGdldElTUigweDE1LCAmX1BNX3ByZXZLZXkxNSwgJl9QTV9wcmV2UmVhbEtleTE1KTsKLSAgICBfUE1fa2V5MTVIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4MTUsIF9QTV9rZXkxNUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5MTVIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDE1LCBfUE1fcHJldktleTE1LCBfUE1fcHJldlJlYWxLZXkxNSk7Ci0JX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi0vKiBSZWFsIG1vZGUgQ3RybC1DIGFuZCBDdHJsLUJyZWFrIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2V0cyBhCi0gKiBmbGFnIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0LiBXZSBzYXZlIHRoZSBsb2NhdGlvbgotICogb2YgdGhpcyBmbGFnIGluIHJlYWwgbW9kZSBtZW1vcnkgc28gdGhhdCBib3RoIHRoZSByZWFsIG1vZGUgYW5kCi0gKiBwcm90ZWN0ZWQgbW9kZSBjb2RlIHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBzYW1lIGZsYWdzLgotICovCi0KLSNpZm5kZWYgRE9TNEdXCi1zdGF0aWMgdWNoYXIgY3RybEhhbmRsZXJbXSA9IHsKLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qICBjdHJsQkZsYWcgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHg2NiwweDJFLDB4QzcsMHgwNiwweDAwLDB4MDAsCi0gICAgMHgwMSwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6Y3RybEJGbGFnXSwxICAgICAgICAqLwotICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGlyZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9OwotI2VuZGlmCi0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCi17Ci0jaWZuZGVmIERPUzRHVwotICAgIHVpbnQgICAgcnNlZyxyb2ZmOwotI2Vsc2UKLSAgICBzdGF0aWMgaW50ICBjdHJsQ0ZsYWcsY3RybEJGbGFnOwotCi0gICAgX1BNX2N0cmxDUHRyID0gKHVjaGFyKikmY3RybENGbGFnOwotICAgIF9QTV9jdHJsQlB0ciA9ICh1Y2hhciopJmN0cmxCRmxhZzsKLSNlbmRpZgotCi0gICAgZ2V0SVNSKDB4MUIsICZfUE1fcHJldkJyZWFrLCAmcHJldlJlYWxCcmVhayk7Ci0gICAgZ2V0SVNSKDB4MjMsICZfUE1fcHJldkN0cmxDLCAmcHJldlJlYWxDdHJsQyk7Ci0gICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOwotICAgIHNldElTUigweDFCLCBfUE1fYnJlYWtJU1IpOwotICAgIHNldElTUigweDIzLCBfUE1fY3RybENJU1IpOwotCi0jaWZuZGVmIERPUzRHVwotICAgIC8qIEhvb2sgdGhlIHJlYWwgbW9kZSB2ZWN0b3JzIGZvciB0aGVzZSBoYW5kbGVycywgYXMgdGhlc2UgYXJlIG5vdAotICAgICAqIG5vcm1hbGx5IHJlZmxlY3RlZCBieSB0aGUgRFBNSSBzZXJ2ZXIgdXAgdG8gcHJvdGVjdGVkIG1vZGUKLSAgICAgKi8KLSAgICBfUE1fY3RybEJQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGN0cmxIYW5kbGVyKSoyLCAmcnNlZywgJnJvZmYpOwotICAgIG1lbWNweShfUE1fY3RybEJQdHIsY3RybEhhbmRsZXIsc2l6ZW9mKGN0cmxIYW5kbGVyKSk7Ci0gICAgbWVtY3B5KF9QTV9jdHJsQlB0citzaXplb2YoY3RybEhhbmRsZXIpLGN0cmxIYW5kbGVyLHNpemVvZihjdHJsSGFuZGxlcikpOwotICAgIF9QTV9jdHJsQ1B0ciA9IF9QTV9jdHJsQlB0ciArIHNpemVvZihjdHJsSGFuZGxlcik7Ci0gICAgX1BNX3NldFJNdmVjdCgweDFCLCgobG9uZylyc2VnIDw8IDE2KSB8IChyb2ZmKzQpKTsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MjMsKChsb25nKXJzZWcgPDwgMTYpIHwgKHJvZmYrc2l6ZW9mKGN0cmxIYW5kbGVyKSs0KSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2QnJlYWsuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDFCLCBfUE1fcHJldkJyZWFrLCBwcmV2UmVhbEJyZWFrKTsKLQlyZXN0b3JlSVNSKDB4MjMsIF9QTV9wcmV2Q3RybEMsIHByZXZSZWFsQ3RybEMpOwotCV9QTV9wcmV2QnJlYWsuc2VsID0gMDsKLQlfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKLSNpZm5kZWYgRE9TNEdXCi0JUE1fZnJlZVJlYWxTZWcoX1BNX2N0cmxCUHRyKTsKLSNlbmRpZgotCX0KLX0KLQotLyogUmVhbCBtb2RlIENyaXRpY2FsIEVycm9yIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2F2ZXMgdGhlIEFYIGFuZAotICogREkgdmFsdWVzIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0cy4gV2Ugc2F2ZSB0aGUgbG9jYXRpb24KLSAqIG9mIHRoaXMgZmxhZyBpbiByZWFsIG1vZGUgbWVtb3J5IHNvIHRoYXQgYm90aCB0aGUgcmVhbCBtb2RlIGFuZAotICogcHJvdGVjdGVkIG1vZGUgY29kZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncy4KLSAqLwotCi0jaWZuZGVmIERPUzRHVwotc3RhdGljIHVjaGFyIGNyaXRpY2FsSGFuZGxlcltdID0gewotICAgIDB4MDAsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIGF4Q29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBkaUNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyRSwweEEzLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6YXhDb2RlXSxheCAgICAgICAgICAqLwotICAgIDB4MkUsMHg4OSwweDNFLDB4MDIsMHgwMCwgICAgICAgLyogIG1vdiAgICAgW2NzOmRpQ29kZV0sZGkgICAgICAgICAgKi8KLSAgICAweEI4LDB4MDMsMHgwMCwgICAgICAgICAgICAgICAgIC8qICBtb3YgICAgIGF4LDMgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgaXJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0jZW5kaWYKLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlciBjaCkKLXsKLSNpZm5kZWYgRE9TNEdXCi0gICAgdWludCAgICByc2VnLHJvZmY7Ci0jZWxzZQotICAgIHN0YXRpYyAgc2hvcnQgICBjcml0QnVmWzJdOwotCi0gICAgX1BNX2NyaXRQdHIgPSAodWNoYXIqKWNyaXRCdWY7Ci0jZW5kaWYKLQotICAgIGdldElTUigweDI0LCAmX1BNX3ByZXZDcml0aWNhbCwgJnByZXZSZWFsQ3JpdGljYWwpOwotICAgIF9QTV9jcml0SGFuZGxlciA9IGNoOwotICAgIHNldElTUigweDI0LCBfUE1fY3JpdGljYWxJU1IpOwotCi0jaWZuZGVmIERPUzRHVwotICAgIC8qIEhvb2sgdGhlIHJlYWwgbW9kZSB2ZWN0b3IsIGFzIHRoaXMgaXMgbm90IG5vcm1hbGx5IHJlZmxlY3RlZCBieSB0aGUKLSAgICAgKiBEUE1JIHNlcnZlciB1cCB0byBwcm90ZWN0ZWQgbW9kZS4KLSAgICAgKi8KLSAgICBfUE1fY3JpdFB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YoY3JpdGljYWxIYW5kbGVyKSoyLCAmcnNlZywgJnJvZmYpOwotICAgIG1lbWNweShfUE1fY3JpdFB0cixjcml0aWNhbEhhbmRsZXIsc2l6ZW9mKGNyaXRpY2FsSGFuZGxlcikpOwotICAgIF9QTV9zZXRSTXZlY3QoMHgyNCwoKGxvbmcpcnNlZyA8PCAxNikgfCAocm9mZis0KSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2Q3JpdGljYWwuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDI0LCBfUE1fcHJldkNyaXRpY2FsLCBwcmV2UmVhbENyaXRpY2FsKTsKLQlQTV9mcmVlUmVhbFNlZyhfUE1fY3JpdFB0cik7Ci0JX1BNX3ByZXZDcml0aWNhbC5zZWwgPSAwOwotCV9QTV9jcml0SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBEUE1JX2xvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gRFBNSV91bmxvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBEUE1JX2xvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuY3MpLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIERQTUlfdW5sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCArIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmNzKSxsZW4pOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTliNmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IERPUwotKgotKiBEZXNjcmlwdGlvbjogIE1haW4gQyBtb2R1bGUgZm9yIHRoZSBWRmxhdCBmcmFtZWJ1ZmZlciByb3V0aW5lcy4gVGhlIHBhZ2UKLSogICAgICAgICAgICAgICBmYXVsdCBoYW5kbGVyIGlzIGFsd2F5cyBpbnN0YWxsZWQgdG8gaGFuZGxlIHVwIHRvIGEgNE1iCi0qICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgd2l0aCBhIHdpbmRvdyBzaXplIG9mIDRLYiBvciA2NEtiIGluIHNpemUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxkb3MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERPUzRHL1csIFBNT0RFL1cgYW5kIENhdXNlV2F5IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChET1M0R1cpCi0KLSNkZWZpbmUgVkZMQVRfU1RBUlRfQUREUiAgICAweEYwMDAwMDAwVQotI2RlZmluZSBWRkxBVF9FTkRfQUREUiAgICAgIDB4RjAzRkZGRkZVCi0jZGVmaW5lIFZGTEFUX0xJTUlUICAgICAgICAgKFZGTEFUX0VORF9BRERSIC0gVkZMQVRfU1RBUlRfQUREUikKLSNkZWZpbmUgUEFHRV9QUkVTRU5UICAgICAgICAxCi0jZGVmaW5lIFBBR0VfTk9UUFJFU0VOVCAgICAgMAotI2RlZmluZSBQQUdFX1JFQUQgICAgICAgICAgIDAKLSNkZWZpbmUgUEFHRV9XUklURSAgICAgICAgICAyCi0KLVBSSVZBVEUgaWJvb2wgICBpbnN0YWxsZWQgPSBmYWxzZTsKLVBSSVZBVEUgaWJvb2wgICBoYXZlRFBNSSA9IGZhbHNlOwotUFVCTElDICBpYm9vbCAgIF9BU01BUEkgVkZfaGF2ZUNhdXNlV2F5ID0gZmFsc2U7Ci1QVUJMSUMgIHVjaGFyICogX0FTTUFQSSBWRl96ZXJvUHRyID0gTlVMTDsKLQotLyogTG93IGxldmVsIGFzc2VtYmxlciBjb2RlICovCi0KLWludCAgICAgX0FTTUFQSSBJbml0UGFnaW5nKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIENsb3NlUGFnaW5nKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIE1hcFBoeXNpY2FsMkxpbmVhcih1bG9uZyBwQWRkciwgdWxvbmcgbEFkZHIsIGludCBwYWdlcywgaW50IGZsYWdzKTsKLXZvaWQgICAgX0FTTUFQSSBJbnN0YWxsRmF1bHRIYW5kbGVyKHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSk7Ci12b2lkICAgIF9BU01BUEkgUmVtb3ZlRmF1bHRIYW5kbGVyKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIEluc3RhbGxCYW5rRnVuYyhpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYyk7Ci0KLXZvaWQgKiBfQVNNQVBJIFZGX21hbGxvYyh1aW50IHNpemUpCi17IHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7IH0KLQotdm9pZCBfQVNNQVBJIFZGX2ZyZWUodm9pZCAqcCkKLXsgUE1fZnJlZShwKTsgfQotCi1QUklWQVRFIGlib29sIENoZWNrRFBNSSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBDaGVja0RQTUkKLSogUmV0dXJuczogICAgICBUcnVlIGlmIHdlIGFyZSBydW5uaW5nIHVuZGVyIERQTUkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgaWYgKGhhdmVEUE1JKQotCXJldHVybiB0cnVlOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgRFBNSSBpbiB3aGljaCBjYXNlIHdlIHdpbGwgbm90IGJlCi0gICAgICogYWJsZSB0byBpbnN0YWxsIG91ciBwYWdlIGZhdWx0IGhhbmRsZXJzLiBXZSBjYW4gaG93ZXZlciB1c2UgdGhlCi0gICAgICogRFZBLjM4NiBvciBWRkxBVEQuMzg2IHZpcnR1YWwgZGV2aWNlIGRyaXZlcnMgaWYgdGhleSBhcmUgcHJlc2VudC4KLSAgICAgKi8KLSAgICByZWdzLnguYXggPSAweEZGMDA7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotICAgIGlmICghcmVncy54LmNmbGFnICYmIChyZWdzLmUuZWRpICYgOCkpCi0JcmV0dXJuIChoYXZlRFBNSSA9IHRydWUpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZGX2F2YWlsYWJsZQotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgdmlydHVhbCBidWZmZXIgaXMgYXZhaWxhYmxlLCBmYWxzZSBpZiBub3QuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIGlmICghVkZfemVyb1B0cikKLQlWRl96ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRkZGRix0cnVlKTsKLSAgICBpZiAoQ2hlY2tEUE1JKCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogU3RhbmRhcmQgRE9TNEdXLCBQTU9ERS9XIGFuZCBDYXVzZXdheSAqLwotICAgIGlmIChJbml0UGFnaW5nKCkgPT0gLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgIENsb3NlUGFnaW5nKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgKiBQTUFQSSBJbml0RFBNSSh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEluaXRET1M0R1cKLSogUGFyYW1ldGVyczogICBiYXNlQWRkciAgICAtIEJhc2UgYWRkcmVzcyBvZiBmcmFtZWJ1ZmZlciBiYW5rIHdpbmRvdwotKiAgICAgICAgICAgICAgIGJhbmtTaXplICAgIC0gUGh5c2ljYWwgc2l6ZSBvZiBiYW5rcyBpbiBLYiAoNCBvciA2NCkKLSogICAgICAgICAgICAgICBjb2RlTGVuICAgICAtIExlbmd0aCBvZiAzMiBiaXQgYmFuayBzd2l0Y2ggZnVuY3Rpb24KLSogICAgICAgICAgICAgICBiYW5rRnVuYyAgICAtIFBvaW50ZXIgdG8gcHJvdGVjdGVkIG1vZGUgYmFuayBmdW5jdGlvbgotKiBSZXR1cm5zOiAgICAgIE5lYXIgcG9pbnRlciB0byB2aXJ0dWFsIGZyYW1lYnVmZmVyLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5zdGFsbHMgdGhlIHZpcnR1YWwgbGluZWFyIGZyYW1lYnVmZmVyIGhhbmRsaW5nIGZvcgotKiAgICAgICAgICAgICAgIERQTUkgZW52aXJvbm1lbnRzLiBUaGlzIHJlcXVpcmVzIHRoZSBEVkEuMzg2IG9yIFZGTEFURC4zODYKLSogICAgICAgICAgICAgICB2aXJ0dWFsIGRldmljZSBkcml2ZXJzIHRvIGJlIGluc3RhbGxlZCBhbmQgZnVuY3Rpb25pbmcuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgICh2b2lkKWJhc2VBZGRyOwotICAgICh2b2lkKWJhbmtTaXplOwotICAgICh2b2lkKWNvZGVMZW47Ci0gICAgKHZvaWQpYmFua0Z1bmM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBJbml0RE9TNEdXKHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgSW5pdERPUzRHVwotKiBQYXJhbWV0ZXJzOiAgIGJhc2VBZGRyICAgIC0gQmFzZSBhZGRyZXNzIG9mIGZyYW1lYnVmZmVyIGJhbmsgd2luZG93Ci0qICAgICAgICAgICAgICAgYmFua1NpemUgICAgLSBQaHlzaWNhbCBzaXplIG9mIGJhbmtzIGluIEtiICg0IG9yIDY0KQotKiAgICAgICAgICAgICAgIGNvZGVMZW4gICAgIC0gTGVuZ3RoIG9mIDMyIGJpdCBiYW5rIHN3aXRjaCBmdW5jdGlvbgotKiAgICAgICAgICAgICAgIGJhbmtGdW5jICAgIC0gUG9pbnRlciB0byBwcm90ZWN0ZWQgbW9kZSBiYW5rIGZ1bmN0aW9uCi0qIFJldHVybnM6ICAgICAgTmVhciBwb2ludGVyIHRvIHZpcnR1YWwgZnJhbWVidWZmZXIsIG9yIE5VTEwgb24gZmFpbHVyZS4KLSoKLSogRGVzY3JpcHRpb246ICBJbnN0YWxscyB0aGUgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXIgaGFuZGxpbmcgZm9yCi0qICAgICAgICAgICAgICAgdGhlIERPUzRHVyBleHRlbmRlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaW50ICAgICBpOwotCi0gICAgaWYgKEluaXRQYWdpbmcoKSA9PSAtMSkKLQlyZXR1cm4gTlVMTDsgICAgICAgICAgICAvKiBDYW5ub3QgZG8gaGFyZHdhcmUgcGFnaW5nISAgICAgICAqLwotCi0gICAgLyogTWFwIDRNQiBvZiB2aWRlbyBtZW1vcnkgaW50byBsaW5lYXIgYWRkcmVzcyBzcGFjZSAocmVhZC93cml0ZSkgKi8KLSAgICBpZiAoYmFua1NpemUgPT0gNjQpIHsKLQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCSAgICBNYXBQaHlzaWNhbDJMaW5lYXIoYmFzZUFkZHIsVkZMQVRfU1RBUlRfQUREUisoaTw8MTYpLDE2LAotCQlQQUdFX1dSSVRFIHwgUEFHRV9OT1RQUkVTRU5UKTsKLQkgICAgfQotCX0KLSAgICBlbHNlIHsKLQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7Ci0JICAgIE1hcFBoeXNpY2FsMkxpbmVhcihiYXNlQWRkcixWRkxBVF9TVEFSVF9BRERSKyhpPDwxMiksMSwKLQkJUEFHRV9XUklURSB8IFBBR0VfTk9UUFJFU0VOVCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBJbnN0YWxsIG91ciBwYWdlIGZhdWx0IGhhbmRsZXIgYW5kIGJhbmtzIHN3aXRjaCBmdW5jdGlvbiAqLwotICAgIEluc3RhbGxGYXVsdEhhbmRsZXIoYmFzZUFkZHIsYmFua1NpemUpOwotICAgIEluc3RhbGxCYW5rRnVuYyhjb2RlTGVuLGJhbmtGdW5jKTsKLSAgICBpbnN0YWxsZWQgPSB0cnVlOwotICAgIHJldHVybiAodm9pZCopVkZMQVRfU1RBUlRfQUREUjsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWRl9pbml0Ci0qIFBhcmFtZXRlcnM6ICAgYmFzZUFkZHIgICAgLSBCYXNlIGFkZHJlc3Mgb2YgZnJhbWVidWZmZXIgYmFuayB3aW5kb3cKLSogICAgICAgICAgICAgICBiYW5rU2l6ZSAgICAtIFBoeXNpY2FsIHNpemUgb2YgYmFua3MgaW4gS2IgKDQgb3IgNjQpCi0qICAgICAgICAgICAgICAgY29kZUxlbiAgICAgLSBMZW5ndGggb2YgMzIgYml0IGJhbmsgc3dpdGNoIGZ1bmN0aW9uCi0qICAgICAgICAgICAgICAgYmFua0Z1bmMgICAgLSBQb2ludGVyIHRvIHByb3RlY3RlZCBtb2RlIGJhbmsgZnVuY3Rpb24KLSogUmV0dXJuczogICAgICBOZWFyIHBvaW50ZXIgdG8gdmlydHVhbCBmcmFtZWJ1ZmZlciwgb3IgTlVMTCBvbiBmYWlsdXJlLgotKgotKiBEZXNjcmlwdGlvbjogIEluc3RhbGxzIHRoZSB2aXJ0dWFsIGxpbmVhciBmcmFtZWJ1ZmZlciBoYW5kbGluZy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKGluc3RhbGxlZCkKLQlyZXR1cm4gKHZvaWQqKVZGTEFUX1NUQVJUX0FERFI7Ci0gICAgaWYgKGNvZGVMZW4gPiAxMDApCi0JcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIEJhbmsgZnVuY3Rpb24gaXMgdG9vIGxhcmdlISAgICAgICovCi0gICAgaWYgKCFWRl96ZXJvUHRyKQotCVZGX3plcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGRkZGLHRydWUpOwotICAgIGlmIChDaGVja0RQTUkoKSkKLQlyZXR1cm4gSW5pdERQTUkoYmFzZUFkZHIsYmFua1NpemUsY29kZUxlbixiYW5rRnVuYyk7Ci0gICAgcmV0dXJuIEluaXRET1M0R1coYmFzZUFkZHIsYmFua1NpemUsY29kZUxlbixiYW5rRnVuYyk7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWRl9leGl0Ci0qCi0qIERlc2NyaXB0aW9uOiAgQ2xvc2VzIGRvd24gdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIgc2VydmljZXMgYW5kCi0qICAgICAgICAgICAgICAgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHBhZ2UgZmF1bHQgaGFuZGxlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKGluc3RhbGxlZCkgewotCWlmIChoYXZlRFBNSSkgewotCSAgICAvKiBEUE1JIHN1cHBvcnQgKi8KLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBTdGFuZGFyZCBET1M0R1cgYW5kIFBNT0RFL1cgc3VwcG9ydCAqLwotCSAgICBSZW1vdmVGYXVsdEhhbmRsZXIoKTsKLQkgICAgQ2xvc2VQYWdpbmcoKTsKLQkgICAgfQotCWluc3RhbGxlZCA9IGZhbHNlOwotCX0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFN1cHBvcnQgbWFwcGVkIG91dCBmb3Igb3RoZXIgY29tcGlsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZWxzZQotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICAodm9pZCliYXNlQWRkcjsKLSAgICAodm9pZCliYW5rU2l6ZTsKLSAgICAodm9pZCljb2RlTGVuOwotICAgICh2b2lkKWJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWIxNmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE1TRE9TCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11Y2hhciAqIF9WQVJBUEkgX1pUaW1lckJJT1NQdHI7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLQotdm9pZCAgICBfQVNNQVBJIExaX3RpbWVyT24odm9pZCk7Ci11bG9uZyAgIF9BU01BUEkgTFpfdGltZXJMYXAodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgTFpfdGltZXJPZmYodm9pZCk7Ci11bG9uZyAgIF9BU01BUEkgTFpfdGltZXJDb3VudCh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBMWl9kaXNhYmxlKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIExaX2VuYWJsZSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotICAgIF9aVGltZXJCSU9TUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT24odG0pICAgICBMWl90aW1lck9uKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyTGFwKHRtKSAgICAgICAgTFpfdGltZXJMYXAoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgICAgICBMWl90aW1lck9mZigpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckNvdW50KHRtKSAgTFpfdGltZXJDb3VudCgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICA1NDkyNQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIHVsb25nICAgdGlja3M7Ci0gICAgTFpfZGlzYWJsZSgpOyAgICAgICAgICAgIC8qIFR1cm4gb2YgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCi0gICAgdGlja3MgPSBQTV9nZXRMb25nKF9aVGltZXJCSU9TUHRyKzB4NkMpOwotICAgIExaX2VuYWJsZSgpOyAgICAgICAgICAgICAvKiBUdXJuIG9uIGludGVycnVwdHMgYWdhaW4gICAgICAgICAqLwotICAgIHJldHVybiB0aWNrczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQotewotICAgIGlmIChmaW5pc2ggPCBzdGFydCkKLQlmaW5pc2ggKz0gMTU3MzA0MEw7ICAgICAgICAgLyogTnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzICAgICAgKi8KLSAgICByZXR1cm4gZmluaXNoIC0gc3RhcnQ7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmNDU4Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNYWluIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybSBldmVudAotKiAgICAgICAgICAgICAgIGxpYnJhcnkuIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2VuZXJpYyBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGNvZGUsIGFuZCBwdWxscyBpbiBtb2R1bGVzIHNwZWNpZmljIHRvIGVhY2ggdGFyZ2V0IE9TCi0qICAgICAgICAgICAgICAgZW52aXJvbm1lbnQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZXZlbnQuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRVZFTlRRU0laRSAgICAgIDEwMCAgICAgLyogTnVtYmVyIG9mIGV2ZW50cyBpbiBldmVudCBxdWV1ZSAgICAgICovCi0jZGVmaW5lIEpPWV9OVU1fQVhFUyAgICA0ICAgICAgIC8qIE51bWJlciBvZiBqb3lzdGljayBheGVzIHN1cHBvcnRlZCAgICAqLwotCi1zdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgICAgICAgICBteCxteTsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgbW91c2UgcG9zaXRpb24gICAgICAgICAgICovCi0gICAgaW50ICAgICAgICAgaGVhZDsgICAgICAgICAgICAgICAvKiBIZWFkIG9mIGV2ZW50IHF1ZXVlICAgICAgICAgICAgICAqLwotICAgIGludCAgICAgICAgIHRhaWw7ICAgICAgICAgICAgICAgLyogVGFpbCBvZiBldmVudCBxdWV1ZSAgICAgICAgICAgICAgKi8KLSAgICBpbnQgICAgICAgICBmcmVlSGVhZDsgICAgICAgICAgIC8qIEhlYWQgb2YgZnJlZSBsaXN0ICAgICAgICAgICAgICAgICovCi0gICAgaW50ICAgICAgICAgY291bnQ7ICAgICAgICAgICAgICAvKiBOby4gb2YgaXRlbXMgY3VycmVudGx5IGluIHF1ZXVlICAqLwotICAgIGV2ZW50X3QgICAgIGV2dHFbRVZFTlRRU0laRV07ICAgLyogVGhlIHF1ZXVlIHN0cnVjdHVyZSBpdHNlbGYgICAgICAgKi8KLSAgICBpbnQgICAgICAgICBvbGRNb3ZlOyAgICAgICAgICAgIC8qIFByZXZpb3VzIG1vdmVtZW50IGV2ZW50ICAgICAgICAgICovCi0gICAgaW50ICAgICAgICAgb2xkS2V5OyAgICAgICAgICAgICAvKiBQcmV2aW91cyBrZXkgcmVwZWF0IGV2ZW50ICAgICAgICAqLwotICAgIGludCAgICAgICAgIG9sZEpveU1vdmU7ICAgICAgICAgLyogUHJldmlvdXMgam95c3RpY2sgbW92ZW1lbnQgZXZlbnQgKi8KLSAgICBpbnQgICAgICAgICBqb3lNYXNrOyAgICAgICAgICAgIC8qIE1hc2sgb2Ygam95c3RpY2sgYXhlcyBwcmVzZW50ICAgICovCi0gICAgaW50ICAgICAgICAgam95TWluW0pPWV9OVU1fQVhFU107Ci0gICAgaW50ICAgICAgICAgam95Q2VudGVyW0pPWV9OVU1fQVhFU107Ci0gICAgaW50ICAgICAgICAgam95TWF4W0pPWV9OVU1fQVhFU107Ci0gICAgaW50ICAgICAgICAgam95UHJldltKT1lfTlVNX0FYRVNdOwotICAgIGludCAgICAgICAgIGpveUJ1dFN0YXRlOwotICAgIHVsb25nICAgICAgIGRvdWJsZUNsaWNrOwotICAgIHVsb25nICAgICAgIGF1dG9SZXBlYXQ7Ci0gICAgdWxvbmcgICAgICAgYXV0b0RlbGF5OwotICAgIHVsb25nICAgICAgIGF1dG9UaWNrczsKLSAgICB1bG9uZyAgICAgICBkb3VibGVDbGlja1RocmVzaDsKLSAgICB1bG9uZyAgICAgICBmaXJzdEF1dG87Ci0gICAgaW50ICAgICAgICAgYXV0b01vdXNlX3g7Ci0gICAgaW50ICAgICAgICAgYXV0b01vdXNlX3k7Ci0gICAgZXZlbnRfdCAgICAgZG93bk1vdXNlOwotICAgIHVsb25nICAgICAgIGtleU1vZGlmaWVyczsgICAgICAgLyogQ3VycmVudCBrZXlib2FyZCBtb2RpZmllcnMgICAgICAgKi8KLSAgICB1Y2hhciAgICAgICBrZXlUYWJsZVsxMjhdOyAgICAgIC8qIFRhYmxlIG9mIGtleSB1cC9kb3duIGZsYWdzICAgICAgICovCi0gICAgaWJvb2wgICAgICAgYWxsb3dMRURTOyAgICAgICAgICAvKiBUcnVlIGlmIExFRFMgc2hvdWxkIGNoYW5nZSAgICAgICAqLwotICAgIF9FVlRfdXNlckV2ZW50RmlsdGVyICAgIHVzZXJFdmVudENhbGxiYWNrOwotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciAgIG1vdXNlTW92ZTsKLSAgICBfRVZUX2hlYXJ0QmVhdENhbGxiYWNrICBoZWFydEJlYXQ7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKmhlYXJ0QmVhdFBhcmFtczsKLSAgICBjb2RlcGFnZV90ICAgICAgICAgICAgICAqY29kZVBhZ2U7Ci0gICAgfSBFVlQ7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKF9fUkVBTERPU19fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKLS8qIHtzZWNyZXR9ICovCi12b2lkIEVWVEFQSSBfRVZUX2NDb2RlU3RhcnQodm9pZCkge30KLSNlbmRpZgotCi0vKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCi0KLWludCBFVlRBUEkgX0VWVF9yZWFkSm95QXhpcyhpbnQgbWFzayxpbnQgKmF4aXMpOwotaW50IEVWVEFQSSBfRVZUX3JlYWRKb3lCdXR0b25zKHZvaWQpOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCi0KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0IC0gRXZlbnQgdG8gYWRkIHRvIHRoZSBldmVudCBxdWV1ZQotCi1SRU1BUktTOgotQWRkcyBhbiBldmVudCB0byB0aGUgZXZlbnQgcXVldWUgYnkgdGFja2luZyBpdCBvbnRvIHRoZSB0YWlsIG9mIHRoZSBldmVudAotcXVldWUuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgYXQgbGVhc3Qgb25lIHNwb3QgaXMgYXZhaWxhYmxlIG9uIHRoZQotZnJlZUxpc3QgZm9yIHRoZSBldmVudCB0byBiZSBpbnNlcnRlZC4KLQotTk9URTogICBJbnRlcnJ1cHRzIE1VU1QgYmUgT0ZGIHdoaWxlIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZW5zdXJlIHdlIGhhdmUKLQltdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIHRvIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZm9yCi0JaW50ZXJydXB0IGRyaXZlbiBzeXN0ZW1zIChsaWtlIHVuZGVyIERPUykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRkRXZlbnQoCi0gICAgZXZlbnRfdCAqZXZ0KQotewotICAgIGludCBldnRJRDsKLQotICAgIC8qIENoZWNrIGZvciBtb3VzZSBkb3VibGUgY2xpY2sgZXZlbnRzICovCi0gICAgaWYgKGV2dC0+d2hhdCAmIEVWVF9NT1VTRUVWVCkgewotCUVWVC5hdXRvTW91c2VfeCA9IGV2dC0+d2hlcmVfeDsKLQlFVlQuYXV0b01vdXNlX3kgPSBldnQtPndoZXJlX3k7Ci0JaWYgKChldnQtPndoYXQgJiBFVlRfTU9VU0VET1dOKSAmJiAhKGV2dC0+bWVzc2FnZSAmIEVWVF9EQkxDTElDSykpIHsKLQkgICAgLyogRGV0ZXJtaW5lIGlmIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyBhIGRvdWJsZSBjbGljayBldmVudCAqLwotCSAgICB1aW50IGRpZmZfeCA9IEFCUyhldnQtPndoZXJlX3ggLSBFVlQuZG93bk1vdXNlLndoZXJlX3gpOwotCSAgICB1aW50IGRpZmZfeSA9IEFCUyhldnQtPndoZXJlX3kgLSBFVlQuZG93bk1vdXNlLndoZXJlX3kpOwotCSAgICBpZiAoKGV2dC0+bWVzc2FnZSA9PSBFVlQuZG93bk1vdXNlLm1lc3NhZ2UpCi0JCSYmICgoZXZ0LT53aGVuIC0gRVZULmRvd25Nb3VzZS53aGVuKSA8PSBFVlQuZG91YmxlQ2xpY2spCi0JCSYmIChkaWZmX3ggPD0gRVZULmRvdWJsZUNsaWNrVGhyZXNoKQotCQkmJiAoZGlmZl95IDw9IEVWVC5kb3VibGVDbGlja1RocmVzaCkpIHsKLQkJZXZ0LT5tZXNzYWdlIHw9IEVWVF9EQkxDTElDSzsKLQkJRVZULmRvd25Nb3VzZSA9ICpldnQ7Ci0JCUVWVC5kb3duTW91c2Uud2hlbiA9IDA7Ci0JCX0KLQkgICAgZWxzZQotCQlFVlQuZG93bk1vdXNlID0gKmV2dDsKLQkgICAgRVZULmF1dG9UaWNrcyA9IF9FVlRfZ2V0VGlja3MoKTsKLQkgICAgfQotCWVsc2UgaWYgKGV2dC0+d2hhdCAmIEVWVF9NT1VTRVVQKSB7Ci0JICAgIEVWVC5kb3duTW91c2Uud2hhdCA9IEVWVF9OVUxMRVZUOwotCSAgICBFVlQuZmlyc3RBdXRvID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgIC8qIENhbGwgdXNlciBzdXBwbGllZCBjYWxsYmFjayB0byBtb2RpZnkgdGhlIGV2ZW50IGlmIGRlc2lyZWQgKi8KLSAgICBpZiAoRVZULnVzZXJFdmVudENhbGxiYWNrKSB7Ci0JaWYgKCFFVlQudXNlckV2ZW50Q2FsbGJhY2soZXZ0KSkKLQkgICAgcmV0dXJuOwotCX0KLQotICAgIC8qIEdldCBzcG90IHRvIHBsYWNlIHRoZSBldmVudCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KLSAgICBldnRJRCA9IEVWVC5mcmVlSGVhZDsKLSAgICBFVlQuZnJlZUhlYWQgPSBFVlQuZXZ0cVtFVlQuZnJlZUhlYWRdLm5leHQ7Ci0KLSAgICAvKiBBZGQgdG8gdGhlIEVWVC50YWlsIG9mIHRoZSBldmVudCBxdWV1ZSAgICovCi0gICAgZXZ0LT5uZXh0ID0gLTE7Ci0gICAgZXZ0LT5wcmV2ID0gRVZULnRhaWw7Ci0gICAgaWYgKEVWVC50YWlsICE9IC0xKQotCUVWVC5ldnRxW0VWVC50YWlsXS5uZXh0ID0gZXZ0SUQ7Ci0gICAgZWxzZQotCUVWVC5oZWFkID0gZXZ0SUQ7Ci0gICAgRVZULnRhaWwgPSBldnRJRDsKLSAgICBFVlQuZXZ0cVtldnRJRF0gPSAqZXZ0OwotICAgIEVWVC5jb3VudCsrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlIHRvIHRoZSBlbXB0eSBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpbml0RXZlbnRRdWV1ZSh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgLyogQnVpbGQgZnJlZSBsaXN0LCBhbmQgaW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0gICAgZm9yIChpID0gMDsgaSA8IEVWRU5UUVNJWkU7IGkrKykKLQlFVlQuZXZ0cVtpXS5uZXh0ID0gaSsxOwotICAgIEVWVC5ldnRxW0VWRU5UUVNJWkUtMV0ubmV4dCA9IC0xOyAgICAgICAvKiBUZXJtaW5hdGUgbGlzdCAgICAgICAgICAgKi8KLSAgICBFVlQuY291bnQgPSBFVlQuZnJlZUhlYWQgPSAwOwotICAgIEVWVC5oZWFkID0gRVZULnRhaWwgPSAtMTsKLSAgICBFVlQub2xkTW92ZSA9IC0xOwotICAgIEVWVC5vbGRLZXkgPSAtMTsKLSAgICBFVlQub2xkSm95TW92ZSA9IC0xOwotICAgIEVWVC5qb3lCdXRTdGF0ZSA9IDA7Ci0gICAgRVZULm14ID0gRVZULm15ID0gMDsKLSAgICBFVlQua2V5TW9kaWZpZXJzID0gMDsKLSAgICBFVlQuYWxsb3dMRURTID0gdHJ1ZTsKLQotICAgIC8qIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbW91c2UgZG91YmxlIGNsaWNrIGFuZCBtb3VzZSBhdXRvIGV2ZW50cyAqLwotICAgIEVWVC5kb3VibGVDbGljayA9IDQ0MDsKLSAgICBFVlQuYXV0b1JlcGVhdCA9IDU1OwotICAgIEVWVC5hdXRvRGVsYXkgPSAzMzA7Ci0gICAgRVZULmF1dG9UaWNrcyA9IDA7Ci0gICAgRVZULmRvdWJsZUNsaWNrVGhyZXNoID0gNTsKLSAgICBFVlQuZmlyc3RBdXRvID0gdHJ1ZTsKLSAgICBFVlQuYXV0b01vdXNlX3ggPSBFVlQuYXV0b01vdXNlX3kgPSAwOwotICAgIG1lbXNldCgmRVZULmRvd25Nb3VzZSwwLHNpemVvZihFVlQuZG93bk1vdXNlKSk7Ci0KLSAgICAvKiBTZXR1cCBkZWZhdWx0IHBvaW50ZXJzIGZvciBldmVudCBsaWJyYXJ5ICovCi0gICAgRVZULnVzZXJFdmVudENhbGxiYWNrID0gTlVMTDsKLSAgICBFVlQuY29kZVBhZ2UgPSAmX0NQX1VTX0VuZ2xpc2g7Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBqb3lzdGljayBtb2R1bGUgYW5kIGRvIGJhc2ljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi0gICAgICogdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkLgotICAgICAqLwotICAgIEVWVC5qb3lNYXNrID0gRVZUX2pveUlzUHJlc2VudCgpOwotfQotCi0jaWYgZGVmaW5lZChORUVEX1NDQUxFX0pPWV9BWElTKSB8fCAhZGVmaW5lZChVU0VfT1NfSk9ZU1RJQ0spCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc2NhbGVzIGEgam95c3RpY2sgYXhpcyB2YWx1ZSB0byBub3JtYWxpc2VkIGZvcm0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzY2FsZUpveUF4aXMoCi0gICAgaW50IHJhdywKLSAgICBpbnQgYXhpcykKLXsKLSAgICBpbnQgc2NhbGVkLHJhbmdlOwotCi0gICAgLyogTWFrZSBzdXJlIHRoZSBqb3lzdGljayBpcyBjYWxpYnJhdGVkIHByb3Blcmx5ICovCi0gICAgaWYgKEVWVC5qb3lDZW50ZXJbYXhpc10gLSBFVlQuam95TWluW2F4aXNdIDwgNSkKLQlyZXR1cm4gcmF3OwotICAgIGlmIChFVlQuam95TWF4W2F4aXNdIC0gRVZULmpveUNlbnRlcltheGlzXSA8IDUpCi0JcmV0dXJuIHJhdzsKLQotICAgIC8qIE5vdyBzY2FsZSB0aGUgY29vcmRpbmF0ZXMgdG8gLTEyOCB0byAxMjcgKi8KLSAgICByYXcgLT0gRVZULmpveUNlbnRlcltheGlzXTsKLSAgICBpZiAocmF3IDwgMCkKLQlyYW5nZSA9IEVWVC5qb3lDZW50ZXJbYXhpc10tRVZULmpveU1pbltheGlzXTsKLSAgICBlbHNlCi0JcmFuZ2UgPSBFVlQuam95TWF4W2F4aXNdLUVWVC5qb3lDZW50ZXJbYXhpc107Ci0gICAgc2NhbGVkID0gKHJhdyAqIDEyOCkgLyByYW5nZTsKLSAgICBpZiAoc2NhbGVkIDwgLTEyOCkKLQlzY2FsZWQgPSAtMTI4OwotICAgIGlmIChzY2FsZWQgPiAxMjcpCi0Jc2NhbGVkID0gMTI3OwotICAgIHJldHVybiBzY2FsZWQ7Ci19Ci0jZW5kaWYKLQotI2lmICAgICBkZWZpbmVkKF9fU01YMzJfXykKLSNpbmNsdWRlICJzbXgvZXZlbnQuYyIKLSNlbGlmICAgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0jaW5jbHVkZSAicnR0YXJnZXQvZXZlbnQuYyIKLSNlbGlmICAgZGVmaW5lZChfX1JFQUxET1NfXykKLSNpbmNsdWRlICJkb3MvZXZlbnQuYyIKLSNlbGlmICAgZGVmaW5lZChfX1dJTkRPV1MzMl9fKQotI2luY2x1ZGUgIndpbjMyL2V2ZW50LmMiCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfXykKLSNpZiAgICAgZGVmaW5lZChfX09TMl9QTV9fKQotI2luY2x1ZGUgIm9zMnBtL2V2ZW50LmMiCi0jZWxzZQotI2luY2x1ZGUgIm9zMi9ldmVudC5jIgotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19MSU5VWF9fKQotI2lmICAgICBkZWZpbmVkKF9fVVNFX1gxMV9fKQotI2luY2x1ZGUgIngxMS9ldmVudC5jIgotI2Vsc2UKLSNpbmNsdWRlICJsaW51eC9ldmVudC5jIgotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19RTlhfXykKLSNpZiAgICAgZGVmaW5lZChfX1VTRV9QSE9UT05fXykKLSNpbmNsdWRlICJwaG90b24vZXZlbnQuYyIKLSNlbGlmICAgZGVmaW5lZChfX1VTRV9YMTFfXykKLSNpbmNsdWRlICJ4MTEvZXZlbnQuYyIKLSNlbHNlCi0jaW5jbHVkZSAicW54L2V2ZW50LmMiCi0jZW5kaWYKLSNlbGlmICAgZGVmaW5lZChfX0JFT1NfXykKLSNpbmNsdWRlICJiZW9zL2V2ZW50LmMiCi0jZWxzZQotI2Vycm9yICBFdmVudCBsaWJyYXJ5IG5vdCBwb3J0ZWQgdG8gdGhpcyBwbGF0Zm9ybSB5ZXQhCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIGludGVyZmFjZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogSWYgVVNFX09TX0pPWVNUSUNLIGlzIGRlZmluZWQsIHRoZSBPUyBzcGVjaWZpYyBsaWJyYXJpZXMgd2lsbCBpbXBsZW1lbnQKLSAqIHRoZSBqb3lzdGljayBjb2RlIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBnZW5lcmljIE9TIHBvcnRhYmxlIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBVU0VfT1NfSk9ZU1RJQ0sKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIG1hc2sgaW5kaWNhdGluZyB3aGF0IGpveXN0aWNrIGF4ZXMgYXJlIGF0dGFjaGVkLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBhdHRhY2hlZCBqb3lzdGlja3MsIGFuZCBkZXRlcm1pbmUKLXdoYXQgYXhlcyBhcmUgcHJlc2VudCBhbmQgZnVuY3Rpb25pbmcuIFRoaXMgZnVuY3Rpb24gd2lsbCByZS1kZXRlY3QgYW55Ci1hdHRhY2hlZCBqb3lzdGlja3Mgd2hlbiBpdCBpcyBjYWxsZWQsIHNvIGlmIHRoZSB1c2VyIGZvcmdvdCB0byBhdHRhY2gKLXRoZSBqb3lzdGljayB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydGVkLCB5b3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0bwotcmUtZGV0ZWN0IGFueSBuZXdseSBhdHRhY2hlZCBqb3lzdGlja3MuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldExvd2VyUmlnaHQsIEVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRVZUQVBJIEVWVF9qb3lJc1ByZXNlbnQodm9pZCkKLXsKLSAgICBpbnQgbWFzayxpOwotCi0gICAgbWVtc2V0KEVWVC5qb3lNaW4sMCxzaXplb2YoRVZULmpveU1pbikpOwotICAgIG1lbXNldChFVlQuam95Q2VudGVyLDAsc2l6ZW9mKEVWVC5qb3lDZW50ZXIpKTsKLSAgICBtZW1zZXQoRVZULmpveU1heCwwLHNpemVvZihFVlQuam95TWF4KSk7Ci0gICAgbWVtc2V0KEVWVC5qb3lQcmV2LDAsc2l6ZW9mKEVWVC5qb3lQcmV2KSk7Ci0gICAgRVZULmpveUJ1dFN0YXRlID0gMDsKLSNpZmRlZiBfX0xJTlVYX18KLSAgICBQTV9pbml0KCk7Ci0jZW5kaWYKLSAgICBtYXNrID0gX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lDZW50ZXIpOwotICAgIGlmIChtYXNrKSB7Ci0JZm9yIChpID0gMDsgaSA8IEpPWV9OVU1fQVhFUzsgaSsrKQotCSAgICBFVlQuam95TWF4W2ldID0gRVZULmpveUNlbnRlcltpXSoyOwotCX0KLSAgICByZXR1cm4gbWFzazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUG9sbHMgdGhlIGpveXN0aWNrIGZvciBwb3NpdGlvbiBhbmQgYnV0dG9uIGluZm9ybWF0aW9uLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwb2xsIGFuYWxvZ3VlIGpveXN0aWNrcyBmb3IgYnV0dG9uIGFuZCBwb3NpdGlvbgotaW5mb3JtYXRpb24uIEl0IHNob3VsZCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBtYWluIGxvb3Agb2YgdGhlIHVzZXIKLWFwcGxpY2F0aW9uLCBqdXN0IGJlZm9yZSBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGV2ZW50cyB2aWEgRVZUX2dldE5leHQuCi1BbGwgaW5mb3JtYXRpb24gcG9sbGVkIGZyb20gdGhlIGpveXN0aWNrIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBldmVudAotcXVldWUgZm9yIGxhdGVyIHJldHJpZXZhbC4KLQotTm90ZTogICBNb3N0IGFuYWxvZ3VlIGpveXN0aWNrcyB3aWxsIHByb3ZpZGUgcmVhZGluZ3MgdGhhdCBjaGFuZ2UgZXZlbgotCXRob3VnaCB0aGUgam95c3RpY2sgaGFzIG5vdCBtb3ZlZC4gSGVuY2UgaWYgeW91IGNhbGwgdGhpcyByb3V0aW5lCi0JeW91IHdpbGwgbGlrZWx5IGdldCBhbiBFVlRfSk9ZTU9WRSBldmVudCBldmVyeSB0aW1lIHRocm91Z2ggeW91cgotCWV2ZW50IGxvb3AuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9wZWVrTmV4dCwgRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldExvd2VyUmlnaHQsCi1FVlRfam95U2V0Q2VudGVyLCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3BvbGxKb3lzdGljayh2b2lkKQotewotICAgIGV2ZW50X3QgZXZ0OwotICAgIGludCAgICAgaSxheGlzW0pPWV9OVU1fQVhFU10sbmV3QnV0U3RhdGUsbWFzayxtb3ZlZCxwczsKLQotICAgIGlmIChFVlQuam95TWFzaykgewotCS8qIFJlYWQgam95c3RpY2sgYXhlcyBhbmQgcG9zdCBtb3ZlbWVudCBldmVudHMgaWYgdGhleSBoYXZlCi0JICogY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHBvbGxlZC4gVW50aWwgdGhlIGV2ZW50cyBhcmUKLQkgKiBhY3R1YWxseSBmbHVzaGVkLCB3ZSBrZWVwIG1vZGlmeWluZyB0aGUgc2FtZSBqb3lzdGljayBtb3ZlbWVudAotCSAqIGV2ZW50LCBzbyB5b3Ugd29uJ3QgZ2V0IG11bHRpcGxlIG1vdmVtZW50IGV2ZW50Ci0JICovCi0JbWFzayA9IF9FVlRfcmVhZEpveUF4aXMoRVZULmpveU1hc2ssYXhpcyk7Ci0JbmV3QnV0U3RhdGUgPSBfRVZUX3JlYWRKb3lCdXR0b25zKCk7Ci0JbW92ZWQgPSBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgSk9ZX05VTV9BWEVTOyBpKyspIHsKLQkgICAgaWYgKG1hc2sgJiAoRVZUX0pPWV9BWElTX1gxIDw8IGkpKQotCQlheGlzW2ldID0gc2NhbGVKb3lBeGlzKGF4aXNbaV0saSk7Ci0JICAgIGVsc2UKLQkJYXhpc1tpXSA9IEVWVC5qb3lQcmV2W2ldOwotCSAgICBpZiAoYXhpc1tpXSAhPSBFVlQuam95UHJldltpXSkKLQkJbW92ZWQgPSB0cnVlOwotCSAgICB9Ci0JaWYgKG1vdmVkKSB7Ci0JICAgIG1lbWNweShFVlQuam95UHJldixheGlzLHNpemVvZihFVlQuam95UHJldikpOwotCSAgICBwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCSAgICBpZiAoRVZULm9sZEpveU1vdmUgIT0gLTEpIHsKLQkJLyogTW9kaWZ5IHRoZSBleGlzdGluZyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ubWVzc2FnZSA9IG5ld0J1dFN0YXRlOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQl9Ci0JICAgIGVsc2UgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkJLyogQWRkIGEgbmV3IGpveXN0aWNrIG1vdmVtZW50IGV2ZW50ICovCi0JCUVWVC5vbGRKb3lNb3ZlID0gRVZULmZyZWVIZWFkOwotCQltZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKLQkJZXZ0LndoYXQgPSBFVlRfSk9ZTU9WRTsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlQuam95QnV0U3RhdGU7Ci0JCWV2dC53aGVyZV94ID0gRVZULmpveVByZXZbMF07Ci0JCWV2dC53aGVyZV95ID0gRVZULmpveVByZXZbMV07Ci0JCWV2dC5yZWxhdGl2ZV94ID0gRVZULmpveVByZXZbMl07Ci0JCWV2dC5yZWxhdGl2ZV95ID0gRVZULmpveVByZXZbM107Ci0JCWFkZEV2ZW50KCZldnQpOwotCQl9Ci0JICAgIF9FVlRfcmVzdG9yZUludChwcyk7Ci0JICAgIH0KLQotCS8qIFJlYWQgdGhlIGpveXN0aWNrIGJ1dHRvbnMsIGFuZCBwb3N0IGV2ZW50cyB0byByZWZsZWN0IHRoZSBjaGFuZ2UKLQkgKiBpbiBzdGF0ZSBmb3IgdGhlIGpveXN0aWNrIGJ1dHRvbnMuCi0JICovCi0JaWYgKG5ld0J1dFN0YXRlICE9IEVWVC5qb3lCdXRTdGF0ZSkgewotCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCQkvKiBBZGQgYSBuZXcgam95c3RpY2sgY2xpY2sgZXZlbnQgKi8KLQkJcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQkJbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7Ci0JCWV2dC53aGF0ID0gRVZUX0pPWUNMSUNLOwotCQlldnQubWVzc2FnZSA9IG5ld0J1dFN0YXRlOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQlhZGRFdmVudCgmZXZ0KTsKLQkJX0VWVF9yZXN0b3JlSW50KHBzKTsKLQkJfQotCSAgICBFVlQuam95QnV0U3RhdGUgPSBuZXdCdXRTdGF0ZTsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgdXBwZXIgbGVmdCBwb3NpdGlvbgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCi13aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi10aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCi1UbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSB1cHBlciBsZWZ0Ci1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95TWluKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgbG93ZXIgcmlnaHQgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgbG93ZXIgcmlnaHQKLXBvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcwotZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCi1jYWxpYnJhdGlvbiBmYWN0b3JzLgotCi1Vc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKLWluaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQotdXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQotc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRMb3dlclJpZ2h0KHZvaWQpCi17Ci0gICAgX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lNYXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1DYWxpYnJhdGVzIHRoZSBqb3lzdGljayBjZW50ZXIgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgY2VudGVyCi1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldENlbnRlcih2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95Q2VudGVyKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Qb3N0cyBhIHVzZXIgZGVmaW5lZCBldmVudCB0byB0aGUgZXZlbnQgcXVldWUKLQotSEVBREVSOgotZXZlbnQuaAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBldmVudCB3YXMgcG9zdGVkLCBmYWxzZSBpZiBldmVudCBxdWV1ZSBpcyBmdWxsLgotCi1QQVJBTUVURVJTOgotd2hhdCAgICAgICAgLSBUeXBlIGNvZGUgZm9yIG1lc3NhZ2UgdG8gcG9zdAotbWVzc2FnZSAgICAgLSBFdmVudCBzcGVjaWZpYyBtZXNzYWdlIHRvIHBvc3QKLW1vZGlmaWVycyAgIC0gRXZlbnQgc3BlY2lmaWMgbW9kaWZpZXIgZmxhZ3MgdG8gcG9zdAotCi1SRU1BUktTOgotVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcG9zdCB1c2VyIGRlZmluZWQgZXZlbnRzIHRvIHRoZSBldmVudCBxdWV1ZS4KLQotU0VFIEFMU086Ci1FVlRfZmx1c2gsIEVWVF9nZXROZXh0LCBFVlRfcGVla05leHQsIEVWVF9oYWx0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgRVZUQVBJIEVWVF9wb3N0KAotICAgIHVsb25nIHdoaWNoLAotICAgIHVsb25nIHdoYXQsCi0gICAgdWxvbmcgbWVzc2FnZSwKLSAgICB1bG9uZyBtb2RpZmllcnMpCi17Ci0gICAgZXZlbnRfdCBldnQ7Ci0gICAgdWludCAgICBwczsKLQotICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JLyogU2F2ZSBpbmZvcm1hdGlvbiBpbiBldmVudCByZWNvcmQgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWV2dC53aGljaCA9IHdoaWNoOwotCWV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOwotCWV2dC53aGF0ID0gd2hhdDsKLQlldnQubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JZXZ0Lm1vZGlmaWVycyA9IG1vZGlmaWVyczsKLQlhZGRFdmVudCgmZXZ0KTsgICAgICAgICAgICAgLyogQWRkIHRvIEVWVC50YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCXJldHVybiB0cnVlOwotCX0KLSAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1GbHVzaGVzIGFsbCBldmVudHMgb2YgYSBzcGVjaWZpZWQgdHlwZSBmcm9tIHRoZSBldmVudCBxdWV1ZS4KLQotUEFSQU1FVEVSUzoKLW1hc2sgICAgLSBNYXNrIHNwZWNpZnlpbmcgdGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLUZsdXNoZXMgKHJlbW92ZXMpIGFsbCBwZW5kaW5nIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZnJvbSB0aGUgZXZlbnQKLXF1ZXVlLiBZb3UgbWF5IGNvbWJpbmUgdGhlIG1hc2tzIGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMgd2l0aCBhIHNpbXBsZQotbG9naWNhbCBPUi4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TmV4dCwgRVZUX2hhbHQsIEVWVF9wZWVrTmV4dAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9mbHVzaCgKLSAgICB1bG9uZyBtYXNrKQotewotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbHVzaCBhbGwgZXZlbnRzICovCi0JRVZUX2dldE5leHQoJmV2dCxtYXNrKTsKLQl9IHdoaWxlIChldnQud2hhdCAhPSBFVlRfTlVMTEVWVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUhhbHRzIHVudGlsIGFuZCBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgcmVjaWV2ZWQuCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUEFSQU1FVEVSUzoKLWV2dCAgICAgLSBQb2ludGVyIHRvCi1tYXNrICAgIC0gTWFzayBzcGVjaWZ5aW5nIHRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbnMgaGFsdHMgZXhjZXV0aW9uIHVudGlsIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpcwotcmVjaWV2ZWQgaW50byB0aGUgZXZlbnQgcXVldWUuIEl0IGRvZXMgbm90IGZsdXNoIHRoZSBldmVudCBxdWV1ZSBvZiBldmVudHMKLWJlZm9yZSBwZXJmb3JtaW5nIHRoZSBidXN5IGxvb3AuIEhvd2V2ZXIgdGhpcyBmdW5jdGlvbiBkb2VzIHRocm93IGF3YXkKLWFueSBldmVudHMgb3RoZXIgdGhhbiB0aGUgb25lcyB5b3UgaGF2ZSByZXF1ZXN0ZWQgdmlhIHRoZSBldmVudCBtYXNrLCB0bwotYXZvaWQgdGhlIGV2ZW50IHF1ZXVlIGZpbGxpbmcgdXAgd2l0aCB1bndhbnRlZCBldmVudHMgKGxpa2UgRVZUX0tFWVVQIG9yCi1FVlRfTU9VU0VNT1ZFIGV2ZW50cykuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9mbHVzaCwgRVZUX3BlZWtOZXh0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2hhbHQoCi0gICAgZXZlbnRfdCAqZXZ0LAotICAgIHVsb25nIG1hc2spCi17Ci0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciBhbiBldmVudCAgICAqLwotCWlmIChtYXNrICYgKEVWVF9KT1lFVlQpKQotCSAgICBFVlRfcG9sbEpveXN0aWNrKCk7Ci0JRVZUX2dldE5leHQoZXZ0LEVWVF9FVkVSWUVWVCk7Ci0JfSB3aGlsZSAoIShldnQtPndoYXQgJiBtYXNrKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVBlZWtzIGF0IHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGFuIGV2ZW50IGlzIHBlbmRpbmcsIGZhbHNlIGlmIG5vdC4KLQotUEFSQU1FVEVSUzoKLWV2dCAgICAgLSBQb2ludGVyIHRvIHN0cnVjdHVyZSB0byByZXR1cm4gdGhlIGV2ZW50IGluZm8gaW4KLW1hc2sgICAgLSBNYXNrIHNwZWNpZnlpbmcgdGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkCi0KLVJFTUFSS1M6Ci1QZWVrcyBhdCB0aGUgbmV4dCBwZW5kaW5nIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiB0aGUgZXZlbnQgcXVldWUuIFRoZQotbWFzayBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGV2ZW50cyB0byBiZSBwZWVrZWQgYXQsIGFuZAotY2FuIGJlIGFueSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGFueSBvZiB0aGUgZmxhZ3MgZGVmaW5lZCBieSB0aGUKLUVWVF9ldmVudFR5cGUgZW51bWVyYXRpb24uCi0KLUluIGNvbnRyYXN0IHRvIEVWVF9nZXROZXh0LCB0aGUgZXZlbnQgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQgcXVldWUuCi1Zb3UgbWF5IGNvbWJpbmUgdGhlIG1hc2tzIGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMgd2l0aCBhIHNpbXBsZSBsb2dpY2FsIE9SLgotCi1TRUUgQUxTTzoKLUVWVF9mbHVzaCwgRVZUX2dldE5leHQsIEVWVF9oYWx0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgRVZUQVBJIEVWVF9wZWVrTmV4dCgKLSAgICBldmVudF90ICpldnQsCi0gICAgdWxvbmcgbWFzaykKLXsKLSAgICBpbnQgICAgIGV2dElEOwotICAgIHVpbnQgICAgcHM7Ci0KLSAgICBpZiAoRVZULmhlYXJ0QmVhdCkKLQlFVlQuaGVhcnRCZWF0KEVWVC5oZWFydEJlYXRQYXJhbXMpOwotICAgIF9FVlRfcHVtcE1lc3NhZ2VzKCk7ICAgICAgICAgICAgICAgIC8qIFB1bXAgYWxsIG1lc3NhZ2VzIGludG8gcXVldWUgKi8KLSAgICBFVlQubW91c2VNb3ZlKEVWVC5teCxFVlQubXkpOyAgICAgICAvKiBNb3ZlIHRoZSBtb3VzZSBjdXJzb3IgICAgICAgICovCi0gICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgLyogRGVmYXVsdCB0byBudWxsIGV2ZW50ICAgICAgICAqLwotICAgIGlmIChFVlQuY291bnQpIHsKLQkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGFuIGV2ZW50IGJlIHBvc3RlZCB3aGlsZSB3ZSBhcmUgdHJ5aW5nCi0JICogdG8gYWNjZXNzIHRoZSBldmVudCBxdWV1ZS4gVGhpcyB3b3VsZCBjcmVhdGUgcHJvYmxlbXMgc2luY2UKLQkgKiB3ZSBtYXkgZW5kIHVwIHdpdGggaW52YWxpZCBkYXRhIGZvciBvdXIgZXZlbnQgcXVldWUgcG9pbnRlcnMuIFRvCi0JICogYWxsZXZpYXRlIHRoaXMsIGFsbCBpbnRlcnJ1cHRzIGFyZSBzdXNwZW5kZWQgd2hpbGUgd2UgbWFuaXB1bGF0ZQotCSAqIG91ciBwb2ludGVycy4KLQkgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOyAgICAgICAgICAgICAvKiBkaXNhYmxlIGludGVycnVwdHMgICAgICAgKi8KLQlmb3IgKGV2dElEID0gRVZULmhlYWQ7IGV2dElEICE9IC0xOyBldnRJRCA9IEVWVC5ldnRxW2V2dElEXS5uZXh0KSB7Ci0JICAgIGlmIChFVlQuZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBGb3VuZCBhbiBldmVudCAgICAgICAgICAgKi8KLQkgICAgfQotCWlmIChldnRJRCA9PSAtMSkgewotCSAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOwotCSAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLwotCSAgICB9Ci0JKmV2dCA9IEVWVC5ldnRxW2V2dElEXTsgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZXZlbnQgICAgICAgICAqLwotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JaWYgKGV2dC0+d2hhdCAmIEVWVF9LRVlFVlQpCi0JICAgIF9FVlRfbWFza0tleUNvZGUoZXZ0KTsKLQl9Ci0gICAgcmV0dXJuIGV2dC0+d2hhdCAhPSBFVlRfTlVMTEVWVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0cmlldmVzIHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgZnJvbSB0aGUgZXZlbnQgcXVldWUuCi0KLVBBUkFNRVRFUlM6Ci1ldnQgICAgIC0gUG9pbnRlciB0byBzdHJ1Y3R1cmUgdG8gcmV0dXJuIHRoZSBldmVudCBpbmZvIGluCi1tYXNrICAgIC0gTWFzayBzcGVjaWZ5aW5nIHRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGFuIGV2ZW50IHdhcyBwZW5kaW5nLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1SZXRyaWV2ZXMgdGhlIG5leHQgcGVuZGluZyBldmVudCBmcm9tIHRoZSBldmVudCBxdWV1ZSwgYW5kIHN0b3JlcyBpdCBpbiBhCi1ldmVudF90IHN0cnVjdHVyZS4gVGhlIG1hc2sgcGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBldmVudHMKLXRvIGJlIHJlbW92ZWQsIGFuZCBjYW4gYmUgYW55IGxvZ2ljYWwgY29tYmluYXRpb24gb2YgYW55IG9mIHRoZSBmbGFncyBkZWZpbmVkCi1ieSB0aGUgRVZUX2V2ZW50VHlwZSBlbnVtZXJhdGlvbi4KLQotVGhlIHdoYXQgZmllbGQgb2YgdGhlIGV2ZW50IGNvbnRhaW5zIHRoZSBldmVudCBjb2RlIG9mIHRoZSBldmVudCB0aGF0IHdhcwotZXh0cmFjdGVkLiBBbGwgYXBwbGljYXRpb24gc3BlY2lmaWMgZXZlbnRzIHNob3VsZCBiZWdpbiB3aXRoIHRoZSBFVlRfVVNFUkVWVAotY29kZSBhbmQgYnVpbGQgZnJvbSB0aGVyZS4gU2luY2UgdGhlIGV2ZW50IGNvZGUgaXMgc3RvcmVkIGluIGFuIGludGVnZXIsCi10aGVyZSBpcyBhIG1heGltdW0gb2YgMzIgZGlmZmVyZW50IGV2ZW50IGNvZGVzIHRoYXQgY2FuIGJlIGRpc3Rpbmd1aXNoZWQuCi1Zb3UgY2FuIHN0b3JlIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudCBpbiB0aGUgbWVzc2FnZSBmaWVsZCB0bwotZGlzdGluZ3Vpc2ggYmV0d2VlbiBldmVudHMgb2YgdGhlIHNhbWUgY2xhc3MgKGZvciBpbnN0YW5jZSB0aGUgYnV0dG9uIHVzZWQgaW4KLWEgRVZUX01PVVNFRE9XTiBldmVudCkuCi0KLUlmIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3YXMgbm90IGluIHRoZSBldmVudCBxdWV1ZSwgdGhlIHdoYXQgZmllbGQKLW9mIHRoZSBldmVudCB3aWxsIGJlIHNldCB0byBOVUxMRVZULCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIHJldHVybiBmYWxzZS4KLQotTm90ZTogICBZb3Ugc2hvdWxkIC9hbHdheXMvIHVzZSB0aGUgRVZUX0VWRVJZRVZUIG1hc2sgZm9yIGV4dHJhY3RpbmcgZXZlbnRzCi0JZnJvbSB5b3VyIG1haW4gZXZlbnQgbG9vcCBoYW5kbGVyLiBVc2luZyBhIG1hc2sgZm9yIG9ubHkgYSBzcGVjaWZpYwotCXR5cGUgb2YgZXZlbnQgZm9yIGxvbmcgcGVyaW9kcyBvZiB0aW1lIHdpbGwgY2F1c2UgdGhlIGV2ZW50IHF1ZXVlIHRvCi0JZmlsbCB1cCB3aXRoIGV2ZW50cyBvZiB0aGUgdHlwZSB5b3UgYXJlIGlnbm9yaW5nLCBldmVudHVhbGx5IGNhdXNpbmcKLQl0aGUgYXBwbGljYXRpb24gdG8gaGFuZyB3aGVuIHRoZSBldmVudCBxdWV1ZSBiZWNvbWVzIGZ1bGwuCi0KLVNFRSBBTFNPOgotRVZUX2ZsdXNoLCBFVlRfaGFsdCwgRVZUX3BlZWtOZXh0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgRVZUQVBJIEVWVF9nZXROZXh0KAotICAgIGV2ZW50X3QgKmV2dCwKLSAgICB1bG9uZyBtYXNrKQotewotICAgIGludCAgICAgZXZ0SUQsbmV4dCxwcmV2OwotICAgIHVpbnQgICAgcHM7Ci0KLSAgICBpZiAoRVZULmhlYXJ0QmVhdCkKLQlFVlQuaGVhcnRCZWF0KEVWVC5oZWFydEJlYXRQYXJhbXMpOwotICAgIF9FVlRfcHVtcE1lc3NhZ2VzKCk7ICAgICAgICAgICAgICAgIC8qIFB1bXAgYWxsIG1lc3NhZ2VzIGludG8gcXVldWUgKi8KLSAgICBFVlQubW91c2VNb3ZlKEVWVC5teCxFVlQubXkpOyAgICAgICAvKiBNb3ZlIHRoZSBtb3VzZSBjdXJzb3IgICAgICAgICovCi0gICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgLyogRGVmYXVsdCB0byBudWxsIGV2ZW50ICAgICAgICAqLwotICAgIGlmIChFVlQuY291bnQpIHsKLQkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGFuIGV2ZW50IGJlIHBvc3RlZCB3aGlsZSB3ZSBhcmUgdHJ5aW5nCi0JICogdG8gYWNjZXNzIHRoZSBldmVudCBxdWV1ZS4gVGhpcyB3b3VsZCBjcmVhdGUgcHJvYmxlbXMgc2luY2UKLQkgKiB3ZSBtYXkgZW5kIHVwIHdpdGggaW52YWxpZCBkYXRhIGZvciBvdXIgZXZlbnQgcXVldWUgcG9pbnRlcnMuIFRvCi0JICogYWxsZXZpYXRlIHRoaXMsIGFsbCBpbnRlcnJ1cHRzIGFyZSBzdXNwZW5kZWQgd2hpbGUgd2UgbWFuaXB1bGF0ZQotCSAqIG91ciBwb2ludGVycy4KLQkgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOyAgICAgICAgICAgICAvKiBkaXNhYmxlIGludGVycnVwdHMgICAgICAgKi8KLQlmb3IgKGV2dElEID0gRVZULmhlYWQ7IGV2dElEICE9IC0xOyBldnRJRCA9IEVWVC5ldnRxW2V2dElEXS5uZXh0KSB7Ci0JICAgIGlmIChFVlQuZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBGb3VuZCBhbiBldmVudCAgICAgICAgICAgKi8KLQkgICAgfQotCWlmIChldnRJRCA9PSAtMSkgewotCSAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOwotCSAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLwotCSAgICB9Ci0JbmV4dCA9IEVWVC5ldnRxW2V2dElEXS5uZXh0OwotCXByZXYgPSBFVlQuZXZ0cVtldnRJRF0ucHJldjsKLQlpZiAocHJldiAhPSAtMSkKLQkgICAgRVZULmV2dHFbcHJldl0ubmV4dCA9IG5leHQ7Ci0JZWxzZQotCSAgICBFVlQuaGVhZCA9IG5leHQ7Ci0JaWYgKG5leHQgIT0gLTEpCi0JICAgIEVWVC5ldnRxW25leHRdLnByZXYgPSBwcmV2OwotCWVsc2UKLQkgICAgRVZULnRhaWwgPSBwcmV2OwotCSpldnQgPSBFVlQuZXZ0cVtldnRJRF07ICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGV2ZW50ICAgICAgICAgKi8KLQlFVlQuZXZ0cVtldnRJRF0ubmV4dCA9IEVWVC5mcmVlSGVhZDsgICAgICAgIC8qIGFuZCByZXR1cm4gdG8gZnJlZSBsaXN0ICAqLwotCUVWVC5mcmVlSGVhZCA9IGV2dElEOwotCUVWVC5jb3VudC0tOwotCWlmIChldnQtPndoYXQgPT0gRVZUX01PVVNFTU9WRSkKLQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQlpZiAoZXZ0LT53aGF0ID09IEVWVF9LRVlSRVBFQVQpCi0JICAgIEVWVC5vbGRLZXkgPSAtMTsKLQlpZiAoZXZ0LT53aGF0ID09IEVWVF9KT1lNT1ZFKQotCSAgICBFVlQub2xkSm95TW92ZSA9IC0xOwotCV9FVlRfcmVzdG9yZUludChwcyk7ICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBpbnRlcnJ1cHRzICAgICAgICAqLwotCWlmIChldnQtPndoYXQgJiBFVlRfS0VZRVZUKQotCSAgICBfRVZUX21hc2tLZXlDb2RlKGV2dCk7Ci0JfQotCi0gICAgLyogSWYgdGhlcmUgaXMgbm8gZXZlbnQgcGVuZGluZywgY2hlY2sgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGFuIGF1dG8KLSAgICAgKiBtb3VzZSBkb3duIGV2ZW50IGlmIHRoZSBtb3VzZSBpcyBzdGlsbCBjdXJyZW50bHkgZG93bi4KLSAgICAgKi8KLSAgICBpZiAoZXZ0LT53aGF0ID09IEVWVF9OVUxMRVZUICYmIEVWVC5hdXRvUmVwZWF0ICYmIChtYXNrICYgRVZUX01PVVNFQVVUTykgJiYgKEVWVC5kb3duTW91c2Uud2hhdCAmIEVWVF9NT1VTRURPV04pKSB7Ci0JdWxvbmcgdGlja3MgPSBfRVZUX2dldFRpY2tzKCk7Ci0JaWYgKCh0aWNrcyAtIEVWVC5hdXRvVGlja3MpID49IChFVlQuYXV0b1JlcGVhdCArIChFVlQuZmlyc3RBdXRvID8gRVZULmF1dG9EZWxheSA6IDApKSkgewotCSAgICBldnQtPndoYXQgPSBFVlRfTU9VU0VBVVRPOwotCSAgICBldnQtPm1lc3NhZ2UgPSBFVlQuZG93bk1vdXNlLm1lc3NhZ2U7Ci0JICAgIGV2dC0+bW9kaWZpZXJzID0gRVZULmRvd25Nb3VzZS5tb2RpZmllcnM7Ci0JICAgIGV2dC0+d2hlcmVfeCA9IEVWVC5hdXRvTW91c2VfeDsKLQkgICAgZXZ0LT53aGVyZV95ID0gRVZULmF1dG9Nb3VzZV95OwotCSAgICBldnQtPnJlbGF0aXZlX3ggPSAwOwotCSAgICBldnQtPnJlbGF0aXZlX3kgPSAwOwotCSAgICBFVlQuYXV0b1RpY2tzID0gZXZ0LT53aGVuID0gdGlja3M7Ci0JICAgIEVWVC5maXJzdEF1dG8gPSBmYWxzZTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gZXZ0LT53aGF0ICE9IEVWVF9OVUxMRVZUOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1JbnN0YWxscyBhIHVzZXIgc3VwcGxpZWQgZXZlbnQgZmlsdGVyIGNhbGxiYWNrIGZvciBldmVudCBoYW5kbGluZy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1QQVJBTUVURVJTOgotdXNlckV2ZW50RmlsdGVyIC0gQWRkcmVzcyBvZiB1c2VyIHN1cHBsaWVkIGV2ZW50IGZpbHRlciBjYWxsYmFjawotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgdG8gaW5zdGFsbCBhbiBldmVudCBmaWx0ZXIKLWNhbGxiYWNrIGZvciBldmVudCBoYW5kbGluZy4gT25jZSB5b3UgaW5zdGFsbCB5b3VyIGNhbGxiYWNrLCB0aGUgTUdMCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcyB3aWxsIGNhbGwgeW91ciBjYWxsYmFjayB3aXRoIGEgcG9pbnRlciB0byB0aGUKLW5ldyBldmVudCB0aGF0IHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIGV2ZW50IHF1ZXVlLiBZb3VyIGNhbGxiYWNrIGNhbiB0aGUKLW1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhlIGV2ZW50IGJlZm9yZSBpdCBpcyBwbGFjZWQgaW50byB0aGUgcXVldWUgKGZvcgotaW5zdGFuY2UgYWRkaW5nIGN1c3RvbSBpbmZvcm1hdGlvbiBvciBwZXJoYXBzIGhpZ2ggcHJlY2lzaW9uIHRpbWluZwotaW5mb3JtYXRpb24pLgotCi1JZiB5b3VyIGNhbGxiYWNrIHJldHVybnMgRkFMU0UsIHRoZSBldmVudCB3aWxsIGJlIGlnbm9yZSBhbmQgd2lsbCBub3QgYmUKLXBvc3RlZCB0byB0aGUgZXZlbnQgcXVldWUuIFlvdSBzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlIGZyb20geW91ciBldmVudAotY2FsbGJhY2sgdW5sZXNzIHlvdSBwbGFuIHRvIHVzZSB0aGUgZXZlbnRzIGltbWVkaWF0ZWx5IHRoYXQgdGhleSBhcmUKLXJlY2lldmVkLgotCi1Ob3RlOiAgIFlvdXIgZXZlbnQgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZCBpbiByZXNwb25zZSB0byBhIGhhcmR3YXJlCi0JaW50ZXJydXB0IGFuZCB3aWxsIGJlIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZiB0aGUgaGFyZHdhcmUKLQlpbnRlcnJ1cHQgaGFuZGxlciB1bmRlciBNU0RPUyAoaWU6IGtleWJvYXJkIGludGVycnVwdCBvciBtb3VzZQotCWludGVycnVwdCkuIEZvciB0aGlzIHJlYXNvbiB0aGUgY29kZSBwYWdlcyBmb3IgdGhlIGNhbGxiYWNrIHRoYXQKLQl5b3UgcmVnaXN0ZXIgbXVzdCBiZSBsb2NrZWQgaW4gbWVtb3J5IHdpdGggdGhlIFBNX2xvY2tDb2RlUGFnZXMKLQlmdW5jdGlvbi4gWW91IG11c3QgYWxzbyBsb2NrIGRvd24gYW55IGRhdGEgcGFnZXMgdGhhdCB5b3VyIGZ1bmN0aW9uCi0JbmVlZHMgdG8gcmVmZXJlbmNlIGFzIHdlbGwuCi0KLU5vdGU6ICAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGZpbHRlciBjYWxsYmFjayB0byBwcm9jZXNzIGV2ZW50cyBhdCB0aGUKLQl0aW1lIHRoZXkgYXJlIGFjdGl2YXRlZCBieSB0aGUgdXNlciAoaWU6IHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUKLQlrZXkgb3IgbW92ZXMgdGhlIG1vdXNlKSwgYnV0IG1ha2Ugc3VyZSB5b3VyIGNvZGUgcnVucyBhcyBmYXN0IGFzCi0JcG9zc2libGUgYXMgaXQgd2lsbCBiZSBleGVjdXRpbmcgaW5zaWRlIHRoZSBjb250ZXh0IG9mIGFuIGludGVycnVwdAotCWhhbmRsZXIgb24gc29tZSBzeXN0ZW1zLgotCi1TRUUgQUxTTzoKLUVWVF9nZXROZXh0LCBFVlRfcGVla05leHQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0VXNlckV2ZW50RmlsdGVyKAotICAgIF9FVlRfdXNlckV2ZW50RmlsdGVyIGZpbHRlcikKLXsKLSAgICBFVlQudXNlckV2ZW50Q2FsbGJhY2sgPSBmaWx0ZXI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUluc3RhbGxzIGEgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sgZnVuY3Rpb24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUEFSQU1FVEVSUzoKLWNhbGxiYWNrICAgIC0gQWRkcmVzcyBvZiB1c2VyIHN1cHBsaWVkIGV2ZW50IGhlYXJ0YmVhdCBjYWxsYmFjawotcGFyYW1zICAgICAgLSBQYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGhlYXJ0YmVhdCBmdW5jdGlvbgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgdG8gaW5zdGFsbCBhbiBldmVudCBoZWF0YmVhdAotZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHRoYXQgRVZUX2dldE5leHQgb3IgRVZUX3BlZWtOZXh0Ci1pcyBjYWxsZWQuIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc2ltdWxhdGluZyB0ZXh0IG1vZGUgY3Vyc29ycyBpbnNpZGUKLWV2ZW50IGhhbmRsaW5nIGNvZGUgd2hlbiBydW5uaW5nIGluIGdyYXBoaWNzIG1vZGVzIGFzIG9wcG9zZWQgdG8gaGFyZHdhcmUKLXRleHQgbW9kZXMuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9wZWVrTmV4dCwgRVZUX2dldEhlYXJ0QmVhdENhbGxiYWNrCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldEhlYXJ0QmVhdENhbGxiYWNrKAotICAgIF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgdm9pZCAqcGFyYW1zKQotewotICAgIEVWVC5oZWFydEJlYXQgPSBjYWxsYmFjazsKLSAgICBFVlQuaGVhcnRCZWF0UGFyYW1zID0gcGFyYW1zOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sgZnVuY3Rpb24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUEFSQU1FVEVSUzoKLWNhbGxiYWNrICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sKLXBhcmFtcyAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgZXZlbnQgaGVhcnRiZWF0IGZ1bmN0aW9uCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY3VycmVudCBldmVudCBoZWF0YmVhdCBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkCi1ldmVyeSB0aW1lIHRoYXQgRVZUX2dldE5leHQgb3IgRVZUX3BlZWtOZXh0IGlzIGNhbGxlZC4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0LCBFVlRfc2V0SGVhcnRCZWF0Q2FsbGJhY2sKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfZ2V0SGVhcnRCZWF0Q2FsbGJhY2soCi0gICAgX0VWVF9oZWFydEJlYXRDYWxsYmFjayAqY2FsbGJhY2ssCi0gICAgdm9pZCAqKnBhcmFtcykKLXsKLSAgICAqY2FsbGJhY2sgPSBFVlQuaGVhcnRCZWF0OwotICAgICpwYXJhbXMgPSBFVlQuaGVhcnRCZWF0UGFyYW1zOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1EZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93bi4KLQotUEFSQU1FVEVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKLQotUkVUVVJOUzoKLVRydWUgb2YgdGhlIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGhlbGQgZG93bi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLiBZb3Ugc2ltcGx5IG5lZWQgdG8gcGFzcyBpbiB0aGUgc2NhbiBjb2RlIG9mCi10aGUga2V5IHRoYXQgeW91IHdpc2ggdG8gdGVzdCwgYW5kIHRoZSBNR0wgd2lsbCB0ZWxsIHlvdSBpZiBpdCBpcyBjdXJyZW50bHkKLWRvd24gb3Igbm90LiBUaGUgTUdMIGRvZXMgdGhpcyBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZSB1cCBhbmQgZG93biBzdGF0ZQotb2YgYWxsIHRoZSBrZXlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIEVWVEFQSSBFVlRfaXNLZXlEb3duKAotICAgIHVjaGFyIHNjYW5Db2RlKQotewotICAgIHJldHVybiBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVNldCB0aGUgbW91c2UgcG9zaXRpb24gZm9yIHRoZSBldmVudCBtb2R1bGUKLQotUEFSQU1FVEVSUzoKLXggICAtIFggY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gdG8KLXkgICAtIFkgY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gdG8KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBtb3ZlcyB0aGUgbW91c2UgY3Vyc29yIHBvc2l0aW9uIGZvciB0aGUgZXZlbnQgbW9kdWxlIHRvIHRoZQotc3BlY2lmaWVkIGxvY2F0aW9uLgotCi1TRUUgQUxTTzoKLUVWVF9nZXRNb3VzZVBvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVBvcygKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLSAgICBFVlQubXggPSB4OwotICAgIEVWVC5teSA9IHk7Ci0gICAgX0VWVF9zZXRNb3VzZVBvcygmRVZULm14LCZFVlQubXkpOwotICAgIEVWVC5tb3VzZU1vdmUoRVZULm14LEVWVC5teSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgbW91c2UgY3Vyc29yIGxvY2F0aW9uLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci14ICAgLSBQbGFjZSB0byBzdG9yZSB2YWx1ZSBmb3IgbW91c2UgeCBjb29yZGluYXRlIChzY3JlZW4gY29vcmRpbmF0ZXMpCi15ICAgLSBQbGFjZSB0byBzdG9yZSB2YWx1ZSBmb3IgbW91c2UgeSBjb29yZGluYXRlIChzY3JlZW4gY29vcmRpbmF0ZXMpCi0KLVJFTUFSS1M6Ci1PYnRhaW5zIHRoZSBjdXJyZW50IG1vdXNlIGN1cnNvciBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuIE5vcm1hbGx5IHRoZQotbW91c2UgY3Vyc29yIGxvY2F0aW9uIGlzIHRyYWNrZWQgdXNpbmcgdGhlIG1vdXNlIG1vdmVtZW50IGV2ZW50cyB0aGF0IGFyZQotcG9zdGVkIHRvIHRoZSBldmVudCBxdWV1ZSB3aGVuIHRoZSBtb3VzZSBtb3ZlcywgaG93ZXZlciB0aGlzIHJvdXRpbmUKLXByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIG1ldGhvZCBvZiBwb2xsaW5nIHRoZSBtb3VzZSBjdXJzb3IgbG9jYXRpb24uCi0KLVNFRSBBTFNPOgotRVZUX3NldE1vdXNlUG9zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2dldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgKnggPSBFVlQubXg7Ci0gICAgKnkgPSBFVlQubXk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlIGZvciB0cmFuc2xhdGlvbiBvZiBrZXlib2FyZCBjaGFyYWN0ZXJzLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvZGUgcGFnZSB0cmFuc2xhdGlvbiB0YWJsZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlCi10cmFuc2xhdGlvbiB0YWJsZS4gU2VlIEVWVF9zZXRDb2RlUGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotU0VFIEFMU086Ci1FVlRfc2V0Q29kZVBhZ2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb2RlcGFnZV90ICogRVZUQVBJIEVWVF9nZXRDb2RlUGFnZSh2b2lkKQotewotICAgIHJldHVybiBFVlQuY29kZVBhZ2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlIGZvciB0cmFuc2xhdGlvbiBvZiBrZXlib2FyZCBjaGFyYWN0ZXJzLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1wYWdlICAgIC0gTmV3IGNvZGUgcGFnZSB0byBtYWtlIGFjdGl2ZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBhIG5ldyBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUgdGhhdCBpcyB1c2VkCi10byB0cmFuc2xhdGUgdmlydHVhbCBzY2FuIGNvZGUgdmFsdWVzIHRvIEFTQ0lJIGNoYXJhY3RlcnMgZm9yIGRpZmZlcmVudAota2V5Ym9hcmQgY29uZmlndXJhdGlvbnMuIFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgVVMgRW5nbGlzaCwgYWx0aG91Z2ggaWYKLXBvc3NpYmxlIHRoZSBQTSBsaWJyYXJ5IHdpbGwgYXV0by1kZXRlY3QgdGhlIGNvcnJlY3QgY29kZSBwYWdlIHRyYW5zbGF0aW9uCi1mb3IgdGhlIHRhcmdldCBPUyBpZiBPUyBzZXJ2aWNlcyBhcmUgYXZhaWxhYmxlIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YKLWtleWJvYXJkIGlzIGN1cnJlbnRseSBhdHRhY2hlZC4KLQotU0VFIEFMU086Ci1FVlRfZ2V0Q29kZVBhZ2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0Q29kZVBhZ2UoCi0gICAgY29kZXBhZ2VfdCAqcGFnZSkKLXsKLSAgICBFVlQuY29kZVBhZ2UgPSBwYWdlOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnRhaW5zIGZha2UgQyBwcm90b3R5cGVzIGFuZCBkb2N1bWVudGF0aW9uIGZvciB0aGUKLSAqIG1hY3JvIGZ1bmN0aW9ucyBpbiB0aGUgZXZlbnQuaCBoZWFkZXIgZmlsZS4gVGhlc2UgZXhpc3Qgc29sZXkgc28KLSAqIHRoYXQgRG9jSmV0IHdpbGwgY29ycmVjdGx5IHB1bGwgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIGZ1bmN0aW9ucy4KLSAqLwotI2lmZGVmICBJTkNMVURFX0RPQ19GVU5DVElPTlMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUgQVNDSUkgY29kZSBmcm9tIGEgbWVzc2FnZS4KLQotUEFSQU1FVEVSUzoKLW1lc3NhZ2UgLSBNZXNzYWdlIHRvIGV4dHJhY3QgQVNDSUkgY29kZSBmcm9tCi0KLVJFVFVSTlM6Ci1BU0NJSSBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBtZXNzYWdlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1NYWNybyB0byBleHRyYWN0IHRoZSBBU0NJSSBjb2RlIGZyb20gdGhlIG1lc3NhZ2UgZmllbGQgb2YgdGhlIGV2ZW50X3QKLXN0cnVjdHVyZS4gWW91IHBhc3MgdGhlIG1lc3NhZ2UgZmllbGQgdG8gdGhlIG1hY3JvIGFzIHRoZSBwYXJhbWV0ZXIgYW5kCi10aGUgQVNDSUkgY29kZSBpcyB0aGUgcmVzdWx0LCBmb3IgZXhhbXBsZToKLQotICAgIGV2ZW50X3QgRVZULm15RXZlbnQ7Ci0gICAgdWNoYXIgICBjb2RlOwotICAgIGNvZGUgPSBFVlRfYXNjaWlDb2RlKEVWVC5teUV2ZW50Lm1lc3NhZ2UpOwotCi1TRUUgQUxTTzoKLUVWVF9zY2FuQ29kZSwgRVZUX3JlcGVhdENvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWNoYXIgRVZUX2FzY2lpQ29kZSgKLSAgICB1bG9uZyBtZXNzYWdlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUga2V5Ym9hcmQgc2NhbiBjb2RlIGZyb20gYSBtZXNzYWdlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1tZXNzYWdlIC0gTWVzc2FnZSB0byBleHRyYWN0IHNjYW4gY29kZSBmcm9tCi0KLVJFVFVSTlM6Ci1LZXlib2FyZCBzY2FuIGNvZGUgZXh0cmFjdGVkIGZyb20gdGhlIG1lc3NhZ2UuCi0KLVJFTUFSS1M6Ci1NYWNybyB0byBleHRyYWN0IHRoZSBrZXlib2FyZCBzY2FuIGNvZGUgZnJvbSB0aGUgbWVzc2FnZSBmaWVsZCBvZiB0aGUgZXZlbnQKLXN0cnVjdHVyZS4gWW91IHBhc3MgdGhlIG1lc3NhZ2UgZmllbGQgdG8gdGhlIG1hY3JvIGFzIHRoZSBwYXJhbWV0ZXIgYW5kCi10aGUgc2NhbiBjb2RlIGlzIHRoZSByZXN1bHQsIGZvciBleGFtcGxlOgotCi0gICAgZXZlbnRfdCBFVlQubXlFdmVudDsKLSAgICB1Y2hhciAgIGNvZGU7Ci0gICAgY29kZSA9IEVWVF9zY2FuQ29kZShFVlQubXlFdmVudC5tZXNzYWdlKTsKLQotTk9URTogICBTY2FuIGNvZGVzIGluIHRoZSBldmVudCBsaWJyYXJ5IGFyZSBub3QgcmVhbGx5IGhhcmR3YXJlIHNjYW4gY29kZXMsCi0JYnV0IHJhdGhlciB2aXJ0dWFsIHNjYW4gY29kZXMgYXMgZ2VuZXJhdGVkIGJ5IGEgbG93IGxldmVsIGtleWJvYXJkCi0JaW50ZXJmYWNlIGRyaXZlci4gQWxsIHZpcnR1YWwgc2NhbiBjb2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBieSB0aGUKLQlFVlRfc2NhbkNvZGVzVHlwZSBlbnVtZXJhdGlvbiwgYW5kIHdpbGwgYmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwKLQlzdXBwb3J0cyBPUydlcyBhbmQgcGxhdGZvcm1zLgotCi1TRUUgQUxTTzoKLUVWVF9hc2NpaUNvZGUsIEVWVF9yZXBlYXRDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVjaGFyIEVWVF9zY2FuQ29kZSgKLSAgICB1bG9uZyBtZXNzYWdlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUgcmVwZWF0IGNvdW50IGZyb20gYSBtZXNzYWdlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1tZXNzYWdlIC0gTWVzc2FnZSB0byBleHRyYWN0IHJlcGVhdCBjb3VudCBmcm9tCi0KLVJFVFVSTlM6Ci1SZXBlYXQgY291bnQgZXh0cmFjdGVkIGZyb20gdGhlIG1lc3NhZ2UuCi0KLVJFTUFSS1M6Ci1NYWNybyB0byBleHRyYWN0IHRoZSByZXBlYXQgY291bnQgZnJvbSB0aGUgbWVzc2FnZSBmaWVsZCBvZiB0aGUgZXZlbnQKLXN0cnVjdHVyZS4gVGhlIHJlcGVhdCBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGtleSByZXBlYXRlZAotYmVmb3JlIHRoZXJlIHdhcyBhbm90aGVyIGtleWJvYXJkIGV2ZW50IHRvIGJlIHBsYWNlIGluIHRoZSBxdWV1ZSwgYW5kCi1hbGxvd3MgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUgdG8gYXZvaWQga2V5Ym9hcmQgYnVmZmVyIG92ZXJmbG93Ci1jb25kaXRpb25zIHdoZW4gYSBzaW5nbGUga2V5IGlzIGhlbGQgZG93biBieSB0aGUgdXNlci4gSWYgeW91IGFyZSBwcm9jZXNzaW5nCi1hIGtleSByZXBlYXQgY29kZSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byBjaGVjayB0aGlzIGZpZWxkIHRvIHNlZSBob3cKLW1hbnkga2V5IHJlcGVhdHMgeW91IHNob3VsZCBwcm9jZXNzIGZvciB0aGlzIG1lc3NhZ2UuCi0KLVNFRSBBTFNPOgotRVZUX2FzY2lpQ29kZSwgRVZUX3JlcGVhdENvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc2hvcnQgRVZUX3JlcGVhdENvdW50KAotICAgIHVsb25nIG1lc3NhZ2UpOwotCi0jZW5kaWYgIC8qIERPQyBGVU5DVElPTlMgKi8KLQotI2lmIGRlZmluZWQoX19SRUFMRE9TX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQotLyoge3NlY3JldH0gKi8KLXZvaWQgRVZUQVBJIF9FVlRfY0NvZGVFbmQodm9pZCkge30KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhkMjEwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgTGludXggc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHp0aW1lci5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRPRE86IFdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmb3IgTGludXghCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVE9ETzogV2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGZvciBMaW51eCEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICBmcmVxLT5sb3cgPSAxMDAwMDAwOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0dGltZW9mZGF5KCZ0dixOVUxMKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5sb3cgPSB0di50dl9zZWMqMTAwMDAwMCArIHR2LnR2X3VzZWM7ICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzODczMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBMaW51eCBmdWxsc2NyZWVuIGNvbnNvbGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgY3Jvc3MgcGxhdGZvcm0gZXZlbnQgbGlicmFyeS4KLSogICAgICAgICAgICAgICBQb3J0aW9ucyByaXBwZWQgc3RyYWlndGggZnJvbSB0aGUgZ3BtIHNvdXJjZSBjb2RlIGZvciBtb3VzZQotKiAgICAgICAgICAgICAgIGhhbmRsaW5nLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZXh0ZXJuIGludCAgICAgICAgICAgICAgX1BNX2NvbnNvbGVfZmQ7Ci1zdGF0aWMgdXNob3J0ICAgICAgICAgICBrZXlVcE1zZ1syNTZdID0gezB9Owotc3RhdGljIGludCAgICAgICAgICAgICAgX0VWVF9tb3VzZV9mZCA9IDA7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICByYW5nZV94LCByYW5nZV95Owotc3RhdGljIGludCAgICAgICAgICAgICAgb3B0X2JhdWQgPSAxMjAwLCBvcHRfc2FtcGxlID0gMTAwOwotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotc3RhdGljIHNob3J0ICAgICAgICAgICAgKmF4aXMwID0gTlVMTCwgKmF4aXMxID0gTlVMTDsKLXN0YXRpYyB1Y2hhciAgICAgICAgICAgICpidXRzMCA9IE5VTEwsICpidXRzMSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBqb3lzdGljazBfZmQgPSAwLCBqb3lzdGljazFfZmQgPSAwOwotc3RhdGljIGludCAgICAgICAgICAgICAganNfdmVyc2lvbiA9IDA7Ci0jZW5kaWYKLQotLyogVGhpcyBkZWZpbmVzIHRoZSBzdXBwb3J0ZWQgbW91c2UgZHJpdmVycyAqLwotCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9ub01vdXNlID0gLTEsCi0gICAgRVZUX21pY3Jvc29mdCA9IDAsCi0gICAgRVZUX3BzMiwKLSAgICBFVlRfbW91c2VzeXN0ZW1zLAotICAgIEVWVF9ncG0sCi0gICAgRVZUX01Nc2VyaWVzLAotICAgIEVWVF9sb2dpdGVjaCwKLSAgICBFVlRfYnVzbW91c2UsCi0gICAgRVZUX21vdXNlbWFuLAotICAgIEVWVF9pbnRlbGxpbW91c2UsCi0gICAgRVZUX2ludGVsbGltb3VzZV9wczIsCi0gICAgfSBtb3VzZV9kcml2ZXJzX3Q7Ci0KLXN0YXRpYyBtb3VzZV9kcml2ZXJzX3QgbW91c2VfZHJpdmVyID0gRVZUX25vTW91c2U7Ci1zdGF0aWMgY2hhciBtb3VzZV9kZXZbMjBdID0gIi9kZXYvbW91c2UiOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAgICAqbmFtZTsKLSAgICBpbnQgICAgIGZsYWdzOwotICAgIHZvaWQgICAgKCppbml0KSh2b2lkKTsKLSAgICB1Y2hhciAgIHByb3RvWzRdOwotICAgIGludCAgICAgcGFja2V0X2xlbjsKLSAgICBpbnQgICAgIHJlYWQ7Ci0gICAgfSBtb3VzZV9pbmZvOwotCi0jZGVmaW5lIFNURF9GTEcgKENSRUFEIHwgQ0xPQ0FMIHwgSFVQQ0wpCi0KLXN0YXRpYyB2b2lkIF9FVlRfbW91c2VfaW5pdCh2b2lkKTsKLXN0YXRpYyB2b2lkIF9FVlRfbG9naXRlY2hfaW5pdCh2b2lkKTsKLXN0YXRpYyB2b2lkIF9FVlRfcG5wbW91c2VfaW5pdCh2b2lkKTsKLQotbW91c2VfaW5mbyBtb3VzZV9pbmZvc1tdID0gewotICAgIHsiTWljcm9zb2Z0IiwgICAgICAgQ1M3IHwgQjEyMDAgfCBTVERfRkxHLCAgICAgICAgICAgICAgX0VWVF9tb3VzZV9pbml0LCAgICB7MHg0MCwgMHg0MCwgMHg0MCwgMHgwMH0sIDMsIDF9LAotICAgIHsiUFMyIiwgICAgICAgICAgICAgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICB7MHhjMCwgMHgwMCwgMHgwMCwgMHgwMH0sIDMsIDF9LAotICAgIHsiTW91c2VTeXN0ZW1zIiwgICAgQ1M4IHwgQ1NUT1BCIHwgU1REX0ZMRywgICAgICAgICAgICAgX0VWVF9tb3VzZV9pbml0LCAgICB7MHhmOCwgMHg4MCwgMHgwMCwgMHgwMH0sIDUsIDV9LAotICAgIHsiR1BNIiwgICAgICAgICAgICAgQ1M4IHwgQ1NUT1BCIHwgU1REX0ZMRywgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICB7MHhmOCwgMHg4MCwgMHgwMCwgMHgwMH0sIDUsIDV9LAotICAgIHsiTU1TZXJpZXMiLCAgICAgICAgQ1M4IHwgUEFSRU5CIHwgUEFST0REIHwgU1REX0ZMRywgICAgX0VWVF9tb3VzZV9pbml0LCAgICB7MHhlMCwgMHg4MCwgMHg4MCwgMHgwMH0sIDMsIDF9LAotICAgIHsiTG9naXRlY2giLCAgICAgICAgQ1M4IHwgQ1NUT1BCIHwgU1REX0ZMRywgICAgICAgICAgICAgX0VWVF9sb2dpdGVjaF9pbml0LCB7MHhlMCwgMHg4MCwgMHg4MCwgMHgwMH0sIDMsIDN9LAotICAgIHsiQnVzTW91c2UiLCAgICAgICAgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICB7MHhmOCwgMHg4MCwgMHgwMCwgMHgwMH0sIDMsIDN9LAotICAgIHsiTW91c2VNYW4iLCAgICAgICAgQ1M3IHwgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgX0VWVF9tb3VzZV9pbml0LCAgICB7MHg0MCwgMHg0MCwgMHg0MCwgMHgwMH0sIDMsIDF9LAotICAgIHsiSW50ZWxsaU1vdXNlIiwgICAgQ1M3IHwgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgX0VWVF9wbnBtb3VzZV9pbml0LCB7MHhjMCwgMHg0MCwgMHhjMCwgMHgwMH0sIDQsIDF9LAotICAgIHsiSU1QUzIiLCAgICAgICAgICAgQ1M3IHwgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICB7MHhjMCwgMHg0MCwgMHhjMCwgMHgwMH0sIDQsIDF9LCAvKiA/ICovCi0gICAgfTsKLQotI2RlZmluZSBOQl9NSUNFIChzaXplb2YobW91c2VfaW5mb3MpL3NpemVvZihtb3VzZV9pbmZvKSkKLQotLyogVGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdHMgYWJvdmUgKi8KLQotI2RlZmluZSBFTlZfTU9VU0VEUlYgIk1HTF9NT1VTRURSViIKLSNkZWZpbmUgRU5WX01PVVNFREVWICJNR0xfTU9VU0VERVYiCi0jZGVmaW5lIEVOVl9NT1VTRVNQRCAiTUdMX01PVVNFU1BEIgotI2RlZmluZSBFTlZfSk9ZREVWMCAgIk1HTF9KT1lERVYxIgotI2RlZmluZSBFTlZfSk9ZREVWMSAgIk1HTF9KT1lERVYyIgotCi0vKiBTY2FuY29kZSBtYXBwaW5ncyBvbiBMaW51eCBmb3Igc3BlY2lhbCBrZXlzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgc2NhbjsKLSAgICBpbnQgbWFwOwotICAgIH0ga2V5bWFwOwotCi0vKiBUT0RPOiBGaXggdGhpcyBhbmQgc2V0IGl0IHVwIHNvIHdlIGNhbiBkbyBhIGJpbmFyeSBzZWFyY2ghICovCi0KLWtleW1hcCBrZXltYXBzW10gPSB7Ci0gICAgezk2LCBLQl9wYWRFbnRlcn0sCi0gICAgezc0LCBLQl9wYWRNaW51c30sCi0gICAgezc4LCBLQl9wYWRQbHVzfSwKLSAgICB7NTUsIEtCX3BhZFRpbWVzfSwKLSAgICB7OTgsIEtCX3BhZERpdmlkZX0sCi0gICAgezcxLCBLQl9wYWRIb21lfSwKLSAgICB7NzIsIEtCX3BhZFVwfSwKLSAgICB7NzMsIEtCX3BhZFBhZ2VVcH0sCi0gICAgezc1LCBLQl9wYWRMZWZ0fSwKLSAgICB7NzYsIEtCX3BhZENlbnRlcn0sCi0gICAgezc3LCBLQl9wYWRSaWdodH0sCi0gICAgezc5LCBLQl9wYWRFbmR9LAotICAgIHs4MCwgS0JfcGFkRG93bn0sCi0gICAgezgxLCBLQl9wYWRQYWdlRG93bn0sCi0gICAgezgyLCBLQl9wYWRJbnNlcnR9LAotICAgIHs4MywgS0JfcGFkRGVsZXRlfSwKLSAgICB7MTA1LEtCX2xlZnR9LAotICAgIHsxMDgsS0JfZG93bn0sCi0gICAgezEwNixLQl9yaWdodH0sCi0gICAgezEwMyxLQl91cH0sCi0gICAgezExMCxLQl9pbnNlcnR9LAotICAgIHsxMDIsS0JfaG9tZX0sCi0gICAgezEwNCxLQl9wYWdlVXB9LAotICAgIHsxMTEsS0JfZGVsZXRlfSwKLSAgICB7MTA3LEtCX2VuZH0sCi0gICAgezEwOSxLQl9wYWdlRG93bn0sCi0gICAgezEyNSxLQl9sZWZ0V2luZG93c30sCi0gICAgezEyNixLQl9yaWdodFdpbmRvd3N9LAotICAgIHsxMjcsS0JfbWVudX0sCi0gICAgezEwMCxLQl9yaWdodEFsdH0sCi0gICAgezk3LEtCX3JpZ2h0Q3RybH0sCi0gICAgfTsKLQotLyogQW5kIHRoZSBrZXlwYWQgd2l0aCBudW0gbG9jayB0dXJuZWQgb24gKGNoYW5nZXMgdGhlIEFTQ0lJIGNvZGUgb25seSkgKi8KLQota2V5bWFwIGtleXBhZFtdID0gewotICAgIHs3MSwgQVNDSUlfN30sCi0gICAgezcyLCBBU0NJSV84fSwKLSAgICB7NzMsIEFTQ0lJXzl9LAotICAgIHs3NSwgQVNDSUlfNH0sCi0gICAgezc2LCBBU0NJSV81fSwKLSAgICB7NzcsIEFTQ0lJXzZ9LAotICAgIHs3OSwgQVNDSUlfMX0sCi0gICAgezgwLCBBU0NJSV8yfSwKLSAgICB7ODEsIEFTQ0lJXzN9LAotICAgIHs4MiwgQVNDSUlfMH0sCi0gICAgezgzLCBBU0NJSV9wZXJpb2R9LAotICAgIH07Ci0KLSNkZWZpbmUgTkJfS0VZTUFQUyAoc2l6ZW9mKGtleW1hcHMpL3NpemVvZihrZXltYXBzWzBdKSkKLSNkZWZpbmUgTkJfS0VZUEFEIChzaXplb2Yoa2V5cGFkKS9zaXplb2Yoa2V5cGFkWzBdKSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgc2FtcGxlOwotICAgIGNoYXIgICAgY29kZVsyXTsKLSAgICB9IHNhbXBsZV9yYXRlOwotCi1zYW1wbGVfcmF0ZSBzYW1wbGV0YWJbXT17Ci0gICAgeyAgMCwiTyJ9LAotICAgIHsgMTUsIkoifSwKLSAgICB7IDI3LCJLIn0sCi0gICAgeyA0MiwiTCJ9LAotICAgIHsgNjAsIlIifSwKLSAgICB7IDg1LCJNIn0sCi0gICAgezEyNSwiUSJ9LAotICAgIHsxRTksIk4ifSwKLSAgICB9OwotCi0vKiBOdW1iZXIgb2Yga2V5Y29kZXMgdG8gcmVhZCBhdCBhIHRpbWUgZnJvbSB0aGUgY29uc29sZSAqLwotCi0jZGVmaW5lIEtCRFJFQURCVUZGRVJTSVpFIDMyCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBMaW51eCAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFwcykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIHN0YXRpYyB1aW50ICAgICBzdGFydHRpbWUgPSAwOwotICAgIHN0cnVjdCB0aW1ldmFsICB0OwotCi0gICAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKLSAgICBpZiAoc3RhcnR0aW1lID09IDApCi0gICAgICBzdGFydHRpbWUgPSB0LnR2X3NlYyAqIDEwMDAgKyAodC50dl91c2VjLzEwMDApOwotICAgIHJldHVybiAoKHQudHZfc2VjICogMTAwMCArICh0LnR2X3VzZWMvMTAwMCkpIC0gc3RhcnR0aW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TbWFsbCBVbml4IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBhdmFpbGFiaWxpdHkgb24gYSBmaWxlIHVzaW5nIHNlbGVjdCgpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIGRhdGFSZWFkeSgKLSAgICBpbnQgZmQpCi17Ci0gICAgc3RhdGljIHN0cnVjdCB0aW1ldmFsICAgdCA9IHsgMEwsIDBMIH07Ci0gICAgZmRfc2V0ICAgICAgICAgICAgICAgICAgZmRzOwotCi0gICAgRkRfWkVSTygmZmRzKTsKLSAgICBGRF9TRVQoZmQsICZmZHMpOwotICAgIHJldHVybiBzZWxlY3QoZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnQpID4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkcyBtb3VzZSBkYXRhIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgbW91c2UgZHJpdmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCByZWFkTW91c2VEYXRhKAotICAgIGludCAqYnV0dG9ucywKLSAgICBpbnQgKmR4LAotICAgIGludCAqZHkpCi17Ci0gICAgc3RhdGljIHVjaGFyICAgIGRhdGFbMzJdLHByZXYgPSAwOwotICAgIGludCAgICAgICAgICAgICBjbnQgPSAwLHJldDsKLSAgICBtb3VzZV9pbmZvICAgICAgKmRydjsKLQotICAgIC8qIFJlYWQgdGhlIGZpcnN0IGJ5dGUgdG8gY2hlY2sgZm9yIHRoZSBwcm90b2NvbCAqLwotICAgIGRydiA9ICZtb3VzZV9pbmZvc1ttb3VzZV9kcml2ZXJdOwotICAgIGlmIChyZWFkKF9FVlRfbW91c2VfZmQsIGRhdGEsIGRydi0+cmVhZCkgIT0gZHJ2LT5yZWFkKSB7Ci0JcGVycm9yKCJyZWFkIik7Ci0JcmV0dXJuIGZhbHNlOwotCX0KLSAgICBpZiAoKGRhdGFbMF0gJiBkcnYtPnByb3RvWzBdKSAhPSBkcnYtPnByb3RvWzFdKQotCXJldHVybiBmYWxzZTsKLQotICAgIC8qIExvYWQgYSB3aG9sZSBwcm90b2NvbCBwYWNrZXQgKi8KLSAgICBjbnQgKz0gZHJ2LT5yZWFkOwotICAgIHdoaWxlIChjbnQgPCBkcnYtPnBhY2tldF9sZW4pIHsKLQlyZXQgPSByZWFkKF9FVlRfbW91c2VfZmQsIGRhdGErY250LCBkcnYtPnJlYWQpOwotCWlmIChyZXQgPT0gZHJ2LT5yZWFkKQotCSAgICBjbnQgKz0gcmV0OwotCWVsc2UgewotCSAgICBwZXJyb3IoInJlYWQiKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIGlmICgoZGF0YVsxXSAmIGRydi0+cHJvdG9bMl0pICE9IGRydi0+cHJvdG9bM10pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogTm93IGRlY29kZSB0aGUgcHJvdG9jb2wgcGFja2V0ICovCi0gICAgc3dpdGNoIChtb3VzZV9kcml2ZXIpIHsKLQljYXNlIEVWVF9taWNyb3NvZnQ6Ci0JICAgIGlmIChkYXRhWzBdID09IDB4NDAgJiYgIShwcmV2fGRhdGFbMV18ZGF0YVsyXSkpCi0JCSpidXR0b25zID0gMjsgICAvKiBUaGlyZCBidXR0b24gb24gTVMgY29tcGF0aWJsZSBtb3VzZSAqLwotCSAgICBlbHNlCi0JCSpidXR0b25zPSAoKGRhdGFbMF0gJiAweDIwKSA+PiAzKSB8ICgoZGF0YVswXSAmIDB4MTApID4+IDQpOwotCSAgICBwcmV2ID0gKmJ1dHRvbnM7Ci0JICAgICpkeCA9IChjaGFyKSgoKGRhdGFbMF0gJiAweDAzKSA8PCA2KSB8IChkYXRhWzFdICYgMHgzRikpOwotCSAgICAqZHkgPSAoY2hhcikoKChkYXRhWzBdICYgMHgwQykgPDwgNCkgfCAoZGF0YVsyXSAmIDB4M0YpKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfcHMyOgotCSAgICAqYnV0dG9ucyA9ICEhKGRhdGFbMF0mMSkgKiA0ICsgISEoZGF0YVswXSYyKSAqIDEgKyAhIShkYXRhWzBdJjQpICogMjsKLQkgICAgaWYgKGRhdGFbMV0gIT0gMCkKLQkJKmR4ID0gKGRhdGFbMF0gJiAweDEwKSA/IGRhdGFbMV0tMjU2IDogZGF0YVsxXTsKLQkgICAgZWxzZQotCQkqZHggPSAwOwotCSAgICBpZiAoZGF0YVsyXSAhPSAwKQotCQkqZHkgPSAtKChkYXRhWzBdICYgMHgyMCkgPyBkYXRhWzJdLTI1NiA6IGRhdGFbMl0pOwotCSAgICBlbHNlCi0JCSpkeSA9IDA7Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX21vdXNlc3lzdGVtczogY2FzZSBFVlRfZ3BtOgotCSAgICAqYnV0dG9ucyA9ICh+ZGF0YVswXSkgJiAweDA3OwotCSAgICAqZHggPSAoY2hhcikoZGF0YVsxXSkgKyAoY2hhcikoZGF0YVszXSk7Ci0JICAgICpkeSA9IC0oKGNoYXIpKGRhdGFbMl0pICsgKGNoYXIpKGRhdGFbNF0pKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfbG9naXRlY2g6Ci0JICAgICpidXR0b25zPSBkYXRhWzBdICYgMHgwNzsKLQkgICAgKmR4ID0gKGRhdGFbMF0gJiAweDEwKSA/ICAgZGF0YVsxXSA6IC0gZGF0YVsxXTsKLQkgICAgKmR5ID0gKGRhdGFbMF0gJiAweDA4KSA/IC0gZGF0YVsyXSA6ICAgZGF0YVsyXTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfYnVzbW91c2U6Ci0JICAgICpidXR0b25zPSAofmRhdGFbMF0pICYgMHgwNzsKLQkgICAgKmR4ID0gKGNoYXIpZGF0YVsxXTsKLQkgICAgKmR5ID0gLShjaGFyKWRhdGFbMl07Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX01Nc2VyaWVzOgotCSAgICAqYnV0dG9ucyA9IGRhdGFbMF0gJiAweDA3OwotCSAgICAqZHggPSAoZGF0YVswXSAmIDB4MTApID8gICBkYXRhWzFdIDogLSBkYXRhWzFdOwotCSAgICAqZHkgPSAoZGF0YVswXSAmIDB4MDgpID8gLSBkYXRhWzJdIDogICBkYXRhWzJdOwotCSAgICBicmVhazsKLQljYXNlIEVWVF9pbnRlbGxpbW91c2U6Ci0JICAgICpidXR0b25zID0gKChkYXRhWzBdICYgMHgyMCkgPj4gMykgIC8qIGxlZnQgKi8KLQkJICAgICB8ICgoZGF0YVszXSAmIDB4MTApID4+IDMpICAvKiBtaWRkbGUgKi8KLQkJICAgICB8ICgoZGF0YVswXSAmIDB4MTApID4+IDQpOyAvKiByaWdodCAqLwotCSAgICAqZHggPSAoY2hhcikoKChkYXRhWzBdICYgMHgwMykgPDwgNikgfCAoZGF0YVsxXSAmIDB4M0YpKTsKLQkgICAgKmR5ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MEMpIDw8IDQpIHwgKGRhdGFbMl0gJiAweDNGKSk7Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX2ludGVsbGltb3VzZV9wczI6Ci0JICAgICpidXR0b25zID0gKGRhdGFbMF0gJiAweDA0KSA+PiAxIC8qIE1pZGRsZSAqLwotCQl8IChkYXRhWzBdICYgMHgwMikgPj4gMSAvKiBSaWdodCAqLwotCQl8IChkYXRhWzBdICYgMHgwMSkgPDwgMjsgLyogTGVmdCAqLwotCSAgICAqZHggPSAoZGF0YVswXSAmIDB4MTApID8gICAgZGF0YVsxXS0yNTYgIDogIGRhdGFbMV07Ci0JICAgICpkeSA9IChkYXRhWzBdICYgMHgyMCkgPyAgLShkYXRhWzJdLTI1NikgOiAtZGF0YVsyXTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfbW91c2VtYW46IHsKLQkgICAgc3RhdGljIGludCAgICAgIGdldGV4dHJhOwotCSAgICBzdGF0aWMgdWNoYXIgICAgcHJldj0wOwotCSAgICB1Y2hhciAgICAgICAgICAgYjsKLQotCSAgICAvKiBUaGUgZGFtbmVkIE1vdXNlTWFuIGhhcyAzLzQgYnl0ZXMgcGFja2V0cy4gVGhlIGV4dHJhIGJ5dGUKLQkgICAgICogaXMgb25seSB0aGVyZSBpZiB0aGUgbWlkZGxlIGJ1dHRvbiBpcyBhY3RpdmUuCi0JICAgICAqIEkgZ2V0IHRoZSBleHRyYSBieXRlIGFzIGEgcGFja2V0IHdpdGggbWFnaWMgbnVtYmVycyBpbiBpdC4KLQkgICAgICogYW5kIHRoZW4gc3dpdGNoIHRvIDQtYnl0ZSBtb2RlLgotCSAgICAgKi8KLQkgICAgaWYgKGRhdGFbMV0gPT0gMHhBQSAmJiBkYXRhWzJdID09IDB4NTUpIHsKLQkJLyogR290IHVuZXhwZWN0ZWQgZm91cnRoIGJ5dGUgKi8KLQkJaWYgKChiID0gKCpkYXRhPj40KSkgPiAweDMpCi0JCSAgICByZXR1cm4gZmFsc2U7ICAvKiBqdXN0IGEgc2FuaXR5IGNoZWNrICovCi0JCSpkeCA9ICpkeSA9IDA7Ci0JCWRydi0+cGFja2V0X2xlbj00OwotCQlnZXRleHRyYT0wOwotCQl9Ci0JICAgIGVsc2UgewotCQkvKiBHb3QgMy80LCBhcyBleHBlY3RlZCAqLwotCQkvKiBNb3Rpb24gaXMgaW5kZXBlbmRlbnQgb2YgcGFja2V0bGVuLi4uICovCi0JCSpkeCA9IChjaGFyKSgoKGRhdGFbMF0gJiAweDAzKSA8PCA2KSB8IChkYXRhWzFdICYgMHgzRikpOwotCQkqZHkgPSAoY2hhcikoKChkYXRhWzBdICYgMHgwQykgPDwgNCkgfCAoZGF0YVsyXSAmIDB4M0YpKTsKLQkJcHJldiA9ICgoZGF0YVswXSAmIDB4MjApID4+IDMpIHwgKChkYXRhWzBdICYgMHgxMCkgPj4gNCk7Ci0JCWlmIChkcnYtPnBhY2tldF9sZW49PTQpCi0JCSAgICBiID0gZGF0YVszXT4+NDsKLQkJfQotCSAgICBpZiAoZHJ2LT5wYWNrZXRfbGVuID09IDQpIHsKLQkJaWYgKGIgPT0gMCkgewotCQkgICAgZHJ2LT5wYWNrZXRfbGVuID0gMzsKLQkJICAgIGdldGV4dHJhID0gMTsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBpZiAoYiAmIDB4MikKLQkJCXByZXYgfD0gMjsKLQkJICAgIH0KLQkJfQotCSAgICAqYnV0dG9ucyA9IHByZXY7Ci0KLQkgICAgLyogVGhpcyAiY2hvcmQtbWlkZGxlIiBiZWhhdmlvdXIgd2FzIHJlcG9ydGVkIGJ5IERhdmlkIEEuIHZhbiBMZWV1d2VuICovCi0JICAgIGlmICgoKHByZXYgXiAqYnV0dG9ucykgJiA1KSA9PSA1KQotCQkqYnV0dG9ucyA9ICpidXR0b25zID8gMiA6IDA7Ci0JICAgIHByZXYgPSAqYnV0dG9uczsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQljYXNlIEVWVF9ub01vdXNlOgotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGJyZWFrOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBrZXlwcmVzcyB2aWEgdGhlIGtleSBtYXBwaW5nIHRhYmxlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBnZXRLZXlNYXBwaW5nKAotICAgIGtleW1hcCAqdGFiLAotICAgIGludCBuYiwKLSAgICBpbnQga2V5KQotewotICAgIGludCBpOwotCi0gICAgZm9yKGkgPSAwOyBpIDwgbmI7IGkrKykgewotCWlmICh0YWJbaV0uc2NhbiA9PSBrZXkpCi0JICAgIHJldHVybiB0YWJbaV0ubWFwOwotCX0KLSAgICByZXR1cm4ga2V5OwotfQotCi0jaWZkZWYgVVNFX09TX0pPWVNUSUNLCi0KLXN0YXRpYyBjaGFyIGpzMF9heGVzID0gMCwganMwX2J1dHRvbnMgPSAwOwotc3RhdGljIGNoYXIganMxX2F4ZXMgPSAwLCBqczFfYnV0dG9ucyA9IDA7Ci1zdGF0aWMgY2hhciBqb3lzdGljazBfZGV2WzIwXSA9ICIvZGV2L2pzMCI7Ci1zdGF0aWMgY2hhciBqb3lzdGljazFfZGV2WzIwXSA9ICIvZGV2L2pzMSI7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ3JlYXRlIGEgam95c3RpY2sgZXZlbnQgZnJvbSB0aGUgam95c3RpY2sgZGF0YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG1ha2VKb3lFdmVudCgKLSAgICBldmVudF90ICpldnQpCi17Ci0gICAgZXZ0LT5tZXNzYWdlID0gMDsKLSAgICBpZiAoYnV0czAgJiYgYXhpczApIHsKLQlpZiAoYnV0czBbMF0pIGV2dC0+bWVzc2FnZSB8PSBFVlRfSk9ZMV9CVVRUT05BOwotCWlmIChidXRzMFsxXSkgZXZ0LT5tZXNzYWdlIHw9IEVWVF9KT1kxX0JVVFRPTkI7Ci0JZXZ0LT53aGVyZV94ID0gYXhpczBbMF07Ci0JZXZ0LT53aGVyZV95ID0gYXhpczBbMV07Ci0JfQotICAgIGVsc2UKLQlldnQtPndoZXJlX3ggPSBldnQtPndoZXJlX3kgPSAwOwotICAgIGlmIChidXRzMSAmJiBheGlzMSkgewotCWlmIChidXRzMVswXSkgZXZ0LT5tZXNzYWdlIHw9IEVWVF9KT1kyX0JVVFRPTkE7Ci0JaWYgKGJ1dHMxWzFdKSBldnQtPm1lc3NhZ2UgfD0gRVZUX0pPWTJfQlVUVE9OQjsKLQlldnQtPndoZXJlX3ggPSBheGlzMVswXTsKLQlldnQtPndoZXJlX3kgPSBheGlzMVsxXTsKLQl9Ci0gICAgZWxzZQotCWV2dC0+d2hlcmVfeCA9IGV2dC0+d2hlcmVfeSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgam95c3RpY2sgYXhpcyBkYXRhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IEVWVEFQSSBfRVZUX3JlYWRKb3lBeGlzKAotICAgIGludCBqbWFzaywKLSAgICBpbnQgKmF4aXMpCi17Ci0gICAgaW50IG1hc2sgPSAwOwotCi0gICAgaWYgKChqc192ZXJzaW9uICYgfjB4ZmZmZikgPT0gMCkgewotCS8qIE9sZCAwLnggZHJpdmVyICovCi0Jc3RydWN0IEpTX0RBVEFfVFlQRSBqczsKLQlpZiAoam95c3RpY2swX2ZkICYmIHJlYWQoam95c3RpY2swX2ZkLCAmanMsIEpTX1JFVFVSTikgPT0gSlNfUkVUVVJOKSB7Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19YMSkKLQkJYXhpc1swXSA9IGpzLng7Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19ZMSkKLQkJYXhpc1sxXSA9IGpzLnk7Ci0JICAgIG1hc2sgfD0gRVZUX0pPWV9BWElTX1gxfEVWVF9KT1lfQVhJU19ZMTsKLQkgICAgfQotCWlmIChqb3lzdGljazFfZmQgJiYgcmVhZChqb3lzdGljazFfZmQsICZqcywgSlNfUkVUVVJOKSA9PSBKU19SRVRVUk4pIHsKLQkgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1gyKQotCQlheGlzWzJdID0ganMueDsKLQkgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1kyKQotCQlheGlzWzNdID0ganMueTsKLQkgICAgbWFzayB8PSBFVlRfSk9ZX0FYSVNfWDJ8RVZUX0pPWV9BWElTX1kyOwotCSAgICB9Ci0JfQotICAgIGVsc2UgewotCWlmIChheGlzMCkgewotCSAgICBpZiAoam1hc2sgJiBFVlRfSk9ZX0FYSVNfWDEpCi0JCWF4aXNbMF0gPSBheGlzMFswXTsKLQkgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1kxKQotCQlheGlzWzFdID0gYXhpczBbMV07Ci0JICAgIG1hc2sgfD0gRVZUX0pPWV9BWElTX1gxIHwgRVZUX0pPWV9BWElTX1kxOwotCSAgICB9Ci0JaWYgKGF4aXMxKSB7Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19YMikKLQkJYXhpc1syXSA9IGF4aXMxWzBdOwotCSAgICBpZiAoam1hc2sgJiBFVlRfSk9ZX0FYSVNfWTIpCi0JCWF4aXNbM10gPSBheGlzMVsxXTsKLQkgICAgbWFzayB8PSBFVlRfSk9ZX0FYSVNfWDIgfCBFVlRfSk9ZX0FYSVNfWTI7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIG1hc2s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgam95c3RpY2sgYnV0dG9uIGRhdGEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRVZUQVBJIF9FVlRfcmVhZEpveUJ1dHRvbnModm9pZCkKLXsKLSAgICBpbnQgYnV0cyA9IDA7Ci0KLSAgICBpZiAoKGpzX3ZlcnNpb24gJiB+MHhmZmZmKSA9PSAwKSB7Ci0JLyogT2xkIDAueCBkcml2ZXIgKi8KLQlzdHJ1Y3QgSlNfREFUQV9UWVBFIGpzOwotCWlmIChqb3lzdGljazBfZmQgJiYgcmVhZChqb3lzdGljazBfZmQsICZqcywgSlNfUkVUVVJOKSA9PSBKU19SRVRVUk4pCi0JICAgIGJ1dHMgPSBqcy5idXR0b25zOwotCWlmIChqb3lzdGljazFfZmQgJiYgcmVhZChqb3lzdGljazFfZmQsICZqcywgSlNfUkVUVVJOKSA9PSBKU19SRVRVUk4pCi0JICAgIGJ1dHMgfD0ganMuYnV0dG9ucyA8PCAyOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoYnV0czApCi0JICAgIGJ1dHMgfD0gRVZUX0pPWTFfQlVUVE9OQSpidXRzMFswXSArIEVWVF9KT1kxX0JVVFRPTkIqYnV0czBbMV07Ci0JaWYgKGJ1dHMxKQotCSAgICBidXRzIHw9IEVWVF9KT1kyX0JVVFRPTkEqYnV0czFbMF0gKyBFVlRfSk9ZMl9CVVRUT05CKmJ1dHMxWzFdOwotCX0KLSAgICByZXR1cm4gYnV0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgbWFzayBpbmRpY2F0aW5nIHdoYXQgam95c3RpY2sgYXhlcyBhcmUgYXR0YWNoZWQuCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgdGhlIGF0dGFjaGVkIGpveXN0aWNrcywgYW5kIGRldGVybWluZQotd2hhdCBheGVzIGFyZSBwcmVzZW50IGFuZCBmdW5jdGlvbmluZy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlLWRldGVjdCBhbnkKLWF0dGFjaGVkIGpveXN0aWNrcyB3aGVuIGl0IGlzIGNhbGxlZCwgc28gaWYgdGhlIHVzZXIgZm9yZ290IHRvIGF0dGFjaAotdGhlIGpveXN0aWNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0ZWQsIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCi1yZS1kZXRlY3QgYW55IG5ld2x5IGF0dGFjaGVkIGpveXN0aWNrcy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBFVlRBUEkgRVZUX2pveUlzUHJlc2VudCh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgICAgICBtYXNrID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICBjaGFyICAgICAgICAgICAgKnRtcCwgbmFtZTBbMTI4XSwgbmFtZTFbMTI4XTsKLSAgICBzdGF0aWMgaWJvb2wgICAgaW5pdGVkID0gZmFsc2U7Ci0KLSAgICBpZiAoaW5pdGVkKQotCXJldHVybiBtYXNrOwotICAgIG1lbXNldChFVlQuam95TWluLDAsc2l6ZW9mKEVWVC5qb3lNaW4pKTsKLSAgICBtZW1zZXQoRVZULmpveUNlbnRlciwwLHNpemVvZihFVlQuam95Q2VudGVyKSk7Ci0gICAgbWVtc2V0KEVWVC5qb3lNYXgsMCxzaXplb2YoRVZULmpveU1heCkpOwotICAgIG1lbXNldChFVlQuam95UHJldiwwLHNpemVvZihFVlQuam95UHJldikpOwotICAgIEVWVC5qb3lCdXRTdGF0ZSA9IDA7Ci0gICAgaWYgKCh0bXAgPSBnZXRlbnYoRU5WX0pPWURFVjApKSAhPSBOVUxMKQotCXN0cmNweShqb3lzdGljazBfZGV2LHRtcCk7Ci0gICAgaWYgKCh0bXAgPSBnZXRlbnYoRU5WX0pPWURFVjEpKSAhPSBOVUxMKQotCXN0cmNweShqb3lzdGljazFfZGV2LHRtcCk7Ci0gICAgaWYgKChqb3lzdGljazBfZmQgPSBvcGVuKGpveXN0aWNrMF9kZXYsIE9fUkRPTkxZKSkgPCAwKQotCWpveXN0aWNrMF9mZCA9IDA7Ci0gICAgaWYgKChqb3lzdGljazFfZmQgPSBvcGVuKGpveXN0aWNrMV9kZXYsIE9fUkRPTkxZKSkgPCAwKQotCWpveXN0aWNrMV9mZCA9IDA7Ci0gICAgaWYgKCFqb3lzdGljazBfZmQgJiYgIWpveXN0aWNrMV9mZCkgLyogTm8gam95c3RpY2tzIGRldGVjdGVkICovCi0JcmV0dXJuIDA7Ci0gICAgaW5pdGVkID0gdHJ1ZTsKLSAgICBpZiAoaW9jdGwoam95c3RpY2swX2ZkID8gam95c3RpY2swX2ZkIDogam95c3RpY2sxX2ZkLCBKU0lPQ0dWRVJTSU9OLCAmanNfdmVyc2lvbikgPCAwKQotCXJldHVybiAwOwotCi0gICAgLyogSW5pdGlhbGlzZSBqb3lzdGljayAwICovCi0gICAgaWYgKGpveXN0aWNrMF9mZCkgewotCWlvY3RsKGpveXN0aWNrMF9mZCwgSlNJT0NHTkFNRShzaXplb2YobmFtZTApKSwgbmFtZTApOwotCWlmIChqc192ZXJzaW9uICYgfjB4ZmZmZikgewotCSAgICBzdHJ1Y3QganNfZXZlbnQganM7Ci0KLQkgICAgaW9jdGwoam95c3RpY2swX2ZkLCBKU0lPQ0dBWEVTLCAmanMwX2F4ZXMpOwotCSAgICBpb2N0bChqb3lzdGljazBfZmQsIEpTSU9DR0JVVFRPTlMsICZqczBfYnV0dG9ucyk7Ci0JICAgIGF4aXMwID0gUE1fY2FsbG9jKChpbnQpanMwX2F4ZXMsIHNpemVvZihzaG9ydCkpOwotCSAgICBidXRzMCA9IFBNX21hbGxvYygoaW50KWpzMF9idXR0b25zKTsKLQkgICAgLyogUmVhZCB0aGUgaW5pdGlhbCBldmVudHMgKi8KLQkgICAgd2hpbGUoZGF0YVJlYWR5KGpveXN0aWNrMF9mZCkKLQkJICAmJiByZWFkKGpveXN0aWNrMF9mZCwgJmpzLCBzaXplb2Yoc3RydWN0IGpzX2V2ZW50KSkgPT0gc2l6ZW9mKHN0cnVjdCBqc19ldmVudCkKLQkJICAmJiAoanMudHlwZSAmIEpTX0VWRU5UX0lOSVQpCi0JCSAgKSB7Ci0JCWlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKQotCQkgICAgYnV0czBbanMubnVtYmVyXSA9IGpzLnZhbHVlOwotCQllbHNlIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQVhJUykKLQkJICAgIGF4aXMwW2pzLm51bWJlcl0gPSBzY2FsZUpveUF4aXMoanMudmFsdWUsanMubnVtYmVyKTsKLQkJfQotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIGpzMF9heGVzID0gMjsKLQkgICAganMwX2J1dHRvbnMgPSAyOwotCSAgICBheGlzMCA9IFBNX2NhbGxvYygoaW50KWpzMF9heGVzLCBzaXplb2Yoc2hvcnQpKTsKLQkgICAgYnV0czAgPSBQTV9tYWxsb2MoKGludClqczBfYnV0dG9ucyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBJbml0aWFsaXNlIGpveXN0aWNrIDEgKi8KLSAgICBpZiAoam95c3RpY2sxX2ZkKSB7Ci0JaW9jdGwoam95c3RpY2sxX2ZkLCBKU0lPQ0dOQU1FKHNpemVvZihuYW1lMSkpLCBuYW1lMSk7Ci0JaWYgKGpzX3ZlcnNpb24gJiB+MHhmZmZmKSB7Ci0JICAgIHN0cnVjdCBqc19ldmVudCBqczsKLQotCSAgICBpb2N0bChqb3lzdGljazFfZmQsIEpTSU9DR0FYRVMsICZqczFfYXhlcyk7Ci0JICAgIGlvY3RsKGpveXN0aWNrMV9mZCwgSlNJT0NHQlVUVE9OUywgJmpzMV9idXR0b25zKTsKLQkgICAgYXhpczEgPSBQTV9jYWxsb2MoKGludClqczFfYXhlcywgc2l6ZW9mKHNob3J0KSk7Ci0JICAgIGJ1dHMxID0gUE1fbWFsbG9jKChpbnQpanMxX2J1dHRvbnMpOwotCSAgICAvKiBSZWFkIHRoZSBpbml0aWFsIGV2ZW50cyAqLwotCSAgICB3aGlsZShkYXRhUmVhZHkoam95c3RpY2sxX2ZkKQotCQkgICYmIHJlYWQoam95c3RpY2sxX2ZkLCAmanMsIHNpemVvZihzdHJ1Y3QganNfZXZlbnQpKT09c2l6ZW9mKHN0cnVjdCBqc19ldmVudCkKLQkJICAmJiAoanMudHlwZSAmIEpTX0VWRU5UX0lOSVQpCi0JCSAgKSB7Ci0JCWlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKQotCQkgICAgYnV0czFbanMubnVtYmVyXSA9IGpzLnZhbHVlOwotCQllbHNlIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQVhJUykKLQkJICAgIGF4aXMxW2pzLm51bWJlcl0gPSBzY2FsZUpveUF4aXMoanMudmFsdWUsanMubnVtYmVyPDwyKTsKLQkJfQotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIGpzMV9heGVzID0gMjsKLQkgICAganMxX2J1dHRvbnMgPSAyOwotCSAgICBheGlzMSA9IFBNX2NhbGxvYygoaW50KWpzMV9heGVzLCBzaXplb2Yoc2hvcnQpKTsKLQkgICAgYnV0czEgPSBQTV9tYWxsb2MoKGludClqczFfYnV0dG9ucyk7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiAgQ0hFQ0tFRAotICAgIGZwcmludGYoc3RkZXJyLCJVc2luZyBqb3lzdGljayBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZFxuIiwKLQkgICAganNfdmVyc2lvbiA+PiAxNiwgKGpzX3ZlcnNpb24gPj4gOCkgJiAweGZmLCBqc192ZXJzaW9uICYgMHhmZik7Ci0gICAgaWYgKGpveXN0aWNrMF9mZCkKLQlmcHJpbnRmKHN0ZGVyciwiSm95c3RpY2sgMSAoJXMpOiAlc1xuIiwgam95c3RpY2swX2RldiwgbmFtZTApOwotICAgIGlmIChqb3lzdGljazFfZmQpCi0JZnByaW50ZihzdGRlcnIsIkpveXN0aWNrIDIgKCVzKTogJXNcbiIsIGpveXN0aWNrMV9kZXYsIG5hbWUxKTsKLSNlbmRpZgotICAgIG1hc2sgPSBfRVZUX3JlYWRKb3lBeGlzKEVWVF9KT1lfQVhJU19BTEwsRVZULmpveUNlbnRlcik7Ci0gICAgaWYgKG1hc2spIHsKLQlmb3IgKGkgPSAwOyBpIDwgSk9ZX05VTV9BWEVTOyBpKyspCi0JICAgIEVWVC5qb3lNYXhbaV0gPSBFVlQuam95Q2VudGVyW2ldKjI7Ci0JfQotICAgIHJldHVybiBtYXNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Qb2xscyB0aGUgam95c3RpY2sgZm9yIHBvc2l0aW9uIGFuZCBidXR0b24gaW5mb3JtYXRpb24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHBvbGwgYW5hbG9ndWUgam95c3RpY2tzIGZvciBidXR0b24gYW5kIHBvc2l0aW9uCi1pbmZvcm1hdGlvbi4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIG1haW4gbG9vcCBvZiB0aGUgdXNlcgotYXBwbGljYXRpb24sIGp1c3QgYmVmb3JlIHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgZXZlbnRzIHZpYSBFVlRfZ2V0TmV4dC4KLUFsbCBpbmZvcm1hdGlvbiBwb2xsZWQgZnJvbSB0aGUgam95c3RpY2sgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIGV2ZW50Ci1xdWV1ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLgotCi1Ob3RlOiAgIE1vc3QgYW5hbG9ndWUgam95c3RpY2tzIHdpbGwgcHJvdmlkZSByZWFkaW5ncyB0aGF0IGNoYW5nZSBldmVuCi0JdGhvdWdoIHRoZSBqb3lzdGljayBoYXMgbm90IG1vdmVkLiBIZW5jZSBpZiB5b3UgY2FsbCB0aGlzIHJvdXRpbmUKLQl5b3Ugd2lsbCBsaWtlbHkgZ2V0IGFuIEVWVF9KT1lNT1ZFIGV2ZW50IGV2ZXJ5IHRpbWUgdGhyb3VnaCB5b3VyCi0JZXZlbnQgbG9vcC4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0LCBFVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwKLUVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfcG9sbEpveXN0aWNrKHZvaWQpCi17Ci0gICAgZXZlbnRfdCBldnQ7Ci0gICAgaW50ICAgICBpLGF4aXNbSk9ZX05VTV9BWEVTXSxuZXdCdXRTdGF0ZSxtYXNrLG1vdmVkLHBzOwotCi0gICAgaWYgKChqc192ZXJzaW9uICYgfjB4RkZGRikgPT0gMCAmJiBFVlQuam95TWFzaykgewotCS8qIFJlYWQgam95c3RpY2sgYXhlcyBhbmQgcG9zdCBtb3ZlbWVudCBldmVudHMgaWYgdGhleSBoYXZlCi0JICogY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHBvbGxlZC4gVW50aWwgdGhlIGV2ZW50cyBhcmUKLQkgKiBhY3R1YWxseSBmbHVzaGVkLCB3ZSBrZWVwIG1vZGlmeWluZyB0aGUgc2FtZSBqb3lzdGljayBtb3ZlbWVudAotCSAqIGV2ZW50LCBzbyB5b3Ugd29uJ3QgZ2V0IG11bHRpcGxlIG1vdmVtZW50IGV2ZW50Ci0JICovCi0JbWFzayA9IF9FVlRfcmVhZEpveUF4aXMoRVZULmpveU1hc2ssYXhpcyk7Ci0JbmV3QnV0U3RhdGUgPSBfRVZUX3JlYWRKb3lCdXR0b25zKCk7Ci0JbW92ZWQgPSBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgSk9ZX05VTV9BWEVTOyBpKyspIHsKLQkgICAgaWYgKG1hc2sgJiAoRVZUX0pPWV9BWElTX1gxIDw8IGkpKQotCQlheGlzW2ldID0gc2NhbGVKb3lBeGlzKGF4aXNbaV0saSk7Ci0JICAgIGVsc2UKLQkJYXhpc1tpXSA9IEVWVC5qb3lQcmV2W2ldOwotCSAgICBpZiAoYXhpc1tpXSAhPSBFVlQuam95UHJldltpXSkKLQkJbW92ZWQgPSB0cnVlOwotCSAgICB9Ci0JaWYgKG1vdmVkKSB7Ci0JICAgIG1lbWNweShFVlQuam95UHJldixheGlzLHNpemVvZihFVlQuam95UHJldikpOwotCSAgICBwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCSAgICBpZiAoRVZULm9sZEpveU1vdmUgIT0gLTEpIHsKLQkJLyogTW9kaWZ5IHRoZSBleGlzdGluZyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ubWVzc2FnZSA9IG5ld0J1dFN0YXRlOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQl9Ci0JICAgIGVsc2UgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkJLyogQWRkIGEgbmV3IGpveXN0aWNrIG1vdmVtZW50IGV2ZW50ICovCi0JCUVWVC5vbGRKb3lNb3ZlID0gRVZULmZyZWVIZWFkOwotCQltZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKLQkJZXZ0LndoYXQgPSBFVlRfSk9ZTU9WRTsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlQuam95QnV0U3RhdGU7Ci0JCWV2dC53aGVyZV94ID0gRVZULmpveVByZXZbMF07Ci0JCWV2dC53aGVyZV95ID0gRVZULmpveVByZXZbMV07Ci0JCWV2dC5yZWxhdGl2ZV94ID0gRVZULmpveVByZXZbMl07Ci0JCWV2dC5yZWxhdGl2ZV95ID0gRVZULmpveVByZXZbM107Ci0JCWFkZEV2ZW50KCZldnQpOwotCQl9Ci0JICAgIF9FVlRfcmVzdG9yZUludChwcyk7Ci0JICAgIH0KLQotCS8qIFJlYWQgdGhlIGpveXN0aWNrIGJ1dHRvbnMsIGFuZCBwb3N0IGV2ZW50cyB0byByZWZsZWN0IHRoZSBjaGFuZ2UKLQkgKiBpbiBzdGF0ZSBmb3IgdGhlIGpveXN0aWNrIGJ1dHRvbnMuCi0JICovCi0JaWYgKG5ld0J1dFN0YXRlICE9IEVWVC5qb3lCdXRTdGF0ZSkgewotCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCQkvKiBBZGQgYSBuZXcgam95c3RpY2sgbW92ZW1lbnQgZXZlbnQgKi8KLQkJcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQkJbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7Ci0JCWV2dC53aGF0ID0gRVZUX0pPWUNMSUNLOwotCQlldnQubWVzc2FnZSA9IG5ld0J1dFN0YXRlOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQlhZGRFdmVudCgmZXZ0KTsKLQkJX0VWVF9yZXN0b3JlSW50KHBzKTsKLQkJfQotCSAgICBFVlQuam95QnV0U3RhdGUgPSBuZXdCdXRTdGF0ZTsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgdXBwZXIgbGVmdCBwb3NpdGlvbgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCi13aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi10aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCi1UbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSB1cHBlciBsZWZ0Ci1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95TWluKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgbG93ZXIgcmlnaHQgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgbG93ZXIgcmlnaHQKLXBvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcwotZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCi1jYWxpYnJhdGlvbiBmYWN0b3JzLgotCi1Vc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKLWluaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQotdXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQotc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRMb3dlclJpZ2h0KHZvaWQpCi17Ci0gICAgX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lNYXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1DYWxpYnJhdGVzIHRoZSBqb3lzdGljayBjZW50ZXIgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgY2VudGVyCi1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldENlbnRlcih2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95Q2VudGVyKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZSBmcm9tIExpbnV4IGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgZXZlbnRfdCAgICAgICAgICAgICAgICAgZXZ0OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGksbnVta2V5cywgYzsKLSAgICBpYm9vbCAgICAgICAgICAgICAgICAgICByZWxlYXNlOwotICAgIHN0YXRpYyBzdHJ1Y3Qga2JlbnRyeSAgIGtlOwotICAgIHN0YXRpYyBjaGFyICAgICAgICAgICAgIGJ1ZltLQkRSRUFEQlVGRkVSU0laRV07Ci0gICAgc3RhdGljIHVzaG9ydCAgICAgICAgICAgcmVwZWF0S2V5WzEyOF0gPSB7MH07Ci0KLSAgICAvKiBQb2xsIGtleWJvYXJkIGV2ZW50cyAqLwotICAgIHdoaWxlIChkYXRhUmVhZHkoX1BNX2NvbnNvbGVfZmQpICYmIChudW1rZXlzID0gcmVhZChfUE1fY29uc29sZV9mZCwgYnVmLCBLQkRSRUFEQlVGRkVSU0laRSkpID4gMCkgewotCWZvciAoaSA9IDA7IGkgPCBudW1rZXlzOyBpKyspIHsKLQkgICAgYyA9IGJ1ZltpXTsKLQkgICAgcmVsZWFzZSA9IGMgJiAweDgwOwotCSAgICBjICY9IDB4N0Y7Ci0KLQkgICAgLyogVE9ETzogICAgVGhpcyBpcyB3cm9uZyEgV2UgbmVlZCB0aGlzIHRvIGJlIHRoZSB0aW1lIHN0YW1wIGF0ICovCi0JICAgIC8qICAgICAgICAgICoqIGludGVycnVwdCAqKiB0aW1lISEgT25lIHNvbHV0aW9uIHdvdWxkIGJlIHRvICovCi0JICAgIC8qICAgICAgICAgIHB1dCB0aGUga2V5Ym9hcmQgYW5kIG1vdXNlIHBvbGxpbmcgbG9vcHMgaW50byAqLwotCSAgICAvKiAgICAgICAgICBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbiBibG9jayBvbiBJL08gdG8gdGhlICovCi0JICAgIC8qICAgICAgICAgIG5lY2Vzc2F5IGZpbGUgZGVzY3JpcHRvci4gKi8KLQkgICAgZXZ0LndoZW4gPSBfRVZUX2dldFRpY2tzKCk7Ci0KLQkgICAgaWYgKHJlbGVhc2UpIHsKLQkJLyogS2V5IHJlbGVhc2VkICovCi0JCWV2dC53aGF0ID0gRVZUX0tFWVVQOwotCQlzd2l0Y2ggKGMpIHsKLQkJICAgIGNhc2UgS0JfbGVmdFNoaWZ0OgotCQkJX1BNX21vZGlmaWVycyAmPSB+RVZUX0xFRlRTSElGVDsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBLQl9yaWdodFNoaWZ0OgotCQkJX1BNX21vZGlmaWVycyAmPSB+RVZUX1JJR0hUU0hJRlQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMjk6Ci0JCQlfUE1fbW9kaWZpZXJzICY9IH4oRVZUX0xFRlRDVFJMfEVWVF9DVFJMU1RBVEUpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDk3OiAgICAgICAgICAgIC8qIENvbnRyb2wgKi8KLQkJCV9QTV9tb2RpZmllcnMgJj0gfkVWVF9DVFJMU1RBVEU7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgNTY6Ci0JCQlfUE1fbW9kaWZpZXJzICY9IH4oRVZUX0xFRlRBTFR8RVZUX0FMVFNUQVRFKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSAxMDA6Ci0JCQlfUE1fbW9kaWZpZXJzICY9IH5FVlRfQUxUU1RBVEU7Ci0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICB9Ci0JCWV2dC5tb2RpZmllcnMgPSBfUE1fbW9kaWZpZXJzOwotCQlldnQubWVzc2FnZSA9IGtleVVwTXNnW2NdOwotCQlpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJICAgIGFkZEV2ZW50KCZldnQpOwotCQlrZXlVcE1zZ1tjXSA9IDA7Ci0JCXJlcGVhdEtleVtjXSA9IDA7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCS8qIEtleSBwcmVzc2VkICovCi0JCWV2dC53aGF0ID0gRVZUX0tFWURPV047Ci0JCXN3aXRjaCAoYykgewotCQkgICAgY2FzZSBLQl9sZWZ0U2hpZnQ6Ci0JCQlfUE1fbW9kaWZpZXJzIHw9IEVWVF9MRUZUU0hJRlQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgS0JfcmlnaHRTaGlmdDoKLQkJCV9QTV9tb2RpZmllcnMgfD0gRVZUX1JJR0hUU0hJRlQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMjk6Ci0JCQlfUE1fbW9kaWZpZXJzIHw9IEVWVF9MRUZUQ1RSTHxFVlRfQ1RSTFNUQVRFOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDk3OiAgICAgICAgICAgIC8qIENvbnRyb2wgKi8KLQkJCV9QTV9tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSA1NjoKLQkJCV9QTV9tb2RpZmllcnMgfD0gRVZUX0xFRlRBTFR8RVZUX0FMVFNUQVRFOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDEwMDoKLQkJCV9QTV9tb2RpZmllcnMgfD0gRVZUX0FMVFNUQVRFOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEtCX2NhcHNMb2NrOiAgIC8qIENhcHMgTG9jayAqLwotCQkJX1BNX2xlZHMgXj0gTEVEX0NBUDsKLQkJCWlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgX1BNX2xlZHMpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEtCX251bUxvY2s6ICAgIC8qIE51bSBMb2NrICovCi0JCQlfUE1fbGVkcyBePSBMRURfTlVNOwotCQkJaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0VUTEVELCBfUE1fbGVkcyk7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgS0Jfc2Nyb2xsTG9jazogLyogU2Nyb2xsIExvY2sgKi8KLQkJCV9QTV9sZWRzIF49IExFRF9TQ1I7Ci0JCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9sZWRzKTsKLQkJCWJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgIH0KLQkJZXZ0Lm1vZGlmaWVycyA9IF9QTV9tb2RpZmllcnM7Ci0JCWlmIChrZXlVcE1zZ1tjXSkgewotCQkgICAgZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tjXSB8IChyZXBlYXRLZXlbY10rKyA8PCAxNik7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgaW50IGFzYzsKLQotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBnZXRLZXlNYXBwaW5nKGtleW1hcHMsIE5CX0tFWU1BUFMsIGMpIDw8IDg7Ci0JCSAgICBrZS5rYl9pbmRleCA9IGM7Ci0JCSAgICBrZS5rYl90YWJsZSA9IDA7Ci0JCSAgICBpZiAoKF9QTV9tb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpIHx8IChfUE1fbGVkcyAmIExFRF9DQVApKQotCQkJa2Uua2JfdGFibGUgfD0gS19TSElGVFRBQjsKLQkJICAgIGlmIChfUE1fbW9kaWZpZXJzICYgKEVWVF9MRUZUQUxUIHwgRVZUX0FMVFNUQVRFKSkKLQkJCWtlLmtiX3RhYmxlIHw9IEtfQUxUVEFCOwotCQkgICAgaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLREdLQkVOVCwgKHVuc2lnbmVkIGxvbmcpJmtlKTwwKQotCQkJcGVycm9yKCJpb2N0bChLREdLQkVOVCkiKTsKLQkJICAgIGlmICgoX1BNX2xlZHMgJiBMRURfTlVNKSAmJiAoZ2V0S2V5TWFwcGluZyhrZXlwYWQsIE5CX0tFWVBBRCwgYykhPWMpKSB7Ci0JCQlhc2MgPSBnZXRLZXlNYXBwaW5nKGtleXBhZCwgTkJfS0VZUEFELCBjKTsKLQkJCX0KLQkJICAgIGVsc2UgewotCQkJc3dpdGNoIChjKSB7Ci0JCQkgICAgY2FzZSAxNDoKLQkJCQlhc2MgPSBBU0NJSV9iYWNrc3BhY2U7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgY2FzZSAxNToKLQkJCQlhc2MgPSBBU0NJSV90YWI7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgY2FzZSAyODoKLQkJCSAgICBjYXNlIDk2OgotCQkJCWFzYyA9IEFTQ0lJX2VudGVyOwotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgMToKLQkJCQlhc2MgPSBBU0NJSV9lc2M7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCQlhc2MgPSBrZS5rYl92YWx1ZSAmIDB4RkY7Ci0JCQkJaWYgKGFzYyA8IDB4MUIpCi0JCQkJICAgIGFzYyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgaWYgKChfUE1fbW9kaWZpZXJzICYgKEVWVF9DVFJMU1RBVEV8RVZUX0xFRlRDVFJMKSkgJiYgaXNhbHBoYShhc2MpKQotCQkJZXZ0Lm1lc3NhZ2UgfD0gdG91cHBlcihhc2MpIC0gJ0EnICsgMTsKLQkJICAgIGVsc2UKLQkJCWV2dC5tZXNzYWdlIHw9IGFzYzsKLQkJICAgIGtleVVwTXNnW2NdID0gZXZ0Lm1lc3NhZ2U7Ci0JCSAgICByZXBlYXRLZXlbY10rKzsKLQkJICAgIH0KLQkJaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgLyogUG9sbCBtb3VzZSBldmVudHMgKi8KLSAgICBpZiAoX0VWVF9tb3VzZV9mZCkgewotCWludCAgICAgICAgIGR4LCBkeSwgYnV0czsKLQlzdGF0aWMgaW50ICBvbGRidXRzOwotCi0Jd2hpbGUgKGRhdGFSZWFkeShfRVZUX21vdXNlX2ZkKSkgewotCSAgICBpZiAocmVhZE1vdXNlRGF0YSgmYnV0cywgJmR4LCAmZHkpKSB7Ci0JCUVWVC5teCArPSBkeDsKLQkJRVZULm15ICs9IGR5OwotCQlpZiAoRVZULm14IDwgMCkgRVZULm14ID0gMDsKLQkJaWYgKEVWVC5teSA8IDApIEVWVC5teSA9IDA7Ci0JCWlmIChFVlQubXggPiByYW5nZV94KSBFVlQubXggPSByYW5nZV94OwotCQlpZiAoRVZULm15ID4gcmFuZ2VfeSkgRVZULm15ID0gcmFuZ2VfeTsKLQkJZXZ0LndoZXJlX3ggPSBFVlQubXg7Ci0JCWV2dC53aGVyZV95ID0gRVZULm15OwotCQlldnQucmVsYXRpdmVfeCA9IGR4OwotCQlldnQucmVsYXRpdmVfeSA9IGR5OwotCi0JCS8qIFRPRE86ICAgIFRoaXMgaXMgd3JvbmchIFdlIG5lZWQgdGhpcyB0byBiZSB0aGUgdGltZSBzdGFtcCBhdCAqLwotCQkvKiAgICAgICAgICAqKiBpbnRlcnJ1cHQgKiogdGltZSEhIE9uZSBzb2x1dGlvbiB3b3VsZCBiZSB0byAqLwotCQkvKiAgICAgICAgICBwdXQgdGhlIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nIGxvb3BzIGludG8gKi8KLQkJLyogICAgICAgICAgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYW4gYmxvY2sgb24gSS9PIHRvIHRoZSAqLwotCQkvKiAgICAgICAgICBuZWNlc3NheSBmaWxlIGRlc2NyaXB0b3IuICovCi0JCWV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOwotCQlldnQubW9kaWZpZXJzID0gX1BNX21vZGlmaWVyczsKLQkJaWYgKGJ1dHMgJiA0KQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEJVVDsKLQkJaWYgKGJ1dHMgJiAxKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRCVVQ7Ci0JCWlmIChidXRzICYgMikKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX01JRERMRUJVVDsKLQotCQkvKiBMZWZ0IGNsaWNrIGV2ZW50cyAqLwotCQlpZiAoKGJ1dHMmNCkgIT0gKG9sZGJ1dHMmNCkpIHsKLQkJICAgIGlmIChidXRzJjQpCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCSAgICBlbHNlCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0KLQkJLyogUmlnaHQgY2xpY2sgZXZlbnRzICovCi0JCWlmICgoYnV0cyYxKSAhPSAob2xkYnV0cyYxKSkgewotCQkgICAgaWYgKGJ1dHMmMSkKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJICAgIGVsc2UKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCSAgICBldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0KLQkJLyogTWlkZGxlIGNsaWNrIGV2ZW50cyAqLwotCQlpZiAoKGJ1dHMmMikgIT0gKG9sZGJ1dHMmMikpIHsKLQkJICAgIGlmIChidXRzJjIpCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCSAgICBlbHNlCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7Ci0JCSAgICBFVlQub2xkTW92ZSA9IC0xOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQotCQkvKiBNb3VzZSBtb3ZlbWVudCBldmVudCAqLwotCQlpZiAoZHggfHwgZHkpIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLQkJICAgIGV2dC5tZXNzYWdlID0gMDsKLQkJICAgIGlmIChFVlQub2xkTW92ZSAhPSAtMSkgewotCQkJLyogTW9kaWZ5IGV4aXN0aW5nIG1vdmVtZW50IGV2ZW50ICovCi0JCQlFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeCA9IGV2dC53aGVyZV94OwotCQkJRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSBldnQud2hlcmVfeTsKLQkJCX0KLQkJICAgIGVsc2UgewotCQkJLyogU2F2ZSBpZCBvZiB0aGlzIG1vdmVtZW50IGV2ZW50ICovCi0JCQlFVlQub2xkTW92ZSA9IEVWVC5mcmVlSGVhZDsKLQkJCWlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJICAgIGFkZEV2ZW50KCZldnQpOwotCQkJfQotCQkgICAgfQotCQlvbGRidXRzID0gYnV0czsKLQkJfQotCSAgICB9Ci0JfQotCi0jaWZkZWYgVVNFX09TX0pPWVNUSUNLCi0gICAgLyogUG9sbCBqb3lzdGljayBldmVudHMgdXNpbmcgdGhlIDEueCBqb3lzdGljayBkcml2ZXIgQVBJIGluIHRoZSAyLjIga2VybmVscyAqLwotICAgIGlmIChqc192ZXJzaW9uICYgfjB4ZmZmZikgewotCXN0YXRpYyBzdHJ1Y3QganNfZXZlbnQgIGpzOwotCi0JLyogUmVhZCBqb3lzdGljayBheGlzIDAgKi8KLQlldnQud2hlbiA9IDA7Ci0JZXZ0Lm1vZGlmaWVycyA9IF9QTV9tb2RpZmllcnM7Ci0JaWYgKGpveXN0aWNrMF9mZCAmJiBkYXRhUmVhZHkoam95c3RpY2swX2ZkKSAmJgotCQlyZWFkKGpveXN0aWNrMF9mZCwgJmpzLCBzaXplb2YoanMpKSA9PSBzaXplb2YoanMpKSB7Ci0JICAgIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKSB7Ci0JCWlmIChqcy5udW1iZXIgPCAyKSB7IC8qIE9ubHkgMiBidXR0b25zIGZvciBub3cgOiggKi8KLQkJICAgIGJ1dHMwW2pzLm51bWJlcl0gPSBqcy52YWx1ZTsKLQkJICAgIGV2dC53aGF0ID0gRVZUX0pPWUNMSUNLOwotCQkgICAgbWFrZUpveUV2ZW50KCZldnQpOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQkJfQotCSAgICBlbHNlIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQVhJUykgewotCQlheGlzMFtqcy5udW1iZXJdID0gc2NhbGVKb3lBeGlzKGpzLnZhbHVlLGpzLm51bWJlcik7Ci0JCWV2dC53aGF0ID0gRVZUX0pPWU1PVkU7Ci0JCWlmIChFVlQub2xkSm95TW92ZSAhPSAtMSkgewotCQkgICAgbWFrZUpveUV2ZW50KCZFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0pOwotCQkgICAgfQotCQllbHNlIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JCSAgICBFVlQub2xkSm95TW92ZSA9IEVWVC5mcmVlSGVhZDsKLQkJICAgIG1ha2VKb3lFdmVudCgmZXZ0KTsKLQkJICAgIGFkZEV2ZW50KCZldnQpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCS8qIFJlYWQgam95c3RpY2sgYXhpcyAxICovCi0JaWYgKGpveXN0aWNrMV9mZCAmJiBkYXRhUmVhZHkoam95c3RpY2sxX2ZkKSAmJgotCQlyZWFkKGpveXN0aWNrMV9mZCwgJmpzLCBzaXplb2YoanMpKT09c2l6ZW9mKGpzKSkgewotCSAgICBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0JVVFRPTikgewotCQlpZiAoanMubnVtYmVyIDwgMikgeyAvKiBPbmx5IDIgYnV0dG9ucyBmb3Igbm93IDooICovCi0JCSAgICBidXRzMVtqcy5udW1iZXJdID0ganMudmFsdWU7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9KT1lDTElDSzsKLQkJICAgIG1ha2VKb3lFdmVudCgmZXZ0KTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgZWxzZSBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0FYSVMpIHsKLQkJYXhpczFbanMubnVtYmVyXSA9IHNjYWxlSm95QXhpcyhqcy52YWx1ZSxqcy5udW1iZXI8PDIpOwotCQlldnQud2hhdCA9IEVWVF9KT1lNT1ZFOwotCQlpZiAoRVZULm9sZEpveU1vdmUgIT0gLTEpIHsKLQkJICAgIG1ha2VKb3lFdmVudCgmRVZULmV2dHFbRVZULm9sZEpveU1vdmVdKTsKLQkJICAgIH0KLQkJZWxzZSBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCQkgICAgRVZULm9sZEpveU1vdmUgPSBFVlQuZnJlZUhlYWQ7Ci0JCSAgICBtYWtlSm95RXZlbnQoJmV2dCk7Ci0JCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQota2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCi1jb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBfUE1fbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzZXRzcGVlZCgKLSAgICBpbnQgZmQsCi0gICAgaW50IG9sZCwKLSAgICBpbnQgbmV3LAotICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzKQotewotICAgIHN0cnVjdCB0ZXJtaW9zIHR0eTsKLSAgICBjaGFyICpjOwotCi0gICAgdGNnZXRhdHRyKGZkLCAmdHR5KTsKLSAgICB0dHkuY19pZmxhZyA9IElHTkJSSyB8IElHTlBBUjsKLSAgICB0dHkuY19vZmxhZyA9IDA7Ci0gICAgdHR5LmNfbGZsYWcgPSAwOwotICAgIHR0eS5jX2xpbmUgPSAwOwotICAgIHR0eS5jX2NjW1ZUSU1FXSA9IDA7Ci0gICAgdHR5LmNfY2NbVk1JTl0gPSAxOwotICAgIHN3aXRjaCAob2xkKSB7Ci0JY2FzZSA5NjAwOiAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEI5NjAwOyBicmVhazsKLQljYXNlIDQ4MDA6ICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjQ4MDA7IGJyZWFrOwotCWNhc2UgMjQwMDogIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCMjQwMDsgYnJlYWs7Ci0JY2FzZSAxMjAwOgotCWRlZmF1bHQ6ICAgIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCMTIwMDsgYnJlYWs7Ci0JfQotICAgIHRjc2V0YXR0cihmZCwgVENTQUZMVVNILCAmdHR5KTsKLSAgICBzd2l0Y2ggKG5ldykgewotCWNhc2UgOTYwMDogIGMgPSAiKnEiOyAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEI5NjAwOyBicmVhazsKLQljYXNlIDQ4MDA6ICBjID0gIipwIjsgIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCNDgwMDsgYnJlYWs7Ci0JY2FzZSAyNDAwOiAgYyA9ICIqbyI7ICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjI0MDA7IGJyZWFrOwotCWNhc2UgMTIwMDoKLQlkZWZhdWx0OiAgICBjID0gIipuIjsgIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCMTIwMDsgYnJlYWs7Ci0JfQotICAgIHdyaXRlKGZkLCBjLCAyKTsKLSAgICB1c2xlZXAoMTAwMDAwKTsKLSAgICB0Y3NldGF0dHIoZmQsIFRDU0FGTFVTSCwgJnR0eSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2VuZXJpYyBtb3VzZSBkcml2ZXIgaW5pdCBjb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0VWVF9tb3VzZV9pbml0KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBDaGFuZ2UgZnJvbSBhbnkgYXZhaWxhYmxlIHNwZWVkIHRvIHRoZSBjaG9zZW4gb25lICovCi0gICAgZm9yIChpID0gOTYwMDsgaSA+PSAxMjAwOyBpIC89IDIpCi0Jc2V0c3BlZWQoX0VWVF9tb3VzZV9mZCwgaSwgb3B0X2JhdWQsIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvZ2l0ZWNoIG1vdXNlIGRyaXZlciBpbml0IGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX2xvZ2l0ZWNoX2luaXQodm9pZCkKLXsKLSAgICBpbnQgICAgICAgICBpOwotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBpbnQgICAgICAgICBidXNtb3VzZTsKLQotICAgIC8qIGlzIHRoaXMgYSBzZXJpYWwtIG9yIGEgYnVzLSBtb3VzZT8gKi8KLSAgICBpZiAoZnN0YXQoX0VWVF9tb3VzZV9mZCwmYnVmKSA9PSAtMSkKLQlwZXJyb3IoImZzdGF0Iik7Ci0gICAgaSA9IE1BSk9SKGJ1Zi5zdF9yZGV2KTsKLSAgICBpZiAoc3RhdCgiL2Rldi90dHlTMCIsJmJ1ZikgPT0gLTEpCi0JcGVycm9yKCJzdGF0Iik7Ci0gICAgYnVzbW91c2U9KGkgIT0gTUFKT1IoYnVmLnN0X3JkZXYpKTsKLQotICAgIC8qIEZpeCB0aGUgaG93bWFueSBmaWVsZCwgc28gdGhhdCBzZXJpYWwgbWljZSBoYXZlIDEsIHdoaWxlIGJ1c21pY2UgaGF2ZSAzICovCi0gICAgbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5yZWFkID0gYnVzbW91c2UgPyAzIDogMTsKLQotICAgIC8qIENoYW5nZSBmcm9tIGFueSBhdmFpbGFibGUgc3BlZWQgdG8gdGhlIGNob3NlbiBvbmUgKi8KLSAgICBmb3IgKGkgPSA5NjAwOyBpID49IDEyMDA7IGkgLz0gMikKLQlzZXRzcGVlZChfRVZUX21vdXNlX2ZkLCBpLCBvcHRfYmF1ZCwgbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5mbGFncyk7Ci0KLSAgICAvKiBUaGlzIHN0dWZmIGlzIHBlY3VsaWFyIG9mIGxvZ2l0ZWNoIG1pY2UsIGFsc28gZm9yIHRoZSBzZXJpYWwgb25lcyAqLwotICAgIHdyaXRlKF9FVlRfbW91c2VfZmQsICJTIiwgMSk7Ci0gICAgc2V0c3BlZWQoX0VWVF9tb3VzZV9mZCwgb3B0X2JhdWQsIG9wdF9iYXVkLENTOCB8UEFSRU5CIHxQQVJPREQgfENSRUFEIHxDTE9DQUwgfEhVUENMKTsKLQotICAgIC8qIENvbmZpZ3VyZSB0aGUgc2FtcGxlIHJhdGUgKi8KLSAgICBmb3IgKGkgPSAwOyBvcHRfc2FtcGxlIDw9IHNhbXBsZXRhYltpXS5zYW1wbGU7IGkrKykKLQk7Ci0gICAgd3JpdGUoX0VWVF9tb3VzZV9mZCxzYW1wbGV0YWJbaV0uY29kZSwxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NaWNyb3NvZnQgSW50ZWxsaW1vdXNlIGluaXQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcG5wbW91c2VfaW5pdCh2b2lkKQotewotICAgIHN0cnVjdCB0ZXJtaW9zIHR0eTsKLQotICAgIHRjZ2V0YXR0cihfRVZUX21vdXNlX2ZkLCAmdHR5KTsKLSAgICB0dHkuY19pZmxhZyA9IElHTkJSSyB8IElHTlBBUjsKLSAgICB0dHkuY19vZmxhZyA9IDA7Ci0gICAgdHR5LmNfbGZsYWcgPSAwOwotICAgIHR0eS5jX2xpbmUgPSAwOwotICAgIHR0eS5jX2NjW1ZUSU1FXSA9IDA7Ci0gICAgdHR5LmNfY2NbVk1JTl0gPSAxOwotICAgIHR0eS5jX2NmbGFnID0gbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5mbGFncyB8IEIxMjAwOwotICAgIHRjc2V0YXR0cihfRVZUX21vdXNlX2ZkLCBUQ1NBRkxVU0gsICZ0dHkpOyAvKiBzZXQgcGFyYW1ldGVycyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIGludCAgICAgICAgIGk7Ci0gICAgY2hhciAgICAgICAgKnRtcDsKLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gICAgRVZULm1vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQlrZXlVcE1zZ1tpXSA9IDA7Ci0KLSAgICAvKiBLZXlib2FyZCBpbml0aWFsaXphdGlvbiAqLwotICAgIGlmIChfUE1fY29uc29sZV9mZCA9PSAtMSkKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBmaXJzdCBjYWxsIFBNX29wZW5Db25zb2xlIHRvIHVzZSB0aGUgRVZUIGZ1bmN0aW9ucyEiKTsKLSAgICBfUE1fa2V5Ym9hcmRfcmF3bW9kZSgpOwotICAgIGZjbnRsKF9QTV9jb25zb2xlX2ZkLEZfU0VURkwsZmNudGwoX1BNX2NvbnNvbGVfZmQsRl9HRVRGTCkgfCBPX05PTkJMT0NLKTsKLQotICAgIC8qIE1vdXNlIGluaXRpYWxpemF0aW9uICovCi0gICAgaWYgKCh0bXAgPSBnZXRlbnYoRU5WX01PVVNFRFJWKSkgIT0gTlVMTCkgewotCWZvciAoaSA9IDA7IGkgPCBOQl9NSUNFOyBpKyspIHsKLQkgICAgaWYgKCFzdHJjYXNlY21wKHRtcCwgbW91c2VfaW5mb3NbaV0ubmFtZSkpIHsKLQkJbW91c2VfZHJpdmVyID0gaTsKLQkJYnJlYWs7Ci0JCX0KLQkgICAgfQotCWlmIChpID09IE5CX01JQ0UpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIlVua25vd24gbW91c2UgZHJpdmVyOiAlc1xuIiwgdG1wKTsKLQkgICAgbW91c2VfZHJpdmVyID0gRVZUX25vTW91c2U7Ci0JICAgIF9FVlRfbW91c2VfZmQgPSAwOwotCSAgICB9Ci0JfQotICAgIGlmIChtb3VzZV9kcml2ZXIgIT0gRVZUX25vTW91c2UpIHsKLQlpZiAobW91c2VfZHJpdmVyID09IEVWVF9ncG0pCi0JICAgIHN0cmNweShtb3VzZV9kZXYsIi9kZXYvZ3BtZGF0YSIpOwotCWlmICgodG1wID0gZ2V0ZW52KEVOVl9NT1VTRURFVikpICE9IE5VTEwpCi0JICAgIHN0cmNweShtb3VzZV9kZXYsdG1wKTsKLSNpZmRlZiAgQ0hFQ0tFRAotCWZwcmludGYoc3RkZXJyLCJVc2luZyB0aGUgJXMgTUdMIG1vdXNlIGRyaXZlciBvbiAlcy5cbiIsIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0ubmFtZSwgbW91c2VfZGV2KTsKLSNlbmRpZgotCWlmICgoX0VWVF9tb3VzZV9mZCA9IG9wZW4obW91c2VfZGV2LCBPX1JEV1IpKSA8IDApIHsKLQkgICAgcGVycm9yKCJvcGVuIik7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gbW91c2UgZGV2aWNlICVzLCBkcm9wcGluZyBtb3VzZSBzdXBwb3J0LlxuIiwgbW91c2VfZGV2KTsKLQkgICAgc2xlZXAoMSk7Ci0JICAgIG1vdXNlX2RyaXZlciA9IEVWVF9ub01vdXNlOwotCSAgICBfRVZUX21vdXNlX2ZkID0gMDsKLQkgICAgfQotCWVsc2UgewotCSAgICBjaGFyIGM7Ci0KLQkgICAgLyogSW5pdCBhbmQgZmx1c2ggdGhlIG1vdXNlIHBlbmRpbmcgaW5wdXQgcXVldWUgKi8KLQkgICAgaWYgKG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uaW5pdCkKLQkJbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5pbml0KCk7Ci0JICAgIHdoaWxlKGRhdGFSZWFkeShfRVZUX21vdXNlX2ZkKSAmJiByZWFkKF9FVlRfbW91c2VfZmQsICZjLCAxKSA9PSAxKQotCQk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VfeCA9IHhSZXM7Ci0gICAgcmFuZ2VfeSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX3NldE1vdXNlUG9zKHgseSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgTGludXggKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIExpbnV4ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgX1BNX3Jlc3RvcmVfa2JfbW9kZSgpOwotICAgIGlmIChfRVZUX21vdXNlX2ZkKSB7Ci0JY2xvc2UoX0VWVF9tb3VzZV9mZCk7Ci0JX0VWVF9tb3VzZV9mZCA9IDA7Ci0JfQotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotICAgIGlmIChqb3lzdGljazBfZmQpIHsKLQljbG9zZShqb3lzdGljazBfZmQpOwotCWZyZWUoYXhpczApOwotCWZyZWUoYnV0czApOwotCWpveXN0aWNrMF9mZCA9IDA7Ci0JfQotICAgIGlmIChqb3lzdGljazFfZmQpIHsKLQljbG9zZShqb3lzdGljazFfZmQpOwotCWZyZWUoYXhpczEpOwotCWZyZWUoYnV0czEpOwotCWpveXN0aWNrMV9mZCA9IDA7Ci0JfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5zdmdhIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuc3ZnYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNThhMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5zdmdhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgVGhlIFN1cGVyVkdBIEtpdCAtIFVuaVZCRSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBLaXQKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgSUJNIFBDIChNUyBET1MpCi0qCi0qIERlc2NyaXB0aW9uOiAgUm91dGluZXMgdG8gcHJvdmlkZSBhIExpbnV4IGV2ZW50IHF1ZXVlLCB3aGljaCBhdXRvbWF0aWNhbGx5Ci0qICAgICAgICAgICAgICAgaGFuZGxlcyBrZXlib2FyZCBhbmQgbW91c2UgZXZlbnRzIGZvciB0aGUgTGludXggY29tcGF0YWJpbGl0eQotKiAgICAgICAgICAgICAgIGxpYnJhcmllcy4gQmFzZWQgb24gdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUgaW4gdGhlIE1HTC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tleWJvYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgva2QuaD4KLSNpbmNsdWRlIDxsaW51eC92dC5oPgotI2luY2x1ZGUgPGdwbS5oPgotI2luY2x1ZGUgInBtLmgiCi0jaW5jbHVkZSAidmVzYXZiZS5oIgotI2luY2x1ZGUgIndkaXJlY3QuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBFVkVOVFFTSVpFICAxMDAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGV2ZW50cyBpbiBldmVudCBxdWV1ZSAgKi8KLQotc3RhdGljIGludCAgICAgIGhlYWQgPSAtMTsgICAgICAgICAgLyogSGVhZCBvZiBldmVudCBxdWV1ZSAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICB0YWlsID0gLTE7ICAgICAgICAgIC8qIFRhaWwgb2YgZXZlbnQgcXVldWUgICAgICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgZnJlZUhlYWQgPSAtMTsgICAgICAvKiBIZWFkIG9mIGZyZWUgbGlzdCAgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgIGNvdW50ID0gMDsgICAgICAgICAgLyogTm8uIG9mIGl0ZW1zIGN1cnJlbnRseSBpbiBxdWV1ZSAgKi8KLXN0YXRpYyBXRF9ldmVudCBldnRxW0VWRU5UUVNJWkVdOyAgIC8qIFRoZSBxdWV1ZSBzdHJ1Y3R1cmUgaXRzZWxmICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBvbGRNb3ZlID0gLTE7ICAgICAgIC8qIFByZXZpb3VzIG1vdmVtZW50IGV2ZW50ICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgb2xkS2V5ID0gLTE7ICAgICAgICAvKiBQcmV2aW91cyBrZXkgcmVwZWF0IGV2ZW50ICAgICAgICAqLwotc3RhdGljIGludCAgICAgIG14LG15OyAgICAgICAgICAgICAgLyogQ3VycmVudCBtb3VzZSBwb3NpdGlvbiAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICB4UmVzLHlSZXM7ICAgICAgICAgIC8qIFNjcmVlbiByZXNvbHV0aW9uIGNvb3JkaW5hdGVzICAgICovCi1zdGF0aWMgdm9pZCAgICAgKnN0YXRlQnVmOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGNvbnNvbGUgc3RhdGUgYnVmZmVyICAqLwotc3RhdGljIGludCAgICAgIGNvbm47ICAgICAgICAgICAgICAgLyogR1BNIGZpbGUgZGVzY3JpcHRvciBmb3IgbW91c2UgaGFuZGxpbmcgKi8KLXN0YXRpYyBpbnQgICAgICB0dHlfZmQ7ICAgICAgICAgICAgIC8qIEZpbGUgZGVzY3JpcHRvciBmb3IgL2Rldi9jb25zb2xlICovCi1leHRlcm4gaW50ICAgICAgdHR5X3ZjOyAgICAgICAgICAgICAvKiBWaXJ0dWFsIGNvbnNvbGUgSUQsIGZyb20gdGhlIFBNL1BybyBsaWJyYXJ5ICovCi1zdGF0aWMgaWJvb2wgICAga2V5X2Rvd25bMTI4XTsgICAgICAvKiBTdGF0ZSBvZiBhbGwga2V5Ym9hcmQga2V5cyAgICAgICAqLwotc3RhdGljIHN0cnVjdCB0ZXJtaW9zIG9sZF9jb25mOyAgICAgLyogU2F2ZWQgdGVybWluYWwgY29uZmlndXJhdGlvbiAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBvbGRrYm1vZGU7ICAgICAgICAgIC8qIGFuZCBwcmV2aW91cyBrZXlib2FyZCBtb2RlICAgICAgICovCi1zdHJ1Y3QgdnRfbW9kZSAgb2xkdnRtb2RlOyAgICAgICAgICAvKiBPbGQgdmlydHVhbCB0ZXJtaW5hbCBtb2RlICAgICAgICAqLwotc3RhdGljIGludCAgICAgIG9sZF9mbGFnczsgICAgICAgICAgLyogT2xkIGZsYWdzIGZvciBmY250bCAgICAgICAgICAgICAgKi8KLXN0YXRpYyB1bG9uZyAgICBrZXlfbW9kaWZpZXJzOyAgICAgIC8qIEtleWJvYXJkIG1vZGlmaWVycyAgICAgICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgZm9yYmlkX3Z0X3JlbGVhc2U9MDsvKiBGbGFnIHRvIGZvcmJpZCByZWxlYXNlIG9mIFZUICAgICAqLwotc3RhdGljIGludCAgICAgIGZvcmJpZF92dF9hY3F1aXJlPTA7LyogRmxhZyB0byBmb3JiaWQgY2F0dXJlIG9mIFZUICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBvbGRtb2RlOyAgICAgICAgICAgIC8qIE9sZCBTVkdBIG1vZGUgc2F2ZWQgZm9yIFZUIHN3aXRjaCovCi1zdGF0aWMgaW50ICAgICAgaW5pdG1vZGU7ICAgICAgICAgICAvKiBJbml0aWFsIHRleHQgbW9kZSAgICAgICAgICAgICAgICAqLwotc3RhdGljIGlib29sICAgIGluc3RhbGxlZCA9IGZhbHNlOyAgLyogVHJ1ZSBpZiB3ZSBhcmUgaW5zdGFsbGVkICAgICAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAoX0FTTUFQSSAqbW92ZUN1cnNvcikoaW50IHgsaW50IHkpID0gTlVMTDsKLXN0YXRpYyBpbnQgICAgICAoX0FTTUFQSSAqc3VzcGVuZEFwcENhbGxiYWNrKShpbnQgZmxhZ3MpID0gTlVMTDsKLQotI2lmIDAKLS8qIEtleWJvYXJkIFRyYW5zbGF0aW9uIHRhYmxlIGZyb20gc2NhbmNvZGVzIHRvIEFTQ0lJICovCi0KLXN0YXRpYyB1Y2hhciBrZXlUYWJsZVsxMjhdID0KLSJcMFwwMzMxMjM0NTY3ODkwLT1cMDEwIgotIlwwMTFxd2VydHl1aW9wW11cMDE1IgotIlwwYXNkZmdoamtsOydgXDBcXCIKLSJ6eGN2Ym5tLC4vXDAqXDAgXDAiCi0iXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiAgICAgIC8qIEZ1bmN0aW9uIGtleXMgKi8KLSI3ODktNDU2KzEyMzAuXDBcMFwwXDBcMCIgICAgICAgLyogS2V5cGFkIGtleXMgKi8KLSJcMFwwXDBcMFwwXDBcMFwwMTVcMC8iOwotCi1zdGF0aWMgdWNoYXIga2V5VGFibGVTaGlmdGVkWzEyOF0gPQotIlwwXDAzMyFAIyQlXiYqKClfK1wwMTAiCi0iXDAxMVFXRVJUWVVJT1B7fVwwMTUiCi0iXDBBU0RGR0hKS0w6XCJ+XDB8IgotIlpYQ1ZCTk08Pj9cMCpcMCBcMCIKLSJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiICAgICAgLyogRnVuY3Rpb24ga2V5cyAqLwotIjc4OS00NTYrMTIzMC5cMFwwXDBcMFwwIiAgICAgICAvKiBLZXlwYWQga2V5cyAqLwotIlwwXDBcMFwwXDBcMFwwXDAxNVwwLyI7Ci0jZW5kaWYKLQotLyogTWFjcm9zIHRvIGtlZXAgdHJhY2sgb2YgdGhlIENBUFMgYW5kIE5VTSBsb2NrIHN0YXRlcyAqLwotCi0jZGVmaW5lIEVWVF9DQVBTU1RBVEUgICAweDAxMDAKLSNkZWZpbmUgRVZUX05VTVNUQVRFICAgIDB4MDIwMAotCi0vKiBIZWxwZXIgbWFjcm9zIGZvciBkZWFsaW5nIHdpdGggdGltZXJzICovCi0KLSNkZWZpbmUgVElDS1NfVE9fVVNFQyh0KSAoKHQpKjY1NTM2LjAvMS4xOTMxODApCi0jZGVmaW5lIFVTRUNfVE9fVElDS1ModSkgKCh1KSoxLjE5MzE4MC82NTUzNi4wKQotCi0vKiBOdW1iZXIgb2Yga2V5Y29kZXMgdG8gcmVhZCBhdCBhIHRpbWUgZnJvbSB0aGUgY29uc29sZSAqLwotCi0jZGVmaW5lIEtCRFJFQURCVUZGRVJTSVpFIDMyCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIHN0YW1wIGluIHVuaXRzIG9mIDE4LjIgdGlja3MgcGVyIHNlY29uZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgZ2V0VGltZVN0YW1wKHZvaWQpCi17Ci0gICAgcmV0dXJuICh1bG9uZykoY2xvY2soKSAvIChDTE9DS1NfUEVSX1NFQyAvIDE4LjIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1ldnQgLSBFdmVudCB0byBwbGFjZSBvbnRvIGV2ZW50IHF1ZXVlCi0KLVJFTUFSS1M6Ci1BZGRzIGFuIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZSBieSB0YWNraW5nIGl0IG9udG8gdGhlIHRhaWwgb2YgdGhlIGV2ZW50Ci1xdWV1ZS4gVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBhdCBsZWFzdCBvbmUgc3BvdCBpcyBhdmFpbGFibGUgb24gdGhlCi1mcmVlTGlzdCBmb3IgdGhlIGV2ZW50IHRvIGJlIGluc2VydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkZEV2ZW50KAotICAgIFdEX2V2ZW50ICpldnQpCi17Ci0gICAgaW50ICAgICAgICAgZXZ0SUQ7Ci0KLSAgICAvKiBHZXQgc3BvdCB0byBwbGFjZSB0aGUgZXZlbnQgZnJvbSB0aGUgZnJlZSBsaXN0ICovCi0gICAgZXZ0SUQgPSBmcmVlSGVhZDsKLSAgICBmcmVlSGVhZCA9IGV2dHFbZnJlZUhlYWRdLm5leHQ7Ci0KLSAgICAvKiBBZGQgdG8gdGhlIHRhaWwgb2YgdGhlIGV2ZW50IHF1ZXVlICAgKi8KLSAgICBldnQtPm5leHQgPSAtMTsKLSAgICBldnQtPnByZXYgPSB0YWlsOwotICAgIGlmICh0YWlsICE9IC0xKQotICAgICAgICBldnRxW3RhaWxdLm5leHQgPSBldnRJRDsKLSAgICBlbHNlCi0gICAgICAgIGhlYWQgPSBldnRJRDsKLSAgICB0YWlsID0gZXZ0SUQ7Ci0gICAgZXZ0cVtldnRJRF0gPSAqZXZ0OwotICAgIGNvdW50Kys7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotd2hhdCAgICAgICAgLSBFdmVudCBjb2RlCi1tZXNzYWdlICAgICAtIEV2ZW50IG1lc3NhZ2UKLW1vZGlmaWVycyAgIC0ga2V5Ym9hcmQgbW9kaWZpZXJzCi14ICAgICAgICAgICAtIE1vdXNlIFggcG9zaXRpb24gYXQgdGltZSBvZiBldmVudAoteSAgICAgICAgICAgLSBNb3VzZSBZIHBvc2l0aW9uIGF0IHRpbWUgb2YgZXZlbnQKLWJ1dF9zdGF0ICAgIC0gTW91c2UgYnV0dG9uIHN0YXR1cyBhdCB0aW1lIG9mIGV2ZW50Ci0KLVJFTUFSS1M6Ci1BZGRzIGEgbmV3IG1vdXNlIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tCi13aXRoaW4gdGhlIG1vdXNlIGludGVycnVwdCBzdWJyb3V0aW5lLCBzbyBpdCBtdXN0IGJlIGVmZmljaWVudC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGRNb3VzZUV2ZW50KAotICAgIHVpbnQgd2hhdCwKLSAgICB1aW50IG1lc3NhZ2UsCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgdWludCBidXRfc3RhdCkKLXsKLSAgICBXRF9ldmVudCAgICBldnQ7Ci0KLSAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0gICAgICAgIGV2dC53aGF0ID0gd2hhdDsKLSAgICAgICAgZXZ0LndoZW4gPSBnZXRUaW1lU3RhbXAoKTsKLSAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBldnQubW9kaWZpZXJzID0gYnV0X3N0YXQgfCBrZXlfbW9kaWZpZXJzOwotICAgICAgICBldnQud2hlcmVfeCA9IHg7Ci0gICAgICAgIGV2dC53aGVyZV95ID0geTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIoJWQsJWQpLCBidXR0b25zICVsZFxuIiwgeCx5LCBldnQubW9kaWZpZXJzKTsKLSAgICAgICAgYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0gICAgICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuY29kZSAgICAtIFJhdyBrZXlib2FyZCBzY2FuIGNvZGUKLW1vZGlmaWVycyAgIC0gS2V5Ym9hcmQgbW9kaWZpZXJzIGZsYWdzCi0KLVJFTUFSS1M6Ci1Db252ZXJ0cyB0aGUgcmF3IHNjYW4gY29kZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBBU0NJSSBjb2RlIHVzaW5nIHRoZSBzY2FuCi1jb2RlIGFuZCB0aGUga2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIGdldEtleU1lc3NhZ2UoCi0gICAgdWludCBzY2FuY29kZSwKLSAgICB1bG9uZyBtb2RpZmllcnMpCi17Ci0gICAgdXNob3J0ICBjb2RlID0gc2NhbmNvZGUgPDwgODsKLSAgICB1c2hvcnQgIGFzY2lpOwotICAgIHN0cnVjdCBrYmVudHJ5IGtlOwotCi0gICAga2Uua2JfaW5kZXggPSBzY2FuY29kZTsKLQotICAgIC8qIEZpbmQgdGhlIGJhc2ljIEFTQ0lJIGNvZGUgZm9yIHRoZSBzY2FuIGNvZGUgKi8KLSAgICBpZiAobW9kaWZpZXJzICYgRVZUX0NBUFNTVEFURSkgewotICAgICAgICBpZiAobW9kaWZpZXJzICYgRVZUX1NISUZUS0VZKQotICAgICAgICAgIGtlLmtiX3RhYmxlID0gS19OT1JNVEFCOwotICAgICAgICAvLyAgICAgICAgICBhc2NpaSA9IHRvbG93ZXIoa2V5VGFibGVTaGlmdGVkW3NjYW5jb2RlXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBrZS5rYl90YWJsZSA9IEtfU0hJRlRUQUI7Ci0gICAgICAgIC8vICAgICAgICAgIGFzY2lpID0gdG91cHBlcihrZXlUYWJsZVtzY2FuY29kZV0pOwotICAgICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChtb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpCi0gICAgICAgICAga2Uua2JfdGFibGUgPSBLX1NISUZUVEFCOwotICAgICAgICAgIC8vIGFzY2lpID0ga2V5VGFibGVTaGlmdGVkW3NjYW5jb2RlXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGtlLmtiX3RhYmxlID0gS19OT1JNVEFCOwotICAgICAgICAgIC8vIGFzY2lpID0ga2V5VGFibGVbc2NhbmNvZGVdOwotICAgICAgICB9Ci0gICAgaWYobW9kaWZpZXJzICYgRVZUX0FMVFNUQVRFKQotICAgICAga2Uua2JfdGFibGUgfD0gS19BTFRUQUI7Ci0KLSAgICBpZiAoaW9jdGwodHR5X2ZkLCBLREdLQkVOVCwgKHVuc2lnbmVkIGxvbmcpJmtlKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIktER0tCRU5UIGF0IGluZGV4ICVkIGluIHRhYmxlICVkOiAiLAotICAgICAgICAgICAgc2NhbmNvZGUsIGtlLmtiX3RhYmxlKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGFzY2lpID0ga2Uua2JfdmFsdWU7Ci0KLSAgICAvKiBBZGQgQVNDSUkgY29kZSBpZiBrZXkgaXMgbm90IGFsdCdlZCBvciBjdHJsJ2VkICovCi0gICAgaWYgKCEobW9kaWZpZXJzICYgKEVWVF9BTFRTVEFURSB8IEVWVF9DVFJMU1RBVEUpKSkKLSAgICAgICAgY29kZSB8PSBhc2NpaTsKLQotICAgIHJldHVybiBjb2RlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXdoYXQgICAgICAgIC0gRXZlbnQgY29kZQotc2NhbmNvZGUgICAgLSBSYXcgc2NhbmNvZGUgb2Yga2V5Ym9hcmQgZXZlbnQgdG8gYWRkCi0KLVJFTUFSS1M6Ci1BZGRzIGEgbmV3IGtleWJvYXJkIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZS4gV2Ugb25seSB0YWtlIEtFWVVQIGFuZAotS0VZRE9XTiBldmVudCBjb2RlcywgaG93ZXZlciBpZiBhIGtleSBpcyBhbHJlYWR5IGRvd24gd2UgY29udmVydCB0aGUgS0VZRE9XTgotdG8gYSBLRVlSRVBFQVQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRkS2V5RXZlbnQoCi0gICAgdWludCB3aGF0LAotICAgIHVpbnQgc2NhbmNvZGUpCi17Ci0gICAgV0RfZXZlbnQgICAgZXZ0OwotCi0gICAgaWYgKGNvdW50IDwgRVZFTlRRU0laRSkgewotICAgICAgICBldnQud2hhdCA9IHdoYXQ7Ci0gICAgICAgIGV2dC53aGVuID0gZ2V0VGltZVN0YW1wKCk7Ci0gICAgICAgIGV2dC5tZXNzYWdlID0gZ2V0S2V5TWVzc2FnZShzY2FuY29kZSxrZXlfbW9kaWZpZXJzKSB8IDB4MTAwMDBVTDsKLSAgICAgICAgZXZ0LndoZXJlX3ggPSBldnQud2hlcmVfeSA9IDA7Ci0gICAgICAgIGV2dC5tb2RpZmllcnMgPSBrZXlfbW9kaWZpZXJzOwotICAgICAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVVQKQotICAgICAgICAgICAga2V5X2Rvd25bc2NhbmNvZGVdID0gZmFsc2U7Ci0gICAgICAgIGVsc2UgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlET1dOKSB7Ci0gICAgICAgICAgICBpZiAoa2V5X2Rvd25bc2NhbmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZEtleSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBldnRxW29sZEtleV0ubWVzc2FnZSArPSAweDEwMDAwVUw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOwotICAgICAgICAgICAgICAgICAgICBvbGRLZXkgPSBmcmVlSGVhZDsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7Ci0gICAgICAgICAgICAgICAgICAgIG9sZE1vdmUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBrZXlfZG93bltzY2FuY29kZV0gPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGFkZEV2ZW50KCZldnQpOwotICAgICAgICBvbGRNb3ZlID0gLTE7Ci0gICAgICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zaWcgLSBTaWduYWwgYmVpbmcgc2VudCB0byB0aGlzIHNpZ25hbCBoYW5kbGVyCi0KLVJFTUFSS1M6Ci1TaWduYWwgaGFuZGxlciBmb3IgdGhlIHRpbWVyLiBUaGlzIHJvdXRpbmUgdGFrZXMgY2FyZSBvZiBwZXJpb2RpY2FsbHkKLXBvc3RpbmcgdGltZXIgZXZlbnRzIHRvIHRoZSBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHRpbWVySGFuZGxlcigKLSAgICBpbnQgc2lnKQotewotICAgIFdEX2V2ZW50ICAgIGV2dDsKLQotICAgIGlmIChzaWcgPT0gU0lHQUxSTSkgewotICAgICAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0gICAgICAgICAgICBldnQud2hlbiA9IGdldFRpbWVTdGFtcCgpOwotICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfVElNRVJUSUNLOwotICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSAwOwotICAgICAgICAgICAgZXZ0LndoZXJlX3ggPSBldnQud2hlcmVfeSA9IDA7Ci0gICAgICAgICAgICBldnQubW9kaWZpZXJzID0gMDsKLSAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOwotICAgICAgICAgICAgb2xkTW92ZSA9IC0xOwotICAgICAgICAgICAgb2xkS2V5ID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHNpZ25hbChTSUdBTFJNLCB0aW1lckhhbmRsZXIpOwotICAgICAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgdGVybWluYWwgdG8gbm9ybWFsIG9wZXJhdGlvbiBvbiBleGl0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcmVzdG9yZV90ZXJtKHZvaWQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKGluc3RhbGxlZCkgewotICAgICAgICAvKiBSZXN0b3JlIHRleHQgbW9kZSBhbmQgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlICovCi0gICAgICAgIHJlZ3MueC5heCA9IDB4MzsKLSAgICAgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsdHR5X2ZkKTsKLQotICAgICAgICAvKiBSZXN0b3JlIGNvbnNvbGUgdG8gbm9ybWFsIG9wZXJhdGlvbiAqLwotICAgICAgICBpb2N0bCh0dHlfZmQsIFZUX1NFVE1PREUsICZvbGR2dG1vZGUpOwotICAgICAgICBpb2N0bCh0dHlfZmQsIEtEU0tCTU9ERSwgb2xka2Jtb2RlKTsKLSAgICAgICAgdGNzZXRhdHRyKHR0eV9mZCwgVENTQUZMVVNILCAmb2xkX2NvbmYpOwotICAgICAgICBmY250bCh0dHlfZmQsRl9TRVRGTCxvbGRfZmxhZ3MgJj0gfk9fTk9OQkxPQ0spOwotICAgICAgICBQTV9jbG9zZUNvbnNvbGUodHR5X2ZkKTsKLQotICAgICAgICAvKiBDbG9zZSB0aGUgbW91c2UgZHJpdmVyICovCi0gICAgICAgIGNsb3NlKGNvbm4pOwotCi0gICAgICAgIC8qIEZsYWcgdGhhdCB3ZSBhcmUgbm90IG5vIGxvbmdlciBpbnN0YWxsZWQgKi8KLSAgICAgICAgaW5zdGFsbGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TaWduYWwgaGFuZGxlciB0byBjYXB0dXJlIGZvcmNlZCBwcm9ncmFtIHRlcm1pbmF0aW9uIGNvbmRpdGlvbnMgc28gdGhhdAotd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGV4aXRIYW5kbGVyKGludCBzaWcpCi17Ci0gICAgZXhpdCgtMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2xlZXAgdW50aWwgdGhlIHZpcnR1YWwgdGVybWluYWwgaXMgYWN0aXZlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB3YWl0X3Z0X2FjdGl2ZSh2b2lkKQotewotICAgIHdoaWxlIChpb2N0bCh0dHlfZmQsIFZUX1dBSVRBQ1RJVkUsIHR0eV92YykgPCAwKSB7Ci0gICAgICAgIGlmICgoZXJybm8gIT0gRUFHQUlOKSAmJiAoZXJybm8gIT0gRUlOVFIpKSB7Ci0gICAgICAgICAgICBwZXJyb3IoImlvY3RsKFZUX1dBSVRBQ1RJVkUpIik7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB1c2xlZXAoMTUwMDAwKTsKLSAgICAgICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNpZ25hbCBoYW5kbGVyIGNhbGxlZCB3aGVuIG91ciB2aXJ0dWFsIHRlcm1pbmFsIGhhcyBiZWVuIHJlbGVhc2VkIGFuZCB3ZSBhcmUKLWxvc2luZyB0aGUgYWN0aXZlIGZvY3VzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHJlbGVhc2VfdnRfc2lnbmFsKGludCBuKQotewotICAgIGZvcmJpZF92dF9hY3F1aXJlID0gMTsKLSAgICBpZiAoZm9yYmlkX3Z0X3JlbGVhc2UpIHsKLSAgICAgICAgZm9yYmlkX3Z0X2FjcXVpcmUgPSAwOwotICAgICAgICBpb2N0bCh0dHlfZmQsIFZUX1JFTERJU1AsIDApOwotICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgIC8vIFRPRE86IENhbGwgdGhlIHVzZXIgc3VwcGxpZWQgc3VzcGVuZEFwcENhbGxiYWNrIGFuZCByZXN0b3JlIHRleHQKLSAgICAvLyAgICAgICBtb2RlIChzYXZpbmcgdGhlIGV4aXN0aW5nIG1vZGUgc28gd2UgY2FuIHJlc3RvcmUgaXQpLgotICAgIC8vCi0gICAgLy8gICAgICAgQWxzbyBpZiB0aGUgc3VzcGVuZEFwcENhbGxiYWNrIGlzIE5VTEwgdGhlbiB3ZSBoYXZlIHRvCi0gICAgLy8gICAgICAgaWdub3JlIHRoZSBzd2l0Y2ggcmVxdWVzdCEKLSAgICBpZihzdXNwZW5kQXBwQ2FsbGJhY2spewotICAgICAgb2xkbW9kZSA9IFZCRV9nZXRWaWRlb01vZGUoKTsKLSAgICAgIHN1c3BlbmRBcHBDYWxsYmFjayh0cnVlKTsKLSAgICAgIFZCRV9zZXRWaWRlb01vZGUoaW5pdG1vZGUpOwotICAgIH0KLQotICAgIGlvY3RsKHR0eV9mZCwgVlRfUkVMRElTUCwgMSk7Ci0gICAgZm9yYmlkX3Z0X2FjcXVpcmUgPSAwOwotICAgIHdhaXRfdnRfYWN0aXZlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2lnbmFsIGhhbmRsZXIgY2FsbGVkIHdoZW4gb3VyIHZpcnR1YWwgdGVybWluYWwgaGFzIGJlZW4gcmUtYXF1aXJlZCBhbmQgd2UKLWFyZSBub3cgcmVnYWlpbmcgdGhlIGFjdGl2ZSBmb2N1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhY3F1aXJlX3Z0X3NpZ25hbChpbnQgbikKLXsKLSAgICBmb3JiaWRfdnRfcmVsZWFzZSA9IDE7Ci0gICAgaWYgKGZvcmJpZF92dF9hY3F1aXJlKSB7Ci0gICAgICAgIGZvcmJpZF92dF9yZWxlYXNlID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAvLyBUT0RPOiBSZXN0b3JlIHRoZSBvbGQgZGlzcGxheSBtb2RlLCBjYWxsIHRoZSB1c2VyIHN1c3BlbmRBcHBDYWxsYmFjawotICAgIC8vICAgICAgIGFuZCBhbmQgd2Ugd2lsbCBiZSBiYWNrIGluIGdyYXBoaWNzIG1vZGUuCi0KLSAgICBpZihzdXNwZW5kQXBwQ2FsbGJhY2spewotICAgICAgVkJFX3NldFZpZGVvTW9kZShvbGRtb2RlKTsKLSAgICAgIHN1c3BlbmRBcHBDYWxsYmFjayhmYWxzZSk7Ci0gICAgfQotCi0gICAgaW9jdGwodHR5X2ZkLCBWVF9SRUxESVNQLCBWVF9BQ0tBQ1EpOwotICAgIGZvcmJpZF92dF9yZWxlYXNlID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGFjdGlvbiBmb3IgYSBzcGVjaWZpYyBzaWduYWwgdG8gY2FsbCBvdXIgc2lnbmFsIGhhbmRsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2V0X3NpZ2FjdGlvbihpbnQgc2lnLHZvaWQgKCpoYW5kbGVyKShpbnQpKQotewotICAgIHN0cnVjdCBzaWdhY3Rpb24gICAgc2lnYTsKLQotICAgIHNpZ2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgc2lnYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7Ci0gICAgbWVtc2V0KCYoc2lnYS5zYV9tYXNrKSwgMCwgc2l6ZW9mKHNpZ3NldF90KSk7Ci0gICAgc2lnYWN0aW9uKHNpZywgJnNpZ2EsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHRha2Ugb3ZlciBjb250cm9sIG9mIFZUIHN3aXRjaGluZyBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlCi12aXJ0dWFsIHRlcm1pbmFsIHJlbGVhc2UgYW5kIGFxdWlyZSBzaWduYWxzLCBhbGxvd2luZyB1cyB0byBwcm9wZXJseQotc3VwcG9ydCBWVCBzd2l0Y2hpbmcgd2hpbGUgaW4gZ3JhcGhpY3MgbW9kZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdGFrZV92dF9jb250cm9sKHZvaWQpCi17Ci0gICAgc3RydWN0IHZ0X21vZGUgICAgICB2dG1vZGU7Ci0KLSAgICBpb2N0bCh0dHlfZmQsIFZUX0dFVE1PREUsICZ2dG1vZGUpOwotICAgIG9sZHZ0bW9kZSA9IHZ0bW9kZTsKLSAgICB2dG1vZGUubW9kZSA9IFZUX1BST0NFU1M7Ci0gICAgdnRtb2RlLnJlbHNpZyA9IFNJR1VTUjE7Ci0gICAgdnRtb2RlLmFjcXNpZyA9IFNJR1VTUjI7Ci0gICAgc2V0X3NpZ2FjdGlvbihTSUdVU1IxLCByZWxlYXNlX3Z0X3NpZ25hbCk7Ci0gICAgc2V0X3NpZ2FjdGlvbihTSUdVU1IyLCBhY3F1aXJlX3Z0X3NpZ25hbCk7Ci0gICAgaW9jdGwodHR5X2ZkLCBWVF9TRVRNT0RFLCAmb2xkdnRtb2RlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHNoaWZ0IGtleWJvYXJkIExFRCdzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGtleWJvYXJkIG1vZGlmaWVycyBmbGFncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB1cGRhdGVMRURTdGF0dXModm9pZCkKLXsKLSAgICBpbnQgc3RhdGUgPSAwOwotICAgIGlmIChrZXlfbW9kaWZpZXJzICYgRVZUX0NBUFNTVEFURSkKLSAgICAgICAgc3RhdGUgfD0gTEVEX0NBUDsKLSAgICBpZiAoa2V5X21vZGlmaWVycyAmIEVWVF9OVU1TVEFURSkKLSAgICAgICAgc3RhdGUgfD0gTEVEX05VTTsKLSAgICBpb2N0bCh0dHlfZmQsS0RTRVRMRUQsc3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5jb2RlICAgIC0gUmF3IHNjYW4gY29kZSB0byBoYW5kbGUKLQotUkVNQVJLUzoKLUhhbmRsZXMgdGhlIHNoaWZ0IGtleSBtb2RpZmllcnMgYW5kIGtlZXBzIHRyYWNrIG9mIHRoZSBzaGlmdCBrZXkgc3RhdGVzCi1zbyB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIGNvcnJlY3QgQVNDSUkgY29kZXMgZm9yIHRoZSBrZXlib2FyZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0b2dnbGVNb2RpZmllcnMoCi0gICAgaW50IHNjYW5jb2RlKQotewotICAgIHN0YXRpYyBpbnQgY2Fwc19kb3duID0gMCxudW1fZG93biA9IDA7Ci0KLSAgICBpZiAoc2NhbmNvZGUgJiAweDgwKSB7Ci0gICAgICAgIC8qIEhhbmRsZSBrZXktcmVsZWFzZSBmdW5jdGlvbiAqLwotICAgICAgICBzY2FuY29kZSAmPSAweDdGOwotICAgICAgICBpZiAoc2NhbmNvZGUgPT0gMHgyQSB8fCBzY2FuY29kZSA9PSAweDM2KQotICAgICAgICAgICAga2V5X21vZGlmaWVycyAmPSB+RVZUX1NISUZUS0VZOwotICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDFEIHx8IHNjYW5jb2RlID09IDB4NjEpCi0gICAgICAgICAgICBrZXlfbW9kaWZpZXJzICY9IH5FVlRfQ1RSTFNUQVRFOwotICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDM4IHx8IHNjYW5jb2RlID09IDB4NjQpCi0gICAgICAgICAgICBrZXlfbW9kaWZpZXJzICY9IH5FVlRfQUxUU1RBVEU7Ci0gICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4M0EpCi0gICAgICAgICAgICBjYXBzX2Rvd24gPSBmYWxzZTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHg0NSkKLSAgICAgICAgICAgIG51bV9kb3duID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogSGFuZGxlIGtleS1kb3duIGZ1bmN0aW9uICovCi0gICAgICAgIHNjYW5jb2RlICY9IDB4N0Y7Ci0gICAgICAgIGlmIChzY2FuY29kZSA9PSAweDJBIHx8IHNjYW5jb2RlID09IDB4MzYpCi0gICAgICAgICAgICBrZXlfbW9kaWZpZXJzIHw9IEVWVF9TSElGVEtFWTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHgxRCB8fCBzY2FuY29kZSA9PSAweDYxKQotICAgICAgICAgICAga2V5X21vZGlmaWVycyB8PSBFVlRfQ1RSTFNUQVRFOwotICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDM4IHx8IHNjYW5jb2RlID09IDB4NjQpCi0gICAgICAgICAgICBrZXlfbW9kaWZpZXJzIHw9IEVWVF9BTFRTVEFURTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHgzQSkgewotICAgICAgICAgICAgaWYgKCFjYXBzX2Rvd24pIHsKLSAgICAgICAgICAgICAgICBrZXlfbW9kaWZpZXJzIF49IEVWVF9DQVBTU1RBVEU7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTEVEU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2Fwc19kb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHg0NSkgewotICAgICAgICAgICAgaWYgKCFudW1fZG93bikgewotICAgICAgICAgICAgICAgIGtleV9tb2RpZmllcnMgXj0gRVZUX05VTVNUQVRFOwotICAgICAgICAgICAgICAgIHVwZGF0ZUxFRFN0YXR1cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG51bV9kb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhhdCBoYXZlIGNoYW5nZWQgZnJvbSAwIHRvIDEKLShhIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGhhdmUgY2hhbmdlZCBmcm9tIDEgdG8gMCkgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGNvbXBhcmVCaXRzKHNob3J0IGEsIHNob3J0IGIpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgaWYoIChhJjEpICE9IChiJjEpICkgcmV0ICs9IChiJjEpID8gMSA6IC0xOwotICAgIGlmKCAoYSYyKSAhPSAoYiYyKSApIHJldCArPSAoYiYyKSA/IDEgOiAtMTsKLSAgICBpZiggKGEmNCkgIT0gKGImNCkgKSByZXQgKz0gKGImNCkgPyAxIDogLTE7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVR1cm5zIG9mZiBhbGwga2V5Ym9hcmQgc3RhdGUgYmVjYXVzZSB3ZSBjYW4ndCByZWx5IG9uIHRoZW0gYW55bW9yZSBhcyBzb29uCi1hcyB3ZSBzd2l0Y2ggVlQncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQga2V5Ym9hcmRfY2xlYXJzdGF0ZSh2b2lkKQotewotICBrZXlfbW9kaWZpZXJzID0gMDsKLSAgbWVtc2V0KGtleV9kb3duLCAwLCBzaXplb2Yoa2V5X2Rvd24pKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgZXZlbnRzIGZyb20gdGhlIGNvbnNvbGUgZXZlbnQgcXVldWUgaW50byB0aGUgV2luRGlyZWN0IGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHB1bXBFdmVudHModm9pZCkKLXsKLSAgICBzdGF0aWMgdWNoYXIgICAgYnVmW0tCRFJFQURCVUZGRVJTSVpFXTsKLSAgICBzdGF0aWMgY2hhciAgICAgZGF0YVs1XTsKLSAgICBzdGF0aWMgaW50ICAgICAgb2xkX2J1dHMsIG9sZF9teCwgb2xkX215OwotICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0OwotICAgIGZkX3NldCBmZHM7Ci0gICAgaW50ICAgICAgICAgICAgIG51bWtleXMsaTsKLSAgICBpbnQgICAgICAgICAgICAgZHgsIGR5LCBidXRzOwotCi0gICAgLyogUmVhZCBhbGwgcGVuZGluZyBrZXlwcmVzc2VzIGZyb20ga2V5Ym9hcmQgYnVmZmVyIGFuZCBwcm9jZXNzICovCi0gICAgd2hpbGUgKChudW1rZXlzID0gcmVhZCh0dHlfZmQsIGJ1ZiwgS0JEUkVBREJVRkZFUlNJWkUpKSA+IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWtleXM7IGkrKykgewotICAgICAgICAgICAgdG9nZ2xlTW9kaWZpZXJzKGJ1ZltpXSk7Ci0gICAgICAgICAgICBpZiAoa2V5X21vZGlmaWVycyAmIEVWVF9BTFRTVEFURSl7Ci0gICAgICAgICAgICAgIGludCBma2V5ID0gMDsKLQotICAgICAgICAgICAgICAvLyBEbyBWVCBzd2l0Y2hpbmcgaGVyZSBmb3IgQWx0K0Z4IGtleXByZXNzZXMKLSAgICAgICAgICAgICAgc3dpdGNoKGJ1ZltpXSAmIDB4N0YpewotICAgICAgICAgICAgICBjYXNlIDU5IC4uLiA2ODogLyogRjEgdG8gRjEwICovCi0gICAgICAgICAgICAgICAgZmtleSA9IChidWZbaV0gJiAweDdGKSAtIDU4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDg3OiAvKiBGMTEgKi8KLSAgICAgICAgICAgICAgY2FzZSA4ODogLyogRjEyICovCi0gICAgICAgICAgICAgICAgZmtleSA9IChidWZbaV0gJiAweDdGKSAtIDc2OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmKGZrZXkpewotICAgICAgICAgICAgICAgIHN0cnVjdCB2dF9zdGF0IHZ0czsKLSAgICAgICAgICAgICAgICBpb2N0bCh0dHlfZmQsIFZUX0dFVFNUQVRFLCAmdnRzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZihma2V5ICE9IHZ0cy52X2FjdGl2ZSl7Ci0gICAgICAgICAgICAgICAgICBrZXlib2FyZF9jbGVhcnN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICBpb2N0bCh0dHlfZmQsIFZUX0FDVElWQVRFLCBma2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJ1ZltpXSAmIDB4ODApCi0gICAgICAgICAgICAgICAgYWRkS2V5RXZlbnQoRVZUX0tFWVVQLGJ1ZltpXSAmIDB4N0YpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFkZEtleUV2ZW50KEVWVF9LRVlET1dOLGJ1ZltpXSAmIDB4N0YpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IElmIHdlIHdhbnQgdG8gaGFuZGxlIFZDIHN3aXRjaGluZyB3ZSB3aWxsIG5lZWQgdG8gZG8gaXQKLSAgICAgICAgLy8gICAgICAgaW4gaGVyZSBzbyB0aGF0IHdlIGNhbiBzd2l0Y2ggYXdheSBmcm9tIHRoZSBWQyBhbmQgdGhlbgotICAgICAgICAvLyAgICAgICBzd2l0Y2ggYmFjayB0byBpdCBsYXRlci4gUmlnaHQgbm93IFZDIHN3aXRjaGluZyBpcyBkaXNhYmxlZAotICAgICAgICAvLyAgICAgICBhbmQgaW4gb3JkZXIgdG8gZW5hYmxlIGl0IHdlIG5lZWQgdG8gc2F2ZS9yZXN0b3JlIHRoZSBzdGF0ZQotICAgICAgICAvLyAgICAgICBvZiB0aGUgZ3JhcGhpY3Mgc2NyZWVuICh1c2luZyB0aGUgc3VzcGVuZEFwcENhbGxiYWNrIGFuZAotICAgICAgICAvLyAgICAgICBzYXZpbmcvcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBkaXNwbGF5IG1vZGUpLgotCi0gICAgICAgIH0KLQotICAgIC8qIFJlYWQgYWxsIHBlbmRpbmcgbW91c2UgZXZlbnRzIGFuZCBwcm9jZXNzIHRoZW0gKi8KLSAgICBpZihjb25uID4gMCl7Ci0gICAgICAgIEZEX1pFUk8oJmZkcyk7Ci0gICAgICAgIEZEX1NFVChjb25uLCAmZmRzKTsKLSAgICAgICAgdC50dl9zZWMgPSB0LnR2X3VzZWMgPSAwTDsKLSAgICAgICAgd2hpbGUgKHNlbGVjdChjb25uKzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0KSA+IDApIHsKLSAgICAgICAgICAgIGlmKHJlYWQoY29ubiwgZGF0YSwgNSkgPT0gNSl7Ci0gICAgICAgICAgICAgICAgYnV0cyA9ICh+ZGF0YVswXSkgJiAweDA3OwotICAgICAgICAgICAgICAgIGR4ID0gKGNoYXIpKGRhdGFbMV0pICsgKGNoYXIpKGRhdGFbM10pOwotICAgICAgICAgICAgICAgIGR5ID0gLSgoY2hhcikoZGF0YVsyXSkgKyAoY2hhcikoZGF0YVs0XSkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG14ICs9IGR4OyBteSArPSBkeTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZHggfHwgZHkpCi0gICAgICAgICAgICAgICAgICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFTU9WRSwgMCwgbXgsIG15LCBidXRzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoYnV0cyAhPSBvbGRfYnV0cyl7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gY29tcGFyZUJpdHMoYnV0cyxvbGRfYnV0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGM+MCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFRE9XTiwgMCwgbXgsIG15LCBidXRzKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjPDApCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRVVQLCAwLCBteCwgbXksIGJ1dHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvbGRfbXggPSBteDsgb2xkX215ID0gbXk7Ci0gICAgICAgICAgICAgICAgb2xkX2J1dHMgPSBidXRzOwotICAgICAgICAgICAgICAgIEZEX1NFVChjb25uLCAmZmRzKTsKLSAgICAgICAgICAgICAgICB0LnR2X3NlYyA9IHQudHZfdXNlYyA9IDBMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgaW50ZXJmYWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXdoaWNoICAgICAgIC0gV2hpY2ggY29kZSBmb3IgZXZlbnQgdG8gcG9zdAotd2hhdCAgICAgICAgLSBFdmVudCBjb2RlIGZvciBldmVudCB0byBwb3N0Ci1tZXNzYWdlICAgICAtIEV2ZW50IG1lc3NhZ2UKLW1vZGlmaWVycyAgIC0gU2hpZnQga2V5L21vdXNlIGJ1dHRvbiBtb2RpZmllcnMKLQotUkVUVVJOUzoKLVRydWUgaWYgdGhlIGV2ZW50IHdhcyBwb3N0ZWQsIGZhbHNlIGlmIHF1ZXVlIGlzIGZ1bGwuCi0KLVJFTUFSS1M6Ci1Qb3N0cyBhbiBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBjYW4gYmUgdXNlZCB0byBwb3N0IGFueSB0eXBlCi1vZiBldmVudCBpbnRvIHRoZSBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfV0RBUEkgV0RfcG9zdEV2ZW50KAotICAgIHVsb25nIHdoaWNoLAotICAgIHVpbnQgd2hhdCwKLSAgICB1bG9uZyBtZXNzYWdlLAotICAgIHVsb25nIG1vZGlmaWVycykKLXsKLSAgICBXRF9ldmVudCAgICBldnQ7Ci0KLSAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0gICAgICAgIC8qIFNhdmUgaW5mb3JtYXRpb24gaW4gZXZlbnQgcmVjb3JkICovCi0gICAgICAgIGV2dC53aGljaCA9IHdoaWNoOwotICAgICAgICBldnQud2hhdCA9IHdoYXQ7Ci0gICAgICAgIGV2dC53aGVuID0gZ2V0VGltZVN0YW1wKCk7Ci0gICAgICAgIGV2dC5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IG1vZGlmaWVyczsKLSAgICAgICAgYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgIC8qIEFkZCB0byB0YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tYXNrICAgIC0gRXZlbnQgbWFzayB0byB1c2UKLQotUkVNQVJLUzoKLUZsdXNoZXMgYWxsIHRoZSBldmVudCBzcGVjaWZpZWQgaW4gJ21hc2snIGZyb20gdGhlIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1dEQVBJIFdEX2ZsdXNoRXZlbnQoCi0gICAgdWludCBtYXNrKQotewotICAgIFdEX2V2ZW50ICAgIGV2dDsKLQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmx1c2ggYWxsIGV2ZW50cyAqLwotICAgICAgICBXRF9nZXRFdmVudCgmZXZ0LG1hc2spOwotICAgICAgICB9IHdoaWxlIChldnQud2hhdCAhPSBFVlRfTlVMTEVWVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0ICAgICAtIFBsYWNlIHRvIHN0b3JlIGV2ZW50Ci1tYXNrICAgIC0gRXZlbnQgbWFzayB0byB1c2UKLQotUkVNQVJLUzoKLUhhbHRzIHByb2dyYW0gZXhlY3V0aW9uIHVudGlsIGEgc3BlY2lmaWVkIGV2ZW50IG9jY3Vycy4gVGhlIGV2ZW50IGlzCi1yZXR1cm5lZC4gQWxsIHBlbmRpbmcgZXZlbnRzIG5vdCBpbiB0aGUgc3BlY2lmaWVkIG1hc2sgd2lsbCBiZSBpZ25vcmVkIGFuZAotcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9oYWx0RXZlbnQoCi0gICAgV0RfZXZlbnQgKmV2dCwKLSAgICB1aW50IG1hc2spCi17Ci0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciBhbiBldmVudCAgICAqLwotICAgICAgICBXRF9nZXRFdmVudChldnQsRVZUX0VWRVJZRVZUKTsKLSAgICAgICAgfSB3aGlsZSAoIShldnQtPndoYXQgJiBtYXNrKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0ICAgICAtIFBsYWNlIHRvIHN0b3JlIGV2ZW50Ci1tYXNrICAgIC0gRXZlbnQgbWFzayB0byB1c2UKLQotUkVUVVJOUzoKLVRydWUgaWYgYW4gZXZlbnQgd2FzIHBlbmRpbmcuCi0KLVJFTUFSS1M6Ci1SZXRyaWV2ZXMgdGhlIG5leHQgcGVuZGluZyBldmVudCBkZWZpbmVkIGluICdtYXNrJyBmcm9tIHRoZSBldmVudCBxdWV1ZS4KLVRoZSBldmVudCBxdWV1ZSBpcyBhZGp1c3RlZCB0byByZWZsZWN0IHRoZSBuZXcgc3RhdGUgYWZ0ZXIgdGhlIGV2ZW50IGhhcwotYmVlbiByZW1vdmVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9XREFQSSBXRF9nZXRFdmVudCgKLSAgICBXRF9ldmVudCAqZXZ0LAotICAgIHVpbnQgbWFzaykKLXsKLSAgICBpbnQgICAgIGV2dElELG5leHQscHJldjsKLQotICAgIHB1bXBFdmVudHMoKTsKLSAgICBpZiAobW92ZUN1cnNvcikKLSAgICAgICAgbW92ZUN1cnNvcihteCxteSk7ICAgICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgbW91c2UgY3Vyc29yICAgICovCi0gICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gbnVsbCBldmVudCAgICAqLwotCi0gICAgaWYgKGNvdW50KSB7Ci0gICAgICAgIGZvciAoZXZ0SUQgPSBoZWFkOyBldnRJRCAhPSAtMTsgZXZ0SUQgPSBldnRxW2V2dElEXS5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZvdW5kIGFuIGV2ZW50ICAgICAgICAgICAqLwotICAgICAgICAgICAgfQotICAgICAgICBpZiAoZXZ0SUQgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLwotICAgICAgICBuZXh0ID0gZXZ0cVtldnRJRF0ubmV4dDsKLSAgICAgICAgcHJldiA9IGV2dHFbZXZ0SURdLnByZXY7Ci0gICAgICAgIGlmIChwcmV2ICE9IC0xKQotICAgICAgICAgICAgZXZ0cVtwcmV2XS5uZXh0ID0gbmV4dDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGVhZCA9IG5leHQ7Ci0gICAgICAgIGlmIChuZXh0ICE9IC0xKQotICAgICAgICAgICAgZXZ0cVtuZXh0XS5wcmV2ID0gcHJldjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGFpbCA9IHByZXY7Ci0gICAgICAgICpldnQgPSBldnRxW2V2dElEXTsgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZXZlbnQgICAgICAgICAqLwotICAgICAgICBldnRxW2V2dElEXS5uZXh0ID0gZnJlZUhlYWQ7ICAgICAgICAvKiBhbmQgcmV0dXJuIHRvIGZyZWUgbGlzdCAgKi8KLSAgICAgICAgZnJlZUhlYWQgPSBldnRJRDsKLSAgICAgICAgY291bnQtLTsKLSAgICAgICAgaWYgKGV2dC0+d2hhdCA9PSBFVlRfTU9VU0VNT1ZFKQotICAgICAgICAgICAgb2xkTW92ZSA9IC0xOwotICAgICAgICBpZiAoZXZ0LT53aGF0ID09IEVWVF9LRVlSRVBFQVQpCi0gICAgICAgICAgICBvbGRLZXkgPSAtMTsKLSAgICAgICAgfQotICAgIHJldHVybiBldnQtPndoYXQgIT0gRVZUX05VTExFVlQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0ICAgICAtIFBsYWNlIHRvIHN0b3JlIGV2ZW50Ci1tYXNrICAgIC0gRXZlbnQgbWFzayB0byB1c2UKLQotUkVUVVJOUzoKLVRydWUgaWYgYW4gZXZlbnQgaXMgcGVuZGluZy4KLQotUkVNQVJLUzoKLVBlZWtzIGF0IHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgZGVmaW5lZCBpbiAnbWFzaycgaW4gdGhlIGV2ZW50IHF1ZXVlLiBUaGUKLWV2ZW50IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9XREFQSSBXRF9wZWVrRXZlbnQoCi0gICAgV0RfZXZlbnQgKmV2dCwKLSAgICB1aW50IG1hc2spCi17Ci0gICAgaW50ICAgICBldnRJRDsKLQotICAgIHB1bXBFdmVudHMoKTsKLSAgICBpZiAobW92ZUN1cnNvcikKLSAgICAgICAgbW92ZUN1cnNvcihteCxteSk7ICAgICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgbW91c2UgY3Vyc29yICAgICovCi0gICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gbnVsbCBldmVudCAgICAqLwotCi0gICAgaWYgKGNvdW50KSB7Ci0gICAgICAgIGZvciAoZXZ0SUQgPSBoZWFkOyBldnRJRCAhPSAtMTsgZXZ0SUQgPSBldnRxW2V2dElEXS5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZvdW5kIGFuIGV2ZW50ICAgICAgICAgICAqLwotICAgICAgICAgICAgfQotICAgICAgICBpZiAoZXZ0SUQgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLwotCi0gICAgICAgICpldnQgPSBldnRxW2V2dElEXTsgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZXZlbnQgICAgICAgICAqLwotICAgICAgICB9Ci0gICAgcmV0dXJuIGV2dC0+d2hhdCAhPSBFVlRfTlVMTEVWVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1od25kTWFpbiAgICAtIEhhbmRsZSB0byBtYWluIHdpbmRvdwotX3hSZXMgICAgICAgLSBYIHJlc29sdXRpb24gb2YgZ3JhcGhpY3MgbW9kZSB0byBiZSB1c2VkCi1feVJlcyAgICAgICAtIFkgcmVzb2x1bGlvbiBvZiBncmFwaGljcyBtb2RlIHRvIGJlIHVzZWQKLQotUkVUVVJOUzoKLUhhbmRsZSB0byB0aGUgZnVsbHNjcmVlbiBldmVudCB3aW5kb3cgaWYgKHdlIHJldHVybiBod25kTWFpbiBvbiBMaW51eCkKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZwotSVNSIHRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28KLWJ1aWxkIHRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1XRF9IV05EIF9XREFQSSBXRF9zdGFydEZ1bGxTY3JlZW4oCi0gICAgV0RfSFdORCBod25kTWFpbiwKLSAgICBpbnQgX3hSZXMsCi0gICAgaW50IF95UmVzKQotewotICAgIGludCAgICAgICAgICAgICBpOwotICAgIHN0cnVjdCB0ZXJtaW9zICBjb25mOwotICAgIGlmICghaW5zdGFsbGVkKSB7Ci0gICAgICAgIEdwbV9Db25uZWN0IGdwbTsKLQotICAgICAgICAvKiBCdWlsZCBmcmVlIGxpc3QsIGFuZCBpbml0aWFsaXNlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IEVWRU5UUVNJWkU7IGkrKykKLSAgICAgICAgICAgIGV2dHFbaV0ubmV4dCA9IGkrMTsKLSAgICAgICAgZXZ0cVtFVkVOVFFTSVpFLTFdLm5leHQgPSAtMTsgICAgICAgLyogVGVybWluYXRlIGxpc3QgICAgICAgICAgICovCi0gICAgICAgIGNvdW50ID0gZnJlZUhlYWQgPSAwOwotICAgICAgICBoZWFkID0gdGFpbCA9IC0xOwotICAgICAgICBvbGRNb3ZlID0gLTE7Ci0gICAgICAgIG9sZEtleSA9IC0xOwotICAgICAgICB4UmVzID0gX3hSZXM7Ci0gICAgICAgIHlSZXMgPSBfeVJlczsKLQotICAgICAgICAvKiBPcGVuIHRoZSBjb25zb2xlIGRldmljZSBhbmQgaW5pdGlhbGlzZSBpdCBmb3IgcmF3IG1vZGUgKi8KLSAgICAgICAgdHR5X2ZkID0gUE1fb3BlbkNvbnNvbGUoKTsKLQotICAgICAgICAvKiBXYWl0IHVudGlsIHZpcnR1YWwgdGVybWluYWwgaXMgYWN0aXZlIGFuZCB0YWtlIG92ZXIgY29udHJvbCAqLwotICAgICAgICB3YWl0X3Z0X2FjdGl2ZSgpOwotICAgICAgICB0YWtlX3Z0X2NvbnRyb2woKTsKLQotICAgICAgICAvKiBJbml0aWFsaXNlIGtleWJvYXJkIGhhbmRsaW5nIHRvIHJhdyBtb2RlICovCi0gICAgICAgIGlmIChpb2N0bCh0dHlfZmQsIEtER0tCTU9ERSwgJm9sZGtibW9kZSkpIHsKLSAgICAgICAgICAgIHByaW50ZigiV0Rfc3RhcnRGdWxsU2NyZWVuOiBjYW5ub3QgZ2V0IGtleWJvYXJkIG1vZGUuXG4iKTsKLSAgICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICAgICAgfQotICAgICAgICBvbGRfZmxhZ3MgPSBmY250bCh0dHlfZmQsRl9HRVRGTCk7Ci0gICAgICAgIGZjbnRsKHR0eV9mZCxGX1NFVEZMLG9sZF9mbGFncyB8PSBPX05PTkJMT0NLKTsKLSAgICAgICAgdGNnZXRhdHRyKHR0eV9mZCwgJmNvbmYpOwotICAgICAgICBvbGRfY29uZiA9IGNvbmY7Ci0gICAgICAgIGNvbmYuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwgRUNIT05MIHwgTk9GTFNIIHwgSVNJRyk7Ci0gICAgICAgIGNvbmYuY19pZmxhZyAmPSB+KElTVFJJUCB8IElHTkNSIHwgSUNSTkwgfCBJTkxDUiB8IEJSS0lOVCB8IFBBUk1SSyB8IElOUENLIHwgSVVDTEMgfCBJWE9OIHwgSVhPRkYpOwotICAgICAgICBjb25mLmNfaWZsYWcgIHw9IChJR05CUksgfCBJR05QQVIpOwotICAgICAgICBjb25mLmNfY2NbVk1JTl0gPSAxOwotICAgICAgICBjb25mLmNfY2NbVlRJTUVdID0gMDsKLSAgICAgICAgY29uZi5jX2NjW1ZTVVNQXSA9IDA7Ci0gICAgICAgIHRjc2V0YXR0cih0dHlfZmQsIFRDU0FGTFVTSCwgJmNvbmYpOwotICAgICAgICBpb2N0bCh0dHlfZmQsIEtEU0tCTU9ERSwgS19NRURJVU1SQVcpOwotCi0gICAgICAgIC8qIENsZWFyIHRoZSBrZXlib2FyZCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotICAgICAgICBtZW1zZXQoa2V5X2Rvd24sIDAsIHNpemVvZihrZXlfZG93bikpOwotICAgICAgICBpb2N0bCh0dHlfZmQsS0RTRVRMRUQsa2V5X21vZGlmaWVycyA9IDApOwotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIG1vdXNlIGNvbm5lY3Rpb24gCi0gICAgICAgICAgIFRoZSB1c2VyICpNVVNUKiBydW4gZ3BtIHdpdGggdGhlICBvcHRpb24gLVIgZm9yIHRoaXMgdG8gd29yayAob3IgaGF2ZSBhIE1vdXNlU3lzdGVtcyBtb3VzZSkKLSAgICAgICAgKi8KLSAgICAgICAgaWYoR3BtX09wZW4oJmdwbSwwKSA+IDApeyAvKiBHUE0gYXZhaWxhYmxlICovCi0gICAgICAgICAgICBpZiAoKGNvbm4gPSBvcGVuKEdQTV9OT0RFX0ZJRk8sT19SRE9OTFl8T19TWU5DKSkgPCAwKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJXRF9zdGFydEZ1bGxTY3JlZW46IENhbid0IG9wZW4gbW91c2UgY29ubmVjdGlvbi5cbiIpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiB3aGVuIG5vdCB1c2luZyBncG0gLVIsIG9ubHkgTW91c2VTeXN0ZW1zIG1pY2UgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKTsKLSAgICAgICAgICAgIGlmICgoY29ubiA9IG9wZW4oIi9kZXYvbW91c2UiLE9fUkRPTkxZfE9fU1lOQykpIDwgMCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV0Rfc3RhcnRGdWxsU2NyZWVuOiBDYW4ndCBvcGVuIC9kZXYvbW91c2UuXG4iKTsKLSAgICAgICAgfQotICAgICAgICBHcG1fQ2xvc2UoKTsKLQotICAgICAgICAvKiBUT0RPOiBTY2FsZSB0aGUgbW91c2UgY29vcmRpbmF0ZXMgdG8gdGhlIHNwZWNpZmljIHJlc29sdXRpb24gKi8KLQotICAgICAgICAvKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSAqLwotICAgICAgICBpZiAoKHN0YXRlQnVmID0gbWFsbG9jKFBNX2dldENvbnNvbGVTdGF0ZVNpemUoKSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHByaW50ZigiT3V0IG9mIG1lbW9yeSFcbiIpOwotICAgICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIFBNX3NhdmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsdHR5X2ZkKTsKLSAgICAgICAgaW5pdG1vZGUgPSBWQkVfZ2V0VmlkZW9Nb2RlKCk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIHRpbWVyIGV2ZW50cyAqLwotICAgICAgICBzaWduYWwoU0lHQUxSTSwgdGltZXJIYW5kbGVyKTsKLQotICAgICAgICAvKiBDYXB0dXJlIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gICAgICAgIHNpZ25hbChTSUdURVJNLCBleGl0SGFuZGxlcik7Ci0gICAgICAgIHNpZ25hbChTSUdJTlQsIGV4aXRIYW5kbGVyKTsKLSAgICAgICAgc2lnbmFsKFNJR1FVSVQsIGV4aXRIYW5kbGVyKTsKLSAgICAgICAgYXRleGl0KHJlc3RvcmVfdGVybSk7Ci0KLSAgICAgICAgLyogU2lnbmFsIHRoYXQgd2UgYXJlIGluc3RhbGxlZCAqLwotICAgICAgICBpbnN0YWxsZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgcmV0dXJuIGh3bmRNYWluOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxldHMgdGhlIGxpYnJhcnkga25vdyB3aGVuIGZ1bGxzY3JlZW4gZ3JhcGhpY3MgbW9kZSBoYXMgYmVlbiBpbml0aWFsaXplZCBzbwotdGhhdCB3ZSBjYW4gcHJvcGVybHkgc2NhbGUgdGhlIG1vdXNlIGRyaXZlciBjb29yZGluYXRlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9pbkZ1bGxTY3JlZW4odm9pZCkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGluIGhlcmUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1dEQVBJIFdEX3Jlc3RvcmVHREkodm9pZCkKLXsKLSAgICByZXN0b3JlX3Rlcm0oKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci10aWNrcyAgIC0gTnVtYmVyIG9mIHRpY2tzIGJldHdlZW4gdGltZXIgdGljayBtZXNzYWdlcwotCi1SRVRVUk5TOgotUHJldmlvdXMgdmFsdWUgZm9yIHRoZSB0aW1lciB0aWNrIGV2ZW50IHNwYWNpbmcuCi0KLVJFTUFSS1M6Ci1UaGUgZXZlbnQgbW9kdWxlIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBwZXJpb2RpYyB0aW1lciB0aWNrIGV2ZW50cyBmb3IKLXlvdSwgd2l0aCAndGlja3MnIGJldHdlZW4gZWFjaCBldmVudCBwb3N0aW5nLiBJZiB5b3Ugc2V0IHRoZSB2YWx1ZSBvZgotJ3RpY2tzJyB0byAwLCB0aGUgdGltZXIgdGljayBldmVudHMgYXJlIHR1cm5lZCBvZmYuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IF9XREFQSSBXRF9zZXRUaW1lclRpY2soCi0gICAgaW50IHRpY2tzKQotewotICAgIGludCAgICAgICAgICAgICAgICAgb2xkOwotICAgIHN0cnVjdCBpdGltZXJ2YWwgICAgdGltOwotICAgIGxvbmcgICAgICAgICAgICAgICAgbXMgPSBUSUNLU19UT19VU0VDKHRpY2tzKTsKLQotICAgIGdldGl0aW1lcihJVElNRVJfUkVBTCwgJnRpbSk7Ci0gICAgb2xkID0gVVNFQ19UT19USUNLUyh0aW0uaXRfdmFsdWUudHZfc2VjKjEwMDAwMDAuMCArIHRpbS5pdF92YWx1ZS50dl91c2VjKTsKLSAgICB0aW0uaXRfaW50ZXJ2YWwudHZfc2VjICA9IG1zIC8gMTAwMDAwMDsKLSAgICB0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYyA9IG1zICUgMTAwMDAwMDsKLSAgICBzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZ0aW0sIE5VTEwpOwotICAgIHJldHVybiBvbGQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2F2ZVN0YXRlICAgLSBBZGRyZXNzIG9mIHN1c3BlbmQgYXBwIGNhbGxiYWNrIHRvIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1SZWdpc3RlcnMgYSB1c2VyIGFwcGxpY2F0aW9uIHN1cHBsaWVkIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgc28gdGhhdAotd2UgY2FuIHByb3Blcmx5IGhhbmRsZSB2aXJ0dWFsIHRlcm1pbmFsIHN3aXRjaGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCi0gICAgaW50IChfQVNNQVBJICpzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gIHN1c3BlbmRBcHBDYWxsYmFjayA9IHNhdmVTdGF0ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci14ICAgLSBOZXcgWCBjb29yZGluYXRlIHRvIG1vdmUgdGhlIG1vdXNlIGN1cnNvciB0bwoteSAgIC0gTmV3IFkgY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgdG8KLQotUkVNQVJLUzoKLU1vdmVzIHRvIG1vdXNlIGN1cnNvciB0byB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfV0RBUEkgV0Rfc2V0TW91c2VQb3MoCi0gICAgaW50IHgsCi0gICAgaW50IHkpCi17Ci0gICAgbXggPSB4OwotICAgIG15ID0geTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci14ICAgLSBQbGFjZSB0byBzdG9yZSBYIGNvb3JkaW5hdGUgb2YgbW91c2UgY3Vyc29yCi15ICAgLSBQbGFjZSB0byBzdG9yZSBZIGNvb3JkaW5hdGUgb2YgbW91c2UgY3Vyc29yCi0KLVJFTUFSS1M6Ci1SZWFkcyB0aGUgY3VycmVudCBtb3VzZSBjdXJzb3IgbG9jYXRpb24gaW50ICpzY3JlZW4qIGNvb3JkaW5hdGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1dEQVBJIFdEX2dldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgKnggPSBteDsKLSAgICAqeSA9IG15OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1jYiAtIEFkZHJlc3Mgb2YgbW91c2UgY2FsbGJhY2sgZnVuY3Rpb24KLQotUkVNQVJLUzoKLVJlZ2lzdGVycyBhbiBhcHBsaWNhdGlvbiBzdXBwbGllZCBtb3VzZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZAotd2hlbmV2ZXIgdGhlIG1vdXNlIGN1cnNvciBtb3Zlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9zZXRNb3VzZUNhbGxiYWNrKAotICAgIHZvaWQgKF9BU01BUEkgKm1jYikoaW50IHgsaW50IHkpKQotewotICAgIG1vdmVDdXJzb3IgPSBtY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgoteFJlcyAgICAtIE5ldyBYIHJlc29sdXRpb24gb2YgZ3JhcGhpY3MgbW9kZQoteVJlcyAgICAtIE5ldyBZIHJlc29sdXRpb24gb2YgZ3JhcGhpY3MgbW9kZQotCi1SRU1BUktTOgotVGhpcyBpcyBjYWxsZWQgdG8gaW5mb3JtIHRoZSBldmVudCBoYW5kbGluZyBjb2RlIHRoYXQgdGhlIHNjcmVlbiByZXNvbHV0aW9uCi1oYXMgY2hhbmdlZCBzbyB0aGF0IHRoZSBtb3VzZSBjb29yZGluYXRlcyBjYW4gYmUgc2NhbGVkIGFwcHJvcHJpYXRlbHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfV0RBUEkgV0RfY2hhbmdlUmVzb2x1dGlvbigKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICAvLyAgR3BtX0ZpdFZhbHVlcyh4UmVzLCB5UmVzKTsgIC8vID8/Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbmNvZGUgICAgLSBTY2FuIGNvZGUgdG8gY2hlY2sgaWYgYSBrZXkgaXMgZG93bgotCi1SRU1BUktTOgotRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIga2V5IGlzIGRvd24gYmFzZWQgb24gdGhlIHNjYW4gY29kZSBmb3IgdGhlIGtleS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfV0RBUEkgV0RfaXNLZXlEb3duKAotICAgIHVjaGFyIHNjYW5jb2RlKQoteyAgIAotICAgIHJldHVybiBrZXlfZG93bltzY2FuY29kZV07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lcyBpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcnVuIGluIHNhZmUgbW9kZS4gTm90IG5lY2Vzc2FyeSBmb3IKLWFueXRoaW5nIGJ1dCBicm9rZW4gV2luZG93cyA5NSBkaXNwbGF5IGRyaXZlcnMgc28gd2UgcmV0dXJuIGZhbHNlIGZvcgotTGludXguCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IF9XREFQSSBXRF9pc1NhZmVNb2RlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRlZGZiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGFsbCB0aGUgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvdnQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotI2luY2x1ZGUgPGxpbnV4L2pveXN0aWNrLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogSW50ZXJuYWwgZ2xvYmFsIHZhcmlhYmxlcyAqLwotCi1leHRlcm4gaW50IF9QTV9jb25zb2xlX2ZkLF9QTV9sZWRzLF9QTV9tb2RpZmllcnM7Ci0KLS8qIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotdm9pZCBfUE1fcmVzdG9yZV9rYl9tb2RlKHZvaWQpOwotdm9pZCBfUE1fa2V5Ym9hcmRfcmF3bW9kZSh2b2lkKTsKLQotLyogTGludXggbmVlZHMgdGhlIGdlbmVyaWMgam95c3RpY2sgc2NhbGluZyBjb2RlICovCi0KLSNkZWZpbmUgTkVFRF9TQ0FMRV9KT1lfQVhJUwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMmE4MzUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDE4MDkgKzAsMCBAQAotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICAgICAgICAgICAgICAgICBQb3J0aW9ucyBjb3B5cmlnaHQgKEMpIEpvc2ggVmFuZGVyaG9vZgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL2tkLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdnQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzY2FsbC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaWZkZWYgRU5BQkxFX01UUlIKLSNpbmNsdWRlIDxhc20vbXRyci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YXNtL3ZtODYuaD4KLSNpZmRlZiBfX0dMSUJDX18KLSNpbmNsdWRlIDxzeXMvcGVybS5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUkVBTF9NRU1fQkFTRSAgICAgICAoKHZvaWQgKikweDEwMDAwKQotI2RlZmluZSBSRUFMX01FTV9TSVpFICAgICAgIDB4MTAwMDAKLSNkZWZpbmUgUkVBTF9NRU1fQkxPQ0tTICAgICAweDEwMAotI2RlZmluZSBERUZBVUxUX1ZNODZfRkxBR1MgIChJRl9NQVNLIHwgSU9QTF9NQVNLKQotI2RlZmluZSBERUZBVUxUX1NUQUNLX1NJWkUgIDB4MTAwMAotI2RlZmluZSBSRVRVUk5fVE9fMzJfSU5UICAgIDI1NQotCi0vKiBRdWljayBhbmQgZGlydHkgZml4IGZvciB2bTg2KCkgc3lzY2FsbCBmcm9tIGxybWkgMC42ICovCi1zdGF0aWMgaW50Ci12bTg2KHN0cnVjdCB2bTg2X3N0cnVjdCAqdm0pCi0gICAgewotICAgIGludCByOwotI2lmZGVmIF9fUElDX18KLSAgICBhc20gdm9sYXRpbGUgKAotICAgICAicHVzaGwgJSVlYnhcblx0IgotICAgICAibW92bCAlMiwgJSVlYnhcblx0IgotICAgICAiaW50ICQweDgwXG5cdCIKLSAgICAgInBvcGwgJSVlYngiCi0gICAgIDogIj1hIiAocikKLSAgICAgOiAiMCIgKDExMyksICJyIiAodm0pKTsKLSNlbHNlCi0gICAgYXNtIHZvbGF0aWxlICgKLSAgICAgImludCAkMHg4MCIKLSAgICAgOiAiPWEiIChyKQotICAgICA6ICIwIiAoMTEzKSwgImIiICh2bSkpOwotI2VuZGlmCi0gICAgcmV0dXJuIHI7Ci0gICAgfQotCi0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgICAgICAgcmVhZHk7Ci0gICAgdW5zaWduZWQgc2hvcnQgICAgICByZXRfc2VnLCByZXRfb2ZmOwotICAgIHVuc2lnbmVkIHNob3J0ICAgICAgc3RhY2tfc2VnLCBzdGFja19vZmY7Ci0gICAgc3RydWN0IHZtODZfc3RydWN0ICB2bTsKLSAgICB9IGNvbnRleHQgPSB7MH07Ci0KLXN0cnVjdCBtZW1fYmxvY2sgewotICAgIHVuc2lnbmVkIGludCBzaXplIDogMjA7Ci0gICAgdW5zaWduZWQgaW50IGZyZWUgOiAxOwotICAgIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIGludCByZWFkeTsKLSAgICBpbnQgY291bnQ7Ci0gICAgc3RydWN0IG1lbV9ibG9jayBibG9ja3NbUkVBTF9NRU1fQkxPQ0tTXTsKLSAgICB9IG1lbV9pbmZvID0gezB9OwotCi1pbnQgICAgICAgICAgICAgICAgICAgICBfUE1fY29uc29sZV9mZCA9IC0xOwotaW50ICAgICAgICAgICAgICAgICAgICAgX1BNX2xlZHMgPSAwLF9QTV9tb2RpZmllcnMgPSAwOwotc3RhdGljIGlib29sICAgICAgICAgICAgaW5pdGVkID0gZmFsc2U7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICB0dHlfdmMgPSAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgY29uc29sZV9jb3VudCA9IDA7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBzdGFydHVwX3ZjOwotc3RhdGljIGludCAgICAgICAgICAgICAgZmRfbWVtID0gMDsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGluX3Jhd19tb2RlID0gZmFsc2U7Ci0jaWZkZWYgRU5BQkxFX01UUlIKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIG10cnJfZmQ7Ci0jZW5kaWYKLXN0YXRpYyB1aW50IFZFU0FCdWZfbGVuID0gMTAyNDsgICAgIC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCi1zdGF0aWMgdm9pZCAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLwotc3RhdGljIHVpbnQgVkVTQUJ1Zl9yc2VnOyAgICAgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgb2YgVkVTQUJ1ZiAgICAgKi8KLXN0YXRpYyB1aW50IFZFU0FCdWZfcm9mZjsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCi0jaWZkZWYgVFJBQ0VfSU8KLXN0YXRpYyB1bG9uZyAgICAgICAgICAgIHRyYWNlQWRkcjsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgVFJBQ0VfSU8KLWV4dGVybiB2b2lkIHByaW50ayhjaGFyICptc2csLi4uKTsKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgcG9ydF9vdXQoaW50IHZhbHVlLCBpbnQgcG9ydCkKLXsKLSNpZmRlZiBUUkFDRV9JTwotICAgIHByaW50aygiJTA0WDolMDRYOiBvdXRiLiUwNFggPC0gJTAyWFxuIiwgdHJhY2VBZGRyID4+IDE2LCB0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVjaGFyKXZhbHVlKTsKLSNlbmRpZgotICAgIGFzbSB2b2xhdGlsZSAoIm91dGIgJTAsJTEiCi0JICA6OiJhIiAoKHVuc2lnbmVkIGNoYXIpIHZhbHVlKSwgImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcG9ydF9vdXR3KGludCB2YWx1ZSwgaW50IHBvcnQpCi17Ci0jaWZkZWYgVFJBQ0VfSU8KLSAgICBwcmludGsoIiUwNFg6JTA0WDogb3V0dy4lMDRYIDwtICUwNFhcbiIsIHRyYWNlQWRkciA+PiAxNix0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVzaG9ydCl2YWx1ZSk7Ci0jZW5kaWYKLSAgICBhc20gdm9sYXRpbGUgKCJvdXR3ICUwLCUxIgotCSA6OiJhIiAoKHVuc2lnbmVkIHNob3J0KSB2YWx1ZSksICJkIigodW5zaWduZWQgc2hvcnQpIHBvcnQpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBvcnRfb3V0bChpbnQgdmFsdWUsIGludCBwb3J0KQotewotI2lmZGVmIFRSQUNFX0lPCi0gICAgcHJpbnRrKCIlMDRYOiUwNFg6IG91dGwuJTA0WCA8LSAlMDhYXG4iLCB0cmFjZUFkZHIgPj4gMTYsdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1bG9uZyl2YWx1ZSk7Ci0jZW5kaWYKLSAgICBhc20gdm9sYXRpbGUgKCJvdXRsICUwLCUxIgotCSA6OiJhIiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSwgImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwb3J0X2luKGludCBwb3J0KQotewotICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0gICAgYXNtIHZvbGF0aWxlICgiaW5iICUxLCUwIgotCSAgICAgIDoiPWEiICgodW5zaWduZWQgY2hhcil2YWx1ZSkKLQkgICAgICA6ImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotI2lmZGVmIFRSQUNFX0lPCi0gICAgcHJpbnRrKCIlMDRYOiUwNFg6ICBpbmIuJTA0WCAtPiAlMDJYXG4iLCB0cmFjZUFkZHIgPj4gMTYsdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1Y2hhcil2YWx1ZSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBvcnRfaW53KGludCBwb3J0KQotewotICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOwotICAgIGFzbSB2b2xhdGlsZSAoImludyAlMSwlMCIKLQkgICAgICA6Ij1hIiAoKHVuc2lnbmVkIHNob3J0KXZhbHVlKQotCSAgICAgIDoiZCIoKHVuc2lnbmVkIHNob3J0KSBwb3J0KSk7Ci0jaWZkZWYgVFJBQ0VfSU8KLSAgICBwcmludGsoIiUwNFg6JTA0WDogIGludy4lMDRYIC0+ICUwNFhcbiIsIHRyYWNlQWRkciA+PiAxNix0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVzaG9ydCl2YWx1ZSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBvcnRfaW5sKGludCBwb3J0KQotewotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgYXNtIHZvbGF0aWxlICgiaW5sICUxLCUwIgotCSAgICAgIDoiPWEiICgodW5zaWduZWQgbG9uZyl2YWx1ZSkKLQkgICAgICA6ImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotI2lmZGVmIFRSQUNFX0lPCi0gICAgcHJpbnRrKCIlMDRYOiUwNFg6ICBpbmwuJTA0WCAtPiAlMDhYXG4iLCB0cmFjZUFkZHIgPj4gMTYsdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1bG9uZyl2YWx1ZSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhbF9tZW1faW5pdCh2b2lkKQotewotICAgIHZvaWQgICAgKm07Ci0gICAgaW50ICAgICBmZF96ZXJvOwotCi0gICAgaWYgKG1lbV9pbmZvLnJlYWR5KQotCXJldHVybiAxOwotCi0gICAgaWYgKChmZF96ZXJvID0gb3BlbigiL2Rldi96ZXJvIiwgT19SRE9OTFkpKSA9PSAtMSkKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmxlZGdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotICAgIGlmICgobSA9IG1tYXAoKHZvaWQgKilSRUFMX01FTV9CQVNFLCBSRUFMX01FTV9TSVpFLAotCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAotCSAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmRfemVybywgMCkpID09ICh2b2lkICopLTEpIHsKLQljbG9zZShmZF96ZXJvKTsKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmxlZGdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotCX0KLSAgICBtZW1faW5mby5yZWFkeSA9IDE7Ci0gICAgbWVtX2luZm8uY291bnQgPSAxOwotICAgIG1lbV9pbmZvLmJsb2Nrc1swXS5zaXplID0gUkVBTF9NRU1fU0laRTsKLSAgICBtZW1faW5mby5ibG9ja3NbMF0uZnJlZSA9IDE7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGluc2VydF9ibG9jayhpbnQgaSkKLXsKLSAgICBtZW1tb3ZlKAotCW1lbV9pbmZvLmJsb2NrcyArIGkgKyAxLAotCW1lbV9pbmZvLmJsb2NrcyArIGksCi0JKG1lbV9pbmZvLmNvdW50IC0gaSkgKiBzaXplb2Yoc3RydWN0IG1lbV9ibG9jaykpOwotICAgIG1lbV9pbmZvLmNvdW50Kys7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZV9ibG9jayhpbnQgaSkKLXsKLSAgICBtZW1faW5mby5jb3VudC0tOwotCi0gICAgbWVtbW92ZSgKLQltZW1faW5mby5ibG9ja3MgKyBpLAotCW1lbV9pbmZvLmJsb2NrcyArIGkgKyAxLAotCShtZW1faW5mby5jb3VudCAtIGkpICogc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXQodW5zaWduZWQgaW50IGJpdCwgdm9pZCAqYXJyYXkpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqYSA9IGFycmF5OwotICAgIGFbYml0IC8gOF0gfD0gKDEgPDwgKGJpdCAlIDgpKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2ludF9zZWcoaW50IGkpCi17Ci0gICAgcmV0dXJuICoodW5zaWduZWQgc2hvcnQgKikoaSAqIDQgKyAyKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2ludF9vZmYoaW50IGkpCi17Ci0gICAgcmV0dXJuICoodW5zaWduZWQgc2hvcnQgKikoaSAqIDQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHVzaHcodW5zaWduZWQgc2hvcnQgaSkKLXsKLSAgICBzdHJ1Y3Qgdm04Nl9yZWdzICpyID0gJmNvbnRleHQudm0ucmVnczsKLSAgICByLT5lc3AgLT0gMjsKLSAgICAqKHVuc2lnbmVkIHNob3J0ICopKCgodW5zaWduZWQgaW50KXItPnNzIDw8IDQpICsgci0+ZXNwKSA9IGk7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17IHJldHVybiB0cnVlOyB9Ci0KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIHZvaWQgICAgKm07Ci0gICAgdWludCAgICByX3NlZyxyX29mZjsKLQotICAgIGlmIChpbml0ZWQpCi0JcmV0dXJuOwotCi0gICAgLyogTWFwIHRoZSBJbnRlcnJ1cHQgVmVjdG9ycyAoMHgwIC0gMHg0MDApICsgQklPUyBkYXRhICgweDQwMCAtIDB4NTAyKQotICAgICAqIGFuZCB0aGUgcGh5c2ljYWwgZnJhbWVidWZmZXIgYW5kIFJPTSBpbWFnZXMgZnJvbSAoMHhhMDAwMCAtIDB4MTAwMDAwKQotICAgICAqLwotICAgIHJlYWxfbWVtX2luaXQoKTsKLSAgICBpZiAoIWZkX21lbSAmJiAoZmRfbWVtID0gb3BlbigiL2Rldi9tZW0iLCBPX1JEV1IpKSA9PSAtMSkgewotCVBNX2ZhdGFsRXJyb3IoIllvdSBtdXN0IGhhdmUgcm9vdCBwcml2aWxlZ2VzIHRvIHJ1biB0aGlzIHByb2dyYW0hIik7Ci0JfQotICAgIGlmICgobSA9IG1tYXAoKHZvaWQgKikwLCAweDUwMiwKLQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKLQkgICAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIGZkX21lbSwgMCkpID09ICh2b2lkICopLTEpIHsKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotCX0KLSAgICBpZiAoKG0gPSBtbWFwKCh2b2lkICopMHhBMDAwMCwgMHhDMDAwMCAtIDB4QTAwMDAsCi0JICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQsIGZkX21lbSwgMHhBMDAwMCkpID09ICh2b2lkICopLTEpIHsKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotCX0KLSAgICBpZiAoKG0gPSBtbWFwKCh2b2lkICopMHhDMDAwMCwgMHhEMDAwMCAtIDB4QzAwMDAsCi0JICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0JICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCBmZF9tZW0sIDB4QzAwMDApKSA9PSAodm9pZCAqKS0xKSB7Ci0JUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZpbGVnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKLQl9Ci0gICAgaWYgKChtID0gbW1hcCgodm9pZCAqKTB4RDAwMDAsIDB4MTAwMDAwIC0gMHhEMDAwMCwKLQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX0ZJWEVEIHwgTUFQX1NIQVJFRCwgZmRfbWVtLCAweEQwMDAwKSkgPT0gKHZvaWQgKiktMSkgewotCVBNX2ZhdGFsRXJyb3IoIllvdSBtdXN0IGhhdmUgcm9vdCBwcml2aWxlZ2VzIHRvIHJ1biB0aGlzIHByb2dyYW0hIik7Ci0JfQotICAgIGluaXRlZCA9IDE7Ci0KLSAgICAvKiBBbGxvY2F0ZSBhIHN0YWNrICovCi0gICAgbSA9IFBNX2FsbG9jUmVhbFNlZyhERUZBVUxUX1NUQUNLX1NJWkUsJnJfc2VnLCZyX29mZik7Ci0gICAgY29udGV4dC5zdGFja19zZWcgPSByX3NlZzsKLSAgICBjb250ZXh0LnN0YWNrX29mZiA9IHJfb2ZmK0RFRkFVTFRfU1RBQ0tfU0laRTsKLQotICAgIC8qIEFsbG9jYXRlIHRoZSByZXR1cm4gdG8gMzIgYml0IHJvdXRpbmUgKi8KLSAgICBtID0gUE1fYWxsb2NSZWFsU2VnKDIsJnJfc2VnLCZyX29mZik7Ci0gICAgY29udGV4dC5yZXRfc2VnID0gcl9zZWc7Ci0gICAgY29udGV4dC5yZXRfb2ZmID0gcl9vZmY7Ci0gICAgKCh1Y2hhciopbSlbMF0gPSAweENEOyAgICAgICAgIC8qIGludCBvcGNvZGUgKi8KLSAgICAoKHVjaGFyKiltKVsxXSA9IFJFVFVSTl9UT18zMl9JTlQ7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLCAwLCBzaXplb2YoY29udGV4dC52bSkpOwotCi0gICAgLyogRW5hYmxlIGtlcm5lbCBlbXVsYXRpb24gb2YgYWxsIGludHMgZXhjZXB0IFJFVFVSTl9UT18zMl9JTlQgKi8KLSAgICBtZW1zZXQoJmNvbnRleHQudm0uaW50X3JldmVjdG9yZWQsIDAsIHNpemVvZihjb250ZXh0LnZtLmludF9yZXZlY3RvcmVkKSk7Ci0gICAgc2V0X2JpdChSRVRVUk5fVE9fMzJfSU5ULCAmY29udGV4dC52bS5pbnRfcmV2ZWN0b3JlZCk7Ci0gICAgY29udGV4dC5yZWFkeSA9IDE7Ci0jaWZkZWYgRU5BQkxFX01UUlIKLSAgICBtdHJyX2ZkID0gIG9wZW4oIi9kZXYvY3B1L210cnIiLCBPX1JEV1IsIDApOwotICAgIGlmIChtdHJyX2ZkIDwgMCkKLSAgICAgICBtdHJyX2ZkID0gIG9wZW4oIi9wcm9jL210cnIiLCBPX1JEV1IsIDApOwotI2VuZGlmCi0gICAgLyogRW5hYmxlIEkvTyBwZXJtaXNzaW9ucyB0byBkaXJlY3RseSBhY2Nlc3MgSS9PIHBvcnRzLiBXZSBicmVhayB0aGUKLSAgICAgKiBhbGxvY2F0aW9uIGludG8gdHdvIHBhcnRzLCBvbmUgZm9yIHRoZSBwb3J0cyBmcm9tIDAtMHgzRkYgYW5kCi0gICAgICogYW5vdGhlciBmb3IgdGhlIHJlbWFpbmluZyBwb3J0cyB1cCB0byAweEZGRkYuIFN0YW5kYXJkIExpbnV4IGtlcm5lbHMKLSAgICAgKiBvbmx5IGFsbG93IHRoZSBmaXJzdCAweDQwMCBwb3J0cyB0byBiZSBlbmFibGVkLCBzbyB0byBlbmFibGUgYWxsCi0gICAgICogNjU1MzYgcG9ydHMgeW91IG5lZWQgYSBwYXRjaGVkIGtlcm5lbCB0aGF0IHdpbGwgZW5hYmxlIHRoZSBmdWxsCi0gICAgICogOEtiIEkvTyBwZXJtaXNzaW9ucyBiaXRtYXAuCi0gICAgICovCi0jaWZuZGVmIFRSQUNFX0lPCi0gICAgaW9wZXJtKDB4MCwweDQwMCwxKTsKLSAgICBpb3Blcm0oMHg0MDAsMHgxMDAwMC0weDQwMCwxKTsKLSNlbmRpZgotICAgIGlvcGwoMyk7Ci19Ci0KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17IHJldHVybiBfT1NfTElOVVg7IH0KLQotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17IHJldHVybiBQTV8zODY7IH0KLQotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJy8nKSB7Ci0Jc1twb3NdID0gJy8nOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgZXhpdCgxKTsKLX0KLQotc3RhdGljIHZvaWQgRXhpdFZCRUJ1Zih2b2lkKQotewotICAgIGlmIChWRVNBQnVmX3B0cikKLQlQTV9mcmVlUmVhbFNlZyhWRVNBQnVmX3B0cik7Ci0gICAgVkVTQUJ1Zl9wdHIgPSAwOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKQotewotICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKLQkvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KLQlpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JYXRleGl0KEV4aXRWQkVCdWYpOwotCX0KLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7Ci0gICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7Ci0gICAgcmV0dXJuIFZFU0FCdWZfcHRyOwotfQotCi0vKiBOZXcgcmF3IGNvbnNvbGUgYmFzZWQgZ2V0Y2ggYW5kIGtiaGl0IGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIEtCX0NBUFMgICAgIExFRF9DQVAgLyogNCAqLwotI2RlZmluZSBLQl9OVU1MT0NLICBMRURfTlVNIC8qIDIgKi8KLSNkZWZpbmUgS0JfU0NST0xMICAgTEVEX1NDUiAvKiAxICovCi0jZGVmaW5lIEtCX1NISUZUICAgIDgKLSNkZWZpbmUgS0JfQ09OVFJPTCAgMTYKLSNkZWZpbmUgS0JfQUxUICAgICAgMzIKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gc2F2ZSB0aGUga2V5Ym9hcmQgbW9kZSB0byBkaXNrLiBXZSBzYXZlIGl0IHRvIGRpc2sKLSAqIHNvIHRoYXQgd2UgY2FuIHByb3Blcmx5IHJlc3RvcmUgdGhlIG1vZGUgbGF0ZXIgaWYgdGhlIHByb2dyYW0gY3Jhc2hlZC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3RydWN0IHRlcm1pb3MgIHRlcm1pb3M7Ci0gICAgaW50ICAgICAgICAgICAgIGtiX21vZGU7Ci0gICAgaW50ICAgICAgICAgICAgIGxlZHM7Ci0gICAgaW50ICAgICAgICAgICAgIGZsYWdzOwotICAgIGludCAgICAgICAgICAgICBzdGFydHVwX3ZjOwotICAgIH0ga2V5Ym9hcmRfbW9kZTsKLQotLyogTmFtZSBvZiB0aGUgZmlsZSB1c2VkIHRvIHNhdmUga2V5Ym9hcmQgbW9kZSBpbmZvcm1hdGlvbiAqLwotCi0jZGVmaW5lIEtCTU9ERV9EQVQgICJrYm1vZGUuZGF0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW4gdGhlIGtleWJvYXJkIG1vZGUgZmlsZSBvbiBkaXNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBGSUxFICpvcGVuX2tiX21vZGUoCi0gICAgY2hhciAqbW9kZSwKLSAgICBjaGFyICpwYXRoKQotewotICAgIGlmICghUE1fZmluZEJQRCgiZ3JhcGhpY3MuYnBkIixwYXRoKSkKLQlyZXR1cm4gTlVMTDsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsS0JNT0RFX0RBVCk7Ci0gICAgcmV0dXJuIGZvcGVuKHBhdGgsbW9kZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUga2V5Ym9hcmQgdG8gbm9ybWFsIG1vZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9QTV9yZXN0b3JlX2tiX21vZGUodm9pZCkKLXsKLSAgICBGSUxFICAgICAgICAgICAgKmtibW9kZTsKLSAgICBrZXlib2FyZF9tb2RlICAgbW9kZTsKLSAgICBjaGFyICAgICAgICAgICAgcGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICBpZiAoX1BNX2NvbnNvbGVfZmQgIT0gLTEgJiYgKGtibW9kZSA9IG9wZW5fa2JfbW9kZSgicmIiLHBhdGgpKSAhPSBOVUxMKSB7Ci0JaWYgKGZyZWFkKCZtb2RlLDEsc2l6ZW9mKG1vZGUpLGtibW9kZSkgPT0gc2l6ZW9mKG1vZGUpKSB7Ci0JICAgIGlmIChtb2RlLnN0YXJ0dXBfdmMgPiAwKQotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfQUNUSVZBVEUsIG1vZGUuc3RhcnR1cF92Yyk7Ci0JICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNLQk1PREUsIG1vZGUua2JfbW9kZSk7Ci0JICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgbW9kZS5sZWRzKTsKLQkgICAgdGNzZXRhdHRyKF9QTV9jb25zb2xlX2ZkLCBUQ1NBRkxVU0gsICZtb2RlLnRlcm1pb3MpOwotCSAgICBmY250bChfUE1fY29uc29sZV9mZCxGX1NFVEZMLG1vZGUuZmxhZ3MpOwotCSAgICB9Ci0JZmNsb3NlKGtibW9kZSk7Ci0JdW5saW5rKHBhdGgpOwotCWluX3Jhd19tb2RlID0gZmFsc2U7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9QTV9hYm9ydCgKLSAgICBpbnQgc2lnbm8pCi17Ci0gICAgY2hhciAgICBidWZbODBdOwotCi0gICAgc3ByaW50ZihidWYsIlRlcm1pbmF0aW5nIG9uIHNpZ25hbCAlZCIsc2lnbm8pOwotICAgIF9QTV9yZXN0b3JlX2tiX21vZGUoKTsKLSAgICBQTV9mYXRhbEVycm9yKGJ1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHV0IHRoZSBrZXlib2FyZCBpbnRvIHJhdyBtb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfUE1fa2V5Ym9hcmRfcmF3bW9kZSh2b2lkKQotewotICAgIHN0cnVjdCB0ZXJtaW9zIGNvbmY7Ci0gICAgRklMRSAgICAgICAgICAgICprYm1vZGU7Ci0gICAga2V5Ym9hcmRfbW9kZSAgIG1vZGU7Ci0gICAgY2hhciAgICAgICAgICAgIHBhdGhbUE1fTUFYX1BBVEhdOwotICAgIGludCAgICAgICAgICAgICBpOwotICAgIHN0YXRpYyBpbnQgc2lnX2xpc3RbXSA9IHsKLQlTSUdIVVAsCi0JU0lHSU5ULAotCVNJR1FVSVQsCi0JU0lHSUxMLAotCVNJR1RSQVAsCi0JU0lHQUJSVCwKLQlTSUdJT1QsCi0JU0lHQlVTLAotCVNJR0ZQRSwKLQlTSUdLSUxMLAotCVNJR1NFR1YsCi0JU0lHVEVSTSwKLQl9OwotCi0gICAgaWYgKChrYm1vZGUgPSBvcGVuX2tiX21vZGUoInJiIixwYXRoKSkgPT0gTlVMTCkgewotCWlmICgoa2Jtb2RlID0gb3Blbl9rYl9tb2RlKCJ3YiIscGF0aCkpID09IE5VTEwpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBvcGVuIGtibW9kZS5kYXQgZmlsZSBmb3Igd3JpdGluZyEiKTsKLQlpZiAoaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtER0tCTU9ERSwgJm1vZGUua2JfbW9kZSkpCi0JICAgIHBlcnJvcigiS0RHS0JNT0RFIik7Ci0JaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtER0VUTEVELCAmbW9kZS5sZWRzKTsKLQlfUE1fbGVkcyA9IG1vZGUubGVkcyAmIDB4RjsKLQlfUE1fbW9kaWZpZXJzID0gMDsKLQl0Y2dldGF0dHIoX1BNX2NvbnNvbGVfZmQsICZtb2RlLnRlcm1pb3MpOwotCWNvbmYgPSBtb2RlLnRlcm1pb3M7Ci0JY29uZi5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IElTSUcpOwotCWNvbmYuY19pZmxhZyAmPSB+KElTVFJJUCB8IElHTkNSIHwgSUNSTkwgfCBJTkxDUiB8IEJSS0lOVCB8IFBBUk1SSyB8IElOUENLIHwgSVVDTEMgfCBJWE9OIHwgSVhPRkYpOwotCWNvbmYuY19pZmxhZyAgfD0gKElHTkJSSyB8IElHTlBBUik7Ci0JY29uZi5jX2NjW1ZNSU5dID0gMTsKLQljb25mLmNfY2NbVlRJTUVdID0gMDsKLQljb25mLmNfY2NbVlNVU1BdID0gMDsKLQl0Y3NldGF0dHIoX1BNX2NvbnNvbGVfZmQsIFRDU0FGTFVTSCwgJmNvbmYpOwotCW1vZGUuZmxhZ3MgPSBmY250bChfUE1fY29uc29sZV9mZCxGX0dFVEZMKTsKLQlpZiAoaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0tCTU9ERSwgS19NRURJVU1SQVcpKQotCSAgICBwZXJyb3IoIktEU0tCTU9ERSIpOwotCWF0ZXhpdChfUE1fcmVzdG9yZV9rYl9tb2RlKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ19saXN0KS9zaXplb2Yoc2lnX2xpc3RbMF0pOyBpKyspCi0JICAgIHNpZ25hbChzaWdfbGlzdFtpXSwgX1BNX2Fib3J0KTsKLQltb2RlLnN0YXJ0dXBfdmMgPSBzdGFydHVwX3ZjOwotCWlmIChmd3JpdGUoJm1vZGUsMSxzaXplb2YobW9kZSksa2Jtb2RlKSAhPSBzaXplb2YobW9kZSkpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIkVycm9yIHdyaXRpbmcga2Jtb2RlLmRhdCEiKTsKLQlmY2xvc2Uoa2Jtb2RlKTsKLQlpbl9yYXdfbW9kZSA9IHRydWU7Ci0JfQotfQotCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICBmZF9zZXQgczsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0diA9IHsgMCwgMCB9OwotCi0gICAgaWYgKGNvbnNvbGVfY291bnQgPT0gMCkKLQlQTV9mYXRhbEVycm9yKCJZb3UgKm11c3QqIG9wZW4gYSBjb25zb2xlIGJlZm9yZSB1c2luZyBQTV9rYmhpdCEiKTsKLSAgICBpZiAoIWluX3Jhd19tb2RlKQotCV9QTV9rZXlib2FyZF9yYXdtb2RlKCk7Ci0gICAgRkRfWkVSTygmcyk7Ci0gICAgRkRfU0VUKF9QTV9jb25zb2xlX2ZkLCAmcyk7Ci0gICAgcmV0dXJuIHNlbGVjdChfUE1fY29uc29sZV9mZCsxLCAmcywgTlVMTCwgTlVMTCwgJnR2KSA+IDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIHN0YXRpYyB1Y2hhciAgICBjOwotICAgIGludCByZWxlYXNlOwotICAgIHN0YXRpYyBzdHJ1Y3Qga2JlbnRyeSBrZTsKLQotICAgIGlmIChjb25zb2xlX2NvdW50ID09IDApCi0JUE1fZmF0YWxFcnJvcigiWW91ICptdXN0KiBvcGVuIGEgY29uc29sZSBiZWZvcmUgdXNpbmcgUE1fZ2V0Y2ghIik7Ci0gICAgaWYgKCFpbl9yYXdfbW9kZSkKLQlfUE1fa2V5Ym9hcmRfcmF3bW9kZSgpOwotICAgIHdoaWxlIChyZWFkKF9QTV9jb25zb2xlX2ZkLCAmYywgMSkgPiAwKSB7Ci0JcmVsZWFzZSA9IGMgJiAweDgwOwotCWMgJj0gMHg3RjsKLQlpZiAocmVsZWFzZSkgewotCSAgICBzd2l0Y2goYyl7Ci0JCWNhc2UgNDI6IGNhc2UgNTQ6IC8qIFNoaWZ0ICovCi0JCSAgICBfUE1fbW9kaWZpZXJzICY9IH5LQl9TSElGVDsKLQkJICAgIGJyZWFrOwotCQljYXNlIDI5OiBjYXNlIDk3OiAvKiBDb250cm9sICovCi0JCSAgICBfUE1fbW9kaWZpZXJzICY9IH5LQl9DT05UUk9MOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgNTY6IGNhc2UgMTAwOiAvKiBBbHQgLyBBbHRHciAqLwotCQkgICAgX1BNX21vZGlmaWVycyAmPSB+S0JfQUxUOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgY29udGludWU7Ci0JICAgIH0KLQlzd2l0Y2ggKGMpIHsKLQkgICAgY2FzZSA0MjogY2FzZSA1NDogLyogU2hpZnQgKi8KLQkJX1BNX21vZGlmaWVycyB8PSBLQl9TSElGVDsKLQkJIGJyZWFrOwotCSAgICBjYXNlIDI5OiBjYXNlIDk3OiAvKiBDb250cm9sICovCi0JCV9QTV9tb2RpZmllcnMgfD0gS0JfQ09OVFJPTDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNTY6IGNhc2UgMTAwOiAvKiBBbHQgLyBBbHRHciAqLwotCQlfUE1fbW9kaWZpZXJzIHw9IEtCX0FMVDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNTg6IC8qIENhcHMgTG9jayAqLwotCQlfUE1fbW9kaWZpZXJzIF49IEtCX0NBUFM7Ci0JCWlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgX1BNX21vZGlmaWVycyAmIDcpOwotCQlicmVhazsKLQkgICAgY2FzZSA2OTogLyogTnVtIExvY2sgKi8KLQkJX1BNX21vZGlmaWVycyBePSBLQl9OVU1MT0NLOwotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9tb2RpZmllcnMgJiA3KTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNzA6IC8qIFNjcm9sbCBMb2NrICovCi0JCV9QTV9tb2RpZmllcnMgXj0gS0JfU0NST0xMOwotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9tb2RpZmllcnMgJiA3KTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMjg6Ci0JCXJldHVybiAweDFDOwotCSAgICBkZWZhdWx0OgotCQlrZS5rYl9pbmRleCA9IGM7Ci0JCWtlLmtiX3RhYmxlID0gMDsKLQkJaWYgKChfUE1fbW9kaWZpZXJzICYgS0JfU0hJRlQpIHx8IChfUE1fbW9kaWZpZXJzICYgS0JfQ0FQUykpCi0JCSAgICBrZS5rYl90YWJsZSB8PSBLX1NISUZUVEFCOwotCQlpZiAoX1BNX21vZGlmaWVycyAmIEtCX0FMVCkKLQkJICAgIGtlLmtiX3RhYmxlIHw9IEtfQUxUVEFCOwotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RHS0JFTlQsICh1bG9uZykma2UpOwotCQljID0ga2Uua2JfdmFsdWUgJiAweEZGOwotCQlyZXR1cm4gYzsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TbGVlcCB1bnRpbCB0aGUgdmlydHVhbCB0ZXJtaW5hbCBpcyBhY3RpdmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB3YWl0X3Z0X2FjdGl2ZSgKLSAgICBpbnQgX1BNX2NvbnNvbGVfZmQpCi17Ci0gICAgd2hpbGUgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9XQUlUQUNUSVZFLCB0dHlfdmMpIDwgMCkgewotCWlmICgoZXJybm8gIT0gRUFHQUlOKSAmJiAoZXJybm8gIT0gRUlOVFIpKSB7Ci0JICAgIHBlcnJvcigiaW9jdGwoVlRfV0FJVEFDVElWRSkiKTsKLQkgICAgZXhpdCgxKTsKLQkgICAgfQotCXVzbGVlcCgxNTAwMDApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVja3MgdGhlIG93bmVyIG9mIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgY2hlY2tfb3duZXIoCi0gICAgaW50IHZjKQotewotICAgIHN0cnVjdCBzdGF0IHNidWY7Ci0gICAgY2hhciBmbmFtZVszMF07Ci0KLSAgICBzcHJpbnRmKGZuYW1lLCAiL2Rldi90dHklZCIsIHZjKTsKLSAgICBpZiAoKHN0YXQoZm5hbWUsICZzYnVmKSA+PSAwKSAmJiAoZ2V0dWlkKCkgPT0gc2J1Zi5zdF91aWQpKQotCXJldHVybiAxOwotICAgIHByaW50ZigiWW91IG11c3QgYmUgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IGNvbnNvbGUgdG8gdXNlIHRoaXMgcHJvZ3JhbS5cbiIpOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNoZWNrcyBpZiB0aGUgY29uc29sZSBpcyBjdXJyZW50bHkgaW4gZ3JhcGhpY3MgbW9kZSwgYW5kIGlmIHNvIHdlIGZvcmNpYmx5Ci1yZXN0b3JlIGl0IGJhY2sgdG8gdGV4dCBtb2RlIGFnYWluLiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBhIE51Y2xldXMgb3IKLU1HTCBwcm9ncmFtIGNyYXNoZXMgYW5kIGxlYXZlcyB0aGUgY29uc29sZSBpbiBncmFwaGljcyBtb2RlLiBSdW5uaW5nIHRoZQotdGV4dG1vZGUgdXRpbGl0eSAob3IgYW55IG90aGVyIE51Y2xldXMvTUdMIHByb2dyYW0pIHZpYSBhIHRlbG5ldCBzZXNzaW9uCi1pbnRvIHRoZSBtYWNoaW5lIHdpbGwgcmVzdG9yZSBpdCBiYWNrIHRvIG5vcm1hbC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZXN0b3JlX3RleHRfY29uc29sZSgKLSAgICBpbnQgY29uc29sZV9pZCkKLXsKLSAgICBpZiAoaW9jdGwoY29uc29sZV9pZCwgS0RTRVRNT0RFLCBLRF9URVhUKSA8IDApCi0JTE9HV0FSTigiaW9jdGwoS0RTRVRNT0RFKSBmYWlsZWQiKTsKLSAgICBfUE1fcmVzdG9yZV9rYl9tb2RlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT3BlbnMgdXAgdGhlIGNvbnNvbGUgZGV2aWNlIGZvciBvdXRwdXQgYnkgZmluZGluZyBhbiBhcHByb3ByaWF0ZSB2aXJ1dGFsCi1jb25zb2xlIHRoYXQgd2UgY2FuIHJ1biBvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKAotICAgIFBNX0hXTkQgaHduZFVzZXIsCi0gICAgaW50IGRldmljZSwKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcywKLSAgICBpbnQgYnBwLAotICAgIGlib29sIGZ1bGxTY3JlZW4pCi17Ci0gICAgc3RydWN0IHZ0X21vZGUgIHZ0bTsKLSAgICBzdHJ1Y3QgdnRfc3RhdCAgdnRzOwotICAgIHN0cnVjdCBzdGF0ICAgICBzYnVmOwotICAgIGNoYXIgICAgICAgICAgICBmbmFtZVszMF07Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBjb25zb2xlICovCi0gICAgaWYgKGNvbnNvbGVfY291bnQrKykKLQlyZXR1cm4gX1BNX2NvbnNvbGVfZmQ7Ci0KLSAgICAvKiBOb3csIGl0IHdvdWxkIGJlIGdyZWF0IGlmIHdlIGNvdWxkIHVzZSAvZGV2L3R0eSBhbmQgc2VlIHdoYXQgaXQgaXMKLSAgICAgKiBjb25uZWN0ZWQgdG8uIEFsYXMsIHdlIGNhbm5vdCBmaW5kIG91dCByZWxpYWJseSB3aGF0IFZDIC9kZXYvdHR5IGlzCi0gICAgICogYm91bmQgdG8uIFRodXMgd2UgcGFyc2Ugc3RkaW4gdGhyb3VnaCBzdGRlcnIgZm9yIGEgcmVsaWFibGUgVkMuCi0gICAgICovCi0gICAgc3RhcnR1cF92YyA9IDA7Ci0gICAgZm9yIChfUE1fY29uc29sZV9mZCA9IDA7IF9QTV9jb25zb2xlX2ZkIDwgMzsgX1BNX2NvbnNvbGVfZmQrKykgewotCWlmIChmc3RhdChfUE1fY29uc29sZV9mZCwgJnNidWYpIDwgMCkKLQkgICAgY29udGludWU7Ci0JaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9HRVRNT0RFLCAmdnRtKSA8IDApCi0JICAgIGNvbnRpbnVlOwotCWlmICgoc2J1Zi5zdF9yZGV2ICYgMHhGRjAwKSAhPSAweDQwMCkKLQkgICAgY29udGludWU7Ci0JaWYgKCEoc2J1Zi5zdF9yZGV2ICYgMHhGRikpCi0JICAgIGNvbnRpbnVlOwotCXR0eV92YyA9IHNidWYuc3RfcmRldiAmIDB4RkY7Ci0JcmVzdG9yZV90ZXh0X2NvbnNvbGUoX1BNX2NvbnNvbGVfZmQpOwotCXJldHVybiBfUE1fY29uc29sZV9mZDsKLQl9Ci0gICAgaWYgKChfUE1fY29uc29sZV9mZCA9IG9wZW4oIi9kZXYvY29uc29sZSIsIE9fUkRXUikpIDwgMCkgewotCXByaW50Zigib3Blbl9kZXZfY29uc29sZTogY2FuJ3Qgb3BlbiAvZGV2L2NvbnNvbGUgXG4iKTsKLQlleGl0KDEpOwotCX0KLSAgICBpZiAoaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFZUX09QRU5RUlksICZ0dHlfdmMpIDwgMCkKLQlnb3RvIEVycm9yOwotICAgIGlmICh0dHlfdmMgPD0gMCkKLQlnb3RvIEVycm9yOwotICAgIHNwcmludGYoZm5hbWUsICIvZGV2L3R0eSVkIiwgdHR5X3ZjKTsKLSAgICBjbG9zZShfUE1fY29uc29sZV9mZCk7Ci0KLSAgICAvKiBDaGFuZ2Ugb3VyIGNvbnRyb2wgdGVybWluYWwgKi8KLSAgICBzZXRzaWQoKTsKLQotICAgIC8qIFdlIG11c3QgdXNlIFJEV1IgdG8gYWxsb3cgZm9yIG91dHB1dC4uLiAqLwotICAgIGlmICgoKF9QTV9jb25zb2xlX2ZkID0gb3BlbihmbmFtZSwgT19SRFdSKSkgPj0gMCkgJiYKLQkgICAgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9HRVRTVEFURSwgJnZ0cykgPj0gMCkpIHsKLQlpZiAoIWNoZWNrX293bmVyKHZ0cy52X2FjdGl2ZSkpCi0JICAgIGdvdG8gRXJyb3I7Ci0JcmVzdG9yZV90ZXh0X2NvbnNvbGUoX1BNX2NvbnNvbGVfZmQpOwotCi0JLyogU3VjY2VzcywgcmVkaXJlY3QgYWxsIHN0ZGlvcyAqLwotCWZmbHVzaChzdGRpbik7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0JZmZsdXNoKHN0ZGVycik7Ci0JY2xvc2UoMCk7Ci0JY2xvc2UoMSk7Ci0JY2xvc2UoMik7Ci0JZHVwKF9QTV9jb25zb2xlX2ZkKTsKLQlkdXAoX1BNX2NvbnNvbGVfZmQpOwotCWR1cChfUE1fY29uc29sZV9mZCk7Ci0KLQkvKiBjbGVhciBzY3JlZW4gYW5kIHN3aXRjaCB0byBpdCAqLwotCWZ3cml0ZSgiXGVbSFxlW0oiLCA2LCAxLCBzdGRlcnIpOwotCWZmbHVzaChzdGRlcnIpOwotCWlmICh0dHlfdmMgIT0gdnRzLnZfYWN0aXZlKSB7Ci0JICAgIHN0YXJ0dXBfdmMgPSB2dHMudl9hY3RpdmU7Ci0JICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9BQ1RJVkFURSwgdHR5X3ZjKTsKLQkgICAgd2FpdF92dF9hY3RpdmUoX1BNX2NvbnNvbGVfZmQpOwotCSAgICB9Ci0JfQotICAgIHJldHVybiBfUE1fY29uc29sZV9mZDsKLQotRXJyb3I6Ci0gICAgaWYgKF9QTV9jb25zb2xlX2ZkID4gMikKLQljbG9zZShfUE1fY29uc29sZV9mZCk7Ci0gICAgY29uc29sZV9jb3VudCA9IDA7Ci0gICAgUE1fZmF0YWxFcnJvcigKLQkiTm90IHJ1bm5pbmcgaW4gYSBncmFwaGljcyBjYXBhYmxlIGNvbnNvbGUsXG4iCi0JImFuZCB1bmFibGUgdG8gZmluZCBvbmUuXG4iKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLSNkZWZpbmUgRk9OVF9DICAweDEwMDAwICAgICAvKiA2NEtCIGZvciBmb250IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29uc29sZSBzdGF0ZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgcmV0dXJuIFBNX2dldFZHQVN0YXRlU2l6ZSgpICsgRk9OVF9DKjI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIExpbnV4IGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLGludCBjb25zb2xlX2lkKQotewotICAgIHVjaGFyICAgKnJlZ3MgPSBzdGF0ZUJ1ZjsKLQotICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgY29uc29sZSBmb250ICovCi0gICAgaWYgKGlvY3RsKGNvbnNvbGVfaWQsR0lPX0ZPTlQsJnJlZ3NbUE1fZ2V0VkdBU3RhdGVTaXplKCldKSA8IDApCi0JcGVycm9yKCJpb2N0bChHSU9fRk9OVCkiKTsKLQotICAgIC8qIEluZm9ybSB0aGUgTGludXggY29uc29sZSB0aGF0IHdlIGFyZSBnb2luZyBpbnRvIGdyYXBoaWNzIG1vZGUgKi8KLSAgICBpZiAoaW9jdGwoY29uc29sZV9pZCwgS0RTRVRNT0RFLCBLRF9HUkFQSElDUykgPCAwKQotCXBlcnJvcigiaW9jdGwoS0RTRVRNT0RFKSIpOwotCi0gICAgLyogU2F2ZSBzdGF0ZSBvZiBWR0EgcmVnaXN0ZXJzICovCi0gICAgUE1fc2F2ZVZHQVN0YXRlKHN0YXRlQnVmKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHN1cHBvcnQgZm9yIGFsbG93aW5nIGNvbnNvbGUgc3dpdGNoaW5nISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBMaW51eCBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGNvbnNvbGVfaWQpCi17Ci0gICAgY29uc3QgdWNoYXIgKnJlZ3MgPSBzdGF0ZUJ1ZjsKLQotICAgIC8qIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBWR0EgY29tcGF0aWJsZSByZWdpc3RlcnMgKi8KLSAgICBQTV9yZXN0b3JlVkdBU3RhdGUoc3RhdGVCdWYpOwotCi0gICAgLyogSW5mb3JtIHRoZSBMaW51eCBjb25zb2xlIHRoYXQgd2UgYXJlIGJhY2sgZnJvbSBncmFwaGljcyBtb2RlcyAqLwotICAgIGlmIChpb2N0bChjb25zb2xlX2lkLCBLRFNFVE1PREUsIEtEX1RFWFQpIDwgMCkKLQlMT0dXQVJOKCJpb2N0bChLRFNFVE1PREUpIGZhaWxlZCIpOwotCi0gICAgLyogUmVzdG9yZSB0aGUgb2xkIGNvbnNvbGUgZm9udCAqLwotICAgIGlmIChpb2N0bChjb25zb2xlX2lkLFBJT19GT05ULCZyZWdzW1BNX2dldFZHQVN0YXRlU2l6ZSgpXSkgPCAwKQotCUxPR1dBUk4oImlvY3RsKEtEU0VUTU9ERSkgZmFpbGVkIik7Ci0KLSAgICAvKiBDb21pbmcgYmFjayBmcm9tIGdyYXBoaWNzIG1vZGUgb24gTGludXggYWxzbyByZXN0b3JlZCB0aGUgcHJldmlvdXMKLSAgICAgKiB0ZXh0IG1vZGUgY29uc29sZSBjb250ZW50cywgc28gd2UgbmVlZCB0byBjbGVhciB0aGUgc2NyZWVuIHRvIGdldAotICAgICAqIGFyb3VuZCB0aGlzIHNpbmNlIHRoZSBjdXJzb3IgZG9lcyBub3QgZ2V0IGhvbWVkIGJ5IG91ciBjb2RlLgotICAgICAqLwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIHByaW50ZigiXDAzM1tIXDAzM1tKIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2xvc2UgdGhlIExpbnV4IGNvbnNvbGUgYW5kIHB1dCBpdCBiYWNrIHRvIG5vcm1hbC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShQTV9IV05EIF9QTV9jb25zb2xlX2ZkKQotewotICAgIC8qIFJlc3RvcmUgY29uc29sZSB0byBub3JtYWwgb3BlcmF0aW9uICovCi0gICAgaWYgKC0tY29uc29sZV9jb3VudCA9PSAwKSB7Ci0JLyogUmUtYWN0aXZhdGUgdGhlIG9yaWdpbmFsIHZpcnR1YWwgY29uc29sZSAqLwotCWlmIChzdGFydHVwX3ZjID4gMCkKLQkgICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFZUX0FDVElWQVRFLCBzdGFydHVwX3ZjKTsKLQotCS8qIENsb3NlIHRoZSBjb25zb2xlIGZpbGUgZGVzY3JpcHRvciAqLwotCWlmIChfUE1fY29uc29sZV9mZCA+IDIpCi0JICAgIGNsb3NlKF9QTV9jb25zb2xlX2ZkKTsKLQlfUE1fY29uc29sZV9mZCA9IC0xOwotCX0KLX0KLQotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gaGVyZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgc2NyZWVuIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSBMaW51eCBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLSAgICBzdHJ1Y3Qgd2luc2l6ZSAgd3M7Ci0gICAgc3RydWN0IHZ0X3NpemVzIHZzOwotCi0gICAgLyogUmVzaXplIHRoZSBzb2Z0d2FyZSB0ZXJtaW5hbCAqLwotICAgIHdzLndzX2NvbCA9IHdpZHRoOwotICAgIHdzLndzX3JvdyA9IGhlaWdodDsKLSAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgVElPQ1NXSU5TWiwgJndzKTsKLQotICAgIC8qIEFuZCB0aGUgaGFyZHdhcmUgKi8KLSAgICB2cy52X3Jvd3MgPSBoZWlnaHQ7Ci0gICAgdnMudl9jb2xzID0gd2lkdGg7Ci0gICAgdnMudl9zY3JvbGxzaXplID0gMDsKLSAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfUkVTSVpFLCAmdnMpOwotfQotCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIGloLCBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eCAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17IHJldHVybiAnLyc7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoteyByZXR1cm4gUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKTsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBjaGFyICplbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3Vzci9saWIvbnVjbGV1cyI7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSAgICBnZXRob3N0bmFtZShidWYsIDEyOCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgYnVmWzEyOF07Ci0gICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB1Y2hhciAqemVyb1B0ciA9IE5VTEw7Ci0gICAgaWYgKCF6ZXJvUHRyKQotCXplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyAweDQwMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICAvKiBQTV9pbml0IG1hcHMgaW4gdGhlIDB4QTAwMDAgZnJhbWVidWZmZXIgcmVnaW9uIDE6MSB3aXRoIG91cgotICAgICAqIGFkZHJlc3MgbWFwcGluZywgc28gd2UgY2FuIHJldHVybiB0aGUgYWRkcmVzcyBoZXJlLgotICAgICAqLwotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICByZXR1cm4gKHZvaWQqKSgweEEwMDAwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQotewotICAgIHVjaGFyICAgKnA7Ci0gICAgdWxvbmcgICBiYXNlQWRkcixiYXNlT2ZzOwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGlmIChiYXNlID49IDB4QTAwMDAgJiYgYmFzZSA8IDB4MTAwMDAwKQotCXJldHVybiAodm9pZCopYmFzZTsKLSAgICBpZiAoIWZkX21lbSAmJiAoZmRfbWVtID0gb3BlbigiL2Rldi9tZW0iLCBPX1JEV1IpKSA9PSAtMSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFJvdW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgNEtiIGJvdW5kYXJ5IGFuZCB0aGUgbGltaXQgdG8gYQotICAgICAqIDRLYi0xIGJvdW5kYXJ5IGJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZXMgdG8gbW1hcC4gSWYgd2Ugcm91bmQgdGhlCi0gICAgICogcGh5c2ljYWwgYWRkcmVzcywgdGhlbiB3ZSBhbHNvIGFkZCBhbiBleHRyYSBvZmZzZXQgaW50byB0aGUgYWRkcmVzcwotICAgICAqIHRoYXQgd2UgcmV0dXJuLgotICAgICAqLwotICAgIGJhc2VPZnMgPSBiYXNlICYgNDA5NTsKLSAgICBiYXNlQWRkciA9IGJhc2UgJiB+NDA5NTsKLSAgICBsaW1pdCA9ICgobGltaXQrYmFzZU9mcysxKzQwOTUpICYgfjQwOTUpLTE7Ci0gICAgaWYgKChwID0gbW1hcCgwLCBsaW1pdCsxLAotCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAotCSAgICBmZF9tZW0sIGJhc2VBZGRyKSkgPT0gKHZvaWQgKiktMSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gKHZvaWQqKShwK2Jhc2VPZnMpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotICAgIGlmICgodWxvbmcpcHRyID49IDB4MTAwMDAwKQotCW11bm1hcChwdHIsbGltaXQrMSk7Ci19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLiAqLwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcykKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgYWRkcmVzc2VzICovCi0gICAgLyogICAgICAgZm9yIGEgbGluZWFyIGFkZHJlc3MuICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICAvKiBUT0RPOiBQdXQgdGhlIHByb2Nlc3MgdG8gc2xlZXAgZm9yIG1pbGxpc2Vjb25kcyAqLwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQobG9uZyBzaXplKQotewotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwdHIpCi17Ci0gICAgUE1fZnJlZShwdHIpOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKHZvaWQgKmJhc2UsdWxvbmcgbGltaXQpCi17IHJldHVybiAodm9pZCopYmFzZTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQotewotICAgIC8qIFBNX2luaXQgbWFwcyBpbiB0aGUgMHhBMDAwMC0weDEwMDAwMCByZWdpb24gMToxIHdpdGggb3VyCi0gICAgICogYWRkcmVzcyBtYXBwaW5nLCBhcyB3ZWxsIGFzIGFsbCBtZW1vcnkgYmxvY2tzIGluIGEgMToxIGFkZHJlc3MKLSAgICAgKiBtYXBwaW5nIHNvIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGluIGhlcmUuCi0gICAgICovCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIHJldHVybiAodm9pZCopTUtfUEhZUyhyX3NlZyxyX29mZik7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIGludCAgICAgaTsKLSAgICBjaGFyICAgICpyID0gKGNoYXIgKilSRUFMX01FTV9CQVNFOwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGlmICghbWVtX2luZm8ucmVhZHkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaWYgKG1lbV9pbmZvLmNvdW50ID09IFJFQUxfTUVNX0JMT0NLUykKLQlyZXR1cm4gTlVMTDsKLSAgICBzaXplID0gKHNpemUgKyAxNSkgJiB+MTU7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1lbV9pbmZvLmNvdW50OyBpKyspIHsKLQlpZiAobWVtX2luZm8uYmxvY2tzW2ldLmZyZWUgJiYgc2l6ZSA8IG1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplKSB7Ci0JICAgIGluc2VydF9ibG9jayhpKTsKLQkgICAgbWVtX2luZm8uYmxvY2tzW2ldLnNpemUgPSBzaXplOwotCSAgICBtZW1faW5mby5ibG9ja3NbaV0uZnJlZSA9IDA7Ci0JICAgIG1lbV9pbmZvLmJsb2Nrc1tpICsgMV0uc2l6ZSAtPSBzaXplOwotCSAgICAqcl9zZWcgPSAodWludCkocikgPj4gNDsKLQkgICAgKnJfb2ZmID0gKHVpbnQpKHIpICYgMHhGOwotCSAgICByZXR1cm4gKHZvaWQgKilyOwotCSAgICB9Ci0JciArPSBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZTsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIGludCAgICAgaTsKLSAgICBjaGFyICAgICpyID0gKGNoYXIgKilSRUFMX01FTV9CQVNFOwotCi0gICAgaWYgKCFtZW1faW5mby5yZWFkeSkKLQlyZXR1cm47Ci0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKG1lbSAhPSAodm9pZCAqKXIpIHsKLQlyICs9IG1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplOwotCWkrKzsKLQlpZiAoaSA9PSBtZW1faW5mby5jb3VudCkKLQkgICAgcmV0dXJuOwotCX0KLSAgICBtZW1faW5mby5ibG9ja3NbaV0uZnJlZSA9IDE7Ci0gICAgaWYgKGkgKyAxIDwgbWVtX2luZm8uY291bnQgJiYgbWVtX2luZm8uYmxvY2tzW2kgKyAxXS5mcmVlKSB7Ci0JbWVtX2luZm8uYmxvY2tzW2ldLnNpemUgKz0gbWVtX2luZm8uYmxvY2tzW2kgKyAxXS5zaXplOwotCWRlbGV0ZV9ibG9jayhpICsgMSk7Ci0JfQotICAgIGlmIChpIC0gMSA+PSAwICYmIG1lbV9pbmZvLmJsb2Nrc1tpIC0gMV0uZnJlZSkgewotCW1lbV9pbmZvLmJsb2Nrc1tpIC0gMV0uc2l6ZSArPSBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZTsKLQlkZWxldGVfYmxvY2soaSk7Ci0JfQotfQotCi0jZGVmaW5lIERJUkVDVElPTl9GTEFHICAoMSA8PCAxMCkKLQotc3RhdGljIHZvaWQgZW1faW5zKGludCBzaXplKQotewotICAgIHVuc2lnbmVkIGludCBlZHgsIGVkaTsKLQotICAgIGVkeCA9IGNvbnRleHQudm0ucmVncy5lZHggJiAweGZmZmY7Ci0gICAgZWRpID0gY29udGV4dC52bS5yZWdzLmVkaSAmIDB4ZmZmZjsKLSAgICBlZGkgKz0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBpZiAoY29udGV4dC52bS5yZWdzLmVmbGFncyAmIERJUkVDVElPTl9GTEFHKSB7Ci0JaWYgKHNpemUgPT0gNCkKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBpbnNsOyBjbGQiCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JZWxzZSBpZiAoc2l6ZSA9PSAyKQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IGluc3c7IGNsZCIKLQkgICAgIDogIj1EIiAoZWRpKSA6ICJkIiAoZWR4KSwgIjAiIChlZGkpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgaW5zYjsgY2xkIgotCSAgICAgOiAiPUQiIChlZGkpIDogImQiIChlZHgpLCAiMCIgKGVkaSkpOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IGluc2wiCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JZWxzZSBpZiAoc2l6ZSA9PSAyKQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IGluc3ciCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JZWxzZQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IGluc2IiCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JfQotICAgIGVkaSAtPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OwotICAgIGNvbnRleHQudm0ucmVncy5lZGkgJj0gMHhmZmZmMDAwMDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWRpIHw9IGVkaSAmIDB4ZmZmZjsKLX0KLQotc3RhdGljIHZvaWQgZW1fcmVwX2lucyhpbnQgc2l6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZWN4LCBlZHgsIGVkaTsKLQotICAgIGVjeCA9IGNvbnRleHQudm0ucmVncy5lY3ggJiAweGZmZmY7Ci0gICAgZWR4ID0gY29udGV4dC52bS5yZWdzLmVkeCAmIDB4ZmZmZjsKLSAgICBlZGkgPSBjb250ZXh0LnZtLnJlZ3MuZWRpICYgMHhmZmZmOwotICAgIGVkaSArPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OwotICAgIGlmIChjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgRElSRUNUSU9OX0ZMQUcpIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgaW5zbDsgY2xkIgotCSAgICAgOiAiPUQiIChlZGkpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlZGkpLCAiMSIgKGVjeCkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyByZXA7IGluc3c7IGNsZCIKLQkgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZWRpKSwgIjEiIChlY3gpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgcmVwOyBpbnNiOyBjbGQiCi0JICAgICA6ICI9RCIgKGVkaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7Ci0JfQotICAgIGVsc2UgewotCWlmIChzaXplID09IDQpCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnNsIgotCSAgICAgOiAiPUQiIChlZGkpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlZGkpLCAiMSIgKGVjeCkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IGluc3ciCi0JICAgICA6ICI9RCIgKGVkaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7Ci0JZWxzZQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgaW5zYiIKLQkgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZWRpKSwgIjEiIChlY3gpKTsKLQl9Ci0KLSAgICBlZGkgLT0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWRpICY9IDB4ZmZmZjAwMDA7Ci0gICAgY29udGV4dC52bS5yZWdzLmVkaSB8PSBlZGkgJiAweGZmZmY7Ci0gICAgY29udGV4dC52bS5yZWdzLmVjeCAmPSAweGZmZmYwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lY3ggfD0gZWN4ICYgMHhmZmZmOwotfQotCi1zdGF0aWMgdm9pZCBlbV9vdXRzKGludCBzaXplKQotewotICAgIHVuc2lnbmVkIGludCBlZHgsIGVzaTsKLQotICAgIGVkeCA9IGNvbnRleHQudm0ucmVncy5lZHggJiAweGZmZmY7Ci0gICAgZXNpID0gY29udGV4dC52bS5yZWdzLmVzaSAmIDB4ZmZmZjsKLSAgICBlc2kgKz0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBpZiAoY29udGV4dC52bS5yZWdzLmVmbGFncyAmIERJUkVDVElPTl9GTEFHKSB7Ci0JaWYgKHNpemUgPT0gNCkKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBvdXRzbDsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBvdXRzdzsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCWVsc2UKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBvdXRzYjsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IG91dHNsIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBvdXRzdyIKLQkgICAgIDogIj1TIiAoZXNpKSA6ICJkIiAoZWR4KSwgIjAiIChlc2kpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgb3V0c2IiCi0JICAgICA6ICI9UyIgKGVzaSkgOiAiZCIgKGVkeCksICIwIiAoZXNpKSk7Ci0JfQotCi0gICAgZXNpIC09ICh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmRzIDw8IDQ7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzaSAmPSAweGZmZmYwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lc2kgfD0gZXNpICYgMHhmZmZmOwotfQotCi1zdGF0aWMgdm9pZCBlbV9yZXBfb3V0cyhpbnQgc2l6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZWN4LCBlZHgsIGVzaTsKLQotICAgIGVjeCA9IGNvbnRleHQudm0ucmVncy5lY3ggJiAweGZmZmY7Ci0gICAgZWR4ID0gY29udGV4dC52bS5yZWdzLmVkeCAmIDB4ZmZmZjsKLSAgICBlc2kgPSBjb250ZXh0LnZtLnJlZ3MuZXNpICYgMHhmZmZmOwotICAgIGVzaSArPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OwotICAgIGlmIChjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgRElSRUNUSU9OX0ZMQUcpIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgb3V0c2w7IGNsZCIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQllbHNlIGlmIChzaXplID09IDIpCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgcmVwOyBvdXRzdzsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlc2kpLCAiMSIgKGVjeCkpOwotCWVsc2UKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyByZXA7IG91dHNiOyBjbGQiCi0JICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVzaSksICIxIiAoZWN4KSk7Ci0JfQotICAgIGVsc2UgewotCWlmIChzaXplID09IDQpCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzbCIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQllbHNlIGlmIChzaXplID09IDIpCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzdyIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzYiIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQl9Ci0KLSAgICBlc2kgLT0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNpICY9IDB4ZmZmZjAwMDA7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzaSB8PSBlc2kgJiAweGZmZmY7Ci0gICAgY29udGV4dC52bS5yZWdzLmVjeCAmPSAweGZmZmYwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lY3ggfD0gZWN4ICYgMHhmZmZmOwotfQotCi1zdGF0aWMgaW50IGVtdWxhdGUodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICppbnNuOwotICAgIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50IHNpemUgOiAxOwotCXVuc2lnbmVkIGludCByZXAgOiAxOwotCX0gcHJlZml4ID0geyAwLCAwIH07Ci0gICAgaW50IGkgPSAwOwotCi0gICAgaW5zbiA9ICh1bnNpZ25lZCBjaGFyICopKCh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmNzIDw8IDQpOwotICAgIGluc24gKz0gY29udGV4dC52bS5yZWdzLmVpcDsKLQotICAgIHdoaWxlICgxKSB7Ci0jaWZkZWYgVFJBQ0VfSU8KLQl0cmFjZUFkZHIgPSAoKHVsb25nKWNvbnRleHQudm0ucmVncy5jcyA8PCAxNikgKyBjb250ZXh0LnZtLnJlZ3MuZWlwICsgaTsKLSNlbmRpZgotCWlmIChpbnNuW2ldID09IDB4NjYpIHsKLQkgICAgcHJlZml4LnNpemUgPSAxIC0gcHJlZml4LnNpemU7Ci0JICAgIGkrKzsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHhmMykgewotCSAgICBwcmVmaXgucmVwID0gMTsKLQkgICAgaSsrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweGYwIHx8IGluc25baV0gPT0gMHhmMgotCSAgICAgfHwgaW5zbltpXSA9PSAweDI2IHx8IGluc25baV0gPT0gMHgyZQotCSAgICAgfHwgaW5zbltpXSA9PSAweDM2IHx8IGluc25baV0gPT0gMHgzZQotCSAgICAgfHwgaW5zbltpXSA9PSAweDY0IHx8IGluc25baV0gPT0gMHg2NQotCSAgICAgfHwgaW5zbltpXSA9PSAweDY3KSB7Ci0JICAgIC8qIHRoZXNlIHByZWZpeGVzIGFyZSBqdXN0IGlnbm9yZWQgKi8KLQkgICAgaSsrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweDZjKSB7Ci0JICAgIGlmIChwcmVmaXgucmVwKQotCQllbV9yZXBfaW5zKDEpOwotCSAgICBlbHNlCi0JCWVtX2lucygxKTsKLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHg2ZCkgewotCSAgICBpZiAocHJlZml4LnJlcCkgewotCQlpZiAocHJlZml4LnNpemUpCi0JCSAgICBlbV9yZXBfaW5zKDQpOwotCQllbHNlCi0JCSAgICBlbV9yZXBfaW5zKDIpOwotCQl9Ci0JICAgIGVsc2UgewotCQlpZiAocHJlZml4LnNpemUpCi0JCSAgICBlbV9pbnMoNCk7Ci0JCWVsc2UKLQkJICAgIGVtX2lucygyKTsKLQkJfQotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweDZlKSB7Ci0JICAgIGlmIChwcmVmaXgucmVwKQotCQllbV9yZXBfb3V0cygxKTsKLQkgICAgZWxzZQotCQllbV9vdXRzKDEpOwotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweDZmKSB7Ci0JICAgIGlmIChwcmVmaXgucmVwKSB7Ci0JCWlmIChwcmVmaXguc2l6ZSkKLQkJICAgIGVtX3JlcF9vdXRzKDQpOwotCQllbHNlCi0JCSAgICBlbV9yZXBfb3V0cygyKTsKLQkJfQotCSAgICBlbHNlIHsKLQkJaWYgKHByZWZpeC5zaXplKQotCQkgICAgZW1fb3V0cyg0KTsKLQkJZWxzZQotCQkgICAgZW1fb3V0cygyKTsKLQkJfQotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweGVjKSB7Ci0JICAgICooKHVjaGFyKikmY29udGV4dC52bS5yZWdzLmVheCkgPSBwb3J0X2luKGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweGVkKSB7Ci0JICAgIGlmIChwcmVmaXguc2l6ZSkKLQkJKigodWxvbmcqKSZjb250ZXh0LnZtLnJlZ3MuZWF4KSA9IHBvcnRfaW5sKGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBlbHNlCi0JCSooKHVzaG9ydCopJmNvbnRleHQudm0ucmVncy5lYXgpID0gcG9ydF9pbncoY29udGV4dC52bS5yZWdzLmVkeCk7Ci0JICAgIGkrKzsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQllbHNlIGlmIChpbnNuW2ldID09IDB4ZWUpIHsKLQkgICAgcG9ydF9vdXQoY29udGV4dC52bS5yZWdzLmVheCxjb250ZXh0LnZtLnJlZ3MuZWR4KTsKLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHhlZikgewotCSAgICBpZiAocHJlZml4LnNpemUpCi0JCXBvcnRfb3V0bChjb250ZXh0LnZtLnJlZ3MuZWF4LGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBlbHNlCi0JCXBvcnRfb3V0dyhjb250ZXh0LnZtLnJlZ3MuZWF4LGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZQotCSAgICByZXR1cm4gMDsKLQl9Ci0KLSAgICBjb250ZXh0LnZtLnJlZ3MuZWlwICs9IGk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlYnVnX2luZm8oaW50IHZyZXQpCi17Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciAqcDsKLQotICAgIGZwdXRzKCJ2bTg2KCkgZmFpbGVkXG4iLCBzdGRlcnIpOwotICAgIGZwcmludGYoc3RkZXJyLCAicmV0dXJuID0gMHgleFxuIiwgdnJldCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlYXggPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWF4KTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVieCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lYngpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZWN4ID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVjeCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlZHggPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWR4KTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVzaSA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lc2kpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZWRpID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVkaSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlYnAgPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWJwKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVpcCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5laXApOwotICAgIGZwcmludGYoc3RkZXJyLCAiY3MgID0gMHglMDR4XG4iLCBjb250ZXh0LnZtLnJlZ3MuY3MpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZXNwID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVzcCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJzcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5zcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJkcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5kcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5lcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJmcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5mcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJncyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5ncyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlZmxhZ3MgID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVmbGFncyk7Ci0gICAgZnB1dHMoImNzOmlwID0gWyAiLCBzdGRlcnIpOwotICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSgoY29udGV4dC52bS5yZWdzLmNzIDw8IDQpICsgKGNvbnRleHQudm0ucmVncy5laXAgJiAweGZmZmYpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKLQkgICAgZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsICh1bnNpZ25lZCBpbnQpcFtpXSk7Ci0gICAgZnB1dHMoIl1cbiIsIHN0ZGVycik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci19Ci0KLXN0YXRpYyBpbnQgcnVuX3ZtODYodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdnJldDsKLQotICAgIGZvciAoOzspIHsKLQl2cmV0ID0gdm04NigmY29udGV4dC52bSk7Ci0JaWYgKFZNODZfVFlQRSh2cmV0KSA9PSBWTTg2X0lOVHgpIHsKLQkgICAgdW5zaWduZWQgaW50IHYgPSBWTTg2X0FSRyh2cmV0KTsKLQkgICAgaWYgKHYgPT0gUkVUVVJOX1RPXzMyX0lOVCkKLQkJcmV0dXJuIDE7Ci0JICAgIHB1c2h3KGNvbnRleHQudm0ucmVncy5lZmxhZ3MpOwotCSAgICBwdXNodyhjb250ZXh0LnZtLnJlZ3MuY3MpOwotCSAgICBwdXNodyhjb250ZXh0LnZtLnJlZ3MuZWlwKTsKLQkgICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcodik7Ci0JICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBnZXRfaW50X29mZih2KTsKLQkgICAgY29udGV4dC52bS5yZWdzLmVmbGFncyAmPSB+KFZJRl9NQVNLIHwgVEZfTUFTSyk7Ci0JICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JaWYgKFZNODZfVFlQRSh2cmV0KSAhPSBWTTg2X1VOS05PV04pCi0JICAgIGJyZWFrOwotCWlmICghZW11bGF0ZSgpKQotCSAgICBicmVhazsKLQl9Ci0gICAgZGVidWdfaW5mbyh2cmV0KTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSBJTkQoZXJlZykgY29udGV4dC52bS5yZWdzLmVyZWcgPSByZWdzLT5lcmVnCi0jZGVmaW5lIE9VVEQoZXJlZykgcmVncy0+ZXJlZyA9IGNvbnRleHQudm0ucmVncy5lcmVnCi0KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKLSAgICBJTkQoZWF4KTsgSU5EKGVieCk7IElORChlY3gpOyBJTkQoZWR4KTsgSU5EKGVzaSk7IElORChlZGkpOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoaW50bm8pOwotICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBnZXRfaW50X29mZihpbnRubyk7Ci0gICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci0gICAgT1VURChlYXgpOyBPVVREKGVieCk7IE9VVEQoZWN4KTsgT1VURChlZHgpOyBPVVREKGVzaSk7IE9VVEQoZWRpKTsKLSAgICByZWdzLT5mbGFncyA9IGNvbnRleHQudm0ucmVncy5lZmxhZ3M7Ci19Ci0KLSNkZWZpbmUgSU4oZXJlZykgY29udGV4dC52bS5yZWdzLmVyZWcgPSBpbi0+ZS5lcmVnCi0jZGVmaW5lIE9VVChlcmVnKSBvdXQtPmUuZXJlZyA9IGNvbnRleHQudm0ucmVncy5lcmVnCi0KLWludCBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KQotewotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZyhpbnRubyk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKGludG5vKTsKLSAgICBjb250ZXh0LnZtLnJlZ3Muc3MgPSBjb250ZXh0LnN0YWNrX3NlZzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNwID0gY29udGV4dC5zdGFja19vZmY7Ci0gICAgcHVzaHcoREVGQVVMVF9WTTg2X0ZMQUdTKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9zZWcpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X29mZik7Ci0gICAgcnVuX3ZtODYoKTsKLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIG91dC0+eC5jZmxhZyA9IGNvbnRleHQudm0ucmVncy5lZmxhZ3MgJiAxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaWYgKGludG5vID09IDB4MjEpIHsKLQl0aW1lX3QgdG9kYXkgPSB0aW1lKE5VTEwpOwotCXN0cnVjdCB0bSAqdDsKLQl0ID0gbG9jYWx0aW1lKCZ0b2RheSk7Ci0Jb3V0LT54LmN4ID0gdC0+dG1feWVhciArIDE5MDA7Ci0Jb3V0LT5oLmRoID0gdC0+dG1fbW9uICsgMTsKLQlvdXQtPmguZGwgPSB0LT50bV9tZGF5OwotCX0KLSAgICBlbHNlIHsKLQl1bnNpZ25lZCBpbnQgc2VnLCBvZmY7Ci0Jc2VnID0gZ2V0X2ludF9zZWcoaW50bm8pOwotCW9mZiA9IGdldF9pbnRfb2ZmKGludG5vKTsKLQltZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotCUlOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0JY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLQljb250ZXh0LnZtLnJlZ3MuY3MgPSBzZWc7Ci0JY29udGV4dC52bS5yZWdzLmVpcCA9IG9mZjsKLQljb250ZXh0LnZtLnJlZ3MuZXMgPSBzcmVncy0+ZXM7Ci0JY29udGV4dC52bS5yZWdzLmRzID0gc3JlZ3MtPmRzOwotCWNvbnRleHQudm0ucmVncy5mcyA9IHNyZWdzLT5mczsKLQljb250ZXh0LnZtLnJlZ3MuZ3MgPSBzcmVncy0+Z3M7Ci0JY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0JY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotCXB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0JcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLQlwdXNodyhjb250ZXh0LnJldF9vZmYpOwotCXJ1bl92bTg2KCk7Ci0JT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLQlzcmVncy0+ZXMgPSBjb250ZXh0LnZtLnJlZ3MuZXM7Ci0Jc3JlZ3MtPmRzID0gY29udGV4dC52bS5yZWdzLmRzOwotCXNyZWdzLT5mcyA9IGNvbnRleHQudm0ucmVncy5mczsKLQlzcmVncy0+Z3MgPSBjb250ZXh0LnZtLnJlZ3MuZ3M7Ci0Jb3V0LT54LmNmbGFnID0gY29udGV4dC52bS5yZWdzLmVmbGFncyAmIDE7Ci0JfQotICAgIHJldHVybiBvdXQtPmUuZWF4OwotfQotCi0jZGVmaW5lIE9VVFIoZXJlZykgaW4tPmUuZXJlZyA9IGNvbnRleHQudm0ucmVncy5lcmVnCi0KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBzZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IG9mZjsKLSAgICBjb250ZXh0LnZtLnJlZ3Muc3MgPSBjb250ZXh0LnN0YWNrX3NlZzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNwID0gY29udGV4dC5zdGFja19vZmY7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzID0gc3JlZ3MtPmVzOwotICAgIGNvbnRleHQudm0ucmVncy5kcyA9IHNyZWdzLT5kczsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZnMgPSBzcmVncy0+ZnM7Ci0gICAgY29udGV4dC52bS5yZWdzLmdzID0gc3JlZ3MtPmdzOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci0gICAgT1VUUihlYXgpOyBPVVRSKGVieCk7IE9VVFIoZWN4KTsgT1VUUihlZHgpOyBPVVRSKGVzaSk7IE9VVFIoZWRpKTsKLSAgICBzcmVncy0+ZXMgPSBjb250ZXh0LnZtLnJlZ3MuZXM7Ci0gICAgc3JlZ3MtPmRzID0gY29udGV4dC52bS5yZWdzLmRzOwotICAgIHNyZWdzLT5mcyA9IGNvbnRleHQudm0ucmVncy5mczsKLSAgICBzcmVncy0+Z3MgPSBjb250ZXh0LnZtLnJlZ3MuZ3M7Ci0gICAgaW4tPnguY2ZsYWcgPSBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICBGSUxFICAgICptZW0gPSBmb3BlbigiL3Byb2MvbWVtaW5mbyIsInIiKTsKLSAgICBjaGFyICAgIGJ1ZlsxMDI0XTsKLQotICAgIGZnZXRzKGJ1ZiwxMDI0LG1lbSk7Ci0gICAgZmdldHMoYnVmLDEwMjQsbWVtKTsKLSAgICBzc2NhbmYoYnVmLCJNZW06ICUqZCAlKmQgJWxkIiwgcGh5c2ljYWwpOwotICAgIGZnZXRzKGJ1ZiwxMDI0LG1lbSk7Ci0gICAgc3NjYW5mKGJ1ZiwiU3dhcDogJSpkICUqZCAlbGQiLCB0b3RhbCk7Ci0gICAgZmNsb3NlKG1lbSk7Ci0gICAgKnRvdGFsICs9ICpwaHlzaWNhbDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKHVpbnQgc2l6ZSx1bG9uZyAqcGh5c0FkZHIsaWJvb2wgY29udGlndW91cyxpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgTGludXggKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKHZvaWQgKnAsdWludCBzaXplLGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1BhZ2UoCi0gICAgaWJvb2wgbG9ja2VkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eCAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAotICAgIHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoaW50IGJhbmspCi17Ci0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIG1lbXNldCgmY29udGV4dC52bS5yZWdzLCAwLCBzaXplb2YoY29udGV4dC52bS5yZWdzKSk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVheCA9IDB4NEYwNTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWJ4ID0gMHgwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lZHggPSBiYW5rOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKDB4MTApOwotICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOwotICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKLSAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLSAgICBydW5fdm04NigpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQihpbnQgYmFuaykKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWF4ID0gMHg0RjA1OwotICAgIGNvbnRleHQudm0ucmVncy5lYnggPSAweDAwMDA7Ci0gICAgY29udGV4dC52bS5yZWdzLmVkeCA9IGJhbms7Ci0gICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZygweDEwKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWlwID0gZ2V0X2ludF9vZmYoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVheCA9IDB4NEYwNTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWJ4ID0gMHgwMDAxOwotICAgIGNvbnRleHQudm0ucmVncy5lZHggPSBiYW5rOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKDB4MTApOwotICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOwotICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKLSAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLSAgICBydW5fdm04NigpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotewotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotICAgIGNvbnRleHQudm0ucmVncy5lYXggPSAweDRGMDc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVieCA9IHdhaXRWUlQ7Ci0gICAgY29udGV4dC52bS5yZWdzLmVjeCA9IHg7Ci0gICAgY29udGV4dC52bS5yZWdzLmVkeCA9IHk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZygweDEwKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWlwID0gZ2V0X2ludF9vZmYoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci19Ci0KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKQotewotI2lmZGVmIEVOQUJMRV9NVFJSCi0gICAgc3RydWN0IG10cnJfc2VudHJ5IHNlbnRyeTsKLQotICAgIGlmIChtdHJyX2ZkIDwgMCkKLQlyZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKLSAgICBzZW50cnkuYmFzZSA9IGJhc2U7Ci0gICAgc2VudHJ5LnNpemUgPSBsZW5ndGg7Ci0gICAgc2VudHJ5LnR5cGUgPSB0eXBlOwotICAgIGlmIChpb2N0bChtdHJyX2ZkLCBNVFJSSU9DX0FERF9FTlRSWSwgJnNlbnRyeSkgPT0gLTEpIHsKLQkvKiBUT0RPOiBOZWVkIHRvIGRlY29kZSBNVFJSIGVycm9yIGNvZGVzISEgKi8KLQlyZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotCX0KLSAgICByZXR1cm4gUE1fTVRSUl9FUlJfT0s7Ci0jZWxzZQotICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotY2FsbGJhY2sgICAgLSBGdW5jdGlvbiB0byBjYWxsYmFjayB3aXRoIHdyaXRlIGNvbWJpbmUgaW5mb3JtYXRpb24KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgd3JpdGUgY29tYmluZSByZWdpb25zIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGUKLXByb2Nlc3Nvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW51bVdyaXRlQ29tYmluZSgKLSAgICBQTV9lbnVtV3JpdGVDb21iaW5lX3QgY2FsbGJhY2spCi17Ci0jaWZkZWYgRU5BQkxFX01UUlIKLSAgICBzdHJ1Y3QgbXRycl9nZW50cnkgZ2VudHJ5OwotCi0gICAgaWYgKG10cnJfZmQgPCAwKQotCXJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOwotCi0gICAgZm9yIChnZW50cnkucmVnbnVtID0gMDsgaW9jdGwgKG10cnJfZmQsIE1UUlJJT0NfR0VUX0VOVFJZLCAmZ2VudHJ5KSA9PSAwOwotCSArK2dlbnRyeS5yZWdudW0pIHsKLQlpZiAoZ2VudHJ5LnNpemUgPiAwKSB7Ci0JICAgIC8qIFdBUk5JTkc6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHR5cGVzIGluIHBtYXBpLmggbWF0Y2ggdGhlIG9uZXMgKi8KLQkgICAgLyogaW4gdGhlIExpbnV4IGtlcm5lbCAobXRyci5oKSAqLwotCSAgICBjYWxsYmFjayhnZW50cnkuYmFzZSwgZ2VudHJ5LnNpemUsIGdlbnRyeS50eXBlKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOwotI2Vsc2UKLSAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKLSNlbmRpZgotfQotCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqY29weU9mQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIGNoYXIgICAgICAgICpiaW9zX3B0ciA9IChjaGFyKikweEMwMDAwOwotICAgIGNoYXIgICAgICAgICpvbGRfYmlvczsKLSAgICB1bG9uZyAgICAgICBDdXJyZW50MTAsIEN1cnJlbnQ2RCwgKnJ2ZWMgPSAwOwotICAgIFJNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgc3JlZ3M7Ci0KLSAgICAvKiBUaGUgQklPUyBpcyBtYXBwZWQgdG8gMHhDMDAwMCB3aXRoIGEgcHJpdmF0ZSBtZW1vcnkgbWFwcGluZyBlbmFibGVkCi0gICAgICogd2hpY2ggbWVhbnMgd2UgaGF2ZSBhIGNvcHkgb24gd3JpdGUgc2NoZW1lLiBIZW5jZSB3ZSBzaW1wbHkgY29weQotICAgICAqIHRoZSBzZWNvbmRhcnkgQklPUyBpbWFnZSBvdmVyIHRoZSB0b3Agb2YgdGhlIG9sZCBvbmUuCi0gICAgICovCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGlmICgob2xkX2Jpb3MgPSBQTV9tYWxsb2MoQklPU0xlbikpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMCkgewotCW1lbWNweShvbGRfYmlvcyxiaW9zX3B0cixCSU9TTGVuKTsKLQltZW1jcHkoYmlvc19wdHIsY29weU9mQklPUyxCSU9TTGVuKTsKLQl9Ci0KLSAgICAvKiBUaGUgaW50ZXJydXB0IHZlY3RvcnMgc2hvdWxkIGFscmVhZHkgYmUgbW1hcCgpJ2VkIGZyb20gMC0weDQwMCBpbiBQTV9pbml0ICovCi0gICAgQ3VycmVudDEwID0gcnZlY1sweDEwXTsKLSAgICBDdXJyZW50NkQgPSBydmVjWzB4NkRdOwotCi0gICAgLyogUE9TVCB0aGUgc2Vjb25kYXJ5IEJJT1MgKi8KLSAgICBydmVjWzB4MTBdID0gcnZlY1sweDQyXTsgLyogUmVzdG9yZSBpbnQgMTBoIHRvIFNURC1CSU9TICovCi0gICAgcmVncy54LmF4ID0gYXhWYWw7Ci0gICAgUE1fY2FsbFJlYWxNb2RlKDB4QzAwMCwweDAwMDMsJnJlZ3MsJnNyZWdzKTsKLQotICAgIC8qIFJlc3RvcmUgaW50ZXJydXB0IHZlY3RvcnMgKi8KLSAgICBydmVjWzB4MTBdID0gQ3VycmVudDEwOwotICAgIHJ2ZWNbMHg2RF0gPSBDdXJyZW50NkQ7Ci0KLSAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIEJJT1MgaW1hZ2UgKi8KLSAgICBpZiAoQklPU1BoeXNBZGRyICE9IDB4QzAwMDApCi0JbWVtY3B5KGJpb3NfcHRyLG9sZF9iaW9zLEJJT1NMZW4pOwotICAgIFBNX2ZyZWUob2xkX2Jpb3MpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEgKi8KLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotfQotCi1pbnQgUE1BUEkgUE1fc2V0SU9QTCgKLSAgICBpbnQgbGV2ZWwpCi17Ci0gICAgLyogVE9ETzogTW92ZSB0aGUgSU9QTCBzd2l0Y2hpbmcgaW50byB0aGlzIGZ1bmN0aW9uISEgKi8KLSAgICByZXR1cm4gbGV2ZWw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIG9uIExpbnV4LiAqLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWVmMmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7Ci0gICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKLSAgICBjb2RlTGVuID0gY29kZUxlbjsKLSAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOWJhZTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIExpbnV4IHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Vc2UgdGhlIGdldHRpbWVvZmRheSgpIGZ1bmN0aW9uIHRvIGdldCBtaWNyb3NlY29uZCBwcmVjaXNpb24gKHByb2JhYmx5IGxlc3MKLXRob3VnaCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW5saW5lIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0OwotICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0gICAgcmV0dXJuIHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9uKHRtKSAgICAgdG0tPnN0YXJ0LmxvdyA9IF9fVUxaUmVhZFRpbWUoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckxhcCh0bSkgICAgICAgIChfX1VMWlJlYWRUaW1lKCkgLSB0bS0+c3RhcnQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgICAgICB0bS0+ZW5kLmxvdyA9IF9fVUxaUmVhZFRpbWUoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJDb3VudCh0bSkgICh0bS0+ZW5kLmxvdyAtIHRtLT5zdGFydC5sb3cpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL21ha2VmaWxlIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NWYwZTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2IFNjaVRlY2ggU29mdHdhcmUuCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIG1ha2VmaWxlIGZvciB0aGUgUE0gbGlicmFyeS4gQnVpbGRzIHRoZSBsaWJyYXJ5Ci0jICAgICAgICAgICAgICAgZmlsZSBhbmQgYWxsIHRlc3QgcHJvZ3JhbXMuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0uSU1QT1JUIC5JR05PUkUgOiBERUJVR19BR1BfRFJJVkVSIFRFU1RfSEFSTkVTUyBERUJVR19TRERQTUkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQWRkIERPUyBleHRlbmRlciBkZXBlbmRhbnQgZmxhZ3MgdG8gY29tbWFuZCBsaW5lCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DRkxBR1MgICAgICAgICAgKz0gJChEWF9DRkxBR1MpCi1BU0ZMQUdTICAgICAgICAgKz0gJChEWF9BU0ZMQUdTKQotTk9fUE1MSUIgICAgICAgIDo9IDEKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSW5jbHVkZSBkZWZpbml0aW9ucyBzcGVjaWZpYyBmb3IgdGhlIHRhcmdldCBzeXN0ZW0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5JRiAkKFVTRV9WWEQpCi0KLSMgQnVpbGRpbmcgZm9yIFdpbjMyIFZ4RCAobWluaW1hbCBQTSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uKQotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gZmlsZWlvJE8gcGNpbGliJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYXZ4ZCRPIF9wbSRPIF9tdHJyJE8gX2NwdWluZm8kTyBcCi0gICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPCi1ERVBFTkRfU1JDICAgICAgOj0gdnhkO2NvbW1vbjtjb2RlcGFnZTt0ZXN0cwotLlNPVVJDRTogICAgICAgICAgIHZ4ZCBjb21tb24gY29kZXBhZ2UgdGVzdHMKLQotLkVMSUYgJChVU0VfTlREUlYpCi0KLSMgQnVpbGRpbmcgZm9yIE5UIGRldmljZSBkcml2ZXJzIChtaW5pbWFsIFBNIGxpYnJhcnkgaW1wbGVtZW50YXRpb24pCi0KLUxJQk5BTUUgICAgICAgICA9IHBtCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBtZW0kTyBpcnEkTyBpbnQ4NiRPIFwKLSAgICAgICAgICAgICAgICAgIHN0ZGlvJE8gc3RkbGliJE8gcGNpbGliJE8gYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYW50ZHJ2JE8gXAotICAgICAgICAgICAgICAgICAgX3BtJE8gX210cnIkTyBfY3B1aW5mbyRPIF9pbnQ2NCRPIF9wY2loZWxwJE8gX2lycSRPCi1ERVBFTkRfU1JDICAgICAgOj0gbnRkcnY7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgbnRkcnYgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTElGICQoVVNFX1dJTjMyKQotCi0jIEJ1aWxkaW5nIGZvciBXaW4zMgotCi1DRkxBR1MgICAgICAgICAgKz0gLURVU0VfT1NfSk9ZU1RJQ0sKLUxJQk5BTUUgICAgICAgICA9IHBtCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8gZXZlbnQkTyBkZHJhdyRPIHp0aW1lciRPIGNwdWluZm8kTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhd2luMzIkTyBudHNlcnZjJE8gX2pveSRPIF9jcHVpbmZvJE8gXAotICAgICAgICAgICAgICAgICAgX2ludDY0JE8gX3BjaWhlbHAkTwotREVQRU5EX1NSQyAgICAgIDo9IHdpbjMyO2NvbW1vbjtjb2RlcGFnZTt0ZXN0cwotLlNPVVJDRTogICAgICAgICAgIHdpbjMyIGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0uRUxJRiAkKFVTRV9PUzIzMikKLQotIyBCdWlsZGluZyBmb3IgT1MvMgotCi0uSUYgJChVU0VfT1MyR1VJKQotTElCTkFNRSAgICAgICAgID0gcG1fcG0KLS5FTFNFCi1MSUJOQU1FICAgICAgICAgPSBwbQotLkVORElGCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIHBjaWxpYiRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2FvczIkTyBfcG1vczIkTyBfam95JE8gX2NwdWluZm8kTyBcCi0gICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPIGRvc3NjdGwkTwotREVQRU5EX1NSQyAgICAgIDo9IG9zMjtjb21tb247Y29kZXBhZ2U7dGVzdHMKLS5TT1VSQ0U6ICAgICAgICAgICBvczIgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTElGICQoVVNFX1FOWCkKLQotIyBCdWlsZGluZyBmb3IgUU5YCi0KLVVTRV9CSU9TICAgICAgICA6PSAxCi0uSUYgJChVU0VfUEhPVE9OKQotTElCTkFNRSAgICAgICAgID0gcG1fcGgKLS5FTElGICQoVVNFX1gxMSkKLUxJQk5BTUUgICAgICAgICA9IHBtX3gxMQotLkVMU0UKLUxJQk5BTUUgICAgICAgICA9IHBtCi0uRU5ESUYKLU9CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gcGNpbGliJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gbXRycnFueCRPIHVuaXhpbyRPIHZnYXN0YXRlJE8gZ2FxbngkTyBfam95JE8gXAotICAgICAgICAgICAgICAgICAgX210cnJxbngkTyBfY3B1aW5mbyRPIF9pbnQ2NCRPIF9wY2loZWxwJE8KLURFUEVORF9TUkMgICAgICA6PSBxbng7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgcW54IGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0jIEluZGljYXRlIHRoYXQgdGhpcyBwcm9ncmFtIHVzZXMgTnVjbGV1cyBkZXZpY2UgZHJpdmVycyAoc28gbmVlZHMgSS9PIGFjY2VzcykKLVVTRV9OVUNMRVVTICAgICA6PSAxCi0KLS5FTElGICQoVVNFX0xJTlVYKQotCi0jIEJ1aWxkaW5nIGZvciBMaW51eAotCi1DRkxBR1MgICAgICAgICAgKz0gLURFTkFCTEVfTVRSUiAtRFVTRV9PU19KT1lTVElDSwotLklGICQoVVNFX1gxMSkKLUxJQk5BTUUgICAgICAgICA9IHBtX3gxMQotLkVMU0UKLUxJQk5BTUUgICAgICAgICA9IHBtCi0uRU5ESUYKLU9CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB1bml4aW8kTyB2Z2FzdGF0ZSRPIGdhbGludXgkTyBfY3B1aW5mbyRPIFwKLSAgICAgICAgICAgICAgICAgIF9pbnQ2NCRPIF9wY2loZWxwJE8KLURFUEVORF9TUkMgICAgICA6PSBsaW51eDtjb21tb247Y29kZXBhZ2U7dGVzdHM7eDExCi0uU09VUkNFOiAgICAgICAgICAgbGludXggY29tbW9uIGNvZGVwYWdlIHRlc3RzIHgxMQotCi0jIEJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkKLS5JRiAkKFNPRklMRSkKLUxJQiAgICAgICAgICAgICA6PSBsZAotTElCRkxBR1MgICAgICAgIDo9IC1yIC1vCi1DRkxBR1MgICAgICAgICAgKz0gLWZQSUMKLS5FTkRJRgotCi0uRUxJRiAkKFVTRV9CRU9TKQotCi0jIEJ1aWxkaW5nIGZvciBCZU9TIEdVSQotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIHBjaWxpYiRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2FiZW9zJE8gX2pveSRPIF9jcHVpbmZvJE8gXAotICAgICAgICAgICAgICAgICAgX2ludDY0JE8gX3BjaWhlbHAkTwotREVQRU5EX1NSQyAgICAgIDo9IGJlb3M7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgYmVvcyBjb21tb24gY29kZXBhZ2UgdGVzdHMKLQotLkVMSUYgJChVU0VfU01YMzIpCi0KLSMgQnVpbGRpbmcgZm9yIFNNWAotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyBwbXNteCRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIHBjaWxpYiRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2FzbXgkTyBfcG0kTyBfcG1zbXgkTyBfbXRyciRPIF9ldmVudCRPIFwKLSAgICAgICAgICAgICAgICAgIF9qb3kkTyBfY3B1aW5mbyRPIF9pbnQ2NCRPIF9wY2loZWxwJE8gX2x6dGltZXIkTwotREVQRU5EX1NSQyAgICAgIDo9IHNteDtjb21tb247Y29kZXBhZ2U7dGVzdHMKLS5TT1VSQ0U6ICAgICAgICAgICBzbXggY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTElGICQoVVNFX1JUVEFSR0VUKQotCi0jIEJ1aWxkaW5nIGZvciBSVFRhcmdldC0zMgotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhcnR0JE8gX210cnIkTyBfam95JE8gX2NwdWluZm8kTyBcCi0gICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPCi1ERVBFTkRfU1JDICAgICAgOj0gcnR0YXJnZXQ7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgcnR0YXJnZXQgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTFNFCi0KLSMgQnVpbGRpbmcgZm9yIE1TRE9TCi0KLUxJQk5BTUUgICAgICAgICA9IHBtCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHBtZG9zJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gcGNpbGliJE8gdmdhc3RhdGUkTyBnYWRvcyRPIFwKLSAgICAgICAgICAgICAgICAgIF9wbSRPIF9wbWRvcyRPIF9tdHJyJE8gX3ZmbGF0JE8gX2V2ZW50JE8gX2pveSRPIF9wY2loZWxwJE8gXAotICAgICAgICAgICAgICAgICAgX2NwdWluZm8kTyBfaW50NjQkTyBfbHp0aW1lciRPIF9kbWEkTwotREVQRU5EX1NSQyAgICAgIDo9IGRvcztjb21tb247Y29kZXBhZ2U7dGVzdHMKLS5TT1VSQ0U6ICAgICAgICAgICBkb3MgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTkRJRgotCi0jIE9iamVjdCBtb2R1bGVzIGZvciBrZXlib2FyZCBjb2RlIHBhZ2VzCi0KLU9CSkVDVFMgICAgICAgICArPSB1c19lbmckTwotCi0jIENvbW1vbiBvYmplY3QgbW9kdWxlcwotCi1PQkpFQ1RTICAgICAgICAgKz0gY29tbW9uJE8KLS5JRiAkKENIRUNLRUQpCi1PQkpFQ1RTICAgICAgICAgKz0gZGVidWckTwotLkVORElGCi0KLSMgTnVjbGV1cyBsb2FkZXIgbGlicmFyeSBvYmplY3QgbW9kdWxlcy4gTm90ZSB0aGF0IHdoZW4gY29tcGlsaW5nIGEgdGVzdCBoYXJuZXNzCi0jIGxpYnJhcnkgd2UgbmVlZCB0byBleGNsdWRlIHRoZSBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotCi0uSUYgJChURVNUX0hBUk5FU1MpCi1DRkxBR1MgICAgICAgICAgKz0gLURURVNUX0hBUk5FU1MgLURQTUxJQgotTElCTkFNRSAgICAgICAgID0gcG1fdGVzdAotLkVMU0UKLU9CSkVDVFMgICAgICAgICArPSBnYWxpYiRPIF9nYV9pbXAkTwotLkVORElGCi0KLS5JRiAkKERFQlVHX1NERFBNSSkKLUNGTEFHUyAgICAgICAgICArPSAtRERFQlVHX1NERFBNSQotLkVORElGCi0KLSMgQUdQIGxpYnJhcnkgb2JqZWN0IG1vZHVsZXMKLQotLklGICQoREVCVUdfQUdQX0RSSVZFUikKLUNGTEFHUyAgICAgICAgICArPSAtRERFQlVHX0FHUF9EUklWRVIKLU9CSkVDVFMgICAgICAgICArPSBhZ3BsaWIkTwotLkVMU0UKLU9CSkVDVFMgICAgICAgICArPSBhZ3BsaWIkTyBwZWxvYWRlciRPIGxpYmNpbXAkTyBfZ2F0aW1lciRPCi0uRU5ESUYKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTmFtZSBvZiBsaWJyYXJ5IGFuZCBnZW5lcmljIG9iamVjdCBmaWxlcyByZXF1aXJlZCB0byBidWlsZCBpdAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLklGICQoU1RLQ0FMTCkKLUxJQkZJTEUgICAgICAgICA9IHMkKExQKSQoTElCTkFNRSkkTAotLkVMU0UKLUxJQkZJTEUgICAgICAgICA9ICQoTFApJChMSUJOQU1FKSRMCi0uRU5ESUYKLUxJQkNMRUFOICAgICAgICA9ICoubGliICouYQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGFuZ2UgZGVzdGluYXRpb24gZm9yIGxpYnJhcnkgZmlsZSBkZXBlbmRpbmcgdGhlIGV4dGVuZGVyIGJlaW5nIHVzZWQuIFRoaXMKLSMgaXMgb25seSBuZWNlc3NhcnkgZm9yIERPUyBleHRlbmRlciBzaW5jZSB0aGUgZmlsZSBnbyBpbnRvIGEgc3ViZGlyZWN0b3J5Ci0jIGluIHRoZSBub3JtYWwgbGlicmFyeSBkaXJlY3RvcnksIG9uZSBmb3IgZWFjaCBzdXBwb3J0ZWQgZXh0ZW5kZXIuIE90aGVyCi0jIE9TJ2VzIHB1dCB0aGUgZmlsZSBpbnRvIHRoZSByZWd1bGFyIGxpYnJhcnkgZGlyZWN0b3J5LCBzaW5jZSB0aGVyZSBpcwotIyBvbmx5IG9uZSBwZXIgT1MgaW4gdGhpcyBjYXNlLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTUtfUE1PREUgICAgICAgID0gMQotCi0uSUYgJChURVNUX0hBUk5FU1MpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSkKLS5FTElGICQoVVNFX1ROVCkKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVx0bnQKLS5FTElGICQoVVNFX0RPUzRHVykKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVxkb3M0Z3cKLS5FTElGICQoVVNFX1gzMikKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVx4MzIKLS5FTElGICQoVVNFX0RQTUkxNikKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVxkcG1pMTYKLS5FTElGICQoVVNFX0RQTUkzMikKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVxkcG1pMzIKLS5FTElGICQoVVNFX0RPU1gpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSlcZG9zeAotLkVORAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOYW1lcyBvZiBhbGwgZXhlY3V0YWJsZSBmaWxlcyBidWlsdAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLklGICQoVVNFX1JFQUxET1MpCi1FWEVGSUxFUyAgICAgICAgPSBtZW10ZXN0JEUgYmlvc3B0ciRFIHZpZGVvJEUgaXN2ZXNhJEUgY2FsbHJlYWwkRSAgICAgICBcCi0gICAgICAgICAgICAgICAgICBtb3VzZSRFIHRpY2skRSBrZXkkRSBrZXkxNSRFIGJyayRFIGFsdGJyayRFICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBjcml0aWNhbCRFIGFsdGNyaXQkRSB2ZnRlc3QkRSBydGMkRSBnZXRjaCRFICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBjcHUkRSB0aW1lcmMkRSB0aW1lcmNwcCRFIHNob3dwY2kkRSB1c3djJEUgYmxvY2skRQotLkVMU0UKLUVYRUZJTEVTICAgICAgICA9IG1lbXRlc3QkRSB2aWRlbyRFIGlzdmVzYSRFIGNhbGxyZWFsJEUgdmZ0ZXN0JEUgZ2V0Y2gkRSBcCi0gICAgICAgICAgICAgICAgICBjcHUkRSB0aW1lcmMkRSB0aW1lcmNwcCRFIHNob3dwY2kkRSB1c3djJEUgYmxvY2skRSBcCi0gICAgICAgICAgICAgICAgICBzYXZlJEUgcmVzdG9yZSRFCi0uRU5ESUYKLQotYWxsOiAkKEVYRUZJTEVTKQotCi0kKEVYRUZJTEVTKTogJChMSUJGSUxFKQotCi1tZW10ZXN0JEU6ICBtZW10ZXN0JE8KLWJpb3NwdHIkRTogIGJpb3NwdHIkTwotdmlkZW8kRTogICAgdmlkZW8kTwotaXN2ZXNhJEU6ICAgaXN2ZXNhJE8KLW1vdXNlJEU6ICAgIG1vdXNlJE8KLXRpY2skRTogICAgIHRpY2skTwota2V5JEU6ICAgICAga2V5JE8KLWtleTE1JEU6ICAgIGtleTE1JE8KLWJyayRFOiAgICAgIGJyayRPCi1hbHRicmskRTogICBhbHRicmskTwotY3JpdGljYWwkRTogY3JpdGljYWwkTwotYWx0Y3JpdCRFOiAgYWx0Y3JpdCRPCi1jYWxscmVhbCRFOiBjYWxscmVhbCRPCi12ZnRlc3QkRTogICB2ZnRlc3QkTwotcnRjJEU6ICAgICAgcnRjJE8KLWdldGNoJEU6ICAgIGdldGNoJE8KLWNwdSRFOiAgICAgIGNwdSRPCi10aW1lcmMkRTogICB0aW1lcmMkTwotdGltZXJjcHAkRTogdGltZXJjcHAkTwotc2hvd3BjaSRFOiAgc2hvd3BjaSRPCi11c3djJEU6ICAgICB1c3djJE8KLWJsb2NrJEU6ICAgIGJsb2NrJE8KLXNhdmUkRTogICAgIHNhdmUkTwotcmVzdG9yZSRFOiAgcmVzdG9yZSRPCi10ZXN0JEU6ICAgICB0ZXN0JE8gX3Rlc3QkTwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHRvIGNyZWF0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvcgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotREVQRU5EX09CSiAgICAgIDo9ICQoT0JKRUNUUykgbWVtdGVzdCRPIGJpb3NwdHIkTyB2aWRlbyRPIGlzdmVzYSRPIG1vdXNlJE8gIFwKLSAgICAgICAgICAgICAgICAgICB0aWNrJE8ga2V5JE8ga2V5JE8gYnJrJE8gYWx0YnJrJE8gY3JpdGljYWwkTyBhbHRjcml0JE8gICBcCi0gICAgICAgICAgICAgICAgICAgY2FsbHJlYWwkTyB2ZnRlc3QkTyBnZXRjaCRPIHRpbWVyY3BwJE8KLQotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL2NvbW1vbi5tayIKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvX2lycS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9faXJxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MjRhMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9faXJxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiAzMi1iaXQgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVyCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bwotOyogICAgICAgICAgICAgIFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfaXJxICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfaXJxCi0KLSAgICBjZXh0ZXJuIF9QTV9ydGNIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UlRDLEZDUFRSCi0KLVJ0Y0luc2lkZSAgIGR3ICAgICAgMCAgICAgICAgICAgOyBBcmUgd2Ugc3RpbGwgaGFuZGxpbmcgY3VycmVudCBpbnRlcnJ1cHQKLXNpZHRCdWYgICAgIGRmICAgICAgMCAgICAgICAgICAgOyBCdWZmZXIgZm9yIHNpZHQgaW5zdHJ1Y3Rpb24KLQotZW5kZGF0YXNlZyAgX2lycQotCi1iZWdjb2Rlc2VnICBfaXJxICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWNwdWJsaWMgX1BNX2lycUNvZGVTdGFydAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotJW1hY3JvICBJT0RFTEFZTiAxCi0lcmVwICAgICUxCi0gICAgICAgIERFTEFZCi0lZW5kcmVwCi0lZW5kbWFjcm8KLWVsc2UKLW1hY3JvICAgREVMQVkKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLWVuZG0KLW1hY3JvICAgSU9ERUxBWU4gICAgTgotICAgIHJlcHQgICAgTgotICAgICAgICBERUxBWQotICAgIGVuZG0KLWVuZG0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX3J0Y0lTUiAtIFJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHRpbWVyIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAotOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKLTsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gTWFrZSBzdXJlIHlvdXIgQyBjb2RlIGV4ZWN1dGVzIGFzCi07ICAgICAgIHF1aWNrbHkgYXMgcG9zc2libGUsIHNpbmNlIGEgdGltZXIgb3ZlcnJ1biB3aWxsIHNpbXBseSBoYW5nIHRoZQotOyAgICAgICBzeXN0ZW0uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX3J0Y0lTUgotCi07KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLTsgSWYgd2UgZW5hYmxlIGludGVycnVwdHMgYW5kIGNhbGwgaW50byBhbnkgQyBiYXNlZCBpbnRlcnJ1cHQgaGFuZGxpbmcgY29kZSwKLTsgd2UgbmVlZCB0byBzZXR1cCBhIGJ1bmNoIG9mIGltcG9ydGFudCBpbmZvcm1hdGlvbiBmb3IgdGhlIE5UIGtlcm5lbC4gVGhlCi07IGNvZGUgYmVsb3cgdGFrZXMgY2FyZSBvZiB0aGlzIGhvdXNla2VlcGluZyBmb3IgdXMgKHNlZSBVbmRvY3VtZW50ZWQgTlQgZm9yCi07IGRldGFpbHMpLiBJZiB3ZSBkb24ndCBkbyB0aGlzIGhvdXNla2VlcGluZyBhbmQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCwKLTsgdGhlIGtlcm5lbCB3aWxsIGJlY29tZSB2ZXJ5IHVuc3RhYmxlIGFuZCBjcmFzaCB3aXRoaW4gMTAgc2Vjb25kcyBvciBzby4KLTsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBwdXNoZmQKLSAgICAgICAgcHVzaCAgICBmcwotCi0gICAgICAgIG1vdiAgICAgZWJ4LDAwMDAwMDMwaAotICAgICAgICBtb3YgICAgIGZzLGJ4Ci0gICAgICAgIHN1YiAgICAgZXNwLDUwaAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLQotOyBTZXR1cCB0aGUgZXhjZXB0aW9uIGZyYW1lIHRvIE5VTEwKLQotICAgICAgICBtb3YgICAgIGVieCxbRFdPUkQgY3M6MEZGREZGMDAwaF0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgZHM6MEZGREZGMDAwaF0sIDBGRkZGRkZGRmgKLSAgICAgICAgbW92ICAgICBbRFdPUkQgZWJwXSxlYngKLQotOyBTYXZlIGF3YXkgdGhlIGV4aXN0aW5nIEtTUyBlYnAKLQotICAgICAgICBtb3YgICAgIGVzaSxbRFdPUkQgY3M6MEZGREZGMTI0aF0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVzaSswMDAwMDEyOGhdCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVicCs0aF0sZWJ4Ci0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVzaSswMDAwMDEyOGhdLGVicAotCi07IFNhdmUgYXdheSB0aGUga2VybmVsIHRpbWUgYW5kIHRoZSB0aHJlYWQgbW9kZSAoa2VybmVsL3VzZXIpCi0KLSAgICAgICAgbW92ICAgICBlZGksW0RXT1JEIGVzaSswMDAwMDEzN2hdCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVicCs4aF0sZWRpCi0KLTsgU2V0IHRoZSB0aHJlYWQgbW9kZSAoa2VybmVsL3VzZXIpIGJhc2VkIG9uIHRoZSBjb2RlIHNlbGVjdG9yCi0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVicCs3Q2hdCi0gICAgICAgIGFuZCAgICAgZWJ4LDAxCi0gICAgICAgIG1vdiAgICAgW0JZVEUgZXNpKzAwMDAwMTM3aF0sYmwKLQotOysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi07IEVuZCBvZiBzcGVjaWFsIGludGVycnVwdCBQcm9sb2cgY29kZQotOysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0KLTsgQ2xlYXIgcHJpb3JpdHkgaW50ZXJydXB0IGNvbnRyb2xsZXIgYW5kIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIHNvIHdlCi07IGRvbnQgbG9jayB0aGluZ3MgdXAgZm9yIGxvbmcuCi0KLSAgICAgICAgbW92ICAgICBhbCwyMGgKLSAgICAgICAgb3V0ICAgICAwQTBoLGFsCi0gICAgICAgIG91dCAgICAgMDIwaCxhbAotCi07IENsZWFyIHJlYWwtdGltZSBjbG9jayB0aW1lb3V0Ci0KLSAgICAgICAgaW4gICAgICBhbCw3MGggICAgICAgICAgICAgIDsgUmVhZCBDTU9TIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICA7ICBhbmQgc2F2ZSBmb3IgbGF0ZXIKLSAgICAgICAgSU9ERUxBWU4gMwotICAgICAgICBtb3YgICAgIGFsLDBDaAotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIGluICAgICAgYWwsNzFoCi0KLTsgQ2FsbCB0aGUgQyBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbgotCi0gICAgICAgIGNtcCAgICAgW0JZVEUgUnRjSW5zaWRlXSwxICA7IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0gICAgICAgIGplICAgICAgQEBFeGl0Ci0gICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwxCi0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICA7IEVuYWJsZSBpbnRlcnJ1cHRzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnIGZvciBDIGNvZGUKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fcnRjSGFuZGxlcl0KLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIGV4aXQhCi0gICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwwCi0KLUBARXhpdDogcG9wICAgICBlYXgKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmVzdG9yZSBDTU9TIGluZGV4IHJlZ2lzdGVyCi0KLTsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotOyBTdGFydCBvZiBzcGVjaWFsIGVwaWxvZyBjb2RlIHRvIHJlc3RvcmUgc3R1ZmYgb24gZXhpdCBmcm9tIGhhbmRsZXIKLTsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotCi07IFJlc3RvcmUgdGhlIEtTUyBlYnAKLQotICAgICAgICBtb3YgICAgIGVzaSxbRFdPUkQgY3M6MEZGREZGMTI0aF0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVicCs0XQotICAgICAgICBtb3YgICAgIFtEV09SRCBlc2krMDAwMDAxMjhoXSxlYngKLQotOyBSZXN0b3JlIHRoZSBleGNlcHRpb24gZnJhbWUKLQotICAgICAgICBtb3YgICAgIGVieCxbRFdPUkQgZWJwXQotICAgICAgICBtb3YgICAgIFtEV09SRCBmczowMDAwMDAwMF0sZWJ4Ci0KLTsgUmVzdG9yZSB0aGUgdGhyZWFkIG1vZGUKLQotICAgICAgICBtb3YgICAgIGVieCxbRFdPUkQgZWJwKzhoXQotICAgICAgICBtb3YgICAgIGVzaSxbRFdPUkQgZnM6MDAwMDAxMjRoXQotICAgICAgICBtb3YgICAgIFtCWVRFIGVzaSswMDAwMDEzN2hdLGJsCi0gICAgICAgIGFkZCAgICAgZXNwLCA1MGgKLSAgICAgICAgcG9wICAgICBmcwotICAgICAgICBwb3BmZAotICAgICAgICBwb3BhZAotCi07IFJldHVybiBmcm9tIGludGVycnVwdAotCi0gICAgICAgIGlyZXQKLQotY3Byb2NlbmQKLQotY3B1YmxpYyBfUE1faXJxQ29kZUVuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV9nZXRJU1IoaW50IGlycSxQTUZBUlBUUiAqaGFuZGxlcik7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGdW5jdGlvbiB0byByZXR1cm4gdGhlIHNwZWNpZmljIElSUSBoYW5kbGVyIGRpcmVjdCBmcm9tIHRoZSBJRFQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2dldElTUgotCi0gICAgICAgIEFSRyAgICAgaWR0RW50cnk6VUlOVCwgaGFuZGxlcjpEUFRSCi0KLSAgICAgICAgZW50ZXJfYyAwCi0gICAgICAgIG1vdiAgICAgZWN4LFtoYW5kbGVyXSAgICAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBoYW5kbGVyIHRvIGZpbGwgaW4KLSAgICAgICAgc2lkdCAgICBbc2lkdEJ1Zl0gICAgICAgICAgICAgICA7IEdldCBJRFRSIHJlZ2lzdGVyIGludG8gc2lkdEJ1ZgotICAgICAgICBtb3YgICAgIGVheCxbRFdPUkQgc2lkdEJ1ZisyXSAgIDsgR2V0IGFkZHJlc3Mgb2YgSURUIGludG8gRUFYCi0gICAgICAgIG1vdiAgICAgZWJ4LFtpZHRFbnRyeV0KLSAgICAgICAgbGVhICAgICBlYXgsW2VheCtlYngqOF0gICAgICAgICA7IEdldCBlbnRyeSBpbiB0aGUgSURUCi0gICAgICAgIG1vdnp4ICAgZWR4LFtXT1JEIGVheCs2XSAgICAgICAgOyBHZXQgaGlnaCBvcmRlciAxNi1iaXRzCi0gICAgICAgIHNobCAgICAgZWR4LDE2ICAgICAgICAgICAgICAgICAgOyBNb3ZlIGludG8gdG9wIDE2LWJpdHMgb2YgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGR4LFtXT1JEIGVheF0gICAgICAgICAgIDsgR2V0IGxvdyBvcmRlciAxNi1iaXRzCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVjeF0sZWR4ICAgICAgICAgOyBTdG9yZSBsaW5lYXIgYWRkcmVzcyBvZiBoYW5kbGVyCi0gICAgICAgIG1vdiAgICAgZHgsW1dPUkQgZWF4KzJdICAgICAgICAgOyBHZXQgc2VsZWN0b3IgdmFsdWUKLSAgICAgICAgbW92ICAgICBbV09SRCBlY3grNF0sZHggICAgICAgICA7IFN0b3JlIHNlbGVjdG9yIHZhbHVlCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kICAgIF9QTV9nZXRJU1IKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fc2V0SVNSKGludCBpcnEsdm9pZCAqaGFuZGxlcik7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGdW5jdGlvbiB0byBzZXQgdGhlIHNwZWNpZmljIElSUSBoYW5kbGVyIGRpcmVjdCBpbiB0aGUgSURULgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9zZXRJU1IKLQotICAgICAgICBBUkcgICAgIGlycTpVSU5ULCBoYW5kbGVyOkNQVFIKLQotICAgICAgICBlbnRlcl9jIDAKLSAgICAgICAgbW92ICAgICBlY3gsW2hhbmRsZXJdICAgICAgICAgICA7IEdldCBhZGRyZXNzIG9mIG5ldyBoYW5kbGVyCi0gICAgICAgIG1vdiAgICAgZHgsY3MgICAgICAgICAgICAgICAgICAgOyBHZXQgc2VsZWN0b3IgZm9yIG5ldyBoYW5kbGVyCi0gICAgICAgIHNpZHQgICAgW3NpZHRCdWZdICAgICAgICAgICAgICAgOyBHZXQgSURUUiByZWdpc3RlciBpbnRvIHNpZHRCdWYKLSAgICAgICAgbW92ICAgICBlYXgsW0RXT1JEIHNpZHRCdWYrMl0gICA7IEdldCBhZGRyZXNzIG9mIElEVCBpbnRvIEVBWAotICAgICAgICBtb3YgICAgIGVieCxbaWR0RW50cnldCi0gICAgICAgIGxlYSAgICAgZWF4LFtlYXgrZWJ4KjhdICAgICAgICAgOyBHZXQgZW50cnkgaW4gdGhlIElEVAotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBbV09SRCBlYXgrMl0sZHggICAgICAgICA7IFN0b3JlIGNvZGUgc2VnbWVudCBzZWxlY3RvcgotICAgICAgICBtb3YgICAgIFtXT1JEIGVheF0sY3ggICAgICAgICAgIDsgU3RvcmUgbG93IG9yZGVyIGJpdHMgb2YgaGFuZGxlcgotICAgICAgICBzaHIgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIFtXT1JEIGVheCs2XSxjeCAgICAgICAgIDsgU3RvcmUgaGlnaCBvcmRlciBiaXRzIG9mIGhhbmRsZXIKLSAgICAgICAgc3RpCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kICAgIF9QTV9zZXRJU1IKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fcmVzdG9yZUlTUihpbnQgaXJxLFBNRkFSUFRSICpoYW5kbGVyKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZ1bmN0aW9uIHRvIHNldCB0aGUgc3BlY2lmaWMgSVJRIGhhbmRsZXIgZGlyZWN0IGluIHRoZSBJRFQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3Jlc3RvcmVJU1IKLQotICAgICAgICBBUkcgICAgIGlycTpVSU5ULCBoYW5kbGVyOkNQVFIKLQotICAgICAgICBlbnRlcl9jIDAKLSAgICAgICAgbW92ICAgICBlY3gsW2hhbmRsZXJdCi0gICAgICAgIG1vdiAgICAgZHgsW1dPUkQgZWN4KzRdICAgICAgICAgOyBHZXQgc2VsZWN0b3IgZm9yIG9sZCBoYW5kbGVyCi0gICAgICAgIG1vdiAgICAgZWN4LFtEV09SRCBlY3hdICAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBvbGQgaGFuZGxlcgotICAgICAgICBzaWR0ICAgIFtzaWR0QnVmXSAgICAgICAgICAgICAgIDsgR2V0IElEVFIgcmVnaXN0ZXIgaW50byBzaWR0QnVmCi0gICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCBzaWR0QnVmKzJdICAgOyBHZXQgYWRkcmVzcyBvZiBJRFQgaW50byBFQVgKLSAgICAgICAgbW92ICAgICBlYngsW2lkdEVudHJ5XQotICAgICAgICBsZWEgICAgIGVheCxbZWF4K2VieCo4XSAgICAgICAgIDsgR2V0IGVudHJ5IGluIHRoZSBJRFQKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgW1dPUkQgZWF4KzJdLGR4ICAgICAgICAgOyBTdG9yZSBjb2RlIHNlZ21lbnQgc2VsZWN0b3IKLSAgICAgICAgbW92ICAgICBbV09SRCBlYXhdLGN4ICAgICAgICAgICA7IFN0b3JlIGxvdyBvcmRlciBiaXRzIG9mIGhhbmRsZXIKLSAgICAgICAgc2hyICAgICBlY3gsMTYKLSAgICAgICAgbW92ICAgICBbV09SRCBlYXgrNl0sY3ggICAgICAgICA7IFN0b3JlIGhpZ2ggb3JkZXIgYml0cyBvZiBoYW5kbGVyCi0gICAgICAgIHN0aQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZCAgICBfUE1fcmVzdG9yZUlTUgotCi1lbmRjb2Rlc2VnICBfaXJxCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L19wbS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9fcG0uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2IyNzZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L19wbS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcgotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KLTsqICAgICAgICAgICAgICBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbSAgICAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1QNTg2Ci0KLWJlZ2RhdGFzZWcKLQotOyBXYXRjb20gQysrIGV4dGVybmFscyByZXF1aXJlZCB0byBsaW5rIHdoZW4gY29tcGlsaW5nIGZsb2F0aW5nIHBvaW50Ci07IEMgY29kZS4gVGhleSBhcmUgbm90IGFjdHVhbGx5IHVzZWQgaW4gdGhlIGNvZGUgYmVjYXVzZSB3ZSBjb21waWxlIHdpdGgKLTsgaW5saW5lIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucywgaG93ZXZlciB0aGUgY29tcGlsZXIgc3RpbGwgZ2VuZXJhdGVzCi07IHRoZSByZWZlcmVuY2VzIGluIHRoZSBvYmplY3QgbW9kdWxlcy4KLQotX184MDg3ICAgICAgZGQgIDAKLSAgICAgICAgICAgIFBVQkxJQyAgX184MDg3Ci1fX2ltdGhyZWFkOgotX19mbHR1c2VkOgotX2ZsdHVzZWRfICAgZGQgIDAKLSAgICAgICAgICAgIFBVQkxJQyAgX19pbXRocmVhZAotICAgICAgICAgICAgUFVCTElDICBfZmx0dXNlZF8KLSAgICAgICAgICAgIFBVQkxJQyAgX19mbHR1c2VkCi0KLWVuZGRhdGFzZWcKLQotYmVnY29kZXNlZyAgX3BtICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NlZ3JlYWQoUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCBzZWdtZW50IHJlZ2lzdGVycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX3NlZ3JlYWQKLQotICAgICAgICBBUkcgICAgIHNyZWdzOkRQVFIKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBheCxlcwotICAgICAgICBfbGVzICAgIF9zaSxbc3JlZ3NdCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2ldLGF4Ci0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMl0sY3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs0XSxzcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzZdLGRzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krOF0sZnMKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSsxMF0sZ3MKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1faW50Mzg2eChpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0LFBNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSXNzdWVzIGEgc29mdHdhcmUgaW50ZXJydXB0IGluIHByb3RlY3RlZCBtb2RlLiBUaGlzIHJvdXRpbmUgaGFzIGJlZW4KLTsgd3JpdHRlbiB0byBhbGxvdyB1c2VyIHByb2dyYW1zIHRvIGxvYWQgQ1MgYW5kIERTIHdpdGggZGlmZmVyZW50IHZhbHVlcwotOyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2ludDM4NngKLQotOyBOb3QgdXNlZCBmb3IgTlQgZGV2aWNlIGRyaXZlcnMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRCYW5rQShpbnQgYmFuaykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0QmFua0EKLQotOyBOb3QgdXNlZCBmb3IgTlQgZGV2aWNlIGRyaXZlcnMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRCYW5rQUIoaW50IGJhbmspCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBQgotCi07IE5vdCB1c2VkIGZvciBOVCBkZXZpY2UgZHJpdmVycwotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRDUlRTdGFydAotCi07IE5vdCB1c2VkIGZvciBOVCBkZXZpY2UgZHJpdmVycwotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotJW1hY3JvICBJT0RFTEFZTiAxCi0lcmVwICAgICUxCi0gICAgICAgIERFTEFZCi0lZW5kcmVwCi0lZW5kbWFjcm8KLWVsc2UKLW1hY3JvICAgREVMQVkKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLWVuZG0KLW1hY3JvICAgSU9ERUxBWU4gICAgTgotICAgIHJlcHQgICAgTgotICAgICAgICBERUxBWQotICAgIGVuZG0KLWVuZG0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCi07IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3JlYWRDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2hmZAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZwotICAgICAgICBjbGkKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBpbiAgICAgIGFsLDcxaAotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIG1vdiAgICAgYWwsYWggICAgICAgICAgICAgICA7IFJldHVybiB2YWx1ZSBpbiBBTAotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKLTsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fd3JpdGVDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5ULCB2YWx1ZTpVQ0hBUgotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgbW92ICAgICBhbCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgNzFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBkb3VibGUgX2Z0b2woZG91YmxlIGYpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDYWxscyB0byBfX2Z0b2wgYXJlIGdlbmVyYXRlZCBieSB0aGUgQm9ybGFuZCBDKysgY29tcGlsZXIgZm9yIGNvZGUKLTsgdGhhdCBuZWVkcyB0byBjb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSB0byBhbiBpbnRlZ3JhbCB0eXBlLgotOwotOyBJbnB1dDogZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9uIHRoZSB0b3Agb2YgdGhlICc4Ny4KLTsKLTsgT3V0cHV0OiBhIChzaWduZWQgb3IgdW5zaWduZWQpIGxvbmcgaW4gRUFYCi07IEFsbCBvdGhlciByZWdpc3RlcnMgcHJlc2VydmVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfZnRvbAotCi0gICAgICAgIExPQ0FMICAgdGVtcDE6V09SRCwgdGVtcDI6UVdPUkQgPSBMb2NhbFNpemUKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgc3ViICAgICBlc3AsTG9jYWxTaXplCi0KLSAgICAgICAgZnN0Y3cgICBbdGVtcDFdICAgICAgICAgICAgICAgICA7IHNhdmUgdGhlIGNvbnRyb2wgd29yZAotICAgICAgICBmd2FpdAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIHRlbXAxKzFdCi0gICAgICAgIG9yICAgICAgW0JZVEUgdGVtcDErMV0sMENoICAgICAgOyBzZXQgcm91bmRpbmcgY29udHJvbCB0byBjaG9wCi0gICAgICAgIGZsZGN3ICAgW3RlbXAxXQotICAgICAgICBmaXN0cCAgIFt0ZW1wMl0gICAgICAgICAgICAgICAgIDsgY29udmVydCB0byA2NC1iaXQgaW50ZWdlcgotICAgICAgICBtb3YgICAgIFtCWVRFIHRlbXAxKzFdLGFsCi0gICAgICAgIGZsZGN3ICAgW3RlbXAxXSAgICAgICAgICAgICAgICAgOyByZXN0b3JlIHRoZSBjb250cm9sIHdvcmQKLSAgICAgICAgbW92ICAgICBlYXgsW0RXT1JEIHRlbXAyXSAgICAgICA7IHJldHVybiBMUyAzMiBiaXRzCi0gICAgICAgIG1vdiAgICAgZWR4LFtEV09SRCB0ZW1wMis0XSAgICAgOyAgICAgICAgTVMgMzIgYml0cwotCi0gICAgICAgIG1vdiAgICAgZXNwLGVicAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2dldFBEQiAtIFJldHVybiB0aGUgUGFnZSBUYWJsZSBEaXJlY3RvcnkgQmFzZSBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2dldFBEQgotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGbHVzaCB0aGUgVHJhbnNsYXRpb24gTG9va2FzaWRlIGJ1ZmZlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2ZsdXNoVExCCi0KLSAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9wbQotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTViMDdjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIFZ4RCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIFZ4RCdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAgICAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIFZ4RCdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkgICAgKHZvaWQpKGkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKWZyZXEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTEFSR0VfSU5URUdFUiBsdCA9IEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoTlVMTCk7ICAgICBcCi0gICAgKHQpLT5sb3cgPSBsdC5Mb3dQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5oaWdoID0gbHQuSGlnaFBhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9pbnQ4Ni5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaW50ODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyNjQ4Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9pbnQ4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgcmVhbCBtb2RlIHNvZnR3YXJlIGludGVycnVwdAotKiAgICAgICAgICAgICAgIGhhbmRsaW5nIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2UgZG8gaGF2ZSBsaW1pdGVkIEJJT1MgYWNjZXNzIHVuZGVyIFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsKLSAgICAvKiBSZXR1cm4gZmFsc2UgdW5sZXNzIHdlIGhhdmUgZnVsbCBidWZmZXIgcGFzc2luZyEgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbGVuICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgotcnNlZyAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgc2VnbWVudCBvZiB0aGUgYnVmZmVyCi1yb2ZmICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlYWwgbW9kZSBvZmZzZXQgb2YgdGhlIGJ1ZmZlcgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGdsb2JhbCBWRVNBIHRyYW5zZmVyCi1idWZmZXIgdGhhdCBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgQklPUyBmdW5jdGlvbnMgZnJvbQotV2luMTYgYW5kIFdpbjMyIHByb2dyYW1zIHVuZGVyIFdpbmRvd3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCi0gICAgdWludCAqbGVuLAotICAgIHVpbnQgKnJzZWcsCi0gICAgdWludCAqcm9mZikKLXsKLSAgICAvKiBObyBidWZmZXJzIHN1cHBvcnRlZCB1bmRlciBXaW5kb3dzIE5UIChXaW5kb3dzIFhQIGhhcyB0aGVtIGhvd2V2ZXIgaWYgKi8KLSAgICAvKiB3ZSBldmVyIGRlY2lkZSB0byBzdXBwb3J0IHRoaXMhKSAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcHJvdGVjdGVkIG1vZGUgc29mdHdhcmUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQzODYoCi0gICAgaW50IGludG5vLAotICAgIFBNUkVHUyAqaW4sCi0gICAgUE1SRUdTICpvdXQpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIFBNX2ludDM4NngoaW50bm8saW4sb3V0LCZzcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcmVhbCBtb2RlIHBvaW50ZXIgdG8gYSBwcm90ZWN0ZWQgbW9kZSBwb2ludGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcigKLSAgICB1aW50IHJfc2VnLAotICAgIHVpbnQgcl9vZmYpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFdpbmRvd3MgTlQgZHJpdmVycyEgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1aW50ICpyX3NlZywKLSAgICB1aW50ICpyX29mZikKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClzaXplOwotICAgICh2b2lkKXJfc2VnOwotICAgICh2b2lkKXJfb2ZmOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCi0gICAgdm9pZCAqbWVtKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKW1lbTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIERQTUlfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIERQTUlfcmVncyAqcmVncykKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIFY4NiByZWFsIG1vZGUgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGNhbGwgcmV0dXJucyB3aXRoIGEgZmFyIHJldC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKnJlZ3MsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgLyogVE9ETyEhICovCi0jaWYgMAotICAgIENMSUVOVF9TVFJVQ1Qgc2F2ZVJlZ3M7Ci0KLSAgICAvKiBCYWlsIGlmIHdlIGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzIChpZTogdGhlIFZ4RCB3YXMgZHluYW1pY2FsbHkKLSAgICAgKiBsb2FkZWQsIGFuZCBub3Qgc3RhdGljYWxseSBsb2FkZWQuCi0gICAgICovCi0gICAgaWYgKCFfUE1faGF2ZUJJT1MpCi0JcmV0dXJuOwotCi0gICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKLSAgICBCZWdpbl9OZXN0X1Y4Nl9FeGVjKCk7Ci0gICAgTG9hZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MscmVncyxzcmVncyk7Ci0gICAgU2ltdWxhdGVfRmFyX0NhbGwoc2VnLCBvZmYpOwotICAgIFJlc3VtZV9FeGVjKCk7Ci0gICAgUmVhZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MscmVncyxzcmVncyk7Ci0gICAgRW5kX05lc3RfRXhlYygpOwotICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICAvKiBUT0RPISEgKi8KLSNpZiAwCi0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzID0gezB9OwotICAgIENMSUVOVF9TVFJVQ1QgICBzYXZlUmVnczsKLSAgICB1c2hvcnQgICAgICAgICAgb2xkRGlzYWJsZTsKLQotICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCi0gICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2KClcbiIpOwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykgewotCW9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7Ci0JKmRpc2FibGVUU1JGbGFnID0gMDsKLQl9Ci0gICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOwotICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLGluLCZzcmVncyk7Ci0gICAgRXhlY19JbnQoaW50bm8pOwotICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLG91dCwmc3JlZ3MpOwotICAgIEVuZF9OZXN0X0V4ZWMoKTsKLQotICAgIC8qIFJlLWVuYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBpZiBwcmV2aW91c2x5IGVuYWJsZWQgKi8KLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpCi0JKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKLQotICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2ludDg2KClcbiIpOwotI2Vsc2UKLSAgICAqb3V0ID0gKmluOwotI2VuZGlmCi0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIFY4NiByZWFsIG1vZGUgaW50ZXJydXB0IHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIC8qIFRPRE8hISAqLwotI2lmIDAKLSAgICBDTElFTlRfU1RSVUNUICAgc2F2ZVJlZ3M7Ci0gICAgdXNob3J0ICAgICAgICAgIG9sZERpc2FibGU7Ci0KLSAgICAvKiBCYWlsIGlmIHdlIGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzIChpZTogdGhlIFZ4RCB3YXMgZHluYW1pY2FsbHkKLSAgICAgKiBsb2FkZWQsIGFuZCBub3Qgc3RhdGljYWxseSBsb2FkZWQuCi0gICAgICovCi0gICAgaWYgKCFfUE1faGF2ZUJJT1MpIHsKLQkqb3V0ID0gKmluOwotCXJldHVybiBvdXQtPnguYXg7Ci0JfQotCi0gICAgLyogRGlzYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBzbyB3ZSBkaXJlY3RseSBjYWxsIEJJT1MgKi8KLSAgICBUUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1faW50ODZ4KClcbiIpOwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykgewotCW9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7Ci0JKmRpc2FibGVUU1JGbGFnID0gMDsKLQl9Ci0gICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOwotICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLGluLHNyZWdzKTsKLSAgICBFeGVjX0ludChpbnRubyk7Ci0gICAgUmVhZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3Msb3V0LHNyZWdzKTsKLSAgICBFbmRfTmVzdF9FeGVjKCk7Ci0KLSAgICAvKiBSZS1lbmFibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgaWYgcHJldmlvdXNseSBlbmFibGVkICovCi0gICAgaWYgKGRpc2FibGVUU1JGbGFnKQotCSpkaXNhYmxlVFNSRmxhZyA9IG9sZERpc2FibGU7Ci0KLSAgICBUUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NngoKVxuIik7Ci0jZWxzZQotICAgICpvdXQgPSAqaW47Ci0jZW5kaWYKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaXJxLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9pcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkNTIwNDcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBOVCBkcml2ZXIgSVJRIG1hbmFnZW1lbnQgZnVuY3Rpb25zCi0qICAgICAgICAgICAgICAgZm9yIHRoZSBQTSBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAicG1pbnQuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2luY2x1ZGUgIm10cnIuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50ICAgICAgICAgIGdsb2JhbERhdGFTdGFydDsKLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdBOwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0I7Ci1zdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRSVENQSUMyOwotc3RhdGljIHVsb25nICAgICAgICBSVENfaWR0RW50cnk7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZSVEMgPSBQTU5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBDTU9TIHJlZ2lzdGVycyAqLwotCi11Y2hhciAgIF9BU01BUEkgX1BNX3JlYWRDTU9TKGludCBpbmRleCk7Ci12b2lkICAgIF9BU01BUEkgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpOwotdm9pZCAgICBfQVNNQVBJIF9QTV9ydGNJU1Iodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgX1BNX2dldElTUihpbnQgaXJxLFBNRkFSUFRSICpoYW5kbGVyKTsKLXZvaWQgICAgX0FTTUFQSSBfUE1fc2V0SVNSKGludCBpcnEsdm9pZCAqaGFuZGxlcik7Ci12b2lkICAgIF9BU01BUEkgX1BNX3Jlc3RvcmVJU1IoaW50IGlycSxQTUZBUlBUUiAqaGFuZGxlcik7Ci12b2lkICAgIF9BU01BUEkgX1BNX2lycUNvZGVTdGFydCh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBfUE1faXJxQ29kZUVuZCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIHN0YXRpYyBzaG9ydCBjb252ZXJ0W10gPSB7Ci0JODE5MiwKLQk0MDk2LAotCTIwNDgsCi0JMTAyNCwKLQk1MTIsCi0JMjU2LAotCTEyOCwKLQk2NCwKLQkzMiwKLQkxNiwKLQk4LAotCTQsCi0JMiwKLQktMSwKLQl9OwotICAgIGludCBpOwotCi0gICAgLyogRmlyc3QgY2xlYXIgYW55IHBlbmRpbmcgUlRDIHRpbWVvdXQgaWYgbm90IGNsZWFyZWQgKi8KLSAgICBfUE1fcmVhZENNT1MoMHgwQyk7Ci0gICAgaWYgKGZyZXF1ZW5jeSA9PSAwKSB7Ci0JLyogRGlzYWJsZSBSVEMgdGltb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLCh1Y2hhcilfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQiwodWNoYXIpKF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpKTsKLQl9Ci0gICAgZWxzZSB7Ci0JLyogQ29udmVydCBmcmVxdWVuY3kgdmFsdWUgdG8gUlRDIGNsb2NrIGluZGV4ZXMgKi8KLQlmb3IgKGkgPSAwOyBjb252ZXJ0W2ldICE9IC0xOyBpKyspIHsKLQkgICAgaWYgKGNvbnZlcnRbaV0gPT0gZnJlcXVlbmN5KQotCQlicmVhazsKLQkgICAgfQotCi0JLyogU2V0IFJUQyB0aW1vdXQgdmFsdWUgYW5kIGVuYWJsZSB0aW1lb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLCh1Y2hhcikoMHgyMCB8IChpKzMpKSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLCh1Y2hhcikoKF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpIHwgMHg0MCkpOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIHN0YXRpYyBpYm9vbCAgICBsb2NrZWQgPSBmYWxzZTsKLQotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBSVENfaWR0RW50cnkgPSAweDM4OwotICAgIF9QTV9nZXRJU1IoUlRDX2lkdEVudHJ5LCAmX1BNX3ByZXZSVEMpOwotICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7Ci0gICAgX1BNX3NldElTUihSVENfaWR0RW50cnksIF9QTV9ydGNJU1IpOwotCi0gICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCi0gICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOwotCi0gICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQzIgKi8KLSAgICBfUE1fb2xkUlRDUElDMiA9IFBNX2lucGIoMHhBMSk7Ci0gICAgUE1fb3V0cGIoMHhBMSwodWNoYXIpKF9QTV9vbGRSVENQSUMyICYgMHhGRSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcnRjSGFuZGxlcikgewotCS8qIFJlc3RvcmUgQ01PUyByZWdpc3RlcnMgYW5kIG1hc2sgUlRDIGNsb2NrICovCi0JX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7Ci0JUE1fb3V0cGIoMHhBMSwodWNoYXIpKChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpKTsKLQotCS8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KLQlfUE1fcmVzdG9yZUlTUihSVENfaWR0RW50cnksICZfUE1fcHJldlJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L21lbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvbWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMjhjNmEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvbWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBOVCBkcml2ZXIgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zCi0qICAgICAgICAgICAgICAgZm9yIHRoZSBQTSBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0jaW5jbHVkZSAib3NoZHIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfTUVNT1JZX1NIQVJFRCAgICAgICAgICAgMTAwCi0jZGVmaW5lIE1BWF9NRU1PUllfTUFQUElOR1MgICAgICAgICAxMDAKLSNkZWZpbmUgTUFYX01FTU9SWV9MT0NLRUQgICAgICAgICAgIDEwMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCAgICAqbGluZWFyOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIFBNREwgICAgcE1kbDsKLSAgICB9IG1lbXNoYXJlZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgICAgKmxpbmVhcjsKLSAgICB2b2lkICAgICptbUlvTWFwcGVkOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIFBNREwgICAgcE1kbDsKLSAgICB9IG1lbWxvY2tlZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgcGh5c2ljYWw7Ci0gICAgdWxvbmcgICBsaW5lYXI7Ci0gICAgdWxvbmcgICBsZW5ndGg7Ci0gICAgaWJvb2wgICBpc0NhY2hlZDsKLSAgICB9IG1tYXBwaW5nOwotCi1zdGF0aWMgaW50ICAgICAgICAgIG51bU1hcHBpbmdzID0gMDsKLXN0YXRpYyBtZW1zaGFyZWQgICAgc2hhcmVkW01BWF9NRU1PUllfTUFQUElOR1NdID0gezB9Owotc3RhdGljIG1tYXBwaW5nICAgICBtYXBzW01BWF9NRU1PUllfTUFQUElOR1NdOwotc3RhdGljIG1lbWxvY2tlZCAgICBsb2NrZWRbTUFYX01FTU9SWV9MT0NLRURdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11bG9uZyAgIFBNQVBJIF9QTV9nZXRQREIodm9pZCk7Ci0KLS8qIFBhZ2UgdGFibGUgZW50cnkgZmxhZ3MgKi8KLQotI2RlZmluZSBQQUdFX0ZMQUdTX1BSRVNFTlQJCQkweDAwMDAwMDAxCi0jZGVmaW5lIFBBR0VfRkxBR1NfV1JJVEVBQkxFCQkweDAwMDAwMDAyCi0jZGVmaW5lIFBBR0VfRkxBR1NfVVNFUgkJCQkweDAwMDAwMDA0Ci0jZGVmaW5lIFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSAkweDAwMDAwMDA4Ci0jZGVmaW5lIFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRQkweDAwMDAwMDEwCi0jZGVmaW5lIFBBR0VfRkxBR1NfQUNDRVNTRUQJCQkweDAwMDAwMDIwCi0jZGVmaW5lIFBBR0VfRkxBR1NfRElSVFkJCQkweDAwMDAwMDQwCi0jZGVmaW5lIFBBR0VfRkxBR1NfNE1CCSAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgICAgICAtIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIG1hcHMgaW4KLWxpbWl0ICAgICAgIC0gTGltaXQgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIHJlZ2lvbiB0byBtYXBzIGluCi0KLVJFVFVSTlM6Ci1MaW5lYXIgYWRkcmVzcyBvZiB0aGUgbmV3bHkgbWFwcGVkIG1lbW9yeS4KLQotUkVNQVJLUzoKLU1hcHMgYSBwaHlzaWNhbCBtZW1vcnkgcmFuZ2UgdG8gYSBsaW5lYXIgbWVtb3J5IHJhbmdlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIHVsb25nICAgICAgICAgICAgICAgbGVuZ3RoID0gbGltaXQrMTsKLSAgICBQSFlTSUNBTF9BRERSRVNTICAgIHBhSW9CYXNlID0gezB9OwotCi0gICAgLyogTlQgbG92ZXMgbGFyZ2UgSW50cyAqLwotICAgIHBhSW9CYXNlID0gUnRsQ29udmVydFVsb25nVG9MYXJnZUludGVnZXIoIGJhc2UgKTsKLQotICAgIC8qIE1hcCBJTyBzcGFjZSBpbnRvIEtlcm5lbCAqLwotICAgIGlmIChpc0NhY2hlZCkKLQlyZXR1cm4gKFVMT05HKU1tTWFwSW9TcGFjZShwYUlvQmFzZSwgbGVuZ3RoLCBNbUNhY2hlZCApOwotICAgIGVsc2UKLQlyZXR1cm4gKFVMT05HKU1tTWFwSW9TcGFjZShwYUlvQmFzZSwgbGVuZ3RoLCBNbU5vbkNhY2hlZCApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkanVzdCB0aGUgcGFnZSB0YWJsZSBjYWNoaW5nIGJpdHMgZGlyZWN0bHkuIFJlcXVpcmVzIHJpbmcgMCBhY2Nlc3MgYW5kCi1vbmx5IHdvcmtzIHdpdGggRE9TNEdXIGFuZCBjb21wYXRpYmxlIGV4dGVuZGVycyAoQ2F1c2VXYXkgYWxzbyB3b3JrcyBzaW5jZQotaXQgaGFzIGRpcmVjdCBzdXBwb3J0IGZvciB0aGUgcmluZyAwIGluc3RydWN0aW9ucyB3ZSBuZWVkIGZyb20gcmluZyAzKS4gV2lsbAotbm90IHdvcmsgaW4gYSBET1MgYm94LCBidXQgd2UgY2FsbCBpbnRvIHRoZSByaW5nIDAgaGVscGVyIFZ4RCBzbyB3ZSBzaG91bGQKLW5ldmVyIGdldCBoZXJlIGluIGEgRE9TIGJveCBhbnl3YXkgKGFzc3VtaW5nIHRoZSBWeEQgaXMgcHJlc2VudCkuIElmIHdlCi1kbyBnZXQgaGVyZSBhbmQgd2UgYXJlIGluIHdpbmRvd3MsIHRoaXMgY29kZSB3aWxsIGJlIHNraXBwZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX1BNX2FkanVzdFBhZ2VUYWJsZXMoCi0gICAgdWxvbmcgbGluZWFyLAotICAgIHVsb25nIGxpbWl0LAotCWlib29sIGlzR2xvYmFsLAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIGludCAgICAgc3RhcnRQREIsZW5kUERCLGlQREIsc3RhcnRQYWdlLGVuZFBhZ2Usc3RhcnQsZW5kLGlQYWdlOwotICAgIHVsb25nICAgcGFnZVRhYmxlLCpwUERCLCpwUGFnZVRhYmxlOwotCXVsb25nCW1hc2sgPSAweEZGRkZGRkZGOwotCXVsb25nCWJpdHMgPSAweDAwMDAwMDAwOwotCi0JLyogRW5hYmxlIHVzZXIgbGV2ZWwgYWNjZXNzIGZvciBwYWdlIHRhYmxlIGVudHJ5ICovCi0JaWYgKGlzR2xvYmFsKSB7Ci0JCW1hc2sgJj0gflBBR0VfRkxBR1NfVVNFUjsKLQkJYml0cyB8PSBQQUdFX0ZMQUdTX1VTRVI7Ci0JCX0KLQotCS8qIERpc2FibGUgUENEIGJpdCBpZiBwYWdlIHRhYmxlIGVudHJ5IHNob3VsZCBiZSB1bmNhY2hlZCAqLwotCWlmICghaXNDYWNoZWQpIHsKLQkJbWFzayAmPSB+KFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRSB8IFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSCk7Ci0JCWJpdHMgfD0gKFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRSB8IFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSCk7Ci0JCX0KLQotICAgIHBQREIgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKF9QTV9nZXRQREIoKSwweEZGRix0cnVlKTsKLSAgICBpZiAocFBEQikgewotCXN0YXJ0UERCID0gKGxpbmVhciA+PiAyMikgJiAweDNGRjsKLQlzdGFydFBhZ2UgPSAobGluZWFyID4+IDEyKSAmIDB4M0ZGOwotCWVuZFBEQiA9ICgobGluZWFyK2xpbWl0KSA+PiAyMikgJiAweDNGRjsKLQllbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKSAmIDB4M0ZGOwotCWZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7Ci0JICAgIC8qIFNldCB0aGUgYml0cyBpbiB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkgLSByZXF1aXJlZCBhcyBwZXIgKi8KLQkgICAgLyogUGVudGl1bSA0IG1hbnVhbC4gVGhpcyBhbHNvIHRha2VzIGNhcmUgb2YgdGhlIDRNQiBwYWdlIGVudHJpZXMgKi8KLQkgICAgcFBEQltpUERCXSA9IChwUERCW2lQREJdICYgbWFzaykgfCBiaXRzOwotCSAgICBpZiAoIShwUERCW2lQREJdICYgUEFHRV9GTEFHU180TUIpKSB7Ci0JCS8qIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggNEtCIHBhZ2VzIHRoZW4gd2UgbmVlZCB0byBpdGVyYXRlICovCi0JCS8qIHRocm91Z2ggZWFjaCBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzICovCi0JCXBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7Ci0JCXBQYWdlVGFibGUgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRix0cnVlKTsKLQkJc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOwotCQllbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOwotCQlmb3IgKGlQYWdlID0gc3RhcnQ7IGlQYWdlIDw9IGVuZDsgaVBhZ2UrKykgewotCQkgICAgcFBhZ2VUYWJsZVtpUGFnZV0gPSAocFBhZ2VUYWJsZVtpUGFnZV0gJiBtYXNrKSB8IGJpdHM7Ci0JCSAgICB9Ci0JCU1tVW5tYXBJb1NwYWNlKHBQYWdlVGFibGUsMHhGRkYpOwotCQl9Ci0JICAgIH0KLQlNbVVubWFwSW9TcGFjZShwUERCLDB4RkZGKTsKLQlQTV9mbHVzaFRMQigpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuIEZvciBOVCB3ZSBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5Ci1hcyBsb2NrZWQsIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55IG1lbW9yeSBjb250ZXh0Ci0oaW5jbHVkaW5nIGludGVycnVwdCB0aW1lIGNvbnRleHQpLCB3aGljaCBhbGxvd3MgdXMgdG8gbG9hZCBvdXIgaW1wb3J0YW50Ci1kYXRhIHN0cnVjdHVyZSBhbmQgY29kZSBzdWNoIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseSBmcm9tIGEgcmluZwotMCBpbnRlcnJ1cHQgY29udGV4dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKAotICAgIGxvbmcgc2l6ZSkKLXsKLSAgICBpbnQgICAgICAgICBpOwotCi0gICAgLyogRmlyc3QgZmluZCBhIGZyZWUgc2xvdCBpbiBvdXIgc2hhcmVkIG1lbW9yeSB0YWJsZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7Ci0JaWYgKHNoYXJlZFtpXS5saW5lYXIgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIGlmIChpID09IE1BWF9NRU1PUllfU0hBUkVEKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogQWxsb2NhdGUgdGhlIHBhZ2VkIHBvb2wgKi8KLSAgICBzaGFyZWRbaV0ubGluZWFyID0gRXhBbGxvY2F0ZVBvb2woUGFnZWRQb29sLCBzaXplKTsKLQotICAgIC8qIENyZWF0ZSBhIGxpc3QgdG8gbWFuYWdlIHRoaXMgYWxsb2NhdGlvbiAqLwotICAgIHNoYXJlZFtpXS5wTWRsID0gSW9BbGxvY2F0ZU1kbChzaGFyZWRbaV0ubGluZWFyLHNpemUsRkFMU0UsRkFMU0UsKFBJUlApIE5VTEwpOwotCi0gICAgLyogTG9jayB0aGlzIGFsbG9jYXRpb24gaW4gbWVtb3J5ICovCi0gICAgTW1Qcm9iZUFuZExvY2tQYWdlcyhzaGFyZWRbaV0ucE1kbCxLZXJuZWxNb2RlLElvTW9kaWZ5QWNjZXNzKTsKLQotICAgIC8qIE1vZGlmeSBiaXRzIHRvIGdyYW50IHVzZXIgYWNjZXNzICovCi0gICAgX1BNX2FkanVzdFBhZ2VUYWJsZXMoKHVsb25nKXNoYXJlZFtpXS5saW5lYXIsIHNpemUsIHRydWUsIHRydWUpOwotICAgIHJldHVybiAodm9pZCopc2hhcmVkW2ldLmxpbmVhcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCgKLSAgICB2b2lkICpwKQotewotICAgIGludCBpOwotCi0gICAgLyogRmluZCBhIHNoYXJlZCBtZW1vcnkgYmxvY2sgaW4gb3VyIHRhYmxlIGFuZCBmcmVlIGl0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfU0hBUkVEOyBpKyspIHsKLQlpZiAoc2hhcmVkW2ldLmxpbmVhciA9PSBwKSB7Ci0JICAgIC8qIFVubG9jayB3aGF0IHdlIGxvY2tlZCAqLwotCSAgICBNbVVubG9ja1BhZ2VzKHNoYXJlZFtpXS5wTWRsKTsKLQotCSAgICAvKiBGcmVlIG91ciBNREwgKi8KLQkgICAgSW9GcmVlTWRsKHNoYXJlZFtpXS5wTWRsKTsKLQotCSAgICAvKiBGcmVlIG91ciBtZW0gKi8KLQkgICAgRXhGcmVlUG9vbChzaGFyZWRbaV0ubGluZWFyKTsKLQotCSAgICAvKiBGbGFnIHRoYXQgaXMgZW50cnkgaXMgYXZhaWxhYmxlICovCi0JICAgIHNoYXJlZFtpXS5saW5lYXIgPSAwOwotCSAgICBicmVhazsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgbGluZWFyIGFkZHJlc3MgaW4gdGhlIGNhbGxlcnMgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICAvKiBTZWFyY2ggdGFibGUgb2YgZXhpc3RpbmcgbWFwcGluZ3MgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQgKi8KLSAgICAvKiBhIHJlZ2lvbiBvZiBtZW1vcnkgdGhhdCB3aWxsIHNlcnZlIHRoaXMgcHVycG9zZS4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykgewotCWlmIChtYXBzW2ldLnBoeXNpY2FsID09IGJhc2UgJiYgbWFwc1tpXS5sZW5ndGggPT0gbGVuZ3RoICYmIG1hcHNbaV0uaXNDYWNoZWQgPT0gaXNDYWNoZWQpIHsKLQkgICAgX1BNX2FkanVzdFBhZ2VUYWJsZXMoKHVsb25nKW1hcHNbaV0ubGluZWFyLCBtYXBzW2ldLmxlbmd0aCwgdHJ1ZSwgaXNDYWNoZWQpOwotCSAgICByZXR1cm4gKHZvaWQqKW1hcHNbaV0ubGluZWFyOwotCSAgICB9Ci0JfQotICAgIGlmIChudW1NYXBwaW5ncyA9PSBNQVhfTUVNT1JZX01BUFBJTkdTKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogV2UgZGlkIG5vdCBmaW5kIGFueSBwcmV2aW91c2x5IG1hcHBlZCBtZW1vcnkgcmVnaW9uLCBzbyBtYXBzIGl0IGluLiAqLwotICAgIGlmICgobGluZWFyID0gX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCxpc0NhY2hlZCkpID09IDB4RkZGRkZGRkYpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ucGh5c2ljYWwgPSBiYXNlOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmxlbmd0aCA9IGxlbmd0aDsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5saW5lYXIgPSBsaW5lYXI7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10uaXNDYWNoZWQgPSBpc0NhY2hlZDsKLSAgICBudW1NYXBwaW5ncysrOwotCi0gICAgLyogR3JhbnQgdXNlciBhY2Nlc3MgdG8gdGhpcyBJL08gc3BhY2UgKi8KLSAgICBfUE1fYWRqdXN0UGFnZVRhYmxlcygodWxvbmcpbGluZWFyLCBsZW5ndGgsIHRydWUsIGlzQ2FjaGVkKTsKLSAgICByZXR1cm4gKHZvaWQqKWxpbmVhcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnB0ciwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBXZSBkb24ndCBmcmVlIHRoZSBtZW1vcnkgbWFwcGluZ3MgaW4gaGVyZSBiZWNhdXNlIHdlIGNhY2hlIGFsbCAqLwotICAgIC8qIHRoZSBtZW1vcnkgbWFwcGluZ3Mgd2UgY3JlYXRlIGluIHRoZSBzeXN0ZW0gZm9yIGxhdGVyIHVzZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGRyaXZlciB1bmxvYWRzIHRvIGZyZWUgYWxsIHRoZSBwYWdlIHRhYmxlIG1hcHBpbmdzIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgX1BNX2ZyZWVNZW1vcnlNYXBwaW5ncyh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspCi0JTW1Vbm1hcElvU3BhY2UoKHZvaWQgKiltYXBzW2ldLmxpbmVhcixtYXBzW2ldLmxlbmd0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnApCi17Ci0gICAgUEhZU0lDQUxfQUREUkVTUyAgICBwYU91ckFkZHJlc3M7Ci0KLSAgICBwYU91ckFkZHJlc3MgPSBNbUdldFBoeXNpY2FsQWRkcmVzcyhwKTsKLSAgICByZXR1cm4gcGFPdXJBZGRyZXNzLkxvd1BhcnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIGludCAgICAgaTsKLSAgICB1bG9uZyAgIGxpbmVhciA9ICh1bG9uZylwICYgfjB4RkZGOwotCi0gICAgZm9yIChpID0gKGxlbmd0aCArIDB4RkZGKSA+PiAxMjsgaSA+IDA7IGktLSkgewotCWlmICgoKnBoeXNBZGRyZXNzKysgPSBQTV9nZXRQaHlzaWNhbEFkZHIoKHZvaWQqKWxpbmVhcikpID09IDB4RkZGRkZGRkYpCi0JICAgIHJldHVybiBmYWxzZTsKLQlsaW5lYXIgKz0gNDA5NjsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBQSFlTSUNBTF9BRERSRVNTICAgIHBhT3VyQWRkcmVzczsKLQotICAgIC8qIEZpcnN0IGZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHNoYXJlZCBtZW1vcnkgdGFibGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9MT0NLRUQ7IGkrKykgewotCWlmIChsb2NrZWRbaV0ubGluZWFyID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAoaSA9PSBNQVhfTUVNT1JZX0xPQ0tFRCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEhpZ2hlc3RBY2NlcHRhYmxlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgaGlnaGVzdCB2YWxpZCBwaHlzaWNhbCBhZGRyZXNzICovCi0gICAgLyogdGhlIGRyaXZlciBjYW4gdXNlLiBGb3IgZXhhbXBsZSwgaWYgYSBkZXZpY2UgY2FuIG9ubHkgcmVmZXJlbmNlIHBoeXNpY2FsICovCi0gICAgLyogbWVtb3J5IGluIHRoZSBsb3dlciAxNk1CLCB0aGlzIHZhbHVlIHdvdWxkIGJlIHNldCB0byAweDAwMDAwMDAwRkZGRkZGLiAqLwotICAgIHBhT3VyQWRkcmVzcy5IaWdoUGFydCA9IDA7Ci0gICAgaWYgKGJlbG93MTZNKQotCXBhT3VyQWRkcmVzcy5Mb3dQYXJ0ID0gMHgwMEZGRkZGRjsKLSAgICBlbHNlCi0JcGFPdXJBZGRyZXNzLkxvd1BhcnQgPSAweEZGRkZGRkZGOwotCi0gICAgaWYgKGNvbnRpZ3VvdXMpIHsKLQkvKiBBbGxvY2F0ZSBmcm9tIHRoZSBub24tcGFnZWQgcG9vbCAodW5mb3J0dW5hdGVseSA0TUIgcGFnZXMpICovCi0JbG9ja2VkW2ldLmxpbmVhciA9IE1tQWxsb2NhdGVDb250aWd1b3VzTWVtb3J5KHNpemUsIHBhT3VyQWRkcmVzcyk7Ci0JaWYgKCFsb2NrZWRbaV0ubGluZWFyKQotCSAgICByZXR1cm4gTlVMTDsKLQotCS8qIEZsYWcgbm8gTURMICovCi0JbG9ja2VkW2ldLnBNZGwgPSBOVUxMOwotCi0JLyogTWFwIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbWVtb3J5IHNvIHdlIGNhbiBtYW5hZ2UgKi8KLQkvKiB0aGUgcGFnZSB0YWJsZXMgaW4gNEtCIGNodW5rcyBtYXBwZWQgaW50byB1c2VyIHNwYWNlLiAqLwotCi0JLyogVE9ETzogTWFwIHRoaXMgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgbGluZWFyIGFkZHJlc3NzICovCi0JbG9ja2VkW2ldLm1tSW9NYXBwZWQgPSBsb2NrZWRbaV0ubGluZWFyOwotCi0JLyogTW9kaWZ5IGJpdHMgdG8gZ3JhbnQgdXNlciBhY2Nlc3MsIGZsYWcgbm90IGNhY2hlZCAqLwotCV9QTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylsb2NrZWRbaV0ubW1Jb01hcHBlZCwgc2l6ZSwgdHJ1ZSwgZmFsc2UpOwotCXJldHVybiAodm9pZCopbG9ja2VkW2ldLm1tSW9NYXBwZWQ7Ci0JfQotICAgIGVsc2UgewotCS8qIEFsbG9jYXRlIGZyb20gdGhlIHBhZ2VkIHBvb2wgKi8KLQlsb2NrZWRbaV0ubGluZWFyID0gRXhBbGxvY2F0ZVBvb2woUGFnZWRQb29sLCBzaXplKTsKLQlpZiAoIWxvY2tlZFtpXS5saW5lYXIpCi0JICAgIHJldHVybiBOVUxMOwotCi0JLyogQ3JlYXRlIGEgbGlzdCB0byBtYW5hZ2UgdGhpcyBhbGxvY2F0aW9uICovCi0JbG9ja2VkW2ldLnBNZGwgPSBJb0FsbG9jYXRlTWRsKGxvY2tlZFtpXS5saW5lYXIsc2l6ZSxGQUxTRSxGQUxTRSwoUElSUCkgTlVMTCk7Ci0KLQkvKiBMb2NrIHRoaXMgYWxsb2NhdGlvbiBpbiBtZW1vcnkgKi8KLQlNbVByb2JlQW5kTG9ja1BhZ2VzKGxvY2tlZFtpXS5wTWRsLEtlcm5lbE1vZGUsSW9Nb2RpZnlBY2Nlc3MpOwotCi0JLyogTW9kaWZ5IGJpdHMgdG8gZ3JhbnQgdXNlciBhY2Nlc3MsIGZsYWcgbm90IGNhY2hlZCAqLwotCV9QTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylsb2NrZWRbaV0ubGluZWFyLCBzaXplLCB0cnVlLCBmYWxzZSk7Ci0JcmV0dXJuICh2b2lkKilsb2NrZWRbaV0ubGluZWFyOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlcyBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBGaW5kIGEgbG9ja2VkIG1lbW9yeSBibG9jayBpbiBvdXIgdGFibGUgYW5kIGZyZWUgaXQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9MT0NLRUQ7IGkrKykgewotCWlmIChsb2NrZWRbaV0ubGluZWFyID09IHApIHsKLQkgICAgLyogQW4gTWRsIGluZGljYXRlcyB0aGF0IHdlIHVzZWQgdGhlIHBhZ2VkIHBvb2wsIGFuZCBsb2NrZWQgaXQsICovCi0JICAgIC8qIHNvIG5vdyB3ZSBoYXZlIHRvIHVubG9jaywgZnJlZSB0aGUgTURMLCBhbmQgZnJlZSBwYWdlZCAqLwotCSAgICBpZiAobG9ja2VkW2ldLnBNZGwpIHsKLQkJLyogVW5sb2NrIHdoYXQgd2UgbG9ja2VkIGFuZCBmcmVlIHRoZSBNZGwgKi8KLQkJTW1VbmxvY2tQYWdlcyhsb2NrZWRbaV0ucE1kbCk7Ci0JCUlvRnJlZU1kbChsb2NrZWRbaV0ucE1kbCk7Ci0JCUV4RnJlZVBvb2wobG9ja2VkW2ldLmxpbmVhcik7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCS8qIFRPRE86IEZyZWUgdGhlIG1tSW9NYXAgbWFwcGluZyBmb3IgdGhlIG1lbW9yeSEgKi8KLQotCQkvKiBGcmVlIG5vbi1wYWdlZCBwb29sICovCi0JCU1tRnJlZUNvbnRpZ3VvdXNNZW1vcnkobG9ja2VkW2ldLmxpbmVhcik7Ci0JCX0KLQotCSAgICAvKiBGbGFnIHRoYXQgaXMgZW50cnkgaXMgYXZhaWxhYmxlICovCi0JICAgIGxvY2tlZFtpXS5saW5lYXIgPSAwOwotCSAgICBicmVhazsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKLSAgICBpYm9vbCBsb2NrZWQpCi17Ci0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmcm9tIHRoZSBub24tcGFnZWQgcG9vbCBpZiB3ZSB3YW50IHRoZSBtZW1vcnkgKi8KLSAgICAvKiB0byBiZSBsb2NrZWQuICovCi0gICAgcmV0dXJuIEV4QWxsb2NhdGVQb29sKAotCWxvY2tlZCA/IE5vblBhZ2VkUG9vbENhY2hlQWxpZ25lZCA6IFBhZ2VkUG9vbENhY2hlQWxpZ25lZCwKLQlQQUdFX1NJWkUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKLSAgICB2b2lkICpwKQotewotICAgIGlmIChwKSBFeEZyZWVQb29sKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcygKLSAgICB2b2lkICpwLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIE1ETCAqcE1kbDsKLQotICAgIC8qIENyZWF0ZSBhIGxpc3QgdG8gbWFuYWdlIHRoaXMgYWxsb2NhdGlvbiAqLwotICAgIGlmICgocE1kbCA9IElvQWxsb2NhdGVNZGwocCxsZW4sRkFMU0UsRkFMU0UsKFBJUlApTlVMTCkpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogTG9jayB0aGlzIGFsbG9jYXRpb24gaW4gbWVtb3J5ICovCi0gICAgTW1Qcm9iZUFuZExvY2tQYWdlcyhwTWRsLEtlcm5lbE1vZGUsSW9Nb2RpZnlBY2Nlc3MpOwotICAgICooKFBNREwqKSgmbGgtPmgpKSA9IHBNZGw7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcygKLSAgICB2b2lkICpwLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIGlmIChwICYmIGxoKSB7Ci0JLyogVW5sb2NrIHdoYXQgd2UgbG9ja2VkICovCi0JTURMICpwTWRsID0gKigoUE1ETCopKCZsaC0+aCkpOwotCU1tVW5sb2NrUGFnZXMocE1kbCk7Ci0JSW9GcmVlTWRsKHBNZGwpOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXMoCi0gICAgdm9pZCAoKnApKCksCi0gICAgdWludCBsZW4sCi0gICAgUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKAotICAgIHZvaWQgKCpwKSgpLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI3YmFlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXJzCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19OVERSVl9PU0hEUl9ICi0jZGVmaW5lIF9fTlREUlZfT1NIRFJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIFR5cGVkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBJbnRlcm5hbCB1bmljb2RlIHN0cmluZyBoYW5kbGluZyBmdW5jdGlvbnMgKi8KLQotVU5JQ09ERV9TVFJJTkcgKiAgICBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhjb25zdCBjaGFyICpjc3RyKTsKLXZvaWQgICAgICAgICAgICAgICAgX1BNX0ZyZWVVbmljb2RlU3RyaW5nKFVOSUNPREVfU1RSSU5HICp1bmlTdHIpOwotCi0jZW5kaWYgIC8qIF9fTlREUlZfT1NIRFJfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjA2MzEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDkzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVycy4KLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWNoYXIgICAgICAgICAgICAgICAgX1BNX2NudFBhdGhbUE1fTUFYX1BBVEhdID0gIiI7Ci1jaGFyICAgICAgICAgICAgICAgIF9QTV9udWNsZXVzUGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKLXN0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotc3RhdGljIGNoYXIgKnN6TlRXaW5kb3dzS2V5ICAgICA9ICJcXFJFR0lTVFJZXFxNYWNoaW5lXFxTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzIE5UXFxDdXJyZW50VmVyc2lvbiI7Ci1zdGF0aWMgY2hhciAqc3pOVFN5c3RlbVJvb3QgICAgID0gIlN5c3RlbVJvb3QiOwotc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWVLZXkgICA9ICJcXFJFR0lTVFJZXFxNYWNoaW5lXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxDb21wdXRlck5hbWVcXENvbXB1dGVyTmFtZSI7Ci1zdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZUtleU5UID0gIlxcUkVHSVNUUllcXE1hY2hpbmVcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXENvbXB1dGVyTmFtZVxcQWN0aXZlQ29tcHV0ZXJOYW1lIjsKLXN0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lICAgICAgPSAiQ29tcHV0ZXJOYW1lIjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIC8qIEluaXRpYWxpYXNlIHRoZSBNVFJSIG1vZHVsZSAqLwotICAgIE1UUlJfaW5pdCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsKLSAgICByZXR1cm4gX09TX1dJTk5URFJWOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNXzM4NjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGUgZmF0YWwgZXJyb3JzIGludGVybmFsbHkgaW4gdGhlIGRyaXZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoCi0gICAgY29uc3QgY2hhciAqbXNnKQotewotICAgIFVMT05HICAgQnVnQ2hlY2tDb2RlID0gMDsKLSAgICBVTE9ORyAgIE1vcmVCdWdDaGVja0RhdGFbNF0gPSB7MH07Ci0gICAgY2hhciAgICAqcDsKLSAgICBVTE9ORyAgIGxlbjsKLQotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotCi0jaWZkZWYgREJHCS8qIFNlbmQgb3V0cHV0IHRvIGRlYnVnZ2VyLCBqdXN0IHJldHVybiBzbyBhcyBub3QgdG8gZm9yY2UgYSByZWJvb3QgKi8KLSNwcmFnbWEgbWVzc2FnZSgiSU5GTzogYnVpbGRpbmcgZm9yIGRlYnVnLCBQTV9mYXRhbEVycm9yKCkgcmUtcm91dGVkIikKLQlEQkdNU0cyKCJTRERIRUxQPiBQTV9mYXRhbEVycm9yKCk6IEVSUk9SOiAlc1xuIiwgbXNnKTsKLQlyZXR1cm4gOwotI2VuZGlmCi0gICAgLyogS2VCdWdDaGVja0V4IGJyaW5ncyBkb3duIHRoZSBzeXN0ZW0gaW4gYSBjb250cm9sbGVkICovCi0gICAgLyogbWFubmVyIHdoZW4gdGhlIGNhbGxlciBkaXNjb3ZlcnMgYW4gdW5yZWNvdmVyYWJsZSAqLwotICAgIC8qIGluY29uc2lzdGVuY3kgdGhhdCB3b3VsZCBjb3JydXB0IHRoZSBzeXN0ZW0gaWYgKi8KLSAgICAvKiB0aGUgY2FsbGVyIGNvbnRpbnVlZCB0byBydW4uICovCi0gICAgLyogKi8KLSAgICAvKiBoYWNrIC0gZHVtcCB0aGUgZmlyc3QgMjAgY2hhcnMgaW4gaGV4IHVzaW5nIHRoZSB2YXJpYWJsZXMgKi8KLSAgICAvKiAgICAgIHByb3ZpZGVkIC0gRWFjaCBVTE9ORyBpcyBlcXVhbCB0byBmb3VyIGNoYXJhY3RlcnMuLi4gKi8KLSAgICBmb3IobGVuID0gMDsgbGVuIDwgMjA7IGxlbisrKQotCWlmIChtc2dbbGVuXSA9PSAoY2hhcikwKQotCSAgICBicmVhazsKLQotICAgIC8qIFRoaXMgbG9va3MgYmFkIGJ1dCBpdCdzIHF1aWNrIGFuZCByZWxpYWJsZS4uLiAqLwotICAgIHAgPSAoY2hhciAqKSZCdWdDaGVja0NvZGU7Ci0gICAgaWYobGVuID4gMCkgcFszXSA9IG1zZ1swXTsKLSAgICBpZihsZW4gPiAxKSBwWzJdID0gbXNnWzFdOwotICAgIGlmKGxlbiA+IDIpIHBbMV0gPSBtc2dbMl07Ci0gICAgaWYobGVuID4gMykgcFswXSA9IG1zZ1szXTsKLQotICAgIHAgPSAoY2hhciAqKSZNb3JlQnVnQ2hlY2tEYXRhWzBdOwotICAgIGlmKGxlbiA+IDQpIHBbM10gPSBtc2dbNF07Ci0gICAgaWYobGVuID4gNSkgcFsyXSA9IG1zZ1s1XTsKLSAgICBpZihsZW4gPiA2KSBwWzFdID0gbXNnWzZdOwotICAgIGlmKGxlbiA+IDcpIHBbMF0gPSBtc2dbN107Ci0KLSAgICBwID0gKGNoYXIgKikmTW9yZUJ1Z0NoZWNrRGF0YVsxXTsKLSAgICBpZihsZW4gPiA4KSBwWzNdID0gbXNnWzhdOwotICAgIGlmKGxlbiA+IDkpIHBbMl0gPSBtc2dbOV07Ci0gICAgaWYobGVuID4gMTApIHBbMV0gPSBtc2dbMTBdOwotICAgIGlmKGxlbiA+IDExKSBwWzBdID0gbXNnWzExXTsKLQotICAgIHAgPSAoY2hhciAqKSZNb3JlQnVnQ2hlY2tEYXRhWzJdOwotICAgIGlmKGxlbiA+IDEyKSBwWzNdID0gbXNnWzEyXTsKLSAgICBpZihsZW4gPiAxMykgcFsyXSA9IG1zZ1sxM107Ci0gICAgaWYobGVuID4gMTQpIHBbMV0gPSBtc2dbMTRdOwotICAgIGlmKGxlbiA+IDE1KSBwWzBdID0gbXNnWzE1XTsKLQotICAgIHAgPSAoY2hhciAqKSZNb3JlQnVnQ2hlY2tEYXRhWzNdOwotICAgIGlmKGxlbiA+IDE2KSBwWzNdID0gbXNnWzE2XTsKLSAgICBpZihsZW4gPiAxNykgcFsyXSA9IG1zZ1sxN107Ci0gICAgaWYobGVuID4gMTgpIHBbMV0gPSBtc2dbMThdOwotICAgIGlmKGxlbiA+IDE5KSBwWzBdID0gbXNnWzE5XTsKLQotICAgIC8qIEhhbHQgdGhlIHN5c3RlbSEgKi8KLSAgICBLZUJ1Z0NoZWNrRXgoQnVnQ2hlY2tDb2RlLCBNb3JlQnVnQ2hlY2tEYXRhWzBdLCBNb3JlQnVnQ2hlY2tEYXRhWzFdLCBNb3JlQnVnQ2hlY2tEYXRhWzJdLCBNb3JlQnVnQ2hlY2tEYXRhWzNdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBwYXRoIG9yIHdvcmtpbmcgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgc3RybmNweShwYXRoLF9QTV9jbnRQYXRoLG1heExlbik7Ci0gICAgcGF0aFttYXhMZW4tMV0gPSAwOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXN6S2V5ICAgICAgIC0gS2V5IHRvIHF1ZXJ5IChjYW4gY29udGFpbiB2ZXJzaW9uIG51bWJlciBmb3JtYXR0aW5nKQotc3pWYWx1ZSAgICAgLSBWYWx1ZSB0byBnZXQgaW5mb3JtYXRpb24gZm9yCi12YWx1ZSAgICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWdpc3RyeSBrZXkgZGF0YSByZWFkCi1zaXplICAgICAgICAtIFNpemUgb2YgdGhlIHN0cmluZyBidWZmZXIgdG8gcmVhZCBpbnRvCi0KLVJFVFVSTlM6Ci10cnVlIGlmIHRoZSBrZXkgd2FzIGZvdW5kLCBmYWxzZSBpZiBub3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIFJFR19xdWVyeVN0cmluZygKLSAgICBjaGFyICpzektleSwKLSAgICBjb25zdCBjaGFyICpzelZhbHVlLAotICAgIGNoYXIgKnZhbHVlLAotICAgIERXT1JEIHNpemUpCi17Ci0gICAgaWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICBydmFsOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlOwotICAgIE9CSkVDVF9BVFRSSUJVVEVTICAgICAgICAgICAgICAga2V5QXR0cmlidXRlczsKLSAgICBVTklDT0RFX1NUUklORyAgICAgICAgICAgICAgICAgICp1bmlLZXkgPSBOVUxMOwotICAgIFVOSUNPREVfU1RSSU5HICAgICAgICAgICAgICAgICAgKnVuaVZhbHVlID0gTlVMTDsKLSAgICBQS0VZX1ZBTFVFX0ZVTExfSU5GT1JNQVRJT04JCWZ1bGxJbmZvID0gTlVMTDsKLSAgICBTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2RhdGE7Ci0gICAgVU5JQ09ERV9TVFJJTkcgICAgICAgICAgICAgICAgICB1bmlkYXRhOwotCi0gICAgLyogQ29udmVydCBzdHJpbmdzIHRvIFVuaUNvZGUgKi8KLSAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICBpZiAoKHVuaUtleSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKHN6S2V5KSkgPT0gTlVMTCkKLQlnb3RvIEV4aXQ7Ci0gICAgaWYgKCh1bmlWYWx1ZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKHN6VmFsdWUpKSA9PSBOVUxMKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIE9wZW4gdGhlIGtleSAqLwotICAgIEluaXRpYWxpemVPYmplY3RBdHRyaWJ1dGVzKCAma2V5QXR0cmlidXRlcywKLQkJCQl1bmlLZXksCi0JCQkJT0JKX0NBU0VfSU5TRU5TSVRJVkUsCi0JCQkJTlVMTCwKLQkJCQlOVUxMICk7Ci0gICAgcnZhbCA9IFp3T3BlbktleSggJkhhbmRsZSwKLQkJICAgICAgS0VZX0FMTF9BQ0NFU1MsCi0JCSAgICAgICZrZXlBdHRyaWJ1dGVzICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTKHJ2YWwpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIFF1ZXJ5IHRoZSB2YWx1ZSAqLwotICAgIGxlbmd0aCA9IHNpemVvZiAoS0VZX1ZBTFVFX0ZVTExfSU5GT1JNQVRJT04pCi0JICAgKyBzaXplICogc2l6ZW9mKFdDSEFSKTsKLSAgICBpZiAoKGZ1bGxJbmZvID0gRXhBbGxvY2F0ZVBvb2wgKFBhZ2VkUG9vbCwgbGVuZ3RoKSkgPT0gTlVMTCkKLQlnb3RvIEV4aXQ7Ci0gICAgUnRsWmVyb01lbW9yeShmdWxsSW5mbywgbGVuZ3RoKTsKLSAgICBydmFsID0gWndRdWVyeVZhbHVlS2V5IChIYW5kbGUsCi0JCQkgICAgdW5pVmFsdWUsCi0JCQkgICAgS2V5VmFsdWVGdWxsSW5mb3JtYXRpb24sCi0JCQkgICAgZnVsbEluZm8sCi0JCQkgICAgbGVuZ3RoLAotCQkJICAgICZsZW5ndGgpOwotICAgIGlmIChOVF9TVUNDRVNTIChydmFsKSkgewotCS8qIENyZWF0ZSB0aGUgVW5pQ29kZSBzdHJpbmcgc28gd2UgY2FuIGNvbnZlcnQgaXQgKi8KLQl1bmlkYXRhLkJ1ZmZlciA9IChQV0NIQVIpKCgoUENIQVIpZnVsbEluZm8pICsgZnVsbEluZm8tPkRhdGFPZmZzZXQpOwotCXVuaWRhdGEuTGVuZ3RoID0gKFVTSE9SVClmdWxsSW5mby0+RGF0YUxlbmd0aDsKLQl1bmlkYXRhLk1heGltdW1MZW5ndGggPSAoVVNIT1JUKWZ1bGxJbmZvLT5EYXRhTGVuZ3RoICsgc2l6ZW9mKFdDSEFSKTsKLQotCS8qIENvbnZlcnQgdW5pY29kZSB1bml2YWx1ZSB0byBhbnNpIHN0cmluZy4gKi8KLQlydmFsID0gUnRsVW5pY29kZVN0cmluZ1RvQW5zaVN0cmluZygmc3RyaW5nZGF0YSwgJnVuaWRhdGEsIFRSVUUpOwotCWlmIChOVF9TVUNDRVNTKHJ2YWwpKSB7Ci0JICAgIHN0cmNweSh2YWx1ZSxzdHJpbmdkYXRhLkJ1ZmZlcik7Ci0JICAgIHN0YXR1cyA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLUV4aXQ6Ci0gICAgaWYgKGZ1bGxJbmZvKSBFeEZyZWVQb29sKGZ1bGxJbmZvKTsKLSAgICBpZiAodW5pS2V5KSBfUE1fRnJlZVVuaWNvZGVTdHJpbmcodW5pS2V5KTsKLSAgICBpZiAodW5pVmFsdWUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlWYWx1ZSk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGRyaXZlIGxldHRlciBmb3IgdGhlIGJvb3QgZHJpdmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsKLSAgICBjaGFyIHBhdGhbMjU2XTsKLSAgICBpZiAoUkVHX3F1ZXJ5U3RyaW5nKHN6TlRXaW5kb3dzS2V5LHN6TlRTeXN0ZW1Sb290LHBhdGgsc2l6ZW9mKHBhdGgpKSkKLQlyZXR1cm4gJ2MnOwotICAgIHJldHVybiBwYXRoWzBdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgVkJFL0FGIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17Ci0gICAgcmV0dXJuICJjOlxcIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLQotICAgIGlmIChzdHJsZW4oX1BNX251Y2xldXNQYXRoKSA+IDApIHsKLQlzdHJjcHkocGF0aCxfUE1fbnVjbGV1c1BhdGgpOwotCVBNX2JhY2tzbGFzaChwYXRoKTsKLQlyZXR1cm4gcGF0aDsKLQl9Ci0gICAgaWYgKCFSRUdfcXVlcnlTdHJpbmcoc3pOVFdpbmRvd3NLZXksc3pOVFN5c3RlbVJvb3QscGF0aCxzaXplb2YocGF0aCkpKQotCXN0cmNweShwYXRoLCJjOlxcd2lubnQiKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsInN5c3RlbTMyXFxudWNsZXVzIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQotewotICAgIHJldHVybiBQTV9nZXRNYWNoaW5lTmFtZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZSBvbiB0aGUgbmV0d29yay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBuYW1lWzI1Nl07Ci0KLSAgICBpZiAoUkVHX3F1ZXJ5U3RyaW5nKHN6TWFjaGluZU5hbWVLZXksc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCi0JcmV0dXJuIG5hbWU7Ci0gICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek1hY2hpbmVOYW1lS2V5TlQsc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCi0JcmV0dXJuIG5hbWU7Ci0gICAgcmV0dXJuICJVbmtub3duIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVjayBpZiBhIGtleSBoYXMgYmVlbiBwcmVzc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XYWl0IGZvciBhbmQgcmV0dXJuIHRoZSBuZXh0IGtleXByZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICByZXR1cm4gMHhEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW4gYSBjb25zb2xlIGZvciBvdXRwdXQgdG8gdGhlIHNjcmVlbiwgY3JlYXRpbmcgdGhlIG1haW4gZXZlbnQgaGFuZGxpbmcKLXdpbmRvdyBpZiBuZWNlc3NhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRVc2VyLAotICAgIGludCBkZXZpY2UsCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMsCi0gICAgaW50IGJwcCwKLSAgICBpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClod25kVXNlcjsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgKHZvaWQpeFJlczsKLSAgICAodm9pZCl5UmVzOwotICAgICh2b2lkKWJwcDsKLSAgICAodm9pZClmdWxsU2NyZWVuOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHNpemUgb2YgdGhlIGNvbnNvbGUgc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSgKLSAgICB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClzdGF0ZUJ1ZjsKLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgZm9yIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpc2F2ZVN0YXRlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKAotICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKXN0YXRlQnVmOwotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNsb3NlIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFdpbmRvd3MgKi8KLSAgICAodm9pZCl4OwotICAgICh2b2lkKXk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSB3aWR0aCBvZiB0aGUgT1MgY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldE9TU2NyZWVuV2lkdGgoCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQpCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBmb3IgV2luZG93cyAqLwotICAgICh2b2lkKXdpZHRoOwotICAgICh2b2lkKWhlaWdodDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXBzIGEgc2hhcmVkIG1lbW9yeSBibG9jayBpbnRvIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gRG9lcyBub3RoaW5nIHNpbmNlCi10aGUgbWVtb3J5IGJsb2NrcyBhcmUgYWxyZWFkeSBnbG9iYWxseSBtYXBwZWQgaW50byBhbGwgcHJvY2Vzc2VzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3MoCi0gICAgdm9pZCAqYmFzZSwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBOb3QgdXNlZCBhbnltb3JlICovCi0gICAgKHZvaWQpYmFzZTsKLSAgICAodm9pZClsaW1pdDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgLyogVGhpcyBtYXkgbm90IGJlIHBvc3NpYmxlIGluIE5UIGFuZCBzaG91bGQgYmUgZG9uZSBieSB0aGUgT1MgYW55d2F5ICovCi0gICAgKHZvaWQpYXhWYWw7Ci0gICAgKHZvaWQpQklPU1BoeXNBZGRyOwotICAgICh2b2lkKW1hcHBlZEJJT1M7Ci0gICAgKHZvaWQpQklPU0xlbjsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVhbCBtb2RlIEJJT1MgZGF0YSBhcmVhLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIC8qIE5vdGUgdGhhdCBvbiBOVCB0aGlzIHByb2JhYmx5IGRvZXMgbm90IGRvIHdoYXQgd2UgZXhwZWN0ISAqLwotICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHg0MDAsIDB4MTAwMCwgdHJ1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byAweEEwMDAwIHBoeXNpY2FsIFZHQSBncmFwaGljcyBmcmFtZWJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRixmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NsZWVwKAotICAgIHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICAvKiBXZSBuZXZlciB1c2UgdGhpcyBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpbWlsbGlzZWNvbmRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYmFzZSBJL08gcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBDT00gcG9ydC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCWNhc2UgMjogcmV0dXJuIDB4M0U4OwotCWNhc2UgMzogcmV0dXJuIDB4MkU4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgTFBUIHBvcnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyBhdmFpbGFibGUgbWVtb3J5LiBOb3QgcG9zc2libGUgdW5kZXIgV2luZG93cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSgKLSAgICB1bG9uZyAqcGh5c2ljYWwsCi0gICAgdWxvbmcgKnRvdGFsKQotewotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0YXJ0IGEgZGlyZWN0b3J5IGVudW1lcmF0aW9uIHNlYXJjaCAqLwotICAgIC8qICAgICAgIGdpdmVuIHRoZSBmaWxlbmFtZSAod2l0aCB3aWxkY2FyZHMpLiBUaGUgZGF0YSBzaG91bGQgYmUgKi8KLSAgICAvKiAgICAgICBjb252ZXJ0ZWQgYW5kIHJldHVybmVkIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgZW51bWVyYXRpb24gKi8KLSAgICAvKiAgICAgICBzZWFyY2ggZ2l2ZW4gdGhlIHNlYXJjaCBjcml0ZXJpYSBkZWZpbmVkIGluIHRoZSBjYWxsIHRvICovCi0gICAgLyogICAgICAgUE1fZmluZEZpcnN0RmlsZS4gVGhlIGRhdGEgc2hvdWxkIGJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgKi8KLSAgICAvKiAgICAgICBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2xvc2UgdGhlIGZpbmQgcHJvY2Vzcy4gVGhpcyBtYXkgZG8gKi8KLSAgICAvKiAgICAgICBub3RoaW5nIGZvciBzb21lIE9TJ2VzLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClkcml2ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWRyaXZlOwotICAgICh2b2lkKWRpcjsKLSAgICAodm9pZClsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVUVVJOUzoKLUVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgQUNDRVNTX01BU0sgICAgICAgICAgICAgRGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7Ci0gICAgT0JKRUNUX0FUVFJJQlVURVMgICAgICAgT2JqZWN0QXR0cmlidXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBTaGFyZUFjY2VzcyA9IEZJTEVfU0hBUkVfUkVBRDsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBDcmVhdGVEaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKLSAgICBIQU5ETEUgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlID0gTlVMTDsKLSAgICBVTklDT0RFX1NUUklORyAgICAgICAgICAqdW5pRmlsZSA9IE5VTEw7Ci0gICAgSU9fU1RBVFVTX0JMT0NLICAgICAgICAgSW9TdGF0dXNCbG9jazsKLSAgICBGSUxFX0JBU0lDX0lORk9STUFUSU9OICBGaWxlQmFzaWM7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAga2VybmVsRmlsZW5hbWVbUE1fTUFYX1BBVEgrNV07Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgRmlsZUF0dHJpYnV0ZXMgPSAwOwotCi0gICAgLyogQ29udmVydCBmaWxlIGF0dHJpYnV0ZSBmbGFncyAqLwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCUZpbGVBdHRyaWJ1dGVzIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JRmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCi0JRmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKLQlGaWxlQXR0cmlidXRlcyB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07Ci0KLSAgICAvKiBBZGQgcHJlZml4IGZvciBhZGRyZXNzaW5nIHRoZSBmaWxlIHN5c3RlbS4gIlw/P1wiIGlzIHNob3J0IGZvciAiXERvc0RldmljZXNcIiAqLwotICAgIHN0cmNweShrZXJuZWxGaWxlbmFtZSwgIlxcPz9cXCIpOwotICAgIHN0cmNhdChrZXJuZWxGaWxlbmFtZSwgZmlsZW5hbWUpOwotCi0gICAgLyogQ29udmVydCBmaWxlbmFtZSBzdHJpbmcgdG8gYW5zaSBzdHJpbmcgKi8KLSAgICBpZiAoKHVuaUZpbGUgPSBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhrZXJuZWxGaWxlbmFtZSkpID09IE5VTEwpCi0JZ290byBFeGl0OwotCi0gICAgLyogTXVzdCBvcGVuIGEgZmlsZSB0byBxdWVyeSBpdCdzIGF0dHJpYnV0ZXMgKi8KLSAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyAoJk9iamVjdEF0dHJpYnV0ZXMsCi0JCQkJdW5pRmlsZSwKLQkJCQlPQkpfQ0FTRV9JTlNFTlNJVElWRSwKLQkJCQlOVUxMLAotCQkJCU5VTEwgKTsKLSAgICBzdGF0dXMgPSBad0NyZWF0ZUZpbGUoICZGaWxlSGFuZGxlLAotCQkJICAgIERlc2lyZWRBY2Nlc3MgfCBTWU5DSFJPTklaRSwKLQkJCSAgICAmT2JqZWN0QXR0cmlidXRlcywKLQkJCSAgICAmSW9TdGF0dXNCbG9jaywKLQkJCSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qQWxsb2NhdGlvblNpemUgIE9QVElPTkFMLCAqLwotCQkJICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKLQkJCSAgICBTaGFyZUFjY2VzcywKLQkJCSAgICBDcmVhdGVEaXNwb3NpdGlvbiwKLQkJCSAgICBGSUxFX1JBTkRPTV9BQ0NFU1MsICAgICAgICAvKkNyZWF0ZU9wdGlvbnMsICovCi0JCQkgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKkVhQnVmZmVyICBPUFRJT05BTCwgKi8KLQkJCSAgICAwICAgICAgICAgICAgICAgICAgICAgIC8qRWFMZW5ndGggKHJlcXVpcmVkIGlmIEVhQnVmZmVyKSAqLwotCQkJICAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIFF1ZXJ5IHRpbWVzdGFtcHMgKi8KLSAgICBzdGF0dXMgPSBad1F1ZXJ5SW5mb3JtYXRpb25GaWxlKEZpbGVIYW5kbGUsCi0JCQkJICAgICZJb1N0YXR1c0Jsb2NrLAotCQkJCSAgICAmRmlsZUJhc2ljLAotCQkJCSAgICBzaXplb2YoRklMRV9CQVNJQ19JTkZPUk1BVElPTiksCi0JCQkJICAgIEZpbGVCYXNpY0luZm9ybWF0aW9uCi0JCQkJICAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIENoYW5nZSB0aGUgZm91ciBiaXRzIHdlIGNoYW5nZSAqLwotICAgIEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmPSB+KEZJTEVfQVRUUklCVVRFX1JFQURPTkxZIHwgRklMRV9BVFRSSUJVVEVfQVJDSElWRQotCQkJCSAgfCBGSUxFX0FUVFJJQlVURV9ISURERU4gfCBGSUxFX0FUVFJJQlVURV9TWVNURU0pOwotICAgIEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyB8PSBGaWxlQXR0cmlidXRlczsKLQotICAgIC8qIFNldCB0aW1lc3RhbXBzICovCi0gICAgWndTZXRJbmZvcm1hdGlvbkZpbGUoICAgRmlsZUhhbmRsZSwKLQkJCSAgICAmSW9TdGF0dXNCbG9jaywKLQkJCSAgICAmRmlsZUJhc2ljLAotCQkJICAgIHNpemVvZihGSUxFX0JBU0lDX0lORk9STUFUSU9OKSwKLQkJCSAgICBGaWxlQmFzaWNJbmZvcm1hdGlvbgotCQkJICAgICk7Ci0KLUV4aXQ6Ci0gICAgaWYgKEZpbGVIYW5kbGUpIFp3Q2xvc2UoRmlsZUhhbmRsZSk7Ci0gICAgaWYgKHVuaUZpbGUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlGaWxlKTsKLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBBQ0NFU1NfTUFTSyAgICAgICAgICAgICBEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURTsKLSAgICBPQkpFQ1RfQVRUUklCVVRFUyAgICAgICBPYmplY3RBdHRyaWJ1dGVzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFNoYXJlQWNjZXNzID0gRklMRV9TSEFSRV9SRUFEOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIENyZWF0ZURpc3Bvc2l0aW9uID0gRklMRV9PUEVOOwotICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgPSBOVUxMOwotICAgIFVOSUNPREVfU1RSSU5HICAgICAgICAgICp1bmlGaWxlID0gTlVMTDsKLSAgICBJT19TVEFUVVNfQkxPQ0sgICAgICAgICBJb1N0YXR1c0Jsb2NrOwotICAgIEZJTEVfQkFTSUNfSU5GT1JNQVRJT04gIEZpbGVCYXNpYzsKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICBrZXJuZWxGaWxlbmFtZVtQTV9NQVhfUEFUSCs1XTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBGaWxlQXR0cmlidXRlcyA9IDA7Ci0gICAgdWludCAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gMDsKLQotICAgIC8qIEFkZCBwcmVmaXggZm9yIGFkZHJlc3NpbmcgdGhlIGZpbGUgc3lzdGVtLiAiXD8/XCIgaXMgc2hvcnQgZm9yICJcRG9zRGV2aWNlc1wiICovCi0gICAgc3RyY3B5KGtlcm5lbEZpbGVuYW1lLCAiXFw/P1xcIik7Ci0gICAgc3RyY2F0KGtlcm5lbEZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0KLSAgICAvKiBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZyAqLwotICAgIGlmICgodW5pRmlsZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKGtlcm5lbEZpbGVuYW1lKSkgPT0gTlVMTCkKLQlnb3RvIEV4aXQ7Ci0KLSAgICAvKiBNdXN0IG9wZW4gYSBmaWxlIHRvIHF1ZXJ5IGl0J3MgYXR0cmlidXRlcyAqLwotICAgIEluaXRpYWxpemVPYmplY3RBdHRyaWJ1dGVzICgmT2JqZWN0QXR0cmlidXRlcywKLQkJCQl1bmlGaWxlLAotCQkJCU9CSl9DQVNFX0lOU0VOU0lUSVZFLAotCQkJCU5VTEwsCi0JCQkJTlVMTCApOwotICAgIHN0YXR1cyA9IFp3Q3JlYXRlRmlsZSggJkZpbGVIYW5kbGUsCi0JCQkgICBEZXNpcmVkQWNjZXNzIHwgU1lOQ0hST05JWkUsCi0JCQkgICAmT2JqZWN0QXR0cmlidXRlcywKLQkJCSAgICZJb1N0YXR1c0Jsb2NrLAotCQkJICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKkFsbG9jYXRpb25TaXplICBPUFRJT05BTCwgKi8KLQkJCSAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKLQkJCSAgIFNoYXJlQWNjZXNzLAotCQkJICAgQ3JlYXRlRGlzcG9zaXRpb24sCi0JCQkgICBGSUxFX1JBTkRPTV9BQ0NFU1MsICAgICAgICAvKkNyZWF0ZU9wdGlvbnMsICovCi0JCQkgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qRWFCdWZmZXIgIE9QVElPTkFMLCAqLwotCQkJICAgMCAgICAgICAgICAgICAgICAgICAgICAvKkVhTGVuZ3RoIChyZXF1aXJlZCBpZiBFYUJ1ZmZlcikgKi8KLQkJCSAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIFF1ZXJ5IHRpbWVzdGFtcHMgKi8KLSAgICBzdGF0dXMgPSBad1F1ZXJ5SW5mb3JtYXRpb25GaWxlKEZpbGVIYW5kbGUsCi0JCQkJICAgICZJb1N0YXR1c0Jsb2NrLAotCQkJCSAgICAmRmlsZUJhc2ljLAotCQkJCSAgICBzaXplb2YoRklMRV9CQVNJQ19JTkZPUk1BVElPTiksCi0JCQkJICAgIEZpbGVCYXNpY0luZm9ybWF0aW9uCi0JCQkJICAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIFRyYW5zbGF0ZSB0aGUgZmlsZSBhdHRyaWJ1dGVzICovCi0gICAgaWYgKEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKQotCXJldHZhbCB8PSBQTV9GSUxFX1JFQURPTkxZOwotICAgIGlmIChGaWxlQmFzaWMuRmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9BUkNISVZFKQotCXJldHZhbCB8PSBQTV9GSUxFX0FSQ0hJVkU7Ci0gICAgaWYgKEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0hJRERFTikKLQlyZXR2YWwgfD0gUE1fRklMRV9ISURERU47Ci0gICAgaWYgKEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1NZU1RFTSkKLQlyZXR2YWwgfD0gUE1fRklMRV9TWVNURU07Ci0KLUV4aXQ6Ci0gICAgaWYgKEZpbGVIYW5kbGUpIFp3Q2xvc2UoRmlsZUhhbmRsZSk7Ci0gICAgaWYgKHVuaUZpbGUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlGaWxlKTsKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3N0ZGlvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NThmMWM4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3N0ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZHJpdmVyCi0qCi0qIERlc2NyaXB0aW9uOiAgQyBsaWJyYXJ5IGNvbXBhdGlibGUgSS9PIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGhpbiBhIFdpbmRvd3MKLSogICAgICAgICAgICAgICBOVCBkcml2ZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIENvZGUgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZvcGVuIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUZJTEUgKiBmb3BlbigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBjb25zdCBjaGFyICptb2RlKQotewotICAgIEFDQ0VTU19NQVNLICAgICAgICAgICAgICAgICBEZXNpcmVkQWNjZXNzOyAgICAgIC8qIGZvciBad0NyZWF0ZUZpbGUuLi4gKi8KLSAgICBPQkpFQ1RfQVRUUklCVVRFUyAgICAgICAgICAgT2JqZWN0QXR0cmlidXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVBY2Nlc3M7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZURpc3Bvc2l0aW9uOwotICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgSEFORExFICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGU7Ci0gICAgVU5JQ09ERV9TVFJJTkcgICAgICAgICAgICAgICp1bmlGaWxlID0gTlVMTDsKLSAgICBQV0NIQVIgICAgICAgICAgICAgICAgICAgICAgYnVmRmlsZSA9IE5VTEw7Ci0gICAgSU9fU1RBVFVTX0JMT0NLICAgICAgICAgICAgIElvU3RhdHVzQmxvY2s7Ci0gICAgRklMRV9TVEFOREFSRF9JTkZPUk1BVElPTiAgIEZpbGVJbmZvcm1hdGlvbjsKLSAgICBGSUxFX1BPU0lUSU9OX0lORk9STUFUSU9OICAgRmlsZVBvc2l0aW9uOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxGaWxlbmFtZVtQTV9NQVhfUEFUSCs1XTsKLSAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgKmY7Ci0KLSAgICAvKiBBZGQgcHJlZml4IGZvciBhZGRyZXNzaW5nIHRoZSBmaWxlIHN5c3RlbS4gIlw/P1wiIGlzIHNob3J0IGZvciAiXERvc0RldmljZXNcIiAqLwotICAgIHN0cmNweShrZXJuZWxGaWxlbmFtZSwgIlxcPz9cXCIpOwotICAgIHN0cmNhdChrZXJuZWxGaWxlbmFtZSwgZmlsZW5hbWUpOwotICAgIGlmICgoZiA9IFBNX21hbGxvYyhzaXplb2YoRklMRSkpKSA9PSBOVUxMKQotCWdvdG8gRXJyb3I7Ci0gICAgZi0+b2Zmc2V0ID0gMDsKLSAgICBmLT50ZXh0ID0gKG1vZGVbMV0gPT0gJ3QnIHx8IG1vZGVbMl0gPT0gJ3QnKTsKLSAgICBmLT53cml0ZW1vZGUgPSAobW9kZVswXSA9PSAndycpIHx8IChtb2RlWzBdID09ICdhJyk7Ci0gICAgaWYgKG1vZGVbMF0gPT0gJ3InKSB7Ci0JLyogb21vZGUgPSBPUEVOX0FDQ0VTU19SRUFET05MWSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsgKi8KLQkvKiBhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfT1BFTiB8IEFDVElPTl9JRk5PVEVYSVNUU19GQUlMOyAqLwotCURlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7Ci0JU2hhcmVBY2Nlc3MgPSBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFOwotCUNyZWF0ZURpc3Bvc2l0aW9uID0gRklMRV9PUEVOOwotCX0KLSAgICBlbHNlIGlmIChtb2RlWzBdID09ICd3JykgewotCS8qIG9tb2RlID0gT1BFTl9BQ0NFU1NfV1JJVEVPTkxZIHwgT1BFTl9TSEFSRV9DT01QQVRJQkxFOyAqLwotCS8qIGFjdGlvbiA9IEFDVElPTl9JRkVYSVNUU19UUlVOQ0FURSB8IEFDVElPTl9JRk5PVEVYSVNUU19DUkVBVEU7ICovCi0JRGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfV1JJVEU7Ci0JU2hhcmVBY2Nlc3MgPSBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFOwotCUNyZWF0ZURpc3Bvc2l0aW9uID0gRklMRV9TVVBFUlNFREU7Ci0JfQotICAgIGVsc2UgewotCS8qIG9tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9DT01QQVRJQkxFOyAqLwotCS8qIGFjdGlvbiA9IEFDVElPTl9JRkVYSVNUU19PUEVOIHwgQUNUSU9OX0lGTk9URVhJU1RTX0NSRUFURTsgKi8KLQlEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURTsKLQlTaGFyZUFjY2VzcyA9IEZJTEVfU0hBUkVfUkVBRDsKLQlDcmVhdGVEaXNwb3NpdGlvbiA9IEZJTEVfT1BFTl9JRjsKLQl9Ci0KLSAgICAvKiBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZyBhbmQgdGhlbiB0byBVbmlDb2RlIHN0cmluZyAqLwotICAgIGlmICgodW5pRmlsZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKGtlcm5lbEZpbGVuYW1lKSkgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIENyZWF0ZSB0aGUgZmlsZSAqLwotICAgIEluaXRpYWxpemVPYmplY3RBdHRyaWJ1dGVzICgmT2JqZWN0QXR0cmlidXRlcywKLQkJCQl1bmlGaWxlLAotCQkJCU9CSl9DQVNFX0lOU0VOU0lUSVZFLAotCQkJCU5VTEwsCi0JCQkJTlVMTCk7Ci0gICAgc3RhdHVzID0gWndDcmVhdGVGaWxlKCAmRmlsZUhhbmRsZSwKLQkJCSAgICBEZXNpcmVkQWNjZXNzIHwgU1lOQ0hST05JWkUsCi0JCQkgICAgJk9iamVjdEF0dHJpYnV0ZXMsCi0JCQkgICAgJklvU3RhdHVzQmxvY2ssCi0JCQkgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGlvblNpemUgIE9QVElPTkFMLCAqLwotCQkJICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKLQkJCSAgICBTaGFyZUFjY2VzcywKLQkJCSAgICBDcmVhdGVEaXNwb3NpdGlvbiwKLQkJCSAgICBGSUxFX1JBTkRPTV9BQ0NFU1MsICAgICAvKiBDcmVhdGVPcHRpb25zLCAqLwotCQkJICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIEVhQnVmZmVyICBPUFRJT05BTCwgKi8KLQkJCSAgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBFYUxlbmd0aCAocmVxdWlyZWQgaWYgRWFCdWZmZXIpICovCi0JCQkgICAgKTsKLSAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JZ290byBFcnJvcjsKLSAgICBmLT5oYW5kbGUgPSAoaW50KUZpbGVIYW5kbGU7Ci0KLSAgICAvKiBEZXRlcm1pbmUgc2l6ZSBvZiB0aGUgZmlsZSAqLwotICAgIHN0YXR1cyA9IFp3UXVlcnlJbmZvcm1hdGlvbkZpbGUoICBGaWxlSGFuZGxlLAotCQkJCSAgICAgICZJb1N0YXR1c0Jsb2NrLAotCQkJCSAgICAgICZGaWxlSW5mb3JtYXRpb24sCi0JCQkJICAgICAgc2l6ZW9mKEZJTEVfU1RBTkRBUkRfSU5GT1JNQVRJT04pLAotCQkJCSAgICAgIEZpbGVTdGFuZGFyZEluZm9ybWF0aW9uCi0JCQkJICAgICAgKTsKLSAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JZ290byBFcnJvcjsKLSAgICBmLT5maWxlc2l6ZSA9IEZpbGVJbmZvcm1hdGlvbi5FbmRPZkZpbGUuTG93UGFydDsKLQotICAgIC8qIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBpZiB3ZSBhcmUgYXBwZW5kaW5nICovCi0gICAgaWYgKG1vZGVbMF0gPT0gJ2EnKSB7Ci0JRmlsZVBvc2l0aW9uLkN1cnJlbnRCeXRlT2Zmc2V0LkhpZ2hQYXJ0ID0gMDsKLQlGaWxlUG9zaXRpb24uQ3VycmVudEJ5dGVPZmZzZXQuTG93UGFydCA9IGYtPmZpbGVzaXplOwotCXN0YXR1cyA9IFp3U2V0SW5mb3JtYXRpb25GaWxlKCAgRmlsZUhhbmRsZSwKLQkJCQkJJklvU3RhdHVzQmxvY2ssCi0JCQkJCSZGaWxlUG9zaXRpb24sCi0JCQkJCXNpemVvZihGSUxFX1BPU0lUSU9OX0lORk9STUFUSU9OKSwKLQkJCQkJRmlsZVBvc2l0aW9uSW5mb3JtYXRpb24KLQkJCQkJKTsKLQlpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JICAgIGdvdG8gRXJyb3I7Ci0JfQotICAgIHJldHVybiBmOwotCi1FcnJvcjoKLSAgICBpZiAoZikgUE1fZnJlZShmKTsKLSAgICBpZiAodW5pRmlsZSkgX1BNX0ZyZWVVbmljb2RlU3RyaW5nKHVuaUZpbGUpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZyZWFkIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNpemVfdCBmcmVhZCgKLSAgICB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUsCi0gICAgc2l6ZV90IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBOVFNUQVRVUyAgICAgICAgc3RhdHVzOwotICAgIElPX1NUQVRVU19CTE9DSyBJb1N0YXR1c0Jsb2NrOwotICAgIExBUkdFX0lOVEVHRVIgICBCeXRlT2Zmc2V0OwotCi0gICAgLyogUmVhZCBhbnkgZXh0cmEgYnl0ZXMgZnJvbSB0aGUgZmlsZSAqLwotICAgIEJ5dGVPZmZzZXQuSGlnaFBhcnQgPSAwOwotICAgIEJ5dGVPZmZzZXQuTG93UGFydCA9IGYtPm9mZnNldDsKLSAgICBzdGF0dXMgPSBad1JlYWRGaWxlKCAoSEFORExFKWYtPmhhbmRsZSwKLQkJCSBOVUxMLCAgICAgICAgICAgICAgLypJTiBIQU5ETEUgIEV2ZW50ICBPUFRJT05BTCwgKi8KLQkJCSBOVUxMLCAgICAgICAgICAgICAgLyogIElOIFBJT19BUENfUk9VVElORSAgQXBjUm91dGluZSAgT1BUSU9OQUwsICovCi0JCQkgTlVMTCwgICAgICAgICAgICAgIC8qICBJTiBQVk9JRCAgQXBjQ29udGV4dCAgT1BUSU9OQUwsICovCi0JCQkgJklvU3RhdHVzQmxvY2ssCi0JCQkgcHRyLCAgICAgICAgICAgICAgIC8qICBPVVQgUFZPSUQgIEJ1ZmZlciwgKi8KLQkJCSBzaXplICogbiwgICAgICAgICAgLypJTiBVTE9ORyAgTGVuZ3RoLCAqLwotCQkJICZCeXRlT2Zmc2V0LCAgICAgICAvKk9QVElPTkFMLCAqLwotCQkJIE5VTEwgICAgICAgICAgICAgICAvKklOIFBVTE9ORyAgS2V5ICBPUFRJT05BTCAqLwotCQkJICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCXJldHVybiAwOwotICAgIGYtPm9mZnNldCArPSBJb1N0YXR1c0Jsb2NrLkluZm9ybWF0aW9uOwotICAgIHJldHVybiBJb1N0YXR1c0Jsb2NrLkluZm9ybWF0aW9uIC8gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmd3JpdGUgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc2l6ZV90IGZ3cml0ZSgKLSAgICBjb25zdCB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUsCi0gICAgc2l6ZV90IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBOVFNUQVRVUyAgICAgICAgc3RhdHVzOwotICAgIElPX1NUQVRVU19CTE9DSyBJb1N0YXR1c0Jsb2NrOwotICAgIExBUkdFX0lOVEVHRVIgICBCeXRlT2Zmc2V0OwotCi0gICAgaWYgKCFmLT53cml0ZW1vZGUpCi0JcmV0dXJuIDA7Ci0gICAgQnl0ZU9mZnNldC5IaWdoUGFydCA9IDA7Ci0gICAgQnl0ZU9mZnNldC5Mb3dQYXJ0ID0gZi0+b2Zmc2V0OwotICAgIHN0YXR1cyA9IFp3V3JpdGVGaWxlKCAoSEFORExFKWYtPmhhbmRsZSwKLQkJCSAgTlVMTCwgICAgICAgICAgICAgLypJTiBIQU5ETEUgIEV2ZW50ICBPUFRJT05BTCwgKi8KLQkJCSAgTlVMTCwgICAgICAgICAgICAgLyogIElOIFBJT19BUENfUk9VVElORSAgQXBjUm91dGluZSAgT1BUSU9OQUwsICovCi0JCQkgIE5VTEwsICAgICAgICAgICAgIC8qICBJTiBQVk9JRCAgQXBjQ29udGV4dCAgT1BUSU9OQUwsICovCi0JCQkgICZJb1N0YXR1c0Jsb2NrLAotCQkJICAodm9pZCopcHRyLCAgICAgICAvKiAgT1VUIFBWT0lEICBCdWZmZXIsICovCi0JCQkgIHNpemUgKiBuLCAgICAgICAgIC8qSU4gVUxPTkcgIExlbmd0aCwgKi8KLQkJCSAgJkJ5dGVPZmZzZXQsICAgICAgLypPUFRJT05BTCwgKi8KLQkJCSAgTlVMTCAgICAgICAgICAgICAgLypJTiBQVUxPTkcgIEtleSAgT1BUSU9OQUwgKi8KLQkJCSAgKTsKLSAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JcmV0dXJuIDA7Ci0gICAgZi0+b2Zmc2V0ICs9IElvU3RhdHVzQmxvY2suSW5mb3JtYXRpb247Ci0gICAgaWYgKGYtPm9mZnNldCA+IGYtPmZpbGVzaXplKQotCWYtPmZpbGVzaXplID0gZi0+b2Zmc2V0OwotICAgIHJldHVybiBJb1N0YXR1c0Jsb2NrLkluZm9ybWF0aW9uIC8gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZmx1c2ggZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZmbHVzaCgKLSAgICBGSUxFICpmKQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSBhcyB3ZSBhcmUgbm90IGRvaW5nIGJ1ZmZlcmVkIEkvTyAqLwotICAgICh2b2lkKWY7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnNlZWsgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZzZWVrKAotICAgIEZJTEUgKmYsCi0gICAgbG9uZyBpbnQgb2Zmc2V0LAotICAgIGludCB3aGVuY2UpCi17Ci0gICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBGSUxFX1BPU0lUSU9OX0lORk9STUFUSU9OICAgRmlsZVBvc2l0aW9uOwotICAgIElPX1NUQVRVU19CTE9DSyAgICAgICAgICAgICBJb1N0YXR1c0Jsb2NrOwotCi0gICAgaWYgKHdoZW5jZSA9PSAwKQotCWYtPm9mZnNldCA9IG9mZnNldDsKLSAgICBlbHNlIGlmICh3aGVuY2UgPT0gMSkKLQlmLT5vZmZzZXQgKz0gb2Zmc2V0OwotICAgIGVsc2UgaWYgKHdoZW5jZSA9PSAyKQotCWYtPm9mZnNldCA9IGYtPmZpbGVzaXplICsgb2Zmc2V0OwotICAgIEZpbGVQb3NpdGlvbi5DdXJyZW50Qnl0ZU9mZnNldC5IaWdoUGFydCA9IDA7Ci0gICAgRmlsZVBvc2l0aW9uLkN1cnJlbnRCeXRlT2Zmc2V0Lkxvd1BhcnQgPSBmLT5vZmZzZXQ7Ci0gICAgc3RhdHVzID0gWndTZXRJbmZvcm1hdGlvbkZpbGUoIChIQU5ETEUpZi0+aGFuZGxlLAotCQkJCSAgICZJb1N0YXR1c0Jsb2NrLAotCQkJCSAgICZGaWxlUG9zaXRpb24sCi0JCQkJICAgc2l6ZW9mKEZJTEVfUE9TSVRJT05fSU5GT1JNQVRJT04pLAotCQkJCSAgIEZpbGVQb3NpdGlvbkluZm9ybWF0aW9uCi0JCQkJICAgKTsKLSAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ0ZWxsIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgZnRlbGwoCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gZi0+b2Zmc2V0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZlb2YgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZlb2YoCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gKGYtPm9mZnNldCA9PSBmLT5maWxlc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmdldHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqZmdldHMoCi0gICAgY2hhciAqcywKLSAgICBpbnQgbiwKLSAgICBGSUxFICpmKQotewotICAgIGludCAgICAgbGVuOwotICAgIGNoYXIgICAgKmNzOwotCi0gICAgLyogUmVhZCB0aGUgZW50aXJlIGJ1ZmZlciBpbnRvIG1lbW9yeSAob3VyIGZ1bmN0aW9ucyBhcmUgdW5idWZmZXJlZCEpICovCi0gICAgaWYgKChsZW4gPSBmcmVhZChzLDEsbixmKSkgPT0gMCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFNlYXJjaCBmb3IgJ1xuJyBvciBlbmQgb2Ygc3RyaW5nICovCi0gICAgaWYgKG4gPiBsZW4pCi0JbiA9IGxlbjsKLSAgICBjcyA9IHM7Ci0gICAgd2hpbGUgKC0tbiA+IDApIHsKLQlpZiAoKmNzID09ICdcbicpCi0JICAgIGJyZWFrOwotCWNzKys7Ci0JfQotICAgICpjcyA9ICdcMCc7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnB1dHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZwdXRzKAotICAgIGNvbnN0IGNoYXIgKnMsCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gZndyaXRlKHMsMSxzdHJsZW4ocyksZik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmNsb3NlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmY2xvc2UoCi0gICAgRklMRSAqZikKLXsKLSAgICBad0Nsb3NlKChIQU5ETEUpZi0+aGFuZGxlKTsKLSAgICBQTV9mcmVlKGYpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvc3RkbGliLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmMGNiZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXIKLSoKLSogRGVzY3JpcHRpb246ICBDIGxpYnJhcnkgY29tcGF0aWJsZSBzdGRsaWIuaCBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gYQotKiAgICAgICAgICAgICAgIFdpbmRvd3MgTlQgZHJpdmVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAib3NoZHIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiBDb2RlIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QTV9tYWxsb2Mgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gTlQgZHJpdmVycydzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBtYWxsb2MoCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgcmV0dXJuIFBNX21hbGxvY1NoYXJlZChzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1jYWxsb2MgbGlicmFyeSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBOVCBkcml2ZXJzJ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIGNhbGxvYygKLSAgICBzaXplX3QgbmVsZW0sCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgdm9pZCAqcCA9IFBNX21hbGxvY1NoYXJlZChuZWxlbSAqIHNpemUpOwotICAgIGlmIChwKQotCW1lbXNldChwLDAsbmVsZW0gKiBzaXplKTsKLSAgICByZXR1cm4gcDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QTV9yZWFsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiByZWFsbG9jKAotICAgIHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSkKLXsKLSAgICB2b2lkICpwID0gUE1fbWFsbG9jU2hhcmVkKHNpemUpOwotICAgIGlmIChwKSB7Ci0JbWVtY3B5KHAscHRyLHNpemUpOwotCVBNX2ZyZWVTaGFyZWQocHRyKTsKLQl9Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUE1fZnJlZSBvdmVycmlkZSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBWeEQncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGZyZWUoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBQTV9mcmVlU2hhcmVkKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWNzdHIgICAgLSBDIHN0eWxlIEFOU0kgc3RyaW5nIHRvIGNvbnZlcnQKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIFVuaUNvZGUgc3RyaW5nIHN0cnVjdHVyZSBvciBOVUxMIG9uIGZhaWx1cmUgdG8gYWxsb2NhdGUgbWVtb3J5Ci0KLVJFTUFSS1M6Ci1Db252ZXJ0cyBhIEMgc3R5bGUgc3RyaW5nIHRvIGEgVW5pQ29kZSBzdHJpbmcgc3RydWN0dXJlIHRoYXQgY2FuIGJlIHBhc3NlZAotZGlyZWN0bHkgdG8gTlQga2VybmVsIGZ1bmN0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VTklDT0RFX1NUUklORyAqX1BNX0NTdHJpbmdUb1VuaWNvZGVTdHJpbmcoCi0gICAgY29uc3QgY2hhciAqY3N0cikKLXsKLSAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOwotICAgIEFOU0lfU1RSSU5HICAgICBhbnNpU3RyOwotICAgIFVOSUNPREVfU1RSSU5HICAqdW5pU3RyOwotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nIHN0cnVjdHVyZSAqLwotICAgIGlmICgodW5pU3RyID0gRXhBbGxvY2F0ZVBvb2woTm9uUGFnZWRQb29sLCBzaXplb2YoVU5JQ09ERV9TVFJJTkcpKSkgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHdpZGUgc3RyaW5nIGl0c2VsZiAqLwotICAgIGxlbmd0aCA9IChzdHJsZW4oY3N0cikgKiBzaXplb2YoV0NIQVIpKSArIHNpemVvZihXQ0hBUik7Ci0gICAgaWYgKCh1bmlTdHItPkJ1ZmZlciA9IEV4QWxsb2NhdGVQb29sKE5vblBhZ2VkUG9vbCwgbGVuZ3RoKSkgPT0gTlVMTCkgewotCUV4RnJlZVBvb2wodW5pU3RyKTsKLQlyZXR1cm4gTlVMTDsKLQl9Ci0gICAgUnRsWmVyb01lbW9yeSh1bmlTdHItPkJ1ZmZlciwgbGVuZ3RoKTsKLSAgICB1bmlTdHItPkxlbmd0aCA9IDA7Ci0gICAgdW5pU3RyLT5NYXhpbXVtTGVuZ3RoID0gKFVTSE9SVClsZW5ndGg7Ci0KLSAgICAvKiBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZyBhbmQgdGhlbiB0byBVbmlDb2RlIHN0cmluZyAqLwotICAgIFJ0bEluaXRBbnNpU3RyaW5nKCZhbnNpU3RyLCBjc3RyKTsKLSAgICBSdGxBbnNpU3RyaW5nVG9Vbmljb2RlU3RyaW5nKHVuaVN0ciwgJmFuc2lTdHIsIEZBTFNFKTsKLSAgICByZXR1cm4gdW5pU3RyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXVuaVN0ciAgLSBVbmlDb2RlIHN0cmluZyBzdHJ1Y3R1cmUgdG8gZnJlZQotCi1SRU1BUktTOgotRnJlZXMgYSBzdHJpbmcgYWxsb2NhdGVkIGJ5IHRoZSBhYm92ZSBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9QTV9GcmVlVW5pY29kZVN0cmluZygKLSAgICBVTklDT0RFX1NUUklORyAqdW5pU3RyKQotewotICAgIGlmICh1bmlTdHIpIHsKLQlFeEZyZWVQb29sKHVuaVN0ci0+QnVmZmVyKTsKLQlFeEZyZWVQb29sKHVuaVN0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWNlMWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzRiZDQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIENQVV9sYXJnZUludGVnZXIgY291bnRGcmVxOwotc3RhdGljIHVsb25nICAgICAgICAgICAgc3RhcnQsZmluaXNoOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotICAgIEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZjb3VudEZyZXEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT24oCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgTEFSR0VfSU5URUdFUiBsdCA9IEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoTlVMTCk7Ci0gICAgdG0tPnN0YXJ0LmxvdyA9IGx0Lkxvd1BhcnQ7Ci0gICAgdG0tPnN0YXJ0LmhpZ2ggPSBsdC5IaWdoUGFydDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgTEFSR0VfSU5URUdFUiAgICAgICB0bUxhcCA9IEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoTlVMTCk7Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUNvdW50OwotCi0gICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsKENQVV9sYXJnZUludGVnZXIqKSZ0bUxhcCwmdG1Db3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT2ZmKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIExBUkdFX0lOVEVHRVIgbHQgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKE5VTEwpOwotICAgIHRtLT5lbmQubG93ID0gbHQuTG93UGFydDsKLSAgICB0bS0+ZW5kLmhpZ2ggPSBsdC5IaWdoUGFydDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtQ291bnQ7Ci0KLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIExBUkdFX0lOVEVHRVIgY291bnQ7Ci0gICAgS2VRdWVyeVN5c3RlbVRpbWUoJmNvdW50KTsKLSAgICByZXR1cm4gKHVsb25nKSgqKChfaW50NjQqKSZjb3VudCkgLyAxMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvX3Btb3MyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9fcG1vczIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjFmMGY0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9fcG1vczIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IE9TLzIgMzIgYml0IHByb3RlY3RlZCBtb2RlCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYwotOyogICAgICAgICAgICAgIHRvIE9TLzIKLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfcG1vczIgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotYmVnZGF0YXNlZyAgX3Btb3MyCi0KLSAgICAgICAgY2dsb2JhbCBfUE1faW9lbnRyeQotICAgICAgICBjZ2xvYmFsIF9QTV9nZHQKLV9QTV9pb2VudHJ5ICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgT2Zmc2V0IHRvIGNhbGwgZ2F0ZQotX1BNX2dkdCAgICAgICAgIGR3ICAwICAgICAgICAgICAgICAgOyBTZWxlY3RvciB0byBjYWxsIGdhdGUKLQotZW5kZGF0YXNlZyAgX3Btb3MyCi0KLWJlZ2NvZGVzZWcgIF9wbW9zMiAgICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9zZXRJT1BMKGludCBpb3BsKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhbmdlIHRoZSBJT1BMIGxldmVsIGZvciB0aGUgMzItYml0IHRhc2suIFJldHVybnMgdGhlIHByZXZpb3VzIGxldmVsCi07IHNvIGl0IGNhbiBiZSByZXN0b3JlZCBmb3IgdGhlIHRhc2sgY29ycmVjdGx5LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX3NldElPUEwKLQotICAgICAgICBBUkcgICAgIGlvcGw6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSB0aGUgb2xkIEVGTEFHUyBmb3IgbGF0ZXIKLSAgICAgICAgbW92ICAgICBlY3gsW2lvcGxdICAgICAgICAgIDsgRUNYIDo9IElPUEwgbGV2ZWwKLSAgICAgICAgeG9yICAgICBlYngsZWJ4ICAgICAgICAgICAgIDsgQ2hhbmdlIElPUEwgbGV2ZWwgZnVuY3Rpb24gY29kZSAoMCkKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9pb2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBfUE1faW9lbnRyeV0KLWVuZGlmCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIGFuZCAgICAgZWF4LDAwMTEwMDAwMDAwMDAwMDBiCi0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3NldEdEVFNlbExpbWl0KHVzaG9ydCBzZWxlY3RvciwgdWxvbmcgbGltaXQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhbmdlIHRoZSBHRFQgc2VsZWN0b3IgbGltaXQgdG8gZ2l2ZW4gdmFsdWUuIFVzZWQgdG8gY2hhbmdlIHNlbGVjdG9yCi07IGxpbWl0cyB0byBhZGRyZXNzIHRoZSBlbnRpcmUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3NldEdEVFNlbExpbWl0Ci0KLSAgICAgICAgQVJHICAgICBzZWxlY3RvcjpVU0hPUlQsIGxpbWl0OlVJTlQKLSAgICAgICAgCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgc3ViICAgICBlc3AsMjAgICAgICAgICAgICAgIDsgTWFrZSByb29tIGZvciBzZWxlY3RvciBkYXRhIG9uIHN0YWNrCi0gICAgICAgIG1vdiAgICAgZWN4LGVzcCAgICAgICAgICAgICA7IEVDWCA6PSBzZWxlY3RvciBkYXRhIHN0cnVjdHVyZQotICAgICAgICBtb3YgICAgIGJ4LFtzZWxlY3Rvcl0gICAgICAgOyBGaWxsIG91dCB0aGUgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgYW5kICAgICBieCwwRkZGOGggICAgICAgICAgIDsgS2ljayBvdXQgdGhlIExEVC9HRFQgYW5kIERQTCBiaXRzICAgICAKLSAgICAgICAgbW92ICAgICBbV09SRCBlY3hdLGJ4Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtsaW1pdF0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgZWN4KzRdLGVieAotICAgICAgICBtb3YgICAgIGVieCw1ICAgICAgICAgICAgICAgOyBTZXQgR0RUIHNlbGVjdG9yIGxpbWl0IGZ1bmN0aW9uIGNvZGUgICAgICAKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9pb2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBfUE1faW9lbnRyeV0KLWVuZGlmCi0gICAgICAgIGFkZCAgICAgZXNwLDIwCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kICAgIAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfTVRSUl9nZXRDeDg2KHVjaGFyIHJlZyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9nZXRDeDg2Ci0KLSAgICAgICAgQVJHICAgICByZWc6VUNIQVIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgYWwsW3JlZ10KLSAgICAgICAgb3V0ICAgICAyMmgsYWwKLSAgICAgICAgaW4gICAgICBhbCwyM2gKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX01UUlJfc2V0Q3g4Nih1Y2hhciByZWcsdWNoYXIgdmFsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9zZXRDeDg2Ci0KLSAgICAgICAgQVJHICAgICByZWc6VUNIQVIsIHZhbDpVQ0hBUgotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBhbCxbcmVnXQotICAgICAgICBvdXQgICAgIDIyaCxhbAotICAgICAgICBtb3YgICAgIGFsLFt2YWxdCi0gICAgICAgIG91dCAgICAgMjNoLGFsCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9NVFJSX2Rpc2FibGVJbnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9kaXNhYmxlSW50Ci0KLTsgRG8gbm90aGluZyEKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX01UUlJfcmVzdG9yZUludCh1bG9uZyBwcyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXN0b3JlIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9NVFJSX3Jlc3RvcmVJbnQKLQotOyBEbyBub3RoaW5nIQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBEZWJ1Z0ludCh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIERlYnVnSW50Ci0KLSAgICAgICAgaW50ICAgICAzCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcG1vczIKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZTQwMGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE9TLzIKLSoKLSogRGVzY3JpcHRpb246ICBPUy8yIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVE9ETzogVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgZm9yIE9TLzIhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVE9ETzogVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgZm9yIE9TLzIhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgZnJlcS0+bG93ID0gMTAwMDAwOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVTE9ORyAgIGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRG9zUXVlcnlTeXNJbmZvKCBRU1ZfTVNfQ09VTlQsIFFTVl9NU19DT1VOVCwgJmNvdW50LCBzaXplb2YoVUxPTkcpICk7ICAgXAotICAgICh0KS0+bG93ID0gY291bnQgKiAxMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWNjMTliLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIElCTSBQQyAoT1MvMikKLSoKLSogRGVzY3JpcHRpb246ICBPUy8yIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBEZWZpbmUgZ2VuZXJvdXMga2V5Ym9hcmQgbW9uaXRvciBjaXJjdWxhciBidWZmZXIgc2l6ZSB0byBtaW5pbWl6ZQotICogdGhlIGRhbmdlciBvZiBsb3Npbmcga2V5c3Ryb2tlcwotICovCi0jZGVmaW5lIEtFWUJVRlNJWkUgIChFVkVOVFFTSVpFICsgMTApCi0KLXN0YXRpYyBpbnQgICAgICBvbGRNb3VzZVN0YXRlOyAgICAgICAgICAvKiBPbGQgbW91c2Ugc3RhdGUgICAgICAgICAgICAgICAqLwotc3RhdGljIHVsb25nICAgIG9sZEtleU1lc3NhZ2U7ICAgICAgICAgIC8qIE9sZCBrZXlib2FyZCBzdGF0ZSAgICAgICAgICAgICovCi1zdGF0aWMgdXNob3J0ICAga2V5VXBNc2dbMjU2XSA9IHswfTsgICAgLyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICByYW5nZVgscmFuZ2VZOyAgICAgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICAqLwotSE1PVSAgICAgICAgICAgIF9FVlRfaE1vdXNlOyAgICAgICAgICAgIC8qIEhhbmRsZSB0byB0aGUgbW91c2UgZHJpdmVyICAgICovCi1ITU9OSVRPUiAgICAgICAgX0VWVF9oS2JkTW9uOyAgICAgICAgICAgLyogSGFuZGxlIHRvIHRoZSBrZXlib2FyZCBkcml2ZXIgKi8KLVRJRCAgICAgICAgICAgICBrYmRNb25USUQgPSAwOyAgICAgICAgICAvKiBLZXlib2FyZCBtb25pdG9yIHRocmVhZCBJRCAgICAqLwotSEVWICAgICAgICAgICAgIGhldlN0YXJ0OyAgICAgICAgICAgICAgIC8qIFN0YXJ0IGV2ZW50IHNlbWFwaG9yZSBoYW5kbGUgICovCi1CT09MICAgICAgICAgICAgYk1vblJ1bm5pbmc7ICAgICAgICAgICAgLyogRmxhZyBzZXQgaWYgbW9uaXRvciB0aHJlYWQgT0sgKi8KLUhNVFggICAgICAgICAgICBobXR4S2V5QnVmOyAgICAgICAgICAgICAvKiBNdXRleCBwcm90ZWN0aW5nIGtleSBidWZmZXIgICAqLwotS0VZUEFDS0VUICAgICAgIGtleU1vblBrdHNbS0VZQlVGU0laRV07IC8qIEFycmF5IG9mIG1vbml0b3Iga2V5IHBhY2tldHMgICovCi1pbnQgICAgICAgICAgICAga3BIZWFkID0gMDsgICAgICAgICAgICAgLyogS2V5IHBhY2tldCBidWZmZXIgaGVhZCAgICAgICAgKi8KLWludCAgICAgICAgICAgICBrcFRhaWwgPSAwOyAgICAgICAgICAgICAvKiBLZXkgcGFja2V0IGJ1ZmZlciB0YWlsICAgICAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgT1MvMiAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIFVMT05HICAgY291bnQ7Ci0gICAgRG9zUXVlcnlTeXNJbmZvKCBRU1ZfTVNfQ09VTlQsIFFTVl9NU19DT1VOVCwgJmNvdW50LCBzaXplb2YoVUxPTkcpICk7Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbnZlcnRzIGEgbWlja2V5IG1vdmVtZW50IHZhbHVlIHRvIGEgcGl4ZWwgYWRqdXN0bWVudCB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IE1pY2tleVRvUGl4ZWwoCi0gICAgaW50IG1pY2tleSkKLXsKLSAgICAvKiBUT0RPOiBXZSBjYW4gYWRkIHNvbWUgY29kZSBpbiBoZXJlIHRvIGhhbmRsZSAnYWNjZWxlcmF0aW9uJyBmb3IgKi8KLSAgICAvKiAgICAgICB0aGUgbW91c2UgY3Vyc29yLiBGb3Igbm93IGp1c3QgdXNlIHRoZSBtaWNrZXlzLiAqLwotICAgIHJldHVybiBtaWNrZXk7Ci19Ci0KLS8qIFNvbWUgdXNlZnVsIGRlZmluZXMgYW55IHR5cGVkZWZzIHVzZWQgaW4gdGhlIGtleWJvYXJkIGhhbmRsaW5nICovCi0jZGVmaW5lIEtFWV9SRUxFQVNFICAgICAgICAgICAgIDB4NDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSBPUy8yIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgS0JESU5GTyAgICAgICAgIGtleUluZm87ICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAqLwotICAgIEtCREtFWUlORk8gICAgICBrZXk7ICAgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgKi8KLSAgICBNT1VRVUVJTkZPICAgICAgbXF1ZXVlOyAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICovCi0gICAgTU9VRVZFTlRJTkZPICAgIG1vdXNlOyAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAqLwotICAgIHVzaG9ydCAgICAgICAgICBtV2FpdDsgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgKi8KLSAgICBLRVlQQUNLRVQgICAgICAga3A7ICAgICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICovCi0gICAgZXZlbnRfdCAgICAgICAgIGV2dDsKLSAgICBpbnQgICAgICAgICAgICAgc2NhbjsKLSAgICBpYm9vbCAgICAgICAgICAgbm9JbnB1dCA9IFRSVUU7IC8qIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIGFueSBpbnB1dCB3YXMgYXZhaWxhYmxlICovCi0KLSAgICAvKiBGaXJzdCBvZiBhbGwsIGNoZWNrIGlmIHdlIHNob3VsZCBkbyBhbnkgc2Vzc2lvbiBzd2l0Y2ggd29yayAqLwotICAgIF9fUE1fY2hlY2tDb25zb2xlU3dpdGNoKCk7Ci0KLSAgICAvKiBQdW1wIGFsbCBrZXlib2FyZCBtZXNzYWdlcyBmcm9tIG91ciBjaXJjdWxhciBidWZmZXIgKi8KLSAgICBmb3IgKDs7KSB7Ci0JLyogQ2hlY2sgdGhhdCB0aGUgbW9uaXRvciB0aHJlYWQgaXMgc3RpbGwgcnVubmluZyAqLwotCWlmICghYk1vblJ1bm5pbmcpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIktleWJvYXJkIG1vbml0b3IgdGhyZWFkIGRpZWQhIik7Ci0KLQkvKiBQcm90ZWN0IGtleXBhY2tldCBidWZmZXIgd2l0aCBtdXRleCAqLwotCURvc1JlcXVlc3RNdXRleFNlbShobXR4S2V5QnVmLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLQlpZiAoa3BIZWFkID09IGtwVGFpbCkgewotCSAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oaG10eEtleUJ1Zik7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0KLQlub0lucHV0ID0gRkFMU0U7Ci0KLQkvKiBSZWFkIHBhY2tldCBmcm9tIGNpcmN1bGFyIGJ1ZmZlciBhbmQgcmVtb3ZlIGl0ICovCi0JbWVtY3B5KCZrcCwgJmtleU1vblBrdHNba3BUYWlsXSwgc2l6ZW9mKEtFWVBBQ0tFVCkpOwotCWlmICgrK2twVGFpbCA9PSBLRVlCVUZTSVpFKQotCSAgICBrcFRhaWwgPSAwOwotCURvc1JlbGVhc2VNdXRleFNlbShobXR4S2V5QnVmKTsKLQotCS8qIENvbXBlbnNhdGUgZm9yIHRoZSAweEUwIGNoYXJhY3RlciAqLwotCWlmIChrcC5YbGF0ZWRTY2FuICYmIGtwLlhsYXRlZENoYXIgPT0gMHhFMCkKLQkgICAga3AuWGxhdGVkQ2hhciA9IDA7Ci0KLQkvKiBEZXRlcm1pbmUgdHlwZSBvZiBrZXlib2FyZCBldmVudCAqLwotCW1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOwotCWlmIChrcC5LYmREREZsYWdXb3JkICYgS0VZX1JFTEVBU0UpCi0JICAgIGV2dC53aGF0ID0gRVZUX0tFWVVQOwotCWVsc2UKLQkgICAgZXZ0LndoYXQgPSBFVlRfS0VZRE9XTjsKLQotCS8qIENvbnZlcnQga2V5Ym9hcmQgY29kZXMgKi8KLQlzY2FuID0ga3AuTW9uRmxhZ1dvcmQgPj4gODsKLQlpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVVQKSB7Ci0JICAgIC8qIEdldCBtZXNzYWdlIGZvciBrZXl1cCBjb2RlIGZyb20gdGFibGUgb2YgY2FjaGVkIGRvd24gdmFsdWVzICovCi0JICAgIGV2dC5tZXNzYWdlID0ga2V5VXBNc2dbc2Nhbl07Ci0JICAgIGtleVVwTXNnW3NjYW5dID0gMDsKLQkgICAgb2xkS2V5TWVzc2FnZSA9IC0xOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIGV2dC5tZXNzYWdlID0gKCh1bG9uZylzY2FuIDw8IDgpIHwga3AuWGxhdGVkQ2hhcjsKLQkgICAgaWYgKGV2dC5tZXNzYWdlID09IGtleVVwTXNnW3NjYW5dKSB7Ci0JCWV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkJZXZ0Lm1lc3NhZ2UgfD0gMHgxMDAwMDsKLQkJfQotCSAgICBvbGRLZXlNZXNzYWdlID0gZXZ0Lm1lc3NhZ2UgJiAweDBGRkZGOwotCSAgICBrZXlVcE1zZ1tzY2FuXSA9ICh1c2hvcnQpZXZ0Lm1lc3NhZ2U7Ci0JICAgIH0KLQotCSAvKiBDb252ZXJ0IHNoaWZ0IHN0YXRlIG1vZGlmaWVycyAqLwotCSBpZiAoa3AudS5TaGlmdFN0YXRlICYgMHgwMDAxKQotCSAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRTSElGVDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDAwMikKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRTSElGVDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDEwMCkKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRDVFJMOwotCSBpZiAoa3AudS5TaGlmdFN0YXRlICYgMHgwMjAwKQotCSAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEFMVDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDQwMCkKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQ1RSTDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDgwMCkKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQUxUOwotCSBFVlQub2xkTW92ZSA9IC0xOwotCi0JIC8qIEFkZCB0aW1lIHN0YW1wIGFuZCBhZGQgdGhlIGV2ZW50IHRvIHRoZSBxdWV1ZSAqLwotCSBldnQud2hlbiA9IGtleS50aW1lOwotCSBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkgICAgIGFkZEV2ZW50KCZldnQpOwotCSB9Ci0KLSAgICAvKiBEb24ndCBqdXN0IGZsdXNoIGJlY2F1c2UgdGhhdCB0ZXJtaW5hbGx5IGNvbmZ1c2VzIHRoZSBtb25pdG9yICovCi0gICAgZG8gewotCUtiZENoYXJJbigma2V5LCBJT19OT1dBSVQsIDApOwotCX0gd2hpbGUgKGtleS5mYlN0YXR1cyAmIEtCRFRSRl9GSU5BTF9DSEFSX0lOKTsKLQotICAgIC8qIFB1bXAgYWxsIG1vdXNlIG1lc3NhZ2VzICovCi0gICAgS2JkR2V0U3RhdHVzKCZrZXlJbmZvLDApOwotICAgIC8qIENoZWNrIHJldHVybiBjb2RlIC0gbW91c2UgbWF5IG5vdCBiZSBvcGVyYXRpb25hbCEhICovCi0gICAgaWYgKE1vdUdldE51bVF1ZUVsKCZtcXVldWUsX0VWVF9oTW91c2UpID09IE5PX0VSUk9SKSB7Ci0Jd2hpbGUgKG1xdWV1ZS5jRXZlbnRzKSB7Ci0JICAgIHdoaWxlIChtcXVldWUuY0V2ZW50cy0tKSB7Ci0JCW1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOwotCQltV2FpdCA9IE1PVV9OT1dBSVQ7Ci0JCU1vdVJlYWRFdmVudFF1ZSgmbW91c2UsJm1XYWl0LF9FVlRfaE1vdXNlKTsKLQotCQkvKiBVcGRhdGUgdGhlIG1vdXNlIHBvc2l0aW9uLiBXZSBnZXQgdGhlIG1vdXNlIGNvb3JkaW5hdGVzCi0JCSAqIGluIG1pY2tleXMgc28gd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlc2UgaW50byBwaXhlbHMgYW5kCi0JCSAqIG1vdmUgb3VyIG1vdXNlIHBvc2l0aW9uLiBJZiB3ZSBkb24ndCBkbyB0aGlzLCBPUy8yIGdpdmVzCi0JCSAqIHVzIHRoZSBjb29yZGluYXRlcyBpbiBjaGFyYWN0ZXIgcG9zaXRpb25zIHNpbmNlIGl0IHN0aWxsCi0JCSAqIHRoaW5rcyB3ZSBhcmUgaW4gdGV4dCBtb2RlIQotCQkgKi8KLQkJRVZULm14ICs9IE1pY2tleVRvUGl4ZWwobW91c2UuY29sKTsKLQkJRVZULm15ICs9IE1pY2tleVRvUGl4ZWwobW91c2Uucm93KTsKLQkJaWYgKEVWVC5teCA8IDApIEVWVC5teCA9IDA7Ci0JCWlmIChFVlQubXkgPCAwKSBFVlQubXkgPSAwOwotCQlpZiAoRVZULm14ID4gcmFuZ2VYKSAgICBFVlQubXggPSByYW5nZVg7Ci0JCWlmIChFVlQubXkgPiByYW5nZVkpICAgIEVWVC5teSA9IHJhbmdlWTsKLQkJZXZ0LndoZXJlX3ggPSBFVlQubXg7Ci0JCWV2dC53aGVyZV95ID0gRVZULm15OwotCQlldnQucmVsYXRpdmVfeCA9IG1vdXNlLmNvbDsKLQkJZXZ0LnJlbGF0aXZlX3kgPSBtb3VzZS5yb3c7Ci0JCWV2dC53aGVuID0ga2V5LnRpbWU7Ci0JCWlmIChtb3VzZS5mcyAmIChNT1VTRV9CTjFfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOMV9ET1dOKSkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRCVVQ7Ci0JCWlmIChtb3VzZS5mcyAmIChNT1VTRV9CTjJfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOMl9ET1dOKSkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQlVUOwotCQlpZiAobW91c2UuZnMgJiAoTU9VU0VfQk4zX0RPV04gfCBNT1VTRV9NT1RJT05fV0lUSF9CTjNfRE9XTikpCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9NSURETEVCVVQ7Ci0JCWlmIChrZXlJbmZvLmZzU3RhdGUgJiAweDAwMDEpCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVFNISUZUOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwMDAyKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVFNISUZUOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwMTAwKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVENUUkw7Ci0JCWlmIChrZXlJbmZvLmZzU3RhdGUgJiAweDAyMDApCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUQUxUOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwNDAwKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRDVFJMOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwODAwKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRBTFQ7Ci0KLQkJLyogQ2hlY2sgZm9yIGxlZnQgbW91c2UgY2xpY2sgZXZlbnRzICovCi0JCS8qIDB4MDYgPT0gKE1PVVNFX0JOMV9ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4xX0RPV04pICovCi0JCWlmICgoKG1vdXNlLmZzICYgMHgwMDA2KSAmJiAhKG9sZE1vdXNlU3RhdGUgJiAweDAwMDYpKQotCQkJfHwgKCEobW91c2UuZnMgJiAweDAwMDYpICYmIChvbGRNb3VzZVN0YXRlICYgMHgwMDA2KSkpIHsKLQkJICAgIGlmIChtb3VzZS5mcyAmIDB4MDAwNikKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJICAgIGVsc2UKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCSAgICBldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0JCSAgICBFVlQub2xkTW92ZSA9IC0xOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQotCQkvKiBDaGVjayBmb3IgcmlnaHQgbW91c2UgY2xpY2sgZXZlbnRzICovCi0JCS8qIDB4MDAxOCA9PSAoTU9VU0VfQk4yX0RPV04gfCBNT1VTRV9NT1RJT05fV0lUSF9CTjJfRE9XTikgKi8KLQkJaWYgKCgobW91c2UuZnMgJiAweDAwMTgpICYmICEob2xkTW91c2VTdGF0ZSAmIDB4MDAxOCkpCi0JCQl8fCAoIShtb3VzZS5mcyAmIDB4MDAxOCkgJiYgKG9sZE1vdXNlU3RhdGUgJiAweDAwMTgpKSkgewotCQkgICAgaWYgKG1vdXNlLmZzICYgMHgwMDE4KQotCQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQkgICAgZWxzZQotCQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJICAgIGV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0JCSAgICBFVlQub2xkTW92ZSA9IC0xOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQotCQkvKiBDaGVjayBmb3IgbWlkZGxlIG1vdXNlIGNsaWNrIGV2ZW50cyAqLwotCQkvKiAweDAwNjAgPT0gKE1PVVNFX0JOM19ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4zX0RPV04pICovCi0JCWlmICgoKG1vdXNlLmZzICYgMHgwMDYwKSAmJiAhKG9sZE1vdXNlU3RhdGUgJiAweDAwNjApKQotCQkJfHwgKCEobW91c2UuZnMgJiAweDAwNjApICYmIChvbGRNb3VzZVN0YXRlICYgMHgwMDYwKSkpIHsKLQkJICAgIGlmIChtb3VzZS5mcyAmIDB4MDA2MCkKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJICAgIGVsc2UKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCSAgICBldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKLQkJICAgIEVWVC5vbGRNb3ZlID0gLTE7Ci0JCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJCWFkZEV2ZW50KCZldnQpOwotCQkgICAgfQotCi0JCS8qIENoZWNrIGZvciBtb3VzZSBtb3ZlbWVudCBldmVudCAqLwotCQlpZiAobW91c2UuZnMgJiAweDAwMkIpIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLQkJICAgIGlmIChFVlQub2xkTW92ZSAhPSAtMSkgewotCQkJRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3ggPSBldnQud2hlcmVfeDsvKiBNb2RpZnkgZXhpc3Rpbmcgb25lICAqLwotCQkJRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSBldnQud2hlcmVfeTsKLQkJCX0KLQkJICAgIGVsc2UgewotCQkJRVZULm9sZE1vdmUgPSBFVlQuZnJlZUhlYWQ7IC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KLQkJCWlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJICAgIGFkZEV2ZW50KCZldnQpOwotCQkJfQotCQkgICAgfQotCi0JCS8qIFNhdmUgY3VycmVudCBtb3VzZSBzdGF0ZSAqLwotCQlvbGRNb3VzZVN0YXRlID0gbW91c2UuZnM7Ci0JCX0KLQkgICAgTW91R2V0TnVtUXVlRWwoJm1xdWV1ZSxfRVZUX2hNb3VzZSk7Ci0JICAgIH0KLQkgICAgbm9JbnB1dCA9IEZBTFNFOwotCX0KLQotICAgIC8qIElmIHRoZXJlIHdhcyBubyBpbnB1dCBhdmFpbGFibGUsIGdpdmUgdXAgdGhlIGN1cnJlbnQgdGltZXNsaWNlCi0gICAgICogTm90ZTogRG9zU2xlZXAoMCkgd2lsbCBlZmZlY3RpdmVseSBkbyBub3RoaW5nIGlmIG5vIG90aGVyIHRocmVhZCBpcyByZWFkeS4gSGVuY2UKLSAgICAgKiBEb3NTbGVlcCgwKSB3aWxsIHN0aWxsIHVzZSAxMDAlIENQVSBfYnV0XyBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIG90aGVyIHByb2dyYW1zLgotICAgICAqLwotICAgIGlmIChub0lucHV0KQotCURvc1NsZWVwKDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUtleWJvYXJkIG1vbml0b3IgdGhyZWFkLiBOZWVkZWQgdG8gY2F0Y2ggYm90aCBrZXl1cCBhbmQga2V5ZG93biBldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX2tiZE1vblRocmVhZCgKLSAgICB2b2lkICpwYXJhbXMpCi17Ci0gICAgQVBJUkVUICAgICAgIHJjOwotICAgIEtFWVBBQ0tFVCAgICBrcDsKLSAgICBVU0hPUlQgICAgICAgY291bnQgPSBzaXplb2YoS0VZUEFDS0VUKTsKLSAgICBNT05CVUYgICAgICAgbW9uSW5idWY7Ci0gICAgTU9OQlVGICAgICAgIG1vbk91dGJ1ZjsKLSAgICBpbnQgICAgICAgICAga3BOZXc7Ci0KLSAgICAvKiBSYWlzZSB0aHJlYWQgcHJpb3JpdHkgZm9yIGhpZ2hlciByZXNwb25zaXZlbmVzcyAqLwotICAgIERvc1NldFByaW9yaXR5KFBSVFlTX1RIUkVBRCwgUFJUWUNfVElNRUNSSVRJQ0FMLCAwLCAwKTsKLSAgICBtb25JbmJ1Zi5jYiAgPSBzaXplb2YobW9uSW5idWYpIC0gc2l6ZW9mKG1vbkluYnVmLmNiKTsKLSAgICBtb25PdXRidWYuY2IgPSBzaXplb2YobW9uT3V0YnVmKSAtIHNpemVvZihtb25PdXRidWYuY2IpOwotICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0KLSAgICAvKiBSZWdpc3RlciB0aGUgYnVmZmVycyB0byBiZSB1c2VkIGZvciBtb25pdG9yaW5nIGZvciBjdXJyZW50IHNlc3Npb24gKi8KLSAgICBpZiAoRG9zTW9uUmVnKF9FVlRfaEtiZE1vbiwgJm1vbkluYnVmLCAoVUxPTkcqKSZtb25PdXRidWYsTU9OSVRPUl9FTkQsIC0xKSkgewotCURvc1Bvc3RFdmVudFNlbShoZXZTdGFydCk7ICAvKiB1bmJsb2NrIHRoZSBtYWluIHRocmVhZCAqLwotCXJldHVybjsKLQl9Ci0KLSAgICAvKiBVbmJsb2NrIHRoZSBtYWluIHRocmVhZCBhbmQgdGVsbCBpdCB3ZSdyZSBPSyovCi0gICAgYk1vblJ1bm5pbmcgPSBUUlVFOwotICAgIERvc1Bvc3RFdmVudFNlbShoZXZTdGFydCk7Ci0gICAgd2hpbGUgKGJNb25SdW5uaW5nKSB7ICAvKiBTdGFydCBhbiBlbmRsZXNzIGxvb3AgKi8KLQkvKiBSZWFkIGRhdGEgZnJvbSBrZXlib2FyZCBkcml2ZXIgKi8KLQlyYyA9IERvc01vblJlYWQoKFBCWVRFKSZtb25JbmJ1ZiwgSU9fV0FJVCwgKFBCWVRFKSZrcCwgKFBVU0hPUlQpJmNvdW50KTsKLQlpZiAocmMpIHsKLSNpZmRlZiBDSEVDS0VECi0JICAgIGlmIChiTW9uUnVubmluZykKLQkJcHJpbnRmKCJFcnJvciBpbiBEb3NNb25SZWFkLCByYyA9ICVsZFxuIiwgcmMpOwotI2VuZGlmCi0JICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCi0JLyogUGFzcyBGTFVTSCBwYWNrZXRzIGltbWVkaWF0ZWx5ICovCi0JaWYgKGtwLk1vbkZsYWdXb3JkICYgNCkgewotI2lmZGVmIENIRUNLRUQKLQkgICAgcHJpbnRmKCJGbHVzaCBwYWNrZXQhXG4iKTsKLSNlbmRpZgotCSAgICBEb3NNb25Xcml0ZSgoUEJZVEUpJm1vbk91dGJ1ZiwgKFBCWVRFKSZrcCwgY291bnQpOwotCSAgICBjb250aW51ZTsKLQkgICAgfQotCi0JLypUT0RPOiB0byBiZSByZW1vdmVkICovCi0JLyogU2tpcCBleHRlbmRlZCBzY2FuY29kZXMgJiBzb21lIG90aGVycyAqLwotCWlmICgoKGtwLk1vbkZsYWdXb3JkID4+IDgpID09IDB4RTApIHx8ICgoa3AuS2JkRERGbGFnV29yZCAmIDB4MEYpID09IDB4MEYpKSB7Ci0JICAgIERvc01vbldyaXRlKChQQllURSkmbW9uT3V0YnVmLCAoUEJZVEUpJmtwLCBjb3VudCk7Ci0JICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLS8qICAgICAgcHJpbnRmKCJSYXdTY2FuID0gJVgsIFhsYXRlZFNjYW4gPSAlWCwgZmJTdGF0dXMgPSAlWCwgS2JkRERGbGFncyA9ICVYXG4iLCAqLwotLyogICAgICAgICAga3AuTW9uRmxhZ1dvcmQgPj4gOCwga3AuWGxhdGVkU2Nhbiwga3AudS5TaGlmdFN0YXRlLCBrcC5LYmREREZsYWdXb3JkKTsgKi8KLQotCS8qIFByb3RlY3QgYWNjZXNzIHRvIGJ1ZmZlciB3aXRoIG11dGV4IHNlbWFwaG9yZSAqLwotCXJjID0gRG9zUmVxdWVzdE11dGV4U2VtKGhtdHhLZXlCdWYsIDEwMDApOwotCWlmIChyYykgewotI2lmZGVmIENIRUNLRUQKLQkgICAgcHJpbnRmKCJDYW4ndCBnZXQgYWNjZXNzIHRvIG11dGV4LCByYyA9ICVsZFxuIiwgcmMpOwotI2VuZGlmCi0JICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCi0JLyogU3RvcmUgcGFja2V0IGluIGNpcmN1bGFyIGJ1ZmZlciwgZHJvcCBpdCBpZiBpdCdzIGZ1bGwgKi8KLQlrcE5ldyA9IGtwSGVhZCArIDE7Ci0JaWYgKGtwTmV3ID09IEtFWUJVRlNJWkUpCi0JICAgIGtwTmV3ID0gMDsKLQlpZiAoa3BOZXcgIT0ga3BUYWlsKSB7Ci0JICAgIG1lbWNweSgma2V5TW9uUGt0c1trcEhlYWRdLCAma3AsIHNpemVvZihLRVlQQUNLRVQpKTsKLQkgICAgLyogVE9ETzogZml4IHRoaXMhICovCi0JICAgIC8qIENvbnZlcnQgYnJlYWsgdG8gbWFrZSBjb2RlICovCi0JICAgIGtleU1vblBrdHNba3BIZWFkXS5Nb25GbGFnV29yZCAmPSAweDdGRkY7Ci0JICAgIGtwSGVhZCA9IGtwTmV3OwotCSAgICB9Ci0JRG9zUmVsZWFzZU11dGV4U2VtKGhtdHhLZXlCdWYpOwotCi0JLyogRmluYWxseSB3cml0ZSB0aGUgcGFja2V0ICovCi0JcmMgPSBEb3NNb25Xcml0ZSgoUEJZVEUpJm1vbk91dGJ1ZiwgKFBCWVRFKSZrcCwgY291bnQpOwotCWlmIChyYykgewotI2lmZGVmIENIRUNLRUQKLQkgICAgaWYgKGJNb25SdW5uaW5nKQotCQlwcmludGYoIkVycm9yIGluIERvc01vbldyaXRlLCByYyA9ICVsZFxuIiwgcmMpOwotI2VuZGlmCi0JICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAodm9pZClwYXJhbXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgKLSAgICBpbnQgc2lnbmFsKQotewotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICB1c2hvcnQgIHN0YXQ7Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIFBNX2luaXQoKTsKLSAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgb2xkTW91c2VTdGF0ZSA9IDA7Ci0gICAgb2xkS2V5TWVzc2FnZSA9IDA7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSAgICAvKiBPcGVuIHRoZSBtb3VzZSBkcml2ZXIsIGFuZCBzZXQgaXQgdXAgdG8gcmVwb3J0IGV2ZW50cyBpbiBtaWNrZXlzICovCi0gICAgTW91T3BlbihOVUxMLCZfRVZUX2hNb3VzZSk7Ci0gICAgc3RhdCA9IDB4N0Y7Ci0gICAgTW91U2V0RXZlbnRNYXNrKCZzdGF0LF9FVlRfaE1vdXNlKTsKLSAgICBzdGF0ID0gKE1PVV9OT0RSQVcgfCBNT1VfTUlDS0VZUykgPDwgODsKLSAgICBNb3VTZXREZXZTdGF0dXMoJnN0YXQsX0VWVF9oTW91c2UpOwotCi0gICAgLyogT3BlbiB0aGUga2V5Ym9hcmQgbW9uaXRvciAgKi8KLSAgICBpZiAoRG9zTW9uT3BlbigoUFNaKSJLQkQkIiwgJl9FVlRfaEtiZE1vbikpCi0JUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIG9wZW4ga2V5Ym9hcmQgbW9uaXRvciEiKTsKLQotICAgIC8qIENyZWF0ZSBldmVudCBzZW1hcGhvcmUsIHRoZSBtb25pdG9yIHdpbGwgcG9zdCBpdCB3aGVuIGl0J3MgaW5pdGFsaXplZCAqLwotICAgIGlmIChEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAmaGV2U3RhcnQsIDAsIEZBTFNFKSkKLQlQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGV2ZW50IHNlbWFwaG9yZSEiKTsKLQotICAgIC8qIENyZWF0ZSBtdXRleCBzZW1hcGhvcmUgcHJvdGVjdGluZyB0aGUga2V5cGFja2V0IGJ1ZmZlciAqLwotICAgIGlmIChEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAmaG10eEtleUJ1ZiwgMCwgRkFMU0UpKQotCVBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbXV0ZXggc2VtYXBob3JlISIpOwotCi0gICAgLyogU3RhcnQga2V5Ym9hcmQgbW9uaXRvciB0aHJlYWQsIHVzZSAzMksgc3RhY2sgKi8KLSAgICBrYmRNb25USUQgPSBfYmVnaW50aHJlYWQoX2tiZE1vblRocmVhZCwgTlVMTCwgMHg4MDAwLCBOVUxMKTsKLQotICAgIC8qIE5vdyBibG9jayB1bnRpbCB0aGUgbW9uaXRvciB0aHJlYWQgaXMgdXAgYW5kIHJ1bm5pbmcgKi8KLSAgICAvKiBHaXZlIHRoZSB0aHJlYWQgb25lIHNlY29uZCAqLwotICAgIERvc1dhaXRFdmVudFNlbShoZXZTdGFydCwgMTAwMCk7Ci0gICAgaWYgKCFiTW9uUnVubmluZykgeyAgLyogQ2hlY2sgdGhlIHRocmVhZCBpcyBPSyAqLwotCURvc01vbkNsb3NlKF9FVlRfaEtiZE1vbik7Ci0JUE1fZmF0YWxFcnJvcigiS2V5Ym9hcmQgbW9uaXRvciB0aHJlYWQgZGlkbid0IGluaXRpYWxpemUhIik7Ci0JfQotCi0gICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX3NldE1vdXNlUG9zKHgseSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgT1MvMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgT1MvMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICBBUElSRVQgICByYzsKLQotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0gICAgLyogQ2xvc2UgdGhlIG1vdXNlIGRyaXZlciAqLwotICAgIE1vdUNsb3NlKF9FVlRfaE1vdXNlKTsKLQotICAgIC8qIFN0b3AgdGhlIGtleWJvYXJkIG1vbml0b3IgdGhyZWFkIGFuZCBjbG9zZSB0aGUgbW9uaXRvciAqLwotICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0gICAgcmMgPSBEb3NLaWxsVGhyZWFkKGtiZE1vblRJRCk7Ci0jaWZkZWYgQ0hFQ0tFRAotICAgIGlmIChyYykKLQlwcmludGYoIkRvc0tpbGxUaHJlYWQgZmFpbGVkLCByYyA9ICVsZFxuIiwgcmMpOwotI2VuZGlmCi0gICAgcmMgPSBEb3NNb25DbG9zZShfRVZUX2hLYmRNb24pOwotI2lmZGVmIENIRUNLRUQKLSAgICBpZiAocmMpIHsKLQlwcmludGYoIkRvc01vbkNsb3NlIGZhaWxlZCwgcmMgPSAlbGRcbiIsIHJjKTsKLQl9Ci0jZW5kaWYKLSAgICBEb3NDbG9zZUV2ZW50U2VtKGhldlN0YXJ0KTsKLSAgICBEb3NDbG9zZU11dGV4U2VtKGhtdHhLZXlCdWYpOwotICAgIEtiZEZsdXNoQnVmZmVyKDApOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL21vbi5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL21vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGQzOWZiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUy8yIGtleWJvYXJkIG1vbml0b3Igc3R1ZmYuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBNb25pdG9ycyBzdHVmZiAqLwotCi0jZGVmaW5lIE1PTklUT1JfREVGQVVMVCAweDAwMDAKLSNkZWZpbmUgTU9OSVRPUl9CRUdJTiAgICAgICAgMQotI2RlZmluZSBNT05JVE9SX0VORCAgICAgICAgICAyCi0KLXR5cGVkZWYgU0hBTkRMRSAgIEhNT05JVE9SOwotdHlwZWRlZiBITU9OSVRPUiAqUEhNT05JVE9SOwotCi10eXBlZGVmIHN0cnVjdCBfS0VZUEFDS0VUIHsKLSAgVVNIT1JUICBNb25GbGFnV29yZDsKLSAgVUNIQVIgICBYbGF0ZWRDaGFyOwotICBVQ0hBUiAgIFhsYXRlZFNjYW47Ci0gIFVDSEFSICAgREJDU1N0YXR1czsKLSAgVUNIQVIgICBEQkNTU2hpZnQ7Ci0KLSAgdW5pb24KLSAgewotICAgIFVTSE9SVCAgU2hpZnRTdGF0ZTsKLSAgICBVU0hPUlQgIExheWVySW5kZXg7Ci0gIH0gdTsKLQotICBVTE9ORyAgIE1pbGxpc2Vjb25kczsKLSAgVVNIT1JUICBLYmREREZsYWdXb3JkOwotfSBLRVlQQUNLRVQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE5QQUNLRVQgewotICBVU0hPUlQgIE1vbkZsYWdXb3JkOwotICBVU0hPUlQgIElPQ1RMOwotICBVU0hPUlQgIENQSWQ7Ci0gIFVTSE9SVCAgQ1BJbmRleDsKLSAgVUxPTkcgICBSZXNlcnZlZDsKLSAgVVNIT1JUICBLYmREREZsYWdXb3JkOwotfSBNTE5QQUNLRVQ7Ci0KLS8qIERCQ1NTdGF0dXMgKi8KLQotI2RlZmluZSBTRl9TSElGVFMgICAgICAgICAgICAgIDEgIC8qIElmIHNldCB0byAxLCBzaGlmdCBzdGF0dXMgcmV0dXJuZWQgd2l0aG91dCBhIGNoYXJhY3RlciAqLwotI2RlZmluZSBTRl9OT1RDSEFSICAgICAgICAgICAgIDIgIC8qIDAgLSBTY2FuIGNvZGUgaXMgYSBjaGFyYWN0ZXIgKi8KLQkJCQkgIC8qIDEgLSBTY2FuIGNvZGUgaXMgbm90IGEgY2hhcmFjdGVyOyAqLwotCQkJCSAgLyogICAgIGluc3RlYWQgaXQgaXMgYW4gZXh0ZW5kZWQga2V5IGNvZGUgZnJvbSB0aGUga2V5Ym9hcmQuICovCi0jZGVmaW5lIFNGX0lNTUVESUFURSAgICAgICAgICAzMiAgLyogSWYgc2V0IHRvIDEsIGltbWVkaWF0ZSBjb252ZXJzaW9uIHJlcXVlc3RlZCAqLwotI2RlZmluZSBTRl9UWVBFTUFTSyAgICAgICAgICAxOTIgIC8qIEhhcyB0aGUgZm9sbG93aW5nIHZhbHVlczogKi8KLQkJCQkgIC8qIDAwIC0gVW5kZWZpbmVkICovCi0JCQkJICAvKiAwMSAtIEZpbmFsIGNoYXJhY3RlcjsgaW50ZXJpbSBjaGFyYWN0ZXIgZmxhZyBpcyB0dXJuZWQgb2ZmICovCi0JCQkJICAvKiAxMCAtIEludGVyaW0gY2hhcmFjdGVyICovCi0JCQkJICAvKiAxMSAtIEZpbmFsIGNoYXJhY3RlcjsgaW50ZXJpbSBjaGFyYWN0ZXIgZmxhZyBpcyB0dXJuZWQgb24uICovCi0vKiBNb25GbGFnV29yZCAqLwotCi0jZGVmaW5lIE1GX09QRU4gICAgICAgICAgICAgICAgMSAgLyogb3BlbiAqLwotI2RlZmluZSBNRl9DTE9TRSAgICAgICAgICAgICAgIDIgIC8qIGNsb3NlICovCi0jZGVmaW5lIE1GX0ZMVVNIICAgICAgICAgICAgICAgNCAgLyogaXMgZmx1c2ggcGFja2V0ICovCi0KLS8qIEtiZERERmxhZ1dvcmQgKi8KLQotI2RlZmluZSBLRl9OT1RTUVBBQ0tFVCAgICAgIDEwMjQgIC8qIERvbid0IHB1dCB0aGlzIHBhY2tldCBpbiBTUSBidWZmZXIgKi8KLSNkZWZpbmUgS0ZfQUNDRU5URURLRVkgICAgICAgNTEyICAvKiBLZXkgd2FzIHRyYW5zbGF0ZWQgdXNpbmcgcHJldmlvdXMgYWNjZW50LiAqLwotI2RlZmluZSBLRl9NVUxUSU1BS0UgICAgICAgICAyNTYgIC8qIEtleSB3YXMgcmVwZWF0ZWQgbWFrZSBvZiBhIHRvZ2dsZSBrZXkuICovCi0jZGVmaW5lIEtGX1NFQ09OREFSWUtFWSAgICAgIDEyOCAgLyogUHJldmlvdXMgc2NhbiBjb2RlIHdhcyB0aGUgRTAgcHJlZml4IGNvZGUuICovCi0jZGVmaW5lIEtGX0tFWUJSRUFLICAgICAgICAgICA2NCAgLyogVGhpcyBpcyB0aGUgYnJlYWsgb2YgdGhlIGtleS4gKi8KLSNkZWZpbmUgS0ZfS0VZVFlQRU1BU0sgICAgICAgIDYzICAvKiBJc29sYXRlcyB0aGUgS2V5IFR5cGUgZmllbGQgb2YgRERGbGFncy4gKi8KLSNkZWZpbmUgS0ZfVU5ERUZLRVkgICAgICAgICAgIDYzICAvKiBLZXkgcGFja2V0IGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBLRl9TWVNSRVFLRVkgICAgICAgICAgMjMgIC8qIFRoaXMga2V5IHBhY2tldCBpcyB0aGUgU3lzUmVxIGtleSAoNDk5MCkgKi8KLSNkZWZpbmUgS0ZfUFJJTlRGTFVTSEtFWSAgICAgIDIyICAvKiBUaGlzIHBhY2tldCBpcyBDdC1BbHQtUHJ0U2NyICovCi0jZGVmaW5lIEtGX1BTUFJJTlRFQ0hPS0VZICAgICAyMSAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLVAgKi8KLSNkZWZpbmUgS0ZfUFJJTlRFQ0hPS0VZICAgICAgIDIwICAvKiBUaGlzIHBhY2tldCBpcyBDdGwtUHJ0U2NyICovCi0jZGVmaW5lIEtGX1BSVFNDUktFWSAgICAgICAgICAxOSAgLyogVGhpcyBwYWNrZXQgaXMgUHJ0U2NyICovCi0jZGVmaW5lIEtGX1BTQlJFQUtLRVkgICAgICAgICAxOCAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLUMgKi8KLSNkZWZpbmUgS0ZfQlJFQUtLRVkgICAgICAgICAgIDE3ICAvKiBUaGlzIHBhY2tldCBpcyBDdGwtQnJlYWsgKi8KLSNkZWZpbmUgS0ZfQUNDRU5US0VZICAgICAgICAgIDE2ICAvKiBUaGlzIHBhY2tldCBpcyBhbiBhY2NlbnQga2V5ICovCi0jZGVmaW5lIEtGX1hST1JQTk9UICAgICAgICAgICAxMyAgLyogVGhpcyBwYWNrZXQgaXMgYSBSZWFkIG9yIFBlZWsgTm90aWZpY2F0aW9uIFBjdC4gKi8KLSNkZWZpbmUgS0ZfTUxOT1RJRklDQVRJT04gICAgIDE0ICAvKiBwYWNrZXQgaXMgYSBNdWx0aS1MYXllciBOTFMgcGFja2V0ICovCi0jZGVmaW5lIEtGX0hPVEtFWVBBQ0tFVCAgICAgICAxMiAgLyogVGhpcyBwYWNrZXQgaXMgdGhlIGhvdCBrZXkuICovCi0jZGVmaW5lIEtGX0JBREtFWUNPTUJPICAgICAgICAxMSAgLyogQWNjZW50L2NoYXIgY29tYm8gdW5kZWZpbmVkLCBiZWVwIG9ubHkuICovCi0jZGVmaW5lIEtGX1dBS0VVUEtFWSAgICAgICAgICAxMCAgLyogVGhpcyBwYWNrZXQgaXMgb25lIGZvbGxvd2luZyBQQVVTRUtFWSAqLwotI2RlZmluZSBLRl9QU1BBVVNFS0VZICAgICAgICAgIDkgIC8qIFRoaXMgcGFja2V0IGlzIEN0bC1TICovCi0jZGVmaW5lIEtGX1BBVVNFS0VZICAgICAgICAgICAgOCAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLU51bWxvY2sgb3IgUEFVU0UgKi8KLSNkZWZpbmUgS0ZfU0hJRlRNQVNLICAgICAgICAgICA3ICAvKiBLZXkgaXMgYSBzaGlmdCBLZXkgKi8KLSNkZWZpbmUgS0ZfRFVNUEtFWSAgICAgICAgICAgICA2ICAvKiBUaGlzIHBhY2tldCBpcyBDdGwtTnVtbG9jay1OdW1Mb2NrICovCi0jZGVmaW5lIEtGX1JFQk9PVEtFWSAgICAgICAgICAgNSAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLUFsdC1EZWwgKi8KLSNkZWZpbmUgS0ZfUkVTRU5EQ09ERSAgICAgICAgICA0ICAvKiBUaGlzIHBhY2tldCBpcyByZXNlbmQgY29kZSBmcm9tIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgS0ZfT1ZFUlJVTkNPREUgICAgICAgICAzICAvKiBUaGlzIHBhY2tldCBpcyBvdmVycnVuIGNvZGUgZnJvbSBjb250cm9sbGVyICovCi0jZGVmaW5lIEtGX1NFQ1BSRUZJWENPREUgICAgICAgMiAgLyogVGhpcyBwYWNrZXQgaXMgRTAvRTEgc2NhbiBjb2RlICovCi0jZGVmaW5lIEtGX0FDS0NPREUgICAgICAgICAgICAgMSAgLyogVGhpcyBwYWNrZXQgaXMgYWNrIGNvZGUgZnJvbSBrZXlib2FyZCAqLwotCi0KLXR5cGVkZWYgc3RydWN0IF9NT05CVUYgewotICBVU0hPUlQgICAgY2I7Ci0gIEtFWVBBQ0tFVCBCdWZmZXI7Ci0gIEJZVEUgICAgICBSZXNlcnZlZFsyMF07Ci19IE1PTkJVRjsKLQotI2RlZmluZSBSU19TWVNSRUcgICAgICAzMjc2OCAgLyogQml0IDE1ICBTeXNSZXEga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfQ0FQU0xPQ0sgICAgMTYzODQgIC8qIEJpdCAxNCAgQ2FwcyBMb2NrIGtleSBkb3duICovCi0jZGVmaW5lIFJTX05VTUxPQ0sgICAgICA4MTkyICAvKiBCaXQgMTMgIE51bUxvY2sga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfU0NST0xMTE9DSyAgIDQwOTYgIC8qIEJpdCAxMiAgU2Nyb2xsIExvY2sga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfUkFMVCAgICAgICAgIDIwNDggIC8qIEJpdCAxMSAgUmlnaHQgQWx0IGtleSBkb3duICovCi0jZGVmaW5lIFJTX1JDT05UUk9MICAgICAxMDI0ICAvKiBCaXQgMTAgIFJpZ2h0IEN0cmwga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfTEFMVCAgICAgICAgICA1MTIgIC8qIEJpdCAgOSAgTGVmdCBBbHQga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfTENPTlRST0wgICAgICAyNTYgIC8qIEJpdCAgOCAgTGVmdCBDdHJsIGtleSBkb3duICovCi0jZGVmaW5lIFJTX0lOU0VSVCAgICAgICAgMTI4ICAvKiBCaXQgIDcgIEluc2VydCBvbiAqLwotI2RlZmluZSBSU19DQVBTICAgICAgICAgICA2NCAgLyogQml0ICA2ICBDYXBzIExvY2sgb24gKi8KLSNkZWZpbmUgUlNfTlVNICAgICAgICAgICAgMzIgIC8qIEJpdCAgNSAgTnVtTG9jayBvbiAqLwotI2RlZmluZSBSU19TQ1JPTEwgICAgICAgICAxNiAgLyogQml0ICA0ICBTY3JvbGwgTG9jayBvbiAqLwotI2RlZmluZSBSU19BTFQgICAgICAgICAgICAgOCAgLyogQml0ICAzICBFaXRoZXIgQWx0IGtleSBkb3duICovCi0jZGVmaW5lIFJTX0NPTlRST0wgICAgICAgICA0ICAvKiBCaXQgIDIgIEVpdGhlciBDdHJsIGtleSBkb3duICovCi0jZGVmaW5lIFJTX0xTSElGVCAgICAgICAgICAyICAvKiBCaXQgIDEgIExlZnQgU2hpZnQga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfUlNISUZUICAgICAgICAgIDEgIC8qIEJpdCAgMCAgUmlnaHQgU2hpZnQga2V5IGRvd24gKi8KLQotCi0jZGVmaW5lIENTX1JDT05UUk9MICAgICA5MSAgICAvKiBSaWdodCBDb250cm9sICovCi0jZGVmaW5lIENTX0xTSElGVCAgICAgICA0MiAgICAvKiBMZWZ0IFNoaWZ0ICovCi0jZGVmaW5lIENTX1JTSElGVCAgICAgICA1NCAgICAvKiBSaWdodCBTaGlmdCAqLwotI2RlZmluZSBDU19MQUxUICAgICAgICAgNTYgICAgLyogTGVmdCBBbHQgKi8KLSNkZWZpbmUgQ1NfUkFMVCAgICAgICAgIDk0ICAgIC8qIFJpZ2h0IEFsdCAqLwotCi0KLS8qIERvc01vbiogcHJvdG90eXBlcyAqLwotI2lmZGVmIF9fRU1YX18KLSAgICAjZGVmaW5lICBBUElSRVQxNiAgICAgICAgVVNIT1JUCi0gICAgI2RlZmluZSAgQVBJRU5UUlkxNgotI2Vsc2UKLSAgICAjZGVmaW5lICBEb3NNb25PcGVuICAgICAgRE9TMTZNT05PUEVOCi0gICAgI2RlZmluZSAgRG9zTW9uQ2xvc2UgICAgIERPUzE2TU9OQ0xPU0UKLSAgICAjZGVmaW5lICBEb3NNb25SZWcgICAgICAgRE9TMTZNT05SRUcKLSAgICAjZGVmaW5lICBEb3NNb25SZWFkICAgICAgRE9TMTZNT05SRUFECi0gICAgI2RlZmluZSAgRG9zTW9uV3JpdGUgICAgIERPUzE2TU9OV1JJVEUKLSAgICAjZGVmaW5lICBEb3NHZXRJbmZvU2VnICAgRE9TMTZHRVRJTkZPU0VHCi0jZW5kaWYKLQotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25PcGVuICAgKFBTWiBwc3pEZXZOYW1lLCBQSE1PTklUT1IgcGhtb24pOwotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25DbG9zZSAgKEhNT05JVE9SIGhtb24pOwotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25SZWcgICAgKEhNT05JVE9SIGhtb24sIE1PTkJVRiAqcGJJbkJ1ZiwgLypNT05CVUYqL1VMT05HICpwYk91dEJ1ZiwgVVNIT1JUIGZQb3NpdGlvbiwgVVNIT1JUIHVzSW5kZXgpOwotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25SZWFkICAgKFBCWVRFIHBiSW5CdWYsIFVTSE9SVCBmV2FpdCwgUEJZVEUgcGJEYXRhQnVmLCBQVVNIT1JUIHBjYkRhdGEpOwotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25Xcml0ZSAgKFBCWVRFIHBiT3V0QnVmLCBQQllURSBwYkRhdGFCdWYsIFVTSE9SVCBjYkRhdGEpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhYTFjNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSU5DTF9ET1NQUk9GSUxFCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfU1VCCi0jZGVmaW5lIElOQ0xfVklPCi0jZGVmaW5lIElOQ0xfS0JECi0jaW5jbHVkZSA8b3MyLmg+Ci0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2luY2x1ZGUgIm9zMi9tb24uaCIKLQotdm9pZCBfX1BNX2NoZWNrQ29uc29sZVN3aXRjaCh2b2lkKTsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NmVlYWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2lmbmRlZiBfX0VNWF9fCi0jaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jZW5kaWYKLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9TVUIKLSNkZWZpbmUgSU5DTF9WSU8KLSNkZWZpbmUgSU5DTF9LQkQKLSNpbmNsdWRlIDxvczIuaD4KLQotLyogU2VtYXBob3JlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggb3VyIGJhY2tncm91bmQgZGFlbW9uICovCi0jZGVmaW5lIFNIQVJFRFNFTSAgICgoUFNaKSJcXFNFTTMyXFxTRERcXERBRU1PTiIpCi0jZGVmaW5lIERBRU1PTl9OQU1FICJTREREQUVNTi5FWEUiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFB1YmxpYyBzdHJ1Y3R1cmVzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBWSURFT1BNSSBmb3IgaW1wbGVtZW50aW5nCi0gKiB0aGUgYWJpbGl0eSB0byBjYWxsIHRoZSByZWFsIG1vZGUgQklPUyBmdW5jdGlvbnMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX1ZJREVPTU9ERUlORk8gewotICAgIFVMT05HICAgbWlNb2RlSWQ7Ci0gICAgVVNIT1JUICB1c1R5cGU7Ci0gICAgVVNIT1JUICB1c0ludDEwTW9kZVNldDsKLSAgICBVU0hPUlQgIHVzWFJlc29sdXRpb247Ci0gICAgVVNIT1JUICB1c1lSZXNvbHV0aW9uOwotICAgIFVMT05HICAgdWxCdWZmZXJBZGRyZXNzOwotICAgIFVMT05HICAgdWxBcGVydHVyZVNpemU7Ci0gICAgQllURSAgICBiQml0c1BlclBpeGVsOwotICAgIEJZVEUgICAgYkJpdFBsYW5lczsKLSAgICBCWVRFICAgIGJYQ2hhclNpemU7Ci0gICAgQllURSAgICBiWUNoYXJTaXplOwotICAgIFVTSE9SVCAgdXNCeXRlc1BlclNjYW5MaW5lOwotICAgIFVTSE9SVCAgdXNUZXh0Um93czsKLSAgICBVTE9ORyAgIHVsUGFnZUxlbmd0aDsKLSAgICBVTE9ORyAgIHVsU2F2ZVNpemU7Ci0gICAgQllURSAgICBiVnJ0UmVmcmVzaDsKLSAgICBCWVRFICAgIGJIcnRSZWZyZXNoOwotICAgIEJZVEUgICAgYlZydFBvbFBvczsKLSAgICBCWVRFICAgIGJIcnRQb2xQb3M7Ci0gICAgQ0hBUiAgICBiUmVkTWFza1NpemU7Ci0gICAgQ0hBUiAgICBiUmVkRmllbGRQb3NpdGlvbjsKLSAgICBDSEFSICAgIGJHcmVlbk1hc2tTaXplOwotICAgIENIQVIgICAgYkdyZWVuRmllbGRQb3NpdGlvbjsKLSAgICBDSEFSICAgIGJCbHVlTWFza1NpemU7Ci0gICAgQ0hBUiAgICBiQmx1ZUZpZWxkUG9zaXRpb247Ci0gICAgQ0hBUiAgICBiUnN2ZE1hc2tTaXplOwotICAgIENIQVIgICAgYlJzdmRGaWVsZFBvc2l0aW9uOwotICAgIFVMT05HICAgdWxDb2xvcnM7Ci0gICAgVUxPTkcgICB1bFJlc2VydmVkWzNdOwotICAgIH0gVklERU9NT0RFSU5GTywgRkFSICpQVklERU9NT0RFSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgX0FEQVBURVJJTkZPIHsKLSAgICBVTE9ORyAgICAgICB1bEFkYXB0ZXJJRDsKLSAgICBDSEFSICAgICAgICBzek9FTVN0cmluZ1sxMjhdOwotICAgIENIQVIgICAgICAgIHN6REFDU3RyaW5nWzEyOF07Ci0gICAgQ0hBUiAgICAgICAgc3pSZXZpc2lvblsxMjhdOwotICAgIFVMT05HICAgICAgIHVsVG90YWxNZW1vcnk7Ci0gICAgVUxPTkcgICAgICAgdWxNTUlPQmFzZUFkZHJlc3M7Ci0gICAgVUxPTkcgICAgICAgdWxQSU9CYXNlQWRkcmVzczsKLSAgICBCWVRFICAgICAgICBiQnVzVHlwZTsKLSAgICBCWVRFICAgICAgICBiRW5kaWFuOwotICAgIFVTSE9SVCAgICAgIHVzRGV2aWNlQnVzSUQ7Ci0gICAgVVNIT1JUICAgICAgdXNWZW5kb3JCdXNJRDsKLSAgICBVU0hPUlQgICAgICBTbG90SUQ7Ci0gICAgfSBBREFQVEVSSU5GTywgRkFSICpQQURBUFRFUklORk87Ci0KLXR5cGVkZWYgc3RydWN0IF9WSURFT19BREFQVEVSIHsKLSAgICB2b2lkICAgICAgICAgICAgKmh2aWRlbzsKLSAgICBBREFQVEVSSU5GTyAgICAgQWRhcHRlcjsKLSAgICBWSURFT01PREVJTkZPICAgTW9kZUluZm87Ci0gICAgfSBWSURFT19BREFQVEVSLCBGQVIgKlBWSURFT19BREFQVEVSOwotCi0vKiBQTUlSRVFVRVNUX1NPRlRXQVJFSU5UIHN0cnVjdHVyZXMgZnJvbSBPUy8yIERESyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUxPTkcgdWxGbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWRE0gaW5pdGlhbGl6YXRpb24gdHlwZSAqLwotI2RlZmluZSBWRE1fUE9TVExPQUQgICAgICAgICAgICAgICAgICAgIDB4MSAgICAgLyogYWRhcHRlciBqdXN0IGxvYWRlZCwgdXNlZCBpbnRlcm5hbGx5IGZvciBpbml0aWFsaXphdGlvbiAqLwotI2RlZmluZSBWRE1fSU5JVElBTElaRSAgICAgICAgICAgICAgICAgIDB4MiAgICAgLyogZm9yY2UgaW5pdGlhbGl6YXRpb24gb2YgYSBwZXJtYW5lbnRseSBvcGVuIFZETSwgZXZlbiBpZiBwcmV2aW91c2x5IGluaXRpYWxpemVkICovCi0jZGVmaW5lIFZETV9URVJNSU5BVEVfUE9TVElOSVRJQUxJWkUgICAgMHg2ICAgICAvKnN0YXJ0IFZETSB3aXRoIGluaXRpYWxpemF0aW9uLCBidXQgY2xvc2UgaXQgYWZ0ZXJ3YXJkcyAoaW5jbHVkZXMgVkRNX0lOSVRJQUxJWkUpICovCi0jZGVmaW5lIFZETV9RVUVSWV9DQVBBQklMSVRZICAgICAgICAgICAgMHgxMCAgICAvKiBxdWVyeSB0aGUgY3VycmVudCBpbnQgMTAgY2FwYWJpbGl0eSAqLwotI2RlZmluZSBWRE1fRlVMTF9WRE1fQ1JFQVRFRCAgICAgICAgICAgIDB4MjAgICAgLyogYSBmdWxsIFZETSBpcyBjcmVhdGVkICovCi0jZGVmaW5lIFZETV9NSU5JX1ZETV9DUkVBVEVEICAgICAgICAgICAgMHg0MCAgICAvKiBhIG1pbmkgVkRNIGlzIGNyZWF0ZWQgKi8KLSNkZWZpbmUgVkRNX01JTklfVkRNX1NVUFBPUlRFRCAgICAgICAgICAweDgwICAgIC8qIG1pbmkgVkRNIHN1cHBvcnQgaXMgYXZhaWxhYmxlICovCi0gICAgUENIQVIgc3pOYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWRE0gaW5pdGlhbGl6YXRpb24gcHJvZ3JhbSAqLwotICAgIFBDSEFSIHN6QXJnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVkRNIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cyAqLwotICAgIH1JTklUVkRNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQllURSBiQnVmZmVyVHlwZTsKLSNkZWZpbmUgQlVGRkVSX05PTkUgICAgIDAKLSNkZWZpbmUgSU5QVVRfQlVGRkVSICAgIDEKLSNkZWZpbmUgT1VUUFVUX0JVRkZFUiAgIDIKLSAgICBCWVRFIGJSZXNlcnZlZDsKLSAgICBCWVRFIGJTZWxDUkY7Ci0gICAgQllURSBiT2ZmQ1JGOwotICAgIFBWT0lEIHBBZGRyZXNzOwotICAgIFVMT05HIHVsU2l6ZTsKLSAgICB9IEJVRkZFUiwgKlBCVUZGRVI7Ci0KLXR5cGVkZWYgc3RydWN0IHZjcmZfcyB7Ci0gICAgVUxPTkcgcmVnX2VheDsKLSAgICBVTE9ORyByZWdfZWJ4OwotICAgIFVMT05HIHJlZ19lY3g7Ci0gICAgVUxPTkcgcmVnX2VkeDsKLSAgICBVTE9ORyByZWdfZWJwOwotICAgIFVMT05HIHJlZ19lc2k7Ci0gICAgVUxPTkcgcmVnX2VkaTsKLSAgICBVTE9ORyByZWdfZHM7Ci0gICAgVUxPTkcgcmVnX2VzOwotICAgIFVMT05HIHJlZ19mczsKLSAgICBVTE9ORyByZWdfZ3M7Ci0gICAgVUxPTkcgcmVnX2NzOwotICAgIFVMT05HIHJlZ19laXA7Ci0gICAgVUxPTkcgcmVnX2VmbGFnOwotICAgIFVMT05HIHJlZ19zczsKLSAgICBVTE9ORyByZWdfZXNwOwotICAgIH0gVkNSRjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVMT05HICAgdWxCSU9TSW50Tm87Ci0gICAgVkNSRiAgICBhQ1JGOwotICAgIEJVRkZFUiAgcEJbMl07Ci0gICAgfSBJTlRDUkY7Ci0KLSNkZWZpbmUgUE1JUkVRVUVTVF9MT0FEUE1JRklMRSAgICAgICAgICAyMQotI2RlZmluZSBQTUlSRVFVRVNUX0lERU5USUZZQURBUFRFUiAgICAgIDIyCi0jZGVmaW5lIFBNSVJFUVVFU1RfU09GVFdBUkVJTlQgICAgICAgICAgMjMKLQotI2lmZGVmICBQVFJfREVDTF9JTl9GUk9OVAotI2RlZmluZSBFWFBFTlRSWVAgICAqIEVYUEVOVFJZCi0jZWxzZQotI2RlZmluZSBFWFBFTlRSWVAgICBFWFBFTlRSWSAqCi0jZW5kaWYKLQotLyogRW50cnkgcG9pbnQgdG8gVklERU9QTUkzMlJlcXVlc3QuIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgZXh0ZXJuYWwKLSAqIGNvZGUgdGhhdCBoYXMgYWxyZWFkeSBsb2FkZWQgVklERU9QTUkgdG8gYXZvaWQgbG9hZGluZyBpdCB0d2ljZS4KLSAqLwotCi1BUElSRVQgKEVYUEVOVFJZUCBQTV9WSURFT1BNSTMyUmVxdWVzdCkoUFZJREVPX0FEQVBURVIsIFVMT05HLCBQVk9JRCwgUFZPSUQpID0gTlVMTDsKLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZUludDEwID0gLTE7IC8qIFRydWUgaWYgd2UgaGF2ZSBJbnQgMTAgc3VwcG9ydCAgICovCi1zdGF0aWMgaWJvb2wgICAgICAgIHVzZVZQTUkgPSB0cnVlOyAvKiBGYWxzZSBpZiBWSURFT1BNSSB1bmF2YWlsYWJsZSAgICAqLwotc3RhdGljIFZJREVPX0FEQVBURVIgQWRhcHRlcjsgICAgICAgLyogVmlkZW8gYWRhcHRlciBmb3IgVklERU9QTUkgICAgICAgKi8KLXN0YXRpYyB1Y2hhciAgICAgICAgUk1CdWZbMTAyNF07ICAgIC8qIEZha2UgcmVhbCBtb2RlIHRyYW5zZmVyIGJ1ZmZlciAgICovCi1zdGF0aWMgdWludCAgICAgICAgIFZFU0FCdWZfbGVuID0gMTAyNDsvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAqLwotc3RhdGljIHZvaWQgICAgICAgICAqVkVTQUJ1Zl9wdHIgPSBOVUxMOy8qIE5lYXIgcG9pbnRlciB0byBWRVNBQnVmICAgICAgKi8KLXN0YXRpYyB1aW50ICAgICAgICAgVkVTQUJ1Zl9yc2VnOyAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCAgICAgICAgIFZFU0FCdWZfcm9mZjsgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLwotc3RhdGljIHVjaGFyICogICAgICBsb3dNZW0gPSBOVUxMOwotc3RhdGljIGlib29sICAgICAgICBpc1Nlc3Npb25Td2l0Y2hpbmcgPSBmYWxzZTsKLXN0YXRpYyB1bG9uZyAgICAgICAgcGFybXNJbls0XTsgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi1zdGF0aWMgdWxvbmcgICAgICAgIHBhcm1zT3V0WzRdOyAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotZXh0ZXJuIHVzaG9ydCAgICAgICBfUE1fZ2R0Owotc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKiBEb3NTeXNDdGwgcHJvdG90eXBlLiBJdCBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIGhlYWRlcnMgYnV0IGl0IGlzIGluIHRoZQotICogc3RhbmRhcmQgaW1wb3J0IGxpYnJhcmllcyAoRE9TQ0FMTFMuODc2KS4gRnVubnkuCi0gKi8KLUFQSVJFVCBBUElFTlRSWSBEb3NTeXNDdGwoVUxPTkcgdWxGdW5jdGlvbiwgUFZPSUQgcHZEYXRhKTsKLQotLyogVGhpcyBpcyB0aGUgc3RhY2sgc2l6ZSBmb3IgdGhlIHRocmVhZHMgdGhhdCB0cmFjayB0aGUgc2Vzc2lvbiBzd2l0Y2ggZXZlbnQgKi8KLSNkZWZpbmUgU0VTU0lPTl9TV0lUQ0hfU1RBQ0tfU0laRSAgIDMyNzY4Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWSU9NT0RFSU5GTyAgICAgdm1pOwotICAgIFVTSE9SVCAgICAgICAgICBDdXJzb3JYOwotICAgIFVTSE9SVCAgICAgICAgICBDdXJzb3JZOwotICAgIFVDSEFSICAgICAgICAgICBGcmFtZUJ1ZmZlclsxXTsKLSAgICB9IENPTlNPTEVfU0FWRTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NFU1dJVENIUkVDIHsKLSAgICAvKiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHZvbGF0aWxlIGJlY2F1c2Ugb2YgUE1fU1VTUEVORF9BUFAgICAgICAgICAqLwotICAgIHZvbGF0aWxlIGludCAgICBGbGFnczsgICAgICAgICAgLyogLTEgb3IgUE1fREVBQ1RJVkFURSBvciBQTV9SRUFDVElWQVRFICovCi0gICAgUE1fc2F2ZVN0YXRlX2NiIENhbGxiYWNrOyAgICAgICAvKiBTYXZlL3Jlc3RvcmUgY29udGV4dCBjYWxsYmFjayAgICAgICAgKi8KLSAgICBITVRYICAgICAgICAgICAgTXV0ZXg7ICAgICAgICAgIC8qIEV4Y2x1c2l2ZSBhY2Nlc3MgbXV0ZXggICAgICAgICAgICAgICAqLwotICAgIEhFViAgICAgICAgICAgICBFdmVudDsgICAgICAgICAgLyogUG9zdGVkIGFmdGVyIGNhbGxiYWNrIGlzIGNhbGxlZCAgICAgICovCi0gICAgfSBTRVNXSVRDSFJFQzsKLQotLyogUGFnZSBzaXplZCBibG9jayBjYWNoZSAqLwotCi0jZGVmaW5lIFBBR0VTX1BFUl9CTE9DSyAgICAgMzIKLSNkZWZpbmUgUEFHRV9CTE9DS19TSVpFICAgICAoUEFHRVNfUEVSX0JMT0NLICogUE1fUEFHRV9TSVpFICsgKFBNX1BBR0VfU0laRS0xKSArIHNpemVvZihwYWdlYmxvY2spKQotI2RlZmluZSBGUkVFTElTVF9ORVhUKHApICAgICgqKHZvaWQqKikocCkpCi10eXBlZGVmIHN0cnVjdCBwYWdlYmxvY2sgewotICAgIHN0cnVjdCBwYWdlYmxvY2sgICAgKm5leHQ7Ci0gICAgc3RydWN0IHBhZ2VibG9jayAgICAqcHJldjsKLSAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdFN0YXJ0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0RW5kOwotICAgIGludCAgICAgICAgICAgICAgICAgZnJlZUNvdW50OwotICAgIFBNX2xvY2tIYW5kbGUgICAgICAgbG9ja0hhbmRsZTsKLSAgICB9IHBhZ2VibG9jazsKLQotc3RhdGljIHBhZ2VibG9jayAgICAqcGFnZUJsb2NrcyA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZnVuYyAgICAgICAgLSBIZWxwZXIgZGV2aWNlIGRyaXZlciBmdW5jdGlvbiB0byBjYWxsCi0KLVJFVFVSTlM6Ci1GaXJzdCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciBpbiBwYXJtc091dFswXQotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gb3BlbiBvdXIgaGVscGVyIGRldmljZSBkcml2ZXIsIGNhbGwgaXQgYW5kIGNsb3NlIHRoZSBmaWxlCi1oYW5kbGUuIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIG9wZW4gdGhlIGRldmljZSBkcml2ZXIgZm9yIGV2ZXJ5IGNhbGwgYmVjYXVzZQotb2YgdHdvIHByb2JsZW1zOgotCi0gMS4gV2UgY2Fubm90IG9wZW4gYSBzaW5nbGUgZmlsZSBoYW5kbGUgaW4gYSBETEwgdGhhdCBpcyBzaGFyZWQgYW1vbmdzdAotICAgIHByb2dyYW1zLCBzaW5jZSBldmVyeSBwcm9jZXNzIG11c3QgaGF2ZSBpdCdzIG93biBvcGVuIGZpbGUgaGFuZGxlLgotCi0gMi4gRm9yIHNvbWUgcmVhc29uIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBsaW1pdCBvZiBhYm91dCAxMiBvcGVuIGZpbGUKLSAgICBoYW5kbGVzIG9uIGEgZGV2aWNlIGRyaXZlciBpbiB0aGUgc3lzdGVtLiBIZW5jZSB3aGVuIHdlIG9wZW4gbW9yZQotICAgIHRoYW4gYWJvdXQgMTIgZmlsZSBoYW5kbGVzIHRoaW5ncyBzdGFydCB0byBnbyB2ZXJ5IHN0cmFuZ2UuCi0KLUhlbmNlIHdlIHNpbXBseSBvcGVuIHRoZSBmaWxlIGhhbmRsZSBldmVyeSB0aW1lIHRoYXQgd2UgbmVlZCB0byBjYWxsIHRoZQotZGV2aWNlIGRyaXZlciB0byB3b3JrIGFyb3VuZCB0aGVzZSBwcm9ibGVtcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgQ2FsbFNEREhlbHAoCi0gICAgaW50IGZ1bmMpCi17Ci0gICAgc3RhdGljIHVsb25nICAgIGluTGVuOyAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotICAgIHN0YXRpYyB1bG9uZyAgICBvdXRMZW47ICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLSAgICBIRklMRSAgICAgICAgICAgaFNEREhlbHA7Ci0gICAgVUxPTkcgICAgICAgICAgIHJjOwotICAgIHVsb25nICAgICAgICAgICByZXN1bHQ7Ci0KLSAgICBpZiAoKHJjID0gRG9zT3BlbihQTUhFTFBfTkFNRSwmaFNEREhlbHAsJnJlc3VsdCwwLDAsCi0JICAgIEZJTEVfT1BFTiwgT1BFTl9TSEFSRV9ERU5ZTk9ORSB8IE9QRU5fQUNDRVNTX1JFQURXUklURSwKLQkgICAgTlVMTCkpICE9IDApIHsKLQlpZiAocmMgPT0gNCkgeyAgLyogRGlkIHdlIHJ1biBvdXQgb2YgZmlsZSBoYW5kbGVzPyAqLwotCSAgICBVTE9ORyAgIHVsTmV3RkhzOwotCSAgICBMT05HICAgIGxBZGRGSHMgPSA1OwotCi0JICAgIGlmIChEb3NTZXRSZWxNYXhGSCgmbEFkZEZIcywgJnVsTmV3RkhzKSAhPSAwKQotCQlQTV9mYXRhbEVycm9yKCJGYWlsZWQgdG8gcmFpc2UgdGhlIGZpbGUgaGFuZGxlcyBsaW1pdCEiKTsKLQkgICAgZWxzZSB7Ci0JCWlmICgocmMgPSBEb3NPcGVuKFBNSEVMUF9OQU1FLCZoU0RESGVscCwmcmVzdWx0LDAsMCwKLQkJCUZJTEVfT1BFTiwgT1BFTl9TSEFSRV9ERU5ZTk9ORSB8IE9QRU5fQUNDRVNTX1JFQURXUklURSwKLQkJCU5VTEwpKSAhPSAwKSB7Ci0JCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBTRERIRUxQJCBoZWxwZXIgZGV2aWNlIGRyaXZlciEgKCMyKSIpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQllbHNlCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBvcGVuIFNEREhFTFAkIGhlbHBlciBkZXZpY2UgZHJpdmVyISIpOwotCX0KLSAgICBpZiAoRG9zRGV2SU9DdGwoaFNEREhlbHAsUE1IRUxQX0lPQ1RMLGZ1bmMsCi0JICAgICZwYXJtc0luLCBpbkxlbiA9IHNpemVvZihwYXJtc0luKSwgJmluTGVuLAotCSAgICAmcGFybXNPdXQsIG91dExlbiA9IHNpemVvZihwYXJtc091dCksICZvdXRMZW4pICE9IDApCi0JUE1fZmF0YWxFcnJvcigiRmFpbHVyZSBjYWxsaW5nIFNEREhFTFAkIGhlbHBlciBkZXZpY2UgZHJpdmVyISIpOwotICAgIERvc0Nsb3NlKGhTRERIZWxwKTsKLSAgICByZXR1cm4gcGFybXNPdXRbMF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgb24gYSBEQkNTIHN5c3RlbS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfX0lzREJDU1N5c3RlbSh2b2lkKQotewotICAgIENIQVIgICAgICAgIGFjaERCQ1NJbmZvWzEyXTsKLSAgICBDT1VOVFJZQ09ERSBjY1N0cnVjdCA9IHswLCAwfTsKLQotICAgIG1lbXNldChhY2hEQkNTSW5mbywgMCwgMTIpOwotCi0gICAgLyogR2V0IHRoZSBEQkNTIHZlY3RvciAtIGlmIGl0J3Mgbm90IGVtcHR5LCB3ZSdyZSBvbiBEQkNTICovCi0gICAgRG9zUXVlcnlEQkNTRW52KHNpemVvZihhY2hEQkNTSW5mbyksICZjY1N0cnVjdCwgYWNoREJDU0luZm8pOwotICAgIGlmIChhY2hEQkNTSW5mb1swXSAhPSAwKQotCXJldHVybiB0cnVlOwotICAgIGVsc2UKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lIGlmIFBNU0hFTEwgaXMgcnVubmluZyAtIGlmIGl0IGlzbid0LCB3ZSBjYW4ndCB1c2UgY2VydGFpbiBjYWxscwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9faXNTaGVsbExvYWRlZCh2b2lkKQotewotICAgIFBWT0lEICAgcHRyOwotCi0gICAgaWYgKERvc0dldE5hbWVkU2hhcmVkTWVtKCZwdHIsIChQU1opIlxcU0hBUkVNRU1cXFBNR0xPQkFMLk1FTSIsIFBBR19SRUFEKSA9PSBOT19FUlJPUikgewotCURvc0ZyZWVNZW0ocHRyKTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgYW5kIGNvbm5lY3QgdG8gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLiBJZiB3ZQotY2Fubm90IGNvbm5lY3QgdG8gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLCB3ZSBiYWlsIG91dCB3aXRoIGFuIGVycm9yCi1tZXNzYWdlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIGlmICghbG93TWVtKSB7Ci0JLyogT2J0YWluIHRoZSAzMi0+MTYgY2FsbGdhdGUgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciB0byBlbmFibGUgSU9QTCAqLwotCWlmICgoX1BNX2dkdCA9IENhbGxTRERIZWxwKFBNSEVMUF9HRVRHRFQzMikpID09IDApCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBvYnRhaW4gY2FsbCBnYXRlIHNlbGVjdG9yISIpOwotCi0JUE1fc2V0SU9QTCgzKTsKLQotCS8qIE1hcCB0aGUgZmlyc3QgTWIgb2YgcGh5c2ljYWwgbWVtb3J5IGludG8gbG93TWVtICovCi0JaWYgKChsb3dNZW0gPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpKSA9PSBOVUxMKQotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gbWFwIGZpcnN0IE1iIHBoeXNpY2FsIG1lbW9yeSEiKTsKLQotCS8qIEluaXRpYWxpc2UgdGhlIE1UUlIgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwotCU1UUlJfaW5pdCgpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5IGZvciBCSU9TIGFjY2VzcyB2aWEgVklERU9QTUkuIFRoaXMgc2hvdWxkIHdvcmsKLXdpdGggYW55IEdSQUREIGRyaXZlciwgaW5jbHVkaW5nIFNERC8yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBJbml0SW50MTAodm9pZCkKLXsKLSAgICBITU9EVUxFICAgICBoTW9kR0VOUE1JLGhNb2RTRERQTUksaE1vZFZpZGVvUE1JOwotICAgIENIQVIgICAgICAgIGJ1Zls4MF0scGF0aFtfTUFYX1BBVEhdOwotICAgIEhFViAgICAgICAgIGhldkRhZW1vbiA9IE5VTExIQU5ETEU7Ci0gICAgUkVTVUxUQ09ERVMgcmVzQ29kZXM7Ci0KLSAgICBpZiAoaGF2ZUludDEwID09IC0xKSB7Ci0JLyogQ29ubmVjdCB0byBWSURFT1BNSSBhbmQgZ2V0IGVudHJ5IHBvaW50LiBOb3RlIHRoYXQgd2Ugb25seQotCSAqIGRvIHRoaXMgaWYgR0VOUE1JIG9yIFNERFBNSSBhcmUgYWxyZWFkeSBsb2FkZWQsIHNpbmNlIHdlIG5lZWQKLQkgKiBhIEdSQUREIGJhc2VkIGRyaXZlciBmb3IgdGhpcyB0byB3b3JrLgotCSAqLwotCVBNX2luaXQoKTsKLQloYXZlSW50MTAgPSBmYWxzZTsKLQlpZiAoRG9zUXVlcnlNb2R1bGVIYW5kbGUoKFBTWikiR0VOUE1JLkRMTCIsJmhNb2RHRU5QTUkpICE9IDApCi0JICAgIGhNb2RHRU5QTUkgPSBOVUxMSEFORExFOwotCWlmIChEb3NRdWVyeU1vZHVsZUhhbmRsZSgoUFNaKSJTRERQTUkuRExMIiwmaE1vZFNERFBNSSkgIT0gMCkKLQkgICAgaE1vZFNERFBNSSA9IE5VTExIQU5ETEU7Ci0JaWYgKGhNb2RHRU5QTUkgfHwgaE1vZFNERFBNSSkgewotCSAgICBpZiAoRG9zTG9hZE1vZHVsZSgoUFNaKWJ1ZixzaXplb2YoYnVmKSwoUFNaKSJWSURFT1BNSS5ETEwiLCZoTW9kVmlkZW9QTUkpID09IDApIHsKLQkJaWYgKERvc1F1ZXJ5UHJvY0FkZHIoaE1vZFZpZGVvUE1JLDAsKFBTWikiVklERU9QTUkzMlJlcXVlc3QiLCh2b2lkKikmUE1fVklERU9QTUkzMlJlcXVlc3QpICE9IDApCi0JCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gZ2V0IFZJREVPUE1JMzJSZXF1ZXN0IGVudHJ5IHBvaW50ISIpOwotCQlzdHJjcHkocGF0aCwiWDpcXE9TMlxcU1ZHQURBVEEuUE1JIik7Ci0JCXBhdGhbMF0gPSBQTV9nZXRCb290RHJpdmUoKTsKLQkJaWYgKFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfTE9BRFBNSUZJTEUscGF0aCxOVUxMKSAhPSAwKSB7Ci0JCSAgICBEb3NGcmVlTW9kdWxlKGhNb2RWaWRlb1BNSSk7Ci0JCSAgICBQTV9WSURFT1BNSTMyUmVxdWVzdCA9IE5VTEw7Ci0JCSAgICBoYXZlSW50MTAgPSBmYWxzZTsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICAvKiBBdHRlbXB0IHRvIGluaXRpYWxpc2UgdGhlIGZ1bGwgVkRNIGluIHRoZSBzeXN0ZW0uIFRoaXMgd2lsbCBvbmx5Ci0JCSAgICAgKiB3b3JrIGlmIFZQUlBNSS5TWVMgaXMgbG9hZGVkLCBidXQgaXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcGFzc2luZwotCQkgICAgICogdmFsdWVzIGluIEVTL0RTL0VTSS9FREkgYmV0d2VlbiB0aGUgQklPUyB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGgKLQkJICAgICAqIGtlcm5lbCBWRE0ncyBpbiBmaXhwYWNrcyBlYXJsaWVyIHRoYW4gRlAxNS4gRlAxNSBhbmQgbGF0ZXIgYW5kCi0JCSAgICAgKiB0aGUgbmV3IFdhcnAgNC41MSBhbmQgV2FycCBTZXJ2ZXIgY29udmVuaWVuY2UgcGFja3Mgc2hvdWxkIHdvcmsKLQkJICAgICAqIGZpbmUgd2l0aCB0aGUga2VybmVsIG1pbmktVkRNLgotCQkgICAgICoKLQkJICAgICAqIEFsc28gdGhlIGZ1bGwgVkRNIGlzIHRoZSBvbmx5IHNvbHV0aW9uIGZvciByZWFsbHkgb2xkIGtlcm5lbHMKLQkJICAgICAqIChidXQgR1JBREQgd29uJ3QgcnVuIG9uIHRoZW0gc28gdGhpcyBpcyBzdXBlcmZsdW91cyA7LSkuCi0JCSAgICAgKi8KLQkJICAgIElOSVRWRE0gSW5pdFZETSA9IHtWRE1fSU5JVElBTElaRSxOVUxMLE5VTEx9OwotCQkgICAgUE1fVklERU9QTUkzMlJlcXVlc3QoJkFkYXB0ZXIsUE1JUkVRVUVTVF9TT0ZUV0FSRUlOVCwmSW5pdFZETSxOVUxMKTsKLQkJICAgIGhhdmVJbnQxMCA9IHRydWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBBIEdSQUREIGRyaXZlciBpc24ndCBsb2FkZWQsIGhlbmNlIHdlIGNhbid0IHVzZSBWSURFT1BNSS4gQnV0IHdlIHdpbGwgdHJ5Ci0JICAgICAqIHRvIGFjY2VzcyB0aGUgbWluaS1WRE0gZGlyZWN0bHksIGZpcnN0IHZlcmlmeWluZyB0aGF0IHRoZSBzdXBwb3J0IGlzCi0JICAgICAqIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsIChpdCBzaG91bGQgYmUgZm9yIGtlcm5lbHMgdGhhdCBzdXBwb3J0IEdSQUREKS4KLQkgICAgICogVGhpcyBtYXkgYmUgbmVlZGVkIGluIGEgY29tbWFuZCBsaW5lIGJvb3Qgb3IgaWYgbm9uLUdSQUREIGRyaXZlciBpcwotCSAgICAgKiB1c2VkIChNYXRyb3ggb3IgY2xhc3NpYyBWR0EpLgotCSAgICAgKiBOb3RlOiBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggbWluaS1WRE0gc3VwcG9ydCBpbiB0aGUga2VybmVsLCB3ZSBoYXZlIHRvCi0JICAgICAqIHNwYXduIGEgZGFlbW9uIHByb2Nlc3MgdGhhdCB3aWxsIGRvIHRoZSBhY3R1YWwgbWluaS1WRE0gYWNjZXNzIGZvciB1cy4KLQkgICAgICovCi0JICAgICAvKiBUcnkgdG8gb3BlbiBzaGFyZWQgc2VtYXBob3JlIHRvIHNlZSBpZiBvdXIgZGFlbW9uIGlzIGFscmVhZHkgdXAgKi8KLQkgICAgaWYgKERvc09wZW5FdmVudFNlbShTSEFSRURTRU0sICZoZXZEYWVtb24pID09IE5PX0VSUk9SKSB7Ci0JCWlmIChEb3NXYWl0RXZlbnRTZW0oaGV2RGFlbW9uLCAxKSA9PSBOT19FUlJPUikgewotCQkgICAgLyogSWYgc2VtYXBob3JlIGlzIHBvc3RlZCwgYWxsIGlzIHdlbGwgKi8KLQkJICAgIHVzZVZQTUkgICA9IGZhbHNlOwotCQkgICAgaGF2ZUludDEwID0gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCSAgICBlbHNlIHsKLQkJLyogQ3JlYXRlIHNoYXJlZCBldmVudCBzZW1hcGhvcmUgKi8KLQkJaWYgKERvc0NyZWF0ZUV2ZW50U2VtKFNIQVJFRFNFTSwgJmhldkRhZW1vbiwgRENfU0VNX1NIQVJFRCwgRkFMU0UpID09IE5PX0VSUk9SKSB7Ci0JCSAgICBQTV9maW5kQlBEKERBRU1PTl9OQU1FLCBwYXRoKTsKLQkJICAgIHN0cmNhdChwYXRoLCBEQUVNT05fTkFNRSk7Ci0JCSAgICBpZiAoRG9zRXhlY1BnbShidWYsIHNpemVvZihidWYpLCBFWEVDX0JBQ0tHUk9VTkQsIChQU1opREFFTU9OX05BTUUsCi0JCQlOVUxMLCAmcmVzQ29kZXMsIChQU1opcGF0aCkgPT0gTk9fRVJST1IpIHsKLQkJCS8qIFRoZSBkYWVtb24gd2FzIHN1Y2Nlc3NmdWxseSBzcGF3bmVkLCBub3cgZ2l2ZSBpdCBhIHNlYyB0byBjb21lIHVwICovCi0JCQlpZiAoRG9zV2FpdEV2ZW50U2VtKGhldkRhZW1vbiwgMjAwMCkgPT0gTk9fRVJST1IpIHsKLQkJCSAgICAvKiBJdCdzIHVwISAqLwotCQkJICAgIHVzZVZQTUkgICA9IGZhbHNlOwotCQkJICAgIGhhdmVJbnQxMCA9IHRydWU7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGhhdmVJbnQxMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XZSAicHJvYmFibHkiIGhhdmUgQklPUyBhY2Nlc3MgdW5kZXIgT1MvMiBidXQgd2UgaGF2ZSB0byB2ZXJpZnkvaW5pdGlhbGl6ZSBpdAotZmlyc3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsKLSAgICByZXR1cm4gSW5pdEludDEwKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgaWRlbnRpZmllci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQotewotICAgIHJldHVybiBfT1NfT1MyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNXzM4NjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goCi0gICAgY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXBvcnQgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gYW5kIGhhbHQgdGhlIHByb2dyYW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKAotICAgIGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICAvKiBCZSBwcmVwYXJlIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseSAoZmFpbGVkIHRvIGZhaWwgc2l0dWF0aW9uIDotKSAqLwotICAgIHN0YXRpYyBpbnQgZmF0YWxFcnJvckNvdW50ID0gMDsKLSAgICBpZiAoZmF0YWxFcnJvckNvdW50KysgPT0gMCkgewotCWlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQkgICAgZmF0YWxFcnJvckNsZWFudXAoKTsKLQl9Ci0gICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOwotICAgIGV4aXQoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgdGhlIHJlYWwgbW9kZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBCSU9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgaWYgKCFWRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoVkVTQUJ1Zl9wdHIgPSBQTV9hbGxvY1JlYWxTZWcoVkVTQUJ1Zl9sZW4sICZWRVNBQnVmX3JzZWcsICZWRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgKmxlbiA9IFZFU0FCdWZfbGVuOwotICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOwotICAgIHJldHVybiBWRVNBQnVmX3B0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVjayBpZiBhIGtleSBoYXMgYmVlbiBwcmVzc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIEtCREtFWUlORk8gICBrZXk7ICAgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgICAgKi8KLQotICAgIEtiZFBlZWsoJmtleSwgMCk7Ci0gICAgcmV0dXJuIChrZXkuZmJTdGF0dXMgJiBLQkRUUkZfRklOQUxfQ0hBUl9JTik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICBLQkRLRVlJTkZPICAga2V5OyAgICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICAgICovCi0KLSAgICBLYmRDaGFySW4oJmtleSxJT19XQUlULDApOwotICAgIHJldHVybiBrZXkuY2hDaGFyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW4gYSBmdWxsc2NyZWVuIGNvbnNvbGUgZm9yIG91dHB1dCB0byB0aGUgc2NyZWVuLiBUaGlzIHJlcXVpcmVzIHRoYXQKLXRoZSBhcHBsaWNhdGlvbiBiZSBhIGZ1bGxzY3JlZW4gVklPIHByb2dyYW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRVc2VyLAotICAgIGludCBkZXZpY2UsCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMsCi0gICAgaW50IGJwcCwKLSAgICBpYm9vbCBmdWxsU2NyZWVuKQotewotICAgICh2b2lkKWh3bmRVc2VyOwotICAgICh2b2lkKWRldmljZTsKLSAgICAodm9pZCl4UmVzOwotICAgICh2b2lkKXlSZXM7Ci0gICAgKHZvaWQpYnBwOwotICAgICh2b2lkKWZ1bGxTY3JlZW47Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgc2l6ZSBvZiB0aGUgY29uc29sZSBzdGF0ZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICBWSU9NT0RFSU5GTyB2bWk7Ci0gICAgdm1pLmNiID0gc2l6ZW9mIChWSU9NT0RFSU5GTyk7Ci0gICAgVmlvR2V0TW9kZSAoJnZtaSwgKEhWSU8pMCk7Ci0gICAgcmV0dXJuIHNpemVvZiAoQ09OU09MRV9TQVZFKSAtIDEgKyB2bWkuY29sICogdm1pLnJvdyAqIDI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKAotICAgIHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgVVNIT1JUICAgICAgICAgIGZibGVuOwotICAgIENPTlNPTEVfU0FWRSAgICAqY3MgPSAoQ09OU09MRV9TQVZFKilzdGF0ZUJ1ZjsKLSAgICBWSU9NT0RFSU5GTyAgICAgdm1pOwotCi0gICAgLyogVGhlIHJlYXNvbiBmb3IgdGhlIFZJT01PREVJTkZPIGp1Z2dsaW5nIGlzIDE2LWJpdCBjb2RlLiBCZWNhdXNlIHRoZSB1c2VyCi0gICAgICogYWxsb2NhdGVzIHRoZSBzdGF0ZSBidWZmZXIsIGNkLT52bWkgbWlnaHQgYmUgY3Jvc3NpbmcgdGhlIDY0SyBib3VuZGFyeSBhbmQKLSAgICAgKiB0aGUgMTYtYml0IEFQSSB3b3VsZCBmYWlsLiBJZiB3ZSBjcmVhdGUgYW5vdGhlciBjb3B5IG9uIHN0YWNrLCB0aGUgY29tcGlsZXIKLSAgICAgKiBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIDY0SyBib3VuZGFyeSB3aWxsIG5vdCBiZSBjcm9zc2VkIChpdCBhZGp1c3RzIHRoZSBzdGFjawotICAgICAqIGlmIGl0IHNob3VsZCBjcm9zcykuCi0gICAgICovCi0gICAgdm1pLmNiID0gc2l6ZW9mKFZJT01PREVJTkZPKTsKLSAgICBWaW9HZXRNb2RlKCZ2bWksKEhWSU8pMCk7Ci0gICAgbWVtY3B5KCZjcy0+dm1pLCAmdm1pLCBzaXplb2YoVklPTU9ERUlORk8pKTsKLSAgICBWaW9HZXRDdXJQb3MoJmNzLT5DdXJzb3JZLCAmY3MtPkN1cnNvclgsIChIVklPKTApOwotICAgIGZibGVuID0gY3MtPnZtaS5jb2wgKiBjcy0+dm1pLnJvdyAqIDI7Ci0gICAgVmlvUmVhZENlbGxTdHIoKFBDSCljcy0+RnJhbWVCdWZmZXIsICZmYmxlbiwgMCwgMCwgKEhWSU8pMCk7Ci19Ci0KLS8qIEdsb2JhbCB2YXJpYWJsZSB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRocmVhZHMgKi8KLXN0YXRpYyBTRVNXSVRDSFJFQyBTZXNTd2l0Y2hSZWMgPSB7IC0xIH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbGVkIGJ5IGV4dGVybmFsIHJvdXRpbmVzIGF0IGxlYXN0IG9uY2UgcGVyIGZyYW1lIHRvIGNoZWNrIHdoZW5ldmVyIGEKLXNlc3Npb24gc2F2ZS9yZXN0b3JlIHNob3VsZCBiZSBwZXJmb3JtZWQuIFNpbmNlIHdlIHJlY2VpdmUgc3VjaCBub3RpZmljYXRpb25zCi1hc3luY3Jvbm91c2x5LCB3ZSBjYW4ndCBwZXJmb3JtIGFsbCByZXF1aXJlZCBvcGVyYXRpb25zIGF0IHRoYXQgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fUE1fY2hlY2tDb25zb2xlU3dpdGNoKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIEZsYWdzLCBNb2RlOwotICAgIFBNX3NhdmVTdGF0ZV9jYiBDYWxsYmFjazsKLQotICAgIC8qIFF1aWNrIG9wdGltaXplZCBwYXRoIGZvciBtb3N0IGNvbW1vbiBjYXNlICovCi0gICAgaWYgKFNlc1N3aXRjaFJlYy5GbGFncyA9PSAtMSkKLQlyZXR1cm47Ci0KLWFnYWluOgotICAgIGlmIChEb3NSZXF1ZXN0TXV0ZXhTZW0oU2VzU3dpdGNoUmVjLk11dGV4LCAxMDApKQotCXJldHVybjsKLSAgICBGbGFncyA9IFNlc1N3aXRjaFJlYy5GbGFnczsKLSAgICBDYWxsYmFjayA9IFNlc1N3aXRjaFJlYy5DYWxsYmFjazsKLSAgICBTZXNTd2l0Y2hSZWMuRmxhZ3MgPSAtMTsKLSAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oU2VzU3dpdGNoUmVjLk11dGV4KTsKLQotICAgIGlzU2Vzc2lvblN3aXRjaGluZyA9IHRydWU7ICAgICAgICAgICAgLyogUHJldmVudCBWSU8gY2FsbHMgKi8KLSAgICBNb2RlID0gQ2FsbGJhY2soRmxhZ3MpOwotICAgIGlzU2Vzc2lvblN3aXRjaGluZyA9IGZhbHNlOwotICAgIERvc1Bvc3RFdmVudFNlbShTZXNTd2l0Y2hSZWMuRXZlbnQpOwotICAgIGlmIChGbGFncyA9PSBQTV9ERUFDVElWQVRFICYmIE1vZGUgPT0gUE1fU1VTUEVORF9BUFApCi0JLyogU3VzcGVuZCBhcHBsaWNhdGlvbiB1bnRpbCB3ZSBzd2l0Y2ggYmFjayB0byBvdXIgYXBwbGljYXRpb24gKi8KLQlmb3IgKDs7KSB7Ci0JICAgIERvc1NsZWVwICg1MDApOwotCSAgICAvKiBTZXNTd2l0Y2hSZWMuRmxhZ3MgaXMgdm9sYXRpbGUgc28gb3B0aW1pemVyCi0JICAgICAqIHdvbid0IGxvYWQgaXQgaW50byBhIHJlZ2lzdGVyCi0JICAgICAqLwotCSAgICBpZiAoU2VzU3dpdGNoUmVjLkZsYWdzICE9IC0xKQotCQlnb3RvIGFnYWluOwotCSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2FpdHMgdW50aWwgbWFpbiB0aHJlYWQgcHJvY2Vzc2VzIHRoZSBzZXNzaW9uIHN3aXRjaCBldmVudC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfUE1fU2Vzc2lvblN3aXRjaEV2ZW50KAotICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUsCi0gICAgaW50IGZsYWdzKQotewotICAgIFVMT05HIENvdW50OwotCi0gICAgaWYgKERvc1JlcXVlc3RNdXRleFNlbShTZXNTd2l0Y2hSZWMuTXV0ZXgsIDEwMDAwKSkKLQlyZXR1cm47Ci0KLSAgICAvKiBXZSdyZSBnb2luZyB0byB3YWl0IG9uIHRoYXQgc2VtYXBob3JlICovCi0gICAgRG9zUmVzZXRFdmVudFNlbShTZXNTd2l0Y2hSZWMuRXZlbnQsICZDb3VudCk7Ci0gICAgU2VzU3dpdGNoUmVjLkNhbGxiYWNrID0gc2F2ZVN0YXRlOwotICAgIFNlc1N3aXRjaFJlYy5GbGFncyA9IGZsYWdzOwotICAgIERvc1JlbGVhc2VNdXRleFNlbShTZXNTd2l0Y2hSZWMuTXV0ZXgpOwotCi0gICAgLyogTm93IHdhaXQgdW50aWwgYWxsIHJlcXVpcmVkIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlICovCi0gICAgRG9zV2FpdEV2ZW50U2VtIChTZXNTd2l0Y2hSZWMuRXZlbnQsIDEwMDAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGlzIHRoZSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIHN3aXRjaGVzIGJhY2sgdG8gb3VyCi1mdWxsc2NyZWVuIHNlc3Npb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX1BNX0NvbnNvbGVTd2l0Y2goCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICBVU0hPUlQgTm90aWZ5VHlwZTsKLQotICAgIGZvciAoOzspIHsKLQlpZiAoVmlvTW9kZVdhaXQoVk1XUl9QT1BVUCwgJk5vdGlmeVR5cGUsIDApICE9IDApCi0JICAgIGJyZWFrOwotCV9QTV9TZXNzaW9uU3dpdGNoRXZlbnQoc2F2ZVN0YXRlLCBQTV9SRUFDVElWQVRFKTsKLQl9Ci0gICAgVmlvTW9kZVVuZG8oVU5ET0lfUkVMRUFTRU9XTkVSLCBVTkRPS19FUlJPUkNPREUsIChIVklPKTApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgaXMgdGhlIHRocmVhZCByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgc2NyZWVuIHBvcHVwcyAodXN1YWxseSBmYXRhbAotZXJyb3IgaGFuZGxlciB1c2VzIHRoZW0pLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9QTV9Db25zb2xlUG9wdXAoCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICBVU0hPUlQgTm90aWZ5VHlwZTsKLSAgICBmb3IgKDs7KSB7Ci0JaWYgKFZpb1NhdlJlZHJhd1dhaXQoVlNSV0lfU0FWRUFORFJFRFJBVywgJk5vdGlmeVR5cGUsIDApICE9IDApCi0JICAgIGJyZWFrOwotCWlmIChOb3RpZnlUeXBlID09IFZTUldOX1NBVkUpCi0JICAgIF9QTV9TZXNzaW9uU3dpdGNoRXZlbnQoc2F2ZVN0YXRlLCBQTV9ERUFDVElWQVRFKTsKLQllbHNlIGlmIChOb3RpZnlUeXBlID09IFZTUldOX1JFRFJBVykKLQkgICAgX1BNX1Nlc3Npb25Td2l0Y2hFdmVudChzYXZlU3RhdGUsIFBNX1JFQUNUSVZBVEUpOwotCX0KLSAgICBWaW9TYXZSZWRyYXdVbmRvKFVORE9JX1JFTEVBU0VPV05FUiwgVU5ET0tfRVJST1JDT0RFLCAoSFZJTykwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgZm9yIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICAvKiBJZiBQTSBpc24ndCBsb2FkZWQsIHRoaXMgc3R1ZmYgd2lsbCBjYXVzZSBjcmFzaGVzISAqLwotICAgIGlmIChfX2lzU2hlbGxMb2FkZWQoKSkgewotCWlmIChzYXZlU3RhdGUpIHsKLQkgICAgLyogQ3JlYXRlIHRoZSB0aHJlYWRzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBjb25zb2xlIHN3aXRjaGVzICovCi0JICAgIFNlc1N3aXRjaFJlYy5GbGFncyA9IC0xOwotCSAgICBEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAmU2VzU3dpdGNoUmVjLk11dGV4LCAwLCBGQUxTRSk7Ci0JICAgIERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICZTZXNTd2l0Y2hSZWMuRXZlbnQsIDAsIEZBTFNFKTsKLQkgICAgX2JlZ2ludGhyZWFkICgodm9pZCgqKSh2b2lkKikpX1BNX0NvbnNvbGVTd2l0Y2gsTlVMTCxTRVNTSU9OX1NXSVRDSF9TVEFDS19TSVpFLCAodm9pZCopc2F2ZVN0YXRlKTsKLQkgICAgX2JlZ2ludGhyZWFkICgodm9pZCgqKSh2b2lkKikpX1BNX0NvbnNvbGVQb3B1cCxOVUxMLFNFU1NJT05fU1dJVENIX1NUQUNLX1NJWkUsICh2b2lkKilzYXZlU3RhdGUpOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIC8qIEtpbGwgdGhlIHRocmVhZHMgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGNvbnNvbGUgc3dpdGNoZXMgKi8KLQkgICAgVmlvTW9kZVVuZG8oVU5ET0lfUkVMRUFTRU9XTkVSLCBVTkRPS19URVJNSU5BVEUsIChIVklPKTApOwotCSAgICBWaW9TYXZSZWRyYXdVbmRvKFVORE9JX1JFTEVBU0VPV05FUiwgVU5ET0tfVEVSTUlOQVRFLCAoSFZJTykwKTsKLQkgICAgRG9zQ2xvc2VFdmVudFNlbShTZXNTd2l0Y2hSZWMuRXZlbnQpOwotCSAgICBEb3NDbG9zZU11dGV4U2VtKFNlc1N3aXRjaFJlYy5NdXRleCk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgY29uc29sZSBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoCi0gICAgY29uc3Qgdm9pZCAqc3RhdGVCdWYsCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICBDT05TT0xFX1NBVkUgKmNzID0gKENPTlNPTEVfU0FWRSAqKXN0YXRlQnVmOwotICAgIFZJT01PREVJTkZPICB2bWk7Ci0KLSAgICBpZiAoIWNzKQotCXJldHVybjsKLQotICAgIG1lbWNweSgmdm1pLCAmY3MtPnZtaSwgc2l6ZW9mIChWSU9NT0RFSU5GTykpOwotICAgIFZpb1NldE1vZGUoJnZtaSwgKEhWSU8pMCk7Ci0gICAgVmlvU2V0Q3VyUG9zKGNzLT5DdXJzb3JZLCBjcy0+Q3Vyc29yWCwgKEhWSU8pMCk7Ci0gICAgVmlvV3J0Q2VsbFN0cigoUENIKWNzLT5GcmFtZUJ1ZmZlciwgY3MtPnZtaS5jb2wgKiBjcy0+dm1pLnJvdyAqIDIsMCwgMCwgKEhWSU8pMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2xvc2UgdGhlIGZ1bGxzY3JlZW4gY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIEtpbGwgdGhlIHRocmVhZHMgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGNvbnNvbGUgc3dpdGNoZXMgKi8KLSAgICBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soTlVMTCk7Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIC8qIElmIHNlc3Npb24gc3dpdGNoIGlzIGluIHByb2dyZXNzLCBjYWxsaW5nIGludG8gVklPIGNhdXNlcyBkZWFkbG9ja3MhICovCi0gICAgLyogQWxzbyB0aGlzIGNhbGwgdG8gVklPIHNjcmV3cyB1cCBvdXIgY29uc29sZSBsaWJyYXJ5IG9uIERCQ1MgYm94ZXMuLi4gKi8KLSAgICBpZiAoIWlzU2Vzc2lvblN3aXRjaGluZyAmJiAhX19Jc0RCQ1NTeXN0ZW0oKSkKLQlWaW9TZXRDdXJQb3MoeSx4LDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gaGVyZSAqLwotICAgICh2b2lkKXdpZHRoOwotICAgICh2b2lkKWhlaWdodDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyICh1c2VkIGZvciBzb2Z0d2FyZSBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKAotICAgIFBNX2ludEhhbmRsZXIgaWgsCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZClpaDsKLSAgICAodm9pZClmcmVxdWVuY3k7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGZyZXF1ZW5jeSAoZm9yIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpZnJlcXVlbmN5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gcGF0aCBvciB3b3JraW5nIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgZHJpdmUgbGV0dGVyIGZvciB0aGUgYm9vdCBkcml2ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQotewotICAgIHVsb25nICAgYm9vdCA9IDM7Ci0gICAgRG9zUXVlcnlTeXNJbmZvKFFTVl9CT09UX0RSSVZFLFFTVl9CT09UX0RSSVZFLCZib290LHNpemVvZihib290KSk7Ci0gICAgcmV0dXJuIChjaGFyKSgnYScgKyBib290IC0gMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBWQkUvQUYgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoW0NDSE1BWFBBVEhdOwotICAgIHN0cmNweShwYXRoLCJ4OlxcIik7Ci0gICAgcGF0aFswXSA9IFBNX2dldEJvb3REcml2ZSgpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFtDQ0hNQVhQQVRIXTsKLSAgICBpZiAoZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKSAhPSBOVUxMKQotCXJldHVybiBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOwotICAgIHN0cmNweShwYXRoLCJ4Olxcb3MyXFxkcml2ZXJzIik7Ci0gICAgcGF0aFswXSA9IFBNX2dldEJvb3REcml2ZSgpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwibnVjbGV1cyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBjb25maWd1cmF0aW9uIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbQ0NITUFYUEFUSF07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1hY2hpbmUgaWYgcG9zc2libGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2V0IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHRoZSBuZXR3b3JrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIG5hbWVbNDBdLCplbnY7Ci0KLSAgICBpZiAoKGVudiA9IGdldGVudigiSE9TVE5BTUUiKSkgIT0gTlVMTCkgewotCXN0cm5jcHkobmFtZSxlbnYsc2l6ZW9mKG5hbWUpKTsKLQluYW1lW3NpemVvZihuYW1lKS0xXSA9IDA7Ci0JcmV0dXJuIG5hbWU7Ci0JfQotICAgIHJldHVybiAiT1MyIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWFsIG1vZGUgQklPUyBkYXRhIGFyZWEuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIHJldHVybiBsb3dNZW0gKyAweDQwMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIDB4QTAwMDAgcGh5c2ljYWwgVkdBIGdyYXBoaWNzIGZyYW1lYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgcmV0dXJuIGxvd01lbSArIDB4QTAwMDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIHVsb25nICAgYmFzZUFkZHIsYmFzZU9mcyxsaW5lYXI7Ci0KLSAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKLSAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIG1tYXAuIElmIHdlIHJvdW5kIHRoZQotICAgICAqIHBoeXNpY2FsIGFkZHJlc3MsIHRoZW4gd2UgYWxzbyBhZGQgYW4gZXh0cmEgb2Zmc2V0IGludG8gdGhlIGFkZHJlc3MKLSAgICAgKiB0aGF0IHdlIHJldHVybi4KLSAgICAgKi8KLSAgICBiYXNlT2ZzID0gYmFzZSAmIDQwOTU7Ci0gICAgYmFzZUFkZHIgPSBiYXNlICYgfjQwOTU7Ci0gICAgbGltaXQgPSAoKGxpbWl0K2Jhc2VPZnMrMSs0MDk1KSAmIH40MDk1KS0xOwotICAgIHBhcm1zSW5bMF0gPSBiYXNlQWRkcjsKLSAgICBwYXJtc0luWzFdID0gbGltaXQ7Ci0gICAgcGFybXNJblsyXSA9IGlzQ2FjaGVkOwotICAgIGlmICgobGluZWFyID0gQ2FsbFNEREhlbHAoUE1IRUxQX01BUFBIWVMpKSA9PSAwKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiAodm9pZCopKGxpbmVhciArIGJhc2VPZnMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcHRyLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcHRyOwotICAgIHBhcm1zSW5bMV0gPSBsaW1pdDsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfRlJFRVBIWVMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcDsKLSAgICByZXR1cm4gQ2FsbFNEREhlbHAoUE1IRUxQX0dFVFBIWVNJQ0FMQUREUik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcDsKLSAgICBwYXJtc0luWzFdID0gKHVsb25nKWxlbmd0aDsKLSAgICBwYXJtc0luWzJdID0gKHVsb25nKXBoeXNBZGRyZXNzOwotICAgIHJldHVybiBDYWxsU0RESGVscChQTUhFTFBfR0VUUEhZU0lDQUxBRERSUkFOR0UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zbGVlcCgKLSAgICB1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgRG9zU2xlZXAobWlsbGlzZWNvbmRzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgQ09NIHBvcnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoCi0gICAgaW50IHBvcnQpCi17Ci0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYmFzZSBJL08gcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBMUFQgcG9ydC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydCgKLSAgICBpbnQgcG9ydCkKLXsKLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LiBGb3IgV2luOXggd2UgYWxsb2NhdGUgc2hhcmVkIG1lbW9yeQotYXMgbG9ja2VkLCBnbG9iYWwgbWVtb3J5IHRoYXQgaXMgYWNjZXNzaWJsZSBmcm9tIGFueSBtZW1vcnkgY29udGV4dAotKGluY2x1ZGluZyBpbnRlcnJ1cHQgdGltZSBjb250ZXh0KSwgd2hpY2ggYWxsb3dzIHVzIHRvIGxvYWQgb3VyIGltcG9ydGFudAotZGF0YSBzdHJ1Y3R1cmUgYW5kIGNvZGUgc3VjaCB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkgZnJvbSBhIHJpbmcKLTAgaW50ZXJydXB0IGNvbnRleHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZCgKLSAgICBsb25nIHNpemUpCi17Ci0gICAgcGFybXNJblswXSA9IHNpemU7Ci0gICAgcmV0dXJuICh2b2lkKilDYWxsU0RESGVscChQTUhFTFBfTUFMTE9DU0hBUkVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQoCi0gICAgdm9pZCAqcHRyKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcHRyOwotICAgIENhbGxTRERIZWxwKFBNSEVMUF9GUkVFU0hBUkVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgdG8gdGhlIGNhbGxpbmcgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiBUaGUKLWFkZHJlc3Mgd2lsbCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIGFub3RoZXIgcHJvY2VzcyB1c2luZyB0aGUKLVBNX21hcFBoeXNpY2FsQWRkciBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAotICAgIHZvaWQgKmJhc2UsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgdWxvbmcgICBiYXNlQWRkcixiYXNlT2ZzOwotCi0gICAgLyogUm91bmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSA0S2IgYm91bmRhcnkgYW5kIHRoZSBsaW1pdCB0byBhCi0gICAgICogNEtiLTEgYm91bmRhcnkgYmVmb3JlIHBhc3NpbmcgdGhlIHZhbHVlcyB0byBtbWFwLiBJZiB3ZSByb3VuZCB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCi0gICAgICogdGhhdCB3ZSByZXR1cm4uCi0gICAgICovCi0gICAgYmFzZU9mcyA9ICh1bG9uZyliYXNlICYgNDA5NTsKLSAgICBiYXNlQWRkciA9ICh1bG9uZyliYXNlICYgfjQwOTU7Ci0gICAgbGltaXQgPSAoKGxpbWl0K2Jhc2VPZnMrMSs0MDk1KSAmIH40MDk1KS0xOwotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpYmFzZUFkZHI7Ci0gICAgcGFybXNJblsxXSA9IGxpbWl0OwotICAgIHJldHVybiAodm9pZCopKENhbGxTRERIZWxwKFBNSEVMUF9NQVBUT1BST0NFU1MpK2Jhc2VPZnMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHJlYWwgbW9kZSBwb2ludGVyIHRvIGEgcHJvdGVjdGVkIG1vZGUgcG9pbnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCi0gICAgdWludCByX3NlZywKLSAgICB1aW50IHJfb2ZmKQotewotICAgIGlmIChyX3NlZyA9PSAweEZGRkYpCi0JcmV0dXJuICZSTUJ1ZltyX29mZl07Ci0gICAgcmV0dXJuIGxvd01lbSArIE1LX1BIWVMocl9zZWcscl9vZmYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCi0gICAgdWludCBzaXplLAotICAgIHVpbnQgKnJfc2VnLAotICAgIHVpbnQgKnJfb2ZmKQotewotICAgIGlmIChzaXplID4gc2l6ZW9mKFJNQnVmKSkKLQlyZXR1cm4gTlVMTDsKLSAgICAqcl9zZWcgPSAweEZGRkY7Ci0gICAgKnJfb2ZmID0gMHgwMDAwOwotICAgIHJldHVybiAmUk1CdWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZygKLSAgICB2b2lkICptZW0pCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBpbiBoZXJlICovCi0gICAgKHZvaWQpbWVtOwotfQotCi0jZGVmaW5lIElORFBNSShyZWcpICAgICBybXJlZ3MuYUNSRi5yZWdfIyNyZWcgPSByZWdzLT5yZWcKLSNkZWZpbmUgT1VURFBNSShyZWcpICAgIHJlZ3MtPnJlZyA9IHJtcmVncy5hQ1JGLnJlZ18jI3JlZwotCi0jZGVmaW5lIFJFR19PRkZTRVQoZmllbGQpICAoKChVTE9ORykmKCgoVkNSRiopMCktPmZpZWxkKSkgIC8gc2l6ZW9mKFVMT05HKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIERQTUlfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIERQTUlfcmVncyAqcmVncykKLXsKLSAgICBJTlRDUkYgIHJtcmVnczsKLSAgICB1bG9uZyAgIGVheCA9IDA7Ci0KLSAgICBpZiAoIUluaXRJbnQxMCgpKQotCXJldHVybjsKLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIHJtcmVncy51bEJJT1NJbnRObyA9IGludG5vOwotICAgIElORFBNSShlYXgpOyBJTkRQTUkoZWJ4KTsgSU5EUE1JKGVjeCk7IElORFBNSShlZHgpOyBJTkRQTUkoZXNpKTsgSU5EUE1JKGVkaSk7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2RzID0gcmVncy0+ZHM7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VzID0gcmVncy0+ZXM7Ci0gICAgaWYgKGludG5vID09IDB4MTApIHsKLQllYXggPSBybXJlZ3MuYUNSRi5yZWdfZWF4OwotCXN3aXRjaCAoZWF4ICYgMHhGRkZGKSB7Ci0JICAgIGNhc2UgMHg0RjAwOgotCQkvKiBXZSBoYXZlIHRvIGhhY2sgdGhlIHdheSB0aGlzIGZ1bmN0aW9uIHdvcmtzLCBkdWUgdG8KLQkJICogc29tZSBidWdzIGluIHRoZSBJQk0gbWluaS1WRE0gQklPUyBzdXBwb3J0LiBTcGVjaWZpY2FsbHkKLQkJICogd2UgbmVlZCB0byBtYWtlIHRoZSBpbnB1dCBidWZmZXIgYW5kIG91dHB1dCBidWZmZXIgdGhlCi0JCSAqICdzYW1lJyBidWZmZXIsIGFuZCB0aGF0IEVTOlNJIHBvaW50cyB0byB0aGUgb3V0cHV0Ci0JCSAqIGJ1ZmZlciAoaWdub3JlZCBieSB0aGUgQklPUykuIFRoZSBkYXRhIHdpbGwgZW5kIHVwCi0JCSAqIGJlaW5nIHJldHVybmVkIGluIHRoZSBpbnB1dCBidWZmZXIsIGV4Y2VwdCBmb3IgdGhlCi0JCSAqIGZpcnN0IGZvdXIgYnl0ZXMgKCdWRVNBJykgdGhhdCB3aWxsIG5vdCBiZSByZXR1cm5lZC4KLQkJICovCi0JCXJtcmVncy5wQlswXS5iQnVmZmVyVHlwZSA9IElOUFVUX0JVRkZFUjsKLQkJcm1yZWdzLnBCWzBdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7Ci0JCXJtcmVncy5wQlswXS5iT2ZmQ1JGID0gUkVHX09GRlNFVChyZWdfZWRpKTsKLQkJcm1yZWdzLnBCWzBdLnBBZGRyZXNzID0gUk1CdWY7Ci0JCXJtcmVncy5wQlswXS51bFNpemUgPSA0OwotCQlybXJlZ3MucEJbMV0uYkJ1ZmZlclR5cGUgPSBPVVRQVVRfQlVGRkVSOwotCQlybXJlZ3MucEJbMV0uYlNlbENSRiA9IFJFR19PRkZTRVQocmVnX2VzKTsKLQkJcm1yZWdzLnBCWzFdLmJPZmZDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lc2kpOwotCQlybXJlZ3MucEJbMV0ucEFkZHJlc3MgPSAoKFBCWVRFKVJNQnVmKSs0OwotCQlybXJlZ3MucEJbMV0udWxTaXplID0gNTEyLTQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDB4NEYwMToKLQkJcm1yZWdzLnBCWzBdLmJCdWZmZXJUeXBlID0gT1VUUFVUX0JVRkZFUjsKLQkJcm1yZWdzLnBCWzBdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7Ci0JCXJtcmVncy5wQlswXS5iT2ZmQ1JGID0gUkVHX09GRlNFVChyZWdfZWRpKTsKLQkJcm1yZWdzLnBCWzBdLnBBZGRyZXNzID0gUk1CdWY7Ci0JCXJtcmVncy5wQlswXS51bFNpemUgPSAyNTY7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDB4NEYwMjoKLQkJcm1yZWdzLnBCWzBdLmJCdWZmZXJUeXBlID0gSU5QVVRfQlVGRkVSOwotCQlybXJlZ3MucEJbMF0uYlNlbENSRiA9IFJFR19PRkZTRVQocmVnX2VzKTsKLQkJcm1yZWdzLnBCWzBdLmJPZmZDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lZGkpOwotCQlybXJlZ3MucEJbMF0ucEFkZHJlc3MgPSBSTUJ1ZjsKLQkJcm1yZWdzLnBCWzBdLnVsU2l6ZSA9IDI1NjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMHg0RjA5OgotCQlybXJlZ3MucEJbMF0uYkJ1ZmZlclR5cGUgPSBJTlBVVF9CVUZGRVI7Ci0JCXJtcmVncy5wQlswXS5iU2VsQ1JGID0gUkVHX09GRlNFVChyZWdfZXMpOwotCQlybXJlZ3MucEJbMF0uYk9mZkNSRiA9IFJFR19PRkZTRVQocmVnX2VkaSk7Ci0JCXJtcmVncy5wQlswXS5wQWRkcmVzcyA9IFJNQnVmOwotCQlybXJlZ3MucEJbMF0udWxTaXplID0gMTAyNDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMHg0RjBBOgotCQkvKiBEdWUgdG8gYnVncyBpbiB0aGUgbWluaS1WRE0gaW4gT1MvMiwgdGhlIDB4NEYwQSBwcm90ZWN0ZWQKLQkJICogbW9kZSBpbnRlcmZhY2UgZnVuY3Rpb25zIHdpbGwgbm90IHdvcmsgKHdlIG5ldmVyIGdldCBhbnkKLQkJICogc2VsZWN0b3JzIHJldHVybmVkKSwgc28gd2UgZmFpbCB0aGlzIGZ1bmN0aW9uIGhlcmUuIFRoZQotCQkgKiByZXN0IG9mIHRoZSBWQkUvQ29yZSBkcml2ZXIgd2lsbCB3b3JrIHByb3Blcmx5IGlmIHRoaXMKLQkJICogZnVuY3Rpb24gaXMgZmFpbGVkLCBiZWNhdXNlIHRoZSBWQkUgMi4wIGFuZCAzLjAgc3BlY3MKLQkJICogYWxsb3cgZm9yIHRoaXMuCi0JCSAqLwotCQlyZWdzLT5lYXggPSAweDAxNEY7Ci0JCXJldHVybjsKLQkgICAgfQotCX0KLSAgICBpZiAodXNlVlBNSSkKLQlQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX1NPRlRXQVJFSU5ULE5VTEwsJnJtcmVncyk7Ci0gICAgZWxzZSB7Ci0JRG9zU3lzQ3RsKDYsICZybXJlZ3MpOwotCX0KLQotICAgIE9VVERQTUkoZWF4KTsgT1VURFBNSShlYngpOyBPVVREUE1JKGVjeCk7IE9VVERQTUkoZWR4KTsgT1VURFBNSShlc2kpOyBPVVREUE1JKGVkaSk7Ci0gICAgaWYgKCgocmVncy0+ZWF4ICYgMHhGRkZGKSA9PSAweDAwNEYpICYmICgoZWF4ICYgMHhGRkZGKSA9PSAweDRGMDApKSB7Ci0JLyogSGFjayB0byBmaXggdXAgdGhlIG1pc3NpbmcgJ1ZFU0EnIHN0cmluZyBmb3IgbWluaS1WRE0gKi8KLQltZW1jcHkoUk1CdWYsIlZFU0EiLDQpOwotCX0KLSAgICByZWdzLT5kcyA9IHJtcmVncy5hQ1JGLnJlZ19kczsKLSAgICByZWdzLT5lcyA9IHJtcmVncy5hQ1JGLnJlZ19lczsKLSAgICByZWdzLT5mbGFncyA9IHJtcmVncy5hQ1JGLnJlZ19lZmxhZzsKLX0KLQotI2RlZmluZSBJTihyZWcpICAgICBybXJlZ3MucmVnID0gaW4tPmUucmVnCi0jZGVmaW5lIE9VVChyZWcpICAgIG91dC0+ZS5yZWcgPSBybXJlZ3MucmVnCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgRFBNSV9pbnQ4NihpbnRubywmcm1yZWdzKTsKLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIERQTUlfcmVncyAgIHJtcmVnczsKLQotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgSU4oZWF4KTsgSU4oZWJ4KTsgSU4oZWN4KTsgSU4oZWR4KTsgSU4oZXNpKTsgSU4oZWRpKTsKLSAgICBybXJlZ3MuZXMgPSBzcmVncy0+ZXM7Ci0gICAgcm1yZWdzLmRzID0gc3JlZ3MtPmRzOwotICAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7Ci0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBzcmVncy0+ZXMgPSBybXJlZ3MuZXM7Ci0gICAgc3JlZ3MtPmNzID0gcm1yZWdzLmNzOwotICAgIHNyZWdzLT5zcyA9IHJtcmVncy5zczsKLSAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9jYWxsUmVhbE1vZGUgbm90IHN1cHBvcnRlZCBvbiBPUy8yISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkoCi0gICAgdWxvbmcgKnBoeXNpY2FsLAotICAgIHVsb25nICp0b3RhbCkKLXsKLSAgICAvKiBVbmFibGUgdG8gZ2V0IHJlbGlhYmxlIHZhbHVlcyBmcm9tIE9TLzIgZm9yIHRoaXMgKi8KLSAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgcGFybXNJblswXSA9IHNpemU7Ci0gICAgcGFybXNJblsxXSA9IGNvbnRpZ3VvdXM7Ci0gICAgcGFybXNJblsyXSA9IGJlbG93MTZNOwotICAgIENhbGxTRERIZWxwKFBNSEVMUF9BTExPQ0xPQ0tFRCk7Ci0gICAgKnBoeXNBZGRyID0gcGFybXNPdXRbMV07Ci0gICAgcmV0dXJuICh2b2lkKilwYXJtc091dFswXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IHNpemUsCi0gICAgaWJvb2wgY29udGlndW91cykKLXsKLSAgICBwYXJtc0luWzBdID0gKHVsb25nKXA7Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX0ZSRUVMT0NLRUQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIG5ldyBibG9jayBvZiBwYWdlcyBmb3IgdGhlIHBhZ2UgYmxvY2sgbWFuYWdlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgcGFnZWJsb2NrICpQTV9hZGROZXdQYWdlQmxvY2sodm9pZCkKLXsKLSAgICBpbnQgICAgICAgICBpOwotICAgIHBhZ2VibG9jayAgICpuZXdCbG9jazsKLSAgICBjaGFyICAgICAgICAqcCwqbmV4dDsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG5ldyBwYWdlIGJsb2NrLCBhbmQgYWRkIHRvIGhlYWQgb2YgbGlzdCAqLwotICAgIGlmIChEb3NBbGxvY1NoYXJlZE1lbSgodm9pZCoqKSZuZXdCbG9jayxOVUxMLFBBR0VfQkxPQ0tfU0laRSxPQkpfR0VUVEFCTEUgfCBQQUdfUkVBRCB8IFBBR19XUklURSB8IFBBR19DT01NSVQpKQotCXJldHVybiBOVUxMOwotICAgIGlmICghUE1fbG9ja0RhdGFQYWdlcyhuZXdCbG9jayxQQUdFX0JMT0NLX1NJWkUsJm5ld0Jsb2NrLT5sb2NrSGFuZGxlKSkKLQlyZXR1cm4gTlVMTDsKLSAgICBuZXdCbG9jay0+cHJldiA9IE5VTEw7Ci0gICAgbmV3QmxvY2stPm5leHQgPSBwYWdlQmxvY2tzOwotICAgIGlmIChwYWdlQmxvY2tzKQotCXBhZ2VCbG9ja3MtPnByZXYgPSBuZXdCbG9jazsKLSAgICBwYWdlQmxvY2tzID0gbmV3QmxvY2s7Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBwYWdlIGFsaWduZWQgZnJlZSBsaXN0IGZvciB0aGUgcGFnZSBibG9jayAqLwotICAgIG5ld0Jsb2NrLT5mcmVlQ291bnQgPSBQQUdFU19QRVJfQkxPQ0s7Ci0gICAgbmV3QmxvY2stPmZyZWVMaXN0ID0gcCA9IChjaGFyKikoKCh1bG9uZykobmV3QmxvY2sgKyAxKSArIChQTV9QQUdFX1NJWkUtMSkpICYgfihQTV9QQUdFX1NJWkUtMSkpOwotICAgIG5ld0Jsb2NrLT5mcmVlTGlzdFN0YXJ0ID0gbmV3QmxvY2stPmZyZWVMaXN0OwotICAgIG5ld0Jsb2NrLT5mcmVlTGlzdEVuZCA9IHAgKyAoUEFHRVNfUEVSX0JMT0NLLTEpICogUE1fUEFHRV9TSVpFOwotICAgIGZvciAoaSA9IDA7IGkgPCBQQUdFU19QRVJfQkxPQ0s7IGkrKyxwID0gbmV4dCkKLQlGUkVFTElTVF9ORVhUKHApID0gbmV4dCA9IHAgKyBQTV9QQUdFX1NJWkU7Ci0gICAgRlJFRUxJU1RfTkVYVChwIC0gUE1fUEFHRV9TSVpFKSA9IE5VTEw7Ci0gICAgcmV0dXJuIG5ld0Jsb2NrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAotICAgIGlib29sIGxvY2tlZCkKLXsKLSAgICBwYWdlYmxvY2sgICAqYmxvY2s7Ci0gICAgdm9pZCAgICAgICAgKnA7Ci0KLSAgICAvKiBTY2FuIHRoZSBibG9jayBsaXN0IGxvb2tpbmcgZm9yIGFueSBmcmVlIGJsb2Nrcy4gQWxsb2NhdGUgYSBuZXcKLSAgICAgKiBwYWdlIGJsb2NrIGlmIG5vIGZyZWUgYmxvY2tzIGFyZSBmb3VuZC4KLSAgICAgKi8KLSAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgewotCWlmIChibG9jay0+ZnJlZUNvdW50KQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGJsb2NrID09IE5VTEwgJiYgKGJsb2NrID0gUE1fYWRkTmV3UGFnZUJsb2NrKCkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgYmxvY2stPmZyZWVDb3VudC0tOwotICAgIHAgPSBibG9jay0+ZnJlZUxpc3Q7Ci0gICAgYmxvY2stPmZyZWVMaXN0ID0gRlJFRUxJU1RfTkVYVChwKTsKLSAgICAodm9pZClsb2NrZWQ7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAotICAgIHZvaWQgKnApCi17Ci0gICAgcGFnZWJsb2NrICAgKmJsb2NrOwotCi0gICAgLyogRmlyc3QgZmluZCB0aGUgcGFnZSBibG9jayB0aGF0IHRoaXMgcGFnZSBiZWxvbmdzIHRvICovCi0gICAgZm9yIChibG9jayA9IHBhZ2VCbG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPm5leHQpIHsKLQlpZiAocCA+PSBibG9jay0+ZnJlZUxpc3RTdGFydCAmJiBwIDw9IGJsb2NrLT5mcmVlTGlzdEVuZCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIENIRUNLKGJsb2NrICE9IE5VTEwpOwotCi0gICAgLyogTm93IGZyZWUgdGhlIGJsb2NrIGJ5IGFkZGluZyBpdCB0byB0aGUgZnJlZSBsaXN0ICovCi0gICAgRlJFRUxJU1RfTkVYVChwKSA9IGJsb2NrLT5mcmVlTGlzdDsKLSAgICBibG9jay0+ZnJlZUxpc3QgPSBwOwotICAgIGlmICgrK2Jsb2NrLT5mcmVlQ291bnQgPT0gUEFHRVNfUEVSX0JMT0NLKSB7Ci0JLyogSWYgYWxsIHBhZ2VzIGluIHRoZSBwYWdlIGJsb2NrIGFyZSBub3cgZnJlZSwgZnJlZSB0aGUgZW50aXJlCi0JICogcGFnZSBibG9jayBpdHNlbGYuCi0JICovCi0JaWYgKGJsb2NrID09IHBhZ2VCbG9ja3MpIHsKLQkgICAgLyogRGVsZXRlIGZyb20gaGVhZCAqLwotCSAgICBwYWdlQmxvY2tzID0gYmxvY2stPm5leHQ7Ci0JICAgIGlmIChibG9jay0+bmV4dCkKLQkJYmxvY2stPm5leHQtPnByZXYgPSBOVUxMOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIC8qIERlbGV0ZSBmcm9tIG1pZGRsZSBvZiBsaXN0ICovCi0JICAgIENIRUNLKGJsb2NrLT5wcmV2ICE9IE5VTEwpOwotCSAgICBibG9jay0+cHJldi0+bmV4dCA9IGJsb2NrLT5uZXh0OwotCSAgICBpZiAoYmxvY2stPm5leHQpCi0JCWJsb2NrLT5uZXh0LT5wcmV2ID0gYmxvY2stPnByZXY7Ci0JICAgIH0KLQotCS8qIFVubG9jayB0aGUgbWVtb3J5IGFuZCBmcmVlIGl0ICovCi0JUE1fdW5sb2NrRGF0YVBhZ2VzKGJsb2NrLFBBR0VfQkxPQ0tfU0laRSwmYmxvY2stPmxvY2tIYW5kbGUpOwotCURvc0ZyZWVNZW0oYmxvY2spOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgaW4gYWxsIHRoZSBzaGFyZWQgbWVtb3J5IGJsb2NrcyBmb3IgbWFuYWdpbmcgdGhlIG1lbW9yeSBwYWdlcyBhYm92ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX21hcFNoYXJlZFBhZ2VzKHZvaWQpCi17Ci0gICAgcGFnZWJsb2NrICAgKmJsb2NrOwotCi0gICAgLyogTWFwIGFsbCB0aGUgcGFnZSBibG9ja3MgYWJvdmUgaW50byB0aGUgc2hhcmVkIG1lbW9yeSBmb3IgcHJvY2VzcyAqLwotICAgIGZvciAoYmxvY2sgPSBwYWdlQmxvY2tzOyBibG9jayAhPSBOVUxMOyBibG9jayA9IGJsb2NrLT5uZXh0KSB7Ci0JRG9zR2V0U2hhcmVkTWVtKGJsb2NrLCBQQUdfUkVBRCB8IFBBR19XUklURSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcygKLSAgICB2b2lkICpwLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpCi17Ci0gICAgcGFybXNJblswXSA9ICh1bG9uZylwOwotICAgIHBhcm1zSW5bMV0gPSBsZW47Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX0xPQ0tQQUdFUyk7Ci0gICAgbG9ja0hhbmRsZS0+aFswXSA9IHBhcm1zT3V0WzFdOwotICAgIGxvY2tIYW5kbGUtPmhbMV0gPSBwYXJtc091dFsyXTsKLSAgICBsb2NrSGFuZGxlLT5oWzJdID0gcGFybXNPdXRbM107Ci0gICAgcmV0dXJuIHBhcm1zT3V0WzBdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXMoCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKQotewotICAgIHBhcm1zSW5bMF0gPSBsb2NrSGFuZGxlLT5oWzBdOwotICAgIHBhcm1zSW5bMV0gPSBsb2NrSGFuZGxlLT5oWzFdOwotICAgIHBhcm1zSW5bMl0gPSBsb2NrSGFuZGxlLT5oWzJdOwotICAgIHJldHVybiBDYWxsU0RESGVscChQTUhFTFBfVU5MT0NLUEFHRVMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcygKLSAgICB2b2lkICgqcCkoKSwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcDsKLSAgICBwYXJtc0luWzFdID0gbGVuOwotICAgIENhbGxTRERIZWxwKFBNSEVMUF9MT0NLUEFHRVMpOwotICAgIGxvY2tIYW5kbGUtPmhbMF0gPSBwYXJtc091dFsxXTsKLSAgICBsb2NrSGFuZGxlLT5oWzFdID0gcGFybXNPdXRbMl07Ci0gICAgbG9ja0hhbmRsZS0+aFsyXSA9IHBhcm1zT3V0WzNdOwotICAgIHJldHVybiBwYXJtc091dFswXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKAotICAgIHZvaWQgKCpwKSgpLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpCi17Ci0gICAgcGFybXNJblswXSA9IGxvY2tIYW5kbGUtPmhbMF07Ci0gICAgcGFybXNJblsxXSA9IGxvY2tIYW5kbGUtPmhbMV07Ci0gICAgcGFybXNJblsyXSA9IGxvY2tIYW5kbGUtPmhbMl07Ci0gICAgcmV0dXJuIENhbGxTRERIZWxwKFBNSEVMUF9VTkxPQ0tQQUdFUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCi0gICAgaW50IGJhbmspCi17Ci0gICAgSU5UQ1JGICBybXJlZ3M7Ci0KLSAgICBpZiAoIUluaXRJbnQxMCgpKQotCXJldHVybjsKLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIHJtcmVncy51bEJJT1NJbnRObyA9IDB4MTA7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VheCA9IDB4NEYwNTsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWJ4ID0gMHgwMDAwOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lZHggPSBiYW5rOwotICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJnJtcmVncyxOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoCi0gICAgaW50IGJhbmspCi17Ci0gICAgSU5UQ1JGICBybXJlZ3M7Ci0KLSAgICBpZiAoIUluaXRJbnQxMCgpKQotCXJldHVybjsKLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIHJtcmVncy51bEJJT1NJbnRObyA9IDB4MTA7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VheCA9IDB4NEYwNTsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWJ4ID0gMHgwMDAwOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lZHggPSBiYW5rOwotICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJnJtcmVncyxOVUxMKTsKLSAgICBybXJlZ3MudWxCSU9TSW50Tm8gPSAweDEwOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lYXggPSAweDRGMDU7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VieCA9IDB4MDAwMTsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWR4ID0gYmFuazsKLSAgICBQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX1NPRlRXQVJFSU5ULCZybXJlZ3MsTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydCgKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgd2FpdFZSVCkKLXsKLSAgICBJTlRDUkYgIHJtcmVnczsKLQotICAgIGlmICghSW5pdEludDEwKCkpCi0JcmV0dXJuOwotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgcm1yZWdzLnVsQklPU0ludE5vID0gMHgxMDsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWF4ID0gMHg0RjA3OwotICAgIHJtcmVncy5hQ1JGLnJlZ19lYnggPSB3YWl0VlJUOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lY3ggPSB4OwotICAgIHJtcmVncy5hQ1JGLnJlZ19lZHggPSB5OwotICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJnJtcmVncyxOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgKHZvaWQpYXhWYWw7Ci0gICAgKHZvaWQpQklPU1BoeXNBZGRyOwotICAgICh2b2lkKW1hcHBlZEJJT1M7Ci0gICAgKHZvaWQpQklPU0xlbjsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVUVVJOUzoKLUVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotfQotCi0vKiBUT0RPOiBNb3ZlIHRoZSBNVFJSIGhlbHBlciBzdHVmZiBpbnRvIHRoZSBjYWxsIGdhdGUsIG9yIGJldHRlciB5ZXQgKi8KLS8qICAgICAgIGVudGlyZWx5IGludG8gdGhlIHJpbmcgMCBoZWxwZXIgZHJpdmVyISEgKi8KLQotLyogTVRSUiBoZWxwZXIgZnVuY3Rpb25zLiBUbyBtYWtlIGl0IGVhc2llciB0byBpbXBsZW1lbnQgdGhlIE1UUlIgc3VwcG9ydAotICogdW5kZXIgT1MvMiwgd2Ugc2ltcGx5IHB1dCBvdXIgcmluZyAwIGhlbHBlciBmdW5jdGlvbnMgaW50byB0aGUKLSAqIGhlbHBlciBkZXZpY2UgZHJpdmVyIHJhdGhlciB0aGFuIHRoZSBlbnRpcmUgTVRSUiBtb2R1bGUuIFRoaXMgbWFrZXMKLSAqIGl0IGVhc2llciB0byBtYWludGFpbiB0aGUgTVRSUiBzdXBwb3J0IHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZGVhbAotICogd2l0aCAxNi1iaXQgcmluZyAwIGNvZGUgaW4gdGhlIE1UUlIgbGlicmFyeS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZsdXNoIHRoZSB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCkKLXsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfRkxVU0hUTEIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0cnVlIGlmIHJpbmcgMCAob3IgaWYgd2UgY2FuIGNhbGwgdGhlIGhlbHBlcnMgZnVuY3Rpb25zIGF0IHJpbmcgMCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfQVNNQVBJIF9NVFJSX2lzUmluZzAodm9pZCkKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBDUjQgcmVnaXN0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfQVNNQVBJIF9NVFJSX3NhdmVDUjQodm9pZCkKLXsKLSAgICByZXR1cm4gQ2FsbFNEREhlbHAoUE1IRUxQX1NBVkVDUjQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBDUjQgcmVnaXN0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgX01UUlJfcmVzdG9yZUNSNCh1bG9uZyBjcjRWYWwpCi17Ci0gICAgcGFybXNJblswXSA9IGNyNFZhbDsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfUkVTVE9SRUNSNCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCBhIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUgQ1BVLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBfTVRSUl9yZWFkTVNSKAotICAgIHVsb25nIHJlZywKLSAgICB1bG9uZyAqZWF4LAotICAgIHVsb25nICplZHgpCi17Ci0gICAgcGFybXNJblswXSA9IHJlZzsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfUkVBRE1TUik7Ci0gICAgKmVheCA9IHBhcm1zT3V0WzBdOwotICAgICplZHggPSBwYXJtc091dFsxXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Xcml0ZSBhIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUgQ1BVLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBfTVRSUl93cml0ZU1TUigKLSAgICB1bG9uZyByZWcsCi0gICAgdWxvbmcgZWF4LAotICAgIHVsb25nIGVkeCkKLXsKLSAgICBwYXJtc0luWzBdID0gcmVnOwotICAgIHBhcm1zSW5bMV0gPSBlYXg7Ci0gICAgcGFybXNJblsyXSA9IGVkeDsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfV1JJVEVNU1IpOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEgKi8KLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUludGVybmFsIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGZpbmQgZGF0YSB0byB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29udmVydEZpbmREYXRhKAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSwKLSAgICBGSUxFRklOREJVRjMgKmJsaykKLXsKLSAgICB1bG9uZyAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7Ci0KLSAgICBtZW1zZXQoZmluZERhdGEsMCxmaW5kRGF0YS0+ZHdTaXplKTsKLSAgICBmaW5kRGF0YS0+ZHdTaXplID0gZHdTaXplOwotICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9SRUFET05MWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGJsay0+YXR0ckZpbGUgJiBGSUxFX0RJUkVDVE9SWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfRElSRUNUT1JZOwotICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9BUkNISVZFRCkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoYmxrLT5hdHRyRmlsZSAmIEZJTEVfSElEREVOKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ISURERU47Ci0gICAgaWYgKGJsay0+YXR0ckZpbGUgJiBGSUxFX1NZU1RFTSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfU1lTVEVNOwotICAgIGZpbmREYXRhLT5zaXplTG8gPSBibGstPmNiRmlsZTsKLSAgICBmaW5kRGF0YS0+c2l6ZUhpID0gMDsKLSAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+YWNoTmFtZSxQTV9NQVhfUEFUSCk7Ci0gICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOwotfQotCi0jZGVmaW5lIEZJTkRfTUFTSyAgIChGSUxFX0FSQ0hJVkVEIHwgRklMRV9ESVJFQ1RPUlkgfCBGSUxFX1NZU1RFTSB8IEZJTEVfSElEREVOIHwgRklMRV9SRUFET05MWSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIEZJTEVGSU5EQlVGMyAgICBibGs7Ci0gICAgSERJUiAgICAgICAgICAgIGhkaXIgPSBIRElSX0NSRUFURTsKLSAgICB1bG9uZyAgICAgICAgICAgY291bnQgPSAxOwotCi0gICAgaWYgKERvc0ZpbmRGaXJzdCgoUFNaKWZpbGVuYW1lLCZoZGlyLEZJTkRfTUFTSywmYmxrLHNpemVvZihibGspLCZjb3VudCxGSUxfU1RBTkRBUkQpID09IE5PX0VSUk9SKSB7Ci0JY29udmVydEZpbmREYXRhKGZpbmREYXRhLCZibGspOwotCXJldHVybiAodm9pZCopaGRpcjsKLQl9Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHZvaWQgKmhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgRklMRUZJTkRCVUYzICAgIGJsazsKLSAgICB1bG9uZyAgICAgICAgICAgY291bnQgPSAxOwotCi0gICAgaWYgKERvc0ZpbmROZXh0KChIRElSKWhhbmRsZSwmYmxrLHNpemVvZihibGspLCZjb3VudCkgPT0gTk9fRVJST1IpIHsKLQljb252ZXJ0RmluZERhdGEoZmluZERhdGEsJmJsayk7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdm9pZCAqaGFuZGxlKQotewotICAgIERvc0ZpbmRDbG9zZSgoSERJUiloYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDAgICAtIEN1cnJlbnQgZHJpdmUKLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICB1bG9uZyAgIGNudERpc2ssY250RHJpdmVNYXA7Ci0gICAgaWJvb2wgICB2YWxpZDsKLQotICAgIERvc1F1ZXJ5Q3VycmVudERpc2soJmNudERpc2ssJmNudERyaXZlTWFwKTsKLSAgICB2YWxpZCA9IChEb3NTZXREZWZhdWx0RGlzayhkcml2ZSkgPT0gTk9fRVJST1IpOwotICAgIERvc1NldERlZmF1bHREaXNrKGNudERpc2spOwotICAgIHJldHVybiB2YWxpZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgdWxvbmcgbGVuZ3RoID0gbGVuOwotCi0gICAgRG9zUXVlcnlDdXJyZW50RGlyKGRyaXZlLCAoUFNaKWRpciwgJmxlbmd0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotICAgIEZJTEVTVEFUVVMzIHM7Ci0KLSAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJnMsc2l6ZW9mKHMpKSkKLQlyZXR1cm47Ci0gICAgcy5hdHRyRmlsZSA9IDA7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfUkVBRE9OTFkpCi0Jcy5hdHRyRmlsZSB8PSBGSUxFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0Jcy5hdHRyRmlsZSB8PSBGSUxFX0FSQ0hJVkVEOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlzLmF0dHJGaWxlIHw9IEZJTEVfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKLQlzLmF0dHJGaWxlIHw9IEZJTEVfU1lTVEVNOwotICAgIERvc1NldFBhdGhJbmZvKChQU1opZmlsZW5hbWUsRklMX1NUQU5EQVJELChQVk9JRCkmcyxzaXplb2YocyksMEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBGSUxFU1RBVFVTMyBmczM7Ci0gICAgdWludCAgICAgICAgcmV0dmFsID0gMDsKLQotICAgIGlmIChEb3NRdWVyeVBhdGhJbmZvKChQU1opZmlsZW5hbWUsIEZJTF9TVEFOREFSRCwgJmZzMywgc2l6ZW9mKEZJTEVTVEFUVVMzKSkpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKGZzMy5hdHRyRmlsZSAmIEZJTEVfUkVBRE9OTFkpCi0JcmV0dmFsIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGZzMy5hdHRyRmlsZSAmIEZJTEVfQVJDSElWRUQpCi0JcmV0dmFsIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoZnMzLmF0dHJGaWxlICYgRklMRV9ISURERU4pCi0JcmV0dmFsIHw9IFBNX0ZJTEVfSElEREVOOwotICAgIGlmIChmczMuYXR0ckZpbGUgJiBGSUxFX1NZU1RFTSkKLQlyZXR2YWwgfD0gUE1fRklMRV9TWVNURU07Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIERvc0NyZWF0ZURpcigoUFNaKWZpbGVuYW1lLE5VTEwpID09IE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gRG9zRGVsZXRlRGlyKChQU1opZmlsZW5hbWUpID09IE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgRklMRVNUQVRVUzMgZnMzOwotICAgIHN0cnVjdCB0bSAgIHRjOwotICAgIHN0cnVjdCB0bSAgICpyZXQ7Ci0gICAgdGltZV90ICAgICAgdHQ7Ci0KLSAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLCBGSUxfU1RBTkRBUkQsICZmczMsIHNpemVvZihGSUxFU1RBVFVTMykpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoZ21UaW1lKSB7Ci0JdGMudG1feWVhciA9IGZzMy5mZGF0ZUxhc3RXcml0ZS55ZWFyICsgODA7Ci0JdGMudG1fbW9uID0gZnMzLmZkYXRlTGFzdFdyaXRlLm1vbnRoIC0gMTsKLQl0Yy50bV9tZGF5ID0gZnMzLmZkYXRlTGFzdFdyaXRlLmRheTsKLQl0Yy50bV9ob3VyID0gZnMzLmZ0aW1lTGFzdFdyaXRlLmhvdXJzOwotCXRjLnRtX21pbiA9IGZzMy5mdGltZUxhc3RXcml0ZS5taW51dGVzOwotCXRjLnRtX3NlYyA9IGZzMy5mdGltZUxhc3RXcml0ZS50d29zZWNzICogMjsKLQlpZigodHQgPSBta3RpbWUoJnRjKSkgPT0gLTEpCi0JICAgIHJldHVybiBmYWxzZTsKLQlpZighKHJldCA9IGdtdGltZSgmdHQpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCXRpbWUtPnNlYyA9IHJldC0+dG1fc2VjOwotCXRpbWUtPmRheSA9IHJldC0+dG1fbWRheTsKLQl0aW1lLT5tb24gPSByZXQtPnRtX21vbiArIDE7Ci0JdGltZS0+eWVhciA9IHJldC0+dG1feWVhciAtIDgwOwotCXRpbWUtPm1pbiA9IHJldC0+dG1fbWluOwotCXRpbWUtPmhvdXIgPSByZXQtPnRtX2hvdXI7Ci0JfQotICAgIGVsc2UgewotCXRpbWUtPnNlYyA9IGZzMy5mdGltZUxhc3RXcml0ZS50d29zZWNzICogMjsKLQl0aW1lLT5kYXkgPSBmczMuZmRhdGVMYXN0V3JpdGUuZGF5OwotCXRpbWUtPm1vbiA9IGZzMy5mZGF0ZUxhc3RXcml0ZS5tb250aDsKLQl0aW1lLT55ZWFyID0gZnMzLmZkYXRlTGFzdFdyaXRlLnllYXI7Ci0JdGltZS0+bWluID0gZnMzLmZ0aW1lTGFzdFdyaXRlLm1pbnV0ZXM7Ci0JdGltZS0+aG91ciA9IGZzMy5mdGltZUxhc3RXcml0ZS5ob3VyczsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICBGSUxFU1RBVFVTMyBmczM7Ci0gICAgc3RydWN0IHRtICAgdGM7Ci0gICAgc3RydWN0IHRtICAgKnJldDsKLSAgICB0aW1lX3QgICAgICB0dDsKLQotICAgIGlmIChEb3NRdWVyeVBhdGhJbmZvKChQU1opZmlsZW5hbWUsRklMX1NUQU5EQVJELChQVk9JRCkmZnMzLHNpemVvZihmczMpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGdtVGltZSkgewotCXRjLnRtX3llYXIgPSB0aW1lLT55ZWFyICsgODA7Ci0JdGMudG1fbW9uID0gdGltZS0+bW9uIC0gMTsKLQl0Yy50bV9tZGF5ID0gdGltZS0+ZGF5OwotCXRjLnRtX2hvdXIgPSB0aW1lLT5ob3VyOwotCXRjLnRtX21pbiA9IHRpbWUtPm1pbjsKLQl0Yy50bV9zZWMgPSB0aW1lLT5zZWM7Ci0JaWYoKHR0ID0gbWt0aW1lKCZ0YykpID09IC0xKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JcmV0ID0gbG9jYWx0aW1lKCZ0dCk7Ci0JZnMzLmZ0aW1lTGFzdFdyaXRlLnR3b3NlY3MgPSByZXQtPnRtX3NlYyAvIDI7Ci0JZnMzLmZkYXRlTGFzdFdyaXRlLmRheSA9IHJldC0+dG1fbWRheTsKLQlmczMuZmRhdGVMYXN0V3JpdGUubW9udGggPSByZXQtPnRtX21vbiArIDE7Ci0JZnMzLmZkYXRlTGFzdFdyaXRlLnllYXIgPSByZXQtPnRtX3llYXIgLSA4MDsKLQlmczMuZnRpbWVMYXN0V3JpdGUubWludXRlcyA9IHJldC0+dG1fbWluOwotCWZzMy5mdGltZUxhc3RXcml0ZS5ob3VycyA9IHJldC0+dG1faG91cjsKLQl9Ci0gICAgZWxzZSB7Ci0JZnMzLmZ0aW1lTGFzdFdyaXRlLnR3b3NlY3MgPSB0aW1lLT5zZWMgLyAyOwotCWZzMy5mZGF0ZUxhc3RXcml0ZS5kYXkgPSB0aW1lLT5kYXk7Ci0JZnMzLmZkYXRlTGFzdFdyaXRlLm1vbnRoID0gdGltZS0+bW9uOwotCWZzMy5mZGF0ZUxhc3RXcml0ZS55ZWFyID0gdGltZS0+eWVhcjsKLQlmczMuZnRpbWVMYXN0V3JpdGUubWludXRlcyA9IHRpbWUtPm1pbjsKLQlmczMuZnRpbWVMYXN0V3JpdGUuaG91cnMgPSB0aW1lLT5ob3VyOwotCX0KLSAgICBtZW1jcHkoJmZzMy5mZGF0ZUxhc3RBY2Nlc3MsICZmczMuZmRhdGVMYXN0V3JpdGUsIHNpemVvZihGREFURSkpOwotICAgIG1lbWNweSgmZnMzLmZkYXRlQ3JlYXRpb24sICZmczMuZmRhdGVMYXN0V3JpdGUsIHNpemVvZihGREFURSkpOwotICAgIG1lbWNweSgmZnMzLmZ0aW1lTGFzdEFjY2VzcywgJmZzMy5mdGltZUxhc3RXcml0ZSwgc2l6ZW9mKEZUSU1FKSk7Ci0gICAgbWVtY3B5KCZmczMuZnRpbWVDcmVhdGlvbiwgJmZzMy5mdGltZUxhc3RXcml0ZSwgc2l6ZW9mKEZUSU1FKSk7Ci0gICAgRG9zU2V0UGF0aEluZm8oKFBTWilmaWxlbmFtZSxGSUxfU1RBTkRBUkQsKFBWT0lEKSZmczMsc2l6ZW9mKEZJTEVTVEFUVVMzKSwwTCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzllZjJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgYmFzZUFkZHIgPSBiYXNlQWRkcjsKLSAgICBiYW5rU2l6ZSA9IGJhbmtTaXplOwotICAgIGNvZGVMZW4gPSBjb2RlTGVuOwotICAgIGJhbmtGdW5jID0gYmFua0Z1bmM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGZmZTQzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVsb25nICAgIGZyZXF1ZW5jeTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotICAgIERvc1RtclF1ZXJ5RnJlcSgmZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT24odG0pIERvc1RtclF1ZXJ5VGltZSgoUVdPUkQqKSZ0bS0+c3RhcnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUxhcCx0bUNvdW50OwotCi0gICAgRG9zVG1yUXVlcnlUaW1lKChRV09SRCopJnRtTGFwKTsKLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG1MYXAsJnRtQ291bnQpOwotICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxmcmVxdWVuY3kpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgIERvc1RtclF1ZXJ5VGltZSgoUVdPUkQqKSZ0bS0+ZW5kKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgdG1Db3VudDsKLQotICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bS0+ZW5kLCZ0bUNvdW50KTsKLSAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciB2YWx1ZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICBVTE9ORyAgIGNvdW50OwotICAgIERvc1F1ZXJ5U3lzSW5mbyggUVNWX01TX0NPVU5ULCBRU1ZfTVNfQ09VTlQsICZjb3VudCwgc2l6ZW9mKFVMT05HKSApOwotICAgIHJldHVybiBjb3VudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczJwbS9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWYyMGE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgSUJNIFBDIChPUy8yKQotKgotKiBEZXNjcmlwdGlvbjogIE9TLzIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgICAgICAgICAgb2xkTW91c2VTdGF0ZTsgICAgICAvKiBPbGQgbW91c2Ugc3RhdGUgICAgICAgICAgICAgICovCi1zdGF0aWMgdWxvbmcgICAgICAgIG9sZEtleU1lc3NhZ2U7ICAgICAgLyogT2xkIGtleWJvYXJkIHN0YXRlICAgICAgICAgICAqLwotc3RhdGljIHVzaG9ydCAgICAgICBrZXlVcE1zZ1syNTZdID0gezB9Oy8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICovCi1ITU9VICAgICAgICAgICAgICAgIF9FVlRfaE1vdXNlOyAgICAgICAgLyogSGFuZGxlIHRvIHRoZSBtb3VzZSBkcml2ZXIgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgT1MvMiAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZSBmcm9tIE9TLzIgaW50byBvdXIgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgT1MvMiBQcmVzZW50YXRpb24gTWFuYWdlciBhcHBzISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoKQotewotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgaW5pdEV2ZW50UXVldWUoKTsKLSAgICBvbGRNb3VzZVN0YXRlID0gMDsKLSAgICBvbGRLZXlNZXNzYWdlID0gMDsKLSAgICBtZW1zZXQoa2V5VXBNc2csMCxzaXplb2Yoa2V5VXBNc2cpKTsKLQotICAgIC8qIFRPRE86IE9TLzIgUE0gc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gY29kZSEgKi8KLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBPUy8yICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBPUy8yICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0gICAgLyogVE9ETzogT1MvMiBQTSBzcGVjaWZpYyBleGl0IGNvZGUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLU1vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAotYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfc2V0TW91c2VQb3MoeCx5KQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MycG0vb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjlmODIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MycG0vb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9TVUIKLSNkZWZpbmUgSU5DTF9WSU8KLSNkZWZpbmUgSU5DTF9LQkQKLSNpbmNsdWRlIDxvczIuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRlNWM5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSB0byBwdWxsIGluIE9TIHNwZWNpZmljIGhlYWRlcnMgZm9yIHRoZSB0YXJnZXQKLSogICAgICAgICAgICAgICBPUyBlbnZpcm9ubWVudC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAgICAgZGVmaW5lZChfX1NNWDMyX18pCi0jaW5jbHVkZSAic214L29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19SVFRBUkdFVF9fKQotI2luY2x1ZGUgInJ0dGFyZ2V0L29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19SRUFMRE9TX18pCi0jaW5jbHVkZSAiZG9zL29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19XSU4zMl9WWERfXykKLSNpbmNsdWRlICJ2eGQvb3NoZHIuaCIKLSNlbGlmICAgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotI2luY2x1ZGUgIm50ZHJ2L29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19XSU5ET1dTMzJfXykKLSNpbmNsdWRlICJ3aW4zMi9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX1ZERF9fKQotI2luY2x1ZGUgInZ4ZC9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX18pCi0jaWYgICAgIGRlZmluZWQoX19PUzJfUE1fXykKLSNpbmNsdWRlICJvczJwbS9vc2hkci5oIgotI2Vsc2UKLSNpbmNsdWRlICJvczIvb3NoZHIuaCIKLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykKLSNpZiAgICAgZGVmaW5lZChfX1VTRV9YMTFfXykKLSNpbmNsdWRlICJ4MTEvb3NoZHIuaCIKLSNlbHNlCi0jaW5jbHVkZSAibGludXgvb3NoZHIuaCIKLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fUU5YX18pCi0jaWYgICAgIGRlZmluZWQoX19VU0VfUEhPVE9OX18pCi0jaW5jbHVkZSAicGhvdG9uL29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19VU0VfWDExX18pCi0jaW5jbHVkZSAieDExL29zaGRyLmgiCi0jZWxzZQotI2luY2x1ZGUgInFueC9vc2hkci5oIgotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19CRU9TX18pCi0jaW5jbHVkZSAiYmVvcy9vc2hkci5oIgotI2Vsc2UKLSNlcnJvciAgUE0gbGlicmFyeSBub3QgcG9ydGVkIHRvIHRoaXMgcGxhdGZvcm0geWV0IQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Bob3Rvbi9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODFkYTE2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Bob3Rvbi9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlggUGhvdG9uIEdVSQotKgotKiBEZXNjcmlwdGlvbjogIFFOWCBmdWxsc2NyZWVuIGNvbnNvbGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgY3Jvc3MgcGxhdGZvcm0gZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBMaW51eCAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIF9FVlRfaXNLZXlEb3duKAotICAgIHVjaGFyIHNjYW5jb2RlKQotewotICAgIHJldHVybiAoS2V5U3RhdGVbKHNjYW5jb2RlICYgMHhmOCkgPj4gM10gJiAoMSA8PCAoc2NhbmNvZGUgJiAweDcpKSA/Ci0JdHJ1ZSA6IGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXRyaWV2ZXMgYWxsIGV2ZW50cyBmcm9tIHRoZSBtb3VzZS9rZXlib2FyZCBldmVudCBxdWV1ZSBhbmQgc3R1ZmZzIHRoZW0KLWludG8gdGhlIE1HTCBldmVudCBxdWV1ZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgcGlkOwotICAgIHVpbnQgICAgICAgICAgICBtc2csIGJ1dF9zdGF0LCBtZXNzYWdlOwotICAgIHVjaGFyICAgICAgICAgICBldnRbc2l6ZW9mIChQaEV2ZW50X3QpICsgMTAyNF07Ci0gICAgUGhFdmVudF90ICAgICAgICpldmVudCA9ICh2b2lkICopZXZ0OwotICAgIFBoS2V5RXZlbnRfdCAgICAgICAgKmtleTsKLSAgICBQaFBvaW50ZXJFdmVudF90ICAgICptb3VzZTsKLSAgICBzdGF0aWMgaW50ICAgICAgZXh0ZW5kZWQ7Ci0gICAgZXZlbnRfdCAgICAgICAgIF9ldnQ7Ci0KLSAgICB3aGlsZSAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JdWludCAgICBtb2RzID0gMCwga2V5cCA9IDA7Ci0KLQlwaWQgPSBDcmVjZWl2ZSgwLCAmbXNnLCBzaXplb2YgKG1zZykpOwotCi0JaWYgKHBpZCA9PSAtMSkKLQkgICAgcmV0dXJuOwotCi0JaWYgKFBoRXZlbnRSZWFkKHBpZCwgZXZlbnQsIHNpemVvZiAoZXZ0KSkgPT0gUGhfRVZFTlRfTVNHKSB7Ci0JICAgIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YgKGV2dCkpOwotCSAgICBpZiAoZXZlbnQtPnR5cGUgPT0gUGhfRVZfS0VZKSB7Ci0JCWtleSA9IFBoR2V0RGF0YShldmVudCk7Ci0KLQkJaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX1NDQU5fVkFMSUQpIHsKLQkJICAgIGtleXAgPSBrZXktPmtleV9zY2FuOwotCQkgICAgaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX0RPV04pCi0JCQlLZXlTdGF0ZVsoa2V5cCAmIDB4ZjgwMCkgPj4gMTFdCi0JCQkgICAgfD0gMSA8PCAoKGtleXAgJiAweDcwMCkgPj4gOCk7Ci0JCSAgICBlbHNlCi0JCQlLZXlTdGF0ZVsoa2V5cCAmIDB4ZjgwMCkgPj4gMTFdCi0JCQkgICAgJj0gfigxIDw8ICgoa2V5cCAmIDB4NzAwKSA+PiA4KSk7Ci0JCX0KLQkJaWYgKChrZXktPmtleV9mbGFncyAmIEtFWV9TWU1fVkFMSUQpIHx8IGV4dGVuZGVkKQotCQkgICAga2V5cCB8PSBrZXktPmtleV9zeW07Ci0KLQkJLyogTm8gd2F5IHRvIHRlbGwgbGVmdCBmcm9tIHJpZ2h0Li4uICovCi0JCWlmIChrZXktPmtleV9tb2RzICYgS0VZTU9EX1NISUZUKQotCQkgICAgbW9kcyA9IChFVlRfTEVGVFNISUZUIHwgRVZUX1JJR0hUU0hJRlQpOwotCQlpZiAoa2V5LT5rZXlfbW9kcyAmIEtFWU1PRF9DVFJMKQotCQkgICAgbW9kcyB8PSAoRVZUX0NUUkxTVEFURSB8IEVWVF9MRUZUQ1RSTCk7Ci0JCWlmIChrZXktPmtleV9tb2RzICYgS0VZTU9EX0FMVCkKLQkJICAgIG1vZHMgfD0gKEVWVF9BTFRTVEFURSB8IEVWVF9MRUZUQUxUKTsKLQotCQlfZXZ0LndoZW4gPSBldnQtPnRpbWVzdGFtcDsKLQkJaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX1JFUEVBVCkgewotCQkgICAgX2V2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkJICAgIF9ldnQubWVzc2FnZSA9IDB4MTAwMDA7Ci0JCSAgICB9Ci0JCWVsc2UgaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX0RPV04pCi0JCSAgICBfZXZ0LndoYXQgPSBFVlRfS0VZRE9XTjsKLQkJZWxzZQotCQkgICAgX2V2dC53aGF0ID0gRVZUX0tFWVVQOwotCQlfZXZ0Lm1vZGlmaWVycyA9IG1vZHM7Ci0JCV9ldnQubWVzc2FnZSB8PSBrZXlwOwotCi0JCWFkZEV2ZW50KCZfZXZ0KTsKLQotCQlzd2l0Y2goa2V5LT5rZXlfc2NhbiAmIDB4ZmYwMCkgewotCQkgICAgY2FzZSAweGUwMDA6Ci0JCQlleHRlbmRlZCA9IDE7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMHhlMDAxOgotCQkJZXh0ZW5kZWQgPSAyOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJaWYgKGV4dGVuZGVkKQotCQkJICAgIGV4dGVuZGVkLS07Ci0JCSAgICB9Ci0JCX0KLQkgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUgJiBQaF9FVl9QVFJfQUxMKSB7Ci0JCWJ1dF9zdGF0ID0gbWVzc2FnZSA9IDA7Ci0JCW1vdXNlID0gUGhHZXREYXRhKGV2ZW50KTsKLQotCQlpZiAobW91c2UtPmJ1dHRvbl9zdGF0ZSAmIFBoX0JVVFRPTl8zKQotCQkgICAgYnV0X3N0YXQgPSBFVlRfTEVGVEJVVDsKLQkJaWYgKG1vdXNlLT5idXR0b25zICYgUGhfQlVUVE9OXzMpCi0JCSAgICBtZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQotCQlpZiAobW91c2UtPmJ1dHRvbl9zdGF0ZSAmIFBoX0JVVFRPTl8xKQotCQkgICAgYnV0X3N0YXQgfD0gRVZUX1JJR0hUQlVUOwotCQlpZiAobW91c2UtPmJ1dHRvbnMgJiBQaF9CVVRUT05fMSkKLQkJICAgIG1lc3NhZ2UgfD0gRVZUX1JJR0hUQk1BU0s7Ci0KLQkJX2V2dC53aGVuID0gZXZ0LT50aW1lc3RhbXA7Ci0JCWlmIChldmVudC0+dHlwZSAmIFBoX0VWX1BUUl9NT1RJT04pIHsKLQkJICAgIF9ldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0JCSAgICBfZXZ0LndoZXJlX3ggPSBtb3VzZS0+cG9zLng7Ci0JCSAgICBfZXZ0LndoZXJlX3kgPSBtb3VzZS0+cG9zLnk7Ci0JCSAgICBfZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OwotCQkgICAgYWRkRXZlbnQoJl9ldnQpOwotCQkgICAgfQotCQlpZiAoZXZlbnQtPnR5cGUgJiBQaF9FVl9CVVRfUFJFU1MpCi0JCSAgICBfZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQllbHNlCi0JCSAgICBfZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJX2V2dC53aGVyZV94ID0gbW91c2UtPnBvcy54OwotCQlfZXZ0LndoZXJlX3kgPSBtb3VzZS0+cG9zLnk7Ci0JCV9ldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7Ci0JCV9ldnQubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCWFkZEV2ZW50KCZfZXZ0KTsKLQkJfQotCSAgICB9Ci0JZWxzZQotCSAgICByZXR1cm47Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoCi0gICAgaW50IHNpZ25vKQotewotICAgIGNoYXIgICAgYnVmWzgwXTsKLQotICAgIEVWVF9leGl0KCk7Ci0gICAgc3ByaW50ZihidWYsIlRlcm1pbmF0aW5nIG9uIHNpZ25hbCAlZCIsc2lnbm8pOwotICAgIFBNX2ZhdGFsRXJyb3IoYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICBpbnQgICAgICAgICBpOwotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBfbW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgbWVtc2V0KCh2b2lkICopS2V5U3RhdGUsIDAsIHNpemVvZiAoS2V5U3RhdGUpKTsKLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgLyogVE9ETzogTmVlZCB0byBjYWxsIElucHV0IHRvIGNoYW5nZSB0aGUgY29vcmRpbmF0ZXMgdGhhdCBpdCByZXR1cm5zICovCi0gICAgLyogICAgICAgZm9yIG1vdXNlIGV2ZW50cyEhICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFBob3RvbiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgUGhvdG9uICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcGhvdG9uL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MjU2My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlggUGhvdG9uIEdVSQotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3lzL21vdXNlLmg+Ci0jaW5jbHVkZSA8c3lzL2tleWJvYXJkLmg+Ci0jaW5jbHVkZSA8c3lzL2ZkLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxjb25pby5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDxzeXMva2VybmVsLmg+Ci0jaW5jbHVkZSA8UGguaD4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtLnZwdyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtLnZwdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlNjhhNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbS52cHcKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1bRGVwZW5kZW5jaWVzXQ0KLVtDdXJyZW50UHJvamVjdF0NCi1jdXJwcm9qPXBtbGludXgudnBqDQotW1Byb2plY3RGaWxlc10NCi1wbWNvbW1vbi52cGoNCi1wbWRvcy52cGoNCi1wbWxpbnV4LnZwag0KLXBtcW54LnZwag0KLXBtdnhkLnZwag0KLXBtd2luMzIudnBqDQotel9zYW1wbGVzLnZwag0KLS4uXGEtZ2xvYmFsIGluY2x1ZGVzLnZwag0KLVtUcmVlRXhwYW5zaW9uXQ0KLSIuLlxhLWdsb2JhbCBpbmNsdWRlcy52cGoiIDANCi1wbWNvbW1vbi52cGogMA0KLXBtZG9zLnZwaiAwDQotcG1saW51eC52cGogMA0KLXBtcW54LnZwaiAwDQotcG12eGQudnBqIDANCi1wbXdpbjMyLnZwaiAwDQotel9zYW1wbGVzLnZwaiAxIDENCi1bU3RhdGVdDQotU0NSRUVOOiAxMjgwIDEwMjQgMCAwIDk2MCA3NDYgMCAwIE0gMCAwIDAgMCA5NzcgNjMxDQotQ1dEOiBDOlxzY2l0ZWNoXHNyY1xwbQ0KLUZJTEVISVNUOiA5DQotQzpcc2NpdGVjaFxtYWtlZGVmc1xnY2Nfd2luMzIubWsNCi1DOlxzY2l0ZWNoXGJpblxnY2MyLXczMi5iYXQNCi1DOlxzY2l0ZWNoXGJpblxnY2MyLWMzMi5iYXQNCi1DOlxzY2l0ZWNoXGJpblxnY2MyLWxpbnV4LmJhdA0KLUM6XHNjaXRlY2hcbWFrZWRlZnNcZ2NjX2xpbnV4Lm1rDQotQzpcc2NpdGVjaFxzcmNccG1cbGludXhcZXZlbnQuYw0KLUM6XHNjaXRlY2hcc3JjXHBtXGxpbnV4XG9zaGRyLmgNCi1DOlxzY2l0ZWNoXHNyY1xwbVxldmVudC5jDQotQzpcc2NpdGVjaFxzcmNccG1ccG1saW51eC52cGoNCi1bUHJvamVjdERhdGVzXQ0KLXBtY29tbW9uLnZwaj0yMDAxMDUxNzE2NDMzNTI5MA0KLXBtZG9zLnZwaj0yMDAxMDUxNzE2NDMzNTI5MA0KLXBtbGludXgudnBqPTIwMDEwNjIwMTc1ODI5ODEyDQotcG1xbngudnBqPTIwMDEwNTE3MTY0MzM1MjkwDQotcG12eGQudnBqPTIwMDEwNTE3MTY0MzM1MzA2DQotcG13aW4zMi52cGo9MjAwMTA1MTcxNjQzMzUzMDYNCi16X3NhbXBsZXMudnBqPTIwMDEwNTE3MTY0MzM1MzA2DQotLi5cYS1nbG9iYWwgaW5jbHVkZXMudnBqPTIwMDEwNTE3MTY0MzM0OTc4DQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1jb21tb24udnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1jb21tb24udnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI4NzJkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtY29tbW9uLnZwagorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLVtDT01QSUxFUl0NCi12ZXJzaW9uPTUuMGINCi1NQUNSTz1cbg0KLWFjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG5PdGhlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4qLipcbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMCAwIA0KLUZJTFRFUkFQUENPTU1BTkQ9XG5cblxuXG4NCi12Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KLXZjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KLWNvbXBpbGU9Y29uY3VyfGNhcHR1cmV8aGlkZXw6Q29tcGlsZTomQ29tcGlsZSwNCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGhpZGV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLA0KLXJlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8aGlkZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLA0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi1jb21tb24uYw0KLWNwdWluZm8uYw0KLWRlYnVnLmMNCi1ldmVudC5jDQotbWFrZWZpbGUNCi1vc2hkci5oDQotenRpbWVyLmMNCi0uLlxjb21tb25cYWdwbGliLmMNCi1jb2RlcGFnZVx1c19lbmcuYw0KLWNvbW1vblxfY3B1aW5mby5hc20NCi1jb21tb25cX2RtYS5hc20NCi1jb21tb25cX2ludDY0LmFzbQ0KLWNvbW1vblxfam95LmFzbQ0KLWNvbW1vblxfbXRyci5hc20NCi1jb21tb25cX3BjaWxpYi5hc20NCi1jb21tb25cYWdwLmMNCi1jb21tb25ca2V5Ym9hcmQuYw0KLWNvbW1vblxtYWxsb2MuYw0KLWNvbW1vblxtdHJyLmMNCi1jb21tb25ccGNpbGliLmMNCi1jb21tb25cdW5peGlvLmMNCi1jb21tb25cdmdhc3RhdGUuYw0KLVtBU1NPQ0lBVElPTl0NCi1bQ09ORklHVVJBVElPTlNdDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1kb3MudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1kb3MudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU3NTEzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtZG9zLnZwagorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVtTY2lUZWNoXQ0KLWNvbXBpbGVyPXdjMTAtIA0KLXRhcmdldG9zPWQzMiANCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sVEVTVF9IQVJORVNTPTENCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMCANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmogLXUgJWINCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsICViDQotcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdSAlYg0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6QyZsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi1kb3NcX2V2ZW50LmFzbQ0KLWRvc1xfbHp0aW1lci5hc20NCi1kb3NcX3BtLmFzbQ0KLWRvc1xfcG1kb3MuYXNtDQotZG9zXF92ZmxhdC5hc20NCi1kb3NcY3B1aW5mby5jDQotZG9zXGV2ZW50LmMNCi1kb3Ncb3NoZHIuaA0KLWRvc1xwbS5jDQotZG9zXHBtZG9zLmMNCi1kb3NcdmZsYXQuYw0KLWRvc1x6dGltZXIuYw0KLVtBU1NPQ0lBVElPTl0NCi1bQ09ORklHVVJBVElPTlNdDQotY29uZmlnPSxOT1JNQUxfQlVJTEQ9MQ0KLWNvbmZpZz0sVEVTVF9IQVJORVNTPTENCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWxpbnV4LnZwaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbGludXgudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmZiZjg0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbGludXgudnBqCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9Z2NjMi0NCi10YXJnZXRvcz1saW51eA0KLVtDT01QSUxFUl0NCi12ZXJzaW9uPTUuMGINCi1NQUNSTz1lbmFibGVfY3VycmVudF9jb21waWxlclxuDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotYWN0aXZlY29uZmlnPSxpbnN0YWxsIEJVSUxEX0RMTD0xDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vIC11DQotbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgJWINCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgY2xlYW5leGUgJiBkbWFrZSAtdSAlYg0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6QyZsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi1saW51eFxjcHVpbmZvLmMNCi1saW51eFxldmVudC5jDQotbGludXhcb3NoZHIuaA0KLWxpbnV4XHBtLmMNCi1saW51eFx2ZmxhdC5jDQotbGludXhcenRpbWVyLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KLWNvbmZpZz0saW5zdGFsbCBCVUlMRF9ETEw9MQ0KLWNvbmZpZz0saW5zdGFsbA0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbnRkcnYudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1udGRydi52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzM1YTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1udGRydi52cGoKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1bU2NpVGVjaF0NCi1jb21waWxlcj12YzYwLSANCi10YXJnZXRvcz1kcnZ3MmsNCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMA0KLUZJTFRFUkFQUENPTU1BTkQ9XG5cblxuDQotdmNzcHJvamVjdD1TQ0M6UGVyZm9yY2UgU0NNOi8vZGVwb3QNCi12Y3Nsb2NhbHBhdGg9U0NDOlBlcmZvcmNlIFNDTTpjOlwNCi1jb21waWxlPWNvbmN1cnxjYXB0dXJlfDpDb21waWxlOiZDb21waWxlLGRtYWtlICVuLm9iag0KLW1ha2U9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLGRtYWtlIGluc3RhbGwNCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgY2xlYW5leGUgJiBkbWFrZSBpbnN0YWxsIC11DQotZGVidWc9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXw6RGVidWc6JkRlYnVnLA0KLWV4ZWN1dGU9aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6RXhlY3V0ZTpFJnhlY3V0ZSwNCi11c2VyMT1oaWRlfDpVc2VyIDE6VXNlciAxLA0KLXVzZXIyPWhpZGV8OlVzZXIgMjpVc2VyIDIsDQotdXNlcnRvb2xfY2xlYW5fZGlyZWN0b3J5PWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkNsZWFuIERpcmVjdG9yeTomQ2xlYW4gRGlyZWN0b3J5LGRtYWtlIGNsZWFuZXhlDQotd29ya2luZ2Rpcj0uDQotaW5jbHVkZWRpcnM9JShTQ0lURUNIKVxpbmNsdWRlOyUoUFJJVkFURSlcaW5jbHVkZQ0KLXJlZmZpbGU9DQotW0ZJTEVTXQ0KLS4uXC4uXGluY2x1ZGVcbnRkcml2ZXIuaA0KLW50ZHJ2XF9wbS5hc20NCi1udGRydlxjcHVpbmZvLmMNCi1udGRydlxpbnQ4Ni5jDQotbnRkcnZcaXJxLmMNCi1udGRydlxtZW0uYw0KLW50ZHJ2XG9zaGRyLmgNCi1udGRydlxwbS5jDQotbnRkcnZcc3RkaW8uYw0KLW50ZHJ2XHN0ZGxpYi5jDQotbnRkcnZcdmZsYXQuYw0KLW50ZHJ2XHp0aW1lci5jDQotW0FTU09DSUFUSU9OXQ0KLVtDT05GSUdVUkFUSU9OU10NCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXFueC52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXFueC52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDE3MDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1xbngudnBqCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9d2MxMC0NCi10YXJnZXRvcz1xbngNCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMA0KLUZJTFRFUkFQUENPTU1BTkQ9XG5cblxuDQotdmNzcHJvamVjdD1TQ0M6UGVyZm9yY2UgU0NNOi8vZGVwb3QNCi12Y3Nsb2NhbHBhdGg9U0NDOlBlcmZvcmNlIFNDTTpjOlwNCi1jb21waWxlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfDpDb21waWxlOiZDb21waWxlLGRtYWtlICVuLm9iag0KLW1ha2U9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLGRtYWtlIGluc3RhbGwNCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgY2xlYW5leGUgJiBkbWFrZSBpbnN0YWxsIC11DQotZGVidWc9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXw6RGVidWc6JkRlYnVnLA0KLWV4ZWN1dGU9aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6RXhlY3V0ZTpFJnhlY3V0ZSwNCi11c2VyMT1oaWRlfDpVc2VyIDE6VXNlciAxLA0KLXVzZXIyPWhpZGV8OlVzZXIgMjpVc2VyIDIsDQotdXNlcnRvb2xfY2xlYW5fZGlyZWN0b3J5PWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkNsZWFuIERpcmVjdG9yeTpDJmxlYW4gRGlyZWN0b3J5LGRtYWtlIGNsZWFuZXhlDQotd29ya2luZ2Rpcj0uDQotaW5jbHVkZWRpcnM9JShTQ0lURUNIKVxpbmNsdWRlOyUoUFJJVkFURSlcaW5jbHVkZQ0KLXJlZmZpbGU9DQotW0ZJTEVTXQ0KLXFueFxfbXRycnFueC5hc20NCi1xbnhcY3B1aW5mby5jDQotcW54XGV2ZW50LmMNCi1xbnhcbXRycnFueC5jDQotcW54XG9zaGRyLmgNCi1xbnhccG0uYw0KLXFueFx2ZmxhdC5jDQotcW54XHp0aW1lci5jDQotW0FTU09DSUFUSU9OXQ0KLVtDT05GSUdVUkFUSU9OU10NCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXZ4ZC52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXZ4ZC52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2Y5MTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG12eGQudnBqCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9YmM1MC0NCi10YXJnZXRvcz12eGQNCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMCANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxub2NoYW5nZWRpcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8bm9jaGFuZ2VkaXJ8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsDQotcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfG5vY2hhbmdlZGlyfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdQ0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6JkNsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi12eGRcX3BtLmFzbQ0KLXZ4ZFxjcHVpbmZvLmMNCi12eGRcZmlsZWlvLmMNCi12eGRcb3NoZHIuaA0KLXZ4ZFxwbS5jDQotdnhkXHZmbGF0LmMNCi12eGRcenRpbWVyLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Btd2luMzIudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG13aW4zMi52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTY4MjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG13aW4zMi52cGoKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1bU2NpVGVjaF0NCi1jb21waWxlcj12YzYwLSANCi10YXJnZXRvcz1jMzIgDQotW0NPTVBJTEVSXQ0KLXZlcnNpb249NS4wYg0KLU1BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCi1hY3RpdmVjb25maWc9LHdjMTAtZDMyDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDAgDQotRklMVEVSQVBQQ09NTUFORD1cblxuXG4NCi12Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KLXZjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KLWNvbXBpbGU9Y29uY3VyfGNhcHR1cmV8OkNvbXBpbGU6JkNvbXBpbGUsZG1ha2UgJW4ub2JqDQotbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgaW5zdGFsbA0KLXJlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6UmVidWlsZDomUmVidWlsZCxkbWFrZSBjbGVhbmV4ZSAmIGRtYWtlIGluc3RhbGwgLXUNCi1kZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfDpEZWJ1ZzomRGVidWcsDQotZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KLXVzZXIxPWhpZGV8OlVzZXIgMTpVc2VyIDEsDQotdXNlcjI9aGlkZXw6VXNlciAyOlVzZXIgMiwNCi11c2VydG9vbF9jbGVhbl9kaXJlY3Rvcnk9Y29uY3VyfGNhcHR1cmV8c2F2ZW5vbmV8OkNsZWFuIERpcmVjdG9yeTomQ2xlYW4gRGlyZWN0b3J5LGRtYWtlIGNsZWFuZXhlDQotd29ya2luZ2Rpcj0uDQotaW5jbHVkZWRpcnM9JShTQ0lURUNIKVxpbmNsdWRlOyUoUFJJVkFURSlcaW5jbHVkZQ0KLXJlZmZpbGU9DQotW0ZJTEVTXQ0KLXdpbjMyXF9wbXdpbjMyLmFzbQ0KLXdpbjMyXGNwdWluZm8uYw0KLXdpbjMyXGRkcmF3LmMNCi13aW4zMlxldmVudC5jDQotd2luMzJcb3NoZHIuaA0KLXdpbjMyXHBtLmMNCi13aW4zMlx2ZmxhdC5jDQotd2luMzJcenRpbWVyLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9fbXRycnFueC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvX210cnJxbnguYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTNmZTEwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9fbXRycnFueC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgTkFTTQotOyogRW52aXJvbm1lbnQ6IFFOWAotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJsZXIgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyCi07KiAgICAgICAgICAgICAgKE1UUlIpIG1vZHVsZSBmb3IgUU5YLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX210cnJxbnggICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9tdHJycW54ICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWlmZGVmICAgVVNFX05BU00KLSVkZWZpbmUgUjBfRkxVU0hfVExCICAgIDAKLSVkZWZpbmUgUjBfU0FWRV9DUjQgICAgIDEKLSVkZWZpbmUgUjBfUkVTVE9SRV9DUjQgIDIKLSVkZWZpbmUgUjBfUkVBRF9NU1IgICAgIDMKLSVkZWZpbmUgUjBfV1JJVEVfTVNSICAgIDQKLWVsc2UKLVIwX0ZMVVNIX1RMQiAgICAgICAgRVFVIDAKLVIwX1NBVkVfQ1I0ICAgICAgICAgRVFVIDEKLVIwX1JFU1RPUkVfQ1I0ICAgICAgRVFVIDIKLVIwX1JFQURfTVNSICAgICAgICAgRVFVIDMKLVIwX1dSSVRFX01TUiAgICAgICAgRVFVIDQKLWVuZGlmCi0KLWNwdWJsaWMgX1BNX1IwCi1fUE1fUjBfc2VydmljZSAgICAgIGRkICAwCi1fUE1fUjBfcmVnICAgICAgICAgIGRkICAwCi1fUE1fUjBfZWF4ICAgICAgICAgIGRkICAwCi1fUE1fUjBfZWR4ICAgICAgICAgIGRkICAwCi0KLWVuZGRhdGFzZWcgIF9tdHJycW54ICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWJlZ2NvZGVzZWcgIF9tdHJycW54ICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLVA1ODYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX01UUlJfZGlzYWJsZUludCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybiBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cyBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9NVFJSX2Rpc2FibGVJbnQKLQotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1dCBmbGFnIHdvcmQgb24gc3RhY2sKLTsgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBEaXNhYmxlIGludGVycnVwdHMhCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgZGVwb3NpdCBmbGFnIHdvcmQgaW4gcmV0dXJuIHJlZ2lzdGVyCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3Jlc3RvcmVJbnQodWxvbmcgcHMpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVzdG9yZSBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9yZXN0b3JlSW50Ci0KLSAgICAgICAgQVJHICAgICBwczpVTE9ORwotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcCAgICAgICAgIDsgU2V0IHVwIHN0YWNrIGZyYW1lCi0gICAgICAgIHB1c2ggICAgW1VMT05HIHBzXQotICAgICAgICBwb3BmZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgcHJvY2Vzc29yIHN0YXR1cyAoYW5kIGludGVycnVwdHMpCi0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfTVRSUl9nZXRDeDg2KHVjaGFyIHJlZyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9nZXRDeDg2Ci0KLSAgICAgICAgQVJHICAgICByZWc6VUNIQVIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgYWwsW3JlZ10KLSAgICAgICAgb3V0ICAgICAyMmgsYWwKLSAgICAgICAgaW4gICAgICBhbCwyM2gKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX01UUlJfc2V0Q3g4Nih1Y2hhciByZWcsdWNoYXIgdmFsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9zZXRDeDg2Ci0KLSAgICAgICAgQVJHICAgICByZWc6VUNIQVIsIHZhbDpVQ0hBUgotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBhbCxbcmVnXQotICAgICAgICBvdXQgICAgIDIyaCxhbAotICAgICAgICBtb3YgICAgIGFsLFt2YWxdCi0gICAgICAgIG91dCAgICAgMjNoLGFsCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9QTV9yaW5nMF9pc3Iodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSaW5nIDAgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgdGhhdCB3ZSB1c2UgdG8gZXhlY3V0ZSB0aGUgTVRSUiBzdXBwb3J0Ci07IGNvZGUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NuZWFyICAgX1BNX3JpbmcwX2lzcgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9mbHVzaFRMQih2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgY21wICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLFIwX0ZMVVNIX1RMQgotICAgICAgICBqbmUgICAgIEBAMQotICAgICAgICB3YmludmQgICAgICAgICAgICAgICAgICA7IEZsdXNoIHRoZSBDUFUgY2FjaGUKLSAgICAgICAgbW92ICAgICBlYXgsY3IzICAgICAgICAgCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgIDsgRmx1c2ggdGhlIFRMQgotICAgICAgICBqbXAgICAgIEBARXhpdAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX01UUlJfc2F2ZUNSNCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQEAxOiAgICBjbXAgICAgIFtEV09SRCBfUE1fUjBfc2VydmljZV0sUjBfU0FWRV9DUjQKLSAgICAgICAgam5lICAgICBAQDIKLQotOyBTYXZlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykKLQotICAgICAgICBtb3YgICAgIGVieCxjcjQKLSAgICAgICAgbW92ICAgICBlYXgsZWJ4Ci0gICAgICAgIGFuZCAgICAgYWwsN0ZoCi0gICAgICAgIG1vdiAgICAgY3I0LGVheAotCi07IERpc2FibGUgYW5kIGZsdXNoIGNhY2hlcwotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMAotICAgICAgICBvciAgICAgIGVheCw0MDAwMDAwMGgKLSAgICAgICAgd2JpbnZkCi0gICAgICAgIG1vdiAgICAgY3IwLGVheAotICAgICAgICB3YmludmQKLQotOyBSZXR1cm4gdmFsdWUgZnJvbSBDUjQKLQotICAgICAgICBtb3YgICAgIFtfUE1fUjBfcmVnXSxlYngKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX01UUlJfcmVzdG9yZUNSNCh1bG9uZyBjcjRWYWwpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBAMjogICAgY21wICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLFIwX1JFU1RPUkVfQ1I0Ci0gICAgICAgIGpuZSAgICAgQEAzCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IwCi0gICAgICAgIGFuZCAgICAgZWF4LDBCRkZGRkZGRmgKLSAgICAgICAgbW92ICAgICBjcjAsZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LFtfUE1fUjBfcmVnXQotICAgICAgICBtb3YgICAgIGNyNCxlYXgKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX01UUlJfcmVhZE1TUihpbnQgcmVnLCB1bG9uZyBGQVIgKmVheCwgdWxvbmcgRkFSICplZHgpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AQDM6ICAgIGNtcCAgICAgW0RXT1JEIF9QTV9SMF9zZXJ2aWNlXSxSMF9SRUFEX01TUgotICAgICAgICBqbmUgICAgIEBANAotCi0gICAgICAgIG1vdiAgICAgZWN4LFtfUE1fUjBfcmVnXQotICAgICAgICByZG1zcgotICAgICAgICBtb3YgICAgIFtfUE1fUjBfZWF4XSxlYXgKLSAgICAgICAgbW92ICAgICBbX1BNX1IwX2VkeF0sZWR4Ci0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3dyaXRlTVNSKGludCByZWcsIHVsb25nIGVheCwgdWxvbmcgZWR4KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQEA0OiAgICBjbXAgICAgIFtEV09SRCBfUE1fUjBfc2VydmljZV0sUjBfV1JJVEVfTVNSCi0gICAgICAgIGpuZSAgICAgQEBFeGl0Ci0KLSAgICAgICAgbW92ICAgICBlY3gsW19QTV9SMF9yZWddCi0gICAgICAgIG1vdiAgICAgZWF4LFtfUE1fUjBfZWF4XQotICAgICAgICBtb3YgICAgIGVkeCxbX1BNX1IwX2VkeF0KLSAgICAgICAgd3Jtc3IKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotQEBFeGl0OiBtb3YgICAgIFtEV09SRCBfUE1fUjBfc2VydmljZV0sLTEKLSAgICAgICAgcG9wYWQKLSAgICAgICAgbW92ICAgICBlYXgsMAotICAgICAgICByZXRmCi0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9tdHJycW54Ci0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3ODI1NDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFFOWAotKgotKiBEZXNjcmlwdGlvbjogIFFOWCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRPRE86IFdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmb3IgUU5YIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRPRE86IFdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmb3IgUU5YIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIGZyZXEtPmxvdyA9IENMT0NLU19QRVJfU0VDICogMTAwMDsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmxvdyA9IGNsb2NrKCkgKiAxMDAwOyAgXAotICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWNkNTE0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlgKLSoKLSogRGVzY3JpcHRpb246ICBRTlggZnVsbHNjcmVlbiBjb25zb2xlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaAotKiAgICAgICAgICAgICAgIGNyb3NzIHBsYXRmb3JtIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBfX1FOWE5UT19fCi1zdGF0aWMgc3RydWN0IF9tb3VzZV9jdHJsICAgKl9QTV9tb3VzZV9jdGw7Ci1zdGF0aWMgaW50ICAgICAgICAgIF9QTV9rZXlib2FyZF9mZCA9IC0xOwotLypzdGF0aWMgaW50ICAgICAgICAgICAgX1BNX21vZGlmaWVycywgX1BNX2xlZHM7ICovCi0jZWxzZQotc3RhdGljIGludCAgICAgICAgICBrYmRfZmQgPSAtMSwgbW91c2VfZmQgPSAtMTsKLSNlbmRpZgotc3RhdGljIGludCAgICAgICAgICBraWxsX3BpZCA9IDA7Ci1zdGF0aWMgdXNob3J0ICAgICAgIGtleVVwTXNnWzI1Nl0gPSB7MH07LyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLwotc3RhdGljIGludCAgICAgICAgICByYW5nZVgscmFuZ2VZOyAgICAgIC8qIFJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzICAgKi8KLQotI2RlZmluZSBUSU1FX1RPX01TRUMoX190KSAgICgoX190KS50dl9uc2VjIC8gMTAwMDAwMCArIChfX3QpLnR2X3NlYyAqIDEwMDApCi0KLSNkZWZpbmUgTEVEX05VTSAgICAgICAgIDEKLSNkZWZpbmUgTEVEX0NBUCAgICAgICAgIDIKLSNkZWZpbmUgTEVEX1NDUiAgICAgICAgIDQKLQotLyogU2NhbmNvZGUgbWFwcGluZ3Mgb24gUU5YIGZvciBzcGVjaWFsIGtleXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBzY2FuOwotICAgIGludCBtYXA7Ci0gICAgfSBrZXltYXA7Ci0KLS8qIFRPRE86IEZpeCB0aGlzIGFuZCBzZXQgaXQgdXAgc28gd2UgY2FuIGRvIGEgYmluYXJ5IHNlYXJjaCEgKi8KLQota2V5bWFwIGtleW1hcHNbXSA9IHsKLSAgICB7OTYsIEtCX3BhZEVudGVyfSwKLSAgICB7NzQsIEtCX3BhZE1pbnVzfSwKLSAgICB7NzgsIEtCX3BhZFBsdXN9LAotICAgIHs1NSwgS0JfcGFkVGltZXN9LAotICAgIHs5OCwgS0JfcGFkRGl2aWRlfSwKLSAgICB7NzEsIEtCX3BhZEhvbWV9LAotICAgIHs3MiwgS0JfcGFkVXB9LAotICAgIHs3MywgS0JfcGFkUGFnZVVwfSwKLSAgICB7NzUsIEtCX3BhZExlZnR9LAotICAgIHs3NiwgS0JfcGFkQ2VudGVyfSwKLSAgICB7NzcsIEtCX3BhZFJpZ2h0fSwKLSAgICB7NzksIEtCX3BhZEVuZH0sCi0gICAgezgwLCBLQl9wYWREb3dufSwKLSAgICB7ODEsIEtCX3BhZFBhZ2VEb3dufSwKLSAgICB7ODIsIEtCX3BhZEluc2VydH0sCi0gICAgezgzLCBLQl9wYWREZWxldGV9LAotICAgIHsxMDUsS0JfbGVmdH0sCi0gICAgezEwOCxLQl9kb3dufSwKLSAgICB7MTA2LEtCX3JpZ2h0fSwKLSAgICB7MTAzLEtCX3VwfSwKLSAgICB7MTEwLEtCX2luc2VydH0sCi0gICAgezEwMixLQl9ob21lfSwKLSAgICB7MTA0LEtCX3BhZ2VVcH0sCi0gICAgezExMSxLQl9kZWxldGV9LAotICAgIHsxMDcsS0JfZW5kfSwKLSAgICB7MTA5LEtCX3BhZ2VEb3dufSwKLSAgICB7MTI1LEtCX2xlZnRXaW5kb3dzfSwKLSAgICB7MTI2LEtCX3JpZ2h0V2luZG93c30sCi0gICAgezEyNyxLQl9tZW51fSwKLSAgICB7MTAwLEtCX3JpZ2h0QWx0fSwKLSAgICB7OTcsS0JfcmlnaHRDdHJsfSwKLSAgICB9OwotCi0vKiBBbmQgdGhlIGtleXBhZCB3aXRoIG51bSBsb2NrIHR1cm5lZCBvbiAoY2hhbmdlcyB0aGUgQVNDSUkgY29kZSBvbmx5KSAqLwotCi1rZXltYXAga2V5cGFkW10gPSB7Ci0gICAgezcxLCBBU0NJSV83fSwKLSAgICB7NzIsIEFTQ0lJXzh9LAotICAgIHs3MywgQVNDSUlfOX0sCi0gICAgezc1LCBBU0NJSV80fSwKLSAgICB7NzYsIEFTQ0lJXzV9LAotICAgIHs3NywgQVNDSUlfNn0sCi0gICAgezc5LCBBU0NJSV8xfSwKLSAgICB7ODAsIEFTQ0lJXzJ9LAotICAgIHs4MSwgQVNDSUlfM30sCi0gICAgezgyLCBBU0NJSV8wfSwKLSAgICB7ODMsIEFTQ0lJX3BlcmlvZH0sCi0gICAgfTsKLQotI2RlZmluZSBOQl9LRVlNQVBTIChzaXplb2Yoa2V5bWFwcykvc2l6ZW9mKGtleW1hcHNbMF0pKQotI2RlZmluZSBOQl9LRVlQQUQgKHNpemVvZihrZXlwYWQpL3NpemVvZihrZXlwYWRbMF0pKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluY2x1ZGUgZ2VuZXJpYyByYXcgc2NhbmNvZGUga2V5Ym9hcmQgbW9kdWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJjb21tb24va2V5Ym9hcmQuYyIKLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIFFOWCAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCi1zdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwotdGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgotZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKLSAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCZ0KTsKLSAgICByZXR1cm4gKHQudHZfbnNlYyAvIDEwMDAwMDAgKyB0LnR2X3NlYyAqIDEwMDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbnZlcnRzIGEgbWlja2V5IG1vdmVtZW50IHZhbHVlIHRvIGEgcGl4ZWwgYWRqdXN0bWVudCB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IE1pY2tleVRvUGl4ZWwoCi0gICAgaW50IG1pY2tleSkKLXsKLSAgICAvKiBUT0RPOiBXZSBjYW4gYWRkIHNvbWUgY29kZSBpbiBoZXJlIHRvIGhhbmRsZSAnYWNjZWxlcmF0aW9uJyBmb3IgKi8KLSAgICAvKiAgICAgICB0aGUgbW91c2UgY3Vyc29yLiBGb3Igbm93IGp1c3QgdXNlIHRoZSBtaWNrZXlzLiAqLwotICAgIHJldHVybiBtaWNrZXk7Ci19Ci0KLSNpZmRlZiBfX1FOWE5UT19fCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHJpZXZlcyBhbGwgZXZlbnRzIGZyb20gdGhlIG1vdXNlL2tleWJvYXJkIGV2ZW50IHF1ZXVlIGFuZCBzdHVmZnMgdGhlbQotaW50byB0aGUgTUdMIGV2ZW50IHF1ZXVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKLXsKLSAgICBpbnQgICAgICAgICByYzEsIHJjMjsKLSAgICBzdHJ1Y3QgX2tleWJvYXJkX3BhY2tldCBrZXk7Ci0gICAgc3RydWN0IF9tb3VzZV9wYWNrZXQgICAgbXM7Ci0gICAgc3RhdGljIGxvbmcgICAgIG9sZF9idXR0b25zID0gMDsKLSAgICB1aW50ICAgICAgICAgICAgbWVzc2FnZSA9IDAsIGJ1dF9zdGF0ID0gMCwgbW9kcyA9IDA7Ci0gICAgZXZlbnRfdCAgICAgICAgIGV2dDsKLQotICAgIHdoaWxlIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JcmMxID0gcmVhZChrYmRfZmQsICh2b2lkICopJmtleSwgc2l6ZW9mKGtleSkpOwotCWlmIChyYzEgPT0gLTEpIHsKLQkgICAgaWYgKGVycm5vID09IEVBR0FJTikKLQkJcmMxID0gMDsKLQkgICAgZWxzZSB7Ci0JCXBlcnJvcigiZ2V0RXZlbnRzIik7Ci0JCVBNX2ZhdGFsRXJyb3IoIktleWJvYXJkIGVycm9yIik7Ci0JCX0KLQkgICAgfQotCWlmIChyYzEgPiAwKSB7Ci0JICAgIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0JICAgIGlmIChrZXkuZGF0YS5tb2RpZmllcnMgJiBLRVlNT0RfU0hJRlQpCi0JCW1vZHMgfD0gRVZUX0xFRlRTSElGVDsKLQkgICAgaWYgKGtleS5kYXRhLm1vZGlmaWVycyAmIEtFWU1PRF9DVFJMKQotCQltb2RzIHw9IEVWVF9DVFJMU1RBVEU7Ci0JICAgIGlmIChrZXkuZGF0YS5tb2RpZmllcnMgJiBLRVlNT0RfQUxUKQotCQltb2RzIHw9IEVWVF9BTFRTVEFURTsKLQotCSAgICAvKiBOb3cgc3RvcmUgdGhlIGtleWJvYXJkIGV2ZW50IGRhdGEgKi8KLQkgICAgZXZ0LndoZW4gPSBUSU1FX1RPX01TRUMoa2V5LnRpbWUpOwotCSAgICBpZiAoa2V5LmRhdGEuZmxhZ3MgJiBLRVlfU0NBTl9WQUxJRCkKLQkJZXZ0Lm1lc3NhZ2UgfD0gKGtleS5kYXRhLmtleV9zY2FuICYgMHg3RikgPDwgODsKLQkgICAgaWYgKChrZXkuZGF0YS5mbGFncyAmIEtFWV9TWU1fVkFMSUQpICYmCi0JCSgoKGtleS5kYXRhLmtleV9zeW0gJiAweGZmMDApID09IDB4ZjAwMCAmJgotCQkoa2V5LmRhdGEua2V5X3N5bSAmIDB4ZmYpIDwgMHgyMCkgfHwKLQkJa2V5LmRhdGEua2V5X3N5bSA8IDB4ODApKQotCQlldnQubWVzc2FnZSB8PSAoa2V5LmRhdGEua2V5X3N5bSAmIDB4RkYpOwotCSAgICBldnQubW9kaWZpZXJzID0gbW9kczsKLQkgICAgaWYgKGtleS5kYXRhLmZsYWdzICYgS0VZX0RPV04pIHsKLQkJZXZ0LndoYXQgPSBFVlRfS0VZRE9XTjsKLQkJa2V5VXBNc2dbZXZ0Lm1lc3NhZ2UgPj4gOF0gPSAodXNob3J0KWV2dC5tZXNzYWdlOwotCQl9Ci0JICAgIGVsc2UgaWYgKGtleS5kYXRhLmZsYWdzICYgS0VZX1JFUEVBVCkgewotCQlldnQubWVzc2FnZSB8PSAweDEwMDAwOwotCQlldnQud2hhdCA9IEVWVF9LRVlSRVBFQVQ7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCWV2dC53aGF0ID0gRVZUX0tFWVVQOwotCQlldnQubWVzc2FnZSA9IGtleVVwTXNnW2V2dC5tZXNzYWdlID4+IDhdOwotCQlpZiAoZXZ0Lm1lc3NhZ2UgPT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCQlrZXlVcE1zZ1tldnQubWVzc2FnZSA+PiA4XSA9IDA7Ci0JCX0KLQotCSAgICAvKiBOb3cgYWRkIHRoZSBuZXcgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlICovCi0JICAgIGFkZEV2ZW50KCZldnQpOwotCSAgICB9Ci0JcmMyID0gcmVhZChtb3VzZV9mZCwgKHZvaWQgKikmbXMsIHNpemVvZiAobXMpKTsKLQlpZiAocmMyID09IC0xKSB7Ci0JICAgIGlmIChlcnJubyA9PSBFQUdBSU4pCi0JCXJjMiA9IDA7Ci0JICAgIGVsc2UgewotCQlwZXJyb3IoImdldEV2ZW50cyIpOwotCQlQTV9mYXRhbEVycm9yKCJNb3VzZSBlcnJvciIpOwotCQl9Ci0JICAgIH0KLQlpZiAocmMyID4gMCkgewotCSAgICBtZW1zZXQoJmV2dCwgMCwgc2l6ZW9mKGV2dCkpOwotCSAgICBtcy5oZHIuYnV0dG9ucyAmPQotCQkoX1BPSU5URVJfQlVUVE9OX0xFRlQgfCBfUE9JTlRFUl9CVVRUT05fUklHSFQpOwotCSAgICBpZiAobXMuaGRyLmJ1dHRvbnMgJiBfUE9JTlRFUl9CVVRUT05fTEVGVCkKLQkJYnV0X3N0YXQgPSBFVlRfTEVGVEJVVDsKLQkgICAgaWYgKChtcy5oZHIuYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9MRUZUKSAhPQotCQkob2xkX2J1dHRvbnMgJiBfUE9JTlRFUl9CVVRUT05fTEVGVCkpCi0JCW1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCSAgICBpZiAobXMuaGRyLmJ1dHRvbnMgJiBfUE9JTlRFUl9CVVRUT05fUklHSFQpCi0JCWJ1dF9zdGF0IHw9IEVWVF9SSUdIVEJVVDsKLQkgICAgaWYgKChtcy5oZHIuYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9SSUdIVCkgIT0KLQkJKG9sZF9idXR0b25zICYgX1BPSU5URVJfQlVUVE9OX1JJR0hUKSkKLQkJbWVzc2FnZSB8PSBFVlRfUklHSFRCTUFTSzsKLQkgICAgaWYgKG1zLmR4IHx8IG1zLmR5KSB7Ci0JCW1zLmR5ID0gLW1zLmR5OwotCQlFVlQubXggKz0gTWlja2V5VG9QaXhlbChtcy5keCk7Ci0JCUVWVC5teSArPSBNaWNrZXlUb1BpeGVsKG1zLmR5KTsKLQkJaWYgKEVWVC5teCA8IDApIEVWVC5teCA9IDA7Ci0JCWlmIChFVlQubXkgPCAwKSBFVlQubXkgPSAwOwotCQlpZiAoRVZULm14ID4gcmFuZ2VYKSAgICBFVlQubXggPSByYW5nZVg7Ci0JCWlmIChFVlQubXkgPiByYW5nZVkpICAgIEVWVC5teSA9IHJhbmdlWTsKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOwotCQlldnQud2hlbiA9IFRJTUVfVE9fTVNFQyhtcy5oZHIudGltZSk7Ci0JCWV2dC53aGVyZV94ID0gRVZULm14OwotCQlldnQud2hlcmVfeSA9IEVWVC5teTsKLQkJZXZ0LnJlbGF0aXZlX3ggPSBtcy5keDsKLQkJZXZ0LnJlbGF0aXZlX3kgPSBtcy5keTsKLQkJZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OwotCQlhZGRFdmVudCgmZXZ0KTsKLQkJfQotCSAgICBldnQud2hhdCA9IG1zLmhkci5idXR0b25zIDwgb2xkX2J1dHRvbnMgPwotCQlFVlRfTU9VU0VVUCA6IEVWVF9NT1VTRURPV047Ci0JICAgIGV2dC53aGVuID0gVElNRV9UT19NU0VDKG1zLmhkci50aW1lKTsKLQkgICAgZXZ0LndoZXJlX3ggPSBFVlQubXg7Ci0JICAgIGV2dC53aGVyZV95ID0gRVZULm15OwotCSAgICBldnQucmVsYXRpdmVfeCA9IG1zLmR4OwotCSAgICBldnQucmVsYXRpdmVfeSA9IG1zLmR5OwotCSAgICBldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7Ci0JICAgIGV2dC5tZXNzYWdlID0gbWVzc2FnZTsKLQkgICAgaWYgKG1zLmhkci5idXR0b25zICE9IG9sZF9idXR0b25zKSB7Ci0JCWFkZEV2ZW50KCZldnQpOwotCQlvbGRfYnV0dG9ucyA9IG1zLmhkci5idXR0b25zOwotCQl9Ci0JICAgIH0KLQlpZiAocmMxICsgcmMyID09IDApCi0JICAgIGJyZWFrOwotCX0KLX0KLSNlbHNlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHJpZXZlcyBhbGwgZXZlbnRzIGZyb20gdGhlIG1vdXNlL2tleWJvYXJkIGV2ZW50IHF1ZXVlIGFuZCBzdHVmZnMgdGhlbQotaW50byB0aGUgTUdMIGV2ZW50IHF1ZXVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKLXsKLSAgICBzdHJ1Y3QgbW91c2VfZXZlbnQgICAgICBldjsKLSAgICBpbnQgICAgICAgICAgICAgcmM7Ci0gICAgc3RhdGljIGxvbmcgICAgICAgICBvbGRfYnV0dG9ucyA9IDA7Ci0gICAgdWludCAgICAgICAgICAgICAgICBtZXNzYWdlID0gMCwgYnV0X3N0YXQgPSAwOwotICAgIGV2ZW50X3QgICAgICAgICAgICAgZXZ0OwotICAgIGNoYXIgICAgICAgICAgICAgICAgYnVmWzMyXTsKLSAgICBpbnQgICAgICAgICAgICAgbnVta2V5cywgaTsKLQotICAgIC8qIFBvbGwga2V5Ym9hcmQgZXZlbnRzICovCi0gICAgd2hpbGUgKChudW1rZXlzID0gcmVhZChfUE1fa2V5Ym9hcmRfZmQsIGJ1Ziwgc2l6ZW9mIGJ1ZikpID4gMCkgewotCWZvciAoaSA9IDA7IGkgPCBudW1rZXlzOyBpKyspIHsKLQkgICAgcHJvY2Vzc1Jhd1NjYW5Db2RlKGJ1ZltpXSk7Ci0JICAgIH0KLQl9Ci0KLSAgICBpZiAoX1BNX21vdXNlX2N0bCA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIC8qIEdvYmJsZSBwZW5kaW5nIG1vdXNlIGV2ZW50cyAqLwotICAgIHdoaWxlIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JcmMgPSBtb3VzZV9yZWFkKF9QTV9tb3VzZV9jdGwsICZldiwgMSwgMCwgTlVMTCk7Ci0JaWYgKHJjID09IC0xKSB7Ci0JICAgIHBlcnJvcigiZ2V0RXZlbnRzIik7Ci0JICAgIFBNX2ZhdGFsRXJyb3IoIk1vdXNlIGVycm9yIChJbnB1dCB0ZXJtaW5hdGVkPykiKTsKLQkgICAgfQotCWlmIChyYyA9PSAwKQotCSAgICBicmVhazsKLQotCW1lc3NhZ2UgPSAwLCBidXRfc3RhdCA9IDA7Ci0JbWVtc2V0KCZldnQsIDAsIHNpemVvZihldnQpKTsKLQotCWV2LmJ1dHRvbnMgJj0gKF9NT1VTRV9MRUZUIHwgX01PVVNFX1JJR0hUKTsKLQlpZiAoZXYuYnV0dG9ucyAmIF9NT1VTRV9MRUZUKQotCSAgICBidXRfc3RhdCA9IEVWVF9MRUZUQlVUOwotCWlmICgoZXYuYnV0dG9ucyAmIF9NT1VTRV9MRUZUKSAhPSAob2xkX2J1dHRvbnMgJiBfTU9VU0VfTEVGVCkpCi0JICAgIG1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCWlmIChldi5idXR0b25zICYgX01PVVNFX1JJR0hUKQotCSAgICBidXRfc3RhdCB8PSBFVlRfUklHSFRCVVQ7Ci0JaWYgKChldi5idXR0b25zICYgX01PVVNFX1JJR0hUKSAhPSAob2xkX2J1dHRvbnMgJiBfTU9VU0VfUklHSFQpKQotCSAgICBtZXNzYWdlIHw9IEVWVF9SSUdIVEJNQVNLOwotCWlmIChldi5keCB8fCBldi5keSkgewotCSAgICBldi5keSA9IC1ldi5keTsKLQkgICAgRVZULm14ICs9IE1pY2tleVRvUGl4ZWwoZXYuZHgpOwotCSAgICBFVlQubXkgKz0gTWlja2V5VG9QaXhlbChldi5keSk7Ci0JICAgIGlmIChFVlQubXggPCAwKSBFVlQubXggPSAwOwotCSAgICBpZiAoRVZULm15IDwgMCkgRVZULm15ID0gMDsKLQkgICAgaWYgKEVWVC5teCA+IHJhbmdlWCkgICAgRVZULm14ID0gcmFuZ2VYOwotCSAgICBpZiAoRVZULm15ID4gcmFuZ2VZKSAgICBFVlQubXkgPSByYW5nZVk7Ci0JICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLQkgICAgZXZ0LndoZW4gPSBldi50aW1lc3RhbXAqMTAwOwotCSAgICBldnQud2hlcmVfeCA9IEVWVC5teDsKLQkgICAgZXZ0LndoZXJlX3kgPSBFVlQubXk7Ci0JICAgIGV2dC5yZWxhdGl2ZV94ID0gZXYuZHg7Ci0JICAgIGV2dC5yZWxhdGl2ZV95ID0gZXYuZHk7Ci0JICAgIGV2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKLQkgICAgYWRkRXZlbnQoJmV2dCk7Ci0JICAgIH0KLQlldnQud2hhdCA9IGV2LmJ1dHRvbnMgPCBvbGRfYnV0dG9ucyA/IEVWVF9NT1VTRVVQIDogRVZUX01PVVNFRE9XTjsKLQlldnQud2hlbiA9IGV2LnRpbWVzdGFtcCoxMDA7Ci0JZXZ0LndoZXJlX3ggPSBFVlQubXg7Ci0JZXZ0LndoZXJlX3kgPSBFVlQubXk7Ci0JZXZ0LnJlbGF0aXZlX3ggPSBldi5keDsKLQlldnQucmVsYXRpdmVfeSA9IGV2LmR5OwotCWV2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKLQlldnQubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JaWYgKGV2LmJ1dHRvbnMgIT0gb2xkX2J1dHRvbnMpIHsKLQkgICAgYWRkRXZlbnQoJmV2dCk7Ci0JICAgIG9sZF9idXR0b25zID0gZXYuYnV0dG9uczsKLQkgICAgfQotCX0KLX0KLSNlbmRpZiAgLyogX19RTlhOVE9fXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoCi0gICAgaW50IHNpZ25vKQotewotICAgIGNoYXIgICAgYnVmWzgwXTsKLQotICAgIEVWVF9leGl0KCk7Ci0gICAgc3ByaW50ZihidWYsIlRlcm1pbmF0aW5nIG9uIHNpZ25hbCAlZCIsc2lnbm8pOwotICAgIFBNX2ZhdGFsRXJyb3IoYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICBpbnQgICAgICAgICBpOwotICAgIHN0cnVjdCBzdGF0IHN0OwotICAgIGNoYXIgICAgICAgICppYXJnWzE2XTsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgY2hhciAgICAgICAgYnVmWzEyOF07Ci0gICAgRklMRSAgICAgICAgKnA7Ci0gICAgaW50ICAgICAgICAgYXJnbm8sbGVuOwotI2VuZGlmCi0KLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgVGhyZWFkQ3RsKF9OVE9fVENUTF9JTywgMCk7IC8qIFNvIGpveXN0aWNrIGNvZGUgd29uJ3QgYmxvdyB1cCAqLwotI2VuZGlmCi0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgaW5pdEV2ZW50UXVldWUoKTsKLSAgICBtZW1zZXQoa2V5VXBNc2csMCxzaXplb2Yoa2V5VXBNc2cpKTsKLQotI2lmZGVmIF9fUU5YTlRPX18KLSAgICAvKgotICAgICAqIFVzZXIgbWF5IGFscmVhZHkgaGF2ZSBpbnB1dCBydW5uaW5nIHdpdGggdGhlIHJpZ2h0IHBhcmFtZXRlcnMuCi0gICAgICogVGh1cyB0aGV5IGNvdWxkIHN0YXJ0IGlucHV0IGF0IGJvb3QgdGltZSwgdXNpbmcgdGhlIG91dHB1dCBvZgotICAgICAqIGlucHV0dHJhcCwgcGFzc2luZyB0aGUgdGhlIC1yIGZsYWcgdG8gbWFrZSBpdCBydW4gYXMgYSByZXNvdXJjZQotICAgICAqIG1hbmFnZXIuCi0gICAgICovCi0gICAgaWYgKChtb3VzZV9mZCA9IG9wZW4oIi9kZXYvbW91c2UwIiwgT19SRE9OTFkgfCBPX05PTkJMT0NLKSkgPCAwKSB7Ci0JLyogUnVuIGlucHV0dHJhcCB0byBnZXQgdGhlIGFyZ3MgZm9yIGlucHV0ICovCi0JaWYgKChwID0gcG9wZW4oImlucHV0dHJhcCIsICJyIikpID09IE5VTEwpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIkVycm9yIHJ1bm5pbmcgJ2lucHV0dHJhcCciKTsKLQlmZ2V0cyhidWYsIHNpemVvZihidWYpLCBwKTsKLQlwY2xvc2UocCk7Ci0KLQkvKiBCdWlsZCB0aGUgYXJndW1lbnQgbGlzdCAqLwotCWxlbiA9IHN0cmxlbihidWYpOwotCWlhcmdbMF0gPSBidWY7Ci0JZm9yIChpID0gMCwgYXJnbm8gPSAwOyBpIDwgbGVuICYmIGFyZ25vIDwgMTU7KSB7Ci0JICAgIGlmIChhcmdubyA9PSAxKSB7Ci0JCS8qCi0JCSAqIEFkZCBmbGFncyB0byBpbnB1dCdzIGFyZyBsaXN0LgotCQkgKiAnLXInIG1lYW5zIHJ1biBhcyByZXNvdXJjZQotCQkgKiBtYW5hZ2VyLCBwcm92aWRpbmcgdGhlIC9kZXYvbW91c2UKLQkJICogYW5kIC9kZXYva2V5Ym9hcmQgaW50ZXJmYWNlcy4KLQkJICogJy1QJyBzdXByZXNzZXMgdGhlIC9kZXYvcGhvdG9uCi0JCSAqIG1lY2hhbmlzbS4KLQkJICovCi0JCWlhcmdbYXJnbm8rK10gPSAiLVByIjsKLQkJY29udGludWU7Ci0JCX0KLQkgICAgd2hpbGUgKGJ1ZltpXSA9PSAnICcpCi0JCWkrKzsKLQkgICAgaWYgKGJ1ZltpXSA9PSAnXDAnIHx8IGJ1ZltpXSA9PSAnXG4nKQotCQlicmVhazsKLQkgICAgaWFyZ1thcmdubysrXSA9ICZidWZbaV07Ci0JICAgIHdoaWxlIChidWZbaV0gIT0gJyAnCi0JCSYmIGJ1ZltpXSAhPSAnXDAnICYmIGJ1ZltpXSAhPSAnXG4nKQotCQlpKys7Ci0JICAgIGJ1ZltpKytdID0gJ1wwJzsKLQkgICAgfQotCWlhcmdbYXJnbm9dID0gTlVMTDsKLQotCWlmICgoa2lsbF9waWQgPSBzcGF3bnZwKFBfTk9XQUlUTywgaWFyZ1swXSwgaWFyZykpID09IC0xKSB7Ci0JICAgIHBlcnJvcigic3Bhd25pbmcgaW5wdXQgcmVzbWdyIik7Ci0JICAgIFBNX2ZhdGFsRXJyb3IoIkNvdWxkIG5vdCBzdGFydCBpbnB1dCByZXNtZ3IiKTsKLQkgICAgfQotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JICAgIGlmIChzdGF0KCIvZGV2L21vdXNlMCIsICZzdCkgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIHNsZWVwKDEpOwotCSAgICB9Ci0JaWYgKChtb3VzZV9mZCA9IG9wZW4oIi9kZXYvbW91c2UwIiwgT19SRE9OTFl8T19OT05CTE9DSykpIDwgMCkgewotCSAgICBwZXJyb3IoIi9kZXYvbW91c2UwIik7Ci0JICAgIFBNX2ZhdGFsRXJyb3IoIkNvdWxkIG5vdCBvcGVuIC9kZXYvbW91c2UwIik7Ci0JICAgIH0KLQl9Ci0gICAgaWYgKChrYmRfZmQgPSBvcGVuKCIvZGV2L2tleWJvYXJkMCIsIE9fUkRPTkxZfE9fTk9OQkxPQ0spKSA8IDApIHsKLQlwZXJyb3IoIi9kZXYva2V5Ym9hcmQwIik7Ci0JUE1fZmF0YWxFcnJvcigiQ291bGQgbm90IG9wZW4gL2Rldi9rZXlib2FyZDAiKTsKLQl9Ci0jZWxzZQotICAgIC8qIENvbm5lY3QgdG8gSW5wdXQvTW91c2UgZm9yIGV2ZW50IGhhbmRsaW5nICovCi0gICAgaWYgKF9QTV9tb3VzZV9jdGwgPT0gTlVMTCkgewotCV9QTV9tb3VzZV9jdGwgPSBtb3VzZV9vcGVuKDAsICIvZGV2L21vdXNlIiwgMCk7Ci0KLQkvKiAiTW91c2UiIGlzIG5vdCBydW5uaW5nOyBhdHRlbXB0IHRvIHN0YXJ0IGl0ICovCi0JaWYgKF9QTV9tb3VzZV9jdGwgPT0gTlVMTCkgewotCSAgICBpYXJnWzBdID0gIm1vdXNldHJhcCI7Ci0JICAgIGlhcmdbMV0gPSAic3RhcnQiOwotCSAgICBpYXJnWzJdID0gTlVMTDsKLQkgICAgaWYgKChraWxsX3BpZCA9IHNwYXdudnAoUF9OT1dBSVRPLCBpYXJnWzBdLCAodm9pZCopaWFyZykpID09IC0xKQotCQlwZXJyb3IoInNwYXduIChtb3VzZXRyYXApIik7Ci0JICAgIGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkgICAgaWYgKHN0YXQoIi9kZXYvbW91c2UiLCAmc3QpID09IDApCi0JCQlicmVhazsKLQkJICAgIHNsZWVwKDEpOwotCQkgICAgfQotCQlfUE1fbW91c2VfY3RsID0gbW91c2Vfb3BlbigwLCAiL2Rldi9tb3VzZSIsIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgaWYgKF9QTV9rZXlib2FyZF9mZCA9PSAtMSkKLQlfUE1fa2V5Ym9hcmRfZmQgPSBvcGVuKCIvZGV2L2tiZCIsIE9fUkRPTkxZfE9fTk9OQkxPQ0spOwotI2VuZGlmCi0KLSAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIHJhbmdlWCA9IHhSZXM7Ci0gICAgcmFuZ2VZID0geVJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLU1vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAotYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfc2V0TW91c2VQb3MoeCx5KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBRTlggKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFFOWCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgY2hhciAgICBjOwotICAgIGludCBmbGFnczsKLQotICAgIGlmIChrYmRfZmQgIT0gLTEpIHsKLQljbG9zZShrYmRfZmQpOwotCWtiZF9mZCA9IC0xOwotCX0KLSAgICBpZiAobW91c2VfZmQgIT0gLTEpIHsKLQljbG9zZShtb3VzZV9mZCk7Ci0JbW91c2VfZmQgPSAtMTsKLQl9Ci0jZW5kaWYKLQotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0jaWZuZGVmIF9fUU5YTlRPX18KLSAgICAvKiBLaWxsIHRoZSBJbnB1dC9Nb3VzZSBkcml2ZXIgaWYgd2UgaGF2ZSBzcGF3bmVkIGl0ICovCi0gICAgaWYgKF9QTV9tb3VzZV9jdGwgIT0gTlVMTCkgewotCXN0cnVjdCBfZmRfZW50cnkgICAgZmRlOwotCXVpbnQgICAgICAgICAgICBwaWQgPSAwOwotCi0JLyogRmluZCBvdXQgdGhlIHBpZCBvZiB0aGUgbW91c2UgZHJpdmVyICovCi0JaWYgKGtpbGxfcGlkID4gMCkgewotCSAgICBpZiAocW54X2ZkX3F1ZXJ5KDAsCi0JCTAsIF9QTV9tb3VzZV9jdGwtPmZkLCAmZmRlKSAhPSAtMSkKLQkJcGlkID0gZmRlLnBpZDsKLQkgICAgfQotCW1vdXNlX2Nsb3NlKF9QTV9tb3VzZV9jdGwpOwotCV9QTV9tb3VzZV9jdGwgPSBOVUxMOwotCi0JaWYgKHBpZCA+IDApIHsKLQkgICAgLyogRm9yIHNvbWUgcmVhc29ucyB0aGUgUElEJ3MgYXJlIGRpZmZlcmVudCB1bmRlciBRTlg0LAotCSAgICAgKiBzbyB3ZSB1c2UgdGhlIG9sZCBtZWNoYW5pc20gdG8ga2lsbCB0aGUgbW91c2Ugc2VydmVyLgotCSAgICAgKi8KLQkgICAga2lsbChwaWQsIFNJR1RFUk0pOwotCSAgICBraWxsX3BpZCA9IDA7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSAgICBpZiAoa2lsbF9waWQgPiAwKSB7Ci0Ja2lsbChraWxsX3BpZCwgU0lHVEVSTSk7Ci0Ja2lsbF9waWQgPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9tdHJycW54LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvbXRycnFueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTYwYzc1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9tdHJycW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgTVRSUiBoZWxwZXIgZnVuY3Rpb25zIG1vZHVsZS4gVG8gbWFrZSBpdCBlYXNpZXIgdG8gaW1wbGVtZW50Ci0qICAgICAgICAgICAgICAgdGhlIE1UUlIgc3VwcG9ydCB1bmRlciBRTlgsIHdlIHNpbXBseSBwdXQgb3VyIHJpbmcgMCBoZWxwZXIKLSogICAgICAgICAgICAgICBmdW5jdGlvbnMgaW50byBzdHVicyB0aGF0IHJ1biB0aGVtIGF0IHJpbmcgMCB1c2luZyB3aGF0ZXZlcgotKiAgICAgICAgICAgICAgIG1lY2hhbmlzbSBpcyBhdmFpbGFibGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2lmZGVmIF9fUU5YTlRPX18KLSNpbmNsdWRlIDxzeXMvbmV1dHJpbm8uaD4KLSNpbmNsdWRlIDxzeXMvc3lzcGFnZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxpODYuaD4KLSNpbmNsdWRlIDxzeXMvaXJxaW5mby5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUjBfRkxVU0hfVExCICAgIDAKLSNkZWZpbmUgUjBfU0FWRV9DUjQgICAgIDEKLSNkZWZpbmUgUjBfUkVTVE9SRV9DUjQgIDIKLSNkZWZpbmUgUjBfUkVBRF9NU1IgICAgIDMKLSNkZWZpbmUgUjBfV1JJVEVfTVNSICAgIDQKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgc2VydmljZTsKLSAgICBpbnQgICAgIHJlZzsKLSAgICB1bG9uZyAgIGVheDsKLSAgICB1bG9uZyAgIGVkeDsKLSAgICB9IFIwX2RhdGE7Ci0KLWV4dGVybiB2b2xhdGlsZSBSMF9kYXRhIF9QTV9SMDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIF9fUU5YTlRPX18KLWNvbnN0IHN0cnVjdCBzaWdldmVudCAqIF9BU01BUEkgX1BNX3JpbmcwX2lzcih2b2lkICphcmcsIGludCBpZCk7Ci0jZWxzZQotcGlkX3QgZmFyIF9BU01BUEkgX1BNX3JpbmcwX2lzcigpOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRydWUgaWYgcmluZyAwIChvciBpZiB3ZSBjYW4gY2FsbCB0aGUgaGVscGVycyBmdW5jdGlvbnMgYXQgcmluZyAwKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9BU01BUEkgX01UUlJfaXNSaW5nMCh2b2lkKQotewotI2lmZGVmIF9fUU5YTlRPX18KLSAgICByZXR1cm4gZmFsc2U7ICAgLyogTm90IGltcGxlbWVudGVkIHlldCEgKi8KLSNlbHNlCi0gICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBleGVjdXRlIGEgc2VydmljZSBhdCByaW5nIDAuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgY2xvY2sKLWludGVycnVwdCBoYW5kbGVyIHNpbmNlIHRoZSBjb2RlIHdlIGF0dGFjaCB0byBpdCB3aWxsIGFsd2F5cyBydW4gYXQgcmluZyAwLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIENhbGxSaW5nMCh2b2lkKQotewotI2lmZGVmIF9fUU5YTlRPX18KLSAgICB1aW50ICAgIGNsb2NrX2ludG5vID0gU1lTUEFHRV9FTlRSWShxdGltZSktPmludHI7Ci0jZWxzZQotICAgIHVpbnQgICAgY2xvY2tfaW50bm8gPSAwOyAgICAvKiBjbG9jayBpcnEgKi8KLSNlbmRpZgotICAgIGludCAgICAgaW50cmlkOwotCi0jaWZkZWYgX19RTlhOVE9fXwotICAgIG1sb2NrKCh2b2lkKikmX1BNX1IwLCBzaXplb2YoX1BNX1IwKSk7Ci0gICAgVGhyZWFkQ3RsKF9OVE9fVENUTF9JTywgMCk7Ci0jZW5kaWYKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgaWYgKChpbnRyaWQgPSBJbnRlcnJ1cHRBdHRhY2goX05UT19JTlRSX0NMQVNTX0VYVEVSTkFMIHwgY2xvY2tfaW50bm8sCi0JX1BNX3JpbmcwX2lzciwgKHZvaWQqKSZfUE1fUjAsIHNpemVvZihfUE1fUjApLCBfTlRPX0lOVFJfRkxBR1NfRU5EKSkgPT0gLTEpIHsKLSNlbHNlCi0gICAgaWYgKChpbnRyaWQgPSBxbnhfaGludF9hdHRhY2goY2xvY2tfaW50bm8sIF9QTV9yaW5nMF9pc3IsIEZQX1NFRygmX1BNX1IwKSkpID09IC0xKSB7Ci0jZW5kaWYKLQlwZXJyb3IoIkF0dGFjaCIpOwotCWV4aXQoLTEpOwotCX0KLSAgICB3aGlsZSAoX1BNX1IwLnNlcnZpY2UgIT0gLTEpCi0JOwotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBJbnRlcnJ1cHREZXRhY2hJZChpbnRyaWQpOwotI2Vsc2UKLSAgICBxbnhfaGludF9kZXRhY2goaW50cmlkKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZsdXNoIHRoZSB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCkKLXsKLSAgICBfUE1fUjAuc2VydmljZSA9IFIwX0ZMVVNIX1RMQjsKLSAgICBDYWxsUmluZzAoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBDUjQgcmVnaXN0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfQVNNQVBJIF9NVFJSX3NhdmVDUjQodm9pZCkKLXsKLSAgICBfUE1fUjAuc2VydmljZSA9IFIwX1NBVkVfQ1I0OwotICAgIENhbGxSaW5nMCgpOwotICAgIHJldHVybiBfUE1fUjAucmVnOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBDUjQgcmVnaXN0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgX01UUlJfcmVzdG9yZUNSNCh1bG9uZyBjcjRWYWwpCi17Ci0gICAgX1BNX1IwLnNlcnZpY2UgPSBSMF9SRVNUT1JFX0NSNDsKLSAgICBfUE1fUjAucmVnID0gY3I0VmFsOwotICAgIENhbGxSaW5nMCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgYSBtYWNoaW5lIHN0YXR1cyByZWdpc3RlciBmb3IgdGhlIENQVS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgX01UUlJfcmVhZE1TUigKLSAgICBpbnQgcmVnLAotICAgIHVsb25nICplYXgsCi0gICAgdWxvbmcgKmVkeCkKLXsKLSAgICBfUE1fUjAuc2VydmljZSA9IFIwX1JFQURfTVNSOwotICAgIF9QTV9SMC5yZWcgPSByZWc7Ci0gICAgQ2FsbFJpbmcwKCk7Ci0gICAgKmVheCA9IF9QTV9SMC5lYXg7Ci0gICAgKmVkeCA9IF9QTV9SMC5lZHg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV3JpdGUgYSBtYWNoaW5lIHN0YXR1cyByZWdpc3RlciBmb3IgdGhlIENQVS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgX01UUlJfd3JpdGVNU1IoCi0gICAgaW50IHJlZywKLSAgICB1bG9uZyBlYXgsCi0gICAgdWxvbmcgZWR4KQotewotICAgIF9QTV9SMC5zZXJ2aWNlID0gUjBfV1JJVEVfTVNSOwotICAgIF9QTV9SMC5yZWcgPSByZWc7Ci0gICAgX1BNX1IwLmVheCA9IGVheDsKLSAgICBfUE1fUjAuZWR4ID0gZWR4OwotICAgIENhbGxSaW5nMCgpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2MTE5My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpZm5kZWYgX19RTlhOVE9fXwotI2luY2x1ZGUgPHN5cy9tb3VzZS5oPgotI2luY2x1ZGUgPHN5cy9rZXlib2FyZC5oPgotI2luY2x1ZGUgPHN5cy9mZC5oPgotI2luY2x1ZGUgPGNvbmlvLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9kY21kX2lucHV0Lmg+Ci0KLS8qIFRoaW5ncyAnYm9ycm93ZWQnIGZyb20gcGhvdG9uL2tleWNvZGVzLmggKi8KLQotLyoKLSAqIEtleWJvYXJkIG1vZGlmaWVycwotICovCi0jZGVmaW5lIEtFWU1PREJJVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBLRVlNT0RCSVRfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgS0VZTU9EQklUX0FMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEtFWU1PREJJVF9BTFRHUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBLRVlNT0RCSVRfU0hMMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgS0VZTU9EQklUX01PRDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEtFWU1PREJJVF9NT0Q3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBLRVlNT0RCSVRfTU9EOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKLQotI2RlZmluZSBLRVlNT0RCSVRfU0hJRlRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgS0VZTU9EQklUX0NUUkxfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5Ci0jZGVmaW5lIEtFWU1PREJJVF9BTFRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgS0VZTU9EQklUX0FMVEdSX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBLRVlNT0RCSVRfU0hMM19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIEtFWU1PREJJVF9NT0Q2X0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgS0VZTU9EQklUX01PRDdfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBLRVlNT0RCSVRfTU9EOF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0KLSNkZWZpbmUgS0VZTU9EQklUX0NBUFNfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBLRVlNT0RCSVRfTlVNX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIEtFWU1PREJJVF9TQ1JPTExfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgKLQotI2RlZmluZSBLRVlNT0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9TSElGVCkKLSNkZWZpbmUgS0VZTU9EX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQ1RSTCkKLSNkZWZpbmUgS0VZTU9EX0FMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQUxUKQotI2RlZmluZSBLRVlNT0RfQUxUR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9BTFRHUikKLSNkZWZpbmUgS0VZTU9EX1NITDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfU0hMMykKLSNkZWZpbmUgS0VZTU9EX01PRDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9ENikKLSNkZWZpbmUgS0VZTU9EX01PRDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9ENykKLSNkZWZpbmUgS0VZTU9EX01PRDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9EOCkKLQotI2RlZmluZSBLRVlNT0RfU0hJRlRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9TSElGVF9MT0NLKQotI2RlZmluZSBLRVlNT0RfQ1RSTF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9DVFJMX0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9BTFRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX0FMVF9MT0NLKQotI2RlZmluZSBLRVlNT0RfQUxUR1JfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9BTFRHUl9MT0NLKQotI2RlZmluZSBLRVlNT0RfU0hMM19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9TSEwzX0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9NT0Q2X0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX01PRDZfTE9DSykKLSNkZWZpbmUgS0VZTU9EX01PRDdfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9EN19MT0NLKQotI2RlZmluZSBLRVlNT0RfTU9EOF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9NT0Q4X0xPQ0spCi0KLSNkZWZpbmUgS0VZTU9EX0NBUFNfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQ0FQU19MT0NLKQotI2RlZmluZSBLRVlNT0RfTlVNX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9OVU1fTE9DSykKLSNkZWZpbmUgS0VZTU9EX1NDUk9MTF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfU0NST0xMX0xPQ0spCi0KLS8qCi0gKiBLZXlib2FyZCBmbGFncwotICovCi0jZGVmaW5lIEtFWV9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIEtleSB3YXMgcHJlc3NlZCBkb3duICovCi0jZGVmaW5lIEtFWV9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIEtleSB3YXMgcmVwZWF0ZWQgKi8KLSNkZWZpbmUgS0VZX1NDQU5fVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAgICAgLyogU2NhbmNvZGUgaXMgdmFsaWQgKi8KLSNkZWZpbmUgS0VZX1NZTV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwICAgICAgLyogS2V5IHN5bWJvbCBpcyB2YWxpZCAqLwotI2RlZmluZSBLRVlfQ0FQX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAgICAgICAvKiBLZXkgY2FwIGlzIHZhbGlkICovCi0jZGVmaW5lIEtFWV9ERUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMCAgICAgIC8qIEtleSBzeW1ib2wgaXMgYSBERUFEIGtleSAqLwotI2RlZmluZSBLRVlfT0VNX0NBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAgICAgICAvKiBLZXkgY2FwIGlzIGFuIE9FTSBzY2FuIGNvZGUgZnJvbSBrZXlib2FyZCAqLwotCi0jZW5kaWYgIC8qIF9fUU5YTlRPX18gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTNlZTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlICJxbngvdmJpb3MuaCIKLSNpZm5kZWYgX19RTlhOVE9fXwotI2luY2x1ZGUgPHN5cy9zZWdpbmZvLmg+Ci0jaW5jbHVkZSA8c3lzL2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxjb25pby5oPgotI2luY2x1ZGUgPGk4Ni5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvbmV1dHJpbm8uaD4KLSNpbmNsdWRlIDxzeXMvZGNtZF9jaHIuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdWludCBWRVNBQnVmX2xlbiA9IDEwMjQ7ICAgICAvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAgICAqLwotc3RhdGljIHZvaWQgKlZFU0FCdWZfcHRyID0gTlVMTDsgICAgLyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KLXN0YXRpYyB1aW50IFZFU0FCdWZfcnNlZzsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCBWRVNBQnVmX3JvZmY7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLwotc3RhdGljIFZCSU9TcmVnc190ICAqVlJlZ3MgPSBOVUxMOyAgLyogUG9pbnRlciB0byBWQklPUyByZWdpc3RlcnMgICAgICAgKi8KLXN0YXRpYyBpbnQgcmF3X2NvdW50ID0gMDsKLXN0YXRpYyBzdHJ1Y3QgX2NvbnNvbGVfY3RybCAqY2MgPSBOVUxMOwotc3RhdGljIGludCBjb25zb2xlX2NvdW50ID0gMDsKLXN0YXRpYyBpbnQgcm1idWZfaW51c2UgPSAwOwotCi1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIGNoYXIgKmZvcmNlOwotCi0gICAgaWYgKFZSZWdzID09IE5VTEwpIHsKLSNpZmRlZiAgX19RTlhOVE9fXwotCVRocmVhZEN0bChfTlRPX1RDVExfSU8sIDApOyAvKiBHZXQgSU8gcHJpdmlsaWRnZSAqLwotI2VuZGlmCi0JZm9yY2UgPSBnZXRlbnYoIlZCSU9TX01FVEhPRCIpOwotCVZSZWdzID0gVkJJT1Npbml0KGZvcmNlID8gYXRvaShmb3JjZSkgOiAwKTsKLQl9Ci0jaWZuZGVmICBfX1FOWE5UT19fCi0gICAgTVRSUl9pbml0KCk7Ci0jZW5kaWYKLX0KLQotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsgcmV0dXJuIFZSZWdzICE9IE5VTEw7IH0KLQotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsgcmV0dXJuIF9PU19RTlg7IH0KLQotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17IHJldHVybiBQTV8zODY7IH0KLQotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJy8nKSB7Ci0Jc1twb3NdID0gJy8nOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7Ci0gICAgZXhpdCgxKTsKLX0KLQotc3RhdGljIHZvaWQgRXhpdFZCRUJ1Zih2b2lkKQotewotICAgIGlmIChWRVNBQnVmX3B0cikKLQlQTV9mcmVlUmVhbFNlZyhWRVNBQnVmX3B0cik7Ci0gICAgVkVTQUJ1Zl9wdHIgPSAwOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKQotewotICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKLQkvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KLQlpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JYXRleGl0KEV4aXRWQkVCdWYpOwotCX0KLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7Ci0gICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7Ci0gICAgcmV0dXJuIFZFU0FCdWZfcHRyOwotfQotCi1zdGF0aWMgaW50IHRlcm1fcmF3KHZvaWQpCi17Ci0gICAgc3RydWN0IHRlcm1pb3MgIHRlcm1pb3NfcDsKLQotICAgIGlmIChyYXdfY291bnQrKyA+IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAvKiBHbyBpbnRvICJyYXciIGlucHV0IG1vZGUgKi8KLSAgICBpZiAodGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJnRlcm1pb3NfcCkpCi0JcmV0dXJuIC0xOwotCi0gICAgdGVybWlvc19wLmNfY2NbVk1JTl0gPSAgMTsKLSAgICB0ZXJtaW9zX3AuY19jY1tWVElNRV0gPSAgMDsKLSAgICB0ZXJtaW9zX3AuY19sZmxhZyAmPSB+KCBFQ0hPfElDQU5PTnxJU0lHfEVDSE9FfEVDSE9LfEVDSE9OTCk7Ci0gICAgdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQURSQUlOLCAmdGVybWlvc19wKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGVybV9yZXN0b3JlKHZvaWQpCi17Ci0gICAgc3RydWN0IHRlcm1pb3MgIHRlcm1pb3NfcDsKLQotICAgIGlmIChyYXdfY291bnQtLSAhPSAxKQotCXJldHVybjsKLQotICAgIHRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZ0ZXJtaW9zX3ApOwotICAgIHRlcm1pb3NfcC5jX2xmbGFnIHw9IChFQ0hPfElDQU5PTnxJU0lHfEVDSE9FfEVDSE9LfEVDSE9OTCk7Ci0gICAgdGVybWlvc19wLmNfb2ZsYWcgfD0gKE9QT1NUKTsKLSAgICB0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBRFJBSU4sICZ0ZXJtaW9zX3ApOwotfQotCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICBpbnQgYmxvY2tpbmcsIGM7Ci0KLSAgICBpZiAodGVybV9yYXcoKSA9PSAtMSkKLQlyZXR1cm4gMDsKLQotICAgIC8qIEdvIGludG8gbm9uIGJsb2NraW5nIG1vZGUgKi8KLSAgICBibG9ja2luZyA9IGZjbnRsKFNURElOX0ZJTEVOTywgRl9HRVRGTCkgfCBPX05PTkJMT0NLOwotICAgIGZjbnRsKFNURElOX0ZJTEVOTywgRl9TRVRGTCwgYmxvY2tpbmcpOwotICAgIGMgPSBnZXRjKHN0ZGluKTsKLQotICAgIC8qIHJlc3RvcmUgYmxvY2tpbmcgbW9kZSAqLwotICAgIGZjbnRsKFNURElOX0ZJTEVOTywgRl9TRVRGTCwgYmxvY2tpbmcgJiB+T19OT05CTE9DSyk7Ci0gICAgdGVybV9yZXN0b3JlKCk7Ci0gICAgaWYgKGMgIT0gRU9GKSB7Ci0JdW5nZXRjKGMsIHN0ZGluKTsKLQlyZXR1cm4gYzsKLQl9Ci0gICAgY2xlYXJlcnIoc3RkaW4pOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICBpbnQgYzsKLQotICAgIGlmICh0ZXJtX3JhdygpID09IC0xKQotCXJldHVybiAoMCk7Ci0gICAgYyA9IGdldGMoc3RkaW4pOwotI2lmIGRlZmluZWQoX19RTlhfXykgJiYgIWRlZmluZWQoX19RTlhOVE9fXykKLSAgICBpZiAoYyA9PSAweEEpCi0JYyA9IDB4MEQ7Ci0gICAgZWxzZSBpZiAoYyA9PSAweDdGKQotCWMgPSAweDA4OwotI2VuZGlmCi0gICAgdGVybV9yZXN0b3JlKCk7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kVXNlciwKLSAgICBpbnQgZGV2aWNlLAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzLAotICAgIGludCBicHAsCi0gICAgaWJvb2wgZnVsbFNjcmVlbikKLXsKLSNpZm5kZWYgX19RTlhOVE9fXwotICAgIGludCBmZDsKLQotICAgIGlmIChjb25zb2xlX2NvdW50KyspCi0JcmV0dXJuIDA7Ci0gICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvY29uMSIsIE9fUkRXUikpID09IC0xKQotCXJldHVybiAtMTsKLSAgICBjYyA9IGNvbnNvbGVfb3BlbihmZCwgT19SRFdSKTsKLSAgICBjbG9zZShmZCk7Ci0gICAgaWYgKGNjID09IE5VTEwpCi0JcmV0dXJuIC0xOwotI2VuZGlmCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX2dldFZHQVN0YXRlU2l6ZSgpICsgc2l6ZW9mKGludCkgKiAzOwotfQotCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUodm9pZCAqc3RhdGVCdWYsaW50IGNvbnNvbGVfaWQpCi17Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIGludCAgICAgZmQ7Ci0gICAgaW50ICAgICBmbGFnczsKLQotICAgIGlmICgoZmQgPSBvcGVuKCIvZGV2L2NvbjEiLCBPX1JEV1IpKSA9PSAtMSkKLQlyZXR1cm47Ci0gICAgZmxhZ3MgPSBfQ09OQ1RMX0lOVklTSUJMRV9DSEcgfCBfQ09OQ1RMX0lOVklTSUJMRTsKLSAgICBkZXZjdGwoZmQsIERDTURfQ0hSX1NFUkNUTCwgJmZsYWdzLCBzaXplb2YgZmxhZ3MsIDApOwotICAgIGNsb3NlKGZkKTsKLSNlbHNlCi0gICAgdWNoYXIgICAqYnVmID0gJigodWNoYXIqKXN0YXRlQnVmKVtQTV9nZXRWR0FTdGF0ZVNpemUoKV07Ci0KLSAgICAvKiBTYXZlIFFOWCA0IGNvbnNvbGUgc3RhdGUgKi8KLSAgICBjb25zb2xlX3JlYWQoY2MsIC0xLCAwLCBOVUxMLCAwLAotCShpbnQgKilidWYrMSwgKGludCAqKWJ1ZisyLCBOVUxMKTsKLSAgICAqKGludCAqKWJ1ZiA9IGNvbnNvbGVfY3RybChjYywgLTEsCi0JQ09OU09MRV9OT1JFU0laRSB8IENPTlNPTEVfTk9TV0lUQ0ggfCBDT05TT0xFX0lOVklTSUJMRSwKLQlDT05TT0xFX05PUkVTSVpFIHwgQ09OU09MRV9OT1NXSVRDSCB8IENPTlNPTEVfSU5WSVNJQkxFKTsKLQotICAgIC8qIFNhdmUgc3RhdGUgb2YgVkdBIHJlZ2lzdGVycyAqLwotICAgIFBNX3NhdmVWR0FTdGF0ZShzdGF0ZUJ1Zik7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHN1cHBvcnQgZm9yIGNvbnNvbGUgc3dpdGNoaW5nIGlmIHBvc3NpYmxlICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQotewotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBpbnQgICAgIGZkOwotICAgIGludCAgICAgZmxhZ3M7Ci0KLSAgICBpZiAoKGZkID0gb3BlbigiL2Rldi9jb24xIiwgT19SRFdSKSkgPT0gLTEpCi0JcmV0dXJuOwotICAgIGZsYWdzID0gX0NPTkNUTF9JTlZJU0lCTEVfQ0hHOwotICAgIGRldmN0bChmZCwgRENNRF9DSFJfU0VSQ1RMLCAmZmxhZ3MsIHNpemVvZiBmbGFncywgMCk7Ci0gICAgY2xvc2UoZmQpOwotI2Vsc2UKLSAgICB1Y2hhciAgICpidWYgPSAmKCh1Y2hhciopc3RhdGVCdWYpW1BNX2dldFZHQVN0YXRlU2l6ZSgpXTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBWR0EgY29tcGF0aWJsZSByZWdpc3RlcnMgKi8KLSAgICBQTV9yZXN0b3JlVkdBU3RhdGUoc3RhdGVCdWYpOwotCi0gICAgLyogUmVzdG9yZSBRTlggNCBjb25zb2xlIHN0YXRlICovCi0gICAgY29uc29sZV9jdHJsKGNjLCAtMSwgKihpbnQgKilidWYsCi0JQ09OU09MRV9OT1JFU0laRSB8IENPTlNPTEVfTk9TV0lUQ0ggfCBDT05TT0xFX0lOVklTSUJMRSk7Ci0gICAgY29uc29sZV93cml0ZShjYywgLTEsIDAsIE5VTEwsIDAsCi0JKGludCAqKWJ1ZisxLCAoaW50ICopYnVmKzIsIE5VTEwpOwotI2VuZGlmCi19Ci0KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0jaWZuZGVmIF9fUU5YTlRPX18KLSAgICBpZiAoLS1jb25zb2xlX2NvdW50ID09IDApIHsKLQljb25zb2xlX2Nsb3NlKGNjKTsKLQljYyA9IE5VTEw7Ci0JfQotI2VuZGlmCi19Ci0KLXZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKLXsKLSAgICBpZiAoIWNjKQotCXJldHVybjsKLSNpZm5kZWYgX19RTlhOVE9fXwotICAgIGNvbnNvbGVfd3JpdGUoY2MsIC0xLCAwLCBOVUxMLCAwLCAmeSwgJngsIE5VTEwpOwotI2VuZGlmCi19Ci0KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciBpaCwgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgUU5YICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgUU5YICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIFFOWCAqLwotfQotCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQoteyByZXR1cm4gJy8nOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsgcmV0dXJuIFBNX2dldE51Y2xldXNDb25maWdQYXRoKCk7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgY2hhciAqZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKTsKLSNpZmRlZiBfX1FOWE5UT19fCi0jaWZkZWYgX19YODZfXwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL250by9zY2l0ZWNoL3g4Ni9iaW4iOwotI2VsaWYgZGVmaW5lZCAoX19QUENfXykKLSAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC9wcGNiZS9iaW4iOwotI2VsaWYgZGVmaW5lZCAoX19NSVBTX18pCi0jaWZkZWYgX19CSUdFTkRJQU5fXwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL250by9zY2l0ZWNoL21pcHNiZS9iaW4iOwotI2Vsc2UKLSAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC9taXBzbGUvYmluIjsKLSNlbmRpZgotI2VsaWYgZGVmaW5lZCAoX19TSF9fKQotI2lmZGVmIF9fQklHRU5ESUFOX18KLSAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC9zaGJlL2JpbiI7Ci0jZWxzZQotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL250by9zY2l0ZWNoL3NobGUvYmluIjsKLSNlbmRpZgotI2VsaWYgZGVmaW5lZCAoX19BUk1fXykKLSAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC9hcm1sZS9iaW4iOwotI2VuZGlmCi0jZWxzZSAgIC8qIFFOWCA0ICovCi0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvcW54NC9zY2l0ZWNoL2JpbiI7Ci0jZW5kaWYKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFs1MTJdOwotICAgIGNoYXIgICAgICAgICplbnY7Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIGNoYXIgdGVtcFs2NF07Ci0gICAgZ2V0aG9zdG5hbWUodGVtcCwgc2l6ZW9mICh0ZW1wKSk7Ci0gICAgdGVtcFtzaXplb2YgKHRlbXApIC0gMV0gPSAnXDAnOyAgICAgLyogUGFyYW5vaWQgKi8KLSAgICBzcHJpbnRmKHBhdGgsIi9ldGMvY29uZmlnL3NjaXRlY2gvJXMvY29uZmlnIiwgdGVtcCk7Ci0jZWxzZQotICAgIHNwcmludGYocGF0aCwiL2V0Yy9jb25maWcvc2NpdGVjaC8lZC9jb25maWciLCBnZXRuaWQoKSk7Ci0jZW5kaWYKLSAgICBpZiAoKGVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIikpICE9IE5VTEwpIHsKLQlzdHJjcHkocGF0aCxlbnYpOwotCVBNX2JhY2tzbGFzaChwYXRoKTsKLQlzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0JfQotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgZ2V0aG9zdG5hbWUoYnVmLCBzaXplb2YgKGJ1ZikpOwotI2Vsc2UKLSAgICBzcHJpbnRmKGJ1Ziwibm9kZSVkIiwgZ2V0bmlkKCkpOwotI2VuZGlmCi0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgYnVmWzEyOF07Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIGdldGhvc3RuYW1lKGJ1Ziwgc2l6ZW9mIChidWYpKTsKLSNlbHNlCi0gICAgc3ByaW50ZihidWYsIm5vZGUlZCIsIGdldG5pZCgpKTsKLSNlbmRpZgotICAgIHJldHVybiBidWY7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiBQTV9tYXBSZWFsUG9pbnRlcigwLCAweDQwMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICBzdGF0aWMgdm9pZCAqcHRyID0gTlVMTDsKLSAgICB2b2lkICpmcmVlcHRyOwotICAgIHVuc2lnbmVkIG9mZnNldCwgaSwgbWFwbGVuOwotCi0gICAgaWYgKHB0ciAhPSBOVUxMKQotCXJldHVybiBwdHI7Ci0KLSAgICAvKiBTb21lIHRyaWNrZXJ5IGlzIHJlcXVpcmVkIHRvIGdldCB0aGUgbGluZWFyIGFkZHJlc3MgNjRLIGFsaWduZWQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JcHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOwotCW9mZnNldCA9IDB4MTAwMDAgLSAoKHVuc2lnbmVkKXB0ciAlIDB4MTAwMDApOwotCWlmICghb2Zmc2V0KQotCSAgICBicmVhazsKLQltdW5tYXAocHRyLCAweDEwMDAwKTsKLQltYXBsZW4gPSAweDEwMDAwICsgb2Zmc2V0OwotCWZyZWVwdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMC1vZmZzZXQsIG1hcGxlbi0xLHRydWUpOwotCXB0ciA9ICh2b2lkICopKG9mZnNldCArICh1bnNpZ25lZClmcmVlcHRyKTsKLQlpZiAoMHgxMDAwMCAtICgodW5zaWduZWQpcHRyICUgMHgxMDAwMCkpCi0JICAgIGJyZWFrOwotCW11bm1hcChmcmVlcHRyLCBtYXBsZW4pOwotCX0KLSAgICBpZiAoaSA9PSA1KSB7Ci0JcHJpbnRmKCJDb3VsZCBub3QgZ2V0IGEgNjRLIGFsaWduZWQgbGluZWFyIGFkZHJlc3MgZm9yIEEwMDAwIHJlZ2lvblxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0gICAgcmV0dXJuIHB0cjsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQotewotICAgIHVjaGFyX3QgKnA7Ci0gICAgdW5zaWduZWQgbzsKLSAgICB1bnNpZ25lZCBwcm90ID0gUFJPVF9SRUFEfFBST1RfV1JJVEV8KGlzQ2FjaGVkPzA6UFJPVF9OT0NBQ0hFKTsKLSNpZmRlZiBfX1BBR0VTSVpFCi0gICAgaW50IHBhZ2VzaXplID0gX19QQUdFU0laRTsKLSNlbHNlCi0gICAgaW50IHBhZ2VzaXplID0gNDA5NjsKLSNlbmRpZgotICAgIGludCByb3VuZGRvd24gPSBiYXNlICUgcGFnZXNpemU7Ci0jaWZuZGVmIF9fUU5YTlRPX18KLSAgICBzdGF0aWMgaW50IF9fVmlkRkQgPSAtMTsKLSNlbmRpZgotCi0gICAgaWYgKHJvdW5kZG93bikgewotCWlmIChiYXNlIDwgcm91bmRkb3duKQotCSAgICByZXR1cm4gTlVMTDsKLQliYXNlIC09IHJvdW5kZG93bjsKLQlsaW1pdCArPSByb3VuZGRvd247Ci0JfQotCi0jaWZuZGVmIF9fUU5YTlRPX18KLSAgICBpZiAoX19WaWRGRCA8IDApIHsKLQlpZiAoKF9fVmlkRkQgPSBzaG1fb3BlbiggIlBoeXNpY2FsIiwgT19SRFdSLCAwNzc3ICkpID09IC0xKSB7Ci0JICAgIHBlcnJvciggIkNhbm5vdCBvcGVuIFBoeXNpY2FsIG1lbW9yeSIgKTsKLQkgICAgZXhpdCgxKTsKLQkgICAgfQotCX0KLSAgICBvID0gYmFzZSAmIDB4RkZGOwotICAgIGxpbWl0ID0gKGxpbWl0ICsgbyArIDB4RkZGKSAmIH4weEZGRjsKLSAgICBpZiAoKGludCkocCA9IG1tYXAoIDAsIGxpbWl0LCBwcm90LCBNQVBfU0hBUkVELAotCSAgICBfX1ZpZEZELCBiYXNlICkpID09IC0xICkgewotCXJldHVybiBOVUxMOwotCX0KLSAgICBwICs9IG87Ci0jZWxzZQotICAgIGlmICgocCA9IG1tYXAoMCwgbGltaXQsIHByb3QsIE1BUF9QSFlTIHwgTUFQX1NIQVJFRCwKLQkgICAgTk9GRCwgYmFzZSkpID09IE1BUF9GQUlMRUQpIHsKLQlyZXR1cm4gKHZvaWQgKiktMTsKLQl9Ci0jZW5kaWYKLSAgICByZXR1cm4gKHAgKyByb3VuZGRvd24pOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotICAgIG11bm1hcChwdHIsbGltaXQrMSk7Ci19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLiAqLwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKAotICAgIHZvaWQgKnAsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVsb25nICpwaHlzQWRkcmVzcykKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIC8qIFRPRE86IFB1dCB0aGUgcHJvY2VzcyB0byBzbGVlcCBmb3IgbWlsbGlzZWNvbmRzICovCi19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZChsb25nIHNpemUpCi17Ci0gICAgcmV0dXJuIFBNX21hbGxvYyhzaXplKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKHZvaWQgKnB0cikKLXsKLSAgICBQTV9mcmVlKHB0cik7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKLXsgcmV0dXJuICh2b2lkKiliYXNlOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17Ci0gICAgdm9pZCAqcDsKLQotICAgIFBNX2luaXQoKTsKLQotICAgIGlmICgocCA9IFZCSU9TZ2V0bWVtcHRyKHJfc2VnLCByX29mZiwgVlJlZ3MpKSA9PSAodm9pZCAqKS0xKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiBwOwotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKLXsKLSAgICBpZiAoc2l6ZSA+IDEwMjQpIHsKLQlwcmludGYoIlBNX2FsbG9jUmVhbFNlZzogY2FuJ3QgaGFuZGxlICVkIGJ5dGVzXG4iLCBzaXplKTsKLQlyZXR1cm4gMDsKLQl9Ci0gICAgaWYgKHJtYnVmX2ludXNlICE9IDApIHsKLQlwcmludGYoIlBNX2FsbG9jUmVhbFNlZzogdHJhbnNmZXIgYXJlYSBhbHJlYWR5IGluIHVzZVxuIik7Ci0JcmV0dXJuIDA7Ci0JfQotICAgIFBNX2luaXQoKTsKLSAgICBybWJ1Zl9pbnVzZSA9IDE7Ci0gICAgKnJfc2VnID0gVkJJT1NfVHJhbnNCdWZWU2VnKFZSZWdzKTsKLSAgICAqcl9vZmYgPSBWQklPU19UcmFuc0J1ZlZPZmYoVlJlZ3MpOwotICAgIHJldHVybiAodm9pZCopVkJJT1NfVHJhbnNCdWZQdHIoVlJlZ3MpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSkKLXsKLSAgICBpZiAocm1idWZfaW51c2UgPT0gMCkgewotCXByaW50ZigiUE1fZnJlZVJlYWxTZWc6IG5vdGhpbmcgd2FzIGFsbG9jYXRlZFxuIik7Ci0JcmV0dXJuOwotCX0KLSAgICBybWJ1Zl9pbnVzZSA9IDA7Ci19Ci0KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFZSZWdzID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgVlJlZ3MtPmwuZWF4ID0gcmVncy0+ZWF4OwotICAgIFZSZWdzLT5sLmVieCA9IHJlZ3MtPmVieDsKLSAgICBWUmVncy0+bC5lY3ggPSByZWdzLT5lY3g7Ci0gICAgVlJlZ3MtPmwuZWR4ID0gcmVncy0+ZWR4OwotICAgIFZSZWdzLT5sLmVzaSA9IHJlZ3MtPmVzaTsKLSAgICBWUmVncy0+bC5lZGkgPSByZWdzLT5lZGk7Ci0KLSAgICBWQklPU2ludChpbnRubywgVlJlZ3MsIDEwMjQpOwotCi0gICAgcmVncy0+ZWF4ID0gVlJlZ3MtPmwuZWF4OwotICAgIHJlZ3MtPmVieCA9IFZSZWdzLT5sLmVieDsKLSAgICByZWdzLT5lY3ggPSBWUmVncy0+bC5lY3g7Ci0gICAgcmVncy0+ZWR4ID0gVlJlZ3MtPmwuZWR4OwotICAgIHJlZ3MtPmVzaSA9IFZSZWdzLT5sLmVzaTsKLSAgICByZWdzLT5lZGkgPSBWUmVncy0+bC5lZGk7Ci0gICAgcmVncy0+ZmxhZ3MgPSBWUmVncy0+dy5mbGFncyAmIDB4MTsKLX0KLQotaW50IFBNQVBJIFBNX2ludDg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIGlmIChWUmVncyA9PSBOVUxMKQotCXJldHVybiAwOwotCi0gICAgVlJlZ3MtPmwuZWF4ID0gaW4tPmUuZWF4OwotICAgIFZSZWdzLT5sLmVieCA9IGluLT5lLmVieDsKLSAgICBWUmVncy0+bC5lY3ggPSBpbi0+ZS5lY3g7Ci0gICAgVlJlZ3MtPmwuZWR4ID0gaW4tPmUuZWR4OwotICAgIFZSZWdzLT5sLmVzaSA9IGluLT5lLmVzaTsKLSAgICBWUmVncy0+bC5lZGkgPSBpbi0+ZS5lZGk7Ci0KLSAgICBWQklPU2ludChpbnRubywgVlJlZ3MsIDEwMjQpOwotCi0gICAgb3V0LT5lLmVheCA9IFZSZWdzLT5sLmVheDsKLSAgICBvdXQtPmUuZWJ4ID0gVlJlZ3MtPmwuZWJ4OwotICAgIG91dC0+ZS5lY3ggPSBWUmVncy0+bC5lY3g7Ci0gICAgb3V0LT5lLmVkeCA9IFZSZWdzLT5sLmVkeDsKLSAgICBvdXQtPmUuZXNpID0gVlJlZ3MtPmwuZXNpOwotICAgIG91dC0+ZS5lZGkgPSBWUmVncy0+bC5lZGk7Ci0gICAgb3V0LT54LmNmbGFnID0gVlJlZ3MtPncuZmxhZ3MgJiAweDE7Ci0KLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIGlmIChWUmVncyA9PSBOVUxMKQotCXJldHVybiAwOwotCi0gICAgaWYgKGludG5vID09IDB4MjEpIHsKLQl0aW1lX3QgdG9kYXkgPSB0aW1lKE5VTEwpOwotCXN0cnVjdCB0bSAqdDsKLQl0ID0gbG9jYWx0aW1lKCZ0b2RheSk7Ci0Jb3V0LT54LmN4ID0gdC0+dG1feWVhciArIDE5MDA7Ci0Jb3V0LT5oLmRoID0gdC0+dG1fbW9uICsgMTsKLQlvdXQtPmguZGwgPSB0LT50bV9tZGF5OwotCXJldHVybiAwOwotCX0KLSAgICBlbHNlIHsKLQlWUmVncy0+bC5lYXggPSBpbi0+ZS5lYXg7Ci0JVlJlZ3MtPmwuZWJ4ID0gaW4tPmUuZWJ4OwotCVZSZWdzLT5sLmVjeCA9IGluLT5lLmVjeDsKLQlWUmVncy0+bC5lZHggPSBpbi0+ZS5lZHg7Ci0JVlJlZ3MtPmwuZXNpID0gaW4tPmUuZXNpOwotCVZSZWdzLT5sLmVkaSA9IGluLT5lLmVkaTsKLQlWUmVncy0+dy5lcyA9IHNyZWdzLT5lczsKLQlWUmVncy0+dy5kcyA9IHNyZWdzLT5kczsKLQotCVZCSU9TaW50KGludG5vLCBWUmVncywgMTAyNCk7Ci0KLQlvdXQtPmUuZWF4ID0gVlJlZ3MtPmwuZWF4OwotCW91dC0+ZS5lYnggPSBWUmVncy0+bC5lYng7Ci0Jb3V0LT5lLmVjeCA9IFZSZWdzLT5sLmVjeDsKLQlvdXQtPmUuZWR4ID0gVlJlZ3MtPmwuZWR4OwotCW91dC0+ZS5lc2kgPSBWUmVncy0+bC5lc2k7Ci0Jb3V0LT5lLmVkaSA9IFZSZWdzLT5sLmVkaTsKLQlvdXQtPnguY2ZsYWcgPSBWUmVncy0+dy5mbGFncyAmIDB4MTsKLQlzcmVncy0+ZXMgPSBWUmVncy0+dy5lczsKLQlzcmVncy0+ZHMgPSBWUmVncy0+dy5kczsKLQotCXJldHVybiBvdXQtPnguYXg7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFZSZWdzID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgVlJlZ3MtPmwuZWF4ID0gaW4tPmUuZWF4OwotICAgIFZSZWdzLT5sLmVieCA9IGluLT5lLmVieDsKLSAgICBWUmVncy0+bC5lY3ggPSBpbi0+ZS5lY3g7Ci0gICAgVlJlZ3MtPmwuZWR4ID0gaW4tPmUuZWR4OwotICAgIFZSZWdzLT5sLmVzaSA9IGluLT5lLmVzaTsKLSAgICBWUmVncy0+bC5lZGkgPSBpbi0+ZS5lZGk7Ci0gICAgVlJlZ3MtPncuZXMgPSBzcmVncy0+ZXM7Ci0gICAgVlJlZ3MtPncuZHMgPSBzcmVncy0+ZHM7Ci0KLSAgICBWQklPU2NhbGwoc2VnLCBvZmYsIFZSZWdzLCAxMDI0KTsKLQotICAgIGluLT5lLmVheCA9IFZSZWdzLT5sLmVheDsKLSAgICBpbi0+ZS5lYnggPSBWUmVncy0+bC5lYng7Ci0gICAgaW4tPmUuZWN4ID0gVlJlZ3MtPmwuZWN4OwotICAgIGluLT5lLmVkeCA9IFZSZWdzLT5sLmVkeDsKLSAgICBpbi0+ZS5lc2kgPSBWUmVncy0+bC5lc2k7Ci0gICAgaW4tPmUuZWRpID0gVlJlZ3MtPmwuZWRpOwotICAgIGluLT54LmNmbGFnID0gVlJlZ3MtPncuZmxhZ3MgJiAweDE7Ci0gICAgc3JlZ3MtPmVzID0gVlJlZ3MtPncuZXM7Ci0gICAgc3JlZ3MtPmRzID0gVlJlZ3MtPncuZHM7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCi17Ci0jaWZuZGVmIF9fUU5YTlRPX18KLSAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSBfbWVtYXZsKCk7Ci0jZW5kaWYKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbiBRTlggKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgb24gUU5YICovCi19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1BhZ2UoCi0gICAgaWJvb2wgbG9ja2VkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIG9uIFFOWCAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAotICAgIHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgb24gUU5YICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoaW50IGJhbmspCi17Ci0gICAgUE1faW5pdCgpOwotICAgIGlmIChWUmVncyA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIFZSZWdzLT5sLmVheCA9IDB4NEYwNTsKLSAgICBWUmVncy0+bC5lYnggPSAweDAwMDA7Ci0gICAgVlJlZ3MtPmwuZWR4ID0gYmFuazsKLSAgICBWQklPU2ludCgweDEwLCBWUmVncywgMTAyNCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKGludCBiYW5rKQotewotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICBWUmVncy0+bC5lYXggPSAweDRGMDU7Ci0gICAgVlJlZ3MtPmwuZWJ4ID0gMHgwMDAwOwotICAgIFZSZWdzLT5sLmVkeCA9IGJhbms7Ci0gICAgVkJJT1NpbnQoMHgxMCwgVlJlZ3MsIDEwMjQpOwotCi0gICAgVlJlZ3MtPmwuZWF4ID0gMHg0RjA1OwotICAgIFZSZWdzLT5sLmVieCA9IDB4MDAwMTsKLSAgICBWUmVncy0+bC5lZHggPSBiYW5rOwotICAgIFZCSU9TaW50KDB4MTAsIFZSZWdzLCAxMDI0KTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCkKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFZSZWdzID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgVlJlZ3MtPmwuZWF4ID0gMHg0RjA3OwotICAgIFZSZWdzLT5sLmVieCA9IHdhaXRWUlQ7Ci0gICAgVlJlZ3MtPmwuZWN4ID0geDsKLSAgICBWUmVncy0+bC5lZHggPSB5OwotICAgIFZCSU9TaW50KDB4MTAsIFZSZWdzLCAxMDI0KTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKmNvcHlPZkJJT1MsCi0gICAgdWxvbmcgQklPU0xlbikKLXsKLSAgICAodm9pZClheFZhbDsKLSAgICAodm9pZClCSU9TUGh5c0FkZHI7Ci0gICAgKHZvaWQpY29weU9mQklPUzsKLSAgICAodm9pZClCSU9TTGVuOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsKLSAgICByZXR1cm4gMTsKLX0KLQotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyB0byBsb2FkIHNoYXJlZCBsaWJyYXJpZXMhICovCi0gICAgKHZvaWQpc3pETExOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotaW50IFBNQVBJIFBNX3NldElPUEwoCi0gICAgaW50IGxldmVsKQotewotICAgIC8qIFFOWCBoYW5kbGVzIElPUEwgc2VsZWN0aW9uIGF0IHRoZSBwcm9ncmFtIGxpbmsgbGV2ZWwuICovCi0gICAgcmV0dXJuIGxldmVsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0jaWZuZGVmICBfX1FOWE5UT19fCi0gICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKLSNlbHNlCi0gICAgcmV0dXJuIFBNX01UUlJfTk9UX1NVUFBPUlRFRDsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5ZWYyYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7Ci0gICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKLSAgICBjb2RlTGVuID0gY29kZUxlbjsKLSAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3NDA5Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlgKLSoKLSogRGVzY3JpcHRpb246ICBRTlggc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVzZSB0aGUgZ2V0dGltZW9mZGF5KCkgZnVuY3Rpb24gdG8gZ2V0IG1pY3Jvc2Vjb25kIHByZWNpc2lvbiAocHJvYmFibHkgbGVzcwotdGhvdWdoKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgc3RydWN0IHRpbWVzcGVjIHRzOwotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7Ci0gICAgcmV0dXJuICh0cy50dl9uc2VjIC8gMTAwMCArIHRzLnR2X3NlYyAqIDEwMDAwMDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPbih0bSkgICAgIHRtLT5zdGFydC5sb3cgPSBfX1VMWlJlYWRUaW1lKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJMYXAodG0pICAgICAgICAoX19VTFpSZWFkVGltZSgpIC0gdG0tPnN0YXJ0LmxvdykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICAgICAgdG0tPmVuZC5sb3cgPSBfX1VMWlJlYWRUaW1lKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyQ291bnQodG0pICAodG0tPmVuZC5sb3cgLSB0bS0+c3RhcnQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzJjM2UuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIHRvIG1lYXN1cmUgdGhlCi0qICAgICAgICAgICAgICAgQ1BVIGZyZXF1ZW5jeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCBoYXZlUGVyZm9ybWFuY2VDb3VudGVyOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluY3JlYXNlIHRoZSB0aHJlYWQgcHJpb3JpdHkgdG8gbWF4aW11bSwgaWYgcG9zc2libGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBTZXRNYXhUaHJlYWRQcmlvcml0eSh2b2lkKQotewotICAgIGludCAgICAgb2xkUHJpb3JpdHk7Ci0gICAgSEFORExFICBoVGhyZWFkID0gR2V0Q3VycmVudFRocmVhZCgpOwotCi0gICAgb2xkUHJpb3JpdHkgPSBHZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkKTsKLSAgICBpZiAob2xkUHJpb3JpdHkgIT0gVEhSRUFEX1BSSU9SSVRZX0VSUk9SX1JFVFVSTikKLQlTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfVElNRV9DUklUSUNBTCk7Ci0gICAgcmV0dXJuIG9sZFByaW9yaXR5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHRocmVhZCBwcmlvcml0eS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoCi0gICAgaW50IG9sZFByaW9yaXR5KQotewotICAgIEhBTkRMRSAgaFRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWQoKTsKLQotICAgIGlmIChvbGRQcmlvcml0eSAhPSBUSFJFQURfUFJJT1JJVFlfRVJST1JfUkVUVVJOKQotCVNldFRocmVhZFByaW9yaXR5KGhUaHJlYWQsIG9sZFByaW9yaXR5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KChMQVJHRV9JTlRFR0VSKilmcmVxKSkgewotCWhhdmVQZXJmb3JtYW5jZUNvdW50ZXIgPSBmYWxzZTsKLQlmcmVxLT5sb3cgPSAxMDAwMDA7Ci0JZnJlcS0+aGlnaCA9IDA7Ci0JfQotICAgIGVsc2UKLQloYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKil0KTsgICAgICAgICBcCi0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKHQpLT5sb3cgPSB0aW1lR2V0VGltZSgpICogMTAwOyAgICAgICAgICAgICAgICAgICAgIFwKLQkodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyYTE0YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgotKgotKiBEZXNjcmlwdGlvbjogIFdpbjMyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdXNob3J0ICAga2V5VXBNc2dbMjU2XSA9IHswfTsgICAgLyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLwotc3RhdGljIGludCAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgICAgIC8qIFJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIFdpbjMyICovCi0jZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKLSNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKLQotUkVNQVJLUzoKLVRoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCi10aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17IHJldHVybiB0aW1lR2V0VGltZSgpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBtZXNzYWdlIHF1ZXVlIGZyb20gV2luMzIgaW50byBvdXIgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIE1TRyAgICAgbXNnOwotICAgIE1TRyAgICAgY2hhck1zZzsKLSAgICBldmVudF90IGV2dDsKLQotICAgIHdoaWxlIChQZWVrTWVzc2FnZSgmbXNnLE5VTEwsMCwwLFBNX1JFTU9WRSkpIHsKLQltZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKLQlzd2l0Y2ggKG1zZy5tZXNzYWdlKSB7Ci0JICAgIGNhc2UgV01fTU9VU0VNT1ZFOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0xCVVRUT05EQkxDTEs6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLIHwgRVZUX0RCTENMSUNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQlldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0xCVVRUT05VUDoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9SQlVUVE9OREJMQ0xLOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV04gfCBFVlRfREJMQ0xJQ0s7Ci0JCWV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX1JCVVRUT05ET1dOOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCWV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX1JCVVRUT05VUDoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fS0VZRE9XTjoKLQkgICAgY2FzZSBXTV9TWVNLRVlET1dOOgotCQlpZiAoSElXT1JEKG1zZy5sUGFyYW0pICYgS0ZfUkVQRUFUKSB7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9LRVlSRVBFQVQ7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgZXZ0LndoYXQgPSBFVlRfS0VZRE9XTjsKLQkJICAgIH0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fS0VZVVA6Ci0JICAgIGNhc2UgV01fU1lTS0VZVVA6Ci0JCWV2dC53aGF0ID0gRVZUX0tFWVVQOwotCQlicmVhazsKLQkgICAgfQotCi0JLyogQ29udmVydCBtb3VzZSBldmVudCBtb2RpZmllciBmbGFncyAqLwotCWlmIChldnQud2hhdCAmIEVWVF9NT1VTRUVWVCkgewotCSAgICBldnQud2hlcmVfeCA9IG1zZy5wdC54OwotCSAgICBldnQud2hlcmVfeSA9IG1zZy5wdC55OwotCSAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX01PVVNFTU9WRSkgewotCQlpZiAob2xkTW92ZSAhPSAtMSkgewotCQkgICAgZXZ0cVtvbGRNb3ZlXS53aGVyZV94ID0gZXZ0LndoZXJlX3g7LyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KLQkJICAgIGV2dHFbb2xkTW92ZV0ud2hlcmVfeSA9IGV2dC53aGVyZV95OwotCQkgICAgZXZ0LndoYXQgPSAwOwotCQkgICAgfQotCQllbHNlIHsKLQkJICAgIG9sZE1vdmUgPSBmcmVlSGVhZDsgLyogU2F2ZSBpZCBvZiB0aGlzIG1vdmUgZXZlbnQgICAqLwotCQkgICAgfQotCQl9Ci0JICAgIGVsc2UKLQkJb2xkTW92ZSA9IC0xOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX0xCVVRUT04pCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRCVVQ7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfUkJVVFRPTikKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRCVVQ7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfU0hJRlQpCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX1NISUZUS0VZOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX0NPTlRST0wpCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKLQkgICAgfQotCi0JLyogQ29udmVydCBrZXlib2FyZCBjb2RlcyAqLwotCVRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7Ci0JaWYgKGV2dC53aGF0ICYgRVZUX0tFWUVWVCkgewotCSAgICBpbnQgc2NhbkNvZGUgPSAobXNnLmxQYXJhbSA+PiAxNikgJiAweEZGOwotCSAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVVQKSB7Ci0JCS8qIEdldCBtZXNzYWdlIGZvciBrZXl1cCBjb2RlIGZyb20gdGFibGUgb2YgY2FjaGVkIGRvd24gdmFsdWVzICovCi0JCWV2dC5tZXNzYWdlID0ga2V5VXBNc2dbc2NhbkNvZGVdOwotCQlrZXlVcE1zZ1tzY2FuQ29kZV0gPSAwOwotCQl9Ci0JICAgIGVsc2UgewotCQlpZiAoUGVla01lc3NhZ2UoJmNoYXJNc2csTlVMTCxXTV9DSEFSLFdNX0NIQVIsUE1fUkVNT1ZFKSkKLQkJICAgIGV2dC5tZXNzYWdlID0gY2hhck1zZy53UGFyYW07Ci0JCWlmIChQZWVrTWVzc2FnZSgmY2hhck1zZyxOVUxMLFdNX1NZU0NIQVIsV01fU1lTQ0hBUixQTV9SRU1PVkUpKQotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBjaGFyTXNnLndQYXJhbTsKLQkJZXZ0Lm1lc3NhZ2UgfD0gKChtc2cubFBhcmFtID4+IDgpICYgMHhGRjAwKTsKLQkJa2V5VXBNc2dbc2NhbkNvZGVdID0gKHVzaG9ydClldnQubWVzc2FnZTsKLQkJfQotCSAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVJFUEVBVCkKLQkJZXZ0Lm1lc3NhZ2UgfD0gKG1zZy5sUGFyYW0gPDwgMTYpOwotCSAgICBpZiAoSElXT1JEKG1zZy5sUGFyYW0pICYgS0ZfQUxURE9XTikKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfQUxUU1RBVEU7Ci0JICAgIGlmIChHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDBVKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9TSElGVEtFWTsKLQkgICAgaWYgKEdldEtleVN0YXRlKFZLX0NPTlRST0wpICYgMHg4MDAwVSkKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfQ1RSTFNUQVRFOwotCSAgICBvbGRNb3ZlID0gLTE7Ci0JICAgIH0KLQotCWlmIChldnQud2hhdCAhPSAwKSB7Ci0JICAgIC8qIEFkZCB0aW1lIHN0YW1wIGFuZCBhZGQgdGhlIGV2ZW50IHRvIHRoZSBxdWV1ZSAqLwotCSAgICBldnQud2hlbiA9IG1zZy50aW1lOwotCSAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JCWFkZEV2ZW50KCZldnQpOwotCQl9Ci0JICAgIH0KLQlEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoKQotewotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIF9tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgaW5pdEV2ZW50UXVldWUoKTsKLSAgICBtZW1zZXQoa2V5VXBNc2csMCxzaXplb2Yoa2V5VXBNc2cpKTsKLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCi1hbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9zZXRNb3VzZVBvcygKLSAgICBpbnQgKngsCi0gICAgaW50ICp5KQotewotICAgIFNldEN1cnNvclBvcygqeCwqeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFdpbjMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBXaW4zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzUyZGFkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNkZWZpbmUgU1RSSUNUCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPG1tc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkN2VkNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFNUUklDVAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotI2lmZGVmICBfX0JPUkxBTkRDX18KLSNwcmFnbWEgd2FybiAtcGFyCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgICAgIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBNVFJSX2luaXQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBkTyBhbnkgc3BlY2lhbCBpbml0IGNvZGUgaW4gaGVyZS4gKi8KLSAgICBNVFJSX2luaXQoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdHlwZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17Ci0gICAgcmV0dXJuIF9PU19SVFRBUkdFVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQotewotICAgIHJldHVybiBQTV8zODY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgZmlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGVuYW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKAotICAgIGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKLQlzW3Bvc10gPSAnXFwnOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgdXNlciBkZWZpbmVkIFBNX2ZhdGFsRXJyb3IgY2xlYW51cCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVwb3J0IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIGFuZCBoYWx0IHRoZSBwcm9ncmFtLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcigKLSAgICBjb25zdCBjaGFyICptc2cpCi17Ci0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0gICAgLyogVE9ETzogRGlzcGxheSBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQhICovCi0vKiAgTWVzc2FnZUJveChOVUxMLG1zZywiRmF0YWwgRXJyb3IhIiwgTUJfSUNPTkVYQ0xBTUFUSU9OKTsgKi8KLSAgICBleGl0KDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIHRoZSByZWFsIG1vZGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgQklPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1ZigKLSAgICB1aW50ICpsZW4sCi0gICAgdWludCAqcnNlZywKLSAgICB1aW50ICpyb2ZmKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIGZvciB0aGUgUlRUYXJnZXQgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVjayBpZiBhIGtleSBoYXMgYmVlbiBwcmVzc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIC8qIFRPRE86IE5lZWQgdG8gY2hlY2sgaWYgYSBrZXkgaXMgd2FpdGluZyBvbiB0aGUga2V5Ym9hcmQgcXVldWUgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XYWl0IGZvciBhbmQgcmV0dXJuIHRoZSBuZXh0IGtleXByZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIC8qIFRPRE86IE5lZWQgdG8gb2J0YWluIHRoZSBuZXh0IGtleXByZXNzLCBhbmQgYmxvY2sgdW50aWwgb25lIGlzIGhpdCAqLwotICAgIHJldHVybiAweEQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSB3aWR0aCBvZiB0aGUgT1MgY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNX3NldE9TU2NyZWVuV2lkdGgoCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQpCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBmb3IgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyICh1c2VkIGZvciBzb2Z0d2FyZSBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKAotICAgIFBNX2ludEhhbmRsZXIgaWgsCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGZvciBSVFRhcmdldC0zMiAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgdW5kZXIgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgdW5kZXIgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBwYXRoIG9yIHdvcmtpbmcgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBkcml2ZSBsZXR0ZXIgZm9yIHRoZSBib290IGRyaXZlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17Ci0gICAgcmV0dXJuICdjJzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIFZCRS9BRiBkcml2ZXIgZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQotewotICAgIHJldHVybiAiYzpcXCI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBQb2ludCB0aGlzIGF0IHRoZSBwYXRoIHdoZW4gdGhlIE51Y2xldXMgZHJpdmVycyB3aWxsIGJlIGZvdW5kICovCi0gICAgcmV0dXJuICJjOlxcbnVjbGV1cyI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQotewotICAgIHJldHVybiBQTV9nZXRNYWNoaW5lTmFtZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZSBvbiB0aGUgbmV0d29yay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICAvKiBOb3QgbmVjZXNzYXJ5IGZvciBSVFRhcmdldC0zMiAqLwotICAgIHJldHVybiAiVW5rbm93biI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVhbCBtb2RlIEJJT1MgZGF0YSBhcmVhLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gMHhBMDAwMCBwaHlzaWNhbCBWR0EgZ3JhcGhpY3MgZnJhbWVidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB2b2lkICpiYW5rUHRyOwotICAgIGlmICghYmFua1B0cikKLQliYW5rUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOwotICAgIHJldHVybiBiYW5rUHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSBsaW5lYXIgYWRkcmVzcyBpbiB0aGUgY2FsbGVycyBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICAvKiBUT0RPOiBNYXAgYSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZyBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwdHIsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgLyogVE9ETzogRnJlZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nICovCi19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLiAqLwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIFNsZWVwKG1pbGxpc2Vjb25kcyk7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mICh1bm5hbWVkKSBzaGFyZWQgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCi0gICAgbG9uZyBzaXplKQotewotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKAotICAgIHZvaWQgKnB0cikKLXsKLSAgICBQTV9mcmVlKHB0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIHRvIHRoZSBjYWxsaW5nIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gVGhlCi1hZGRyZXNzIHdpbGwgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiBhbm90aGVyIHByb2Nlc3MgdXNpbmcgdGhlCi1QTV9tYXBQaHlzaWNhbEFkZHIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2VzcygKLSAgICB2b2lkICpiYXNlLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIHJldHVybiBiYXNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHJlYWwgbW9kZSBwb2ludGVyIHRvIGEgcHJvdGVjdGVkIG1vZGUgcG9pbnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCi0gICAgdWludCByX3NlZywKLSAgICB1aW50IHJfb2ZmKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCi0gICAgdWludCBzaXplLAotICAgIHVpbnQgKnJfc2VnLAotICAgIHVpbnQgKnJfb2ZmKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCi0gICAgdm9pZCAqbWVtKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdCAocGFyYW1ldGVycyBpbiBEUE1JIGNvbXBhdGlibGUgc3RydWN0dXJlKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgRFBNSV9yZWdzICpyZWdzKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NngoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAotICAgIHVsb25nICpwaHlzaWNhbCwKLSAgICB1bG9uZyAqdG90YWwpCi17Ci0gICAgLyogVE9ETzogRmlndXJlIG91dCBob3cgdG8gZGV0ZXJtaW5lIHRoZSBhdmFpbGFibGUgbWVtb3J5LiBOb3QgZW50aXJlbHkgKi8KLSAgICAvKiAgICAgICBjcml0aWNhbCBzbyByZXR1cm5pbmcgMCBpcyBPSy4gKi8KLSAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgLyogVE9ETzogQWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQsIHBoc3lpY2FsbHkgY29udGlnb3VzIG1lbW9yeSBmb3IgRE1BICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotCi0gICAgaWJvb2wgY29udGlndW91cykKLXsKLSAgICAvKiBUT0RPOiBGcmVlIGEgbG9ja2VkIG1lbW9yeSBidWZmZXIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQSgKLSAgICBpbnQgYmFuaykKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoCi0gICAgaW50IGJhbmspCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydCgKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgd2FpdFZSVCkKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyB0byBsb2FkIHNoYXJlZCBsaWJyYXJpZXMhICovCi0gICAgKHZvaWQpc3pETExOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0YXJ0IGEgZGlyZWN0b3J5IGVudW1lcmF0aW9uIHNlYXJjaCAqLwotICAgIC8qICAgICAgIGdpdmVuIHRoZSBmaWxlbmFtZSAod2l0aCB3aWxkY2FyZHMpLiBUaGUgZGF0YSBzaG91bGQgYmUgKi8KLSAgICAvKiAgICAgICBjb252ZXJ0ZWQgYW5kIHJldHVybmVkIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB1bG9uZyBoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgZW51bWVyYXRpb24gKi8KLSAgICAvKiAgICAgICBzZWFyY2ggZ2l2ZW4gdGhlIHNlYXJjaCBjcml0ZXJpYSBkZWZpbmVkIGluIHRoZSBjYWxsIHRvICovCi0gICAgLyogICAgICAgUE1fZmluZEZpcnN0RmlsZS4gVGhlIGRhdGEgc2hvdWxkIGJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgKi8KLSAgICAvKiAgICAgICBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB1bG9uZyBoYW5kbGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2xvc2UgdGhlIGZpbmQgcHJvY2Vzcy4gVGhpcyBtYXkgZG8gKi8KLSAgICAvKiAgICAgICBub3RoaW5nIGZvciBzb21lIE9TJ2VzLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICBpZiAoZHJpdmUgPT0gMykKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgICh2b2lkKWRyaXZlOwotICAgIGdldGN3ZChkaXIsbGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgZmlsZSAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWF0dHJpYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lKSA9PSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gcm1kaXIoZmlsZW5hbWUpID09IDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5ZGZlNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2lmZGVmICBfX0JPUkxBTkRDX18KLSNwcmFnbWEgd2FybiAtcGFyCi0jZW5kaWYKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjMTg0ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBDUFVfbGFyZ2VJbnRlZ2VyIGNvdW50RnJlcTsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXI7Ci1zdGF0aWMgdWxvbmcgICAgICAgICAgICBzdGFydCxmaW5pc2g7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLSNpZmRlZiAgTk9fQVNTRU1CTEVSCi0gICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IGZhbHNlOwotI2Vsc2UKLSAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopJmNvdW50RnJlcSk7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fTFpUaW1lck9uKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKQotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmdG0tPnN0YXJ0KTsKLSAgICBlbHNlCi0JdG0tPnN0YXJ0LmxvdyA9IHRpbWVHZXRUaW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUxhcCx0bUNvdW50OwotCi0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpIHsKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtTGFwKTsKLQlfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG1MYXAsJnRtQ291bnQpOwotCXJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjb3VudEZyZXEubG93KTsKLQl9Ci0gICAgZWxzZSB7Ci0JdG1MYXAubG93ID0gdGltZUdldFRpbWUoKTsKLQlyZXR1cm4gKHRtTGFwLmxvdyAtIHRtLT5zdGFydC5sb3cpICogMTAwMEw7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0b3AgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX0xaVGltZXJPZmYoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpCi0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZ0bS0+ZW5kKTsKLSAgICBlbHNlCi0JdG0tPmVuZC5sb3cgPSB0aW1lR2V0VGltZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBpbiBtaWNyb3NlY29uZHMgYmV0d2VlbiBzdGFydCBhbmQgZW5kIHRpbWluZ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1Db3VudDsKLQotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKSB7Ci0JX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOwotCXJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjb3VudEZyZXEubG93KTsKLQl9Ci0gICAgZWxzZQotCXJldHVybiAodG0tPmVuZC5sb3cgLSB0bS0+c3RhcnQubG93KSAqIDEwMDBMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIGZyb20gdGhlIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsgcmV0dXJuIHRpbWVHZXRUaW1lKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fZXZlbnQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19ldmVudC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjJiMWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19ldmVudC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlcgotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAoTVMgRE9TKQotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJseSBsYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgZXZlbnQgbW9kdWxlLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgaWRlYWwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaWZkZWYgZmxhdG1vZGVsCi0KLWhlYWRlciAgX2V2ZW50ICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9ldmVudAotCi0gICAgY2V4dGVybiAgX0VWVF9iaW9zUHRyLERQVFIKLQotICAgIGNwdWJsaWMgX0VWVF9kYXRhU3RhcnQKLQotaWZkZWYgICBVU0VfTkFTTQotJWRlZmluZSBLQl9IRUFEICAgICBXT1JEIGVzaSswMUFoICAgOyBLZXlib2FyZCBidWZmZXIgaGVhZCBpbiBCSU9TIGRhdGEgYXJlYQotJWRlZmluZSBLQl9UQUlMICAgICBXT1JEIGVzaSswMUNoICAgOyBLZXlib2FyZCBidWZmZXIgdGFpbCBpbiBCSU9TIGRhdGEgYXJlYQotJWRlZmluZSBLQl9TVEFSVCAgICBXT1JEIGVzaSswODBoICAgOyBTdGFydCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLSVkZWZpbmUgS0JfRU5EICAgICAgV09SRCBlc2krMDgyaCAgIDsgRW5kIG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQotZWxzZQotS0JfSEVBRCAgICAgRVFVIFdPUkQgZXNpKzAxQWggICAgICAgOyBLZXlib2FyZCBidWZmZXIgaGVhZCBpbiBCSU9TIGRhdGEgYXJlYQotS0JfVEFJTCAgICAgRVFVIFdPUkQgZXNpKzAxQ2ggICAgICAgOyBLZXlib2FyZCBidWZmZXIgdGFpbCBpbiBCSU9TIGRhdGEgYXJlYQotS0JfU1RBUlQgICAgRVFVIFdPUkQgZXNpKzA4MGggICAgICAgOyBTdGFydCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLUtCX0VORCAgICAgIEVRVSBXT1JEIGVzaSswODJoICAgICAgIDsgRW5kIG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQotZW5kaWYKLQotICAgIGNwdWJsaWMgX0VWVF9kYXRhRW5kCi0KLWVuZGRhdGFzZWcgIF9ldmVudAotCi1iZWdjb2Rlc2VnICBfZXZlbnQgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLSAgICBjcHVibGljIF9FVlRfY29kZVN0YXJ0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfRVZUX2dldEtleUNvZGUodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIGtleSBjb2RlIGZvciB0aGUgbmV4dCBhdmFpbGFibGUga2V5IGJ5IGV4dHJhY3RpbmcgaXQgZnJvbQotOyB0aGUgQklPUyBrZXlib2FyZCBidWZmZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9nZXRLZXlDb2RlCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZXNpLFtfRVZUX2Jpb3NQdHJdCi0gICAgICAgIHhvciAgICAgZWJ4LGVieAotICAgICAgICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgbW92ICAgICBieCxbS0JfSEVBRF0KLSAgICAgICAgY21wICAgICBieCxbS0JfVEFJTF0KLSAgICAgICAganogICAgICBAQERvbmUKLSAgICAgICAgeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIG1vdiAgICAgYXgsW2VzaStlYnhdICAgIDsgRUFYIDo9IGNoYXJhY3RlciBmcm9tIGtleWJvYXJkIGJ1ZmZlcgotICAgICAgICBpbmMgICAgIF9ieAotICAgICAgICBpbmMgICAgIF9ieAotICAgICAgICBjbXAgICAgIGJ4LFtLQl9FTkRdICAgICA7IEhpdCB0aGUgZW5kIG9mIHRoZSBrZXlib2FyZCBidWZmZXI/Ci0gICAgICAgIGpsICAgICAgQEAxCi0gICAgICAgIG1vdiAgICAgYngsW0tCX1NUQVJUXQotQEAxOiAgICBtb3YgICAgIFtLQl9IRUFEXSxieCAgICA7IFVwZGF0ZSBrZXlib2FyZCBidWZmZXIgaGVhZCBwb2ludGVyCi0KLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IF9FVlRfZGlzYWJsZUludCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybiBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cyBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9FVlRfZGlzYWJsZUludAotCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgUHV0IGZsYWcgd29yZCBvbiBzdGFjawotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IERpc2FibGUgaW50ZXJydXB0cyEKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgOyBkZXBvc2l0IGZsYWcgd29yZCBpbiByZXR1cm4gcmVnaXN0ZXIKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX0VWVF9yZXN0b3JlSW50KGludCBwcyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXN0b3JlIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9FVlRfcmVzdG9yZUludAotCi0gICAgICAgIEFSRyAgICAgcHM6VUlOVAotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcCAgICAgICAgIDsgU2V0IHVwIHN0YWNrIGZyYW1lCi0gICAgICAgIHB1c2ggICAgW0RXT1JEIHBzXQotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgcHJvY2Vzc29yIHN0YXR1cyAoYW5kIGludGVycnVwdHMpCi0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgRVZUX3JkaW54KGludCBwb3J0LGludCBpbmRleCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIGFuIGluZGV4ZWQgcmVnaXN0ZXIgdmFsdWUgZnJvbSBhbiBJL08gcG9ydC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBFVlRfcmRpbngKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVCwgaW5kZXg6VUlOVAotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcAotICAgICAgICBtb3YgICAgIGVkeCxbcG9ydF0KLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICBpbmMgICAgIGR4Ci0gICAgICAgIGluICAgICAgYWwsZHgKLSAgICAgICAgbW92enggICBlYXgsYWwKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgRVZUX3dyaW54KGludCBwb3J0LGludCBpbmRleCxpbnQgdmFsdWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZXMgYW4gaW5kZXhlZCByZWdpc3RlciB2YWx1ZSB0byBhbiBJL08gcG9ydC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBFVlRfd3JpbngKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVCwgaW5kZXg6VUlOVCwgdmFsdWU6VUlOVAotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcAotICAgICAgICBtb3YgICAgIGVkeCxbcG9ydF0KLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgbW92ICAgICBhaCxbQllURSB2YWx1ZV0KLSAgICAgICAgb3V0ICAgICBkeCxheAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotICAgIGNwdWJsaWMgX0VWVF9jb2RlRW5kCi0KLWVuZGNvZGVzZWcgIF9ldmVudAotCi1lbmRpZgotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fbHp0aW1lci5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX2x6dGltZXIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjhlZWE2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fbHp0aW1lci5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBOQVNNIG9yIFRBU00gQXNzZW1ibGVyCi07KiBFbnZpcm9ubWVudDogc214IDMyIGJpdCBpbnRlbCBDUFUKLTsqCi07KiBEZXNjcmlwdGlvbjogU01YIGRvZXMgbm90IHN1cHBvcnQgNDg2J3MsIHNvIHRoaXMgbW9kdWxlIGlzIG5vdCBuZWNlc3NhcnkuCi07KgotOyogIEFsbCByZWdpc3RlcnMgYW5kIGFsbCBmbGFncyBhcmUgcHJlc2VydmVkIGJ5IGFsbCByb3V0aW5lcywgZXhjZXB0Ci07KiAgaW50ZXJydXB0cyB3aGljaCBhcmUgYWx3YXlzIHR1cm5lZCBvbgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiCi0KLWhlYWRlciAgICAgIF9senRpbWVyCi0KLWJlZ2RhdGFzZWcgIF9senRpbWVyCi0KLWVuZGRhdGFzZWcgIF9senRpbWVyCi0KLWJlZ2NvZGVzZWcgIF9senRpbWVyICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWNwcm9jc3RhcnQgICBMWl9kaXNhYmxlCi0gICAgICAgIGNsaQotICAgICAgICByZXQKLWNwcm9jZW5kCi0KLWNwcm9jc3RhcnQgICBMWl9lbmFibGUKLSAgICAgICAgc3RpCi0gICAgICAgIHJldAotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX2x6dGltZXIKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fcG0uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19wbS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjN2NiMjEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19wbS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50Ci07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bwotOyogICAgICAgICAgICAgIFNNWC4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfcG0gICAgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotYmVnZGF0YXNlZyAgX3BtCi0KLSAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAotCi1pbnRlbF9pZCAgICAgICAgZGIgICJHZW51aW5lSW50ZWwiICA7IEludGVsIHZlbmRvciBJRAotCi1lbmRkYXRhc2VnICBfcG0KLQotYmVnY29kZXNlZyAgX3BtICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NlZ3JlYWQoUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCBzZWdtZW50IHJlZ2lzdGVycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnRkbGwxNiBQTV9zZWdyZWFkCi0KLSAgICAgICAgQVJHICAgICBzcmVnczpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgYXgsZXMKLSAgICAgICAgX2xlcyAgICBfc2ksW3NyZWdzXQotICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzJdLGNzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krNF0sc3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs2XSxkcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzhdLGZzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMTBdLGdzCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOyBDcmVhdGUgYSB0YWJsZSBvZiB0aGUgMjU2IGRpZmZlcmVudCBpbnRlcnJ1cHQgY2FsbHMgdGhhdCB3ZSBjYW4ganVtcAotOyBpbnRvCi0KLWlmZGVmICAgVVNFX05BU00KLQotJWFzc2lnbiBpbnRubyAwCi0KLWludFRhYmxlOgotJXJlcCAgICAyNTYKLSAgICAgICAgZGIgICAgICAwQ0RoCi0gICAgICAgIGRiICAgICAgaW50bm8KLSVhc3NpZ24gaW50bm8gICBpbnRubyArIDEKLSAgICAgICAgcmV0Ci0gICAgICAgIG5vcAotJWVuZHJlcAotCi1lbHNlCi0KLWludG5vID0gMAotCi1pbnRUYWJsZToKLSAgICAgICAgUkVQVCAgICAyNTYKLSAgICAgICAgZGIgICAgICAwQ0RoCi0gICAgICAgIGRiICAgICAgaW50bm8KLWludG5vID0gaW50bm8gKyAxCi0gICAgICAgIHJldAotICAgICAgICBub3AKLSAgICAgICAgRU5ETQotCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfUE1fZ2VuSW50ICAgIC0gR2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGludGVycnVwdAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jbmVhciAgIF9QTV9nZW5JbnQKLQotICAgICAgICBwdXNoICAgIF9heCAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYXgKLSAgICAgICAgcHVzaCAgICBfYnggICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2J4Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtVSU5UIGVzcCsxMl0gICAgICAgOyBFQlggOj0gaW50ZXJydXB0IG51bWJlcgotICAgICAgICBtb3YgICAgIF9heCxvZmZzZXQgaW50VGFibGUgICAgIDsgUG9pbnQgdG8gaW50ZXJydXB0IGdlbmVyYXRpb24gdGFibGUKLSAgICAgICAgc2hsICAgICBfYngsMiAgICAgICAgICAgICAgICAgICA7IF9CWCA6PSBpbmRleCBpbnRvIHRhYmxlCi0gICAgICAgIGFkZCAgICAgX2F4LF9ieCAgICAgICAgICAgICAgICAgOyBfQVggOj0gcG9pbnRlciB0byBpbnRlcnJ1cHQgY29kZQotICAgICAgICB4Y2hnICAgIGVheCxbZXNwKzRdICAgICAgICAgICAgIDsgUmVzdG9yZSBlYXgsIGFuZCBzZXQgZm9yIGludAotICAgICAgICBwb3AgICAgIF9ieCAgICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBfYngKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9pbnQzODZ4KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQsUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJc3N1ZXMgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgcm91dGluZSBoYXMgYmVlbgotOyB3cml0dGVuIHRvIGFsbG93IHVzZXIgcHJvZ3JhbXMgdG8gbG9hZCBDUyBhbmQgRFMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi07IG90aGVyIHRoYW4gdGhlIGRlZmF1bHQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydGRsbDE2IFBNX2ludDM4NngKLQotICAgICAgICBBUkcgICAgIGludG5vOlVJTlQsIGlucHRyOkRQVFIsIG91dHB0cjpEUFRSLCBzcmVnczpEUFRSCi0KLSAgICAgICAgTE9DQUwgICBmbGFnczpVSU5ULCBzdl9kczpVSU5ULCBzdl9lc2k6VUxPTkcgPSBMb2NhbFNpemUKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBwdXNoICAgIGZzCi0gICAgICAgIHB1c2ggICAgZ3MKLQotICAgICAgICBfbGRzICAgIF9zaSxbc3JlZ3NdICAgICAgICAgOyBEUzpfU0kgLT4gTG9hZCBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIGVzLFtfc2ldCi0gICAgICAgIG1vdiAgICAgYngsW19zaSs2XQotICAgICAgICBtb3YgICAgIFtzdl9kc10sX2J4ICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIHVzZXIgRFMgb24gc3RhY2sKLSAgICAgICAgbW92ICAgICBmcyxbX3NpKzhdCi0gICAgICAgIG1vdiAgICAgZ3MsW19zaSsxMF0KLQotICAgICAgICBfbGRzICAgIF9zaSxbaW5wdHJdICAgICAgICAgOyBMb2FkIENQVSByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBlYXgsW19zaV0KLSAgICAgICAgbW92ICAgICBlYngsW19zaSs0XQotICAgICAgICBtb3YgICAgIGVjeCxbX3NpKzhdCi0gICAgICAgIG1vdiAgICAgZWR4LFtfc2krMTJdCi0gICAgICAgIG1vdiAgICAgZWRpLFtfc2krMjBdCi0gICAgICAgIG1vdiAgICAgZXNpLFtfc2krMTZdCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIF9icCAgICAgICAgICAgICAgICAgOyBTb21lIGludGVycnVwdHMgdHJhc2ggdGhpcyEKLSAgICAgICAgY2xjICAgICAgICAgICAgICAgICAgICAgICAgIDsgR2VuZXJhdGUgdGhlIGludGVycnVwdAotICAgICAgICBwdXNoICAgIFtVSU5UIGludG5vXQotICAgICAgICBtb3YgICAgIGRzLFtXT1JEIHN2X2RzXSAgICAgOyBTZXQgdmFsdWUgb2YgdXNlcidzIERTIHNlbGVjdG9yCi0gICAgICAgIGNhbGwgICAgX1BNX2dlbkludAotICAgICAgICBwb3AgICAgIF9icCAgICAgICAgICAgICAgICAgOyBQb3AgaW50bm8gZnJvbSBzdGFjayAoZmxhZ3MgdW5jaGFuZ2VkKQotICAgICAgICBwb3AgICAgIF9icCAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHZhbHVlIG9mIHN0YWNrIGZyYW1lIHBvaW50ZXIKLSAgICAgICAgcG9wICAgICBkcyAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSB2YWx1ZSBvZiBEUwotCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgZmxhZ3MgZm9yIGxhdGVyCi0gICAgICAgIHBvcCAgICAgW1VJTlQgZmxhZ3NdCi0gICAgICAgIHB1c2ggICAgZXNpICAgICAgICAgICAgICAgICA7IFNhdmUgRVNJIGZvciBsYXRlcgotICAgICAgICBwb3AgICAgIFtEV09SRCBzdl9lc2ldCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgRFMgZm9yIGxhdGVyCi0gICAgICAgIHBvcCAgICAgW1VJTlQgc3ZfZHNdCi0KLSAgICAgICAgX2xkcyAgICBfc2ksW291dHB0cl0gICAgICAgIDsgU2F2ZSBDUFUgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgW19zaV0sZWF4Ci0gICAgICAgIG1vdiAgICAgW19zaSs0XSxlYngKLSAgICAgICAgbW92ICAgICBbX3NpKzhdLGVjeAotICAgICAgICBtb3YgICAgIFtfc2krMTJdLGVkeAotICAgICAgICBwdXNoICAgIFtEV09SRCBzdl9lc2ldCi0gICAgICAgIHBvcCAgICAgW0RXT1JEIF9zaSsxNl0KLSAgICAgICAgbW92ICAgICBbX3NpKzIwXSxlZGkKLQotICAgICAgICBtb3YgICAgIF9ieCxbZmxhZ3NdICAgICAgICAgOyBSZXR1cm4gZmxhZ3MKLSAgICAgICAgYW5kICAgICBlYngsMWggICAgICAgICAgICAgIDsgSXNvbGF0ZSBjYXJyeSBmbGFnCi0gICAgICAgIG1vdiAgICAgW19zaSsyNF0sZWJ4ICAgICAgICA7IFNhdmUgY2FycnkgZmxhZyBzdGF0dXMKLQotICAgICAgICBfbGRzICAgIF9zaSxbc3JlZ3NdICAgICAgICAgOyBTYXZlIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgW19zaV0sZXMKLSAgICAgICAgbW92ICAgICBfYngsW3N2X2RzXQotICAgICAgICBtb3YgICAgIFtfc2krNl0sYnggICAgICAgICAgOyBHZXQgcmV0dXJuZWQgRFMgZnJvbSBzdGFjawotICAgICAgICBtb3YgICAgIFtfc2krOF0sZnMKLSAgICAgICAgbW92ICAgICBbX3NpKzEwXSxncwotCi0gICAgICAgIHBvcCAgICAgZ3MgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBmcwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zYXZlRFModm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNhdmUgdGhlIHZhbHVlIG9mIERTIGludG8gYSBzZWN0aW9uIG9mIHRoZSBjb2RlIHNlZ21lbnQsIHNvIHRoYXQgd2UgY2FuCi07IHF1aWNrbHkgbG9hZCB0aGlzIHZhbHVlIGF0IGEgbGF0ZXIgZGF0ZSBpbiB0aGUgUE1fbG9hZERTKCkgcm91dGluZSBmcm9tCi07IGluc2lkZSBpbnRlcnJ1cHQgaGFuZGxlcnMgZXRjLiBUaGUgbWV0aG9kIHRvIGRvIHRoaXMgaXMgZGlmZmVyZW50Ci07IGRlcGVuZGluZyBvbiB0aGUgRE9TIGV4dGVuZGVyIGJlaW5nIHVzZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydGRsbDE2IFBNX3NhdmVEUwotCi0gICAgICAgIG1vdiAgICAgW19QTV9zYXZlZERTXSxkcyAgICA7IFN0b3JlIGF3YXkgaW4gZGF0YSBzZWdtZW50Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX2xvYWREUyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUm91dGluZSB0byBsb2FkIHRoZSBEUyByZWdpc3RlciB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY3VycmVudAotOyBET1MgZXh0ZW5kZXIuIE9ubHkgdGhlIERTIHJlZ2lzdGVyIGlzIGxvYWRlZCwgbm90IHRoZSBFUyByZWdpc3Rlciwgc28KLTsgaWYgeW91IHdpc2ggdG8gY2FsbCBDIGNvZGUsIHlvdSB3aWxsIG5lZWQgdG8gYWxzbyBsb2FkIHRoZSBFUyByZWdpc3RlcgotOyBpbiAzMiBiaXQgcHJvdGVjdGVkIG1vZGUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydGRsbDE2IFBNX2xvYWREUwotCi0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXSA7IFdlIGNhbiBhY2Nlc3MgdGhlIHByb3BlciBEUyB0aHJvdWdoIENTCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldEJhbmtBKGludCBiYW5rKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRCYW5rQQotCi0gICAgICAgIEFSRyAgICAgYmFuazpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIG1vdiAgICAgX2J4LDAKLSAgICAgICAgbW92ICAgICBfYXgsNEYwNWgKLSAgICAgICAgbW92ICAgICBfZHgsW2JhbmtdCi0gICAgICAgIGludCAgICAgMTBoCi0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldEJhbmtBQihpbnQgYmFuaykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0QmFua0FCCi0KLSAgICAgICAgQVJHICAgICBiYW5rOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgbW92ICAgICBfYngsMAotICAgICAgICBtb3YgICAgIF9heCw0RjA1aAotICAgICAgICBtb3YgICAgIF9keCxbYmFua10KLSAgICAgICAgaW50ICAgICAxMGgKLSAgICAgICAgbW92ICAgICBfYngsMQotICAgICAgICBtb3YgICAgIF9heCw0RjA1aAotICAgICAgICBtb3YgICAgIF9keCxbYmFua10KLSAgICAgICAgaW50ICAgICAxMGgKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0Q1JUU3RhcnQoaW50IHgsaW50IHksaW50IHdhaXRWUlQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldENSVFN0YXJ0Ci0KLSAgICAgICAgQVJHICAgICB4OlVJTlQsIHk6VUlOVCwgd2FpdFZSVDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIG1vdiAgICAgX2J4LFt3YWl0VlJUXQotICAgICAgICBtb3YgICAgIF9jeCxbeF0KLSAgICAgICAgbW92ICAgICBfZHgsW3ldCi0gICAgICAgIG1vdiAgICAgX2F4LDRGMDdoCi0gICAgICAgIGludCAgICAgMTBoCi0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX1BNX2lucChpbnQgcG9ydCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9pbnAKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICB4b3IgICAgIF9heCxfYXgKLSAgICAgICAgbW92ICAgICBfZHgsW3BvcnRdCi0gICAgICAgIGluICAgICAgYWwsZHgKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX291dHAoaW50IHBvcnQsaW50IHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGUgYSBieXRlIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fb3V0cAotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBtb3YgICAgIF9heCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVkgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi0lbWFjcm8gIElPREVMQVlOIDEKLSVyZXAgICAgJTEKLSAgICAgICAgREVMQVkKLSVlbmRyZXAKLSVlbmRtYWNybwotZWxzZQotbWFjcm8gICBERUxBWQotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotZW5kbQotbWFjcm8gICBJT0RFTEFZTiAgICBOCi0gICAgcmVwdCAgICBOCi0gICAgICAgIERFTEFZCi0gICAgZW5kbQotZW5kbQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX1BNX3JlYWRDTU9TKGludCBpbmRleCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKLTsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fcmVhZENNT1MKLQotICAgICAgICBBUkcgICAgIGluZGV4OlVJTlQKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCi0gICAgICAgIGNsaQotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIGluICAgICAgYWwsNzFoCi0gICAgICAgIG1vdiAgICAgYWgsYWwKLSAgICAgICAgeG9yICAgICBhbCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBOTUkKLSAgICAgICAgc3RpCi0gICAgICAgIG1vdiAgICAgYWwsYWggICAgICAgICAgICAgICA7IFJldHVybiB2YWx1ZSBpbiBBTAotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKLTsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fd3JpdGVDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5ULCB2YWx1ZTpVQ0hBUgotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgbW92ICAgICBhbCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgNzFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIHN0aQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2dldFBEQiAtIFJldHVybiB0aGUgUGFnZSBUYWJsZSBEaXJlY3RvcnkgQmFzZSBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2dldFBEQgotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfUE1fZmx1c2hUTEIgLSBGbHVzaCB0aGUgVHJhbnNsYXRpb24gTG9va2FzaWRlIGJ1ZmZlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2ZsdXNoVExCCi0KLSAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMyAgICAgICAgIAotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9wbQotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19wbXNteC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3Btc214LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MmNlMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3Btc214LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDkzMyArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiAzMi1iaXQgU01YIGVtYmVkZGVkIHN5c3RlbXMgZGV2ZWxvcG1lbnQKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBQTSBsaWJyYXJ5IHNwZWNpZmljIHRvCi07KiAgICAgICAgICAgICAgU01YIGludGVycnVwdCBoYW5kbGluZy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbXNteCAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLTsgRGVmaW5lIHRoZSBzaXplIG9mIG91ciBsb2NhbCBzdGFja3MuIEZvciByZWFsIG1vZGUgY29kZSB0aGV5IGNhbnQgYmUKLTsgdGhhdCBiaWcsIGJ1dCBmb3IgMzIgYml0IHByb3RlY3RlZCBtb2RlIGNvZGUgd2UgY2FuIG1ha2UgdGhlbSBuaWNlIGFuZAotOyBsYXJnZSBzbyB0aGF0IGNvbXBsZXggQyBmdW5jdGlvbnMgY2FuIGJlIHVzZWQuCi0KLU1PVVNFX1NUQUNLIEVRVSA0MDk2Ci1USU1FUl9TVEFDSyBFUVUgNDA5NgotS0VZX1NUQUNLICAgRVFVIDEwMjQKLUlOVDEwX1NUQUNLIEVRVSAxMDI0Ci0KLWlmZGVmICAgVVNFX05BU00KLQotOyBNYWNybyB0byBsb2FkIERTIGFuZCBFUyByZWdpc3RlcnMgd2l0aCBjb3JyZWN0IHZhbHVlLgotCi0laW1hY3JvICAgTE9BRF9EUyAwCi0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXQotICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KLSVlbmRtYWNybwotCi07IE5vdGUgdGhhdCBpbnRlcnJ1cHRzIHdlIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgdGhlIGZvbGxvd2luZyBzdGFjawotOyAlaW1hY3JvIGZvciBjb3JyZWN0IG9wZXJhdGlvbiwgYnV0IHdlIGRvIG5vdCBlbmFibGUgdGhlbSBhZ2Fpbi4gTm9ybWFsbHkKLTsgdGhlc2UgJWltYWNyb3MgYXJlIHVzZWQgd2l0aGluIGludGVycnVwdCBoYW5kbGVycyBzbyBpbnRlcnJ1cHRzIHNob3VsZAotOyBhbHJlYWR5IGJlIG9mZi4gV2UgdHVybiB0aGVtIGJhY2sgb24gZXhwbGljaXRseSBsYXRlciBpZiB0aGUgdXNlciBjb2RlCi07IG5lZWRzIHRoZW0gdG8gYmUgYmFjayBvbi4KLQotOyBNYWNybyB0byBzd2l0Y2ggdG8gYSBuZXcgbG9jYWwgc3RhY2suCi0KLSVpbWFjcm8gTkVXU1RLICAxCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIFtzZWdfJTFdLHNzCi0gICAgICAgIG1vdiAgICAgW3B0cl8lMV0sX3NwCi0gICAgICAgIG1vdiAgICAgW1RlbXBTZWddLGRzCi0gICAgICAgIG1vdiAgICAgc3MsW1RlbXBTZWddCi0gICAgICAgIG1vdiAgICAgX3NwLG9mZnNldCAlMQotJWVuZG1hY3JvCi0KLTsgJWltYWNybyB0byBzd2l0Y2ggYmFjayB0byB0aGUgb2xkIHN0YWNrLgotCi0laW1hY3JvICAgUkVTVFNUSyAgIDEKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgc3MsW3NlZ18lMV0KLSAgICAgICAgbW92ICAgICBfc3AsW3B0cl8lMV0KLSVlbmRtYWNybwotCi07ICVpbWFjcm8gdG8gc3dhcCB0aGUgY3VycmVudCBzdGFjayB3aXRoIHRoZSBvbmUgc2F2ZWQgYXdheS4KLQotJWltYWNybyBTV0FQU1RLIDEKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgYXgsc3MKLSAgICAgICAgeGNoZyAgICBheCxbc2VnXyUxXQotICAgICAgICBtb3YgICAgIHNzLGF4Ci0gICAgICAgIHhjaGcgICAgX3NwLFtwdHJfJTFdCi0lZW5kbWFjcm8KLQotZWxzZQotCi07IE1hY3JvIHRvIGxvYWQgRFMgYW5kIEVTIHJlZ2lzdGVycyB3aXRoIGNvcnJlY3QgdmFsdWUuCi0KLU1BQ1JPICAgTE9BRF9EUwotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10KLSAgICAgICAgbW92ICAgICBlcyxbY3M6X1BNX3NhdmVkRFNdCi1FTkRNCi0KLTsgTm90ZSB0aGF0IGludGVycnVwdHMgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGUgZm9sbG93aW5nIHN0YWNrCi07IG1hY3JvIGZvciBjb3JyZWN0IG9wZXJhdGlvbiwgYnV0IHdlIGRvIG5vdCBlbmFibGUgdGhlbSBhZ2Fpbi4gTm9ybWFsbHkKLTsgdGhlc2UgbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiBpbnRlcnJ1cHQgaGFuZGxlcnMgc28gaW50ZXJydXB0cyBzaG91bGQKLTsgYWxyZWFkeSBiZSBvZmYuIFdlIHR1cm4gdGhlbSBiYWNrIG9uIGV4cGxpY2l0bHkgbGF0ZXIgaWYgdGhlIHVzZXIgY29kZQotOyBuZWVkcyB0aGVtIHRvIGJlIGJhY2sgb24uCi0KLTsgTWFjcm8gdG8gc3dpdGNoIHRvIGEgbmV3IGxvY2FsIHN0YWNrLgotCi1NQUNSTyAgIE5FV1NUSyAgc3RrbmFtZQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBbc2VnXyZzdGtuYW1lJl0sc3MKLSAgICAgICAgbW92ICAgICBbcHRyXyZzdGtuYW1lJl0sX3NwCi0gICAgICAgIG1vdiAgICAgW1RlbXBTZWddLGRzCi0gICAgICAgIG1vdiAgICAgc3MsW1RlbXBTZWddCi0gICAgICAgIG1vdiAgICAgX3NwLG9mZnNldCBzdGtuYW1lCi1FTkRNCi0KLTsgTWFjcm8gdG8gc3dpdGNoIGJhY2sgdG8gdGhlIG9sZCBzdGFjay4KLQotTUFDUk8gICBSRVNUU1RLIHN0a25hbWUKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgc3MsW3NlZ18mc3RrbmFtZSZdCi0gICAgICAgIG1vdiAgICAgX3NwLFtwdHJfJnN0a25hbWUmXQotRU5ETQotCi07IE1hY3JvIHRvIHN3YXAgdGhlIGN1cnJlbnQgc3RhY2sgd2l0aCB0aGUgb25lIHNhdmVkIGF3YXkuCi0KLU1BQ1JPICAgU1dBUFNUSyBzdGtuYW1lCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIGF4LHNzCi0gICAgICAgIHhjaGcgICAgYXgsW3NlZ18mc3RrbmFtZSZdCi0gICAgICAgIG1vdiAgICAgc3MsYXgKLSAgICAgICAgeGNoZyAgICBfc3AsW3B0cl8mc3RrbmFtZSZdCi1FTkRNCi0KLWVuZGlmCi0KLWJlZ2RhdGFzZWcgIF9wbXNteAotCi0gICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKLSAgICBjZXh0ZXJuIF9QTV9jcml0SGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fYnJlYWtIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV90aW1lckhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX3J0Y0hhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2tleUhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2tleTE1SGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fbW91c2VIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9pbnQxMEhhbmRsZXIsQ1BUUgotCi0gICAgY2V4dGVybiBfUE1fY3RybENQdHIsRFBUUgotICAgIGNleHRlcm4gX1BNX2N0cmxCUHRyLERQVFIKLSAgICBjZXh0ZXJuIF9QTV9jcml0UHRyLERQVFIKLQotICAgIGNleHRlcm4gX1BNX3ByZXZUaW1lcixGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZSVEMsRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2S2V5LEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldktleTE1LEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkJyZWFrLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkN0cmxDLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkNyaXRpY2FsLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxUaW1lcixVTE9ORwotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsUlRDLFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxLZXksVUxPTkcKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbEtleTE1LFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxJbnQxMCxVTE9ORwotCi1jcHVibGljIF9QTV9wbXNteERhdGFTdGFydAotCi07IEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgb2YgdGhlIGxvY2FsIHN0YWNrcyB0aGF0IHdlIG5lZWQuIFRoZXNlIHN0YWNrcwotOyBhcmUgbm90IHZlcnkgbGFyZ2UsIGJ1dCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIGZvciBtb3N0IHB1cnBvc2VzCi07IChnZW5lcmFsbHkgeW91IHdhbnQgdG8gaGFuZGxlIHRoZXNlIGludGVycnVwdHMgcXVpY2tseSwgc2ltcGx5IHN0b3JpbmcKLTsgdGhlIGluZm9ybWF0aW9uIGZvciBsYXRlciBhbmQgdGhlbiByZXR1cm5pbmcpLiBJZiB5b3UgbmVlZCBiaWdnZXIKLTsgc3RhY2tzIHRoZW4gY2hhbmdlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiBoZXJlLgotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgTU9VU0VfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotTXNTdGFjazogICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfTXNTdGFjayBEVUlOVCAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX01zU3RhY2sgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBJTlQxMF9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1JbnQxMFN0YWNrOiAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9JbnQxMFN0YWNrICBEVUlOVCAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfSW50MTBTdGFjayAgZHcgICAgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIFRJTUVSX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLVRtU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX1RtU3RhY2sgRFVJTlQgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19UbVN0YWNrIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgVElNRVJfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotUnRjU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfUnRjU3RhY2sgRFVJTlQgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX1J0Y1N0YWNrIGR3ICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci1SdGNJbnNpZGUgICBkdyAgICAgIDAgICAgICAgICAgIDsgQXJlIHdlIHN0aWxsIGhhbmRsaW5nIGN1cnJlbnQgaW50ZXJydXB0Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBLRVlfU1RBQ0sgICAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1LeVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9LeVN0YWNrIERVSU5UICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfS3lTdGFjayBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLUt5SW5zaWRlICAgIGR3ICAgICAgMCAgICAgICAgICAgOyBBcmUgd2Ugc3RpbGwgaGFuZGxpbmcgY3VycmVudCBpbnRlcnJ1cHQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIEtFWV9TVEFDSyAgICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLUt5MTVTdGFjazogICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX0t5MTVTdGFjayAgIERVSU5UICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19LeTE1U3RhY2sgICBkdyAgICAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi1UZW1wU2VnICAgICBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgc3RhY2sgc2VnbWVudAotCi1jcHVibGljIF9QTV9wbXNteERhdGFFbmQKLQotZW5kZGF0YXNlZyAgX3Btc214Ci0KLWJlZ2NvZGVzZWcgIF9wbXNteCAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotY3B1YmxpYyBfUE1fcG1zbXhDb2RlU3RhcnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fbW91c2VJU1IgLSBNb3VzZSBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnRlcnJ1cHQgc3Vicm91dGluZSBjYWxsZWQgYnkgdGhlIG1vdXNlIGRyaXZlciB1cG9uIGludGVycnVwdHMsIHRvCi07IGRpc3BhdGNoIGNvbnRyb2wgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBJbnRlcnJ1cHRzIGFyZSBvbgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgSXQgaXMgX2V4dHJlbWVseV8gaW1wb3J0YW50IHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBleHRlbmRlZCByZWdpc3RlcnMKLTsgYXMgdGhlc2UgbWF5IHdlbGwgYmUgdHJhc2hlZCBieSB0aGUgcm91dGluZXMgY2FsbGVkIGZyb20gaGVyZSBhbmQgbm90Ci07IHJlc3RvcmVkIGNvcnJlY3RseSBieSB0aGUgbW91c2UgaW50ZXJmYWNlIG1vZHVsZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIEZvciBtb3VzZSBoYW5kbGVycyB0aGlzIGlzIG5vdCBhCi07ICAgICAgIHByb2JsZW0sIGFzIHRoZSBtb3VzZSBkcml2ZXIgYXJiaXRyYXRlcyBjYWxscyB0byB0aGUgdXNlciBtb3VzZQotOyAgICAgICBoYW5kbGVyIGZvciB1cy4KLTsKLTsgRW50cnk6ICAgIEFYICAtIENvbmRpdGlvbiBtYXNrIGdpdmluZyByZWFzb24gZm9yIGNhbGwKLTsgICAgICAgICAgIEJYICAtIE1vdXNlIGJ1dHRvbiBzdGF0ZQotOyAgICAgICAgICAgQ1ggIC0gSG9yaXpvbnRhbCBjdXJzb3IgY29vcmRpbmF0ZQotOyAgICAgICAgICAgRFggIC0gVmVydGljYWwgY3Vyc29yIGNvb3JkaW5hdGUKLTsgICAgICAgICAgIFNJICAtIEhvcml6b250YWwgbWlja2V5IHZhbHVlCi07ICAgICAgICAgICBESSAgLSBWZXJ0aWNhbCBtaWNrZXkgdmFsdWUKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fbW91c2VJU1IKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgTkVXU1RLICBNc1N0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLQotOyBDYWxsIHRoZSBpbnN0YWxsZWQgaGlnaCBsZXZlbCBDIGNvZGUgcm91dGluZQotCi0gICAgICAgIGNscmhpICAgZHggICAgICAgICAgICAgIDsgQ2xlYXIgb3V0IGhpZ2ggb3JkZXIgdmFsdWVzCi0gICAgICAgIGNscmhpICAgY3gKLSAgICAgICAgY2xyaGkgICBieAotICAgICAgICBjbHJoaSAgIGF4Ci0gICAgICAgIHNnbmhpICAgc2kKLSAgICAgICAgc2duaGkgICBkaQotCi0gICAgICAgIHB1c2ggICAgX2RpCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIHB1c2ggICAgX2R4Ci0gICAgICAgIHB1c2ggICAgX2N4Ci0gICAgICAgIHB1c2ggICAgX2J4Ci0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgIDsgRW5hYmxlIGludGVycnVwdHMKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fbW91c2VIYW5kbGVyXQotICAgICAgICBfYWRkICAgIHNwLDEyLDI0Ci0KLSAgICAgICAgUkVTVFNUSyBNc1N0YWNrICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0KLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIHJldCAgICAgICAgICAgICAgICAgICAgIDsgV2UgYXJlIGRvbmUhIQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV90aW1lcklTUiAtIFRpbWVyIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgdGltZXIgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBNYWtlIHN1cmUgeW91ciBDIGNvZGUgZXhlY3V0ZXMgYXMKLTsgICAgICAgcXVpY2tseSBhcyBwb3NzaWJsZSwgc2luY2UgYSB0aW1lciBvdmVycnVuIHdpbGwgc2ltcGx5IGhhbmcgdGhlCi07ICAgICAgIHN5c3RlbS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fdGltZXJJU1IKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLQotICAgICAgICBORVdTVEsgIFRtU3RhY2sgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV90aW1lckhhbmRsZXJdCi0gICAgICAgIFJFU1RTVEsgVG1TdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotCi0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jaGFpblByZXZUaW1lciAtIENoYWluIHRvIHByZXZpb3VzIHRpbWVyIGludGVycnVwdCBhbmQgcmV0dXJuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDaGFpbnMgdG8gdGhlIHByZXZpb3VzIHRpbWVyIGludGVycnVwdCByb3V0aW5lIGFuZCByZXR1cm5zIGNvbnRyb2wKLTsgYmFjayB0byB0aGUgaGlnaCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jaGFpblByZXZUaW1lcgotCi1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxUaW1lcl0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICByZXQKLWVsc2UKLSAgICAgICAgU1dBUFNUSyBUbVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gcHJldmlvdXMgc3RhY2sKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIHN0YXRlIG9mIGludGVycnVwdCBmbGFnCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2VGltZXJdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2VGltZXJdCi1lbmRpZgotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgc3RhdGUgb2YgaW50ZXJydXB0IGZsYWcKLSAgICAgICAgU1dBUFNUSyBUbVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gQyBzdGFjayBhZ2FpbgotICAgICAgICByZXQKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVkgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi0lbWFjcm8gIElPREVMQVlOIDEKLSVyZXAgICAgJTEKLSAgICAgICAgREVMQVkKLSVlbmRyZXAKLSVlbmRtYWNybwotZWxzZQotbWFjcm8gICBERUxBWQotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotZW5kbQotbWFjcm8gICBJT0RFTEFZTiAgICBOCi0gICAgcmVwdCAgICBOCi0gICAgICAgIERFTEFZCi0gICAgZW5kbQotZW5kbQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fcnRjSVNSIC0gUmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgdGltZXIgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBNYWtlIHN1cmUgeW91ciBDIGNvZGUgZXhlY3V0ZXMgYXMKLTsgICAgICAgcXVpY2tseSBhcyBwb3NzaWJsZSwgc2luY2UgYSB0aW1lciBvdmVycnVuIHdpbGwgc2ltcGx5IGhhbmcgdGhlCi07ICAgICAgIHN5c3RlbS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fcnRjSVNSCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLTsgQ2xlYXIgcHJpb3JpdHkgaW50ZXJydXB0IGNvbnRyb2xsZXIgYW5kIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIHNvIHdlCi07IGRvbnQgbG9jayB0aGluZ3MgdXAgZm9yIGxvbmcuCi0KLSAgICAgICAgbW92ICAgICBhbCwyMGgKLSAgICAgICAgb3V0ICAgICAwQTBoLGFsCi0gICAgICAgIG91dCAgICAgMDIwaCxhbAotCi07IENsZWFyIHJlYWwtdGltZSBjbG9jayB0aW1lb3V0Ci0KLSAgICAgICAgaW4gICAgICBhbCw3MGggICAgICAgICAgICAgIDsgUmVhZCBDTU9TIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIHB1c2ggICAgX2F4ICAgICAgICAgICAgICAgICA7ICBhbmQgc2F2ZSBmb3IgbGF0ZXIKLSAgICAgICAgSU9ERUxBWU4gMwotICAgICAgICBtb3YgICAgIGFsLDBDaAotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIGluICAgICAgYWwsNzFoCi0KLTsgQ2FsbCB0aGUgQyBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbgotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgY21wICAgICBbQllURSBSdGNJbnNpZGVdLDEgIDsgQ2hlY2sgZm9yIG11dHVhbCBleGNsdXNpb24KLSAgICAgICAgamUgICAgICBAQEV4aXQKLSAgICAgICAgbW92ICAgICBbQllURSBSdGNJbnNpZGVdLDEKLSAgICAgICAgc3RpICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIGludGVycnVwdHMKLSAgICAgICAgTkVXU1RLICBSdGNTdGFjayAgICAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX3J0Y0hhbmRsZXJdCi0gICAgICAgIFJFU1RTVEsgUnRjU3RhY2sgICAgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgbW92ICAgICBbQllURSBSdGNJbnNpZGVdLDAKLQotQEBFeGl0OiBwb3AgICAgIF9heAotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZXN0b3JlIENNT1MgaW5kZXggcmVnaXN0ZXIKLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fa2V5SVNSIC0ga2V5Ym9hcmQgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBrZXlib2FyZCBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKLTsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCi07IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIEhvd2V2ZXIgd2UgZW5zdXJlIHdpdGhpbiB0aGlzIHJvdXRpbmUKLTsgICAgICAgbXV0dWFsIGV4Y2x1c2lvbiB0byB0aGUga2V5Ym9hcmQgaGFuZGxpbmcgcm91dGluZS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fa2V5SVNSCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0KLSAgICAgICAgY21wICAgICBbQllURSBLeUluc2lkZV0sMSAgIDsgQ2hlY2sgZm9yIG11dHVhbCBleGNsdXNpb24KLSAgICAgICAgamUgICAgICBAQFJlaXNzdWVkCi0KLSAgICAgICAgbW92ICAgICBbQllURSBLeUluc2lkZV0sMQotICAgICAgICBORVdTVEsgIEt5U3RhY2sgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9rZXlIYW5kbGVyXSAgIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgUkVTVFNUSyBLeVN0YWNrICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIG1vdiAgICAgW0JZVEUgS3lJbnNpZGVdLDAKLQotQEBFeGl0OiBwb3BhZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotOyBXaGVuIHRoZSBCSU9TIGtleWJvYXJkIGhhbmRsZXIgbmVlZHMgdG8gY2hhbmdlIHRoZSBTSElGVCBzdGF0dXMgbGlnaHRzCi07IG9uIHRoZSBrZXlib2FyZCwgaW4gdGhlIHByb2Nlc3Mgb2YgZG9pbmcgdGhpcyB0aGUga2V5Ym9hcmQgY29udHJvbGxlcgotOyByZS1pc3N1ZXMgYW5vdGhlciBpbnRlcnJ1cHQsIHdoaWxlIHRoZSBjdXJyZW50IGhhbmRsZXIgaXMgc3RpbGwgZXhlY3V0aW5nLgotOyBJZiB3ZSByZWNpZXZlIGFub3RoZXIgaW50ZXJydXB0IHdoaWxlIHN0aWxsIGhhbmRsaW5nIHRoZSBjdXJyZW50IG9uZSwKLTsgdGhlbiBzaW1wbHkgY2hhaW4gZGlyZWN0bHkgdG8gdGhlIHByZXZpb3VzIGhhbmRsZXIuCi07Ci07IE5vdGUgdGhhdCBmb3IgbW9zdCBET1MgZXh0ZW5kZXJzLCB0aGUgcmVhbCBtb2RlIGludGVycnVwdCBoYW5kbGVyIHRoYXQgd2UKLTsgaW5zdGFsbCB0YWtlcyBjYXJlIG9mIHRoaXMgZm9yIHVzLgotCi1AQFJlaXNzdWVkOgotaWZkZWYgICBUTlQKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5XQotICAgICAgICBtb3YgICAgIGVjeCwxICAgICAgICAgICA7IENvcHkgcmVhbCBtb2RlIGZsYWdzIHRvIHJlYWwgbW9kZSBzdGFjawotICAgICAgICBpbnQgICAgIDIxaCAgICAgICAgICAgICA7IENhbGwgdGhlIHJlYWwgbW9kZSBjb2RlCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci1lbHNlCi0gICAgICAgIHB1c2hmCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1fcHJldktleV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbX1BNX3ByZXZLZXldCi1lbmRpZgotZW5kaWYKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fY2hhaW5QcmV2a2V5IC0gQ2hhaW4gdG8gcHJldmlvdXMga2V5IGludGVycnVwdCBhbmQgcmV0dXJuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDaGFpbnMgdG8gdGhlIHByZXZpb3VzIGtleSBpbnRlcnJ1cHQgcm91dGluZSBhbmQgcmV0dXJucyBjb250cm9sCi07IGJhY2sgdG8gdGhlIGhpZ2ggbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY2hhaW5QcmV2S2V5Ci0KLWlmZGVmICAgVE5UCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLSAgICAgICAgbW92ICAgICBheCwyNTBFaCAgICAgICAgOyBDYWxsIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnVuY3Rpb24KLSAgICAgICAgbW92ICAgICBlYngsW19QTV9wcmV2UmVhbEtleV0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICByZXQKLWVsc2UKLQotOyBZSUtFUyEgRm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIHdoZW4gZXhlY3V0aW9uIHJldHVybnMgZnJvbSB0aGUKLTsgcHJldmlvdXMga2V5Ym9hcmQgaGFuZGxlciwgaW50ZXJydXB0cyBhcmUgcmUtZW5hYmxlZCEhIFNpbmNlIHdlIGV4cGVjdAotOyBpbnRlcnJ1cHRzIHRvIHJlbWFpbiBvZmYgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiBvdXIgaGFuZGxlciwgdGhpcyBjYW4KLTsgY2F1c2UgaGF2b2MuIEhvd2V2ZXIgb3VyIHN0YWNrIG1hY3JvcyBhbHdheXMgdHVybiBvZmYgaW50ZXJydXB0cywgc28gdGhleQotOyB3aWxsIGJlIG9mZiB3aGVuIHdlIGV4aXQgdGhpcyByb3V0aW5lLiBPYnZpb3VzbHkgdGhlcmUgaXMgYSB0aW55IHdlZW55Ci07IHdpbmRvdyB3aGVuIGludGVycnVwdHMgd2lsbCBiZSBlbmFibGVkLCBidXQgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4KLTsgZG8gYWJvdXQgdGhpcy4KLQotICAgICAgICBTV0FQU1RLIEt5U3RhY2sgICAgICAgICA7IFN3YXAgYmFjayB0byBwcmV2aW91cyBzdGFjawotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1fcHJldktleV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbX1BNX3ByZXZLZXldCi1lbmRpZgotICAgICAgICBTV0FQU1RLIEt5U3RhY2sgICAgICAgICA7IFN3YXAgYmFjayB0byBDIHN0YWNrIGFnYWluCi0gICAgICAgIHJldAotZW5kaWYKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fa2V5MTVJU1IgLSBJbnQgMTVoIGtleWJvYXJkIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBpZiB3ZSBoYXZlIGJlZW4gY2FsbGVkIHRvIGhhbmRsZSB0aGUgSW50IDE1aAotOyBrZXlib2FyZCBpbnRlcnJ1cHQgY2FsbG91dCBmcm9tIHJlYWwgbW9kZS4KLTsKLTsgICBFbnRyeTogIEFYICAtIEhhcmR3YXJlIHNjYW4gY29kZSB0byBwcm9jZXNzCi07ICAgRXhpdDogICBBWCAgLSBIYXJkd2FyZSBzY2FuIGNvZGUgdG8gcHJvY2VzcyAoMCB0byBpZ25vcmUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2tleTE1SVNSCi0KLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIExPQURfRFMKLSAgICAgICAgY21wICAgICBhaCw0RmgKLSAgICAgICAgam56ICAgICBAQE5vdE91cnMgICAgICAgOyBRdWl0IGlmIG5vdCBrZXlib2FyZCBjYWxsb3V0Ci0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLSAgICAgICAgeG9yICAgICBhaCxhaCAgICAgICAgICAgOyBBWCA6PSBzY2FuIGNvZGUKLSAgICAgICAgTkVXU1RLICBLeTE1U3RhY2sgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLSAgICAgICAgcHVzaCAgICBfYXgKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fa2V5MTVIYW5kbGVyXSA7IENhbGwgQyBjb2RlCi0gICAgICAgIF9hZGQgICAgc3AsMiw0Ci0gICAgICAgIFJFU1RTVEsgS3kxNVN0YWNrICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotICAgICAgICB0ZXN0ICAgIGF4LGF4Ci0gICAgICAgIGp6ICAgICAgQEAxCi0gICAgICAgIHN0YyAgICAgICAgICAgICAgICAgICAgIDsgU2V0IGNhcnJ5IHRvIHByb2Nlc3MgYXMgbm9ybWFsCi0gICAgICAgIGptcCAgICAgQEAyCi1AQDE6ICAgIGNsYyAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgY2FycnkgdG8gaWdub3JlIHNjYW4gY29kZQotQEAyOiAgICBwb3BhZAotICAgICAgICBqbXAgICAgIEBARXhpdCAgICAgICAgICA7IFdlIGFyZSBkb25lCi0KLUBATm90T3VyczoKLWlmZGVmICAgVE5UCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLSAgICAgICAgbW92ICAgICBheCwyNTBFaCAgICAgICAgOyBDYWxsIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnVuY3Rpb24KLSAgICAgICAgbW92ICAgICBlYngsW19QTV9wcmV2UmVhbEtleTE1XQotICAgICAgICBtb3YgICAgIGVjeCwxICAgICAgICAgICA7IENvcHkgcmVhbCBtb2RlIGZsYWdzIHRvIHJlYWwgbW9kZSBzdGFjawotICAgICAgICBpbnQgICAgIDIxaCAgICAgICAgICAgICA7IENhbGwgdGhlIHJlYWwgbW9kZSBjb2RlCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci1lbHNlCi0gICAgICAgIHB1c2hmCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1fcHJldktleTE1XQotZWxzZQotICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleTE1XQotZW5kaWYKLWVuZGlmCi1AQEV4aXQ6IHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICByZXRmICAgIDQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fYnJlYWtJU1IgLSBDb250cm9sIEJyZWFrIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgQ3RybC1CcmVhayBpbnRlcnJ1cHQuIFdlIHNpbXBseSBzZXQKLTsgdGhlIEN0cmwtQnJlYWsgZmxhZyB0byBhIDEgYW5kIGxlYXZlIChub3RlIHRoYXQgdGhpcyBpcyBhY2Nlc3NlZCB0aHJvdWdoCi07IGEgZmFyIHBvaW50ZXIsIGFzIGl0IG1heSB3ZWxsIGJlIGxvY2F0ZWQgaW4gY29udmVudGlvbmFsIG1lbW9yeSkuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2JyZWFrSVNSCi0KLSAgICAgICAgc3RpCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgX2J4Ci0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3RybEJQdHJdCi0gICAgICAgIG1vdiAgICAgW1VJTlQgX0VTIF9ieF0sMQotCi07IFJ1biBhbHRlcm5hdGUgYnJlYWsgaGFuZGxlciBjb2RlIGlmIGluc3RhbGxlZAotCi0gICAgICAgIGNtcCAgICAgW0NQVFIgX1BNX2JyZWFrSGFuZGxlcl0sMAotICAgICAgICBqZSAgICAgIEBARXhpdAotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBtb3YgICAgIF9heCwxCi0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2JyZWFrSGFuZGxlcl0gOyBDYWxsIEMgY29kZQotICAgICAgICBwb3AgICAgIF9heAotICAgICAgICBwb3BhZAotCi1AQEV4aXQ6IHBvcCAgICAgX2J4Ci0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1fY3RybEJyZWFrSGl0KGludCBjbGVhckZsYWcpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBDdHJsLUJyZWFrIGZsYWcgYW5kIHBvc3NpYmx5IGNsZWFycyBpdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jdHJsQnJlYWtIaXQKLQotICAgICAgICBBUkcgICAgIGNsZWFyRmxhZzpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFNhdmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3RybEJQdHJdCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCi0gICAgICAgIG1vdiAgICAgX2F4LFtfRVMgX2J4XQotICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDAKLQotQEBEb25lOiBwb3AgICAgIGVzCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2N0cmxDSVNSIC0gQ29udHJvbCBCcmVhayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIEN0cmwtQyBpbnRlcnJ1cHQuIFdlIHNpbXBseSBzZXQKLTsgdGhlIEN0cmwtQyBmbGFnIHRvIGEgMSBhbmQgbGVhdmUgKG5vdGUgdGhhdCB0aGlzIGlzIGFjY2Vzc2VkIHRocm91Z2gKLTsgYSBmYXIgcG9pbnRlciwgYXMgaXQgbWF5IHdlbGwgYmUgbG9jYXRlZCBpbiBjb252ZW50aW9uYWwgbWVtb3J5KS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fY3RybENJU1IKLQotICAgICAgICBzdGkKLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaCAgICBfYngKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQ1B0cl0KLSAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwxCi0KLTsgUnVuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCi0KLSAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSwwCi0gICAgICAgIGplICAgICAgQEBFeGl0Ci0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIG1vdiAgICAgX2F4LDAKLSAgICAgICAgcHVzaCAgICBfYXgKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSA7IENhbGwgQyBjb2RlCi0gICAgICAgIHBvcCAgICAgX2F4Ci0gICAgICAgIHBvcGFkCi0KLUBARXhpdDogcG9wICAgICBfYngKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0gICAgICAgIGlyZXRkCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9jdHJsQ0hpdChpbnQgY2xlYXJGbGFnKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQ3RybC1DIGZsYWcgYW5kIHBvc3NpYmx5IGNsZWFycyBpdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jdHJsQ0hpdAotCi0gICAgICAgIEFSRyAgICAgY2xlYXJGbGFnOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQ1B0cl0KLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHRoYW5rcyEKLSAgICAgICAgbW92ICAgICBfYXgsW19FUyBfYnhdCi0gICAgICAgIHRlc3QgICAgW0JZVEUgY2xlYXJGbGFnXSwxCi0gICAgICAgIGp6ICAgICAgQEBEb25lCi0gICAgICAgIG1vdiAgICAgW1VJTlQgX0VTIF9ieF0sMAotCi1AQERvbmU6Ci0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fY3JpdGljYWxJU1IgLSBDb250cm9sIEVycm9yIGhhbmRsZXIgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBNU0RPUyBDcml0aWNhbCBFcnJvciBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoCi07IGNvbnRyb2wgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwKLTsgcmVnaXN0ZXJzIGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBXZSBhbHNvIHBhc3MKLTsgdGhlIHZhbHVlcyBvZiB0aGUgQVggYW5kIERJIHJlZ2lzdGVycyB0byB0aGUgYXMgcG9pbnRlcnMsIHNvIHRoYXQgdGhlCi07IHZhbHVlcyBjYW4gYmUgbW9kaWZpZWQgYmVmb3JlIHJldHVybmluZyB0byBNU0RPUy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fY3JpdGljYWxJU1IKLQotICAgICAgICBzdGkKLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaCAgICBfYnggICAgICAgICAgICAgOyBTYXZlIHJlZ2lzdGVyIHZhbHVlcyBjaGFuZ2VkCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jcml0UHRyXQotICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxheAotICAgICAgICBtb3YgICAgIFtfRVMgX2J4KzJdLGRpCi0KLTsgUnVuIGFsdGVybmF0ZSBjcml0aWNhbCBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCi0KLSAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fY3JpdEhhbmRsZXJdLDAKLSAgICAgICAgamUgICAgICBAQE5vQWx0SGFuZGxlcgotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBwdXNoICAgIF9kaQotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9jcml0SGFuZGxlcl0gIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgX2FkZCAgICBzcCw0LDgKLSAgICAgICAgcG9wYWQKLQotICAgICAgICBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotQEBOb0FsdEhhbmRsZXI6Ci0gICAgICAgIG1vdiAgICAgYXgsMyAgICAgICAgICAgIDsgVGVsbCBNU0RPUyB0byBmYWlsIHRoZSBvcGVyYXRpb24KLSAgICAgICAgcG9wICAgICBfYngKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9jcml0aWNhbEVycm9yKGludCAqYXhWYWwsaW50ICpkaVZhbCxpbnQgY2xlYXJGbGFnKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY3JpdGljYWwgZXJyb3IgZmxhZ3MsIGFuZCB0aGUgdmFsdWVzIHRoYXQKLTsgTVNET1MgcGFzc2VkIGluIHRoZSBBWCBhbmQgREkgcmVnaXN0ZXJzIHRvIG91ciBoYW5kbGVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2NyaXRpY2FsRXJyb3IKLQotICAgICAgICBBUkcgICAgIGF4VmFsOkRQVFIsIGRpVmFsOkRQVFIsIGNsZWFyRmxhZzpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFNhdmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3JpdFB0cl0KLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHRoYW5rcyEKLSAgICAgICAgeG9yICAgICBfYXgsX2F4Ci0gICAgICAgIHhvciAgICAgX2RpLF9kaQotICAgICAgICBtb3YgICAgIGF4LFtfRVMgX2J4XQotICAgICAgICBtb3YgICAgIGRpLFtfRVMgX2J4KzJdCi0gICAgICAgIHRlc3QgICAgW0JZVEUgY2xlYXJGbGFnXSwxCi0gICAgICAgIGp6ICAgICAgQEBOb0NsZWFyCi0gICAgICAgIG1vdiAgICAgW1VMT05HIF9FUyBfYnhdLDAKLUBATm9DbGVhcjoKLSAgICAgICAgX2xlcyAgICBfYngsW2F4VmFsXQotICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxfYXgKLSAgICAgICAgX2xlcyAgICBfYngsW2RpVmFsXQotICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxfZGkKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9zZXRNb3VzZUhhbmRsZXIKLQotICAgICAgICBBUkcgICAgIG1vdXNlTWFzazpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIGVzCi0KLSAgICAgICAgbW92ICAgICBheCwwQ2ggICAgICAgICAgOyBBWCA6PSBGdW5jdGlvbiAxMiAtIGluc3RhbGwgaW50ZXJydXB0IHN1YgotICAgICAgICBtb3YgICAgIF9jeCxbbW91c2VNYXNrXSA7IENYIDo9IG1vdXNlIG1hc2sKLSAgICAgICAgbW92ICAgICBfZHgsb2Zmc2V0IF9QTV9tb3VzZUlTUgotICAgICAgICBwdXNoICAgIGNzCi0gICAgICAgIHBvcCAgICAgZXMgICAgICAgICAgICAgIDsgRVM6X0RYIC0+IG1vdXNlIGhhbmRsZXIKLSAgICAgICAgaW50ICAgICAzM2ggICAgICAgICAgICAgOyBDYWxsIG1vdXNlIGRyaXZlcgotCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9tb3VzZVBNQ0Iodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1vdXNlIHJlYWxtb2RlIGNhbGxiYWNrIHJvdXRpbmUuIFVwb24gZW50cnkgdG8gdGhpcyByb3V0aW5lLCB3ZSByZWNpZXZlCi07IHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgRFBNSSBzZXJ2ZXI6Ci07Ci07ICAgRW50cnk6ICBEUzpfU0kgIC0+IFJlYWwgbW9kZSBzdGFjayBhdCB0aW1lIG9mIGNhbGwKLTsgICAgICAgICAgIEVTOl9ESSAgLT4gUmVhbCBtb2RlIHJlZ2lzdGVyIGRhdGEgc3RydWN0dXJlCi07ICAgICAgICAgICBTUzpfU1AgIC0+IExvY2tlZCBwcm90ZWN0ZWQgbW9kZSBzdGFjayB0byB1c2UKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fbW91c2VQTUNCCi0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIG1vdiAgICAgZWF4LFtlczpfZGkrMUNoXSAgICA7IExvYWQgcmVnaXN0ZXIgdmFsdWVzIGZyb20gcmVhbCBtb2RlCi0gICAgICAgIG1vdiAgICAgZWJ4LFtlczpfZGkrMTBoXQotICAgICAgICBtb3YgICAgIGVjeCxbZXM6X2RpKzE4aF0KLSAgICAgICAgbW92ICAgICBlZHgsW2VzOl9kaSsxNGhdCi0gICAgICAgIG1vdiAgICAgZXNpLFtlczpfZGkrMDRoXQotICAgICAgICBtb3YgICAgIGVkaSxbZXM6X2RpXQotICAgICAgICBjYWxsICAgIF9QTV9tb3VzZUlTUiAgICAgICAgOyBDYWxsIHRoZSBtb3VzZSBoYW5kbGVyCi0gICAgICAgIHBvcGFkCi0KLSAgICAgICAgbW92ICAgICBheCxbZHM6X3NpXQotICAgICAgICBtb3YgICAgIFtlczpfZGkrMkFoXSxheCAgICAgOyBQbHVnIGluIHJldHVybiBJUCBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOl9zaSsyXQotICAgICAgICBtb3YgICAgIFtlczpfZGkrMkNoXSxheCAgICAgOyBQbHVnIGluIHJldHVybiBDUyB2YWx1ZQotICAgICAgICBhZGQgICAgIFtXT1JEIGVzOl9kaSsyRWhdLDQgOyBSZW1vdmUgcmV0dXJuIGFkZHJlc3MgZnJvbSBzdGFjawotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBHbyBiYWNrIHRvIHJlYWwgbW9kZSEKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9pbnQxMFBNQ0Iodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludDEwIHJlYWxtb2RlIGNhbGxiYWNrIHJvdXRpbmUuIFVwb24gZW50cnkgdG8gdGhpcyByb3V0aW5lLCB3ZSByZWNpZXZlCi07IHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgRFBNSSBzZXJ2ZXI6Ci07Ci07ICAgRW50cnk6ICBEUzpFU0kgIC0+IFJlYWwgbW9kZSBzdGFjayBhdCB0aW1lIG9mIGNhbGwKLTsgICAgICAgICAgIEVTOkVESSAgLT4gUmVhbCBtb2RlIHJlZ2lzdGVyIGRhdGEgc3RydWN0dXJlCi07ICAgICAgICAgICBTUzpFU1AgIC0+IExvY2tlZCBwcm90ZWN0ZWQgbW9kZSBzdGFjayB0byB1c2UKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICAgICAgX1BNX2ludDEwUE1DQgotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaCAgICBmcwotCi0gICAgICAgIHB1c2hmZAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBtb3YgICAgIFtlczplZGkrMjBoXSxheCAgICAgOyBTYXZlIHJldHVybiBmbGFnIHN0YXR1cwotICAgICAgICBtb3YgICAgIGF4LFtkczplc2ldCi0gICAgICAgIG1vdiAgICAgW2VzOmVkaSsyQWhdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIElQIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBheCxbZHM6ZXNpKzJdCi0gICAgICAgIG1vdiAgICAgW2VzOmVkaSsyQ2hdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIENTIHZhbHVlCi0gICAgICAgIGFkZCAgICAgW1dPUkQgZXM6ZWRpKzJFaF0sNCA7IFJlbW92ZSByZXR1cm4gYWRkcmVzcyBmcm9tIHN0YWNrCi0KLTsgQ2FsbCB0aGUgaW5zdGFsbCBpbnQxMCBoYW5kbGVyIGluIHByb3RlY3RlZCBtb2RlLiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkCi07IHdpdGggRFMgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGEgc2VsZWN0b3IsIGFuZCBFUzpFREkgcG9pbnRpbmcgdGhlIHRoZQotOyByZWFsIG1vZGUgRFBNSSByZWdpc3RlciBzdHJ1Y3R1cmUgYXQgdGhlIHRpbWUgb2YgdGhlIGludGVycnVwdC4gVGhlCi07IGhhbmRsZSBtdXN0IGJlIHdyaXR0ZW4gaW4gYXNzZW1ibGVyIHRvIGJlIGFibGUgdG8gZXh0cmFjdCB0aGUgcmVhbCBtb2RlCi07IHJlZ2lzdGVyIHZhbHVlcyBmcm9tIHRoZSBzdHJ1Y3R1cmUKLQotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHBvcCAgICAgZnMgICAgICAgICAgICAgICAgICA7IEZTOkVESSAtPiByZWFsIG1vZGUgcmVnaXN0ZXJzCi0gICAgICAgIExPQURfRFMKLSAgICAgICAgTkVXU1RLICBJbnQxMFN0YWNrICAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0KLSAgICAgICAgY2FsbCAgICBbX1BNX2ludDEwSGFuZGxlcl0KLQotICAgICAgICBSRVNUU1RLIEludDEwU3RhY2sgICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIHBvcCAgICAgZnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIHBvcGFkCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgICAgICA7IEdvIGJhY2sgdG8gcmVhbCBtb2RlIQotCi1jcHJvY2VuZAotCi1jcHVibGljIF9QTV9wbXNteENvZGVFbmQKLQotZW5kY29kZXNlZyAgX3Btc214Ci0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3ZmbGF0LmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fdmZsYXQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDk4NWE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fdmZsYXQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgICAgICAgICBCYXNlZCBvbiBvcmlnaW5hbCBjb2RlIENvcHlyaWdodCAxOTk0IE90dG8gQ2hyb25zCi07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgbGF0ZXIKLTsqIEVudmlyb25tZW50OiBJQk0gUEMgMzIgYml0IHByb3RlY3RlZCBtb2RlCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBwYWdlIGZhdWx0IGhhbmRsZXIgZm9yIHZpcnR1YWwgbGluZWFyIGZyYW1lYnVmZmVycy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0gICAgICAgIEpVTVBTCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF92ZmxhdCAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLVZGTEFUX1NUQVJUICAgICBFUVUgMEYwMDAwMDAwaAotVkZMQVRfRU5EICAgICAgIEVRVSAwRjAzRkZGRkZoCi1QQUdFX1BSRVNFTlQgICAgRVFVIDEKLVBBR0VfTk9UUFJFU0VOVCBFUVUgMAotUEFHRV9SRUFEICAgICAgIEVRVSAwCi1QQUdFX1dSSVRFICAgICAgRVFVIDIKLQotaWZkZWYgICBET1M0R1cKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRE9TNEcvVyBmbGF0IGxpbmVhciBmcmFtZWJ1ZmZlciBlbXVsYXRpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1iZWdkYXRhc2VnICBfdmZsYXQKLQotOyBOZWFyIHBvaW50ZXJzIHRvIHRoZSBwYWdlIGRpcmVjdG9yeSBiYXNlIGFuZCBvdXIgcGFnZSB0YWJsZXMuIEFsbCBvZgotOyB0aGlzIG1lbW9yeSBpcyBhbHdheXMgbG9jYXRlZCBpbiB0aGUgZmlyc3QgTWIgb2YgRE9TIG1lbW9yeS4KLQotUERCUiAgICAgICAgICAgIGRkICAwICAgICAgICAgICAgICAgOyBQYWdlIGRpcmVjdG9yeSBiYXNlIHJlZ2lzdGVyIChDUjMpCi1hY2Nlc3NQYWdlQWRkciAgZGQgIDAKLWFjY2Vzc1BhZ2VUYWJsZSBkZCAgMAotCi07IENhdXNlV2F5IHBhZ2UgZGlyZWN0b3J5ICYgMXN0IHBhZ2UgdGFibGUgbGluZWFyIGFkZHJlc3Nlcy4KLQotQ2F1c2VXYXlESVJMaW5lYXIgZGQgMAotQ2F1c2VXYXkxc3RMaW5lYXIgZGQgMAotCi07IFBsYWNlIHRvIHN0b3JlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgUGFnZSBUYWJsZSBEaXJlY3RvcnkgYmVmb3JlIHdlCi07IGludGlhbGlzZWQgb3VyIHZpcnR1YWwgYnVmZmVyIGNvZGUuCi0KLXBhZ2VEaXJlY3Rvcnk6ICByZXNkIDEwMjQgICAgICAgICAgIDsgU2F2ZWQgcGFnZSB0YWJsZSBkaXJlY3RvcnkKLQotVmFsaWRDUyAgICAgICAgIGR3ICAwICAgICAgICAgICAgICAgOyBWYWxpZCBDUyBmb3IgcGFnZSBmYXVsdHMKLVJpbmcwQ1MgICAgICAgICBkdyAgMCAgICAgICAgICAgICAgIDsgT3VyIHJpbmcgMCBjb2RlIHNlbGVjdG9yCi1MYXN0UGFnZSAgICAgICAgZGQgIDAgICAgICAgICAgICAgICA7IExhc3QgcGFnZSB3ZSBtYXBwZWQgaW4KLUJhbmtGdW5jQnVmOiAgICByZXNiIDEwMSAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgYmFuayBzd2l0Y2ggY29kZQotQmFua0Z1bmNQdHIgICAgIGRkICBvZmZzZXQgQmFua0Z1bmNCdWYKLQotSU5UMTRHYXRlOgotSU5UMTRPZmZzZXQgICAgIGRkICAgICAgMCAgICAgICAgICAgOyBlaXAgb2Ygb3JpZ2luYWwgdmVjdG9yCi1JTlQxNFNlbGVjdG9yICAgZHcgICAgICAwICAgICAgICAgICA7IGNzIG9mIG9yaWdpbmFsIHZlY3RvcgotCi0gICAgICAgIGNleHRlcm4gX1BNX3NhdmVkRFMsVVNIT1JUCi0gICAgICAgIGNleHRlcm4gVkZfaGF2ZUNhdXNlV2F5LEJPT0wKLQotZW5kZGF0YXNlZyAgX3ZmbGF0Ci0KLWJlZ2NvZGVzZWcgIF92ZmxhdCAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotICAgICAgICBjZXh0ZXJuIFZGX21hbGxvYyxGUFRSCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBGX2hhbmRsZXI2NGsgLSBQYWdlIGZhdWx0IGhhbmRsZXIgZm9yIDY0ayBiYW5rcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgVGhlIGhhbmRsZXIgYmVsb3cgaXMgYSAzMiBiaXQgcmluZyAwIHBhZ2UgZmF1bHQgaGFuZGxlci4gIEl0IHJlY2VpdmVzCi07IGNvbnRyb2wgaW1tZWRpYXRlbHkgYWZ0ZXIgYW55IHBhZ2UgZmF1bHQgb3IgYWZ0ZXIgYW4gSVJRNiAoaGFyZHdhcmUKLTsgaW50ZXJydXB0KS4gVGhpcyBwcm92aWRlcyB0aGUgZmFzdGVzdCBwb3NzaWJsZSBoYW5kbGluZyBvZiBwYWdlIGZhdWx0cwotOyBzaW5jZSBpdCBqdW1wIGRpcmVjdGx5IGhlcmUuICBJZiB0aGlzIGlzIGEgcGFnZSBmYXVsdCwgdGhlIG51bWJlcgotOyBpbW1lZGlhdGVseSBvbiB0aGUgc3RhY2sgd2lsbCBiZSBhbiBlcnJvciBjb2RlLCBhdCBvZmZzZXQgNCB3aWxsIGJlCi07IHRoZSBlaXAgb2YgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uLCBhdCBvZmZzZXQgOCB3aWxsIGJlIHRoZSBjcyBvZiB0aGUKLTsgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24uICBJZiBpdCBpcyBhIGhhcmR3YXJlIGludGVycnVwdCwgaXQgd2lsbCBub3QgaGF2ZQotOyB0aGUgZXJyb3IgY29kZSBhbmQgdGhlIGVmbGFncyB3aWxsIGJlIGF0IG9mZnNldCA4LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIFBGX2hhbmRsZXI2NGsKLQotOyBDaGVjayBpZiB0aGlzIGlzIGEgcHJvY2Vzc29yIGV4ZWNlcHRpb24gb3IgYSBwYWdlIGZhdWx0Ci0KLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgbW92ICAgICBheCxbY3M6VmFsaWRDU10gICAgIDsgVXNlIENTIG92ZXJyaWRlIHRvIGFjY2VzcyBkYXRhCi0gICAgICAgIGNtcCAgICAgW3NzOmVzcCsxMl0sYXggICAgICA7IElzIHRoaXMgYSBwYWdlIGZhdWx0PwotICAgICAgICBqbmUgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBOb3BlLCBqdW1wIHRvIHRoZSBwcmV2aW91cyBoYW5kbGVyCi0KLTsgR2V0IGFkZHJlc3Mgb2YgcGFnZSBmYXVsdCBhbmQgY2hlY2sgaWYgd2l0aGluIG91ciBoYW5kbGVycyByYW5nZQotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMiAgICAgICAgICAgICA7IEVCWCBoYXMgcGFnZSBmYXVsdCBsaW5lYXIgYWRkcmVzcwotICAgICAgICBjbXAgICAgIGVheCxWRkxBVF9TVEFSVCAgICAgOyBJcyB0aGUgZmF1bHQgbGVzcyB0aGFuIG91cnM/Ci0gICAgICAgIGpiICAgICAgQEBUb09sZEhhbmRsZXIgICAgICA7IFllcCwgZ28gdG8gcHJldmlvdXMgaGFuZGxlcgotICAgICAgICBjbXAgICAgIGVheCxWRkxBVF9FTkQgICAgICAgOyBJcyB0aGUgZmF1bHQgbW9yZSB0aGFuIG91cnM/Ci0gICAgICAgIGphZSAgICAgQEBUb09sZEhhbmRsZXIgICAgICA7IFllcCwgZ28gdG8gcHJldmlvdXMgaGFuZGxlcgotCi07IFRoaXMgaXMgb3VyIHBhZ2UgZmF1bHQsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0Ci0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBtb3YgICAgIGVieCxlYXggICAgICAgICAgICAgOyBFQlggOj0gcGFnZSBmYXVsdCBhZGRyZXNzCi0gICAgICAgIGFuZCAgICAgZWJ4LGludmVydCAwRkZGRmggICA7IE1hc2sgdG8gNjRrIGJhbmsgYm91bmRhcnkKLSAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdOyBMb2FkIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgZXMsW2NzOl9QTV9zYXZlZERTXQotCi07IE1hcCBpbiB0aGUgcGFnZSB0YWJsZSBmb3Igb3VyIHZpcnR1YWwgZnJhbWVidWZmZXIgYXJlYSBmb3IgbW9kaWZpY2F0aW9uCi0KLSAgICAgICAgbW92ICAgICBlZGksW1BEQlJdICAgICAgICAgIDsgRURJIHBvaW50cyB0byBwYWdlIGRpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVkeCxlYnggICAgICAgICAgICAgOyBFRFggPSBsaW5lYXIgYWRkcmVzcwotICAgICAgICBzaHIgICAgIGVkeCwyMiAgICAgICAgICAgICAgOyBFRFggPSBvZmZzZXQgdG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlZHgsW2VkeCo0K2VkaV0gICAgIDsgRURYID0gcGh5c2ljYWwgcGFnZSB0YWJsZSBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgZWF4LGVkeAotICAgICAgICBtb3YgICAgIGVkeCxbYWNjZXNzUGFnZVRhYmxlXQotICAgICAgICBvciAgICAgIGVheCw3Ci0gICAgICAgIG1vdiAgICAgW2VkeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotCi07IE1hcmsgYWxsIHBhZ2VzIHZhbGlkIGZvciB0aGUgbmV3IHBhZ2UgZmF1bHQgYXJlYQotCi0gICAgICAgIG1vdiAgICAgZXNpLGVieCAgICAgICAgICAgICA7IEVTSSA6PSBsaW5lYXIgYWRkcmVzcyBmb3IgcGFnZQotICAgICAgICBzaHIgICAgIGVzaSwxMAotICAgICAgICBhbmQgICAgIGVzaSwwRkZGaCAgICAgICAgICAgOyBPZmZzZXQgaW50byBwYWdlIHRhYmxlCi0gICAgICAgIGFkZCAgICAgZXNpLFthY2Nlc3NQYWdlQWRkcl0KLWlmZGVmICAgVVNFX05BU00KLSVhc3NpZ24gb2ZmIDAKLSVyZXAgMTYKLSAgICAgICAgb3IgICAgICBbRFdPUkQgZXNpK29mZl0sMDAwMDAwMDAwMWggOyBFbmFibGUgcGFnZXMKLSVhc3NpZ24gb2ZmIG9mZis0Ci0lZW5kcmVwCi1lbHNlCi1vZmYgPSAwCi1SRVBUICAgIDE2Ci0gICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDAwMDAwMDAwMDFoIDsgRW5hYmxlIHBhZ2VzCi1vZmYgPSBvZmYrNAotRU5ETQotZW5kaWYKLQotOyBNYXJrIGFsbCBwYWdlcyBpbnZhbGlkIGZvciB0aGUgcHJldmlvdXNseSBtYXBwZWQgYXJlYQotCi0gICAgICAgIHhjaGcgICAgZXNpLFtMYXN0UGFnZV0gICAgICA7IFNhdmUgbGFzdCBwYWdlIGZvciBuZXh0IHBhZ2UgZmF1bHQKLSAgICAgICAgdGVzdCAgICBlc2ksZXNpCi0gICAgICAgIGp6ICAgICAgQEBEb25lTWFwcGluZyAgICAgICA7IERvbnQgdXBkYXRlIGlmIGZpcnN0IHRpbWUgcm91bmQKLWlmZGVmICAgVVNFX05BU00KLSVhc3NpZ24gb2ZmIDAKLSVyZXAgMTYKLSAgICAgICAgb3IgICAgICBbRFdPUkQgZXNpK29mZl0sMEZGRkZGRkZFaCAgOyBEaXNhYmxlIHBhZ2VzCi0lYXNzaWduIG9mZiBvZmYrNAotJWVuZHJlcAotZWxzZQotb2ZmID0gMAotUkVQVCAgICAxNgotICAgICAgICBhbmQgICAgIFtEV09SRCBlc2krb2ZmXSwwRkZGRkZGRkVoICA7IERpc2FibGUgcGFnZXMKLW9mZiA9IG9mZis0Ci1FTkRNCi1lbmRpZgotCi1AQERvbmVNYXBwaW5nOgotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgIDsgRmx1c2ggdGhlIFRMQgotCi07IE5vdyBwcm9ncmFtIHRoZSBuZXcgU3VwZXJWR0Egc3RhcnRpbmcgYmFuayBhZGRyZXNzCi0KLSAgICAgICAgbW92ICAgICBlYXgsZWJ4ICAgICAgICAgICAgIDsgRUFYIDo9IHBhZ2UgZmF1bHQgYWRkcmVzcwotICAgICAgICBzaHIgICAgIGVheCwxNgotICAgICAgICBhbmQgICAgIGVheCwwRkZoICAgICAgICAgICAgOyBNYXNrIHRvIDAtMjU1Ci0gICAgICAgIGNhbGwgICAgW0JhbmtGdW5jUHRyXSAgICAgICA7IENhbGwgdGhlIGJhbmsgc3dpdGNoIGZ1bmN0aW9uCi0KLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIHBvcGFkCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIGFkZCAgICAgZXNwLDQgICAgICAgICAgICAgICA7IFBvcCB0aGUgZXJyb3IgY29kZSBmcm9tIHN0YWNrCi0gICAgICAgIGlyZXRkICAgICAgICAgICAgICAgICAgICAgICA7IFJldHVybiB0byBmYXVsdGluZyBpbnN0cnVjdGlvbgotCi1AQFRvT2xkSGFuZGxlcjoKLSAgICAgICAgcG9wICAgICBlYXgKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgam1wIGZhciBkd29yZCBbY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgotZWxzZQotICAgICAgICBqbXAgICAgIFtGV09SRCBjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCi1lbmRpZgotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQRl9oYW5kbGVyNGsgIC0gUGFnZSBmYXVsdCBoYW5kbGVyIGZvciA0ayBiYW5rcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgVGhlIGhhbmRsZXIgYmVsb3cgaXMgYSAzMiBiaXQgcmluZyAwIHBhZ2UgZmF1bHQgaGFuZGxlci4gIEl0IHJlY2VpdmVzCi07IGNvbnRyb2wgaW1tZWRpYXRlbHkgYWZ0ZXIgYW55IHBhZ2UgZmF1bHQgb3IgYWZ0ZXIgYW4gSVJRNiAoaGFyZHdhcmUKLTsgaW50ZXJydXB0KS4gVGhpcyBwcm92aWRlcyB0aGUgZmFzdGVzdCBwb3NzaWJsZSBoYW5kbGluZyBvZiBwYWdlIGZhdWx0cwotOyBzaW5jZSBpdCBqdW1wIGRpcmVjdGx5IGhlcmUuICBJZiB0aGlzIGlzIGEgcGFnZSBmYXVsdCwgdGhlIG51bWJlcgotOyBpbW1lZGlhdGVseSBvbiB0aGUgc3RhY2sgd2lsbCBiZSBhbiBlcnJvciBjb2RlLCBhdCBvZmZzZXQgNCB3aWxsIGJlCi07IHRoZSBlaXAgb2YgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uLCBhdCBvZmZzZXQgOCB3aWxsIGJlIHRoZSBjcyBvZiB0aGUKLTsgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24uICBJZiBpdCBpcyBhIGhhcmR3YXJlIGludGVycnVwdCwgaXQgd2lsbCBub3QgaGF2ZQotOyB0aGUgZXJyb3IgY29kZSBhbmQgdGhlIGVmbGFncyB3aWxsIGJlIGF0IG9mZnNldCA4LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIFBGX2hhbmRsZXI0awotCi07IEZpbGwgaW4gd2hlbiB3ZSBoYXZlIHRlc3RlZCBhbGwgdGhlIDY0S2IgY29kZQotCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGptcCBmYXIgZHdvcmQgW2NzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVsc2UKLSAgICAgICAgam1wICAgICBbRldPUkQgY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgotZW5kaWYKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBJbnN0YWxsRmF1bHRIYW5kbGVyKHZvaWQgKmJhc2VBZGRyLGludCBiYW5rU2l6ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEluc3RhbGxlcyB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyIGRpcmVjdGx5IGludCB0aGUgaW50ZXJydXB0IGRlc2NyaXB0b3IKLTsgdGFibGUgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UuIFRoaXMgb2YgY291cnNlIHJlcXVpcmVzIHJpbmcgMCBhY2Nlc3MsCi07IGJ1dCBub25lIG9mIHRoaXMgc3R1ZmYgd2lsbCBydW4gd2l0aG91dCByaW5nIDAhCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgSW5zdGFsbEZhdWx0SGFuZGxlcgotCi0gICAgICAgIEFSRyAgICAgYmFzZUFkZHI6VUxPTkcsIGJhbmtTaXplOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgTGFzdFBhZ2VdLDAgIDsgTm8gcGFnZXMgaGF2ZSBiZWVuIG1hcHBlZAotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIG1vdiAgICAgW1ZhbGlkQ1NdLGF4ICAgICAgICA7IFNhdmUgQ1MgdmFsdWUgZm9yIHBhZ2UgZmF1bHRzCi0KLTsgUHV0IGFkZHJlc3Mgb2Ygb3VyIHBhZ2UgZmF1bHQgaGFuZGxlciBpbnRvIHRoZSBJRFQgZGlyZWN0bHkKLQotICAgICAgICBzdWIgICAgIGVzcCw2ICAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBzcGFjZSBvbiBzdGFjawotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBzaWR0ICAgIFtzczplc3BdICAgICAgICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAotZWxzZQotICAgICAgICBzaWR0ICAgIFtGV09SRCBzczplc3BdICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAotZW5kaWYKLSAgICAgICAgcG9wICAgICBheCAgICAgICAgICAgICAgICAgIDsgYWRkIGVzcCwyCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IEFic29sdXRlIGFkZHJlc3Mgb2YgSURUCi0gICAgICAgIGFkZCAgICAgZWF4LDE0KjggICAgICAgICAgICA7IFBvaW50IHRvIEludCAjMTQKLQotOyBOb3RlIHRoYXQgSW50ZXJydXB0IGdhdGVzIGRvIG5vdCBoYXZlIHRoZSBoaWdoIGFuZCBsb3cgd29yZCBvZiB0aGUKLTsgb2Zmc2V0IGluIGFkamFjZW50IHdvcmRzIGluIG1lbW9yeSwgdGhlcmUgYXJlIDQgYnl0ZXMgc2VwYXJhdGluZyB0aGVtLgotCi0gICAgICAgIG1vdiAgICAgZWN4LFtlYXhdICAgICAgICAgICA7IEdldCBjcyBhbmQgbG93IDE2IGJpdHMgb2Ygb2Zmc2V0Ci0gICAgICAgIG1vdiAgICAgZWR4LFtlYXgrNl0gICAgICAgICA7IEdldCBoaWdoIDE2IGJpdHMgb2Ygb2Zmc2V0IGluIGR4Ci0gICAgICAgIHNobCAgICAgZWR4LDE2Ci0gICAgICAgIG1vdiAgICAgZHgsY3ggICAgICAgICAgICAgICA7IGVkeCBoYXMgb2Zmc2V0Ci0gICAgICAgIG1vdiAgICAgW0lOVDE0T2Zmc2V0XSxlZHggICA7IFNhdmUgb2Zmc2V0Ci0gICAgICAgIHNociAgICAgZWN4LDE2Ci0gICAgICAgIG1vdiAgICAgW0lOVDE0U2VsZWN0b3JdLGN4ICA7IFNhdmUgb3JpZ2luYWwgY3MKLSAgICAgICAgbW92ICAgICBbZWF4KzJdLGNzICAgICAgICAgIDsgSW5zdGFsbCBuZXcgY3MKLSAgICAgICAgbW92ICAgICBlZHgsb2Zmc2V0IFBGX2hhbmRsZXI2NGsKLSAgICAgICAgY21wICAgICBbVUlOVCBiYW5rU2l6ZV0sNAotICAgICAgICBqbmUgICAgIEBAMQotICAgICAgICBtb3YgICAgIGVkeCxvZmZzZXQgUEZfaGFuZGxlcjRrCi1AQDE6ICAgIG1vdiAgICAgW2VheF0sZHggICAgICAgICAgICA7IEluc3RhbGwgbG93IHdvcmQgb2Ygb2Zmc2V0Ci0gICAgICAgIHNociAgICAgZWR4LDE2Ci0gICAgICAgIG1vdiAgICAgW2VheCs2XSxkeCAgICAgICAgICA7IEluc3RhbGwgaGlnaCB3b3JkIG9mIG9mZnNldAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUmVtb3ZlRmF1bHRIYW5kbGVyKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDbG9zZXMgZG93biB0aGUgdmlydHVhbCBmcmFtZWJ1ZmZlciBzZXJ2aWNlcyBhbmQgcmVzdG9yZXMgdGhlIHByZXZpb3VzCi07IHBhZ2UgZmF1bHQgaGFuZGxlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBSZW1vdmVGYXVsdEhhbmRsZXIKLQotICAgICAgICBlbnRlcl9jCi0KLTsgUmVtb3ZlIHBhZ2UgZmF1bHQgaGFuZGxlciBmcm9tIElEVAotCi0gICAgICAgIHN1YiAgICAgZXNwLDYgICAgICAgICAgICAgICA7IEFsbG9jYXRlIHNwYWNlIG9uIHN0YWNrCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIHNpZHQgICAgW3NzOmVzcF0gICAgICAgICAgICA7IFN0b3JlIHBvaW50ZXIgdG8gSURUCi1lbHNlCi0gICAgICAgIHNpZHQgICAgW0ZXT1JEIHNzOmVzcF0gICAgICA7IFN0b3JlIHBvaW50ZXIgdG8gSURUCi1lbmRpZgotCi0gICAgICAgIHBvcCAgICAgYXggICAgICAgICAgICAgICAgICA7IGFkZCBlc3AsMgotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBBYnNvbHV0ZSBhZGRyZXNzIG9mIElEVAotICAgICAgICBhZGQgICAgIGVheCwxNCo4ICAgICAgICAgICAgOyBQb2ludCB0byBJbnQgIzE0Ci0gICAgICAgIG1vdiAgICAgY3gsW0lOVDE0U2VsZWN0b3JdCi0gICAgICAgIG1vdiAgICAgW2VheCsyXSxjeCAgICAgICAgICA7IFJlc3RvcmUgb3JpZ2luYWwgQ1MKLSAgICAgICAgbW92ICAgICBlZHgsW0lOVDE0T2Zmc2V0XQotICAgICAgICBtb3YgICAgIFtlYXhdLGR4ICAgICAgICAgICAgOyBJbnN0YWxsIGxvdyB3b3JkIG9mIG9mZnNldAotICAgICAgICBzaHIgICAgIGVkeCwxNgotICAgICAgICBtb3YgICAgIFtlYXgrNl0sZHggICAgICAgICAgOyBJbnN0YWxsIGhpZ2ggd29yZCBvZiBvZmZzZXQKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIEluc3RhbGxCYW5rRnVuYyhpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEluc3RhbGxzIHRoZSBiYW5rIHN3aXRjaCBmdW5jdGlvbiBieSByZWxvY2F0aW5nIGl0IGludG8gb3VyIGRhdGEgc2VnbWVudAotOyBhbmQgbWFraW5nIGl0IGludG8gYSBjYWxsYWJsZSBmdW5jdGlvbi4gV2UgZG8gaXQgdGhpcyB3YXkgdG8gbWFrZSB0aGUKLTsgY29kZSBpZGVudGljYWwgdG8gdGhlIHdheSB0aGF0IHRoZSBWZmxhdEQgZGV2aWNlcyB3b3JrIHVuZGVyIFdpbmRvd3MuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgSW5zdGFsbEJhbmtGdW5jCi0KLSAgICAgICAgQVJHICAgICBjb2RlTGVuOlVJTlQsIGJhbmtGdW5jOkRQVFIKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBlc2ksW2JhbmtGdW5jXSAgICAgIDsgQ29weSB0aGUgY29kZSBpbnRvIGJ1ZmZlcgotICAgICAgICBtb3YgICAgIGVkaSxvZmZzZXQgQmFua0Z1bmNCdWYKLSAgICAgICAgbW92ICAgICBlY3gsW2NvZGVMZW5dCi0gICAgcmVwIG1vdnNiCi0gICAgICAgIG1vdiAgICAgW0JZVEUgZWRpXSwwQzNoICAgICA7IFRlcm1pbmF0ZSB0aGUgZnVuY3Rpb24gd2l0aCBhIG5lYXIgcmV0Ci0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IEluaXRQYWdpbmcodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEluaXRpYWxpemVzIHBhZ2luZyBzeXN0ZW0uIElmIHBhZ2luZyBpcyBub3QgZW5hYmxlZCwgYnVpbGRzIGEgcGFnZSB0YWJsZQotOyBkaXJlY3RvcnkgYW5kIHBhZ2UgdGFibGVzIGZvciBwaHlzaWNhbCBtZW1vcnkKLTsKLTsgICBFeGl0OiAgICAgICAwICAgLSBTdWNjZXNzZnVsCi07ICAgICAgICAgICAgICAgLTEgIC0gQ291bGRuJ3QgaW5pdGlhbGl6ZSBwYWdpbmcgbWVjaGFuaXNtCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgSW5pdFBhZ2luZwotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIHB1c2ggICAgZXNpCi0gICAgICAgIHB1c2ggICAgZWRpCi0KLTsgQXJlIHdlIHJ1bm5pbmcgdW5kZXIgQ2F1c2VXYXk/Ci0KLSAgICAgICAgbW92ICAgICBheCwwRkZGOWgKLSAgICAgICAgaW50ICAgICAzMWgKLSAgICAgICAgamMgICAgICBAQE5vdENhdXNld2F5Ci0gICAgICAgIGNtcCAgICAgZWN4LCJDQVVTIgotICAgICAgICBqbnogICAgIEBATm90Q2F1c2V3YXkKLSAgICAgICAgY21wICAgICBlZHgsIkVXQVkiCi0gICAgICAgIGpueiAgICAgQEBOb3RDYXVzZXdheQotCi0gICAgICAgIG1vdiAgICAgW0JPT0wgVkZfaGF2ZUNhdXNlV2F5XSwxCi0gICAgICAgIG1vdiAgICAgW0NhdXNlV2F5RElSTGluZWFyXSxlc2kKLSAgICAgICAgbW92ICAgICBbQ2F1c2VXYXkxc3RMaW5lYXJdLGVkaQotCi07IENoZWNrIGZvciBEUE1JCi0KLSAgICAgICAgbW92ICAgICBheCwwZmYwMGgKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBpbnQgICAgIDMxaAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHNociAgICAgZWRpLDIKLSAgICAgICAgYW5kICAgICBlZGksMwotICAgICAgICBjbXAgICAgIGVkaSwyCi0gICAgICAgIGp6ICAgICAgQEBFcnJFeGl0ICAgICAgICAgICAgICAgOyBOb3Qgc3VwcG9ydGVkIHVuZGVyIERQTUkKLQotICAgICAgICBtb3YgICAgIGVheCxbQ2F1c2VXYXlESVJMaW5lYXJdCi0gICAgICAgIGptcCAgICAgQEBDb3B5Q1IzCi0KLUBATm90Q2F1c2V3YXk6Ci0gICAgICAgIG1vdiAgICAgYXgsY3MKLSAgICAgICAgdGVzdCAgICBheCwzICAgICAgICAgICAgICAgICAgICA7IFdoaWNoIHJpbmcgYXJlIHdlIHJ1bm5pbmcKLSAgICAgICAgam56ICAgICBAQEVyckV4aXQgICAgICAgICAgICAgICA7IE5lZWRzIHplcm8gcmluZyB0byBhY2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHBhZ2UgdGFibGVzIChDUjMpCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMCAgICAgICAgICAgICAgICAgOyBMb2FkIENSMAotICAgICAgICB0ZXN0ICAgIGVheCw4MDAwMDAwMGggICAgICAgICAgIDsgSXMgcGFnaW5nIGVuYWJsZWQ/Ci0gICAgICAgIGp6ICAgICAgQEBFcnJFeGl0ICAgICAgICAgICAgICAgOyBObywgd2UgbXVzdCBoYXZlIHBhZ2luZyEKLQotICAgICAgICBtb3YgICAgIGVheCxjcjMgICAgICAgICAgICAgICAgIDsgTG9hZCBkaXJlY3RvcnkgYWRkcmVzcwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0KLUBAQ29weUNSMzoKLSAgICAgICAgbW92ICAgICBbUERCUl0sZWF4ICAgICAgICAgICAgICA7IFNhdmUgaXQKLSAgICAgICAgbW92ICAgICBlc2ksZWF4Ci0gICAgICAgIG1vdiAgICAgZWRpLG9mZnNldCBwYWdlRGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWN4LDEwMjQKLSAgICAgICAgY2xkCi0gICAgICAgIHJlcCAgICAgbW92c2QgICAgICAgICAgICAgICAgICAgOyBDb3B5IHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlIGRpcmVjdG9yeQotICAgICAgICBjbXAgICAgIFtEV09SRCBhY2Nlc3NQYWdlQWRkcl0sMDsgQ2hlY2sgaWYgd2UgaGF2ZSBhbGxvY2F0ZWQgcGFnZQotICAgICAgICBqbmUgICAgIEBASGF2ZVJlYWxNZW0gICAgICAgICAgIDsgdGFibGUgYWxyZWFkeSAod2UgY2FudCBmcmVlIGl0KQotCi0gICAgICAgIG1vdiAgICAgZWF4LDAxMDBoICAgICAgICAgICAgICAgOyBEUE1JIERPUyBhbGxvY2F0ZQotICAgICAgICBtb3YgICAgIGVieCw4MTkyLzE2Ci0gICAgICAgIGludCAgICAgMzFoICAgICAgICAgICAgICAgICAgICAgOyBBbGxvY2F0ZSA4MTkyIGJ5dGVzCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGaAotICAgICAgICBzaGwgICAgIGVheCw0ICAgICAgICAgICAgICAgICAgIDsgRUFYIHBvaW50cyB0byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5Ci0gICAgICAgIGFkZCAgICAgZWF4LDQwOTUKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaCAgICAgICAgICA7IFBhZ2UgYWxpZ24KLSAgICAgICAgbW92ICAgICBbYWNjZXNzUGFnZUFkZHJdLGVheAotCi1AQEhhdmVSZWFsTWVtOgotICAgICAgICBtb3YgICAgIGVheCxbYWNjZXNzUGFnZUFkZHJdICAgIDsgRUFYIC0+IHBhZ2UgdGFibGUgaW4gMXN0IE1iCi0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGFuZCAgICAgZWF4LDNGRmggICAgICAgICAgICAgICAgOyBQYWdlIHRhYmxlIG9mZnNldAotICAgICAgICBzaGwgICAgIGVheCwyCi0gICAgICAgIGNtcCAgICAgW0JPT0wgVkZfaGF2ZUNhdXNlV2F5XSwwCi0gICAgICAgIGp6ICAgICAgQEBOb3RDVzAKLSAgICAgICAgbW92ICAgICBlYngsW0NhdXNlV2F5MXN0TGluZWFyXQotICAgICAgICBqbXAgICAgIEBAUHV0MXN0Ci0KLUBATm90Q1cwOgotICAgICAgICBtb3YgICAgIGVieCxbUERCUl0KLSAgICAgICAgbW92ICAgICBlYngsW2VieF0KLSAgICAgICAgYW5kICAgICBlYngsMEZGRkZGMDAwaCAgICAgICAgICA7IFBhZ2UgdGFibGUgZm9yIDFzdCBtZWdhYnl0ZQotCi1AQFB1dDFzdDoKLSAgICAgICAgYWRkICAgICBlYXgsZWJ4Ci0gICAgICAgIG1vdiAgICAgW2FjY2Vzc1BhZ2VUYWJsZV0sZWF4Ci0gICAgICAgIHN1YiAgICAgZWF4LGVheCAgICAgICAgICAgICAgICAgOyBObyBlcnJvcgotICAgICAgICBqbXAgICAgIEBARXhpdAotCi1AQEVyckV4aXQ6Ci0gICAgICAgIG1vdiAgICAgZWF4LC0xCi0KLUBARXhpdDogcG9wICAgICBlZGkKLSAgICAgICAgcG9wICAgICBlc2kKLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgQ2xvc2VQYWdpbmcodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENsb3NlcyB0aGUgcGFnaW5nIHN5c3RlbQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIENsb3NlUGFnaW5nCi0KLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaCAgICBlZHgKLSAgICAgICAgcHVzaCAgICBlc2kKLSAgICAgICAgcHVzaCAgICBlZGkKLQotICAgICAgICBtb3YgICAgIGVheCxbYWNjZXNzUGFnZUFkZHJdCi0gICAgICAgIGNhbGwgICAgQWNjZXNzUGFnZSAgICAgICAgICAgICAgOyBSZXN0b3JlIEFjY2Vzc1BhZ2UgbWFwcGluZwotICAgICAgICBtb3YgICAgIGVkaSxbUERCUl0KLSAgICAgICAgbW92ICAgICBlc2ksb2Zmc2V0IHBhZ2VEaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlY3gsMTAyNAotICAgICAgICBjbGQKLSAgICAgICAgcmVwICAgICBtb3ZzZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUgZGlyZWN0b3J5Ci0KLUBARXhpdDogcG9wICAgICBlZGkKLSAgICAgICAgcG9wICAgICBlc2kKLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGxvbmcgQWNjZXNzUGFnZShsb25nIHBoeXMpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNYXBzIGEga25vd24gcGFnZSB0byBnaXZlbiBwaHlzaWNhbCBtZW1vcnkKLTsgICBFbnRyeTogICAgICBFQVggLSBQaHlzaWNhbCBtZW1vcnkKLTsgICBFeGl0OiAgICAgICBFQVggLSBMaW5lYXIgbWVtb3J5IGFkZHJlc3Mgb2YgbWFwcGVkIHBoeXMgbWVtCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGF0aWMgICAgIEFjY2Vzc1BhZ2UKLQotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBtb3YgICAgIGVkeCxbYWNjZXNzUGFnZVRhYmxlXQotICAgICAgICBvciAgICAgIGVheCw3Ci0gICAgICAgIG1vdiAgICAgW2VkeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKLSAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXQotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgbG9uZyBHZXRQaHlzaWNhbEFkZHJlc3MobG9uZyBsaW5lYXIpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGxpbmVhciBhZGRyZXNzCi07ICAgRW50cnk6ICAgICAgRUFYIC0gTGluZWFyIGFkZHJlc3MgdG8gY29udmVydAotOyAgIEV4aXQ6ICAgICAgIEVBWCAtIFBoeXNpY2FsIGFkZHJlc3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXRpYyAgICAgR2V0UGh5c2ljYWxBZGRyZXNzCi0KLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlZHgKLSAgICAgICAgbW92ICAgICBlZHgsZWF4Ci0gICAgICAgIHNociAgICAgZWR4LDIyICAgICAgICAgICAgICAgICAgOyBFRFggaXMgdGhlIGRpcmVjdG9yeSBvZmZzZXQKLSAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWR4LFtlZHgqNCtlYnhdICAgICAgICAgOyBMb2FkIHBhZ2UgdGFibGUgYWRkcmVzcwotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBtb3YgICAgIGVheCxlZHgKLSAgICAgICAgY2FsbCAgICBBY2Nlc3NQYWdlICAgICAgICAgICAgICA7IEFjY2VzcyB0aGUgcGFnZSB0YWJsZQotICAgICAgICBtb3YgICAgIGVkeCxlYXgKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgc2hyICAgICBlYXgsMTIKLSAgICAgICAgYW5kICAgICBlYXgsMDNGRmggICAgICAgICAgICAgICA7IEVBWCBvZmZzZXQgaW50byBwYWdlIHRhYmxlCi0gICAgICAgIG1vdiAgICAgZWF4LFtlZHgrZWF4KjRdICAgICAgICAgOyBMb2FkIHBoeXNpY2FsIGFkZHJlc3MKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBDcmVhdGVQYWdlVGFibGUobG9uZyBwYWdlREVudHJ5KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ3JlYXRlcyBhIHBhZ2UgdGFibGUgZm9yIHNwZWNpZmljIGFkZHJlc3MgKDRNQikKLTsgICAgICAgRW50cnk6ICBFQVggLSBQYWdlIGRpcmVjdG9yeSBlbnRyeSAodG9wIDEwLWJpdHMgb2YgYWRkcmVzcykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXRpYyAgICAgQ3JlYXRlUGFnZVRhYmxlCi0KLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaCAgICBlZHgKLSAgICAgICAgcHVzaCAgICBlZGkKLSAgICAgICAgbW92ICAgICBlYngsZWF4ICAgICAgICAgICAgICAgICA7IFNhdmUgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGVheCw4MTkyCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIGNhbGwgICAgVkZfbWFsbG9jICAgICAgICAgICAgICA7IEFsbG9jYXRlIHBhZ2UgdGFibGUgZGlyZWN0b3J5Ci0gICAgICAgIGFkZCAgICAgZXNwLDQKLSAgICAgICAgYWRkICAgICBlYXgsMEZGRmgKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaCAgICAgICAgICA7IFBhZ2UgYWxpZ24gKDRLQikKLSAgICAgICAgbW92ICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICA7IFNhdmUgcGFnZSB0YWJsZSBsaW5lYXIgYWRkcmVzcwotICAgICAgICBzdWIgICAgIGVheCxlYXggICAgICAgICAgICAgICAgIDsgRmlsbCB3aXRoIHplcm8KLSAgICAgICAgbW92ICAgICBlY3gsMTAyNAotICAgICAgICBjbGQKLSAgICAgICAgcmVwICAgICBzdG9zZCAgICAgICAgICAgICAgICAgICA7IENsZWFyIHBhZ2UgdGFibGUKLSAgICAgICAgc3ViICAgICBlZGksNDA5NgotICAgICAgICBtb3YgICAgIGVheCxlZGkKLSAgICAgICAgY2FsbCAgICBHZXRQaHlzaWNhbEFkZHJlc3MKLSAgICAgICAgbW92ICAgICBlZHgsW1BEQlJdCi0gICAgICAgIG9yICAgICAgZWF4LDcgICAgICAgICAgICAgICAgICAgOyBQcmVzZW50L3dyaXRlL3VzZXIgYml0Ci0gICAgICAgIG1vdiAgICAgW2VkeCtlYngqNF0sZWF4ICAgICAgICAgOyBTYXZlIHBoeXNpY2FsIGFkZHJlc3MgaW50byBwYWdlIGRpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCi0gICAgICAgIHBvcCAgICAgZWRpCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIE1hcFBoeXNpY2FsMkxpbmVhcih1bG9uZyBwQWRkciwgdWxvbmcgbEFkZHIsIGludCBwYWdlcywgaW50IGZsYWdzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1hcHMgcGh5c2ljYWwgbWVtb3J5IGludG8gbGluZWFyIG1lbW9yeQotOyAgIEVudHJ5OiAgICAgIHBBZGRyICAgLSBQaHlzaWNhbCBhZGRyZXNzCi07ICAgICAgICAgICAgICAgbEFkZHIgICAtIExpbmVhciBhZGRyZXNzCi07ICAgICAgICAgICAgICAgcGFnZXMgICAtIE51bWJlciBvZiA0SyBwYWdlcyB0byBtYXAKLTsgICAgICAgICAgICAgICBmbGFncyAgIC0gUGFnZSBmbGFncwotOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAwICAgPSAgICAgICBwcmVzZW50Ci07ICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDEgICA9ICAgICAgIFJlYWQoMCkvV3JpdGUoMSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBNYXBQaHlzaWNhbDJMaW5lYXIKLQotICAgICAgICBBUkcgICAgIHBBZGRyOlVMT05HLCBsQWRkcjpVTE9ORywgcGFnZXM6VUlOVCwgcGZsYWdzOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgYW5kICAgICBbVUxPTkcgcEFkZHJdLDBGRkZGRjAwMGg7IFBhZ2UgYm91bmRhcnkKLSAgICAgICAgYW5kICAgICBbVUxPTkcgbEFkZHJdLDBGRkZGRjAwMGg7IFBhZ2UgYm91bmRhcnkKLSAgICAgICAgbW92ICAgICBlY3gsW3BmbGFnc10KLSAgICAgICAgYW5kICAgICBlY3gsMTFiICAgICAgICAgICAgICAgICA7IEp1c3QgdHdvIGJpdHMKLSAgICAgICAgb3IgICAgICBlY3gsMTAwYiAgICAgICAgICAgICAgICA7IFN1cGVydmlzb3IgYml0Ci0gICAgICAgIG1vdiAgICAgW3BmbGFnc10sZWN4Ci0KLSAgICAgICAgbW92ICAgICBlZHgsW2xBZGRyXQotICAgICAgICBzaHIgICAgIGVkeCwyMiAgICAgICAgICAgICAgICAgIDsgRURYID0gRGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZXNpLFtQREJSXQotICAgICAgICBtb3YgICAgIGVkaSxbcGFnZXNdICAgICAgICAgICAgIDsgRURJIHBhZ2UgY291bnQKLSAgICAgICAgbW92ICAgICBlYngsW2xBZGRyXQotCi1AQENyZWF0ZUxvb3A6Ci0gICAgICAgIG1vdiAgICAgZWN4LFtlc2krZWR4KjRdICAgICAgICAgOyBMb2FkIHBhZ2UgdGFibGUgYWRkcmVzcwotICAgICAgICB0ZXN0ICAgIGVjeCwxICAgICAgICAgICAgICAgICAgIDsgSXMgaXQgcHJlc2VudD8KLSAgICAgICAgam56ICAgICBAQFRhYmxlT0sKLSAgICAgICAgbW92ICAgICBlYXgsZWR4Ci0gICAgICAgIGNhbGwgICAgQ3JlYXRlUGFnZVRhYmxlICAgICAgICAgOyBDcmVhdGUgYSBwYWdlIHRhYmxlCi1AQFRhYmxlT0s6Ci0gICAgICAgIG1vdiAgICAgZWF4LGVieAotICAgICAgICBzaHIgICAgIGVheCwxMgotICAgICAgICBhbmQgICAgIGVheCwzRkZoCi0gICAgICAgIHN1YiAgICAgZWF4LDEwMjQKLSAgICAgICAgbmVnICAgICBlYXggICAgICAgICAgICAgICAgICAgICA7IEVBWCA9IHBhZ2UgY291bnQgaW4gdGhpcyB0YWJsZQotICAgICAgICBpbmMgICAgIGVkeCAgICAgICAgICAgICAgICAgICAgIDsgTmV4dCB0YWJsZQotICAgICAgICBtb3YgICAgIGVieCwwICAgICAgICAgICAgICAgICAgIDsgTmV4dCB0aW1lIHdlJ2xsIG1hcCAxSyBwYWdlcwotICAgICAgICBzdWIgICAgIGVkaSxlYXggICAgICAgICAgICAgICAgIDsgU3VidHJhY3QgbWFwcGVkIHBhZ2VzIGZyb20gcGFnZSBjb3VudAotICAgICAgICBqbnMgICAgIEBAQ3JlYXRlTG9vcCAgICAgICAgICAgIDsgQ3JlYXRlIG1vcmUgdGFibGVzIGlmIG5lY2Vzc2FyeQotCi0gICAgICAgIG1vdiAgICAgZWN4LFtwYWdlc10gICAgICAgICAgICAgOyBFQ1ggPSBQYWdlIGNvdW50Ci0gICAgICAgIG1vdiAgICAgZXNpLFtsQWRkcl0KLSAgICAgICAgc2hyICAgICBlc2ksMTIgICAgICAgICAgICAgICAgICA7IE9mZnNldCBwYXJ0IGlzbid0IG5lZWRlZAotICAgICAgICBtb3YgICAgIGVkaSxbcEFkZHJdCi1AQE1hcHBpbmdMb29wOgotICAgICAgICBtb3YgICAgIGVheCxlc2kKLSAgICAgICAgc2hyICAgICBlYXgsMTAgICAgICAgICAgICAgICAgICA7IEVBWCA9IG9mZnNldCB0byBwYWdlIGRpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVieCxbUERCUl0KLSAgICAgICAgbW92ICAgICBlYXgsW2VheCo0K2VieF0gICAgICAgICA7IEVBWCA9IHBhZ2UgdGFibGUgYWRkcmVzcwotICAgICAgICBjYWxsICAgIEFjY2Vzc1BhZ2UKLSAgICAgICAgbW92ICAgICBlYngsZXNpCi0gICAgICAgIGFuZCAgICAgZWJ4LDNGRmggICAgICAgICAgICAgICAgOyBFQlggPSBvZmZzZXQgdG8gcGFnZSB0YWJsZQotICAgICAgICBtb3YgICAgIGVkeCxlZGkKLSAgICAgICAgYWRkICAgICBlZGksNDA5NiAgICAgICAgICAgICAgICA7IE5leHQgcGh5c2ljYWwgYWRkcmVzcwotICAgICAgICBpbmMgICAgIGVzaSAgICAgICAgICAgICAgICAgICAgIDsgTmV4dCBsaW5lYXIgcGFnZQotICAgICAgICBvciAgICAgIGVkeCxbcGZsYWdzXSAgICAgICAgICAgIDsgVXBkYXRlIGZsYWdzLi4uCi0gICAgICAgIG1vdiAgICAgW2VheCtlYngqNF0sZWR4ICAgICAgICAgOyBTdG9yZSBwYWdlIHRhYmxlIGVudHJ5Ci0gICAgICAgIGxvb3AgICAgQEBNYXBwaW5nTG9vcAotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX3ZmbGF0Ci0KLWVuZGlmCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0N2U1Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50LgotKgotKiBEZXNjcmlwdGlvbjogIFNNWCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCB0aW1pbmcgZnVuY3Rpb24gKi8KLQotdm9pZCBfX1pUaW1lckluaXQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgRE9TIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aHJlYWQgcHJpb3JpdGllcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgICAgICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgRE9TIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aHJlYWQgcHJpb3JpdGllcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKSAgICAodm9pZCkoaSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgdWxvbmcgcmVzb2x1dGlvbjsKLQotICAgIF9fWlRpbWVySW5pdCgpOwotICAgIFVMWlRpbWVyUmVzb2x1dGlvbigmcmVzb2x1dGlvbik7Ci0gICAgZnJlcS0+bG93ID0gKHVsb25nKSgxMDAwMDAwMDAwMC4wIC8gcmVzb2x1dGlvbik7Ci0gICAgZnJlcS0+aGlnaCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh0KS0+bG93ID0gVUxaUmVhZFRpbWUoKSAqIDEwMDAwTDsgIFwKLSAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNjMjYxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudAotKgotKiBEZXNjcmlwdGlvbjogIDMyLWJpdCBTTVggaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzbXgvcHMybW91c2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaWJvb2wgX1ZBUkFQSSAgIF9FVlRfdXNlRXZlbnRzID0gdHJ1ZTsgIC8qIFRydWUgdG8gdXNlIGV2ZW50IGhhbmRsaW5nICAgKi8KLWlib29sIF9WQVJBUEkgICBfRVZUX2luc3RhbGxlZCA9IDA7ICAgICAvKiBFdmVudCBoYW5kZXJzIGluc3RhbGxlZD8gICAgICovCi11Y2hhciBfVkFSQVBJICAgKl9FVlRfYmlvc1B0ciA9IE5VTEw7ICAgLyogUG9pbnRlciB0byB0aGUgQklPUyBkYXRhIGFyZWEgKi8KLXN0YXRpYyBpYm9vbCAgICBoYXZlTW91c2UgPSBmYWxzZTsgICAgICAvKiBUcnVlIGlmIHdlIGhhdmUgYSBtb3VzZSAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLQotdm9pZCAgICBFVlRBUEkgX0VWVF9wb2xsSm95c3RpY2sodm9pZCk7Ci11aW50ICAgIEVWVEFQSSBfRVZUX2Rpc2FibGVJbnQodm9pZCk7Ci11aW50ICAgIEVWVEFQSSBfRVZUX3Jlc3RvcmVJbnQodWludCBmbGFncyk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NvZGVTdGFydCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY29kZUVuZCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY0NvZGVTdGFydCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY0NvZGVFbmQodm9pZCk7Ci1pbnQgICAgIEVWVEFQSSBfRVZUX2dldEtleUNvZGUodm9pZCk7Ci1pbnQgICAgIEVWVEFQSSBFVlRfcmRpbngoaW50IHBvcnQsaW50IGluZGV4KTsKLXZvaWQgICAgRVZUQVBJIEVWVF93cmlueChpbnQgcG9ydCxpbnQgaW5kZXgsaW50IHZhbHVlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBET1MsIGJlY2F1c2Ugd2UgYXJlIGZ1bGx5IGludGVycnVwdCBkcml2ZW4uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX3B1bXBNZXNzYWdlcygpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17Ci0gICAgcmV0dXJuICh1bG9uZylQTV9nZXRMb25nKF9FVlRfYmlvc1B0cisweDZDKSAqIDU1VUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5jbHVkZSBnZW5lcmljIHJhdyBzY2FuY29kZSBrZXlib2FyZCBtb2R1bGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgImNvbW1vbi9rZXlib2FyZC5jIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURldGVybWluZXMgaWYgd2UgaGF2ZSBhIG1vdXNlIGF0dGFjaGVkIGFuZCBmdW5jdGlvbmluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgZGV0ZWN0TW91c2Uodm9pZCkKLXsKLSAgIHJldHVybihwczJRdWVyeSgpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci13aGF0ICAgICAgICAtIEV2ZW50IGNvZGUKLW1lc3NhZ2UgICAgIC0gRXZlbnQgbWVzc2FnZQoteCx5ICAgICAgICAgLSBNb3VzZSBwb3NpdGlvbiBhdCB0aW1lIG9mIGV2ZW50Ci1idXRfc3RhdCAgICAtIE1vdXNlIGJ1dHRvbiBzdGF0dXMgYXQgdGltZSBvZiBldmVudAotCi1SRU1BUktTOgotQWRkcyBhIG5ldyBtb3VzZSBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB3aXRoaW4KLXRoZSBtb3VzZSBpbnRlcnJ1cHQgc3Vicm91dGluZSwgc28gaXQgbXVzdCBiZSBlZmZpY2llbnQuCi0KLU5PVEU6ICAgSW50ZXJydXB0cyBNVVNUIGJlIE9GRiB3aGlsZSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGVuc3VyZSB3ZSBoYXZlCi0JbXV0dWFsbHkgZXhjbHVzaXZlIGFjY2VzcyB0byBvdXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvcgotCWludGVycnVwdCBkcml2ZW4gc3lzdGVtcyAobGlrZSB1bmRlciBET1MpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkZE1vdXNlRXZlbnQoCi0gICAgdWludCB3aGF0LAotICAgIHVpbnQgbWVzc2FnZSwKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgbWlja2V5WCwKLSAgICBpbnQgbWlja2V5WSwKLSAgICB1aW50IGJ1dF9zdGF0KQotewotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkvKiBTYXZlIGluZm9ybWF0aW9uIGluIGV2ZW50IHJlY29yZC4gKi8KLQlldnQud2hlbiA9IF9FVlRfZ2V0VGlja3MoKTsKLQlldnQud2hhdCA9IHdoYXQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotCWV2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKLQlldnQud2hlcmVfeCA9IHg7ICAgICAgICAgICAgICAgIC8qIFNhdmUgbW91c2UgZXZlbnQgcG9zaXRpb24gICAgKi8KLQlldnQud2hlcmVfeSA9IHk7Ci0JZXZ0LnJlbGF0aXZlX3ggPSBtaWNrZXlYOwotCWV2dC5yZWxhdGl2ZV95ID0gbWlja2V5WTsKLQlldnQubW9kaWZpZXJzIHw9IEVWVC5rZXlNb2RpZmllcnM7Ci0JYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1hc2sgICAgICAgIC0gRXZlbnQgbWFzawotYnV0c3RhdGUgICAgLSBCdXR0b24gc3RhdGUKLXggICAgICAgICAgIC0gTW91c2UgeCBjb29yZGluYXRlCi15ICAgICAgICAgICAtIE1vdXNlIHkgY29vcmRpbmF0ZQotCi1SRU1BUktTOgotTW91c2UgZXZlbnQgaGFuZGxpbmcgcm91dGluZS4gVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgbW91c2UgZXZlbnQgb2NjdXJzLAotYW5kIHdlIGNhbGwgdGhlIGFkZE1vdXNlRXZlbnQoKSByb3V0aW5lIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbW91c2UgZXZlbnQKLXRvIHRoZSBldmVudCBxdWV1ZS4KLQotTm90ZTogSW50ZXJydXB0cyBhcmUgT04gd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtb3VzZSBkcml2ZXIgY29kZS4KLS8qQU06IE5PVEU6IFRoaXMgZnVuY3Rpb24gaGFzIG5vdCBhY3R1YWxseSBiZWVuIHBvcnRlZCBmcm9tIERPUyB5ZXQgYW5kIHNob3VsZCBub3QgKi8KLS8qQU06IGJlIGluc3RhbGxlZCB1bnRpbCBpdCBpcy4gKi8KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFVlRBUEkgbW91c2VJU1IoCi0gICAgdWludCBtYXNrLAotICAgIHVpbnQgYnV0c3RhdGUsCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IG1pY2tleVgsCi0gICAgaW50IG1pY2tleVkpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIHVpbnQgICAgcHM7Ci0KLSAgICBpZiAobWFzayAmIDEpIHsKLQkvKiBTYXZlIHRoZSBjdXJyZW50IG1vdXNlIGNvb3JkaW5hdGVzICovCi0JRVZULm14ID0geDsgRVZULm15ID0geTsKLQotCS8qIElmIHRoZSBsYXN0IGV2ZW50IHdhcyBhIG1vdmVtZW50IGV2ZW50LCB0aGVuIG1vZGlmeSB0aGUgbGFzdAotCSAqIGV2ZW50IHJhdGhlciB0aGFuIHBvc3QgYSBuZXcgb25lLCBzbyB0aGF0IHRoZSBxdWV1ZSB3aWxsIG5vdAotCSAqIGJlY29tZSBzYXR1cmF0ZWQuIEJlZm9yZSB3ZSBtb2RpZnkgdGhlIGRhdGEgc3RydWN0dXJlcywgd2UKLQkgKiBNVVNUIGVuc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIG9mZi4KLQkgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWlmIChFVlQub2xkTW92ZSAhPSAtMSkgewotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeCA9IHg7ICAgICAgICAgIC8qIE1vZGlmeSBleGlzdGluZyBvbmUgICovCi0JICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV95ID0geTsKLQkgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLnJlbGF0aXZlX3ggKz0gbWlja2V5WDsKLQkgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLnJlbGF0aXZlX3kgKz0gbWlja2V5WTsKLQkgICAgfQotCWVsc2UgewotCSAgICBFVlQub2xkTW92ZSA9IEVWVC5mcmVlSGVhZDsgICAgICAgICAvKiBTYXZlIGlkIG9mIHRoaXMgbW92ZSBldmVudCAgICovCi0JICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFTU9WRSwwLHgseSxtaWNrZXlYLG1pY2tleVksYnV0c3RhdGUpOwotCSAgICB9Ci0JX0VWVF9yZXN0b3JlSW50KHBzKTsKLQl9Ci0gICAgaWYgKG1hc2sgJiAweDJBKSB7Ci0JcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQlhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRURPV04sbWFzayA+PiAxLHgseSwwLDAsYnV0c3RhdGUpOwotCUVWVC5vbGRNb3ZlID0gLTE7Ci0JX0VWVF9yZXN0b3JlSW50KHBzKTsKLQl9Ci0gICAgaWYgKG1hc2sgJiAweDU0KSB7Ci0JcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQlhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRVVQLG1hc2sgPj4gMix4LHksMCwwLGJ1dHN0YXRlKTsKLQlFVlQub2xkTW92ZSA9IC0xOwotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JfQotICAgIEVWVC5vbGRLZXkgPSAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1LZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbi4KLQotTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCi0JYW5kIHdlIGxlYXZlIHRoZW0gT0ZGIHRoZSBlbnRpcmUgdGltZS4gVGhpcyBoYXMgYmVlbiBtb2RpZmllZCB0byB3b3JrCi0gICAgICBpbiBjb25qdW5jdGlvbiB3aXRoIHNteCBrZXlib2FyZCBoYW5kbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEVWVEFQSSBrZXlib2FyZElTUih2b2lkKQotewotICAgUE1fY2hhaW5QcmV2S2V5KCk7Ci0gICAgcHJvY2Vzc1Jhd1NjYW5Db2RlKFBNX2lucGIoMHg2MCkpOwotICAgIFBNX291dHBiKDB4MjAsMHgyMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgpCi17Ci0gICAgRVZUX2V4aXQoKTsKLSAgICBQTV9mYXRhbEVycm9yKCJVbmhhbmRsZWQgZXhjZXB0aW9uISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIGludCAgICAgaTsKLQotICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgX0VWVF9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBFVlRfcmVzdW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICBzdGF0aWMgaW50ICAgICAgbG9ja2VkID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgc3RhdDsKLSAgICB1Y2hhciAgICAgICAgICAgbW9kczsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7Ci0KLSAgICBpZiAoX0VWVF91c2VFdmVudHMpIHsKLQkvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSBhbmQgZW5hYmxlIG91ciBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLQlpbml0RXZlbnRRdWV1ZSgpOwotCVBNX3NldEtleUhhbmRsZXIoa2V5Ym9hcmRJU1IpOwotCWlmICgoaGF2ZU1vdXNlID0gZGV0ZWN0TW91c2UoKSkgIT0gMCkKLQkgICAgUE1fc2V0TW91c2VIYW5kbGVyKDB4RkZGRixtb3VzZUlTUik7Ci0KLQkvKiBSZWFkIHRoZSBrZXlib2FyZCBtb2RpZmllciBmbGFncyBmcm9tIHRoZSBCSU9TIHRvIGdldCB0aGUKLQkgKiBjb3JyZWN0IGluaXRpYWxpc2F0aW9uIHN0YXRlLiBUaGUgb25seSBzdGF0ZSB3ZSBjYXJlIGFib3V0IGlzCi0JICogdGhlIGNvcnJlY3QgdG9nZ2xlIHN0YXRlIGZsYWdzIHN1Y2ggYXMgU0NST0xMTE9DSywgTlVNTE9DSyBhbmQKLQkgKiBDQVBTTE9DSy4KLQkgKi8KLQlFVlQua2V5TW9kaWZpZXJzID0gMDsKLQltb2RzID0gUE1fZ2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHgxNyk7Ci0JaWYgKG1vZHMgJiAweDEwKQotCSAgICBFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9TQ1JPTExMT0NLOwotCWlmIChtb2RzICYgMHgyMCkKLQkgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfTlVNTE9DSzsKLQlpZiAobW9kcyAmIDB4NDApCi0JICAgIEVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX0NBUFNMT0NLOwotCi0JLyogTG9jayBhbGwgb2YgdGhlIGNvZGUgYW5kIGRhdGEgdXNlZCBieSBvdXIgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0Ci0JICogaGFuZGxpbmcgcm91dGluZXMsIHNvIHRoYXQgaXQgd2lsbCBjb250aW51ZSB0byB3b3JrIGNvcnJlY3RseQotCSAqIHVuZGVyIHJlYWwgbW9kZS4KLQkgKi8KLQlpZiAoIWxvY2tlZCkgewotCSAgICAvKiBJdCBpcyBkaWZmaWN1bHQgdG8gZW5zdXJlIHRoYXQgd2UgbG9jayBvdXIgZ2xvYmFsIGRhdGEsIHNvIHdlCi0JICAgICAqIGRvIHRoaXMgYnkgdGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgbG9ja2luZyBhbGwgZGF0YQotCSAgICAgKiAyS2Igb24gZWl0aGVyIHNpZGUuIFRoaXMgc2hvdWxkIHByb3Blcmx5IGNvdmVyIHRoZSBnbG9iYWwgZGF0YQotCSAgICAgKiB1c2VkIGJ5IHRoZSBtb2R1bGUgKHRoZSBvdGhlciBhbHRlcm5hdGl2ZSBpcyB0byBkZWNsYXJlIHRoZQotCSAgICAgKiB2YXJpYWJsZXMgaW4gYXNzZW1ibGVyLCBpbiB3aGljaCBjYXNlIHdlIGtub3cgaXQgd2lsbCBiZQotCSAgICAgKiBjb3JyZWN0KS4KLQkgICAgICovCi0JICAgIHN0YXQgID0gIVBNX2xvY2tEYXRhUGFnZXMoJkVWVCxzaXplb2YoRVZUKSwmbGgpOwotCSAgICBzdGF0IHw9ICFQTV9sb2NrRGF0YVBhZ2VzKCZfRVZUX2Jpb3NQdHIsc2l6ZW9mKF9FVlRfYmlvc1B0ciksJmxoKTsKLQkgICAgc3RhdCB8PSAhUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKV9FVlRfY0NvZGVTdGFydCwoaW50KV9FVlRfY0NvZGVFbmQtKGludClfRVZUX2NDb2RlU3RhcnQsJmxoKTsKLQkgICAgc3RhdCB8PSAhUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKV9FVlRfY29kZVN0YXJ0LChpbnQpX0VWVF9jb2RlRW5kLShpbnQpX0VWVF9jb2RlU3RhcnQsJmxoKTsKLQkgICAgaWYgKHN0YXQpIHsKLQkJUE1fZmF0YWxFcnJvcigiUGFnZSBsb2NraW5nIHNlcnZpY2VzIGZhaWxlZCAtIGludGVycnVwdCBoYW5kbGluZyBub3Qgc2FmZSEiKTsKLQkJZXhpdCgxKTsKLQkJfQotCSAgICBsb2NrZWQgPSAxOwotCSAgICB9Ci0KLQlfRVZUX2luc3RhbGxlZCA9IHRydWU7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIGlmIChoYXZlTW91c2UpIHsKLQlwczJNb3VzZVN0b3AoKTsKLQlwczJNb3VzZVN0YXJ0KCAwLCB4UmVzLCAwLCB5UmVzLCAtMSwgLTEsIC0xKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX3NldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgaWYgKGhhdmVNb3VzZSkKLQlwczJNb3VzZU1vdmUoKngsICp5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICB1Y2hhciAgIG1vZHM7Ci0KLSAgICBpZiAoX0VWVF9pbnN0YWxsZWQpIHsKLQlQTV9yZXN0b3JlS2V5SGFuZGxlcigpOwotICAgIGlmIChoYXZlTW91c2UpCi0JUE1fcmVzdG9yZU1vdXNlSGFuZGxlcigpOwotCi0JLyogU2V0IHRoZSBrZXlib2FyZCBtb2RpZmllciBmbGFncyBpbiB0aGUgQklPUyB0byBvdXIgdmFsdWVzICovCi0JRVZUX2FsbG93TEVEUyh0cnVlKTsKLQltb2RzID0gUE1fZ2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHgxNykgJiB+MHg3MDsKLQlpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9TQ1JPTExMT0NLKQotCSAgICBtb2RzIHw9IDB4MTA7Ci0JaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfTlVNTE9DSykKLQkgICAgbW9kcyB8PSAweDIwOwotCWlmIChFVlQua2V5TW9kaWZpZXJzICYgRVZUX0NBUFNMT0NLKQotCSAgICBtb2RzIHw9IDB4NDA7Ci0JUE1fc2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHgxNyxtb2RzKTsKLQotCS8qIEZsYWcgdGhhdCB3ZSBhcmUgbm8gbG9uZ2VyIGluc3RhbGxlZCAqLwotCV9FVlRfaW5zdGFsbGVkID0gZmFsc2U7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9leGl0KHZvaWQpCi17Ci0gICAgRVZUX3N1c3BlbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjhkYWEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgU01YIGVtYmVkZGVkIHN5c3RlbXMgZGV2ZWxvcG1lbnQuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVlM2Q0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMiBiaXQgU01YIGVtYmVkZGVkIHN5c3RlbXMgZGV2ZWxvcG1lbnQuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJ6dGltZXJjLmgiCi0jaW5jbHVkZSAiZXZlbnQuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZG9zLmg+Ci0jaW5jbHVkZSA8Y29uaW8uaD4KLSNpZmRlZiAgX19HTlVDX18KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbmVhcnB0ci5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2VuZGlmCi0jaWZkZWYgIF9fQk9STEFORENfXwotI3ByYWdtYSB3YXJuIC1wYXIKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50ICAgICBvbGRNb2RlOwotICAgIGludCAgICAgb2xkNTBMaW5lczsKLSAgICB9IERPU19zdGF0ZUJ1ZjsKLQotI2RlZmluZSBNQVhfUk1fQkxPQ0tTICAgMTAKLQotc3RhdGljIHN0cnVjdCB7Ci0gICAgdm9pZCAgICAqcDsKLSAgICB1aW50ICAgIHRhZzsKLSAgICB9IHJtQmxvY2tzW01BWF9STV9CTE9DS1NdOwotCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAgICAgLyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLwotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcnNlZzsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9yb2ZmOyAgICAgICAgICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci11c2hvcnQgX1ZBUkFQSSAgX1BNX3NhdmVkRFMgPSAwOwotc3RhdGljIHVsb25nICAgIFBEQiA9IDAsKnBQREIgPSBOVUxMOwotc3RhdGljIHVpbnQgICAgIFZYRF92ZXJzaW9uID0gLTE7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXVsb25nICAgX0FTTUFQSSBfUE1fZ2V0UERCKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIF9QTV9WeERDYWxsKFZYRF9yZWdzICpyZWdzLHVpbnQgb2ZmLHVpbnQgc2VsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeHRlcm5hbCBmdW5jdGlvbiB0byBjYWxsIHRoZSBQTUhFTFAgaGVscGVyIFZ4RC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX1Z4RENhbGwoCi0gICAgVlhEX3JlZ3MgKnJlZ3MpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotQkNEIGNvZGVkIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBWeEQsIG9yIDAgaWYgbm90IGxvYWRlZCAoaWU6IDB4MjAyIC0gMi4yKQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIFZ4RCB0aGF0IHdlIGhhdmUgY29ubmVjdGVkIHRvLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1IRUxQX2dldFZlcnNpb24odm9pZCkKLXsKLSAgICByZXR1cm4gVlhEX3ZlcnNpb24gPSAwOwotfQotCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICBNVFJSX2luaXQoKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0jaWZuZGVmIFJFQUxNT0RFCi0gICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKLSNlbHNlCi0gICAgcmV0dXJuIFBNX01UUlJfTk9UX1NVUFBPUlRFRDsKLSNlbmRpZgotfQotCi1pYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQoteyByZXR1cm4gZmFsc2U7IH0KLQotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsgcmV0dXJuIF9PU19TTVg7IH0KLQotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17IHJldHVybiBQTV8zODY7IH0KLQotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi12b2lkIE1HTE91dHB1dChjaGFyICopOwotCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotICAgIE1HTE91dHB1dChtc2cpOwotLyogTm8gc3VwcG9ydCBmb3IgZnByaW50ZigpIHVuZGVyIHNteCBjdXJyZW50bHkhICovCi0vKiAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOyAqLwotICAgIGV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEV4aXRWQkVCdWYodm9pZCkKLXsKLSAgICBpZiAoVkVTQUJ1Zl9wdHIpCi0JUE1fZnJlZVJlYWxTZWcoVkVTQUJ1Zl9wdHIpOwotICAgIFZFU0FCdWZfcHRyID0gMDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZikKLXsKLSAgICBpZiAoIVZFU0FCdWZfcHRyKSB7Ci0JLyogQWxsb2NhdGUgYSBnbG9iYWwgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgVkJFICovCi0JaWYgKChWRVNBQnVmX3B0ciA9IFBNX2FsbG9jUmVhbFNlZyhWRVNBQnVmX2xlbiwgJlZFU0FCdWZfcnNlZywgJlZFU0FCdWZfcm9mZikpID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWF0ZXhpdChFeGl0VkJFQnVmKTsKLQl9Ci0gICAgKmxlbiA9IFZFU0FCdWZfbGVuOwotICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOwotICAgIHJldHVybiBWRVNBQnVmX3B0cjsKLX0KLQotaW50IFBNQVBJIFBNX2ludDM4NihpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0KQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBQTV9pbnQzODZ4KGludG5vLGluLG91dCwmc3JlZ3MpOwotfQotCi0vKiBSb3V0aW5lcyB0byBzZXQgYW5kIGdldCB0aGUgcmVhbCBtb2RlIGludGVycnVwdCB2ZWN0b3JzLCBieSBtYWtpbmcKLSAqIGRpcmVjdCByZWFsIG1vZGUgY2FsbHMgdG8gRE9TIGFuZCBieXBhc3NpbmcgdGhlIERPUyBleHRlbmRlcnMgQVBJLgotICogVGhpcyBpcyB0aGUgc2FmZXN0IHdheSB0byBoYW5kbGUgdGhpcywgYXMgc29tZSBzZXJ2ZXJzIHRyeSB0byBiZQotICogc21hcnQgYWJvdXQgY2hhbmdpbmcgcmVhbCBtb2RlIHZlY3RvcnMuCi0gKi8KLQotdm9pZCBQTUFQSSBfUE1fZ2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgUk1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NhdmVEUygpOwotICAgIHJlZ3MuaC5haCA9IDB4MzU7Ci0gICAgcmVncy5oLmFsID0gaW50bm87Ci0gICAgUE1faW50ODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLSAgICAqcmVhbGlzciA9ICgobG9uZylzcmVncy5lcyA8PCAxNikgfCByZWdzLnguYng7Ci19Ci0KLXZvaWQgUE1BUEkgX1BNX3NldFJNdmVjdChpbnQgaW50bm8sIGxvbmcgcmVhbGlzcikKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgUk1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NhdmVEUygpOwotICAgIHJlZ3MuaC5haCA9IDB4MjU7Ci0gICAgcmVncy5oLmFsID0gaW50bm87Ci0gICAgc3JlZ3MuZHMgPSAoaW50KShyZWFsaXNyID4+IDE2KTsKLSAgICByZWdzLnguZHggPSAoaW50KShyZWFsaXNyICYgMHhGRkZGKTsKLSAgICBQTV9pbnQ4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotfQotCi12b2lkIFBNQVBJIF9QTV9hZGRSZWFsTW9kZUJsb2NrKHZvaWQgKm1lbSx1aW50IHRhZykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUk1fQkxPQ0tTOyBpKyspIHsKLQlpZiAocm1CbG9ja3NbaV0ucCA9PSBOVUxMKSB7Ci0JICAgIHJtQmxvY2tzW2ldLnAgPSBtZW07Ci0JICAgIHJtQmxvY2tzW2ldLnRhZyA9IHRhZzsKLQkgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIFBNX2ZhdGFsRXJyb3IoIlRvIG1hbnkgcmVhbCBtb2RlIG1lbW9yeSBibG9jayBhbGxvY2F0aW9ucyEiKTsKLX0KLQotdWludCBQTUFQSSBfUE1fZmluZFJlYWxNb2RlQmxvY2sodm9pZCAqbWVtKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9STV9CTE9DS1M7IGkrKykgewotCWlmIChybUJsb2Nrc1tpXS5wID09IG1lbSkKLQkgICAgcmV0dXJuIHJtQmxvY2tzW2ldLnRhZzsKLQl9Ci0gICAgUE1fZmF0YWxFcnJvcigiQ291bGQgbm90IGZpbmQgcHJpb3IgcmVhbCBtb2RlIG1lbW9yeSBibG9jayBhbGxvY2F0aW9uISIpOwotICAgIHJldHVybiAwOwotfQotCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQoteyByZXR1cm4gJ0MnOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsgcmV0dXJuICJjOlxcIjsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgY2hhciAgICAgICAgKmVudjsKLQotICAgIGlmICgoZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKSkgIT0gTlVMTCkKLQlyZXR1cm4gZW52OwotICAgIHJldHVybiAiYzpcXG51Y2xldXMiOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17IHJldHVybiAiU01YIjsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsgcmV0dXJuICJTTVgiOyB9Ci0KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIGludCAgICAgaGl0OwotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgaGl0ID0gRVZUX3BlZWtOZXh0KCZldnQsRVZUX0tFWURPV04gfCBFVlRfS0VZUkVQRUFUKTsKLSAgICBFVlRfZmx1c2gofihFVlRfS0VZRE9XTiB8IEVWVF9LRVlSRVBFQVQpKTsKLSAgICByZXR1cm4gaGl0OwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgIGV2ZW50X3QgZXZ0OwotCi0gICAgRVZUX2hhbHQoJmV2dCxFVlRfS0VZRE9XTik7Ci0gICByZXR1cm4gRVZUX2FzY2lpQ29kZShldnQubWVzc2FnZSk7Ci19Ci0KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoUE1fSFdORCBod25kVXNlcixpbnQgZGV2aWNlLGludCB4UmVzLGludCB5UmVzLGludCBicHAsaWJvb2wgZnVsbFNjcmVlbikKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgU01YICovCi0gICAgKHZvaWQpaHduZFVzZXI7Ci0gICAgKHZvaWQpZGV2aWNlOwotICAgICh2b2lkKXhSZXM7Ci0gICAgKHZvaWQpeVJlczsKLSAgICAodm9pZClicHA7Ci0gICAgKHZvaWQpZnVsbFNjcmVlbjsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICByZXR1cm4gc2l6ZW9mKERPU19zdGF0ZUJ1Zik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIFJNUkVHUyAgICAgICAgICByZWdzOwotICAgIERPU19zdGF0ZUJ1ZiAgICAqc2IgPSBzdGF0ZUJ1ZjsKLQotICAgIC8qIFNhdmUgdGhlIG9sZCB2aWRlbyBtb2RlIHN0YXRlICovCi0gICAgcmVncy5oLmFoID0gMHgwRjsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICBzYi0+b2xkTW9kZSA9IHJlZ3MuaC5hbCAmIDB4N0Y7Ci0gICAgc2ItPm9sZDUwTGluZXMgPSBmYWxzZTsKLSAgICBpZiAoc2ItPm9sZE1vZGUgPT0gMHgzKSB7Ci0JcmVncy54LmF4ID0gMHgxMTMwOwotCXJlZ3MueC5ieCA9IDA7Ci0JcmVncy54LmR4ID0gMDsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQlzYi0+b2xkNTBMaW5lcyA9IChyZWdzLmguZGwgPT0gNDIgfHwgcmVncy5oLmRsID09IDQ5KTsKLQl9Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKGludCAoX0FTTUFQSVAgc2F2ZVN0YXRlKShpbnQgZmxhZ3MpKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBTTVggKi8KLSAgICAodm9pZClzYXZlU3RhdGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIFJNUkVHUyAgICAgICAgICAgICAgcmVnczsKLSAgICBjb25zdCBET1Nfc3RhdGVCdWYgICpzYiA9IHN0YXRlQnVmOwotCi0gICAgLyogUmV0b3JlIDUwIGxpbmUgbW9kZSBpZiBzZXQgKi8KLSAgICBpZiAoc2ItPm9sZDUwTGluZXMpIHsKLQlyZWdzLnguYXggPSAweDExMTI7Ci0JcmVncy54LmJ4ID0gMDsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQl9Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFNNWCAqLwotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi12b2lkIFBNQVBJIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oaW50IHgsaW50IHkpCi17Ci0gICAgdWNoYXIgKl9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTAseCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUxLHkpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldE9TU2NyZWVuV2lkdGgoaW50IHdpZHRoLGludCBoZWlnaHQpCi17Ci0gICAgdWNoYXIgKl9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NEEsd2lkdGgpOwotICAgIFBNX3NldFdvcmQoX2Jpb3NQdHIrMHg0Qyx3aWR0aCoyKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODQsaGVpZ2h0LTEpOwotICAgIGlmIChoZWlnaHQgPiAyNSkgewotCVBNX3NldFdvcmQoX2Jpb3NQdHIrMHg2MCwweDA2MDcpOwotCVBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NSwweDA4KTsKLQl9Ci0gICAgZWxzZSB7Ci0JUE1fc2V0V29yZChfYmlvc1B0cisweDYwLDB4MEQwRSk7Ci0JUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg1LDB4MDE2KTsKLQl9Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQobG9uZyBzaXplKQotewotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwdHIpCi17Ci0gICAgUE1fZnJlZShwdHIpOwotfQotCi0jZGVmaW5lIEdldFJNVmVjdChpbnRubyxpc3IpICAgICooaXNyKSA9ICgodWxvbmcqKXJtWmVyb1B0cilbaW50bm9dCi0jZGVmaW5lIFNldFJNVmVjdChpbnRubyxpc3IpICAgICgodWxvbmcqKXJtWmVyb1B0cilbaW50bm9dID0gKGlzcikKLQotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKm1hcHBlZEJJT1MsCi0gICAgdWxvbmcgQklPU0xlbikKLXsKLSAgICBzdGF0aWMgaW50ICAgICAgZmlyc3RUaW1lID0gdHJ1ZTsKLSAgICBzdGF0aWMgdWNoYXIgICAgKnJtWmVyb1B0cjsKLSAgICBsb25nICAgICAgICAgICAgQ3VycmVudDEwLEN1cnJlbnQ2RCxDdXJyZW50NDI7Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzOwotCi0gICAgLyogQ3JlYXRlIGEgemVybyBtZW1vcnkgbWFwcGluZyBmb3IgdXMgdG8gdXNlICovCi0gICAgaWYgKGZpcnN0VGltZSkgewotCXJtWmVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4N0ZGRix0cnVlKTsKLQlmaXJzdFRpbWUgPSBmYWxzZTsKLQl9Ci0KLSAgICAvKiBSZW1hcCB0aGUgc2Vjb25kYXJ5IEJJT1MgdG8gMHhDMDAwMCBwaHlzaWNhbCAqLwotICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMEwgfHwgQklPU0xlbiA+IDMyNzY4KSB7Ci0JLyogU01YIGNhbm5vdCB2aXJ0dWFsbHkgcmVtYXAgdGhlIEJJT1MsIHNvIHdlIGNhbiBvbmx5IHdvcmsgaWYgYWxsCi0JICogdGhlIHNlY29uZGFyeSBjb250cm9sbGVycyBhcmUgaWRlbnRpY2FsLCBhbmQgd2UgdGhlbiB1c2UgdGhlCi0JICogQklPUyBvbiB0aGUgZmlyc3QgY29udHJvbGxlciBmb3IgYWxsIHRoZSByZW1haW5pbmcgY29udHJvbGxlcnMuCi0JICoKLQkgKiBGb3IgT1MnZXMgdGhhdCBkbyB2aXJ0dWFsIG1lbW9yeSwgYW5kIHJlbWFwcGluZyBvZiAweEMwMDAwCi0JICogcGh5c2ljYWwgKHBlcmhhcHMgYSBjb3B5IG9uIHdyaXRlIG1hcHBpbmcpIHNob3VsZCBiZSBhbGwgdGhhdAotCSAqIGlzIG5lZWRlZC4KLQkgKi8KLQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgLyogU2F2ZSBjdXJyZW50IGhhbmRsZXJzIG9mIGludCAxMGggYW5kIDZEaCAqLwotICAgIEdldFJNVmVjdCgweDEwLCZDdXJyZW50MTApOwotICAgIEdldFJNVmVjdCgweDZELCZDdXJyZW50NkQpOwotCi0gICAgLyogUE9TVCB0aGUgc2Vjb25kYXJ5IEJJT1MgKi8KLSAgICBHZXRSTVZlY3QoMHg0MiwmQ3VycmVudDQyKTsKLSAgICBTZXRSTVZlY3QoMHgxMCxDdXJyZW50NDIpOyAgLyogUmVzdG9yZSBpbnQgMTBoIHRvIFNURC1CSU9TICovCi0gICAgcmVncy54LmF4ID0gYXhWYWw7Ci0gICAgUE1fY2FsbFJlYWxNb2RlKDB4QzAwMCwweDAwMDMsJnJlZ3MsJnNyZWdzKTsKLQotICAgIC8qIFJlc3RvcmUgY3VycmVudCBoYW5kbGVycyAqLwotICAgIFNldFJNVmVjdCgweDEwLEN1cnJlbnQxMCk7Ci0gICAgU2V0Uk1WZWN0KDB4NkQsQ3VycmVudDZEKTsKLQotICAgIC8qIFNlY29uZCB0aGUgcHJpbWFyeSBCSU9TIG1hcHBpbiAxOjEgZm9yIDB4QzAwMDAgcGh5c2ljYWwgKi8KLSAgICBpZiAoQklPU1BoeXNBZGRyICE9IDB4QzAwMDBMKSB7Ci0JLyogU01YIGRvZXMgbm90IHN1cHBvcnQgdGhpcyAqLwotCSh2b2lkKW1hcHBlZEJJT1M7Ci0JfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICB1bG9uZyAgICAgICAgICAgbWljcm9zZWNvbmRzID0gbWlsbGlzZWNvbmRzICogMTAwMEw7Ci0gICAgTFpUaW1lck9iamVjdCAgIHRtOwotCi0gICAgTFpUaW1lck9uRXh0KCZ0bSk7Ci0gICAgd2hpbGUgKExaVGltZXJMYXBFeHQoJnRtKSA8IG1pY3Jvc2Vjb25kcykKLQk7Ci0gICAgTFpUaW1lck9mZkV4dCgmdG0pOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAodm9pZCloTW9kdWxlOwotfQotCi1pbnQgUE1BUEkgUE1fc2V0SU9QTCgKLSAgICBpbnQgbGV2ZWwpCi17Ci0gICAgcmV0dXJuIGxldmVsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUludGVybmFsIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGZpbmQgZGF0YSB0byB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29udmVydEZpbmREYXRhKAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSwKLSAgICBzdHJ1Y3QgZmluZF90ICpibGspCi17Ci0gICAgdWxvbmcgICBkd1NpemUgPSBmaW5kRGF0YS0+ZHdTaXplOwotCi0gICAgbWVtc2V0KGZpbmREYXRhLDAsZmluZERhdGEtPmR3U2l6ZSk7Ci0gICAgZmluZERhdGEtPmR3U2l6ZSA9IGR3U2l6ZTsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9SRE9OTFkpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1JFQURPTkxZOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX1NVQkRJUikKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfRElSRUNUT1JZOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX0FSQ0gpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0FSQ0hJVkU7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfSElEREVOKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ISURERU47Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfU1lTVEVNKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9TWVNURU07Ci0gICAgZmluZERhdGEtPnNpemVMbyA9IGJsay0+c2l6ZTsKLSAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+bmFtZSxQTV9NQVhfUEFUSCk7Ci0gICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOwotfQotCi0jZGVmaW5lIEZJTkRfTUFTSyAgIChfQV9SRE9OTFkgfCBfQV9BUkNIIHwgX0FfU1VCRElSIHwgX0FfSElEREVOIHwgX0FfU1lTVEVNKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIHN0cnVjdCBmaW5kX3QgKmJsazsKLQotICAgIGlmICgoYmxrID0gUE1fbWFsbG9jKHNpemVvZigqYmxrKSkpID09IE5VTEwpCi0JcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLSAgICBpZiAoX2Rvc19maW5kZmlyc3QoKGNoYXIqKWZpbGVuYW1lLEZJTkRfTUFTSyxibGspID09IDApIHsKLQljb252ZXJ0RmluZERhdGEoZmluZERhdGEsYmxrKTsKLQlyZXR1cm4gYmxrOwotCX0KLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBzdHJ1Y3QgZmluZF90ICpibGsgPSBoYW5kbGU7Ci0KLSAgICBpZiAoX2Rvc19maW5kbmV4dChibGspID09IDApIHsKLQljb252ZXJ0RmluZERhdGEoZmluZERhdGEsYmxrKTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgUE1fZnJlZShoYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICByZWdzLmguZGwgPSAodWNoYXIpKGRyaXZlIC0gJ0EnICsgMSk7Ci0gICAgcmVncy5oLmFoID0gMHgzNjsgICAgICAgICAgICAgICAvKiBHZXQgZGlzayBpbmZvcm1hdGlvbiBzZXJ2aWNlICovCi0gICAgUE1faW50ODYoMHgyMSwmcmVncywmcmVncyk7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCAhPSAweEZGRkY7ICAgICAvKiBBWCA9IDB4RkZGRiBpZiBkaXNrIGlzIGludmFsaWQgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgdWludCBvbGREcml2ZSxtYXhEcml2ZXM7Ci0gICAgX2Rvc19nZXRkcml2ZSgmb2xkRHJpdmUpOwotICAgIF9kb3Nfc2V0ZHJpdmUoZHJpdmUsJm1heERyaXZlcyk7Ci0gICAgZ2V0Y3dkKGRpcixsZW4pOwotICAgIF9kb3Nfc2V0ZHJpdmUob2xkRHJpdmUsJm1heERyaXZlcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotI2lmIGRlZmluZWQoVE5UKSAmJiBkZWZpbmVkKF9NU0NfVkVSKQotICAgIERXT1JEIGF0dHIgPSAwOwotCi0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfUkVBRE9OTFkpCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9SRUFET05MWTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9ISURERU47Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfU1lTVEVNKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfU1lTVEVNOwotICAgIFNldEZpbGVBdHRyaWJ1dGVzKChMUFNUUilmaWxlbmFtZSwgYXR0cik7Ci0jZWxzZQotICAgIHVpbnQgYXR0ciA9IDA7Ci0KLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKLQlhdHRyIHw9IF9BX1JET05MWTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQotCWF0dHIgfD0gX0FfQVJDSDsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCi0JYXR0ciB8PSBfQV9ISURERU47Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfU1lTVEVNKQotCWF0dHIgfD0gX0FfU1lTVEVNOwotICAgIF9kb3Nfc2V0ZmlsZWF0dHIoZmlsZW5hbWUsYXR0cik7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0jaWZkZWYgIF9fR05VQ19fCi0gICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lLFNfSVJVU1IpID09IDA7Ci0jZWxzZQotLypBTTogICByZXR1cm4gbWtkaXIoZmlsZW5hbWUpID09IDA7ICovCi0gICAgcmV0dXJuKGZhbHNlKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLS8qQU06ICAgcmV0dXJuIHJtZGlyKGZpbGVuYW1lKSA9PSAwOyAqLwotICAgIHJldHVybihmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5LiBUaGUgbWVtb3J5Ci1tYXkgYmUgcmVxdWlyZWQgdG8gYmUgYmVsb3cgdGhlIDE2TWVnIGJvdW5kYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgdm9pZCAgICAgICAgICAgICpwOwotICAgIHVpbnQgICAgICAgICAgICByX3NlZyxyX29mZjsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7Ci0KLSAgICAvKiBVbmRlciBET1MgdGhlIG9ubHkgd2F5IHRvIGtub3cgdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGlzIHRvCi0gICAgICogYWxsb2NhdGUgdGhlIG1lbW9yeSBiZWxvdyB0aGUgMU1lZyBib3VuZGFyeSBhcyByZWFsIG1vZGUgbWVtb3J5LgotICAgICAqIFdlIGFsc28gYWxsb2NhdGUgNDA5NSBieXRlcyBtb3JlIG1lbW9yeSB0aGFuIHdlIG5lZWQsIHNvIHdlIGNhbgotICAgICAqIHByb3Blcmx5IHBhZ2UgYWxpZ24gdGhlIHN0YXJ0IG9mIHRoZSBtZW1vcnkgYmxvY2sgZm9yIERNQSBvcGVyYXRpb25zLgotICAgICAqLwotICAgIGlmIChzaXplID4gNDA5NikKLQlyZXR1cm4gTlVMTDsKLSAgICBpZiAoKHAgPSBQTV9hbGxvY1JlYWxTZWcoKHNpemUgKyAweEZGRikgJiB+MHhGRkYsJnJfc2VnLCZyX29mZikpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgKnBoeXNBZGRyID0gKChyX3NlZyA8PCA0KSArIHJfb2ZmICsgMHhGRkYpICYgfjB4RkZGOwotICAgIFBNX2xvY2tEYXRhUGFnZXMocCxzaXplKjIsJmxoKTsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKHZvaWQgKnAsdWludCBzaXplLGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgKHZvaWQpc2l6ZTsKLSAgICBQTV9mcmVlUmVhbFNlZyhwKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEdlbmVyaWMgRFBNSSByb3V0aW5lcyBjb21tb24gdG8gMTYvMzIgYml0IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11bG9uZyBQTUFQSSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIodWxvbmcgcGh5c0FkZHIsdWxvbmcgbGltaXQpCi17Ci0gICAgUE1SRUdTICByOwotICAgIHVsb25nICAgcGh5c09mczsKLQotICAgIGlmIChwaHlzQWRkciA8IDB4MTAwMDAwTCkgewotCS8qIFdlIGNhbid0IG1hcCBtZW1vcnkgYmVsb3cgMU1iLCBidXQgdGhlIGxpbmVhciBhZGRyZXNzIGFyZSBhbHJlYWR5Ci0JICogbWFwcGVkIDE6MSBmb3IgdGhpcyBtZW1vcnkgYW55d2F5IHNvIHdlIGp1c3QgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MuCi0JICovCi0JcmV0dXJuIHBoeXNBZGRyOwotCX0KLQotICAgIC8qIFJvdW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgNEtiIGJvdW5kYXJ5IGFuZCB0aGUgbGltaXQgdG8gYQotICAgICAqIDRLYi0xIGJvdW5kYXJ5IGJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZXMgdG8gRFBNSSBhcyBzb21lIGV4dGVuZGVycwotICAgICAqIHdpbGwgZmFpbCB0aGUgY2FsbHMgdW5sZXNzIHRoaXMgaXMgdGhlIGNhc2UuIElmIHdlIHJvdW5kIHRoZQotICAgICAqIHBoeXNpY2FsIGFkZHJlc3MsIHRoZW4gd2UgYWxzbyBhZGQgYW4gZXh0cmEgb2Zmc2V0IGludG8gdGhlIGFkZHJlc3MKLSAgICAgKiB0aGF0IHdlIHJldHVybi4KLSAgICAgKi8KLSAgICBwaHlzT2ZzID0gcGh5c0FkZHIgJiA0MDk1OwotICAgIHBoeXNBZGRyID0gcGh5c0FkZHIgJiB+NDA5NTsKLSAgICBsaW1pdCA9ICgobGltaXQrcGh5c09mcysxKzQwOTUpICYgfjQwOTUpLTE7Ci0KLSAgICByLnguYXggPSAweDgwMDsgICAgICAgICAgICAgICAgIC8qIERQTUkgbWFwIHBoeXNpY2FsIHRvIGxpbmVhciAgICAgICovCi0gICAgci54LmJ4ID0gcGh5c0FkZHIgPj4gMTY7Ci0gICAgci54LmN4ID0gcGh5c0FkZHIgJiAweEZGRkY7Ci0gICAgci54LnNpID0gbGltaXQgPj4gMTY7Ci0gICAgci54LmRpID0gbGltaXQgJiAweEZGRkY7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgaWYgKHIueC5jZmxhZykKLQlyZXR1cm4gMHhGRkZGRkZGRlVMOwotICAgIHJldHVybiAoKHVsb25nKXIueC5ieCA8PCAxNikgKyByLnguY3ggKyBwaHlzT2ZzOwotfQotCi1pbnQgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCx1bG9uZyBsaW5BZGRyKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDc7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBzZXQgc2VsZWN0b3IgYmFzZSBhZGRyZXNzICAgKi8KLSAgICByLnguYnggPSBzZWw7Ci0gICAgci54LmN4ID0gbGluQWRkciA+PiAxNjsKLSAgICByLnguZHggPSBsaW5BZGRyICYgMHhGRkZGOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXVsb25nIFBNQVBJIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwpCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gNjsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIGdldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgICAqLwotICAgIHIueC5ieCA9IHNlbDsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICByZXR1cm4gKCh1bG9uZylyLnguY3ggPDwgMTYpICsgci54LmR4OwotfQotCi1pbnQgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckxpbWl0KHVzaG9ydCBzZWwsdWxvbmcgbGltaXQpCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gODsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIHNldCBzZWxlY3RvciBsaW1pdCAgICAgICAgICAqLwotICAgIHIueC5ieCA9IHNlbDsKLSAgICByLnguY3ggPSBsaW1pdCA+PiAxNjsKLSAgICByLnguZHggPSBsaW1pdCAmIDB4RkZGRjsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKQotCXJldHVybiAwOwotICAgIHJldHVybiAxOwotfQotCi11aW50IFBNQVBJIERQTUlfY3JlYXRlU2VsZWN0b3IodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCkKLXsKLSAgICB1aW50ICAgIHNlbDsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICAvKiBBbGxvY2F0ZSAxIGRlc2NyaXB0b3IgKi8KLSAgICByLnguYXggPSAwOwotICAgIHIueC5jeCA9IDE7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgaWYgKHIueC5jZmxhZykgcmV0dXJuIDA7Ci0gICAgc2VsID0gci54LmF4OwotCi0gICAgLyogU2V0IHRoZSBkZXNjcmlwdG9yIGFjY2VzcyByaWdodHMgKGZvciBhIDMyIGJpdCBwYWdlIGdyYW51bGFyCi0gICAgICogc2VnbWVudCwgcmluZyAwKS4KLSAgICAgKi8KLSAgICByLnguYXggPSA5OwotICAgIHIueC5ieCA9IHNlbDsKLSAgICByLnguY3ggPSAweDQwOTM7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0KLSAgICAvKiBNYXAgcGh5c2ljYWwgbWVtb3J5IGFuZCBjcmVhdGUgc2VsZWN0b3IgKi8KLSAgICBpZiAoKGJhc2UgPSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCkpID09IDB4RkZGRkZGRkZVTCkKLQlyZXR1cm4gMDsKLSAgICBpZiAoIURQTUlfc2V0U2VsZWN0b3JCYXNlKHNlbCxiYXNlKSkKLQlyZXR1cm4gMDsKLSAgICBpZiAoIURQTUlfc2V0U2VsZWN0b3JMaW1pdChzZWwsbGltaXQpKQotCXJldHVybiAwOwotICAgIHJldHVybiBzZWw7Ci19Ci0KLXZvaWQgUE1BUEkgRFBNSV9mcmVlU2VsZWN0b3IodWludCBzZWwpCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gMTsKLSAgICByLnguYnggPSBzZWw7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci19Ci0KLWludCBQTUFQSSBEUE1JX2xvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDB4NjAwOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgTG9jayBMaW5lYXIgUmVnaW9uICAgICAgKi8KLSAgICByLnguYnggPSAobGluZWFyID4+IDE2KTsgICAgICAgICAgICAvKiBMaW5lYXIgYWRkcmVzcyBpbiBCWDpDWCAgICAgICovCi0gICAgci54LmN4ID0gKGxpbmVhciAmIDB4RkZGRik7Ci0gICAgci54LnNpID0gKGxlbiA+PiAxNik7ICAgICAgICAgICAgICAgLyogTGVuZ3RoIGluIFNJOkRJICAgICAgICAgICAgICAqLwotICAgIHIueC5kaSA9IChsZW4gJiAweEZGRkYpOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIHJldHVybiAoIXIueC5jZmxhZyk7Ci19Ci0KLWludCBQTUFQSSBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gMHg2MDE7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBVbmxvY2sgTGluZWFyIFJlZ2lvbiAgICAqLwotICAgIHIueC5ieCA9IChsaW5lYXIgPj4gMTYpOyAgICAgICAgICAgIC8qIExpbmVhciBhZGRyZXNzIGluIEJYOkNYICAgICAgKi8KLSAgICByLnguY3ggPSAobGluZWFyICYgMHhGRkZGKTsKLSAgICByLnguc2kgPSAobGVuID4+IDE2KTsgICAgICAgICAgICAgICAvKiBMZW5ndGggaW4gU0k6REkgICAgICAgICAgICAgICovCi0gICAgci54LmRpID0gKGxlbiAmIDB4RkZGRik7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgcmV0dXJuICghci54LmNmbGFnKTsKLX0KLQotdm9pZCAqIFBNQVBJIERQTUlfbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICB1bG9uZyAgIGxpbkFkZHI7Ci0gICAgdWxvbmcgICBEU0Jhc2VBZGRyOwotCi0gICAgLyogR2V0IHRoZSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBkZWZhdWx0IERTIHNlbGVjdG9yICovCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIERTQmFzZUFkZHIgPSBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5kcyk7Ci0gICAgaWYgKChiYXNlIDwgMHgxMDAwMDApICYmIChEU0Jhc2VBZGRyID09IDApKSB7Ci0JLyogRFMgaXMgemVybyBiYXNlZCwgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyB0aGUgZmlyc3QgMU1iIG9mCi0JICogc3lzdGVtIG1lbW9yeSAobGlrZSB1bmRlciBET1M0R1cpLgotCSAqLwotCXJldHVybiAodm9pZCopYmFzZTsKLQl9Ci0KLSAgICAvKiBNYXAgdGhlIG1lbW9yeSB0byBhIGxpbmVhciBhZGRyZXNzIHVzaW5nIERQTUkgZnVuY3Rpb24gMHg4MDAgKi8KLSAgICBpZiAoKGxpbkFkZHIgPSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCkpID09IDApIHsKLQlpZiAoYmFzZSA+PSAweDEwMDAwMCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JLyogSWYgdGhlIGxpbmVhciBhZGRyZXNzIG1hcHBpbmcgZmFpbHMgYnV0IHdlIGFyZSB0cnlpbmcgdG8KLQkgKiBtYXAgYW4gYXJlYSBpbiB0aGUgZmlyc3QgMU1iIG9mIHN5c3RlbSBtZW1vcnksIHRoZW4gd2UgbXVzdAotCSAqIGJlIHJ1bm5pbmcgdW5kZXIgYSBXaW5kb3dzIG9yIE9TLzIgRE9TIGJveC4gVW5kZXIgdGhlc2UKLQkgKiBlbnZpcm9ubWVudHMgd2UgY2FuIHVzZSB0aGUgc2VnbWVudCB3cmFwIGFyb3VuZCBhcyBhIGZhbGxiYWNrCi0JICogbWVhc3VyZSwgYXMgdGhpcyBkb2VzIHdvcmsgcHJvcGVybHkuCi0JICovCi0JbGluQWRkciA9IGJhc2U7Ci0JfQotCi0gICAgLyogTm93IGV4cGFuZCB0aGUgZGVmYXVsdCBEUyBzZWxlY3RvciB0byA0R2Igc28gd2UgY2FuIGFjY2VzcyBpdCAqLwotICAgIGlmICghRFBNSV9zZXRTZWxlY3RvckxpbWl0KHNyZWdzLmRzLDB4RkZGRkZGRkZVTCkpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBGaW5hbGx5IGVuYWJsZSBjYWNoaW5nIGZvciB0aGUgcGFnZSB0YWJsZXMgdGhhdCB3ZSBqdXN0IG1hcHBlZCBpbiwKLSAgICAgKiBzaW5jZSBET1M0R1cgYW5kIFBNT0RFL1cgY3JlYXRlIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgd2l0aG91dAotICAgICAqIGNhY2hpbmcgZW5hYmxlZCB3aGljaCBodXJ0cyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGxpbmVhciBmcmFtZWJ1ZmZlcgotICAgICAqIGFzIGl0IGRpc2FibGVzIHdyaXRlIGNvbWJpbmluZyBvbiBQZW50aXVtIFBybyBhbmQgYWJvdmUgcHJvY2Vzc29ycy4KLSAgICAgKgotICAgICAqIEZvciB0aG9zZSBwcm9jZXNzb3JzIGNhY2hlIGRpc2FibGluZyBpcyBiZXR0ZXIgaGFuZGxlZCB0aHJvdWdoIHRoZQotICAgICAqIE1UUlIgcmVnaXN0ZXJzIGFueXdheSAod2UgY2FuIHdyaXRlIGNvbWJpbmUgYSByZWdpb24gYnV0IGRpc2FibGUKLSAgICAgKiBjYWNoaW5nKSBzbyB0aGF0IE1NSU8gcmVnaXN0ZXIgcmVnaW9ucyBkbyBub3Qgc2NyZXcgdXAuCi0gICAgICovCi0gICAgaWYgKGlzQ2FjaGVkKSB7Ci0JaWYgKChQREIgPSBfUE1fZ2V0UERCKCkpICE9IDAgJiYgRFNCYXNlQWRkciA9PSAwKSB7Ci0JICAgIGludCAgICAgc3RhcnRQREIsZW5kUERCLGlQREIsc3RhcnRQYWdlLGVuZFBhZ2Usc3RhcnQsZW5kLGlQYWdlOwotCSAgICB1bG9uZyAgIHBhZ2VUYWJsZSwqcFBhZ2VUYWJsZTsKLQkgICAgaWYgKCFwUERCKSB7Ci0JCWlmIChQREIgPj0gMHgxMDAwMDApCi0JCSAgICBwUERCID0gKHVsb25nKilEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoUERCLDB4RkZGKTsKLQkJZWxzZQotCQkgICAgcFBEQiA9ICh1bG9uZyopUERCOwotCQl9Ci0JICAgIGlmIChwUERCKSB7Ci0JCXN0YXJ0UERCID0gKGxpbkFkZHIgPj4gMjIpICYgMHgzRkY7Ci0JCXN0YXJ0UGFnZSA9IChsaW5BZGRyID4+IDEyKSAmIDB4M0ZGOwotCQllbmRQREIgPSAoKGxpbkFkZHIrbGltaXQpID4+IDIyKSAmIDB4M0ZGOwotCQllbmRQYWdlID0gKChsaW5BZGRyK2xpbWl0KSA+PiAxMikgJiAweDNGRjsKLQkJZm9yIChpUERCID0gc3RhcnRQREI7IGlQREIgPD0gZW5kUERCOyBpUERCKyspIHsKLQkJICAgIHBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7Ci0JCSAgICBpZiAocGFnZVRhYmxlID49IDB4MTAwMDAwKQotCQkJcFBhZ2VUYWJsZSA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRik7Ci0JCSAgICBlbHNlCi0JCQlwUGFnZVRhYmxlID0gKHVsb25nKilwYWdlVGFibGU7Ci0JCSAgICBzdGFydCA9IChpUERCID09IHN0YXJ0UERCKSA/IHN0YXJ0UGFnZSA6IDA7Ci0JCSAgICBlbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOwotCQkgICAgZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspCi0JCQlwUGFnZVRhYmxlW2lQYWdlXSAmPSB+MHgxODsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgLyogTm93IHJldHVybiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgaW50byB0aGUgZGVmYXVsdCBEUyAqLwotICAgIHJldHVybiAodm9pZCopKGxpbkFkZHIgLSBEU0Jhc2VBZGRyKTsKLX0KLQotLyogU29tZSBET1MgZXh0ZW5kZXIgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGNhbGxpbmcgYQotICogcmVhbCBtb2RlIHByb2NlZHVyZSBmcm9tIHByb3RlY3RlZCBtb2RlLiBIb3dldmVyIHdlIGNhbiBzaW11bGF0ZSB3aGF0Ci0gKiB3ZSBuZWVkIHRlbXBvcmFyaWx5IGhvb2tpbmcgdGhlIElOVCA2QWggdmVjdG9yIHdpdGggYSBzbWFsbCByZWFsIG1vZGUKLSAqIHN0dWIgdGhhdCB3aWxsIGNhbGwgb3VyIHJlYWwgbW9kZSBjb2RlIGZvciB1cy4KLSAqLwotCi1zdGF0aWMgdWNoYXIgaW50NkFIYW5kbGVyW10gPSB7Ci0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgIC8qICBfX1BNT0RFX2NhbGxSZWFsIHZhcmlhYmxlICAgICAgICAgICAqLwotICAgIDB4RkIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgc3RpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgLyogIGNhbGwgICAgW2NzOl9fUE1PREVfY2FsbFJlYWxdICAgICAgICovCi0gICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgIC8qICBpcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci1zdGF0aWMgdWNoYXIgKmNyUHRyID0gTlVMTDsgLyogUG9pbnRlciB0byBvZiBpbnQgNkEgaGFuZGxlciAgICAgICAgICovCi1zdGF0aWMgdWludCBjclJTZWcsY3JST2ZmOyAgLyogUmVhbCBtb2RlIHNlZzpvZmZzZXQgb2YgaGFuZGxlciAgICAgICovCi0KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIHVjaGFyICAgKnA7Ci0gICAgdWludCAgICBvbGRTZWcsb2xkT2ZmOwotCi0gICAgaWYgKCFjclB0cikgewotCS8qIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBtZW1vcnkgYmxvY2sgb25seSBvbmNlICovCi0JY3JQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGludDZBSGFuZGxlciksICZjclJTZWcsICZjclJPZmYpOwotCW1lbWNweShjclB0cixpbnQ2QUhhbmRsZXIsc2l6ZW9mKGludDZBSGFuZGxlcikpOwotCX0KLSAgICBQTV9zZXRXb3JkKGNyUHRyLG9mZik7ICAgICAgICAgICAgICAvKiBQbHVnIGluIGFkZHJlc3MgdG8gY2FsbCAgKi8KLSAgICBQTV9zZXRXb3JkKGNyUHRyKzIsc2VnKTsKLSAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoMCwweDZBICogNCk7Ci0gICAgb2xkT2ZmID0gUE1fZ2V0V29yZChwKTsgICAgICAgICAgICAgLyogU2F2ZSBvbGQgaGFuZGxlciBhZGRyZXNzICovCi0gICAgb2xkU2VnID0gUE1fZ2V0V29yZChwKzIpOwotICAgIFBNX3NldFdvcmQocCxjclJPZmYrNCk7ICAgICAgICAgICAgIC8qIEhvb2sgNkEgaGFuZGxlciAgICAgICAgICAqLwotICAgIFBNX3NldFdvcmQocCsyLGNyUlNlZyk7Ci0gICAgUE1faW50ODZ4KDB4NkEsIGluLCBpbiwgc3JlZ3MpOyAgICAgLyogQ2FsbCByZWFsIG1vZGUgY29kZSAgICAgICovCi0gICAgUE1fc2V0V29yZChwLG9sZE9mZik7ICAgICAgICAgICAgICAgLyogUmVzdG9yZSBvbGQgaGFuZGxlciAgICAgICovCi0gICAgUE1fc2V0V29yZChwKzIsb2xkU2VnKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17IHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHg0MDAsMHhGRkZGLHRydWUpOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17IHJldHVybiBEUE1JX21hcFBoeXNpY2FsQWRkcihiYXNlLGxpbWl0LGlzQ2FjaGVkKTsgfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotICAgIC8qIE1hcHBpbmcgY2Fubm90IGJlIGZyZWUgKi8KLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciAqLwotICAgIC8qICAgICAgIGFkZHJlc3MuICovCi0gICAgKHZvaWQpcDsKLSAgICByZXR1cm4gMHhGRkZGRkZGRlVMOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKHZvaWQgKmJhc2UsdWxvbmcgbGltaXQpCi17Ci0gICAgKHZvaWQpbGltaXQ7Ci0gICAgcmV0dXJuICh2b2lkKiliYXNlOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQotewotICAgIHN0YXRpYyB1Y2hhciAqemVyb1B0ciA9IE5VTEw7Ci0KLSAgICBpZiAoIXplcm9QdHIpCi0JemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkYsdHJ1ZSk7Ci0gICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIE1LX1BIWVMocl9zZWcscl9vZmYpKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17Ci0gICAgUE1SRUdTICAgICAgcjsKLSAgICB2b2lkICAgICAgICAqcDsKLQotICAgIHIueC5heCA9IDB4MTAwOyAgICAgICAgICAgICAgICAgLyogRFBNSSBhbGxvY2F0ZSBET1MgbWVtb3J5ICAgICAgICAgKi8KLSAgICByLnguYnggPSAoc2l6ZSArIDB4RikgPj4gNDsgICAgIC8qIG51bWJlciBvZiBwYXJhZ3JhcGhzICAgICAgICAgICAgICovCi0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgaWYgKHIueC5jZmxhZykKLQlyZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogRFBNSSBjYWxsIGZhaWxlZCAgICAgICAgICAgICAgICAgKi8KLSAgICAqcl9zZWcgPSByLnguYXg7ICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50ICAgICAgICAgICAgICAgICovCi0gICAgKnJfb2ZmID0gMDsKLSAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoKnJfc2VnLCpyX29mZik7Ci0gICAgX1BNX2FkZFJlYWxNb2RlQmxvY2socCxyLnguZHgpOwotICAgIHJldHVybiBwOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSAweDEwMTsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIGZyZWUgRE9TIG1lbW9yeSAgICAgICAgICovCi0gICAgci54LmR4ID0gX1BNX2ZpbmRSZWFsTW9kZUJsb2NrKG1lbSk7LyogRFggOj0gc2VsZWN0b3IgZnJvbSAweDEwMCAgICAqLwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotfQotCi1zdGF0aWMgRFBNSV9oYW5kbGVyX3QgICBEUE1JX2ludDEwID0gTlVMTDsKLQotdm9pZCBQTUFQSSBEUE1JX3NldEludDEwSGFuZGxlcihEUE1JX2hhbmRsZXJfdCBoYW5kbGVyKQotewotICAgIERQTUlfaW50MTAgPSBoYW5kbGVyOwotfQotCi12b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgUE1SRUdTICAgICAgcjsKLSAgICBQTVNSRUdTICAgICBzcjsKLQotICAgIGlmIChpbnRubyA9PSAweDEwICYmIERQTUlfaW50MTApIHsKLQlpZiAoRFBNSV9pbnQxMChyZWdzKSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICBQTV9zZWdyZWFkKCZzcik7Ci0gICAgci54LmF4ID0gMHgzMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGlzc3VlIHJlYWwgaW50ZXJydXB0ICAgICovCi0gICAgci5oLmJsID0gaW50bm87Ci0gICAgci5oLmJoID0gMDsKLSAgICByLnguY3ggPSAwOwotICAgIHNyLmVzID0gc3IuZHM7Ci0gICAgci5lLmVkaSA9ICh1aW50KXJlZ3M7Ci0gICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICAgICAgICAgICovCi19Ci0KLSNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZwotI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZwotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0KLS8qIFRoZXNlIHJlYWwgbW9kZSBpbnRzIG1heSBjYXVzZSBjcmFzaGVzLiAqLwotLypBTTogICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOyAgICAgIC8jIyMqIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KLQotICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOwotICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKLQotLypBTTogICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOyAgICAgIC8jIyMqIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KLQotICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgc3JlZ3MtPmVzID0gcm1yZWdzLmVzOwotICAgIHNyZWdzLT5jcyA9IHJtcmVncy5jczsKLSAgICBzcmVncy0+c3MgPSBybXJlZ3Muc3M7Ci0gICAgc3JlZ3MtPmRzID0gcm1yZWdzLmRzOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi0jcHJhZ21hIHBhY2soMSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVpbnQgICAgTGFyZ2VzdEJsb2NrQXZhaWw7Ci0JdWludCAgICBNYXhVbmxvY2tlZFBhZ2U7Ci0JdWludCAgICBMYXJnZXN0TG9ja2FibGVQYWdlOwotCXVpbnQgICAgTGluQWRkclNwYWNlOwotCXVpbnQgICAgTnVtRnJlZVBhZ2VzQXZhaWw7Ci0JdWludCAgICBOdW1QaHlzaWNhbFBhZ2VzRnJlZTsKLQl1aW50ICAgIFRvdGFsUGh5c2ljYWxQYWdlczsKLQl1aW50ICAgIEZyZWVMaW5BZGRyU3BhY2U7Ci0JdWludCAgICBTaXplT2ZQYWdlRmlsZTsKLQl1aW50ICAgIHJlc1szXTsKLQl9IE1lbUluZm87Ci0KLSNwcmFnbWEgcGFjaygpCi0KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCi17Ci0gICAgUE1SRUdTICByOwotICAgIFBNU1JFR1Mgc3I7Ci0gICAgTWVtSW5mbyBtZW1JbmZvOwotCi0gICAgUE1fc2VncmVhZCgmc3IpOwotICAgIHIueC5heCA9IDB4NTAwOyAgICAgICAgICAgICAgICAgLyogRFBNSSBnZXQgZnJlZSBtZW1vcnkgaW5mbyAqLwotICAgIHNyLmVzID0gc3IuZHM7Ci0gICAgci5lLmVkaSA9ICh1aW50KSZtZW1JbmZvOwotICAgIFBNX2ludDM4NngoMHgzMSwgJnIsICZyLCAmc3IpOyAgLyogSXNzdWUgdGhlIGludGVycnVwdCAqLwotICAgICpwaHlzaWNhbCA9IG1lbUluZm8uTnVtUGh5c2ljYWxQYWdlc0ZyZWUgKiA0MDk2OwotICAgICp0b3RhbCA9IG1lbUluZm8uTGFyZ2VzdEJsb2NrQXZhaWw7Ci0gICAgaWYgKCp0b3RhbCA8ICpwaHlzaWNhbCkKLQkqcGh5c2ljYWwgPSAqdG90YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3Btc214LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvcG1zbXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlMzFiYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvcG1zbXguYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgU01YIGVtYmVkZGVkIHN5c3RlbXMgZGV2ZWxvcG1lbnQKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZG9zLmg+Ci0jaW5jbHVkZSAic214L3BzMm1vdXNlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgIGdsb2JhbERhdGFTdGFydDsKLQotUE1fY3JpdGljYWxIYW5kbGVyICBfVkFSQVBJIF9QTV9jcml0SGFuZGxlciA9IE5VTEw7Ci1QTV9icmVha0hhbmRsZXIgICAgIF9WQVJBUEkgX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX3RpbWVySGFuZGxlciA9IE5VTEw7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV9rZXlIYW5kbGVyID0gTlVMTDsKLVBNX2tleTE1SGFuZGxlciAgICAgX1ZBUkFQSSBfUE1fa2V5MTVIYW5kbGVyID0gTlVMTDsKLVBNX21vdXNlSGFuZGxlciAgICAgX1ZBUkFQSSBfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLVBNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1faW50MTBIYW5kbGVyID0gTlVMTDsKLWludCAgICAgICAgICAgICAgICAgX1ZBUkFQSSBfUE1fbW91c2VNYXNrOwotCi11Y2hhciAqICAgICBfVkFSQVBJIF9QTV9jdHJsQ1B0cjsgICAgICAgICAgICAgICAvKiBMb2NhdGlvbiBvZiBDdHJsLUMgZmxhZyAgICAgICovCi11Y2hhciAqICAgICBfVkFSQVBJIF9QTV9jdHJsQlB0cjsgICAgICAgICAgICAgICAvKiBMb2NhdGlvbiBvZiBDdHJsLUJyZWFrIGZsYWcgICovCi11Y2hhciAqICAgICBfVkFSQVBJIF9QTV9jcml0UHRyOyAgICAgICAgICAgICAgICAvKiBMb2NhdGlvbiBvZiBDcml0aWNhbCBlcnJvciBCZiovCi1QTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2VGltZXIgPSBQTU5VTEw7ICAgICAvKiBQcmV2aW91cyB0aW1lciBoYW5kbGVyICAgICAgICovCi1QTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2UlRDID0gUE1OVUxMOyAgICAgICAvKiBQcmV2aW91cyBSVEMgaGFuZGxlciAgICAgICAgICovCi1QTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2S2V5ID0gUE1OVUxMOyAgICAgICAvKiBQcmV2aW91cyBrZXkgaGFuZGxlciAgICAgICAgICovCi1QTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2S2V5MTUgPSBQTU5VTEw7ICAgICAvKiBQcmV2aW91cyBrZXkxNSBoYW5kbGVyICAgICAgICovCi1QTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2QnJlYWsgPSBQTU5VTEw7ICAgICAvKiBQcmV2aW91cyBicmVhayBoYW5kbGVyICAgICAgICovCi1QTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2Q3RybEMgPSBQTU5VTEw7ICAgICAvKiBQcmV2aW91cyBDdHJsQyBoYW5kbGVyICAgICAgICovCi1QTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2Q3JpdGljYWwgPSBQTU5VTEw7ICAvKiBQcmV2aW91cyBjcml0aWNhbCBoYW5kbGVyICAgICovCi1sb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbFRpbWVyOyAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgdGltZXIgICAgICovCi1sb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbFJUQzsgICAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgUlRDICAgICAgICovCi1sb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbEtleTsgICAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUga2V5ICAgICAgICovCi1sb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbEtleTE1OyAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUga2V5MTUgICAgICovCi1sb25nICAgICAgICBfVkFSQVBJIF9QTV9wcmV2UmVhbEludDEwOyAgICAgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgaW50IDEwaCAgICovCi1zdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQTsgICAgICAgICAgICAvKiBDTU9TIHJlZ2lzdGVyIEEgY29udGVudHMgICAgICovCi1zdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQjsgICAgICAgICAgICAvKiBDTU9TIHJlZ2lzdGVyIEIgY29udGVudHMgICAgICovCi1zdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRSVENQSUMyOyAgICAgICAgICAgICAvKiBNYXNrIHZhbHVlIGZvciBSVEMgSVJROCAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdsb2JhbHMgZm9yIGxvY2tpbmcgaW50ZXJydXB0IGhhbmRsZXJzIGluIF9wbXNteC5hc20gKi8KLQotZXh0ZXJuIGludCAgX0FTTUFQSSBfUE1fcG1zbXhEYXRhU3RhcnQ7Ci1leHRlcm4gaW50ICBfQVNNQVBJIF9QTV9wbXNteERhdGFFbmQ7Ci12b2lkIF9BU01BUEkgX1BNX3Btc214Q29kZVN0YXJ0KHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9wbXNteENvZGVFbmQodm9pZCk7Ci0KLS8qIFByb3RlY3RlZCBtb2RlIGludGVycnVwdCBoYW5kbGVycywgYWxzbyBjYWxsZWQgYnkgUE0gY2FsbGJhY2tzIGJlbG93ICovCi0KLXZvaWQgX0FTTUFQSSBfUE1fdGltZXJJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX3J0Y0lTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fa2V5SVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9rZXkxNUlTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fYnJlYWtJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2N0cmxDSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9jcml0aWNhbElTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fbW91c2VJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2ludDEwUE1DQih2b2lkKTsKLQotLyogUHJvdGVjdGVkIG1vZGUgRFBNSSBjYWxsYmFjayBoYW5kbGVycyAqLwotCi12b2lkIF9BU01BUEkgX1BNX21vdXNlUE1DQih2b2lkKTsKLQotLyogUm91dGluZSB0byBpbnN0YWxsIGEgbW91c2UgaGFuZGxlciBmdW5jdGlvbiAqLwotCi12b2lkIF9BU01BUEkgX1BNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzayk7Ci0KLS8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgRFBNSSByZWFsIG1vZGUgY2FsbGJhY2sgcm91dGluZXMgKi8KLQotdm9pZCBfQVNNQVBJIF9EUE1JX2FsbG9jYXRlQ2FsbGJhY2sodm9pZCAoX0FTTUFQSSAqcG1jb2RlKSgpLHZvaWQgKnJtcmVncyxsb25nICpSTUNCKTsKLXZvaWQgX0FTTUFQSSBfRFBNSV9mcmVlQ2FsbGJhY2sobG9uZyBSTUNCKTsKLQotLyogRFBNSSBoZWxwZXIgZnVuY3Rpb25zIGluIFBNTElURS5DICovCi0KLXVsb25nICAgUE1BUEkgRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHVsb25nIHBoeXNBZGRyLHVsb25nIGxpbWl0KTsKLWludCAgICAgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCx1bG9uZyBsaW5BZGRyKTsKLXVsb25nICAgUE1BUEkgRFBNSV9nZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCk7Ci1pbnQgICAgIFBNQVBJIERQTUlfc2V0U2VsZWN0b3JMaW1pdCh1c2hvcnQgc2VsLHVsb25nIGxpbWl0KTsKLXVpbnQgICAgUE1BUEkgRFBNSV9jcmVhdGVTZWxlY3Rvcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0KTsKLXZvaWQgICAgUE1BUEkgRFBNSV9mcmVlU2VsZWN0b3IodWludCBzZWwpOwotaW50ICAgICBQTUFQSSBEUE1JX2xvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKTsKLWludCAgICAgUE1BUEkgRFBNSV91bmxvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKTsKLQotLyogRnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIENNT1MgcmVnaXN0ZXJzICovCi0KLXVjaGFyICAgUE1BUEkgX1BNX3JlYWRDTU9TKGludCBpbmRleCk7Ci12b2lkICAgIFBNQVBJIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEdlbmVyaWMgcm91dGluZXMgY29tbW9uIHRvIGFsbCBlbnZpcm9ubWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIFBNQVBJIFBNX3Jlc2V0TW91c2VEcml2ZXIoaW50IGhhcmRSZXNldCkKLXsKLSAgICBwczJNb3VzZVJlc2V0KCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShpbnQgZnJlcXVlbmN5KQotewotICAgIHN0YXRpYyBzaG9ydCBjb252ZXJ0W10gPSB7Ci0JODE5MiwKLQk0MDk2LAotCTIwNDgsCi0JMTAyNCwKLQk1MTIsCi0JMjU2LAotCTEyOCwKLQk2NCwKLQkzMiwKLQkxNiwKLQk4LAotCTQsCi0JMiwKLQktMSwKLQl9OwotICAgIGludCBpOwotCi0gICAgLyogRmlyc3QgY2xlYXIgYW55IHBlbmRpbmcgUlRDIHRpbWVvdXQgaWYgbm90IGNsZWFyZWQgKi8KLSAgICBfUE1fcmVhZENNT1MoMHgwQyk7Ci0gICAgaWYgKGZyZXF1ZW5jeSA9PSAwKSB7Ci0JLyogRGlzYWJsZSBSVEMgdGltb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpOwotCX0KLSAgICBlbHNlIHsKLQkvKiBDb252ZXJ0IGZyZXF1ZW5jeSB2YWx1ZSB0byBSVEMgY2xvY2sgaW5kZXhlcyAqLwotCWZvciAoaSA9IDA7IGNvbnZlcnRbaV0gIT0gLTE7IGkrKykgewotCSAgICBpZiAoY29udmVydFtpXSA9PSBmcmVxdWVuY3kpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkvKiBTZXQgUlRDIHRpbW91dCB2YWx1ZSBhbmQgZW5hYmxlIHRpbWVvdXQgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsKF9QTV9vbGRDTU9TUmVnQSAmIDB4RjApIHwgKGkrMykpOwotCV9QTV93cml0ZUNNT1MoMHgwQiwoX1BNX29sZENNT1NSZWdCICYgMHgwRikgfCAweDQwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIFBNQVBJIGxvY2tQTUhhbmRsZXJzKHZvaWQpCi17Ci0gICAgc3RhdGljIGludCAgICAgIGxvY2tlZCA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgIHN0YXQgPSAwOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKLQotICAgIC8qIExvY2sgYWxsIG9mIHRoZSBjb2RlIGFuZCBkYXRhIHVzZWQgYnkgb3VyIHByb3RlY3RlZCBtb2RlIGludGVycnVwdAotICAgICAqIGhhbmRsaW5nIHJvdXRpbmVzLCBzbyB0aGF0IGl0IHdpbGwgY29udGludWUgdG8gd29yayBjb3JyZWN0bHkKLSAgICAgKiB1bmRlciByZWFsIG1vZGUuCi0gICAgICovCi0gICAgaWYgKCFsb2NrZWQpIHsKLQlQTV9zYXZlRFMoKTsKLQlzdGF0ICA9ICFQTV9sb2NrRGF0YVBhZ2VzKCZnbG9iYWxEYXRhU3RhcnQtMjA0OCw0MDk2LCZsaCk7Ci0Jc3RhdCB8PSAhUE1fbG9ja0RhdGFQYWdlcygmX1BNX3Btc214RGF0YVN0YXJ0LChpbnQpJl9QTV9wbXNteERhdGFFbmQgLSAoaW50KSZfUE1fcG1zbXhEYXRhU3RhcnQsJmxoKTsKLQlzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX1BNX3Btc214Q29kZVN0YXJ0LChpbnQpX1BNX3Btc214Q29kZUVuZC0oaW50KV9QTV9wbXNteENvZGVTdGFydCwmbGgpOwotCWlmIChzdGF0KSB7Ci0JICAgIHByaW50ZigiUGFnZSBsb2NraW5nIHNlcnZpY2VzIGZhaWxlZCAtIGludGVycnVwdCBoYW5kbGluZyBub3Qgc2FmZSFcbiIpOwotCSAgICBleGl0KDEpOwotCSAgICB9Ci0JbG9ja2VkID0gMTsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDIwNDsKLSAgICByZWdzLmguYmwgPSBpbnRubzsKLSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci0gICAgaXNyLT5zZWwgPSByZWdzLnguY3g7Ci0gICAgaXNyLT5vZmYgPSByZWdzLmUuZWR4OwotfQotCi12b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgcmVncy54LmF4ID0gMHgyMDU7ICAgICAgICAgIC8qIFNldCBwcm90ZWN0ZWQgbW9kZSB2ZWN0b3IgICAgICAgICovCi0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5jeCA9IHNyZWdzLmNzOwotICAgIHJlZ3MuZS5lZHggPSAodWludClpc3I7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyMDU7Ci0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgcmVncy54LmN4ID0gaXNyLnNlbDsKLSAgICByZWdzLmUuZWR4ID0gaXNyLm9mZjsKLSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci19Ci0KLXN0YXRpYyBsb25nIHByZXZSZWFsQnJlYWs7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGJyZWFrIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbEN0cmxDOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBDdHJsQyBoYW5kbGVyICAgICAqLwotc3RhdGljIGxvbmcgcHJldlJlYWxDcml0aWNhbDsgICAvKiBQcmV2IHJlYWwgbW9kZSBjcml0aWNhbCBoYW5kbGVyICAgICAgKi8KLQotaW50IFBNQVBJIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQotewotICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLwotCi0gICAgX1BNX21vdXNlSGFuZGxlciA9IG1oOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikKLQlfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgZ2V0SVNSKGludCBpbnRubywgUE1GQVJQVFIgKnBtaXNyLCBsb25nICpyZWFsaXNyKQotewotICAgIFBNX2dldFBNdmVjdChpbnRubyxwbWlzcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3RvcmVJU1IoaW50IGludG5vLCBQTUZBUlBUUiBwbWlzciwgbG9uZyByZWFsaXNyKQotewotICAgIFBNX3Jlc3RvcmVQTXZlY3QoaW50bm8scG1pc3IpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRJU1IoaW50IGludG5vLCB2b2lkICgqIFBNQVBJIHBtaXNyKSgpKQotewotICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLwotICAgIFBNX3NldFBNdmVjdChpbnRubyxwbWlzcik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0VGltZXJIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgpCi17Ci0gICAgZ2V0SVNSKFBNX0lSUTAsICZfUE1fcHJldlRpbWVyLCAmX1BNX3ByZXZSZWFsVGltZXIpOwotICAgIF9QTV90aW1lckhhbmRsZXIgPSB0aDsKLSAgICBzZXRJU1IoUE1fSVJRMCwgX1BNX3RpbWVySVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV90aW1lckhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKFBNX0lSUTAsIF9QTV9wcmV2VGltZXIsIF9QTV9wcmV2UmVhbFRpbWVyKTsKLQlfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgsaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCi0gICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOwotICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKLQotICAgIC8qIFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyICovCi0gICAgZ2V0SVNSKDB4NzAsICZfUE1fcHJldlJUQywgJl9QTV9wcmV2UmVhbFJUQyk7Ci0gICAgX1BNX3J0Y0hhbmRsZXIgPSB0aDsKLSAgICBzZXRJU1IoMHg3MCwgX1BNX3J0Y0lTUik7Ci0KLSAgICAvKiBQcm9ncmFtIHRoZSByZWFsIHRpbWUgY2xvY2sgZGVmYXVsdCBmcmVxdWVuY3kgKi8KLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGZyZXF1ZW5jeSk7Ci0KLSAgICAvKiBVbm1hc2sgSVJROCBpbiB0aGUgUElDMiAqLwotICAgIF9QTV9vbGRSVENQSUMyID0gUE1faW5wYigweEExKTsKLSAgICBQTV9vdXRwYigweEExLF9QTV9vbGRSVENQSUMyICYgMHhGRSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9ydGNIYW5kbGVyKSB7Ci0JLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCKTsKLQlQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpOwotCi0JLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotCXJlc3RvcmVJU1IoMHg3MCwgX1BNX3ByZXZSVEMsIF9QTV9wcmV2UmVhbFJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIga2gpCi17Ci0gICAgZ2V0SVNSKFBNX0lSUTEsICZfUE1fcHJldktleSwgJl9QTV9wcmV2UmVhbEtleSk7Ci0gICAgX1BNX2tleUhhbmRsZXIgPSBraDsKLSAgICBzZXRJU1IoUE1fSVJRMSwgX1BNX2tleUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleUhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKFBNX0lSUTEsIF9QTV9wcmV2S2V5LCBfUE1fcHJldlJlYWxLZXkpOwotCV9QTV9rZXlIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0S2V5MTVIYW5kbGVyKFBNX2tleTE1SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHgxNSwgJl9QTV9wcmV2S2V5MTUsICZfUE1fcHJldlJlYWxLZXkxNSk7Ci0gICAgX1BNX2tleTE1SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDE1LCBfUE1fa2V5MTVJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleTE1SGFuZGxlcikgewotCXJlc3RvcmVJU1IoMHgxNSwgX1BNX3ByZXZLZXkxNSwgX1BNX3ByZXZSZWFsS2V5MTUpOwotCV9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotLyogUmVhbCBtb2RlIEN0cmwtQyBhbmQgQ3RybC1CcmVhayBoYW5kbGVyLiBUaGlzIGhhbmRsZXIgc2ltcGx5IHNldHMgYQotICogZmxhZyBpbiB0aGUgcmVhbCBtb2RlIGNvZGUgc2VnbWVudCBhbmQgZXhpdC4gV2Ugc2F2ZSB0aGUgbG9jYXRpb24KLSAqIG9mIHRoaXMgZmxhZyBpbiByZWFsIG1vZGUgbWVtb3J5IHNvIHRoYXQgYm90aCB0aGUgcmVhbCBtb2RlIGFuZAotICogcHJvdGVjdGVkIG1vZGUgY29kZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncy4KLSAqLwotCi1zdGF0aWMgdWNoYXIgY3RybEhhbmRsZXJbXSA9IHsKLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qICBjdHJsQkZsYWcgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHg2NiwweDJFLDB4QzcsMHgwNiwweDAwLDB4MDAsCi0gICAgMHgwMSwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6Y3RybEJGbGFnXSwxICAgICAgICAqLwotICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGlyZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9OwotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKQotewotICAgIHVpbnQgICAgcnNlZyxyb2ZmOwotCi0gICAgZ2V0SVNSKDB4MUIsICZfUE1fcHJldkJyZWFrLCAmcHJldlJlYWxCcmVhayk7Ci0gICAgZ2V0SVNSKDB4MjMsICZfUE1fcHJldkN0cmxDLCAmcHJldlJlYWxDdHJsQyk7Ci0gICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOwotICAgIHNldElTUigweDFCLCBfUE1fYnJlYWtJU1IpOwotICAgIHNldElTUigweDIzLCBfUE1fY3RybENJU1IpOwotCi0gICAgLyogSG9vayB0aGUgcmVhbCBtb2RlIHZlY3RvcnMgZm9yIHRoZXNlIGhhbmRsZXJzLCBhcyB0aGVzZSBhcmUgbm90Ci0gICAgICogbm9ybWFsbHkgcmVmbGVjdGVkIGJ5IHRoZSBEUE1JIHNlcnZlciB1cCB0byBwcm90ZWN0ZWQgbW9kZQotICAgICAqLwotICAgIF9QTV9jdHJsQlB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YoY3RybEhhbmRsZXIpKjIsICZyc2VnLCAmcm9mZik7Ci0gICAgbWVtY3B5KF9QTV9jdHJsQlB0cixjdHJsSGFuZGxlcixzaXplb2YoY3RybEhhbmRsZXIpKTsKLSAgICBtZW1jcHkoX1BNX2N0cmxCUHRyK3NpemVvZihjdHJsSGFuZGxlciksY3RybEhhbmRsZXIsc2l6ZW9mKGN0cmxIYW5kbGVyKSk7Ci0gICAgX1BNX2N0cmxDUHRyID0gX1BNX2N0cmxCUHRyICsgc2l6ZW9mKGN0cmxIYW5kbGVyKTsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MUIsKChsb25nKXJzZWcgPDwgMTYpIHwgKHJvZmYrNCkpOwotICAgIF9QTV9zZXRSTXZlY3QoMHgyMywoKGxvbmcpcnNlZyA8PCAxNikgfCAocm9mZitzaXplb2YoY3RybEhhbmRsZXIpKzQpKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2QnJlYWsuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDFCLCBfUE1fcHJldkJyZWFrLCBwcmV2UmVhbEJyZWFrKTsKLQlyZXN0b3JlSVNSKDB4MjMsIF9QTV9wcmV2Q3RybEMsIHByZXZSZWFsQ3RybEMpOwotCV9QTV9wcmV2QnJlYWsuc2VsID0gMDsKLQlfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKLQlQTV9mcmVlUmVhbFNlZyhfUE1fY3RybEJQdHIpOwotCX0KLX0KLQotLyogUmVhbCBtb2RlIENyaXRpY2FsIEVycm9yIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2F2ZXMgdGhlIEFYIGFuZAotICogREkgdmFsdWVzIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0cy4gV2Ugc2F2ZSB0aGUgbG9jYXRpb24KLSAqIG9mIHRoaXMgZmxhZyBpbiByZWFsIG1vZGUgbWVtb3J5IHNvIHRoYXQgYm90aCB0aGUgcmVhbCBtb2RlIGFuZAotICogcHJvdGVjdGVkIG1vZGUgY29kZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncy4KLSAqLwotCi1zdGF0aWMgdWNoYXIgY3JpdGljYWxIYW5kbGVyW10gPSB7Ci0gICAgMHgwMCwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgYXhDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MDAsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIGRpQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4QTMsMHgwMCwweDAwLCAgICAgICAgICAgIC8qICBtb3YgICAgIFtjczpheENvZGVdLGF4ICAgICAgICAgICovCi0gICAgMHgyRSwweDg5LDB4M0UsMHgwMiwweDAwLCAgICAgICAvKiAgbW92ICAgICBbY3M6ZGlDb2RlXSxkaSAgICAgICAgICAqLwotICAgIDB4QjgsMHgwMywweDAwLCAgICAgICAgICAgICAgICAgLyogIG1vdiAgICAgYXgsMyAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweENGLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgfTsKLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlciBjaCkKLXsKLSAgICB1aW50ICAgIHJzZWcscm9mZjsKLQotICAgIGdldElTUigweDI0LCAmX1BNX3ByZXZDcml0aWNhbCwgJnByZXZSZWFsQ3JpdGljYWwpOwotICAgIF9QTV9jcml0SGFuZGxlciA9IGNoOwotICAgIHNldElTUigweDI0LCBfUE1fY3JpdGljYWxJU1IpOwotCi0gICAgLyogSG9vayB0aGUgcmVhbCBtb2RlIHZlY3RvciwgYXMgdGhpcyBpcyBub3Qgbm9ybWFsbHkgcmVmbGVjdGVkIGJ5IHRoZQotICAgICAqIERQTUkgc2VydmVyIHVwIHRvIHByb3RlY3RlZCBtb2RlLgotICAgICAqLwotICAgIF9QTV9jcml0UHRyID0gUE1fYWxsb2NSZWFsU2VnKHNpemVvZihjcml0aWNhbEhhbmRsZXIpKjIsICZyc2VnLCAmcm9mZik7Ci0gICAgbWVtY3B5KF9QTV9jcml0UHRyLGNyaXRpY2FsSGFuZGxlcixzaXplb2YoY3JpdGljYWxIYW5kbGVyKSk7Ci0gICAgX1BNX3NldFJNdmVjdCgweDI0LCgobG9uZylyc2VnIDw8IDE2KSB8IChyb2ZmKzQpKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2Q3JpdGljYWwuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDI0LCBfUE1fcHJldkNyaXRpY2FsLCBwcmV2UmVhbENyaXRpY2FsKTsKLQlQTV9mcmVlUmVhbFNlZyhfUE1fY3JpdFB0cik7Ci0JX1BNX3ByZXZDcml0aWNhbC5zZWwgPSAwOwotCV9QTV9jcml0SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBEUE1JX2xvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gRFBNSV91bmxvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotLypBTTogY2F1c2VzIG1pbm9yIGdsaXRjaCB3aXRoICovCi0vKkFNOiBvbGRlciB2ZXJzaW9ucyBwbUVhc3kgd2hpY2ggZG9uJ3QgYWxsb3cgRFBNSSAwNiBvbiAqLwotLypBTTogQ29kZSBzZWxlY3RvciAweDBDIC0tIGFzc3VtZSBiYXNlIGlzIDAgd2hpY2ggaXQgc2hvdWxkIGJlLiAqLwotICAgIHJldHVybiBEUE1JX2xvY2tMaW5lYXJQYWdlcygodWludClwLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIERQTUlfdW5sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCxsZW4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5ZWYyYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7Ci0gICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKLSAgICBjb2RlTGVuID0gY29kZUxlbjsKLSAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0MTE5Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50Ci0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKiAgICAgTFpUaW1lciBub3Qgc3VwcG9ydGVkIGZvciBzbXggKGFzIG5lZWRlZCBmb3IgaTQ4NiBwcm9jZXNzb3JzKSwgb25seQotKiAgICAgVUxaVGltZXIgaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgc214IHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWV4dGVybiB1bG9uZyAgICAgIF9jZGVjbCBldGltZTsgICAgIC8qIGVsYXBzZWQgdGltZSAqLwotZXh0ZXJuIHVsb25nICAgICAgX2NkZWNsIHh0aWNrc19wZXJfc2Vjb25kKHZvaWQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCi0KLXZvaWQgICAgX0FTTUFQSSBMWl9kaXNhYmxlKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIExaX2VuYWJsZSh2b2lkKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19aVGltZXJJbml0KHZvaWQpCi17Ci19Ci0KLXVsb25nIHJldGVycih2b2lkKQotewotICAgUE1fZmF0YWxFcnJvcigiWmVuIFRpbWVyIG5vdCBzdXBwb3J0ZWQgZm9yIHNteC4iKTsKLSAgIHJldHVybigwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT24odG0pICAgICBQTV9mYXRhbEVycm9yKCJaZW4gVGltZXIgbm90IHN1cHBvcnRlZCBmb3Igc214LiIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckxhcCh0bSkgICAgcmV0ZXJyKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICBQTV9mYXRhbEVycm9yKCJaZW4gVGltZXIgbm90IHN1cHBvcnRlZCBmb3Igc214LiIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckNvdW50KHRtKSAgcmV0ZXJyKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIHNlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAodWxvbmcpKDEwMDAwMDAveHRpY2tzX3Blcl9zZWNvbmQoKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciB2YWx1ZSBmcm9tIHRoZSBzbXggdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIHVsb25nICAgdGlja3M7Ci0gICAgTFpfZGlzYWJsZSgpOyAgICAgICAgICAgIC8qIFR1cm4gb2YgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCi0gICAgdGlja3MgPSBldGltZTsKLSAgICBMWl9lbmFibGUoKTsgICAgICAgICAgICAgLyogVHVybiBvbiBpbnRlcnJ1cHRzIGFnYWluICAgICAgICAgKi8KLSAgICByZXR1cm4gdGlja3M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsKLSAgICBpZiAoZmluaXNoIDwgc3RhcnQpCi0JZmluaXNoICs9IHh0aWNrc19wZXJfc2Vjb25kKCkgKiAzNjAwICoyNDsgICAgICAgLyogTnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzICAgICAgKi8KLSAgICByZXR1cm4gZmluaXNoIC0gc3RhcnQ7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjE1ZTkwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgKioqIFRPRE86IEFERCBZT1VSIE9TIEVOVklST05NRU5UIE5BTUUgSEVSRSAqKioKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIHRvIG1lYXN1cmUgdGhlCi0qICAgICAgICAgICAgICAgQ1BVIGZyZXF1ZW5jeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eSB0byBtYXhpbXVtLCBpZiBwb3NzaWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFNldE1heFRocmVhZFByaW9yaXR5KHZvaWQpCi17Ci0gICAgLyogVE9ETzogSWYgeW91IGhhdmUgdGhyZWFkIHByaW9yaXRpZXMsIGluY3JlYXNlIGl0IHRvIG1heGltdW0gZm9yIHRoZSAqLwotICAgIC8qICAgICAgIHRocmVhZCBmb3IgdGltaW5nIHRoZSBDUFUgZnJlcXVlbmN5LiAqLwotICAgIHJldHVybiBvbGRQcmlvcml0eTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHJlYWQgcHJpb3JpdHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVzdG9yZVRocmVhZFByaW9yaXR5KAotICAgIGludCBwcmlvcml0eSkKLXsKLSAgICAvKiBUT0RPOiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHJlYWQgcHJpb3JpdHkgb24gZXhpdC4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgLyogVE9ETzogUmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIgaW4gaGVyZS4gWW91IHNob3VsZCB0cnkgdG8gKi8KLSAgICAvKiAgICAgICBub3JtYWxpc2UgdGhpcyB2YWx1ZSB0byBiZSBhcm91bmQgMTAwLDAwMCB0aWNrcyBwZXIgc2Vjb25kLiAqLwotICAgIGZyZXEtPmxvdyA9IDA7Ci0gICAgZnJlcS0+aGlnaCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgotCi1UT0RPOiBJbXBsZW1lbnQgdGhpcyB0byByZWFkIHRoZSBjb3VudGVyLiBJdCBzaG91bGQgYmUgZG9uZSBhcyBhIG1hY3JvCi0gICAgICBmb3IgYWNjdXJhY3kuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh0KS0+bG93ID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRjNDkyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAqKiogVE9ETzogQUREIFlPVVIgT1MgRU5WSVJPTk1FTlQgTkFNRSBIRVJFICoqKgotKgotKiBEZXNjcmlwdGlvbjogICoqKiogaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgbm9uLURPUyBzeXN0ZW1zICovCi0jZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKLSNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKLQotUkVNQVJLUzoKLVRoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCi10aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIHlvdXIgT1MhICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBhcHBsaWNhdGlvbiBtZXNzYWdlIHF1ZXVlIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZWFkIGFsbCBrZXlib2FyZCBhbmQgbW91c2UgKi8KLSAgICAvKiAgICAgICBldmVudHMgZnJvbSB0aGUgT1Mgc3BlY2lmaWMgZXZlbnQgcXVldWUsIHRyYW5zbGF0ZSB0aGVtIGFuZCBwb3N0ICovCi0gICAgLyogICAgICAgdGhlbSBpbnRvIHRoZSBTY2lUZWNoIGV2ZW50IHF1ZXVlLiAqLwotICAgIC8qICovCi0gICAgLyogTk9URTogVGhlcmUgYXJlIGEgY291cGxlIG9mIGltcG9ydGFudCB0aGluZ3MgdGhhdCB0aGlzIGZ1bmN0aW9uIG11c3QgKi8KLSAgICAvKiAgICAgICB0YWtlIGNhcmUgb2Y6ICovCi0gICAgLyogKi8KLSAgICAvKiAgMS4gU3VwcG9ydCBmb3IgS0VZRE9XTiwgS0VZUkVQRUFUIGFuZCBLRVlVUCBpcyByZXF1aXJlZC4gKi8KLSAgICAvKiAqLwotICAgIC8qICAyLiBTdXBwb3J0IGZvciByZWFkaW5nIGhhcmR3YXJlIHNjYW4gY29kZSBhcyB3ZWxsIGFzIEFTQ0lJICovCi0gICAgLyogICAgIHRyYW5zbGF0ZWQgdmFsdWVzIGlzIHJlcXVpcmVkLiBHYW1lcyB1c2UgdGhlIHNjYW4gY29kZXMgcmF0aGVyICovCi0gICAgLyogICAgIHRoYW4gQVNDSUkgdmFsdWVzLiBTY2FuIGNvZGVzIGdvIGludG8gdGhlIGhpZ2ggb3JkZXIgYnl0ZSBvZiB0aGUgKi8KLSAgICAvKiAgICAga2V5Ym9hcmQgbWVzc2FnZSBmaWVsZC4gKi8KLSAgICAvKiAqLwotICAgIC8qICAzLiBTdXBwb3J0IGZvciBhdCBsZWFzdCByZWFkaW5nIG1vdXNlIG1vdGlvbiBkYXRhIChtaWNrZXlzKSBmcm9tIHRoZSAqLwotICAgIC8qICAgICBtb3VzZSBpcyByZXF1aXJlZC4gVXNpbmcgdGhlIG1pY2tleSB2YWx1ZXMsIHdlIGNhbiB0aGVuIHRyYW5zbGF0ZSAqLwotICAgIC8qICAgICB0byBtb3VzZSBjdXJzb3IgY29vcmRpbmF0ZXMgc2NhbGVkIHRvIHRoZSByYW5nZSBvZiB0aGUgY3VycmVudCAqLwotICAgIC8qICAgICBncmFwaGljcyBkaXNwbGF5IG1vZGUuIE1vdXNlIHZhbHVlcyBhcmUgc2NhbGVkIGJhc2VkIG9uIHRoZSAqLwotICAgIC8qICAgICBnbG9iYWwgJ3JhbmdlWCcgYW5kICdyYW5nZVknLiAqLwotICAgIC8qICovCi0gICAgLyogIDQuIFN1cHBvcnQgZm9yIGEgdGltZXN0YW1wIGZvciB0aGUgZXZlbnRzIGlzIHJlcXVpcmVkLCB3aGljaCBpcyAqLwotICAgIC8qICAgICBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHNvbWUgZXZlbnQgKHVzdWFsbHkgKi8KLSAgICAvKiAgICAgc3lzdGVtIHN0YXJ0dXApLiBUaGlzIGlzIHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQgKi8KLSAgICAvKiAgICAgKGllOiBhdCBpbnRlcnJ1cHQgdGltZSkgbm90IHdoZW4gaXQgd2FzIHN0dWZmIGludG8gdGhlIFNjaVRlY2ggKi8KLSAgICAvKiAgICAgZXZlbnQgcXVldWUuICovCi0gICAgLyogKi8KLSAgICAvKiAgNS4gU3VwcG9ydCBmb3IgbW91c2UgZG91YmxlIGNsaWNrIGV2ZW50cy4gSWYgdGhlIE9TIGhhcyBhIG5hdGl2ZSAqLwotICAgIC8qICAgICBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lIHRoaXMsIGl0IHNob3VsZCBiZSB1c2VkLiBPdGhlcndpc2UgdGhlICovCi0gICAgLyogICAgIHRpbWUgc3RhbXAgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmljIGV2ZW50IGNvZGUgKi8KLSAgICAvKiAgICAgdG8gZ2VuZXJhdGUgZG91YmxlIGNsaWNrIGV2ZW50cy4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBfbW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSAgICAvKiBUT0RPOiBEbyBhbnkgT1Mgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gaGVyZSAqLwotCi0gICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3Igbm9uIERPUyBzeXN0ZW1zICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0gICAgLyogVE9ETzogRG8gYW55IE9TIHNwZWNpZmljIGNsZWFudXAgaW4gaGVyZSAqLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzk1Y2JjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEJlT1MKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVE9ETzogVGhpcyBpcyB3aGVyZSB5b3UgaW5jbHVkZSBPUyBzcGVjaWZpYyBoZWFkZXJzIGZvciB0aGUgZXZlbnQgaGFuZGxpbmcgKi8KLS8qICAgICAgIGxpYnJhcnkuIFlvdSBtYXkgbGVhdmUgdGhpcyBlbXB0eSBpZiB5b3UgaGF2ZSBubyBPUyBzcGVjaWZpYyBoZWFkZXJzICovCi0vKiAgICAgICB0byBpbmNsdWRlLiAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI3OGMzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDk4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAqKiogVE9ETzogQUREIFlPVVIgT1MgRU5WSVJPTk1FTlQgTkFNRSBIRVJFICoqKgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogVE9ETzogSW5jbHVkZSBhbnkgT1Mgc3BlY2lmaWMgaGVhZGVycyBoZXJlISAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUT0RPOiBJZiB5b3Ugc3VwcG9ydCBhY2Nlc3MgdG8gdGhlIEJJT1MsIHRoZSBmb2xsb3dpbmcgVkVTQUJ1ZiBnbG9iYWxzICovCi0vKiAgICAgICBrZWVwIHRyYWNrIG9mIGEgc2luZ2xlIFZFU0EgdHJhbnNmZXIgYnVmZmVyLiBJZiB5b3UgZG9uJ3Qgc3VwcG9ydCAqLwotLyogICAgICAgYWNjZXNzIHRvIHRoZSBCSU9TLCByZW1vdmUgdGhlc2UgdmFyaWFibGVzLiAqLwotCi1zdGF0aWMgdWludCBWRVNBQnVmX2xlbiA9IDEwMjQ7ICAgICAvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAgICAqLwotc3RhdGljIHZvaWQgKlZFU0FCdWZfcHRyID0gTlVMTDsgICAgLyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KLXN0YXRpYyB1aW50IFZFU0FCdWZfcnNlZzsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCBWRVNBQnVmX3JvZmY7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLwotCi1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBEbyBhbnkgaW5pdGlhbGlzYXRpb24gaW4gaGVyZS4gVGhpcyBpbmNsdWRlcyBnZXR0aW5nIElPUEwgKi8KLSAgICAvKiAgICAgICBhY2Nlc3MgZm9yIHRoZSBwcm9jZXNzIGNhbGxpbmcgUE1faW5pdC4gVGhpcyB3aWxsIGdldCBjYWxsZWQgKi8KLSAgICAvKiAgICAgICBtb3JlIHRoYW4gb25jZS4gKi8KLQotICAgIC8qIFRPRE86IElmIHlvdSBzdXBwb3J0IHRoZSBzdXBwbGllZCBNVFJSIHJlZ2lzdGVyIHN0dWZmICh5b3UgbmVlZCB0byAqLwotICAgIC8qICAgICAgIGJlIGF0IHJpbmcgMCBmb3IgdGhpcyEpLCB5b3Ugc2hvdWxkIGluaXRpYWxpc2UgaXQgaW4gaGVyZS4gKi8KLQotLyogTVRSUl9pbml0KCk7ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgaWRlbnRpZmllci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQotewotICAgIC8qIFRPRE86IENoYW5nZSB0aGlzIHRvIHJldHVybiB0aGUgZGVmaW5lIGZvciB5b3VyIE9TIGZyb20gZHJ2bGliL29zLmggKi8KLSAgICByZXR1cm4gX09TX01ZT1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBydW50aW1lIHR5cGUgaWRlbnRpZmllciAoYWx3YXlzIFBNXzM4NiBmb3IgcHJvdGVjdGVkIG1vZGUpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17IHJldHVybiBQTV8zODY7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goCi0gICAgY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJy8nKSB7Ci0Jc1twb3NdID0gJy8nOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgdXNlciBkZWZpbmVkIFBNX2ZhdGFsRXJyb3IgY2xlYW51cCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVwb3J0IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIGFuZCBoYWx0IHRoZSBwcm9ncmFtLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcigKLSAgICBjb25zdCBjaGFyICptc2cpCi17Ci0gICAgLyogVE9ETzogSWYgeW91IGFyZSBydW5uaW5nIGluIGEgR1VJIGVudmlyb25tZW50IHdpdGhvdXQgYSBjb25zb2xlLCAqLwotICAgIC8qICAgICAgIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBicmluZyB1cCBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgKi8KLSAgICAvKiAgICAgICBib3ggYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4gKi8KLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7Ci0gICAgZXhpdCgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGl0IGhhbmRsZXIgdG8ga2lsbCB0aGUgVkVTQSB0cmFuc2ZlciBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRXhpdFZCRUJ1Zih2b2lkKQotewotICAgIC8qIFRPRE86IElmIHlvdSBkbyBub3QgaGF2ZSBCSU9TIGFjY2VzcywgcmVtb3ZlIHRoaXMgZnVuY3Rpb24uICovCi0gICAgaWYgKFZFU0FCdWZfcHRyKQotCVBNX2ZyZWVSZWFsU2VnKFZFU0FCdWZfcHRyKTsKLSAgICBWRVNBQnVmX3B0ciA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgdGhlIHJlYWwgbW9kZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBCSU9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgLyogVE9ETzogSWYgeW91IGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzLCBzaW1wbHkgZGVsZXRlIHRoZSBndXRzIG9mICovCi0gICAgLyogICAgICAgdGhpcyBmdW5jdGlvbiBhbmQgcmV0dXJuIE5VTEwuICovCi0gICAgaWYgKCFWRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoVkVTQUJ1Zl9wdHIgPSBQTV9hbGxvY1JlYWxTZWcoVkVTQUJ1Zl9sZW4sICZWRVNBQnVmX3JzZWcsICZWRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlhdGV4aXQoRXhpdFZCRUJ1Zik7Ci0JfQotICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKLSAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKLSAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhIGtleSBpcyBhdmFpbGFibGUgdG8gYmUgcmVhZC4gVGhpcyAqLwotICAgIC8qICAgICAgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCwgYnV0IGlzIG1vc3RseSB1c2VkIGJ5IHRoZSB0ZXN0IHByb2dyYW1zICovCi0gICAgLyogICAgICAgdGhlc2UgZGF5cy4gKi8KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XYWl0IGZvciBhbmQgcmV0dXJuIHRoZSBuZXh0IGtleXByZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIC8qIFRPRE86IFRoaXMgcmV0dXJucyB0aGUgQVNDSUkgY29kZSBvZiB0aGUga2V5IHByZXNzZWQuIFRoaXMgKi8KLSAgICAvKiAgICAgICBzaG91bGQgYmUgaW1wbGVtZW50ZWQsIGJ1dCBpcyBtb3N0bHkgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcyAqLwotICAgIC8qICAgICAgIHRoZXNlIGRheXMuICovCi0gICAgcmV0dXJuIDB4RDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PcGVuIGEgZnVsbHNjcmVlbiBjb25zb2xlIG1vZGUgZm9yIG91dHB1dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fb3BlbkNvbnNvbGUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBPcGVucyB1cCBhIGZ1bGxzY3JlZW4gY29uc29sZSBmb3IgZ3JhcGhpY3Mgb3V0cHV0LiBJZiB5b3VyICovCi0gICAgLyogICAgICAgY29uc29sZSBkb2VzIG5vdCBoYXZlIGdyYXBoaWNzL3RleHQgbW9kZXMsIHRoaXMgY2FuIGJlIGxlZnQgKi8KLSAgICAvKiAgICAgICBlbXB0eS4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIHRvIGRpc2FibGUgY29uc29sZSBzd2l0Y2hpbmcgKi8KLSAgICAvKiAgICAgICB3aGVuIGluIGdyYXBoaWNzIG1vZGVzIGlmIHlvdSBjYW4gc3dpdGNoIGF3YXkgZnJvbSBmdWxsc2NyZWVuICovCi0gICAgLyogICAgICAgY29uc29sZXMgKGlmIHlvdSB3YW50IHRvIGFsbG93IHN3aXRjaGluZywgdGhpcyBjYW4gYmUgZG9uZSAqLwotICAgIC8qICAgICAgIGVsc2V3aGVyZSB3aXRoIGEgZnVsbCBzYXZlL3Jlc3RvcmUgc3RhdGUgb2YgdGhlIGdyYXBoaWNzIG1vZGUpLiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3RhdGUgYnVmZmVyIHVzZWQgdG8gc2F2ZSB0aGUgY29uc29sZSBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIC8qIFRPRE86IFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbnNvbGUgc3RhdGUgYnVmZmVyIHVzZWQgdG8gc2F2ZSB0aGUgKi8KLSAgICAvKiAgICAgICBzdGF0ZSBvZiB0aGUgY29uc29sZSBiZWZvcmUgZ29pbmcgaW50byBncmFwaGljcyBtb2RlLiBUaGlzIGlzICovCi0gICAgLyogICAgICAgdXNlZCB0byByZXN0b3JlIHRoZSBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIHdoZW4gd2UgYXJlIGRvbmUuICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgaW50byB0aGUgc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSgKLSAgICB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBpbnQgY29uc29sZV9pZCkKLXsKLSAgICAvKiBUT0RPOiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgaW50byB0aGUgc3RhdGUgYnVmZmVyLiBUaGlzIGlzICovCi0gICAgLyogICAgICAgdXNlZCB0byByZXN0b3JlIHRoZSBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIHdoZW4gd2UgYXJlIGRvbmUuICovCi0gICAgLyogICAgICAgV2Ugd2lsbCBhbHdheXMgcmVzdG9yZSA4MHgyNSB0ZXh0IG1vZGUgYWZ0ZXIgYmVpbmcgaW4gZ3JhcGhpY3MgKi8KLSAgICAvKiAgICAgICBtb2RlLCBzbyBpZiByZXN0b3JpbmcgdGV4dCBtb2RlIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0aGlzIGNhbiAqLwotICAgIC8qICAgICAgIGJlIGxlZnQgZW1wdHkuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgZnJvbSB0aGUgc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSgKLSAgICBjb25zdCB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBpbnQgY29uc29sZV9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSBmcm9tIHRoZSBzdGF0ZSBidWZmZXIuIFRoaXMgaXMgKi8KLSAgICAvKiAgICAgICB1c2VkIHRvIHJlc3RvcmUgdGhlIGNvbnNvbGUgYmFjayB0byBub3JtYWwgd2hlbiB3ZSBhcmUgZG9uZS4gKi8KLSAgICAvKiAgICAgICBXZSB3aWxsIGFsd2F5cyByZXN0b3JlIDgweDI1IHRleHQgbW9kZSBhZnRlciBiZWluZyBpbiBncmFwaGljcyAqLwotICAgIC8qICAgICAgIG1vZGUsIHNvIGlmIHJlc3RvcmluZyB0ZXh0IG1vZGUgaXMgYWxsIHlvdSBuZWVkIHRvIGRvIHRoaXMgY2FuICovCi0gICAgLyogICAgICAgYmUgbGVmdCBlbXB0eS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DbG9zZSB0aGUgY29uc29sZSBhbmQgcmV0dXJuIHRvIG5vbi1mdWxsc2NyZWVuIGNvbnNvbGUgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZSgKLSAgICBpbnQgY29uc29sZV9pZCkKLXsKLSAgICAvKiBUT0RPOiBDbG9zZSB0aGUgY29uc29sZSB3aGVuIHdlIGFyZSBkb25lLCBnb2luZyBiYWNrIHRvIHRleHQgbW9kZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBPUyBjb25zb2xlIGN1cnNvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oCi0gICAgaW50IHgsCi0gICAgaW50IHkpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSBPUyBjb25zb2xlIGN1cnNvciBsb2NhdGlvbiB0byB0aGUgbmV3IHZhbHVlLiBUaGlzIGlzICovCi0gICAgLyogICAgICAgZ2VuZXJhbGx5IHVzZWQgZm9yIG5ldyBPUyBwb3J0cyAodXNlZCBtb3N0bHkgZm9yIERPUykuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSB3aWR0aCBvZiB0aGUgT1MgY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNX3NldE9TU2NyZWVuV2lkdGgoCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSBPUyBjb25zb2xlIHNjcmVlbiB3aWR0aC4gVGhpcyBpcyBnZW5lcmFsbHkgdW51c2VkIGZvciAqLwotICAgIC8qICAgICAgIG5ldyBPUyBwb3J0cy4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyICh1c2VkIGZvciBzb2Z0d2FyZSBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKAotICAgIFBNX2ludEhhbmRsZXIgaWgsCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBJbnN0YWxsIGEgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyLiBOb3JtYWxseSB0aGlzICovCi0gICAgLyogICAgICAgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGZyb20gbW9zdCBPUydlcyBpbiB1c2VyIGxhbmQsIHNvIGFuICovCi0gICAgLyogICAgICAgYWx0ZXJuYXRpdmUgbWVjaGFuaXNtIGlzIG5lZWRlZCB0byBlbmFibGUgc29mdHdhcmUgc3RlcmVvLiAqLwotICAgIC8qICAgICAgIEhlbmNlIGxlYXZlIHRoaXMgdW5pbXBsZW1lbnRlZCB1bmxlc3MgeW91IGhhdmUgYSBoaWdoIHByaW9yaXR5ICovCi0gICAgLyogICAgICAgbWVjaGFuaXNtIHRvIGNhbGwgdGhlIDMyLWJpdCBjYWxsYmFjayB3aGVuIHRoZSByZWFsIHRpbWUgY2xvY2sgKi8KLSAgICAvKiAgICAgICBpbnRlcnJ1cHQgZmlyZXMuICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGZyZXF1ZW5jeSAoZm9yIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGZyZXF1ZW5jeS4gVXNlZCBmb3Igc3RlcmVvICovCi0gICAgLyogICAgICAgTEMgc2h1dHRlciBnbGFzc2VzIHdoZW4gZG9pbmcgc29mdHdhcmUgc3RlcmVvLiBVc3VhbGx5IHNldHMgKi8KLSAgICAvKiAgICAgICB0aGUgZnJlcXVlbmN5IHRvIGFyb3VuZCAyMDQ4IEh6LiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmVzdG9yZXMgdGhlIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIHBhdGggb3Igd29ya2luZyBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGRyaXZlIGxldHRlciBmb3IgdGhlIGJvb3QgZHJpdmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gdGhlIGJvb3QgZHJpdmUgbGV0dGVyIGZvciB0aGUgT1MuIE5vcm1hbGx5IHRoaXMgaXMgJ2MnICovCi0gICAgLyogICAgICAgZm9yIERPUyBiYXNlZCBPUydlcyBhbmQgJy8nIGZvciBVbmljZXMuICovCi0gICAgcmV0dXJuICcvJzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIFZCRS9BRiBkcml2ZXIgZmlsZXMgKGxlZ2FjeSBhbmQgbm90IHVzZWQpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIC8qIFRPRE86IENoYW5nZSB0aGlzIHRvIHRoZSBkZWZhdWx0IHBhdGggdG8gTnVjbGV1cyBkcml2ZXIgZmlsZXMuIFRoZSAqLwotICAgIC8qICAgICAgIGZvbGxvd2luZyBpcyB0aGUgZGVmYXVsdCBmb3IgVW5pY2VzLiAqLwotICAgIGNoYXIgKmVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIik7Ci0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvdXNyL2xpYi9udWNsZXVzIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgY29uZmlndXJhdGlvbiBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1hY2hpbmUgaWYgcG9zc2libGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGUgbWFjaGluZS4gSWYgYSB1bmlxdWUgSUQgaXMgbm90ICovCi0gICAgLyogICAgICAgYXZhaWxhYmxlLCByZXR1cm4gdGhlIG1hY2hpbmUgbmFtZS4gKi8KLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSAgICBnZXRob3N0bmFtZShidWYsIDEyOCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1HZXQgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgb24gdGhlIG5ldHdvcmsuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmV0dXJuIHRoZSBuZXR3b3JrIG1hY2hpbmUgbmFtZSBmb3IgdGhlIG1hY2hpbmUuICovCi0gICAgc3RhdGljIGNoYXIgYnVmWzEyOF07Ci0gICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVhbCBtb2RlIEJJT1MgZGF0YSBhcmVhLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIC8qIFRPRE86IFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgbW9kZSBCSU9TIGRhdGEgYXJlYS4gSWYgeW91ICovCi0gICAgLyogICAgICAgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHlvdSBjYW4gc2ltcGx5IHJldHVybiBOVUxMIGhlcmUuICovCi0gICAgaWYgKCF6ZXJvUHRyKQotCXplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyAweDQwMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byAweEEwMDAwIHBoeXNpY2FsIFZHQSBncmFwaGljcyBmcmFtZWJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgc3RhdGljIHZvaWQgKmJhbmtQdHI7Ci0gICAgaWYgKCFiYW5rUHRyKQotCWJhbmtQdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7Ci0gICAgcmV0dXJuIGJhbmtQdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gbWFwcyBhIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIHRvIGEgbGluZWFyICovCi0gICAgLyogICAgICAgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAqLwotCi0gICAgLyogTk9URTogVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgYWJsZSB0byBoYW5kbGUgYW55IHBoc3lpY2FsIGJhc2UgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLCBhbmQgaGVuY2UgeW91IHdpbGwgaGF2ZSB0byBoYW5kbGUgcm91bmRpbmcgb2YgKi8KLSAgICAvKiAgICAgICB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIHRvIGEgcGFnZSBib3VuZGFyeSAoaWU6IDRLYiBvbiAqLwotICAgIC8qICAgICAgIHg4NiBDUFUncykgdG8gYmUgYWJsZSB0byBwcm9wZXJseSBtYXAgaW4gdGhlIG1lbW9yeSAqLwotICAgIC8qICAgICAgIHJlZ2lvbi4gKi8KLQotICAgIC8qIE5PVEU6IElmIHBvc3NpYmxlIHRoZSBpc0NhY2hlZCBiaXQgc2hvdWxkIGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgKi8KLSAgICAvKiAgICAgICB0aGUgUENEIChQYWdlIENhY2hlIERpc2FibGUpIGFuZCBQV1QgKFBhZ2UgV3JpdGUgVGhyb3VnaCkgKi8KLSAgICAvKiAgICAgICBiaXRzIGFyZSBzZXQgdG8gZGlzYWJsZSBjYWNoaW5nIGZvciBhIG1lbW9yeSBtYXBwaW5nIHVzZWQgKi8KLSAgICAvKiAgICAgICBmb3IgTU1JTyByZWdpc3RlciBhY2Nlc3MuIFdlIGFsc28gZGlzYWJsZSBjYWNoaW5nIHVzaW5nICovCi0gICAgLyogICAgICAgdGhlIE1UUlIgcmVnaXN0ZXJzIGZvciBQZW50aXVtIFBybyBhbmQgbGF0ZXIgY2hpcHNldHMgc28gaWYgKi8KLSAgICAvKiAgICAgICBNVFJSIHN1cHBvcnQgaXMgZW5hYmxlZCBmb3IgeW91ciBPUyB0aGVuIHlvdSBjYW4gc2FmZWx5IGlnbm9yZSAqLwotICAgIC8qICAgICAgIHRoZSBpc0NhY2hlZCBmbGFnIGFuZCBhbHdheXMgZW5hYmxlIGNhY2hpbmcgaW4gdGhlIHBhZ2UgKi8KLSAgICAvKiAgICAgICB0YWJsZXMuICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZyBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwdHIsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyBwcmV2aW91c2x5ICovCi0gICAgLyogICAgICAgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyKCkgaWYgYXQgYWxsIHBvc3NpYmxlLiBJZiAqLwotICAgIC8qICAgICAgIHlvdSBjYW4ndCBmcmVlIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5ncywgc2ltcGx5IGRvIG5vdGhpbmcuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciAqLwotICAgIC8qICAgICAgIGFkZHJlc3MuICovCi0gICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgLyogVE9ETzogUHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciBtaWxsaXNlY29uZHMgKi8KLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgKHVubmFtZWQpIHNoYXJlZCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZCgKLSAgICBsb25nIHNpemUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBpcyB1c2VkIHRvIGFsbG9jYXRlIG1lbW9yeSB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3MgKi8KLSAgICAvKiAgICAgICB0aGF0IGFsbCBhY2Nlc3MgdGhlIGNvbW1vbiBOdWNsZXVzIGRyaXZlcnMgdmlhIGEgY29tbW9uIGRpc3BsYXkgKi8KLSAgICAvKiAgICAgICBkcml2ZXIgRExMLiBJZiB5b3VyIE9TIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIG1lbW9yeSAob3IgaWYgKi8KLSAgICAvKiAgICAgICB0aGUgZGlzcGxheSBkcml2ZXIgZG9lcyBub3QgbmVlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5ICovCi0gICAgLyogICAgICAgZm9yIGVhY2ggcHJvY2VzcyBhZGRyZXNzIHNwYWNlKSwgdGhpcyBzaG91bGQganVzdCBjYWxsIFBNX21hbGxvYy4gKi8KLSAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCgKLSAgICB2b2lkICpwdHIpCi17Ci0gICAgLyogVE9ETzogRnJlZSB0aGUgc2hhcmVkIG1lbW9yeSBibG9jay4gVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgY29udGV4dCAqLwotICAgIC8qICAgICAgIG9mIHRoZSBvcmlnaW5hbCBjYWxsaW5nIHByb2Nlc3MgdGhhdCBhbGxvY2F0ZWQgdGhlIHNoYXJlZCAqLwotICAgIC8qICAgICAgIG1lbW9yeSB3aXRoIFBNX21hbGxvY1NoYXJlZC4gU2ltcGx5IGNhbGwgUE1fZnJlZSBpZiB5b3UgZG8gbm90ICovCi0gICAgLyogICAgICAgbmVlZCB0aGlzLiAqLwotICAgIFBNX2ZyZWUocHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgdG8gdGhlIGNhbGxpbmcgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiBUaGUKLWFkZHJlc3Mgd2lsbCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIGFub3RoZXIgcHJvY2VzcyB1c2luZyB0aGUKLVBNX21hcFBoeXNpY2FsQWRkciBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAotICAgIHZvaWQgKmJhc2UsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1hcCBhIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nICovCi0gICAgLyogICAgICAgcHJldmlvdXNseSBhbGxvY2F0ZWQgd2l0aCBQTV9tYXBQaHlzaWNhbEFkZHIgaW50byB0aGUgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzIHNwYWNlIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuIElmIHRoZSBtZW1vcnkgbWFwcGluZyAqLwotICAgIC8qICAgICAgIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIgaXMgZ2xvYmFsIHRvIGFsbCBwcm9jZXNzZXMsICovCi0gICAgLyogICAgICAgc2ltcGx5IHJldHVybiB0aGUgcG9pbnRlci4gKi8KLQotICAgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gbXVzdCBhbHNvIGhhbmRsZSByb3VuZGluZyB0byBwYWdlIGJvdW5kYXJpZXMsICovCi0gICAgLyogICAgICAgc2luY2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1hcCBpbiBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMgKi8KLSAgICAvKiAgICAgICBhbGxvY2F0ZWQgd2l0aCBQTV9tYXBQaHlzaWNhbEFkZHIoKS4gSGVuY2UgaWYgeW91IGFsaWduZWQgKi8KLSAgICAvKiAgICAgICB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhYm92ZSwgdGhlbiB5b3UgYWxzbyBuZWVkIHRvIGRvIGl0IGhlcmUuICovCi0gICAgcmV0dXJuIGJhc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcmVhbCBtb2RlIHBvaW50ZXIgdG8gYSBwcm90ZWN0ZWQgbW9kZSBwb2ludGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcigKLSAgICB1aW50IHJfc2VnLAotICAgIHVpbnQgcl9vZmYpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBtYXBzIGEgcmVhbCBtb2RlIG1lbW9yeSBwb2ludGVyIGludG8gdGhlICovCi0gICAgLyogICAgICAgY2FsbGluZyBwcm9jZXNzZXMgYWRkcmVzcyBzcGFjZSBhcyBhIDMyLWJpdCBuZWFyIHBvaW50ZXIuIElmICovCi0gICAgLyogICAgICAgeW91IGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCBzaW1wbHkgcmV0dXJuIE5VTEwgaGVyZS4gKi8KLSAgICBpZiAoIXplcm9QdHIpCi0JemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkYpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyBNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZygKLSAgICB1aW50IHNpemUsCi0gICAgdWludCAqcl9zZWcsCi0gICAgdWludCAqcl9vZmYpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5IGZvciB0aGUgKi8KLSAgICAvKiAgICAgICBjYWxsaW5nIHByb2Nlc3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHJlYWwgbW9kZSBCSU9TICovCi0gICAgLyogICAgICAgZnVuY3Rpb25zLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHNpbXBseSByZXR1cm4gKi8KLSAgICAvKiAgICAgICBOVUxMIGhlcmUuICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZygKLSAgICB2b2lkICptZW0pCi17Ci0gICAgLyogVE9ETzogRnJlZXMgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCByZWFsIG1vZGUgbWVtb3J5IGJsb2NrLiBJZiB5b3UgKi8KLSAgICAvKiAgICAgICBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZW1wdHkuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0IChwYXJhbWV0ZXJzIGluIERQTUkgY29tcGF0aWJsZSBzdHJ1Y3R1cmUpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBEUE1JX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgcmVhbCBtb2RlIEJJT1MgdXNpbmcgdGhlIHBhc3NlZCBpbiAqLwotICAgIC8qICAgICAgIHJlZ2lzdGVyIHN0cnVjdHVyZS4gSWYgeW91IGRvIG5vdCBzdXBwb3J0IHJlYWwgbW9kZSBCSU9TICovCi0gICAgLyogICAgICAgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBlbXB0eS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0KQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIHJlYWwgbW9kZSBCSU9TIHVzaW5nIHRoZSBwYXNzZWQgaW4gKi8KLSAgICAvKiAgICAgICByZWdpc3RlciBzdHJ1Y3R1cmUuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCByZWFsIG1vZGUgQklPUyAqLwotICAgIC8qICAgICAgIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDAuICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NngoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgcmVhbCBtb2RlIEJJT1MgdXNpbmcgdGhlIHBhc3NlZCBpbiAqLwotICAgIC8qICAgICAgIHJlZ2lzdGVyIHN0cnVjdHVyZS4gSWYgeW91IGRvIG5vdCBzdXBwb3J0IHJlYWwgbW9kZSBCSU9TICovCi0gICAgLyogICAgICAgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gMC4gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIGEgcmVhbCBtb2RlIGZhciBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gY2FsbHMgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uIHdpdGggYSBmYXIgY2FsbC4gKi8KLSAgICAvKiAgICAgICBJZiB5b3UgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlICovCi0gICAgLyogICAgICAgZW1wdHkuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSgKLSAgICB1bG9uZyAqcGh5c2ljYWwsCi0gICAgdWxvbmcgKnRvdGFsKQotewotICAgIC8qIFRPRE86IFJlcG9ydCB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnksIGJvdGggdGhlIGFtb3VudCBvZiAqLwotICAgIC8qICAgICAgIHBoeXNpY2FsIG1lbW9yeSBsZWZ0IGFuZCB0aGUgYW1vdW50IG9mIHZpcnR1YWwgbWVtb3J5IGxlZnQuICovCi0gICAgLyogICAgICAgSWYgdGhlIE9TIGRvZXMgbm90IHByb3ZpZGUgdGhlc2Ugc2VydmljZXMsIHJlcG9ydCAwJ3MuICovCi0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWwgbWVtb3J5IGZvciBETUEgb3BlcmF0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIC8qIFRPRE86IEFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgb2YgdGhlIHNwZWNpZmllZCAqLwotICAgIC8qICAgICAgIHNpemUuIFRoaXMgaXMgdXNlZCBmb3IgYnVzIG1hc3RlciBvcGVyYXRpb25zLiBJZiB0aGlzIGlzIG5vdCAqLwotICAgIC8qICAgICAgIHN1cHBvcnRlZCBieSB0aGUgT1MsIHJldHVybiBOVUxMIGFuZCBidXMgbWFzdGVyaW5nIHdpbGwgbm90ICovCi0gICAgLyogICAgICAgYmUgdXNlZC4gKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IHNpemUsCi0gICAgaWJvb2wgY29udGlndW91cykKLXsKLSAgICAvKiBUT0RPOiBGcmVlIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCB3aXRoIFBNX2FsbG9jTG9ja2VkTWVtLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBKAotICAgIGludCBiYW5rKQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIC8qIFRPRE86IFRoaXMgZG9lcyBhIGJhbmsgc3dpdGNoIGZ1bmN0aW9uIGJ5IGNhbGxpbmcgdGhlIHJlYWwgbW9kZSAqLwotICAgIC8qICAgICAgIFZFU0EgQklPUy4gSWYgeW91IGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCAqLwotICAgIC8qICAgICAgIGJlIGVtcHR5LiAqLwotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLnguYnggPSAweDAwMDA7Ci0gICAgcmVncy54LmR4ID0gYmFuazsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoCi0gICAgaW50IGJhbmspCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgLyogVE9ETzogVGhpcyBkb2VzIGEgYmFuayBzd2l0Y2ggZnVuY3Rpb24gYnkgY2FsbGluZyB0aGUgcmVhbCBtb2RlICovCi0gICAgLyogICAgICAgVkVTQSBCSU9TLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkICovCi0gICAgLyogICAgICAgYmUgZW1wdHkuICovCi0gICAgcmVncy54LmF4ID0gMHg0RjA1OwotICAgIHJlZ3MueC5ieCA9IDB4MDAwMDsKLSAgICByZWdzLnguZHggPSBiYW5rOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLnguYnggPSAweDAwMDE7Ci0gICAgcmVncy54LmR4ID0gYmFuazsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgc3RhcnQgYWRkcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIGludCB3YWl0VlJUKQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIC8qIFRPRE86IFRoaXMgY2hhbmdlcyB0aGUgZGlzcGxheSBzdGFydCBhZGRyZXNzIGJ5IGNhbGxpbmcgdGhlIHJlYWwgbW9kZSAqLwotICAgIC8qICAgICAgIFZFU0EgQklPUy4gSWYgeW91IGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uICovCi0gICAgLyogICAgICAgc2hvdWxkIGJlIGVtcHR5LiAqLwotICAgIHJlZ3MueC5heCA9IDB4NEYwNzsKLSAgICByZWdzLnguYnggPSB3YWl0VlJUOwotICAgIHJlZ3MueC5jeCA9IHg7Ci0gICAgcmVncy54LmR4ID0geTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgbWVtb3J5IHJlZ2lvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWludCB0eXBlKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGVuYWJsZSBQZW50aXVtIFBybyBhbmQgUGVudGl1bSBJSSBNVFJSICovCi0gICAgLyogICAgICAgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgcGFzc2VkIGluIHBoeXNpY2FsIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSAgICAvKiAgICAgICBhbmQgbGVuZ3RoLiBOb3JtYWxseSB0aGlzIGlzIGRvbmUgdmlhIGNhbGxzIHRvIGFuIE9TIHNwZWNpZmljICovCi0gICAgLyogICAgICAgZGV2aWNlIGRyaXZlciBhcyB0aGlzIGNhbiBvbmx5IGJlIGRvbmUgYXQgcmluZyAwLiAqLwotICAgIC8qICovCi0gICAgLyogTk9URTogVGhpcyBpcyBhICp2ZXJ5KiBpbXBvcnRhbnQgZnVuY3Rpb24gdG8gaW1wbGVtZW50ISBJZiB5b3UgZG8gKi8KLSAgICAvKiAgICAgICBub3QgaW1wbGVtZW50LCBncmFwaGljcyBwZXJmb3JtYW5jZSBvbiB0aGUgbGF0ZXN0IEludGVsIGNoaXBzICovCi0gICAgLyogICAgICAgd2lsbCBiZSBzZXZlcmx5IGltcGFpcmVkLiBGb3Igc2FtcGxlIGNvZGUgdGhhdCBjYW4gYmUgdXNlZCAqLwotICAgIC8qICAgICAgIGRpcmVjdGx5IGluIGEgcmluZyAwIGRldmljZSBkcml2ZXIsIHNlZSB0aGUgTVNET1MgaW1wbGVtZW50YXRpb24gKi8KLSAgICAvKiAgICAgICB3aGljaCBpbmNsdWRlcyBhc3NlbWJsZXIgY29kZSB0byBkbyB0aGlzIGRpcmVjdGx5IChpZiB0aGUgKi8KLSAgICAvKiAgICAgICBwcm9ncmFtIGlzIHJ1bm5pbmcgYXQgcmluZyAwKS4gKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXhlY3V0ZSB0aGUgUE9TVCBvbiB0aGUgc2Vjb25kYXJ5IEJJT1MgZm9yIGEgY29udHJvbGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUykKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcnVuIHRoZSBCSU9TIFBPU1QgY29kZSBvbiBhIHNlY29uZGFyeSAqLwotICAgIC8qICAgICAgIGNvbnRyb2xsZXIgdG8gaW5pdGlhbGlzZSBpdCBmb3IgdXNlLiBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgKi8KLSAgICAvKiAgICAgICBmb3IgbXVsdGktY29udHJvbGxlciBvcGVyYXRpb24sIGJ1dCBpdCB3aWxsIG1ha2UgaXQgYSBsb3QgKi8KLSAgICAvKiAgICAgICBtb3JlIGNvbnZlbmljZW50IGZvciBlbmQgdXNlcnMgKG90aGVyd2lzZSB0aGV5IGhhdmUgdG8gYm9vdCAqLwotICAgIC8qICAgICAgIHRoZSBzeXN0ZW0gb25jZSB3aXRoIHRoZSBzZWNvbmRhcnkgY29udHJvbGxlciBhcyBwcmltYXJ5LCBhbmQgKi8KLSAgICAvKiAgICAgICB0aGVuIGJvb3Qgd2l0aCBib3RoIGNvbnRyb2xsZXJzIGluc3RhbGxlZCkuICovCi0gICAgLyogKi8KLSAgICAvKiAgICAgICBFdmVuIGlmIHlvdSBkb24ndCBzdXBwb3J0IGZ1bGwgQklPUyBhY2Nlc3MsIGl0IHdvdWxkIGJlICovCi0gICAgLyogICAgICAgYWR2aXNlYWJsZSB0byBiZSBhYmxlIHRvIFBPU1QgdGhlIHNlY29uZGFyeSBjb250cm9sbGVycyBpbiB0aGUgKi8KLSAgICAvKiAgICAgICBzeXN0ZW0gdXNpbmcgdGhpcyBmdW5jdGlvbiBhcyBhIG1pbmltdW0gcmVxdWlyZW1lbnQuIFNvbWUgKi8KLSAgICAvKiAgICAgICBncmFwaGljcyBoYXJkd2FyZSBoYXMgcmVnaXN0ZXJzIHRoYXQgY29udGFpbiB2YWx1ZXMgdGhhdCBvbmx5ICovCi0gICAgLyogICAgICAgdGhlIEJJT1Mga25vd3MgYWJvdXQsIHdoaWNoIG1ha2VzIGJyaW5nIHVwIGEgY2FyZCBmcm9tIGNvbGQgKi8KLSAgICAvKiAgICAgICByZXNldCBkaWZmaWN1bHQgaWYgdGhlIEJJT1MgaGFzIG5vdCBQT1NUJ2VkIGl0LiAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2FkIGFuIE9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJ5IG9yIERMTC4gSWYgdGhlIE9TIGRvZXMgbm90IHN1cHBvcnQKLXNoYXJlZCBsaWJyYXJpZXMsIHNpbXBseSByZXR1cm4gTlVMTC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGxvYWQgYSBuYXRpdmUgc2hhcmVkIGxpYnJhcnkgZnJvbSBkaXNrICovCi0gICAgLyogICAgICAgZ2l2ZW4gdGhlIHBhdGggdG8gdGhlIGxpYnJhcnkuICovCi0gICAgKHZvaWQpc3pETExOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgYWRkcmVzcyBvZiBhIG5hbWVkIHByb2NlZHVyZSBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIGEgbmFtZWQgcHJvY2VkdXJlICovCi0gICAgLyogICAgICAgZnJvbSBhIG5hdGl2ZSBzaGFyZWQgbGlicmFyeS4gKi8KLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2FkIGEgc2hhcmVkIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGZyZWUgYSBwcmV2aW91c2x5IGxvYWRlZCBuYXRpdmUgc2hhcmVkIGxpYnJhcnkuICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FbmFibGUgcmVxdWVzdGVkIEkvTyBwcml2bGVkZ2UgbGV2ZWwgKHVzdWFsbHkgb25seSB0byBzZXQgdG8gYSB2YWx1ZSBvZgotMywgYW5kIHRoZW4gcmVzdG9yZSBpdCBiYWNrIGFnYWluKS4gSWYgdGhlIE9TIGlzIHByb3RlY3RlZCB0aGlzIGZ1bmN0aW9uCi1tdXN0IGJlIGltcGxlbWVudGVkIGluIG9yZGVyIHRvIGVuYWJsZSBJL08gcG9ydCBhY2Nlc3MgZm9yIHJpbmcgMwotYXBwbGljYXRpb25zLiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgSU9QTCBsZXZlbCBhY3RpdmUgYmVmb3JlCi10aGUgc3dpdGNoIG9jY3VycmVkIHNvIGl0IGNhbiBiZSBwcm9wZXJseSByZXN0b3JlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fc2V0SU9QTCgKLSAgICBpbnQgbGV2ZWwpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZW5hYmxlIElPUEwgZm9yIHRoZSB0YXNrIChpZiBJT1BMIGlzICovCi0gICAgLyogICAgICAgbm90IGFsd2F5cyBlbmFibGVkIGZvciB0aGUgYXBwIHRocm91Z2ggc29tZSBvdGhlciBtZWFucykuICovCi0gICAgcmV0dXJuIGxldmVsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgc3RhcnQgYSBkaXJlY3RvcnkgZW51bWVyYXRpb24gc2VhcmNoICovCi0gICAgLyogICAgICAgZ2l2ZW4gdGhlIGZpbGVuYW1lICh3aXRoIHdpbGRjYXJkcykuIFRoZSBkYXRhIHNob3VsZCBiZSAqLwotICAgIC8qICAgICAgIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHZvaWQgKmhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgbmV4dCBmaWxlIGluIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiAqLwotICAgIC8qICAgICAgIHNlYXJjaCBnaXZlbiB0aGUgc2VhcmNoIGNyaXRlcmlhIGRlZmluZWQgaW4gdGhlIGNhbGwgdG8gKi8KLSAgICAvKiAgICAgICBQTV9maW5kRmlyc3RGaWxlLiBUaGUgZGF0YSBzaG91bGQgYmUgY29udmVydGVkIGFuZCByZXR1cm5lZCAqLwotICAgIC8qICAgICAgIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjbG9zZSB0aGUgZmluZCBwcm9jZXNzLiBUaGlzIG1heSBkbyAqLwotICAgIC8qICAgICAgIG5vdGhpbmcgZm9yIHNvbWUgT1MnZXMuICovCi0gICAgKHZvaWQpaGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIGlmIChkcml2ZSA9PSAzKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgKHZvaWQpZHJpdmU7Ci0gICAgZ2V0Y3dkKGRpcixsZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBmaWxlICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpYXR0cmliOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUpID09IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5ZWYyYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICBiYXNlQWRkciA9IGJhc2VBZGRyOwotICAgIGJhbmtTaXplID0gYmFua1NpemU7Ci0gICAgY29kZUxlbiA9IGNvZGVMZW47Ci0gICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwZTI5Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogICoqKiBUT0RPOiBBREQgWU9VUiBPUyBFTlZJUk9OTUVOVCBOQU1FIEhFUkUgKioqCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotICAgIC8qIFRPRE86IERvIGFueSBzcGVjaWZpYyBpbnRlcm5hbCBpbml0aWFsaXNhdGlvbiBpbiBoZXJlICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX0xaVGltZXJPbigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBTdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvIGlmICovCi0gICAgLyogICAgICAgcG9zc2libGUuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgLyogVE9ETzogQ29tcHV0ZSB0aGUgbGFwIHRpbWUgYmV0d2VlbiB0aGUgY3VycmVudCB0aW1lIGFuZCB3aGVuIHRoZSAqLwotICAgIC8qICAgICAgIHRpbWVyIHdhcyBzdGFydGVkLiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0b3AgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX0xaVGltZXJPZmYoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgLyogVE9ETzogU3RvcCB0aGUgdGltZXIgY291bnRpbmcuIFNob3VsZCBiZSBhIG1hY3JvIGlmIHBvc3NpYmxlLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBpbiBtaWNyb3NlY29uZHMgYmV0d2VlbiBzdGFydCBhbmQgZW5kIHRpbWluZ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIC8qIFRPRE86IENvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBhbmQgcmV0dXJuIGl0LiBBbHdheXMgbWljcm9zZWNvbmRzLiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIGZyb20gdGhlIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZWFkIHRoZSBsb25nIHBlcmlvZCB0aW1lciBmcm9tIHRoZSBPUy4gVGhlIHJlc29sdXRpb24gb2YgdGhpcyAqLwotICAgIC8qICAgICAgIHRpbWVyIHNob3VsZCBiZSBhcm91bmQgMS8yMCBvZiBhIHNlY29uZCBmb3IgdGltaW5nIGxvbmcgKi8KLSAgICAvKiAgICAgICBwZXJpb2RzIGlmIHBvc3NpYmxlLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKLXdoZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bwotYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcwotcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0YnJrLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9hbHRicmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5MDI2Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9hbHRicmsuYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAotKiAgICAgICAgICAgICAgIGNvbnRyb2wgQy9icmVhayBpbnRlcnJ1cHQgaGFuZGxlci4gTm90ZSB0aGF0IHRoaXMKLSogICAgICAgICAgICAgICBhbHRlcm5hdGUgdmVyc2lvbiBkb2VzIG5vdCB3b3JrIHdpdGggYWxsIGV4dGVuZGVycy4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi12b2xhdGlsZSBpbnQgYnJlYWtIaXQgPSBmYWxzZTsKLXZvbGF0aWxlIGludCBjdHJsQ0hpdCA9IGZhbHNlOwotCi0jcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLwotCi12b2lkIFBNQVBJIGJyZWFrSGFuZGxlcih1aW50IGJIaXQpCi17Ci0gICAgaWYgKGJIaXQpCi0JYnJlYWtIaXQgPSB0cnVlOwotICAgIGVsc2UKLQljdHJsQ0hpdCA9IHRydWU7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKGJyZWFrSGFuZGxlcik7Ci0gICAgcHJpbnRmKCJDb250cm9sIEMvQnJlYWsgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkXG4iKTsKLSAgICB3aGlsZSAoMSkgewotCWlmIChjdHJsQ0hpdCkgewotCSAgICBwcmludGYoIkNvZGUgdGVybWltYXRlZCB3aXRoIEN0cmwtQy5cbiIpOwotCSAgICBicmVhazsKLQkgICAgfQotCWlmIChicmVha0hpdCkgewotCSAgICBwcmludGYoIkNvZGUgdGVybWltYXRlZCB3aXRoIEN0cmwtQnJlYWsuXG4iKTsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAoUE1fa2JoaXQoKSAmJiBQTV9nZXRjaCgpID09IDB4MUIpIHsKLQkgICAgcHJpbnRmKCJObyBicmVhayBjb2RlIGRldGVjdGVkIVxuIik7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JcHJpbnRmKCJIaXQgQ3RybC1DIG9yIEN0cmwtQnJlYWsgdG8gZXhpdCFcbiIpOwotCX0KLQotICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2FsdGNyaXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2FsdGNyaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzNzMwNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9hbHRjcml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKLSogICAgICAgICAgICAgICBjcml0aWNhbCBlcnJvciBoYW5kbGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jcml0aWNhbEVycm9yKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIoKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdm9sYXRpbGUgdWludCBjcml0aWNhbEVycm9yID0gZmFsc2U7Ci12b2xhdGlsZSB1aW50IGF4VmFsdWU7Ci12b2xhdGlsZSB1aW50IGRpVmFsdWU7Ci0KLSNwcmFnbWEgb2ZmIChjaGVja19zdGFjaykgICAgICAgICAgIC8qIE5vIHN0YWNrIGNoZWNraW5nIHVuZGVyIFdhdGNvbSAgICovCi0KLXVpbnQgUE1BUEkgY3JpdGljYWxIYW5kbGVyKHVpbnQgYXhWYWwsdWludCBkaVZhbCkKLXsKLSAgICBjcml0aWNhbEVycm9yID0gdHJ1ZTsKLSAgICBheFZhbHVlID0gYXhWYWw7Ci0gICAgZGlWYWx1ZSA9IGRpVmFsOwotICAgIHJldHVybiAzOyAgICAgICAvKiBUZWxsIE1TLURPUyB0byBmYWlsIHRoZSBvcGVyYXRpb24gKi8KLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBGSUxFICAgICpmOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKGNyaXRpY2FsSGFuZGxlcik7Ci0gICAgcHJpbnRmKCJDcml0aWNhbCBFcnJvciBoYW5kbGVyIGluc3RhbGxlZCAtIHRyeWluZyB0byByZWFkIGZyb20gQTogZHJpdmUuLi5cbiIpOwotICAgIGYgPSBmb3BlbigiYTpcYm9nLmJvZyIsInJiIik7Ci0gICAgaWYgKGYpIGZjbG9zZShmKTsKLSAgICBpZiAoY3JpdGljYWxFcnJvcikgewotCXByaW50ZigiQ3JpdGljYWwgZXJyb3Igb2NjdXJlZCBvbiBJTlQgMjFoIGZ1bmN0aW9uICUwMlghXG4iLAotCSAgICBheFZhbHVlID4+IDgpOwotCX0KLSAgICBlbHNlCi0JcHJpbnRmKCJDcml0aWNhbCBlcnJvciB3YXMgbm90IGNhdWdodCFcbiIpOwotICAgIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jpb3NwdHIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jpb3NwdHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhMzM4Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9iaW9zcHRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gbWFuaXB1bGF0ZSB0aGUKLSogICAgICAgICAgICAgICBCSU9TIGRhdGEgYXJlYSBmcm9tIHByb3RlY3RlZCBtb2RlIHVzaW5nIHRoZSBQTQotKiAgICAgICAgICAgICAgIGxpYnJhcnkuIENvbXBpbGUgYW5kIGxpbmsgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZAotKiAgICAgICAgICAgICAgIGxpbmUgZm9yIHlvdXIgRE9TIGV4dGVuZGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fZ2V0QklPU1NlbGVjdG9yKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2dldExvbmcoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fZ2V0Qnl0ZSgpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9nZXRXb3JkKCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLS8qIE1hY3JvcyB0byBvYnRhaW4gdmFsdWVzIGZyb20gdGhlIEJJT1MgZGF0YSBhcmVhICovCi0KLSNkZWZpbmUgVElDS1MoKSAgICAgUE1fZ2V0TG9uZyhiaW9zKzB4NkMpCi0jZGVmaW5lIEtCX1NUQVQgICAgIFBNX2dldEJ5dGUoYmlvcysweDE3KQotI2RlZmluZSBLQl9IRUFEICAgICBQTV9nZXRXb3JkKGJpb3MrMHgxQSkKLSNkZWZpbmUgS0JfVEFJTCAgICAgUE1fZ2V0V29yZChiaW9zKzB4MUMpCi0KLS8qIE1hY3JvcyBmb3Igd29ya2luZyB3aXRoIHRoZSBrZXlib2FyZCBidWZmZXIgKi8KLQotI2RlZmluZSBLQl9ISVQoKSAgICAoS0JfSEVBRCAhPSBLQl9UQUlMKQotI2RlZmluZSBDVFJMKCkgICAgICAoS0JfU1RBVCAmIDQpCi0jZGVmaW5lIFNISUZUKCkgICAgIChLQl9TVEFUICYgMikKLSNkZWZpbmUgRVNDICAgICAgICAgMHgxQgotCi0vKiBTZWxlY3RvciBmb3IgQklPUyBkYXRhIGFyZWEgKi8KLQotdWNoYXIgKmJpb3M7Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgaW50IGMsZG9uZSA9IDA7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIGJpb3MgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIHByaW50ZigiSGl0IGFueSBrZXkgdG8gdGVzdCwgQ3RybC1TaGlmdC1Fc2MgdG8gcXVpdFxuIik7Ci0gICAgd2hpbGUgKCFkb25lKSB7Ci0JaWYgKEtCX0hJVCgpKSB7Ci0JICAgIGMgPSBQTV9nZXRjaCgpOwotCSAgICBpZiAoYyA9PSAwKSBQTV9nZXRjaCgpOwotCSAgICBwcmludGYoIlRJTUU9JS04bFggU1Q9JTAyWCBDSEFSPSUwMlggIiwgVElDS1MoKSwgS0JfU1RBVCwgYyk7Ci0JICAgIHByaW50ZigiXG4iKTsKLQkgICAgaWYgKChjID09IEVTQykgJiYgU0hJRlQoKSAmJiBDVFJMKCkpLyogQ3RybC1TaGlmdC1Fc2MgKi8KLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jsb2NrLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9ibG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQ1MDNjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gZm9yIHRoZSBQTV9ibG9ja1VudGlsVGltZW91dCBmdW5jdGlvbi4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLSNkZWZpbmUgREVMQVlfTVNFQ1MgMTEwMAotI2RlZmluZSBMT09QUyAgICAgICA1Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZSB0YWtlcyBhIGxvbmcgY291bnQgaW4gbWljcm9zZWNvbmRzIGFuZCBvdXRwdXRzCi0gKiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50IGluIHNlY29uZHMuIEl0IGNvdWxkIGJlIG1vZGlmaWVkIHRvCi0gKiByZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RhdGljIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50IHJhdGhlcgotICogdGhhbiBwcmludGluZyBpdCBvdXQuCi0gKi8KLQotdm9pZCBSZXBvcnRUaW1lKHVsb25nIGNvdW50KQotewotICAgIHVsb25nICAgc2VjczsKLQotICAgIHNlY3MgPSBjb3VudCAvIDEwMDAwMDBMOwotICAgIGNvdW50ID0gY291bnQgLSBzZWNzICogMTAwMDAwMEw7Ci0gICAgcHJpbnRmKCJUaW1lIHRha2VuOiAlbHUuJTA2bHUgc2Vjb25kc1xuIixzZWNzLGNvdW50KTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIHByaW50ZigiRGV0ZWN0aW5nIHByb2Nlc3NvciBpbmZvcm1hdGlvbiAuLi4iKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICBwcmludGYoIlxuXG4lc1xuIiwgQ1BVX2dldFByb2Nlc3Nvck5hbWUoKSk7Ci0gICAgWlRpbWVySW5pdCgpOwotICAgIExaVGltZXJPbigpOwotICAgIGZvciAoaSA9IDA7IGkgPCBMT09QUzsgaSsrKSB7Ci0JUE1fYmxvY2tVbnRpbFRpbWVvdXQoREVMQVlfTVNFQ1MpOwotCVJlcG9ydFRpbWUoTFpUaW1lckxhcCgpKTsKLQl9Ci0gICAgTFpUaW1lck9mZigpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYnJrLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9icmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiNjQ0Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9icmsuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAotKiAgICAgICAgICAgICAgIGNvbnRyb2wgQy9icmVhayBpbnRlcnJ1cHQgaGFuZGxlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2luc3RhbGxCcmVha0hhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fY3RybENIaXQoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fY3RybEJyZWFrSGl0KCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIFBNX2luc3RhbGxCcmVha0hhbmRsZXIoKTsKLSAgICBwcmludGYoIkNvbnRyb2wgQy9CcmVhayBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWRcbiIpOwotICAgIHdoaWxlICgxKSB7Ci0JaWYgKFBNX2N0cmxDSGl0KDEpKSB7Ci0JICAgIHByaW50ZigiQ29kZSB0ZXJtaW1hdGVkIHdpdGggQ3RybC1DLlxuIik7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JaWYgKFBNX2N0cmxCcmVha0hpdCgxKSkgewotCSAgICBwcmludGYoIkNvZGUgdGVybWltYXRlZCB3aXRoIEN0cmwtQnJlYWsuXG4iKTsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAoUE1fa2JoaXQoKSAmJiBQTV9nZXRjaCgpID09IDB4MUIpIHsKLQkgICAgcHJpbnRmKCJObyBicmVhayBjb2RlIGRldGVjdGVkIVxuIik7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JcHJpbnRmKCJIaXQgQ3RybC1DIG9yIEN0cmwtQnJlYWsgdG8gZXhpdCFcbiIpOwotCX0KLQotICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NhbGxyZWFsLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jYWxscmVhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM3Y2FiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NhbGxyZWFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGNhbGwgYSByZWFsIG1vZGUKLSogICAgICAgICAgICAgICBwcm9jZWR1cmUuIFdlIHNpbXBseSBjb3B5IGEgdGVycmlibHkgc2ltcGxlIGFzc2VtYmx5Ci0qICAgICAgICAgICAgICAgbGFuZ3VhZ2Ugcm91dGluZSBpbnRvIGEgcmVhbCBtb2RlIGJsb2NrIHRoYXQgd2UgYWxsb2NhdGUsCi0qICAgICAgICAgICAgICAgYW5kIHRoZW4gYXR0ZW1wdCB0byBjYWxsIHRoZSByb3V0aW5lIGFuZCB2ZXJpZnkgdGhhdCBpdAotKiAgICAgICAgICAgICAgIHdhcyBzdWNjZXNzZnVsLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fYWxsb2NSZWFsU2VnKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2ZyZWVSZWFsU2VnKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2NhbGxSZWFsTW9kZSgpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi0vKiBCbG9jayBvZiByZWFsIG1vZGUgY29kZSB3ZSB3aWxsIGV2ZW50dWFsbHkgY2FsbCAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciByZWFsTW9kZUNvZGVbXSA9IHsKLSAgICAweDkzLCAgICAgICAgICAgLyogIHhjaGcgICAgYXgsYnggICAqLwotICAgIDB4ODcsIDB4Q0EsICAgICAvKiAgeGNoZyAgICBjeCxkeCAgICovCi0gICAgMHhDQiAgICAgICAgICAgIC8qICByZXRmICAgICAgICAgICAgKi8KLSAgICB9OwotCi1pbnQgbWFpbih2b2lkKQotewotICAgIFJNUkVHUyAgICAgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgICAgICBzcmVnczsKLSAgICB1Y2hhciAgICAgICAgICAgKnA7Ci0gICAgdW5zaWduZWQgICAgICAgIHJfc2VnLHJfb2ZmOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICAvKiBBbGxvY2F0ZSBhIHRoZSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5ICovCi0gICAgaWYgKChwID0gUE1fYWxsb2NSZWFsU2VnKHNpemVvZihyZWFsTW9kZUNvZGUpLCAmcl9zZWcsICZyX29mZikpID09IE5VTEwpIHsKLQlwcmludGYoIlVuYWJsZSB0byBhbGxvY2F0ZSByZWFsIG1vZGUgbWVtb3J5IVxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0KLSAgICAvKiBDb3B5IHRoZSByZWFsIG1vZGUgY29kZSAqLwotICAgIG1lbWNweShwLHJlYWxNb2RlQ29kZSxzaXplb2YocmVhbE1vZGVDb2RlKSk7Ci0KLSAgICAvKiBOb3cgY2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUgKi8KLSAgICByZWdzLnguYXggPSAxOwotICAgIHJlZ3MueC5ieCA9IDI7Ci0gICAgcmVncy54LmN4ID0gMzsKLSAgICByZWdzLnguZHggPSA0OwotICAgIHJlZ3MueC5zaSA9IDU7Ci0gICAgcmVncy54LmRpID0gNjsKLSAgICBzcmVncy5lcyA9IDc7Ci0gICAgc3JlZ3MuZHMgPSA4OwotICAgIFBNX2NhbGxSZWFsTW9kZShyX3NlZyxyX29mZiwmcmVncywmc3JlZ3MpOwotICAgIGlmIChyZWdzLnguYXggIT0gMiB8fCByZWdzLnguYnggIT0gMSB8fCByZWdzLnguY3ggIT0gNCB8fCByZWdzLnguZHggIT0gMwotCSAgICB8fCByZWdzLnguc2kgIT0gNSB8fCByZWdzLnguZGkgIT0gNiB8fCBzcmVncy5lcyAhPSA3Ci0JICAgIHx8IHNyZWdzLmRzICE9IDgpIHsKLQlwcmludGYoIlJlYWwgbW9kZSBjYWxsIGZhaWxlZCFcbiIpOwotCXByaW50ZigiXG4iKTsKLQlwcmludGYoImF4ID0gJTA0WCwgYnggPSAlMDRYLCBjeCA9ICUwNFgsIGR4ID0gJTA0WFxuIiwKLQkgICAgcmVncy54LmF4LHJlZ3MueC5ieCxyZWdzLnguY3gscmVncy54LmR4KTsKLQlwcmludGYoInNpID0gJTA0WCwgZGkgPSAlMDRYLCBlcyA9ICUwNFgsIGRzID0gJTA0WFxuIiwKLQkgICAgcmVncy54LnNpLHJlZ3MueC5kaSxzcmVncy5lcyxzcmVncy5kcyk7Ci0JfQotICAgIGVsc2UKLQlwcmludGYoIlJlYWwgbW9kZSBjYWxsIHN1Y2NlZWRlZCFcbiIpOwotCi0gICAgLyogRnJlZSB0aGUgbWVtb3J5IHdlIGFsbG9jYXRlZCAqLwotICAgIFBNX2ZyZWVSZWFsU2VnKHApOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2hlY2tzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jaGVja3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzM2FjOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jaGVja3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNYWluIG1vZHVsZSBmb3IgYnVpbGRpbmcgY2hlY2tlZCBidWlsZHMgb2YgcHJvZHVjdHMgd2l0aAotKiAgICAgICAgICAgICAgIGFzc2VydGlvbnMgYW5kIHRyYWNlIGNvZGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic2NpdGVjaC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZkZWYgIF9fV0lORE9XU19fCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNkZWZpbmUgU1RSSUNUCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLSNpZmRlZiAgQ0hFQ0tFRAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIExPR0ZJTEUgIlxcc2NpdGVjaC5sb2ciCi0KLXZvaWQgKCpfQ0hLX2ZhaWwpKGludCBmYXRhbCxjb25zdCBjaGFyICptc2csY29uc3QgY2hhciAqY29uZCxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKSA9IF9DSEtfZGVmYXVsdEZhaWw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUhhbmRsZXMgZmF0YWwgZXJyb3IgYW5kIHdhcm5pbmcgY29uZGl0aW9ucyBmb3IgY2hlY2tlZCBidWlsZHMuCi0KLUhFQURFUjoKLXNjaXRlY2guaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaW5saW5lIGNoZWNrIG9yIHdhcm5pbmcgZmFpbHMgaW4gYW55Ci1vZiB0aGUgU2NpVGVjaCBydW50aW1lIGxpYnJhcmllcy4gV2FybmluZyBjb25kaXRpb25zIHNpbXBseSBjYXVzZSB0aGUKLWNvbmRpdGlvbiB0byBiZSBsb2dnZWQgdG8gdGhlIGxvZyBmaWxlIGFuZCBzZW5kIHRvIHRoZSBzeXN0ZW0gZGVidWdnZXIKLXVuZGVyIFdpbmRvdy4gRmF0YWwgZXJyb3IgY29uZGl0aW9ucyBkbyBhbGwgb2YgdGhlIGFib3ZlLCBhbmQgdGhlbgotdGVybWluYXRlIHRoZSBwcm9ncmFtIHdpdGggYSBmYXRhbCBlcnJvciBjb25kaXRpb25zLgotCi1UaGlzIGhhbmRsZXIgbWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgdXNlciBjb2RlIGlmIG5lY2Vzc2FyeSB0byByZXBsYWNlIGl0Ci13aXRoIGEgZGlmZmVyZW50IGhhbmRsZXIgKHRoZSBNR0wgZm9yIGluc3RhbmNlIG92ZXJyaWRlcyB0aGlzIGFuZCByZXBsYWNlcwotaXQgd2l0aCBhIGhhbmRsZXIgdGhhdCBkb2VzIGFuIE1HTF9leGl0KCkgYmVmb3JlIHRlcm1pbmF0aW5nIHRoZSBhcHBsaWNhdGlvbgotc28gdGhhdCBpdCB3aWxsIGNsZWFuIHVwIGNvcnJlY3RseS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9DSEtfZGVmYXVsdEZhaWwoCi0gICAgaW50IGZhdGFsLAotICAgIGNvbnN0IGNoYXIgKm1zZywKLSAgICBjb25zdCBjaGFyICpjb25kLAotICAgIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgaW50IGxpbmUpCi17Ci0gICAgY2hhciAgICBidWZbMjU2XTsKLSAgICBGSUxFICAgICpsb2cgPSBmb3BlbihMT0dGSUxFLCAiYXQrIik7Ci0KLSAgICBzcHJpbnRmKGJ1Zixtc2csY29uZCxmaWxlLGxpbmUpOwotICAgIGlmIChsb2cpIHsKLQlmcHV0cyhidWYsbG9nKTsKLQlmZmx1c2gobG9nKTsKLQlmY2xvc2UobG9nKTsKLSNpZmRlZiAgX19XSU5ET1dTX18KLQlPdXRwdXREZWJ1Z1N0cihidWYpOwotI2VuZGlmCi0JfQotICAgIGlmIChmYXRhbCkgewotI2lmZGVmICBfX1dJTkRPV1NfXwotCU1lc3NhZ2VCb3goTlVMTCwgYnVmLCJGYXRhbCBFcnJvciEiLE1CX0lDT05FWENMQU1BVElPTik7Ci0jZWxzZQotCWZwdXRzKGJ1ZixzdGRlcnIpOwotI2VuZGlmCi0JZXhpdCgtMSk7Ci0JfQotfQotCi0jZW5kaWYgIC8qIENIRUNLRUQgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NwdS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY3B1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTVkZDMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY3B1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIGNvZGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAienRpbWVyLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQgbWFpbih2b2lkKQotewotICAgIHByaW50ZigiRGV0ZWN0aW5nIHByb2Nlc3NvciBpbmZvcm1hdGlvbiAuLi4iKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICBwcmludGYoIlxuXG4lc1xuIiwgQ1BVX2dldFByb2Nlc3Nvck5hbWUoKSk7Ci0gICAgaWYgKENQVV9oYXZlUkRUU0MoKSkKLQlwcmludGYoIlxuUHJvY2Vzc29yIHN1cHBvcnRzIFJlYWQgVGltZSBTdGFtcCBDb3VudGVyIHBlcmZvcm1hbmNlIHRpbWVyLlxuIik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcml0aWNhbC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY3JpdGljYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmMTI1MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcml0aWNhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCi0qICAgICAgICAgICAgICAgY3JpdGljYWwgZXJyb3IgaGFuZGxlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcigpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIEZJTEUgICAgKmY7Ci0gICAgaW50ICAgICBheGNvZGUsZGljb2RlOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKCk7Ci0gICAgcHJpbnRmKCJDcml0aWNhbCBFcnJvciBoYW5kbGVyIGluc3RhbGxlZCAtIHRyeWluZyB0byByZWFkIGZyb20gQTogZHJpdmUuLi5cbiIpOwotICAgIGYgPSBmb3BlbigiYTpcYm9nLmJvZyIsInJiIik7Ci0gICAgaWYgKGYpIGZjbG9zZShmKTsKLSAgICBpZiAoUE1fY3JpdGljYWxFcnJvcigmYXhjb2RlLCZkaWNvZGUsMSkpIHsKLQlwcmludGYoIkNyaXRpY2FsIGVycm9yIG9jY3VyZWQgb24gSU5UIDIxaCBmdW5jdGlvbiAlMDJYIVxuIiwKLQkgICAgYXhjb2RlID4+IDgpOwotCX0KLSAgICBlbHNlIHByaW50ZigiQ3JpdGljYWwgZXJyb3Igd2FzIG5vdCBjYXVnaHQhXG4iKTsKLSAgICBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9nZXRjaC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvZ2V0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZjMjE4MC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9nZXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byB0ZXN0IG91dCB0aGUgY3Jvc3MgcGxhdGZvcm0gZXZlbnQgaGFuZGxpbmcKLSogICAgICAgICAgICAgICBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImV2ZW50LmgiCi0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGZvciBrZXkgY29kZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgY29kZTsKLSAgICBjaGFyICAgICpuYW1lOwotICAgIH0gS2V5RW50cnk7Ci0KLUtleUVudHJ5IEFTQ0lJQ29kZXNbXSA9IHsKLSAgICB7QVNDSUlfY3RybEEgICAgICAgICAgICAsIkFTQ0lJX2N0cmxBIn0sCi0gICAge0FTQ0lJX2N0cmxCICAgICAgICAgICAgLCJBU0NJSV9jdHJsQiJ9LAotICAgIHtBU0NJSV9jdHJsQyAgICAgICAgICAgICwiQVNDSUlfY3RybEMifSwKLSAgICB7QVNDSUlfY3RybEQgICAgICAgICAgICAsIkFTQ0lJX2N0cmxEIn0sCi0gICAge0FTQ0lJX2N0cmxFICAgICAgICAgICAgLCJBU0NJSV9jdHJsRSJ9LAotICAgIHtBU0NJSV9jdHJsRiAgICAgICAgICAgICwiQVNDSUlfY3RybEYifSwKLSAgICB7QVNDSUlfY3RybEcgICAgICAgICAgICAsIkFTQ0lJX2N0cmxHIn0sCi0gICAge0FTQ0lJX2JhY2tzcGFjZSAgICAgICAgLCJBU0NJSV9iYWNrc3BhY2UifSwKLSAgICB7QVNDSUlfY3RybEggICAgICAgICAgICAsIkFTQ0lJX2N0cmxIIn0sCi0gICAge0FTQ0lJX3RhYiAgICAgICAgICAgICAgLCJBU0NJSV90YWIifSwKLSAgICB7QVNDSUlfY3RybEkgICAgICAgICAgICAsIkFTQ0lJX2N0cmxJIn0sCi0gICAge0FTQ0lJX2N0cmxKICAgICAgICAgICAgLCJBU0NJSV9jdHJsSiJ9LAotICAgIHtBU0NJSV9jdHJsSyAgICAgICAgICAgICwiQVNDSUlfY3RybEsifSwKLSAgICB7QVNDSUlfY3RybEwgICAgICAgICAgICAsIkFTQ0lJX2N0cmxMIn0sCi0gICAge0FTQ0lJX2VudGVyICAgICAgICAgICAgLCJBU0NJSV9lbnRlciJ9LAotICAgIHtBU0NJSV9jdHJsTSAgICAgICAgICAgICwiQVNDSUlfY3RybE0ifSwKLSAgICB7QVNDSUlfY3RybE4gICAgICAgICAgICAsIkFTQ0lJX2N0cmxOIn0sCi0gICAge0FTQ0lJX2N0cmxPICAgICAgICAgICAgLCJBU0NJSV9jdHJsTyJ9LAotICAgIHtBU0NJSV9jdHJsUCAgICAgICAgICAgICwiQVNDSUlfY3RybFAifSwKLSAgICB7QVNDSUlfY3RybFEgICAgICAgICAgICAsIkFTQ0lJX2N0cmxRIn0sCi0gICAge0FTQ0lJX2N0cmxSICAgICAgICAgICAgLCJBU0NJSV9jdHJsUiJ9LAotICAgIHtBU0NJSV9jdHJsUyAgICAgICAgICAgICwiQVNDSUlfY3RybFMifSwKLSAgICB7QVNDSUlfY3RybFQgICAgICAgICAgICAsIkFTQ0lJX2N0cmxUIn0sCi0gICAge0FTQ0lJX2N0cmxVICAgICAgICAgICAgLCJBU0NJSV9jdHJsVSJ9LAotICAgIHtBU0NJSV9jdHJsViAgICAgICAgICAgICwiQVNDSUlfY3RybFYifSwKLSAgICB7QVNDSUlfY3RybFcgICAgICAgICAgICAsIkFTQ0lJX2N0cmxXIn0sCi0gICAge0FTQ0lJX2N0cmxYICAgICAgICAgICAgLCJBU0NJSV9jdHJsWCJ9LAotICAgIHtBU0NJSV9jdHJsWSAgICAgICAgICAgICwiQVNDSUlfY3RybFkifSwKLSAgICB7QVNDSUlfY3RybFogICAgICAgICAgICAsIkFTQ0lJX2N0cmxaIn0sCi0gICAge0FTQ0lJX2VzYyAgICAgICAgICAgICAgLCJBU0NJSV9lc2MifSwKLSAgICB7QVNDSUlfc3BhY2UgICAgICAgICAgICAsIkFTQ0lJX3NwYWNlIn0sCi0gICAge0FTQ0lJX2V4Y2xhbWF0aW9uICAgICAgLCJBU0NJSV9leGNsYW1hdGlvbiJ9LAotICAgIHtBU0NJSV9xdW90ZSAgICAgICAgICAgICwiQVNDSUlfcXVvdGUifSwKLSAgICB7QVNDSUlfcG91bmQgICAgICAgICAgICAsIkFTQ0lJX3BvdW5kIn0sCi0gICAge0FTQ0lJX2RvbGxhciAgICAgICAgICAgLCJBU0NJSV9kb2xsYXIifSwKLSAgICB7QVNDSUlfcGVyY2VudCAgICAgICAgICAsIkFTQ0lJX3BlcmNlbnQifSwKLSAgICB7QVNDSUlfYW1wZXJzYW5kICAgICAgICAsIkFTQ0lJX2FtcGVyc2FuZCJ9LAotICAgIHtBU0NJSV9hcG9zdHJvcGhlICAgICAgICwiQVNDSUlfYXBvc3Ryb3BoZSJ9LAotICAgIHtBU0NJSV9sZWZ0QnJhY2UgICAgICAgICwiQVNDSUlfbGVmdEJyYWNlIn0sCi0gICAge0FTQ0lJX3JpZ2h0QnJhY2UgICAgICAgLCJBU0NJSV9yaWdodEJyYWNlIn0sCi0gICAge0FTQ0lJX3RpbWVzICAgICAgICAgICAgLCJBU0NJSV90aW1lcyJ9LAotICAgIHtBU0NJSV9wbHVzICAgICAgICAgICAgICwiQVNDSUlfcGx1cyJ9LAotICAgIHtBU0NJSV9jb21tYSAgICAgICAgICAgICwiQVNDSUlfY29tbWEifSwKLSAgICB7QVNDSUlfbWludXMgICAgICAgICAgICAsIkFTQ0lJX21pbnVzIn0sCi0gICAge0FTQ0lJX3BlcmlvZCAgICAgICAgICAgLCJBU0NJSV9wZXJpb2QifSwKLSAgICB7QVNDSUlfZGl2aWRlICAgICAgICAgICAsIkFTQ0lJX2RpdmlkZSJ9LAotICAgIHtBU0NJSV8wICAgICAgICAgICAgICAgICwiQVNDSUlfMCJ9LAotICAgIHtBU0NJSV8xICAgICAgICAgICAgICAgICwiQVNDSUlfMSJ9LAotICAgIHtBU0NJSV8yICAgICAgICAgICAgICAgICwiQVNDSUlfMiJ9LAotICAgIHtBU0NJSV8zICAgICAgICAgICAgICAgICwiQVNDSUlfMyJ9LAotICAgIHtBU0NJSV80ICAgICAgICAgICAgICAgICwiQVNDSUlfNCJ9LAotICAgIHtBU0NJSV81ICAgICAgICAgICAgICAgICwiQVNDSUlfNSJ9LAotICAgIHtBU0NJSV82ICAgICAgICAgICAgICAgICwiQVNDSUlfNiJ9LAotICAgIHtBU0NJSV83ICAgICAgICAgICAgICAgICwiQVNDSUlfNyJ9LAotICAgIHtBU0NJSV84ICAgICAgICAgICAgICAgICwiQVNDSUlfOCJ9LAotICAgIHtBU0NJSV85ICAgICAgICAgICAgICAgICwiQVNDSUlfOSJ9LAotICAgIHtBU0NJSV9jb2xvbiAgICAgICAgICAgICwiQVNDSUlfY29sb24ifSwKLSAgICB7QVNDSUlfc2VtaWNvbG9uICAgICAgICAsIkFTQ0lJX3NlbWljb2xvbiJ9LAotICAgIHtBU0NJSV9sZXNzVGhhbiAgICAgICAgICwiQVNDSUlfbGVzc1RoYW4ifSwKLSAgICB7QVNDSUlfZXF1YWxzICAgICAgICAgICAsIkFTQ0lJX2VxdWFscyJ9LAotICAgIHtBU0NJSV9ncmVhdGVyVGhhbiAgICAgICwiQVNDSUlfZ3JlYXRlclRoYW4ifSwKLSAgICB7QVNDSUlfcXVlc3Rpb24gICAgICAgICAsIkFTQ0lJX3F1ZXN0aW9uIn0sCi0gICAge0FTQ0lJX2F0ICAgICAgICAgICAgICAgLCJBU0NJSV9hdCJ9LAotICAgIHtBU0NJSV9BICAgICAgICAgICAgICAgICwiQVNDSUlfQSJ9LAotICAgIHtBU0NJSV9CICAgICAgICAgICAgICAgICwiQVNDSUlfQiJ9LAotICAgIHtBU0NJSV9DICAgICAgICAgICAgICAgICwiQVNDSUlfQyJ9LAotICAgIHtBU0NJSV9EICAgICAgICAgICAgICAgICwiQVNDSUlfRCJ9LAotICAgIHtBU0NJSV9FICAgICAgICAgICAgICAgICwiQVNDSUlfRSJ9LAotICAgIHtBU0NJSV9GICAgICAgICAgICAgICAgICwiQVNDSUlfRiJ9LAotICAgIHtBU0NJSV9HICAgICAgICAgICAgICAgICwiQVNDSUlfRyJ9LAotICAgIHtBU0NJSV9IICAgICAgICAgICAgICAgICwiQVNDSUlfSCJ9LAotICAgIHtBU0NJSV9JICAgICAgICAgICAgICAgICwiQVNDSUlfSSJ9LAotICAgIHtBU0NJSV9KICAgICAgICAgICAgICAgICwiQVNDSUlfSiJ9LAotICAgIHtBU0NJSV9LICAgICAgICAgICAgICAgICwiQVNDSUlfSyJ9LAotICAgIHtBU0NJSV9MICAgICAgICAgICAgICAgICwiQVNDSUlfTCJ9LAotICAgIHtBU0NJSV9NICAgICAgICAgICAgICAgICwiQVNDSUlfTSJ9LAotICAgIHtBU0NJSV9OICAgICAgICAgICAgICAgICwiQVNDSUlfTiJ9LAotICAgIHtBU0NJSV9PICAgICAgICAgICAgICAgICwiQVNDSUlfTyJ9LAotICAgIHtBU0NJSV9QICAgICAgICAgICAgICAgICwiQVNDSUlfUCJ9LAotICAgIHtBU0NJSV9RICAgICAgICAgICAgICAgICwiQVNDSUlfUSJ9LAotICAgIHtBU0NJSV9SICAgICAgICAgICAgICAgICwiQVNDSUlfUiJ9LAotICAgIHtBU0NJSV9TICAgICAgICAgICAgICAgICwiQVNDSUlfUyJ9LAotICAgIHtBU0NJSV9UICAgICAgICAgICAgICAgICwiQVNDSUlfVCJ9LAotICAgIHtBU0NJSV9VICAgICAgICAgICAgICAgICwiQVNDSUlfVSJ9LAotICAgIHtBU0NJSV9WICAgICAgICAgICAgICAgICwiQVNDSUlfViJ9LAotICAgIHtBU0NJSV9XICAgICAgICAgICAgICAgICwiQVNDSUlfVyJ9LAotICAgIHtBU0NJSV9YICAgICAgICAgICAgICAgICwiQVNDSUlfWCJ9LAotICAgIHtBU0NJSV9ZICAgICAgICAgICAgICAgICwiQVNDSUlfWSJ9LAotICAgIHtBU0NJSV9aICAgICAgICAgICAgICAgICwiQVNDSUlfWiJ9LAotICAgIHtBU0NJSV9sZWZ0U3F1YXJlQnJhY2UgICwiQVNDSUlfbGVmdFNxdWFyZUJyYWNlIn0sCi0gICAge0FTQ0lJX2JhY2tTbGFzaCAgICAgICAgLCJBU0NJSV9iYWNrU2xhc2gifSwKLSAgICB7QVNDSUlfcmlnaHRTcXVhcmVCcmFjZSAsIkFTQ0lJX3JpZ2h0U3F1YXJlQnJhY2UifSwKLSAgICB7QVNDSUlfY2FyZXQgICAgICAgICAgICAsIkFTQ0lJX2NhcmV0In0sCi0gICAge0FTQ0lJX3VuZGVyc2NvcmUgICAgICAgLCJBU0NJSV91bmRlcnNjb3JlIn0sCi0gICAge0FTQ0lJX2xlZnRBcG9zdHJvcGhlICAgLCJBU0NJSV9sZWZ0QXBvc3Ryb3BoZSJ9LAotICAgIHtBU0NJSV9hICAgICAgICAgICAgICAgICwiQVNDSUlfYSJ9LAotICAgIHtBU0NJSV9iICAgICAgICAgICAgICAgICwiQVNDSUlfYiJ9LAotICAgIHtBU0NJSV9jICAgICAgICAgICAgICAgICwiQVNDSUlfYyJ9LAotICAgIHtBU0NJSV9kICAgICAgICAgICAgICAgICwiQVNDSUlfZCJ9LAotICAgIHtBU0NJSV9lICAgICAgICAgICAgICAgICwiQVNDSUlfZSJ9LAotICAgIHtBU0NJSV9mICAgICAgICAgICAgICAgICwiQVNDSUlfZiJ9LAotICAgIHtBU0NJSV9nICAgICAgICAgICAgICAgICwiQVNDSUlfZyJ9LAotICAgIHtBU0NJSV9oICAgICAgICAgICAgICAgICwiQVNDSUlfaCJ9LAotICAgIHtBU0NJSV9pICAgICAgICAgICAgICAgICwiQVNDSUlfaSJ9LAotICAgIHtBU0NJSV9qICAgICAgICAgICAgICAgICwiQVNDSUlfaiJ9LAotICAgIHtBU0NJSV9rICAgICAgICAgICAgICAgICwiQVNDSUlfayJ9LAotICAgIHtBU0NJSV9sICAgICAgICAgICAgICAgICwiQVNDSUlfbCJ9LAotICAgIHtBU0NJSV9tICAgICAgICAgICAgICAgICwiQVNDSUlfbSJ9LAotICAgIHtBU0NJSV9uICAgICAgICAgICAgICAgICwiQVNDSUlfbiJ9LAotICAgIHtBU0NJSV9vICAgICAgICAgICAgICAgICwiQVNDSUlfbyJ9LAotICAgIHtBU0NJSV9wICAgICAgICAgICAgICAgICwiQVNDSUlfcCJ9LAotICAgIHtBU0NJSV9xICAgICAgICAgICAgICAgICwiQVNDSUlfcSJ9LAotICAgIHtBU0NJSV9yICAgICAgICAgICAgICAgICwiQVNDSUlfciJ9LAotICAgIHtBU0NJSV9zICAgICAgICAgICAgICAgICwiQVNDSUlfcyJ9LAotICAgIHtBU0NJSV90ICAgICAgICAgICAgICAgICwiQVNDSUlfdCJ9LAotICAgIHtBU0NJSV91ICAgICAgICAgICAgICAgICwiQVNDSUlfdSJ9LAotICAgIHtBU0NJSV92ICAgICAgICAgICAgICAgICwiQVNDSUlfdiJ9LAotICAgIHtBU0NJSV93ICAgICAgICAgICAgICAgICwiQVNDSUlfdyJ9LAotICAgIHtBU0NJSV94ICAgICAgICAgICAgICAgICwiQVNDSUlfeCJ9LAotICAgIHtBU0NJSV95ICAgICAgICAgICAgICAgICwiQVNDSUlfeSJ9LAotICAgIHtBU0NJSV96ICAgICAgICAgICAgICAgICwiQVNDSUlfeiJ9LAotICAgIHtBU0NJSV9sZWZ0Q3VybHlCcmFjZSAgICwiQVNDSUlfbGVmdEN1cmx5QnJhY2UifSwKLSAgICB7QVNDSUlfdmVydGljYWxCYXIgICAgICAsIkFTQ0lJX3ZlcnRpY2FsQmFyIn0sCi0gICAge0FTQ0lJX3JpZ2h0Q3VybHlCcmFjZSAgLCJBU0NJSV9yaWdodEN1cmx5QnJhY2UifSwKLSAgICB7QVNDSUlfdGlsZGUgICAgICAgICAgICAsIkFTQ0lJX3RpbGRlIn0sCi0gICAgezAgICAgICAgICAgICAgICAgICAgICAgLCJBU0NJSV91bmtub3duIn0sCi0gICAgfTsKLQotS2V5RW50cnkgU2NhbkNvZGVzW10gPSB7Ci0gICAge0tCX3BhZEVudGVyICAgICAgICAgICAgLCJLQl9wYWRFbnRlciJ9LAotICAgIHtLQl9wYWRNaW51cyAgICAgICAgICAgICwiS0JfcGFkTWludXMifSwKLSAgICB7S0JfcGFkUGx1cyAgICAgICAgICAgICAsIktCX3BhZFBsdXMifSwKLSAgICB7S0JfcGFkVGltZXMgICAgICAgICAgICAsIktCX3BhZFRpbWVzIn0sCi0gICAge0tCX3BhZERpdmlkZSAgICAgICAgICAgLCJLQl9wYWREaXZpZGUifSwKLSAgICB7S0JfcGFkTGVmdCAgICAgICAgICAgICAsIktCX3BhZExlZnQifSwKLSAgICB7S0JfcGFkUmlnaHQgICAgICAgICAgICAsIktCX3BhZFJpZ2h0In0sCi0gICAge0tCX3BhZFVwICAgICAgICAgICAgICAgLCJLQl9wYWRVcCJ9LAotICAgIHtLQl9wYWREb3duICAgICAgICAgICAgICwiS0JfcGFkRG93biJ9LAotICAgIHtLQl9wYWRJbnNlcnQgICAgICAgICAgICwiS0JfcGFkSW5zZXJ0In0sCi0gICAge0tCX3BhZERlbGV0ZSAgICAgICAgICAgLCJLQl9wYWREZWxldGUifSwKLSAgICB7S0JfcGFkSG9tZSAgICAgICAgICAgICAsIktCX3BhZEhvbWUifSwKLSAgICB7S0JfcGFkRW5kICAgICAgICAgICAgICAsIktCX3BhZEVuZCJ9LAotICAgIHtLQl9wYWRQYWdlVXAgICAgICAgICAgICwiS0JfcGFkUGFnZVVwIn0sCi0gICAge0tCX3BhZFBhZ2VEb3duICAgICAgICAgLCJLQl9wYWRQYWdlRG93biJ9LAotICAgIHtLQl9wYWRDZW50ZXIgICAgICAgICAgICwiS0JfcGFkQ2VudGVyIn0sCi0gICAge0tCX0YxICAgICAgICAgICAgICAgICAgLCJLQl9GMSJ9LAotICAgIHtLQl9GMiAgICAgICAgICAgICAgICAgICwiS0JfRjIifSwKLSAgICB7S0JfRjMgICAgICAgICAgICAgICAgICAsIktCX0YzIn0sCi0gICAge0tCX0Y0ICAgICAgICAgICAgICAgICAgLCJLQl9GNCJ9LAotICAgIHtLQl9GNSAgICAgICAgICAgICAgICAgICwiS0JfRjUifSwKLSAgICB7S0JfRjYgICAgICAgICAgICAgICAgICAsIktCX0Y2In0sCi0gICAge0tCX0Y3ICAgICAgICAgICAgICAgICAgLCJLQl9GNyJ9LAotICAgIHtLQl9GOCAgICAgICAgICAgICAgICAgICwiS0JfRjgifSwKLSAgICB7S0JfRjkgICAgICAgICAgICAgICAgICAsIktCX0Y5In0sCi0gICAge0tCX0YxMCAgICAgICAgICAgICAgICAgLCJLQl9GMTAifSwKLSAgICB7S0JfRjExICAgICAgICAgICAgICAgICAsIktCX0YxMSJ9LAotICAgIHtLQl9GMTIgICAgICAgICAgICAgICAgICwiS0JfRjEyIn0sCi0gICAge0tCX2xlZnQgICAgICAgICAgICAgICAgLCJLQl9sZWZ0In0sCi0gICAge0tCX3JpZ2h0ICAgICAgICAgICAgICAgLCJLQl9yaWdodCJ9LAotICAgIHtLQl91cCAgICAgICAgICAgICAgICAgICwiS0JfdXAifSwKLSAgICB7S0JfZG93biAgICAgICAgICAgICAgICAsIktCX2Rvd24ifSwKLSAgICB7S0JfaW5zZXJ0ICAgICAgICAgICAgICAsIktCX2luc2VydCJ9LAotICAgIHtLQl9kZWxldGUgICAgICAgICAgICAgICwiS0JfZGVsZXRlIn0sCi0gICAge0tCX2hvbWUgICAgICAgICAgICAgICAgLCJLQl9ob21lIn0sCi0gICAge0tCX2VuZCAgICAgICAgICAgICAgICAgLCJLQl9lbmQifSwKLSAgICB7S0JfcGFnZVVwICAgICAgICAgICAgICAsIktCX3BhZ2VVcCJ9LAotICAgIHtLQl9wYWdlRG93biAgICAgICAgICAgICwiS0JfcGFnZURvd24ifSwKLSAgICB7S0JfY2Fwc0xvY2sgICAgICAgICAgICAsIktCX2NhcHNMb2NrIn0sCi0gICAge0tCX251bUxvY2sgICAgICAgICAgICAgLCJLQl9udW1Mb2NrIn0sCi0gICAge0tCX3Njcm9sbExvY2sgICAgICAgICAgLCJLQl9zY3JvbGxMb2NrIn0sCi0gICAge0tCX2xlZnRTaGlmdCAgICAgICAgICAgLCJLQl9sZWZ0U2hpZnQifSwKLSAgICB7S0JfcmlnaHRTaGlmdCAgICAgICAgICAsIktCX3JpZ2h0U2hpZnQifSwKLSAgICB7S0JfbGVmdEN0cmwgICAgICAgICAgICAsIktCX2xlZnRDdHJsIn0sCi0gICAge0tCX3JpZ2h0Q3RybCAgICAgICAgICAgLCJLQl9yaWdodEN0cmwifSwKLSAgICB7S0JfbGVmdEFsdCAgICAgICAgICAgICAsIktCX2xlZnRBbHQifSwKLSAgICB7S0JfcmlnaHRBbHQgICAgICAgICAgICAsIktCX3JpZ2h0QWx0In0sCi0gICAge0tCX2xlZnRXaW5kb3dzICAgICAgICAgLCJLQl9sZWZ0V2luZG93cyJ9LAotICAgIHtLQl9yaWdodFdpbmRvd3MgICAgICAgICwiS0JfcmlnaHRXaW5kb3dzIn0sCi0gICAge0tCX21lbnUgICAgICAgICAgICAgICAgLCJLQl9tZW51In0sCi0gICAge0tCX3N5c1JlcSAgICAgICAgICAgICAgLCJLQl9zeXNSZXEifSwKLSAgICB7S0JfZXNjICAgICAgICAgICAgICAgICAsIktCX2VzYyJ9LAotICAgIHtLQl8xICAgICAgICAgICAgICAgICAgICwiS0JfMSJ9LAotICAgIHtLQl8yICAgICAgICAgICAgICAgICAgICwiS0JfMiJ9LAotICAgIHtLQl8zICAgICAgICAgICAgICAgICAgICwiS0JfMyJ9LAotICAgIHtLQl80ICAgICAgICAgICAgICAgICAgICwiS0JfNCJ9LAotICAgIHtLQl81ICAgICAgICAgICAgICAgICAgICwiS0JfNSJ9LAotICAgIHtLQl82ICAgICAgICAgICAgICAgICAgICwiS0JfNiJ9LAotICAgIHtLQl83ICAgICAgICAgICAgICAgICAgICwiS0JfNyJ9LAotICAgIHtLQl84ICAgICAgICAgICAgICAgICAgICwiS0JfOCJ9LAotICAgIHtLQl85ICAgICAgICAgICAgICAgICAgICwiS0JfOSJ9LAotICAgIHtLQl8wICAgICAgICAgICAgICAgICAgICwiS0JfMCJ9LAotICAgIHtLQl9taW51cyAgICAgICAgICAgICAgICwiS0JfbWludXMifSwKLSAgICB7S0JfZXF1YWxzICAgICAgICAgICAgICAsIktCX2VxdWFscyJ9LAotICAgIHtLQl9iYWNrU2xhc2ggICAgICAgICAgICwiS0JfYmFja1NsYXNoIn0sCi0gICAge0tCX2JhY2tzcGFjZSAgICAgICAgICAgLCJLQl9iYWNrc3BhY2UifSwKLSAgICB7S0JfdGFiICAgICAgICAgICAgICAgICAsIktCX3RhYiJ9LAotICAgIHtLQl9RICAgICAgICAgICAgICAgICAgICwiS0JfUSJ9LAotICAgIHtLQl9XICAgICAgICAgICAgICAgICAgICwiS0JfVyJ9LAotICAgIHtLQl9FICAgICAgICAgICAgICAgICAgICwiS0JfRSJ9LAotICAgIHtLQl9SICAgICAgICAgICAgICAgICAgICwiS0JfUiJ9LAotICAgIHtLQl9UICAgICAgICAgICAgICAgICAgICwiS0JfVCJ9LAotICAgIHtLQl9ZICAgICAgICAgICAgICAgICAgICwiS0JfWSJ9LAotICAgIHtLQl9VICAgICAgICAgICAgICAgICAgICwiS0JfVSJ9LAotICAgIHtLQl9JICAgICAgICAgICAgICAgICAgICwiS0JfSSJ9LAotICAgIHtLQl9PICAgICAgICAgICAgICAgICAgICwiS0JfTyJ9LAotICAgIHtLQl9QICAgICAgICAgICAgICAgICAgICwiS0JfUCJ9LAotICAgIHtLQl9sZWZ0U3F1YXJlQnJhY2UgICAgICwiS0JfbGVmdFNxdWFyZUJyYWNlIn0sCi0gICAge0tCX3JpZ2h0U3F1YXJlQnJhY2UgICAgLCJLQl9yaWdodFNxdWFyZUJyYWNlIn0sCi0gICAge0tCX2VudGVyICAgICAgICAgICAgICAgLCJLQl9lbnRlciJ9LAotICAgIHtLQl9BICAgICAgICAgICAgICAgICAgICwiS0JfQSJ9LAotICAgIHtLQl9TICAgICAgICAgICAgICAgICAgICwiS0JfUyJ9LAotICAgIHtLQl9EICAgICAgICAgICAgICAgICAgICwiS0JfRCJ9LAotICAgIHtLQl9GICAgICAgICAgICAgICAgICAgICwiS0JfRiJ9LAotICAgIHtLQl9HICAgICAgICAgICAgICAgICAgICwiS0JfRyJ9LAotICAgIHtLQl9IICAgICAgICAgICAgICAgICAgICwiS0JfSCJ9LAotICAgIHtLQl9KICAgICAgICAgICAgICAgICAgICwiS0JfSiJ9LAotICAgIHtLQl9LICAgICAgICAgICAgICAgICAgICwiS0JfSyJ9LAotICAgIHtLQl9MICAgICAgICAgICAgICAgICAgICwiS0JfTCJ9LAotICAgIHtLQl9zZW1pY29sb24gICAgICAgICAgICwiS0Jfc2VtaWNvbG9uIn0sCi0gICAge0tCX2Fwb3N0cm9waGUgICAgICAgICAgLCJLQl9hcG9zdHJvcGhlIn0sCi0gICAge0tCX1ogICAgICAgICAgICAgICAgICAgLCJLQl9aIn0sCi0gICAge0tCX1ggICAgICAgICAgICAgICAgICAgLCJLQl9YIn0sCi0gICAge0tCX0MgICAgICAgICAgICAgICAgICAgLCJLQl9DIn0sCi0gICAge0tCX1YgICAgICAgICAgICAgICAgICAgLCJLQl9WIn0sCi0gICAge0tCX0IgICAgICAgICAgICAgICAgICAgLCJLQl9CIn0sCi0gICAge0tCX04gICAgICAgICAgICAgICAgICAgLCJLQl9OIn0sCi0gICAge0tCX00gICAgICAgICAgICAgICAgICAgLCJLQl9NIn0sCi0gICAge0tCX2NvbW1hICAgICAgICAgICAgICAgLCJLQl9jb21tYSJ9LAotICAgIHtLQl9wZXJpb2QgICAgICAgICAgICAgICwiS0JfcGVyaW9kIn0sCi0gICAge0tCX2RpdmlkZSAgICAgICAgICAgICAgLCJLQl9kaXZpZGUifSwKLSAgICB7S0Jfc3BhY2UgICAgICAgICAgICAgICAsIktCX3NwYWNlIn0sCi0gICAge0tCX3RpbGRlICAgICAgICAgICAgICAgLCJLQl90aWxkZSJ9LAotICAgIHswICAgICAgICAgICAgICAgICAgICAgICwiS0JfdW5rbm93biJ9LAotICAgIH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgoteCAgIC0gWCBjb29yZGluYXRlIG9mIHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gKHNjcmVlbiBjb29yZGluYXRlcykKLXkgICAtIFkgY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgY3Vyc29yIHBvc2l0aW9uIChzY3JlZW4gY29vcmRpbmF0ZXMpCi0KLVJFTUFSS1M6Ci1UaGlzIGdldHMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBtb3ZlIHRoZSBtb3VzZS4gSXQgd2lsbCBnZXQgY2FsbGVkIHdoZW4KLXRoZSBtb3VzZSBtYXkgbm90IGhhdmUgYWN0dWFsbHkgbW92ZWQsIHNvIGNoZWNrIGlmIGl0IGhhcyBiZWZvcmUgcmVkcmF3aW5nCi1pdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBtb3ZlTW91c2UoCi0gICAgaW50IHgsCi0gICAgaW50IHkpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotY29kZSAgICAtIENvZGUgdG8gdHJhbnNsYXRlCi1rZXlzICAgIC0gVGFibGUgb2YgdHJhbnNsYXRpb24ga2V5IHZhbHVlcyB0byBsb29rIHVwCi0KLVJFTUFSS1M6Ci1TaW1wbGUgZnVuY3Rpb24gdG8gbG9vayB1cCB0aGUgcHJpbnRhYmxlIG5hbWUgZm9yIHRoZSBrZXlib2FyZCBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUtleUVudHJ5ICpGaW5kS2V5KAotICAgIGludCBjb2RlLAotICAgIEtleUVudHJ5ICprZXlzKQotewotICAgIEtleUVudHJ5ICAgICprZXk7Ci0KLSAgICBmb3IgKGtleSA9IGtleXM7IGtleS0+Y29kZSAhPSAwOyBrZXkrKykgewotCWlmIChrZXktPmNvZGUgPT0gY29kZSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIHJldHVybiBrZXk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0IC0gRXZlbnQgdG8gZGlzcGxheSBtb2RpZmllcnMgZm9yCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkaXNwbGF5IHNoaWZ0IG1vZGlmaWVycyBmbGFncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRGlzcGxheU1vZGlmaWVycygKLSAgICBldmVudF90ICpldnQpCi17Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0xFRlRCVVQpCi0JcHJpbnRmKCIsIExCVVQiKTsKLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfUklHSFRCVVQpCi0JcHJpbnRmKCIsIFJCVVQiKTsKLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTUlERExFQlVUKQotCXByaW50ZigiLCBNQlVUIik7Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX1NISUZUS0VZKSB7Ci0JaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0xFRlRTSElGVCkKLQkgICAgcHJpbnRmKCIsIExTSElGVCIpOwotCWlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9SSUdIVFNISUZUKQotCSAgICBwcmludGYoIiwgUlNISUZUIik7Ci0JfQotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9DVFJMU1RBVEUpIHsKLQlpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTEVGVENUUkwpCi0JICAgIHByaW50ZigiLCBMQ1RSTCIpOwotCWlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9SSUdIVENUUkwpCi0JICAgIHByaW50ZigiLCBSQ1RSTCIpOwotCX0KLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfQUxUU1RBVEUpIHsKLQlpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTEVGVEFMVCkKLQkgICAgcHJpbnRmKCIsIExBTFQiKTsKLQlpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfUklHSFRBTFQpCi0JICAgIHByaW50ZigiLCBSQUxUIik7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1zZyAtIE1lc3NhZ2UgdG8gZGlzcGxheSBmb3IgdHlwZSBvZiBldmVudAotZXZ0IC0gRXZlbnQgdG8gZGlzcGxheQotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgc3RhdHVzIG9mIHRoZSBrZXlib2FyZCBldmVudCB0byB0aGUgc2NyZWVuLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRGlzcGxheUtleSgKLSAgICBjaGFyICptc2csCi0gICAgZXZlbnRfdCAqZXZ0KQotewotICAgIEtleUVudHJ5ICAgICphc2NpaSwqc2NhbjsKLSAgICBjaGFyICAgICAgICBjaCA9IEVWVF9hc2NpaUNvZGUoZXZ0LT5tZXNzYWdlKTsKLQotICAgIGFzY2lpID0gRmluZEtleShjaCxBU0NJSUNvZGVzKTsKLSAgICBzY2FuID0gRmluZEtleShFVlRfc2NhbkNvZGUoZXZ0LT5tZXNzYWdlKSxTY2FuQ29kZXMpOwotICAgIHByaW50ZigiJXM6IDB4JTA0WCAtPiAlcywgJXMsICclYyciLAotCW1zZywgKGludClldnQtPm1lc3NhZ2UgJiAweEZGRkYsIHNjYW4tPm5hbWUsIGFzY2lpLT5uYW1lLCBpc3ByaW50KGNoKSA/IGNoIDogJyAnKTsKLSAgICBEaXNwbGF5TW9kaWZpZXJzKGV2dCk7Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1zZyAtIE1lc3NhZ2UgdG8gZGlzcGxheSBmb3IgdHlwZSBvZiBldmVudAotZXZ0IC0gRXZlbnQgdG8gZGlzcGxheQotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgc3RhdHVzIG9mIHRoZSBtb3VzZSBldmVudCB0byB0aGUgc2NyZWVuLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRGlzcGxheU1vdXNlKAotICAgIGNoYXIgKm1zZywKLSAgICBldmVudF90ICpldnQpCi17Ci0gICAgcHJpbnRmKCIlczogIiwgbXNnKTsKLSAgICBpZiAoZXZ0LT5tZXNzYWdlICYgRVZUX0xFRlRCTUFTSykKLQlwcmludGYoIkxFRlQgIik7Ci0gICAgaWYgKGV2dC0+bWVzc2FnZSAmIEVWVF9SSUdIVEJNQVNLKQotCXByaW50ZigiUklHSFQgIik7Ci0gICAgaWYgKGV2dC0+bWVzc2FnZSAmIEVWVF9NSURETEVCTUFTSykKLQlwcmludGYoIk1JRERMRSAiKTsKLSAgICBwcmludGYoImFicyglZCwlZCksIHJlbCglZCwlZCkiLCBldnQtPndoZXJlX3gsIGV2dC0+d2hlcmVfeSwgZXZ0LT5yZWxhdGl2ZV94LCBldnQtPnJlbGF0aXZlX3kpOwotICAgIERpc3BsYXlNb2RpZmllcnMoZXZ0KTsKLSAgICBpZiAoZXZ0LT5tZXNzYWdlICYgRVZUX0RCTENMSUNLKQotCXByaW50ZigiLCBEQkxDTElDSyIpOwotICAgIHByaW50ZigiXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tc2cgLSBNZXNzYWdlIHRvIGRpc3BsYXkgZm9yIHR5cGUgb2YgZXZlbnQKLWV2dCAtIEV2ZW50IHRvIGRpc3BsYXkKLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHN0YXR1cyBvZiB0aGUgam95c3RpY2sgZXZlbnQgdG8gdGhlIHNjcmVlbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIERpc3BsYXlKb3koCi0gICAgY2hhciAqbXNnLAotICAgIGV2ZW50X3QgKmV2dCkKLXsKLSAgICBwcmludGYoIiVzOiBKb3kxKCU0ZCwlNGQsJWMlYyksIEpveTIoJTRkLCU0ZCwlYyVjKVxuIiwgbXNnLAotCWV2dC0+d2hlcmVfeCxldnQtPndoZXJlX3ksCi0JKGV2dC0+bWVzc2FnZSAmIEVWVF9KT1kxX0JVVFRPTkEpID8gJ0EnIDogJ2EnLAotCShldnQtPm1lc3NhZ2UgJiBFVlRfSk9ZMV9CVVRUT05CKSA/ICdCJyA6ICdiJywKLQlldnQtPnJlbGF0aXZlX3gsZXZ0LT5yZWxhdGl2ZV95LAotCShldnQtPm1lc3NhZ2UgJiBFVlRfSk9ZMl9CVVRUT05BKSA/ICdBJyA6ICdhJywKLQkoZXZ0LT5tZXNzYWdlICYgRVZUX0pPWTJfQlVUVE9OQikgPyAnQicgOiAnYicpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUpveXN0aWNrIGNhbGlicmF0aW9uIHJvdXRpbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIENhbGlicmF0ZUpveSh2b2lkKQotewotICBldmVudF90IGV2dDsKLSAgaWYoRVZUX2pveUlzUHJlc2VudCgpKXsKLSAgICBwcmludGYoIkpveXN0aWNrIENhbGlicmF0aW9uXG5Nb3ZlIHRoZSBqb3lzdGljayB0byB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgYW5kIHByZXNzIGFueSBidXR0b24uXG4iKTsKLSAgICBFVlRfaGFsdCgmZXZ0LCBFVlRfSk9ZQ0xJQ0spOwotICAgIEVWVF9oYWx0KCZldnQsIEVWVF9KT1lDTElDSyk7Ci0gICAgRVZUX2pveVNldFVwcGVyTGVmdCgpOwotICAgIHByaW50ZigiTW92ZSB0aGUgam95c3RpY2sgdG8gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBhbmQgcHJlc3MgYW55IGJ1dHRvbi5cbiIpOwotICAgIEVWVF9oYWx0KCZldnQsIEVWVF9KT1lDTElDSyk7Ci0gICAgRVZUX2hhbHQoJmV2dCwgRVZUX0pPWUNMSUNLKTsKLSAgICBFVlRfam95U2V0TG93ZXJSaWdodCgpOwotICAgIHByaW50ZigiTW92ZSB0aGUgam95c3RpY2sgdG8gY2VudGVyIHBvc2l0aW9uIGFuZCBwcmVzcyBhbnkgYnV0dG9uLlxuIik7Ci0gICAgRVZUX2hhbHQoJmV2dCwgRVZUX0pPWUNMSUNLKTsKLSAgICBFVlRfaGFsdCgmZXZ0LCBFVlRfSk9ZQ0xJQ0spOwotICAgIEVWVF9qb3lTZXRDZW50ZXIoKTsKLSAgICBwcmludGYoIkpveXN0aWNrIGNhbGlicmF0ZWRcbiIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFpbiBwcm9ncmFtIGVudHJ5IHBvaW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG1haW4odm9pZCkKLXsKLSAgICBldmVudF90ICAgICBldnQ7Ci0gICAgaWJvb2wgICAgICAgZG9uZSA9IGZhbHNlOwotICAgIFBNX0hXTkQgICAgIGh3bmRDb25zb2xlOwotCi0gICAgaHduZENvbnNvbGUgPSBQTV9vcGVuQ29uc29sZSgwLDAsMCwwLDAsdHJ1ZSk7Ci0gICAgRVZUX2luaXQoJm1vdmVNb3VzZSk7Ci0gICAgRVZUX3NldE1vdXNlUmFuZ2UoMTAyNCw3NjgpOwotICAgIENhbGlicmF0ZUpveSgpOwotICAgIGRvIHsKLQlFVlRfcG9sbEpveXN0aWNrKCk7Ci0JaWYgKEVWVF9nZXROZXh0KCZldnQsRVZUX0VWRVJZRVZUKSkgewotCSAgICBzd2l0Y2ggKGV2dC53aGF0KSB7Ci0JCWNhc2UgRVZUX0tFWURPV046Ci0JCSAgICBEaXNwbGF5S2V5KCJFVlRfS0VZRE9XTiAgIiwgJmV2dCk7Ci0JCSAgICBpZiAoRVZUX3NjYW5Db2RlKGV2dC5tZXNzYWdlKSA9PSBLQl9lc2MpCi0JCQlkb25lID0gdHJ1ZTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEVWVF9LRVlSRVBFQVQ6Ci0JCSAgICBEaXNwbGF5S2V5KCJFVlRfS0VZUkVQRUFUIiwgJmV2dCk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBFVlRfS0VZVVA6Ci0JCSAgICBEaXNwbGF5S2V5KCJFVlRfS0VZVVAgICAgIiwgJmV2dCk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBFVlRfTU9VU0VET1dOOgotCQkgICAgRGlzcGxheU1vdXNlKCJFVlRfTU9VU0VET1dOIiwgJmV2dCk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBFVlRfTU9VU0VBVVRPOgotCQkgICAgRGlzcGxheU1vdXNlKCJFVlRfTU9VU0VBVVRPIiwgJmV2dCk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBFVlRfTU9VU0VVUDoKLQkJICAgIERpc3BsYXlNb3VzZSgiRVZUX01PVVNFVVAgICIsICZldnQpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgRVZUX01PVVNFTU9WRToKLQkJICAgIERpc3BsYXlNb3VzZSgiRVZUX01PVVNFTU9WRSIsICZldnQpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgRVZUX0pPWUNMSUNLOgotCQkgICAgRGlzcGxheUpveSgiRVZUX0pPWUNMSUNLICIsICZldnQpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgRVZUX0pPWU1PVkU6Ci0JCSAgICBEaXNwbGF5Sm95KCJFVlRfSk9ZTU9WRSAgIiwgJmV2dCk7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JfSB3aGlsZSAoIWRvbmUpOwotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2lzdmVzYS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvaXN2ZXNhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWQyNDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvaXN2ZXNhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGFsbG9jYXRlIHJlYWwgbW9kZQotKiAgICAgICAgICAgICAgIG1lbW9yeSBhbmQgdG8gY2FsbCByZWFsIG1vZGUgaW50ZXJydXB0IGhhbmRsZXJzIHN1Y2ggYXMKLSogICAgICAgICAgICAgICB0aGUgVkVTQSBWQkUgQklPUyBmcm9tIHByb3RlY3RlZCBtb2RlLiBDb21waWxlIGFuZCBsaW5rCi0qICAgICAgICAgICAgICAgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZCBsaW5lIGZvciB5b3VyIERPUyBleHRlbmRlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2dldFZFU0FCdWYoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fbWFwUmVhbFBvaW50ZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1faW50ODZ4KCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLS8qIFN1cGVyVkdBIGluZm9ybWF0aW9uIGJsb2NrICovCi0KLSNwcmFnbWEgcGFjaygxKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAgICBWRVNBU2lnbmF0dXJlWzRdOyAgICAgICAvKiAnVkVTQScgNCBieXRlIHNpZ25hdHVyZSAgICAgICAgICAqLwotICAgIHNob3J0ICAgVkVTQVZlcnNpb247ICAgICAgICAgICAgLyogVkJFIHZlcnNpb24gbnVtYmVyICAgICAgICAgICAgICAgKi8KLSAgICB1bG9uZyAgIE9FTVN0cmluZ1B0cjsgICAgICAgICAgIC8qIEZhciBwb2ludGVyIHRvIE9FTSBzdHJpbmcgICAgICAgICovCi0gICAgdWxvbmcgICBDYXBhYmlsaXRpZXM7ICAgICAgICAgICAvKiBDYXBhYmlsaXRpZXMgb2YgdmlkZW8gY2FyZCAgICAgICAqLwotICAgIHVsb25nICAgVmlkZW9Nb2RlUHRyOyAgICAgICAgICAgLyogRmFyIHBvaW50ZXIgdG8gc3VwcG9ydGVkIG1vZGVzICAgKi8KLSAgICBzaG9ydCAgIFRvdGFsTWVtb3J5OyAgICAgICAgICAgIC8qIE51bWJlciBvZiA2NGtiIG1lbW9yeSBibG9ja3MgICAgICovCi0gICAgY2hhciAgICByZXNlcnZlZFsyMzZdOyAgICAgICAgICAvKiBQYWQgdG8gMjU2IGJ5dGUgYmxvY2sgc2l6ZSAgICAgICAqLwotICAgIH0gVmdhSW5mb0Jsb2NrOwotCi0jcHJhZ21hIHBhY2soKQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIFJNUkVHUyAgICAgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgICAgICBzcmVnczsKLSAgICBWZ2FJbmZvQmxvY2sgICAgdmdhSW5mbzsKLSAgICB1c2hvcnQgICAgICAgICAgKm1vZGU7Ci0gICAgdWludCAgICAgICAgICAgIHZnTGVuOwotICAgIHVjaGFyICAgICAgICAgICAqdmdQdHI7Ci0gICAgdW5zaWduZWQgICAgICAgIHJfdmdzZWcscl92Z29mZjsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgLyogQWxsb2NhdGUgYSAyNTYgYnl0ZSBibG9jayBvZiByZWFsIG1lbW9yeSBmb3IgY29tbXVuaWNhdGluZyB3aXRoCi0gICAgICogdGhlIFZFU0EgQklPUy4KLSAgICAgKi8KLSAgICBpZiAoKHZnUHRyID0gUE1fZ2V0VkVTQUJ1ZigmdmdMZW4sJnJfdmdzZWcsJnJfdmdvZmYpKSA9PSBOVUxMKSB7Ci0JcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgVkVTQSBtZW1vcnkgYnVmZmVyIVxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0KLSAgICAvKiBDYWxsIHRoZSBWRVNBIFZCRSB0byBzZWUgaWYgaXQgaXMgb3V0IHRoZXJlICovCi0gICAgcmVncy54LmF4ID0gMHg0RjAwOwotICAgIHJlZ3MueC5kaSA9IHJfdmdvZmY7Ci0gICAgc3JlZ3MuZXMgPSByX3Znc2VnOwotICAgIG1lbWNweSh2Z1B0ciwiVkJFMiIsNCk7Ci0gICAgUE1faW50ODZ4KDB4MTAsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLSAgICBtZW1jcHkoJnZnYUluZm8sdmdQdHIsc2l6ZW9mKFZnYUluZm9CbG9jaykpOwotICAgIGlmIChyZWdzLnguYXggPT0gMHg0RiAmJiBzdHJuY21wKHZnYUluZm8uVkVTQVNpZ25hdHVyZSwiVkVTQSIsNCkgPT0gMCkgewotCXByaW50ZigiVkVTQSBWQkUgdmVyc2lvbiAlZC4lZCBCSU9TIGRldGVjdGVkXG5cbiIsCi0JICAgIHZnYUluZm8uVkVTQVZlcnNpb24gPj4gOCwgdmdhSW5mby5WRVNBVmVyc2lvbiAmIDB4Rik7Ci0JcHJpbnRmKCJBdmFpbGFibGUgdmlkZW8gbW9kZXM6XG4iKTsKLQltb2RlID0gUE1fbWFwUmVhbFBvaW50ZXIodmdhSW5mby5WaWRlb01vZGVQdHIgPj4gMTYsIHZnYUluZm8uVmlkZW9Nb2RlUHRyICYgMHhGRkZGKTsKLQl3aGlsZSAoKm1vZGUgIT0gMHhGRkZGKSB7Ci0JICAgIHByaW50ZigiICAgICUwNGhYaCAoJTA4WClcbiIsICptb2RlLCAoaW50KW1vZGUpOwotCSAgICBtb2RlKys7Ci0JICAgIH0KLQl9Ci0gICAgZWxzZQotCXByaW50ZigiVkVTQSBWQkUgbm90IGZvdW5kXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2tleS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMva2V5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTg4ODUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMva2V5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKLSogICAgICAgICAgICAgICBrZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX3NldEtleUhhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fY2hhaW5QcmV2S2V5KCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKCkKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXZvbGF0aWxlIGxvbmcgY291bnQgPSAwOwotCi0jcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLwotCi12b2lkIFBNQVBJIGtleUhhbmRsZXIodm9pZCkKLXsKLSAgICBjb3VudCsrOwotICAgIFBNX2NoYWluUHJldktleSgpOyAgLyogQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlciAgICAqLwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCAgICAgICAgICAgICBjaDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIC8qIEluc3RhbGwgb3VyIHRpbWVyIGhhbmRsZXIgYW5kIGxvY2sgaGFuZGxlciBwYWdlcyBpbiBtZW1vcnkuIEl0IGlzCi0gICAgICogZGlmZmljdWx0IHRvIGdldCB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIGluIEMsIGJ1dCB3ZSBrbm93IG91cgotICAgICAqIGZ1bmN0aW9uIGlzIHdlbGwgbGVzcyB0aGFuIDEwMCBieXRlcyAoYW5kIGFuIGVudGlyZSA0ayBwYWdlIHdpbGwKLSAgICAgKiBuZWVkIHRvIGJlIGxvY2tlZCBieSB0aGUgc2VydmVyIGFueXdheSkuCi0gICAgICovCi0gICAgUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKWtleUhhbmRsZXIsMTAwLCZsaCk7Ci0gICAgUE1fbG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKCk7ICAgICAgICAgICAvKiBXZSAqRE9OVCogd2FudCBDdHJsLUJyZWFrcyEgKi8KLSAgICBQTV9zZXRLZXlIYW5kbGVyKGtleUhhbmRsZXIpOwotICAgIHByaW50ZigiS2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkIC0gVHlwZSBzb21lIGNoYXJhY3RlcnMgYW5kXG4iKTsKLSAgICBwcmludGYoImhpdCBFU0MgdG8gZXhpdFxuIik7Ci0gICAgd2hpbGUgKChjaCA9IFBNX2dldGNoKCkpICE9IDB4MUIpIHsKLQlwcmludGYoIiVjIiwgY2gpOwotCWZmbHVzaChzdGRvdXQpOwotCX0KLQotICAgIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKCk7Ci0gICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpOwotICAgIFBNX3VubG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV91bmxvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilrZXlIYW5kbGVyLDEwMCwmbGgpOwotICAgIHByaW50ZigiXG5cbktleWJvYXJkIGhhbmRsZXIgd2FzIGNhbGxlZCAlbGQgdGltZXNcbiIsIGNvdW50KTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2tleTE1LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkxNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGI5NGJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2tleTE1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKLSogICAgICAgICAgICAgICBrZXlib2FyZCBJbnQgMTVoIGludGVycnVwdCBoYW5kbGVyLiBUaGlzIGlzIGFuIGFsdGVybmF0ZQotKiAgICAgICAgICAgICAgIHdheSB0byBpbnRlcmNlcHQgc2NhbmNvZGVzIGZyb20gdGhlIGtleWJvYXJkIGJ5IGhvb2tpbmcKLSogICAgICAgICAgICAgICB0aGUgSW50IDE1aCBrZXlib2FyZCBpbnRlcmNlcHQgY2FsbG91dC4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX3NldEtleTE1SGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKCkKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXZvbGF0aWxlIGxvbmcgY291bnQgPSAwOwotdm9sYXRpbGUgc2hvcnQgbGFzdFNjYW5Db2RlID0gMDsKLQotI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KLQotc2hvcnQgUE1BUEkga2V5SGFuZGxlcihzaG9ydCBzY2FuQ29kZSkKLXsKLSAgICBjb3VudCsrOwotICAgIGxhc3RTY2FuQ29kZSA9IHNjYW5Db2RlOwotICAgIHJldHVybiBzY2FuQ29kZTsgICAgICAgICAgICAvKiBMZXQgQklPUyBwcm9jZXNzIGFzIG5vcm1hbCAqLwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCAgICAgICAgICAgICBjaDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIC8qIEluc3RhbGwgb3VyIHRpbWVyIGhhbmRsZXIgYW5kIGxvY2sgaGFuZGxlciBwYWdlcyBpbiBtZW1vcnkuIEl0IGlzCi0gICAgICogZGlmZmljdWx0IHRvIGdldCB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIGluIEMsIGJ1dCB3ZSBrbm93IG91cgotICAgICAqIGZ1bmN0aW9uIGlzIHdlbGwgbGVzcyB0aGFuIDEwMCBieXRlcyAoYW5kIGFuIGVudGlyZSA0ayBwYWdlIHdpbGwKLSAgICAgKiBuZWVkIHRvIGJlIGxvY2tlZCBieSB0aGUgc2VydmVyIGFueXdheSkuCi0gICAgICovCi0gICAgUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKWtleUhhbmRsZXIsMTAwLCZsaCk7Ci0gICAgUE1fbG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKCk7ICAgICAgIC8qIFdlICpET05UKiB3YW50IEN0cmwtQnJlYWsncyEgKi8KLSAgICBQTV9zZXRLZXkxNUhhbmRsZXIoa2V5SGFuZGxlcik7Ci0gICAgcHJpbnRmKCJLZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWQgLSBUeXBlIHNvbWUgY2hhcmFjdGVycyBhbmRcbiIpOwotICAgIHByaW50ZigiaGl0IEVTQyB0byBleGl0XG4iKTsKLSAgICB3aGlsZSAoKGNoID0gUE1fZ2V0Y2goKSkgIT0gMHgxQikgewotCXByaW50ZigiJWMiLCBjaCk7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0JfQotCi0gICAgUE1fcmVzdG9yZUtleTE1SGFuZGxlcigpOwotICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKLSAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpa2V5SGFuZGxlciwxMDAsJmxoKTsKLSAgICBwcmludGYoIlxuXG5LZXlib2FyZCBoYW5kbGVyIHdhcyBjYWxsZWQgJWxkIHRpbWVzXG4iLCBjb3VudCk7Ci0gICAgcHJpbnRmKCJMYXN0IHNjYW4gY29kZSAlMDRYXG4iLCBsYXN0U2NhbkNvZGUpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvbWVtdGVzdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvbWVtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmM2NTViLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21lbXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gZGV0ZXJtaW5lIGp1c3QgaG93IG11Y2ggbWVtb3J5IGNhbiBiZQotKiAgICAgICAgICAgICAgIGFsbG9jYXRlZCB3aXRoIHRoZSBjb21waWxlciBpbiB1c2UuIENvbXBpbGUgYW5kIGxpbmsKLSogICAgICAgICAgICAgICB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kIGxpbmUgZm9yIHlvdXIgRE9TIGV4dGVuZGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fbWFsbG9jKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2F2YWlsYWJsZU1lbW9yeSgpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotI2lmZGVmICBfXzE2QklUX18KLSNkZWZpbmUgTUFYQUxMT0MgICAgNjQKLSNlbHNlCi0jZGVmaW5lIE1BWEFMTE9DICAgIDIwMDAKLSNlbmRpZgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCAgICAgaTsKLSAgICB1bG9uZyAgIGFsbG9jczsKLSAgICB1bG9uZyAgIHBoeXNpY2FsLHRvdGFsOwotICAgIGNoYXIgICAgKnAsKnBhW01BWEFMTE9DXTsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgcHJpbnRmKCJNZW1vcnkgYXZhaWxhYmxlIGF0IHN0YXJ0OlxuIik7Ci0gICAgUE1fYXZhaWxhYmxlTWVtb3J5KCZwaHlzaWNhbCwmdG90YWwpOwotICAgIHByaW50ZigiICAgUGh5c2ljYWwgbWVtb3J5OiAgICAgICAgICAgJWxkIEtiXG4iLCBwaHlzaWNhbCAvIDEwMjQpOwotICAgIHByaW50ZigiICAgVG90YWwgKGluY2x1ZGluZyB2aXJ0dWFsKTogJWxkIEtiXG4iLCB0b3RhbCAvIDEwMjQpOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBmb3IgKGFsbG9jcyA9IGkgPSAwOyBpIDwgTUFYQUxMT0M7IGkrKykgewotCWlmICgocGFbaV0gPSBQTV9tYWxsb2MoMTAqMTAyNCkpICE9IDApIHsgICAgLyogaW4gMTBrIGJsb2NrcyAgICAqLwotCSAgICBwID0gcGFbYWxsb2NzXTsKLQkgICAgbWVtc2V0KHAsIDAsIDEwKjEwMjQpOyAvKiB0b3VjaCBldmVyeSBieXRlICAgICAgICAgICAgICAqLwotCSAgICAqcCA9ICd4JzsgICAgICAgICAgIC8qIGRvIHNvbWV0aGluZywgYW55dGhpbmcgd2l0aCAgICAgICovCi0JICAgIHBbMTAyM10gPSAneSc7ICAgICAgLyogdGhlIGFsbG9jYXRlZCBtZW1vcnkgICAgICAgICAgICAgKi8KLQkgICAgYWxsb2NzKys7Ci0JICAgIHByaW50ZigiQWxsb2NhdGVkICVsdSBieXRlc1xyIiwgMTAqKGFsbG9jcyA8PCAxMCkpOwotCSAgICB9Ci0JZWxzZSBicmVhazsKLQlpZiAoUE1fa2JoaXQoKSAmJiAoUE1fZ2V0Y2goKSA9PSAweDFCKSkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgcHJpbnRmKCJcblxuQWxsb2NhdGVkIHRvdGFsIG9mICVsdSBieXRlc1xuIiwgMTAgKiAoYWxsb2NzIDw8IDEwKSk7Ci0KLSAgICBwcmludGYoIlxuTWVtb3J5IGF2YWlsYWJsZSBhdCBlbmQ6XG4iKTsKLSAgICBQTV9hdmFpbGFibGVNZW1vcnkoJnBoeXNpY2FsLCZ0b3RhbCk7Ci0gICAgcHJpbnRmKCIgICBQaHlzaWNhbCBtZW1vcnk6ICAgICAgICAgICAlbGQgS2JcbiIsIHBoeXNpY2FsIC8gMTAyNCk7Ci0gICAgcHJpbnRmKCIgICBUb3RhbCAoaW5jbHVkaW5nIHZpcnR1YWwpOiAlbGQgS2JcbiIsIHRvdGFsIC8gMTAyNCk7Ci0KLSAgICBmb3IgKGkgPSBhbGxvY3MtMTsgaSA+PSAwOyBpLS0pCi0JUE1fZnJlZShwYVtpXSk7Ci0KLSAgICBwcmludGYoIlxuTWVtb3J5IGF2YWlsYWJsZSBhZnRlciBmcmVlaW5nIGFsbCBibG9ja3MgKG5vdGUgdGhhdCB1bmRlciBwcm90ZWN0ZWQgbW9kZVxuIik7Ci0gICAgcHJpbnRmKCJ0aGlzIHdpbGwgbW9zdCBsaWtlbHkgbm90IGJlIGNvcnJlY3QgYWZ0ZXIgZnJlZWluZyBibG9ja3MpOlxuXG4iKTsKLSAgICBQTV9hdmFpbGFibGVNZW1vcnkoJnBoeXNpY2FsLCZ0b3RhbCk7Ci0gICAgcHJpbnRmKCIgICBQaHlzaWNhbCBtZW1vcnk6ICAgICAgICAgICAlbGQgS2JcbiIsIHBoeXNpY2FsIC8gMTAyNCk7Ci0gICAgcHJpbnRmKCIgICBUb3RhbCAoaW5jbHVkaW5nIHZpcnR1YWwpOiAlbGQgS2JcbiIsIHRvdGFsIC8gMTAyNCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21vdXNlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9tb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY1YTBkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21vdXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYW4gYXNzZW1ibHkKLSogICAgICAgICAgICAgICBsYW5ndWFnZSBtb3VzZSBpbnRlcnJ1cHQgaGFuZGxlci4gV2UgdXNlIGFzc2VtYmx5IGxhbmd1YWdlCi0qICAgICAgICAgICAgICAgYXMgaXQgbXVzdCBiZSBhIGZhciBmdW5jdGlvbiBhbmQgc2hvdWxkIHN3YXAgdG8gYSBsb2NhbAotKiAgICAgICAgICAgICAgIDMyIGJpdCBzdGFjayBpZiBpdCBpcyBnb2luZyB0byBjYWxsIGFueSBDIGJhc2VkIGNvZGUgKHdoaWNoCi0qICAgICAgICAgICAgICAgd2UgZG8gaW4gdGhpcyBleGFtcGxlKS4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2luc3RhbGxNb3VzZUhhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1faW50ODYoKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdm9sYXRpbGUgbG9uZyBjb3VudCA9IDA7Ci0KLSNwcmFnbWEgb2ZmIChjaGVja19zdGFjaykgICAgICAgICAgIC8qIE5vIHN0YWNrIGNoZWNraW5nIHVuZGVyIFdhdGNvbSAgICovCi0KLXZvaWQgUE1BUEkgbW91c2VIYW5kbGVyKAotICAgIHVpbnQgbWFzaywKLSAgICB1aW50IGJ1dHN0YXRlLAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIGludCBtaWNrZXlYLAotICAgIGludCBtaWNrZXlZKQotewotICAgIG1hc2sgPSBtYXNrOyAgICAgICAgICAgICAgICAvKiBXZSBkb250IHVzZSBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgICAgKi8KLSAgICBidXRzdGF0ZSA9IGJ1dHN0YXRlOwotICAgIHggPSB4OwotICAgIHkgPSB5OwotICAgIG1pY2tleVggPSBtaWNrZXlYOwotICAgIG1pY2tleVkgPSBtaWNrZXlZOwotICAgIGNvdW50Kys7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICByZWdzLnguYXggPSAzMzsgICAgIC8qIE1vdXNlIGZ1bmN0aW9uIDMzIC0gU29mdHdhcmUgcmVzZXQgICAgICAgKi8KLSAgICBQTV9pbnQ4NigweDMzLCZyZWdzLCZyZWdzKTsKLSAgICBpZiAocmVncy54LmJ4ID09IDApIHsKLQlwcmludGYoIk5vIG1vdXNlIGluc3RhbGxlZC5cbiIpOwotCWV4aXQoMSk7Ci0JfQotCi0gICAgLyogSW5zdGFsbCBvdXIgbW91c2UgaGFuZGxlciBhbmQgbG9jayBoYW5kbGVyIHBhZ2VzIGluIG1lbW9yeS4gSXQgaXMKLSAgICAgKiBkaWZmaWN1bHQgdG8gZ2V0IHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gaW4gQywgYnV0IHdlIGtub3cgb3VyCi0gICAgICogZnVuY3Rpb24gaXMgd2VsbCBsZXNzIHRoYW4gMTAwIGJ5dGVzIChhbmQgYW4gZW50aXJlIDRrIHBhZ2Ugd2lsbAotICAgICAqIG5lZWQgdG8gYmUgbG9ja2VkIGJ5IHRoZSBzZXJ2ZXIgYW55d2F5KS4KLSAgICAgKi8KLSAgICBQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpbW91c2VIYW5kbGVyLDEwMCwmbGgpOwotICAgIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgaWYgKCFQTV9zZXRNb3VzZUhhbmRsZXIoMHhGRkZGLCBtb3VzZUhhbmRsZXIpKSB7Ci0JcHJpbnRmKCJVbmFibGUgdG8gaW5zdGFsbCBtb3VzZSBoYW5kbGVyIVxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0gICAgcHJpbnRmKCJNb3VzZSBoYW5kbGVyIGluc3RhbGxlZCAtIEhpdCBhbnkga2V5IHRvIGV4aXRcbiIpOwotICAgIFBNX2dldGNoKCk7Ci0KLSAgICBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKCk7Ci0gICAgUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX3VubG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKW1vdXNlSGFuZGxlciwxMDAsJmxoKTsKLSAgICBwcmludGYoIk1vdXNlIGhhbmRsZXIgd2FzIGNhbGxlZCAlbGQgdGltZXNcbiIsIGNvdW50KTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Jlc3RvcmUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Jlc3RvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwYmU3NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9yZXN0b3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eC9RTlgKLSoKLSogRGVzY3JpcHRpb246ICBQcm9ncmFtIHRvIHJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUgc3RhdGUgZnJvbSBhIHByZXZpb3VzbHkKLSogICAgICAgICAgICAgICBzYXZlZCBzdGF0ZSBpZiB0aGUgcHJvZ3JhbSBjcmFzaGVkIHdoaWxlIHRoZSBjb25zb2xlCi0qICAgICAgICAgICAgICAgd2FzIGluIGdyYXBoaWNzIG1vZGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi12b2lkIHNldFZpZGVvTW9kZShpbnQgbW9kZSkKLXsKLSAgICBSTVJFR1MgcjsKLQotICAgIHIueC5heCA9IG1vZGU7Ci0gICAgUE1faW50ODYoMHgxMCwgJnIsICZyKTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlOwotICAgIHVsb25nICAgc3RhdGVTaXplOwotICAgIHZvaWQgICAgKnN0YXRlQnVmOwotICAgIEZJTEUgICAgKmY7Ci0KLSAgICAvKiBXcml0ZSB0aGUgc2F2ZWQgY29uc29sZSBzdGF0ZSBidWZmZXIgdG8gZGlzayAqLwotICAgIGlmICgoZiA9IGZvcGVuKCIvZXRjL3Btc2F2ZS5kYXQiLCJyYiIpKSA9PSBOVUxMKSB7Ci0JcHJpbnRmKCJVbmFibGUgdG8gb3BlbiAvZXRjL3Btc2F2ZS5kYXQgZm9yIHJlYWRpbmchXG4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotICAgIGZyZWFkKCZzdGF0ZVNpemUsMSxzaXplb2Yoc3RhdGVTaXplKSxmKTsKLSAgICBpZiAoc3RhdGVTaXplICE9IFBNX2dldENvbnNvbGVTdGF0ZVNpemUoKSkgewotCXByaW50ZigiU2l6ZSBtaXNtYXRjaCBpbiAvZXRjL3Btc2F2ZS5kYXQhXG4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotICAgIGlmICgoc3RhdGVCdWYgPSBQTV9tYWxsb2Moc3RhdGVTaXplKSkgPT0gTlVMTCkgewotCXByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIGNvbnNvbGUgc3RhdGUgYnVmZmVyIVxuIik7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICBmcmVhZChzdGF0ZUJ1ZiwxLHN0YXRlU2l6ZSxmKTsKLSAgICBmY2xvc2UoZik7Ci0KLSAgICAvKiBPcGVuIHRoZSBjb25zb2xlICovCi0gICAgaHduZENvbnNvbGUgPSBQTV9vcGVuQ29uc29sZSgwLDAsMCwwLDAsdHJ1ZSk7Ci0KLSAgICAvKiBGb3JjaWJseSBzZXQgODB4MjUgdGV4dCBtb2RlIHVzaW5nIHRoZSBCSU9TICovCi0gICAgc2V0VmlkZW9Nb2RlKDB4Myk7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBwcmV2aW91cyBjb25zb2xlIHN0YXRlICovCi0gICAgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1ZiwwKTsKLSAgICBQTV9jbG9zZUNvbnNvbGUoaHduZENvbnNvbGUpOwotICAgIFBNX2ZyZWUoc3RhdGVCdWYpOwotICAgIHByaW50ZigiQ29uc29sZSBzdGF0ZSBzdWNjZXNzZnVsbHkgcmVzdG9yZWQgZnJvbSAvZXRjL3Btc2F2ZS5kYXRcbiIpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcnRjLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9ydGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlZjkyMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9ydGMuYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAotKiAgICAgICAgICAgICAgIFJlYWwgVGltZSBDbG9jayBpbnRlcnJ1cHQgaGFuZGxlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcigpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi12b2xhdGlsZSBsb25nIGNvdW50ID0gMDsKLQotI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KLQotdm9pZCBQTUFQSSBSVENIYW5kbGVyKHZvaWQpCi17Ci0gICAgY291bnQrKzsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBsb25nICAgICAgICAgICAgb2xkQ291bnQ7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICAvKiBJbnN0YWxsIG91ciB0aW1lciBoYW5kbGVyIGFuZCBsb2NrIGhhbmRsZXIgcGFnZXMgaW4gbWVtb3J5LiBJdCBpcwotICAgICAqIGRpZmZpY3VsdCB0byBnZXQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBpbiBDLCBidXQgd2Uga25vdyBvdXIKLSAgICAgKiBmdW5jdGlvbiBpcyB3ZWxsIGxlc3MgdGhhbiAxMDAgYnl0ZXMgKGFuZCBhbiBlbnRpcmUgNGsgcGFnZSB3aWxsCi0gICAgICogbmVlZCB0byBiZSBsb2NrZWQgYnkgdGhlIHNlcnZlciBhbnl3YXkpLgotICAgICAqLwotICAgIFBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilSVENIYW5kbGVyLDEwMCwmbGgpOwotICAgIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpOyAgICAgICAgICAgLyogV2UgKkRPTlQqIHdhbnQgQ3RybC1CcmVha3MhICovCi0gICAgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUlRDSGFuZGxlciwxMjgpOwotICAgIHByaW50ZigiUmVhbFRpbWVDbG9jayBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWQgLSBIaXQgRVNDIHRvIGV4aXRcbiIpOwotICAgIG9sZENvdW50ID0gY291bnQ7Ci0gICAgd2hpbGUgKDEpIHsKLQlpZiAoUE1fa2JoaXQoKSAmJiAoUE1fZ2V0Y2goKSA9PSAweDFCKSkKLQkgICAgYnJlYWs7Ci0JaWYgKGNvdW50ICE9IG9sZENvdW50KSB7Ci0JICAgIHByaW50ZigiVGljaywgVG9jazogJWxkXG4iLCBjb3VudCk7Ci0JICAgIG9sZENvdW50ID0gY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIoKTsKLSAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCk7Ci0gICAgUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX3VubG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKVJUQ0hhbmRsZXIsMTAwLCZsaCk7Ci0gICAgcHJpbnRmKCJSZWFsVGltZUNsb2NrIGhhbmRsZXIgd2FzIGNhbGxlZCAlbGQgdGltZXNcbiIsIGNvdW50KTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3NhdmUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3NhdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczMjQ1Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9zYXZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eC9RTlgKLSoKLSogRGVzY3JpcHRpb246ICBQcm9ncmFtIHRvIHNhdmUgdGhlIGNvbnNvbGUgc3RhdGUgc3RhdGUgc28gdGhhdCBpdCBjYW4KLSogICAgICAgICAgICAgICBiZSBsYXRlciByZXN0b3JlZCBpZiB0aGUgcHJvZ3JhbSBjcmFzaGVkIHdoaWxlIHRoZSBjb25zb2xlCi0qICAgICAgICAgICAgICAgd2FzIGluIGdyYXBoaWNzIG1vZGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIFBNX0hXTkQgaHduZENvbnNvbGU7Ci0gICAgdWxvbmcgICBzdGF0ZVNpemU7Ci0gICAgdm9pZCAgICAqc3RhdGVCdWY7Ci0gICAgRklMRSAgICAqZjsKLQotICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIHNhdmUgY29uc29sZSBzdGF0ZSBhbmQgc2F2ZSB0aGUgc3RhdGUgKi8KLSAgICBod25kQ29uc29sZSA9IFBNX29wZW5Db25zb2xlKDAsMCwwLDAsMCx0cnVlKTsKLSAgICBzdGF0ZVNpemUgPSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKCk7Ci0gICAgaWYgKChzdGF0ZUJ1ZiA9IFBNX21hbGxvYyhzdGF0ZVNpemUpKSA9PSBOVUxMKSB7Ci0JUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKLQlwcmludGYoIlVuYWJsZSB0byBhbGxvY2F0ZSBjb25zb2xlIHN0YXRlIGJ1ZmZlciFcbiIpOwotCXJldHVybiAtMTsKLQl9Ci0gICAgUE1fc2F2ZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1ZiwwKTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUgb24gZXhpdCAqLwotICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsMCk7Ci0gICAgUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKLQotICAgIC8qIFdyaXRlIHRoZSBzYXZlZCBjb25zb2xlIHN0YXRlIGJ1ZmZlciB0byBkaXNrICovCi0gICAgaWYgKChmID0gZm9wZW4oIi9ldGMvcG1zYXZlLmRhdCIsIndiIikpID09IE5VTEwpCi0JcHJpbnRmKCJVbmFibGUgdG8gb3BlbiAvZXRjL3Btc2F2ZS9kYXQgZm9yIHdyaXRpbmchXG4iKTsKLSAgICBlbHNlIHsKLQlmd3JpdGUoJnN0YXRlU2l6ZSwxLHNpemVvZihzdGF0ZVNpemUpLGYpOwotCWZ3cml0ZShzdGF0ZUJ1ZiwxLHN0YXRlU2l6ZSxmKTsKLQlmY2xvc2UoZik7Ci0JcHJpbnRmKCJDb25zb2xlIHN0YXRlIHN1Y2Nlc3NmdWxseSBzYXZlZCB0byAvZXRjL3Btc2F2ZS5kYXRcbiIpOwotCX0KLSAgICBQTV9mcmVlKHN0YXRlQnVmKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Nob3dwY2kuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Nob3dwY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyNzVlMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9zaG93cGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIHRlc3QgdGhlIFBDSSBsaWJyYXJ5IGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgInBjaWxpYi5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bVBDSSA9IC0xOwotc3RhdGljIFBDSURldmljZUluZm8gICAgKlBDSTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICpCcmlkZ2VJbmRleDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICpEZXZpY2VJbmRleDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bUJyaWRnZXM7Ci1zdGF0aWMgUENJRGV2aWNlSW5mbyAgICAqQUdQQnJpZGdlID0gTlVMTDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bURldmljZXM7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW51bWVyYXRlcyB0aGUgUENJIGJ1cyBhbmQgZHVtcHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRvIHRoZQotbG9nIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRW51bWVyYXRlUENJKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGksaW5kZXg7Ci0gICAgUENJRGV2aWNlSW5mbyAgICppbmZvOwotCi0gICAgcHJpbnRmKCJEaXNwbGF5aW5nIGVudW1lcmF0aW9uIG9mIFBDSSBidXMgKCVkIGRldmljZXMsICVkIGRpc3BsYXkgZGV2aWNlcylcbiIsCi0JTnVtUENJLCBOdW1EZXZpY2VzKTsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKQotCXByaW50ZigiICBEaXNwbGF5IGRldmljZSAlZCBpcyBQQ0kgZGV2aWNlICVkXG4iLGluZGV4LERldmljZUluZGV4W2luZGV4XSk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiQnVzIFNsb3QgRm5jIERldmljZUlEICBTdWJTeXN0ZW0gUmV2IENsYXNzIElSUSBJbnQgQ21kXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspIHsKLQlwcmludGYoIiUyZCAgICUyZCAgJTJkICAlMDRYOiUwNFggJTA0WDolMDRYICUwMlggICUwMlg6JTAyWCAlMDJYICAlMDJYICAlMDRYICAgIiwKLQkgICAgUENJW2ldLnNsb3QucC5CdXMsCi0JICAgIFBDSVtpXS5zbG90LnAuRGV2aWNlLAotCSAgICBQQ0lbaV0uc2xvdC5wLkZ1bmN0aW9uLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLnUudHlwZTAuU3ViU3lzdGVtVmVuZG9ySUQsCi0JICAgIFBDSVtpXS51LnR5cGUwLlN1YlN5c3RlbUlELAotCSAgICBQQ0lbaV0uUmV2SUQsCi0JICAgIFBDSVtpXS5CYXNlQ2xhc3MsCi0JICAgIFBDSVtpXS5TdWJDbGFzcywKLQkgICAgUENJW2ldLnUudHlwZTAuSW50ZXJydXB0TGluZSwKLQkgICAgUENJW2ldLnUudHlwZTAuSW50ZXJydXB0UGluLAotCSAgICBQQ0lbaV0uQ29tbWFuZCk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRmKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRmKCJcbiIpOwotCX0KLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJEZXZpY2VJRCAgU3RhdCBJZmMgQ2NoIExhdCBIZHIgQklTVFxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JcHJpbnRmKCIlMDRYOiUwNFggJTA0WCAgJTAyWCAgJTAyWCAgJTAyWCAgJTAyWCAgJTAyWCAgICIsCi0JICAgIFBDSVtpXS5WZW5kb3JJRCwKLQkgICAgUENJW2ldLkRldmljZUlELAotCSAgICBQQ0lbaV0uU3RhdHVzLAotCSAgICBQQ0lbaV0uSW50ZXJmYWNlLAotCSAgICBQQ0lbaV0uQ2FjaGVMaW5lU2l6ZSwKLQkgICAgUENJW2ldLkxhdGVuY3lUaW1lciwKLQkgICAgUENJW2ldLkhlYWRlclR5cGUsCi0JICAgIFBDSVtpXS5CSVNUKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQotCSAgICBwcmludGYoIjwtICVkXG4iLCBpbmRleCk7Ci0JZWxzZQotCSAgICBwcmludGYoIlxuIik7Ci0JfQotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIkRldmljZUlEICBCYXNlMTBoICBCYXNlMTRoICBCYXNlMThoICBCYXNlMUNoICBCYXNlMjBoICBCYXNlMjRoICBST01CYXNlXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspIHsKLQlwcmludGYoIiUwNFg6JTA0WCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAiLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxOCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxQywKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MyMCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MyNCwKLQkgICAgUENJW2ldLnUudHlwZTAuUk9NQmFzZUFkZHJlc3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQkgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpbmRleCA8IE51bURldmljZXMpCi0JICAgIHByaW50ZigiPC0gJWRcbiIsIGluZGV4KTsKLQllbHNlCi0JICAgIHByaW50ZigiXG4iKTsKLQl9Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiRGV2aWNlSUQgIEJBUjEwTGVuIEJBUjE0TGVuIEJBUjE4TGVuIEJBUjFDTGVuIEJBUjIwTGVuIEJBUjI0TGVuIFJPTUxlblxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JcHJpbnRmKCIlMDRYOiUwNFggJTA4bFggJTA4bFggJTA4bFggJTA4bFggJTA4bFggJTA4bFggJTA4bFggIiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTBMZW4sCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTRMZW4sCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMThMZW4sCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMUNMZW4sCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMjBMZW4sCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMjRMZW4sCi0JICAgIFBDSVtpXS51LnR5cGUwLlJPTUJhc2VBZGRyZXNzTGVuKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQotCSAgICBwcmludGYoIjwtICVkXG4iLCBpbmRleCk7Ci0JZWxzZQotCSAgICBwcmludGYoIlxuIik7Ci0JfQotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIkRpc3BsYXlpbmcgZW51bWVyYXRpb24gb2YgJWQgYnJpZGdlIGRldmljZXNcbiIsTnVtQnJpZGdlcyk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiRGV2aWNlSUQgIFAjIFMjIEIjIElPQiAgSU9MICBNZW1CYXNlICBNZW1MaW1pdCBQcmVCYXNlICBQcmVMaW1pdCBDdHJsXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtQnJpZGdlczsgaSsrKSB7Ci0JaW5mbyA9IChQQ0lEZXZpY2VJbmZvKikmUENJW0JyaWRnZUluZGV4W2ldXTsKLQlwcmludGYoIiUwNFg6JTA0WCAlMDJYICUwMlggJTAyWCAlMDRYICUwNFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDRYXG4iLAotCSAgICBpbmZvLT5WZW5kb3JJRCwKLQkgICAgaW5mby0+RGV2aWNlSUQsCi0JICAgIGluZm8tPnUudHlwZTEuUHJpbWFyeUJ1c051bWJlciwKLQkgICAgaW5mby0+dS50eXBlMS5TZWNvbmRheUJ1c051bWJlciwKLQkgICAgaW5mby0+dS50eXBlMS5TdWJvcmRpbmF0ZUJ1c051bWJlciwKLQkgICAgKCh1MTYpaW5mby0+dS50eXBlMS5JT0Jhc2UgPDwgOCkgJiAweEYwMDAsCi0JICAgIGluZm8tPnUudHlwZTEuSU9MaW1pdCA/Ci0JCSgodTE2KWluZm8tPnUudHlwZTEuSU9MaW1pdCA8PCA4KSB8IDB4RkZGIDogMCwKLQkgICAgKCh1MzIpaW5mby0+dS50eXBlMS5NZW1vcnlCYXNlIDw8IDE2KSAmIDB4RkZGMDAwMDAsCi0JICAgIGluZm8tPnUudHlwZTEuTWVtb3J5TGltaXQgPwotCQkoKHUzMilpbmZvLT51LnR5cGUxLk1lbW9yeUxpbWl0IDw8IDE2KSB8IDB4RkZGRkYgOiAwLAotCSAgICAoKHUzMilpbmZvLT51LnR5cGUxLlByZWZldGNoYWJsZU1lbW9yeUJhc2UgPDwgMTYpICYgMHhGRkYwMDAwMCwKLQkgICAgaW5mby0+dS50eXBlMS5QcmVmZXRjaGFibGVNZW1vcnlMaW1pdCA/Ci0JCSgodTMyKWluZm8tPnUudHlwZTEuUHJlZmV0Y2hhYmxlTWVtb3J5TGltaXQgPDwgMTYpIHwgMHhGRkZGRiA6IDAsCi0JICAgIGluZm8tPnUudHlwZTEuQnJpZGdlQ29udHJvbCk7Ci0JfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1OdW1iZXIgb2YgZGlzcGxheSBkZXZpY2VzIGZvdW5kLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBlbnVtZXJhdGVzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRpc3BsYXkgZGV2aWNlcyBvbiB0aGUKLVBDSSBidXMsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgZm91bmQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQQ0lfZW51bWVyYXRlRGV2aWNlcyh2b2lkKQotewotICAgIGludCAgICAgICAgICAgICBpLGo7Ci0gICAgUENJRGV2aWNlSW5mbyAgICppbmZvOwotCi0gICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkLCBlbnVtZXJhdGUgYWxsICovCi0gICAgLyogZGV2aWNlcyBvbiB0aGUgUENJIGJ1cy4gKi8KLSAgICBpZiAoTnVtUENJID09IC0xKSB7Ci0JaWYgKChOdW1QQ0kgPSBQQ0lfZ2V0TnVtRGV2aWNlcygpKSA9PSAwKQotCSAgICByZXR1cm4gLTE7Ci0JUENJID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihQQ0lbMF0pKTsKLQlCcmlkZ2VJbmRleCA9IG1hbGxvYyhOdW1QQ0kgKiBzaXplb2YoQnJpZGdlSW5kZXhbMF0pKTsKLQlEZXZpY2VJbmRleCA9IG1hbGxvYyhOdW1QQ0kgKiBzaXplb2YoRGV2aWNlSW5kZXhbMF0pKTsKLQlpZiAoIVBDSSB8fCAhQnJpZGdlSW5kZXggfHwgIURldmljZUluZGV4KQotCSAgICByZXR1cm4gLTE7Ci0JZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKQotCSAgICBQQ0lbaV0uZHdTaXplID0gc2l6ZW9mKFBDSVtpXSk7Ci0JaWYgKFBDSV9lbnVtZXJhdGUoUENJKSA9PSAwKQotCSAgICByZXR1cm4gLTE7Ci0KLQkvKiBCdWlsZCBhIGxpc3Qgb2YgYWxsIFBDSSBicmlkZ2UgZGV2aWNlcyAqLwotCWZvciAoaSA9IDAsTnVtQnJpZGdlcyA9IDAsQnJpZGdlSW5kZXhbMF0gPSAtMTsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JICAgIGlmIChQQ0lbaV0uQmFzZUNsYXNzID09IFBDSV9CUklER0VfQ0xBU1MpCi0JCUJyaWRnZUluZGV4W051bUJyaWRnZXMrK10gPSBpOwotCSAgICB9Ci0KLQkvKiBOb3cgYnVpbGQgYSBsaXN0IG9mIGFsbCBkaXNwbGF5IGNsYXNzIGRldmljZXMgKi8KLQlmb3IgKGkgPSAwLE51bURldmljZXMgPSAxLERldmljZUluZGV4WzBdID0gLTE7IGkgPCBOdW1QQ0k7IGkrKykgewotCSAgICBpZiAoUENJX0lTX0RJU1BMQVlfQ0xBU1MoJlBDSVtpXSkpIHsKLQkJaWYgKChQQ0lbaV0uQ29tbWFuZCAmIDB4MykgPT0gMHgzKQotCQkgICAgRGV2aWNlSW5kZXhbMF0gPSBpOwotCQllbHNlCi0JCSAgICBEZXZpY2VJbmRleFtOdW1EZXZpY2VzKytdID0gaTsKLQkJaWYgKFBDSVtpXS5zbG90LnAuQnVzICE9IDApIHsKLQkJICAgIC8qIFRoaXMgZGV2aWNlIGlzIG9uIGEgZGlmZmVyZW50IGJ1cyB0aGFuIHRoZSBwcmltYXJ5ICovCi0JCSAgICAvKiBQQ0kgYnVzLCBzbyBpdCBpcyBwcm9iYWJseSBhbiBBR1AgZGV2aWNlLiBGaW5kIHRoZSAqLwotCQkgICAgLyogQUdQIGJ1cyBkZXZpY2UgdGhhdCBjb250cm9scyB0aGF0IGJ1cyBzbyB3ZSBjYW4gKi8KLQkJICAgIC8qIGNvbnRyb2wgaXQuICovCi0JCSAgICBmb3IgKGogPSAwOyBqIDwgTnVtQnJpZGdlczsgaisrKSB7Ci0JCQlpbmZvID0gKFBDSURldmljZUluZm8qKSZQQ0lbQnJpZGdlSW5kZXhbal1dOwotCQkJaWYgKGluZm8tPnUudHlwZTEuU2Vjb25kYXlCdXNOdW1iZXIgPT0gUENJW2ldLnNsb3QucC5CdXMpIHsKLQkJCSAgICBBR1BCcmlkZ2UgPSBpbmZvOwotCQkJICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkvKiBFbnVtZXJhdGUgYWxsIFBDSSBhbmQgYnJpZGdlIGRldmljZXMgdG8gc3RhbmRhcmQgb3V0cHV0ICovCi0JRW51bWVyYXRlUENJKCk7Ci0JfQotICAgIHJldHVybiBOdW1EZXZpY2VzOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIC8qIEVudW1lcmF0ZSBhbGwgUENJIGRldmljZXMgKi8KLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFBDSV9lbnVtZXJhdGVEZXZpY2VzKCkgPCAxKSB7Ci0JcHJpbnRmKCJObyBQQ0kgZGlzcGxheSBkZXZpY2VzIGZvdW5kIVxuIik7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpY2suYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NzI1ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKLSogICAgICAgICAgICAgICB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX3NldFRpbWVySGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jaGFpblByZXZUaW1lcigpOwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZVRpbWVySGFuZGxlcigpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi12b2xhdGlsZSBsb25nIGNvdW50ID0gMDsKLQotI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KLQotdm9pZCBQTUFQSSB0aW1lckhhbmRsZXIodm9pZCkKLXsKLSAgICBQTV9jaGFpblByZXZUaW1lcigpOyAgICAgICAgLyogQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlciAqLwotICAgIGNvdW50Kys7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgbG9uZyAgICAgICAgICAgIG9sZENvdW50OwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgLyogSW5zdGFsbCBvdXIgdGltZXIgaGFuZGxlciBhbmQgbG9jayBoYW5kbGVyIHBhZ2VzIGluIG1lbW9yeS4gSXQgaXMKLSAgICAgKiBkaWZmaWN1bHQgdG8gZ2V0IHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gaW4gQywgYnV0IHdlIGtub3cgb3VyCi0gICAgICogZnVuY3Rpb24gaXMgd2VsbCBsZXNzIHRoYW4gMTAwIGJ5dGVzIChhbmQgYW4gZW50aXJlIDRrIHBhZ2Ugd2lsbAotICAgICAqIG5lZWQgdG8gYmUgbG9ja2VkIGJ5IHRoZSBzZXJ2ZXIgYW55d2F5KS4KLSAgICAgKi8KLSAgICBQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpdGltZXJIYW5kbGVyLDEwMCwmbGgpOwotICAgIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpOyAgICAgICAgICAgLyogV2UgKkRPTlQqIHdhbnQgQ3RybC1CcmVha3MhICovCi0gICAgUE1fc2V0VGltZXJIYW5kbGVyKHRpbWVySGFuZGxlcik7Ci0gICAgcHJpbnRmKCJUaW1lciBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWQgLSBIaXQgRVNDIHRvIGV4aXRcbiIpOwotICAgIG9sZENvdW50ID0gY291bnQ7Ci0gICAgd2hpbGUgKDEpIHsKLQlpZiAoUE1fa2JoaXQoKSAmJiAoUE1fZ2V0Y2goKSA9PSAweDFCKSkKLQkgICAgYnJlYWs7Ci0JaWYgKGNvdW50ICE9IG9sZENvdW50KSB7Ci0JICAgIHByaW50ZigiVGljaywgVG9jazogJWxkXG4iLCBjb3VudCk7Ci0JICAgIG9sZENvdW50ID0gY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKCk7Ci0gICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpOwotICAgIFBNX3VubG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV91bmxvY2tDb2RlUGFnZXMoKF9fY29kZVB0cil0aW1lckhhbmRsZXIsMTAwLCZsaCk7Ci0gICAgcHJpbnRmKCJUaW1lciBoYW5kbGVyIHdhcyBjYWxsZWQgJWxkIHRpbWVzXG4iLCBjb3VudCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aW1lcmMuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpbWVyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE3N2I3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpbWVyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgWmVuIFRpbWVyIExpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgInp0aW1lci5oIgotCi0jZGVmaW5lIERFTEFZX1NFQ1MgIDEwCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZSB0YWtlcyBhIGxvbmcgY291bnQgaW4gbWljcm9zZWNvbmRzIGFuZCBvdXRwdXRzCi0gKiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50IGluIHNlY29uZHMuIEl0IGNvdWxkIGJlIG1vZGlmaWVkIHRvCi0gKiByZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RhdGljIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50IHJhdGhlcgotICogdGhhbiBwcmludGluZyBpdCBvdXQuCi0gKi8KLQotdm9pZCBSZXBvcnRUaW1lKHVsb25nIGNvdW50KQotewotICAgIHVsb25nICAgc2VjczsKLQotICAgIHNlY3MgPSBjb3VudCAvIDEwMDAwMDBMOwotICAgIGNvdW50ID0gY291bnQgLSBzZWNzICogMTAwMDAwMEw7Ci0gICAgcHJpbnRmKCJUaW1lIHRha2VuOiAlbHUuJTA2bHUgc2Vjb25kc1xuIixzZWNzLGNvdW50KTsKLX0KLQotaW50ICAgICBpLGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT04gcmVnaXN0ZXIgdmFyaWFibGVzISAqLwotCi1pbnQgbWFpbih2b2lkKQotewotI2lmZGVmICBMT05HX1RFU1QKLSAgICB1bG9uZyAgIHN0YXJ0LGZpbmlzaDsKLSNlbmRpZgotCi0gICAgcHJpbnRmKCJQcm9jZXNzb3IgdHlwZTogJWQgJWxkIE1IelxuIiwgQ1BVX2dldFByb2Nlc3NvclR5cGUoKSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkKHRydWUpKTsKLQotICAgIFpUaW1lckluaXQoKTsKLQotICAgIC8qIFRlc3QgdGhlIGxvbmcgcGVyaW9kIFplbiBUaW1lciAod2UgZG9uJ3QgY2hlY2sgZm9yIG92ZXJmbG93IGNvegotICAgICAqIGl0IHdvdWxkIHRha2UgdG9vb29vIGxvbmchKQotICAgICAqLwotCi0gICAgTFpUaW1lck9uKCk7Ci0gICAgZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCi0JZm9yIChpID0gMDsgaSA8IDIwMDAwOyBpKyspCi0JICAgIGkgPSBpOwotICAgIExaVGltZXJPZmYoKTsKLSAgICBSZXBvcnRUaW1lKExaVGltZXJDb3VudCgpKTsKLQotICAgIC8qIFRlc3QgdGhlIHVsdHJhIGxvbmcgcGVyaW9kIFplbiBUaW1lciAqLwotI2lmZGVmIExPTkdfVEVTVAotICAgIHN0YXJ0ID0gVUxaUmVhZFRpbWUoKTsKLSAgICBkZWxheShERUxBWV9TRUNTICogMTAwMCk7Ci0gICAgZmluaXNoID0gVUxaUmVhZFRpbWUoKTsKLSAgICBwcmludGYoIkRlbGF5IG9mICVkIHNlY3MgdG9vayAlZCAxLzEwdGhzIG9mIGEgc2Vjb25kXG4iLAotCURFTEFZX1NFQ1MsVUxaRWxhcHNlZFRpbWUoc3RhcnQsZmluaXNoKSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjcHAuY3BwIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjcHAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU4YTRiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpbWVyY3BwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBDKysgMy4wCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgWmVuIFRpbWVyIExpYnJhcnkgQysrIGludGVyZmFjZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbS5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAienRpbWVyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludCAgICAgaSxqLGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9OIHJlZ2lzdGVyIHZhcmlhYmxlcyEgKi8KLQotdm9pZCBkdW1teSgpIHt9Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgTFpUaW1lciAgICAgbHRpbWVyOwotICAgIFVMWlRpbWVyICAgIHVsdGltZXI7Ci0KLSAgICBaVGltZXJJbml0KCk7Ci0KLSAgICAvKiBUZXN0IHRoZSBsb25nIHBlcmlvZCBaZW4gVGltZXIgKHdlIGRvbid0IGNoZWNrIGZvciBvdmVyZmxvdyBjb3oKLSAgICAgKiBpdCB3b3VsZCB0YWtlIHRvb29vbyBsb25nISkKLSAgICAgKi8KLQotICAgIGNvdXQgPDwgZW5kbDsKLSAgICB1bHRpbWVyLnJlc3RhcnQoKTsKLSAgICBsdGltZXIuc3RhcnQoKTsKLSAgICBmb3IgKGogPSAwOyBqIDwgMTA7IGorKykKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDIwMDAwOyBpKyspCi0gICAgICAgICAgICBkdW1teSgpOwotICAgIGx0aW1lci5zdG9wKCk7Ci0gICAgdWx0aW1lci5zdG9wKCk7Ci0gICAgY291dCA8PCAiTENvdW50OiAgIiA8PCBsdGltZXIuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwgIlRpbWU6ICAgICIgPDwgbHRpbWVyIDw8ICIgc2Vjc1xuIjsKLSAgICBjb3V0IDw8ICJVTENvdW50OiAiIDw8IHVsdGltZXIuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwgIlVMVGltZTogICIgPDwgdWx0aW1lciA8PCAiIHNlY3NcbiI7Ci0KLSAgICBjb3V0IDw8IGVuZGwgPDwgIlRpbWluZyAuLi4gXG4iOwotICAgIHVsdGltZXIucmVzdGFydCgpOwotICAgIGx0aW1lci5yZXN0YXJ0KCk7Ci0gICAgZm9yIChqID0gMDsgaiA8IDIwMDsgaisrKQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjAwMDA7IGkrKykKLSAgICAgICAgICAgIGR1bW15KCk7Ci0gICAgbHRpbWVyLnN0b3AoKTsKLSAgICB1bHRpbWVyLnN0b3AoKTsKLSAgICBjb3V0IDw8ICJMQ291bnQ6ICAiIDw8IGx0aW1lci5jb3VudCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCAiVGltZTogICAgIiA8PCBsdGltZXIgPDwgIiBzZWNzXG4iOwotICAgIGNvdXQgPDwgIlVMQ291bnQ6ICIgPDwgdWx0aW1lci5jb3VudCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCAiVUxUaW1lOiAgIiA8PCB1bHRpbWVyIDw8ICIgc2Vjc1xuIjsKLQotICAgIC8qIFRlc3QgdGhlIGxhcCBmdW5jdGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgWmVuIFRpbWVyICovCi0KLSAgICBjb3V0IDw8IGVuZGwgPDwgIlRpbWluZyAuLi4gXG4iOwotICAgIHVsdGltZXIucmVzdGFydCgpOwotICAgIGx0aW1lci5yZXN0YXJ0KCk7Ci0gICAgZm9yIChqID0gMDsgaiA8IDIwOyBqKyspIHsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IDEwOyBrKyspCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjAwMDA7IGkrKykKLSAgICAgICAgICAgICAgICBkdW1teSgpOwotICAgICAgICBjb3V0IDw8ICJsYXA6ICIgPDwgbHRpbWVyLmxhcCgpIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICBsdGltZXIuc3RvcCgpOwotICAgIHVsdGltZXIuc3RvcCgpOwotICAgIGNvdXQgPDwgIkxDb3VudDogICIgPDwgbHRpbWVyLmNvdW50KCkgPDwgZW5kbDsKLSAgICBjb3V0IDw8ICJUaW1lOiAgICAiIDw8IGx0aW1lciA8PCAiIHNlY3NcbiI7Ci0gICAgY291dCA8PCAiVUxDb3VudDogIiA8PCB1bHRpbWVyLmNvdW50KCkgPDwgZW5kbDsKLSAgICBjb3V0IDw8ICJVTFRpbWU6ICAiIDw8IHVsdGltZXIgPDwgIiBzZWNzXG4iOwotCi0jaWZkZWYgIExPTkdfVEVTVAotICAgIC8qIFRlc3QgdGhlIHVsdHJhIGxvbmcgcGVyaW9kIFplbiBUaW1lciAqLwotCi0gICAgdWx0aW1lci5zdGFydCgpOwotICAgIGRlbGF5KERFTEFZX1NFQ1MgKiAxMDAwKTsKLSAgICB1bHRpbWVyLnN0b3AoKTsKLSAgICBjb3V0IDw8ICJEZWxheSBvZiAiIDw8IERFTEFZX1NFQ1MgPDwgIiBzZWNzIHRvb2sgIiA8PCB1bHRpbWVyLmNvdW50KCkKLSAgICAgICAgIDw8ICIgMS8xMHRocyBvZiBhIHNlY29uZFxuIjsKLSAgICBjb3V0IDw8ICJUaW1lOiAiIDw8IHVsdGltZXIgPDwgIiBzZWNzXG4iOwotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy91c3djLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy91c3djLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYzdiZDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdXN3Yy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFNpbXBsZSB0ZXN0IHByb2dyYW0gdG8gdGVzdCB0aGUgd3JpdGUgY29tYmluZSBmdW5jdGlvbnMuCi0qCi0qICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgcHJvZ3JhbSBzaG91bGQgbmV2ZXIgYmUgdXNlZCBpbiBhIHByb2R1Y3Rpb24KLSogICAgICAgICAgICAgICBlbnZpcm9ubWVudCwgYmVjYXVzZSB3cml0ZSBjb21iaW5pbmcgbmVlZHMgdG8gYmUgaGFuZGxlZAotKiAgICAgICAgICAgICAgIHdpdGggbW9yZSBpbnRpbWF0ZSBrbm93bGVkZ2Ugb2YgdGhlIGRpc3BsYXkgaGFyZHdhcmUgdGhhbgotKiAgICAgICAgICAgICAgIHlvdSBjYW4gb2J0YWluIGJ5IHNpbXBseSBleGFtaW5pbmcgdGhlIFBDSSBjb25maWd1cmF0aW9uCi0qICAgICAgICAgICAgICAgc3BhY2UuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJwY2lsaWIuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1QQ0kgPSAtMTsKLXN0YXRpYyBQQ0lEZXZpY2VJbmZvICAgICpQQ0k7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAqQnJpZGdlSW5kZXg7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAqRGV2aWNlSW5kZXg7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1CcmlkZ2VzOwotc3RhdGljIFBDSURldmljZUluZm8gICAgKkFHUEJyaWRnZSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1EZXZpY2VzOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLU51bWJlciBvZiBkaXNwbGF5IGRldmljZXMgZm91bmQuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGVudW1lcmF0ZXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGlzcGxheSBkZXZpY2VzIG9uIHRoZQotUENJIGJ1cywgYW5kIHJldHVybnMgdGhlIG51bWJlciBmb3VuZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVEZXZpY2VzKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGksajsKLSAgICBQQ0lEZXZpY2VJbmZvICAgKmluZm87Ci0KLSAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQsIGVudW1lcmF0ZSBhbGwgKi8KLSAgICAvKiBkZXZpY2VzIG9uIHRoZSBQQ0kgYnVzLiAqLwotICAgIGlmIChOdW1QQ0kgPT0gLTEpIHsKLQlpZiAoKE51bVBDSSA9IFBDSV9nZXROdW1EZXZpY2VzKCkpID09IDApCi0JICAgIHJldHVybiAtMTsKLQlQQ0kgPSBtYWxsb2MoTnVtUENJICogc2l6ZW9mKFBDSVswXSkpOwotCUJyaWRnZUluZGV4ID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihCcmlkZ2VJbmRleFswXSkpOwotCURldmljZUluZGV4ID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihEZXZpY2VJbmRleFswXSkpOwotCWlmICghUENJIHx8ICFCcmlkZ2VJbmRleCB8fCAhRGV2aWNlSW5kZXgpCi0JICAgIHJldHVybiAtMTsKLQlmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspCi0JICAgIFBDSVtpXS5kd1NpemUgPSBzaXplb2YoUENJW2ldKTsKLQlpZiAoUENJX2VudW1lcmF0ZShQQ0kpID09IDApCi0JICAgIHJldHVybiAtMTsKLQotCS8qIEJ1aWxkIGEgbGlzdCBvZiBhbGwgUENJIGJyaWRnZSBkZXZpY2VzICovCi0JZm9yIChpID0gMCxOdW1CcmlkZ2VzID0gMCxCcmlkZ2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKLQkgICAgaWYgKFBDSVtpXS5CYXNlQ2xhc3MgPT0gUENJX0JSSURHRV9DTEFTUykKLQkJQnJpZGdlSW5kZXhbTnVtQnJpZGdlcysrXSA9IGk7Ci0JICAgIH0KLQotCS8qIE5vdyBidWlsZCBhIGxpc3Qgb2YgYWxsIGRpc3BsYXkgY2xhc3MgZGV2aWNlcyAqLwotCWZvciAoaSA9IDAsTnVtRGV2aWNlcyA9IDEsRGV2aWNlSW5kZXhbMF0gPSAtMTsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JICAgIGlmIChQQ0lfSVNfRElTUExBWV9DTEFTUygmUENJW2ldKSkgewotCQlpZiAoKFBDSVtpXS5Db21tYW5kICYgMHgzKSA9PSAweDMpCi0JCSAgICBEZXZpY2VJbmRleFswXSA9IGk7Ci0JCWVsc2UKLQkJICAgIERldmljZUluZGV4W051bURldmljZXMrK10gPSBpOwotCQlpZiAoUENJW2ldLnNsb3QucC5CdXMgIT0gMCkgewotCQkgICAgLyogVGhpcyBkZXZpY2UgaXMgb24gYSBkaWZmZXJlbnQgYnVzIHRoYW4gdGhlIHByaW1hcnkgKi8KLQkJICAgIC8qIFBDSSBidXMsIHNvIGl0IGlzIHByb2JhYmx5IGFuIEFHUCBkZXZpY2UuIEZpbmQgdGhlICovCi0JCSAgICAvKiBBR1AgYnVzIGRldmljZSB0aGF0IGNvbnRyb2xzIHRoYXQgYnVzIHNvIHdlIGNhbiAqLwotCQkgICAgLyogY29udHJvbCBpdC4gKi8KLQkJICAgIGZvciAoaiA9IDA7IGogPCBOdW1CcmlkZ2VzOyBqKyspIHsKLQkJCWluZm8gPSAoUENJRGV2aWNlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtqXV07Ci0JCQlpZiAoaW5mby0+dS50eXBlMS5TZWNvbmRheUJ1c051bWJlciA9PSBQQ0lbaV0uc2xvdC5wLkJ1cykgewotCQkJICAgIEFHUEJyaWRnZSA9IGluZm87Ci0JCQkgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIE51bURldmljZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW51bWVyYXRlcyB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgYXR0YWNoZWQgZGlzcGxheSBkZXZpY2VzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFNob3dEaXNwbGF5RGV2aWNlcyh2b2lkKQotewotICAgIGludCBpLGluZGV4OwotCi0gICAgcHJpbnRmKCJEaXNwbGF5aW5nIGVudW1lcmF0aW9uIG9mICVkIFBDSSBkaXNwbGF5IGRldmljZXNcbiIsIE51bURldmljZXMpOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIkRldmljZUlEICBTdWJTeXN0ZW0gIEJhc2UxMGggIChsZW5ndGggICkgIEJhc2UxNGggIChsZW5ndGggIClcbiIpOwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQlpID0gRGV2aWNlSW5kZXhbaW5kZXhdOwotCXByaW50ZigiJTA0WDolMDRYICUwNFg6JTA0WCAgJTA4bFggKCU2bGQgS0IpICUwOGxYICglNmxkIEtCKVxuIiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS51LnR5cGUwLlN1YlN5c3RlbVZlbmRvcklELAotCSAgICBQQ0lbaV0udS50eXBlMC5TdWJTeXN0ZW1JRCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMExlbiAvIDEwMjQsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTRMZW4gLyAxMDI0KTsKLQl9Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUR1bXBzIHRoZSB2YWx1ZSBmb3IgYSB3cml0ZSBjb21iaW5lIHJlZ2lvbiB0byB0aGUgZGlzcGxheS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY2hhciAqRGVjb2RlV0NUeXBlKAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICBzdGF0aWMgY2hhciAqbmFtZXNbXSA9IHsKLQkiVU5DQUNIQUJMRSIsCi0JIldSQ09NQiIsCi0JIlVOS05PV04iLAotCSJVTktOT1dOIiwKLQkiV1JUSFJPVUdIIiwKLQkiV1JQUk9UIiwKLQkiV1JCQUNLIiwKLQl9OwotICAgIGlmICh0eXBlIDw9IFBNX01UUlJfTUFYKQotCXJldHVybiBuYW1lc1t0eXBlXTsKLSAgICByZXR1cm4gIlVOS05PV04iOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUR1bXBzIHRoZSB2YWx1ZSBmb3IgYSB3cml0ZSBjb21iaW5lIHJlZ2lvbiB0byB0aGUgZGlzcGxheS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBQTUFQSSBFbnVtV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICBwcmludGYoIiUwOGxYICUtMTBsZCAlc1xuIiwgYmFzZSwgbGVuZ3RoIC8gMTAyNCwgRGVjb2RlV0NUeXBlKHR5cGUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1lcnIgLSBFcnJvciB0byBsb2cKLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGxvZyBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBNVFJSIHdyaXRlIGNvbWJpbmluZyBhdHRlbXB0IGZhaWxlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBMb2dNVFJSRXJyb3IoCi0gICAgaW50IGVycikKLXsKLSAgICBpZiAoZXJyID09IFBNX01UUlJfRVJSX09LKQotCXJldHVybjsKLSAgICBzd2l0Y2ggKGVycikgewotCWNhc2UgUE1fTVRSUl9OT1RfU1VQUE9SVEVEOgotCSAgICBwcmludGYoIkZhaWxlZDogTVRSUiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGhvc3QgQ1BVXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9QQVJBTVM6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBJbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFBNX2VuYWJsZVdyaXRlQ29tYmluZWQhXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9OT1RfNEtCX0FMSUdORUQ6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBBZGRyZXNzIGlzIG5vdCA0S2IgYWxpZ25lZCFcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX0JFTE9XXzFNQjoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IEFkZHJlc3NlcyBiZWxvdyAxTWIgY2Fubm90IGJlIHdyaXRlIGNvbWJpbmVkIVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfTk9UX0FMSUdORUQ6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBBZGRyZXNzIGlzIG5vdCBjb3JyZWN0bHkgYWxpZ25lZCBmb3IgcHJvY2Vzc29yIVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfT1ZFUkxBUDoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IEFkZHJlc3Mgb3ZlcmxhcHMgYW4gZXhpc3RpbmcgcmVnaW9uIVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfVFlQRV9NSVNNQVRDSDoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IEFkcmVzcyBpcyBjb250YWluZWQgd2l0aCBleGlzdGluZyByZWdpb24sIGJ1dCB0eXBlIGlzIGRpZmZlcmVudCFcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX05PTkVfRlJFRToKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IE91dCBvZiBNVFJSIHJlZ2lzdGVycyFcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX05PV1JDT01COgotCSAgICBwcmludGYoIkZhaWxlZDogVGhpcyBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB3cml0ZSBjb21iaW5pbmchXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOgotCSAgICBwcmludGYoIkZhaWxlZDogTVRSUiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGhvc3QgT1NcbiIpOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBwcmludGYoIkZhaWxlZDogVU5LTk9XTiBFUlJPUiFcbiIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgZXhpdCgtMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2hvd3MgYWxsIHdyaXRlIGNvbWJpbmUgcmVnaW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBTaG93V3JpdGVDb21iaW5lKHZvaWQpCi17Ci0gICAgcHJpbnRmKCJCYXNlICAgICBMZW5ndGgoS0IpIFR5cGVcbiIpOwotICAgIExvZ01UUlJFcnJvcihQTV9lbnVtV3JpdGVDb21iaW5lKEVudW1Xcml0ZUNvbWJpbmUpKTsKLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRHVtcHMgdGhlIHZhbHVlIGZvciBhIHdyaXRlIGNvbWJpbmUgcmVnaW9uIHRvIHRoZSBkaXNwbGF5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEVuYWJsZVdyaXRlQ29tYmluZSh2b2lkKQotewotICAgIGludCBpLGluZGV4OwotCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCWkgPSBEZXZpY2VJbmRleFtpbmRleF07Ci0JaWYgKFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTAgJiAweDgpIHsKLQkgICAgTG9nTVRSUkVycm9yKFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLQkJUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCAmIDB4RkZGRkZGRjAsCi0JCVBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTBMZW4sCi0JCVBNX01UUlJfV1JDT01CKSk7Ci0JICAgIH0KLQlpZiAoUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNCAmIDB4OCkgewotCSAgICBMb2dNVFJSRXJyb3IoUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotCQlQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0ICYgMHhGRkZGRkZGMCwKLQkJUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNExlbiwKLQkJUE1fTVRSUl9XUkNPTUIpKTsKLQkgICAgfQotCX0KLSAgICBwcmludGYoIlxuIik7Ci0gICAgU2hvd0Rpc3BsYXlEZXZpY2VzKCk7Ci0gICAgU2hvd1dyaXRlQ29tYmluZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUR1bXBzIHRoZSB2YWx1ZSBmb3IgYSB3cml0ZSBjb21iaW5lIHJlZ2lvbiB0byB0aGUgZGlzcGxheS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBEaXNhYmxlV3JpdGVDb21iaW5lKHZvaWQpCi17Ci0gICAgaW50IGksaW5kZXg7Ci0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JaSA9IERldmljZUluZGV4W2luZGV4XTsKLQlpZiAoUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCAmIDB4OCkgewotCSAgICBMb2dNVFJSRXJyb3IoUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotCQlQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwICYgMHhGRkZGRkZGMCwKLQkJUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMExlbiwKLQkJUE1fTVRSUl9VTkNBQ0hBQkxFKSk7Ci0JICAgIH0KLQlpZiAoUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNCAmIDB4OCkgewotCSAgICBMb2dNVFJSRXJyb3IoUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotCQlQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0ICYgMHhGRkZGRkZGMCwKLQkJUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNExlbiwKLQkJUE1fTVRSUl9VTkNBQ0hBQkxFKSk7Ci0JICAgIH0KLQl9Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIFNob3dEaXNwbGF5RGV2aWNlcygpOwotICAgIFNob3dXcml0ZUNvbWJpbmUoKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKQotewotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoUENJX2VudW1lcmF0ZURldmljZXMoKSA8IDEpIHsKLQlwcmludGYoIk5vIFBDSSBkaXNwbGF5IGRldmljZXMgZm91bmQhXG4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotICAgIGlmIChhcmdjIDwgMikgewotCXByaW50ZigidXNhZ2U6IHVzd2MgWy1zaG93IC1vbiAtb2ZmXVxuXG4iKTsKLQlTaG93RGlzcGxheURldmljZXMoKTsKLQlyZXR1cm4gLTE7Ci0JfQotICAgIGlmIChzdHJpY21wKGFyZ3ZbMV0sIi1zaG93IikgPT0gMCkKLQlTaG93V3JpdGVDb21iaW5lKCk7Ci0gICAgZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItb24iKSA9PSAwKQotCUVuYWJsZVdyaXRlQ29tYmluZSgpOwotICAgIGVsc2UgaWYgKHN0cmljbXAoYXJndlsxXSwiLW9mZiIpID09IDApCi0JRGlzYWJsZVdyaXRlQ29tYmluZSgpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdmZ0ZXN0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92ZnRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlM2JiNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92ZnRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBGaWxlbmFtZTogICAgICRXb3JrZmlsZSQKLSogVmVyc2lvbjogICAgICAkUmV2aXNpb246IDEuMSAkCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIHRlc3QgdGhlIFZGbGF0IHZpcnR1YWwgZnJhbWVidWZmZXIgZnVuY3Rpb25zLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgVkZfYXZhaWxhYmxlKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZGX2luaXQoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkZfZXhpdCgpCi0qCi0qICREYXRlOiAyMDAyLzEwLzAyIDE1OjM1OjIxICQgJEF1dGhvcjogaGZyaWVkZW4gJAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdWNoYXIgY29kZVtdID0gewotICAgIDB4QzMsICAgICAgICAgICAgICAgICAgIC8qIHJldCAgICAgICAgICAqLwotICAgIH07Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgdm9pZCAgICAqdmZCdWZmZXI7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIGlmICghVkZfYXZhaWxhYmxlKCkpIHsKLQlwcmludGYoIlZpcnR1YWwgTGluZWFyIEZyYW1lYnVmZmVyIG5vdCBhdmFpbGFibGUuXG4iKTsKLQlleGl0KDEpOwotCX0KLQotICAgIHZmQnVmZmVyID0gVkZfaW5pdCgweEEwMDAwLDY0LHNpemVvZihjb2RlKSxjb2RlKTsKLSAgICBpZiAoIXZmQnVmZmVyKSB7Ci0JcHJpbnRmKCJGYWlsdXJlIHRvIGluaXRpYWxpc2UgVmlydHVhbCBMaW5lYXIgRnJhbWVidWZmZXIhXG4iKTsKLQlleGl0KDEpOwotCX0KLSAgICBWRl9leGl0KCk7Ci0gICAgcHJpbnRmKCJWaXJ0dWFsIExpbmVhciBGcmFtZWJ1ZmZlciBzZXQgdXAgc3VjY2Vzc2Z1bGx5IVxuIik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92aWRlby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhZGNkZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92aWRlby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBnZW5lcmF0ZSByZWFsIG1vZGUKLSogICAgICAgICAgICAgICBpbnRlcnJ1cHRzIGFuZCB0byBiZSBhYmxlIHRvIG9idGFpbiBkaXJlY3QgYWNjZXNzIHRvIHRoZQotKiAgICAgICAgICAgICAgIHZpZGVvIG1lbW9yeSBmcm9tIHByb3RlY3RlZCBtb2RlLiBDb21waWxlIGFuZCBsaW5rIHdpdGgKLSogICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZCBsaW5lIGZvciB5b3VyIERPUyBleHRlbmRlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2dldEJJT1NTZWxlY3RvcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9tYXBQaHlzaWNhbEFkZHIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1faW50ODYoKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdWNoYXIgICAqYmlvczsgICAgICAgICAgLyogUG9pbnRlciB0byBCSU9TIGRhdGEgYXJlYSAgICAgICAgKi8KLXVjaGFyICAgKnZpZGVvUHRyOyAgICAgIC8qIFBvaW50ZXIgdG8gVkdBIGZyYW1lYnVmZmVyICAgICAgICovCi12b2lkICAgICpzdGF0ZUJ1ZjsgICAgICAvKiBDb25zb2xlIHN0YXRlIHNhdmUgYnVmZmVyICAgICAgICAqLwotCi0vKiBSb3V0aW5lIHRvIHJldHVybiB0aGUgY3VycmVudCB2aWRlbyBtb2RlIG51bWJlciAqLwotCi1pbnQgZ2V0VmlkZW9Nb2RlKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX2dldEJ5dGUoYmlvcysweDQ5KTsKLX0KLQotLyogUm91dGluZSB0byBzZXQgYSBzcGVjaWZpZWQgdmlkZW8gbW9kZSAqLwotCi12b2lkIHNldFZpZGVvTW9kZShpbnQgbW9kZSkKLXsKLSAgICBSTVJFR1MgcjsKLQotICAgIHIueC5heCA9IG1vZGU7Ci0gICAgUE1faW50ODYoMHgxMCwgJnIsICZyKTsKLX0KLQotLyogUm91dGluZSB0byBjbGVhciBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvbiB0aGUgZGlzcGxheSBieSBjYWxsaW5nIHRoZQotICogdmlkZW8gQklPUy4KLSAqLwotCi12b2lkIGNsZWFyU2NyZWVuKGludCBzdGFydHgsIGludCBzdGFydHksIGludCBlbmR4LCBpbnQgZW5keSwgdW5zaWduZWQgY2hhciBhdHRyKQotewotICAgIFJNUkVHUyByOwotCi0gICAgci54LmF4ID0gMHgwNjAwOwotICAgIHIuaC5iaCA9IGF0dHI7Ci0gICAgci5oLmNsID0gc3RhcnR4OwotICAgIHIuaC5jaCA9IHN0YXJ0eTsKLSAgICByLmguZGwgPSBlbmR4OwotICAgIHIuaC5kaCA9IGVuZHk7Ci0gICAgUE1faW50ODYoMHgxMCwgJnIsICZyKTsKLX0KLQotLyogUm91dGluZSB0byBmaWxsIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9uIHRoZSBkaXNwbGF5IHVzaW5nIGRpcmVjdAotICogdmlkZW8gd3JpdGVzLgotICovCi0KLSNkZWZpbmUgU0NSRUVOKHgseSkgKHZpZGVvUHRyICsgKCh5KSAqIDE2MCkgKyAoKHgpIDw8IDEpKQotCi12b2lkIGZpbGwoaW50IHN0YXJ0eCwgaW50IHN0YXJ0eSwgaW50IGVuZHgsIGludCBlbmR5LCB1bnNpZ25lZCBjaGFyIGMsCi0gICAgdW5zaWduZWQgY2hhciBhdHRyKQotewotICAgIHVuc2lnbmVkIGNoYXIgICAqdjsKLSAgICBpbnQgICAgICAgICAgICAgeCx5OwotCi0gICAgZm9yICh5ID0gc3RhcnR5OyB5IDw9IGVuZHk7IHkrKykgewotCXYgPSBTQ1JFRU4oc3RhcnR4LHkpOwotCWZvciAoeCA9IHN0YXJ0eDsgeCA8PSBlbmR4OyB4KyspIHsKLQkgICAgKnYrKyA9IGM7Ci0JICAgICp2KysgPSBhdHRyOwotCSAgICB9Ci0JfQotfQotCi0vKiBSb3V0aW5lIHRvIGRpc3BsYXkgYSBzaW5nbGUgY2hhcmFjdGVyIHVzaW5nIGRpcmVjdCB2aWRlbyB3cml0ZXMgKi8KLQotdm9pZCB3cml0ZUNoYXIoaW50IHgsIGludCB5LCB1bnNpZ25lZCBjaGFyIGMsIHVuc2lnbmVkIGNoYXIgYXR0cikKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp2ID0gU0NSRUVOKHgseSk7Ci0gICAgKnYrKyA9IGM7Ci0gICAgKnYgPSBhdHRyOwotfQotCi0vKiBSb3V0aW5lIHRvIGRyYXcgYSBib3JkZXIgYXJvdW5kIGEgcmVjdGFuZ3VsYXIgYXJlYSB1c2luZyBkaXJlY3QgdmlkZW8KLSAqIHdyaXRlcy4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBib3JkZXJfY2hhcnNbXSA9IHsKLSAgICAxODYsIDIwNSwgMjAxLCAxODcsIDIwMCwgMTg4ICAgICAgICAvKiBkb3VibGUgYm94IGNoYXJzICovCi0gICAgfTsKLQotdm9pZCBib3JkZXIoaW50IHN0YXJ0eCwgaW50IHN0YXJ0eSwgaW50IGVuZHgsIGludCBlbmR5LCB1bnNpZ25lZCBjaGFyIGF0dHIpCi17Ci0gICAgdW5zaWduZWQgY2hhciAgICp2OwotICAgIHVuc2lnbmVkIGNoYXIgICAqYjsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLQotICAgIGIgPSBib3JkZXJfY2hhcnM7Ci0KLSAgICBmb3IgKGkgPSBzdGFydHkrMTsgaSA8IGVuZHk7IGkrKykgewotCXdyaXRlQ2hhcihzdGFydHgsIGksICpiLCBhdHRyKTsKLQl3cml0ZUNoYXIoZW5keCwgaSwgKmIsIGF0dHIpOwotCX0KLSAgICBiKys7Ci0gICAgZm9yIChpID0gc3RhcnR4KzEsIHYgPSBTQ1JFRU4oc3RhcnR4KzEsIHN0YXJ0eSk7IGkgPCBlbmR4OyBpKyspIHsKLQkqdisrID0gKmI7Ci0JKnYrKyA9IGF0dHI7Ci0JfQotICAgIGZvciAoaSA9IHN0YXJ0eCsxLCB2ID0gU0NSRUVOKHN0YXJ0eCsxLCBlbmR5KTsgaSA8IGVuZHg7IGkrKykgewotCSp2KysgPSAqYjsKLQkqdisrID0gYXR0cjsKLQl9Ci0gICAgYisrOwotICAgIHdyaXRlQ2hhcihzdGFydHgsIHN0YXJ0eSwgKmIrKywgYXR0cik7Ci0gICAgd3JpdGVDaGFyKGVuZHgsIHN0YXJ0eSwgKmIrKywgYXR0cik7Ci0gICAgd3JpdGVDaGFyKHN0YXJ0eCwgZW5keSwgKmIrKywgYXR0cik7Ci0gICAgd3JpdGVDaGFyKGVuZHgsIGVuZHksICpiKyssIGF0dHIpOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCAgICAgb3JnTW9kZTsKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICBod25kQ29uc29sZSA9IFBNX29wZW5Db25zb2xlKDAsMCwwLDAsMCx0cnVlKTsKLSAgICBwcmludGYoIkhpdCBhbnkga2V5IHRvIHN0YXJ0IDgweDI1IHRleHQgbW9kZSBhbmQgcGVyZm9ybSBzb21lIGRpcmVjdCB2aWRlbyBvdXRwdXQuXG4iKTsKLSAgICBQTV9nZXRjaCgpOwotCi0gICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gc2F2ZSBjb25zb2xlIHN0YXRlIGFuZCBzYXZlIHRoZSBzdGF0ZSAqLwotICAgIGlmICgoc3RhdGVCdWYgPSBQTV9tYWxsb2MoUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSgpKSkgPT0gTlVMTCkgewotCXByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIGNvbnNvbGUgc3RhdGUgYnVmZmVyIVxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0gICAgUE1fc2F2ZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1ZiwwKTsKLSAgICBiaW9zID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBvcmdNb2RlID0gZ2V0VmlkZW9Nb2RlKCk7Ci0gICAgc2V0VmlkZW9Nb2RlKDB4Myk7Ci0gICAgaWYgKCh2aWRlb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigweEI4MDAwLDB4RkZGRix0cnVlKSkgPT0gTlVMTCkgewotCXByaW50ZigiVW5hYmxlIHRvIG9idGFpbiBwb2ludGVyIHRvIGZyYW1lYnVmZmVyIVxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0KLSAgICAvKiBEcmF3IHNvbWUgdGV4dCBvbiB0aGUgc2NyZWVuICovCi0gICAgZmlsbCgwLCAwLCA3OSwgMjQsIDE3NiwgMHgxRSk7Ci0gICAgYm9yZGVyKDAsIDAsIDc5LCAyNCwgMHgxRik7Ci0gICAgUE1fZ2V0Y2goKTsKLSAgICBjbGVhclNjcmVlbigwLCAwLCA3OSwgMjQsIDB4Nyk7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlIG9uIGV4aXQgKi8KLSAgICBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKHN0YXRlQnVmLDApOwotICAgIFBNX2ZyZWUoc3RhdGVCdWYpOwotICAgIFBNX2Nsb3NlQ29uc29sZShod25kQ29uc29sZSk7Ci0KLSAgICAvKiBEaXNwbGF5IHVzZWZ1bCBzdGF0dXMgaW5mb3JtYXRpb24gKi8KLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJPcmlnaW5hbCBWaWRlbyBNb2RlID0gJTAyWFxuIiwgb3JnTW9kZSk7Ci0gICAgcHJpbnRmKCJCSU9TIFBvaW50ZXIgPSAlMDhYXG4iLCAoaW50KWJpb3MpOwotICAgIHByaW50ZigiVmlkZW8gTWVtb3J5ID0gJTA4WFxuIiwgKGludCl2aWRlb1B0cik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MGI3Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIgVkRECi0qCi0qIERlc2NyaXB0aW9uOiAgVkREIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgVkREJ3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgICAgICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgVkREJ3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKSAgICAodm9pZCkoaSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgZnJlcS0+bG93ICA9IDEwMDAwMDsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HICAgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvdW50ID0gVkRIUXVlcnlTeXNWYWx1ZSgwLCBWREhHU1ZfTVNFQ1NCT09UKTsgXAotICAgICh0KS0+bG93ICA9IGNvdW50ICogMTAwOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2ZpbGVpby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2ZpbGVpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzc0MmRlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9maWxlaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMiBWREQKLSoKLSogRGVzY3JpcHRpb246ICBDIGxpYnJhcnkgY29tcGF0aWJsZSBJL08gZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIGEgVkRELgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAidmRkZmlsZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIENvZGUgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIEVPRiAtMQotCi0vKiBOQjogbm9uZSBvZiB0aGUgZmlsZSBWREhzIGFyZSBhdmFpbGFibGUgZHVyaW5nIHRoZSBET1Mgc2Vzc2lvbiAgICAgICAgICAqLwotLyogaW5pdGlhbHphdGlvbiBjb250ZXh0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogTWFjcm9zIGZvciBPcGVuL0Nsb3NlIEFQSXMgdG8gYWxsb3cgdXNpbmcgdGhpcyBtb2R1bGUgaW4gYm90aCBWRERzIGFuZCAgKi8KLS8qIG5vcm1hbCBPUy8yIGFwcGxpY2F0aW9ucy4gVW5mb3J0dW5hdGVseSBWREhSZWFkL1dyaXRlL1NlZWsgZG9uJ3QgbWFwIHRvICovCi0vKiB0aGVpciBEb3MqIGNvdW50ZXJwYXJ0cyBzbyBjbGVhbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIF9fT1MyX1ZERF9fCi0jZGVmaW5lIF9PUzJPcGVuICAgIFZESE9wZW4KLSNkZWZpbmUgX09TMkNsb3NlICAgVkRIQ2xvc2UKLSNlbHNlCi0jZGVmaW5lIF9PUzJPcGVuICAgIERvc09wZW4KLSNkZWZpbmUgX09TMkNsb3NlICAgRG9zQ2xvc2UKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZERCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZvcGVuIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUZJTEUgKiBmb3BlbigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBjb25zdCBjaGFyICptb2RlKQotewotICAgIEZJTEUgICAgKmYgPSBQTV9tYWxsb2Moc2l6ZW9mKEZJTEUpKTsKLSAgICBsb25nICAgIG9sZHBvczsKLSAgICBVTE9ORyAgIHJjLCB1bEFjdGlvbjsKLSAgICBVTE9ORyAgIG9tb2RlLCBvZmxhZ3M7Ci0KLSAgICBpZiAoZiAhPSBOVUxMKSB7Ci0JZi0+b2Zmc2V0ID0gMDsKLQlmLT50ZXh0ID0gKG1vZGVbMV0gPT0gJ3QnIHx8IG1vZGVbMl0gPT0gJ3QnKTsKLQlmLT53cml0ZW1vZGUgPSAobW9kZVswXSA9PSAndycpIHx8IChtb2RlWzBdID09ICdhJyk7Ci0JZi0+dW5wdXRjID0gRU9GOwotCWYtPmVuZHAgPSBmLT5idWYgKyBzaXplb2YoZi0+YnVmKTsKLQlmLT5jdXJwID0gZi0+c3RhcnRwID0gZi0+YnVmOwotCi0JaWYgKG1vZGVbMF0gPT0gJ3InKSB7Ci0JICAgICNpZmRlZiBfX09TMl9WRERfXwotCSAgICBvbW9kZSAgPSBWREhPUEVOX0FDQ0VTU19SRUFET05MWSB8IFZESE9QRU5fU0hBUkVfREVOWU5PTkU7Ci0JICAgIG9mbGFncyA9IFZESE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTIHwgVkRIT1BFTl9BQ1RJT05fRkFJTF9JRl9ORVc7Ci0JICAgICNlbHNlCi0JICAgIG9tb2RlICA9IE9QRU5fQUNDRVNTX1JFQURPTkxZIHwgT1BFTl9TSEFSRV9ERU5ZTk9ORTsKLQkgICAgb2ZsYWdzID0gT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFMgfCBPUEVOX0FDVElPTl9GQUlMX0lGX05FVzsKLQkgICAgI2VuZGlmCi0JICAgIH0KLQllbHNlIGlmIChtb2RlWzBdID09ICd3JykgewotCSAgICAjaWZkZWYgX19PUzJfVkREX18KLQkgICAgb21vZGUgID0gVkRIT1BFTl9BQ0NFU1NfV1JJVEVPTkxZIHwgVkRIT1BFTl9TSEFSRV9ERU5ZV1JJVEU7Ci0JICAgIG9mbGFncyA9IFZESE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTIHwgVkRIT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQkgICAgI2Vsc2UKLQkgICAgb21vZGUgID0gT1BFTl9BQ0NFU1NfV1JJVEVPTkxZIHwgT1BFTl9TSEFSRV9ERU5ZV1JJVEU7Ci0JICAgIG9mbGFncyA9IE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQkgICAgI2VuZGlmCi0JICAgIH0KLQllbHNlIHsKLQkgICAgI2lmZGVmIF9fT1MyX1ZERF9fCi0JICAgIG9tb2RlICA9IFZESE9QRU5fQUNDRVNTX1JFQURXUklURSB8IFZESE9QRU5fU0hBUkVfREVOWVdSSVRFOwotCSAgICBvZmxhZ3MgPSBWREhPUEVOX0FDVElPTl9PUEVOX0lGX0VYSVNUUyB8IFZESE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7Ci0JICAgICNlbHNlCi0JICAgIG9tb2RlICA9IE9QRU5fQUNDRVNTX1JFQURXUklURSB8IE9QRU5fU0hBUkVfREVOWVdSSVRFOwotCSAgICBvZmxhZ3MgPSBPUEVOX0FDVElPTl9PUEVOX0lGX0VYSVNUUyB8IE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7Ci0JICAgICNlbmRpZgotCSAgICB9Ci0JcmMgPSBfT1MyT3BlbigoUFNaKWZpbGVuYW1lLCAoUEhGSUxFKSZmLT5oYW5kbGUsICZ1bEFjdGlvbiwgMCwgVkRIT1BFTl9GSUxFX05PUk1BTCwgb2ZsYWdzLCBvbW9kZSwgTlVMTCk7Ci0JaWYgKHJjICE9IDApIHsKLQkgICAgUE1fZnJlZShmKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSNpZmRlZiBfX09TMl9WRERfXwotCWYtPmZpbGVzaXplID0gVkRIU2VlaygoSEZJTEUpZi0+aGFuZGxlLCAwLCBWREhTS19FTkRfT0ZfRklMRSk7Ci0JI2Vsc2UKLQlyYyA9IERvc1NldEZpbGVQdHIoKEhGSUxFKWYtPmhhbmRsZSwgMCwgRklMRV9FTkQsICZmLT5maWxlc2l6ZSk7Ci0JI2VuZGlmCi0KLQlpZiAobW9kZVswXSA9PSAnYScpCi0JICAgIGZzZWVrKGYsMCwyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnJlYWQgZnVuY3Rpb24uIE5vdGUgdGhhdCB1bmxpa2UgV2luZG93cyBWeERzLAotT1MvMiBWRERzIGFyZSBub3QgbGltaXRlZCB0byA2NEsgcmVhZHMgb3Igd3JpdGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNpemVfdCBmcmVhZCgKLSAgICB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUsCi0gICAgc2l6ZV90IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBjaGFyICAgICpidWYgPSBwdHI7Ci0gICAgaW50ICAgICBieXRlcyxyZWFkYnl0ZXMsdG90YWxieXRlcyA9IDA7Ci0KLSAgICAvKiBGaXJzdCBjb3B5IGFueSBkYXRhIGFscmVhZHkgcmVhZCBpbnRvIG91ciBidWZmZXIgKi8KLSAgICBpZiAoKGJ5dGVzID0gKGYtPmN1cnAgLSBmLT5zdGFydHApKSA+IDApIHsKLQltZW1jcHkoYnVmLGYtPmN1cnAsYnl0ZXMpOwotCWYtPnN0YXJ0cCA9IGYtPmN1cnAgPSBmLT5idWY7Ci0JYnVmICs9IGJ5dGVzOwotCXRvdGFsYnl0ZXMgKz0gYnl0ZXM7Ci0JYnl0ZXMgPSAoc2l6ZSAqIG4pIC0gYnl0ZXM7Ci0JfQotICAgIGVsc2UKLQlieXRlcyA9IHNpemUgKiBuOwotICAgIGlmIChieXRlcykgewotCSNpZmRlZiBfX09TMl9WRERfXwotCXJlYWRieXRlcyA9IFZESFJlYWQoKEhGSUxFKWYtPmhhbmRsZSwgYnVmLCBieXRlcyk7Ci0JI2Vsc2UKLQlEb3NSZWFkKChIRklMRSlmLT5oYW5kbGUsIGJ1ZiwgYnl0ZXMsICZyZWFkYnl0ZXMpOwotCSNlbmRpZgotCXRvdGFsYnl0ZXMgKz0gcmVhZGJ5dGVzOwotCWYtPm9mZnNldCArPSByZWFkYnl0ZXM7Ci0JfQotICAgIHJldHVybiB0b3RhbGJ5dGVzIC8gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WREQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmd3JpdGUgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc2l6ZV90IGZ3cml0ZSgKLSAgICB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUsCi0gICAgc2l6ZV90IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBjaGFyICAgICAgICAqYnVmID0gcHRyOwotICAgIGludCAgICAgICAgIGJ5dGVzLHdyaXR0ZW5ieXRlcyx0b3RhbGJ5dGVzID0gMDsKLQotICAgIC8qIEZsdXNoIGFueXRoaW5nIGFscmVhZHkgaW4gdGhlIGJ1ZmZlciAqLwotICAgIGlmICghZi0+d3JpdGVtb2RlKQotCXJldHVybiAwOwotICAgIGZmbHVzaChmKTsKLSAgICBieXRlcyA9IHNpemUgKiBuOwotICAgICNpZmRlZiBfX09TMl9WRERfXwotICAgIHdyaXR0ZW5ieXRlcyA9IFZESFdyaXRlKChIRklMRSlmLT5oYW5kbGUsIGJ1ZiwgYnl0ZXMpOwotICAgICNlbHNlCi0gICAgRG9zV3JpdGUoKEhGSUxFKWYtPmhhbmRsZSwgYnVmLCBieXRlcywgJndyaXR0ZW5ieXRlcyk7Ci0gICAgI2VuZGlmCi0gICAgdG90YWxieXRlcyArPSB3cml0dGVuYnl0ZXM7Ci0gICAgZi0+b2Zmc2V0ICs9IHdyaXR0ZW5ieXRlczsKLSAgICBpZiAoZi0+b2Zmc2V0ID4gZi0+ZmlsZXNpemUpCi0JZi0+ZmlsZXNpemUgPSBmLT5vZmZzZXQ7Ci0gICAgcmV0dXJuIHRvdGFsYnl0ZXMgLyBzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZmbHVzaCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmZsdXNoKAotICAgIEZJTEUgKmYpCi17Ci0gICAgVUxPTkcgICAgIGJ5dGVzOwotCi0gICAgLyogRmlyc3QgY29weSBhbnkgZGF0YSBhbHJlYWR5IHdyaXR0ZW4gaW50byBvdXIgYnVmZmVyICovCi0gICAgaWYgKGYtPndyaXRlbW9kZSAmJiAoYnl0ZXMgPSAoZi0+Y3VycCAtIGYtPnN0YXJ0cCkpID4gMCkgewotCSNpZmRlZiBfX09TMl9WRERfXwotCWJ5dGVzID0gVkRIV3JpdGUoKEhGSUxFKWYtPmhhbmRsZSwgZi0+c3RhcnRwLCBieXRlcyk7Ci0JI2Vsc2UKLQlEb3NXcml0ZSgoSEZJTEUpZi0+aGFuZGxlLCBmLT5zdGFydHAsIGJ5dGVzLCAmYnl0ZXMpOwotCSNlbmRpZgotCWYtPm9mZnNldCArPSBieXRlczsKLQlpZiAoZi0+b2Zmc2V0ID4gZi0+ZmlsZXNpemUpCi0JICAgIGYtPmZpbGVzaXplID0gZi0+b2Zmc2V0OwotCWYtPnN0YXJ0cCA9IGYtPmN1cnAgPSBmLT5idWY7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZERCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZzZWVrIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmc2VlaygKLSAgICBGSUxFICpmLAotICAgIGxvbmcgaW50IG9mZnNldCwKLSAgICBpbnQgd2hlbmNlKQotewotICAgIGZmbHVzaChmKTsKLQotICAgIGlmICh3aGVuY2UgPT0gMCkKLQlmLT5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZWxzZSBpZiAod2hlbmNlID09IDEpCi0JZi0+b2Zmc2V0ICs9IG9mZnNldDsKLSAgICBlbHNlIGlmICh3aGVuY2UgPT0gMikKLQlmLT5vZmZzZXQgPSBmLT5maWxlc2l6ZSArIG9mZnNldDsKLQotICAgICNpZmRlZiBfX09TMl9WRERfXwotICAgIFZESFNlZWsoKEhGSUxFKWYtPmhhbmRsZSwgZi0+b2Zmc2V0LCBWREhTS19BQlNPTFVURSk7Ci0gICAgI2Vsc2UKLSAgICBEb3NTZXRGaWxlUHRyKChIRklMRSlmLT5oYW5kbGUsIGYtPm9mZnNldCwgRklMRV9CRUdJTiwgTlVMTCk7Ci0gICAgI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WREQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmdGVsbCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nIGZ0ZWxsKAotICAgIEZJTEUgKmYpCi17Ci0gICAgbG9uZyAgICBvZmZzZXQ7Ci0KLSAgICBvZmZzZXQgPSAoZi0+Y3VycCAtIGYtPnN0YXJ0cCk7Ci0gICAgb2Zmc2V0ICs9IGYtPm9mZnNldDsKLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZERCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZlb2YgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZlb2YoCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gKGYtPm9mZnNldCA9PSBmLT5maWxlc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgaW5wdXQgZmlsZSBidWZmZXIsIGluY2x1ZGluZyB0cmFuc2xhdGlvbgotb2YgdGhlIGNoYXJhY3RlciBpbiB0ZXh0IHRyYW5zYXRpb24gbW9kZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBfX2dldGMoCi0gICAgRklMRSAqZikKLXsKLSAgICBpbnQgYzsKLQotICAgIGlmIChmLT51bnB1dGMgIT0gRU9GKSB7Ci0JYyA9IGYtPnVucHV0YzsKLQlmLT51bnB1dGMgPSBFT0Y7Ci0JfQotICAgIGVsc2UgewotCWlmIChmLT5zdGFydHAgPT0gZi0+Y3VycCkgewotCSAgICBpbnQgYnl0ZXMgPSBmcmVhZChmLT5idWYsMSxzaXplb2YoZi0+YnVmKSxmKTsKLQkgICAgaWYgKGJ5dGVzID09IDApCi0JCXJldHVybiBFT0Y7Ci0JICAgIGYtPmN1cnAgPSBmLT5zdGFydHAgKyBieXRlczsKLQkgICAgfQotCWMgPSAqZi0+c3RhcnRwKys7Ci0JaWYgKGYtPnRleHQgJiYgYyA9PSAnXHInKSB7Ci0JICAgIGludCBuYyA9IF9fZ2V0YyhmKTsKLQkgICAgaWYgKG5jICE9ICdcbicpCi0JCWYtPnVucHV0YyA9IG5jOwotCSAgICB9Ci0JfQotICAgIHJldHVybiBjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdyaXRlIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRvIGlucHV0IGJ1ZmZlciwgaW5jbHVkaW5nIHRyYW5zbGF0aW9uIG9mIHRoZQotY2hhcmFjdGVyIGluIHRleHQgdHJhbnNhdGlvbiBtb2Rlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IF9fcHV0YyhpbnQgYyxGSUxFICpmKQotewotICAgIGludCBjb3VudCA9IDE7Ci0gICAgaWYgKGYtPnRleHQgJiYgYyA9PSAnXG4nKSB7Ci0JX19wdXRjKCdccicsZik7Ci0JY291bnQgPSAyOwotCX0KLSAgICBpZiAoZi0+Y3VycCA9PSBmLT5lbmRwKQotCWZmbHVzaChmKTsKLSAgICAqZi0+Y3VycCsrID0gYzsKLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmdldHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqZmdldHMoCi0gICAgY2hhciAqcywKLSAgICBpbnQgbiwKLSAgICBGSUxFICpmKQotewotICAgIGludCBjID0gMDsKLSAgICBjaGFyICpjczsKLQotICAgIGNzID0gczsKLSAgICB3aGlsZSAoLS1uID4gMCAmJiAoYyA9IF9fZ2V0YyhmKSkgIT0gRU9GKSB7Ci0JKmNzKysgPSBjOwotCWlmIChjID09ICdcbicpCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAoYyA9PSBFT0YgJiYgY3MgPT0gcykKLQlyZXR1cm4gTlVMTDsKLSAgICAqY3MgPSAnXDAnOwotICAgIHJldHVybiBzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZwdXRzIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmcHV0cygKLSAgICBjb25zdCBjaGFyICpzLAotICAgIEZJTEUgKmYpCi17Ci0gICAgaW50IHIgPSAwOwotICAgIGludCBjOwotCi0gICAgd2hpbGUgKChjID0gKnMrKykgIT0gMCkKLQlyID0gX19wdXRjKGMsIGYpOwotICAgIHJldHVybiByOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZjbG9zZSBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmNsb3NlKAotICAgIEZJTEUgKmYpCi17Ci0gICAgZmZsdXNoKGYpOwotICAgIF9PUzJDbG9zZSgoSEZJTEUpZi0+aGFuZGxlKTsKLSAgICBQTV9mcmVlKGYpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyODZiZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yIFZERAotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4OGJhYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIgVkRECi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2luY2x1ZGUgIm10cnIuaCIKLQotI2RlZmluZSBUUkFDRShhKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE1BWF9NRU1PUllfU0hBUkVEICAgICAgICAgICAxMDAKLSNkZWZpbmUgTUFYX01FTU9SWV9NQVBQSU5HUyAgICAgICAgIDEwMAotCi0vKiBUT0RPOiBJIHRoaW5rIHRoZSBnbG9iYWwgYW5kIGxpbmVhciBtZW1iZXJzIHdpbGwgYmUgdGhlIHNhbWUsIGJ1dCBub3Qgc3VyZSB5ZXQuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCAgICAqbGluZWFyOwotICAgIHVsb25nICAgZ2xvYmFsOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIGludCAgICAgbnBhZ2VzOwotICAgIH0gbWVtc2hhcmVkOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBwaHlzaWNhbDsKLSAgICB1bG9uZyAgIGxpbmVhcjsKLSAgICB1bG9uZyAgIGxlbmd0aDsKLSAgICBpbnQgICAgIG5wYWdlczsKLSAgICBpYm9vbCAgIGlzQ2FjaGVkOwotICAgIH0gbW1hcHBpbmc7Ci0KLXN0YXRpYyBpbnQgICAgICAgICAgbnVtTWFwcGluZ3MgPSAwOwotc3RhdGljIG1lbXNoYXJlZCAgICBzaGFyZWRbTUFYX01FTU9SWV9NQVBQSU5HU10gPSB7MH07Ci1zdGF0aWMgbW1hcHBpbmcgICAgIG1hcHNbTUFYX01FTU9SWV9NQVBQSU5HU107Ci1pYm9vbCAgICAgICAgICAgICAgIF9QTV9oYXZlQklPUyA9IFRSVUU7Ci1jaGFyICAgICAgICAgICAgICAgIF9QTV9jbnRQYXRoW1BNX01BWF9QQVRIXSA9ICIiOyAgICAgLyogdGhlcmUganVzdCBpc24ndCBhbnkgKi8KLXVjaGFyICAgICAgICAgICAgICAgKl9QTV9ybUJ1ZkFkZHIgPSBOVUxMOwotdXNob3J0IF9WQVJBUEkgICAgICBQTV9zYXZlZERTID0gMDsgICAvKiB3aHkgY2FuJ3QgSSB1c2UgdGhlIHVuZGVyc2NvcmUgcHJlZml4PyAqLwotCi1IVkRIU0VNICAgICAgICAgICAgIGhldkZhckNhbGxSZXQgPSBOVUxMOwotSFZESFNFTSAgICAgICAgICAgICBoZXZJUmV0ICAgICAgID0gTlVMTDsKLUhIT09LICAgICAgICAgICAgICAgaGhvb2tVc2VyUmV0dXJuSG9vayA9IE5VTEw7Ci1ISE9PSyAgICAgICAgICAgICAgIGhob29rVXNlcklSZXRIb29rICAgPSBOVUxMOwotCi1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBDTU9TIHJlZ2lzdGVycyAqLwotCi11bG9uZyAgIFBNQVBJIF9QTV9nZXRQREIodm9pZCk7Ci11Y2hhciAgIFBNQVBJIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpOwotdm9pZCAgICBQTUFQSSBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSk7Ci0KLVZPSUQgSE9PS0VOVFJZIFVzZXJSZXR1cm5Ib29rKFBWT0lEIHBSZWZEYXRhLCBQQ1JGIHBjcmYpOwotVk9JRCBIT09LRU5UUlkgVXNlcklSZXRIb29rKFBWT0lEIHBSZWZEYXRhLCBQQ1JGIHBjcmYpOwotCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICBNVFJSX2luaXQoKTsKLQotICAgIC8qIEluaXRpYWxpemUgVkRELXNwZWNpZmljIGRhdGEgKi8KLSAgICAvKiBOb3RlOiBQTV9pbml0IG11c3QgYmUgKG9idmlvdXNseSkgY2FsbGVkIGluIFZETSB0YXNrIGNvbnRleHQhICovCi0gICAgVkRIQ3JlYXRlU2VtKCZoZXZGYXJDYWxsUmV0LCBWREhfRVZFTlRTRU0pOwotICAgIFZESENyZWF0ZVNlbSgmaGV2SVJldCwgVkRIX0VWRU5UU0VNKTsKLSAgICBoaG9va1VzZXJSZXR1cm5Ib29rID0gVkRIQWxsb2NIb29rKFZESF9SRVRVUk5fSE9PSywgKFBGTkFSTSlVc2VyUmV0dXJuSG9vaywgMCk7Ci0gICAgaGhvb2tVc2VySVJldEhvb2sgICA9IFZESEFsbG9jSG9vayhWREhfUkVUVVJOX0hPT0ssIChQRk5BUk0pVXNlcklSZXRIb29rLCAwKTsKLQotICAgIGlmICgoaGV2SVJldCA9PSBOVUxMKSB8fCAoaGV2RmFyQ2FsbFJldCA9PSBOVUxMKSB8fAotCShoaG9va1VzZXJSZXR1cm5Ib29rID09IE5VTEwpIHx8IChoaG9va1VzZXJJUmV0SG9vayA9PSBOVUxMKSkgewotCS8qIHNvbWV0aGluZyBmYWlsZWQsIHdlIGNhbid0IGdvIG9uICovCi0JLyogVE9ETzogdGFrZSBzb21lIGFjdGlvbiBoZXJlISAqLwotCX0KLX0KLQotLyogRG8gc29tZSBjbGVhbmluZyB1cCAqLwotdm9pZCBQTUFQSSBQTV9leGl0KHZvaWQpCi17Ci0gICAgLyogTm90ZTogSG9va3MgYWxsb2NhdGVkIGR1cmluZyBvciBhZnRlciBWRE0gY3JlYXRpb24gYXJlIGRlYWxsb2NhdGVkIGF1dG9tYXRpY2FsbHkgKi8KLSAgICBpZiAoaGV2SVJldCAhPSBOVUxMKQotCVZESERlc3Ryb3lTZW0oaGV2SVJldCk7Ci0KLSAgICBpZiAoaGV2RmFyQ2FsbFJldCAhPSBOVUxMKQotCVZESERlc3Ryb3lTZW0oaGV2RmFyQ2FsbFJldCk7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17IHJldHVybiBfUE1faGF2ZUJJT1M7IH0KLQotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsgcmV0dXJuIC8qX09TX09TMlZERCovIF9PU19PUzI7IH0gIC8qRklYISEgKi8KLQotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17IHJldHVybiBQTV8zODY7IH0KLQotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotLyogICAgRmF0YWxfRXJyb3JfSGFuZGxlcihtc2csMCk7ICBUT0RPOiBpbXBsZW1lbnQgc29tZWhvdyEgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1sZW4gICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyCi1yc2VnICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlYWwgbW9kZSBzZWdtZW50IG9mIHRoZSBidWZmZXIKLXJvZmYgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVhbCBtb2RlIG9mZnNldCBvZiB0aGUgYnVmZmVyCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgZ2xvYmFsIFZFU0EgdHJhbnNmZXIKLWJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1ZigKLSAgICB1aW50ICpsZW4sCi0gICAgdWludCAqcnNlZywKLSAgICB1aW50ICpyb2ZmKQotewotICAgIGlmIChfUE1fcm1CdWZBZGRyKSB7Ci0JKmxlbiA9IDA7IC8qVkVTQV9CVUZfU0laRTsgKi8KLQkqcnNlZyA9ICh1bG9uZykoX1BNX3JtQnVmQWRkcikgPj4gNDsKLQkqcm9mZiA9ICh1bG9uZykoX1BNX3JtQnVmQWRkcikgJiAweEY7Ci0JcmV0dXJuIF9QTV9ybUJ1ZkFkZHI7Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgUE1BUEkgUE1faW50Mzg2KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQpCi17Ci0gICAgLyogVW51c2VkIGluIFZERHMgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKGNoYXIgKnBhdGgsaW50IG1heExlbikKLXsKLSAgICBzdHJuY3B5KHBhdGgsIF9QTV9jbnRQYXRoLCBtYXhMZW4pOwotICAgIHBhdGhbbWF4TGVuIC0gMV0gPSAwOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQotewotICAgIHVsb25nICAgYm9vdCA9IDM7Ci0gICAgYm9vdCA9IFZESFF1ZXJ5U3lzVmFsdWUoMCwgVkRIR1NWX0JPT1REUlYpOwotICAgIHJldHVybiAoY2hhcikoJ2EnICsgYm9vdCAtIDEpOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFtDQ0hNQVhQQVRIXTsKLSAgICBzdHJjcHkocGF0aCwieDpcXCIpOwotICAgIHBhdGhbMF0gPSBQTV9nZXRCb290RHJpdmUoKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0Jc3RhdGljIGNoYXIgcGF0aFtDQ0hNQVhQQVRIXTsKLQlzdHJjcHkocGF0aCwieDpcXG9zMlxcZHJpdmVycyIpOwotCXBhdGhbMF0gPSBQTV9nZXRCb290RHJpdmUoKTsKLQlQTV9iYWNrc2xhc2gocGF0aCk7Ci0Jc3RyY2F0KHBhdGgsIm51Y2xldXMiKTsKLQlyZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQoteyByZXR1cm4gUE1fZ2V0TWFjaGluZU5hbWUoKTsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICByZXR1cm4gIlVua25vd24iOwotfQotCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsgcmV0dXJuIDE7IH0KLQotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17IHJldHVybiAwOyB9Ci0KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoUE1fSFdORCBod25kVXNlcixpbnQgZGV2aWNlLGludCB4UmVzLGludCB5UmVzLGludCBicHAsaWJvb2wgZnVsbFNjcmVlbikKLXsKLSAgICAvKiBVbnVzZWQgaW4gVkREcyAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIC8qIFVudXNlZCBpbiBWRERzICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIFVudXNlZCBpbiBWRERzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKGludCAoX0FTTUFQSVAgc2F2ZVN0YXRlKShpbnQgZmxhZ3MpKQotewotICAgIC8qIFVudXNlZCBpbiBWRERzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIFVudXNlZCBpbiBWRERzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogVW51c2VkIGluIFZERHMgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQotewotICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUwLHgpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MSx5KTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRPU1NjcmVlbldpZHRoKGludCB3aWR0aCxpbnQgaGVpZ2h0KQotewotICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDRBLHdpZHRoKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODQsaGVpZ2h0LTEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4gRm9yIE9TLzIgVkREIHdlIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkKLWFzIGxvY2tlZCwgZ2xvYmFsIG1lbW9yeSB0aGF0IGlzIGFjY2Vzc2libGUgZnJvbSBhbnkgbWVtb3J5IGNvbnRleHQKLShpbmNsdWRpbmcgaW50ZXJydXB0IHRpbWUgY29udGV4dCksIHdoaWNoIGFsbG93cyB1cyB0byBsb2FkIG91ciBpbXBvcnRhbnQKLWRhdGEgc3RydWN0dXJlIGFuZCBjb2RlIHN1Y2ggdGhhdCB3ZSBjYW4gYWNjZXNzIGl0IGRpcmVjdGx5IGZyb20gYSByaW5nCi0wIGludGVycnVwdCBjb250ZXh0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQobG9uZyBzaXplKQotewotICAgIFVMT05HICAgICAgIG5QYWdlcyA9IChzaXplICsgMHhGRkYpID4+IDEyOwotICAgIGludCAgICAgICAgIGk7Ci0KLSAgICAvKiBGaXJzdCBmaW5kIGEgZnJlZSBzbG90IGluIG91ciBzaGFyZWQgbWVtb3J5IHRhYmxlICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfU0hBUkVEOyBpKyspIHsKLQlpZiAoc2hhcmVkW2ldLmxpbmVhciA9PSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGkgPCBNQVhfTUVNT1JZX1NIQVJFRCkgewotCXNoYXJlZFtpXS5saW5lYXIgPSBWREhBbGxvY1BhZ2VzKE5VTEwsIG5QYWdlcywgVkRIQVBfU1lTVEVNIHwgVkRIQVBfRklYRUQpOwotCXNoYXJlZFtpXS5ucGFnZXMgPSBuUGFnZXM7Ci0Jc2hhcmVkW2ldLmdsb2JhbCA9IChVTE9ORylzaGFyZWRbaV0ubGluZWFyOwotCXJldHVybiAodm9pZCopc2hhcmVkW2ldLmdsb2JhbDsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIEZpbmQgYSBzaGFyZWQgbWVtb3J5IGJsb2NrIGluIG91ciB0YWJsZSBhbmQgZnJlZSBpdCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7Ci0JaWYgKHNoYXJlZFtpXS5nbG9iYWwgPT0gKHVsb25nKXApIHsKLQkgICAgVkRIRnJlZVBhZ2VzKHNoYXJlZFtpXS5saW5lYXIpOwotCSAgICBzaGFyZWRbaV0ubGluZWFyID0gMDsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKLXsgcmV0dXJuICh2b2lkKiliYXNlOyB9Ci0KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgLyogVE9ETzogRmlndXJlIG91dCBob3cgdG8gZG8gdGhpcyAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17IHJldHVybiAodm9pZCopMHg0MDA7IH0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoteyByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAgICAgLSBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBtYXBzIGluCi1saW1pdCAgICAgICAtIExpbWl0IG9mIHBoeXNpY2FsIG1lbW9yeSB0byByZWdpb24gdG8gbWFwcyBpbgotCi1SRVRVUk5TOgotTGluZWFyIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IG1hcHBlZCBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1NYXBzIGEgcGh5c2ljYWwgbWVtb3J5IHJhbmdlIHRvIGEgbGluZWFyIG1lbW9yeSByYW5nZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBNYXBQaHlzaWNhbFRvTGluZWFyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaW50ICpucGFnZXMpCi17Ci0gICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKLSAgICBpbnQgICAgIGkscHBhZ2UsZmxhZ3M7Ci0jaWYgMAotICAgIHBwYWdlID0gYmFzZSA+PiAxMjsKLSAgICAqbnBhZ2VzID0gKGxlbmd0aCArIChiYXNlICYgMHhGRkYpICsgNDA5NSkgPj4gMTI7Ci0gICAgZmxhZ3MgPSBQUl9GSVhFRCB8IFBSX1NUQVRJQzsKLSAgICBpZiAoYmFzZSA9PSAweEEwMDAwKSB7Ci0JLyogV2UgcmVxdWlyZSB0aGUgbGluZWFyIGFkZHJlc3MgdG8gYmUgYWxpZ25lZCB0byBhIDY0S2IgYm91bmRhcnkKLQkgKiBmb3IgbWFwcGluZyB0aGUgYmFua2VkIGZyYW1lYnVmZmVyIChzbyB3ZSBjYW4gZG8gZWZmaWNpZW50Ci0JICogY2FycnkgY2hlY2tpbmcgZm9yIGJhbmsgY2hhbmdlcyBpbiB0aGUgYXNzZW1ibGVyIGNvZGUpLiBUaGUgb25seQotCSAqIHdheSB0byBlbnN1cmUgdGhpcyBpcyB0byBmb3JjZSB0aGUgbGluZWFyIGFkZHJlc3MgdG8gYmUgYWxpZ25lZAotCSAqIHRvIGEgNE1iIGJvdW5kYXJ5LgotCSAqLwotCWZsYWdzIHw9IFBSXzRNRUc7Ci0JfQotICAgIGlmICgobGluZWFyID0gKHVsb25nKVBhZ2VSZXNlcnZlKFBSX1NZU1RFTSwqbnBhZ2VzLGZsYWdzKSkgPT0gKHVsb25nKS0xKQotCXJldHVybiAwOwotICAgIGlmICghUGFnZUNvbW1pdFBoeXMobGluZWFyID4+IDEyLCpucGFnZXMscHBhZ2UsUENfSU5DUiB8IFBDX1VTRVIgfCBQQ19XUklURUFCTEUpKQotCXJldHVybiAwOwotI2VuZGlmCi0gICAgcmV0dXJuIGxpbmVhciArIChiYXNlICYgMHhGRkYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgICAgIC0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdG8gbWFwIGluCi1saW1pdCAgICAgICAtIExpbWl0IG9mIHBoeXNpY2FsIG1lbW9yeSB0byByZWdpb24gdG8gbWFwIGluCi1pc0NhY2hlZCAgICAtIFRydWUgaWYgdGhlIG1lbW9yeSBzaG91bGQgYmUgY2FjaGVkLCBmYWxzZSBpZiBub3QKLQotUkVUVVJOUzoKLUxpbmVhciBhZGRyZXNzIG9mIHRoZSBuZXdseSBtYXBwZWQgbWVtb3J5LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBtYXBzIHBoeXNpY2FsIG1lbW9yeSB0byBsaW5lYXIgbWVtb3J5LCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkCi10byBjcmVhdGUgYSBzZWxlY3RvciBvciB1c2VkIGRpcmVjdGx5IGZyb20gMzItYml0IHByb3RlY3RlZCBtb2RlIHByb2dyYW1zLgotVGhpcyBpcyBiZXR0ZXIgdGhhbiBEUE1JIDB4ODAwLCBzaW5jZSBpdCBhbGxvd3MgeW91IHRvIG1hcHMgcGh5c2ljYWwKLW1lbW9yeSBiZWxvdyAxTWIsIHdoaWNoIGdldHMgdGhpcyBtZW1vcnkgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIFdpbmRvd3MgVnhEJ3MKLXN0aWNreSBwYXdzLgotCi1OT1RFOiAgIElmIHRoZSBtZW1vcnkgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGNhY2hlZCwgdGhpcyBmdW5jdGlvbiB3aWxsCi0JZGlyZWN0bHkgcmUtcHJvZ3JhbSB0aGUgUENEIChQYWdlIENhY2hlIERpc2FibGUpIGJpdCBpbiB0aGUKLQlwYWdlIHRhYmxlcy4gVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgbWVjaGFuaXNtIGluIHRoZSBWTU0KLQl0byBjb250cm9sIHRoaXMgYml0IHZpYSB0aGUgcmVndWxhciBpbnRlcmZhY2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIHVsb25nICAgbGluZWFyLGxlbmd0aCA9IGxpbWl0KzE7Ci0gICAgaW50ICAgICBpLG5wYWdlczsKLSAgICB1bG9uZyAgIFBEQiwqcFBEQjsKLQotICAgIC8qIFNlYXJjaCB0YWJsZSBvZiBleGlzdGluZyBtYXBwaW5ncyB0byBzZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IG1hcHBlZAotICAgICAqIGEgcmVnaW9uIG9mIG1lbW9yeSB0aGF0IHdpbGwgc2VydmUgdGhpcyBwdXJwb3NlLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NYXBwaW5nczsgaSsrKSB7Ci0JaWYgKG1hcHNbaV0ucGh5c2ljYWwgPT0gYmFzZSAmJiBtYXBzW2ldLmxlbmd0aCA9PSBsZW5ndGggJiYgbWFwc1tpXS5pc0NhY2hlZCA9PSBpc0NhY2hlZCkKLQkgICAgcmV0dXJuICh2b2lkKiltYXBzW2ldLmxpbmVhcjsKLQl9Ci0gICAgaWYgKG51bU1hcHBpbmdzID09IE1BWF9NRU1PUllfTUFQUElOR1MpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBXZSBkaWQgbm90IGZpbmQgYW55IHByZXZpb3VzbHkgbWFwcGVkIG1lbW9yeSByZWdpb24sIHNvIG1hcCBpdCBpbi4KLSAgICAgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHVzZSBNYXBQaHlzVG9MaW5lYXIsIHNpbmNlIHRoaXMgZnVuY3Rpb24gYXBwZWFycwotICAgICAqIHRvIGhhdmUgcHJvYmxlbXMgbWFwcGluZyBtZW1vcnkgaW4gdGhlIDFNYiBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlLgotICAgICAqIEhlbmNlIHdlIHVzZSBQYWdlUmVzZXJ2ZSBhbmQgUGFnZUNvbW1pdFBoeXMuCi0gICAgICovCi0gICAgaWYgKChsaW5lYXIgPSBNYXBQaHlzaWNhbFRvTGluZWFyKGJhc2UsbGltaXQsJm5wYWdlcykpID09IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ucGh5c2ljYWwgPSBiYXNlOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmxlbmd0aCA9IGxlbmd0aDsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5saW5lYXIgPSBsaW5lYXI7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ubnBhZ2VzID0gbnBhZ2VzOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmlzQ2FjaGVkID0gaXNDYWNoZWQ7Ci0gICAgbnVtTWFwcGluZ3MrKzsKLQotI2lmIDAKLSAgICAvKiBGaW5hbGx5IGRpc2FibGUgY2FjaGluZyB3aGVyZSBuZWNlc3NhcnkgKi8KLSAgICBpZiAoIWlzQ2FjaGVkICYmIChQREIgPSBfUE1fZ2V0UERCKCkpICE9IDApIHsKLQlpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKLQl1bG9uZyAgIHBhZ2VUYWJsZSwqcFBhZ2VUYWJsZTsKLQotCWlmIChQREIgPj0gMHgxMDAwMDApCi0JICAgIHBQREIgPSAodWxvbmcqKU1hcFBoeXNpY2FsVG9MaW5lYXIoUERCLDB4RkZGLCZucGFnZXMpOwotCWVsc2UKLQkgICAgcFBEQiA9ICh1bG9uZyopUERCOwotCWlmIChwUERCKSB7Ci0JICAgIHN0YXJ0UERCID0gKGxpbmVhciA+PiAyMikgJiAweDNGRjsKLQkgICAgc3RhcnRQYWdlID0gKGxpbmVhciA+PiAxMikgJiAweDNGRjsKLQkgICAgZW5kUERCID0gKChsaW5lYXIrbGltaXQpID4+IDIyKSAmIDB4M0ZGOwotCSAgICBlbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKSAmIDB4M0ZGOwotCSAgICBmb3IgKGlQREIgPSBzdGFydFBEQjsgaVBEQiA8PSBlbmRQREI7IGlQREIrKykgewotCQlwYWdlVGFibGUgPSBwUERCW2lQREJdICYgfjB4RkZGOwotCQlpZiAocGFnZVRhYmxlID49IDB4MTAwMDAwKQotCQkgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopTWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYsJm5wYWdlcyk7Ci0JCWVsc2UKLQkJICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKXBhZ2VUYWJsZTsKLQkJc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOwotCQllbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOwotCQlmb3IgKGlQYWdlID0gc3RhcnQ7IGlQYWdlIDw9IGVuZDsgaVBhZ2UrKykKLQkJICAgIHBQYWdlVGFibGVbaVBhZ2VdIHw9IDB4MTA7Ci0JCVBhZ2VGcmVlKCh1bG9uZylwUGFnZVRhYmxlLFBSX1NUQVRJQyk7Ci0JCX0KLQkgICAgUGFnZUZyZWUoKHVsb25nKXBQREIsUFJfU1RBVElDKTsKLQkgICAgfQotCX0KLSNlbmRpZgotICAgIHJldHVybiAodm9pZCopbGluZWFyOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotICAgIC8qIFdlIG5ldmVyIGZyZWUgdGhlIG1hcHBpbmdzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIC8qIFdlIG5ldmVyIHNsZWVwIGluIGEgVkREICovCi19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0JLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciAqLwotCS8qICAgICAgICAgICAgICAgYWRkcmVzcy4gKi8KLQlyZXR1cm4gMHhGRkZGRkZGRlVMOwotfQotCi12b2lkIFBNQVBJIF9QTV9mcmVlTWVtb3J5TWFwcGluZ3Modm9pZCkKLXsKLSAgICBpbnQgaTsKLS8qICAgIGZvciAoaSA9IDA7IGkgPCBudW1NYXBwaW5nczsgaSsrKSAqLwotLyogICAgICAgIFBhZ2VGcmVlKG1hcHNbaV0ubGluZWFyLFBSX1NUQVRJQyk7ICovCi19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17IHJldHVybiAodm9pZCopTUtfUEhZUyhyX3NlZyxyX29mZik7IH0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17IHJldHVybiBOVUxMOyB9Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQoteyB9Ci0KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKLXsKLSAgICAvKiBVbnNlZCBpbiBWRERzICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9hZCB0aGUgVjg2IHJlZ2lzdGVycyBpbiB0aGUgY2xpZW50IHN0YXRlLCBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgc3RhdGUKLWJlZm9yZSBsb2FkaW5nIHRoZSByZWdpc3RlcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTG9hZFY4NlJlZ2lzdGVycygKLSAgICBQQ1JGIHNhdmVSZWdzLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgUENSRiAgICAgICAgICAgIHBjcmY7ICAgICAvKiBjdXJyZW50IGNsaWVudCByZWdpc3RlciBmcmFtZSAqLwotCi0gICAgLyogZ2V0IHBvaW50ZXIgdG8gcmVnaXN0ZXJzICovCi0gICAgcGNyZiA9IChQQ1JGKVZESFF1ZXJ5U3lzVmFsdWUoQ1VSUkVOVF9WRE0sIFZESExTVl9QQ1JGKTsKLQotICAgIC8qIE5vdGU6IFdlIGNvdWxkIGRvIFZESFB1c2hSZWdzIGluc3RlYWQgYnV0IHRoaXMgc2hvdWxkIGJlIHNhZmVyIGFzIGl0ICovCi0gICAgLyogZG9lc24ndCByZWx5IG9uIHRoZSBWRE0gc2Vzc2lvbiBoYXZpbmcgZW5vdWdoIGZyZWUgc3RhY2sgc3BhY2UuICovCi0gICAgKnNhdmVSZWdzID0gKnBjcmY7ICAgICAgICAvKiBzYXZlIGFsbCByZWdpc3RlcnMgKi8KLQotICAgIHBjcmYtPmNyZl9lYXggPSBpbi0+ZS5lYXg7ICAgIC8qIGxvYWQgbmV3IHZhbHVlcyAqLwotICAgIHBjcmYtPmNyZl9lYnggPSBpbi0+ZS5lYng7Ci0gICAgcGNyZi0+Y3JmX2VjeCA9IGluLT5lLmVjeDsKLSAgICBwY3JmLT5jcmZfZWR4ID0gaW4tPmUuZWR4OwotICAgIHBjcmYtPmNyZl9lc2kgPSBpbi0+ZS5lc2k7Ci0gICAgcGNyZi0+Y3JmX2VkaSA9IGluLT5lLmVkaTsKLSAgICBwY3JmLT5jcmZfZXMgID0gc3JlZ3MtPmVzOwotICAgIHBjcmYtPmNyZl9kcyAgPSBzcmVncy0+ZHM7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBWODYgcmVnaXN0ZXJzIGZyb20gdGhlIGNsaWVudCBzdGF0ZSBhbmQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVhZFY4NlJlZ2lzdGVycygKLSAgICBQQ1JGIHNhdmVSZWdzLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIFBDUkYgICAgICAgICAgICBwY3JmOyAgICAgLyogY3VycmVudCBjbGllbnQgcmVnaXN0ZXIgZnJhbWUgKi8KLQotICAgIC8qIGdldCBwb2ludGVyIHRvIHJlZ2lzdGVycyAqLwotICAgIHBjcmYgPSAoUENSRilWREhRdWVyeVN5c1ZhbHVlKENVUlJFTlRfVkRNLCBWREhMU1ZfUENSRik7Ci0KLSAgICAvKiByZWFkIG5ldyByZWdpc3RlciB2YWx1ZXMgKi8KLSAgICBvdXQtPmUuZWF4ID0gcGNyZi0+Y3JmX2VheDsKLSAgICBvdXQtPmUuZWJ4ID0gcGNyZi0+Y3JmX2VieDsKLSAgICBvdXQtPmUuZWN4ID0gcGNyZi0+Y3JmX2VjeDsKLSAgICBvdXQtPmUuZWR4ID0gcGNyZi0+Y3JmX2VkeDsKLSAgICBvdXQtPmUuZXNpID0gcGNyZi0+Y3JmX2VzaTsKLSAgICBvdXQtPmUuZWRpID0gcGNyZi0+Y3JmX2VkaTsKLSAgICBzcmVncy0+ZXMgID0gcGNyZi0+Y3JmX2VzOwotICAgIHNyZWdzLT5kcyAgPSBwY3JmLT5jcmZfZHM7Ci0KLSAgICAvKiByZXN0b3JlIG9yaWdpbmFsIGNsaWVudCByZWdpc3RlcnMgKi8KLSAgICAqcGNyZiA9ICpzYXZlUmVnczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6IFVzZWQgZm9yIGZhciBjYWxscyBpbnRvIFY4NiBjb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVk9JRCBIT09LRU5UUlkgVXNlclJldHVybkhvb2soCi0gIFBWT0lEIHBSZWZEYXRhLAotICBQQ1JGIHBjcmYgKQotewotICAgIFZESFBvc3RFdmVudFNlbShoZXZGYXJDYWxsUmV0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6IFVzZWQgZm9yIGNhbGxpbmcgQklPUyBpbnRlcnJ1cHRzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVk9JRCBIT09LRU5UUlkgVXNlcklSZXRIb29rKAotICBQVk9JRCBwUmVmRGF0YSwKLSAgUENSRiBwY3JmICkKLXsKLSAgICBWREhQb3N0RXZlbnRTZW0oaGV2SVJldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIFY4NiByZWFsIG1vZGUgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGNhbGwgcmV0dXJucyB3aXRoIGEgZmFyIHJldC4KLU11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgRE9TIHNlc3Npb24gY29udGV4dCEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKnJlZ3MsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgQ1JGICAgc2F2ZVJlZ3M7Ci0gICAgRlBGTiAgZm5BZGRyZXNzOwotICAgIFVMT05HIHJjOwotCi0gICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKLSAgICBMb2FkVjg2UmVnaXN0ZXJzKFNTVG9EUygmc2F2ZVJlZ3MpLHJlZ3Msc3JlZ3MpOwotCi0gICAgLyogc2V0IHVwIHJldHVybiBob29rIGZvciBjYWxsICovCi0gICAgcmMgPSBWREhBcm1SZXR1cm5Ib29rKGhob29rVXNlclJldHVybkhvb2ssIFZESEFSSF9DU0VJUF9IT09LKTsKLQotICAgIFZESFJlc2V0RXZlbnRTZW0oaGV2RmFyQ2FsbFJldCk7Ci0KLSAgICAvKiB0aGUgYWRkcmVzcyBpcyBhIDE2OjMyIHBvaW50ZXIgKi8KLSAgICBPRkZTRVRPRjMyKGZuQWRkcmVzcykgID0gb2ZmOwotICAgIFNFR01FTlRPRjMyKGZuQWRkcmVzcykgPSBzZWc7Ci0gICAgcmMgPSBWREhQdXNoRmFyQ2FsbChmbkFkZHJlc3MpOwotICAgIFZESFlpZWxkKDApOwotCi0gICAgLyogd2FpdCB1bnRpbCB0aGUgVjg2IGNhbGwgcmV0dXJucyAtIG91ciByZXR1cm4gaG9vayBwb3N0cyB0aGUgc2VtYXBob3JlICovCi0gICAgcmMgPSBWREhXYWl0RXZlbnRTZW0oaGV2RmFyQ2FsbFJldCwgU0VNX0lOREVGSU5JVEVfV0FJVCk7Ci0KLSAgICBSZWFkVjg2UmVnaXN0ZXJzKFNTVG9EUygmc2F2ZVJlZ3MpLHJlZ3Msc3JlZ3MpOwotICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIFY4NiByZWFsIG1vZGUgaW50ZXJydXB0IHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGludGVycnVwdC4KLU11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgRE9TIHNlc3Npb24gY29udGV4dCEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgUk1TUkVHUyAgICBzcmVncyA9IHswfTsKLSAgICBDUkYgICAgICAgIHNhdmVSZWdzOwotICAgIHVzaG9ydCAgICAgb2xkRGlzYWJsZTsKLSAgICBVTE9ORyAgICAgIHJjOwotCi0gICAgbWVtc2V0KFNTVG9EUygmc3JlZ3MpLCAwLCBzaXplb2Yoc3JlZ3MpKTsKLQotI2lmIDAgICAvKiBkbyB3ZSBuZWVkIHRoaXM/PyAqLwotICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVkREIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCi0gICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2KClcbiIpOwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykgewotCW9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7Ci0JKmRpc2FibGVUU1JGbGFnID0gMDsKLQl9Ci0jZW5kaWYKLQotICAgIExvYWRWODZSZWdpc3RlcnMoU1NUb0RTKCZzYXZlUmVncyksIGluLCBTU1RvRFMoJnNyZWdzKSk7Ci0KLSAgICBWREhSZXNldEV2ZW50U2VtKGhldklSZXQpOwotICAgIHJjID0gVkRIUHVzaEludChpbnRubyk7Ci0KLSAgICAvKiBzZXQgdXAgcmV0dXJuIGhvb2sgZm9yIGludGVycnVwdCAqLwotICAgIHJjID0gVkRIQXJtUmV0dXJuSG9vayhoaG9va1VzZXJJUmV0SG9vaywgVkRIQVJIX05PUk1BTF9JUkVUKTsKLQotICAgIFZESFlpZWxkKDApOwotCi0gICAgLyogd2FpdCB1bnRpbCB0aGUgVjg2IElSRVRzIC0gb3VyIHJldHVybiBob29rIHBvc3RzIHRoZSBzZW1hcGhvcmUgKi8KLSAgICByYyA9IFZESFdhaXRFdmVudFNlbShoZXZJUmV0LCA1MDAwKTsgLypTRU1fSU5ERUZJTklURV9XQUlUKTsgKi8KLQotICAgIFJlYWRWODZSZWdpc3RlcnMoU1NUb0RTKCZzYXZlUmVncyksIG91dCwgU1NUb0RTKCZzcmVncykpOwotCi0jaWYgMAotICAgIC8qIFJlLWVuYWJsZSBwYXNzLXVwIHRvIG91ciBWREQgaGFuZGxlciBpZiBwcmV2aW91c2x5IGVuYWJsZWQgKi8KLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpCi0JKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKLSNlbmRpZgotCi0gICAgVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1faW50ODYoKVxuIik7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NngoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgQ1JGICAgICAgICAgICAgIHNhdmVSZWdzOwotICAgIHVzaG9ydCAgICAgICAgICBvbGREaXNhYmxlOwotICAgIFVMT05HICAgICAgIHJjOwotCi0jaWYgMAotICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCi0gICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2eCgpXG4iKTsKLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKLQlvbGREaXNhYmxlID0gKmRpc2FibGVUU1JGbGFnOwotCSpkaXNhYmxlVFNSRmxhZyA9IDA7Ci0JfQotI2VuZGlmCi0gICAgTG9hZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSwgaW4sIHNyZWdzKTsKLQotICAgIFZESFJlc2V0RXZlbnRTZW0oaGV2SVJldCk7Ci0gICAgcmMgPSBWREhQdXNoSW50KGludG5vKTsKLQotICAgIC8qIHNldCB1cCByZXR1cm4gaG9vayBmb3IgaW50ZXJydXB0ICovCi0gICAgcmMgPSBWREhBcm1SZXR1cm5Ib29rKGhob29rVXNlcklSZXRIb29rLCBWREhBUkhfTk9STUFMX0lSRVQpOwotCi0gICAgVkRIWWllbGQoMCk7Ci0KLSAgICAvKiB3YWl0IHVudGlsIHRoZSBWODYgSVJFVHMgLSBvdXIgcmV0dXJuIGhvb2sgcG9zdHMgdGhlIHNlbWFwaG9yZSAqLwotICAgIHJjID0gVkRIV2FpdEV2ZW50U2VtKGhldklSZXQsIDUwMDApOyAvKlNFTV9JTkRFRklOSVRFX1dBSVQpOyAqLwotCi0gICAgUmVhZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSwgb3V0LCBzcmVncyk7Ci0KLSNpZiAwCi0gICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykKLQkqZGlzYWJsZVRTUkZsYWcgPSBvbGREaXNhYmxlOwotI2VuZGlmCi0KLSAgICBUUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NngoKVxuIik7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICBVTE9ORyAgICAgICBmbGFncyA9IFZESEFQX1NZU1RFTTsKLSAgICBVTE9ORyAgICAgICBuUGFnZXMgPSAoc2l6ZSArIDB4RkZGKSA+PiAxMjsKLQotICAgIGZsYWdzIHw9IChwaHlzQWRkciAhPSBOVUxMKSA/IFZESEFQX1BIWVNJQ0FMIDogVkRIQVBfRklYRUQ7Ci0KLSAgICByZXR1cm4gVkRIQWxsb2NQYWdlcyhwaHlzQWRkciwgblBhZ2VzLCBWREhBUF9TWVNURU0gfCBWREhBUF9QSFlTSUNBTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZXMgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSgKLSAgICB2b2lkICpwLAotICAgIHVpbnQgc2l6ZSwKLSAgICBpYm9vbCBjb250aWd1b3VzKQotewotICAgIGlmIChwKQotCVZESEZyZWVQYWdlcygoUFZPSUQpcCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgVUxPTkcgIGxvY2tIYW5kbGU7Ci0KLSAgICAvKiBUT0RPOiB0aGUgbG9jayBoYW5kbGUgaXMgZXNzZW50aWFsIGZvciB0aGUgdW5sb2NrIG9wZXJhdGlvbiEhICovCi0gICAgbG9ja0hhbmRsZSA9IFZESExvY2tNZW0ocCwgbGVuLCAwLCAoUFZPSUQpVkRITE1fTk9fQUREUiwgTlVMTCk7Ci0KLSAgICBpZiAobG9ja0hhbmRsZSAhPSBOVUxMKQotICAgICAgIHJldHVybiAwOwotICAgIGVsc2UKLSAgICAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgLyogVE9ETzogaW1wbGVtZW50IC0gdXNlIGEgdGFibGUgb2YgbG9jayBoYW5kbGVzPyAqLwotICAgIC8qIFZESFVubG9ja1BhZ2VzKGxvY2tIYW5kbGUpOyAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gUE1fbG9ja0RhdGFQYWdlcygodm9pZCopcCxsZW4sbGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIFBNX3VubG9ja0RhdGFQYWdlcygodm9pZCopcCxsZW4sbGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWREQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVkRECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgKHZvaWQpaE1vZHVsZTsKLSAgICAodm9pZClzelByb2NOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWREQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICpQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdGFydCBhIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBzZWFyY2ggKi8KLSAgICAvKiAgICAgICBnaXZlbiB0aGUgZmlsZW5hbWUgKHdpdGggd2lsZGNhcmRzKS4gVGhlIGRhdGEgc2hvdWxkIGJlICovCi0gICAgLyogICAgICAgY29udmVydGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBuZXh0IGZpbGUgaW4gZGlyZWN0b3J5IGVudW1lcmF0aW9uICovCi0gICAgLyogICAgICAgc2VhcmNoIGdpdmVuIHRoZSBzZWFyY2ggY3JpdGVyaWEgZGVmaW5lZCBpbiB0aGUgY2FsbCB0byAqLwotICAgIC8qICAgICAgIFBNX2ZpbmRGaXJzdEZpbGUuIFRoZSBkYXRhIHNob3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkICovCi0gICAgLyogICAgICAgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpaGFuZGxlOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdm9pZCAqaGFuZGxlKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MuIFRoaXMgbWF5IGRvICovCi0gICAgLyogICAgICAgbm90aGluZyBmb3Igc29tZSBPUydlcy4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgLyogTm90IGFwcGxpY2FibGUgaW4gYSBWREQgKi8KLSAgICAodm9pZClkcml2ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgIC8qIE5vdCBhcHBsaWNhYmxlIGluIGEgVkREICovCi0gICAgKHZvaWQpZHJpdmU7Ci0gICAgKHZvaWQpZGlyOwotICAgICh2b2lkKWxlbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRVRVUk5TOgotRXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSByZXN1bHQuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUsCi0gICAgdWludCB0eXBlKQotewotICAgIHJldHVybiBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZShiYXNlLHNpemUsdHlwZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzID8gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClhdHRyaWI7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fc2V0RmlsZUF0dHIgbm90IGltcGxlbWVudGVkISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyA/ICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fZ2V0RmlsZUF0dHIgbm90IGltcGxlbWVudGVkISIpOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyA/ICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fbWtkaXIgbm90IGltcGxlbWVudGVkISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byByZW1vdmUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fcm1kaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgPyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3JtZGlyIG5vdCBpbXBsZW1lbnRlZCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9nZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyA/ICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZ21UaW1lOwotICAgICh2b2lkKXRpbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fZ2V0RmlsZVRpbWUgbm90IGltcGxlbWVudGVkISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzID8gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClnbVRpbWU7Ci0gICAgKHZvaWQpdGltZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9zZXRGaWxlVGltZSBub3QgaW1wbGVtZW50ZWQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2MzkyOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgICAgICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMWY2NTUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yIFZERAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1bG9uZyAgICBmcmVxdWVuY3kgPSAxMTkzMTgwOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19aVGltZXJJbml0KCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT24odG0pICAgICBWVERfR2V0X1JlYWxfVGltZSgmdG0tPnN0YXJ0LmhpZ2gsJnRtLT5zdGFydC5sb3cpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgICAgbGFwLGNvdW50OwotICAgIFZURF9HZXRfUmVhbF9UaW1lKCZsYXAuaGlnaCwmbGFwLmxvdyk7Ci0gICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJmxhcCwmY291bnQpOwotICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmY291bnQsZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICBWVERfR2V0X1JlYWxfVGltZSgmdG0tPmVuZC5oaWdoLCZ0bS0+ZW5kLmxvdykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyIHRtQ291bnQ7Ci0gICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOwotICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxmcmVxdWVuY3kpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIHJldHVybiBWREhRdWVyeVN5c1ZhbHVlKDAsIFZESEdTVl9NU0VDU0JPT1QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKLXdoZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bwotYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcwotcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL19wbS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvX3BtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhN2NlYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvX3BtLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiAzMi1iaXQgV2luZG93cyBWeEQKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBQTSBsaWJyYXJ5IHNwZWNpZmljIHRvCi07KiAgICAgICAgICAgICAgV2luZG93cyBWeERzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbSAgICAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfcG0KLQotICAgIGNleHRlcm4gX1BNX3NhdmVkRFMsVVNIT1JUCi0KLWVuZGRhdGFzZWcgIF9wbQotCi1QNTg2Ci0KLWJlZ2NvZGVzZWcgIF9wbSAgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZWdyZWFkKFBNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbGwgc2VnbWVudCByZWdpc3RlcnMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9zZWdyZWFkCi0KLSAgICAgICAgQVJHICAgICBzcmVnczpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgYXgsZXMKLSAgICAgICAgX2xlcyAgICBfc2ksW3NyZWdzXQotICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzJdLGNzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krNF0sc3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs2XSxkcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzhdLGZzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMTBdLGdzCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2ludDM4NngoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCxQTVNSRUdTICpzcmVncykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElzc3VlcyBhIHNvZnR3YXJlIGludGVycnVwdCBpbiBwcm90ZWN0ZWQgbW9kZS4gVGhpcyByb3V0aW5lIGhhcyBiZWVuCi07IHdyaXR0ZW4gdG8gYWxsb3cgdXNlciBwcm9ncmFtcyB0byBsb2FkIENTIGFuZCBEUyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLTsgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9pbnQzODZ4Ci0KLTsgTm90IHVzZWQgZm9yIFZ4RHMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zYXZlRFModm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNhdmUgdGhlIHZhbHVlIG9mIERTIGludG8gYSBzZWN0aW9uIG9mIHRoZSBjb2RlIHNlZ21lbnQsIHNvIHRoYXQgd2UgY2FuCi07IHF1aWNrbHkgbG9hZCB0aGlzIHZhbHVlIGF0IGEgbGF0ZXIgZGF0ZSBpbiB0aGUgUE1fbG9hZERTKCkgcm91dGluZSBmcm9tCi07IGluc2lkZSBpbnRlcnJ1cHQgaGFuZGxlcnMgZXRjLiBUaGUgbWV0aG9kIHRvIGRvIHRoaXMgaXMgZGlmZmVyZW50Ci07IGRlcGVuZGluZyBvbiB0aGUgRE9TIGV4dGVuZGVyIGJlaW5nIHVzZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fc2F2ZURTCi0KLSAgICAgICAgbW92ICAgICBbX1BNX3NhdmVkRFNdLGRzICAgIDsgU3RvcmUgYXdheSBpbiBkYXRhIHNlZ21lbnQKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fbG9hZERTKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSb3V0aW5lIHRvIGxvYWQgdGhlIERTIHJlZ2lzdGVyIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjdXJyZW50Ci07IERPUyBleHRlbmRlci4gT25seSB0aGUgRFMgcmVnaXN0ZXIgaXMgbG9hZGVkLCBub3QgdGhlIEVTIHJlZ2lzdGVyLCBzbwotOyBpZiB5b3Ugd2lzaCB0byBjYWxsIEMgY29kZSwgeW91IHdpbGwgbmVlZCB0byBhbHNvIGxvYWQgdGhlIEVTIHJlZ2lzdGVyCi07IGluIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9sb2FkRFMKLQotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10gOyBXZSBjYW4gYWNjZXNzIHRoZSBwcm9wZXIgRFMgdGhyb3VnaCBDUwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRCYW5rQShpbnQgYmFuaykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0QmFua0EKLQotOyBOb3QgdXNlZCBmb3IgVnhEcwotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldEJhbmtBQihpbnQgYmFuaykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0QmFua0FCCi0KLTsgTm90IHVzZWQgZm9yIFZ4RHMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0Q1JUU3RhcnQKLQotOyBOb3QgdXNlZCBmb3IgVnhEcwotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotJW1hY3JvICBJT0RFTEFZTiAxCi0lcmVwICAgICUxCi0gICAgICAgIERFTEFZCi0lZW5kcmVwCi0lZW5kbWFjcm8KLWVsc2UKLW1hY3JvICAgREVMQVkKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLWVuZG0KLW1hY3JvICAgSU9ERUxBWU4gICAgTgotICAgIHJlcHQgICAgTgotICAgICAgICBERUxBWQotICAgIGVuZG0KLWVuZG0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCi07IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3JlYWRDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2hmZAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZwotICAgICAgICBjbGkKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBpbiAgICAgIGFsLDcxaAotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIG1vdiAgICAgYWwsYWggICAgICAgICAgICAgICA7IFJldHVybiB2YWx1ZSBpbiBBTAotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKLTsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fd3JpdGVDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5ULCB2YWx1ZTpVQ0hBUgotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgbW92ICAgICBhbCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgNzFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBkb3VibGUgX2Z0b2woZG91YmxlIGYpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDYWxscyB0byBfX2Z0b2wgYXJlIGdlbmVyYXRlZCBieSB0aGUgQm9ybGFuZCBDKysgY29tcGlsZXIgZm9yIGNvZGUKLTsgdGhhdCBuZWVkcyB0byBjb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSB0byBhbiBpbnRlZ3JhbCB0eXBlLgotOwotOyBJbnB1dDogZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9uIHRoZSB0b3Agb2YgdGhlICc4Ny4KLTsKLTsgT3V0cHV0OiBhIChzaWduZWQgb3IgdW5zaWduZWQpIGxvbmcgaW4gRUFYCi07IEFsbCBvdGhlciByZWdpc3RlcnMgcHJlc2VydmVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfZnRvbAotCi0gICAgICAgIExPQ0FMICAgdGVtcDE6V09SRCwgdGVtcDI6UVdPUkQgPSBMb2NhbFNpemUKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgc3ViICAgICBlc3AsTG9jYWxTaXplCi0KLSAgICAgICAgZnN0Y3cgICBbdGVtcDFdICAgICAgICAgICAgICAgICA7IHNhdmUgdGhlIGNvbnRyb2wgd29yZAotICAgICAgICBmd2FpdAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIHRlbXAxKzFdCi0gICAgICAgIG9yICAgICAgW0JZVEUgdGVtcDErMV0sMENoICAgICAgOyBzZXQgcm91bmRpbmcgY29udHJvbCB0byBjaG9wCi0gICAgICAgIGZsZGN3ICAgW3RlbXAxXQotICAgICAgICBmaXN0cCAgIFt0ZW1wMl0gICAgICAgICAgICAgICAgIDsgY29udmVydCB0byA2NC1iaXQgaW50ZWdlcgotICAgICAgICBtb3YgICAgIFtCWVRFIHRlbXAxKzFdLGFsCi0gICAgICAgIGZsZGN3ICAgW3RlbXAxXSAgICAgICAgICAgICAgICAgOyByZXN0b3JlIHRoZSBjb250cm9sIHdvcmQKLSAgICAgICAgbW92ICAgICBlYXgsW0RXT1JEIHRlbXAyXSAgICAgICA7IHJldHVybiBMUyAzMiBiaXRzCi0gICAgICAgIG1vdiAgICAgZWR4LFtEV09SRCB0ZW1wMis0XSAgICAgOyAgICAgICAgTVMgMzIgYml0cwotCi0gICAgICAgIG1vdiAgICAgZXNwLGVicAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2dldFBEQiAtIFJldHVybiB0aGUgUGFnZSBUYWJsZSBEaXJlY3RvcnkgQmFzZSBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2dldFBEQgotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGbHVzaCB0aGUgVHJhbnNsYXRpb24gTG9va2FzaWRlIGJ1ZmZlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2ZsdXNoVExCCi0KLSAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9wbQotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2VhYWUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIFZ4RCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIFZ4RCdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAgICAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIFZ4RCdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkgICAgKHZvaWQpKGkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIGZyZXEtPmxvdyA9IDExOTMxODA7Ci0gICAgZnJlcS0+aGlnaCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyIGNvdW50OyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWVERfR2V0X1JlYWxfVGltZSgmY291bnQuaGlnaCwmY291bnQubG93KTsgIFwKLSAgICAodCktPmxvdyA9IGNvdW50LmxvdzsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmhpZ2ggPSBjb3VudC5oaWdoOyAgICAgICAgICAgICAgICAgICAgIFwKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9maWxlaW8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9maWxlaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2Y2U5OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvZmlsZWlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgQyBsaWJyYXJ5IGNvbXBhdGlibGUgSS9PIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGhpbiBhIFZ4RC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgInZ4ZGZpbGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiBDb2RlIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBFT0YgLTEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmb3BlbiBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1GSUxFICogZm9wZW4oCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgY29uc3QgY2hhciAqbW9kZSkKLXsKLSAgICBGSUxFICAgICpmID0gUE1fbWFsbG9jKHNpemVvZihGSUxFKSk7Ci0gICAgbG9uZyAgICBvbGRwb3M7Ci0KLSAgICBpZiAoZikgewotCWYtPm9mZnNldCA9IDA7Ci0JZi0+dGV4dCA9IChtb2RlWzFdID09ICd0JyB8fCBtb2RlWzJdID09ICd0Jyk7Ci0JZi0+d3JpdGVtb2RlID0gKG1vZGVbMF0gPT0gJ3cnKSB8fCAobW9kZVswXSA9PSAnYScpOwotCWlmIChpbml0Q29tcGxldGUpIHsKLQkgICAgV09SRCAgICBvbW9kZSxlcnJvcjsKLQkgICAgQllURSAgICBhY3Rpb247Ci0KLQkgICAgaWYgKG1vZGVbMF0gPT0gJ3InKSB7Ci0JCW9tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBPUEVOX1NIQVJFX0NPTVBBVElCTEU7Ci0JCWFjdGlvbiA9IEFDVElPTl9JRkVYSVNUU19PUEVOIHwgQUNUSU9OX0lGTk9URVhJU1RTX0ZBSUw7Ci0JCX0KLQkgICAgZWxzZSBpZiAobW9kZVswXSA9PSAndycpIHsKLQkJb21vZGUgPSBPUEVOX0FDQ0VTU19XUklURU9OTFkgfCBPUEVOX1NIQVJFX0NPTVBBVElCTEU7Ci0JCWFjdGlvbiA9IEFDVElPTl9JRkVYSVNUU19UUlVOQ0FURSB8IEFDVElPTl9JRk5PVEVYSVNUU19DUkVBVEU7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCW9tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9DT01QQVRJQkxFOwotCQlhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfT1BFTiB8IEFDVElPTl9JRk5PVEVYSVNUU19DUkVBVEU7Ci0JCX0KLQkgICAgZi0+aGFuZGxlID0gKGludClSMF9PcGVuQ3JlYXRlRmlsZShmYWxzZSwoY2hhciopZmlsZW5hbWUsb21vZGUsQVRUUl9OT1JNQUwsYWN0aW9uLDAsJmVycm9yLCZhY3Rpb24pOwotCSAgICBpZiAoZi0+aGFuZGxlID09IDApIHsKLQkJUE1fZnJlZShmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgZi0+ZmlsZXNpemUgPSBSMF9HZXRGaWxlU2l6ZSgoSEFORExFKWYtPmhhbmRsZSwmZXJyb3IpOwotCSAgICBpZiAobW9kZVswXSA9PSAnYScpCi0JCWZzZWVrKGYsMCwyKTsKLQkgICAgfQotCWVsc2UgewotCSAgICBpbnQgb2ZsYWcscG1vZGU7Ci0KLQkgICAgaWYgKG1vZGVbMF0gPT0gJ3InKSB7Ci0JCXBtb2RlID0gX1NfSVJFQUQ7Ci0JCW9mbGFnID0gX09fUkRPTkxZOwotCQl9Ci0JICAgIGVsc2UgaWYgKG1vZGVbMF0gPT0gJ3cnKSB7Ci0JCXBtb2RlID0gX1NfSVdSSVRFOwotCQlvZmxhZyA9IF9PX1dST05MWSB8IF9PX0NSRUFUIHwgX09fVFJVTkM7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCXBtb2RlID0gX1NfSVdSSVRFOwotCQlvZmxhZyA9IF9PX1JEV1IgfCBfT19DUkVBVCB8IF9PX0FQUEVORDsKLQkJfQotCSAgICBpZiAoZi0+dGV4dCkKLQkJb2ZsYWcgfD0gX09fVEVYVDsKLQkgICAgZWxzZQotCQlvZmxhZyB8PSBfT19CSU5BUlk7Ci0JICAgIGlmICgoZi0+aGFuZGxlID0gaV9vcGVuKGZpbGVuYW1lLG9mbGFnLHBtb2RlKSkgPT0gLTEpIHsKLQkJUE1fZnJlZShmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgb2xkcG9zID0gaV9sc2VlayhmLT5oYW5kbGUsMCwxKTsKLQkgICAgZi0+ZmlsZXNpemUgPSBpX2xzZWVrKGYtPmhhbmRsZSwwLDIpOwotCSAgICBpX2xzZWVrKGYtPmhhbmRsZSxvbGRwb3MsMCk7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnJlYWQgZnVuY3Rpb24uIE5vdGUgdGhhdCB0aGUgVnhEIGZpbGUgSS9PCi1mdW5jdGlvbnMgYXJlIGxheWVyZWQgb24gRE9TLCBzbyBjYW4gb25seSByZWFkIHVwIHRvIDY0SyBhdCBhIHRpbWUuIFNpbmNlCi13ZSBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlIG11Y2ggbGFyZ2VyIGNodW5rcyB0aGFuIHRoaXMsIHdlIGhhbmRsZSBsYXJnZXIKLWJsb2NrcyBhdXRvbWF0aWNhbGx5IGluIGhlcmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc2l6ZV90IGZyZWFkKAotICAgIHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSwKLSAgICBzaXplX3QgbiwKLSAgICBGSUxFICpmKQotewotICAgIGNoYXIgICAgKmJ1ZiA9IHB0cjsKLSAgICBXT1JEICAgIGVycm9yOwotICAgIGludCAgICAgYnl0ZXMgPSBzaXplICogbjsKLSAgICBpbnQgICAgIHJlYWRieXRlcyx0b3RhbGJ5dGVzID0gMDsKLQotICAgIHdoaWxlIChieXRlcyA+IDB4MTAwMDApIHsKLQlpZiAoaW5pdENvbXBsZXRlKSB7Ci0JICAgIHJlYWRieXRlcyAgPSBSMF9SZWFkRmlsZShmYWxzZSwoSEFORExFKWYtPmhhbmRsZSxidWYsMHg4MDAwLGYtPm9mZnNldCwmZXJyb3IpOwotCSAgICByZWFkYnl0ZXMgKz0gUjBfUmVhZEZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmKzB4ODAwMCwweDgwMDAsZi0+b2Zmc2V0KzB4ODAwMCwmZXJyb3IpOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIHJlYWRieXRlcyAgPSBpX3JlYWQoZi0+aGFuZGxlLGJ1ZiwweDgwMDApOwotCSAgICByZWFkYnl0ZXMgKz0gaV9yZWFkKGYtPmhhbmRsZSxidWYrMHg4MDAwLDB4ODAwMCk7Ci0JICAgIH0KLQl0b3RhbGJ5dGVzICs9IHJlYWRieXRlczsKLQlmLT5vZmZzZXQgKz0gcmVhZGJ5dGVzOwotCWJ1ZiArPSAweDEwMDAwOwotCWJ5dGVzIC09IDB4MTAwMDA7Ci0JfQotICAgIGlmIChieXRlcykgewotCWlmIChpbml0Q29tcGxldGUpCi0JICAgIHJlYWRieXRlcyA9IFIwX1JlYWRGaWxlKGZhbHNlLChIQU5ETEUpZi0+aGFuZGxlLGJ1ZixieXRlcyxmLT5vZmZzZXQsJmVycm9yKTsKLQllbHNlCi0JICAgIHJlYWRieXRlcyA9IGlfcmVhZChmLT5oYW5kbGUsYnVmLGJ5dGVzKTsKLQl0b3RhbGJ5dGVzICs9IHJlYWRieXRlczsKLQlmLT5vZmZzZXQgKz0gcmVhZGJ5dGVzOwotCX0KLSAgICByZXR1cm4gdG90YWxieXRlcyAvIHNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZndyaXRlIGZ1bmN0aW9uLiBOb3RlIHRoYXQgdGhlIFZ4RCBmaWxlIEkvTwotZnVuY3Rpb25zIGFyZSBsYXllcmVkIG9uIERPUywgc28gY2FuIG9ubHkgcmVhZCB1cCB0byA2NEsgYXQgYSB0aW1lLiBTaW5jZQotd2UgYXJlIGV4cGVjdGVkIHRvIGhhbmRsZSBtdWNoIGxhcmdlciBjaHVua3MgdGhhbiB0aGlzLCB3ZSBoYW5kbGUgbGFyZ2VyCi1ibG9ja3MgYXV0b21hdGljYWxseSBpbiBoZXJlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNpemVfdCBmd3JpdGUoCi0gICAgY29uc3Qgdm9pZCAqcHRyLAotICAgIHNpemVfdCBzaXplLAotICAgIHNpemVfdCBuLAotICAgIEZJTEUgKmYpCi17Ci0gICAgY29uc3QgY2hhciAgKmJ1ZiA9IHB0cjsKLSAgICBXT1JEICAgICAgICBlcnJvcjsKLSAgICBpbnQgICAgICAgICBieXRlcyA9IHNpemUgKiBuOwotICAgIGludCAgICAgICAgIHdyaXR0ZW5ieXRlcyx0b3RhbGJ5dGVzID0gMDsKLQotICAgIGlmICghZi0+d3JpdGVtb2RlKQotCXJldHVybiAwOwotICAgIHdoaWxlIChieXRlcyA+IDB4MTAwMDApIHsKLQlpZiAoaW5pdENvbXBsZXRlKSB7Ci0JICAgIHdyaXR0ZW5ieXRlcyAgPSBSMF9Xcml0ZUZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmLDB4ODAwMCxmLT5vZmZzZXQsJmVycm9yKTsKLQkgICAgd3JpdHRlbmJ5dGVzICs9IFIwX1dyaXRlRmlsZShmYWxzZSwoSEFORExFKWYtPmhhbmRsZSxidWYrMHg4MDAwLDB4ODAwMCxmLT5vZmZzZXQrMHg4MDAwLCZlcnJvcik7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgd3JpdHRlbmJ5dGVzICA9IGlfd3JpdGUoZi0+aGFuZGxlLGJ1ZiwweDgwMDApOwotCSAgICB3cml0dGVuYnl0ZXMgKz0gaV93cml0ZShmLT5oYW5kbGUsYnVmKzB4ODAwMCwweDgwMDApOwotCSAgICB9Ci0JdG90YWxieXRlcyArPSB3cml0dGVuYnl0ZXM7Ci0JZi0+b2Zmc2V0ICs9IHdyaXR0ZW5ieXRlczsKLQlidWYgKz0gMHgxMDAwMDsKLQlieXRlcyAtPSAweDEwMDAwOwotCX0KLSAgICBpZiAoaW5pdENvbXBsZXRlKQotCXdyaXR0ZW5ieXRlcyA9IFIwX1dyaXRlRmlsZShmYWxzZSwoSEFORExFKWYtPmhhbmRsZSxidWYsYnl0ZXMsZi0+b2Zmc2V0LCZlcnJvcik7Ci0gICAgZWxzZQotCXdyaXR0ZW5ieXRlcyA9IGlfd3JpdGUoZi0+aGFuZGxlLGJ1ZixieXRlcyk7Ci0gICAgdG90YWxieXRlcyArPSB3cml0dGVuYnl0ZXM7Ci0gICAgZi0+b2Zmc2V0ICs9IHdyaXR0ZW5ieXRlczsKLSAgICBpZiAoZi0+b2Zmc2V0ID4gZi0+ZmlsZXNpemUpCi0JZi0+ZmlsZXNpemUgPSBmLT5vZmZzZXQ7Ci0gICAgcmV0dXJuIHRvdGFsYnl0ZXMgLyBzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZmbHVzaCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmZsdXNoKAotICAgIEZJTEUgKmYpCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBzaW5jZSB3ZSBhcmUgbm90IGRvaW5nIGJ1ZmZlcmVkIGZpbGUgSS9PICovCi0gICAgKHZvaWQpZjsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmc2VlayBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZnNlZWsoCi0gICAgRklMRSAqZiwKLSAgICBsb25nIGludCBvZmZzZXQsCi0gICAgaW50IHdoZW5jZSkKLXsKLSAgICBpZiAod2hlbmNlID09IDApCi0JZi0+b2Zmc2V0ID0gb2Zmc2V0OwotICAgIGVsc2UgaWYgKHdoZW5jZSA9PSAxKQotCWYtPm9mZnNldCArPSBvZmZzZXQ7Ci0gICAgZWxzZSBpZiAod2hlbmNlID09IDIpCi0JZi0+b2Zmc2V0ID0gZi0+ZmlsZXNpemUgKyBvZmZzZXQ7Ci0gICAgaWYgKCFpbml0Q29tcGxldGUpCi0JaV9sc2VlayhmLT5oYW5kbGUsZi0+b2Zmc2V0LDApOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ0ZWxsIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgZnRlbGwoCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gZi0+b2Zmc2V0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZlb2YgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZlb2YoCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gKGYtPm9mZnNldCA9PSBmLT5maWxlc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmdldHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqZmdldHMoCi0gICAgY2hhciAqcywKLSAgICBpbnQgbiwKLSAgICBGSUxFICpmKQotewotICAgIGludCAgICAgbGVuOwotICAgIGNoYXIgICAgKmNzOwotCi0gICAgLyogUmVhZCB0aGUgZW50aXJlIGJ1ZmZlciBpbnRvIG1lbW9yeSAob3VyIGZ1bmN0aW9ucyBhcmUgdW5idWZmZXJlZCEpICovCi0gICAgaWYgKChsZW4gPSBmcmVhZChzLDEsbixmKSkgPT0gMCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFNlYXJjaCBmb3IgJ1xuJyBvciBlbmQgb2Ygc3RyaW5nICovCi0gICAgaWYgKG4gPiBsZW4pCi0JbiA9IGxlbjsKLSAgICBjcyA9IHM7Ci0gICAgd2hpbGUgKC0tbiA+IDApIHsKLQlpZiAoKmNzID09ICdcbicpCi0JICAgIGJyZWFrOwotCWNzKys7Ci0JfQotICAgICpjcyA9ICdcMCc7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnB1dHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZwdXRzKAotICAgIGNvbnN0IGNoYXIgKnMsCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gZndyaXRlKHMsMSxzdHJsZW4ocyksZik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmNsb3NlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmY2xvc2UoCi0gICAgRklMRSAqZikKLXsKLSAgICBXT1JEIGVycm9yOwotCi0gICAgaWYgKGluaXRDb21wbGV0ZSkKLQlSMF9DbG9zZUZpbGUoKEhBTkRMRSlmLT5oYW5kbGUsJmVycm9yKTsKLSAgICBlbHNlCi0JaV9jbG9zZShmLT5oYW5kbGUpOwotICAgIFBNX2ZyZWUoZik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZjMGY5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I3ZjE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE1BWF9NRU1PUllfU0hBUkVEICAgICAgICAgICAxMDAKLSNkZWZpbmUgTUFYX01FTU9SWV9NQVBQSU5HUyAgICAgICAgIDEwMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCAgICAqbGluZWFyOwotICAgIHVsb25nICAgZ2xvYmFsOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIGludCAgICAgbnBhZ2VzOwotICAgIH0gbWVtc2hhcmVkOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBwaHlzaWNhbDsKLSAgICB1bG9uZyAgIGxpbmVhcjsKLSAgICB1bG9uZyAgIGxlbmd0aDsKLSAgICBpbnQgICAgIG5wYWdlczsKLSAgICBpYm9vbCAgIGlzQ2FjaGVkOwotICAgIH0gbW1hcHBpbmc7Ci0KLXN0YXRpYyBpbnQgICAgICAgICAgbnVtTWFwcGluZ3MgPSAwOwotc3RhdGljIG1lbXNoYXJlZCAgICBzaGFyZWRbTUFYX01FTU9SWV9NQVBQSU5HU10gPSB7MH07Ci1zdGF0aWMgbW1hcHBpbmcgICAgIG1hcHNbTUFYX01FTU9SWV9NQVBQSU5HU107Ci1leHRlcm4gaWJvb2wgICAgICAgIF9QTV9oYXZlQklPUzsKLWNoYXIgICAgICAgICAgICAgICAgX1BNX2NudFBhdGhbUE1fTUFYX1BBVEhdID0gIiI7Ci1jaGFyICAgICAgICAgICAgICAgIF9QTV9udWNsZXVzUGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKLXVjaGFyICAgICAgICAgICAgICAgKl9QTV9ybUJ1ZkFkZHIgPSBOVUxMOwotdXNob3J0IF9WQVJBUEkgICAgICBfUE1fc2F2ZWREUyA9IDA7Ci1zdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQTsKLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdCOwotUE1faW50SGFuZGxlciAgICAgICBfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci1JUlFIQU5ETEUgICAgICAgICAgIFJUQ0lSUUhhbmRsZSA9IDA7Ci1WUElDRF9IV0ludF9USFVOSyAgIFJUQ0ludF9UaHVuazsKLQotc3RhdGljIGNoYXIgKnN6V2luZG93c0tleSAgICAgICA9ICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvbiI7Ci1zdGF0aWMgY2hhciAqc3pTeXN0ZW1Sb290ICAgICAgID0gIlN5c3RlbVJvb3QiOwotc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWVLZXkgICA9ICJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxDb21wdXRlck5hbWVcXENvbXB1dGVyTmFtZSI7Ci1zdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZSAgICAgID0gIkNvbXB1dGVyTmFtZSI7Ci1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBDTU9TIHJlZ2lzdGVycyAqLwotCi11bG9uZyAgIFBNQVBJIF9QTV9nZXRQREIodm9pZCk7Ci11Y2hhciAgIFBNQVBJIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpOwotdm9pZCAgICBQTUFQSSBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUE1fbWFsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBWWERfbWFsbG9jKAotICAgIHNpemVfdCBzaXplKQotewotICAgIHJldHVybiBQTV9tYWxsb2NTaGFyZWQoc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUE1fY2FsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBWWERfY2FsbG9jKAotICAgIHNpemVfdCBuZWxlbSwKLSAgICBzaXplX3Qgc2l6ZSkKLXsKLSAgICB2b2lkICpwID0gUE1fbWFsbG9jU2hhcmVkKG5lbGVtICogc2l6ZSk7Ci0gICAgaWYgKHApCi0JbWVtc2V0KHAsMCxuZWxlbSAqIHNpemUpOwotICAgIHJldHVybiBwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVBNX3JlYWxsb2Mgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gVnhEJ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFZYRF9yZWFsbG9jKAotICAgIHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSkKLXsKLSAgICB2b2lkICpwID0gUE1fbWFsbG9jU2hhcmVkKHNpemUpOwotICAgIGlmIChwKSB7Ci0JbWVtY3B5KHAscHRyLHNpemUpOwotCVBNX2ZyZWVTaGFyZWQocHRyKTsKLQl9Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUE1fZnJlZSBvdmVycmlkZSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBWeEQncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFZYRF9mcmVlKAotICAgIHZvaWQgKnApCi17Ci0gICAgUE1fZnJlZVNoYXJlZChwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIC8qIE92ZXJyaWRlIHRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0b3JzIGZvciBhbGwgTnVjbGV1cyBkcml2ZXJzCi0gICAgICogbG9hZGVkIGluIFNEREhFTFAvUE1IRUxQLiBXZSBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGVuc3VyZSBhbGwgbWVtb3J5Ci0gICAgICogZHluYW1pY2FsbHkgYWxsb2NhdGVkIGJ5IE51Y2xldXMgZHJpdmVycyBhbmQgaW50ZXJuYWwgQyBydW50aW1lCi0gICAgICogbGlicmFyeSBmdW5jdGlvbnMgYXJlIHNoYXJlZCBtZW1vcnkgYmxvY2tzIHRoYXQgYWxsIHByb2Nlc3NlcwotICAgICAqIGNvbm5lY3RpbmcgdG8gU0RESEVMUCBjYW4gc2VlLgotICAgICAqLwotICAgIFBNX3VzZUxvY2FsTWFsbG9jKFZYRF9tYWxsb2MsVlhEX2NhbGxvYyxWWERfcmVhbGxvYyxWWERfZnJlZSk7Ci0KLSAgICAvKiBJbml0aWFsaWFzZSB0aGUgTVRSUiBtb2R1bGUgKi8KLSAgICBNVFJSX2luaXQoKTsKLX0KLQotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsgcmV0dXJuIF9QTV9oYXZlQklPUzsgfQotCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQoteyByZXR1cm4gX09TX1dJTjMyVlhEOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoteyByZXR1cm4gUE1fMzg2OyB9Ci0KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKLQlzW3Bvc10gPSAnXFwnOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBGYXRhbF9FcnJvcl9IYW5kbGVyKG1zZywwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1sZW4gICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyCi1yc2VnICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlYWwgbW9kZSBzZWdtZW50IG9mIHRoZSBidWZmZXIKLXJvZmYgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVhbCBtb2RlIG9mZnNldCBvZiB0aGUgYnVmZmVyCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgZ2xvYmFsIFZFU0EgdHJhbnNmZXIKLWJ1ZmZlciB0aGF0IGlzIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBCSU9TIGZ1bmN0aW9ucyBmcm9tCi1XaW4xNiBhbmQgV2luMzIgcHJvZ3JhbXMgdW5kZXIgV2luZG93cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1ZigKLSAgICB1aW50ICpsZW4sCi0gICAgdWludCAqcnNlZywKLSAgICB1aW50ICpyb2ZmKQotewotICAgIC8qIElmIHRoZSBWeEQgaXMgZHluYW1pY2FsbHkgbG9hZGVkIHdlIHdpbGwgbm90IGhhdmUgYSByZWFsIG1vZGUKLSAgICAgKiB0cmFuc2ZlciBidWZmZXIgdG8gcmV0dXJuLCBzbyB3ZSBmYWlsIHRoZSBjYWxsLgotICAgICAqLwotICAgIGlmIChfUE1fcm1CdWZBZGRyKSB7Ci0JKmxlbiA9IFZFU0FfQlVGX1NJWkU7Ci0JKnJzZWcgPSAodWxvbmcpKF9QTV9ybUJ1ZkFkZHIpID4+IDQ7Ci0JKnJvZmYgPSAodWxvbmcpKF9QTV9ybUJ1ZkFkZHIpICYgMHhGOwotCXJldHVybiBfUE1fcm1CdWZBZGRyOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IFBNQVBJIFBNX2ludDM4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUE1SRUdTICppbiwKLSAgICBQTVJFR1MgKm91dCkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVnhEcyAqLwotICAgIHJldHVybiAwOwotfQotCi12b2lkIFBNQVBJIF9QTV9nZXRSTXZlY3QoCi0gICAgaW50IGludG5vLAotICAgIGxvbmcgKnJlYWxpc3IpCi17Ci0gICAgV09SRCAgICBzZWc7Ci0gICAgRFdPUkQgICBvZmY7Ci0KLSAgICBHZXRfVjg2X0ludF9WZWN0b3IoaW50bm8sJnNlZywmb2ZmKTsKLSAgICAqcmVhbGlzciA9ICgobG9uZylzZWcgPDwgMTYpIHwgKG9mZiAmIDB4RkZGRik7Ci19Ci0KLXZvaWQgUE1BUEkgX1BNX3NldFJNdmVjdCgKLSAgICBpbnQgaW50bm8sCi0gICAgbG9uZyByZWFsaXNyKQotewotICAgIFNldF9WODZfSW50X1ZlY3RvcihpbnRubyxyZWFsaXNyID4+IDE2LHJlYWxpc3IgJiAweEZGRkYpOwotfQotCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHN0cm5jcHkocGF0aCxfUE1fY250UGF0aCxtYXhMZW4pOwotICAgIHBhdGhbbWF4TGVuLTFdID0gMDsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsgcmV0dXJuICdjJzsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17IHJldHVybiAiYzpcXCI7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zektleSAgICAgICAtIEtleSB0byBxdWVyeSAoY2FuIGNvbnRhaW4gdmVyc2lvbiBudW1iZXIgZm9ybWF0dGluZykKLXN6VmFsdWUgICAgIC0gVmFsdWUgdG8gZ2V0IGluZm9ybWF0aW9uIGZvcgotdmFsdWUgICAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVnaXN0cnkga2V5IGRhdGEgcmVhZAotc2l6ZSAgICAgICAgLSBTaXplIG9mIHRoZSBzdHJpbmcgYnVmZmVyIHRvIHJlYWQgaW50bwotCi1SRVRVUk5TOgotdHJ1ZSBpZiB0aGUga2V5IHdhcyBmb3VuZCwgZmFsc2UgaWYgbm90LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBSRUdfcXVlcnlTdHJpbmcoCi0gICAgY2hhciAqc3pLZXksCi0gICAgY2hhciAqc3pWYWx1ZSwKLSAgICBjaGFyICp2YWx1ZSwKLSAgICB1bG9uZyBzaXplKQotewotICAgIEhLRVkgICAgaEtleTsKLSAgICB1bG9uZyAgIHR5cGU7Ci0gICAgaWJvb2wgICBzdGF0dXMgPSBmYWxzZTsKLQotICAgIG1lbXNldCh2YWx1ZSwwLHNpemVvZih2YWx1ZSkpOwotICAgIGlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSxzektleSwmaEtleSkgPT0gRVJST1JfU1VDQ0VTUykgewotCWlmIChSZWdRdWVyeVZhbHVlRXgoaEtleSwoUENIQVIpc3pWYWx1ZSwodWxvbmcqKU5VTEwsKHVsb25nKikmdHlwZSx2YWx1ZSwodWxvbmcqKSZzaXplKSA9PSBFUlJPUl9TVUNDRVNTKQotCSAgICBzdGF0dXMgPSB0cnVlOwotCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCX0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0KLSAgICBpZiAoc3RybGVuKF9QTV9udWNsZXVzUGF0aCkgPiAwKSB7Ci0Jc3RyY3B5KHBhdGgsX1BNX251Y2xldXNQYXRoKTsKLQlQTV9iYWNrc2xhc2gocGF0aCk7Ci0JcmV0dXJuIHBhdGg7Ci0JfQotICAgIGlmICghUkVHX3F1ZXJ5U3RyaW5nKHN6V2luZG93c0tleSxzelN5c3RlbVJvb3QscGF0aCxzaXplb2YocGF0aCkpKQotCXN0cmNweShwYXRoLCJjOlxcd2luZG93cyIpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwic3lzdGVtXFxudWNsZXVzIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgbmFtZVsyNTZdOwotICAgIGlmIChSRUdfcXVlcnlTdHJpbmcoc3pNYWNoaW5lTmFtZUtleSxzek1hY2hpbmVOYW1lLG5hbWUsc2l6ZW9mKG5hbWUpKSkKLQlyZXR1cm4gbmFtZTsKLSAgICByZXR1cm4gIlVua25vd24iOwotfQotCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsgcmV0dXJuIDE7IH0KLQotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17IHJldHVybiAwOyB9Ci0KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kVXNlciwKLSAgICBpbnQgZGV2aWNlLAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzLAotICAgIGludCBicHAsCi0gICAgaWJvb2wgZnVsbFNjcmVlbikKLXsKLSAgICAvKiBVbnVzZWQgaW4gVnhEcyAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIC8qIFVudXNlZCBpbiBWeERzICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSgKLSAgICB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIFVudXNlZCBpbiBWeERzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKAotICAgIGludCAoX0FTTUFQSVAgc2F2ZVN0YXRlKSgKLQlpbnQgZmxhZ3MpKQotewotICAgIC8qIFVudXNlZCBpbiBWeERzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSgKLSAgICBjb25zdCB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIFVudXNlZCBpbiBWeERzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogVW51c2VkIGluIFZ4RHMgKi8KLX0KLQotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUwLHgpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MSx5KTsKLX0KLQotdm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0KQotewotICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDRBLHdpZHRoKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODQsaGVpZ2h0LTEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4gRm9yIFdpbjl4IHdlIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkKLWFzIGxvY2tlZCwgZ2xvYmFsIG1lbW9yeSB0aGF0IGlzIGFjY2Vzc2libGUgZnJvbSBhbnkgbWVtb3J5IGNvbnRleHQKLShpbmNsdWRpbmcgaW50ZXJydXB0IHRpbWUgY29udGV4dCksIHdoaWNoIGFsbG93cyB1cyB0byBsb2FkIG91ciBpbXBvcnRhbnQKLWRhdGEgc3RydWN0dXJlIGFuZCBjb2RlIHN1Y2ggdGhhdCB3ZSBjYW4gYWNjZXNzIGl0IGRpcmVjdGx5IGZyb20gYSByaW5nCi0wIGludGVycnVwdCBjb250ZXh0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCi0gICAgbG9uZyBzaXplKQotewotICAgIE1FTUhBTkRMRSAgIGhNZW07Ci0gICAgRFdPUkQgICAgICAgcGdOdW0sblBhZ2VzID0gKHNpemUgKyAweEZGRikgPj4gMTI7Ci0gICAgaW50ICAgICAgICAgaTsKLQotICAgIC8qIEZpcnN0IGZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHNoYXJlZCBtZW1vcnkgdGFibGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9TSEFSRUQ7IGkrKykgewotCWlmIChzaGFyZWRbaV0ubGluZWFyID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAoaSA8IE1BWF9NRU1PUllfU0hBUkVEKSB7Ci0JUGFnZUFsbG9jYXRlKG5QYWdlcyxQR19TWVMsMCwwLDAsMCxOVUxMLDAsJmhNZW0sJnNoYXJlZFtpXS5saW5lYXIpOwotCXNoYXJlZFtpXS5ucGFnZXMgPSBuUGFnZXM7Ci0JcGdOdW0gPSAodWxvbmcpc2hhcmVkW2ldLmxpbmVhciA+PiAxMjsKLQlzaGFyZWRbaV0uZ2xvYmFsID0gTGluUGFnZUxvY2socGdOdW0sblBhZ2VzLFBBR0VNQVBHTE9CQUwpOwotCXJldHVybiAodm9pZCopc2hhcmVkW2ldLmdsb2JhbDsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIEZpbmQgYSBzaGFyZWQgbWVtb3J5IGJsb2NrIGluIG91ciB0YWJsZSBhbmQgZnJlZSBpdCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7Ci0JaWYgKHNoYXJlZFtpXS5nbG9iYWwgPT0gKHVsb25nKXApIHsKLQkgICAgTGluUGFnZVVuTG9jayhzaGFyZWRbaV0uZ2xvYmFsID4+IDEyLHNoYXJlZFtpXS5ucGFnZXMsUEFHRU1BUEdMT0JBTCk7Ci0JICAgIFBhZ2VGcmVlKCh1bG9uZylzaGFyZWRbaV0ubGluZWFyLDApOwotCSAgICBzaGFyZWRbaV0ubGluZWFyID0gMDsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwcyBhIHNoYXJlZCBtZW1vcnkgYmxvY2sgaW50byBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuIERvZXMgbm90aGluZyBzaW5jZQotdGhlIG1lbW9yeSBibG9ja3MgYXJlIGFscmVhZHkgZ2xvYmFsbHk3IG1hcHBlZCBpbnRvIGFsbCBwcm9jZXNzZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2VzcygKLSAgICB2b2lkICpiYXNlLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIHJldHVybiAodm9pZCopYmFzZTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKm1hcHBlZEJJT1MsCi0gICAgdWxvbmcgQklPU0xlbikKLXsKLSAgICAvKiBUT0RPOiBGaWd1cmUgb3V0IGhvdyB0byBkbyB0aGlzICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsgcmV0dXJuICh2b2lkKikweDQwMDsgfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17IHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgICAgICAtIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIG1hcHMgaW4KLWxpbWl0ICAgICAgIC0gTGltaXQgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIHJlZ2lvbiB0byBtYXBzIGluCi0KLVJFVFVSTlM6Ci1MaW5lYXIgYWRkcmVzcyBvZiB0aGUgbmV3bHkgbWFwcGVkIG1lbW9yeS4KLQotUkVNQVJLUzoKLU1hcHMgYSBwaHlzaWNhbCBtZW1vcnkgcmFuZ2UgdG8gYSBsaW5lYXIgbWVtb3J5IHJhbmdlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaW50ICpucGFnZXMpCi17Ci0gICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKLSAgICBpbnQgICAgIGkscHBhZ2UsZmxhZ3M7Ci0KLSAgICBpZiAoYmFzZSA8IDB4MTAwMDAwKSB7Ci0JLyogV2luZG93cyA5eCBpcyB6ZXJvIGJhc2VkIGZvciB0aGUgZmlyc3QgbWVnIG9mIG1lbW9yeSAqLwotCXJldHVybiBiYXNlOwotCX0KLSAgICBwcGFnZSA9IGJhc2UgPj4gMTI7Ci0gICAgKm5wYWdlcyA9IChsZW5ndGggKyAoYmFzZSAmIDB4RkZGKSArIDQwOTUpID4+IDEyOwotICAgIGZsYWdzID0gUFJfRklYRUQgfCBQUl9TVEFUSUM7Ci0gICAgaWYgKGJhc2UgPT0gMHhBMDAwMCkgewotCS8qIFdlIHJlcXVpcmUgdGhlIGxpbmVhciBhZGRyZXNzIHRvIGJlIGFsaWduZWQgdG8gYSA2NEtiIGJvdW5kYXJ5Ci0JICogZm9yIG1hcHBpbmcgdGhlIGJhbmtlZCBmcmFtZWJ1ZmZlciAoc28gd2UgY2FuIGRvIGVmZmljaWVudAotCSAqIGNhcnJ5IGNoZWNraW5nIGZvciBiYW5rIGNoYW5nZXMgaW4gdGhlIGFzc2VtYmxlciBjb2RlKS4gVGhlIG9ubHkKLQkgKiB3YXkgdG8gZW5zdXJlIHRoaXMgaXMgdG8gZm9yY2UgdGhlIGxpbmVhciBhZGRyZXNzIHRvIGJlIGFsaWduZWQKLQkgKiB0byBhIDRNYiBib3VuZGFyeS4KLQkgKi8KLQlmbGFncyB8PSBQUl80TUVHOwotCX0KLSAgICBpZiAoKGxpbmVhciA9ICh1bG9uZylQYWdlUmVzZXJ2ZShQUl9TWVNURU0sKm5wYWdlcyxmbGFncykpID09ICh1bG9uZyktMSkKLQlyZXR1cm4gMHhGRkZGRkZGRjsKLSAgICBpZiAoIVBhZ2VDb21taXRQaHlzKGxpbmVhciA+PiAxMiwqbnBhZ2VzLHBwYWdlLFBDX0lOQ1IgfCBQQ19VU0VSIHwgUENfV1JJVEVBQkxFKSkKLQlyZXR1cm4gMHhGRkZGRkZGRjsKLSAgICByZXR1cm4gbGluZWFyICsgKGJhc2UgJiAweEZGRik7Ci19Ci0KLS8qIFBhZ2UgdGFibGUgZmxhZ3MgKi8KLQotI2RlZmluZSBQQUdFX0ZMQUdTX1BSRVNFTlQJCQkweDAwMDAwMDAxCi0jZGVmaW5lIFBBR0VfRkxBR1NfV1JJVEVBQkxFCQkweDAwMDAwMDAyCi0jZGVmaW5lIFBBR0VfRkxBR1NfVVNFUgkJCQkweDAwMDAwMDA0Ci0jZGVmaW5lIFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSAkweDAwMDAwMDA4Ci0jZGVmaW5lIFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRQkweDAwMDAwMDEwCi0jZGVmaW5lIFBBR0VfRkxBR1NfQUNDRVNTRUQJCQkweDAwMDAwMDIwCi0jZGVmaW5lIFBBR0VfRkxBR1NfRElSVFkJCQkweDAwMDAwMDQwCi0jZGVmaW5lIFBBR0VfRkxBR1NfNE1CCSAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgICAgICAtIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIG1hcHMgaW4KLWxpbWl0ICAgICAgIC0gTGltaXQgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIHJlZ2lvbiB0byBtYXBzIGluCi1pc0NhY2hlZCAgICAtIFRydWUgaWYgdGhlIG1lbW9yeSBzaG91bGQgYmUgY2FjaGVkLCBmYWxzZSBpZiBub3QKLQotUkVUVVJOUzoKLUxpbmVhciBhZGRyZXNzIG9mIHRoZSBuZXdseSBtYXBwZWQgbWVtb3J5LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBtYXBzIHBoeXNpY2FsIG1lbW9yeSB0byBsaW5lYXIgbWVtb3J5LCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkCi10byBjcmVhdGUgYSBzZWxlY3RvciBvciB1c2VkIGRpcmVjdGx5IGZyb20gMzItYml0IHByb3RlY3RlZCBtb2RlIHByb2dyYW1zLgotVGhpcyBpcyBiZXR0ZXIgdGhhbiBEUE1JIDB4ODAwLCBzaW5jZSBpdCBhbGxvd3MgeW91IHRvIG1hcHMgcGh5c2ljYWwKLW1lbW9yeSBiZWxvdyAxTWIsIHdoaWNoIGdldHMgdGhpcyBtZW1vcnkgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIFdpbmRvd3MgVkREJ3MKLXN0aWNreSBwYXdzLgotCi1OT1RFOiAgIElmIHRoZSBtZW1vcnkgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGNhY2hlZCwgdGhpcyBmdW5jdGlvbiB3aWxsCi0JZGlyZWN0bHkgcmUtcHJvZ3JhbSB0aGUgUENEIChQYWdlIENhY2hlIERpc2FibGUpIGJpdCBpbiB0aGUKLQlwYWdlIHRhYmxlcy4gVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgbWVjaGFuaXNtIGluIHRoZSBWTU0KLQl0byBjb250cm9sIHRoaXMgYml0IHZpYSB0aGUgcmVndWxhciBpbnRlcmZhY2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIHVsb25nICAgbGluZWFyLGxlbmd0aCA9IGxpbWl0KzE7Ci0gICAgaW50ICAgICBpLG5wYWdlczsKLSAgICB1bG9uZyAgIFBEQiwqcFBEQjsKLQotICAgIC8qIFNlYXJjaCB0YWJsZSBvZiBleGlzdGluZyBtYXBwaW5ncyB0byBzZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IG1hcHBlZAotICAgICAqIGEgcmVnaW9uIG9mIG1lbW9yeSB0aGF0IHdpbGwgc2VydmUgdGhpcyBwdXJwb3NlLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NYXBwaW5nczsgaSsrKSB7Ci0JaWYgKG1hcHNbaV0ucGh5c2ljYWwgPT0gYmFzZSAmJiBtYXBzW2ldLmxlbmd0aCA9PSBsZW5ndGggJiYgbWFwc1tpXS5pc0NhY2hlZCA9PSBpc0NhY2hlZCkKLQkgICAgcmV0dXJuICh2b2lkKiltYXBzW2ldLmxpbmVhcjsKLQl9Ci0gICAgaWYgKG51bU1hcHBpbmdzID09IE1BWF9NRU1PUllfTUFQUElOR1MpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBXZSBkaWQgbm90IGZpbmQgYW55IHByZXZpb3VzbHkgbWFwcGVkIG1lbW9yeSByZWdpb24sIHNvIG1hcHMgaXQgaW4uCi0gICAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCB1c2UgTWFwUGh5c1RvTGluZWFyLCBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFwcGVhcnMKLSAgICAgKiB0byBoYXZlIHByb2JsZW1zIG1hcHBpbmcgbWVtb3J5IGluIHRoZSAxTWIgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZS4KLSAgICAgKiBIZW5jZSB3ZSB1c2UgUGFnZVJlc2VydmUgYW5kIFBhZ2VDb21taXRQaHlzLgotICAgICAqLwotICAgIGlmICgobGluZWFyID0gX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCwmbnBhZ2VzKSkgPT0gMHhGRkZGRkZGRikKLQlyZXR1cm4gTlVMTDsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5waHlzaWNhbCA9IGJhc2U7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ubGVuZ3RoID0gbGVuZ3RoOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmxpbmVhciA9IGxpbmVhcjsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5ucGFnZXMgPSBucGFnZXM7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10uaXNDYWNoZWQgPSBpc0NhY2hlZDsKLSAgICBudW1NYXBwaW5ncysrOwotCi0gICAgLyogRmluYWxseSBkaXNhYmxlIGNhY2hpbmcgd2hlcmUgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCFpc0NhY2hlZCAmJiAoUERCID0gX1BNX2dldFBEQigpKSAhPSAwKSB7Ci0JaW50ICAgICBzdGFydFBEQixlbmRQREIsaVBEQixzdGFydFBhZ2UsZW5kUGFnZSxzdGFydCxlbmQsaVBhZ2U7Ci0JdWxvbmcgICBwYWdlVGFibGUsKnBQYWdlVGFibGU7Ci0JcFBEQiA9ICh1bG9uZyopX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIoUERCLDB4RkZGLCZucGFnZXMpOwotCWlmIChwUERCKSB7Ci0JICAgIHN0YXJ0UERCID0gKGxpbmVhciA+PiAyMikgJiAweDNGRjsKLQkgICAgc3RhcnRQYWdlID0gKGxpbmVhciA+PiAxMikgJiAweDNGRjsKLQkgICAgZW5kUERCID0gKChsaW5lYXIrbGltaXQpID4+IDIyKSAmIDB4M0ZGOwotCSAgICBlbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKSAmIDB4M0ZGOwotCSAgICBmb3IgKGlQREIgPSBzdGFydFBEQjsgaVBEQiA8PSBlbmRQREI7IGlQREIrKykgewotCQkvKiBTZXQgdGhlIGJpdHMgaW4gdGhlIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IC0gcmVxdWlyZWQgYXMgcGVyICovCi0JCS8qIFBlbnRpdW0gNCBtYW51YWwuIFRoaXMgYWxzbyB0YWtlcyBjYXJlIG9mIHRoZSA0TUIgcGFnZSBlbnRyaWVzICovCi0JCXBQREJbaVBEQl0gPSBwUERCW2lQREJdIHw9IChQQUdFX0ZMQUdTX1dSSVRFX1RIUk9VR0ggfCBQQUdFX0ZMQUdTX0NBQ0hFX0RJU0FCTEUpOwotCQlpZiAoIShwUERCW2lQREJdICYgUEFHRV9GTEFHU180TUIpKSB7Ci0JCSAgICAvKiBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIDRLQiBwYWdlcyB0aGVuIHdlIG5lZWQgdG8gaXRlcmF0ZSAqLwotCQkgICAgLyogdGhyb3VnaCBlYWNoIG9mIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgKi8KLQkJICAgIHBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7Ci0JCSAgICBwUGFnZVRhYmxlID0gKHVsb25nKilfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYsJm5wYWdlcyk7Ci0JCSAgICBzdGFydCA9IChpUERCID09IHN0YXJ0UERCKSA/IHN0YXJ0UGFnZSA6IDA7Ci0JCSAgICBlbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOwotCQkgICAgZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspCi0JCQlwUGFnZVRhYmxlW2lQYWdlXSB8PSAoUEFHRV9GTEFHU19XUklURV9USFJPVUdIIHwgUEFHRV9GTEFHU19DQUNIRV9ESVNBQkxFKTsKLQkJICAgIFBhZ2VGcmVlKCh1bG9uZylwUGFnZVRhYmxlLFBSX1NUQVRJQyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgUGFnZUZyZWUoKHVsb25nKXBQREIsUFJfU1RBVElDKTsKLQkgICAgUE1fZmx1c2hUTEIoKTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gKHZvaWQqKWxpbmVhcjsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnB0ciwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBXZSBuZXZlciBmcmVlIHRoZSBtYXBwaW5ncyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICAvKiBXZSBuZXZlciBzbGVlcCBpbiBhIFZ4RCAqLwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCWNhc2UgMjogcmV0dXJuIDB4M0U4OwotCWNhc2UgMzogcmV0dXJuIDB4MkU4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwKQotewotICAgIERXT1JEICAgcHRlOwotCi0gICAgLyogVG91Y2ggdGhlIG1lbW9yeSBiZWZvcmUgY2FsbGluZyBDb3B5UGFnZVRhYmxlLiBGb3Igc29tZSByZWFzb24gKi8KLSAgICAvKiB3ZSBuZWVkIHRvIGRvIHRoaXMgb24gV2luZG93cyA5eCwgb3RoZXJ3aXNlIHRoZSBtZW1vcnkgbWF5IG5vdCAqLwotICAgIC8qIGJlIHBhZ2VkIGluIGNvcnJlY3RseS4gT2YgY291cnNlIGlmIHRoZSBwYXNzZWQgaW4gcG9pbnRlciBpcyAqLwotICAgIC8qIGludmFsaWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBmYXVsdCwgYnV0IHdlIHNob3VsZG4ndCBiZSBwYXNzZWQgYm9ndXMgKi8KLSAgICAvKiBwb2ludGVycyBhbnl3YXkgOy0pICovCi0gICAgcHRlID0gKigodWxvbmcqKXApOwotCi0gICAgLyogUmV0dXJuIGFzc2VtYmxlZCBhZGRyZXNzIHZhbHVlIG9ubHkgaWYgVk1NIHNlcnZpY2Ugc3VjY2VlZHMgKi8KLSAgICBpZiAoQ29weVBhZ2VUYWJsZSgoKERXT1JEKXApID4+IDEyLCAxLCAoUFZPSUQqKSZwdGUsIDApKQotCXJldHVybiAocHRlICYgfjB4RkZGKSB8ICgoKERXT1JEKXApICYgMHhGRkYpOwotCi0gICAgLyogUmV0dXJuIGZhaWx1cmUgdG8gdGhlIGNhbGxlciEgKi8KLSAgICByZXR1cm4gMHhGRkZGRkZGRlVMOwotfQotCi1pYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSgKLSAgICB2b2lkICpwLAotICAgIHVsb25nIGxlbmd0aCwKLSAgICB1bG9uZyAqcGh5c0FkZHJlc3MpCi17Ci0gICAgaW50ICAgICBpOwotICAgIHVsb25nICAgbGluZWFyID0gKHVsb25nKXAgJiB+MHhGRkY7Ci0KLSAgICBmb3IgKGkgPSAobGVuZ3RoICsgMHhGRkYpID4+IDEyOyBpID4gMDsgaS0tKSB7Ci0JaWYgKCgqcGh5c0FkZHJlc3MrKyA9IFBNX2dldFBoeXNpY2FsQWRkcigodm9pZCopbGluZWFyKSkgPT0gMHhGRkZGRkZGRikKLQkgICAgcmV0dXJuIGZhbHNlOwotCWxpbmVhciArPSA0MDk2OwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBfUE1fZnJlZU1lbW9yeU1hcHBpbmdzKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspCi0JUGFnZUZyZWUobWFwc1tpXS5saW5lYXIsUFJfU1RBVElDKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKAotICAgIHVpbnQgcl9zZWcsCi0gICAgdWludCByX29mZikKLXsKLSAgICByZXR1cm4gKHZvaWQqKU1LX1BIWVMocl9zZWcscl9vZmYpOwotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1aW50ICpyX3NlZywKLSAgICB1aW50ICpyX29mZikKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZygKLSAgICB2b2lkICptZW0pCi17Ci19Ci0KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgRFBNSV9yZWdzICpyZWdzKQotewotICAgIC8qIFVuc2VkIGluIFZ4RCdzICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9hZCB0aGUgVjg2IHJlZ2lzdGVycyBpbiB0aGUgY2xpZW50IHN0YXRlLCBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgc3RhdGUKLWJlZm9yZSBsb2FkaW5nIHRoZSByZWdpc3RlcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTG9hZFY4NlJlZ2lzdGVycygKLSAgICBDTElFTlRfU1RSVUNUICpzYXZlUmVncywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIENMSUVOVF9TVFJVQ1QgICBuZXdSZWdzOwotCi0gICAgU2F2ZV9DbGllbnRfU3RhdGUoc2F2ZVJlZ3MpOwotICAgIG5ld1JlZ3MgPSAqc2F2ZVJlZ3M7Ci0gICAgbmV3UmVncy5DUlMuQ2xpZW50X0VBWCA9IGluLT5lLmVheDsKLSAgICBuZXdSZWdzLkNSUy5DbGllbnRfRUJYID0gaW4tPmUuZWJ4OwotICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FQ1ggPSBpbi0+ZS5lY3g7Ci0gICAgbmV3UmVncy5DUlMuQ2xpZW50X0VEWCA9IGluLT5lLmVkeDsKLSAgICBuZXdSZWdzLkNSUy5DbGllbnRfRVNJID0gaW4tPmUuZXNpOwotICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FREkgPSBpbi0+ZS5lZGk7Ci0gICAgbmV3UmVncy5DUlMuQ2xpZW50X0VTID0gc3JlZ3MtPmVzOwotICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9EUyA9IHNyZWdzLT5kczsKLSAgICBSZXN0b3JlX0NsaWVudF9TdGF0ZSgmbmV3UmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgVjg2IHJlZ2lzdGVycyBmcm9tIHRoZSBjbGllbnQgc3RhdGUgYW5kIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlYWRWODZSZWdpc3RlcnMoCi0gICAgQ0xJRU5UX1NUUlVDVCAqc2F2ZVJlZ3MsCi0gICAgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgQ0xJRU5UX1NUUlVDVCAgIG5ld1JlZ3M7Ci0KLSAgICBTYXZlX0NsaWVudF9TdGF0ZSgmbmV3UmVncyk7Ci0gICAgb3V0LT5lLmVheCA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FQVg7Ci0gICAgb3V0LT5lLmVieCA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FQlg7Ci0gICAgb3V0LT5lLmVjeCA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FQ1g7Ci0gICAgb3V0LT5lLmVkeCA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FRFg7Ci0gICAgb3V0LT5lLmVzaSA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FU0k7Ci0gICAgb3V0LT5lLmVkaSA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FREk7Ci0gICAgc3JlZ3MtPmVzID0gbmV3UmVncy5DUlMuQ2xpZW50X0VTOwotICAgIHNyZWdzLT5kcyA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9EUzsKLSAgICBSZXN0b3JlX0NsaWVudF9TdGF0ZShzYXZlUmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIFY4NiByZWFsIG1vZGUgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGNhbGwgcmV0dXJucyB3aXRoIGEgZmFyIHJldC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKnJlZ3MsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgQ0xJRU5UX1NUUlVDVCBzYXZlUmVnczsKLQotICAgIC8qIEJhaWwgaWYgd2UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MgKGllOiB0aGUgVnhEIHdhcyBkeW5hbWljYWxseQotICAgICAqIGxvYWRlZCwgYW5kIG5vdCBzdGF0aWNhbGx5IGxvYWRlZC4KLSAgICAgKi8KLSAgICBpZiAoIV9QTV9oYXZlQklPUykKLQlyZXR1cm47Ci0KLSAgICBfVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKLSAgICBCZWdpbl9OZXN0X1Y4Nl9FeGVjKCk7Ci0gICAgTG9hZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MscmVncyxzcmVncyk7Ci0gICAgU2ltdWxhdGVfRmFyX0NhbGwoc2VnLCBvZmYpOwotICAgIFJlc3VtZV9FeGVjKCk7Ci0gICAgUmVhZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MscmVncyxzcmVncyk7Ci0gICAgRW5kX05lc3RfRXhlYygpOwotICAgIF9UUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9jYWxsUmVhbE1vZGUoKVxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSBWODYgcmVhbCBtb2RlIGludGVycnVwdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCi1sb2FkZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0KQotewotICAgIFJNU1JFR1MgICAgICAgICBzcmVncyA9IHswfTsKLSAgICBDTElFTlRfU1RSVUNUICAgc2F2ZVJlZ3M7Ci0gICAgdXNob3J0ICAgICAgICAgIG9sZERpc2FibGU7Ci0KLSAgICAvKiBCYWlsIGlmIHdlIGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzIChpZTogdGhlIFZ4RCB3YXMgZHluYW1pY2FsbHkKLSAgICAgKiBsb2FkZWQsIGFuZCBub3Qgc3RhdGljYWxseSBsb2FkZWQuCi0gICAgICovCi0gICAgaWYgKCFfUE1faGF2ZUJJT1MpIHsKLQkqb3V0ID0gKmluOwotCXJldHVybiBvdXQtPnguYXg7Ci0JfQotCi0gICAgLyogRGlzYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBzbyB3ZSBkaXJlY3RseSBjYWxsIEJJT1MgKi8KLSAgICBfVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2KClcbiIpOwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykgewotCW9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7Ci0JKmRpc2FibGVUU1JGbGFnID0gMDsKLQl9Ci0gICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOwotICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLGluLCZzcmVncyk7Ci0gICAgRXhlY19JbnQoaW50bm8pOwotICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLG91dCwmc3JlZ3MpOwotICAgIEVuZF9OZXN0X0V4ZWMoKTsKLQotICAgIC8qIFJlLWVuYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBpZiBwcmV2aW91c2x5IGVuYWJsZWQgKi8KLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpCi0JKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKLQotICAgIF9UUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NigpXG4iKTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NngoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgQ0xJRU5UX1NUUlVDVCAgIHNhdmVSZWdzOwotICAgIHVzaG9ydCAgICAgICAgICBvbGREaXNhYmxlOwotCi0gICAgLyogQmFpbCBpZiB3ZSBkbyBub3QgaGF2ZSBCSU9TIGFjY2VzcyAoaWU6IHRoZSBWeEQgd2FzIGR5bmFtaWNhbGx5Ci0gICAgICogbG9hZGVkLCBhbmQgbm90IHN0YXRpY2FsbHkgbG9hZGVkLgotICAgICAqLwotICAgIGlmICghX1BNX2hhdmVCSU9TKSB7Ci0JKm91dCA9ICppbjsKLQlyZXR1cm4gb3V0LT54LmF4OwotCX0KLQotICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCi0gICAgX1RSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9pbnQ4NngoKVxuIik7Ci0gICAgaWYgKGRpc2FibGVUU1JGbGFnKSB7Ci0Jb2xkRGlzYWJsZSA9ICpkaXNhYmxlVFNSRmxhZzsKLQkqZGlzYWJsZVRTUkZsYWcgPSAwOwotCX0KLSAgICBCZWdpbl9OZXN0X1Y4Nl9FeGVjKCk7Ci0gICAgTG9hZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MsaW4sc3JlZ3MpOwotICAgIEV4ZWNfSW50KGludG5vKTsKLSAgICBSZWFkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxvdXQsc3JlZ3MpOwotICAgIEVuZF9OZXN0X0V4ZWMoKTsKLQotICAgIC8qIFJlLWVuYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBpZiBwcmV2aW91c2x5IGVuYWJsZWQgKi8KLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpCi0JKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKLQotICAgIF9UUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NngoKVxuIik7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm5zIGF2YWlsYWJsZSBtZW1vcnkuIE5vdCBwb3NzaWJsZSB1bmRlciBXaW5kb3dzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAotICAgIHVsb25nICpwaHlzaWNhbCwKLSAgICB1bG9uZyAqdG90YWwpCi17Ci0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgTUVNSEFORExFICAgaE1lbTsKLSAgICBEV09SRCAgICAgICBuUGFnZXMgPSAoc2l6ZSArIDB4RkZGKSA+PiAxMjsKLSAgICBEV09SRCAgICAgICBmbGFncyA9IFBBR0VGSVhFRCB8IFBBR0VVU0VBTElHTiB8IChjb250aWd1b3VzID8gUEFHRUNPTlRJRyA6IDApOwotICAgIERXT1JEICAgICAgIG1heFBoeXMgPSBiZWxvdzE2TSA/IDB4MDBGRkZGRkYgOiAweEZGRkZGRkZGOwotICAgIHZvaWQgICAgICAgICpwOwotCi0gICAgLyogVE9ETzogVGhpcyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZCBpZiB0aGUgbWVtb3J5IG5lZWRzIHRvIGJlIGdsb2JhbGx5ICovCi0gICAgLyogICAgICAgYWNjZXNzaWJsZS4gQ2hlY2sgaG93IHdlIGltcGxlbWVudGVkIFBNX21hbGxvY1NoYXJlZCgpIGFzIHdlICovCi0gICAgLyogICAgICAgbWF5IG5lZWQgdG8gZG8gc29tZXRoaW5nIHNpbWlsYXIgaW4gaGVyZS4gKi8KLSAgICBQYWdlQWxsb2NhdGUoblBhZ2VzLFBHX1NZUywwLDAsMCxtYXhQaHlzLHBoeXNBZGRyLGZsYWdzLCZoTWVtLCZwKTsKLQotICAgIC8qIFRPRE86IFdlIG1heSBuZWVkIHRvIG1vZGlmeSB0aGUgbWVtb3J5IGJsb2NrcyB0byBkaXNhYmxlIGNhY2hpbmcgdmlhICovCi0gICAgLyogICAgICAgdGhlIHBhZ2UgdGFibGVzIChQQ0R8UFdUKSBzaW5jZSBETUEgbWVtb3J5IGJsb2NrcyAqY2Fubm90KiBiZSAqLwotICAgIC8qICAgICAgIGNhY2hlZCEgKi8KLSAgICByZXR1cm4gcDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlcyBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgaWYgKHApCi0JUGFnZUZyZWUoKHVsb25nKXAsMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1BhZ2UoCi0gICAgaWJvb2wgbG9ja2VkKQotewotICAgIE1FTUhBTkRMRSAgIGhNZW07Ci0gICAgdm9pZCAgICAgICAgKnA7Ci0KLSAgICAvKiBUT0RPOiBUaGlzIHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZCBpZiB0aGUgbWVtb3J5IG5lZWRzIHRvIGJlIGdsb2JhbGx5ICovCi0gICAgLyogICAgICAgYWNjZXNzaWJsZS4gQ2hlY2sgaG93IHdlIGltcGxlbWVudGVkIFBNX21hbGxvY1NoYXJlZCgpIGFzIHdlICovCi0gICAgLyogICAgICAgbWF5IG5lZWQgdG8gZG8gc29tZXRoaW5nIHNpbWlsYXIgaW4gaGVyZS4gKi8KLSAgICBQYWdlQWxsb2NhdGUoMSxQR19TWVMsMCwwLDAsMCwwLFBBR0VGSVhFRCwmaE1lbSwmcCk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAotICAgIHZvaWQgKnApCi17Ci0gICAgaWYgKHApCi0JUGFnZUZyZWUoKHVsb25nKXAsMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBsZW4sCi0gICAgUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgRFdPUkQgcGdOdW0gPSAodWxvbmcpcCA+PiAxMjsKLSAgICBEV09SRCBuUGFnZXMgPSAobGVuICsgKHVsb25nKXAgLSAocGdOdW0gPDwgMTIpICsgMHhGRkYpID4+IDEyOwotICAgIHJldHVybiBMaW5QYWdlTG9jayhwZ051bSxuUGFnZXMsMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcygKLSAgICB2b2lkICpwLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIERXT1JEIHBnTnVtID0gKHVsb25nKXAgPj4gMTI7Ci0gICAgRFdPUkQgblBhZ2VzID0gKGxlbiArICh1bG9uZylwIC0gKHBnTnVtIDw8IDEyKSArIDB4RkZGKSA+PiAxMjsKLSAgICByZXR1cm4gTGluUGFnZVVuTG9jayhwZ051bSxuUGFnZXMsMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKAotICAgIHZvaWQgKCpwKSgpLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKilwLGxlbixsaCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcygKLSAgICB2b2lkICgqcCkoKSwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKilwLGxlbixsaCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgZnJlcXVlbmN5IChmb3Igc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICBzdGF0aWMgc2hvcnQgY29udmVydFtdID0gewotCTgxOTIsCi0JNDA5NiwKLQkyMDQ4LAotCTEwMjQsCi0JNTEyLAotCTI1NiwKLQkxMjgsCi0JNjQsCi0JMzIsCi0JMTYsCi0JOCwKLQk0LAotCTIsCi0JLTEsCi0JfTsKLSAgICBpbnQgaTsKLQotICAgIC8qIEZpcnN0IGNsZWFyIGFueSBwZW5kaW5nIFJUQyB0aW1lb3V0IGlmIG5vdCBjbGVhcmVkICovCi0gICAgX1BNX3JlYWRDTU9TKDB4MEMpOwotICAgIGlmIChmcmVxdWVuY3kgPT0gMCkgewotCS8qIERpc2FibGUgUlRDIHRpbW91dCAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IgJiAweDBGKTsKLQl9Ci0gICAgZWxzZSB7Ci0JLyogQ29udmVydCBmcmVxdWVuY3kgdmFsdWUgdG8gUlRDIGNsb2NrIGluZGV4ZXMgKi8KLQlmb3IgKGkgPSAwOyBjb252ZXJ0W2ldICE9IC0xOyBpKyspIHsKLQkgICAgaWYgKGNvbnZlcnRbaV0gPT0gZnJlcXVlbmN5KQotCQlicmVhazsKLQkgICAgfQotCi0JLyogU2V0IFJUQyB0aW1vdXQgdmFsdWUgYW5kIGVuYWJsZSB0aW1lb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLDB4MjAgfCAoaSszKSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLChfUE1fb2xkQ01PU1JlZ0IgJiAweDBGKSB8IDB4NDApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGNhbGxzIHRoZSB1c2VyIHJlZ2lzdGVyZWQgQyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCT09MIF9fc3RkY2FsbCBSVENJbnRfSGFuZGxlcigKLSAgICBWTUhBTkRMRSBoVk0sCi0gICAgSVJRSEFORExFIGhJUlEpCi17Ci0gICAgc3RhdGljIGNoYXIgaW5zaWRlID0gMDsKLQotICAgIC8qIENsZWFyIHByaW9yaXR5IGludGVycnVwdCBjb250cm9sbGVyIGFuZCByZS1lbmFibGUgaW50ZXJydXB0cyBzbyB3ZQotICAgICAqIGRvbnQgbG9jayB0aGluZ3MgdXAgZm9yIGxvbmcuCi0gICAgICovCi0gICAgVlBJQ0RfUGh5c19FT0koaElSUSk7Ci0KLSAgICAvKiBDbGVhciByZWFsLXRpbWUgY2xvY2sgdGltZW91dCAqLwotICAgIF9QTV9yZWFkQ01PUygweDBDKTsKLQotICAgIC8qIE5vdyBjYWxsIHRoZSBDIGJhc2VkIGludGVycnVwdCBoYW5kbGVyIChidXQgY2hlY2sgZm9yIG11dHVhbAotICAgICAqIGV4Y2x1c2lvbiBzaW5jZSB3ZSBtYXkgc3RpbGwgYmUgc2VydmljaW5nIGFuIG9sZCBpbnRlcnJ1cHQgd2hlbiBhCi0gICAgICogbmV3IG9uZSBjb21lcyBhbG9uZzsgaWYgdGhhdCBoYXBwZW5zIHdlIGlnbm9yZSB0aGUgb2xkIG9uZSkuCi0gICAgICovCi0gICAgaWYgKCFpbnNpZGUpIHsKLQlpbnNpZGUgPSAxOwotCWVuYWJsZSgpOwotCV9QTV9ydGNIYW5kbGVyKCk7Ci0JaW5zaWRlID0gMDsKLQl9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKLSAgICBQTV9pbnRIYW5kbGVyIGloLAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgc3RydWN0IFZQSUNEX0lSUV9EZXNjcmlwdG9yIElSUWRlc2M7Ci0KLSAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCi0gICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOwotICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKLQotICAgIC8qIFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyICovCi0gICAgQ0hFQ0soaWggIT0gTlVMTCk7Ci0gICAgX1BNX3J0Y0hhbmRsZXIgPSBpaDsKLSAgICBJUlFkZXNjLlZJRF9JUlFfTnVtYmVyICAgICAgPSAweDg7Ci0gICAgSVJRZGVzYy5WSURfT3B0aW9ucyAgICAgICAgID0gMDsKLSAgICBJUlFkZXNjLlZJRF9Id19JbnRfUHJvYyAgICAgPSAoRFdPUkQpVlBJQ0RfVGh1bmtfSFdJbnQoUlRDSW50X0hhbmRsZXIsICZSVENJbnRfVGh1bmspOwotICAgIElSUWRlc2MuVklEX0VPSV9Qcm9jICAgICAgICA9IDA7Ci0gICAgSVJRZGVzYy5WSURfVmlydF9JbnRfUHJvYyAgID0gMDsKLSAgICBJUlFkZXNjLlZJRF9NYXNrX0NoYW5nZV9Qcm9jPSAwOwotICAgIElSUWRlc2MuVklEX0lSRVRfUHJvYyAgICAgICA9IDA7Ci0gICAgSVJRZGVzYy5WSURfSVJFVF9UaW1lX091dCAgID0gNTAwOwotICAgIGlmICgoUlRDSVJRSGFuZGxlID0gVlBJQ0RfVmlydHVhbGl6ZV9JUlEoJklSUWRlc2MpKSA9PSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMgKi8KLSAgICBWUElDRF9QaHlzaWNhbGx5X1VubWFzayhSVENJUlFIYW5kbGUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKFJUQ0lSUUhhbmRsZSkgewotCS8qIFJlc3RvcmUgQ01PUyByZWdpc3RlcnMgYW5kIG1hc2sgUlRDIGNsb2NrICovCi0JX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JVlBJQ0RfU2V0X0F1dG9fTWFza2luZyhSVENJUlFIYW5kbGUpOwotCVZQSUNEX0ZvcmNlX0RlZmF1bHRfQmVoYXZpb3IoUlRDSVJRSGFuZGxlKTsKLQlSVENJUlFIYW5kbGUgPSAwOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAodm9pZCloTW9kdWxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgc3RhcnQgYSBkaXJlY3RvcnkgZW51bWVyYXRpb24gc2VhcmNoICovCi0gICAgLyogICAgICAgZ2l2ZW4gdGhlIGZpbGVuYW1lICh3aXRoIHdpbGRjYXJkcykuIFRoZSBkYXRhIHNob3VsZCBiZSAqLwotICAgIC8qICAgICAgIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHZvaWQgKmhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgbmV4dCBmaWxlIGluIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiAqLwotICAgIC8qICAgICAgIHNlYXJjaCBnaXZlbiB0aGUgc2VhcmNoIGNyaXRlcmlhIGRlZmluZWQgaW4gdGhlIGNhbGwgdG8gKi8KLSAgICAvKiAgICAgICBQTV9maW5kRmlyc3RGaWxlLiBUaGUgZGF0YSBzaG91bGQgYmUgY29udmVydGVkIGFuZCByZXR1cm5lZCAqLwotICAgIC8qICAgICAgIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjbG9zZSB0aGUgZmluZCBwcm9jZXNzLiBUaGlzIG1heSBkbyAqLwotICAgIC8qICAgICAgIG5vdGhpbmcgZm9yIHNvbWUgT1MnZXMuICovCi0gICAgKHZvaWQpaGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gYSBWeEQgKi8KLSAgICAodm9pZClkcml2ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gYSBWeEQgKi8KLSAgICAodm9pZClkcml2ZTsKLSAgICAodm9pZClkaXI7Ci0gICAgKHZvaWQpbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClhdHRyaWI7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fc2V0RmlsZUF0dHIgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9nZXRGaWxlQXR0ciBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX21rZGlyIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3JtZGlyIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZ21UaW1lOwotICAgICh2b2lkKXRpbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fZ2V0RmlsZVRpbWUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClnbVRpbWU7Ci0gICAgKHZvaWQpdGltZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9zZXRGaWxlVGltZSBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWNlMWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZGY0OGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1bG9uZyAgICBmcmVxdWVuY3kgPSAxMTkzMTgwOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19aVGltZXJJbml0KCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT24odG0pICAgICBWVERfR2V0X1JlYWxfVGltZSgmdG0tPnN0YXJ0LmhpZ2gsJnRtLT5zdGFydC5sb3cpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgICAgbGFwLGNvdW50OwotICAgIFZURF9HZXRfUmVhbF9UaW1lKCZsYXAuaGlnaCwmbGFwLmxvdyk7Ci0gICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJmxhcCwmY291bnQpOwotICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmY291bnQsZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICBWVERfR2V0X1JlYWxfVGltZSgmdG0tPmVuZC5oaWdoLCZ0bS0+ZW5kLmxvdykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyIHRtQ291bnQ7Ci0gICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOwotICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxmcmVxdWVuY3kpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIENQVV9sYXJnZUludGVnZXIgY291bnQ7Ci0gICAgVlREX0dldF9SZWFsX1RpbWUoJmNvdW50LmhpZ2gsJmNvdW50Lmxvdyk7Ci0gICAgcmV0dXJuIChjb3VudC5sb3cgKiAxMDAwLjAgLyBmcmVxdWVuY3kpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKLXdoZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bwotYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcwotcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvX3Btd2luMzIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvX3Btd2luMzIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI0MmI1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL19wbXdpbjMyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IFdpbjMyCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYwotOyogICAgICAgICAgICAgIHRvIFdpbmRvd3MuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3Btd2luMzIgICAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfcG13aW4zMgotCi0gICAgICAgIGNnbG9iYWwgX1BNX2lvZW50cnkKLSAgICAgICAgY2dsb2JhbCBfUE1fZ2R0Ci1fUE1faW9lbnRyeSAgICAgZGQgIDAgICAgICAgICAgICAgICA7IE9mZnNldCB0byBjYWxsIGdhdGUKLV9QTV9nZHQgICAgICAgICBkdyAgMCAgICAgICAgICAgICAgIDsgU2VsZWN0b3IgdG8gY2FsbCBnYXRlCi0KLWVuZGRhdGFzZWcgIF9wbXdpbjMyCi0KLWJlZ2NvZGVzZWcgIF9wbXdpbjMyICAgICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1fc2V0SU9QTChpbnQgaW9wbCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoYW5nZSB0aGUgSU9QTCBsZXZlbCBmb3IgdGhlIDMyLWJpdCB0YXNrLiBSZXR1cm5zIHRoZSBwcmV2aW91cyBsZXZlbAotOyBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgZm9yIHRoZSB0YXNrIGNvcnJlY3RseS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc2V0SU9QTFZpYUNhbGxHYXRlCi0KLSAgICAgICAgQVJHICAgICBpb3BsOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgdGhlIG9sZCBFRkxBR1MgZm9yIGxhdGVyCi0gICAgICAgIG1vdiAgICAgZWN4LFtpb3BsXSAgICAgICAgICA7IEVDWCA6PSBJT1BMIGxldmVsCi0gICAgICAgIHhvciAgICAgZWJ4LGVieCAgICAgICAgICAgICA7IENoYW5nZSBJT1BMIGxldmVsIGZ1bmN0aW9uIGNvZGUKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9pb2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBfUE1faW9lbnRyeV0KLWVuZGlmCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIGFuZCAgICAgZWF4LDAwMTEwMDAwMDAwMDAwMDBiCi0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9wbXdpbjMyCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGE5NzUyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyCi0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyB0byBtZWFzdXJlIHRoZQotKiAgICAgICAgICAgICAgIENQVSBmcmVxdWVuY3kuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgaGF2ZVBlcmZvcm1hbmNlQ291bnRlcjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbmNyZWFzZSB0aGUgdGhyZWFkIHByaW9yaXR5IHRvIG1heGltdW0sIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgU2V0TWF4VGhyZWFkUHJpb3JpdHkodm9pZCkKLXsKLSAgICBpbnQgICAgIG9sZFByaW9yaXR5OwotICAgIEhBTkRMRSAgaFRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWQoKTsKLQotICAgIG9sZFByaW9yaXR5ID0gR2V0VGhyZWFkUHJpb3JpdHkoaFRocmVhZCk7Ci0gICAgaWYgKG9sZFByaW9yaXR5ICE9IFRIUkVBRF9QUklPUklUWV9FUlJPUl9SRVRVUk4pCi0JU2V0VGhyZWFkUHJpb3JpdHkoaFRocmVhZCwgVEhSRUFEX1BSSU9SSVRZX1RJTUVfQ1JJVElDQUwpOwotICAgIHJldHVybiBvbGRQcmlvcml0eTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHJlYWQgcHJpb3JpdHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVzdG9yZVRocmVhZFByaW9yaXR5KAotICAgIGludCBvbGRQcmlvcml0eSkKLXsKLSAgICBIQU5ETEUgIGhUaHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkKCk7Ci0KLSAgICBpZiAob2xkUHJpb3JpdHkgIT0gVEhSRUFEX1BSSU9SSVRZX0VSUk9SX1JFVFVSTikKLQlTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkLCBvbGRQcmlvcml0eSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIGlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopZnJlcSkpIHsKLQloYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gZmFsc2U7Ci0JZnJlcS0+bG93ID0gMTAwMDAwOwotCWZyZXEtPmhpZ2ggPSAwOwotCX0KLSAgICBlbHNlCi0JaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopdCk7ICAgICAgICAgXAotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSh0KS0+bG93ID0gdGltZUdldFRpbWUoKSAqIDEwMDsgICAgICAgICAgICAgICAgICAgICBcCi0JKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZGRyYXcuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2RkcmF3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzNmNjAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZGRyYXcuYworKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIKLSoKLSogRGVzY3JpcHRpb246ICBXaW4zMiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImV2ZW50LmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJ3aW4zMi9vc2hkci5oIgotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUHVibGljbHkgYWNjZXNzaWJsZSB2YXJpYWJsZXMgKi8KLQotaW50ICAgICAgICAgICAgICAgICBfUE1fZGVza1gsX1BNX2Rlc2tZOy8qIERlc2t0b3AgZGltZW50aW9ucyAgICAgICAgICAgKi8KLUhXTkQgICAgICAgICAgICAgICAgX1BNX2h3bmRDb25zb2xlOyAgICAvKiBXaW5kb3cgaGFuZGxlIGZvciBjb25zb2xlICAgICovCi0jaWZkZWYgIF9fSU5URUxfXwotdWludCAgICAgICAgICAgICAgICBfUE1fY3dfZGVmYXVsdDsgICAgIC8qIERlZmF1bHQgRlBVIGNvbnRyb2wgd29yZCAgICAgKi8KLSNlbmRpZgotCi0vKiBQcml2YXRlIGludGVybmFsIHZhcmlhYmxlcyAqLwotCi1zdGF0aWMgSElOU1RBTkNFICAgIGhJbnN0QXBwID0gTlVMTDsvKiBBcHBsaWNhdGlvbiBpbnN0YW5jZSBoYW5kbGUgICAgICAqLwotc3RhdGljIEhXTkQgICAgICAgICBod25kVXNlciA9IE5VTEw7LyogVXNlciB3aW5kb3cgaGFuZGxlICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBISU5TVEFOQ0UgICAgaEluc3RERCA9IE5VTEw7IC8qIEhhbmRsZSB0byBEaXJlY3REcmF3IERMTCAgICAgICAgICovCi1zdGF0aWMgTFBESVJFQ1REUkFXIGxwREQgPSBOVUxMOyAgICAvKiBEaXJlY3REcmF3IG9iamVjdCAgICAgICAgICAgICAgICAqLwotc3RhdGljIExPTkcgICAgICAgICBvbGRXbmRTdHlsZTsgICAgLyogSW5mbyBhYm91dCBvbGQgdXNlciB3aW5kb3cgICAgICAgKi8KLXN0YXRpYyBMT05HICAgICAgICAgb2xkRXhXbmRTdHlsZTsgIC8qIEluZm8gYWJvdXQgb2xkIHVzZXIgd2luZG93ICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIG9sZFdpblBvc1g7ICAgICAvKiBPbGQgd2luZG93IHBvc2l0aW9uIFggY29vcmRpbmF0ZSAqLwotc3RhdGljIGludCAgICAgICAgICBvbGRXaW5Qb3NZOyAgICAgLyogT2xkIHdpbmRvdyBwaXNpdGlvbiBZIGNvb3JkaW5hdGUgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgb2xkV2luU2l6ZVg7ICAgIC8qIE9sZCB3aW5kb3cgc2l6ZSBYICAgICAgICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIG9sZFdpblNpemVZOyAgICAvKiBPbGQgd2luZG93IHNpemUgWSAgICAgICAgICAgICAgICAqLwotc3RhdGljIFdORFBST0MgICAgICBvbGRXaW5Qcm9jID0gTlVMTDsKLXN0YXRpYyBQTV9zYXZlU3RhdGVfY2Igc3VzcGVuZEFwcCA9IE5VTEw7Ci1zdGF0aWMgaWJvb2wgICAgICAgIHdhaXRBY3RpdmUgPSBmYWxzZTsKLXN0YXRpYyBpYm9vbCAgICAgICAgaXNGdWxsU2NyZWVuID0gZmFsc2U7Ci1zdGF0aWMgaWJvb2wgICAgICAgIGJhY2tJbkdESSA9IGZhbHNlOwotCi0vKiBJbnRlcm5hbCBzdHJpbmdzICovCi0KLXN0YXRpYyBjaGFyICpzeldpbkNsYXNzTmFtZSAgICAgPSAiU2NpVGVjaERpcmVjdERyYXdXaW5kb3ciOwotc3RhdGljIGNoYXIgKnN6QXV0b1BsYXlLZXkgICAgICA9ICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXNcXEV4cGxvcmVyIjsKLXN0YXRpYyBjaGFyICpzekF1dG9QbGF5VmFsdWUgICAgPSAiTm9Ecml2ZVR5cGVBdXRvUnVuIjsKLQotLyogRHluYWxpbmtzIHRvIERpcmVjdERyYXcgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKnBEaXJlY3REcmF3Q3JlYXRlKShHVUlEIEZBUiAqbHBHVUlELCBMUERJUkVDVERSQVcgRkFSICpscGxwREQsIElVbmtub3duIEZBUiAqcFVua091dGVyKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UZW1wb3JhcmlseSBkaXNhYmxlcyBBdXRvUGxheSBvcGVyYXRpb24gd2hpbGUgd2UgYXJlIHJ1bm5pbmcgaW4gZnVsbHNjcmVlbgotZ3JhcGhpY3MgbW9kZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRGlzYWJsZUF1dG9QbGF5KHZvaWQpCi17Ci0gICAgRFdPUkQgICBkd0F1dG9QbGF5LGR3U2l6ZSA9IHNpemVvZihkd0F1dG9QbGF5KTsKLSAgICBIS0VZICAgIGhLZXk7Ci0KLSAgICBpZiAoUmVnT3BlbktleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLHN6QXV0b1BsYXlLZXksMCxLRVlfRVhFQ1VURSB8IEtFWV9XUklURSwmaEtleSkgPT0gRVJST1JfU1VDQ0VTUykgewotCVJlZ1F1ZXJ5VmFsdWVFeChoS2V5LHN6QXV0b1BsYXlWYWx1ZSxOVUxMLE5VTEwsKHZvaWQqKSZkd0F1dG9QbGF5LCZkd1NpemUpOwotCWR3QXV0b1BsYXkgfD0gQVVUT1BMQVlfRFJJVkVfQ0RST007Ci0JUmVnU2V0VmFsdWVFeChoS2V5LHN6QXV0b1BsYXlWYWx1ZSwwLFJFR19EV09SRCwodm9pZCopJmR3QXV0b1BsYXksZHdTaXplKTsKLQlSZWdDbG9zZUtleShoS2V5KTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmUtZW5hYmxlcyBBdXRvUGxheSBvcGVyYXRpb24gd2hlbiB3ZSByZXR1cm4gdG8gcmVndWxhciBHREkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSZXN0b3JlQXV0b1BsYXkodm9pZCkKLXsKLSAgICBEV09SRCAgIGR3QXV0b1BsYXksZHdTaXplID0gc2l6ZW9mKGR3QXV0b1BsYXkpOwotICAgIEhLRVkgICAgaEtleTsKLQotICAgIGlmIChSZWdPcGVuS2V5RXgoSEtFWV9DVVJSRU5UX1VTRVIsc3pBdXRvUGxheUtleSwwLEtFWV9FWEVDVVRFIHwgS0VZX1dSSVRFLCZoS2V5KSA9PSBFUlJPUl9TVUNDRVNTKSB7Ci0JUmVnUXVlcnlWYWx1ZUV4KGhLZXksc3pBdXRvUGxheVZhbHVlLE5VTEwsTlVMTCwodm9pZCopJmR3QXV0b1BsYXksJmR3U2l6ZSk7Ci0JZHdBdXRvUGxheSAmPSB+QVVUT1BMQVlfRFJJVkVfQ0RST007Ci0JUmVnU2V0VmFsdWVFeChoS2V5LHN6QXV0b1BsYXlWYWx1ZSwwLFJFR19EV09SRCwodm9pZCopJmR3QXV0b1BsYXksZHdTaXplKTsKLQlSZWdDbG9zZUtleShoS2V5KTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3VzcGVuZHMgdGhlIGFwcGxpY2F0aW9uIGJ5IHN3aXRjaGluZyBiYWNrIHRvIHRoZSBHREkgZGVza3RvcCwgYWxsb3dpbmcKLW5vcm1hbCBhcHBsaWNhdGlvbiBjb2RlIHRvIGJlIHByb2Nlc3NlZCwgYW5kIHRoZW4gd2FpdGluZyBmb3IgdGhlCi1hcHBsaWNhdGlvbiBhY3RpdmF0ZSBjb21tYW5kIHRvIGJyaW5nIHVzIGJhY2sgdG8gZnVsbHNjcmVlbiBtb2RlIHdpdGggb3VyCi13aW5kb3cgbWluaW1pc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIExlYXZlRnVsbFNjcmVlbih2b2lkKQotewotICAgIGludCByZXRDb2RlID0gUE1fU1VTUEVORF9BUFA7Ci0KLSAgICBpZiAoYmFja0luR0RJKQotCXJldHVybjsKLSAgICBpZiAoc3VzcGVuZEFwcCkKLQlyZXRDb2RlID0gc3VzcGVuZEFwcChQTV9ERUFDVElWQVRFKTsKLSAgICBSZXN0b3JlQXV0b1BsYXkoKTsKLSAgICBiYWNrSW5HREkgPSB0cnVlOwotCi0gICAgLyogTm93IHByb2Nlc3MgbWVzc2FnZXMgbm9ybWFsbHkgdW50aWwgd2UgYXJlIHJlLWFjdGl2YXRlZCAqLwotICAgIHdhaXRBY3RpdmUgPSB0cnVlOwotICAgIGlmIChyZXRDb2RlICE9IFBNX05PX1NVU1BFTkRfQVBQKSB7Ci0Jd2hpbGUgKHdhaXRBY3RpdmUpIHsKLQkgICAgX0VWVF9wdW1wTWVzc2FnZXMoKTsKLQkgICAgU2xlZXAoMjAwKTsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFjdGl2YXRlIGFsbCB0aGUgc3VyZmFjZXMgZm9yIERpcmVjdERyYXcgYW5kIHNldCB0aGUgc3lzdGVtIGJhY2sgdXAgZm9yCi1mdWxsc2NyZWVuIHJlbmRlcmluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSZXN0b3JlRnVsbFNjcmVlbih2b2lkKQotewotICAgIHN0YXRpYyBpYm9vbCAgICBmaXJzdFRpbWUgPSB0cnVlOwotCi0gICAgaWYgKGZpcnN0VGltZSkgewotCS8qIENsZWFyIHRoZSBtZXNzYWdlIHF1ZXVlIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBzdXJmYWNlcyB0byBiZQotCSAqIHJlc3RvcmVkLgotCSAqLwotCWZpcnN0VGltZSA9IGZhbHNlOwotCXdoaWxlICgxKSB7Ci0JICAgIC8qIENvbnRpbnVlIGxvb3BpbmcgdW50aWwgb3V0IGFwcGxpY2F0aW9uIGhhcyBiZWVuIHJlc3RvcmVkCi0JICAgICAqIGFuZCB3ZSBoYXZlIHJlc2V0IHRoZSBkaXNwbGF5IG1vZGUuCi0JICAgICAqLwotCSAgICBfRVZUX3B1bXBNZXNzYWdlcygpOwotCSAgICBpZiAoR2V0QWN0aXZlV2luZG93KCkgPT0gX1BNX2h3bmRDb25zb2xlKSB7Ci0JCWlmIChzdXNwZW5kQXBwKQotCQkgICAgc3VzcGVuZEFwcChQTV9SRUFDVElWQVRFKTsKLQkJRGlzYWJsZUF1dG9QbGF5KCk7Ci0JCWJhY2tJbkdESSA9IGZhbHNlOwotCQl3YWl0QWN0aXZlID0gZmFsc2U7Ci0JCWZpcnN0VGltZSA9IHRydWU7Ci0JCXJldHVybjsKLQkJfQotCSAgICBTbGVlcCgyMDApOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc3VzcGVuZHMgdGhlIGFwcGxpY2F0aW9uIGJ5IHN3aXRjaGluZyBiYWNrIHRvIHRoZSBHREkgZGVza3RvcCwKLWFsbG93aW5nIG5vcm1hbCBhcHBsaWNhdGlvbiBjb2RlIHRvIGJlIHByb2Nlc3NlZCBhbmQgdGhlbiB3YWl0aW5nIGZvciB0aGUKLWFwcGxpY2F0aW9uIGFjdGl2YXRlIGNvbW1hbmQgdG8gYnJpbmcgdXMgYmFjayB0byBmdWxsc2NyZWVuIG1vZGUgd2l0aCBvdXIKLXdpbmRvdyBtaW5pbWlzZWQuCi0KLVRoaXMgdmVyc2lvbiBvbmx5IGdldHMgY2FsbGVkIGlmIHdlIGhhdmUgbm90IGNhcHR1cmVkIHRoZSBzY3JlZW4gc3dpdGNoIGluCi1vdXIgYWN0aXZhdGUgbWVzc2FnZSBsb29wcyBhbmQgd2lsbCBvY2N1ciBpZiB0aGUgRGlyZWN0RHJhdyBkcml2ZXJzIGxvc2UgYQotc3VyZmFjZSBmb3Igc29tZSByZWFzb24gd2hpbGUgcmVuZGVyaW5nLiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuLAotYnV0IGl0IGlzIGluY2x1ZGVkIGp1c3QgdG8gYmUgc3VyZSAoaXQgY2FuIGhhcHBlbiBvbiBXaW5OVC8yMDAwIGlmIHRoZSB1c2VyCi1oaXRzIHRoZSBDdHJsLUFsdC1EZWwga2V5IGNvbWJpbmF0aW9uKS4gTm90ZSB0aGF0IHRoaXMgY29kZSB3aWxsIGFsd2F5cwotc3BpbiBsb29wLCBhbmQgd2UgY2Fubm90IGRpc2FibGUgdGhlIHNwaW4gbG9vcGluZyBmcm9tIHRoaXMgdmVyc2lvbiAoaWU6Ci1pZiB0aGUgdXNlciBoaXRzIEN0cmwtQWx0LURlbCB1bmRlciBXaW5OVC8yMDAwIHRoZSBhcHBsaWNhdGlvbiBtYWluIGxvb3AKLXdpbGwgY2Vhc2UgdG8gYmUgZXhlY3V0ZWQgdW50aWwgdGhlIHVzZXIgc3dpdGNoZXMgYmFjayB0byB0aGUgYXBwbGljYXRpb24pLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZG9TdXNwZW5kQXBwKHZvaWQpCi17Ci0gICAgc3RhdGljICBpYm9vbCBmaXJzdFRpbWUgPSB0cnVlOwotCi0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fZG9TdXNwZW5kQXBwICE9IFBNX2RvU3VzcGVuZEFwcCkgewotCV9QTV9pbXBvcnRzLlBNX2RvU3VzcGVuZEFwcCgpOwotCXJldHVybjsKLQl9Ci0KLSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0JaWYgKHN1c3BlbmRBcHApCi0JICAgIHN1c3BlbmRBcHAoUE1fREVBQ1RJVkFURSk7Ci0JUmVzdG9yZUF1dG9QbGF5KCk7Ci0JZmlyc3RUaW1lID0gZmFsc2U7Ci0JYmFja0luR0RJID0gdHJ1ZTsKLQl9Ci0gICAgUmVzdG9yZUZ1bGxTY3JlZW4oKTsKLSAgICBmaXJzdFRpbWUgPSB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1haW4gV2luZG93IHByb2MgZm9yIHRoZSBmdWxsIHNjcmVlbiBEaXJlY3REcmF3IFdpbmRvdyB0aGF0IHdlIGNyZWF0ZSB3aGlsZQotcnVubmluZyBpbiBmdWxsIHNjcmVlbiBtb2RlLiBIZXJlIHdlIGNhcHR1cmUgYWxsIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMKLWZvciB0aGUgd2luZG93IGFuZCBwbHVnIHRoZW0gaW50byBvdXIgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIExPTkcgQ0FMTEJBQ0sgUE1fd2luUHJvYygKLSAgICBIV05EIGh3bmQsCi0gICAgVUlOVCBtc2csCi0gICAgV1BBUkFNIHdQYXJhbSwKLSAgICBMT05HIGxQYXJhbSkKLXsKLSAgICBzd2l0Y2ggKG1zZykgewotCWNhc2UgV01fU1lTQ0hBUjoKLQkgICAgLyogU3RvcCBBbHQtU3BhY2UgZnJvbSBwYXVzaW5nIG91ciBhcHBsaWNhdGlvbiAqLwotCSAgICByZXR1cm4gMDsKLQljYXNlIFdNX0tFWURPV046Ci0JY2FzZSBXTV9TWVNLRVlET1dOOgotCSAgICBpZiAoSElXT1JEKGxQYXJhbSkgJiBLRl9SRVBFQVQpIHsKLQkJaWYgKG1zZyA9PSBXTV9TWVNLRVlET1dOKQotCQkgICAgcmV0dXJuIDA7Ci0JCWJyZWFrOwotCQl9Ci0JICAgIC8qIEZhbGwgdGhyb3VnaCBmb3Iga2V5ZG93biBldmVudHMgKi8KLQljYXNlIFdNX0tFWVVQOgotCWNhc2UgV01fU1lTS0VZVVA6Ci0JICAgIGlmIChtc2cgPT0gV01fU1lTS0VZRE9XTiB8fCBtc2cgPT0gV01fU1lTS0VZVVApIHsKLQkJaWYgKChISVdPUkQobFBhcmFtKSAmIEtGX0FMVERPV04pICYmIHdQYXJhbSA9PSBWS19SRVRVUk4pCi0JCSAgICBicmVhazsKLQkJLyogV2UgaWdub3JlIHRoZSByZW1haW5kZXIgb2YgdGhlIHN5c3RlbSBrZXlzIHRvIHN0b3AgdGhlCi0JCSAqIHN5c3RlbSBtZW51IGZyb20gYmVpbmcgYWN0aXZhdGVkIGZyb20gdGhlIGtleWJvYXJkIGFuZCBwYXVzaW5nCi0JCSAqIG91ciBhcHAgd2hpbGUgZnVsbHNjcmVlbiAoaWU6IHByZXNzaW5nIHRoZSBBbHQga2V5KS4KLQkJICovCi0JCXJldHVybiAwOwotCQl9Ci0JICAgIGJyZWFrOwotCWNhc2UgV01fU1lTQ09NTUFORDoKLQkgICAgc3dpdGNoICh3UGFyYW0gJiB+MHgwRikgewotCQljYXNlIFNDX1NDUkVFTlNBVkU6Ci0JCWNhc2UgU0NfTU9OSVRPUlBPV0VSOgotCQkgICAgLyogSWdub3JlIHNjcmVlbnNhdmVyIHJlcXVlc3RzIGluIGZ1bGxzY3JlZW4gbW9kZXMgKi8KLQkJICAgIHJldHVybiAwOwotCQl9Ci0JICAgIGJyZWFrOwotCWNhc2UgV01fU0laRToKLQkgICAgaWYgKHdhaXRBY3RpdmUgJiYgYmFja0luR0RJICYmICh3UGFyYW0gIT0gU0laRV9NSU5JTUlaRUQpKSB7Ci0JCS8qIFN0YXJ0IHRoZSByZS1hY3RpdmF0aW9uIHByb2Nlc3MgKi8KLQkJUG9zdE1lc3NhZ2UoaHduZCxXTV9ET19TVVNQRU5EX0FQUCxXTV9QTV9SRVNUT1JFX0ZVTExTQ1JFRU4sMCk7Ci0JCX0KLQkgICAgZWxzZSBpZiAoIXdhaXRBY3RpdmUgJiYgaXNGdWxsU2NyZWVuICYmICFiYWNrSW5HREkgJiYgKHdQYXJhbSA9PSBTSVpFX01JTklNSVpFRCkpIHsKLQkJLyogU3RhcnQgdGhlIGRlLWFjdGl2YXRpb24gcHJvY2VzcyAqLwotCQlQb3N0TWVzc2FnZShod25kLFdNX0RPX1NVU1BFTkRfQVBQLFdNX1BNX0xFQVZFX0ZVTExTQ1JFRU4sMCk7Ci0JCX0KLQkgICAgYnJlYWs7Ci0JY2FzZSBXTV9ET19TVVNQRU5EX0FQUDoKLQkgICAgc3dpdGNoICh3UGFyYW0pIHsKLQkJCQljYXNlIFdNX1BNX1JFU1RPUkVfRlVMTFNDUkVFTjoKLQkJCQkJUmVzdG9yZUZ1bGxTY3JlZW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXTV9QTV9MRUFWRV9GVUxMU0NSRUVOOgotCQkJCQlMZWF2ZUZ1bGxTY3JlZW4oKTsKLQkJCQkJYnJlYWs7Ci0JCX0KLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIGlmIChvbGRXaW5Qcm9jKQotCXJldHVybiBvbGRXaW5Qcm9jKGh3bmQsbXNnLHdQYXJhbSxsUGFyYW0pOwotICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsbXNnLHdQYXJhbSxsUGFyYW0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWh3bmQgICAgLSBVc2VyIHdpbmRvdyB0byBjb252ZXJ0Ci13aWR0aCAgIC0gV2luZG93IG9mIHRoZSBmdWxsc2NyZWVuIHdpbmRvdwotaGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgZnVsbHNjcmVlbiB3aW5kb3cKLQotUkVUVVJOUzoKLUhhbmRsZSB0byBjb252ZXJ0ZWQgZnVsbHNjcmVlbiBXaW5kb3cuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBvcmlnaW5hbCB1c2VyIHdpbmRvdyBoYW5kbGUgYW5kIG1vZGlmaWVzIHRoZSBzaXplLAotcG9zaXRpb24gYW5kIGF0dHJpYnV0ZXMgZm9yIHRoZSB3aW5kb3cgdG8gY29udmVydCBpdCBpbnRvIGEgZnVsbHNjcmVlbgotd2luZG93IHRoYXQgd2UgY2FuIHVzZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgUE1fSFdORCBfUE1fY29udmVydFVzZXJXaW5kb3coCi0gICAgSFdORCBod25kLAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0KQotewotICAgIFJFQ1QgICAgd2luZG93OwotCi0gICAgR2V0V2luZG93UmVjdChod25kLCZ3aW5kb3cpOwotICAgIG9sZFdpblBvc1ggPSB3aW5kb3cubGVmdDsKLSAgICBvbGRXaW5Qb3NZID0gd2luZG93LnRvcDsKLSAgICBvbGRXaW5TaXplWCA9IHdpbmRvdy5yaWdodCAtIHdpbmRvdy5sZWZ0OwotICAgIG9sZFdpblNpemVZID0gd2luZG93LmJvdHRvbSAtIHdpbmRvdy50b3A7Ci0gICAgb2xkV25kU3R5bGUgPSBTZXRXaW5kb3dMb25nKGh3bmQsR1dMX1NUWUxFLFdTX1BPUFVQIHwgV1NfU1lTTUVOVSk7Ci0gICAgb2xkRXhXbmRTdHlsZSA9IFNldFdpbmRvd0xvbmcoaHduZCxHV0xfRVhTVFlMRSxXU19FWF9BUFBXSU5ET1cpOwotICAgIFNob3dXaW5kb3coaHduZCxTV19TSE9XKTsKLSAgICBNb3ZlV2luZG93KGh3bmQsMCwwLHdpZHRoLGhlaWdodCxUUlVFKTsKLSAgICBTZXRXaW5kb3dQb3MoaHduZCxIV05EX1RPUE1PU1QsMCwwLDAsMCxTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSk7Ci0gICAgb2xkV2luUHJvYyA9IChXTkRQUk9DKVNldFdpbmRvd0xvbmcoaHduZCxHV0xfV05EUFJPQywgKExQQVJBTSlQTV93aW5Qcm9jKTsKLSAgICByZXR1cm4gaHduZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1od25kICAgIC0gVXNlciB3aW5kb3cgdG8gcmVzdG9yZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgb3JpZ2luYWwgYXR0cmlidXRlcyBvZiB0aGUgdXNlciB3aW5kb3cgYW5kIHB1dCdzCi1pdCBiYWNrIGludG8gaXQncyBvcmlnaW5hbCBzdGF0ZSBiZWZvcmUgaXQgd2FzIGNvbnZlcnRlZCB0byBhIGZ1bGxzY3JlZW4KLXdpbmRvdy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfUE1fcmVzdG9yZVVzZXJXaW5kb3coCi0gICAgSFdORCBod25kKQotewotICAgIFNldFdpbmRvd0xvbmcoaHduZCxHV0xfV05EUFJPQywgKExQQVJBTSlvbGRXaW5Qcm9jKTsKLSAgICBTZXRXaW5kb3dMb25nKGh3bmQsR1dMX0VYU1RZTEUsb2xkRXhXbmRTdHlsZSk7Ci0gICAgU2V0V2luZG93TG9uZyhod25kLEdXTF9TVFlMRSxvbGRXbmRTdHlsZSk7Ci0gICAgU2V0V2luZG93UG9zKGh3bmQsSFdORF9OT1RPUE1PU1QsMCwwLDAsMCxTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSk7Ci0gICAgU2hvd1dpbmRvdyhod25kLFNXX1NIT1cpOwotICAgIE1vdmVXaW5kb3coaHduZCxvbGRXaW5Qb3NYLG9sZFdpblBvc1ksb2xkV2luU2l6ZVgsb2xkV2luU2l6ZVksVFJVRSk7Ci0gICAgb2xkV2luUHJvYyA9IE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZGV2aWNlICAtIEluZGV4IG9mIHRoZSBkZXZpY2UgdG8gbG9hZCBEaXJlY3REcmF3IGZvciAoMCBmb3IgcHJpbWFyeSkKLQotUkVNQVJLUzoKLUF0dGVtcHRzIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlIERpcmVjdERyYXcgRExMJ3MgYW5kIGNyZWF0ZSB0aGUgRGlyZWN0RHJhdwotb2JqZWN0cyB0aGF0IHdlIG5lZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2xvYWREaXJlY3REcmF3KAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgSERDICAgICAgICAgaGRjOwotICAgIGludCAgICAgICAgIGJpdHM7Ci0KLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9sb2FkRGlyZWN0RHJhdyAhPSBQTV9sb2FkRGlyZWN0RHJhdykKLQlyZXR1cm4gX1BNX2ltcG9ydHMuUE1fbG9hZERpcmVjdERyYXcoZGV2aWNlKTsKLQotICAgIC8qIFRPRE86IEhhbmRsZSBtdWx0aS1tb25pdG9yISEgKi8KLSAgICBpZiAoZGV2aWNlICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBMb2FkIHRoZSBEaXJlY3REcmF3IERMTCBpZiBub3QgcHJlc2VudGx5IGxvYWRlZCAqLwotICAgIEdFVF9ERUZBVUxUX0NXKCk7Ci0gICAgaWYgKCFoSW5zdEREKSB7Ci0JaGRjID0gR2V0REMoTlVMTCk7Ci0JYml0cyA9IEdldERldmljZUNhcHMoaGRjLEJJVFNQSVhFTCk7Ci0JUmVsZWFzZURDKE5VTEwsaGRjKTsKLQlpZiAoYml0cyA8IDgpCi0JICAgIHJldHVybiBOVUxMOwotCWlmICgoaEluc3RERCA9IExvYWRMaWJyYXJ5KCJkZHJhdy5kbGwiKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcERpcmVjdERyYXdDcmVhdGUgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaEluc3RERCwiRGlyZWN0RHJhd0NyZWF0ZSIpOwotCWlmICghcERpcmVjdERyYXdDcmVhdGUpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLQotICAgIC8qIENyZWF0ZSB0aGUgRGlyZWN0RHJhdyBvYmplY3QgKi8KLSAgICBpZiAoIWxwREQgJiYgcERpcmVjdERyYXdDcmVhdGUoTlVMTCwgJmxwREQsIE5VTEwpICE9IEREX09LKSB7Ci0JbHBERCA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7Ci0JfQotICAgIFJFU0VUX0RFRkFVTFRfQ1coKTsKLSAgICByZXR1cm4gbHBERDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1kZXZpY2UgIC0gSW5kZXggb2YgdGhlIGRldmljZSB0byB1bmxvYWQgRGlyZWN0RHJhdyBmb3IgKDAgZm9yIHByaW1hcnkpCi0KLVJFTUFSS1M6Ci1GcmVlcyBhbnkgRGlyZWN0RHJhdyBvYmplY3RzIGZvciB0aGUgZGV2aWNlLiBXZSBuZXZlciBhY3R1YWxseSBleHBsaWNpdGx5Ci11bmxvYWQgdGhlIGRkcmF3LmRsbCBsaWJyYXJ5LCBzaW5jZSB1bmxvYWRpbmcgYW5kIHJlbG9hZGluZyBpdCBpcwotdW5uZWNlc3Nhcnkgc2luY2Ugd2Ugb25seSB3YW50IHRvIHVubG9hZCBpdCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBleGl0cyBhbmQKLXRoYXQgaGFwcGVucyBhdXRvbWF0aWNhbGx5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fdW5sb2FkRGlyZWN0RHJhdygKLSAgICBpbnQgZGV2aWNlKQotewotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX3VubG9hZERpcmVjdERyYXcgIT0gUE1fdW5sb2FkRGlyZWN0RHJhdykgewotCV9QTV9pbXBvcnRzLlBNX3VubG9hZERpcmVjdERyYXcoZGV2aWNlKTsKLQlyZXR1cm47Ci0JfQotICAgIGlmIChscEREKSB7Ci0JSURpcmVjdERyYXdfUmVsZWFzZShscEREKTsKLQlscEREID0gTlVMTDsKLQl9Ci0gICAgKHZvaWQpZGV2aWNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW4gYSBjb25zb2xlIGZvciBvdXRwdXQgdG8gdGhlIHNjcmVlbiwgY3JlYXRpbmcgdGhlIG1haW4gZXZlbnQgaGFuZGxpbmcKLXdpbmRvdyBpZiBuZWNlc3NhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKLSAgICBQTV9IV05EIGhXbmRVc2VyLAotICAgIGludCBkZXZpY2UsCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMsCi0gICAgaW50IGJwcCwKLSAgICBpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIFdORENMQVNTICAgICAgICBjbHM7Ci0gICAgc3RhdGljIGlib29sICAgIGNsYXNzUmVnaXN0ZXJlZCA9IGZhbHNlOwotCi0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBHQV9nZXRTeXN0ZW1QTUltcG9ydHMoKTsKLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fb3BlbkNvbnNvbGUgIT0gUE1fb3BlbkNvbnNvbGUpIHsKLQlpZiAoZnVsbFNjcmVlbikgewotCSAgICBfUE1fZGVza1ggPSB4UmVzOwotCSAgICBfUE1fZGVza1kgPSB5UmVzOwotCSAgICB9Ci0JcmV0dXJuIF9QTV9pbXBvcnRzLlBNX29wZW5Db25zb2xlKGhXbmRVc2VyLGRldmljZSx4UmVzLHlSZXMsYnBwLGZ1bGxTY3JlZW4pOwotCX0KLQotICAgIC8qIENyZWF0ZSB0aGUgZnVsbHNjcmVlbiB3aW5kb3cgaWYgbmVjZXNzYXJ5ICovCi0gICAgaHduZFVzZXIgPSBoV25kVXNlcjsKLSAgICBpZiAoZnVsbFNjcmVlbikgewotCWlmICghY2xhc3NSZWdpc3RlcmVkKSB7Ci0JICAgIC8qIENyZWF0ZSBhIFdpbmRvdyBjbGFzcyBmb3IgdGhlIGZ1bGxzY3JlZW4gd2luZG93IGluIGhlcmUsIHNpbmNlCi0JICAgICAqIHdlIG5lZWQgdG8gcmVnaXN0ZXIgb25lIHRoYXQgd2lsbCBkbyBhbGwgb3VyIGV2ZW50IGhhbmRsaW5nIGZvcgotCSAgICAgKiB1cy4KLQkgICAgICovCi0JICAgIGhJbnN0QXBwICAgICAgICAgICAgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7Ci0JICAgIGNscy5oQ3Vyc29yICAgICAgICAgPSBMb2FkQ3Vyc29yKE5VTEwsSURDX0FSUk9XKTsKLQkgICAgY2xzLmhJY29uICAgICAgICAgICA9IExvYWRJY29uKGhJbnN0QXBwLE1BS0VJTlRSRVNPVVJDRSgxKSk7Ci0JICAgIGNscy5scHN6TWVudU5hbWUgICAgPSBOVUxMOwotCSAgICBjbHMubHBzekNsYXNzTmFtZSAgID0gc3pXaW5DbGFzc05hbWU7Ci0JICAgIGNscy5oYnJCYWNrZ3JvdW5kICAgPSBHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCk7Ci0JICAgIGNscy5oSW5zdGFuY2UgICAgICAgPSBoSW5zdEFwcDsKLQkgICAgY2xzLnN0eWxlICAgICAgICAgICA9IENTX0RCTENMS1M7Ci0JICAgIGNscy5scGZuV25kUHJvYyAgICAgPSBQTV93aW5Qcm9jOwotCSAgICBjbHMuY2JXbmRFeHRyYSAgICAgID0gMDsKLQkgICAgY2xzLmNiQ2xzRXh0cmEgICAgICA9IDA7Ci0JICAgIGlmICghUmVnaXN0ZXJDbGFzcygmY2xzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JICAgIGNsYXNzUmVnaXN0ZXJlZCA9IHRydWU7Ci0JICAgIH0KLQlfUE1fZGVza1ggPSB4UmVzOwotCV9QTV9kZXNrWSA9IHlSZXM7Ci0JaWYgKCFod25kVXNlcikgewotCSAgICBjaGFyIHdpbmRvd1RpdGxlWzgwXTsKLQkgICAgaWYgKExvYWRTdHJpbmcoaEluc3RBcHAsMSx3aW5kb3dUaXRsZSxzaXplb2Yod2luZG93VGl0bGUpKSA9PSAwKQotCQlzdHJjcHkod2luZG93VGl0bGUsIk1HTCBGdWxsc2NyZWVuIEFwcGxpY2F0aW9uIik7Ci0JICAgIF9QTV9od25kQ29uc29sZSA9IENyZWF0ZVdpbmRvd0V4KFdTX0VYX0FQUFdJTkRPVyxzeldpbkNsYXNzTmFtZSwKLQkJd2luZG93VGl0bGUsV1NfUE9QVVAgfCBXU19TWVNNRU5VLDAsMCx4UmVzLHlSZXMsCi0JCU5VTEwsTlVMTCxoSW5zdEFwcCxOVUxMKTsKLQkgICAgfQotCWVsc2UgewotCSAgICBfUE1faHduZENvbnNvbGUgPSBfUE1fY29udmVydFVzZXJXaW5kb3coaHduZFVzZXIseFJlcyx5UmVzKTsKLQkgICAgfQotCVNob3dDdXJzb3IoZmFsc2UpOwotCWlzRnVsbFNjcmVlbiA9IHRydWU7Ci0JfQotICAgIGVsc2UgewotCV9QTV9od25kQ29uc29sZSA9IGh3bmRVc2VyOwotCWlzRnVsbFNjcmVlbiA9IGZhbHNlOwotCX0KLSAgICBTZXRGb2N1cyhfUE1faHduZENvbnNvbGUpOwotICAgIFNldEZvcmVncm91bmRXaW5kb3coX1BNX2h3bmRDb25zb2xlKTsKLSAgICBEaXNhYmxlQXV0b1BsYXkoKTsKLSAgICAodm9pZClicHA7Ci0gICAgcmV0dXJuIF9QTV9od25kQ29uc29sZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GaW5kIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlIHN0YXRlIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX2dldENvbnNvbGVTdGF0ZVNpemUgIT0gUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSkKLQlyZXR1cm4gX1BNX2ltcG9ydHMuUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSgpOwotCi0gICAgLyogTm90IHVzZWQgaW4gV2luZG93cyAqLwotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSgKLSAgICB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX3NhdmVDb25zb2xlU3RhdGUgIT0gUE1fc2F2ZUNvbnNvbGVTdGF0ZSkgewotCV9QTV9pbXBvcnRzLlBNX3NhdmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsaHduZENvbnNvbGUpOwotCXJldHVybjsKLQl9Ci0KLSAgICAvKiBOb3QgdXNlZCBpbiBXaW5kb3dzICovCi0gICAgKHZvaWQpc3RhdGVCdWY7Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBzdXNwZW5kIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZvciB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKAotICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpCi17Ci0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrICE9IFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjaykgewotCV9QTV9pbXBvcnRzLlBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhzYXZlU3RhdGUpOwotCXJldHVybjsKLQl9Ci0gICAgc3VzcGVuZEFwcCA9IHNhdmVTdGF0ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSgKLSAgICBjb25zdCB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX3Jlc3RvcmVDb25zb2xlU3RhdGUgIT0gUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSkgewotCV9QTV9pbXBvcnRzLlBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsaHduZENvbnNvbGUpOwotCXJldHVybjsKLQl9Ci0KLSAgICAvKiBOb3QgdXNlZCBpbiBXaW5kb3dzICovCi0gICAgKHZvaWQpc3RhdGVCdWY7Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2xvc2UgdGhlIGZ1bGxzY3JlZW4gY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX2Nsb3NlQ29uc29sZSAhPSBQTV9jbG9zZUNvbnNvbGUpIHsKLQlfUE1faW1wb3J0cy5QTV9jbG9zZUNvbnNvbGUoaHduZENvbnNvbGUpOwotCXJldHVybjsKLQl9Ci0gICAgU2hvd0N1cnNvcih0cnVlKTsKLSAgICBSZXN0b3JlQXV0b1BsYXkoKTsKLSAgICBpZiAoaHduZFVzZXIpCi0JX1BNX3Jlc3RvcmVVc2VyV2luZG93KGh3bmRDb25zb2xlKTsKLSAgICBlbHNlCi0JRGVzdHJveVdpbmRvdyhod25kQ29uc29sZSk7Ci0gICAgaHduZFVzZXIgPSBOVUxMOwotICAgIF9QTV9od25kQ29uc29sZSA9IE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBEaXJlY3REcmF3IHdpbmRvdyBoYW5kbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fSFdORCBQTUFQSSBQTV9nZXREaXJlY3REcmF3V2luZG93KHZvaWQpCi17Ci0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdyAhPSBQTV9nZXREaXJlY3REcmF3V2luZG93KQotCXJldHVybiBfUE1faW1wb3J0cy5QTV9nZXREaXJlY3REcmF3V2luZG93KCk7Ci0gICAgcmV0dXJuIF9QTV9od25kQ29uc29sZTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzg4MDUyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyCi0qCi0qIERlc2NyaXB0aW9uOiAgV2luMzIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1c2hvcnQgICBrZXlVcE1zZ1syNTZdID0gezB9OyAgICAvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi1zdGF0aWMgaW50ICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgV2luMzIgKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpICAodm9pZCkoZmxhZ3MpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAotCi1SRU1BUktTOgotVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCi1zdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwotdGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgotZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKLXsgcmV0dXJuIHRpbWVHZXRUaW1lKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSBXaW4zMiBpbnRvIG91ciBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgTVNHICAgICBtc2c7Ci0gICAgTVNHICAgICBjaGFyTXNnOwotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIERpcmVjdElucHV0ISBXZSBjYW4ndCBzdXBwb3J0IHJlbGF0aXZlIG1vdXNlICovCi0gICAgLyogICAgICAgbW92ZW1lbnQgbW90aW9uIGNvdW50ZXJzIHdpdGhvdXQgRGlyZWN0SW5wdXQgOy0oLiAqLwotICAgIHdoaWxlIChQZWVrTWVzc2FnZSgmbXNnLE5VTEwsMCwwLFBNX1JFTU9WRSkpIHsKLQltZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKLQlzd2l0Y2ggKG1zZy5tZXNzYWdlKSB7Ci0JICAgIGNhc2UgV01fTU9VU0VNT1ZFOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0xCVVRUT05EQkxDTEs6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLIHwgRVZUX0RCTENMSUNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQlldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0xCVVRUT05VUDoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9SQlVUVE9OREJMQ0xLOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV04gfCBFVlRfREJMQ0xJQ0s7Ci0JCWV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX1JCVVRUT05ET1dOOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCWV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX1JCVVRUT05VUDoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTUJVVFRPTkRCTENMSzoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOIHwgRVZUX0RCTENMSUNLOwotCQlldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTUJVVFRPTkRPV046Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX01CVVRUT05VUDoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0tFWURPV046Ci0JICAgIGNhc2UgV01fU1lTS0VZRE9XTjoKLQkJaWYgKEhJV09SRChtc2cubFBhcmFtKSAmIEtGX1JFUEVBVCkgewotCQkgICAgZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOwotCQkgICAgfQotCQllbHNlIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX0tFWURPV047Ci0JCSAgICB9Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0tFWVVQOgotCSAgICBjYXNlIFdNX1NZU0tFWVVQOgotCQlldnQud2hhdCA9IEVWVF9LRVlVUDsKLQkJYnJlYWs7Ci0JICAgIH0KLQotCS8qIENvbnZlcnQgbW91c2UgZXZlbnQgbW9kaWZpZXIgZmxhZ3MgKi8KLQlpZiAoZXZ0LndoYXQgJiBFVlRfTU9VU0VFVlQpIHsKLQkgICAgaWYgKF9QTV9kZXNrWCkgewotCQlldnQud2hlcmVfeCA9ICgobG9uZyltc2cucHQueCAqIHJhbmdlWCkgLyBfUE1fZGVza1g7Ci0JCWV2dC53aGVyZV95ID0gKChsb25nKW1zZy5wdC55ICogcmFuZ2VZKSAvIF9QTV9kZXNrWTsKLQkJfQotCSAgICBlbHNlIHsKLQkJU2NyZWVuVG9DbGllbnQoX1BNX2h3bmRDb25zb2xlLCAmbXNnLnB0KTsKLQkJZXZ0LndoZXJlX3ggPSBtc2cucHQueDsKLQkJZXZ0LndoZXJlX3kgPSBtc2cucHQueTsKLQkJfQotCSAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX01PVVNFTU9WRSkgewotCQkvKiBTYXZlIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uICovCi0JCUVWVC5teCA9IGV2dC53aGVyZV94OwotCQlFVlQubXkgPSBldnQud2hlcmVfeTsKLQkJaWYgKEVWVC5vbGRNb3ZlICE9IC0xKSB7Ci0JCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeCA9IGV2dC53aGVyZV94Oy8qIE1vZGlmeSBleGlzdGluZyBvbmUgICovCi0JCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeSA9IGV2dC53aGVyZV95OwotLyogICAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ucmVsYXRpdmVfeCArPSBtaWNrZXlYOyAgICAvIC8gVE9ETyEgKi8KLS8qICAgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLnJlbGF0aXZlX3kgKz0gbWlja2V5WTsgICAgLyAvIFRPRE8hICovCi0JCSAgICBldnQud2hhdCA9IDA7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgRVZULm9sZE1vdmUgPSBFVlQuZnJlZUhlYWQ7IC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgZXZ0LnJlbGF0aXZlX3ggPSBtaWNrZXlYOyAgICAvIC8gVE9ETyEgKi8KLS8qICAgICAgICAgICAgICAgICAgZXZ0LnJlbGF0aXZlX3kgPSBtaWNrZXlZOyAgICAvIC8gVE9ETyEgKi8KLQkJICAgIH0KLQkJfQotCSAgICBlbHNlCi0JCUVWVC5vbGRNb3ZlID0gLTE7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfTEJVVFRPTikKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEJVVDsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19SQlVUVE9OKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVEJVVDsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19NQlVUVE9OKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9NSURETEVCVVQ7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfU0hJRlQpCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX1NISUZUS0VZOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX0NPTlRST0wpCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKLQkgICAgfQotCi0JLyogQ29udmVydCBrZXlib2FyZCBjb2RlcyAqLwotCVRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7Ci0JaWYgKGV2dC53aGF0ICYgRVZUX0tFWUVWVCkgewotCSAgICBpbnQgc2NhbkNvZGUgPSAobXNnLmxQYXJhbSA+PiAxNikgJiAweEZGOwotCSAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVVQKSB7Ci0JCS8qIEdldCBtZXNzYWdlIGZvciBrZXl1cCBjb2RlIGZyb20gdGFibGUgb2YgY2FjaGVkIGRvd24gdmFsdWVzICovCi0JCWV2dC5tZXNzYWdlID0ga2V5VXBNc2dbc2NhbkNvZGVdOwotCQlrZXlVcE1zZ1tzY2FuQ29kZV0gPSAwOwotCQl9Ci0JICAgIGVsc2UgewotCQlpZiAoUGVla01lc3NhZ2UoJmNoYXJNc2csTlVMTCxXTV9DSEFSLFdNX0NIQVIsUE1fUkVNT1ZFKSkKLQkJICAgIGV2dC5tZXNzYWdlID0gY2hhck1zZy53UGFyYW07Ci0JCWlmIChQZWVrTWVzc2FnZSgmY2hhck1zZyxOVUxMLFdNX1NZU0NIQVIsV01fU1lTQ0hBUixQTV9SRU1PVkUpKQotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBjaGFyTXNnLndQYXJhbTsKLQkJZXZ0Lm1lc3NhZ2UgfD0gKChtc2cubFBhcmFtID4+IDgpICYgMHhGRjAwKTsKLQkJa2V5VXBNc2dbc2NhbkNvZGVdID0gKHVzaG9ydClldnQubWVzc2FnZTsKLQkJfQotCSAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVJFUEVBVCkKLQkJZXZ0Lm1lc3NhZ2UgfD0gKG1zZy5sUGFyYW0gPDwgMTYpOwotCSAgICBpZiAoSElXT1JEKG1zZy5sUGFyYW0pICYgS0ZfQUxURE9XTikKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfQUxUU1RBVEU7Ci0JICAgIGlmIChHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDBVKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9TSElGVEtFWTsKLQkgICAgaWYgKEdldEtleVN0YXRlKFZLX0NPTlRST0wpICYgMHg4MDAwVSkKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfQ1RSTFNUQVRFOwotCSAgICBFVlQub2xkTW92ZSA9IC0xOwotCSAgICB9Ci0KLQlpZiAoZXZ0LndoYXQgIT0gMCkgewotCSAgICAvKiBBZGQgdGltZSBzdGFtcCBhbmQgYWRkIHRoZSBldmVudCB0byB0aGUgcXVldWUgKi8KLQkgICAgZXZ0LndoZW4gPSBtc2cudGltZTsKLQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCWFkZEV2ZW50KCZldnQpOwotCSAgICB9Ci0JRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KAotICAgIGludCBzaWduYWwpCi17Ci0gICAgKHZvaWQpc2lnbmFsOwotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgaW5pdEV2ZW50UXVldWUoKTsKLSAgICBtZW1zZXQoa2V5VXBNc2csMCxzaXplb2Yoa2V5VXBNc2cpKTsKLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCi1hbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9zZXRNb3VzZVBvcygKLSAgICBpbnQgKngsCi0gICAgaW50ICp5KQotewotICAgIC8qIFNjYWxlIGNvb3JkaW5hdGVzIHVwIHRvIGRlc2t0b3AgY29vcmRpbmF0ZXMgZmlyc3QgKi8KLSAgICBpbnQgc2NhbGVkWCA9ICgqeCAqIF9QTV9kZXNrWCkgLyByYW5nZVg7Ci0gICAgaW50IHNjYWxlZFkgPSAoKnkgKiBfUE1fZGVza1kpIC8gcmFuZ2VZOwotCi0gICAgLyogU2NhbGUgY29vcmRpbmF0ZXMgYmFjayB0byBzY3JlZW4gY29vcmRpbmF0ZXMgYWdhaW4gKi8KLSAgICAqeCA9IChzY2FsZWRYICogcmFuZ2VYKSAvIF9QTV9kZXNrWDsKLSAgICAqeSA9IChzY2FsZWRZICogcmFuZ2VZKSAvIF9QTV9kZXNrWTsKLSAgICBTZXRDdXJzb3JQb3Moc2NhbGVkWCxzY2FsZWRZKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgV2luMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFdpbjMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBtYXNrIGluZGljYXRpbmcgd2hhdCBqb3lzdGljayBheGVzIGFyZSBhdHRhY2hlZC4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVjdCB0aGUgYXR0YWNoZWQgam95c3RpY2tzLCBhbmQgZGV0ZXJtaW5lCi13aGF0IGF4ZXMgYXJlIHByZXNlbnQgYW5kIGZ1bmN0aW9uaW5nLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmUtZGV0ZWN0IGFueQotYXR0YWNoZWQgam95c3RpY2tzIHdoZW4gaXQgaXMgY2FsbGVkLCBzbyBpZiB0aGUgdXNlciBmb3Jnb3QgdG8gYXR0YWNoCi10aGUgam95c3RpY2sgd2hlbiB0aGUgYXBwbGljYXRpb24gc3RhcnRlZCwgeW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KLXJlLWRldGVjdCBhbnkgbmV3bHkgYXR0YWNoZWQgam95c3RpY2tzLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyLCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IEVWVEFQSSBFVlRfam95SXNQcmVzZW50KHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IGpveXN0aWNrIGNvZGUgYmFzZWQgb24gRGlyZWN0WCEgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUG9sbHMgdGhlIGpveXN0aWNrIGZvciBwb3NpdGlvbiBhbmQgYnV0dG9uIGluZm9ybWF0aW9uLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwb2xsIGFuYWxvZ3VlIGpveXN0aWNrcyBmb3IgYnV0dG9uIGFuZCBwb3NpdGlvbgotaW5mb3JtYXRpb24uIEl0IHNob3VsZCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBtYWluIGxvb3Agb2YgdGhlIHVzZXIKLWFwcGxpY2F0aW9uLCBqdXN0IGJlZm9yZSBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGV2ZW50cyB2aWEgRVZUX2dldE5leHQuCi1BbGwgaW5mb3JtYXRpb24gcG9sbGVkIGZyb20gdGhlIGpveXN0aWNrIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBldmVudAotcXVldWUgZm9yIGxhdGVyIHJldHJpZXZhbC4KLQotTm90ZTogICBNb3N0IGFuYWxvZ3VlIGpveXN0aWNrcyB3aWxsIHByb3ZpZGUgcmVhZGluZ3MgdGhhdCBjaGFuZ2UgZXZlbgotCXRob3VnaCB0aGUgam95c3RpY2sgaGFzIG5vdCBtb3ZlZC4gSGVuY2UgaWYgeW91IGNhbGwgdGhpcyByb3V0aW5lCi0JeW91IHdpbGwgbGlrZWx5IGdldCBhbiBFVlRfSk9ZTU9WRSBldmVudCBldmVyeSB0aW1lIHRocm91Z2ggeW91cgotCWV2ZW50IGxvb3AuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9wZWVrTmV4dCwgRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldExvd2VyUmlnaHQsCi1FVlRfam95U2V0Q2VudGVyLCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3BvbGxKb3lzdGljayh2b2lkKQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1DYWxpYnJhdGVzIHRoZSBqb3lzdGljayB1cHBlciBsZWZ0IHBvc2l0aW9uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gemVybyBpbiBvbiBiZXR0ZXIgam95c3RpY2sgY2FsaWJyYXRpb24gZmFjdG9ycywKLXdoaWNoIG1heSB3b3JrIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IHNpbXBsaXN0aWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKLXRoZSBqb3lzdGljayBpcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IGlzIGluaXRpYWxpc2VkKS4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhc2sgdGhlIHVzZXIgdG8gaG9sZCB0aGUgc3RpY2sgaW4gdGhlIHVwcGVyIGxlZnQKLXBvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcwotZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCi1jYWxpYnJhdGlvbiBmYWN0b3JzLgotCi1Vc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKLWluaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQotdXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQotc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldExvd2VyUmlnaHQsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfam95U2V0VXBwZXJMZWZ0KHZvaWQpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNhbGlicmF0ZXMgdGhlIGpveXN0aWNrIGxvd2VyIHJpZ2h0IHBvc2l0aW9uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gemVybyBpbiBvbiBiZXR0ZXIgam95c3RpY2sgY2FsaWJyYXRpb24gZmFjdG9ycywKLXdoaWNoIG1heSB3b3JrIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IHNpbXBsaXN0aWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKLXRoZSBqb3lzdGljayBpcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IGlzIGluaXRpYWxpc2VkKS4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhc2sgdGhlIHVzZXIgdG8gaG9sZCB0aGUgc3RpY2sgaW4gdGhlIGxvd2VyIHJpZ2h0Ci1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfam95U2V0TG93ZXJSaWdodCh2b2lkKQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1DYWxpYnJhdGVzIHRoZSBqb3lzdGljayBjZW50ZXIgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgY2VudGVyCi1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldENlbnRlcih2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvbnRzZXJ2Yy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvbnRzZXJ2Yy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQ5YWEwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL250c2VydmMuYworKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIERpc3BsYXkgRG9jdG9yCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDEgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBpcyBhIHByb3ByaWV0YXJ5IHRyYWRlIHNlY3JldCBvZiAgICAgfAotKiAgfFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCBDaGljbywgQ0EgOTU5MjggfAotKiAgfFVTQSAod3d3LnNjaXRlY2hzb2Z0LmNvbSkuICBBTlkgVU5BVVRIT1JJWkVEIFBPU1NFU1NJT04sIFVTRSwgICAgICAgfAotKiAgfFZJRVdJTkcsIENPUFlJTkcsIE1PRElGSUNBVElPTiBPUiBESVNTRU1JTkFUSU9OIE9GIFRISVMgQ09ERSBJUyAgICAgfAotKiAgfFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXLiAgVW5sZXNzIHlvdSBoYXZlIGN1cnJlbnQsIGV4cHJlc3MgICAgICAgfAotKiAgfHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFNjaVRlY2ggdG8gcG9zc2VzcyBvciB1c2UgdGhpcyBjb2RlLCB5b3UgfAotKiAgfG1heSBiZSBzdWJqZWN0IHRvIGNpdmlsIGFuZC9vciBjcmltaW5hbCBwZW5hbHRpZXMuICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfElmIHlvdSByZWNlaXZlZCB0aGlzIGNvZGUgaW4gZXJyb3Igb3IgeW91IHdvdWxkIGxpa2UgdG8gcmVwb3J0ICAgICAgfAotKiAgfGltcHJvcGVyIHVzZSwgcGxlYXNlIGltbWVkaWF0ZWx5IGNvbnRhY3QgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBhdCAgfAotKiAgfDUzMC04OTQtODQwMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbmRvd3MgTlQsIFdpbmRvd3MgMksgb3IgV2luZG93cyBYUC4KLSoKLSogRGVzY3JpcHRpb246ICBNYWluIG1vZHVsZSB0byBkbyB0aGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBTREQgYW5kIEdMRGlyZWN0Ci0qICAgICAgICAgICAgICAgZGV2aWNlIGRyaXZlciBjb21wb25lbnRzIHVuZGVyIFdpbmRvd3MgTlQvMksvWFAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJ3aW4zMi9vc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXN6RHJpdmVyTmFtZSAgICAtIEFjdHVhbCBuYW1lIG9mIHRoZSBkcml2ZXIgdG8gaW5zdGFsbCBpbiB0aGUgc3lzdGVtCi1zelNlcnZpY2VOYW1lICAgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGNyZWF0ZQotc3pMb2FkR3JvdXAgICAgIC0gTG9hZCBncm91cCBmb3IgdGhlIGRyaXZlciAoTlVMTCBmb3Igbm9ybWFsIGRyaXZlcnMpCi1kd1NlcnZpY2VUeXBlICAgLSBTZXJ2aWNlIHR5cGUgdG8gY3JlYXRlCi0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRvZXMgYWxsIHRoZSB3b3JrIHRvIGluc3RhbGwgdGhlIGRyaXZlciBpbnRvIHRoZSBzeXN0ZW0uCi1UaGUgZHJpdmVyIGlzIG5vdCBob3dldmVyIGFjdGl2YXRlZDsgZm9yIHRoYXQgeW91IG11c3QgdXNlIHRoZSBTdGFydF9TZGRGaWx0Ci1mdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9pbnN0YWxsU2VydmljZSgKLSAgICBjb25zdCBjaGFyICpzekRyaXZlck5hbWUsCi0gICAgY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSwKLSAgICBjb25zdCBjaGFyICpzekxvYWRHcm91cCwKLSAgICB1bG9uZyBkd1NlcnZpY2VUeXBlKQotewotICAgIFNDX0hBTkRMRSAgIHNjbUhhbmRsZTsKLSAgICBTQ19IQU5ETEUgICBkcml2ZXJIYW5kbGU7Ci0gICAgY2hhciAgICAgICAgc3pEcml2ZXJQYXRoW01BWF9QQVRIXTsKLSAgICBIS0VZICAgICAgICBrZXk7Ci0gICAgY2hhciAgICAgICAga2V5UGF0aFtNQVhfUEFUSF07Ci0gICAgdWxvbmcgICAgICAgc3RhdHVzOwotCi0gICAgLyogT2J0YWluIGEgaGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlciByZXF1ZXN0aW5nIGFsbCBhY2Nlc3MgKi8KLSAgICBpZiAoKHNjbUhhbmRsZSA9IE9wZW5TQ01hbmFnZXIoTlVMTCwgTlVMTCwgU0NfTUFOQUdFUl9BTExfQUNDRVNTKSkgPT0gTlVMTCkKLQlyZXR1cm4gR2V0TGFzdEVycm9yKCk7Ci0KLSAgICAvKiBGaW5kIHRoZSBwYXRoIHRvIHRoZSBkcml2ZXIgaW4gc3lzdGVtIGRpcmVjdG9yeSAqLwotICAgIEdldFN5c3RlbURpcmVjdG9yeShzekRyaXZlclBhdGgsIHNpemVvZihzekRyaXZlclBhdGgpKTsKLSAgICBzdHJjYXQoc3pEcml2ZXJQYXRoLCAiXFxkcml2ZXJzXFwiKTsKLSAgICBzdHJjYXQoc3pEcml2ZXJQYXRoLCBzekRyaXZlck5hbWUpOwotCi0gICAgLyogQ3JlYXRlIHRoZSBzZXJ2aWNlIHdpdGggdGhlIFNlcnZpY2UgQ29udHJvbCBNYW5hZ2VyLiAqLwotICAgIGRyaXZlckhhbmRsZSA9IENyZWF0ZVNlcnZpY2Uoc2NtSGFuZGxlLAotCQkJCSBzelNlcnZpY2VOYW1lLAotCQkJCSBzelNlcnZpY2VOYW1lLAotCQkJCSBTRVJWSUNFX0FMTF9BQ0NFU1MsCi0JCQkJIGR3U2VydmljZVR5cGUsCi0JCQkJIFNFUlZJQ0VfQk9PVF9TVEFSVCwKLQkJCQkgU0VSVklDRV9FUlJPUl9OT1JNQUwsCi0JCQkJIHN6RHJpdmVyUGF0aCwKLQkJCQkgc3pMb2FkR3JvdXAsCi0JCQkJIE5VTEwsCi0JCQkJIE5VTEwsCi0JCQkJIE5VTEwsCi0JCQkJIE5VTEwpOwotCi0gICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBkcml2ZXIgY291bGQgYWN0dWFsbHkgYmUgaW5zdGFsbGVkLiAqLwotICAgIGlmICghZHJpdmVySGFuZGxlKSB7Ci0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgICAvKiBHZXQgYSBoYW5kbGUgdG8gdGhlIGtleSBmb3IgZHJpdmVyIHNvIHRoYXQgaXQgY2FuIGJlIGFsdGVyZWQgaW4gdGhlICovCi0gICAgLyogbmV4dCBzdGVwLiAqLwotICAgIHN0cmNweShrZXlQYXRoLCAiU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXCIpOwotICAgIHN0cmNhdChrZXlQYXRoLCBzelNlcnZpY2VOYW1lKTsKLSAgICBpZiAoKHN0YXR1cyA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsa2V5UGF0aCwwLEtFWV9BTExfQUNDRVNTLCZrZXkpKSAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JLyogQSBwcm9ibGVtIGhhcyBvY2N1cmVkLiBEZWxldGUgdGhlIHNlcnZpY2Ugc28gdGhhdCBpdCBpcyBub3QgaW5zdGFsbGVkLiAqLwotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCURlbGV0ZVNlcnZpY2UoZHJpdmVySGFuZGxlKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLQotICAgIC8qIERlbGV0ZSB0aGUgSW1hZ2VQYXRoIHZhbHVlIGluIHRoZSBuZXdseSBjcmVhdGVkIGtleSBzbyB0aGF0IHRoZSAqLwotICAgIC8qIHN5c3RlbSBsb29rcyBmb3IgdGhlIGRyaXZlciBpbiB0aGUgbm9ybWFsIGxvY2F0aW9uLiAqLwotICAgIGlmICgoc3RhdHVzID0gUmVnRGVsZXRlVmFsdWUoa2V5LCAiSW1hZ2VQYXRoIikpICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkvKiBBIHByb2JsZW0gaGFzIG9jY3VycmVkLiBEZWxldGUgdGhlIHNlcnZpY2Ugc28gdGhhdCBpdCBpcyBub3QgKi8KLQkvKiBpbnN0YWxsZWQgYW5kIHdpbGwgbm90IHRyeSB0byBzdGFydC4gKi8KLQlSZWdDbG9zZUtleShrZXkpOwotCURlbGV0ZVNlcnZpY2UoZHJpdmVySGFuZGxlKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLQotICAgIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCi0gICAgUmVnQ2xvc2VLZXkoa2V5KTsKLSAgICBDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLSAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLSAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zelNlcnZpY2VOYW1lICAgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHN0YXJ0Ci0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIGFuZCBtYWtlIGl0IGFjdGl2ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9zdGFydFNlcnZpY2UoCi0gICAgY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSkKLXsKLSAgICBTQ19IQU5ETEUgICAgICAgc2NtSGFuZGxlOwotICAgIFNDX0hBTkRMRSAgICAgICBkcml2ZXJIYW5kbGU7Ci0gICAgU0VSVklDRV9TVEFUVVMJc2VydmljZVN0YXR1czsKLSAgICB1bG9uZyAgICAgICAgICAgc3RhdHVzOwotCi0gICAgLyogT2J0YWluIGEgaGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlciByZXF1ZXN0aW5nIGFsbCBhY2Nlc3MgKi8KLSAgICBpZiAoKHNjbUhhbmRsZSA9IE9wZW5TQ01hbmFnZXIoTlVMTCwgTlVMTCwgU0NfTUFOQUdFUl9BTExfQUNDRVNTKSkgPT0gTlVMTCkKLQlyZXR1cm4gR2V0TGFzdEVycm9yKCk7Ci0KLSAgICAvKiBPcGVuIHRoZSBzZXJ2aWNlIHdpdGggdGhlIFNlcnZpY2UgQ29udHJvbCBNYW5hZ2VyLiAqLwotICAgIGlmICgoZHJpdmVySGFuZGxlID0gT3BlblNlcnZpY2Uoc2NtSGFuZGxlLHN6U2VydmljZU5hbWUsU0VSVklDRV9BTExfQUNDRVNTKSkgPT0gTlVMTCkgewotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotCi0gICAgLyogU3RhcnQgdGhlIHNlcnZpY2UgKi8KLSAgICBpZiAoIVN0YXJ0U2VydmljZShkcml2ZXJIYW5kbGUsMCxOVUxMKSkgewotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCUNsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotCi0gICAgLyogUXVlcnkgdGhlIHNlcnZpY2UgdG8gbWFrZSBzdXJlIGl0IGlzIHRoZXJlICovCi0gICAgaWYgKCFRdWVyeVNlcnZpY2VTdGF0dXMoZHJpdmVySGFuZGxlLCZzZXJ2aWNlU3RhdHVzKSkgewotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCUNsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotICAgIENsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXN6U2VydmljZU5hbWUgICAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gc3RvcAotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0b3AgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIGFuZCBkaXNhYmxlIGl0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX3N0b3BTZXJ2aWNlKAotICAgIGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpCi17Ci0gICAgU0NfSEFORExFICAgICAgIHNjbUhhbmRsZTsKLSAgICBTQ19IQU5ETEUgICAgICAgZHJpdmVySGFuZGxlOwotICAgIFNFUlZJQ0VfU1RBVFVTCXNlcnZpY2VTdGF0dXM7Ci0gICAgdWxvbmcgICAgICAgICAgIHN0YXR1czsKLQotICAgIC8qIE9idGFpbiBhIGhhbmRsZSB0byB0aGUgc2VydmljZSBjb250cm9sIG1hbmFnZXIgcmVxdWVzdGluZyBhbGwgYWNjZXNzICovCi0gICAgaWYgKChzY21IYW5kbGUgPSBPcGVuU0NNYW5hZ2VyKE5VTEwsIE5VTEwsIFNDX01BTkFHRVJfQUxMX0FDQ0VTUykpID09IE5VTEwpCi0JcmV0dXJuIEdldExhc3RFcnJvcigpOwotCi0gICAgLyogT3BlbiB0aGUgc2VydmljZSB3aXRoIHRoZSBTZXJ2aWNlIENvbnRyb2wgTWFuYWdlci4gKi8KLSAgICBpZiAoKGRyaXZlckhhbmRsZSA9IE9wZW5TZXJ2aWNlKHNjbUhhbmRsZSxzelNlcnZpY2VOYW1lLFNFUlZJQ0VfQUxMX0FDQ0VTUykpID09IE5VTEwpIHsKLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLQotICAgIC8qIFN0b3AgdGhlIHNlcnZpY2UgZnJvbSBydW5uaW5nICovCi0gICAgaWYgKCFDb250cm9sU2VydmljZShkcml2ZXJIYW5kbGUsIFNFUlZJQ0VfQ09OVFJPTF9TVE9QLCAmc2VydmljZVN0YXR1cykpIHsKLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLSAgICBDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLSAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLSAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zelNlcnZpY2VOYW1lICAgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHJlbW92ZQotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBhIHNlcnZpY2UgY29tcGxldGVseSBmcm9tIHRoZSBzeXN0ZW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fcmVtb3ZlU2VydmljZSgKLSAgICBjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lKQotewotICAgIFNDX0hBTkRMRSAgIHNjbUhhbmRsZTsKLSAgICBTQ19IQU5ETEUgICBkcml2ZXJIYW5kbGU7Ci0gICAgdWxvbmcgICAgICAgc3RhdHVzOwotCi0gICAgLyogT2J0YWluIGEgaGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlciByZXF1ZXN0aW5nIGFsbCBhY2Nlc3MgKi8KLSAgICBpZiAoKHNjbUhhbmRsZSA9IE9wZW5TQ01hbmFnZXIoTlVMTCwgTlVMTCwgU0NfTUFOQUdFUl9BTExfQUNDRVNTKSkgPT0gTlVMTCkKLQlyZXR1cm4gR2V0TGFzdEVycm9yKCk7Ci0KLSAgICAvKiBPcGVuIHRoZSBzZXJ2aWNlIHdpdGggdGhlIFNlcnZpY2UgQ29udHJvbCBNYW5hZ2VyLiAqLwotICAgIGlmICgoZHJpdmVySGFuZGxlID0gT3BlblNlcnZpY2Uoc2NtSGFuZGxlLHN6U2VydmljZU5hbWUsU0VSVklDRV9BTExfQUNDRVNTKSkgPT0gTlVMTCkgewotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotCi0gICAgLyogUmVtb3ZlIHRoZSBzZXJ2aWNlICovCi0gICAgaWYgKCFEZWxldGVTZXJ2aWNlKGRyaXZlckhhbmRsZSkpIHsKLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLSAgICBDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLSAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLSAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzU5ZTkwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNkZWZpbmUgU1RSSUNUCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPG1tc3lzdGVtLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLSNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCi0jaW5jbHVkZSAicG0vZGRyYXcuaCIKLQotLyogTWFjcm9zIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29udHJvbCB3b3JkLiBXaW5kb3dzIDl4IGhhcwotICogc29tZSBidWdzIGluIGl0IHN1Y2ggdGhhdCBjYWxscyB0byBsb2FkIGFueSBETEwncyB3aGljaCBsb2FkIDE2LWJpdAotICogRExMJ3MgY2F1c2UgdGhlIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgd29yZCB0byBnZXQgdHJhc2hlZC4gV2UgZml4Ci0gKiB0aGlzIGJ5IHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBjb250cm9sIHdvcmQgYWNyb3NzIHByb2JsZW1hdGljCi0gKiBjYWxscy4KLSAqLwotCi0jaWYgZGVmaW5lZChfX0lOVEVMX18pCi0jZGVmaW5lIEdFVF9ERUZBVUxUX0NXKCkgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChfUE1fY3dfZGVmYXVsdCA9PSAwKSAgICAgICAgICAgICAgICBcCi0JX1BNX2N3X2RlZmF1bHQgPSBfY29udHJvbDg3KDAsMCk7ICAgXAotfQotI2RlZmluZSBSRVNFVF9ERUZBVUxUX0NXKCkgICAgICAgICAgICAgICAgICBcCi0gICAgX2NvbnRyb2w4NyhfUE1fY3dfZGVmYXVsdCwweEZGRkZGRkZGKQotI2Vsc2UKLSNkZWZpbmUgR0VUX0RFRkFVTFRfQ1coKQotI2RlZmluZSBSRVNFVF9ERUZBVUxUX0NXKCkKLSNlbmRpZgotCi0vKiBDdXN0b20gd2luZG93IG1lc3NhZ2VzICovCi0KLSNkZWZpbmUJV01fRE9fU1VTUEVORF9BUFAJCQlXTV9VU0VSCi0jZGVmaW5lCVdNX1BNX0xFQVZFX0ZVTExTQ1JFRU4JICAgIDAKLSNkZWZpbmUJV01fUE1fUkVTVE9SRV9GVUxMU0NSRUVOCTEKLQotLyogTWFjcm8gZm9yIGRpc2FibGluZyBBdXRvUGxheSBvbiBhIHVzZSBzeXN0ZW0gKi8KLQotI2RlZmluZSBBVVRPUExBWV9EUklWRV9DRFJPTSAgICAweDIwCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19JTlRFTF9fCi1leHRlcm4gdWludCAgICAgX1BNX2N3X2RlZmF1bHQ7ICAgICAgICAgLyogRGVmYXVsdCBGUFUgY29udHJvbCB3b3JkICAgICAqLwotI2VuZGlmCi1leHRlcm4gaW50ICAgICAgX1BNX2Rlc2tYLF9QTV9kZXNrWTsgICAgLyogRGVza3RvcCBkaW1lbnNpb25zICAgICAgICAgICAqLwotZXh0ZXJuIEhXTkQgICAgIF9QTV9od25kQ29uc29sZTsgICAgICAgIC8qIFdpbmRvdyBoYW5kbGUgZm9yIGNvbnNvbGUgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZkYmNjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNkZWZpbmUgU1RSSUNUCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPG1tc3lzdGVtLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkaXJlY3QuaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInBtX2hlbHAuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaWJvb2wgICAgICAgICAgIF9QTV9oYXZlV2luTlQ7ICAgICAgLyogVHJ1ZSBpZiB3ZSBhcmUgcnVubmluZyBvbiBOVCAgICAgKi8KLXN0YXRpYyB1aW50ICAgICBWRVNBQnVmX2xlbiA9IDEwMjQ7IC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCi1zdGF0aWMgdm9pZCAgICAgKlZFU0FCdWZfcHRyID0gTlVMTDsvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLwotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcnNlZzsgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgb2YgVkVTQUJ1ZiAgICAgKi8KLXN0YXRpYyB1aW50ICAgICBWRVNBQnVmX3JvZmY7ICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCi1IQU5ETEUgICAgICAgICAgX1BNX2hEZXZpY2UgPSBOVUxMOyAvKiBIYW5kbGUgdG8gV2luMzIgVnhEICAgICAgICAgICAgICAqLwotc3RhdGljIGlib29sICAgIGluaXRlZCA9IGZhbHNlOyAgICAgLyogRmxhZ3MgaWYgd2UgYXJlIGluaXRpYWxpc2VkICAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLXN0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lS2V5ICAgPSAiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcQ29tcHV0ZXJOYW1lXFxDb21wdXRlck5hbWUiOwotc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWVLZXlOVCA9ICJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxDb21wdXRlck5hbWVcXEFjdGl2ZUNvbXB1dGVyTmFtZSI7Ci1zdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZSAgICAgID0gIkNvbXB1dGVyTmFtZSI7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIE1hY3JvIHRvIGNoZWNrIGZvciBhIHZhbGlkLCBsb2FkZWQgdmVyc2lvbiBvZiBQTUhFTFAuIFdlIGNoZWNrIHRoaXMKLSAqIG9uIGRlbWFuZCB3aGVuIHdlIG5lZWQgdGhlc2Ugc2VydmljZXMgcmF0aGVyIHRoYW4gd2hlbiBQTV9pbml0KCkgaXMKLSAqIGNhbGxlZCBiZWNhdXNlIGlmIHdlIGFyZSBydW5uaW5nIG9uIERpcmVjdERyYXcgd2UgZG9uJ3QgbmVlZCBQTUhFTFAuVlhELgotICovCi0KLSNkZWZpbmUgQ0hFQ0tfRk9SX1BNSEVMUCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChfUE1faERldmljZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoX1BNX2hhdmVXaW5OVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gUE1IRUxQLlNZUyBvciBTRERIRUxQLlNZUyEiKTsgXAotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBjb25uZWN0IHRvIFBNSEVMUC5WWEQgb3IgU0RESEVMUC5WWEQhIik7IFwKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5IGFuZCBjb25uZWN0IHRvIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlci4gSWYgd2UKLWNhbm5vdCBjb25uZWN0IHRvIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlciwgd2UgYmFpbCBvdXQgd2l0aCBhbiBlcnJvcgotbWVzc2FnZS4gT3VyIFdpbmRvd3MgOXggVnhEIGlzIGR5bmFtaWNhbGx5IGxvYWRhYmxlLCBzbyBpdCBjYW4gYmUgbG9hZGVkCi1hZnRlciB0aGUgc3lzdGVtIGhhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotICAgIGNoYXIgICAgY250UGF0aFtQTV9NQVhfUEFUSF07Ci0gICAgY2hhciAgICAqZW52OwotCi0gICAgLyogQ3JlYXRlIGEgZmlsZSBoYW5kbGUgZm9yIHRoZSBzdGF0aWMgVnhEIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UKLSAgICAgKiBkeW5hbWljYWxseSBsb2FkIHRoZSBQTUhFTFAgaGVscGVyIFZ4RC4gTm90ZSB0aGF0IGlmIGFuIG9sZCB2ZXJzaW9uCi0gICAgICogb2YgU0REIGlzIGxvYWRlZCwgd2UgdXNlIHRoZSBQTUhFTFAgVnhEIGluc3RlYWQuCi0gICAgICovCi0gICAgaWYgKCFpbml0ZWQpIHsKLQkvKiBEZXRlcm1pbmUgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgV2luZG93cyBOVCBvciBub3QgYW5kCi0JICogc2V0IHRoZSBnbG9iYWwgT1MgdHlwZSB2YXJpYWJsZS4KLQkgKi8KLQlfUE1faGF2ZVdpbk5UID0gZmFsc2U7Ci0JaWYgKChHZXRWZXJzaW9uKCkgJiAweDgwMDAwMDAwVUwpID09IDApCi0JICAgIF9QTV9oYXZlV2luTlQgPSB0cnVlOwotCV9fX2Rydl9vc190eXBlID0gKF9QTV9oYXZlV2luTlQpID8gX09TX1dJTk5UIDogX09TX1dJTjk1OwotCi0JLyogTm93IHRyeSB0byBjb25uZWN0IHRvIFNEREhFTFAuVlhEIG9yIFNEREhFTFAuU1lTICovCi0JX1BNX2hEZXZpY2UgPSBDcmVhdGVGaWxlKFNEREhFTFBfTU9EVUxFX1BBVEgsIDAsMCwwLCBDUkVBVEVfTkVXLCBGSUxFX0ZMQUdfREVMRVRFX09OX0NMT1NFLCAwKTsKLQlpZiAoX1BNX2hEZXZpY2UgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkgICAgaWYgKCFEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRWRVIzMiwgTlVMTCwgMCwKLQkJICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkgfHwgb3V0QnVmWzBdIDwgUE1IRUxQX1ZFUlNJT04pIHsKLQkJLyogT2xkIHZlcnNpb24gb2YgU0RESEVMUCBsb2FkZWQsIHNvIHVzZSBQTUhFTFAgaW5zdGVhZCAqLwotCQlDbG9zZUhhbmRsZShfUE1faERldmljZSk7Ci0JCV9QTV9oRGV2aWNlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JCX0KLQkgICAgfQotCWlmIChfUE1faERldmljZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCSAgICAvKiBGaXJzdCB0cnkgdG8gc2VlIGlmIHRoZXJlIGlzIGEgY3VycmVudGx5IGxvYWRlZCBQTUhFTFAgZHJpdmVyLgotCSAgICAgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2Ugd2hlbiB3ZSBhcmUgcnVubmluZyB1bmRlciBXaW5kb3dzIE5ULzJLLgotCSAgICAgKi8KLQkgICAgX1BNX2hEZXZpY2UgPSBDcmVhdGVGaWxlKFBNSEVMUF9NT0RVTEVfUEFUSCwgMCwwLDAsIENSRUFURV9ORVcsIEZJTEVfRkxBR19ERUxFVEVfT05fQ0xPU0UsIDApOwotCSAgICBpZiAoX1BNX2hEZXZpY2UgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJLyogVGhlIGRyaXZlciB3YXMgbm90IHN0YXRpY2x5IGxvYWRlZCwgc28gdHJ5IGNyZWF0aW5nIGEgZmlsZSBoYW5kbGUKLQkJICogdG8gYSBkeW5hbWljIHZlcnNpb24gb2YgdGhlIFZ4RCBpZiBwb3NzaWJsZS4gTm90ZSB0aGF0IG9uIFdpbk5ULzJLIHdlCi0JCSAqIGNhbm5vdCBzdXBwb3J0IGR5bmFtaWNhbGx5IGxvYWRpbmcgdGhlIGRyaXZlcnMuCi0JCSAqLwotCQlfUE1faERldmljZSA9IENyZWF0ZUZpbGUoUE1IRUxQX1ZYRF9QQVRILCAwLDAsMCwgQ1JFQVRFX05FVywgRklMRV9GTEFHX0RFTEVURV9PTl9DTE9TRSwgMCk7Ci0JCX0KLQkgICAgfQotCWlmIChfUE1faERldmljZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCSAgICAvKiBDYWxsIHRoZSBkcml2ZXIgdG8gZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG51bWJlciAqLwotCSAgICBpZiAoIURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVFZFUjMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkJICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkgfHwgb3V0QnVmWzBdIDwgUE1IRUxQX1ZFUlNJT04pIHsKLQkJaWYgKF9QTV9oYXZlV2luTlQpCi0JCSAgICBQTV9mYXRhbEVycm9yKCJPbGRlciB2ZXJzaW9uIG9mIFBNSEVMUC5TWVMgZm91bmQhIik7Ci0JCWVsc2UKLQkJICAgIFBNX2ZhdGFsRXJyb3IoIk9sZGVyIHZlcnNpb24gb2YgUE1IRUxQLlZYRCBmb3VuZCEiKTsKLQkJfQotCi0JICAgIC8qIE5vdyBzZXQgdGhlIGN1cnJlbnQgcGF0aCBpbnNpZGUgdGhlIFZ4RCBzbyBpdCBrbm93cyB3aGF0IHRoZQotCSAgICAgKiBjdXJyZW50IGRpcmVjdG9yeSBpcyBmb3IgbG9hZGluZyBOdWNsZXVzIGRyaXZlcnMuCi0JICAgICAqLwotCSAgICBpbkJ1ZlswXSA9ICh1bG9uZylQTV9nZXRDdXJyZW50UGF0aChjbnRQYXRoLHNpemVvZihjbnRQYXRoKSk7Ci0JICAgIGlmICghRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfU0VUQ05UUEFUSDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQkJUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIHNldCBWeEQgY3VycmVudCBwYXRoISIpOwotCi0JICAgIC8qIE5vdyBwYXNzIGRvd24gdGhlIE5VQ0xFVVNfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZGV2aWNlCi0JICAgICAqIGRyaXZlciBzbyBpdCBjYW4gdXNlIHRoaXMgdmFsdWUgaWYgaXQgaXMgZm91bmQuCi0JICAgICAqLwotCSAgICBpZiAoKGVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIikpICE9IE5VTEwpIHsKLQkJaW5CdWZbMF0gPSAodWxvbmcpZW52OwotCQlpZiAoIURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX1NFVE5VQ0xFVVNQQVRIMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLCBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCQkgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIHNldCBWeEQgTnVjbGV1cyBwYXRoISIpOwotCQl9Ci0KLQkgICAgLyogRW5hYmxlIElPUEwgZm9yIHJpbmctMyBjb2RlIGJ5IGRlZmF1bHQgaWYgZHJpdmVyIGlzIHByZXNlbnQgKi8KLQkgICAgaWYgKF9QTV9oYXZlV2luTlQpCi0JCVBNX3NldElPUEwoMyk7Ci0JICAgIH0KLQotCS8qIEluZGljYXRlIHRoYXQgd2UgaGF2ZSBiZWVuIGluaXRpYWxpc2VkICovCi0JaW5pdGVkID0gdHJ1ZTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2UgZG8gaGF2ZSBCSU9TIGFjY2VzcyB1bmRlciBXaW5kb3dzIDl4LCBidXQgbm90IHVuZGVyIFdpbmRvd3MgTlQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3NldElPUEwoCi0gICAgaW50IGlvcGwpCi17Ci0gICAgRFdPUkQgICAgICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgICAgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgICAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0gICAgc3RhdGljIGludCAgY250SU9QTCA9IDA7Ci0gICAgaW50ICAgICAgICAgb2xkSU9QTCA9IGNudElPUEw7Ci0KLSAgICAvKiBFbmFibGUgSS9PIGJ5IGFkanVzdGluZyB0aGUgSS9PIHBlcm1pc3Npb25zIG1hcCBvbiBXaW5kb3dzIE5UICovCi0gICAgaWYgKF9QTV9oYXZlV2luTlQpIHsKLQlDSEVDS19GT1JfUE1IRUxQKCk7Ci0JaWYgKGlvcGwgPT0gMykKLQkgICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRU5BQkxFUklORzNJT1BMLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSxvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpOwotCWVsc2UKLQkgICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRElTQUJMRVJJTkczSU9QTCwgaW5CdWYsIHNpemVvZihpbkJ1Ziksb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKTsKLQljbnRJT1BMID0gaW9wbDsKLQlyZXR1cm4gb2xkSU9QTDsKLQl9Ci0KLSAgICAvKiBXZSBhbHdheXMgaGF2ZSBJT1BMIG9uIFdpbmRvd3MgOXggKi8KLSAgICByZXR1cm4gMzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XZSBkbyBoYXZlIEJJT1MgYWNjZXNzIHVuZGVyIFdpbmRvd3MgOXgsIGJ1dCBub3QgdW5kZXIgV2luZG93cyBOVC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQotewotICAgIGlmIChQTV9nZXRPU1R5cGUoKSA9PSBfT1NfV0lOTlQpCi0JcmV0dXJuIGZhbHNlOwotICAgIGVsc2UKLQlyZXR1cm4gX1BNX2hEZXZpY2UgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgaWRlbnRpZmllci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQotewotICAgIGlmICgoR2V0VmVyc2lvbigpICYgMHg4MDAwMDAwMFVMKSA9PSAwKQotCXJldHVybiBfX19kcnZfb3NfdHlwZSA9IF9PU19XSU5OVDsKLSAgICBlbHNlCi0JcmV0dXJuIF9fX2Rydl9vc190eXBlID0gX09TX1dJTjk1OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNXzM4NjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goCi0gICAgY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXBvcnQgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gYW5kIGhhbHQgdGhlIHByb2dyYW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKAotICAgIGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBNZXNzYWdlQm94KE5VTEwsbXNnLCJGYXRhbCBFcnJvciEiLCBNQl9JQ09ORVhDTEFNQVRJT04pOwotICAgIGV4aXQoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgdGhlIHJlYWwgbW9kZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBCSU9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgRFdPUkQgICBvdXRCdWZbNF07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIC8qIFdlIHJlcXVpcmUgdGhlIGhlbHBlciBWeEQgdG8gYmUgbG9hZGVkIHN0YXRpY2x5IGluIG9yZGVyIHRvIHN1cHBvcnQKLSAgICAgKiB0aGUgVkVTQSB0cmFuc2ZlciBidWZmZXIuIFdlIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcKLSAgICAgKiByZWFsIG1vZGUgbWVtb3J5IGJ1ZmZlcnMgZnJvbSBXaW4zMiBwcm9ncmFtcyAod2UgbmVlZCBhIDE2LWJpdCBETEwKLSAgICAgKiBmb3IgdGhpcywgYW5kIFdpbmRvd3MgOXggYmVjb21lcyB2ZXJ5IHVuc3RhYmxlIGlmIHlvdSBmcmVlIHRoZQotICAgICAqIG1lbW9yeSBibG9ja3Mgb3V0IG9mIG9yZGVyKS4KLSAgICAgKi8KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaWYgKCFWRVNBQnVmX3B0cikgewotCUNIRUNLX0ZPUl9QTUhFTFAoKTsKLQlpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUVkVTQUJVRjMyLCBOVUxMLCAwLAotCQlvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKSB7Ci0JICAgIGlmICghb3V0QnVmWzBdKQotCQlyZXR1cm4gTlVMTDsKLQkgICAgVkVTQUJ1Zl9wdHIgPSAodm9pZCopb3V0QnVmWzBdOwotCSAgICBWRVNBQnVmX2xlbiA9IG91dEJ1ZlsxXTsKLQkgICAgVkVTQUJ1Zl9yc2VnID0gb3V0QnVmWzJdOwotCSAgICBWRVNBQnVmX3JvZmYgPSBvdXRCdWZbM107Ci0JICAgIH0KLQl9Ci0gICAgKmxlbiA9IFZFU0FCdWZfbGVuOwotICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOwotICAgIHJldHVybiBWRVNBQnVmX3B0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVjayBpZiBhIGtleSBoYXMgYmVlbiBwcmVzc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIC8qIE5vdCB1c2VkIGluIFdpbmRvd3MgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XYWl0IGZvciBhbmQgcmV0dXJuIHRoZSBuZXh0IGtleXByZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIC8qIE5vdCB1c2VkIGluIFdpbmRvd3MgKi8KLSAgICByZXR1cm4gMHhEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgbG9jYXRpb24gb2YgdGhlIE9TIGNvbnNvbGUgY3Vyc29yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbigKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGZvciBXaW5kb3dzICovCi0gICAgKHZvaWQpeDsKLSAgICAodm9pZCl5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFdpbmRvd3MgKi8KLSAgICAodm9pZCl3aWR0aDsKLSAgICAodm9pZCloZWlnaHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKLSAgICBQTV9pbnRIYW5kbGVyIGloLAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogV2UgZG8gbm90IHN1cHBvcnQgdGhpcyBmcm9tIFdpbjMyIHByb2dyYW1zLiBSYXRoZXIgdGhlIFZ4RCBoYW5kbGVzCi0gICAgICogdGhpcyBzdHVmZiBpdCB3aWxsIHRha2UgY2FyZSBvZiBob29raW5nIHRoZSBzdGVyZW8gZmxpcCBmdW5jdGlvbnMgYXQKLSAgICAgKiB0aGUgVnhEIGxldmVsLgotICAgICAqLwotICAgICh2b2lkKWloOwotICAgICh2b2lkKWZyZXF1ZW5jeTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgZnJlcXVlbmN5IChmb3Igc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIHVuZGVyIFdpbjMyICovCi0gICAgKHZvaWQpZnJlcXVlbmN5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCB1bmRlciBXaW4zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIHBhdGggb3Igd29ya2luZyBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1RdWVyeSBhIHN0cmluZyBmcm9tIHRoZSByZWdpc3RyeSAoZXh0ZW5kZWQgdmVyc2lvbikuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIFJFR19xdWVyeVN0cmluZ0V4KAotICAgIEhLRVkgaEtleSwKLSAgICBjb25zdCBjaGFyICpzelZhbHVlLAotICAgIGNoYXIgKnZhbHVlLAotICAgIHVsb25nIHNpemUpCi17Ci0gICAgRFdPUkQgICB0eXBlOwotCi0gICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LChQQ0hBUilzelZhbHVlLChQRFdPUkQpTlVMTCwoUERXT1JEKSZ0eXBlLChMUEJZVEUpdmFsdWUsKFBEV09SRCkmc2l6ZSkgPT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUXVlcnkgYSBzdHJpbmcgZnJvbSB0aGUgcmVnaXN0cnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIFJFR19xdWVyeVN0cmluZygKLSAgICBjb25zdCBjaGFyICpzektleSwKLSAgICBjb25zdCBjaGFyICpzelZhbHVlLAotICAgIGNoYXIgKnZhbHVlLAotICAgIERXT1JEIHNpemUpCi17Ci0gICAgSEtFWSAgICBoS2V5OwotICAgIGlib29sICAgc3RhdHVzID0gZmFsc2U7Ci0KLSAgICBtZW1zZXQodmFsdWUsMCxzaXplb2YodmFsdWUpKTsKLSAgICBpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsc3pLZXksJmhLZXkpID09IEVSUk9SX1NVQ0NFU1MpIHsKLQlzdGF0dXMgPSBSRUdfcXVlcnlTdHJpbmdFeChoS2V5LHN6VmFsdWUsdmFsdWUsc2l6ZSk7Ci0JUmVnQ2xvc2VLZXkoaEtleSk7Ci0JfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBkcml2ZSBsZXR0ZXIgZm9yIHRoZSBib290IGRyaXZlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIEdldFN5c3RlbURpcmVjdG9yeShwYXRoLHNpemVvZihwYXRoKSk7Ci0gICAgcmV0dXJuIHBhdGhbMF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBWQkUvQUYgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsKLSAgICByZXR1cm4gImM6XFwiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIGNoYXIgICAgICAgICplbnY7Ci0KLSAgICBpZiAoKGVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIikpICE9IE5VTEwpCi0JcmV0dXJuIGVudjsKLSAgICBHZXRTeXN0ZW1EaXJlY3RvcnkocGF0aCxzaXplb2YocGF0aCkpOwotICAgIHN0cmNhdChwYXRoLCJcXG51Y2xldXMiKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgY29uZmlndXJhdGlvbiBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1hY2hpbmUgaWYgcG9zc2libGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2V0IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHRoZSBuZXR3b3JrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIG5hbWVbMjU2XTsKLQotICAgIGlmIChSRUdfcXVlcnlTdHJpbmcoc3pNYWNoaW5lTmFtZUtleSxzek1hY2hpbmVOYW1lLG5hbWUsc2l6ZW9mKG5hbWUpKSkKLQlyZXR1cm4gbmFtZTsKLSAgICBpZiAoUkVHX3F1ZXJ5U3RyaW5nKHN6TWFjaGluZU5hbWVLZXlOVCxzek1hY2hpbmVOYW1lLG5hbWUsc2l6ZW9mKG5hbWUpKSkKLQlyZXR1cm4gbmFtZTsKLSAgICByZXR1cm4gIlVua25vd24iOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgbW9kZSBCSU9TIGRhdGEgYXJlYS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2hhdmVXaW5OVCkgewotCS8qIE9uIFdpbmRvd3MgTlQgd2UgaGF2ZSB0byBtYXAgaXQgcGh5c2ljYWxseSBkaXJlY3RseSAqLwotCSAgICByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4NDAwLCAweDEwMDAsIHRydWUpOwotCX0KLSAgICBlbHNlIHsKLQkvKiBGb3IgV2luZG93cyA5eCB3ZSBjYW4gYWNjZXNzIHRoaXMgbWVtb3J5IGRpcmVjdGx5ICovCi0JcmV0dXJuICh2b2lkKikweDQwMDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byAweEEwMDAwIHBoeXNpY2FsIFZHQSBncmFwaGljcyBmcmFtZWJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9oYXZlV2luTlQpIHsKLQkvKiBPbiBXaW5kb3dzIE5UIHdlIGhhdmUgdG8gbWFwIGl0IHBoeXNpY2FsbHkgZGlyZWN0bHkgKi8KLQkgICAgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLCAweDBGRkZGLCBmYWxzZSk7Ci0JfQotICAgIGVsc2UgewotCS8qIEFsd2F5cyB1c2UgdGhlIDB4QTAwMDAgbGluZWFyIGFkZHJlc3Mgc28gdGhhdCB3ZSB3aWxsIHVzZQotCSAqIHdoYXRldmVyIHBhZ2UgdGFibGUgbWFwcGluZ3MgYXJlIHNldCB1cCBmb3IgdXMgKGllOiBmb3IgdmlydHVhbAotCSAqIGJhbmsgc3dpdGNoaW5nLgotCSAqLwotCXJldHVybiAodm9pZCopMHhBMDAwMDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIERXT1JEICAgaW5CdWZbM107ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gYmFzZTsKLSAgICBpbkJ1ZlsxXSA9IGxpbWl0OwotICAgIGluQnVmWzJdID0gaXNDYWNoZWQ7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9NQVBQSFlTMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiAodm9pZCopb3V0QnVmWzBdOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcHRyLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIC8qIFdlIG5ldmVyIGZyZWUgdGhlIG1hcHBpbmdzIHVuZGVyIFdpbjMyICh0aGUgVnhEIHRyYWNrcyB0aGVtIGFuZAotICAgICAqIHJlaXNzdWVzIHRoZSBzYW1lIG1hcHBpbmdzIHVudGlsIHRoZSBzeXN0ZW0gaXMgcmVib290ZWQpLgotICAgICAqLwotICAgICh2b2lkKXB0cjsKLSAgICAodm9pZClsaW1pdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUUEhZU0lDQUxBRERSMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSgKLSAgICB2b2lkICpwLAotICAgIHVsb25nIGxlbmd0aCwKLSAgICB1bG9uZyAqcGh5c0FkZHJlc3MpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlszXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKLSAgICBpbkJ1ZlsxXSA9ICh1bG9uZylsZW5ndGg7Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpcGh5c0FkZHJlc3M7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRQSFlTSUNBTEFERFJSQU5HRTMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2xlZXAoCi0gICAgdWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIFNsZWVwKG1pbGxpc2Vjb25kcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBiYXNlIEkvTyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIENPTSBwb3J0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JY2FzZSAyOiByZXR1cm4gMHgzRTg7Ci0JY2FzZSAzOiByZXR1cm4gMHgyRTg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYmFzZSBJL08gcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBMUFQgcG9ydC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuIEZvciBXaW45eCB3ZSBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5Ci1hcyBsb2NrZWQsIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55IG1lbW9yeSBjb250ZXh0Ci0oaW5jbHVkaW5nIGludGVycnVwdCB0aW1lIGNvbnRleHQpLCB3aGljaCBhbGxvd3MgdXMgdG8gbG9hZCBvdXIgaW1wb3J0YW50Ci1kYXRhIHN0cnVjdHVyZSBhbmQgY29kZSBzdWNoIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseSBmcm9tIGEgcmluZwotMCBpbnRlcnJ1cHQgY29udGV4dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKAotICAgIGxvbmcgc2l6ZSkKLXsKLSAgICBEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGluQnVmWzBdID0gc2l6ZTsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX01BTExPQ1NIQVJFRDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gKHZvaWQqKW91dEJ1ZlswXTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQoCi0gICAgdm9pZCAqcHRyKQotewotICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLQotICAgIGluQnVmWzBdID0gKHVsb25nKXB0cjsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRlJFRVNIQVJFRDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIHRvIHRoZSBjYWxsaW5nIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gVGhlCi1hZGRyZXNzIHdpbGwgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiBhbm90aGVyIHByb2Nlc3MgdXNpbmcgdGhlCi1QTV9tYXBQaHlzaWNhbEFkZHIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2VzcygKLSAgICB2b2lkICpiYXNlLAotICAgIHVsb25nIGxpbWl0KQotewotICAgICh2b2lkKWJhc2U7Ci0gICAgKHZvaWQpbGltaXQ7Ci0gICAgcmV0dXJuIGJhc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcmVhbCBtb2RlIHBvaW50ZXIgdG8gYSBwcm90ZWN0ZWQgbW9kZSBwb2ludGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcigKLSAgICB1aW50IHJfc2VnLAotICAgIHVpbnQgcl9vZmYpCi17Ci0gICAgcmV0dXJuICh2b2lkKikoTUtfUEhZUyhyX3NlZyxyX29mZikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCi0gICAgdWludCBzaXplLAotICAgIHVpbnQgKnJfc2VnLAotICAgIHVpbnQgKnJfb2ZmKQotewotICAgIC8qIFdlIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcgcmVhbCBtb2RlIG1lbW9yeSBidWZmZXJzCi0gICAgICogZnJvbSBXaW4zMiBwcm9ncmFtcyAod2UgbmVlZCBhIDE2LWJpdCBETEwgZm9yIHRoaXMsIGFuZCBXaW5kb3dzCi0gICAgICogOXggYmVjb21lcyB2ZXJ5IHVuc3RhYmxlIGlmIHlvdSBmcmVlIHRoZSBtZW1vcnkgYmxvY2tzIG91dCBvZiBvcmRlcikuCi0gICAgICovCi0gICAgKHZvaWQpc2l6ZTsKLSAgICAodm9pZClyX3NlZzsKLSAgICAodm9pZClyX29mZjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKAotICAgIHZvaWQgKm1lbSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIFdpbmRvd3MgKi8KLSAgICAodm9pZCltZW07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0IChwYXJhbWV0ZXJzIGluIERQTUkgY29tcGF0aWJsZSBzdHJ1Y3R1cmUpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBEUE1JX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsyXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IGludG5vOwotICAgIGluQnVmWzFdID0gKHVsb25nKXJlZ3M7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0RQTUlJTlQ4NjMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQlOVUxMLCAwLCAmY291bnQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlszXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBpbnRubzsKLSAgICBpbkJ1ZlsxXSA9ICh1bG9uZylpbjsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZylvdXQ7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9JTlQ4NjMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIERXT1JEICAgaW5CdWZbNF07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gaW50bm87Ci0gICAgaW5CdWZbMV0gPSAodWxvbmcpaW47Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpb3V0OwotICAgIGluQnVmWzNdID0gKHVsb25nKXNyZWdzOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfSU5UODZYMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBEV09SRCAgIGluQnVmWzRdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gc2VnOwotICAgIGluQnVmWzFdID0gb2ZmOwotICAgIGluQnVmWzJdID0gKHVsb25nKWluOwotICAgIGluQnVmWzNdID0gKHVsb25nKXNyZWdzOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9DQUxMUkVBTE1PREUzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JTlVMTCwgMCwgJmNvdW50LCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAotICAgIHVsb25nICpwaHlzaWNhbCwKLSAgICB1bG9uZyAqdG90YWwpCi17Ci0gICAgLyogV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIHVuZGVyIFdpbjMyIGF0IHRoZSBtb21lbnQgKi8KLSAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgRFdPUkQgICBpbkJ1Zls0XTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBzaXplOwotICAgIGluQnVmWzFdID0gKHVsb25nKXBoeXNBZGRyOwotICAgIGluQnVmWzJdID0gKHVsb25nKWNvbnRpZ3VvdXM7Ci0gICAgaW5CdWZbM10gPSAodWxvbmcpYmVsb3cxNk07Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9BTExPQ0xPQ0tFRDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gKHZvaWQqKW91dEJ1ZlswXTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IHNpemUsCi0gICAgaWJvb2wgY29udGlndW91cykKLXsKLSAgICBEV09SRCAgIGluQnVmWzNdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gKHVsb25nKXA7Ci0gICAgaW5CdWZbMV0gPSBzaXplOwotICAgIGluQnVmWzJdID0gY29udGlndW91czsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRlJFRUxPQ0tFRDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQlOVUxMLCAwLCAmY291bnQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAotICAgIGlib29sIGxvY2tlZCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IGxvY2tlZDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0FMTE9DUEFHRTMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gKHZvaWQqKW91dEJ1ZlswXTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBhZ2UoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gKHVsb25nKXA7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0ZSRUVQQUdFMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCU5VTEwsIDAsICZjb3VudCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsyXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOwotICAgIGluQnVmWzFdID0gbGVuOwotICAgIGluQnVmWzJdID0gKHVsb25nKWxoOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfTE9DS0RBVEFQQUdFUzMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGluQnVmWzBdID0gKHVsb25nKXA7Ci0gICAgaW5CdWZbMV0gPSBsZW47Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpbGg7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9VTkxPQ0tEQVRBUEFHRVMzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsyXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOwotICAgIGluQnVmWzFdID0gbGVuOwotICAgIGluQnVmWzJdID0gKHVsb25nKWxoOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfTE9DS0NPREVQQUdFUzMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsyXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOwotICAgIGluQnVmWzFdID0gbGVuOwotICAgIGluQnVmWzJdID0gKHVsb25nKWxoOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfVU5MT0NLQ09ERVBBR0VTMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCi0gICAgaW50IGJhbmspCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLnguYnggPSAweDAwMDA7Ci0gICAgcmVncy54LmR4ID0gYmFuazsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoCi0gICAgaW50IGJhbmspCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLnguYnggPSAweDAwMDA7Ci0gICAgcmVncy54LmR4ID0gYmFuazsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICByZWdzLnguYXggPSAweDRGMDU7Ci0gICAgcmVncy54LmJ4ID0gMHgwMDAxOwotICAgIHJlZ3MueC5keCA9IGJhbms7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydCgKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgd2FpdFZSVCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgcmVncy54LmF4ID0gMHg0RjA3OwotICAgIHJlZ3MueC5ieCA9IHdhaXRWUlQ7Ci0gICAgcmVncy54LmN4ID0geDsKLSAgICByZWdzLnguZHggPSB5OwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBtZW1vcnkgcmVnaW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxlbmd0aCwKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlszXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBiYXNlOwotICAgIGluQnVmWzFdID0gbGVuZ3RoOwotICAgIGluQnVmWzJdID0gdHlwZTsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0VOQUJMRUxGQkNPTUIzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2V0IHRoZSBwYWdlIGRpcmVjdG9yeSBiYXNlIHJlZ2lzdGVyIHZhbHVlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgX1BNX2dldFBEQih2b2lkKQotewotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVFBEQjMyLCBOVUxMLCAwLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmx1c2ggdGhlIHRyYW5zbGF0aW9uIGxvb2thc2lkZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mbHVzaFRMQih2b2lkKQotewotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9GTFVTSFRMQjMyLCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgLyogVGhpcyBpcyBuZXZlciBkb25lIGJ5IFdpbjMyIHByb2dyYW1zLCBidXQgcmF0aGVyIGRvbmUgYnkgdGhlIFZ4RAotICAgICAqIHdoZW4gdGhlIHN5c3RlbSBib290cy4KLSAgICAgKi8KLSAgICAodm9pZClheFZhbDsKLSAgICAodm9pZClCSU9TUGh5c0FkZHI7Ci0gICAgKHZvaWQpbWFwcGVkQklPUzsKLSAgICAodm9pZClCSU9TTGVuOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2FkIGFuIE9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJ5IG9yIERMTC4gSWYgdGhlIE9TIGRvZXMgbm90IHN1cHBvcnQKLXNoYXJlZCBsaWJyYXJpZXMsIHNpbXBseSByZXR1cm4gTlVMTC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIHJldHVybiAoUE1fTU9EVUxFKUxvYWRMaWJyYXJ5KHN6RExMTmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2V0IHRoZSBhZGRyZXNzIG9mIGEgbmFtZWQgcHJvY2VkdXJlIGZyb20gYSBzaGFyZWQgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICByZXR1cm4gKHZvaWQqKUdldFByb2NBZGRyZXNzKChISU5TVEFOQ0UpaE1vZHVsZSxzelByb2NOYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvYWQgYSBzaGFyZWQgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgIEZyZWVMaWJyYXJ5KChISU5TVEFOQ0UpaE1vZHVsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW50ZXJuYWwgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgZmluZCBkYXRhIHRvIHRoZSBnZW5lcmljIGludGVyZmFjZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb252ZXJ0RmluZERhdGEoCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhLAotICAgIFdJTjMyX0ZJTkRfREFUQSAqYmxrKQotewotICAgIHVsb25nICAgZHdTaXplID0gZmluZERhdGEtPmR3U2l6ZTsKLQotICAgIG1lbXNldChmaW5kRGF0YSwwLGZpbmREYXRhLT5kd1NpemUpOwotICAgIGZpbmREYXRhLT5kd1NpemUgPSBkd1NpemU7Ci0gICAgaWYgKGJsay0+ZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9SRUFET05MWTsKLSAgICBpZiAoYmxrLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ESVJFQ1RPUlk7Ci0gICAgaWYgKGJsay0+ZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0FSQ0hJVkUpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0FSQ0hJVkU7Ci0gICAgaWYgKGJsay0+ZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0hJRERFTikKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfSElEREVOOwotICAgIGlmIChibGstPmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9TWVNURU0pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1NZU1RFTTsKLSAgICBmaW5kRGF0YS0+c2l6ZUxvID0gYmxrLT5uRmlsZVNpemVMb3c7Ci0gICAgZmluZERhdGEtPnNpemVIaSA9IGJsay0+bkZpbGVTaXplSGlnaDsKLSAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+Y0ZpbGVOYW1lLFBNX01BWF9QQVRIKTsKLSAgICBmaW5kRGF0YS0+bmFtZVtQTV9NQVhfUEFUSC0xXSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICpQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBXSU4zMl9GSU5EX0RBVEEgYmxrOwotICAgIEhBTkRMRSAgICAgICAgICBoZmlsZTsKLQotICAgIGlmICgoaGZpbGUgPSBGaW5kRmlyc3RGaWxlKGZpbGVuYW1lLCZibGspKSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSwmYmxrKTsKLQlyZXR1cm4gKHZvaWQqKWhmaWxlOwotCX0KLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBXSU4zMl9GSU5EX0RBVEEgYmxrOwotCi0gICAgaWYgKEZpbmROZXh0RmlsZSgoSEFORExFKWhhbmRsZSwmYmxrKSkgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSwmYmxrKTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgRmluZENsb3NlKChIQU5ETEUpaGFuZGxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICBjaGFyICAgIGJ1Zls1XTsKLSAgICBpbnQgICAgIHR5cGU7Ci0KLSAgICBzcHJpbnRmKGJ1ZiwiJWM6XFwiLCBkcml2ZSk7Ci0gICAgcmV0dXJuICgodHlwZSA9IEdldERyaXZlVHlwZShidWYpKSAhPSAwICYmIHR5cGUgIT0gMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgIC8qIE5UIHN0b3JlcyB0aGUgY3VycmVudCBkaXJlY3RvcnkgZm9yIGRyaXZlIE4gaW4gdGhlIG1hZ2ljIGVudmlyb25tZW50ICovCi0gICAgLyogdmFyaWFibGUgPU46IHNvIHdlIHNpbXBseSBsb29rIGZvciB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlLiAqLwotICAgIGNoYXIgZW52bmFtZVs0XTsKLQotICAgIGVudm5hbWVbMF0gPSAnPSc7Ci0gICAgZW52bmFtZVsxXSA9IGRyaXZlIC0gMSArICdBJzsKLSAgICBlbnZuYW1lWzJdID0gJzonOwotICAgIGVudm5hbWVbM10gPSAnXDAnOwotICAgIGlmIChHZXRFbnZpcm9ubWVudFZhcmlhYmxlKGVudm5hbWUsZGlyLGxlbikgPT0gMCkgewotCS8qIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBvciB0aGUgZHJpdmUgaGFzIG5vdCBiZWVuIHNldCB5ZXQsIHNvICovCi0JLyogc2ltcGx5IHNldCBpdCB0byB0aGUgcm9vdC4gKi8KLQlkaXJbMF0gPSBlbnZuYW1lWzFdOwotCWRpclsxXSA9ICc6JzsKLQlkaXJbMl0gPSAnXFwnOwotCWRpclszXSA9ICdcMCc7Ci0JU2V0RW52aXJvbm1lbnRWYXJpYWJsZShlbnZuYW1lLGRpcik7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICBEV09SRCBhdHRyID0gMDsKLQotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfQVJDSElWRSkKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX0FSQ0hJVkU7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfSElEREVOKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1NZU1RFTTsKLSAgICBTZXRGaWxlQXR0cmlidXRlcygoTFBTVFIpZmlsZW5hbWUsIGF0dHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBEV09SRCAgIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlcyhmaWxlbmFtZSk7Ci0gICAgdWludCAgICBhdHRyaWIgPSAwOwotCi0gICAgaWYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkKLQlhdHRyaWIgfD0gUE1fRklMRV9SRUFET05MWTsKLSAgICBpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX0FSQ0hJVkUpCi0JYXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX0hJRERFTikKLQlhdHRyaWIgfD0gUE1fRklMRV9ISURERU47Ci0gICAgaWYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9TWVNURU0pCi0JYXR0cmliIHw9IFBNX0ZJTEVfU1lTVEVNOwotICAgIHJldHVybiBhdHRyaWI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX21rZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBDcmVhdGVEaXJlY3RvcnkoZmlsZW5hbWUsTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBSZW1vdmVEaXJlY3RvcnkoZmlsZW5hbWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgSEZJTEUgICAgICAgZjsKLSAgICBPRlNUUlVDVCAgICBvZjsKLSAgICBGSUxFVElNRSAgICB1dGNUaW1lLGxvY2FsVGltZTsKLSAgICBTWVNURU1USU1FICBzeXNUaW1lOwotICAgIGlib29sICAgICAgIHN0YXR1cyA9IGZhbHNlOwotCi0gICAgb2YuY0J5dGVzID0gc2l6ZW9mKG9mKTsKLSAgICBpZiAoKGYgPSBPcGVuRmlsZShmaWxlbmFtZSwmb2YsT0ZfUkVBRCkpID09IEhGSUxFX0VSUk9SKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoIUdldEZpbGVUaW1lKChIQU5ETEUpZixOVUxMLE5VTEwsJnV0Y1RpbWUpKQotCWdvdG8gRXhpdDsKLSAgICBpZiAoIWdtVGltZSkgewotCWlmICghRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUoJnV0Y1RpbWUsJmxvY2FsVGltZSkpCi0JICAgIGdvdG8gRXhpdDsKLQl9Ci0gICAgZWxzZQotCWxvY2FsVGltZSA9IHV0Y1RpbWU7Ci0gICAgaWYgKCFGaWxlVGltZVRvU3lzdGVtVGltZSgmbG9jYWxUaW1lLCZzeXNUaW1lKSkKLQlnb3RvIEV4aXQ7Ci0gICAgdGltZS0+eWVhciA9IHN5c1RpbWUud1llYXI7Ci0gICAgdGltZS0+bW9uID0gc3lzVGltZS53TW9udGgtMTsKLSAgICB0aW1lLT5kYXkgPSBzeXNUaW1lLndZZWFyOwotICAgIHRpbWUtPmhvdXIgPSBzeXNUaW1lLndIb3VyOwotICAgIHRpbWUtPm1pbiA9IHN5c1RpbWUud01pbnV0ZTsKLSAgICB0aW1lLT5zZWMgPSBzeXNUaW1lLndTZWNvbmQ7Ci0gICAgc3RhdHVzID0gdHJ1ZTsKLQotRXhpdDoKLSAgICBDbG9zZUhhbmRsZSgoSEFORExFKWYpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICBIRklMRSAgICAgICBmOwotICAgIE9GU1RSVUNUICAgIG9mOwotICAgIEZJTEVUSU1FICAgIHV0Y1RpbWUsbG9jYWxUaW1lOwotICAgIFNZU1RFTVRJTUUgIHN5c1RpbWU7Ci0gICAgaWJvb2wgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0KLSAgICBvZi5jQnl0ZXMgPSBzaXplb2Yob2YpOwotICAgIGlmICgoZiA9IE9wZW5GaWxlKGZpbGVuYW1lLCZvZixPRl9XUklURSkpID09IEhGSUxFX0VSUk9SKQotCXJldHVybiBmYWxzZTsKLSAgICBzeXNUaW1lLndZZWFyID0gdGltZS0+eWVhcjsKLSAgICBzeXNUaW1lLndNb250aCA9IHRpbWUtPm1vbisxOwotICAgIHN5c1RpbWUud1llYXIgPSB0aW1lLT5kYXk7Ci0gICAgc3lzVGltZS53SG91ciA9IHRpbWUtPmhvdXI7Ci0gICAgc3lzVGltZS53TWludXRlID0gdGltZS0+bWluOwotICAgIHN5c1RpbWUud1NlY29uZCA9IHRpbWUtPnNlYzsKLSAgICBpZiAoIVN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZzeXNUaW1lLCZsb2NhbFRpbWUpKQotCWdvdG8gRXhpdDsKLSAgICBpZiAoIWdtVGltZSkgewotCWlmICghTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoJmxvY2FsVGltZSwmdXRjVGltZSkpCi0JICAgIGdvdG8gRXhpdDsKLQl9Ci0gICAgZWxzZQotCXV0Y1RpbWUgPSBsb2NhbFRpbWU7Ci0gICAgaWYgKCFTZXRGaWxlVGltZSgoSEFORExFKWYsTlVMTCxOVUxMLCZ1dGNUaW1lKSkKLQlnb3RvIEV4aXQ7Ci0gICAgc3RhdHVzID0gdHJ1ZTsKLQotRXhpdDoKLSAgICBDbG9zZUhhbmRsZSgoSEFORExFKWYpOwotICAgIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0OTFjZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCgKLSAgICB1bG9uZyBiYXNlQWRkciwKLSAgICBpbnQgYmFua1NpemUsCi0gICAgaW50IGNvZGVMZW4sCi0gICAgdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgKHZvaWQpYmFzZUFkZHI7Ci0gICAgKHZvaWQpYmFua1NpemU7Ci0gICAgKHZvaWQpY29kZUxlbjsKLSAgICAodm9pZCliYW5rRnVuYzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTkwMWE0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIENQVV9sYXJnZUludGVnZXIgY291bnRGcmVxOwotc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlcjsKLXN0YXRpYyB1bG9uZyAgICAgICAgICAgIHN0YXJ0LGZpbmlzaDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotI2lmZGVmICBOT19BU1NFTUJMRVIKLSAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gZmFsc2U7Ci0jZWxzZQotICAgIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIgPSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KChMQVJHRV9JTlRFR0VSKikmY291bnRGcmVxKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT24oCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpCi0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZ0bS0+c3RhcnQpOwotICAgIGVsc2UKLQl0bS0+c3RhcnQubG93ID0gdGltZUdldFRpbWUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtTGFwLHRtQ291bnQ7Ci0KLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikgewotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmdG1MYXApOwotCV9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bUxhcCwmdG1Db3VudCk7Ci0JcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOwotCX0KLSAgICBlbHNlIHsKLQl0bUxhcC5sb3cgPSB0aW1lR2V0VGltZSgpOwotCXJldHVybiAodG1MYXAubG93IC0gdG0tPnN0YXJ0LmxvdykgKiAxMDAwTDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RvcCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fTFpUaW1lck9mZigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtLT5lbmQpOwotICAgIGVsc2UKLQl0bS0+ZW5kLmxvdyA9IHRpbWVHZXRUaW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgdGltaW5ncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUNvdW50OwotCi0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpIHsKLQlfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7Ci0JcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOwotCX0KLSAgICBlbHNlCi0JcmV0dXJuICh0bS0+ZW5kLmxvdyAtIHRtLT5zdGFydC5sb3cpICogMTAwMEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQoteyByZXR1cm4gdGltZUdldFRpbWUoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKLXdoZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bwotYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcwotcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS94MTEvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0YmZhYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS94MTEvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBVbml4IC8gWDExCi0qCi0qIERlc2NyaXB0aW9uOiAgWDExIGV2ZW50IHF1ZXVlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgTUdMLgotKiAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgYm90aCBmb3Igd2luZG93ZWQgYW5kIGZ1bGxzY3JlZW4gKERHQSkgbW9kZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdXNob3J0ICAgICAgIGtleVVwTXNnWzI1Nl0gPSB7MH07LyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLwotc3RhdGljIGludCAgICAgICAgICByYW5nZVgscmFuZ2VZOyAgICAgIC8qIFJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzICAgKi8KLQotc3RhdGljIERpc3BsYXkgICpfRVZUX2RweTsKLXN0YXRpYyBXaW5kb3cgICAgX0VWVF93aW47Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGtleWNvZGU7Ci0gIGludCBzY2FuY29kZTsKLX0geGtleW1hcDsKLQoteGtleW1hcCB4a2V5bWFwc1tdID0gewotICB7IDksIEtCX2VzY30sCi0gIHsyNCwgS0JfUX0sCi0gIHsyNSwgS0JfV30sCi0gIHsyNiwgS0JfRX0sCi0gIHsyNywgS0JfUn0sCi0gIHsyOCwgS0JfVH0sCi0gIHsyOSwgS0JfWX0sCi0gIHszMCwgS0JfVX0sCi0gIHszMSwgS0JfSX0sCi0gIHszMiwgS0JfT30sCi0gIHszMywgS0JfUH0sCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgbm9uLURPUyBzeXN0ZW1zICovCi0jZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKLSNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKLQotUkVNQVJLUzoKLVRoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCi10aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17Ci0gIHN0YXRpYyB1bnNpZ25lZCBzdGFydHRpbWUgPSAwOwotICBzdHJ1Y3QgdGltZXZhbCB0OwotCi0gIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0gIGlmIChzdGFydHRpbWUgPT0gMCkKLSAgICBzdGFydHRpbWUgPSB0LnR2X3NlYyAqIDEwMDAgKyAodC50dl91c2VjLzEwMDApOwotICByZXR1cm4gKCh0LnR2X3NlYyAqIDEwMDAgKyAodC50dl91c2VjLzEwMDApKSAtIHN0YXJ0dGltZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0U2NhbmNvZGUoaW50IGtleWNvZGUpCi17Ci0gIHJldHVybiBrZXljb2RlLTg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBhcHBsaWNhdGlvbiBtZXNzYWdlIHF1ZXVlIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBYMTFfQ09SRQotc3RhdGljIHZvaWQgX0VWVF9wdW1wWDExTWVzc2FnZXModm9pZCkKLSNlbHNlCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotI2VuZGlmCi17Ci0gIC8qIFRPRE86IFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gcmVhZCBhbGwga2V5Ym9hcmQgYW5kIG1vdXNlICovCi0gIC8qICAgICAgICAgZXZlbnRzIGZyb20gdGhlIE9TIHNwZWNpZmljIGV2ZW50IHF1ZXVlLCB0cmFuc2xhdGUgdGhlbSBhbmQgcG9zdCAqLwotICAvKiAgICAgICAgIHRoZW0gaW50byB0aGUgU2NpVGVjaCBldmVudCBxdWV1ZS4gKi8KLSAgZXZlbnRfdCBldnQ7Ci0gIFhFdmVudCAgZXY7Ci0gIHN0YXRpYyBpbnQgb2xkX214ID0gMCwgb2xkX215ID0gMCwgYnV0cyA9IDAsIGM7Ci0gIGNoYXIgYnVmWzJdOwotCi0gIHdoaWxlIChYUGVuZGluZyhfRVZUX2RweSkgJiYgWE5leHRFdmVudChfRVZUX2RweSwmZXYpKSB7Ci0gICAgZXZ0LndoZW4gPSBfTUdMX2dldFRpY2tzKCk7Ci0KLSAgICBzd2l0Y2goZXYudHlwZSl7Ci0gICAgY2FzZSBLZXlQcmVzczoKLSAgICAgIGMgPSBnZXRTY2FuY29kZShldi54a2V5LmtleWNvZGUpOwotICAgICAgZXZ0LndoYXQgPSBFVlRfS0VZRE9XTjsKLSAgICAgIGV2dC5tZXNzYWdlID0gYyA8PCA4OwotICAgICAgWExvb2t1cFN0cmluZygmZXYueGtleSwgYnVmLCAyLCBOVUxMLCBOVUxMKTsKLSAgICAgIGV2dC5tZXNzYWdlIHw9IGJ1ZlswXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgS2V5UmVsZWFzZToKLSAgICAgIGMgPSBnZXRTY2FuY29kZShldi54a2V5LmtleWNvZGUpOwotICAgICAgZXZ0LndoYXQgPSBFVlRfS0VZVVA7Ci0gICAgICBldnQubWVzc2FnZSA9IGtleVVwTXNnW2NdOwotICAgICAgaWYoY291bnQgPCBFVkVOVFFTSVpFKQotCWFkZEV2ZW50KCZldnQpOwotICAgICAga2V5VXBNc2dbY10gPSAwOwotICAgICAgcmVwZWF0S2V5W2NdID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQnV0dG9uUHJlc3M6Ci0gICAgICBldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0gICAgICBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAxKXsKLQlidXRzIHw9IEVWVF9MRUZUQlVUOwotCWV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLSAgICAgIH1lbHNlIGlmKGV2LnhidXR0b24uYnV0dG9uID09IDIpewotCWJ1dHMgfD0gRVZUX01JRERMRUJVVDsKLQlldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKLSAgICAgIH1lbHNlIGlmKGV2LnhidXR0b24uYnV0dG9uID09IDMpewotCWJ1dHMgfD0gRVZUX1JJR0hUQlVUOwotCWV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0gICAgICB9Ci0gICAgICBldnQubW9kaWZpZXJzID0gbW9kaWZpZXJzIHwgYnV0czsKLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCdXR0b25SZWxlYXNlOgotICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLSAgICAgIGlmKGV2LnhidXR0b24uYnV0dG9uID09IDEpewotCWJ1dHMgJj0gfkVWVF9MRUZUQlVUOwotCWV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLSAgICAgIH1lbHNlIGlmKGV2LnhidXR0b24uYnV0dG9uID09IDIpewotCWJ1dHMgJj0gfkVWVF9NSURETEVCVVQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7Ci0gICAgICB9ZWxzZSBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAzKXsKLQlidXRzICY9IH5FVlRfUklHSFRCVVQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLSAgICAgIH0KLSAgICAgIGV2dC5tb2RpZmllcnMgPSBtb2RpZmllcnMgfCBidXRzOwotCi0gICAgICBicmVhazsKLSAgICBjYXNlIE1vdGlvbk5vdGlmeToKLSAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLSAgICAgIGV2dC53aGVyZV94ID0gZXYueG1vdGlvbi54OwotICAgICAgZXZ0LndoZXJlX3kgPSBldi54bW90aW9uLnk7Ci0gICAgICBldnQucmVsYXRpdmVfeCA9IGV2dC53aGVyZV94IC0gb2xkX214OwotICAgICAgZXZ0LnJlbGF0aXZlX3kgPSBldnQud2hlcmVfeSAtIG9sZF9teTsKLSAgICAgIG9sZF9teCA9IGV2dC53aGVyZV94OwotICAgICAgb2xkX215ID0gZXZ0LndoZXJlX3k7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGNvdW50IDwgRVZFTlRRU0laRSkKLSAgICAgIGFkZEV2ZW50KCZldnQpOwotICB9Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBYMTFfQ09SRQotdm9pZCBFVlRBUEkgRVZUX2luaXRYMTEoCi0jZWxzZQotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0jZW5kaWYKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICBpbnQgcmVzdWx0LCBpLGosazsKLSAgWERldmljZUluZm9QdHIgICAgbGlzdCxzbGlzdDsKLQotICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICBfbW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICBpbml0RXZlbnRRdWV1ZSgpOwotICBtZW1zZXQoa2V5VXBNc2csMCxzaXplb2Yoa2V5VXBNc2cpKTsKLQotCi0gIC8qIHF1ZXJ5IHNlcnZlciBmb3IgaW5wdXQgZXh0ZW5zaW9ucyAqLwotICByZXN1bHQgPVhRdWVyeUV4dGVuc2lvbihfRVZUX2RweSwiWElucHV0RXh0ZW5zaW9uIiwmaSwmaiwmayk7Ci0gIGlmKCFyZXN1bHQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiWW91ciBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IFhJbnB1dCBFeHRlbnNpb25zXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiWDExIEpveXN0aWNrIGRpc2FibGVkXG4iKTsKLSAgfQotICBsaXN0ID0gWExpc3RJbnB1dERldmljZXMoX0VWVF9kcHksJnJlc3VsdCk7Ci0gIGlmICghbGlzdCkgewotICAgIGZwcmludGYoc3RkZXJyLCJObyBleHRlbmRlZCBpbnB1dCBkZXZpY2VzIGZvdW5kICEhXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiWDExIEpveXN0aWNrIGRpc2FibGVkXG4iKTsKLSAgfQotCi0KLSAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOwotICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3Igbm9uIERPUyBzeXN0ZW1zICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0gICAgLyogVE9ETzogRG8gYW55IE9TIHNwZWNpZmljIGNsZWFudXAgaW4gaGVyZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU2V0cyB0aGUgY3VycmVudCBYMTEgZGlzcGxheQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3NldFgxMURpc3BsYXkoRGlzcGxheSAqZHB5LCBXaW5kb3cgd2luKQotewotICBfRVZUX2RweSA9IGRweTsKLSAgX0VWVF93aW4gPSB3aW47Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS94MTEvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3gxMS9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ3NDUxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3gxMS9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQmVPUwotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEva2V5c3ltLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hJLmg+Ci0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWElucHV0Lmg+Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3pfc2FtcGxlcy52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS96X3NhbXBsZXMudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZjODBmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3pfc2FtcGxlcy52cGoKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1bU2NpVGVjaF0NCi1jb21waWxlcj13YzEwLSANCi10YXJnZXRvcz1kMzIgDQotW0NPTVBJTEVSXQ0KLXZlcnNpb249NS4wYg0KLU1BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCi1hY3RpdmVjb25maWc9LGdldGNoLmV4ZQ0KLUZJTFRFUk5BTUU9U291cmNlIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIA0KLUZJTFRFUkFQUENPTU1BTkQ9XG4NCi12Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KLXZjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KLWNvbXBpbGU9Y29uY3VyfGNhcHR1cmV8OkNvbXBpbGU6JkNvbXBpbGUsZG1ha2UgJW4ub2JqDQotbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgJWINCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgLXUgJWINCi1kZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6RGVidWc6JkRlYnVnLHdkbiAlYg0KLWV4ZWN1dGU9aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6RXhlY3V0ZTpFJnhlY3V0ZSwNCi11c2VyMT1oaWRlfG5vY2hhbmdlZGlyfDpVc2VyIDE6VXNlciAxLA0KLXVzZXIyPWhpZGV8bm9jaGFuZ2VkaXJ8OlVzZXIgMjpVc2VyIDIsDQotdXNlcnRvb2xfYnVpbGRfYWxsPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVub25lfDpCdWlsZCBBbGw6QnVpbGQgQWxsLGRtYWtlIGFsbA0KLXVzZXJ0b29sX3JlYnVpbGRfYWxsPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVub25lfDpSZWJ1aWxkIEFsbDpSZWJ1aWxkIEFsbCxkbWFrZSAtdSBhbGwNCi11c2VydG9vbF9jbGVhbl9kaXJlY3Rvcnk9Y29uY3VyfGNhcHR1cmV8c2F2ZW5vbmV8OkNsZWFuIERpcmVjdG9yeTomQ2xlYW4gRGlyZWN0b3J5LGRtYWtlIGNsZWFuZXhlDQotd29ya2luZ2Rpcj0uDQotaW5jbHVkZWRpcnM9JShTQ0lURUNIKVxpbmNsdWRlOyUoUFJJVkFURSlcaW5jbHVkZQ0KLXJlZmZpbGU9DQotW0ZJTEVTXQ0KLXRlc3RzXGFsdGJyay5jDQotdGVzdHNcYWx0Y3JpdC5jDQotdGVzdHNcYmlvc3B0ci5jDQotdGVzdHNcYmxvY2suYw0KLXRlc3RzXGJyay5jDQotdGVzdHNcY2FsbHJlYWwuYw0KLXRlc3RzXGNoZWNrcy5jDQotdGVzdHNcY3B1LmMNCi10ZXN0c1xjcml0aWNhbC5jDQotdGVzdHNcZ2V0Y2guYw0KLXRlc3RzXGlzdmVzYS5jDQotdGVzdHNca2V5LmMNCi10ZXN0c1xrZXkxNS5jDQotdGVzdHNcbWVtdGVzdC5jDQotdGVzdHNcbW91c2UuYw0KLXRlc3RzXHJ0Yy5jDQotdGVzdHNcc2hvd3BjaS5jDQotdGVzdHNcdGljay5jDQotdGVzdHNcdGltZXJjLmMNCi10ZXN0c1x0aW1lcmNwcC5jcHANCi10ZXN0c1x1c3djLmMNCi10ZXN0c1x2ZnRlc3QuYw0KLXRlc3RzXHZpZGVvLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KLWNvbmZpZz0sYWx0YnJrLmV4ZQ0KLWNvbmZpZz0sYWx0Y3JpdC5leGUNCi1jb25maWc9LGJpb3NwdHIuZXhlDQotY29uZmlnPSxibG9jay5leGUNCi1jb25maWc9LGJyay5leGUNCi1jb25maWc9LGNhbGxyZWFsLmV4ZQ0KLWNvbmZpZz0sY3B1LmV4ZQ0KLWNvbmZpZz0sY3JpdGljYWwuZXhlDQotY29uZmlnPSxnZXRjaC5leGUNCi1jb25maWc9LGlzdmVzYS5leGUNCi1jb25maWc9LGtleS5leGUNCi1jb25maWc9LGtleTE1LmV4ZQ0KLWNvbmZpZz0sbWVtdGVzdC5leGUNCi1jb25maWc9LG1vdXNlLmV4ZQ0KLWNvbmZpZz0scnRjLmV4ZQ0KLWNvbmZpZz0sc2hvd3BjaS5leGUNCi1jb25maWc9LHRpY2suZXhlDQotY29uZmlnPSx0aW1lcmMuZXhlDQotY29uZmlnPSx0aW1lcmNwcC5leGUNCi1jb25maWc9LHVzd2MuZXhlDQotY29uZmlnPSx2ZnRlc3QuZXhlDQotY29uZmlnPSx2aWRlby5leGUNCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNmN2IxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgaGlnaCBwcmVjaXNpb24gdGltaW5nIG9uIGVhY2ggT1MuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAienRpbWVyLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgTFpUaW1lck9iamVjdCAgICBMWlRpbWVyOwotc3RhdGljIHVsb25nICAgICAgICAgICAgc3RhcnQsZmluaXNoOwotI2lmZGVmICBfX0lOVEVMX18KLXN0YXRpYyBsb25nICAgICAgICAgICAgIGNwdVNwZWVkID0gLTE7Ci1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0MgPSBmYWxzZTsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCBJbnRlbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCi0jaWZkZWYgIF9fSU5URUxfXwotLyoge3NlY3JldH0gKi8KLXZvaWQgIF9BU01BUEkgX0NQVV9yZWFkVGltZVN0YW1wKENQVV9sYXJnZUludGVnZXIgKnRpbWUpOwotLyoge3NlY3JldH0gKi8KLXVsb25nIF9BU01BUEkgX0NQVV9kaWZmVGltZTY0KENQVV9sYXJnZUludGVnZXIgKnQxLENQVV9sYXJnZUludGVnZXIgKnQyLENQVV9sYXJnZUludGVnZXIgKnQpOwotLyoge3NlY3JldH0gKi8KLXVsb25nIF9BU01BUEkgX0NQVV9jYWxjTWljcm9TZWMoQ1BVX2xhcmdlSW50ZWdlciAqY291bnQsdWxvbmcgZnJlcSk7Ci0jZW5kaWYKLQotI2lmICAgICBkZWZpbmVkKF9fU01YMzJfXykKLSNpbmNsdWRlICJzbXgvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19SVFRBUkdFVF9fKQotI2luY2x1ZGUgInJ0dGFyZ2V0L3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fUkVBTERPU19fKQotI2luY2x1ZGUgImRvcy96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotI2luY2x1ZGUgIm50ZHJ2L3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fV0lOMzJfVlhEX18pCi0jaW5jbHVkZSAidnhkL3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XUzMyX18pCi0jaW5jbHVkZSAid2luMzIvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfVkREX18pCi0jaW5jbHVkZSAidmRkL3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX18pCi0jaW5jbHVkZSAib3MyL3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykKLSNpbmNsdWRlICJsaW51eC96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX1FOWF9fKQotI2luY2x1ZGUgInFueC96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX0JFT1NfXykKLSNpbmNsdWRlICJiZW9zL3p0aW1lci5jIgotI2Vsc2UKLSNlcnJvciAgVGltZXIgbGlicmFyeSBub3QgcG9ydGVkIHRvIHRoaXMgcGxhdGZvcm0geWV0IQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBpbnRlcmZhY2Ugcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUluaXRpYWxpemVzIHRoZSBaZW4gVGltZXIgbGlicmFyeSAoZXh0ZW5kZWQpCi0KLVBBUkFNRVRFUlM6Ci1hY2N1cmF0ZSAgICAtIFRydWUgb2YgdGhlIHNwZWVkIHNob3VsZCBiZSBtZWFzdXJlZCBhY2N1cmF0ZWx5Ci0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBaZW4gVGltZXIgbGlicmFyeSwgYW5kIC9tdXN0LyBiZSBjYWxsZWQgYmVmb3JlCi1hbnkgb2YgdGhlIHJlbWFpbmluZyBaZW4gVGltZXIgbGlicmFyeSBmdW5jdGlvbnMgYXJlIGNhbGxlZC4gVGhlIGFjY3VyYXRlCi1wYXJhbWV0ZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBoaWdobHkgYWNjdXJhdGUgdGltaW5nIHNob3VsZCBiZQotdXNlZCBvciBub3QuIElmIGhpZ2ggYWNjdXJhY3kgaXMgbmVlZGVkLCBtb3JlIHRpbWUgaXMgc3BlbnQgcHJvZmlsaW5nIHRoZQotYWN0dWFsIHNwZWVkIG9mIHRoZSBDUFUgc28gdGhhdCB3ZSBjYW4gb2J0YWluIGhpZ2hseSBhY2N1cmF0ZSB0aW1pbmcKLXJlc3VsdHMsIGJ1dCB0aGUgdGltZSBzcGVudCBpbiB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZSB3aWxsIGJlCi1zaWduaWZpY2FudGx5IGxvbmdlciAob24gdGhlIG9yZGVyIG9mIDUgc2Vjb25kcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIFpUaW1lckluaXRFeHQoCi0gICAgaWJvb2wgYWNjdXJhdGUpCi17Ci0gICAgaWYgKGNwdVNwZWVkID09IC0xKSB7Ci0JX19aVGltZXJJbml0KCk7Ci0jaWZkZWYgIF9fSU5URUxfXwotCWNwdVNwZWVkID0gQ1BVX2dldFByb2Nlc3NvclNwZWVkSW5IWihhY2N1cmF0ZSk7Ci0JaGF2ZVJEVFNDID0gQ1BVX2hhdmVSRFRTQygpICYmIChjcHVTcGVlZCA+IDApOwotI2VuZGlmCi0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Jbml0aWFsaXplcyB0aGUgWmVuIFRpbWVyIGxpYnJhcnkuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBaZW4gVGltZXIgbGlicmFyeSwgYW5kIC9tdXN0LyBiZSBjYWxsZWQgYmVmb3JlCi1hbnkgb2YgdGhlIHJlbWFpbmluZyBaZW4gVGltZXIgbGlicmFyeSBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgWlRpbWVySW5pdCh2b2lkKQotewotICAgIFpUaW1lckluaXRFeHQoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TdGFydHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUEFSQU1FVEVSUzoKLXRtICAtIFRpbWVyIG9iamVjdCB0byBzdGFydCB0aW1pbmcgd2l0aAotCi1SRU1BUktTOgotU3RhcnRzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuIE9uY2UgeW91IGhhdmUgc3RhcnRlZCB0aGUgdGltZXIsCi15b3UgY2FuIHN0b3AgaXQgd2l0aCBMWlRpbWVyT2ZmIG9yIHlvdSBjYW4gbGF0Y2ggdGhlIGN1cnJlbnQgY291bnQgd2l0aAotTFpUaW1lckxhcC4KLQotVGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciB1c2VzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBoaWdoIHByZWNpc2lvbiB0aW1pbmcKLW1lY2hhbmlzbXMgdG8gb2J0YWluIG1pY3Jvc2Vjb25kIGFjY3VyYXRlIHRpbWluZ3MgcmVzdWx0cyB3aGVuZXZlciBwb3NzaWJsZS4KLVRoZSBmb2xsb3dpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgYXJlIHVzZWQgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRpbmcKLXN5c3RlbSwgcnVudGltZSBlbnZpcm9ubWVudCBhbmQgQ1BVIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gSWYgdGhlIHRhcmdldAotc3lzdGVtIGhhcyBhIFBlbnRpdW0gQ1BVIGluc3RhbGxlZCB3aGljaCBzdXBwb3J0cyB0aGUgUmVhZCBUaW1lIFN0YW1wCi1Db3VudGVyIGluc3RydWN0aW9uIChSRFRTQyksIHRoZSBaZW4gVGltZXIgbGlicmFyeSB3aWxsIHVzZSB0aGlzIHRvCi1vYnRhaW4gdGhlIG1heGltdW0gdGltaW5nIHByZWNpc2lvbiBhdmFpbGFibGUuCi0KLVVuZGVyIDMyLWJpdCBXaW5kb3dzLCBpZiB0aGUgUGVudGl1bSBSRFRTQyBpbnN0cnVjdGlvbiBpcyBub3QgYXZhaWxhYmxlLCB3ZQotZmlyc3QgdHJ5IHRvIHVzZSB0aGUgV2luMzIgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIgQVBJLCBhbmQgaWYgdGhhdCBpcyBub3QKLWF2YWlsYWJsZSB3ZSBmYWxsIGJhY2sgb24gdGhlIHRpbWVHZXRUaW1lIEFQSSB3aGljaCBpcyBhbHdheXMgc3VwcG9ydGVkLgotCi1VbmRlciAzMi1iaXQgRE9TLCBpZiB0aGUgUGVudGl1bSBSRFRTQyBpbnN0cnVjdGlvbiBpcyBub3QgYXZhaWxhYmxlLCB3ZQotdGhlbiBkbyBhbGwgdGltaW5nIHVzaW5nIHRoZSBvbGQgc3R5bGUgODI1MyB0aW1lciBjaGlwLiBUaGUgODI1MyB0aW1lcgotcm91dGluZXMgcHJvdmlkZSBoaWdobHkgYWNjdXJhdGUgdGltaW5ncyByZXN1bHRzIGluIHB1cmUgRE9TIG1vZGUsIGhvd2V2ZXIKLWluIGEgRE9TIGJveCB1bmRlciBXaW5kb3dzIG9yIG90aGVyIE9wZXJhdGluZyBTeXN0ZW1zIHRoZSB2aXJ0dWFsaXphdGlvbgotb2YgdGhlIHRpbWVyIGNhbiBwcm9kdWNlIGluYWNjdXJhdGUgcmVzdWx0cy4KLQotTm90ZTogQmVjYXVzZSB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIHN0b3JlcyB0aGUgcmVzdWx0cyBpbiBhIDMyLWJpdAotICAgICAgdW5zaWduZWQgaW50ZWdlciwgeW91IGNhbiBvbmx5IHRpbWUgcGVyaW9kcyBvZiB1cCB0byAyXjMyIG1pY3Jvc2Vjb25kcywKLSAgICAgIG9yIGFib3V0IDFociAyMG1pbnMuIEZvciB0aW1pbmcgbG9uZ2VyIHBlcmlvZHMgdXNlIHRoZSBVbHRyYSBMb25nCi0gICAgICBQZXJpb2QgWmVuIFRpbWVyLgotCi1TRUUgQUxTTzoKLUxaVGltZXJPZmYsIExaVGltZXJMYXAsIExaVGltZXJDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBMWlRpbWVyT25FeHQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIGlmIChoYXZlUkRUU0MpIHsKLQlfQ1BVX3JlYWRUaW1lU3RhbXAoJnRtLT5zdGFydCk7Ci0JfQotICAgIGVsc2UKLSNlbmRpZgotCV9fTFpUaW1lck9uKHRtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBmb3IgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBhbmQga2VlcHMgaXQKLXJ1bm5pbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVBBUkFNRVRFUlM6Ci10bSAgLSBUaW1lciBvYmplY3QgdG8gZG8gbGFwIHRpbWluZyB3aXRoCi0KLVJFVFVSTlM6Ci1Db3VudCB0aGF0IGhhcyBlbGFwc2VkIGluIG1pY3Jvc2Vjb25kcy4KLQotUkVNQVJLUzoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgdGhhdCBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCi1MWlRpbWVyT24gaW4gbWljcm9zZWNvbmRzLiBUaGUgdGltZSBjb250aW51ZXMgdG8gcnVuIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMKLWNhbGxlZCBzbyB5b3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5LgotCi1TRUUgQUxTTzoKLUxaVGltZXJPbiwgTFpUaW1lck9mZiwgTFpUaW1lckNvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBMWlRpbWVyTGFwRXh0KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotI2lmZGVmICBfX0lOVEVMX18KLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtTGFwLHRtQ291bnQ7Ci0KLSAgICBpZiAoaGF2ZVJEVFNDKSB7Ci0JX0NQVV9yZWFkVGltZVN0YW1wKCZ0bUxhcCk7Ci0JX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtTGFwLCZ0bUNvdW50KTsKLQlyZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY3B1U3BlZWQpOwotCX0KLSAgICBlbHNlCi0jZW5kaWYKLQlyZXR1cm4gX19MWlRpbWVyTGFwKHRtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU3RvcHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUEFSQU1FVEVSUzoKLXRtICAtIFRpbWVyIG9iamVjdCB0byBzdG9wIHRpbWluZyB3aXRoCi0KLVJFTUFSS1M6Ci1TdG9wcyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nIGFuZCBsYXRjaGVzIHRoZSBjb3VudC4gT25jZSB5b3UKLWhhdmUgc3RvcHBlZCB0aGUgdGltZXIgeW91IGNhbiByZWFkIHRoZSBjb3VudCB3aXRoIExaVGltZXJDb3VudC4gSWYgeW91IG5lZWQKLWhpZ2hseSBhY2N1cmF0ZSB0aW1pbmcsIHlvdSBzaG91bGQgdXNlIHRoZSBvbiBhbmQgb2ZmIGZ1bmN0aW9ucyByYXRoZXIgdGhhbgotdGhlIGxhcCBmdW5jdGlvbiBzaW5jZSB0aGUgbGFwIGZ1bmN0aW9uIGRvZXMgbm90IHN1YnRyYWN0IHRoZSBvdmVyaGVhZCBvZgotdGhlIGZ1bmN0aW9uIGNhbGxzIGZyb20gdGhlIHRpbWVkIGNvdW50LgotCi1TRUUgQUxTTzoKLUxaVGltZXJPbiwgTFpUaW1lckxhcCwgTFpUaW1lckNvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIExaVGltZXJPZmZFeHQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIGlmIChoYXZlUkRUU0MpIHsKLQlfQ1BVX3JlYWRUaW1lU3RhbXAoJnRtLT5lbmQpOwotCX0KLSAgICBlbHNlCi0jZW5kaWYKLQlfX0xaVGltZXJPZmYodG0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1QQVJBTUVURVJTOgotdG0gIC0gVGltZXIgb2JqZWN0IHRvIGNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSB3aXRoLgotCi1SRVRVUk5TOgotQ291bnQgdGhhdCBoYXMgZWxhcHNlZCBpbiBtaWNyb3NlY29uZHMuCi0KLVJFTUFSS1M6Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IHRoYXQgaGFzIGVsYXBzZWQgYmV0d2VlbiBjYWxscyB0bwotTFpUaW1lck9uIGFuZCBMWlRpbWVyT2ZmIGluIG1pY3Jvc2Vjb25kcy4KLQotU0VFIEFMU086Ci1MWlRpbWVyT24sIExaVGltZXJPZmYsIExaVGltZXJMYXAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIExaVGltZXJDb3VudEV4dCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSNpZmRlZiAgX19JTlRFTF9fCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUNvdW50OwotCi0gICAgaWYgKGhhdmVSRFRTQykgewotCV9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bS0+ZW5kLCZ0bUNvdW50KTsKLQlyZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY3B1U3BlZWQpOwotCX0KLSAgICBlbHNlCi0jZW5kaWYKLQlyZXR1cm4gX19MWlRpbWVyQ291bnQodG0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TdGFydHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVNQVJLUzoKLU9ic29sZXRlIGZ1bmN0aW9uLiBZb3Ugc2hvdWxkIHVzZSB0aGUgTFpUaW1lck9uRXh0IGZ1bmN0aW9uIGluc3RlYWQKLXdoaWNoIGFsbG93cyBmb3IgbXVsdGlwbGUgdGltZXJzIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgTFpUaW1lck9uKHZvaWQpCi17IExaVGltZXJPbkV4dCgmTFpUaW1lcik7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBmb3IgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBhbmQga2VlcHMgaXQKLXJ1bm5pbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1Db3VudCB0aGF0IGhhcyBlbGFwc2VkIGluIG1pY3Jvc2Vjb25kcy4KLQotUkVNQVJLUzoKLU9ic29sZXRlIGZ1bmN0aW9uLiBZb3Ugc2hvdWxkIHVzZSB0aGUgTFpUaW1lckxhcEV4dCBmdW5jdGlvbiBpbnN0ZWFkCi13aGljaCBhbGxvd3MgZm9yIG11bHRpcGxlIHRpbWVycyBydW5uaW5nIGF0IHRoZSBzYW1lIHRpbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBMWlRpbWVyTGFwKHZvaWQpCi17IHJldHVybiBMWlRpbWVyTGFwRXh0KCZMWlRpbWVyKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TdG9wcyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRU1BUktTOgotT2Jzb2xldGUgZnVuY3Rpb24uIFlvdSBzaG91bGQgdXNlIHRoZSBMWlRpbWVyT2ZmRXh0IGZ1bmN0aW9uIGluc3RlYWQKLXdoaWNoIGFsbG93cyBmb3IgbXVsdGlwbGUgdGltZXJzIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgTFpUaW1lck9mZih2b2lkKQoteyBMWlRpbWVyT2ZmRXh0KCZMWlRpbWVyKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotQ291bnQgdGhhdCBoYXMgZWxhcHNlZCBpbiBtaWNyb3NlY29uZHMuCi0KLVJFTUFSS1M6Ci1PYnNvbGV0ZSBmdW5jdGlvbi4gWW91IHNob3VsZCB1c2UgdGhlIExaVGltZXJDb3VudEV4dCBmdW5jdGlvbiBpbnN0ZWFkCi13aGljaCBhbGxvd3MgZm9yIG11bHRpcGxlIHRpbWVycyBydW5uaW5nIGF0IHRoZSBzYW1lIHRpbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBMWlRpbWVyQ291bnQodm9pZCkKLXsgcmV0dXJuIExaVGltZXJDb3VudEV4dCgmTFpUaW1lcik7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU3RhcnRzIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFTUFSS1M6Ci1TdGFydHMgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4gT25jZSB5b3UgaGF2ZSBzdGFydGVkIHRoZQotdGltZXIsIHlvdSBjYW4gc3RvcCBpdCB3aXRoIFVMWlRpbWVyT2ZmIG9yIHlvdSBjYW4gbGF0Y2ggdGhlIGN1cnJlbnQgY291bnQKLXdpdGggVUxaVGltZXJMYXAuCi0KLVRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgdXNlcyB0aGUgYXZhaWxhYmxlIG9wZXJhdGluZyBzeXN0ZW0gc2VydmljZXMKLXRvIG9idGFpbiBhY2N1cmF0ZSB0aW1pbmdzIHJlc3VsdHMgd2l0aCBhcyBtdWNoIHByZWNpc2lvbiBhcyB0aGUgb3BlcmF0aW5nCi1zeXN0ZW0gcHJvdmlkZXMsIGJ1dCB3aXRoIGVub3VnaCBncmFudWxhcml0eSB0byB0aW1lIGxvbmdlciBwZXJpb2RzIG9mCi10aW1lIHRoYW4gdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lci4gTm90ZSB0aGF0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSB0aW1lcgotdGlja3MgaXMgbm90IGNvbnN0YW50IGJldHdlZW4gZGlmZmVyZW50IHBsYXRmb3JtcywgYW5kIHlvdSBzaG91bGQgdXNlIHRoZQotVUxaVGltZXJSZXNvbHV0aW9uIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgaW4gYSBzaW5nbGUKLXRpY2sgb2YgdGhlIHRpbWVyLCBhbmQgdXNlIHRoaXMgdG8gY29udmVydCB0aGUgdGltZXIgY291bnRzIHRvIHNlY29uZHMuCi0KLVVuZGVyIDMyLWJpdCBXaW5kb3dzLCB3ZSB1c2UgdGhlIHRpbWVHZXRUaW1lIGZ1bmN0aW9uIHdoaWNoIHByb3ZpZGVzIGEKLXJlc29sdXRpb24gb2YgMSBtaWxsaXNlY29uZCAoMC4wMDEgb2YgYSBzZWNvbmQpLiBHaXZlbiB0aGF0IHRoZSB0aW1lcgotY291bnQgaXMgcmV0dXJuZWQgYXMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsIHRoaXMgd2UgY2FuIHRpbWUgaW50ZXJ2YWxzCi10aGF0IGFyZSBhIG1heGltdW0gb2YgMl4zMiBtaWxsaXNlY29uZHMgaW4gbGVuZ3RoIChvciBhYm91dCAxLDIwMCBob3VycyBvcgotNTAgZGF5cyEpLgotCi1VbmRlciAzMi1iaXQgRE9TLCB3ZSB1c2UgdGhlIHN5c3RlbSB0aW1lciB0aWNrIHdoaWNoIHJ1bnMgYXQgMTguMiB0aW1lcyBwZXIKLXNlY29uZC4gR2l2ZW4gdGhhdCB0aGUgdGltZXIgY291bnQgaXMgcmV0dXJuZWQgYXMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsCi10aGlzIHdlIGNhbiB0aW1lIGludGVydmFscyB0aGF0IGFyZSBhIG1heGltdW0gb2YgMl4zMiAqICgxLzE4LjIpIGluIGxlbmd0aAotKG9yIGFib3V0IDY1LDU1MCBob3VycyBvciAyNzMxIGRheXMhKS4KLQotU0VFIEFMU086Ci1VTFpUaW1lck9mZiwgVUxaVGltZXJMYXAsIFVMWlRpbWVyQ291bnQsIFVMWkVsYXBzZWRUaW1lLCBVTFpSZWFkVGltZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBVTFpUaW1lck9uKHZvaWQpCi17IHN0YXJ0ID0gX19VTFpSZWFkVGltZSgpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgZm9yIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgYW5kIGtlZXBzIGl0Ci1ydW5uaW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotQ291bnQgdGhhdCBoYXMgZWxhcHNlZCBpbiByZXNvbHV0aW9uIGNvdW50cy4KLQotUkVNQVJLUzoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgdGhhdCBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCi1VTFpUaW1lck9uIGluIG1pY3Jvc2Vjb25kcy4gVGhlIHRpbWUgY29udGludWVzIHRvIHJ1biBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzCi1jYWxsZWQgc28geW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gcmVwZWF0ZWRseS4KLQotU0VFIEFMU086Ci1VTFpUaW1lck9uLCBVTFpUaW1lck9mZiwgVUxaVGltZXJDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgVUxaVGltZXJMYXAodm9pZCkKLXsgcmV0dXJuIChfX1VMWlJlYWRUaW1lKCkgLSBzdGFydCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU3RvcHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVNQVJLUzoKLVN0b3BzIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcgYW5kIGxhdGNoZXMgdGhlIGNvdW50LiBPbmNlCi15b3UgaGF2ZSBzdG9wcGVkIHRoZSB0aW1lciB5b3UgY2FuIHJlYWQgdGhlIGNvdW50IHdpdGggVUxaVGltZXJDb3VudC4KLQotU0VFIEFMU086Ci1VTFpUaW1lck9uLCBVTFpUaW1lckxhcCwgVUxaVGltZXJDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBVTFpUaW1lck9mZih2b2lkKQoteyBmaW5pc2ggPSBfX1VMWlJlYWRUaW1lKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBmb3IgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lci4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLUNvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gcmVzb2x1dGlvbiBjb3VudHMuCi0KLVJFTUFSS1M6Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IHRoYXQgaGFzIGVsYXBzZWQgYmV0d2VlbiBjYWxscyB0bwotVUxaVGltZXJPbiBhbmQgVUxaVGltZXJPZmYgaW4gcmVzb2x1dGlvbiBjb3VudHMuCi0KLVNFRSBBTFNPOgotVUxaVGltZXJPbiwgVUxaVGltZXJPZmYsIFVMWlRpbWVyTGFwLCBVTFpUaW1lclJlc29sdXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIFVMWlRpbWVyQ291bnQodm9pZCkKLXsgcmV0dXJuIChmaW5pc2ggLSBzdGFydCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmVhZHMgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1DdXJyZW50IHRpbWVyIHZhbHVlIGluIHJlc29sdXRpb24gY291bnRzLgotCi1SRU1BUktTOgotUmVhZHMgdGhlIGN1cnJlbnQgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGFuZCByZXR1cm5zIGl0knMgY3VycmVudAotY291bnQuIFlvdSBjYW4gdXNlIHRoZSBVTFpFbGFwc2VkVGltZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBlbGFwc2VkIHRpbWUKLWJldHdlZW4gdHdvIHRpbWVyIGNvdW50IHJlYWRpbmdzLgotCi1TRUUgQUxTTzoKLVVMWkVsYXBzZWRUaW1lLCBVTFpUaW1lclJlc29sdXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIFVMWlJlYWRUaW1lKHZvaWQpCi17IHJldHVybiBfX1VMWlJlYWRUaW1lKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGJldHdlZW4gdHdvIHRpbWVyIGNvdW50cy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUEFSQU1FVEVSUzoKLXN0YXJ0ICAgLSBTdGFydGluZyB0aW1lIGZvciBlbGFwc2VkIGNvdW50Ci1maW5pc2ggIC0gRW5kaW5nIHRpbWUgZm9yIGVsYXBzZWQgY291bnQKLQotUkVUVVJOUzoKLUVsYXBzZWQgdGltZXIgaW4gcmVzb2x1dGlvbiBjb3VudHMuCi0KLVJFTUFSS1M6Ci1SZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUgZm9yIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgaW4gdW5pdHMgb2YgdGhlCi10aW1lcnMgcmVzb2x1dGlvbiAoMS8xOHRoIG9mIGEgc2Vjb25kIHVuZGVyIERPUykuIFRoaXMgZnVuY3Rpb24gY29ycmVjdGx5Ci1jb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBldmVuIGlmIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIGJlZW4gY3Jvc3NlZAotZHVyaW5nIHRoZSB0aW1pbmcgcGVyaW9kLgotCi1TRUUgQUxTTzoKLVVMWlJlYWRUaW1lLCBVTFpUaW1lclJlc29sdXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIFVMWkVsYXBzZWRUaW1lKAotICAgIHVsb25nIHN0YXJ0LAotICAgIHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIF9fVUxaRWxhcHNlZFRpbWUoc3RhcnQsZmluaXNoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVBBUkFNRVRFUlM6Ci1yZXNvbHV0aW9uICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgdGltZXIgaW4gbWljcm9zZWNvbmRzIHBlciB0aW1lciBjb3VudC4KLQotUkVNQVJLUzoKLVJldHVybnMgdGhlIHJlc29sdXRpb24gb2YgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBhcyBhIDMyLWJpdAotaW50ZWdlciB2YWx1ZSBtZWFzdXJlZCBpbiBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIGNvdW50LgotCi1TRUUgQUxTTzoKLVVMWlJlYWRUaW1lLCBVTFpFbGFwc2VkVGltZSwgVUxaVGltZXJDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBVTFpUaW1lclJlc29sdXRpb24oCi0JdWxvbmcgKnJlc29sdXRpb24pCi17ICpyZXNvbHV0aW9uID0gVUxaVElNRVJfUkVTT0xVVElPTjsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9Bc21NYWNyb3MuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvQXNtTWFjcm9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzU0NWEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9Bc21NYWNyb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKiAkWENvbnNvcnRpdW06IEFzbU1hY3Jvcy5oIC9tYWluLzEzIDE5OTYvMTAvMjUgMTE6MzM6MTIga2FsZWIgJCAqLwotLyoKLSAqIChjKSBDb3B5cmlnaHQgMTk5MywxOTk0IGJ5IERhdmlkIFdleGVsYmxhdCA8ZHdleEB4ZnJlZTg2Lm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIERBVklEIFdFWEVMQkxBVCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi0gKiBTT0ZUV0FSRS4KLSAqCi0gKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBEYXZpZCBXZXhlbGJsYXQgc2hhbGwgbm90IGJlCi0gKiB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKLSAqIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBEYXZpZCBXZXhlbGJsYXQuCi0gKgotICovCi0vKgotICogQ29weXJpZ2h0IDE5OTcKLSAqIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBzb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdW5kZXIgbGljZW5zZSBhbmQgbWF5IGJlIHVzZWQgYW5kIGNvcGllZCBvbmx5IGluCi0gKiBhY2NvcmRhbmNlIHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFN1YmplY3QgdG8gdGhlc2UKLSAqIGNvbmRpdGlvbnMsIHlvdSBtYXkgZG93bmxvYWQsIGNvcHksIGluc3RhbGwsIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlCi0gKiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5IGZvcm0uIE5vIHRpdGxlIG9yIG93bmVyc2hpcCBpcwotICogdHJhbnNmZXJyZWQgaGVyZWJ5LgotICoKLSAqIDEpIEFueSBzb3VyY2UgY29kZSB1c2VkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBtdXN0IHJlcHJvZHVjZSBhbmQgcmV0YWluCi0gKiAgICB0aGlzIGNvcHlyaWdodCBub3RpY2UgYW5kIGxpc3Qgb2YgY29uZGl0aW9ucyBhcyB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlCi0gKiAgICBmaWxlLgotICoKLSAqIDIpIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdXNlIGFueSB0cmFkZSBuYW1lLCB0cmFkZW1hcmssIG9yIGxvZ28gb2YgRGlnaXRhbAotICogICAgRXF1aXBtZW50IENvcnBvcmF0aW9uLiBOZWl0aGVyIHRoZSAiRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24iIG5hbWUKLSAqICAgIG5vciBhbnkgdHJhZGVtYXJrIG9yIGxvZ28gb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gbWF5IGJlIHVzZWQKLSAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHRoZQotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgotICoKLSAqIDMpIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLAotICogICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bywgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHksCi0gKiAgICBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSwgb3Igbm9uLWluZnJpbmdlbWVudCBhcmUgZGlzY2xhaW1lZC4gSW4KLSAqICAgIG5vIGV2ZW50IHNoYWxsIERJR0lUQUwgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyB3aGF0c29ldmVyLCBhbmQgaW4KLSAqICAgIHBhcnRpY3VsYXIsIERJR0lUQUwgc2hhbGwgbm90IGJlIGxpYWJsZSBmb3Igc3BlY2lhbCwgaW5kaXJlY3QsCi0gKiAgICBjb25zZXF1ZW50aWFsLCBvciBpbmNpZGVudGFsIGRhbWFnZXMgb3IgZGFtYWdlcyBmb3IKLSAqICAgIGxvc3QgcHJvZml0cywgbG9zcyBvZiByZXZlbnVlIG9yIGxvc3Mgb2YgdXNlLCB3aGV0aGVyIHN1Y2ggZGFtYWdlcyBhcmlzZQotICogICAgaW4gY29udHJhY3QsCi0gKiAgICBuZWdsaWdlbmNlLCB0b3J0LCB1bmRlciBzdGF0dXRlLCBpbiBlcXVpdHksIGF0IGxhdyBvciBvdGhlcndpc2UsIGV2ZW4gaWYKLSAqICAgIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotICoKLSAqLwotCi0vKiAkWEZyZWU4NjogeGMvcHJvZ3JhbXMvWHNlcnZlci9ody94ZnJlZTg2L1N1cGVyUHJvYmUvQXNtTWFjcm9zLmgsdiAzLjE0IDE5OTkvMDkvMjUgMTQ6MzY6NTggZGF3ZXMgRXhwICQgKi8KLQotI2lmIGRlZmluZWQoX19HTlVDX18pCi0jaWYgZGVmaW5lZChsaW51eCkgJiYgKGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSkKLSN1bmRlZiBpbmIKLSNkZWZpbmUgaW5iIF9pbmIKLSN1bmRlZiBpbncKLSNkZWZpbmUgaW53IF9pbncKLSN1bmRlZiBpbmwKLSNkZWZpbmUgaW5sIF9pbmwKLSN1bmRlZiBvdXRiCi0jZGVmaW5lIG91dGIocCx2KSBfb3V0YigodiksKHApKQotI3VuZGVmIG91dHcKLSNkZWZpbmUgb3V0dyhwLHYpIF9vdXR3KCh2KSwocCkpCi0jdW5kZWYgb3V0bAotI2RlZmluZSBvdXRsKHAsdikgX291dGwoKHYpLChwKSkKLSNlbHNlCi0jaWYgZGVmaW5lZChfX3NwYXJjX18pCi0jaWZuZGVmIEFTSV9QTAotI2RlZmluZSBBU0lfUEwgMHg4OAotI2VuZGlmCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dGIocG9ydCwgdmFsKQotdW5zaWduZWQgbG9uZyBwb3J0OwotY2hhciB2YWw7Ci17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJzdGJhICUwLCBbJTFdICUyIiA6IDogInIiICh2YWwpLCAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXR3KHBvcnQsIHZhbCkKLXVuc2lnbmVkIGxvbmcgcG9ydDsKLWNoYXIgdmFsOwotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RoYSAlMCwgWyUxXSAlMiIgOiA6ICJyIiAodmFsKSwgInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0bChwb3J0LCB2YWwpCi11bnNpZ25lZCBsb25nIHBvcnQ7Ci1jaGFyIHZhbDsKLXsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YSAlMCwgWyUxXSAlMiIgOiA6ICJyIiAodmFsKSwgInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbmIocG9ydCkKLXVuc2lnbmVkIGxvbmcgcG9ydDsKLXsKLSAgIHVuc2lnbmVkIGNoYXIgcmV0OwotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxkdWJhIFslMV0gJTIsICUwIiA6ICI9ciIgKHJldCkgOiAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOwotICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbncocG9ydCkKLXVuc2lnbmVkIGxvbmcgcG9ydDsKLXsKLSAgIHVuc2lnbmVkIGNoYXIgcmV0OwotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxkdWhhIFslMV0gJTIsICUwIiA6ICI9ciIgKHJldCkgOiAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOwotICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbmwocG9ydCkKLXVuc2lnbmVkIGxvbmcgcG9ydDsKLXsKLSAgIHVuc2lnbmVkIGNoYXIgcmV0OwotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxkYSBbJTFdICUyLCAlMCIgOiAiPXIiIChyZXQpIDogInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKLSAgIHJldHVybiByZXQ7Ci19Ci0jZWxzZQotI2lmZGVmIF9fYXJtMzJfXwotdW5zaWduZWQgaW50IElPUG9ydEJhc2U7ICAvKiBNZW1vcnkgbWFwcGVkIEkvTyBwb3J0IGFyZWEgKi8KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0Yihwb3J0LCB2YWwpCi0gICAgIHNob3J0IHBvcnQ7Ci0gICAgIGNoYXIgdmFsOwotewotICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KXBvcnQgPj0gMHg0MDApIHJldHVybjsKLQotICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKCgodW5zaWduZWQgc2hvcnQpKHBvcnQpKStJT1BvcnRCYXNlKSA9IHZhbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0dyhwb3J0LCB2YWwpCi0gICAgIHNob3J0IHBvcnQ7Ci0gICAgIHNob3J0IHZhbDsKLXsKLSAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClwb3J0ID49IDB4NDAwKSByZXR1cm47Ci0KLSAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KikoKCh1bnNpZ25lZCBzaG9ydCkocG9ydCkpK0lPUG9ydEJhc2UpID0gdmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXRsKHBvcnQsIHZhbCkKLSAgICAgc2hvcnQgcG9ydDsKLSAgICAgaW50IHZhbDsKLXsKLSAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClwb3J0ID49IDB4NDAwKSByZXR1cm47Ci0KLSAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkgPSB2YWw7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW5iKHBvcnQpCi0gICAgIHNob3J0IHBvcnQ7Ci17Ci0gICAgIGlmICgodW5zaWduZWQgc2hvcnQpcG9ydCA+PSAweDQwMCkgcmV0dXJuKCh1bnNpZ25lZCBpbnQpLTEpOwotCi0gICAgcmV0dXJuKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKCgodW5zaWduZWQgc2hvcnQpKHBvcnQpKStJT1BvcnRCYXNlKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW53KHBvcnQpCi0gICAgIHNob3J0IHBvcnQ7Ci17Ci0gICAgIGlmICgodW5zaWduZWQgc2hvcnQpcG9ydCA+PSAweDQwMCkgcmV0dXJuKCh1bnNpZ25lZCBpbnQpLTEpOwotCi0gICAgcmV0dXJuKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWlubChwb3J0KQotICAgICBzaG9ydCBwb3J0OwotewotICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KXBvcnQgPj0gMHg0MDApIHJldHVybigodW5zaWduZWQgaW50KS0xKTsKLQotICAgIHJldHVybigqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkpOwotfQotI2Vsc2UgLyogX19hcm0zMl9fICovCi0jaWYgZGVmaW5lZChMeW54KSAmJiBkZWZpbmVkKF9fcG93ZXJwY19fKQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmlvQmFzZTsKLQotc3RhdGljIHZvbGF0aWxlIHZvaWQKLWVpZWlvKCkKLXsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vdXRiKHBvcnQsIHZhbHVlKQotc2hvcnQgcG9ydDsKLXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci17Ci0gICAgKih1Y2hhciAqKShpb0Jhc2UgKyBwb3J0KSA9IHZhbHVlOyBlaWVpbygpOwotfQotCi1zdGF0aWMgdm9pZAotb3V0dyhwb3J0LCB2YWx1ZSkKLXNob3J0IHBvcnQ7Ci11bnNpZ25lZCBzaG9ydCB2YWx1ZTsKLXsKLSAgICAqKHVuc2lnbmVkIHNob3J0ICopKGlvQmFzZSArIHBvcnQpID0gdmFsdWU7IGVpZWlvKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vdXRsKHBvcnQsIHZhbHVlKQotc2hvcnQgcG9ydDsKLXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci17Ci0gICAgKih1bnNpZ25lZCBsb25nICopKGlvQmFzZSArIHBvcnQpID0gdmFsdWU7IGVpZWlvKCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyCi1pbmIocG9ydCkKLXNob3J0IHBvcnQ7Ci17Ci0gICAgdW5zaWduZWQgY2hhciB2YWw7Ci0KLSAgICB2YWwgPSAqKCh1bnNpZ25lZCBjaGFyICopKGlvQmFzZSArIHBvcnQpKTsgZWllaW8oKTsKLSAgICByZXR1cm4odmFsKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0Ci1pbncocG9ydCkKLXNob3J0IHBvcnQ7Ci17Ci0gICAgdW5zaWduZWQgc2hvcnQgdmFsOwotCi0gICAgdmFsID0gKigodW5zaWduZWQgc2hvcnQgKikoaW9CYXNlICsgcG9ydCkpOyBlaWVpbygpOwotICAgIHJldHVybih2YWwpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5sKHBvcnQpCi1zaG9ydCBwb3J0OwotewotICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gICAgdmFsID0gKigodW5zaWduZWQgbG9uZyAqKShpb0Jhc2UgKyBwb3J0KSk7IGVpZWlvKCk7Ci0gICAgcmV0dXJuKHZhbCk7Ci19Ci0KLSNlbHNlCi0jaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgZGVmaW5lZChfX2FscGhhX18pCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotZXh0ZXJuIHZvaWQgb3V0Yih1X2ludDMyX3QgcG9ydCwgdV9pbnQ4X3QgdmFsKTsKLWV4dGVybiB2b2lkIG91dHcodV9pbnQzMl90IHBvcnQsIHVfaW50MTZfdCB2YWwpOwotZXh0ZXJuIHZvaWQgb3V0bCh1X2ludDMyX3QgcG9ydCwgdV9pbnQzMl90IHZhbCk7Ci1leHRlcm4gdV9pbnQ4X3QgaW5iKHVfaW50MzJfdCBwb3J0KTsKLWV4dGVybiB1X2ludDE2X3QgaW53KHVfaW50MzJfdCBwb3J0KTsKLWV4dGVybiB1X2ludDMyX3QgaW5sKHVfaW50MzJfdCBwb3J0KTsKLQotI2Vsc2UKLSNpZmRlZiBHQ0NVU0VTR0FTCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXRiKHBvcnQsIHZhbCkKLXNob3J0IHBvcnQ7Ci1jaGFyIHZhbDsKLXsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXRiICUwLCUxIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXR3KHBvcnQsIHZhbCkKLXNob3J0IHBvcnQ7Ci1zaG9ydCB2YWw7Ci17Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0dyAlMCwlMSIgOiA6ImEiICh2YWwpLCAiZCIgKHBvcnQpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0bChwb3J0LCB2YWwpCi1zaG9ydCBwb3J0OwotdW5zaWduZWQgaW50IHZhbDsKLXsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXRsICUwLCUxIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWluYihwb3J0KQotc2hvcnQgcG9ydDsKLXsKLSAgIHVuc2lnbmVkIGNoYXIgcmV0OwotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImluYiAlMSwlMCIgOgotICAgICAgICI9YSIgKHJldCkgOgotICAgICAgICJkIiAocG9ydCkpOwotICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbncocG9ydCkKLXNob3J0IHBvcnQ7Ci17Ci0gICB1bnNpZ25lZCBzaG9ydCByZXQ7Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW53ICUxLCUwIiA6Ci0gICAgICAgIj1hIiAocmV0KSA6Ci0gICAgICAgImQiIChwb3J0KSk7Ci0gICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWlubChwb3J0KQotc2hvcnQgcG9ydDsKLXsKLSAgIHVuc2lnbmVkIGludCByZXQ7Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW5sICUxLCUwIiA6Ci0gICAgICAgIj1hIiAocmV0KSA6Ci0gICAgICAgImQiIChwb3J0KSk7Ci0gICByZXR1cm4gcmV0OwotfQotCi0jZWxzZSAvKiBHQ0NVU0VTR0FTICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dGIocG9ydCwgdmFsKQotICAgICBzaG9ydCBwb3J0OwotICAgICBjaGFyIHZhbDsKLXsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm91dCVCMCAoJTEpIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXR3KHBvcnQsIHZhbCkKLSAgICAgc2hvcnQgcG9ydDsKLSAgICAgc2hvcnQgdmFsOwotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0JVcwICglMSkiIDogOiJhIiAodmFsKSwgImQiIChwb3J0KSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dGwocG9ydCwgdmFsKQotICAgICBzaG9ydCBwb3J0OwotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0JUwwICglMSkiIDogOiJhIiAodmFsKSwgImQiIChwb3J0KSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW5iKHBvcnQpCi0gICAgIHNob3J0IHBvcnQ7Ci17Ci0gIHVuc2lnbmVkIGludCByZXQ7Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbiVCMCAoJTEpIiA6Ci0JCSAgICI9YSIgKHJldCkgOgotCQkgICAiZCIgKHBvcnQpKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbncocG9ydCkKLSAgICAgc2hvcnQgcG9ydDsKLXsKLSAgdW5zaWduZWQgaW50IHJldDsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oImluJVcwICglMSkiIDoKLQkJICAgIj1hIiAocmV0KSA6Ci0JCSAgICJkIiAocG9ydCkpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWlubChwb3J0KQotICAgICBzaG9ydCBwb3J0OwotewotICB1bnNpZ25lZCBpbnQgcmV0OwotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW4lTDAgKCUxKSIgOgotCQkgICAiPWEiIChyZXQpIDoKLQkJICAgImQiIChwb3J0KSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZiAvKiBHQ0NVU0VTR0FTICovCi0jZW5kaWYgLyogTHlueCAmJiBfX3Bvd2VycGNfXyAqLwotI2VuZGlmIC8qIGFybTMyICovCi0jZW5kaWYgLyogbGludXggJiYgX19zcGFyY19fICovCi0jZW5kaWYgLyogbGludXggJiYgX19hbHBoYV9fICovCi0jZW5kaWYgLyogX19GcmVlQlNEX18gJiYgX19hbHBoYV9fICovCi0KLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fYXJtMzJfXykgfHwgKGRlZmluZWQoTHlueCkgJiYgZGVmaW5lZChfX3Bvd2VycGNfXykpCi0KLSNkZWZpbmUgaW50cl9kaXNhYmxlKCkKLSNkZWZpbmUgaW50cl9lbmFibGUoKQotCi0jZWxzZQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1pbnRyX2Rpc2FibGUoKQotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2xpIik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLWludHJfZW5hYmxlKCkKLXsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN0aSIpOwotfQotCi0jZW5kaWYgLyogZWxzZSAhbGludXggJiYgIV9fYXJtMzJfXyAqLwotCi0jZWxzZSAvKiBfX0dOVUNfXyAqLwotCi0jaWYgZGVmaW5lZChfTUlOSVgpICYmIGRlZmluZWQoX0FDSykKLQotLyogaW5iLCBvdXRiLCBpbncgYW5kIG91dHcgYXJlIGRlZmluZWQgaW4gdGhlIGxpYnJhcnkgKi8KLS8qIC4uLiBidXQgSSd2ZSBubyBpZGVhIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIGlubCAmIG91dGwgKi8KLQotdThfdCBpbmIoVTE2X3QpOwotdm9pZCBvdXRiKFUxNl90LCBVOF90KTsKLXUxNl90IGludyhVMTZfdCk7Ci12b2lkIG91dHcoVTE2X3QsIFUxNl90KTsKLXUzMl90IGlubChVMTZfdCk7Ci12b2lkIG91dGwoVTE2X3QsIFUzMl90KTsKLQotI2Vsc2UgLyogbm90IF9NSU5JWCBhbmQgX0FDSyAqLwotCi0jIGlmIGRlZmluZWQoX19TVERDX18pICYmIChfX1NURENfXyA9PSAxKQotIyAgaWZuZGVmIE5DUgotIyAgZGVmaW5lIGFzbSBfX2FzbQotIyAgZW5kaWYKLSMgZW5kaWYKLSMgaWZkZWYgU1ZSNAotIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jICBpZm5kZWYgX19VU0xDX18KLSMgICBkZWZpbmUgX19VU0xDX18KLSMgIGVuZGlmCi0jIGVuZGlmCi0jaWZuZGVmIFNDTzMyNQotIyBpbmNsdWRlIDxzeXMvaW5saW5lLmg+Ci0jZWxzZQotIyBpbmNsdWRlICIuLi9jb21tb24vc2NvYXNtLmgiCi0jZW5kaWYKLSNkZWZpbmUgaW50cl9kaXNhYmxlKCkgYXNtKCJjbGkiKQotI2RlZmluZSBpbnRyX2VuYWJsZSgpICBhc20oInN0aSIpCi0KLSNlbmRpZiAvKiBfTUlOSVggYW5kIF9BQ0sgKi8KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9SRUFETUUgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2NTY3NC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLQotVGhpcyBpcyBhIHByZWxpbWluYXJ5IHZlcnNpb24gb2YgYSBWR0Egc29mdGJvb3RlciBmb3IgTElOVVguCi0KLUl0IG1ha2VzIHVzZSBvZiB0aGUgb2YgdGhlIHZtODYoKSBjYWxsIGFuZCBpcyB0aGVyZWZvcmUgb25seQotdXNhYmxlIG9uIGl4ODYgc3lzdGVtcy4KLVRoZXJlIGFyZSBwbGFucyB0byBwb3J0IHRoaXMgcHJvZ3JhbSB0byB1c2UgYSB4ODYgZW11bGF0b3IKLWxpa2UgeDg2ZW11LiBBbHNvIGl0IG1heSBiZSBwb3J0ZWQgdG8gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuCi0KLVNvIGZhciBpdCBoYXMgYmVlbiB0ZXN0ZWQgb24gYSBzbWFsbCBudW1iZXIgb2YgY2FyZHMuIEl0IG1pZ2h0Ci13ZWxsIGJlIHRoYXQgaXQgd2lsbCBmYWlsIG9uIHlvdXIgY2FyZC4KLQotSWYgeW91IG5lZWQgdG8gbWFrZSBtb2RpZmljYXRpb25zIHRvIHRoZSBwcm9ncmFtcyB0byBiZSBhYmxlCi10byBib290IHlvdXIgY2FyZCBwbGVhc2UgbGV0IHRoZSBhdXRob3Iga25vdy4KLQotU28gZmFyIHRoZXJlIGlzIG5vIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuIEFsbCBvcHRpb25zIG5lZWQKLXRvIGJlIGhhcmRjb2RlZC4gWW91IGNhbiBkbyB0aGlzIGJ5IGVkaXRpbmcgZGVidWcuaC4gWW91IGNhbgotdHVybiBvbiBhIGJ1bmNoIG9mIGRlYnVnIG91dHB1dC4gT3RoZXIgb3B0aW9ucyBhbGxvdyB5b3UgdG8KLWJvb3QgdGhlIHByaW1hcnkgY2FyZCAoQ09ORklHX0FDVElWRV9ERVZJQ0UpLCBzYXZlIHRoZSBiaW9zCi10byBhIGZpbGUgKFNBVkVfQklPUyksIGFuZCBtYXAgdGhlIG9yaWdpbmFsIHN5c3RlbSBiaW9zCi0oTUFQX1NZU19CSU9TKS4KLQotVGhlIGF1dGhvciB3YW50cyB0byB0aGFuawotIEhhbnMgTGVybWVuICAgKGRvc2VtdSkKLSBhbmQKLSBLZW5kYWxsIEJlbm5ldHQgKHg4NmVtdSkKLWZvciB0aGVpciBzdXBwb3J0LgotCi1QYXJ0cyBvZiB0aGUgY29kZSAtIGVzcGVjaWFsbHkgaW4gdjg2LmMgYW5kIGlvLmMgLSBhcmUgYmFzZWQgb24gY29kZQotdGFrZW4gZnJvbSBkb3NlbXUuIFBhcnRzIG9mIHRoZSBjb2RlIGluIGludC5jIGFyZSBiYXNlZCBvbiBjb2RlIHRha2VuCi1mcm9tIHg4NmVtdQotCi1FZ2JlcnQgRWljaC4gIDxFZ2JlcnQuRWljaEBQaHlzaWsuVFUtRGFybXN0YWR0LkRFPgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9hd2suc2NyIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9hd2suc2NyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJhODBkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvYXdrLnNjcgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8uKlwoMHgzZGEuKi98fC8uKlwoMHgzYmEuKi8geyAKLSAgICAgICAgaWYgKHZfM2RhICE9IDEpIHByaW50ICJfdl9yZXRyYWNlXyI7Ci0gICAgICAgIHZfM2RhID0gMTsKLSAgICAgICAgbmV4dDsgICAgICAgIAotICAgICAgICB9Ci0vLipcKDB4NDIuKi98fC8uKlwoMHg0My4qLyB7Ci0gICAgICAgIGlmICh2XzR4ICE9IDEpIHByaW50ICJfdGltZXJfIjsKLSAgICAgICAgdl80eCA9IDE7Ci0gICAgICAgIG5leHQ7Ci19Ci17Ci0gICAgcHJpbnQ7Ci0gICAgdl8zZGEgPSAwOwotICAgIHZfNHggPSAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jYmlvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jYmlvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjEyZGZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY2Jpb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCi0jaW5jbHVkZSA8c3lzL2lvLmg+Ci0jZWxpZiBkZWZpbmVkKEhBVkVfU1lTX1BFUk0pCi0jaW5jbHVkZSA8c3lzL3Blcm0uaD4KLSNlbmRpZgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgotCi0jZGVmaW5lIFNJWkUgMHgxMDAwMDAKLSNkZWZpbmUgVlJBTV9TVEFSVCAweEEwMDAwCi0jZGVmaW5lIFZSQU1fU0laRSAweDFGRkZGCi0jZGVmaW5lIFZfQklPU19TSVpFIDB4MUZGRkYKLSNkZWZpbmUgQklPU19TVEFSVCAweDdDMDAgICAgICAgICAgICAvKiBkZWZhdWx0IEJJT1MgZW50cnkgKi8KLSNkZWZpbmUgQklPU19NRU0gMHg2MDAKLQotQ0FSRDggY29kZVtdID0geyAweGNkLCAweDEwLCAweGY0IH07Ci1zdHJ1Y3QgY29uZmlnIENvbmZpZzsKLQotc3RhdGljIGludCBtYXAodm9pZCk7Ci1zdGF0aWMgdm9pZCB1bm1hcCh2b2lkKTsKLXN0YXRpYyB2b2lkIHJ1bkJJT1MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKLXN0YXRpYyBpbnQgbWFwX3ZyYW0odm9pZCk7Ci1zdGF0aWMgdm9pZCB1bm1hcF92cmFtKHZvaWQpOwotc3RhdGljIGludCBjb3B5X3ZiaW9zKG1lbVR5cGUgYmFzZSk7Ci1zdGF0aWMgaW50IGNvcHlfc3lzX2Jpb3Modm9pZCk7Ci1zdGF0aWMgQ0FSRDMyIHNldHVwX2ludF92ZWN0KHZvaWQpOwotc3RhdGljIHZvaWQgdXBkYXRlX2Jpb3NfdmFycyh2b2lkKTsKLXN0YXRpYyBpbnQgY2hrc3VtKENBUkQ4ICpzdGFydCk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKLXN0YXRpYyB2b2lkIHByaW50X3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncyk7Ci12b2lkIGRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotCi12b2lkIGxvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCAqY29kZSk7Ci0KLXN0YXRpYyBpbnQgdnJhbV9tYXBwZWQgPSAwOwotc3RhdGljIGNoYXIqIGJpb3NfdmFyOwotCi0KLWludAotbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKLXsKLSAgICBDQVJEMzIgdmJpb3NfYmFzZTsKLQotICAgIENvbmZpZy5QcmludFBvcnQgPSBQUklOVF9QT1JUOwotICAgIENvbmZpZy5Jb1N0YXRpc3RpY3MgPSBJT19TVEFUSVNUSUNTOwotICAgIENvbmZpZy5QcmludElycSA9IFBSSU5UX0lSUTsKLSAgICBDb25maWcuUHJpbnRQY2kgPSBQUklOVF9QQ0k7Ci0gICAgQ29uZmlnLlNob3dBbGxEZXYgPSBTSE9XX0FMTF9ERVY7Ci0gICAgQ29uZmlnLlByaW50SXAgPSBQUklOVF9JUDsKLSAgICBDb25maWcuU2F2ZUJpb3MgPSBTQVZFX0JJT1M7Ci0gICAgQ29uZmlnLlRyYWNlID0gVFJBQ0U7Ci0gICAgQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkgPSBDT05GSUdfQUNUSVZFX09OTFk7Ci0gICAgQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSA9IENPTkZJR19BQ1RJVkVfREVWSUNFOwotICAgIENvbmZpZy5NYXBTeXNCaW9zID0gTUFQX1NZU19CSU9TOwotICAgIENvbmZpZy5SZXNvcnQgPSBSRVNPUlQ7Ci0gICAgQ29uZmlnLkZpeFJvbSA9IEZJWF9ST007Ci0gICAgQ29uZmlnLk5vQ29uc29sZSA9IE5PX0NPTlNPTEU7Ci0gICAgQ29uZmlnLlZlcmJvc2UgPSBWRVJCT1NFOwotCi0gICAgaWYgKCFtYXAoKSkKLSAgICBleGl0KDEpOwotICAgIGlmICghY29weV9zeXNfYmlvcygpKQotICAgIGV4aXQoMSk7Ci0gICAgaWYgKCEodmJpb3NfYmFzZSA9IHNldHVwX2ludF92ZWN0KCkpKQotICAgIGV4aXQoMSk7Ci0gICAgaWYgKCFtYXBfdnJhbSgpKQotICAgIGV4aXQoMSk7Ci0gICAgaWYgKCFjb3B5X3ZiaW9zKHZiaW9zX2Jhc2UpKQotICAgIGV4aXQoMSk7Ci0KLSAgICBpb3BsKDMpOwotICAgIHNldHVwX2lvKCk7Ci0gICAgcnVuQklPUyhhcmdjLGFyZ3YpOwotICAgIHVwZGF0ZV9iaW9zX3ZhcnMoKTsKLSAgICB1bm1hcF92cmFtKCk7Ci0gICAgaW9wbCgwKTsKLSAgICB1bm1hcCgpOwotICAgIHByaW50ZigiZG9uZSAhXG4iKTsKLSAgICBleGl0ICgxKTsKLX0KLQotaW50Ci1tYXAodm9pZCkKLXsKLSAgICB2b2lkKiBtZW07Ci0KLSAgICBtZW0gPSBtbWFwKDAsIChzaXplX3QpU0laRSwKLQkgICAgICAgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgICAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwKLQkgICAgICAgLTEsIDAgKTsKLSAgICBpZiAobWVtICE9IDApIHsKLQlwZXJyb3IoImFub255bW91cyBtYXAiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLSAgICBtZW1zZXQobWVtLDAsU0laRSk7Ci0KLSAgICBsb2FkQ29kZVRvTWVtKCh1bnNpZ25lZCBjaGFyICopIEJJT1NfU1RBUlQsIGNvZGUpOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfc3lzX2Jpb3Modm9pZCkKLXsKLSNkZWZpbmUgU1lTX0JJT1MgMHhGMDAwMAotICAgIGludCBtZW1fZmQ7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIFNZU19CSU9TLFNFRUtfU0VUKSAhPSAob2ZmX3QpIFNZU19CSU9TKQotCWdvdG8gRXJyb3I7Ci0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKVNZU19CSU9TLCAoc2l6ZV90KSAweEZGRkYpICE9IChzaXplX3QpIDB4RkZGRikKLQlnb3RvIEVycm9yOwotCi0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDEpOwotCi1FcnJvcjoKLSAgICBwZXJyb3IoInN5c19iaW9zIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci1tYXBfdnJhbSh2b2lkKQotewotICAgIGludCBtZW1fZmQ7Ci0KLSNpZmRlZiBfX2lhNjRfXwotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IgfCBPX1NZTkMpKTwwKQotI2Vsc2UKLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSKSk8MCkKLSNlbmRpZgotICAgICAgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSNpZm5kZWYgX19hbHBoYV9fCi0gICAgaWYgKG1tYXAoKHZvaWQgKikgVlJBTV9TVEFSVCwgKHNpemVfdCkgVlJBTV9TSVpFLAotCQkgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsCi0JCSAgICAgbWVtX2ZkLCBWUkFNX1NUQVJUKSA9PSAodm9pZCAqKSAtMSkKLSNlbHNlCi0JIGlmICghX2J1c19iYXNlKCkpIHNwYXJzZV9zaGlmdCA9IDc7IC8qIFVoLCBvaCwgSkVOU0VOLi4uICovCi0JIGlmICghX2J1c19iYXNlX3NwYXJzZSgpKSBzcGFyc2Vfc2hpZnQgPSAwOwotCSBpZiAoKHZyYW1fbWFwID0gbW1hcCgwLChzaXplX3QpIChWUkFNX1NJWkUgPDwgc3BhcnNlX3NoaWZ0KSwKLQkJCQkJCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCQkJIE1BUF9TSEFSRUQsCi0JCQkJCQkgbWVtX2ZkLCAoVlJBTV9TVEFSVCA8PCBzcGFyc2Vfc2hpZnQpCi0JCQkJCQkgfCBfYnVzX2Jhc2Vfc3BhcnNlKCkpKSA9PSAodm9pZCAqKSAtMSkKLSNlbmRpZgotICAgICAgewotCXBlcnJvcigibW1hcCBlcnJvciBpbiBtYXBfaGFyZHdhcmVfcmFtIik7Ci0JICAgIGNsb3NlKG1lbV9mZCk7Ci0JICAgIHJldHVybiAoMCk7Ci0JfQotICAgIHZyYW1fbWFwcGVkID0gMTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfdmJpb3MobWVtVHlwZSB2X2Jhc2UpCi17Ci0gICAgaW50IG1lbV9mZDsKLSAgICB1bnNpZ25lZCBjaGFyICp0bXA7Ci0gICAgaW50IHNpemU7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIHZfYmFzZSwgU0VFS19TRVQpICE9IChvZmZfdCkgdl9iYXNlKSB7Ci0JICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IGxzZWVrXG4iKTsKLQkgIGdvdG8gRXJyb3I7Ci0gICAgICB9Ci0gICAgdG1wID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoMyk7Ci0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKXRtcCwgKHNpemVfdCkgMykgIT0gKHNpemVfdCkgMykgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSB2X2Jhc2UsU0VFS19TRVQpICE9IChvZmZfdCkgdl9iYXNlKQotCWdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoKnRtcCAhPSAweDU1IHx8ICoodG1wKzEpICE9IDB4QUEgKSB7Ci0JZnByaW50ZihzdGRlcnIsIk5vIGJpb3MgZm91bmQgYXQ6IDB4JWx4XG4iLHZfYmFzZSk7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0jaWZkZWYgREVCVUcKLQlkcHJpbnQoKHVuc2lnbmVkIGxvbmcpdG1wLDB4MTAwKTsKLSNlbmRpZgotICAgIHNpemUgPSAqKHRtcCsyKSAqIDUxMjsKLQotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKil2X2Jhc2UsIChzaXplX3QpIHNpemUpICE9IChzaXplX3QpIHNpemUpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSAgICBmcmVlKHRtcCk7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICBpZiAoIWNoa3N1bSgoQ0FSRDgqKXZfYmFzZSkpCi0JcmV0dXJuICgwKTsKLQotICAgIHJldHVybiAoMSk7Ci0KLUVycm9yOgotICAgIHBlcnJvcigidl9iaW9zIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotdW5tYXAodm9pZCkKLXsKLSAgICBtdW5tYXAoMCxTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLXVubWFwX3ZyYW0odm9pZCkKLXsKLSAgICBpZiAoIXZyYW1fbWFwcGVkKSByZXR1cm47Ci0KLSAgICBtdW5tYXAoKHZvaWQqKVZSQU1fU1RBUlQsVlJBTV9TSVpFKTsKLSAgICB2cmFtX21hcHBlZCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ydW5CSU9TKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCi17Ci0gICAgaTg2Ymlvc1JlZ3MgYlJlZ3M7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHByaW50Zigic3RhcnRpbmcgQklPU1xuIik7Ci0jZW5kaWYKLSAgICBzZXR1cF9iaW9zX3JlZ3MoJmJSZWdzLCBhcmdjLCBhcmd2KTsKLSAgICBkb194ODYoQklPU19TVEFSVCwmYlJlZ3MpOwotICAgIHByaW50X3JlZ3MoJmJSZWdzKTsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgcHJpbnRmKCJkb25lXG4iKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgQ0FSRDMyCi1zZXR1cF9pbnRfdmVjdCh2b2lkKQotewotICAgIGludCBtZW1fZmQ7Ci0gICAgQ0FSRDMyIHZiYXNlOwotICAgIHZvaWQgKm1hcDsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKLSAgICBwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0gICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBpZiAoKG1hcCA9IG1tYXAoKHZvaWQgKikgMCwgKHNpemVfdCkgMHgyMDAwLAotCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAotCSBtZW1fZmQsIDApKSA9PSAodm9pZCAqKS0xKSAgIHsKLSAgICBwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBjbG9zZShtZW1fZmQpOwotICAgIG1lbWNweSgwLG1hcCxCSU9TX01FTSk7Ci0gICAgbXVubWFwKG1hcCwweDIwMDApOwotICAgIC8qCi0gICAgICogY3JlYXRlIGEgYmFja3VwIGNvcHkgb2YgdGhlIGJpb3MgdmFyaWFibGVzIHRvIHdyaXRlIGJhY2sgdGhlCi0gICAgICogbW9kaWZpZWQgdmFsdWVzCi0gICAgICovCi0gICAgYmlvc192YXIgPSAoY2hhciAqKW1hbGxvYyhCSU9TX01FTSk7Ci0gICAgbWVtY3B5KGJpb3NfdmFyLDAsQklPU19NRU0pOwotCi0gICAgdmJhc2UgPSAoKigoQ0FSRDE2KikoMHgxMCA8PCAyKSArIDEpKSA8PCA0OwotICAgIGZwcmludGYoc3RkZXJyLCJ2YmFzZTogMHgleFxuIix2YmFzZSk7Ci0gICAgcmV0dXJuIHZiYXNlOwotfQotCi1zdGF0aWMgdm9pZAotdXBkYXRlX2Jpb3NfdmFycyh2b2lkKQotewotICAgIGludCBtZW1fZmQ7Ci0gICAgdm9pZCAqbWFwOwotICAgIG1lbVR5cGUgaTsKLQotI2lmZGVmIF9faWE2NF9fCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUiB8IE9fU1lOQykpPDApCi0jZWxzZQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IpKTwwKQotI2VuZGlmCi0gICAgICB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIGlmICgobWFwID0gbW1hcCgodm9pZCAqKSAwLCAoc2l6ZV90KSAweDIwMDAsCi0JIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCi0JIG1lbV9mZCwgMCkpID09ICh2b2lkICopLTEpICAgewotICAgIHBlcnJvcigibW1hcCBlcnJvciBpbiBtYXBfaGFyZHdhcmVfcmFtIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEJJT1NfTUVNOyBpKyspIHsKLSAgICBpZiAoYmlvc192YXJbaV0gIT0gKihDQVJEOCopaSkKLQkqKChDQVJEOCopbWFwICsgaSkgPSAqKENBUkQ4KilpOwotICAgIH0KLQotICAgIG11bm1hcChtYXAsMHgyMDAwKTsKLSAgICBjbG9zZShtZW1fZmQpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBjOwotCi0gICAgcmVncy0+YXggPSAwOwotICAgIHJlZ3MtPmJ4ID0gMDsKLSAgICByZWdzLT5jeCA9IDA7Ci0gICAgcmVncy0+ZHggPSAwOwotICAgIHJlZ3MtPmVzID0gMDsKLSAgICByZWdzLT5kaSA9IDA7Ci0gICAgb3B0ZXJyID0gMDsKLSAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYyxhcmd2LCJhOmI6YzpkOmU6aToiKSkgIT0gRU9GKSB7Ci0gICAgc3dpdGNoIChjKSB7Ci0gICAgY2FzZSAnYSc6Ci0JcmVncy0+YXggPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0JcmVncy0+YnggPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0JcmVncy0+Y3ggPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0JcmVncy0+ZHggPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnZSc6Ci0JcmVncy0+ZXMgPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0JcmVncy0+ZGkgPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50Ci1jaGtzdW0oQ0FSRDggKnN0YXJ0KQotewotICBDQVJEMTYgc2l6ZTsKLSAgQ0FSRDggdmFsID0gMDsKLSAgaW50IGk7Ci0KLSAgc2l6ZSA9ICooc3RhcnQrMikgKiA1MTI7Ci0gIGZvciAoaSA9IDA7IGk8c2l6ZTsgaSsrKQotICAgIHZhbCArPSAqKHN0YXJ0ICsgaSk7Ci0KLSAgaWYgKCF2YWwpCi0gICAgcmV0dXJuIDE7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwiQklPUyBja3N1bSB3cm9uZyFcbiIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncykKLXsKLSAgICBwcmludGYoImF4PSV4IGJ4PSV4IGN4PSV4IGR4PSV4IGVzPSV4IGRpPSV4XG4iLChDQVJEMTYpcmVncy0+YXgsCi0gICAgICAgKENBUkQxNilyZWdzLT5ieCwoQ0FSRDE2KXJlZ3MtPmN4LChDQVJEMTYpcmVncy0+ZHgsCi0gICAgICAgKENBUkQxNilyZWdzLT5lcywoQ0FSRDE2KXJlZ3MtPmRpKTsKLX0KLQotdm9pZAotbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4IGNvZGVbXSkKLXsKLSAgICBpbnQgaTsKLSAgICBDQVJEOCB2YWw7Ci0KLSAgICBmb3IgKCBpPTA7O2krKykgewotCXZhbCA9IGNvZGVbaV07Ci0JKnB0cisrID0gdmFsOwotCWlmICh2YWwgPT0gMHhmNCkgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZAotZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLSAgICBpbnQgaSxqOwotICAgIGNoYXIgKmMgPSAoY2hhciAqKXN0YXJ0OwotCi0gICAgZm9yIChqID0gMDsgaiA8IChzaXplID4+IDQpOyBqKyspIHsKLQlwcmludGYgKCJcbjB4JWx4OiAgIiwodW5zaWduZWQgbG9uZyljKTsKLQlmb3IgKGkgPSAwOyBpPDE2OyBpKyspCi0JICAgIHByaW50ZigiJXggIiwodW5zaWduZWQgY2hhcikgKCooYysrKSkpOwotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NvbW1hbmQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY29tbWFuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmJjZTZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY29tbWFuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KLSNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0KLSNkZWZpbmUgUFJPTVBUICI+IgotCi0KLXZvaWQKLWdldGxpbmUoY2hhciAqYnVmLGludCAqbnVtLGludCBtYXhfbnVtKQotewotICAgIHN0YXRpYyBpbnQgbGluZV9sZW4gPSAwOwotICAgIHN0YXRpYyBjaGFyICpsaW5lID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqbGluZV9wb2ludGVyID0gTlVMTDsKLSAgICBzdGF0aWMgaW50IGxlbiA9IDA7Ci0gICAgaW50IHRtcF9sZW47Ci0gICAgY2hhciAqYnVmZjsKLQotICAgIGlmIChsZW4gPD0gMCkgewotICAgIGJ1ZmYgPSByZWFkbGluZShQUk9NUFQpOwotICAgIGFkZF9oaXN0b3J5KGJ1ZmYpOwotCi0gICAgaWYgKCh0bXBfbGVuID0gc3RybGVuKGJ1ZmYpKSA+IGxpbmVfbGVuKSB7Ci0JZnJlZShsaW5lKTsKLQlsaW5lID0gbWFsbG9jKHRtcF9sZW4pOwotCWxpbmVfbGVuID0gdG1wX2xlbjsKLSAgICB9Ci0gICAgc3ByaW50ZihsaW5lLCIlc1xuIixidWZmKTsKLSAgICBmcmVlKGJ1ZmYpOwotICAgIGxpbmVfcG9pbnRlciA9IGxpbmU7Ci0gICAgbGVuID0gc3RybGVuKGxpbmUpOwotICAgIH0KLQotICAgICpudW0gPSBtYXhfbnVtID4gbGVuPyBsZW4gOiBtYXhfbnVtOwotICAgIHN0cm5jcHkoYnVmLGxpbmVfcG9pbnRlciwqbnVtKTsKLSAgICBsaW5lX3BvaW50ZXIgPSBsaW5lX3BvaW50ZXIgKyAqbnVtOwotICAgIGxlbiA9IGxlbiAtICpudW07Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NvbnNvbGUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY29uc29sZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTljOTI0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY29uc29sZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdnQuaD4KLSNpbmNsdWRlIDxzeXMva2QuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0KLWNvbnNvbGUKLW9wZW5fY29uc29sZSh2b2lkKQotewotICAgIGludCBmZDsKLSAgICBpbnQgVlRubzsKLSAgICBjaGFyIFZUbmFtZVsxMV07Ci0gICAgY29uc29sZSBDb24gPSB7LTEsLTF9OwotICAgIHN0cnVjdCB2dF9zdGF0IHZ0czsKLQotICAgIGlmIChOT19DT05TT0xFKQotCSAgICByZXR1cm4gQ29uOwotCi0gICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvdHR5MCIsT19XUk9OTFksMCkpIDwgMCkKLQlyZXR1cm4gQ29uOwotCi0gICAgaWYgKChpb2N0bChmZCwgVlRfT1BFTlFSWSwgJlZUbm8pIDwgMCkgfHwgKFZUbm8gPT0gLTEpKSB7Ci0JZnByaW50ZihzdGRlcnIsImNhbm5vdCBnZXQgYSB2dFxuIik7Ci0JcmV0dXJuIENvbjsKLSAgICB9Ci0KLSAgICBjbG9zZShmZCk7Ci0gICAgc3ByaW50ZihWVG5hbWUsIi9kZXYvdHR5JWkiLFZUbm8pOwotCi0gICAgaWYgKChmZCA9IG9wZW4oVlRuYW1lLCBPX1JEV1J8T19OREVMQVksIDApKSA8IDApIHsKLQlmcHJpbnRmKHN0ZGVyciwiY2Fubm90IG9wZW4gY29uc29sZVxuIik7Ci0JcmV0dXJuIENvbjsKLSAgICB9Ci0KLSAgICBpZiAoaW9jdGwoZmQsIFZUX0dFVFNUQVRFLCAmdnRzKSA9PSAwKQotCUNvbi52dCA9IHZ0cy52X2FjdGl2ZTsKLQotICAgIGlmIChpb2N0bChmZCwgVlRfQUNUSVZBVEUsIFZUbm8pICE9IDApIHsKLQlmcHJpbnRmKHN0ZGVyciwiY2Fubm90IGFjdGl2YXRlIGNvbnNvbGVcbiIpOwotCWNsb3NlKGZkKTsKLQlyZXR1cm4gQ29uOwotICAgIH0KLSAgICBpZiAoaW9jdGwoZmQsIFZUX1dBSVRBQ1RJVkUsIFZUbm8pICE9IDApIHsKLQlmcHJpbnRmKHN0ZGVyciwid2FpdCBmb3IgYWN0aXZlIGNvbnNvbGUgZmFpbGVkXG4iKTsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIENvbjsKLSAgICB9Ci0jaWYgMAotICAgIGlmIChpb2N0bChmZCwgS0RTRVRNT0RFLCBLRF9HUkFQSElDUykgPCAwKSB7Ci0JY2xvc2UoZmQpOwotCXJldHVybiBDb247Ci0gICAgfQotI2VuZGlmCi0gICAgQ29uLmZkID0gZmQ7Ci0gICAgcmV0dXJuIENvbjsKLX0KLQotdm9pZAotY2xvc2VfY29uc29sZShjb25zb2xlIENvbikKLXsKLSAgICBpZiAoQ29uLmZkID09IC0xKQotCXJldHVybjsKLQotI2lmIDAKLSAgICBpb2N0bChDb24uZmQsIEtEU0VUTU9ERSwgS0RfVEVYVCk7Ci0jZW5kaWYKLSAgICBpZiAoQ29uLnZ0ID49MCkKLQlpb2N0bChDb24uZmQsIFZUX0FDVElWQVRFLCBDb24udnQpOwotCi0gICAgY2xvc2UoQ29uLmZkKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvZGVidWcuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjOTA2Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotLyojZGVmaW5lIFY4NkJJT1NfREVCVUcgKi8KLQotLyoKLSAqIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIG5lZWRlZAotICogc2hvdWxkIGJlIGNvbW1hbmQgbGluZSBvcHRpb25zCi0gKi8KLQotI2RlZmluZSBQUklOVF9QT1JUIDAKLSNkZWZpbmUgSU9fU1RBVElTVElDUyAwCi0jZGVmaW5lIFBSSU5UX0lSUSAwCi0jZGVmaW5lIFBSSU5UX1BDSSAxCi0jZGVmaW5lIFBSSU5UX0lQIDAgICAgLyogcHJpbnQgSVAgYWRkcmVzcyB3aXRoIFBJTyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBUUkFDRSAwICAgICAgIC8qIHR1cm4gb24gZGVidWdnZXIgaW4geDg2ZW11ICAgICAgICAgICAgKi8KLQkJICAgICAgLyogcmVxdWlyZXMgeDg2ZW11IGNvbXBpbGVkIHdpdGggLURERUJVRyAqLwotCi0vKgotICogdGhlc2Ugc2hvdWxkIG5vdCBiZSBoZXJlLgotICogU2hvdWxkIGJlIGNvbnZlcnRlZCB0byBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLSAqLwotI2RlZmluZSBDT05GSUdfQUNUSVZFX09OTFkgMAotI2RlZmluZSBDT05GSUdfQUNUSVZFX0RFVklDRSAxCi0jZGVmaW5lIFNBVkVfQklPUyAwCi0jZGVmaW5lIE1BUF9TWVNfQklPUyAxCi0jZGVmaW5lIFJFU09SVCAxCi0jZGVmaW5lIEZJWF9ST00gMAotI2RlZmluZSBOT19DT05TT0xFIDAKLSNkZWZpbmUgU0hPV19BTExfREVWIDAKLSNkZWZpbmUgVkVSQk9TRSAwCi0KLS8qI2RlZmluZSBWX0JJT1MgMHhlMDAwMCAqLwotLyojZGVmaW5lIFZfQklPUyAweGU0MDAwICovCi0KLQotI2lmIChQUklOVF9JTyA9PSAxKSAmJiAoUFJJTlRfUE9SVCA9PSAwKQotIyBkZWZpbmUgUFJJTlRfSU8gMAotI2VuZGlmCi0jaWYgKElPX1NUQVRJU1RJQ1MgPT0gMSkgJiYgKFBSSU5UX1BPUlQgPT0gMCkKLSMgZGVmaW5lIElPX1NUQVRJU1RJQ1MgMAotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2hhcHB5X2NhcmRzIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9oYXBweV9jYXJkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzZDQ0ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2hhcHB5X2NhcmRzCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotV2hhdCBJIGhhZCB0byBkbyB0byBtYWtlIGNhcmRzIGhhcHB5OgotCi0xLiBUc2VuZyBFVDQwMDAgVzMyUAotVGhpcyBjYXJkIHdhbnRzIHRvIGNhbGwgdGhlIG9yaWdpbmFsIHN5c3RlbSBCSU9TIHZpZGVvIHJvdXRpbmVzLgotSXQgc2V0cyB0aGUgaW50IDB4NDIgdmVjdG9yIHRvIEYwMDA6RjA2NSwgdGhlIGVudHJ5IHBvaW50IHRvIHRoZQotc3lzdGVtIGJpb3MgdmlkZW8gcm91dGluZXMuIAotQ0FWRTogZG9uJ3QgY2F0Y2ggaW50IDB4NDIgYW5kIHVzZSB0aGUgdmJpb3MgaW50IDB4MTAgcm91dGluZXMuIAotQXQgZWFybHkgc3RhZ2UgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRoZXkgY2FsbCBpbnQgMHg0Mi4gVGhpcyAKLWNhdXNlcyBhbiBpbmZpbml0ZSBsb29wLgotCi0yLiBBVGkgTWFjaDY0IFJhZ2UgSUljIEFHUAotVGhpcyBjYXJkIGRvZXMgc2ltaWxhciB0aGluZ3MgbGlrZSB0aGUgVHNlbmcgRVQ0MDAwIFczMlAuCi1Ib3dldmVyIGl0IGRvZXNuJ3QgaGF2ZSB0aGUgcHJvYmxlbSB3aXRoIHRoZSBpbmluaXRlIGxvb3AuCi0KLTMuIEVsc2EgVmljdG9yeSBJSS1BMTYgQUdQIEJhbnNoZWUKLVRoaXMgY2FyZCBpcyB2ZXJ5IGNsZXZlcjogSXQga25vd3MgaXQgaXMgYW4gQUdQIGNhcmQuIFRoZXJlZm9yZQotaXQga25vd3MgaXQgaXMgYmVoaW5kIGEgUENJLVBDSSBicmlkZ2UuIEl0IGFsc28ga25vd3MgdGhhdCBub29uZQotZWxzZSBpcyBiZWhpbmQgdGhpcyBicmlkZ2UuIFRoZXJlZm9yZSBpdCBzdGFydCByZXByb2dyYW1taW5nIHRoZQotYnJpZGdlISBGb3IgdGhpcyBpdCBhc3N1bWVzIHRoZSBBR1AgYnJpZGdlIGlzIG9uIGJ1cyAxLgotCi00LiBFbHNhIEdsb3JpYSBTeW5lcmd5IDggVmlWbyBBR1AgUE0yCi1UaGlzIGNhcmQgbGlrZXMgdG8gc2VlIGEgY29tcGxldGUgaW50ZXJydXB0IHZlY3RvciB0YWJsZS4gSWYKLXdlIGZpbGwgdGhpcyB0YWJsZSB3aXRoIDAgdGhlIFZCSU9TIGRldGVjdHMgdGhpcyBhbmQgcXVpdHMgCi1pbml0aWFsaXphdGlvbi4KLQotNS4gRGltb25kIFZpcGVyIDMzMCBBR1AgTlZJRElBIFJpdmEgMTI4LgotVGhpcyBjYXJkIGhhcyBhIHNpbWlsYXIgcHJvYmxlbSBsaWtlIHRoZSBFbHNhIEdsb3JpYS4gSXQgd2FudHMKLXRvIHJlYWQgdGhlIHN5c3RlbSBCSU9TIGRhdGUgYXQgMHhmZmZmZC4KLQotNi4gTWF0cm94IE15c3RpcXVlIFBDSSAKLVRoaXMgY2FyZCByZWFkcyB0aGUgSU8gcG9ydCAweDYyLiBJZiBpdCBkb2Vzbid0IGxpa2Ugd2hhdCBpdCBzZWVzCi1pdCBsb29wcyBmb3JldmVyLiBUbyBrZWVwIHRoZSBjYXJkIGhhcHB5IHB1dCAweGZjIGludG8gMHhmZmZmZS4KLVRoaXMgbG9jYXRpb24gaG9sZHMgdGhlIHN5c3RlbSBtb2RlbCBpZC4gMHhmYyBtZWFucyBJQk0tQVQuCi0gT25lIGNhbiBtYWtlIGFuIGludGVyZXN0aW5nIG9ic2VydmF0aW9uOiB0aGlzIGNhcmQgbGlrZXMgdG8ga25vdyAKLXdpdGggd2hvbSBpdCBoYXMgdG8gc2hhcmUgdGhlIHN5c3RlbS4gVGhlcmVmb3JlIGl0IGFjY2Vzc2VzIFBDSSAKLWNvbmZpZyBzcGFjZSBvZiBhbGwgdGhlIG90aGVyIGNhcmRzLiBJdCBkb2VzIHRoaXMgYnlwYXNzaW5nIHRoZSAKLVBDSSBCSU9TIGJ5IHJlYWRpbmcgdGhlIFBDSSBhY2Nlc3MgcG9ydHMgZGlyZWN0bHkuCi0KLTcuIE1hdHJveCBHMTAwIEFHUAotVGhpcyBjYXJkIGhhcyB0aGUgc2FtZSBwcm9ibGVtIGFzIHRoZSBNeXN0aXF1ZS4gCi0KLUFwcGVyYW50bHkgdGhpcyB3b3JrcyBub3cuIEhvd2V2ZXIgbm90IGFsbCBjb21iaW5hdGlvbnMgb2YgY2FyZHMgYXJlCi1jaGVja2VkLCB5ZXQuCi0KLUZ1cnRoZXIgbm90ZXM6Ci10aGUgSU8gcmVnaXN0ZXIgMHg0Mi0weDQzIGFzIHdlbGwgYXMgMHg2MS0weDYzIGFyZSBvZiBzcGVjaWFsIGludGVyZXN0Ci1mb3IgbWFueSBncmFwaGljIGNhcmRzLiBUaGV5IHNob3VsZCBiZSBlbXVsYXRlZC4KLVRoZSBzbyBjYWxsZWQgIkluZHVzdHJ5IFN0YW5kYXJkIEJJT1MgRW50cnkgUG9pbnRzIiB0byBpbnQgMHg0MiAoMHhGRjA2NSkKLWFuZCB0byBpbnQgMHgxYSAoMHhGRkU2RSkgc2hvdWxkIGJlIGZpbGxlZCB3aXRoIHVzZWZ1bCBjb2RlLiBUaGlzIGNvZGUKLW5lZWRzIHRvIHJldHVybiBhcyBpZiBpdCB3YXMgY2FsbGVkIGFzIGludC4KLVRoZSBzdWJ2ZW5kb3IgSUQgUENJIHJlZ2lzdGVycyBtaWdodCBjYXVzZSBwcm9ibGVtcy4gT24gc29tZSBjaGlwc2V0cwotdGhleSBhcmUgcHJvZ3JhbW1lZCBpbiBhIG5vbi1vYml2b3VzIG5vbi1QQ0kgY29uZm9ybWFudCB3YXkuCi1WX0Jpb3NlcyBhcmUgc2VlbiB0byBtb2RpZnkgdGhlIGZvbGxvd2luZyBpbnQ6Ci0weDEwIChkZWZhdWx0IHZpZGVvKSwgMHgxZihmb250IHRhYmxlKSwgMHg0Mihjb3B5IG9mIGRlZmF1bHQgdmlkZW8pLCAKLTB4NDMgKD8/KSwgMHg2ZCAoY29weSBvZiBkZWZhdWx0IHZpZGVvIC0gc2FtZSBhcyAweDEwPykKLQotVE9ETzoKLUludCAweDZkIG5lZWRzIHRvIGJlIGRvbmUuCi1BbGwgaW50ZXJydXB0cyB3aGVyZSB0aGVyZSBpcyBubyBkZWZhdWx0IGluZHVzdHJ5IHN0YW5kYXJkIGVudHJ5IHBvaW50Ci1zaG91bGQgcG9pbnQgdG8gYW4gdW51c2VkIGxvY2F0aW9uIGluIHRoZSAweEYwMDAgc2VnbWFudCAocG9zc2libHkgCi0weEYwMDAwKS4gVGhpcyB3YXkgdGhleSBjb3VsZCBiZSB0cmFwcGVkLiBBIHRyYXAgaGFuZGxlciBmb3IKLWEuIGludCAweDQyIGFuZCBpbnQgMHgxYSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZC4KLVRoZSBkZWZhdWx0ICJpbmR1c3RyeSBlbnRyeSBwb2ludCIgZm9yIHZpZGVvIGFuZCBQQ0kgKDB4RkZFNkUpIHNob3VsZAotYWxzbyBiZSBpbXBsZW1lbnRlZC4gKGFueSBvdGhlcnM/KSBUaGV5IHNob3VsZCBlaXRoZXIgYmUgcm91dGVkIHRvCi1pbnQgMHg0MigweDZkPykgKHZpZGVvKSBhbmQgMHgxQSAoUENJKSBvciBzb21lIG90aGVyIGludGVycnVwdHMgdG8KLXRyYXAgdGhlbS4gTWFwcGluZyBvZiBzeXN0ZW0gYmlvcyBtaWdodCBub3QgYmUgYSBnb29kIGlkZWEuIE1heWJlCi10aGUgc3lzdGVtIGJpb3MgYXJlYSBzaG91bGQganVzdCBiZSBmaWxsZWQgd2l0aCAiaGx0IiB0byB0cmFwIGFueQotYWNjZXNzIHRoZXJlLgotSGFuZGxpbmcgb2YgdGltZXIgSU8gcmVnaXN0ZXJzIDB4NDIsIDB4NDMgYW5kIElPIHJlZ2lzdGVycyAweDYxLCAweDYyLgotCi1GaW5kIGRvY3VtZW50YXRpb246Ci0tIG9uIGludGVycnVwdCB2ZWN0b3IgdGFibGUKLS0gb24gaW5kdXN0cnkgc3RhbmRhcmQgZW50cnkgcG9pbnRzIHRvIHRoZSBzeXN0ZW0gYmlvcwotLSBvbiBJTyByZWdpc3RlcnMgMHg2MSBhbmQgMHg2MgotCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGV4ZHVtcCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGV4ZHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNTllNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2hleGR1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSIlMDYuNl9heCAgIiAgMTYvMSAiJTAyeCAiIAotIiAgIiAxNi8xICIlX3AiIAotIlxuIgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9pbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDRjNmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9pbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2luY2x1ZGUgImRlYnVnLmgiCi0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQotI2luY2x1ZGUgPHN5cy9pby5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jaW5jbHVkZSAiQXNtTWFjcm9zLmgiCi0jaW5jbHVkZSAicGNpLmgiCi0KLXN0YXRpYyBpbnQgaW50MUFfaGFuZGxlcihzdHJ1Y3QgcmVnczg2ICpyZWdzKTsKLXN0YXRpYyBpbnQgaW50NDJfaGFuZGxlcihpbnQgbnVtLCBzdHJ1Y3QgcmVnczg2ICpyZWdzKTsKLQotaW50Ci1pbnRfaGFuZGxlcihpbnQgbnVtLCBzdHJ1Y3QgcmVnczg2ICpyZWdzKQotewotICAgIHN3aXRjaCAobnVtKSB7Ci0gICAgY2FzZSAweDEwOgotICAgIGNhc2UgMHg0MjoKLQlyZXR1cm4gKGludDQyX2hhbmRsZXIobnVtLHJlZ3MpKTsKLSAgICBjYXNlIDB4MUE6Ci0JcmV0dXJuIChpbnQxQV9oYW5kbGVyKHJlZ3MpKTsKLSAgICBkZWZhdWx0OgotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaW50NDJfaGFuZGxlcihpbnQgbnVtLHN0cnVjdCByZWdzODYgKnJlZ3MpCi17Ci0gICAgdW5zaWduZWQgY2hhciBjOwotICAgIENBUkQzMiB2YWw7Ci0KLSAgICBpX3ByaW50ZigiaW50IDB4JXg6IGF4OjB4JWx4IGJ4OjB4JWx4IGN4OjB4JWx4IGR4OjB4JWx4XG4iLG51bSwKLQkgICByZWdzLT5lYXgscmVncy0+ZWJ4LCByZWdzLT5lY3gsIHJlZ3MtPmVkeCk7Ci0KLSAgICAvKgotICAgICAqIHZpZGVvIGJpb3MgaGFzIG1vZGlmaWVkIHRoZXNlIC0KLSAgICAgKiBsZWF2ZSBpdCB0byB0aGUgdmlkZW8gYmlvcyB0byBkbyB0aGlzCi0gICAgICovCi0KLSAgICB2YWwgPSBnZXRJbnRWZWN0KG51bSk7Ci0gICAgaWYgKHZhbCAhPSAweEYwMDBGMDY1KQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoKHJlZ3MtPmVieCAmIDB4ZmYpID09IDB4MzIpIHsKLQlzd2l0Y2ggKHJlZ3MtPmVheCAmIDB4RkZGRikgewotCWNhc2UgMHgxMjAwOgotCSAgICBpX3ByaW50ZigiZW5hYmxpbmcgdmlkZW9cbiIpOwotCSAgICBjID0gaW5iKDB4M2NjKTsKLQkgICAgYyB8PSAweDAyOwotCSAgICBvdXRiKDB4M2MyLGMpOwotCSAgICByZXR1cm4gMTsKLQljYXNlIDB4MTIwMToKLQkgICAgaV9wcmludGYoImRpc2FibGluZyB2aWRlb1xuIik7Ci0JICAgIGMgPSBpbmIoMHgzY2MpOwotCSAgICBjICY9IH4weDAyOwotCSAgICBvdXRiKDB4M2MyLGMpOwotCSAgICByZXR1cm4gMTsKLQlkZWZhdWx0OgotCX0KLSAgICB9Ci0gICAgaWYgKG51bSA9PSAweDQyKQotCXJldHVybiAxOwotICAgIGVsc2UKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBTVUNDRVNTRlVMICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIERFVklDRV9OT1RfRk9VTkQgICAgICAgIDB4ODYKLSNkZWZpbmUgQkFEX1JFR0lTVEVSX05VTUJFUiAgICAgMHg4NwotCi1zdGF0aWMgaW50Ci1pbnQxQV9oYW5kbGVyKHN0cnVjdCByZWdzODYgKnJlZ3MpCi17Ci0gICAgQ0FSRDMyIFNsb3Q7Ci0gICAgUGNpU3RydWN0UHRyIHBQY2k7Ci0KLSAgICBpZiAoISBDdXJyZW50UGNpKSByZXR1cm4gMDsgLyogb29wcyAqLwotCi0gICAgaV9wcmludGYoImludCAweDFhOiBheD0weCVseCBieD0weCVseCBjeD0weCVseCBkeD0weCVseCBkaT0weCVseCIKLQkgIiBzaT0weCVseFxuIiwgcmVncy0+ZWF4LHJlZ3MtPmVieCxyZWdzLT5lY3gscmVncy0+ZWR4LAotCSByZWdzLT5lZGkscmVncy0+ZXNpKTsKLSAgICBzd2l0Y2ggKHJlZ3MtPmVheCAmIDB4RkZGRikgewotICAgIGNhc2UgMHhiMTAxOgotCXJlZ3MtPmVheCAgJj0gMHhGRjAwOyAgIC8qIG5vIGNvbmZpZyBzcGFjZS9zcGVjaWFsIGN5Y2xlIHN1cHBvcnQgKi8KLQlyZWdzLT5lZHggPSAweDIwNDk0MzUwOyAvKiAiIElDUCIgKi8KLQlyZWdzLT5lYnggID0gMHgwMjEwOyAgICAvKiBWZXJzaW9uIDIuMTAgKi8KLQlyZWdzLT5lY3ggICY9IDB4RkYwMDsKLQlyZWdzLT5lY3ggfD0gKHBjaU1heEJ1cyAmIDB4RkYpOyAgIC8qIE1heCBidXMgbnVtYmVyIGluIHN5c3RlbSAqLwotCXJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JaV9wcmludGYoImF4PTB4JWx4IGR4PTB4JWx4IGJ4PTB4JWx4IGN4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLAotCQkgcmVncy0+ZWF4LHJlZ3MtPmVkeCxyZWdzLT5lYngscmVncy0+ZWN4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAweGIxMDI6Ci0JaWYgKCgocmVncy0+ZWR4ICYgMHhGRkZGKSA9PSBDdXJyZW50UGNpLT5WZW5kb3JJRCkgJiYKLQkgICAgKChyZWdzLT5lY3ggJiAweEZGRkYpID09IEN1cnJlbnRQY2ktPkRldmljZUlEKSAmJgotCSAgICAocmVncy0+ZXNpID09IDApKSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JICAgIHJlZ3MtPmVieCA9IHBjaVNsb3RCWChDdXJyZW50UGNpKTsKLQl9Ci0JZWxzZSBpZiAoQ29uZmlnLlNob3dBbGxEZXYgJiYKLQkgICAgIChwUGNpID0gZmluZFBjaURldmljZShyZWdzLT5lZHgscmVncy0+ZWN4LHJlZ3MtPmVzaSkpICE9IE5VTEwpIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQkgICAgcmVncy0+ZWJ4ID0gcGNpU2xvdEJYKHBQY2kpOwotCX0gZWxzZSAgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChERVZJQ0VfTk9UX0ZPVU5EIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLwotCX0KLQlpX3ByaW50ZigiYXg9MHglbHggYng9MHglbHggZmxhZ3M9MHglbHhcbiIsCi0JCSByZWdzLT5lYXgscmVncy0+ZWJ4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAweGIxMDM6Ci0JaWYgKCgocmVncy0+ZWN4ICYgMHhGRikgPT0gQ3VycmVudFBjaS0+SW50ZXJmYWNlKSAmJgotCSAgICAoKChyZWdzLT5lY3ggJiAweEZGMDApID4+IDgpID09IEN1cnJlbnRQY2ktPlN1YkNsYXNzKSAmJgotCSAgICAoKChyZWdzLT5lY3ggJiAweEZGRkYwMDAwKSA+PiAxNikgPT0gQ3VycmVudFBjaS0+QmFzZUNsYXNzKSAmJgotCSAgICAoKHJlZ3MtPmVzaSAmIDB4ZmYpID09IDApKSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVieCA9IHBjaVNsb3RCWChDdXJyZW50UGNpKTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQl9Ci0JZWxzZSBpZiAoQ29uZmlnLlNob3dBbGxEZXYKLQkgICAgICYmIChwUGNpID0gZmluZFBjaUNsYXNzKHJlZ3MtPmVjeCAmIDB4RkYsIChyZWdzLT5lY3ggJiAweGZmMDApID4+IDgsCi0JCQkgKHJlZ3MtPmVjeCAmIDB4ZmZmZjAwMDApID4+IDE2LCByZWdzLT5lc2kpKSAhPSBOVUxMKSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVieCA9IHBjaVNsb3RCWChwUGNpKTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQl9IGVsc2UgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChERVZJQ0VfTk9UX0ZPVU5EIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLwotCX0KLQlpX3ByaW50ZigiYXg9MHglbHggZmxhZ3M9MHglbHhcbiIscmVncy0+ZWF4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAweGIxMDg6Ci0JaV9wcmludGYoIlNsb3Q9MHgleFxuIixDdXJyZW50UGNpLT5TbG90LmwpOwotCWlmICgoU2xvdCA9IGZpbmRQY2kocmVncy0+ZWJ4KSkpIHsKLQkgICAgcmVncy0+ZWN4ICY9IDB4RkZGRkZGMDA7Ci0JICAgIHJlZ3MtPmVjeCB8PSBQY2lSZWFkOChyZWdzLT5lZGksU2xvdCk7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JfSBlbHNlIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoQkFEX1JFR0lTVEVSX05VTUJFUiA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KLQl9Ci0JaV9wcmludGYoImF4PTB4JWx4IGN4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLAotCQkgcmVncy0+ZWF4LHJlZ3MtPmVjeCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGNhc2UgMHhiMTA5OgotCWlfcHJpbnRmKCJTbG90PTB4JXhcbiIsQ3VycmVudFBjaS0+U2xvdC5sKTsKLQlpZiAoKFNsb3QgPSBmaW5kUGNpKHJlZ3MtPmVieCkpKSB7Ci0JICAgIHJlZ3MtPmVjeCAmPSAweEZGRkYwMDAwOwotCSAgICByZWdzLT5lY3ggfD0gUGNpUmVhZDE2KHJlZ3MtPmVkaSxTbG90KTsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQl9IGVsc2UgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChCQURfUkVHSVNURVJfTlVNQkVSIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLwotCX0KLQlpX3ByaW50ZigiYXg9MHglbHggY3g9MHglbHggZmxhZ3M9MHglbHhcbiIsCi0JCSByZWdzLT5lYXgscmVncy0+ZWN4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAweGIxMGE6Ci0JaV9wcmludGYoIlNsb3Q9MHgleFxuIixDdXJyZW50UGNpLT5TbG90LmwpOwotCWlmICgoU2xvdCA9IGZpbmRQY2kocmVncy0+ZWJ4KSkpIHsKLQkgICAgcmVncy0+ZWN4ICY9IDA7Ci0JICAgIHJlZ3MtPmVjeCB8PSBQY2lSZWFkMzIocmVncy0+ZWRpLFNsb3QpOwotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCX0gZWxzZSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKEJBRF9SRUdJU1RFUl9OVU1CRVIgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCi0JfQotCWlfcHJpbnRmKCJheD0weCVseCBjeD0weCVseCBmbGFncz0weCVseFxuIiwKLQkJIHJlZ3MtPmVheCxyZWdzLT5lY3gscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIDB4YjEwYjoKLQlpX3ByaW50ZigiU2xvdD0weCV4XG4iLEN1cnJlbnRQY2ktPlNsb3QubCk7Ci0JaWYgKChTbG90ID0gZmluZFBjaShyZWdzLT5lYngpKSkgewotCSAgICBQY2lXcml0ZTgocmVncy0+ZWRpLChDQVJEOClyZWdzLT5lY3gsU2xvdCk7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JfSBlbHNlIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoQkFEX1JFR0lTVEVSX05VTUJFUiA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KLQl9Ci0JaV9wcmludGYoImF4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLCByZWdzLT5lYXgscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIDB4YjEwYzoKLQlpX3ByaW50ZigiU2xvdD0weCV4XG4iLEN1cnJlbnRQY2ktPlNsb3QubCk7Ci0JaWYgKChTbG90ID0gZmluZFBjaShyZWdzLT5lYngpKSkgewotCSAgICBQY2lXcml0ZTE2KHJlZ3MtPmVkaSwoQ0FSRDE2KXJlZ3MtPmVjeCxTbG90KTsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQl9IGVsc2UgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChCQURfUkVHSVNURVJfTlVNQkVSIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLwotCX0KLQlpX3ByaW50ZigiYXg9MHglbHggZmxhZ3M9MHglbHhcbiIsIHJlZ3MtPmVheCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGNhc2UgMHhiMTBkOgotCWlfcHJpbnRmKCJTbG90PTB4JXhcbiIsQ3VycmVudFBjaS0+U2xvdC5sKTsKLQlpZiAoKFNsb3QgPSBmaW5kUGNpKHJlZ3MtPmVieCkpKSB7Ci0JICAgIFBjaVdyaXRlMzIocmVncy0+ZWRpLChDQVJEMzIpcmVncy0+ZWN4LFNsb3QpOwotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCX0gZWxzZSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKEJBRF9SRUdJU1RFUl9OVU1CRVIgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCi0JfQotCWlfcHJpbnRmKCJheD0weCVseCBmbGFncz0weCVseFxuIiwgcmVncy0+ZWF4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgZGVmYXVsdDoKLQlyZXR1cm4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2lvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNWI0M2UuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9pby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSAiZGVidWcuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQotI2luY2x1ZGUgPHN5cy9pby5oPgotI2VuZGlmCi0jaW5jbHVkZSAiQXNtTWFjcm9zLmgiCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotI2luY2x1ZGUgInBjaS5oIgotCi1pbnQgcl9pbmIgPSAwLCByX2ludyA9IDAsIHJfaW5sID0gMCwgcl9vdXRiID0gMCwgcl9vdXR3ID0gMCwgcl9vdXRsID0gMDsKLWludCBpbl9iID0gMCwgaW5fdyA9IDAsIGluX2wgPSAwLCBvdXRfYiA9IDAsIG91dF93ID0gMCwgb3V0X2wgPSAwOwotCi0KLWludAotcG9ydF9yZXBfaW5iKENBUkQxNiBwb3J0LCBDQVJEOCAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQotewotICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7Ci0gICAgQ0FSRDggKmRzdCA9IGJhc2U7Ci0KLSAgICBwX3ByaW50ZigiIHJlcF9pbnNiKCUjeCkgJWQgYnl0ZXMgYXQgJXAgJXMiLAotCSAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJfaW5iKys7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQkqZHN0ID0gaW5iKHBvcnQpOwotCWRzdCArPSBpbmM7Ci0gICAgfQotICAgIHJldHVybiAoZHN0LWJhc2UpOwotfQotCi1pbnQKLXBvcnRfcmVwX2ludyhDQVJEMTYgcG9ydCwgQ0FSRDE2ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGluYyA9IGRfZiA/IC0xIDogMTsKLSAgICBDQVJEMTYgKmRzdCA9IGJhc2U7Ci0KLSAgICBwX3ByaW50ZigiIHJlcF9pbnN3KCUjeCkgJWQgYnl0ZXMgYXQgJXAgJXMiLAotCSAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJfaW53Kys7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQkqZHN0ID0gaW53KHBvcnQpOwotCWRzdCArPSBpbmM7Ci0gICAgfQotICAgIHJldHVybiAoZHN0LWJhc2UpOwotfQotCi1pbnQKLXBvcnRfcmVwX2lubChDQVJEMTYgcG9ydCwgQ0FSRDMyICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGluYyA9IGRfZiA/IC0xIDogMTsKLSAgICBDQVJEMzIgKmRzdCA9IGJhc2U7Ci0KLSAgICBwX3ByaW50ZigiIHJlcF9pbnNsKCUjeCkgJWQgYnl0ZXMgYXQgJXAgJXMiLAotCSAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJfaW5sKys7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQkqZHN0ID0gaW5sKHBvcnQpOwotCWRzdCArPSBpbmM7Ci0gICAgfQotICAgIHJldHVybiAoZHN0LWJhc2UpOwotfQotCi1pbnQKLXBvcnRfcmVwX291dGIoQ0FSRDE2IHBvcnQsIENBUkQ4ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGluYyA9IGRfZiA/IC0xIDogMTsKLSAgICBDQVJEOCAqZHN0ID0gYmFzZTsKLQotICAgIHBfcHJpbnRmKCIgcmVwX291dGIoJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCi0JICAgICBwb3J0LCBjb3VudCwgYmFzZSwgZF9mPyJ1cCI6ImRvd24iKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcl9vdXRiKys7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQlvdXRiKHBvcnQsKmRzdCk7Ci0JZHN0ICs9IGluYzsKLSAgICB9Ci0gICAgcmV0dXJuIChkc3QtYmFzZSk7Ci19Ci0KLWludAotcG9ydF9yZXBfb3V0dyhDQVJEMTYgcG9ydCwgQ0FSRDE2ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGluYyA9IGRfZiA/IC0xIDogMTsKLSAgICBDQVJEMTYgKmRzdCA9IGJhc2U7Ci0KLSAgICBwX3ByaW50ZigiIHJlcF9vdXR3KCUjeCkgJWQgYnl0ZXMgYXQgJXAgJXMiLAotCSAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJfb3V0dysrOwotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0Jb3V0dyhwb3J0LCpkc3QpOwotCWRzdCArPSBpbmM7Ci0gICAgfQotICAgIHJldHVybiAoZHN0LWJhc2UpOwotfQotCi1pbnQKLXBvcnRfcmVwX291dGwoQ0FSRDE2IHBvcnQsIENBUkQzMiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQotewotICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7Ci0gICAgQ0FSRDMyICpkc3QgPSBiYXNlOwotCi0gICAgcF9wcmludGYoIiByZXBfb3V0bCglI3gpICVkIGJ5dGVzIGF0ICVwICVzIiwKLQkgICAgIHBvcnQsIGNvdW50LCBiYXNlLCBkX2Y/InVwIjoiZG93biIpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByX291dGwrKzsKLSAgICB3aGlsZSAoY291bnQtLSkgewotCW91dGwocG9ydCwqZHN0KTsKLQlkc3QgKz0gaW5jOwotICAgIH0KLSAgICByZXR1cm4gKGRzdC1iYXNlKTsKLX0KLQotQ0FSRDgKLXBfaW5iKENBUkQxNiBwb3J0KQotewotICAgIENBUkQ4IHZhbCA9IDA7Ci0gICAgaW5fYisrOwotICAgIHZhbCA9IGluYihwb3J0KTsKLSAgICBwX3ByaW50ZigiIGluYiglI3gpID0gJTIuMngiLHBvcnQsdmFsKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotQ0FSRDE2Ci1wX2ludyhDQVJEMTYgcG9ydCkKLXsKLSAgICBDQVJEMTYgdmFsID0gMDsKLSAgICBpbl93Kys7Ci0gICAgdmFsID0gaW53KHBvcnQpOwotICAgIHBfcHJpbnRmKCIgaW53KCUjeCkgPSAlNC40eCIscG9ydCx2YWwpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByZXR1cm4gdmFsOwotfQotCi1DQVJEMzIKLXBfaW5sKENBUkQxNiBwb3J0KQotewotICAgIENBUkQzMiB2YWwgPSAwOwotICAgIGluX2wrKzsKLSNpZmRlZiBORUVEX1BDSV9JTwotICAgIGlmIChjZmcxaW4ocG9ydCwmdmFsKSkKLQlyZXR1cm4gdmFsOwotICAgIGVsc2UKLSNlbmRpZgotICAgIHZhbCA9IGlubChwb3J0KTsKLSAgICBwX3ByaW50ZigiIGlubCglI3gpID0gJTguOHgiLHBvcnQsdmFsKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotdm9pZAotcF9vdXRiKENBUkQxNiBwb3J0LCBDQVJEOCB2YWwpCi17Ci0gICAgb3V0X2IrKzsKLSAgICBwX3ByaW50ZigiIG91dGIoJSN4LCAlMi4yeCkiLHBvcnQsdmFsKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgb3V0Yihwb3J0LHZhbCk7Ci19Ci0KLXZvaWQKLXBfb3V0dyhDQVJEMTYgcG9ydCwgQ0FSRDE2IHZhbCkKLXsKLSAgICBvdXRfdysrOwotICAgIHBfcHJpbnRmKCIgb3V0dyglI3gsICU0LjR4KSIscG9ydCx2YWwpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICBvdXR3KHBvcnQsdmFsKTsKLX0KLQotdm9pZAotcF9vdXRsKENBUkQxNiBwb3J0LCBDQVJEMzIgdmFsKQotewotICAgIG91dF9sKys7Ci0gICAgcF9wcmludGYoIiBvdXRsKCUjeCwgJTguOHgpIixwb3J0LHZhbCk7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotI2lmZGVmIE5FRURfUENJX0lPCi0gICAgaWYgKGNmZzFvdXQocG9ydCx2YWwpKQotCXJldHVybjsKLSNlbmRpZgotICAgIG91dGwocG9ydCx2YWwpOwotfQotCi12b2lkCi1pb19zdGF0aXN0aWNzKHZvaWQpCi17Ci0gICAgcF9wcmludGYoInJlcDogaW5iOiAlaSwgaW53OiAlaSwgaW5sOiAlaSwgb3V0YjogJWksIG91dHc6ICVpLCBvdXRsOiAlaVxuIiwKLQkgcl9pbmIscl9pbncscl9pbmwscl9vdXRiLHJfb3V0dyxyX291dGwpOwotICAgIHBfcHJpbnRmKCJpbmI6ICVpLCBpbnc6ICVpLCBpbmw6ICVpLCBvdXRiOiAlaSwgb3V0dzogJWksIG91dGw6ICVpXG4iLAotCSBpbl9iLGluX3csaW5fbCxvdXRfYixvdXRfdyxvdXRfbCk7Ci19Ci0KLXZvaWQKLWNsZWFyX3N0YXQodm9pZCkKLXsKLSAgICByX2luYiA9IHJfaW53ID0gcl9pbmwgPSByX291dGIgPSByX291dHcgPSByX291dGwgPSAwOwotICAgIGluX2IgPSBpbl93ID0gaW5fbCA9IG91dF9iID0gb3V0X3cgPSBvdXRfbCA9IDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2xleC5sIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9sZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzMzkxYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotJXsKLSNpbmNsdWRlICJwYXJzZXIuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSB2b2lkIGdldGxpbmUoY2hhciAqYnVmLGludCAqbnVtLGludCBtYXhfbnVtKTsKLSAgICAKLSNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkge1wKLSAgICAgIGdldGxpbmUoYnVmLCZyZXN1bHQsbWF4X3NpemUpO1wKLSAgICAgIH0KLQotIHZvaWQKLSB5eWVycm9yIChjaGFyICpzKSAgCi0gewotICAgICBwcmludGYgKCIlc1xuIiwgcyk7Ci0gfQotCi0lfQotCi1ESUdJVCBbMC05YS1mQS1GXQotCi0lJQotCi0iMHgiP3tESUdJVH0rIHsgeXlsdmFsID0gc3RydG9sKHl5dGV4dCxOVUxMLDApOyByZXR1cm4gVE9LX05VTTsgfQotImF4IiAgICAgICAgICB7IHJldHVybiBUT0tfUkVHX0FYOyB9Ci0iYngiICAgICAgICAgIHsgcmV0dXJuIFRPS19SRUdfQlg7IH0KLSJjeCIgICAgICAgICAgeyByZXR1cm4gVE9LX1JFR19DWDsgfQotImR4IiAgICAgICAgICB7IHJldHVybiBUT0tfUkVHX0RYOyB9Ci0iZGkiICAgICAgICAgIHsgcmV0dXJuIFRPS19SRUdfU0k7IH0KLSJzaSIgICAgICAgICAgeyByZXR1cm4gVE9LX1JFR19ESTsgfQotImRzIiAgICAgICAgICB7IHJldHVybiBUT0tfU0VHX0RTOyB9Ci0iZXMiICAgICAgICAgIHsgcmV0dXJuIFRPS19TRUdfRVM7IH0KLSI6IiAgICAgICAgICAgeyByZXR1cm4gVE9LX1NFUDt9Ci0iJCJ7RElHSVR9ezEsMn0geyB5eWx2YWwgPSBzdHJ0b2woeXl0ZXh0KzEsTlVMTCwwKTsgcmV0dXJuIFRPS19WQVI7IH0KLSIkbWVtIiAgICAgICAgeyByZXR1cm4gVE9LX1ZBUl9NRU07IH0KLVsgXHRdKwotIiMiLipbXG5dICAgeyByZXR1cm4gVE9LX0VORDsgfQotImJvb3QiICAgICAgICB7IHJldHVybiBUT0tfQ09NTUFORF9CT09UOyB9Ci0iZG8iICAgICAgICAgIHsgcmV0dXJuIFRPS19DT01NQU5EX0VYRUM7IH0KLSJcIiIuKiJcIiIgICAgeyB5eWx2YWwgPSAodW5zaWduZWQgbG9uZykgeXl0ZXh0OyByZXR1cm4gVE9LX1NUUklORzsgfQotImJ5dGUiICAgICAgICB7IHJldHVybiBUT0tfQllURTsgfQotIndvcmQiICAgICAgICB7IHJldHVybiBUT0tfV09SRDsgfQotImxvbmciICAgICAgICB7IHJldHVybiBUT0tfTE9ORzsgfQotInNldG1lbSIgICAgICB7IHJldHVybiBUT0tfQ09NTUFORF9NRU1TRVQ7IH0KLSJkdW1wbWVtIiAgICAgeyByZXR1cm4gVE9LX0NPTU1BTkRfTUVNRFVNUDsgfQotInF1aXQiICAgICAgICB7IHJldHVybiBUT0tfQ09NTUFORF9RVUlUOyB9Ci0iXG4iICAgICAgICAgIHsgcmV0dXJuIFRPS19FTkQ7IH0KLSJzZWxlY3QiICAgICAgeyByZXR1cm4gVE9LX1NFTEVDVDsgfQotImlzYSIgICAgICAgICB7IHJldHVybiBUT0tfSVNBOyB9Ci0icGNpIiAgICAgICAgIHsgcmV0dXJuIFRPS19QQ0k7IH0KLSJwcG9ydCIgICAgICAgeyByZXR1cm4gVE9LX1BSSU5UX1BPUlQ7IH0KLSJpb3N0YXQiICAgICAgeyByZXR1cm4gVE9LX0lPU1RBVDsgfQotInBpcnEiICAgICAgICB7IHJldHVybiBUT0tfUFJJTlRfSVJROyB9Ci0icHBjaSIgICAgICAgIHsgcmV0dXJuIFRPS19QUENJOyB9Ci0icGlwIiAgICAgICAgIHsgcmV0dXJuIFRPS19QSVA7IH0KLSJ0cmFjZSIgICAgICAgeyByZXR1cm4gVE9LX1RSQUNFOyB9Ci0ib24iICAgICAgICAgIHsgcmV0dXJuIFRPS19PTjsgfQotIm9mZiIgICAgICAgICB7IHJldHVybiBUT0tfT0ZGOyB9Ci0idmVyYm9zZSIgICAgIHsgcmV0dXJuIFRPS19WRVJCT1NFOyB9Ci0ibG9nIiAgICAgICAgIHsgcmV0dXJuIFRPS19MT0c7IH0KLSJwcmludCIgICAgICAgeyByZXR1cm4gVE9LX1NURE9VVDsgfQotImNsc3RhdCIgICAgICB7IHJldHVybiBUT0tfQ0xTVEFUOyB9Ci0iaGx0IiAgICAgICAgIHsgcmV0dXJuIFRPS19ITFQ7IH0KLSJkZWwiICAgICAgICAgeyByZXR1cm4gVE9LX0RFTDsgfQotImlvcGVybSIgICAgICB7IHJldHVybiBUT0tfSU9QRVJNOyB9Ci0ibHBjaSIgICAgICAgIHsgcmV0dXJuIFRPS19EVU1QX1BDSTsgfQotImJvb3RiaW9zIiAgICB7IHJldHVybiBUT0tfQk9PVF9CSU9TOyB9Ci0iPyIgICAgICAgICAgIHsgcmV0dXJuICc/JzsgfQotLiAgICAgICAgICAgICB7IHJldHVybiBUT0tfRVJST1I7IH0KLSAgICAKLSUlCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWFpbi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjkxMTUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNkZWZpbmUgREVMRVRFCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCi0jaW5jbHVkZSA8c3lzL2lvLmg+Ci0jZWxpZiBkZWZpbmVkKEhBVkVfU1lTX1BFUk0pCi0jaW5jbHVkZSA8c3lzL3Blcm0uaD4KLSNlbmRpZgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgotCi0jZGVmaW5lIFNJWkUgMHgxMDAwMDAKLSNkZWZpbmUgVlJBTV9TVEFSVCAweEEwMDAwCi0jZGVmaW5lIFZSQU1fU0laRSAweDFGRkZGCi0jZGVmaW5lIFZfQklPU19TSVpFIDB4MUZGRkYKLSNkZWZpbmUgQklPU19TVEFSVCAweDdDMDAgICAgICAgICAgICAvKiBkZWZhdWx0IEJJT1MgZW50cnkgKi8KLQotLypDQVJEOCBjb2RlW10gPSB7IDB4YjggLCAweGYwICwgMHhmMCwgMHhmNCB9OyAqLwotI2RlZmluZSBWQl9YKHgpIChWX0JJT1MgPj4geCkgJiAweEZGCi1DQVJEOCBjb2RlW10gPSB7IDB4OWEsIDB4MDMsIDB4MDAsIDB4MDAsIFZCX1goMTIpLCAweGY0IH07Ci0vKkNBUkQ4IGNvZGVbXSA9IHsgMHg5YSwgMHgwMywgMHgwMCwgMHgwMCwgVkJfWCgxMiksIDB4YjgsIDB4MDMsIDB4MDAsICovCi0vKjB4Y2QsIDB4MTAsIDB4ZjQgfTsgKi8KLS8qQ0FSRDggY29kZVtdID0geyAgMHhiOCAsIDB4ZjAgLCAweGYwICwweGY0IH07ICovCi0KLXN0YXRpYyB2b2lkIHNpZ19oYW5kbGVyKGludCk7Ci1zdGF0aWMgaW50IG1hcCh2b2lkKTsKLXN0YXRpYyB2b2lkIHVubWFwKHZvaWQpOwotc3RhdGljIHZvaWQgYm9vdEJJT1MoQ0FSRDE2IGF4KTsKLXN0YXRpYyBpbnQgbWFwX3ZyYW0odm9pZCk7Ci1zdGF0aWMgdm9pZCB1bm1hcF92cmFtKHZvaWQpOwotc3RhdGljIGludCBjb3B5X3ZiaW9zKHZvaWQpOwotc3RhdGljIGludCBjb3B5X3N5c19iaW9zKHZvaWQpOwotc3RhdGljIHZvaWQgc2F2ZV9iaW9zX3RvX2ZpbGUodm9pZCk7Ci1zdGF0aWMgaW50IHNldHVwX3N5c3RlbV9iaW9zKHZvaWQpOwotc3RhdGljIHZvaWQgc2V0dXBfaW50X3ZlY3Qodm9pZCk7Ci1zdGF0aWMgaW50IGNoa3N1bShDQVJEOCAqc3RhcnQpOwotc3RhdGljIHZvaWQgc2V0dXBfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MsIENBUkQzMiBheCk7Ci0KLXZvaWQgbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4ICpjb2RlKTsKLXZvaWQgZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLXN0YXRpYyBpbnQgdnJhbV9tYXBwZWQgPSAwOwotc3RhdGljIENBUkQ4IHNhdmVfbXNyOwotc3RhdGljIENBUkQ4IHNhdmVfcG9zMTAyOwotc3RhdGljIENBUkQ4IHNhdmVfdnNlOwotc3RhdGljIENBUkQ4IHNhdmVfNDZlODsKLWNvbnNvbGUgQ29uc29sZTsKLXN0cnVjdCBjb25maWcgQ29uZmlnOwotCi0KLWludAotbWFpbih2b2lkKQotewotICAgIGludCBBY3RpdmVfaXNfUGNpID0gMDsKLSNpZmRlZiBERUxFVEUKLSAgICBDb25maWcuUHJpbnRQb3J0ID0gUFJJTlRfUE9SVDsKLSAgICBDb25maWcuSW9TdGF0aXN0aWNzID0gSU9fU1RBVElTVElDUzsKLSAgICBDb25maWcuUHJpbnRJcnEgPSBQUklOVF9JUlE7Ci0gICAgQ29uZmlnLlByaW50UGNpID0gUFJJTlRfUENJOwotICAgIENvbmZpZy5TaG93QWxsRGV2ID0gU0hPV19BTExfREVWOwotICAgIENvbmZpZy5QcmludElwID0gUFJJTlRfSVA7Ci0gICAgQ29uZmlnLlNhdmVCaW9zID0gU0FWRV9CSU9TOwotICAgIENvbmZpZy5UcmFjZSA9IFRSQUNFOwotICAgIENvbmZpZy5Db25maWdBY3RpdmVPbmx5ID0gQ09ORklHX0FDVElWRV9PTkxZOwotICAgIENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgPSBDT05GSUdfQUNUSVZFX0RFVklDRTsKLSAgICBDb25maWcuTWFwU3lzQmlvcyA9IE1BUF9TWVNfQklPUzsKLSAgICBDb25maWcuUmVzb3J0ID0gUkVTT1JUOwotICAgIENvbmZpZy5GaXhSb20gPSBGSVhfUk9NOwotICAgIENvbmZpZy5Ob0NvbnNvbGUgPSBOT19DT05TT0xFOwotICAgIENvbmZpZy5WZXJib3NlID0gVkVSQk9TRTsKLQotICAgIGlmICghbWFwKCkpCi0JZXhpdCgxKTsKLQotICAgIGlmICghc2V0dXBfc3lzdGVtX2Jpb3MoKSkKLQlleGl0KDEpOwotCi0gICAgaW9wbCgzKTsKLSAgICBzZXR1cF9pbygpOwotCi0gICAgc2Nhbl9wY2koKTsKLSAgICBpZiAoIUN1cnJlbnRQY2kgJiYgIUNvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgJiYgIUNvbmZpZy5Db25maWdBY3RpdmVPbmx5KQotCWV4aXQgKDEpOwotI2VuZGlmCi0gICAgQ29uc29sZSA9IG9wZW5fY29uc29sZSgpOwotCi0gICAgaWYgKENvbmZpZy5Db25maWdBY3RpdmVPbmx5KSB7Ci0JQ0FSRDE2IGF4OwotCWludCBhY3RpdmVQY2kgPSAwOwotCWludCBlcnJvciA9IDA7Ci0KLQl3aGlsZSAoQ3VycmVudFBjaSkgewotCSAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKSB7Ci0JCWFjdGl2ZVBjaSA9IDE7Ci0JCQkgICAgaWYgKCEobWFwUGNpUm9tKE5VTEwpICYmIGNoa3N1bSgoQ0FSRDgqKVZfQklPUykpKQotCQkJCWVycm9yID0gMTsKLQkJCSAgICBicmVhazsKLQkgICAgfQotCSAgICBDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQl9Ci0JYXggPSAoKENBUkQxNikoQ3VycmVudFBjaS0+YnVzKSA8PCA4KQotCSAgICB8IChDdXJyZW50UGNpLT5kZXYgPDwgMykgfCAoQ3VycmVudFBjaS0+ZnVuYyAmIDB4Nyk7Ci0JUF9wcmludGYoImF4OiAweCV4XG4iLGF4KTsKLQlzZXR1cF9pbnRfdmVjdCgpOwotCWlmICghZXJyb3IgJiYgKGFjdGl2ZVBjaSB8fCBjb3B5X3ZiaW9zKCkpKSB7Ci0KLQkgICAgaWYgKENvbmZpZy5TYXZlQmlvcykgc2F2ZV9iaW9zX3RvX2ZpbGUoKTsKLQkgICAgaWYgIChtYXBfdnJhbSgpKSB7Ci0JCXByaW50ZigiaW5pdGlhbGl6aW5nIElTQVxuIik7Ci0JCQkgICAgYm9vdEJJT1MoMCk7Ci0JICAgIH0KLQl9Ci0JdW5tYXBfdnJhbSgpOwotCXNsZWVwKDEpOwotICAgIH0gZWxzZSB7Ci0JLyogZGlzYWJsZSBwcmltYXJ5IGNhcmQgKi8KLQlzYXZlX21zciA9IGluYigweDNDQyk7Ci0Jc2F2ZV92c2UgPSBpbmIoMHgzQzMpOwotCXNhdmVfNDZlOCA9IGluYigweDQ2ZTgpOwotCXNhdmVfcG9zMTAyID0gaW5iKDB4MTAyKTsKLQotCXNpZ25hbCgyLHNpZ19oYW5kbGVyKTsKLQlzaWduYWwoMTEsc2lnX2hhbmRsZXIpOwotCi0Jb3V0YigweDNDMix+KENBUkQ4KTB4MDMgJiBzYXZlX21zcik7Ci0Jb3V0YigweDNDMyx+KENBUkQ4KTB4MDEgJiBzYXZlX3ZzZSk7Ci0Jb3V0YigweDQ2ZTgsIH4oQ0FSRDgpMHgwOCAmIHNhdmVfNDZlOCk7Ci0Jb3V0YigweDEwMiwgfihDQVJEOCkweDAxICYgc2F2ZV9wb3MxMDIpOwotCi0JcGNpVmlkZW9EaXNhYmxlKCk7Ci0KLQl3aGlsZSAoQ3VycmVudFBjaSkgewotCSAgICBDQVJEMTYgYXg7Ci0KLQkgICAgaWYgKEN1cnJlbnRQY2ktPmFjdGl2ZSkgewotCQlBY3RpdmVfaXNfUGNpID0gMTsKLQkJaWYgKCFDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlKSB7Ci0JCSAgICBDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQotCSAgICBFbmFibGVDdXJyZW50KCk7Ci0KLQkgICAgaWYgKEN1cnJlbnRQY2ktPmFjdGl2ZSkgewotCQlvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7Ci0JCW91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOwotCQlvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7Ci0JCW91dGIoMHgzQzIsIHNhdmVfbXNyKTsKLQkgICAgfQotCi0JICAgIC8qIGNsZWFyIGludGVycnVwdCB2ZWN0b3JzICovCi0JICAgIHNldHVwX2ludF92ZWN0KCk7Ci0KLQkgICAgYXggPSAoKENBUkQxNikoQ3VycmVudFBjaS0+YnVzKSA8PCA4KQotCQl8IChDdXJyZW50UGNpLT5kZXYgPDwgMykgfCAoQ3VycmVudFBjaS0+ZnVuYyAmIDB4Nyk7Ci0JICAgIFBfcHJpbnRmKCJheDogMHgleFxuIixheCk7Ci0KLQkgICAgaWYgKCEoKG1hcFBjaVJvbShOVUxMKSAmJiBjaGtzdW0oKENBUkQ4KilWX0JJT1MpKQotCQkgIHx8IChDdXJyZW50UGNpLT5hY3RpdmUgJiYgY29weV92YmlvcygpKSkpIHsKLQkJQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIGlmICghbWFwX3ZyYW0oKSkgewotCQlDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgaWYgKENvbmZpZy5TYXZlQmlvcykgc2F2ZV9iaW9zX3RvX2ZpbGUoKTsKLQkgICAgcHJpbnRmKCJpbml0aWFsaXppbmcgUENJIGJ1czogJWkgZGV2OiAlaSBmdW5jOiAlaVxuIixDdXJyZW50UGNpLT5idXMsCi0JCSAgIEN1cnJlbnRQY2ktPmRldixDdXJyZW50UGNpLT5mdW5jKTsKLQkgICAgYm9vdEJJT1MoYXgpOwotCSAgICB1bm1hcF92cmFtKCk7Ci0KLQkgICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JfQotCi0JLyogV2UgaGF2ZSBhbiBJU0EgZGV2aWNlIC0gY29uZmlndXJlIGlmIHJlcXVlc3RlZCAqLwotCWlmICghQWN0aXZlX2lzX1BjaSAmJiBDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlKSB7Ci0JICAgIHBjaVZpZGVvRGlzYWJsZSgpOwotCi0JICAgIG91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKLQkgICAgb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7Ci0JICAgIG91dGIoMHgzQzMsIHNhdmVfdnNlKTsKLQkgICAgb3V0YigweDNDMiwgc2F2ZV9tc3IpOwotCi0JICAgIHNldHVwX2ludF92ZWN0KCk7Ci0JICAgIGlmIChjb3B5X3ZiaW9zKCkpIHsKLQotCQlpZiAoQ29uZmlnLlNhdmVCaW9zKSBzYXZlX2Jpb3NfdG9fZmlsZSgpOwotCQlpZiAgKG1hcF92cmFtKCkpIHsKLQkJICAgIHByaW50ZigiaW5pdGlhbGl6aW5nIElTQVxuIik7Ci0JCSAgICBib290QklPUygwKTsKLQkJfQotCSAgICB9Ci0KLQkgICAgdW5tYXBfdnJhbSgpOwotCSAgICBzbGVlcCgxKTsKLQl9Ci0KLQlwY2lWaWRlb1Jlc3RvcmUoKTsKLQotCW91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKLQlvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKLQlvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7Ci0Jb3V0YigweDNDMiwgc2F2ZV9tc3IpOwotICAgIH0KLQotICAgIGNsb3NlX2NvbnNvbGUoQ29uc29sZSk7Ci0jaWZkZWYgREVMRVRFCi0gICAgaW9wbCgwKTsKLSAgICB1bm1hcCgpOwotCi0gICAgcHJpbnRmKCJkb25lICFcbiIpOwotI2VuZGlmCi0gICAgaWYgKENvbmZpZy5Jb1N0YXRpc3RpY3MpCi0JaW9fc3RhdGlzdGljcygpOwotI2lmZGVmIERFTEVURQotICAgIGV4aXQoMCk7Ci0jZW5kaWYKLX0KLQotaW50Ci1tYXAodm9pZCkKLXsKLSAgICB2b2lkKiBtZW07Ci0KLSAgICBtZW0gPSBtbWFwKDAsIChzaXplX3QpU0laRSwKLQkgICAgICAgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgICAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwKLQkgICAgICAgLTEsIDAgKTsKLSAgICBpZiAobWVtICE9IDApIHsKLQlwZXJyb3IoImFub255bW91cyBtYXAiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLSAgICBtZW1zZXQobWVtLDAsU0laRSk7Ci0KLSAgICBsb2FkQ29kZVRvTWVtKCh1bnNpZ25lZCBjaGFyICopIEJJT1NfU1RBUlQsIGNvZGUpOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11bm1hcCh2b2lkKQotewotICAgIG11bm1hcCgwLFNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYm9vdEJJT1MoQ0FSRDE2IGF4KQotewotICAgIGk4NmJpb3NSZWdzIGJSZWdzOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBwcmludGYoInN0YXJ0aW5nIEJJT1NcbiIpOwotI2VuZGlmCi0gICAgc2V0dXBfYmlvc19yZWdzKCZiUmVncywgYXgpOwotICAgIGRvX3g4NihCSU9TX1NUQVJULCZiUmVncyk7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHByaW50ZigiZG9uZVxuIik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludAotbWFwX3ZyYW0odm9pZCkKLXsKLSAgICBpbnQgbWVtX2ZkOwotCi0jaWZkZWYgX19pYTY0X18KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSIHwgT19TWU5DKSk8MCkKLSNlbHNlCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApCi0jZW5kaWYKLSAgICAgIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZuZGVmIF9fYWxwaGFfXwotICAgIGlmIChtbWFwKCh2b2lkICopIFZSQU1fU1RBUlQsIChzaXplX3QpIFZSQU1fU0laRSwKLQkJICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELAotCQkgICAgIG1lbV9mZCwgVlJBTV9TVEFSVCkgPT0gKHZvaWQgKikgLTEpCi0jZWxzZQotCSBpZiAoIV9idXNfYmFzZSgpKSBzcGFyc2Vfc2hpZnQgPSA3OyAvKiBVaCwgb2gsIEpFTlNFTi4uLiAqLwotCSBpZiAoIV9idXNfYmFzZV9zcGFyc2UoKSkgc3BhcnNlX3NoaWZ0ID0gMDsKLQkgaWYgKCh2cmFtX21hcCA9IG1tYXAoMCwoc2l6ZV90KSAoVlJBTV9TSVpFIDw8IHNwYXJzZV9zaGlmdCksCi0JCQkJCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCQkJCSBNQVBfU0hBUkVELAotCQkJCQkJIG1lbV9mZCwgKFZSQU1fU1RBUlQgPDwgc3BhcnNlX3NoaWZ0KQotCQkJCQkJIHwgX2J1c19iYXNlX3NwYXJzZSgpKSkgPT0gKHZvaWQgKikgLTEpCi0jZW5kaWYKLSAgICAgIHsKLQlwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSIpOwotCSAgICBjbG9zZShtZW1fZmQpOwotCSAgICByZXR1cm4gKDApOwotCX0KLSAgICB2cmFtX21hcHBlZCA9IDE7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgdm9pZAotdW5tYXBfdnJhbSh2b2lkKQotewotICAgIGlmICghdnJhbV9tYXBwZWQpIHJldHVybjsKLQotICAgIG11bm1hcCgodm9pZCopVlJBTV9TVEFSVCxWUkFNX1NJWkUpOwotICAgIHZyYW1fbWFwcGVkID0gMDsKLX0KLQotc3RhdGljIGludAotY29weV92Ymlvcyh2b2lkKQotewotICAgIGludCBtZW1fZmQ7Ci0gICAgdW5zaWduZWQgY2hhciAqdG1wOwotICAgIGludCBzaXplOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSBWX0JJT1MsIFNFRUtfU0VUKSAhPSAob2ZmX3QpIFZfQklPUykgewotCSAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCBsc2Vla1xuIik7Ci0JICBnb3RvIEVycm9yOwotICAgICAgfQotICAgIHRtcCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKDMpOwotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKil0bXAsIChzaXplX3QpIDMpICE9IChzaXplX3QpIDMpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgVl9CSU9TLFNFRUtfU0VUKSAhPSAob2ZmX3QpIFZfQklPUykKLQlnb3RvIEVycm9yOwotCi0gICAgaWYgKCp0bXAgIT0gMHg1NSB8fCAqKHRtcCsxKSAhPSAweEFBICkgewotI2lmZGVmIERFQlVHCi0JZHByaW50KCh1bnNpZ25lZCBsb25nKXRtcCwweDEwMCk7Ci0jZW5kaWYKLQlmcHJpbnRmKHN0ZGVyciwiTm8gYmlvcyBmb3VuZCBhdDogMHgleFxuIixWX0JJT1MpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotICAgIHNpemUgPSAqKHRtcCsyKSAqIDUxMjsKLQotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKilWX0JJT1MsIChzaXplX3QpIHNpemUpICE9IChzaXplX3QpIHNpemUpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSAgICBmcmVlKHRtcCk7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICBpZiAoIWNoa3N1bSgoQ0FSRDgpVl9CSU9TKSkKLQlyZXR1cm4gKDApOwotCi0gICAgcmV0dXJuICgxKTsKLQotRXJyb3I6Ci0gICAgcGVycm9yKCJ2X2Jpb3MiKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfc3lzX2Jpb3Modm9pZCkKLXsKLSNkZWZpbmUgU1lTX0JJT1MgMHhGMDAwMAotICAgIGludCBtZW1fZmQ7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIFNZU19CSU9TLFNFRUtfU0VUKSAhPSAob2ZmX3QpIFNZU19CSU9TKQotCWdvdG8gRXJyb3I7Ci0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKVNZU19CSU9TLCAoc2l6ZV90KSAweEZGRkYpICE9IChzaXplX3QpIDB4RkZGRikKLQlnb3RvIEVycm9yOwotCi0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDEpOwotCi1FcnJvcjoKLSAgICBwZXJyb3IoInN5c19iaW9zIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDApOwotfQotCi12b2lkCi1sb2FkQ29kZVRvTWVtKHVuc2lnbmVkIGNoYXIgKnB0ciwgQ0FSRDggY29kZVtdKQotewotICAgIGludCBpOwotICAgIENBUkQ4IHZhbDsKLQotICAgIGZvciAoIGk9MDs7aSsrKSB7Ci0JdmFsID0gY29kZVtpXTsKLQkqcHRyKysgPSB2YWw7Ci0JaWYgKHZhbCA9PSAweGY0KSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi12b2lkCi1kcHJpbnQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotICAgIGludCBpLGo7Ci0gICAgY2hhciAqYyA9IChjaGFyICopc3RhcnQ7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgKHNpemUgPj4gNCk7IGorKykgewotICAgIGNoYXIgKmQgPSBjOwotICAgIHByaW50ZigiXG4weCVseDogICIsKHVuc2lnbmVkIGxvbmcpYyk7Ci0gICAgZm9yIChpID0gMDsgaTwxNjsgaSsrKQotCXByaW50ZigiJTIuMnggIiwodW5zaWduZWQgY2hhcikgKCooYysrKSkpOwotICAgIGMgPSBkOwotICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykgewotCXByaW50ZigiJWMiLCgoKChDQVJEOCkoKmMpKSA+IDMyKSAmJiAoKChDQVJEOCkoKmMpKSA8IDEyOCkpID8KLQkgICAodW5zaWduZWQgY2hhcikgKCooYykpOiAnLicpOwotCWMrKzsKLSAgICB9Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXNhdmVfYmlvc190b19maWxlKHZvaWQpCi17Ci0gICAgc3RhdGljIGludCBudW0gPSAwOwotICAgIGludCBzaXplLCBjb3VudDsKLSAgICBjaGFyIGZpbGVfbmFtZVsyNTZdOwotICAgIGludCBmZDsKLQotICAgIHNwcmludGYoZmlsZV9uYW1lLCJiaW9zXyVpLmZpbCIsbnVtKTsKLSAgICBpZiAoKGZkID0gIG9wZW4oZmlsZV9uYW1lLE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsMDA2NDQpKSA9PSAtMSkKLQlyZXR1cm47Ci0gICAgc2l6ZSA9ICgqKHVuc2lnbmVkIGNoYXIqKShWX0JJT1MgKyAyKSkgKiA1MTI7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIGRwcmludChWX0JJT1MsMjApOwotI2VuZGlmCi0gICAgaWYgKChjb3VudCA9IHdyaXRlKGZkLCh2b2lkICopKFZfQklPUyksc2l6ZSkpICE9IHNpemUpCi0JZnByaW50ZihzdGRlcnIsIm9ubHkgc2F2ZWQgJWkgb2YgJWkgYnl0ZXNcbiIsc2l6ZSxjb3VudCk7Ci0gICAgbnVtKys7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaWdfaGFuZGxlcihpbnQgdW51c2VkKQotewotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIGZmbHVzaChzdGRlcnIpOwotCi0gICAgLyogcHV0IHN5c3RlbSBiYWNrIGluIGEgc2F2ZSBzdGF0ZSAqLwotICAgIHVubWFwX3ZyYW0oKTsKLSAgICBwY2lWaWRlb1Jlc3RvcmUoKTsKLSAgICBvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7Ci0gICAgb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7Ci0gICAgb3V0YigweDNDMywgc2F2ZV92c2UpOwotICAgIG91dGIoMHgzQzIsIHNhdmVfbXNyKTsKLQotICAgIGNsb3NlX2NvbnNvbGUoQ29uc29sZSk7Ci0gICAgaW9wbCgwKTsKLSAgICB1bm1hcCgpOwotCi0gICAgZXhpdCgxKTsKLX0KLQotLyoKLSAqIEZvciBpbml0aWFsaXphdGlvbiB3ZSBqdXN0IHBhc3MgYXggdG8gdGhlIEJJT1MuCi0gKiBQQ0kgQklPU2VzIG5lZWQgdGhpcy4gQWxsIG90aGVyIHJlZ2lzdGVyIGFyZSBzZXQgMC4KLSAqLwotc3RhdGljIHZvaWQgc2V0dXBfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MsIENBUkQzMiBheCkKLXsKLSAgICByZWdzLT5heCA9IGF4OwotICAgIHJlZ3MtPmJ4ID0gMDsKLSAgICByZWdzLT5jeCA9IDA7Ci0gICAgcmVncy0+ZHggPSAwOwotICAgIHJlZ3MtPmVzID0gMDsKLSAgICByZWdzLT5kaSA9IDA7Ci19Ci0KLS8qCi0gKiBoZXJlIHdlIGFyZSByZWFsbHkgcGFyYW5vaWQgYWJvdXQgZmFraW5nIGEgInJlYWwiCi0gKiBCSU9TLiBNb3N0IG9mIHRoaXMgaW5mb3JtYXRpb24gd2FzIHB1bGxlZCBmcm9tCi0gKiBkb3NlbS4KLSAqLwotc3RhdGljIHZvaWQKLXNldHVwX2ludF92ZWN0KHZvaWQpCi17Ci0gICAgY29uc3QgQ0FSRDE2IGNzID0gMHgwMDAwOwotICAgIGNvbnN0IENBUkQxNiBpcCA9IDB4MDsKLSAgICBpbnQgaTsKLQotICAgIC8qIGxldCB0aGUgaW50IHZlY3RzIHBvaW50IHRvIHRoZSBTWVNfQklPUyBzZWcgKi8KLSAgICBmb3IgKGk9MDsgaTwweDgwOyBpKyspIHsKLQkoKENBUkQxNiopMClbaTw8MV0gPSBpcDsKLQkoKENBUkQxNiopMClbKGk8PDEpKzFdID0gY3M7Ci0gICAgfQotICAgIC8qIHZpZGVvIGludGVycnVwdHMgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHg0Mjw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4NDI8PDFdID0gMHhmMDY1OwotICAgICgoQ0FSRDE2KikwKVsoMHgxMDw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTA8PDFdID0gMHhmMDY1OwotICAgIC8qIHZpZGVvIHBhcmFtIHRhYmxlIGRlZmF1bHQgbG9jYXRpb24gKGludCAxZCkgKi8KLSAgICAoKENBUkQxNiopMClbKDB4MWQ8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDFkPDwxXSA9IDB4ZjBBNDsKLSAgICAvKiBmb250IHRhYmxlcyBkZWZhdWx0IGxvY2F0aW9uIChpbnQgMUYpICovCi0gICAgKChDQVJEMTYqKTApWygweDFmPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxZjw8MV0gPSAweGZhNmU7Ci0KLSAgICAvKiBpbnQgMTEgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxMTwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxMTw8MV0gPSAweGY4NGQ7Ci0gICAgLyogaW50IDEyIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTI8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDEyPDwxXSA9IDB4Zjg0MTsKLSAgICAvKiBpbnQgMTUgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxNTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTU8PDFdID0gMHhmODU5OwotICAgIC8qIGludCAxQSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDFhPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxYTw8MV0gPSAweGZmNmU7Ci0gICAgLyogaW50IDA1IGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MDU8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDA1PDwxXSA9IDB4ZmY1NDsKLSAgICAvKiBpbnQgMDggZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHg4PDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHg4PDwxXSA9IDB4ZmVhNTsKLSAgICAvKiBpbnQgMTMgZGVmYXVsdCBsb2NhdGlvbiAoZmRkKSAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxMzw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTM8PDFdID0gMHhlYzU5OwotICAgIC8qIGludCAwRSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweGU8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweGU8PDFdID0gMHhlZjU3OwotICAgIC8qIGludCAxNyBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDE3PDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxNzw8MV0gPSAweGVmZDI7Ci0gICAgLyogZmRkIHRhYmxlIGRlZmF1bHQgbG9jYXRpb24gKGludCAxZSkgKi8KLSAgICAoKENBUkQxNiopMClbKDB4MWU8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDFlPDwxXSA9IDB4ZWZjNzsKLX0KLQotc3RhdGljIGludAotc2V0dXBfc3lzdGVtX2Jpb3Modm9pZCkKLXsKLSAgICBjaGFyICpkYXRlID0gIjA2LzAxLzk5IjsKLSAgICBjaGFyICplaXNhX2lkZW50ID0gIlBDSS9JU0EiOwotCi0jaWYgTUFQX1NZU19CSU9TCi0gICAgaWYgKCFjb3B5X3N5c19iaW9zKCkpIHJldHVybiAwOwotICAgIHJldHVybiAxOwotI2VuZGlmCi0vKiAgICBtZW1zZXQoKHZvaWQgKikweEYwMDAwLDB4ZjQsMHhmZmY3KTsgKi8KLQotICAgIC8qCi0gICAgICogd2UgdHJhcCB0aGUgImluZHVzdHJ5IHN0YW5kYXJkIGVudHJ5IHBvaW50cyIgdG8gdGhlIEJJT1MKLSAgICAgKiBhbmQgYWxsIG90aGVyIGxvY2F0aW9ucyBieSBmaWxsaW5nIHRoZW0gd2l0aCAiaGx0IgotICAgICAqIFRPRE86IGltcGxlbWVudCBobHQtaGFuZGxlciBmb3IgdGhlc2UKLSAgICAgKi8KLSAgICBtZW1zZXQoKHZvaWQgKikweEYwMDAwLDB4ZjQsMHgxMDAwMCk7Ci0KLSAgICAvKgotICAgICAqIFRPRE86IHdlIHNob3VsZCBjb3B5IHRoZSBmZGQgdGFibGUgKDB4ZmVjNTktMHhmZWM1YikKLSAgICAgKiB0aGUgdmlkZW8gcGFyYW1ldGVyIHRhYmxlICgweGYwYWMtMHhmMGZiKQotICAgICAqIGFuZCB0aGUgZm9udCB0YWJsZXMgKDB4ZmE2ZS0weGZlNmQpCi0gICAgICogZnJvbSB0aGUgb3JpZ2luYWwgYmlvcyBoZXJlCi0gICAgICovCi0KLSAgICAvKiBzZXQgYmlvcyBkYXRlICovCi0gICAgc3RyY3B5KChjaGFyICopMHhGRkZGNSxkYXRlKTsKLSAgICAvKiBzZXQgdXAgZWlzYSBpZGVudCBzdHJpbmcgKi8KLSAgICBzdHJjcHkoKGNoYXIgKikweEZGRkQ5LGVpc2FfaWRlbnQpOwotICAgIC8qIHdyaXRlIHN5c3RlbSBtb2RlbCBpZCBmb3IgSUJNLUFUICovCi0gICAgKChjaGFyICopMClbMHhGRkZGRV0gPSAweGZjOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoa3N1bShDQVJEOCAqc3RhcnQpCi17Ci0gIENBUkQxNiBzaXplOwotICBDQVJEOCB2YWwgPSAwOwotICBpbnQgaTsKLQotICBzaXplID0gKihzdGFydCsyKSAqIDUxMjsKLSAgZm9yIChpID0gMDsgaTxzaXplOyBpKyspCi0gICAgdmFsICs9ICooc3RhcnQgKyBpKTsKLQotICBpZiAoIXZhbCkKLSAgICByZXR1cm4gMTsKLQotICAgIGZwcmludGYoc3RkZXJyLCJCSU9TIGNrc3VtIHdyb25nIVxuIik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tYWtlZmlsZS5saW51eCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWFrZWZpbGUubGludXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmUzMDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tYWtlZmlsZS5saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLUNGTEFHUz0tZyAtSS91c3IvaW5jbHVkZSAtSS4uLy4uL2luY2x1ZGUvIC1PMCAtV2FsbAotQ0M9Z2NjCi0KLS55LmM6Ci0gICAgYmlzb24gLWQgLW8gJEAgJDwKLS5sLmM6Ci0gICAgZmxleCAtbyRAICQ8IAotCi1TUkNTID0gbWFpbi5jIGlvLmMgeDg2ZW11LmMgaW50LmMgcGNpLmMKLU9CSlMgPSBtYWluLm8gaW8ubyB4ODZlbXUubyBpbnQubyBwY2kubwotCi1hbGwgOiB2Ymlvcy52bTg2IHY4NmJpb3Mudm04NiBjYmlvcy52bTg2IGNiaW9zLng4NmVtdSB2Ymlvcy54ODZlbXUgdjg2Ymlvcy54ODZlbXUgCi0jYWxsIDogIGNiaW9zLng4NmVtdSB2Ymlvcy54ODZlbXUgdjg2Ymlvcy54ODZlbXUgCi0KLXBhcnNlci5jIDogcGFyc2VyLnkKLWxleC5jIDogbGV4LmwKLWNiaW9zLm8gOiBjYmlvcy5jIHY4NmJpb3MuaCBkZWJ1Zy5oCi1tYWluLm8gOiBtYWluLmMgdjg2Ymlvcy5oIHBjaS5oIGRlYnVnLmgKLWlvLm8gOiB2ODZiaW9zLmggQXNtTWFjcm9zLmggZGVidWcuaAotbWVtLm8gOiBtZW0uYyBkZWJ1Zy5oIHY4NmJpb3MuaAotaW50Lm8gOiBpbnQuYyB2ODZiaW9zLmggZGVidWcuaAotcGNpLm8gOiBwY2kuYyBwY2kuaCBkZWJ1Zy5oCi1jb25zb2xlLm8gOiBjb25zb2xlLmMgdjg2Ymlvcy5oIGRlYnVnLmgKLXY4Ni5vIDogdjg2LmMgZGVidWcuaAotcGFyc2VyLm8gOiBwYXJzZXIuYwotbGV4Lm8gOiBsZXguYwotdjg2Ymlvcy5vOiB2ODZiaW9zLmMgdjg2Ymlvcy5oIHBjaS5oIGRlYnVnLmgKLWxvZ2dpbmcubzogbG9nZ2luZy5jIHY4NmJpb3MuaAoteDg2ZW11Lm8gOiB4ODZlbXUuYyB2ODZiaW9zLmggZGVidWcuaAotICAgICQoQ0MpIC1jIC1EWDg2RU1VICQoQ0ZMQUdTKSAkKi5jCi0KLXZiaW9zLng4NmVtdSA6IG1haW4ubyB4ODZlbXUubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBtZW0ubyBsb2dnaW5nLm8KLSAgICBnY2MgLVdsLC1kZWZzeW0gLVdsLHByaW50az1scHJpbnRmIC1vIHZiaW9zLng4NmVtdSBtYWluLm8gXAotICAgIHg4NmVtdS5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIG1lbS5vIGxvZ2dpbmcubyBcCi0gICAgLUwuLi94ODZlbXUgLWx4ODZlbXVkIC1sYyAKLXZiaW9zLnZtODYgOiBtYWluLm8gdjg2Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbG9nZ2luZy5vCi0gICAgZ2NjIC1vIHZiaW9zLnZtODYgbWFpbi5vIHY4Ni5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIFwKLSAgICBsb2dnaW5nLm8gLWxjIAotY2Jpb3MueDg2ZW11IDogY2Jpb3MubyB4ODZlbXUubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBtZW0ubyBsb2dnaW5nLm8KLSAgICBnY2MgLVdsLC1kZWZzeW0gLVdsLHByaW50az1scHJpbnRmIC1vIGNiaW9zLng4NmVtdSBjYmlvcy5vIFwKLSAgICB4ODZlbXUubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBtZW0ubyBsb2dnaW5nLm8gXAotICAgIC1MLi4veDg2ZW11IC1seDg2ZW11ZCAtbGMgCi1jYmlvcy52bTg2IDogY2Jpb3MubyB2ODYubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBsb2dnaW5nLm8KLSAgICBnY2MgLW8gY2Jpb3Mudm04NiBjYmlvcy5vIHY4Ni5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIFwKLSAgICBsb2dnaW5nLm8gLWxjIAotdjg2Ymlvcy52bTg2OiBjb21tYW5kLm8gcGFyc2VyLm8gbGV4Lm8gdjg2Ymlvcy5vIHY4Ni5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubwotICAgICBnY2MgLW8gdjg2Ymlvcy52bTg2IGNvbW1hbmQubyBwYXJzZXIubyBsZXgubyB2ODZiaW9zLm8gdjg2Lm8gaW8ubyBcCi0gICAgIGludC5vIHBjaS5vIGNvbnNvbGUubyBsb2dnaW5nLm8gLUwvdXNyL2xpYi9jdXJzZXMgLWxmbCBcCi0gICAgIC1scmVhZGxpbmUgLWxjIC1sbmN1cnNlcyAvdXNyL2xpYi9saWJjLmEKLXY4NmJpb3MueDg2ZW11OiBjb21tYW5kLm8gcGFyc2VyLm8gbGV4Lm8gdjg2Ymlvcy5vIHg4NmVtdS5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubwotICAgIGdjYyAtV2wsLWRlZnN5bSAtV2wscHJpbnRrPWxwcmludGYgLW8gdjg2Ymlvcy54ODZlbXUgXAotICAgIGNvbW1hbmQubyBwYXJzZXIubyBsZXgubyB2ODZiaW9zLm8geDg2ZW11Lm8gaW8ubyBcCi0gICAgaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubyAtTC91c3IvbGliL2N1cnNlcyAtbGZsIFwKLSAgICAtbHJlYWRsaW5lIC1sYyAtbG5jdXJzZXMgIC91c3IvbGliL2xpYmMuYSAtTC4uL3g4NmVtdSAtbHg4NmVtdWQKLQotY2xlYW46Ci0gICAgcm0gLWYgKi5vIHZiaW9zLng4NmVtdSB2Ymlvcy52bTg2IGNiaW9zLng4NmVtdSBjYmlvcy52bTg2IHBhcnNlci5jIFwKLSAgICBsZXguYyBwYXJzZXIuaCB2ODZiaW9zLng4NmVtdSB2ODZiaW9zLnZtODYKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tZW0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzFhZWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotI2luY2x1ZGUgIng4NmVtdS5oIgotCi0jaWZkZWYgX19hbHBoYV9fCi0KLXZvaWQqIHZyYW1fbWFwID0gMDsKLWludCBzcGFyc2Vfc2hpZnQgPSA1OwotCi0jZGVmaW5lIG1lbV9iYXJyaWVyKCkgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtYiIgIDogOiA6ICJtZW1vcnkiKQotCi0jZGVmaW5lIHZ1aXAgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50ICoKLQotQ0FSRDgKLW1lbV9yYihDQVJEMzIgYWRkcikKLXsKLSAgdW5zaWduZWQgbG9uZyByZXN1bHQsIHNoaWZ0OwotI2lmIDEKLSAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKLSAgICBhZGRyIC09IDB4QTAwMDA7Ci0gICAgc2hpZnQgPSAoYWRkciAmIDB4MykgKiA4OwotICAgIHJlc3VsdCA9ICoodnVpcCkgKCh1bnNpZ25lZCBsb25nKXZyYW1fbWFwICsgKGFkZHIgPDwgc3BhcnNlX3NoaWZ0KSk7Ci0gICAgcmVzdWx0ID4+PSBzaGlmdDsKLSAgICByZXR1cm4gMHhmZlVMICYgcmVzdWx0OwotICB9IGVsc2UKLSNlbmRpZgotICAgIHJldHVybiByZGIoYWRkcik7Ci19Ci0KLUNBUkQxNgotbWVtX3J3KENBUkQzMiBhZGRyKQotewotICB1bnNpZ25lZCBsb25nIHJlc3VsdCwgc2hpZnQ7Ci0jaWYgMQotICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikgewotICAgIGFkZHIgLT0gMHhBMDAwMDsKLSAgICBzaGlmdCA9IChhZGRyICYgMHgyKSAqIDg7Ci0gICAgcmVzdWx0ID0gKih2dWlwKSgodW5zaWduZWQgbG9uZyl2cmFtX21hcCsoYWRkcjw8c3BhcnNlX3NoaWZ0KQotCSAgICAgKygxPDwoc3BhcnNlX3NoaWZ0LTIpKSk7Ci0gICAgcmVzdWx0ID4+PSBzaGlmdDsKLSAgICByZXR1cm4gMHhmZmZmVUwgJiByZXN1bHQ7Ci0gIH0gZWxzZQotI2VuZGlmCi0gICAgcmV0dXJuIHJkdyhhZGRyKTsKLX0KLQotQ0FSRDMyCi1tZW1fcmwoQ0FSRDMyIGFkZHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgcmVzdWx0OwotI2lmIDEKLSAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKLSAgICBhZGRyIC09IDB4QTAwMDA7Ci0gICAgcmVzdWx0ID0gKih2dWlwKSgodW5zaWduZWQgbG9uZyl2cmFtX21hcCsoYWRkcjw8c3BhcnNlX3NoaWZ0KSsoMzw8KHNwYXJzZV9zaGlmdC0yKSkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gZWxzZQotI2VuZGlmCi0gICAgcmV0dXJuIHJkbChhZGRyKTsKLX0KLQotdm9pZAotbWVtX3diKENBUkQzMiBhZGRyLCBDQVJEOCB2YWwpCi17Ci0gICAgdW5zaWduZWQgaW50IGIgPSB2YWwgJiAweGZmVTsKLSNpZiAxCi0gIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSB7Ci0gICAgYWRkciAtPSAweEEwMDAwOwotICAgICoodnVpcCkgKCh1bnNpZ25lZCBsb25nKXZyYW1fbWFwICsgKGFkZHIgPDwgc3BhcnNlX3NoaWZ0KSkgPSBiICogMHgwMTAxMDEwMTsKLSAgICBtZW1fYmFycmllcigpOwotICB9IGVsc2UKLSNlbmRpZgotICAgIHdyYihhZGRyLHZhbCk7Ci19Ci0KLXZvaWQKLW1lbV93dyhDQVJEMzIgYWRkciwgQ0FSRDE2IHZhbCkKLXsKLSAgdW5zaWduZWQgaW50IHcgPSB2YWwgJiAweGZmZmZVOwotI2lmIDEKLSAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKLSAgICBhZGRyIC09IDB4QTAwMDA7Ci0gICAgKih2dWlwKSgodW5zaWduZWQgbG9uZyl2cmFtX21hcCsoYWRkcjw8c3BhcnNlX3NoaWZ0KQotCSsoMTw8KHNwYXJzZV9zaGlmdC0yKSkpID0gdyAqIDB4MDAwMTAwMDE7Ci0gICAgbWVtX2JhcnJpZXIoKTsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgICB3cncoYWRkcix2YWwpOwotfQotCi12b2lkCi1tZW1fd2woQ0FSRDMyIGFkZHIsIENBUkQzMiB2YWwpCi17Ci0jaWYgMQotICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikgewotICAgIGFkZHIgLT0gMHhBMDAwMDsKLSAgICAqKHZ1aXApKCh1bnNpZ25lZCBsb25nKXZyYW1fbWFwKyhhZGRyPDxzcGFyc2Vfc2hpZnQpCi0JKygzPDwoc3BhcnNlX3NoaWZ0LTIpKSkgPSB2YWw7Ci0gICAgbWVtX2JhcnJpZXIoKTsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgICB3cmwoYWRkcix2YWwpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BhcnNlci55IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wYXJzZXIueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNDAyMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BhcnNlci55CisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLSV7Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAidjg2Ymlvcy5oIgotI2luY2x1ZGUgInBjaS5oIgotICAgIAotI2RlZmluZSBZWVNUWVBFIHVuc2lnbmVkIGxvbmcKLSAgICAKLSNkZWZpbmUgTUFYX1ZBUiAweDIwCi0KLSAgICBDQVJEMzIgdmFyW01BWF9WQVJdOwotICAgIENBUkQzMiB2YXJfbWVtOwotCi0KLWk4NmJpb3NSZWdzIHJlZ3MgPSB7IDAwIH07Ci0KLWVudW0gbWVtX3R5cGUgeyBCWVRFLCBXT1JELCBMT05HLCBTVFJJTkcgfTsKLXVuaW9uIG1lbV92YWwgewotICAgQ0FSRDMyIGludGVnZXI7Ci0gICBjaGFyICpwdHI7Ci19IHJlYzsKLQotc3RydWN0IG1lbSB7Ci0gICAgZW51bSBtZW1fdHlwZSB0eXBlOwotICAgICAgICB1bmlvbiBtZW1fdmFsIHZhbDsKLSAgICBzdHJ1Y3QgbWVtICpuZXh0OwotfTsgCi0KLSAKLXN0cnVjdCBkZXZpY2UgRGV2aWNlID0ge0ZBTFNFLE5PTkUsezB9fTsKLQotZXh0ZXJuIHZvaWQgeXllcnJvcihjaGFyICpzKTsKLWV4dGVybiBpbnQgeXlsZXgoIHZvaWQgICk7Ci0gCi1zdGF0aWMgdm9pZCBib290KHZvaWQpOwotc3RhdGljIHZvaWQgZHVtcF9tZW0oQ0FSRDMyIGFkZHIsIGludCBsZW4pOwotc3RhdGljIHZvaWQgZXhlY19pbnQoaW50IG51bSk7Ci1zdGF0aWMgdm9pZCAqYWRkX3RvX2xpc3QoZW51bSBtZW1fdHlwZSB0eXBlLCB1bmlvbiBtZW1fdmFsICpyZWMsIHZvaWQgKm5leHQpOwotc3RhdGljIHZvaWQgZG9fbGlzdChzdHJ1Y3QgbWVtICpsaXN0LCBtZW1UeXBlIGFkZHIpOwotc3RhdGljIGNoYXIgKiBub3JtYWxpemVfc3RyaW5nKGNoYXIgKnB0cik7Ci0lfQotCi0ldG9rZW4gVE9LX05VTQotJXRva2VuIFRPS19SRUdfQVgKLSV0b2tlbiBUT0tfUkVHX0JYCi0ldG9rZW4gVE9LX1JFR19DWAotJXRva2VuIFRPS19SRUdfRFgKLSV0b2tlbiBUT0tfUkVHX0RJCi0ldG9rZW4gVE9LX1JFR19TSQotJXRva2VuIFRPS19TRUdfRFMKLSV0b2tlbiBUT0tfU0VHX0VTCi0ldG9rZW4gVE9LX1NFUAotJXRva2VuIFRPS19WQVIKLSV0b2tlbiBUT0tfVkFSX01FTQotJXRva2VuIFRPS19DT01NQU5EX0JPT1QKLSV0b2tlbiBUT0tfQ09NTUFORF9FWEVDCi0ldG9rZW4gVE9LX1NFTEVDVAotJXRva2VuIFRPS19TVFJJTkcKLSV0b2tlbiBUT0tfTU9ESUZJRVJfQllURQotJXRva2VuIFRPS19NT0RJRklFUl9XT1JECi0ldG9rZW4gVE9LX01PRElGSUVSX0xPTkcKLSV0b2tlbiBUT0tfTU9ESUZJRVJfTUVNU0VUCi0ldG9rZW4gVE9LX0NPTU1BTkRfTUVNU0VUCi0ldG9rZW4gVE9LX0NPTU1BTkRfTUVNRFVNUAotJXRva2VuIFRPS19DT01NQU5EX1FVSVQKLSV0b2tlbiBUT0tfRVJST1IKLSV0b2tlbiBUT0tfRU5ECi0ldG9rZW4gVE9LX0lTQQotJXRva2VuIFRPS19QQ0kKLSV0b2tlbiBUT0tfQllURQotJXRva2VuIFRPS19XT1JECi0ldG9rZW4gVE9LX0xPTkcKLSV0b2tlbiBUT0tfUFJJTlRfUE9SVAotJXRva2VuIFRPS19JT1NUQVQKLSV0b2tlbiBUT0tfUFJJTlRfSVJRCi0ldG9rZW4gVE9LX1BQQ0kKLSV0b2tlbiBUT0tfUElQCi0ldG9rZW4gVE9LX1RSQUNFCi0ldG9rZW4gVE9LX09OCi0ldG9rZW4gVE9LX09GRgotJXRva2VuIFRPS19WRVJCT1NFCi0ldG9rZW4gVE9LX0xPRwotJXRva2VuIFRPS19MT0dPRkYKLSV0b2tlbiBUT0tfQ0xTVEFUCi0ldG9rZW4gVE9LX1NURE9VVAotJXRva2VuIFRPS19ITFQKLSV0b2tlbiBUT0tfREVMCi0ldG9rZW4gVE9LX0lPUEVSTQotJXRva2VuIFRPS19EVU1QX1BDSQotJXRva2VuIFRPS19CT09UX0JJT1MKLSUlCi1pbnB1dDogICAgICAgIHwgaW5wdXQgbGluZSAgCi1saW5lOiAgICAgICAgICBlbmQgfCAgY29tX3JlZyB8IGNvbV92YXIgfCBjb21fc2VsZWN0Ci0gICAgICAgICAgICAgIHwgY29tX2Jvb3QgfCBjb21fbWVtc2V0IHwgY29tX21lbWR1bXAgIHwgY29tX3F1aXQgCi0gICAgICAgICAgICAgIHwgY29tX2V4ZWMgfCBobHAgfCBjb25maWcgfCB2ZXJib3NlIHwgbG9nZ2luZyB8IHByaW50IHwgY2xzdGF0IAotICAgICAgICAgICAgICB8IGNvbV9obHQgfCBpb3Blcm0gfCBsaXN0X3BjaSB8IGJvb3RfYmlvcyAKLSAgICAgICAgICAgICAgfCBlcnJvciBlbmQgIHsgcHJpbnRmKCJ1bmtub3duIGNvbW1hbmRcbiIpOyB9Ci07Ci1lbmQ6ICAgICAgICAgICBUT0tfRU5ECi07Ci1jb21fcmVnOiAgICAgICAgcmVnX29mZiB2YWwgZW5kIHsgKihDQVJEMTYqKSQxID0gJDIgJiAweGZmZmY7IH0KLSAgICAgICAgICAgICAgfCByZWdfc2VnIFRPS19TRVAgcmVnX29mZiB2YWwgZW5kIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKENBUkQxNiopJDEgPSAoJDQgJiAweGYwMDAwKSA+PiA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihDQVJEMTYqKSQzID0gKCQ0ICYgMHgwZmZmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB8ICByZWdfb2ZmICc/JyBlbmQgeyBwcmludGYoIjB4JXhcbiIsKihDQVJEMTYqKSQxKTt9Ci0gICAgICAgICAgICAgIHwgIHJlZ19zZWcgVE9LX1NFUCByZWdfb2ZmICc/JyBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiMHgleDoweCV4XG4iLCooQ0FSRDE2KikkMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKihDQVJEMTYqKSQzKTsgfQotOwotcmVnaXN0ZXJfcmVhZDogIHJlZ19zZWcgVE9LX1NFUCByZWdfb2ZmIHsgJCQgPSAoKCgqKENBUkQxNiopJDEpIDw8IDQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKCooQ0FSRDE2KikkMykgJiAweGZmZmYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHwgcmVnX29mZiAgICAgICAgICB7ICQkID0gKCgqKENBUkQxNiopJDEpICYgMHhmZmZmKTsgfQotOwotcmVnX29mZjogICAgICAgIFRPS19SRUdfQVggIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuYXgpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1JFR19CWCAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5ieCk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfUkVHX0NYICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLmN4KTsgfQotICAgICAgICAgICAgICB8IFRPS19SRUdfRFggIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuZHgpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1JFR19ESSAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5kaSk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfUkVHX1NJICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLnNpKTsgfQotOwotcmVnX3NlZzogICAgICAgIFRPS19TRUdfRFMgIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuZHMpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1NFR19FUyAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5lcyk7IH0KLTsKLWNvbV92YXI6ICAgICAgICBUT0tfVkFSX01FTSAnPycgZW5kIHsgcHJpbnRmKCJ2YXIgbWVtOiAweCV4XG4iLHZhcl9tZW0pOyB9Ci0gICAgICAgICAgfCBUT0tfVkFSICc/JyBlbmQgeyBpZiAoJDEgPCBNQVhfVkFSKQotICAgICAgICAgIHByaW50ZigidmFyWyVpXTogMHgleFxuIiwoaW50KSQxLHZhclskMV0pOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICBwcmludGYoInZhciBpbmRleCAlaSBvdXQgb2YgcmFuZ2VcbiIsKGludCkkMSk7IH0KLSAgICAgICAgICB8IFRPS19WQVJfTUVNIHZhbCBlbmQgeyB2YXJfbWVtID0gJDI7IH0gICAgCi0gICAgICAgICAgICAgIHwgVE9LX1ZBUiB2YWwgZW5kICAgIHsgaWYgKCQxIDw9IE1BWF9WQVIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJbJDFdID0gJDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigidmFyIGluZGV4ICVpIG91dCBvZiByYW5nZVxuIiwoaW50KSQxKTsgfQotICAgICAgICAgICAgICB8IFRPS19WQVIgZXJyb3IgIGVuZCB7IHByaW50ZigiJGkgdmFsXG4iKTsgfQotICAgICAgICAgICAgICB8IFRPS19WQVJfTUVNIGVycm9yICBlbmQgeyBwcmludGYoIiRpIHZhbFxuIik7IH0KLTsKLWNvbV9ib290OiAgICAgICBUT0tfQ09NTUFORF9CT09UICBlbmQgeyBib290KCk7IH0KLSAgICAgICAgICAgICAgICBUT0tfQ09NTUFORF9CT09UIGVycm9yIGVuZCB7IGJvb3QoKTsgfQotOwotY29tX3NlbGVjdDogICAgIFRPS19TRUxFQ1QgVE9LX0lTQSBlbmQgeyBEZXZpY2UuYm9vdGVkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZS50eXBlID0gSVNBOwotICAgICAgICAgICAgICAgICAgICAgQ3VycmVudFBjaSA9IE5VTEw7IH0gICAKLSAgICAgICAgICAgICAgfCBUT0tfU0VMRUNUIFRPS19QQ0kgdmFsIFRPS19TRVAgdmFsIFRPS19TRVAgdmFsIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBEZXZpY2UuYm9vdGVkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLnR5cGUgPSBQQ0k7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UubG9jLnBjaS5idXMgPSAkMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLmxvYy5wY2kuZGV2ID0gJDU7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UubG9jLnBjaS5mdW5jID0gJDc7IH0KLSAgICAgICAgICAgICAgfCBUT0tfU0VMRUNUICc/JyBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzd2l0Y2ggKERldmljZS50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0E6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImlzYVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBDSToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwY2k6ICV4OiV4OiV4XG4iLERldmljZS5sb2MucGNpLmJ1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UubG9jLnBjaS5kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZS5sb2MucGNpLmZ1bmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigibm8gZGV2aWNlIHNlbGVjdGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB8IFRPS19TRUxFQ1QgZXJyb3IgZW5kIHsgcHJpbnRmKCJzZWxlY3QgPyB8IGlzYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8IHBjaTpidXM6ZGV2OmZ1bmNcbiIpOyB9Ci07Ci1jb21fcXVpdDogICAgICAgVE9LX0NPTU1BTkRfUVVJVCBlbmQgeyByZXR1cm4gMDsgfQotICAgICAgICAgICAgICB8IFRPS19DT01NQU5EX1FVSVQgZXJyb3IgZW5kIHsgbG9nb2ZmKCk7IHJldHVybiAwOyB9Ci07Ci1jb21fZXhlYzogICAgICAgVE9LX0NPTU1BTkRfRVhFQyBlbmQgeyBleGVjX2ludCgweDEwKTsgfQotICAgICAgICAgIHwgVE9LX0NPTU1BTkRfRVhFQyB2YWwgZW5kIHsgZXhlY19pbnQoJDIpOyB9Ci0gICAgICAgICAgfCBUT0tfQ09NTUFORF9FWEVDIGVycm9yIGVuZCB7IGV4ZWNfaW50KDB4MTApOyB9Ci07Ci1jb21fbWVtZHVtcDogICAgVE9LX0NPTU1BTkRfTUVNRFVNUCB2YWwgdmFsIGVuZCB7IGR1bXBfbWVtKCQyLCQzKTsgfQotICAgICAgICAgICAgICB8IFRPS19DT01NQU5EX01FTURVTVAgIGVycm9yICBlbmQgeyBwcmludGYoIm1lbWR1bXAgc3RhcnQgbGVuXG4iKTsgfQotCi0gICAgCi07Ci1jb21fbWVtc2V0OiAgICAgVE9LX0NPTU1BTkRfTUVNU0VUIHZhbCBsaXN0IGVuZCB7IGRvX2xpc3QoKHN0cnVjdCBtZW0qKSQzLCQyKTt9Ci0gICAgICAgICAgICAgIHwgVE9LX0NPTU1BTkRfTUVNU0VUIGVycm9yIGVuZCB7IHByaW50Zigic2V0bWVtIGFkZHIgW2J5dGUgdmFsXSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW3dvcmQgdmFsXSBbbG9uZyB2YWxdICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbXCJzdHJpbmdcIl1cbiIpOyB9Ci07Ci1saXN0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJCQgPSAwOyB9IAotICAgICAgICAgICAgICB8IFRPS19CWVRFIHZhbCBsaXN0IHsgcmVjLmludGVnZXIgPSAkMjsKLSAgICAgICAgICAkJCA9ICh1bnNpZ25lZCBsb25nKWFkZF90b19saXN0KEJZVEUsJnJlYywodm9pZCopJDMpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1dPUkQgdmFsIGxpc3QgeyByZWMuaW50ZWdlciA9ICQyOyAKLSAgICAgICAgICAkJCA9ICh1bnNpZ25lZCBsb25nKSBhZGRfdG9fbGlzdChXT1JELCZyZWMsKHZvaWQqKSQzKTsgfQotICAgICAgICAgICAgICB8IFRPS19MT05HIHZhbCBsaXN0IHsgcmVjLmludGVnZXIgPSAkMjsgCi0gICAgICAgICAgJCQgPSAodW5zaWduZWQgbG9uZykgYWRkX3RvX2xpc3QoTE9ORywmcmVjLCh2b2lkKikkMyk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfU1RSSU5HIGxpc3QgeyByZWMucHRyID0gKHZvaWQqKSQxOyAKLSAgICAgICAgICAkJCA9ICh1bnNpZ25lZCBsb25nKSBhZGRfdG9fbGlzdChTVFJJTkcsJnJlYywodm9pZCopJDIpOyB9Ci07Ci12YWw6ICAgICAgICAgICAgVE9LX1ZBUiAgeyAgaWYgKCQxID4gTUFYX1ZBUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInZhcmlhYmxlIGluZGV4IG91dCBvZiByYW5nZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJCA9IHZhclskMV07IH0gCi0gICAgICAgICAgICAgIHwgVE9LX05VTSAgeyAgJCQgPSAkMTsgfQotICAgICAgICAgICAgICB8IHJlZ2lzdGVyX3JlYWQKLTsgCi1ib29sOiAgICAgICAgICAgVE9LX09OICAgeyAgJCQgPSAxOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX09GRiAgeyAgJCQgPSAwOyB9Ci07Ci1jb25maWc6ICAgICAgICAgVE9LX1BSSU5UX1BPUlQgYm9vbCBlbmQgeyBDb25maWcuUHJpbnRQb3J0ID0gJDI7IH0gCi0gICAgICAgICAgICAgIHwgVE9LX1BSSU5UX1BPUlQgJz8nIGVuZCAgeyBwcmludGYoInByaW50IHBvcnQgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5QcmludFBvcnQ/Im9uIjoib2ZmIik7IH0KLSAgICAgICAgICB8IFRPS19QUklOVF9QT1JUIGVycm9yIGVuZCB7IHByaW50ZigicHBvcnQgb24gfCBvZmYgfCA/XG4iKSB9IAotICAgICAgICAgICAgICB8IFRPS19QUklOVF9JUlEgYm9vbCBlbmQgIHsgQ29uZmlnLlByaW50SXJxID0gJDI7IH0gCi0gICAgICAgICAgICAgIHwgVE9LX1BSSU5UX0lSUSAnPycgZW5kICAgeyBwcmludGYoInByaW50IGlycSAlc1xuIiwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLlByaW50SXJxPyJvbiI6Im9mZiIpOyB9IAotICAgICAgICAgIHwgVE9LX1BSSU5UX0lSUSBlcnJvciBlbmQgeyBwcmludGYoInBpcnEgb24gfCBvZmYgfCA/XG4iKSB9IAotICAgICAgICAgICAgICB8IFRPS19QUENJIGJvb2wgZW5kICAgICAgIHsgQ29uZmlnLlByaW50UGNpID0gJDI7IH0gCi0gICAgICAgICAgICAgIHwgVE9LX1BQQ0kgJz8nIGVuZCAgICAgICAgeyBwcmludGYoInByaW50IFBDSSAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5QcmludFBjaT8ib24iOiJvZmYiKTsgfSAKLSAgICAgICAgICB8IFRPS19QUENJIGVycm9yIGVuZCAgICAgIHsgcHJpbnRmKCJwcGNpIG9uIHwgb2ZmIHwgP1xuIikgfSAKLSAgICAgICAgICAgICAgfCBUT0tfUElQIGJvb2wgZW5kICAgICAgICB7IENvbmZpZy5QcmludElwID0gJDI7IH0gCi0gICAgICAgICAgICAgIHwgVE9LX1BJUCAnPycgZW5kICAgICAgICAgeyBwcmludGYoInByaW50aXAgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5QcmludElwPyJvbiI6Im9mZiIpOyB9IAotICAgICAgICAgIHwgVE9LX1BJUCBlcnJvciBlbmQgICAgICAgeyBwcmludGYoInBpcCBvbiB8IG9mZiB8ID9cbiIpIH0gCi0gICAgICAgICAgICAgIHwgVE9LX0lPU1RBVCBib29sIGVuZCAgICAgeyBDb25maWcuSW9TdGF0aXN0aWNzID0gJDI7IH0gCi0gICAgICAgICAgICAgIHwgVE9LX0lPU1RBVCAnPycgZW5kICAgICAgeyBwcmludGYoImlvIHN0YXRpc3RpY3MgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5Jb1N0YXRpc3RpY3M/Im9uIjoib2ZmIik7IH0gCi0gICAgICAgICAgfCBUT0tfSU9TVEFUIGVycm9yIGVuZCAgICB7IHByaW50ZigiaW9zdGF0IG9uIHwgb2ZmIHwgP1xuIikgfSAKLSAgICAgICAgICAgICAgfCBUT0tfVFJBQ0UgYm9vbCBlbmQgICAgICB7IENvbmZpZy5UcmFjZSA9ICQyOyB9IAotICAgICAgICAgICAgICB8IFRPS19UUkFDRSAnPycgZW5kICAgICAgIHsgcHJpbnRmKCJ0cmFjZSAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLlRyYWNlID8ib24iOiJvZmYiKTsgfSAKLSAgICAgICAgICB8IFRPS19UUkFDRSBlcnJvciBlbmQgeyBwcmludGYoInRyYWNlIG9uIHwgb2ZmIHwgP1xuIikgfSAKLTsKLXZlcmJvc2U6ICAgICAgICBUT0tfVkVSQk9TRSB2YWwgZW5kICAgICB7IENvbmZpZy5WZXJib3NlID0gJDI7IH0KLSAgICAgICAgICB8IFRPS19WRVJCT1NFICc/JyBlbmQgICAgIHsgcHJpbnRmKCJ2ZXJib3NlOiAlaVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuVmVyYm9zZSk7IH0KLSAgICAgICAgICB8IFRPS19WRVJCT1NFIGVycm9yIGVuZCAgIHsgcHJpbnRmKCJ2ZXJib3NlIHZhbCB8ID9cbiIpOyB9Ci07Ci1sb2dnaW5nOiAgICAgICAgVE9LX0xPRyBUT0tfU1RSSU5HIGVuZCAgeyBsb2dvbihub3JtYWxpemVfc3RyaW5nKChjaGFyKikkMikpOyB9Ci0gICAgICAgICAgfCBUT0tfTE9HICc/JyBlbmQgICAgICAgICB7IGlmIChsb2dnaW5nKSBwcmludGYoImxvZ2ZpbGU6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcHJpbnRmKCJubyBsb2dnaW5nXG4/Iik7IH0KLSAgICAgICAgICB8IFRPS19MT0cgVE9LX09GRiBlbmQgICAgICAgICAgeyBsb2dvZmYoKTsgfQotICAgICAgICAgIHwgVE9LX0xPRyBlcnJvciBlbmQgICAgICAgeyBwcmludGYoImxvZyBcIjxmaWxlbmFtZT5cIiB8ID8gfCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mZlxuIik7IH0KLTsKLWNsc3RhdDogICAgICAgICBUT0tfQ0xTVEFUIGVuZCAgICAgICAgICB7IGNsZWFyX3N0YXQoKTsgfQotICAgICAgICAgIHwgVE9LX0NMU1RBVCBlcnJvciBlbmQgICAgeyBwcmludGYoImNsc3RhdFxuIik7IH0gCi07Ci1wcmludDogICAgICAgICAgVE9LX1NURE9VVCBib29sIGVuZCAgICAgeyBub3N0ZG91dCA9ICEkMjsgfQotICAgICAgICAgICAgICAgICAgfCBUT0tfU1RET1VUICc/JyBlbmQgICAgICB7IHByaW50ZigicHJpbnQgJXNcbiIsbm9zdGRvdXQgPwotICAgICAgICAgICAgICAgICAgICAgICAgIm5vIjoieWVzIik7IH0KLSAgICAgICAgICB8IFRPS19TVERPVVQgZXJyb3IgZW5kICAgIHsgcHJpbnRmKCJwcmludCBvbiB8IG9mZlxuIik7IH0KLTsKLWNvbV9obHQ6ICAgICAgICAgICAgVE9LX0hMVCB2YWwgZW5kICAgICAgICAgeyBhZGRfaGx0KCQyKTsgfSAgICAKLSAgICAgICAgICB8IFRPS19ITFQgVE9LX0RFTCB2YWwgZW5kIHsgZGVsX2hsdCgkMyk7IH0KLSAgICAgICAgICB8IFRPS19ITFQgVE9LX0RFTCBlbmQgICAgIHsgZGVsX2hsdCgyMSk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfSExUICc/JyBlbmQgICAgICAgICB7IGxpc3RfaGx0KCk7IH0KLSAgICAgICAgICB8IFRPS19ITFQgZXJyb3IgZW5kICAgICAgIHsgcHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGx0IHZhbCB8IGRlbCBbdmFsXSB8ID9cbiIpOyB9Ci07Ci1pb3Blcm06ICAgICAgICAgVE9LX0lPUEVSTSB2YWwgdmFsIHZhbCBlbmQgeyBpbnQgaSxtYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDIgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gJDIgKyAkMyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPiBJT1BFUk1fQklUUykgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IElPUEVSTV9CSVRTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gJDI7aSA8PSBtYXg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9wZXJtX2xpc3RbaV0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkND4wID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfCBUT0tfSU9QRVJNICc/JyBlbmQgeyBpbnQgaSxzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDw9IElPUEVSTV9CSVRTOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlvcGVybV9saXN0W2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPD0gSU9QRVJNX0JJVFM7IGkrKykgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlvcGVybV9saXN0W2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpb3Blcm0gb24gaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICIweCV4KzB4JXhcbiIsIHN0YXJ0LGktc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfCBUT0tfSU9QRVJNIGVycm9yIGVuZCB7IHByaW50ZigiaW9wZXJtIHN0YXJ0IGxlbiB2YWxcbiIpOyB9Ci07Ci1saXN0X3BjaTogICAgICBUT0tfRFVNUF9QQ0kgZW5kICAgICAgIHsgbGlzdF9wY2koKTsgfQotICAgICAgICAgICAgIHwgVE9LX0RVTVBfUENJIGVycm9yIGVuZCB7IGxpc3RfcGNpKCk7IH0KLTsKLWJvb3RfYmlvczogICAgIFRPS19CT09UX0JJT1MgJz8nIGVuZCB7IGlmICghQm9vdEJpb3MpIHByaW50ZigiTm8gQm9vdCBCSU9TXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBwcmludGYoIkJvb3RCSU9TIGZyb206ICVpOiVpOiVpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdEJpb3MtPmJ1cywgQm9vdEJpb3MtPmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RCaW9zLT5mdW5jKTsgfQotICAgICAgICAgICAgIHwgVE9LX0JPT1RfQklPUyBlcnJvciBlbmQgeyBwcmludGYgKCJib290YmlvcyBidXM6ZGV2Om51bVxuIik7IH0KLTsKLWhscDogICAgICAgICAnPycgIHsgcHJpbnRmKCJDb21tYW5kIGxpc3Q6XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgc2VsZWN0IGlzYSB8IHBjaSBidXM6ZGV2OmZ1bmNcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgYm9vdFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBzZWc6cmVnIHZhbCB8IHJlZyB2YWwgXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiICR4IHZhbCB8ICRtZW0gdmFsXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIHNldG1lbSBhZGRyIGxpc3Q7IGFkZHIgOj0gdmFsXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIGR1bXBtZW0gYWRkciBsZW47IGFkZHIsbGVuIDo9IHZhbFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBkbyBbdmFsXVxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBxdWl0XG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiID9cbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgc2VnIDo9IGRzIHwgZXM7IgotICAgICAgICAgICAgICAgIiByZWcgOj0gYXggfCBieCB8IGN4IHwgZHggfCBzaSBcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgdmFsIDo9IHZhciB8IDxoZXgtbnVtYmVyPiB8IHNlZzpyZWcgfCBzZWdcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgdmFyIDo9ICR4IHwgJG1lbTsgeCA6PSAwLi4yMFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBsaXN0IDo9IGJ5dGUgdmFsIHwgd29yZCB2YWwgfCBsb25nIHZhbCAiCi0gICAgICAgICAgICAgICAifCBcInN0cmluZ1wiXG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiBwcG9ydCBvbiB8IG9mZiB8ID9cbiIpOwotICAgICAgICAgICAgICAgIHByaW50ZigiIHBwY2kgb24gfCBvZmYgfCA/XG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiBwaXJxIG9uIHwgb2ZmIHwgP1xuIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgcGlwIG9uIHwgb2ZmIHwgP1xuIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgdHJhY2Ugb24gfCBvZmYgfCA/XG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiBpb3N0YXQgb24gfCBvZmYgfCA/XG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIHZlcmJvc2UgdmFsXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIGxvZyBcIjxmaWxlbmFtZT5cIiB8IG9mZiB8ID9cbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgcHJpbnQgb24gfCBvZmZcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgaGx0IHZhbCB8IGRlbCBbdmFsXSB8ID9cbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgY2xzdGF0XG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIGxwY2lcbiIpOwotICAgICAgICAgICAgcHJpbnRmICgiYm9vdGJpb3MgP1xuIik7Ci19Ci07Ci0KLSUlCi0KLXN0YXRpYyB2b2lkCi1kdW1wX21lbShDQVJEMzIgYWRkciwgaW50IGxlbikKLXsKLSAgICBkcHJpbnQoYWRkcixsZW4pOwotfQotCi1zdGF0aWMgdm9pZAotZXhlY19pbnQoaW50IG51bSkKLXsKLSAgICBpZiAobnVtID09IDB4MTApIHsgIC8qIHZpZGVvIGludGVycnVwdCAqLwotICAgIGlmIChEZXZpY2UudHlwZSA9PSBOT05FKSB7Ci0gICAgICAgIEN1cnJlbnRQY2kgPSBQY2lMaXN0OwotICAgICAgICB3aGlsZSAoQ3VycmVudFBjaSkgewotICAgICAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIGlmICghQ3VycmVudFBjaSkKLSAgICAgICAgRGV2aWNlLnR5cGUgPSBJU0E7Ci0gICAgICAgIGVsc2UgewotICAgICAgICBEZXZpY2UudHlwZSA9IFBDSTsKLSAgICAgICAgRGV2aWNlLmxvYy5wY2kuZGV2ID0gQ3VycmVudFBjaS0+ZGV2OwotICAgICAgICBEZXZpY2UubG9jLnBjaS5idXMgPSBDdXJyZW50UGNpLT5idXM7Ci0gICAgICAgIERldmljZS5sb2MucGNpLmZ1bmMgPSBDdXJyZW50UGNpLT5mdW5jOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICBpZiAoRGV2aWNlLnR5cGUgIT0gSVNBKSB7Ci0gICAgICAgaWYgKCFEZXZpY2UuYm9vdGVkKSB7Ci0gICAgICAgICAgICAgIGlmICghQ3VycmVudFBjaSB8fCAoRGV2aWNlLnR5cGUgPT0gUENJCi0gICAgICAgICAgICAgICAmJiAoIUN1cnJlbnRQY2ktPmFjdGl2ZQotICAgICAgICAgICAgICAgICAgICYmIChEZXZpY2UubG9jLnBjaS5kZXYgIT0gQ3VycmVudFBjaS0+ZGV2Ci0gICAgICAgICAgICAgICAgIHx8IERldmljZS5sb2MucGNpLmJ1cyAhPSBDdXJyZW50UGNpLT5idXMKLSAgICAgICAgICAgICAgICAgfHwgRGV2aWNlLmxvYy5wY2kuZnVuYyAhPSBDdXJyZW50UGNpLT5mdW5jKSkpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJib290IHRoZSBkZXZpY2UgZmlzdFxuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgQ3VycmVudFBjaSA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICBEZXZpY2UuYm9vdGVkID0gRkFMU0U7IC8qIHdlIG5lZWQgdGhpcyBmb3Igc2FuaXR5ISAqLwotICAgIH0KLSAgICAKLSAgICBydW5JTlQobnVtLCZyZWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLWJvb3Qodm9pZCkKLXsKLSAgICBpZiAoRGV2aWNlLnR5cGUgPT0gTk9ORSkgewotICAgIHByaW50Zigic2VsZWN0IGEgZGV2aWNlIGZpc3RcbiIpOwotICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgY2FsbF9ib290KCZEZXZpY2UpOwotfQotCi1zdGF0aWMgdm9pZCAqCi1hZGRfdG9fbGlzdChlbnVtIG1lbV90eXBlIHR5cGUsIHVuaW9uIG1lbV92YWwgKnJlYywgdm9pZCAqbmV4dCkKLXsKLSAgICBzdHJ1Y3QgbWVtICptZW1fcmVjID0gKHN0cnVjdCBtZW0gKikgbWFsbG9jKHNpemVvZihtZW1fcmVjKSk7Ci0KLSAgICBtZW1fcmVjLT50eXBlID0gdHlwZTsKLSAgICBtZW1fcmVjLT5uZXh0ID0gbmV4dDsKLSAgICAKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEJZVEU6Ci0gICAgY2FzZSBXT1JEOgotICAgIGNhc2UgTE9ORzoKLSAgICBtZW1fcmVjLT52YWwuaW50ZWdlciA9IHJlYy0+aW50ZWdlcjsKLSAgICAgICBicmVhazsKLSAgICBjYXNlIFNUUklORzoKLSAgICBtZW1fcmVjLT52YWwucHRyID0gbm9ybWFsaXplX3N0cmluZyhyZWMtPnB0cik7Ci0gICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBtZW1fcmVjOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZFJhbmdlKGludCBhZGRyLGludCBsZW4pCi17Ci0gICAgaW50IGVuZCA9IGFkZHIgKyBsZW47Ci0KLSAgICBpZiAoYWRkciA8IDB4MTAwMCB8fCBlbmQgPiAweGMwMDAwKQotICAgIHJldHVybiAwOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbGlzdChzdHJ1Y3QgbWVtICpsaXN0LCBtZW1UeXBlIGFkZHIpCi17Ci0gICBzdHJ1Y3QgbWVtICpwcmV2OwotICAgaW50IGxlbjsKLSAgIAotICAgd2hpbGUgKGxpc3QpIHsKLSAgICBzd2l0Y2ggKGxpc3QtPnR5cGUpIHsKLSAgICAgICAgIGNhc2UgQllURToKLSAgICAgICAgIGlmICghdmFsaWRSYW5nZShhZGRyLDEpKSBnb3RvIGVycm9yOwotICAgICAgICAgKihDQVJEOCopYWRkciA9IGxpc3QtPnZhbC5pbnRlZ2VyOwotICAgICAgICAgYWRkciA9KyAxOwotICAgICAgICAgICAgIGJyZWFrOyAgICAgCi0gICAgICAgICBjYXNlIFdPUkQ6Ci0gICAgICAgICBpZiAoIXZhbGlkUmFuZ2UoYWRkciwyKSkgZ290byBlcnJvcjsKLSAgICAgICAgICooQ0FSRDE2KilhZGRyID0gbGlzdC0+dmFsLmludGVnZXI7Ci0gICAgICAgICBhZGRyID0rIDI7Ci0gICAgICAgICAgICAgYnJlYWs7ICAgICAKLSAgICAgICAgIGNhc2UgTE9ORzoKLSAgICAgICAgIGlmICghdmFsaWRSYW5nZShhZGRyLDQpKSBnb3RvIGVycm9yOwotICAgICAgICAgKihDQVJEMzIqKWFkZHIgPSBsaXN0LT52YWwuaW50ZWdlcjsKLSAgICAgICAgIGFkZHIgPSsgNDsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgbGVuID0gc3RybGVuKChjaGFyKilsaXN0LT52YWwucHRyKTsKLSAgICAgICAgIGlmICghdmFsaWRSYW5nZShhZGRyLGxlbikpIGdvdG8gZXJyb3I7Ci0gICAgICAgICBtZW1jcHkoKENBUkQ4KilhZGRyLCh2b2lkKilsaXN0LT52YWwucHRyLGxlbik7Ci0gICAgICAgICBhZGRyID0rIGxlbjsKLSAgICAgICAgICAgICBmcmVlKGxpc3QtPnZhbC5wdHIpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgIH0gICAgIAotICAgICAgIHByZXYgPSBsaXN0OwotICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgICAgIGZyZWUocHJldik7Ci0gICAgICAgY29udGludWU7Ci0gICBlcnJvcjoKLSAgICAgICBwcmludGYoImFkZHJlc3Mgb3V0IG9mIHJhbmdlXG4iKTsKLSAgICAgICB3aGlsZSAobGlzdCkgewotICAgICAgIHByZXYgPSBsaXN0OwotICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgICAgIGZyZWUocHJldik7Ci0gICAgICAgfQotICAgICAgIGJyZWFrOwotICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1ub3JtYWxpemVfc3RyaW5nKGNoYXIgKnB0cikKLXsKLSAgICBpbnQgaSA9IDAsIGogPSAwLCBjID0gMCwgZXNjPSAwOwotICAgIGludCBzaXplOwotICAgIGNoYXIgKm1lbV9wdHI7Ci0gICAgCi0gICAgc2l6ZSA9IHN0cmxlbihwdHIpOwotICAgIG1lbV9wdHIgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgc3dpdGNoICgqKHB0ciArIGkpKSB7Ci0gICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgIGlmIChlc2MpIHsKLSAgICAgICAgICAgICAgICAqKG1lbV9wdHIgKyBqKyspID0gKihwdHIgKyBpKTsKLSAgICAgICAgICAgICAgICBlc2MgPSAwOwotICAgICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgICAgIGVzYyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgaWYgKGVzYykgewotICAgICAgICAgICAgICAgICoobWVtX3B0ciArIGorKykgPSAqKHB0ciArIGkpOwotICAgICAgICAgICAgICAgIGVzYyA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqKG1lbV9wdHIgKyBqKyspID0gKihwdHIgKyBpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjID4gMSkgewotICAgICAgICAgICAgKihtZW1fcHRyICsgaikgPSAnXDAnOyAgICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBtZW1fcHRyOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OGE1NzEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDkwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZiBkZWZpbmVkIChfX2FscGhhX18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQotI2luY2x1ZGUgPHN5cy9pby5oPgotI2VuZGlmCi0jaW5jbHVkZSAiQXNtTWFjcm9zLmgiCi0KLSNpbmNsdWRlICJwY2kuaCIKLQotLyoKLSAqIEknbSByYXRoZXIgc2ltcGxlIG1pbmRlbmQgLSB0aGVyZWZvcmUgSSBkbyBhIHBvb3IgbWFuJ3MKLSAqIHBjaSBzY2FuIHdpdGhvdXQgYWxsIHRoZSBmYW5jeSBzdHVmZiB0aGF0IGlzIGRvbmUgaW4KLSAqIHNjYW5wY2kuIEhvd2V2ZXIgdGhhdCdzIGFsbCB3ZSBuZWVkLgotICovCi0KLVBjaVN0cnVjdFB0ciBQY2lTdHJ1Y3QgPSBOVUxMOwotUGNpQnVzUHRyIFBjaUJ1c2VzID0gTlVMTDsKLVBjaVN0cnVjdFB0ciBDdXJyZW50UGNpID0gTlVMTDsKLVBjaVN0cnVjdFB0ciBQY2lMaXN0ID0gTlVMTDsKLVBjaVN0cnVjdFB0ciBCb290QmlvcyA9IE5VTEw7Ci1pbnQgcGNpTWF4QnVzID0gMDsKLQotc3RhdGljIENBUkQzMiBQY2lDZmcxQWRkcjsKLQotc3RhdGljIHZvaWQgcmVhZENvbmZpZ1NwYWNlQ2ZnMShDQVJEMzIgYnVzLCBDQVJEMzIgZGV2LCBDQVJEMzIgZnVuYywKLQkJQ0FSRDMyICpyZWcpOwotc3RhdGljIGludCBjaGVja1Nsb3RDZmcxKENBUkQzMiBidXMsIENBUkQzMiBkZXYsIENBUkQzMiBmdW5jKTsKLXN0YXRpYyBpbnQgY2hlY2tTbG90Q2ZnMihDQVJEMzIgYnVzLCBpbnQgZGV2KTsKLXN0YXRpYyB2b2lkIHJlYWRDb25maWdTcGFjZUNmZzIoQ0FSRDMyIGJ1cywgaW50IGRldiwgQ0FSRDMyICpyZWcpOwotc3RhdGljIENBUkQ4IGludGVycHJldENvbmZpZ1NwYWNlKENBUkQzMiAqcmVnLCBpbnQgYnVzaWR4LAotCQkgIENBUkQ4IGRldiwgQ0FSRDggZnVuYyk7Ci1zdGF0aWMgQ0FSRDMyIGZpbmRCSU9TTWFwKFBjaVN0cnVjdFB0ciBwY2lQLCBDQVJEMzIgKmJpb3NTaXplKTsKLXN0YXRpYyB2b2lkIHJlc3RvcmVNZW0oUGNpU3RydWN0UHRyIHBjaVApOwotCi0KLSNpZmRlZiBfX2FscGhhX18KLSNkZWZpbmUgUENJX0JVU19GUk9NX1RBRyh0YWcpICAoKCh0YWcpICYgMHgwMGZmMDAwMCkgPj4gMTYpCi0jZGVmaW5lIFBDSV9ERk5fRlJPTV9UQUcodGFnKSAoKCh0YWcpICYgMHgwMDAwZmYwMCkgPj4gOCkKLQotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLQotQ0FSRDMyCi1heHBQY2lDZmdSZWFkKENBUkQzMiB0YWcpCi17Ci0gICAgaW50IGJ1cywgZGZuOwotICAgIENBUkQzMiB2YWwgPSAweGZmZmZmZmZmOwotCi0gICAgYnVzID0gUENJX0JVU19GUk9NX1RBRyh0YWcpOwotICAgIGRmbiA9IFBDSV9ERk5fRlJPTV9UQUcodGFnKTsKLQotICAgIHN5c2NhbGwoX19OUl9wY2ljb25maWdfcmVhZCwgYnVzLCBkZm4sIHRhZyAmIDB4ZmYsIDQsICZ2YWwpOwotICAgIHJldHVybih2YWwpOwotfQotCi12b2lkCi1heHBQY2lDZmdXcml0ZShDQVJEMzIgdGFnLCBDQVJEMzIgdmFsKQotewotICAgIGludCBidXMsIGRmbjsKLQotICAgIGJ1cyA9IFBDSV9CVVNfRlJPTV9UQUcodGFnKTsKLSAgICBkZm4gPSBQQ0lfREZOX0ZST01fVEFHKHRhZyk7Ci0KLSAgICBzeXNjYWxsKF9fTlJfcGNpY29uZmlnX3dyaXRlLCBidXMsIGRmbiwgdGFnICYgMHhmZiwgNCwgJnZhbCk7Ci19Ci0KLXN0YXRpYyBDQVJEMzIgKCpyZWFkUGNpKShDQVJEMzIgcmVnKSA9IGF4cFBjaUNmZ1JlYWQ7Ci1zdGF0aWMgdm9pZCAoKndyaXRlUGNpKShDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKSA9IGF4cFBjaUNmZ1dyaXRlOwotI2Vsc2UKLXN0YXRpYyBDQVJEMzIgcmVhZFBjaUNmZzEoQ0FSRDMyIHJlZyk7Ci1zdGF0aWMgdm9pZCB3cml0ZVBjaUNmZzEoQ0FSRDMyIHJlZywgQ0FSRDMyIHZhbCk7Ci1zdGF0aWMgQ0FSRDMyIHJlYWRQY2lDZmcyKENBUkQzMiByZWcpOwotc3RhdGljIHZvaWQgd3JpdGVQY2lDZmcyKENBUkQzMiByZWcsIENBUkQzMiB2YWwpOwotCi1zdGF0aWMgQ0FSRDMyICgqcmVhZFBjaSkoQ0FSRDMyIHJlZykgPSByZWFkUGNpQ2ZnMTsKLXN0YXRpYyB2b2lkICgqd3JpdGVQY2kpKENBUkQzMiByZWcsIENBUkQzMiB2YWwpID0gd3JpdGVQY2lDZmcxOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pCi0jZGVmaW5lIFBDSV9FTiAweDAwMDAwMDAwCi0jZWxzZQotI2RlZmluZSBQQ0lfRU4gMHg4MDAwMDAwMAotI2VuZGlmCi0KLQotc3RhdGljIGludCBudW1idXM7Ci1zdGF0aWMgaW50IGhvc3RicmlkZ2VzID0gMTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBjaU1pbk1lbVJlZyA9IH4wOwotCi0KLXZvaWQKLXNjYW5fcGNpKHZvaWQpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgY29uZmlndHlwZTsKLQotICAgIENBUkQzMiByZWdbNjRdOwotICAgIGludCBidXNpZHg7Ci0gICAgQ0FSRDggY2FyZG51bTsKLSAgICBDQVJEOCBmdW5jOwotICAgIGludCBpZHg7Ci0KLSAgICBpbnQgaTsKLSAgICBQY2lTdHJ1Y3RQdHIgcGNpMTsKLSAgICBQY2lCdXNQdHIgcGNpX2IxLHBjaV9iMjsKLQotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX2lhNjRfXykKLSAgICBjb25maWd0eXBlID0gMTsKLSNlbHNlCi0gICAgQ0FSRDggdG1wMSwgdG1wMjsKLSAgICBDQVJEMzIgdG1wMzJfMSwgdG1wMzJfMjsKLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweDAwKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgMHgwMCk7Ci0gICAgdG1wMSA9IGluYihQQ0lfTU9ERTJfRU5BQkxFX1JFRyk7Ci0gICAgdG1wMiA9IGluYihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcpOwotICAgIGlmICgodG1wMSA9PSAweDAwKSAmJiAodG1wMiA9PSAweDAwKSkgewotCWNvbmZpZ3R5cGUgPSAyOwotCXJlYWRQY2kgPSByZWFkUGNpQ2ZnMjsKLQl3cml0ZVBjaSA9IHdyaXRlUGNpQ2ZnMjsKLQlQX3ByaW50ZigiUENJIHNheXMgY29uZmlndXJhdGlvbiB0eXBlIDJcbiIpOwotICAgIH0gZWxzZSB7Ci0JdG1wMzJfMSA9IGlubChQQ0lfTU9ERTFfQUREUkVTU19SRUcpOwotCW91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCBQQ0lfRU4pOwotCXRtcDMyXzIgPSBpbmwoUENJX01PREUxX0FERFJFU1NfUkVHKTsKLQlvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgdG1wMzJfMSk7Ci0JaWYgKHRtcDMyXzIgPT0gUENJX0VOKSB7Ci0JICAgIGNvbmZpZ3R5cGUgPSAxOwotCSAgICBQX3ByaW50ZigiUENJIHNheXMgY29uZmlndXJhdGlvbiB0eXBlIDFcbiIpOwotCX0gZWxzZSB7Ci0JICAgIFBfcHJpbnRmKCJObyBQQ0kgIVxuIik7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoY29uZmlndHlwZSA9PSAxKSB7Ci0JUF9wcmludGYoIlBDSSBwcm9iaW5nIGNvbmZpZ3VyYXRpb24gdHlwZSAxXG4iKTsKLQlidXNpZHggPSAwOwotCW51bWJ1cyA9IDE7Ci0JaWR4ID0gMDsKLQlkbyB7Ci0JICAgIFBfcHJpbnRmKCJcblByb2JpbmcgZm9yIGRldmljZXMgb24gUENJIGJ1cyAlZDpcbiIsIGJ1c2lkeCk7Ci0JICAgIGZvciAoY2FyZG51bSA9IDA7IGNhcmRudW0gPCBNQVhfREVWX1BFUl9WRU5ET1JfQ0ZHMTsgY2FyZG51bSsrKSB7Ci0JCWZ1bmMgPSAwOwotCQlkbyB7Ci0JCSAgICAvKiBsb29wIG92ZXIgdGhlIGRpZmZlcmVudCBmdW5jdGlvbnMsIGlmIHByZXNlbnQgKi8KLQkJICAgIGlmICghY2hlY2tTbG90Q2ZnMShidXNpZHgsY2FyZG51bSxmdW5jKSkKLQkJCWJyZWFrOwotCQkgICAgcmVhZENvbmZpZ1NwYWNlQ2ZnMShidXNpZHgsY2FyZG51bSxmdW5jLHJlZyk7Ci0KLQkJICAgIGZ1bmMgPSBpbnRlcnByZXRDb25maWdTcGFjZShyZWcsYnVzaWR4LAotCQkJCQkJY2FyZG51bSxmdW5jKTsKLQotCQkgICAgaWYgKGlkeCsrID4gTUFYX1BDSV9ERVZJQ0VTKQotCQkJY29udGludWU7Ci0JCX0gd2hpbGUgKGZ1bmMgPCA4KTsKLQkgICAgfQotCX0gd2hpbGUgKCsrYnVzaWR4IDwgUENJX01BWEJVUyk7Ci0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faWE2NF9fKQotCS8qIGRvbid0IHVzZSBvdXRsKCkgIDstKSAqLwotI2Vsc2UKLQlvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgMCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotCWludCBzbG90OwotCi0JUF9wcmludGYoIlBDSSBwcm9iaW5nIGNvbmZpZ3VyYXRpb24gdHlwZSAyXG4iKTsKLQlidXNpZHggPSAwOwotCW51bWJ1cyA9IDE7Ci0JaWR4ID0gMDsKLQlkbyB7Ci0JICAgIGZvciAoc2xvdD0weGMwOyBzbG90PDB4ZDA7IGkrKykgewotCQlpZiAoIWNoZWNrU2xvdENmZzIoYnVzaWR4LHNsb3QpKQotCQkgICAgYnJlYWs7Ci0JCXJlYWRDb25maWdTcGFjZUNmZzIoYnVzaWR4LHNsb3QscmVnKTsKLQotCQlpbnRlcnByZXRDb25maWdTcGFjZShyZWcsYnVzaWR4LAotCQkJCSAgICAgc2xvdCwwKTsKLQkJaWYgKGlkeCsrID4gTUFYX1BDSV9ERVZJQ0VTKQotCQkgICAgY29udGludWU7Ci0JICAgIH0KLQl9ICB3aGlsZSAoKytidXNpZHggPCBQQ0lfTUFYQlVTKTsKLSAgICB9Ci0KLQotICAgIHBjaU1heEJ1cyA9IG51bWJ1cyAtIDE7Ci0gICAgUF9wcmludGYoIk51bWJlciBvZiBidXNlcyBpbiBzeXN0ZW06ICVpXG4iLHBjaU1heEJ1cyArIDEpOwotICAgIFBfcHJpbnRmKCJNaW4gUENJIG1lbSBhZGRyZXNzOiAweCVseFxuIixwY2lNaW5NZW1SZWcpOwotCi0gICAgLyogbGluayBidXNlcyAqLwotICAgIHBjaV9iMSA9IFBjaUJ1c2VzOwotICAgIHdoaWxlIChwY2lfYjEpIHsKLQlwY2lfYjIgPSBQY2lCdXNlczsKLQlwY2lfYjEtPnBCdXMgPSBOVUxMOwotCXdoaWxlIChwY2lfYjIpIHsKLQkgICAgaWYgKHBjaV9iMS0+cHJpbWFyeSA9PSBwY2lfYjItPnNlY29uZGFyeSkKLQkJcGNpX2IxLT5wQnVzID0gcGNpX2IyOwotCSAgICBwY2lfYjIgPSBwY2lfYjItPm5leHQ7Ci0JfQotCXBjaV9iMSA9IHBjaV9iMS0+bmV4dDsKLSAgICB9Ci0gICAgcGNpMSA9IFBjaVN0cnVjdDsKLSAgICB3aGlsZSAocGNpMSkgewotCXBjaV9iMiA9IFBjaUJ1c2VzOwotCXBjaTEtPnBCdXMgPSBOVUxMOwotCXdoaWxlIChwY2lfYjIpIHsKLQkgICAgaWYgKHBjaTEtPmJ1cyA9PSBwY2lfYjItPnNlY29uZGFyeSkKLQkJcGNpMS0+cEJ1cyA9IHBjaV9iMjsKLQkgICAgcGNpX2IyID0gcGNpX2IyLT5uZXh0OwotCX0KLQlwY2kxID0gcGNpMS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKFJFU09SVCkgewotCVBjaVN0cnVjdFB0ciB0bXAgPSBQY2lTdHJ1Y3QsIHRtcDE7Ci0JUGNpU3RydWN0ID0gTlVMTDsKLQl3aGlsZSAodG1wKSB7Ci0JICAgIHRtcDEgPSB0bXAtPm5leHQ7Ci0JICAgIHRtcC0+bmV4dCA9IFBjaVN0cnVjdDsKLQkgICAgUGNpU3RydWN0ID0gdG1wOwotCSAgICB0bXAgPSB0bXAxOwotCX0KLSAgICB9Ci0gICAgUGNpTGlzdCA9IEN1cnJlbnRQY2kgPSBQY2lTdHJ1Y3Q7Ci19Ci0KLSNpZm5kZWYgX19hbHBoYV9fCi1zdGF0aWMgQ0FSRDMyCi1yZWFkUGNpQ2ZnMShDQVJEMzIgcmVnKQotewotICAgIENBUkQzMiB2YWw7Ci0KLSAgICBvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgcmVnKTsKLSAgICB2YWwgPSBpbmwoUENJX01PREUxX0RBVEFfUkVHKTsKLSAgICBvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgMCk7Ci0gICAgUF9wcmludGYoInJlYWRpbmc6IDB4JXggZnJvbSAweCV4XG4iLHZhbCxyZWcpOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZVBjaUNmZzEoQ0FSRDMyIHJlZywgQ0FSRDMyIHZhbCkKLXsKLSAgICBQX3ByaW50Zigid3JpdGluZzogMHgleCB0byAweCV4XG4iLHZhbCxyZWcpOwotICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCByZWcpOwotICAgIG91dGwoUENJX01PREUxX0RBVEFfUkVHLHZhbCk7Ci0gICAgb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIDApOwotfQotCi1zdGF0aWMgQ0FSRDMyCi1yZWFkUGNpQ2ZnMihDQVJEMzIgcmVnKQotewotICAgIENBUkQzMiB2YWw7Ci0gICAgQ0FSRDggYnVzID0gKHJlZyA+PiAxNikgJiAweGZmOwotICAgIENBUkQ4IGRldiA9IChyZWcgPj4gMTEpICYgMHgxZjsKLSAgICBDQVJEOCBudW0gPSByZWcgJiAweGZmOwotCi0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHhGMSk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcsIGJ1cyk7Ci0gICAgdmFsID0gaW5sKChkZXYgPDwgOCkgKyBudW0pOwotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4MDApOwotICAgIFBfcHJpbnRmKCJyZWFkaW5nOiAweCV4IGZyb20gMHgleFxuIix2YWwscmVnKTsKLSAgICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVQY2lDZmcyKENBUkQzMiByZWcsIENBUkQzMiB2YWwpCi17Ci0gICAgQ0FSRDggYnVzID0gKHJlZyA+PiAxNikgJiAweGZmOwotICAgIENBUkQ4IGRldiA9IChyZWcgPj4gMTEpICYgMHgxZjsKLSAgICBDQVJEOCBudW0gPSByZWcgJiAweGZmOwotCi0gICAgUF9wcmludGYoIndyaXRpbmc6IDB4JXggdG8gMHgleFxuIix2YWwscmVnKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweEYxKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgYnVzKTsKLSAgICBvdXRsKChkZXYgPDwgOCkgKyBudW0sdmFsKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweDAwKTsKLX0KLSNlbmRpZgotCi12b2lkCi1wY2lWaWRlb0Rpc2FibGUodm9pZCkKLXsKLSAgICAvKiBkaXNhYmxlIFZHQSByb3V0aW5nIG9uIGJyaWRnZXMgKi8KLSAgICBQY2lCdXNQdHIgcGJwID0gUGNpQnVzZXM7Ci0gICAgUGNpU3RydWN0UHRyIHBjcCA9IFBjaVN0cnVjdDsKLQotICAgIHdoaWxlIChwYnApIHsKLQl3cml0ZVBjaShwYnAtPlNsb3QubCB8IDB4M2MsIHBicC0+YmN0bCAmIH4oQ0FSRDMyKSg4PDwxNikpOwotCXBicCA9IHBicC0+bmV4dDsKLSAgICB9Ci0gICAgLyogZGlzYWJsZSBkaXNwbGF5IGRldmljZXMgKi8KLSAgICB3aGlsZSAocGNwKSB7Ci0Jd3JpdGVQY2kocGNwLT5TbG90LmwgfCAweDA0LCBwY3AtPmNtZF9zdCAmIH4oQ0FSRDMyKTMpOwotCXdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgzMCwgcGNwLT5Sb21CYXNlICYgfihDQVJEMzIpMSk7Ci0JcGNwID0gcGNwLT5uZXh0OwotICAgIH0KLX0KLQotdm9pZAotcGNpVmlkZW9SZXN0b3JlKHZvaWQpCi17Ci0gICAgLyogZGlzYWJsZSBWR0Egcm91dGluZyBvbiBicmlkZ2VzICovCi0gICAgUGNpQnVzUHRyIHBicCA9IFBjaUJ1c2VzOwotICAgIFBjaVN0cnVjdFB0ciBwY3AgPSBQY2lTdHJ1Y3Q7Ci0KLSAgICB3aGlsZSAocGJwKSB7Ci0Jd3JpdGVQY2kocGJwLT5TbG90LmwgfCAweDNjLCBwYnAtPmJjdGwpOwotCXBicCA9IHBicC0+bmV4dDsKLSAgICB9Ci0gICAgLyogZGlzYWJsZSBkaXNwbGF5IGRldmljZXMgKi8KLSAgICB3aGlsZSAocGNwKSB7Ci0Jd3JpdGVQY2kocGNwLT5TbG90LmwgfCAweDA0LCBwY3AtPmNtZF9zdCk7Ci0Jd3JpdGVQY2kocGNwLT5TbG90LmwgfCAweDMwLCBwY3AtPlJvbUJhc2UpOwotCXBjcCA9IHBjcC0+bmV4dDsKLSAgICB9Ci19Ci0KLXZvaWQKLUVuYWJsZUN1cnJlbnQoKQotewotICAgIFBjaUJ1c1B0ciBwYnA7Ci0gICAgUGNpU3RydWN0UHRyIHBjcCA9IEN1cnJlbnRQY2k7Ci0KLSAgICBwY2lWaWRlb0Rpc2FibGUoKTsKLQotICAgIHBicCA9IHBjcC0+cEJ1czsKLSAgICB3aGlsZSAocGJwKSB7IC8qIGVuYWJsZSBicmlkZ2VzICovCi0Jd3JpdGVQY2kocGJwLT5TbG90LmwgfCAweDNjLCBwYnAtPmJjdGwgfCAoQ0FSRDMyKSg4PDwxNikpOwotCXBicCA9IHBicC0+cEJ1czsKLSAgICB9Ci0gICAgd3JpdGVQY2kocGNwLT5TbG90LmwgfCAweDA0LCBwY3AtPmNtZF9zdCB8IChDQVJEMzIpMyk7Ci0gICAgd3JpdGVQY2kocGNwLT5TbG90LmwgfCAweDMwLCBwY3AtPlJvbUJhc2UgfCAoQ0FSRDMyKTEpOwotfQotCi1DQVJEOAotUGNpUmVhZDgoaW50IG9mZnNldCwgQ0FSRDMyIFNsb3QpCi17Ci0gICAgaW50IHNoaWZ0ID0gb2Zmc2V0ICYgMHgzOwotICAgIG9mZnNldCA9IG9mZnNldCAmIDB4RkM7Ci0gICAgcmV0dXJuICgocmVhZFBjaShTbG90IHwgb2Zmc2V0KSA+PiAoc2hpZnQgPDwgMykpICYgMHhmZik7Ci19Ci0KLUNBUkQxNgotUGNpUmVhZDE2KGludCBvZmZzZXQsIENBUkQzMiBTbG90KQotewotICAgIGludCBzaGlmdCA9IG9mZnNldCAmIDB4MjsKLSAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOwotICAgIHJldHVybiAoKHJlYWRQY2koU2xvdCB8IG9mZnNldCkgPj4gKHNoaWZ0IDw8IDMpKSAmIDB4ZmZmZik7Ci19Ci0KLUNBUkQzMgotUGNpUmVhZDMyKGludCBvZmZzZXQsIENBUkQzMiBTbG90KQotewotICAgIG9mZnNldCA9IG9mZnNldCAmIDB4RkM7Ci0gICAgcmV0dXJuIChyZWFkUGNpKFNsb3QgfCBvZmZzZXQpKTsKLX0KLQotdm9pZAotUGNpV3JpdGU4KGludCBvZmZzZXQsIENBUkQ4IGJ5dGUsIENBUkQzMiBTbG90KQotewotICAgIENBUkQzMiB2YWw7Ci0gICAgaW50IHNoaWZ0ID0gb2Zmc2V0ICYgMHgzOwotICAgIG9mZnNldCA9IG9mZnNldCAmIDB4RkM7Ci0gICAgdmFsID0gcmVhZFBjaShTbG90IHwgb2Zmc2V0KTsKLSAgICB2YWwgJj0gfihDQVJEMzIpKDB4ZmYgPDwgKHNoaWZ0IDw8IDMpKTsKLSAgICB2YWwgfD0gYnl0ZSA8PCAoc2hpZnQgPDwgMyk7Ci0gICAgd3JpdGVQY2koU2xvdCB8IG9mZnNldCwgdmFsKTsKLX0KLQotdm9pZAotUGNpV3JpdGUxNihpbnQgb2Zmc2V0LCBDQVJEMTYgd29yZCwgQ0FSRDMyIFNsb3QpCi17Ci0gICAgQ0FSRDMyIHZhbDsKLSAgICBpbnQgc2hpZnQgPSBvZmZzZXQgJiAweDI7Ci0gICAgb2Zmc2V0ID0gb2Zmc2V0ICYgMHhGQzsKLSAgICB2YWwgPSByZWFkUGNpKFNsb3QgfCBvZmZzZXQpOwotICAgIHZhbCAmPSB+KENBUkQzMikoMHhmZmZmIDw8IChzaGlmdCA8PCAzKSk7Ci0gICAgdmFsIHw9IHdvcmQgPDwgKHNoaWZ0IDw8IDMpOwotICAgIHdyaXRlUGNpKFNsb3QgfCBvZmZzZXQsIHZhbCk7Ci19Ci0KLXZvaWQKLVBjaVdyaXRlMzIoaW50IG9mZnNldCwgQ0FSRDMyIGxnLCBDQVJEMzIgU2xvdCkKLXsKLSAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOwotICAgIHdyaXRlUGNpKFNsb3QgfCBvZmZzZXQsIGxnKTsKLX0KLQotaW50Ci1tYXBQY2lSb20oUGNpU3RydWN0UHRyIHBjaVApCi17Ci0gICAgdW5zaWduZWQgbG9uZyBSb21CYXNlID0gMDsKLSAgICBpbnQgbWVtX2ZkOwotICAgIHVuc2lnbmVkIGNoYXIgKm1lbSwgKnB0cjsKLSAgICB1bnNpZ25lZCBjaGFyICpzY3JhdGNoID0gTlVMTDsKLSAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICBDQVJEMzIgYmlvc1NpemUgPSAweDEwMDAwMDA7Ci0gICAgQ0FSRDMyIGVuYWJsZVBjaTsKLQotICAgIGlmICghcGNpUCkKLSAgICAgIHBjaVAgPSBDdXJyZW50UGNpOwotCi0gICAgaWYgKEZJWF9ST00pIHsKLQlSb21CYXNlID0gZmluZEJJT1NNYXAocGNpUCwgJmJpb3NTaXplKTsKLQlpZiAoIVJvbUJhc2UpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZW1hcCBCSU9TIG9mICVpOiVpOiVpICIKLQkJICAgICItIHRyeWluZyBwcmVzZXQgYWRkcmVzc1xuIixwY2lQLT5idXMscGNpUC0+ZGV2LAotCQkgICAgcGNpUC0+ZnVuYyk7Ci0JICAgIFJvbUJhc2UgPSBwY2lQLT5Sb21CYXNlICYgfihDQVJEMzIpMHhGRjsKLQl9Ci0gICAgfSAgZWxzZSB7Ci0JUm9tQmFzZSA9IHBjaVAtPlJvbUJhc2UgJiB+KENBUkQzMikweEZGOwotCWlmICh+Um9tQmFzZSArIDEgPCBiaW9zU2l6ZSB8fCAhUm9tQmFzZSkKLQkgICAgUm9tQmFzZSA9IGZpbmRCSU9TTWFwKHBjaVAsICZiaW9zU2l6ZSk7Ci0gICAgfQotCi0gICAgUF9wcmludGYoIlJvbUJhc2U6IDB4JWx4XG4iLFJvbUJhc2UpOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXN0b3JlTWVtKHBjaVApOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgUGNpV3JpdGUzMigweDMwLFJvbUJhc2UgfCAxLHBjaVAtPlNsb3QubCk7Ci0KLSNpZmRlZiBfX2FscGhhX18KLSAgICBtZW0gPSBwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoMCwgYmlvc1NpemUsIFBST1RfUkVBRCwKLQkJCQkgICAgICBNQVBfU0hBUkVELCBtZW1fZmQsIFJvbUJhc2UgfCBfYnVzX2Jhc2UoKSk7Ci0jZWxzZQotICAgIG1lbSA9IHB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgwLCBiaW9zU2l6ZSwgUFJPVF9SRUFELAotCQkJCSAgICAgIE1BUF9TSEFSRUQsIG1lbV9mZCwgUm9tQmFzZSk7Ci0jZW5kaWYKLSAgICBpZiAocGNpUCAhPSBDdXJyZW50UGNpKSB7Ci0gICAgICBlbmFibGVQY2kgPSBQY2lSZWFkMzIoMHg0LHBjaVAtPlNsb3QubCk7Ci0gICAgICBQY2lXcml0ZTMyKDB4NCxlbmFibGVQY2kgfCAweDIscGNpUC0+U2xvdC5sKTsKLSAgICB9Ci0KLSNpZmRlZiBQUklOVF9QQ0kKLSAgICBkcHJpbnQoKHVuc2lnbmVkIGxvbmcpcHRyLDB4MzApOwotI2VuZGlmCi0gICAgd2hpbGUgKCAqcHRyID09IDB4NTUgJiYgKihwdHIrMSkgPT0gMHhBQSkgewotCXVuc2lnbmVkIHNob3J0IGRhdGFfb2ZmID0gKihwdHIrMHgxOCkgfCAoKihwdHIrMHgxOSk8PCA4KTsKLQl1bnNpZ25lZCBjaGFyICpkYXRhID0gcHRyICsgZGF0YV9vZmY7Ci0JdW5zaWduZWQgY2hhciB0eXBlOwotCWludCBpOwotCi0JaWYgKCpkYXRhIT0nUCcgfHwgKihkYXRhKzEpIT0nQycgfHwgKihkYXRhKzIpIT0nSScgfHwgKihkYXRhKzMpIT0nUicpIHsKLQkgICAgYnJlYWs7Ci0JfQotCXR5cGUgPSAqKGRhdGEgKyAweDE0KTsKLQlQX3ByaW50ZigiZGF0YSBzZWdtZW50IGluIEJJT1M6IDB4JXgsIHR5cGU6IDB4JXggIixkYXRhX29mZix0eXBlKTsKLQotCWlmICh0eXBlICE9IDApICB7IC8qIG5vdCBQQy1BVCBpbWFnZTogZmluZCBuZXh0IG9uZSAqLwotCSAgICB1bnNpZ25lZCBpbnQgaW1hZ2VfbGVuZ3RoOwotCSAgICB1bnNpZ25lZCBjaGFyIGluZGljYXRvciA9ICooZGF0YSArIDB4MTUpOwotCSAgICBpZiAoaW5kaWNhdG9yICYgMHg4MCkgLyogbGFzdCBpbWFnZSAqLwotCQlicmVhazsKLQkgICAgaW1hZ2VfbGVuZ3RoID0gKCooZGF0YSArIDB4MTApCi0JCQkgICAgfCAoKihkYXRhICsgMHgxMSkgPDwgOCkpIDw8IDk7Ci0JICAgIFBfcHJpbnRmKCJkYXRhIGltYWdlIGxlbmd0aDogMHgleCwgaW5kOiAweCV4XG4iLAotCQkgICAgIGltYWdlX2xlbmd0aCxpbmRpY2F0b3IpOwotCSAgICBwdHIgPSBwdHIgKyBpbWFnZV9sZW5ndGg7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQkvKiBPSywgd2UgaGF2ZSBhIFBDIEltYWdlICovCi0JbGVuZ3RoID0gKCoocHRyICsgMikgPDwgOSk7Ci0JUF9wcmludGYoIkJJT1MgbGVuZ3RoOiAweCV4XG4iLGxlbmd0aCk7Ci0Jc2NyYXRjaCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKGxlbmd0aCk7Ci0JLyogZG9uJ3QgdXNlIG1lbWNweSgpIGhlcmU6IFJlYWRpbmcgZnJvbSBidXMhICovCi0JZm9yIChpPTA7aTxsZW5ndGg7aSsrKQotCSAgICAqKHNjcmF0Y2ggKyBpKT0qKHB0ciArIGkpOwotCWJyZWFrOwotICAgIH0KLQotICAgIGlmIChwY2lQICE9IEN1cnJlbnRQY2kpCi0gICAgICBQY2lXcml0ZTMyKDB4NCxlbmFibGVQY2kscGNpUC0+U2xvdC5sKTsKLQotICAgIC8qIHVubWFwL2Nsb3NlL2Rpc2FibGUgUENJIGJpb3MgbWVtICovCi0gICAgbXVubWFwKG1lbSwgYmlvc1NpemUpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgLyogZGlzYWJsZSBhbmQgcmVzdG9yZSBtYXBwaW5nICovCi0gICAgd3JpdGVQY2kocGNpUC0+U2xvdC5sIHwgMHgzMCwgcGNpUC0+Um9tQmFzZSAmIH4oQ0FSRDMyKTEpOwotCi0gICAgaWYgKHNjcmF0Y2ggJiYgbGVuZ3RoKSB7Ci0JbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopVl9CSU9TLCBzY3JhdGNoLCBsZW5ndGgpOwotCWZyZWUoc2NyYXRjaCk7Ci0gICAgfQotCi0gICAgcmVzdG9yZU1lbShwY2lQKTsKLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi1DQVJEMzIKLWZpbmRQY2koQ0FSRDE2IHNsb3RCWCkKLXsKLSAgICBDQVJEMzIgc2xvdCA9IHNsb3RCWCA8PCA4OwotCi0gICAgaWYgKHNsb3QgPT0gKEN1cnJlbnRQY2ktPlNsb3QubCAmIH5QQ0lfRU4pKQotCXJldHVybiAoQ3VycmVudFBjaS0+U2xvdC5sIHwgUENJX0VOKTsKLSAgICBlbHNlIHsKLSNpZiAhU0hPV19BTExfREVWCi0JUGNpQnVzUHRyIHBCdXMgPSBDdXJyZW50UGNpLT5wQnVzOwotCXdoaWxlIChwQnVzKSB7Ci0JICAvKiAgICAgIGZwcmludGYoc3RkZXJyLCJzbG90OiAweCV4ICBicmlkZ2U6IDB4JXhcbiIsc2xvdCwgcEJ1cy0+U2xvdC5sKTsgKi8KLQkgICAgaWYgKHNsb3QgPT0gKHBCdXMtPlNsb3QubCAmIH5QQ0lfRU4pKQotCQlyZXR1cm4gcEJ1cy0+U2xvdC5sIHwgUENJX0VOOwotCSAgICBwQnVzID0gcEJ1cy0+bmV4dDsKLQl9Ci0jZWxzZQotCVBjaVN0cnVjdFB0ciBwUGNpID0gUGNpU3RydWN0OwotCXdoaWxlIChwUGNpKSB7Ci0JICAvKmZwcmludGYoc3RkZXJyLCJzbG90OiAweCV4ICBicmlkZ2U6IDB4JXhcbiIsc2xvdCwgcFBjaS0+U2xvdC5sKTsgKi8KLQkgICAgaWYgKHNsb3QgPT0gKHBQY2ktPlNsb3QubCAmIH5QQ0lfRU4pKQotCQlyZXR1cm4gcFBjaS0+U2xvdC5sIHwgUENJX0VOOwotCSAgICBwUGNpID0gcFBjaS0+bmV4dDsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUNBUkQxNgotcGNpU2xvdEJYKFBjaVN0cnVjdFB0ciBwUGNpKQotewotICAgIHJldHVybiAoQ0FSRDE2KSgocFBjaS0+U2xvdC5sID4+IDgpICYgMHhGRkZGKTsKLX0KLQotUGNpU3RydWN0UHRyCi1maW5kUGNpRGV2aWNlKENBUkQxNiB2ZW5kb3JJRCwgQ0FSRDE2IGRldmljZUlELCBjaGFyIG4pCi17Ci0gICAgUGNpU3RydWN0UHRyIHBQY2kgPSBDdXJyZW50UGNpOwotICAgIG4rKzsKLQotICAgIHdoaWxlIChwUGNpKSAgewotCWlmICgocFBjaS0+VmVuZG9ySUQgPT0gdmVuZG9ySUQpICYmIChwUGNpLT5EZXZpY2VJRCA9PSBkZXZpY2VJRCkpIHsKLQlpZiAoISgtLW4pKSBicmVhazsKLQl9Ci0gICAgcFBjaSA9IHBQY2ktPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiBwUGNpOwotfQotCi1QY2lTdHJ1Y3RQdHIKLWZpbmRQY2lDbGFzcyhDQVJEOCBpbnRmLCBDQVJEOCBzdWJDbGFzcywgQ0FSRDE2IGNsYXNzLCBjaGFyIG4pCi17Ci0gICAgUGNpU3RydWN0UHRyIHBQY2kgPSBDdXJyZW50UGNpOwotICAgIG4rKzsKLQotICAgIHdoaWxlIChwUGNpKSAgewotCWlmICgocFBjaS0+SW50ZXJmYWNlID09IGludGYpICYmIChwUGNpLT5TdWJDbGFzcyA9PSBzdWJDbGFzcykKLQkgJiYgKHBQY2ktPkJhc2VDbGFzcyA9PSBjbGFzcykpIHsKLQlpZiAoISgtLW4pKSBicmVhazsKLQl9Ci0gICAgcFBjaSA9IHBQY2ktPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiBwUGNpOwotfQotCi1zdGF0aWMgdm9pZAotcmVhZENvbmZpZ1NwYWNlQ2ZnMShDQVJEMzIgYnVzLCBDQVJEMzIgZGV2LCBDQVJEMzIgZnVuYywgQ0FSRDMyICpyZWcpCi17Ci0gICAgQ0FSRDMyICAgY29uZmlnX2NtZCA9IFBDSV9FTiB8IChidXM8PDE2KSB8Ci0gICAgICAoZGV2PDwxMSkgfCAoZnVuYzw8OCk7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpPDY0O2krPTQpIHsKLSNpZmRlZiBfX2FscGhhX18KLQlyZWdbaV0gPSBheHBQY2lDZmdSZWFkKGNvbmZpZ19jbWQgfCBpKTsKLSNlbHNlCi0Jb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIGNvbmZpZ19jbWQgfCBpKTsKLQlyZWdbaV0gPSBpbmwoUENJX01PREUxX0RBVEFfUkVHKTsKLSNlbmRpZgotCi0jaWZkZWYgVjg2QklPU19ERUJVRwotCVBfcHJpbnRmKCIweCVseFxuIixyZWdbaV0pOwotI2VuZGlmCi0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1jaGVja1Nsb3RDZmcxKENBUkQzMiBidXMsIENBUkQzMiBkZXYsIENBUkQzMiBmdW5jKQotewotICAgIENBUkQzMiAgICBjb25maWdfY21kID0gUENJX0VOIHwgKGJ1czw8MTYpIHwKLSAgICAgIChkZXY8PDExKSB8IChmdW5jPDw4KTsKLSAgICBDQVJEMzIgcmVnOwotI2lmZGVmIF9fYWxwaGFfXwotCXJlZyA9IGF4cFBjaUNmZ1JlYWQoY29uZmlnX2NtZCk7Ci0jZWxzZQotCW91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCBjb25maWdfY21kKTsKLQlyZWcgPSBpbmwoUENJX01PREUxX0RBVEFfUkVHKTsKLSNlbmRpZgotICAgIGlmIChyZWcgIT0gMHhGRkZGRkZGRikKLQlyZXR1cm4gMTsKLSAgICBlbHNlCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrU2xvdENmZzIoQ0FSRDMyIGJ1cywgaW50IGRldikKLXsKLSAgICBDQVJEMzIgdmFsOwotCi0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHhGMSk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcsIGJ1cyk7Ci0gICAgdmFsID0gaW5sKGRldiA8PCA4KTsKLSAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgMHgwMCk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHgwMCk7Ci0gICAgaWYgKHZhbCA9PSAweEZGRkZGRkZGKQotCXJldHVybiAwOwotICAgIGlmICh2YWwgPT0gMHhGMEYwRjBGMCkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXJlYWRDb25maWdTcGFjZUNmZzIoQ0FSRDMyIGJ1cywgaW50IGRldiwgQ0FSRDMyICpyZWcpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweEYxKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgYnVzKTsKLSAgICBmb3IgKGkgPSAwOyBpPDY0O2krPTQpIHsKLQlyZWdbaV0gPSBpbmwoKGRldiA8PCA4KSArIGkpOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLQlQX3ByaW50ZigiMHglbHhcbiIscmVnW2ldKTsKLSNlbmRpZgotICAgIH0KLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweDAwKTsKLX0KLQotc3RhdGljIENBUkQ4Ci1pbnRlcnByZXRDb25maWdTcGFjZShDQVJEMzIgKnJlZywgaW50IGJ1c2lkeCwgQ0FSRDggZGV2LCBDQVJEOCBmdW5jKQotewotICAgIENBUkQzMiBjb25maWdfY21kOwotICAgIENBUkQxNiB2ZW5kb3IsIGRldmljZTsKLSAgICBDQVJEOCBiYXNlY2xhc3MsIHN1YmNsYXNzOwotICAgIENBUkQ4IHByaW1hcnksIHNlY29uZGFyeTsKLSAgICBDQVJEOCBoZWFkZXIsIGludGVyZmFjZTsKLSAgICBpbnQgaTsKLQotICAgIGNvbmZpZ19jbWQgPSBQQ0lfRU4gfCBidXNpZHg8PDE2IHwKLQkoZGV2PDwxMSkgfCAoZnVuYzw8OCk7Ci0KLSAgICBmb3IgKGkgPSAweDEwOyBpIDwgMHgyODsgaSs9NCkgewotCWlmIChJU19NRU0zMihyZWdbaV0pKQotCSAgICBpZiAoKHJlZ1tpXSAmIDB4RkZGRkZGRjApIDwgcGNpTWluTWVtUmVnKQotCQlwY2lNaW5NZW1SZWcgPSAocmVnW2ldICYgMHhGRkZGRkZGMCk7Ci0jaWZkZWYgX19hbHBoYV9fCi0JaWYgKElTX01FTTY0KHJlZ1tpXSkpIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyID0gcmVnW2ldIHwKLQkgICAgICAodW5zaWduZWQgbG9uZykocmVnW2krNF0pIDw8IDMyOwotCSAgICBpZiAoKGFkZHIgJiB+MHhmTCkgPCBwY2lNaW5NZW1SZWcpCi0JCXBjaU1pbk1lbVJlZyA9IChhZGRyICYgfjB4ZkwpOwotCSAgICBpKz00OwotCX0KLSNlbmRpZgotICAgIH0KLSAgICB2ZW5kb3IgPSByZWdbMF0gJiAweEZGRkY7Ci0gICAgZGV2aWNlID0gcmVnWzBdID4+IDE2OwotICAgIFBfcHJpbnRmKCJidXM6ICVpIGNhcmQ6ICVpIGZ1bmMgJWkgcmVnMDogMHgleCAiLCBidXNpZHgsZGV2LGZ1bmMscmVnWzBdKTsKLSAgICBiYXNlY2xhc3MgPSByZWdbOF0gPj4gMjQ7Ci0gICAgc3ViY2xhc3MgPSAocmVnWzhdID4+IDE2KSAmIDB4RkY7Ci0gICAgaW50ZXJmYWNlID0gKHJlZ1s4XSA+PiA4KSAmIDB4RkY7Ci0KLSAgICBoZWFkZXIgPSAocmVnWzB4MGNdID4+IDE2KSAmIDB4ZmY7Ci0gICAgUF9wcmludGYoImJjIDB4JXgsIHN1YiAweCV4LCBpZiAweCV4LCBoZHIgMHgleFxuIiwKLQkgICAgIGJhc2VjbGFzcyxzdWJjbGFzcyxpbnRlcmZhY2UsaGVhZGVyKTsKLSAgICBpZiAoQlJJREdFX0NMQVNTKGJhc2VjbGFzcykpIHsKLQlpZiAoQlJJREdFX1BDSV9DTEFTUyhzdWJjbGFzcykpIHsKLQkgICAgUGNpQnVzUHRyIHBicCA9IG1hbGxvYyhzaXplb2YoUGNpQnVzUmVjKSk7Ci0JICAgIFBfcHJpbnRmKCJQY2ktUGNpIEJyaWRnZSBmb3VuZDsgIik7Ci0JICAgIHByaW1hcnkgPSByZWdbMHgxOF0gJiAweEZGOwotCSAgICBzZWNvbmRhcnkgPSAocmVnWzB4MThdID4+IDgpICYgMHhGRjsKLQkgICAgUF9wcmludGYoInByaW1hcnk6IDB4JXggc2Vjb25kYXJ5OiAweCV4XG4iLAotCQkgICAgIHByaW1hcnksc2Vjb25kYXJ5KTsKLQkgICAgcGJwLT5iY3RsID0gcmVnWzB4M2NdOwotCSAgICBwYnAtPnByaW1hcnkgPSBwcmltYXJ5OwotCSAgICBwYnAtPnNlY29uZGFyeSA9IHNlY29uZGFyeTsKLQkgICAgcGJwLT5TbG90LmwgPSBjb25maWdfY21kOwotCSAgICBwYnAtPm5leHQgPSBQY2lCdXNlczsKLQkgICAgUGNpQnVzZXMgPSBwYnA7Ci0JICAgIG51bWJ1cysrOwotCX0gZWxzZSBpZiAoQlJJREdFX0hPU1RfQ0xBU1Moc3ViY2xhc3MpCi0JCSAgICYmIChob3N0YnJpZGdlcysrID4gMSkpIHsKLQkgICAgbnVtYnVzKys7Ci0JfQotICAgIH0gZWxzZSBpZiAoVklERU9fQ0xBU1MoYmFzZWNsYXNzLHN1YmNsYXNzKSkgewotCVBjaVN0cnVjdFB0ciBwY3AgPSBtYWxsb2Moc2l6ZW9mKFBjaVN0cnVjdFJlYykpOwotCVBfcHJpbnRmKCJEaXNwbGF5IGFkYXB0ZXIgZm91bmRcbiIpOwotCXBjcC0+Um9tQmFzZSA9IHJlZ1sweDMwXTsKLQlwY3AtPmNtZF9zdCA9IHJlZ1s0XTsKLQlwY3AtPmFjdGl2ZSA9IChyZWdbNF0gJiAweDAzKSA9PSAzID8gMSA6IDA7Ci0JcGNwLT5WZW5kb3JJRCA9IHZlbmRvcjsKLQlwY3AtPkRldmljZUlEID0gZGV2aWNlOwotCXBjcC0+SW50ZXJmYWNlID0gaW50ZXJmYWNlOwotCXBjcC0+QmFzZUNsYXNzID0gYmFzZWNsYXNzOwotCXBjcC0+U3ViQ2xhc3MgPSBzdWJjbGFzczsKLQlwY3AtPlNsb3QubCA9IGNvbmZpZ19jbWQ7Ci0JcGNwLT5idXMgPSBidXNpZHg7Ci0JcGNwLT5kZXYgPSBkZXY7Ci0JcGNwLT5mdW5jID0gZnVuYzsKLQlwY3AtPm5leHQgPSBQY2lTdHJ1Y3Q7Ci0JUGNpU3RydWN0ID0gcGNwOwotICAgIH0KLSAgICBpZiAoKGZ1bmMgPT0gMCkKLQkmJiAoKGhlYWRlciAmIFBDSV9NVUxUSUZVTkNfREVWKSA9PSAwKSkKLQlmdW5jID0gODsKLSAgICBlbHNlCi0JZnVuYysrOwotICAgIHJldHVybiBmdW5jOwotfQotCi1zdGF0aWMgQ0FSRDMyIHJlbWFwTUVNX3ZhbDsKLXN0YXRpYyBpbnQgcmVtYXBNRU1fbnVtOwotCi1zdGF0aWMgaW50IC8qIG1hcCBpdCBvbiBzb21lIG90aGVyIHZpZGVvIGRldmljZSAqLwotcmVtYXBNZW0oUGNpU3RydWN0UHRyIHBjaVAsIGludCBudW0sIENBUkQzMiBzaXplKQotewotICAgIFBjaVN0cnVjdFB0ciBwY2lQdHIgPSBQY2lTdHJ1Y3Q7Ci0gICAgaW50IGk7Ci0gICAgQ0FSRDMyIG9yZzsKLSAgICBDQVJEMzIgdmFsOwotICAgIENBUkQzMiBzaXplX247Ci0KLSAgICBvcmcgPSBQY2lSZWFkMzIobnVtICsgMHgxMCxwY2lQLT5TbG90LmwpOwotCi0gICAgd2hpbGUgKHBjaVB0cikgewotCWZvciAoaSA9IDA7IGkgPCAyMDsgaT1pKzQpIHsKLQotCSAgICB2YWwgPSBQY2lSZWFkMzIoaSArIDB4MTAscGNpUHRyLT5TbG90LmwpOwotCSAgICAvKiBkb24ndCBtYXAgaXQgb24gaXRzZWxmICovCi0JICAgIGlmICgob3JnICYgMHhmZmZmZmZmMCkgPT0gKHZhbCAmIDB4ZmZmZmZmZjApKQotCQljb250aW51ZTsKLQkgICAgaWYgKHZhbCAmJiAhKHZhbCAmIDEpKQotCQlQY2lXcml0ZTMyKGkgKyAweDEwLDB4ZmZmZmZmZmYscGNpUHRyLT5TbG90LmwpOwotCSAgICBlbHNlCi0JCWNvbnRpbnVlOwotCSAgICBzaXplX24gPSBQY2lSZWFkMzIoaSArIDB4MTAscGNpUHRyLT5TbG90LmwpOwotCSAgICBQY2lXcml0ZTMyKGkgKyAweDEwLHZhbCxwY2lQdHItPlNsb3QubCk7Ci0JICAgIHNpemVfbiA9IH4oQ0FSRDMyKShzaXplX24gICYgMHhmZmZmZmZmMCkgKyAxOwotCi0JICAgIGlmIChzaXplX24gPj0gc2l6ZSkgewotCQlQY2lXcml0ZTMyKG51bSArIDB4MTAsdmFsLHBjaVAtPlNsb3QubCk7Ci0JCXJldHVybiAxOwotCSAgICB9Ci0JfQotCXBjaVB0ciA9IHBjaVB0ci0+bmV4dDsKLSAgICB9Ci0gICAgLyogbGFzdCByZXNvcnQ6IHRyeSB0byBnbyBiZWxvdyBsb3dlc3QgUENJIG1lbSBhZGRyZXNzICovCi0gICAgdmFsID0gKChwY2lNaW5NZW1SZWcgJiB+KENBUkQzMikoc2l6ZSAtIDEpKSAtIHNpemUpOwotICAgIGlmICh2YWwgPiAweDdmZmZmZmZmKSB7Ci0JUGNpV3JpdGUzMihudW0gKyAweDEwLHZhbCwgcGNpUC0+U2xvdC5sKTsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLXJlc3RvcmVNZW0oUGNpU3RydWN0UHRyIHBjaVApCi17Ci0gICAgaWYgKHJlbWFwTUVNX3ZhbCA9PSAwKSByZXR1cm47Ci0gICAgUGNpV3JpdGUzMihyZW1hcE1FTV9udW0gKyAweDEwLHJlbWFwTUVNX3ZhbCxwY2lQLT5TbG90LmwpOwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIENBUkQzMgotZmluZEJJT1NNYXAoUGNpU3RydWN0UHRyIHBjaVAsIENBUkQzMiAqYmlvc1NpemUpCi17Ci0gICAgUGNpU3RydWN0UHRyIHBjaVB0ciA9IFBjaVN0cnVjdDsKLSAgICBpbnQgaTsKLSAgICBDQVJEMzIgdmFsOwotICAgIENBUkQzMiBzaXplOwotCi0gICAgUGNpV3JpdGUzMigweDMwLDB4ZmZmZmZmZmYscGNpUC0+U2xvdC5sKTsKLSAgICAqYmlvc1NpemUgPSBQY2lSZWFkMzIoMHgzMCxwY2lQLT5TbG90LmwpOwotICAgIFBfcHJpbnRmKCJiaW9zIHNpemU6IDB4JXhcbiIsKmJpb3NTaXplKTsKLSAgICBQY2lXcml0ZTMyKDB4MzAscGNpUC0+Um9tQmFzZSxwY2lQLT5TbG90LmwpOwotICAgICpiaW9zU2l6ZSA9IH4oKmJpb3NTaXplICYgMHhGRkZGRkYwMCkgKyAxOwotICAgIFBfcHJpbnRmKCJiaW9zIHNpemUgbWFza2VkOiAweCV4XG4iLCpiaW9zU2l6ZSk7Ci0gICAgaWYgKCpiaW9zU2l6ZSA+ICgxMDI0ICogMTAyNCAqIDE2KSkgewotICAgICAgKmJpb3NTaXplID0gMTAyNCAqIDEwMjQgKiAxNjsKLSAgICAgIFBfcHJpbnRmKCJmaXhpbmcgYnJva2VuIEJJT1Mgc2l6ZTogMHgleFxuIiwqYmlvc1NpemUpOwotICAgIH0KLSAgICB3aGlsZSAocGNpUHRyKSB7Ci0JaWYgKHBjaVB0ci0+YnVzICE9IHBjaVAtPmJ1cykgewotCSAgICBwY2lQdHIgPSBwY2lQdHItPm5leHQ7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMjA7IGk9aSs0KSB7Ci0KLQkgICAgdmFsID0gUGNpUmVhZDMyKGkgKyAweDEwLHBjaVB0ci0+U2xvdC5sKTsKLQkgICAgaWYgKCEodmFsICYgMSkpCi0KLQkgICAgUGNpV3JpdGUzMihpICsgMHgxMCwweGZmZmZmZmZmLHBjaVB0ci0+U2xvdC5sKTsKLQkgICAgZWxzZQotCQljb250aW51ZTsKLQkgICAgc2l6ZSA9IFBjaVJlYWQzMihpICsgMHgxMCxwY2lQdHItPlNsb3QubCk7Ci0JICAgIFBjaVdyaXRlMzIoaSArIDB4MTAsdmFsLHBjaVB0ci0+U2xvdC5sKTsKLQkgICAgc2l6ZSA9IH4oQ0FSRDMyKShzaXplICYgMHhGRkZGRkZGMCkgKyAxOwotI2lmZGVmIFY4Nl9CSU9TX0RFQlVHCi0JICAgIFBfcHJpbnRmKCJzaXplOiAweCV4XG4iLHNpemUpOwotI2VuZGlmCi0JICAgIGlmIChzaXplID49ICpiaW9zU2l6ZSkgewotCQlpZiAocGNpUCA9PSBwY2lQdHIpIHsgLyogaWYgc2FtZSBkZXZpY2UgcmVtYXAgcmFtKi8KLQkJICAgIGlmICghKHJlbWFwTWVtKHBjaVAsaSxzaXplKSkpCi0JCQljb250aW51ZTsKLQkJICAgIHJlbWFwTUVNX3ZhbCA9IHZhbDsKLQkJICAgIHJlbWFwTUVNX251bSA9IGk7Ci0JCX0gZWxzZSB7Ci0JCSAgICByZW1hcE1FTV92YWwgPSAwOwotCQl9Ci0JCXJldHVybiB2YWwgJiAweEZGRkZGRjAwOwotCSAgICB9Ci0JfQotCXBjaVB0ciA9IHBjaVB0ci0+bmV4dDsKLSAgICB9Ci0gICAgcmVtYXBNRU1fdmFsID0gMDsKLSAgICAvKiB2ZXJ5IGxhc3QgcmVzb3J0ICovCi0gICAgaWYgKHBjaVAtPmJ1cyA9PSAwICYmIChwY2lNaW5NZW1SZWcgPiAqYmlvc1NpemUpKQotICAgICAgcmV0dXJuIChwY2lNaW5NZW1SZWcgLSBzaXplKSAmIH4oc2l6ZSAtIDEpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2ZnMW91dChDQVJEMTYgYWRkciwgQ0FSRDMyIHZhbCkKLXsKLSAgaWYgKGFkZHIgPT0gMHhDRjgpIHsKLSAgICBQY2lDZmcxQWRkciA9IHZhbDsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIGlmIChhZGRyID09IDB4Q0ZDKSB7Ci0gICAgd3JpdGVQY2koUGNpQ2ZnMUFkZHIsIHZhbCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2ZnMWluKENBUkQxNiBhZGRyLCBDQVJEMzIgKnZhbCkKLXsKLSAgaWYgKGFkZHIgPT0gMHhDRjgpIHsKLSAgICAqdmFsID0gUGNpQ2ZnMUFkZHI7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSBpZiAoYWRkciA9PSAweENGQykgewotICAgICp2YWwgPSByZWFkUGNpKFBjaUNmZzFBZGRyKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbGlzdF9wY2kodm9pZCkKLXsKLSAgICBQY2lTdHJ1Y3RQdHIgcGNpID0gUGNpTGlzdDsKLQotICAgIHdoaWxlIChwY2kpIHsKLSAgICBwcmludGYoIlsweCV4OjB4JXg6MHgleF0gdmVuZG9yOiAweCU0LjR4IGRldjogMHglNC40eCBjbGFzczogMHglNC40eCIKLQkgICAiIHN1YmNsYXNzOiAweCU0LjR4XG4iLHBjaS0+YnVzLHBjaS0+ZGV2LHBjaS0+ZnVuYywKLQkgICBwY2ktPlZlbmRvcklELHBjaS0+RGV2aWNlSUQscGNpLT5CYXNlQ2xhc3MscGNpLT5TdWJDbGFzcyk7Ci0gICAgcGNpID0gcGNpLT5uZXh0OwotICAgIH0KLX0KLQotUGNpU3RydWN0UHRyCi1maW5kUGNpQnlJRHMoaW50IGJ1cywgaW50IGRldiwgaW50IGZ1bmMpCi17Ci0gIFBjaVN0cnVjdFB0ciBwY2lQID0gUGNpTGlzdDsKLQotICB3aGlsZSAocGNpUCkgewotICAgIGlmIChwY2lQLT5idXMgPT0gYnVzICYmIHBjaVAtPmRldiA9PSBkZXYgJiYgcGNpUC0+ZnVuYyA9PSBmdW5jKQotICAgICAgcmV0dXJuIHBjaVA7Ci0gICAgcGNpUCA9IHBjaVAtPm5leHQ7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BjaS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhZDUyMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BjaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotCi0jaWZuZGVmIFY4Nl9QQ0lfSAotI2RlZmluZSBWODZfUENJX0gKLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQgICAgemVybzoyOwotCXVuc2lnbmVkIGludCAgICByZWc6NjsKLQl1bnNpZ25lZCBpbnQgICAgZnVuYzozOwotCXVuc2lnbmVkIGludCAgICBkZXY6NTsKLQl1bnNpZ25lZCBpbnQgICAgYnVzOjg7Ci0JdW5zaWduZWQgaW50ICAgIHJlc2VydmVkOjc7Ci0JdW5zaWduZWQgaW50ICAgIGVuYWJsZToxOwotICAgIH0gcGNpOwotICAgIENBUkQzMiBsOwotfSBQY2lTbG90OwotCi10eXBlZGVmIHN0cnVjdCBwY2lCdXNSZWMgewotICAgIENBUkQ4IHByaW1hcnk7Ci0gICAgQ0FSRDggc2Vjb25kYXJ5OwotICAgIENBUkQzMiBiY3RsOwotICAgIFBjaVNsb3QgU2xvdDsKLSAgICBzdHJ1Y3QgcGNpQnVzUmVjICpuZXh0OwotICAgIHN0cnVjdCBwY2lCdXNSZWMgKnBCdXM7Ci19IFBjaUJ1c1JlYywgKlBjaUJ1c1B0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgcGNpU3RydWN0UmVjIHsKLSAgICBDQVJEMTYgVmVuZG9ySUQ7Ci0gICAgQ0FSRDE2IERldmljZUlEOwotICAgIENBUkQ4IEludGVyZmFjZTsKLSAgICBDQVJEOCBCYXNlQ2xhc3M7Ci0gICAgQ0FSRDggU3ViQ2xhc3M7Ci0gICAgQ0FSRDMyIFJvbUJhc2U7Ci0gICAgQ0FSRDMyIGJ1czsKLSAgICBDQVJEOCBkZXY7Ci0gICAgQ0FSRDggZnVuYzsKLSAgICBDQVJEMzIgY21kX3N0OwotICAgIGludCBhY3RpdmU7Ci0gICAgUGNpU2xvdCBTbG90OwotICAgIHN0cnVjdCBwY2lTdHJ1Y3RSZWMgKm5leHQ7Ci0gICAgUGNpQnVzUHRyIHBCdXM7Ci19IFBjaVN0cnVjdFJlYyAsICpQY2lTdHJ1Y3RQdHI7Ci0KLQotZXh0ZXJuIFBjaVN0cnVjdFB0ciBDdXJyZW50UGNpOwotZXh0ZXJuIFBjaVN0cnVjdFB0ciBQY2lMaXN0OwotZXh0ZXJuIFBjaVN0cnVjdFB0ciBCb290QmlvczsKLWV4dGVybiBpbnQgcGNpTWF4QnVzOwotCi1leHRlcm4gQ0FSRDMyIGZpbmRQY2koQ0FSRDE2IHNsb3RCWCk7Ci1leHRlcm4gQ0FSRDE2IHBjaVNsb3RCWChQY2lTdHJ1Y3RQdHIpOwotUGNpU3RydWN0UHRyIGZpbmRQY2lEZXZpY2UoQ0FSRDE2IHZlbmRvcklELCBDQVJEMTYgZGV2aWNlSUQsIGNoYXIgbik7Ci1QY2lTdHJ1Y3RQdHIgZmluZFBjaUNsYXNzKENBUkQ4IGludGYsIENBUkQ4IHN1YkNsYXNzLCBDQVJEMTYgY2xhc3MsIGNoYXIgbik7Ci0KLWV4dGVybiBDQVJEOCBQY2lSZWFkOChpbnQgb2Zmc2V0LCBDQVJEMzIgc2xvdCk7Ci1leHRlcm4gQ0FSRDE2IFBjaVJlYWQxNihpbnQgb2Zmc2V0LCBDQVJEMzIgc2xvdCk7Ci1leHRlcm4gQ0FSRDMyIFBjaVJlYWQzMihpbnQgb2Zmc2V0LCBDQVJEMzIgc2xvdCk7Ci0KLWV4dGVybiB2b2lkIFBjaVdyaXRlOChpbnQgb2Zmc2V0LENBUkQ4IGJ5dGUsIENBUkQzMiBzbG90KTsKLWV4dGVybiB2b2lkIFBjaVdyaXRlMTYoaW50IG9mZnNldCxDQVJEMTYgd29yZCwgQ0FSRDMyIHNsb3QpOwotZXh0ZXJuIHZvaWQgUGNpV3JpdGUzMihpbnQgb2Zmc2V0LENBUkQzMiBsZywgQ0FSRDMyIHNsb3QpOwotCi1leHRlcm4gdm9pZCBzY2FuX3BjaSh2b2lkKTsKLWV4dGVybiB2b2lkIHBjaVZpZGVvRGlzYWJsZSh2b2lkKTsKLWV4dGVybiB2b2lkIHBjaVZpZGVvUmVzdG9yZSh2b2lkKTsKLWV4dGVybiB2b2lkIEVuYWJsZUN1cnJlbnQodm9pZCk7Ci1leHRlcm4gaW50IG1hcFBjaVJvbShQY2lTdHJ1Y3RQdHIgcGNpUCk7Ci1leHRlcm4gaW50IGNmZzFvdXQoQ0FSRDE2IGFkZHIsIENBUkQzMiB2YWwpOwotZXh0ZXJuIGludCBjZmcxaW4oQ0FSRDE2IGFkZHIsIENBUkQzMiAqdmFsKTsKLWV4dGVybiB2b2lkIGxpc3RfcGNpKHZvaWQpOwotZXh0ZXJuIFBjaVN0cnVjdFB0ciBmaW5kUGNpQnlJRHMoaW50IGJ1cywgaW50IGRldiwgaW50IGZ1bmMpOwotCi0jZGVmaW5lIFBDSV9NT0RFMl9FTkFCTEVfUkVHICAweENGOAotI2RlZmluZSBQQ0lfTU9ERTJfRk9SV0FSRF9SRUcgIDB4Q0ZBCi0jZGVmaW5lIFBDSV9NT0RFMV9BRERSRVNTX1JFRyAgMHhDRjgKLSNkZWZpbmUgUENJX01PREUxX0RBVEFfUkVHICAweENGQwotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykKLSNkZWZpbmUgUENJX0VOIDB4MDAwMDAwMDAKLSNlbHNlCi0jZGVmaW5lIFBDSV9FTiAweDgwMDAwMDAwCi0jZW5kaWYKLSNkZWZpbmUgTUFYX0RFVl9QRVJfVkVORE9SX0NGRzEgIDMyCi0jZGVmaW5lIEJSSURHRV9DTEFTUyh4KSAoeCA9PSAweDA2KQotI2RlZmluZSBCUklER0VfUENJX0NMQVNTKHgpICh4ID09IDB4MDQpCi0jZGVmaW5lIEJSSURHRV9IT1NUX0NMQVNTKHgpICh4ID09IDB4MDApCi0jZGVmaW5lIFBDSV9DTEFTU19QUkVISVNUT1JJQyAweDAwCi0jZGVmaW5lIFBDSV9TVUJDTEFTU19QUkVISVNUT1JJQ19WR0EgMHgwMQotI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWSAweDAzCi0jZGVmaW5lIFBDSV9TVUJDTEFTU19ESVNQTEFZX1ZHQSAweDAwCi0jZGVmaW5lIFBDSV9TVUJDTEFTU19ESVNQTEFZX1hHQSAweDAxCi0jZGVmaW5lIFBDSV9TVUJDTEFTU19ESVNQTEFZX01JU0MgMHg4MAotI2RlZmluZSBWSURFT19DTEFTUyhiLHMpIFwKLSAgICAoKChiKSA9PSBQQ0lfQ0xBU1NfUFJFSElTVE9SSUMgJiYgKHMpID09IFBDSV9TVUJDTEFTU19QUkVISVNUT1JJQ19WR0EpIHx8IFwKLSAgICAgKChiKSA9PSBQQ0lfQ0xBU1NfRElTUExBWSAmJiAocykgPT0gUENJX1NVQkNMQVNTX0RJU1BMQVlfVkdBKSB8fFwKLSAgICAgKChiKSA9PSBQQ0lfQ0xBU1NfRElTUExBWSAmJiAocykgPT0gUENJX1NVQkNMQVNTX0RJU1BMQVlfWEdBKSB8fFwKLSAgICAgKChiKSA9PSBQQ0lfQ0xBU1NfRElTUExBWSAmJiAocykgPT0gUENJX1NVQkNMQVNTX0RJU1BMQVlfTUlTQykpCi0jZGVmaW5lIFBDSV9NVUxUSUZVTkNfREVWICAweDgwCi0jZGVmaW5lIE1BWF9QQ0lfREVWSUNFUyAgIDY0Ci0jZGVmaW5lIFBDSV9NQVhCVVMgMTYKLSNkZWZpbmUgUENJX0lTX01FTSAweDAwMDAwMDAxCi0jZGVmaW5lIE1BWF9QQ0lfUk9NX1NJWkUgKDEwMjQgKiAxMDI0ICogMTYpCi0KLSNkZWZpbmUgSVNfTUVNMzIoeCkgKCh4ICYgMHg3KSA9PSAwICYmIHggIT0gMCkKLSNkZWZpbmUgSVNfTUVNNjQoeCkgKCh4ICYgMHg3KSA9PSAweDQpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGVlZDA0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSA8c3lzL3ZtODYuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHNldGptcC5oPgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSNpbmNsdWRlICJBc21NYWNyb3MuaCIKLQotc3RydWN0IHZtODZfc3RydWN0IHZtODZzOwotCi1zdGF0aWMgaW50IHZtODZfR1BfZmF1bHQodm9pZCk7Ci1zdGF0aWMgaW50IHZtODZfZG9faW50KGludCBudW0pOwotc3RhdGljIHZvaWQgZHVtcF9jb2RlKHZvaWQpOwotc3RhdGljIHZvaWQgZHVtcF9yZWdpc3RlcnModm9pZCk7Ci1zdGF0aWMgdm9pZCBzdGFja190cmFjZSh2b2lkKTsKLXN0YXRpYyBpbnQgdm04Nl9yZXAoc3RydWN0IHZtODZfc3RydWN0ICpwdHIpOwotCi0jZGVmaW5lIENQVV9SRUcoeCkgKHZtODZzLnJlZ3MuIyN4KQotI2RlZmluZSBDUFVfUkVHX0xXKHJlZykgICAgICAoKigoQ0FSRDE2ICopJkNQVV9SRUcocmVnKSkpCi0jZGVmaW5lIENQVV9SRUdfSFcocmVnKSAgICAgICgqKChDQVJEMTYgKikmQ1BVX1JFRyhyZWcpICsgMSkpCi0jZGVmaW5lIENQVV9SRUdfTEIocmVnKSAgICAgICgqKENBUkQ4ICopJkNQVV9SRUcoZSMjcmVnKSkKLSNkZWZpbmUgU0VHX0FEUih0eXBlLCBzZWcsIHJlZykgIHR5cGUoKENQVV9SRUdfTFcoc2VnKSA8PCA0KSBcCi0JCQkJICAgICAgKyBDUFVfUkVHX0xXKGUjI3JlZykpCi0jZGVmaW5lIERGICgxIDw8IDEwKQotCi1zdHJ1Y3QgcGlvIFA7Ci0KLQotdm9pZAotc2V0dXBfaW8odm9pZCkKLXsKLSAgICBpZiAoIUNvbmZpZy5QcmludFBvcnQgJiYgIUNvbmZpZy5Jb1N0YXRpc3RpY3MpIHsKLSAgICBQLmluYiA9IChDQVJEOCgqKShDQVJEMTYpKWluYjsKLSAgICBQLmludyA9IChDQVJEMTYoKikoQ0FSRDE2KSlpbnc7Ci0gICAgUC5pbmwgPSAoQ0FSRDMyKCopKENBUkQxNikpaW5sOwotICAgIFAub3V0YiA9ICh2b2lkKCopKENBUkQxNixDQVJEOCkpb3V0YjsKLSAgICBQLm91dHcgPSAodm9pZCgqKShDQVJEMTYsQ0FSRDE2KSlvdXR3OwotICAgIFAub3V0bCA9ICh2b2lkKCopKENBUkQxNixDQVJEMzIpKW91dGw7Ci0gICAgfSBlbHNlIHsKLSAgICBQLmluYiA9IHBfaW5iOwotICAgIFAuaW53ID0gcF9pbnc7Ci0gICAgUC5pbmwgPSBwX2lubDsKLSAgICBQLm91dGIgPSBwX291dGI7Ci0gICAgUC5vdXR3ID0gcF9vdXR3OwotICAgIFAub3V0bCA9IHBfb3V0bDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldHVwX3ZtODYodW5zaWduZWQgbG9uZyBiaW9zX3N0YXJ0LCBpODZiaW9zUmVnc1B0ciByZWdzKQotewotICAgIENBUkQzMiBlaXA7Ci0gICAgQ0FSRDE2IGNzOwotCi0gICAgdm04NnMuZmxhZ3MgPSBWTTg2X1NDUkVFTl9CSVRNQVA7Ci0gICAgdm04NnMuZmxhZ3MgPSAwOwotICAgIHZtODZzLnNjcmVlbl9iaXRtYXAgPSAwOwotICAgIHZtODZzLmNwdV90eXBlID0gQ1BVXzU4NjsKLSAgICBtZW1zZXQoJnZtODZzLmludF9yZXZlY3RvcmVkLCAweGZmLHNpemVvZih2bTg2cy5pbnRfcmV2ZWN0b3JlZCkpIDsKLSAgICBtZW1zZXQoJnZtODZzLmludDIxX3JldmVjdG9yZWQsIDB4ZmYsc2l6ZW9mKHZtODZzLmludDIxX3JldmVjdG9yZWQpKSA7Ci0KLSAgICBlaXAgPSBiaW9zX3N0YXJ0ICYgMHhGRkZGOwotICAgIGNzID0gKGJpb3Nfc3RhcnQgJiAweEZGMDAwMCkgPj4gNDsKLQotICAgIENQVV9SRUcoZWF4KSA9IHJlZ3MtPmF4OwotICAgIENQVV9SRUcoZWJ4KSA9IHJlZ3MtPmJ4OwotICAgIENQVV9SRUcoZWN4KSA9IHJlZ3MtPmN4OwotICAgIENQVV9SRUcoZWR4KSA9IHJlZ3MtPmR4OwotICAgIENQVV9SRUcoZXNpKSA9IDA7Ci0gICAgQ1BVX1JFRyhlZGkpID0gcmVncy0+ZGk7Ci0gICAgQ1BVX1JFRyhlYnApID0gMDsKLSAgICBDUFVfUkVHKGVpcCkgPSBlaXA7Ci0gICAgQ1BVX1JFRyhjcykgPSBjczsKLSAgICBDUFVfUkVHKGVzcCkgPSAweDEwMDsKLSAgICBDUFVfUkVHKHNzKSA9IDB4MzA7ICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcGMgYmlvcyBzdGFjayAqLwotICAgIENQVV9SRUcoZXMpID0gcmVncy0+ZXM7Ci0gICAgQ1BVX1JFRyhkcykgPSAweDQwOyAgICAgICAgICAgICAgIC8qIHN0YW5kYXJkIHBjIGRzICovCi0gICAgQ1BVX1JFRyhmcykgPSAwOwotICAgIENQVV9SRUcoZ3MpID0gMDsKLSAgICBDUFVfUkVHKGVmbGFncykgfD0gKFZJRl9NQVNLIHwgVklQX01BU0spOwotfQotCi12b2lkCi1jb2xsZWN0X2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzKQotewotICAgIHJlZ3MtPmF4ID0gQ1BVX1JFRyhlYXgpOwotICAgIHJlZ3MtPmJ4ID0gQ1BVX1JFRyhlYngpOwotICAgIHJlZ3MtPmN4ID0gQ1BVX1JFRyhlY3gpOwotICAgIHJlZ3MtPmR4ID0gQ1BVX1JFRyhlZHgpOwotICAgIHJlZ3MtPmVzID0gQ1BVX1JFRyhlcyk7Ci0gICAgcmVncy0+ZHMgPSBDUFVfUkVHKGRzKTsKLSAgICByZWdzLT5kaSA9IENQVV9SRUcoZWRpKTsKLSAgICByZWdzLT5zaSA9IENQVV9SRUcoZXNpKTsKLX0KLQotc3RhdGljIGludAotZG9fdm04Nih2b2lkKQotewotICAgIGludCByZXR2YWw7Ci0KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgZHVtcF9yZWdpc3RlcnMoKTsKLSNlbmRpZgotLyogICAgcmV0dmFsID0gU1lTX3ZtODZvbGQoJnZtODZzKTsgKi8KLS8qICAgIHJldHZhbCA9IHN5c2NhbGwoU1lTX3ZtODZvbGQsJnZtODZzKTsgKi8KLQotICAgIHJldHZhbCA9IHZtODZfcmVwKCZ2bTg2cyk7Ci0KLSAgICBzd2l0Y2ggKFZNODZfVFlQRShyZXR2YWwpKSB7Ci0gICAgY2FzZSBWTTg2X1VOS05PV046Ci0JaWYgKCF2bTg2X0dQX2ZhdWx0KCkpIHJldHVybiAwOwotCWJyZWFrOwotICAgIGNhc2UgVk04Nl9TVEk6Ci0JZnByaW50ZihzdGRlcnIsInZtODZfc3RpIDotKChcbiIpOwotCXN0YWNrX3RyYWNlKCk7Ci0JZHVtcF9jb2RlKCk7Ci0JcmV0dXJuIDA7Ci0gICAgY2FzZSBWTTg2X0lOVHg6Ci0JaWYgKCF2bTg2X2RvX2ludChWTTg2X0FSRyhyZXR2YWwpKSkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiXG5Vbmtub3duIHZtODZfaW50OiAlWFxuXG4iLFZNODZfQVJHKHJldHZhbCkpOwotCSAgICBkdW1wX3JlZ2lzdGVycygpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JLyogSSdtIG5vdCBzdXJlIHlldCB3aGF0IHRvIGRvIGlmIHdlIGNhbiBoYW5kbGUgaW50cyAqLwotCWJyZWFrOwotICAgIGNhc2UgVk04Nl9TSUdOQUw6Ci0JZnByaW50ZihzdGRlcnIsInJlY2VpdmVkIHNpZ25hbFxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgZGVmYXVsdDoKLQlmcHJpbnRmKHN0ZGVyciwidW5rbm93biB0eXBlKDB4JXgpPTB4JXhcbiIsCi0JCVZNODZfQVJHKHJldHZhbCksVk04Nl9UWVBFKHJldHZhbCkpOwotCWR1bXBfcmVnaXN0ZXJzKCk7Ci0JZHVtcF9jb2RlKCk7Ci0Jc3RhY2tfdHJhY2UoKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGptcF9idWYgeDg2X2VzYzsKLXN0YXRpYyB2b2lkCi12bWV4aXQoaW50IHVudXNlZCkKLXsKLSAgICBsb25nam1wKHg4Nl9lc2MsMSk7Ci19Ci0KLXZvaWQKLWRvX3g4Nih1bnNpZ25lZCBsb25nIGJpb3Nfc3RhcnQsIGk4NmJpb3NSZWdzUHRyIHJlZ3MpCi17Ci0gICAgc3RhdGljIHZvaWQgKCpvcmdfaGFuZGxlcikoaW50KTsKLQotICAgIHNldHVwX3ZtODYoYmlvc19zdGFydCwgcmVncyk7Ci0gICAgaWYgKHNldGptcCh4ODZfZXNjKSA9PSAwKSB7Ci0Jb3JnX2hhbmRsZXIgPSBzaWduYWwoMix2bWV4aXQpOwotCXdoaWxlKGRvX3ZtODYoKSkge307Ci0Jc2lnbmFsKDIsb3JnX2hhbmRsZXIpOwotCWNvbGxlY3RfYmlvc19yZWdzKHJlZ3MpOwotICAgIH0gZWxzZSB7Ci0Jc2lnbmFsKDIsb3JnX2hhbmRsZXIpOwotCXByaW50ZigiaW50ZXJydXB0ZWQgYXQgMHgleFxuIiwoKENBUkQxNilDUFVfUkVHKGNzKSkgPDwgNAotCSAgIHwgKENBUkQxNilDUFVfUkVHKGVpcCkpOwotICAgIH0KLX0KLQotLyogZ2V0IHRoZSBsaW5lYXIgYWRkcmVzcyAqLwotI2RlZmluZSBMSU5fUFJFRl9TSSAgKChwcmVmX3NlZyA8PCA0KSArIENQVV9SRUdfTFcoZXNpKSkKLQotI2RlZmluZSBMV0VDWCAgICAgICAocHJlZml4NjYgXiBwcmVmaXg2NyA/IENQVV9SRUcoZWN4KSA6IENQVV9SRUdfTFcoZWN4KSkKLQotc3RhdGljIGludAotdm04Nl9HUF9mYXVsdCh2b2lkKQotewotICAgIHVuc2lnbmVkIGNoYXIgKmNzcCwgKmxpbmE7Ci0gICAgQ0FSRDMyIG9yZ19laXA7Ci0gICAgaW50IHByZWZfc2VnOwotICAgIGludCBkb25lLGlzX3JlcCxwcmVmaXg2NixwcmVmaXg2NzsKLQotCi0gICAgY3NwID0gbGluYSA9IFNFR19BRFIoKHVuc2lnbmVkIGNoYXIgKiksIGNzLCBpcCk7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHByaW50ZigiZXhjZXB0aW9uOiBcbiIpOwotICAgIGR1bXBfY29kZSgpOwotI2VuZGlmCi0KLSAgICBpc19yZXAgPSAwOwotICAgIHByZWZpeDY2ID0gcHJlZml4NjcgPSAwOwotICAgIHByZWZfc2VnID0gLTE7Ci0KLSAgICAvKiBlYXQgdXAgcHJlZml4ZXMgKi8KLSAgICBkb25lID0gMDsKLSAgICBkbyB7Ci0Jc3dpdGNoICgqKGNzcCsrKSkgewotCWNhc2UgMHg2NjogICAgICAvKiBvcGVyYW5kIHByZWZpeCAqLyAgcHJlZml4NjY9MTsgYnJlYWs7Ci0JY2FzZSAweDY3OiAgICAgIC8qIGFkZHJlc3MgcHJlZml4ICovICBwcmVmaXg2Nz0xOyBicmVhazsKLQljYXNlIDB4MmU6ICAgICAgLyogQ1MgKi8gICAgICAgICAgICAgIHByZWZfc2VnPUNQVV9SRUcoY3MpOyBicmVhazsKLQljYXNlIDB4M2U6ICAgICAgLyogRFMgKi8gICAgICAgICAgICAgIHByZWZfc2VnPUNQVV9SRUcoZHMpOyBicmVhazsKLQljYXNlIDB4MjY6ICAgICAgLyogRVMgKi8gICAgICAgICAgICAgIHByZWZfc2VnPUNQVV9SRUcoZXMpOyBicmVhazsKLQljYXNlIDB4MzY6ICAgICAgLyogU1MgKi8gICAgICAgICAgICAgIHByZWZfc2VnPUNQVV9SRUcoc3MpOyBicmVhazsKLQljYXNlIDB4NjU6ICAgICAgLyogR1MgKi8gICAgICAgICAgICAgIHByZWZfc2VnPUNQVV9SRUcoZ3MpOyBicmVhazsKLQljYXNlIDB4NjQ6ICAgICAgLyogRlMgKi8gICAgICAgICAgICAgIHByZWZfc2VnPUNQVV9SRUcoZnMpOyBicmVhazsKLQljYXNlIDB4ZjI6ICAgICAgLyogcmVwbnogKi8KLQljYXNlIDB4ZjM6ICAgICAgLyogcmVwICovICAgICAgICAgICAgIGlzX3JlcD0xOyBicmVhazsKLQlkZWZhdWx0OiBkb25lPTE7Ci0JfQotICAgIH0gd2hpbGUgKCFkb25lKTsKLSAgICBjc3AtLTsgICAvKiBvb3BzIG9uZSB0b28gbWFueSAqLwotICAgIG9yZ19laXAgPSBDUFVfUkVHKGVpcCk7Ci0gICAgQ1BVX1JFR19MVyhlaXApICs9IChjc3AgLSBsaW5hKTsKLQotICAgIHN3aXRjaCAoKmNzcCkgewotCi0gICAgY2FzZSAweDZjOiAgICAgICAgICAgICAgICAgICAgLyogaW5zYiAqLwotCS8qIE5PVEU6IEVTIGNhbid0IGJlIG92ZXJ3cml0dGVuOyBwcmVmaXhlcyA2Niw2NyBzaG91bGQgdXNlIGVzaSxlZGksZWN4Ci0JICogYnV0IGlzIGFueW9uZSB1c2luZyBleHRlbmRlZCByZWdzIGluIHJlYWwgbW9kZT8gKi8KLQkvKiBXQVJOSU5HOiBubyB0ZXN0IGZvciBESSB3cmFwcGluZyEgKi8KLQlDUFVfUkVHX0xXKGVkaSkgKz0gcG9ydF9yZXBfaW5iKENQVV9SRUdfTFcoZWR4KSwKLQkJCQkJU0VHX0FEUigoQ0FSRDggKiksZXMsZGkpLAotCQkJCQlDUFVfUkVHX0xXKGVmbGFncykmREYsCi0JCQkJCShpc19yZXA/IExXRUNYOjEpKTsKLQlpZiAoaXNfcmVwKSBMV0VDWCA9IDA7Ci0JQ1BVX1JFR19MVyhlaXApKys7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4NmQ6ICAgICAgICAgICAgICAgICAgLyogKHJlcCkgaW5zdyAvIGluc2QgKi8KLQkvKiBOT1RFOiBFUyBjYW4ndCBiZSBvdmVyd3JpdHRlbiAqLwotCS8qIFdBUk5JTkc6IG5vIHRlc3QgZm9yIF9ESSB3cmFwcGluZyEgKi8KLQlpZiAocHJlZml4NjYpIHsKLQkgICAgQ1BVX1JFR19MVyhlZGkpICs9IHBvcnRfcmVwX2lubChDUFVfUkVHX0xXKGVkeCksCi0JCQkJCSAgICBTRUdfQURSKChDQVJEMzIgKiksZXMsZGkpLAotCQkJCQkgICAgQ1BVX1JFR19MVyhlZmxhZ3MpJkRGLAotCQkJCQkgICAgKGlzX3JlcD8gTFdFQ1g6MSkpOwotCX0KLQllbHNlIHsKLQkgICAgQ1BVX1JFR19MVyhlZGkpICs9IHBvcnRfcmVwX2ludyhDUFVfUkVHX0xXKGVkeCksCi0JCQkJCSAgICBTRUdfQURSKChDQVJEMTYgKiksZXMsZGkpLAotCQkJCQkgICAgQ1BVX1JFR19MVyhlZmxhZ3MpJkRGLAotCQkJCQkgICAgKGlzX3JlcD8gTFdFQ1g6MSkpOwotCX0KLQlpZiAoaXNfcmVwKSBMV0VDWCA9IDA7Ci0JQ1BVX1JFR19MVyhlaXApKys7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4NmU6ICAgICAgICAgICAgICAgICAgLyogKHJlcCkgb3V0c2IgKi8KLQlpZiAocHJlZl9zZWcgPCAwKSBwcmVmX3NlZyA9IENQVV9SRUdfTFcoZHMpOwotCS8qIFdBUk5JTkc6IG5vIHRlc3QgZm9yIF9TSSB3cmFwcGluZyEgKi8KLQlDUFVfUkVHX0xXKGVzaSkgKz0gcG9ydF9yZXBfb3V0YihDUFVfUkVHX0xXKGVkeCksKENBUkQ4KilMSU5fUFJFRl9TSSwKLQkJCQkJIENQVV9SRUdfTFcoZWZsYWdzKSZERiwKLQkJCQkJIChpc19yZXA/IExXRUNYOjEpKTsKLQlpZiAoaXNfcmVwKSBMV0VDWCA9IDA7Ci0JQ1BVX1JFR19MVyhlaXApKys7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4NmY6ICAgICAgICAgICAgICAgICAgLyogKHJlcCkgb3V0c3cgLyBvdXRzZCAqLwotCWlmIChwcmVmX3NlZyA8IDApIHByZWZfc2VnID0gQ1BVX1JFR19MVyhkcyk7Ci0JLyogV0FSTklORzogbm8gdGVzdCBmb3IgX1NJIHdyYXBwaW5nISAqLwotCWlmIChwcmVmaXg2NikgewotCSAgICBDUFVfUkVHX0xXKGVzaSkgKz0gcG9ydF9yZXBfb3V0bChDUFVfUkVHX0xXKGVkeCksCi0JCQkJCSAgICAgKENBUkQzMiAqKUxJTl9QUkVGX1NJLAotCQkJCQkgICAgIENQVV9SRUdfTFcoZWZsYWdzKSZERiwKLQkJCQkJICAgICAoaXNfcmVwPyBMV0VDWDoxKSk7Ci0JfQotCWVsc2UgewotCSAgICBDUFVfUkVHX0xXKGVzaSkgKz0gcG9ydF9yZXBfb3V0dyhDUFVfUkVHX0xXKGVkeCksCi0JCQkJCSAgICAgKENBUkQxNiAqKUxJTl9QUkVGX1NJLAotCQkJCQkgICAgIENQVV9SRUdfTFcoZWZsYWdzKSZERiwKLQkJCQkJICAgICAoaXNfcmVwPyBMV0VDWDoxKSk7Ci0JfQotCWlmIChpc19yZXApIExXRUNYID0gMDsKLQlDUFVfUkVHX0xXKGVpcCkrKzsKLQlicmVhazsKLQotICAgIGNhc2UgMHhlNTogICAgICAgICAgICAgICAgICAvKiBpbncgeHgsIGlubCB4eCAqLwotCWlmIChwcmVmaXg2NikgQ1BVX1JFRyhlYXgpID0gUC5pbmwoKGludCkgY3NwWzFdKTsKLQllbHNlIENQVV9SRUdfTFcoZWF4KSA9IFAuaW53KChpbnQpIGNzcFsxXSk7Ci0JQ1BVX1JFR19MVyhlaXApICs9IDI7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweGU0OiAgICAgICAgICAgICAgICAgIC8qIGluYiB4eCAqLwotCUNQVV9SRUdfTFcoZWF4KSAmPSB+KENBUkQzMikweGZmOwotCUNQVV9SRUdfTEIoYXgpIHw9IFAuaW5iKChpbnQpIGNzcFsxXSk7Ci0JQ1BVX1JFR19MVyhlaXApICs9IDI7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweGVkOiAgICAgICAgICAgICAgICAgIC8qIGludyBkeCwgaW5sIGR4ICovCi0JaWYgKHByZWZpeDY2KSBDUFVfUkVHKGVheCkgPSBQLmlubChDUFVfUkVHX0xXKGVkeCkpOwotCWVsc2UgQ1BVX1JFR19MVyhlYXgpID0gUC5pbncoQ1BVX1JFR19MVyhlZHgpKTsKLQlDUFVfUkVHX0xXKGVpcCkgKz0gMTsKLQlicmVhazsKLSAgICBjYXNlIDB4ZWM6ICAgICAgICAgICAgICAgICAgLyogaW5iIGR4ICovCi0JQ1BVX1JFR19MVyhlYXgpICY9IH4oQ0FSRDMyKTB4ZmY7Ci0JQ1BVX1JFR19MQihheCkgfD0gUC5pbmIoQ1BVX1JFR19MVyhlZHgpKTsKLQlDUFVfUkVHX0xXKGVpcCkgKz0gMTsKLQlicmVhazsKLQotICAgIGNhc2UgMHhlNzogICAgICAgICAgICAgICAgICAvKiBvdXR3IHh4ICovCi0JaWYgKHByZWZpeDY2KSBQLm91dGwoKGludCljc3BbMV0sIENQVV9SRUcoZWF4KSk7Ci0JZWxzZSBQLm91dHcoKGludCljc3BbMV0sIENQVV9SRUdfTFcoZWF4KSk7Ci0JQ1BVX1JFR19MVyhlaXApICs9IDI7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweGU2OiAgICAgICAgICAgICAgICAgIC8qIG91dGIgeHggKi8KLQlQLm91dGIoKGludCkgY3NwWzFdLCBDUFVfUkVHX0xCKGF4KSk7Ci0JQ1BVX1JFR19MVyhlaXApICs9IDI7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweGVmOiAgICAgICAgICAgICAgICAgIC8qIG91dHcgZHggKi8KLQlpZiAocHJlZml4NjYpIFAub3V0bChDUFVfUkVHX0xXKGVkeCksIENQVV9SRUcoZWF4KSk7Ci0JZWxzZSBQLm91dHcoQ1BVX1JFR19MVyhlZHgpLCBDUFVfUkVHX0xXKGVheCkpOwotCUNQVV9SRUdfTFcoZWlwKSArPSAxOwotCWJyZWFrOwotICAgIGNhc2UgMHhlZTogICAgICAgICAgICAgICAgICAvKiBvdXRiIGR4ICovCi0JUC5vdXRiKENQVV9SRUdfTFcoZWR4KSwgQ1BVX1JFR19MQihheCkpOwotCUNQVV9SRUdfTFcoZWlwKSArPSAxOwotCWJyZWFrOwotCi0gICAgY2FzZSAweGY0OgotI2lmZGVmIFY4NkJJT1NfREVCVUcKLQlwcmludGYoImhsdCBhdCAlcFxuIiwgbGluYSk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLQotICAgIGNhc2UgMHgwZjoKLQlmcHJpbnRmKHN0ZGVyciwiQ1BVIDB4MGYgVHJhcCBhdCBlaXA9MHglbHhcbiIsQ1BVX1JFRyhlaXApKTsKLQlnb3RvIG9wMGZlcnI7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4ZjA6ICAgICAgICAgICAgICAgICAgLyogbG9jayAqLwotICAgIGRlZmF1bHQ6Ci0JZnByaW50ZihzdGRlcnIsInVua25vd24gcmVhc29uIGZvciBleGNlcHRpb25cbiIpOwotCWR1bXBfcmVnaXN0ZXJzKCk7Ci0Jc3RhY2tfdHJhY2UoKTsKLSAgICBvcDBmZXJyOgotCWR1bXBfY29kZSgpOwotCWZwcmludGYoc3RkZXJyLCJjYW5ub3QgY29udGludWVcbiIpOwotCXJldHVybiAwOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc3dpdGNoKCkgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotdm04Nl9kb19pbnQoaW50IG51bSkKLXsKLSAgICBpbnQgdmFsOwotICAgIHN0cnVjdCByZWdzODYgcmVnczsKLQotICAgIGlfcHJpbnRmKCJpbnQgMHgleCByZWNlaXZlZDogYXg6MHglbHgiLG51bSxDUFVfUkVHKGVheCkpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlpX3ByaW50ZigiIGF0OiAweCV4XG4iLGdldElQKCkpOwotICAgIGVsc2UKLQlpX3ByaW50ZigiXG4iKTsKLQotICAgIC8qIHRyeSB0byBydW4gYmlvcyBpbnRlcnJ1cHQgKi8KLQotICAgIC8qIGlmIG5vdCBpbnN0YWxsZWQgZmFsbCBiYWNrICovCi0jZGVmaW5lIENPUFkoeCkgcmVncy4jI3ggPSBDUFVfUkVHKHgpCi0jZGVmaW5lIENPUFlfUih4KSBDUFVfUkVHKHgpID0gcmVncy4jI3gKLQotICAgIENPUFkoZWF4KTsKLSAgICBDT1BZKGVieCk7Ci0gICAgQ09QWShlY3gpOwotICAgIENPUFkoZWR4KTsKLSAgICBDT1BZKGVzaSk7Ci0gICAgQ09QWShlZGkpOwotICAgIENPUFkoZWJwKTsKLSAgICBDT1BZKGVpcCk7Ci0gICAgQ09QWShlc3ApOwotICAgIENPUFkoY3MpOwotICAgIENPUFkoc3MpOwotICAgIENPUFkoZHMpOwotICAgIENPUFkoZXMpOwotICAgIENPUFkoZnMpOwotICAgIENPUFkoZ3MpOwotICAgIENPUFkoZWZsYWdzKTsKLQotICAgIGlmICghKHZhbCA9IGludF9oYW5kbGVyKG51bSwmcmVncykpKQotCWlmICghKHZhbCA9IHJ1bl9iaW9zX2ludChudW0sJnJlZ3MpKSkKLQkgICAgcmV0dXJuIHZhbDsKLQotICAgIENPUFlfUihlYXgpOwotICAgIENPUFlfUihlYngpOwotICAgIENPUFlfUihlY3gpOwotICAgIENPUFlfUihlZHgpOwotICAgIENPUFlfUihlc2kpOwotICAgIENPUFlfUihlZGkpOwotICAgIENPUFlfUihlYnApOwotICAgIENPUFlfUihlaXApOwotICAgIENPUFlfUihlc3ApOwotICAgIENPUFlfUihjcyk7Ci0gICAgQ09QWV9SKHNzKTsKLSAgICBDT1BZX1IoZHMpOwotICAgIENPUFlfUihlcyk7Ci0gICAgQ09QWV9SKGZzKTsKLSAgICBDT1BZX1IoZ3MpOwotICAgIENPUFlfUihlZmxhZ3MpOwotCi0gICAgcmV0dXJuIHZhbDsKLSN1bmRlZiBDT1BZCi0jdW5kZWYgQ09QWV9SCi19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZGUodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyICpsaW5hID0gU0VHX0FEUigodW5zaWduZWQgY2hhciAqKSwgY3MsIGlwKTsKLQotICAgIGZwcmludGYoc3RkZXJyLCJjb2RlIGF0IDB4JTguOHg6ICIsKENBUkQzMilsaW5hKTsKLSAgICBmb3IgKGk9MDsgaTwweDEwOyBpKyspCi0JZnByaW50ZihzdGRlcnIsIiUyLjJ4ICIsKihsaW5hICsgaSkpOwotICAgIGZwcmludGYoc3RkZXJyLCJcbiAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgZm9yICg7IGk8MHgyMDsgaSsrKQotCWZwcmludGYoc3RkZXJyLCIlMi4yeCAiLCoobGluYSArIGkpKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLX0KLQotI2RlZmluZSBQUklOVCh4KSBmcHJpbnRmKHN0ZGVyciwjeCI6JTQuNHggIixDUFVfUkVHX0xXKHgpKQotI2RlZmluZSBQUklOVF9GTEFHUyh4KSBmcHJpbnRmKHN0ZGVyciwjeCI6JTguOHggIixDUFVfUkVHX0xXKHgpKQotc3RhdGljIHZvaWQKLWR1bXBfcmVnaXN0ZXJzKHZvaWQpCi17Ci0gICAgUFJJTlQoZWlwKTsKLSAgICBQUklOVChlYXgpOwotICAgIFBSSU5UKGVieCk7Ci0gICAgUFJJTlQoZWN4KTsKLSAgICBQUklOVChlZHgpOwotICAgIFBSSU5UKGVzaSk7Ci0gICAgUFJJTlQoZWRpKTsKLSAgICBQUklOVChlYnApOwotICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwotICAgIFBSSU5UKGVzcCk7Ci0gICAgUFJJTlQoY3MpOwotICAgIFBSSU5UKHNzKTsKLSAgICBQUklOVChlcyk7Ci0gICAgUFJJTlQoZHMpOwotICAgIFBSSU5UKGZzKTsKLSAgICBQUklOVChncyk7Ci0gICAgUFJJTlRfRkxBR1MoZWZsYWdzKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXN0YWNrX3RyYWNlKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciAqc3RhY2sgPSBTRUdfQURSKCh1bnNpZ25lZCBjaGFyICopLCBzcywgc3ApOwotCi0gICAgZnByaW50ZihzdGRlcnIsInN0YWNrIGF0IDB4JTguOGx4OlxuIiwodW5zaWduZWQgbG9uZylzdGFjayk7Ci0gICAgZm9yIChpPTA7IGkgPCAweDEwOyBpKyspCi0JZnByaW50ZihzdGRlcnIsIiUyLjJ4ICIsKihzdGFjayArIGkpKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLQotfQotCi1zdGF0aWMgaW50Ci12bTg2X3JlcChzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgKnB0cikKLXsKLQotICAgIGludCBfX3JlczsKLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbnQgJDB4ODBcbiIKLQkJCSA6Ij1hIiAoX19yZXMpOiJhIiAoKGludCkxMTMpLAotCQkJICJiIiAoKHN0cnVjdCB2bTg2X3N0cnVjdCAqKXB0cikpOwotCi0JICAgIGlmICgoX19yZXMpIDwgMCkgewotCQllcnJubyA9IC1fX3JlczsKLQkJX19yZXM9LTE7Ci0JICAgIH0KLQkgICAgZWxzZSBlcnJubyA9IDA7Ci0JICAgIHJldHVybiBfX3JlczsKLX0KLQotI2RlZmluZSBwdXNodyhiYXNlLCBwdHIsIHZhbCkgXAotX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKLQkiZGVjdyAldzBcblx0IiBcCi0JIm1vdmIgJWgyLCglMSwlMClcblx0IiBcCi0JImRlY3cgJXcwXG5cdCIgXAotCSJtb3ZiICViMiwoJTEsJTApIiBcCi0JOiAiPXIiIChwdHIpIFwKLQk6ICJyIiAoYmFzZSksICJxIiAodmFsKSwgIjAiIChwdHIpKQotCi1pbnQKLXJ1bl9iaW9zX2ludChpbnQgbnVtLCBzdHJ1Y3QgcmVnczg2ICpyZWdzKQotewotICAgIENBUkQxNiAqc3NwOwotICAgIENBUkQzMiBzcDsKLSAgICBDQVJEMzIgZWZsYWdzOwotCi0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHN0YXRpYyBpbnQgZmlyc3R0aW1lID0gMTsKLSNlbmRpZgotICAgIC8qIGNoZWNrIGlmIGJpb3MgdmVjdG9yIGlzIGluaXRpYWxpemVkICovCi0gICAgaWYgKCgoQ0FSRDE2KikwKVsobnVtPDwxKSsxXSA9PSAweDAwMDApIHsgLyogU1lTX0JJT1NfU0VHID8qLwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLQlpX3ByaW50ZigiY2FyZCBCSU9TIG5vdCBsb2FkZWRcbiIpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIGlmIChmaXJzdHRpbWUpIHsKLQlkcHJpbnQoMCwweDNEMCk7Ci0JZmlyc3R0aW1lID0gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlfcHJpbnRmKCJjYWxsaW5nIGNhcmQgQklPUyBhdDogIik7Ci0gICAgc3NwID0gKENBUkQxNiopKENQVV9SRUcoc3MpPDw0KTsKLSAgICBzcCA9IChDQVJEMzIpIENQVV9SRUdfTFcoZXNwKTsKLQotICAgIGVmbGFncyA9IHJlZ3MtPmVmbGFnczsKLSAgICBlZmxhZ3MgPSAoKGVmbGFncyAmIFZJRl9NQVNLKSAhPSAwKQotCT8gKGVmbGFncyB8IElGX01BU0spIDogKGVmbGFncyAmIH4oQ0FSRDMyKSBJRl9NQVNLKTsKLSAgICBwdXNodyhzc3AsIHNwLCBlZmxhZ3MpOwotICAgIHB1c2h3KHNzcCwgc3AsIHJlZ3MtPmNzKTsKLSAgICBwdXNodyhzc3AsIHNwLCAoQ0FSRDE2KXJlZ3MtPmVpcCk7Ci0gICAgcmVncy0+ZXNwIC09IDY7Ci0gICAgcmVncy0+Y3MgPSAoKENBUkQxNiAqKSAwKVsobnVtIDw8IDEpICsgMV07Ci0gICAgcmVncy0+ZWlwID0gKHJlZ3MtPmVpcCAmIDB4RkZGRjAwMDApIHwgKChDQVJEMTYgKikgMClbbnVtIDw8IDFdOwotICAgIGlfcHJpbnRmKCIweCV4OiVseFxuIixyZWdzLT5jcyxyZWdzLT5laXApOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBkdW1wX2NvZGUoKTsKLSNlbmRpZgotICAgIHJlZ3MtPmVmbGFncyA9IHJlZ3MtPmVmbGFncwotCQkgICAgICAgJiB+KFZJRl9NQVNLIHwgVEZfTUFTSyB8IElGX01BU0sgfCBOVF9NQVNLKTsKLSAgICByZXR1cm4gMTsKLX0KLQotQ0FSRDMyCi1nZXRJbnRWZWN0KGludCBudW0pCi17Ci0gICAgcmV0dXJuICgoQ0FSRDMyKikwKVtudW1dOwotfQotCi1DQVJEMzIKLWdldElQKHZvaWQpCi17Ci0gICAgcmV0dXJuIChDUFVfUkVHKGNzKSA8PCA0KSArIENQVV9SRUcoZWlwKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODZiaW9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMWMxZjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODZiaW9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNkZWZpbmUgREVMRVRFCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgotI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCi0jaW5jbHVkZSA8c3lzL2lvLmg+Ci0jZWxpZiBkZWZpbmVkKEhBVkVfU1lTX1BFUk0pCi0jaW5jbHVkZSA8c3lzL3Blcm0uaD4KLSNlbmRpZgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgotCi0jZGVmaW5lIFNJWkUgMHgxMDAwMDAKLSNkZWZpbmUgVlJBTV9TVEFSVCAweEEwMDAwCi0jZGVmaW5lIFZSQU1fU0laRSAweDFGRkZGCi0jZGVmaW5lIFZfQklPU19TSVpFIDB4MUZGRkYKLSNkZWZpbmUgQklPU19TVEFSVCAweDdDMDAgICAgICAgICAgICAvKiBkZWZhdWx0IEJJT1MgZW50cnkgKi8KLSNkZWZpbmUgQklPU19NRU0gMHg2MDAKLQotLypDQVJEOCBjb2RlW10gPSB7IDB4YjggLCAweGYwICwgMHhmMCwgMHhmNCB9OyAqLwotI2RlZmluZSBWQl9YKHgpIChWX0JJT1MgPj4geCkgJiAweEZGCi1DQVJEOCBjb2RlW10gPSB7IDYsIDB4OWEsIDB4MDMsIDB4MDAsIDB4MDAsIFZCX1goMTIpLCAweGY0IH07Ci0vKkNBUkQ4IGNvZGVbXSA9IHsgMHg5YSwgMHgwMywgMHgwMCwgMHgwMCwgVkJfWCgxMiksIDB4YjgsIDB4MDMsIDB4MDAsICovCi0vKjB4Y2QsIDB4MTAsIDB4ZjQgfTsgKi8KLS8qQ0FSRDggY29kZVtdID0geyAgMHhiOCAsIDB4ZjAgLCAweGYwICwweGY0IH07ICovCi0KLWludCBpb3Blcm1fbGlzdFtJT1BFUk1fQklUU10gPSB7MCx9OwotCi1zdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQpOwotc3RhdGljIGludCBtYXAodm9pZCk7Ci1zdGF0aWMgdm9pZCB1bm1hcCh2b2lkKTsKLXN0YXRpYyB2b2lkIGJvb3RCSU9TKENBUkQxNiBheCk7Ci1zdGF0aWMgaW50IG1hcF92cmFtKHZvaWQpOwotc3RhdGljIHZvaWQgdW5tYXBfdnJhbSh2b2lkKTsKLXN0YXRpYyBpbnQgY29weV92YmlvcyhtZW1UeXBlIHZfYmFzZSk7Ci1zdGF0aWMgaW50IGNvcHlfc3lzX2Jpb3Modm9pZCk7Ci1zdGF0aWMgdm9pZCBzYXZlX2Jpb3NfdG9fZmlsZSh2b2lkKTsKLXN0YXRpYyBpbnQgc2V0dXBfc3lzdGVtX2Jpb3Modm9pZCk7Ci1zdGF0aWMgQ0FSRDMyIHNldHVwX2ludF92ZWN0KHZvaWQpOwotI2lmZGVmIF9faWEzMl9fCi1zdGF0aWMgQ0FSRDMyIHNldHVwX3ByaW1hcnlfaW50X3ZlY3Qodm9pZCk7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgY2hrc3VtKENBUkQ4ICpzdGFydCk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncywgQ0FSRDMyIGF4KTsKLXN0YXRpYyB2b2lkIHByaW50X3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncyk7Ci1zdGF0aWMgdm9pZCBwcmludF91c2FnZSh2b2lkKTsKLXN0YXRpYyB2b2lkIHNldF9obHQoQm9vbCBzZXQpOwotc3RhdGljIHZvaWQgc2V0X2lvcGVybSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgeXlwYXJzZSgpOwotCi12b2lkIGxvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCAqY29kZSk7Ci12b2lkIGRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotCi1zdGF0aWMgaW50IHZyYW1fbWFwcGVkID0gMDsKLXN0YXRpYyBjaGFyKiBiaW9zX3ZhciA9IE5VTEw7Ci1zdGF0aWMgQ0FSRDggc2F2ZV9tc3I7Ci1zdGF0aWMgQ0FSRDggc2F2ZV9wb3MxMDI7Ci1zdGF0aWMgQ0FSRDggc2F2ZV92c2U7Ci1zdGF0aWMgQ0FSRDggc2F2ZV80NmU4Owotc3RhdGljIGhhbHRwb2ludHMgaGx0cFsyMF0gPSB7IHswLCAwfSwgfTsKLQotY29uc29sZSBDb25zb2xlID0gey0xLC0xfTsKLXN0cnVjdCBjb25maWcgQ29uZmlnOwotCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKLXsKLSAgICBpbnQgYzsKLQotICAgIENvbmZpZy5QcmludFBvcnQgPSBQUklOVF9QT1JUOwotICAgIENvbmZpZy5Jb1N0YXRpc3RpY3MgPSBJT19TVEFUSVNUSUNTOwotICAgIENvbmZpZy5QcmludElycSA9IFBSSU5UX0lSUTsKLSAgICBDb25maWcuUHJpbnRQY2kgPSBQUklOVF9QQ0k7Ci0gICAgQ29uZmlnLlNob3dBbGxEZXYgPSBTSE9XX0FMTF9ERVY7Ci0gICAgQ29uZmlnLlByaW50SXAgPSBQUklOVF9JUDsKLSAgICBDb25maWcuU2F2ZUJpb3MgPSBTQVZFX0JJT1M7Ci0gICAgQ29uZmlnLlRyYWNlID0gVFJBQ0U7Ci0gICAgQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkgPSBDT05GSUdfQUNUSVZFX09OTFk7ICAvKiBib290ICovCi0gICAgQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSA9IENPTkZJR19BQ1RJVkVfREVWSUNFOyAvKiBib290ICovCi0gICAgQ29uZmlnLk1hcFN5c0Jpb3MgPSBNQVBfU1lTX0JJT1M7Ci0gICAgQ29uZmlnLlJlc29ydCA9IFJFU09SVDsgIC8qIGJvb3QgKi8KLSAgICBDb25maWcuRml4Um9tID0gRklYX1JPTTsKLSAgICBDb25maWcuTm9Db25zb2xlID0gTk9fQ09OU09MRTsKLSAgICBDb25maWcuQm9vdE9ubHkgPSBGQUxTRTsKLSAgICBDb25maWcuVmVyYm9zZSA9IFZFUkJPU0U7Ci0KLSAgICBvcHRlcnIgPSAwOwotICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLGFyZ3YsInBzaWNhUFN0QWRicmZudjo/IikpICE9IEVPRikgewotICAgIHN3aXRjaChjKSB7Ci0gICAgY2FzZSAncCc6Ci0JQ29uZmlnLlByaW50UG9ydCA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0JQ29uZmlnLklvU3RhdGlzdGljcyA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0JQ29uZmlnLlByaW50SXJxID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdjJzoKLQlDb25maWcuUHJpbnRQY2kgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ2EnOgotCUNvbmZpZy5TaG93QWxsRGV2ID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdQJzoKLQlDb25maWcuUHJpbnRJcCA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnUyc6Ci0JQ29uZmlnLlNhdmVCaW9zID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICd0JzoKLQlDb25maWcuVHJhY2UgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ0EnOgotCUNvbmZpZy5Db25maWdBY3RpdmVPbmx5ID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdkJzoKLQlDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdiJzoKLQlDb25maWcuTWFwU3lzQmlvcyA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAncic6Ci0JQ29uZmlnLlJlc29ydCA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnZic6Ci0JQ29uZmlnLkZpeFJvbSA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnbic6Ci0JQ29uZmlnLk5vQ29uc29sZSA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAndic6Ci0JQ29uZmlnLlZlcmJvc2UgPSBzdHJ0b2wob3B0YXJnLE5VTEwsMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnPyc6Ci0JcHJpbnRfdXNhZ2UoKTsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgIH0KLSAgICB9Ci0KLQotICAgIGlmICghbWFwKCkpCi0gICAgZXhpdCgxKTsKLQotICAgIGlmICghc2V0dXBfc3lzdGVtX2Jpb3MoKSkKLSAgICBleGl0KDEpOwotCi0gICAgaW9wbCgzKTsKLQotICAgIHNjYW5fcGNpKCk7Ci0KLSAgICBzYXZlX21zciA9IGluYigweDNDQyk7Ci0gICAgc2F2ZV92c2UgPSBpbmIoMHgzQzMpOwotICAgIHNhdmVfNDZlOCA9IGluYigweDQ2ZTgpOwotICAgIHNhdmVfcG9zMTAyID0gaW5iKDB4MTAyKTsKLQotICAgIGlmIChDb25maWcuQm9vdE9ubHkpIHsKLQotICAgIGlmICghQ3VycmVudFBjaSAmJiAhQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZQotCSYmICFDb25maWcuQ29uZmlnQWN0aXZlT25seSkgewotCWlvcGwoMCk7Ci0JdW5tYXAoKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgY2FsbF9ib290KE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgdXNpbmdfaGlzdG9yeSgpOwotICAgIHl5cGFyc2UoKTsKLSAgICB9Ci0KLSAgICB1bm1hcCgpOwotCi0gICAgcGNpVmlkZW9SZXN0b3JlKCk7Ci0KLSAgICBvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7Ci0gICAgb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7Ci0gICAgb3V0YigweDNDMywgc2F2ZV92c2UpOwotICAgIG91dGIoMHgzQzIsIHNhdmVfbXNyKTsKLQotICAgIGlvcGwoMCk7Ci0KLSAgICBjbG9zZV9jb25zb2xlKENvbnNvbGUpOwotCi0gICAgZXhpdCgwKTsKLX0KLQotCi12b2lkCi1jYWxsX2Jvb3Qoc3RydWN0IGRldmljZSAqZGV2KQotewotICAgIGludCBBY3RpdmVfaXNfUGNpID0gMDsKLSAgICBDQVJEMzIgdmJpb3NfYmFzZTsKLQotICAgIEN1cnJlbnRQY2kgPSBQY2lMaXN0OwotICAgIENvbnNvbGUgPSBvcGVuX2NvbnNvbGUoKTsKLQotICAgIHNldF9pb3Blcm0oKTsKLQotCi0gICAgc2lnbmFsKDIsc2lnX2hhbmRsZXIpOwotICAgIHNpZ25hbCgxMSxzaWdfaGFuZGxlcik7Ci0KLSAgICAvKiBkaXNhYmxlIHByaW1hcnkgY2FyZCAqLwotICAgIHBjaVZpZGVvUmVzdG9yZSgpOyAvKiByZXNldCBQQ0kgc3RhdGUgdG8gc2VlIHByaW1hcnkgY2FyZCAqLwotICAgIG91dGIoMHgzQzIsfihDQVJEOCkweDAzICYgc2F2ZV9tc3IpOwotICAgIG91dGIoMHgzQzMsfihDQVJEOCkweDAxICYgc2F2ZV92c2UpOwotICAgIG91dGIoMHg0NmU4LCB+KENBUkQ4KTB4MDggJiBzYXZlXzQ2ZTgpOwotICAgIG91dGIoMHgxMDIsIH4oQ0FSRDgpMHgwMSAmIHNhdmVfcG9zMTAyKTsKLQotICAgIHBjaVZpZGVvRGlzYWJsZSgpOwotCi0gICAgd2hpbGUgKEN1cnJlbnRQY2kpIHsKLSAgICBDQVJEMTYgYXg7Ci0KLSAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKSB7Ci0JQWN0aXZlX2lzX1BjaSA9IDE7Ci0JaWYgKCFDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlICYmICFkZXYpIHsKLQlDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQljb250aW51ZTsKLQl9Ci0gICAgfSBlbHNlIGlmIChDb25maWcuQ29uZmlnQWN0aXZlT25seSAmJiAhZGV2KSB7Ci0JQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JY29udGludWU7Ci0gICAgfQotICAgIGlmIChkZXYgJiYgKChkZXYtPnR5cGUgIT0gUENJKQotCSAgICB8fCAoZGV2LT50eXBlID09IFBDSQotCSAgICAmJiAoZGV2LT5sb2MucGNpLmRldiAhPSBDdXJyZW50UGNpLT5kZXYKLQkJfHwgZGV2LT5sb2MucGNpLmJ1cyAhPSBDdXJyZW50UGNpLT5idXMKLQkJfHwgZGV2LT5sb2MucGNpLmZ1bmMgIT0gQ3VycmVudFBjaS0+ZnVuYykpKSkgewotCUN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCWNvbnRpbnVlOwotICAgIH0KLQotICAgIEVuYWJsZUN1cnJlbnQoKTsKLQotICAgIGlmIChDdXJyZW50UGNpLT5hY3RpdmUpIHsKLQlvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7Ci0Jb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7Ci0Jb3V0YigweDNDMywgc2F2ZV92c2UpOwotCW91dGIoMHgzQzIsIHNhdmVfbXNyKTsKLSAgICB9Ci0KLSAgICAvKiBjbGVhciBpbnRlcnJ1cHQgdmVjdG9ycyAqLwotI2lmZGVmIF9faWEzMl9fCi0gICAgdmJpb3NfYmFzZSA9IEN1cnJlbnRQY2ktPmFjdGl2ZSA/IHNldHVwX3ByaW1hcnlfaW50X3ZlY3QoKQotCTogc2V0dXBfaW50X3ZlY3QoKTsKLSNlbHNlCi0gICAgdmJpb3NfYmFzZSA9IHNldHVwX2ludF92ZWN0KCk7Ci0jZW5kaWYKLSAgICBheCA9ICgoQ0FSRDE2KShDdXJyZW50UGNpLT5idXMpIDw8IDgpCi0JfCAoQ3VycmVudFBjaS0+ZGV2IDw8IDMpIHwgKEN1cnJlbnRQY2ktPmZ1bmMgJiAweDcpOwotICAgIGlmIChDb25maWcuVmVyYm9zZSA+IDEpIFBfcHJpbnRmKCJheDogMHgleFxuIixheCk7Ci0KLSAgICBCb290QmlvcyA9IGZpbmRQY2lCeUlEcyhDdXJyZW50UGNpLT5idXMsQ3VycmVudFBjaS0+ZGV2LAotCQkgICBDdXJyZW50UGNpLT5mdW5jKTsKLSAgICBpZiAoISgobWFwUGNpUm9tKEJvb3RCaW9zKSAmJiBjaGtzdW0oKENBUkQ4KilWX0JJT1MpKQotCSAgfHwgKEN1cnJlbnRQY2ktPmFjdGl2ZSAmJiBjb3B5X3ZiaW9zKHZiaW9zX2Jhc2UpKSkpIHsKLQlDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQljb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKCFtYXBfdnJhbSgpKSB7Ci0JQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JY29udGludWU7Ci0gICAgfQotICAgIGlmIChDb25maWcuU2F2ZUJpb3MpIHNhdmVfYmlvc190b19maWxlKCk7Ci0gICAgcHJpbnRmKCJpbml0aWFsaXppbmcgUENJIGJ1czogJWkgZGV2OiAlaSBmdW5jOiAlaVxuIixDdXJyZW50UGNpLT5idXMsCi0JICAgQ3VycmVudFBjaS0+ZGV2LEN1cnJlbnRQY2ktPmZ1bmMpOwotICAgIGJvb3RCSU9TKGF4KTsKLSAgICB1bm1hcF92cmFtKCk7Ci0KLSAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKQotCWNsb3NlX2NvbnNvbGUoQ29uc29sZSk7Ci0KLSAgICBpZiAoZGV2KSByZXR1cm47Ci0KLSAgICBDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLSAgICB9Ci0KLSAgICAvKiBXZSBoYXZlIGFuIElTQSBkZXZpY2UgLSBjb25maWd1cmUgaWYgcmVxdWVzdGVkICovCi0gICAgaWYgKCFBY3RpdmVfaXNfUGNpIC8qIG5vIGlzYSBjYXJkIGluIHN5c3RlbSEgKi8KLSAgICAmJiAoKCFkZXYgJiYgKENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgfHwgQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkpKQotCXx8IChkZXYgJiYgZGV2LT50eXBlID09IElTQSkpKSB7Ci0KLSAgICBwY2lWaWRlb0Rpc2FibGUoKTsKLQotICAgIGlmICghZGV2IHx8IGRldi0+dHlwZSA9PSBJU0EpIHsKLQlvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7Ci0Jb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7Ci0Jb3V0YigweDNDMywgc2F2ZV92c2UpOwotCW91dGIoMHgzQzIsIHNhdmVfbXNyKTsKLQotI2lmZGVmIF9faWEzMl9fCi0JdmJpb3NfYmFzZSA9IHNldHVwX3ByaW1hcnlfaW50X3ZlY3QoKTsKLSNlbHNlCi0JdmJpb3NfYmFzZSA9IHNldHVwX2ludF92ZWN0KCk7Ci0jZW5kaWYKLQlpZiAoY29weV92Ymlvcyh2Ymlvc19iYXNlKSkgewotCi0JaWYgKENvbmZpZy5TYXZlQmlvcykgc2F2ZV9iaW9zX3RvX2ZpbGUoKTsKLQlpZiAgKG1hcF92cmFtKCkpIHsKLQkgICAgcHJpbnRmKCJpbml0aWFsaXppbmcgSVNBIGJ1c1xuIik7Ci0JICAgIGJvb3RCSU9TKDApOwotCX0KLQl9Ci0KLQl1bm1hcF92cmFtKCk7Ci0Jc2xlZXAoMSk7Ci0JY2xvc2VfY29uc29sZShDb25zb2xlKTsKLSAgICB9Ci0gICAgfQotCi0KLX0KLQotaW50Ci1tYXAodm9pZCkKLXsKLSAgICB2b2lkKiBtZW07Ci0gICAgbWVtID0gbW1hcCgwLCAoc2l6ZV90KVNJWkUsCi0JICAgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0FOT04sCi0JICAgICAgIC0xLCAwICk7Ci0gICAgaWYgKG1lbSAhPSAwKSB7Ci0JcGVycm9yKCJhbm9ueW1vdXMgbWFwIik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgbWVtc2V0KG1lbSwwLFNJWkUpOwotCi0gICAgcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXVubWFwKHZvaWQpCi17Ci0gICAgbXVubWFwKDAsU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ib290QklPUyhDQVJEMTYgYXgpCi17Ci0gICAgaTg2Ymlvc1JlZ3MgYlJlZ3M7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHByaW50Zigic3RhcnRpbmcgQklPU1xuIik7Ci0jZW5kaWYKLSAgICBzZXR1cF9pbygpOwotICAgIHNldHVwX2Jpb3NfcmVncygmYlJlZ3MsIGF4KTsKLSAgICBsb2FkQ29kZVRvTWVtKCh1bnNpZ25lZCBjaGFyICopIEJJT1NfU1RBUlQsIGNvZGUpOwotICAgIGRvX3g4NihCSU9TX1NUQVJULCZiUmVncyk7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHByaW50ZigiZG9uZVxuIik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludAotbWFwX3ZyYW0odm9pZCkKLXsKLSAgICBpbnQgbWVtX2ZkOwotCi0jaWZkZWYgX19pYTY0X18KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSIHwgT19TWU5DKSk8MCkKLSNlbHNlCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApCi0jZW5kaWYKLQl7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIF9fYWxwaGFfXwotICAgICAgIGlmICghX2J1c19iYXNlKCkpIHNwYXJzZV9zaGlmdCA9IDc7IC8qIFVoLCBvaCwgSkVOU0VOLi4uICovCi0JIGlmICghX2J1c19iYXNlX3NwYXJzZSgpKSBzcGFyc2Vfc2hpZnQgPSAwOwotCSBpZiAoKHZyYW1fbWFwID0gbW1hcCgwLChzaXplX3QpIChWUkFNX1NJWkUgPDwgc3BhcnNlX3NoaWZ0KSwKLQkJCQkJCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCQkJIE1BUF9TSEFSRUQsCi0JCQkJCQkgbWVtX2ZkLCAoVlJBTV9TVEFSVCA8PCBzcGFyc2Vfc2hpZnQpCi0JCQkJCQkgfCBfYnVzX2Jhc2Vfc3BhcnNlKCkpKSA9PSAodm9pZCAqKSAtMSkKLSNlbHNlCi0gICAgICBpZiAobW1hcCgodm9pZCAqKSBWUkFNX1NUQVJULCAoc2l6ZV90KSBWUkFNX1NJWkUsCi0JCQkgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwKLQkJCSBtZW1fZmQsIFZSQU1fU1RBUlQpID09ICh2b2lkICopIC0xKQotI2VuZGlmCi0gICAgICB7Ci0JcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0gKDEpIik7Ci0JICAgIGNsb3NlKG1lbV9mZCk7Ci0JICAgIHJldHVybiAoMCk7Ci0JfQotICAgIHZyYW1fbWFwcGVkID0gMTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11bm1hcF92cmFtKHZvaWQpCi17Ci0gICAgaWYgKCF2cmFtX21hcHBlZCkgcmV0dXJuOwotCi0gICAgbXVubWFwKCh2b2lkKilWUkFNX1NUQVJULFZSQU1fU0laRSk7Ci0gICAgdnJhbV9tYXBwZWQgPSAwOwotfQotCi1zdGF0aWMgaW50Ci1jb3B5X3ZiaW9zKG1lbVR5cGUgdl9iYXNlKQotewotICAgIGludCBtZW1fZmQ7Ci0gICAgdW5zaWduZWQgY2hhciAqdG1wOwotICAgIGludCBzaXplOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSB2X2Jhc2UsIFNFRUtfU0VUKSAhPSAob2ZmX3QpIHZfYmFzZSkgewotCSAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCBsc2Vla1xuIik7Ci0JICBnb3RvIEVycm9yOwotICAgICAgfQotICAgIHRtcCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKDMpOwotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKil0bXAsIChzaXplX3QpIDMpICE9IChzaXplX3QpIDMpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgdl9iYXNlLFNFRUtfU0VUKSAhPSAob2ZmX3QpIHZfYmFzZSkKLQlnb3RvIEVycm9yOwotCi0gICAgaWYgKCp0bXAgIT0gMHg1NSB8fCAqKHRtcCsxKSAhPSAweEFBICkgewotCWZwcmludGYoc3RkZXJyLCJObyBiaW9zIGZvdW5kIGF0OiAweCVseFxuIix2X2Jhc2UpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotI2lmZGVmIERFQlVHCi0JZHByaW50KCh1bnNpZ25lZCBsb25nKXRtcCwweDEwMCk7Ci0jZW5kaWYKLSAgICBzaXplID0gKih0bXArMikgKiA1MTI7Ci0KLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopdl9iYXNlLCAoc2l6ZV90KSBzaXplKSAhPSAoc2l6ZV90KSBzaXplKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgcmVhZFxuIik7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0gICAgZnJlZSh0bXApOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgaWYgKCFjaGtzdW0oKENBUkQ4Kil2X2Jhc2UpKQotCXJldHVybiAoMCk7Ci0KLSAgICByZXR1cm4gKDEpOwotCi1FcnJvcjoKLSAgICBwZXJyb3IoInZfYmlvcyIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotY29weV9zeXNfYmlvcyh2b2lkKQotewotI2RlZmluZSBTWVNfQklPUyAweEYwMDAwCi0gICAgaW50IG1lbV9mZDsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgU1lTX0JJT1MsU0VFS19TRVQpICE9IChvZmZfdCkgU1lTX0JJT1MpCi0JZ290byBFcnJvcjsKLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopU1lTX0JJT1MsIChzaXplX3QpIDB4RkZGRikgIT0gKHNpemVfdCkgMHhGRkZGKQotCWdvdG8gRXJyb3I7Ci0KLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMSk7Ci0KLUVycm9yOgotICAgIHBlcnJvcigic3lzX2Jpb3MiKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLWxvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCBjb2RlW10pCi17Ci0gICAgaW50IGk7Ci0gICAgQ0FSRDggdmFsOwotICAgIGludCBzaXplID0gY29kZVswXTsKLQotICAgIGZvciAoIGk9MTtpPD1zaXplO2krKykgewotCXZhbCA9IGNvZGVbaV07Ci0JKnB0cisrID0gdmFsOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQKLWRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gICAgaW50IGksajsKLSAgICBjaGFyICpjID0gKGNoYXIgKilzdGFydDsKLQotICAgIGZvciAoaiA9IDA7IGogPCAoc2l6ZSA+PiA0KTsgaisrKSB7Ci0gICAgY2hhciAqZCA9IGM7Ci0gICAgcHJpbnRmKCJcbjB4JWx4OiAgIiwodW5zaWduZWQgbG9uZyljKTsKLSAgICBmb3IgKGkgPSAwOyBpPDE2OyBpKyspCi0JcHJpbnRmKCIlMi4yeCAiLCh1bnNpZ25lZCBjaGFyKSAoKihjKyspKSk7Ci0gICAgYyA9IGQ7Ci0gICAgZm9yIChpID0gMDsgaTwxNjsgaSsrKSB7Ci0JcHJpbnRmKCIlYyIsKCgoKENBUkQ4KSgqYykpID4gMzIpICYmICgoKENBUkQ4KSgqYykpIDwgMTI4KSkgPwotCSAgICh1bnNpZ25lZCBjaGFyKSAoKihjKSk6ICcuJyk7Ci0JYysrOwotICAgIH0KLSAgICB9Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotc2F2ZV9iaW9zX3RvX2ZpbGUodm9pZCkKLXsKLSAgICBzdGF0aWMgaW50IG51bSA9IDA7Ci0gICAgaW50IHNpemUsIGNvdW50OwotICAgIGNoYXIgZmlsZV9uYW1lWzI1Nl07Ci0gICAgaW50IGZkOwotCi0gICAgc3ByaW50ZihmaWxlX25hbWUsImJpb3NfJWkuZmlsIixudW0pOwotICAgIGlmICgoZmQgPSAgb3BlbihmaWxlX25hbWUsT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywwMDY0NCkpID09IC0xKQotCXJldHVybjsKLSAgICBzaXplID0gKCoodW5zaWduZWQgY2hhciopKFZfQklPUyArIDIpKSAqIDUxMjsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgZHByaW50KFZfQklPUywyMCk7Ci0jZW5kaWYKLSAgICBpZiAoKGNvdW50ID0gd3JpdGUoZmQsKHZvaWQgKikoVl9CSU9TKSxzaXplKSkgIT0gc2l6ZSkKLQlmcHJpbnRmKHN0ZGVyciwib25seSBzYXZlZCAlaSBvZiAlaSBieXRlc1xuIixzaXplLGNvdW50KTsKLSAgICBudW0rKzsKLX0KLQotc3RhdGljIHZvaWQKLXNpZ19oYW5kbGVyKGludCB1bnVzZWQpCi17Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICAvKiBwdXQgc3lzdGVtIGJhY2sgaW4gYSBzYXZlIHN0YXRlICovCi0gICAgdW5tYXBfdnJhbSgpOwotICAgIHBjaVZpZGVvUmVzdG9yZSgpOwotICAgIG91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKLSAgICBvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKLSAgICBvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7Ci0gICAgb3V0YigweDNDMiwgc2F2ZV9tc3IpOwotCi0gICAgY2xvc2VfY29uc29sZShDb25zb2xlKTsKLSAgICBpb3BsKDApOwotICAgIHVubWFwKCk7Ci0KLSAgICBleGl0KDEpOwotfQotCi0vKgotICogRm9yIGluaXRpYWxpemF0aW9uIHdlIGp1c3QgcGFzcyBheCB0byB0aGUgQklPUy4KLSAqIFBDSSBCSU9TZXMgbmVlZCB0aGlzLiBBbGwgb3RoZXIgcmVnaXN0ZXIgYXJlIHNldCAwLgotICovCi1zdGF0aWMgdm9pZCBzZXR1cF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncywgQ0FSRDMyIGF4KQotewotICAgIHJlZ3MtPmF4ID0gYXg7Ci0gICAgcmVncy0+YnggPSAwOwotICAgIHJlZ3MtPmN4ID0gMDsKLSAgICByZWdzLT5keCA9IDA7Ci0gICAgcmVncy0+ZXMgPSAwOwotICAgIHJlZ3MtPmRzID0gMHg0MDsgICAgICAgICAgICAgICAvKiBzdGFuZGFyZCBwYyBkcyAqLwotICAgIHJlZ3MtPnNpID0gMDsKLSAgICByZWdzLT5kaSA9IDA7Ci19Ci0KLS8qCi0gKiBoZXJlIHdlIGFyZSByZWFsbHkgcGFyYW5vaWQgYWJvdXQgZmFraW5nIGEgInJlYWwiCi0gKiBCSU9TLiBNb3N0IG9mIHRoaXMgaW5mb3JtYXRpb24gd2FzIHB1bGxlZCBmcm9tCi0gKiBkb3NlbS4KLSAqLwotCi0jaWZkZWYgX19pYTMyX18KLXN0YXRpYyBDQVJEMzIKLXNldHVwX3ByaW1hcnlfaW50X3ZlY3Qodm9pZCkKLXsKLSAgICBpbnQgbWVtX2ZkOwotICAgIENBUkQzMiB2YmFzZTsKLSAgICB2b2lkICptYXA7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSKSk8MCkKLQkgICAgewotICAgIHBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLSAgICByZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmICgobWFwID0gbW1hcCgodm9pZCAqKSAwLCAoc2l6ZV90KSAweDIwMDAsCi0JIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCi0JIG1lbV9mZCwgMCkpID09ICh2b2lkICopLTEpICAgewotICAgIHBlcnJvcigibW1hcCBlcnJvciBpbiBtYXBfaGFyZHdhcmVfcmFtICgyKSIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBjbG9zZShtZW1fZmQpOwotICAgIG1lbWNweSgwLG1hcCxCSU9TX01FTSk7Ci0gICAgbXVubWFwKG1hcCwweDIwMDApOwotICAgIC8qCi0gICAgICogY3JlYXRlIGEgYmFja3VwIGNvcHkgb2YgdGhlIGJpb3MgdmFyaWFibGVzIHRvIHdyaXRlIGJhY2sgdGhlCi0gICAgICogbW9kaWZpZWQgdmFsdWVzCi0gICAgICovCi0gICAgaWYgKCFiaW9zX3ZhcikKLSAgICBiaW9zX3ZhciA9IChjaGFyICopbWFsbG9jKEJJT1NfTUVNKTsKLSAgICBtZW1jcHkoYmlvc192YXIsMCxCSU9TX01FTSk7Ci0KLSAgICB2YmFzZSA9ICgqKChDQVJEMTYqKSgweDEwIDw8IDIpICsgMSkpIDw8IDQ7Ci0gICAgaWYgKENvbmZpZy5WZXJib3NlID4gMCkgcHJpbnRmKCJ2YmFzZTogMHgleFxuIix2YmFzZSk7Ci0gICAgcmV0dXJuIHZiYXNlOwotfQotI2VuZGlmCi0KLXN0YXRpYyBDQVJEMzIKLXNldHVwX2ludF92ZWN0KHZvaWQpCi17Ci0gICAgY29uc3QgQ0FSRDE2IGNzID0gMHgwOwotICAgIGNvbnN0IENBUkQxNiBpcCA9IDB4MDsKLSAgICBpbnQgaTsKLQotICAgIC8qIGxldCB0aGUgaW50IHZlY3RzIHBvaW50IHRvIHRoZSBTWVNfQklPUyBzZWcgKi8KLSAgICBmb3IgKGk9MDsgaTwweDgwOyBpKyspIHsKLQkoKENBUkQxNiopMClbaTw8MV0gPSBpcDsKLQkoKENBUkQxNiopMClbKGk8PDEpKzFdID0gY3M7Ci0gICAgfQotICAgIC8qIHZpZGVvIGludGVycnVwdHMgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHg0Mjw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4NDI8PDFdID0gMHhmMDY1OwotICAgICgoQ0FSRDE2KikwKVsoMHgxMDw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTA8PDFdID0gMHhmMDY1OwotICAgIC8qIHZpZGVvIHBhcmFtIHRhYmxlIGRlZmF1bHQgbG9jYXRpb24gKGludCAxZCkgKi8KLSAgICAoKENBUkQxNiopMClbKDB4MWQ8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDFkPDwxXSA9IDB4ZjBBNDsKLSAgICAvKiBmb250IHRhYmxlcyBkZWZhdWx0IGxvY2F0aW9uIChpbnQgMUYpICovCi0gICAgKChDQVJEMTYqKTApWygweDFmPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxZjw8MV0gPSAweGZhNmU7Ci0KLSAgICAvKiBpbnQgMTEgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxMTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTE8PDFdID0gMHhmODRkOwotICAgIC8qIGludCAxMiBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDEyPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxMjw8MV0gPSAweGY4NDE7Ci0gICAgLyogaW50IDE1IGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTU8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDE1PDwxXSA9IDB4Zjg1OTsKLSAgICAvKiBpbnQgMUEgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxYTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MWE8PDFdID0gMHhmZjZlOwotICAgIC8qIGludCAwNSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDA1PDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgwNTw8MV0gPSAweGZmNTQ7Ci0gICAgLyogaW50IDA4IGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4ODw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4ODw8MV0gPSAweGZlYTU7Ci0gICAgLyogaW50IDEzIGRlZmF1bHQgbG9jYXRpb24gKGZkZCkgKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTM8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDEzPDwxXSA9IDB4ZWM1OTsKLSAgICAvKiBpbnQgMEUgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHhlPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHhlPDwxXSA9IDB4ZWY1NzsKLSAgICAvKiBpbnQgMTcgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxNzw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTc8PDFdID0gMHhlZmQyOwotICAgIC8qIGZkZCB0YWJsZSBkZWZhdWx0IGxvY2F0aW9uIChpbnQgMWUpICovCi0gICAgKChDQVJEMTYqKTApWygweDFlPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxZTw8MV0gPSAweGVmYzc7Ci0gICAgcmV0dXJuIFZfQklPUzsKLX0KLQotc3RhdGljIGludAotc2V0dXBfc3lzdGVtX2Jpb3Modm9pZCkKLXsKLSAgICBjaGFyICpkYXRlID0gIjA2LzAxLzk5IjsKLSAgICBjaGFyICplaXNhX2lkZW50ID0gIlBDSS9JU0EiOwotCi0gICAgaWYgKENvbmZpZy5NYXBTeXNCaW9zKSB7Ci0KLQlpZiAoIWNvcHlfc3lzX2Jpb3MoKSkgcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci0KLSAgICB9IGVsc2UgewotCi0vKiAgICBtZW1zZXQoKHZvaWQgKikweEYwMDAwLDB4ZjQsMHhmZmY3KTsgKi8KLQotCS8qCi0JICogd2UgdHJhcCB0aGUgImluZHVzdHJ5IHN0YW5kYXJkIGVudHJ5IHBvaW50cyIgdG8gdGhlIEJJT1MKLQkgKiBhbmQgYWxsIG90aGVyIGxvY2F0aW9ucyBieSBmaWxsaW5nIHRoZW0gd2l0aCAiaGx0IgotCSAqIFRPRE86IGltcGxlbWVudCBobHQtaGFuZGxlciBmb3IgdGhlc2UKLQkgKi8KLQltZW1zZXQoKHZvaWQgKikweEYwMDAwLDB4ZjQsMHgxMDAwMCk7Ci0KLQkvKgotCSAqIFRPRE86IHdlIHNob3VsZCBjb3B5IHRoZSBmZGQgdGFibGUgKDB4ZmVjNTktMHhmZWM1YikKLQkgKiB0aGUgdmlkZW8gcGFyYW1ldGVyIHRhYmxlICgweGYwYWMtMHhmMGZiKQotCSAqIGFuZCB0aGUgZm9udCB0YWJsZXMgKDB4ZmE2ZS0weGZlNmQpCi0JICogZnJvbSB0aGUgb3JpZ2luYWwgYmlvcyBoZXJlCi0JICovCi0KLQkvKiBzZXQgYmlvcyBkYXRlICovCi0Jc3RyY3B5KChjaGFyICopMHhGRkZGNSxkYXRlKTsKLQkvKiBzZXQgdXAgZWlzYSBpZGVudCBzdHJpbmcgKi8KLQlzdHJjcHkoKGNoYXIgKikweEZGRkQ5LGVpc2FfaWRlbnQpOwotCS8qIHdyaXRlIHN5c3RlbSBtb2RlbCBpZCBmb3IgSUJNLUFUICovCi0JKChjaGFyICopMClbMHhGRkZGRV0gPSAweGZjOwotCi0JcmV0dXJuIDE7Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi11cGRhdGVfYmlvc192YXJzKHZvaWQpCi17Ci0gICAgaW50IG1lbV9mZDsKLSAgICB2b2lkICptYXA7Ci0gICAgbWVtVHlwZSBpOwotCi0jaWZkZWYgX19pYTY0X18KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSIHwgT19TWU5DKSk8MCkKLSNlbHNlCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApCi0jZW5kaWYKLQkgICAgewotICAgIHBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLSAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKChtYXAgPSBtbWFwKCh2b2lkICopIDAsIChzaXplX3QpIDB4MjAwMCwKLQkgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKLQkgbWVtX2ZkLCAwKSkgPT0gKHZvaWQgKiktMSkgICB7Ci0gICAgcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0gKDMpIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEJJT1NfTUVNOyBpKyspIHsKLSAgICBpZiAoYmlvc192YXJbaV0gIT0gKihDQVJEOCopaSkKLQkqKChDQVJEOCopbWFwICsgaSkgPSAqKENBUkQ4KilpOwotICAgIH0KLQotICAgIG11bm1hcChtYXAsMHgyMDAwKTsKLSAgICBjbG9zZShtZW1fZmQpOwotfQotCi1zdGF0aWMgaW50Ci1jaGtzdW0oQ0FSRDggKnN0YXJ0KQotewotICBDQVJEMTYgc2l6ZTsKLSAgQ0FSRDggdmFsID0gMDsKLSAgaW50IGk7Ci0KLSAgc2l6ZSA9ICooc3RhcnQrMikgKiA1MTI7Ci0gIGZvciAoaSA9IDA7IGk8c2l6ZTsgaSsrKQotICAgIHZhbCArPSAqKHN0YXJ0ICsgaSk7Ci0KLSAgaWYgKCF2YWwpCi0gICAgcmV0dXJuIDE7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwiQklPUyBja3N1bSB3cm9uZyFcbiIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotcnVuSU5UKGludCBudW0sIGk4NmJpb3NSZWdzUHRyIFJlZ3MpCi17Ci0gICAgQm9vbCBpc1ZpZGVvID0gRkFMU0U7Ci0gICAgQ0FSRDggY29kZV9pbnRbXSA9IHsgMywgMHhjZCwgMHgwMCwgMHhmNCB9OwotCi0gICAgY29kZV9pbnRbMl0gPSAoQ0FSRDgpIG51bTsKLQotICAgIGlmIChudW0gPT0gMHgxMCkKLSAgICBpc1ZpZGVvID0gVFJVRTsKLQotICAgIGlmICghc2V0dXBfc3lzdGVtX2Jpb3MoKSkKLSAgICByZXR1cm47Ci0KLSAgICBpZiAoKGlzVmlkZW8gJiYgKCFDdXJyZW50UGNpIHx8IEN1cnJlbnRQY2ktPmFjdGl2ZSkpIHx8ICFpc1ZpZGVvKSB7Ci0gICAgQ0FSRDMyIHZiaW9zX2Jhc2U7Ci0KLSNpZmRlZiBfX2lhMzJfXwotICAgIGlmICghKHZiaW9zX2Jhc2UgPSBzZXR1cF9wcmltYXJ5X2ludF92ZWN0KCkpKQotI2Vsc2UKLSAgICBpZiAoISh2Ymlvc19iYXNlID0gc2V0dXBfaW50X3ZlY3QoKSkpCi0jZW5kaWYKLQlyZXR1cm47Ci0gICAgaWYgKCFjb3B5X3ZiaW9zKHZiaW9zX2Jhc2UpKQotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIW1hcF92cmFtKCkpCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgVjg2QklPU19ERUJVRwotCXByaW50Zigic3RhcnRpbmcgQklPU1xuIik7Ci0jZW5kaWYKLSAgICBsb2FkQ29kZVRvTWVtKCh1bnNpZ25lZCBjaGFyICopIEJJT1NfU1RBUlQsIGNvZGVfaW50KTsKLSAgICBzZXR1cF9pbygpOwotICAgIHByaW50X3JlZ3MoUmVncyk7Ci0gICAgc2V0X2lvcGVybSgpOwotICAgIHNldF9obHQoVFJVRSk7Ci0gICAgZG9feDg2KEJJT1NfU1RBUlQsUmVncyk7Ci0gICAgc2V0X2hsdChGQUxTRSk7Ci0gICAgcHJpbnRfcmVncyhSZWdzKTsKLQotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBwcmludGYoImRvbmVcbiIpOwotI2VuZGlmCi0KLSAgICBpZiAoKGlzVmlkZW8gJiYgKCFDdXJyZW50UGNpIHx8IEN1cnJlbnRQY2ktPmFjdGl2ZSkpIHx8ICFpc1ZpZGVvKQotICAgIHVwZGF0ZV9iaW9zX3ZhcnMoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncykKLXsKLSAgICBwcmludGYoImF4PSV4IGJ4PSV4IGN4PSV4IGR4PSV4IGRzPSV4IGVzPSV4IGRpPSV4IHNpPSV4XG4iLAotICAgICAgIChDQVJEMTYpcmVncy0+YXgsKENBUkQxNilyZWdzLT5ieCwoQ0FSRDE2KXJlZ3MtPmN4LChDQVJEMTYpcmVncy0+ZHgsCi0gICAgICAgKENBUkQxNilyZWdzLT5kcywoQ0FSRDE2KXJlZ3MtPmVzLChDQVJEMTYpcmVncy0+ZGksCi0gICAgICAgKENBUkQxNilyZWdzLT5zaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF91c2FnZSh2b2lkKQotewotfQotCi12b2lkCi1hZGRfaGx0KHVuc2lnbmVkIGxvbmcgdmFsKQotewotICAgIGludCBpOwotCi0gICAgaWYgKHZhbCA8IEJJT1NfTUVNIHx8ICh2YWwgPiBWUkFNX1NUQVJUICYmIHZhbCA8IChWUkFNX1NUQVJUICsgVlJBTV9TSVpFKSkKLSAgICB8fCB2YWwgPj0gU0laRSkgewotICAgIHByaW50ZigiYWRkcmVzcyBvdXQgb2YgcmFuZ2VcbiIpOwotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTwyMDsgaSsrKSB7Ci0gICAgaWYgKGhsdHBbaV0uYWRkcmVzcyA9PSAwKSB7Ci0JaGx0cFtpXS5hZGRyZXNzID0gKHZvaWQqKXZhbDsKLQlicmVhazsKLSAgICB9Ci0gICAgfQotICAgIGlmIChpID09IDIwKSBwcmludGYoIm5vIG1vcmUgaGx0cG9pbnRzIGF2YWlsYWJsZVxuIik7Ci19Ci0KLXZvaWQKLWRlbF9obHQoaW50IHZhbCkKLXsKLSAgICBpZiAodmFsID09IDIxKSB7IC8qIGRlbGV0ZSBhbGwgKi8KLSAgICBpbnQgaTsKLSAgICBwcmludGYoImNsZWFyaW5nIGFsbCBobHRwb2ludHNcbiIpOwotICAgIGZvciAoaT0wOyBpIDwyMDsgaSsrKQotCWhsdHBbaV0uYWRkcmVzcyA9IE5VTEw7Ci0gICAgfSBlbHNlIGlmICh2YWwgPj0gMCAmJiAgdmFsIDwyMCkKLSAgICBobHRwW3ZhbF0uYWRkcmVzcyA9IE5VTEw7Ci0gICAgZWxzZSBwcmludGYoImhsdHBvaW50ICVpIG91dCBvZiByYW5nZTogdmFsaWQgcmFuZ2UgMC0xOVxuIix2YWwpOwotfQotCi12b2lkCi1saXN0X2hsdCgpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpPTA7IGk8MjA7IGkrKykKLSAgICBpZiAoaGx0cFtpXS5hZGRyZXNzKQotCXByaW50ZigiaGx0cG9pbnRbJWldOiAweCVseFxuIixpLCh1bnNpZ25lZCBsb25nKWhsdHBbaV0uYWRkcmVzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfaGx0KEJvb2wgc2V0KQotewotICAgIGludCBpOwotICAgIGZvciAoaT0wOyBpPDIwOyBpKyspCi0gICAgaWYgKGhsdHBbaV0uYWRkcmVzcykgewotCWlmIChzZXQpIHsKLQlobHRwW2ldLm9yZ3ZhbCA9ICooQ0FSRDgqKWhsdHBbaV0uYWRkcmVzczsKLQkqKENBUkQ4KilobHRwW2ldLmFkZHJlc3MgPSAweGY0OwotCX0gZWxzZQotCSooQ0FSRDgqKWhsdHBbaV0uYWRkcmVzcyA9IGhsdHBbaV0ub3JndmFsOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF9pb3Blcm0odm9pZCkKLXsKLSAgICBpbnQgaSwgc3RhcnQ7Ci0KLSAgICBpb3Blcm0oMCxJT1BFUk1fQklUUywwKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBJT1BFUk1fQklUUztpKyspCi0gICAgaWYgKGlvcGVybV9saXN0W2ldKSB7Ci0Jc3RhcnQgPSBpOwotCWZvciAoO2kgPCBJT1BFUk1fQklUUzsgaSsrKSB7Ci0JaWYgKCFpb3Blcm1fbGlzdFtpXSkgewotCSAgICBpb3Blcm0oc3RhcnQsaSAtIHN0YXJ0LCAxKTsKLQkgICAgYnJlYWs7Ci0JfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4NmJpb3MuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGYzZjhlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaWZuZGVmIFY4Nl9CSU9TX0gKLSNkZWZpbmUgVjg2X0JJT1NfSAotCi0jaWYgZGVmaW5lZCAoX19pMzg2X18pIHx8IGRlZmluZWQgKF9faTQ4Nl9fKSB8fCBkZWZpbmVkIChfX2k1ODZfXykgfHwgZGVmaW5lZCAoX19pNjg2X18pIHx8IGRlZmluZWQgKF9fazZfXykKLSMgaWZuZGVmIF9faWEzMl9fCi0jICBkZWZpbmUgX19pYTMyX18KLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBwX3ByaW50ZihmLGEuLi4pIGRvIHtpZiAoQ29uZmlnLlByaW50UG9ydCkgbHByaW50ZihmLCMjYSk7fSBcCi0JCQkgd2hpbGUoMCkKLSNkZWZpbmUgaV9wcmludGYoZixhLi4uKSBkbyAge2lmIChDb25maWcuUHJpbnRJcnEpIGxwcmludGYoZiwjI2EpO30gXAotCQkJICB3aGlsZSgwKQotI2RlZmluZSBQX3ByaW50ZihmLGEuLi4pIGRvIHtpZiAoQ29uZmlnLlByaW50UGNpKSBscHJpbnRmKGYsIyNhKTt9IFwKLQkJCSAgd2hpbGUoMCkKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIENBUkQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBDQVJEMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBDQVJEMzI7Ci0jaWYgZGVmaW5lZCAoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBtZW1UeXBlOwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgaW50IG1lbVR5cGU7Ci0jZW5kaWYKLQotdHlwZWRlZiBpbnQgQm9vbDsKLQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgMQotCi1zdHJ1Y3QgY29uZmlnIHsKLSAgICBCb29sIFByaW50UG9ydDsKLSAgICBCb29sIElvU3RhdGlzdGljczsKLSAgICBCb29sIFByaW50SXJxOwotICAgIEJvb2wgUHJpbnRQY2k7Ci0gICAgQm9vbCBTaG93QWxsRGV2OwotICAgIEJvb2wgUHJpbnRJcDsKLSAgICBCb29sIFNhdmVCaW9zOwotICAgIEJvb2wgVHJhY2U7Ci0gICAgQm9vbCBDb25maWdBY3RpdmVPbmx5OwotICAgIEJvb2wgQ29uZmlnQWN0aXZlRGV2aWNlOwotICAgIEJvb2wgTWFwU3lzQmlvczsKLSAgICBCb29sIFJlc29ydDsKLSAgICBCb29sIEZpeFJvbTsKLSAgICBCb29sIE5vQ29uc29sZTsKLSAgICBCb29sIEJvb3RPbmx5OwotICAgIGludCAgVmVyYm9zZTsKLX07Ci0KLXN0cnVjdCBwaW8gewotICAgIENBUkQ4ICgqaW5iKShDQVJEMTYpOwotICAgIENBUkQxNiAoKmludykoQ0FSRDE2KTsKLSAgICBDQVJEMzIgKCppbmwpKENBUkQxNik7Ci0gICAgdm9pZCAoKm91dGIpKENBUkQxNixDQVJEOCk7Ci0gICAgdm9pZCAoKm91dHcpKENBUkQxNixDQVJEMTYpOwotICAgIHZvaWQgKCpvdXRsKShDQVJEMTYsQ0FSRDMyKTsKLX07Ci0KLXN0cnVjdCByZWdzODYgewotCWxvbmcgZWJ4OwotCWxvbmcgZWN4OwotCWxvbmcgZWR4OwotCWxvbmcgZXNpOwotCWxvbmcgZWRpOwotCWxvbmcgZWJwOwotCWxvbmcgZWF4OwotCWxvbmcgZWlwOwotCWxvbmcgZXNwOwotCXVuc2lnbmVkIHNob3J0IGNzOwotCXVuc2lnbmVkIHNob3J0IHNzOwotCXVuc2lnbmVkIHNob3J0IGVzOwotCXVuc2lnbmVkIHNob3J0IGRzOwotCXVuc2lnbmVkIHNob3J0IGZzOwotCXVuc2lnbmVkIHNob3J0IGdzOwotICAgIGxvbmcgZWZsYWdzOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIENBUkQzMiBheDsKLSAgICBDQVJEMzIgYng7Ci0gICAgQ0FSRDMyIGN4OwotICAgIENBUkQzMiBkeDsKLSAgICBDQVJEMzIgY3M7Ci0gICAgQ0FSRDMyIGVzOwotICAgIENBUkQzMiBkczsKLSAgICBDQVJEMzIgc2k7Ci0gICAgQ0FSRDMyIGRpOwotfSBpODZiaW9zUmVncywgKmk4NmJpb3NSZWdzUHRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IGZkOwotICAgIGludCB2dDsKLX0gY29uc29sZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQqIGFkZHJlc3M7Ci0gICAgQ0FSRDggb3JndmFsOwotfSBoYWx0cG9pbnRzOwotCi1lbnVtIGRldl90eXBlIHsgIE5PTkUsIElTQSwgUENJIH07Ci1zdHJ1Y3QgZGV2aWNlIHsKLSAgICBCb29sIGJvb3RlZDsKLSAgICBlbnVtIGRldl90eXBlIHR5cGU7Ci0gICAgdW5pb24gewotICAgICAgaW50IG5vbmU7Ci0gICAgICBzdHJ1Y3QgcGNpIHsKLQlpbnQgYnVzOwotCWludCBkZXY7Ci0JaW50IGZ1bmM7Ci0gICAgICB9IHBjaTsKLSAgICB9IGxvYzsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlIERldmljZTsKLQotI2lmZGVmIF9fYWxwaGFfXwotdW5zaWduZWQgbG9uZyBfYnVzX2Jhc2Uodm9pZCk7Ci1leHRlcm4gdm9pZCogdnJhbV9tYXA7Ci1leHRlcm4gaW50IHNwYXJzZV9zaGlmdDsKLSNlbmRpZgotCi1leHRlcm4gc3RydWN0IHBpbyBQOwotZXh0ZXJuIHN0cnVjdCBjb25maWcgQ29uZmlnOwotI2RlZmluZSBJT1BFUk1fQklUUyAxMDI0Ci1leHRlcm4gaW50IGlvcGVybV9saXN0W0lPUEVSTV9CSVRTXTsKLQotZXh0ZXJuIHZvaWQgc2V0dXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBkb194ODYodW5zaWduZWQgbG9uZyBiaW9zX3N0YXJ0LGk4NmJpb3NSZWdzUHRyIHJlZ3MpOwotZXh0ZXJuIGludCBydW5fYmlvc19pbnQoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncyk7Ci1leHRlcm4gQ0FSRDMyIGdldEludFZlY3QoaW50IG51bSk7Ci1DQVJEMzIgZ2V0SVAodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGNhbGxfYm9vdChzdHJ1Y3QgZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgcnVuSU5UKGludCBudW0saTg2Ymlvc1JlZ3NQdHIgUmVncyk7Ci1leHRlcm4gdm9pZCBhZGRfaGx0KHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdm9pZCBkZWxfaGx0KGludCBhZGRyKTsKLWV4dGVybiB2b2lkIGxpc3RfaGx0KCk7Ci0KLWV4dGVybiBpbnQgcG9ydF9yZXBfaW5iKENBUkQxNiBwb3J0LCBDQVJEOCAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KTsKLWV4dGVybiBpbnQgcG9ydF9yZXBfaW53KENBUkQxNiBwb3J0LCBDQVJEMTYgKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCk7Ci1leHRlcm4gaW50IHBvcnRfcmVwX2lubChDQVJEMTYgcG9ydCwgQ0FSRDMyICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpOwotZXh0ZXJuIGludCBwb3J0X3JlcF9vdXRiKENBUkQxNiBwb3J0LCBDQVJEOCAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KTsKLWV4dGVybiBpbnQgcG9ydF9yZXBfb3V0dyhDQVJEMTYgcG9ydCwgQ0FSRDE2ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpOwotZXh0ZXJuIGludCBwb3J0X3JlcF9vdXRsKENBUkQxNiBwb3J0LCBDQVJEMzIgKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCk7Ci1leHRlcm4gQ0FSRDggcF9pbmIoQ0FSRDE2IHBvcnQpOwotZXh0ZXJuIENBUkQxNiBwX2ludyhDQVJEMTYgcG9ydCk7Ci1leHRlcm4gQ0FSRDMyIHBfaW5sKENBUkQxNiBwb3J0KTsKLWV4dGVybiB2b2lkIHBfb3V0YihDQVJEMTYgcG9ydCwgQ0FSRDggdmFsKTsKLWV4dGVybiB2b2lkIHBfb3V0dyhDQVJEMTYgcG9ydCwgQ0FSRDE2IHZhbCk7Ci1leHRlcm4gdm9pZCBwX291dGwoQ0FSRDE2IHBvcnQsIENBUkQzMiB2YWwpOwotI2lmZGVmIF9fYWxwaGFfXwotZXh0ZXJuIENBUkQ4IGFfaW5iKENBUkQxNiBwb3J0KTsKLWV4dGVybiBDQVJEMTYgYV9pbncoQ0FSRDE2IHBvcnQpOwotZXh0ZXJuIHZvaWQgYV9vdXRiKENBUkQxNiBwb3J0LCBDQVJEOCB2YWwpOwotZXh0ZXJuIHZvaWQgYV9vdXR3KENBUkQxNiBwb3J0LCBDQVJEMTYgdmFsKTsKLSNlbmRpZgotI2lmZGVmIF9fYWxwaGFfXwotQ0FSRDggbWVtX3JiKENBUkQzMiBhZGRyKTsKLUNBUkQxNiBtZW1fcncoQ0FSRDMyIGFkZHIpOwotQ0FSRDMyIG1lbV9ybChDQVJEMzIgYWRkcik7Ci12b2lkIG1lbV93YihDQVJEMzIgYWRkciwgQ0FSRDggdmFsKTsKLXZvaWQgbWVtX3d3KENBUkQzMiBhZGRyLCBDQVJEMTYgdmFsKTsKLXZvaWQgbWVtX3dsKENBUkQzMiBhZGRyLCBDQVJEMzIgdmFsKTsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgaW9fc3RhdGlzdGljcyh2b2lkKTsKLWV4dGVybiB2b2lkIGNsZWFyX3N0YXQodm9pZCk7Ci1leHRlcm4gaW50IGludF9oYW5kbGVyKGludCBudW0sIHN0cnVjdCByZWdzODYgKnJlZ3MpOwotCi1leHRlcm4gY29uc29sZSBvcGVuX2NvbnNvbGUodm9pZCk7Ci1leHRlcm4gdm9pZCBjbG9zZV9jb25zb2xlKGNvbnNvbGUpOwotCi1leHRlcm4gdm9pZCBkcHJpbnQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLQotZXh0ZXJuIEJvb2wgbG9nZ2luZzsKLWV4dGVybiBCb29sIG5vc3Rkb3V0OwotZXh0ZXJuIGNoYXIqIGxvZ2ZpbGU7Ci1leHRlcm4gdm9pZCBsb2dvbih2b2lkKiBwdHIpOwotZXh0ZXJuIHZvaWQgbG9nb2ZmKCk7Ci1leHRlcm4gdm9pZCBscHJpbnRmKGNvbnN0IGNoYXIgKmYsIC4uLik7Ci0KLSNkZWZpbmUgTUVNX0ZJTEUgIi9kZXYvbWVtIgotI2RlZmluZSBERUZBVUxUX1ZfQklPUyAweGMwMDAwCi0jaWZuZGVmIFZfQklPUwotI2RlZmluZSBWX0JJT1MgREVGQVVMVF9WX0JJT1MKLSNlbmRpZgotCi0jaWZkZWYgX19hbHBoYV9fCi0jZGVmaW5lIE5FRURfUENJX0lPCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3dvcmtpbmdfY2FyZHMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3dvcmtpbmdfY2FyZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTNmMjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy93b3JraW5nX2NhcmRzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1EYXZpZCBNb25ybzogICAgICAgICAgICAgICAgICAgIFRyaWRlbnQgVEdVSSA5NDQwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcmdlL1ZYIChEaWFtb25kIFN0ZWFsdGggM0QgMzQwMCkgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUml2YSBUTlQgKERpYW1vbmQgVmlwZXIgVjU1MCkgICBubyB2Ymlvcz8KLUphcm5vIFBhYW5hbmVuIDxqcGFhbmFAczIub3JnPjogR3VpbGxlbW90IE1heGlnYW1lciBYZW50b3IgMzIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVklESUEgVE5UMiBVbHRyYSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRpdmUgR3JhcGhpY3MgQmxhc3RlciBFeHh0cmVtZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBlcm1lZGlhIDIpIApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy94ODZlbXUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MveDg2ZW11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Yzk5ZDcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy94ODZlbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2luY2x1ZGUgImRlYnVnLmgiCi0KLSNkZWZpbmUgSUZfTUFTSyAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBWSUZfTUFTSyAgICAweDAwMDgwMDAwICAvKiB2aXJ0dWFsIGludGVycnVwdCBmbGFnICovCi0jZGVmaW5lIFZJUF9NQVNLICAgIDB4MDAxMDAwMDAgIC8qIHZpcnR1YWwgaW50ZXJydXB0IHBlbmRpbmcgKi8KLQotI2luY2x1ZGUgPC91c3IvaW5jbHVkZS91bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLS8qI2luY2x1ZGUgPHN5c2NhbGwtbGlzdC5oPiAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaWZkZWYgX19hbHBoYV9fCi0jaW5jbHVkZSA8c3lzL2lvLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlICJBc21NYWNyb3MuaCIKLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jIGRlZmluZSBERUJVRwotI2luY2x1ZGUgIng4NmVtdS5oIgotI3VuZGVmIERFQlVHCi0KLSNkZWZpbmUgTSAgICAgICAgICAgIF9YODZFTVVfZW52Ci0jZGVmaW5lIENQVV9SRUcocmVnKSBNLng4Ni5SXyMjcmVnCi0KLXN0cnVjdCBwaW8gUDsKLQotdm9pZAotc2V0dXBfaW8odm9pZCkKLXsKLSAgICBpZiAoIUNvbmZpZy5QcmludFBvcnQgJiYgIUNvbmZpZy5Jb1N0YXRpc3RpY3MpIHsKLQotI2lmIGRlZmluZWQgKF9faTM4Nl9fKQotICAgIFAuaW5iID0gKHU4KCopKHUxNikpaW5iOwotICAgIFAuaW53ID0gKHUxNigqKSh1MTYpKWludzsKLSAgICBQLm91dGIgPSAodm9pZCgqKSh1MTYsdTgpKW91dGI7Ci0gICAgUC5vdXR3ID0gKHZvaWQoKikodTE2LHUxNikpb3V0dzsKLSNlbHNlCi0gICAgUC5pbmIgPSBwX2luYjsKLSAgICBQLmludyA9IHBfaW53OwotICAgIFAub3V0YiA9IHBfb3V0YjsKLSAgICBQLm91dHcgPSBwX291dHc7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChfX2kzODZfXykgJiYgISBkZWZpbmVkKE5FRURfUENJX0lPKQotICAgIFAuaW5sID0gKHUzMigqKSh1MTYpKWlubDsKLSAgICBQLm91dGwgPSAodm9pZCgqKSh1MTYsdTMyKSlvdXRsOwotI2Vsc2UKLSAgICBQLmlubCA9IHBfaW5sOwotICAgIFAub3V0bCA9IHBfb3V0bDsKLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0gICAgUC5pbmIgPSBwX2luYjsKLSAgICBQLmludyA9IHBfaW53OwotICAgIFAuaW5sID0gcF9pbmw7Ci0gICAgUC5vdXRiID0gcF9vdXRiOwotICAgIFAub3V0dyA9IHBfb3V0dzsKLSAgICBQLm91dGwgPSBwX291dGw7Ci0gICAgfQotfQotCi12b2lkCi14ODZlbXVfZG9faW50KGludCBudW0pCi17Ci0gICAgc3RydWN0IHJlZ3M4NiByZWdzOwotCi0gICAgaV9wcmludGYoImludCAweCV4IHJlY2VpdmVkOiBheDoweCV4IixudW0sQ1BVX1JFRyhBWCkpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlpX3ByaW50ZigiIGF0OiAweCV4XG4iLGdldElQKCkpOwotICAgIGVsc2UKLQlpX3ByaW50ZigiXG4iKTsKLQotICAgIC8qIHRyeSB0byBydW4gYmlvcyBpbnRlcnJ1cHQgKi8KLQotICAgIC8qIGlmIG5vdCBpbnN0YWxsZWQgZmFsbCBiYWNrICovCi0jZGVmaW5lIENPUFkoeCx5KSByZWdzLnkgPSBNLng4Ni54Ci0jZGVmaW5lIENPUFlfUih4LHkpIE0ueDg2LnggPSByZWdzLnkKLQotICAgIENPUFkoUl9FQVgsZWF4KTsKLSAgICBDT1BZKFJfRUJYLGVieCk7Ci0gICAgQ09QWShSX0VDWCxlY3gpOwotICAgIENPUFkoUl9FRFgsZWR4KTsKLSAgICBDT1BZKFJfRVNJLGVzaSk7Ci0gICAgQ09QWShSX0VESSxlZGkpOwotICAgIENPUFkoUl9FQlAsZWJwKTsKLSAgICBDT1BZKFJfRUlQLGVpcCk7Ci0gICAgQ09QWShSX0VTUCxlc3ApOwotICAgIENPUFkoUl9DUyxjcyk7Ci0gICAgQ09QWShSX1NTLHNzKTsKLSAgICBDT1BZKFJfRFMsZHMpOwotICAgIENPUFkoUl9FUyxlcyk7Ci0gICAgQ09QWShSX0ZTLGZzKTsKLSAgICBDT1BZKFJfR1MsZ3MpOwotICAgIENPUFkoUl9FRkxHLGVmbGFncyk7Ci0KLSAgICBpZiAoIShpbnRfaGFuZGxlcihudW0sJnJlZ3MpKSkgewotCWlmICghcnVuX2Jpb3NfaW50KG51bSwmcmVncykpCi0JICAgIGdvdG8gdW5rbm93bl9pbnQ7Ci0JZWxzZQotCSAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ09QWV9SKFJfRUFYLGVheCk7Ci0gICAgQ09QWV9SKFJfRUJYLGVieCk7Ci0gICAgQ09QWV9SKFJfRUNYLGVjeCk7Ci0gICAgQ09QWV9SKFJfRURYLGVkeCk7Ci0gICAgQ09QWV9SKFJfRVNJLGVzaSk7Ci0gICAgQ09QWV9SKFJfRURJLGVkaSk7Ci0gICAgQ09QWV9SKFJfRUJQLGVicCk7Ci0gICAgQ09QWV9SKFJfRUlQLGVpcCk7Ci0gICAgQ09QWV9SKFJfRVNQLGVzcCk7Ci0gICAgQ09QWV9SKFJfQ1MsY3MpOwotICAgIENPUFlfUihSX1NTLHNzKTsKLSAgICBDT1BZX1IoUl9EUyxkcyk7Ci0gICAgQ09QWV9SKFJfRVMsZXMpOwotICAgIENPUFlfUihSX0ZTLGZzKTsKLSAgICBDT1BZX1IoUl9HUyxncyk7Ci0gICAgQ09QWV9SKFJfRUZMRyxlZmxhZ3MpOwotICAgIHJldHVybjsKLQotIHVua25vd25faW50OgotICAgIGZwcmludGYoc3RkZXJyLCJcblVua25vd24gdm04Nl9pbnQ6ICVYXG5cbiIsbnVtKTsKLSAgICBYODZFTVVfaGFsdF9zeXMoKTsKLSAgICByZXR1cm47Ci0KLSN1bmRlZiBDT1BZCi0jdW5kZWYgQ09QWV9SCi19Ci0KLXZvaWQKLXNldHVwX3g4NmVtdSh1bnNpZ25lZCBsb25nIGJpb3Nfc3RhcnQsIGk4NmJpb3NSZWdzUHRyIHJlZ3MpCi17Ci0gICAgaW50IGk7Ci0gICAgQ0FSRDMyIGVpcDsKLSAgICBDQVJEMTYgY3M7Ci0gICAgWDg2RU1VX2ludHJGdW5jcyBpbnRGdW5jc1syNTZdOwotCi0gICAgWDg2RU1VX3Bpb0Z1bmNzIHBpb0Z1bmNzID0gewotCSh1OCgqKSh1MTYpKVAuaW5iLAotCSh1MTYoKikodTE2KSlQLmludywKLQkodTMyKCopKHUxNikpUC5pbmwsCi0JKHZvaWQoKikodTE2LHU4KSlQLm91dGIsCi0JKHZvaWQoKikodTE2LHUxNikpUC5vdXR3LAotCSh2b2lkKCopKHUxNix1MzIpKVAub3V0bAotICAgIH07Ci0jaWZkZWYgX19hbHBoYV9fCi0gICAgWDg2RU1VX21lbUZ1bmNzIG1lbUZ1bmNzID0gewotICAgICAgKHU4KCopKHUzMikpbWVtX3JiLAotICAgICAgKHUxNigqKSh1MzIpKW1lbV9ydywKLSAgICAgICh1MzIoKikodTMyKSltZW1fcmwsCi0gICAgICAodm9pZCgqKSh1MzIsdTgpKW1lbV93YiwKLSAgICAgICh2b2lkKCopKHUzMix1MTYpKW1lbV93dywKLSAgICAgICh2b2lkKCopKHUzMix1MzIpKW1lbV93bAotICAgIH07Ci0jZW5kaWYKLSAgICBNLm1lbV9iYXNlID0gMDsKLSAgICBNLm1lbV9zaXplID0gMTAyNCoxMDI0ICsgMTAyNDsKLSAgICAvKiAgTS54ODYuZGVidWcgPSBERUJVR19ESVNBU1NFTUJMRV9GIHwgREVCVUdfVFJBQ0VfRiB8IERFQlVHX0RFQ09ERV9GOyAqLwotICAgIC8qICBNLng4Ni5kZWJ1ZyB8PSBERUJVR19ERUNPREVfRiB8ICBERUJVR19UUkFDRV9GOyAqLwotLyoKLSAqIEZvciBzaW5nbGUgc3RlcCB0cmFjaW5nIGNvbXBpbGUgeDg2ZW11IHdpdGggb3B0aW9uIC1EREVCVUcKLSAqLwotICAgIE0ueDg2LmRlYnVnID0gMDsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JTS54ODYuZGVidWcgPSBERUJVR19TQVZFX0NTX0lQOwotCi0gICAgaWYgKENvbmZpZy5UcmFjZSkKLQlYODZFTVVfdHJhY2Vfb24oKTsKLQotICAgIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKCZwaW9GdW5jcyk7Ci0jaWZkZWYgX19hbHBoYV9fCi0gICAgWDg2RU1VX3NldHVwTWVtRnVuY3MoJm1lbUZ1bmNzKTsKLSNlbmRpZgotICAgIGZvciAoaT0wO2k8MjU2O2krKykKLQlpbnRGdW5jc1tpXSA9IHg4NmVtdV9kb19pbnQ7Ci0gICAgWDg2RU1VX3NldHVwSW50ckZ1bmNzKGludEZ1bmNzKTsKLQotICAgIGVpcCA9IGJpb3Nfc3RhcnQgJiAweEZGRkY7Ci0gICAgY3MgPSAoYmlvc19zdGFydCAmIDB4RkYwMDAwKSA+PiA0OwotCi0gICAgQ1BVX1JFRyhFQVgpID0gcmVncy0+YXg7Ci0gICAgQ1BVX1JFRyhFQlgpID0gcmVncy0+Yng7Ci0gICAgQ1BVX1JFRyhFQ1gpID0gcmVncy0+Y3g7Ci0gICAgQ1BVX1JFRyhFRFgpID0gcmVncy0+ZHg7Ci0gICAgQ1BVX1JFRyhFU0kpID0gcmVncy0+c2k7Ci0gICAgQ1BVX1JFRyhFREkpID0gcmVncy0+ZGk7Ci0gICAgQ1BVX1JFRyhFQlApID0gMDsKLSAgICBDUFVfUkVHKEVJUCkgPSBlaXA7Ci0gICAgQ1BVX1JFRyhDUykgPSBjczsKLSAgICBDUFVfUkVHKFNQKSA9IDB4MTAwOwotICAgIENQVV9SRUcoU1MpID0gMHgzMDsgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBwYyBiaW9zIHN0YWNrICovCi0gICAgQ1BVX1JFRyhFUykgPSByZWdzLT5lczsKLSAgICBDUFVfUkVHKERTKSA9IHJlZ3MtPmRzOwotICAgIENQVV9SRUcoRlMpID0gMDsKLSAgICBDUFVfUkVHKEdTKSA9IDA7Ci0gICAgQ1BVX1JFRyhFRkxHKSB8PSAoVklGX01BU0sgfCBWSVBfTUFTSyB8IElGX01BU0sgfCAweDIpOwotfQotCi12b2lkCi1jb2xsZWN0X2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzKQotewotICAgIHJlZ3MtPmF4ID0gQ1BVX1JFRyhFQVgpOwotICAgIHJlZ3MtPmJ4ID0gQ1BVX1JFRyhFQlgpOwotICAgIHJlZ3MtPmN4ID0gQ1BVX1JFRyhFQ1gpOwotICAgIHJlZ3MtPmR4ID0gQ1BVX1JFRyhFRFgpOwotICAgIHJlZ3MtPmVzID0gQ1BVX1JFRyhFUyk7Ci0gICAgcmVncy0+ZHMgPSBDUFVfUkVHKERTKTsKLSAgICByZWdzLT5kaSA9IENQVV9SRUcoRURJKTsKLSAgICByZWdzLT5zaSA9IENQVV9SRUcoRVNJKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3g4NmVtdSh2b2lkKQotewotICAgIFg4NkVNVV9leGVjKCk7Ci19Ci0KLXN0YXRpYyBqbXBfYnVmIHg4Nl9lc2M7Ci1zdGF0aWMgdm9pZAotdm1leGl0KGludCB1bnVzZWQpCi17Ci0gICAgbG9uZ2ptcCh4ODZfZXNjLDEpOwotfQotCi12b2lkCi1kb194ODYodW5zaWduZWQgbG9uZyBiaW9zX3N0YXJ0LCBpODZiaW9zUmVnc1B0ciByZWdzKQotewotICAgIHN0YXRpYyB2b2lkICgqb3JnX2hhbmRsZXIpKGludCk7Ci0KLSAgICBzZXR1cF94ODZlbXUoYmlvc19zdGFydCxyZWdzKTsKLSAgICBpZiAoc2V0am1wKHg4Nl9lc2MpID09IDApIHsKLQlvcmdfaGFuZGxlciA9IHNpZ25hbCgyLHZtZXhpdCk7Ci0JZG9feDg2ZW11KCk7Ci0Jc2lnbmFsKDIsb3JnX2hhbmRsZXIpOwotCWNvbGxlY3RfYmlvc19yZWdzKHJlZ3MpOwotICAgIH0gZWxzZSB7Ci0Jc2lnbmFsKDIsb3JnX2hhbmRsZXIpOwotCXByaW50ZigiaW50ZXJydXB0ZWQgYXQgMHgleFxuIiwoKENBUkQxNilDUFVfUkVHKENTKSkgPDwgNAotCSAgICAgICB8IChDQVJEMTYpQ1BVX1JFRyhFSVApKTsKLSAgICB9Ci19Ci0KLWludAotcnVuX2Jpb3NfaW50KGludCBudW0sIHN0cnVjdCByZWdzODYgKnJlZ3MpCi17Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHN0YXRpYyBpbnQgZmlyc3R0aW1lID0gMTsKLSNlbmRpZgotICAgIC8qIGNoZWNrIGlmIGJpb3MgdmVjdG9yIGlzIGluaXRpYWxpemVkICovCi0gICAgaWYgKCgoQ0FSRDE2KikwKVsobnVtPDwxKSsxXSA9PSAweDAwMDApIHsgLyogU1lTX0JJT1NfU0VHID8qLwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLQlpX3ByaW50ZigiY2FyZCBCSU9TIG5vdCBsb2FkZWRcbiIpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIGlmIChmaXJzdHRpbWUpIHsKLQlkcHJpbnQoMCwweDNEMCk7Ci0JZmlyc3R0aW1lID0gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlfcHJpbnRmKCJjYWxsaW5nIGNhcmQgQklPUyBhdDogIik7Ci0gICAgaV9wcmludGYoIjB4JXg6JXhcbiIsKChDQVJEMTYgKikgMClbKG51bSA8PCAxKSArIDFdLAotCSAgICAgKENBUkQzMikoKENBUkQxNiAqKSAwKVtudW0gPDwgMV0pOwotICAgIFg4NkVNVV9wcmVwYXJlRm9ySW50KG51bSk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotQ0FSRDMyCi1nZXRJbnRWZWN0KGludCBudW0pCi17Ci0gIHJldHVybiAoKENBUkQzMiopMClbbnVtXTsKLX0KLSNpZiAwCi12b2lkCi1wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdwdHI7Ci0gICAgdmFfc3RhcnQoYXJncHRyLCBmbXQpOwotICAgIHZmcHJpbnRmKHN0ZG91dCwgZm10LCBhcmdwdHIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIHZhX2VuZChhcmdwdHIpOwotfQotI2VuZGlmCi0KLUNBUkQzMgotZ2V0SVAodm9pZCkKLXsKLSAgICByZXR1cm4gKE0ueDg2LnNhdmVkX2NzIDw8IDQpICsgTS54ODYuc2F2ZWRfaXA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvTElDRU5TRSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2VkZTRhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgIExpY2Vuc2UgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSB4ODZlbXUgbGlicmFyeSBpcyB1bmRlciBhIEJTRCBzdHlsZSBsaWNlbnNlLCBjb21hcHRpYmxlCi13aXRoIHRoZSBYRnJlZTg2IGFuZCBYIGxpY2Vuc2VzIHVzZWQgYnkgWEZyZWU4Ni4gVGhlCi1vcmlnaW5hbCB4ODZlbXUgbGlicmFyaWVzIHdlcmUgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZS4gRHVlIHRvIGxpY2Vuc2UgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiB0aGUgR1BMCi1hbmQgdGhlIFhGcmVlODYgbGljZW5zZSwgdGhlIG9yaWdpbmFsIGF1dGhvcnMgb2YgdGhlIGNvZGUKLWRlY2lkZWQgdG8gYWxsb3cgYSBsaWNlbnNlIGNoYW5nZS4gSWYgeW91IGhhdmUgc3VibWl0dGVkCi1jb2RlIHRvIHRoZSBvcmlnaW5hbCB4ODZlbXUgcHJvamVjdCwgYW5kIHlvdSBkb24ndCBhZ3JlZQotd2l0aCB0aGUgbGljZW5zZSBjaGFuZ2UsIHBsZWFzZSBjb250YWN0IHVzIGFuZCBsZXQgeW91Ci1rbm93LiBZb3VyIGNvZGUgd2lsbCBiZSByZW1vdmVkIHRvIGNvbXBseSB3aXRoIHlvdXIgd2lzaGVzLgotCi1JZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGFib3V0IHRoaXMsIHBsZWFzZSBzZW5kIGVtYWlsIHRvCi14ODZlbXVAbGludXhsYWJzLmNvbSBvciBLZW5kYWxsQkBzY2l0ZWNoc29mdC5jb20gZm9yCi1jbGFyaWZpY2F0aW9uLgotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVidWcuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzVlNmFjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGhhbmRsZSBkZWJ1Z2dpbmcgb2YgdGhlCi0qCQkJCWVtdWxhdG9yLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBERUJVRwotCi1zdGF0aWMgdm9pZCAgICAgcHJpbnRfZW5jb2RlZF9ieXRlcyAodTE2IHMsIHUxNiBvKTsKLXN0YXRpYyB2b2lkICAgICBwcmludF9kZWNvZGVkX2luc3RydWN0aW9uICh2b2lkKTsKLXN0YXRpYyBpbnQgICAgICBwYXJzZV9saW5lIChjaGFyICpzLCBpbnQgKnBzLCBpbnQgKm4pOwotCi0vKiBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSBkZWJ1ZydzIG91dHB1dC4gKi8KLXZvaWQgWDg2RU1VX3RyYWNlX3JlZ3MgKHZvaWQpCi17Ci0JaWYgKERFQlVHX1RSQUNFKCkpIHsKLQkJeDg2ZW11X2R1bXBfcmVncygpOwotICAgIH0KLQlpZiAoREVCVUdfREVDT0RFKCkgJiYgISBERUJVR19ERUNPREVfTk9QUklOVCgpKSB7Ci0JCXByaW50aygiJTA0eDolMDR4ICIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwKTsKLQkJcHJpbnRfZW5jb2RlZF9ieXRlcyggTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwKTsKLQkJcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbigpOwotICAgIH0KLX0KLQotdm9pZCBYODZFTVVfdHJhY2VfeHJlZ3MgKHZvaWQpCi17Ci0JaWYgKERFQlVHX1RSQUNFKCkpIHsKLQkJeDg2ZW11X2R1bXBfeHJlZ3MoKTsKLSAgICB9Ci19Ci0KLXZvaWQgeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUgKHZvaWQpCi17Ci0gICAgLyoKLSAgICAgKiBUaGlzIHJvdXRpbmUgY2FsbGVkIGlmIHRoZSBmbGFnIERFQlVHX0RJU0FTU0VNQkxFIGlzIHNldCBraW5kCi0gICAgICogb2YgYSBoYWNrIQotICAgICAqLwotCXByaW50aygiJTA0eDolMDR4ICIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwKTsKLQlwcmludF9lbmNvZGVkX2J5dGVzKCBNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOwotCXByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24oKTsKLX0KLQotc3RhdGljIHZvaWQgZGlzYXNzZW1ibGVfZm9yd2FyZCAodTE2IHNlZywgdTE2IG9mZiwgaW50IG4pCi17Ci0JWDg2RU1VX3N5c0VudiB0cmVnczsKLQlpbnQgaTsKLQl1OCBvcDE7Ci0gICAgLyoKLSAgICAgKiBoYWNrLCBoYWNrLCBoYWNrLiAgV2hhdCB3ZSBkbyBpcyB1c2UgdGhlIGV4YWN0IG1hY2hpbmVyeSBzZXQgdXAKLSAgICAgKiBmb3IgZXhlY3V0aW9uLCBleGNlcHQgdGhhdCBub3cgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBzdGF0ZQotICAgICAqIGZsYWcgYXNzb2NpYXRlZCB3aXRoIHRoZSAiZXhlY3V0aW9uIiwgYW5kIHdlIGFyZSB1c2luZyBhIGNvcHkKLSAgICAgKiBvZiB0aGUgcmVnaXN0ZXIgc3RydWN0LiAgQWxsIHRoZSBtYWpvciBvcGNvZGVzLCBvbmNlIGZ1bGx5Ci0gICAgICogZGVjb2RlZCwgaGF2ZSB0aGUgZm9sbG93aW5nIHR3byBzdGVwczogVFJBQ0VfUkVHUyhyLG0pOwotICAgICAqIFNJTkdMRV9TVEVQKHIsbSk7IHdoaWNoIGRpc2FwcGVhciBpZiBERUJVRyBpcyBub3QgZGVmaW5lZCB0bwotICAgICAqIHRoZSBwcmVwcm9jZXNzb3IuICBUaGUgVFJBQ0VfUkVHUyBtYWNybyBleHBhbmRzIHRvOgotICAgICAqCi0gICAgICogaWYgKGRlYnVnJkRFQlVHX0RJU0FTU0VNQkxFKQotICAgICAqICAgICB7anVzdF9kaXNhc3NlbWJsZSgpOyBnb3RvIEVuZE9mSW5zdHJ1Y3Rpb247fQotICAgICAqICAgICBpZiAoZGVidWcmREVCVUdfVFJBQ0UpIHRyYWNlX3JlZ3MocixtKTsKLSAgICAgKgotICAgICAqIC4uLi4uLiAgYW5kIGF0IHRoZSBsYXN0IGxpbmUgb2YgdGhlIHJvdXRpbmUuCi0gICAgICoKLSAgICAgKiBFbmRPZkluc3RydWN0aW9uOiBlbmRfaW5zdHIoKTsKLSAgICAgKgotICAgICAqIFVwIHRvIHRoZSBwb2ludCB3aGVyZSBUUkFDRV9SRUcgaXMgZXhwYW5kZWQsIE5PIG1vZGlmaWNhdGlvbnMKLSAgICAgKiBhcmUgZG9uZSB0byBhbnkgcmVnaXN0ZXIgRVhDRVBUIHRoZSBJUCByZWdpc3RlciwgZm9yIGZldGNoIGFuZAotICAgICAqIGRlY29kaW5nIHB1cnBvc2VzLgotICAgICAqCi0gICAgICogVGhpcyB3YXMgZG9uZSBmb3IgYW4gZW50aXJlbHkgZGlmZmVyZW50IHJlYXNvbiwgYnV0IG1ha2VzIGEKLSAgICAgKiBuaWNlIHdheSB0byBnZXQgdGhlIHN5c3RlbSB0byBoZWxwIGRlYnVnIGNvZGVzLgotICAgICAqLwotCXRyZWdzID0gTTsKLSAgICB0cmVncy54ODYuUl9JUCA9IG9mZjsKLSAgICB0cmVncy54ODYuUl9DUyA9IHNlZzsKLQotICAgIC8qIHJlc2V0IHRoZSBkZWNvZGluZyBidWZmZXJzICovCi0gICAgdHJlZ3MueDg2LmVuY19zdHJfcG9zID0gMDsKLSAgICB0cmVncy54ODYuZW5jX3BvcyA9IDA7Ci0KLSAgICAvKiB0dXJuIG9uIHRoZSAiZGlzYXNzZW1ibGUgb25seSwgbm8gZXhlY3V0ZSIgZmxhZyAqLwotICAgIHRyZWdzLng4Ni5kZWJ1ZyB8PSBERUJVR19ESVNBU1NFTUJMRV9GOwotCi0gICAgLyogRFVNUCBORVhUIG4gaW5zdHJ1Y3Rpb25zIHRvIHNjcmVlbiBpbiBzdHJhaWdodF9saW5lIGZhc2hpb24gKi8KLSAgICAvKgotICAgICAqIFRoaXMgbG9va3MgbGlrZSB0aGUgcmVndWxhciBpbnN0cnVjdGlvbiBmZXRjaCBzdHJlYW0sIGV4Y2VwdAotICAgICAqIHRoYXQgd2hlbiB0aGlzIG9jY3VycywgZWFjaCBmZXRjaGVkIG9wY29kZSwgdXBvbiBzZWVpbmcgdGhlCi0gICAgICogREVCVUdfRElTQVNTRU1CTEUgZmxhZyBzZXQsIGV4aXRzIGltbWVkaWF0ZWx5IGFmdGVyIGRlY29kaW5nCi0gICAgICogdGhlIGluc3RydWN0aW9uLiAgWFhYIC0tLSBDSEVDSyBUSEFUIE1FTSBJUyBOT1QgQUZGRUNURUQhISEKLSAgICAgKiBOb3RlIHRoZSB1c2Ugb2YgYSBjb3B5IG9mIHRoZSByZWdpc3RlciBzdHJ1Y3R1cmUuLi4KLSAgICAgKi8KLSAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKLQkJb3AxID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTPDw0KSArIChNLng4Ni5SX0lQKyspKTsKLQkJKHg4NmVtdV9vcHRhYltvcDFdKShvcDEpOwotICAgIH0KLSAgICAvKiBlbmQgbWFqb3IgaGFjayBtb2RlLiAqLwotfQotCi12b2lkIHg4NmVtdV9jaGVja19pcF9hY2Nlc3MgKHZvaWQpCi17Ci0gICAgLyogTlVMTCBhcyBvZiBub3cgKi8KLX0KLQotdm9pZCB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzICh2b2lkKQotewotfQotCi12b2lkIHg4NmVtdV9jaGVja19tZW1fYWNjZXNzICh1MzIgZHVtbXkpCi17Ci0JLyogIGNoZWNrIGJvdW5kcywgZXRjICovCi19Ci0KLXZvaWQgeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzICh1aW50IGR1bW15MSwgdWludCBkdW1teTIpCi17Ci0JLyogIGNoZWNrIGJvdW5kcywgZXRjICovCi19Ci0KLXZvaWQgeDg2ZW11X2luY19kZWNvZGVkX2luc3RfbGVuIChpbnQgeCkKLXsKLQlNLng4Ni5lbmNfcG9zICs9IHg7Ci19Ci0KLXZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYgKGNoYXIgKngpCi17Ci0Jc3ByaW50ZihNLng4Ni5kZWNvZGVkX2J1ZitNLng4Ni5lbmNfc3RyX3BvcywiJXMiLHgpOwotCU0ueDg2LmVuY19zdHJfcG9zICs9IHN0cmxlbih4KTsKLX0KLQotdm9pZCB4ODZlbXVfZGVjb2RlX3ByaW50ZjIgKGNoYXIgKngsIGludCB5KQotewotCWNoYXIgdGVtcFsxMDBdOwotCXNwcmludGYodGVtcCx4LHkpOwotCXNwcmludGYoTS54ODYuZGVjb2RlZF9idWYrTS54ODYuZW5jX3N0cl9wb3MsIiVzIix0ZW1wKTsKLQlNLng4Ni5lbmNfc3RyX3BvcyArPSBzdHJsZW4odGVtcCk7Ci19Ci0KLXZvaWQgeDg2ZW11X2VuZF9pbnN0ciAodm9pZCkKLXsKLQlNLng4Ni5lbmNfc3RyX3BvcyA9IDA7Ci0JTS54ODYuZW5jX3BvcyA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X2VuY29kZWRfYnl0ZXMgKHUxNiBzLCB1MTYgbykKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyIGJ1ZjFbNjRdOwotCWZvciAoaT0wOyBpPCBNLng4Ni5lbmNfcG9zOyBpKyspIHsKLQkJc3ByaW50ZihidWYxKzIqaSwiJTAyeCIsIGZldGNoX2RhdGFfYnl0ZV9hYnMocyxvK2kpKTsKLSAgICB9Ci0JcHJpbnRrKCIlLTIwcyIsYnVmMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24gKHZvaWQpCi17Ci0JcHJpbnRrKCIlcyIsIE0ueDg2LmRlY29kZWRfYnVmKTsKLX0KLQotdm9pZCB4ODZlbXVfcHJpbnRfaW50X3ZlY3QgKHUxNiBpdikKLXsKLQl1MTYgc2VnLG9mZjsKLQotCWlmIChpdiA+IDI1NikgcmV0dXJuOwotCXNlZyAgID0gZmV0Y2hfZGF0YV93b3JkX2FicygwLGl2KjQpOwotCW9mZiAgID0gZmV0Y2hfZGF0YV93b3JkX2FicygwLGl2KjQrMik7Ci0JcHJpbnRrKCIlMDR4OiUwNHggIiwgc2VnLCBvZmYpOwotfQotCi12b2lkIFg4NkVNVV9kdW1wX21lbW9yeSAodTE2IHNlZywgdTE2IG9mZiwgdTMyIGFtdCkKLXsKLSAgICB1MzIgc3RhcnQgPSBvZmYgJiAweGZmZmZmZmYwOwotICAgIHUzMiBlbmQgID0gKG9mZisxNikgJiAweGZmZmZmZmYwOwotICAgIHUzMiBpOwotICAgIHUzMiBjdXJyZW50OwotCi0gICAgY3VycmVudCA9IHN0YXJ0OwotICAgIHdoaWxlIChlbmQgPD0gb2ZmICsgYW10KSB7Ci0JcHJpbnRrKCIlMDR4OiUwNHggIiwgc2VnLCBzdGFydCk7Ci0JZm9yIChpPXN0YXJ0OyBpPCBvZmY7IGkrKykKLQkgICAgcHJpbnRrKCIgICAiKTsKLQlmb3IgKCAgICAgICA7IGk8IGVuZDsgaSsrKQotCSAgICBwcmludGsoIiUwMnggIiwgZmV0Y2hfZGF0YV9ieXRlX2FicyhzZWcsaSkpOwotCXByaW50aygiXG4iKTsKLQlzdGFydCA9IGVuZDsKLQllbmQgPSBzdGFydCArIDE2OwotICAgIH0KLX0KLQotdm9pZCB4ODZlbXVfc2luZ2xlX3N0ZXAgKHZvaWQpCi17Ci0gICAgY2hhciBzWzEwMjRdOwotICAgIGludCBwc1sxMF07Ci0gICAgaW50IG50b2s7Ci0gICAgaW50IGNtZDsKLSAgICBpbnQgZG9uZTsKLQkJaW50IHNlZ21lbnQ7Ci0gICAgaW50IG9mZnNldDsKLSAgICBzdGF0aWMgaW50IGJyZWFrcG9pbnQ7Ci0gICAgc3RhdGljIGludCBub0RlY29kZSA9IDE7Ci0KLSAgICBjaGFyICpwOwotCi0gICAgaWYgKERFQlVHX0JSRUFLKCkpIHsKLQlpZiAoTS54ODYuc2F2ZWRfaXAgIT0gYnJlYWtwb2ludCkgewotCSAgICByZXR1cm47Ci0JfSBlbHNlIHsKLQkgICAgTS54ODYuZGVidWcgJj0gfkRFQlVHX0RFQ09ERV9OT1BSSU5UX0Y7Ci0JICAgIE0ueDg2LmRlYnVnIHw9IERFQlVHX1RSQUNFX0Y7Ci0JICAgIE0ueDg2LmRlYnVnICY9IH5ERUJVR19CUkVBS19GOwotCSAgICBwcmludF9kZWNvZGVkX2luc3RydWN0aW9uICgpOwotCSAgICBYODZFTVVfdHJhY2VfcmVncygpOwotCX0KLSAgICB9Ci0KLSAgICBkb25lPTA7Ci0gICAgb2Zmc2V0ID0gTS54ODYuc2F2ZWRfaXA7Ci0gICAgd2hpbGUgKCFkb25lKSB7Ci0JcHJpbnRrKCItIik7Ci0JLypwID0gZmdldHMocywgMTAyMywgc3RkaW4pOyAqLwotCWNvbnNfZ2V0cyhzKTsKLQljbWQgPSBwYXJzZV9saW5lKHMsIHBzLCAmbnRvayk7Ci0Jc3dpdGNoKGNtZCkgewotCWNhc2UgJ3UnOgotCSAgICBkaXNhc3NlbWJsZV9mb3J3YXJkKE0ueDg2LnNhdmVkX2NzLCh1MTYpb2Zmc2V0LDEwKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICAgIGlmIChudG9rID09IDIpIHsKLQkJc2VnbWVudCA9IE0ueDg2LnNhdmVkX2NzOwotCQlvZmZzZXQgPSBwc1sxXTsKLQkJWDg2RU1VX2R1bXBfbWVtb3J5KHNlZ21lbnQsKHUxNilvZmZzZXQsMTYpOwotCQlvZmZzZXQgKz0gMTY7Ci0JICAgIH0gZWxzZSBpZiAobnRvayA9PSAzKSB7Ci0JCXNlZ21lbnQgPSBwc1sxXTsKLQkJb2Zmc2V0ID0gcHNbMl07Ci0JCVg4NkVNVV9kdW1wX21lbW9yeShzZWdtZW50LCh1MTYpb2Zmc2V0LDE2KTsKLQkJb2Zmc2V0ICs9IDE2OwotCSAgICB9IGVsc2UgewotCQlzZWdtZW50ID0gTS54ODYuc2F2ZWRfY3M7Ci0JCVg4NkVNVV9kdW1wX21lbW9yeShzZWdtZW50LCh1MTYpb2Zmc2V0LDE2KTsKLQkJb2Zmc2V0ICs9IDE2OwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgICBNLng4Ni5kZWJ1ZyBePSBERUJVR19UUkFDRUNBTExfRjsKLQkgICAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICAgIE0ueDg2LmRlYnVnIF49IERFQlVHX1NWQ19GIHwgREVCVUdfU1lTX0YgfCBERUJVR19TWVNJTlRfRjsKLQkgICAgYnJlYWs7Ci0JY2FzZSAncic6Ci0JICAgIFg4NkVNVV90cmFjZV9yZWdzKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgICBYODZFTVVfdHJhY2VfeHJlZ3MoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICAgIGlmIChudG9rID09IDIpIHsKLQkJYnJlYWtwb2ludCA9IHBzWzFdOwotCQlwcmludGsoImJyZWFrcG9pbnQgc2V0IHRvIDB4JVhcbiIsIGJyZWFrcG9pbnQpOwotCQlpZiAobm9EZWNvZGUpIHsKLQkJICAgIE0ueDg2LmRlYnVnIHw9IERFQlVHX0RFQ09ERV9OT1BSSU5UX0Y7Ci0JCX0gZWxzZSB7Ci0JCSAgICBNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfREVDT0RFX05PUFJJTlRfRjsKLQkJfQotCQlNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfVFJBQ0VfRjsKLQkJTS54ODYuZGVidWcgfD0gREVCVUdfQlJFQUtfRjsKLQkJZG9uZSA9IDE7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAncSc6Ci0JICAgIE0ueDg2LmRlYnVnIHw9IERFQlVHX0VYSVQ7Ci0JICAgIHJldHVybjsKLQljYXNlICdQJzoKLQkgICAgbm9EZWNvZGUgPSAobm9EZWNvZGUpPzA6MTsKLQkgICAgcHJpbnRrKCJUb2dnbGVkIGRlY29kaW5nIHRvICVzXG4iLChub0RlY29kZSk/IkZBTFNFIjoiVFJVRSIpOwotCSAgICBicmVhazsKLQljYXNlICd0JzoKLQljYXNlIDA6Ci0JICAgIGRvbmUgPSAxOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1pbnQgWDg2RU1VX3RyYWNlX29uKHZvaWQpCi17Ci0JcmV0dXJuIE0ueDg2LmRlYnVnIHw9IERFQlVHX1NURVBfRiB8IERFQlVHX0RFQ09ERV9GIHwgREVCVUdfVFJBQ0VfRjsKLX0KLQotaW50IFg4NkVNVV90cmFjZV9vZmYodm9pZCkKLXsKLQlyZXR1cm4gTS54ODYuZGVidWcgJj0gfihERUJVR19TVEVQX0YgfCBERUJVR19ERUNPREVfRiB8IERFQlVHX1RSQUNFX0YpOwotfQotCi1zdGF0aWMgaW50IHBhcnNlX2xpbmUgKGNoYXIgKnMsIGludCAqcHMsIGludCAqbikKLXsKLSAgICBpbnQgY21kOwotCi0gICAgKm4gPSAwOwotICAgIHdoaWxlKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSBzKys7Ci0gICAgcHNbKm5dID0gKnM7Ci0gICAgc3dpdGNoICgqcykgewotICAgICAgY2FzZSAnXG4nOgotCSpuICs9IDE7Ci0JcmV0dXJuIDA7Ci0gICAgICBkZWZhdWx0OgotCWNtZCA9ICpzOwotCSpuICs9IDE7Ci0gICAgfQotCi0Jd2hpbGUgKDEpIHsKLQkJd2hpbGUgKCpzICE9ICcgJyAmJiAqcyAhPSAnXHQnICYmICpzICE9ICdcbicpICBzKys7Ci0KLQkJaWYgKCpzID09ICdcbicpCi0JCQlyZXR1cm4gY21kOwotCi0JCXdoaWxlKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSBzKys7Ci0KLQkJcHNbKm5dPWF0b2kocyk7Ci0JCS8qc3NjYW5mKHMsIiV4IiwmcHNbKm5dKTsgKi8KLQkJKm4gKz0gMTsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi12b2lkIHg4NmVtdV9kdW1wX3N0YWNrKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgcHJpbnRrKCJTdGFjazogIik7Ci0gICAgZm9yIChpID0gMDsgaTwxNjsgaSsrKQotICAgIHsKLQl1OCB4ID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX1NTLCBNLng4Ni5SX1NQICsgaSk7Ci0JcHJpbnRrKCIlMDJ4ICIsIChpbnQpeCk7Ci0gICAgfQotICAgIHByaW50aygiXG4iKTsKLX0KLQotdm9pZCB4ODZlbXVfZHVtcF9yZWdzICh2b2lkKQotewotCXByaW50aygiXHRBWD0lMDR4ICAiLCBNLng4Ni5SX0FYICk7Ci0JcHJpbnRrKCJCWD0lMDR4ICAiLCBNLng4Ni5SX0JYICk7Ci0JcHJpbnRrKCJDWD0lMDR4ICAiLCBNLng4Ni5SX0NYICk7Ci0JcHJpbnRrKCJEWD0lMDR4ICAiLCBNLng4Ni5SX0RYICk7Ci0JcHJpbnRrKCJTUD0lMDR4ICAiLCBNLng4Ni5SX1NQICk7Ci0JcHJpbnRrKCJCUD0lMDR4ICAiLCBNLng4Ni5SX0JQICk7Ci0JcHJpbnRrKCJTST0lMDR4ICAiLCBNLng4Ni5SX1NJICk7Ci0JcHJpbnRrKCJEST0lMDR4XG4iLCBNLng4Ni5SX0RJICk7Ci0JcHJpbnRrKCJcdERTPSUwNHggICIsIE0ueDg2LlJfRFMgKTsKLQlwcmludGsoIkVTPSUwNHggICIsIE0ueDg2LlJfRVMgKTsKLQlwcmludGsoIlNTPSUwNHggICIsIE0ueDg2LlJfU1MgKTsKLQlwcmludGsoIkNTPSUwNHggICIsIE0ueDg2LlJfQ1MgKTsKLQlwcmludGsoIklQPSUwNHggICAiLCBNLng4Ni5SX0lQICk7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfT0YpKSAgICBwcmludGsoIk9WICIpOyAgICAgLyogQ0hFQ0tFRC4uLiAqLwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5WICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAgcHJpbnRrKCJETiAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJVUCAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9JRikpICAgIHByaW50aygiRUkgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiREkgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfU0YpKSAgICBwcmludGsoIk5HICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlBMICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX1pGKSkgICAgcHJpbnRrKCJaUiAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOWiAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9BRikpICAgIHByaW50aygiQUMgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTkEgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfUEYpKSAgICBwcmludGsoIlBFICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlBPICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgICAgcHJpbnRrKCJDWSAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOQyAiKTsKLQlwcmludGsoIlxuIik7Ci0JLyp4ODZlbXVfZHVtcF9zdGFjaygpOyAqLwotfQotCi12b2lkIHg4NmVtdV9kdW1wX3hyZWdzICh2b2lkKQotewotCXByaW50aygiXHRFQVg9JTA4eCAgIiwgTS54ODYuUl9FQVggKTsKLQlwcmludGsoIkVCWD0lMDh4ICAiLCBNLng4Ni5SX0VCWCApOwotCXByaW50aygiRUNYPSUwOHggICIsIE0ueDg2LlJfRUNYICk7Ci0JcHJpbnRrKCJFRFg9JTA4eCAgXG4iLCBNLng4Ni5SX0VEWCApOwotCXByaW50aygiXHRFU1A9JTA4eCAgIiwgTS54ODYuUl9FU1AgKTsKLQlwcmludGsoIkVCUD0lMDh4ICAiLCBNLng4Ni5SX0VCUCApOwotCXByaW50aygiRVNJPSUwOHggICIsIE0ueDg2LlJfRVNJICk7Ci0JcHJpbnRrKCJFREk9JTA4eFxuIiwgTS54ODYuUl9FREkgKTsKLQlwcmludGsoIlx0RFM9JTA0eCAgIiwgTS54ODYuUl9EUyApOwotCXByaW50aygiRVM9JTA0eCAgIiwgTS54ODYuUl9FUyApOwotCXByaW50aygiU1M9JTA0eCAgIiwgTS54ODYuUl9TUyApOwotCXByaW50aygiQ1M9JTA0eCAgIiwgTS54ODYuUl9DUyApOwotCXByaW50aygiRUlQPSUwOHhcblx0IiwgTS54ODYuUl9FSVAgKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9PRikpICAgIHByaW50aygiT1YgIik7ICAgICAvKiBDSEVDS0VELi4uICovCi0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTlYgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgICBwcmludGsoIkROICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlVQICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0lGKSkgICAgcHJpbnRrKCJFSSAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJESSAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9TRikpICAgIHByaW50aygiTkcgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiUEwgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfWkYpKSAgICBwcmludGsoIlpSICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5aICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0FGKSkgICAgcHJpbnRrKCJBQyAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOQSAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9QRikpICAgIHByaW50aygiUEUgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiUE8gIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSAgICBwcmludGsoIkNZICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5DICIpOwotCXByaW50aygiXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9kZWNvZGUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9kZWNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyYjFmNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8KLSoJCQkJaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgYW5kIGFjY2Vzc2VzcyBvZiBpbW1lZGlhdGUgZGF0YSB2aWEgSVAuICBldGMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIGFueSBwZW5kaW5nIGFzeWNocm9ub3VzIGludGVycnVwdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgeDg2ZW11X2ludHJfaGFuZGxlKHZvaWQpCi17Ci0JdTgJaW50bm87Ci0KLQlpZiAoTS54ODYuaW50ciAmIElOVFJfU1lOQ0gpIHsKLQkJaW50bm8gPSBNLng4Ni5pbnRubzsKLQkJaWYgKF9YODZFTVVfaW50clRhYltpbnRub10pIHsKLQkJCSgqX1g4NkVNVV9pbnRyVGFiW2ludG5vXSkoaW50bm8pOwotCQl9IGVsc2UgewotCQkJcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOwotCQkJQ0xFQVJfRkxBRyhGX0lGKTsKLQkJCUNMRUFSX0ZMQUcoRl9URik7Ci0JCQlwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0JCQlNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKGludG5vICogNCArIDIpOwotCQkJcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCQkJTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZChpbnRubyAqIDQpOwotCQkJTS54ODYuaW50ciA9IDA7Ci0JCX0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW50cm51bSAtIEludGVycnVwdCBudW1iZXIgdG8gcmFpc2UKLQotUkVNQVJLUzoKLVJhaXNlIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHRvIGJlIGhhbmRsZWQgYmVmb3JlIHRoZSBleGVjdXRpb24gb2YgdGhlCi1uZXh0IGluc3RydWN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11X2ludHJfcmFpc2UoCi0JdTggaW50cm51bSkKLXsKLQlNLng4Ni5pbnRubyA9IGludHJudW07Ci0JTS54ODYuaW50ciB8PSBJTlRSX1NZTkNIOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1haW4gZXhlY3V0aW9uIGxvb3AgZm9yIHRoZSBlbXVsYXRvci4gV2UgcmV0dXJuIGZyb20gaGVyZSB3aGVuIHRoZSBzeXN0ZW0KLWhhbHRzLCB3aGljaCBpcyBub3JtYWxseSBjYXVzZWQgYnkgYSBzdGFjayBmYXVsdCB3aGVuIHdlIHJldHVybiBmcm9tIHRoZQotb3JpZ2luYWwgcmVhbCBtb2RlIGNhbGwuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZFTVVfZXhlYyh2b2lkKQotewotICAgIHU4IG9wMTsKLQotICAgIE0ueDg2LmludHIgPSAwOwotICAgIERCKHg4NmVtdV9lbmRfaW5zdHIoKTspCi0KLSAgICBmb3IgKDs7KSB7Ci0JREIoaWYgKENIRUNLX0lQX0ZFVENIKCkpIHg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCi0JLyogSWYgZGVidWdnaW5nLCBzYXZlIHRoZSBJUCBhbmQgQ1MgdmFsdWVzLiAqLwotCVNBVkVfSVBfQ1MoTS54ODYuUl9DUywgTS54ODYuUl9JUCk7Ci0JSU5DX0RFQ09ERURfSU5TVF9MRU4oMSk7Ci0JaWYgKE0ueDg2LmludHIpIHsKLQkgICAgaWYgKE0ueDg2LmludHIgJiBJTlRSX0hBTFRFRCkgewotCQlEQigJcHJpbnRrKCJoYWx0ZWRcbiIpOyBYODZFTVVfdHJhY2VfcmVncygpOykKLQkJICAgIHJldHVybjsKLQkgICAgfQotCSAgICBpZiAoKChNLng4Ni5pbnRyICYgSU5UUl9TWU5DSCkgJiYgKE0ueDg2LmludG5vID09IDAgfHwgTS54ODYuaW50bm8gPT0gMikpIHx8Ci0JCSFBQ0NFU1NfRkxBRyhGX0lGKSkgewotCQl4ODZlbXVfaW50cl9oYW5kbGUoKTsKLQkgICAgfQotCX0KLQlvcDEgPSAoKnN5c19yZGIpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7Ci0JKCp4ODZlbXVfb3B0YWJbb3AxXSkob3AxKTsKLQlpZiAoTS54ODYuZGVidWcgJiBERUJVR19FWElUKSB7Ci0JICAgIE0ueDg2LmRlYnVnICY9IH5ERUJVR19FWElUOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYWx0cyB0aGUgc3lzdGVtIGJ5IHNldHRpbmcgdGhlIGhhbHRlZCBzeXN0ZW0gZmxhZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkVNVV9oYWx0X3N5cyh2b2lkKQotewotCU0ueDg2LmludHIgfD0gSU5UUl9IQUxURUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW9kCQktIE1vZCB2YWx1ZSBmcm9tIGRlY29kZWQgYnl0ZQotcmVnaAktIFJlZyBoIHZhbHVlIGZyb20gZGVjb2RlZCBieXRlCi1yZWdsCS0gUmVnIGwgdmFsdWUgZnJvbSBkZWNvZGVkIGJ5dGUKLQotUkVNQVJLUzoKLVJhaXNlIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHRvIGJlIGhhbmRsZWQgYmVmb3JlIHRoZSBleGVjdXRpb24gb2YgdGhlCi1uZXh0IGluc3RydWN0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24sIGFzICgqc3lzX3JkYikgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBmZXRjaF9kZWNvZGVfbW9kcm0oCi0JaW50ICptb2QsCi0JaW50ICpyZWdoLAotCWludCAqcmVnbCkKLXsKLQlpbnQgZmV0Y2hlZDsKLQotREIoCWlmIChDSEVDS19JUF9GRVRDSCgpKQotCSAgeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKLQlmZXRjaGVkID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOwotCUlOQ19ERUNPREVEX0lOU1RfTEVOKDEpOwotCSptb2QgID0gKGZldGNoZWQgPj4gNikgJiAweDAzOwotCSpyZWdoID0gKGZldGNoZWQgPj4gMykgJiAweDA3OwotICAgICpyZWdsID0gKGZldGNoZWQgPj4gMCkgJiAweDA3OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLUltbWVkaWF0ZSBieXRlIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCi1tb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZGIpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGZldGNoX2J5dGVfaW1tKHZvaWQpCi17Ci0JdTggZmV0Y2hlZDsKLQotREIoCWlmIChDSEVDS19JUF9GRVRDSCgpKQotCQl4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQotCWZldGNoZWQgPSAoKnN5c19yZGIpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7Ci0JSU5DX0RFQ09ERURfSU5TVF9MRU4oMSk7Ci0JcmV0dXJuIGZldGNoZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotSW1tZWRpYXRlIHdvcmQgdmFsdWUgcmVhZCBmcm9tIGluc3RydWN0aW9uIHF1ZXVlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGltbWVkaWF0ZSBieXRlIGZyb20gdGhlIGluc3RydWN0aW9uIHF1ZXVlLCBhbmQKLW1vdmVzIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIHRoZSBuZXh0IHZhbHVlLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24sIGFzICgqc3lzX3JkdykgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGZldGNoX3dvcmRfaW1tKHZvaWQpCi17Ci0JdTE2CWZldGNoZWQ7Ci0KLURCKAlpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKLQkJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKLQlmZXRjaGVkID0gKCpzeXNfcmR3KSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVApKTsKLQlNLng4Ni5SX0lQICs9IDI7Ci0JSU5DX0RFQ09ERURfSU5TVF9MRU4oMik7Ci0JcmV0dXJuIGZldGNoZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotSW1tZWRpYXRlIGxvbmUgdmFsdWUgcmVhZCBmcm9tIGluc3RydWN0aW9uIHF1ZXVlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGltbWVkaWF0ZSBieXRlIGZyb20gdGhlIGluc3RydWN0aW9uIHF1ZXVlLCBhbmQKLW1vdmVzIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIHRoZSBuZXh0IHZhbHVlLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24sIGFzICgqc3lzX3JkdykgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGZldGNoX2xvbmdfaW1tKHZvaWQpCi17Ci0JdTMyIGZldGNoZWQ7Ci0KLURCKAlpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKLQkgIHg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCi0JZmV0Y2hlZCA9ICgqc3lzX3JkbCkoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKSk7Ci0JTS54ODYuUl9JUCArPSA0OwotCUlOQ19ERUNPREVEX0lOU1RfTEVOKDQpOwotCXJldHVybiBmZXRjaGVkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVZhbHVlIG9mIHRoZSBkZWZhdWx0IGRhdGEgc2VnbWVudAotCi1SRU1BUktTOgotSW5saW5lIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZGVmYXVsdCBkYXRhIHNlZ21lbnQgZm9yIHRoZSBjdXJyZW50Ci1pbnN0cnVjdGlvbi4KLQotT24gdGhlIHg4NiBwcm9jZXNzb3IsIHRoZSBkZWZhdWx0IHNlZ21lbnQgaXMgbm90IGFsd2F5cyBEUyBpZiB0aGVyZSBpcwotbm8gc2VnbWVudCBvdmVycmlkZS4gQWRkcmVzcyBtb2RlcyBzdWNoIGFzIC0zW0JQXSBvciAxMFtCUCtTSV0gYWxsIHJlZmVyIHRvCi1hZGRyZXNzZXMgcmVsYXRpdmUgdG8gU1MgKGllOiBvbiB0aGUgc3RhY2spLiBTbywgYXQgdGhlIG1pbmltdW0sIGFsbAotZGVjb2RpbmdzIG9mIGFkZHJlc3NpbmcgbW9kZXMgd291bGQgaGF2ZSB0byBzZXQvY2xlYXIgYSBiaXQgZGVzY3JpYmluZwotd2hldGhlciB0aGUgYWNjZXNzIGlzIHJlbGF0aXZlIHRvIERTIG9yIFNTLiAgVGhhdCBpcyB0aGUgZnVuY3Rpb24gb2YgdGhlCi1jcHUtc3RhdGUtdmFyaWJsZSBNLng4Ni5tb2RlLiBUaGVyZSBhcmUgc2V2ZXJhbCBwb3RlbnRpYWwgc3RhdGVzOgotCi0JcmVwZSBwcmVmaXggc2VlbiAgKGhhbmRsZWQgZWxzZXdoZXJlKQotCXJlcG5lIHByZWZpeCBzZWVuICAoZGl0dG8pCi0KLQljcyBzZWdtZW50IG92ZXJyaWRlCi0JZHMgc2VnbWVudCBvdmVycmlkZQotCWVzIHNlZ21lbnQgb3ZlcnJpZGUKLQlmcyBzZWdtZW50IG92ZXJyaWRlCi0JZ3Mgc2VnbWVudCBvdmVycmlkZQotCXNzIHNlZ21lbnQgb3ZlcnJpZGUKLQotCWRzL3NzIHNlbGVjdCAoaW4gYWJzZW5zZSBvZiBvdmVycmlkZSkKLQotRWFjaCBvZiB0aGUgYWJvdmUgNyBpdGVtcyBhcmUgaGFuZGxlZCB3aXRoIGEgYml0IGluIHRoZSBtb2RlIGZpZWxkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9JTkxJTkUgdTMyIGdldF9kYXRhX3NlZ21lbnQodm9pZCkKLXsKLSNkZWZpbmUJR0VUX1NFR01FTlQoc2VnbWVudCkKLQlzd2l0Y2ggKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1NFR01BU0spIHsKLQkgIGNhc2UgMDoJCQkJCS8qIGRlZmF1bHQgY2FzZTogdXNlIGRzIHJlZ2lzdGVyICovCi0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0RTOgotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9EUyB8IFNZU01PREVfU0VHX0RTX1NTOgotCQlyZXR1cm4gIE0ueDg2LlJfRFM7Ci0JICBjYXNlIFNZU01PREVfU0VHX0RTX1NTOgkvKiBub24tb3ZlcnJpZGRlbiwgdXNlIHNzIHJlZ2lzdGVyICovCi0JCXJldHVybiAgTS54ODYuUl9TUzsKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfQ1M6Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0NTIHwgU1lTTU9ERV9TRUdfRFNfU1M6Ci0JCXJldHVybiAgTS54ODYuUl9DUzsKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRVM6Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0VTIHwgU1lTTU9ERV9TRUdfRFNfU1M6Ci0JCXJldHVybiAgTS54ODYuUl9FUzsKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRlM6Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0ZTIHwgU1lTTU9ERV9TRUdfRFNfU1M6Ci0JCXJldHVybiAgTS54ODYuUl9GUzsKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfR1M6Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0dTIHwgU1lTTU9ERV9TRUdfRFNfU1M6Ci0JCXJldHVybiAgTS54ODYuUl9HUzsKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfU1M6Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX1NTIHwgU1lTTU9ERV9TRUdfRFNfU1M6Ci0JCXJldHVybiAgTS54ODYuUl9TUzsKLQkgIGRlZmF1bHQ6Ci0jaWZkZWYJREVCVUcKLQkJcHJpbnRrKCJlcnJvcjogc2hvdWxkIG5vdCBoYXBwZW46ICBtdWx0aXBsZSBvdmVycmlkZXMuXG4iKTsKLSNlbmRpZgotCQlIQUxUX1NZUygpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCi0KLVJFVFVSTlM6Ci1CeXRlIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBmZXRjaF9kYXRhX2J5dGUoCi0JdWludCBvZmZzZXQpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOwotI2VuZGlmCi0JcmV0dXJuICgqc3lzX3JkYikoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCi0KLVJFVFVSTlM6Ci1Xb3JkIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgZmV0Y2hfZGF0YV93b3JkKAotCXVpbnQgb2Zmc2V0KQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcygodTE2KWdldF9kYXRhX3NlZ21lbnQoKSwgb2Zmc2V0KTsKLSNlbmRpZgotCXJldHVybiAoKnN5c19yZHcpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQotCi1SRVRVUk5TOgotTG9uZyB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGZldGNoX2RhdGFfbG9uZygKLQl1aW50IG9mZnNldCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7Ci0jZW5kaWYKLQlyZXR1cm4gKCpzeXNfcmRsKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zZWdtZW50CS0gU2VnbWVudCB0byBsb2FkIGRhdGEgZnJvbQotb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCi0KLVJFVFVSTlM6Ci1CeXRlIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBmZXRjaF9kYXRhX2J5dGVfYWJzKAotCXVpbnQgc2VnbWVudCwKLQl1aW50IG9mZnNldCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKLSNlbmRpZgotCXJldHVybiAoKnN5c19yZGIpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNlZ21lbnQJLSBTZWdtZW50IHRvIGxvYWQgZGF0YSBmcm9tCi1vZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KLQotUkVUVVJOUzoKLVdvcmQgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBmZXRjaF9kYXRhX3dvcmRfYWJzKAotCXVpbnQgc2VnbWVudCwKLQl1aW50IG9mZnNldCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKLSNlbmRpZgotCXJldHVybiAoKnN5c19yZHcpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNlZ21lbnQJLSBTZWdtZW50IHRvIGxvYWQgZGF0YSBmcm9tCi1vZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KLQotUkVUVVJOUzoKLUxvbmcgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBmZXRjaF9kYXRhX2xvbmdfYWJzKAotCXVpbnQgc2VnbWVudCwKLQl1aW50IG9mZnNldCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKLSNlbmRpZgotCXJldHVybiAoKnN5c19yZGwpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Ci12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIHdvcmQgdmFsdWUgdG8gYW4gc2VnbWVudGVkIG1lbW9yeSBsb2NhdGlvbi4gVGhlIHNlZ21lbnQgdXNlZCBpcwotdGhlIGN1cnJlbnQgJ2RlZmF1bHQnIHNlZ21lbnQsIHdoaWNoIG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzdG9yZV9kYXRhX2J5dGUoCi0JdWludCBvZmZzZXQsCi0JdTggdmFsKQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcygodTE2KWdldF9kYXRhX3NlZ21lbnQoKSwgb2Zmc2V0KTsKLSNlbmRpZgotCSgqc3lzX3dyYikoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCwgdmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGFuIHNlZ21lbnRlZCBtZW1vcnkgbG9jYXRpb24uIFRoZSBzZWdtZW50IHVzZWQgaXMKLXRoZSBjdXJyZW50ICdkZWZhdWx0JyBzZWdtZW50LCB3aGljaCBtYXkgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc3RvcmVfZGF0YV93b3JkKAotCXVpbnQgb2Zmc2V0LAotCXUxNiB2YWwpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOwotI2VuZGlmCi0JKCpzeXNfd3J3KSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Ci12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGxvbmcgdmFsdWUgdG8gYW4gc2VnbWVudGVkIG1lbW9yeSBsb2NhdGlvbi4gVGhlIHNlZ21lbnQgdXNlZCBpcwotdGhlIGN1cnJlbnQgJ2RlZmF1bHQnIHNlZ21lbnQsIHdoaWNoIG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzdG9yZV9kYXRhX2xvbmcoCi0JdWludCBvZmZzZXQsCi0JdTMyIHZhbCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7Ci0jZW5kaWYKLQkoKnN5c193cmwpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2VnbWVudAktIFNlZ21lbnQgdG8gc3RvcmUgZGF0YSBhdAotb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgYnl0ZSB2YWx1ZSB0byBhbiBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc3RvcmVfZGF0YV9ieXRlX2FicygKLQl1aW50IHNlZ21lbnQsCi0JdWludCBvZmZzZXQsCi0JdTggdmFsKQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOwotI2VuZGlmCi0JKCpzeXNfd3JiKSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0LCB2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNlZ21lbnQJLSBTZWdtZW50IHRvIHN0b3JlIGRhdGEgYXQKLW9mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Ci12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIHdvcmQgdmFsdWUgdG8gYW4gYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHN0b3JlX2RhdGFfd29yZF9hYnMoCi0JdWludCBzZWdtZW50LAotCXVpbnQgb2Zmc2V0LAotCXUxNiB2YWwpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7Ci0jZW5kaWYKLQkoKnN5c193cncpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2VnbWVudAktIFNlZ21lbnQgdG8gc3RvcmUgZGF0YSBhdAotb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgbG9uZyB2YWx1ZSB0byBhbiBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc3RvcmVfZGF0YV9sb25nX2FicygKLQl1aW50IHNlZ21lbnQsCi0JdWludCBvZmZzZXQsCi0JdTMyIHZhbCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKLSNlbmRpZgotCSgqc3lzX3dybCkoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCwgdmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcJLSBSZWdpc3RlciB0byBkZWNvZGUKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKLW1vZHJtIGJ5dGUsIGZvciBieXRlIG9wZXJhbmRzLiBBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCogZGVjb2RlX3JtX2J5dGVfcmVnaXN0ZXIoCi0JaW50IHJlZykKLXsKLQlzd2l0Y2ggKHJlZykgewotICAgICAgY2FzZSAwOgotCQlERUNPREVfUFJJTlRGKCJBTCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQUw7Ci0JICBjYXNlIDE6Ci0JCURFQ09ERV9QUklOVEYoIkNMIik7Ci0JCXJldHVybiAmTS54ODYuUl9DTDsKLQkgIGNhc2UgMjoKLQkJREVDT0RFX1BSSU5URigiREwiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0RMOwotCSAgY2FzZSAzOgotCQlERUNPREVfUFJJTlRGKCJCTCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQkw7Ci0JICBjYXNlIDQ6Ci0JCURFQ09ERV9QUklOVEYoIkFIIik7Ci0JCXJldHVybiAmTS54ODYuUl9BSDsKLQkgIGNhc2UgNToKLQkJREVDT0RFX1BSSU5URigiQ0giKTsKLQkJcmV0dXJuICZNLng4Ni5SX0NIOwotCSAgY2FzZSA2OgotCQlERUNPREVfUFJJTlRGKCJESCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfREg7Ci0JICBjYXNlIDc6Ci0JCURFQ09ERV9QUklOVEYoIkJIIik7Ci0JCXJldHVybiAmTS54ODYuUl9CSDsKLQl9Ci0JSEFMVF9TWVMoKTsKLQlyZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogTk9UIFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZwktIFJlZ2lzdGVyIHRvIGRlY29kZQotCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIGdpdmVuIGJ5IHRoZSBSL1JNIGZpZWxkIG9mIHRoZQotbW9kcm0gYnl0ZSwgZm9yIHdvcmQgb3BlcmFuZHMuICBBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYqIGRlY29kZV9ybV93b3JkX3JlZ2lzdGVyKAotCWludCByZWcpCi17Ci0Jc3dpdGNoIChyZWcpIHsKLQkgIGNhc2UgMDoKLQkJREVDT0RFX1BSSU5URigiQVgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0FYOwotCSAgY2FzZSAxOgotCQlERUNPREVfUFJJTlRGKCJDWCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQ1g7Ci0JICBjYXNlIDI6Ci0JCURFQ09ERV9QUklOVEYoIkRYIik7Ci0JCXJldHVybiAmTS54ODYuUl9EWDsKLQkgIGNhc2UgMzoKLQkJREVDT0RFX1BSSU5URigiQlgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0JYOwotCSAgY2FzZSA0OgotCQlERUNPREVfUFJJTlRGKCJTUCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfU1A7Ci0JICBjYXNlIDU6Ci0JCURFQ09ERV9QUklOVEYoIkJQIik7Ci0JCXJldHVybiAmTS54ODYuUl9CUDsKLQkgIGNhc2UgNjoKLQkJREVDT0RFX1BSSU5URigiU0kiKTsKLQkJcmV0dXJuICZNLng4Ni5SX1NJOwotCSAgY2FzZSA3OgotCQlERUNPREVfUFJJTlRGKCJESSIpOwotCQlyZXR1cm4gJk0ueDg2LlJfREk7Ci0JfQotCUhBTFRfU1lTKCk7Ci0gICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIE5PVFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZwktIFJlZ2lzdGVyIHRvIGRlY29kZQotCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIGdpdmVuIGJ5IHRoZSBSL1JNIGZpZWxkIG9mIHRoZQotbW9kcm0gYnl0ZSwgZm9yIGR3b3JkIG9wZXJhbmRzLiAgQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyKiBkZWNvZGVfcm1fbG9uZ19yZWdpc3RlcigKLQlpbnQgcmVnKQotewotICAgIHN3aXRjaCAocmVnKSB7Ci0gICAgICBjYXNlIDA6Ci0JCURFQ09ERV9QUklOVEYoIkVBWCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRUFYOwotCSAgY2FzZSAxOgotCQlERUNPREVfUFJJTlRGKCJFQ1giKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VDWDsKLQkgIGNhc2UgMjoKLQkJREVDT0RFX1BSSU5URigiRURYIik7Ci0JCXJldHVybiAmTS54ODYuUl9FRFg7Ci0JICBjYXNlIDM6Ci0JCURFQ09ERV9QUklOVEYoIkVCWCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRUJYOwotCSAgY2FzZSA0OgotCQlERUNPREVfUFJJTlRGKCJFU1AiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VTUDsKLQkgIGNhc2UgNToKLQkJREVDT0RFX1BSSU5URigiRUJQIik7Ci0JCXJldHVybiAmTS54ODYuUl9FQlA7Ci0JICBjYXNlIDY6Ci0JCURFQ09ERV9QUklOVEYoIkVTSSIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRVNJOwotCSAgY2FzZSA3OgotCQlERUNPREVfUFJJTlRGKCJFREkiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VESTsKLQl9Ci0JSEFMVF9TWVMoKTsKLSAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogTk9UUkVBQ0hFRCBPUiBSRUFDSEVEIE9OIEVSUk9SICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnCS0gUmVnaXN0ZXIgdG8gZGVjb2RlCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgotCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCi1tb2RybSBieXRlLCBmb3Igd29yZCBvcGVyYW5kcywgbW9kaWZpZWQgZnJvbSBhYm92ZSBmb3IgdGhlIHdlaXJkbwotc3BlY2lhbCBjYXNlIG9mIHNlZ3JlZyBvcGVyYW5kcy4gIEFsc28gZW5hYmxlcyB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiogZGVjb2RlX3JtX3NlZ19yZWdpc3RlcigKLQlpbnQgcmVnKQotewotCXN3aXRjaCAocmVnKSB7Ci0JICBjYXNlIDA6Ci0JCURFQ09ERV9QUklOVEYoIkVTIik7Ci0JCXJldHVybiAmTS54ODYuUl9FUzsKLQkgIGNhc2UgMToKLQkJREVDT0RFX1BSSU5URigiQ1MiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0NTOwotCSAgY2FzZSAyOgotCQlERUNPREVfUFJJTlRGKCJTUyIpOwotCQlyZXR1cm4gJk0ueDg2LlJfU1M7Ci0JICBjYXNlIDM6Ci0JCURFQ09ERV9QUklOVEYoIkRTIik7Ci0JCXJldHVybiAmTS54ODYuUl9EUzsKLQkgIGNhc2UgNDoKLQkgIGNhc2UgNToKLQkgIGNhc2UgNjoKLQkgIGNhc2UgNzoKLQkJREVDT0RFX1BSSU5URigiSUxMRUdBTCBTRUdSRUciKTsKLQkJYnJlYWs7Ci0JfQotCUhBTFRfU1lTKCk7Ci0JcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1ybQktIFJNIHZhbHVlIHRvIGRlY29kZQotCi1SRVRVUk5TOgotT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcKLQotUkVNQVJLUzoKLVJldHVybiB0aGUgb2Zmc2V0IGdpdmVuIGJ5IG1vZD0wMCBhZGRyZXNzaW5nLiAgQWxzbyBlbmFibGVzIHRoZQotZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgotCi1OT1RFOiAJVGhlIGNvZGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgKGRzIHZzIHNzKQotCQliZWxvdyBpbiB0aGUgY2FzZSBvZiBbQlArLi5dLiAgVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGF0IHRoZQotCQlwb2ludCB0aGF0IHRoaXMgc3Vicm91dGluZSBpcyBjYWxsZWQsIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0bwotCQlTWVNNT0RFX1NFR19EU19TUyB3aWxsIGJlIHplcm8uICBBZnRlciBldmVyeSBpbnN0cnVjdGlvbgotCQlleGNlcHQgdGhlIHNlZ21lbnQgb3ZlcnJpZGUgaW5zdHJ1Y3Rpb25zLCB0aGlzIGJpdCAoYXMgd2VsbAotCQlhcyBhbnkgYml0cyBpbmRpY2F0aW5nIHNlZ21lbnQgb3ZlcnJpZGVzKSB3aWxsIGJlIGNsZWFyLiAgU28KLQkJaWYgYSBTUyBhY2Nlc3MgaXMgbmVlZGVkLCBzZXQgdGhpcyBiaXQuICBPdGhlcndpc2UsIERTIGFjY2VzcwotCQlvY2N1cnMgKHVubGVzcyBhbnkgb2YgdGhlIHNlZ21lbnQgb3ZlcnJpZGUgYml0cyBhcmUgc2V0KS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBkZWNvZGVfcm0wMF9hZGRyZXNzKAotCWludCBybSkKLXsKLQl1bnNpZ25lZCBvZmZzZXQ7Ci0KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0FERFIpCi0JewotCSAgICBzd2l0Y2ggKHJtKSB7Ci0JICAgIGNhc2UgMDoKLQkJREVDT0RFX1BSSU5URigiW0VBWF0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfRUFYOwotCSAgICBjYXNlIDE6Ci0JCURFQ09ERV9QUklOVEYoIltFQ1hdIik7Ci0JCXJldHVybiBNLng4Ni5SX0VDWDsKLQkgICAgY2FzZSAyOgotCQlERUNPREVfUFJJTlRGKCJbRURYXSIpOwotLyoJCU0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7ICovCi0JCXJldHVybiBNLng4Ni5SX0VEWDsKLQkgICAgY2FzZSAzOgotCQlERUNPREVfUFJJTlRGKCJbRUJYXSIpOwotLyoJCU0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7ICovCi0JCXJldHVybiBNLng4Ni5SX0VCWDsKLQkgICAgY2FzZSA0OgotCQlwcmludGsoIlVuc3VwcG9ydGVkIFNJQiBlbmNvZGluZ1xuIik7Ci0JCUhBTFRfU1lTKCk7Ci0JCXJldHVybiAwOwotCSAgICBjYXNlIDU6Ci0JCW9mZnNldCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCJbJTA4eF0iLCBvZmZzZXQpOwotCQlyZXR1cm4gb2Zmc2V0OwotCSAgICBjYXNlIDY6Ci0JCURFQ09ERV9QUklOVEYoIltFU0ldIik7Ci0JCXJldHVybiBNLng4Ni5SX0VTSTsKLQkgICAgY2FzZSA3OgotCQlERUNPREVfUFJJTlRGKCJbRURJXSIpOwotCQlyZXR1cm4gTS54ODYuUl9FREk7Ci0JICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkgICAgc3dpdGNoIChybSkgewotCSAgICBjYXNlIDA6Ci0JCURFQ09ERV9QUklOVEYoIltCWCtTSV0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJOwotCSAgICBjYXNlIDE6Ci0JCURFQ09ERV9QUklOVEYoIltCWCtESV0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfQlggKyBNLng4Ni5SX0RJOwotCSAgICBjYXNlIDI6Ci0JCURFQ09ERV9QUklOVEYoIltCUCtTSV0iKTsKLQkJTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKLQkJcmV0dXJuIE0ueDg2LlJfQlAgKyBNLng4Ni5SX1NJOwotCSAgICBjYXNlIDM6Ci0JCURFQ09ERV9QUklOVEYoIltCUCtESV0iKTsKLQkJTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKLQkJcmV0dXJuIE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJOwotCSAgICBjYXNlIDQ6Ci0JCURFQ09ERV9QUklOVEYoIltTSV0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfU0k7Ci0JICAgIGNhc2UgNToKLQkJREVDT0RFX1BSSU5URigiW0RJXSIpOwotCQlyZXR1cm4gTS54ODYuUl9ESTsKLQkgICAgY2FzZSA2OgotCQlvZmZzZXQgPSBmZXRjaF93b3JkX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiWyUwNHhdIiwgb2Zmc2V0KTsKLQkJcmV0dXJuIG9mZnNldDsKLQkgICAgY2FzZSA3OgotCQlERUNPREVfUFJJTlRGKCJbQlhdIik7Ci0JCXJldHVybiBNLng4Ni5SX0JYOwotCSAgICB9Ci0JfQotCUhBTFRfU1lTKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcm0JLSBSTSB2YWx1ZSB0byBkZWNvZGUKLQotUkVUVVJOUzoKLU9mZnNldCBpbiBtZW1vcnkgZm9yIHRoZSBhZGRyZXNzIGRlY29kaW5nCi0KLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSBtb2Q9MDEgYWRkcmVzc2luZy4gIEFsc28gZW5hYmxlcyB0aGUKLWRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBkZWNvZGVfcm0wMV9hZGRyZXNzKAotCWludCBybSkKLXsKLSAgICBpbnQgZGlzcGxhY2VtZW50ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9BRERSKQotICAgIHsKLQlzd2l0Y2ggKHJtKQotCXsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQVh9IiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRUFYICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VDWF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FQ1ggKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRURYXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VEWCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQlhdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRUJYICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNDoKLQkgICAgcHJpbnRrKCJVbnN1cHBvcnRlZCBTSUIgYWRkcmVzc2luZyBtb2RlXG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgcmV0dXJuIDA7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJQXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFU0ldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRVNJICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VESV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FREkgKyBkaXNwbGFjZW1lbnQ7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXN3aXRjaCAocm0pIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtTSV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9CWCArIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlgrREldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfQlggKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQK1NJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7Ci0JICAgIHJldHVybiBNLng4Ni5SX0JQICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudDsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtESV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOwotCSAgICByZXR1cm4gTS54ODYuUl9CUCArIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbU0ldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbREldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlBdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKLQkgICAgcmV0dXJuIE0ueDg2LlJfQlAgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlhdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfQlggKyBkaXNwbGFjZW1lbnQ7Ci0JfQotCUhBTFRfU1lTKCk7Ci0gICAgfQotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiBTSE9VTEQgTk9UIEhBUFBFTiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJtCS0gUk0gdmFsdWUgdG8gZGVjb2RlCi0KLVJFVFVSTlM6Ci1PZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZwotCi1SRU1BUktTOgotUmV0dXJuIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgbW9kPTEwIGFkZHJlc3NpbmcuICBBbHNvIGVuYWJsZXMgdGhlCi1kZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgZGVjb2RlX3JtMTBfYWRkcmVzcygKLQlpbnQgcm0pCi17Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9BRERSKQotICAgIHsKLQlpbnQgZGlzcGxhY2VtZW50ID0gKHMzMilmZXRjaF9sb25nX2ltbSgpOwotCXN3aXRjaCAocm0pCi0JewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VBWH0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FQVggKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUNYXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VDWCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFRFhdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRURYICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VCWF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FQlggKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA0OgotCSAgICBwcmludGsoIlVuc3VwcG9ydGVkIFNJQiBhZGRyZXNzaW5nIG1vZGVcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICByZXR1cm4gMDsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQlBdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRUJQICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VTSV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FU0kgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRURJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VESSArIGRpc3BsYWNlbWVudDsKLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JaW50IGRpc3BsYWNlbWVudCA9IChzMTYpZmV0Y2hfd29yZF9pbW0oKTsKLQlzd2l0Y2ggKHJtKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlgrU0ldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlgrREldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArU0ldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKLQkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArREldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKLQkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbU0ldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIChNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtESV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gKE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7Ci0JICAgIHJldHVybiAoTS54ODYuUl9CUCArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlhdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKLQl9Ci0gICAgfQotICAgIEhBTFRfU1lTKCk7Ci0gICAgcmV0dXJuIDA7Ci0gICAgLypOT1RSRUFDSEVEICovCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZnB1LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZnB1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2MzNDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2ZwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGltcGxlbWVudCB0aGUgZGVjb2RpbmcgYW5kCi0qICAgICAgICAgICAgICAgZW11bGF0aW9uIG9mIHRoZSBGUFUgaW5zdHJ1Y3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIG9wY29kZT0weGQ4ICovCi12b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiRVNDIEQ4XG4iKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotCi1zdGF0aWMgY2hhciAqeDg2ZW11X2ZwdV9vcF9kOV90YWJbXSA9IHsKLSAgICAiRkxEXHREV09SRCBQVFIgIiwgIkVTQ19EOVx0IiwgIkZTVFx0RFdPUkQgUFRSICIsICJGU1RQXHREV09SRCBQVFIgIiwKLSAgICAiRkxERU5WXHQiLCAiRkxEQ1dcdCIsICJGU1RFTlZcdCIsICJGU1RDV1x0IiwKLQotICAgICJGTERcdERXT1JEIFBUUiAiLCAiRVNDX0Q5XHQiLCAiRlNUXHREV09SRCBQVFIgIiwgIkZTVFBcdERXT1JEIFBUUiAiLAotICAgICJGTERFTlZcdCIsICJGTERDV1x0IiwgIkZTVEVOVlx0IiwgIkZTVENXXHQiLAotCi0gICAgIkZMRFx0RFdPUkQgUFRSICIsICJFU0NfRDlcdCIsICJGU1RcdERXT1JEIFBUUiAiLCAiRlNUUFx0RFdPUkQgUFRSICIsCi0gICAgIkZMREVOVlx0IiwgIkZMRENXXHQiLCAiRlNURU5WXHQiLCAiRlNUQ1dcdCIsCi19OwotCi1zdGF0aWMgY2hhciAqeDg2ZW11X2ZwdV9vcF9kOV90YWIxW10gPSB7Ci0gICAgIkZMRFx0IiwgIkZMRFx0IiwgIkZMRFx0IiwgIkZMRFx0IiwKLSAgICAiRkxEXHQiLCAiRkxEXHQiLCAiRkxEXHQiLCAiRkxEXHQiLAotCi0gICAgIkZYQ0hcdCIsICJGWENIXHQiLCAiRlhDSFx0IiwgIkZYQ0hcdCIsCi0gICAgIkZYQ0hcdCIsICJGWENIXHQiLCAiRlhDSFx0IiwgIkZYQ0hcdCIsCi0KLSAgICAiRk5PUCIsICJFU0NfRDkiLCAiRVNDX0Q5IiwgIkVTQ19EOSIsCi0gICAgIkVTQ19EOSIsICJFU0NfRDkiLCAiRVNDX0Q5IiwgIkVTQ19EOSIsCi0KLSAgICAiRlNUUFx0IiwgIkZTVFBcdCIsICJGU1RQXHQiLCAiRlNUUFx0IiwKLSAgICAiRlNUUFx0IiwgIkZTVFBcdCIsICJGU1RQXHQiLCAiRlNUUFx0IiwKLQotICAgICJGQ0hTIiwgIkZBQlMiLCAiRVNDX0Q5IiwgIkVTQ19EOSIsCi0gICAgIkZUU1QiLCAiRlhBTSIsICJFU0NfRDkiLCAiRVNDX0Q5IiwKLQotICAgICJGTEQxIiwgIkZMREwyVCIsICJGTERMMkUiLCAiRkxEUEkiLAotICAgICJGTERMRzIiLCAiRkxETE4yIiwgIkZMRFoiLCAiRVNDX0Q5IiwKLQotICAgICJGMlhNMSIsICJGWUwyWCIsICJGUFRBTiIsICJGUEFUQU4iLAotICAgICJGWFRSQUNUIiwgIkVTQ19EOSIsICJGREVDU1RQIiwgIkZJTkNTVFAiLAotCi0gICAgIkZQUkVNIiwgIkZZTDJYUDEiLCAiRlNRUlQiLCAiRVNDX0Q5IiwKLSAgICAiRlJORElOVCIsICJGU0NBTEUiLCAiRVNDX0Q5IiwgIkVTQ19EOSIsCi19OwotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogb3Bjb2RlPTB4ZDkgKi8KLXZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotCXVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBzdGtlbGVtOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKG1vZCAhPSAzKSB7Ci0JREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2Q5X3RhYiwgbW9kLCByaCwgcmwpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URih4ODZlbXVfZnB1X29wX2Q5X3RhYjFbKHJoIDw8IDMpICsgcmxdKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCQlzdGtlbGVtID0gKHU4KXJsOwotCQlpZiAocmggPCA0KSB7Ci0JCQkJREVDT0RFX1BSSU5URjIoIlNUKCVkKVxuIiwgc3RrZWxlbSk7Ci0JCX0gZWxzZSB7Ci0JCQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJfQotCWJyZWFrOwotICAgIH0KLSNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKLSAgICAvKiBleGVjdXRlICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMzoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfUl9mbGQoWDg2RU1VX0ZQVV9TVEtUT1AsIHN0a2VsZW0pOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9SX2Z4Y2goWDg2RU1VX0ZQVV9TVEtUT1AsIHN0a2VsZW0pOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgc3dpdGNoIChybCkgewotCSAgICAgIGNhc2UgMDoKLQkJeDg2ZW11X2ZwdV9SX25vcCgpOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdHAoWDg2RU1VX0ZQVV9TVEtUT1AsIHN0a2VsZW0pOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgc3dpdGNoIChybCkgewotCSAgICBjYXNlIDA6Ci0JCXg4NmVtdV9mcHVfUl9mY2hzKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkJeDg2ZW11X2ZwdV9SX2ZhYnMoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgY2FzZSA0OgotCQl4ODZlbXVfZnB1X1JfZnRzdChYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCXg4NmVtdV9mcHVfUl9meGFtKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCS8qIDIsMyw2LDcgKi8KLQkJeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDU6Ci0JICAgIHN3aXRjaCAocmwpIHsKLQkgICAgICBjYXNlIDA6Ci0JCXg4NmVtdV9mcHVfUl9mbGQxKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAxOgotCQl4ODZlbXVfZnB1X1JfZmxkbDJ0KFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAyOgotCQl4ODZlbXVfZnB1X1JfZmxkbDJlKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAzOgotCQl4ODZlbXVfZnB1X1JfZmxkcGkoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDQ6Ci0JCXg4NmVtdV9mcHVfUl9mbGRsZzIoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDU6Ci0JCXg4NmVtdV9mcHVfUl9mbGRsbjIoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDY6Ci0JCXg4NmVtdV9mcHVfUl9mbGR6KFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJLyogNyAqLwotCQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgNjoKLQkgICAgc3dpdGNoIChybCkgewotCSAgICAgIGNhc2UgMDoKLQkJeDg2ZW11X2ZwdV9SX2YyeG0xKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAxOgotCQl4ODZlbXVfZnB1X1JfZnlsMngoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDI6Ci0JCXg4NmVtdV9mcHVfUl9mcHRhbihYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMzoKLQkJeDg2ZW11X2ZwdV9SX2ZwYXRhbihYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNDoKLQkJeDg2ZW11X2ZwdV9SX2Z4dHJhY3QoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDU6Ci0JCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDY6Ci0JCXg4NmVtdV9mcHVfUl9kZWNzdHAoKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA3OgotCQl4ODZlbXVfZnB1X1JfaW5jc3RwKCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDc6Ci0JICAgIHN3aXRjaCAocmwpIHsKLQkgICAgICBjYXNlIDA6Ci0JCXg4NmVtdV9mcHVfUl9mcHJlbShYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMToKLQkJeDg2ZW11X2ZwdV9SX2Z5bDJ4cDEoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDI6Ci0JCXg4NmVtdV9mcHVfUl9mc3FydChYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMzoKLQkJeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNDoKLQkJeDg2ZW11X2ZwdV9SX2ZybmRpbnQoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDU6Ci0JCXg4NmVtdV9mcHVfUl9mc2NhbGUoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDY6Ci0JICAgICAgY2FzZSA3OgotCSAgICAgIGRlZmF1bHQ6Ci0JCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICAgIGNhc2UgMDoKLQkJeDg2ZW11X2ZwdV9NX2ZsZChYODZFTVVfRlBVX0ZMT0FULCBkZXN0b2Zmc2V0KTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAxOgotCQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAyOgotCQl4ODZlbXVfZnB1X01fZnN0KFg4NkVNVV9GUFVfRkxPQVQsIGRlc3RvZmZzZXQpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDM6Ci0JCXg4NmVtdV9mcHVfTV9mc3RwKFg4NkVNVV9GUFVfRkxPQVQsIGRlc3RvZmZzZXQpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDQ6Ci0JCXg4NmVtdV9mcHVfTV9mbGRlbnYoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA1OgotCQl4ODZlbXVfZnB1X01fZmxkY3coWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA2OgotCQl4ODZlbXVfZnB1X01fZnN0ZW52KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNzoKLQkJeDg2ZW11X2ZwdV9NX2ZzdGN3KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSNlbmRpZiAvKiBYODZFTVVfRlBVX1BSRVNFTlQgKi8KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotCi1jaGFyICp4ODZlbXVfZnB1X29wX2RhX3RhYltdID0gewotICAgICJGSUFERFx0RFdPUkQgUFRSICIsICJGSU1VTFx0RFdPUkQgUFRSICIsICJGSUNPTVx0RFdPUkQgUFRSICIsCi0gICAgIkZJQ09NUFx0RFdPUkQgUFRSICIsCi0gICAgIkZJU1VCXHREV09SRCBQVFIgIiwgIkZJU1VCUlx0RFdPUkQgUFRSICIsICJGSURJVlx0RFdPUkQgUFRSICIsCi0gICAgIkZJRElWUlx0RFdPUkQgUFRSICIsCi0KLSAgICAiRklBRERcdERXT1JEIFBUUiAiLCAiRklNVUxcdERXT1JEIFBUUiAiLCAiRklDT01cdERXT1JEIFBUUiAiLAotICAgICJGSUNPTVBcdERXT1JEIFBUUiAiLAotICAgICJGSVNVQlx0RFdPUkQgUFRSICIsICJGSVNVQlJcdERXT1JEIFBUUiAiLCAiRklESVZcdERXT1JEIFBUUiAiLAotICAgICJGSURJVlJcdERXT1JEIFBUUiAiLAotCi0gICAgIkZJQUREXHREV09SRCBQVFIgIiwgIkZJTVVMXHREV09SRCBQVFIgIiwgIkZJQ09NXHREV09SRCBQVFIgIiwKLSAgICAiRklDT01QXHREV09SRCBQVFIgIiwKLSAgICAiRklTVUJcdERXT1JEIFBUUiAiLCAiRklTVUJSXHREV09SRCBQVFIgIiwgIkZJRElWXHREV09SRCBQVFIgIiwKLSAgICAiRklESVZSXHREV09SRCBQVFIgIiwKLQotICAgICJFU0NfREEgIiwgIkVTQ19EQSAiLCAiRVNDX0RBICIsICJFU0NfREEgIiwKLSAgICAiRVNDX0RBICAgICAiLCAiRVNDX0RBICIsICJFU0NfREEgICAiLCAiRVNDX0RBICIsCi19OwotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogb3Bjb2RlPTB4ZGEgKi8KLXZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotCXVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBzdGtlbGVtOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kYV90YWIsIG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAzOiAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkJc3RrZWxlbSA9ICh1OClybDsKLQlERUNPREVfUFJJTlRGMigiXHRTVCglZCksU1RcbiIsIHN0a2VsZW0pOwotCWJyZWFrOwotICAgIH0KLSNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAzOgotCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfTV9pYWRkKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9NX2ltdWwoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X01faWNvbShYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfTV9pY29tcChYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHg4NmVtdV9mcHVfTV9pc3ViKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNToKLQkgICAgeDg2ZW11X2ZwdV9NX2lzdWJyKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNjoKLQkgICAgeDg2ZW11X2ZwdV9NX2lkaXYoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA3OgotCSAgICB4ODZlbXVfZnB1X01faWRpdnIoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotCi1jaGFyICp4ODZlbXVfZnB1X29wX2RiX3RhYltdID0gewotICAgICJGSUxEXHREV09SRCBQVFIgIiwgIkVTQ19EQlx0MTkiLCAiRklTVFx0RFdPUkQgUFRSICIsICJGSVNUUFx0RFdPUkQgUFRSICIsCi0gICAgIkVTQ19EQlx0MUMiLCAiRkxEXHRUQllURSBQVFIgIiwgIkVTQ19EQlx0MUUiLCAiRlNUUFx0VEJZVEUgUFRSICIsCi0KLSAgICAiRklMRFx0RFdPUkQgUFRSICIsICJFU0NfREJcdDE5IiwgIkZJU1RcdERXT1JEIFBUUiAiLCAiRklTVFBcdERXT1JEIFBUUiAiLAotICAgICJFU0NfREJcdDFDIiwgIkZMRFx0VEJZVEUgUFRSICIsICJFU0NfREJcdDFFIiwgIkZTVFBcdFRCWVRFIFBUUiAiLAotCi0gICAgIkZJTERcdERXT1JEIFBUUiAiLCAiRVNDX0RCXHQxOSIsICJGSVNUXHREV09SRCBQVFIgIiwgIkZJU1RQXHREV09SRCBQVFIgIiwKLSAgICAiRVNDX0RCXHQxQyIsICJGTERcdFRCWVRFIFBUUiAiLCAiRVNDX0RCXHQxRSIsICJGU1RQXHRUQllURSBQVFIgIiwKLX07Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiBvcGNvZGU9MHhkYiAqLwotdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RiKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0JdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKG1vZCAhPSAzKSB7Ci0JREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2RiX3RhYiwgbW9kLCByaCwgcmwpOwotICAgIH0gZWxzZSBpZiAocmggPT0gNCkgeyAgICAgICAvKiA9PT0gMTEgMTAgMCBubm4gKi8KLQlzd2l0Y2ggKHJsKSB7Ci0JICBjYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIkZFTklcbiIpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiRkRJU0lcbiIpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiRkNMRVhcbiIpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiRklOSVRcbiIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGMigiRVNDX0RCICUweFxuIiwgKG1vZCA8PCA2KSArIChyaCA8PCAzKSArIChybCkpOwotICAgIH0KLSNlbmRpZiAvKiBERUJVRyAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JYnJlYWs7Ci0gICAgfQotI2lmZGVmIFg4NkVNVV9GUFVfUFJFU0VOVAotICAgIC8qIGV4ZWN1dGUgKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAzOgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgNDoKLQkgICAgc3dpdGNoIChybCkgewotCSAgICAgIGNhc2UgMDoKLQkJeDg2ZW11X2ZwdV9SX2ZlbmkoKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAxOgotCQl4ODZlbXVfZnB1X1JfZmRpc2koKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAyOgotCQl4ODZlbXVfZnB1X1JfZmNsZXgoKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAzOgotCQl4ODZlbXVfZnB1X1JfZmluaXQoKTsKLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X01fZmlsZChYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zpc3QoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X01fZmlzdHAoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDU6Ci0JICAgIHg4NmVtdV9mcHVfTV9mbGQoWDg2RU1VX0ZQVV9MREJMLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JCSAgICAgIGNhc2UgNjoKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA3OgotCSAgICB4ODZlbXVfZnB1X01fZnN0cChYODZFTVVfRlBVX0xEQkwsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOwotfQotCi0jaWZkZWYgREVCVUcKLWNoYXIgKng4NmVtdV9mcHVfb3BfZGNfdGFiW10gPSB7Ci0gICAgIkZBRERcdFFXT1JEIFBUUiAiLCAiRk1VTFx0UVdPUkQgUFRSICIsICJGQ09NXHRRV09SRCBQVFIgIiwKLSAgICAiRkNPTVBcdFFXT1JEIFBUUiAiLAotICAgICJGU1VCXHRRV09SRCBQVFIgIiwgIkZTVUJSXHRRV09SRCBQVFIgIiwgIkZESVZcdFFXT1JEIFBUUiAiLAotICAgICJGRElWUlx0UVdPUkQgUFRSICIsCi0KLSAgICAiRkFERFx0UVdPUkQgUFRSICIsICJGTVVMXHRRV09SRCBQVFIgIiwgIkZDT01cdFFXT1JEIFBUUiAiLAotICAgICJGQ09NUFx0UVdPUkQgUFRSICIsCi0gICAgIkZTVUJcdFFXT1JEIFBUUiAiLCAiRlNVQlJcdFFXT1JEIFBUUiAiLCAiRkRJVlx0UVdPUkQgUFRSICIsCi0gICAgIkZESVZSXHRRV09SRCBQVFIgIiwKLQotICAgICJGQUREXHRRV09SRCBQVFIgIiwgIkZNVUxcdFFXT1JEIFBUUiAiLCAiRkNPTVx0UVdPUkQgUFRSICIsCi0gICAgIkZDT01QXHRRV09SRCBQVFIgIiwKLSAgICAiRlNVQlx0UVdPUkQgUFRSICIsICJGU1VCUlx0UVdPUkQgUFRSICIsICJGRElWXHRRV09SRCBQVFIgIiwKLSAgICAiRkRJVlJcdFFXT1JEIFBUUiAiLAotCi0gICAgIkZBRERcdCIsICJGTVVMXHQiLCAiRkNPTVx0IiwgIkZDT01QXHQiLAotICAgICJGU1VCUlx0IiwgIkZTVUJcdCIsICJGRElWUlx0IiwgIkZESVZcdCIsCi19OwotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qIG9wY29kZT0weGRjICovCi12b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLQl1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggc3RrZWxlbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBERUNPREVfUFJJTlRJTlNUUjMyKHg4NmVtdV9mcHVfb3BfZGNfdGFiLCBtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkJc3RrZWxlbSA9ICh1OClybDsKLQlERUNPREVfUFJJTlRGMigiXHRTVCglZCksU1RcbiIsIHN0a2VsZW0pOwotCWJyZWFrOwotICAgIH0KLSNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKLSAgICAvKiBleGVjdXRlICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMzoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfUl9mYWRkKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfUl9mbXVsKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfUl9mY29tKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfUl9mY29tcChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB4ODZlbXVfZnB1X1JfZnN1YnIoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgNToKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdWIoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgNjoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZkaXZyKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDc6Ci0JICAgIHg4NmVtdV9mcHVfUl9mZGl2KHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfTV9mYWRkKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfTV9mbXVsKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfTV9mY29tKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfTV9mY29tcChYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB4ODZlbXVfZnB1X01fZnN1YihYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA1OgotCSAgICB4ODZlbXVfZnB1X01fZnN1YnIoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNjoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZkaXYoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZkaXZyKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKLX0KLQotI2lmZGVmIERFQlVHCi0KLXN0YXRpYyBjaGFyICp4ODZlbXVfZnB1X29wX2RkX3RhYltdID0gewotICAgICJGTERcdFFXT1JEIFBUUiAiLCAiRVNDX0REXHQyOSwiLCAiRlNUXHRRV09SRCBQVFIgIiwgIkZTVFBcdFFXT1JEIFBUUiAiLAotICAgICJGUlNUT1JcdCIsICJFU0NfRERcdDJELCIsICJGU0FWRVx0IiwgIkZTVFNXXHQiLAotCi0gICAgIkZMRFx0UVdPUkQgUFRSICIsICJFU0NfRERcdDI5LCIsICJGU1RcdFFXT1JEIFBUUiAiLCAiRlNUUFx0UVdPUkQgUFRSICIsCi0gICAgIkZSU1RPUlx0IiwgIkVTQ19ERFx0MkQsIiwgIkZTQVZFXHQiLCAiRlNUU1dcdCIsCi0KLSAgICAiRkxEXHRRV09SRCBQVFIgIiwgIkVTQ19ERFx0MjksIiwgIkZTVFx0UVdPUkQgUFRSICIsICJGU1RQXHRRV09SRCBQVFIgIiwKLSAgICAiRlJTVE9SXHQiLCAiRVNDX0REXHQyRCwiLCAiRlNBVkVcdCIsICJGU1RTV1x0IiwKLQotICAgICJGRlJFRVx0IiwgIkZYQ0hcdCIsICJGU1RcdCIsICJGU1RQXHQiLAotICAgICJFU0NfRERcdDJDLCIsICJFU0NfRERcdDJELCIsICJFU0NfRERcdDJFLCIsICJFU0NfRERcdDJGLCIsCi19OwotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogb3Bjb2RlPTB4ZGQgKi8KLXZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotCXVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBzdGtlbGVtOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kZF90YWIsIG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCQlzdGtlbGVtID0gKHU4KXJsOwotCURFQ09ERV9QUklOVEYyKCJcdFNUKCVkKSxTVFxuIiwgc3RrZWxlbSk7Ci0JYnJlYWs7Ci0gICAgfQotI2lmZGVmIFg4NkVNVV9GUFVfUFJFU0VOVAotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDM6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X1JfZmZyZWUoc3RrZWxlbSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X1JfZnhjaChzdGtlbGVtKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3Qoc3RrZWxlbSk7ICAvKiByZWdpc3RlciB2ZXJzaW9uICovCi0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X1JfZnN0cChzdGtlbGVtKTsgLyogcmVnaXN0ZXIgdmVyc2lvbiAqLwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZsZChYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfTV9mc3QoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZzdHAoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zyc3RvcihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNToKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA2OgotCSAgICB4ODZlbXVfZnB1X01fZnNhdmUoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDc6Ci0JICAgIHg4NmVtdV9mcHVfTV9mc3RzdyhYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOwotfQotCi0jaWZkZWYgREVCVUcKLQotc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZGVfdGFiW10gPQotewotICAgICJGSUFERFx0V09SRCBQVFIgIiwgIkZJTVVMXHRXT1JEIFBUUiAiLCAiRklDT01cdFdPUkQgUFRSICIsCi0gICAgIkZJQ09NUFx0V09SRCBQVFIgIiwKLSAgICAiRklTVUJcdFdPUkQgUFRSICIsICJGSVNVQlJcdFdPUkQgUFRSICIsICJGSURJVlx0V09SRCBQVFIgIiwKLSAgICAiRklESVZSXHRXT1JEIFBUUiAiLAotCi0gICAgIkZJQUREXHRXT1JEIFBUUiAiLCAiRklNVUxcdFdPUkQgUFRSICIsICJGSUNPTVx0V09SRCBQVFIgIiwKLSAgICAiRklDT01QXHRXT1JEIFBUUiAiLAotICAgICJGSVNVQlx0V09SRCBQVFIgIiwgIkZJU1VCUlx0V09SRCBQVFIgIiwgIkZJRElWXHRXT1JEIFBUUiAiLAotICAgICJGSURJVlJcdFdPUkQgUFRSICIsCi0KLSAgICAiRklBRERcdFdPUkQgUFRSICIsICJGSU1VTFx0V09SRCBQVFIgIiwgIkZJQ09NXHRXT1JEIFBUUiAiLAotICAgICJGSUNPTVBcdFdPUkQgUFRSICIsCi0gICAgIkZJU1VCXHRXT1JEIFBUUiAiLCAiRklTVUJSXHRXT1JEIFBUUiAiLCAiRklESVZcdFdPUkQgUFRSICIsCi0gICAgIkZJRElWUlx0V09SRCBQVFIgIiwKLQotICAgICJGQUREUFx0IiwgIkZNVUxQXHQiLCAiRkNPTVBcdCIsICJGQ09NUFBcdCIsCi0gICAgIkZTVUJSUFx0IiwgIkZTVUJQXHQiLCAiRkRJVlJQXHQiLCAiRkRJVlBcdCIsCi19OwotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogb3Bjb2RlPTB4ZGUgKi8KLXZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotCXVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBzdGtlbGVtOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kZV90YWIsIG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCQlzdGtlbGVtID0gKHU4KXJsOwotCURFQ09ERV9QUklOVEYyKCJcdFNUKCVkKSxTVFxuIiwgc3RrZWxlbSk7Ci0JYnJlYWs7Ci0gICAgfQotI2lmZGVmIFg4NkVNVV9GUFVfUFJFU0VOVAotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDM6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X1JfZmFkZHAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9SX2ZtdWxwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfUl9mY29tcChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICBpZiAoc3RrZWxlbSA9PSAxKQotCSAgICAgIHg4NmVtdV9mcHVfUl9mY29tcHAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBlbHNlCi0JICAgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB4ODZlbXVfZnB1X1JfZnN1YnJwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDU6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3VicChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA2OgotCSAgICB4ODZlbXVfZnB1X1JfZmRpdnJwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDc6Ci0JICAgIHg4NmVtdV9mcHVfUl9mZGl2cChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X01fZmlhZGQoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfTV9maW11bChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpY29tKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X01fZmljb21wKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB4ODZlbXVfZnB1X01fZmlzdWIoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDU6Ci0JICAgIHg4NmVtdV9mcHVfTV9maXN1YnIoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDY6Ci0JICAgIHg4NmVtdV9mcHVfTV9maWRpdihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpZGl2cihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOwotfQotCi0jaWZkZWYgREVCVUcKLQotc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZGZfdGFiW10gPSB7Ci0gICAgLyogbW9kID09IDAwICovCi0gICAgIkZJTERcdFdPUkQgUFRSICIsICJFU0NfREZcdDM5XG4iLCAiRklTVFx0V09SRCBQVFIgIiwgIkZJU1RQXHRXT1JEIFBUUiAiLAotICAgICJGQkxEXHRUQllURSBQVFIgIiwgIkZJTERcdFFXT1JEIFBUUiAiLCAiRkJTVFBcdFRCWVRFIFBUUiAiLAotICAgICJGSVNUUFx0UVdPUkQgUFRSICIsCi0KLSAgICAvKiBtb2QgPT0gMDEgKi8KLSAgICAiRklMRFx0V09SRCBQVFIgIiwgIkVTQ19ERlx0MzkgIiwgIkZJU1RcdFdPUkQgUFRSICIsICJGSVNUUFx0V09SRCBQVFIgIiwKLSAgICAiRkJMRFx0VEJZVEUgUFRSICIsICJGSUxEXHRRV09SRCBQVFIgIiwgIkZCU1RQXHRUQllURSBQVFIgIiwKLSAgICAiRklTVFBcdFFXT1JEIFBUUiAiLAotCi0gICAgLyogbW9kID09IDEwICovCi0gICAgIkZJTERcdFdPUkQgUFRSICIsICJFU0NfREZcdDM5ICIsICJGSVNUXHRXT1JEIFBUUiAiLCAiRklTVFBcdFdPUkQgUFRSICIsCi0gICAgIkZCTERcdFRCWVRFIFBUUiAiLCAiRklMRFx0UVdPUkQgUFRSICIsICJGQlNUUFx0VEJZVEUgUFRSICIsCi0gICAgIkZJU1RQXHRRV09SRCBQVFIgIiwKLQotICAgIC8qIG1vZCA9PSAxMSAqLwotICAgICJGRlJFRVx0IiwgIkZYQ0hcdCIsICJGU1RcdCIsICJGU1RQXHQiLAotICAgICJFU0NfREZcdDNDLCIsICJFU0NfREZcdDNELCIsICJFU0NfREZcdDNFLCIsICJFU0NfREZcdDNGLCIKLX07Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiBvcGNvZGU9MHhkZiAqLwotdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RmKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0JdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IHN0a2VsZW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2RmX3RhYiwgbW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JCXN0a2VsZW0gPSAodTgpcmw7Ci0JREVDT0RFX1BSSU5URjIoIlx0U1QoJWQpXG4iLCBzdGtlbGVtKTsKLQlicmVhazsKLSAgICB9Ci0jaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMzoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfUl9mZnJlZShzdGtlbGVtKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfUl9meGNoKHN0a2VsZW0pOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdChzdGtlbGVtKTsgIC8qIHJlZ2lzdGVyIHZlcnNpb24gKi8KLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3RwKHN0a2VsZW0pOyAvKiByZWdpc3RlciB2ZXJzaW9uICovCi0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X01fZmlsZChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X01fZmlzdChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zpc3RwKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB4ODZlbXVfZnB1X01fZmJsZChYODZFTVVfRlBVX0JTRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA1OgotCSAgICB4ODZlbXVfZnB1X01fZmlsZChYODZFTVVfRlBVX0xPTkcsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNjoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zic3RwKFg4NkVNVV9GUFVfQlNELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDc6Ci0JICAgIHg4NmVtdV9mcHVfTV9maXN0cChYODZFTVVfRlBVX0xPTkcsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2UyZTllLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSMKLSMgICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotIyAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotIyAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotIyAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0jICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0jICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0jICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotIyAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSMgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSMgIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSMgIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0jICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0jICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSMgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSMgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIG1ha2VmaWxlIGZvciB0aGUgeDg2ZW11IGxpYnJhcnkuIFJlcXVpcmVzCi0jICAgICAgICAgICAgICAgdGhlIFNjaVRlY2ggU29mdHdhcmUgbWFrZWZpbGUgZGVmaW5pdGlvbnMgcGFja2FnZSB0byBiZQotIyAgICAgICAgICAgICAgIGluc3RhbGxlZCwgd2hpY2ggdXNlcyB0aGUgRE1BS0UgbWFrZSBwcm9ncmFtLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotLklNUE9SVCAuSUdOT1JFOiBERUJVRwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgdGhlIGxpc3RzIG9mIG9iamVjdCBmaWxlcwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotT0JKRUNUUwkJCT0gc3lzJE8gZGVjb2RlJE8gb3BzJE8gb3BzMiRPIHByaW1fb3BzJE8gZnB1JE8gZGVidWckTwotQ0ZMQUdTICAgICAgCSs9IC1EU0NJVEVDSAotLklGICQoREVCVUcpCi1DRkxBR1MJCQkrPSAtRERFQlVHCi0uRU5ESUYKLUxJQkNMRUFOICAJCT0gKi5kbGwgKi5saWIgKi5hCi1MSUJGSUxFIAkJPSAkKExQKXg4NmVtdSRMCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNhbXBsZSB0ZXN0IHByb2dyYW1zCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hbGw6ICQoTElCRklMRSkKLQotdmFsaWRhdGUkRTogdmFsaWRhdGUkTyAkKExJQkZJTEUpCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgdG8gY3JlYXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZm9yCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ERVBFTkRfT0JKICAgICAgPSAgdmFsaWRhdGUkTyAkKE9CSkVDVFMpCi0KLS5JTkNMVURFOiAiJChTQ0lURUNIKS9tYWtlZGVmcy9jb21tb24ubWsiCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUuY3Jvc3MgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUuY3Jvc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiY2U5YTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmNyb3NzCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotIwotIyAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0jICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0jICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0jICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSMgIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSMgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSMgIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0jICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotIyAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSMKLSMgIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotIyAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotIyAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSMgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSMgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotIyAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotIyAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIExpbnV4IHNwZWNpZmljIG1ha2VmaWxlIGZvciB0aGUgeDg2ZW11IGxpYnJhcnkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DQyA9ICQoQ1JPU1NfQ09NUElMRSlnY2MKLUFSID0gJChDUk9TU19DT01QSUxFKWFyCi0KLVRBUkdFVExJQiA9IGxpYng4NmVtdS5hCi1UQVJHRVRERUJVR0xJQiA9bGlieDg2ZW11ZC5hCi0KLU9CSlM9XAotZGVjb2RlLm8gXAotZnB1Lm8gXAotb3BzLm8gXAotb3BzMi5vIFwKLXByaW1fb3BzLm8gXAotc3lzLm8KLQotREVCVUdPQkpTPWRlYnVnLmQgXAotICAgICAgICAgIGRlY29kZS5kIFwKLQkgIGZwdS5kIFwKLQkgIG9wcy5kIFwKLQkgIG9wczIuZCBcCi0JICBwcmltX29wcy5kIFwKLQkgIHN5cy5kCi0KLS5TVUZGSVhFUzogLmQKLQotYWxsOiAkKFRBUkdFVExJQikgJChUQVJHRVRERUJVR0xJQikKLQotJChUQVJHRVRMSUIpOiAkKE9CSlMpCi0JJChBUikgcnYgJChUQVJHRVRMSUIpICQoT0JKUykKLQotJChUQVJHRVRERUJVR0xJQik6ICQoREVCVUdPQkpTKQotCSQoQVIpIHJ2ICQoVEFSR0VUREVCVUdMSUIpICQoREVCVUdPQkpTKQotCi1JTkNTICAgPSAtSS4gLUl4ODZlbXUgLUkuLi8uLi9pbmNsdWRlCi1DRkxBR1MgPSAtRF9fRFJJVkVSX18gLURGT1JDRV9QT1NUIC1EX0NFWFBPUlQ9IC1ETk9fTE9OR19MT05HIC1EcHJpbnRrPXByaW50ZiAtZnNpZ25lZC1jaGFyICAtZm9taXQtZnJhbWUtcG9pbnRlciAtZlBJQyAtZmZpeGVkLXIxNCAtbWVhYmkKLUNERUJVR0ZMQUdTID0gLURERUJVRwotCi0uYy5vOgotCSQoQ0MpIC1nIC1PMiAtV2FsbCAtYyAkKENGTEFHUykgJChJTkNTKSAkKi5jCi0KLS5jLmQ6Ci0JJChDQykgLWcgLU8yIC1XYWxsIC1jIC1vJCouZCAkKENGTEFHUykgJChDREVCVUdGTEFHUykgJChJTkNTKSAkKi5jCi0KLS5jcHAubzoKLQkkKENDKSAtYyAkKENGTEFHUykgJChJTkNTKSAkKi5jcHAKLQotY2xlYW46Ci0Jcm0gLWYgKi5hICoubyAqLmQKLQotdmFsaWRhdGU6CXZhbGlkYXRlLm8gbGlieDg2ZW11LmEKLQkkKENDKSAtbyB2YWxpZGF0ZSB2YWxpZGF0ZS5vIC1seDg2ZW11IC1MLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmxpbnV4IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmxpbnV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzRiODhkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS5saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSMKLSMgICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotIyAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotIyAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotIyAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0jICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0jICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0jICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotIyAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSMgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSMgIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSMgIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0jICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0jICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSMgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSMgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBMaW51eCBzcGVjaWZpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVEFSR0VUTElCID0gbGlieDg2ZW11LmEKLVRBUkdFVERFQlVHTElCID1saWJ4ODZlbXVkLmEKLQotT0JKUz1cCi1kZWNvZGUubyBcCi1mcHUubyBcCi1vcHMubyBcCi1vcHMyLm8gXAotcHJpbV9vcHMubyBcCi1wcmVncy5vIFwKLXN5cy5vCi0KLURFQlVHT0JKUz1kZWJ1Zy5kIFwKLSAgICAgICAgICBkZWNvZGUuZCBcCi0JICBmcHUuZCBcCi0JICBvcHMuZCBcCi0JICBvcHMyLmQgXAotCSAgcHJpbV9vcHMuZCBcCi0JICBwcmVncy5kIFwKLQkgIHN5cy5kCi0KLS5TVUZGSVhFUzogLmQKLQotYWxsOiAkKFRBUkdFVExJQikgJChUQVJHRVRERUJVR0xJQikKLQotJChUQVJHRVRMSUIpOiAkKE9CSlMpCi0JYXIgcnYgJChUQVJHRVRMSUIpICQoT0JKUykKLQotJChUQVJHRVRERUJVR0xJQik6ICQoREVCVUdPQkpTKQotCWFyIHJ2ICQoVEFSR0VUREVCVUdMSUIpICQoREVCVUdPQkpTKQotCi1JTkNTICAgPSAtSS4gLUl4ODZlbXUgLUkuLi8uLi9pbmNsdWRlCi1DRkxBR1MgPSAtRF9fRFJJVkVSX18gLURGT1JDRV9QT1NUIC1EX0NFWFBPUlQ9IC1ETk9fTE9OR19MT05HCi1DREVCVUdGTEFHUyA9IC1EREVCVUcKLQotLmMubzoKLQlnY2MgLWcgLU8gLVdhbGwgLWMgJChDRkxBR1MpICQoSU5DUykgJCouYwotCi0uYy5kOgotCWdjYyAtZyAtTyAtV2FsbCAtYyAtbyQqLmQgJChDRkxBR1MpICQoQ0RFQlVHRkxBR1MpICQoSU5DUykgJCouYwotCi0uY3BwLm86Ci0JZ2NjIC1jICQoQ0ZMQUdTKSAkKElOQ1MpICQqLmNwcAotCi1jbGVhbjoKLQlybSAtZiAqLmEgKi5vICouZAotCi12YWxpZGF0ZToJdmFsaWRhdGUubyBsaWJ4ODZlbXUuYQotCWdjYyAtbyB2YWxpZGF0ZSB2YWxpZGF0ZS5vIC1seDg2ZW11IC1MLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLnVib290IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLnVib290CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjlhZTFmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS51Ym9vdAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSMKLSMgICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotIyAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotIyAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotIyAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0jICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0jICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0jICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotIyAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSMgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSMgIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSMgIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0jICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0jICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSMgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSMgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBMaW51eCBzcGVjaWZpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNDID0gJChDUk9TU19DT01QSUxFKWdjYwotQVIgPSAkKENST1NTX0NPTVBJTEUpYXIKLVRBUkdFVExJQiA9IGxpYng4NmVtdS5hCi1UQVJHRVRERUJVR0xJQiA9bGlieDg2ZW11ZC5hCi0KLU9CSlM9XAotZGVjb2RlLm8gXAotZnB1Lm8gXAotb3BzLm8gXAotb3BzMi5vIFwKLXByaW1fb3BzLm8gXAotc3lzLm8KLQotREVCVUdPQkpTPWRlYnVnLmQgXAotICAgICAgICAgIGRlY29kZS5kIFwKLQkgIGZwdS5kIFwKLQkgIG9wcy5kIFwKLQkgIG9wczIuZCBcCi0JICBwcmltX29wcy5kIFwKLQkgIHN5cy5kCi0KLS5TVUZGSVhFUzogLmQKLQotYWxsOiAkKFRBUkdFVExJQikgJChUQVJHRVRERUJVR0xJQikKLQotJChUQVJHRVRMSUIpOiAkKE9CSlMpCi0JJChBUikgcnYgJChUQVJHRVRMSUIpICQoT0JKUykKLQotJChUQVJHRVRERUJVR0xJQik6ICQoREVCVUdPQkpTKQotCSQoQVIpIHJ2ICQoVEFSR0VUREVCVUdMSUIpICQoREVCVUdPQkpTKQotCi1JTkNTICAgPSAtSS4gLUl4ODZlbXUgLUkuLi8uLi9pbmNsdWRlCi1DRkxBR1MgPSAtRF9fRFJJVkVSX18gLURGT1JDRV9QT1NUIC1EX0NFWFBPUlQ9IC1ETk9fTE9OR19MT05HIC1EcHJpbnRrPXByaW50ZiAtZnNpZ25lZC1jaGFyICAtZm9taXQtZnJhbWUtcG9pbnRlciAtZlBJQyAtZmZpeGVkLXIxNCAtbWVhYmkKLUNERUJVR0ZMQUdTID0gLURERUJVRwotCi0uYy5vOgotCSQoQ0MpIC1nIC1PMiAtV2FsbCAtYyAkKENGTEFHUykgJChJTkNTKSAkKi5jCi0KLS5jLmQ6Ci0JJChDQykgLWcgLU8yIC1XYWxsIC1jIC1vJCouZCAkKENGTEFHUykgJChDREVCVUdGTEFHUykgJChJTkNTKSAkKi5jCi0KLS5jcHAubzoKLQkkKENDKSAtYyAkKENGTEFHUykgJChJTkNTKSAkKi5jcHAKLQotY2xlYW46Ci0Jcm0gLWYgKi5hICoubyAqLmQKLQotdmFsaWRhdGU6CXZhbGlkYXRlLm8gbGlieDg2ZW11LmEKLQkkKENDKSAtbyB2YWxpZGF0ZSB2YWxpZGF0ZS5vIC1seDg2ZW11IC1MLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRmOTNlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9vcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDExNzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHRvIGltcGxlbWVudCB0aGUgZGVjb2RpbmcKLSogICAgICAgICAgICAgICBhbmQgZW11bGF0aW9uIG9mIGFsbCB0aGUgeDg2IHByb2Nlc3NvciBpbnN0cnVjdGlvbnMuCi0qCi0qIFRoZXJlIGFyZSBhcHByb3hpbWF0ZWx5IDI1MCBzdWJyb3V0aW5lcyBpbiBoZXJlLCB3aGljaCBjb3JyZXNwb25kCi0qIHRvIHRoZSAyNTYgYnl0ZS0ib3Bjb2RlcyIgZm91bmQgb24gdGhlIDgwODYuICBUaGUgdGFibGUgd2hpY2gKLSogZGlzcGF0Y2hlcyB0aGlzIGlzIGZvdW5kIGluIHRoZSBmaWxlcyBvcHRhYi5bY2hdLgotKgotKiBFYWNoIG9wY29kZSBwcm9jIGhhcyBhIGNvbW1lbnQgcHJlY2VlZGluZyBpdCB3aGljaCBnaXZlcyBpdCdzIHRhYmxlCi0qIGFkZHJlc3MuICBTZXZlcmFsIG9wY29kZXMgYXJlIG1pc3NpbmcgKHVuZGVmaW5lZCkgaW4gdGhlIHRhYmxlLgotKgotKiBFYWNoIHByb2MgaW5jbHVkZXMgaW5mb3JtYXRpb24gZm9yIGRlY29kaW5nIChERUNPREVfUFJJTlRGIGFuZAotKiBERUNPREVfUFJJTlRGMiksIGRlYnVnZ2luZyAoVFJBQ0VfUkVHUywgU0lOR0xFX1NURVApLCBhbmQgbWlzYwotKiBmdW5jdGlvbnMgKFNUQVJUX09GX0lOU1RSLCBFTkRfT0ZfSU5TVFIpLgotKgotKiBNYW55IG9mIHRoZSBwcm9jZWR1cmVzIGFyZSAqVkVSWSogc2ltaWxhciBpbiBjb2RpbmcuICBUaGlzIGhhcwotKiBhbGxvd2VkIGZvciBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGluIGEgZmFpcmx5Ci0qIHNob3J0IGFtb3VudCBvZiB0aW1lIChpLmUuIGN1dCwgcGFzdGUsIGFuZCBtb2RpZnkpLiAgVGhlIHJlc3VsdCBpcwotKiB0aGF0IG11Y2ggb2YgdGhlIGNvZGUgYmVsb3cgY291bGQgaGF2ZSBiZWVuIGZvbGRlZCBpbnRvIHN1YnJvdXRpbmVzCi0qIGZvciBhIGxhcmdlIHJlZHVjdGlvbiBpbiBzaXplIG9mIHRoaXMgZmlsZS4gIFRoZSBkb3duc2lkZSB3b3VsZCBiZQotKiB0aGF0IHRoZXJlIHdvdWxkIGJlIGEgcGVuYWx0eSBpbiBleGVjdXRpb24gc3BlZWQuICBUaGUgZmlsZSBjb3VsZAotKiBhbHNvIGhhdmUgYmVlbiAqTVVDSCogbGFyZ2VyIGJ5IGlubGluaW5nIGNlcnRhaW4gZnVuY3Rpb25zIHdoaWNoCi0qIHdlcmUgY2FsbGVkLiAgVGhpcyBjb3VsZCBoYXZlIHJlc3VsdGVkIGV2ZW4gZmFzdGVyIGV4ZWN1dGlvbi4gIFRoZQotKiBwcmltZSBkaXJlY3RpdmUgSSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGlubGluZSB0aGUgY29kZSBvciB0bwotKiBtb2R1bGFyaXplIGl0LCB3YXMgYmFzaWNhbGx5OiAxKSBubyB1bm5lY2Vzc2FyeSBzdWJyb3V0aW5lIGNhbGxzLAotKiAyKSBubyByb3V0aW5lcyBtb3JlIHRoYW4gYWJvdXQgMjAwIGxpbmVzIGluIHNpemUsIGFuZCAzKSBtb2R1bGFyaXplCi0qIGFueSBjb2RlIHRoYXQgSSBtaWdodCBub3QgZ2V0IHJpZ2h0IHRoZSBmaXJzdCB0aW1lLiAgVGhlIGZldGNoXyoKLSogc3Vicm91dGluZXMgZmFsbCBpbnRvIHRoZSBsYXR0ZXIgY2F0ZWdvcnkuICBUaGUgVGhlIGRlY29kZV8qIGZhbGwKLSogaW50byB0aGUgc2Vjb25kIGNhdGVnb3J5LiAgVGhlIGNvZGluZyBvZiB0aGUgInN3aXRjaChtb2QpeyAuLi4uIH0iCi0qIGluIG1hbnkgb2YgdGhlIHN1YnJvdXRpbmVzIGJlbG93IGZhbGxzIGludG8gdGhlIGZpcnN0IGNhdGVnb3J5LgotKiBFc3BlY2lhbGx5LCB0aGUgY29kaW5nIG9mIHthZGQsYW5kLG9yLHN1YiwuLi59X3tieXRlLHdvcmR9Ci0qIHN1YnJvdXRpbmVzIGFyZSBhbiBlc3BlY2lhbGx5IGdsYXJpbmcgY2FzZSBvZiB0aGUgdGhpcmQgZ3VpZGVsaW5lLgotKiBTaW5jZSBzbyBtdWNoIG9mIHRoZSBjb2RlIGlzIGNsb25lZCBmcm9tIG90aGVyIG1vZHVsZXMgKGNvbXBhcmUKLSogb3Bjb2RlICMwMCB0byBvcGNvZGUgIzAxKSwgbWFraW5nIHRoZSBiYXNpYyBvcGVyYXRpb25zIHN1YnJvdXRpbmUKLSogY2FsbHMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQ7IG90aGVyd2lzZSBtaXN0YWtlcyBpbiBjb2RpbmcgYW4KLSogImFkZCIgd291bGQgcmVwcmVzZW50IGEgbmlnaHRtYXJlIGluIG1haW50ZW5hbmNlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotb3AxIC0gSW5zdHJ1Y3Rpb24gb3AgY29kZQotCi1SRU1BUktTOgotSGFuZGxlcyBpbGxlZ2FsIG9wY29kZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbGxlZ2FsX29wKAotICAgIHU4IG9wMSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgWDg2IE9QQ09ERVxuIik7Ci0gICAgVFJBQ0VfUkVHUygpOwotICAgIHByaW50aygiJTA0eDolMDR4OiAlMDJYIElMTEVHQUwgWDg2IE9QQ09ERSFcbiIsCi0JTS54ODYuUl9DUywgTS54ODYuUl9JUC0xLG9wMSk7Ci0gICAgSEFMVF9TWVMoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDAwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGRfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYWRkX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYWRkX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYWRkX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDAxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGRfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRkX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkZF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGRfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRkX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkZF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGRfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDAyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGRfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRkX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkZF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRkX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRkX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDA0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGRfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUREXHRBTCwiKTsKLSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBhZGRfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDA1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGRfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkFERFx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJBRERcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gYWRkX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gYWRkX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9FUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9FUyk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9FUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQT1BcdEVTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfRVMgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDA4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcl9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1JcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IG9yX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gb3JfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gb3JfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDA5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG9yX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG9yX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG9yX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29yX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1JcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gb3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gb3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gb3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gb3JfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcl93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1JcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3JfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3Jfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3JfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1JcdEFMLCIpOwotICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IG9yX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3Jfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk9SXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk9SXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IG9yX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gb3Jfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdENTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZi4gRXNjYXBlIGZvciB0d28tYnl0ZSBvcGNvZGUgKDI4NiBvciBiZXR0ZXIpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF90d29fYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggb3AyID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOwotICAgIElOQ19ERUNPREVEX0lOU1RfTEVOKDEpOwotICAgICgqeDg2ZW11X29wdGFiMltvcDJdKShvcDIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkY19ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhZGNfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhZGNfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhZGNfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkY19ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkY193b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGNfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRjX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkY19sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGNfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRjX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkY193b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkY19ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRjX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkY19ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDEzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGNfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY19sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkY19ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRENcdEFMLCIpOwotICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IGFkY19ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkY193b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiQURDXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkFEQ1x0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBhZGNfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBhZGNfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdFNTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX1NTKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBPUFx0U1NcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9TUyA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NiYl9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBzYmJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBzYmJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBzYmJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NiYl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzYmJfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc2JiX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHNiYl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzYmJfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc2JiX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHNiYl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MWEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NiYl9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzYmJfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc2JiX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzYmJfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDFiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zYmJfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MWMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NiYl9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTQkJcdEFMLCIpOwotICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IHNiYl9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NiYl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiU0JCXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlNCQlx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBzYmJfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBzYmJfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDFlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0RTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdERTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0RTKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX0RTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RFNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9EUyA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FuZF9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFuZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLQotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYW5kX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotCi0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhbmRfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYW5kX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYW5kX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFuZF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhbmRfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYW5kX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFuZF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhbmRfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYW5kX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYW5kX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFuZF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYW5kX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFuZF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FuZF93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQkgICAgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCSAgICBicmVhazsKLQl9Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDI0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hbmRfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQU5EXHRBTCwiKTsKLSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBhbmRfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDI1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hbmRfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkFORFx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJBTkRcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gYW5kX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gYW5kX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0VTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkVTOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0VTOwotICAgIC8qCi0gICAgICogbm90ZSB0aGUgbGFjayBvZiBERUNPREVfQ0xFQVJfU0VHT1ZSKHIpIHNpbmNlLCBoZXJlIGlzIG9uZSBvZiA0Ci0gICAgICogb3Bjb2RlIHN1YnJvdXRpbmVzIHdlIGRvIG5vdCB3YW50IHRvIGRvIHRoaXMuCi0gICAgICovCi0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGFhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkRBQVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gZGFhX2J5dGUoTS54ODYuUl9BTCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N1Yl9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBzdWJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBzdWJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBzdWJfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHN1Yl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N1Yl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzdWJfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc3ViX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHN1Yl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzdWJfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc3ViX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHN1Yl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MmEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N1Yl9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzdWJfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHN1Yl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzdWJfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDJiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdWJfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MmMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N1Yl9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVUJcdEFMLCIpOwotICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IHN1Yl9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MmQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N1Yl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiU1VCXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlNVQlx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBzdWJfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBzdWJfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDJlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zZWdvdnJfQ1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ1M6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfQ1M7Ci0gICAgLyogbm90ZSBubyBERUNPREVfQ0xFQVJfU0VHT1ZSIGhlcmUuICovCi0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGFzKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkRBU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gZGFzX2J5dGUoTS54ODYuUl9BTCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hvcl9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSB4b3JfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSB4b3JfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSB4b3JfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHhvcl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hvcl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSB4b3JfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0geG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHhvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSB4b3Jfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0geG9yX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHhvcl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3JfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hvcl9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0geG9yX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHhvcl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDMzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94b3Jfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3Jfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3JfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hvcl9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJYT1JcdEFMLCIpOwotICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IHhvcl9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hvcl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiWE9SXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlhPUlx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSB4b3JfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSB4b3Jfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDM2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zZWdvdnJfU1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1M6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfU1M7Ci0gICAgLyogbm8gREVDT0RFX0NMRUFSX1NFR09WUiAhICovCi0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWFhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFBQVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FYID0gYWFhX3dvcmQoTS54ODYuUl9BWCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtcF9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWNtcF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQljbXBfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JY21wX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQljbXBfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDM5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbXBfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4M2EKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtcF9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JY21wX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQljbXBfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWNtcF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JY21wX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21wX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4M2MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtcF9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTVBcdEFMLCIpOwotICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgY21wX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21wX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJDTVBcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiQ01QXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQljbXBfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCWNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4M2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NlZ292cl9EUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJEUzpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9EUzsKLSAgICAvKiBOTyBERUNPREVfQ0xFQVJfU0VHT1ZSISAqLwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4M2YKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2Fhcyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBQVNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BWCA9IGFhc193b3JkKE0ueDg2LlJfQVgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbmNfQVgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRFQVhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRBWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBpbmNfbG9uZyhNLng4Ni5SX0VBWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gaW5jX3dvcmQoTS54ODYuUl9BWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbmNfQ1godTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRFQ1hcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRDWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQ1ggPSBpbmNfbG9uZyhNLng4Ni5SX0VDWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0NYID0gaW5jX3dvcmQoTS54ODYuUl9DWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbmNfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRFRFhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHREWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FRFggPSBpbmNfbG9uZyhNLng4Ni5SX0VEWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RYID0gaW5jX3dvcmQoTS54ODYuUl9EWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbmNfQlgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRFQlhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRCWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQlggPSBpbmNfbG9uZyhNLng4Ni5SX0VCWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0JYID0gaW5jX3dvcmQoTS54ODYuUl9CWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQ0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbmNfU1AodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRFU1BcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRTUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FU1AgPSBpbmNfbG9uZyhNLng4Ni5SX0VTUCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX1NQID0gaW5jX3dvcmQoTS54ODYuUl9TUCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQ1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbmNfQlAodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRFQlBcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRCUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQlAgPSBpbmNfbG9uZyhNLng4Ni5SX0VCUCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0JQID0gaW5jX3dvcmQoTS54ODYuUl9CUCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQ2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbmNfU0kodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRFU0lcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRTSVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FU0kgPSBpbmNfbG9uZyhNLng4Ni5SX0VTSSk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX1NJID0gaW5jX3dvcmQoTS54ODYuUl9TSSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQ3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbmNfREkodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRFRElcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5DXHRESVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FREkgPSBpbmNfbG9uZyhNLng4Ni5SX0VESSk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RJID0gaW5jX3dvcmQoTS54ODYuUl9ESSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQ4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kZWNfQVgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRFQVhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRBWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBkZWNfbG9uZyhNLng4Ni5SX0VBWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gZGVjX3dvcmQoTS54ODYuUl9BWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDQ5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kZWNfQ1godTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRFQ1hcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRDWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQ1ggPSBkZWNfbG9uZyhNLng4Ni5SX0VDWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0NYID0gZGVjX3dvcmQoTS54ODYuUl9DWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDRhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kZWNfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRFRFhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHREWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FRFggPSBkZWNfbG9uZyhNLng4Ni5SX0VEWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RYID0gZGVjX3dvcmQoTS54ODYuUl9EWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDRiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kZWNfQlgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRFQlhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRCWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQlggPSBkZWNfbG9uZyhNLng4Ni5SX0VCWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0JYID0gZGVjX3dvcmQoTS54ODYuUl9CWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDRjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kZWNfU1AodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRFU1BcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRTUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FU1AgPSBkZWNfbG9uZyhNLng4Ni5SX0VTUCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX1NQID0gZGVjX3dvcmQoTS54ODYuUl9TUCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDRkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kZWNfQlAodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRFQlBcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRCUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQlAgPSBkZWNfbG9uZyhNLng4Ni5SX0VCUCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0JQID0gZGVjX3dvcmQoTS54ODYuUl9CUCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDRlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kZWNfU0kodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRFU0lcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRTSVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FU0kgPSBkZWNfbG9uZyhNLng4Ni5SX0VTSSk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX1NJID0gZGVjX3dvcmQoTS54ODYuUl9TSSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDRmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kZWNfREkodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRFRElcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiREVDXHRESVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FREkgPSBkZWNfbG9uZyhNLng4Ni5SX0VESSk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RJID0gZGVjX3dvcmQoTS54ODYuUl9ESSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDUwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEVBWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRBWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRUFYKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZChNLng4Ni5SX0FYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfQ1godTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RUNYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdENYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoTS54ODYuUl9FQ1gpOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQ1gpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1MgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRFRFhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RFhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhNLng4Ni5SX0VEWCk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoTS54ODYuUl9EWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDUzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0JYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEVCWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRCWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRUJYKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZChNLng4Ni5SX0JYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfU1AodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RVNQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdFNQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkvKiBBbHdheXMgcHVzaCAoRSlTUCwgc2luY2Ugd2UgYXJlIGVtdWxhdGluZyBhbiBpMzg2IGFuZCBhYm92ZQotCSAqIHByb2Nlc3Nvci4gVGhpcyBpcyBuZWNlc3NhcnkgYXMgc29tZSBCSU9TJ2VzIHVzZSB0aGlzIHRvIGNoZWNrCi0JICogd2hhdCB0eXBlIG9mIHByb2Nlc3NvciBpcyBpbiB0aGUgc3lzdGVtLgotCSAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQlwdXNoX2xvbmcoTS54ODYuUl9FU1ApOwotCX0gZWxzZSB7Ci0JCXB1c2hfd29yZCgodTE2KShNLng4Ni5SX1NQKSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDU1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0JQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEVCUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRCUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRUJQKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZChNLng4Ni5SX0JQKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfU0kodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RVNJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdFNJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoTS54ODYuUl9FU0kpOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKE0ueDg2LlJfU0kpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1NwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9ESSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRFRElcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RElcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhNLng4Ni5SX0VESSk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoTS54ODYuUl9ESSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDU4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfQVgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRFQVhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRBWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDU5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfQ1godTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRFQ1hcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRDWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQ1ggPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9DWCA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDVhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRFRFhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHREWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FRFggPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9EWCA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDViCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfQlgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRFQlhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRCWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQlggPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9CWCA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDVjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfU1AodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRFU1BcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRTUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FU1AgPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9TUCA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfQlAodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRFQlBcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRCUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQlAgPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9CUCA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDVlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfU0kodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRFU0lcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRTSVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FU0kgPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9TSSA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDVmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfREkodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRFRElcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QXHRESVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FREkgPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9ESSA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDYwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX2FsbCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIQURcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSEFcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXUzMiBvbGRfc3AgPSBNLng4Ni5SX0VTUDsKLQotCXB1c2hfbG9uZyhNLng4Ni5SX0VBWCk7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRUNYKTsKLQlwdXNoX2xvbmcoTS54ODYuUl9FRFgpOwotCXB1c2hfbG9uZyhNLng4Ni5SX0VCWCk7Ci0JcHVzaF9sb25nKG9sZF9zcCk7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRUJQKTsKLQlwdXNoX2xvbmcoTS54ODYuUl9FU0kpOwotCXB1c2hfbG9uZyhNLng4Ni5SX0VESSk7Ci0gICAgfSBlbHNlIHsKLQl1MTYgb2xkX3NwID0gTS54ODYuUl9TUDsKLQotCXB1c2hfd29yZChNLng4Ni5SX0FYKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9DWCk7Ci0JcHVzaF93b3JkKE0ueDg2LlJfRFgpOwotCXB1c2hfd29yZChNLng4Ni5SX0JYKTsKLQlwdXNoX3dvcmQob2xkX3NwKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9CUCk7Ci0JcHVzaF93b3JkKE0ueDg2LlJfU0kpOwotCXB1c2hfd29yZChNLng4Ni5SX0RJKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NjEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9hbGwodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QQURcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QQVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FREkgPSBwb3BfbG9uZygpOwotCU0ueDg2LlJfRVNJID0gcG9wX2xvbmcoKTsKLQlNLng4Ni5SX0VCUCA9IHBvcF9sb25nKCk7Ci0JTS54ODYuUl9FU1AgKz0gNDsgICAgICAgICAgICAgIC8qIHNraXAgRVNQICovCi0JTS54ODYuUl9FQlggPSBwb3BfbG9uZygpOwotCU0ueDg2LlJfRURYID0gcG9wX2xvbmcoKTsKLQlNLng4Ni5SX0VDWCA9IHBvcF9sb25nKCk7Ci0JTS54ODYuUl9FQVggPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9ESSA9IHBvcF93b3JkKCk7Ci0JTS54ODYuUl9TSSA9IHBvcF93b3JkKCk7Ci0JTS54ODYuUl9CUCA9IHBvcF93b3JkKCk7Ci0JTS54ODYuUl9TUCArPSAyOyAgICAgICAgICAgICAgIC8qIHNraXAgU1AgKi8KLQlNLng4Ni5SX0JYID0gcG9wX3dvcmQoKTsKLQlNLng4Ni5SX0RYID0gcG9wX3dvcmQoKTsKLQlNLng4Ni5SX0NYID0gcG9wX3dvcmQoKTsKLQlNLng4Ni5SX0FYID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKm9wY29kZSAweDYyICAgSUxMRUdBTCBPUCwgY2FsbHMgeDg2ZW11T3BfaWxsZWdhbF9vcCgpICovCi0vKm9wY29kZSAweDYzICAgSUxMRUdBTCBPUCwgY2FsbHMgeDg2ZW11T3BfaWxsZWdhbF9vcCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2NAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0ZTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkZTOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0ZTOwotICAgIC8qCi0gICAgICogbm90ZSB0aGUgbGFjayBvZiBERUNPREVfQ0xFQVJfU0VHT1ZSKHIpIHNpbmNlLCBoZXJlIGlzIG9uZSBvZiA0Ci0gICAgICogb3Bjb2RlIHN1YnJvdXRpbmVzIHdlIGRvIG5vdCB3YW50IHRvIGRvIHRoaXMuCi0gICAgICovCi0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2NQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0dTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkdTOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0dTOwotICAgIC8qCi0gICAgICogbm90ZSB0aGUgbGFjayBvZiBERUNPREVfQ0xFQVJfU0VHT1ZSKHIpIHNpbmNlLCBoZXJlIGlzIG9uZSBvZiA0Ci0gICAgICogb3Bjb2RlIHN1YnJvdXRpbmVzIHdlIGRvIG5vdCB3YW50IHRvIGRvIHRoaXMuCi0gICAgICovCi0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2NiAtIHByZWZpeCBmb3IgMzItYml0IHJlZ2lzdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wcmVmaXhfZGF0YSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJEQVRBOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX0RBVEE7Ci0gICAgLyogbm90ZSBubyBERUNPREVfQ0xFQVJfU0VHT1ZSIGhlcmUuICovCi0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2NyAtIHByZWZpeCBmb3IgMzItYml0IGFkZHJlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3ByZWZpeF9hZGRyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFERFI6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9QUkVGSVhfQUREUjsKLSAgICAvKiBub3RlIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgaGVyZS4gKi8KLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDY4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX3dvcmRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIlBVU0hcdCV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKGltbSk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoKHUxNilpbW0pOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2OQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW11bF93b3JkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCSAgICBzMzIgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQkgICAgczE2IGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0JICAgIHMzMiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCSAgICBzMTYgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpc3JjdmFsICogKHMxNilpbW07Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQkgICAgczMyIGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0JICAgIHMxNiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQkgICAgczMyIGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpzcmNyZWcsKHMzMilpbW0pOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0JICAgIHUzMiByZXM7Ci0JICAgIHMxNiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgcmVzID0gKHMxNikqc3JjcmVnICogKHMxNilpbW07Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9ieXRlX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczE2IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaW1tID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIlBVU0hcdCVkXG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKGltbSk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NmIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2ltdWxfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICBzOCAgaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpc3JjdmFsICogKHMxNilpbW07Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpzcmNyZWcsKHMzMilpbW0pOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0JICAgIHUzMiByZXM7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgcmVzID0gKHMxNikqc3JjcmVnICogKHMxNilpbW07Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2YwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5zX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU5TQlxuIik7Ci0gICAgaW5zKDEpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NmQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOU0RcbiIpOwotCWlucyg0KTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOU1dcbiIpOwotCWlucygyKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3V0c19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9VVFNCXG4iKTsKLSAgICBvdXRzKDEpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NmYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX291dHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJPVVRTRFxuIik7Ci0Jb3V0cyg0KTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk9VVFNXXG4iKTsKLQlvdXRzKDIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDcwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIG92ZXJmbG93IGZsYWcgaXMgc2V0ICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKT1x0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9PRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3MQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05PKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgb3ZlcmZsb3cgaXMgbm90IHNldCAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk5PXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmICghQUNDRVNTX0ZMQUcoRl9PRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3MgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBjYXJyeSBmbGFnIGlzIHNldC4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpCXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDczCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTkIodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBjYXJyeSBmbGFnIGlzIGNsZWFyLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk5CXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmICghQUNDRVNTX0ZMQUcoRl9DRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3NAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX1oodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiB6ZXJvIGZsYWcgaXMgc2V0LiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSlpcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OWih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHplcm8gZmxhZyBpcyBjbGVhci4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpOWlx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoIUFDQ0VTU19GTEFHKEZfWkYpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9CRSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIGNhcnJ5IGZsYWcgaXMgc2V0IG9yIGlmIHRoZSB6ZXJvCi0gICAgICAgZmxhZyBpcyBzZXQuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKQkVcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OQkUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBjYXJyeSBmbGFnIGlzIGNsZWFyIGFuZCBpZiB0aGUgemVybwotICAgICAgIGZsYWcgaXMgY2xlYXIgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpOQkVcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKCEoQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRikpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9TKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgc2lnbiBmbGFnIGlzIHNldCAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSlNcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfU0YpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHNpZ24gZmxhZyBpcyBjbGVhciAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk5TXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmICghQUNDRVNTX0ZMQUcoRl9TRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX1AodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBwYXJpdHkgZmxhZyBpcyBzZXQgKGV2ZW4gcGFyaXR5KSAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSlBcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfUEYpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4N2IKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHBhcml0eSBmbGFnIGlzIGNsZWFyIChvZGQgcGFyaXR5KSAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk5QXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmICghQUNDRVNTX0ZMQUcoRl9QRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3YwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0wodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotICAgIGludCBzZiwgb2Y7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHNpZ24gZmxhZyBub3QgZXF1YWwgdG8gb3ZlcmZsb3cgZmxhZy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpMXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHNmID0gQUNDRVNTX0ZMQUcoRl9TRikgIT0gMDsKLSAgICBvZiA9IEFDQ0VTU19GTEFHKEZfT0YpICE9IDA7Ci0gICAgaWYgKHNmIF4gb2YpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3ZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05MKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLSAgICBpbnQgc2YsIG9mOwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBzaWduIGZsYWcgbm90IGVxdWFsIHRvIG92ZXJmbG93IGZsYWcuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTkxcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgc2YgPSBBQ0NFU1NfRkxBRyhGX1NGKSAhPSAwOwotICAgIG9mID0gQUNDRVNTX0ZMQUcoRl9PRikgIT0gMDsKLSAgICAvKiBub3RlOiBpbnZlcnNlIG9mIGFib3ZlLCBidXQgdXNpbmcgPT0gaW5zdGVhZCBvZiB4b3IuICovCi0gICAgaWYgKHNmID09IG9mKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4N2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9MRSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0gICAgaW50IHNmLCBvZjsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgc2lnbiBmbGFnIG5vdCBlcXVhbCB0byBvdmVyZmxvdyBmbGFnCi0gICAgICAgb3IgdGhlIHplcm8gZmxhZyBpcyBzZXQgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpMRVx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBzZiA9IEFDQ0VTU19GTEFHKEZfU0YpICE9IDA7Ci0gICAgb2YgPSBBQ0NFU1NfRkxBRyhGX09GKSAhPSAwOwotICAgIGlmICgoc2YgXiBvZikgfHwgQUNDRVNTX0ZMQUcoRl9aRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3ZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05MRSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0gICAgaW50IHNmLCBvZjsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgc2lnbiBmbGFnIGVxdWFsIHRvIG92ZXJmbG93IGZsYWcuCi0gICAgICAgYW5kIHRoZSB6ZXJvIGZsYWcgaXMgY2xlYXIgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpOTEVcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgc2YgPSBBQ0NFU1NfRkxBRyhGX1NGKSAhPSAwOwotICAgIG9mID0gQUNDRVNTX0ZMQUcoRl9PRikgIT0gMDsKLSAgICBpZiAoKHNmID09IG9mKSAmJiAhQUNDRVNTX0ZMQUcoRl9aRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLXN0YXRpYyB1OCAoKm9wYzgwX2J5dGVfb3BlcmF0aW9uW10pKHU4IGQsIHU4IHMpID0KLXsKLSAgICBhZGRfYnl0ZSwgICAgICAgICAgIC8qIDAwICovCi0gICAgb3JfYnl0ZSwgICAgICAgICAgICAvKiAwMSAqLwotICAgIGFkY19ieXRlLCAgICAgICAgICAgLyogMDIgKi8KLSAgICBzYmJfYnl0ZSwgICAgICAgICAgIC8qIDAzICovCi0gICAgYW5kX2J5dGUsICAgICAgICAgICAvKiAwNCAqLwotICAgIHN1Yl9ieXRlLCAgICAgICAgICAgLyogMDUgKi8KLSAgICB4b3JfYnl0ZSwgICAgICAgICAgIC8qIDA2ICovCi0gICAgY21wX2J5dGUsICAgICAgICAgICAvKiAwNyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDgwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGM4MF9ieXRlX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBpbW07Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIC8qCi0gICAgICogV2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mIHRoZSBvcGNvZGUKLSAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKLSAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiT1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjODBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQlpZiAocmggIT0gNykKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGM4MF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCWlmIChyaCAhPSA3KQotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wYzgwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JaWYgKHJoICE9IDcpCi0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wYzgwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOwotCWlmIChyaCAhPSA3KQotCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotc3RhdGljIHUxNiAoKm9wYzgxX3dvcmRfb3BlcmF0aW9uW10pKHUxNiBkLCB1MTYgcykgPQotewotICAgIGFkZF93b3JkLCAgICAgICAgICAgLyowMCAqLwotICAgIG9yX3dvcmQsICAgICAgICAgICAgLyowMSAqLwotICAgIGFkY193b3JkLCAgICAgICAgICAgLyowMiAqLwotICAgIHNiYl93b3JkLCAgICAgICAgICAgLyowMyAqLwotICAgIGFuZF93b3JkLCAgICAgICAgICAgLyowNCAqLwotICAgIHN1Yl93b3JkLCAgICAgICAgICAgLyowNSAqLwotICAgIHhvcl93b3JkLCAgICAgICAgICAgLyowNiAqLwotICAgIGNtcF93b3JkLCAgICAgICAgICAgLyowNyAqLwotfTsKLQotc3RhdGljIHUzMiAoKm9wYzgxX2xvbmdfb3BlcmF0aW9uW10pKHUzMiBkLCB1MzIgcykgPQotewotICAgIGFkZF9sb25nLCAgICAgICAgICAgLyowMCAqLwotICAgIG9yX2xvbmcsICAgICAgICAgICAgLyowMSAqLwotICAgIGFkY19sb25nLCAgICAgICAgICAgLyowMiAqLwotICAgIHNiYl9sb25nLCAgICAgICAgICAgLyowMyAqLwotICAgIGFuZF9sb25nLCAgICAgICAgICAgLyowNCAqLwotICAgIHN1Yl9sb25nLCAgICAgICAgICAgLyowNSAqLwotICAgIHhvcl9sb25nLCAgICAgICAgICAgLyowNiAqLwotICAgIGNtcF9sb25nLCAgICAgICAgICAgLyowNyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDgxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGM4MV93b3JkX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIC8qCi0gICAgICogV2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mIHRoZSBvcGNvZGUKLSAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKLSAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiT1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoKLSAgICAgKiBLbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICogbW9kZS4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBkZXN0dmFsLGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQkqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgZGVzdHZhbCxpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJKmRlc3RyZWcgPSBkZXN0dmFsOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi1zdGF0aWMgdTggKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltdKSh1OCBzLCB1OCBkKSA9Ci17Ci0gICAgYWRkX2J5dGUsICAgICAgICAgICAvKjAwICovCi0gICAgb3JfYnl0ZSwgICAgICAgICAgICAvKjAxICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgYWRjX2J5dGUsICAgICAgICAgICAvKjAyICovCi0gICAgc2JiX2J5dGUsICAgICAgICAgICAvKjAzICovCi0gICAgYW5kX2J5dGUsICAgICAgICAgICAvKjA0ICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgc3ViX2J5dGUsICAgICAgICAgICAvKjA1ICovCi0gICAgeG9yX2J5dGUsICAgICAgICAgICAvKjA2ICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgY21wX2J5dGUsICAgICAgICAgICAvKjA3ICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wYzgyX2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGltbTsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgLyoKLSAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YgdGhlIG9wY29kZQotICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAotICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24gU2ltaWxhciB0byBvcGNvZGUgODEsIGV4Y2VwdCB0aGF0Ci0gICAgICogdGhlIGltbWVkaWF0ZSBieXRlIGlzIHNpZ24gZXh0ZW5kZWQgdG8gYSB3b3JkIGxlbmd0aC4KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiT1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjODJfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQlpZiAocmggIT0gNykKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCWlmIChyaCAhPSA3KQotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wYzgyX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JaWYgKHJoICE9IDcpCi0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wYzgyX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOwotCWlmIChyaCAhPSA3KQotCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotc3RhdGljIHUxNiAoKm9wYzgzX3dvcmRfb3BlcmF0aW9uW10pKHUxNiBzLCB1MTYgZCkgPQotewotICAgIGFkZF93b3JkLCAgICAgICAgICAgLyowMCAqLwotICAgIG9yX3dvcmQsICAgICAgICAgICAgLyowMSAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIGFkY193b3JkLCAgICAgICAgICAgLyowMiAqLwotICAgIHNiYl93b3JkLCAgICAgICAgICAgLyowMyAqLwotICAgIGFuZF93b3JkLCAgICAgICAgICAgLyowNCAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIHN1Yl93b3JkLCAgICAgICAgICAgLyowNSAqLwotICAgIHhvcl93b3JkLCAgICAgICAgICAgLyowNiAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIGNtcF93b3JkLCAgICAgICAgICAgLyowNyAqLwotfTsKLQotc3RhdGljIHUzMiAoKm9wYzgzX2xvbmdfb3BlcmF0aW9uW10pKHUzMiBzLCB1MzIgZCkgPQotewotICAgIGFkZF9sb25nLCAgICAgICAgICAgLyowMCAqLwotICAgIG9yX2xvbmcsICAgICAgICAgICAgLyowMSAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIGFkY19sb25nLCAgICAgICAgICAgLyowMiAqLwotICAgIHNiYl9sb25nLCAgICAgICAgICAgLyowMyAqLwotICAgIGFuZF9sb25nLCAgICAgICAgICAgLyowNCAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIHN1Yl9sb25nLCAgICAgICAgICAgLyowNSAqLwotICAgIHhvcl9sb25nLCAgICAgICAgICAgLyowNiAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIGNtcF9sb25nLCAgICAgICAgICAgLyowNyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDgzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGM4M193b3JkX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIC8qCi0gICAgICogV2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mIHRoZSBvcGNvZGUKLSAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKLSAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uIFNpbWlsYXIgdG8gb3Bjb2RlIDgxLCBleGNlcHQgdGhhdAotICAgICAqIHRoZSBpbW1lZGlhdGUgYnl0ZSBpcyBzaWduIGV4dGVuZGVkIHRvIGEgd29yZCBsZW5ndGguCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLSAgICAgICBzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODNfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4M193b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4M19sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgzX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgzX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODNfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIGRlc3R2YWwsaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODNfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQkqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgZGVzdHZhbCxpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4M193b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCSpkZXN0cmVnID0gZGVzdHZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDg0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF90ZXN0X2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXRlc3RfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JdGVzdF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQl0ZXN0X2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQl0ZXN0X2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4NQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfdGVzdF93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3Rfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3RfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3RfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3Rfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4NgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ19ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLSAgICB1OCB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlhDSEdcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JdG1wID0gKnNyY3JlZzsKLQkqc3JjcmVnID0gZGVzdHZhbDsKLQlkZXN0dmFsID0gdG1wOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JdG1wID0gKnNyY3JlZzsKLQkqc3JjcmVnID0gZGVzdHZhbDsKLQlkZXN0dmFsID0gdG1wOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JdG1wID0gKnNyY3JlZzsKLQkqc3JjcmVnID0gZGVzdHZhbDsKLQlkZXN0dmFsID0gdG1wOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXRtcCA9ICpzcmNyZWc7Ci0JKnNyY3JlZyA9ICpkZXN0cmVnOwotCSpkZXN0cmVnID0gdG1wOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4NwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlhDSEdcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnOwotCSAgICB1MzIgZGVzdHZhbCx0bXA7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdG1wID0gKnNyY3JlZzsKLQkgICAgKnNyY3JlZyA9IGRlc3R2YWw7Ci0JICAgIGRlc3R2YWwgPSB0bXA7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZzsKLQkgICAgdTE2IGRlc3R2YWwsdG1wOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRtcCA9ICpzcmNyZWc7Ci0JICAgICpzcmNyZWcgPSBkZXN0dmFsOwotCSAgICBkZXN0dmFsID0gdG1wOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWc7Ci0JICAgIHUzMiBkZXN0dmFsLHRtcDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0bXAgPSAqc3JjcmVnOwotCSAgICAqc3JjcmVnID0gZGVzdHZhbDsKLQkgICAgZGVzdHZhbCA9IHRtcDsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnOwotCSAgICB1MTYgZGVzdHZhbCx0bXA7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdG1wID0gKnNyY3JlZzsKLQkgICAgKnNyY3JlZyA9IGRlc3R2YWw7Ci0JICAgIGRlc3R2YWwgPSB0bXA7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZzsKLQkgICAgdTMyIGRlc3R2YWwsdG1wOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRtcCA9ICpzcmNyZWc7Ci0JICAgICpzcmNyZWcgPSBkZXN0dmFsOwotCSAgICBkZXN0dmFsID0gdG1wOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWc7Ci0JICAgIHUxNiBkZXN0dmFsLHRtcDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0bXAgPSAqc3JjcmVnOwotCSAgICAqc3JjcmVnID0gZGVzdHZhbDsKLQkgICAgZGVzdHZhbCA9IHRtcDsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0JICAgIHUzMiB0bXA7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRtcCA9ICpzcmNyZWc7Ci0JICAgICpzcmNyZWcgPSAqZGVzdHJlZzsKLQkgICAgKmRlc3RyZWcgPSB0bXA7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0JICAgIHUxNiB0bXA7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRtcCA9ICpzcmNyZWc7Ci0JICAgICpzcmNyZWcgPSAqZGVzdHJlZzsKLQkgICAgKmRlc3RyZWcgPSB0bXA7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4OAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDg5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKnNyY3JlZzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OGEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSAqc3JjcmVnOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4YgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCAqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCAqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4YwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUk1fU1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1MTYgKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHUxNiBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICpzcmNyZWc7Ci0Jc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKnNyY3JlZzsKLQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAqc3JjcmVnOwotCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSAqc3JjcmVnOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4ZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbGVhX3dvcmRfUl9NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTE2ICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0vKgotICogVE9ETzogTmVlZCB0byBoYW5kbGUgYWRkcmVzcyBzaXplIHByZWZpeCEKLSAqCi0gKiBsZWEgIGVheCxbZWF4K2VieCoyXSA/PwotICovCi0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxFQVx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKnNyY3JlZyA9ICh1MTYpZGVzdG9mZnNldDsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0Jc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpzcmNyZWcgPSAodTE2KWRlc3RvZmZzZXQ7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqc3JjcmVnID0gKHUxNilkZXN0b2Zmc2V0OwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCS8qIHVuZGVmaW5lZC4gIERvIG5vdGhpbmcuICovCi0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDhlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9TUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHUxNiAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1MTYgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSAqc3JjcmVnOwotCWJyZWFrOwotICAgIH0KLSAgICAvKgotICAgICAqIENsZWFuIHVwLCBhbmQgcmVzZXQgYWxsIHRoZSBSX3hTUCBwb2ludGVycyB0byB0aGUgY29ycmVjdAotICAgICAqIGxvY2F0aW9ucy4gIFRoaXMgaXMgYWJvdXQgM3ggdG9vIG11Y2ggb3ZlcmhlYWQgKGRvaW5nIGFsbCB0aGUKLSAgICAgKiBzZWdyZWcgcHRycyB3aGVuIG9ubHkgb25lIGlzIG5lZWRlZCwgYnV0IHRoaXMgaW5zdHJ1Y3Rpb24KLSAgICAgKiAqY2Fubm90KiBiZSB0aGF0IGNvbW1vbiwgYW5kIHRoaXMgaXNuJ3QgdG9vIG11Y2ggd29yayBhbnl3YXkuCi0gICAgICovCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OGYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUE9QXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIGlmIChyaCAhPSAwKSB7Ci0JREVDT0RFX1BSSU5URigiSUxMRUdBTCBERUNPREUgT0YgT1BDT0RFIDhGXG4iKTsKLQlIQUxUX1NZUygpOwotICAgIH0KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gcG9wX2xvbmcoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHBvcF93b3JkKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBwb3BfbG9uZygpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gcG9wX3dvcmQoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHBvcF9sb25nKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBwb3Bfd29yZCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBwb3BfbG9uZygpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHBvcF93b3JkKCk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5MAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfbm9wKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk5PUFxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5MQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX0NYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRUNYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLENYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl0bXAgPSBNLng4Ni5SX0VBWDsKLQlNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRUNYOwotCU0ueDg2LlJfRUNYID0gdG1wOwotICAgIH0gZWxzZSB7Ci0JdG1wID0gTS54ODYuUl9BWDsKLQlNLng4Ni5SX0FYID0gTS54ODYuUl9DWDsKLQlNLng4Ni5SX0NYID0gKHUxNil0bXA7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDkyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFRFhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0QVgsRFhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXRtcCA9IE0ueDg2LlJfRUFYOwotCU0ueDg2LlJfRUFYID0gTS54ODYuUl9FRFg7Ci0JTS54ODYuUl9FRFggPSB0bXA7Ci0gICAgfSBlbHNlIHsKLQl0bXAgPSBNLng4Ni5SX0FYOwotCU0ueDg2LlJfQVggPSBNLng4Ni5SX0RYOwotCU0ueDg2LlJfRFggPSAodTE2KXRtcDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9CWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVCWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxCWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdG1wID0gTS54ODYuUl9FQVg7Ci0JTS54ODYuUl9FQVggPSBNLng4Ni5SX0VCWDsKLQlNLng4Ni5SX0VCWCA9IHRtcDsKLSAgICB9IGVsc2UgewotCXRtcCA9IE0ueDg2LlJfQVg7Ci0JTS54ODYuUl9BWCA9IE0ueDg2LlJfQlg7Ci0JTS54ODYuUl9CWCA9ICh1MTYpdG1wOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5NAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX1NQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRVNQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLFNQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl0bXAgPSBNLng4Ni5SX0VBWDsKLQlNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRVNQOwotCU0ueDg2LlJfRVNQID0gdG1wOwotICAgIH0gZWxzZSB7Ci0JdG1wID0gTS54ODYuUl9BWDsKLQlNLng4Ni5SX0FYID0gTS54ODYuUl9TUDsKLQlNLng4Ni5SX1NQID0gKHUxNil0bXA7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDk1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfQlAodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFQlBcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0QVgsQlBcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXRtcCA9IE0ueDg2LlJfRUFYOwotCU0ueDg2LlJfRUFYID0gTS54ODYuUl9FQlA7Ci0JTS54ODYuUl9FQlAgPSB0bXA7Ci0gICAgfSBlbHNlIHsKLQl0bXAgPSBNLng4Ni5SX0FYOwotCU0ueDg2LlJfQVggPSBNLng4Ni5SX0JQOwotCU0ueDg2LlJfQlAgPSAodTE2KXRtcDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9TSSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVTSVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxTSVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdG1wID0gTS54ODYuUl9FQVg7Ci0JTS54ODYuUl9FQVggPSBNLng4Ni5SX0VTSTsKLQlNLng4Ni5SX0VTSSA9IHRtcDsKLSAgICB9IGVsc2UgewotCXRtcCA9IE0ueDg2LlJfQVg7Ci0JTS54ODYuUl9BWCA9IE0ueDg2LlJfU0k7Ci0JTS54ODYuUl9TSSA9ICh1MTYpdG1wOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5NwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX0RJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRURJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLERJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl0bXAgPSBNLng4Ni5SX0VBWDsKLQlNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRURJOwotCU0ueDg2LlJfRURJID0gdG1wOwotICAgIH0gZWxzZSB7Ci0JdG1wID0gTS54ODYuUl9BWDsKLQlNLng4Ni5SX0FYID0gTS54ODYuUl9ESTsKLQlNLng4Ni5SX0RJID0gKHUxNil0bXA7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDk4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jYncodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiQ1dERVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJDQldcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCWlmIChNLng4Ni5SX0FYICYgMHg4MDAwKSB7Ci0JICAgIE0ueDg2LlJfRUFYIHw9IDB4ZmZmZjAwMDA7Ci0JfSBlbHNlIHsKLQkgICAgTS54ODYuUl9FQVggJj0gMHgwMDAwZmZmZjsKLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiAoTS54ODYuUl9BTCAmIDB4ODApIHsKLQkgICAgTS54ODYuUl9BSCA9IDB4ZmY7Ci0JfSBlbHNlIHsKLQkgICAgTS54ODYuUl9BSCA9IDB4MDsKLQl9Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDk5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jd2QodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiQ0RRXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkNXRFxuIik7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYoIkNXRFxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlpZiAoTS54ODYuUl9FQVggJiAweDgwMDAwMDAwKSB7Ci0JICAgIE0ueDg2LlJfRURYID0gMHhmZmZmZmZmZjsKLQl9IGVsc2UgewotCSAgICBNLng4Ni5SX0VEWCA9IDB4MDsKLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiAoTS54ODYuUl9BWCAmIDB4ODAwMCkgewotCSAgICBNLng4Ni5SX0RYID0gMHhmZmZmOwotCX0gZWxzZSB7Ci0JICAgIE0ueDg2LlJfRFggPSAweDA7Ci0JfQotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY2FsbF9mYXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgZmFyc2VnLCBmYXJvZmY7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotCURFQ09ERV9QUklOVEYoIkNBTExcdCIpOwotCWZhcm9mZiA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JZmFyc2VnID0gZmV0Y2hfd29yZF9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiJTA0eDoiLCBmYXJzZWcpOwotCURFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBmYXJvZmYpOwotCUNBTExfVFJBQ0UoTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCBmYXJzZWcsIGZhcm9mZiwgIkZBUiAiKTsKLQotICAgIC8qIFhYWAotICAgICAqCi0gICAgICogSG9va2VkIGludGVycnVwdCB2ZWN0b3JzIGNhbGxpbmcgaW50byBvdXIgIkJJT1MiIHdpbGwgY2F1c2UKLSAgICAgKiBwcm9ibGVtcyB1bmxlc3MgYWxsIGludGVyc2VnbWVudCBzdHVmZiBpcyBjaGVja2VkIGZvciBCSU9TCi0gICAgICogYWNjZXNzLiAgQ2hlY2sgbmVlZGVkIGhlcmUuICBGb3IgbW9tZW50LCBsZXQgaXQgYWxvbmUuCi0gICAgICovCi0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0gICAgTS54ODYuUl9DUyA9IGZhcnNlZzsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0gICAgTS54ODYuUl9JUCA9IGZhcm9mZjsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5YgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfd2FpdCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJXQUlUIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICAvKiBOQURBLiAgKi8KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5YwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaGZfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIGZsYWdzOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIRkRcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSEZcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCi0gICAgLyogY2xlYXIgb3V0ICphbGwqIGJpdHMgbm90IHJlcHJlc2VudGluZyBmbGFncywgYW5kIHR1cm4gb24gcmVhbCBiaXRzICovCi0gICAgZmxhZ3MgPSAoTS54ODYuUl9FRkxHICYgRl9NU0spIHwgRl9BTFdBWVNfT047Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKGZsYWdzKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZCgodTE2KWZsYWdzKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcGZfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BGRFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BGXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VGTEcgPSBwb3BfbG9uZygpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9GTEcgPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2FoZih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTQUhGXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIC8qIGNsZWFyIHRoZSBsb3dlciBiaXRzIG9mIHRoZSBmbGFnIHJlZ2lzdGVyICovCi0gICAgTS54ODYuUl9GTEcgJj0gMHhmZmZmZmYwMDsKLSAgICAvKiBvciBpbiB0aGUgQUggcmVnaXN0ZXIgaW50byB0aGUgZmxhZ3MgcmVnaXN0ZXIgKi8KLSAgICBNLng4Ni5SX0ZMRyB8PSBNLng4Ni5SX0FIOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDlmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sYWhmKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxBSEZcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JTS54ODYuUl9BSCA9ICh1OCkoTS54ODYuUl9GTEcgJiAweGZmKTsKLSAgICAvKnVuZG9jdW1lbnRlZCBUQysrIGJlaGF2aW9yPz8/IE5vcGUuICBJdCdzIGRvY3VtZW50ZWQsIGJ1dAotICAgICAgIHlvdSBoYXZlIHRvbyBsb29rIHJlYWwgaGFyZCB0byBub3RpY2UgaXQuICovCi0gICAgTS54ODYuUl9BSCB8PSAweDI7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9BTF9NX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRBTCwiKTsKLSAgICBvZmZzZXQgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCJbJTA0eF1cbiIsIG9mZnNldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gZmV0Y2hfZGF0YV9ieXRlKG9mZnNldCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9BWF9NX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGMigiTU9WXHRFQVgsWyUwNHhdXG4iLCBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URjIoIk1PVlx0QVgsWyUwNHhdXG4iLCBvZmZzZXQpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gZmV0Y2hfZGF0YV9sb25nKG9mZnNldCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gZmV0Y2hfZGF0YV93b3JkKG9mZnNldCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGEyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfTV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiWyUwNHhdLEFMXG4iLCBvZmZzZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgc3RvcmVfZGF0YV9ieXRlKG9mZnNldCwgTS54ODYuUl9BTCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9NX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGMigiTU9WXHRbJTA0eF0sRUFYXG4iLCBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URjIoIk1PVlx0WyUwNHhdLEFYXG4iLCBvZmZzZXQpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXN0b3JlX2RhdGFfbG9uZyhvZmZzZXQsIE0ueDg2LlJfRUFYKTsKLSAgICB9IGVsc2UgewotCXN0b3JlX2RhdGFfd29yZChvZmZzZXQsIE0ueDg2LlJfQVgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92c19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCAgdmFsOwotICAgIHUzMiBjb3VudDsKLSAgICBpbnQgaW5jOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZTXHRCWVRFXG4iKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCWluYyA9IC0xOwotICAgIGVsc2UKLQlpbmMgPSAxOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgY291bnQgPSAxOwotICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKLQkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0JY291bnQgPSBNLng4Ni5SX0NYOwotCU0ueDg2LlJfQ1ggPSAwOwotCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOwotICAgIH0KLSAgICB3aGlsZSAoY291bnQtLSkgewotCXZhbCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKLQlzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIHZhbCk7Ci0JTS54ODYuUl9TSSArPSBpbmM7Ci0JTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGE1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB2YWw7Ci0gICAgaW50IGluYzsKLSAgICB1MzIgY291bnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlNcdERXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtNDsKLQllbHNlCi0JICAgIGluYyA9IDQ7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZTXHRXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtMjsKLQllbHNlCi0JICAgIGluYyA9IDI7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgY291bnQgPSAxOwotICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKLQkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0JY291bnQgPSBNLng4Ni5SX0NYOwotCU0ueDg2LlJfQ1ggPSAwOwotCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOwotICAgIH0KLSAgICB3aGlsZSAoY291bnQtLSkgewotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB2YWwgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgdmFsKTsKLQl9IGVsc2UgewotCSAgICB2YWwgPSBmZXRjaF9kYXRhX3dvcmQoTS54ODYuUl9TSSk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgKHUxNil2YWwpOwotCX0KLQlNLng4Ni5SX1NJICs9IGluYzsKLQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtcHNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggdmFsMSwgdmFsMjsKLSAgICBpbnQgaW5jOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTVBTXHRCWVRFXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JaW5jID0gLTE7Ci0gICAgZWxzZQotCWluYyA9IDE7Ci0KLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUEUpIHsKLQkvKiBSRVBFICAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgdmFsMSA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKLQkgICAgdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCSAgICAgY21wX2J5dGUodmFsMSwgdmFsMik7Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9TSSArPSBpbmM7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCkKLQkJYnJlYWs7Ci0JfQotCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUEU7Ci0gICAgfSBlbHNlIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpIHsKLQkvKiBSRVBORSAgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIHZhbDEgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7Ci0JICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCSAgICBjbXBfYnl0ZSh2YWwxLCB2YWwyKTsKLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX1NJICs9IGluYzsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKLQkJYnJlYWs7ICAgICAgICAgIC8qIHplcm8gZmxhZyBzZXQgbWVhbnMgZXF1YWwgKi8KLQl9Ci0JTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQTkU7Ci0gICAgfSBlbHNlIHsKLQl2YWwxID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOwotCXZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCWNtcF9ieXRlKHZhbDEsIHZhbDIpOwotCU0ueDg2LlJfU0kgKz0gaW5jOwotCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21wc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdmFsMSx2YWwyOwotICAgIGludCBpbmM7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkNNUFNcdERXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtNDsKLQllbHNlCi0JICAgIGluYyA9IDQ7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJDTVBTXHRXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtMjsKLQllbHNlCi0JICAgIGluYyA9IDI7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBFKSB7Ci0JLyogUkVQRSAgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl2YWwxID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOwotCQl2YWwyID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJY21wX2xvbmcodmFsMSwgdmFsMik7Ci0JICAgIH0gZWxzZSB7Ci0JCXZhbDEgPSBmZXRjaF9kYXRhX3dvcmQoTS54ODYuUl9TSSk7Ci0JCXZhbDIgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQljbXBfd29yZCgodTE2KXZhbDEsICh1MTYpdmFsMik7Ci0JICAgIH0KLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX1NJICs9IGluYzsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQotCQlicmVhazsKLQl9Ci0JTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKLSAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgewotCS8qIFJFUE5FICAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXZhbDEgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7Ci0JCXZhbDIgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQljbXBfbG9uZyh2YWwxLCB2YWwyKTsKLQkgICAgfSBlbHNlIHsKLQkJdmFsMSA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKLQkJdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCWNtcF93b3JkKCh1MTYpdmFsMSwgKHUxNil2YWwyKTsKLQkgICAgfQotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfU0kgKz0gaW5jOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpKQotCQlicmVhazsgICAgICAgICAgLyogemVybyBmbGFnIHNldCBtZWFucyBlcXVhbCAqLwotCX0KLQlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBORTsKLSAgICB9IGVsc2UgewotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB2YWwxID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOwotCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkgICAgY21wX2xvbmcodmFsMSwgdmFsMik7Ci0JfSBlbHNlIHsKLQkgICAgdmFsMSA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKLQkgICAgdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JICAgIGNtcF93b3JkKCh1MTYpdmFsMSwgKHUxNil2YWwyKTsKLQl9Ci0JTS54ODYuUl9TSSArPSBpbmM7Ci0JTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGE4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF90ZXN0X0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiVEVTVFx0QUwsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCXRlc3RfYnl0ZShNLng4Ni5SX0FMLCAodTgpaW1tKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfdGVzdF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlRFU1RcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiVEVTVFx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdGVzdF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JdGVzdF93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YWEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N0b3NfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IGluYzsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1RPU1x0QllURVxuIik7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQlpbmMgPSAtMTsKLSAgICBlbHNlCi0JaW5jID0gMTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKLQkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICBzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIE0ueDg2LlJfQUwpOwotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCX0KLQlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKLSAgICB9IGVsc2UgewotCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BTCk7Ci0JTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGFiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdG9zX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBpbmM7Ci0gICAgdTMyIGNvdW50OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJTVE9TXHREV09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTQ7Ci0JZWxzZQotCSAgICBpbmMgPSA0OwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiU1RPU1x0V09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTI7Ci0JZWxzZQotCSAgICBpbmMgPSAyOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGNvdW50ID0gMTsKLSAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7Ci0JLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCWNvdW50ID0gTS54ODYuUl9DWDsKLQlNLng4Ni5SX0NYID0gMDsKLQlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKLSAgICB9Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgc3RvcmVfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0VBWCk7Ci0JfSBlbHNlIHsKLQkgICAgc3RvcmVfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0FYKTsKLQl9Ci0JTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGFjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sb2RzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBpbmM7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxPRFNcdEJZVEVcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQlpbmMgPSAtMTsKLSAgICBlbHNlCi0JaW5jID0gMTsKLSAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7Ci0JLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX1NJICs9IGluYzsKLQl9Ci0JTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FMID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOwotCU0ueDg2LlJfU0kgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbG9kc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgaW5jOwotICAgIHUzMiBjb3VudDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTE9EU1x0RFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JICAgIGluYyA9IC00OwotCWVsc2UKLQkgICAgaW5jID0gNDsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkxPRFNcdFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JICAgIGluYyA9IC0yOwotCWVsc2UKLQkgICAgaW5jID0gMjsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBjb3VudCA9IDE7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgewotCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQljb3VudCA9IE0ueDg2LlJfQ1g7Ci0JTS54ODYuUl9DWCA9IDA7Ci0JTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7Ci0gICAgfQotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIE0ueDg2LlJfRUFYID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOwotCX0gZWxzZSB7Ci0JICAgIE0ueDg2LlJfQVggPSBmZXRjaF9kYXRhX3dvcmQoTS54ODYuUl9TSSk7Ci0JfQotCU0ueDg2LlJfU0kgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2Nhc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCB2YWwyOwotICAgIGludCBpbmM7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNDQVNcdEJZVEVcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQlpbmMgPSAtMTsKLSAgICBlbHNlCi0JaW5jID0gMTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUEUpIHsKLQkvKiBSRVBFICAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JICAgIGNtcF9ieXRlKE0ueDg2LlJfQUwsIHZhbDIpOwotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCkKLQkJYnJlYWs7Ci0JfQotCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUEU7Ci0gICAgfSBlbHNlIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpIHsKLQkvKiBSRVBORSAgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCSAgICBjbXBfYnl0ZShNLng4Ni5SX0FMLCB2YWwyKTsKLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpKQotCQlicmVhazsgICAgICAgICAgLyogemVybyBmbGFnIHNldCBtZWFucyBlcXVhbCAqLwotCX0KLQlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBORTsKLSAgICB9IGVsc2UgewotCXZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCWNtcF9ieXRlKE0ueDg2LlJfQUwsIHZhbDIpOwotCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2Nhc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgaW5jOwotICAgIHUzMiB2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlNDQVNcdERXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtNDsKLQllbHNlCi0JICAgIGluYyA9IDQ7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJTQ0FTXHRXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtMjsKLQllbHNlCi0JICAgIGluYyA9IDI7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBFKSB7Ci0JLyogUkVQRSAgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl2YWwgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQljbXBfbG9uZyhNLng4Ni5SX0VBWCwgdmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdmFsID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNil2YWwpOwotCSAgICB9Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQotCQlicmVhazsKLQl9Ci0JTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKLSAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgewotCS8qIFJFUE5FICAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXZhbCA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCWNtcF9sb25nKE0ueDg2LlJfRUFYLCB2YWwpOwotCSAgICB9IGVsc2UgewotCQl2YWwgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQljbXBfd29yZChNLng4Ni5SX0FYLCAodTE2KXZhbCk7Ci0JICAgIH0KLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpKQotCQlicmVhazsgICAgICAgICAgLyogemVybyBmbGFnIHNldCBtZWFucyBlcXVhbCAqLwotCX0KLQlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBORTsKLSAgICB9IGVsc2UgewotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB2YWwgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCSAgICBjbXBfbG9uZyhNLng4Ni5SX0VBWCwgdmFsKTsKLQl9IGVsc2UgewotCSAgICB2YWwgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCSAgICBjbXBfd29yZChNLng4Ni5SX0FYLCAodTE2KXZhbCk7Ci0JfQotCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QUwsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGIxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9DTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRDTCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQ0wgPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX0RMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdERMLCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9ETCA9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfQkxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QkwsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0JMID0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGI0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9BSF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRBSCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUggPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX0NIX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdENILCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9DSCA9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfREhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0REgsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0RIID0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGI3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9CSF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRCSCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQkggPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBzcmN2YWw7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gKHUxNilzcmN2YWw7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGI5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9DWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RUNYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdENYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUNYID0gc3JjdmFsOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9DWCA9ICh1MTYpc3JjdmFsOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfRFhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEVEWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHREWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VEWCA9IHNyY3ZhbDsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfRFggPSAodTE2KXNyY3ZhbDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YmIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX0JYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRFQlgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlx0QlgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQlggPSBzcmN2YWw7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0JYID0gKHUxNilzcmN2YWw7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGJjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9TUF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RVNQLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdFNQLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRVNQID0gc3JjdmFsOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9TUCA9ICh1MTYpc3JjdmFsOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfQlBfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEVCUCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRCUCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VCUCA9IHNyY3ZhbDsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQlAgPSAodTE2KXNyY3ZhbDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX1NJX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRFU0ksIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlx0U0ksIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FU0kgPSBzcmN2YWw7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX1NJID0gKHUxNilzcmN2YWw7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGJmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9ESV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RURJLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdERJLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURJID0gc3JjdmFsOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9ESSA9ICh1MTYpc3JjdmFsOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qIHVzZWQgYnkgb3Bjb2RlcyBjMCwgZDAsIGFuZCBkMi4gKi8KLXN0YXRpYyB1OCgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bXSkodTggZCwgdTggcykgPQotewotICAgIHJvbF9ieXRlLAotICAgIHJvcl9ieXRlLAotICAgIHJjbF9ieXRlLAotICAgIHJjcl9ieXRlLAotICAgIHNobF9ieXRlLAotICAgIHNocl9ieXRlLAotICAgIHNobF9ieXRlLCAgICAgICAgICAgLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCi0gICAgc2FyX2J5dGUsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0MwX2J5dGVfUk1fTUVNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0gICAgdTggYW10OwotCi0gICAgLyoKLSAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKLSAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAotICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCWFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCWFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOwotCSpkZXN0cmVnID0gZGVzdHZhbDsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKiB1c2VkIGJ5IG9wY29kZXMgYzEsIGQxLCBhbmQgZDMuICovCi1zdGF0aWMgdTE2KCpvcGNEMV93b3JkX29wZXJhdGlvbltdKSh1MTYgcywgdTggZCkgPQotewotICAgIHJvbF93b3JkLAotICAgIHJvcl93b3JkLAotICAgIHJjbF93b3JkLAotICAgIHJjcl93b3JkLAotICAgIHNobF93b3JkLAotICAgIHNocl93b3JkLAotICAgIHNobF93b3JkLCAgICAgICAgICAgLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCi0gICAgc2FyX3dvcmQsCi19OwotCi0vKiB1c2VkIGJ5IG9wY29kZXMgYzEsIGQxLCBhbmQgZDMuICovCi1zdGF0aWMgdTMyICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bXSkodTMyIHMsIHU4IGQpID0KLXsKLSAgICByb2xfbG9uZywKLSAgICByb3JfbG9uZywKLSAgICByY2xfbG9uZywKLSAgICByY3JfbG9uZywKLSAgICBzaGxfbG9uZywKLSAgICBzaHJfbG9uZywKLSAgICBzaGxfbG9uZywgICAgICAgICAgIC8qIHNhbF9ieXRlID09PSBzaGxfYnl0ZSAgYnkgZGVmaW5pdGlvbiAqLwotICAgIHNhcl9sb25nLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGMxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNDMV93b3JkX1JNX01FTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBhbXQ7Ci0KLSAgICAvKgotICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgotICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCi0gICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcmV0X25lYXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJSRVRcdCIpOwotICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCVJFVFVSTl9UUkFDRSgiUkVUIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKLSAgICBNLng4Ni5SX1NQICs9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcmV0X25lYXIodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUkVUXG4iKTsKLQlSRVRVUk5fVFJBQ0UoIlJFVCIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xlc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmgsIHJsOwotICAgIHUxNiAqZHN0cmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMRVNcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRVMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0VTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9FUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkvKiBVTkRFRklORUQhICovCi0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xkc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmgsIHJsOwotICAgIHUxNiAqZHN0cmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMRFNcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRFMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0RTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9EUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkvKiBVTkRFRklORUQhICovCi0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBpZiAocmggIT0gMCkgewotCURFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RFIE9GIE9QQ09ERSBjNlxuIik7Ci0JSEFMVF9TWVMoKTsKLSAgICB9Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwlMnhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgaW1tKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwlMnhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgaW1tKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwlMnhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgaW1tKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwlMnhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGltbTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIGlmIChyaCAhPSAwKSB7Ci0JREVDT0RFX1BSSU5URigiSUxMRUdBTCBERUNPREUgT0YgT1BDT0RFIDhGXG4iKTsKLQlIQUxUX1NZUygpOwotICAgIH0KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGltbSk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgaW1tKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgaW1tKTsKLQl9IGVsc2UgewotCSAgICB1MTYgaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBpbW0pOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBpbW0pOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGltbSk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJdTMyICpkZXN0cmVnOwotCQkJdTMyIGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGltbTsKLQl9IGVsc2UgewotCQkJdTE2ICpkZXN0cmVnOwotCQkJdTE2IGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGltbTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGM4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9lbnRlcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IGxvY2FsLGZyYW1lX3BvaW50ZXI7Ci0gICAgdTggIG5lc3Rpbmc7Ci0gICAgaW50IGk7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGxvY2FsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBuZXN0aW5nID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiRU5URVIgJXhcbiIsIGxvY2FsKTsKLSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBuZXN0aW5nKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0JQKTsKLSAgICBmcmFtZV9wb2ludGVyID0gTS54ODYuUl9TUDsKLSAgICBpZiAobmVzdGluZyA+IDApIHsKLQlmb3IgKGkgPSAxOyBpIDwgbmVzdGluZzsgaSsrKSB7Ci0JICAgIE0ueDg2LlJfQlAgLT0gMjsKLQkgICAgcHVzaF93b3JkKGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9TUywgTS54ODYuUl9CUCkpOwotCSAgICB9Ci0JcHVzaF93b3JkKGZyYW1lX3BvaW50ZXIpOwotCX0KLSAgICBNLng4Ni5SX0JQID0gZnJhbWVfcG9pbnRlcjsKLSAgICBNLng4Ni5SX1NQID0gKHUxNikoTS54ODYuUl9TUCAtIGxvY2FsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbGVhdmUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTEVBVkVcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9TUCA9IE0ueDg2LlJfQlA7Ci0gICAgTS54ODYuUl9CUCA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4Y2EKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3JldF9mYXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJSRVRGXHQiKTsKLSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQlSRVRVUk5fVFJBQ0UoIlJFVEYiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOwotICAgIE0ueDg2LlJfQ1MgPSBwb3Bfd29yZCgpOwotICAgIE0ueDg2LlJfU1AgKz0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGNiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9yZXRfZmFyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlJFVEZcbiIpOwotCVJFVFVSTl9UUkFDRSgiUkVURiIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7Ci0gICAgTS54ODYuUl9DUyA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4Y2MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2ludDModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklOVCAzXG4iKTsKLSAgICB0bXAgPSAodTE2KSBtZW1fYWNjZXNzX3dvcmQoMyAqIDQgKyAyKTsKLSAgICAvKiBhY2Nlc3MgdGhlIHNlZ21lbnQgcmVnaXN0ZXIgKi8KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCWlmIChfWDg2RU1VX2ludHJUYWJbM10pIHsKLQkJKCpfWDg2RU1VX2ludHJUYWJbM10pKDMpOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOwotCUNMRUFSX0ZMQUcoRl9JRik7Ci0JQ0xFQVJfRkxBRyhGX1RGKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0JTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZCgzICogNCArIDIpOwotCXB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQlNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKDMgKiA0KTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4Y2QKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2ludF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiB0bXA7Ci0gICAgdTggaW50bnVtOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTlRcdCIpOwotICAgIGludG51bSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbnRudW0pOwotICAgIHRtcCA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0ICsgMik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLQlpZiAoX1g4NkVNVV9pbnRyVGFiW2ludG51bV0pIHsKLQkJKCpfWDg2RU1VX2ludHJUYWJbaW50bnVtXSkoaW50bnVtKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZCgodTE2KU0ueDg2LlJfRkxHKTsKLQlDTEVBUl9GTEFHKEZfSUYpOwotCUNMRUFSX0ZMQUcoRl9URik7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotCU0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoaW50bnVtICogNCArIDIpOwotCXB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQlNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKGludG51bSAqIDQpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW50byh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU5UT1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9PRikpIHsKLQl0bXAgPSBtZW1fYWNjZXNzX3dvcmQoNCAqIDQgKyAyKTsKLQkJaWYgKF9YODZFTVVfaW50clRhYls0XSkgewotCQkJKCpfWDg2RU1VX2ludHJUYWJbNF0pKDQpOwotCX0gZWxzZSB7Ci0JICAgIHB1c2hfd29yZCgodTE2KU0ueDg2LlJfRkxHKTsKLQkgICAgQ0xFQVJfRkxBRyhGX0lGKTsKLQkgICAgQ0xFQVJfRkxBRyhGX1RGKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotCSAgICBNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKDQgKiA0ICsgMik7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkgICAgTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZCg0ICogNCk7Ci0JfQotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaXJldCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJUkVUXG4iKTsKLQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0KLSAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKLSAgICBNLng4Ni5SX0NTID0gcG9wX3dvcmQoKTsKLSAgICBNLng4Ni5SX0ZMRyA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZDAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0QwX2J5dGVfUk1fMSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgLyoKLSAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKLSAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAotICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLDFcbiIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgMSk7Ci0JKmRlc3RyZWcgPSBkZXN0dmFsOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhkMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjRDFfd29yZF9STV8xKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgLyoKLSAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKLSAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAotICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQl1MzIgZGVzdHZhbDsKLQkJCXUzMiAqZGVzdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCAxKTsKLQkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOwotCX0gZWxzZSB7Ci0JCQl1MTYgZGVzdHZhbDsKLQkJCXUxNiAqZGVzdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCAxKTsKLQkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZDIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0QyX2J5dGVfUk1fQ0wodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLSAgICB1OCBhbXQ7Ci0KLSAgICAvKgotICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgotICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCi0gICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgYW10ID0gTS54ODYuUl9DTDsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOwotCSpkZXN0cmVnID0gZGVzdHZhbDsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZDMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0QzX3dvcmRfUk1fQ0wodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggYW10OwotCi0gICAgLyoKLSAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKLSAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAotICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIGFtdCA9IE0ueDg2LlJfQ0w7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZDQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FhbSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggYTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUFNXG4iKTsKLSAgICBhID0gZmV0Y2hfYnl0ZV9pbW0oKTsgICAgICAvKiB0aGlzIGlzIGEgc3R1cGlkIGVuY29kaW5nLiAqLwotICAgIGlmIChhICE9IDEwKSB7Ci0JREVDT0RFX1BSSU5URigiRVJST1IgREVDT0RJTkcgQUFNXG4iKTsKLQlUUkFDRV9SRUdTKCk7Ci0JSEFMVF9TWVMoKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICAvKiBub3RlIHRoZSB0eXBlIGNoYW5nZSBoZXJlIC0tLSByZXR1cm5pbmcgQUwgYW5kIEFIIGluIEFYLiAqLwotICAgIE0ueDg2LlJfQVggPSBhYW1fd29yZChNLng4Ni5SX0FMKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhkNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWFkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBhOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBQURcbiIpOwotICAgIGEgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BWCA9IGFhZF93b3JkKE0ueDg2LlJfQVgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyogb3Bjb2RlIDB4ZDYgSUxMRUdBTCBPUENPREUgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGQ3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94bGF0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgYWRkcjsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiWExBVFxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLQlhZGRyID0gKHUxNikoTS54ODYuUl9CWCArICh1OClNLng4Ni5SX0FMKTsKLSAgICBNLng4Ni5SX0FMID0gZmV0Y2hfZGF0YV9ieXRlKGFkZHIpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyogaW5zdHVjdGlvbnMgIEQ4IC4uIERGIGFyZSBpbiBpODdfb3BzLmMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGUwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sb29wbmUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHMxNiBpcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTE9PUE5FXHQiKTsKLSAgICBpcCA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBpcCArPSAoczE2KSBNLng4Ni5SX0lQOwotICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0NYIC09IDE7Ci0gICAgaWYgKE0ueDg2LlJfQ1ggIT0gMCAmJiAhQUNDRVNTX0ZMQUcoRl9aRikpICAgICAgLyogQ1ggIT0gMCBhbmQgIVpGICovCi0JTS54ODYuUl9JUCA9IGlwOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGUxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sb29wZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczE2IGlwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMT09QRVx0Iik7Ci0gICAgaXAgPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgaXAgKz0gKHMxNikgTS54ODYuUl9JUDsKLSAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9DWCAtPSAxOwotICAgIGlmIChNLng4Ni5SX0NYICE9IDAgJiYgQUNDRVNTX0ZMQUcoRl9aRikpICAgICAgIC8qIENYICE9IDAgYW5kIFpGICovCi0JTS54ODYuUl9JUCA9IGlwOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGUyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sb29wKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzMTYgaXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxPT1BcdCIpOwotICAgIGlwID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIGlwICs9IChzMTYpIE0ueDg2LlJfSVA7Ci0gICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQ1ggLT0gMTsKLSAgICBpZiAoTS54ODYuUl9DWCAhPSAwKQotCU0ueDg2LlJfSVAgPSBpcDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfamN4eih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IHRhcmdldDsKLSAgICBzOCAgb2Zmc2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBvdmVyZmxvdyBmbGFnIGlzIHNldCAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSkNYWlx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIG9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2LlJfQ1ggPT0gMCkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGU0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbl9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggcG9ydDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU5cdCIpOwotCXBvcnQgPSAodTgpIGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4LEFMXG4iLCBwb3J0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSAoKnN5c19pbmIpKHBvcnQpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGU1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggcG9ydDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU5cdCIpOwotCXBvcnQgPSAodTgpIGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URjIoIkVBWCwleFxuIiwgcG9ydCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGMigiQVgsJXhcbiIsIHBvcnQpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gKCpzeXNfaW5sKShwb3J0KTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSAoKnN5c19pbncpKHBvcnQpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3V0X2J5dGVfSU1NX0FMKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBwb3J0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPVVRcdCIpOwotCXBvcnQgPSAodTgpIGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4LEFMXG4iLCBwb3J0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgICgqc3lzX291dGIpKHBvcnQsIE0ueDg2LlJfQUwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGU3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vdXRfd29yZF9JTU1fQVgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHBvcnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9VVFx0Iik7Ci0JcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGMigiJXgsRUFYXG4iLCBwb3J0KTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYyKCIleCxBWFxuIiwgcG9ydCk7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JKCpzeXNfb3V0bCkocG9ydCwgTS54ODYuUl9FQVgpOwotICAgIH0gZWxzZSB7Ci0JKCpzeXNfb3V0dykocG9ydCwgTS54ODYuUl9BWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGU4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jYWxsX25lYXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzMTYgaXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotCURFQ09ERV9QUklOVEYoIkNBTExcdCIpOwotCWlwID0gKHMxNikgZmV0Y2hfd29yZF9pbW0oKTsKLQlpcCArPSAoczE2KSBNLng4Ni5SX0lQOyAgICAvKiBDSEVDSyBTSUdOICovCi0JREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKLQlDQUxMX1RSQUNFKE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgTS54ODYuUl9DUywgaXAsICIiKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLSAgICBNLng4Ni5SX0lQID0gaXA7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBpcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk1QXHQiKTsKLSAgICBpcCA9IChzMTYpZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBpcCArPSAoczE2KU0ueDg2LlJfSVA7Ci0gICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfSVAgPSAodTE2KWlwOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGVhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBjcywgaXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpNUFx0RkFSICIpOwotICAgIGlwID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBjcyA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiUwNHg6IiwgY3MpOwotICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0lQID0gaXA7Ci0gICAgTS54ODYuUl9DUyA9IGNzOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGViCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX2J5dGVfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgdGFyZ2V0OwotICAgIHM4IG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk1QXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGVjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbl9ieXRlX0FMX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklOXHRBTCxEWFxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gKCpzeXNfaW5iKShNLng4Ni5SX0RYKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5fd29yZF9BWF9EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTlx0RUFYLERYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOXHRBWCxEWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSAoKnN5c19pbmwpKE0ueDg2LlJfRFgpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9ICgqc3lzX2ludykoTS54ODYuUl9EWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGVlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vdXRfYnl0ZV9EWF9BTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPVVRcdERYLEFMXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgICgqc3lzX291dGIpKE0ueDg2LlJfRFgsIE0ueDg2LlJfQUwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGVmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vdXRfd29yZF9EWF9BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJPVVRcdERYLEVBWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJPVVRcdERYLEFYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkoKnN5c19vdXRsKShNLng4Ni5SX0RYLCBNLng4Ni5SX0VBWCk7Ci0gICAgfSBlbHNlIHsKLQkoKnN5c19vdXR3KShNLng4Ni5SX0RYLCBNLng4Ni5SX0FYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xvY2sodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTE9DSzpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKm9wY29kZSAweGYxIElMTEVHQUwgT1BFUkFUSU9OICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcmVwbmUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUkVQTkVcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9SRVBORTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcmVwZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJSRVBFXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9QUkVGSVhfUkVQRTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaGFsdCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJIQUxUXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIEhBTFRfU1lTKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtYyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgLyogY29tcGxlbWVudCB0aGUgY2FycnkgZmxhZy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNNQ1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBUT0dHTEVfRkxBRyhGX0NGKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjRjZfYnl0ZV9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsLCBzcmN2YWw7Ci0KLSAgICAvKiBsb25nLCBkcmF3biBvdXQgY29kZSBmb2xsb3dzLiAgRG91YmxlIHN3aXRjaCBmb3IgYSB0b3RhbAotICAgICAgIG9mIDMyIGNhc2VzLiAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTAwICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiB0ZXN0IGJ5dGUgaW1tICovCi0JICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiUwMnhcbiIsIHNyY3ZhbCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3RfYnl0ZShkZXN0dmFsLCBzcmN2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJOT1RcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBub3RfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIk5FR1x0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG5lZ19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiTVVMXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBtdWxfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJJTVVMXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiRElWXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkaXZfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJJRElWXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpZGl2X2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0wMCAqLwotICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MDEgKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIHRlc3QgYnl0ZSBpbW0gKi8KLQkgICAgREVDT0RFX1BSSU5URigiVEVTVFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJTAyeFxuIiwgc3JjdmFsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF9ieXRlKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDEgUkg9MDEgT1A9RjZcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIk5PVFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG5vdF9ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiTkVHXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gbmVnX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJNVUxcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIG11bF9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIklNVUxcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJESVZcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRpdl9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIklESVZcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGlkaXZfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTAxICovCi0gICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0xMCAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogdGVzdCBieXRlIGltbSAqLwotCSAgICBERUNPREVfUFJJTlRGKCJURVNUXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlMDJ4XG4iLCBzcmN2YWwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X2J5dGUoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0xMCBSSD0wMSBPUD1GNlxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiTk9UXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gbm90X2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJORUdcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBuZWdfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIk1VTFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgbXVsX2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiSU1VTFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIkRJVlx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGl2X2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiSURJVlx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaWRpdl9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MTAgKi8KLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTExICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiB0ZXN0IGJ5dGUgaW1tICovCi0JICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdCIpOwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlMDJ4XG4iLCBzcmN2YWwpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDAgUkg9MDEgT1A9RjZcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIk5PVFx0Iik7Ci0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gbm90X2J5dGUoKmRlc3RyZWcpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIk5FR1x0Iik7Ci0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gbmVnX2J5dGUoKmRlc3RyZWcpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIk1VTFx0Iik7Ci0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIG11bF9ieXRlKCpkZXN0cmVnKTsgICAgICAvKiEhISAgKi8KLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9ieXRlKCpkZXN0cmVnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJESVZcdCIpOwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkaXZfYnl0ZSgqZGVzdHJlZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiSURJVlx0Iik7Ci0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGlkaXZfYnl0ZSgqZGVzdHJlZyk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0xMSAqLwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjRjdfd29yZF9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIC8qIGxvbmcsIGRyYXduIG91dCBjb2RlIGZvbGxvd3MuICBEb3VibGUgc3dpdGNoIGZvciBhIHRvdGFsCi0gICAgICAgb2YgMzIgY2FzZXMuICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MDAgKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIHRlc3Qgd29yZCBpbW0gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsLHNyY3ZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJURVNUXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiLCIpOwotCQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXRlc3RfbG9uZyhkZXN0dmFsLCBzcmN2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbCxzcmN2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiVEVTVFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiLCIpOwotCQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXRlc3Rfd29yZChkZXN0dmFsLCBzcmN2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDAgUkg9MDEgT1A9RjdcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJOT1RcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbm90X2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTk9UXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbm90X3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJORUdcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbmVnX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTkVHXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbmVnX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJNVUxcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQltdWxfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTVVMXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQltdWxfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJTVVMXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaW11bF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJTVVMXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpbXVsX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiRElWXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGl2X2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIkRJVlx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGl2X3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSURJVlx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWlkaXZfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSURJVlx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaWRpdl93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0wMCAqLwotICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MDEgKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIHRlc3Qgd29yZCBpbW0gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsLHNyY3ZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJURVNUXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiLCIpOwotCQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXRlc3RfbG9uZyhkZXN0dmFsLCBzcmN2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbCxzcmN2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiVEVTVFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiLCIpOwotCQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXRlc3Rfd29yZChkZXN0dmFsLCBzcmN2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDEgUkg9MDEgT1A9RjZcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJOT1RcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbm90X2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTk9UXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbm90X3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJORUdcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbmVnX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTkVHXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbmVnX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJNVUxcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQltdWxfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTVVMXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQltdWxfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJTVVMXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaW11bF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJTVVMXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpbXVsX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiRElWXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGl2X2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIkRJVlx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGl2X3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSURJVlx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWlkaXZfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSURJVlx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaWRpdl93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0wMSAqLwotICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MTAgKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIHRlc3Qgd29yZCBpbW0gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsLHNyY3ZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJURVNUXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiLCIpOwotCQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXRlc3RfbG9uZyhkZXN0dmFsLCBzcmN2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbCxzcmN2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiVEVTVFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiLCIpOwotCQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXRlc3Rfd29yZChkZXN0dmFsLCBzcmN2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MTAgUkg9MDEgT1A9RjZcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJOT1RcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbm90X2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTk9UXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbm90X3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJORUdcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbmVnX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTkVHXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gbmVnX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJNVUxcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQltdWxfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTVVMXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQltdWxfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJTVVMXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaW11bF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJTVVMXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpbXVsX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiRElWXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGl2X2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIkRJVlx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGl2X3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSURJVlx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWlkaXZfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSURJVlx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaWRpdl93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0xMCAqLwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MTEgKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIHRlc3Qgd29yZCBpbW0gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQkJdTMyIHNyY3ZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiLCIpOwotCQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXRlc3RfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCQl1MTYgc3JjdmFsOwotCi0JCURFQ09ERV9QUklOVEYoIlRFU1RcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJdGVzdF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDAgUkg9MDEgT1A9RjZcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiTk9UXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJKmRlc3RyZWcgPSBub3RfbG9uZygqZGVzdHJlZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJOT1RcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkqZGVzdHJlZyA9IG5vdF93b3JkKCpkZXN0cmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiTkVHXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJKmRlc3RyZWcgPSBuZWdfbG9uZygqZGVzdHJlZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJORUdcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkqZGVzdHJlZyA9IG5lZ193b3JkKCpkZXN0cmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiTVVMXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJbXVsX2xvbmcoKmRlc3RyZWcpOyAgICAgIC8qISEhICAqLwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiTVVMXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJbXVsX3dvcmQoKmRlc3RyZWcpOyAgICAgIC8qISEhICAqLwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaW11bF9sb25nKCpkZXN0cmVnKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIklNVUxcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpbXVsX3dvcmQoKmRlc3RyZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJESVZcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkaXZfbG9uZygqZGVzdHJlZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJESVZcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkaXZfd29yZCgqZGVzdHJlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIklESVZcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpZGl2X2xvbmcoKmRlc3RyZWcpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiSURJVlx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWlkaXZfd29yZCgqZGVzdHJlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTExICovCi0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGY4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbGModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIC8qIGNsZWFyIHRoZSBjYXJyeSBmbGFnLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ0xDXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIENMRUFSX0ZMQUcoRl9DRik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N0Yyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgLyogc2V0IHRoZSBjYXJyeSBmbGFnLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1RDXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIFNFVF9GTEFHKEZfQ0YpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGZhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbGkodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIC8qIGNsZWFyIGludGVycnVwdHMuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTElcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgQ0xFQVJfRkxBRyhGX0lGKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3RpKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICAvKiBlbmFibGUgIGludGVycnVwdHMuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVElcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgU0VUX0ZMQUcoRl9JRik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZmMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NsZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNMRFxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBDTEVBUl9GTEFHKEZfREYpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGZkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdGQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIC8qIGNsZWFyIGludGVycnVwdHMuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVERcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgU0VUX0ZMQUcoRl9ERik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0ZFX2J5dGVfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJoLCBybDsKLSAgICB1OCBkZXN0dmFsOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCAqZGVzdHJlZzsKLQotICAgIC8qIFlldCBhbm90aGVyIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbi4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiSU5DXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJERUNcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JY2FzZSAzOgotCWNhc2UgNDoKLQljYXNlIDU6Ci0JY2FzZSA2OgotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URjIoIklMTEVHQUwgT1AgTUFKT1IgT1AgMHhGRSBNSU5PUiBPUCAleCBcbiIsIG1vZCk7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIGluYyB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGluY19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMTogICAgICAgICAvKiBkZWMgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBkZWNfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBpbmNfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBkZWNfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBpbmNfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBkZWNfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGluY19ieXRlKCpkZXN0cmVnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGRlY19ieXRlKCpkZXN0cmVnKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjRkZfd29yZF9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmgsIHJsOwotICAgIHVpbnQgZGVzdG9mZnNldCA9IDA7Ci0JdTE2ICpkZXN0cmVnOwotCXUxNiBkZXN0dmFsLGRlc3R2YWwyOwotCi0gICAgLyogWWV0IGFub3RoZXIgc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJREVDT0RFX1BSSU5URigiSU5DXHREV09SRCBQVFIgIik7Ci0JICAgIH0gZWxzZSB7Ci0JCURFQ09ERV9QUklOVEYoIklOQ1x0V09SRCBQVFIgIik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJREVDT0RFX1BSSU5URigiREVDXHREV09SRCBQVFIgIik7Ci0JICAgIH0gZWxzZSB7Ci0JCURFQ09ERV9QUklOVEYoIkRFQ1x0V09SRCBQVFIgIik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJDQUxMXHQgIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiQ0FMTFx0RkFSICIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIkpNUFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiSk1QXHRGQVIgIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiUFVTSFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBERUNPRElORyBPRiBPUENPREUgRkZcdCIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiBpbmMgd29yZCBwdHIgLi4uICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gaW5jX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGluY193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOiAgICAgICAgIC8qIGRlYyB3b3JkIHB0ciAuLi4gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBkZWNfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gZGVjX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDI6ICAgICAgICAgLyogY2FsbCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOiAgICAgICAgIC8qIGNhbGwgZmFyIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0JICAgIE0ueDg2LlJfQ1MgPSBkZXN0dmFsMjsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OiAgICAgICAgIC8qIGptcCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgNTogICAgICAgICAvKiBqbXAgZmFyIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOwotCSAgICBicmVhazsKLQljYXNlIDY6ICAgICAgICAgLyogIHB1c2ggd29yZCBwdHIgLi4uICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlwdXNoX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXB1c2hfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gaW5jX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGluY193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGRlY19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBkZWNfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMjogICAgICAgICAvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDM6ICAgICAgICAgLyogY2FsbCBmYXIgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKLQkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDQ6ICAgICAgICAgLyogam1wIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OiAgICAgICAgIC8qIGptcCBmYXIgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjogICAgICAgICAvKiAgcHVzaCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXB1c2hfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJcHVzaF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBpbmNfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gaW5jX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gZGVjX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGRlY193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAyOiAgICAgICAgIC8qIGNhbGwgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzogICAgICAgICAvKiBjYWxsIGZhciBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotCSAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDogICAgICAgICAvKiBqbXAgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDU6ICAgICAgICAgLyogam1wIGZhciBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIE0ueDg2LlJfQ1MgPSBkZXN0dmFsMjsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OiAgICAgICAgIC8qICBwdXNoIHdvcmQgcHRyIC4uLiAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJcHVzaF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlwdXNoX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzoKLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCSpkZXN0cmVnID0gaW5jX2xvbmcoKmRlc3RyZWcpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJKmRlc3RyZWcgPSBpbmNfd29yZCgqZGVzdHJlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCSpkZXN0cmVnID0gZGVjX2xvbmcoKmRlc3RyZWcpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJKmRlc3RyZWcgPSBkZWNfd29yZCgqZGVzdHJlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAyOiAgICAgICAgIC8qIGNhbGwgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkgICAgTS54ODYuUl9JUCA9ICpkZXN0cmVnOwotCSAgICBicmVhazsKLQljYXNlIDM6ICAgICAgICAgLyogam1wIGZhciBwdHIgLi4uICovCi0JICAgIERFQ09ERV9QUklOVEYoIk9QRVJBVElPTiBVTkRFRklORUQgMFhGRiBcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQotCWNhc2UgNDogICAgICAgICAvKiBqbXAgIC4uLiAqLwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBNLng4Ni5SX0lQID0gKHUxNikgKCpkZXN0cmVnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OiAgICAgICAgIC8qIGptcCBmYXIgcHRyIC4uLiAqLwotCSAgICBERUNPREVfUFJJTlRGKCJPUEVSQVRJT04gVU5ERUZJTkVEIDBYRkYgXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXB1c2hfbG9uZygqZGVzdHJlZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlwdXNoX3dvcmQoKmRlc3RyZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTaW5nbGUgYnl0ZSBvcGVyYXRpb24gY29kZSB0YWJsZToKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKCp4ODZlbXVfb3B0YWJbMjU2XSkodTgpID0KLXsKLS8qICAweDAwICovIHg4NmVtdU9wX2FkZF9ieXRlX1JNX1IsCi0vKiAgMHgwMSAqLyB4ODZlbXVPcF9hZGRfd29yZF9STV9SLAotLyogIDB4MDIgKi8geDg2ZW11T3BfYWRkX2J5dGVfUl9STSwKLS8qICAweDAzICovIHg4NmVtdU9wX2FkZF93b3JkX1JfUk0sCi0vKiAgMHgwNCAqLyB4ODZlbXVPcF9hZGRfYnl0ZV9BTF9JTU0sCi0vKiAgMHgwNSAqLyB4ODZlbXVPcF9hZGRfd29yZF9BWF9JTU0sCi0vKiAgMHgwNiAqLyB4ODZlbXVPcF9wdXNoX0VTLAotLyogIDB4MDcgKi8geDg2ZW11T3BfcG9wX0VTLAotCi0vKiAgMHgwOCAqLyB4ODZlbXVPcF9vcl9ieXRlX1JNX1IsCi0vKiAgMHgwOSAqLyB4ODZlbXVPcF9vcl93b3JkX1JNX1IsCi0vKiAgMHgwYSAqLyB4ODZlbXVPcF9vcl9ieXRlX1JfUk0sCi0vKiAgMHgwYiAqLyB4ODZlbXVPcF9vcl93b3JkX1JfUk0sCi0vKiAgMHgwYyAqLyB4ODZlbXVPcF9vcl9ieXRlX0FMX0lNTSwKLS8qICAweDBkICovIHg4NmVtdU9wX29yX3dvcmRfQVhfSU1NLAotLyogIDB4MGUgKi8geDg2ZW11T3BfcHVzaF9DUywKLS8qICAweDBmICovIHg4NmVtdU9wX3R3b19ieXRlLAotCi0vKiAgMHgxMCAqLyB4ODZlbXVPcF9hZGNfYnl0ZV9STV9SLAotLyogIDB4MTEgKi8geDg2ZW11T3BfYWRjX3dvcmRfUk1fUiwKLS8qICAweDEyICovIHg4NmVtdU9wX2FkY19ieXRlX1JfUk0sCi0vKiAgMHgxMyAqLyB4ODZlbXVPcF9hZGNfd29yZF9SX1JNLAotLyogIDB4MTQgKi8geDg2ZW11T3BfYWRjX2J5dGVfQUxfSU1NLAotLyogIDB4MTUgKi8geDg2ZW11T3BfYWRjX3dvcmRfQVhfSU1NLAotLyogIDB4MTYgKi8geDg2ZW11T3BfcHVzaF9TUywKLS8qICAweDE3ICovIHg4NmVtdU9wX3BvcF9TUywKLQotLyogIDB4MTggKi8geDg2ZW11T3Bfc2JiX2J5dGVfUk1fUiwKLS8qICAweDE5ICovIHg4NmVtdU9wX3NiYl93b3JkX1JNX1IsCi0vKiAgMHgxYSAqLyB4ODZlbXVPcF9zYmJfYnl0ZV9SX1JNLAotLyogIDB4MWIgKi8geDg2ZW11T3Bfc2JiX3dvcmRfUl9STSwKLS8qICAweDFjICovIHg4NmVtdU9wX3NiYl9ieXRlX0FMX0lNTSwKLS8qICAweDFkICovIHg4NmVtdU9wX3NiYl93b3JkX0FYX0lNTSwKLS8qICAweDFlICovIHg4NmVtdU9wX3B1c2hfRFMsCi0vKiAgMHgxZiAqLyB4ODZlbXVPcF9wb3BfRFMsCi0KLS8qICAweDIwICovIHg4NmVtdU9wX2FuZF9ieXRlX1JNX1IsCi0vKiAgMHgyMSAqLyB4ODZlbXVPcF9hbmRfd29yZF9STV9SLAotLyogIDB4MjIgKi8geDg2ZW11T3BfYW5kX2J5dGVfUl9STSwKLS8qICAweDIzICovIHg4NmVtdU9wX2FuZF93b3JkX1JfUk0sCi0vKiAgMHgyNCAqLyB4ODZlbXVPcF9hbmRfYnl0ZV9BTF9JTU0sCi0vKiAgMHgyNSAqLyB4ODZlbXVPcF9hbmRfd29yZF9BWF9JTU0sCi0vKiAgMHgyNiAqLyB4ODZlbXVPcF9zZWdvdnJfRVMsCi0vKiAgMHgyNyAqLyB4ODZlbXVPcF9kYWEsCi0KLS8qICAweDI4ICovIHg4NmVtdU9wX3N1Yl9ieXRlX1JNX1IsCi0vKiAgMHgyOSAqLyB4ODZlbXVPcF9zdWJfd29yZF9STV9SLAotLyogIDB4MmEgKi8geDg2ZW11T3Bfc3ViX2J5dGVfUl9STSwKLS8qICAweDJiICovIHg4NmVtdU9wX3N1Yl93b3JkX1JfUk0sCi0vKiAgMHgyYyAqLyB4ODZlbXVPcF9zdWJfYnl0ZV9BTF9JTU0sCi0vKiAgMHgyZCAqLyB4ODZlbXVPcF9zdWJfd29yZF9BWF9JTU0sCi0vKiAgMHgyZSAqLyB4ODZlbXVPcF9zZWdvdnJfQ1MsCi0vKiAgMHgyZiAqLyB4ODZlbXVPcF9kYXMsCi0KLS8qICAweDMwICovIHg4NmVtdU9wX3hvcl9ieXRlX1JNX1IsCi0vKiAgMHgzMSAqLyB4ODZlbXVPcF94b3Jfd29yZF9STV9SLAotLyogIDB4MzIgKi8geDg2ZW11T3BfeG9yX2J5dGVfUl9STSwKLS8qICAweDMzICovIHg4NmVtdU9wX3hvcl93b3JkX1JfUk0sCi0vKiAgMHgzNCAqLyB4ODZlbXVPcF94b3JfYnl0ZV9BTF9JTU0sCi0vKiAgMHgzNSAqLyB4ODZlbXVPcF94b3Jfd29yZF9BWF9JTU0sCi0vKiAgMHgzNiAqLyB4ODZlbXVPcF9zZWdvdnJfU1MsCi0vKiAgMHgzNyAqLyB4ODZlbXVPcF9hYWEsCi0KLS8qICAweDM4ICovIHg4NmVtdU9wX2NtcF9ieXRlX1JNX1IsCi0vKiAgMHgzOSAqLyB4ODZlbXVPcF9jbXBfd29yZF9STV9SLAotLyogIDB4M2EgKi8geDg2ZW11T3BfY21wX2J5dGVfUl9STSwKLS8qICAweDNiICovIHg4NmVtdU9wX2NtcF93b3JkX1JfUk0sCi0vKiAgMHgzYyAqLyB4ODZlbXVPcF9jbXBfYnl0ZV9BTF9JTU0sCi0vKiAgMHgzZCAqLyB4ODZlbXVPcF9jbXBfd29yZF9BWF9JTU0sCi0vKiAgMHgzZSAqLyB4ODZlbXVPcF9zZWdvdnJfRFMsCi0vKiAgMHgzZiAqLyB4ODZlbXVPcF9hYXMsCi0KLS8qICAweDQwICovIHg4NmVtdU9wX2luY19BWCwKLS8qICAweDQxICovIHg4NmVtdU9wX2luY19DWCwKLS8qICAweDQyICovIHg4NmVtdU9wX2luY19EWCwKLS8qICAweDQzICovIHg4NmVtdU9wX2luY19CWCwKLS8qICAweDQ0ICovIHg4NmVtdU9wX2luY19TUCwKLS8qICAweDQ1ICovIHg4NmVtdU9wX2luY19CUCwKLS8qICAweDQ2ICovIHg4NmVtdU9wX2luY19TSSwKLS8qICAweDQ3ICovIHg4NmVtdU9wX2luY19ESSwKLQotLyogIDB4NDggKi8geDg2ZW11T3BfZGVjX0FYLAotLyogIDB4NDkgKi8geDg2ZW11T3BfZGVjX0NYLAotLyogIDB4NGEgKi8geDg2ZW11T3BfZGVjX0RYLAotLyogIDB4NGIgKi8geDg2ZW11T3BfZGVjX0JYLAotLyogIDB4NGMgKi8geDg2ZW11T3BfZGVjX1NQLAotLyogIDB4NGQgKi8geDg2ZW11T3BfZGVjX0JQLAotLyogIDB4NGUgKi8geDg2ZW11T3BfZGVjX1NJLAotLyogIDB4NGYgKi8geDg2ZW11T3BfZGVjX0RJLAotCi0vKiAgMHg1MCAqLyB4ODZlbXVPcF9wdXNoX0FYLAotLyogIDB4NTEgKi8geDg2ZW11T3BfcHVzaF9DWCwKLS8qICAweDUyICovIHg4NmVtdU9wX3B1c2hfRFgsCi0vKiAgMHg1MyAqLyB4ODZlbXVPcF9wdXNoX0JYLAotLyogIDB4NTQgKi8geDg2ZW11T3BfcHVzaF9TUCwKLS8qICAweDU1ICovIHg4NmVtdU9wX3B1c2hfQlAsCi0vKiAgMHg1NiAqLyB4ODZlbXVPcF9wdXNoX1NJLAotLyogIDB4NTcgKi8geDg2ZW11T3BfcHVzaF9ESSwKLQotLyogIDB4NTggKi8geDg2ZW11T3BfcG9wX0FYLAotLyogIDB4NTkgKi8geDg2ZW11T3BfcG9wX0NYLAotLyogIDB4NWEgKi8geDg2ZW11T3BfcG9wX0RYLAotLyogIDB4NWIgKi8geDg2ZW11T3BfcG9wX0JYLAotLyogIDB4NWMgKi8geDg2ZW11T3BfcG9wX1NQLAotLyogIDB4NWQgKi8geDg2ZW11T3BfcG9wX0JQLAotLyogIDB4NWUgKi8geDg2ZW11T3BfcG9wX1NJLAotLyogIDB4NWYgKi8geDg2ZW11T3BfcG9wX0RJLAotCi0vKiAgMHg2MCAqLyB4ODZlbXVPcF9wdXNoX2FsbCwKLS8qICAweDYxICovIHg4NmVtdU9wX3BvcF9hbGwsCi0vKiAgMHg2MiAqLyB4ODZlbXVPcF9pbGxlZ2FsX29wLCAgIC8qIGJvdW5kICovCi0vKiAgMHg2MyAqLyB4ODZlbXVPcF9pbGxlZ2FsX29wLCAgIC8qIGFycGwgKi8KLS8qICAweDY0ICovIHg4NmVtdU9wX3NlZ292cl9GUywKLS8qICAweDY1ICovIHg4NmVtdU9wX3NlZ292cl9HUywKLS8qICAweDY2ICovIHg4NmVtdU9wX3ByZWZpeF9kYXRhLAotLyogIDB4NjcgKi8geDg2ZW11T3BfcHJlZml4X2FkZHIsCi0KLS8qICAweDY4ICovIHg4NmVtdU9wX3B1c2hfd29yZF9JTU0sCi0vKiAgMHg2OSAqLyB4ODZlbXVPcF9pbXVsX3dvcmRfSU1NLAotLyogIDB4NmEgKi8geDg2ZW11T3BfcHVzaF9ieXRlX0lNTSwKLS8qICAweDZiICovIHg4NmVtdU9wX2ltdWxfYnl0ZV9JTU0sCi0vKiAgMHg2YyAqLyB4ODZlbXVPcF9pbnNfYnl0ZSwKLS8qICAweDZkICovIHg4NmVtdU9wX2luc193b3JkLAotLyogIDB4NmUgKi8geDg2ZW11T3Bfb3V0c19ieXRlLAotLyogIDB4NmYgKi8geDg2ZW11T3Bfb3V0c193b3JkLAotCi0vKiAgMHg3MCAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTywKLS8qICAweDcxICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OTywKLS8qICAweDcyICovIHg4NmVtdU9wX2p1bXBfbmVhcl9CLAotLyogIDB4NzMgKi8geDg2ZW11T3BfanVtcF9uZWFyX05CLAotLyogIDB4NzQgKi8geDg2ZW11T3BfanVtcF9uZWFyX1osCi0vKiAgMHg3NSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTlosCi0vKiAgMHg3NiAqLyB4ODZlbXVPcF9qdW1wX25lYXJfQkUsCi0vKiAgMHg3NyAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTkJFLAotCi0vKiAgMHg3OCAqLyB4ODZlbXVPcF9qdW1wX25lYXJfUywKLS8qICAweDc5ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OUywKLS8qICAweDdhICovIHg4NmVtdU9wX2p1bXBfbmVhcl9QLAotLyogIDB4N2IgKi8geDg2ZW11T3BfanVtcF9uZWFyX05QLAotLyogIDB4N2MgKi8geDg2ZW11T3BfanVtcF9uZWFyX0wsCi0vKiAgMHg3ZCAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTkwsCi0vKiAgMHg3ZSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTEUsCi0vKiAgMHg3ZiAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTkxFLAotCi0vKiAgMHg4MCAqLyB4ODZlbXVPcF9vcGM4MF9ieXRlX1JNX0lNTSwKLS8qICAweDgxICovIHg4NmVtdU9wX29wYzgxX3dvcmRfUk1fSU1NLAotLyogIDB4ODIgKi8geDg2ZW11T3Bfb3BjODJfYnl0ZV9STV9JTU0sCi0vKiAgMHg4MyAqLyB4ODZlbXVPcF9vcGM4M193b3JkX1JNX0lNTSwKLS8qICAweDg0ICovIHg4NmVtdU9wX3Rlc3RfYnl0ZV9STV9SLAotLyogIDB4ODUgKi8geDg2ZW11T3BfdGVzdF93b3JkX1JNX1IsCi0vKiAgMHg4NiAqLyB4ODZlbXVPcF94Y2hnX2J5dGVfUk1fUiwKLS8qICAweDg3ICovIHg4NmVtdU9wX3hjaGdfd29yZF9STV9SLAotCi0vKiAgMHg4OCAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9STV9SLAotLyogIDB4ODkgKi8geDg2ZW11T3BfbW92X3dvcmRfUk1fUiwKLS8qICAweDhhICovIHg4NmVtdU9wX21vdl9ieXRlX1JfUk0sCi0vKiAgMHg4YiAqLyB4ODZlbXVPcF9tb3Zfd29yZF9SX1JNLAotLyogIDB4OGMgKi8geDg2ZW11T3BfbW92X3dvcmRfUk1fU1IsCi0vKiAgMHg4ZCAqLyB4ODZlbXVPcF9sZWFfd29yZF9SX00sCi0vKiAgMHg4ZSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9TUl9STSwKLS8qICAweDhmICovIHg4NmVtdU9wX3BvcF9STSwKLQotLyogIDB4OTAgKi8geDg2ZW11T3Bfbm9wLAotLyogIDB4OTEgKi8geDg2ZW11T3BfeGNoZ193b3JkX0FYX0NYLAotLyogIDB4OTIgKi8geDg2ZW11T3BfeGNoZ193b3JkX0FYX0RYLAotLyogIDB4OTMgKi8geDg2ZW11T3BfeGNoZ193b3JkX0FYX0JYLAotLyogIDB4OTQgKi8geDg2ZW11T3BfeGNoZ193b3JkX0FYX1NQLAotLyogIDB4OTUgKi8geDg2ZW11T3BfeGNoZ193b3JkX0FYX0JQLAotLyogIDB4OTYgKi8geDg2ZW11T3BfeGNoZ193b3JkX0FYX1NJLAotLyogIDB4OTcgKi8geDg2ZW11T3BfeGNoZ193b3JkX0FYX0RJLAotCi0vKiAgMHg5OCAqLyB4ODZlbXVPcF9jYncsCi0vKiAgMHg5OSAqLyB4ODZlbXVPcF9jd2QsCi0vKiAgMHg5YSAqLyB4ODZlbXVPcF9jYWxsX2Zhcl9JTU0sCi0vKiAgMHg5YiAqLyB4ODZlbXVPcF93YWl0LAotLyogIDB4OWMgKi8geDg2ZW11T3BfcHVzaGZfd29yZCwKLS8qICAweDlkICovIHg4NmVtdU9wX3BvcGZfd29yZCwKLS8qICAweDllICovIHg4NmVtdU9wX3NhaGYsCi0vKiAgMHg5ZiAqLyB4ODZlbXVPcF9sYWhmLAotCi0vKiAgMHhhMCAqLyB4ODZlbXVPcF9tb3ZfQUxfTV9JTU0sCi0vKiAgMHhhMSAqLyB4ODZlbXVPcF9tb3ZfQVhfTV9JTU0sCi0vKiAgMHhhMiAqLyB4ODZlbXVPcF9tb3ZfTV9BTF9JTU0sCi0vKiAgMHhhMyAqLyB4ODZlbXVPcF9tb3ZfTV9BWF9JTU0sCi0vKiAgMHhhNCAqLyB4ODZlbXVPcF9tb3ZzX2J5dGUsCi0vKiAgMHhhNSAqLyB4ODZlbXVPcF9tb3ZzX3dvcmQsCi0vKiAgMHhhNiAqLyB4ODZlbXVPcF9jbXBzX2J5dGUsCi0vKiAgMHhhNyAqLyB4ODZlbXVPcF9jbXBzX3dvcmQsCi0vKiAgMHhhOCAqLyB4ODZlbXVPcF90ZXN0X0FMX0lNTSwKLS8qICAweGE5ICovIHg4NmVtdU9wX3Rlc3RfQVhfSU1NLAotLyogIDB4YWEgKi8geDg2ZW11T3Bfc3Rvc19ieXRlLAotLyogIDB4YWIgKi8geDg2ZW11T3Bfc3Rvc193b3JkLAotLyogIDB4YWMgKi8geDg2ZW11T3BfbG9kc19ieXRlLAotLyogIDB4YWQgKi8geDg2ZW11T3BfbG9kc193b3JkLAotLyogIDB4YWMgKi8geDg2ZW11T3Bfc2Nhc19ieXRlLAotLyogIDB4YWQgKi8geDg2ZW11T3Bfc2Nhc193b3JkLAotCi0KLS8qICAweGIwICovIHg4NmVtdU9wX21vdl9ieXRlX0FMX0lNTSwKLS8qICAweGIxICovIHg4NmVtdU9wX21vdl9ieXRlX0NMX0lNTSwKLS8qICAweGIyICovIHg4NmVtdU9wX21vdl9ieXRlX0RMX0lNTSwKLS8qICAweGIzICovIHg4NmVtdU9wX21vdl9ieXRlX0JMX0lNTSwKLS8qICAweGI0ICovIHg4NmVtdU9wX21vdl9ieXRlX0FIX0lNTSwKLS8qICAweGI1ICovIHg4NmVtdU9wX21vdl9ieXRlX0NIX0lNTSwKLS8qICAweGI2ICovIHg4NmVtdU9wX21vdl9ieXRlX0RIX0lNTSwKLS8qICAweGI3ICovIHg4NmVtdU9wX21vdl9ieXRlX0JIX0lNTSwKLQotLyogIDB4YjggKi8geDg2ZW11T3BfbW92X3dvcmRfQVhfSU1NLAotLyogIDB4YjkgKi8geDg2ZW11T3BfbW92X3dvcmRfQ1hfSU1NLAotLyogIDB4YmEgKi8geDg2ZW11T3BfbW92X3dvcmRfRFhfSU1NLAotLyogIDB4YmIgKi8geDg2ZW11T3BfbW92X3dvcmRfQlhfSU1NLAotLyogIDB4YmMgKi8geDg2ZW11T3BfbW92X3dvcmRfU1BfSU1NLAotLyogIDB4YmQgKi8geDg2ZW11T3BfbW92X3dvcmRfQlBfSU1NLAotLyogIDB4YmUgKi8geDg2ZW11T3BfbW92X3dvcmRfU0lfSU1NLAotLyogIDB4YmYgKi8geDg2ZW11T3BfbW92X3dvcmRfRElfSU1NLAotCi0vKiAgMHhjMCAqLyB4ODZlbXVPcF9vcGNDMF9ieXRlX1JNX01FTSwKLS8qICAweGMxICovIHg4NmVtdU9wX29wY0MxX3dvcmRfUk1fTUVNLAotLyogIDB4YzIgKi8geDg2ZW11T3BfcmV0X25lYXJfSU1NLAotLyogIDB4YzMgKi8geDg2ZW11T3BfcmV0X25lYXIsCi0vKiAgMHhjNCAqLyB4ODZlbXVPcF9sZXNfUl9JTU0sCi0vKiAgMHhjNSAqLyB4ODZlbXVPcF9sZHNfUl9JTU0sCi0vKiAgMHhjNiAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9STV9JTU0sCi0vKiAgMHhjNyAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9JTU0sCi0vKiAgMHhjOCAqLyB4ODZlbXVPcF9lbnRlciwKLS8qICAweGM5ICovIHg4NmVtdU9wX2xlYXZlLAotLyogIDB4Y2EgKi8geDg2ZW11T3BfcmV0X2Zhcl9JTU0sCi0vKiAgMHhjYiAqLyB4ODZlbXVPcF9yZXRfZmFyLAotLyogIDB4Y2MgKi8geDg2ZW11T3BfaW50MywKLS8qICAweGNkICovIHg4NmVtdU9wX2ludF9JTU0sCi0vKiAgMHhjZSAqLyB4ODZlbXVPcF9pbnRvLAotLyogIDB4Y2YgKi8geDg2ZW11T3BfaXJldCwKLQotLyogIDB4ZDAgKi8geDg2ZW11T3Bfb3BjRDBfYnl0ZV9STV8xLAotLyogIDB4ZDEgKi8geDg2ZW11T3Bfb3BjRDFfd29yZF9STV8xLAotLyogIDB4ZDIgKi8geDg2ZW11T3Bfb3BjRDJfYnl0ZV9STV9DTCwKLS8qICAweGQzICovIHg4NmVtdU9wX29wY0QzX3dvcmRfUk1fQ0wsCi0vKiAgMHhkNCAqLyB4ODZlbXVPcF9hYW0sCi0vKiAgMHhkNSAqLyB4ODZlbXVPcF9hYWQsCi0vKiAgMHhkNiAqLyB4ODZlbXVPcF9pbGxlZ2FsX29wLCAgIC8qIFVuZG9jdW1lbnRlZCBTRVRBTEMgaW5zdHJ1Y3Rpb24gKi8KLS8qICAweGQ3ICovIHg4NmVtdU9wX3hsYXQsCi0vKiAgMHhkOCAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q4LAotLyogIDB4ZDkgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOSwKLS8qICAweGRhICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGEsCi0vKiAgMHhkYiAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RiLAotLyogIDB4ZGMgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYywKLS8qICAweGRkICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGQsCi0vKiAgMHhkZSAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RlLAotLyogIDB4ZGYgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZiwKLQotLyogIDB4ZTAgKi8geDg2ZW11T3BfbG9vcG5lLAotLyogIDB4ZTEgKi8geDg2ZW11T3BfbG9vcGUsCi0vKiAgMHhlMiAqLyB4ODZlbXVPcF9sb29wLAotLyogIDB4ZTMgKi8geDg2ZW11T3BfamN4eiwKLS8qICAweGU0ICovIHg4NmVtdU9wX2luX2J5dGVfQUxfSU1NLAotLyogIDB4ZTUgKi8geDg2ZW11T3BfaW5fd29yZF9BWF9JTU0sCi0vKiAgMHhlNiAqLyB4ODZlbXVPcF9vdXRfYnl0ZV9JTU1fQUwsCi0vKiAgMHhlNyAqLyB4ODZlbXVPcF9vdXRfd29yZF9JTU1fQVgsCi0KLS8qICAweGU4ICovIHg4NmVtdU9wX2NhbGxfbmVhcl9JTU0sCi0vKiAgMHhlOSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfSU1NLAotLyogIDB4ZWEgKi8geDg2ZW11T3BfanVtcF9mYXJfSU1NLAotLyogIDB4ZWIgKi8geDg2ZW11T3BfanVtcF9ieXRlX0lNTSwKLS8qICAweGVjICovIHg4NmVtdU9wX2luX2J5dGVfQUxfRFgsCi0vKiAgMHhlZCAqLyB4ODZlbXVPcF9pbl93b3JkX0FYX0RYLAotLyogIDB4ZWUgKi8geDg2ZW11T3Bfb3V0X2J5dGVfRFhfQUwsCi0vKiAgMHhlZiAqLyB4ODZlbXVPcF9vdXRfd29yZF9EWF9BWCwKLQotLyogIDB4ZjAgKi8geDg2ZW11T3BfbG9jaywKLS8qICAweGYxICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsCi0vKiAgMHhmMiAqLyB4ODZlbXVPcF9yZXBuZSwKLS8qICAweGYzICovIHg4NmVtdU9wX3JlcGUsCi0vKiAgMHhmNCAqLyB4ODZlbXVPcF9oYWx0LAotLyogIDB4ZjUgKi8geDg2ZW11T3BfY21jLAotLyogIDB4ZjYgKi8geDg2ZW11T3Bfb3BjRjZfYnl0ZV9STSwKLS8qICAweGY3ICovIHg4NmVtdU9wX29wY0Y3X3dvcmRfUk0sCi0KLS8qICAweGY4ICovIHg4NmVtdU9wX2NsYywKLS8qICAweGY5ICovIHg4NmVtdU9wX3N0YywKLS8qICAweGZhICovIHg4NmVtdU9wX2NsaSwKLS8qICAweGZiICovIHg4NmVtdU9wX3N0aSwKLS8qICAweGZjICovIHg4NmVtdU9wX2NsZCwKLS8qICAweGZkICovIHg4NmVtdU9wX3N0ZCwKLS8qICAweGZlICovIHg4NmVtdU9wX29wY0ZFX2J5dGVfUk0sCi0vKiAgMHhmZiAqLyB4ODZlbXVPcF9vcGNGRl93b3JkX1JNLAotfTsKLQotdm9pZCB0YWJsZXNfcmVsb2NhdGUodW5zaWduZWQgaW50IG9mZnNldCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGk9MDsgaTw4OyBpKyspCi0gICAgewotCW9wYzgwX2J5dGVfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLQlvcGM4MV93b3JkX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0Jb3BjODFfbG9uZ19vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotCi0Jb3BjODJfYnl0ZV9vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotCW9wYzgzX3dvcmRfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLQlvcGM4M19sb25nX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0KLQlvcGNEMF9ieXRlX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0Jb3BjRDFfd29yZF9vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotCW9wY0QxX2xvbmdfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvb3BzMi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wczIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4MTMwNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvb3BzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB0byBpbXBsZW1lbnQgdGhlIGRlY29kaW5nCi0qICAgICAgICAgICAgICAgYW5kIGVtdWxhdGlvbiBvZiBhbGwgdGhlIHg4NiBleHRlbmRlZCB0d28tYnl0ZSBwcm9jZXNzb3IKLSogICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vcDEgLSBJbnN0cnVjdGlvbiBvcCBjb2RlCi0KLVJFTUFSS1M6Ci1IYW5kbGVzIGlsbGVnYWwgb3Bjb2Rlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9pbGxlZ2FsX29wKAotCXU4IG9wMikKLXsKLQlTVEFSVF9PRl9JTlNUUigpOwotCURFQ09ERV9QUklOVEYoIklMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERVxuIik7Ci0JVFJBQ0VfUkVHUygpOwotCXByaW50aygiJTA0eDolMDR4OiAlMDJYIElMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERSFcbiIsCi0JCU0ueDg2LlJfQ1MsIE0ueDg2LlJfSVAtMixvcDIpOwotICAgIEhBTFRfU1lTKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLSNkZWZpbmUgeG9ybChhLGIpICAgKChhKSAmJiAhKGIpKSB8fCAoIShhKSAmJiAoYikpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweDgwLTB4OEYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9sb25nX2p1bXAodTggb3AyKQotewotICAgIHMzMiB0YXJnZXQ7Ci0gICAgY2hhciAqbmFtZSA9IDA7Ci0gICAgaW50IGNvbmQgPSAwOwotCi0gICAgLyogY29uZGl0aW9uYWwganVtcCB0byB3b3JkIG9mZnNldC4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIHN3aXRjaCAob3AyKSB7Ci0gICAgICBjYXNlIDB4ODA6Ci0JbmFtZSA9ICJKT1x0IjsKLQljb25kID0gIEFDQ0VTU19GTEFHKEZfT0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDgxOgotCW5hbWUgPSAiSk5PXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9PRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODI6Ci0JbmFtZSA9ICJKQlx0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9DRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODM6Ci0JbmFtZSA9ICJKTkJcdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX0NGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4NDoKLQluYW1lID0gIkpaXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1pGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4NToKLQluYW1lID0gIkpOWlx0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfWkYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDg2OgotCW5hbWUgPSAiSkJFXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4NzoKLQluYW1lID0gIkpOQkVcdCI7Ci0JY29uZCA9ICEoQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRikpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDg4OgotCW5hbWUgPSAiSlNcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfU0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDg5OgotCW5hbWUgPSAiSk5TXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9TRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OGE6Ci0JbmFtZSA9ICJKUFx0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9QRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OGI6Ci0JbmFtZSA9ICJKTlBcdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1BGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4YzoKLQluYW1lID0gIkpMXHQiOwotCWNvbmQgPSB4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OGQ6Ci0JbmFtZSA9ICJKTkxcdCI7Ci0JY29uZCA9IHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4ZToKLQluYW1lID0gIkpMRVx0IjsKLQljb25kID0gKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAotCQlBQ0NFU1NfRkxBRyhGX1pGKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OGY6Ci0JbmFtZSA9ICJKTkxFXHQiOwotCWNvbmQgPSAhKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAotCQkgQUNDRVNTX0ZMQUcoRl9aRikpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGKG5hbWUpOwotICAgIHRhcmdldCA9IChzMTYpIGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgdGFyZ2V0ICs9IChzMTYpIE0ueDg2LlJfSVA7Ci0gICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoY29uZCkKLQlNLng4Ni5SX0lQID0gKHUxNil0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHg5MC0weDlGCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfc2V0X2J5dGUodTggb3AyKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggICpkZXN0cmVnOwotICAgIGNoYXIgKm5hbWUgPSAwOwotICAgIGludCBjb25kID0gMDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgc3dpdGNoIChvcDIpIHsKLSAgICAgIGNhc2UgMHg5MDoKLQluYW1lID0gIlNFVE9cdCI7Ci0JY29uZCA9ICBBQ0NFU1NfRkxBRyhGX09GKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5MToKLQluYW1lID0gIlNFVE5PXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9PRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTI6Ci0JbmFtZSA9ICJTRVRCXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX0NGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5MzoKLQluYW1lID0gIlNFVE5CXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9DRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTQ6Ci0JbmFtZSA9ICJTRVRaXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1pGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5NToKLQluYW1lID0gIlNFVE5aXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9aRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTY6Ci0JbmFtZSA9ICJTRVRCRVx0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTc6Ci0JbmFtZSA9ICJTRVROQkVcdCI7Ci0JY29uZCA9ICEoQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRikpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDk4OgotCW5hbWUgPSAiU0VUU1x0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9TRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTk6Ci0JbmFtZSA9ICJTRVROU1x0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfU0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDlhOgotCW5hbWUgPSAiU0VUUFx0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9QRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OWI6Ci0JbmFtZSA9ICJTRVROUFx0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfUEYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDljOgotCW5hbWUgPSAiU0VUTFx0IjsKLQljb25kID0geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDlkOgotCW5hbWUgPSAiU0VUTkxcdCI7Ci0JY29uZCA9IHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5ZToKLQluYW1lID0gIlNFVExFXHQiOwotCWNvbmQgPSAoeG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpIHx8Ci0JCUFDQ0VTU19GTEFHKEZfWkYpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5ZjoKLQluYW1lID0gIlNFVE5MRVx0IjsKLQljb25kID0gISh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKLQkJIEFDQ0VTU19GTEFHKEZfWkYpKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URihuYW1lKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBjb25kID8gMHgwMSA6IDB4MDApOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgY29uZCA/IDB4MDEgOiAweDAwKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGNvbmQgPyAweDAxIDogMHgwMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gY29uZCA/IDB4MDEgOiAweDAwOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGEwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfcHVzaF9GUyh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRGU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9GUyk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3BvcF9GUyh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQT1BcdEZTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfRlMgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YTMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9idF9SKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgaW50IGJpdCxkaXNwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJCVFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiAoMHgxIDw8IGJpdCksRl9DRik7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiAoMHgxIDw8IGJpdCksRl9DRik7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiAoMHgxIDw8IGJpdCksRl9DRik7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZywqc2hpZnRyZWc7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgKDB4MSA8PCBiaXQpLEZfQ0YpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmICgweDEgPDwgYml0KSxGX0NGKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YTQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9zaGxkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQl1OCBzaGlmdDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzaGxkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzaGxkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YTUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9zaGxkX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTSExEXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzaGxkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzaGxkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3B1c2hfR1ModTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUFVTSFx0R1NcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfR1MpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YTkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9wb3BfR1ModTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUE9QXHRHU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0dTID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfYnRzX1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICBpbnQgYml0LGRpc3A7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkJUU1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCxtYXNrOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLG1hc2s7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCxtYXNrOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLG1hc2s7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCxtYXNrOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLG1hc2s7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkJCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCQkJZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JCQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJdTMyICpzcmNyZWcsKnNoaWZ0cmVnOwotCQkJdTMyIG1hc2s7Ci0KLQkJCXNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JCQltYXNrID0gKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7Ci0JCQkqc3JjcmVnIHw9IG1hc2s7Ci0JCX0gZWxzZSB7Ci0JCQl1MTYgKnNyY3JlZywqc2hpZnRyZWc7Ci0JCQl1MTYgbWFzazsKLQotCQkJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKLQkgICAgKnNyY3JlZyB8PSBtYXNrOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3NocmRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCXU4IHNoaWZ0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTSExEXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNocmRfbG9uZygqZGVzdHJlZywqc2hpZnRyZWcsc2hpZnQpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNocmRfd29yZCgqZGVzdHJlZywqc2hpZnRyZWcsc2hpZnQpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3NocmRfQ0wodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzaGlmdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNocmRfbG9uZygqZGVzdHJlZywqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNocmRfd29yZCgqZGVzdHJlZywqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfaW11bF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMilzcmN2YWwpOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KSpkZXN0cmVnICogKHMxNilzcmN2YWw7Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqZGVzdHJlZywoczMyKXNyY3ZhbCk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpKmRlc3RyZWcgKiAoczE2KXNyY3ZhbDsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpkZXN0cmVnLChzMzIpc3JjdmFsKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpc3JjdmFsOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpkZXN0cmVnLChzMzIpKnNyY3JlZyk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQkgICAgdTMyIHJlczsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpKnNyY3JlZzsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YjIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9sc3NfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotCWludCBtb2QsIHJoLCBybDsKLSAgICB1MTYgKmRzdHJlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTFNTXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX1NTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9TUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfU1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JLyogVU5ERUZJTkVEISAqLwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YjMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9idHJfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0JaW50IG1vZCwgcmwsIHJoOwotCXVpbnQgc3Jjb2Zmc2V0OwotCWludCBiaXQsZGlzcDsKLQotCVNUQVJUX09GX0lOU1RSKCk7Ci0JREVDT0RFX1BSSU5URigiQlRSXHQiKTsKLQlGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotCXN3aXRjaCAobW9kKSB7Ci0JY2FzZSAwOgotCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCXUzMiBzcmN2YWwsbWFzazsKLQkJCXUzMiAqc2hpZnRyZWc7Ci0KLQkJCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgJiB+bWFzayk7Ci0JCX0gZWxzZSB7Ci0JCQl1MTYgc3JjdmFsLG1hc2s7Ci0JCQl1MTYgKnNoaWZ0cmVnOwotCi0JCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCAmIH5tYXNrKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCXUzMiBzcmN2YWwsbWFzazsKLQkJCXUzMiAqc2hpZnRyZWc7Ci0KLQkJCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgJiB+bWFzayk7Ci0JCX0gZWxzZSB7Ci0JCQl1MTYgc3JjdmFsLG1hc2s7Ci0JCQl1MTYgKnNoaWZ0cmVnOwotCi0JCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCAmIH5tYXNrKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCXUzMiBzcmN2YWwsbWFzazsKLQkJCXUzMiAqc2hpZnRyZWc7Ci0KLQkJCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgJiB+bWFzayk7Ci0JCX0gZWxzZSB7Ci0JCQl1MTYgc3JjdmFsLG1hc2s7Ci0JCQl1MTYgKnNoaWZ0cmVnOwotCi0JCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCAmIH5tYXNrKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJdTMyICpzcmNyZWcsKnNoaWZ0cmVnOwotCQkJdTMyIG1hc2s7Ci0KLQkJCXNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JCQltYXNrID0gKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7Ci0JCQkqc3JjcmVnICY9IH5tYXNrOwotCQl9IGVsc2UgewotCQkJdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOwotCQkJdTE2IG1hc2s7Ci0KLQkJCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOwotCQkJKnNyY3JlZyAmPSB+bWFzazsKLQkJfQotCQlicmVhazsKLQl9Ci0JREVDT0RFX0NMRUFSX1NFR09WUigpOwotCUVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2xmc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0JaW50IG1vZCwgcmgsIHJsOwotICAgIHUxNiAqZHN0cmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMRlNcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRlMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0ZTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9GUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkvKiBVTkRFRklORUQhICovCi0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2xnc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0JaW50IG1vZCwgcmgsIHJsOwotICAgIHUxNiAqZHN0cmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMR1NcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfR1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0dTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9HUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkvKiBVTkRFRklORUQhICovCi0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX21vdnp4X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZaWFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHU4ICAqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1OCAgKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX21vdnp4X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHUzMiAqZGVzdHJlZzsKLSAgICB1MzIgc3JjdmFsOwotICAgIHUxNiAqc3JjcmVnOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZaWFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSAqc3JjcmVnOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfYnRYX0kodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICBpbnQgYml0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAocmgpIHsKLSAgICBjYXNlIDM6Ci0JREVDT0RFX1BSSU5URigiQlRcdCIpOwotCWJyZWFrOwotICAgIGNhc2UgNDoKLQlERUNPREVfUFJJTlRGKCJCVFNcdCIpOwotCWJyZWFrOwotICAgIGNhc2UgNToKLQlERUNPREVfUFJJTlRGKCJCVFJcdCIpOwotCWJyZWFrOwotICAgIGNhc2UgNjoKLQlERUNPREVfUFJJTlRGKCJCVENcdCIpOwotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JREVDT0RFX1BSSU5URigiSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFXG4iKTsKLQlUUkFDRV9SRUdTKCk7Ci0JcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlglMDJYIElMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERSBFWFRFTlNJT04hXG4iLAotCQlNLng4Ni5SX0NTLCBNLng4Ni5SX0lQLTMsb3AyLCAobW9kPDw2KXwocmg8PDMpfHJsKTsKLQlIQUxUX1NZUygpOwotICAgIH0KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgbWFzazsKLQkgICAgdTggc2hpZnQ7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSBzaGlmdCAmIDB4MUY7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgIGNhc2UgNDoKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsIG1hc2s7Ci0JICAgIHU4IHNoaWZ0OwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gc2hpZnQgJiAweEY7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgIGNhc2UgNDoKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsIG1hc2s7Ci0JICAgIHU4IHNoaWZ0OwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gc2hpZnQgJiAweDFGOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICBjYXNlIDQ6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCB8IG1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgJiB+bWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDY6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCBeIG1hc2spOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCBtYXNrOwotCSAgICB1OCBzaGlmdDsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9IHNoaWZ0ICYgMHhGOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICBjYXNlIDQ6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCB8IG1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgJiB+bWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDY6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCBeIG1hc2spOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCBtYXNrOwotCSAgICB1OCBzaGlmdDsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9IHNoaWZ0ICYgMHgxRjsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgY2FzZSA0OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA2OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJyZWFrOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgbWFzazsKLQkgICAgdTggc2hpZnQ7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSBzaGlmdCAmIDB4RjsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgY2FzZSA0OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA2OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZzsKLQkgICAgdTMyIG1hc2s7Ci0JICAgIHU4IHNoaWZ0OwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9IHNoaWZ0ICYgMHgxRjsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgY2FzZSA0OgotCQkqc3JjcmVnIHw9IG1hc2s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCSpzcmNyZWcgJj0gfm1hc2s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDY6Ci0JCSpzcmNyZWcgXj0gbWFzazsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJyZWFrOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWc7Ci0JICAgIHUxNiBtYXNrOwotCSAgICB1OCBzaGlmdDsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSBzaGlmdCAmIDB4RjsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgY2FzZSA0OgotCQkqc3JjcmVnIHw9IG1hc2s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCSpzcmNyZWcgJj0gfm1hc2s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDY6Ci0JCSpzcmNyZWcgXj0gbWFzazsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfYnRjX1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICBpbnQgYml0LGRpc3A7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkJUQ1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCxtYXNrOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgXiBtYXNrKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLG1hc2s7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCBeIG1hc2spKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLG1hc2s7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCBeIG1hc2spOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsbWFzazsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCBeIG1hc2spKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLG1hc2s7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCBeIG1hc2spOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsbWFzazsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCBeIG1hc2spKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQl1MzIgKnNyY3JlZywqc2hpZnRyZWc7Ci0JICAgIHUzMiBtYXNrOwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOwotCQkJKnNyY3JlZyBePSBtYXNrOwotCQl9IGVsc2UgewotCQkJdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOwotCQkJdTE2IG1hc2s7Ci0KLQkJCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7Ci0JICAgICpzcmNyZWcgXj0gbWFzazsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YmMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9ic2YodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQlNGXG4iKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMzI7ICgqZHN0cmVnKSsrKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAxNjsgKCpkc3RyZWcpKyspCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDMyOyAoKmRzdHJlZykrKykKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMTY7ICgqZHN0cmVnKSsrKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6CQkJCS8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnLCAqZHN0cmVnOwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDMyOyAoKmRzdHJlZykrKykKLQkJaWYgKCgqc3JjcmVnID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWcsICpkc3RyZWc7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMTY7ICgqZHN0cmVnKSsrKQotCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YmQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9ic3IodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQlNGXG4iKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDMxOyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMTU7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMzE7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAxNTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6CQkJCS8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnLCAqZHN0cmVnOwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMzE7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKLQkJaWYgKCgqc3JjcmVnID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWcsICpkc3RyZWc7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAxNTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQotCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9tb3ZzeF9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WU1hcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSAoczMyKSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gKHMxNikoKHM4KWZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IChzMzIpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSAoczE2KSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gKHMzMikoKHM4KWZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IChzMTYpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1OCAgKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAoczMyKSgoczgpKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1OCAgKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAoczE2KSgoczgpKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfbW92c3hfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTMyICpkZXN0cmVnOwotICAgIHUzMiBzcmN2YWw7Ci0gICAgdTE2ICpzcmNyZWc7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlNYXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IChzMzIpKChzMTYpZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCkpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gKHMzMikoKHMxNilmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KSk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSAoczMyKSgoczE2KWZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IChzMzIpKChzMTYpKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRG91YmxlIGJ5dGUgb3BlcmF0aW9uIGNvZGUgdGFibGU6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICgqeDg2ZW11X29wdGFiMlsyNTZdKSh1OCkgPQotewotLyogIDB4MDAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBHcm91cCBGIChyaW5nIDAgUE0pICAgICAgKi8KLS8qICAweDAxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogR3JvdXAgRyAocmluZyAwIFBNKSAgICAgICovCi0vKiAgMHgwMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxhciAocmluZyAwIFBNKSAgICAgICAgICAqLwotLyogIDB4MDMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsc2wgKHJpbmcgMCBQTSkgICAgICAgICAgKi8KLS8qICAweDA0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MDUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsb2FkYWxsICh1bmRvY3VtZW50ZWQpICAgKi8KLS8qICAweDA2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogY2x0cyAocmluZyAwIFBNKSAgICAgICAgICovCi0vKiAgMHgwNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxvYWRhbGwgKHVuZG9jdW1lbnRlZCkgICAqLwotLyogIDB4MDggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBpbnZkIChyaW5nIDAgUE0pICAgICAgICAgKi8KLS8qICAweDA5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogd2JpbnZkIChyaW5nIDAgUE0pICAgICAgICovCi0vKiAgMHgwYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDBiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MGMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgwZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDBlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MGYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweDEwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDEzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDE2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDE5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDFjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MWQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDFmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHgyMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiByZWczMixjcmVnIChyaW5nIDAgUE0pICovCi0vKiAgMHgyMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiByZWczMixkcmVnIChyaW5nIDAgUE0pICovCi0vKiAgMHgyMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiBjcmVnLHJlZzMyIChyaW5nIDAgUE0pICovCi0vKiAgMHgyMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiBkcmVnLHJlZzMyIChyaW5nIDAgUE0pICovCi0vKiAgMHgyNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiByZWczMix0cmVnIChyaW5nIDAgUE0pICovCi0vKiAgMHgyNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDI2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IHRyZWcscmVnMzIgKHJpbmcgMCBQTSkgKi8KLS8qICAweDI3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDJhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MmIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDJkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MmUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4MzAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDMyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDM1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDM4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDNiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4M2MgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDNlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4M2YgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweDQwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQ2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQ5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NGEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDRjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NGQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDRmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHg1MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDUxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDU0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDU3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDVhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NWIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDVkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4NjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDYyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDY1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDY4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDZiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NmMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDZlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NmYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweDcwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDczICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDc2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDc5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4N2EgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDdjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4N2QgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDdmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHg4MCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODEgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDgyICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4MyAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODQgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDg1ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4NiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODcgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDg4ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4OSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4OGEgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDhiICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4YyAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4OGQgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDhlICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4ZiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotCi0vKiAgMHg5MCAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5MSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5MiAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5MyAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5NCAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5NSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5NiAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5NyAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5OCAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5OSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5YSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5YiAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5YyAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5ZCAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5ZSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0vKiAgMHg5ZiAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCi0KLS8qICAweGEwICovIHg4NmVtdU9wMl9wdXNoX0ZTLAotLyogIDB4YTEgKi8geDg2ZW11T3AyX3BvcF9GUywKLS8qICAweGEyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YTMgKi8geDg2ZW11T3AyX2J0X1IsCi0vKiAgMHhhNCAqLyB4ODZlbXVPcDJfc2hsZF9JTU0sCi0vKiAgMHhhNSAqLyB4ODZlbXVPcDJfc2hsZF9DTCwKLS8qICAweGE2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhhOCAqLyB4ODZlbXVPcDJfcHVzaF9HUywKLS8qICAweGE5ICovIHg4NmVtdU9wMl9wb3BfR1MsCi0vKiAgMHhhYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGFiICovIHg4NmVtdU9wMl9idF9SLAotLyogIDB4YWMgKi8geDg2ZW11T3AyX3NocmRfSU1NLAotLyogIDB4YWQgKi8geDg2ZW11T3AyX3NocmRfQ0wsCi0vKiAgMHhhZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGFmICovIHg4NmVtdU9wMl9pbXVsX1JfUk0sCi0KLS8qICAweGIwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogY21weGNoZyAqLwotLyogIDB4YjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBjbXB4Y2hnICovCi0vKiAgMHhiMiAqLyB4ODZlbXVPcDJfbHNzX1JfSU1NLAotLyogIDB4YjMgKi8geDg2ZW11T3AyX2J0cl9SLAotLyogIDB4YjQgKi8geDg2ZW11T3AyX2xmc19SX0lNTSwKLS8qICAweGI1ICovIHg4NmVtdU9wMl9sZ3NfUl9JTU0sCi0vKiAgMHhiNiAqLyB4ODZlbXVPcDJfbW92enhfYnl0ZV9SX1JNLAotLyogIDB4YjcgKi8geDg2ZW11T3AyX21vdnp4X3dvcmRfUl9STSwKLS8qICAweGI4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhiYSAqLyB4ODZlbXVPcDJfYnRYX0ksCi0vKiAgMHhiYiAqLyB4ODZlbXVPcDJfYnRjX1IsCi0vKiAgMHhiYyAqLyB4ODZlbXVPcDJfYnNmLAotLyogIDB4YmQgKi8geDg2ZW11T3AyX2JzciwKLS8qICAweGJlICovIHg4NmVtdU9wMl9tb3ZzeF9ieXRlX1JfUk0sCi0vKiAgMHhiZiAqLyB4ODZlbXVPcDJfbW92c3hfd29yZF9SX1JNLAotCi0vKiAgMHhjMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IHhhZGQgKi8KLS8qICAweGMxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogeGFkZCAqLwotLyogIDB4YzIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhjMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGM0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YzUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhjNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGM3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YzggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLwotLyogIDB4YzkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLwotLyogIDB4Y2EgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLwotLyogIDB4Y2IgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLwotLyogIDB4Y2MgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLwotLyogIDB4Y2QgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLwotLyogIDB4Y2UgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLwotLyogIDB4Y2YgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLwotCi0vKiAgMHhkMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQ0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQ3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGRhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZGIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGRkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZGUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4ZTAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGUyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGU1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGU4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGViICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZWMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGVlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZWYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweGYwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGYzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGY2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGY5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZmEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGZjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZmQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGZmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotfTsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9wcmltX29wcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ByaW1fb3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjFiZjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ByaW1fb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGltcGxlbWVudCB0aGUgcHJpbWl0aXZlCi0qCQkJCW1hY2hpbmUgb3BlcmF0aW9ucyB1c2VkIGJ5IHRoZSBlbXVsYXRpb24gY29kZSBpbiBvcHMuYwotKgotKiBDYXJyeSBDaGFpbiBDYWxjdWxhdGlvbgotKgotKiBUaGlzIHJlcHJlc2VudHMgYSBzb21ld2hhdCBleHBlbnNpdmUgY2FsY3VsYXRpb24gd2hpY2ggaXMKLSogYXBwYXJlbnRseSByZXF1aXJlZCB0byBlbXVsYXRlIHRoZSBzZXR0aW5nIG9mIHRoZSBPRiBhbmQgQUYgZmxhZy4KLSogVGhlIGxhdHRlciBpcyBub3Qgc28gaW1wb3J0YW50LCBidXQgdGhlIGZvcm1lciBpcy4gIFRoZSBvdmVyZmxvdwotKiBmbGFnIGlzIHRoZSBYT1Igb2YgdGhlIHRvcCB0d28gYml0cyBvZiB0aGUgY2FycnkgY2hhaW4gZm9yIGFuCi0qIGFkZGl0aW9uIChzaW1pbGFyIGZvciBzdWJ0cmFjdGlvbikuICBTaW5jZSB3ZSBkbyBub3Qgd2FudCB0bwotKiBzaW11bGF0ZSB0aGUgYWRkaXRpb24gaW4gYSBiaXR3aXNlIG1hbm5lciwgd2UgdHJ5IHRvIGNhbGN1bGF0ZSB0aGUKLSogY2FycnkgY2hhaW4gZ2l2ZW4gdGhlIHR3byBvcGVyYW5kcyBhbmQgdGhlIHJlc3VsdC4KLSoKLSogU28sIGdpdmVuIHRoZSBmb2xsb3dpbmcgdGFibGUsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGFkZGl0aW9uIG9mIHR3bwotKiBiaXRzLCB3ZSBjYW4gZGVyaXZlIGEgZm9ybXVsYSBmb3IgdGhlIGNhcnJ5IGNoYWluLgotKgotKiBhICAgYiAgIGNpbiAgIHIgICAgIGNvdXQKLSogMCAgIDAgICAwICAgICAwICAgICAwCi0qIDAgICAwICAgMSAgICAgMSAgICAgMAotKiAwICAgMSAgIDAgICAgIDEgICAgIDAKLSogMCAgIDEgICAxICAgICAwICAgICAxCi0qIDEgICAwICAgMCAgICAgMSAgICAgMAotKiAxICAgMCAgIDEgICAgIDAgICAgIDEKLSogMSAgIDEgICAwICAgICAwICAgICAxCi0qIDEgICAxICAgMSAgICAgMSAgICAgMQotKgotKiBDb25zdHJ1Y3Rpb24gb2YgdGFibGUgZm9yIGNvdXQ6Ci0qCi0qIGFiCi0qIHIgIFwgIDAwICAgMDEgICAxMSAgMTAKLSogfC0tLS0tLS0tLS0tLS0tLS0tLQotKiAwICB8ICAgMCAgICAxICAgIDEgICAxCi0qIDEgIHwgICAwICAgIDAgICAgMSAgIDAKLSoKLSogQnkgaW5zcGVjdGlvbiwgb25lIGdldHM6ICBjYyA9IGFiICsgIHInKGEgKyBiKQotKgotKiBUaGF0IHJlcHJlc2VudHMgYWxvdCBvZiBvcGVyYXRpb25zLCBidXQgTk8gQ0hPSUNFLi4uLgotKgotKiBCb3Jyb3cgQ2hhaW4gQ2FsY3VsYXRpb24uCi0qCi0qIFRoZSBmb2xsb3dpbmcgdGFibGUgcmVwcmVzZW50cyB0aGUgc3VidHJhY3Rpb24gb2YgdHdvIGJpdHMsIGZyb20KLSogd2hpY2ggd2UgY2FuIGRlcml2ZSBhIGZvcm11bGEgZm9yIHRoZSBib3Jyb3cgY2hhaW4uCi0qCi0qIGEgICBiICAgYmluICAgciAgICAgYm91dAotKiAwICAgMCAgIDAgICAgIDAgICAgIDAKLSogMCAgIDAgICAxICAgICAxICAgICAxCi0qIDAgICAxICAgMCAgICAgMSAgICAgMQotKiAwICAgMSAgIDEgICAgIDAgICAgIDEKLSogMSAgIDAgICAwICAgICAxICAgICAwCi0qIDEgICAwICAgMSAgICAgMCAgICAgMAotKiAxICAgMSAgIDAgICAgIDAgICAgIDAKLSogMSAgIDEgICAxICAgICAxICAgICAxCi0qCi0qIENvbnN0cnVjdGlvbiBvZiB0YWJsZSBmb3IgY291dDoKLSoKLSogYWIKLSogciAgXCAgMDAgICAwMSAgIDExICAxMAotKiB8LS0tLS0tLS0tLS0tLS0tLS0tCi0qIDAgIHwgICAwICAgIDEgICAgMCAgIDAKLSogMSAgfCAgIDEgICAgMSAgICAxICAgMAotKgotKiBCeSBpbnNwZWN0aW9uLCBvbmUgZ2V0czogIGJjID0gYSdiICsgIHIoYScgKyBiKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZQlQUklNX09QU19OT19SRURFRklORV9BU00KLSNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmCV9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18KLQotc3RhdGljIHUzMiB4ODZlbXVfcGFyaXR5X3RhYls4XSA9Ci17Ci0JMHg5NjY5Njk5NiwKLQkweDY5OTY5NjY5LAotCTB4Njk5Njk2NjksCi0JMHg5NjY5Njk5NiwKLQkweDY5OTY5NjY5LAotCTB4OTY2OTY5OTYsCi0JMHg5NjY5Njk5NiwKLQkweDY5OTY5NjY5LAotfTsKLQotI2VuZGlmCi0KLSNkZWZpbmUgUEFSSVRZKHgpICAgKCgoeDg2ZW11X3Bhcml0eV90YWJbKHgpIC8gMzJdID4+ICgoeCkgJSAzMikpICYgMSkgPT0gMCkKLSNkZWZpbmUgWE9SMih4KSAJKCgoeCkgXiAoKHgpPj4xKSkgJiAweDEpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYJX19IQVZFX0lOTElORV9BU1NFTUJMRVJfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFBQSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBhYWFfd29yZCh1MTYgZCkKLXsKLQl1MTYJcmVzOwotCWlmICgoZCAmIDB4ZikgPiAweDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKLQkJZCArPSAweDY7Ci0JCWQgKz0gMHgxMDA7Ci0JCVNFVF9GTEFHKEZfQUYpOwotCQlTRVRfRkxBRyhGX0NGKTsKLQl9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfQUYpOwotCX0KLQlyZXMgPSAodTE2KShkICYgMHhGRjBGKTsKLQlDTEVBUl9GTEFHKEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQUFBIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGFhc193b3JkKHUxNiBkKQotewotCXUxNglyZXM7Ci0JaWYgKChkICYgMHhmKSA+IDB4OSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgewotCQlkIC09IDB4NjsKLQkJZCAtPSAweDEwMDsKLQkJU0VUX0ZMQUcoRl9BRik7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCX0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9BRik7Ci0JfQotCXJlcyA9ICh1MTYpKGQgJiAweEZGMEYpOwotCUNMRUFSX0ZMQUcoRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBQUQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgYWFkX3dvcmQodTE2IGQpCi17Ci0JdTE2IGw7Ci0JdTggaGIsIGxiOwotCi0JaGIgPSAodTgpKChkID4+IDgpICYgMHhmZik7Ci0JbGIgPSAodTgpKChkICYgMHhmZikpOwotCWwgPSAodTE2KSgobGIgKyAxMCAqIGhiKSAmIDB4RkYpOwotCi0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcobCAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGwgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKGwgJiAweGZmKSwgRl9QRik7Ci0JcmV0dXJuIGw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQUFNIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGFhbV93b3JkKHU4IGQpCi17Ci0gICAgdTE2IGgsIGw7Ci0KLQloID0gKHUxNikoZCAvIDEwKTsKLQlsID0gKHUxNikoZCAlIDEwKTsKLQlsIHw9ICh1MTYpKGggPDwgOCk7Ci0KLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhsICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcobCA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkobCAmIDB4ZmYpLCBGX1BGKTsKLSAgICByZXR1cm4gbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBhZGNfYnl0ZSh1OCBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQotCQlyZXMgPSAxICsgZCArIHM7Ci0JZWxzZQotCQlyZXMgPSBkICsgczsKLQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MTAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLQljYyA9IChzICYgZCkgfCAoKH5yZXMpICYgKHMgfCBkKSk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiA2KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFEQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBhZGNfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCi0JCXJlcyA9IDEgKyBkICsgczsKLQllbHNlCi0JCXJlcyA9IGQgKyBzOwotCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxMDAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotCWNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDE0KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgYWRjX2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiBsbzsJLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGhpOwotCXJlZ2lzdGVyIHUzMiByZXM7Ci0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7Ci0JCWxvID0gMSArIChkICYgMHhGRkZGKSArIChzICYgMHhGRkZGKTsKLQkJcmVzID0gMSArIGQgKyBzOwotCQl9Ci0JZWxzZSB7Ci0JCWxvID0gKGQgJiAweEZGRkYpICsgKHMgJiAweEZGRkYpOwotCQlyZXMgPSBkICsgczsKLQkJfQotCWhpID0gKGxvID4+IDE2KSArIChkID4+IDE2KSArIChzID4+IDE2KTsKLQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGhpICYgMHgxMDAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0JY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gMzApLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBREQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBhZGRfYnl0ZSh1OCBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JcmVzID0gZCArIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotCWNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDYpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQUREIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGFkZF93b3JkKHUxNiBkLCB1MTYgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCXJlcyA9IGQgKyBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MTAwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLQljYyA9IChzICYgZCkgfCAoKH5yZXMpICYgKHMgfCBkKSk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiAxNCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQUREIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGFkZF9sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgbG87CS8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBoaTsKLQlyZWdpc3RlciB1MzIgcmVzOwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCWxvID0gKGQgJiAweEZGRkYpICsgKHMgJiAweEZGRkYpOwotCXJlcyA9IGQgKyBzOwotCWhpID0gKGxvID4+IDE2KSArIChkID4+IDE2KSArIChzID4+IDE2KTsKLQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGhpICYgMHgxMDAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLSAgICAvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0gICAgY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gMzApLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFORCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGFuZF9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgJiBzOwotCi0JLyogc2V0IHRoZSBmbGFncyAgKi8KLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyksIEZfUEYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQU5EIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGFuZF93b3JkKHUxNiBkLCB1MTYgcykKLXsKLSAgICByZWdpc3RlciB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0gICAgcmVzID0gZCAmIHM7Ci0KLSAgICAvKiBzZXQgdGhlIGZsYWdzICAqLwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBTkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgYW5kX2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkICYgczsKLQotCS8qIHNldCB0aGUgZmxhZ3MgICovCi0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBDTVAgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBjbXBfYnl0ZSh1OCBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGJjOwotCi0JcmVzID0gZCAtIHM7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDYpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIGQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQ01QIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGNtcF93b3JkKHUxNiBkLCB1MTYgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBiYzsKLQotCXJlcyA9IGQgLSBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0gICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMTQpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIGQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQ01QIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGNtcF9sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBiYzsKLQotCXJlcyA9IGQgLSBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMDAwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMzApLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIGQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgREFBIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggZGFhX2J5dGUodTggZCkKLXsKLQl1MzIgcmVzID0gZDsKLQlpZiAoKGQgJiAweGYpID4gOSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgewotCQlyZXMgKz0gNjsKLQkJU0VUX0ZMQUcoRl9BRik7Ci0JfQotCWlmIChyZXMgPiAweDlGIHx8IEFDQ0VTU19GTEFHKEZfQ0YpKSB7Ci0JCXJlcyArPSAweDYwOwotCQlTRVRfRkxBRyhGX0NGKTsKLQl9Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4RkYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgREFTIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggZGFzX2J5dGUodTggZCkKLXsKLQlpZiAoKGQgJiAweGYpID4gOSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgewotCQlkIC09IDY7Ci0JCVNFVF9GTEFHKEZfQUYpOwotCX0KLQlpZiAoZCA+IDB4OUYgfHwgQUNDRVNTX0ZMQUcoRl9DRikpIHsKLQkJZCAtPSAweDYwOwotCQlTRVRfRkxBRyhGX0NGKTsKLQl9Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoZCAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGQgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKGQgJiAweGZmKSwgRl9QRik7Ci0JcmV0dXJuIGQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgREVDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggZGVjX2J5dGUodTggZCkKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotICAgIHJlZ2lzdGVyIHUzMiBiYzsKLQotICAgIHJlcyA9IGQgLSAxOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQkvKiBiYXNlZCBvbiBzdWJfYnl0ZSwgdXNlcyBzPT0xLiAgKi8KLQliYyA9IChyZXMgJiAofmQgfCAxKSkgfCAofmQgJiAxKTsKLQkvKiBjYXJyeSBmbGFnIHVuY2hhbmdlZCAqLwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBERUMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgZGVjX3dvcmQodTE2IGQpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLSAgICByZWdpc3RlciB1MzIgYmM7Ci0KLSAgICByZXMgPSBkIC0gMTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLSAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotICAgIC8qIGJhc2VkIG9uIHRoZSBzdWJfYnl0ZSByb3V0aW5lLCB3aXRoIHM9PTEgKi8KLSAgICBiYyA9IChyZXMgJiAofmQgfCAxKSkgfCAofmQgJiAxKTsKLSAgICAvKiBjYXJyeSBmbGFnIHVuY2hhbmdlZCAqLwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMTQpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIERFQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBkZWNfbG9uZyh1MzIgZCkKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotICAgIHJlZ2lzdGVyIHUzMiBiYzsKLQotICAgIHJlcyA9IGQgLSAxOwotCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLSAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IDEpKSB8ICh+ZCAmIDEpOwotCS8qIGNhcnJ5IGZsYWcgdW5jaGFuZ2VkICovCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElOQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGluY19ieXRlKHU4IGQpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlyZXMgPSBkICsgMTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLQljYyA9ICgoMSAmIGQpIHwgKH5yZXMpKSAmICgxIHwgZCk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiA2KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElOQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBpbmNfd29yZCh1MTYgZCkKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCXJlcyA9IGQgKyAxOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLQljYyA9ICgxICYgZCkgfCAoKH5yZXMpICYgKDEgfCBkKSk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiAxNCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSU5DIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGluY19sb25nKHUzMiBkKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JcmVzID0gZCArIDE7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0JY2MgPSAoMSAmIGQpIHwgKCh+cmVzKSAmICgxIHwgZCkpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gMzApLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IG9yX2J5dGUodTggZCwgdTggcykKLXsKLQlyZWdpc3RlciB1OCByZXM7ICAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCB8IHM7Ci0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMpLCBGX1BGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IG9yX3dvcmQodTE2IGQsIHUxNiBzKQotewotCXJlZ2lzdGVyIHUxNiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkIHwgczsKLQkvKiBzZXQgdGhlIGNhcnJ5IGZsYWcgdG8gYmUgYml0IDggKi8KLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgb3JfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgfCBzOwotCi0JLyogc2V0IHRoZSBjYXJyeSBmbGFnIHRvIGJlIGJpdCA4ICovCi0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IG5lZ19ieXRlKHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdTggcmVzOwotICAgIHJlZ2lzdGVyIHU4IGJjOwotCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocyAhPSAwLCBGX0NGKTsKLQlyZXMgPSAodTgpLXM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMpLCBGX1BGKTsKLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbiAtLS0gbW9kaWZpZWQgc3VjaCB0aGF0IGQ9MC4KLQkgICBzdWJzdGl0dXRpaW5nIGQ9MCBpbnRvICAgICBiYz0gcmVzJih+ZHxzKXwofmQmcyk7Ci0JICAgKHRoZSBvbmUgdXNlZCBmb3Igc3ViKSBhbmQgc2ltcGxpZnlpbmcsIHNpbmNlIH5kPTB4ZmYuLi4sCi0JICAgfmR8cyA9PSAweGZmZmYuLi4sIGFuZCByZXMmMHhmZmYuLi4gPT0gcmVzLiAgU2ltaWxhcmx5Ci0JICAgfmQmcyA9PSBzLiAgU28gdGhlIHNpbXBsaWZpZWQgcmVzdWx0IGlzOiAqLwotCWJjID0gcmVzIHwgczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDYpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBuZWdfd29yZCh1MTYgcykKLXsKLQlyZWdpc3RlciB1MTYgcmVzOwotCXJlZ2lzdGVyIHUxNiBiYzsKLQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgIT0gMCwgRl9DRik7Ci0JcmVzID0gKHUxNiktczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbiAtLS0gbW9kaWZpZWQgc3VjaCB0aGF0IGQ9MC4KLQkgICBzdWJzdGl0dXRpaW5nIGQ9MCBpbnRvICAgICBiYz0gcmVzJih+ZHxzKXwofmQmcyk7Ci0JICAgKHRoZSBvbmUgdXNlZCBmb3Igc3ViKSBhbmQgc2ltcGxpZnlpbmcsIHNpbmNlIH5kPTB4ZmYuLi4sCi0JICAgfmR8cyA9PSAweGZmZmYuLi4sIGFuZCByZXMmMHhmZmYuLi4gPT0gcmVzLiAgU2ltaWxhcmx5Ci0JICAgfmQmcyA9PSBzLiAgU28gdGhlIHNpbXBsaWZpZWQgcmVzdWx0IGlzOiAqLwotCWJjID0gcmVzIHwgczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgbmVnX2xvbmcodTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsKLQlyZWdpc3RlciB1MzIgYmM7Ci0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhzICE9IDAsIEZfQ0YpOwotCXJlcyA9ICh1MzIpLXM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbiAtLS0gbW9kaWZpZWQgc3VjaCB0aGF0IGQ9MC4KLQkgICBzdWJzdGl0dXRpaW5nIGQ9MCBpbnRvICAgICBiYz0gcmVzJih+ZHxzKXwofmQmcyk7Ci0JICAgKHRoZSBvbmUgdXNlZCBmb3Igc3ViKSBhbmQgc2ltcGxpZnlpbmcsIHNpbmNlIH5kPTB4ZmYuLi4sCi0JICAgfmR8cyA9PSAweGZmZmYuLi4sIGFuZCByZXMmMHhmZmYuLi4gPT0gcmVzLiAgU2ltaWxhcmx5Ci0JICAgfmQmcyA9PSBzLiAgU28gdGhlIHNpbXBsaWZpZWQgcmVzdWx0IGlzOiAqLwotCWJjID0gcmVzIHwgczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgTk9UIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggbm90X2J5dGUodTggcykKLXsKLQlyZXR1cm4gfnM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgTk9UIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IG5vdF93b3JkKHUxNiBzKQotewotCXJldHVybiB+czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBOT1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgbm90X2xvbmcodTMyIHMpCi17Ci0JcmV0dXJuIH5zOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHJjbF9ieXRlKHU4IGQsIHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrLCBjZjsKLQotICAgIC8qIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LiAqLwotCS8qIGhhdmUKLQotICAgICAgIENGICBCXzcgQl82IEJfNSBCXzQgQl8zIEJfMiBCXzEgQl8wCi0KLSAgICAgICB3YW50IHRvIHJvdGF0ZSB0aHJvdWdoIHRoZSBjYXJyeSBieSAicyIgYml0cy4gIFdlIGNvdWxkCi0gICAgICAgbG9vcCwgYnV0IHRoYXQncyBpbmVmZmljaWVudC4gIFNvIHRoZSB3aWR0aCBpcyA5LAotICAgICAgIGFuZCB3ZSBzcGxpdCBpbnRvIHRocmVlIHBhcnRzOgotCi0gICAgICAgVGhlIG5ldyBjYXJyeSBmbGFnICAgKHdhcyBCX24pCi0gICAgICAgdGhlIHN0dWZmIGluIEJfbi0xIC4uIEJfMAotICAgICAgIHRoZSBzdHVmZiBpbiBCXzcgLi4gQl9uKzEKLQotICAgICAgIFRoZSBuZXcgcm90YXRlIGlzIGRvbmUgbW9kIDksIGFuZCBnaXZlbiB0aGlzLAotICAgICAgIGZvciBhIHJvdGF0aW9uIG9mIG4gYml0cyAobW9kIDkpIHRoZSBuZXcgY2FycnkgZmxhZyBpcwotICAgICAgIHRoZW4gbG9jYXRlZCBuIGJpdHMgZnJvbSB0aGUgTVNCLiAgVGhlIGxvdyBwYXJ0IGlzCi0gICAgICAgdGhlbiBzaGlmdGVkIHVwIGNudCBiaXRzLCBhbmQgdGhlIGhpZ2ggcGFydCBpcyBvcidkCi0gICAgICAgaW4uICBVc2luZyBDQVBTIGZvciBuZXcgdmFsdWVzLCBhbmQgbG93ZXJjYXNlIGZvciB0aGUKLSAgICAgICBvcmlnaW5hbCB2YWx1ZXMsIHRoaXMgY2FuIGJlIGV4cHJlc3NlZCBhczoKLQotICAgICAgIElGIG4gPiAwCi0gICAgICAgMSkgQ0YgPC0gIGJfKDgtbikKLSAgICAgICAyKSBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfMAotICAgICAgIDMpIEJfKG4tMSkgPC0gY2YKLSAgICAgICA0KSBCXyhuLTIpIC4uIEJfMCA8LSAgYl83IC4uIGJfKDgtKG4tMSkpCi0JICovCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSA5KSAhPSAwKSB7Ci0JLyogZXh0cmFjdCB0aGUgbmV3IENBUlJZIEZMQUcuICovCi0JLyogQ0YgPC0gIGJfKDgtbikgICAgICAgICAgICAgKi8KLQljZiA9IChkID4+ICg4IC0gY250KSkgJiAweDE7Ci0KLQkvKiBnZXQgdGhlIGxvdyBzdHVmZiB3aGljaCByb3RhdGVkCi0JICAgaW50byB0aGUgcmFuZ2UgQl83IC4uIEJfY250ICovCi0JLyogQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXzAgICovCi0JLyogbm90ZSB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgZG9uZSBieSB0aGUgbWFzayAqLwotCQlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZjsKLQotCS8qIG5vdyB0aGUgaGlnaCBzdHVmZiB3aGljaCByb3RhdGVkIGFyb3VuZAotCSAgIGludG8gdGhlIHBvc2l0aW9ucyBCX2NudC0yIC4uIEJfMCAqLwotCS8qIEJfKG4tMikgLi4gQl8wIDwtICBiXzcgLi4gYl8oOC0obi0xKSkgKi8KLQkvKiBzaGlmdCBpdCBkb3dud2FyZCwgNy0obi0yKSA9IDktbiBwb3NpdGlvbnMuCi0JICAgYW5kIG1hc2sgb2ZmIHRoZSByZXN1bHQgYmVmb3JlIG9yJ2luZyBpbi4KLQkgKi8KLQltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7Ci0JcmVzIHw9IChkID4+ICg5IC0gY250KSkgJiBtYXNrOwotCi0JLyogaWYgdGhlIGNhcnJ5IGZsYWcgd2FzIHNldCwgb3IgaXQgaW4uICAqLwotCQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCi0JICAgIC8qICBCXyhuLTEpIDwtIGNmICovCi0JICAgIHJlcyB8PSAxIDw8IChjbnQgLSAxKTsKLQl9Ci0JLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgYmFzZWQgb24gdGhlIHZhcmlhYmxlICJjZiIgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCS8qIE9WRVJGTE9XIGlzIHNldCAqSUZGKiBjbnQ9PTEsIHRoZW4gaXQgaXMgdGhlCi0JICAgeG9yIG9mIENGIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBCbGVjY2suICovCi0JLyogcGFyZW50aGVzaXplZCB0aGlzIGV4cHJlc3Npb24gc2luY2UgaXQgYXBwZWFycyB0bwotCSAgIGJlIGNhdXNpbmcgT0YgdG8gYmUgbWlzc2V0ICovCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDYpICYgMHgyKSksCi0JCQkJCQkJIEZfT0YpOwotCi0gICAgfQotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiByY2xfd29yZCh1MTYgZCwgdTggcykKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2ssIGNmOwotCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSAxNykgIT0gMCkgewotCQljZiA9IChkID4+ICgxNiAtIGNudCkpICYgMHgxOwotCQlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZmZmOwotCQltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7Ci0JCXJlcyB8PSAoZCA+PiAoMTcgLSBjbnQpKSAmIG1hc2s7Ci0JCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgewotCQkJcmVzIHw9IDEgPDwgKGNudCAtIDEpOwotCQl9Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDE0KSAmIDB4MikpLAotCQkJCQkJCSBGX09GKTsKLQl9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiByY2xfbG9uZyh1MzIgZCwgdTggcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzLCBjbnQsIG1hc2ssIGNmOwotCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSAzMykgIT0gMCkgewotCQljZiA9IChkID4+ICgzMiAtIGNudCkpICYgMHgxOwotCQlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZmZmZmZmZjsKLQkJbWFzayA9ICgxIDw8IChjbnQgLSAxKSkgLSAxOwotCQlyZXMgfD0gKGQgPj4gKDMzIC0gY250KSkgJiBtYXNrOwotCQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCi0JCQlyZXMgfD0gMSA8PCAoY250IC0gMSk7Ci0JCX0KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjbnQgPT0gMSAmJiBYT1IyKGNmICsgKChyZXMgPj4gMzApICYgMHgyKSksCi0JCQkJCQkJIEZfT0YpOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJDUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHJjcl9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JdTMyCXJlcywgY250OwotCXUzMgltYXNrLCBjZiwgb2NmID0gMDsKLQotCS8qIHJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5ICovCi0gICAgLyoKLSAgICAgICBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4KLSAgICAgICBkIGlzIHRoZSBieXRlIG9iamVjdCByb3RhdGVkLgotCi0gICAgICAgaGF2ZQotCi0gICAgICAgQ0YgIEJfNyBCXzYgQl81IEJfNCBCXzMgQl8yIEJfMSBCXzAKLQotICAgICAgIFRoZSBuZXcgcm90YXRlIGlzIGRvbmUgbW9kIDksIGFuZCBnaXZlbiB0aGlzLAotICAgICAgIGZvciBhIHJvdGF0aW9uIG9mIG4gYml0cyAobW9kIDkpIHRoZSBuZXcgY2FycnkgZmxhZyBpcwotICAgICAgIHRoZW4gbG9jYXRlZCBuIGJpdHMgZnJvbSB0aGUgTFNCLiAgVGhlIGxvdyBwYXJ0IGlzCi0gICAgICAgdGhlbiBzaGlmdGVkIHVwIGNudCBiaXRzLCBhbmQgdGhlIGhpZ2ggcGFydCBpcyBvcidkCi0gICAgICAgaW4uICBVc2luZyBDQVBTIGZvciBuZXcgdmFsdWVzLCBhbmQgbG93ZXJjYXNlIGZvciB0aGUKLSAgICAgICBvcmlnaW5hbCB2YWx1ZXMsIHRoaXMgY2FuIGJlIGV4cHJlc3NlZCBhczoKLQotICAgICAgIElGIG4gPiAwCi0gICAgICAgMSkgQ0YgPC0gIGJfKG4tMSkKLSAgICAgICAyKSBCXyg4LShuKzEpKSAuLiBCXygwKSAgPC0gIGJfKDcpIC4uIGJfKG4pCi0gICAgICAgMykgQl8oOC1uKSA8LSBjZgotICAgICAgIDQpIEJfKDcpIC4uIEJfKDgtKG4tMSkpIDwtICBiXyhuLTIpIC4uIGJfKDApCi0JICovCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSA5KSAhPSAwKSB7Ci0JLyogZXh0cmFjdCB0aGUgbmV3IENBUlJZIEZMQUcuICovCi0JLyogQ0YgPC0gIGJfKG4tMSkgICAgICAgICAgICAgICovCi0JaWYgKGNudCA9PSAxKSB7Ci0JICAgIGNmID0gZCAmIDB4MTsKLQkgICAgLyogbm90ZSBoYWNrZXJ5IGhlcmUuICBBY2Nlc3NfZmxhZyguLikgZXZhbHVhdGVzIHRvIGVpdGhlcgotCSAgICAgICAwIGlmIGZsYWcgbm90IHNldAotCSAgICAgICBub24temVybyBpZiBmbGFnIGlzIHNldC4KLQkgICAgICAgZG9pbmcgYWNjZXNzX2ZsYWcoLi4pICE9IDAgY2FzdHMgdGhhdCBpbnRvIGVpdGhlcgotCQkJICAgMC4uMSBpbiBhbnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZsYWdzIHJlZ2lzdGVyCi0JICAgICAgIChpLmUuIHBhY2tlZCBiaXQgYXJyYXkgb3IgdW5wYWNrZWQuKQotCSAgICAgKi8KLQkJCW9jZiA9IEFDQ0VTU19GTEFHKEZfQ0YpICE9IDA7Ci0JfSBlbHNlCi0JICAgIGNmID0gKGQgPj4gKGNudCAtIDEpKSAmIDB4MTsKLQotCS8qIEJfKDgtKG4rMSkpIC4uIEJfKDApICA8LSAgYl8oNykgLi4gYl9uICAqLwotCS8qIG5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBzaWRlIGRvbmUgYnkgdGhlIG1hc2sKLQkgICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGRvbmUgYnkgc2hpZnRpbmcgdGhlCi0JICAgb2JqZWN0IHRvIHRoZSByaWdodC4gIFRoZSByZXN1bHQgbXVzdCBiZSBtYXNrZWQsCi0JICAgaW4gY2FzZSB0aGUgb2JqZWN0IGNhbWUgaW4gYW5kIHdhcyB0cmVhdGVkCi0JICAgYXMgYSBuZWdhdGl2ZSBudW1iZXIuICBOZWVkZWQ/Pz8gKi8KLQotCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKLQlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKLQotCS8qIG5vdyB0aGUgaGlnaCBzdHVmZiB3aGljaCByb3RhdGVkIGFyb3VuZAotCSAgIGludG8gdGhlIHBvc2l0aW9ucyBCX2NudC0yIC4uIEJfMCAqLwotCS8qIEJfKDcpIC4uIEJfKDgtKG4tMSkpIDwtICBiXyhuLTIpIC4uIGJfKDApICovCi0JLyogc2hpZnQgaXQgZG93bndhcmQsIDctKG4tMikgPSA5LW4gcG9zaXRpb25zLgotCSAgIGFuZCBtYXNrIG9mZiB0aGUgcmVzdWx0IGJlZm9yZSBvcidpbmcgaW4uCi0JICovCi0JcmVzIHw9IChkIDw8ICg5IC0gY250KSk7Ci0KLQkvKiBpZiB0aGUgY2FycnkgZmxhZyB3YXMgc2V0LCBvciBpdCBpbi4gICovCi0JCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeyAgICAgLyogY2FycnkgZmxhZyBpcyBzZXQgKi8KLQkgICAgLyogIEJfKDgtbikgPC0gY2YgKi8KLQkgICAgcmVzIHw9IDEgPDwgKDggLSBjbnQpOwotCX0KLQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBiYXNlZCBvbiB0aGUgdmFyaWFibGUgImNmIiAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIGNudD09MSwgdGhlbiBpdCBpcyB0aGUKLQkgICB4b3Igb2YgQ0YgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIEJsZWNjay4gKi8KLQkvKiBwYXJlbnRoZXNpemVkLi4uICovCi0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihvY2YgKyAoKGQgPj4gNikgJiAweDIpKSwKLQkJCQkJCQkJIEZfT0YpOwotCQl9Ci0JfQotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJDUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiByY3Jfd29yZCh1MTYgZCwgdTggcykKLXsKLQl1MzIgcmVzLCBjbnQ7Ci0JdTMyCW1hc2ssIGNmLCBvY2YgPSAwOwotCi0JLyogcm90YXRlIHJpZ2h0IHRocm91Z2ggY2FycnkgKi8KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDE3KSAhPSAwKSB7Ci0JCWlmIChjbnQgPT0gMSkgewotCQkJY2YgPSBkICYgMHgxOwotCQkJb2NmID0gQUNDRVNTX0ZMQUcoRl9DRikgIT0gMDsKLQkJfSBlbHNlCi0JCQljZiA9IChkID4+IChjbnQgLSAxKSkgJiAweDE7Ci0JCW1hc2sgPSAoMSA8PCAoMTYgLSBjbnQpKSAtIDE7Ci0JCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOwotCQlyZXMgfD0gKGQgPDwgKDE3IC0gY250KSk7Ci0JCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgewotCQkJcmVzIHw9IDEgPDwgKDE2IC0gY250KTsKLQkJfQotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihvY2YgKyAoKGQgPj4gMTQpICYgMHgyKSksCi0JCQkJCQkJCSBGX09GKTsKLQkJfQotCX0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUkNSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHJjcl9sb25nKHUzMiBkLCB1OCBzKQotewotCXUzMiByZXMsIGNudDsKLQl1MzIgbWFzaywgY2YsIG9jZiA9IDA7Ci0KLQkvKiByb3RhdGUgcmlnaHQgdGhyb3VnaCBjYXJyeSAqLwotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgMzMpICE9IDApIHsKLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQljZiA9IGQgJiAweDE7Ci0JCQlvY2YgPSBBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwOwotCQl9IGVsc2UKLQkJCWNmID0gKGQgPj4gKGNudCAtIDEpKSAmIDB4MTsKLQkJbWFzayA9ICgxIDw8ICgzMiAtIGNudCkpIC0gMTsKLQkJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7Ci0JCWlmIChjbnQgIT0gMSkKLQkJCXJlcyB8PSAoZCA8PCAoMzMgLSBjbnQpKTsKLQkJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLwotCQkJcmVzIHw9IDEgPDwgKDMyIC0gY250KTsKLQkJfQotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihvY2YgKyAoKGQgPj4gMzApICYgMHgyKSksCi0JCQkJCQkJCSBGX09GKTsKLQkJfQotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJPTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHJvbF9ieXRlKHU4IGQsIHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOwotCi0gICAgLyogcm90YXRlIGxlZnQgKi8KLSAgICAvKgotICAgICAgIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LgotICAgICAgIGQgaXMgdGhlIGJ5dGUgb2JqZWN0IHJvdGF0ZWQuCi0KLSAgICAgICBoYXZlCi0KLSAgICAgICBDRiAgQl83IC4uLiBCXzAKLQotICAgICAgIFRoZSBuZXcgcm90YXRlIGlzIGRvbmUgbW9kIDguCi0gICAgICAgTXVjaCBzaW1wbGVyIHRoYW4gdGhlICJyY2wiIG9yICJyY3IiIG9wZXJhdGlvbnMuCi0KLSAgICAgICBJRiBuID4gMAotICAgICAgIDEpIEJfKDcpIC4uIEJfKG4pICA8LSAgYl8oOC0obisxKSkgLi4gYl8oMCkKLSAgICAgICAyKSBCXyhuLTEpIC4uIEJfKDApIDwtICBiXyg3KSAuLiBiXyg4LW4pCi0JICovCi0gICAgcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSA4KSAhPSAwKSB7Ci0JCS8qIEJfKDcpIC4uIEJfKG4pICA8LSAgYl8oOC0obisxKSkgLi4gYl8oMCkgKi8KLQkJcmVzID0gKGQgPDwgY250KTsKLQotCQkvKiBCXyhuLTEpIC4uIEJfKDApIDwtICBiXyg3KSAuLiBiXyg4LW4pICovCi0JCW1hc2sgPSAoMSA8PCBjbnQpIC0gMTsKLQkJcmVzIHw9IChkID4+ICg4IC0gY250KSkgJiBtYXNrOwotCi0JCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCi0JCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7Ci0JCS8qIE9WRVJGTE9XIGlzIHNldCAqSUZGKiBzPT0xLCB0aGVuIGl0IGlzIHRoZQotCQkgICB4b3Igb2YgQ0YgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIEJsZWNjay4gKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmCi0JCQkJCQkJIFhPUjIoKHJlcyAmIDB4MSkgKyAoKHJlcyA+PiA2KSAmIDB4MikpLAotCQkJCQkJCSBGX09GKTsKLQl9IGlmIChzICE9IDApIHsKLQkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKLQkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKLQl9Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUk9MIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHJvbF93b3JkKHUxNiBkLCB1OCBzKQotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKLQotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgMTYpICE9IDApIHsKLQkJcmVzID0gKGQgPDwgY250KTsKLQkJbWFzayA9ICgxIDw8IGNudCkgLSAxOwotCQlyZXMgfD0gKGQgPj4gKDE2IC0gY250KSkgJiBtYXNrOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKLQkJCQkJCQkgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDE0KSAmIDB4MikpLAotCQkJCQkJCSBGX09GKTsKLQl9IGlmIChzICE9IDApIHsKLQkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKLQkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKLQl9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJPTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiByb2xfbG9uZyh1MzIgZCwgdTggcykKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzLCBjbnQsIG1hc2s7Ci0KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDMyKSAhPSAwKSB7Ci0JCXJlcyA9IChkIDw8IGNudCk7Ci0JCW1hc2sgPSAoMSA8PCBjbnQpIC0gMTsKLQkJcmVzIHw9IChkID4+ICgzMiAtIGNudCkpICYgbWFzazsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmCi0JCQkJCQkJIFhPUjIoKHJlcyAmIDB4MSkgKyAoKHJlcyA+PiAzMCkgJiAweDIpKSwKLQkJCQkJCQkgRl9PRik7Ci0JfSBpZiAocyAhPSAwKSB7Ci0JCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCi0JCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggcm9yX2J5dGUodTggZCwgdTggcykKLXsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7Ci0KLSAgICAvKiByb3RhdGUgcmlnaHQgKi8KLSAgICAvKgotICAgICAgIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LgotICAgICAgIGQgaXMgdGhlIGJ5dGUgb2JqZWN0IHJvdGF0ZWQuCi0KLSAgICAgICBoYXZlCi0KLSAgICAgICBCXzcgLi4uIEJfMAotCi0gICAgICAgVGhlIHJvdGF0ZSBpcyBkb25lIG1vZCA4LgotCi0gICAgICAgSUYgbiA+IDAKLSAgICAgICAxKSBCXyg4LShuKzEpKSAuLiBCXygwKSAgPC0gIGJfKDcpIC4uIGJfKG4pCi0gICAgICAgMikgQl8oNykgLi4gQl8oOC1uKSA8LSAgYl8obi0xKSAuLiBiXygwKQotCSAqLwotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgOCkgIT0gMCkgeyAgICAgICAgICAgLyogbm90IGEgdHlwbywgZG8gbmFkYSBpZiBjbnQ9PTAgKi8KLQkvKiBCXyg3KSAuLiBCXyg4LW4pIDwtICBiXyhuLTEpIC4uIGJfKDApICovCi0JcmVzID0gKGQgPDwgKDggLSBjbnQpKTsKLQotCS8qIEJfKDgtKG4rMSkpIC4uIEJfKDApICA8LSAgYl8oNykgLi4gYl8obikgKi8KLQltYXNrID0gKDEgPDwgKDggLSBjbnQpKSAtIDE7Ci0JcmVzIHw9IChkID4+IChjbnQpKSAmIG1hc2s7Ci0KLQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgotCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfQ0YpOwotCQkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogcz09MSwgdGhlbiBpdCBpcyB0aGUKLQkgICB4b3Igb2YgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMuICBCbGVjY2suICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJiBYT1IyKHJlcyA+PiA2KSwgRl9PRik7Ci0JfSBlbHNlIGlmIChzICE9IDApIHsKLQkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKLQkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9DRik7Ci0JfQotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiByb3Jfd29yZCh1MTYgZCwgdTggcykKLXsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7Ci0KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDE2KSAhPSAwKSB7Ci0JCXJlcyA9IChkIDw8ICgxNiAtIGNudCkpOwotCQltYXNrID0gKDEgPDwgKDE2IC0gY250KSkgLSAxOwotCQlyZXMgfD0gKGQgPj4gKGNudCkpICYgbWFzazsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX0NGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDE0KSwgRl9PRik7Ci0JfSBlbHNlIGlmIChzICE9IDApIHsKLQkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKLQkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX0NGKTsKLQl9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiByb3JfbG9uZyh1MzIgZCwgdTggcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzLCBjbnQsIG1hc2s7Ci0KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDMyKSAhPSAwKSB7Ci0JCXJlcyA9IChkIDw8ICgzMiAtIGNudCkpOwotCQltYXNrID0gKDEgPDwgKDMyIC0gY250KSkgLSAxOwotCQlyZXMgfD0gKGQgPj4gKGNudCkpICYgbWFzazsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9DRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJiBYT1IyKHJlcyA+PiAzMCksIEZfT0YpOwotCX0gZWxzZSBpZiAocyAhPSAwKSB7Ci0JCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCi0JCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfQ0YpOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNITCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHNobF9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgOCkgewotCQljbnQgPSBzICUgODsKLQotCQkvKiBsYXN0IGJpdCBzaGlmdGVkIG91dCBnb2VzIGludG8gY2FycnkgZmxhZyAqLwotCQlpZiAoY250ID4gMCkgewotCQkJcmVzID0gZCA8PCBjbnQ7Ci0JCQljZiA9IGQgJiAoMSA8PCAoOCAtIGNudCkpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gKHU4KSBkOwotCQl9Ci0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQkvKiBOZWVkcyBzaW1wbGlmaWNhdGlvbi4gKi8KLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKAotCQkJCQkJCQkJKCgocmVzICYgMHg4MCkgPT0gMHg4MCkgXgotCQkJCQkJCQkJIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksCi0JCQkvKiB3YXMgKE0ueDg2LlJfRkxHJkZfQ0YpPT1GX0NGKSksICovCi0JCQkJCQkJCQlGX09GKTsKLQkJfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwLCBGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJU0VUX0ZMQUcoRl9QRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotICAgIH0KLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSEwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgc2hsX3dvcmQodTE2IGQsIHU4IHMpCi17Ci0gICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgMTYpIHsKLQkJY250ID0gcyAlIDE2OwotCQlpZiAoY250ID4gMCkgewotCQkJcmVzID0gZCA8PCBjbnQ7Ci0JCQljZiA9IGQgJiAoMSA8PCAoMTYgLSBjbnQpKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSAodTE2KSBkOwotCQl9Ci0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygKLQkJCQkJCQkJCSgoKHJlcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSBeCi0JCQkJCQkJCQkgKEFDQ0VTU19GTEFHKEZfQ0YpICE9IDApKSwKLQkJCQkJCQkJCUZfT0YpOwotCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0KLSAgICB9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAsIEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlTRVRfRkxBRyhGX1BGKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSEwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgc2hsX2xvbmcodTMyIGQsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgMzIpIHsKLQkJY250ID0gcyAlIDMyOwotCQlpZiAoY250ID4gMCkgewotCQkJcmVzID0gZCA8PCBjbnQ7Ci0JCQljZiA9IGQgJiAoMSA8PCAoMzIgLSBjbnQpKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IGQ7Ci0JCX0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygoKChyZXMgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKSBeCi0JCQkJCQkJCSAgKEFDQ0VTU19GTEFHKEZfQ0YpICE9IDApKSwgRl9PRik7Ci0JCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwMDAwMCwgRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCVNFVF9GTEFHKEZfUEYpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSFIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBzaHJfYnl0ZSh1OCBkLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDgpIHsKLQkJY250ID0gcyAlIDg7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOwotCQkJcmVzID0gZCA+PiBjbnQ7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSAodTgpIGQ7Ci0JCX0KLQotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDYpLCBGX09GKTsKLQkJfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA+PiAocy0xKSkgJiAweDEsIEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlTRVRfRkxBRyhGX1BGKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JfQotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNIUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBzaHJfd29yZCh1MTYgZCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCAxNikgewotCQljbnQgPSBzICUgMTY7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOwotCQkJcmVzID0gZCA+PiBjbnQ7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gZDsKLQkJfQotCi0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gMTQpLCBGX09GKTsKLQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCUNMRUFSX0ZMQUcoRl9QRik7Ci0gICAgfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSFIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgc2hyX2xvbmcodTMyIGQsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgMzIpIHsKLQkJY250ID0gcyAlIDMyOwotCQlpZiAoY250ID4gMCkgewotCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKLQkJCXJlcyA9IGQgPj4gY250OwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCX0gZWxzZSB7Ci0JICAgIHJlcyA9IGQ7Ci0JfQotCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gMzApLCBGX09GKTsKLQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9Ci0gICAgfSBlbHNlIHsKLQlyZXMgPSAwOwotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJQ0xFQVJfRkxBRyhGX1BGKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTQVIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBzYXJfYnl0ZSh1OCBkLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOwotCi0JcmVzID0gZDsKLQlzZiA9IGQgJiAweDgwOwotICAgIGNudCA9IHMgJSA4OwotCWlmIChjbnQgPiAwICYmIGNudCA8IDgpIHsKLQkJbWFzayA9ICgxIDw8ICg4IC0gY250KSkgLSAxOwotCQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOwotCQlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQlpZiAoc2YpIHsKLQkJCXJlcyB8PSB+bWFzazsKLQkJfQotCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotICAgIH0gZWxzZSBpZiAoY250ID49IDgpIHsKLQlpZiAoc2YpIHsKLQkgICAgcmVzID0gMHhmZjsKLQkJCVNFVF9GTEFHKEZfQ0YpOwotCQkJQ0xFQVJfRkxBRyhGX1pGKTsKLQkJCVNFVF9GTEFHKEZfU0YpOwotCQkJU0VUX0ZMQUcoRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSAwOwotCQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJCVNFVF9GTEFHKEZfWkYpOwotCQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJCUNMRUFSX0ZMQUcoRl9QRik7Ci0JCX0KLQl9Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHNhcl93b3JkKHUxNiBkLCB1OCBzKQotewotICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOwotCi0gICAgc2YgPSBkICYgMHg4MDAwOwotICAgIGNudCA9IHMgJSAxNjsKLQlyZXMgPSBkOwotCWlmIChjbnQgPiAwICYmIGNudCA8IDE2KSB7Ci0JbWFzayA9ICgxIDw8ICgxNiAtIGNudCkpIC0gMTsKLQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOwotCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JaWYgKHNmKSB7Ci0JICAgIHJlcyB8PSB+bWFzazsKLQl9Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotICAgIH0gZWxzZSBpZiAoY250ID49IDE2KSB7Ci0JaWYgKHNmKSB7Ci0JICAgIHJlcyA9IDB4ZmZmZjsKLQkJCVNFVF9GTEFHKEZfQ0YpOwotCQkJQ0xFQVJfRkxBRyhGX1pGKTsKLQkJCVNFVF9GTEFHKEZfU0YpOwotCQkJU0VUX0ZMQUcoRl9QRik7Ci0JfSBlbHNlIHsKLQkgICAgcmVzID0gMDsKLQkJCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCQlTRVRfRkxBRyhGX1pGKTsKLQkJCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCQlDTEVBUl9GTEFHKEZfUEYpOwotCX0KLSAgICB9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNBUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBzYXJfbG9uZyh1MzIgZCwgdTggcykKLXsKLSAgICB1MzIgY250LCByZXMsIGNmLCBtYXNrLCBzZjsKLQotICAgIHNmID0gZCAmIDB4ODAwMDAwMDA7Ci0gICAgY250ID0gcyAlIDMyOwotCXJlcyA9IGQ7Ci0JaWYgKGNudCA+IDAgJiYgY250IDwgMzIpIHsKLQltYXNrID0gKDEgPDwgKDMyIC0gY250KSkgLSAxOwotCQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOwotCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JaWYgKHNmKSB7Ci0JICAgIHJlcyB8PSB+bWFzazsKLQl9Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0gICAgfSBlbHNlIGlmIChjbnQgPj0gMzIpIHsKLQlpZiAoc2YpIHsKLQkgICAgcmVzID0gMHhmZmZmZmZmZjsKLQkJCVNFVF9GTEFHKEZfQ0YpOwotCQkJQ0xFQVJfRkxBRyhGX1pGKTsKLQkJCVNFVF9GTEFHKEZfU0YpOwotCQkJU0VUX0ZMQUcoRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSAwOwotCQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJCVNFVF9GTEFHKEZfWkYpOwotCQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJCUNMRUFSX0ZMQUcoRl9QRik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSExEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHNobGRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDE2KSB7Ci0JCWNudCA9IHMgJSAxNjsKLQkJaWYgKGNudCA+IDApIHsKLQkJCXJlcyA9IChkIDw8IGNudCkgfCAoZmlsbCA+PiAoMTYtY250KSk7Ci0JCQljZiA9IGQgJiAoMSA8PCAoMTYgLSBjbnQpKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBkOwotCQl9Ci0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKCgocmVzICYgMHg4MDAwKSA9PSAweDgwMDApIF4KLQkJCQkJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKLQkJfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAsIEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlTRVRfRkxBRyhGX1BGKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSExEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDMyKSB7Ci0JCWNudCA9IHMgJSAzMjsKLQkJaWYgKGNudCA+IDApIHsKLQkJCXJlcyA9IChkIDw8IGNudCkgfCAoZmlsbCA+PiAoMzItY250KSk7Ci0JCQljZiA9IGQgJiAoMSA8PCAoMzIgLSBjbnQpKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IGQ7Ci0JCX0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygoKChyZXMgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKSBeCi0JCQkJCQkJCSAgKEFDQ0VTU19GTEFHKEZfQ0YpICE9IDApKSwgRl9PRik7Ci0JCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwMDAwMCwgRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCVNFVF9GTEFHKEZfUEYpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSFJEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHNocmRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDE2KSB7Ci0JCWNudCA9IHMgJSAxNjsKLQkJaWYgKGNudCA+IDApIHsKLQkJCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7Ci0JCQlyZXMgPSAoZCA+PiBjbnQpIHwgKGZpbGwgPDwgKDE2IC0gY250KSk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gZDsKLQkJfQotCi0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gMTQpLCBGX09GKTsKLQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCUNMRUFSX0ZMQUcoRl9QRik7Ci0gICAgfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSFJEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHNocmRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDMyKSB7Ci0JCWNudCA9IHMgJSAzMjsKLQkJaWYgKGNudCA+IDApIHsKLQkJCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7Ci0JCQlyZXMgPSAoZCA+PiBjbnQpIHwgKGZpbGwgPDwgKDMyIC0gY250KSk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBkOwotCQl9Ci0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gMzApLCBGX09GKTsKLQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCUNMRUFSX0ZMQUcoRl9QRik7Ci0gICAgfQotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0JCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggc2JiX2J5dGUodTggZCwgdTggcykKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotICAgIHJlZ2lzdGVyIHUzMiBiYzsKLQotCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKLQkJcmVzID0gZCAtIHMgLSAxOwotCWVsc2UKLQkJcmVzID0gZCAtIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNCQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBzYmJfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLSAgICByZWdpc3RlciB1MzIgYmM7Ci0KLQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCi0JcmVzID0gZCAtIHMgLSAxOwotICAgIGVsc2UKLQlyZXMgPSBkIC0gczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgc2JiX2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGJjOwotCi0JaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQotCXJlcyA9IGQgLSBzIC0gMTsKLSAgICBlbHNlCi0JcmVzID0gZCAtIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwMDAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHN1Yl9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgYmM7Ci0KLQlyZXMgPSBkIC0gczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDYpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU1VCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHN1Yl93b3JkKHUxNiBkLCB1MTYgcykKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotICAgIHJlZ2lzdGVyIHUzMiBiYzsKLQotICAgIHJlcyA9IGQgLSBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMTQpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBzdWJfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgYmM7Ci0KLQlyZXMgPSBkIC0gczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAwMDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdGVzdF9ieXRlKHU4IGQsIHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotICAgIHJlcyA9IGQgJiBzOwotCi0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLSAgICAvKiBBRiA9PSBkb250IGNhcmUgKi8KLQlDTEVBUl9GTEFHKEZfQ0YpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFRFU1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHRlc3Rfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgJiBzOwotCi0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCS8qIEFGID09IGRvbnQgY2FyZSAqLwotCUNMRUFSX0ZMQUcoRl9DRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdGVzdF9sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCAmIHM7Ci0KLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCS8qIEFGID09IGRvbnQgY2FyZSAqLwotCUNMRUFSX0ZMQUcoRl9DRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgWE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggeG9yX2J5dGUodTggZCwgdTggcykKLXsKLQlyZWdpc3RlciB1OCByZXM7ICAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCBeIHM7Ci0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyksIEZfUEYpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiB4b3Jfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0JcmVnaXN0ZXIgdTE2IHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgXiBzOwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBYT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgeG9yX2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkIF4gczsKLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGltdWxfYnl0ZSh1OCBzKQotewotCXMxNiByZXMgPSAoczE2KSgoczgpTS54ODYuUl9BTCAqIChzOClzKTsKLQotCU0ueDg2LlJfQVggPSByZXM7Ci0JaWYgKCgoTS54ODYuUl9BTCAmIDB4ODApID09IDAgJiYgTS54ODYuUl9BSCA9PSAweDAwKSB8fAotCQkoKE0ueDg2LlJfQUwgJiAweDgwKSAhPSAwICYmIE0ueDg2LlJfQUggPT0gMHhGRikpIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9IGVsc2UgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGltdWxfd29yZCh1MTYgcykKLXsKLQlzMzIgcmVzID0gKHMxNilNLng4Ni5SX0FYICogKHMxNilzOwotCi0JTS54ODYuUl9BWCA9ICh1MTYpcmVzOwotCU0ueDg2LlJfRFggPSAodTE2KShyZXMgPj4gMTYpOwotCWlmICgoKE0ueDg2LlJfQVggJiAweDgwMDApID09IDAgJiYgTS54ODYuUl9EWCA9PSAweDAwKSB8fAotCQkoKE0ueDg2LlJfQVggJiAweDgwMDApICE9IDAgJiYgTS54ODYuUl9EWCA9PSAweEZGKSkgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0gZWxzZSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaW11bF9sb25nX2RpcmVjdCh1MzIgKnJlc19sbywgdTMyKiByZXNfaGksdTMyIGQsIHUzMiBzKQotewotI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCi0JczY0IHJlcyA9IChzMzIpZCAqIChzMzIpczsKLQotCSpyZXNfbG8gPSAodTMyKXJlczsKLQkqcmVzX2hpID0gKHUzMikocmVzID4+IDMyKTsKLSNlbHNlCi0JdTMyCWRfbG8sZF9oaSxkX3NpZ247Ci0JdTMyCXNfbG8sc19oaSxzX3NpZ247Ci0JdTMyCXJsb19sbyxybG9faGkscmhpX2xvOwotCi0JaWYgKChkX3NpZ24gPSBkICYgMHg4MDAwMDAwMCkgIT0gMCkKLQkJZCA9IC1kOwotCWRfbG8gPSBkICYgMHhGRkZGOwotCWRfaGkgPSBkID4+IDE2OwotCWlmICgoc19zaWduID0gcyAmIDB4ODAwMDAwMDApICE9IDApCi0JCXMgPSAtczsKLQlzX2xvID0gcyAmIDB4RkZGRjsKLQlzX2hpID0gcyA+PiAxNjsKLQlybG9fbG8gPSBkX2xvICogc19sbzsKLQlybG9faGkgPSAoZF9oaSAqIHNfbG8gKyBkX2xvICogc19oaSkgKyAocmxvX2xvID4+IDE2KTsKLQlyaGlfbG8gPSBkX2hpICogc19oaSArIChybG9faGkgPj4gMTYpOwotCSpyZXNfbG8gPSAocmxvX2hpIDw8IDE2KSB8IChybG9fbG8gJiAweEZGRkYpOwotCSpyZXNfaGkgPSByaGlfbG87Ci0JaWYgKGRfc2lnbiAhPSBzX3NpZ24pIHsKLQkJZCA9IH4qcmVzX2xvOwotCQlzID0gKCgoZCAmIDB4RkZGRikgKyAxKSA+PiAxNikgKyAoZCA+PiAxNik7Ci0JCSpyZXNfbG8gPSB+KnJlc19sbysxOwotCQkqcmVzX2hpID0gfipyZXNfaGkrKHMgPj4gMTYpOwotCQl9Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpbXVsX2xvbmcodTMyIHMpCi17Ci0JaW11bF9sb25nX2RpcmVjdCgmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLHMpOwotCWlmICgoKE0ueDg2LlJfRUFYICYgMHg4MDAwMDAwMCkgPT0gMCAmJiBNLng4Ni5SX0VEWCA9PSAweDAwKSB8fAotCQkoKE0ueDg2LlJfRUFYICYgMHg4MDAwMDAwMCkgIT0gMCAmJiBNLng4Ni5SX0VEWCA9PSAweEZGKSkgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0gZWxzZSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBtdWxfYnl0ZSh1OCBzKQotewotCXUxNiByZXMgPSAodTE2KShNLng4Ni5SX0FMICogcyk7Ci0KLQlNLng4Ni5SX0FYID0gcmVzOwotCWlmIChNLng4Ni5SX0FIID09IDApIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9IGVsc2UgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbXVsX3dvcmQodTE2IHMpCi17Ci0JdTMyIHJlcyA9IE0ueDg2LlJfQVggKiBzOwotCi0JTS54ODYuUl9BWCA9ICh1MTYpcmVzOwotCU0ueDg2LlJfRFggPSAodTE2KShyZXMgPj4gMTYpOwotCWlmIChNLng4Ni5SX0RYID09IDApIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLSAgICB9IGVsc2UgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbXVsX2xvbmcodTMyIHMpCi17Ci0jaWZkZWYJX19IQVNfTE9OR19MT05HX18KLQl1NjQgcmVzID0gKHUzMilNLng4Ni5SX0VBWCAqICh1MzIpczsKLQotCU0ueDg2LlJfRUFYID0gKHUzMilyZXM7Ci0JTS54ODYuUl9FRFggPSAodTMyKShyZXMgPj4gMzIpOwotI2Vsc2UKLQl1MzIJYSxhX2xvLGFfaGk7Ci0JdTMyCXNfbG8sc19oaTsKLQl1MzIJcmxvX2xvLHJsb19oaSxyaGlfbG87Ci0KLQlhID0gTS54ODYuUl9FQVg7Ci0JYV9sbyA9IGEgJiAweEZGRkY7Ci0JYV9oaSA9IGEgPj4gMTY7Ci0Jc19sbyA9IHMgJiAweEZGRkY7Ci0Jc19oaSA9IHMgPj4gMTY7Ci0JcmxvX2xvID0gYV9sbyAqIHNfbG87Ci0JcmxvX2hpID0gKGFfaGkgKiBzX2xvICsgYV9sbyAqIHNfaGkpICsgKHJsb19sbyA+PiAxNik7Ci0JcmhpX2xvID0gYV9oaSAqIHNfaGkgKyAocmxvX2hpID4+IDE2KTsKLQlNLng4Ni5SX0VBWCA9IChybG9faGkgPDwgMTYpIHwgKHJsb19sbyAmIDB4RkZGRik7Ci0JTS54ODYuUl9FRFggPSByaGlfbG87Ci0jZW5kaWYKLQotCWlmIChNLng4Ni5SX0VEWCA9PSAwKSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfSBlbHNlIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpZGl2X2J5dGUodTggcykKLXsKLSAgICBzMzIgZHZkLCBkaXYsIG1vZDsKLQotCWR2ZCA9IChzMTYpTS54ODYuUl9BWDsKLQlpZiAocyA9PSAwKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCXJldHVybjsKLQl9Ci0JZGl2ID0gZHZkIC8gKHM4KXM7Ci0JbW9kID0gZHZkICUgKHM4KXM7Ci0JaWYgKGFicyhkaXYpID4gMHg3ZikgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQlNLng4Ni5SX0FMID0gKHM4KSBkaXY7Ci0JTS54ODYuUl9BSCA9IChzOCkgbW9kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGlkaXZfd29yZCh1MTYgcykKLXsKLQlzMzIgZHZkLCBkaXYsIG1vZDsKLQotCWR2ZCA9ICgoKHMzMilNLng4Ni5SX0RYKSA8PCAxNikgfCBNLng4Ni5SX0FYOwotCWlmIChzID09IDApIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JZGl2ID0gZHZkIC8gKHMxNilzOwotCW1vZCA9IGR2ZCAlIChzMTYpczsKLQlpZiAoYWJzKGRpdikgPiAweDdmZmYpIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGRpdiA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkobW9kICYgMHhmZiksIEZfUEYpOwotCi0JTS54ODYuUl9BWCA9ICh1MTYpZGl2OwotCU0ueDg2LlJfRFggPSAodTE2KW1vZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpZGl2X2xvbmcodTMyIHMpCi17Ci0jaWZkZWYJX19IQVNfTE9OR19MT05HX18KLQlzNjQgZHZkLCBkaXYsIG1vZDsKLQotCWR2ZCA9ICgoKHM2NClNLng4Ni5SX0VEWCkgPDwgMzIpIHwgTS54ODYuUl9FQVg7Ci0JaWYgKHMgPT0gMCkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQlkaXYgPSBkdmQgLyAoczMyKXM7Ci0JbW9kID0gZHZkICUgKHMzMilzOwotCWlmIChhYnMoZGl2KSA+IDB4N2ZmZmZmZmYpIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0jZWxzZQotCXMzMiBkaXYgPSAwLCBtb2Q7Ci0JczMyIGhfZHZkID0gTS54ODYuUl9FRFg7Ci0JdTMyIGxfZHZkID0gTS54ODYuUl9FQVg7Ci0JdTMyIGFic19zID0gcyAmIDB4N0ZGRkZGRkY7Ci0JdTMyIGFic19oX2R2ZCA9IGhfZHZkICYgMHg3RkZGRkZGRjsKLQl1MzIgaF9zID0gYWJzX3MgPj4gMTsKLQl1MzIgbF9zID0gYWJzX3MgPDwgMzE7Ci0JaW50IGNvdW50ZXIgPSAzMTsKLQlpbnQgY2Fycnk7Ci0KLQlpZiAocyA9PSAwKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCWRvIHsKLQkJZGl2IDw8PSAxOwotCQljYXJyeSA9IChsX2R2ZCA+PSBsX3MpID8gMCA6IDE7Ci0KLQkJaWYgKGFic19oX2R2ZCA8IChoX3MgKyBjYXJyeSkpIHsKLQkJCWhfcyA+Pj0gMTsKLQkJCWxfcyA9IGFic19zIDw8ICgtLWNvdW50ZXIpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlhYnNfaF9kdmQgLT0gKGhfcyArIGNhcnJ5KTsKLQkJCWxfZHZkID0gY2FycnkgPyAoKDB4RkZGRkZGRkYgLSBsX3MpICsgbF9kdmQgKyAxKQotCQkJCTogKGxfZHZkIC0gbF9zKTsKLQkJCWhfcyA+Pj0gMTsKLQkJCWxfcyA9IGFic19zIDw8ICgtLWNvdW50ZXIpOwotCQkJZGl2IHw9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JfSB3aGlsZSAoY291bnRlciA+IC0xKTsKLQkvKiBvdmVyZmxvdyAqLwotCWlmIChhYnNfaF9kdmQgfHwgKGxfZHZkID4gYWJzX3MpKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCS8qIHNpZ24gKi8KLQlkaXYgfD0gKChoX2R2ZCAmIDB4MTAwMDAwMDApIF4gKHMgJiAweDEwMDAwMDAwKSk7Ci0JbW9kID0gbF9kdmQ7Ci0KLSNlbmRpZgotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDTEVBUl9GTEFHKEZfU0YpOwotCVNFVF9GTEFHKEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShtb2QgJiAweGZmKSwgRl9QRik7Ci0KLQlNLng4Ni5SX0VBWCA9ICh1MzIpZGl2OwotCU0ueDg2LlJfRURYID0gKHUzMiltb2Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBkaXZfYnl0ZSh1OCBzKQotewotCXUzMiBkdmQsIGRpdiwgbW9kOwotCi0JZHZkID0gTS54ODYuUl9BWDsKLSAgICBpZiAocyA9PSAwKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCXJldHVybjsKLSAgICB9Ci0JZGl2ID0gZHZkIC8gKHU4KXM7Ci0JbW9kID0gZHZkICUgKHU4KXM7Ci0JaWYgKGFicyhkaXYpID4gMHhmZikgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQlyZXR1cm47Ci0JfQotCU0ueDg2LlJfQUwgPSAodTgpZGl2OwotCU0ueDg2LlJfQUggPSAodTgpbW9kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIERJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZGl2X3dvcmQodTE2IHMpCi17Ci0JdTMyIGR2ZCwgZGl2LCBtb2Q7Ci0KLQlkdmQgPSAoKCh1MzIpTS54ODYuUl9EWCkgPDwgMTYpIHwgTS54ODYuUl9BWDsKLQlpZiAocyA9PSAwKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCXJldHVybjsKLSAgICB9Ci0JZGl2ID0gZHZkIC8gKHUxNilzOwotCW1vZCA9IGR2ZCAlICh1MTYpczsKLQlpZiAoYWJzKGRpdikgPiAweGZmZmYpIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGRpdiA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkobW9kICYgMHhmZiksIEZfUEYpOwotCi0JTS54ODYuUl9BWCA9ICh1MTYpZGl2OwotCU0ueDg2LlJfRFggPSAodTE2KW1vZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGRpdl9sb25nKHUzMiBzKQotewotI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCi0JdTY0IGR2ZCwgZGl2LCBtb2Q7Ci0KLQlkdmQgPSAoKCh1NjQpTS54ODYuUl9FRFgpIDw8IDMyKSB8IE0ueDg2LlJfRUFYOwotCWlmIChzID09IDApIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JZGl2ID0gZHZkIC8gKHUzMilzOwotCW1vZCA9IGR2ZCAlICh1MzIpczsKLQlpZiAoYWJzKGRpdikgPiAweGZmZmZmZmZmKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotI2Vsc2UKLQlzMzIgZGl2ID0gMCwgbW9kOwotCXMzMiBoX2R2ZCA9IE0ueDg2LlJfRURYOwotCXUzMiBsX2R2ZCA9IE0ueDg2LlJfRUFYOwotCi0JdTMyIGhfcyA9IHM7Ci0JdTMyIGxfcyA9IDA7Ci0JaW50IGNvdW50ZXIgPSAzMjsKLQlpbnQgY2Fycnk7Ci0KLQlpZiAocyA9PSAwKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCWRvIHsKLQkJZGl2IDw8PSAxOwotCQljYXJyeSA9IChsX2R2ZCA+PSBsX3MpID8gMCA6IDE7Ci0KLQkJaWYgKGhfZHZkIDwgKGhfcyArIGNhcnJ5KSkgewotCQkJaF9zID4+PSAxOwotCQkJbF9zID0gcyA8PCAoLS1jb3VudGVyKTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJaF9kdmQgLT0gKGhfcyArIGNhcnJ5KTsKLQkJCWxfZHZkID0gY2FycnkgPyAoKDB4RkZGRkZGRkYgLSBsX3MpICsgbF9kdmQgKyAxKQotCQkJCTogKGxfZHZkIC0gbF9zKTsKLQkJCWhfcyA+Pj0gMTsKLQkJCWxfcyA9IHMgPDwgKC0tY291bnRlcik7Ci0JCQlkaXYgfD0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQl9IHdoaWxlIChjb3VudGVyID4gLTEpOwotCS8qIG92ZXJmbG93ICovCi0JaWYgKGhfZHZkIHx8IChsX2R2ZCA+IHMpKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCW1vZCA9IGxfZHZkOwotI2VuZGlmCi0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNMRUFSX0ZMQUcoRl9TRik7Ci0JU0VUX0ZMQUcoRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKG1vZCAmIDB4ZmYpLCBGX1BGKTsKLQotCU0ueDg2LlJfRUFYID0gKHUzMilkaXY7Ci0JTS54ODYuUl9FRFggPSAodTMyKW1vZDsKLX0KLQotI2VuZGlmCS8qIF9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJTiBzdHJpbmcgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGlucyhpbnQgc2l6ZSkKLXsKLQlpbnQgaW5jID0gc2l6ZTsKLQotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgewotCQlpbmMgPSAtc2l6ZTsKLQl9Ci0JaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgewotCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KLQkvKiBpbiB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCQl1MzIgY291bnQgPSAoKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSA/Ci0JCQkJCSBNLng4Ni5SX0VDWCA6IE0ueDg2LlJfQ1gpOwotCXN3aXRjaCAoc2l6ZSkgewotCSAgY2FzZSAxOgotCSAgICB3aGlsZSAoY291bnQtLSkgewotCQkJCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKLQkJCQkJCQkJCSgqc3lzX2luYikoTS54ODYuUl9EWCkpOwotCQkJCU0ueDg2LlJfREkgKz0gaW5jOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JCQkJc3RvcmVfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLAotCQkJCQkJCQkJKCpzeXNfaW53KShNLng4Ni5SX0RYKSk7Ci0JCQkJTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JCQkJc3RvcmVfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLAotCQkJCQkJCQkJKCpzeXNfaW5sKShNLng4Ni5SX0RYKSk7Ci0JCQkJTS54ODYuUl9ESSArPSBpbmM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCQlNLng4Ni5SX0NYID0gMDsKLQkJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQlNLng4Ni5SX0VDWCA9IDA7Ci0JfQotCQlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKLSAgICB9IGVsc2UgewotCXN3aXRjaCAoc2l6ZSkgewotCSAgY2FzZSAxOgotCQkJc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLAotCQkJCQkJCQkoKnN5c19pbmIpKE0ueDg2LlJfRFgpKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JCQlzdG9yZV9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksCi0JCQkJCQkJCSgqc3lzX2ludykoTS54ODYuUl9EWCkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkJCXN0b3JlX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKLQkJCQkJCQkJKCpzeXNfaW5sKShNLng4Ni5SX0RYKSk7Ci0JICAgIGJyZWFrOwotCX0KLQkJTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE9VVCBzdHJpbmcgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG91dHMoaW50IHNpemUpCi17Ci0gICAgaW50IGluYyA9IHNpemU7Ci0KLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpIHsKLQlpbmMgPSAtc2l6ZTsKLSAgICB9Ci0JaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgewotCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KLQkvKiBvdXQgdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQkJdTMyIGNvdW50ID0gKChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgPwotCQkJCQkgTS54ODYuUl9FQ1ggOiBNLng4Ni5SX0NYKTsKLQlzd2l0Y2ggKHNpemUpIHsKLQkgIGNhc2UgMToKLQkgICAgd2hpbGUgKGNvdW50LS0pIHsKLQkJCQkoKnN5c19vdXRiKShNLng4Ni5SX0RYLAotCQkJCQkJIGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOwotCQkJCU0ueDg2LlJfU0kgKz0gaW5jOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JCQkJKCpzeXNfb3V0dykoTS54ODYuUl9EWCwKLQkJCQkJCSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKLQkJCQlNLng4Ni5SX1NJICs9IGluYzsKLQkgICAgfQotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgd2hpbGUgKGNvdW50LS0pIHsKLQkJCQkoKnN5c19vdXRsKShNLng4Ni5SX0RYLAotCQkJCQkJIGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOwotCQkJCU0ueDg2LlJfU0kgKz0gaW5jOwotCQlicmVhazsKLQkgICAgfQotCX0KLQkJTS54ODYuUl9DWCA9IDA7Ci0JCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJTS54ODYuUl9FQ1ggPSAwOwotCX0KLQkJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7Ci0gICAgfSBlbHNlIHsKLQlzd2l0Y2ggKHNpemUpIHsKLQkgIGNhc2UgMToKLQkJCSgqc3lzX291dGIpKE0ueDg2LlJfRFgsCi0JCQkJCSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JCQkoKnN5c19vdXR3KShNLng4Ni5SX0RYLAotCQkJCQkgZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCQkJKCpzeXNfb3V0bCkoTS54ODYuUl9EWCwKLQkJCQkJIGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOwotCSAgICBicmVhazsKLQl9Ci0JCU0ueDg2LlJfU0kgKz0gaW5jOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gQWRkcmVzcyB0byBmZXRjaCB3b3JkIGZyb20KLQotUkVNQVJLUzoKLUZldGNoZXMgYSB3b3JkIGZyb20gZW11bGF0b3IgbWVtb3J5IHVzaW5nIGFuIGFic29sdXRlIGFkZHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IG1lbV9hY2Nlc3Nfd29yZChpbnQgYWRkcikKLXsKLURCKAlpZiAoQ0hFQ0tfTUVNX0FDQ0VTUygpKQotCSAgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3MoYWRkcik7KQotCXJldHVybiAoKnN5c19yZHcpKGFkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1c2hlcyBhIHdvcmQgb250byB0aGUgc3RhY2suCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcywgYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHB1c2hfd29yZCh1MTYgdykKLXsKLURCKAlpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCi0JICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQotCU0ueDg2LlJfU1AgLT0gMjsKLQkoKnN5c193cncpKCgodTMyKU0ueDg2LlJfU1MgPDwgNCkgICsgTS54ODYuUl9TUCwgdyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVzaGVzIGEgbG9uZyBvbnRvIHRoZSBzdGFjay4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcHVzaF9sb25nKHUzMiB3KQotewotREIoCWlmIChDSEVDS19TUF9BQ0NFU1MoKSkKLQkgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCi0JTS54ODYuUl9TUCAtPSA0OwotCSgqc3lzX3dybCkoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQLCB3KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Qb3BzIGEgd29yZCBmcm9tIHRoZSBzdGFjay4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBwb3Bfd29yZCh2b2lkKQotewotCXJlZ2lzdGVyIHUxNiByZXM7Ci0KLURCKAlpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCi0JICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQotCXJlcyA9ICgqc3lzX3JkdykoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQKTsKLQlNLng4Ni5SX1NQICs9IDI7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Qb3BzIGEgbG9uZyBmcm9tIHRoZSBzdGFjay4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBwb3BfbG9uZyh2b2lkKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXM7Ci0KLURCKAlpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCi0JICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQotCXJlcyA9ICgqc3lzX3JkbCkoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQKTsKLQlNLng4Ni5SX1NQICs9IDQ7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotI2lmZGVmCV9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18KLQotdTE2IGFhYV93b3JkICh1MTYgZCkKLXsgcmV0dXJuIGFhYV93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXUxNiBhYXNfd29yZCAodTE2IGQpCi17IHJldHVybiBhYXNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11MTYgYWFkX3dvcmQgKHUxNiBkKQoteyByZXR1cm4gYWFkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTE2IGFhbV93b3JkICh1OCBkKQoteyByZXR1cm4gYWFtX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTggYWRjX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBhZGNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBhZGNfd29yZCAodTE2IGQsIHUxNiBzKQoteyByZXR1cm4gYWRjX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgYWRjX2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgcmV0dXJuIGFkY19sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggYWRkX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBhZGRfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBhZGRfd29yZCAodTE2IGQsIHUxNiBzKQoteyByZXR1cm4gYWRkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgYWRkX2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgcmV0dXJuIGFkZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggYW5kX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBhbmRfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBhbmRfd29yZCAodTE2IGQsIHUxNiBzKQoteyByZXR1cm4gYW5kX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgYW5kX2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgcmV0dXJuIGFuZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggY21wX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBjbXBfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBjbXBfd29yZCAodTE2IGQsIHUxNiBzKQoteyByZXR1cm4gY21wX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgY21wX2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgcmV0dXJuIGNtcF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggZGFhX2J5dGUgKHU4IGQpCi17IHJldHVybiBkYWFfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11OCBkYXNfYnl0ZSAodTggZCkKLXsgcmV0dXJuIGRhc19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXU4IGRlY19ieXRlICh1OCBkKQoteyByZXR1cm4gZGVjX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTE2IGRlY193b3JkICh1MTYgZCkKLXsgcmV0dXJuIGRlY193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXUzMiBkZWNfbG9uZyAodTMyIGQpCi17IHJldHVybiBkZWNfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11OCBpbmNfYnl0ZSAodTggZCkKLXsgcmV0dXJuIGluY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXUxNiBpbmNfd29yZCAodTE2IGQpCi17IHJldHVybiBpbmNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11MzIgaW5jX2xvbmcgKHUzMiBkKQoteyByZXR1cm4gaW5jX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTggb3JfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIG9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgb3Jfd29yZCAodTE2IGQsIHUxNiBzKQoteyByZXR1cm4gb3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBvcl9sb25nICh1MzIgZCwgdTMyIHMpCi17IHJldHVybiBvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggbmVnX2J5dGUgKHU4IHMpCi17IHJldHVybiBuZWdfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxzKTsgfQotCi11MTYgbmVnX3dvcmQgKHUxNiBzKQoteyByZXR1cm4gbmVnX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcscyk7IH0KLQotdTMyIG5lZ19sb25nICh1MzIgcykKLXsgcmV0dXJuIG5lZ19sb25nX2FzbSgmTS54ODYuUl9FRkxHLHMpOyB9Ci0KLXU4IG5vdF9ieXRlICh1OCBzKQoteyByZXR1cm4gbm90X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcscyk7IH0KLQotdTE2IG5vdF93b3JkICh1MTYgcykKLXsgcmV0dXJuIG5vdF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLHMpOyB9Ci0KLXUzMiBub3RfbG9uZyAodTMyIHMpCi17IHJldHVybiBub3RfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxzKTsgfQotCi11OCByY2xfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHJjbF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHJjbF93b3JkICh1MTYgZCwgdTggcykKLXsgcmV0dXJuIHJjbF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHJjbF9sb25nICh1MzIgZCwgdTggcykKLXsgcmV0dXJuIHJjbF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggcmNyX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiByY3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiByY3Jfd29yZCAodTE2IGQsIHU4IHMpCi17IHJldHVybiByY3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiByY3JfbG9uZyAodTMyIGQsIHU4IHMpCi17IHJldHVybiByY3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IHJvbF9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gcm9sX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgcm9sX3dvcmQgKHUxNiBkLCB1OCBzKQoteyByZXR1cm4gcm9sX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgcm9sX2xvbmcgKHUzMiBkLCB1OCBzKQoteyByZXR1cm4gcm9sX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCByb3JfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHJvcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHJvcl93b3JkICh1MTYgZCwgdTggcykKLXsgcmV0dXJuIHJvcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHJvcl9sb25nICh1MzIgZCwgdTggcykKLXsgcmV0dXJuIHJvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggc2hsX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBzaGxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBzaGxfd29yZCAodTE2IGQsIHU4IHMpCi17IHJldHVybiBzaGxfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBzaGxfbG9uZyAodTMyIGQsIHU4IHMpCi17IHJldHVybiBzaGxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IHNocl9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gc2hyX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgc2hyX3dvcmQgKHUxNiBkLCB1OCBzKQoteyByZXR1cm4gc2hyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgc2hyX2xvbmcgKHUzMiBkLCB1OCBzKQoteyByZXR1cm4gc2hyX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBzYXJfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHNhcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHNhcl93b3JkICh1MTYgZCwgdTggcykKLXsgcmV0dXJuIHNhcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHNhcl9sb25nICh1MzIgZCwgdTggcykKLXsgcmV0dXJuIHNhcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHNobGRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKQoteyByZXR1cm4gc2hsZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKTsgfQotCi11MzIgc2hsZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpCi17IHJldHVybiBzaGxkX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpOyB9Ci0KLXUxNiBzaHJkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcykKLXsgcmV0dXJuIHNocmRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscyk7IH0KLQotdTMyIHNocmRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQoteyByZXR1cm4gc2hyZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKTsgfQotCi11OCBzYmJfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHNiYl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHNiYl93b3JkICh1MTYgZCwgdTE2IHMpCi17IHJldHVybiBzYmJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBzYmJfbG9uZyAodTMyIGQsIHUzMiBzKQoteyByZXR1cm4gc2JiX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBzdWJfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHN1Yl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHN1Yl93b3JkICh1MTYgZCwgdTE2IHMpCi17IHJldHVybiBzdWJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBzdWJfbG9uZyAodTMyIGQsIHUzMiBzKQoteyByZXR1cm4gc3ViX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi12b2lkIHRlc3RfYnl0ZSAodTggZCwgdTggcykKLXsgdGVzdF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdm9pZCB0ZXN0X3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgdGVzdF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdm9pZCB0ZXN0X2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgdGVzdF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggeG9yX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiB4b3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiB4b3Jfd29yZCAodTE2IGQsIHUxNiBzKQoteyByZXR1cm4geG9yX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgeG9yX2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgcmV0dXJuIHhvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdm9pZCBpbXVsX2J5dGUgKHU4IHMpCi17IGltdWxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCxNLng4Ni5SX0FMLHMpOyB9Ci0KLXZvaWQgaW11bF93b3JkICh1MTYgcykKLXsgaW11bF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgscyk7IH0KLQotdm9pZCBpbXVsX2xvbmcgKHUzMiBzKQoteyBpbXVsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxzKTsgfQotCi12b2lkIGltdWxfbG9uZ19kaXJlY3QodTMyICpyZXNfbG8sIHUzMiogcmVzX2hpLHUzMiBkLCB1MzIgcykKLXsgaW11bF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLHJlc19sbyxyZXNfaGksZCxzKTsgfQotCi12b2lkIG11bF9ieXRlICh1OCBzKQoteyBtdWxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCxNLng4Ni5SX0FMLHMpOyB9Ci0KLXZvaWQgbXVsX3dvcmQgKHUxNiBzKQoteyBtdWxfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLHMpOyB9Ci0KLXZvaWQgbXVsX2xvbmcgKHUzMiBzKQoteyBtdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLHMpOyB9Ci0KLXZvaWQgaWRpdl9ieXRlICh1OCBzKQoteyBpZGl2X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQUwsJk0ueDg2LlJfQUgsTS54ODYuUl9BWCxzKTsgfQotCi12b2lkIGlkaXZfd29yZCAodTE2IHMpCi17IGlkaXZfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLE0ueDg2LlJfRFgscyk7IH0KLQotdm9pZCBpZGl2X2xvbmcgKHUzMiBzKQoteyBpZGl2X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxNLng4Ni5SX0VEWCxzKTsgfQotCi12b2lkIGRpdl9ieXRlICh1OCBzKQoteyBkaXZfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BTCwmTS54ODYuUl9BSCxNLng4Ni5SX0FYLHMpOyB9Ci0KLXZvaWQgZGl2X3dvcmQgKHUxNiBzKQoteyBkaXZfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLE0ueDg2LlJfRFgscyk7IH0KLQotdm9pZCBkaXZfbG9uZyAodTMyIHMpCi17IGRpdl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgsTS54ODYuUl9FRFgscyk7IH0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvc3lzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvc3lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTU4ZjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3N5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHdoaWNoIGFyZSByZWxhdGVkIHRvCi0qCQkJCXByb2dyYW1tZWQgSS9PIGFuZCBtZW1vcnkgYWNjZXNzLiBJbmNsdWRlZCBpbiB0aGlzIG1vZHVsZQotKgkJCQlhcmUgZGVmYXVsdCBmdW5jdGlvbnMgd2l0aCBsaW1pdGVkIHVzZWZ1bG5lc3MuIEZvciByZWFsCi0qCQkJCXVzZXMgdGhlc2UgZnVuY3Rpb25zIHdpbGwgbW9zdCBsaWtlbHkgYmUgb3ZlcnJpZGVuIGJ5IHRoZQotKgkJCQl1c2VyIGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAieDg2ZW11LmgiCi0jaW5jbHVkZSAieDg2ZW11L3JlZ3MuaCIKLSNpbmNsdWRlICJ4ODZlbXUvZGVidWcuaCIKLSNpbmNsdWRlICJ4ODZlbXUvcHJpbV9vcHMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotWDg2RU1VX3N5c0VudgkJX1g4NkVNVV9lbnY7CQkvKiBHbG9iYWwgZW11bGF0b3IgbWFjaGluZSBzdGF0ZSAqLwotWDg2RU1VX2ludHJGdW5jcwlfWDg2RU1VX2ludHJUYWJbMjU2XTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBfX2FscGhhX18KLS8qIHRvIGNvcGUgd2l0aCBicm9rZW4gZWdjcy0xLjEuMiA6LSgoKCggKi8KLQotLyoKLSAqIGlubGluZSBmdW5jdGlvbnMgdG8gZG8gdW5hbGlnbmVkIGFjY2Vzc2VzCi0gKiBmcm9tIGxpbnV4L2luY2x1ZGUvYXNtLWFscGhhL3VuYWxpZ25lZC5oCi0gKi8KLQotLyoKLSAqIEVHQ1MgMS4xIGtub3dzIGFib3V0IGFyYml0cmFyeSB1bmFsaWduZWQgbG9hZHMuICBEZWZpbmUgc29tZQotICogcGFja2VkIHN0cnVjdHVyZXMgdG8gdGFsayBhYm91dCBzdWNoIHRoaW5ncyB3aXRoLgotICovCi0KLSNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKLXN0cnVjdCBfX3VuYV91NjQgeyB1bnNpZ25lZCBsb25nICB4IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyB9Owotc3RydWN0IF9fdW5hX3UzMiB7IHVuc2lnbmVkIGludCAgIHggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IH07Ci1zdHJ1Y3QgX191bmFfdTE2IHsgdW5zaWduZWQgc2hvcnQgeCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgfTsKLSNlbmRpZgotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxkcV91KHVuc2lnbmVkIGxvbmcgKiByMTEpCi17Ci0jaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCi0JY29uc3Qgc3RydWN0IF9fdW5hX3U2NCAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91NjQgKikgcjExOwotCXJldHVybiBwdHItPng7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgcjEscjI7Ci0JX19hc21fXygibGRxX3UgJTAsJTNcblx0IgotCQkibGRxX3UgJTEsJTRcblx0IgotCQkiZXh0cWwgJTAsJTIsJTBcblx0IgotCQkiZXh0cWggJTEsJTIsJTEiCi0JCToiPSZyIiAocjEpLCAiPSZyIiAocjIpCi0JCToiciIgKHIxMSksCi0JCSAibSIgKCpyMTEpLAotCQkgIm0iICgqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikoNysoY2hhciAqKSByMTEpKSk7Ci0JcmV0dXJuIHIxIHwgcjI7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsZGxfdSh1bnNpZ25lZCBpbnQgKiByMTEpCi17Ci0jaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCi0JY29uc3Qgc3RydWN0IF9fdW5hX3UzMiAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91MzIgKikgcjExOwotCXJldHVybiBwdHItPng7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgcjEscjI7Ci0JX19hc21fXygibGRxX3UgJTAsJTNcblx0IgotCQkibGRxX3UgJTEsJTRcblx0IgotCQkiZXh0bGwgJTAsJTIsJTBcblx0IgotCQkiZXh0bGggJTEsJTIsJTEiCi0JCToiPSZyIiAocjEpLCAiPSZyIiAocjIpCi0JCToiciIgKHIxMSksCi0JCSAibSIgKCpyMTEpLAotCQkgIm0iICgqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikoMysoY2hhciAqKSByMTEpKSk7Ci0JcmV0dXJuIHIxIHwgcjI7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsZHdfdSh1bnNpZ25lZCBzaG9ydCAqIHIxMSkKLXsKLSNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKLQljb25zdCBzdHJ1Y3QgX191bmFfdTE2ICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3UxNiAqKSByMTE7Ci0JcmV0dXJuIHB0ci0+eDsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyByMSxyMjsKLQlfX2FzbV9fKCJsZHFfdSAlMCwlM1xuXHQiCi0JCSJsZHFfdSAlMSwlNFxuXHQiCi0JCSJleHR3bCAlMCwlMiwlMFxuXHQiCi0JCSJleHR3aCAlMSwlMiwlMSIKLQkJOiI9JnIiIChyMSksICI9JnIiIChyMikKLQkJOiJyIiAocjExKSwKLQkJICJtIiAoKnIxMSksCi0JCSAibSIgKCooY29uc3QgdW5zaWduZWQgbG9uZyAqKSgxKyhjaGFyICopIHIxMSkpKTsKLQlyZXR1cm4gcjEgfCByMjsKLSNlbmRpZgotfQotCi0vKgotICogRWxlbWVudGFsIHVuYWxpZ25lZCBzdG9yZXMKLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0cV91KHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgKiByMTEpCi17Ci0jaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCi0Jc3RydWN0IF9fdW5hX3U2NCAqcHRyID0gKHN0cnVjdCBfX3VuYV91NjQgKikgcjExOwotCXB0ci0+eCA9IHI1OwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIHIxLHIyLHIzLHI0OwotCi0JX19hc21fXygibGRxX3UgJTMsJTFcblx0IgotCQkibGRxX3UgJTIsJTBcblx0IgotCQkiaW5zcWggJTYsJTcsJTVcblx0IgotCQkiaW5zcWwgJTYsJTcsJTRcblx0IgotCQkibXNrcWggJTMsJTcsJTNcblx0IgotCQkibXNrcWwgJTIsJTcsJTJcblx0IgotCQkiYmlzICUzLCU1LCUzXG5cdCIKLQkJImJpcyAlMiwlNCwlMlxuXHQiCi0JCSJzdHFfdSAlMywlMVxuXHQiCi0JCSJzdHFfdSAlMiwlMCIKLQkJOiI9bSIgKCpyMTEpLAotCQkgIj1tIiAoKih1bnNpZ25lZCBsb25nICopKDcrKGNoYXIgKikgcjExKSksCi0JCSAiPSZyIiAocjEpLCAiPSZyIiAocjIpLCAiPSZyIiAocjMpLCAiPSZyIiAocjQpCi0JCToiciIgKHI1KSwgInIiIChyMTEpKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0bF91KHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGludCAqIHIxMSkKLXsKLSNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKLQlzdHJ1Y3QgX191bmFfdTMyICpwdHIgPSAoc3RydWN0IF9fdW5hX3UzMiAqKSByMTE7Ci0JcHRyLT54ID0gcjU7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgcjEscjIscjMscjQ7Ci0KLQlfX2FzbV9fKCJsZHFfdSAlMywlMVxuXHQiCi0JCSJsZHFfdSAlMiwlMFxuXHQiCi0JCSJpbnNsaCAlNiwlNywlNVxuXHQiCi0JCSJpbnNsbCAlNiwlNywlNFxuXHQiCi0JCSJtc2tsaCAlMywlNywlM1xuXHQiCi0JCSJtc2tsbCAlMiwlNywlMlxuXHQiCi0JCSJiaXMgJTMsJTUsJTNcblx0IgotCQkiYmlzICUyLCU0LCUyXG5cdCIKLQkJInN0cV91ICUzLCUxXG5cdCIKLQkJInN0cV91ICUyLCUwIgotCQk6Ij1tIiAoKnIxMSksCi0JCSAiPW0iICgqKHVuc2lnbmVkIGxvbmcgKikoMysoY2hhciAqKSByMTEpKSwKLQkJICI9JnIiIChyMSksICI9JnIiIChyMiksICI9JnIiIChyMyksICI9JnIiIChyNCkKLQkJOiJyIiAocjUpLCAiciIgKHIxMSkpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3R3X3UodW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgc2hvcnQgKiByMTEpCi17Ci0jaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCi0Jc3RydWN0IF9fdW5hX3UxNiAqcHRyID0gKHN0cnVjdCBfX3VuYV91MTYgKikgcjExOwotCXB0ci0+eCA9IHI1OwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIHIxLHIyLHIzLHI0OwotCi0JX19hc21fXygibGRxX3UgJTMsJTFcblx0IgotCQkibGRxX3UgJTIsJTBcblx0IgotCQkiaW5zd2ggJTYsJTcsJTVcblx0IgotCQkiaW5zd2wgJTYsJTcsJTRcblx0IgotCQkibXNrd2ggJTMsJTcsJTNcblx0IgotCQkibXNrd2wgJTIsJTcsJTJcblx0IgotCQkiYmlzICUzLCU1LCUzXG5cdCIKLQkJImJpcyAlMiwlNCwlMlxuXHQiCi0JCSJzdHFfdSAlMywlMVxuXHQiCi0JCSJzdHFfdSAlMiwlMCIKLQkJOiI9bSIgKCpyMTEpLAotCQkgIj1tIiAoKih1bnNpZ25lZCBsb25nICopKDErKGNoYXIgKikgcjExKSksCi0JCSAiPSZyIiAocjEpLCAiPSZyIiAocjIpLCAiPSZyIiAocjMpLCAiPSZyIiAocjQpCi0JCToiciIgKHI1KSwgInIiIChyMTEpKTsKLSNlbmRpZgotfQotCi0jZWxpZiBkZWZpbmVkIChfX2lhNjRfXykKLS8qCi0gKiBFR0NTIDEuMSBrbm93cyBhYm91dCBhcmJpdHJhcnkgdW5hbGlnbmVkIGxvYWRzLiAgRGVmaW5lIHNvbWUKLSAqIHBhY2tlZCBzdHJ1Y3R1cmVzIHRvIHRhbGsgYWJvdXQgc3VjaCB0aGluZ3Mgd2l0aC4KLSAqLwotc3RydWN0IF9fdW5hX3U2NCB7IHVuc2lnbmVkIGxvbmcgIHggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IH07Ci1zdHJ1Y3QgX191bmFfdTMyIHsgdW5zaWduZWQgaW50ICAgeCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgfTsKLXN0cnVjdCBfX3VuYV91MTYgeyB1bnNpZ25lZCBzaG9ydCB4IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyB9OwotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCi1fX3VsZHEgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKiByMTEpCi17Ci0JY29uc3Qgc3RydWN0IF9fdW5hX3U2NCAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91NjQgKikgcjExOwotCXJldHVybiBwdHItPng7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKLXVsZGwgKGNvbnN0IHVuc2lnbmVkIGludCAqIHIxMSkKLXsKLQljb25zdCBzdHJ1Y3QgX191bmFfdTMyICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3UzMiAqKSByMTE7Ci0JcmV0dXJuIHB0ci0+eDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwotdWxkdyAoY29uc3QgdW5zaWduZWQgc2hvcnQgKiByMTEpCi17Ci0JY29uc3Qgc3RydWN0IF9fdW5hX3UxNiAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91MTYgKikgcjExOwotCXJldHVybiBwdHItPng7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLXVzdHEgKHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgKiByMTEpCi17Ci0Jc3RydWN0IF9fdW5hX3U2NCAqcHRyID0gKHN0cnVjdCBfX3VuYV91NjQgKikgcjExOwotCXB0ci0+eCA9IHI1OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi11c3RsICh1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBpbnQgKiByMTEpCi17Ci0Jc3RydWN0IF9fdW5hX3UzMiAqcHRyID0gKHN0cnVjdCBfX3VuYV91MzIgKikgcjExOwotCXB0ci0+eCA9IHI1OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi11c3R3ICh1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBzaG9ydCAqIHIxMSkKLXsKLQlzdHJ1Y3QgX191bmFfdTE2ICpwdHIgPSAoc3RydWN0IF9fdW5hX3UxNiAqKSByMTE7Ci0JcHRyLT54ID0gcjU7Ci19Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi0KLVJFVFVSTlM6Ci1CeXRlIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1SZWFkcyBhIGJ5dGUgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IFg4NkFQSSByZGIoCi0gICAgdTMyIGFkZHIpCi17Ci0JdTggdmFsOwotCi0JaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMSkgewotCQlEQihwcmludGsoIm1lbV9yZWFkOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQotCQlIQUxUX1NZUygpOwotCQl9Ci0JdmFsID0gKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKTsKLURCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCi0JCXByaW50aygiJSMwOHggMSAtPiAlI3hcbiIsIGFkZHIsIHZhbCk7KQotCXJldHVybiB2YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLQotUkVUVVJOUzoKLVdvcmQgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KLQotUkVNQVJLUzoKLVJlYWRzIGEgd29yZCB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IFg4NkFQSSByZHcoCi0JdTMyIGFkZHIpCi17Ci0JdTE2IHZhbCA9IDA7Ci0KLQlpZiAoYWRkciA+IE0ubWVtX3NpemUgLSAyKSB7Ci0JCURCKHByaW50aygibWVtX3JlYWQ6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JCUhBTFRfU1lTKCk7Ci0JCX0KLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JCXZhbCA9ICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpIHwKLQkJCSAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpIDw8IDgpKTsKLQkJfQotCWVsc2UKLSNlbmRpZgotI2lmZGVmIF9fYWxwaGFfXwotCQl2YWwgPSBsZHdfdSgodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpKTsKLSNlbGlmIGRlZmluZWQgKF9faWE2NF9fKQotCSAgdmFsID0gdWxkdygodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpKTsKLSNlbHNlCi0JCXZhbCA9ICoodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpOwotI2VuZGlmCi0JCURCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCi0JCXByaW50aygiJSMwOHggMiAtPiAlI3hcbiIsIGFkZHIsIHZhbCk7KQotICAgIHJldHVybiB2YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLQotUkVUVVJOUzoKLUxvbmcgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KLVJFTUFSS1M6Ci1SZWFkcyBhIGxvbmcgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBYODZBUEkgcmRsKAotCXUzMiBhZGRyKQotewotCXUzMiB2YWwgPSAwOwotCi0JaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gNCkgewotCQlEQihwcmludGsoIm1lbV9yZWFkOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQotCQlIQUxUX1NZUygpOwotCQl9Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MykgewotCQl2YWwgPSAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgfAotCQkJICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPDwgOCkgfAotCQkJICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPDwgMTYpIHwKLQkJCSAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpIDw8IDI0KSk7Ci0JCX0KLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBfX2FscGhhX18KLQkJdmFsID0gbGRsX3UoKHUzMiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7Ci0jZWxpZiBkZWZpbmVkIChfX2lhNjRfXykKLQkJdmFsID0gdWxkbCgodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpKTsKLSNlbHNlCi0JCXZhbCA9ICoodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpOwotI2VuZGlmCi1EQigJaWYgKERFQlVHX01FTV9UUkFDRSgpKQotCQlwcmludGsoIiUjMDh4IDQgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKLQlyZXR1cm4gdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGJ5dGUgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2QVBJIHdyYigKLQl1MzIgYWRkciwKLQl1OCB2YWwpCi17Ci1EQigJaWYgKERFQlVHX01FTV9UUkFDRSgpKQotCQlwcmludGsoIiUjMDh4IDEgPC0gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICBpZiAoYWRkciA+IE0ubWVtX3NpemUgLSAxKSB7Ci0JCURCKHByaW50aygibWVtX3dyaXRlOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQotCQlIQUxUX1NZUygpOwotCQl9Ci0JKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKSA9IHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkFQSSB3cncoCi0JdTMyIGFkZHIsCi0JdTE2IHZhbCkKLXsKLURCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCi0JCXByaW50aygiJSMwOHggMiA8LSAlI3hcbiIsIGFkZHIsIHZhbCk7KQotCWlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDIpIHsKLQkJREIocHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JCUhBTFRfU1lTKCk7Ci0JCX0KLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JCSoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApID0gKHZhbCA+PiAwKSAmIDB4ZmY7Ci0JCSoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JCX0KLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBfX2FscGhhX18KLQkgc3R3X3UodmFsLCh1MTYqKShNLm1lbV9iYXNlICsgYWRkcikpOwotI2VsaWYgZGVmaW5lZCAoX19pYTY0X18pCi0JIHVzdHcodmFsLCh1MTYqKShNLm1lbV9iYXNlICsgYWRkcikpOwotI2Vsc2UKLQkgKih1MTYqKShNLm1lbV9iYXNlICsgYWRkcikgPSB2YWw7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBsb25nIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkFQSSB3cmwoCi0JdTMyIGFkZHIsCi0JdTMyIHZhbCkKLXsKLURCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCi0JCXByaW50aygiJSMwOHggNCA8LSAlI3hcbiIsIGFkZHIsIHZhbCk7KQotCWlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDQpIHsKLQkJREIocHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JCUhBTFRfU1lTKCk7Ci0JCX0KLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JCSoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApID0gKHZhbCA+PiAgMCkgJiAweGZmOwotCQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKLQkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPSAodmFsID4+IDE2KSAmIDB4ZmY7Ci0JCSoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpID0gKHZhbCA+PiAyNCkgJiAweGZmOwotCQl9Ci0JZWxzZQotI2VuZGlmCi0jaWZkZWYgX19hbHBoYV9fCi0JIHN0bF91KHZhbCwodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpKTsKLSNlbGlmIGRlZmluZWQgKF9faWE2NF9fKQotCSB1c3RsKHZhbCwodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpKTsKLSNlbHNlCi0JICoodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIFBJTyBhZGRyZXNzIHRvIHJlYWQKLVJFVFVSTjoKLTAKLVJFTUFSS1M6Ci1EZWZhdWx0IFBJTyBieXRlIHJlYWQgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIGluYi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdTggWDg2QVBJIHBfaW5iKAotCVg4NkVNVV9waW9BZGRyIGFkZHIpCi17Ci1EQigJaWYgKERFQlVHX0lPX1RSQUNFKCkpCi0JCXByaW50aygiaW5iICUjMDR4IFxuIiwgYWRkcik7KQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBQSU8gYWRkcmVzcyB0byByZWFkCi1SRVRVUk46Ci0wCi1SRU1BUktTOgotRGVmYXVsdCBQSU8gd29yZCByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbncuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHUxNiBYODZBUEkgcF9pbncoCi0JWDg2RU1VX3Bpb0FkZHIgYWRkcikKLXsKLURCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKLQkJcHJpbnRrKCJpbncgJSMwNHggXG4iLCBhZGRyKTspCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIFBJTyBhZGRyZXNzIHRvIHJlYWQKLVJFVFVSTjoKLTAKLVJFTUFSS1M6Ci1EZWZhdWx0IFBJTyBsb25nIHJlYWQgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIGlubC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdTMyIFg4NkFQSSBwX2lubCgKLQlYODZFTVVfcGlvQWRkciBhZGRyKQotewotREIoCWlmIChERUJVR19JT19UUkFDRSgpKQotCQlwcmludGsoImlubCAlIzA0eCBcbiIsIGFkZHIpOykKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gUElPIGFkZHJlc3MgdG8gd3JpdGUKLXZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQotUkVNQVJLUzoKLURlZmF1bHQgUElPIGJ5dGUgd3JpdGUgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIG91dGIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgWDg2QVBJIHBfb3V0YigKLQlYODZFTVVfcGlvQWRkciBhZGRyLAotCXU4IHZhbCkKLXsKLURCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKLQkJcHJpbnRrKCJvdXRiICUjMDJ4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCi0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBQSU8gYWRkcmVzcyB0byB3cml0ZQotdmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCi1SRU1BUktTOgotRGVmYXVsdCBQSU8gd29yZCB3cml0ZSBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgb3V0dy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBYODZBUEkgcF9vdXR3KAotCVg4NkVNVV9waW9BZGRyIGFkZHIsCi0JdTE2IHZhbCkKLXsKLURCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKLQkJcHJpbnRrKCJvdXR3ICUjMDR4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCi0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBQSU8gYWRkcmVzcyB0byB3cml0ZQotdmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCi1SRU1BUktTOgotRGVmYXVsdCBQSU8gO29uZyB3cml0ZSBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgb3V0bC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBYODZBUEkgcF9vdXRsKAotCVg4NkVNVV9waW9BZGRyIGFkZHIsCi0JdTMyIHZhbCkKLXsKLURCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKLQkJcHJpbnRrKCJvdXRsICUjMDh4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCi0gICAgcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11OCAgCShYODZBUElQIHN5c19yZGIpKHUzMiBhZGRyKSAJCQkgICAgICAgICAgICA9IHJkYjsKLXUxNiAJKFg4NkFQSVAgc3lzX3JkdykodTMyIGFkZHIpIAkJCSAgICAgICAgICAgID0gcmR3OwotdTMyIAkoWDg2QVBJUCBzeXNfcmRsKSh1MzIgYWRkcikgCQkJICAgICAgICAgICAgPSByZGw7Ci12b2lkIAkoWDg2QVBJUCBzeXNfd3JiKSh1MzIgYWRkcix1OCB2YWwpIAkJICAgICAgICAgICAgPSB3cmI7Ci12b2lkIAkoWDg2QVBJUCBzeXNfd3J3KSh1MzIgYWRkcix1MTYgdmFsKSAJICAgICAgICAgICAgPSB3cnc7Ci12b2lkIAkoWDg2QVBJUCBzeXNfd3JsKSh1MzIgYWRkcix1MzIgdmFsKSAJICAgICAgICAgICAgPSB3cmw7Ci11OCAgCShYODZBUElQIHN5c19pbmIpKFg4NkVNVV9waW9BZGRyIGFkZHIpCSAgICAgICAgICAgID0gcF9pbmI7Ci11MTYgCShYODZBUElQIHN5c19pbncpKFg4NkVNVV9waW9BZGRyIGFkZHIpCSAgICAgICAgICAgID0gcF9pbnc7Ci11MzIgCShYODZBUElQIHN5c19pbmwpKFg4NkVNVV9waW9BZGRyIGFkZHIpICAgICAgICAgICAgICA9IHBfaW5sOwotdm9pZCAJKFg4NkFQSVAgc3lzX291dGIpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHU4IHZhbCkgCT0gcF9vdXRiOwotdm9pZCAJKFg4NkFQSVAgc3lzX291dHcpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUxNiB2YWwpCT0gcF9vdXR3Owotdm9pZCAJKFg4NkFQSVAgc3lzX291dGwpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpCT0gcF9vdXRsOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNldHVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWZ1bmNzCS0gTmV3IG1lbW9yeSBmdW5jdGlvbiBwb2ludGVycyB0byBtYWtlIGFjdGl2ZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGFjY2VzcwotbWVtb3J5IHNwYWNlLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBvdmVycmlkZSB0aGVzZSBmdW5jdGlvbnMKLWFuZCBob29rIHRoZW0gb3V0IGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZFTVVfc2V0dXBNZW1GdW5jcygKLQlYODZFTVVfbWVtRnVuY3MgKmZ1bmNzKQotewotCXN5c19yZGIgPSBmdW5jcy0+cmRiOwotICAgIHN5c19yZHcgPSBmdW5jcy0+cmR3OwotICAgIHN5c19yZGwgPSBmdW5jcy0+cmRsOwotICAgIHN5c193cmIgPSBmdW5jcy0+d3JiOwotICAgIHN5c193cncgPSBmdW5jcy0+d3J3OwotICAgIHN5c193cmwgPSBmdW5jcy0+d3JsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWZ1bmNzCS0gTmV3IHByb2dyYW1tZWQgSS9PIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1ha2UgYWN0aXZlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgd2hpY2ggYWNjZXNzCi1JL08gc3BhY2UsIGFsbG93aW5nIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIG92ZXJyaWRlIHRoZXNlIGZ1bmN0aW9ucwotYW5kIGhvb2sgdGhlbSBvdXQgYXMgbmVjZXNzYXJ5IGZvciB0aGVpciBhcHBsaWNhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKAotCVg4NkVNVV9waW9GdW5jcyAqZnVuY3MpCi17Ci0gICAgc3lzX2luYiA9IGZ1bmNzLT5pbmI7Ci0gICAgc3lzX2ludyA9IGZ1bmNzLT5pbnc7Ci0gICAgc3lzX2lubCA9IGZ1bmNzLT5pbmw7Ci0gICAgc3lzX291dGIgPSBmdW5jcy0+b3V0YjsKLSAgICBzeXNfb3V0dyA9IGZ1bmNzLT5vdXR3OwotICAgIHN5c19vdXRsID0gZnVuY3MtPm91dGw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZnVuY3MJLSBOZXcgaW50ZXJydXB0IHZlY3RvciB0YWJsZSB0byBtYWtlIGFjdGl2ZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGhhbmRsZQotaW50ZXJydXB0IHByb2Nlc3NpbmcgaW4gdGhlIGVtdWxhdG9yLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0bwotaG9vayBpbnRlcnJ1cHRzIGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uIEFueSBpbnRlcnJ1cHRzIHRoYXQKLWFyZSBub3QgaG9va2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uLCBhbmQgcmVmbGVjdGVkIGFuZCBoYW5kbGVkIGludGVybmFsbHkKLWluIHRoZSBlbXVsYXRvciB2aWEgdGhlIGludGVycnVwdCB2ZWN0b3IgdGFibGUuIFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbgotdG8gZ2V0IGNvbnRyb2wgd2hlbiB0aGUgY29kZSBiZWluZyBlbXVsYXRlZCBleGVjdXRlcyBzcGVjaWZpYyBzb2Z0d2FyZQotaW50ZXJydXB0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkVNVV9zZXR1cEludHJGdW5jcygKLQlYODZFTVVfaW50ckZ1bmNzIGZ1bmNzW10pCi17Ci0gICAgaW50IGk7Ci0KLQlmb3IgKGk9MDsgaSA8IDI1NjsgaSsrKQotCQlfWDg2RU1VX2ludHJUYWJbaV0gPSBOVUxMOwotCWlmIChmdW5jcykgewotCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQlfWDg2RU1VX2ludHJUYWJbaV0gPSBmdW5jc1tpXTsKLQkJfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludAktIE5ldyBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gcHJlcGFyZSBmb3IKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdXAgdGhlIGVtdWxhdG9yIHN0YXRlIHRvIGV4Y2V1dGUgYSBzb2Z0d2FyZQotaW50ZXJydXB0LiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uIGNvZGUgdG8gYWxsb3cgYW4KLWludGVycnVwdCB0byBiZSBob29rZWQsIGV4YW1pbmVkIGFuZCB0aGVuIHJlZmxlY3RlZCBiYWNrIHRvIHRoZSBlbXVsYXRvcgotc28gdGhhdCB0aGUgY29kZSBpbiB0aGUgZW11bGF0b3Igd2lsbCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBzb2Z0d2FyZQotaW50ZXJydXB0IGFzIHBlciBub3JtYWwuIFRoaXMgZXNzZW50aWFsbHkgYWxsb3dzIHN5c3RlbSBjb2RlIHRvIGFjdGl2ZWx5Ci1ob29rIGFuZCBoYW5kbGUgY2VydGFpbiBzb2Z0d2FyZSBpbnRlcnJ1cHRzIGFzIG5lY2Vzc2FyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkVNVV9wcmVwYXJlRm9ySW50KAotCWludCBudW0pCi17Ci0gICAgcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOwotICAgIENMRUFSX0ZMQUcoRl9JRik7Ci0gICAgQ0xFQVJfRkxBRyhGX1RGKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0gICAgTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChudW0gKiA0ICsgMik7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotICAgIE0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQobnVtICogNCk7Ci0JTS54ODYuaW50ciA9IDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvdmFsaWRhdGUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS92YWxpZGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUxMzAxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS92YWxpZGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIFdhdGNvbSBDIDEwLjYgb3IgbGF0ZXIKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgRE9TCi0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgUHJvZ3JhbSB0byB2YWxpZGF0ZSB0aGUgeDg2IGVtdWxhdG9yIGxpYnJhcnkgZm9yCi0qICAgICAgICAgICAgICAgY29ycmVjdG5lc3MuIFdlIHJ1biB0aGUgZW11bGF0b3IgcHJpbWl0aXZlIG9wZXJhdGlvbnMKLSogICAgICAgICAgICAgICBmdW5jdGlvbnMgYWdhaW5zdCB0aGUgcmVhbCB4ODYgQ1BVLCBhbmQgY29tcGFyZSB0aGUgcmVzdWx0Ci0qICAgICAgICAgICAgICAgYW5kIGZsYWdzIHRvIGVuc3VyZSBjb3JyZWN0bmVzcy4KLSoKLSogICAgICAgICAgICAgICBXZSB1c2UgaW5saW5lIGFzc2VtYmxlciB0byBjb21waWxlIGFuZCBidWlsZCB0aGlzIHByb2dyYW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJ4ODZlbXUuaCIKLSNpbmNsdWRlICJ4ODZlbXUvcHJpbV9hc20uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSB0cnVlIDEKLSNkZWZpbmUgZmFsc2UgMAotCi0jZGVmaW5lIEFMTF9GTEFHUyAgIChGX0NGIHwgRl9QRiB8IEZfQUYgfCBGX1pGIHwgRl9TRiB8IEZfT0YpCi0KLSNkZWZpbmUgVkFMX1NUQVJUX0JJTkFSWShwYXJtX3R5cGUscmVzX3R5cGUsZG1heCxzbWF4LGRpbmNyLHNpbmNyKSAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcGFybV90eXBlICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXNfdHlwZSAgICByLHJfYXNtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXVsb25nICAgICAJZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IGRtYXg7IGQgKz0gZGluY3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmb3IgKHMgPSAwOyBzIDwgc21heDsgcyArPSBzaW5jcikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgXAotCSAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7Ci0KLSNkZWZpbmUgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9hc20gPSBuYW1lIyNfYXNtKCZmbGFncyxkLHMpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXIgPSBuYW1lKGQscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKHIgIT0gcl9hc20gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSAgICAgICAgICAgICAgICBcCi0JCSAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkIHx8IHRyYWNlKSB7Ci0KLSNkZWZpbmUgVkFMX1RFU1RfQklOQVJZX1ZPSUQobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZSMjX2FzbSgmZmxhZ3MsZCxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUoZCxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJciA9IHJfYXNtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCB8fCB0cmFjZSkgewotCi0jZGVmaW5lIFZBTF9GQUlMX0JZVEVfQllURV9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwMlggPSAlLTE1cygweCUwMlgsMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJciwgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgICBcCi0JCSAgICBwcmludGsoIjB4JTAyWCA9ICUtMTVzKDB4JTAyWCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKLQotI2RlZmluZSBWQUxfRkFJTF9XT1JEX1dPUkRfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDRYLDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXIsICNuYW1lLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgIFwKLQkJICAgIHByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDRYLDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOwotCi0jZGVmaW5lIFZBTF9GQUlMX0xPTkdfTE9OR19CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwOFggPSAlLTE1cygweCUwOFgsMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJciwgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7IFwKLQkJICAgIHByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYLDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOwotCi0jZGVmaW5lIFZBTF9FTkRfQklOQVJZKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAotCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFZBTF9CWVRFX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTgsdTgsMHhGRiwweEZGLDEsMSkgICBcCi0gICAgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9CWVRFX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfV09SRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHUxNix1MTYsMHhGRjAwLDB4RkYwMCwweDEwMCwweDEwMCkgXAotICAgIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfV09SRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX0xPTkdfTE9OR19CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHUzMix1MzIsMHhGRjAwMDAwMCwweEZGMDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDApIFwKLSAgICBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9MT05HX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1ZPSURfQllURV9CSU5BUlkobmFtZSkgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1OCx1OCwweEZGLDB4RkYsMSwxKSAgIFwKLSAgICBWQUxfVEVTVF9CSU5BUllfVk9JRChuYW1lKSAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0JZVEVfQllURV9CSU5BUlkobmFtZSkgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9WT0lEX1dPUkRfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTE2LHUxNiwweEZGMDAsMHhGRjAwLDB4MTAwLDB4MTAwKSBcCi0gICAgVkFMX1RFU1RfQklOQVJZX1ZPSUQobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9XT1JEX1dPUkRfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfVk9JRF9MT05HX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTMyLHUzMiwweEZGMDAwMDAwLDB4RkYwMDAwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMCkgXAotICAgIFZBTF9URVNUX0JJTkFSWV9WT0lEKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0xPTkdfTE9OR19CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfQllURV9ST1RBVEUobmFtZSkgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHU4LHU4LDB4RkYsOCwxLDEpICAgICAgXAotICAgIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfQllURV9CWVRFX0JJTkFSWShuYW1lKSAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1dPUkRfUk9UQVRFKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1MTYsdTE2LDB4RkYwMCwxNiwweDEwMCwxKSAgICAgICAgIFwKLSAgICBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX1dPUkRfV09SRF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9MT05HX1JPVEFURShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1MzIsdTMyLDB4RkYwMDAwMDAsMzIsMHgxMDAwMDAwLDEpICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfTE9OR19MT05HX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9TVEFSVF9URVJOQVJZKHBhcm1fdHlwZSxyZXNfdHlwZSxkbWF4LHNtYXgsZGluY3Isc2luY3IsbWF4c2hpZnQpXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcGFybV90eXBlICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXNfdHlwZSAgICByLHJfYXNtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHU4ICAgICAgICAgIHNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdTMyICAgICAgICAgZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IGRtYXg7IGQgKz0gZGluY3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmb3IgKHMgPSAwOyBzIDwgc21heDsgcyArPSBzaW5jcikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGZvciAoc2hpZnQgPSAwOyBzaGlmdCA8IG1heHNoaWZ0OyBzaGlmdCArPSAxKSB7ICAgICAgICBcCi0JCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICBcCi0JCWZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsKLQotI2RlZmluZSBWQUxfVEVTVF9URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcl9hc20gPSBuYW1lIyNfYXNtKCZmbGFncyxkLHMsc2hpZnQpOyAgICAgICAgICAgICAgIFwKLQkJICAgIHIgPSBuYW1lKGQscyxzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKHIgIT0gcl9hc20gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSAgICAgICAgICAgIFwKLQkJCWZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQgfHwgdHJhY2UpIHsKLQotI2RlZmluZSBWQUxfRkFJTF9XT1JEX1dPUkRfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkgICAgcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTA0WCwweCUwNFgsJWQpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkgICAgciwgI25hbWUsIGQsIHMsIHNoaWZ0LCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgIFwKLQkJCXByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDRYLDB4JTA0WCwlZCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHNoaWZ0LCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7Ci0KLSNkZWZpbmUgVkFMX0ZBSUxfTE9OR19MT05HX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCIweCUwOFggPSAlLTE1cygweCUwOFgsMHglMDhYLCVkKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAotCQkJICAgIHIsICNuYW1lLCBkLCBzLCBzaGlmdCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgIFwKLQkJCXByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYLDB4JTA4WCwlZCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHNoaWZ0LCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7Ci0KLSNkZWZpbmUgVkFMX0VORF9URVJOQVJZKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVkFMX1dPUkRfUk9UQVRFX0RCTChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfU1RBUlRfVEVSTkFSWSh1MTYsdTE2LDB4RkYwMCwweEZGMDAsMHgxMDAsMHgxMDAsMTYpIFwKLSAgICBWQUxfVEVTVF9URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9XT1JEX1dPUkRfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX1RFUk5BUlkoKQotCi0jZGVmaW5lIFZBTF9MT05HX1JPVEFURV9EQkwobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfU1RBUlRfVEVSTkFSWSh1MzIsdTMyLDB4RkYwMDAwMDAsMHhGRjAwMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwLDMyKSBcCi0gICAgVkFMX1RFU1RfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0xPTkdfTE9OR19URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX1RFUk5BUlkoKQotCi0jZGVmaW5lIFZBTF9TVEFSVF9VTkFSWShwYXJtX3R5cGUsbWF4LGluY3IpICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcGFybV90eXBlICAgZCxyLHJfYXNtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdTMyICAgICAgICAgZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IG1heDsgZCArPSBpbmNyKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgIFwKLQlmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7Ci0KLSNkZWZpbmUgVkFMX1RFU1RfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgcl9hc20gPSBuYW1lIyNfYXNtKCZmbGFncyxkKTsgICAgICAgICAgICAgICAgICAgXAotCSAgICByID0gbmFtZShkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKHIgIT0gcl9hc20gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSB7ICAgICAgXAotCQlmYWlsZWQgPSB0cnVlOwotCi0jZGVmaW5lIFZBTF9GQUlMX0JZVEVfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwcmludGsoIjB4JTAyWCA9ICUtMTVzKDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHIsICNuYW1lLCBkLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICBcCi0JCXByaW50aygiMHglMDJYID0gJS0xNXMoMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcl9hc20sICNuYW1lIl9hc20iLCBkLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7Ci0KLSNkZWZpbmUgVkFMX0ZBSUxfV09SRF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgciwgI25hbWUsIGQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICBcCi0JCXByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcl9hc20sICNuYW1lIl9hc20iLCBkLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7Ci0KLSNkZWZpbmUgVkFMX0ZBSUxfTE9OR19VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgciwgI25hbWUsIGQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgIFwKLQkJcHJpbnRrKCIweCUwOFggPSAlLTE1cygweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKLQotI2RlZmluZSBWQUxfRU5EX1VOQVJZKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgQUxMX0ZMQUdTOyAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBWQUxfQllURV9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgIFwKLSAgICBWQUxfU1RBUlRfVU5BUlkodTgsMHhGRiwweDEpICAgICAgICAgICAgXAotICAgIFZBTF9URVNUX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfQllURV9VTkFSWShuYW1lKSAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX1VOQVJZKCkKLQotI2RlZmluZSBWQUxfV09SRF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgIFwKLSAgICBWQUxfU1RBUlRfVU5BUlkodTE2LDB4RkYwMCwweDEwMCkgICAgICAgXAotICAgIFZBTF9URVNUX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfV09SRF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX1VOQVJZKCkKLQotI2RlZmluZSBWQUxfV09SRF9CWVRFX1VOQVJZKG5hbWUpICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgIFwKLSAgICBWQUxfU1RBUlRfVU5BUlkodTE2LDB4RkYsMHgxKSAgICAgICAgICAgXAotICAgIFZBTF9URVNUX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfV09SRF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX1VOQVJZKCkKLQotI2RlZmluZSBWQUxfTE9OR19VTkFSWShuYW1lKSAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgIFwKLSAgICBWQUxfU1RBUlRfVU5BUlkodTMyLDB4RkYwMDAwMDAsMHgxMDAwMDAwKSBcCi0gICAgVkFMX1RFU1RfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9MT05HX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfVU5BUlkoKQotCi0jZGVmaW5lIFZBTF9CWVRFX01VTChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTggICAgICAgICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTE2ICAgICAgICAgcixyX2FzbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdTMyICAgICAgICAgZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IDB4RkY7IGQgKz0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZm9yIChzID0gMDsgcyA8IDB4RkY7IHMgKz0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICAgICAgXAotCSAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUjI19hc20oJmZsYWdzLCZyX2FzbSxkLHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0FMID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZShzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJciA9IE0ueDg2LlJfQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChyICE9IHJfYXNtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgICAgICAgICAgICAgICAgXAotCQkgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCB8fCB0cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwMlgsMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJciwgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTAyWCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKLQkJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCAoQUxMX0ZMQUdTICYgfkZfT0YpOyAgIFwKLQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBWQUxfV09SRF9NVUwobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUxNiAgICAgICAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUxNiAgICAgICAgIHJfbG8scl9hc21fbG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUxNiAgICAgICAgIHJfaGkscl9hc21faGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCAweEZGMDA7IGQgKz0gMHgxMDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWZvciAocyA9IDA7IHMgPCAweEZGMDA7IHMgKz0gMHgxMDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKLQkgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lIyNfYXNtKCZmbGFncywmcl9hc21fbG8sJnJfYXNtX2hpLGQscyk7ICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9BWCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfbG8gPSBNLng4Ni5SX0FYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX2hpID0gTS54ODYuUl9EWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKHJfbG8gIT0gcl9hc21fbG8gfHwgcl9oaSAhPSByX2FzbV9oaSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpXAotCQkgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCB8fCB0cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwNFg6MHglMDRYID0gJS0xNXMoMHglMDRYLDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9oaSxyX2xvLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwNFg6MHglMDRYID0gJS0xNXMoMHglMDRYLDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc21faGkscl9hc21fbG8sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7ICBcCi0JCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAotCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFZBTF9MT05HX01VTChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTMyICAgICAgICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTMyICAgICAgICAgcl9sbyxyX2FzbV9sbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTMyICAgICAgICAgcl9oaSxyX2FzbV9oaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdTMyICAgICAgICAgZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IDB4RkYwMDAwMDA7IGQgKz0gMHgxMDAwMDAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JZm9yIChzID0gMDsgcyA8IDB4RkYwMDAwMDA7IHMgKz0gMHgxMDAwMDAwKSB7ICAgICAgICAgICAgICAgICAgIFwKLQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICAgICAgXAotCSAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUjI19hc20oJmZsYWdzLCZyX2FzbV9sbywmcl9hc21faGksZCxzKTsgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VBWCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZShzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9sbyA9IE0ueDg2LlJfRUFYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfaGkgPSBNLng4Ni5SX0VEWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAocl9sbyAhPSByX2FzbV9sbyB8fCByX2hpICE9IHJfYXNtX2hpIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncylcCi0JCSAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA4WDoweCUwOFggPSAlLTE1cygweCUwOFgsMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2hpLHJfbG8sICNuYW1lLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA4WDoweCUwOFggPSAlLTE1cygweCUwOFgsMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbV9oaSxyX2FzbV9sbywgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKLQkJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCi0JCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVkFMX0JZVEVfRElWKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MTYgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1OCAgICAgICAgICByX3F1b3Qscl9yZW0scl9hc21fcXVvdCxyX2FzbV9yZW07ICAgICAgICAgICAgICAgICAgICAgIFwKLQl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjAwOyBkICs9IDB4MTAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmb3IgKHMgPSAxOyBzIDwgMHhGRjsgcyArPSAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgICAgICAgICBcCi0JICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuaW50ciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfQVggPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX3F1b3QgPSBNLng4Ni5SX0FMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9yZW0gPSBNLng4Ni5SX0FIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChNLng4Ni5pbnRyICYgSU5UUl9TWU5DSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZSMjX2FzbSgmZmxhZ3MsJnJfYXNtX3F1b3QsJnJfYXNtX3JlbSxkLHMpOyAgICAgICAgICBcCi0JCWlmIChyX3F1b3QgIT0gcl9hc21fcXVvdCB8fCByX3JlbSAhPSByX2FzbV9yZW0gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSBcCi0JCSAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTAyWDoweCUwMlggPSAlLTE1cygweCUwNFgsMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9xdW90LCByX3JlbSwgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgICBcCi0JCSAgICBwcmludGsoIjB4JTAyWDoweCUwMlggPSAlLTE1cygweCUwNFgsMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc21fcXVvdCwgcl9hc21fcmVtLCAjbmFtZSJfYXNtIiwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOyAgXAotCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAotCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFZBTF9XT1JEX0RJVihuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTMyICAgICAgICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTE2ICAgICAgICAgcl9xdW90LHJfcmVtLHJfYXNtX3F1b3Qscl9hc21fcmVtOyAgICAgICAgICAgICAgICAgICAgICBcCi0JdTMyICAgICAgICAgZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IDB4RkYwMDAwMDA7IGQgKz0gMHgxMDAwMDAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JZm9yIChzID0gMHgxMDA7IHMgPCAweEZGMDA7IHMgKz0gMHgxMDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICAgICAgXAotCSAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LmludHIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0FYID0gZCAmIDB4RkZGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9EWCA9IGQgPj4gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfcXVvdCA9IE0ueDg2LlJfQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX3JlbSA9IE0ueDg2LlJfRFg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lIyNfYXNtKCZmbGFncywmcl9hc21fcXVvdCwmcl9hc21fcmVtLGQgJiAweEZGRkYsZCA+PiAxNixzKTtcCi0JCWlmIChyX3F1b3QgIT0gcl9hc21fcXVvdCB8fCByX3JlbSAhPSByX2FzbV9yZW0gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSBcCi0JCSAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA0WDoweCUwNFggPSAlLTE1cygweCUwOFgsMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9xdW90LCByX3JlbSwgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA0WDoweCUwNFggPSAlLTE1cygweCUwOFgsMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc21fcXVvdCwgcl9hc21fcmVtLCAjbmFtZSJfYXNtIiwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOyAgXAotCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAotCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFZBTF9MT05HX0RJVihuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTMyICAgICAgICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTMyICAgICAgICAgcl9xdW90LHJfcmVtLHJfYXNtX3F1b3Qscl9hc21fcmVtOyAgICAgICAgICAgICAgICAgICAgICBcCi0JdTMyICAgICAgICAgZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IDB4RkYwMDAwMDA7IGQgKz0gMHgxMDAwMDAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JZm9yIChzID0gMHgxMDA7IHMgPCAweEZGMDA7IHMgKz0gMHgxMDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICAgICAgXAotCSAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LmludHIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VBWCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FRFggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfcXVvdCA9IE0ueDg2LlJfRUFYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX3JlbSA9IE0ueDg2LlJfRURYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lIyNfYXNtKCZmbGFncywmcl9hc21fcXVvdCwmcl9hc21fcmVtLGQsMCxzKTsgICAgICAgIFwKLQkJaWYgKHJfcXVvdCAhPSByX2FzbV9xdW90IHx8IHJfcmVtICE9IHJfYXNtX3JlbSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpIFwKLQkJICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQgfHwgdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDhYOjB4JTA4WCA9ICUtMTVzKDB4JTA4WDoweCUwOFgsMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfcXVvdCwgcl9yZW0sICNuYW1lLCAwLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgXAotCQkgICAgcHJpbnRrKCIweCUwOFg6MHglMDhYID0gJS0xNXMoMHglMDhYOjB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc21fcXVvdCwgcl9hc21fcmVtLCAjbmFtZSJfYXNtIiwgMCwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOyAgIFwKLQkJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCAoQUxMX0ZMQUdTICYgfkZfT0YpOyAgIFwKLQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotdm9pZCBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdwdHI7Ci0gICAgdmFfc3RhcnQoYXJncHRyLCBmbXQpOwotICAgIHZmcHJpbnRmKHN0ZG91dCwgZm10LCBhcmdwdHIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIHZhX2VuZChhcmdwdHIpOwotfQotCi1jaGFyICogcHJpbnRfZmxhZ3MoY2hhciAqYnVmLHVsb25nIGZsYWdzKQotewotICAgIGNoYXIgKnNlcGFyYXRvciA9ICIiOwotCi0gICAgYnVmWzBdID0gMDsKLSAgICBpZiAoZmxhZ3MgJiBGX0NGKSB7Ci0Jc3RyY2F0KGJ1ZixzZXBhcmF0b3IpOwotCXN0cmNhdChidWYsIkNGIik7Ci0Jc2VwYXJhdG9yID0gIiwiOwotCX0KLSAgICBpZiAoZmxhZ3MgJiBGX1BGKSB7Ci0Jc3RyY2F0KGJ1ZixzZXBhcmF0b3IpOwotCXN0cmNhdChidWYsIlBGIik7Ci0Jc2VwYXJhdG9yID0gIiwiOwotCX0KLSAgICBpZiAoZmxhZ3MgJiBGX0FGKSB7Ci0Jc3RyY2F0KGJ1ZixzZXBhcmF0b3IpOwotCXN0cmNhdChidWYsIkFGIik7Ci0Jc2VwYXJhdG9yID0gIiwiOwotCX0KLSAgICBpZiAoZmxhZ3MgJiBGX1pGKSB7Ci0Jc3RyY2F0KGJ1ZixzZXBhcmF0b3IpOwotCXN0cmNhdChidWYsIlpGIik7Ci0Jc2VwYXJhdG9yID0gIiwiOwotCX0KLSAgICBpZiAoZmxhZ3MgJiBGX1NGKSB7Ci0Jc3RyY2F0KGJ1ZixzZXBhcmF0b3IpOwotCXN0cmNhdChidWYsIlNGIik7Ci0Jc2VwYXJhdG9yID0gIiwiOwotCX0KLSAgICBpZiAoZmxhZ3MgJiBGX09GKSB7Ci0Jc3RyY2F0KGJ1ZixzZXBhcmF0b3IpOwotCXN0cmNhdChidWYsIk9GIik7Ci0Jc2VwYXJhdG9yID0gIiwiOwotCX0KLSAgICBpZiAoc2VwYXJhdG9yWzBdID09IDApCi0Jc3RyY3B5KGJ1ZiwiTm9uZSIpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLWludCBtYWluKGludCBhcmdjKQotewotICAgIHVsb25nICAgZGVmX2ZsYWdzOwotICAgIGludCB0cmFjZSA9IGZhbHNlOwotCi0gICAgaWYgKGFyZ2MgPiAxKQotCXRyYWNlID0gdHJ1ZTsKLSAgICBtZW1zZXQoJk0sIDAsIHNpemVvZihNKSk7Ci0gICAgZGVmX2ZsYWdzID0gZ2V0X2ZsYWdzX2FzbSgpICYgfkFMTF9GTEFHUzsKLQotICAgIFZBTF9XT1JEX1VOQVJZKGFhYV93b3JkKTsKLSAgICBWQUxfV09SRF9VTkFSWShhYXNfd29yZCk7Ci0KLSAgICBWQUxfV09SRF9VTkFSWShhYWRfd29yZCk7Ci0gICAgVkFMX1dPUkRfVU5BUlkoYWFtX3dvcmQpOwotCi0gICAgVkFMX0JZVEVfQllURV9CSU5BUlkoYWRjX2J5dGUpOwotICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKGFkY193b3JkKTsKLSAgICBWQUxfTE9OR19MT05HX0JJTkFSWShhZGNfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9CWVRFX0JJTkFSWShhZGRfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoYWRkX3dvcmQpOwotICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKGFkZF9sb25nKTsKLQotICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKGFuZF9ieXRlKTsKLSAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShhbmRfd29yZCk7Ci0gICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoYW5kX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfQllURV9CSU5BUlkoY21wX2J5dGUpOwotICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKGNtcF93b3JkKTsKLSAgICBWQUxfTE9OR19MT05HX0JJTkFSWShjbXBfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9VTkFSWShkYWFfYnl0ZSk7Ci0gICAgVkFMX0JZVEVfVU5BUlkoZGFzX2J5dGUpOyAgIC8qIEZhaWxzIGZvciAweDlBIChvdXQgb2YgcmFuZ2UgYW55d2F5KSAqLwotCi0gICAgVkFMX0JZVEVfVU5BUlkoZGVjX2J5dGUpOwotICAgIFZBTF9XT1JEX1VOQVJZKGRlY193b3JkKTsKLSAgICBWQUxfTE9OR19VTkFSWShkZWNfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9VTkFSWShpbmNfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfVU5BUlkoaW5jX3dvcmQpOwotICAgIFZBTF9MT05HX1VOQVJZKGluY19sb25nKTsKLQotICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKG9yX2J5dGUpOwotICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKG9yX3dvcmQpOwotICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKG9yX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfVU5BUlkobmVnX2J5dGUpOwotICAgIFZBTF9XT1JEX1VOQVJZKG5lZ193b3JkKTsKLSAgICBWQUxfTE9OR19VTkFSWShuZWdfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9VTkFSWShub3RfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfVU5BUlkobm90X3dvcmQpOwotICAgIFZBTF9MT05HX1VOQVJZKG5vdF9sb25nKTsKLQotICAgIFZBTF9CWVRFX1JPVEFURShyY2xfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfUk9UQVRFKHJjbF93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEUocmNsX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfUk9UQVRFKHJjcl9ieXRlKTsKLSAgICBWQUxfV09SRF9ST1RBVEUocmNyX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURShyY3JfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ST1RBVEUocm9sX2J5dGUpOwotICAgIFZBTF9XT1JEX1JPVEFURShyb2xfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFKHJvbF9sb25nKTsKLQotICAgIFZBTF9CWVRFX1JPVEFURShyb3JfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfUk9UQVRFKHJvcl93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEUocm9yX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfUk9UQVRFKHNobF9ieXRlKTsKLSAgICBWQUxfV09SRF9ST1RBVEUoc2hsX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURShzaGxfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ST1RBVEUoc2hyX2J5dGUpOwotICAgIFZBTF9XT1JEX1JPVEFURShzaHJfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFKHNocl9sb25nKTsKLQotICAgIFZBTF9CWVRFX1JPVEFURShzYXJfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfUk9UQVRFKHNhcl93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEUoc2FyX2xvbmcpOwotCi0gICAgVkFMX1dPUkRfUk9UQVRFX0RCTChzaGxkX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURV9EQkwoc2hsZF9sb25nKTsKLQotICAgIFZBTF9XT1JEX1JPVEFURV9EQkwoc2hyZF93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEVfREJMKHNocmRfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9CWVRFX0JJTkFSWShzYmJfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoc2JiX3dvcmQpOwotICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKHNiYl9sb25nKTsKLQotICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKHN1Yl9ieXRlKTsKLSAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShzdWJfd29yZCk7Ci0gICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoc3ViX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfQllURV9CSU5BUlkoeG9yX2J5dGUpOwotICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKHhvcl93b3JkKTsKLSAgICBWQUxfTE9OR19MT05HX0JJTkFSWSh4b3JfbG9uZyk7Ci0KLSAgICBWQUxfVk9JRF9CWVRFX0JJTkFSWSh0ZXN0X2J5dGUpOwotICAgIFZBTF9WT0lEX1dPUkRfQklOQVJZKHRlc3Rfd29yZCk7Ci0gICAgVkFMX1ZPSURfTE9OR19CSU5BUlkodGVzdF9sb25nKTsKLQotICAgIFZBTF9CWVRFX01VTChpbXVsX2J5dGUpOwotICAgIFZBTF9XT1JEX01VTChpbXVsX3dvcmQpOwotICAgIFZBTF9MT05HX01VTChpbXVsX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfTVVMKG11bF9ieXRlKTsKLSAgICBWQUxfV09SRF9NVUwobXVsX3dvcmQpOwotICAgIFZBTF9MT05HX01VTChtdWxfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ESVYoaWRpdl9ieXRlKTsKLSAgICBWQUxfV09SRF9ESVYoaWRpdl93b3JkKTsKLSAgICBWQUxfTE9OR19ESVYoaWRpdl9sb25nKTsKLQotICAgIFZBTF9CWVRFX0RJVihkaXZfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfRElWKGRpdl93b3JkKTsKLSAgICBWQUxfTE9OR19ESVYoZGl2X2xvbmcpOwotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlYnVnLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGEwOTYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIGRlYnVnIGRlZmluaXRpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1g4NkVNVV9ERUJVR19ICi0jZGVmaW5lIF9fWDg2RU1VX0RFQlVHX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogY2hlY2tzIHRvIGJlIGVuYWJsZWQgZm9yICJydW50aW1lIiAqLwotCi0jZGVmaW5lIENIRUNLX0lQX0ZFVENIX0YgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIENIRUNLX1NQX0FDQ0VTU19GICAgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIENIRUNLX01FTV9BQ0NFU1NfRiAgICAgICAgICAgICAgMHg0IC8qdXNpbmcgcmVndWxhciBsaW5lYXIgcG9pbnRlciAqLwotI2RlZmluZSBDSEVDS19EQVRBX0FDQ0VTU19GICAgICAgICAgICAgIDB4OCAvKnVzaW5nIHNlZ21lbnQ6b2Zmc2V0Ki8KLQotI2lmZGVmIERFQlVHCi0jIGRlZmluZSBDSEVDS19JUF9GRVRDSCgpICAgICAgICAgICAgICAJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfSVBfRkVUQ0hfRikKLSMgZGVmaW5lIENIRUNLX1NQX0FDQ0VTUygpICAgICAgICAgICAgIAkoTS54ODYuY2hlY2sgJiBDSEVDS19TUF9BQ0NFU1NfRikKLSMgZGVmaW5lIENIRUNLX01FTV9BQ0NFU1MoKSAgICAgICAgICAgIAkoTS54ODYuY2hlY2sgJiBDSEVDS19NRU1fQUNDRVNTX0YpCi0jIGRlZmluZSBDSEVDS19EQVRBX0FDQ0VTUygpICAgICAgICAgICAJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfREFUQV9BQ0NFU1NfRikKLSNlbHNlCi0jIGRlZmluZSBDSEVDS19JUF9GRVRDSCgpCi0jIGRlZmluZSBDSEVDS19TUF9BQ0NFU1MoKQotIyBkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTUygpCi0jIGRlZmluZSBDSEVDS19EQVRBX0FDQ0VTUygpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jIGRlZmluZSBERUJVR19JTlNUUlVNRU5UKCkgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0lOU1RSVU1FTlRfRikKLSMgZGVmaW5lIERFQlVHX0RFQ09ERSgpICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfREVDT0RFX0YpCi0jIGRlZmluZSBERUJVR19UUkFDRSgpICAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1RSQUNFX0YpCi0jIGRlZmluZSBERUJVR19TVEVQKCkgICAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NURVBfRikKLSMgZGVmaW5lIERFQlVHX0RJU0FTU0VNQkxFKCkgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfRElTQVNTRU1CTEVfRikKLSMgZGVmaW5lIERFQlVHX0JSRUFLKCkgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfQlJFQUtfRikKLSMgZGVmaW5lIERFQlVHX1NWQygpICAgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfU1ZDX0YpCi0jIGRlZmluZSBERUJVR19TQVZFX0lQX0NTKCkgICAgIChNLng4Ni5kZWJ1ZyAmIERFQlVHX1NBVkVfQ1NfSVApCi0KLSMgZGVmaW5lIERFQlVHX0ZTKCkgICAgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfRlNfRikKLSMgZGVmaW5lIERFQlVHX1BST0MoKSAgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfUFJPQ19GKQotIyBkZWZpbmUgREVCVUdfU1lTSU5UKCkgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19TWVNJTlRfRikKLSMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTCgpICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfVFJBQ0VDQUxMX0YpCi0jIGRlZmluZSBERUJVR19UUkFDRUNBTExSRUdTKCkgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1RSQUNFQ0FMTF9SRUdTX0YpCi0jIGRlZmluZSBERUJVR19TWVMoKSAgICAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NZU19GKQotIyBkZWZpbmUgREVCVUdfTUVNX1RSQUNFKCkgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19NRU1fVFJBQ0VfRikKLSMgZGVmaW5lIERFQlVHX0lPX1RSQUNFKCkgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfSU9fVFJBQ0VfRikKLSMgZGVmaW5lIERFQlVHX0RFQ09ERV9OT1BSSU5UKCkgKE0ueDg2LmRlYnVnICYgREVCVUdfREVDT0RFX05PUFJJTlRfRikKLSNlbHNlCi0jIGRlZmluZSBERUJVR19JTlNUUlVNRU5UKCkgICAgCTAKLSMgZGVmaW5lIERFQlVHX0RFQ09ERSgpICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfVFJBQ0UoKSAgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19TVEVQKCkgICAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX0RJU0FTU0VNQkxFKCkgICAJMAotIyBkZWZpbmUgREVCVUdfQlJFQUsoKSAgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19TVkMoKSAgICAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX1NBVkVfSVBfQ1MoKSAgICAgMAotIyBkZWZpbmUgREVCVUdfRlMoKSAgICAgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19QUk9DKCkgICAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX1NZU0lOVCgpICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfVFJBQ0VDQUxMKCkgICAgIAkwCi0jIGRlZmluZSBERUJVR19UUkFDRUNBTExSRUdTKCkgCTAKLSMgZGVmaW5lIERFQlVHX1NZUygpICAgICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfTUVNX1RSQUNFKCkgICAgIAkwCi0jIGRlZmluZSBERUJVR19JT19UUkFDRSgpICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX0RFQ09ERV9OT1BSSU5UKCkgMAotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotCi0jIGRlZmluZSBERUNPREVfUFJJTlRGKHgpICAgICAJaWYgKERFQlVHX0RFQ09ERSgpKSBcCi0JCQkJCQkJCQl4ODZlbXVfZGVjb2RlX3ByaW50Zih4KQotIyBkZWZpbmUgREVDT0RFX1BSSU5URjIoeCx5KSAgCWlmIChERUJVR19ERUNPREUoKSkgXAotCQkJCQkJCQkJeDg2ZW11X2RlY29kZV9wcmludGYyKHgseSkKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgYWxsb3cgdXMgdG8gbG9vayBhdCB0aGUgYnl0ZXMgb2YgYW4gaW5zdHJ1Y3Rpb24uICBUaGUKLSAqIGZpcnN0IElOQ1JfSU5TVFJOX0xFTiwgaXMgY2FsbGVkIGV2ZXJ5dGltZSBieXRlcyBhcmUgY29uc3VtZWQgaW4KLSAqIHRoZSBkZWNvZGluZyBwcm9jZXNzLiAgVGhlIFNBVkVfSVBfQ1MgaXMgY2FsbGVkIGluaXRpYWxseSB3aGVuIHRoZQotICogbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbiBpcyBhY2Nlc3NlZC4KLSAqLwotI2RlZmluZSBJTkNfREVDT0RFRF9JTlNUX0xFTih4KSAgICAgICAgICAgICAgICAgICAgCVwKLQlpZiAoREVCVUdfREVDT0RFKCkpICAJICAgICAgICAgICAgICAgICAgICAgICAJXAotCQl4ODZlbXVfaW5jX2RlY29kZWRfaW5zdF9sZW4oeCkKLQotI2RlZmluZSBTQVZFX0lQX0NTKHgseSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJXAotCWlmIChERUJVR19ERUNPREUoKSB8IERFQlVHX1RSQUNFQ0FMTCgpIHwgREVCVUdfQlJFQUsoKSBcCi0JICAgICAgfCBERUJVR19JT19UUkFDRSgpIHwgREVCVUdfU0FWRV9JUF9DUygpKSB7IFwKLQkJTS54ODYuc2F2ZWRfY3MgPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJXAotCQlNLng4Ni5zYXZlZF9pcCA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlcCi0JfQotI2Vsc2UKLSMgZGVmaW5lIElOQ19ERUNPREVEX0lOU1RfTEVOKHgpCi0jIGRlZmluZSBERUNPREVfUFJJTlRGKHgpCi0jIGRlZmluZSBERUNPREVfUFJJTlRGMih4LHkpCi0jIGRlZmluZSBTQVZFX0lQX0NTKHgseSkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgVFJBQ0VfUkVHUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKLQlpZiAoREVCVUdfRElTQVNTRU1CTEUoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKLQkJeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAJXAotCQlnb3RvIEVuZE9mVGhlSW5zdHJ1Y3Rpb25Qcm9jZWR1cmU7ICAgICAgICAgICAgIAkJXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCWlmIChERUJVR19UUkFDRSgpIHx8IERFQlVHX0RFQ09ERSgpKSBYODZFTVVfdHJhY2VfcmVncygpCi0jZWxzZQotIyBkZWZpbmUgVFJBQ0VfUkVHUygpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jIGRlZmluZSBTSU5HTEVfU1RFUCgpCQlpZiAoREVCVUdfU1RFUCgpKSB4ODZlbXVfc2luZ2xlX3N0ZXAoKQotI2Vsc2UKLSMgZGVmaW5lIFNJTkdMRV9TVEVQKCkKLSNlbmRpZgotCi0jZGVmaW5lIFRSQUNFX0FORF9TVEVQKCkJXAotCVRSQUNFX1JFR1MoKTsJCQlcCi0JU0lOR0xFX1NURVAoKQotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIFNUQVJUX09GX0lOU1RSKCkKLSMgZGVmaW5lIEVORF9PRl9JTlNUUigpCQlFbmRPZlRoZUluc3RydWN0aW9uUHJvY2VkdXJlOiB4ODZlbXVfZW5kX2luc3RyKCk7Ci0jIGRlZmluZSBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKQl4ODZlbXVfZW5kX2luc3RyKCk7Ci0jZWxzZQotIyBkZWZpbmUgU1RBUlRfT0ZfSU5TVFIoKQotIyBkZWZpbmUgRU5EX09GX0lOU1RSKCkKLSMgZGVmaW5lIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jIGRlZmluZSAgQ0FMTF9UUkFDRSh1LHYsdyx4LHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChERUJVR19UUkFDRUNBTExSRUdTKCkpCQkJCQkJCQkJXAotCQl4ODZlbXVfZHVtcF9yZWdzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoREVCVUdfVFJBQ0VDQUxMKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JCXByaW50aygiJTA0eDolMDR4OiBDQUxMICVzJTA0eDolMDR4XG4iLCB1ICwgdiwgcywgdywgeCk7Ci0jIGRlZmluZSBSRVRVUk5fVFJBQ0Uobix1LHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChERUJVR19UUkFDRUNBTExSRUdTKCkpCQkJCQkJCQkJXAotCQl4ODZlbXVfZHVtcF9yZWdzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoREVCVUdfVFJBQ0VDQUxMKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JCXByaW50aygiJTA0eDolMDR4OiAlc1xuIix1LHYsbik7Ci0jZWxzZQotIyBkZWZpbmUgQ0FMTF9UUkFDRSh1LHYsdyx4LHMpCi0jIGRlZmluZSBSRVRVUk5fVFJBQ0Uobix1LHYpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lCURCKHgpCXgKLSNlbHNlCi0jZGVmaW5lCURCKHgpCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgCQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi1leHRlcm4gdm9pZCB4ODZlbXVfaW5jX2RlY29kZWRfaW5zdF9sZW4gKGludCB4KTsKLWV4dGVybiB2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmIChjaGFyICp4KTsKLWV4dGVybiB2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmMiAoY2hhciAqeCwgaW50IHkpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUgKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X3NpbmdsZV9zdGVwICh2b2lkKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9lbmRfaW5zdHIgKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2R1bXBfcmVncyAodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfZHVtcF94cmVncyAodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfcHJpbnRfaW50X3ZlY3QgKHUxNiBpdik7Ci1leHRlcm4gdm9pZCB4ODZlbXVfaW5zdHJ1bWVudF9pbnN0cnVjdGlvbiAodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzICh2b2lkKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MgKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3MgKHUzMiBwKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyAodWludCBzLCB1aW50IG8pOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1g4NkVNVV9ERUJVR19IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlY29kZS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9kZWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxYTM0NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgbG9naWMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX0RFQ09ERV9ICi0jZGVmaW5lIF9fWDg2RU1VX0RFQ09ERV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEluc3RydWN0aW9uIERlY29kaW5nIFN0dWZmICovCi0KLSNkZWZpbmUgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCxyaCxybCkgCWZldGNoX2RlY29kZV9tb2RybSgmbW9kLCZyaCwmcmwpCi0jZGVmaW5lIERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHIpICAgIAlkZWNvZGVfcm1fYnl0ZV9yZWdpc3RlcihyKQotI2RlZmluZSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyKSAgICAJZGVjb2RlX3JtX3dvcmRfcmVnaXN0ZXIocikKLSNkZWZpbmUgREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocikgICAgCWRlY29kZV9ybV9sb25nX3JlZ2lzdGVyKHIpCi0jZGVmaW5lIERFQ09ERV9DTEVBUl9TRUdPVlIoKSAgICAgICAgIAlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX0NMUk1BU0sKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgCQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi12b2lkIAl4ODZlbXVfaW50cl9yYWlzZSAodTggdHlwZSk7Ci12b2lkICAgIGZldGNoX2RlY29kZV9tb2RybSAoaW50ICptb2QsaW50ICpyZWdoLGludCAqcmVnbCk7Ci11OCAgICAgIGZldGNoX2J5dGVfaW1tICh2b2lkKTsKLXUxNiAgICAgZmV0Y2hfd29yZF9pbW0gKHZvaWQpOwotdTMyICAgICBmZXRjaF9sb25nX2ltbSAodm9pZCk7Ci11OCAgICAgIGZldGNoX2RhdGFfYnl0ZSAodWludCBvZmZzZXQpOwotdTggICAgICBmZXRjaF9kYXRhX2J5dGVfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0KTsKLXUxNiAgICAgZmV0Y2hfZGF0YV93b3JkICh1aW50IG9mZnNldCk7Ci11MTYgICAgIGZldGNoX2RhdGFfd29yZF9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQpOwotdTMyICAgICBmZXRjaF9kYXRhX2xvbmcgKHVpbnQgb2Zmc2V0KTsKLXUzMiAgICAgZmV0Y2hfZGF0YV9sb25nX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCk7Ci12b2lkICAgIHN0b3JlX2RhdGFfYnl0ZSAodWludCBvZmZzZXQsIHU4IHZhbCk7Ci12b2lkICAgIHN0b3JlX2RhdGFfYnl0ZV9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHU4IHZhbCk7Ci12b2lkICAgIHN0b3JlX2RhdGFfd29yZCAodWludCBvZmZzZXQsIHUxNiB2YWwpOwotdm9pZCAgICBzdG9yZV9kYXRhX3dvcmRfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0LCB1MTYgdmFsKTsKLXZvaWQgICAgc3RvcmVfZGF0YV9sb25nICh1aW50IG9mZnNldCwgdTMyIHZhbCk7Ci12b2lkICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHUzMiB2YWwpOwotdTgqIAlkZWNvZGVfcm1fYnl0ZV9yZWdpc3RlcihpbnQgcmVnKTsKLXUxNiogCWRlY29kZV9ybV93b3JkX3JlZ2lzdGVyKGludCByZWcpOwotdTMyKiAJZGVjb2RlX3JtX2xvbmdfcmVnaXN0ZXIoaW50IHJlZyk7Ci11MTYqIAlkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKGludCByZWcpOwotdW5zaWduZWQgZGVjb2RlX3JtMDBfYWRkcmVzcyhpbnQgcm0pOwotdW5zaWduZWQgZGVjb2RlX3JtMDFfYWRkcmVzcyhpbnQgcm0pOwotdW5zaWduZWQgZGVjb2RlX3JtMTBfYWRkcmVzcyhpbnQgcm0pOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1g4NkVNVV9ERUNPREVfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9mcHUuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZnB1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjI3MTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9mcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIEZQVSBpbnN0cnVjdGlvbiBkZWNvZGluZy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfRlBVX0gKLSNkZWZpbmUgX19YODZFTVVfRlBVX0gKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgCQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi0vKiB0aGVzZSBoYXZlIHRvIGJlIGRlZmluZWQsIHdoZXRoZXIgODA4NyBzdXBwb3J0IGNvbXBpbGVkIGluIG9yIG5vdC4gKi8KLQotZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOCAodTggb3AxKTsKLWV4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDkgKHU4IG9wMSk7Ci1leHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RhICh1OCBvcDEpOwotZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYiAodTggb3AxKTsKLWV4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGMgKHU4IG9wMSk7Ci1leHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RkICh1OCBvcDEpOwotZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZSAodTggb3AxKTsKLWV4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGYgKHU4IG9wMSk7Ci0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgIAkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgCSovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX0ZQVV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L29wcy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9vcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlYTY3Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L29wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3Igb3BlcmFuZCBkZWNvZGluZyBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX09QU19ICi0jZGVmaW5lIF9fWDg2RU1VX09QU19ICi0KLWV4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiWzB4MTAwXSkodTggb3AxKTsKLWV4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiMlsweDEwMF0pKHU4IG9wMik7Ci0KLSNlbmRpZiAvKiBfX1g4NkVNVV9PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9wcmltX2FzbS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9wcmltX2FzbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDIzY2Y4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvcHJpbV9hc20uaAorKysgL2Rldi9udWxsCkBAIC0xLDk3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlXYXRjb20gQysrIDEwLjYgb3IgbGF0ZXIKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIElubGluZSBhc3NlbWJsZXIgdmVyc2lvbnMgb2YgdGhlIHByaW1pdGl2ZSBvcGVyYW5kCi0qCQkJCWZ1bmN0aW9ucyBmb3IgZmFzdGVyIHBlcmZvcm1hbmNlLiBBdCB0aGUgbW9tZW50IHRoaXMgaXMKLSoJCQkJeDg2IGlubGluZSBhc3NlbWJsZXIsIGJ1dCB0aGVzZSBmdW5jdGlvbnMgY291bGQgYmUgcmVwbGFjZWQKLSoJCQkJd2l0aCBuYXRpdmUgaW5saW5lIGFzc2VtYmxlciBmb3IgZWFjaCBzdXBwb3J0ZWQgcHJvY2Vzc29yCi0qCQkJCXBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZglfX1g4NkVNVV9QUklNX0FTTV9ICi0jZGVmaW5lCV9fWDg2RU1VX1BSSU1fQVNNX0gKLQotI2lmZGVmCV9fV0FUQ09NQ19fCi0KLSNpZm5kZWYJVkFMSURBVEUKLSNkZWZpbmUJX19IQVZFX0lOTElORV9BU1NFTUJMRVJfXwotI2VuZGlmCi0KLXUzMgkJZ2V0X2ZsYWdzX2FzbSh2b2lkKTsKLSNwcmFnbWEgYXV4IGdldF9mbGFnc19hc20gPQkJCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCWVheCIgICAgICAgICAgICAgICAgICAJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4XTsKLQotdTE2ICAgICBhYWFfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7Ci0jcHJhZ21hIGF1eCBhYWFfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWFhIiAgICAgICAgICAgICAgICAgIAkJCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSAJCQkJXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXhdOwotCi11MTYgICAgIGFhc193b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKLSNwcmFnbWEgYXV4IGFhc193b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhYXMiICAgICAgICAgICAgICAgICAgCQkJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIAkJCQlcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheF07Ci0KLXUxNiAgICAgYWFkX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOwotI3ByYWdtYSBhdXggYWFkX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFhZCIgICAgICAgICAgICAgICAgICAJCQlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gCQkJCVwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4XTsKLQotdTE2ICAgICBhYW1fd29yZF9hc20odTMyICpmbGFncyx1OCBkKTsKLSNwcmFnbWEgYXV4IGFhbV93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhYW0iICAgICAgICAgICAgICAgICAgCQkJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIAkJCQlcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheF07Ci0KLXU4ICAgICAgYWRjX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBhZGNfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWRjCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi11MTYgICAgIGFkY193b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCBhZGNfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWRjCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi11MzIgICAgIGFkY19sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCBhZGNfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWRjCWVheCxlYngiICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXU4ICAgICAgYWRkX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBhZGRfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWRkCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi11MTYgICAgIGFkZF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCBhZGRfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWRkCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi11MzIgICAgIGFkZF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCBhZGRfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWRkCWVheCxlYngiICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXU4ICAgICAgYW5kX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBhbmRfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYW5kCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi11MTYgICAgIGFuZF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCBhbmRfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYW5kCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi11MzIgICAgIGFuZF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCBhbmRfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYW5kCWVheCxlYngiICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXU4ICAgICAgY21wX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBjbXBfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiY21wCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi11MTYgICAgIGNtcF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCBjbXBfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiY21wCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi11MzIgICAgIGNtcF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCBjbXBfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiY21wCWVheCxlYngiICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXU4ICAgICAgZGFhX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCk7Ci0jcHJhZ21hIGF1eCBkYWFfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiZGFhIiAgICAgICAgICAgICAgICAgIAkJCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgIAkJXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWxdOwotCi11OCAgICAgIGRhc19ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQpOwotI3ByYWdtYSBhdXggZGFzX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImRhcyIgICAgICAgICAgICAgICAgICAJCQlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsXTsKLQotdTggICAgICBkZWNfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkKTsKLSNwcmFnbWEgYXV4IGRlY19ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJkZWMJYWwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgIAkJXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWxdOwotCi11MTYgICAgIGRlY193b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKLSNwcmFnbWEgYXV4IGRlY193b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJkZWMJYXgiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgIAkJXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXhdOwotCi11MzIgICAgIGRlY19sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkKTsKLSNwcmFnbWEgYXV4IGRlY19sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJkZWMJZWF4IiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAJCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheF07Ci0KLXU4ICAgICAgaW5jX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCk7Ci0jcHJhZ21hIGF1eCBpbmNfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaW5jCWFsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsXTsKLQotdTE2ICAgICBpbmNfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7Ci0jcHJhZ21hIGF1eCBpbmNfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaW5jCWF4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4XTsKLQotdTMyICAgICBpbmNfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCk7Ci0jcHJhZ21hIGF1eCBpbmNfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaW5jCWVheCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgCQlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXhdOwotCi11OCAgICAgIG9yX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBvcl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJvcglhbCxibCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXUxNiAgICAgb3Jfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggb3Jfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkib3IJYXgsYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi11MzIgICAgIG9yX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IG9yX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm9yCWVheCxlYngiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi11OCAgICAgIG5lZ19ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQpOwotI3ByYWdtYSBhdXggbmVnX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm5lZwlhbCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbF07Ci0KLXUxNiAgICAgbmVnX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOwotI3ByYWdtYSBhdXggbmVnX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm5lZwlheCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheF07Ci0KLXUzMiAgICAgbmVnX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQpOwotI3ByYWdtYSBhdXggbmVnX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm5lZwllYXgiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdICAgICAgICAgIAkJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4XTsKLQotdTggICAgICBub3RfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkKTsKLSNwcmFnbWEgYXV4IG5vdF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJub3QJYWwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgIAkJXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWxdOwotCi11MTYgICAgIG5vdF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKLSNwcmFnbWEgYXV4IG5vdF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJub3QJYXgiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgIAkJXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXhdOwotCi11MzIgICAgIG5vdF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkKTsKLSNwcmFnbWEgYXV4IG5vdF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJub3QJZWF4IiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAJCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheF07Ci0KLXU4ICAgICAgcmNsX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByY2xfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicmNsCWFsLGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgY2xdOwotCi11MTYgICAgIHJjbF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJjbF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyY2wJYXgsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBjbF07Ci0KLXUzMiAgICAgcmNsX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcmNsX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJjbAllYXgsY2wiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBjbF07Ci0KLXU4ICAgICAgcmNyX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByY3JfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicmNyCWFsLGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgY2xdOwotCi11MTYgICAgIHJjcl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJjcl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyY3IJYXgsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBjbF07Ci0KLXUzMiAgICAgcmNyX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcmNyX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJjcgllYXgsY2wiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBjbF07Ci0KLXU4ICAgICAgcm9sX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByb2xfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicm9sCWFsLGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgY2xdOwotCi11MTYgICAgIHJvbF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJvbF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyb2wJYXgsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBjbF07Ci0KLXUzMiAgICAgcm9sX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcm9sX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJvbAllYXgsY2wiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBjbF07Ci0KLXU4ICAgICAgcm9yX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByb3JfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicm9yCWFsLGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgY2xdOwotCi11MTYgICAgIHJvcl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJvcl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyb3IJYXgsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBjbF07Ci0KLXUzMiAgICAgcm9yX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcm9yX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJvcgllYXgsY2wiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBjbF07Ci0KLXU4ICAgICAgc2hsX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaGxfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hsCWFsLGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgY2xdOwotCi11MTYgICAgIHNobF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNobF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaGwJYXgsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBjbF07Ci0KLXUzMiAgICAgc2hsX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hsX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNobAllYXgsY2wiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBjbF07Ci0KLXU4ICAgICAgc2hyX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaHJfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hyCWFsLGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgY2xdOwotCi11MTYgICAgIHNocl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNocl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaHIJYXgsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBjbF07Ci0KLXUzMiAgICAgc2hyX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hyX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNocgllYXgsY2wiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBjbF07Ci0KLXU4ICAgICAgc2FyX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzYXJfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2FyCWFsLGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgY2xdOwotCi11MTYgICAgIHNhcl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNhcl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzYXIJYXgsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBjbF07Ci0KLXUzMiAgICAgc2FyX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2FyX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNhcgllYXgsY2wiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBjbF07Ci0KLXUxNgkJc2hsZF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaGxkX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNobGQJYXgsZHgsY2wiICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtkeF0gW2NsXSAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBkeCBjbF07Ci0KLXUzMiAgICAgc2hsZF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaGxkX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNobGQJZWF4LGVkeCxjbCIgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWR4XSBbY2xdICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWR4IGNsXTsKLQotdTE2CQlzaHJkX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBmaWxsLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNocmRfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hyZAlheCxkeCxjbCIgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2R4XSBbY2xdICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGR4IGNsXTsKLQotdTMyICAgICBzaHJkX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNocmRfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hyZAllYXgsZWR4LGNsIiAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlZHhdIFtjbF0gICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlZHggY2xdOwotCi11OCAgICAgIHNiYl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2JiX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNiYglhbCxibCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdTE2ICAgICBzYmJfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggc2JiX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNiYglheCxieCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdTMyICAgICBzYmJfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggc2JiX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNiYgllYXgsZWJ4IiAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi11OCAgICAgIHN1Yl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc3ViX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInN1YglhbCxibCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdTE2ICAgICBzdWJfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggc3ViX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInN1YglheCxieCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdTMyICAgICBzdWJfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggc3ViX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInN1YgllYXgsZWJ4IiAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi12b2lkCXRlc3RfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHRlc3RfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkidGVzdAlhbCxibCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdm9pZAl0ZXN0X3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IHRlc3Rfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkidGVzdAlheCxieCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdm9pZAl0ZXN0X2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IHRlc3RfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkidGVzdAllYXgsZWJ4IiAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi11OCAgICAgIHhvcl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggeG9yX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInhvcglhbCxibCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdTE2ICAgICB4b3Jfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggeG9yX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInhvcglheCxieCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdTMyICAgICB4b3JfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggeG9yX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInhvcgllYXgsZWJ4IiAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi12b2lkICAgIGltdWxfYnl0ZV9hc20odTMyICpmbGFncyx1MTYgKmF4LHU4IGQsdTggcyk7Ci0jcHJhZ21hIGF1eCBpbXVsX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImltdWwJYmwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sYXgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFthbF0gW2JsXSAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VzaSBheCBibF07Ci0KLXZvaWQgICAgaW11bF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTE2ICpkeCx1MTYgZCx1MTYgcyk7Ci0jcHJhZ21hIGF1eCBpbXVsX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImltdWwJYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sYXgiCQkJCVwKLQkibW92CVtlY3hdLGR4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtieF1cCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGJ4IGR4XTsKLQotdm9pZCAgICBpbXVsX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyICplYXgsdTMyICplZHgsdTMyIGQsdTMyIHMpOwotI3ByYWdtYSBhdXggaW11bF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpbXVsCWVieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxlYXgiCQkJCVwKLQkibW92CVtlY3hdLGVkeCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VieF0gXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWJ4IGVkeF07Ci0KLXZvaWQgICAgbXVsX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTE2ICpheCx1OCBkLHU4IHMpOwotI3ByYWdtYSBhdXggbXVsX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm11bAlibCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxheCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2FsXSBbYmxdICAgICAgXAotCW1vZGlmeSBleGFjdCBbZXNpIGF4IGJsXTsKLQotdm9pZCAgICBtdWxfd29yZF9hc20odTMyICpmbGFncyx1MTYgKmF4LHUxNiAqZHgsdTE2IGQsdTE2IHMpOwotI3ByYWdtYSBhdXggbXVsX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm11bAlieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxheCIJCQkJXAotCSJtb3YJW2VjeF0sZHgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2J4XVwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYnggZHhdOwotCi12b2lkICAgIG11bF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiAqZWF4LHUzMiAqZWR4LHUzMiBkLHUzMiBzKTsKLSNwcmFnbWEgYXV4IG11bF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJtdWwJZWJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGVheCIJCQkJXAotCSJtb3YJW2VjeF0sZWR4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbZWF4XSBbZWJ4XSBcCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlYnggZWR4XTsKLQotdm9pZAlpZGl2X2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggKmFsLHU4ICphaCx1MTYgZCx1OCBzKTsKLSNwcmFnbWEgYXV4IGlkaXZfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaWRpdglibCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxhbCIJCQkJXAotCSJtb3YJW2VjeF0sYWgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2JsXVwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYmxdOwotCi12b2lkCWlkaXZfd29yZF9hc20odTMyICpmbGFncyx1MTYgKmF4LHUxNiAqZHgsdTE2IGRsbyx1MTYgZGhpLHUxNiBzKTsKLSNwcmFnbWEgYXV4IGlkaXZfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaWRpdglieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxheCIJCQkJXAotCSJtb3YJW2VjeF0sZHgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2R4XSBbYnhdXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBkeCBieF07Ci0KLXZvaWQJaWRpdl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiAqZWF4LHUzMiAqZWR4LHUzMiBkbG8sdTMyIGRoaSx1MzIgcyk7Ci0jcHJhZ21hIGF1eCBpZGl2X2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImlkaXYJZWJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGVheCIJCQkJXAotCSJtb3YJW2VjeF0sZWR4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbZWF4XSBbZWR4XSBbZWJ4XVwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgZWF4IGVkeCBlYnhdOwotCi12b2lkCWRpdl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4ICphbCx1OCAqYWgsdTE2IGQsdTggcyk7Ci0jcHJhZ21hIGF1eCBkaXZfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiZGl2CWJsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGFsIgkJCQlcCi0JIm1vdglbZWN4XSxhaCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYmxdXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBibF07Ci0KLXZvaWQJZGl2X3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2ICpheCx1MTYgKmR4LHUxNiBkbG8sdTE2IGRoaSx1MTYgcyk7Ci0jcHJhZ21hIGF1eCBkaXZfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiZGl2CWJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGF4IgkJCQlcCi0JIm1vdglbZWN4XSxkeCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbZHhdIFtieF1cCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGR4IGJ4XTsKLQotdm9pZAlkaXZfbG9uZ19hc20odTMyICpmbGFncyx1MzIgKmVheCx1MzIgKmVkeCx1MzIgZGxvLHUzMiBkaGksdTMyIHMpOwotI3ByYWdtYSBhdXggZGl2X2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImRpdgllYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sZWF4IgkJCQlcCi0JIm1vdglbZWN4XSxlZHgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlZHhdIFtlYnhdXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWR4IGVieF07Ci0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfUFJJTV9BU01fSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9wcmltX29wcy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9wcmltX29wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjMzZmUxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvcHJpbV9vcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBwcmltaXRpdmUgb3BlcmF0aW9uIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfUFJJTV9PUFNfSAotI2RlZmluZSBfX1g4NkVNVV9QUklNX09QU19ICi0KLSNpbmNsdWRlICJ4ODZlbXUvcHJpbV9hc20uaCIKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgCQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi11MTYgICAgIGFhYV93b3JkICh1MTYgZCk7Ci11MTYgICAgIGFhc193b3JkICh1MTYgZCk7Ci11MTYgICAgIGFhZF93b3JkICh1MTYgZCk7Ci11MTYgICAgIGFhbV93b3JkICh1OCBkKTsKLXU4ICAgICAgYWRjX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBhZGNfd29yZCAodTE2IGQsIHUxNiBzKTsKLXUzMiAgICAgYWRjX2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci11OCAgICAgIGFkZF9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgYWRkX3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci11MzIgICAgIGFkZF9sb25nICh1MzIgZCwgdTMyIHMpOwotdTggICAgICBhbmRfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIGFuZF93b3JkICh1MTYgZCwgdTE2IHMpOwotdTMyICAgICBhbmRfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXU4ICAgICAgY21wX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBjbXBfd29yZCAodTE2IGQsIHUxNiBzKTsKLXUzMiAgICAgY21wX2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci11OCAgICAgIGRhYV9ieXRlICh1OCBkKTsKLXU4ICAgICAgZGFzX2J5dGUgKHU4IGQpOwotdTggICAgICBkZWNfYnl0ZSAodTggZCk7Ci11MTYgICAgIGRlY193b3JkICh1MTYgZCk7Ci11MzIgICAgIGRlY19sb25nICh1MzIgZCk7Ci11OCAgICAgIGluY19ieXRlICh1OCBkKTsKLXUxNiAgICAgaW5jX3dvcmQgKHUxNiBkKTsKLXUzMiAgICAgaW5jX2xvbmcgKHUzMiBkKTsKLXU4ICAgICAgb3JfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIG9yX3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci11MzIgICAgIG9yX2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci11OCAgICAgIG5lZ19ieXRlICh1OCBzKTsKLXUxNiAgICAgbmVnX3dvcmQgKHUxNiBzKTsKLXUzMiAgICAgbmVnX2xvbmcgKHUzMiBzKTsKLXU4ICAgICAgbm90X2J5dGUgKHU4IHMpOwotdTE2ICAgICBub3Rfd29yZCAodTE2IHMpOwotdTMyICAgICBub3RfbG9uZyAodTMyIHMpOwotdTggICAgICByY2xfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHJjbF93b3JkICh1MTYgZCwgdTggcyk7Ci11MzIgICAgIHJjbF9sb25nICh1MzIgZCwgdTggcyk7Ci11OCAgICAgIHJjcl9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgcmNyX3dvcmQgKHUxNiBkLCB1OCBzKTsKLXUzMiAgICAgcmNyX2xvbmcgKHUzMiBkLCB1OCBzKTsKLXU4ICAgICAgcm9sX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICByb2xfd29yZCAodTE2IGQsIHU4IHMpOwotdTMyICAgICByb2xfbG9uZyAodTMyIGQsIHU4IHMpOwotdTggICAgICByb3JfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHJvcl93b3JkICh1MTYgZCwgdTggcyk7Ci11MzIgICAgIHJvcl9sb25nICh1MzIgZCwgdTggcyk7Ci11OCAgICAgIHNobF9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgc2hsX3dvcmQgKHUxNiBkLCB1OCBzKTsKLXUzMiAgICAgc2hsX2xvbmcgKHUzMiBkLCB1OCBzKTsKLXU4ICAgICAgc2hyX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBzaHJfd29yZCAodTE2IGQsIHU4IHMpOwotdTMyICAgICBzaHJfbG9uZyAodTMyIGQsIHU4IHMpOwotdTggICAgICBzYXJfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHNhcl93b3JkICh1MTYgZCwgdTggcyk7Ci11MzIgICAgIHNhcl9sb25nICh1MzIgZCwgdTggcyk7Ci11MTYgICAgIHNobGRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKTsKLXUzMiAgICAgc2hsZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpOwotdTE2ICAgICBzaHJkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7Ci11MzIgICAgIHNocmRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKLXU4ICAgICAgc2JiX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBzYmJfd29yZCAodTE2IGQsIHUxNiBzKTsKLXUzMiAgICAgc2JiX2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci11OCAgICAgIHN1Yl9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgc3ViX3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci11MzIgICAgIHN1Yl9sb25nICh1MzIgZCwgdTMyIHMpOwotdm9pZCAgICB0ZXN0X2J5dGUgKHU4IGQsIHU4IHMpOwotdm9pZCAgICB0ZXN0X3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci12b2lkICAgIHRlc3RfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXU4ICAgICAgeG9yX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICB4b3Jfd29yZCAodTE2IGQsIHUxNiBzKTsKLXUzMiAgICAgeG9yX2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci12b2lkICAgIGltdWxfYnl0ZSAodTggcyk7Ci12b2lkICAgIGltdWxfd29yZCAodTE2IHMpOwotdm9pZCAgICBpbXVsX2xvbmcgKHUzMiBzKTsKLXZvaWQgCWltdWxfbG9uZ19kaXJlY3QodTMyICpyZXNfbG8sIHUzMiogcmVzX2hpLHUzMiBkLCB1MzIgcyk7Ci12b2lkICAgIG11bF9ieXRlICh1OCBzKTsKLXZvaWQgICAgbXVsX3dvcmQgKHUxNiBzKTsKLXZvaWQgICAgbXVsX2xvbmcgKHUzMiBzKTsKLXZvaWQgICAgaWRpdl9ieXRlICh1OCBzKTsKLXZvaWQgICAgaWRpdl93b3JkICh1MTYgcyk7Ci12b2lkICAgIGlkaXZfbG9uZyAodTMyIHMpOwotdm9pZCAgICBkaXZfYnl0ZSAodTggcyk7Ci12b2lkICAgIGRpdl93b3JkICh1MTYgcyk7Ci12b2lkICAgIGRpdl9sb25nICh1MzIgcyk7Ci12b2lkICAgIGlucyAoaW50IHNpemUpOwotdm9pZCAgICBvdXRzIChpbnQgc2l6ZSk7Ci11MTYgICAgIG1lbV9hY2Nlc3Nfd29yZCAoaW50IGFkZHIpOwotdm9pZCAgICBwdXNoX3dvcmQgKHUxNiB3KTsKLXZvaWQgICAgcHVzaF9sb25nICh1MzIgdyk7Ci11MTYgICAgIHBvcF93b3JkICh2b2lkKTsKLXUzMgkJcG9wX2xvbmcgKHZvaWQpOwotCi0jaWYgIGRlZmluZWQoX19IQVZFX0lOTElORV9BU1NFTUJMRVJfXykgJiYgIWRlZmluZWQoUFJJTV9PUFNfTk9fUkVERUZJTkVfQVNNKQotCi0jZGVmaW5lCWFhYV93b3JkKGQpCQlhYWFfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBhYXNfd29yZChkKQkJYWFzX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgYWFkX3dvcmQoZCkJCWFhZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGFhbV93b3JkKGQpCQlhYW1fd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBhZGNfYnl0ZShkLHMpCWFkY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgYWRjX3dvcmQoZCxzKQlhZGNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGFkY19sb25nKGQscykJYWRjX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBhZGRfYnl0ZShkLHMpIAlhZGRfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGFkZF93b3JkKGQscykJYWRkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBhZGRfbG9uZyhkLHMpCWFkZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgYW5kX2J5dGUoZCxzKQlhbmRfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGFuZF93b3JkKGQscykJYW5kX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBhbmRfbG9uZyhkLHMpCWFuZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgY21wX2J5dGUoZCxzKQljbXBfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGNtcF93b3JkKGQscykJY21wX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBjbXBfbG9uZyhkLHMpCWNtcF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgZGFhX2J5dGUoZCkJCWRhYV9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGRhc19ieXRlKGQpCQlkYXNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBkZWNfYnl0ZShkKQkJZGVjX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgZGVjX3dvcmQoZCkJCWRlY193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGRlY19sb25nKGQpCQlkZWNfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBpbmNfYnl0ZShkKQkJaW5jX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgaW5jX3dvcmQoZCkJCWluY193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGluY19sb25nKGQpCQlpbmNfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBvcl9ieXRlKGQscykJb3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIG9yX3dvcmQoZCxzKQlvcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgb3JfbG9uZyhkLHMpCW9yX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBuZWdfYnl0ZShzKQkJbmVnX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcscykKLSNkZWZpbmUgbmVnX3dvcmQocykJCW5lZ193b3JkX2FzbSgmTS54ODYuUl9FRkxHLHMpCi0jZGVmaW5lIG5lZ19sb25nKHMpCQluZWdfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxzKQotI2RlZmluZSBub3RfYnl0ZShzKQkJbm90X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcscykKLSNkZWZpbmUgbm90X3dvcmQocykJCW5vdF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLHMpCi0jZGVmaW5lIG5vdF9sb25nKHMpCQlub3RfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxzKQotI2RlZmluZSByY2xfYnl0ZShkLHMpCXJjbF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcmNsX3dvcmQoZCxzKQlyY2xfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJjbF9sb25nKGQscykJcmNsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByY3JfYnl0ZShkLHMpCXJjcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcmNyX3dvcmQoZCxzKQlyY3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJjcl9sb25nKGQscykJcmNyX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByb2xfYnl0ZShkLHMpCXJvbF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcm9sX3dvcmQoZCxzKQlyb2xfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJvbF9sb25nKGQscykJcm9sX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByb3JfYnl0ZShkLHMpCXJvcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcm9yX3dvcmQoZCxzKQlyb3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJvcl9sb25nKGQscykJcm9yX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzaGxfYnl0ZShkLHMpCXNobF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2hsX3dvcmQoZCxzKQlzaGxfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNobF9sb25nKGQscykJc2hsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzaHJfYnl0ZShkLHMpCXNocl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2hyX3dvcmQoZCxzKQlzaHJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNocl9sb25nKGQscykJc2hyX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzYXJfYnl0ZShkLHMpCXNhcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2FyX3dvcmQoZCxzKQlzYXJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNhcl9sb25nKGQscykJc2FyX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzaGxkX3dvcmQoZCxmaWxsLHMpCXNobGRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscykKLSNkZWZpbmUgc2hsZF9sb25nKGQsZmlsbCxzKQlzaGxkX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpCi0jZGVmaW5lIHNocmRfd29yZChkLGZpbGwscykJc2hyZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKQotI2RlZmluZSBzaHJkX2xvbmcoZCxmaWxsLHMpCXNocmRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscykKLSNkZWZpbmUgc2JiX2J5dGUoZCxzKQlzYmJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNiYl93b3JkKGQscykJc2JiX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzYmJfbG9uZyhkLHMpCXNiYl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc3ViX2J5dGUoZCxzKQlzdWJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHN1Yl93b3JkKGQscykJc3ViX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzdWJfbG9uZyhkLHMpCXN1Yl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgdGVzdF9ieXRlKGQscykJdGVzdF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgdGVzdF93b3JkKGQscykJdGVzdF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgdGVzdF9sb25nKGQscykJdGVzdF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgeG9yX2J5dGUoZCxzKQl4b3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHhvcl93b3JkKGQscykJeG9yX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSB4b3JfbG9uZyhkLHMpCXhvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgaW11bF9ieXRlKHMpCWltdWxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCxNLng4Ni5SX0FMLHMpCi0jZGVmaW5lIGltdWxfd29yZChzKQlpbXVsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxzKQotI2RlZmluZSBpbXVsX2xvbmcocykJaW11bF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscykKLSNkZWZpbmUgaW11bF9sb25nX2RpcmVjdChyZXNfbG8scmVzX2hpLGQscykJaW11bF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLHJlc19sbyxyZXNfaGksZCxzKQotI2RlZmluZSBtdWxfYnl0ZShzKQkJbXVsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsTS54ODYuUl9BTCxzKQotI2RlZmluZSBtdWxfd29yZChzKQkJbXVsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxzKQotI2RlZmluZSBtdWxfbG9uZyhzKQkJbXVsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxzKQotI2RlZmluZSBpZGl2X2J5dGUocykJaWRpdl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FMLCZNLng4Ni5SX0FILE0ueDg2LlJfQVgscykKLSNkZWZpbmUgaWRpdl93b3JkKHMpCWlkaXZfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLE0ueDg2LlJfRFgscykKLSNkZWZpbmUgaWRpdl9sb25nKHMpCWlkaXZfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLE0ueDg2LlJfRURYLHMpCi0jZGVmaW5lIGRpdl9ieXRlKHMpCQlkaXZfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BTCwmTS54ODYuUl9BSCxNLng4Ni5SX0FYLHMpCi0jZGVmaW5lIGRpdl93b3JkKHMpCQlkaXZfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLE0ueDg2LlJfRFgscykKLSNkZWZpbmUgZGl2X2xvbmcocykJCWRpdl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgsTS54ODYuUl9FRFgscykKLQotI2VuZGlmCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgIAkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgCSovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX1BSSU1fT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUveDg2ZW11aS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS94ODZlbXVpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjQ5MDMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS94ODZlbXVpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBzeXN0ZW0gc3BlY2lmaWMgZnVuY3Rpb25zLiBUaGVzZSBmdW5jdGlvbnMKLSoJCQkJYXJlIGFsd2F5cyBjb21waWxlZCBhbmQgbGlua2VkIGluIHRoZSBPUyBkZXBlZGVudCBsaWJyYXJpZXMsCi0qCQkJCWFuZCBuZXZlciBpbiBhIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX1g4NkVNVUlfSAotI2RlZmluZSBfX1g4NkVNVV9YODZFTVVJX0gKLQotLyogSWYgd2UgYXJlIGNvbXBpbGluZyBpbiBDKysgbW9kZSwgd2UgY2FuIGNvbXBpbGUgc29tZSBmdW5jdGlvbnMgYXMKLSAqIGlubGluZSB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZSAoaG93ZXZlciB0aGUgY29kZSBzaXplIGluY3JlYXNlcyBxdWl0ZQotICogZHJhbWF0aWNhbGx5IGluIHRoaXMgY2FzZSkuCi0gKi8KLQotI2lmCWRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKF9OT19JTkxJTkUpCi0jZGVmaW5lCV9JTkxJTkUJaW5saW5lCi0jZWxzZQotI2RlZmluZQlfSU5MSU5FIHN0YXRpYwotI2VuZGlmCi0KLS8qIEdldCByaWQgb2YgdW51c2VkIHBhcmFtZXRlcnMgaW4gQysrIGNvbXBpbGF0aW9uIG1vZGUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lCVg4NkVNVV9VTlVTRUQodikKLSNlbHNlCi0jZGVmaW5lCVg4NkVNVV9VTlVTRUQodikJdgotI2VuZGlmCi0KLSNpbmNsdWRlICJ4ODZlbXUuaCIKLSNpbmNsdWRlICJ4ODZlbXUvcmVncy5oIgotI2luY2x1ZGUgIng4NmVtdS9kZWJ1Zy5oIgotI2luY2x1ZGUgIng4NmVtdS9kZWNvZGUuaCIKLSNpbmNsdWRlICJ4ODZlbXUvb3BzLmgiCi0jaW5jbHVkZSAieDg2ZW11L3ByaW1fb3BzLmgiCi0jaW5jbHVkZSAieDg2ZW11L2ZwdS5oIgotI2luY2x1ZGUgIng4NmVtdS9mcHVfcmVncy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElubGluZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgIAkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotZXh0ZXJuIHU4ICAJKFg4NkFQSVAgc3lzX3JkYikodTMyIGFkZHIpOwotZXh0ZXJuIHUxNiAJKFg4NkFQSVAgc3lzX3JkdykodTMyIGFkZHIpOwotZXh0ZXJuIHUzMiAJKFg4NkFQSVAgc3lzX3JkbCkodTMyIGFkZHIpOwotZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX3dyYikodTMyIGFkZHIsdTggdmFsKTsKLWV4dGVybiB2b2lkIChYODZBUElQIHN5c193cncpKHUzMiBhZGRyLHUxNiB2YWwpOwotZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX3dybCkodTMyIGFkZHIsdTMyIHZhbCk7Ci0KLWV4dGVybiB1OCAgCShYODZBUElQIHN5c19pbmIpKFg4NkVNVV9waW9BZGRyIGFkZHIpOwotZXh0ZXJuIHUxNiAJKFg4NkFQSVAgc3lzX2ludykoWDg2RU1VX3Bpb0FkZHIgYWRkcik7Ci1leHRlcm4gdTMyIAkoWDg2QVBJUCBzeXNfaW5sKShYODZFTVVfcGlvQWRkciBhZGRyKTsKLWV4dGVybiB2b2lkIChYODZBUElQIHN5c19vdXRiKShYODZFTVVfcGlvQWRkciBhZGRyLHU4IHZhbCk7Ci1leHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfb3V0dykoWDg2RU1VX3Bpb0FkZHIgYWRkcix1MTYgdmFsKTsKLWV4dGVybiB2b2lkCShYODZBUElQIHN5c19vdXRsKShYODZFTVVfcGlvQWRkciBhZGRyLHUzMiB2YWwpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1g4NkVNVV9YODZFTVVJX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3g4NmludGVyZmFjZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IveDg2aW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOWNiM2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IveDg2aW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MTQgKzAsMCBAQAotI2luY2x1ZGUgIng4NmVtdS5oIgotI2luY2x1ZGUgImdsdWUuaCIKLQotCi0vKgotICogVGhpcyBpc24ndCBuaWNlLCBidXQgdGhlcmUgYXJlIGEgbG90IG9mIGluY29tcGF0aWJpbGl0aWVzIGluIHRoZSBVLUJvb3QgYW5kIHNjaXRlY2ggaW5jbHVkZQotICogZmlsZXMgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHJlYWxseSB3b3JrYWJsZSBzb2x1dGlvbi4KLSAqIE1pZ2h0IGJlIGNsZWFuZWQgb3V0IGxhdGVyLgotICovCi0KLSNpZmRlZiBERUJVRwotI3VuZGVmIERFQlVHCi0jZW5kaWYKLQotI3VuZGVmIElPX0xPR0dJTkcKLSN1bmRlZiBNRU1fTE9HR0lORwotCi0jaWZkZWYgSU9fTE9HR0lORwotI2RlZmluZSBMT0dJTyhwb3J0LCBmb3JtYXQsIGFyZ3MuLi4pIGlmIChkb2xvZyhwb3J0KSkgX3ByaW50Zihmb3JtYXQgLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgTE9HSU8ocG9ydCwgZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLSNpZmRlZiBNRU1fTE9HR0lOCi0jZGVmaW5lIExPR01FTShmb3JtYXQsIGFyZ3MuLi4pIF9wcmludGYoZm9ybWF0ICwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIExPR01FTShmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIFBSSU5URihmb3JtYXQsIGFyZ3MuLi4pIF9wcmludGYoZm9ybWF0ICwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIFBSSU5URihmb3JtYXQsIGFyZ2MuLi4pCi0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVCWVRFOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVV09SRDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKLQotdHlwZWRlZiBjaGFyIEJZVEU7Ci10eXBlZGVmIHNob3J0IFdPUlQ7Ci10eXBlZGVmIGxvbmcgTE9ORzsKLQotI2RlZmluZSBFTVVMQVRPUl9NRU1fU0laRSAgICAgICAoMTAyNCoxMDI0KQotI2RlZmluZSBFTVVMQVRPUl9CSU9TX09GRlNFVCAgICAweEMwMDAwCi0jZGVmaW5lIEVNVUxBVE9SX1NUUkFQX09GRlNFVCAgIDB4MzAwMDAKLSNkZWZpbmUgRU1VTEFUT1JfU1RBQ0tfT0ZGU0VUICAgMHgyMDAwMAotI2RlZmluZSBFTVVMQVRPUl9MT0dPX09GRlNFVCAgICAweDQwMDAwIC8qIElmIHlvdSBjaGFuZ2UgdGhpcywgY2hhbmdlIHRoZSBzdHJhcCBjb2RlLCB0b28gKi8KLSNkZWZpbmUgVklERU9fQkFTRSAodm9pZCAqKTB4RkQwQjgwMDAKLQotZXh0ZXJuIGNoYXIgKmdldGVudihjaGFyICopOwotZXh0ZXJuIGludCB0c3RjKHZvaWQpOwotZXh0ZXJuIGludCBnZXRjKHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdmlkZW9fZ2V0X2F0dHIodm9pZCk7Ci0KLWludCBhdG9pKGNoYXIgKnN0cmluZykKLXsKLSAgICBpbnQgcmVzID0gMDsKLSAgICB3aGlsZSAoKnN0cmluZz49JzAnICYmICpzdHJpbmcgPD0nOScpCi0gICAgewotCXJlcyAqPSAxMDsKLQlyZXMgKz0gKnN0cmluZy0nMCc7Ci0Jc3RyaW5nKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBjb25zX2dldHMoY2hhciAqYnVmZmVyKQotewotICAgIGludCBpID0gMDsKLSAgICBjaGFyIGMgPSAwOwotCi0gICAgYnVmZmVyWzBdID0gMDsKLSAgICBpZiAoZ2V0ZW52KCJ4ODZfcnVudGhydSIpKSByZXR1cm47IC8qRklYTUU6ICovCi0gICAgd2hpbGUgKGMgIT0gMHgwRCAmJiBjICE9IDB4MEEpCi0gICAgewotCXdoaWxlICghdHN0YygpKTsKLQljID0gZ2V0YygpOwotCWlmIChjPj0zMiAmJiBjIDwgMTI3KQotCXsKLQkgICAgYnVmZmVyW2ldID0gYzsKLQkgICAgaSsrOwotCSAgICBidWZmZXJbaV0gPSAwOwotCSAgICBwdXRjKGMpOwotCX0KLQllbHNlCi0JewotCSAgICBpZiAoYyA9PSAweDA4KQotCSAgICB7Ci0JCWlmIChpPjApIGktLTsKLQkJYnVmZmVyW2ldID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgYnVmZmVyW2ldID0gJ1xuJzsKLSAgICBidWZmZXJbaSsxXSA9IDA7Ci19Ci0KLWNoYXIgKmJpb3NfZGF0ZSA9ICIwOC8xNC8wMiI7Ci1VQllURSBtb2RlbCA9IDB4RkM7Ci1VQllURSBzdWJtb2RlbCA9IDB4MDA7Ci0KLXN0YXRpYyBpbmxpbmUgVUJZVEUgcmVhZF9ieXRlKHZvbGF0aWxlIFVCWVRFKiBmcm9tKQotewotICAgIGludCB4OwotICAgIGFzbSB2b2xhdGlsZSAoImxieiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOwotICAgIHJldHVybiAoVUJZVEUpeDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2J5dGUodm9sYXRpbGUgVUJZVEUgKnRvLCBpbnQgeCkKLXsKLSAgICBhc20gdm9sYXRpbGUgKCJzdGIgJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVVdPUkQgcmVhZF93b3JkX2xpdHRsZSh2b2xhdGlsZSBVV09SRCAqZnJvbSkKLXsKLSAgICBpbnQgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsaGJyeCAlMCwwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVV09SRCl4OwotfQotCi1zdGF0aWMgaW5saW5lIFVXT1JEIHJlYWRfd29yZF9iaWcodm9sYXRpbGUgVVdPUkQgKmZyb20pCi17Ci0gICAgaW50IHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibGh6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVV09SRCl4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd29yZF9saXR0bGUodm9sYXRpbGUgVVdPUkQgKnRvLCBpbnQgeCkKLXsKLSAgICBhc20gdm9sYXRpbGUgKCJzdGhicnggJTEsMCwlMlxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpLCAiciIgKHRvKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93b3JkX2JpZyh2b2xhdGlsZSBVV09SRCAqdG8sIGludCB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0aCAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKLX0KLQotc3RhdGljIGlubGluZSBVTE9ORyByZWFkX2xvbmdfbGl0dGxlKHZvbGF0aWxlIFVMT05HICpmcm9tKQotewotICAgIHVuc2lnbmVkIGxvbmcgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsd2JyeCAlMCwwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIoKmZyb20pKTsKLSAgICByZXR1cm4gKFVMT05HKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVUxPTkcgcmVhZF9sb25nX2JpZyh2b2xhdGlsZSBVTE9ORyAqZnJvbSkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibHd6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVTE9ORyl4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbG9uZ19saXR0bGUodm9sYXRpbGUgVUxPTkcgKnRvLCBVTE9ORyB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0d2JyeCAlMSwwLCUyXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCksICJyIiAodG8pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2xvbmdfYmlnKHZvbGF0aWxlIFVMT05HICp0bywgVUxPTkcgeCkKLXsKLSAgICBhc20gdm9sYXRpbGUgKCJzdHcgJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Ci19Ci0KLXN0YXRpYyBpbnQgbG9nX2luaXQgPSAwOwotc3RhdGljIGludCBsb2dfZG8gPSAwOwotc3RhdGljIGludCBsb2dfbG93ID0gMDsKLQotaW50IGRvbG9nKGludCBwb3J0KQotewotICAgIGlmIChsb2dfaW5pdCAmJiBsb2dfZG8pCi0gICAgewotCWlmIChsb2dfbG93ICYmIHBvcnQgPiAweDQwMCkgcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCFsb2dfaW5pdCkKLSAgICB7Ci0JbG9nX2luaXQgPSAxOwotCWxvZ19kbyA9IChnZXRlbnYoIng4Nl9sb2dpbyIpICE9IChjaGFyICopMCk7Ci0JbG9nX2xvdyA9IChnZXRlbnYoIng4Nl9sb2dsb3ciKSAhPSAoY2hhciAqKTApOwotCWlmIChsb2dfZG8pCi0JewotCSAgICBpZiAobG9nX2xvdyAmJiBwb3J0ID4gMHg0MDApIHJldHVybiAwOwotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiBDb252ZXJ0cyBhbiBlbXVsYXRvciBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgYWRkcmVzcy4gKi8KLS8qIEhhbmRsZXMgYWxsIHNwZWNpYWwgY2FzZXMgKGJpb3MgZGF0ZSwgbW9kZWwgZXRjKSwgYW5kIG1pZ2h0IG5lZWQgd29yayAqLwotdTMyIG1lbWFkZHIodTMyIGFkZHIpCi17Ci0vKiAgICBpZiAoYWRkciA+PSAweEYwMDAwICYmIGFkZHIgPCAweEZGRkZGKSBwcmludGYoIldBUk5JTkc6IFNlZ21lbnQgRiBhY2Nlc3MgKDB4JXgpXG4iLCBhZGRyKTsgKi8KLS8qICAgIHByaW50ZigiTWVtQWRkcj0lcFxuIiwgYWRkcik7ICovCi0gICAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDwgMHhDMDAwMCkKLQlyZXR1cm4gMHhGRDAwMDAwMCArIGFkZHI7Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEZGRkY1ICYmIGFkZHIgPCAweEZGRkZFKQotICAgIHsKLQlyZXR1cm4gKHUzMiliaW9zX2RhdGUrYWRkci0weEZGRkY1OwotICAgIH0KLSAgICBlbHNlIGlmIChhZGRyID09IDB4RkZGRkUpCi0JcmV0dXJuICh1MzIpJm1vZGVsOwotICAgIGVsc2UgaWYgKGFkZHIgPT0gMHhGRkZGRikKLQlyZXR1cm4gKHUzMikmc3VibW9kZWw7Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweDgwMDAwMDAwKQotICAgIHsKLQkvKnByaW50ZigiV2FybmluZzogSGlnaCBtZW1vcnkgYWNjZXNzIGF0IDB4JXhcbiIsIGFkZHIpOyAqLwotCXJldHVybiBhZGRyOwotICAgIH0KLSAgICBlbHNlCi0JcmV0dXJuICh1MzIpTS5tZW1fYmFzZSthZGRyOwotfQotCi11OCBBMV9yZGIodTMyIGFkZHIpCi17Ci0gICAgdTggYSA9IHJlYWRfYnl0ZSgoVUJZVEUgKiltZW1hZGRyKGFkZHIpKTsKLSAgICBMT0dNRU0oInJkYjogJXggLT4gJXhcbiIsIGFkZHIsIGEpOwotICAgIHJldHVybiBhOwotfQotCi11MTYgQTFfcmR3KHUzMiBhZGRyKQotewotICAgIHUxNiBhID0gcmVhZF93b3JkX2xpdHRsZSgoVVdPUkQgKiltZW1hZGRyKGFkZHIpKTsKLSAgICBMT0dNRU0oInJkdzogJXggLT4gJXhcbiIsIGFkZHIsIGEpOwotICAgIHJldHVybiBhOwotfQotCi11MzIgQTFfcmRsKHUzMiBhZGRyKQotewotICAgIHUzMiBhID0gcmVhZF9sb25nX2xpdHRsZSgoVUxPTkcgKiltZW1hZGRyKGFkZHIpKTsKLSAgICBMT0dNRU0oInJkbDogJXggLT4gJXhcbiIsIGFkZHIsIGEpOwotICAgIHJldHVybiBhOwotfQotCi12b2lkIEExX3dyYih1MzIgYWRkciwgdTggdmFsKQotewotICAgIExPR01FTSgid3JiOiAleCA8LSAleFxuIiwgYWRkciwgdmFsKTsKLSAgICB3cml0ZV9ieXRlKChVQllURSAqKW1lbWFkZHIoYWRkciksIHZhbCk7Ci19Ci0KLXZvaWQgQTFfd3J3KHUzMiBhZGRyLCB1MTYgdmFsKQotewotICAgIExPR01FTSgid3J3OiAleCA8LSAleFxuIiwgYWRkciwgdmFsKTsKLSAgICB3cml0ZV93b3JkX2xpdHRsZSgoVVdPUkQgKiltZW1hZGRyKGFkZHIpLCB2YWwpOwotfQotCi12b2lkIEExX3dybCh1MzIgYWRkciwgdTMyIHZhbCkKLXsKLSAgICBMT0dNRU0oIndybDogJXggPC0gJXhcbiIsIGFkZHIsIHZhbCk7Ci0gICAgd3JpdGVfbG9uZ19saXR0bGUoKFVMT05HICopbWVtYWRkcihhZGRyKSwgdmFsKTsKLX0KLQotWDg2RU1VX21lbUZ1bmNzIF9BMV9tZW0gPQotewotICAgIEExX3JkYiwKLSAgICBBMV9yZHcsCi0gICAgQTFfcmRsLAotICAgIEExX3dyYiwKLSAgICBBMV93cncsCi0gICAgQTFfd3JsLAotfTsKLQotI2RlZmluZSBBUlRJQ0lBU19QQ0lfQ0ZHQUREUiAgMHhmZWMwMGNmOAotI2RlZmluZSBBUlRJQ0lBU19QQ0lfQ0ZHREFUQSAgMHhmZWUwMGNmYwotI2RlZmluZSBJT0JBU0UgICAgICAgICAgICAgICAgMHhGRTAwMDAwMAotCi0jZGVmaW5lIGluX2J5dGUoZnJvbSkgcmVhZF9ieXRlKCAoVUJZVEUgKilwb3J0X3RvX21lbShmcm9tKSkKLSNkZWZpbmUgaW5fd29yZChmcm9tKSByZWFkX3dvcmRfbGl0dGxlKChVV09SRCAqKXBvcnRfdG9fbWVtKGZyb20pKQotI2RlZmluZSBpbl9sb25nKGZyb20pIHJlYWRfbG9uZ19saXR0bGUoKFVMT05HICopcG9ydF90b19tZW0oZnJvbSkpCi0jZGVmaW5lIG91dF9ieXRlKHRvLCB2YWwpIHdyaXRlX2J5dGUoKFVCWVRFICopcG9ydF90b19tZW0odG8pLCB2YWwpCi0jZGVmaW5lIG91dF93b3JkKHRvLCB2YWwpIHdyaXRlX3dvcmRfbGl0dGxlKChVV09SRCAqKXBvcnRfdG9fbWVtKHRvKSwgdmFsKQotI2RlZmluZSBvdXRfbG9uZyh0bywgdmFsKSB3cml0ZV9sb25nX2xpdHRsZSgoVUxPTkcgKilwb3J0X3RvX21lbSh0byksIHZhbCkKLQotdTMyIHBvcnRfdG9fbWVtKGludCBwb3J0KQotewotICAgIGlmIChwb3J0ID49IDB4Q0ZDICYmIHBvcnQgPD0gMHhDRkYpIHJldHVybiAweEZFRTAwMDAwK3BvcnQ7Ci0gICAgZWxzZSBpZiAocG9ydCA+PSAweENGOCAmJiBwb3J0IDw9IDB4Q0ZCKSByZXR1cm4gMHhGRUMwMDAwMCtwb3J0OwotICAgIGVsc2UgcmV0dXJuIElPQkFTRSArIHBvcnQ7Ci19Ci0KLXU4IEExX2luYihpbnQgcG9ydCkKLXsKLSAgICB1OCBhOwotICAgIC8qaWYgKHBvcnQgPT0gMHgzQkEpIHJldHVybiAwOyAqLwotICAgIGEgPSBpbl9ieXRlKHBvcnQpOwotICAgIExPR0lPKHBvcnQsICJpbmI6ICVYaCAtPiAlZCAoJVhoKVxuIiwgcG9ydCwgYSwgYSk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLXUxNiBBMV9pbncoaW50IHBvcnQpCi17Ci0gICAgdTE2IGEgPSBpbl93b3JkKHBvcnQpOwotICAgIExPR0lPKHBvcnQsICJpbnc6ICVYaCAtPiAlZCAoJVhoKVxuIiwgcG9ydCwgYSwgYSk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLXUzMiBBMV9pbmwoaW50IHBvcnQpCi17Ci0gICAgdTMyIGEgPSBpbl9sb25nKHBvcnQpOwotICAgIExPR0lPKHBvcnQsICJpbmw6ICVYaCAtPiAlZCAoJVhoKVxuIiwgcG9ydCwgYSwgYSk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLXZvaWQgQTFfb3V0YihpbnQgcG9ydCwgdTggdmFsKQotewotICAgIExPR0lPKHBvcnQsICJvdXRiOiAlWGggPC0gJWQgKCVYaClcbiIsIHBvcnQsIHZhbCwgdmFsKTsKLS8qICAgIGlmIChwb3J0ID09IDB4Q0Y4KSBwb3J0ID0gMHhDRkI7Ci0gICAgZWxzZSBpZiAocG9ydCA9PSAweENGOSkgcG9ydCA9IDB4Q0ZBOwotICAgIGVsc2UgaWYgKHBvcnQgPT0gMHhDRkEpIHBvcnQgPSAweENGOTsKLSAgICBlbHNlIGlmIChwb3J0ID09IDB4Q0ZCKSBwb3J0ID0gMHhDRjg7Ki8KLSAgICBvdXRfYnl0ZShwb3J0LCB2YWwpOwotfQotCi12b2lkIEExX291dHcoaW50IHBvcnQsIHUxNiB2YWwpCi17Ci0gICAgTE9HSU8ocG9ydCwgIm91dHc6ICVYaCA8LSAlZCAoJVhoKVxuIiwgcG9ydCwgdmFsLCB2YWwpOwotICAgIG91dF93b3JkKHBvcnQsIHZhbCk7Ci19Ci0KLXZvaWQgQTFfb3V0bChpbnQgcG9ydCwgdTMyIHZhbCkKLXsKLSAgICBMT0dJTyhwb3J0LCAib3V0bDogJVhoIDwtICVkICglWGgpXG4iLCBwb3J0LCB2YWwsIHZhbCk7Ci0gICAgb3V0X2xvbmcocG9ydCwgdmFsKTsKLX0KLQotWDg2RU1VX3Bpb0Z1bmNzIF9BMV9waW8gPQotewotICAgIEExX2luYiwKLSAgICBBMV9pbncsCi0gICAgQTFfaW5sLAotICAgIEExX291dGIsCi0gICAgQTFfb3V0dywKLSAgICBBMV9vdXRsLAotfTsKLQotc3RhdGljIGludCByZWxvY2VkX29wcyA9IDA7Ci0KLXZvaWQgcmVsb2Nfb3BzKHZvaWQgKnJlbG9jX2FkZHIpCi17Ci0gICAgZXh0ZXJuIHZvaWQgKCp4ODZlbXVfb3B0YWJbMjU2XSkodTgpOwotICAgIGV4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiMlsyNTZdKSh1OCk7Ci0gICAgZXh0ZXJuIHZvaWQgdGFibGVzX3JlbG9jYXRlKHVuc2lnbmVkIGludCBvZmZzZXQpOwotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGxvbmcgZGVsdGE7Ci0gICAgaWYgKHJlbG9jZWRfb3BzID09IDEpIHJldHVybjsKLSAgICByZWxvY2VkX29wcyA9IDE7Ci0KLSAgICBkZWx0YSA9IFRFWFRfQkFTRSAtICh1bnNpZ25lZCBsb25nKXJlbG9jX2FkZHI7Ci0KLSAgICBmb3IgKGk9MDsgaTwyNTY7IGkrKykKLSAgICB7Ci0JeDg2ZW11X29wdGFiW2ldIC09IGRlbHRhOwotCXg4NmVtdV9vcHRhYjJbaV0gLT0gZGVsdGE7Ci0gICAgfQotCi0gICAgX0ExX21lbS5yZGIgPSBBMV9yZGI7Ci0gICAgX0ExX21lbS5yZHcgPSBBMV9yZHc7Ci0gICAgX0ExX21lbS5yZGwgPSBBMV9yZGw7Ci0gICAgX0ExX21lbS53cmIgPSBBMV93cmI7Ci0gICAgX0ExX21lbS53cncgPSBBMV93cnc7Ci0gICAgX0ExX21lbS53cmwgPSBBMV93cmw7Ci0KLSAgICBfQTFfcGlvLmluYiA9IEExX2luYjsKLSAgICBfQTFfcGlvLmludyA9IEExX2ludzsKLSAgICBfQTFfcGlvLmlubCA9IEExX2lubDsKLSAgICBfQTFfcGlvLm91dGIgPSBBMV9vdXRiOwotICAgIF9BMV9waW8ub3V0dyA9IEExX291dHc7Ci0gICAgX0ExX3Bpby5vdXRsID0gQTFfb3V0bDsKLQotICAgIHRhYmxlc19yZWxvY2F0ZShkZWx0YSk7Ci0KLX0KLQotCi0jZGVmaW5lIEFOWV9LRVkodGV4dCkJCQkJXAotICAgIHByaW50Zih0ZXh0KTsJCQkJXAotICAgIHdoaWxlICghdHN0YygpKTsKLQotCi11bnNpZ25lZCBjaGFyIG1vcmVfc3RyYXBbXSA9IHsKLQkweGI0LCAweDAsIDB4YjAsIDB4MiwgMHhjZCwgMHgxMCwKLX07Ci0jZGVmaW5lIE1PUkVfU1RSQVBfQllURVMgNiAvKiBBZGRpdGlvbmFsIGJ5dGVzIG9mIHN0cmFwIGNvZGUgKi8KLQotCi11bnNpZ25lZCBjaGFyICpkb25lX21zZz0iVkdBIEluaXRpYWxpemVkXDAiOwotCi1pbnQgZXhlY3V0ZV9iaW9zKHBjaV9kZXZfdCBncl9kZXYsIHZvaWQgKnJlbG9jX2FkZHIpCi17Ci0gICAgZXh0ZXJuIHZvaWQgYmlvc19pbml0KHZvaWQpOwotICAgIGV4dGVybiB2b2lkIHJlbW92ZV9pbml0X2RhdGEodm9pZCk7Ci0gICAgZXh0ZXJuIGludCB2aWRlb19yb3dzKHZvaWQpOwotICAgIGV4dGVybiBpbnQgdmlkZW9fY29scyh2b2lkKTsKLSAgICBleHRlcm4gaW50IHZpZGVvX3NpemUoaW50LCBpbnQpOwotICAgIHU4ICpzdHJhcDsKLSAgICB1bnNpZ25lZCBjaGFyICpsb2dvOwotICAgIHU4IGNmZzsKLSAgICBpbnQgaTsKLSAgICBjaGFyIGM7Ci0gICAgY2hhciAqczsKLSNpZmRlZiBFQVNURVJFR0cKLSAgICBpbnQgZWFzdGVyZWdnX2FjdGl2ZSA9IDA7Ci0jZW5kaWYKLSAgICBjaGFyICpwYWxfcmVzZXQ7Ci0gICAgdTggKmZiOwotICAgIHVuc2lnbmVkIGNoYXIgKm1zZzsKLSAgICB1bnNpZ25lZCBjaGFyIGN1cnJlbnRfYXR0cjsKLQotICAgIFBSSU5URigiVHJ5aW5nIHRvIHJlbW92ZSBpbml0IGRhdGFcbiIpOwotICAgIHJlbW92ZV9pbml0X2RhdGEoKTsKLSAgICBQUklOVEYoIlJlbW92ZWQgaW5pdCBkYXRhIGZyb20gY2FjaGUsIG5vdyBpbiBSQU1cbiIpOwotCi0gICAgcmVsb2Nfb3BzKHJlbG9jX2FkZHIpOwotICAgIFBSSU5URigiQXR0ZW1wdGluZyB0byBydW4gZW11bGF0b3Igb24gJTAyeDolMDJ4OiUwMnhcbiIsCi0JICAgUENJX0JVUyhncl9kZXYpLCBQQ0lfREVWKGdyX2RldiksIFBDSV9GVU5DKGdyX2RldikpOwotCi0gICAgLyogRW5hYmxlIGNvbXBhdGliaWxpdHkgaG9sZSBmb3IgZW11bGF0b3IgYWNjZXNzIHRvIGZyYW1lIGJ1ZmZlciAqLwotICAgIFBSSU5URigiRW5hYmxpbmcgY29tcGF0aWJpbGl0eSBob2xlXG4iKTsKLSAgICBlbmFibGVfY29tcGF0aWJpbGl0eV9ob2xlKCk7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICAvKiBGSVhNRTogV2Ugc2hvdWxkbid0IHVzZSB0aGlzIG11Y2ggbWVtb3J5IHJlYWxseS4gKi8KLSAgICBtZW1zZXQoJk0sIDAsIHNpemVvZihYODZFTVVfc3lzRW52KSk7Ci0gICAgTS5tZW1fYmFzZSA9IG1hbGxvYyhFTVVMQVRPUl9NRU1fU0laRSk7Ci0gICAgTS5tZW1fc2l6ZSA9IEVNVUxBVE9SX01FTV9TSVpFOwotCi0gICAgaWYgKCFNLm1lbV9iYXNlKQotICAgIHsKLQlQUklOVEYoIlVuYWJsZSB0byBhbGxvY2F0ZSBvbmUgbWVnYWJ5dGUgZm9yIGVtdWxhdG9yXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoYXR0ZW1wdF9tYXBfcm9tKGdyX2RldiwgTS5tZW1fYmFzZSArIEVNVUxBVE9SX0JJT1NfT0ZGU0VUKSA9PSAwKQotICAgIHsKLQlQUklOVEYoIkVycm9yIG1hcHBpbmcgcm9tLiBFbXVsYXRpb24gdGVybWluYXRlZFxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0jaWYgMSAvKmRlZiBERUJVRyovCi0gICAgcyA9IGdldGVudigieDg2X2Fza19zdGFydCIpOwotICAgIGlmIChzKQotICAgIHsKLQlwcmludGYoIlByZXNzICdxJyB0byBza2lwIGluaXRpYWxpemF0aW9uLCAnZCcgZm9yIGRyeSBpbml0XG4naScgZm9yIGkvbyBzZXNzaW9uIik7Ci0Jd2hpbGUgKCF0c3RjKCkpOwotCWMgPSBnZXRjKCk7Ci0JaWYgKGMgPT0gJ3EnKSByZXR1cm4gMDsKLQlpZiAoYyA9PSAnZCcpCi0JewotCSAgICBleHRlcm4gdm9pZCBiaW9zX3NldF9tb2RlKGludCBtb2RlKTsKLQkgICAgYmlvc19zZXRfbW9kZSgweDAzKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmIChjID09ICdpJykgZG9faW5vdXQoKTsKLSAgICB9Ci0KLQotI2VuZGlmCi0KLSNpZmRlZiBFQVNURVJFR0cKLS8qICAgIGlmICh0c3RjKCkpCi0gICAgewotCWlmIChnZXRjKCkgPT0gJ2MnKQotCXsKLQkgICAgZWFzdGVyZWdnX2FjdGl2ZSA9IDE7Ci0JfQotICAgIH0KLSovCi0gICAgaWYgKGdldGVudigiZWFzdGVyZWdnIikpCi0gICAgewotCWVhc3RlcmVnZ19hY3RpdmUgPSAxOwotICAgIH0KLQotICAgIGlmIChlYXN0ZXJlZ2dfYWN0aXZlKQotICAgIHsKLQkvKiBZYXkhICovCi0Jc2V0ZW52KCJ4ODZfbW9kZSIsICIxIik7Ci0Jc2V0ZW52KCJ2Z2FfZmdfY29sb3IiLCAiMTEiKTsKLQlzZXRlbnYoInZnYV9iZ19jb2xvciIsICIxIik7Ci0JZWFzdGVyZWdnX2FjdGl2ZSA9IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBzdHJhcCA9ICh1OCopTS5tZW1fYmFzZSArIEVNVUxBVE9SX1NUUkFQX09GRlNFVDsKLQotICAgIHsKLQljaGFyICptID0gZ2V0ZW52KCJ4ODZfbW9kZSIpOwotCWlmIChtKQotCXsKLQkgICAgbW9yZV9zdHJhcFszXSA9IGF0b2kobSk7Ci0JICAgIGlmIChtb3JlX3N0cmFwWzNdID09IDEpIHZpZGVvX3NpemUoNDAsIDI1KTsKLQkgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgdmlkZW9fc2l6ZSg4MCwgMjUpOwotCX0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFBva2UgdGhlIHN0cmFwIHJvdXRpbmUuIFRoaXMgbWlnaHQgbmVlZCBhIGJpdCBvZiBleHRlbmRpbmcKLSAgICAgKiBpZiB0aGVyZSBpcyBhIG1vZGUgc3dpdGNoIGludm9sdmVkLCBpLmUuIHdlIHdhbnQgdG8gaW50MTAKLSAgICAgKiBhZnRlcndhcmRzIHRvIHNldCBhIGRpZmZlcmVudCBncmFwaGljcyBtb2RlLCBvciBhbHRlcm5hdGl2ZWx5Ci0gICAgICogdGhlcmUgbWlnaHQgYmUgYSBkaWZmZXJlbnQgc3RhcnQgYWRkcmVzcyByZXF1aXJlbWVudCBpZiB0aGUKLSAgICAgKiBST00gZG9lc24ndCBoYXZlIGFuIHg4NiBpbWFnZSBpbiBpdHMgZmlyc3QgaW1hZ2UuCi0gICAgICovCi0KLSAgICBQUklOVEYoIlBva2luZyBzdHJhcC4uLlxuIik7Ci0KLSAgICAvKiBGQVIgQ0FMTCBjMDAwOjAwMDMgKi8KLSAgICAqc3RyYXArKyA9IDB4OUE7ICpzdHJhcCsrID0gMHgwMzsgKnN0cmFwKysgPSAweDAwOwotICAgICpzdHJhcCsrID0gMHgwMDsgKnN0cmFwKysgPSAweEMwOwotCi0jaWYgMQotICAgIC8qIGluc2VydCBhZGRpdGlvbmFsIHN0cmFwIGNvZGUgKi8KLSAgICBmb3IgKGk9MDsgaSA8IE1PUkVfU1RSQVBfQllURVM7IGkrKykKLSAgICB7Ci0JKnN0cmFwKysgPSBtb3JlX3N0cmFwW2ldOwotICAgIH0KLSNlbmRpZgotICAgIC8qIEhBTFQgKi8KLSAgICAqc3RyYXArKyA9IDB4RjQ7Ci0KLSAgICBQUklOVEYoIlNldHRpbmcgdXAgbG9nbyBkYXRhXG4iKTsKLSAgICBsb2dvID0gKHVuc2lnbmVkIGNoYXIgKilNLm1lbV9iYXNlICsgRU1VTEFUT1JfTE9HT19PRkZTRVQ7Ci0gICAgZm9yIChpPTA7IGk8MTY7IGkrKykKLSAgICB7Ci0JKmxvZ28rKyA9IDB4RkY7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTZXR1cCB0aGUgaW5pdCBwYXJhbWV0ZXJzLgotICAgICAqIFBlciBQQ0kgc3BlY3MsIEFIIG11c3QgY29udGFpbiB0aGUgYnVzIGFuZCBBTAotICAgICAqIG11c3QgY29udGFpbiB0aGUgZGV2Zm4sIGVuY29kZWQgYXMgKGRldjw8Myl8Zm4KLSAgICAgKi8KLQotICAgIC8qIEV4ZWN1dGlvbiBzdGFydHMgaGVyZSAqLwotICAgIE0ueDg2LlJfQ1MgPSBTRUcoRU1VTEFUT1JfU1RSQVBfT0ZGU0VUKTsKLSAgICBNLng4Ni5SX0lQID0gT0ZGKEVNVUxBVE9SX1NUUkFQX09GRlNFVCk7Ci0KLSAgICAvKiBTdGFjayBhdCB0b3Agb2YgcmFtICovCi0gICAgTS54ODYuUl9TUyA9IFNFRyhFTVVMQVRPUl9TVEFDS19PRkZTRVQpOwotICAgIE0ueDg2LlJfU1AgPSBPRkYoRU1VTEFUT1JfU1RBQ0tfT0ZGU0VUKTsKLQotICAgIC8qIElucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNLng4Ni5SX0FIID0gUENJX0JVUyhncl9kZXYpOwotICAgIE0ueDg2LlJfQUwgPSAoUENJX0RFVihncl9kZXYpPDwzKSB8IFBDSV9GVU5DKGdyX2Rldik7Ci0KLSAgICAvKiBTZXQgdGhlIEkvTyBhbmQgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMgKi8KLSAgICBYODZFTVVfc2V0dXBNZW1GdW5jcygmX0ExX21lbSk7Ci0gICAgWDg2RU1VX3NldHVwUGlvRnVuY3MoJl9BMV9waW8pOwotCi0gICAgLyogRW5hYmxlIHRpbWVyIDIgKi8KLSAgICBjZmcgPSBpbl9ieXRlKDB4NjEpOyAvKiBHZXQgTWlzYyBjb250cm9sICovCi0gICAgY2ZnIHw9IDB4MDE7ICAgICAgICAgLyogRW5hYmxlIHRpbWVyIDIgKi8KLSAgICBvdXRfYnl0ZSgweDYxLCBjZmcpOyAvKiBvdXRwdXQgYWdhaW4gKi8KLQotICAgIC8qIFNldCB1cCB0aGUgdGltZXJzICovCi0gICAgb3V0X2J5dGUoMHg0MywgMHg1NCk7Ci0gICAgb3V0X2J5dGUoMHg0MSwgMHgxOCk7Ci0KLSAgICBvdXRfYnl0ZSgweDQzLCAweDM2KTsKLSAgICBvdXRfYnl0ZSgweDQwLCAweDAwKTsKLSAgICBvdXRfYnl0ZSgweDQwLCAweDAwKTsKLQotICAgIG91dF9ieXRlKDB4NDMsIDB4YjYpOwotICAgIG91dF9ieXRlKDB4NDIsIDB4MzEpOwotICAgIG91dF9ieXRlKDB4NDIsIDB4MTMpOwotCi0gICAgLyogSW5pdCB0aGUgIkJJT1MiLiAqLwotICAgIGJpb3NfaW5pdCgpOwotCi0gICAgLyogVmlkZW8gQ2FyZCBSZXNldCAqLwotICAgIG91dF9ieXRlKDB4M0Q4LCAwKTsKLSAgICBvdXRfYnl0ZSgweDNCOCwgMSk7Ci0gICAgKHZvaWQpaW5fYnl0ZSgweDNCQSk7Ci0gICAgKHZvaWQpaW5fYnl0ZSgweDNEQSk7Ci0gICAgb3V0X2J5dGUoMHgzQzAsIDApOwotICAgIG91dF9ieXRlKDB4NjEsIDB4RkMpOwotCi0jaWZkZWYgREVCVUcKLSAgICBzID0gX2dldGVudigieDg2X3NpbmdsZXN0ZXAiKTsKLSAgICBpZiAocyAmJiBzdHJjbXAocywgIm9uIik9PTApCi0gICAgewotCVBSSU5URigiRW5hYmxpbmcgc2luZ2xlIHN0ZXBwaW5nIGZvciBkZWJ1Z1xuIik7Ci0JWDg2RU1VX3RyYWNlX29uKCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBSZWFkeSBzZXQgZ28uLi4gKi8KLSAgICBQUklOVEYoIlJ1bm5pbmcgZW11bGF0b3JcbiIpOwotICAgIFg4NkVNVV9leGVjKCk7Ci0gICAgUFJJTlRGKCJEb25lIHJ1bm5pbmcgZW11bGF0b3JcbiIpOwotCi0vKiBGSVhNRTogUmVtb3ZlIG1lICovCi0gICAgcGFsX3Jlc2V0ID0gZ2V0ZW52KCJ4ODZfcGFsZXR0ZV9yZXNldCIpOwotICAgIGlmIChwYWxfcmVzZXQgJiYgc3RyY21wKHBhbF9yZXNldCwgIm9uIikgPT0gMCkKLSAgICB7Ci0JUFJJTlRGKCJQYWxldHRlIHJlc2V0XG4iKTsKLQkvKih2b2lkKWluX2J5dGUoMHgzZGEpOyAqLwotCS8qb3V0X2J5dGUoMHgzYzAsIDApOyAqLwotCi0Jb3V0X2J5dGUoMHgzQzgsIDApOwotCW91dF9ieXRlKDB4M0M5LCAwKTsKLQlvdXRfYnl0ZSgweDNDOSwgMCk7Ci0Jb3V0X2J5dGUoMHgzQzksIDApOwotCWZvciAoaT0wOyBpPDI1NDsgaSsrKQotCXsKLQkgICAgb3V0X2J5dGUoMHgzQzksIDYzKTsKLQkgICAgb3V0X2J5dGUoMHgzQzksIDYzKTsKLQkgICAgb3V0X2J5dGUoMHgzQzksIDYzKTsKLQl9Ci0KLQlvdXRfYnl0ZSgweDNjMCwgMHgyMCk7Ci0gICAgfQotLyogRklYTUU6IHJlbW92ZSBtZSAqLwotI2lmZGVmIEVBU1RFUkVHRwotICAgIGlmIChlYXN0ZXJlZ2dfYWN0aXZlKQotICAgIHsKLQlleHRlcm4gdm9pZCB2aWRlb19lYXN0ZXJlZ2codm9pZCk7Ci0JdmlkZW9fZWFzdGVyZWdnKCk7Ci0gICAgfQotI2VuZGlmCi0vKgotICAgIGN1cnJlbnRfYXR0ciA9IHZpZGVvX2dldF9hdHRyKCk7Ci0gICAgZmIgPSAodTggKilWSURFT19CQVNFOwotICAgIGZvciAoaT0wOyBpPHZpZGVvX3Jvd3MoKSp2aWRlb19jb2xzKCkqMjsgaSs9MikKLSAgICB7Ci0JKihmYitpKSA9ICcgJzsKLQkqKGZiK2krMSkgPSBjdXJyZW50X2F0dHI7Ci0gICAgfQotCi0gICAgZmIgPSAodTggKilWSURFT19CQVNFICsgKHZpZGVvX3Jvd3MoKSktMSoodmlkZW9fY29scygpKjIpOwotICAgIGZvciAoaT0wOyBpPHZpZGVvX2NvbHMoKTsgaSsrKQotICAgIHsKLQkqKGZiICsgMippKSAgICAgPSAzMjsKLQkqKGZiICsgMippICsgMSkgPSAweDE3OwotICAgIH0KLQotICAgIG1zZyA9IGRvbmVfbXNnOwotICAgIHdoaWxlICgqbXNnKQotICAgIHsKLQkqZmIgPSAqbXNnOwotCWZiICArPSAyOwotCW1zZyArKzsKLSAgICB9Ci0qLwotI2lmZGVmIERFQlVHCi0gICAgaWYgKGdldGVudigieDg2X2RvX2lub3V0IikpIGRvX2lub3V0KCk7Ci0jZW5kaWYKLQotLypGSVhNRTogICAgZGNhY2hlX2Rpc2FibGUoKTsgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotLyogQ2xlYW4gdXAgdGhlIHg4NiBtZXNzICovCi12b2lkIHNodXRkb3duX2Jpb3Modm9pZCkKLXsKLS8qICAgIGRpc2FibGVfY29tcGF0aWJpbGl0eV9ob2xlKCk7ICovCi0gICAgLyogRnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgKi8KLSAgICBmcmVlKE0ubWVtX2Jhc2UpOwotCi19Ci0KLWludCB0b19pbnQoY2hhciAqYnVmZmVyKQotewotICAgIGludCBiYXNlID0gMDsKLSAgICBpbnQgcmVzICA9IDA7Ci0KLSAgICBpZiAoKmJ1ZmZlciA9PSAnJCcpCi0gICAgewotCWJhc2UgPSAxNjsKLQlidWZmZXIrKzsKLSAgICB9Ci0gICAgZWxzZSBiYXNlID0gMTA7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLQlzd2l0Y2goKmJ1ZmZlcikKLQl7Ci0JY2FzZSAnMCcgLi4uICc5JzoKLQkgICAgcmVzICo9IGJhc2U7Ci0JICAgIHJlcyArPSAqYnVmZmVyIC0gJzAnOwotCSAgICBicmVhazsKLQljYXNlICdBJzoKLQljYXNlICdhJzoKLQkgICAgcmVzICo9IGJhc2U7Ci0JICAgIHJlcyArPSAxMDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnQic6Ci0JY2FzZSAnYic6Ci0JICAgIHJlcyAqPSBiYXNlOwotCSAgICByZXMgKz0gMTE7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0MnOgotCWNhc2UgJ2MnOgotCSAgICByZXMgKj0gYmFzZTsKLQkgICAgcmVzICs9IDEyOwotCSAgICBicmVhazsKLQljYXNlICdEJzoKLQljYXNlICdkJzoKLQkgICAgcmVzICo9IGJhc2U7Ci0JICAgIHJlcyArPSAxMzsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnRSc6Ci0JY2FzZSAnZSc6Ci0JICAgIHJlcyAqPSBiYXNlOwotCSAgICByZXMgKz0gMTQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0YnOgotCWNhc2UgJ2YnOgotCSAgICByZXMgKj0gYmFzZTsKLQkgICAgcmVzICs9IDE1OwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gcmVzOwotCX0KLQlidWZmZXIrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBvbmVfYXJnKGNoYXIgKmJ1ZmZlciwgaW50ICphKQotewotICAgIHdoaWxlICgqYnVmZmVyICYmICpidWZmZXIgIT0gJ1xuJykKLSAgICB7Ci0JaWYgKCpidWZmZXIgPT0gJyAnKSBidWZmZXIrKzsKLQllbHNlIGJyZWFrOwotICAgIH0KLQotICAgICphID0gdG9faW50KGJ1ZmZlcik7Ci19Ci0KLXZvaWQgdHdvX2FyZ3MoY2hhciAqYnVmZmVyLCBpbnQgKmEsIGludCAqYikKLXsKLSAgICB3aGlsZSAoKmJ1ZmZlciAmJiAqYnVmZmVyICE9ICdcbicpCi0gICAgewotCWlmICgqYnVmZmVyID09ICcgJykgYnVmZmVyKys7Ci0JZWxzZSBicmVhazsKLSAgICB9Ci0KLSAgICAqYSA9IHRvX2ludChidWZmZXIpOwotCi0gICAgd2hpbGUgKCpidWZmZXIgJiYgKmJ1ZmZlciAhPSAnXG4nKQotICAgIHsKLQlpZiAoKmJ1ZmZlciAhPSAnICcpIGJ1ZmZlcisrOwotCWVsc2UgYnJlYWs7Ci0gICAgfQotCi0gICAgd2hpbGUgKCpidWZmZXIgJiYgKmJ1ZmZlciAhPSAnXG4nKQotICAgIHsKLQlpZiAoKmJ1ZmZlciA9PSAnICcpIGJ1ZmZlcisrOwotCWVsc2UgYnJlYWs7Ci0gICAgfQotCi0gICAgKmIgPSB0b19pbnQoYnVmZmVyKTsKLX0KLQotdm9pZCBkb19pbm91dCh2b2lkKQotewotICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgY2hhciAqYXJnMSwgKmFyZzI7Ci0gICAgaW50IGEsYjsKLQotICAgIHByaW50ZigiSW4vT3V0IFNlc3Npb25cblVzZSAnaVtid2xdJyBmb3IgaW4sICdvW2J3bF0nIGZvciBvdXQgYW5kICdxJyB0byBxdWl0XG4iKTsKLQotICAgIGRvCi0gICAgewotCWNvbnNfZ2V0cyhidWZmZXIpOwotCXByaW50ZigiXG4iKTsKLQotCSphcmcxID0gYnVmZmVyOwotCXdoaWxlICgqYXJnMSAhPSAnICcgKSBhcmcxKys7Ci0Jd2hpbGUgKCphcmcxID09ICcgJykgYXJnMSsrOwotCi0JaWYgKGJ1ZmZlclswXSA9PSAnaScpCi0JewotCSAgICBvbmVfYXJnKGJ1ZmZlcisyLCAmYSk7Ci0JICAgIHN3aXRjaCAoYnVmZmVyWzFdKQotCSAgICB7Ci0JICAgIGNhc2UgJ2InOgotCQlwcmludGYoImluX2J5dGUoJXhoKSA9ICV4aFxuIiwgYSwgQTFfaW5iKGEpKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3cnOgotCQlwcmludGYoImluX3dvcmQoJXhoKSA9ICV4aFxuIiwgYSwgQTFfaW53KGEpKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ2wnOgotCQlwcmludGYoImluX2R3b3JkKCV4aCkgPSAleGhcbiIsIGEsIEExX2lubChhKSk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlwcmludGYoIkludmFsaWQgbGVuZ3RoICclYydcbiIsIGJ1ZmZlclsxXSk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCWVsc2UgaWYgKGJ1ZmZlclswXSA9PSAnbycpCi0JewotCSAgICB0d29fYXJncyhidWZmZXIrMiwgJmEsICZiKTsKLQkgICAgc3dpdGNoIChidWZmZXJbMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JCXByaW50Zigib3V0X2J5dGUoJWQsICVkKVxuIiwgYSwgYik7Ci0JCUExX291dGIoYSxiKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3cnOgotCQlwcmludGYoIm91dF93b3JkKCVkLCAlZClcbiIsIGEsIGIpOwotCQlBMV9vdXR3KGEsIGIpOwotCQlicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JCXByaW50Zigib3V0X2xvbmcoJWQsICVkKVxuIiwgYSwgYik7Ci0JCUExX291dGwoYSwgYik7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlwcmludGYoIkludmFsaWQgbGVuZ3RoICclYydcbiIsIGJ1ZmZlclsxXSk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfSBlbHNlIGlmIChidWZmZXJbMF0gPT0gJ3EnKSByZXR1cm47Ci0gICAgfSB3aGlsZSAoMSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvbWVudS9jbWRfbWVudS5jIGIvYm9hcmQvTUFJL21lbnUvY21kX21lbnUuYwppbmRleCBhNTE1YmQ4Li4wNzlmMWZmIDEwMDY0NAotLS0gYS9ib2FyZC9NQUkvbWVudS9jbWRfbWVudS5jCisrKyBiL2JvYXJkL01BSS9tZW51L2NtZF9tZW51LmMKQEAgLTcsNyArNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BTUlHQU9ORUczU0UpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19BTUlHQU9ORUczU0UpICYmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiBVX0JPT1RfQ01EKAogCW1lbnUsICAgMSwgICAgICAxLCAgICAgIGRvX21lbnUsCiAJIm1lbnUgICAgLSBkaXNwbGF5IEJJT1Mgc2V0dXAgbWVudVxuIiwKZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvY29tbW9uL3NlcmlhbC5jIGIvYm9hcmQvTWFydmVsbC9jb21tb24vc2VyaWFsLmMKaW5kZXggNmExZDRkNy4uMDFlZmJlYSAxMDA2NDQKLS0tIGEvYm9hcmQvTWFydmVsbC9jb21tb24vc2VyaWFsLmMKKysrIGIvYm9hcmQvTWFydmVsbC9jb21tb24vc2VyaWFsLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCX0KIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiB2b2lkIGtnZGJfc2VyaWFsX2luaXQgKHZvaWQpCiB7CiB9CkBAIC0xNjksNCArMTY5LDQgQEAKIHsKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2EzMDAwL3UtYm9vdC5sZHMgYi9ib2FyZC9hMzAwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I5ZmZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2EzMDAwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2FkczUxMjEvTWFrZWZpbGUgYi9ib2FyZC9hZHM1MTIxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODE0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hZHM1MTIxL01ha2VmaWxlCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA3CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9ICQoQk9BUkQpLm8KKworU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2FkczUxMjEvYWRzNTEyMS5jIGIvYm9hcmQvYWRzNTEyMS9hZHM1MTIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3NWNlNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FkczUxMjEvYWRzNTEyMS5jCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisvKiBDbG9ja3MgaW4gdXNlICovCisjZGVmaW5lIFNDQ1IxX0NMT0NLU19FTgkoQ0xPQ0tfU0NDUjFfQ0ZHX0VOIHwJCQkJXAorCQkJIENMT0NLX1NDQ1IxX0xQQ19FTiB8CQkJCVwKKwkJCSBDTE9DS19TQ0NSMV9QU0NfRU4oQ09ORklHX1BTQ19DT05TT0xFKSB8CVwKKwkJCSBDTE9DS19TQ0NSMV9QU0NGSUZPX0VOIHwJCQlcCisJCQkgQ0xPQ0tfU0NDUjFfRERSX0VOIHwJCQkJXAorCQkJIENMT0NLX1NDQ1IxX0ZFQ19FTikKKworI2RlZmluZSBTQ0NSMl9DTE9DS1NfRU4JKENMT0NLX1NDQ1IyX01FTV9FTiB8CQlcCisJCQkgQ0xPQ0tfU0NDUjJfU1BESUZfRU4gfAkJXAorCQkJIENMT0NLX1NDQ1IyX0kyQ19FTikKKworI2RlZmluZSBDU0FXX1NUQVJUKHN0YXJ0KQkoKHN0YXJ0KSAmIDB4RkZGRjAwMDApCisjZGVmaW5lIENTQVdfU1RPUChzdGFydCwgc2l6ZSkJKCgoc3RhcnQpICsgKHNpemUpIC0gMSkgPj4gMTYpCisKK2xvbmcgaW50IGZpeGVkX3NkcmFtKHZvaWQpOworCitpbnQgYm9hcmRfZWFybHlfaW5pdF9mICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdTMyIGxwY2F3OworCisJLyoKKwkgKiBJbml0aWFsaXplIExvY2FsIFdpbmRvdyBmb3IgdGhlIENQTEQgcmVnaXN0ZXJzIGFjY2VzcyAoQ1MyIHNlbGVjdHMKKwkgKiB0aGUgQ1BMRCBjaGlwKQorCSAqLworCWltLT5zeXNjb25mLmxwY3MyYXcgPSBDU0FXX1NUQVJUKENGR19DUExEX0JBU0UpIHwKKwkJCSAgICAgIENTQVdfU1RPUChDRkdfQ1BMRF9CQVNFLCBDRkdfQ1BMRF9TSVpFKTsKKwlpbS0+bHBjLmNzX2NmZ1syXSA9IENGR19DUzJfQ0ZHOworCisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gTVBDNTEyMWUgUk0sIGNvbmZpZ3VyaW5nIGxvY2FsIGFjY2VzcyB3aW5kb3dzIHNob3VsZAorCSAqIGJlIGZvbGxvd2VkIGJ5IGEgZHVtbXkgcmVhZCBvZiB0aGUgY29uZmlnIHJlZ2lzdGVyIHRoYXQgd2FzCisJICogbW9kaWZpZWQgbGFzdCBhbmQgYW4gaXN5bmMKKwkgKi8KKwlscGNhdyA9IGltLT5zeXNjb25mLmxwY3MyYXc7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIpOworCisJLyoKKwkgKiBEaXNhYmxlIEJvb3QgTk9SIEZMQVNIIHdyaXRlIHByb3RlY3QgLSBDUExEIFJlZyA4IE5PUiBGTEFTSCBDb250cm9sCisJICoKKwkgKiBXaXRob3V0IHRoaXMgdGhlIGZsYXNoIGlkZW50aWZpY2F0aW9uIHJvdXRpbmUgZmFpbHMsIGFzIGl0IG5lZWRzIHRvIGlzc3VlCisJICogd3JpdGUgY29tbWFuZHMgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIHRoZSBkZXZpY2UgSUQuCisJICovCisJKigodm9sYXRpbGUgdTggKikoQ0ZHX0NQTERfQkFTRSArIDB4MDgpKSA9IDB4QzE7CisKKwkvKgorCSAqIEVuYWJsZSBjbG9ja3MKKwkgKi8KKwlpbS0+Y2xrLnNjY3JbMF0gPSBTQ0NSMV9DTE9DS1NfRU47CisJaW0tPmNsay5zY2NyWzFdID0gU0NDUjJfQ0xPQ0tTX0VOOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKwl1MzIgbXNpemUgPSAwOworCisJbXNpemUgPSBmaXhlZF9zZHJhbSAoKTsKKworCXJldHVybiBtc2l6ZTsKK30KKworLyoKKyAqIGZpeGVkIHNkcmFtIGluaXQgLS0gdGhlIGJvYXJkIGRvZXNuJ3QgdXNlIG1lbW9yeSBtb2R1bGVzIHRoYXQgaGF2ZSBzZXJpYWwgcHJlc2VuY2UKKyAqIGRldGVjdCBvciBzaW1pbGFyIG1lY2hhbmlzbSBmb3IgZGlzY292ZXJ5IG9mIHRoZSBEUkFNIHNldHRpbmdzCisgKi8KK2xvbmcgaW50IGZpeGVkX3NkcmFtICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdTMyIG1zaXplID0gQ0ZHX0REUl9TSVpFICogMTAyNCAqIDEwMjQ7CisJdTMyIG1zaXplX2xvZzIgPSBfX2lsb2cyIChtc2l6ZSk7CisJdTMyIGk7CisKKwkvKiBJbml0aWFsaXplIElPIENvbnRyb2wgKi8KKwlpbS0+aW9fY3RybC5yZWdzW01FTV9JRFhdID0gSU9DVFJMX01VWF9ERFI7CisKKwkvKiBJbml0aWFsaXplIEREUiBMb2NhbCBXaW5kb3cgKi8KKwlpbS0+c3lzY29uZi5kZHJsYXcuYmFyID0gQ0ZHX0REUl9CQVNFICYgMHhGRkZGRjAwMDsKKwlpbS0+c3lzY29uZi5kZHJsYXcuYXIgPSBtc2l6ZV9sb2cyIC0gMTsKKworCS8qCisJICogQWNjb3JkaW5nIHRvIE1QQzUxMjFlIFJNLCBjb25maWd1cmluZyBsb2NhbCBhY2Nlc3Mgd2luZG93cyBzaG91bGQKKwkgKiBiZSBmb2xsb3dlZCBieSBhIGR1bW15IHJlYWQgb2YgdGhlIGNvbmZpZyByZWdpc3RlciB0aGF0IHdhcworCSAqIG1vZGlmaWVkIGxhc3QgYW5kIGFuIGlzeW5jCisJICovCisJaSA9IGltLT5zeXNjb25mLmRkcmxhdy5hcjsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7CisKKwkvKiBFbmFibGUgRERSICovCisJaW0tPm1kZHJjLmRkcl9zeXNfY29uZmlnID0gQ0ZHX01ERFJDX1NZU19DRkdfRU47CisKKwkvKiBJbml0aWFsaXplIEREUiBQcmlvcml0eSBNYW5hZ2VyICovCisJaW0tPm1kZHJjLnByaW9tYW5fY29uZmlnMSA9IENGR19NRERSQ0dSUF9QTV9DRkcxOworCWltLT5tZGRyYy5wcmlvbWFuX2NvbmZpZzIgPSBDRkdfTUREUkNHUlBfUE1fQ0ZHMjsKKwlpbS0+bWRkcmMuaGlwcmlvX2NvbmZpZyA9IENGR19NRERSQ0dSUF9ISVBSSU9fQ0ZHOworCWltLT5tZGRyYy5sdXRfdGFibGUwX21haW5fdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUMF9NVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMV9tYWluX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDFfTVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTJfbWFpbl91cHBlciA9IENGR19NRERSQ0dSUF9MVVQyX01VOworCWltLT5tZGRyYy5sdXRfdGFibGUzX21haW5fdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUM19NVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlNF9tYWluX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDRfTVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTBfbWFpbl9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQwX01MOworCWltLT5tZGRyYy5sdXRfdGFibGUxX21haW5fbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUMV9NTDsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMl9tYWluX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDJfTUw7CisJaW0tPm1kZHJjLmx1dF90YWJsZTNfbWFpbl9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQzX01MOworCWltLT5tZGRyYy5sdXRfdGFibGU0X21haW5fbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUNF9NTDsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMF9hbHRlcm5hdGVfdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUMF9BVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMV9hbHRlcm5hdGVfdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUMV9BVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMl9hbHRlcm5hdGVfdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUMl9BVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlM19hbHRlcm5hdGVfdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUM19BVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlNF9hbHRlcm5hdGVfdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUNF9BVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMF9hbHRlcm5hdGVfbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUMF9BVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMV9hbHRlcm5hdGVfbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUMV9BTDsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMl9hbHRlcm5hdGVfbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUMl9BTDsKKwlpbS0+bWRkcmMubHV0X3RhYmxlM19hbHRlcm5hdGVfbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUM19BTDsKKwlpbS0+bWRkcmMubHV0X3RhYmxlNF9hbHRlcm5hdGVfbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUNF9BTDsKKworCS8qIEluaXRpYWxpemUgTUREUkMgKi8KKwlpbS0+bWRkcmMuZGRyX3N5c19jb25maWcgPSBDRkdfTUREUkNfU1lTX0NGRzsKKwlpbS0+bWRkcmMuZGRyX3RpbWVfY29uZmlnMCA9IENGR19NRERSQ19USU1FX0NGRzA7CisJaW0tPm1kZHJjLmRkcl90aW1lX2NvbmZpZzEgPSBDRkdfTUREUkNfVElNRV9DRkcxOworCWltLT5tZGRyYy5kZHJfdGltZV9jb25maWcyID0gQ0ZHX01ERFJDX1RJTUVfQ0ZHMjsKKworCS8qIEluaXRpYWxpemUgRERSICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fTk9QOworCisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9QQ0hHX0FMTDsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX0VNMjsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX0VNMzsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX0VOX0RMTDsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX1JTVF9ETEw7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9QQ0hHX0FMTDsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX1JGU0g7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9JTklUX0RFVl9PUDsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX09DRF9ERUZBVUxUOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fT0NEX0VYSVQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9OT1A7CisKKwkvKiBTdGFydCBNRERSQyAqLworCWltLT5tZGRyYy5kZHJfdGltZV9jb25maWcwID0gQ0ZHX01ERFJDX1RJTUVfQ0ZHMF9SVU47CisJaW0tPm1kZHJjLmRkcl9zeXNfY29uZmlnID0gQ0ZHX01ERFJDX1NZU19DRkdfUlVOOworCisJcmV0dXJuIG1zaXplOworfQorCitpbnQgY2hlY2tib2FyZCAodm9pZCkKK3sKKwl1c2hvcnQgYnJkX3JldiA9ICoodnVfc2hvcnQgKikgKENGR19DUExEX0JBU0UgKyAweDAwKTsKKwl1Y2hhciBjcGxkX3JldiA9ICoodnVfY2hhciAqKSAoQ0ZHX0NQTERfQkFTRSArIDB4MDIpOworCisJcHJpbnRmICgiQm9hcmQ6IEFEUzUxMjEgcmV2LiAweCUwNHggKENQTEQgcmV2LiAweCUwMngpXG4iLAorCQlicmRfcmV2LCBjcGxkX3Jldik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9hZHM1MTIxL2NvbmZpZy5tayBiL2JvYXJkL2FkczUxMjEvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTk4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hZHM1MTIxL2NvbmZpZy5tawpAQCAtMCwwICsxLDIzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1RFWFRfQkFTRSAgPSAgIDB4RkZGMDAwMDAKZGlmZiAtLWdpdCBhL2JvYXJkL2FkczUxMjEvdS1ib290LmxkcyBiL2JvYXJkL2FkczUxMjEvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzhkODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYWRzNTEyMS91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS9tcGM1MTJ4L3N0YXJ0Lm8JKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KK0VOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL2FsYXNrYS9hbGFza2EuYyBiL2JvYXJkL2FsYXNrYS9hbGFza2EuYwppbmRleCA5Mzg3NGIyLi45NTMxNzAzIDEwMDY0NAotLS0gYS9ib2FyZC9hbGFza2EvYWxhc2thLmMKKysrIGIvYm9hcmQvYWxhc2thL2FsYXNrYS5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlzaXplID0gZHJhbVNldHVwICgpOwogCiAvKiBpZiBpQ2FjaGUgYWQgZENhY2hlIGlzIGRlZmluZWQgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DQUNIRSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0FDSEUpCiAvKiAgICBzZXR1cEJhdChzaXplKTsqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2JvYXJkL2FsYXNrYS91LWJvb3QubGRzIGIvYm9hcmQvYWxhc2thL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWJjNzcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvYWxhc2thL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyMjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYWx0ZXJhL2RrMWMyMC9kazFjMjAuYyBiL2JvYXJkL2FsdGVyYS9kazFjMjAvZGsxYzIwLmMKaW5kZXggOThlZTdhNy4uZDBlYjllYSAxMDA2NDQKLS0tIGEvYm9hcmQvYWx0ZXJhL2RrMWMyMC9kazFjMjAuYworKysgYi9ib2FyZC9hbHRlcmEvZGsxYzIwL2RrMWMyMC5jCkBAIC01NSw3ICs1NSw3IEBACiAJcmV0dXJuICgwKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogaW50IGlkZV9wcmVpbml0ICh2b2lkKQogewogCW5pb3NfcGlvX3QgKnByZXNlbnQgPSAobmlvc19waW9fdCAqKSBDRkdfQ0ZfUFJFU0VOVDsKQEAgLTc4LDQgKzc4LDQgQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MvYmFtYm9vL2JhbWJvby5jIGIvYm9hcmQvYW1jYy9iYW1ib28vYmFtYm9vLmMKaW5kZXggY2FmNjY5MC4uMDBjNzkzYSAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9iYW1ib28vYmFtYm9vLmMKKysrIGIvYm9hcmQvYW1jYy9iYW1ib28vYmFtYm9vLmMKQEAgLTMyLDkgKzMyLDE3MCBAQAogdm9pZCBjb25maWd1cmVfcHBjNDQwZXBfcGlucyh2b2lkKTsKIGludCBpc19uYW5kX3NlbGVjdGVkKHZvaWQpOwogCi11bnNpZ25lZCBjaGFyIGNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzEyOF07CisjaWYgIShkZWZpbmVkKENPTkZJR19OQU5EX1VfQk9PVCkgfHwgZGVmaW5lZChDT05GSUdfTkFORF9TUEwpKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBCYW1ib28gaGFzIG9uZSBiYW5rIG9uYm9hcmQgc2RyYW0gKHBsdXMgRElNTSkKKyAqCisgKiBGaXhlZCBtZW1vcnkgaXMgY29tcG9zZWQgb2YgOgorICoJTVQ0NlYxNk0xNlRHLTc1IGZyb20gTWljcm9uICh4IDIpLCAyNTZNYiwgMTYgTSB4MTYsIEREUjI2NiwKKyAqCTEzIHJvdyBhZGQgYml0cywgMTAgY29sdW1uIGFkZCBiaXRzIChidXQgMTIgcm93IHVzZWQgb25seSkuCisgKglFQ0MgZGV2aWNlOiBNVDQ2VjE2TThURy03NSBmcm9tIE1pY3JvbiAoeCAxKSwgMTI4TWIsIHg4LCBERFIyNjYsCisgKgkxMiByb3cgYWRkIGJpdHMsIDEwIGNvbHVtbiBhZGQgYml0cy4KKyAqCVByZXBhcmUgYSBzdWJzZXQgKG9ubHkgdGhlIHVzZWQgb25lcykgb2YgU1BEIGRhdGEKKyAqCisgKglOb3RlIDogaWYgdGhlIEVDQyBpcyBlbmFibGVkIChTRFJBTV9FQ0NfRU5BQkxFKSB0aGUgc2l6ZSBvZgorICoJdGhlIGNvcnJlc3BvbmRpbmcgYmFuayBpcyBkaXZpZGVkIGJ5IDIgZHVlIHRvIG51bWJlciBvZiBSb3cgYWRkcmVzc2VzCisgKgkxMiBpbiB0aGUgRUNDIG1vZHVsZQorICoKKyAqICBBc3N1bWVzOgk2NCBNQiwgRUNDLCBub24tcmVnaXN0ZXJlZAorICoJCVBMQiBAIDEzMyBNSHoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgdW5zaWduZWQgY2hhciBjZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVsxMjhdID0geworCTB4ODAsICAgIC8qIG51bWJlciBvZiBTUEQgYnl0ZXMgdXNlZDogMTI4ICovCisJMHgwOCwgICAgLyogIHRvdGFsIG51bWJlciBieXRlcyBpbiBTUEQgZGV2aWNlID0gMjU2ICovCisJMHgwNywgICAgLyogRERSIHJhbSAqLworI2lmZGVmIENPTkZJR19ERFJfRUNDCisJMHgwQywgICAgLyogbnVtIFJvdyBBZGRyOiAxMiAqLworI2Vsc2UKKwkweDBELCAgICAvKiBudW0gUm93IEFkZHI6IDEzICovCisjZW5kaWYKKwkweDA5LCAgICAvKiBudW1Db2xBZGRyOiA5ICAqLworCTB4MDEsICAgIC8qIG51bUJhbmtzOiAxICovCisJMHgyMCwgICAgLyogTW9kdWxlIGRhdGEgd2lkdGg6IDMyIGJpdHMgKi8KKwkweDAwLCAgICAvKiBNb2R1bGUgZGF0YSB3aWR0aCBjb250aW51ZWQ6ICswICovCisJMHgwNCwgICAgLyogMi41IFZvbHQgKi8KKwkweDc1LCAgICAvKiBTRFJBTSBDeWNsZSBUaW1lIChjYXMgbGF0ZW5jeSAyLjUpID0gNy41IG5zICovCisjaWZkZWYgQ09ORklHX0REUl9FQ0MKKwkweDAyLCAgICAvKiBFQ0MgT04gOiAwMiBPRkYgOiAwMCAqLworI2Vsc2UKKwkweDAwLCAgICAvKiBFQ0MgT04gOiAwMiBPRkYgOiAwMCAqLworI2VuZGlmCisJMHg4MiwgICAgLyogcmVmcmVzaCBSYXRlIFR5cGU6IE5vcm1hbCAoMTUuNjI1dXMpICsgU2VsZiByZWZyZXNoICovCisJMCwKKwkwLAorCTAsCisJMHgwMSwgICAgLyogd2NzYmMgPSAxICovCisJMCwKKwkwLAorCTB4MEMsICAgIC8qIGNhc0JpdCAoMiwyLjUpICovCisJMCwKKwkwLAorCTB4MDAsICAgIC8qIG5vdCByZWdpc3RlcmVkOiAwICByZWdpc3RlcmVkIDogMHgwMiovCisJMCwKKwkweEEwLCAgICAvKiBTRFJBTSBDeWNsZSBUaW1lIChjYXMgbGF0ZW5jeSAyKSA9IDEwIG5zICovCisJMCwKKwkweDAwLCAgICAvKiBTRFJBTSBDeWNsZSBUaW1lIChjYXMgbGF0ZW5jeSAxLjUpID0gTi5BICovCisJMCwKKwkweDUwLCAgICAvKiB0UnBOcyA9IDIwIG5zICAqLworCTAsCisJMHg1MCwgICAgLyogdFJjZE5zID0gMjAgbnMgKi8KKwk0NSwgICAgICAvKiB0UmFzTnMgKi8KKyNpZmRlZiBDT05GSUdfRERSX0VDQworCTB4MDgsICAgIC8qIGJhbmtTaXplSUQ6IDMyTUIgKi8KKyNlbHNlCisJMHgxMCwgICAgLyogYmFua1NpemVJRDogNjRNQiAqLworI2VuZGlmCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAKK307CisjZW5kaWYKIAotZ3Bpb19wYXJhbV9zIGdwaW9fdGFiW0dQSU9fR1JPVVBfTUFYXVtHUElPX01BWF07CiAjaWYgMAogewkgICAvKiBHUElPICAgQWx0ZXJuYXRlMQkgICAgICBBbHRlcm5hdGUyCUFsdGVybmF0ZTMgKi8KICAgICB7CkBAIC0yOTEsNzMgKzQ1MiwxMiBAQAogCXJldHVybiAoMCk7CiB9CiAKLSNpZiAhKGRlZmluZWQoQ09ORklHX05BTkRfVV9CT09UKSB8fCBkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGluaXRfc3BkX2FycmF5IC0tIEJhbWJvbyBoYXMgb25lIGJhbmsgb25ib2FyZCBzZHJhbSAocGx1cyBESU1NKQotICoKLSAqIEZpeGVkIG1lbW9yeSBpcyBjb21wb3NlZCBvZiA6Ci0gKglNVDQ2VjE2TTE2VEctNzUgZnJvbSBNaWNyb24gKHggMiksIDI1Nk1iLCAxNiBNIHgxNiwgRERSMjY2LAotICoJMTMgcm93IGFkZCBiaXRzLCAxMCBjb2x1bW4gYWRkIGJpdHMgKGJ1dCAxMiByb3cgdXNlZCBvbmx5KS4KLSAqCUVDQyBkZXZpY2U6IE1UNDZWMTZNOFRHLTc1IGZyb20gTWljcm9uICh4IDEpLCAxMjhNYiwgeDgsIEREUjI2NiwKLSAqCTEyIHJvdyBhZGQgYml0cywgMTAgY29sdW1uIGFkZCBiaXRzLgotICoJUHJlcGFyZSBhIHN1YnNldCAob25seSB0aGUgdXNlZCBvbmVzKSBvZiBTUEQgZGF0YQotICoKLSAqCU5vdGUgOiBpZiB0aGUgRUNDIGlzIGVuYWJsZWQgKFNEUkFNX0VDQ19FTkFCTEUpIHRoZSBzaXplIG9mCi0gKgl0aGUgY29ycmVzcG9uZGluZyBiYW5rIGlzIGRpdmlkZWQgYnkgMiBkdWUgdG8gbnVtYmVyIG9mIFJvdyBhZGRyZXNzZXMKLSAqCTEyIGluIHRoZSBFQ0MgbW9kdWxlCi0gKgotICogIEFzc3VtZXM6CTY0IE1CLCBFQ0MsIG5vbi1yZWdpc3RlcmVkCi0gKgkJUExCIEAgMTMzIE1IegotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpbml0X3NwZF9hcnJheSh2b2lkKQotewotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzhdICAgICA9IDB4MDQ7ICAgIC8qIDIuNSBWb2x0ICovCi0JY2ZnX3NpbXVsYXRlX3NwZF9lZXByb21bMl0gICAgID0gMHgwNzsgICAgLyogRERSIHJhbSAqLwotCi0jaWZkZWYgQ09ORklHX0REUl9FQ0MKLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVsxMV0gICAgPSAweDAyOyAgICAvKiBFQ0MgT04gOiAwMiBPRkYgOiAwMCAqLwotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzMxXSAgICA9IDB4MDg7ICAgIC8qIGJhbmtTaXplSUQ6IDMyTUIgKi8KLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVszXSAgICAgPSAweDBDOyAgICAvKiBudW0gUm93IEFkZHI6IDEyICovCi0jZWxzZQotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzExXSAgICA9IDB4MDA7ICAgIC8qIEVDQyBPTiA6IDAyIE9GRiA6IDAwICovCi0JY2ZnX3NpbXVsYXRlX3NwZF9lZXByb21bMzFdICAgID0gMHgxMDsgICAgLyogYmFua1NpemVJRDogNjRNQiAqLwotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzNdICAgICA9IDB4MEQ7ICAgIC8qIG51bSBSb3cgQWRkcjogMTMgKi8KLSNlbmRpZgotCi0JY2ZnX3NpbXVsYXRlX3NwZF9lZXByb21bNF0gICAgID0gMHgwOTsgICAgLyogbnVtQ29sQWRkcjogOSAgKi8KLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVs1XSAgICAgPSAweDAxOyAgICAvKiBudW1CYW5rczogMSAqLwotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzBdICAgICA9IDB4ODA7ICAgIC8qIG51bWJlciBvZiBTUEQgYnl0ZXMgdXNlZDogMTI4ICovCi0JY2ZnX3NpbXVsYXRlX3NwZF9lZXByb21bMV0gICAgID0gMHgwODsgICAgLyogIHRvdGFsIG51bWJlciBieXRlcyBpbiBTUEQgZGV2aWNlID0gMjU2ICovCi0JY2ZnX3NpbXVsYXRlX3NwZF9lZXByb21bMjFdICAgID0gMHgwMDsgICAgLyogbm90IHJlZ2lzdGVyZWQ6IDAgIHJlZ2lzdGVyZWQgOiAweDAyKi8KLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVs2XSAgICAgPSAweDIwOyAgICAvKiBNb2R1bGUgZGF0YSB3aWR0aDogMzIgYml0cyAqLwotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzddICAgICA9IDB4MDA7ICAgIC8qIE1vZHVsZSBkYXRhIHdpZHRoIGNvbnRpbnVlZDogKzAgKi8KLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVsxNV0gICAgPSAweDAxOyAgICAvKiB3Y3NiYyA9IDEgKi8KLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVsyN10gICAgPSAweDUwOyAgICAvKiB0UnBOcyA9IDIwIG5zICAqLwotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzI5XSAgICA9IDB4NTA7ICAgIC8qIHRSY2ROcyA9IDIwIG5zICovCi0KLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVszMF0gICAgPSA0NTsgICAgICAvKiB0UmFzTnMgKi8KLQotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzE4XSAgICA9IDB4MEM7ICAgIC8qIGNhc0JpdCAoMiwyLjUpICovCi0KLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVs5XSAgICAgPSAweDc1OyAgICAvKiBTRFJBTSBDeWNsZSBUaW1lIChjYXMgbGF0ZW5jeSAyLjUpID0gNy41IG5zICovCi0JY2ZnX3NpbXVsYXRlX3NwZF9lZXByb21bMjNdICAgID0gMHhBMDsgICAgLyogU0RSQU0gQ3ljbGUgVGltZSAoY2FzIGxhdGVuY3kgMikgPSAxMCBucyAqLwotCWNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzI1XSAgICA9IDB4MDA7ICAgIC8qIFNEUkFNIEN5Y2xlIFRpbWUgKGNhcyBsYXRlbmN5IDEuNSkgPSBOLkEgKi8KLQljZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVsxMl0gICAgPSAweDgyOyAgICAvKiByZWZyZXNoIFJhdGUgVHlwZTogTm9ybWFsICgxNS42MjV1cykgKyBTZWxmIHJlZnJlc2ggKi8KLX0KLSNlbmRpZgogCiBsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCiB7CiAjaWYgIShkZWZpbmVkKENPTkZJR19OQU5EX1VfQk9PVCkgfHwgZGVmaW5lZChDT05GSUdfTkFORF9TUEwpKQogCWxvbmcgZHJhbV9zaXplOwogCi0JLyoKLQkgKiBGaXJzdCB3cml0ZSBzaW11bGF0ZWQgdmFsdWVzIGluIGVlcHJvbSBhcnJheSBmb3Igb25ib2FyZCBiYW5rIDAKLQkgKi8KLQlpbml0X3NwZF9hcnJheSgpOwotCiAJZHJhbV9zaXplID0gc3BkX3NkcmFtKCk7CiAKIAlyZXR1cm4gZHJhbV9zaXplOwpAQCAtMzcxLDExICs0NzEsMTIgQEAKIHsKIAl1bnNpZ25lZCBsb25nICptZW0gPSAodW5zaWduZWQgbG9uZyAqKTA7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBrZW5kID0gKDEwMjQgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCXVuc2lnbmVkIGxvbmcgaywgbjsKKwl1bnNpZ25lZCBsb25nIGssIG4sICpwMzIsIGN0cjsKKwljb25zdCB1bnNpZ25lZCBsb25nIGJlbmQgPSBDRkdfTUJZVEVTX1NEUkFNICogMTAyNCAqIDEwMjQ7CiAKIAltdG1zcigwKTsKIAotCWZvciAoayA9IDA7IGsgPCBDRkdfS0JZVEVTX1NEUkFNOworCWZvciAoayA9IDA7IGsgPAlDRkdfTUJZVEVTX1NEUkFNKjEwMjQ7CiAJICAgICArK2ssIG1lbSArPSAoMTAyNCAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkpIHsKIAkJaWYgKChrICYgMTAyMykgPT0gMCkgewogCQkJcHJpbnRmKCIlM2QgTUJcciIsIGsgLyAxMDI0KTsKQEAgLTM5OSw2ICs1MDAsMzQgQEAKIAkJCX0KIAkJfQogCX0KKworCS8qCisJICogUGVyZm9ybSBhIHNlcXVlbmNlIHRlc3QgdG8gZW5zdXJlIHRoYXQgYWxsCisJICogbWVtb3J5IGxvY2F0aW9ucyBhcmUgdW5pcXVlbHkgYWRkcmVzc2FibGUKKwkgKi8KKwljdHIgPSAwOworCXAzMiA9IDA7CisJd2hpbGUgKCh1bnNpZ25lZCBsb25nKXAzMiAhPSBiZW5kKSB7CisJCWlmICgwID09ICgodW5zaWduZWQgbG9uZylwMzIgJiAoKDE8PDIwKS0xKSkpCisJCQlwcmludGYoIldyaXRpbmcJJTNkIE1CXHIiLCAodW5zaWduZWQgbG9uZylwMzIgPj4gMjApOworCQkqcDMyKysgPSBjdHIrKzsKKwl9CisKKwljdHIgPSAwOworCXAzMiA9IDA7CisJd2hpbGUgKCh1bnNpZ25lZCBsb25nKXAzMiAhPSBiZW5kKSB7CisJCWlmICgwID09ICgodW5zaWduZWQgbG9uZylwMzIgJiAoKDE8PDIwKS0xKSkpCisJCQlwcmludGYoIlZlcmlmeWluZyAlM2QgTUJcciIsICh1bnNpZ25lZCBsb25nKXAzMiA+PiAyMCk7CisKKwkJaWYgKCpwMzIgIT0gY3RyKSB7CisJCQlwcmludGYoIlNEUkFNIHRlc3QgZmFpbHMgYXQ6ICUwOHhcbiIsIHAzMik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWN0cisrOworCQlwMzIrKzsKKwl9CisKIAlwcmludGYoIlNEUkFNIHRlc3QgcGFzc2VzXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMTEsNyArMTM0MCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgaW5pdF9kZWZhdWx0X2dwaW8KICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBpbml0X2RlZmF1bHRfZ3Bpbyh2b2lkKQordm9pZCBpbml0X2RlZmF1bHRfZ3BpbyhncGlvX3BhcmFtX3MgKCpncGlvX3RhYilbR1BJT19NQVhdKQogewogCWludCBpOwogCkBAIC0xMjgxLDcgKzE0MTAsNyBAQAogICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCB1cGRhdGVfdWFydF9pb3ModWFydF9jb25maWdfbmJfdCB1YXJ0X2NvbmZpZykKK3ZvaWQgdXBkYXRlX3VhcnRfaW9zKHVhcnRfY29uZmlnX25iX3QgdWFydF9jb25maWcsIGdwaW9fcGFyYW1fcyAoKmdwaW9fdGFiKVtHUElPX01BWF0pCiB7CiAJc3dpdGNoICh1YXJ0X2NvbmZpZykKIAl7CkBAIC0xNDA5LDcgKzE1MzgsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IHVwZGF0ZV9uZGZjX2lvcyh2b2lkKS4KICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCB1cGRhdGVfbmRmY19pb3Modm9pZCkKK3ZvaWQgdXBkYXRlX25kZmNfaW9zKGdwaW9fcGFyYW1fcyAoKmdwaW9fdGFiKVtHUElPX01BWF0pCiB7CiAJLyogVXBkYXRlIEdQSU8gQ29uZmlndXJhdGlvbiBUYWJsZSAqLwogCWdwaW9fdGFiW0dQSU8wXVs2XS5pbl9vdXQgPSBHUElPX09VVDsJICAgIC8qIEVCQ19DU19OKDEpICovCkBAIC0xNDI3LDcgKzE1NTYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IHVwZGF0ZV96aWlfaW9zKHZvaWQpLgogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHVwZGF0ZV96aWlfaW9zKHZvaWQpCit2b2lkIHVwZGF0ZV96aWlfaW9zKGdwaW9fcGFyYW1fcyAoKmdwaW9fdGFiKVtHUElPX01BWF0pCiB7CiAJLyogVXBkYXRlIEdQSU8gQ29uZmlndXJhdGlvbiBUYWJsZSAqLwogCWdwaW9fdGFiW0dQSU8wXVsxMl0uaW5fb3V0ID0gR1BJT19JTjsJICAgIC8qIFpJSV9wMFJ4ZCgwKSAqLwpAQCAtMTQ3Nyw3ICsxNjA2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCB1cGRhdGVfdWljXzBfM19pcnFfaW9zKCkuCiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgdXBkYXRlX3VpY18wXzNfaXJxX2lvcyh2b2lkKQordm9pZCB1cGRhdGVfdWljXzBfM19pcnFfaW9zKGdwaW9fcGFyYW1fcyAoKmdwaW9fdGFiKVtHUElPX01BWF0pCiB7CiAJZ3Bpb190YWJbR1BJTzFdWzhdLmluX291dCA9IEdQSU9fSU47CSAgICAvKiBVSUNfSVJRKDApICovCiAJZ3Bpb190YWJbR1BJTzFdWzhdLmFsdF9uYiA9IEdQSU9fQUxUMTsKQEAgLTE0OTUsNyArMTYyNCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgdXBkYXRlX3VpY180XzlfaXJxX2lvcygpLgogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHVwZGF0ZV91aWNfNF85X2lycV9pb3Modm9pZCkKK3ZvaWQgdXBkYXRlX3VpY180XzlfaXJxX2lvcyhncGlvX3BhcmFtX3MgKCpncGlvX3RhYilbR1BJT19NQVhdKQogewogCWdwaW9fdGFiW0dQSU8xXVsxMl0uaW5fb3V0ID0gR1BJT19JTjsJICAgIC8qIFVJQ19JUlEoNCkgKi8KIAlncGlvX3RhYltHUElPMV1bMTJdLmFsdF9uYiA9IEdQSU9fQUxUMTsKQEAgLTE1MTYsNyArMTY0NSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgdXBkYXRlX2RtYV9hX2JfaW9zKCkuCiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgdXBkYXRlX2RtYV9hX2JfaW9zKHZvaWQpCit2b2lkIHVwZGF0ZV9kbWFfYV9iX2lvcyhncGlvX3BhcmFtX3MgKCpncGlvX3RhYilbR1BJT19NQVhdKQogewogCWdwaW9fdGFiW0dQSU8xXVsxMl0uaW5fb3V0ID0gR1BJT19PVVQ7CSAgICAvKiBETUFfQUNLKDEpICovCiAJZ3Bpb190YWJbR1BJTzFdWzEyXS5hbHRfbmIgPSBHUElPX0FMVDI7CkBAIC0xNTM3LDcgKzE2NjYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IHVwZGF0ZV9kbWFfY19kX2lvcygpLgogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHVwZGF0ZV9kbWFfY19kX2lvcyh2b2lkKQordm9pZCB1cGRhdGVfZG1hX2NfZF9pb3MoZ3Bpb19wYXJhbV9zICgqZ3Bpb190YWIpW0dQSU9fTUFYXSkKIHsKIAlncGlvX3RhYltHUElPMF1bMF0uaW5fb3V0ID0gR1BJT19JTjsJICAgIC8qIERNQV9SRVEoMikgKi8KIAlncGlvX3RhYltHUElPMF1bMF0uYWx0X25iID0gR1BJT19BTFQyOwpAQCAtMTU2Miw3ICsxNjkxLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCB1cGRhdGVfZWJjX21hc3Rlcl9pb3MoKS4KICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCB1cGRhdGVfZWJjX21hc3Rlcl9pb3Modm9pZCkKK3ZvaWQgdXBkYXRlX2ViY19tYXN0ZXJfaW9zKGdwaW9fcGFyYW1fcyAoKmdwaW9fdGFiKVtHUElPX01BWF0pCiB7CiAJZ3Bpb190YWJbR1BJTzBdWzI3XS5pbl9vdXQgPSBHUElPX0lOOwkgICAgLyogRVhUX0VCQ19SRVEgKi8KIAlncGlvX3RhYltHUElPMF1bMjddLmFsdF9uYiA9IEdQSU9fQUxUMTsKQEAgLTE1ODAsNyArMTcwOSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgdXBkYXRlX3VzYjJfZGV2aWNlX2lvcygpLgogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHVwZGF0ZV91c2IyX2RldmljZV9pb3Modm9pZCkKK3ZvaWQgdXBkYXRlX3VzYjJfZGV2aWNlX2lvcyhncGlvX3BhcmFtX3MgKCpncGlvX3RhYilbR1BJT19NQVhdKQogewogCWdwaW9fdGFiW0dQSU8wXVsyNl0uaW5fb3V0ID0gR1BJT19JTjsJICAgIC8qIFVTQjJEX1JYVkFMSUQgKi8KIAlncGlvX3RhYltHUElPMF1bMjZdLmFsdF9uYiA9IEdQSU9fQUxUMjsKQEAgLTE2MTEsMjAgKzE3NDAsMjEgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCB1cGRhdGVfcGNpX3BhdGNoX2lvcygpLgogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHVwZGF0ZV9wY2lfcGF0Y2hfaW9zKHZvaWQpCit2b2lkIHVwZGF0ZV9wY2lfcGF0Y2hfaW9zKGdwaW9fcGFyYW1fcyAoKmdwaW9fdGFiKVtHUElPX01BWF0pCiB7CiAJZ3Bpb190YWJbR1BJTzBdWzI5XS5pbl9vdXQgPSBHUElPX09VVDsJICAgIC8qIEVCQ19FWFRfSERMQSAqLwogCWdwaW9fdGFiW0dQSU8wXVsyOV0uYWx0X25iID0gR1BJT19BTFQxOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICBzZXRfY2hpcF9ncGlvX2NvbmZpZ3VyYXRpb24odW5zaWduZWQgY2hhciBncGlvX2NvcmUpCisgIHwgICBzZXRfY2hpcF9ncGlvX2NvbmZpZ3VyYXRpb24odW5zaWduZWQgY2hhciBncGlvX2NvcmUsCisgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Bpb19wYXJhbV9zICgqZ3Bpb190YWIpW0dQSU9fTUFYXSkKICAgfCAgIFB1dCB0aGUgY29yZSBpbXBhY3RlZCBieSBjbG9jayBtb2RpZmljYXRpb24gYW5kIHNoYXJpbmcgaW4gcmVzZXQuCiAgIHwgICBDb25maWcgdGhlIHNlbGVjdCByZWdpc3RlcnMgdG8gcmVzb2x2ZSB0aGUgc2hhcmluZyBkZXBlbmRpbmcgb2YgdGhlIGNvbmZpZy4KICAgfCAgIENvbmZpZ3VyZSB0aGUgR1BJTyByZWdpc3RlcnMuCiAgIHwKICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBzZXRfY2hpcF9ncGlvX2NvbmZpZ3VyYXRpb24odW5zaWduZWQgY2hhciBncGlvX2NvcmUpCit2b2lkIHNldF9jaGlwX2dwaW9fY29uZmlndXJhdGlvbih1bnNpZ25lZCBjaGFyIGdwaW9fY29yZSwgZ3Bpb19wYXJhbV9zICgqZ3Bpb190YWIpW0dQSU9fTUFYXSkKIHsKIAl1bnNpZ25lZCBjaGFyIGk9MCwgaj0wLCByZWdfb2Zmc2V0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGdwaW9fcmVnLCBncGlvX2NvcmVfYWRkOwpAQCAtMTc3OCwxMSArMTkwOCwxMiBAQAogCQkJQ09SRV9OT1RfU0VMRUNURUQJLyogUENJX1BBVENIICovCiAJCX07CiAKKwlncGlvX3BhcmFtX3MgZ3Bpb190YWJbR1BJT19HUk9VUF9NQVhdW0dQSU9fTUFYXTsKIAogCS8qIFRhYmxlIERlZmF1bHQgSW5pdGlhbGlzYXRpb24gKyBGUEdBIEFjY2VzcyAqLwotCWluaXRfZGVmYXVsdF9ncGlvKCk7Ci0Jc2V0X2NoaXBfZ3Bpb19jb25maWd1cmF0aW9uKEdQSU8wKTsKLQlzZXRfY2hpcF9ncGlvX2NvbmZpZ3VyYXRpb24oR1BJTzEpOworCWluaXRfZGVmYXVsdF9ncGlvKGdwaW9fdGFiKTsKKwlzZXRfY2hpcF9ncGlvX2NvbmZpZ3VyYXRpb24oR1BJTzAsIGdwaW9fdGFiKTsKKwlzZXRfY2hpcF9ncGlvX2NvbmZpZ3VyYXRpb24oR1BJTzEsIGdwaW9fdGFiKTsKIAogCS8qIFVwZGF0ZSBUYWJsZSAqLwogCWZvcmNlX2J1cF9jb3JlX3NlbGVjdGlvbihwcGM0NDBlcF9jb3JlX3NlbGVjdGlvbiwgJmNvbmZpZ192YWwpOwpAQCAtMTgxNyw3ICsxOTQ4LDcgQEAKIAkvKiBVSUMgMDozIFNlbGVjdGlvbiAqLwogCWlmIChwcGM0NDBlcF9jb3JlX3NlbGVjdGlvbltVSUNfMF8zXSA9PSBDT1JFX1NFTEVDVEVEKQogCXsKLQkJdXBkYXRlX3VpY18wXzNfaXJxX2lvcygpOworCQl1cGRhdGVfdWljXzBfM19pcnFfaW9zKGdwaW9fdGFiKTsKIAkJZG1hX2FfYl91bnNlbGVjdF9pbl9mcGdhKCk7CiAJfQogCkBAIC0xODI1LDIxICsxOTU2LDIxIEBACiAJaWYgKHBwYzQ0MGVwX2NvcmVfc2VsZWN0aW9uW1VJQ180XzldID09IENPUkVfU0VMRUNURUQpCiAJewogCQlzZHIwX3BmYzEgPSAoc2RyMF9wZmMxICYgflNEUjBfUEZDMV9ESVNfTUFTSykgfCBTRFIwX1BGQzFfRElTX1VJQ0lSUTVfU0VMOwotCQl1cGRhdGVfdWljXzRfOV9pcnFfaW9zKCk7CisJCXVwZGF0ZV91aWNfNF85X2lycV9pb3MoZ3Bpb190YWIpOwogCX0KIAogCS8qIERNQSBBQiBTZWxlY3Rpb24gKi8KIAlpZiAocHBjNDQwZXBfY29yZV9zZWxlY3Rpb25bRE1BX0NIQU5ORUxfQUJdID09IENPUkVfU0VMRUNURUQpCiAJewogCQlzZHIwX3BmYzEgPSAoc2RyMF9wZmMxICYgflNEUjBfUEZDMV9ESVNfTUFTSykgfCBTRFIwX1BGQzFfRElTX0RNQVJfU0VMOwotCQl1cGRhdGVfZG1hX2FfYl9pb3MoKTsKKwkJdXBkYXRlX2RtYV9hX2JfaW9zKGdwaW9fdGFiKTsKIAkJZG1hX2FfYl9zZWxlY3Rpb25faW5fZnBnYSgpOwogCX0KIAogCS8qIERNQSBDRCBTZWxlY3Rpb24gKi8KIAlpZiAocHBjNDQwZXBfY29yZV9zZWxlY3Rpb25bRE1BX0NIQU5ORUxfQ0RdID09IENPUkVfU0VMRUNURUQpCiAJewotCQl1cGRhdGVfZG1hX2NfZF9pb3MoKTsKKwkJdXBkYXRlX2RtYV9jX2RfaW9zKGdwaW9fdGFiKTsKIAkJZG1hX2NfZF9zZWxlY3Rpb25faW5fZnBnYSgpOwogCX0KIApAQCAtMTg0OCwxNCArMTk3OSwxNCBAQAogCXsKIAkJc2RyMF9wZmMxID0gKHNkcjBfcGZjMSAmIH5TRFIwX1BGQzFfRVJFX01BU0spIHwgU0RSMF9QRkMxX0VSRV9FWFRSX1NFTDsKIAkJc2RyMF9wZmMxID0gKHNkcjBfcGZjMSAmIH5TRFIwX1BGQzFfVUVTX01BU0spIHwgU0RSMF9QRkMxX1VFU19FQkNIUl9TRUw7Ci0JCXVwZGF0ZV9lYmNfbWFzdGVyX2lvcygpOworCQl1cGRhdGVfZWJjX21hc3Rlcl9pb3MoZ3Bpb190YWIpOwogCX0KIAogCS8qIFBDSSBQYXRjaCBFbmFibGUgKi8KIAlpZiAocHBjNDQwZXBfY29yZV9zZWxlY3Rpb25bUENJX1BBVENIXSA9PSBDT1JFX1NFTEVDVEVEKQogCXsKIAkJc2RyMF9wZmMxID0gKHNkcjBfcGZjMSAmIH5TRFIwX1BGQzFfVUVTX01BU0spIHwgU0RSMF9QRkMxX1VFU19FQkNIUl9TRUw7Ci0JCXVwZGF0ZV9wY2lfcGF0Y2hfaW9zKCk7CisJCXVwZGF0ZV9wY2lfcGF0Y2hfaW9zKGdwaW9fdGFiKTsKIAl9CiAKIAkvKiBVU0IyIEhvc3QgU2VsZWN0aW9uIC0gTm90IEltcGxlbWVudGVkIGluIFBvd2VyUEMgNDQwRVAgUGFzczEgKi8KQEAgLTE4NzEsNyArMjAwMiw3IEBACiAJLyogVVNCMi4wIERldmljZSBTZWxlY3Rpb24gKi8KIAlpZiAocHBjNDQwZXBfY29yZV9zZWxlY3Rpb25bVVNCMl9ERVZJQ0VdID09IENPUkVfU0VMRUNURUQpCiAJewotCQl1cGRhdGVfdXNiMl9kZXZpY2VfaW9zKCk7CisJCXVwZGF0ZV91c2IyX2RldmljZV9pb3MoZ3Bpb190YWIpOwogCQlzZHIwX3BmYzEgPSAoc2RyMF9wZmMxICYgflNEUjBfUEZDMV9VRVNfTUFTSykgfCBTRFIwX1BGQzFfVUVTX1VTQjJEX1NFTDsKIAkJc2RyMF9wZmMxID0gKHNkcjBfcGZjMSAmIH5TRFIwX1BGQzFfVVBSX01BU0spIHwgU0RSMF9QRkMxX1VQUl9ESVNBQkxFOwogCkBAIC0xOTA0LDcgKzIwMzUsNyBAQAogCS8qIE5BTkQgRmxhc2ggU2VsZWN0aW9uICovCiAJaWYgKHBwYzQ0MGVwX2NvcmVfc2VsZWN0aW9uW05BTkRfRkxBU0hdID09IENPUkVfU0VMRUNURUQpCiAJewotCQl1cGRhdGVfbmRmY19pb3MoKTsKKwkJdXBkYXRlX25kZmNfaW9zKGdwaW9fdGFiKTsKIAogI2lmICEoZGVmaW5lZChDT05GSUdfTkFORF9VX0JPT1QpIHx8IGRlZmluZWQoQ09ORklHX05BTkRfU1BMKSkKIAkJbXRzZHIoc2RyX2N1c3QwLCBTRFIwX0NVU1QwX01VWF9OREZDX1NFTCAgIHwKQEAgLTE5MzMsNyArMjA2NCw3IEBACiAJLyogTUlJIFNlbGVjdGlvbiAqLwogCWlmIChwcGM0NDBlcF9jb3JlX3NlbGVjdGlvbltNSUlfU0VMXSA9PSBDT1JFX1NFTEVDVEVEKQogCXsKLQkJdXBkYXRlX3ppaV9pb3MoKTsKKwkJdXBkYXRlX3ppaV9pb3MoZ3Bpb190YWIpOwogCQltZnNkcihzZHJfbWZyLCBzZHIwX21mcik7CiAJCXNkcjBfbWZyID0gKHNkcjBfbWZyICYgflNEUjBfTUZSX1pNSUlfTU9ERV9NQVNLKSB8IFNEUjBfTUZSX1pNSUlfTU9ERV9NSUk7CiAJCW10c2RyKHNkcl9tZnIsIHNkcjBfbWZyKTsKQEAgLTE5NDQsNyArMjA3NSw3IEBACiAJLyogUk1JSSBTZWxlY3Rpb24gKi8KIAlpZiAocHBjNDQwZXBfY29yZV9zZWxlY3Rpb25bUk1JSV9TRUxdID09IENPUkVfU0VMRUNURUQpCiAJewotCQl1cGRhdGVfemlpX2lvcygpOworCQl1cGRhdGVfemlpX2lvcyhncGlvX3RhYik7CiAJCW1mc2RyKHNkcl9tZnIsIHNkcjBfbWZyKTsKIAkJc2RyMF9tZnIgPSAoc2RyMF9tZnIgJiB+U0RSMF9NRlJfWk1JSV9NT0RFX01BU0spIHwgU0RSMF9NRlJfWk1JSV9NT0RFX1JNSUlfMTBNOwogCQltdHNkcihzZHJfbWZyLCBzZHIwX21mcik7CkBAIC0xOTU1LDcgKzIwODYsNyBAQAogCS8qIFNNSUkgU2VsZWN0aW9uICovCiAJaWYgKHBwYzQ0MGVwX2NvcmVfc2VsZWN0aW9uW1NNSUlfU0VMXSA9PSBDT1JFX1NFTEVDVEVEKQogCXsKLQkJdXBkYXRlX3ppaV9pb3MoKTsKKwkJdXBkYXRlX3ppaV9pb3MoZ3Bpb190YWIpOwogCQltZnNkcihzZHJfbWZyLCBzZHIwX21mcik7CiAJCXNkcjBfbWZyID0gKHNkcjBfbWZyICYgflNEUjBfTUZSX1pNSUlfTU9ERV9NQVNLKSB8IFNEUjBfTUZSX1pNSUlfTU9ERV9TTUlJOwogCQltdHNkcihzZHJfbWZyLCBzZHIwX21mcik7CkBAIC0xOTkyLDcgKzIxMjMsNyBAQAogCQlzZHIwX3BmYzEgPSAoc2RyMF9wZmMxICYgflNEUjBfUEZDMV9VMU1FX01BU0spIHwgU0RSMF9QRkMxX1UxTUVfRFNSX0RUUjsKIAkJYnJlYWs7CiAJfQotCXVwZGF0ZV91YXJ0X2lvcyh1YXJ0X2NvbmZpZ3VyYXRpb24pOworCXVwZGF0ZV91YXJ0X2lvcyh1YXJ0X2NvbmZpZ3VyYXRpb24sIGdwaW9fdGFiKTsKIAogCS8qIFVBUlQgU2VsZWN0aW9uIGluIGFsbCBjYXNlcyAqLwogCXVhcnRfc2VsZWN0aW9uX2luX2ZwZ2EodWFydF9jb25maWd1cmF0aW9uKTsKQEAgLTIwMTQsOCArMjE0NSw4IEBACiAKIAkvKiBQZXJmb3JtIGVmZmVjdGl2ZSBhY2Nlc3MgdG8gaGFyZHdhcmUgKi8KIAltdHNkcihzZHJfcGZjMSwgc2RyMF9wZmMxKTsKLQlzZXRfY2hpcF9ncGlvX2NvbmZpZ3VyYXRpb24oR1BJTzApOwotCXNldF9jaGlwX2dwaW9fY29uZmlndXJhdGlvbihHUElPMSk7CisJc2V0X2NoaXBfZ3Bpb19jb25maWd1cmF0aW9uKEdQSU8wLCBncGlvX3RhYik7CisJc2V0X2NoaXBfZ3Bpb19jb25maWd1cmF0aW9uKEdQSU8xLCBncGlvX3RhYik7CiAKIAkvKiBVU0IyLjAgRGV2aWNlIFJlc2V0IG11c3QgYmUgZG9uZSBhZnRlciBHUElPIHNldHRpbmcgKi8KIAlpZiAocHBjNDQwZXBfY29yZV9zZWxlY3Rpb25bVVNCMl9ERVZJQ0VdID09IENPUkVfU0VMRUNURUQpCmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL2JhbWJvby9pbml0LlMgYi9ib2FyZC9hbWNjL2JhbWJvby9pbml0LlMKaW5kZXggMTQ1OWVlYy4uZjRkMmFlMyAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9iYW1ib28vaW5pdC5TCisrKyBiL2JvYXJkL2FtY2MvYmFtYm9vL2luaXQuUwpAQCAtNTEsMTMgKzUxLDEyIEBACiAJdGxiZW50cnkoQ0ZHX0JPT1RfQkFTRV9BRERSLCBTWl8yNTZNLCBDRkdfQk9PVF9CQVNFX0FERFIsIDAsIEFDX1J8QUNfV3xBQ19YfFNBX0cpCiAjZWxzZQogCXRsYmVudHJ5KENGR19OQU5EX0JPT1RfU1BMX1NSQywgU1pfNEssIENGR19OQU5EX0JPT1RfU1BMX1NSQywgMCwgQUNfUnxBQ19XfEFDX1h8U0FfRykKKwl0bGJlbnRyeShDRkdfU0RSQU1fQkFTRSwgU1pfMjU2TSwgQ0ZHX1NEUkFNX0JBU0UsIDAsIEFDX1J8QUNfV3xBQ19YfFNBX0d8U0FfSSkKICNlbmRpZgogCiAJLyogVExCLWVudHJ5IGZvciBpbml0LXJhbSBpbiBkY2FjaGUgKFNBX0kgbXVzdCBiZSB0dXJuZWQgb2ZmISkgKi8KIAl0bGJlbnRyeShDRkdfSU5JVF9SQU1fQUREUiwgU1pfNEssIENGR19JTklUX1JBTV9BRERSLCAwLCBBQ19SfEFDX1d8QUNfWHxTQV9HKQogCi0JdGxiZW50cnkoQ0ZHX1NEUkFNX0JBU0UsIFNaXzI1Nk0sIENGR19TRFJBTV9CQVNFLCAwLCBBQ19SfEFDX1d8QUNfWHxTQV9HfFNBX0kpCi0KIAkvKiBQQ0kgYmFzZSAmIHBlcmlwaGVyYWxzICovCiAJdGxiZW50cnkoQ0ZHX1BDSV9CQVNFLCBTWl8yNTZNLCBDRkdfUENJX0JBU0UsIDAsIEFDX1J8QUNfV3xTQV9HfFNBX0kpCiAKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MvYmFtYm9vL3UtYm9vdC5sZHMgYi9ib2FyZC9hbWNjL2JhbWJvby91LWJvb3QubGRzCmluZGV4IGY2ZDcxODMuLjAzNzU2MTggMTAwNjQ0Ci0tLSBhL2JvYXJkL2FtY2MvYmFtYm9vL3UtYm9vdC5sZHMKKysrIGIvYm9hcmQvYW1jYy9iYW1ib28vdS1ib290LmxkcwpAQCAtMTQxLDggKzE0MSw2IEBACiAgICAqKENPTU1PTikKICAgfQogCi0gIHBwY2Vudl9hc3NlcnQgPSBBU1NFUlQoLiA8IDB4RkZGRjgwMDAsICIuYnNzIHNlY3Rpb24gdG9vIGJpZywgb3ZlcmxhcHMgLnBwY2VudiBzZWN0aW9uLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29uZmd1cmF0aW9uOiBDRkdfTU9OSVRPUl9CQVNFLCBDRkdfTU9OSVRPUl9MRU4gYW5kIFRFWFRfQkFTRSBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4iKTsKLQogICBfZW5kID0gLiA7CiAgIFBST1ZJREUgKGVuZCA9IC4pOwogfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy9idWJpbmdhL2J1YmluZ2EuYyBiL2JvYXJkL2FtY2MvYnViaW5nYS9idWJpbmdhLmMKaW5kZXggZmU2Y2U4YS4uNjZlNzUwOSAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9idWJpbmdhL2J1YmluZ2EuYworKysgYi9ib2FyZC9hbWNjL2J1YmluZ2EvYnViaW5nYS5jCkBAIC0yMCwxMCArMjAsMTIgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAgKiBNQSAwMjExMS0xMzA3IFVTQQogICovCi1sb25nIGludCBzcGRfc2RyYW0odm9pZCk7CiAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK2xvbmcgaW50IHNwZF9zZHJhbSh2b2lkKTsKIAogaW50IGJvYXJkX2Vhcmx5X2luaXRfZih2b2lkKQogewpAQCAtMzQsNiArMzYsMTUgQEAKIAltdGRjcih1aWN0ciwgMHgwMDAwMDAxMCk7CS8qIHNldCBpbnQgdHJpZ2dlciBsZXZlbHMgKi8KIAltdGRjcih1aWNzciwgMHhGRkZGRkZGRik7CS8qIGNsZWFyIGFsbCBpbnRzICovCiAKKwkvKgorCSAqIENvbmZpZ3VyZSBDUEMwX1BDSSB0byBlbmFibGUgUGVyV0UgYXMgb3V0cHV0CisJICogYW5kIGVuYWJsZSB0aGUgaW50ZXJuYWwgUENJIGFyYml0ZXIgaWYgc2VsZWN0ZWQKKwkgKi8KKwlpZiAoaW5fOCgodm9pZCAqKUZQR0FfUkVHMSkgJiBGUEdBX1JFRzFfUENJX0lOVF9BUkIpCisJCW10ZGNyKGNwYzBfcGNpLCBDUEMwX1BDSV9IT1NUX0NGR19FTiB8IENQQzBfUENJX0FSQklUX0VOKTsKKwllbHNlCisJCW10ZGNyKGNwYzBfcGNpLCBDUEMwX1BDSV9IT1NUX0NGR19FTik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy9jb21tb24vZmxhc2guYyBiL2JvYXJkL2FtY2MvY29tbW9uL2ZsYXNoLmMKaW5kZXggZTY0MjllYy4uZWJhMDUxMSAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9jb21tb24vZmxhc2guYworKysgYi9ib2FyZC9hbWNjL2NvbW1vbi9mbGFzaC5jCkBAIC03NDUsMTkgKzc0NSwyNyBAQAogCQlpZiAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9CVFlQRSkgewogCQkJLyogc2V0IHNlY3RvciBvZmZzZXRzIGZvciBib3R0b20gYm9vdCBibG9jayB0eXBlICovCiAJCQlpbmZvLT5zdGFydFswXSA9IGJhc2UgKyAweDAwMDAwMDAwOwotCQkJaW5mby0+c3RhcnRbMV0gPSBiYXNlICsgMHgwMDAwNDAwMDsKLQkJCWluZm8tPnN0YXJ0WzJdID0gYmFzZSArIDB4MDAwMDYwMDA7Ci0JCQlpbmZvLT5zdGFydFszXSA9IGJhc2UgKyAweDAwMDA4MDAwOwotCQkJZm9yIChpID0gNDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCQlpbmZvLT5zdGFydFsxXSA9IGJhc2UgKyAweDAwMDAyMDAwOworCQkJaW5mby0+c3RhcnRbMl0gPSBiYXNlICsgMHgwMDAwNDAwMDsKKwkJCWluZm8tPnN0YXJ0WzNdID0gYmFzZSArIDB4MDAwMDYwMDA7CisJCQlpbmZvLT5zdGFydFs0XSA9IGJhc2UgKyAweDAwMDA4MDAwOworCQkJaW5mby0+c3RhcnRbNV0gPSBiYXNlICsgMHgwMDAwYTAwMDsKKwkJCWluZm8tPnN0YXJ0WzZdID0gYmFzZSArIDB4MDAwMGMwMDA7CisJCQlpbmZvLT5zdGFydFs3XSA9IGJhc2UgKyAweDAwMDBlMDAwOworCQkJZm9yIChpID0gODsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CiAJCQkJaW5mby0+c3RhcnRbaV0gPQotCQkJCSAgICBiYXNlICsgKGkgKiAweDAwMDEwMDAwKSAtIDB4MDAwMzAwMDA7CisJCQkJICAgIGJhc2UgKyAoKGktNykgKiAweDAwMDEwMDAwKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIHNldCBzZWN0b3Igb2Zmc2V0cyBmb3IgdG9wIGJvb3QgYmxvY2sgdHlwZSAqLwogCQkJaSA9IGluZm8tPnNlY3Rvcl9jb3VudCAtIDE7CisJCQlpbmZvLT5zdGFydFtpLS1dID0gYmFzZSArIGluZm8tPnNpemUgLSAweDAwMDAyMDAwOwogCQkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAwNDAwMDsKIAkJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMDYwMDA7CiAJCQlpbmZvLT5zdGFydFtpLS1dID0gYmFzZSArIGluZm8tPnNpemUgLSAweDAwMDA4MDAwOworCQkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAwYTAwMDsKKwkJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMGMwMDA7CisJCQlpbmZvLT5zdGFydFtpLS1dID0gYmFzZSArIGluZm8tPnNpemUgLSAweDAwMDBlMDAwOwogCQkJZm9yICg7IGkgPj0gMDsgaS0tKSB7CiAJCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgaSAqIDB4MDAwMTAwMDA7CiAJCQl9CmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL2x1YW4vbHVhbi5jIGIvYm9hcmQvYW1jYy9sdWFuL2x1YW4uYwppbmRleCAyZWZmM2IzLi43YjE2ZjhhIDEwMDY0NAotLS0gYS9ib2FyZC9hbWNjL2x1YW4vbHVhbi5jCisrKyBiL2JvYXJkL2FtY2MvbHVhbi9sdWFuLmMKQEAgLTEwNCw2ICsxMDQsMTMgQEAKIAlyZXR1cm4gIDA7CiB9CiAKKy8qCisgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgaW4gY3B1L3BwYzR4eC80NHhfc3BkX2RkcjIuYyB3aXRoCisgKiBib2FyZCBzcGVjaWZpYyB2YWx1ZXMuCisgKi8KK3UzMiBkZHJfY2xrdHIodTMyIGRlZmF1bHRfdmFsKSB7CisJcmV0dXJuIChTRFJBTV9DTEtUUl9DTEtQXzE4MF9ERUdfQURWKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBpbnQgdGVzdGRyYW0oKQpkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy90YWlodS9NYWtlZmlsZSBiL2JvYXJkL2FtY2MvdGFpaHUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczMWM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FtY2MvdGFpaHUvTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk9ICQoQk9BUkQpLm8gZmxhc2gubyBsY2QubyB1cGRhdGUubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MvdGFpaHUvY29uZmlnLm1rIGIvYm9hcmQvYW1jYy90YWlodS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkZjVlNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FtY2MvdGFpaHUvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1RFWFRfQkFTRSA9IDB4RkZGQzAwMDAKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MvdGFpaHUvZmxhc2guYyBiL2JvYXJkL2FtY2MvdGFpaHUvZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAyNTllCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYW1jYy90YWlodS9mbGFzaC5jCkBAIC0wLDAgKzEsMTA4MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogTW9kaWZpZWQgNC81LzIwMDEKKyAqIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzZWN0b3IgZXJhc2UgY29tbWFuZCBpc3N1ZWQKKyAqIDQvNS8yMDAxCisgKiBDaHJpcyBIYWxsaW5hbiAtIERTNC5DT00sIEluYy4gLSBjbGhAbmV0MXBsdXMuY29tCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CS8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICAgICAgICAqLworCisjdW5kZWYgREVCVUcKKyNpZmRlZiBERUJVRworI2RlZmluZSBERUJVR0YoeC4uLikgcHJpbnRmKHgpCisjZWxzZQorI2RlZmluZSBERUJVR0YoeC4uLikKKyNlbmRpZgkJCQkvKiBERUJVRyAqLworCisjZGVmaW5lIENGR19GTEFTSF9DSEFSX1NJWkUgdW5zaWduZWQgY2hhcgorI2RlZmluZSBDRkdfRkxBU0hfQ0hBUl9BRERSMCAoMHgwYWFhKQorI2RlZmluZSBDRkdfRkxBU0hfQ0hBUl9BRERSMSAoMHgwNTU1KQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb25zCisgKi8KK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSh2dV9sb25nICogYWRkciwgZmxhc2hfaW5mb190ICogaW5mbyk7CitzdGF0aWMgdm9pZCBmbGFzaF9nZXRfb2Zmc2V0cyh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3N0YXRpYyBpbnQgd3JpdGVfd29yZChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKTsKKyNpZmRlZiBGTEFTSF9CQVNFMV9QUkVMSU0KK3N0YXRpYyBpbnQgd3JpdGVfd29yZF8xKGZsYXNoX2luZm9fdCAqIGluZm8sIHVsb25nIGRlc3QsIHVsb25nIGRhdGEpOworc3RhdGljIGludCB3cml0ZV93b3JkXzIoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSk7CitzdGF0aWMgaW50IGZsYXNoX2VyYXNlXzEoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpOworc3RhdGljIGludCBmbGFzaF9lcmFzZV8yKGZsYXNoX2luZm9fdCAqIGluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KTsKK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZV8xKHZ1X2xvbmcgKiBhZGRyLCBmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZV8yKHZ1X2xvbmcgKiBhZGRyLCBmbGFzaF9pbmZvX3QgKiBpbmZvKTsKKyNlbmRpZgorCit1bnNpZ25lZCBsb25nIGZsYXNoX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemVfYjAsIHNpemVfYjE9MDsKKwlpbnQgaTsKKworCS8qIEluaXQ6IG5vIEZMQVNIZXMga25vd24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ0ZHX01BWF9GTEFTSF9CQU5LUzsgKytpKSB7CisJCWZsYXNoX2luZm9baV0uZmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCX0KKworCS8qIFN0YXRpYyBGTEFTSCBCYW5rIGNvbmZpZ3VyYXRpb24gaGVyZSAtIEZJWE1FIFhYWCAqLworCisJc2l6ZV9iMCA9CisJICAgIGZsYXNoX2dldF9zaXplKCh2dV9sb25nICopIEZMQVNIX0JBU0UwX1BSRUxJTSwgJmZsYXNoX2luZm9bMF0pOworCisJaWYgKGZsYXNoX2luZm9bMF0uZmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYoIiMjIFVua25vd24gRkxBU0ggb24gQmFuayAwIC0gU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCisJCSAgICAgICBzaXplX2IwLCBzaXplX2IwIDw8IDIwKTsKKwl9CisKKwlpZiAoc2l6ZV9iMCkgeworCQkvKiBTZXR1cCBvZmZzZXRzICovCisJCWZsYXNoX2dldF9vZmZzZXRzKEZMQVNIX0JBU0UwX1BSRUxJTSwgJmZsYXNoX2luZm9bMF0pOworCQkvKiBNb25pdG9yIHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworCQkodm9pZClmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQkJICAgIENGR19NT05JVE9SX0JBU0UsCisJCQkJICAgIENGR19NT05JVE9SX0JBU0UgKyBDRkdfTU9OSVRPUl9MRU4gLSAxLAorCQkJCSAgICAmZmxhc2hfaW5mb1swXSk7CisjaWZkZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAorCQkodm9pZClmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsIENGR19FTlZfQUREUiwKKwkJCQkgICAgQ0ZHX0VOVl9BRERSICsgQ0ZHX0VOVl9TRUNUX1NJWkUgLSAxLAorCQkJCSAgICAmZmxhc2hfaW5mb1swXSk7CisJCSh2b2lkKWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwgQ0ZHX0VOVl9BRERSX1JFRFVORCwKKwkJCQkgICAgQ0ZHX0VOVl9BRERSX1JFRFVORCArIENGR19FTlZfU0VDVF9TSVpFIC0gMSwKKwkJCQkgICAgJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCisJCS8qIEFsc28gcHJvdGVjdCBzZWN0b3IgY29udGFpbmluZyBpbml0aWFsIHBvd2VyLXVwIGluc3RydWN0aW9uICovCisJCS8qIChmbGFzaF9wcm90ZWN0KCkgY2hlY2tzIGFkZHJlc3MgcmFuZ2UgLSBvdGhlciBjYWxsIGlnbm9yZWQpICovCisJCSh2b2lkKWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKKwkJCQkgICAgMHhGRkZGRkZGQywgMHhGRkZGRkZGRiwgJmZsYXNoX2luZm9bMF0pOworCisJCWZsYXNoX2luZm9bMF0uc2l6ZSA9IHNpemVfYjA7CisJfQorI2lmZGVmIEZMQVNIX0JBU0UxX1BSRUxJTQorCXNpemVfYjEgPQorCSAgICBmbGFzaF9nZXRfc2l6ZSgodnVfbG9uZyAqKSBGTEFTSF9CQVNFMV9QUkVMSU0sICZmbGFzaF9pbmZvWzFdKSoyOworCisJaWYgKGZsYXNoX2luZm9bMV0uZmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYoIiMjIFVua25vd24gRkxBU0ggb24gQmFuayAxIC0gU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCisJCSAgICAgICBzaXplX2IxLCBzaXplX2IxIDw8IDIwKTsKKwl9CisKKwlpZiAoc2l6ZV9iMSkgeworCQkvKiBTZXR1cCBvZmZzZXRzICovCisJCWZsYXNoX2dldF9vZmZzZXRzKEZMQVNIX0JBU0UxX1BSRUxJTSwgJmZsYXNoX2luZm9bMV0pOworCQlmbGFzaF9pbmZvWzFdLnNpemUgPSBzaXplX2IxOworCX0KKyNlbmRpZgorCXJldHVybiAoc2l6ZV9iMCArIHNpemVfYjEpOworfQorCitzdGF0aWMgdm9pZCBmbGFzaF9nZXRfb2Zmc2V0cyh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCWludCBpOworCisJLyogc2V0IHVwIHNlY3RvciBzdGFydCBhZGRyZXNzIHRhYmxlICovCisJaWYgKCgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgPT0gRkxBU0hfTUFOX1NTVCkgfHwKKwkgICAgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX0FNMDQwKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspCisJCQlpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyAoaSAqIDB4MDAwMTAwMDApOworCX0gZWxzZSBpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX0FNTFYxMjhVKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgKGkgKiAweDAwMDEwMDAwKjIpOworCQl9CisJfSBlbHNlIGlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfUzI5R0wxMjhOICkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJCWluZm8tPnN0YXJ0W2ldID0gYmFzZSArIChpICogMHgwMDAyMDAwMCoyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX0JUWVBFKSB7CisJCQkvKiBzZXQgc2VjdG9yIG9mZnNldHMgZm9yIGJvdHRvbSBib290IGJsb2NrIHR5cGUgICAgICAgICovCisJCQlpbmZvLT5zdGFydFswXSA9IGJhc2UgKyAweDAwMDAwMDAwOworCQkJaW5mby0+c3RhcnRbMV0gPSBiYXNlICsgMHgwMDAwNDAwMDsKKwkJCWluZm8tPnN0YXJ0WzJdID0gYmFzZSArIDB4MDAwMDYwMDA7CisJCQlpbmZvLT5zdGFydFszXSA9IGJhc2UgKyAweDAwMDA4MDAwOworCQkJZm9yIChpID0gNDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCQkJaW5mby0+c3RhcnRbaV0gPQorCQkJCSAgICBiYXNlICsgKGkgKiAweDAwMDEwMDAwKSAtIDB4MDAwMzAwMDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBzZXQgc2VjdG9yIG9mZnNldHMgZm9yIHRvcCBib290IGJsb2NrIHR5cGUgICAgICAgICAgICovCisJCQlpID0gaW5mby0+c2VjdG9yX2NvdW50IC0gMTsKKwkJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMDQwMDA7CisJCQlpbmZvLT5zdGFydFtpLS1dID0gYmFzZSArIGluZm8tPnNpemUgLSAweDAwMDA2MDAwOworCQkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAwODAwMDsKKwkJCWZvciAoOyBpID49IDA7IGktLSkgeworCQkJCWluZm8tPnN0YXJ0W2ldID0gYmFzZSArIGkgKiAweDAwMDEwMDAwOworCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyhmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCWludCBpOworCWludCBrOworCWludCBzaXplOworCWludCBlcmFzZWQ7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqZmxhc2g7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYoIm1pc3Npbmcgb3IgdW5rbm93biBGTEFTSCB0eXBlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgeworCWNhc2UgRkxBU0hfTUFOX0FNRDoKKwkJcHJpbnRmKCJBTUQgIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfTUFOX1NUTToKKwkJcHJpbnRmKCJTVE0gIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfTUFOX0ZVSjoKKwkJcHJpbnRmKCJGVUpJVFNVICIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX01BTl9TU1Q6CisJCXByaW50ZigiU1NUICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVua25vd24gVmVuZG9yICIpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwljYXNlIEZMQVNIX0FNMDQwOgorCQlwcmludGYoIkFNMjlGMDQwICg1MTIgS2JpdCwgdW5pZm9ybSBzZWN0b3Igc2l6ZSlcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0FNNDAwQjoKKwkJcHJpbnRmKCJBTTI5TFY0MDBCICg0IE1iaXQsIGJvdHRvbSBib290IHNlY3QpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTQwMFQ6CisJCXByaW50ZigiQU0yOUxWNDAwVCAoNCBNYml0LCB0b3AgYm9vdCBzZWN0b3IpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTgwMEI6CisJCXByaW50ZigiQU0yOUxWODAwQiAoOCBNYml0LCBib3R0b20gYm9vdCBzZWN0KVxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQU04MDBUOgorCQlwcmludGYoIkFNMjlMVjgwMFQgKDggTWJpdCwgdG9wIGJvb3Qgc2VjdG9yKVxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQU1EMDE2OgorCQlwcmludGYoIkFNMjlGMDE2RCAoMTYgTWJpdCwgdW5pZm9ybSBzZWN0b3Igc2l6ZSlcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMTYwQjoKKwkJcHJpbnRmKCJBTTI5TFYxNjBCICgxNiBNYml0LCBib3R0b20gYm9vdCBzZWN0KVxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQU0xNjBUOgorCQlwcmludGYoIkFNMjlMVjE2MFQgKDE2IE1iaXQsIHRvcCBib290IHNlY3RvcilcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMzIwQjoKKwkJcHJpbnRmKCJBTTI5TFYzMjBCICgzMiBNYml0LCBib3R0b20gYm9vdCBzZWN0KVxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQU0zMjBUOgorCQlwcmludGYoIkFNMjlMVjMyMFQgKDMyIE1iaXQsIHRvcCBib290IHNlY3RvcilcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMDMzQzoKKwkJcHJpbnRmKCJBTTI5TFYwMzNDICgzMiBNYml0LCB0b3AgYm9vdCBzZWN0b3IpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTUxWMTI4VToKKwkJcHJpbnRmKCJBTTI5TFYxMjhVICgxMjggTWJpdCAqIDIsIHRvcCBib290IHNlY3RvcilcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX1NTVDgwMEE6CisJCXByaW50ZigiU1NUMzlMRi9WRjgwMCAoOCBNYml0LCB1bmlmb3JtIHNlY3RvciBzaXplKVxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfU1NUMTYwQToKKwkJcHJpbnRmKCJTU1QzOUxGL1ZGMTYwICgxNiBNYml0LCB1bmlmb3JtIHNlY3RvciBzaXplKVxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfU1RNVzMyMERUOgorCQlwcmludGYgKCJNMjlXMzIwRFQgKDMyIE0sIHRvcCBzZWN0b3IpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9TMjlHTDEyOE46CisJCXByaW50ZiAoIlMyOUdMMTI4TiAoMjU2IE1iaXQsIHVuaWZvcm0gc2VjdG9yIHNpemUpXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIENoaXAgVHlwZVxuIik7CisJCWJyZWFrOworCX0KKworCXByaW50ZigiICBTaXplOiAlbGQgS0IgaW4gJWQgU2VjdG9yc1xuIiwKKwkgICAgICAgaW5mby0+c2l6ZSA+PiAxMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworCXByaW50ZigiICBTZWN0b3IgU3RhcnQgQWRkcmVzc2VzOiIpOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7ICsraSkgeworCQkvKgorCQkgKiBDaGVjayBpZiB3aG9sZSBzZWN0b3IgaXMgZXJhc2VkCisJCSAqLworCQlpZiAoaSAhPSAoaW5mby0+c2VjdG9yX2NvdW50IC0gMSkpCisJCQlzaXplID0gaW5mby0+c3RhcnRbaSArIDFdIC0gaW5mby0+c3RhcnRbaV07CisJCWVsc2UKKwkJCXNpemUgPSBpbmZvLT5zdGFydFswXSArIGluZm8tPnNpemUgLSBpbmZvLT5zdGFydFtpXTsKKwkJZXJhc2VkID0gMTsKKwkJZmxhc2ggPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWluZm8tPnN0YXJ0W2ldOworCQlzaXplID0gc2l6ZSA+PiAyOwkvKiBkaXZpZGUgYnkgNCBmb3IgbG9uZ3dvcmQgYWNjZXNzICovCisJCWZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspIHsKKwkJCWlmICgqZmxhc2grKyAhPSAweGZmZmZmZmZmKSB7CisJCQkJZXJhc2VkID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICgoaSAlIDUpID09IDApCisJCQlwcmludGYoIlxuICAgIik7CisJCXByaW50ZigiICUwOGxYJXMlcyIsCisJCSAgICAgICBpbmZvLT5zdGFydFtpXSwKKwkJICAgICAgIGVyYXNlZCA/ICIgRSIgOiAiICAiLCBpbmZvLT5wcm90ZWN0W2ldID8gIlJPICIgOiAiICAgIik7CisJfQorCXByaW50ZigiXG4iKTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBjYW5ub3QgYmUgcnVuIGZyb20gRkxBU0ghCisgKi8KKyNpZmRlZiBGTEFTSF9CQVNFMV9QUkVMSU0KK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSh2dV9sb25nICogYWRkciwgZmxhc2hfaW5mb190ICogaW5mbykKK3sKKwlpZiAoKHVsb25nKWFkZHIgPT0gRkxBU0hfQkFTRTFfUFJFTElNKSB7CisJCXJldHVybiBmbGFzaF9nZXRfc2l6ZV8yKGFkZHIsIGluZm8pOworCX0gZWxzZSB7CisJCXJldHVybiBmbGFzaF9nZXRfc2l6ZV8xKGFkZHIsIGluZm8pOworCX0KK30KKworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplXzEodnVfbG9uZyAqIGFkZHIsIGZsYXNoX2luZm9fdCAqIGluZm8pCisjZWxzZQorc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplKHZ1X2xvbmcgKiBhZGRyLCBmbGFzaF9pbmZvX3QgKiBpbmZvKQorI2VuZGlmCit7CisJc2hvcnQgaTsKKwlDRkdfRkxBU0hfV09SRF9TSVpFIHZhbHVlOworCXVsb25nIGJhc2UgPSAodWxvbmcpIGFkZHI7CisJdm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqYWRkcjIgPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSBhZGRyOworCisJREVCVUdGKCJGTEFTSCBBRERSOiAlMDh4XG4iLCAodW5zaWduZWQpYWRkcik7CisKKwkvKiBXcml0ZSBhdXRvIHNlbGVjdCBjb21tYW5kOiByZWFkIE1hbnVmYWN0dXJlciBJRCAqLworCWFkZHIyW0NGR19GTEFTSF9BRERSMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMEFBMDBBQTsKKwlhZGRyMltDRkdfRkxBU0hfQUREUjFdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJYWRkcjJbQ0ZHX0ZMQVNIX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwOTAwMDkwOworCXVkZWxheSgxMDAwKTsKKworCXZhbHVlID0gYWRkcjJbMF07CisJREVCVUdGKCJGTEFTSCBNQU5VRkFDVDogJXhcbiIsIHZhbHVlKTsKKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKSBBTURfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0FNRDsKKwkJYnJlYWs7CisJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgRlVKX01BTlVGQUNUOgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9GVUo7CisJCWJyZWFrOworCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpIFNTVF9NQU5VRkFDVDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fU1NUOworCQlicmVhazsKKwljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKSBTVE1fTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX1NUTTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAwOworCQlpbmZvLT5zaXplID0gMDsKKwkJcmV0dXJuIDA7CS8qIG5vIG9yIHVua25vd24gZmxhc2ggICovCisJfQorCisJdmFsdWUgPSBhZGRyMlsxXTsJLyogZGV2aWNlIElEICAgICAgICAgICAgKi8KKwlERUJVR0YoIlxuRkxBU0ggREVWSUNFSUQ6ICV4XG4iLCB2YWx1ZSk7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgQU1EX0lEX0xWMDQwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0wNDA7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJCWluZm8tPnNpemUgPSAweDAwODAwMDA7CS8qID0+IDUxMiBrbyAqLworCQlicmVhazsKKworCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpIEFNRF9JRF9GMDQwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0wNDA7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJCWluZm8tPnNpemUgPSAweDAwODAwMDA7CS8qID0+IDUxMiBrbyAqLworCQlicmVhazsKKworCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpIFNUTV9JRF9NMjlXMDQwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0wNDA7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJCWluZm8tPnNpemUgPSAweDAwODAwMDA7CS8qID0+IDUxMiBrbyAqLworCQlicmVhazsKKworCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpIEFNRF9JRF9GMDE2RDoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU1EMDE2OworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAzMjsKKwkJaW5mby0+c2l6ZSA9IDB4MDAyMDAwMDA7CisJCWJyZWFrOwkJLyogPT4gMiBNQiAgICAgICAgICAgICAgKi8KKworCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpIEFNRF9JRF9MVjAzM0M6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNRExWMDMzQzsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gNjQ7CisJCWluZm8tPnNpemUgPSAweDAwNDAwMDAwOworCQlicmVhazsJCS8qID0+IDQgTUIgICAgICAgICAgICAgICovCisKKwljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKSBBTURfSURfTFY0MDBUOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTQwMFQ7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDExOworCQlpbmZvLT5zaXplID0gMHgwMDA4MDAwMDsKKwkJYnJlYWs7CQkvKiA9PiAwLjUgTUIgICAgICAgICAgICAqLworCisJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgQU1EX0lEX0xWNDAwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU00MDBCOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxMTsKKwkJaW5mby0+c2l6ZSA9IDB4MDAwODAwMDA7CisJCWJyZWFrOwkJLyogPT4gMC41IE1CICAgICAgICAgICAgKi8KKworCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpIEFNRF9JRF9MVjgwMFQ6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNODAwVDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTk7CisJCWluZm8tPnNpemUgPSAweDAwMTAwMDAwOworCQlicmVhazsJCS8qID0+IDEgTUIgICAgICAgICAgICAgICovCisKKwljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKSBBTURfSURfTFY4MDBCOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTgwMEI7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDE5OworCQlpbmZvLT5zaXplID0gMHgwMDEwMDAwMDsKKwkJYnJlYWs7CQkvKiA9PiAxIE1CICAgICAgICAgICAgICAqLworCisJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgQU1EX0lEX0xWMTYwVDoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0xNjBUOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAzNTsKKwkJaW5mby0+c2l6ZSA9IDB4MDAyMDAwMDA7CisJCWJyZWFrOwkJLyogPT4gMiBNQiAgICAgICAgICAgICAgKi8KKworCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpIEFNRF9JRF9MVjE2MEI6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMTYwQjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMzU7CisJCWluZm8tPnNpemUgPSAweDAwMjAwMDAwOworCQlicmVhazsJCS8qID0+IDIgTUIgICAgICAgICAgICAgICovCisJZGVmYXVsdDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQlyZXR1cm4gMDsJLyogPT4gbm8gb3IgdW5rbm93biBmbGFzaCAqLworCX0KKworCS8qIHNldCB1cCBzZWN0b3Igc3RhcnQgYWRkcmVzcyB0YWJsZSAqLworCWlmICgoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09IEZMQVNIX01BTl9TU1QpIHx8CisJICAgICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfQU0wNDApIHx8CisJICAgICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfQU1EMDE2KSkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspCisJCQlpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyAoaSAqIDB4MDAwMTAwMDApOworCX0KKwllbHNlIGlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfQU1MVjEyOFUpIHsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKQorCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgKGkgKiAweDAwMDEwMDAwICogMik7CisJfSBlbHNlIHsKKwkJaWYgKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfQlRZUEUpIHsKKwkJCS8qIHNldCBzZWN0b3Igb2Zmc2V0cyBmb3IgYm90dG9tIGJvb3QgYmxvY2sgdHlwZSAgICAgICAgKi8KKwkJCWluZm8tPnN0YXJ0WzBdID0gYmFzZSArIDB4MDAwMDAwMDA7CisJCQlpbmZvLT5zdGFydFsxXSA9IGJhc2UgKyAweDAwMDA0MDAwOworCQkJaW5mby0+c3RhcnRbMl0gPSBiYXNlICsgMHgwMDAwNjAwMDsKKwkJCWluZm8tPnN0YXJ0WzNdID0gYmFzZSArIDB4MDAwMDgwMDA7CisJCQlmb3IgKGkgPSA0OyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJCQlpbmZvLT5zdGFydFtpXSA9CisJCQkJICAgIGJhc2UgKyAoaSAqIDB4MDAwMTAwMDApIC0gMHgwMDAzMDAwMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHNldCBzZWN0b3Igb2Zmc2V0cyBmb3IgdG9wIGJvb3QgYmxvY2sgdHlwZSAgICAgICAgICAgKi8KKwkJCWkgPSBpbmZvLT5zZWN0b3JfY291bnQgLSAxOworCQkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAwNDAwMDsKKwkJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMDYwMDA7CisJCQlpbmZvLT5zdGFydFtpLS1dID0gYmFzZSArIGluZm8tPnNpemUgLSAweDAwMDA4MDAwOworCQkJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgaSAqIDB4MDAwMTAwMDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjaGVjayBmb3IgcHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJLyogcmVhZCBzZWN0b3IgcHJvdGVjdGlvbiBhdCBzZWN0b3IgYWRkcmVzcywgKEE3IC4uIEEwKSA9IDB4MDIgKi8KKwkJLyogRDAgPSAxIGlmIHByb3RlY3RlZCAqLworCQlhZGRyMiA9ICh2b2xhdGlsZSBDRkdfRkxBU0hfV09SRF9TSVpFICopKGluZm8tPnN0YXJ0W2ldKTsKKworCQkvKiBGb3IgQU1EMjkwMzNDIGZsYXNoIHdlIG5lZWQgdG8gcmVzZW5kIHRoZSBjb21tYW5kIG9mICoKKwkJICogcmVhZGluZyBmbGFzaCBwcm90ZWN0aW9uIGZvciB1cHBlciA4IE1iIG9mIGZsYXNoICAgICAqLworCQlpZiAoaSA9PSAzMikgeworCQkJYWRkcjJbQ0ZHX0ZMQVNIX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweEFBQUFBQUFBOworCQkJYWRkcjJbQ0ZHX0ZMQVNIX0FERFIxXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDU1NTU1NTU1OworCQkJYWRkcjJbQ0ZHX0ZMQVNIX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDkwOTA5MDkwOworCQl9CisKKwkJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSA9PSBGTEFTSF9NQU5fU1NUKQorCQkJaW5mby0+cHJvdGVjdFtpXSA9IDA7CisJCWVsc2UKKwkJCWluZm8tPnByb3RlY3RbaV0gPSBhZGRyMlsyXSAmIDE7CisJfQorCisJLyogaXNzdWUgYmFuayByZXNldCB0byByZXR1cm4gdG8gcmVhZCBtb2RlICovCisJYWRkcjJbMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMEYwMDBGMDsKKworCXJldHVybiBpbmZvLT5zaXplOworfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX0RRN18xKGZsYXNoX2luZm9fdCAqIGluZm8sIGludCBzZWN0KQoreworCXVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisJdm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqYWRkciA9CisJICAgIChDRkdfRkxBU0hfV09SRF9TSVpFICopIChpbmZvLT5zdGFydFtzZWN0XSk7CisKKwlzdGFydCA9IGdldF90aW1lcigwKTsKKwlsYXN0ID0gc3RhcnQ7CisJd2hpbGUgKChhZGRyWzBdICYgKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA4MDAwODApICE9CisJICAgICAgIChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwODAwMDgwKSB7CisJCWlmICgobm93ID0gZ2V0X3RpbWVyKHN0YXJ0KSkgPiBDRkdfRkxBU0hfRVJBU0VfVE9VVCkgeworCQkJcHJpbnRmKCJUaW1lb3V0XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiBzaG93IHRoYXQgd2UncmUgd2FpdGluZyAqLworCQlpZiAoKG5vdyAtIGxhc3QpID4gMTAwMCkgewkvKiBldmVyeSBzZWNvbmQgKi8KKwkJCXB1dGMoJy4nKTsKKwkJCWxhc3QgPSBub3c7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBGTEFTSF9CQVNFMV9QUkVMSU0KK2ludCBmbGFzaF9lcmFzZShmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwlpZiAoKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSA9PSBGTEFTSF9BTTMyMEIpIHx8CisJICAgICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfQU0zMjBUKSB8fAorCSAgICAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX0FNTFYxMjhVKSB8fAorCSAgICAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX1MyOUdMMTI4TikgfHwKKwkgICAgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSA9PSBGTEFTSF9TVE1XMzIwRFQpKSB7CisJCXJldHVybiBmbGFzaF9lcmFzZV8yKGluZm8sIHNfZmlyc3QsIHNfbGFzdCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZsYXNoX2VyYXNlXzEoaW5mbywgc19maXJzdCwgc19sYXN0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZmxhc2hfZXJhc2VfMShmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKKyNlbHNlCitpbnQgZmxhc2hfZXJhc2UoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCisjZW5kaWYKK3sKKwl2b2xhdGlsZSBDRkdfRkxBU0hfV09SRF9TSVpFICphZGRyID0gKENGR19GTEFTSF9XT1JEX1NJWkUgKikgKGluZm8tPnN0YXJ0WzBdKTsKKwl2b2xhdGlsZSBDRkdfRkxBU0hfV09SRF9TSVpFICphZGRyMjsKKwlpbnQgZmxhZywgcHJvdCwgc2VjdCwgbF9zZWN0OworCWludCBpOworCisJaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCQlwcmludGYoIi0gbWlzc2luZ1xuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIi0gbm8gc2VjdG9ycyB0byBlcmFzZVxuIik7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJcHJpbnRmKCJDYW4ndCBlcmFzZSB1bmtub3duIGZsYXNoIHR5cGUgLSBhYm9ydGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJvdCA9IDA7CisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7ICsrc2VjdCkgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCQkJcHJvdCsrOworCQl9CisJfQorCisJaWYgKHByb3QpIHsKKwkJcHJpbnRmKCItIFdhcm5pbmc6ICVkIHByb3RlY3RlZCBzZWN0b3JzIHdpbGwgbm90IGJlIGVyYXNlZCFcbiIsCisJCSAgICAgICBwcm90KTsKKwl9IGVsc2UgeworCQlwcmludGYoIlxuIik7CisJfQorCisJbF9zZWN0ID0gLTE7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwkvKiBTdGFydCBlcmFzZSBvbiB1bnByb3RlY3RlZCBzZWN0b3JzICovCisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7IHNlY3QrKykgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7CS8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCWFkZHIyID0gKENGR19GTEFTSF9XT1JEX1NJWkUgKikgKGluZm8tPnN0YXJ0W3NlY3RdKTsKKworCQkJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSA9PSBGTEFTSF9NQU5fU1NUKSB7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDBBQTAwQUE7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjFdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA4MDAwODA7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDBBQTAwQUE7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjFdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJCQkJYWRkcjJbMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMDUwMDA1MDsJLyogYmxvY2sgZXJhc2UgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykKKwkJCQkJdWRlbGF5KDEwMDApOwkvKiB3YWl0IDEgbXMgKi8KKwkJCX0gZWxzZSB7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDBBQTAwQUE7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjFdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA4MDAwODA7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDBBQTAwQUE7CisJCQkJYWRkcltDRkdfRkxBU0hfQUREUjFdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJCQkJYWRkcjJbMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMDMwMDAzMDsJLyogc2VjdG9yIGVyYXNlICovCisJCQl9CisJCQlsX3NlY3QgPSBzZWN0OworCQkJLyoKKwkJCSAqIFdhaXQgZm9yIGVhY2ggc2VjdG9yIHRvIGNvbXBsZXRlLCBpdCdzIG1vcmUKKwkJCSAqIHJlbGlhYmxlLiAgQWNjb3JkaW5nIHRvIEFNRCBTcGVjLCB5b3UgbXVzdAorCQkJICogaXNzdWUgYWxsIGVyYXNlIGNvbW1hbmRzIHdpdGhpbiBhIHNwZWNpZmllZAorCQkJICogdGltZW91dC4gIFRoaXMgaGFzIGJlZW4gc2VlbiB0byBmYWlsLCBlc3BlY2lhbGx5CisJCQkgKiBpZiBwcmludGYoKXMgYXJlIGluY2x1ZGVkIChmb3IgZGVidWcpISEKKwkJCSAqLworCQkJd2FpdF9mb3JfRFE3XzEoaW5mbywgc2VjdCk7CisJCX0KKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCS8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcyAqLworCXVkZWxheSgxMDAwKTsKKworCS8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCWFkZHIgPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSBpbmZvLT5zdGFydFswXTsKKwlhZGRyWzBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDBGMDAwRjA7CS8qIHJlc2V0IGJhbmsgKi8KKworCXByaW50ZigiIGRvbmVcbiIpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5IG1lbW9yeSB0byBmbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK2ludCB3cml0ZV9idWZmKGZsYXNoX2luZm9fdCAqIGluZm8sIHVjaGFyICogc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisJdWxvbmcgY3AsIHdwLCBkYXRhOworCWludCBpLCBsLCByYzsKKworCXdwID0gKGFkZHIgJiB+Myk7CS8qIGdldCBsb3dlciB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLworCisJLyoKKwkgKiBoYW5kbGUgdW5hbGlnbmVkIHN0YXJ0IGJ5dGVzCisJICovCisJaWYgKChsID0gYWRkciAtIHdwKSAhPSAwKSB7CisJCWRhdGEgPSAwOworCQlmb3IgKGkgPSAwLCBjcCA9IHdwOyBpIDwgbDsgKytpLCArK2NwKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAoKih1Y2hhciAqKSBjcCk7CisJCX0KKwkJZm9yICg7IGkgPCA0ICYmIGNudCA+IDA7ICsraSkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCQkJLS1jbnQ7CisJCQkrK2NwOworCQl9CisJCWZvciAoOyBjbnQgPT0gMCAmJiBpIDwgNDsgKytpLCArK2NwKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAoKih1Y2hhciAqKSBjcCk7CisJCX0KKworCQlpZiAoKHJjID0gd3JpdGVfd29yZChpbmZvLCB3cCwgZGF0YSkpICE9IDApIHsKKwkJCXJldHVybiByYzsKKwkJfQorCQl3cCArPSA0OworCX0KKworCS8qCisJICogaGFuZGxlIHdvcmQgYWxpZ25lZCBwYXJ0CisJICovCisJd2hpbGUgKGNudCA+PSA0KSB7CisJCWRhdGEgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCX0KKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJd3AgKz0gNDsKKwkJY250IC09IDQ7CisJfQorCisJaWYgKGNudCA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IDQgJiYgY250ID4gMDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJLS1jbnQ7CisJfQorCWZvciAoOyBpIDwgNDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopIGNwKTsKKwl9CisKKwlyZXR1cm4gKHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCisjaWZkZWYgRkxBU0hfQkFTRTFfUFJFTElNCitzdGF0aWMgaW50IHdyaXRlX3dvcmQoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSkKK3sKKwlpZiAoKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSA9PSBGTEFTSF9BTTMyMEIpIHx8CisJICAgICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfQU0zMjBUKSB8fAorCSAgICAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX0FNTFYxMjhVKSB8fAorCSAgICAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX1MyOUdMMTI4TikgfHwKKwkgICAgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSA9PSBGTEFTSF9TVE1XMzIwRFQpKSB7CisJCXJldHVybiB3cml0ZV93b3JkXzIoaW5mbywgZGVzdCwgZGF0YSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHdyaXRlX3dvcmRfMShpbmZvLCBkZXN0LCBkYXRhKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfd29yZF8xKGZsYXNoX2luZm9fdCAqIGluZm8sIHVsb25nIGRlc3QsIHVsb25nIGRhdGEpCisjZWxzZQorc3RhdGljIGludCB3cml0ZV93b3JkKGZsYXNoX2luZm9fdCAqIGluZm8sIHVsb25nIGRlc3QsIHVsb25nIGRhdGEpCisjZW5kaWYKK3sKKwl2b2xhdGlsZSBDRkdfRkxBU0hfV09SRF9TSVpFICphZGRyMiA9IChDRkdfRkxBU0hfV09SRF9TSVpFICopIChpbmZvLT5zdGFydFswXSk7CisJdm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqZGVzdDIgPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSBkZXN0OworCXZvbGF0aWxlIENGR19GTEFTSF9XT1JEX1NJWkUgKmRhdGEyID0gKENGR19GTEFTSF9XT1JEX1NJWkUgKikgJiBkYXRhOworCXVsb25nIHN0YXJ0OworCWludCBpOworCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisJaWYgKCgqKCh2dV9sb25nICopZGVzdCkgJiBkYXRhKSAhPSBkYXRhKSB7CisJCXJldHVybiAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0IC8gc2l6ZW9mKENGR19GTEFTSF9XT1JEX1NJWkUpOyBpKyspIHsKKwkJaW50IGZsYWc7CisKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCQlhZGRyMltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDBBQTAwQUE7CisJCWFkZHIyW0NGR19GTEFTSF9BRERSMV0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMDU1MDA1NTsKKwkJYWRkcjJbQ0ZHX0ZMQVNIX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwQTAwMEEwOworCisJCWRlc3QyW2ldID0gZGF0YTJbaV07CisKKwkJLyogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChmbGFnKQorCQkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCQkvKiBkYXRhIHBvbGxpbmcgZm9yIEQ3ICovCisJCXN0YXJ0ID0gZ2V0X3RpbWVyKDApOworCQl3aGlsZSAoKGRlc3QyW2ldICYgKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA4MDAwODApICE9CisJCSAgICAgICAoZGF0YTJbaV0gJiAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMDgwMDA4MCkpIHsKKworCQkJaWYgKGdldF90aW1lcihzdGFydCkgPiBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBGTEFTSF9CQVNFMV9QUkVMSU0KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBjYW5ub3QgYmUgcnVuIGZyb20gRkxBU0ghCisgKi8KK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZV8yKHZ1X2xvbmcgKiBhZGRyLCBmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCXNob3J0IGk7CisJQ0ZHX0ZMQVNIX0NIQVJfU0laRSB2YWx1ZTsKKwl1bG9uZyBiYXNlID0gKHVsb25nKSBhZGRyOworCXZvbGF0aWxlIENGR19GTEFTSF9XT1JEX1NJWkUgKmFkZHIyID0gKENGR19GTEFTSF9XT1JEX1NJWkUgKikgYWRkcjsKKworCURFQlVHRigiRkxBU0ggQUREUjogJTA4eFxuIiwgKHVuc2lnbmVkKWFkZHIpOworCisJLyogV3JpdGUgYXV0byBzZWxlY3QgY29tbWFuZDogcmVhZCBNYW51ZmFjdHVyZXIgSUQgKi8KKwlhZGRyMltDRkdfRkxBU0hfQ0hBUl9BRERSMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHhBQUFBQUFBQTsKKwlhZGRyMltDRkdfRkxBU0hfQ0hBUl9BRERSMV0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg1NTU1NTU1NTsKKwlhZGRyMltDRkdfRkxBU0hfQ0hBUl9BRERSMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg5MDkwOTA5MDsKKwl1ZGVsYXkoMTAwMCk7CisKKwl2YWx1ZSA9IChDRkdfRkxBU0hfQ0hBUl9TSVpFKWFkZHIyWzBdOworCURFQlVHRigiRkxBU0ggTUFOVUZBQ1Q6ICV4XG4iLCB2YWx1ZSk7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSkgQU1EX01BTlVGQUNUOgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9BTUQ7CisJCWJyZWFrOworCWNhc2UgKENGR19GTEFTSF9DSEFSX1NJWkUpIEZVSl9NQU5VRkFDVDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fRlVKOworCQlicmVhazsKKwljYXNlIChDRkdfRkxBU0hfQ0hBUl9TSVpFKSBTU1RfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX1NTVDsKKwkJYnJlYWs7CisJY2FzZSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSkgU1RNX01BTlVGQUNUOgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9TVE07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMDsKKwkJaW5mby0+c2l6ZSA9IDA7CisJCXJldHVybiAwOwkJLyogbm8gb3IgdW5rbm93biBmbGFzaCAqLworCX0KKworCXZhbHVlID0gKENGR19GTEFTSF9DSEFSX1NJWkUpYWRkcjJbMl07CS8qIGRldmljZSBJRCAqLworCURFQlVHRigiXG5GTEFTSCBERVZJQ0VJRDogJXhcbiIsIHZhbHVlKTsKKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIChDRkdfRkxBU0hfQ0hBUl9TSVpFKSBBTURfSURfTFYwNDBCOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTA0MDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gODsKKwkJaW5mby0+c2l6ZSA9IDB4MDA4MDAwMDsJLyogPT4gNTEyIGtvICovCisJCWJyZWFrOworCisJY2FzZSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSkgQU1EX0lEX0YwNDBCOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTA0MDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gODsKKwkJaW5mby0+c2l6ZSA9IDB4MDA4MDAwMDsJLyogPT4gNTEyIGtvICovCisJCWJyZWFrOworCisJY2FzZSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSkgU1RNX0lEX00yOVcwNDBCOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTA0MDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gODsKKwkJaW5mby0+c2l6ZSA9IDB4MDA4MDAwMDsJLyogPT4gNTEyIGtvICovCisJCWJyZWFrOworCisJY2FzZSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSkgQU1EX0lEX0YwMTZEOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTUQwMTY7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDMyOworCQlpbmZvLT5zaXplID0gMHgwMDIwMDAwMDsKKwkJYnJlYWs7CQkJLyogPT4gMiBNQiAqLworCisJY2FzZSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSkgQU1EX0lEX0xWMDMzQzoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU1ETFYwMzNDOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSA2NDsKKwkJaW5mby0+c2l6ZSA9IDB4MDA0MDAwMDA7CisJCWJyZWFrOwkJCS8qID0+IDQgTUIgKi8KKworCWNhc2UgKENGR19GTEFTSF9DSEFSX1NJWkUpIEFNRF9JRF9MVjQwMFQ6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNNDAwVDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTE7CisJCWluZm8tPnNpemUgPSAweDAwMDgwMDAwOworCQlicmVhazsJCQkvKiA9PiAwLjUgTUIgKi8KKworCWNhc2UgKENGR19GTEFTSF9DSEFSX1NJWkUpIEFNRF9JRF9MVjQwMEI6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNNDAwQjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTE7CisJCWluZm8tPnNpemUgPSAweDAwMDgwMDAwOworCQlicmVhazsJCQkvKiA9PiAwLjUgTUIgKi8KKworCWNhc2UgKENGR19GTEFTSF9DSEFSX1NJWkUpIEFNRF9JRF9MVjgwMFQ6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNODAwVDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTk7CisJCWluZm8tPnNpemUgPSAweDAwMTAwMDAwOworCQlicmVhazsJCQkvKiA9PiAxIE1CICovCisKKwljYXNlIChDRkdfRkxBU0hfQ0hBUl9TSVpFKSBBTURfSURfTFY4MDBCOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTgwMEI7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDE5OworCQlpbmZvLT5zaXplID0gMHgwMDEwMDAwMDsKKwkJYnJlYWs7CQkJLyogPT4gMSBNQiAqLworCisJY2FzZSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSkgQU1EX0lEX0xWMTYwVDoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0xNjBUOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAzNTsKKwkJaW5mby0+c2l6ZSA9IDB4MDAyMDAwMDA7CisJCWJyZWFrOwkJCS8qID0+IDIgTUIgKi8KKworCWNhc2UgKENGR19GTEFTSF9DSEFSX1NJWkUpIEFNRF9JRF9MVjE2MEI6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMTYwQjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMzU7CisJCWluZm8tPnNpemUgPSAweDAwMjAwMDAwOworCQlicmVhazsJCQkvKiA9PiAyIE1CICovCisJY2FzZSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSkgQU1EX0lEX01JUlJPUjoKKwkJaWYgKChDRkdfRkxBU0hfQ0hBUl9TSVpFKWFkZHIyWzB4MWNdID09IChDRkdfRkxBU0hfQ0hBUl9TSVpFKUFNRF9JRF9MVjEyOFVfMgorCQkJCSYmIChDRkdfRkxBU0hfQ0hBUl9TSVpFKWFkZHIyWzB4MWVdID09ICAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSlBTURfSURfTFYxMjhVXzMpIHsKKwkJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNTFYxMjhVOworCQkJaW5mby0+c2VjdG9yX2NvdW50ID0gMjU2OworCQkJaW5mby0+c2l6ZSA9IDB4MDEwMDAwMDA7CisJCX0gZWxzZSBpZiAoKENGR19GTEFTSF9DSEFSX1NJWkUpYWRkcjJbMHgxY10gPT0gKENGR19GTEFTSF9DSEFSX1NJWkUpQU1EX0lEX0dMMTI4Tl8yCisJCQkJJiYgKENGR19GTEFTSF9DSEFSX1NJWkUpYWRkcjJbMHgxZV0gPT0gIChDRkdfRkxBU0hfQ0hBUl9TSVpFKUFNRF9JRF9HTDEyOE5fMyApIHsKKwkJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX1MyOUdMMTI4TjsKKwkJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDEyODsKKwkJCWluZm8tPnNpemUgPSAweDAxMDAwMDAwOworCQl9CisJCWVsc2UKKwkJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJYnJlYWs7CQkJLyogPT4gMiBNQiAqLworCisJZGVmYXVsdDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQlyZXR1cm4gMDsJCS8qID0+IG5vIG9yIHVua25vd24gZmxhc2ggKi8KKwl9CisKKwkvKiBzZXQgdXAgc2VjdG9yIHN0YXJ0IGFkZHJlc3MgdGFibGUgKi8KKwlpZiAoKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSA9PSBGTEFTSF9NQU5fU1NUKSB8fAorCSAgICAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX0FNMDQwKSB8fAorCSAgICAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX0FNRDAxNikpIHsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKQorCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgKGkgKiAweDAwMDEwMDAwKTsKKwl9IGVsc2UgaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSA9PSBGTEFTSF9BTUxWMTI4VSkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspCisJCQlpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyAoaSAqIDB4MDAwMTAwMDApOworCX0gZWxzZSBpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX1MyOUdMMTI4TiApIHsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKQorCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgKGkgKiAweDAwMDIwMDAwKTsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9CVFlQRSkgeworCQkJLyogc2V0IHNlY3RvciBvZmZzZXRzIGZvciBib3R0b20gYm9vdCBibG9jayB0eXBlICovCisJCQlpbmZvLT5zdGFydFswXSA9IGJhc2UgKyAweDAwMDAwMDAwOworCQkJaW5mby0+c3RhcnRbMV0gPSBiYXNlICsgMHgwMDAwNDAwMDsKKwkJCWluZm8tPnN0YXJ0WzJdID0gYmFzZSArIDB4MDAwMDYwMDA7CisJCQlpbmZvLT5zdGFydFszXSA9IGJhc2UgKyAweDAwMDA4MDAwOworCQkJZm9yIChpID0gNDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCQkJaW5mby0+c3RhcnRbaV0gPQorCQkJCSAgICBiYXNlICsgKGkgKiAweDAwMDEwMDAwKSAtIDB4MDAwMzAwMDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBzZXQgc2VjdG9yIG9mZnNldHMgZm9yIHRvcCBib290IGJsb2NrIHR5cGUgKi8KKwkJCWkgPSBpbmZvLT5zZWN0b3JfY291bnQgLSAxOworCQkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAwNDAwMDsKKwkJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMDYwMDA7CisJCQlpbmZvLT5zdGFydFtpLS1dID0gYmFzZSArIGluZm8tPnNpemUgLSAweDAwMDA4MDAwOworCQkJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgaSAqIDB4MDAwMTAwMDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjaGVjayBmb3IgcHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJLyogcmVhZCBzZWN0b3IgcHJvdGVjdGlvbiBhdCBzZWN0b3IgYWRkcmVzcywgKEE3IC4uIEEwKSA9IDB4MDIgKi8KKwkJLyogRDAgPSAxIGlmIHByb3RlY3RlZCAqLworCQlhZGRyMiA9ICh2b2xhdGlsZSBDRkdfRkxBU0hfV09SRF9TSVpFICopKGluZm8tPnN0YXJ0W2ldKTsKKworCQkvKiBGb3IgQU1EMjkwMzNDIGZsYXNoIHdlIG5lZWQgdG8gcmVzZW5kIHRoZSBjb21tYW5kIG9mICoKKwkJICogcmVhZGluZyBmbGFzaCBwcm90ZWN0aW9uIGZvciB1cHBlciA4IE1iIG9mIGZsYXNoICAgICAqLworCQlpZiAoaSA9PSAzMikgeworCQkJYWRkcjJbQ0ZHX0ZMQVNIX0NIQVJfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4QUFBQUFBQUE7CisJCQlhZGRyMltDRkdfRkxBU0hfQ0hBUl9BRERSMV0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg1NTU1NTU1NTsKKwkJCWFkZHIyW0NGR19GTEFTSF9DSEFSX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDkwOTA5MDkwOworCQl9CisKKwkJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSA9PSBGTEFTSF9NQU5fU1NUKQorCQkJaW5mby0+cHJvdGVjdFtpXSA9IDA7CisJCWVsc2UKKwkJCWluZm8tPnByb3RlY3RbaV0gPSAoQ0ZHX0ZMQVNIX0NIQVJfU0laRSlhZGRyMls0XSAmIDE7CisJfQorCisJLyogaXNzdWUgYmFuayByZXNldCB0byByZXR1cm4gdG8gcmVhZCBtb2RlICovCisJYWRkcjJbMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHhGMEYwRjBGMDsKKwlyZXR1cm4gaW5mby0+c2l6ZTsKK30KKworc3RhdGljIGludCB3YWl0X2Zvcl9EUTdfMihmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc2VjdCkKK3sKKwl1bG9uZyBzdGFydCwgbm93LCBsYXN0OworCXZvbGF0aWxlIENGR19GTEFTSF9XT1JEX1NJWkUgKmFkZHIgPQorCSAgICAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSAoaW5mby0+c3RhcnRbc2VjdF0pOworCisJc3RhcnQgPSBnZXRfdGltZXIoMCk7CisJbGFzdCA9IHN0YXJ0OworCXdoaWxlICgoKENGR19GTEFTSF9XT1JEX1NJWkUpYWRkclswXSAmIChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDgwODA4MDgwKSAhPQorCSAgICAgICAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg4MDgwODA4MCkgeworCQlpZiAoKG5vdyA9IGdldF90aW1lcihzdGFydCkpID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKKwkJCXByaW50ZigiVGltZW91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogc2hvdyB0aGF0IHdlJ3JlIHdhaXRpbmcgKi8KKwkJaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsgLyogZXZlcnkgc2Vjb25kICovCisJCQlwdXRjKCcuJyk7CisJCQlsYXN0ID0gbm93OworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsYXNoX2VyYXNlXzIoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisJdm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqYWRkciA9IChDRkdfRkxBU0hfV09SRF9TSVpFICopIChpbmZvLT5zdGFydFswXSk7CisJdm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqYWRkcjI7CisJaW50IGZsYWcsIHByb3QsIHNlY3QsIGxfc2VjdDsKKwlpbnQgaTsKKworCWlmICgoc19maXJzdCA8IDApIHx8IChzX2ZpcnN0ID4gc19sYXN0KSkgeworCQlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQkJcHJpbnRmKCItIG1pc3NpbmdcbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCQl9CisJCXJldHVybiAxOworCX0KKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXByaW50ZigiQ2FuJ3QgZXJhc2UgdW5rbm93biBmbGFzaCB0eXBlIC0gYWJvcnRlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkJCXByb3QrKzsKKwkJfQorCX0KKworCWlmIChwcm90KSB7CisJCXByaW50ZigiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLAorCQkgICAgICAgcHJvdCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJcbiIpOworCX0KKworCWxfc2VjdCA9IC0xOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgewkvKiBub3QgcHJvdGVjdGVkICovCisJCQlhZGRyMiA9IChDRkdfRkxBU0hfV09SRF9TSVpFICopIChpbmZvLT5zdGFydFtzZWN0XSk7CisKKwkJCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgPT0gRkxBU0hfTUFOX1NTVCkgeworCQkJCWFkZHJbQ0ZHX0ZMQVNIX0NIQVJfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4QUFBQUFBQUE7CisJCQkJYWRkcltDRkdfRkxBU0hfQ0hBUl9BRERSMV0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg1NTU1NTU1NTsKKwkJCQlhZGRyW0NGR19GTEFTSF9DSEFSX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDgwODA4MDgwOworCQkJCWFkZHJbQ0ZHX0ZMQVNIX0NIQVJfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4QUFBQUFBQUE7CisJCQkJYWRkcltDRkdfRkxBU0hfQ0hBUl9BRERSMV0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg1NTU1NTU1NTsKKwkJCQlhZGRyMlswXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDUwNTA1MDUwOwkvKiBibG9jayBlcmFzZSAqLworCQkJCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKQorCQkJCQl1ZGVsYXkoMTAwMCk7CS8qIHdhaXQgMSBtcyAqLworCQkJfSBlbHNlIHsKKwkJCQlhZGRyW0NGR19GTEFTSF9DSEFSX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweEFBQUFBQUFBOworCQkJCWFkZHJbQ0ZHX0ZMQVNIX0NIQVJfQUREUjFdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4NTU1NTU1NTU7CisJCQkJYWRkcltDRkdfRkxBU0hfQ0hBUl9BRERSMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg4MDgwODA4MDsKKwkJCQlhZGRyW0NGR19GTEFTSF9DSEFSX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweEFBQUFBQUFBOworCQkJCWFkZHJbQ0ZHX0ZMQVNIX0NIQVJfQUREUjFdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4NTU1NTU1NTU7CisJCQkJYWRkcjJbMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgzMDMwMzAzMDsJLyogc2VjdG9yIGVyYXNlICovCisJCQl9CisJCQlsX3NlY3QgPSBzZWN0OworCQkJLyoKKwkJCSAqIFdhaXQgZm9yIGVhY2ggc2VjdG9yIHRvIGNvbXBsZXRlLCBpdCdzIG1vcmUKKwkJCSAqIHJlbGlhYmxlLiAgQWNjb3JkaW5nIHRvIEFNRCBTcGVjLCB5b3UgbXVzdAorCQkJICogaXNzdWUgYWxsIGVyYXNlIGNvbW1hbmRzIHdpdGhpbiBhIHNwZWNpZmllZAorCQkJICogdGltZW91dC4gIFRoaXMgaGFzIGJlZW4gc2VlbiB0byBmYWlsLCBlc3BlY2lhbGx5CisJCQkgKiBpZiBwcmludGYoKXMgYXJlIGluY2x1ZGVkIChmb3IgZGVidWcpISEKKwkJCSAqLworCQkJd2FpdF9mb3JfRFE3XzIoaW5mbywgc2VjdCk7CisJCX0KKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCS8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcyAqLworCXVkZWxheSgxMDAwKTsKKworCS8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCWFkZHIgPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSBpbmZvLT5zdGFydFswXTsKKwlhZGRyWzBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4RjBGMEYwRjA7IC8qIHJlc2V0IGJhbmsgKi8KKworCXByaW50ZigiIGRvbmVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3dvcmRfMihmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKQoreworCXZvbGF0aWxlIENGR19GTEFTSF9XT1JEX1NJWkUgKmFkZHIyID0gKENGR19GTEFTSF9XT1JEX1NJWkUgKikgKGluZm8tPnN0YXJ0WzBdKTsKKwl2b2xhdGlsZSBDRkdfRkxBU0hfV09SRF9TSVpFICpkZXN0MiA9IChDRkdfRkxBU0hfV09SRF9TSVpFICopIGRlc3Q7CisJdm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqZGF0YTIgPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSAmIGRhdGE7CisJdWxvbmcgc3RhcnQ7CisJaW50IGk7CisKKwkvKiBDaGVjayBpZiBGbGFzaCBpcyAoc3VmZmljaWVudGx5KSBlcmFzZWQgKi8KKwlpZiAoKCooKHZ1X2xvbmcgKilkZXN0KSAmIGRhdGEpICE9IGRhdGEpIHsKKwkJcmV0dXJuIDI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQgLyBzaXplb2YoQ0ZHX0ZMQVNIX1dPUkRfU0laRSk7IGkrKykgeworCQlpbnQgZmxhZzsKKworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwkJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisJCWFkZHIyW0NGR19GTEFTSF9DSEFSX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweEFBQUFBQUFBOworCQlhZGRyMltDRkdfRkxBU0hfQ0hBUl9BRERSMV0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg1NTU1NTU1NTsKKwkJYWRkcjJbQ0ZHX0ZMQVNIX0NIQVJfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4QTBBMEEwQTA7CisKKwkJZGVzdDJbaV0gPSBkYXRhMltpXTsKKworCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKGZsYWcpCisJCQllbmFibGVfaW50ZXJydXB0cygpOworCisJCS8qIGRhdGEgcG9sbGluZyBmb3IgRDcgKi8KKwkJc3RhcnQgPSBnZXRfdGltZXIoMCk7CisJCXdoaWxlICgoZGVzdDJbaV0gJiAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHg4MDgwODA4MCkgIT0KKwkJICAgICAgIChkYXRhMltpXSAmIChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDgwODA4MDgwKSkgeworCisJCQlpZiAoZ2V0X3RpbWVyKHN0YXJ0KSA+IENGR19GTEFTSF9XUklURV9UT1VUKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIEZMQVNIX0JBU0UxX1BSRUxJTSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy90YWlodS9sY2QuYyBiL2JvYXJkL2FtY2MvdGFpaHUvbGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwNDJkZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FtY2MvdGFpaHUvbGNkLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisKKyNkZWZpbmUgTENEX0NNRF9BRERSCTB4NTAxMDAwMDIKKyNkZWZpbmUgTENEX0RBVEFfQUREUgkweDUwMTAwMDAzCisjZGVmaW5lIExDRF9CTEtfQ1RSTAlDUExEX1JFRzFfQUREUgorCitzdGF0aWMgY2hhciAqYW1jY19sb2dvID0gIkFNQ0MgNDA1RVAgVEFJSFUgRVZBTFVBVElPTiBLSVQiOworc3RhdGljIGludCBhZGRyX2ZsYWcgPSAweDgwOworCitzdGF0aWMgdm9pZCBsY2RfYmxfY3RybChjaGFyIHZhbCkKK3sKKwlvdXRfOCgodTggKikgTENEX0JMS19DVFJMLCBpbl84KCh1OCAqKSBMQ0RfQkxLX0NUUkwpIHwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgbGNkX3B1dGMoaW50IHZhbCkKK3sKKwlpbnQgaSA9IDEwMDsKKwljaGFyIGFkZHI7CisKKwl3aGlsZSAoaS0tKSB7CisJCWlmICgoaW5fOCgodTggKikgTENEX0NNRF9BRERSKSAmIDB4ODApICE9IDB4ODApIHsgLypCRiA9IDEgPyovCisJCQl1ZGVsYXkoNTApOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDUwKTsKKwl9CisKKwlpZiAoaW5fOCgodTggKikgTENEX0NNRF9BRERSKSAmIDB4ODApIHsKKwkJcHJpbnRmKCJMQ0QgaXMgYnVzeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlhZGRyID0gaW5fOCgodTggKikgTENEX0NNRF9BRERSKTsKKwl1ZGVsYXkoNTApOworCWlmICgoYWRkciAhPSAwKSAmJiAoYWRkciAlIDB4MTAgPT0gMCkpIHsKKwkJYWRkcl9mbGFnIF49IDB4NDA7CisJCW91dF84KCh1OCAqKSBMQ0RfQ01EX0FERFIsIGFkZHJfZmxhZyk7CisJfQorCisJdWRlbGF5KDUwKTsKKwlvdXRfOCgodTggKikgTENEX0RBVEFfQUREUiwgdmFsKTsKKwl1ZGVsYXkoNTApOworfQorCitzdGF0aWMgdm9pZCBsY2RfcHV0cyhjaGFyICpzKQoreworCWNoYXIgKnAgPSBzOworCWludCBpID0gMTAwOworCisJd2hpbGUgKGktLSkgeworCQlpZiAoKGluXzgoKHU4ICopIExDRF9DTURfQUREUikgJiAweDgwKSAhPSAweDgwKSB7IC8qQkYgPSAxID8qLworCQkJdWRlbGF5KDUwKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSg1MCk7CisJfQorCisJaWYgKGluXzgoKHU4ICopIExDRF9DTURfQUREUikgJiAweDgwKSB7CisJCXByaW50ZigiTENEIGlzIGJ1c3lcbiIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKCpwKQorCQlsY2RfcHV0YygqcCsrKTsKK30KKworc3RhdGljIHZvaWQgbGNkX3B1dF9sb2dvKHZvaWQpCit7CisJaW50IGkgPSAxMDA7CisJY2hhciAqcCA9IGFtY2NfbG9nbzsKKworCXdoaWxlIChpLS0pIHsKKwkJaWYgKChpbl84KCh1OCAqKSBMQ0RfQ01EX0FERFIpICYgMHg4MCkgIT0gMHg4MCkgeyAvKkJGID0gMSA/Ki8KKwkJCXVkZWxheSg1MCk7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoNTApOworCX0KKworCWlmIChpbl84KCh1OCAqKSBMQ0RfQ01EX0FERFIpICYgMHg4MCkgeworCQlwcmludGYoIkxDRCBpcyBidXN5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCW91dF84KCh1OCAqKSBMQ0RfQ01EX0FERFIsIDB4ODApOworCXdoaWxlICgqcCkKKwkJbGNkX3B1dGMoKnArKyk7Cit9CisKK2ludCBsY2RfaW5pdCh2b2lkKQoreworCXB1dHMoIkxDRDogIik7CisJb3V0XzgoKHU4ICopIExDRF9DTURfQUREUiwgMHgzOCk7IC8qIHNldCBmdW5jdGlvbjo4LWJpdCwyLWxpbmUsNXg3IGZvbnQgdHlwZSAqLworCXVkZWxheSg1MCk7CisJb3V0XzgoKHU4ICopIExDRF9DTURfQUREUiwgMHgwZik7IC8qIHNldCBkaXNwbGF5IG9uLGN1cnNvciBvbixibGluayBvbiAqLworCXVkZWxheSg1MCk7CisJb3V0XzgoKHU4ICopIExDRF9DTURfQUREUiwgMHgwMSk7IC8qIGRpc3BsYXkgY2xlYXIgKi8KKwl1ZGVsYXkoMjAwMCk7CisJb3V0XzgoKHU4ICopIExDRF9DTURfQUREUiwgMHgwNik7IC8qIHNldCBlbnRyeSAqLworCXVkZWxheSg1MCk7CisJbGNkX2JsX2N0cmwoMHgwMik7CQkvKiBzZXQgYmFja2xpZ2h0IG9uICovCisJbGNkX3B1dF9sb2dvKCk7CisJcHV0cygicmVhZHlcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fbGNkX2NsZWFyIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJb3V0XzgoKHU4ICopIExDRF9DTURfQUREUiwgMHgwMSk7CisJdWRlbGF5KDIwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fbGNkX3B1dHMgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpZiAoYXJnYyA8IDIpIHsKKwkJcHJpbnRmKCIlcyIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCX0KKwlsY2RfcHV0cyhhcmd2WzFdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2xjZF9wdXRjIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaWYgKGFyZ2MgPCAyKSB7CisJCXByaW50ZigiJXMiLCBjbWR0cC0+dXNhZ2UpOworCQlyZXR1cm4gMTsKKwl9CisJbGNkX3B1dGMoKGNoYXIpYXJndlsxXVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19sY2RfY3VyIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdWxvbmcgY291bnQ7CisJdWxvbmcgZGlyOworCWNoYXIgY3VyX2FkZHI7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJcHJpbnRmKCIlcyIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCX0KKworCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCWlmIChjb3VudCA+IDMxKSB7CisJCXByaW50ZigidW5hYmxlIHRvIHNoaWZ0ID4gMHgyMFxuIik7CisJCWNvdW50ID0gMDsKKwl9CisKKwlkaXIgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisJY3VyX2FkZHIgPSBpbl84KCh1OCAqKSBMQ0RfQ01EX0FERFIpOworCXVkZWxheSg1MCk7CisKKwlpZiAoZGlyID09IDB4MCkgeworCQlpZiAoYWRkcl9mbGFnID09IDB4ODApIHsKKwkJCWlmIChjb3VudCA+PSAoY3VyX2FkZHIgJiAweGYpKSB7CisJCQkJb3V0XzgoKHU4ICopIExDRF9DTURfQUREUiwgMHg4MCk7CisJCQkJdWRlbGF5KDUwKTsKKwkJCQljb3VudCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY291bnQgPj0gKChjdXJfYWRkciAmIDB4MGYpICsgMHgwZikpIHsKKwkJCQlvdXRfOCgodTggKikgTENEX0NNRF9BRERSLCAweDgwKTsKKwkJCQlhZGRyX2ZsYWcgPSAweDgwOworCQkJCXVkZWxheSg1MCk7CisJCQkJY291bnQgPSAweDA7CisJCQl9IGVsc2UgaWYgKGNvdW50ID49ICggY3VyX2FkZHIgJiAweGYpKSB7CisJCQkJY291bnQgLT0gY3VyX2FkZHIgJiAweGYgOworCQkJCW91dF84KCh1OCAqKSBMQ0RfQ01EX0FERFIsIDB4ODAgfCAweGYpOworCQkJCWFkZHJfZmxhZyA9IDB4ODA7CisJCQkJdWRlbGF5KDUwKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChhZGRyX2ZsYWcgPT0gMHg4MCkgeworCQkJaWYgKGNvdW50ID49ICgweDFmIC0gKGN1cl9hZGRyICYgMHhmKSkpIHsKKwkJCQljb3VudCA9IDB4MDsKKwkJCQlhZGRyX2ZsYWcgPSAweGMwOworCQkJCW91dF84KCh1OCAqKSBMQ0RfQ01EX0FERFIsIDB4YzAgfCAweGYpOworCQkJCXVkZWxheSg1MCk7CisJCQl9IGVsc2UgaWYgKChjb3VudCArIChjdXJfYWRkciAmIDB4ZiApKT49ICAweDBmKSB7CisJCQkJY291bnQgPSBjb3VudCArIChjdXJfYWRkciAmIDB4ZikgLSAweDBmOworCQkJCWFkZHJfZmxhZyA9IDB4YzA7CisJCQkJb3V0XzgoKHU4ICopIExDRF9DTURfQUREUiwgMHhjMCk7CisJCQkJdWRlbGF5KDUwKTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoY291bnQgKyAoY3VyX2FkZHIgJiAweGYgKSkgPj0gMHgwZikgeworCQkJY291bnQgPSAweDA7CisJCQlvdXRfOCgodTggKikgTENEX0NNRF9BRERSLCAweEMwIHwgMHgwRik7CisJCQl1ZGVsYXkoNTApOworCQl9CisJfQorCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChkaXIgPT0gMCkKKwkJCW91dF84KCh1OCAqKSBMQ0RfQ01EX0FERFIsIDB4MTApOworCQllbHNlCisJCQlvdXRfOCgodTggKikgTENEX0NNRF9BRERSLCAweDE0KTsKKwkJdWRlbGF5KDUwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworVV9CT09UX0NNRCgKKwlsY2RfY2xzLCAxLCAxLCBkb19sY2RfY2xlYXIsCisJImxjZF9jbHMgLSBsY2QgY2xlYXIgZGlzcGxheVxuIiwKKwlOVUxMCisJKTsKKworVV9CT09UX0NNRCgKKwlsY2RfcHV0cywgMiwgMSwgZG9fbGNkX3B1dHMsCisJImxjZF9wdXRzIC0gZGlzcGxheSBzdHJpbmcgb24gbGNkXG4iLAorCSI8c3RyaW5nPiAtIDxzdHJpbmc+IHRvIGJlIGRpc3BsYXllZFxuIgorCSk7CisKK1VfQk9PVF9DTUQoCisJbGNkX3B1dGMsIDIsIDEsIGRvX2xjZF9wdXRjLAorCSJsY2RfcHV0YyAtIGRpc3BsYXkgY2hhciBvbiBsY2RcbiIsCisJIjxjaGFyPiAtIDxjaGFyPiB0byBiZSBkaXNwbGF5ZWRcbiIKKwkpOworCitVX0JPT1RfQ01EKAorCWxjZF9jdXIsIDMsIDEsIGRvX2xjZF9jdXIsCisJImxjZF9jdXIgLSBzaGlmdCBjdXJzb3Igb24gbGNkXG4iLAorCSI8Y291bnQ+IDxkaXI+IC0gc2hpZnQgY3Vyc29yIG9uIGxjZCA8Y291bnQ+IHRpbWVzLCBkaXJlY3Rpb24gaXMgPGRpcj4gXG4iCisJIiA8Y291bnQ+IC0gMC4uMzFcbiIKKwkiIDxkaXI+ICAgLSAwPWJhY2t3YXJkIDE9Zm9yd2FyZFxuIgorCSk7CmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL3RhaWh1L3RhaWh1LmMgYi9ib2FyZC9hbWNjL3RhaWh1L3RhaWh1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4MzY3MQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FtY2MvdGFpaHUvdGFpaHUuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA1CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNS0yMDA3CisgKiBCZWlqaW5nIFVEIFRlY2hub2xvZ3kgQ28uLCBMdGQuLCB0YWlodXN1cHBvcnRAYW1jYy5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8c3BpLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKworZXh0ZXJuIGludCBsY2RfaW5pdCh2b2lkKTsKKworLyoKKyAqIGJvYXJkX2Vhcmx5X2luaXRfZgorICovCitpbnQgYm9hcmRfZWFybHlfaW5pdF9mKHZvaWQpCit7CisJbGNkX2luaXQoKTsKKworCW10ZGNyKHVpY3NyLCAweEZGRkZGRkZGKTsJLyogY2xlYXIgYWxsIGludHMgKi8KKwltdGRjcih1aWNlciwgMHgwMDAwMDAwMCk7CS8qIGRpc2FibGUgYWxsIGludHMgKi8KKwltdGRjcih1aWNjciwgMHgwMDAwMDAwMCk7CisJbXRkY3IodWljcHIsIDB4RkZGRjdGMDApOwkvKiBzZXQgaW50IHBvbGFyaXRpZXMgKi8KKwltdGRjcih1aWN0ciwgMHgwMDAwMDAwMCk7CS8qIHNldCBpbnQgdHJpZ2dlciBsZXZlbHMgKi8KKwltdGRjcih1aWNzciwgMHhGRkZGRkZGRik7CS8qIGNsZWFyIGFsbCBpbnRzICovCisJbXRkY3IodWljdmNyLCAweDAwMDAwMDAxKTsJLyogc2V0IHZlY3QgYmFzZT0wLElOVDAgaGlnaGVzdCBwcmlvcml0eSAqLworCisJbXRlYmMocGIzYXAsIENGR19FQkNfUEIzQVApOwkvKiBtZW1vcnkgYmFuayAzIChDUExEX0xDTSkgaW5pdGlhbGl6YXRpb24gKi8KKwltdGViYyhwYjNjciwgQ0ZHX0VCQ19QQjNDUik7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBDUEMwX1BDSSB0byBlbmFibGUgUGVyV0UgYXMgb3V0cHV0CisJICogYW5kIGVuYWJsZSB0aGUgaW50ZXJuYWwgUENJIGFyYml0ZXIKKwkgKi8KKwltdGRjcihjcGMwX3BjaSwgQ1BDMF9QQ0lfU1BFIHwgQ1BDMF9QQ0lfSE9TVF9DRkdfRU4gfCBDUEMwX1BDSV9BUkJJVF9FTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIEJvYXJkIElkZW50aXR5OgorICovCitpbnQgY2hlY2tib2FyZCh2b2lkKQoreworCWNoYXIgKnMgPSBnZXRlbnYoInNlcmlhbCMiKTsKKworCXB1dHMoIkJvYXJkOiBUYWlodSAtIEFNQ0MgUFBDNDA1RVAgRXZhbHVhdGlvbiBCb2FyZCIpOworCisJaWYgKHMgIT0gTlVMTCkgeworCQlwdXRzKCIsIHNlcmlhbCMgIik7CisJCXB1dHMocyk7CisJfQorCXB1dGMoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBsb25nIGludCBpbml0ZHJhbQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitsb25nIGludCBpbml0ZHJhbShpbnQgYm9hcmQpCit7CisJcmV0dXJuIENGR19TRFJBTV9TSVpFX1BFUl9CQU5LICogQ0ZHX1NEUkFNX0JBTktTOyAvKiAxMjhNYnl0ZXMgKi8KK30KKworc3RhdGljIGludCBkb19zd19zdGF0KGNtZF90YmxfdCogY21kX3RwLCBpbnQgZmxhZ3MsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciBzdGF0OworCWludCBpOworCisJc3RhdCA9IGluXzgoKHU4ICopIENQTERfUkVHMF9BRERSKTsKKwlwcmludGYoIlNXMiBzdGF0dXM6ICIpOworCWZvciAoaT0wOyBpPDQ7IGkrKykgLyogNC1wb3NpdGlvbiAqLworCQlwcmludGYoIiVkOiVzICIsIGksIHN0YXQgJiAoMHgwOCA+PiBpKT8ib24iOiJvZmYiKTsKKwlwcmludGYoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK1VfQk9PVF9DTUQgKAorCXN3Ml9zdGF0LCAxLCAxLCBkb19zd19zdGF0LAorCSJzdzJfc3RhdCAtIHNob3cgc3RhdHVzIG9mIHN3aXRjaCAyXG4iLAorCU5VTEwKKwkpOworCitzdGF0aWMgaW50IGRvX2xlZF9jdGwoY21kX3RibF90KiBjbWRfdHAsIGludCBmbGFncywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgbGVkX25vOworCisJaWYgKGFyZ2MgIT0gMykgeworCQlwcmludGYoIiVzIiwgY21kX3RwLT51c2FnZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZWRfbm8gPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisJaWYgKGxlZF9ubyAhPSAxICYmIGxlZF9ubyAhPSAyKSB7CisJCXByaW50ZigiJXMiLCBjbWRfdHAtPnVzYWdlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzdHJjbXAoYXJndlsyXSwib2ZmIikgPT0gMHgwKSB7CisJCWlmIChsZWRfbm8gPT0gMSkKKwkJCWdwaW9fd3JpdGVfYml0KDMwLCAxKTsKKwkJZWxzZQorCQkJZ3Bpb193cml0ZV9iaXQoMzEsIDEpOworCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sIm9uIikgPT0gMHgwKSB7CisJCWlmIChsZWRfbm8gPT0gMSkKKwkJCWdwaW9fd3JpdGVfYml0KDMwLCAwKTsKKwkJZWxzZQorCQkJZ3Bpb193cml0ZV9iaXQoMzEsIDApOworCX0gZWxzZSB7CisJCXByaW50ZigiJXMiLCBjbWRfdHAtPnVzYWdlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitVX0JPT1RfQ01EICgKKwlsZWRfY3RsLCAzLCAxLCBkb19sZWRfY3RsLAorCSJsZWRfY3RsCS0gbWFrZSBsZWQgMSBvciAyICBvbiBvciBvZmZcbiIsCisJIjxsZWRfbm8+IDxvbi9vZmY+CS0gIG1ha2UgbGVkIDxsZWRfbm8+IG9uL29mZixcbiIKKwkiXHRsZWRfbm8gaXMgMSBvciAyXHQiCisJKTsKKworI2RlZmluZSBTUElfQ1NfR1BJTzAJMAorI2RlZmluZSBTUElfU0NMS19HUElPMTQJMTQKKyNkZWZpbmUgU1BJX0RJTl9HUElPMTUJMTUKKyNkZWZpbmUgU1BJX0RPVVRfR1BJTzE2CTE2CisKK3ZvaWQgc3BpX3NjbChpbnQgYml0KQoreworCWdwaW9fd3JpdGVfYml0KFNQSV9TQ0xLX0dQSU8xNCwgYml0KTsKK30KKwordm9pZCBzcGlfc2RhKGludCBiaXQpCit7CisJZ3Bpb193cml0ZV9iaXQoU1BJX0RPVVRfR1BJTzE2LCBiaXQpOworfQorCit1bnNpZ25lZCBjaGFyIHNwaV9yZWFkKHZvaWQpCit7CisJcmV0dXJuICh1bnNpZ25lZCBjaGFyKWdwaW9fcmVhZF9vdXRfYml0KFNQSV9ESU5fR1BJTzE1KTsKK30KKwordm9pZCB0YWlodV9zcGlfY2hpcHNlbChpbnQgY3MpCit7CisJZ3Bpb193cml0ZV9iaXQoU1BJX0NTX0dQSU8wLCBjcyk7Cit9CisKK3NwaV9jaGlwc2VsX3R5cGUgc3BpX2NoaXBzZWxbXT0geworCXRhaWh1X3NwaV9jaGlwc2VsCit9OworCitpbnQgc3BpX2NoaXBzZWxfY250ID0gc2l6ZW9mKHNwaV9jaGlwc2VsKSAvIHNpemVvZihzcGlfY2hpcHNlbFswXSk7CisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgdW5zaWduZWQgY2hhciBpbnRfbGluZXNbMzJdID0geworCTI5LCAzMCwgMjcsIDI4LCAyOSwgMzAsIDI1LCAyNywKKwkyOSwgMzAsIDI3LCAyOCwgMjksIDMwLCAyNywgMjgsCisJMjksIDMwLCAyNywgMjgsIDI5LCAzMCwgMjcsIDI4LAorCTI5LCAzMCwgMjcsIDI4LCAyOSwgMzAsIDI3LCAyOH07CisKK3N0YXRpYyB2b2lkIHRhaWh1X3BjaV9maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQoreworCXVuc2lnbmVkIGNoYXIgaW50X2xpbmUgPSBpbnRfbGluZXNbUENJX0RFVihkZXYpICYgMzFdOworCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGludF9saW5lKTsKK30KKworaW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJaG9zZS0+Zml4dXBfaXJxID0gdGFpaHVfcGNpX2ZpeHVwX2lycTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNpZmRlZiBDRkdfRFJBTV9URVNUCitpbnQgdGVzdGRyYW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICptZW0gPSAodW5zaWduZWQgbG9uZyAqKTA7CisJY29uc3QgdW5zaWduZWQgbG9uZyBrZW5kID0gKDEwMjQgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOworCXVuc2lnbmVkIGxvbmcgaywgbjsKKwl1bnNpZ25lZCBsb25nIG1zcjsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX2tieXRlcyA9IENGR19TRFJBTV9TSVpFX1BFUl9CQU5LICogQ0ZHX1NEUkFNX0JBTktTIC8gMTAyNDsKKworCW1zciA9IG1mbXNyKCk7CisJbXRtc3IobXNyICYgfihNU1JfRUUpKTsKKworCWZvciAoayA9IDA7IGsgPCB0b3RhbF9rYnl0ZXMgOworCSAgICAgKytrLCBtZW0gKz0gKDEwMjQgLyBzaXplb2YodW5zaWduZWQgbG9uZykpKSB7CisJCWlmICgoayAmIDEwMjMpID09IDApCisJCQlwcmludGYoIiUzZCBNQlxyIiwgayAvIDEwMjQpOworCisJCW1lbXNldChtZW0sIDB4YWFhYWFhYWEsIDEwMjQpOworCQlmb3IgKG4gPSAwOyBuIDwga2VuZDsgKytuKSB7CisJCQlpZiAobWVtW25dICE9IDB4YWFhYWFhYWEpIHsKKwkJCQlwcmludGYoIlNEUkFNIHRlc3QgZmFpbHMgYXQ6ICUwOHhcbiIsCisJCQkJICAgICAgICh1aW50KSAmIG1lbVtuXSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCQltZW1zZXQobWVtLCAweDU1NTU1NTU1LCAxMDI0KTsKKwkJZm9yIChuID0gMDsgbiA8IGtlbmQ7ICsrbikgeworCQkJaWYgKG1lbVtuXSAhPSAweDU1NTU1NTU1KSB7CisJCQkJcHJpbnRmKCJTRFJBTSB0ZXN0IGZhaWxzIGF0OiAlMDh4XG4iLAorCQkJCSAgICAgICAodWludCkgJiBtZW1bbl0pOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCXByaW50ZigiU0RSQU0gdGVzdCBwYXNzZXNcbiIpOworCW10bXNyKG1zcik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDRkdfRFJBTV9URVNUICovCmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL3RhaWh1L3UtYm9vdC5sZHMgYi9ib2FyZC9hbWNjL3RhaWh1L3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwMzA5MgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FtY2MvdGFpaHUvdS1ib290LmxkcwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC5yZXNldHZlYyAweEZGRkZGRkZDIDoKKyAgeworICAgICooLnJlc2V0dmVjKQorICB9ID0gMHhmZmZmCisKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbgkqLworICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEJWFhYIEZJWE1FIFhYWAkqLworCisgICAgY3B1L3BwYzR4eC9zdGFydC5vCSgudGV4dCkKKyAgICBjcHUvcHBjNHh4L2tnZGIubwkoLnRleHQpCisgICAgY3B1L3BwYzR4eC90cmFwcy5vCSgudGV4dCkKKyAgICBjcHUvcHBjNHh4L2ludGVycnVwdHMubwkoLnRleHQpCisgICAgY3B1L3BwYzR4eC9zZXJpYWwubwkoLnRleHQpCisgICAgY3B1L3BwYzR4eC9jcHVfaW5pdC5vCSgudGV4dCkKKyAgICBjcHUvcHBjNHh4L3NwZWVkLm8JKC50ZXh0KQorICAgIGNvbW1vbi9kbG1hbGxvYy5vCSgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCisgICAgbGliX3BwYy9leHRhYmxlLm8JKC50ZXh0KQorICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQorCisvKiAgICAuID0gZW52X29mZnNldDsqLworLyogICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpKi8KKworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgICAgKiguZ290MSkKKyAgfQorICBfZXRleHQgPSAuOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy90YWlodS91cGRhdGUuYyBiL2JvYXJkL2FtY2MvdGFpaHUvdXBkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZDUzNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FtY2MvdGFpaHUvdXBkYXRlLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxpMmMuaD4KKworI2RlZmluZSBQQ0lfTTY2RU4gMHgxMAorCitzdGF0aWMgdWNoYXIgYnVmXzMzW10gPQoreworCTB4YjUsCS8qIDB4MDA6aGNlID0xLCBic3MgPSAwLCBwYWU9MSwgcHBkdj0gMGIxMCxzcGUgPSAxLGVidz0wYjAxKi8KKwkweDgwLAkvKiAweDAxfjB4MDM6cHRtMW1zID0weDgwMDAwMDAxICovCisJMHgwMCwKKwkweDAwLAorCTB4MDAsCS8qIDB4MDR+MHgwNjpwdG0xbGEgPSAweDAwMDAwMDAwICovCisJMHgwMCwKKwkweDAwLAorCTB4MDAsCS8qIDB4MDd+MHgwOTpwdG0ybWEgPSAweDAwMDAwMDAwICovCisJMHgwMCwKKwkweDAwLAorCTB4MDAsCS8qIDB4MGF+MHgwYzpwdG0ybGEgPSAweDAwMDAwMDAwICovCisJMHgwMCwKKwkweDAwLAorCTB4MTAsCS8qIDB4MGR+MHgwZTp2ZW5kb3IgaWQgMHgxMDE0Ki8KKwkweDE0LAorCTB4MDAsCS8qIDB4MGZ+MHgxMDpkZXZpY2UgaWQgMHgwMDAwKi8KKwkweDAwLAorCTB4MDAsCS8qIDB4MTE6cmV2aXNpb24gMHgwMCAqLworCTB4MDAsCS8qIDB4MTJ+MHgxNDpjbGFzcyAweDAwMDAwMCAqLworCTB4MDAsCisJMHgwMCwKKwkweDEwLAkvKiAweDE1fjB4MTY6c3Vic3lzdGVtIHZlbmRvciBpZCAqLworCTB4ZTgsCisJMHgwMCwJLyogMHgxN34weDE4OnN1YnN5c3RlbSBkZXZpY2UgaWQgKi8KKwkweDAwLAorCTB4NjEsCS8qIDB4MTk6IG9wZHY9MGIwMSxjYmR2PTBiMTAsY2Nkdj0wYjAwLHB0bTJtc19lbmE9MCwgcHRtMW1zX2VuYT0xICovCisJMHg2OCwJLyogMHgxYTogcnBjaT0xLGZibXVsPTBiMTAxMCxlcGR2PTBiMDAgKi8KKwkweDJkLAkvKiAweDFiOiBmd2R2Yj0wYjEwMSxmd2R2YT0wYjEwMSAqLworCTB4ODIsCS8qIDB4MWM6IHBsbHI9MSxzc2NzPTAsbXBkdj0wYjAwLHR1blsyMi0yM109MGIxMCAqLworCTB4YmUsCS8qIDB4MWQ6IHR1blsyNC0zMV09MHhiZSAqLworCTB4MDAsCisJMHgwMAorfTsKKworc3RhdGljIHVjaGFyIGJ1Zl82NltdID0KK3sKKwkweGI1LAkvKiAweDAwOmhjZSA9MSwgYnNzID0gMCwgcGFlPTEsIHBwZHY9IDBiMTAsc3BlID0gMSxlYnc9MGIwMSovCisJMHg4MCwJLyogMHgwMX4weDAzOnB0bTFtcyA9MHg4MDAwMDAwMSAqLworCTB4MDAsCisJMHgwMCwKKwkweDAwLAkvKiAweDA0fjB4MDY6cHRtMWxhID0gMHgwMDAwMDAwMCAqLworCTB4MDAsCisJMHgwMCwKKwkweDAwLAkvKiAweDA3fjB4MDk6cHRtMm1hID0gMHgwMDAwMDAwMCAqLworCTB4MDAsCisJMHgwMCwKKwkweDAwLAkvKiAweDBhfjB4MGM6cHRtMmxhID0gMHgwMDAwMDAwMCAqLworCTB4MDAsCisJMHgwMCwKKwkweDEwLAkvKiAweDBkfjB4MGU6dmVuZG9yIGlkIDB4MTAxNCovCisJMHgxNCwKKwkweDAwLAkvKiAweDBmfjB4MTA6ZGV2aWNlIGlkIDB4MDAwMCovCisJMHgwMCwKKwkweDAwLAkvKiAweDExOnJldmlzaW9uIDB4MDAgKi8KKwkweDAwLAkvKiAweDEyfjB4MTQ6Y2xhc3MgMHgwMDAwMDAgKi8KKwkweDAwLAorCTB4MDAsCisJMHgxMCwJLyogMHgxNX4weDE2OnN1YnN5c3RlbSB2ZW5kb3IgaWQgKi8KKwkweGU4LAorCTB4MDAsCS8qIDB4MTd+MHgxODpzdWJzeXN0ZW0gZGV2aWNlIGlkICovCisJMHgwMCwKKwkweDYxLAkvKiAweDE5OiBvcGR2PTBiMDEsY2Jkdj0wYjEwLGNjZHY9MGIwMCxwdG0ybXNfZW5hPTAsIHB0bTFtc19lbmE9MSAqLworCTB4NjgsCS8qIDB4MWE6IHJwY2k9MSxmYm11bD0wYjEwMTAsZXBkdj0wYjAwICovCisJMHgyZCwJLyogMHgxYjogZndkdmI9MGIxMDEsZndkdmE9MGIxMDEgKi8KKwkweDgyLAkvKiAweDFjOiBwbGxyPTEsc3Njcz0wLG1wZHY9MGIwMCx0dW5bMjItMjNdPTBiMTAgKi8KKwkweGJlLAkvKiAweDFkOiB0dW5bMjQtMzFdPTB4YmUgKi8KKwkweDAwLAorCTB4MDAKK307CisKK3N0YXRpYyBpbnQgdXBkYXRlX2Jvb3RfZWVwcm9tKGNtZF90YmxfdCogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVsb25nIGxlbiA9IDB4MjA7CisJdWNoYXIgY2hpcCA9IENGR19JMkNfRUVQUk9NX0FERFI7CisJdWNoYXIgKnBidWY7CisJdWNoYXIgYmFzZTsKKwlpbnQgaTsKKworCWlmICgoKih2b2xhdGlsZSBjaGFyKilDUExEX1JFRzBfQUREUiAmIFBDSV9NNjZFTikgIT0gUENJX002NkVOKSB7CisJCXBidWYgPSBidWZfMzM7CisJCWJhc2UgPSAweDAwOworCX0gZWxzZSB7CisJCXBidWYgPSBidWZfNjY7CisJCWJhc2UgPSAweDQwOworCX0KKworCWZvciAoaSA9IDA7IGk8IGxlbjsgaSsrLCBiYXNlKyspIHsKKwkJaWYgKGkyY193cml0ZShjaGlwLCBiYXNlLCAxLCAmcGJ1ZltpXSwxKSE9IDApIHsKKwkJCXByaW50ZigiaTJjX3dyaXRlIGZhaWxcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJdWRlbGF5KDExMDAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworVV9CT09UX0NNRCAoCisJdXBkYXRlX2Jvb3RfZWVwcm9tLCAxLCAxLCB1cGRhdGVfYm9vdF9lZXByb20sCisJInVwZGF0ZV9ib290X2VlcHJvbSAgLSB1cGRhdGUgYm9vdCBlZXByb20gY29udGVudFxuIiwKKwlOVUxMCisJKTsKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MveXVjY2EveXVjY2EuYyBiL2JvYXJkL2FtY2MveXVjY2EveXVjY2EuYwppbmRleCA3MzE2YzM0Li5kMDhmY2YzIDEwMDY0NAotLS0gYS9ib2FyZC9hbWNjL3l1Y2NhL3l1Y2NhLmMKKysrIGIvYm9hcmQvYW1jYy95dWNjYS95dWNjYS5jCkBAIC01NjIsNiArNTYyLDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgaW4gY3B1L3BwYzR4eC80NHhfc3BkX2RkcjIuYyB3aXRoCisgKiBib2FyZCBzcGVjaWZpYyB2YWx1ZXMuCisgKi8KK3N0YXRpYyBpbnQgcHBjNDQwc3BlX3Jldl9hKHZvaWQpCit7CisJaWYgKChnZXRfcHZyKCkgPT0gUFZSXzQ0MFNQZV82X1JBKSB8fCAoZ2V0X3B2cigpID09IFBWUl80NDBTUGVfUkEpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCit1MzIgZGRyX3dyZHRyKHUzMiBkZWZhdWx0X3ZhbCkgeworCS8qCisJICogWXVjY2EgYm9hcmRzIHdpdGggNDQwU1BlIHJldi4gQSBuZWVkIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHNldHVwCisJICogZm9yIHRoZSBNQ0lGMF9XUkRUUiByZWdpc3Rlci4KKwkgKi8KKwlpZiAocHBjNDQwc3BlX3Jldl9hKCkpCisJCXJldHVybiAoU0RSQU1fV1JEVFJfTExXUF8xX0NZQyB8IFNEUkFNX1dSRFRSX1dUUl8yNzBfREVHX0FEVik7CisKKwlyZXR1cm4gZGVmYXVsdF92YWw7Cit9CisKK3UzMiBkZHJfY2xrdHIodTMyIGRlZmF1bHRfdmFsKSB7CisJLyoKKwkgKiBZdWNjYSBib2FyZHMgd2l0aCA0NDBTUGUgcmV2LiBBIG5lZWQgYSBzbGlnaHRseSBkaWZmZXJlbnQgc2V0dXAKKwkgKiBmb3IgdGhlIE1DSUYwX0NMS1RSIHJlZ2lzdGVyLgorCSAqLworCWlmIChwcGM0NDBzcGVfcmV2X2EoKSkKKwkJcmV0dXJuIChTRFJBTV9DTEtUUl9DTEtQXzE4MF9ERUdfQURWKTsKKworCXJldHVybiBkZWZhdWx0X3ZhbDsKK30KKwogI2lmIGRlZmluZWQoQ0ZHX0RSQU1fVEVTVCkKIGludCB0ZXN0ZHJhbSAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL2FtaXJpeC9hcDEwMDAvc2VyaWFsLmMgYi9ib2FyZC9hbWlyaXgvYXAxMDAwL3NlcmlhbC5jCmluZGV4IGM2ZWU3NzIuLjVlOWUzYTMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2FtaXJpeC9hcDEwMDAvc2VyaWFsLmMKKysrIGIvYm9hcmQvYW1pcml4L2FwMTAwMC9zZXJpYWwuYwpAQCAtODQsNyArODQsNyBAQAogCX0KIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiB2b2lkIGtnZGJfc2VyaWFsX2luaXQgKHZvaWQpCiB7CiB9CkBAIC0xMDgsNCArMTA4LDQgQEAKIHsKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2F0OTFybTkyMDBkay9NYWtlZmlsZSBiL2JvYXJkL2F0OTFybTkyMDBkay9NYWtlZmlsZQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDBmY2FmZDkuLjAxZjNiYzMKLS0tIGEvYm9hcmQvYXQ5MXJtOTIwMGRrL01ha2VmaWxlCisrKyBiL2JvYXJkL2F0OTFybTkyMDBkay9NYWtlZmlsZQpAQCAtMjUsNyArMjUsNyBAQAogCiBMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCiAKLUNPQkpTCTo9IGF0OTFybTkyMDBkay5vIGF0NDUubyBmbGFzaC5vCitDT0JKUwk6PSBhdDkxcm05MjAwZGsubyBmbGFzaC5vIGxlZC5vIG11eC5vCiAKIFNSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvYm9hcmQvYXQ5MXJtOTIwMGRrL2F0NDUuYyBiL2JvYXJkL2F0OTFybTkyMDBkay9hdDQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODZmZTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvYXQ5MXJtOTIwMGRrL2F0NDUuYworKysgL2Rldi9udWxsCkBAIC0xLDYyMSArMCwwIEBACi0vKiBEcml2ZXIgZm9yIEFUTUVMIERhdGFGbGFzaCBzdXBwb3J0Ci0gKiBBdXRob3IgOiBIYW1pZCBJa2RvdW1pIChBdG1lbCkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGNvbW1vbi5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotCi0jaWZkZWYgQ09ORklHX0hBU19EQVRBRkxBU0gKLSNpbmNsdWRlIDxkYXRhZmxhc2guaD4KLQotI2RlZmluZSBBVDkxQ19TUElfQ0xLCTEwMDAwMDAwCS8qIE1heCBWYWx1ZSA9IDEwTUh6IHRvIGJlIGNvbXBsaWFudCB0bwotdGhlIENvbnRpbnVvdXMgQXJyYXkgUmVhZCBmdW5jdGlvbiAqLwotCi0vKiBBQyBDaGFyYWN0ZXJpc3RpY3MgKi8KLS8qIERMWUJTID0gdENTUyA9IDI1MG5zIG1pbiBhbmQgRExZQkNUID0gdENTSCA9IDI1MG5zICovCi0jZGVmaW5lIERBVEFGTEFTSF9UQ1NTCSgweEMgPDwgMTYpCi0jZGVmaW5lIERBVEFGTEFTSF9UQ0hTCSgweDEgPDwgMjQpCi0KLSNkZWZpbmUgQVQ5MUNfVElNRU9VVF9XUkRZCQkJMjAwMDAwCi0jZGVmaW5lIEFUOTFDX1NQSV9QQ1MwX1NFUklBTF9EQVRBRkxBU0gJCTB4RSAgICAgLyogQ2hpcCBTZWxlY3QgMCA6IE5QQ1MwICUxMTEwICovCi0jZGVmaW5lIEFUOTFDX1NQSV9QQ1MzX0RBVEFGTEFTSF9DQVJECQkweDcgICAgIC8qIENoaXAgU2VsZWN0IDMgOiBOUENTMyAlMDExMSAqLwotCi12b2lkIEFUOTFGX1NwaUluaXQodm9pZCkgewotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoJU1BJIERhdGFGbGFzaCBJbml0CQkJCQkJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkvKiBDb25maWd1cmUgUElPcyAqLwotCUFUOTFDX0JBU0VfUElPQS0+UElPX0FTUiA9IEFUOTFDX1BBM19OUENTMCB8IEFUOTFDX1BBNF9OUENTMSB8IEFUOTFDX1BBMV9NT1NJIHwgQVQ5MUNfUEE1X05QQ1MyIHwKLQkJCQkgICBBVDkxQ19QQTZfTlBDUzMgfCBBVDkxQ19QQTBfTUlTTyB8IEFUOTFDX1BBMl9TUENLOwotCUFUOTFDX0JBU0VfUElPQS0+UElPX1BEUiA9IEFUOTFDX1BBM19OUENTMCB8IEFUOTFDX1BBNF9OUENTMSB8IEFUOTFDX1BBMV9NT1NJIHwgQVQ5MUNfUEE1X05QQ1MyIHwKLQkJCQkgICBBVDkxQ19QQTZfTlBDUzMgfCBBVDkxQ19QQTBfTUlTTyB8IEFUOTFDX1BBMl9TUENLOwotCS8qIEVuYWJsZSBDTG9jayAqLwotCUFUOTFDX0JBU0VfUE1DLT5QTUNfUENFUiA9IDEgPDwgQVQ5MUNfSURfU1BJOwotCi0JLyogUmVzZXQgdGhlIFNQSSAqLwotCUFUOTFDX0JBU0VfU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1dSU1Q7Ci0KLQkvKiBDb25maWd1cmUgU1BJIGluIE1hc3RlciBNb2RlIHdpdGggTm8gQ1Mgc2VsZWN0ZWQgISEhICovCi0JQVQ5MUNfQkFTRV9TUEktPlNQSV9NUiA9IEFUOTFDX1NQSV9NU1RSIHwgQVQ5MUNfU1BJX01PREZESVMgfCBBVDkxQ19TUElfUENTOwotCi0JLyogQ29uZmlndXJlIENTMCBhbmQgQ1MzICovCi0JKihBVDkxQ19TUElfQ1NSICsgMCkgPSBBVDkxQ19TUElfQ1BPTCB8IChBVDkxQ19TUElfRExZQlMgJiBEQVRBRkxBU0hfVENTUykgfCAoQVQ5MUNfU1BJX0RMWUJDVCAmCi0JREFUQUZMQVNIX1RDSFMpIHwgKChBVDkxQ19NQVNURVJfQ0xPQ0sgLyAoMipBVDkxQ19TUElfQ0xLKSkgPDwgOCk7Ci0KLQkqKEFUOTFDX1NQSV9DU1IgKyAzKSA9IEFUOTFDX1NQSV9DUE9MIHwgKEFUOTFDX1NQSV9ETFlCUyAmIERBVEFGTEFTSF9UQ1NTKSB8IChBVDkxQ19TUElfRExZQkNUICYKLQlEQVRBRkxBU0hfVENIUykgfCAoKEFUOTFDX01BU1RFUl9DTE9DSyAvICgyKkFUOTFDX1NQSV9DTEspKSA8PCA4KTsKLQotfQotCi12b2lkIEFUOTFGX1NwaUVuYWJsZShpbnQgY3MpIHsKLQlzd2l0Y2goY3MpIHsKLQljYXNlIDA6CS8qIENvbmZpZ3VyZSBTUEkgQ1MwIGZvciBTZXJpYWwgRGF0YUZsYXNoIEFUNDVEQnh4ICovCi0JCUFUOTFDX0JBU0VfU1BJLT5TUElfTVIgJj0gMHhGRkYwRkZGRjsKLQkJQVQ5MUNfQkFTRV9TUEktPlNQSV9NUiB8PSAoKEFUOTFDX1NQSV9QQ1MwX1NFUklBTF9EQVRBRkxBU0g8PDE2KSAmIEFUOTFDX1NQSV9QQ1MpOwotCQlicmVhazsKLQljYXNlIDM6CS8qIENvbmZpZ3VyZSBTUEkgQ1MzIGZvciBTZXJpYWwgRGF0YUZsYXNoIENhcmQgKi8KLQkJLyogU2V0IHVwIFBJTyBTRENfVFlQRSB0byBzd2l0Y2ggb24gRGF0YUZsYXNoIENhcmQgYW5kIG5vdCBNTUMvU0RDYXJkICovCi0JCUFUOTFDX0JBU0VfUElPQi0+UElPX1BFUiA9IEFUOTFDX1BJT19QQjc7CS8qIFNldCBpbiBQSU8gbW9kZSAqLwotCQlBVDkxQ19CQVNFX1BJT0ItPlBJT19PRVIgPSBBVDkxQ19QSU9fUEI3OwkvKiBDb25maWd1cmUgaW4gb3V0cHV0ICovCi0JCS8qIENsZWFyIE91dHB1dCAqLwotCQlBVDkxQ19CQVNFX1BJT0ItPlBJT19DT0RSID0gQVQ5MUNfUElPX1BCNzsKLQkJLyogQ29uZmlndXJlIFBDUyAqLwotCQlBVDkxQ19CQVNFX1NQSS0+U1BJX01SICY9IDB4RkZGMEZGRkY7Ci0JCUFUOTFDX0JBU0VfU1BJLT5TUElfTVIgfD0gKChBVDkxQ19TUElfUENTM19EQVRBRkxBU0hfQ0FSRDw8MTYpICYgQVQ5MUNfU1BJX1BDUyk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFNQSV9FbmFibGUgKi8KLQlBVDkxQ19CQVNFX1NQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NQSUVOOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogXGZuICAgIEFUOTFGX1NwaVdyaXRlCQkJCQkJICAgICAgKi8KLS8qIFxicmllZiBTZXQgdGhlIFBEQyByZWdpc3RlcnMgZm9yIGEgdHJhbnNmZXJ0CQkJCSAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdW5zaWduZWQgaW50IEFUOTFGX1NwaVdyaXRlICggQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MgKQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0OwotCi0JcERlc2MtPnN0YXRlID0gQlVTWTsKLQotCUFUOTFDX0JBU0VfU1BJLT5TUElfUFRDUiA9IEFUOTFDX1BEQ19UWFRESVMgKyBBVDkxQ19QRENfUlhURElTOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgVHJhbnNtaXQgYW5kIFJlY2VpdmUgUG9pbnRlciAqLwotCUFUOTFDX0JBU0VfU1BJLT5TUElfUlBSID0gKHVuc2lnbmVkIGludClwRGVzYy0+cnhfY21kX3B0IDsKLQlBVDkxQ19CQVNFX1NQSS0+U1BJX1RQUiA9ICh1bnNpZ25lZCBpbnQpcERlc2MtPnR4X2NtZF9wdCA7Ci0KLQkvKiBJbnRpYWxpemUgdGhlIFRyYW5zbWl0IGFuZCBSZWNlaXZlIENvdW50ZXJzICovCi0JQVQ5MUNfQkFTRV9TUEktPlNQSV9SQ1IgPSBwRGVzYy0+cnhfY21kX3NpemU7Ci0JQVQ5MUNfQkFTRV9TUEktPlNQSV9UQ1IgPSBwRGVzYy0+dHhfY21kX3NpemU7Ci0KLQlpZiAoIHBEZXNjLT50eF9kYXRhX3NpemUgIT0gMCApIHsKLQkJLyogSW5pdGlhbGl6ZSB0aGUgTmV4dCBUcmFuc21pdCBhbmQgTmV4dCBSZWNlaXZlIFBvaW50ZXIgKi8KLQkJQVQ5MUNfQkFTRV9TUEktPlNQSV9STlBSID0gKHVuc2lnbmVkIGludClwRGVzYy0+cnhfZGF0YV9wdCA7Ci0JCUFUOTFDX0JBU0VfU1BJLT5TUElfVE5QUiA9ICh1bnNpZ25lZCBpbnQpcERlc2MtPnR4X2RhdGFfcHQgOwotCi0JCS8qIEludGlhbGl6ZSB0aGUgTmV4dCBUcmFuc21pdCBhbmQgTmV4dCBSZWNlaXZlIENvdW50ZXJzICovCi0JCUFUOTFDX0JBU0VfU1BJLT5TUElfUk5DUiA9IHBEZXNjLT5yeF9kYXRhX3NpemUgOwotCQlBVDkxQ19CQVNFX1NQSS0+U1BJX1ROQ1IgPSBwRGVzYy0+dHhfZGF0YV9zaXplIDsKLQl9Ci0KLQkvKiBhcm0gc2ltcGxlLCBub24gaW50ZXJydXB0IGRlcGVuZGVudCB0aW1lciAqLwotCXJlc2V0X3RpbWVyX21hc2tlZCgpOwotCXRpbWVvdXQgPSAwOwotCi0JQVQ5MUNfQkFTRV9TUEktPlNQSV9QVENSID0gQVQ5MUNfUERDX1RYVEVOICsgQVQ5MUNfUERDX1JYVEVOOwotCXdoaWxlKCEoQVQ5MUNfQkFTRV9TUEktPlNQSV9TUiAmIEFUOTFDX1NQSV9SWEJVRkYpICYmICgodGltZW91dCA9IGdldF90aW1lcl9tYXNrZWQoKSApIDwgQ0ZHX1NQSV9XUklURV9UT1VUKSk7Ci0JQVQ5MUNfQkFTRV9TUEktPlNQSV9QVENSID0gQVQ5MUNfUERDX1RYVERJUyArIEFUOTFDX1BEQ19SWFRESVM7Ci0JcERlc2MtPnN0YXRlID0gSURMRTsKLQotCWlmICh0aW1lb3V0ID49IENGR19TUElfV1JJVEVfVE9VVCl7Ci0JCXByaW50ZigiRXJyb3IgVGltZW91dFxuXHIiKTsKLQkJcmV0dXJuIERBVEFGTEFTSF9FUlJPUjsKLQl9Ci0KLQlyZXR1cm4gREFUQUZMQVNIX09LOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBcZm4gICAgQVQ5MUZfRGF0YUZsYXNoU2VuZENvbW1hbmQJCQkJCSovCi0vKiBcYnJpZWYgR2VuZXJpYyBmdW5jdGlvbiB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgZGF0YWZsYXNoCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZCgKLQlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCi0JdW5zaWduZWQgY2hhciBPcENvZGUsCi0JdW5zaWduZWQgaW50IENtZFNpemUsCi0JdW5zaWduZWQgaW50IERhdGFmbGFzaEFkZHJlc3MpCi17Ci0gICAgdW5zaWduZWQgaW50IGFkcjsKLQotCWlmICggKHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5zdGF0ZSkgIT0gSURMRSkKLQkJcmV0dXJuIERBVEFGTEFTSF9CVVNZOwotCi0JLyogcHJvY2VzcyB0aGUgYWRkcmVzcyB0byBvYnRhaW4gcGFnZSBhZGRyZXNzIGFuZCBieXRlIGFkZHJlc3MgKi8KLQlhZHIgPSAoKERhdGFmbGFzaEFkZHJlc3MgLyAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkpIDw8IHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2Vfb2Zmc2V0KSArIChEYXRhZmxhc2hBZGRyZXNzICUgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKTsKLQotCS8qIGZpbGwgdGhlICBjb21tYW5kICBidWZmZXIgKi8KLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFswXSA9IE9wQ29kZTsKLQlpZiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyID49IDE2Mzg0KSB7Ci0JCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzFdID0gKHVuc2lnbmVkIGNoYXIpKChhZHIgJiAweDBGMDAwMDAwKSA+PiAyNCk7Ci0JCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzJdID0gKHVuc2lnbmVkIGNoYXIpKChhZHIgJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0JCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzNdID0gKHVuc2lnbmVkIGNoYXIpKChhZHIgJiAweDAwMDBGRjAwKSA+PiA4KTsKLQkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNF0gPSAodW5zaWduZWQgY2hhcikoYWRyICYgMHgwMDAwMDBGRik7Ci0JfSBlbHNlIHsKLQkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMV0gPSAodW5zaWduZWQgY2hhcikoKGFkciAmIDB4MDBGRjAwMDApID4+IDE2KTsKLQkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPSAodW5zaWduZWQgY2hhcikoKGFkciAmIDB4MDAwMEZGMDApID4+IDgpOwotCQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFszXSA9ICh1bnNpZ25lZCBjaGFyKShhZHIgJiAweDAwMDAwMEZGKSA7Ci0JCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzRdID0gMDsKLQl9Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNV0gPSAwOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzZdID0gMDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFs3XSA9IDA7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBTcGlEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHNwaSB3cml0ZSBmdWN0aW9uICovCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2NtZF9wdCAgID0gIHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kIDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfY21kX3NpemUgPSAgQ21kU2l6ZSA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2NtZF9wdCAgID0gIHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kIDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+cnhfY21kX3NpemUgPSAgQ21kU2l6ZSA7Ci0KLQkvKiBzZW5kIHRoZSBjb21tYW5kIGFuZCByZWFkIHRoZSBkYXRhICovCi0JcmV0dXJuIEFUOTFGX1NwaVdyaXRlIChwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYyk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFxmbiAgICBBVDkxRl9EYXRhRmxhc2hHZXRTdGF0dXMJCQkJCSovCi0vKiBcYnJpZWYgUmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBkYXRhZmxhc2gJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hHZXRTdGF0dXMoQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MpCi17Ci0JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIHN0YXR1czsKLQotCS8qIGlmIGEgdHJhbnNmZXJ0IGlzIGluIHByb2dyZXNzID09PiByZXR1cm4gMCAqLwotCWlmKCAocERlc2MtPnN0YXRlKSAhPSBJRExFKQotCQlyZXR1cm4gREFUQUZMQVNIX0JVU1k7Ci0KLQkvKiBmaXJzdCBzZW5kIHRoZSByZWFkIHN0YXR1cyBjb21tYW5kIChEN0gpICovCi0JcERlc2MtPmNvbW1hbmRbMF0gPSBEQl9TVEFUVVM7Ci0JcERlc2MtPmNvbW1hbmRbMV0gPSAwOwotCi0JcERlc2MtPkRhdGFGbGFzaF9zdGF0ZSAgPSBHRVRfU1RBVFVTOwotCXBEZXNjLT50eF9kYXRhX3NpemUgCT0gMCA7CS8qIFRyYW5zbWl0IHRoZSBjb21tYW5kIGFuZCByZWNlaXZlIHJlc3BvbnNlICovCi0JcERlc2MtPnR4X2NtZF9wdCAJCT0gcERlc2MtPmNvbW1hbmQgOwotCXBEZXNjLT5yeF9jbWRfcHQgCQk9IHBEZXNjLT5jb21tYW5kIDsKLQlwRGVzYy0+cnhfY21kX3NpemUgCQk9IDIgOwotCXBEZXNjLT50eF9jbWRfc2l6ZSAJCT0gMiA7Ci0Jc3RhdHVzID0gQVQ5MUZfU3BpV3JpdGUgKHBEZXNjKTsKLQotCXBEZXNjLT5EYXRhRmxhc2hfc3RhdGUgPSAqKCAodW5zaWduZWQgY2hhciAqKSAocERlc2MtPnJ4X2NtZF9wdCkgKzEpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogXGZuICAgIEFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeQkJCQkJKi8KLS8qIFxicmllZiB3YWl0IGZvciBkYXRhZmxhc2ggcmVhZHkgKGJpdDcgb2YgdGhlIHN0YXR1cyByZWdpc3RlciA9PSAxKQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkoQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERhdGFGbGFzaERlc2MsIHVuc2lnbmVkIGludCB0aW1lb3V0KQotewotCXBEYXRhRmxhc2hEZXNjLT5EYXRhRmxhc2hfc3RhdGUgPSBJRExFOwotCi0JZG8gewotCQlBVDkxRl9EYXRhRmxhc2hHZXRTdGF0dXMocERhdGFGbGFzaERlc2MpOwotCQl0aW1lb3V0LS07Ci0JfSB3aGlsZSggKChwRGF0YUZsYXNoRGVzYy0+RGF0YUZsYXNoX3N0YXRlICYgMHg4MCkgIT0gMHg4MCkgJiYgKHRpbWVvdXQgPiAwKSApOwotCi0JaWYoKHBEYXRhRmxhc2hEZXNjLT5EYXRhRmxhc2hfc3RhdGUgJiAweDgwKSAhPSAweDgwKQotCQlyZXR1cm4gREFUQUZMQVNIX0VSUk9SOwotCi0JcmV0dXJuIERBVEFGTEFTSF9PSzsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfRGF0YUZsYXNoQ29udGludW91c1JlYWQgCQkJCSovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogQ29udGludW91cyBzdHJlYW0gUmVhZCAJCQkJKi8KLS8qIElucHV0IFBhcmFtZXRlcnMgICAgOiBEYXRhRmxhc2ggU2VydmljZQkJCQkJKi8KLS8qCQkJCQkJOiA8c3JjPiA9IGRhdGFmbGFzaCBhZGRyZXNzCSovCi0vKiAgICAgICAgICAgICAgICAgICAgIDogPCpkYXRhQnVmZmVyPiA9IGRhdGEgYnVmZmVyIHBvaW50ZXIJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxzaXplVG9SZWFkPiA9IGRhdGEgYnVmZmVyIHNpemUJCQkqLwotLyogUmV0dXJuIHZhbHVlCQk6IFN0YXRlIG9mIHRoZSBkYXRhZmxhc2gJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hDb250aW51b3VzUmVhZCAoCi0JQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAotCWludCBzcmMsCi0JdW5zaWduZWQgY2hhciAqZGF0YUJ1ZmZlciwKLQlpbnQgc2l6ZVRvUmVhZCApCi17Ci0JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIHN0YXR1czsKLQkvKiBUZXN0IHRoZSBzaXplIHRvIHJlYWQgaW4gdGhlIGRldmljZSAqLwotCWlmICggKHNyYyArIHNpemVUb1JlYWQpID4gKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUgKiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyKSkpCi0JCXJldHVybiBEQVRBRkxBU0hfTUVNT1JZX09WRVJGTE9XOwotCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2RhdGFfcHQgPSBkYXRhQnVmZmVyOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9kYXRhX3NpemUgPSBzaXplVG9SZWFkOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3B0ID0gZGF0YUJ1ZmZlcjsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfZGF0YV9zaXplID0gc2l6ZVRvUmVhZDsKLQotCXN0YXR1cyA9IEFUOTFGX0RhdGFGbGFzaFNlbmRDb21tYW5kIChwRGF0YUZsYXNoLCBEQl9DT05USU5VT1VTX0FSUkFZX1JFQUQsIDgsIHNyYyk7Ci0JLyogU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgZGF0YWZsYXNoICovCi0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFGbGFzaFBhZ2VQZ21CdWYJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBNYWluIG1lbW9yeSBwYWdlIHByb2dyYW0gdGhyb3VnaCBidWZmZXIgMSBvciBidWZmZXIgMgkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCQkqLwotLyoJCQkJCQk6IDwqc3JjPiA9IFNvdXJjZSBidWZmZXIJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiA8ZGVzdD4gPSBkYXRhZmxhc2ggZGVzdGluYXRpb24gYWRkcmVzcwkJCSovCi0vKiAgICAgICAgICAgICAgICAgICAgIDogPFNpemVUb1dyaXRlPiA9IGRhdGEgYnVmZmVyIHNpemUJCQkqLwotLyogUmV0dXJuIHZhbHVlCQk6IFN0YXRlIG9mIHRoZSBkYXRhZmxhc2gJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hQYWdlUGdtQnVmKAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyICpzcmMsCi0JdW5zaWduZWQgaW50IGRlc3QsCi0JdW5zaWduZWQgaW50IFNpemVUb1dyaXRlKQotewotCWludCBjbWRzaXplOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3B0ID0gc3JjIDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfZGF0YV9zaXplID0gU2l6ZVRvV3JpdGUgOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9kYXRhX3B0ID0gc3JjOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9kYXRhX3NpemUgPSBTaXplVG9Xcml0ZTsKLQotCWNtZHNpemUgPSA0OwotCS8qIFNlbmQgdGhlIGNvbW1hbmQgdG8gdGhlIGRhdGFmbGFzaCAqLwotCWlmIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIgPj0gMTYzODQpCi0JCWNtZHNpemUgPSA1OwotCXJldHVybihBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZCAocERhdGFGbGFzaCwgREJfUEFHRV9QR01fQlVGMSwgY21kc2l6ZSwgZGVzdCkpOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9NYWluTWVtb3J5VG9CdWZmZXJUcmFuc2ZlcnQJCQkqLwotLyogT2JqZWN0ICAgICAgICAgICAgICA6IFJlYWQgYSBwYWdlIGluIHRoZSBTUkFNIEJ1ZmZlciAxIG9yIDIJCQkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IFBhZ2UgY29uY2VybmVkCQkJCQkJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiAJCQkJCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfTWFpbk1lbW9yeVRvQnVmZmVyVHJhbnNmZXJ0KAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyIEJ1ZmZlckNvbW1hbmQsCi0JdW5zaWduZWQgaW50IHBhZ2UpCi17Ci0JaW50IGNtZHNpemU7Ci0JLyogVGVzdCBpZiB0aGUgYnVmZmVyIGNvbW1hbmQgaXMgbGVnYWwgKi8KLQlpZiAoKEJ1ZmZlckNvbW1hbmQgIT0gREJfUEFHRV8yX0JVRjFfVFJGKSAmJiAoQnVmZmVyQ29tbWFuZCAhPSBEQl9QQUdFXzJfQlVGMl9UUkYpKQotCQlyZXR1cm4gREFUQUZMQVNIX0JBRF9DT01NQU5EOwotCi0JLyogbm8gZGF0YSB0byB0cmFuc21pdCBvciByZWNlaXZlICovCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfc2l6ZSA9IDA7Ci0JY21kc2l6ZSA9IDQ7Ci0JaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkKLQkJY21kc2l6ZSA9IDU7Ci0JcmV0dXJuKEFUOTFGX0RhdGFGbGFzaFNlbmRDb21tYW5kIChwRGF0YUZsYXNoLCBCdWZmZXJDb21tYW5kLCBjbWRzaXplLCBwYWdlKnBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfRGF0YUZsYXNoV3JpdGVCdWZmZXIJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBXcml0ZSBkYXRhIHRvIHRoZSBpbnRlcm5hbCBzcmFtIGJ1ZmZlciAxIG9yIDIJCSovCi0vKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogRGF0YUZsYXNoIFNlcnZpY2UJCQkJCSovCi0vKgkJCTogPEJ1ZmZlckNvbW1hbmQ+ID0gY29tbWFuZCB0byB3cml0ZSBidWZmZXIxIG9yIGJ1ZmZlcjIJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiA8KmRhdGFCdWZmZXI+ID0gZGF0YSBidWZmZXIgdG8gd3JpdGUJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxidWZmZXJBZGRyZXNzPiA9IGFkZHJlc3MgaW4gdGhlIGludGVybmFsIGJ1ZmZlcgkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxTaXplVG9Xcml0ZT4gPSBkYXRhIGJ1ZmZlciBzaXplCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoV3JpdGVCdWZmZXIgKAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyIEJ1ZmZlckNvbW1hbmQsCi0JdW5zaWduZWQgY2hhciAqZGF0YUJ1ZmZlciwKLQl1bnNpZ25lZCBpbnQgYnVmZmVyQWRkcmVzcywKLQlpbnQgU2l6ZVRvV3JpdGUgKQotewotCWludCBjbWRzaXplOwotCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGxlZ2FsICovCi0JaWYgKChCdWZmZXJDb21tYW5kICE9IERCX0JVRjFfV1JJVEUpICYmIChCdWZmZXJDb21tYW5kICE9IERCX0JVRjJfV1JJVEUpKQotCQlyZXR1cm4gREFUQUZMQVNIX0JBRF9DT01NQU5EOwotCi0JLyogYnVmZmVyIGFkZHJlc3MgbXVzdCBiZSBsb3dlciB0aGFuIHBhZ2Ugc2l6ZSAqLwotCWlmIChidWZmZXJBZGRyZXNzID4gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkKLQkJcmV0dXJuIERBVEFGTEFTSF9CQURfQUREUkVTUzsKLQotCWlmICggKHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5zdGF0ZSkgICE9IElETEUpCi0JCXJldHVybiBEQVRBRkxBU0hfQlVTWTsKLQotCS8qIFNlbmQgZmlyc3QgV3JpdGUgQ29tbWFuZCAqLwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzBdID0gQnVmZmVyQ29tbWFuZDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFsxXSA9IDA7Ci0JaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkgewotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPSAwOwotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbM10gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpKGJ1ZmZlckFkZHJlc3MgJiAgcERhdGFGbGFzaC0+cERldmljZS0+Ynl0ZV9tYXNrKSkgPj4gOCkgOwotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNF0gPSAodW5zaWduZWQgY2hhcikoKHVuc2lnbmVkIGludClidWZmZXJBZGRyZXNzICAmIDB4MDBGRikgOwotCQljbWRzaXplID0gNTsKLQl9IGVsc2UgewotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpKGJ1ZmZlckFkZHJlc3MgJiAgcERhdGFGbGFzaC0+cERldmljZS0+Ynl0ZV9tYXNrKSkgPj4gOCkgOwotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbM10gPSAodW5zaWduZWQgY2hhcikoKHVuc2lnbmVkIGludClidWZmZXJBZGRyZXNzICAmIDB4MDBGRikgOwotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNF0gPSAwOwotCQljbWRzaXplID0gNDsKLQl9Ci0KLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfY21kX3B0IAkgPSBwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZCA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2NtZF9zaXplID0gY21kc2l6ZSA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2NtZF9wdCAJID0gcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmQgOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9jbWRfc2l6ZSA9IGNtZHNpemUgOwotCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2RhdGFfcHQgCT0gZGF0YUJ1ZmZlciA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfcHQgCT0gZGF0YUJ1ZmZlciA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2RhdGFfc2l6ZSAJPSBTaXplVG9Xcml0ZSA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfc2l6ZSAJPSBTaXplVG9Xcml0ZSA7Ci0KLQlyZXR1cm4gQVQ5MUZfU3BpV3JpdGUocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfUGFnZUVyYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogRXJhc2UgYSBwYWdlIAkJCQkJCSovCi0vKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogRGF0YUZsYXNoIFNlcnZpY2UJCQkJCSovCi0vKiAgICAgICAgICAgICAgICAgICAgIDogUGFnZSBjb25jZXJuZWQJCQkJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IAkJCQkJCQkqLwotLyogUmV0dXJuIHZhbHVlCQk6IFN0YXRlIG9mIHRoZSBkYXRhZmxhc2gJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9QYWdlRXJhc2UoCi0JQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAotCXVuc2lnbmVkIGludCBwYWdlKQotewotCWludCBjbWRzaXplOwotCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGxlZ2FsICovCi0JLyogbm8gZGF0YSB0byB0cmFuc21pdCBvciByZWNlaXZlICovCi0gICAgCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3NpemUgPSAwOwotCi0JY21kc2l6ZSA9IDQ7Ci0JaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkKLQkJY21kc2l6ZSA9IDU7Ci0JcmV0dXJuKEFUOTFGX0RhdGFGbGFzaFNlbmRDb21tYW5kIChwRGF0YUZsYXNoLCBEQl9QQUdFX0VSQVNFLCBjbWRzaXplLCBwYWdlKnBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfQmxvY2tFcmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogRXJhc2UgYSBCbG9jayAJCQkJCQkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IFBhZ2UgY29uY2VybmVkCQkJCQkJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiAJCQkJCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfQmxvY2tFcmFzZSgKLQlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCi0JdW5zaWduZWQgaW50IGJsb2NrKQotewotCWludCBjbWRzaXplOwotCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGxlZ2FsICovCi0JLyogbm8gZGF0YSB0byB0cmFuc21pdCBvciByZWNlaXZlICovCi0gICAgCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3NpemUgPSAwOwotCWNtZHNpemUgPSA0OwotCWlmIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIgPj0gMTYzODQpCi0JCWNtZHNpemUgPSA1OwotCXJldHVybihBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZCAocERhdGFGbGFzaCwgREJfQkxPQ0tfRVJBU0UsY21kc2l6ZSwgYmxvY2sqOCpwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplKSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9Xcml0ZUJ1ZmZlclRvTWFpbgkJCQkqLwotLyogT2JqZWN0ICAgICAgICAgICAgICA6IFdyaXRlIGJ1ZmZlciB0byB0aGUgbWFpbiBtZW1vcnkJCQkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCQkqLwotLyoJCTogPEJ1ZmZlckNvbW1hbmQ+ID0gY29tbWFuZCB0byBzZW5kIHRvIGJ1ZmZlcjEgb3IgYnVmZmVyMgkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxkZXN0PiA9IG1haW4gbWVtb3J5IGFkZHJlc3MJCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfV3JpdGVCdWZmZXJUb01haW4gKAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyIEJ1ZmZlckNvbW1hbmQsCi0JdW5zaWduZWQgaW50IGRlc3QgKQotewotCWludCBjbWRzaXplOwotCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGNvcnJlY3QgKi8KLQlpZiAoKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMV9QQUdFX1BHTSkgJiYKLQkgICAgKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMV9QQUdFX0VSQVNFX1BHTSkgJiYKLQkgICAgKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMl9QQUdFX1BHTSkgJiYKLQkgICAgKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMl9QQUdFX0VSQVNFX1BHTSkgKQotCQlyZXR1cm4gREFUQUZMQVNIX0JBRF9DT01NQU5EOwotCi0JLyogbm8gZGF0YSB0byB0cmFuc21pdCBvciByZWNlaXZlICovCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfc2l6ZSA9IDA7Ci0KLQljbWRzaXplID0gNDsKLQlpZiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyID49IDE2Mzg0KQotCQljbWRzaXplID0gNTsKLQkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBkYXRhZmxhc2ggKi8KLQlyZXR1cm4oQVQ5MUZfRGF0YUZsYXNoU2VuZENvbW1hbmQgKHBEYXRhRmxhc2gsIEJ1ZmZlckNvbW1hbmQsIGNtZHNpemUsIGRlc3QpKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfUGFydGlhbFBhZ2VXcml0ZQkJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBFcmFzZSBwYXJ0aWVsbHkgYSBwYWdlCQkJCQkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IDxwYWdlPiA9IHBhZ2UgbnVtYmVyCQkJCQkqLwotLyoJCQk6IDxBZHJJbnBhZ2U+ID0gYWRyIHRvIGJlZ2luIHRoZSBmYWRpbmcJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxsZW5ndGg+ID0gTnVtYmVyIG9mIGJ5dGVzIHRvIGVyYXNlCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9QYXJ0aWFsUGFnZVdyaXRlICgKLQlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCi0JdW5zaWduZWQgY2hhciAqc3JjLAotCXVuc2lnbmVkIGludCBkZXN0LAotCXVuc2lnbmVkIGludCBzaXplKQotewotCXVuc2lnbmVkIGludCBwYWdlOwotCXVuc2lnbmVkIGludCBBZHJJblBhZ2U7Ci0KLQlwYWdlID0gZGVzdCAvIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplKTsKLQlBZHJJblBhZ2UgPSBkZXN0ICUgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpOwotCi0JLyogUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHBhZ2UgaW4gdGhlIFNyYW0gQnVmZmVyICovCi0JQVQ5MUZfTWFpbk1lbW9yeVRvQnVmZmVyVHJhbnNmZXJ0KHBEYXRhRmxhc2gsIERCX1BBR0VfMl9CVUYxX1RSRiwgcGFnZSk7Ci0JQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLCBBVDkxQ19USU1FT1VUX1dSRFkpOwotCS8qVXBkYXRlIHRoZSBTUkFNIGJ1ZmZlciAqLwotCUFUOTFGX0RhdGFGbGFzaFdyaXRlQnVmZmVyKHBEYXRhRmxhc2gsIERCX0JVRjFfV1JJVEUsIHNyYywgQWRySW5QYWdlLCBzaXplKTsKLQotCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywgQVQ5MUNfVElNRU9VVF9XUkRZKTsKLQotCS8qIEVyYXNlIHBhZ2UgaWYgYSAxMjggTWJpdHMgZGV2aWNlICovCi0JaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkgewotCQlBVDkxRl9QYWdlRXJhc2UocERhdGFGbGFzaCwgcGFnZSk7Ci0JCS8qIFJld3JpdGUgdGhlIG1vZGlmaWVkIFNyYW0gQnVmZmVyIGluIHRoZSBtYWluIG1lbW9yeSAqLwotCQlBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsIEFUOTFDX1RJTUVPVVRfV1JEWSk7Ci0JfQotCi0JLyogUmV3cml0ZSB0aGUgbW9kaWZpZWQgU3JhbSBCdWZmZXIgaW4gdGhlIG1haW4gbWVtb3J5ICovCi0JcmV0dXJuKEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluKHBEYXRhRmxhc2gsIERCX0JVRjFfUEFHRV9FUkFTRV9QR00sIChwYWdlKnBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKSk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFGbGFzaFdyaXRlCQkJCQkqLwotLyogT2JqZWN0ICAgICAgICAgICAgICA6CQkJCQkJCSovCi0vKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogPCpzcmM+ID0gU291cmNlIGJ1ZmZlcgkJCQkJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiA8ZGVzdD4gPSBkYXRhZmxhc2ggYWRyZXNzCQkJCSovCi0vKiAgICAgICAgICAgICAgICAgICAgIDogPHNpemU+ID0gZGF0YSBidWZmZXIgc2l6ZQkJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX0RhdGFGbGFzaFdyaXRlKAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyICpzcmMsCi0JaW50IGRlc3QsCi0JaW50IHNpemUgKQotewotCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0JdW5zaWduZWQgaW50IHBhZ2U7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQotCUFUOTFGX1NwaUVuYWJsZShwRGF0YUZsYXNoLT5wRGV2aWNlLT5jcyk7Ci0KLQlpZiAoIChkZXN0ICsgc2l6ZSkgPiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSAqIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIpKSkKLQkJcmV0dXJuIERBVEFGTEFTSF9NRU1PUllfT1ZFUkZMT1c7Ci0KLQkvKiBJZiBkZXN0aW5hdGlvbiBkb2VzIG5vdCBmaXQgYSBwYWdlIHN0YXJ0IGFkZHJlc3MgKi8KLQlpZiAoKGRlc3QgJSAoKHVuc2lnbmVkIGludCkocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkpKSAgIT0gMCApIHsKLQkJbGVuZ3RoID0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSAtIChkZXN0ICUgKCh1bnNpZ25lZCBpbnQpKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKSk7Ci0KLQkJaWYgKHNpemUgPCBsZW5ndGgpCi0JCQlsZW5ndGggPSBzaXplOwotCi0JCWlmKCFBVDkxRl9QYXJ0aWFsUGFnZVdyaXRlKHBEYXRhRmxhc2gsc3JjLCBkZXN0LCBsZW5ndGgpKQotCQkJcmV0dXJuIERBVEFGTEFTSF9FUlJPUjsKLQotCQlBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsIEFUOTFDX1RJTUVPVVRfV1JEWSk7Ci0KLQkJLyogVXBkYXRlIHNpemUsIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KLQkJc2l6ZSAtPSBsZW5ndGg7Ci0JCWRlc3QgKz0gbGVuZ3RoOwotCQlzcmMgKz0gbGVuZ3RoOwotCX0KLQotCXdoaWxlICgoIHNpemUgLSBwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplICkgPj0gMCApIHsKLQkJLyogcHJvZ3JhbSBkYXRhZmxhc2ggcGFnZSAqLwotCQlwYWdlID0gKHVuc2lnbmVkIGludClkZXN0IC8gKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpOwotCi0JCXN0YXR1cyA9IEFUOTFGX0RhdGFGbGFzaFdyaXRlQnVmZmVyKHBEYXRhRmxhc2gsIERCX0JVRjFfV1JJVEUsIHNyYywgMCwgcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSk7Ci0JCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywgQVQ5MUNfVElNRU9VVF9XUkRZKTsKLQotCQlzdGF0dXMgPSBBVDkxRl9QYWdlRXJhc2UocERhdGFGbGFzaCwgcGFnZSk7Ci0JCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywgQVQ5MUNfVElNRU9VVF9XUkRZKTsKLQkJaWYgKCFzdGF0dXMpCi0JCQlyZXR1cm4gREFUQUZMQVNIX0VSUk9SOwotCi0JCXN0YXR1cyA9IEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluIChwRGF0YUZsYXNoLCBEQl9CVUYxX1BBR0VfUEdNLCBkZXN0KTsKLQkJaWYoIXN0YXR1cykKLQkJCXJldHVybiBEQVRBRkxBU0hfRVJST1I7Ci0KLQkJQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLCBBVDkxQ19USU1FT1VUX1dSRFkpOwotCi0JCS8qIFVwZGF0ZSBzaXplLCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzICovCi0JCXNpemUgLT0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSA7Ci0JCWRlc3QgKz0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSA7Ci0JCXNyYyAgKz0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSA7Ci0JfQotCi0JLyogSWYgc3RpbGwgc29tZSBieXRlcyB0byByZWFkICovCi0JaWYgKCBzaXplID4gMCApIHsKLQkJLyogcHJvZ3JhbSBkYXRhZmxhc2ggcGFnZSAqLwotCQlpZighQVQ5MUZfUGFydGlhbFBhZ2VXcml0ZShwRGF0YUZsYXNoLCBzcmMsIGRlc3QsIHNpemUpICkKLQkJCXJldHVybiBEQVRBRkxBU0hfRVJST1I7Ci0KLQkJQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLCBBVDkxQ19USU1FT1VUX1dSRFkpOwotCX0KLQlyZXR1cm4gREFUQUZMQVNIX09LOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9EYXRhRmxhc2hSZWFkIAkJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBSZWFkIGEgYmxvY2sgaW4gZGF0YWZsYXNoCQkJCSovCi0vKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogCQkJCQkJCSovCi0vKiBSZXR1cm4gdmFsdWUJCTogCQkJCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgQVQ5MUZfRGF0YUZsYXNoUmVhZCgKLQlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCi0JdW5zaWduZWQgbG9uZyBhZGRyLAotCXVuc2lnbmVkIGxvbmcgc2l6ZSwKLQljaGFyICpidWZmZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBTaXplVG9SZWFkOwotCi0JQVQ5MUZfU3BpRW5hYmxlKHBEYXRhRmxhc2gtPnBEZXZpY2UtPmNzKTsKLQotCWlmKEFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywgQVQ5MUNfVElNRU9VVF9XUkRZKSAhPSBEQVRBRkxBU0hfT0spCi0JCXJldHVybiAtMTsKLQotCXdoaWxlIChzaXplKSB7Ci0JCVNpemVUb1JlYWQgPSAoc2l6ZSA8IDB4ODAwMCk/IHNpemU6MHg4MDAwOwotCi0JCWlmIChBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsIEFUOTFDX1RJTUVPVVRfV1JEWSkgIT0gREFUQUZMQVNIX09LKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmIChBVDkxRl9EYXRhRmxhc2hDb250aW51b3VzUmVhZCAocERhdGFGbGFzaCwgYWRkciwgKHVjaGFyICopYnVmZmVyLCBTaXplVG9SZWFkKSAhPSBEQVRBRkxBU0hfT0spCi0JCQlyZXR1cm4gLTE7Ci0KLQkJc2l6ZSAtPSBTaXplVG9SZWFkOwotCQlhZGRyICs9IFNpemVUb1JlYWQ7Ci0JCWJ1ZmZlciArPSBTaXplVG9SZWFkOwotCX0KLQotCXJldHVybiBEQVRBRkxBU0hfT0s7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFmbGFzaFByb2JlIAkJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiAJCQkJCQkJKi8KLS8qIElucHV0IFBhcmFtZXRlcnMgICAgOiAJCQkJCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkgICAgICAgOiBEYXRhZmxhc2ggc3RhdHVzIHJlZ2lzdGVyCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgQVQ5MUZfRGF0YWZsYXNoUHJvYmUoaW50IGNzLCBBVDkxUFNfRGF0YWZsYXNoRGVzYyBwRGVzYykKLXsKLQlBVDkxRl9TcGlFbmFibGUoY3MpOwotCUFUOTFGX0RhdGFGbGFzaEdldFN0YXR1cyhwRGVzYyk7Ci0JcmV0dXJuKChwRGVzYy0+Y29tbWFuZFsxXSA9PSAweEZGKT8gMDogcERlc2MtPmNvbW1hbmRbMV0gJiAweDNDKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9hdDkxcm05MjAwZGsvYXQ5MXJtOTIwMGRrLmMgYi9ib2FyZC9hdDkxcm05MjAwZGsvYXQ5MXJtOTIwMGRrLmMKaW5kZXggMDAyOTgxYS4uYzU2NGY3MyAxMDA2NDQKLS0tIGEvYm9hcmQvYXQ5MXJtOTIwMGRrL2F0OTFybTkyMDBkay5jCisrKyBiL2JvYXJkL2F0OTFybTkyMDBkay9hdDkxcm05MjAwZGsuYwpAQCAtNjIsNyArNjIsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTgyLDE0ICs4MiwxNCBAQAogCXBfcGh5b3BzLT5BdXRvTmVnb3RpYXRlID0gZG05MTYxX0F1dG9OZWdvdGlhdGU7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwogCiAvKgogICogRGlzayBPbiBDaGlwIChOQU5EKSBNaWxsZW5pdW0gaW5pdGlhbGl6YXRpb24uCiAgKiBUaGUgTkFORCBsaXZlcyBpbiB0aGUgQ1MyKiBzcGFjZQogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIGV4dGVybiB1bG9uZyBuYW5kX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIAogI2RlZmluZSBBVDkxX1NNQVJUTUVESUFfQkFTRSAweDQwMDAwMDAwCS8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIG1lbW9yeSBvbiBOQ1MzICovCmRpZmYgLS1naXQgYS9ib2FyZC9hdDkxcm05MjAwZGsvbGVkLmMgYi9ib2FyZC9hdDkxcm05MjAwZGsvbGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxODkxOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2F0OTFybTkyMDBkay9sZWQuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBBdG1lbCBOb3JkaWMgQUIgPHd3dy5hdG1lbC5jb20+CisgKiBVbGYgU2FtdWVsc3NvbiA8dWxmQGF0bWVsLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvQVQ5MVJNOTIwMC5oPgorCisjZGVmaW5lCUdSRUVOX0xFRAlBVDkxQ19QSU9fUEIwCisjZGVmaW5lCVlFTExPV19MRUQJQVQ5MUNfUElPX1BCMQorI2RlZmluZQlSRURfTEVECUFUOTFDX1BJT19QQjIKKwordm9pZAlncmVlbl9MRURfb24odm9pZCkKK3sKKwlBVDkxUFNfUElPCVBJT0IJPSBBVDkxQ19CQVNFX1BJT0I7CisJUElPQi0+UElPX0NPRFIJCT0gR1JFRU5fTEVEOworfQorCit2b2lkCSB5ZWxsb3dfTEVEX29uKHZvaWQpCit7CisJQVQ5MVBTX1BJTwlQSU9CCT0gQVQ5MUNfQkFTRV9QSU9COworCVBJT0ItPlBJT19DT0RSCQk9IFlFTExPV19MRUQ7Cit9CisKK3ZvaWQJIHJlZF9MRURfb24odm9pZCkKK3sKKwlBVDkxUFNfUElPCVBJT0IJPSBBVDkxQ19CQVNFX1BJT0I7CisJUElPQi0+UElPX0NPRFIJCT0gUkVEX0xFRDsKK30KKwordm9pZAlncmVlbl9MRURfb2ZmKHZvaWQpCit7CisJQVQ5MVBTX1BJTwlQSU9CCT0gQVQ5MUNfQkFTRV9QSU9COworCVBJT0ItPlBJT19TT0RSCQk9IEdSRUVOX0xFRDsKK30KKwordm9pZAl5ZWxsb3dfTEVEX29mZih2b2lkKQoreworCUFUOTFQU19QSU8JUElPQgk9IEFUOTFDX0JBU0VfUElPQjsKKwlQSU9CLT5QSU9fU09EUgkJPSBZRUxMT1dfTEVEOworfQorCit2b2lkCXJlZF9MRURfb2ZmKHZvaWQpCit7CisJQVQ5MVBTX1BJTwlQSU9CCT0gQVQ5MUNfQkFTRV9QSU9COworCVBJT0ItPlBJT19TT0RSCQk9IFJFRF9MRUQ7Cit9CisKKwordm9pZCBMRURfaW5pdCAodm9pZCkKK3sKKwlBVDkxUFNfUElPCVBJT0IJPSBBVDkxQ19CQVNFX1BJT0I7CisJQVQ5MVBTX1BNQwlQTUMJPSBBVDkxQ19CQVNFX1BNQzsKKwlQTUMtPlBNQ19QQ0VSCQk9ICgxIDw8IEFUOTFDX0lEX1BJT0IpOwkvKiBFbmFibGUgUElPQiBjbG9jayAqLworCS8qIERpc2FibGUgcGVyaXBoZXJhbHMgb24gTEVEcyAqLworCVBJT0ItPlBJT19QRVIJCT0gQVQ5MUNfUElPX1BCMiB8IEFUOTFDX1BJT19QQjEgfCBBVDkxQ19QSU9fUEIwOworCS8qIEVuYWJsZSBwaW5zIGFzIG91dHB1dHMgKi8KKwlQSU9CLT5QSU9fT0VSCQk9IEFUOTFDX1BJT19QQjIgfCBBVDkxQ19QSU9fUEIxIHwgQVQ5MUNfUElPX1BCMDsKKwkvKiBUdXJuIGFsbCBMRURzIE9GRiAqLworCVBJT0ItPlBJT19TT0RSCQk9IEFUOTFDX1BJT19QQjIgfCBBVDkxQ19QSU9fUEIxIHwgQVQ5MUNfUElPX1BCMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2F0OTFybTkyMDBkay9tdXguYyBiL2JvYXJkL2F0OTFybTkyMDBkay9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjdkMjgwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXQ5MXJtOTIwMGRrL211eC5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxkYXRhZmxhc2guaD4KKworaW50IEFUOTFGX0dldE11eFN0YXR1cyh2b2lkKSB7CisjaWZkZWYJREFUQUZMQVNIX01NQ19TRUxFQ1QKKwlBVDkxQ19CQVNFX1BJT0ItPlBJT19QRVIgPSBEQVRBRkxBU0hfTU1DX1NFTEVDVDsgLyogU2V0IGluIFBJTyBtb2RlICovCisJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fT0VSID0gREFUQUZMQVNIX01NQ19TRUxFQ1Q7IC8qIENvbmZpZ3VyZSBpbiBvdXRwdXQgKi8KKworCisJaWYoQVQ5MUNfQkFTRV9QSU9CLT5QSU9fT0RTUiAmIERBVEFGTEFTSF9NTUNfU0VMRUNUKSB7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCit2b2lkIEFUOTFGX1NlbGVjdE1NQyh2b2lkKSB7CisjaWZkZWYJREFUQUZMQVNIX01NQ19TRUxFQ1QKKwlBVDkxQ19CQVNFX1BJT0ItPlBJT19QRVIgPSBEQVRBRkxBU0hfTU1DX1NFTEVDVDsJLyogU2V0IGluIFBJTyBtb2RlICovCisJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fT0VSID0gREFUQUZMQVNIX01NQ19TRUxFQ1Q7CS8qIENvbmZpZ3VyZSBpbiBvdXRwdXQgKi8KKwkvKiBTZXQgT3V0cHV0ICovCisJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fU09EUiA9IERBVEFGTEFTSF9NTUNfU0VMRUNUOworI2VuZGlmCit9CisKK3ZvaWQgQVQ5MUZfU2VsZWN0U1BJKHZvaWQpIHsKKyNpZmRlZglEQVRBRkxBU0hfTU1DX1NFTEVDVAorCUFUOTFDX0JBU0VfUElPQi0+UElPX1BFUiA9IERBVEFGTEFTSF9NTUNfU0VMRUNUOwkvKiBTZXQgaW4gUElPIG1vZGUgKi8KKwlBVDkxQ19CQVNFX1BJT0ItPlBJT19PRVIgPSBEQVRBRkxBU0hfTU1DX1NFTEVDVDsJLyogQ29uZmlndXJlIGluIG91dHB1dCAqLworCS8qIENsZWFyIE91dHB1dCAqLworCUFUOTFDX0JBU0VfUElPQi0+UElPX0NPRFIgPSBEQVRBRkxBU0hfTU1DX1NFTEVDVDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYXRjL2F0Yy5jIGIvYm9hcmQvYXRjL2F0Yy5jCmluZGV4IGQyYzZiM2IuLmZlMzIxNTUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2F0Yy9hdGMuYworKysgYi9ib2FyZC9hdGMvYXRjLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCXJldHVybiAocHNpemUpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiBleHRlcm4gdm9pZCBkb2NfcHJvYmUgKHVsb25nIHBoeXNhZHIpOwogdm9pZCBkb2NfaW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL2F0Yy90aTExM3guYyBiL2JvYXJkL2F0Yy90aTExM3guYwppbmRleCBkNWU5MzVjLi5lMTEyZWNhIDEwMDY0NAotLS0gYS9ib2FyZC9hdGMvdGkxMTN4LmMKKysrIGIvYm9hcmQvYXRjL3RpMTEzeC5jCkBAIC01OTEsNyArNTkxLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfb2ZmICh2b2lkKQogewogCXByaW50ZiAoIkRpc2FibGUgUENNQ0lBICIgUENNQ0lBX1NMT1RfTVNHICJcbiIpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXRjL3UtYm9vdC5sZHMgYi9ib2FyZC9hdGMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlODNkMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9hdGMvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2F0bWVsL2F0c3RrMTAwMC9ldGguYyBiL2JvYXJkL2F0bWVsL2F0c3RrMTAwMC9ldGguYwppbmRleCAzYTc5MTZlLi5iMmIxYTEyIDEwMDY0NAotLS0gYS9ib2FyZC9hdG1lbC9hdHN0azEwMDAvZXRoLmMKKysrIGIvYm9hcmQvYXRtZWwvYXRzdGsxMDAwL2V0aC5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIGV4dGVybiBpbnQgbWFjYl9ldGhfaW5pdGlhbGl6ZShpbnQgaWQsIHZvaWQgKnJlZ3MsIHVuc2lnbmVkIGludCBwaHlfYWRkcik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NQUNCKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfTUFDQikgJiYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIHZvaWQgYXRzdGsxMDAwX2V0aF9pbml0aWFsaXplKGJkX3QgKmJpKQogewogCWludCBpZCA9IDA7CmRpZmYgLS1naXQgYS9ib2FyZC9iYXJjby91LWJvb3QubGRzIGIvYm9hcmQvYmFyY28vdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmODUzMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9iYXJjby91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYmMzNDUwL2JjMzQ1MC5jIGIvYm9hcmQvYmMzNDUwL2JjMzQ1MC5jCmluZGV4IDA1YmI3MjMuLjU2YTczZmUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2JjMzQ1MC9iYzM0NTAuYworKysgYi9ib2FyZC9iYzM0NTAvYmMzNDUwLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCiB7CkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJKih2dV9sb25nICopIE1QQzVYWFhfV1VfR1BJT19EQVRBX08gfD0gIEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BPU1QKIC8qCmRpZmYgLS1naXQgYS9ib2FyZC9iYzM0NTAvY21kX2JjMzQ1MC5jIGIvYm9hcmQvYmMzNDUwL2NtZF9iYzM0NTAuYwppbmRleCA2YmJlNGU2Li4xNDU1OTUzIDEwMDY0NAotLS0gYS9ib2FyZC9iYzM0NTAvY21kX2JjMzQ1MC5jCisrKyBiL2JvYXJkL2JjMzQ1MC9jbWRfYmMzNDUwLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8qCiAgKiBCQzM0NTAgc3BlY2lmaWMgY29tbWFuZHMKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAjdW5kZWYgREVCVUcKICNpZmRlZiBERUJVRwpAQCAtODI0LDQgKzgyNCw0IEBACiAJICAgICJ0ZXN0IHVuaXQtb2ZmXG4iCiAJICAgICIgICAgIC0gdHVybnMgb2ZmIHRoZSBCQzM0NTAgdW5pdFxuIgogCSAgICAiICAgICAgIFdBUk5JTkc6IFVuc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbGwgYmUgbG9zdCFcbiIpOwotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2JjMzQ1MC91LWJvb3QubGRzIGIvYm9hcmQvYmMzNDUwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjk4YTguLjAwMDAwMDAKLS0tIGEvYm9hcmQvYmMzNDUwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYmY1Mzctc3RhbXAvYmY1Mzctc3RhbXAuYyBiL2JvYXJkL2JmNTM3LXN0YW1wL2JmNTM3LXN0YW1wLmMKaW5kZXggNDdmN2M5ZS4uOTE5Y2VmNiAxMDA2NDQKLS0tIGEvYm9hcmQvYmY1Mzctc3RhbXAvYmY1Mzctc3RhbXAuYworKysgYi9ib2FyZC9iZjUzNy1zdGFtcC9iZjUzNy1zdGFtcC5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpwTUFDYWRkciA9ICh1bnNpZ25lZCBjaGFyICopMHgyMDNGMDAwMDsKIAl1OCBTcmNBZGRyWzZdID0geyAweDAyLCAweDgwLCAweEFELCAweDIwLCAweDMxLCAweEI4IH07CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAkvKiBUaGUgMHhGRiBjaGVjayBoZXJlIGlzIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgdGhlIGFkZHJlc3MKIAkgKiBpbiBmbGFzaCBpZiBpdCdzIHNpbXBseSBiZWVuIGVyYXNlZCAoYWthIGFsbCAweEZGIHZhbHVlcykgKi8KIAlpZiAoZ2V0ZW52KCJldGhhZGRyIikgPT0gTlVMTCAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBNQUNhZGRyKSkgewpAQCAtMTcxLDcgKzE3MSw3IEBACiAJaWYgKGdldGVudigiZXRoYWRkciIpKSB7CiAJCVNldHVwTWFjQWRkcihTcmNBZGRyKTsKIAl9Ci0jZW5kaWYJCQkJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCQkJCS8qIEJGSU5fQk9PVF9NT0RFID09IEJGNTM3X0JZUEFTU19CT09UICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0lERSkKZGlmZiAtLWdpdCBhL2JvYXJkL2JmNTM3LXN0YW1wL2V0aGVyX2JmNTM3LmMgYi9ib2FyZC9iZjUzNy1zdGFtcC9ldGhlcl9iZjUzNy5jCmluZGV4IDgwN2I5ZTguLjM2YzE1MzYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2JmNTM3LXN0YW1wL2V0aGVyX2JmNTM3LmMKKysrIGIvYm9hcmQvYmY1Mzctc3RhbXAvZXRoZXJfYmY1MzcuYwpAQCAtNDIsNyArNDIsNyBAQAogI2RlZmluZSBERUJVR0YoZm10LGFyZ3MuLi4pCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAjZGVmaW5lIFJYQlVGX0JBU0VfQUREUgkJMHhGRjkwMDAwMAogI2RlZmluZSBUWEJVRl9CQVNFX0FERFIJCTB4RkY4MDAwMDAKQEAgLTU0Miw0ICs1NDIsNCBAQAogCXJldHVybiAwOwogfQogI2VuZGlmCi0jZW5kaWYJCQkJLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvYmY1Mzctc3RhbXAvbmFuZC5jIGIvYm9hcmQvYmY1Mzctc3RhbXAvbmFuZC5jCmluZGV4IDRkNmU3NzYuLmY5NWI1ODQgMTAwNjQ0Ci0tLSBhL2JvYXJkL2JmNTM3LXN0YW1wL25hbmQuYworKysgYi9ib2FyZC9iZjUzNy1zdGFtcC9uYW5kLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNpbmNsdWRlIDxuYW5kLmg+CiAKQEAgLTEwMyw0ICsxMDMsNCBAQAogCW5hbmQtPmRldl9yZWFkeSA9IGJmaW5fZGV2aWNlX3JlYWR5OwogCW5hbmQtPmNoaXBfZGVsYXkgPSAzMDsKIH0KLSNlbmRpZgkJCQkvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9ibXcvdS1ib290LmxkcyBiL2JvYXJkL2Jtdy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVlM2ZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2Jtdy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYzJtb24vcGNtY2lhLmMgYi9ib2FyZC9jMm1vbi9wY21jaWEuYwppbmRleCA1ZTUwYzRkLi5jMzg5YzY3IDEwMDY0NAotLS0gYS9ib2FyZC9jMm1vbi9wY21jaWEuYworKysgYi9ib2FyZC9jMm1vbi9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmCWRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTE2NSw3ICsxNjUsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL2Nhbm1iL3UtYm9vdC5sZHMgYi9ib2FyZC9jYW5tYi91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGRjMTE4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2Nhbm1iL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2Nkcy9jb21tb24vdmlhLmMgYi9ib2FyZC9jZHMvY29tbW9uL3ZpYS5jCmluZGV4IGU3OWJkMDIuLjRhNjNkNzcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Nkcy9jb21tb24vdmlhLmMKKysrIGIvYm9hcmQvY2RzL2NvbW1vbi92aWEuYwpAQCAtMjgsMTEgKzI4LDE2IEBACiAJCQlwY2lfZGV2X3QgZGV2LCBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqdGFiKQogewogCXBjaV9kZXZfdCBicmlkZ2U7CisJdW5zaWduZWQgaW50IGNtZHN0YXQ7CiAKIAkvKiBFbmFibGUgVVNCIGFuZCBJREUgZnVuY3Rpb25zICovCiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCAweDQ4LCAweDA4KTsKIAotCXBjaWF1dG9fY29uZmlnX2RldmljZShob3NlLCBkZXYpOworCXBjaV9ob3NlX3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsICZjbWRzdGF0KTsKKwljbWRzdGF0IHw9IFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZfCBQQ0lfQ09NTUFORF9NQVNURVI7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIGNtZHN0YXQpOworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMHgwOCk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7CiAKIAkvKgogCSAqIEZvcmNlIHRoZSBiYWNrcGxhbmUgUDJQIGJyaWRnZSB0byBoYXZlIGEgd2luZG93CkBAIC00MCw3ICs0NSw3IEBACiAJICogVGhpcyBhbGxvd3MgbGVnYWN5IEkvTyAoaTgyNTksIGV0Yykgb24gdGhlIFZJQQogCSAqIHNvdXRoYnJpZGdlIHRvIGJlIGFjY2Vzc2VkLgogCSAqLwotCWJyaWRnZSA9IFBDSV9CREYoMCwxNywwKTsKKwlicmlkZ2UgPSBQQ0lfQkRGKDAsQlJJREdFX0lELDApOwogCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGJyaWRnZSwgUENJX0lPX0JBU0UsIDApOwogCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGJyaWRnZSwgUENJX0lPX0JBU0VfVVBQRVIxNiwgMCk7CiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgYnJpZGdlLCBQQ0lfSU9fTElNSVQsIDB4MTApOwpkaWZmIC0tZ2l0IGEvYm9hcmQvY2RzL21wYzg1NDFjZHMvbXBjODU0MWNkcy5jIGIvYm9hcmQvY2RzL21wYzg1NDFjZHMvbXBjODU0MWNkcy5jCmluZGV4IDQxOTIzMjQuLjU1OGJhOTkgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Nkcy9tcGM4NTQxY2RzL21wYzg1NDFjZHMuYworKysgYi9ib2FyZC9jZHMvbXBjODU0MWNkcy9tcGM4NTQxY2RzLmMKQEAgLTQ3NiwxNCArNDc2LDE3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfbXBjODV4eGNkc19jb25maWdfdGFibGVbXSA9IHsKIAl7MHgxMGUzLCAweDA1MTMsIFBDSV9BTllfSUQsIDEsIDMsIFBDSV9BTllfSUQsIGR1bW15X2Z1bmMsIHswLDAsMH19LAotCXsweDExMDYsIDB4MDY4NiwgUENJX0FOWV9JRCwgMSwgMiwgMCwgbXBjODV4eF9jb25maWdfdmlhLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDA1NzEsIFBDSV9BTllfSUQsIDEsIDIsIDEsCisJezB4MTEwNiwgMHgwNjg2LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDAsIG1wYzg1eHhfY29uZmlnX3ZpYSwgezAsMCwwfX0sCisJezB4MTEwNiwgMHgwNTcxLCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDEsCiAJCW1wYzg1eHhfY29uZmlnX3ZpYV91c2JpZGUsIHswLDAsMH19LAotCXsweDExMDUsIDB4MzAzOCwgUENJX0FOWV9JRCwgMSwgMiwgMiwgbXBjODV4eF9jb25maWdfdmlhX3VzYiwgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgzMDM4LCBQQ0lfQU5ZX0lELCAxLCAyLCAzLCBtcGM4NXh4X2NvbmZpZ192aWFfdXNiMiwgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgzMDU4LCBQQ0lfQU5ZX0lELCAxLCAyLCA1LAorCXsweDExMDUsIDB4MzAzOCwgUENJX0FOWV9JRCwgMSwgVklBX0lELCAyLAorCQltcGM4NXh4X2NvbmZpZ192aWFfdXNiLCB7MCwwLDB9fSwKKwl7MHgxMTA2LCAweDMwMzgsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgMywKKwkJbXBjODV4eF9jb25maWdfdmlhX3VzYjIsIHswLDAsMH19LAorCXsweDExMDYsIDB4MzA1OCwgUENJX0FOWV9JRCwgMSwgVklBX0lELCA1LAogCQltcGM4NXh4X2NvbmZpZ192aWFfcG93ZXIsIHswLDAsMH19LAotCXsweDExMDYsIDB4MzA2OCwgUENJX0FOWV9JRCwgMSwgMiwgNiwgbXBjODV4eF9jb25maWdfdmlhX2FjOTcsIHswLDAsMH19LAorCXsweDExMDYsIDB4MzA2OCwgUENJX0FOWV9JRCwgMSwgVklBX0lELCA2LAorCQltcGM4NXh4X2NvbmZpZ192aWFfYWM5NywgezAsMCwwfX0sCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9ib2FyZC9jZHMvbXBjODU0OGNkcy9jb25maWcubWsgYi9ib2FyZC9jZHMvbXBjODU0OGNkcy9jb25maWcubWsKaW5kZXggMjQyYTY3Ni4uYjIzYmM4NyAxMDA2NDQKLS0tIGEvYm9hcmQvY2RzL21wYzg1NDhjZHMvY29uZmlnLm1rCisrKyBiL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL2NvbmZpZy5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisjIENvcHlyaWdodCAyMDA0LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogIwogIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogIyBwcm9qZWN0LgpAQCAtMjMsNyArMjMsOSBAQAogIwogIyBtcGM4NTQ4Y2RzIGJvYXJkCiAjCitpZm5kZWYgVEVYVF9CQVNFCiBURVhUX0JBU0UgPSAweGZmZjgwMDAwCitlbmRpZgogCiBQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19FNTAwPTEKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX01QQzg1eHg9MQpkaWZmIC0tZ2l0IGEvYm9hcmQvY2RzL21wYzg1NDhjZHMvaW5pdC5TIGIvYm9hcmQvY2RzL21wYzg1NDhjZHMvaW5pdC5TCmluZGV4IGQ0NjhmNWIuLjcyOTQwYjAgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL2luaXQuUworKysgYi9ib2FyZC9jZHMvbXBjODU0OGNkcy9pbml0LlMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KICAqIENvcHlyaWdodCAyMDAyLDIwMDMsIE1vdG9yb2xhIEluYy4KICAqCiAgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwpAQCAtMjgsNiArMjgsMTIgQEAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxtcGM4NXh4Lmg+CiAKKyNkZWZpbmUgTEFXQVJfVFJHVF9QQ0kxCQkweDAwMDAwMDAwCisjZGVmaW5lIExBV0FSX1RSR1RfUENJMgkJMHgwMDEwMDAwMAorI2RlZmluZSBMQVdBUl9UUkdUX1BDSUUJCTB4MDAyMDAwMDAKKyNkZWZpbmUgTEFXQVJfVFJHVF9SSU8JCTB4MDBjMDAwMDAKKyNkZWZpbmUgTEFXQVJfVFJHVF9MQkMJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTEFXQVJfVFJHVF9ERFIJCTB4MDBmMDAwMDAKIAogLyoKICAqIFRMQjAgYW5kIFRMQjEgRW50cmllcwpAQCAtNDcsOCArNTMsOCBAQAogICovCiAKICNkZWZpbmUJZW50cnlfc3RhcnQgXAotCW1mbHIJcjEgCTsJXAotCWJsCTBmIAk7CisJbWZscglyMQk7CVwKKwlibAkwZgk7CiAKICNkZWZpbmUJZW50cnlfZW5kIFwKIDA6CW1mbHIJcjAJOwlcCkBAIC04NCw4ICs5MCw4IEBACiAjZW5kaWYKIAogCS8qCi0JICogVExCMAkJMTZLCUNhY2hlYWJsZSwgbm9uLWd1YXJkZWQKLQkgKiAweGQwMDFfMDAwMAkxNksJVGVtcG9yYXJ5IEdsb2JhbCBkYXRhIGZvciBpbml0aWFsaXphdGlvbgorCSAqIFRMQjAJCTE2SwlDYWNoZWFibGUsIGd1YXJkZWQKKwkgKiBUZW1wb3JhcnkgR2xvYmFsIGRhdGEgZm9yIGluaXRpYWxpemF0aW9uCiAJICoKIAkgKiBVc2UgZm91ciA0SyBUTEIwIGVudHJpZXMuICBUaGVzZSBlbnRyaWVzIG11c3QgYmUgY2FjaGVhYmxlCiAJICogYXMgdGhleSBwcm92aWRlIHRoZSBib290c3RyYXAgbWVtb3J5IGJlZm9yZSB0aGUgbWVtb3J5CkBAIC05NywyOCArMTAzLDI4IEBACiAJLmxvbmcgVExCMV9NQVMwKDAsIDAsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDAsIDAsIDAsIDApCiAJLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfSU5JVF9SQU1fQUREUiksCi0JCQkwLDAsMCwwLDAsMCwwLDApCisJCQkwLDAsMCwwLDAsMCwxLDApCiAJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfSU5JVF9SQU1fQUREUiksCiAJCQkwLDAsMCwwLDAsMSwwLDEsMCwxKQogCiAJLmxvbmcgVExCMV9NQVMwKDAsIDAsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDAsIDAsIDAsIDApCiAJLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfSU5JVF9SQU1fQUREUiArIDQgKiAxMDI0KSwKLQkJCTAsMCwwLDAsMCwwLDAsMCkKKwkJCTAsMCwwLDAsMCwwLDEsMCkKIAkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19JTklUX1JBTV9BRERSICsgNCAqIDEwMjQpLAogCQkJMCwwLDAsMCwwLDEsMCwxLDAsMSkKIAogCS5sb25nIFRMQjFfTUFTMCgwLCAwLCAwKQogCS5sb25nIFRMQjFfTUFTMSgxLCAwLCAwLCAwLCAwKQogCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX0lOSVRfUkFNX0FERFIgKyA4ICogMTAyNCksCi0JCQkwLDAsMCwwLDAsMCwwLDApCisJCQkwLDAsMCwwLDAsMCwxLDApCiAJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfSU5JVF9SQU1fQUREUiArIDggKiAxMDI0KSwKIAkJCTAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkubG9uZyBUTEIxX01BUzAoMCwgMCwgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMCwgMCwgMCwgMCkKIAkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19JTklUX1JBTV9BRERSICsgMTIgKiAxMDI0KSwKLQkJCTAsMCwwLDAsMCwwLDAsMCkKKwkJCTAsMCwwLDAsMCwwLDEsMCkKIAkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19JTklUX1JBTV9BRERSICsgMTIgKiAxMDI0KSwKIAkJCTAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKQEAgLTEzMCw1MSArMTM2LDQ0IEBACiAJICovCiAJLmxvbmcgVExCMV9NQVMwKDEsIDAsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8xNk0pCi0JLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfRkxBU0hfQkFTRSksIDAsMCwwLDAsMSwwLDEsMCkKLQkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19GTEFTSF9CQVNFKSwgMCwwLDAsMCwwLDEsMCwxLDAsMSkKKwkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19CT09UX0JMT0NLKSwgMCwwLDAsMCwxLDAsMSwwKQorCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX0JPT1RfQkxPQ0spLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQogCiAJLyoKLQkgKiBUTEIgMToJMjU2TQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCi0JICogMHg4MDAwMDAwMAkyNTZNCVBDSTEgTUVNCisJICogVExCIDE6CTFHCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKKwkgKiAweDgwMDAwMDAwCTFHCVBDSTEvUENJRSAgOCw5LGEsYgogCSAqLwogCS5sb25nIFRMQjFfTUFTMCgxLCAxLCAwKQotCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfMjU2TSkKLQkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19QQ0kxX01FTV9CQVNFKSwgMCwwLDAsMCwxLDAsMSwwKQotCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX1BDSTFfTUVNX0JBU0UpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQorCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfMUcpCisJLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfUENJX1BIWVMpLCAwLDAsMCwwLDEsMCwxLDApCisJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfUENJX1BIWVMpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQogCisjaWZkZWYgQ0ZHX1JJT19NRU1fUEhZUwogCS8qCiAJICogVExCIDI6CTI1Nk0JTm9uLWNhY2hlYWJsZSwgZ3VhcmRlZAotCSAqIDB4OTAwMDAwMDAJMjU2TQlQQ0kyIE1FTQogCSAqLwogCS5sb25nIFRMQjFfTUFTMCgxLCAyLCAwKQogCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfMjU2TSkKLQkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19QQ0kyX01FTV9CQVNFKSwKKwkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19SSU9fTUVNX1BIWVMpLAogCQkJMCwwLDAsMCwxLDAsMSwwKQotCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX1BDSTJfTUVNX0JBU0UpLAotCQkJMCwwLDAsMCwwLDEsMCwxLDAsMSkKKwkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19SSU9fTUVNX1BIWVMpLAkwLDAsMCwwLDAsMSwwLDEsMCwxKQogCiAJLyoKLQkgKiBUTEIgMzoJMUdCCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKLQkgKiAweGEwMDAwMDAwCTI1Nk0JUEVYIE1FTSBGaXJzdCBoYWxmCi0JICogMHhiMDAwMDAwMAkyNTZNCVBFWCBNRU0gU2Vjb25kIGhhbGYKLQkgKiAweGMwMDAwMDAwCTI1Nk0JUmFwaWQgSU8gTUVNIEZpcnN0IGhhbGYKLQkgKiAweGQwMDAwMDAwCTI1Nk0JUmFwaWQgSU8gTUVNIFNlY29uZCBoYWxmCisJICogVExCIDM6CTI1Nk0JTm9uLWNhY2hlYWJsZSwgZ3VhcmRlZAogCSAqLwogCS5sb25nIFRMQjFfTUFTMCgxLCAzLCAwKQotCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfMUcpCi0JLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfUEVYX01FTV9CQVNFKSwgMCwwLDAsMCwxLDAsMSwwKQotCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX1BFWF9NRU1fQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCi0KLQkvKgotCSAqIFRMQiA0OglSZXNlcnZlZCBmb3IgZnV0dXJlIHVzYWdlCi0JICovCi0KKwkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzI1Nk0pCisJLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfUklPX01FTV9QSFlTICsgMHgxMDAwMDAwMCksCisJCQkwLDAsMCwwLDEsMCwxLDApCisJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfUklPX01FTV9QSFlTICsgMHgxMDAwMDAwMCksCisJCQkwLDAsMCwwLDAsMSwwLDEsMCwxKQorI2VuZGlmCiAJLyoKIAkgKiBUTEIgNToJNjRNCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKIAkgKiAweGUwMDBfMDAwMAkxTQlDQ1NSQkFSCi0JICogMHhlMjAwXzAwMDAJOE0JUENJMSBJTwotCSAqIDB4ZTI4MF8wMDAwCThNCVBDSTIgSU8KLQkgKiAweGUzMDBfMDAwMAkxNk0JUEVYIElPCisJICogMHhlMjAwXzAwMDAJMU0JUENJMSBJTworCSAqIDB4ZTIxMF8wMDAwCTFNCVBDSTIgSU8KKwkgKiAweGUzMDBfMDAwMAkxTQlQQ0llIElPCiAJICovCiAJLmxvbmcgVExCMV9NQVMwKDEsIDUsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl82NE0pCkBAIC0xODcsMTcgKzE4NiwxOCBAQAogCSAqLwogCS5sb25nIFRMQjFfTUFTMCgxLCA2LCAwKQogCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfNjRNKQotCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX0xCQ19TRFJBTV9CQVNFKSwgMCwwLDAsMCwwLDAsMCwwKQotCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX0xCQ19TRFJBTV9CQVNFKSwgMCwwLDAsMCwwLDEsMCwxLDAsMSkKKwkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19MQkNfQ0FDSEVfQkFTRSksIDAsMCwwLDAsMCwwLDAsMCkKKwkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19MQkNfQ0FDSEVfQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQiA3OgkxTQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCi0JICogMHhmODAwMDAwMAkxTQlDQURNVVMgcmVnaXN0ZXJzCisJICogVExCIDc6CTY0TQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCisJICogMHhmODAwMDAwMAk2NE0JQ0FETVVTIHJlZ2lzdGVycywgcmVsb2NhdGVkIEwyU1JBTQogCSAqLwogCS5sb25nIFRMQjFfTUFTMCgxLCA3LCAwKQotCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfMU0pCi0JLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDQURNVVNfQkFTRV9BRERSKSwgMCwwLDAsMCwxLDAsMSwwKQotCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0FETVVTX0JBU0VfQUREUiksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCisJLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl82NE0pCisJLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfTEJDX05PTkNBQ0hFX0JBU0UpLCAwLDAsMCwwLDEsMCwxLDApCisJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfTEJDX05PTkNBQ0hFX0JBU0UpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQorCiAyOgogCWVudHJ5X2VuZAogCkBAIC0yMDUsMTQgKzIwNSwxMyBAQAogICogTEFXKExvY2FsIEFjY2VzcyBXaW5kb3cpIGNvbmZpZ3VyYXRpb246CiAgKgogICogMHgwMDAwXzAwMDAgICAgIDB4N2ZmZl9mZmZmICAgICBERFIgICAgICAgICAgICAgICAgICAgICAyRwotICogMHg4MDAwXzAwMDAgICAgIDB4OGZmZl9mZmZmICAgICBQQ0kxIE1FTSAgICAgICAgICAgICAgICAyNTZNCi0gKiAweDkwMDBfMDAwMCAgICAgMHg5ZmZmX2ZmZmYgICAgIFBDSTIgTUVNICAgICAgICAgICAgICAgIDI1Nk0KLSAqIDB4YTAwMF8wMDAwICAgICAweGJmZmZfZmZmZiAgICAgUEVYIE1FTSAgICAgICAgICAgICAgICAgNTEyTQorICogMHg4MDAwXzAwMDAgICAgIDB4OWZmZl9mZmZmICAgICBQQ0kxIE1FTSAgICAgICAgICAgICAgICA1MTJNCisgKiAweGEwMDBfMDAwMCAgICAgMHhiZmZmX2ZmZmYgICAgIFBDSWUgTUVNICAgICAgICAgICAgICAgIDUxMk0KICAqIDB4YzAwMF8wMDAwICAgICAweGRmZmZfZmZmZiAgICAgUmFwaWRJTyAgICAgICAgICAgICAgICAgNTEyTQogICogMHhlMDAwXzAwMDAgICAgIDB4ZTAwMF9mZmZmICAgICBDQ1NSICAgICAgICAgICAgICAgICAgICAxTQotICogMHhlMjAwXzAwMDAgICAgIDB4ZTI3Zl9mZmZmICAgICBQQ0kxIElPICAgICAgICAgICAgICAgICA4TQotICogMHhlMjgwXzAwMDAgICAgIDB4ZTJmZl9mZmZmICAgICBQQ0kyIElPICAgICAgICAgICAgICAgICA4TQotICogMHhlMzAwXzAwMDAgICAgIDB4ZTNmZl9mZmZmICAgICBQRVggSU8gICAgICAgICAgICAgICAgICAxNk0KKyAqIDB4ZTIwMF8wMDAwICAgICAweGUxMGZfZmZmZiAgICAgUENJMSBJTyAgICAgICAgICAgICAgICAgMU0KKyAqIDB4ZTI4MF8wMDAwICAgICAweGUyMGZfZmZmZiAgICAgUENJMiBJTyAgICAgICAgICAgICAgICAgMU0KKyAqIDB4ZTMwMF8wMDAwICAgICAweGUzMGZfZmZmZiAgICAgUENJZSBJTyAgICAgICAgICAgICAgICAgMU0KICAqIDB4ZjAwMF8wMDAwICAgICAweGYzZmZfZmZmZiAgICAgU0RSQU0gICAgICAgICAgICAgICAgICAgNjRNCiAgKiAweGY4MDBfMDAwMCAgICAgMHhmODBmX2ZmZmYgICAgIE5WUkFNL0NBRE1VUyAoKikgICAgICAgIDFNCiAgKiAweGZmMDBfMDAwMCAgICAgMHhmZjdmX2ZmZmYgICAgIEZMQVNIICgybmQgYmFuaykgICAgICAgIDhNCkBAIC0yMjIsNDcgKzIyMSw1MCBAQAogICogICAgQ0NTUkJBUiBhbmQgTDItYXMtU1JBTSBkb24ndCBuZWVkIGEgY29uZmlndXJlZCBMb2NhbCBBY2Nlc3MgV2luZG93LgogICogICAgSWYgZmxhc2ggaXMgOE0gYXQgZGVmYXVsdCBwb3NpdGlvbiAobGFzdCA4TSksIG5vIExBVyBuZWVkZWQuCiAgKgotICogVGhlIGRlZmluZXMgYmVsb3cgYXJlIDEtb2ZmIG9mIHRoZSBhY3R1YWwgTEFXQVIwIHVzYWdlLgotICogU28gTEFXQVIzIGRlZmluZSB1c2VzIHRoZSBMQVdBUjQgcmVnaXN0ZXIgaW4gdGhlIEVDTS4KKyAqIExBVyAwIGlzIHJlc2VydmVkIGZvciBib290IG1hcHBpbmcKICAqLwogCi0jZGVmaW5lIExBV0JBUjAgMAotI2RlZmluZSBMQVdBUjAgICgoTEFXQVJfVFJHVF9JRl9ERFIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMTI4TSkpICYgfkxBV0FSX0VOKQotCi0jZGVmaW5lIExBV0JBUjEgKChDRkdfUENJMV9NRU1fQkFTRT4+MTIpICYgMHhmZmZmZikKLSNkZWZpbmUgTEFXQVIxIAkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCi0KLSNkZWZpbmUgTEFXQkFSMiAoKENGR19QQ0kyX01FTV9CQVNFPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjIgCShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUENJMiB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKSkKLQotI2RlZmluZSBMQVdCQVIzICgoQ0ZHX1BDSTFfSU9fUEhZUz4+MTIpICYgMHhmZmZmZikKLSNkZWZpbmUgTEFXQVIzIAkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfOE0pKQotCi0jZGVmaW5lIExBV0JBUjQgKChDRkdfUENJMl9JT19QSFlTPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjQgCShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUENJMiB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV84TSkpCi0KLS8qIExCQyB3aW5kb3cgLSBtYXBzIDI1Nk0gMHhmMDAwMDAwMCAtPiAweGZmZmZmZmZmICovCi0jZGVmaW5lIExBV0JBUjUgKChDRkdfTEJDX1NEUkFNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSNSAJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9MQkMgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCi0KLSNkZWZpbmUgTEFXQkFSNiAoKENGR19QRVhfTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSNiAJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QRVggfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpCi0KLSNkZWZpbmUgTEFXQkFSNyAoKENGR19QRVhfSU9fUEhZUz4+MTIpICYgMHhmZmZmZikKLSNkZWZpbmUgTEFXQVI3IAkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BFWCB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8xNk0pKQotCi0jZGVmaW5lIExBV0JBUjggKChDRkdfUklPX01FTV9CQVNFPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjggIChMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUklPIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pKQotCiAJLnNlY3Rpb24gLmJvb3RwZywgImF4IgogCS5nbG9ibAlsYXdfZW50cnkKLQogbGF3X2VudHJ5OgogCWVudHJ5X3N0YXJ0CisKIAkubG9uZyAoNGYtM2YpLzgKIDM6Ci0JLmxvbmcgTEFXQkFSMCxMQVdBUjAsTEFXQkFSMSxMQVdBUjEsTEFXQkFSMixMQVdBUjIsTEFXQkFSMyxMQVdBUjMKLQkubG9uZyBMQVdCQVI0LExBV0FSNCxMQVdCQVI1LExBV0FSNSxMQVdCQVI2LExBV0FSNixMQVdCQVI3LExBV0FSNwotCS5sb25nIExBV0JBUjgsTEFXQVI4CisJLmxvbmcgIDAKKwkubG9uZyAgKExBV0FSX1RSR1RfRERSIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzEyOE0pKSAmIH5MQVdBUl9FTgorCisjaWZkZWYgQ0ZHX1BDSTFfTUVNX1BIWVMKKwkubG9uZwkoQ0ZHX1BDSTFfTUVNX1BIWVM+PjEyKSAmIDB4ZmZmZmYKKwkubG9uZwlMQVdBUl9FTiB8IExBV0FSX1RSR1RfUENJMSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKQorCisJLmxvbmcJKENGR19QQ0kxX0lPX1BIWVM+PjEyKSAmIDB4ZmZmZmYKKwkubG9uZwlMQVdBUl9FTiB8IExBV0FSX1RSR1RfUENJMSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8xTSkKKyNlbmRpZgorCisjaWZkZWYgQ0ZHX1BDSTJfTUVNX1BIWVMKKwkubG9uZwkoQ0ZHX1BDSTJfTUVNX1BIWVM+PjEyKSAmIDB4ZmZmZmYKKwkubG9uZwlMQVdBUl9FTiB8IExBV0FSX1RSR1RfUENJMiB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKQorCisJLmxvbmcJKENGR19QQ0kyX0lPX1BIWVM+PjEyKSAmIDB4ZmZmZmYKKwkubG9uZwlMQVdBUl9FTiB8IExBV0FSX1RSR1RfUENJMiB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8xTSkKKyNlbmRpZgorCisjaWZkZWYgQ0ZHX1BDSUUxX01FTV9QSFlTCisJLmxvbmcJKENGR19QQ0lFMV9NRU1fUEhZUz4+MTIpICYgMHhmZmZmZgorCS5sb25nCUxBV0FSX0VOIHwgTEFXQVJfVFJHVF9QQ0lFIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pCisKKwkubG9uZwkoQ0ZHX1BDSUUxX0lPX1BIWVM+PjEyKSAmIDB4ZmZmZmYKKwkubG9uZwlMQVdBUl9FTiB8IExBV0FSX1RSR1RfUENJRSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8xTSkKKyNlbmRpZgorCisJLyogTEJDIHdpbmRvdyAtIG1hcHMgMjU2TSAweGYwMDAwMDAwIC0+IDB4ZmZmZmZmZmYgKi8KKwkubG9uZwkoQ0ZHX0xCQ19DQUNIRV9CQVNFPj4xMikgJiAweGZmZmZmCisJLmxvbmcJTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0xCQyB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKQorCisjaWZkZWYgQ0ZHX1JJT19NRU1fUEhZUworCS5sb25nCShDRkdfUklPX01FTV9QSFlTPj4xMikgJiAweGZmZmZmCisJLmxvbmcJTEFXQVJfRU4gfCBMQVdBUl9UUkdUX1JJTyB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKQorI2VuZGlmCiA0OgogCWVudHJ5X2VuZApkaWZmIC0tZ2l0IGEvYm9hcmQvY2RzL21wYzg1NDhjZHMvbXBjODU0OGNkcy5jIGIvYm9hcmQvY2RzL21wYzg1NDhjZHMvbXBjODU0OGNkcy5jCmluZGV4IGI3MjM2NDEuLjQ4NzUzZDcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL21wYzg1NDhjZHMuYworKysgYi9ib2FyZC9jZHMvbXBjODU0OGNkcy9tcGM4NTQ4Y2RzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KICAqCiAgKiAoQykgQ29weXJpZ2h0IDIwMDIgU2NvdHQgTWNOdXR0IDxzbWNudXR0QGFydGVzeW5jcC5jb20+CiAgKgpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHBjaS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaW1tYXBfODV4eC5oPgorI2luY2x1ZGUgPGFzbS9pbW1hcF9mc2xfcGNpLmg+CiAjaW5jbHVkZSA8c3BkLmg+CiAjaW5jbHVkZSA8bWlpcGh5Lmg+CiAKQEAgLTMzLDEwICszNCwxNSBAQAogI2luY2x1ZGUgIi4uL2NvbW1vbi9lZXByb20uaCIKICNpbmNsdWRlICIuLi9jb21tb24vdmlhLmgiCiAKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCisjaW5jbHVkZSA8ZnRfYnVpbGQuaD4KKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmICFkZWZpbmVkKENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUikKIGV4dGVybiB2b2lkIGRkcl9lbmFibGVfZWNjKHVuc2lnbmVkIGludCBkcmFtX3NpemUpOwogI2VuZGlmCiAKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCiBleHRlcm4gbG9uZyBpbnQgc3BkX3NkcmFtKHZvaWQpOwogCiB2b2lkIGxvY2FsX2J1c19pbml0KHZvaWQpOwpAQCAtNTYsMTMgKzYyLDYgQEAKIAkvKiBQQ0kgc2xvdCBpbiBVU0VSIGJpdHMgQ1NSWzY6N10gYnkgY29udmVudGlvbi4gKi8KIAl1aW50IHBjaV9zbG90ID0gZ2V0X3BjaV9zbG90ICgpOwogCi0JdWludCBwY2lfZHVhbCA9IGdldF9wY2lfZHVhbCAoKTsJLyogUENJIERVQUwgaW4gQ01fUENJWzNdICovCi0JdWludCBwY2kxXzMyID0gZ3VyLT5wb3JkZXZzciAmIDB4MTAwMDA7CS8qIFBPUkRFVlNSWzE1XSAqLwotCXVpbnQgcGNpMV9jbGtfc2VsID0gZ3VyLT5wb3JwbGxzciAmIDB4ODAwMDsJLyogUE9SUExMU1JbMTZdICovCi0JdWludCBwY2kyX2Nsa19zZWwgPSBndXItPnBvcnBsbHNyICYgMHg0MDAwOwkvKiBQT1JQTExTUlsxN10gKi8KLQotCXVpbnQgcGNpMV9zcGVlZCA9IGdldF9jbG9ja19mcmVxICgpOwkvKiBQQ0kgUFNQRUVEIGluIFs0OjVdICovCi0KIAl1aW50IGNwdV9ib2FyZF9yZXYgPSBnZXRfY3B1X2JvYXJkX3JldmlzaW9uICgpOwogCiAJcHJpbnRmICgiQm9hcmQ6IENEUyBWZXJzaW9uIDB4JTAyeCwgUENJIFNsb3QgJWRcbiIsCkBAIC03MSwyMCArNzAsNiBAQAogCXByaW50ZiAoIkNQVSBCb2FyZCBSZXZpc2lvbiAlZC4lZCAoMHglMDR4KVxuIiwKIAkJTVBDODVYWF9DUFVfQk9BUkRfTUFKT1IgKGNwdV9ib2FyZF9yZXYpLAogCQlNUEM4NVhYX0NQVV9CT0FSRF9NSU5PUiAoY3B1X2JvYXJkX3JldiksIGNwdV9ib2FyZF9yZXYpOwotCi0JcHJpbnRmICgiICAgIFBDSTE6ICVkIGJpdCwgJXMgTUh6LCAlc1xuIiwKLQkJKHBjaTFfMzIpID8gMzIgOiA2NCwKLQkJKHBjaTFfc3BlZWQgPT0gMzMwMDAwMDApID8gIjMzIiA6Ci0JCShwY2kxX3NwZWVkID09IDY2MDAwMDAwKSA/ICI2NiIgOiAidW5rbm93biIsCi0JCXBjaTFfY2xrX3NlbCA/ICJzeW5jIiA6ICJhc3luYyIpOwotCi0JaWYgKHBjaV9kdWFsKSB7Ci0JCXByaW50ZiAoIiAgICBQQ0kyOiAzMiBiaXQsIDY2IE1IeiwgJXNcbiIsCi0JCQlwY2kyX2Nsa19zZWwgPyAic3luYyIgOiAiYXN5bmMiKTsKLQl9IGVsc2UgewotCQlwcmludGYgKCIgICAgUENJMjogZGlzYWJsZWRcbiIpOwotCX0KLQogCS8qCiAJICogSW5pdGlhbGl6ZSBsb2NhbCBidXMuCiAJICovCkBAIC0xMDIsNiArODcsOCBAQAogCSAqLwogCWd1ci0+dHNlYzM0aW9vdmNyID0gMHhlN2UwOwkvKiAgMTExMCAwMTExIDExMTAgMHh4eCAqLwogCisJZWNtLT5lZWRyID0gMHhmZmZmZmZmZjsJCS8qIGNsZWFyIGVjbSBlcnJvcnMgKi8KKwllY20tPmVlZXIgPSAweGZmZmZmZmZmOwkJLyogZW5hYmxlIGVjbSBlcnJvcnMgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc2LDYgKzE2Myw5IEBACiAJbGJjLT5sY3JyIHw9IDB4MDAwMzAwMDA7CiAKIAlhc20oInN5bmM7aXN5bmM7bXN5bmMiKTsKKworCWxiYy0+bHRlc3IgPSAweGZmZmZmZmZmOwkvKiBDbGVhciBMQkMgZXJyb3IgaW50ZXJydXB0cyAqLworCWxiYy0+bHRlaXIgPSAweGZmZmZmZmZmOwkvKiBFbmFibGUgTEJDIGVycm9yIGludGVycnVwdHMgKi8KIH0KIAogLyoKQEAgLTMwMSw3ICsyOTEsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisjaWYgZGVmaW5lZChDT05GSUdfUENJKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kxKQogLyogRm9yIHNvbWUgcmVhc29uIHRoZSBUdW5kcmEgUENJIGJyaWRnZSBzaG93cyB1cCBvbiBpdHNlbGYgYXMgYQogICogZGlmZmVyZW50IGRldmljZS4gIFdvcmsgYXJvdW5kIHRoYXQgYnkgcmVmdXNpbmcgdG8gY29uZmlndXJlIGl0LgogICovCkBAIC0zMDksMzIgKzI5OSwxODkgQEAKIAogc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV9tcGM4NXh4Y2RzX2NvbmZpZ190YWJsZVtdID0gewogCXsweDEwZTMsIDB4MDUxMywgUENJX0FOWV9JRCwgMSwgMywgUENJX0FOWV9JRCwgZHVtbXlfZnVuYywgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgwNjg2LCBQQ0lfQU5ZX0lELCAxLCAyLCAwLCBtcGM4NXh4X2NvbmZpZ192aWEsIHswLDAsMH19LAotCXsweDExMDYsIDB4MDU3MSwgUENJX0FOWV9JRCwgMSwgMiwgMSwKKwl7MHgxMTA2LCAweDA2ODYsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgMCwgbXBjODV4eF9jb25maWdfdmlhLCB7MCwwLDB9fSwKKwl7MHgxMTA2LCAweDA1NzEsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgMSwKIAkJbXBjODV4eF9jb25maWdfdmlhX3VzYmlkZSwgezAsMCwwfX0sCi0JezB4MTEwNSwgMHgzMDM4LCBQQ0lfQU5ZX0lELCAxLCAyLCAyLCBtcGM4NXh4X2NvbmZpZ192aWFfdXNiLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDMwMzgsIFBDSV9BTllfSUQsIDEsIDIsIDMsIG1wYzg1eHhfY29uZmlnX3ZpYV91c2IyLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDMwNTgsIFBDSV9BTllfSUQsIDEsIDIsIDUsCisJezB4MTEwNSwgMHgzMDM4LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDIsCisJCW1wYzg1eHhfY29uZmlnX3ZpYV91c2IsIHswLDAsMH19LAorCXsweDExMDYsIDB4MzAzOCwgUENJX0FOWV9JRCwgMSwgVklBX0lELCAzLAorCQltcGM4NXh4X2NvbmZpZ192aWFfdXNiMiwgezAsMCwwfX0sCisJezB4MTEwNiwgMHgzMDU4LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDUsCiAJCW1wYzg1eHhfY29uZmlnX3ZpYV9wb3dlciwgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgzMDY4LCBQQ0lfQU5ZX0lELCAxLCAyLCA2LCBtcGM4NXh4X2NvbmZpZ192aWFfYWM5NywgezAsMCwwfX0sCisJezB4MTEwNiwgMHgzMDY4LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDYsCisJCW1wYzg1eHhfY29uZmlnX3ZpYV9hYzk3LCB7MCwwLDB9fSwKIAl7fSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZVtdID0gewotCXsgY29uZmlnX3RhYmxlOiBwY2lfbXBjODV4eGNkc19jb25maWdfdGFibGUsfSwKLSNpZmRlZiBDT05GSUdfTVBDODVYWF9QQ0kyCi0Je30sCi0jZW5kaWYKLX07Ci0KK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMV9ob3NlID0geworCWNvbmZpZ190YWJsZTogcGNpX21wYzg1eHhjZHNfY29uZmlnX3RhYmxlfTsKICNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKKyNpZmRlZiBDT05GSUdfUENJMgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kyX2hvc2U7CisjZW5kaWYJLyogQ09ORklHX1BDSTIgKi8KKworI2lmZGVmIENPTkZJR19QQ0lFMQorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2llMV9ob3NlOworI2VuZGlmCS8qIENPTkZJR19QQ0lFMSAqLworCitpbnQgZmlyc3RfZnJlZV9idXNubz0wOworCiB2b2lkCiBwY2lfaW5pdF9ib2FyZCh2b2lkKQogewotI2lmZGVmIENPTkZJR19QQ0kKLQlwY2lfbXBjODV4eF9pbml0KCZob3NlKTsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgY2Nzcl9ndXJfdCAqZ3VyID0gJmltbWFwLT5pbV9ndXI7CisJdWludCBpb19zZWwgPSAoZ3VyLT5wb3JkZXZzciAmIE1QQzg1eHhfUE9SREVWU1JfSU9fU0VMKSA+PiAxOTsKKwl1aW50IGhvc3RfYWdlbnQgPSAoZ3VyLT5wb3JibXNyICYgTVBDODV4eF9QT1JCTVNSX0hBKSA+PiAxNjsKKworCisjaWZkZWYgQ09ORklHX1BDSTEKK3sKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0kxX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaTFfaG9zZTsKKwlzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqdGFibGU7CisKKwl1aW50IHBjaV8zMiA9IGd1ci0+cG9yZGV2c3IgJiBNUEM4NXh4X1BPUkRFVlNSX1BDSTFfUENJMzI7CS8qIFBPUkRFVlNSWzE1XSAqLworCXVpbnQgcGNpX2FyYiA9IGd1ci0+cG9yZGV2c3IgJiBNUEM4NXh4X1BPUkRFVlNSX1BDSTFfQVJCOwkvKiBQT1JERVZTUlsxNF0gKi8KKwl1aW50IHBjaV9jbGtfc2VsID0gZ3VyLT5wb3JwbGxzciAmIE1QQzg1eHhfUE9SREVWU1JfUENJMV9TUEQ7CS8qIFBPUlBMTFNSWzE2XSAqLworCisJdWludCBwY2lfYWdlbnQgPSAoaG9zdF9hZ2VudCA9PSAzKSB8fCAoaG9zdF9hZ2VudCA9PSA0ICkgfHwgKGhvc3RfYWdlbnQgPT0gNik7CisKKwl1aW50IHBjaV9zcGVlZCA9IGdldF9jbG9ja19mcmVxICgpOwkvKiBQQ0kgUFNQRUVEIGluIFs0OjVdICovCisKKwlpZiAoIShndXItPmRldmRpc3IgJiBNUEM4NXh4X0RFVkRJU1JfUENJMSkpIHsKKwkJcHJpbnRmICgiICAgIFBDSTogJWQgYml0LCAlcyBNSHosICVzLCAlcywgJXNcbiIsCisJCQkocGNpXzMyKSA/IDMyIDogNjQsCisJCQkocGNpX3NwZWVkID09IDMzMzMzMDAwKSA/ICIzMyIgOgorCQkJKHBjaV9zcGVlZCA9PSA2NjY2NjAwMCkgPyAiNjYiIDogInVua25vd24iLAorCQkJcGNpX2Nsa19zZWwgPyAic3luYyIgOiAiYXN5bmMiLAorCQkJcGNpX2FnZW50ID8gImFnZW50IiA6ICJob3N0IiwKKwkJCXBjaV9hcmIgPyAiYXJiaXRlciIgOiAiZXh0ZXJuYWwtYXJiaXRlciIKKwkJCSk7CisKKworCQkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJCS8qIG91dGJvdW5kIGlvICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkJICAgICAgIENGR19QQ0kxX0lPX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9JT19TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCQlob3NlLT5yZWdpb25fY291bnQgPSAyOworCisJCS8qIHJlbG9jYXRlIGNvbmZpZyB0YWJsZSBwb2ludGVycyAqLworCQlob3NlLT5jb25maWdfdGFibGUgPSBcCisJCQkoc3RydWN0IHBjaV9jb25maWdfdGFibGUgKikoKHVpbnQpaG9zZS0+Y29uZmlnX3RhYmxlICsgZ2QtPnJlbG9jX29mZik7CisJCWZvciAodGFibGUgPSBob3NlLT5jb25maWdfdGFibGU7IHRhYmxlICYmIHRhYmxlLT52ZW5kb3I7IHRhYmxlKyspCisJCQl0YWJsZS0+Y29uZmlnX2RldmljZSArPSBnZC0+cmVsb2Nfb2ZmOworCisJCWhvc2UtPmZpcnN0X2J1c25vPWZpcnN0X2ZyZWVfYnVzbm87CisJCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJCWZzbF9wY2lfaW5pdChob3NlKTsKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZiAoIlBDSSBvbiBidXMgJTAyeCAtICUwMnhcbiIsaG9zZS0+Zmlyc3RfYnVzbm8saG9zZS0+bGFzdF9idXNubyk7CisjaWZkZWYgQ09ORklHX1BDSVhfQ0hFQ0sKKwkJaWYgKCEoZ3VyLT5wb3JkZXZzciAmIFBPUkRFVlNSX1BDSSkpIHsKKwkJCS8qIFBDSS1YIGluaXQgKi8KKwkJCWlmIChDT05GSUdfU1lTX0NMS19GUkVRIDwgNjYwMDAwMDApCisJCQkJcHJpbnRmKCJQQ0ktWCB3aWxsIG9ubHkgd29yayBhdCA2NiBNSHpcbiIpOworCisJCQlyZWcxNiA9IFBDSV9YX0NNRF9NQVhfU1BMSVQgfCBQQ0lfWF9DTURfTUFYX1JFQUQKKwkJCQl8IFBDSV9YX0NNRF9FUk8gfCBQQ0lfWF9DTURfRFBFUlJfRTsKKwkJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGJ1cywgUENJWF9DT01NQU5ELCByZWcxNik7CisJCX0KICNlbmRpZgorCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgICBQQ0k6IGRpc2FibGVkXG4iKTsKKwl9Cit9CisjZWxzZQorCWd1ci0+ZGV2ZGlzciB8PSBNUEM4NXh4X0RFVkRJU1JfUENJMTsgLyogZGlzYWJsZSAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJMgoreworCXVpbnQgcGNpMl9jbGtfc2VsID0gZ3VyLT5wb3JwbGxzciAmIDB4NDAwMDsJLyogUE9SUExMU1JbMTddICovCisJdWludCBwY2lfZHVhbCA9IGdldF9wY2lfZHVhbCAoKTsJLyogUENJIERVQUwgaW4gQ01fUENJWzNdICovCisJaWYgKHBjaV9kdWFsKSB7CisJCXByaW50ZiAoIiAgICBQQ0kyOiAzMiBiaXQsIDY2IE1IeiwgJXNcbiIsCisJCQlwY2kyX2Nsa19zZWwgPyAic3luYyIgOiAiYXN5bmMiKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCIgICAgUENJMjogZGlzYWJsZWRcbiIpOworCX0KK30KKyNlbHNlCisJZ3VyLT5kZXZkaXNyIHw9IE1QQzg1eHhfREVWRElTUl9QQ0kyOyAvKiBkaXNhYmxlICovCisjZW5kaWYgLyogQ09ORklHX1BDSTIgKi8KKworI2lmZGVmIENPTkZJR19QQ0lFMQoreworCXZvbGF0aWxlIGNjc3JfZnNsX3BjaV90ICpwY2kgPSAoY2Nzcl9mc2xfcGNpX3QgKikgQ0ZHX1BDSUUxX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaWUxX2hvc2U7CisJaW50IHBjaWVfZXAgPSAgKGhvc3RfYWdlbnQgPT0gMCkgfHwgKGhvc3RfYWdlbnQgPT0gMiApIHx8IChob3N0X2FnZW50ID09IDMpOworCisJaW50IHBjaWVfY29uZmlndXJlZCAgPSBpb19zZWwgPj0gMTsKKworCWlmIChwY2llX2NvbmZpZ3VyZWQgJiYgIShndXItPmRldmRpc3IgJiBNUEM4NXh4X0RFVkRJU1JfUENJRSkpeworCQlwcmludGYgKCJcbiAgICBQQ0lFIGNvbm5lY3RlZCB0byBzbG90IGFzICVzIChiYXNlIGFkZHJlc3MgJXgpIiwKKwkJCXBjaWVfZXAgPyAiRW5kIFBvaW50IiA6ICJSb290IENvbXBsZXgiLAorCQkJKHVpbnQpcGNpKTsKKworCQlpZiAocGNpLT5wbWVfbXNnX2RldCkgeworCQkJcGNpLT5wbWVfbXNnX2RldCA9IDB4ZmZmZmZmZmY7CisJCQlkZWJ1ZyAoIiB3aXRoIGVycm9ycy4gIENsZWFyaW5nLiAgTm93IDB4JTA4eCIscGNpLT5wbWVfbXNnX2RldCk7CisJCX0KKwkJcHJpbnRmICgiXG4iKTsKKworCQkvKiBpbmJvdW5kICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9QSFlTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkJICAgICAgIENGR19QQ0lFMV9NRU1fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJRTFfTUVNX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSUUxX01FTV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCQkvKiBvdXRib3VuZCBpbyAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwKKwkJCSAgICAgICBDRkdfUENJRTFfSU9fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJRTFfSU9fUEhZUywKKwkJCSAgICAgICBDRkdfUENJRTFfSU9fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCQlob3NlLT5yZWdpb25fY291bnQgPSAzOworCisJCWhvc2UtPmZpcnN0X2J1c25vPWZpcnN0X2ZyZWVfYnVzbm87CisJCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJCWZzbF9wY2lfaW5pdChob3NlKTsKKwkJcHJpbnRmICgiUENJRSBvbiBidXMgJWQgLSAlZFxuIixob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKKworCQlmaXJzdF9mcmVlX2J1c25vPWhvc2UtPmxhc3RfYnVzbm8rMTsKKworCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgICBQQ0lFOiBkaXNhYmxlZFxuIik7CisJfQorIH0KKyNlbHNlCisJZ3VyLT5kZXZkaXNyIHw9IE1QQzg1eHhfREVWRElTUl9QQ0lFOyAvKiBkaXNhYmxlICovCisjZW5kaWYKKwogfQogCiBpbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCkBAIC0zNjcsMyArNTE0LDMyIEBACiAKIAlyZXR1cm4gMDsKIH0KKworCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSAmJiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKK3ZvaWQKK2Z0X3BjaV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKK3sKKwl1MzIgKnA7CisJaW50IGxlbjsKKworCisjaWZkZWYgQ09ORklHX1BDSTEKKwlwID0gKHUzMiAqKWZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAODAwMC9idXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAocCAhPSBOVUxMKSB7CisJCXBbMF0gPSAwOworCQlwWzFdID0gcGNpMV9ob3NlLmxhc3RfYnVzbm8gLSBwY2kxX2hvc2UuZmlyc3RfYnVzbm87CisJCWRlYnVnKCJQQ0lAODAwMCBmaXJzdF9idXNubz0lZCBsYXN0X2J1c25vPSVkXG4iLHBbMF0scFsxXSk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJRTEKKwlwID0gKHUzMiAqKWZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAYTAwMC9idXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAocCAhPSBOVUxMKSB7CisJCXBbMF0gPSAwOworCQlwWzFdID0gcGNpZTFfaG9zZS5sYXN0X2J1c25vIC0gcGNpZTFfaG9zZS5maXJzdF9idXNubzsKKwkJZGVidWcoIlBDSUBhMDAwIGZpcnN0X2J1c25vPSVkIGxhc3RfYnVzbm89JWRcbiIscFswXSxwWzFdKTsKKwl9CisjZW5kaWYKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvY2RzL21wYzg1NDhjZHMvdS1ib290LmxkcyBiL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL3UtYm9vdC5sZHMKaW5kZXggYzFmMzQ5NS4uNTMwYmE1YSAxMDA2NDQKLS0tIGEvYm9hcmQvY2RzL21wYzg1NDhjZHMvdS1ib290LmxkcworKysgYi9ib2FyZC9jZHMvbXBjODU0OGNkcy91LWJvb3QubGRzCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgorICogQ29weXJpZ2h0IDIwMDQsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICAqIHByb2plY3QuCkBAIC03MSw3ICs3MSw2IEBACiAgICAgY3B1L21wYzg1eHgvY3B1Lm8gKC50ZXh0KQogICAgIGRyaXZlcnMvdHNlYy5vICgudGV4dCkKICAgICBjcHUvbXBjODV4eC9zcGVlZC5vICgudGV4dCkKLSAgICBjcHUvbXBjODV4eC9wY2kubyAoLnRleHQpCiAgICAgY29tbW9uL2RsbWFsbG9jLm8gKC50ZXh0KQogICAgIGxpYl9nZW5lcmljL2NyYzMyLm8gKC50ZXh0KQogICAgIGxpYl9wcGMvZXh0YWJsZS5vICgudGV4dCkKZGlmZiAtLWdpdCBhL2JvYXJkL2Nkcy9tcGM4NTU1Y2RzL21wYzg1NTVjZHMuYyBiL2JvYXJkL2Nkcy9tcGM4NTU1Y2RzL21wYzg1NTVjZHMuYwppbmRleCA3MDRiZjAzLi44ZjE2NDIxIDEwMDY0NAotLS0gYS9ib2FyZC9jZHMvbXBjODU1NWNkcy9tcGM4NTU1Y2RzLmMKKysrIGIvYm9hcmQvY2RzL21wYzg1NTVjZHMvbXBjODU1NWNkcy5jCkBAIC00NzMsMTQgKzQ3MywxNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9jb25maWdfdGFibGUgcGNpX21wYzg1eHhjZHNfY29uZmlnX3RhYmxlW10gPSB7CiAJezB4MTBlMywgMHgwNTEzLCBQQ0lfQU5ZX0lELCAxLCAzLCBQQ0lfQU5ZX0lELCBkdW1teV9mdW5jLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDA2ODYsIFBDSV9BTllfSUQsIDEsIDIsIDAsIG1wYzg1eHhfY29uZmlnX3ZpYSwgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgwNTcxLCBQQ0lfQU5ZX0lELCAxLCAyLCAxLAorCXsweDExMDYsIDB4MDY4NiwgUENJX0FOWV9JRCwgMSwgVklBX0lELCAwLCBtcGM4NXh4X2NvbmZpZ192aWEsIHswLDAsMH19LAorCXsweDExMDYsIDB4MDU3MSwgUENJX0FOWV9JRCwgMSwgVklBX0lELCAxLAogCQltcGM4NXh4X2NvbmZpZ192aWFfdXNiaWRlLCB7MCwwLDB9fSwKLQl7MHgxMTA1LCAweDMwMzgsIFBDSV9BTllfSUQsIDEsIDIsIDIsIG1wYzg1eHhfY29uZmlnX3ZpYV91c2IsIHswLDAsMH19LAotCXsweDExMDYsIDB4MzAzOCwgUENJX0FOWV9JRCwgMSwgMiwgMywgbXBjODV4eF9jb25maWdfdmlhX3VzYjIsIHswLDAsMH19LAotCXsweDExMDYsIDB4MzA1OCwgUENJX0FOWV9JRCwgMSwgMiwgNSwKKwl7MHgxMTA1LCAweDMwMzgsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgMiwKKwkJbXBjODV4eF9jb25maWdfdmlhX3VzYiwgezAsMCwwfX0sCisJezB4MTEwNiwgMHgzMDM4LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDMsCisJCW1wYzg1eHhfY29uZmlnX3ZpYV91c2IyLCB7MCwwLDB9fSwKKwl7MHgxMTA2LCAweDMwNTgsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgNSwKIAkJbXBjODV4eF9jb25maWdfdmlhX3Bvd2VyLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDMwNjgsIFBDSV9BTllfSUQsIDEsIDIsIDYsIG1wYzg1eHhfY29uZmlnX3ZpYV9hYzk3LCB7MCwwLDB9fSwKKwl7MHgxMTA2LCAweDMwNjgsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgNiwKKwkJbXBjODV4eF9jb25maWdfdmlhX2FjOTcsIHswLDAsMH19LAogCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvY201MjAwL01ha2VmaWxlIGIvYm9hcmQvY201MjAwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmRiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9jbTUyMDAvTWFrZWZpbGUKQEAgLTAsMCArMSw1MCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSAkKEJPQVJEKS5vIGNtZF9jbTUyMDAubyBmd3VwZGF0ZS5vCisKK1NSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9jbTUyMDAvY201MjAwLmMgYi9ib2FyZC9jbTUyMDAvY201MjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0YWMwOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NtNTIwMC9jbTUyMDAuYwpAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogTWFyayBKb25hcywgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIG1hcmsuam9uYXNAbW90b3JvbGEuY29tLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA1CisgKiBNYXJ0aW4gS3JhdXNlLCBUUS1TeXN0ZW1zIEdtYkgsIG1hcnRpbi5rcmF1c2VAdHFzLmRlCisgKgorICogQWRhcHRlZCB0byBVLUJvb3QgMS4yIGJ5OgorICogICBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPjoKKyAqICAgICAgLSBIVyBJRCByZWFkb3V0IGZyb20gRUVQUk9NCisgKiAgICAgIC0gbW9kdWxlIGRldGVjdGlvbgorICogICBHcnplZ29yeiBCZXJuYWNraSA8Z2piQHNlbWloYWxmLmNvbT46CisgKiAgICAgIC0gcnVuLXRpbWUgU0RSQU0gY29udHJvbGxlciBjb25maWd1cmF0aW9uCisgKiAgICAgIC0gTElCRkRUIHN1cHBvcnQKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjNXh4eC5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGxpYmZkdF9lbnYuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KKworCisjaW5jbHVkZSAiY201MjAwLmgiCisjaW5jbHVkZSAiZnd1cGRhdGUuaCIKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3N0YXRpYyBod19pZF90IGh3X2lkOworCisKKyNpZm5kZWYgQ0ZHX1JBTUJPT1QKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBTRFJBTSBjb250cm9sbGVyLgorICovCitzdGF0aWMgdm9pZCBzZHJhbV9zdGFydChpbnQgaGlfYWRkciwgbWVtX2NvbmZfdCAqbWVtX2NvbmYpCit7CisJbG9uZyBoaV9hZGRyX2JpdCA9IGhpX2FkZHIgPyAweDAxMDAwMDAwIDogMDsKKworCS8qIHVubG9jayBtb2RlIHJlZ2lzdGVyICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DVFJMID0gbWVtX2NvbmYtPmNvbnRyb2wgfCAweDgwMDAwMDAwIHwKKwkJCQkJCWhpX2FkZHJfYml0OworCisJLyogcHJlY2hhcmdlIGFsbCBiYW5rcyAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1RSTCA9IG1lbV9jb25mLT5jb250cm9sIHwgMHg4MDAwMDAwMiB8CisJCQkJCQloaV9hZGRyX2JpdDsKKworCS8qIGF1dG8gcmVmcmVzaCAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1RSTCA9IG1lbV9jb25mLT5jb250cm9sIHwgMHg4MDAwMDAwNCB8CisJCQkJCQloaV9hZGRyX2JpdDsKKworCS8qIGF1dG8gcmVmcmVzaCwgc2Vjb25kIHRpbWUgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NUUkwgPSBtZW1fY29uZi0+Y29udHJvbCB8IDB4ODAwMDAwMDQgfAorCQkJCQkJaGlfYWRkcl9iaXQ7CisKKwkvKiBzZXQgbW9kZSByZWdpc3RlciAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fTU9ERSA9IG1lbV9jb25mLT5tb2RlOworCisJLyogbm9ybWFsIG9wZXJhdGlvbiAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1RSTCA9IG1lbV9jb25mLT5jb250cm9sIHwgaGlfYWRkcl9iaXQ7Cit9CisjZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KKworCisvKgorICogUmV0cmlldmUgbWVtb3J5IGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gbW9kdWxlLiBib2FyZF90eXBlIGlzIHRoZSBpbmRleAorICogaW4gaHdfaWRfbGlzdFtdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZSB3ZSBhcmUgZXhlY3V0aW5nIG9uOyB3ZSByZXR1cm4KKyAqIFNEUkFNIGNvbnRyb2xsZXIgc2V0dGluZ3MgYXBwcm9wcmF0ZSBmb3IgdGhpcyBtb2R1bGUuCisgKi8KK3N0YXRpYyBtZW1fY29uZl90KiBnZXRfbWVtX2NvbmZpZyhpbnQgYm9hcmRfdHlwZSkKK3sKKwlzd2l0Y2goYm9hcmRfdHlwZSl7CisJCWNhc2UgQ00xX1FBOgorCQkJcmV0dXJuIG1lbW9yeV9jb25maWdbMF07CisJCWNhc2UgQ00xMV9RQToKKwkJY2FzZSBDTVUxX1FBOgorCQkJcmV0dXJuIG1lbW9yeV9jb25maWdbMV07CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIkVSUk9SOiBVbmtub3duIG1vZHVsZSwgdXNpbmcgYSBkZWZhdWx0IFNEUkFNICIKKwkJCQkiY29uZmlndXJhdGlvbiAtIHRoaW5ncyBtYXkgbm90IHdvcmshISEuXG4iKTsKKwkJCXJldHVybiBtZW1vcnlfY29uZmlnWzBdOworCX0KK30KKworCisvKgorICogSW5pdGFsaXplIFNEUkFNIC0gY29uZmlndXJlIFNEUkFNIGNvbnRyb2xsZXIsIGRldGVjdCBtZW1vcnkgc2l6ZS4KKyAqLworbG9uZyBpbnQgaW5pdGRyYW0oaW50IGJvYXJkX3R5cGUpCit7CisJdWxvbmcgZHJhbXNpemUgPSAwOworI2lmbmRlZiBDRkdfUkFNQk9PVAorCXVsb25nIHRlc3QxLCB0ZXN0MjsKKwltZW1fY29uZl90ICptZW1fY29uZjsKKworCW1lbV9jb25mID0gZ2V0X21lbV9jb25maWcoYm9hcmRfdHlwZSk7CisKKwkvKiBjb25maWd1cmUgU0RSQU0gc3RhcnQvZW5kIGZvciBkZXRlY3Rpb24gKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NTMENGRyA9IDB4MDAwMDAwMWU7IC8qIDJHIGF0IDB4MCAqLworCisJLyogc2V0dXAgY29uZmlnIHJlZ2lzdGVycyAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ09ORklHMSA9IG1lbV9jb25mLT5jb25maWcxOworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ09ORklHMiA9IG1lbV9jb25mLT5jb25maWcyOworCisJc2RyYW1fc3RhcnQoMCwgbWVtX2NvbmYpOworCXRlc3QxID0gZ2V0X3JhbV9zaXplKChsb25nICopQ0ZHX1NEUkFNX0JBU0UsIDB4ODAwMDAwMDApOworCXNkcmFtX3N0YXJ0KDEsIG1lbV9jb25mKTsKKwl0ZXN0MiA9IGdldF9yYW1fc2l6ZSgobG9uZyAqKUNGR19TRFJBTV9CQVNFLCAweDgwMDAwMDAwKTsKKwlpZiAodGVzdDEgPiB0ZXN0MikgeworCQlzZHJhbV9zdGFydCgwLCBtZW1fY29uZik7CisJCWRyYW1zaXplID0gdGVzdDE7CisJfSBlbHNlCisJCWRyYW1zaXplID0gdGVzdDI7CisKKwkvKiBtZW1vcnkgc21hbGxlciB0aGFuIDFNQiBpcyBpbXBvc3NpYmxlICovCisJaWYgKGRyYW1zaXplIDwgKDEgPDwgMjApKQorCQlkcmFtc2l6ZSA9IDA7CisKKwkvKiBzZXQgU0RSQU0gQ1MwIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnQgb2YgUkFNIGZvdW5kICovCisJaWYgKGRyYW1zaXplID4gMCkgeworCQkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NTMENGRyA9IDB4MTMgKworCQkJX19idWlsdGluX2ZmcyhkcmFtc2l6ZSA+PiAyMCkgLSAxOworCX0gZWxzZQorCQkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NTMENGRyA9IDA7IC8qIGRpc2FibGVkICovCisjZWxzZSAvKiBDRkdfUkFNQk9PVCAqLworCS8qIHJldHJpZXZlIHNpemUgb2YgbWVtb3J5IGNvbm5lY3RlZCB0byBTRFJBTSBDUzAgKi8KKwlkcmFtc2l6ZSA9ICoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1MwQ0ZHICYgMHhGRjsKKwlpZiAoZHJhbXNpemUgPj0gMHgxMykKKwkJZHJhbXNpemUgPSAoMSA8PCAoZHJhbXNpemUgLSAweDEzKSkgPDwgMjA7CisJZWxzZQorCQlkcmFtc2l6ZSA9IDA7CisjZW5kaWYgLyogIUNGR19SQU1CT09UICovCisKKwkvKgorCSAqIE9uIE1QQzUyMDBCIHdlIG5lZWQgdG8gc2V0IHRoZSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gZGVsYXkgaW4gdGhlCisJICogRERSIGNvbnRyb2xsZXIuICBSZWZlciB0byBjaGFwdGVyIDguNy41IFNEZWxheS0tTUJBUiArIDB4MDE5MCBvZgorCSAqIHRoZSBNUEM1MjAwQiBVc2VyJ3MgTWFudWFsLgorCSAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fU0RFTEFZID0gMHgwNDsKKwlfX2FzbV9fIHZvbGF0aWxlICgic3luYyIpOworCisJcmV0dXJuIGRyYW1zaXplOworfQorCisKKy8qCisgKiBSZWFkIG1vZHVsZSBoYXJkd2FyZSBpZGVudGlmaWNhdGlvbiBkYXRhIGZyb20gdGhlIEkyQyBFRVBST00uCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfaHdfaWQoaHdfaWRfdCBod19pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgSFdfSURfRUxFTV9DT1VOVDsgKytpKQorCQlpZiAoaTJjX3JlYWQoQ0ZHX0kyQ19FRVBST00sCisJCQkJaHdfaWRfZm9ybWF0W2ldLm9mZnNldCwKKwkJCQkyLAorCQkJCSh1Y2hhciAqKSZod19pZFtpXVswXSwKKwkJCQlod19pZF9mb3JtYXRbaV0ubGVuZ3RoKSAhPSAwKQorCQkJcHJpbnRmKCJFUlJPUjogY2FuJ3QgcmVhZCBIVyBJRCBmcm9tIEVFUFJPTVxuIik7Cit9CisKKworLyoKKyAqIElkZW50aWZ5IG1vZHVsZSB3ZSBhcmUgcnVubmluZyBvbiwgc2V0IGdkLT5ib2FyZF90eXBlIHRvIHRoZSBpbmRleCBpbgorICogaHdfaWRfbGlzdFtdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZSBpZGVudGlmZWQsIG9yIHRvCisgKiBDTTUyMDBfVU5LTk9XTl9NT0RVTEUgaWYgd2UgY2FuJ3QgaWRlbnRpZnkgdGhlIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgaWRlbnRpZnlfbW9kdWxlKGh3X2lkX3QgaHdfaWQpCit7CisJaW50IGksIGosIGVsZW1lbnQ7CisJY2hhciBtYXRjaDsKKwlnZC0+Ym9hcmRfdHlwZSA9IENNNTIwMF9VTktOT1dOX01PRFVMRTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChod19pZF9saXN0KSAvIHNpemVvZiAoY2hhciAqKik7ICsraSkgeworCQltYXRjaCA9IDE7CisJCWZvciAoaiA9IDA7IGogPCBzaXplb2YgKGh3X2lkX2lkZW50aWZ5KSAvIHNpemVvZiAoaW50KTsgKytqKSB7CisJCQllbGVtZW50ID0gaHdfaWRfaWRlbnRpZnlbal07CisJCQlpZiAoc3RybmNtcChod19pZF9saXN0W2ldW2VsZW1lbnRdLAorCQkJCQkmaHdfaWRbZWxlbWVudF1bMF0sCisJCQkJCWh3X2lkX2Zvcm1hdFtlbGVtZW50XS5sZW5ndGgpICE9IDApIHsKKwkJCQltYXRjaCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKG1hdGNoKSB7CisJCQlnZC0+Ym9hcmRfdHlwZSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogQ29tcG9zZSBzdHJpbmcgd2l0aCBtb2R1bGUgbmFtZS4KKyAqIGJ1ZiBpcyBhc3N1bWVkIHRvIGhhdmUgZW5vdWdoIHNwYWNlLCBhbmQgYmUgbnVsbC10ZXJtaW5hdGVkLgorICovCitzdGF0aWMgdm9pZCBjb21wb3NlX21vZHVsZV9uYW1lKGh3X2lkX3QgaHdfaWQsIGNoYXIgKmJ1ZikKK3sKKwljaGFyIHRtcFtNT0RVTEVfTkFNRV9NQVhMRU5dOworCXN0cm5jYXQoYnVmLCAmaHdfaWRbUENCX05BTUVdWzBdLCBod19pZF9mb3JtYXRbUENCX05BTUVdLmxlbmd0aCk7CisJc3RybmNhdChidWYsICIuIiwgMSk7CisJc3RybmNhdChidWYsICZod19pZFtGT1JNXVswXSwgaHdfaWRfZm9ybWF0W0ZPUk1dLmxlbmd0aCk7CisJc3RybmNhdChidWYsICZod19pZFtWRVJTSU9OXVswXSwgaHdfaWRfZm9ybWF0W1ZFUlNJT05dLmxlbmd0aCk7CisJc3RybmNhdChidWYsICIgKCIsIDIpOworCXN0cm5jYXQoYnVmLCAmaHdfaWRbSURFTlRJRklDQVRJT05fTlVNQkVSXVswXSwKKwkJaHdfaWRfZm9ybWF0W0lERU5USUZJQ0FUSU9OX05VTUJFUl0ubGVuZ3RoKTsKKwlzcHJpbnRmKHRtcCwgIiAvICV1LiV1KSIsCisJCWh3X2lkW01BSk9SX1NXX1ZFUlNJT05dWzBdLAorCQlod19pZFtNSU5PUl9TV19WRVJTSU9OXVswXSk7CisJc3RyY2F0KGJ1ZiwgdG1wKTsKK30KKworCisvKgorICogQ29tcG9zZSBzdHJpbmcgd2l0aCBob3N0bmFtZS4KKyAqIGJ1ZiBpcyBhc3N1bWVkIHRvIGhhdmUgZW5vdWdoIHNwYWNlLCBhbmQgYmUgbnVsbC10ZXJtaW5hdGVkLgorICovCitzdGF0aWMgdm9pZCBjb21wb3NlX2hvc3RuYW1lKGh3X2lkX3QgaHdfaWQsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwOworCXN0cm5jYXQoYnVmLCAmaHdfaWRbUENCX05BTUVdWzBdLCBod19pZF9mb3JtYXRbUENCX05BTUVdLmxlbmd0aCk7CisJc3RybmNhdChidWYsICJfIiwgMSk7CisJc3RybmNhdChidWYsICZod19pZFtGT1JNXVswXSwgaHdfaWRfZm9ybWF0W0ZPUk1dLmxlbmd0aCk7CisJc3RybmNhdChidWYsICZod19pZFtWRVJTSU9OXVswXSwgaHdfaWRfZm9ybWF0W1ZFUlNJT05dLmxlbmd0aCk7CisJZm9yIChwID0gYnVmOyAqcDsgKytwKQorCQkqcCA9IHRvbG93ZXIoKnApOworCit9CisKKworI2lmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKSAmJiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisvKgorICogVXBkYXRlICdtb2RlbCcgYW5kICdtZW1vcnknIHByb3BlcnRpZXMgaW4gdGhlIGJsb2IgYWNjb3JkaW5nIHRvIHRoZSBtb2R1bGUKKyAqIHRoYXQgd2UgYXJlIHJ1bm5pbmcgb24uCisgKi8KK3N0YXRpYyB2b2lkIGZ0X2Jsb2JfdXBkYXRlKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCWludCBsZW4sIHJldCwgbm9kZW9mZnNldCA9IDA7CisJY2hhciBtb2R1bGVfbmFtZVtNT0RVTEVfTkFNRV9NQVhMRU5dID0gezB9OworCXVsb25nIG1lbW9yeV9kYXRhWzJdID0gezB9OworCisJY29tcG9zZV9tb2R1bGVfbmFtZShod19pZCwgbW9kdWxlX25hbWUpOworCWxlbiA9IHN0cmxlbihtb2R1bGVfbmFtZSkgKyAxOworCisJcmV0ID0gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgIm1vZGVsIiwgbW9kdWxlX25hbWUsIGxlbik7CisJaWYgKHJldCA8IDApCisJcHJpbnRmKCJmdF9ibG9iX3VwZGF0ZSgpOiBjYW5ub3Qgc2V0IC9tb2RlbCBwcm9wZXJ0eSBlcnI6JXNcbiIsCisJCWZkdF9zdHJlcnJvcihyZXQpKTsKKworCW1lbW9yeV9kYXRhWzBdID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXN0YXJ0KTsKKwltZW1vcnlfZGF0YVsxXSA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zaXplKTsKKworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGggKGJsb2IsICIvbWVtb3J5Iik7CisJaWYgKG5vZGVvZmZzZXQgPj0gMCkgeworCQlyZXQgPSBmZHRfc2V0cHJvcChibG9iLCBub2Rlb2Zmc2V0LCAicmVnIiwgbWVtb3J5X2RhdGEsCisJCQkJCXNpemVvZihtZW1vcnlfZGF0YSkpOworCWlmIChyZXQgPCAwKQorCQlwcmludGYoImZ0X2Jsb2JfdXBkYXRlKTogY2Fubm90IHNldCAvbWVtb3J5L3JlZyAiCisJCQkicHJvcGVydHkgZXJyOiVzXG4iLCBmZHRfc3RyZXJyb3IocmV0KSk7CisJfQorCWVsc2UgeworCQkvKiBtZW1vcnkgbm9kZSBpcyByZXF1aXJlZCBpbiBkdHMgKi8KKwkJcHJpbnRmKCJmdF9ibG9iX3VwZGF0ZSgpOiBjYW5ub3QgZmluZCAvbWVtb3J5IG5vZGUgIgorCQkiZXJyOiVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCX0KK30KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkgJiYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKSAqLworCisKKy8qCisgKiBSZWFkIEhXIElEIGZyb20gSTJDIEVFUFJPTSBhbmQgZGV0ZWN0IHRoZSBtb2R1ZSB3ZSBhcmUgcnVubmluZyBvbi4gTm90ZQorICogdGhhdCB3ZSBuZWVkIHRvIHVzZSBsb2NhbCB2YXJpYWJsZSBmb3IgcmVhZG91dCwgYmVjYXVzZSBnbG9iYWwgZGF0YSBpcyBub3QKKyAqIHdyaXRhYmxlIHlldCAoYW5kIHdlJ2xsIGhhdmUgdG8gcmVkbyB0aGUgcmVhZG91dCBsYXRlciBvbikuCisgKi8KK2ludCBjaGVja2JvYXJkKHZvaWQpCit7CisJaHdfaWRfdCBod19pZF90bXA7CisJY2hhciBtb2R1bGVfbmFtZV90bXBbTU9EVUxFX05BTUVfTUFYTEVOXSA9ICIiOworCisJLyoKKwkgKiBXZSBuZWVkIEkyQyB0byBhY2Nlc3MgSFcgSUQgZGF0YSBmcm9tIEVFUFJPTSwgc28gd2UgY2FsbCBpMmNfaW5pdCgpCisJICogaGVyZSBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgaXQgd2lsbCBiZSBjYWxsZWQgYWdhaW4gbGF0ZXIgb24uIFdlCisJICogYWxzbyB1c2UgYSBsaXR0bGUgdHJpY2sgdG8gc2lsZW5jZSBJMkMtcmVsYXRlZCBvdXRwdXQuCisJICovCisJZ2QtPmZsYWdzIHw9IEdEX0ZMR19TSUxFTlQ7CisJaTJjX2luaXQgKENGR19JMkNfU1BFRUQsIENGR19JMkNfU0xBVkUpOworCWdkLT5mbGFncyAmPSB+R0RfRkxHX1NJTEVOVDsKKworCXJlYWRfaHdfaWQoaHdfaWRfdG1wKTsKKwlpZGVudGlmeV9tb2R1bGUoaHdfaWRfdG1wKTsJLyogdGhpcyBzZXRzIGdkLT5ib2FyZF90eXBlICovCisJY29tcG9zZV9tb2R1bGVfbmFtZShod19pZF90bXAsIG1vZHVsZV9uYW1lX3RtcCk7CisKKwlpZiAoZ2QtPmJvYXJkX3R5cGUgIT0gQ001MjAwX1VOS05PV05fTU9EVUxFKQorCQlwcmludGYoIkJvYXJkOiAlc1xuIiwgbW9kdWxlX25hbWVfdG1wKTsKKwllbHNlCisJCXByaW50ZigiQm9hcmQ6IHVucmVjb2duaXplZCBjbTUyMDAgbW9kdWxlICglcylcbiIsCisJCQltb2R1bGVfbmFtZV90bXApOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGJvYXJkX2Vhcmx5X2luaXRfcih2b2lkKQoreworCS8qCisJICogTm93LCB3aGVuIHdlIGFyZSBpbiBSQU0sIGVuYWJsZSBmbGFzaCB3cml0ZSBhY2Nlc3MgZm9yIGRldGVjdGlvbgorCSAqIHByb2Nlc3MuIE5vdGUgdGhhdCBDU19CT09UIGNhbm5vdCBiZSBjbGVhcmVkIHdoZW4gZXhlY3V0aW5nIGluCisJICogZmxhc2guCisJICovCisJKih2dV9sb25nICopTVBDNVhYWF9CT09UQ1NfQ0ZHICY9IH4weDE7IC8qIGNsZWFyIFJPICovCisKKwkvKiBOb3cgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gZ2xvYmFsIGRhdGEsIHJlYWQgSFcgSUQgYWdhaW4uICovCisJcmVhZF9od19pZChod19pZCk7CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19QT1NUCitpbnQgcG9zdF9ob3RrZXlzX3ByZXNzZWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLworCisKKyNpZiBkZWZpbmVkKENPTkZJR19QT1NUKSB8fCBkZWZpbmVkKENPTkZJR19MT0dCVUZGRVIpCit2b2lkIHBvc3Rfd29yZF9zdG9yZSh1bG9uZyBhKQoreworCXZ1X2xvbmcgKnNhdmVfYWRkciA9ICh2dV9sb25nICopKE1QQzVYWFhfU1JBTSArIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUpOworCSpzYXZlX2FkZHIgPSBhOworfQorCisKK3Vsb25nIHBvc3Rfd29yZF9sb2FkKHZvaWQpCit7CisJdnVfbG9uZyAqc2F2ZV9hZGRyID0gKHZ1X2xvbmcgKikoTVBDNVhYWF9TUkFNICsgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSk7CisJcmV0dXJuICpzYXZlX2FkZHI7Cit9CisjZW5kaWYgLyogQ09ORklHX1BPU1QgfHwgQ09ORklHX0xPR0JVRkZFUiAqLworCisKKyNpZmRlZiBDT05GSUdfTUlTQ19JTklUX1IKK2ludCBtaXNjX2luaXRfcih2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX0hBUkRfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19TT0ZUX0kyQykKKwl1Y2hhciBidWZbNl07CisJY2hhciBzdHJbMThdOworCWNoYXIgaG9zdG5hbWVbTU9EVUxFX05BTUVfTUFYTEVOXTsKKworCS8qIFJlYWQgZXRoYWRkciBmcm9tIEVFUFJPTSAqLworCWlmIChpMmNfcmVhZChDRkdfSTJDX0VFUFJPTSwgQ09ORklHX01BQ19PRkZTRVQsIDIsIGJ1ZiwgNikgPT0gMCkgeworCQlzcHJpbnRmKHN0ciwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKwkJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0pOworCQkvKiBDaGVjayBpZiBNQUMgYWRkciBpcyBvd25lZCBieSBTY2hpbmRsZXIgKi8KKwkJaWYgKHN0cnN0cihzdHIsICIwMDowNjpDMyIpICE9IHN0cikKKwkJCXByaW50ZihMT0dfUFJFRklYICJXYXJuaW5nIC0gSWxsZWdhbCBNQUMgYWRkcmVzcyAoJXMpIgorCQkJCSIgaW4gRUVQUk9NLlxuIiwgc3RyKTsKKwkJZWxzZSB7CisJCQlwcmludGYoTE9HX1BSRUZJWCAiVXNpbmcgTUFDICglcykgZnJvbSBJMkMgRUVQUk9NXG4iLAorCQkJCXN0cik7CisJCQlzZXRlbnYoImV0aGFkZHIiLCBzdHIpOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRmKExPR19QUkVGSVggIldhcm5pbmcgLSBVbmFibGUgdG8gcmVhZCBNQUMgZnJvbSBJMkMiCisJCQkiIGRldmljZSBhdCBhZGRyZXNzICUwMlg6JTA0WFxuIiwgQ0ZHX0kyQ19FRVBST00sCisJCQlDT05GSUdfTUFDX09GRlNFVCk7CisJfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0hBUkRfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19TT0ZUX0kyQykgKi8KKwlpZiAoIWdldGVudigiZXRoYWRkciIpKQorCQlwcmludGYoTE9HX1BSRUZJWCAiTUFDIGFkZHJlc3Mgbm90IHNldCwgbmV0d29ya2luZyBpcyBub3QgIgorCQkJCQkib3BlcmF0aW9uYWxcbiIpOworCisJLyogc2V0IHRoZSBob3N0bmFtZSBhcHByb3ByaWF0ZSB0byB0aGUgbW9kdWxlIHdlJ3JlIHJ1bm5pbmcgb24gKi8KKwljb21wb3NlX2hvc3RuYW1lKGh3X2lkLCBob3N0bmFtZSk7CisJc2V0ZW52KCJob3N0bmFtZSIsIGhvc3RuYW1lKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19NSVNDX0lOSVRfUiAqLworCisKKyNpZmRlZiBDT05GSUdfTEFTVF9TVEFHRV9JTklUCitpbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFCisJY201MjAwX2Z3dXBkYXRlKCk7CisjZW5kaWYgLyogQ09ORklHX1VTQl9TVE9SQUdFICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0xBU1RfU1RBR0VfSU5JVCAqLworCisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQordm9pZCBmdF9ib2FyZF9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKK3sKKwlmdF9jcHVfc2V0dXAoYmxvYiwgYmQpOworCWZ0X2Jsb2JfdXBkYXRlKGJsb2IsIGJkKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvY201MjAwL2NtNTIwMC5oIGIvYm9hcmQvY201MjAwL2NtNTIwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWE1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9jbTUyMDAvY201MjAwLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIEF1dGhvcjogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KKyAqIEF1dGhvcjogR3J6ZWdvcnogQmVybmFja2kgPGdqYkBzZW1paGFsZi5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfQ001MjAwX0gKKyNkZWZpbmUgX0NNNTIwMF9ICisKKworLyoKKyAqIERlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBtb2R1bGVzIG9mIHRoZSBjbTUyMDAgcGxhdGZvcm0uIE1vc3RseQorICogcmVsYXRlZCB0byByZWFkaW5nIHRoZSBoYXJkd2FyZSBpZGVudGlmaWNhdGlvbiBkYXRhIChIVyBJRCkgZnJvbSB0aGUgSTJDCisgKiBFRVBST00sIGRldGVjdGlvbiBvZiB0aGUgcGFydGljdWxhciBtb2R1bGUgd2UgYXJlIGV4ZWN1dGluZyBvbiwgYW5kCisgKiBhcHByb3ByaWF0ZSBTRFJBTSBjb250cm9sbGVyIGluaXRpYWxpemF0aW9uLgorICovCisKKworI2RlZmluZSBDTTUyMDBfVU5LTk9XTl9NT0RVTEUJMHhmZmZmZmZmZgorCitlbnVtIHsKKwlERVZJQ0VfTkFNRSwJCS8qIDAgKi8KKwlHRU5FUkFUSU9OLAkJLyogMSAqLworCVBDQl9OQU1FLAkJLyogMiAqLworCUZPUk0sCQkJLyogMyAqLworCVZFUlNJT04sCQkvKiA0ICovCisJSURFTlRJRklDQVRJT05fTlVNQkVSLAkvKiA1ICovCisJTUFKT1JfU1dfVkVSU0lPTiwJLyogNiAqLworCU1JTk9SX1NXX1ZFUlNJT04sCS8qIDcgKi8KKwkvKiBhZGQgbmV3IGFsZW1lbnRzIGFib3ZlIHRoaXMgbGluZSAqLworCUhXX0lEX0VMRU1fQ09VTlQJLyogY291bnQgKi8KK307CisKKy8qCisgKiBTZWN0LiA0LjEgIkNNMS5RL0NNVTEuUSBTdXBlcnZpc29yeSBNaWNyb2NvbnRyb2xsZXIgSW50ZXJmYWNlIERlZmluaXRpb24iCisgKi8KKworI2RlZmluZSBERVZJQ0VfTkFNRV9PRkZTRVQJCTB4MDIKKyNkZWZpbmUgR0VORVJBVElPTl9PRkZTRVQJCTB4MGIKKyNkZWZpbmUgUENCX05BTUVfT0ZGU0VUCQkJMHgwYworI2RlZmluZSBGT1JNX09GRlNFVAkJCTB4MTUKKyNkZWZpbmUgVkVSU0lPTl9PRkZTRVQJCQkweDE2CisjZGVmaW5lIElERU5USUZJQ0FUSU9OX05VTUJFUl9PRkZTRVQJMHgxOQorI2RlZmluZSBNQUpPUl9TV19WRVJTSU9OX09GRlNFVAkJMHgwNDgwCisjZGVmaW5lIE1JTk9SX1NXX1ZFUlNJT05fT0ZGU0VUCQkweDA0ODEKKworCisjZGVmaW5lIERFVklDRV9OQU1FX0xFTgkJCTB4MDkKKyNkZWZpbmUgR0VORVJBVElPTl9MRU4JCQkweDAxCisjZGVmaW5lIFBDQl9OQU1FX0xFTgkJCTB4MDkKKyNkZWZpbmUgRk9STV9MRU4JCQkweDAxCisjZGVmaW5lIFZFUlNJT05fTEVOCQkJMHgwMworI2RlZmluZSBJREVOVElGSUNBVElPTl9OVU1CRVJfTEVOCTB4MDkKKyNkZWZpbmUgTUFKT1JfU1dfVkVSU0lPTl9MRU4JCTB4MDEKKyNkZWZpbmUgTUlOT1JfU1dfVkVSU0lPTl9MRU4JCTB4MDEKKworI2RlZmluZSBIV19JRF9FTEVNX01BWExFTgkJMHgwOQkvKiBNQVgoWFhYX0xFTikgKi8KKworLyogZW50aXJlIEhXIElEIGluIEVFUFJPTSBpcyA2NCBieXRlcywgc28gbG9uZ2VyIG1vZHVsZSBuYW1lIGlzIHVubGlrZWx5ICovCisjZGVmaW5lIE1PRFVMRV9OQU1FX01BWExFTgkJNjQKKworCisvKiBzdG9yYWdlIGZvciBIVyBJRCByZWFkIGZyb20gRUVQUk9NICovCit0eXBlZGVmIGNoYXIgaHdfaWRfdFtIV19JRF9FTEVNX0NPVU5UXVtIV19JRF9FTEVNX01BWExFTl07CisKKworLyogSFcgSUQgbGF5b3V0IGluIEVFUFJPTSAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworfSBod19pZF9mb3JtYXRbSFdfSURfRUxFTV9DT1VOVF0gPSB7CisJe0RFVklDRV9OQU1FX09GRlNFVCwJCURFVklDRV9OQU1FX0xFTn0sCisJe0dFTkVSQVRJT05fT0ZGU0VULAkJR0VORVJBVElPTl9MRU59LAorCXtQQ0JfTkFNRV9PRkZTRVQsCQlQQ0JfTkFNRV9MRU59LAorCXtGT1JNX09GRlNFVCwJCQlGT1JNX0xFTn0sCisJe1ZFUlNJT05fT0ZGU0VULAkJVkVSU0lPTl9MRU59LAorCXtJREVOVElGSUNBVElPTl9OVU1CRVJfT0ZGU0VULAlJREVOVElGSUNBVElPTl9OVU1CRVJfTEVOfSwKKwl7TUFKT1JfU1dfVkVSU0lPTl9PRkZTRVQsCU1BSk9SX1NXX1ZFUlNJT05fTEVOfSwKKwl7TUlOT1JfU1dfVkVSU0lPTl9PRkZTRVQsCU1JTk9SX1NXX1ZFUlNJT05fTEVOfSwKK307CisKKworLyogSFcgSUQgZGF0YSBmb3VuZCBpbiBFRVBST00gb24gc3VwcG9ydGVkIG1vZHVsZXMgKi8KK3N0YXRpYyBjaGFyICpjbTFfcWFfaHdfaWRbSFdfSURfRUxFTV9DT1VOVF0gPSB7CisJIkNNIiwJCS8qIERFVklDRV9OQU1FICovCisJIjEiLAkJLyogR0VORVJBVElPTiAqLworCSJDTTEiLAkJLyogUENCX05BTUUgKi8KKwkiUSIsCQkvKiBGT1JNICovCisJIkEiLAkJLyogVkVSU0lPTiAqLworCSI1OTE4ODEiLAkvKiBJREVOVElGSUNBVElPTl9OVU1CRVIgKi8KKwkiIiwJCS8qIE1BSk9SX1NXX1ZFUlNJT04gKi8KKwkiIiwJCS8qIE1JTk9SX1NXX1ZFUlNJT04gKi8KK307CisKK3N0YXRpYyBjaGFyICpjbTExX3FhX2h3X2lkW0hXX0lEX0VMRU1fQ09VTlRdID0geworCSJDTSIsCQkvKiBERVZJQ0VfTkFNRSAqLworCSIxIiwJCS8qIEdFTkVSQVRJT04gKi8KKwkiQ00xMSIsCQkvKiBQQ0JfTkFNRSAqLworCSJRIiwJCS8qIEZPUk0gKi8KKwkiQSIsCQkvKiBWRVJTSU9OICovCisJIjU5NDIwMCIsCS8qIElERU5USUZJQ0FUSU9OX05VTUJFUiAqLworCSIiLAkJLyogTUFKT1JfU1dfVkVSU0lPTiAqLworCSIiLAkJLyogTUlOT1JfU1dfVkVSU0lPTiAqLworfTsKKworc3RhdGljIGNoYXIgKmNtdTFfcWFfaHdfaWRbSFdfSURfRUxFTV9DT1VOVF0gPSB7CisJIkNNVSIsCQkvKiBERVZJQ0VfTkFNRSAqLworCSIxIiwJCS8qIEdFTkVSQVRJT04gKi8KKwkiQ01VMSIsCQkvKiBQQ0JfTkFNRSAqLworCSJRIiwJCS8qIEZPUk0gKi8KKwkiQSIsCQkvKiBWRVJTSU9OICovCisJIjU5NDEyOCIsCS8qIElERU5USUZJQ0FUSU9OX05VTUJFUiAqLworCSIiLAkJLyogTUFKT1JfU1dfVkVSU0lPTiAqLworCSIiLAkJLyogTUlOT1JfU1dfVkVSU0lPTiAqLworfTsKKworCisvKiBsaXN0IG9mIGtub3duIG1vZHVsZXMgKi8KK3N0YXRpYyBjaGFyICoqaHdfaWRfbGlzdFtdID0geworCWNtMV9xYV9od19pZCwKKwljbTExX3FhX2h3X2lkLAorCWNtdTFfcWFfaHdfaWQsCit9OworCisvKiBpbmRpY2VzIHRvIHRoZSBhYm92ZSBsaXN0IC0ga2VlcCBpbiBzeW5jICovCitlbnVtIHsKKwlDTTFfUUEsCisJQ00xMV9RQSwKKwlDTVUxX1FBLAorfTsKKworCisvKiBpZGVudGlmeSBtb2R1bGVzIGJhc2VkIG9uIHRoZXNlIGh3IGlkIGVsZW1lbnRzICovCitzdGF0aWMgaW50IGh3X2lkX2lkZW50aWZ5W10gPSB7CisJUENCX05BTUUsCisJRk9STSwKKwlWRVJTSU9OLAorfTsKKworCisvKiBSZWdpc3RlcnMnIHNldHRpbmdzIGZvciBTRFJBTSBjb250cm9sbGVyIGludGlhbGl6YXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bG9uZyBtb2RlOworCXVsb25nIGNvbnRyb2w7CisJdWxvbmcgY29uZmlnMTsKKwl1bG9uZyBjb25maWcyOworfSBtZW1fY29uZl90OworCitzdGF0aWMgbWVtX2NvbmZfdCBrNHM1NjE2MzJFID0geworCTB4MDBDRDAwMDAsICAgICAgLyogQ0FTTCAzLCBidXJzdCBsZW5ndGggOCAqLworCTB4NTE0RjAwMDAsCisJMHhFMjMzMzkwMCwKKwkweDhFRTcwMDAwCit9OworCitzdGF0aWMgbWVtX2NvbmZfdCBtdDQ4bGMzMm0xNmEyID0geworCTB4MDBDRDAwMDAsICAgICAgLyogQ0FTTCAzLCBidXJzdCBsZW5ndGggOCAqLworCTB4NTE0RjAwMDAsCisJMHhEMjMyMjgwMCwKKwkweDhBRDcwMDAwCit9OworCitzdGF0aWMgbWVtX2NvbmZfdCogbWVtb3J5X2NvbmZpZ1tdID0geworCSZrNHM1NjE2MzJFLAorCSZtdDQ4bGMzMm0xNmEyCit9OworCisjZW5kaWYgLyogX0NNNTIwMF9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9jbTUyMDAvY21kX2NtNTIwMC5jIGIvYm9hcmQvY201MjAwL2NtZF9jbTUyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTNjMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY201MjAwL2NtZF9jbTUyMDAuYwpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBNYXJrdXMgS2FwcGVsZXIgPG1hcmt1cy5rYXBwZWxlckBvYmplY3R4cC5jb20+CisgKgorICogQWRhcHRlZCBmb3IgVS1Cb290IDEuMiBieSBQaW90ciBLcnVzenluc2tpIDxwcGtAc2VtaWhhbGYuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaW5jbHVkZSA8dXNiLmg+CisKKyNpZmRlZiBDT05GSUdfQ01EX0JTQgorCitpbnQgZG9faTJjKGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRlbXAsIHRlbXAxOworCisJcHJpbnRmKCJTdGFydGluZyBJMkMgVGVzdFxuIgorCQkiUGxlYXNlIHNldCBKdW1wZXI6XG5JMkMgU0RBIDItM1xuSTJDIFNDTCAyLTNcblxuIgorCQkiUGxlYXNlIHByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7CisJZ2V0YygpOworCisJdGVtcCA9IDB4ZjA7IC8qIHNldCBpbyAwLTQgYXMgb3V0cHV0ICovCisJaTJjX3dyaXRlKENGR19JMkNfSU8sIDMsIDEsICh1Y2hhciAqKSZ0ZW1wLCAxKTsKKworCXByaW50ZigiUHJlc3MgSTJDNC03LiBMRUQgSTJDMC0zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHN0YXRlXG5cbiIKKwkJIlByZXNzIGFueSBrZXkgdG8gc3RvcFxuXG4iKTsKKworCXdoaWxlICghdHN0YygpKSB7CisJCWkyY19yZWFkKENGR19JMkNfSU8sIDAsIDEsICh1Y2hhciAqKSZ0ZW1wLCAxKTsKKwkJdGVtcDEgPSAodGVtcCA+PiA0KSAmIDB4MDM7CisJCXRlbXAxIHw9ICh0ZW1wID4+IDMpICYgMHgwODsgLyogUzMwMiAtPiBMRUQzMDMgKi8KKwkJdGVtcDEgfD0gKHRlbXAgPj4gNSkgJiAweDA0OyAvKiBTMzAzIC0+IExFRDMwMiAqLworCQl0ZW1wID0gdGVtcDE7CisJCWkyY193cml0ZShDRkdfSTJDX0lPLCAxLCAxLCAodWNoYXIgKikmdGVtcCwgMSk7CisJfQorCWdldGMoKTsKKworCXJldHVybiAwOworfQorCitpbnQgZG9fdXNidGVzdChjaGFyICphcmd2W10pCit7CisJaW50IGk7CisJc3RhdGljIGludCB1c2Jfc3Rvcl9jdXJyX2RldiA9IC0xOyAvKiBjdXJyZW50IGRldmljZSAqLworCisJcHJpbnRmKCJTdGFydGluZyBVU0IgVGVzdFxuIgorCQkiUGxlYXNlIGluc2VydCBVU0IgTWVtbW9yeSBTdGlja1xuXG4iCisJCSJQbGVhc2UgcHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKKwlnZXRjKCk7CisKKwl1c2Jfc3RvcCgpOworCXByaW50ZigiKFJlKXN0YXJ0IFVTQi4uLlxuIik7CisJaSA9IHVzYl9pbml0KCk7CisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFCisJCS8qIHRyeSB0byByZWNvZ25pemUgc3RvcmFnZSBkZXZpY2VzIGltbWVkaWF0ZWx5ICovCisJCWlmIChpID49IDApCisJCQl1c2Jfc3Rvcl9jdXJyX2RldiA9IHVzYl9zdG9yX3NjYW4oMSk7CisjZW5kaWYgLyogQ09ORklHX1VTQl9TVE9SQUdFICovCisJaWYgKHVzYl9zdG9yX2N1cnJfZGV2ID49IDApCisJCXByaW50ZigiRm91bmQgVVNCIFN0b3JhZ2UgRGV2IGNvbnRpbnVlIHdpdGggVGVzdC4uLlxuIik7CisJZWxzZSB7CisJCXByaW50ZigiTm8gVVNCIFN0b3JhZ2UgRGV2aWNlIGRldGVjdGVkLi4gU3RvcCBUZXN0XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJdXNiX3N0b3JfaW5mbygpOworCisJcHJpbnRmKCJzdG9wcGluZyBVU0IuLlxuIik7CisJdXNiX3N0b3AoKTsKKworCXJldHVybiAwOworfQorCitpbnQgZG9fbGVkKGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IG1wYzV4eHhfZ3B0XzBfNyAqZ3B0ID0gKHN0cnVjdCBtcGM1eHh4X2dwdF8wXzcgKilNUEM1WFhYX0dQVDsKKworCXByaW50ZigiU3RhcnRpbmcgTEVEIFRlc3RcbiIKKwkJIlBsZWFzZSBzZXQgU3dpdGNoIFM1MDAgYWxsIG9mZlxuXG4iCisJCSJQbGVhc2UgcHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKKwlnZXRjKCk7CisKKwkvKiBjb25maWd1cmUgdGltZXIgMi0zIGZvciBzaW1wbGUgR1BJTyBvdXRwdXQgSGlnaCAqLworCWdwdC0+Z3B0Mi5lbXNyIHw9IDB4MDAwMDAwMzQ7CisJZ3B0LT5ncHQzLmVtc3IgfD0gMHgwMDAwMDAzNDsKKworCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fRU5BQkxFKSB8PSAweDgwMDAwMDAwOworCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fRElSKSB8PSAweDgwMDAwMDAwOworCXByaW50ZigiUGxlYXNlIHByZXNzIGFueSBrZXkgdG8gc3RvcFxuXG4iKTsKKwl3aGlsZSAoIXRzdGMoKSkgeworCQlpZiAoaSA9PSAxKSB7CisJCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfTykgfD0gMHg4MDAwMDAwMDsKKwkJCWdwdC0+Z3B0Mi5lbXNyICY9IH4weDAwMDAwMDEwOworCQkJZ3B0LT5ncHQzLmVtc3IgJj0gfjB4MDAwMDAwMTA7CisJCX0gZWxzZSBpZiAoaSA9PSAyKSB7CisJCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfTykgJj0gfjB4ODAwMDAwMDA7CisJCQlncHQtPmdwdDIuZW1zciAmPSB+MHgwMDAwMDAxMDsKKwkJCWdwdC0+Z3B0My5lbXNyIHw9IDB4MDAwMDAwMTA7CisJCX0gZWxzZSBpZiAoaSA+PSAzKSB7CisJCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfTykgJj0gfjB4ODAwMDAwMDA7CisJCQlncHQtPmdwdDMuZW1zciAmPSB+MHgwMDAwMDAxMDsKKwkJCWdwdC0+Z3B0Mi5lbXNyIHw9IDB4MDAwMDAwMTA7CisJCQlpID0gMDsKKwkJfQorCQlpKys7CisJCXVkZWxheSgyMDAwMDApOworCX0KKwlnZXRjKCk7CisKKwkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfTykgfD0gMHg4MDAwMDAwMDsKKwlncHQtPmdwdDIuZW1zciB8PSAweDAwMDAwMDEwOworCWdwdC0+Z3B0My5lbXNyIHw9IDB4MDAwMDAwMTA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX3JzMjMyKGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZXJyb3Jfc3RhdHVzID0gMDsKKwlzdHJ1Y3QgbXBjNXh4eF9ncGlvICpncGlvID0gKHN0cnVjdCBtcGM1eHh4X2dwaW8gKilNUEM1WFhYX0dQSU87CisJc3RydWN0IG1wYzV4eHhfcHNjICpwc2MxID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKU1QQzVYWFhfUFNDMTsKKworCS8qIENvbmZpZ3VyZSBQU0MgMi0zLTYgYXMgR1BJTyAqLworCWdwaW8tPnBvcnRfY29uZmlnICY9IDB4RkYwRkY4MEY7CisKKwlzd2l0Y2ggKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKSkgeworCWNhc2UgMToKKwkJLyogY2hlY2sgUlRTIDwtPiBDVFMgbG9vcCAqLworCQkvKiBzZXQgcnRzIHRvIDAgKi8KKwkJcHJpbnRmKCJVYXJ0IDEgdGVzdDogUlggVFggdGVzdGVkIGJ5IHVzaW5nIFUtQm9vdFxuIgorCQkJIlBsZWFzZSBjb25uZWN0IFJUUyB3aXRoIENUUyBvbiBVYXJ0MSBwbHVnXG5cbiIKKwkJCSJQcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOworCQlnZXRjKCk7CisKKwkJcHNjMS0+b3AxIHw9IDB4MDE7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJLyogY2hlY2sgc3RhdHVzIGF0IGN0cyAqLworCQlpZiAoKHBzYzEtPmlwICYgMHgwMSkgIT0gMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMzsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMSwgY3RzIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMClcbiIsCisJCQkJX19GVU5DVElPTl9fLCAocHNjMS0+aXAgJiAweDAxKSk7CisJCX0KKworCQkvKiBzZXQgcnRzIHRvIDEgKi8KKwkJcHNjMS0+b3AwIHw9IDB4MDE7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJLyogY2hlY2sgc3RhdHVzIGF0IGN0cyAqLworCQlpZiAoKHBzYzEtPmlwICYgMHgwMSkgIT0gMSkgeworCQkJZXJyb3Jfc3RhdHVzID0gMzsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMSwgY3RzIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMSlcbiIsCisJCQkJX19GVU5DVElPTl9fLCAocHNjMS0+aXAgJiAweDAxKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBzZXQgUFNDMl8wLCBQU0MyXzIgYXMgb3V0cHV0IGFuZCBQU0MyXzEsIFBTQzJfMyBhcyBpbnB1dCAqLworCQlwcmludGYoIlVhcnQgMiB0ZXN0OiBQbGVhc2UgdXNlIFJTMjMyIExvb3BiYWNrIHBsdWcgb24gVUFSVDJcbiIKKwkJCSJcblByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7CisJCWdldGMoKTsKKworCQlncGlvLT5zaW1wbGVfZ3Bpb2UgJj0gfigweDAwMDAwMEYwKTsKKwkJZ3Bpby0+c2ltcGxlX2dwaW9lIHw9IDB4MDAwMDAwRjA7CisJCWdwaW8tPnNpbXBsZV9kZHIgJj0gfigweDAwMDAwMEYwKTsKKwkJZ3Bpby0+c2ltcGxlX2RkciB8PSAweDAwMDAwMDUwOworCisJCS8qIGNoZWNrIFRYRCA8LT4gUlhEIGxvb3AgKi8KKwkJLyogc2V0IFRYRCB0byAxICovCisJCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgNCk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwMjApICE9IDB4MDAwMDAwMjApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDI7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzIsIHJ4ZCBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDAyMCkgPj4gNSk7CisJCX0KKworCQkvKiBzZXQgVFhEIHRvIDAgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgNCk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwMjApICE9IDB4MDAwMDAwMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDI7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzIsIHJ4ZCBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDAyMCkgPj4gNSk7CisJCX0KKworCQkvKiBjaGVjayBSVFMgPC0+IENUUyBsb29wICovCisJCS8qIHNldCBSVFMgdG8gMSAqLworCQlncGlvLT5zaW1wbGVfZHZvIHw9ICgxIDw8IDYpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDgwKSAhPSAweDAwMDAwMDgwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAzOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8yLCBjdHMgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAxKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwODApID4+IDcpOworCQl9CisKKwkJLyogc2V0IFJUUyB0byAwICovCisJCWdwaW8tPnNpbXBsZV9kdm8gJj0gfigxIDw8IDYpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDgwKSAhPSAweDAwMDAwMDAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAzOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8yLCBjdHMgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwODApID4+IDcpOworCQl9CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogc2V0IFBTQzNfMCwgUFNDM18yIGFzIG91dHB1dCBhbmQgUFNDM18xLCBQU0MzXzMgYXMgaW5wdXQgKi8KKwkJcHJpbnRmKCJVYXJ0IDMgdGVzdDogUGxlYXNlIHVzZSBSUzIzMiBMb29wYmFjayBwbHVnIG9uIFVBUlQyXG4iCisJCQkiXG5QcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOworCQlnZXRjKCk7CisKKwkJZ3Bpby0+c2ltcGxlX2dwaW9lICY9IH4oMHgwMDAwMEYwMCk7CisJCWdwaW8tPnNpbXBsZV9ncGlvZSB8PSAweDAwMDAwRjAwOworCisJCWdwaW8tPnNpbXBsZV9kZHIgJj0gfigweDAwMDAwRjAwKTsKKwkJZ3Bpby0+c2ltcGxlX2RkciB8PSAweDAwMDAwNTAwOworCisJCS8qIGNoZWNrIFRYRCA8LT4gUlhEIGxvb3AgKi8KKwkJLyogc2V0IFRYRCB0byAxICovCisJCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgOCk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAyMDApICE9IDB4MDAwMDAyMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDI7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzMsIHJ4ZCBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDIwMCkgPj4gOSk7CisJCX0KKworCQkvKiBzZXQgVFhEIHRvIDAgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgOCk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAyMDApICE9IDB4MDAwMDAwMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDI7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzMsIHJ4ZCBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDIwMCkgPj4gOSk7CisJCX0KKworCQkvKiBjaGVjayBSVFMgPC0+IENUUyBsb29wICovCisJCS8qIHNldCBSVFMgdG8gMSAqLworCQlncGlvLT5zaW1wbGVfZHZvIHw9ICgxIDw8IDEwKTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDgwMCkgIT0gMHgwMDAwMDgwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMzsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMywgY3RzIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMSlcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwODAwKSA+PiAxMSk7CisJCX0KKworCQkvKiBzZXQgUlRTIHRvIDAgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgMTApOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwODAwKSAhPSAweDAwMDAwMDAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAzOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8zLCBjdHMgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDA4MDApID4+IDExKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDQ6CisJCS8qIHNldCBQU0M2XzIsIFBTQzZfMyBhcyBvdXRwdXQgYW5kIFBTQzZfMCwgUFNDNl8xIGFzIGlucHV0ICovCisJCXByaW50ZigiVWFydCA0IHRlc3Q6IFBsZWFzZSB1c2UgUlMyMzIgTG9vcGJhY2sgcGx1ZyBvbiBVQVJUMlxuIgorCQkJIlxuUHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKKwkJZ2V0YygpOworCisJCWdwaW8tPnNpbXBsZV9ncGlvZSAmPSB+KDB4RjAwMDAwMDApOworCQlncGlvLT5zaW1wbGVfZ3Bpb2UgfD0gMHgzMDAwMDAwMDsKKworCQlncGlvLT5zaW1wbGVfZGRyICY9IH4oMHhmMDAwMDAwMCk7CisJCWdwaW8tPnNpbXBsZV9kZHIgfD0gMHgzMDAwMDAwMDsKKworCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0VOQUJMRSkgfD0gMHgzMDAwMDAwMDsKKwkJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19ESVIpICY9IH4oMHgzMDAwMDAwMCk7CisKKwkJLyogY2hlY2sgVFhEIDwtPiBSWEQgbG9vcCAqLworCQkvKiBzZXQgVFhEIHRvIDEgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byB8PSAoMSA8PCAyOCk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKCgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJiAweDEwMDAwMDAwKSAhPQorCQkJCTB4MTAwMDAwMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDI7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzQsIHJ4ZCBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmCisJCQkJCTB4MTAwMDAwMDApID4+IDI4KTsKKwkJfQorCisJCS8qIHNldCBUWEQgdG8gMCAqLworCQlncGlvLT5zaW1wbGVfZHZvICY9IH4oMSA8PCAyOCk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKCgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJiAweDEwMDAwMDAwKSAhPQorCQkJCTB4MDAwMDAwMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDI7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzQsIHJ4ZCBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmCisJCQkJCTB4MTAwMDAwMDApID4+IDI4KTsKKwkJfQorCisJCS8qIGNoZWNrIFJUUyA8LT4gQ1RTIGxvb3AgKi8KKwkJLyogc2V0IFJUUyB0byAxICovCisJCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgMjkpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYgMHgyMDAwMDAwMCkgIT0KKwkJCQkweDIwMDAwMDAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAzOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl80LCBjdHMgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAxKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCSgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJgorCQkJCQkweDIwMDAwMDAwKSA+PiAyOSk7CisJCX0KKworCQkvKiBzZXQgUlRTIHRvIDAgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgMjkpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYgMHgyMDAwMDAwMCkgIT0KKwkJCQkweDAwMDAwMDAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAzOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl80LCBjdHMgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCSgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJgorCQkJCQkweDIwMDAwMDAwKSA+PiAyOSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIlczogaW52YWxpZCByczIzMiBudW1iZXIgJXNcbiIsIF9fRlVOQ1RJT05fXywgYXJndlsyXSk7CisJCWVycm9yX3N0YXR1cyA9IDE7CisJCWJyZWFrOworCX0KKwlncGlvLT5wb3J0X2NvbmZpZyB8PSAoQ0ZHX0dQU19QT1JUX0NPTkZJRyAmIDB4RkYwRkY4MEYpOworCisJcmV0dXJuIGVycm9yX3N0YXR1czsKK30KKworaW50IGNtZF9ma3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHJjb2RlID0gLTE7CisKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDI6CisJCWlmIChzdHJuY21wKGFyZ3ZbMV0sICJpMmMiLCAzKSA9PSAwKQorCQkJcmNvZGUgPSBkb19pMmMoYXJndik7CisJCWVsc2UgaWYgKHN0cm5jbXAoYXJndlsxXSwgImxlZCIsIDMpID09IDApCisJCQlyY29kZSA9IGRvX2xlZChhcmd2KTsKKwkJZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCAidXNiIiwgMykgPT0gMCkKKwkJCXJjb2RlID0gZG9fdXNidGVzdChhcmd2KTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpZiAoc3RybmNtcChhcmd2WzFdLCAicnMyMzIiLCAzKSA9PSAwKQorCQkJcmNvZGUgPSBkb19yczIzMihhcmd2KTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChyY29kZSkgeworCWNhc2UgLTE6CisJCXByaW50ZigiVXNhZ2U6XG4iCisJCQkiZmt0IHsgaTJjIHwgbGVkIHwgdXNiIH1cbiIKKwkJCSJma3QgcnMyMzIgbnVtYmVyXG4iKTsKKwkJcmNvZGUgPSAxOworCQlicmVhazsKKwljYXNlIDA6CisJCXByaW50ZigiVGVzdCBwYXNzZWRcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlRlc3QgZmFpbGVkIHdpdGggY29kZTogJWRcbiIsIHJjb2RlKTsKKwl9CisKKwlyZXR1cm4gcmNvZGU7Cit9CisKK1VfQk9PVF9DTUQoCisJZmt0LAk0LAkxLAljbWRfZmt0LAorCSJma3QgICAgIC0gRnVuY3Rpb24gdGVzdCByb3V0aW5lc1xuIiwKKwkiaTJjXG4iCisJIiAgICAgLSBUZXN0IEkyQyBjb21tdW5pY2F0aW9uXG4iCisJImZrdCBsZWRcbiIKKwkiICAgICAtIFRlc3QgTEVEc1xuIgorCSJma3QgcnMyMzIgbnVtYmVyXG4iCisJIiAgICAgLSBUZXN0IFJTMjMyIChsb29wYmFjayBwbHVnKHMpIGZvciBSUzIzMiByZXF1aXJlZClcbiIKKwkiZmt0IHVzYlxuIgorCSIgICAgIC0gVGVzdCBVU0IgY29tbXVuaWNhdGlvblxuIgorKTsKKyNlbmRpZiAvKiBDT05GSUdfQ01EX0JTUCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvY201MjAwL2NvbmZpZy5tayBiL2JvYXJkL2NtNTIwMC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwNjEzOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NtNTIwMC9jb25maWcubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDcKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworVEVYVF9CQVNFID0gMHhmYzAwMDAwMAorCitQTEFURk9STV9DUFBGTEFHUyArPSAtRFRFWFRfQkFTRT0kKFRFWFRfQkFTRSkgLUkkKFRPUERJUikvYm9hcmQKZGlmZiAtLWdpdCBhL2JvYXJkL2NtNTIwMC9md3VwZGF0ZS5jIGIvYm9hcmQvY201MjAwL2Z3dXBkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhYTk0YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NtNTIwMC9md3VwZGF0ZS5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3IFNjaGluZGxlciBMaWZ0IEluYy4KKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogQXV0aG9yOiBNaWNoZWwgTWFydGkgPG1tYUBvYmplY3R4cC5jb20+CisgKiBBZGFwdGVkIGZvciBVLUJvb3QgMS4yIGJ5IFBpb3RyIEtydXN6eW5za2kgPHBwa0BzZW1paGFsZi5jb20+OgorICogICAtIGNvZGUgY2xlYW4tdXAKKyAqICAgLSBidWdmaXggZm9yIG92ZXJ3cml0aW5nIGJvb3RhcmdzIGJ5IHVzZXIKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisjaW5jbHVkZSA8dXNiLmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisKKyNpbmNsdWRlICJmd3VwZGF0ZS5oIgorCitleHRlcm4gaW50IGRvX2Jvb3RtKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOworZXh0ZXJuIGxvbmcgZG9fZmF0X3JlYWQoY29uc3QgY2hhciAqLCB2b2lkICosIHVuc2lnbmVkIGxvbmcsIGludCk7CitleHRlcm4gaW50IGRvX2ZhdF9mc2xvYWQoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CisKK3N0YXRpYyBpbnQgbG9hZF9yZXNjdWVfaW1hZ2UodWxvbmcpOworCit2b2lkIGNtNTIwMF9md3VwZGF0ZSh2b2lkKQoreworCWNtZF90YmxfdCAqYmNtZDsKKwljaGFyICpyc2FyZ3M7CisJY2hhciAqdG1wID0gTlVMTDsKKwljaGFyIGthWzE2XTsKKwljaGFyICphcmd2WzNdID0geyAiYm9vdG0iLCBrYSwgTlVMTCB9OworCisJLyogQ2hlY2sgaWYgcmVzY3VlIHN5c3RlbSBpcyBkaXNhYmxlZC4uLiAqLworCWlmIChnZXRlbnYoIm5vcmVzY3VlIikpIHsKKwkJcHJpbnRmKExPR19QUkVGSVggIlJlc2N1ZSBTeXN0ZW0gZGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBVU0Igc3RvcmFnZSBkZXZpY2UgYW5kIGxvYWQgaW1hZ2UgKi8KKwlpZiAobG9hZF9yZXNjdWVfaW1hZ2UoTE9BRF9BRERSKSkKKwkJcmV0dXJuOworCisJYmNtZCA9IGZpbmRfY21kKCJib290bSIpOworCWlmICghYmNtZCkKKwkJcmV0dXJuOworCisJc3ByaW50ZihrYSwgIiVseCIsIExPQURfQUREUik7CisKKwkvKiBwcmVwYXJlIG91ciBib290YXJncyAqLworCXJzYXJncyA9IGdldGVudigicnMtYXJncyIpOworCWlmICghcnNhcmdzKQorCQlyc2FyZ3MgPSBSU19CT09UQVJHUzsKKwllbHNlIHsKKwkJdG1wID0gbWFsbG9jKHN0cmxlbihyc2FyZ3MrMSkpOworCQlpZiAoIXRtcCkgeworCQkJcHJpbnRmKExPR19QUkVGSVggIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJc3RyY3B5KHRtcCwgcnNhcmdzKTsKKwkJcnNhcmdzID0gdG1wOworCX0KKworCXNldGVudigiYm9vdGFyZ3MiLCByc2FyZ3MpOworCisJaWYgKHJzYXJncyA9PSB0bXApCisJCWZyZWUocnNhcmdzKTsKKworCXByaW50ZihMT0dfUFJFRklYICJTdGFydGluZyB1cGRhdGUgc3lzdGVtIChib290YXJncz0lcykuLi5cbiIsIHJzYXJncyk7CisJZG9fYm9vdG0oYmNtZCwgMCwgMiwgYXJndik7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9yZXNjdWVfaW1hZ2UodWxvbmcgYWRkcikKK3sKKwlkaXNrX3BhcnRpdGlvbl90IGluZm87CisJaW50IGRldm5vOworCWludCBwYXJ0bm87CisJaW50IGk7CisJY2hhciBmd2Rpcls2NF07CisJY2hhciBueHJpWzEyOF07CisJY2hhciAqdG1wOworCWNoYXIgZGV2WzddOworCWNoYXIgYWRkcl9zdHJbMTZdOworCWNoYXIgKmFyZ3ZbNl0gPSB7ICJmYXRsb2FkIiwgInVzYiIsIGRldiwgYWRkcl9zdHIsIG54cmksIE5VTEwgfTsKKwlibG9ja19kZXZfZGVzY190ICpzdG9yX2RldiA9IE5VTEw7CisJY21kX3RibF90ICpiY21kOworCisJLyogR2V0IG5hbWUgb2YgZmlybXdhcmUgZGlyZWN0b3J5ICovCisJdG1wID0gZ2V0ZW52KCJmdy1kaXIiKTsKKworCS8qIENvcHkgaXQgaW50byBmd2RpciAqLworCXN0cm5jcHkoZndkaXIsIHRtcCA/IHRtcCA6IEZXX0RJUiwgc2l6ZW9mKGZ3ZGlyKSk7CisJZndkaXJbc2l6ZW9mKGZ3ZGlyKSAtIDFdID0gMDsgLyogVGVybWluYXRlIHN0cmluZyAqLworCisJcHJpbnRmKExPR19QUkVGSVggIkNoZWNraW5nIGZvciBmaXJtd2FyZSBpbWFnZSBkaXJlY3RvcnkgJyVzJyBvbiBVU0IiCisJCSIgc3RvcmFnZS4uLlxuIiwgZndkaXIpOworCXVzYl9zdG9wKCk7CisJaWYgKHVzYl9pbml0KCkgIT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKiBDaGVjayBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KKwlpZiAodXNiX3N0b3Jfc2NhbigxKSAhPSAwKSB7CisJCXVzYl9zdG9wKCk7CisJCXJldHVybiAxOworCX0KKworCS8qIERldGVjdCBzdG9yYWdlIGRldmljZSAqLworCWZvciAoZGV2bm8gPSAwOyBkZXZubyA8IFVTQl9NQVhfU1RPUl9ERVY7IGRldm5vKyspIHsKKwkJc3Rvcl9kZXYgPSB1c2Jfc3Rvcl9nZXRfZGV2KGRldm5vKTsKKwkJaWYgKHN0b3JfZGV2LT50eXBlICE9IERFVl9UWVBFX1VOS05PV04pCisJCQlicmVhazsKKwl9CisJaWYgKCFzdG9yX2RldiB8fCBzdG9yX2Rldi0+dHlwZSA9PSBERVZfVFlQRV9VTktOT1dOKSB7CisJCXByaW50ZihMT0dfUFJFRklYICJObyB2YWxpZCBzdG9yYWdlIGRldmljZSBmb3VuZC4uLlxuIik7CisJCXVzYl9zdG9wKCk7CisJCXJldHVybiAxOworCX0KKworCS8qIERldGVjdCBwYXJ0aXRpb24gKi8KKwlmb3IgKHBhcnRubyA9IC0xLCBpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvKHN0b3JfZGV2LCBpLCAmaW5mbykgPT0gMCkgeworCQkJaWYgKGZhdF9yZWdpc3Rlcl9kZXZpY2Uoc3Rvcl9kZXYsIGkpID09IDApIHsKKwkJCQkvKiBDaGVjayBpZiByZXNjdWUgaW1hZ2UgaXMgcHJlc2VudCAqLworCQkJCUZXX0RFQlVHKCJMb29raW5nIGZvciBmaXJtd2FyZSBkaXJlY3RvcnkgJyVzJyIKKwkJCQkJIiBvbiBwYXJ0aXRpb24gJWRcbiIsIGZ3ZGlyLCBpKTsKKwkJCQlpZiAoZG9fZmF0X3JlYWQoZndkaXIsIE5VTEwsIDAsIExTX05PKSA9PSAtMSkgeworCQkJCQlGV19ERUJVRygiTm8gTlggcmVzY3VlIGltYWdlIG9uICIKKwkJCQkJCSJwYXJ0aXRpb24gJWQuXG4iLCBpKTsKKwkJCQkJcGFydG5vID0gLTI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGFydG5vID0gaTsKKwkJCQkJRldfREVCVUcoIlBhcnRpdGlvbiAlZCBjb250YWlucyAiCisJCQkJCQkiZmlybXdhcmUgZGlyZWN0b3J5XG4iLCBwYXJ0bm8pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAocGFydG5vIDwgMCkgeworCQlzd2l0Y2ggKHBhcnRubykgeworCQljYXNlIC0xOgorCQkJcHJpbnRmKExPR19QUkVGSVggIkVycm9yOiBObyB2YWxpZCAoRkFUKSBwYXJ0aXRpb24gIgorCQkJCSJkZXRlY3RlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAtMjoKKwkJCXByaW50ZihMT0dfUFJFRklYICJFcnJvcjogTm8gTlggcmVzY3VlIGltYWdlIG9uIEZBVCAiCisJCQkJInBhcnRpdGlvblxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZihMT0dfUFJFRklYICJFcnJvcjogRmFpbGVkIHdpdGggY29kZSAlZFxuIiwKKwkJCQlwYXJ0bm8pOworCQl9CisJCXVzYl9zdG9wKCk7CisJCXJldHVybiAxOworCX0KKworCS8qIExvYWQgdGhlIHJlc2N1ZSBpbWFnZSAqLworCWJjbWQgPSBmaW5kX2NtZCgiZmF0bG9hZCIpOworCWlmICghYmNtZCkgeworCQlwcmludGYoTE9HX1BSRUZJWCAiRXJyb3IgLSAnZmF0bG9hZCcgY29tbWFuZCBub3QgcHJlc2VudC5cbiIpOworCQl1c2Jfc3RvcCgpOworCQlyZXR1cm4gMTsKKwl9CisKKwl0bXAgPSBnZXRlbnYoIm54LXJlc2N1ZS1pbWFnZSIpOworCXNwcmludGYobnhyaSwgIiVzLyVzIiwgZndkaXIsIHRtcCA/IHRtcCA6IFJFU0NVRV9JTUFHRSk7CisJc3ByaW50ZihkZXYsICIlZDolZCIsIGRldm5vLCBwYXJ0bm8pOworCXNwcmludGYoYWRkcl9zdHIsICIlbHgiLCBhZGRyKTsKKworCUZXX0RFQlVHKCJmYXRfZnNsb2FkIGRldmljZT0nJXMnLCBhZGRyPSclcycsIGZpbGU6ICVzXG4iLAorCQlkZXYsIGFkZHJfc3RyLCBueHJpKTsKKworCWlmIChkb19mYXRfZnNsb2FkKGJjbWQsIDAsIDUsIGFyZ3YpICE9IDApIHsKKwkJdXNiX3N0b3AoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU3RvcCBVU0IgKi8KKwl1c2Jfc3RvcCgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvY201MjAwL2Z3dXBkYXRlLmggYi9ib2FyZC9jbTUyMDAvZnd1cGRhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTNmMWUxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY201MjAwL2Z3dXBkYXRlLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBTY2hpbmRsZXIgTGlmdCBJbmMuCisgKgorICogQXV0aG9yOiBNaWNoZWwgTWFydGkgPG1tYUBvYmplY3R4cC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0ZXX1VQREFURV9ICisjZGVmaW5lIF9fRldfVVBEQVRFX0gKKworLyogRGVmYXVsdCBwcmVmaXggZm9yIG91dHB1dCBtZXNzYWdlcyAqLworI2RlZmluZSBMT0dfUFJFRklYCSJDTTUyMDA6IgorCisvKiBFeHRyYSBkZWJ1ZyBtYWNybyAqLworI2lmZGVmIENPTkZJR19GV1VQREFURV9ERUJVRworI2RlZmluZSBGV19ERUJVRyhmbXQuLi4pIHByaW50ZihMT0dfUFJFRklYIGZtdCkKKyNlbHNlCisjZGVmaW5lIEZXX0RFQlVHKGZtdC4uLikKKyNlbmRpZgorCisvKiBOYW1lIG9mIHRoZSBkaXJlY3RvcnkgaG9sZGluZyBmaXJtd2FyZSBpbWFnZXMgKi8KKyNkZWZpbmUgRldfRElSCQkibngtZnciCisjZGVmaW5lIFJFU0NVRV9JTUFHRQkibnhycy5pbWciCisjZGVmaW5lIExPQURfQUREUgkweDQwMDAwMAorI2RlZmluZSBSU19CT09UQVJHUwkicmFtZGlzaz04MTkySyIKKworLyogTWFpbiBmdW5jdGlvbiBmb3IgZnd1cGRhdGUgKi8KK3ZvaWQgY201MjAwX2Z3dXBkYXRlKHZvaWQpOworCisjZW5kaWYgLyogX19GV19VUERBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbW90aW9ucHJvL3UtYm9vdC5sZHMgYi9ib2FyZC9jbTUyMDAvdS1ib290LmxkcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYm9hcmQvbW90aW9ucHJvL3UtYm9vdC5sZHMKcmVuYW1lIHRvIGJvYXJkL2NtNTIwMC91LWJvb3QubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9jbWNfcHUyL01ha2VmaWxlIGIvYm9hcmQvY21jX3B1Mi9NYWtlZmlsZQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGQ0NDVmMjguLmY3YTEzNjAKLS0tIGEvYm9hcmQvY21jX3B1Mi9NYWtlZmlsZQorKysgYi9ib2FyZC9jbWNfcHUyL01ha2VmaWxlCkBAIC0yNSw3ICsyNSw3IEBACiAKIExJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKIAotQ09CSlMJOj0gY21jX3B1Mi5vIGF0NDUubyBmbGFzaC5vIGxvYWRfc2VybnVtX2V0aGFkZHIubworQ09CSlMJOj0gY21jX3B1Mi5vIGZsYXNoLm8gbG9hZF9zZXJudW1fZXRoYWRkci5vCiAKIFNSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvYm9hcmQvY21jX3B1Mi9hdDQ1LmMgYi9ib2FyZC9jbWNfcHUyL2F0NDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwMDEzMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9jbWNfcHUyL2F0NDUuYworKysgL2Rldi9udWxsCkBAIC0xLDYyMSArMCwwIEBACi0vKiBEcml2ZXIgZm9yIEFUTUVMIERhdGFGbGFzaCBzdXBwb3J0Ci0gKiBBdXRob3IgOiBIYW1pZCBJa2RvdW1pIChBdG1lbCkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGNvbW1vbi5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotCi0jaWZkZWYgQ09ORklHX0hBU19EQVRBRkxBU0gKLSNpbmNsdWRlIDxkYXRhZmxhc2guaD4KLQotI2RlZmluZSBBVDkxQ19TUElfQ0xLCTEwMDAwMDAwCS8qIE1heCBWYWx1ZSA9IDEwTUh6IHRvIGJlIGNvbXBsaWFudCB0bwotdGhlIENvbnRpbnVvdXMgQXJyYXkgUmVhZCBmdW5jdGlvbiAqLwotCi0vKiBBQyBDaGFyYWN0ZXJpc3RpY3MgKi8KLS8qIERMWUJTID0gdENTUyA9IDI1MG5zIG1pbiBhbmQgRExZQkNUID0gdENTSCA9IDI1MG5zICovCi0jZGVmaW5lIERBVEFGTEFTSF9UQ1NTCSgweEMgPDwgMTYpCi0jZGVmaW5lIERBVEFGTEFTSF9UQ0hTCSgweDEgPDwgMjQpCi0KLSNkZWZpbmUgQVQ5MUNfVElNRU9VVF9XUkRZCQkJMjAwMDAwCi0jZGVmaW5lIEFUOTFDX1NQSV9QQ1MwX1NFUklBTF9EQVRBRkxBU0gJCTB4RSAgICAgLyogQ2hpcCBTZWxlY3QgMCA6IE5QQ1MwICUxMTEwICovCi0jZGVmaW5lIEFUOTFDX1NQSV9QQ1MzX0RBVEFGTEFTSF9DQVJECQkweDcgICAgIC8qIENoaXAgU2VsZWN0IDMgOiBOUENTMyAlMDExMSAqLwotCi12b2lkIEFUOTFGX1NwaUluaXQodm9pZCkgewotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoJU1BJIERhdGFGbGFzaCBJbml0CQkJCQkJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkvKiBDb25maWd1cmUgUElPcyAqLwotCUFUOTFDX0JBU0VfUElPQS0+UElPX0FTUiA9IEFUOTFDX1BBM19OUENTMCB8IEFUOTFDX1BBNF9OUENTMSB8IEFUOTFDX1BBMV9NT1NJIHwgQVQ5MUNfUEE1X05QQ1MyIHwKLQkJCQkgICBBVDkxQ19QQTZfTlBDUzMgfCBBVDkxQ19QQTBfTUlTTyB8IEFUOTFDX1BBMl9TUENLOwotCUFUOTFDX0JBU0VfUElPQS0+UElPX1BEUiA9IEFUOTFDX1BBM19OUENTMCB8IEFUOTFDX1BBNF9OUENTMSB8IEFUOTFDX1BBMV9NT1NJIHwgQVQ5MUNfUEE1X05QQ1MyIHwKLQkJCQkgICBBVDkxQ19QQTZfTlBDUzMgfCBBVDkxQ19QQTBfTUlTTyB8IEFUOTFDX1BBMl9TUENLOwotCS8qIEVuYWJsZSBDTG9jayAqLwotCUFUOTFDX0JBU0VfUE1DLT5QTUNfUENFUiA9IDEgPDwgQVQ5MUNfSURfU1BJOwotCi0JLyogUmVzZXQgdGhlIFNQSSAqLwotCUFUOTFDX0JBU0VfU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1dSU1Q7Ci0KLQkvKiBDb25maWd1cmUgU1BJIGluIE1hc3RlciBNb2RlIHdpdGggTm8gQ1Mgc2VsZWN0ZWQgISEhICovCi0JQVQ5MUNfQkFTRV9TUEktPlNQSV9NUiA9IEFUOTFDX1NQSV9NU1RSIHwgQVQ5MUNfU1BJX01PREZESVMgfCBBVDkxQ19TUElfUENTOwotCi0JLyogQ29uZmlndXJlIENTMCBhbmQgQ1MzICovCi0JKihBVDkxQ19TUElfQ1NSICsgMCkgPSBBVDkxQ19TUElfQ1BPTCB8IChBVDkxQ19TUElfRExZQlMgJiBEQVRBRkxBU0hfVENTUykgfCAoQVQ5MUNfU1BJX0RMWUJDVCAmCi0JREFUQUZMQVNIX1RDSFMpIHwgKChBVDkxQ19NQVNURVJfQ0xPQ0sgLyAoMipBVDkxQ19TUElfQ0xLKSkgPDwgOCk7Ci0KLQkqKEFUOTFDX1NQSV9DU1IgKyAzKSA9IEFUOTFDX1NQSV9DUE9MIHwgKEFUOTFDX1NQSV9ETFlCUyAmIERBVEFGTEFTSF9UQ1NTKSB8IChBVDkxQ19TUElfRExZQkNUICYKLQlEQVRBRkxBU0hfVENIUykgfCAoKEFUOTFDX01BU1RFUl9DTE9DSyAvICgyKkFUOTFDX1NQSV9DTEspKSA8PCA4KTsKLQotfQotCi12b2lkIEFUOTFGX1NwaUVuYWJsZShpbnQgY3MpIHsKLQlzd2l0Y2goY3MpIHsKLQljYXNlIDA6CS8qIENvbmZpZ3VyZSBTUEkgQ1MwIGZvciBTZXJpYWwgRGF0YUZsYXNoIEFUNDVEQnh4ICovCi0JCUFUOTFDX0JBU0VfU1BJLT5TUElfTVIgJj0gMHhGRkYwRkZGRjsKLQkJQVQ5MUNfQkFTRV9TUEktPlNQSV9NUiB8PSAoKEFUOTFDX1NQSV9QQ1MwX1NFUklBTF9EQVRBRkxBU0g8PDE2KSAmIEFUOTFDX1NQSV9QQ1MpOwotCQlicmVhazsKLQljYXNlIDM6CS8qIENvbmZpZ3VyZSBTUEkgQ1MzIGZvciBTZXJpYWwgRGF0YUZsYXNoIENhcmQgKi8KLQkJLyogU2V0IHVwIFBJTyBTRENfVFlQRSB0byBzd2l0Y2ggb24gRGF0YUZsYXNoIENhcmQgYW5kIG5vdCBNTUMvU0RDYXJkICovCi0JCUFUOTFDX0JBU0VfUElPQi0+UElPX1BFUiA9IEFUOTFDX1BJT19QQjc7CS8qIFNldCBpbiBQSU8gbW9kZSAqLwotCQlBVDkxQ19CQVNFX1BJT0ItPlBJT19PRVIgPSBBVDkxQ19QSU9fUEI3OwkvKiBDb25maWd1cmUgaW4gb3V0cHV0ICovCi0JCS8qIENsZWFyIE91dHB1dCAqLwotCQlBVDkxQ19CQVNFX1BJT0ItPlBJT19DT0RSID0gQVQ5MUNfUElPX1BCNzsKLQkJLyogQ29uZmlndXJlIFBDUyAqLwotCQlBVDkxQ19CQVNFX1NQSS0+U1BJX01SICY9IDB4RkZGMEZGRkY7Ci0JCUFUOTFDX0JBU0VfU1BJLT5TUElfTVIgfD0gKChBVDkxQ19TUElfUENTM19EQVRBRkxBU0hfQ0FSRDw8MTYpICYgQVQ5MUNfU1BJX1BDUyk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFNQSV9FbmFibGUgKi8KLQlBVDkxQ19CQVNFX1NQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NQSUVOOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogXGZuICAgIEFUOTFGX1NwaVdyaXRlCQkJCQkJICAgICAgKi8KLS8qIFxicmllZiBTZXQgdGhlIFBEQyByZWdpc3RlcnMgZm9yIGEgdHJhbnNmZXJ0CQkJCSAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdW5zaWduZWQgaW50IEFUOTFGX1NwaVdyaXRlICggQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MgKQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0OwotCi0JcERlc2MtPnN0YXRlID0gQlVTWTsKLQotCUFUOTFDX0JBU0VfU1BJLT5TUElfUFRDUiA9IEFUOTFDX1BEQ19UWFRESVMgKyBBVDkxQ19QRENfUlhURElTOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgVHJhbnNtaXQgYW5kIFJlY2VpdmUgUG9pbnRlciAqLwotCUFUOTFDX0JBU0VfU1BJLT5TUElfUlBSID0gKHVuc2lnbmVkIGludClwRGVzYy0+cnhfY21kX3B0IDsKLQlBVDkxQ19CQVNFX1NQSS0+U1BJX1RQUiA9ICh1bnNpZ25lZCBpbnQpcERlc2MtPnR4X2NtZF9wdCA7Ci0KLQkvKiBJbnRpYWxpemUgdGhlIFRyYW5zbWl0IGFuZCBSZWNlaXZlIENvdW50ZXJzICovCi0JQVQ5MUNfQkFTRV9TUEktPlNQSV9SQ1IgPSBwRGVzYy0+cnhfY21kX3NpemU7Ci0JQVQ5MUNfQkFTRV9TUEktPlNQSV9UQ1IgPSBwRGVzYy0+dHhfY21kX3NpemU7Ci0KLQlpZiAoIHBEZXNjLT50eF9kYXRhX3NpemUgIT0gMCApIHsKLQkJLyogSW5pdGlhbGl6ZSB0aGUgTmV4dCBUcmFuc21pdCBhbmQgTmV4dCBSZWNlaXZlIFBvaW50ZXIgKi8KLQkJQVQ5MUNfQkFTRV9TUEktPlNQSV9STlBSID0gKHVuc2lnbmVkIGludClwRGVzYy0+cnhfZGF0YV9wdCA7Ci0JCUFUOTFDX0JBU0VfU1BJLT5TUElfVE5QUiA9ICh1bnNpZ25lZCBpbnQpcERlc2MtPnR4X2RhdGFfcHQgOwotCi0JCS8qIEludGlhbGl6ZSB0aGUgTmV4dCBUcmFuc21pdCBhbmQgTmV4dCBSZWNlaXZlIENvdW50ZXJzICovCi0JCUFUOTFDX0JBU0VfU1BJLT5TUElfUk5DUiA9IHBEZXNjLT5yeF9kYXRhX3NpemUgOwotCQlBVDkxQ19CQVNFX1NQSS0+U1BJX1ROQ1IgPSBwRGVzYy0+dHhfZGF0YV9zaXplIDsKLQl9Ci0KLQkvKiBhcm0gc2ltcGxlLCBub24gaW50ZXJydXB0IGRlcGVuZGVudCB0aW1lciAqLwotCXJlc2V0X3RpbWVyX21hc2tlZCgpOwotCXRpbWVvdXQgPSAwOwotCi0JQVQ5MUNfQkFTRV9TUEktPlNQSV9QVENSID0gQVQ5MUNfUERDX1RYVEVOICsgQVQ5MUNfUERDX1JYVEVOOwotCXdoaWxlKCEoQVQ5MUNfQkFTRV9TUEktPlNQSV9TUiAmIEFUOTFDX1NQSV9SWEJVRkYpICYmICgodGltZW91dCA9IGdldF90aW1lcl9tYXNrZWQoKSApIDwgQ0ZHX1NQSV9XUklURV9UT1VUKSk7Ci0JQVQ5MUNfQkFTRV9TUEktPlNQSV9QVENSID0gQVQ5MUNfUERDX1RYVERJUyArIEFUOTFDX1BEQ19SWFRESVM7Ci0JcERlc2MtPnN0YXRlID0gSURMRTsKLQotCWlmICh0aW1lb3V0ID49IENGR19TUElfV1JJVEVfVE9VVCl7Ci0JCXByaW50ZigiRXJyb3IgVGltZW91dFxuXHIiKTsKLQkJcmV0dXJuIERBVEFGTEFTSF9FUlJPUjsKLQl9Ci0KLQlyZXR1cm4gREFUQUZMQVNIX09LOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBcZm4gICAgQVQ5MUZfRGF0YUZsYXNoU2VuZENvbW1hbmQJCQkJCSovCi0vKiBcYnJpZWYgR2VuZXJpYyBmdW5jdGlvbiB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgZGF0YWZsYXNoCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZCgKLQlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCi0JdW5zaWduZWQgY2hhciBPcENvZGUsCi0JdW5zaWduZWQgaW50IENtZFNpemUsCi0JdW5zaWduZWQgaW50IERhdGFmbGFzaEFkZHJlc3MpCi17Ci0gICAgdW5zaWduZWQgaW50IGFkcjsKLQotCWlmICggKHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5zdGF0ZSkgIT0gSURMRSkKLQkJcmV0dXJuIERBVEFGTEFTSF9CVVNZOwotCi0JLyogcHJvY2VzcyB0aGUgYWRkcmVzcyB0byBvYnRhaW4gcGFnZSBhZGRyZXNzIGFuZCBieXRlIGFkZHJlc3MgKi8KLQlhZHIgPSAoKERhdGFmbGFzaEFkZHJlc3MgLyAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkpIDw8IHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2Vfb2Zmc2V0KSArIChEYXRhZmxhc2hBZGRyZXNzICUgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKTsKLQotCS8qIGZpbGwgdGhlICBjb21tYW5kICBidWZmZXIgKi8KLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFswXSA9IE9wQ29kZTsKLQlpZiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyID49IDE2Mzg0KSB7Ci0JCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzFdID0gKHVuc2lnbmVkIGNoYXIpKChhZHIgJiAweDBGMDAwMDAwKSA+PiAyNCk7Ci0JCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzJdID0gKHVuc2lnbmVkIGNoYXIpKChhZHIgJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0JCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzNdID0gKHVuc2lnbmVkIGNoYXIpKChhZHIgJiAweDAwMDBGRjAwKSA+PiA4KTsKLQkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNF0gPSAodW5zaWduZWQgY2hhcikoYWRyICYgMHgwMDAwMDBGRik7Ci0JfSBlbHNlIHsKLQkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMV0gPSAodW5zaWduZWQgY2hhcikoKGFkciAmIDB4MDBGRjAwMDApID4+IDE2KTsKLQkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPSAodW5zaWduZWQgY2hhcikoKGFkciAmIDB4MDAwMEZGMDApID4+IDgpOwotCQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFszXSA9ICh1bnNpZ25lZCBjaGFyKShhZHIgJiAweDAwMDAwMEZGKSA7Ci0JCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzRdID0gMDsKLQl9Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNV0gPSAwOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzZdID0gMDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFs3XSA9IDA7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBTcGlEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHNwaSB3cml0ZSBmdWN0aW9uICovCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2NtZF9wdCAgID0gIHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kIDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfY21kX3NpemUgPSAgQ21kU2l6ZSA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2NtZF9wdCAgID0gIHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kIDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+cnhfY21kX3NpemUgPSAgQ21kU2l6ZSA7Ci0KLQkvKiBzZW5kIHRoZSBjb21tYW5kIGFuZCByZWFkIHRoZSBkYXRhICovCi0JcmV0dXJuIEFUOTFGX1NwaVdyaXRlIChwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYyk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFxmbiAgICBBVDkxRl9EYXRhRmxhc2hHZXRTdGF0dXMJCQkJCSovCi0vKiBcYnJpZWYgUmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBkYXRhZmxhc2gJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hHZXRTdGF0dXMoQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MpCi17Ci0JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIHN0YXR1czsKLQotCS8qIGlmIGEgdHJhbnNmZXJ0IGlzIGluIHByb2dyZXNzID09PiByZXR1cm4gMCAqLwotCWlmKCAocERlc2MtPnN0YXRlKSAhPSBJRExFKQotCQlyZXR1cm4gREFUQUZMQVNIX0JVU1k7Ci0KLQkvKiBmaXJzdCBzZW5kIHRoZSByZWFkIHN0YXR1cyBjb21tYW5kIChEN0gpICovCi0JcERlc2MtPmNvbW1hbmRbMF0gPSBEQl9TVEFUVVM7Ci0JcERlc2MtPmNvbW1hbmRbMV0gPSAwOwotCi0JcERlc2MtPkRhdGFGbGFzaF9zdGF0ZSAgPSBHRVRfU1RBVFVTOwotCXBEZXNjLT50eF9kYXRhX3NpemUgCT0gMCA7CS8qIFRyYW5zbWl0IHRoZSBjb21tYW5kIGFuZCByZWNlaXZlIHJlc3BvbnNlICovCi0JcERlc2MtPnR4X2NtZF9wdCAJCT0gcERlc2MtPmNvbW1hbmQgOwotCXBEZXNjLT5yeF9jbWRfcHQgCQk9IHBEZXNjLT5jb21tYW5kIDsKLQlwRGVzYy0+cnhfY21kX3NpemUgCQk9IDIgOwotCXBEZXNjLT50eF9jbWRfc2l6ZSAJCT0gMiA7Ci0Jc3RhdHVzID0gQVQ5MUZfU3BpV3JpdGUgKHBEZXNjKTsKLQotCXBEZXNjLT5EYXRhRmxhc2hfc3RhdGUgPSAqKCAodW5zaWduZWQgY2hhciAqKSAocERlc2MtPnJ4X2NtZF9wdCkgKzEpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogXGZuICAgIEFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeQkJCQkJKi8KLS8qIFxicmllZiB3YWl0IGZvciBkYXRhZmxhc2ggcmVhZHkgKGJpdDcgb2YgdGhlIHN0YXR1cyByZWdpc3RlciA9PSAxKQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkoQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERhdGFGbGFzaERlc2MsIHVuc2lnbmVkIGludCB0aW1lb3V0KQotewotCXBEYXRhRmxhc2hEZXNjLT5EYXRhRmxhc2hfc3RhdGUgPSBJRExFOwotCi0JZG8gewotCQlBVDkxRl9EYXRhRmxhc2hHZXRTdGF0dXMocERhdGFGbGFzaERlc2MpOwotCQl0aW1lb3V0LS07Ci0JfSB3aGlsZSggKChwRGF0YUZsYXNoRGVzYy0+RGF0YUZsYXNoX3N0YXRlICYgMHg4MCkgIT0gMHg4MCkgJiYgKHRpbWVvdXQgPiAwKSApOwotCi0JaWYoKHBEYXRhRmxhc2hEZXNjLT5EYXRhRmxhc2hfc3RhdGUgJiAweDgwKSAhPSAweDgwKQotCQlyZXR1cm4gREFUQUZMQVNIX0VSUk9SOwotCi0JcmV0dXJuIERBVEFGTEFTSF9PSzsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfRGF0YUZsYXNoQ29udGludW91c1JlYWQgCQkJCSovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogQ29udGludW91cyBzdHJlYW0gUmVhZCAJCQkJKi8KLS8qIElucHV0IFBhcmFtZXRlcnMgICAgOiBEYXRhRmxhc2ggU2VydmljZQkJCQkJKi8KLS8qCQkJCQkJOiA8c3JjPiA9IGRhdGFmbGFzaCBhZGRyZXNzCSovCi0vKiAgICAgICAgICAgICAgICAgICAgIDogPCpkYXRhQnVmZmVyPiA9IGRhdGEgYnVmZmVyIHBvaW50ZXIJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxzaXplVG9SZWFkPiA9IGRhdGEgYnVmZmVyIHNpemUJCQkqLwotLyogUmV0dXJuIHZhbHVlCQk6IFN0YXRlIG9mIHRoZSBkYXRhZmxhc2gJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hDb250aW51b3VzUmVhZCAoCi0JQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAotCWludCBzcmMsCi0JdW5zaWduZWQgY2hhciAqZGF0YUJ1ZmZlciwKLQlpbnQgc2l6ZVRvUmVhZCApCi17Ci0JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIHN0YXR1czsKLQkvKiBUZXN0IHRoZSBzaXplIHRvIHJlYWQgaW4gdGhlIGRldmljZSAqLwotCWlmICggKHNyYyArIHNpemVUb1JlYWQpID4gKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUgKiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyKSkpCi0JCXJldHVybiBEQVRBRkxBU0hfTUVNT1JZX09WRVJGTE9XOwotCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2RhdGFfcHQgPSBkYXRhQnVmZmVyOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9kYXRhX3NpemUgPSBzaXplVG9SZWFkOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3B0ID0gZGF0YUJ1ZmZlcjsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfZGF0YV9zaXplID0gc2l6ZVRvUmVhZDsKLQotCXN0YXR1cyA9IEFUOTFGX0RhdGFGbGFzaFNlbmRDb21tYW5kIChwRGF0YUZsYXNoLCBEQl9DT05USU5VT1VTX0FSUkFZX1JFQUQsIDgsIHNyYyk7Ci0JLyogU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgZGF0YWZsYXNoICovCi0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFGbGFzaFBhZ2VQZ21CdWYJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBNYWluIG1lbW9yeSBwYWdlIHByb2dyYW0gdGhyb3VnaCBidWZmZXIgMSBvciBidWZmZXIgMgkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCQkqLwotLyoJCQkJCQk6IDwqc3JjPiA9IFNvdXJjZSBidWZmZXIJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiA8ZGVzdD4gPSBkYXRhZmxhc2ggZGVzdGluYXRpb24gYWRkcmVzcwkJCSovCi0vKiAgICAgICAgICAgICAgICAgICAgIDogPFNpemVUb1dyaXRlPiA9IGRhdGEgYnVmZmVyIHNpemUJCQkqLwotLyogUmV0dXJuIHZhbHVlCQk6IFN0YXRlIG9mIHRoZSBkYXRhZmxhc2gJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hQYWdlUGdtQnVmKAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyICpzcmMsCi0JdW5zaWduZWQgaW50IGRlc3QsCi0JdW5zaWduZWQgaW50IFNpemVUb1dyaXRlKQotewotCWludCBjbWRzaXplOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3B0ID0gc3JjIDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfZGF0YV9zaXplID0gU2l6ZVRvV3JpdGUgOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9kYXRhX3B0ID0gc3JjOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9kYXRhX3NpemUgPSBTaXplVG9Xcml0ZTsKLQotCWNtZHNpemUgPSA0OwotCS8qIFNlbmQgdGhlIGNvbW1hbmQgdG8gdGhlIGRhdGFmbGFzaCAqLwotCWlmIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIgPj0gMTYzODQpCi0JCWNtZHNpemUgPSA1OwotCXJldHVybihBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZCAocERhdGFGbGFzaCwgREJfUEFHRV9QR01fQlVGMSwgY21kc2l6ZSwgZGVzdCkpOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9NYWluTWVtb3J5VG9CdWZmZXJUcmFuc2ZlcnQJCQkqLwotLyogT2JqZWN0ICAgICAgICAgICAgICA6IFJlYWQgYSBwYWdlIGluIHRoZSBTUkFNIEJ1ZmZlciAxIG9yIDIJCQkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IFBhZ2UgY29uY2VybmVkCQkJCQkJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiAJCQkJCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfTWFpbk1lbW9yeVRvQnVmZmVyVHJhbnNmZXJ0KAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyIEJ1ZmZlckNvbW1hbmQsCi0JdW5zaWduZWQgaW50IHBhZ2UpCi17Ci0JaW50IGNtZHNpemU7Ci0JLyogVGVzdCBpZiB0aGUgYnVmZmVyIGNvbW1hbmQgaXMgbGVnYWwgKi8KLQlpZiAoKEJ1ZmZlckNvbW1hbmQgIT0gREJfUEFHRV8yX0JVRjFfVFJGKSAmJiAoQnVmZmVyQ29tbWFuZCAhPSBEQl9QQUdFXzJfQlVGMl9UUkYpKQotCQlyZXR1cm4gREFUQUZMQVNIX0JBRF9DT01NQU5EOwotCi0JLyogbm8gZGF0YSB0byB0cmFuc21pdCBvciByZWNlaXZlICovCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfc2l6ZSA9IDA7Ci0JY21kc2l6ZSA9IDQ7Ci0JaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkKLQkJY21kc2l6ZSA9IDU7Ci0JcmV0dXJuKEFUOTFGX0RhdGFGbGFzaFNlbmRDb21tYW5kIChwRGF0YUZsYXNoLCBCdWZmZXJDb21tYW5kLCBjbWRzaXplLCBwYWdlKnBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfRGF0YUZsYXNoV3JpdGVCdWZmZXIJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBXcml0ZSBkYXRhIHRvIHRoZSBpbnRlcm5hbCBzcmFtIGJ1ZmZlciAxIG9yIDIJCSovCi0vKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogRGF0YUZsYXNoIFNlcnZpY2UJCQkJCSovCi0vKgkJCTogPEJ1ZmZlckNvbW1hbmQ+ID0gY29tbWFuZCB0byB3cml0ZSBidWZmZXIxIG9yIGJ1ZmZlcjIJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiA8KmRhdGFCdWZmZXI+ID0gZGF0YSBidWZmZXIgdG8gd3JpdGUJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxidWZmZXJBZGRyZXNzPiA9IGFkZHJlc3MgaW4gdGhlIGludGVybmFsIGJ1ZmZlcgkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxTaXplVG9Xcml0ZT4gPSBkYXRhIGJ1ZmZlciBzaXplCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoV3JpdGVCdWZmZXIgKAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyIEJ1ZmZlckNvbW1hbmQsCi0JdW5zaWduZWQgY2hhciAqZGF0YUJ1ZmZlciwKLQl1bnNpZ25lZCBpbnQgYnVmZmVyQWRkcmVzcywKLQlpbnQgU2l6ZVRvV3JpdGUgKQotewotCWludCBjbWRzaXplOwotCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGxlZ2FsICovCi0JaWYgKChCdWZmZXJDb21tYW5kICE9IERCX0JVRjFfV1JJVEUpICYmIChCdWZmZXJDb21tYW5kICE9IERCX0JVRjJfV1JJVEUpKQotCQlyZXR1cm4gREFUQUZMQVNIX0JBRF9DT01NQU5EOwotCi0JLyogYnVmZmVyIGFkZHJlc3MgbXVzdCBiZSBsb3dlciB0aGFuIHBhZ2Ugc2l6ZSAqLwotCWlmIChidWZmZXJBZGRyZXNzID4gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkKLQkJcmV0dXJuIERBVEFGTEFTSF9CQURfQUREUkVTUzsKLQotCWlmICggKHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5zdGF0ZSkgICE9IElETEUpCi0JCXJldHVybiBEQVRBRkxBU0hfQlVTWTsKLQotCS8qIFNlbmQgZmlyc3QgV3JpdGUgQ29tbWFuZCAqLwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzBdID0gQnVmZmVyQ29tbWFuZDsKLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFsxXSA9IDA7Ci0JaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkgewotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPSAwOwotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbM10gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpKGJ1ZmZlckFkZHJlc3MgJiAgcERhdGFGbGFzaC0+cERldmljZS0+Ynl0ZV9tYXNrKSkgPj4gOCkgOwotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNF0gPSAodW5zaWduZWQgY2hhcikoKHVuc2lnbmVkIGludClidWZmZXJBZGRyZXNzICAmIDB4MDBGRikgOwotCQljbWRzaXplID0gNTsKLQl9IGVsc2UgewotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpKGJ1ZmZlckFkZHJlc3MgJiAgcERhdGFGbGFzaC0+cERldmljZS0+Ynl0ZV9tYXNrKSkgPj4gOCkgOwotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbM10gPSAodW5zaWduZWQgY2hhcikoKHVuc2lnbmVkIGludClidWZmZXJBZGRyZXNzICAmIDB4MDBGRikgOwotCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNF0gPSAwOwotCQljbWRzaXplID0gNDsKLQl9Ci0KLQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfY21kX3B0IAkgPSBwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZCA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2NtZF9zaXplID0gY21kc2l6ZSA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2NtZF9wdCAJID0gcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmQgOwotCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9jbWRfc2l6ZSA9IGNtZHNpemUgOwotCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2RhdGFfcHQgCT0gZGF0YUJ1ZmZlciA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfcHQgCT0gZGF0YUJ1ZmZlciA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2RhdGFfc2l6ZSAJPSBTaXplVG9Xcml0ZSA7Ci0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfc2l6ZSAJPSBTaXplVG9Xcml0ZSA7Ci0KLQlyZXR1cm4gQVQ5MUZfU3BpV3JpdGUocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfUGFnZUVyYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogRXJhc2UgYSBwYWdlIAkJCQkJCSovCi0vKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogRGF0YUZsYXNoIFNlcnZpY2UJCQkJCSovCi0vKiAgICAgICAgICAgICAgICAgICAgIDogUGFnZSBjb25jZXJuZWQJCQkJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IAkJCQkJCQkqLwotLyogUmV0dXJuIHZhbHVlCQk6IFN0YXRlIG9mIHRoZSBkYXRhZmxhc2gJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9QYWdlRXJhc2UoCi0JQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAotCXVuc2lnbmVkIGludCBwYWdlKQotewotCWludCBjbWRzaXplOwotCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGxlZ2FsICovCi0JLyogbm8gZGF0YSB0byB0cmFuc21pdCBvciByZWNlaXZlICovCi0gICAgCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3NpemUgPSAwOwotCi0JY21kc2l6ZSA9IDQ7Ci0JaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkKLQkJY21kc2l6ZSA9IDU7Ci0JcmV0dXJuKEFUOTFGX0RhdGFGbGFzaFNlbmRDb21tYW5kIChwRGF0YUZsYXNoLCBEQl9QQUdFX0VSQVNFLCBjbWRzaXplLCBwYWdlKnBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfQmxvY2tFcmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogRXJhc2UgYSBCbG9jayAJCQkJCQkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IFBhZ2UgY29uY2VybmVkCQkJCQkJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiAJCQkJCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfQmxvY2tFcmFzZSgKLQlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCi0JdW5zaWduZWQgaW50IGJsb2NrKQotewotCWludCBjbWRzaXplOwotCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGxlZ2FsICovCi0JLyogbm8gZGF0YSB0byB0cmFuc21pdCBvciByZWNlaXZlICovCi0gICAgCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3NpemUgPSAwOwotCWNtZHNpemUgPSA0OwotCWlmIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIgPj0gMTYzODQpCi0JCWNtZHNpemUgPSA1OwotCXJldHVybihBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZCAocERhdGFGbGFzaCwgREJfQkxPQ0tfRVJBU0UsY21kc2l6ZSwgYmxvY2sqOCpwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplKSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9Xcml0ZUJ1ZmZlclRvTWFpbgkJCQkqLwotLyogT2JqZWN0ICAgICAgICAgICAgICA6IFdyaXRlIGJ1ZmZlciB0byB0aGUgbWFpbiBtZW1vcnkJCQkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCQkqLwotLyoJCTogPEJ1ZmZlckNvbW1hbmQ+ID0gY29tbWFuZCB0byBzZW5kIHRvIGJ1ZmZlcjEgb3IgYnVmZmVyMgkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxkZXN0PiA9IG1haW4gbWVtb3J5IGFkZHJlc3MJCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfV3JpdGVCdWZmZXJUb01haW4gKAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyIEJ1ZmZlckNvbW1hbmQsCi0JdW5zaWduZWQgaW50IGRlc3QgKQotewotCWludCBjbWRzaXplOwotCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGNvcnJlY3QgKi8KLQlpZiAoKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMV9QQUdFX1BHTSkgJiYKLQkgICAgKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMV9QQUdFX0VSQVNFX1BHTSkgJiYKLQkgICAgKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMl9QQUdFX1BHTSkgJiYKLQkgICAgKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMl9QQUdFX0VSQVNFX1BHTSkgKQotCQlyZXR1cm4gREFUQUZMQVNIX0JBRF9DT01NQU5EOwotCi0JLyogbm8gZGF0YSB0byB0cmFuc21pdCBvciByZWNlaXZlICovCi0JcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfc2l6ZSA9IDA7Ci0KLQljbWRzaXplID0gNDsKLQlpZiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyID49IDE2Mzg0KQotCQljbWRzaXplID0gNTsKLQkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBkYXRhZmxhc2ggKi8KLQlyZXR1cm4oQVQ5MUZfRGF0YUZsYXNoU2VuZENvbW1hbmQgKHBEYXRhRmxhc2gsIEJ1ZmZlckNvbW1hbmQsIGNtZHNpemUsIGRlc3QpKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfUGFydGlhbFBhZ2VXcml0ZQkJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBFcmFzZSBwYXJ0aWVsbHkgYSBwYWdlCQkJCQkqLwotLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IDxwYWdlPiA9IHBhZ2UgbnVtYmVyCQkJCQkqLwotLyoJCQk6IDxBZHJJbnBhZ2U+ID0gYWRyIHRvIGJlZ2luIHRoZSBmYWRpbmcJCQkqLwotLyogICAgICAgICAgICAgICAgICAgICA6IDxsZW5ndGg+ID0gTnVtYmVyIG9mIGJ5dGVzIHRvIGVyYXNlCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9QYXJ0aWFsUGFnZVdyaXRlICgKLQlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCi0JdW5zaWduZWQgY2hhciAqc3JjLAotCXVuc2lnbmVkIGludCBkZXN0LAotCXVuc2lnbmVkIGludCBzaXplKQotewotCXVuc2lnbmVkIGludCBwYWdlOwotCXVuc2lnbmVkIGludCBBZHJJblBhZ2U7Ci0KLQlwYWdlID0gZGVzdCAvIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplKTsKLQlBZHJJblBhZ2UgPSBkZXN0ICUgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpOwotCi0JLyogUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHBhZ2UgaW4gdGhlIFNyYW0gQnVmZmVyICovCi0JQVQ5MUZfTWFpbk1lbW9yeVRvQnVmZmVyVHJhbnNmZXJ0KHBEYXRhRmxhc2gsIERCX1BBR0VfMl9CVUYxX1RSRiwgcGFnZSk7Ci0JQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLCBBVDkxQ19USU1FT1VUX1dSRFkpOwotCS8qVXBkYXRlIHRoZSBTUkFNIGJ1ZmZlciAqLwotCUFUOTFGX0RhdGFGbGFzaFdyaXRlQnVmZmVyKHBEYXRhRmxhc2gsIERCX0JVRjFfV1JJVEUsIHNyYywgQWRySW5QYWdlLCBzaXplKTsKLQotCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywgQVQ5MUNfVElNRU9VVF9XUkRZKTsKLQotCS8qIEVyYXNlIHBhZ2UgaWYgYSAxMjggTWJpdHMgZGV2aWNlICovCi0JaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkgewotCQlBVDkxRl9QYWdlRXJhc2UocERhdGFGbGFzaCwgcGFnZSk7Ci0JCS8qIFJld3JpdGUgdGhlIG1vZGlmaWVkIFNyYW0gQnVmZmVyIGluIHRoZSBtYWluIG1lbW9yeSAqLwotCQlBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsIEFUOTFDX1RJTUVPVVRfV1JEWSk7Ci0JfQotCi0JLyogUmV3cml0ZSB0aGUgbW9kaWZpZWQgU3JhbSBCdWZmZXIgaW4gdGhlIG1haW4gbWVtb3J5ICovCi0JcmV0dXJuKEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluKHBEYXRhRmxhc2gsIERCX0JVRjFfUEFHRV9FUkFTRV9QR00sIChwYWdlKnBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKSk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFGbGFzaFdyaXRlCQkJCQkqLwotLyogT2JqZWN0ICAgICAgICAgICAgICA6CQkJCQkJCSovCi0vKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogPCpzcmM+ID0gU291cmNlIGJ1ZmZlcgkJCQkJKi8KLS8qICAgICAgICAgICAgICAgICAgICAgOiA8ZGVzdD4gPSBkYXRhZmxhc2ggYWRyZXNzCQkJCSovCi0vKiAgICAgICAgICAgICAgICAgICAgIDogPHNpemU+ID0gZGF0YSBidWZmZXIgc2l6ZQkJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX0RhdGFGbGFzaFdyaXRlKAotCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQl1bnNpZ25lZCBjaGFyICpzcmMsCi0JaW50IGRlc3QsCi0JaW50IHNpemUgKQotewotCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0JdW5zaWduZWQgaW50IHBhZ2U7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQotCUFUOTFGX1NwaUVuYWJsZShwRGF0YUZsYXNoLT5wRGV2aWNlLT5jcyk7Ci0KLQlpZiAoIChkZXN0ICsgc2l6ZSkgPiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSAqIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIpKSkKLQkJcmV0dXJuIERBVEFGTEFTSF9NRU1PUllfT1ZFUkZMT1c7Ci0KLQkvKiBJZiBkZXN0aW5hdGlvbiBkb2VzIG5vdCBmaXQgYSBwYWdlIHN0YXJ0IGFkZHJlc3MgKi8KLQlpZiAoKGRlc3QgJSAoKHVuc2lnbmVkIGludCkocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkpKSAgIT0gMCApIHsKLQkJbGVuZ3RoID0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSAtIChkZXN0ICUgKCh1bnNpZ25lZCBpbnQpKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKSk7Ci0KLQkJaWYgKHNpemUgPCBsZW5ndGgpCi0JCQlsZW5ndGggPSBzaXplOwotCi0JCWlmKCFBVDkxRl9QYXJ0aWFsUGFnZVdyaXRlKHBEYXRhRmxhc2gsc3JjLCBkZXN0LCBsZW5ndGgpKQotCQkJcmV0dXJuIERBVEFGTEFTSF9FUlJPUjsKLQotCQlBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsIEFUOTFDX1RJTUVPVVRfV1JEWSk7Ci0KLQkJLyogVXBkYXRlIHNpemUsIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KLQkJc2l6ZSAtPSBsZW5ndGg7Ci0JCWRlc3QgKz0gbGVuZ3RoOwotCQlzcmMgKz0gbGVuZ3RoOwotCX0KLQotCXdoaWxlICgoIHNpemUgLSBwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplICkgPj0gMCApIHsKLQkJLyogcHJvZ3JhbSBkYXRhZmxhc2ggcGFnZSAqLwotCQlwYWdlID0gKHVuc2lnbmVkIGludClkZXN0IC8gKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpOwotCi0JCXN0YXR1cyA9IEFUOTFGX0RhdGFGbGFzaFdyaXRlQnVmZmVyKHBEYXRhRmxhc2gsIERCX0JVRjFfV1JJVEUsIHNyYywgMCwgcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSk7Ci0JCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywgQVQ5MUNfVElNRU9VVF9XUkRZKTsKLQotCQlzdGF0dXMgPSBBVDkxRl9QYWdlRXJhc2UocERhdGFGbGFzaCwgcGFnZSk7Ci0JCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywgQVQ5MUNfVElNRU9VVF9XUkRZKTsKLQkJaWYgKCFzdGF0dXMpCi0JCQlyZXR1cm4gREFUQUZMQVNIX0VSUk9SOwotCi0JCXN0YXR1cyA9IEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluIChwRGF0YUZsYXNoLCBEQl9CVUYxX1BBR0VfUEdNLCBkZXN0KTsKLQkJaWYoIXN0YXR1cykKLQkJCXJldHVybiBEQVRBRkxBU0hfRVJST1I7Ci0KLQkJQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLCBBVDkxQ19USU1FT1VUX1dSRFkpOwotCi0JCS8qIFVwZGF0ZSBzaXplLCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzICovCi0JCXNpemUgLT0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSA7Ci0JCWRlc3QgKz0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSA7Ci0JCXNyYyAgKz0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSA7Ci0JfQotCi0JLyogSWYgc3RpbGwgc29tZSBieXRlcyB0byByZWFkICovCi0JaWYgKCBzaXplID4gMCApIHsKLQkJLyogcHJvZ3JhbSBkYXRhZmxhc2ggcGFnZSAqLwotCQlpZighQVQ5MUZfUGFydGlhbFBhZ2VXcml0ZShwRGF0YUZsYXNoLCBzcmMsIGRlc3QsIHNpemUpICkKLQkJCXJldHVybiBEQVRBRkxBU0hfRVJST1I7Ci0KLQkJQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLCBBVDkxQ19USU1FT1VUX1dSRFkpOwotCX0KLQlyZXR1cm4gREFUQUZMQVNIX09LOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9EYXRhRmxhc2hSZWFkIAkJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBSZWFkIGEgYmxvY2sgaW4gZGF0YWZsYXNoCQkJCSovCi0vKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogCQkJCQkJCSovCi0vKiBSZXR1cm4gdmFsdWUJCTogCQkJCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgQVQ5MUZfRGF0YUZsYXNoUmVhZCgKLQlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCi0JdW5zaWduZWQgbG9uZyBhZGRyLAotCXVuc2lnbmVkIGxvbmcgc2l6ZSwKLQljaGFyICpidWZmZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBTaXplVG9SZWFkOwotCi0JQVQ5MUZfU3BpRW5hYmxlKHBEYXRhRmxhc2gtPnBEZXZpY2UtPmNzKTsKLQotCWlmKEFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywgQVQ5MUNfVElNRU9VVF9XUkRZKSAhPSBEQVRBRkxBU0hfT0spCi0JCXJldHVybiAtMTsKLQotCXdoaWxlIChzaXplKSB7Ci0JCVNpemVUb1JlYWQgPSAoc2l6ZSA8IDB4ODAwMCk/IHNpemU6MHg4MDAwOwotCi0JCWlmIChBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsIEFUOTFDX1RJTUVPVVRfV1JEWSkgIT0gREFUQUZMQVNIX09LKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmIChBVDkxRl9EYXRhRmxhc2hDb250aW51b3VzUmVhZCAocERhdGFGbGFzaCwgYWRkciwgYnVmZmVyLCBTaXplVG9SZWFkKSAhPSBEQVRBRkxBU0hfT0spCi0JCQlyZXR1cm4gLTE7Ci0KLQkJc2l6ZSAtPSBTaXplVG9SZWFkOwotCQlhZGRyICs9IFNpemVUb1JlYWQ7Ci0JCWJ1ZmZlciArPSBTaXplVG9SZWFkOwotCX0KLQotCXJldHVybiBEQVRBRkxBU0hfT0s7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFmbGFzaFByb2JlIAkJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiAJCQkJCQkJKi8KLS8qIElucHV0IFBhcmFtZXRlcnMgICAgOiAJCQkJCQkJKi8KLS8qIFJldHVybiB2YWx1ZQkgICAgICAgOiBEYXRhZmxhc2ggc3RhdHVzIHJlZ2lzdGVyCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgQVQ5MUZfRGF0YWZsYXNoUHJvYmUoaW50IGNzLCBBVDkxUFNfRGF0YWZsYXNoRGVzYyBwRGVzYykKLXsKLQlBVDkxRl9TcGlFbmFibGUoY3MpOwotCUFUOTFGX0RhdGFGbGFzaEdldFN0YXR1cyhwRGVzYyk7Ci0JcmV0dXJuKChwRGVzYy0+Y29tbWFuZFsxXSA9PSAweEZGKT8gMDogcERlc2MtPmNvbW1hbmRbMV0gJiAweDNDKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9jbWNfcHUyL2NtY19wdTIuYyBiL2JvYXJkL2NtY19wdTIvY21jX3B1Mi5jCmluZGV4IDlhZTNjNDIuLjM3NGNkMDcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NtY19wdTIvY21jX3B1Mi5jCisrKyBiL2JvYXJkL2NtY19wdTIvY21jX3B1Mi5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogLyoKICAqIE5hbWU6CkBAIC0xNzUsNSArMTc1LDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZSA9IGRtOTE2MV9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2NtaS91LWJvb3QubGRzIGIvYm9hcmQvY21pL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDNmZWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvY21pL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQlXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMJTWFydGluIFdpbmlzdG9lcmZlciwgbWFydGlud2luaXN0b2VyZmVyQGdteC5jaAotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbgkqLwotICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEJWFhYIEZJWE1FIFhYWAkqLwotCi0gICAgY3B1L21wYzV4eC9zdGFydC5vCSgudGV4dCkKLQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgfQotICBfZXRleHQgPSAuOwotICBQUk9WSURFIChldGV4dCA9IC4pOwotICAucm9kYXRhICAgIDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oMjU2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oMjU2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLS8qICAgLiA9IGVudl9zdGFydDsKLQkucHBjZW52CToKLQl7Ci0JCWNvbW1vbi9lbnZpcm9ubWVudC5vICgucHBjZW52KQotCX0KLSovCi19CmRpZmYgLS1naXQgYS9ib2FyZC9jb2dlbnQvY29uZmlnLm1rIGIvYm9hcmQvY29nZW50L2NvbmZpZy5tawppbmRleCBlZTc3OTM5Li4zNWE1ZWQzIDEwMDY0NAotLS0gYS9ib2FyZC9jb2dlbnQvY29uZmlnLm1rCisrKyBiL2JvYXJkL2NvZ2VudC9jb25maWcubWsKQEAgLTI5LDMgKzI5LDUgQEAKIFRFWFRfQkFTRSA9IDB4ZmZmMDAwMDAKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpCisKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYm9hcmQvY29nZW50L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2JvYXJkL2NvZ2VudC9zZXJpYWwuYyBiL2JvYXJkL2NvZ2VudC9zZXJpYWwuYwppbmRleCAyYjU5NWE4Li5kOWMyN2JlIDEwMDY0NAotLS0gYS9ib2FyZC9jb2dlbnQvc2VyaWFsLmMKKysrIGIvYm9hcmQvY29nZW50L3NlcmlhbC5jCkBAIC05MCw3ICs5MCw3IEBACiAKICNlbmRpZiAvKiBDT05TX05PTkUgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikgJiYgXAogICAgIGRlZmluZWQoQ09ORklHX0tHREJfTk9ORSkKIAogI2lmIENPTkZJR19LR0RCX0lOREVYID09IENPTkZJR19DT05TX0lOREVYCmRpZmYgLS1naXQgYS9ib2FyZC9jb2dlbnQvdS1ib290LmxkcyBiL2JvYXJkL2NvZ2VudC91LWJvb3QubGRzCmluZGV4IDVjZTI2OTQuLmQ4N2EzOWIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NvZ2VudC91LWJvb3QubGRzCisrKyBiL2JvYXJkL2NvZ2VudC91LWJvb3QubGRzCkBAIC01NSw3ICs1NSw2IEBACiAgIHsKICAgICAqKC50ZXh0KQogICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQogICAgICooLmdvdDEpCiAgIH0KICAgX2V0ZXh0ID0gLjsKZGlmZiAtLWdpdCBhL2JvYXJkL2NwYzQ1L2NwYzQ1LmMgYi9ib2FyZC9jcGM0NS9jcGM0NS5jCmluZGV4IDUxYjAwODUuLjc5ZWI0NzMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NwYzQ1L2NwYzQ1LmMKKysrIGIvYm9hcmQvY3BjNDUvY3BjNDUuYwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJcmV0dXJuICgwKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogCiAjaWZkZWYgQ0ZHX1BDTUNJQV9NRU1fQUREUgogdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcGNtY2lhX21lbSA9ICh1bnNpZ25lZCBjaGFyKilDRkdfUENNQ0lBX01FTV9BRERSOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJcmV0dXJuIHJjOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAjIGlmZGVmIENPTkZJR19JREVfTEVECiB2b2lkIGlkZV9sZWQgKHVjaGFyIGxlZCwgdWNoYXIgc3RhdHVzKQpkaWZmIC0tZ2l0IGEvYm9hcmQvY3BjNDUvcGQ2NzI5MC5jIGIvYm9hcmQvY3BjNDUvcGQ2NzI5MC5jCmluZGV4IDZjYTNlN2IuLmQ4ZjRiZTUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NwYzQ1L3BkNjcyOTAuYworKysgYi9ib2FyZC9jcGM0NS9wZDY3MjkwLmMKQEAgLTc3Miw3ICs3NzIsNyBAQAogCXJldHVybiByYzsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9vZmYgKHZvaWQpCiB7CiAJcHJpbnRmICgiRGlzYWJsZSBQQ01DSUEgIiBQQ01DSUFfU0xPVF9NU0cgIlxuIik7CmRpZmYgLS1naXQgYS9ib2FyZC9jcGM0NS91LWJvb3QubGRzIGIvYm9hcmQvY3BjNDUvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhMjZhYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9jcGM0NS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubyAoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9jcHU4Ni9jcHU4Ni5jIGIvYm9hcmQvY3B1ODYvY3B1ODYuYwppbmRleCAzZWI1YjM1Li4wZWI5NGVmIDEwMDY0NAotLS0gYS9ib2FyZC9jcHU4Ni9jcHU4Ni5jCisrKyBiL2JvYXJkL2NwdTg2L2NwdTg2LmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCXJldHVybiAocHNpemUpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiBleHRlcm4gdm9pZCBkb2NfcHJvYmUgKHVsb25nIHBoeXNhZHIpOwogdm9pZCBkb2NfaW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL2NwdTg2L3UtYm9vdC5sZHMgYi9ib2FyZC9jcHU4Ni91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWYyOWM2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2NwdTg2L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2NwdTg3L2NwdTg3LmMgYi9ib2FyZC9jcHU4Ny9jcHU4Ny5jCmluZGV4IDlmZWNkZDAuLmEyZmQxOTMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NwdTg3L2NwdTg3LmMKKysrIGIvYm9hcmQvY3B1ODcvY3B1ODcuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJcmV0dXJuIChwc2l6ZSk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvY3B1ODcvdS1ib290LmxkcyBiL2JvYXJkL2NwdTg3L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2U2NjUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvY3B1ODcvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxLTIwMDUKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9jc2I2MzcvY3NiNjM3LmMgYi9ib2FyZC9jc2I2MzcvY3NiNjM3LmMKaW5kZXggYWViMWExMy4uZmJjM2M4NyAxMDA2NDQKLS0tIGEvYm9hcmQvY3NiNjM3L2NzYjYzNy5jCisrKyBiL2JvYXJkL2NzYjYzNy9jc2I2MzcuYwpAQCAtNTcsNyArNTcsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTc3LDUgKzc3LDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZQkgPSBiY201MjIxX0F1dG9OZWdvdGlhdGU7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvY3U4MjQvdS1ib290LmxkcyBiL2JvYXJkL2N1ODI0L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTg1ZTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvY3U4MjQvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vICgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkJLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkJKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvbmFuZC5jIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9uYW5kLmMKaW5kZXggZjVjM2RkOS4uMDljMGIwNCAxMDA2NDQKLS0tIGEvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9uYW5kLmMKKysrIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9uYW5kLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPG5hbmQuaD4KIApAQCAtMTE1LDQgKzExNSw0IEBACiAJbmFuZC0+b3B0aW9ucyA9IE5BTkRfU0FNU1VOR19MUF9PUFRJT05TOwogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvZHYtZXZtL01ha2VmaWxlIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMDEzOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL01ha2VmaWxlCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gZHZfYm9hcmQubworU09CSlMJOj0gYm9hcmRfaW5pdC5vCisKK1NSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKFNPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAqfiAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBpcyBmb3IgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvZHYtZXZtL2JvYXJkX2luaXQuUyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL2JvYXJkX2luaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQ4YWRjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vYm9hcmRfaW5pdC5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogQm9hcmQtc3BlY2lmaWMgbG93IGxldmVsIGluaXRpYWxpemF0aW9uIGNvZGUuIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQKKyAqIG9mIGNwdS9hcm05MjZlanMvZGF2aW5jaS9sb3dsZXZlbF9pbml0LlMuIEp1c3QgcmV0dXJucyBpZiB0aGVyZSBpcyBubworICogaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisuZ2xvYmwJZHZfYm9hcmRfaW5pdAorZHZfYm9hcmRfaW5pdDoKKworCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvZHYtZXZtL2NvbmZpZy5tayBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg5ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vY29uZmlnLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMgRGF2aWQgTXVlbGxlciwgRUxTT0ZUIEFHLCA8ZC5tdWVsbGVyQGVsc29mdC5jaD4KKyMKKyMgKEMpIENvcHlyaWdodCAyMDAzCisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMgU3dhbWluYXRoYW4gPHN3YW1pLml5ZXJAdGkuY29tPgorIworIyBEYXZpbmNpIEVWTSBib2FyZCAoQVJNOTI1RUpTKSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBEYXZpbmNpIEVWTSBoYXMgMSBiYW5rIG9mIDI1NiBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA5MDAwJzAwMDAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorIworIyBWaXNpb25lZXJpbmcgQ29ycC4gU29uYXRhIGJvYXJkIChBUk05MjZFSlMpIGNwdQorIworIyBTb25hdGEgYm9hcmQgaGFzIDEgYmFuayBvZiAxMjggTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gODgwMCcwMDAwCisjCisjIFJhem9yc3RyZWFtLCBMTEMuIFNDSE1PT0dJRSBib2FyZCAoQVJNOTI2RUpTKSBjcHUKKyMKKyMgU2NobW9vZ2llIGJvYXJkIGhhcyAxIGJhbmsgb2YgMTI4IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDg4MDAnMDAwMAorIworIyBMaW51eC1LZXJuZWwgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgODAwMCc4MDAwLCBlbnRyeSA4MDAwJzgwMDAKKyMgKG1lbSBiYXNlICsgcmVzZXJ2ZWQpCisjCisjIHdlIGxvYWQgb3Vyc2VsZiB0byA4MTA4ICcwMDAwCisjCisjCisKKyNQcm92aWRlIGF0IGxlYXN0IDE2TUIgc3BhY2luZyBiZXR3ZWVuIHVzIGFuZCB0aGUgTGludXggS2VybmVsIGltYWdlCitURVhUX0JBU0UgPSAweDgxMDgwMDAwCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL2R2LWV2bS9kdl9ib2FyZC5jIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vZHZfYm9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDRlZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vZHZfYm9hcmQuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBQYXJ0cyBhcmUgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gdmFyaW91cyBUSSBzb3VyY2VzLCBvcmlnaW5hbCBjb3B5cmlnaHQKKyAqIGZvbGxvd3M6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9lbWFjX2RlZnMuaD4KKworI2RlZmluZSBNQUNIX1RZUEVfREFWSU5DSV9FVk0JCTkwMQorCitleHRlcm4gdm9pZAlpMmNfaW5pdChpbnQgc3BlZWQsIGludCBzbGF2ZWFkZHIpOworZXh0ZXJuIHZvaWQJdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJZXRoX2h3X2luaXQodm9pZCk7CitleHRlcm4gcGh5X3QJcGh5OworCisKKy8qIFdvcmtzIG9uIEFsd2F5cyBPbiBwb3dlciBkb21haW4gb25seSAobm8gUEQgYXJndW1lbnQpICovCit2b2lkIGxwc2Nfb24odW5zaWduZWQgaW50IGlkKQoreworCWR2X3JlZ19wCW1kc3RhdCwgbWRjdGw7CisKKwlpZiAoaWQgPj0gREFWSU5DSV9MUFNDX0dFTSkKKwkJcmV0dXJuOwkJCS8qIERvbid0IHdvcmsgb24gRFNQIFBvd2VyIERvbWFpbiAqLworCisJbWRzdGF0ID0gUkVHX1AoUFNDX01EU1RBVF9CQVNFICsgKGlkICogNCkpOworCW1kY3RsID0gUkVHX1AoUFNDX01EQ1RMX0JBU0UgKyAoaWQgKiA0KSk7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMSkgezt9CisKKwlpZiAoKCptZHN0YXQgJiAweDFmKSA9PSAweDAzKQorCQlyZXR1cm47CQkJLyogQWxyZWFkeSBvbiBhbmQgZW5hYmxlZCAqLworCisJKm1kY3RsIHw9IDB4MDM7CisKKwkvKiBTcGVjaWFsIHRyZWF0bWVudCBmb3Igc29tZSBtb2R1bGVzIGFzIGZvciBzcHJ1ZTE0IHAuNy40LjIgKi8KKwlpZiAoCShpZCA9PSBEQVZJTkNJX0xQU0NfVlBTU1NMVikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NRElPKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VTQikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BVEEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVkxZTlEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVUhQSSkgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19ERFJfRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NTUNfU0QpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTUVNU1RJQ0spIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTWNCU1ApIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfR1BJTykKKwkgICApCisJICAgCSptZGN0bCB8PSAweDIwMDsKKworCVJFRyhQU0NfUFRDTUQpID0gMHgwMTsKKworCXdoaWxlIChSRUcoUFNDX1BUU1RBVCkgJiAweDAzKSB7O30KKwl3aGlsZSAoKCptZHN0YXQgJiAweDFmKSAhPSAweDAzKSB7O30JLyogUHJvYmFibHkgYW4gb3ZlcmtpbGwuLi4gKi8KK30KKwordm9pZCBkc3Bfb24odm9pZCkKK3sKKwlpbnQJaTsKKworCWlmIChSRUcoUFNDX1BEU1RBVDEpICYgMHgxZikKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gKi8KKworCVJFRyhQU0NfR0JMQ1RMKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSAmPSB+MHgxMDA7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0dFTSAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfSU1DT1AgKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpICY9IDB4ZmZmZmZlZmY7CisJUkVHKFBTQ19QVENNRCkgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChSRUcoUFNDX0VQQ1BSKSAmIDB4MDIpCisJCQlicmVhazsKKwl9CisKKwlSRUcoUFNDX0NIUF9TSFJUU1cpID0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgxMDA7CisJUkVHKFBTQ19FUENDUikgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmICghKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDIpKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19HQkxDVEwpICY9IH4weDFmOworfQorCisKK2ludCBib2FyZF9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBhcmNoIG51bWJlciBvZiB0aGUgYm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gTUFDSF9UWVBFX0RBVklOQ0lfRVZNOworCisJLyogYWRkcmVzcyBvZiBib290IHBhcmFtZXRlcnMgKi8KKwlnZC0+YmQtPmJpX2Jvb3RfcGFyYW1zID0gTElOVVhfQk9PVF9QQVJBTV9BRERSOworCisJLyogV29ya2Fyb3VuZCBmb3IgVE1TMzIwRE02NDQ2IGVycmF0YSAxLjMuMjIgKi8KKwlSRUcoUFNDX1NJTFZFUl9CVUxMRVQpID0gMDsKKworCS8qIFBvd2VyIG9uIHJlcXVpcmVkIHBlcmlwaGVyYWxzICovCisJbHBzY19vbihEQVZJTkNJX0xQU0NfRU1BQyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfRU1BQ19XUkFQUEVSKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19NRElPKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19JMkMpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX1VBUlQwKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19USU1FUjEpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0dQSU8pOworCisJLyogUG93ZXJ1cCB0aGUgRFNQICovCisJZHNwX29uKCk7CisKKwkvKiBCcmluZ3VwIFVBUlQwIG91dCBvZiByZXNldCAqLworCVJFRyhVQVJUMF9QV1JFTVVfTUdNVCkgPSAweDAwMDBlMDAzOworCisJLyogRW5hYmxlIEdJTzMuM1YgY2VsbHMgdXNlZCBmb3IgRU1BQyAqLworCVJFRyhWREQzUDNWX1BXRE4pID0gMDsKKworCS8qIEVuYWJsZSBVQVJUMCBNVVggbGluZXMgKi8KKwlSRUcoUElOTVVYMSkgfD0gMTsKKworCS8qIEVuYWJsZSBFTUFDIGFuZCBBRU1JRiBwaW5zICovCisJUkVHKFBJTk1VWDApID0gMHg4MDAwMGMxZjsKKworCS8qIEVuYWJsZSBJMkMgcGluIE11eCAqLworCVJFRyhQSU5NVVgxKSB8PSAoMSA8PCA3KTsKKworCS8qIFNldCB0aGUgQnVzIFByaW9yaXR5IFJlZ2lzdGVyIHRvIGFwcHJvcHJpYXRlIHZhbHVlICovCisJUkVHKFZCUFIpID0gMHgyMDsKKworCXRpbWVyX2luaXQoKTsKKworCXJldHVybigwKTsKK30KKworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXVfaW50OF90CXRtcFsyMF0sIGJ1ZlsxMF07CisJaW50CQlpID0gMDsKKwlpbnQJCWNsayA9IDA7CisKKwljbGsgPSAoKFJFRyhQTEwyX1BMTE0pICsgMSkgKiAyNykgLyAoKFJFRyhQTEwyX0RJVjIpICYgMHgxZikgKyAxKTsKKworCXByaW50ZiAoIkFSTSBDbG9jayA6ICVkTUh6XG4iLCAoKFJFRyhQTEwxX1BMTE0pICsgMSkgKiAyNyApIC8gMik7CisJcHJpbnRmICgiRERSIENsb2NrIDogJWRNSHpcbiIsIChjbGsgLyAyKSk7CisKKwkvKiBTZXQgRXRoZXJuZXQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwlpZiAoaTJjX3JlYWQoQ0ZHX0kyQ19FRVBST01fQUREUiwgMHg3ZjAwLCBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiwgYnVmLCA2KSkgeworCQlwcmludGYoIlxuRUVQUk9NIEAgMHglMDJ4IHJlYWQgRkFJTEVEISEhXG4iLCBDRkdfSTJDX0VFUFJPTV9BRERSKTsKKwl9IGVsc2UgeworCQl0bXBbMF0gPSAweGZmOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdG1wWzBdICY9IGJ1ZltpXTsKKworCQlpZiAoKHRtcFswXSAhPSAweGZmKSAmJiAoZ2V0ZW52KCJldGhhZGRyIikgPT0gTlVMTCkpIHsKKwkJCXNwcmludGYoKGNoYXIgKikmdG1wWzBdLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0pOworCQkJc2V0ZW52KCJldGhhZGRyIiwgKGNoYXIgKikmdG1wWzBdKTsKKwkJfQorCX0KKworCWlmICghZXRoX2h3X2luaXQoKSkgeworCQlwcmludGYoImV0aGVybmV0IGluaXQgZmFpbGVkIVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJFVEggUEhZICAgOiAlc1xuIiwgcGh5Lm5hbWUpOworCX0KKworCWkyY19yZWFkICgweDM5LCAweDAwLCAxLCAodV9pbnQ4X3QgKikmaSwgMSk7CisKKwlzZXRlbnYgKCJ2aWRlb3N0ZCIsICgoaSAgJiAweDgwKSA/ICJwYWwiIDogIm50c2MiKSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkcmFtX2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IFBIWVNfU0RSQU1fMV9TSVpFOworCisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9kdi1ldm0vdS1ib290LmxkcyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYjJhMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisJLiA9IEFMSUdOKDQpOworCS50ZXh0CToKKwl7CisJICBjcHUvYXJtOTI2ZWpzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSAuOworCV9fdV9ib290X2NtZF9zdGFydCA9IC47CisJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKwlfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9NYWtlZmlsZSBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDAxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9NYWtlZmlsZQpAQCAtMCwwICsxLDUyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGR2X2JvYXJkLm8KK1NPQkpTCTo9IGJvYXJkX2luaXQubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykgJChTT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgKn4gLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgaXMgZm9yICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9ib2FyZF9pbml0LlMgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9ib2FyZF9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkOGFkYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2JvYXJkX2luaXQuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIEJvYXJkLXNwZWNpZmljIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiBjb2RlLiBDYWxsZWQgYXQgdGhlIHZlcnkgZW5kCisgKiBvZiBjcHUvYXJtOTI2ZWpzL2RhdmluY2kvbG93bGV2ZWxfaW5pdC5TLiBKdXN0IHJldHVybnMgaWYgdGhlcmUgaXMgbm8KKyAqIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLmdsb2JsCWR2X2JvYXJkX2luaXQKK2R2X2JvYXJkX2luaXQ6CisKKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9jb25maWcubWsgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4OWQwZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2NvbmZpZy5tawpAQCAtMCwwICsxLDM5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjIERhdmlkIE11ZWxsZXIsIEVMU09GVCBBRywgPGQubXVlbGxlckBlbHNvZnQuY2g+CisjCisjIChDKSBDb3B5cmlnaHQgMjAwMworIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIFN3YW1pbmF0aGFuIDxzd2FtaS5peWVyQHRpLmNvbT4KKyMKKyMgRGF2aW5jaSBFVk0gYm9hcmQgKEFSTTkyNUVKUykgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgRGF2aW5jaSBFVk0gaGFzIDEgYmFuayBvZiAyNTYgTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gOTAwMCcwMDAwCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyMKKyMgVmlzaW9uZWVyaW5nIENvcnAuIFNvbmF0YSBib2FyZCAoQVJNOTI2RUpTKSBjcHUKKyMKKyMgU29uYXRhIGJvYXJkIGhhcyAxIGJhbmsgb2YgMTI4IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDg4MDAnMDAwMAorIworIyBSYXpvcnN0cmVhbSwgTExDLiBTQ0hNT09HSUUgYm9hcmQgKEFSTTkyNkVKUykgY3B1CisjCisjIFNjaG1vb2dpZSBib2FyZCBoYXMgMSBiYW5rIG9mIDEyOCBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA4ODAwJzAwMDAKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDgwMDAnODAwMCwgZW50cnkgODAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorIworIyB3ZSBsb2FkIG91cnNlbGYgdG8gODEwOCAnMDAwMAorIworIworCisjUHJvdmlkZSBhdCBsZWFzdCAxNk1CIHNwYWNpbmcgYmV0d2VlbiB1cyBhbmQgdGhlIExpbnV4IEtlcm5lbCBpbWFnZQorVEVYVF9CQVNFID0gMHg4MTA4MDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvZHZfYm9hcmQuYyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2R2X2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyNzFhMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2R2X2JvYXJkLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogUGFydHMgYXJlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHZhcmlvdXMgVEkgc291cmNlcywgb3JpZ2luYWwgY29weXJpZ2h0CisgKiBmb2xsb3dzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1hY19kZWZzLmg+CisKKyNkZWZpbmUgTUFDSF9UWVBFX1NDSE1PT0dJRQkJMTI1NQorCitleHRlcm4gdm9pZAlpMmNfaW5pdChpbnQgc3BlZWQsIGludCBzbGF2ZWFkZHIpOworZXh0ZXJuIHZvaWQJdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJZXRoX2h3X2luaXQodm9pZCk7CitleHRlcm4gcGh5X3QJcGh5OworCisKKy8qIFdvcmtzIG9uIEFsd2F5cyBPbiBwb3dlciBkb21haW4gb25seSAobm8gUEQgYXJndW1lbnQpICovCit2b2lkIGxwc2Nfb24odW5zaWduZWQgaW50IGlkKQoreworCWR2X3JlZ19wCW1kc3RhdCwgbWRjdGw7CisKKwlpZiAoaWQgPj0gREFWSU5DSV9MUFNDX0dFTSkKKwkJcmV0dXJuOwkJCS8qIERvbid0IHdvcmsgb24gRFNQIFBvd2VyIERvbWFpbiAqLworCisJbWRzdGF0ID0gUkVHX1AoUFNDX01EU1RBVF9CQVNFICsgKGlkICogNCkpOworCW1kY3RsID0gUkVHX1AoUFNDX01EQ1RMX0JBU0UgKyAoaWQgKiA0KSk7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMSkgezt9CisKKwlpZiAoKCptZHN0YXQgJiAweDFmKSA9PSAweDAzKQorCQlyZXR1cm47CQkJLyogQWxyZWFkeSBvbiBhbmQgZW5hYmxlZCAqLworCisJKm1kY3RsIHw9IDB4MDM7CisKKwkvKiBTcGVjaWFsIHRyZWF0bWVudCBmb3Igc29tZSBtb2R1bGVzIGFzIGZvciBzcHJ1ZTE0IHAuNy40LjIgKi8KKwlpZiAoCShpZCA9PSBEQVZJTkNJX0xQU0NfVlBTU1NMVikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NRElPKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VTQikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BVEEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVkxZTlEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVUhQSSkgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19ERFJfRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NTUNfU0QpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTUVNU1RJQ0spIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTWNCU1ApIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfR1BJTykKKwkgICApCisJICAgCSptZGN0bCB8PSAweDIwMDsKKworCVJFRyhQU0NfUFRDTUQpID0gMHgwMTsKKworCXdoaWxlIChSRUcoUFNDX1BUU1RBVCkgJiAweDAzKSB7O30KKwl3aGlsZSAoKCptZHN0YXQgJiAweDFmKSAhPSAweDAzKSB7O30JLyogUHJvYmFibHkgYW4gb3ZlcmtpbGwuLi4gKi8KK30KKwordm9pZCBkc3Bfb24odm9pZCkKK3sKKwlpbnQJaTsKKworCWlmIChSRUcoUFNDX1BEU1RBVDEpICYgMHgxZikKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gKi8KKworCVJFRyhQU0NfR0JMQ1RMKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSAmPSB+MHgxMDA7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0dFTSAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfSU1DT1AgKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpICY9IDB4ZmZmZmZlZmY7CisJUkVHKFBTQ19QVENNRCkgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChSRUcoUFNDX0VQQ1BSKSAmIDB4MDIpCisJCQlicmVhazsKKwl9CisKKwlSRUcoUFNDX0NIUF9TSFJUU1cpID0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgxMDA7CisJUkVHKFBTQ19FUENDUikgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmICghKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDIpKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19HQkxDVEwpICY9IH4weDFmOworfQorCisKK2ludCBib2FyZF9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBhcmNoIG51bWJlciBvZiB0aGUgYm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gTUFDSF9UWVBFX1NDSE1PT0dJRTsKKworCS8qIGFkZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisJZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IExJTlVYX0JPT1RfUEFSQU1fQUREUjsKKworCS8qIFdvcmthcm91bmQgZm9yIFRNUzMyMERNNjQ0NiBlcnJhdGEgMS4zLjIyICovCisJUkVHKFBTQ19TSUxWRVJfQlVMTEVUKSA9IDA7CisKKwkvKiBQb3dlciBvbiByZXF1aXJlZCBwZXJpcGhlcmFscyAqLworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUMpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUik7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfTURJTyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfSTJDKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19VQVJUMCk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfVElNRVIxKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19HUElPKTsKKworCS8qIFBvd2VydXAgdGhlIERTUCAqLworCWRzcF9vbigpOworCisJLyogQnJpbmd1cCBVQVJUMCBvdXQgb2YgcmVzZXQgKi8KKwlSRUcoVUFSVDBfUFdSRU1VX01HTVQpID0gMHgwMDAwZTAwMzsKKworCS8qIEVuYWJsZSBHSU8zLjNWIGNlbGxzIHVzZWQgZm9yIEVNQUMgKi8KKwlSRUcoVkREM1AzVl9QV0ROKSA9IDA7CisKKwkvKiBFbmFibGUgVUFSVDAgTVVYIGxpbmVzICovCisJUkVHKFBJTk1VWDEpIHw9IDE7CisKKwkvKiBFbmFibGUgRU1BQyBhbmQgQUVNSUYgcGlucyAqLworCVJFRyhQSU5NVVgwKSA9IDB4ODAwMDBjMWY7CisKKwkvKiBFbmFibGUgSTJDIHBpbiBNdXggKi8KKwlSRUcoUElOTVVYMSkgfD0gKDEgPDwgNyk7CisKKwkvKiBTZXQgdGhlIEJ1cyBQcmlvcml0eSBSZWdpc3RlciB0byBhcHByb3ByaWF0ZSB2YWx1ZSAqLworCVJFRyhWQlBSKSA9IDB4MjA7CisKKwl0aW1lcl9pbml0KCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwl1X2ludDhfdAl0bXBbMjBdLCBidWZbMTBdOworCWludAkJaSA9IDA7CisJaW50CQljbGsgPSAwOworCisJLyogU2V0IHNlcmlhbCBudW1iZXIgZnJvbSBVSUQgY2hpcCAqLworCXVfaW50OF90CWNyY190YmxbMjU2XSA9IHsKKwkJCTB4MDAsIDB4NWUsIDB4YmMsIDB4ZTIsIDB4NjEsIDB4M2YsIDB4ZGQsIDB4ODMsCisJCQkweGMyLCAweDljLCAweDdlLCAweDIwLCAweGEzLCAweGZkLCAweDFmLCAweDQxLAorCQkJMHg5ZCwgMHhjMywgMHgyMSwgMHg3ZiwgMHhmYywgMHhhMiwgMHg0MCwgMHgxZSwKKwkJCTB4NWYsIDB4MDEsIDB4ZTMsIDB4YmQsIDB4M2UsIDB4NjAsIDB4ODIsIDB4ZGMsCisJCQkweDIzLCAweDdkLCAweDlmLCAweGMxLCAweDQyLCAweDFjLCAweGZlLCAweGEwLAorCQkJMHhlMSwgMHhiZiwgMHg1ZCwgMHgwMywgMHg4MCwgMHhkZSwgMHgzYywgMHg2MiwKKwkJCTB4YmUsIDB4ZTAsIDB4MDIsIDB4NWMsIDB4ZGYsIDB4ODEsIDB4NjMsIDB4M2QsCisJCQkweDdjLCAweDIyLCAweGMwLCAweDllLCAweDFkLCAweDQzLCAweGExLCAweGZmLAorCQkJMHg0NiwgMHgxOCwgMHhmYSwgMHhhNCwgMHgyNywgMHg3OSwgMHg5YiwgMHhjNSwKKwkJCTB4ODQsIDB4ZGEsIDB4MzgsIDB4NjYsIDB4ZTUsIDB4YmIsIDB4NTksIDB4MDcsCisJCQkweGRiLCAweDg1LCAweDY3LCAweDM5LCAweGJhLCAweGU0LCAweDA2LCAweDU4LAorCQkJMHgxOSwgMHg0NywgMHhhNSwgMHhmYiwgMHg3OCwgMHgyNiwgMHhjNCwgMHg5YSwKKwkJCTB4NjUsIDB4M2IsIDB4ZDksIDB4ODcsIDB4MDQsIDB4NWEsIDB4YjgsIDB4ZTYsCisJCQkweGE3LCAweGY5LCAweDFiLCAweDQ1LCAweGM2LCAweDk4LCAweDdhLCAweDI0LAorCQkJMHhmOCwgMHhhNiwgMHg0NCwgMHgxYSwgMHg5OSwgMHhjNywgMHgyNSwgMHg3YiwKKwkJCTB4M2EsIDB4NjQsIDB4ODYsIDB4ZDgsIDB4NWIsIDB4MDUsIDB4ZTcsIDB4YjksCisJCQkweDhjLCAweGQyLCAweDMwLCAweDZlLCAweGVkLCAweGIzLCAweDUxLCAweDBmLAorCQkJMHg0ZSwgMHgxMCwgMHhmMiwgMHhhYywgMHgyZiwgMHg3MSwgMHg5MywgMHhjZCwKKwkJCTB4MTEsIDB4NGYsIDB4YWQsIDB4ZjMsIDB4NzAsIDB4MmUsIDB4Y2MsIDB4OTIsCisJCQkweGQzLCAweDhkLCAweDZmLCAweDMxLCAweGIyLCAweGVjLCAweDBlLCAweDUwLAorCQkJMHhhZiwgMHhmMSwgMHgxMywgMHg0ZCwgMHhjZSwgMHg5MCwgMHg3MiwgMHgyYywKKwkJCTB4NmQsIDB4MzMsIDB4ZDEsIDB4OGYsIDB4MGMsIDB4NTIsIDB4YjAsIDB4ZWUsCisJCQkweDMyLCAweDZjLCAweDhlLCAweGQwLCAweDUzLCAweDBkLCAweGVmLCAweGIxLAorCQkJMHhmMCwgMHhhZSwgMHg0YywgMHgxMiwgMHg5MSwgMHhjZiwgMHgyZCwgMHg3MywKKwkJCTB4Y2EsIDB4OTQsIDB4NzYsIDB4MjgsIDB4YWIsIDB4ZjUsIDB4MTcsIDB4NDksCisJCQkweDA4LCAweDU2LCAweGI0LCAweGVhLCAweDY5LCAweDM3LCAweGQ1LCAweDhiLAorCQkJMHg1NywgMHgwOSwgMHhlYiwgMHhiNSwgMHgzNiwgMHg2OCwgMHg4YSwgMHhkNCwKKwkJCTB4OTUsIDB4Y2IsIDB4MjksIDB4NzcsIDB4ZjQsIDB4YWEsIDB4NDgsIDB4MTYsCisJCQkweGU5LCAweGI3LCAweDU1LCAweDBiLCAweDg4LCAweGQ2LCAweDM0LCAweDZhLAorCQkJMHgyYiwgMHg3NSwgMHg5NywgMHhjOSwgMHg0YSwgMHgxNCwgMHhmNiwgMHhhOCwKKwkJCTB4NzQsIDB4MmEsIDB4YzgsIDB4OTYsIDB4MTUsIDB4NGIsIDB4YTksIDB4ZjcsCisJCQkweGI2LCAweGU4LCAweDBhLCAweDU0LCAweGQ3LCAweDg5LCAweDZiLCAweDM1CisJCX07CisKKwljbGsgPSAoKFJFRyhQTEwyX1BMTE0pICsgMSkgKiAyNykgLyAoKFJFRyhQTEwyX0RJVjIpICYgMHgxZikgKyAxKTsKKworCXByaW50ZiAoIkFSTSBDbG9jayA6ICVkTUh6XG4iLCAoKFJFRyhQTEwxX1BMTE0pICsgMSkgKiAyNyApIC8gMik7CisJcHJpbnRmICgiRERSIENsb2NrIDogJWRNSHpcbiIsIChjbGsgLyAyKSk7CisKKwkvKiBTZXQgc2VyaWFsIG51bWJlciBmcm9tIFVJRCBjaGlwICovCisJaWYgKGkyY19yZWFkKENGR19VSURfQUREUiwgMCwgMSwgYnVmLCA4KSkgeworCQlwcmludGYoIlxuVUlEIEAgMHglMDJ4IHJlYWQgRkFJTEVEISEhXG4iLCBDRkdfVUlEX0FERFIpOworCQlmb3JjZWVudigic2VyaWFsIyIsICJGQUlMRUQiKTsKKwl9IGVsc2UgeworCQlpZiAoYnVmWzBdICE9IDB4NzApIHsJLyogRGV2aWNlIEZhbWlseSBDb2RlICovCisJCQlwcmludGYoIlxuVUlEIEAgMHglMDJ4IHJlYWQgRkFJTEVEISEhXG4iLCBDRkdfVUlEX0FERFIpOworCQkJZm9yY2VlbnYoInNlcmlhbCMiLCAiRkFJTEVEIik7CisJCX0KKwl9CisJLyogTm93IGNoZWNrIENSQyAqLworCXRtcFswXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJdG1wWzBdID0gY3JjX3RibFt0bXBbMF0gXiBidWZbaV1dOworCisJaWYgKHRtcFswXSAhPSAwKSB7CisJCXByaW50ZigiXG5VSUQgQCAweCUwMnggLSBCQUQgQ1JDISEhXG4iLCBDRkdfVUlEX0FERFIpOworCQlmb3JjZWVudigic2VyaWFsIyIsICJGQUlMRUQiKTsKKwl9IGVsc2UgeworCQkvKiBDUkMgT0ssIHNldCAic2VyaWFsIiBlbnYgdmFyaWFibGUgKi8KKwkJc3ByaW50ZigoY2hhciAqKSZ0bXBbMF0sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQkJYnVmWzZdLCBidWZbNV0sIGJ1Zls0XSwgYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSk7CisJCWZvcmNlZW52KCJzZXJpYWwjIiwgKGNoYXIgKikmdG1wWzBdKTsKKwl9CisKKwlpZiAoIWV0aF9od19pbml0KCkpIHsKKwkJcHJpbnRmKCJldGhlcm5ldCBpbml0IGZhaWxlZCFcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiRVRIIFBIWSAgIDogJXNcbiIsIHBoeS5uYW1lKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkcmFtX2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IFBIWVNfU0RSQU1fMV9TSVpFOworCisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvdS1ib290LmxkcyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYjJhMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisJLiA9IEFMSUdOKDQpOworCS50ZXh0CToKKwl7CisJICBjcHUvYXJtOTI2ZWpzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSAuOworCV9fdV9ib290X2NtZF9zdGFydCA9IC47CisJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKwlfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NvbmF0YS9NYWtlZmlsZSBiL2JvYXJkL2RhdmluY2kvc29uYXRhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDAxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9NYWtlZmlsZQpAQCAtMCwwICsxLDUyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGR2X2JvYXJkLm8KK1NPQkpTCTo9IGJvYXJkX2luaXQubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykgJChTT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgKn4gLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgaXMgZm9yICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NvbmF0YS9ib2FyZF9pbml0LlMgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9ib2FyZF9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiOWVhNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL2JvYXJkX2luaXQuUwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBCb2FyZC1zcGVjaWZpYyBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gY29kZS4gQ2FsbGVkIGF0IHRoZSB2ZXJ5IGVuZAorICogb2YgY3B1L2FybTkyNmVqcy9kYXZpbmNpL2xvd2xldmVsX2luaXQuUy4gSnVzdCByZXR1cm5zIGlmIHRoZXJlIGlzIG5vCisgKiBpbml0aWFsaXphdGlvbiByZXF1aXJlZC4KKyAqCisgKiBGb3IgX09MREVSXyBTb25hdGEgYm9hcmRzIHNldHMgdXAgR1BJTzQgdG8gY29udHJvbCBOQU5EIFdQIGxpbmUuIE5ld2VyCisgKiBTb25hdGEgYm9hcmRzLCBBRkFJSywgZG9uJ3QgdXNlIHRoaXMgc28gaXQncyBqdXN0IHJldHVybiBieSBkZWZhdWx0LiBBc2sKKyAqIFZpc2lvbmVlcmluZyBpZiB0aGV5IHJlaW52ZW50ZWQgdGhlIHdoZWVsIG9uY2UgYWdhaW4gdG8gbWFrZSBzdXJlIDopCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisuZ2xvYmwJZHZfYm9hcmRfaW5pdAorZHZfYm9hcmRfaW5pdDoKKyNpZmRlZiBTT05BVEFfQk9BUkRfR1BJT1dQCisJLyogU2V0IFBJTk1VWDAgdG8gZW5hYmxlIEdQSU80ICovCisJbGRyCXIwLCBfUElOTVVYMAorCWxkcglyMSwgR1BJTzRfRU5fTUFTSworCWxkcglyMiwgW3IwXQorCWFuZAlyMiwgcjIsIHIxCisJc3RyCXIyLCBbcjBdCisKKwkvKiBFbmFibGUgR1BJTyBMUFNDIG1vZHVsZSAqLworCWxkcglyMCwgUFRTVEFUCisKK2dwaW9fcHRzdGF0X2xvb3AxOgorCWxkcglyMiwgW3IwXQorCXRzdAlyMiwgJDB4MDAwMDAwMDEKKwlibmUJZ3Bpb19wdHN0YXRfbG9vcDEKKworCWxkcglyMSwgTURDVExfR1BJTworCWxkcglyMiwgW3IxXQorCWFuZAlyMiwgcjIsICQweGZmZmZmZmY4CisJb3JyCXIyLCByMiwgJDB4MDAwMDAwMDMKKwlzdHIJcjIsIFtyMV0KKworCW9ycglyMiwgcjIsICQweDAwMDAwMjAwCisJc3RyCXIyLCBbcjFdCisKKwlsZHIJcjEsIFBUQ01ECisJbW92CXIyLCAkMHgwMDAwMDAwMQorCXN0cglyMiwgW3IxXQorCitncGlvX3B0c3RhdF9sb29wMjoKKwlsZHIJcjIsIFtyMF0KKwl0c3QJcjIsICQweDAwMDAwMDAxCisJYm5lCWdwaW9fcHRzdGF0X2xvb3AyCisKKwlsZHIJcjAsIE1EU1RBVF9HUElPCitncGlvX21kc3RhdF9sb29wOgorCWxkcglyMiwgW3IwXQorCWFuZAlyMiwgcjIsICQweDAwMDAwMDFmCisJdGVxCXIyLCAkMHgwMDAwMDAwMworCWJuZQlncGlvX21kc3RhdF9sb29wCisKKwkvKiBHUElPNCAtPiBvdXRwdXQgKi8KKwlsZHIJcjAsIEdQSU9fRElSMDEKKwltb3YJcjEsICQweDEwCisJbGRyCXIyLCBbcjBdCisJYmljCXIyLCByMiwgcjAKKwlzdHIJcjIsIFtyMF0KKworCS8qIFNldCBpdCB0byAwIChXcml0ZSBQcm90ZWN0KSAqLworCWxkcglyMCwgR1BJT19DTFJfREFUQTAxCisJc3RyCXIxLCBbcjBdCisjZW5kaWYKKworCW1vdglwYywgbHIKKworI2lmZGVmIFNPTkFUQV9CT0FSRF9HUElPV1AKKy5sdG9yZworCitHUElPNF9FTl9NQVNLOgorCS53b3JkCTB4Zjc3ZmZmZmYKK01EQ1RMX0dQSU86CisJLndvcmQJMHgwMWM0MWE2OAorTURTVEFUX0dQSU86CisJLndvcmQJMHgwMWM0MTg2OAorR1BJT19ESVIwMToKKwkud29yZAkweDAxYzY3MDEwCitHUElPX0NMUl9EQVRBMDE6CisJLndvcmQJMHgwMWM2NzAxYworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NvbmF0YS9jb25maWcubWsgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4OWQwZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL2NvbmZpZy5tawpAQCAtMCwwICsxLDM5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjIERhdmlkIE11ZWxsZXIsIEVMU09GVCBBRywgPGQubXVlbGxlckBlbHNvZnQuY2g+CisjCisjIChDKSBDb3B5cmlnaHQgMjAwMworIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIFN3YW1pbmF0aGFuIDxzd2FtaS5peWVyQHRpLmNvbT4KKyMKKyMgRGF2aW5jaSBFVk0gYm9hcmQgKEFSTTkyNUVKUykgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgRGF2aW5jaSBFVk0gaGFzIDEgYmFuayBvZiAyNTYgTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gOTAwMCcwMDAwCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyMKKyMgVmlzaW9uZWVyaW5nIENvcnAuIFNvbmF0YSBib2FyZCAoQVJNOTI2RUpTKSBjcHUKKyMKKyMgU29uYXRhIGJvYXJkIGhhcyAxIGJhbmsgb2YgMTI4IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDg4MDAnMDAwMAorIworIyBSYXpvcnN0cmVhbSwgTExDLiBTQ0hNT09HSUUgYm9hcmQgKEFSTTkyNkVKUykgY3B1CisjCisjIFNjaG1vb2dpZSBib2FyZCBoYXMgMSBiYW5rIG9mIDEyOCBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA4ODAwJzAwMDAKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDgwMDAnODAwMCwgZW50cnkgODAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorIworIyB3ZSBsb2FkIG91cnNlbGYgdG8gODEwOCAnMDAwMAorIworIworCisjUHJvdmlkZSBhdCBsZWFzdCAxNk1CIHNwYWNpbmcgYmV0d2VlbiB1cyBhbmQgdGhlIExpbnV4IEtlcm5lbCBpbWFnZQorVEVYVF9CQVNFID0gMHg4MTA4MDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zb25hdGEvZHZfYm9hcmQuYyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL2R2X2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4NTdjNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL2R2X2JvYXJkLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogUGFydHMgYXJlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHZhcmlvdXMgVEkgc291cmNlcywgb3JpZ2luYWwgY29weXJpZ2h0CisgKiBmb2xsb3dzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1hY19kZWZzLmg+CisKKyNkZWZpbmUgTUFDSF9UWVBFX1NPTkFUQQkJMTI1NAorCitleHRlcm4gdm9pZAlpMmNfaW5pdChpbnQgc3BlZWQsIGludCBzbGF2ZWFkZHIpOworZXh0ZXJuIHZvaWQJdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJZXRoX2h3X2luaXQodm9pZCk7CitleHRlcm4gcGh5X3QJcGh5OworCisKKy8qIFdvcmtzIG9uIEFsd2F5cyBPbiBwb3dlciBkb21haW4gb25seSAobm8gUEQgYXJndW1lbnQpICovCit2b2lkIGxwc2Nfb24odW5zaWduZWQgaW50IGlkKQoreworCWR2X3JlZ19wCW1kc3RhdCwgbWRjdGw7CisKKwlpZiAoaWQgPj0gREFWSU5DSV9MUFNDX0dFTSkKKwkJcmV0dXJuOwkJCS8qIERvbid0IHdvcmsgb24gRFNQIFBvd2VyIERvbWFpbiAqLworCisJbWRzdGF0ID0gUkVHX1AoUFNDX01EU1RBVF9CQVNFICsgKGlkICogNCkpOworCW1kY3RsID0gUkVHX1AoUFNDX01EQ1RMX0JBU0UgKyAoaWQgKiA0KSk7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMSkgezt9CisKKwlpZiAoKCptZHN0YXQgJiAweDFmKSA9PSAweDAzKQorCQlyZXR1cm47CQkJLyogQWxyZWFkeSBvbiBhbmQgZW5hYmxlZCAqLworCisJKm1kY3RsIHw9IDB4MDM7CisKKwkvKiBTcGVjaWFsIHRyZWF0bWVudCBmb3Igc29tZSBtb2R1bGVzIGFzIGZvciBzcHJ1ZTE0IHAuNy40LjIgKi8KKwlpZiAoCShpZCA9PSBEQVZJTkNJX0xQU0NfVlBTU1NMVikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NRElPKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VTQikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BVEEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVkxZTlEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVUhQSSkgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19ERFJfRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NTUNfU0QpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTUVNU1RJQ0spIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTWNCU1ApIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfR1BJTykKKwkgICApCisJICAgCSptZGN0bCB8PSAweDIwMDsKKworCVJFRyhQU0NfUFRDTUQpID0gMHgwMTsKKworCXdoaWxlIChSRUcoUFNDX1BUU1RBVCkgJiAweDAzKSB7O30KKwl3aGlsZSAoKCptZHN0YXQgJiAweDFmKSAhPSAweDAzKSB7O30JLyogUHJvYmFibHkgYW4gb3ZlcmtpbGwuLi4gKi8KK30KKwordm9pZCBkc3Bfb24odm9pZCkKK3sKKwlpbnQJaTsKKworCWlmIChSRUcoUFNDX1BEU1RBVDEpICYgMHgxZikKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gKi8KKworCVJFRyhQU0NfR0JMQ1RMKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSAmPSB+MHgxMDA7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0dFTSAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfSU1DT1AgKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpICY9IDB4ZmZmZmZlZmY7CisJUkVHKFBTQ19QVENNRCkgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChSRUcoUFNDX0VQQ1BSKSAmIDB4MDIpCisJCQlicmVhazsKKwl9CisKKwlSRUcoUFNDX0NIUF9TSFJUU1cpID0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgxMDA7CisJUkVHKFBTQ19FUENDUikgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmICghKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDIpKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19HQkxDVEwpICY9IH4weDFmOworfQorCisKK2ludCBib2FyZF9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBhcmNoIG51bWJlciBvZiB0aGUgYm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gTUFDSF9UWVBFX1NPTkFUQTsKKworCS8qIGFkZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisJZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IExJTlVYX0JPT1RfUEFSQU1fQUREUjsKKworCS8qIFdvcmthcm91bmQgZm9yIFRNUzMyMERNNjQ0NiBlcnJhdGEgMS4zLjIyICovCisJUkVHKFBTQ19TSUxWRVJfQlVMTEVUKSA9IDA7CisKKwkvKiBQb3dlciBvbiByZXF1aXJlZCBwZXJpcGhlcmFscyAqLworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUMpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUik7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfTURJTyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfSTJDKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19VQVJUMCk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfVElNRVIxKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19HUElPKTsKKworCS8qIFBvd2VydXAgdGhlIERTUCAqLworCWRzcF9vbigpOworCisJLyogQnJpbmd1cCBVQVJUMCBvdXQgb2YgcmVzZXQgKi8KKwlSRUcoVUFSVDBfUFdSRU1VX01HTVQpID0gMHgwMDAwZTAwMzsKKworCS8qIEVuYWJsZSBHSU8zLjNWIGNlbGxzIHVzZWQgZm9yIEVNQUMgKi8KKwlSRUcoVkREM1AzVl9QV0ROKSA9IDA7CisKKwkvKiBFbmFibGUgVUFSVDAgTVVYIGxpbmVzICovCisJUkVHKFBJTk1VWDEpIHw9IDE7CisKKwkvKiBFbmFibGUgRU1BQyBhbmQgQUVNSUYgcGlucyAqLworCVJFRyhQSU5NVVgwKSA9IDB4ODAwMDBjMWY7CisKKwkvKiBFbmFibGUgSTJDIHBpbiBNdXggKi8KKwlSRUcoUElOTVVYMSkgfD0gKDEgPDwgNyk7CisKKwkvKiBTZXQgdGhlIEJ1cyBQcmlvcml0eSBSZWdpc3RlciB0byBhcHByb3ByaWF0ZSB2YWx1ZSAqLworCVJFRyhWQlBSKSA9IDB4MjA7CisKKwl0aW1lcl9pbml0KCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwl1X2ludDhfdAl0bXBbMjBdLCBidWZbMTBdOworCWludAkJaSA9IDA7CisJaW50CQljbGsgPSAwOworCisKKwljbGsgPSAoKFJFRyhQTEwyX1BMTE0pICsgMSkgKiAyNykgLyAoKFJFRyhQTEwyX0RJVjIpICYgMHgxZikgKyAxKTsKKworCXByaW50ZiAoIkFSTSBDbG9jayA6ICVkTUh6XG4iLCAoKFJFRyhQTEwxX1BMTE0pICsgMSkgKiAyNyApIC8gMik7CisJcHJpbnRmICgiRERSIENsb2NrIDogJWRNSHpcbiIsIChjbGsgLyAyKSk7CisKKwkvKiBTZXQgRXRoZXJuZXQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwlpZiAoaTJjX3JlYWQoQ0ZHX0kyQ19FRVBST01fQUREUiwgMHg3ZjAwLCBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiwgYnVmLCA2KSkgeworCQlwcmludGYoIlxuRUVQUk9NIEAgMHglMDJ4IHJlYWQgRkFJTEVEISEhXG4iLCBDRkdfSTJDX0VFUFJPTV9BRERSKTsKKwl9IGVsc2UgeworCQl0bXBbMF0gPSAweGZmOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdG1wWzBdICY9IGJ1ZltpXTsKKworCQlpZiAoKHRtcFswXSAhPSAweGZmKSAmJiAoZ2V0ZW52KCJldGhhZGRyIikgPT0gTlVMTCkpIHsKKwkJCXNwcmludGYoKGNoYXIgKikmdG1wWzBdLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0pOworCQkJc2V0ZW52KCJldGhhZGRyIiwgKGNoYXIgKikmdG1wWzBdKTsKKwkJfQorCX0KKworCWlmICghZXRoX2h3X2luaXQoKSkgeworCQlwcmludGYoImV0aGVybmV0IGluaXQgZmFpbGVkIVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJFVEggUEhZICAgOiAlc1xuIiwgcGh5Lm5hbWUpOworCX0KKworCXJldHVybigwKTsKK30KKworaW50IGRyYW1faW5pdCh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJZ2QtPmJkLT5iaV9kcmFtWzBdLnN0YXJ0ID0gUEhZU19TRFJBTV8xOworCWdkLT5iZC0+YmlfZHJhbVswXS5zaXplID0gUEhZU19TRFJBTV8xX1NJWkU7CisKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NvbmF0YS91LWJvb3QubGRzIGIvYm9hcmQvZGF2aW5jaS9zb25hdGEvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBiMmEyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9zb25hdGEvdS1ib290LmxkcwpAQCAtMCwwICsxLDUyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKwkuID0gQUxJR04oNCk7CisJLnRleHQJOgorCXsKKwkgIGNwdS9hcm05MjZlanMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IC47CisJX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKwkudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorCV9fdV9ib290X2NtZF9lbmQgPSAuOworCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2RlbHRhL2RlbHRhLmMgYi9ib2FyZC9kZWx0YS9kZWx0YS5jCmluZGV4IGIxMjdhYzguLjZlMjI3NzQgMTAwNjQ0Ci0tLSBhL2JvYXJkL2RlbHRhL2RlbHRhLmMKKysrIGIvYm9hcmQvZGVsdGEvZGVsdGEuYwpAQCAtMSwxMCArMSw2IEBACiAvKgotICogKEMpIENvcHlyaWdodCAyMDAyCi0gKiBLeWxlIEhhcnJpcywgTmV4dXMgVGVjaG5vbG9naWVzLCBJbmMuIGtoYXJyaXNAbmV4dXMtdGVjaC5uZXQKLSAqCi0gKiAoQykgQ29weXJpZ2h0IDIwMDIKLSAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgotICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICAqIHByb2plY3QuCkBAIC05OCw3ICs5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyoKICAqIE1hZ2ljIEtleSBIYW5kbGluZywgbWFpbmx5IGNvcGllZCBmcm9tIGJvYXJkL2x3bW9uL2x3bW9uLmMKICAqLwpAQCAtMzI0LDYgKzMxOSwxMiBAQAogCQlyZXR1cm47CiAJfQogCisJdmFsID0gMHg4MDsKKwlpZihpMmNfd3JpdGUoYWRkciwgSVJRX01BU0tfQiwgMSwgJnZhbCwgMSkpIHsKKwkJcHJpbnRmKCJFcnJvciBhY2Nlc3NpbmcgREE5MDMwIHZpYSBpMmMuXG4iKTsKKwkJcmV0dXJuOworCX0KKwogCWkyY19yZWdfd3JpdGUoYWRkciwgUkVHX0NPTlRST0xfMV85NywgMHhmZCk7IC8qIGRpc2FibGUgTERPMSwgZW5hYmxlIExETzYgKi8KIAlpMmNfcmVnX3dyaXRlKGFkZHIsIExETzJfMywgMHhkMSk7CS8qIExETzIgPTEsOVYsIExETzM9MywxViAqLwogCWkyY19yZWdfd3JpdGUoYWRkciwgTERPNF81LCAweGNjKTsJLyogTERPMiA9MSw5ViwgTERPMz0zLDFWICovCmRpZmYgLS1naXQgYS9ib2FyZC9kZWx0YS9uYW5kLmMgYi9ib2FyZC9kZWx0YS9uYW5kLmMKaW5kZXggZDE3MDkzOC4uYTYzNWE2NSAxMDA2NDQKLS0tIGEvYm9hcmQvZGVsdGEvbmFuZC5jCisrKyBiL2JvYXJkL2RlbHRhL25hbmQuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2lmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPG5hbmQuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL2VYYWxpb24vdS1ib290LmxkcyBiL2JvYXJkL2VYYWxpb24vdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlZTNmZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9lWGFsaW9uL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9lbWsvdG9wNTIwMC90b3A1MjAwLmMgYi9ib2FyZC9lbWsvdG9wNTIwMC90b3A1MjAwLmMKaW5kZXggZDc0MWU2Yi4uY2NiZDcyYSAxMDA2NDQKLS0tIGEvYm9hcmQvZW1rL3RvcDUyMDAvdG9wNTIwMC5jCisrKyBiL2JvYXJkL2Vtay90b3A1MjAwL3RvcDUyMDAuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHByb3ZpZGUgdGhlIElERSBSZXNldCBGdW5jdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCAodm9pZCkKIHsKQEAgLTIwNSw0ICsyMDUsNCBAQAogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9XVV9HUElPX0RBVEFfTyB8PSAgR1BJT19QU0MxXzQ7CiAJfQogfQotI2VuZGlmIC8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9lbWsvdG9wNTIwMC91LWJvb3QubGRzIGIvYm9hcmQvZW1rL3RvcDUyMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNDMyZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9lbWsvdG9wNTIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9lcDgyNDgvdS1ib290LmxkcyBiL2JvYXJkL2VwODI0OC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGM0YjQ2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2VwODI0OC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogTW9kaWZpZWQgYnkgWXVsaSBCYXJjb2hlbiA8eXVsaUBhcmFiZWxsYXN3LmNvbT4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXA4MjYwL3UtYm9vdC5sZHMgYi9ib2FyZC9lcDgyNjAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1MGU4My4uMDAwMDAwMAotLS0gYS9ib2FyZC9lcDgyNjAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAyCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9vcHQvY3Jvc3MvbGliKTsgU0VBUkNIX0RJUigvb3B0L2Nyb3NzL3Bvd2VycGMtbGludXgvbGliKTsKLS8qIFNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOyAqLwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLS8qICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KSAqLwotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9lcDgyeHhtL3UtYm9vdC5sZHMgYi9ib2FyZC9lcDgyeHhtL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzRiNDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZXA4Mnh4bS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogTW9kaWZpZWQgYnkgWXVsaSBCYXJjb2hlbiA8eXVsaUBhcmFiZWxsYXN3LmNvbT4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2FzaDQwNS9hc2g0MDUuYyBiL2JvYXJkL2VzZC9hc2g0MDUvYXNoNDA1LmMKaW5kZXggMDE1MWQ3NC4uOGE1YjAzYiAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2FzaDQwNS9hc2g0MDUuYworKysgYi9ib2FyZC9lc2QvYXNoNDA1L2FzaDQwNS5jCkBAIC0yMjIsNyArMjIyLDYgQEAKIHZvaWQgcmVzZXRfcGh5KHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0xYVDk3MV9OT19TTEVFUAotCiAJLyoKIAkgKiBEaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxCiAJICovCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY29tbW9uL2F1dG9fdXBkYXRlLmMgYi9ib2FyZC9lc2QvY29tbW9uL2F1dG9fdXBkYXRlLmMKaW5kZXggYjVmNzcyMi4uZGExNDdlZSAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NvbW1vbi9hdXRvX3VwZGF0ZS5jCisrKyBiL2JvYXJkL2VzZC9jb21tb24vYXV0b191cGRhdGUuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKICN3YXJuaW5nIENGR19OQU5EX0xFR0FDWSBub3QgZGVmaW5lZCBpbiBhIGZpbGUgdXNpbmcgdGhlIGxlZ2FjeSBOQU5EIHN1cHBvcnQhCiAjZW5kaWYKIApAQCAtNDEsOCArNDEsOCBAQAogCiAjaWZkZWYgQ09ORklHX0FVVE9fVVBEQVRFCiAKLSNpZiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKQotI2Vycm9yICJtdXN0IGRlZmluZSBDRkdfQ01EX0ZBVCIKKyNpZiAhZGVmaW5lZChDT05GSUdfQ01EX0ZBVCkKKyNlcnJvciAibXVzdCBkZWZpbmUgQ09ORklHX0NNRF9GQVQiCiAjZW5kaWYKIAogZXh0ZXJuIGF1X2ltYWdlX3QgYXVfaW1hZ2VbXTsKQEAgLTc1LDcgKzc1LDcgQEAKIGV4dGVybiBpbnQgZmxhc2hfc2VjdF9wcm90ZWN0IChpbnQsIHVsb25nLCB1bG9uZyk7CiBleHRlcm4gaW50IGZsYXNoX3dyaXRlIChjaGFyICosIHVsb25nLCB1bG9uZyk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAvKiByZWZlcmVuY2VzIHRvIG5hbWVzIGluIGNtZF9uYW5kLmMgKi8KICNkZWZpbmUgTkFORFJXX1JFQUQJMHgwMQogI2RlZmluZSBOQU5EUldfV1JJVEUJMHgwMApAQCAtODUsNyArODUsNyBAQAogZXh0ZXJuIGludCBuYW5kX2xlZ2FjeV9ydyhzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBpbnQgY21kLCBzaXplX3Qgc3RhcnQsIHNpemVfdCBsZW4sCiAJCSAgIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmKTsKIGV4dGVybiBpbnQgbmFuZF9sZWdhY3lfZXJhc2Uoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IG9mcywgc2l6ZV90IGxlbiwgaW50IGNsZWFuKTsKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkgKi8KKyNlbmRpZgogCiBleHRlcm4gYmxvY2tfZGV2X2Rlc2NfdCBpZGVfZGV2X2Rlc2NbQ0ZHX0lERV9NQVhERVZJQ0VdOwogCkBAIC0xODksNyArMTg5LDcgQEAKIAlpbnQgb2ZmLCByYzsKIAl1aW50IG5ieXRlczsKIAlpbnQgazsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAJaW50IHRvdGFsOwogI2VuZGlmCiAKQEAgLTI2Myw3ICsyNjMsNyBAQAogCQkJZGVidWcgKCJmbGFzaF9zZWN0X2VyYXNlKCVseCwgJWx4KTtcbiIsIHN0YXJ0LCBlbmQpOwogCQkJZmxhc2hfc2VjdF9lcmFzZShzdGFydCwgZW5kKTsKIAkJfSBlbHNlIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAJCQlwcmludGYoIlVwZGF0aW5nIE5BTkQgRkxBU0ggd2l0aCBpbWFnZSAlc1xuIiwgYXVfaW1hZ2VbaV0ubmFtZSk7CiAJCQlkZWJ1ZyAoIm5hbmRfbGVnYWN5X2VyYXNlKCVseCwgJWx4KTtcbiIsIHN0YXJ0LCBlbmQpOwogCQkJcmMgPSBuYW5kX2xlZ2FjeV9lcmFzZSAobmFuZF9kZXZfZGVzYywgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSwgMCk7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJCWRlYnVnICgiZmxhc2hfd3JpdGUoJXAsICVseCAleClcbiIsIGFkZHIsIHN0YXJ0LCBuYnl0ZXMpOwogCQkJcmMgPSBmbGFzaF93cml0ZSgoY2hhciAqKWFkZHIsIHN0YXJ0LCBuYnl0ZXMpOwogCQl9IGVsc2UgewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAkJCWRlYnVnICgibmFuZF9sZWdhY3lfcncoJXAsICVseCAleClcbiIsIGFkZHIsIHN0YXJ0LCBuYnl0ZXMpOwogCQkJcmMgPSBuYW5kX2xlZ2FjeV9ydyhuYW5kX2Rldl9kZXNjLCBOQU5EUldfV1JJVEUgfCBOQU5EUldfSkZGUzIsCiAJCQkJICAgICBzdGFydCwgbmJ5dGVzLCAoc2l6ZV90ICopJnRvdGFsLCAodWNoYXIgKilhZGRyKTsKQEAgLTMxMSw3ICszMTEsNyBAQAogCQlpZiAoYXVfaW1hZ2VbaV0udHlwZSAhPSBBVV9OQU5EKSB7CiAJCQlyYyA9IGNyYzMyICgwLCAodWNoYXIgKikoc3RhcnQgKyBvZmYpLCBudG9obChoZHItPmloX3NpemUpKTsKIAkJfSBlbHNlIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAJCQlyYyA9IG5hbmRfbGVnYWN5X3J3KG5hbmRfZGV2X2Rlc2MsIE5BTkRSV19SRUFEIHwgTkFORFJXX0pGRlMyIHwgTkFORFJXX0pGRlMyX1NLSVAsCiAJCQkJICAgICBzdGFydCwgbmJ5dGVzLCAoc2l6ZV90ICopJnRvdGFsLCAodWNoYXIgKilhZGRyKTsKIAkJCXJjID0gY3JjMzIgKDAsICh1Y2hhciAqKShhZGRyICsgb2ZmKSwgbnRvaGwoaGRyLT5paF9zaXplKSk7CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY29tbW9uL2NtZF9sb2FkcGNpLmMgYi9ib2FyZC9lc2QvY29tbW9uL2NtZF9sb2FkcGNpLmMKaW5kZXggYmY3OTZmZi4uZDg4YjM4NyAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NvbW1vbi9jbWRfbG9hZHBjaS5jCisrKyBiL2JvYXJkL2VzZC9jb21tb24vY21kX2xvYWRwY2kuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiBleHRlcm4gaW50IGRvX2Jvb3RtIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKIGV4dGVybiBpbnQgZG9fYXV0b3NjcmlwdCAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY29tbW9uL2VzZDQwNWVwX25hbmQuYyBiL2JvYXJkL2VzZC9jb21tb24vZXNkNDA1ZXBfbmFuZC5jCmluZGV4IDdhYzRiODMuLjdiZjY4NDcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jb21tb24vZXNkNDA1ZXBfbmFuZC5jCisrKyBiL2JvYXJkL2VzZC9jb21tb24vZXNkNDA1ZXBfbmFuZC5jCkBAIC0yMyw3ICsyMyw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bmFuZC5oPgogCkBAIC04NCw0ICs4NCw0IEBACiAJbmFuZC0+b3B0aW9ucyA9IE5BTkRfU0FNU1VOR19MUF9PUFRJT05TOwogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNDA1L2NwY2k0MDUuYyBiL2JvYXJkL2VzZC9jcGNpNDA1L2NwY2k0MDUuYwppbmRleCAyMzU4NTc3Li42OWNiOGNlIDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvY3BjaTQwNS9jcGNpNDA1LmMKKysrIGIvYm9hcmQvZXNkL2NwY2k0MDUvY3BjaTQwNS5jCkBAIC0zMSw3ICszMSw3IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi1leHRlcm4gaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7ICAgICAgIC8qY21kX2Jvb3QuYyovCitleHRlcm4gaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CS8qY21kX2Jvb3QuYyovCiAjaWYgMAogI2RlZmluZSBGUEdBX0RFQlVHCiAjZW5kaWYKQEAgLTU0LDggKzU0LDYgQEAKICAqIGluY2x1ZGUgY29tbW9uIGZwZ2EgY29kZSAoZm9yIGVzZCBib2FyZHMpCiAgKi8KICNpbmNsdWRlICIuLi9jb21tb24vZnBnYS5jIgotCi0KICNpbmNsdWRlICIuLi9jb21tb24vYXV0b191cGRhdGUuaCIKIAogI2lmZGVmIENPTkZJR19DUENJNDA1QUIKQEAgLTg4LDEzICs4NiwxMSBAQAogCiBpbnQgTl9BVV9JTUFHRVMgPSAoc2l6ZW9mKGF1X2ltYWdlKSAvIHNpemVvZihhdV9pbWFnZVswXSkpOwogCi0KIC8qIFByb3RvdHlwZXMgKi8KIGludCBjcGNpNDA1X3ZlcnNpb24odm9pZCk7CiBpbnQgZ3VuemlwKHZvaWQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CiB2b2lkIGx4dDk3MV9ub19zbGVlcCh2b2lkKTsKIAotCiBpbnQgYm9hcmRfZWFybHlfaW5pdF9mICh2b2lkKQogewogI2lmbmRlZiBDT05GSUdfQ1BDSTQwNV9WRVIyCkBAIC0xMTMsMTAgKzEwOSwxMCBAQAogCS8qCiAJICogRmlyc3QgcHVsbCBmcGdhLXByZyBwaW4gbG93LCB0byBkaXNhYmxlIGZwZ2EgbG9naWMgKG9uIHZlcnNpb24gMiBib2FyZCkKIAkgKi8KLQlvdXQzMihHUElPMF9PRFIsIDB4MDAwMDAwMDApOyAgICAgICAgLyogbm8gb3BlbiBkcmFpbiBwaW5zICAgICAgKi8KLQlvdXQzMihHUElPMF9UQ1IsIENGR19GUEdBX1BSRyk7ICAgICAgLyogc2V0dXAgZm9yIG91dHB1dCAgICAgICAgKi8KKwlvdXQzMihHUElPMF9PRFIsIDB4MDAwMDAwMDApOwkgICAgIC8qIG5vIG9wZW4gZHJhaW4gcGlucwkqLworCW91dDMyKEdQSU8wX1RDUiwgQ0ZHX0ZQR0FfUFJHKTsgICAgICAvKiBzZXR1cCBmb3Igb3V0cHV0CSovCiAJb3V0MzIoR1BJTzBfT1IsICBDRkdfRlBHQV9QUkcpOyAgICAgIC8qIHNldCBvdXRwdXQgcGlucyB0byBoaWdoICovCi0Jb3V0MzIoR1BJTzBfT1IsIDApOyAgICAgICAgICAgICAgICAgIC8qIHB1bGwgcHJnIGxvdyAgICAgICAgICAgICovCisJb3V0MzIoR1BJTzBfT1IsIDApOwkJICAgICAvKiBwdWxsIHByZyBsb3cJCSovCiAKIAkvKgogCSAqIEJvb3Qgb25ib2FyZCBGUEdBCkBAIC0xNzgsNTEgKzE3NCw0OCBAQAogCSAqIElSUSAzMCAoRVhUIElSUSA1KSBQQ0kgU0xPVCAzOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKIAkgKiBJUlEgMzEgKEVYVCBJUlEgNikgQ09NUEFDVCBGTEFTSDsgYWN0aXZlIGhpZ2g7IGxldmVsIHNlbnNpdGl2ZQogCSAqLwotCW10ZGNyKHVpY3NyLCAweEZGRkZGRkZGKTsgICAgICAgLyogY2xlYXIgYWxsIGludHMgKi8KLQltdGRjcih1aWNlciwgMHgwMDAwMDAwMCk7ICAgICAgIC8qIGRpc2FibGUgYWxsIGludHMgKi8KLQltdGRjcih1aWNjciwgMHgwMDAwMDAwMCk7ICAgICAgIC8qIHNldCBhbGwgdG8gYmUgbm9uLWNyaXRpY2FsKi8KKwltdGRjcih1aWNzciwgMHhGRkZGRkZGRik7CS8qIGNsZWFyIGFsbCBpbnRzICovCisJbXRkY3IodWljZXIsIDB4MDAwMDAwMDApOwkvKiBkaXNhYmxlIGFsbCBpbnRzICovCisJbXRkY3IodWljY3IsIDB4MDAwMDAwMDApOwkvKiBzZXQgYWxsIHRvIGJlIG5vbi1jcml0aWNhbCovCiAjaWZkZWYgQ09ORklHX0NQQ0k0MDVfNlUKIAlpZiAoY3BjaTQwNV92ZXJzaW9uKCkgPT0gMykgewotCQltdGRjcih1aWNwciwgMHhGRkZGRkY5OSk7ICAgICAgIC8qIHNldCBpbnQgcG9sYXJpdGllcyAqLworCQltdGRjcih1aWNwciwgMHhGRkZGRkY5OSk7CS8qIHNldCBpbnQgcG9sYXJpdGllcyAqLwogCX0gZWxzZSB7Ci0JCW10ZGNyKHVpY3ByLCAweEZGRkZGRjgxKTsgICAgICAgLyogc2V0IGludCBwb2xhcml0aWVzICovCisJCW10ZGNyKHVpY3ByLCAweEZGRkZGRjgxKTsJLyogc2V0IGludCBwb2xhcml0aWVzICovCiAJfQogI2Vsc2UKLQltdGRjcih1aWNwciwgMHhGRkZGRkY4MSk7ICAgICAgIC8qIHNldCBpbnQgcG9sYXJpdGllcyAqLworCW10ZGNyKHVpY3ByLCAweEZGRkZGRjgxKTsJLyogc2V0IGludCBwb2xhcml0aWVzICovCiAjZW5kaWYKLQltdGRjcih1aWN0ciwgMHgxMDAwMDAwMCk7ICAgICAgIC8qIHNldCBpbnQgdHJpZ2dlciBsZXZlbHMgKi8KLQltdGRjcih1aWN2Y3IsIDB4MDAwMDAwMDEpOyAgICAgIC8qIHNldCB2ZWN0IGJhc2U9MCxJTlQwIGhpZ2hlc3QgcHJpb3JpdHkqLwotCW10ZGNyKHVpY3NyLCAweEZGRkZGRkZGKTsgICAgICAgLyogY2xlYXIgYWxsIGludHMgKi8KKwltdGRjcih1aWN0ciwgMHgxMDAwMDAwMCk7CS8qIHNldCBpbnQgdHJpZ2dlciBsZXZlbHMgKi8KKwltdGRjcih1aWN2Y3IsIDB4MDAwMDAwMDEpOwkvKiBzZXQgdmVjdCBiYXNlPTAsSU5UMCBoaWdoZXN0IHByaW9yaXR5Ki8KKwltdGRjcih1aWNzciwgMHhGRkZGRkZGRik7CS8qIGNsZWFyIGFsbCBpbnRzICovCiAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIGludCBjdGVybW0yKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0NQQ0k0MDVfVkVSMgotCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8sIGJvYXJkIGlzIGNwY2k0MDUgKi8KKwlyZXR1cm4gMDsJCQkvKiBubywgYm9hcmQgaXMgY3BjaTQwNSAqLwogI2Vsc2UKIAlpZiAoKCoodW5zaWduZWQgY2hhciAqKTB4ZjAwMDA0MDAgPT0gMHgwMCkgJiYKIAkgICAgKCoodW5zaWduZWQgY2hhciAqKTB4ZjAwMDA0MDEgPT0gMHgwMSkpCi0JCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG5vLCBib2FyZCBpcyBjcGNpNDA1ICovCisJCXJldHVybiAwOwkJLyogbm8sIGJvYXJkIGlzIGNwY2k0MDUgKi8KIAllbHNlCi0JCXJldHVybiAtMTsgICAgICAgICAgICAgIC8qIHllcywgYm9hcmQgaXMgY3Rlcm0tbTIgKi8KKwkJcmV0dXJuIC0xOwkJLyogeWVzLCBib2FyZCBpcyBjdGVybS1tMiAqLwogI2VuZGlmCiB9CiAKLQogaW50IGNwY2k0MDVfaG9zdCh2b2lkKQogewogCWlmIChtZmRjcihzdHJhcCkgJiBQU1JfUENJX0FSQklUX0VOKQotCQlyZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiB5ZXMsIGJvYXJkIGlzIGNwY2k0MDUgaG9zdCAqLworCQlyZXR1cm4gLTE7CQkvKiB5ZXMsIGJvYXJkIGlzIGNwY2k0MDUgaG9zdCAqLwogCWVsc2UKLQkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogbm8sIGJvYXJkIGlzIGNwY2k0MDUgYWRhcHRlciAqLworCQlyZXR1cm4gMDsJCS8qIG5vLCBib2FyZCBpcyBjcGNpNDA1IGFkYXB0ZXIgKi8KIH0KIAotCiBpbnQgY3BjaTQwNV92ZXJzaW9uKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBjbnRybDBSZWc7CkBAIC0yMzUsOCArMjI4LDggQEAKIAltdGRjcihjbnRybDAsIGNudHJsMFJlZyB8IDB4MDMwMDAwMDApOwogCW91dF9iZTMyKCh2b2lkKilHUElPMF9PRFIsIGluX2JlMzIoKHZvaWQqKUdQSU8wX09EUikgJiB+MHgwMDE4MDAwMCk7CiAJb3V0X2JlMzIoKHZvaWQqKUdQSU8wX1RDUiwgaW5fYmUzMigodm9pZCopR1BJTzBfVENSKSAmIH4weDAwMTgwMDAwKTsKLQl1ZGVsYXkoMTAwMCk7ICAgICAgICAgICAgICAgICAgIC8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZWFkaW5nIGlucHV0ICovCi0JdmFsdWUgPSBpbl9iZTMyKCh2b2lkKilHUElPMF9JUikgJiAweDAwMTgwMDAwOyAgICAgICAvKiBnZXQgY29uZmlnIGJpdHMgKi8KKwl1ZGVsYXkoMTAwMCk7CQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlYWRpbmcgaW5wdXQgKi8KKwl2YWx1ZSA9IGluX2JlMzIoKHZvaWQqKUdQSU8wX0lSKSAmIDB4MDAxODAwMDA7CSAgICAgLyogZ2V0IGNvbmZpZyBiaXRzICovCiAKIAkvKgogCSAqIFJlc3RvcmUgR1BJTyBzZXR0aW5ncwpAQCAtMjYyLDEzICsyNTUsMTEgQEAKIAl9CiB9CiAKLQogaW50IG1pc2NfaW5pdF9mICh2b2lkKQogewogCXJldHVybiAwOyAgLyogZHVtbXkgaW1wbGVtZW50YXRpb24gKi8KIH0KIAotCiBpbnQgbWlzY19pbml0X3IgKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBjbnRybDBSZWc7CkBAIC00MzIsNyArNDIzLDYgQEAKIAlyZXR1cm4gKDApOwogfQogCi0KIC8qCiAgKiBDaGVjayBCb2FyZCBJZGVudGl0eToKICAqLwpAQCAtNDg4LDcgKzQ3OCw3IEBACiAJfQogCiAjaWZuZGVmIENPTkZJR19DUENJNDA1X1ZFUjIKLQlwdXRzICgiXG5GUEdBOiAgIik7CisJcHV0cyAoIlxuRlBHQToJIik7CiAKIAkvKiBkaXNwbGF5IGluZm9zIG9uIGZwZ2FpbWFnZSAqLwogCWluZGV4ID0gMTU7CkBAIC01MTUsNyArNTA1LDYgQEAKIAlyZXR1cm4gKDQqMTAyNCoxMDI0IDw8ICgodmFsICYgMHgwMDBlMDAwMCkgPj4gMTcpKTsKIH0KIAotCiB2b2lkIHJlc2V0X3BoeSh2b2lkKQogewogI2lmZGVmIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAKQEAgLTUyNyw3ICs1MTYsNiBAQAogI2VuZGlmCiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWZkZWYgQ09ORklHX0NQQ0k0MDVfVkVSMgpAQCAtNTUwLDcgKzUzOCw2IEBACiAjZW5kaWYgLyogQ09ORklHX0lERV9SRVNFVCAqLwogI2VuZGlmIC8qIENPTkZJR19DUENJNDA1X1ZFUjIgKi8KIAotCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogdm9pZCBjcGNpNDA1X3BjaV9maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQogewpAQCAtNTg3LDExICs1NzQsMTEgQEAKIAogI2lmZGVmIENPTkZJR19DUENJNDA1QUIKIAotI2RlZmluZSBPTkVfV0lSRV9DTEVBUiAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKENGR19GUEdBX0JBU0VfQUREUiArIENGR19GUEdBX01PREUpIFwKKyNkZWZpbmUgT05FX1dJUkVfQ0xFQVIJICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKENGR19GUEdBX0JBU0VfQUREUiArIENGR19GUEdBX01PREUpIFwKIAkJCSAgfD0gQ0ZHX0ZQR0FfTU9ERV8xV0lSRV9ESVIpCi0jZGVmaW5lIE9ORV9XSVJFX1NFVCAgICAgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoQ0ZHX0ZQR0FfQkFTRV9BRERSICsgQ0ZHX0ZQR0FfTU9ERSkgXAorI2RlZmluZSBPTkVfV0lSRV9TRVQJICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKENGR19GUEdBX0JBU0VfQUREUiArIENGR19GUEdBX01PREUpIFwKIAkJCSAgJj0gfkNGR19GUEdBX01PREVfMVdJUkVfRElSKQotI2RlZmluZSBPTkVfV0lSRV9HRVQgICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKENGR19GUEdBX0JBU0VfQUREUiArIENGR19GUEdBX1NUQVRVUykgXAorI2RlZmluZSBPTkVfV0lSRV9HRVQJICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKENGR19GUEdBX0JBU0VfQUREUiArIENGR19GUEdBX1NUQVRVUykgXAogCQkJICAmIENGR19GUEdBX01PREVfMVdJUkUpCiAKIC8qCkBAIC02MTQsNyArNjAxLDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KIC8qCiAgKiBTZW5kIDEgYSAxLXdpcmUgd3JpdGUgYml0LgogICogUHJvdmlkZSAxMHVzIHJlY292ZXJ5IHRpbWUuCkBAIC02NDAsNyArNjI2LDYgQEAKIAl9CiB9CiAKLQogLyoKICAqIFJlYWQgYSBiaXQgZnJvbSB0aGUgMS13aXJlIGJ1cyBhbmQgcmV0dXJuIGl0LgogICogUHJvdmlkZSAxMHVzIHJlY292ZXJ5IHRpbWUuCkBAIC02NjAsNyArNjQ1LDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KIHZvaWQgT1dXcml0ZUJ5dGUoaW50IGRhdGEpCiB7CiAJaW50IGxvb3A7CkBAIC02NzEsNyArNjU1LDYgQEAKIAl9CiB9CiAKLQogaW50IE9XUmVhZEJ5dGUodm9pZCkKIHsKIAlpbnQgbG9vcCwgcmVzdWx0ID0gMDsKQEAgLTY4Niw3ICs2NjksNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQogaW50IGRvX29uZXdpcmUoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgdmFsOwpAQCAtNzI3LDcgKzcwOSw2IEBACiAJTlVMTAogCSk7CiAKLQogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSXzIJMHg1MQkvKiBFRVBST00gQ0FUMjhXQzMyCQkqLwogI2RlZmluZSBDRkdfRU5WX1NJWkVfMgkweDgwMAkvKiAyMDQ4IGJ5dGVzIG1heSBiZSB1c2VkIGZvciBlbnYgdmFycyovCiAKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNTIwMC9jcGNpNTIwMC5jIGIvYm9hcmQvZXNkL2NwY2k1MjAwL2NwY2k1MjAwLmMKaW5kZXggYTkyNWI4NC4uYWRiODU5NyAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NwY2k1MjAwL2NwY2k1MjAwLmMKKysrIGIvYm9hcmQvZXNkL2NwY2k1MjAwL2NwY2k1MjAwLmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQogCiB2b2lkIGluaXRfaWRlX3Jlc2V0KHZvaWQpCiB7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAkJKih2dV9sb25nICopIE1QQzVYWFhfV1VfR1BJT19EQVRBX08gfD0gR1BJT19QU0MxXzQ7CiAJfQogfQotI2VuZGlmCQkJCS8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCiAKICNkZWZpbmUgTVBDNVhYWF9TSU1QTEVJT19HUElPX0VOQUJMRSAgICAgICAoTVBDNVhYWF9HUElPICsgMHgwMDA0KQogI2RlZmluZSBNUEM1WFhYX1NJTVBMRUlPX0dQSU9fRElSICAgICAgICAgIChNUEM1WFhYX0dQSU8gKyAweDAwMEMpCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY3BjaTUyMDAvdS1ib290LmxkcyBiL2JvYXJkL2VzZC9jcGNpNTIwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM0MzJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2VzZC9jcGNpNTIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY3BjaTc1MC9pZGUuYyBiL2JvYXJkL2VzZC9jcGNpNzUwL2lkZS5jCmluZGV4IGJlYTk5Y2UuLjAxYjkwYzYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jcGNpNzUwL2lkZS5jCisrKyBiL2JvYXJkL2VzZC9jcGNpNzUwL2lkZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgotI2lmZGVmIENGR19DTURfSURFCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNpbmNsdWRlIDxhdGEuaD4KICNpbmNsdWRlIDxpZGUuaD4KICNpbmNsdWRlIDxwY2kuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNzUwL3NkcmFtX2luaXQuYyBiL2JvYXJkL2VzZC9jcGNpNzUwL3NkcmFtX2luaXQuYwppbmRleCBjMDk0NzU1Li43OGQxODgwIDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvY3BjaTc1MC9zZHJhbV9pbml0LmMKKysrIGIvYm9hcmQvZXNkL2NwY2k3NTAvc2RyYW1faW5pdC5jCkBAIC0xMjUyLDcgKzEyNTIsNyBAQAogLyogc2V0cyB1cCB0aGUgR1QgcHJvcGVybHkgd2l0aCBpbmZvcm1hdGlvbiBwYXNzZWQgaW4gKi8KIGludCBzZXR1cF9zZHJhbSAoQVVYX01FTV9ESU1NX0lORk8gKiBpbmZvKQogewotCXVsb25nIHRtcCwgY2hlY2s7CisJdWxvbmcgdG1wOwogCXVsb25nIHRtcF9zZHJhbV9tb2RlID0gMDsJLyogMHgxNDFjICovCiAJdWxvbmcgdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMDsJLyogMHgxNDA0ICovCiAJaW50IGk7CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY3BjaTc1MC9zZXJpYWwuYyBiL2JvYXJkL2VzZC9jcGNpNzUwL3NlcmlhbC5jCmluZGV4IGJhMzJhYzEuLmUxYWYzN2UgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jcGNpNzUwL3NlcmlhbC5jCisrKyBiL2JvYXJkL2VzZC9jcGNpNzUwL3NlcmlhbC5jCkBAIC04MCw3ICs4MCw3IEBACiAJfQogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIHZvaWQga2dkYl9zZXJpYWxfaW5pdCAodm9pZCkKIHsKIH0KQEAgLTEwNCw0ICsxMDQsNCBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL21lY3A1MjAwL21lY3A1MjAwLmMgYi9ib2FyZC9lc2QvbWVjcDUyMDAvbWVjcDUyMDAuYwppbmRleCBjNGI5MWU5Li5lYTQ5ZjI2IDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvbWVjcDUyMDAvbWVjcDUyMDAuYworKysgYi9ib2FyZC9lc2QvbWVjcDUyMDAvbWVjcDUyMDAuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogI2RlZmluZSBHUElPX1BTQzFfNAkweDAxMDAwMDAwVUwKIApAQCAtMjE4LDcgKzIxOCw3IEBACiAJZWxzZQogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9XVV9HUElPX0RBVEFfTyB8PSBHUElPX1BTQzFfNDsKIH0KLSNlbmRpZgkJCQkvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjZGVmaW5lIE1QQzVYWFhfU0lNUExFSU9fR1BJT19FTkFCTEUgICAgICAgKE1QQzVYWFhfR1BJTyArIDB4MDAwNCkKICNkZWZpbmUgTVBDNVhYWF9TSU1QTEVJT19HUElPX0RJUiAgICAgICAgICAoTVBDNVhYWF9HUElPICsgMHgwMDBDKQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL21lY3A1MjAwL3UtYm9vdC5sZHMgYi9ib2FyZC9lc2QvbWVjcDUyMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5OWRkMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9lc2QvbWVjcDUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9vY3J0Yy9jbWRfb2NydGMuYyBiL2JvYXJkL2VzZC9vY3J0Yy9jbWRfb2NydGMuYwppbmRleCBmZmJiNGFkLi40MTc3ZjY4IDEwMDY0NAotLS0gYS9ib2FyZC9lc2Qvb2NydGMvY21kX29jcnRjLmMKKysrIGIvYm9hcmQvZXNkL29jcnRjL2NtZF9vY3J0Yy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8NDA1Z3BfcGNpLmg+CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAvKgogICogU2V0IGRldmljZSBudW1iZXIgb24gcGNpIGJvYXJkCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvcGNpNDA1L2NtZF9wY2k0MDUuYyBiL2JvYXJkL2VzZC9wY2k0MDUvY21kX3BjaTQwNS5jCmluZGV4IDAzMTVjM2QuLjViNWFkOGMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9wY2k0MDUvY21kX3BjaTQwNS5jCisrKyBiL2JvYXJkL2VzZC9wY2k0MDUvY21kX3BjaTQwNS5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSAicGNpNDA1LmgiCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiBleHRlcm4gaW50IGRvX2Jvb3RtIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKIGV4dGVybiBpbnQgZG9fYm9vdHZ4IChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9wZjUyMDAvcGY1MjAwLmMgYi9ib2FyZC9lc2QvcGY1MjAwL3BmNTIwMC5jCmluZGV4IDc3ZTE2NGIuLjQ4YjgwYmYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9wZjUyMDAvcGY1MjAwLmMKKysrIGIvYm9hcmQvZXNkL3BmNTIwMC9wZjUyMDAuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCh2b2lkKQogewpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9IEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZgkJCQkvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjZGVmaW5lIE1QQzVYWFhfU0lNUExFSU9fR1BJT19FTkFCTEUgICAgICAgKE1QQzVYWFhfR1BJTyArIDB4MDAwNCkKICNkZWZpbmUgTVBDNVhYWF9TSU1QTEVJT19HUElPX0RJUiAgICAgICAgICAoTVBDNVhYWF9HUElPICsgMHgwMDBDKQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL3BmNTIwMC91LWJvb3QubGRzIGIvYm9hcmQvZXNkL3BmNTIwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM0MzJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2VzZC9wZjUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL3BsdTQwNS9mcGdhZGF0YS5jIGIvYm9hcmQvZXNkL3BsdTQwNS9mcGdhZGF0YS5jCmluZGV4IGY2NjU2YzEuLmRjOGM4OGIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9wbHU0MDUvZnBnYWRhdGEuYworKysgYi9ib2FyZC9lc2QvcGx1NDA1L2ZwZ2FkYXRhLmMKQEAgLTEsMTE2MCArMSwxMTc5IEBACi0gIDB4MWYsMHg4YiwweDA4LDB4MDgsMHg5ZCwweDc2LDB4NWMsMHgzZiwweDAwLDB4MDMsMHg3MCwweDZjLDB4NzUsMHgzNCwweDMwLDB4MzUsCi0gIDB4NWYsMHgzMSwweDVmLDB4MzAsMHgzMCwweDJlLDB4NjIsMHg2OSwweDc0LDB4MDAsMHg5NCwweDliLDB4N2YsMHg2YywweDFkLDB4NTUsCi0gIDB4NzYsMHhjNywweGNmLDB4ZmMsMHhiMCwweDNkLDB4ZjYsMHg3YiwweGYxLDB4OWIsMHgyNCwweDc2LDB4ZWIsMHg2ZSwweDgyLDB4MzMsCi0gIDB4ZmUsMHg0MSwweGY0LDB4NDgsMHg5ZiwweDVmLDB4NWUsMHg5YywweDFmLDB4MTgsMHg2MywweGVjLDB4ODksMHgxMywweGVkLDB4NWEsCi0gIDB4NGIsMHhkYSwweDU4LDB4MmEsMHhhZCwweDU2LDB4MTUsMHg2MiwweDBkLDB4OWIsMHhhZCwweGEyLDB4Y2EsMHg0NCwweGE2LDB4ZGIsCi0gIDB4NTYsMHg1MSwweGJhLDB4MGQsMHhkNywweDcxLDB4MjAsMHgwNiwweDdiLDB4ODksMHhhMSwweDQ4LDB4MDQsMHg5YSwweGQyLDB4MTcsCi0gIDB4ODgsMHg4NCwweDA1LDB4ZDYsMHhlYSwweGU1LDB4NDcsMHg4OSwweDIxLDB4MjksMHg0YywweDhjLDB4ODEsMHgwNywweDRkLDB4ODMsCi0gIDB4OWIsMHhhMCwweDJhLDB4MWIsMHg2OCwweDc4LDB4NTAsMHgyZiwweDk4LDB4MTAsMHhiMiwweGNlLDB4OGYsMHgwNiwweDkzLDB4MzgsCi0gIDB4NzEsMHhlZiwweDlkLDB4OTksMHg3YiwweGU3LDB4Y2UsMHhhZiwweDY3LDB4YWYsMHhmNywweDhmLDB4M2QsMHg5OSwweDc3LDB4MzUsCi0gIDB4ZGMsMHg3MywweGRlLDB4OWQsMHg3MywweDNlLDB4ZjMsMHgzZCwweGU3LDB4NDEsMHg3MSwweDZjLDB4ZDIsMHhmYSwweDFmLDB4ODAsCi0gIDB4ZjAsMHgyMCwweGE4LDB4NWQsMHg5ZCwweDdmLDB4YjcsMHgyYSwweGI1LDB4ZmEsMHhhNywweDJiLDB4N2UsMHg5YSwweDRhLDB4MjUsCi0gIDB4YjcsMHhmYywweDZjLDB4MTMsMHgzYywweDA0LDB4OTEsMHhmYSwweDVmLDB4YWMsMHg0ZSwweGZkLDB4ZmMsMHg2ZiwweDFmLDB4NTksCi0gIDB4YjEsMHg2YSwweDE1LDB4ZmMsMHgwYywweGZmLDB4MmIsMHg5NSwweDVhLDB4YjksMHgzYywweDc1LDB4ZDcsMHhmMiwweDU0LDB4MDMsCi0gIDB4NmMsMHg4MiwweGUyLDB4MTUsMHhhYiwweDFhLDB4NTcsMHhhZSwweDY4LDB4YWMsMHg1ZiwweDA1LDB4M2YsMHgwNywweDYxLDB4ZTUsCi0gIDB4ZmUsMHgxOSwweGZjLDB4ZjcsMHhlYSwweGYzLDB4N2YsMHhmZSwweDU3LDB4MjksMHg0MCwweDAyLDB4MDAsMHgxNCwweGE1LDB4ODQsCi0gIDB4MGUsMHhmMiwweGZmLDB4OTEsMHg5NCwweGEwLDB4MDksMHg4MCwweDVhLDB4ZWEsMHg1MiwweDYwLDB4OTAsMHg3ZiwweDgzLDB4ZmQsCi0gIDB4NzksMHg3MSwweDBhLDB4MzQsMHhmZSwweGRmLDB4NDIsMHgwYSwweDc0LDB4NjgsMHgwNywweGJkLDB4MWYsMHgxNiwweGE4LDB4MzAsCi0gIDB4ZWIsMHg5ZiwweGEwLDB4Y2IsMHg4OCwweGRhLDB4YmYsMHhlNywweGZhLDB4OTksMHgwZiwweDUxLDB4ZTgsMHgzMiwweGU3LDB4YWYsCi0gIDB4ZTUsMHg3MiwweDlhLDB4OWEsMHg2MiwweDZhLDB4MmUsMHhmNywweDA3LDB4NzYsMHhmZiwweGIzLDB4NzMsMHhiYSwweGZmLDB4MzUsCi0gIDB4N2EsMHhmZiwweGRmLDB4NzcsMHgzZCwweDJjLDB4OTgsMHhjMywweDcyLDB4MDAsMHg5OSwweGVkLDB4YzcsMHgwYSwweDhmLDB4MGMsCi0gIDB4NzgsMHg4NywweDFkLDB4YTAsMHg0MiwweDIxLDB4MDgsMHhjNCwweGE4LDB4MDAsMHhkMSwweDc1LDB4ZmYsMHg1MSwweGJhLDB4ZmUsCi0gIDB4NzgsMHhjMSwweDJkLDB4OTgsMHg0MSwweDJkLDB4ZTMsMHhhNSwweDViLDB4YTUsMHgyZCwweGVhLDB4MGQsMHhmNCwweDA3LDB4YjksCi0gIDB4ZDgsMHg5NCwweDg0LDB4YWYsMHhlYywweDZjLDB4YjEsMHg4YywweGNmLDB4OTAsMHg2OSwweDRjLDB4Y2EsMHg1ZCwweGY2LDB4ZmEsCi0gIDB4OTEsMHg4YSwweDhiLDB4NzAsMHgxNCwweDI1LDB4MGQsMHg2NSwweDhmLDB4OTgsMHg5NCwweGIxLDB4ZjEsMHg3OSwweGRmLDB4YjAsCi0gIDB4NjgsMHg1ZSwweGM5LDB4NDUsMHgxYywweDQzLDB4Y2EsMHhjOCwweDM0LDB4OGEsMHg1OSwweGU4LDB4ODcsMHg0MywweDEwLDB4Y2YsCi0gIDB4ZmUsMHgyMCwweDI1LDB4OWUsMHhjMCwweDQ2LDB4YWQsMHhiMSwweGM4LDB4MzIsMHgxMiwweDQ2LDB4ODQsMHgxOCwweGZmLDB4NjQsCi0gIDB4MTksMHg5NywweDA1LDB4N2EsMHg3ZiwweDAzLDB4ODYsMHhlMCwweDI4LDB4YmUsMHhhOCwweDBjLDB4OGIsMHhjNCwweDQ4LDB4MWEsCi0gIDB4OTEsMHg4YywweDc4LDB4YzEsMHg2ZCwweGY0LDB4NjUsMHg2MCwweDEyLDB4YmIsMHg2NCwweGZkLDB4YWQsMHgyZCwweGJmLDB4MDAsCi0gIDB4MzcsMHhhMCwweGQxLDB4MjgsMHhjZCwweDQ4LDB4YzQsMHg1OCwweDYzLDB4YzQsMHgyYywweGEzLDB4ZDksMHgzMiwweDNlLDB4YjEsCi0gIDB4OGMsMHgzMSwweGEwLDB4ZjcsMHg0ZiwweDBiLDB4YzcsMHg2MCwweDA2LDB4NWEsMHg4YywweGQ4LDB4YTQsMHhmNCwweDRiLDB4NmEsCi0gIDB4NGMsMHhmYiwweDhjLDB4NDEsMHg3NiwweDdmLDB4NDMsMHgxZCwweDMyLDB4ZWYsMHgxNiwweDdkLDB4NTMsMHg0YSwweDEwLDB4ZTMsCi0gIDB4MzgsMHg3ZiwweDViLDB4ZmEsMHgxZiwweDVhLDB4NzgsMHgxNSwweDM0LDB4YmEsMHhiZSwweDIwLDB4NjEsMHg2ZSwweDUyLDB4NTksCi0gIDB4MDUsMHgwOSwweGY4LDB4NDYsMHhiNCwweGI3LDB4N2QsMHhiNywweGM3LDB4OTEsMHhjYiwweGY4LDB4ZjQsMHhkYiwweGViLDB4ZTUsCi0gIDB4MGQsMHg2NiwweDM0LDB4OGEsMHhjYiwweGM0LDB4YTgsMHgyZiwweDJjLDB4MmMsMHg1MCwweDUzLDB4NzIsMHhiYiwweGJkLDB4N2UsCi0gIDB4NGEsMHg3ZCwweDAwLDB4OGUsMHhhMCwweGJhLDB4NWMsMHhmMSwweDRmLDB4YzQsMHg0YSwweDc4LDB4MDUsMHhkNSwweDRkLDB4NDQsCi0gIDB4YjYsMHg4YSwweGU3LDB4MTAsMHhiOSwweDQyLDB4MGMsMHhiMCwweDhkLDB4NWIsMHhlYywweGZlLDB4NmQsMHhjYSwweDA2LDB4YjgsCi0gIDB4ODIsMHgzNywweDM5LDB4NGYsMHg5NSwweDRhLDB4OGQsMHgyYiwweGRkLDB4NGQsMHgxMywweGIxLDB4NTQsMHhjZCwweDQ5LDB4MzgsCi0gIDB4MGQsMHg0ZCwweDQ2LDB4MmMsMHgyNSwweDlkLDB4YzAsMHgxZiwweDM1LDB4OGQsMHg2MiwweGUzLDB4MTQsMHgzYiwweDFkLDB4N2EsCi0gIDB4ZjksMHgzMSwweDk5LDB4MDQsMHgyMSwweDk5LDB4MjEsMHhkMSwweDUwLDB4NWIsMHg0NiwweDYzLDB4OTcsMHgyYywweGMzLDB4MTUsCi0gIDB4OWYsMHhiMSwweDQyLDB4MWEsMHgxZiwweDQ1LDB4YjYsMHhlMiwweDEzLDB4MWIsMHhhOCwweDIxLDB4ZDEsMHg0OCwweDdhLDB4ZTIsCi0gIDB4NmYsMHgxYiwweGU3LDB4NTksMHhmYywweDRmLDB4NTQsMHhlYywweDg1LDB4MjMsMHg1MCwweDY3LDB4NDQsMHhiYSwweGM0LDB4NGYsCi0gIDB4NGQsMHhhMywweDk0LDB4MWEsMHgxMSwweGNlLDB4YjgsMHgyYywweGQzLDB4ZmIsMHg2YiwweGYwLDB4MjIsMHg3NiwweGVhLDB4ZTEsCi0gIDB4NWMsMHhlNCwweDI3LDB4ZTIsMHgzOSwweDgxLDB4NzgsMHhkNywweGM3LDB4YjksMHhjOSwweDhjLDB4MWMsMHg4YiwweDdmLDB4YTcsCi0gIDB4ZGMsMHg2ZiwweDA1LDB4NmQsMHg1OCwweDNjLDB4MjEsMHgxMCwweGUzLDB4MDcsMHhhZSwweGYzLDB4NjYsMHgxYiwweGE3LDB4ZDgsCi0gIDB4ZjksMHg5YywweDI4LDB4OWYsMHg4MCwweGViLDB4ZDAsMHg4YywweDYyLDB4ODMsMHgzZCwweGI2LDB4OTEsMHg5NiwweDg4LDB4YjEsCi0gIDB4OWQsMHgxYSwweGU2LDB4OTUsMHhlYiwweDZjLDB4M2YsMHg2ZCwweDQyLDB4MWEsMHhhNiwweGEwLDB4MTksMHg2MiwweDQ4LDB4Y2EsCi0gIDB4OTksMHg0NiwweDI5LDB4MzEsMHg4NiwweGY5LDB4MmIsMHhkOCwweDM4LDB4MDUsMHhmNCwweGZlLDB4OGEsMHhiYSwweDFmLDB4YmUsCi0gIDB4ODcsMHg2NiwweDNkLDB4MzYsMHgyMCwweDZkLDB4YjIsMHg4ZCwweDc1LDB4ZTMsMHhmNCwweDBhLDB4MzMsMHg0NiwweGQ4LDB4N2UsCi0gIDB4MTAsMHg0ZSwweGI1LDB4NmYsMHg0MCwweDUyLDB4OGYsMHhlYywweDkxLDB4NmMsMHg2MywweDQwLDB4MWMsMHgxNywweGE4LDB4NjEsCi0gIDB4NWUsMHgyOSwweDFkLDB4YzAsMHhmZSwweGQyLDB4MmMsMHhkOCwweDUwLDB4NTAsMHg2YiwweDJkLDB4N2IsMHg0NiwweGFjLDB4NjUsCi0gIDB4ZWIsMHg2NSwweGQ3LDB4N2EsMHg2YywweGJjLDB4YzcsMHhjZSwweDgzLDB4NTYsMHgyNiwweGMzLDB4MDEsMHg0OCwweGI0LDB4ZjcsCi0gIDB4MGQsMHgyYywweDU4LDB4NGYsMHgwYywweDNkLDB4YTIsMHg4YSwweGEzLDB4NmUsMHhhMywweDQ0LDB4MTUsMHg0NywweDA0LDB4N2EsCi0gIDB4MWUsMHhiNiwweGNlLDB4ZWIsMHhhMCwweDRlLDB4NjksMHg4ZSwweGUzLDB4NWUsMHg3ZiwweDRmLDB4NGEsMHhmNCwweDdjLDB4ZWUsCi0gIDB4MjksMHhiNywweDlkLDB4MWEsMHhiMywweGJkLDB4ZGIsMHg4ZCwweGRkLDB4OTQsMHg1ZCwweGZlLDB4OTYsMHgwZSwweDQ4LDB4NWYsCi0gIDB4MTYsMHhkMiwweGYzLDB4NTAsMHg1MSwweDYwLDB4NWQsMHg1YywweDMyLDB4NTYsMHg1MywweGViLDB4MGIsMHgwYiwweDMzLDB4ZGUsCi0gIDB4NjMsMHhlNywweGE3LDB4NDEsMHhjOSwweGM5LDB4YzMsMHg5MCwweDU0LDB4MjIsMHg0OCwweGQ0LDB4Y2MsMHg2ZCwweDYwLDB4ODMsCi0gIDB4ZWMsMHgyNywweGU5LDB4MzIsMHg0ZSwweGIyLDB4NzgsMHhiNiwweDk1LDB4ZWYsMHgyNCwweDRlLDB4YjUsMHg0NiwweGQ0LDB4YzIsCi0gIDB4OWQsMHhjYSwweDAxLDB4YTEsMHhkMywweDc2LDB4NTMsMHgyMCwweGZlLDB4MTYsMHgzMiwweGM3LDB4NGYsMHhiMSwweGZjLDB4YjMsCi0gIDB4NDcsMHhkZSwweDZmLDB4MDYsMHg2ZCwweGQxLDB4NDAsMHgwOSwweDMxLDB4OTYsMHhiOSwweGMyLDB4ZTgsMHhjNCwweDkzLDB4OWQsCi0gIDB4ODcsMHhiNCwweGVkLDB4NmYsMHg0NCwweDk1LDB4YzgsMHgxNywweDlkLDB4MGMsMHhkZSwweGZmLDB4MDQsMHhjYiwweDlmLDB4NTksCi0gIDB4YzEsMHgzYSwweDBmLDB4YmIsMHg5ZiwweGU5LDB4YzEsMHhlNywweDQxLDB4NjAsMHhjYiwweGI2LDB4YmIsMHhkNiwweDVmLDB4NjcsCi0gIDB4ZjksMHg0NywweDUxLDB4ZWQsMHhmMywweGQ2LDB4MmQsMHg3OSwweDBlLDB4MWUsMHg2ZiwweDdjLDB4MjgsMHhkMywweGYzLDB4MWYsCi0gIDB4MmYsMHg4OCwweGMzLDB4OWIsMHg5MCwweDQ0LDB4ZjcsMHg4ZSwweDhiLDB4MTMsMHhjNCwweGU4LDB4OGUsMHhhNCwweGM1LDB4MDksCi0gIDB4ZjksMHg0ZCwweGQ4LDB4ODIsMHhlZSwweDRkLDB4NWIsMHg1NywweDUwLDB4MjQsMHgyZCwweDNkLDB4YzksMHhjZSwweDQzLDB4ZGMsCi0gIDB4Y2UsMHgzZiwweDhiLDB4MzQsMHhiNSwweDVmLDB4ZjUsMHgzZSwweDI2LDB4Y2MsMHhmOCwweDEwLDB4ZTgsMHhmNywweDhiLDB4ZTAsCi0gIDB4N2UsMHhmMiwweDkwLDB4OWUsMHg4OCwweDc0LDB4MDQsMHgzYywweGI2LDB4Y2MsMHgxOCwweDY0LDB4ZjcsMHhlZiwweDQ1LDB4MGYsCi0gIDB4YTgsMHhkZiwweGExLDB4N2IsMHg3MiwweGIxLDB4Y2QsMHhkMiwweDhiLDB4NjAsMHgxYSwweDViLDB4YTUsMHg3MywweGQ4LDB4YTgsCi0gIDB4YTMsMHg4NiwweDc5LDB4ZTUsMHgzYywweGNiLDB4M2YsMHg0YSwweGI5LDB4OWQsMHg0ZiwweGQyLDB4NWMsMHgxYSwweDkxLDB4YmQsCi0gIDB4ZjksMHg2NCwweDg0LDB4ZTUsMHgxZiwweDkwLDB4ZGYsMHgyMiwweGY1LDB4ZWIsMHg2YSwweGVjLDB4NmIsMHg2OSwweDNiLDB4MzEsCi0gIDB4NzIsMHhhNSwweDY2LDB4ZmQsMHgxYSwweGIwLDB4ZWIsMHhkNywweDhjLDB4NTUsMHhiZiwweDBjLDB4NzYsMHg3ZSwweDA2LDB4MmIsCi0gIDB4ZjYsMHhlYSwweDc4LDB4OTMsMHgxMywweDkxLDB4NmQsMHhlMiwweDYyLDB4YmEsMHhkYiwweDkzLDB4YmQsMHhkZSwweGZkLDB4OWYsCi0gIDB4NjcsMHhkZiwweDJmLDB4MjAsMHgzYiwweDVmLDB4ZTksMHhhMiwweGU5LDB4YjgsMHg1MSwweDgyLDB4OTcsMHhhMSwweDIzLDB4ZjAsCi0gIDB4YjAsMHg2YiwweGJkLDB4YzEsMHhmMiwweDhmLDB4NDYsMHhmMywweDhmLDB4Y2EsMHhlNywweDczLDB4YWYsMHg5MSwweDY1LDB4ZTcsCi0gIDB4NzMsMHhkMCwweGY0LDB4MTcsMHgyNywweGQ1LDB4NWUsMHhhOSwweGQzLDB4ZjQsMHhhZSwweDM0LDB4MzAsMHg3ZiwweGIyLDB4ZmQsCi0gIDB4MjAsMHhjMSwweGJlLDB4MzgsMHg1OCwweDk0LDB4ZjAsMHgyZCwweDYzLDB4NDYsMHg4ZSwweGU1LDB4OWYsMHgyYSwweGY1LDB4OTgsCi0gIDB4NjIsMHgyNiwweDZkLDB4NjMsMHhkZCwweDJmLDB4ZTEsMHg3NywweGI0LDB4Y2MsMHg3ZCwweGU2LDB4YTksMHg3NywweDY4LDB4M2QsCi0gIDB4NWQsMHhiZiwweDRmLDB4ZWUsMHhiNCwweDhhLDB4NTQsMHg1YywweDRjLDB4ZDgsMHhmOSwweGRjLDB4NWIsMHg3ZiwweGIxLDB4ZTEsCi0gIDB4ZTQsMHgxZiwweDI0LDB4NTgsMHhmNSwweDJlLDB4ZDIsMHhkYiwweDlhLDB4MDgsMHhhOSwweGQ3LDB4ZDgsMHg0OCwweGIzLDB4ZjMsCi0gIDB4YTAsMHg5NCwweDk5LDB4NjEsMHhjOSwweDQ2LDB4MzIsMHg0OSwweDZjLDB4YTgsMHg4OSwweGIxLDB4N2IsMHg1MywweGUyLDB4N2YsCi0gIDB4MjIsMHg2ZiwweDdjLDB4OWMsMHhmYywweDAzLDB4YmYsMHgyMiwweGZiLDB4NjksMHhjOSwweGUyLDB4NDMsMHhmZSwweDMwLDB4N2MsCi0gIDB4YTMsMHgzNywweDhmLDB4MTEsMHgzNywweDkxLDB4YTcsMHhmZSwweDRhLDB4ODgsMHhlNSwweDlmLDB4NzQsMHhmOSwweDM0LDB4M2MsCi0gIDB4MGEsMHg3OCwweGQ5LDB4N2MsMHhlOSwweDk4LDB4NDYsMHhmYywweDJkLDB4OWQsMHg5NCwweGJlLDB4NDUsMHhkZSwweGZhLDB4M2UsCi0gIDB4MjEsMHgzMiwweGRlLDB4MzAsMHhmOSwweGE3LDB4MzksMHgxNywweGZiLDB4YTIsMHhhNywweDk5LDB4OWUsMHg5NiwweDIxLDB4ZjQsCi0gIDB4MTEsMHg3MiwweDlmLDB4OWYsMHg0OSwweDc2LDB4N2UsMHg5MCwweDZhLDB4NDMsMHhjZSwweDkwLDB4OTgsMHgyYywweDMwLDB4OGQsCi0gIDB4Y2MsMHg0MywweDMzLDB4N2EsMHg5ZiwweDliLDB4N2YsMHhjNCwweDFjLDB4ZmIsMHg3ZSwweDk1LDB4ODIsMHgxMywweDhhLDB4ZTksCi0gIDB4MTQsMHhmMCwweGU3LDB4YTEsMHg0NywweGY0LDB4ZmEsMHhjYiwweGY2LDB4NTMsMHg2ZSwweDYxLDB4OGYsMHg5NCwweDE2LDB4NjksCi0gIDB4M2MsMHg1YiwweDJmLDB4ODgsMHg3ZCwweDllLDB4NzgsMHg0ZSwweDNhLDB4ZTcsMHhmMywweGQ5LDB4MjEsMHgxYSwweDA0LDB4YjIsCi0gIDB4ZGUsMHgzNCwweDg2LDB4ZTAsMHgzZiwweGRjLDB4ZjEsMHgxMSwweDBkLDB4OTYsMHg3ZiwweDNlLDB4MDcsMHg5YiwweDdmLDB4YjQsCi0gIDB4MDgsMHg4YiwweGM2LDB4YTcsMHgzZSwweGZlLDB4OTksMHhlMiwweGY4LDB4YzcsMHgzZSwweDY2LDB4MDMsMHg1MiwweDgyLDB4N2IsCi0gIDB4MWUsMHg0NSwweDc3LDB4ZmMsMHgyNywweDU5LDB4ZmUsMHhjOSwweGNhLDB4ZjYsMHhiNiwweDlkLDB4ZmQsMHg4YiwweGQzLDB4YmUsCi0gIDB4ZjMsMHhlMCwweGYwLDB4NGYsMHhhZSwweDgwLDB4ZTQsMHg5ZiwweGI4LDB4MTEsMHhiOSwweDIzLDB4MmYsMHhmZiwweGIwLDB4ZmMsCi0gIDB4ZDMsMHgyMSwweDU0LDB4NWEsMHg0NSwweDdmLDB4MzMsMHhlNiwweDlmLDB4MjMsMHgzYiwweGIxLDB4YjEsMHhhZCwweGRhLDB4Y2YsCi0gIDB4MDMsMHg2NywweDM4LDB4ZmUsMHg4OSwweGVhLDB4NTcsMHhhMCwweDIxLDB4MTcsMHg4MywweDQ4LDB4MTQsMHhkMywweGNlLDB4NjIsCi0gIDB4MjMsMHhkNiwweDI4LDB4OWQsMHg4NCwweDJiLDB4OTksMHhhNiwweDFjLDB4ZTUsMHgxZiwweGMzLDB4Y2QsMHgzZiwweGI3LDB4OTksCi0gIDB4ZjEsMHgxOSwweDhkLDB4ZTUsMHgzOCwweGZlLDB4ZDEsMHhjZCwweDJiLDB4ODEsMHhmYywweDMzLDB4NTgsMHhlMCwweDdmLDB4ZmEsCi0gIDB4MmUsMHhhMCwweDZmLDB4NDIsMHhmOSwweDI3LDB4M2IsMHhkZiwweGNlLDB4MjcsMHg3YywweGZlLDB4NGMsMHg4NywweGYzLDB4OGYsCi0gIDB4NjEsMHhmMiwweDRmLDB4OWQsMHhjOSwweDNmLDB4Y2MsMHg0ZCwweGZkLDB4MTUsMHg4ZiwweGJmLDB4OTMsMHgyYywweGZmLDB4YjQsCi0gIDB4OTUsMHhkOSwweDQxLDB4YWIsMHgwZCwweDQ4LDB4M2IsMHg4MSwweGZjLDB4MzMsMHg2OCwweDQxLDB4NGUsMHg4NywweGM0LDB4ZjEsCi0gIDB4Y2YsMHg3OSwweDA3LDB4ODQsMHhiYywweGZjLDB4MDMsMHhiNCwweGU4LDB4ZjQsMHhlNCwweDYwLDB4MmIsMHg2YywweDBmLDB4YWUsCi0gIDB4NDcsMHgzYywweGZmLDB4ZDgsMHg0NSwweDZkLDB4OGYsMHg4NCwweGViLDB4YmIsMHhlNCwweGFmLDB4ZWYsMHg4ZCwweDIxLDB4ZmMsCi0gIDB4ZjMsMHgzNCwweGM3LDB4M2YsMHgzZSwweGMzLDB4YzksMHgzZiwweDE1LDB4NzIsMHgyZCwweGE1LDB4YTMsMHhkYSwweGMwLDB4N2EsCi0gIDB4YmQsMHhjYywweGNkLDB4M2YsMHg4YSwweDJjLDB4NWIsMHg0NSwweDlmLDB4ZjEsMHg0ZiwweDk5LDB4OTcsMHg3ZiwweDIyLDB4M2MsCi0gIDB4ZmYsMHgwYywweDE3LDB4N2IsMHhmOCwweGU3LDB4MjMsMHg4ZiwweGJmLDB4OGQsMHhjNCwweGI4LDB4ZTgsMHhmMCwweGNmLDB4NmQsCi0gIDB4YjYsMHg3NywweDFmLDB4M2IsMHg2ZSwweGZlLDB4ZDYsMHhjNywweDAzLDB4MGUsMHhmZiwweGVjLDB4MzEsMHhmOSwweGE3LDB4NDUsCi0gIDB4NGYsMHg4YywweGY1LDB4OGMsMHhjMywweDRkLDB4ZjIsMHhlOSwweGIzLDB4ZDIsMHhkNSwweDFkLDB4MWYsMHg1OCwweDk4LDB4ZTQsCi0gIDB4YWMsMHg2NywweGY5LDB4YTEsMHg0MSwweDM1LDB4ZjksMHgwNywweDk0LDB4OWQsMHg4YywweDc2LDB4NWEsMHg3MywweGQwLDB4MWIsCi0gIDB4Y2EsMHgzZiwweDAwLDB4OTYsMHg1MywweDBhLDB4ZTcsMHhkZCwweGJiLDB4NGEsMHhiNywweDg1LDB4NzksMHg4ZSwweGJmLDB4ZWMsCi0gIDB4ZmIsMHhhYSwweDI4LDB4YjcsMHhmOCwweDQ3LDB4NzEsMHg4NSwweGYxLDB4ODksMHg3MCwweGZlLDB4MjksMHhiMywweDc4LDB4MjYsCi0gIDB4YmEsMHhjNywweGM2LDB4OTgsMHgwOCwweGQ5LDB4MzYsMHhkZSwweGZmLDB4ZGEsMHhhNywweDAyLDB4ZjksMHg2NywweDEwLDB4NmMsCi0gIDB4MWUsMHg3ZSwweDg2LDB4N2MsMHgyYSwweDU4LDB4ZDgsMHgyMywweDkyLDB4MmIsMHgxYiwweGI5LDB4ZjUsMHhlNywweDU5LDB4ZmUsCi0gIDB4ODksMHg1MywweGZlLDB4NDEsMHhlYiwweDNjLDB4YzcsMHg2YywweDQ5LDB4MzAsMHhmZiwweGM4LDB4ODQsMHg3ZiwweDEyLDB4MjgsCi0gIDB4MzIsMHg0OCwweDY4LDB4NDcsMHg0OCwweGUyLDB4ZDMsMHgyYiwweDY2LDB4NmQsMHhlYywweDYxLDB4ZmMsMHg4MywweDc5LDB4ODYsCi0gIDB4OWUsMHg4NywweGY4LDB4NjMsMHgxNiwweGZmLDB4NDQsMHgxYSwweDBhLDB4ZjMsMHgzYywweDJmLDB4MGUsMHhmZiwweDU0LDB4MDksCi0gIDB4MzYsMHgzNiwweGRjLDB4NDcsMHg5ZiwweGQ2LDB4NWYsMHgwNCwweGYwLDB4Y2YsMHg4NCwweDczLDB4N2YsMHhhNSwweDUyLDB4M2QsCi0gIDB4ZTIsMHg2MCwweDBmLDB4MzYsMHhiNiwweGY1LDB4NTgsMHg0NiwweDI0LDB4OTgsMHg3ZiwweGU2LDB4ZDEsMHhmNywweDI5LDB4M2IsCi0gIDB4N2IsMHg5NCwweGJlLDB4OWUsMHg5NywweDdmLDB4ZjQsMHgwMiwweGY2LDB4OTIsMHg5ZSwweGQ0LDB4YmYsMHg0MywweDJiLDB4ODksCi0gIDB4ODEsMHgwZiwweGU5LDB4NDAsMHhjYiwweDM4LDB4NWYsMHhiZiwweDljLDB4ZjcsMHhkZiwweGMxLDB4ZjksMHgyNiwweGZmLDB4ZTAsCi0gIDB4NGQsMHg0YSwweDBmLDB4NjAsMHg4YywweGE5LDB4YzIsMHhkOSwweDU4LDB4N2EsMHhjMCwweDM4LDB4NGQsMHhkYywweGU0LDB4ZjksCi0gIDB4ODcsMHhjNSwweDdmLDB4MDAsMHhmNiwweDUyLDB4N2YsMHg4OSwweGUzLDB4NTUsMHhlNCwweGQzLDB4MGQsMHhiMCwweDRiLDB4YTgsCi0gIDB4MzMsMHgyNCwweDZlLDB4ZmQsMHg3YiwweDJjLDB4ZmYsMHhmYywweDM1LDB4Y2QsMHgzZiwweDE2LDB4ZmYsMHg2OCwweDg2LDB4OTQsCi0gIDB4YzIsMHhlYiwweDQ5LDB4M2UsMHgyZiwweGU2LDB4ZTIsMHg3OSwweDg2LDB4OWQsMHhjZiwweDg0LDB4Y2QsMHg3YiwweGY4LDB4MjIsCi0gIDB4YTksMHgyZiwweDA3LDB4NzEsMHg3NiwweDJkLDB4ZWEsMHhmNCwweGQ2LDB4MmYsMHhmYywweGZkLDB4ZWEsMHg2YywweDNmLDB4ZjYsCi0gIDB4YzUsMHgzZCwweDAxLDB4ZDgsMHhjMywweDhjLDB4NzEsMHg3NiwweDllLDB4MWYsMHg1MywweGE3LDB4NTUsMHgzMywweDY5LDB4NjcsCi0gIDB4ODQsMHhhNiwweGYwLDB4MTcsMHg3ZiwweGE3LDB4NWUsMHgxZiwweGRmLDB4NjksMHhmMywweGNmLDB4MDAsMHhkMywweDFmLDB4MjQsCi0gIDB4Y2IsMHhlMCwweDQxLDB4MjgsMHhhNywweDMzLDB4ZmUsMHg5MSwweDU5LDB4OTksMHhiMywweGQ3LDB4YTcsMHgwYSwweGFkLDB4MmIsCi0gIDB4OGIsMHg1YywweGJjLDB4NDQsMHhmNywweGFmLDB4ODAsMHg1OSwweGU2LDB4NDYsMHhiMSwweGJmLDB4ZmQsMHgwNCwweDdiLDB4OGUsCi0gIDB4MTMsMHhjMywweDIwLDB4NTcsMHg0YSwweDljLDB4ZjgsMHg1NCwweDhmLDB4MTQsMHhkMCwweGYzLDB4ODAsMHg5NCwweDRlLDB4MGIsCi0gIDB4YzMsMHgwNiwweGE0LDB4YTEsMHhiNCwweDU5LDB4ZGYsMHhhZiwweDkyLDB4NDIsMHhhYywweDM2LDB4OTMsMHg4ZCwweDM5LDB4YmMsCi0gIDB4YzcsMHhmMiwweDU1LDB4ZmEsMHgzNiwweGQzLDB4YTksMHgyYywweDdlLDB4ZmYsMHhiMiwweDFkLDB4YmYsMHhkYywweDhkLDB4ZjksCi0gIDB4NDcsMHhjMywweDU3LDB4NzgsMHhmZSwweDI5LDB4NzAsMHhmMywweDBmLDB4YTMsMHg5ZCwweGJiLDB4ODksMHhmMSwweDE2LDB4N2YsCi0gIDB4ODUsMHgxOCwweDBiLDB4MWQsMHhmZSwweDMxLDB4MzAsMHhmZiwweDdjLDB4NDMsMHg2OSwweGU3LDB4MWIsMHhhNCwweDExLDB4ZWYsCi0gIDB4MTIsMHg1ZSwweGZkLDB4MDcsMHhkNywweDIzLDB4YTYsMHhmZiwweDE0LDB4YjgsMHg5ZSwweGE2LDB4MzgsMHgzMSwweGZhLDB4ZTksCi0gIDB4OTUsMHgwZCwweGQ0LDB4YjgsMHg1YywweGMwLDB4ZjMsMHhjZiwweDZiLDB4OTQsMHgxNiwweDVlLDB4ODMsMHg2YSwweDYyLDB4MjQsCi0gIDB4N2QsMHhmYywweGUwLDB4ZjAsMHg4ZiwweDVlLDB4Y2UsMHg3ZCwweGZiLDB4NTcsMHhhMCwweDkxLDB4MTgsMHhhZiwweGI4LDB4Y2YsCi0gIDB4NDMsMHg1MSwweDQ2LDB4MWEsMHg2MywweGY5LDB4MjcsMHhlMywweGU4LDB4M2YsMHgyYywweDFhLDB4NTcsMHhkZCwweDU3LDB4NzYsCi0gIDB4ZTMsMHhmOCwweGY4LDB4ZjQsMHgxZiwweGZiLDB4NmUsMHg4ZCwweDQ2LDB4MzQsMHhkMywweDczLDB4YmIsMHhlOCwweDNkLDB4OWYsCi0gIDB4MGUsMHhmZiwweDljLDB4MjksMHg3MCwweDYxLDB4NzAsMHhmNSwweDc0LDB4NDksMHgyMywweDJlLDB4NGMsMHg1ZSwweDdlLDB4YmIsCi0gIDB4ZTYsMHhlMSwweDFmLDB4MjcsMHgzZSwweDM5LDB4MjUsMHg4NSwweDFmLDB4OWMsMHg5NywweDQzLDB4ZjksMHg2NywweDkyLDB4ZjIsCi0gIDB4Y2YsMHgzNiwweGYxLDB4MWMsMHg0ZSwweDJjLDB4NTUsMHhiOSwweDkyLDB4YWQsMHg5NiwweDEwLDB4MTQsMHhhYSwweGZmLDB4NDQsCi0gIDB4MmQsMHhjOCwweDY5LDB4MzQsMHg2OSwweGE3LDB4MDEsMHhlZiwweDVmLDB4YWEsMHg4MywweGZmLDB4NzUsMHhmNCwweDlmLDB4YzUsCi0gIDB4MjYsMHhmZiwweGQwLDB4ZTMsMHg0MywweGY5LDB4YzcsMHg4YywweDg2LDB4NGMsMHg4NCwweGEzLDB4ZDgsMHhhNSwweGM4LDB4YjQsCi0gIDB4ZmUsMHg5OSwweDk3LDB4N2YsMHg1OCwweGZjLDB4MzEsMHhmZiwweGUwLDB4ZWMsMHg1NCwweDY5LDB4YzcsMHhiZiwweGJiLDB4ZGUsCi0gIDB4ZDgsMHg5ZCwweDkxLDB4YTIsMHhhZSwweGU3LDB4ZjcsMHg3OCwweDMwLDB4ZmYsMHg1OCwweGQ5LDB4NjMsMHhiNSwweDExLDB4OTksCi0gIDB4MTQsMHgyYiwweGUwLDB4OTUsMHg1MCwweGZlLDB4NDEsMHg5NCwweDdmLDB4NGMsMHhlZiwweGJhLDB4YWIsMHg4OCwweGZlLDB4ZDMsCi0gIDB4MGMsMHhiYiwweDQyLDB4ZjUsMHgxZiwweGM2LDB4M2YsMHg1NiwweGY0LDB4OTYsMHg2MiwweGEzLDB4YTQsMHgxNCwweDc5LDB4ZTMsCi0gIDB4MTksMHhjMCwweDNmLDB4MTYsMHhlZCwweGQ0LDB4MTMsMHhlMywweDZlLDB4OWMsMHhlZiwweDY3LDB4ZTcsMHgxZiwweGFiLDB4ZmEsCi0gIDB4YTgsMHhjNCwweGQwLDB4YTcsMHgzYywweDIwLDB4MTQsMHhjMCwweDNmLDB4NzYsMHg3NSwweGViLDB4NTgsMHg0YywweDQwLDB4ZTgsCi0gIDB4ODMsMHg3MCwweGZkLDB4NDcsMHhlNiwweGIxLDB4YzcsMHg0OCwweGVhLDB4ZjEsMHhiZCwweGQ1LDB4YjIsMHg1MywweDdmLDB4YmYsCi0gIDB4ZjYsMHhmMSwweDRmLDB4MDEsMHg5MywweDdkLDB4NzAsMHhlMSwweDU2LDB4OTMsMHhlYiwweDRiLDB4ZTYsMHhlZiwweGE4LDB4ZjUsCi0gIDB4ZDcsMHg2YiwweDNmLDB4ZmYsMHhkOCwweGQ1LDB4YmYsMHg1ZCwweDI5LDB4MmIsMHhiOSwweDFkLDB4YmEsMHhlOSwweDk1LDB4N2QsCi0gIDB4NWUsMHhmZSwweDY5LDB4NzAsMHhmNCwweDlmLDB4YjQsMHgxOSwweDhkLDB4MmMsMHgwNiwweDIxLDB4NWMsMHg1MSwweDQzLDB4ZjUsCi0gIDB4OWYsMHhkYiwweDVjLDB4ZmUsMHg1NiwweDkyLDB4YjIsMHg3ZSwweDE1LDB4YmUsMHgxNywweGVkLDB4MmIsMHg1ZiwweDdiLDB4ZjksCi0gIDB4YTcsMHg0MiwweDE4LDB4ODcsMHhkZiwweGQ4LDB4ZWIsMHg5NSwweDliLDB4ZDAsMHhkMiwweDVlLDB4ZmEsMHhiMSwweDI0LDB4ZmIsCi0gIDB4ZTIsMHhmMywweDVlLDB4MzksMHg4ZCwweDdmLDB4MDMsMHg3OCwweGQ0LDB4OWUsMHgzOCwweDEyLDB4MzUsMHgzMSwweDljLDB4N2YsCi0gIDB4ZGEsMHgwYSwweDNjLDB4NzQsMHg4NywweDQxLDB4YTgsMHgzMCwweGVkLDB4ZjUsMHhmNywweDk0LDB4ZTAsMHhlNSwweDFmLDB4M2IsCi0gIDB4N2EsMHg3OCwweDdkLDB4NGEsMHgyNCwweGYxLDB4MmYsMHgwZCwweGQ3LDB4N2YsMHhhMiwweGNmLDB4MGIsMHhjZCwweDZiLDB4OGIsCi0gIDB4MDYsMHgwNCwweGE2LDB4NmUsMHg5MSwweGVmLDB4YjcsMHhkMiwweGFkLDB4ZmYsMHhiMCwweGYzLDB4M2YsMHgyMSwweGVjLDB4ODcsCi0gIDB4YmIsMHhkYywweGRlLDB4NDUsMHg3YywweDdhLDB4NTEsMHhjZCwweDc1LDB4OGUsMHg3ZiwweDM0LDB4NGEsMHgzYiwweGU0LDB4OGIsCi0gIDB4YTgsMHg4NywweDI4LDB4OGUsMHhiZiwweDljLDB4OTUsMHgzZCwweGZhLDB4MGYsMHgzYiwweGZmLDB4NTQsMHhmZiwweGMxLDB4OTAsCi0gIDB4YjMsMHgxOSwweGRlLDB4ZDIsMHhlZiwweGVjLDB4NTYsMHhiZSwweDU4LDB4MTYsMHg4NywweGIzLDB4NjAsMHg4MiwweDUwLDB4MTAsCi0gIDB4ZmYsMHgzOCwweGY5LDB4NjcsMHgwMywweDY0LDB4NTIsMHg5YSwweDExLDB4NmYsMHg2OCwweDhkLDB4NDIsMHg0ZiwweDI4LDB4ZmYsCi0gIDB4YTQsMHgwNSwweDI2LDB4OWIsMHhkYywweDBmLDB4YzcsMHhkMCwweGVkLDB4MDgsMHhiYSwweDBhLDB4OWIsMHhmNCwweGU3LDB4NmMsCi0gIDB4NjEsMHhjNCwweGNmLDB4M2YsMHg4MywweDUwLDB4NDksMHg2OSwweGU3LDB4MDEsMHhmOCwweDc3LDB4Y2MsMHgyNywweGQxLDB4ZjMsCi0gIDB4NTIsMHhhNSwweGYxLDB4N2UsMHgzOCwweGZmLDB4ZGMsMHhlNiwweGU0LDB4NWIsMHg5OSwweDgwLDB4NzEsMHg2YywweDFmLDB4N2UsCi0gIDB4N2YsMHhmNywweGQ0LDB4ZjcsMHgxZiwweDcxLDB4ZmEsMHgwZiwweDVmLDB4YmYsMHg2ZSwweDBkLDB4YjQsMHhlNCwweGEyLDB4NjcsCi0gIDB4MjIsMHgwNCwweGQyLDB4NDMsMHhmNSwweDFmLDB4YzEsMHhlNiwweDlmLDB4MTUsMHg3OCwweGI3LDB4YWYsMHhhMywweGJhLDB4YzEsCi0gIDB4ZGUsMHg0NywweGM0LDB4MjYsMHhkOCwweDE1LDB4YWUsMHhmZiwweDAwLDB4OTcsMHhhZiwweDBlLDB4NmIsMHg3NSwweDU5LDB4YTUsCi0gIDB4NDMsMHhiYywweDVmLDB4ZjQsMHhhZSwweGU3LDB4ZjQsMHgxZiwweDNlLDB4ZmYsMHg2NCwweGM4LDB4ZjksMHhkMSwweGM0LDB4M2YsCi0gIDB4ZjEsMHhjNSwweGQzLDB4YWIsMHhmZiwweGQ4LDB4ZGUsMHg2NSwweDQ4LDB4YTMsMHhjMSwweDEwLDB4ZmYsMHhkMSwweGM3LDB4M2YsCi0gIDB4OWMsMHhmZSwweDAzLDB4NWMsMHhiZCwweDliLDB4MjIsMHhkOSwweGU5LDB4NTksMHg2OSwweGM4LDB4YzcsMHgzZiwweDhlLDB4ZmUsCi0gIDB4MjMsMHhhOCwweDVjLDB4NzcsMHhlMywweDViLDB4N2QsMHg2NSwweDdiLDB4MmMsMHgxYiwweDY5LDB4ZDIsMHgzZSwweGYyLDB4NTQsCi0gIDB4NDAsMHg2MywweGJkLDB4OTMsMHg3ZiwweDNhLDB4OWQsMHhmYSwweGY1LDB4ODYsMHhiOCwweDQ2LDB4OGYsMHhmYywweDBhLDB4ZDcsCi0gIDB4NzcsMHg2ZiwweGZkLDB4ZTIsMHhmNCwweDFmLDB4YmUsMHhkZSwweDBkLDB4OTMsMHg3YSwweDRkLDB4ODQsMHgwZSwweGIyLDB4YmUsCi0gIDB4MjQsMHg5OCwweDdmLDB4NjQsMHhlZSwweDM1LDB4M2YsMHhhMywweGQ1LDB4ZjYsMHg5YSwweGEwLDB4ZTgsMHg4ZCwweDBmLDB4YTcsCi0gIDB4ZmYsMHgxNCwweDc0LDB4M2EsMHhkZSwweDRkLDB4NjgsMHgyOSwweDdkLDB4MjMsMHgxNCwweDM1LDB4ZjksMHhlYSwweGFmLDB4ZTEsCi0gIDB4ZTgsMHgzZiwweDdmLDB4NDQsMHg5ZCwweGVhLDB4OTksMHg4NiwweDI5LDB4YjUsMHg3OSwweDdkLDB4Y2MsMHgwOCwweGU4LDB4ZWYsCi0gIDB4NzAsMHhmYSwweDRmLDB4MzksMHgzYiwweDI0LDB4ZDcsMHhlMCwweDc3LDB4OTYsMHg3MSwweGQxLDB4Y2IsMHgzZiwweDQxLDB4ZmEsCi0gIDB4Y2YsMHhiMCwweGY4LDB4MjUsMHgxYywweGVkLDB4NzYsMHg2MywweDRmLDB4YjAsMHhmZSwweDQzLDB4OWQsMHgxYSwweGY1LDB4OTUsCi0gIDB4ZjUsMHgyMCwweGZkLDB4YTcsMHg4MCwweGI1LDB4YmQsMHhjNiwweGMzLDB4ZjUsMHgzNCwweDhlLDB4N2YsMHgxYywweGZkLDB4NjEsCi0gIDB4NWMsMHhmNywweGNhLDB4MGUsMHhjYywweDcwLDB4ZjgsMHgyNywweGU3LDB4ZjAsMHhjZiwweGFkLDB4ZjAsMHhmZSwweDE3LDB4YTcsCi0gIDB4ZmYsMHhjMCwweDkwLDB4MDMsMHhkNSwweGZjLDB4ZmQsMHg3MywweGQxLDB4NjAsMHhmZCwweGE3LDB4MjAsMHg0YywweDA2LDB4NTQsCi0gIDB4ODIsMHhmNSwweDlmLDB4ZjIsMHgwZCwweGJlLDB4NjgsMHg1OCwweDQ2LDB4M2MsMHhiZiwweGZlLDB4ZTMsMHhiNCwweGJkLDB4MGEsCi0gIDB4MmQsMHgwYywweDUwLDB4YzIsMHhmNCwweDFmLDB4MmEsMHhmMiwweDljLDB4NDQsMHhkNCwweDMwLDB4YWYsMHg0NCwweGYzLDB4ZTksCi0gIDB4M2YsMHg2NiwweDM0LDB4NzQsMHgxNiwweDk2LDB4MWIsMHg3MCwweDRmLDB4NDgsMHhmZiwweDhiLDB4ZDMsMHg3ZiwweGJlLDB4MTQsCi0gIDB4YmMsMHhjNywweDMyLDB4OWYsMHhmZSwweGQzLDB4MjUsMHhlZCwweGY1LDB4NjEsMHhjZiwweGE3LDB4ZjAsMHgxNSwweGU1LDB4MWYsCi0gIDB4YmEsMHg3ZiwweGMzLDB4ZTEsMHg5ZiwweDZiLDB4M2UsMHhlYywweGM5LDB4YTcsMHhmZiwweDEwLDB4Y2MsMHg3NiwweDlkLDB4MzcsCi0gIDB4ZjMsMHhmZCwweGViLDB4ZTUsMHhiYywweGZjLDB4ZTMsMHhjNSwweDllLDB4NjAsMHhmZSwweDkxLDB4MTksMHgwZiwweDEwLDB4YTMsCi0gIDB4MDgsMHgyZCwweGU0LDB4ODgsMHg2OCwweDYyLDB4MzYsMHhmZSwweDA5LDB4MzYsMHhiYywweGZjLDB4YjMsMHgzNCwweDU4LDB4ZjYsCi0gIDB4MDksMHhkMiwweDdmLDB4MWMsMHhmZSwweDcxLDB4MmYsMHhlYiwweGM4LDB4YzcsMHgzZiwweGI1LDB4MzYsMHgwZiwweGM4LDB4NDEsCi0gIDB4ZmQsMHhhZiwweDMwLDB4ZmUsMHhmMSwweGNiLDB4NWMsMHhhMSwweGZjLDB4YjMsMHg4NiwweDM4LDB4ZjUsMHhiMSwweGVkLDB4ZGQsCi0gIDB4MDIsMHhiZiwweGJmLDB4ZmUsMHhmZSwweDE3LDB4YmUsMHhkOCwweGM5LDB4MmYsMHg2YiwweGQxLDB4MTMsMHhjMSwweGZkLDB4MmYsCi0gIDB4ZDUsMHhkZiwweGVkLDB4YjIsMHgwYywweDI1LDB4OTAsMHg3ZiwweDE0LDB4ODcsMHg3ZiwweDY4LDB4YmYsMHhhZiwweGQ1LDB4YWYsCi0gIDB4MDgsMHgzOSwweGY5LDB4YzcsMHhjMywweDNmLDB4ZDQsMHgxMCwweGRjLDB4OGEsMHg5MCwweGJmLDB4ZmYsMHhjNSwweGY1LDB4MzcsCi0gIDB4ZWQsMHg2ZCwweDQ3LDB4ODMsMHhmNSwweDFmLDB4NjEsMHgzZiwweGI3LDB4NGMsMHg2OCwweGQ2LDB4OTcsMHgwNCwweDlkLDB4MDcsCi0gIDB4YjcsMHhmZSwweDMzLDB4MTEsMHgxOCwweGY2LDB4NDQsMHhkZSwweGZlLDB4OTcsMHhhNSwweGY2LDB4YzgsMHhjNCwweDY4LDB4MjUsCi0gIDB4NDIsMHg1MCwweDIyLDB4YWQsMHg4NCwweGYxLDB4OGYsMHgxMiwweDljLDB4OTYsMHg5NSwweDYwLDB4ZmUsMHg1OSwweGJiLDB4OTgsCi0gIDB4N2IsMHg3ZiwweDkxLDB4ZDksMHhmMywweDNiLDB4NmYsMHg0YywweDA5LDB4ZTYsMHgxZiwweGE1LDB4MTIsMHhiZSwweDcyLDB4ZTksCi0gIDB4M2YsMHhkNCwweDg4LDB4Y2UsMHhjYSwweDNmLDB4Y2MsMHg1MCwweDZmLDB4NDAsMHg5MywweDFlLDB4ZDIsMHhmZiwweGIyLDB4ZmEsCi0gIDB4MTcsMHg4ZSwweGRhLDB4YjMsMHhmYiwweDdiLDB4ZTksMHhhMiwweGVlLDB4YWQsMHg1ZiwweDhlLDB4ZmUsMHgzZiwweDY4LDB4ZTUsCi0gIDB4OWYsMHgwOSwweGJjLDB4YzksMHgxMywweDcwLDB4NDQsMHhhZCwweDFiLDB4MmQsMHgzNiwweDEzLDB4MjksMHhkNCwweDhkLDB4ZTcsCi0gIDB4ZTUsMHg5ZiwweGFjLDB4ZjMsMHhlOSwweGRmLDB4OTgsMHhmZCwweGFmLDB4M2EsMHhhMywweDZmLDB4NzYsMHhmZSwweDYxLDB4NjksCi0gIDB4ZTcsMHgxMCwweDM5LDB4NjYsMHgzYywweGZmLDB4ODAsMHg5ZiwweDdmLDB4NWEsMHgyZiwweDY4LDB4YzQsMHhkOCwweDY4LDB4YjksCi0gIDB4YjksMHhkZCwweDkzLDB4M2YsMHhlOSwweDdlLDB4NWMsMHhmYywweDQzLDB4OGMsMHg3OSwweGY5LDB4ZmIsMHg1ZiwweDFjLDB4ZmYsCi0gIDB4YjgsMHg1ZiwweGZjLDB4NzMsMHg0YiwweDc4LDB4ZmUsMHhkMSwweGU5LDB4ZmEsMHg2ZSwweDllLDB4N2YsMHg3OCwweDQzLDB4OGYsCi0gIDB4MDQsMHhlYiwweDNmLDB4ZWUsMHg3YSwweGI3LDB4OTQsMHhhZCwweGNmLDB4YmEsMHhkNiwweGIzLDB4N2MsMHg2ZSwweGYzLDB4NGYsCi0gIDB4YjYsMHhjZiwweDhjLDB4ODYsMHg0YywweGEyLDB4MzEsMHg3MiwweDQyLDB4ZjMsMHhmMSwweDAwLDB4OGIsMHgzZSwweGNjLDB4MzMsCi0gIDB4ZjksMHgyNywweDRiLDB4YmMsMHhkMywweDRkLDB4ZWYsMHgwZSwweDVhLDB4M2MsMHg5YywweDhkLDB4YjgsMHhmOCwweDg3LDB4ZWUsCi0gIDB4YzcsMHhkNiwweDdmLDB4ZGUsMHg4ZCwweDRkLDB4MGEsMHhkMywweDU2LDB4ZGIsMHgyYiwweDIzLDB4NGQsMHhhNywweDY3LDB4NDgsCi0gIDB4NDcsMHg4YywweGU3LDB4OWYsMHhhMiwweDYwLDB4ZmQsMHhlNywweGYxLDB4OTYsMHhkYywweGJjLDB4MjksMHhiYywweDZjLDB4MGUsCi0gIDB4ZmQsMHgyZiwweDkzLDB4NzYsMHgyMCwweDk5LDB4YzMsMHg2NSwweGZkLDB4MTYsMHhlMSwweGJkLDB4ZDksMHhmOSwweGM3LDB4NWYsCi0gIDB4ODYsMHhmMiwweGY0LDB4YmYsMHhkYywweGQ4LDB4ZjAsMHg1YSwweDI4LDB4ZmYsMHg0MCwweGQ5LDB4NTAsMHhjMCwweDc5LDB4ZjAsCi0gIDB4ODIsMHg1MCwweDQwLDB4ZmYsMHhjYiwweDg1LDB4M2QsMHhkZSwweDdlLDB4ZTgsMHg1NCwweDk4LDB4ZmUsMHg2MywweDE5LDB4YmEsCi0gIDB4ZjcsMHg0YSwweDQwLDB4ZmYsMHhjYiwweGRhLDB4NmQsMHgyMiwweDg3LDB4OGQsMHg3MywweGIzLDB4ZjYsMHhiZiwweDljLDB4NjgsCi0gIDB4ZTQsMHhmYSwweDgyLDB4ZjgsMHgzMCwweDk4LDB4N2YsMHg4OCwweDcxLDB4ZGQsMHhjZiwweDAzLDB4N2QsMHgyMSwweGZjLDB4NzMsCi0gIDB4NDIsMHhiOSwweDgyLDB4YzgsMHhmYywweDBmLDB4YzEsMHgxZSwweGQ1LDB4OTksMHhmZiwweDk5LDB4MGIsMHhmZiwweDc4LDB4OGQsCi0gIDB4NTksMHhmYSwweDVmLDB4ODYsMHgwNywweDg0LDB4MTYsMHg4NiwweGVhLDB4M2YsMHhhNiwweDcxLDB4YTIsMHhkYSwweGZiLDB4M2UsCi0gIDB4YzUsMHhmNywweGJmLDB4MmEsMHg3ZCwweGI0LDB4NzMsMHgwZSwweDc5LDB4NDEsMHg2OCwweDUyLDB4YTcsMHhmMSwweDZmLDB4ZjMsCi0gIDB4ZTYsMHgxZiwweGFiLDB4ZGYsMHhlYSwweGQ1LDB4N2YsMHg2YSwweDQzLDB4ZjQsMHg5ZiwweDEwLDB4MTAsMHgwYSwweGQ3LDB4N2YsCi0gIDB4ODgsMHg2MSwweGNjLDB4YTUsMHhmZiwweDg1LDB4YWIsMHg1YiwweGQ0LDB4MzYsMHg5NiwweDhhLDB4NzMsMHhkNSwweDdmLDB4MjAsCi0gIDB4ZDksMHg4YSwweDhkLDB4YTUsMHgzZSwweDNkLDB4ODcsMHhlZiwweDdmLDB4NzEsMHhmNSwweGZhLDB4NzksMHg2MiwweGE4LDB4MjUsCi0gIDB4YjUsMHg3YSwweDFlLDB4ZmQsMHg0NywweGU1LDB4ZjQsMHg5ZiwweDE1LDB4N2EsMHg5NCwweGY0LDB4YmYsMHg2NCwweGU4LDB4ZDYsCi0gIDB4NDMsMHhmOSwweDQ3LDB4ZjEsMHhmMywweDhmLDB4MDYsMHg1ZSwweGZkLDB4ZTcsMHhhMiwweDdmLDB4ZmUsMHg4NywweGYzLDB4MmUsCi0gIDB4NWYsMHhmZiwweGFiLDB4YTIsMHg4MCwweGU3LDB4MDEsMHhiYywweDIzLDB4NmMsMHg1YywweGQ1LDB4YmMsMHhmMSwweGY5LDB4MzIsCi0gIDB4ODAsMHg3ZiwweDMwLDB4N2YsMHgwZSwweGMzLDB4NGIsMHgxMCwweDExLDB4YzUsMHhjZiwweGYzLDB4ZjUsMHhiZiwweDY0LDB4OWUsCi0gIDB4ZWUsMHgxNCwweDBkLDB4MWIsMHgzYiwweDQ2LDB4YTEsMHg1YiwweDcxLDB4ZmIsMHg2YiwweDA0LDB4ZjEsMHgwZiwweDMxLDB4YWEsCi0gIDB4YjEsMHg1MSwweDlkLDB4YWYsMHhmZiwweGY1LDB4NTIsMHgxOSwweGI3LDB4ZmYsMHg0YiwweDUwLDB4NmYsMHhjZSwweDc3LDB4ZjksCi0gIDB4YmUsMHhkZiwweDg5LDB4OWQsMHhiZSwweGZlLDB4MTcsMHhkMSwweGJiLDB4ZWMsMHhiMSwweDlmLDB4ZDEsMHg1OSwweGY4LDB4ODcsCi0gIDB4OGIsMHg3ZiwweGJkLDB4MTgsMHg0NSwweDM1LDB4NTYsMHhmYywweDc3LDB4ZTcsMHhlOSwweDdmLDB4ZDksMHhmYywweGQzLDB4MmMsCi0gIDB4ZmMsMHhmMSwweDAwLDB4YzYsMHg5ZSwweGI4LDB4ZjgsMHg2NCwweDc4LDB4ZmYsMHhjYiwweDlkLDB4N2YsMHhiNCwweDQ3LDB4NGMsCi0gIDB4YmQsMHgyYiwweDVjLDB4ZmYsMHg2MSwweGZkLDB4MmYsMHhmYywweGI0LDB4YWEsMHg0NywweGI0LDB4M2IsMHgxZSwweDUxLDB4YjYsCi0gIDB4OTUsMHg0NCwweDYxLDB4OTcsMHhlNiwweGU5LDB4N2YsMHhlOSwweGVjLDB4ZmUsMHg0YSwweDI1LDB4YzMsMHgxZSwweDc5LDB4MjYsCi0gIDB4YmQsMHhhMiwweDIzLDB4YjEsMHg1ZCwweGFhLDB4ODQsMHhmNywweDdiLDB4ZWYsMHgwOSwweDliLDB4ZmYsMHg3MSwweGYxLDB4Y2YsCi0gIDB4NjYsMHgxYywweDhkLDB4YzMsMHhjNCwweGU4LDB4NzAsMHhlNywweDkzLDB4MTEsMHg5MSwweGM2LDB4NDcsMHgyZiwweGI4LDB4NjUsCi0gIDB4ZDEsMHhjZSwweDMwLDB4YTksMHg1NiwweDRmLDB4YjYsMHg3NCwweDQ0LDB4YTcsMHhhNSwweGJmLDB4ODcsMHg5OSwweGRlLDB4OTUsCi0gIDB4MjEsMHhmNSwweDZiLDB4OTAsMHhlNiwweDlmLDB4NmQsMHhlMiwweGE3LDB4M2EsMHhjMSwweDEyLDB4NjUsMHg1MiwweDVjLDB4YWMsCi0gIDB4MWYsMHhkOSwweGJmLDB4OWEsMHhkZiwweDdmLDB4MmIsMHhhZiwweGI3LDB4ZWMsMHg1NSwweDI5LDB4ZjYsMHg5MCwweDRmLDB4NjUsCi0gIDB4YTUsMHhhYiwweDA0LDB4NDcsMHg0MCwweGFiLDB4NzIsMHhmOSwweDNiLDB4Y2EsMHhmOCwweGE3LDB4ODMsMHhlNSwweDFmLDB4YWIsCi0gIDB4OWYsMHgwOCwweGE2LDB4OWUsMHg3ZiwweDE0LDB4NmEsMHg1ZCwweGYxLDB4NzQsMHhmYSwweDVmLDB4NzEsMHg1ZSwweGZmLDB4OTksCi0gIDB4MTEsMHg5YiwweDUxLDB4NzQsMHgzMiwweDkyLDB4YzAsMHg2OSwweGI2LDB4ZGUsMHg5NSwweDUxLDB4Y2YsMHgwNSwweGViLDB4M2YsCi0gIDB4MzcsMHhjOCwweDY5LDB4OTksMHgzMywweGZmLDB4MTAsMHg2MywweGU1LDB4MjAsMHgzNSwweDVjLDB4ZjksMHg3YywweGQyLDB4ZTksCi0gIDB4N2YsMHhiOSwweGY4LDB4NDcsMHg1YywweGI2LDB4ZDUsMHgyZSwweDViLDB4Y2IsMHg1YywweGY1LDB4NmIsMHgzYywweGE4LDB4ZmYsCi0gIDB4NzUsMHgwMSwweDdiLDB4NTcsMHg2ZCwweDYyLDB4MTIsMHgzYSwweDZhLDB4MzUsMHg2ZSwweGYyLDB4ZTksMHgzZiwweGY1LDB4NTYsCi0gIDB4YmYsMHhjMywweGM2LDB4NDIsMHgyZCwweDFlLDB4YTYsMHhmZiwweDI4LDB4NzQsMHhlYywweGE0LDB4MDcsMHhjNywweDQ3LDB4YWYsCi0gIDB4MmYsMHg4YiwweDRkLDB4YWUsMHhiYiwweDAwLDB4ZGYsMHhjNSwweGRkLDB4ZjEsMHhjOSwweDM5LDB4ZmEsMHhjZiwweDZkLDB4YmMsCi0gIDB4YmYsMHhmMSwweDdiLDB4MTQsMHhmYiwweGZkLDB4ZGQsMHhhMywweGZmLDB4MTQsMHhmYSwweGY4LDB4NjcsMHg0MiwweGRhLDB4YWUsCi0gIDB4NWYsMHg0NSwweGNiLDB4ZjEsMHg2OSwweDI5LDB4OWEsMHg4MSwweDFiLDB4NWEsMHhjYiwweDQ4LDB4MzQsMHhmMCwweGZjLDB4MTgsCi0gIDB4ZWEsMHgxNiwweDBiLDB4NzIsMHgwNiwweGM1LDB4MDQsMHhiYywweDgxLDB4OGQsMHhkMiwweDYxLDB4ZTIsMHhhNiwweDkxLDB4MTgsCi0gIDB4NTMsMHhmOCwweGZlLDB4NTcsMHhhMSwweGFmLDB4ZmYsMHg5NSwweDE2LDB4MzcsMHhmNCwweDY2LDB4ZWMsMHgxNywweDczLDB4NzQsCi0gIDB4NDgsMHg0ZiwweGZlLDB4OTgsMHhlZiwweDg3LDB4NWUsMHhmNiwweGYzLDB4Y2YsMHg0YiwweDYyLDB4MjcsMHhjOSwweDY2LDB4NGMsCi0gIDB4NDYsMHg2YiwweGU1LDB4ZjUsMHgxMywweDY3LDB4ZmUsMHg3OSwweDc0LDB4YmUsMHgxZCwweDg0LDB4NTcsMHhmMSwweGZiLDB4ZTMsCi0gIDB4MTQsMHg5ZCwweGZmLDB4YzEsMHg1NywweGRhLDB4MTMsMHg1YywweDdjLDB4M2UsMHg2NiwweGZjLDB4YzMsMHhlNiwweDlmLDB4NzMsCi0gIDB4YzIsMHgzMSwweGU1LDB4YTYsMHhiYSwweDg0LDB4ODUsMHhhNSwweDhkLDB4ZTcsMHhlMSwweDgwLDB4ZmUsMHgxNywweDk5LDB4YzcsCi0gIDB4OWIsMHhiMCwweGZhLDB4NmIsMHhmOCwweDdkLDB4MDQsMHhkNSwweGI3LDB4MDcsMHhlYiwweDNmLDB4YWMsMHhmZiwweGE1LDB4NDksCi0gIDB4NDMsMHhlYSwweDMwLDB4M2QsMHgzNiwweDZmLDB4ODMsMHhmNiwweDE3LDB4OWIsMHhmMywweGY3LDB4YmYsMHgzNCwweGEyLDB4MDcsCi0gIDB4NjYsMHgzNCwweGViLDB4MTgsMHhhYywweDg0LDB4MzQsMHhmMCwweGZhLDB4Y2YsMHgyNSwweDU2LDB4ZWYsMHg1OCwweGZmLDB4NmIsCi0gIDB4YjMsMHhmOCwweDIyLDB4ZGMsMHg4MywweGVlLDB4YTAsMHhmYSwweDRmLDB4ZDUsMHhhNiwweDVlLDB4OGUsMHgwNywweGE2LDB4NjUsCi0gIDB4YmEsMHhkZSwweGU2LDB4OWYsMHg1YywweGFjLDB4N2EsMHhkZCwweGM5LDB4ZjYsMHg5YywweGQ2LDB4NjAsMHgwYiwweDQxLDB4MjgsCi0gIDB4MzUsMHg5YSwweGUwLDB4ZjgsMHhlNywweGI0LDB4NDgsMHhkNywweGViLDB4ZmYsMHhjMiwweGY4LDB4ZTcsMHhjMiwweGZjLDB4NjksCi0gIDB4NzgsMHhkNCwweDAyLDB4YTEsMHhlZiwweGEwLDB4NjUsMHg3NCwweGI5LDB4MTMsMHg5ZiwweDg1LDB4NGUsMHhmZiwweGViLDB4NTUsCi0gIDB4Y2EsMHgzZiwweDM4LDB4M2UsMHgwNSwweDkzLDB4YTIsMHg3OSwweDJjLDB4MmYsMHg2MiwweDdlLDB4YWUsMHgzNywweGY4LDB4ZjgsCi0gIDB4OGMsMHgzOCwweGZjLDB4ZjMsMHgzNCwweDlkLDB4ZmYsMHg5MSwweGY2LDB4YzIsMHhiZiwweGMxLDB4NmEsMHgzMiwweGZmLDB4M2MsCi0gIDB4MGQsMHhiYiwweDUwLDB4OTUsMHhjMSwweGRlLDB4MWYsMHhmMSwweDk1LDB4Y2IsMHg4YywweGFmLDB4NTgsMHhmZiwweGFiLDB4MGQsCi0gIDB4N2IsMHg3NywweDc4LDB4NjcsMHg5NSwweDg1LDB4M2QsMHhjZiwweDIxLDB4NmQsMHg5MiwweGQ3LDB4YmIsMHhiMiwweDhlLDB4ZmUsCi0gIDB4YTMsMHhkYSwweDQxLDB4YmIsMHg0YiwweGVjLDB4ODcsMHg4MywweGE4LDB4ZDYsMHgyOCwweGIxLDB4ZTYsMHhhOSwweGFhLDB4MjcsCi0gIDB4ZDksMHhmYiwweDJjLDB4YmUsMHg3MiwweDE2LDB4MzgsMHhmZSwweDUxLDB4NGMsMHhjOCwweDk5LDB4YzAsMHg1ZiwweGZhLDB4YWQsCi0gIDB4ZjQsMHg0MSwweDMyLDB4MWQsMHgzYSwweDAxLDB4NjcsMHhlMSwweDUwLDB4M2EsMHhlMSwweGUyLDB4MWYsMHhiYSwweDdmLDB4OGIsCi0gIDB4N2YsMHhiNiwweDNiLDB4ZmEsMHg0ZiwweGE5LDB4MmQsMHhmYiwweDg4LDB4ZmMsMHg0NCwweGY0LDB4MjksMHg2ZSwweDdlLDB4ZDUsCi0gIDB4MmEsMHg2YSwweDFiLDB4MDcsMHgxNiwweDYyLDB4NjMsMHhhMCwweDNlLDB4NTgsMHgxZiwweDE4LDB4NjEsMHhlNywweGM3LDB4ZTIsCi0gIDB4OWYsMHg0NiwweGFiLDB4ZGEsMHgxZSwweDUwLDB4OTYsMHhlOSwweDdkLDB4ZDgsMHg1MCwweDcwLDB4ZDksMHg2ZCwweDhmLDB4Y2YsCi0gIDB4NDUsMHhmZiwweDU5LDB4NmEsMHhjZiwweDRiLDB4YTMsMHg2NCwweDNiLDB4YWYsMHg1NywweDljLDB4NjQsMHhlNywweDBkLDB4NGMsCi0gIDB4ZmQsMHgyNywweDZlLDB4OGUsMHhjMSwweGYwLDB4NDYsMHhhMiwweDNkLDB4Y2UsMHhmMSwweGMwLDB4ODcsMHhhYywweGZmLDB4ZWUsCi0gIDB4ZDYsMHg3ZiwweGM0LDB4N2EsMHg2YywweGQ0LDB4MTAsMHhhMywweDk5LDB4MzQsMHg2MiwweDAyLDB4ZjQsMHg5ZiwweDMzLDB4YjQsCi0gIDB4ZmYsMHgzNSwweDY2LDB4ZjYsMHhiMywweDZjLDB4N2QsMHhlMywweDkyLDB4ZGUsMHhkMiwweGVlLDB4ZTIsMHgxOSwweGQ5LDB4ZTEsCi0gIDB4MWYsMHgwZSwweDkzLDB4ZmUsMHg0ZiwweDU4LDB4YTMsMHhmZiwweDJiLDB4NTksMHg3NiwweDczLDB4ZjAsMHhjMCwweGI2LDB4NjgsCi0gIDB4YTAsMHhmZSwweGIzLDB4OTUsMHhmMiwweDRmLDB4NWEsMHhjYywweGExLDB4MzcsMHgzMSwweGZmLDB4MmMsMHg0MiwweGEyLDB4ODEsCi0gIDB4ODYsMHhmNSwweGVhLDB4NTQsMHhkYywweDFhLDB4Y2MsMHgzNiwweGQxLDB4ZTgsMHgyOSwweDk2LDB4N2YsMHgzOCwweGZkLDB4NjcsCi0gIDB4MTQsMHhiZCwweDYxLDB4MGIsMHg1ZiwweGE5LDB4N2QsMHhhMCwweGI1LDB4ZjEsMHhmYSwweGNmLDB4MjksMHg3NiwweDdlLDB4MjgsCi0gIDB4ZmYsMHhmYywweGYzLDB4MzMsMHg0NCwweDdmLDB4MTYsMHhhYSwweDY5LDB4NjAsMHhhYiwweDdmLDB4Y2MsMHhjNywweGYzLDB4NzEsCi0gIDB4YjYsMHhkZSwweGQxLDB4N2YsMHhmZSwweDZjLDB4NWMsMHhiZSwweGE0LDB4YWYsMHhiMSwweGU2LDB4N2YsMHhiZSwweDg2LDB4ZmEsCi0gIDB4ZjYsMHg0NCwweGEwLDB4ZmUsMHgzMywweDQxLDB4ZjUsMHgxZiwweDczLDB4NWUsMHg0OCwweDZiLDB4ZDYsMHg4YiwweGFjLDB4NjUsCi0gIDB4NGQsMHg2NCwweDE5LDB4NDMsMHhhMywweGNiLDB4N2UsMHhmZSwweGQ5LDB4YjksMHgzMCwweDI3LDB4NjYsMHhkNywweDM2LDB4YzMsCi0gIDB4NDYsMHhlMiwweDY2LDB4NzYsMHg0MSwweGUzLDB4MDIsMHgzZSwweGZlLDB4MjMsMHhjMSwweGZhLDB4Y2YsMHg1MywweGI5LDB4NjUsCi0gIDB4YTgsMHg5NCwweDE4LDB4OGYsMHhhMywweDFhLDB4MTQsMHhhYSwweGZmLDB4MzgsMHhmYywweGQzLDB4ZGQsMHhjYiwweGRlLDB4MTcsCi0gIDB4ZTIsMHg2MSwweGZhLDB4MGYsMHhlMywweDlmLDB4YzIsMHg3MywweGE4LDB4MWYsMHhhYSwweDhlLDB4ZTMsMHhlYSwweDdmLDB4MGUsCi0gIDB4ZjUsMHg0MCwweDk1LDB4Y2UsMHhlYiwweDNmLDB4Y2UsMHhmYiwweGZlLDB4NjAsMHgyZiwweGM5LDB4NTcsMHgwNCwweDcyLDB4MTYsCi0gIDB4Y2UsMHgwOCwweGEzLDB4MTYsMHhlZCwweDdjLDB4YTYsMHhiZCwweDhmLDB4ZWUsMHgxYSwweGU3LDB4ZjUsMHg5ZiwweDJmLDB4MTgsCi0gIDB4ZmYsMHg5NCwweGQwLDB4ZjksMHg5ZiwweDRjLDB4ZDEsMHgwNSwweDYxLDB4Y2EsMHhmYSwweDYxLDB4Y2IsMHhiNywweDQ0LDB4MjgsCi0gIDB4NmIsMHg1YiwweGNlLDB4ZTcsMHgxMywweDk2LDB4N2YsMHhjNCwweGM3LDB4NmUsMHhkMSwweGIxLDB4ZTcsMHg2NiwweGZkLDB4MWEsCi0gIDB4N2EsMHgxYiwweDU3LDB4YWIsMHgxYSwweDUzLDB4ZmYsMHg0OSwweDQ3LDB4YjksMHg0MSwweDBlLDB4NDcsMHg5ZiwweGIxLDB4ZjgsCi0gIDB4ODcsMHg0YywweGZiLDB4NDgsMHg3ZiwweDhhLDB4MGUsMHhjMywweGVhLDB4ZDEsMHg0NSwweDVkLDB4ZjgsMHhlOSwweDM4LDB4MDIsCi0gIDB4MGYsMHgyYiwweDRhLDB4OTcsMHhlNCwweGU4LDB4M2YsMHg4NSwweDc0LDB4M2QsMHhlZCwweDdmLDB4OTUsMHg2MCwweDRjLDB4ODIsCi0gIDB4YzMsMHhiYSwweDgzLDB4NzksMHg2OSwweDI1LDB4YWYsMHhmZSwweGQzLDB4ZDcsMHg4MCwweGViLDB4NTcsMHg4NiwweDYyLDB4Y2YsCi0gIDB4MDEsMHhmYywweGZjLDB4ZjIsMHhmMSwweDc0LDB4ZjIsMHgxNSwweGQ1LDB4N2YsMHg0YSwweDUzLDB4NTIsMHgxMywweDRjLDB4MWEsCi0gIDB4YTYsMHg3NywweGQzLDB4MjYsMHhkOCwweDQ0LDB4MzMsMHg0ZSwweDYzLDB4MmIsMHhhMCwweGZmLDB4NzUsMHg4MCwweGY0LDB4YmYsCi0gIDB4OTAsMHg4ZCwweDNkLDB4ZmYsMHgwMCwweGNkLDB4MjMsMHhiYiwweGI5LDB4ZjUsMHg0MSwweGZjLDB4ZDMsMHhkMywweDA0LDB4MjcsCi0gIDB4ZTAsMHg0ZSwweGJiLDB4ZGUsMHgwZCwweDM0LDB4ZWIsMHhhNSwweDVjLDB4YmQsMHhjYiwweDNhLDB4ZmQsMHgyZiwweGEwLDB4ZmMsCi0gIDB4ODMsMHhlZiwweGQ2LDB4OGIsMHhkNiwweGQ4LDB4OGQsMHgzMCwweDk0LDB4MWMsMHhlNywweGViLDB4ZWYsMHg4NCwweDRmLDB4ZmYsCi0gIDB4NTksMHg0NCwweGM2LDB4NjAsMHg3YSwweDkxLDB4YTMsMHhmZiwweDgwLDB4OTIsMHg1OSwweDkwLDB4ZjAsMHhmMywweDRmLDB4ODksCi0gIDB4NmMsMHhjZiwweGZmLDB4NjQsMHhjNCwweDdlLDB4YmQsMHhkNywweDhjLDB4NGYsMHhhYiwweDM5LDB4ZmYsMHg4YywweGY4LDB4N2EsCi0gIDB4ZTcsMHhjYywweGZmLDB4ZDgsMHhmYSwweGNmLDB4OTgsMHgzOSwweGRmLDB4OWIsMHhiNSwweDdlLDB4ZGYsMHg3NCwweDEzLDB4NmUsCi0gIDB4ZGMsMHhkNywweDAyLDB4YzksMHg4YywweGMwLDB4Y2UsMHg4MywweGQxLDB4YzMsMHhjZSwweGU3LDB4ZjMsMHg5NiwweDUzLDB4MWIsCi0gIDB4YmIsMHgxNiwweDBlLDB4NjUsMHhhNywweGUxLDB4NmUsMHhlYywweDVkLDB4Y2QsMHg0ZCwweDk4LDB4ZDEsMHgzYywweGZjLDB4YjMsCi0gIDB4OWUsMHhmMSwweDg2LDB4NjAsMHg0MywweGNlLDB4YjAsMHhmNCwweGJhLDB4M2EsMHg1MywweGQ1LDB4MDIsMHg3YiwweDM5LDB4ZWMsCi0gIDB4YzksMHhhYiwweGZmLDB4NDgsMHg1YiwweGEwLDB4NmYsMHhiNCwweDI2LDB4ZmQsMHg5NywweDczLDB4ZWIsMHg3ZiwweDk1LDB4OTAsCi0gIDB4YjEsMHhhOCwweDQzLDB4NmEsMHgxMiwweDcxLDB4NjMsMHg0ZSwweGY5LDB4ZjUsMHg5ZiwweGMyLDB4MmQsMHhmMSwweDNlLDB4YjksCi0gIDB4MWEsMHg5NSwweGY4LDB4MWEsMHg0OSwweDgxLDB4ZjMsMHgzZiwweGY4LDB4MzEsMHgyOSwweDI1LDB4M2YsMHg3NCwweGFhLDB4NWQsCi0gIDB4MzYsMHhlNywweGZlLDB4MTcsMHgxOSwweDAzLDB4N2IsMHgwYiwweGNkLDB4ZDYsMHhmZiwweDcyLDB4ZjQsMHg5ZiwweDZmLDB4YzUsCi0gIDB4NGYsMHg5NCwweGNhLDB4MmYsMHg0YywweDdkLDB4ODksMHhjZCwweDlmLDB4N2YsMHgxMiwweGRhLDB4ZmYsMHg1YSwweDBkLDB4ZGYsCi0gIDB4YzIsMHg2ZSwweDcxLDB4OTUsMHgxMSwweDBmLDB4ZGEsMHg3ZiwweDgwLDB4ZmUsMHhiMywweDRhLDB4ZGMsMHhhMCwweGY3LDB4YTgsCi0gIDB4MDksMHhhNCwweDU5LDB4ZjUsMHhkYSwweGVlLDB4ZTAsMHg5OCwweDNmLDB4Y2QsMHgwOCwweGQxLDB4N2YsMHgzZSwweDMzLDB4NzYsCi0gIDB4YTEsMHhkYiwweGY3LDB4MmIsMHgzZSwweGZkLDB4ZTcsMHhkZSwweDQwLDB4ZmQsMHhhNywweDQxLDB4ZGEsMHg4MCwweGRlLDB4ODEsCi0gIDB4YTYsMHg5ZCwweGQxLDB4N2EsMHg4YywweDNkLDB4YTcsMHgzMywweGI2LDB4ZmUsMHg3MywweDNhLDB4OGYsMHhmZSwweDczLDB4YTYsCi0gIDB4ZjcsMHhhYiwweDA1LDB4MmQsMHgzYiwweGFkLDB4YzcsMHhhNCwweDIwLDB4YmYsMHhmZSwweDgzLDB4YjEsMHg3MCwweDE4LDB4OWYsCi0gIDB4Y2YsMHhkMywweGE4LDB4ZTEsMHg4NSwweGUwLDB4ZGYsMHgyZiwweDc4LDB4ZjQsMHg5ZiwweGJiLDB4NDgsMHhkMiwweDU4LDB4MGMsCi0gIDB4YmIsMHgxZSwweGFhLDB4NDIsMHg3YywweDFhLDB4MDksMHg5ZCwweDdmLDB4YzYsMHg5OCwweDM3LDB4MjUsMHhiZSwweGE4LDB4M2QsCi0gIDB4ZDcsMHg3ZCwweDQ3LDB4ZWUsMHgwNSwweGVhLDB4ZTYsMHhhMiwweDNjLDB4ZmQsMHgyZiwweGYzLDB4NmQsMHhlMiwweDI5LDB4YWQsCi0gIDB4MDcsMHhiNCwweDMxLDB4MjUsMHhlOCwweGJjLDB4NzksMHhmYiwweDVmLDB4OGQsMHgxOCwweDcyLDB4NGEsMHg4ZSwweGNhLDB4NjcsCi0gIDB4NzEsMHhlZCwweDJjLDB4ZjEsMHhmNSwweGJmLDB4MjIsMHg4MSwweGZhLDB4Y2YsMHg0ZSwweGYxLDB4NDEsMHg2NSwweDRhLDB4MmYsCi0gIDB4MTQsMHgwMywweGZiLDB4NDEsMHg4MSwweGZhLDB4Y2YsMHg5NywweGQxLDB4MGYsMHg1MCwweGYzLDB4ZGEsMHhmZSwweDgxLDB4MWEsCi0gIDB4NjcsMHhlMiwweDI1LDB4YWYsMHhmZSwweGYzLDB4YWUsMHhmYywweDFiLDB4MzEsMHhiMSwweDQ5LDB4OTksMHhhNSwweGZmLDB4MjUsCi0gIDB4MzAsMHhmZSwweGY5LDB4YWQsMHhmZSwweGM0LDB4ODMsMHg3NiwweDliLDB4ZTYsMHhmOSwweGQ5LDB4ZTcsMHg3ZiwweDUyLDB4ZTIsCi0gIDB4YjgsMHhmYywweGI0LDB4OTAsMHhkMCwweDc5LDB4ZWMsMHg5OSwweGFkLDB4ZmYsMHg5NSwweGM1LDB4ZTAsMHhkNywweDRmLDB4OGMsCi0gIDB4MzMsMHhiMywweGNmLDB4ZmYsMHhiNCwweDkzLDB4ZmUsMHgxNywweGM2LDB4OWUsMHhkZCwweDQxLDB4ZmQsMHgxZCwweDdmLDB4ZmYsCi0gIDB4YWIsMHg3NCwweDRjLDB4YmEsMHg0ZiwweGZkLDB4OWYsMHg2NSwweDc3LDB4YmEsMHhiMCwweGQwLDB4ZTEsMHgxZiwweDgxLDB4YzYsCi0gIDB4OWYsMHhkMywweDdmLDB4MzQsMHhlOCwweGQ1LDB4YWIsMHhjOSwweGZjLDB4NGYsMHhiZSwweGRmLDB4N2YsMHg1MSwweGZlLDB4MjksCi0gIDB4NTEsMHg0YiwweDQ2LDB4ZTEsMHg2OSwweDYxLDB4N2YsMHg3YiwweDcxLDB4YjAsMHhiZiwweDAxLDB4ZjMsMHgzZiwweGZiLDB4MWYsCi0gIDB4N2YsMHgwMiwweGJmLDB4Y2YsMHgxNiwweDBmLDB4YjQsMHhjZSwweGU1LDB4ZjcsMHg1ZiwweGE1LDB4NzgsMHg5MywweGU4LDB4YmYsCi0gIDB4NjAsMHhjZCwweDBmLDB4ZTcsMHgzOSwweGRiLDB4MTYsMHg5OSwweDExLDB4ZDgsMHhmZiwweGRhLDB4YTQsMHg5MiwweDc5LDB4YjAsCi0gIDB4ZDIsMHgyMCwweDdmLDB4MDMsMHhmNCwweDlmLDB4MWQsMHg5OCwweGI3LDB4YjMsMHg0YSwweDk5LDB4M2EsMHhjNywweGRmLDB4N2YsCi0gIDB4NDUsMHgzNiwweGExLDB4ODYsMHhhYSwweDVmLDB4YTMsMHg5NywweDA3LDB4MTksMHhmNiwweDJjLDB4YzksMHhjZiwweDNmLDB4YjUsCi0gIDB4NjIsMHgwZiwweGRhLDB4ODEsMHgzNCwweDM0LDB4Y2IsMHhmYywweDMzLDB4ZTMsMHg5ZiwweDBlLDB4ZmMsMHhjYSwweGY0LDB4OTIsCi0gIDB4NTIsMHg0MywweGIxLDB4ZTcsMHhlMSwweGIwLDB4ZjksMHgxZiwweGFhLDB4ZmYsMHg2YywweDk2LDB4NWUsMHhjMCwweDE4LDB4YjYsCi0gIDB4NDIsMHg2MywweGIyLDB4Y2YsMHgyYywweGYzLDB4M2YsMHg5YSwweDk0LDB4NTMsMHhhZSwweDhiLDB4MGQsMHg3YSwweDJjLDB4YjMsCi0gIDB4Y2UsMHg5ZiwweDRmLDB4MDIsMHhlNiwweDdmLDB4YjIsMHgxOCwweDFhLDB4Y2YsMHhhNiwweDUzLDB4YjUsMHg1MSwweDZlLDB4OTAsCi0gIDB4MzUsMHg2OCwweGZlLDB4ODcsMHhlYSwweDNmLDB4N2EsMHhmZCwweDE4LDB4ZmEsMHhlZiwweGY0LDB4YmUsMHhhZSwweDYyLDB4YjIsCi0gIDB4ZWQsMHg0MywweDkyLDB4ZDksMHg5MSwweGNmLDB4MzcsMHhmZiwweGEzLDB4OGIsMHg5MywweGVhLDB4ZTMsMHg2YSwweDhkLDB4NTIsCi0gIDB4MTEsMHg5NCwweGFmLDB4MDIsMHhmYSwweDVmLDB4MjAsMHhiZSwweDAzLDB4Y2YsMHg0MCwweDVhLDB4YmYsMHhjMywweDBlLDB4ZTMsCi0gIDB4NzEsMHg3ZSwweGYwLDB4MzUsMHg2MCwweGZlLDB4NDcsMHgxNSwweGRmLDB4ZDEsMHg0NiwweDQwLDB4YzMsMHhhZiwweDhkLDB4M2YsCi0gIDB4YzIsMHg2ZSwweDBhLDB4ZTQsMHg0NSwweDViLDB4Y2MsMHgzNywweGZmLDB4ODMsMHg4YSwweDcyLDB4MDgsMHg2NywweGE3LDB4YWUsCi0gIDB4NTIsMHgwYywweDhhLDB4NzQsMHhjYywweDM1LDB4OWYsMHhmZSwweDYzLDB4NDgsMHg1ZCwweGYyLDB4YzksMHhmNCwweDIxLDB4YmQsCi0gIDB4N2YsMHg3MiwweGExLDB4NzUsMHg2NSwweDFlLDB4MzcsMHgwOCwweGVkLDB4Y2MsMHhmZiwweDc0LDB4NTMsMHhmZSwweGU5LDB4ZWYsCi0gIDB4ZDksMHg1NywweGZkLDB4NjQsMHg1YiwweDc1LDB4N2IsMHg2MCwweGZkLDB4ZjIsMHhmNiwweGJmLDB4ZjAsMHg2YiwweDdlLDB4YWYsCi0gIDB4ZDgsMHhiMSwweGFlLDB4MGYsMHgzZiwweDJmLDB4NGEsMHhlMCwweDdhLDB4YmYsMHhmZSwweDIzLDB4ODgsMHg5YiwweDYwLDB4MDcsCi0gIDB4NTQsMHhiNywweDU1LDB4MDQsMHhmMywweDAwLDB4MGIsMHhiZiwweGM5LDB4M2YsMHgzOCwweDFhLDB4ZTgsMHgwZiwweDNiLDB4ZTQsCi0gIDB4MmMsMHhkNCwweGViLDB4ZDYsMHg2YiwweGI1LDB4NmUsMHgzNiwweDdhLDB4ZDgsMHg2OCwweDkwLDB4ZTEsMHhkNywweDdmLDB4NDYsCi0gIDB4YTQsMHgwMSwweGI4LDB4ZDYsMHhmYSwweDY4LDB4YmIsMHgyZCwweDA0LDB4Y2QsMHhhYSwweGZmLDB4NGMsMHg0OSwweGJmLDB4MjYsCi0gIDB4YzYsMHhlNywweGI4LDB4OTAsMHgzNSwweGMzLDB4OGMsMHgxMiwweGE2LDB4MWYsMHhmMiwweGZkLDB4MmYsMHhjNSwweDllLDB4ZmYsCi0gIDB4NDksMHhjMiwweGRiLDB4N2EsMHhmNSwweGVjLDB4ZmQsMHhhZiwweGZlLDB4YjIsMHg0MywweDIyLDB4MDEsMHhhMSwweDFmLDB4NmUsCi0gIDB4ODAsMHg0YywweDNjLDB4Y2QsMHhmYiwweGJiLDB4MzQsMHhhYywweGZmLDB4NTUsMHg2OCwweDFhLDB4OWQsMHhkNiwweDYwLDB4ZDUsCi0gIDB4NmMsMHhmMywweGNmLDB4ZjgsMHgyMCwweGM5LDB4YTYsMHg4MSwweGMzLDB4NjIsMHhiOCwweGY1LDB4YjEsMHg0MCwweGZlLDB4YzEsCi0gIDB4ZDEsMHgxMCwweDg5LDB4MTEsMHgzOSwweDA2LDB4NTcsMHgwNiwweGRlLDB4OWUsMHg5ZCwweDdmLDB4ODYsMHhlOCwweDM0LDB4ZWYsCi0gIDB4MDUsMHhmOCwweGJlLDB4ZWIsMHg2MCwweDU4LDB4ZmYsMHhjYiwweDM3LDB4ZmYsMHg5MywweDIyLDB4ZmMsMHg2YywweDU0LDB4MWYsCi0gIDB4OWYsMHg1YiwweGZmLDB4Y2IsMHhiMCwweDA3LDB4ZTcsMHhiNCwweDM5LDB4ZjYsMHhiZiwweDJjLDB4MGMsMHgzOCwweDhjLDB4YWEsCi0gIDB4YzIsMHg3ZiwweGZmLDB4YzUsMHhlNiwweDdmLDB4ZjQsMHgyYiwweDZhLDB4NTMsMHgwZSwweDgzLDB4ZDAsMHg0OSwweGI4LDB4ZGMsCi0gIDB4OTEsMHhlMiwweGZhLDB4NWYsMHgyYiwweDdjLDB4ZmMsMHhkMywweGVjLDB4ZWEsMHg3ZiwweDVkLDB4ZDAsMHg2ZiwweGExLDB4NTksCi0gIDB4N2UsMHhmZiwweDk1LDB4YjMsMHhkYiwweGQwLDB4NGQsMHhiOSwweDY4LDB4MDMsMHgwNiwweGExLDB4ZWYsMHgzYiwweGRjLDB4ZjEsCi0gIDB4ZjEsMHhmMiwweGNmLDB4NzIsMHg0NywweGVkLDB4NTEsMHgwOCwweDA4LDB4MWQsMHg1MCwweGY3LDB4ZTUsMHhlNSwweDlmLDB4ZTUsCi0gIDB4YjksMHg2MiwweGVhLDB4OWQsMHg0MiwweGU2LDB4YmQsMHg4ZiwweDc4LDB4ZmMsMHhmNSwweGNmLDB4ZmYsMHgzMCwweGVjLDB4YjEsCi0gIDB4ZjUsMHg2NywweDc3LDB4M2MsMHhmZCwweGYzLDB4M2YsMHhmMywweDQ4LDB4NzUsMHgyMCwweDQ2LDB4MjIsMHgxZCwweDg5LDB4YzMsCi0gIDB4MmQsMHhmZCwweGUwLDB4ZWYsMHhkMSwweGZmLDB4YzIsMHg4NiwweGZlLDB4ZDYsMHgxYywweGU3LDB4OWYsMHg2ZCwweDYzLDB4YjAsCi0gIDB4N2UsMHg3NiwweGZlLDB4ZTEsMHhjYiwweGFlLDB4NTEsMHgxZCwweGM2LDB4M2YsMHgyMSwweGYzLDB4M2YsMHhkNSwweGIzLDB4ZjEsCi0gIDB4Y2YsMHhmZiwweGIzLDB4NzcsMHhmZCwweGMxLDB4NTEsMHg5NCwweDY5LDB4ZmEsMHg5ZCwweDllLDB4MDYsMHgzYSwweGM5LDB4MjQsCi0gIDB4NjksMHgwMiwweGRjLDB4NjEsMHg4OSwweGRhLDB4NGMsMHg1OCwweDFkLDB4ZGMsMHhjOSwweDBmLDB4MDMsMHgyMiwweGM1LDB4ODUsCi0gIDB4YTQsMHgwOSwweGZjLDB4YzEsMHgwOSwweDc3LDB4ZTQsMHhiNiwweGY2LDB4OGYsMHhmYiwweDYzLDB4Y2IsMHhjZCwweDc5LDB4OTYsCi0gIDB4ZTUsMHhkNSwweGUxLDB4MTYsMHhlNywweDVkLDB4ZDUsMHhiMSwweGVlLDB4OTUsMHhkYiwweDA5LDB4YzEsMHg0ZCwweDBjLDB4NGEsCi0gIDB4NWMsMHhiZCwweDVkLDB4YmMsMHhiMiwweDc2LDB4MjcsMHg5MSwweGIzLDB4YjAsMHg4YSwweGFkLDB4MGEsMHhjMSwweDU1LDB4NjQsCi0gIDB4ZjcsMHg3MCwweGMyLDB4MDYsMHg2ZiwweDgwLDB4MDgsMHg1MSwweGQ5LDB4MmQsMHhkNiwweDczLDB4ZGQsMHg4MSwweDRiLDB4NjksCi0gIDB4ZDAsMHhjOCwweDA1LDB4NDQsMHgwZCwweDEwLDB4ZTAsMHhmYSwweGZiLDB4YmEsMHhmYiwweGZiLDB4ZDEsMHhmZCwweDc2LDB4Y2YsCi0gIDB4YTAsMHhlNSwweDk1LDB4NTUsMHhlNywweGZjLDB4ZjUsMHg1NSwweGQyLDB4MzUsMHhkNSwweGRmLDB4M2IsMHg1ZiwweDdmLDB4ZGYsCi0gIDB4ZDMsMHhjZiwweGZiLDB4YmMsMHhjZiwweDJiLDB4YzMsMHgwMCwweDMzLDB4NzMsMHg1ZCwweGZhLDB4OWYsMHg0YiwweDMwLDB4NTgsCi0gIDB4OWMsMHhmZSwweGQ5LDB4MWQsMHg1YywweDU5LDB4NWQsMHg4NCwweGZlLDB4ODcsMHhkNCwweDdmLDB4MzUsMHgzYiwweDg1LDB4ZjMsCi0gIDB4NTcsMHhhYywweDJhLDB4NWUsMHg0MSwweDRmLDB4ZjAsMHgwZiwweDdiLDB4N2UsMHg0MywweGY0LDB4M2YsMHhmOSwweDY0LDB4MTgsCi0gIDB4ZmUsMHgwMSwweDFiLDB4ZjYsMHhkMCwweDQ5LDB4MzUsMHgzOCwweGIzLDB4YmIsMHg5MSwweDRlLDB4NzMsMHg2ZCwweGM2LDB4MWQsCi0gIDB4MTQsMHhhNSwweGZmLDB4NTEsMHg1ZiwweDU5LDB4ZTMsMHg4ZiwweGE3LDB4YjcsMHgxZSwweDA4LDB4ZmUsMHgxMSwweGQwLDB4YWMsCi0gIDB4NWIsMHhjNiwweDdlLDB4Y2UsMHg5MiwweDdmLDB4ZGYsMHg3MSwweDQwLDB4ZjAsMHg4ZiwweDE4LDB4MjgsMHhhMywweGM4LDB4ZmMsCi0gIDB4OTcsMHgzNywweDU4LDB4OTgsMHgyYywweGFjLDB4N2YsMHhiNiwweGQxLDB4OGUsMHg1MiwweGViLDB4ZjAsMHgzZiwweDA3LDB4NWEsCi0gIDB4OTIsMHgwNSwweGYzLDB4NWYsMHhhYywweGZlLDB4YWIsMHg4NSwweDI2LDB4YzIsMHhiMiwweGViLDB4OWMsMHg4MSwweDgzLDB4N2YsCi0gIDB4ZDQsMHgwMCwweGZlLDB4NzEsMHg5ZiwweGQ2LDB4MjEsMHgwYSwweDdiLDB4NWUsMHgwNSwweDM5LDB4MWYsMHgyNCwweGUzLDB4MWYsCi0gIDB4YTksMHhmZSwweDZiLDB4MTYsMHgxOSwweDdjLDB4NjIsMHhkZCwweDUxLDB4NDQsMHhmZSwweDRiLDB4NjcsMHhiMCwweGU3LDB4MWMsCi0gIDB4MWMsMHgyOCwweDg0LDB4N2YsMHhlYywweGQzLDB4Y2EsMHhhOSwweGZmLDB4MjIsMHg4OSwweGIwLDB4Y2IsMHg1NiwweGMzLDB4OTgsCi0gIDB4ZmQsMHhiNSwweDRkLDB4YTEsMHhmOCwweDI3LDB4NGYsMHg2OSwweGFiLDB4OTcsMHhjMSwweDE4LDB4M2UsMHhmYSwweDgzLDB4YWEsCi0gIDB4NjMsMHhmMCwweGVhLDB4ZGUsMHg4NSwweGUzLDB4NjUsMHgzNCwweGIxLDB4MTUsMHg4NiwweDdmLDB4NmUsMHg3NCwweDY2LDB4NDcsCi0gIDB4YTYsMHhmOSwweGFkLDB4NzcsMHhlMCwweDk3LDB4Y2UsMHg3YywweDE3LDB4NDQsMHhlMCwweDlmLDB4ZmEsMHg1YiwweDlkLDB4MzAsCi0gIDB4YmEsMHhmYywweDBmLDB4M2QsMHhlZiwweDEyLDB4ZTEsMHhmOCwweDY3LDB4YmIsMHgzMywweDNiLDB4YjYsMHg2ZCwweDkyLDB4ZjMsCi0gIDB4YWIsMHgyYywweDFkLDB4ODEsMHg3ZiwweGE0LDB4ZDcsMHhjYywweDhiLDB4MTEsMHhmOSwweDJmLDB4MDcsMHhlNCwweDk0LDB4NDksCi0gIDB4YWYsMHhmOSwweDlmLDB4ZjgsMHhmMiwweDVmLDB4MDIsMHhmZSwweDQxLDB4ZjUsMHgzZiwweGZiLDB4NDcsMHg5MywweDkxLDB4ZjgsCi0gIDB4MjcsMHhhMCwweDE3LDB4MzIsMHgwYiwweGU0LDB4YmYsMHgwZSwweDk2LDB4YjksMHg2NSwweGVmLDB4MDQsMHgxNiwweDhlLDB4NjgsCi0gIDB4N2IsMHgxMiwweGM2LDB4YzEsMHgyOCwweGZjLDB4NDMsMHhmNSwweDNmLDB4MWYsMHg5MSwweGMxLDB4NmYsMHgyYiwweDVmLDB4NWEsCi0gIDB4ZjIsMHg1MSwweGY2LDB4YTIsMHgzMSwweDk4LDB4MGIsMHhkMSwweDNmLDB4NTMsMHhmYywweDQzLDB4Y2YsMHgyZiwweDVhLDB4ZjYsCi0gIDB4OWUsMHhhYiwweGZjLDB4NzgsMHhjYiwweDQ0LDB4MzYsMHhhMCwweDdmLDB4YzYsMHhmMCwweGNmLDB4MjQsMHgxYywweDZkLDB4NmYsCi0gIDB4Y2EsMHg2ZSwweDJiLDB4OTYsMHhmZiwweGIxLDB4MjcsMHhkNSwweDYzLDB4MWYsMHg0YywweDVhLDB4ZDEsMHhmYSwweGU3LDB4MmMsCi0gIDB4YjQsMHhjNywweDY4LDB4M2UsMHgzNCwweDlhLDB4ZmYsMHhlMSwweGE0LDB4OTksMHhkMiwweDYzLDB4ZDUsMHg2NiwweDUwLDB4M2MsCi0gIDB4ODksMHhlMiwweDlmLDB4ZmYsMHg4NiwweGEzLDB4NTYsMHhkMywweDQzLDB4NjksMHg2OSwweDYxLDB4NDQsMHhlMSwweDlmLDB4NGYsCi0gIDB4ZWQsMHhmOCwweGFjLDB4MzQsMHg4YiwweGU3LDB4N2YsMHgyNiwweDk1LDB4MWMsMHhhOSwweGJmLDB4YzAsMHhiZSwweDNmLDB4MDQsCi0gIDB4ZmYsMHhmNCwweDU4LDB4ZmQsMHgwNiwweDdhLDB4ZmYsMHgyOCwweGZlLDB4MTksMHg4NywweGE3LDB4M2EsMHg4YywweDYxLDB4MzQsCi0gIDB4M2UsMHgyOCwweGZlLDB4NzksMHg1YiwweGZiLDB4ZjksMHgzZSwweDE4LDB4MGYsMHhmMiwweDNmLDB4NjEsMHhmOCwweGU3LDB4MGMsCi0gIDB4YmMsMHhkNSwweDU3LDB4M2YsMHgyZSwweGE2LDB4YmQsMHgzMCwweGZkLDB4NGYsMHgzOSwweDhiLDB4Y2YsMHg5NCwweGZhLDB4M2UsCi0gIDB4MzQsMHg4ZiwweGEyLDB4ZjEsMHhjMSwweGY1LDB4M2YsMHhkNiwweGM3LDB4YjEsMHg4NiwweDUxLDB4MzQsMHgzZSwweGI4LDB4ZmUsCi0gIDB4YzcsMHgyNCwweGY1LDB4NWYsMHhhOSwweDYyLDB4ZjgsMHgxZiwweDY3LDB4NzYsMHg4YiwweDllLDB4YjcsMHg2MSwweDBmLDB4M2EsCi0gIDB4NWYsMHg1NCwweGZmLDB4N2MsMHg1YywweGRiLDB4YmIsMHg2NiwweDUxLDB4YmUsMHgyOCwweGZlLDB4ODcsMHg4MCwweDFjLDB4ZTUsCi0gIDB4MDMsMHhiOCwweDBhLDB4NGIsMHhhYywweDg0LDB4YzQsMHhmZiwweGVjLDB4MGYsMHhlMiwweDFmLDB4ODYsMHgwNywweGIyLDB4ZDYsCi0gIDB4NTQsMHg1YiwweGEzLDB4NWEsMHgzYywweGZmLDB4NzMsMHhkNiwweDNhLDB4NmMsMHgxZiwweDhiLDB4MjgsMHhiZiwweDgxLDB4ZTMsCi0gIDB4MWYsMHhhZCwweGJkLDB4MzUsMHhiOSwweGFhLDB4ZjQsMHgzYSwweGY0LDB4Y2YsMHhkZCwweGIxLDB4ZTQsMHg5YSwweDJlLDB4ZDQsCi0gIDB4YWYsMHgwNiwweGMzLDB4M2YsMHg4NywweDk0LDB4MTIsMHgzMCwweGNjLDB4NTIsMHg5YywweDBmLDB4ZjEsMHhkNiwweDgzLDB4ODQsCi0gIDB4N2YsMHhlZSwweGI2LDB4NjEsMHhjZiwweGI2LDB4NjIsMHhmNCwweGNmLDB4NmUsMHgzZSwweGViLDB4MGEsMHhhYywweDZjLDB4YWQsCi0gIDB4YzQsMHhlNiwweDJiLDB4ZTMsMHgxZiwweDA3LDB4M2YsMHhjNCwweDJlLDB4MTgsMHg4NywweDYyLDB4NGIsMHhmYywweGMwLDB4MjAsCi0gIDB4NWMsMHhmZiwweDFjLDB4ZWYsMHhkMywweGJhLDB4NjIsMHhjOSwweDQyLDB4ZmUsMHgzZiwweDg0LDB4ZmYsMHg3OSwweGQyLDB4OWQsCi0gIDB4NWQsMHhlNiwweDE5LDB4MzAsMHg1YSwweDQzLDB4ZjQsMHhkZSwweDk4LDB4ZmUsMHhhNywweGUzLDB4OTksMHg2NCwweGIyLDB4YjUsCi0gIDB4MDgsMHhmZiwweDFmLDB4ODYsMHg3ZiwweGRlLDB4MzAsMHgwNiwweGYxLDB4ZmIsMHg5NywweGY4LDB4MWYsMHhjZCwweGZiLDB4YWYsCi0gIDB4N2UsMHgyNiwweGQ2LDB4YjQsMHgxNiwweGJkLDB4M2UsMHgwNCwweGZmLDB4ZTQsMHg5YywweGZhLDB4YWYsMHg0MiwweGZjLDB4Y2YsCi0gIDB4MGEsMHg5NiwweGZmLDB4ZWEsMHhhYiwweGVlLDB4YmIsMHg1ZCwweDgwLDB4M2QsMHhkMSwweGY5LDB4YWYsMHhiMywweGQwLDB4NjEsCi0gIDB4NjQsMHg0YywweGY0LDB4NzksMHg0MSwweGViLDB4YmYsMHhmZSwweDAwLDB4OWQsMHhiMCwweGYwLDB4NzQsMHgwNywweGY2LDB4ZmMsCi0gIDB4MjIsMHhmYywweGNmLDB4ZTYsMHhmOCwweDMxLDB4ZTUsMHg1MCwweGZiLDB4MWQsMHhhNywweGQ0LDB4ODAsMHgxMCwweDNhLDB4NWMsCi0gIDB4ZmYsMHg3MywweDkxLDB4ZWMsMHg0ZSwweGQ4LDB4N2UsMHgyMiwweGUwLDB4MWYsMHhiMSwweDdlLDB4NjcsMHhhYSwweGI3LDB4MjksCi0gIDB4OWYsMHg5OCwweDVhLDB4MWQsMHgzYywweGJmLDB4MTAsMHhmZSwweGU3LDB4NjEsMHhlNSwweDA0LDB4OGMsMHgwZCwweGQ0LDB4NGMsCi0gIDB4OTQsMHg2MywweGY3LDB4OGYsMHhmMCwweDNmLDB4NDQsMHhmZiwweGIzLDB4MzMsMHg1NSwweDkzLDB4NDMsMHhmOSwweDZhLDB4ZDEsCi0gIDB4ZmYsMHg4NywweDA1LDB4ZWQsMHgyMywweDJkLDB4OTMsMHg0ZCwweGU3LDB4NGIsMHhiMCwweDc4LDB4MGEsMHhmOCwweDY3LDB4MDYsCi0gIDB4OWYsMHhhZiwweDc5LDB4YWEsMHhiNywweGU5LDB4MjAsMHhkYiwweDNmLDB4NmYsMHgxMSwweGY3LDB4NGYsMHgwYywweGZmLDB4OWMsCi0gIDB4ODUsMHgzMywweDJkLDB4OGQsMHg5ZSwweDVlLDB4M2EsMHgxNCwweGZmLDB4ODAsMHhiMCwweDdiLDB4YmYsMHgwZSwweDBkLDB4OTMsCi0gIDB4MDksMHg2YywweDNmLDB4MGYsMHhjMSwweDNmLDB4ZGQsMHg1NiwweDMyLDB4NWYsMHg4OCwweGZmLDB4ZTEsMHhlNywweGY1LDB4MTgsCi0gIDB4ZWMsMHg3OCwweGVjLDB4ZjYsMHhhMSwweDYyLDB4ZjksMHgxZiwweDUyLDB4MGYsMHhkNSwweGE1LDB4MWIsMHhiOSwweDEwLDB4M2MsCi0gIDB4YzAsMHhjMiwweDVmLDB4MmUsMHhkNCwweDdmLDB4OWQsMHgzNCwweDFhLDB4NGUsMHhhMCwweGU3LDB4MGIsMHhjMiwweGZmLDB4ZWMsCi0gIDB4ODksMHg0ZiwweDJiLDB4ZDMsMHg2ZCwweDIxLDB4ZTcsMHg5NywweGRmLDB4ZmYsMHhhNywweGQ5LDB4MmQsMHhmYiwweGRhLDB4ZDIsCi0gIDB4M2MsMHhiNiwweGUxLDB4YTIsMHhiZCwweDZjLDB4OGUsMHhmNywweDE2LDB4ODEsMHg3ZiwweDFjLDB4MjMsMHhjNCwweGIyLDB4NDEsCi0gIDB4NjUsMHhjNCwweGU4LDB4MzEsMHg4YSwweGQ1LDB4M2YsMHgxZiwweDI2LDB4YzIsMHgyNywweDZiLDB4NGIsMHgyYywweDlkLDB4ZWQsCi0gIDB4MDksMHhjMSwweDNmLDB4NDEsMHhkYiwweGMzLDB4OTEsMHg5OSwweGUxLDB4ZmUsMHgzZiwweDUyLDB4ZmQsMHgzYiwweDFiLDB4ZjgsCi0gIDB4MGIsMHg5MSwweGMyLDB4ZjgsMHgxZiwweDk2LDB4MGYsMHhiZCwweDNlLDB4ZmQsMHgzMywweDFjLDB4NTUsMHg4YiwweGMyLDB4M2YsCi0gIDB4MWMsMHgwOCwweDE1LDB4YzQsMHgzZiwweGYyLDB4NjMsMHhlMiwweGQ3LDB4MWYsMHhjYSwweGY4LDB4ZTcsMHgyZSwweGU5LDB4ZjQsCi0gIDB4N2YsMHhkOCwweDFlLDB4ZjgsMHhmNSwweGMwLDB4NDEsMHhmYywweDUzLDB4ZGUsMHhlMCwweDk2LDB4N2QsMHhkMSwweDQyLDB4ZjgsCi0gIDB4ZGYsMHg0MCwweGUzLDB4NDQsMHg2MSwweGZkLDB4YjMsMHgzMywweDM4LDB4NjcsMHg0ZiwweGYzLDB4N2EsMHhmNCwweGNmLDB4ZmIsCi0gIDB4MDQsMHhhMywweGE0LDB4NjgsMHhmYywweGUzLDB4MGQsMHg4MiwweDdmLDB4YzEsMHhmMSwweDhmLDB4MzcsMHgwOCwweDJhLDB4YTIsCi0gIDB4NTEsMHhmYywweDIzLDB4MTQsMHg4MiwweDE1LDB4ODMsMHg3ZiwweDM4LDB4ZWMsMHg0OSwweDQ1LDB4ZDcsMHg3ZiwweDE1LDB4NTEsCi0gIDB4MGYsMHg4NSwweGUxLDB4OWYsMHgzOSwweGQ3LDB4NTEsMHhmZiwweDI1LDB4OTQsMHgxZCwweDdkLDB4ZGUsMHhmYSwweGFmLDB4NjIsCi0gIDB4ZWIsMHhkZiwweGNiLDB4ZTYsMHgxMiwweGZkLDB4NGYsMHhiOCwweGZlLDB4MzksMHhjMCwweGZmLDB4NDAsMHg1MSwweGY4LDB4ODcsCi0gIDB4YmEsMHhkOSwweDdjLDB4M2YsMHg2YywweGJlLDB4MjEsMHhmYywweDhmLDB4M2QsMHg2OCwweDlkLDB4ZTUsMHhmYSwweGU3LDB4NDQsCi0gIDB4ZTAsMHg5ZiwweDcxLDB4YTgsMHg4ZCwweDc5LDB4NjgsMHhjNywweDU4LDB4NjcsMHhlZiwweGQxLDB4ZDAsMHhkNSwweDU3LDB4MjgsCi0gIDB4ZmYsMHg0NSwweDY2LDB4YTcsMHhkMSwweDQxLDB4NTUsMHhjNywweDcwLDB4ODYsMHhlOSwweDlmLDB4ZmIsMHgzMCwweGZjLDB4ZjMsCi0gIDB4NDIsMHgyMCwweDhjLDB4MTEsMHhmZSwweDNmLDB4NGMsMHhmZiwweGIzLDB4OWEsMHg0ZiwweDI0LDB4YTgsMHg3ZiwweDQ2LDB4ZjIsCi0gIDB4NWYsMHgxMCwweGIxLDB4MzAsMHg0MiwweGYwLDB4OGYsMHg1MywweDA4LDB4MzYsMHhhNywweGE4LDB4ZmMsMHgxNywweDA2LDB4N2IsCi0gIDB4MGEsMHhkNSwweGJmLDB4YmIsMHg0NCwweGQwLDB4NDQsMHg3MSwweGY4LDB4YzcsMHg3YiwweDVhLDB4OTMsMHg0ZSwweDNkLDB4NTQsCi0gIDB4NDEsMHhmYywweGYzLDB4YWUsMHg1MywweDA4LDB4ZjYsMHhmZCwweGY4LDB4MWYsMHhhZCwweDIyLDB4ZjEsMHhjZiwweDY1LDB4YjAsCi0gIDB4NGYsMHg5ZiwweDNkLDB4ZjYsMHg4YiwweGZmLDB4MzUsMHgyYiwweDE0LDB4ZmYsMHhjYywweGYwLDB4YTMsMHg5ZCwweDdkLDB4ZjEsCi0gIDB4NjYsMHhlMCwweDhhLDB4NjgsMHgxNywweGZmLDB4YjAsMHhmOCwweDc3LDB4NzksMHhmYiwweGNmLDB4M2YsMHgzOCwweGQ1LDB4YTYsCi0gIDB4ZTMsMHg2NSwweGZiLDB4ZTMsMHhkZiwweDgxLDB4OTcsMHhmNSwweDM0LDB4NTUsMHg0NCwweDE3LDB4YTgsMHg3ZiwweGI3LDB4MDcsCi0gIDB4YzMsMHgzNiwweDEwLDB4NWEsMHhjMCwweDExLDB4NTEsMHg3NCwweGZkLDB4ZDcsMHg3MywweDBlLDB4ZmYsMHhiZiwweDllLDB4M2EsCi0gIDB4ZmEsMHgxNiwweGFhLDB4ZmYsMHhhMiwweGIzLDB4YWIsMHgyMywweGJiLDB4NmIsMHhhMywweGMzLDB4NjAsMHg0OCwweGZiLDB4YTcsCi0gIDB4NzcsMHgzZiwweDEyLDB4ZmYsMHgxMywweDVhLDB4ZWYsMHgxYywweGFhLDB4N2YsMHg2ZSwweGNlLDB4MjYsMHg5YywweGZjLDB4OTcsCi0gIDB4OGYsMHhmZiwweDA5LDB4YWYsMHhmZiwweDIyLDB4ZmEsMHgxMywweDM1LDB4YTAsMHg2NywweDBlLDB4ZTcsMHg3ZiwweDVjLDB4ZmMsCi0gIDB4ZTMsMHhiYiwweGRlLDB4NWYsMHhmZiwweDQ1LDB4ODIsMHhmMCwweDNhLDB4MTksMHhlNCwweDFlLDB4YmIsMHhhMywweGMzLDB4MjUsCi0gIDB4Y2EsMHgxYSwweDBhLDB4ZTAsMHgxZiwweGNhLDB4ZmYsMHhlNCwweDEyLDB4ZTcsMHhhOSwweDNlLDB4NmEsMHhmMCwweGM0LDB4ZjYsCi0gIDB4YzEsMHgyZCwweDUxLDB4ZjgsMHhjNywweDk5LDB4ZGQsMHgyMywweGMzLDB4ZGIsMHhjZiwweGM3LDB4NWQsMHg0NywweGEwLDB4ODIsCi0gIDB4ZmMsMHg4ZiwweDNlLDB4NjQsMHhhZCwweDMwLDB4MTIsMHg0NSwweGYzLDB4M2YsMHgzOSwweDgyLDB4MGYsMHgyMSwweDg1LDB4ZjEsCi0gIDB4M2YsMHhkYywweGZmLDB4MjcsMHgyNSwweGYyLDB4M2YsMHhkZCwweGIxLDB4MTQsMHhjZSwweGZmLDB4MjAsMHhmYSwweGU3LDB4MDEsCi0gIDB4NjUsMHgzYywweGQ5LDB4NmQsMHgxOSwweDM4LDB4N2YsMHgyMiwweGQ0LDB4N2YsMHhhOSwweDZjLDB4ZmQsMHg5YywweDg2LDB4NmMsCi0gIDB4NmUsMHg0NSwweDAzLDB4Y2EsMHhmZiwweDcwLDB4ZmMsMHhkZiwweGE3LDB4YjMsMHhmMywweGZkLDB4YjIsMHgwZCwweDhkLDB4OWIsCi0gIDB4Y2QsMHgzYSwweDBjLDB4ZmYsMHg0YywweGYwLDB4ZjMsMHg5NywweGUzLDB4OWYsMHgyMSwweGM4LDB4ZTksMHgwZCwweDkwLDB4OTYsCi0gIDB4ZjQsMHgzZiwweGVlLDB4YmYsMHgyZSwweDYwLDB4ZjUsMHg1ZiwweDFmLDB4MTgsMHg1ZCwweGEzLDB4YzksMHhiNiwweDAyLDB4ZmMsCi0gIDB4NGYsMHg5NiwweGFmLDB4ODcsMHhhYywweGQxLDB4ZGUsMHg2MSwweGY0LDB4NmIsMHg4MiwweGZlLDB4ODcsMHhjNSwweDY3LDB4OTIsCi0gIDB4MmQsMHg4NywweDM2LDB4OWQsMHg5ZCwweGZlLDB4YmYsMHg1MywweDNhLDB4YWQsMHhiZSwweDdlLDB4OTQsMHgwZiwweDk5LDB4NjYsCi0gIDB4ZDcsMHgwYiwweGZjLDB4Y2YsMHgzMCwweDBjLDB4NTksMHgwZCwweGU5LDB4YjQsMHgyMCwweGZiLDB4ZTEsMHhmOCwweDY3LDB4YTYsCi0gIDB4NzcsMHhiZCwweDM5LDB4OTcsMHhjNSwweGU3LDB4MDIsMHg1YywweDg5LDB4ODUsMHhkNiwweDdmLDB4NzksMHhmMywweGQ1LDB4NjYsCi0gIDB4MDgsMHgwZiwweDVkLDB4OGUsMHhmOCwweGU3LDB4YTAsMHhlZiwweDZiLDB4ZGMsMHhmZiwweDg0LDB4ZTMsMHg5ZiwweDY5LDB4ZjIsCi0gIDB4ZmUsMHgyOCwweDZkLDB4OWIsMHgwOCwweGZlLDB4MDEsMHg4ZSwweDdmLDB4N2UsMHgwNywweGNmLDB4NWIsMHg3ZCwweDA2LDB4NWEsCi0gIDB4ZmYsMHg5ZSwweGMzLDB4ZjAsMHhjZiwweDMxLDB4YjMsMHg1ZiwweDMxLDB4NzIsMHhhOCwweDllLDB4ZTEsMHg2ZCwweDhlLDB4N2YsCi0gIDB4NTQsMHg4NiwweDdmLDB4MmUsMHhjMSwweDdiLDB4ZDYsMHg5MiwweDkwLDB4ZmEsMHg3NywweDQxLDB4NWYsMHhjZCwweGNlLDB4YTMsCi0gIDB4NmMsMHhlOSwweGM5LDB4MTMsMHgzOCwweGZlLDB4YTksMHg3ZSwweDkzLDB4YWQsMHgwNywweGMxLDB4ZmYsMHhmOSwweDNkLDB4ZTUsCi0gIDB4NzAsMHg3ZiwweDI4LDB4ZmYsMHhlMywweDVkLDB4NmYsMHgwOSwweGY1LDB4NWMsMHg0YSwweDc3LDB4MjYsMHhkNSwweDEyLDB4YzIsCi0gIDB4ZmYsMHg3OCwweDlmLDB4ZjksMHgyYSwweGM3LDB4M2YsMHg2NiwweDM3LDB4MjQsMHhmZiwweDA2LDB4ZDUsMHgwYiwweGUxLDB4ZmMsCi0gIDB4OGYsMHhmZCwweDNjLDB4OTYsMHhiNiwweGUyLDB4ZmMsMHgwZiwweGQ3LDB4M2YsMHg4YiwweGY1LDB4NWYsMHgzOSwweGE4LDB4YzIsCi0gIDB4ZjksMHgwNywweDVlLDB4ZmYsMHhiNSwweGVmLDB4MjYsMHgzNiwweGRmLDB4NGYsMHhmNCwweDRmLDB4YzgsMHg2YSwweGMxLDB4ZTYsCi0gIDB4N2IsMHg5NiwweGU3LDB4YjMsMHgzOCwweGZlLDB4YjksMHg2MCwweGJjLDB4MGUsMHg0YiwweDVhLDB4ZDEsMHhmOCwweDljLDB4NjUsCi0gIDB4ZWIsMHg2NywweDNlLDB4NjQsMHgzYywweDkwLDB4NzMsMHg0YSwweGU5LDB4ODIsMHg3ZSwweDRkLDB4YzMsMHhmOCwweDlmLDB4ZDcsCi0gIDB4ZDgsMHhlZiwweDZiLDB4YWEsMHg5ZCwweDZjLDB4NzYsMHg5OSwweGY2LDB4NzYsMHg2MywweGQ1LDB4NjIsMHg2YywweGJlLDB4ODIsCi0gIDB4ZmUsMHg3OSwweDJlLDB4OGYsMHg3ZiwweGIyLDB4YTcsMHg5YSwweGU4LDB4N2YsMHg1MCwweGZlLDB4YzcsMHhiYiwweGJlLDB4NWYsCi0gIDB4MTUsMHhmMiwweDU5LDB4NDMsMHhkMCwweGQwLDB4NTYsMHg4ZSwweGRkLDB4ZmYsMHgzOCwweGZiLDB4ZmUsMHg3MSwweGJlLDB4MWUsCi0gIDB4ODYsMHg4OSwweGFjLDB4ZjcsMHg2ZSwweDRjLDB4ZmYsMHgzMywweGViLDB4MTIsMHhjNywweDMzLDB4N2MsMHhiZCwweGY1LDB4NzUsCi0gIDB4ZTUsMHhhMCwweDQ5LDB4NGYsMHg0NywweGYzLDB4M2YsMHgxYSwweGFmLDB4ZmYsMHhiYSwweDA0LDB4NGYsMHgyNCwweGVhLDB4MDYsCi0gIDB4MzQsMHgwYywweGZmLDB4ZjAsMHhmYSwweDYyLDB4OGQsMHhlMywweDlmLDB4ZWQsMHhmNCwweGJjLDB4NzYsMHhmNywweDY3LDB4NWYsCi0gIDB4M2QsMHgwZSwweDU2LDB4ZmYsMHg3NSwweDIyLDB4YjksMHgxNSwweDZhLDB4NDYsMHg1MSwweDNlLDB4MjQsMHhjNywweGYxLDB4ZDUsCi0gIDB4N2MsMHg4NiwweDdmLDB4MGUsMHgyOCwweDg3LDB4YWMsMHg2NiwweDIzLDB4ODEsMHhmMSwweDNmLDB4NDcsMHgzMCwweGZjLDB4MzMsCi0gIDB4NjYsMHhiZiwweGY2LDB4YjksMHg3YSwweDgzLDB4NzAsMHhmZSwweGE3LDB4NGQsMHgzZCwweDYwLDB4YmEsMHg4NywweGQ0LDB4MjUsCi0gIDB4ZTUsMHhmNSwweGNlLDB4MjUsMHg5OSwweDFhLDB4ZWMsMHhmYywweDNhLDB4YzksMHhmNSwweGM2LDB4MWMsMHhjZiwweDhjLDB4YzIsCi0gIDB4NTYsMHgyMCwweGZhLDB4YzMsMHgzOCwweGMyLDB4ZmYsMHhiMCwweGViLDB4MmQsMHhkZCwweGFkLDB4ZmYsMHhiMiwweGFmLDB4MzcsCi0gIDB4YjcsMHhlYSwweDIxLDB4N2EsMHg0NSwweDVlLDB4ZmYsMHg2NSwweGNlLDB4ZGQsMHhjNiwweGNmLDB4M2IsMHhjYiwweDRjLDB4ZjYsCi0gIDB4NmEsMHhkOCwweGZiLDB4ZDcsMHhhOCwweDgwLDB4NTcsMHhiZCwweGY5LDB4MmEsMHg2NywweGI0LDB4ZGYsMHhjMCwweGEwLDB4OTksCi0gIDB4NzYsMHg4ZSwweDA5LDB4NzksMHhiZSwweDQ3LDB4NzgsMHhiZSwweDU1LDB4NjcsMHg3OCwweGUwLDB4M2QsMHhlYiwweGIyLDB4ZDksCi0gIDB4ZjQsMHhiNywweGMxLDB4ZjgsMHg5MCwweDU0LDB4OWEsMHgyYSwweGUwLDB4OWYsMHg5OCwweGJiLDB4NjksMHg3ZiwweDAwLDB4YzcsCi0gIDB4YjUsMHgyNSwweDA2LDB4Y2EsMHhmZiwweDhjLDB4MzEsMHhmZSwweDQ3LDB4YTgsMHhmZiwweDdhLDB4NGYsMHhlOSwweGM5LDB4MjYsCi0gIDB4NTcsMHg5NSwweGEzLDB4N2MsMHg0ZSwweDFiLDB4YzMsMHgzZiwweGZjLDB4YmMsMHhjYiwweGI1LDB4ZjUsMHg1OCwweDQ5LDB4MGQsCi0gIDB4M2IsMHhlZiwweGFhLDB4ZjIsMHg2YywweGZkLDB4YjgsMHhmZSwweDg3LDB4NzYsMHgxMCwweDVhLDB4NGMsMHg2NSwweGNiLDB4YWEsCi0gIDB4YTQsMHg1ZSwweDIyLDB4ZDgsMHgwMCwweDYyLDB4ZjUsMHhlZiwweDU0LDB4OGYsMHg0NCwweDY3LDB4MzcsMHgwZSwweDQ3LDB4NWIsCi0gIDB4ZWEsMHg2NywweGFmLDB4MWYsMHg5OCwweDMzLDB4MTEsMHgwYiwweGUwLDB4YmQsMHg5OSwweGRlLDB4ZmQsMHgxMCwweGZmLDB4NjcsCi0gIDB4NjcsMHg1MiwweGQ1LDB4OTMsMHhmMCwweGQ5LDB4YzIsMHg1NywweDM1LDB4OWMsMHhmZiwweGI5LDB4MTUsMHhjMSwweDNmLDB4NTcsCi0gIDB4ZTEsMHhhYSwweDM1LDB4OTgsMHg0YiwweDljLDB4OGMsMHgxZiwweGYwLDB4OGMsMHg4MCwweDM4LDB4ZmUsMHg2MSwweGZhLDB4NDMsCi0gIDB4NmIsMHhiZSwweDgwLDB4NzYsMHhmNiwweDViLDB4ZDUsMHgyNywweDUzLDB4M2IsMHg5NCwweDVhLDB4ZjAsMHhmYiwweDNmLDB4NzMsCi0gIDB4ZmMsMHhlMywweGYwLDB4M2YsMHhlZSwweGQzLDB4MzQsMHgwOCwweGM2LDB4YTMsMHhhOSwweDAxLDB4YmYsMHgzMSwweDBiLDB4YzUsCi0gIDB4M2YsMHhmNSwweGVjLDB4N2UsMHgwNCwweGZlLDB4NjcsMHgzZiwweDI0LDB4YWQsMHhiNSwweGJkLDB4NGEsMHgxYSwweGNhLDB4OGEsCi0gIDB4ZTMsMHg3ZiwweGNlLDB4NDMsMHg0MywweDdkLDB4NWEsMHg4ZiwweGVmLDB4MGUsMHhkNiwweGJmLDB4NjMsMHhmZCwweDJmLDB4YTYsCi0gIDB4ZTEsMHgyYSwweDM0LDB4ZDUsMHhhMywweGY4LDB4NjcsMHgxYywweGMzLDB4M2YsMHgxMywweGY2LDB4NjksMHg1OCwweDZmLDB4ZTMsCi0gIDB4OWYsMHhkNSwweDEzLDB4MjYsMHgxNywweDFhLDB4MzksMHhmZiwweDNhLDB4MjcsMHhmMiwweDNmLDB4M2EsMHhiZiwweDdmLDB4ZTMsCi0gIDB4NzYsMHhiMCwweGQ3LDB4YzMsMHg0OCwweGMwLDB4M2YsMHhmMywweDUzLDB4MDEsMHhmZiwweDA4LDB4YmYsMHhiZSwweDFkLDB4OWYsCi0gIDB4MTYsMHg0ZCwweDlmLDB4NzksMHhjYywweGZmLDB4NDYsMHgyNiwweGUxLDB4OWYsMHg3YiwweGY4LDB4ZTksMHg3ZiwweGMwLDB4NWEsCi0gIDB4ZGMsMHhhNiwweGZkLDB4NzUsMHg5NSwweDAzLDB4MDMsMHg0YSwweDFmLDB4YzYsMHhmMSwweGNmLDB4N2EsMHg5ZSwweGVkLDB4MWEsCi0gIDB4ODQsMHhmYSwweDRkLDB4ZTksMHhlNSwweGQ1LDB4MGUsMHhlYywweDI5LDB4NWIsMHgxMSwweDVmLDB4OGYsMHhlMCwweDlmLDB4MTksCi0gIDB4NGUsMHg3YywweDY2LDB4ZDksMHhkMSwweDUwLDB4M2YsMHg4NSwweGJiLDB4MzYsMHhkOSwweGRiLDB4ZjIsMHhiNCwweDMzLDB4NGQsCi0gIDB4ODEsMHgxMSwweDQyLDB4ZjEsMHgwZiwweDhkLDB4ZmYsMHg2OCwweGJhLDB4MzcsMHgxMiwweGZmLDB4ZTQsMHg0YSwweDg0LDB4ZjcsCi0gIDB4YTksMHg5NywweDQwLDB4MjgsMHhmYiwweDEyLDB4ZjcsMHg5MywweDhmLDB4ZDksMHhmMywweDZlLDB4ZTgsMHg5YywweGZmLDB4NTEsCi0gIDB4OTcsMHg1OSwweDQ2LDB4M2UsMHhmNSwweDJmLDB4OTEsMHhmOCwweGU3LDB4MDEsMHg3NSwweDQ0LDB4OGMsMHg2NywweDcyLDB4OGMsCi0gIDB4ZTksMHhlYiwweDQ0LDB4ODYsMHhlZCwweGJmLDB4ODIsMHhmZCwweDJmLDB4MDgsMHhkYSwweGY5LDB4MTQsMHg5NiwweGY0LDB4MjYsCi0gIDB4MGEsMHhlMCwweDFmLDB4YjcsMHhmZiwweGM1LDB4MDYsMHhlNywweGY0LDB4MzksMHhhMCwweGUxLDB4ZmMsMHg4ZiwweDgwLDB4N2YsCi0gIDB4MTYsMHhkMSwweDQzLDB4OGQsMHg5NiwweDA1LDB4NWQsMHhiNCwweDFhLDB4Y2MsMHgzNCwweGQyLDB4ZmYsMHg2MiwweDhlLDB4YmYsCi0gIDB4ZmUsMHhjYiwweDNiLDB4NmQsMHg3YiwweGZiLDB4ZWYsMHgwZCwweGQxLDB4M2YsMHg3YiwweDFmLDB4ZDYsMHhmZiwweGMyLDB4OTUsCi0gIDB4ZmQsMHhhYywweDI5LDB4ODAsMHg3ZiwweDUyLDB4MzIsMHhmZiwweDYzLDB4NDgsMHg2NSwweDVmLDB4MDIsMHhmZiwweDYzLDB4YjAsCi0gIDB4ZWYsMHg5NywweGY4LDB4OWYsMHg5MCwweGZjLDB4Y2IsMHhkOSwweDU5LDB4OGMsMHhmZiwweDkxLDB4ZWEsMHhkZiwweDk1LDB4ZTYsCi0gIDB4NTYsMHg1MSwweGM2LDB4YzMsMHhhOCwweGExLDB4YjMsMHhhMSwweGZhLDB4OWYsMHg0ZCwweDA5LDB4ZWEsMHg5NywweDE4LDB4OGEsCi0gIDB4N2YsMHg5NiwweGNmLDB4NzcsMHg0MCwweDRlLDB4MDUsMHhhMSwweDdkLDB4ZjYsMHhjMSwweDBhLDB4YzMsMHhjMSwweDNmLDB4MzEsCi0gIDB4MWYsMHhmZSwweDYxLDB4ZmIsMHhjZiwweGRhLDB4MTksMHg5ZCwweGUyLDB4ZWMsMHgzNiwweDUyLDB4ZmQsMHg3MywweDJjLDB4MDIsCi0gIDB4ZmYsMHhiOCwweGY4LDB4YjMsMHhkNCwweDkxLDB4M2QsMHhkZiwweDVlLDB4MDgsMHhmZiwweDA4LDB4ZmUsMHgzZiwweDYzLDB4NzMsCi0gIDB4MmYsMHhhYSwweDRkLDB4NmIsMHg2YiwweDc2LDB4NDQsMHhlMiwweDFmLDB4YWYsMHhmZiwweDg1LDB4MGIsMHg3YiwweDU2LDB4YjQsCi0gIDB4ZDQsMHgzZSwweDgzLDB4ZjAsMHgzZiwweDk3LDB4ODQsMHhmNSwweDIzLDB4ZWIsMHg3ZiwweGY0LDB4MjIsMHhmMiwweDVmLDB4MWUsCi0gIDB4ZGEsMHg1MSwweDBmLDB4MjQsMHhlYSwweDJjLDB4MmQsMHg1MywweDM1LDB4NmUsMHg3YywweDEwLDB4OGEsMHg3ZiwweGU0LDB4ZmEsCi0gIDB4ZjcsMHg1OCwweGM1LDB4MWIsMHhlNCwweDMxLDB4NTEsMHhmNywweDQyLDB4MjIsMHgwNCwweGZmLDB4NTgsMHhiMywweDI1LDB4ZmUsCi0gIDB4NjcsMHhlMywweDY4LDB4ODksMHgwZCwweDg0LDB4MDIsMHg0NiwweDVlLDB4MWMsMHhmZiwweDc0LDB4NjksMHgzNywweGNiLDB4NmEsCi0gIDB4ZTcsMHgxYSwweDE0LDB4ZmYsMHhiMCwweGZkLDB4NDcsMHg5YiwweGIxLDB4NWIsMHhkZSwweDNkLDB4MmEsMHg2YywweDIwLDB4MTQsCi0gIDB4ZDgsMHhjZiwweDAzLDB4ZmQsMHgyZiwweGY4LDB4NjksMHhiNSwweGUwLDB4MjIsMHg4NiwweDdmLDB4NTgsMHg3YywweDc2LDB4ZjksCi0gIDB4ZmEsMHhlZiwweDFjLDB4YjIsMHhmMSwweGM5LDB4M2IsMHhjNCwweDA4LDB4ODgsMHg0YywweDEzLDB4YzEsMHgzZiwweDdlLDB4ZmUsCi0gIDB4YzcsMHhkNCwweDM2LDB4NzUsMHgwNCwweGY3LDB4YWIsMHhkNywweDk4LDB4ZmYsMHgwNiwweGViLDB4N2YsMHhlMSwweDQ2LDB4Y2YsCi0gIDB4NGMsMHgyZCwweDQ3LDB4ZGUsMHhiZiwweDQ2LDB4YWQsMHgxMCwweGZlLDB4YTcsMHhkMSwweGQ0LDB4MTAsMHhiYywweGE3LDB4MWMsCi0gIDB4MGIsMHhmNSwweGZmLDB4MzEsMHgwOSwweDUwLDB4MDQsMHg0NywweGZmLDB4Y2MsMHhiNywweGUyLDB4NzEsMHhhMSwweGZmLDB4ODUsCi0gIDB4NzgsMHhiYSwweDE5LDB4Y2QsMHg5YiwweGQyLDB4YmUsMHhmMywweDhlLDB4NjYsMHg0MCwweGYyLDB4OGMsMHhmZiwweGU5LDB4OTMsCi0gIDB4ZjgsMHgxZiwweGFiLDB4YjYsMHgzZSwweGU1LDB4MTksMHhmMSwweDU1LDB4MTYsMHhlNiwweDdmLDB4ZWMsMHhlNywweGE1LDB4ZDUsCi0gIDB4M2UsMHhlZiwweGRlLDB4ZjMsMHhmZSwweGIyLDB4ZGIsMHgyYiwweDBkLDB4Y2IsMHgzMywweGZkLDB4OTgsMHhkYiwweGZmLDB4MjIsCi0gIDB4ZWIsMHg5NSwweGM1LDB4YWQsMHhkMSwweDk2LDB4ZGUsMHgzZiwweDBjLDB4OGUsMHgzMCwweGI4LDB4NjAsMHhmZSwweGViLDB4MTUsCi0gIDB4MjAsMHhmZSwweGMzLDB4ZWUsMHg3YywweGNiLDB4NWUsMHhhNCwweDhhLDB4NWMsMHg1MiwweDExLDB4ZjYsMHhhNywweGY5LDB4NDcsCi0gIDB4ODMsMHhmOCwweDg3LDB4Y2UsMHg2ZSwweGE1LDB4ZjMsMHgyMiwweGVmLDB4MTgsMHg0MSwweDNmLDB4YzUsMHhjZiwweGY3LDB4ZDUsCi0gIDB4NmMsMHhmZCwweDgwLDB4ZDIsMHgwOSwweDdkLDB4OTAsMHgzMiwweGVkLDB4ZjcsMHhjMCwweGYwLDB4MDEsMHg4OCwweDFmLDB4MTUsCi0gIDB4ZWMsMHhiYiwweDMzLDB4NDEsMHg4ZiwweDFhLDB4ODgsMHgxZiwweGZiLDB4MmQsMHgxZiwweDM0LDB4NTMsMHhkMSwweGEzLDB4MDYsCi0gIDB4NWYsMHhlNCwweGZiLDB4MmQsMHg3YiwweGIxLDB4NmEsMHhhNCwweGJmLDB4NTksMHhjNCwweDQwLDB4ZjgsMHg0NCwweDVmLDB4ZTgsCi0gIDB4MGMsMHhiZSwweGM4LDB4ZjcsMHg1ZiwweGVmLDB4ZTcsMHgyYiwweDE2LDB4N2YsMHg5ZCwweGY0LDB4ZjIsMHgxYiwweDgxLDB4N2YsCi0gIDB4ODQsMHgwNSwweGQ5LDB4ODgsMHg4MSwweGZhLDB4YjksMHhiZiwweGZmLDB4NGIsMHg4ZSwweGJmLDB4YWEsMHg1YiwweDQ1LDB4YzQsCi0gIDB4M2MsMHhjNiwweGY2LDB4YzMsMHhlYiwweGZkLDB4MzQsMHgzNiwweDE2LDB4NzMsMHg1NSwweDY1LDB4ZTUsMHhlNywweGZjLDB4ZmEsCi0gIDB4ZmYsMHg4MywweDRmLDB4ZjMsMHhiNSwweDZiLDB4ZDcsMHhiMiwweDA1LDB4MDYsMHhmZiwweDlmLDB4YWYsMHhmZiwweDhhLDB4M2QsCi0gIDB4OGYsMHg1ZiwweGVmLDB4ODcsMHg1ZiwweGVmLDB4ODcsMHg1ZiwweDIwLDB4ZmUsMHg1ZiwweGVmLDB4ODcsMHg4NSwweDNlLDB4NWYsCi0gIDB4YjUsMHhmZCwweGU3LDB4YWIsMHg3NSwweGJkLDB4YzQsMHg4ZiwweDVkLDB4YjEsMHhlZSwweDIwLDB4ZmUsMHg5MCwweDgxLDB4ZjcsCi0gIDB4OGIsMHg1OSwweDU4LDB4N2UsMHhiMCwweDY1LDB4ODQsMHhlYSwweGM3LDB4YjQsMHg3ZCwweDBlLDB4OTAsMHgwZSwweGU1LDB4YzcsCi0gIDB4ZDgsMHhmYiwweGMyLDB4MzYsMHhkOCwweDEzLDB4MzMsMHg4NiwweDZlLDB4ODgsMHhjZSwweDBmLDB4ZTYsMHhlNywweDA5LDB4ZWMsCi0gIDB4NjIsMHhiNywweDkxLDB4Y2MsMHgxNywweGM4LDB4MGYsMHhjNiwweGI4LDB4M2YsMHhlNCwweDM2LDB4ZWQsMHgxYywweDNjLDB4OTQsCi0gIDB4YzUsMHhmYywweDQyLDB4MTUsMHhjZSwweDhmLDB4YjUsMHg4YiwweGZlLDB4OTAsMHhkMywweDZhLDB4NDgsMHhmZSwweDJiLDB4ODQsCi0gIDB4MWYsMHgzYiwweGVjLDB4MWEsMHg3NSwweDA2LDB4ZjgsMHgxZiwweDM0LDB4M2YsMHgzOCwweGQxLDB4ZDksMHgxNSwweDRiLDB4NGYsCi0gIDB4MjYsMHg4YSwweGQ2LDB4ODcsMHhmZiwweDI1LDB4NjksMHhkMywweDcwLDB4MDEsMHhjZCwweDlmLDB4OWUsMHg2MywweGJmLDB4MTcsCi0gIDB4ZDcsMHg4NywweGNmLDB4N2MsMHgxNywweGI2LDB4NWEsMHgzNSwweDYzLDB4NjgsMHg3ZSwweGYwLDB4MmEsMHhiYiwweDllLDB4ZTQsCi0gIDB4MDcsMHhmNywweDdhLDB4ZmMsMHhkOCwweDEwLDB4MzQsMHgwZSwweDU3LDB4NjAsMHhmYSwweGYwLDB4YjcsMHhkOCwweGZiLDB4NjksCi0gIDB4OWIsMHhhMCwweDhmLDB4NTIsMHhlYywweGQ5LDB4MGQsMHg2ZiwweDM4LDB4ODcsMHhlNSwweDA3LDB4MTUsMHg2ZiwweGJlLDB4NWUsCi0gIDB4N2YsMHg1OCwweDFhLDB4ZjYsMHhhMSwweDU4LDB4MDMsMHhiMSwweDBkLDB4M2YsMHg0YiwweGZkLDB4ZGIsMHgyYiwweDcwLDB4N2UsCi0gIDB4NGMsMHgxNywweGRlLDB4MzcsMHgzYiwweGUxLDB4Y2UsMHgyYywweGQ1LDB4NjcsMHgwNiwweGZjLDB4MjEsMHhkOSwweGZiLDB4MjAsCi0gIDB4ODgsMHhmYSwweGE4LDB4YWQsMHhkOSwweGVhLDB4MzYsMHg2ZCwweDczLDB4ZDUsMHhiYiwweGVhLDB4OGYsMHhkYSwweDZiLDB4ZjIsCi0gIDB4NGEsMHg0OCwweDdlLDB4OTAsMHhhZCwweGI3LDB4MDksMHhiMCwweDcyLDB4OGIsMHgxYywweDVhLDB4Y2MsMHhhZiwweDM3LDB4N2IsCi0gIDB4M2IsMHhhMCwweDhmLDB4MmEsMHgyNywweDZjLDB4ZDgsMHg2YiwweGQwLDB4ZDAsMHhhMSwweDc5LDB4ZmUsMHg5MCwweDE1LDB4MzgsCi0gIDB4M2YsMHhjNiwweGY1LDB4NTEsMHhhNywweDk0LDB4MjksMHgxNSwweGVmLDB4OGYsMHgzNiwweGU3LDB4NGQsMHg3NiwweDVlLDB4ODgsCi0gIDB4ZmUsMHgwMCwweDcwLDB4MzgsMHhkMywweGQwLDB4YmEsMHg4MSwweGY4LDB4MDMsMHg0NCwweGU1LDB4MDcsMHgzOSwweDNmLDB4NjYsCi0gIDB4OTUsMHg5YywweDUyLDB4MDIsMHg3YSwweGE3LDB4YTYsMHhkMCwweGZjLDB4ZTAsMHg3ZCwweDY2LDB4MzcsMHhmNCwweDE3LDB4ZDIsCi0gIDB4NDcsMHg4MSwweDljLDB4MWYsMHg0YywweDk5LDB4OWUsMHgzZiwweDUyLDB4ODgsMHgzZSwweDZhLDB4MzMsMHhlZiwweDhmLDB4OTYsCi0gIDB4YTUsMHhmOSwweGRmLDB4NWIsMHgyYywweDI1LDB4ZTgsMHg4NywweDI5LDB4ZjAsMHg2MywweDQyLDB4N2QsMHg5YywweDcyLDB4MDUsCi0gIDB4ZWUsMHgwYywweGU4LDB4YTMsMHg1NiwweDUwLDB4YmUsMHg0YiwweGU0LDB4YzcsMHgzYywweGJkLDB4ZjQsMHg2ZiwweGUxLDB4MmYsCi0gIDB4ZTAsMHg4NywweDhlLDB4YjAsMHgzYywweDgyLDB4MWYsMHg3MywweGZiLDB4YTMsMHg1MSwweDM2LDB4Y2MsMHhiMywweDg1LDB4YjQsCi0gIDB4MDIsMHhmOSwweDQxLDB4YjYsMHhmZiwweDk4LDB4YTIsMHgzZiwweDUyLDB4N2IsMHhjYywweGZlLDB4ZjUsMHhhMywweGYzLDB4ODMsCi0gIDB4M2IsMHhlNiwweDg5LDB4ZjksMHhkOSwweDU4LDB4ZWQsMHhkYSwweDEwLDB4N2QsMHhiOCwweDc3LDB4YmQsMHhjOCwweDhmLDB4YzEsCi0gIDB4NjEsMHhkZCwweGViLDB4MGYsMHhhYiwweDNjLDB4MTIsMHg5NiwweDFmLDB4YzQsMHhlYiwweGUzLDB4OGEsMHhjOSwweDBmLDB4NjYsCi0gIDB4MjAsMHg1NywweGRhLDB4NTAsMHg2YywweDdmLDB4ZDgsMHhiMiwweDhjLDB4NzIsMHhiOSwweGVkLDB4MDksMHhmMywweDliLDB4NGYsCi0gIDB4YTMsMHhmYSwweGE4LDB4ODMsMHg5YywweDJmLDB4ZWQsMHg2NCwweGZiLDB4NGYsMHgxZCwweDc0LDB4MGMsMHgxYiwweDQzLDB4NjUsCi0gIDB4MDUsMHhmMiwweDgzLDB4YzAsMHhmOSwweGIxLDB4YWEsMHg0NywweGJiLDB4MTYsMHhlMywweGY5LDB4N2QsMHgyMSwweDNmLDB4ZDgsCi0gIDB4NzUsMHhiMywweGVlLDB4OTIsMHg2MCwweGZmLDB4MDYsMHhmZiwweGQ5LDB4NDksMHhjYiwweGUyLDB4ZmUsMHgxOCwweGM1LDB4OGYsCi0gIDB4MmQsMHg2MCwweGZiLDB4ZWQsMHgyOSwweGRhLDB4ZDgsMHg5YSwweDZjLDB4YjMsMHg0NiwweDc4LDB4N2UsMHhkMCwweGU0LDB4ZTcsCi0gIDB4ZDcsMHgwZiwweGUwLDB4YjgsMHgyNSwweDk3LDB4NzUsMHg2MywweGY5LDB4NDEsMHhkNiwweDFmLDB4NGQsMHhkOSwweDZjLDB4ZmUsCi0gIDB4NjgsMHhmZSwweDlkLDB4MTYsMHg3YSwweGZmLDB4MWYsMHhmMCwweGU3LDB4ZDEsMHgyMiwweGZiLDB4MTUsMHg5ZCwweGU2LDB4NDksCi0gIDB4ZjgsMHgzOSwweDJjLDB4OTQsMHg2YywweDEwLDB4NzgsMHg3ZSwweDkwLDB4ZjEsMHg2MywweGRjLDB4MWYsMHg1MiwweDU5LDB4MGIsCi0gIDB4NGYsMHg2NSwweDE3LDB4MzksMHgxYiwweDUxLDB4ODAsMHgxZiwweGViLDB4NjQsMHhiZiwweDE3LDB4M2YsMHhiZiwweDM2LDB4NTYsCi0gIDB4ZmQsMHhkZSwweDZhLDB4NjgsMHhhYiwweDE4LDB4ZjAsMHhmMiwweDExLDB4NjgsMHg3ZSwweGQwLDB4ZTIsMHhmZCwweDFhLDB4MzYsCi0gIDB4YzIsMHg5OSwweGI2LDB4YTYsMHg0OSwweGY0LDB4M2MsMHgxMiwweGYzLDB4ODMsMHhiYywweGRlLDB4MDcsMHg1OCwweDViLDB4OTAsCi0gIDB4ZTMsMHg4ZSwweDNmLDB4MDAsMHg5YSwweDFmLDB4ZjQsMHhjZSwweDJmLDB4YzgsMHhhYSwweDFmLDB4NjYsMHg0OSwweGZmLDB4ZDMsCi0gIDB4ZjgsMHhlZSwweDgwLDB4M2YsMHhiMywweGMwLDB4OGYsMHhjNSwweGQ4LDB4ZjUsMHhlMywweGIxLDB4OWUsMHg2YywweGVkLDB4YTQsCi0gIDB4YTMsMHgwNywweDU2LDB4N2MsMHhmYywweDE4LDB4Y2YsMHgwZiwweDUyLDB4M2QsMHhjYywweDQ2LDB4MTIsMHg4NCwweDljLDB4ZmUsCi0gIDB4OWMsMHgwNywweDBjLDB4OWUsMHgxMywweGY5LDB4ZDgsMHgxYiwweGVkLDB4ZjUsMHhjNiwweGYxLDB4MzYsMHhlNSwweGM3LDB4NjgsCi0gIDB4ZGIsMHhmMSwweDI5LDB4MzgsMHhhYSwweGQwLDB4N2MsMHhmMSwweDM0LDB4ZDUsMHgzZiwweDk3LDB4OGIsMHg3ZSwweDUwLDB4MWQsCi0gIDB4OGMsMHgxZiwweGJiLDB4NjksMHg1YSwweGZmLDB4YTEsMHgzNywweGRmLDB4ZjcsMHhjMywweGZjLDB4OGQsMHgwNSwweDdmLDB4MjQsCi0gIDB4YzcsMHg1ZiwweDJiLDB4OWIsMHg1OCwweDFiLDB4NmYsMHg4MCwweGQ3LDB4ZWQsMHhkNSwweDcyLDB4MGIsMHhkNiwweDVmLDB4NTgsCi0gIDB4ZjAsMHg4NywweGQ0LDB4MWMsMHg5MCwweGEzLDB4NTksMHg0YSwweDBhLDB4NGUsMHgzMSwweDViLDB4NmMsMHg1OSwweDFmLDB4MWUsCi0gIDB4MWYsMHhlMCwweGZkLDB4ZDEsMHg2MCwweDliLDB4YmEsMHgzNywweDk2LDB4MzYsMHhiYiwweDA4LDB4NmEsMHg2ZiwweDY3LDB4Y2IsCi0gIDB4YzAsMHgwOCwweGQ1LDB4NDcsMHgwMSwweDBkLDB4NWEsMHg0YiwweGFhLDB4YjMsMHgzNCwweDQ1LDB4ODQsMHg5YSwweGZlLDB4YzIsCi0gIDB4YzMsMHgwMCwweGZlLDB4NzEsMHg0OCwweGQxLDB4YzksMHg0NCwweGI3LDB4YjIsMHhkMCwweGU4LDB4YWUsMHhmNywweGRhLDB4YzYsCi0gIDB4YzUsMHgxZiwweDkxLDB4MTIsMHhlYiwweDQyLDB4N2UsMHg3MCwweDM2LDB4YWQsMHg3ZiwweDFmLDB4YWYsMHhjYiwweGRhLDB4ZjEsCi0gIDB4ZjksMHhjOCwweDcyLDB4YzIsMHhhMiwweGZiLDB4ZTMsMHhiMywweGNiLDB4ODcsMHg3ZiwweDFhLDB4NWIsMHgxMywweDlkLDB4NjUsCi0gIDB4ODYsMHhiZCwweGJmLDB4MzUsMHgwYywweGI5LDB4ZjUsMHgwOCwweGIyLDB4ZmYsMHgwMCwweGNmLDB4MGYsMHg2NiwweDlkLDB4ZmMsCi0gIDB4YTAsMHhhOSwweDNkLDB4YTYsMHhmYywweDNkLDB4ZmMsMHg5ZSwweGNiLDB4ZTQsMHg2NCwweGJkLDB4MWMsMHhjZiwweDBmLDB4ZTYsCi0gIDB4ZTgsMHg3YSwweDMwLDB4MmMsMHgxYiwweDQ2LDB4ZGUsMHhhZiwweGZjLDB4MTgsMHg1YywweGRiLDB4ODQsMHhhNywweDdjLDB4ZjUsCi0gIDB4ZWMsMHgxYywweGZmLDB4NGMsMHg1MiwweDdkLDB4ZDQsMHg4MywweDNiLDB4NTMsMHg1MywweGNhLDB4NzcsMHhjZCwweDlmLDB4ZDAsCi0gIDB4MzIsMHg3OSwweGM3LDB4MWYsMHgzMiwweDRjLDB4MWYsMHgzNSwweDlmLDB4ZTgsMHhhMywweGVhLDB4ODcsMHgxMywweGY1LDB4ZjEsCi0gIDB4ZmIsMHhmMywweDZmLDB4ODIsMHg2YiwweDBiLDB4NzAsMHgxOSwweGVhLDB4NDMsMHhmMCwweDhmLDB4YWIsMHg4ZiwweDIyLDB4NmQsCi0gIDB4NjEsMHg3NywweGMzLDB4NTUsMHhjYiwweGYxLDB4NTcsMHhiNywweGZmLDB4ZjIsMHhhYSwweDM3LDB4ZjAsMHhlOSwweGMzLDB4NWQsCi0gIDB4ZmMsMHg2MywweGQ5LDB4YjAsMHg2NywweDExLDB4ODEsMHgwZCwweDNjLDB4MmMsMHgxYiwweDA2LDB4YWEsMHgxMSwweGZjLDB4MzMsCi0gIDB4YTIsMHg1MSwweDdmLDB4MzYsMHgyMiwweDMzLDB4NjgsMHg4NCwweGU3LDB4MDMsMHhmZCwweDQxLDB4MDIsMHhmOCwweGM3LDB4NzAsCi0gIDB4ZjEsMHg4ZiwweDM2LDB4YTUsMHhmYywweDA5LDB4M2MsMHg2YSwweDdkLDB4YzMsMHg5OSwweGE2LDB4ZGIsMHgwZiwweGVlLDB4OWUsCi0gIDB4MjAsMHhmZSwweGQ5LDB4ZTgsMHhlYSwweGNkLDB4YTgsMHgyZCwweDQwLDB4YmYsMHg2ZiwweGRiLDB4YzEsMHhmMCwweDBmLDB4MTAsCi0gIDB4ZmMsMHhkMywweDZjLDB4YTUsMHg4YywweDM5LDB4MWEsMHg2YiwweDhiLDB4MTYsMHgyYiwweGE0LDB4OGYsMHg2YSwweDg0LDB4MGQsCi0gIDB4NTYsMHg1OSwweDFlLDB4YTYsMHg0MywweGY1LDB4ZTEsMHgwMSwweDdkLDB4NTQsMHhhMiwweDc3LDB4Y2UsMHhmZCwweDk2LDB4NWYsCi0gIDB4MzYsMHgzYywweGU2LDB4YTUsMHgwZSwweDgzLDB4ZjgsMHgyNywweGQxLDB4YWIsMHhkYywweDA2LDB4ZGQsMHg2NiwweGE4LDB4M2UsCi0gIDB4ZGMsMHhmYiwweDc4LDB4ZjksMHhjMSwweDZmLDB4M2UsMHhhZCwweDJjLDB4ODUsMHhjNywweDBiLDB4ZWIsMHhjMywweDhkLDB4YjksCi0gIDB4MGUsMHhmZSwweDI5LDB4M2QsMHg1MSwweGZhLDB4Y2YsMHhjYSwweGQ2LDB4YWMsMHg1NywweDJmLDB4MWYsMHhhYSwweDBmLDB4ZGYsCi0gIDB4N2MsMHg5MywweGQwLDB4MWYsMHg3NiwweDI0LDB4NmMsMHhiZSwweDFjLDB4ZmYsMHhlYywweGEzLDB4NzgsMHhhMCwweGFlLDB4NzUsCi0gIDB4YmQsMHgxZSwweDBmLDB4M2YsMHhlOCwweGU3LDB4NzAsMHhmYywweGIzLDB4OWMsMHg1ZSwweGJmLDB4Y2MsMHhhYywweDE4LDB4OGQsCi0gIDB4MmYsMHg4NSwweDNmLDB4ODAsMHg1NywweDU2LDB4NmYsMHhjYSwweDc4LDB4NDAsMHhkNCwweDQ3LDB4NTEsMHg5MCwweDMzLDB4NTcsCi0gIDB4ZWIsMHg1MCwweDBjLDB4YWIsMHhjYiwweDIwLDB4NjUsMHhmMiwweDA0LDB4ZjYsMHgyYywweDBjLDB4Y2QsMHgwZiwweDQyLDB4YTcsCi0gIDB4ZWIsMHg4ZiwweGQ0LDB4ZDEsMHg2OSwweDM4LDB4ZmUsMHhkOCwweGNhLDB4OWEsMHgyOCwweGZjLDB4MDMsMHg2ZSwweDdmLDB4NTgsCi0gIDB4YmQsMHg5NCwweGI0LDB4OTksMHg1MywweDRjLDB4ODUsMHgwOCwweGI5LDB4MjMsMHhmMCwweDhmLDB4NGEsMHg2ZiwweGYyLDB4ZGUsCi0gIDB4MGEsMHhjNywweGRkLDB4ZjEsMHhjNywweDZlLDB4MjIsMHg1OCwweDllLDB4YWYsMHgyMiwweGU0LDB4MDcsMHgxZCwweDdmLDB4NmMsCi0gIDB4YmMsMHgyYywweDBlLDB4Y2IsMHgwZiwweDAyLDB4NWQsMHg2ZiwweDM0LDB4MmQsMHg2OCwweDkwLDB4ZmEsMHgzOCwweDE2LDB4ZjYsCi0gIDB4NzIsMHgxZSwweGZmLDB4NTksMHg0MSwweDdkLDB4OTQsMHg5NiwweDU3LDB4MmUsMHhjMiwweGJiLDB4NjYsMHgxMiwweGQ3LDB4ODcsCi0gIDB4NzMsMHhmYywweGEzLDB4Y2QsMHg1ZCwweGVmLDB4M2QsMHgyZiwweGJmLDB4MzAsMHg1ZiwweGM4LDB4MGIsMHhiMCwweGE3LDB4MDQsCi0gIDB4YzUsMHgzZiwweGEwLDB4N2YsMHgwNywweDdlLDB4MGEsMHgwZiwweDY2LDB4YjUsMHg1NiwweGU1LDB4MDIsMHhiYywweDZjLDB4N2EsCi0gIDB4ZjgsMHg0NywweGY1LDB4ZTMsMHgxZiwweGVmLDB4OTMsMHhkOCwweDcxLDB4OGYsMHgwZCwweDcyLDB4MWEsMHhmMywweDg5LDB4MDcsCi0gIDB4ZTIsMHgwNywweDYwLDB4YzIsMHg3YSwweGM1LDB4ODUsMHgzZCwweDAzLDB4MzcsMHhlNSwweGNiLDB4MzksMHhmZSwweDUxLDB4MzgsCi0gIDB4ZmUsMHgyOSwweDc1LDB4ZjMsMHg2NSwweDc1LDB4OTYsMHhmZCwweDlhLDB4ZjAsMHhiNiwweGUzLDB4MDcsMHg2OCwweDZmLDB4MjMsCi0gIDB4OWIsMHg5NiwweDQ5LDB4ZmIsMHhlZCwweGMxLDB4NTksMHhkZSwweDdjLDB4ZWYsMHhlNSwweGY5LDB4YzEsMHg0NywweGVjLDB4NDEsCi0gIDB4ODMsMHhkNywweDI4LDB4YzQsMHgwNiwweDQyLDB4NDIsMHhhMiwweGYwLDB4MjQsMHhmMywweGQzLDB4ZGUsMHhhNSwweDM5LDB4ZWYsCi0gIDB4NWYsMHg5NSwweGFkLDB4ZjEsMHhhZCwweGQ2LDB4YWIsMHhiMCwweDMwLDB4ZWYsMHhjOCwweGMyLDB4ZjUsMHhjNSwweGIyLDB4M2UsCi0gIDB4OWMsMHhlNywweDA3LDB4MmQsMHhjZiwweGNmLDB4NTYsMHg3OSwweGM3LDB4NzgsMHhkOSwweDVjLDB4OTgsMHg3MywweDY1LDB4ZTEsCi0gIDB4MGIsMHgyNSwweDdkLDB4YjgsMHhhMCwweDhmLDB4ZjIsMHhmNCwweDA5LDB4NjAsMHgyZiwweGMyLDB4YmQsMHgxNiwweGRiLDB4YzYsCi0gIDB4NjUsMHgzYywweDI5LDB4ZWEsMHhhMywweGRjLDB4NDksMHhkNSwweGM3LDB4NGYsMHhjMywweDQ1LDB4YzMsMHhmNSwweDA3LDB4YjgsCi0gIDB4NjYsMHhiZiwweGM4LDB4OGIsMHhmZCwweDJmLDB4OGUsMHgwOSwweGZhLDB4MjgsMHg3YSwweDFlLDB4NjUsMHgyYiwweDVlLDB4OGMsCi0gIDB4ZmYsMHgzYiwweGYwLDB4MzYsMHgyMiwweDYyLDB4YmQsMHhkMiwweGY2LDB4MDEsMHhmYiwweGZkLDB4ZGQsMHg5ZiwweDFmLDB4NGMsCi0gIDB4NWMsMHg4YSwweDEzLDB4N2YsMHhjOCwweDI1LDB4MzgsMHgxZSwweGM4LDB4MzAsMHhmYywweGUzLDB4ZTUsMHgwNywweGI1LDB4MTcsCi0gIDB4NGIsMHg2NywweDExLDB4ZmYsMHhhMiwweDZjLDB4ODksMHg3MywweDZjLDB4YWQsMHg5MCwweGYyLDB4ODMsMHhhNywweGI4LDB4M2UsCi0gIDB4NmEsMHg4NiwweDczLDB4N2QsMHhlYSwweDQ1LDB4ZTUsMHg3YiwweGQwLDB4ZTMsMHgzYiwweGU2LDB4OTgsMHgzZSwweDJhLDB4YzMsCi0gIDB4ZjEsMHg4ZiwweDliLDB4MWYsMHhkNCwweDA2LDB4OTQsMHhmYiwweDVhLDB4N2EsMHhjMCwweGM4LDB4OTUsMHgzNCwweGNjLDB4MjQsCi0gIDB4ZjksMHg2OCwweDJkLDB4NWIsMHg4YSwweGViLDB4YzMsMHg2ZiwweGQ4LDB4YTgsMHg5MSwweDQ5LDB4MjUsMHg4OCwweDRkLDB4NTAsCi0gIDB4MGYsMHgwYywweDFlLDB4YTksMHgyNCwweGIyLDB4ZjAsMHhjZiwweGVjLDB4YmYsMHhkYywweDM4LDB4YzgsMHhlMywweGMzLDB4YmYsCi0gIDB4YmYsMHg5ZiwweGU3LDB4MDcsMHg1ZiwweGI0LDB4ODgsMHhmZiwweDRmLDB4MzksMHgzYiwweGI2LDB4ZjYsMHgwOCwweGY4LDB4ZTcsCi0gIDB4MWIsMHhkZSwweDdlLDB4MzIsMHgzNCwweGUzLDB4YWEsMHgyZSwweGEwLDB4ZTUsMHg5NSwweDc5LDB4NGMsMHgxZiwweGJlLDB4NWEsCi0gIDB4YzAsMHgzZiwweGYzLDB4N2QsMHg2YSwweDcwLDB4NWMsMHgxZiwweDNlLDB4NTMsMHhjMCwweDNmLDB4ZjIsMHhlOSwweGEzLDB4ZDUsCi0gIDB4NTcsMHg4ZCwweGU4LDB4MTEsMHhmYywweDhmLDB4YmEsMHg1YiwweDk3LDB4YTIsMHg4NywweGYzLDB4M2YsMHg2YywweDNkLDB4YWMsCi0gIDB4OWEsMHgyNywweGE4LDB4ZTksMHg3ZSwweDQ1LDB4ZGEsMHg3ZSwweDYxLDB4NzgsMHg3OCwweDM0LDB4ZTgsMHg4ZiwweGVkLDB4ZmQsCi0gIDB4ZmEsMHhiNywweGY4LDB4ZDcsMHhjMywweDUwLDB4YTUsMHhjZiwweDFmLDB4NWIsMHhmZCwweDUwLDB4NWMsMHg1ZCwweDU4LDB4ZmUsCi0gIDB4NWEsMHhjMCwweDNmLDB4NzIsMHg3ZiwweGQ4LDB4NTgsMHhlZCwweDY5LDB4ZDQsMHhkZiwweDMyLDB4NDQsMHgxZiwweDY1LDB4MGYsCi0gIDB4ZjIsMHg1ZCwweGQ4LDB4NzksMHgzZCwweGM1LDB4MjgsMHhlZSwweDI5LDB4NTEsMHgxZiwweDY1LDB4MGYsMHhjNiwweDRhLDB4NTEsCi0gIDB4N2QsMHhiOCwweGUwLDB4OGYsMHgyZCwweGU4LDB4YTMsMHgzZSwweGI2LDB4ZTQsMHhiNiwweDY4LDB4NmMsMHhmMCwweDM2LDB4ZjcsCi0gIDB4YzcsMHg5ZSwweDI3LDB4YzUsMHhhNywweDY5LDB4MDgsMHhkNywweDg3LDB4MzMsMHg3YywweDk4LDB4OTIsMHhmNSwweDBjLDB4OGQsCi0gIDB4NTksMHgzNSwweDVhLDB4MWYsMHg5ZSwweGQzLDB4MTYsMHg3OCwweDI2LDB4ZDgsMHhjZSwweGI2LDB4NDksMHhmOCwweDFmLDB4MzUsCi0gIDB4ODAsMHg3ZiwweGI4LDB4ZmUsMHhjMSwweDVmLDB4MWYsMHg4NywweGYyLDB4NWQsMHhhMiwweDNlLDB4Y2EsMHg1OSwweDZmLDB4YTUsCi0gIDB4ZDgsMHgzNiwweGNlLDB4ZWIsMHhlMywweDA0LDB4N2YsMHg2YywweDQ5LDB4MGQsMHg1NSwweDZiLDB4ZTEsMHhmYSwweDI4LDB4NWUsCi0gIDB4MWYsMHgxNywweDQzLDB4ZmQsMHg2YSwweDAyLDB4ZjUsMHg3MSwweGRlLDB4ZjUsMHg4MiwweDNlLDB4N2MsMHhjYywweDA1LDB4NDIsCi0gIDB4MDUsMHhmNCwweGUxLDB4ODIsMHgzZSwweGVhLDB4MjIsMHgyYywweDM3LDB4NTMsMHgyOCwweGZlLDB4ZTEsMHhmNSwweDZiLDB4MzEsCi0gIDB4NWYsMHg3ZCwweDFjLDB4YWEsMHhlNywweGUxLDB4ZmUsMHhkOCwweDA2LDB4ZTUsMHg3ZiwweDM2LDB4ZDIsMHhkMywweDVmLDB4YmQsCi0gIDB4YzMsMHgzZSwweGZkLDB4NTEsMHhiZiwweDQ0LDB4ZWUsMHg4ZiwweDJkLDB4ZTAsMHgxZiwweDNhLDB4M2IsMHhhYiwweDVjLDB4OWEsCi0gIDB4ZWYsMHhiZSwweDQwLDB4N2QsMHhkYywweDBkLDB4N2MsMHg3NiwweGRhLDB4MTksMHg1OCwweGUxLDB4MDksMHg4MSwweGE0LDB4ZjksCi0gIDB4NTYsMHhhMywweGZlLDB4ZDgsMHg2NCwweGIwLDB4ZDIsMHhkNCwweGE0LDB4ZWIsMHhkZCwweDdlLDB4YjIsMHhhZiwweGNkLDB4MTUsCi0gIDB4ZjQsMHg1MSwweDljLDB4ZmYsMHgxOSwweGI3LDB4MDcsMHhlNSwweDg4LDB4M2UsMHhiYywweDQ1LDB4ZTgsMHgwZiwweDBiLDB4OWQsCi0gIDB4ZjIsMHhlYywweDUwLDB4M2QsMHhkOCwweDhmLDB4MzksMHhmZSwweDExLDB4ZmIsMHhhZCwweGJjLDB4NDAsMHhlMywweDg5LDB4ZmEsCi0gIDB4NDMsMHg3YSwweGQ3LDB4NjcsMHhlNCwweDdlLDB4MjgsMHg4ZCwweGY4LDB4ZWYsMHhiYiwweDhiLDB4YWYsMHhmZiwweGQ4LDB4Y2UsCi0gIDB4ZjAsMHhiMiwweDQxLDB4NmYsMHg3MCwweGRiLDB4NzksMHg5ZCwweGFmLDB4MWYsMHg4MSwweGZmLDB4YjEsMHgwNywweDBhLDB4YWEsCi0gIDB4OGYsMHgzYSwweDE4LDB4ZTIsMHg4ZiwweDA0LDB4NzUsMHg1ZCwweDk4LDB4M2UsMHhmYywweDViLDB4NDIsMHg3ZCwweDljLDB4YmEsCi0gIDB4NWUsMHg3NiwweGEzLDB4OTUsMHhmNSwweGUxLDB4ZWUsMHgxYiwweDNhLDB4YWYsMHg4ZiwweGIzLDB4NmMsMHhmYywweDIzLDB4M2QsCi0gIDB4YWQsMHhhOCwweGJlLDB4OTEsMHhkNywweDQzLDB4NzUsMHg3NSwweGRkLDB4ZTMsMHhmMSwweDNmLDB4M2YsMHgyMywweDY4LDB4MjcsCi0gIDB4MjMsMHhlYiwweGMzLDB4ZGYsMHhmNywweGZiLDB4NjMsMHg2YiwweGIyLDB4NWUsMHhhOCwweGM5LDB4YWEsMHhjMywweGY3LDB4MTMsCi0gIDB4YjYsMHgzZiwweGE4LDB4YmYsMHg5NiwweDRlLDB4MmIsMHgyMywweDNkLDB4NTUsMHg4ZCwweGY5LDB4MDMsMHg3OCwweGYxLDB4OTEsCi0gIDB4ZjQsMHg1MSwweDdiLDB4YTEsMHhhNiwweDBiLDB4ZjcsMHgwNywweGUwLDB4ZmUsMHhkOCwweGQ2LDB4YjMsMHhkMiwweDdmLDB4YTEsCi0gIDB4OTAsMHgzZiwweGE0LDB4NGYsMHgxZiwweDY1LDB4MmQsMHhjNiwweGY2LDB4MWYsMHhkMSwweDFmLDB4NWIsMHg5YywweDlkLDB4MWEsCi0gIDB4NzIsMHg3ZSwweDA5LDB4ZmUsMHgwMCwweDMxLDB4YWMsMHg1ZSwweDNiLDB4YmMsMHgzZSwweDZlLDB4YTEsMHhmZSwweDZiLDB4NGQsCi0gIDB4ZGMsMHhiZCwweDJkLDB4NTQsMHgxZiwweDllLDB4MGIsMHhlMCwweDFmLDB4ZWYsMHhiNCwweGNhLDB4YTAsMHhlNywweDU3LDB4ZDAsCi0gIDB4MWYsMHhiYiwweGNjLDB4NmQsMHhlMywweGM1LDB4ZmQsMHg3YywweDQyLDB4ZmEsMHhjMywweDhhLDB4ZmEsMHgyOCwweDEyLDB4MWYsCi0gIDB4ZGMsMHgyZiwweDlhLDB4ZmIsMHg2MywweDNmLDB4MmUsMHhlOCwweGEzLDB4M2UsMHgzNCwweGU5LDB4OGIsMHgzNiwweDUyLDB4ZmYsCi0gIDB4NTUsMHhjZCwweGVhLDB4ZTMsMHgyNCwweDdkLDB4NTQsMHg2YSwweGE1LDB4ODUsMHg5ZCwweDVmLDB4NzMsMHg3OCwweGJkLDB4YWEsCi0gIDB4OWIsMHhmZiwweDFhLDB4YTksMHg3MCwweDU3LDB4Y2IsMHhhNiwweGYyLDB4N2QsMHgwOCwweDdmLDB4MTgsMHhjOCwweDdmLDB4OWQsCi0gIDB4NzQsMHg2YywweDkxLDB4M2EsMHhlZCwweDE3LDB4YTUsMHg3ZCwweDJkLDB4ZjYsMHg0MCwweDkzLDB4ZjEsMHhjZiwweGI4LDB4NTAsCi0gIDB4OWYsMHg0YiwweDI3LDB4MzUsMHhlOSwweDRlLDB4YjMsMHg3NiwweDZkLDB4MDksMHhjNiwweGZmLDB4MDQsMHhmYywweDAxLDB4ODYsCi0gIDB4ZGQsMHhlOCwweDU1LDB4OTgsMHhkYSwweDQwLDB4MzIsMHgxOCwweGZmLDB4MjksMHhiNiwweDFlLDB4MGMsMHg2NywweGZkLDB4YjQsCi0gIDB4NTUsMHgwYywweGNjLDB4OTksMHhiMCwweDgxLDB4NjIsMHhlMywweDE4LDB4NDksMHhjNCwweGU4LDB4ODEsMHhmOCwweGY4LDB4ZmMsCi0gIDB4MDEsMHg5YSwweDRjLDB4OGYsMHhmZCwweGNiLDB4MTcsMHhlNSwweDBmLDB4ZDAsMHhkOCwweDI2LDB4YTUsMHhkNSwweDM0LDB4ZmYsCi0gIDB4ZjcsMHg0YiwweGZlLDB4MDAsMHgwZSwweGZmLDB4ODMsMHgyZCwweDFiLDB4YWMsMHgzZSwweGNlLDB4YzksMHg3ZiwweDU5LDB4ZGUsCi0gIDB4MzEsMHg2ZCwweGEyLDB4N2MsMHg0NSwweGMwLDB4MWYsMHhjOSwweGViLDB4OGUsMHhmMSwweDYwLDB4MWIsMHg1YSwweDJmLDB4YzYsCi0gIDB4ZmQsMHgwMSwweDFlLDB4MjAsMHhmNSwweDcxLDB4NWEsMHhhMywweDU1LDB4ZWUsMHhhMiwweDlkLDB4ZjEsMHhjYSwweDNmLDB4OGIsCi0gIDB4ZjYsMHg0NywweGUyLDB4ZjksMHhhZiwweDA5LDB4ODcsMHgwOCwweDcyLDB4MDcsMHgzMiwweGZlLDB4ZjEsMHhmYiwweDAzLDB4YjQsCi0gIDB4N2IsMHhjYiwweGIyLDB4MGQsMHg1ZCwweDlmLDB4YTcsMHg0MywweGZjLDB4MjEsMHhkNSwweDNhLDB4YjMsMHgyOCwweDdmLDB4ZWMsCi0gIDB4OWEsMHg4YywweDE2LDB4ODksMHg3ZiwweGZjLDB4ZmUsMHgwMCwweGFjLDB4Y2MsMHgyNywweDhkLDB4ZmIsMHg0ZCwweGM5LDB4ZmUsCi0gIDB4MDAsMHhlNywweGM5LDB4YjYsMHhlMCwweGEyLDB4OWQsMHg0YywweDIxLDB4ZmMsMHhlMywweGU2LDB4YmYsMHhlYSwweDBhLDB4ZTAsCi0gIDB4MWYsMHhiNiwweGZlLDB4NDksMHhmZSwweGFiLDB4NzcsMHg1MCwweGVhLDB4NzYsMHg1YSwweGQ4LDB4MWYsMHgyMCwweDY5LDB4YTIsCi0gIDB4MzIsMHhlZiwweDUwLDB4N2YsMHg4MCwweDQyLDB4ZDcsMHhmYiwweGViLDB4ZTMsMHg4YywweDU2LDB4YWYsMHgzYiwweDg2LDB4ZWIsCi0gIDB4MTcsMHg1NCwweGMwLDB4MWYsMHg4MCwweGM4LDB4YzIsMHg1NywweDQ3LDB4Y2MsMHhmNywweGFjLDB4ZWMsMHgwZiwweGEwLDB4YjIsCi0gIDB4NmUsMHgyMCwweGNkLDB4ZTgsMHg3YywweDU3LDB4Y2IsMHhmZSwweDAwLDB4NTcsMHhhMCwweGY5LDB4NjAsMHg0MiwweGVlLDB4YWYsCi0gIDB4YWEsMHhmYiwweGZjLDB4MDQsMHgwMiwweGZlLDB4NDgsMHhiZSwweGIyLDB4MzgsMHhhYiwweDgwLDB4M2YsMHg0MCwweDhiLDB4ZTYsCi0gIDB4ZDIsMHgzZSwweDc3LDB4M2IsMHhkMywweDM0LDB4MGEsMHhmOSwweDIzLDB4NzksMHhmMSwweDVjLDB4NTMsMHhjOCwweDFmLDB4YzksCi0gIDB4ZWQsMHg4ZiwweDk2LDB4ZjYsMHhlZSwweDdmLDB4MTYsMHg1YSwweDFmLDB4YzcsMHhmNSwweGM5LDB4MGUsMHhmZiwweGQzLDB4ZTIsCi0gIDB4ZmQsMHhiNywweDBkLDB4OGIsMHg0ZiwweDM1LDB4ZTcsMHgxZiwweDUyLDB4MmUsMHhkZiwweGU4LDB4NDUsMHgzYiwweGM2LDB4ODQsCi0gIDB4ZmEsMHgyMSwweGY5LDB4MmYsMHhjMiwweGZmLDB4NzQsMHhkNiwweDcxLDB4YjQsMHg1MywweGUyLDB4MGMsMHg5NiwweGY5LDB4ZmMsCi0gIDB4MDEsMHhiYywweDBmLDB4ZDUsMHg4NywweGY3LDB4OTIsMHg4NywweGMyLDB4OTQsMHgxZSwweDEzLDB4OTksMHg3ZiwweGU2LDB4ZjgsCi0gIDB4YzcsMHhmMCwweGZiLDB4MDMsMHhkYywweDQwLDB4MDcsMHgxZCwweDMzLDB4YzIsMHhmMiwweDVmLDB4Y2MsMHgxZiwweDQwLDB4YTEsCi0gIDB4YjAsMHg2NywweDljLDB4YzIsMHg5ZSwweDZiLDB4ZDYsMHhlYywweGMyLDB4ZjUsMHg3MSwweDc0LDB4ZjcsMHg3OCwweGQzLDB4ZTEsCi0gIDB4NDMsMHgyYywweGYyLDB4OTcsMHhkNSwweGUxLDB4ZjksMHgyZiwweGQyLDB4MGQsMHhlNCwweGFhLDB4NjksMHgwZiwweDRlLDB4MjcsCi0gIDB4NWUsMHg4OSwweGZiLDB4M2EsMHhjNiwweGRhLDB4ODMsMHg1MSwweGJmLDB4M2YsMHhkMiwweDcwLDB4NmEsMHg1MywweGZjLDB4NjcsCi0gIDB4MTYsMHg2OSwweDE0LDB4YTIsMHhiOSwweGI0LDB4NGYsMHgzZSwweGQyLDB4MWYsMHg4OSwweDk3LDB4YzUsMHg3OSwweDgzLDB4OWMsCi0gIDB4NzgsMHgzZCwweGU3LDB4N2YsMHhlZSwweDliLDB4NGIsMHg2NCwweGNmLDB4MTQsMHg0NiwweDRhLDB4NzgsMHg1MiwweGRlLDB4N2YsCi0gIDB4MDIsMHhmZCwweGQxLDB4YmUsMHhlZCwweDZlLDB4OWIsMHhjZCwweGQ5LDB4YjQsMHhjMywweGZmLDB4ZjgsMHhmMiwweDVmLDB4MDEsCi0gIDB4N2YsMHhhNCwweDNhLDB4MjEsMHhmYiwweDIzLDB4ZWYsMHhiNywweDQzLDB4NTQsMHgzMSwweDJlLDB4ZjksMHgwMywweDE4LDB4MmIsCi0gIDB4MzcsMHgzOSwweGIwLDB4MjcsMHhhYywweGRlLDB4MzksMHgyZiwweGZhLDB4MjMsMHhhOSwweDM0LDB4YmYsMHgzMywweDUwLDB4NDUsCi0gIDB4Y2YsMHg1ZiwweGZjLDB4ZmMsMHgxYSwweGYzLDB4ZjMsMHgzZiwweDEwLDB4NzksMHhkZSwweDIxLDB4ZjUsMHg3MSwweDRlLDB4NTgsCi0gIDB4NTQsMHgxZSwweDE2LDB4YTksMHg5MCwweDU5LDB4YTgsMHg4ZiwweGQzLDB4NmMsMHhmYywweGEzLDB4MzQsMHhkMiwweGIyLDB4MmMsCi0gIDB4ZWIsMHgzMiwweGFjLDB4MWMsMHhhZCwweDdjLDB4MTksMHhjMywweDdiLDB4ZWMsMHhmZCwweDVkLDB4ZjAsMHgwNywweDk4LDB4MjAsCi0gIDB4ZmUsMHhjNiwweDQ3LDB4MmEsMHgyZiwweDU0LDB4NGYsMHg3YiwweDA3LDB4NTksMHhiNCwweDNmLDB4MDAsMHhmMywweDk3LDB4MzgsCi0gIDB4NWIsMHgxOCwweGZmLDB4NzAsMHhiNCwweGIzLDB4YWUsMHg2OCwweDdmLDB4YzgsMHg4OCwweDQxLDB4YjQsMHgzZiwweDUyLDB4YTQsCi0gIDB4M2YsMHgwMCwweGVhLDB4OGYsMHhlNCwweDFmLDB4ZTQsMHhjMiwweGZjLDB4OTEsMHg0MiwweDA2LDB4ODUsMHhmYywweDkxLDB4MjIsCi0gIDB4ZjEsMHg0ZiwweDExLDB4ZjcsMHg1ZiwweGM4LDB4MWYsMHhkYiwweDNmLDB4OTgsMHgwYywweGY3LDB4YzcsMHhhNiwweGZkLDB4NTIsCi0gIDB4MjMsMHhmZCwweDIxLDB4MzUsMHgxMSwweGVkLDB4NTAsMHg3ZiwweDZjLDB4MmIsMHhjOCwweGZmLDB4NzgsMHhlMSwweDk0LDB4ZmQsCi0gIDB4OTEsMHgxNCwweDVhLDB4MGQsMHg1NywweGFjLDB4M2YsMHhhNCwweDk3LDB4YTgsMHg0NSwweGRlLDB4NWYsMHgyMiwweGZkLDB4OTEsCi0gIDB4YTIsMHhmMCwweGNmLDB4MTAsMHhlMiwweDhmLDB4NTQsMHhhNCwweDNmLDB4NjQsMHhjNCwweDQwLDB4YzAsMHgzZiwweGZmLDB4OGEsCi0gIDB4ZjUsMHg4NywweGZkLDB4MzIsMHhmYywweDkxLDB4ZTIsMHhkNCwweDQ4LDB4NzAsMHhkNSwweDc1LDB4ZjksMHgyMywweGQ5LDB4ODMsCi0gIDB4NzUsMHg1ZiwweGFlLDB4M2YsMHgxMiwweDNlLDB4ZTAsMHhmOCwweDY3LDB4OWYsMHhlOCwweDhmLDB4ZTQsMHhiNCwweDA1LDB4YTksCi0gIDB4MmUsMHg4OCwweDdmLDB4MGEsMHhmMSwweDFiLDB4ODIsMHgzZiwweGQyLDB4MGUsMHg5OSwweGZmLDB4YzEsMHhmMSwweDEyLDB4ZGEsCi0gIDB4MWYsMHhkNiwweDQ1LDB4M2IsMHhlYiwweGEyLDB4ZmQsMHgyMSwweDYxLDB4NDYsMHhjNCwweDM0LDB4OGIsMHhmNSwweGM3LDB4MmUsCi0gIDB4YTIsMHgzZiwweDg4LDB4ZDAsMHgwZCwweDI0LDB4MWEsMHhmZiwweGM0LDB4MTYsMHgxNSwweDExLDB4MWYsMHgwOSwweGZmLDB4YTgsCi0gIDB4NTMsMHgyYSwweDhiLDB4NzYsMHhlZCwweDc1LDB4ZTgsMHg3ZiwweDI4LDB4ZGEsMHg2OSwweDVmLDB4ODcsMHhmYiwweDIzLDB4NzksCi0gIDB4OWYsMHhkNCwweGQ2LDB4NjIsMHhmNiwweDFmLDB4OGUsMHg3ZiwweGZhLDB4NDQsMHhmYywweDczLDB4MTcsMHhjOCwweDZkLDB4ZTIsCi0gIDB4MTEsMHhmYywweGIzLDB4NGIsMHg2MywweGZhLDB4MWYsMHg4YSwweDc2LDB4NGUsMHg1NSwweDE2LDB4ZWQsMHgwZiwweDgwLDB4ZWYsCi0gIDB4YjcsMHhjYiwweDY0LDB4ZmMsMHgyMywweDlkLDB4NWYsMHg5NywweDdiLDB4MWIsMHhmMywweGU5LDB4YTksMHhkOCwweDgxLDB4YzAsCi0gIDB4ZjksMHgyNSwweGUxLDB4MWYsMHg5MywweGRmLDB4NmQsMHgyNiwweDNkLDB4YTEsMHg0ZCwweDU1LDB4MDUsMHgxYywweDlmLDB4ODQsCi0gIDB4ZmUsMHhiMCwweGJhLDB4YWYsMHgzZSwweDJlLDB4YTcsMHg0ZCwweGNlLDB4MGMsMHhlZSwweDYwLDB4NTgsMHg3ZiwweDU4LDB4OTYsCi0gIDB4ZWYsMHhhMCwweGI2LDB4ZDgsMHg3MiwweGJkLDB4MjEsMHhjNywweDNmLDB4OWIsMHg2NSwweGJlLDB4ZWIsMHg2NiwweDFiLDB4ZmYsCi0gIDB4MmMsMHhkOSwweDFkLDB4ZDgsMHg0OCwweDhmLDB4ODUsMHhmYiwweDYzLDB4NmYsMHgwOCwweDA0LDB4NmEsMHhiYiwweGM4LDB4ZmYsCi0gIDB4NjQsMHhmZCwweGZlLDB4NDgsMHgwNSwweGYwLDB4Y2YsMHg1NiwweGQ0LDB4MWYsMHgzYiwweDBhLDB4ZmYsMHgxNCwweDcxLDB4ZGUsCi0gIDB4NTUsMHhmOSwweGY1LDB4M2YsMHg0ZSwweDdjLDB4YjQsMHhiZCwweDVhLDB4ZmEsMHg4ZCwweGIyLDB4YTUsMHgxZCwweDA4LDB4MWUsCi0gIDB4NjAsMHhlYiwweGQzLDB4MTIsMHhlYiwweGUzLDB4MmUsMHgxYiwweDRkLDB4MjcsMHhiNywweGJmLDB4ZTQsMHgxOCwweDI1LDB4MTUsCi0gIDB4YzYsMHgzZiwweDc0LDB4MzAsMHg2MSwweGUzLDB4OTksMHhlOSwweGNjLDB4MzUsMHhiNywweGQxLDB4MjcsMHg4NiwweDdmLDB4YTYsCi0gIDB4MzMsMHhjNywweDhkLDB4NjYsMHg2ZSwweDhiLDB4OTQsMHgxOCwweGE3LDB4NDIsMHhlOCwweGJkLDB4NjMsMHgyMSwweGZhLDB4OWYsCi0gIDB4MWQsMHhmZiwweDAzLDB4NjUsMHhhMywweGI1LDB4ZGMsMHgxNiwweGJiLDB4NzQsMHg5NywweDNkLDB4NzgsMHg0NSwweDRiLDB4NjYsCi0gIDB4MDUsMHhmYywweGQzLDB4YzIsMHhmMywweDVmLDB4NDcsMHhhMCwweDkzLDB4Y2EsMHg3ZSwweDVjLDB4M2MsMHg2YywweGJmLDB4OTgsCi0gIDB4OTMsMHg0NiwweGE4LDB4ZmIsMHgwZCwweGQ5LDB4YjgsMHg0NiwweGQwLDB4ZmYsMHhhOCwweDY5LDB4ZTIsMHhhNiwweDk4LDB4ZDcsCi0gIDB4MDYsMHgzZCwweDFhLDB4MmQsMHg0MywweDA3LDB4ZmQsMHgyMSwweGY5LDB4YWYsMHhiZiwweDlhLDB4ZjcsMHg3NywweGQ2LDB4NTEsCi0gIDB4NzMsMHhjMSwweDc5LDB4MjcsMHhlZCwweGEyLDB4MzQsMHg2NSwweDEzLDB4YTQsMHg5MSwweGViLDB4ZTUsMHg0YywweDU4LDB4N2YsCi0gIDB4OTAsMHg0YywweDZjLDB4MTcsMHg4NSwweGMxLDB4MWIsMHhhNiwweDY4LDB4MzQsMHhlYSwweGIyLDB4OTUsMHg3OSwweDdiLDB4NzAsCi0gIDB4NjUsMHg5NywweDRmLDB4MWYsMHhjNSwweGJlLDB4N2YsMHg1NCwweDZmLDB4ODcsMHhjMywweGQwLDB4NzAsMHgzYSwweGUxLDB4YzYsCi0gIDB4M2YsMHg1YiwweDk5LDB4YjEsMHg1ZiwweDQzLDB4OGUsMHhhOCwweDRkLDB4NTksMHhkMSwweDg4LDB4NDksMHhkMCwweDNmLDB4ZGIsCi0gIDB4ZmIsMHg0ZiwweDRmLDB4YWMsMHg2MSwweGQ0LDB4YzEsMHhjMywweGE2LDB4N2QsMHhiNywweGJiLDB4ZWQsMHhjMSwweDViLDB4MzksCi0gIDB4MzksMHg5MSwweDI3LDB4ZjAsMHgzZiwweGIwLDB4MWUsMHgzYSwweGVjLDB4MjAsMHhkYywweGVkLDB4NDQsMHhlMywweGQ2LDB4NmMsCi0gIDB4NTksMHhjYSwweDFlLDB4NzQsMHhmOCwweDVlLDB4MWMsMHhjZSwweGYzLDB4ZmUsMHhiMCwweGZhLDB4NzcsMHhhMSwweGEzLDB4ZTMsCi0gIDB4ODUsMHhiMSwweGM3LDB4ZDgsMHhlOSwweGJmLDB4NTEsMHhiOSwweDBhLDB4M2YsMHhmNSwweDExLDB4MjMsMHg2MiwweGZlLDB4NmIsCi0gIDB4MGQsMHg5NSwweDNkLDB4OTcsMHgzMiwweGI0LDB4NjMsMHg2YywweDk5LDB4ODAsMHg4MywweDI0LDB4YTMsMHgyYSwweGYxLDB4M2YsCi0gIDB4NzIsMHhmZSwweGViLDB4Y2UsMHg0MywweDJlLDB4M2YsMHhkNiwweDQ0LDB4ZTIsMHgzMywweDExLDB4YzAsMHhjZiwweDNjLDB4ZmYsCi0gIDB4NDUsMHhmNCwweDNmLDB4OTcsMHhhNCwweDZlLDB4YjAsMHgyNCwweGZlLDB4OTcsMHhjMCwweGQ3LDB4MWYsMHg5NiwweGY5LDB4M2YsCi0gIDB4OGMsMHhjYywweDdmLDB4ZDYsMHhiMSwweDA1LDB4NjgsMHg3NSwweDc3LDB4OGYsMHg4YSwweDM2LDB4M2EsMHhhOCwweDk2LDB4ODgsCi0gIDB4ZjQsMHhmMywweDhjLDB4N2YsMHgzNiwweGNjLDB4OWYsMHhlOCwweDdiLDB4YWMsMHhkYiwweGYyLDB4OGIsMHhkOSwweGVjLDB4MWUsCi0gIDB4YTAsMHhjNiwweDA4LDB4YjIsMHg1MSwweGI2LDB4YTgsMHhmZiwweDc5LDB4ZGMsMHgwZSwweGRhLDB4Y2UsMHhiYywweGU2LDB4OTUsCi0gIDB4ZTUsMHg5NiwweDkyLDB4ZjUsMHhmNiwweDJiLDB4YWIsMHg1ZiwweDhhLDB4YTcsMHhkOCwweDFmLDB4NzYsMHgwYSwweGFlLDB4YzIsCi0gIDB4NWQsMHg5OSwweDlhLDB4NTQsMHgzYywweGU3LDB4YTAsMHg5ZCwweDNjLDB4NmQsMHgxNCwweDliLDB4YjQsMHg0MiwweGZhLDB4YzMsCi0gIDB4ZDIsMHhmYywweGQ3LDB4OGEsMHg0NSwweDRmLDB4YjQsMHhjYiwweGM3LDB4OTAsMHhiZiwweDNmLDB4MDgsMHg4YiwweDhmLDB4YmUsCi0gIDB4MzMsMHg3OSwweGQ4LDB4NDksMHg3YiwweDJkLDB4MjIsMHgwYiwweGM5LDB4NGMsMHgzYywweDFiLDB4NzcsMHgxNCwweDJmLDB4NDIsCi0gIDB4YTIsMHg2NCwweDk2LDB4OTgsMHhmZiwweDVhLDB4MDMsMHhkZCwweGFiLDB4ZDIsMHg4NCwweDdmLDB4NTgsMHgwNCwweDZmLDB4YzAsCi0gIDB4NTIsMHg4ZiwweDg4LDB4MTgsMHg5NCwweDE4LDB4MWUsMHg4ZSwweDdmLDB4NDgsMHhmZSwweGFiLDB4YTcsMHhiNCwweGQ2LDB4YjksCi0gIDB4OWUsMHhmNCwweGYzLDB4NzIsMHhmMiwweDY1LDB4NjYsMHhiZiwweDg5LDB4ZjcsMHg4NywweDI1LDB4ZmEsMHg5ZiwweDc2LDB4ZjgsCi0gIDB4OWUsMHgzOSwweDVmLDB4MmYsMHg1NSwweGUxLDB4NDksMHhiOCwweGQ1LDB4NzQsMHg4OCwweDIwLDB4MzMsMHgxMywweGQyLDB4MWYsCi0gIDB4NzYsMHg3MywweDc5LDB4OWIsMHg5YSwweDUzLDB4OWEsMHgyMCwweDZkLDB4MjksMHg4NiwweGU4LDB4Y2YsMHhmYywweDkwLDB4NjgsCi0gIDB4MTQsMHhhMCwweDA4LDB4ZjksMHhhZiwweGQ5LDB4OWYsMHhjMCwweDk1LDB4NTUsMHgyYiwweGJkLDB4ZWUsMHgxZSwweDJlLDB4OWUsCi0gIDB4ZjksMHhjYywweDhmLDB4NjcsMHg3OCwweGZlLDB4NmIsMHhkZSwweDk4LDB4NzEsMHgxMSwweGVhLDB4Y2QsMHg4NCwweDRlLDB4ZTMsCi0gIDB4YjMsMHhkNCwweDA5LDB4Y2IsMHgyNywweDNlLDB4YTMsMHgyNCwweGM5LDB4MWYsMHg1MiwweDVmLDB4NmUsMHgyNiwweGExLDB4Y2IsCi0gIDB4NTIsMHhkYSwweDYwLDB4MTcsMHgzMSwweDBhLDB4YzgsMHg1MiwweGZlLDB4YzcsMHgzMCwweDQ0LDB4NDYsMHhlOCwweDE4LDB4ZGIsCi0gIDB4N2YsMHg0OCwweGZlLDB4ZWIsMHg5NywweGQ5LDB4NmEsMHhmMywweGNmLDB4NWIsMHg5NSwweDZmLDB4YzMsMHg1NiwweGE4LDB4MzEsCi0gIDB4NGIsMHg1YSwweGM5LDB4MzQsMHg1MywweDg2LDB4M2QsMHg3MSwweDAzLDB4ZDMsMHhmZiwweGNjLDB4ZGQsMHgwOSwweGZmLDB4YTEsCi0gIDB4M2UsMHhkNywweDUyLDB4MzIsMHhhYSwweGZjLDB4MTMsMHhmYywweDAyLDB4ZWEsMHhjYywweGQyLDB4NTEsMHgxMiwweDQ2LDB4YzMsCi0gIDB4MjAsMHhmMSwweGJjLDB4OGYsMHhlMywweDQ5LDB4ZWYsMHhmYSwweDBjLDB4YzEsMHg2ZiwweGFiLDB4ZWEsMHg1YiwweDZiLDB4ZjQsCi0gIDB4MzIsMHhkNSwweGJlLDB4ZmYsMHg2NSwweGE2LDB4ZTMsMHg4ZiwweDY0LDB4Y2EsMHg4YywweDFmLDB4ZTcsMHhkYiwweDczLDB4YjMsCi0gIDB4OWYsMHgzNywweGNmLDB4M2QsMHhkZCwweGI0LDB4YjYsMHhlMiwweGM5LDB4MDgsMHg3ZCwweDk0LDB4ZDAsMHgxZiwweDU2LDB4ZDMsCi0gIDB4MzMsMHhiMSwweDI5LDB4ZTUsMHgyMSwweDNkLDB4NjEsMHg5NSwweDE5LDB4MzAsMHhhNSwweDM3LDB4ZDksMHgwNywweGU5LDB4NmEsCi0gIDB4NDMsMHg5ZiwweDMyLDB4MDYsMHhlZCwweDVmLDB4MjQsMHhjZSwweDUyLDB4NjMsMHg2MiwweDdmLDB4ZDgsMHg1ZCwweGQ0LDB4NTYsCi0gIDB4NDUsMHhjYiwweGI0LDB4MTAsMHgyMCwweGI0LDB4YTgsMHhhMywweDNjLDB4MTMsMHg3ZiwweDAwLDB4MGUsMHhhYywweDRmLDB4ODYsCi0gIDB4ZjUsMHg4NywweGZkLDB4NWYsMHhmNiwweGFlLDB4M2UsMHgzNiwweGFlLDB4ZWEsMHhjYSwweDlmLDB4M2IsMHg3MywweDlmLDB4ZjMsCi0gIDB4ZWMsMHg4YywweDlkLDB4MzcsMHhmNiwweDRjLDB4MTgsMHhjMCwweDg5LDB4OWUsMHhlZCwweDEwLDB4NGMsMHgzMCwweDY2LDB4OTIsCi0gIDB4OTAsMHg5MCwweDI2LDB4MTAsMHgzZiwweDhmLDB4M2YsMHg3MCwweDQyLDB4ODAsMHg2OSwweDNlLDB4YmQsMHg5NSwweDU3LDB4N2EsCi0gIDB4NjQsMHhiZCwweGJiLDB4NDEsMHg2MiwweDkxLDB4OTMsMHg0YSwweDRiLDB4NzYsMHhhOSwweGRhLDB4M2IsMHg2NiwweDQ4LDB4NGQsCi0gIDB4NDgsMHhjNSwweDI4LDB4NDQsMHgxMCwweGI0LDB4ZDEsMHhkNiwweGQwLDB4YjQsMHg2NSwweDUxLDB4ZGEsMHgwZCwweDlmLDB4ODEsCi0gIDB4YTYsMHg0YiwweGM2LDB4NTEsMHgxYywweDRjLDB4MWIsMHhiYSwweDExLDB4OWIsMHg1NiwweGQxLDB4MmEsMHgwMiwweDQ3LDB4ZjIsCi0gIDB4NGEsMHhkOSwweDEyLDB4MDgsMHg2YywweDYxLDB4OWIsMHg5MCwweDI2LDB4ZDksMHg3YiwweGRmLDB4ZTcsMHhiZCwweGVmLDB4NjMsCi0gIDB4M2MsMHg2NiwweGNiLDB4MmUsMHg5NSwweDk4LDB4YmYsMHg3ZSwweGJhLDB4NzMsMHhmZCwweDdjLDB4ZGYsMHg5ZCwweGZiLDB4Y2UsCi0gIDB4ZmQsMHhiZCwweGRmLDB4MzksMHhmNywweDFjLDB4YmMsMHgwYSwweGIzLDB4MzAsMHg5NSwweDc5LDB4NzYsMHhmNSwweDBhLDB4NmEsCi0gIDB4OWYsMHg2MywweGQ0LDB4NzAsMHhhOSwweDZlLDB4NjIsMHhmOSwweDZiLDB4MDUsMHhmZiwweDU3LDB4YjYsMHgxNywweDBlLDB4NjgsCi0gIDB4NGQsMHg2MCwweGQ0LDB4NGIsMHg3ZCwweDk1LDB4M2UsMHhhZCwweDk1LDB4OWIsMHgyMiwweDdkLDB4ZjAsMHgyZiwweGQwLDB4NzAsCi0gIDB4NWMsMHgxZSwweDAwLDB4ZjMsMHhmOSwweGJkLDB4ZDMsMHhlMywweGZmLDB4ODIsMHgxNywweGM5LDB4MzMsMHhlMywweGFkLDB4NWIsCi0gIDB4YTMsMHg0YywweDA4LDB4OWEsMHgzNSwweDFlLDB4ZWIsMHgzMSwweGMwLDB4ZmMsMHhmMSwweDE2LDB4Y2IsMHgyMywweDY2LDB4ZmEsCi0gIDB4YmYsMHhlYywweGYxLDB4NTcsMHhiMSwweGYzLDB4MDgsMHhhOCwweDE1LDB4YWEsMHg1OSwweGY0LDB4ZTAsMHg2NywweDhjLDB4ZWQsCi0gIDB4NDAsMHhkNCwweGE4LDB4N2YsMHg3MSwweDVjLDB4ZjAsMHg3ZiwweGI5LDB4ZjUsMHg2MSwweGYzLDB4NmYsMHhiMCwweDMwLDB4Y2UsCi0gIDB4ODksMHg3YSwweGE2LDB4ZmYsMHg1YywweDIyLDB4NmQsMHhmYSwweGUzLDB4NjcsMHgwYywweDIxLDB4NjgsMHhlMSwweDQwLDB4OGMsCi0gIDB4Y2YsMHgwZiwweGM5LDB4ZjksMHhiZiwweDc2LDB4YjMsMHg2NSwweDEwLDB4MWIsMHg2MiwweGQxLDB4M2IsMHgyZiwweDQzLDB4NzUsCi0gIDB4MGYsMHgwYiwweGVjLDB4NjEsMHhmNSwweDNlLDB4M2EsMHhlNSwweDg3LDB4MDIsMHhmZCwweDVmLDB4OTQsMHhmZiwweGVjLDB4YTUsCi0gIDB4ZGIsMHhjNCwweDBkLDB4MDMsMHgzYiwweDU5LDB4YjcsMHg5YiwweGI0LDB4N2YsMHhlOCwweDg5LDB4OWMsMHg1MiwweDBlLDB4NDAsCi0gIDB4ODMsMHgyZSwweDczLDB4ODksMHg2ZCwweDc5LDB4ZmYsMHhkNywweDc2LDB4Y2EsMHg1MSwweDVhLDB4ZDQsMHg0YSwweDY2LDB4N2YsCi0gIDB4ZjYsMHhiMywweGQ1LDB4MDUsMHgxNCwweGJjLDB4YTAsMHgzNCwweDBhLDB4ODksMHhjNywweDVkLDB4N2IsMHhiNSwweDJmLDB4ZjksCi0gIDB4MjEsMHg3OSwweDlmLDB4MmMsMHgzZiwweDVmLDB4M2QsMHg0NCwweDlmLDB4YTYsMHhkZiwweDMxLDB4NmIsMHg2MywweGRjLDB4NjYsCi0gIDB4OTYsMHgyNSwweDRhLDB4MGEsMHhmNiwweDdmLDB4MGQsMHhjMSwweDQ1LDB4YjIsMHg1YywweDM2LDB4Y2EsMHg1MiwweDUzLDB4ZWIsCi0gIDB4NTQsMHg5OCwweGYxLDB4YjIsMHgzOSwweDNmLDB4ZGEsMHgwYywweDJiLDB4NWYsMHhjZCwweDg4LDB4YzcsMHhmZiwweGI1LDB4MGYsCi0gIDB4ZGUsMHg2NSwweGIyLDB4NTIsMHgxMSwweGZkLDB4MTcsMHhiOSwweDAyLDB4MGIsMHgwOSwweDdkLDB4MzAsMHhhOSwweDE5LDB4N2YsCi0gIDB4YjYsMHhhZCwweDMzLDB4YjgsMHgzZSwweGVjLDB4MzMsMHg3OCwweDEzLDB4NmMsMHg4NywweDE2LDB4OTAsMHhmMywweGI1LDB4YTcsCi0gIDB4ZDUsMHg5ZiwweGMxLDB4ZTIsMHhkZCwweGQzLDB4OWYsMHhhNCwweGRiLDB4ZDYsMHg2YiwweGUzLDB4YWQsMHg1YSwweGY1LDB4N2UsCi0gIDB4MDgsMHhmMSwweDdmLDB4M2QsMHg4ZCwweGU4LDB4ZWUsMHhiNiwweDhkLDB4M2UsMHg3ZCwweGFmLDB4NDMsMHgyMywweDU4LDB4ODksCi0gIDB4MDIsMHg1YSwweGVkLDB4YzAsMHgyMSwweDhiLDB4ZmYsMHhkOCwweGViLDB4NDEsMHg0ZSwweGM4LDB4ZDQsMHhmZSwweGI0LDB4YzIsCi0gIDB4MTIsMHhiYSwweGQ1LDB4YjEsMHhmYSwweGI5LDB4ZTAsMHgxNCwweGE2LDB4YjksMHgyZiwweGQ4LDB4ZmYsMHg1NSwweDdkLDB4YmYsCi0gIDB4N2MsMHgxMiwweGQxLDB4ZGQsMHg5NiwweGRkLDB4ZWYsMHhlYiwweDRjLDB4ZjYsMHgyYywweDE4LDB4ZjcsMHg3YiwweDdiLDB4YjEsCi0gIDB4NjYsMHhmZiwweGMzLDB4YWUsMHg3ZiwweGM3LDB4YjEsMHgzZiwweGNmLDB4YzYsMHhjZiwweGMzLDB4MWYsMHhlMCwweDc2LDB4OTgsCi0gIDB4NTEsMHhhNCwweGE0LDB4ZTUsMHgwZiwweGQwLDB4MDYsMHhjNiwweGZkLDB4M2UsMHg0OCwweDZmLDB4OTMsMHhiZiwweGRmLDB4MzMsCi0gIDB4NzMsMHhmYywweGZhLDB4Y2YsMHgzNCwweDQ2LDB4N2IsMHg4YywweDQyLDB4YzMsMHgxZiwweGMyLDB4ZmIsMHhlNSwweGU5LDB4M2YsCi0gIDB4YWYsMHhkYiwweDg1LDB4ZDIsMHgxZSwweGRiLDB4NTYsMHg5NiwweGZlLDB4ZjMsMHg4MiwweDE5LDB4OTgsMHg3MSwweGQ2LDB4OTcsCi0gIDB4MWYsMHhhOSwweGE0LDB4ZmUsMHg1MywweDcxLDB4NTYsMHgyOSwweDI3LDB4M2YsMHgzNiwweGZkLDB4ZjYsMHgwMiwweDMxLDB4OGYsCi0gIDB4MWQsMHgyOSwweDY2LDB4YzQsMHgwZSwweDBhLDB4ZTAsMHgzZiwweDgyLDB4ZmUsMHg3MywweGE5LDB4MzAsMHgxNSwweGZkLDB4NjcsCi0gIDB4MWYsMHhhYiwweGU3LDB4ZjgsMHg4NSwweGVhLDB4M2YsMHgyZiwweDgwLDB4NzUsMHg3MCwweDY5LDB4NTIsMHhmZiwweDk3LDB4YTksCi0gIDB4N2UsMHhiYywweDQyLDB4Y2MsMHhmYSwweDY4LDB4ZTQsMHhjMCwweDcwLDB4MDksMHhmZCwweGM3LDB4ZjUsMHg3NiwweDdkLDB4MGMsCi0gIDB4YjcsMHg4ZCwweDk4LDB4ZmEsMHhjZiwweDcwLDB4MTksMHhmZSwweDJmLDB4M2EsMHgzZiwweDhhLDB4NDksMHg3YiwweGI0LDB4OGIsCi0gIDB4NGEsMHg1OSwweGZhLDB4NGYsMHhlOCwweGZjLDB4ODQsMHhlOCwweDNmLDB4YWYsMHg0YywweGFlLDB4ZmYsMHgwOCwweGY5LDB4YjEsCi0gIDB4NWYsMHg5OSwweGEyLDB4ZmUsMHhmMywweDQyLDB4MTksMHhmYSwweDhmLDB4NzEsMHhmZSwweGFiLDB4ZjUsMHhmMywweGU5LDB4M2YsCi0gIDB4YWYsMHg4NSwweGJkLDB4OGYsMHg5NywweGE4LDB4OGYsMHg3NiwweGNmLDB4YTQsMHhmYSwweDBmLDB4OWUsMHg1YywweDdmLDB4ZjgsCi0gIDB4YmYsMHhkMywweDdmLDB4NGMsMHhmZiwweDU3LDB4ZjAsMHgzMSwweDM3LDB4MTcsMHg4NCwweGQ0LDB4NDcsMHhiYiwweDM0LDB4YjksCi0gIDB4ZmUsMHhlMywweDg5LDB4ZmYsMHg5OSwweDFkLDB4ZGMsMHgzZiwweGE4LDB4M2UsMHg0OCwweDgwLDB4ZWMsMHgzMywweDQ5LDB4N2UsCi0gIDB4ZWMsMHgyZiwweDVlLDB4ZmYsMHgyMSwweGExLDB4ZmEsMHg4ZiwweGEzLDB4M2YsMHgwOCwweGU3LDB4YmYsMHhiNCwweDUwLDB4ZmQsCi0gIDB4YzcsMHhiZSwweGJlLDB4OTAsMHgxZiwweDliLDB4NDUsMHg1YiwweDNkLDB4Y2UsMHgwMiwweGQxLDB4YTcsMHg5MCwweDFmLDB4ZmIsCi0gIDB4Y2UsMHhlMSwweDZiLDB4ZmMsMHgxOSwweGIzLDB4MDMsMHhmMywweDYzLDB4M2IsMHg0ZiwweDQ3LDB4Y2MsMHhkNywweDUyLDB4MmEsCi0gIDB4M2YsMHhmNiwweGY5LDB4ODgsMHg0ZiwweDNmLDB4MDksMHhjYiwweDhmLDB4NmQsMHg4MCwweGYzLDB4NTEsMHg2ZiwweDRiLDB4NzgsCi0gIDB4N2UsMHg2YywweDE0LDB4NjIsMHg0ZiwweDQyLDB4ZjIsMHg2MywweDVmLDB4MmMsMHgyYywweDMwLDB4MGIsMHhhNSwweDFkLDB4ZjIsCi0gIDB4YzUsMHhmZiwweDc4LDB4ZmMsMHg1ZiwweGU2LDB4NjgsMHg3ZiwweDNmLDB4ZGMsMHg3MCwweDc2LDB4ZmEsMHgxMiwweGQzLDB4OGMsCi0gIDB4MTQsMHg0YiwweGZhLDB4YmYsMHhjYywweDZmLDB4NTksMHgxOSwweDM4LDB4Y2EsMHhlZSwweGZjLDB4ZjksMHhjMCwweGMzLDB4ZjIsCi0gIDB4NjMsMHgxMywweGViLDB4M2MsMHg4YiwweDJmLDB4M2YsMHhiNiwweGJmLDB4M2UsMHgyYywweGJiLDB4YmIsMHg4MywweGIyLDB4ZmQsCi0gIDB4ZGEsMHgxZSwweGIxLDB4NzYsMHgzNCwweDNmLDB4ZmYsMHgwOSwweGFjLDB4OGYsMHgxNiwweDFlLDB4ZmYsMHhlMywweGNkLDB4OGYsCi0gIDB4NmQsMHhjNywweDczLDB4MWEsMHg2OSwweDkxLDB4MWMsMHg1MywweDNmLDB4NTksMHg3ZCwweGI0LDB4MjksMHhlNCwweGM3LDB4YjYsCi0gIDB4YzAsMHg1YywweGI3LDB4ZTUsMHhkYSwweDkwLDB4ZmEsMHgyMCwweDU2LDB4MTgsMHhjYywweDJkLDB4OTksMHhiNywweGQ1LDB4ODMsCi0gIDB4MjksMHhkMywweGRmLDB4OGEsMHg0YSwweGU3LDB4NDcsMHhiYSwweDI4LDB4MmYsMHgxZiwweDliLDB4ZjEsMHg2YSwweGY0LDB4MWMsCi0gIDB4YjksMHhhOCwweDhhLDB4ZjEsMHhmMCwweDIxLDB4ZjksMHhiMSwweDdmLDB4Y2YsMHhlYSwweDViLDB4ZmQsMHhkYywweDEwLDB4MmUsCi0gIDB4YzIsMHhlYiwweGEzLDB4ZDEsMHhjNiwweGUyLDB4YzIsMHg2MywweGIxLDB4ZTMsMHg3YywweGQ4LDB4Y2YsMHhhNywweDg1LDB4YTYsCi0gIDB4MjMsMHhiMSwweDEwLDB4ZmUsMHg3MywweDhlLDB4Y2QsMHhjNiwweDBlLDB4NzksMHgzNywweGVmLDB4ZjYsMHg3YSwweDBkLDB4OWEsCi0gIDB4NGUsMHg1NCwweDg1LDB4ZjAsMHg5ZiwweGI3LDB4ZTksMHg2ZCwweDNlLDB4MzcsMHg0NiwweDVmLDB4MzMsMHg4ZiwweGMxLDB4NDIsCi0gIDB4ZmIsMHhjNiwweGU5LDB4MTUsMHg4NCwweGMyLDB4MjgsMHgwMiwweGZmLDB4NTEsMHg1OCwweGJkLDB4NWQsMHhmYSwweGI2LDB4MjUsCi0gIDB4Y2MsMHhlNywweGIzLDB4NDIsMHgzYywweDE1LDB4Y2YsMHg3ZiwweDU4LDB4YjYsMHhhOCwweGE1LDB4YzUsMHg5NiwweGQ3LDB4ODUsCi0gIDB4NjUsMHhhMCwweDJmLDB4MTAsMHgwMiwweDUxLDB4YmMsMHhmYywweDY3LDB4OTEsMHgyNywweDJjLDB4ZWEsMHg3MiwweDYxLDB4NzksCi0gIDB4N2YsMHgxOCwweGZmLDB4ZDksMHhjYiwweDJlLDB4YTIsMHg3OSwweGMyLDB4NWEsMHhiNCwweDA1LDB4MDIsMHgzZiwweDE3LDB4ZjgsCi0gIDB4MGYsMHgzOSwweDk4LDB4YWQsMHhkMSwweDllLDB4MTMsMHhjMiwweDk2LDB4NWUsMHg4MiwweGM2LDB4NmYsMHgwNSwweGViLDB4M2YsCi0gIDB4OTQsMHhmZiwweGUwLDB4ODMsMHgyNCwweGU2LDB4NzEsMHgxMywweGJmLDB4MDgsMHhlMiwweGZiLDB4ODIsMHg4ZiwweGZmLDB4ZWMsCi0gIDB4MTUsMHhjMywweDYwLDB4N2UsMHg0ZSwweGU4LDB4ZmIsMHg0OCwweDM4LDB4ZmYsMHg5MSwweDk3LDB4N2IsMHhjMywweDllLDB4NzEsCi0gIDB4NWEsMHg2YiwweDk5LDB4OWMsMHhmZiwweDE4LDB4YzAsMHgzYywweDhmLDB4ZjksMHg0NiwweDdmLDB4MTgsMHhmZiwweGExLDB4ZjMsCi0gIDB4NGYsMHg5NiwweDE2LDB4MmIsMHg1OCwweDU5LDB4MTAsMHgyNywweDhkLDB4ZGIsMHg2NywweGIwLDB4ZTAsMHgyNCwweDNmLDB4NjMsCi0gIDB4MjIsMHhmZiwweDM5LDB4NjQsMHhhNiwweGE1LDB4ZTUsMHgwMiwweDI5LDB4NWYsMHgwNSwweGY1LDB4ODgsMHgxYywweGMyLDB4N2YsCi0gIDB4OWUsMHhhNCwweDM3LDB4ZDUsMHhhYywweDU3LDB4MmQsMHg4OSwweGNjLDB4YjYsMHg4ZiwweDdkLDB4YmQsMHgwYiwweDg3LDB4ODYsCi0gIDB4NDQsMHhmZCwweGM3LDB4Y2IsMHg3ZiwweGQ0LDB4NGUsMHg3OSwweDQ5LDB4YzYsMHgzMiwweGVjLDB4ZmIsMHhkOSwweDYzLDB4NDUsCi0gIDB4MWEsMHgyNywweGU0LDB4MTAsMHhmZSwweGIzLDB4OWQsMHg4ZSwweDc2LDB4ZDksMHg3MCwweGNkLDB4YjMsMHhkMSwweDY2LDB4ZjgsCi0gIDB4YWQsMHg0ZCwweDdiLDB4MmUsMHhjMywweDAyLDB4OGYsMHhmZSwweDYzLDB4OGYsMHg4NywweGYyLDB4MWYsMHhlZCwweGJjLDB4ZTYsCi0gIDB4YTcsMHgwMSwweDZmLDB4MDgsMHgxMSwweDQxLDB4MjIsMHhmZiwweDc5LDB4Y2IsMHgxMywweGY2LDB4Y2MsMHgzYywweDIwLDB4NjIsCi0gIDB4YTIsMHg2YywweDgxLDB4ZmYsMHhjOCwweDhmLDB4NmUsMHg2YywweGU1LDB4ZDUsMHg5YiwweDY4LDB4M2YsMHhkZCwweGE2LDB4MWIsCi0gIDB4YjMsMHhjZCwweGExLDB4ZmMsMHhlNywweGQxLDB4NDgsMHg4YiwweGEwLDB4ZjYsMHgxOCwweDExLDB4NDEsMHg1OSwweDM5LDB4OTQsCi0gIDB4ZmYsMHhlNCwweGI0LDB4MTYsMHgyNywweGZlLDB4ODcsMHg3ZSwweDBiLDB4OWQsMHhmMCwweDM1LDB4NGQsMHg0YywweDE0LDB4MjksCi0gIDB4ZjIsMHg5ZiwweDMxLDB4NGEsMHgyYSwweDVhLDB4MzgsMHhiNywweDE3LDB4ZGIsMHg3ZiwweDVmLDB4MTQsMHgxMiwweDQ1LDB4ZjIsCi0gIDB4ZmMsMHhlNywweGQzLDB4YzgsMHgwNSwweDY4LDB4Y2IsMHhjZSwweDM4LDB4YzEsMHg2ZiwweGViLDB4OWYsMHg0MiwweDViLDB4MzYsCi0gIDB4OGMsMHhmZiwweDdjLDB4MDIsMHg2ZiwweDZiLDB4NmQsMHhiZCwweDllLDB4YjAsMHg2MSwweGVkLDB4ZjYsMHhhZCwweDMxLDB4MmUsCi0gIDB4NTEsMHgwMCwweGNmLDB4N2YsMHg0ZSwweGQzLDB4M2QsMHhhMCwweDE1LDB4OWEsMHgwNSwweGRhLDB4ZjMsMHgzMywweGQyLDB4YWEsCi0gIDB4MzYsMHg4NywweGYwLDB4OWYsMHhiNywweDIxLDB4YTcsMHhiNiwweDljLDB4OTQsMHgxMywweDllLDB4YjQsMHg5MCwweGQ5LDB4NzksCi0gIDB4YTEsMHhmYywweGU3LDB4NTEsMHg2OCwweGVkLDB4ZjEsMHhjNywweDUzLDB4NTUsMHg4NSwweGYxLDB4MWYsMHg1NiwweDBkLDB4NjQsCi0gIDB4OTMsMHgzMCwweDdlLDB4NzQsMHgyMSwweGJiLDB4NWMsMHg2YiwweDBkLDB4ZTEsMHgzZiwweDc5LDB4ZjksMHg0MiwweGM0LDB4MTcsCi0gIDB4ZjYsMHg0MywweDZlLDB4ZDMsMHhhYSwweDRiLDB4ZjAsMHg5ZiwweDM0LDB4NTQsMHg5MywweDY5LDB4YzIsMHg3YSwweDViLDB4MjAsCi0gIDB4YzcsMHg0MiwweGY5LDB4Y2YsMHgxYiwweGVhLDB4MGYsMHgwYSwweGRlLDB4YjAsMHhlNywweGI2LDB4ZmQsMHgzMCwweDljLDB4MDksCi0gIDB4ZTUsMHgzZiwweGVhLDB4NDksMHhlZiwweDMxLDB4MDEsMHg5NSwweDZlLDB4YTEsMHhjMSwweGZjLDB4MjcsMHg0MSwweDFmLDB4M2EsCi0gIDB4NmYsMHg1YSwweGQ3LDB4NDMsMHhlNCwweGE2LDB4OGMsMHgxYywweGNhLDB4N2YsMHhmZSwweDliLDB4YTQsMHhjNywweGFiLDB4YWQsCi0gIDB4ZjgsMHg5ZiwweDcxLDB4MmIsMHhmZSwweGM3LDB4ZDAsMHg3ZiwweDAyLDB4ZjksMHhjZiwweGRlLDB4ODAsMHg2ZCwweGZkLDB4MGEsCi0gIDB4NTksMHhhYywweDg1LDB4ZjMsMHg5ZiwweGI3LDB4YzksMHgzMiwweDlkLDB4ZWUsMHg1NiwweDgyLDB4ZGIsMHg2YiwweGExLDB4NzksCi0gIDB4OTAsMHhlNywweDVjLDB4MTAsMHhmZiwweGY5LDB4MmUsMHgzNCwweDY4LDB4ZjIsMHgwMCwweDRmLDB4ZGIsMHgwZSwweGUxLDB4MDYsCi0gIDB4MjEsMHgxMCwweDUxLDB4ZTQsMHgzZiwweDc5LDB4YjgsMHg0MSwweDkzLDB4M2QsMHg2NSwweDhjLDB4ZjYsMHgwYSwweDMzLDB4MjAsCi0gIDB4ZjIsMHg5ZiwweDg3LDB4NTksMHg5YSwweDVmLDB4OTEsMHg0NiwweDJhLDB4NzMsMHhiNSwweGU2LDB4MTAsMHhmZSwweGYzLDB4NTMsCi0gIDB4ZjgsMHgyNSwweDJjLDB4NjUsMHg2MSwweGJkLDB4MWMsMHgxMSwweGJhLDB4MDIsMHg4YiwweDhiLDB4MmQsMHg0YywweDAxLDB4N2IsCi0gIDB4M2YsMHg4MCwweGZmLDB4NjgsMHgxNywweDFkLDB4OTksMHhjOCwweDc1LDB4MGMsMHgyZCwweGNkLDB4NzIsMHgyZCwweDRkLDB4M2MsCi0gIDB4ZmYsMHgzOSwweDRiLDB4YWQsMHhkOSwweGVkLDB4YzMsMHgzMSwweGZiLDB4MTgsMHg5NCwweDJkLDB4ODMsMHg0YywweGYwLDB4ODksCi0gIDB4MjIsMHg3ZCwweGZjLDB4ODcsMHhmOCwweGUyLDB4NzksMHgzNiwweGM5LDB4MjEsMHhmYywweGE3LDB4OTUsMHgzZCwweDE0LDB4NDcsCi0gIDB4N2MsMHhmZCwweDg1LDB4MDgsMHg1OCwweDFmLDB4ZmYsMHhlMSwweGNiLDB4NTYsMHgwMiwweDA1LDB4OTEsMHg1OCwweGYxLDB4MzksCi0gIDB4OWUsMHgwZiwweGM0LDB4OWQsMHhlOSwweGE3LDB4ZmMsMHhlNywweDIzLDB4ZmUsMHg1OCwweDkzLDB4OWQsMHg1NiwweDQ1LDB4MjgsCi0gIDB4NTQsMHhlYSwweGYyLDB4OWYsMHhiZCwweGIzLDB4ZmMsMHg2YSwweDQ2LDB4YzAsMHhmOSwweGY3LDB4YjAsMHhmOCwweDlmLDB4ODUsCi0gIDB4ZTMsMHhkMywweDRiLDB4ZDcsMHgwNywweDI5LDB4OGEsMHhmMSwweDNmLDB4ZjMsMHgwNCwweGQ5LDB4YzcsMHhlNSwweDNmLDB4ZWUsCi0gIDB4ZjksMHgyZiwweGU5LDB4OTgsMHhmYywweDkyLDB4NGIsMHg3YiwweGM0LDB4YjAsMHhiYSwweGM5LDB4ZjUsMHg5ZiwweDc5LDB4MjEsCi0gIDB4ZjEsMHgzZiwweDhlLDB4N2QsMHhmMCwweGQ0LDB4NDcsMHg1YiwweDUwLDB4MGMsMHhlNCwweGMzLDB4NjEsMHhlNywweGJmLDB4NDIsCi0gIDB4ZjMsMHhmZiwweDdjLDB4ZWUsMHhmOCwweDFmLDB4ZjEsMHhmYywweGQ3LDB4ZTQsMHhmYSwweGNmLDB4MTksMHhmZSwweGZkLDB4OGIsCi0gIDB4N2IsMHg0ZCwweDg4LDB4NTksMHgxZSwweDUyLDB4YjMsMHhlNSwweDYzLDB4ZDcsMHhmZiwweDE1LDB4MTQsMHhmZiwweGUzLDB4OGYsCi0gIDB4N2YsMHhlNiwweGZjLDB4NWYsMHgzMSwweGNkLDB4MWIsMHhlZCwweDEzLDB4OTAsMHhmZiwweGM3LDB4ZjUsMHg3ZiwweDU5LDB4ZmMsCi0gIDB4NjcsMHg3YSwweGM5LDB4ZjUsMHhlMywweGZhLDB4YmYsMHgwNCwweGZkLDB4MjcsMHhiNCwweDVlLDB4Y2YsMHhlMSwweGQyLDB4ZjEsCi0gIDB4M2YsMHhiMiwweGU1LDB4NzYsMHgwZiwweDM4LDB4ZmYsMHg0NSwweDc4LDB4ZmQsMHhlNywweGM3LDB4NjEsMHhmNywweDFiLDB4NTgsCi0gIDB4MWYsMHhhNCwweDA0LDB4ZTAsMHhmYywweDVmLDB4NzEsMHgyZSwweGZlLDB4ZTcsMHhiNywweDYxLDB4NDIsMHgxMCwweGU3LDB4ZmYsCi0gIDB4MmEsMHgzMywweGZlLDB4YzcsMHgxZSwweGJmLDB4YTksMHhmZiwweDJjLDB4YjUsMHhkZiwweGVlLDB4OTcsMHgwNiwweGJmLDB4ZWYsCi0gIDB4ZmIsMHhjZiwweDdmLDB4ZDUsMHg0YywweDQ5LDB4ZmYsMHg5OSwweDE3LDB4YmMsMHg0ZCwweDRmLDB4NTgsMHhhNSwweGJlLDB4MmEsCi0gIDB4N2UsMHhlNSwweGQzLDB4N2YsMHhhYSwweDc4LDB4MTksMHhjNCwweDk3LDB4MmYsMHhkYSwweGY1LDB4N2YsMHg5OSwweGZhLDB4Y2YsCi0gIDB4NTIsMHhmNywweGVlLDB4NmEsMHhjYSwweGQzLDB4N2YsMHg4MiwweDhlLDB4N2QsMHgwNSwweGZhLDB4YmYsMHhhNCwweDEyLDB4ZGQsCi0gIDB4YTYsMHhhZSwweGZmLDB4OWMsMHgzMSwweGMwLDB4NDYsMHhjZSwweGZmLDB4NTUsMHg4ZSwweGZlLDB4YjMsMHg5MSwweGNiLDB4OGYsCi0gIDB4NWQsMHg5ZSwweGZlLDB4ZTMsMHhmYSwweGJmLDB4Y2EsMHg4YywweGZmLDB4YjEsMHhjNywweDNmLDB4NDksMHhmZSwweDlmLDB4ZmYsCi0gIDB4ZjQsMHhmYSwweGJmLDB4OWEsMHgzZCwweGY5LDB4YjEsMHhhMSwweDJhLDB4ZjAsMHhmYywweDU3LDB4YjgsMHhmZSwweGUzLDB4MDcsCi0gIDB4OGYsMHg5NSwweGQ0LDB4N2YsMHgwMiwweGNmLDB4ZTMsMHg5NCwweGFjLDB4OGYsMHg2NiwweDgwLDB4YmYsMHgxMSwweDVhLDB4NWMsCi0gIDB4ZmYsMHg5NywweDRmLDB4ZmYsMHhhOSwweGQ5LDB4ZGEsMHhlNCwweDEyLDB4YTEsMHg0YSwweGM3LDB4ZmYsMHg2NSwweGFmLDB4MzcsCi0gIDB4NWUsMHhmZiwweGMxLDB4NjYsMHgzNCwweDRiLDB4NWQsMHg4MCwweDNkLDB4ZTEsMHhlMiwweDNmLDB4ZjksMHhkZCwweGFhLDB4ZDAsCi0gIDB4MzYsMHg1ZSwweDc1LDB4MjEsMHg3YSwweDU5LDB4M2IsMHg0NywweDk2LDB4ODUsMHg5ZCwweGZmLDB4YmEsMHg3YSwweDhmLDB4MTEsCi0gIDB4YjYsMHg2NCwweDhkLDB4ZjYsMHhlNiwweDMzLDB4NTUsMHhhYywweDUwLDB4ZDEsMHhlMywweDllLDB4NDIsMHg0NSwweGEyLDB4ZmYsCi0gIDB4Y2IsMHhiZCwweDRkLDB4NzQsMHhmMywweGQ4LDB4MTAsMHhlZCwweDJmLDB4ZmYsMHg3MywweDg5LDB4ZjMsMHg1ZiwweGUyLDB4ZWMsCi0gIDB4OGQsMHg1YywweGMzLDB4YzAsMHhjMywweDMwLDB4NDcsMHhkNCwweDdmLDB4ZGMsMHhmMSwweGYwLDB4ZTcsMHg2NywweGQ5LDB4NDEsCi0gIDB4NjYsMHgzOSwweGM4LDB4OTAsMHg4NiwweGU5LDB4M2YsMHhhZSwweDNlLDB4YjYsMHgzNCwweDRjLDB4ZmYsMHg4MSwweDYwLDB4MzMsCi0gIDB4N2UsMHhiMywweGQwLDB4ZTIsMHhmYSwweGJmLDB4NDgsMHg1OSwweGYxLDB4M2YsMHgyMSwweGU3LDB4YmYsMHhiOCwweDYzLDB4NWYsCi0gIDB4MGYsMHg4OCwweDdhLDB4NTEsMHg4OCwweGZlLDB4ODMsMHg5YywweGIwLDB4ZTcsMHhmYiwweDhkLDB4MTYsMHhjYywweGJlLDB4OGEsCi0gIDB4YTYsMHg0MSwweGYwLDB4N2YsMHgwOSwweGJmLDB4ZmUsMHg1OCwweDRkLDB4ZDAsMHhmZSwweGMyLDB4ZTksMHgzZiwweGQ1LDB4YzIsCi0gIDB4NmQsMHgyZSwweDNmLDB4MTIsMHhiYywweGJmLDB4YmIsMHhlNywweGJmLDB4OTAsMHg5ZiwweGVkLDB4OTgsMHg4ZSwweGIwLDB4ZTAsCi0gIDB4ZjMsMHhlZiwweGJlLDB4ZjgsMHg2NywweGMxLDB4MTEsMHgzNiwweGQ1LDB4ZjgsMHg2NywweDFjLDB4YTIsMHhmZiwweDg0LDB4ODQsCi0gIDB4NTEsMHg5NSwweDFkLDB4ZmYsMHhlYywweDc1LDB4YzQsMHg3OCwweGNmLDB4N2YsMHg5OSwweGY1LDB4MmYsMHhmYywweDBiLDB4MDMsCi0gIDB4NTksMHgwYSwweDYxLDB4ODksMHhmOCwweGU3LDB4MWEsMHhlZSwweGZhLDB4MmQsMHhiMiwweDhmLDB4ZmYsMHg3OCwweGZjLDB4NWYsCi0gIDB4Y2IsMHhmOSwweGYxLDB4ZDcsMHhkZCwweGVmLDB4ZTcsMHgzZiwweGJlLDB4ZjgsMHhlNywweDJhLDB4Y2UsMHg3MSwweGUzLDB4MmMsCi0gIDB4MTUsMHg5ZiwweGZlLDB4NzMsMHhmYSwweDVhLDB4NzMsMHhmNywweGJmLDB4ODEsMHg3MywweDBjLDB4OWQsMHg3NywweGYzLDB4ZTEsCi0gIDB4ODQsMHhmOCwweGJmLDB4N2UsMHg0NywweGFmLDB4ZTYsMHhlNiwweDNmLDB4ZGMsMHgxZiwweDhkLDB4OTUsMHhhYiwweGZmLDB4ODgsCi0gIDB4MjAsMHhkOCwweGZmLDB4ZDUsMHg1MSwweDYyLDB4ZmUsMHgzZiwweDdmLDB4ZmMsMHg3MywweDUwLDB4N2QsMHg1OCwweGJmLDB4MjMsCi0gIDB4MmMsMHhjOCwweGZmLDB4OTUsMHgwOSwweDU4LDB4NmYsMHg3NiwweGUyLDB4ODUsMHhkMiwweGY1LDB4NjEsMHgyOSwweDE4LDB4ZmEsCi0gIDB4NDIsMHhlMiwweDlmLDB4Y2IsMHgzOCwweGZmLDB4MzUsMHhlYywweDhkLDB4N2YsMHg5ZSwweDg0LDB4ZmYsMHg3OCwweGVhLDB4ODMsCi0gIDB4ZmMsMHhkMSwweGZkLDB4NWYsMHgyOSwweDVmLDB4N2QsMHhkOCwweDMyLDB4Y2UsMHg3ZiwweGY5LDB4NmUsMHhkMywweGViLDB4MDgsCi0gIDB4MGIsMHhhZiwweDBmLDB4NmIsMHg4MiwweDhmLDB4ZjksMHg5NiwweDY5LDB4N2MsMHhmYywweDczLDB4ZWEsMHhjYiwweGU2LDB4ZmYsCi0gIDB4MzIsMHhlYSwweGE5LDB4ZjksMHg3ZSwweDU2LDB4ZTIsMHhlNSwweDNmLDB4ZjYsMHhmYSwweDFjLDB4MDIsMHg5YiwweGZmLDB4MDgsCi0gIDB4NjUsMHg0MSwweDg2LDB4NGIsMHhmOSwweGJmLDB4Y2UsMHgwNCwweDRjLDB4YmIsMHg3MCwweGZlLDB4YWIsMHhjMywweDczLDB4ZmUsCi0gIDB4MmIsMHg4MCwweGY2LDB4MzgsMHg4OSwweDgwLDB4MWUsMHgzMCwweGY0LDB4MWYsMHg2NCwweGFmLDB4ODcsMHgzMCwweGZlLDB4NjMsCi0gIDB4M2EsMHg2ZSwweGIwLDB4MTksMHhhOCwweDUwLDB4NTEsMHhlMiwweGZjLDB4OTcsMHhhNSwweGZmLDB4MDgsMHhmYywweGExLDB4MzYsCi0gIDB4ZTgsMHhmYywweDk3LDB4MTgsMHhmNiwweDNjLDB4ZGYsMHgwNiwweDM3LDB4NGQsMHgyNSwweGZlLDB4ZDksMHgyZSwweDhjLDB4MTUsCi0gIDB4OTgsMHhmZiwweDMwLDB4MTgsMHhkYywweDNjLDB4MzEsMHhlMywweDgyLDB4ZmYsMHhmYywweDk3LDB4M2QsMHhkYSwweGRiLDB4YjksCi0gIDB4NjEsMHhmZiwweDdkLDB4ZTMsMHg2NCwweGZlLDB4MmYsMHgxMSwweGQ4LDB4ZjksMHg3ZiwweGVlLDB4MWMsMHhhOCwweDJkLDB4MTEsCi0gIDB4ZmYsMHhjYywweGY0LDB4NjcsMHg3OCwweDg5LDB4ODgsMHg4NiwweGM4LDB4NzcsMHhmZSwweDZiLDB4OTIsMHhmNywweDZiLDB4ZmYsCi0gIDB4ZjksMHgyZiwweDBmLDB4ZWQsMHg1MSwweGM0LDB4ZmUsMHhmZiwweGUxLDB4ZjEsMHg3ZiwweDg5LDB4ZDEsMHhiZiwweGI3LDB4ZjksCi0gIDB4ZTMsMHg5ZiwweGZiLDB4NGIsMHhmOCwweGJmLDB4YTIsMHg3ZSwweDQ2LDB4YzQsMHhlYiwweDNmLDB4ZmUsMHg2ZiwweGZkLDB4MGEsCi0gIDB4NDAsMHg3MCwweGZjLDB4YjMsMHgzZCwweDNmLDB4ZDYsMHgwYSwweGU0LDB4ZjMsMHhmZiwweDM4LDB4YjMsMHgwZiwweDk1LDB4ZjcsCi0gIDB4ZmIsMHhhMiwweGMxLDB4NWIsMHg0YywweGMwLDB4ZDUsMHg4NywweGY1LDB4YzQsMHgzZiwweDA3LDB4Y2IsMHgxYSwweGVlLDB4ZmUsCi0gIDB4NTUsMHhlNywweGVhLDB4M2YsMHgyMywweDkzLDB4YWMsMHg5ZiwweDQxLDB4YWYsMHhmZSwweDAzLDB4M2YsMHhiNSwweDQ5LDB4Y2UsCi0gIDB4MDMsMHgwMSwweDQ0LDB4YzgsMHhjNywweDdmLDB4YzYsMHg4NCwweDdjLDB4MDgsMHgzOCwweDg0LDB4MDgsMHhiOSwweGY2LDB4NjcsCi0gIDB4M2MsMHhiMSwweDJmLDB4MzEsMHg5NSwweGYzLDB4NWYsMHgxMiwweDJlLDB4NjcsMHhmZCwweGI4LDB4ZmEsMHhjZiwweDMzLDB4NmUsCi0gIDB4ZmUsMHhlNywweDZmLDB4ZjksMHhmOSwweDBmLDB4NGIsMHg4NCwweDM4LDB4ZjIsMHhmOCwweDQ3LDB4N2YsMHhlMSwweGYyLDB4OWYsCi0gIDB4NzEsMHhkOCwweDg3LDB4NGQsMHg2ZiwweDZjLDB4OTksMHhmYSwweDBmLDB4NzYsMHg3ZiwweDdkLDB4YjksMHg5YywweGYzLDB4ZWYsCi0gIDB4YmUsMHhmNSwweDEwLDB4MDQsMHg1YywweGZlLDB4NzMsMHgxYywweDc4LDB4ZmQsMHhjNywweDBhLDB4ZmIsMHgyMSwweDRlLDB4MDUsCi0gIDB4MzEsMHgzZiwweGZmLDB4NDksMHhmMSwweGZjLDB4ODcsMHhkYywweDc2LDB4OTYsMHg4MiwweDVmLDB4MTEsMHg5NiwweDA4LDB4MjgsCi0gIDB4MjQsMHhmZSwweGE3LDB4N2UsMHgxZiwweDNjLDB4MTQsMHg3NCwweDliLDB4NDcsMHg4NCwweGY5LDB4NzQsMHhlYywweDRmLDB4NzMsCi0gIDB4NTksMHhmMywweGNmLDB4ZjEsMHgxZiwweDY1LDB4NmEsMHhmYywweGM3LDB4OTcsMHhmZiwweDY3LDB4ZDIsMHhmOCwweDlmLDB4MWQsCi0gIDB4NjUsMHhjYywweGU3LDB4M2IsMHhkYywweGZhLDB4N2MsMHgwZSwweDdmLDB4ODYsMHg5NiwweGU3LDB4Y2EsMHg4ZiwweGZmLDB4MDksCi0gIDB4YzgsMHhmZiwweDIzLDB4OTcsMHhlMCwweDNmLDB4MTAsMHhmOCwweGJlLDB4OGYsMHhjMiwweGUzLDB4N2YsMHhjYSwweGUxLDB4MzMsCi0gIDB4OWMsMHhmZSwweGUzLDB4ZWQsMHhmZiwweDk4LDB4MDEsMHgyMiwweGExLDB4ZjksMHg5ZiwweDk1LDB4NTIsMHhmYywweDA3LDB4ZmIsCi0gIDB4ZjgsMHg0ZiwweGFmLDB4NWMsMHgwZSwweGZmLDB4ZTEsMHhmNCwweDlmLDB4NjQsMHgyMCwweGNkLDB4YWIsMHgwOCwweGU1LDB4M2YsCi0gIDB4ZDUsMHg5ZSwweGZlLDB4YTYsMHgxYiwweDA4LDB4M2IsMHgyZCwweGFkLDB4YTIsMHhmZSwweDYzLDB4ZTUsMHgzZiwweDE0LDB4NjksCi0gIDB4OGYsMHgxYywweGNlLDB4N2YsMHg3NCwweGM4LDB4NGYsMHg4OSwweGZmLDB4YmMsMHg4NiwweDgzLDB4ZjksMHg0ZiwweDRkLDB4MDgsCi0gIDB4ZmYsMHgxMSwweGVhLDB4YzMsMHhiYSwweDIwLDB4MTIsMHhhNiwweGZmLDB4OGMsMHhjMSwweDVlLDB4ZWMsMHhlYiwweGFmLDB4NzgsCi0gIDB4ODEsMHhjYiwweDdmLDB4ZTQsMHhhMCwweGY1LDB4NTYsMHhhYSwweDNlLDB4NmMsMHg2MiwweDUyLDB4ZmQsMHg0NywweGYwLDB4N2YsCi0gIDB4ZjksMHhmNywweGEzLDB4ZDIsMHhmYSwweDBmLDB4MDIsMHg5ZSwweGZmLDB4NDQsMHg0MiwweDllLDB4NWYsMHhkNywweGZmLDB4MjUsCi0gIDB4OTMsMHg2MCwweGZlLDB4MjMsMHg4MCwweDBlLDB4ZDcsMHhmZiwweGM1LDB4ZTUsMHg0MywweDBlLDB4YjcsMHgyNywweDBiLDB4MzksCi0gIDB4ZmUsMHgxMywweDdiLDB4NDMsMHhlMywweGY0LDB4OWYsMHg2NSwweGE3LDB4Y2QsMHg0MCwweGEwLDB4ZDAsMHhmOCwweDlmLDB4ZTcsCi0gIDB4NjEsMHg4ZiwweDliLDB4NmQsMHhlYywweDIwLDB4NTEsMHg1OSwweDNjLDB4MGYsMHhiZCwweGNkLDB4NjEsMHg3ZSwweGZjLDB4OWIsCi0gIDB4MzksMHhmZSwweDMzLDB4MGMsMHg0ZSwweDdkLDB4NTgsMHg0YSwweGYzLDB4NTQsMHgzYiwweGRmLDB4YTMsMHgxYSwweGE2LDB4ZmYsCi0gIDB4NjgsMHg2MiwweGZlLDB4MWYsMHgyNywweDlmLDB4MzYsMHgzNywweDlmLDB4OGYsMHhmMSwweGZlLDB4MmYsMHg1OSwweGIwLDB4OWYsCi0gIDB4ODgsMHhmMSwweDk5LDB4ODgsMHg3OCwweGJmLDB4MjMsMHgxZSwweGZkLDB4YzcsMHhlZCwweDZmLDB4YjEsMHhjMSwweGE2LDB4OTIsCi0gIDB4ZjEsMHgzZiwweDdjLDB4YmQsMHgwMywweGUzLDB4M2MsMHhhZiwweDA4LDB4YmMsMHhmZSwweGFmLDB4OTEsMHg4NCwweGM4LDB4NWUsCi0gIDB4NDYsMHg3OCwweGQ5LDB4ZTEsMHhhYywweDUyLDB4OWEsMHhmZiwweDJjLDB4ZjMsMHg2ZSwweDdjLDB4YjIsMHg1ZiwweGZmLDB4MDEsCi0gIDB4N2UsMHhiZCwweGE5LDB4M2UsMHgxMCwweGYxLDB4YzQsMHhmZiwweDQ0LDB4ODAsMHhkNywweDdmLDB4OGEsMHg0NiwweDE4LDB4ZmMsCi0gIDB4MDcsMHhkYSwweGM1LDB4ZTMsMHhhYywweGM1LDB4OGQsMHhlZiwweDc1LDB4ZjUsMHg5ZiwweDQxLDB4M2UsMHhmZiwweGNmLDB4YzUsCi0gIDB4MjUsMHg2ZCwweGJmLDB4YTAsMHhlMCwweDcyLDB4ZmUsMHhjYSwweGFlLDB4NTAsMHhmZiwweDk3LDB4YTUsMHgxZiwweGZlLDB4ZWIsCi0gIDB4ZjksMHg4ZSwweDAwLDB4ZmUsMHhhMywweGY4LDB4ZTMsMHg3ZiwweDUyLDB4MWYsMHgyYSwweGQ2LDB4MjEsMHgyZiwweDFiLDB4MDQsCi0gIDB4ZjAsMHg5ZiwweGYzLDB4NjIsMHg3ZCwweDU4LDB4YTksMHg3OSwweGU0LDB4NGUsMHgzYiwweGNjLDB4ZGIsMHhiMywweDFlLDB4NGMsCi0gIDB4NDYsMHhjNCwweDlkLDB4ZmYsMHg5MiwweGY2LDB4MjksMHgwNywweDMxLDB4OWIsMHhmNiwweGI5LDB4MjUsMHhmOCwweGNmLDB4NzksCi0gIDB4NmUsMHg3ZiwweGRjLDB4NjcsMHhjOCwweDgwLDB4ZjcsMHhlYywweGFmLDB4MzMsMHhmNSwweDUyLDB4NmUsMHgxOSwweGQ0LDB4MzksCi0gIDB4ODksMHg4MCwweDQ2LDB4OWMsMHhmMSwweDlmLDB4MmUsMHg4NCwweDlmLDB4N2YsMHhjZiwweDcwLDB4ZmEsMHg5OCwweDdkLDB4N2QsCi0gIDB4NTMsMHhmZiwweDMxLDB4NjksMHhiNiwweDliLDB4NTYsMHhlOCwweDYwLDB4MjgsMHhmZiwweGY5LDB4MDUsMHg2NiwweGY5LDB4N2YsCi0gIDB4OTYsMHgxNiwweDhkLDB4YjQsMHhlMSwweDllLDB4NjEsMHg2NywweGNlLDB4NjIsMHg1ZiwweGZlLDB4YzMsMHg3MSwweDY0LDB4YmYsCi0gIDB4N2YsMHhhZCwweGY2LDB4OTcsMHg2NSwweDc0LDB4YzAsMHg0NywweGNlLDB4ZGQsMHhlYSwweDY4LDB4NzYsMHhkYywweGRhLDB4ZjQsCi0gIDB4ZmYsMHgxMSwweDg1LDB4ZjIsMHgwMSwweGJlLDB4M2UsMHhhYywweGM1LDB4N2YsMHhlNiwweDc3LDB4YjgsMHg2ZSwweDJmLDB4OWYsCi0gIDB4NDcsMHg4YywweGFiLDB4MGYsMHhjYiwweGY0LDB4MWYsMHhmNCwweDUwLDB4OTEsMHg0ZiwweGZiLDB4NzMsMHhkNiwweDk3LDB4MWYsCi0gIDB4ZGIsMHhhZCwweDBmLDB4NmIsMHhlOCwweDNmLDB4NzgsMHgzMiwweGZlLDB4MTMsMHhlYywweGZmLDB4NTIsMHhjMiwweGY5LDB4OGYsCi0gIDB4YWIsMHhiZiwweDU5LDB4ZmMsMHhlNywweGNlLDB4YWQsMHg5OSwweDEyLDB4ZmMsMHhhNywweGU4LDB4ZDMsMHg3ZiwweGFlLDB4MmQsCi0gIDB4YTksMHhmZiwweGY4LDB4ZWIsMHg1ZiwweDRjLDB4YzIsMHg3ZiwweDgyLDB4ZWEsMHg1ZiwweDk0LDB4ZDIsMHg3ZiwweGI4LDB4ZmMsCi0gIDB4Y2YsMHhlNSwweGU5LDB4M2YsMHg3NiwweDdmLDB4ZGYsMHhmOSwweGY3LDB4NDksMHhmMiwweDNmLDB4ZmIsMHhmOCwweGNmLDB4MWYsCi0gIDB4NDMsMHhmZiwweDY5LDB4ZTQsMHhjZSwweGJmLDB4Y2IsMHhmZSwweDY4LDB4ZGIsMHg5MiwweGY1LDB4NjEsMHhjYiwweDNhLDB4ZmYsCi0gIDB4ZWUsMHhlNiwweDdmLDB4MGUsMHhlNiwweDRiLDB4NmYsMHgxOSwweDgxLDB4ZTIsMHgxZCwweDZlLDB4N2YsMHhkNywweGZmLDB4MTUsCi0gIDB4YzQsMHg3ZiwweDhjLDB4ODMsMHg2MCwweGMxLDB4ZjksMHg5ZiwweDIxLDB4ZTksMHhiZiwweGNkLDB4MDksMHg3NiwweDIyLDB4NTUsCi0gIDB4NjgsMHhlMSwweGZjLDB4NWYsMHhjOCwweGU1LDB4M2YsMHg2ZSwweDIwLDB4ZmEsMHgzZiwweDg1LDB4ZTcsMHgzZiwweGNjLDB4MDcsCi0gIDB4ZjEsMHgxZiwweDZmLDB4YTIsMHg2ZiwweGI3LDB4NWUsMHhlNywweGYzLDB4YzEsMHhmYSwweDhmLDB4ODcsMHgyZiwweGI5LDB4ZjksCi0gIDB4OWYsMHhlNywweGYxLDB4ZmMsMHg4NywweDFkLDB4YzQsMHg5YiwweGVjLDB4ZmMsMHgzYiwweGFmLDB4ZmYsMHhmYywweDdiLDB4MTgsCi0gIDB4ZmYsMHg3MSwweGRmLDB4YWYsMHg5YiwweDkzLDB4OWMsMHhmZSwweDYzLDB4OTUsMHg4OSwweGYxLDB4OWYsMHhiZiwweGUwLDB4ZWEsCi0gIDB4NWYsMHhiOCwweGZhLDB4Y2YsMHg2NSwweDc4LDB4MmEsMHhlNCwweGY5LDB4NmQsMHhlNCwweGY0LDB4MWYsMHg5OCwweDZkLDB4MWYsCi0gIDB4N2IsMHhiZiwweDBjLDB4NmYsMHg4NiwweDExLDB4MjEsMHhhZSwweGZlLDB4ODUsMHhhOCwweDg3LDB4NzgsMHhmMiwweDY5LDB4ZDgsCi0gIDB4MTYsMHg3OCwweDBhLDB4ZmEsMHg4ZiwweDAxLDB4YjgsMHhmYSwweGIwLDB4YzgsMHhjYywweGZmLDB4ZTMsMHg4YywweDc2LDB4ODYsCi0gIDB4MGQsMHgyYSwweGRkLDB4ZjEsMHg0NywweDlmLDB4NzcsMHhkNiwweGMzLDB4Y2UsMHhiMiwweGRlLDB4ZDcsMHgzYywweGY1LDB4MmYsCi0gIDB4MjIsMHhkNiwweGVjLDB4M2QsMHhjMSwweDRmLDB4MjMsMHgxZiwweDYxLDB4NTUsMHg3MCwweGVhLDB4NWYsMHhhOCwweDFlLDB4ZmQsCi0gIDB4NjcsMHgyNCwweGQwLDB4N2UsMHhiYSwweGZhLDB4NGYsMHhkZSwweDFiLDB4ZmYsMHhlYywweGY4LDB4ODMsMHhhNiwweDBiLDB4N2YsCi0gIDB4NjgsMHg1ZiwweDNmLDB4NjcsMHhjNSwweDNmLDB4M2YsMHgxZSwweGIwLDB4ZGYsMHgzNSwweDA1LDB4OWMsMHg3ZiwweDFmLDB4NjEsCi0gIDB4ZmEsMHgwZiwweGUyLDB4YjYsMHhhZCwweDFhLDB4Y2YsMHhmZSwweDZiLDB4NjQsMHgwNCwweDNhLDB4ZGQsMHg2ZSwweGZmLDB4NWUsCi0gIDB4MDQsMHhmYiwweGQ1LDB4MWUsMHgwNywweGVjLDB4ZjMsMHhlYiwweDNmLDB4MzEsMHg4MSwweGZmLDB4ZTAsMHgyMCwweDdmLDB4ZWIsCi0gIDB4YjUsMHhjMiwweGY5LDB4NzcsMHhiOCwweDVmLDB4M2UsMHg2OCwweGI4LDB4NDEsMHgwMywweGE2LDB4NjUsMHg5ZiwweGJkLDB4MTEsCi0gIDB4YmIsMHhmNSwweDYxLDB4ZjcsMHgzMiwweGZlLDB4ODMsMHg2NiwweDRjLDB4MTYsMHhmZiwweGQzLDB4M2QsMHhlMCwweGZjLDB4MDcsCi0gIDB4YTEsMHhmYSwweGRlLDB4YjEsMHhlNiwweDg1LDB4NTUsMHg1ZiwweGE2LDB4N2EsMHg4OCwweGM3LDB4YTYsMHg1MCwweDBmLDB4NTEsCi0gIDB4YjYsMHg0MCwweDZjLDB4ZWMsMHhhYiwweDdhLDB4ODgsMHg5ZiwweDdmLDB4ZmUsMHg0MywweGVhLDB4MjEsMHg4MiwweGRiLDB4YTIsCi0gIDB4NGQsMHhhOSwweDFlLDB4ZTIsMHhiMSwweGE5LDB4ZDUsMHg0MywweGNjLDB4NGQsMHg3MSwweGZlLDB4MWIsMHhiZSwweGFhLDB4ODcsCi0gIDB4MzgsMHhjNSwweGNmLDB4OTcsMHhhYiwweGZlLDB4ZTAsMHg5NywweGFmLDB4ZmYsMHg5NywweGVjLDB4NzksMHg5YywweGYyLDB4ZjUsCi0gIDB4NjUsMHgxMiwweDUxLDB4OGYsMHgwZCwweDQxLDB4YTMsMHgwMSwweGMwLDB4YTgsMHgzYiwweGU0LDB4ODIsMHgzZiwweDYxLDB4N2IsCi0gIDB4ZjgsMHhjZCwweGZmLDB4NDcsMHg3YiwweGM4LDB4YWMsMHg1ZiwweDkwLDB4NjEsMHgzNCwweDc2LDB4YTgsMHhhZiwweGVhLDB4YzMsCi0gIDB4NGUsMHhmYSwweGY5LDB4Y2EsMHgxZSwweGZlLDB4YzksMHhmNiwweDFmLDB4NmQsMHg4ZiwweDBlLDB4NjgsMHhhNywweDk0LDB4NWIsCi0gIDB4NDEsMHgxYSwweDMxLDB4MDEsMHg5NiwweGJlLDB4MWIsMHhkZCwweGFjLDB4ZjUsMHgyOSwweDU3LDB4MjUsMHhhYSwweDQ3LDB4YTcsCi0gIDB4NTEsMHg5MCwweGJkLDB4MGEsMHg1NywweDE3LDB4ZTcsMHgzYiwweGZkLDB4YmIsMHgzYSwweGE1LDB4Y2QsMHhhOCwweDRmLDB4ZGIsCi0gIDB4NDAsMHgxNywweGJiLDB4MDEsMHhkNiwweDI5LDB4ODksMHgyMywweDY2LDB4NGIsMHgyYSwweDc5LDB4MTQsMHg5OSwweDVmLDB4MjUsCi0gIDB4OGIsMHhmMywweDZkLDB4M2UsMHg0YywweDZkLDB4MTMsMHg1MiwweDQ5LDB4OGYsMHg1YSwweDJiLDB4ZTMsMHg0MSwweDFmLDB4ZDgsCi0gIDB4YzYsMHg4MCwweDRlLDB4MDEsMHg1MSwweDlkLDB4ZWIsMHgxMywweDQwLDB4M2EsMHhmNCwweGMyLDB4NGMsMHhkOCwweDQ1LDB4MmMsCi0gIDB4OTAsMHhjYywweGEzLDB4N2IsMHg3MywweGJkLDB4YjAsMHg1ZSwweDkxLDB4MDgsMHhiYSwweDE3LDB4ZjUsMHhhYSwweGViLDB4NDEsCi0gIDB4ZTIsMHhmYSwweDc3LDB4ZjUsMHg1ZSwweGI3LDB4MTgsMHhkZCwweDQ1LDB4ZDYsMHhiNCwweGUzLDB4MWQsMHhkMiwweDE2LDB4ZDQsCi0gIDB4NTcsMHhkYywweGEwLDB4MjYsMHhjNywweGE0LDB4NmYsMHhhMiwweDNlLDB4NjIsMHg4MCwweDJkLDB4MzksMHgwMywweDcwLDB4ZTMsCi0gIDB4MTksMHhkNSwweDM0LDB4NTUsMHg5MSwweDcxLDB4MDQsMHhkMSwweGZmLDB4YTQsMHg0MywweDRhLDB4YTksMHgwMCwweDY0LDB4MDAsCi0gIDB4YTAsMHgyMCwweDZmLDB4MDMsMHhlMiwweGRlLDB4ZWYsMHg2OCwweDBmLDB4ZGUsMHg4OCwweDUyLDB4YTQsMHg5YiwweDVhLDB4NTgsCi0gIDB4ZGMsMHg4OCwweDY0LDB4OTIsMHgwMSwweDY1LDB4MDgsMHgzNywweDUwLDB4OGIsMHg5MSwweDUxLDB4OTUsMHgzYywweDU2LDB4OTEsCi0gIDB4MGMsMHg5OSwweGI0LDB4YzIsMHhmNywweDVmLDB4MjksMHhhZCwweGNlLDB4YWQsMHgxZCwweDVlLDB4ZDcsMHg4YywweDZiLDB4YTQsCi0gIDB4NGMsMHgyZSwweDNiLDB4YmMsMHg1NiwweDk2LDB4YWEsMHgyNCwweDhkLDB4NjQsMHhkNSwweDQ0LDB4NzMsMHgzMiwweDYyLDB4ODIsCi0gIDB4OTYsMHgyNCwweDcwLDB4ZjMsMHg1MywweDhmLDB4YTYsMHhjMSwweGJhLDB4NjIsMHgzMiwweDhiLDB4NjMsMHg2OCwweDAzLDB4YWMsCi0gIDB4MjMsMHhmMSwweDAxLDB4YTksMHgwZiwweGFkLDB4ODEsMHhiNSwweGM1LDB4NjQsMHg1YSwweGZhLDB4NzMsMHgxNCwweDY1LDB4NjAsCi0gIDB4MDksMHg3NiwweDVlLDB4YmYsMHhhOCwweGY1LDB4NjEsMHgxNiwweGEwLDB4MTYsMHgzMCwweGExLDB4YzYsMHg4NiwweDVhLDB4M2UsCi0gIDB4MGQsMHhhOSwweDc0LDB4MmMsMHgxZCwweGEwLDB4MTAsMHhhYywweDIwLDB4NGMsMHg0ZCwweDAzLDB4MDMsMHhkMCwweGVlLDB4ZjYsCi0gIDB4MWYsMHhkNSwweDIzLDB4MzIsMHgwYywweDgyLDB4NGEsMHg1MiwweGFhLDB4MDEsMHgxYSwweDg4LDB4YWMsMHg1YSwweDJkLDB4NzIsCi0gIDB4NDMsMHg4NSwweDA1LDB4ZGEsMHhiOSwweGY5LDB4NTEsMHhhNCwweDM5LDB4ZTgsMHhjZiwweDYwLDB4YmQsMHg1NiwweDRmLDB4YTQsCi0gIDB4N2UsMHgwYSwweDllLDB4ZDQsMHg2NiwweDE1LDB4MjQsMHgxZCwweDlkLDB4ODQsMHhiZiwweDg1LDB4NjQsMHg0MSwweDUyLDB4NGQsCi0gIDB4YzAsMHhkZiwweGFmLDB4MTYsMHhkNSwweGUxLDB4MjQsMHgyYywweDg2LDB4MTgsMHg5OSwweDY2LDB4ZmMsMHg1ZSwweGFhLDB4NDQsCi0gIDB4YTIsMHgxYiwweDUxLDB4MmYsMHg5OSwweGM5LDB4MmEsMHgzOCwweDZkLDB4MDQsMHgxMywweDcwLDB4ZWIsMHgyNywweDgzLDB4ZDMsCi0gIDB4OGYsMHhjNCwweGQ0LDB4MGUsMHhmYSwweDlmLDB4MmIsMHhlOCwweDU4LDB4ZDUsMHhhOCwweGFjLDB4MWMsMHhjNiwweGU5LDB4MWMsCi0gIDB4NmIsMHg1MSwweDBlLDB4MDMsMHgwNSwweDY5LDB4MGEsMHhiOCwweGRmLDB4OGIsMHg3ZSwweGQyLDB4ZjQsMHg5ZCwweDJhLDB4Y2EsCi0gIDB4NTYsMHg4NiwweDA1LDB4OGEsMHgzNiwweDE4LDB4NzMsMHg1YSwweGI4LDB4ZjUsMHgxMywweDQxLDB4NjksMHhiMiwweDRhLDB4YWQsCi0gIDB4OTMsMHgxMywweDgzLDB4MjYsMHg4OCwweDI1LDB4MGUsMHhhMywweDc0LDB4NzEsMHg1NSwweDdhLDB4OGQsMHg4YywweDdmLDB4ODksCi0gIDB4ZDIsMHgyMywweGFiLDB4NTQsMHgwYSwweGI4LDB4ZmUsMHhhMywweDE5LDB4NDksMHhjZiwweGQxLDB4NDUsMHhjNSwweDk2LDB4YTUsCi0gIDB4MDksMHg5MiwweDgzLDB4OTIsMHgzZSwweGQyLDB4OWIsMHhhNiwweGUwLDB4NjEsMHhhNCwweDlhLDB4ODAsMHhjNCwweGRkLDB4ZjksCi0gIDB4YzksMHhiMCwweDA5LDB4NzMsMHhhNiwweDkwLDB4ODEsMHhjMywweDE0LDB4YzQsMHhlOCwweDhkLDB4YzAsMHgyMCwweGI2LDB4MDAsCi0gIDB4N2YsMHhiZiwweGFiLDB4YjEsMHg5ZSwweDRiLDB4YTksMHhkZCwweDNkLDB4YjAsMHgxMywweGY0LDB4ZGMsMHhkNSwweDZhLDB4NzcsCi0gIDB4OGMsMHhkZSwweDZmLDB4M2YsMHhiYiwweGRmLDB4OWUsMHhmOCwweDRlLDB4YWMsMHg5YSwweDgwLDB4ZWYsMHhhZiwweDRiLDB4YmQsCi0gIDB4NjgsMHgzZCwweDVkLDB4MDgsMHg3NCwweDZkLDB4NTksMHg4MCwweGI1LDB4NzQsMHg0MywweDljLDB4YWMsMHhkMywweDI1LDB4MTksCi0gIDB4MTgsMHg0OCwweDZhLDB4ZGMsMHhmYSwweGE5LDB4NDAsMHg1ZiwweDI3LDB4NmIsMHg3NSwweDY5LDB4MzcsMHhhZSwweDQwLDB4ZWQsCi0gIDB4MjQsMHhhYiwweGUzLDB4OTQsMHg2NCwweDgyLDB4MDQsMHgwNywweDljLDB4ZDcsMHg2NSwweGRhLDB4YmYsMHhkNiwweGQ4LDB4NDYsCi0gIDB4MjIsMHgxYSwweGVjLDB4YTQsMHg4ZiwweDQwLDB4N2IsMHg4MywweGYxLDB4MmMsMHhlMCwweDNjLDB4N2QsMHgyOCwweDdhLDB4NzAsCi0gIDB4MmQsMHg2ZCwweDMxLDB4MDAsMHhkNywweDdmLDB4YjQsMHgzYiwweDEyLDB4MjcsMHg3OSwweGJkLDB4NDEsMHg4MSwweGVlLDB4MjgsCi0gIDB4ZmIsMHg0NywweGM5LDB4NTQsMHgzNSwweDAzLDB4MjcsMHhmNCwweDQ1LDB4MTQsMHg0YywweGIzLDB4MDAsMHgzNywweDllLDB4ZDEsCi0gIDB4NmUsMHg2OSwweDczLDB4YWUsMHg0ZiwweGRmLDB4OTAsMHg5MiwweDhlLDB4NTIsMHhiMCwweDQ3LDB4ZmYsMHhlYiwweGQ0LDB4MmMsCi0gIDB4MDYsMHg0ZSwweGU5LDB4MGYsMHg1MiwweGZiLDB4NjAsMHg4MywweGEyLDB4N2IsMHhmZSwweGE1LDB4YWIsMHgxYiwweDZkLDB4MjYsCi0gIDB4YTcsMHhmNCwweDViLDB4NTMsMHhkNSwweDQ3LDB4YTMsMHgyNiwweDkwLDB4MTgsMHhlOCwweGQzLDB4YWYsMHhhMiwweDJkLDB4ZDMsCi0gIDB4MmMsMHg1MCwweDQ0LDB4NWMsMHg3ZiwweGYzLDB4ZmEsMHhiZCwweDcwLDB4ZDQsMHhmYSwweDQ3LDB4MGEsMHgwMywweDMxLDB4YmQsCi0gIDB4ODMsMHg1ZSwweDFmLDB4MWEsMHg3MiwweGY1LDB4MGMsMHgxNCwweGUzLDB4ZGMsMHhmYSwweDQxLDB4MmEsMHhmNCwweGQwLDB4MjcsCi0gIDB4MDYsMHg2YywweGIzLDB4MjMsMHgxZCwweGE2LDB4YTAsMHg0ZiwweGJkLDB4Y2EsMHgzNCwweDQ0LDB4YWIsMHgxOCwweDIwLDB4YWUsCi0gIDB4ZmYsMHg5NCwweDRlLDB4ZTMsMHhiZCwweGE0LDB4NTcsMHg5ZiwweDk5LDB4NGEsMHg2YywweDAzLDB4MDYsMHgyYSwweDUyLDB4YzksCi0gIDB4NmQsMHhjYywweGZlLDB4ZTgsMHhlYiwweDUzLDB4ZDIsMHgzNiwweGE5LDB4YzEsMHgwNCwweGM0LDB4YmQsMHg3YSwweGJiLDB4YjYsCi0gIDB4MjgsMHg4ZCwweDU2LDB4YzEsMHgxYSwweGMwLDB4NDUsMHg2OSwweDAwLDB4ZjUsMHhjMSwweDA2LDB4NDgsMHg3MiwweDIwLDB4NmQsCi0gIDB4MDEsMHg3NywweDNjLDB4ZWQsMHgxZCwweDQ0LDB4MWQsMHg5NiwweDliLDB4MjMsMHg1NSwweDc0LDB4ZmQsMHhlOCwweGY0LDB4YTEsCi0gIDB4YWMsMHg5MCwweDExLDB4MDcsMHg1NCwweDEzLDB4MTAsMHg2ZSwweDdlLDB4NTYsMHhlNiwweGY1LDB4NjcsMHhlOCwweGZhLDB4YTksCi0gIDB4NjIsMHhhYiwweDJiLDB4MjcsMHhhYiwweDE5LDB4NTksMHhlMSwweDgwLDB4NmUsMHgwMiwweGJlLDB4N2YsMHg0NiwweGNhLDB4OGUsCi0gIDB4YWMsMHg1ZCwweGIwLDB4NGUsMHg3ZSwweDg0LDB4NWEsMHg5YiwweDVjLDB4NTYsMHhhNSwweGY2LDB4ODcsMHg4MiwweDNjLDB4MzUsCi0gIDB4M2IsMHg3MiwweDMyLDB4OGEsMHhiMiwweGM0LDB4MDAsMHhjMCwweGNkLDB4NGYsMHgxNSwweGNhLDB4OGUsMHhhZCwweDRkLDB4MjcsCi0gIDB4NjUsMHhkYywweDgxLDB4YjIsMHhjNSwweGI1LDB4NmEsMHgzMiwweDI2LDB4MTksMHgyMCwweDRkLDB4NDEsMHgwNiwweDBjLDB4MjAsCi0gIDB4NGIsMHhjZSwweGVjLDB4YjAsMHg4ZiwweGE2LDB4MjksMHgwYSwweGM2LDB4ODgsMHgzMiwweGNlLDB4MGMsMHhiMywweDM2LDB4ODYsCi0gIDB4MDksMHgzNCwweDAxLDB4YjgsMHg4MCwweDFiLDB4NGYsMHhhNCwweDkxLDB4OTAsMHg2MSwweGI1LDB4NjcsMHg3NywweDI0LDB4MDIsCi0gIDB4ODQsMHhlNSwweGIxLDB4OTIsMHg1ZCwweDUwLDB4NjEsMHgwMSwweDZlLDB4M2MsMHg1ZCwweGRhLDB4MzQsMHgxZCwweDUxLDB4NmIsCi0gIDB4MWYsMHg0ZCwweDEwLDB4ODksMHg4MSwweDk5LDB4MzAsMHg4YiwweGQ4LDB4ZjYsMHhjNywweDA1LDB4ZWUsMHhmZCwweDhlLDB4NmEsCi0gIDB4ZTYsMHgzNiwweDExLDB4Y2QsMHg5MywweDI4LDB4MDUsMHg2OCwweDMxLDB4NDgsMHhjNSwweGE4LDB4OGUsMHhmYiwweGUwLDB4MmEsCi0gIDB4NjYsMHg3ZiwweDU0LDB4MzAsMHgwMSwweDNmLDB4N2UsMHhjYiwweDY4LDB4MTAsMHg4MiwweDE5LDB4ZTgsMHhhMCwweGNmLDB4MTMsCi0gIDB4NGUsMHhhMywweDE0LDB4N2QsMHhiMCwweDk0LDB4MjIsMHhhOCwweDBjLDB4NjAsMHgwYSwweGRjLDB4MGYsMHgzNiwweGZiLDB4NmIsCi0gIDB4ZjQsMHhhOSwweDk5LDB4MGYsMHgzMSwweDJkLDB4ZGEsMHgwYiwweGJiLDB4ZTAsMHgxNiwweGE4LDB4ODQsMHg4OCwweDA2LDB4MjcsCi0gIDB4NjAsMHgwZSwweDAzLDB4Y2MsMHgyMiwweDcxLDB4ZmQsMHg3MywweGYzLDB4YjUsMHg1NSwweGQ5LDB4YmEsMHhjMiwweGFlLDB4NTEsCi0gIDB4NDQsMHg4MSwweDU2LDB4OTcsMHg0OCwweDUwLDB4ZDAsMHhiZSwweDJhLDB4YmIsMHgyNiwweDgxLDB4OGYsMHhkYSwweDgwLDB4ZWYsCi0gIDB4ZGYsMHgyNCwweDZkLDB4MWEsMHhmOSwweDQ2LDB4N2EsMHhmZCwweDkwLDB4ZDQsMHg4NCwweGVmLDB4NjMsMHg2MCwweDQ3LDB4ZjIsCi0gIDB4MDcsMHg2NiwweGNiLDB4OGUsMHhlNCwweDhmLDB4OTEsMHgwNSwweDg4LDB4MzAsMHgxZSwweDgzLDB4ZmEsMHg2YiwweDI2LDB4MTksCi0gIDB4Y2MsMHg0NiwweGIyLDB4NzQsMHgzYywweDczLDB4Y2MsMHhmMSwweDE0LDB4YjAsMHgzNSwweDFlLDB4ZTEsMHg3ZSwweDNiLDB4ZjUsCi0gIDB4NzgsMHgwYSwweDc3LDB4ZDMsMHhkZiwweGFiLDB4ZDMsMHhkYywweGM4LDB4ZTIsMHg0MywweDc4LDB4NjMsMHgzYywweDk1LDB4ZWYsCi0gIDB4NmUsMHg4OCwweDkzLDB4N2UsMHgxYiwweDcwLDB4ZGQsMHhkMSwweDVmLDB4NjYsMHhlMywweDZiLDB4ZjEsMHgzYSwweDg0LDB4MzUsCi0gIDB4ZTksMHhlYiwweDA2LDB4OTAsMHgzYSwweGJiLDB4YjIsMHhiMCwweDE2LDB4MjcsMHgyMSwweGE5LDB4NzUsMHg2NSwweGQzLDB4MTQsCi0gIDB4YTAsMHgyNCwweGJmLDB4MWUsMHhlNCwweDg2LDB4ODgsMHhhYywweDBkLDB4MmEsMHg2YSwweDVlLDB4NmUsMHhjOCwweGM4LDB4NTksCi0gIDB4YmEsMHgzNiwweDFmLDB4OTEsMHg1MSwweGE2LDB4MzksMHgzYiwweDk4LDB4NTAsMHgyNSwweGI5LDB4NjEsMHhiNSwweDljLDB4ZGQsCi0gIDB4OWUsMHg1MCwweDFmLDB4ZTEsMHg4NywweDUzLDB4ODUsMHgyMywweDM5LDB4NmQsMHg1OCwweDZiLDB4NTYsMHhhYSwweDUwLDB4ODQsCi0gIDB4NjgsMHhjMywweDRhLDB4MzMsMHhhZSwweDhhLDB4NTMsMHhiMCwweDlmLDB4MDEsMHhkNSwweDZhLDB4ZTEsMHhmYiwweGM3LDB4MmEsCi0gIDB4ZWEsMHhkMCwweGFlLDB4ZTIsMHhiZCwweGU5LDB4ZDQsMHhhYSwweDI4LDB4ZGQsMHgxNiwweDBmLDB4MmYsMHg0YSwweDU3LDB4MzMsCi0gIDB4NzAsMHhhMiwweGM4LDB4YzAsMHhkYywweDNhLDB4MDMsMHg3YywweDhmLDB4MWYsMHg0ZiwweGE1LDB4YjQsMHhhNSwweGJkLDB4YWYsCi0gIDB4NjAsMHhlZSwweGZlLDB4NjgsMHgwZiwweGRkLDB4ZmQsMHg2NywweDMxLDB4NzAsMHhhYSwweGYwLDB4YTAsMHhkOSwweDcyLDB4OGEsCi0gIDB4NTAsMHhjMCwweGNmLDB4ZmYsMHhmNCwweDk1LDB4OTksMHhkZiwweDE0LDB4NWUsMHhkOSwweDdiLDB4NTMsMHhlNSwweDhkLDB4MGMsCi0gIDB4YmMsMHhiYywweGY3LDB4YTYsMHgxNSwweGQzLDB4NTcsMHhhZiwweDNjLDB4YmUsMHhmMywweDk1LDB4MzksMHgzZiwweGE5LDB4OWMsCi0gIDB4OWUsMHg1OSwweDc5LDB4ODIsMHg4MSwweDFiLDB4ZjgsMHhmMSwweDJjLDB4ZmIsMHhjZSwweGRkLDB4NTcsMHhmZSwweGVkLDB4ZDAsCi0gIDB4MjcsMHgxZiwweDVjLDB4NjgsMHg2MywweGUwLDB4YzAsMHgyNywweGU3LDB4MmUsMHgyYywweGJiLDB4N2MsMHhjZiwweDdiLDB4NGYsCi0gIDB4NWMsMHg5OSwweGI4LDB4NzQsMHg2MSwweGQ5LDB4YjcsMHhlZiwweGI5LDB4YzIsMHhjMCwweDI1LDB4ZjgsMHg1ZiwweDdjLDB4OTYsCi0gIDB4M2YsMHg1ZCwweDM5LDB4MzcsMHhiMywweGEyLDB4YjAsMHhiMywweGZmLDB4YmEsMHgwYiwweDMzLDB4N2UsMHhkNCwweDcxLDB4YTUsCi0gIDB4ZjAsMHg1OSwweGZmLDB4ZjIsMHhlZiwweGFmLDB4ZjgsMHhjZSwweDNiLDB4MmIsMHgwYSwweDRmLDB4NWQsMHg2YSwweGJiLDB4YjIsCi0gIDB4ZTIsMHhmYSwweDc3LDB4NTYsMHg3YywweGYyLDB4ZDQsMHgwNCwweGRmLDB4YmYsMHhlZCwweGRiLDB4NzcsMHhiZiwweGY3LDB4YzQsCi0gIDB4ODEsMHg4OSwweDBmLDB4ZGMsMHg2MSwweDk4LDB4MDMsMHg5YiwweDM4LDB4NDcsMHhmYiwweGRmLDB4ZmQsMHg5ZSwweDMxLDB4NDIsCi0gIDB4YmUsMHg3ZiwweGQzLDB4ZWMsMHg5ZSwweGY3LDB4NzYsMHhkZSwweDNhLDB4YjEsMHhlMywweGRlLDB4NjUsMHhlYywweDBmLDB4NWYsCi0gIDB4OTgsMHhmOCwweGUwLDB4MzQsMHgwNSwweGVmLDB4ZDYsMHgxZCwweGM4LDB4N2YsMHg3MCwweGExLDB4MjksMHg2NSwweDgwLDB4YjMsCi0gIDB4N2YsMHgyNywweDBjLDB4NjgsMHg3MCwweDQwLDB4ZGIsMHhhMywweDVjLDB4YWYsMHg1NCwweDE3LDB4MjksMHgzZiwweGRjLDB4MDMsCi0gIDB4OGIsMHg3MSwweGU1LDB4OWIsMHg5MSwweDAxLDB4YWQsMHg1ZSwweGI5LDB4M2UsMHg1MSwweDM5LDB4MWEsMHgxOSwweDY4LDB4ZGYsCi0gIDB4YzMsMHgwMCwweDNmLDB4OWYsMHhkOCwweGUyLDB4ODcsMHhiOSwweDIzLDB4ZDcsMHhjZCwweGE3LDB4NjAsMHg4ZCwweDkyLDB4NjQsCi0gIDB4ZmMsMHhmMCwweDE0LDB4YTMsMHg4NSwweDE2LDB4NTEsMHg1NCwweDg0LDB4ZjksMHhlNywweGY4LDB4YTEsMHhjZSwweGQxLDB4NDIsCi0gIDB4YjUsMHgzNiwweDY1LDB4MTMsMHhjNSwweDE0LDB4MjYsMHhjMiwweDgwLDB4MGMsMHg5MiwweDE2LDB4Y2YsMHgzOSwweGI0LDB4Y2QsCi0gIDB4MDEsMHhkYiwweGRjLDB4MTYsMHhmNywweDIzLDB4NzcsMHg2ZSwweGE5LDB4OGMsMHgwZCwweDc2LDB4MjAsMHgxOCwweGViLDB4NWMsCi0gIDB4ODAsMHhlYSwweGYzLDB4NzcsMHhhOCwweGYxLDB4MzEsMHhiYywweDA1LDB4ZDUsMHgxMywweDEzLDB4ODAsMHgwMSwweDhhLDB4YzIsCi0gIDB4ZjUsMHgzNywweGIyLDB4M2QsMHg1MSwweDIyLDB4MzksMHhjYSwweGJhLDB4YzQsMHhlYiwweDViLDB4NDAsMHgxNiwweGFlLDB4MGYsCi0gIDB4ZDQsMHhkZSwweGQxLDB4YzcsMHg2YSwweDEzLDB4ZTUsMHg4NywweDFiLDB4MTksMHgzZiwweDU0LDB4OTUsMHhkZCwweDc4LDB4MGUsCi0gIDB4MDMsMHg1YiwweDk1LDB4M2QsMHg5OCwweDNkLDB4YWEsMHgxOSwweDVkLDB4NzgsMHg0NywweGJiLDB4MTksMHhhZiwweGNjLDB4Y2QsCi0gIDB4MWMsMHhlZSwweDdhLDB4MmQsMHg3ZSwweDAzLDB4ZmUsMHg0NiwweGFlLDB4NzYsMHhiOCwweGYzLDB4YjksMHhmOCwweDNjLDB4ZGMsCi0gIDB4NTMsMHhiNCwweGMwLDB4NGEsMHg2MiwweDAwLDB4NmUsMHhmNCwweGM1LDB4MTksMHg1MCwweDA3LDB4ODksMHhlMywweGQyLDB4MmUsCi0gIDB4YTgsMHhhMSwweDQ2LDB4MmIsMHg3MSwweDFjLDB4OWMsMHhkZCwweGM2LDB4MDAsMHgyOCwweGMxLDB4ODAsMHhlNiwweGZlLDB4NDEsCi0gIDB4MzEsMHg0NiwweGRmLDB4NjQsMHhlOSwweDliLDB4NzEsMHgyZiwweGIwLDB4MzMsMHgzYSwweGVjLDB4NGQsMHgxNCwweDI5LDB4ZDAsCi0gIDB4ODksMHg2MiwweGI0LDB4MDUsMHhjZCwweDM0LDB4NWYsMHg5YSwweDM1LDB4ZTQsMHhiYSwweDhmLDB4ZTQsMHg2MiwweDRmLDB4YTQsCi0gIDB4MTYsMHg4OCwweGEyLDB4NjIsMHhmMywweDRkLDB4NTUsMHhiMSwweDVlLDB4MzAsMHhmMywweGUyLDB4MmIsMHgyNywweGQ3LDB4NWYsCi0gIDB4YzMsMHhiYSwweDY5LDB4MmQsMHg5OSwweGExLDB4NGYsMHg1MSwweDhiLDB4OGYsMHg4OCwweGQ1LDB4MTIsMHg3NywweDgxLDB4ZDMsCi0gIDB4NWYsMHg0MSwweDVhLDB4NDQsMHg4NywweGRkLDB4MzAsMHg5NywweGQ5LDB4MmMsMHgxMywweDU0LDB4MzIsMHg5MCwweDMyLDB4MDAsCi0gIDB4NTgsMHgyZCwweDgzLDB4Y2UsMHhmMCwweDM1LDB4YzYsMHgwZiwweDI5LDB4MjksMHg2YSwweDVmLDB4NDUsMHhmNywweDNiLDB4OWIsCi0gIDB4MTYsMHg1MiwweGIwLDB4YzMsMHhlMSwweDg3LDB4MGMsMHhiOCwweGZiLDB4MjksMHhiYiwweDczLDB4M2YsMHgzZiwweDVjLDB4NjAsCi0gIDB4MDEsMHhjZCwweDY5LDB4NzEsMHhhZSwweDRmLDB4ZWYsMHgyOSwweDZkLDB4YjEsMHgzNSwweDFiLDB4MWMsMHg2NiwweGQ5LDB4M2MsCi0gIDB4NGQsMHg2MCwweGI1LDB4YjgsMHg3YywweDgzLDB4OGQsMHhjNywweGUwLDB4NmYsMHg3NCwweDc3LDB4YjYsMHg0MCwweDljLDB4ODIsCi0gIDB4MTEsMHgxYiwweDk4LDB4MmQsMHgyZSwweDNmLDB4ZDQsMHg5MCwweDlmLDB4MWYsMHgzMiwweDUwLDB4MmYsMHhiNCwweGI4LDB4ZWIsCi0gIDB4MjEsMHg4YiwweGVjLDB4ZWIsMHgwMywweDdmLDB4N2QsMHhiYSwweGFkLDB4MGIsMHhkNywweGU3LDB4ZTYsMHg0NywweGMzLDB4NTksCi0gIDB4OTQsMHg4MCwweDJlLDB4NGEsMHhmZCwweDJkLDB4MTAsMHhhNywweDAwLDB4M2EsMHgwZCwweDMwLDB4YzcsMHg2YSwweGM5LDB4MzgsCi0gIDB4ZTMsMHhlOSwweGExLDB4ZWIsMHhiNiwweDlkLDB4ZDQsMHhlYiwweDUyLDB4OGEsMHgzZSwweDFkLDB4OWIsMHg4OSwweDQyLDB4ZjksCi0gIDB4MjEsMHg2MiwweDJkLDB4MjIsMHg3MCwweDk3LDB4NGYsMHgwZiwweDBiLDB4MjksMHhhMSwweGJmLDB4YjksMHgyOSwweDYxLDB4MTAsCi0gIDB4YmEsMHg1ZSwweDhjLDB4NzcsMHhhNSwweDljLDB4ZjksMHhkMiwweDI0LDB4MTksMHhmYywweDUwLDB4ZWUsMHgwNCwweDZlLDB4M2MsCi0gIDB4ZWIsMHgyOSwweDFiLDB4Y2MsMHhlYiwweGQ3LDB4NjUsMHg2MSwweDNkLDB4MjUsMHg4YSwweGJmLDB4MzYsMHg2OCwweGExLDB4YzMsCi0gIDB4MGYsMHg5MSwweGNkLDB4MGYsMHhkZCwweGZkLDB4MWQsMHg3NSwweGUzLDB4Y2QsMHg5NCwweGE0LDB4NmQsMHg0OCwweGM1LDB4OGYsCi0gIDB4MWEsMHhlMCwweDhlLDB4MjAsMHhjMCwweGZkLDB4NWUsMHhhOCwweDNiLDB4YjIsMHg5OSwweGVjLDB4ZDEsMHhhZiwweDRmLDB4NTUsCi0gIDB4MWUsMHgzNSwweGMwLDB4YWQsMHgyNiwweGE4LDB4NzcsMHg1YiwweGFlLDB4NGYsMHg3MSwweGZiLDB4N2IsMHhkNiwweGU2LDB4ODcsCi0gIDB4MjksMHg4YiwweDFmLDB4YWUsMHgzMSwweDY5LDB4ZTcsMHgwZSwweDdkLDB4ODMsMHgwOSwweGQ4LDB4NTcsMHg4OSwweGMzLDB4ZGMsCi0gIDB4ZmEsMHhhOSwweDQ1LDB4MDYsMHgzZiwweGE0LDB4YmIsMHgyNywweGI1LDB4MzYsMHgyYiwweGQ0LDB4OTksMHhjYywweDEwLDB4Y2QsCi0gIDB4YTEsMHgzZiwweDUzLDB4NmQsMHgwZiwweDJlLDB4MTgsMHhmNiwweDQ3LDB4NjEsMHhmYywweGQwLDB4NWQsMHgzZiwweDczLDB4MjksCi0gIDB4MmQsMHg0YywweGU5LDB4MTUsMHhiYiwweGUxLDB4NDcsMHgxNCwweDVjLDB4NDMsMHhmOSwweDIxLDB4NjIsMHg0NCwweDUxLDB4YjYsCi0gIDB4NDEsMHg4YSwweDAxLDB4YjcsMHgzZiwweGU1LDB4ZjMsMHg3OCwweDJiLDB4YWEsMHg4MSwweDhlLDB4NDEsMHgxOCwweGNlLDB4MmYsCi0gIDB4NDEsMHhiMywweGExLDB4ODMsMHhjNCwweGM3LDB4NjksMHhjYiwweDZjLDB4YjgsMHg4MywweDAzLDB4ZGMsMHg3YSwweDQ2LDB4YWIsCi0gIDB4NDEsMHg2NywweGZjLDB4NzAsMHgyNSwweGVjLDB4MjQsMHgyYSwweGI5LDB4M2EsMHgxZCwweDYxLDB4YjQsMHhiMCwweDlmLDB4ZDEsCi0gIDB4YzIsMHgxZSwweGI0LDB4ZDMsMHgyNiwweDhhLDB4ZGMsMHg3OCwweGU4LDB4ZmEsMHg1MSwweDczLDB4YTksMHg2NiwweGNhLDB4MGYsCi0gIDB4YjcsMHhiMywweDY1LDB4MzMsMHhkYywweDJkLDB4ZjAsMHg0MywweDBiLDB4ZjAsMHhlYiwweDI3LDB4ODMsMHhiNSwweGI3LDB4MTIsCi0gIDB4MGIsMHhiYSwweDY0LDB4MjUsMHg4MiwweGIzLDB4MzksMHgyNSwweGRkLDB4MjUsMHhjNywweDIzLDB4NTgsMHhhMywweGNmLDB4N2QsCi0gIDB4YTcsMHgwMSwweDcyLDB4MDYsMHgwMCwweDZlLDB4N2UsMHhhOCwweDdkLDB4MmUsMHgyNiwweGQyLDB4ZjQsMHhjZCwweGUzLDB4MzEsCi0gIDB4NGEsMHg5MCwweDEyLDB4YzMsMHgyOCwweDg2LDB4M2EsMHgyMCwweDRiLDB4NjgsMHgwYiwweDA1LDB4NmEsMHhiNiwweDY4LDB4MDAsCi0gIDB4OGQsMHg5YiwweDFmLDB4MTksMHgxNCwweDkzLDB4MWYsMHg4MiwweDQ2LDB4ZGYsMHg0NiwweDAxLDB4MTksMHhmYywweDEwLDB4OTksCi0gIDB4NDQsMHg1MSwweGIzLDB4ZjksMHgyMSwweGNhLDB4YmEsMHhlMywweDY5LDB4OGMsMHgzMCwweDdlLDB4NTgsMHg0NSwweGEyLDB4OGQsCi0gIDB4OTQsMHg5MywweDM1LDB4MzYsMHhmMCwweGZjLDB4ZDAsMHgwNiwweGEwLDB4YjgsMHhmMywweGEzLDB4ZTUsMHgwZCwweDIzLDB4MTMsCi0gIDB4YjUsMHhlYywweDhmLDB4NjAsMHg3NiwweDFjLDB4ZTAsMHg0OCwweDgyLDB4YjQsMHhmZiwweDYwLDB4M2YsMHgzYywweDBkLDB4MTUsCi0gIDB4MWQsMHg3MiwweDYxLDB4NTAsMHhjNywweDRmLDB4YzMsMHg1ZiwweDk5LDB4ZjYsMHg0NywweDY2LDB4NjYsMHhhNywweGUwLDB4NTgsCi0gIDB4MjQsMHg2ZSwweDdlLDB4NzQsMHhiYywweGM0LDB4ZjgsMHhiZCwweDA4LDB4ZmIsMHhiZCwweDZhLDB4ZTQsMHgwZSwweGEyLDB4OGMsCi0gIDB4YzMsMHgxMiwweGI0LDB4MWQsMHgxOCwweDMwLDB4YmYsMHgyMiwweDljLDB4ZmQsMHhjOSwweGQyLDB4MWIsMHhmYywweDVhLDB4YjYsCi0gIDB4NjYsMHg2ZCwweGY0LDB4NDksMHhmOCwweGExLDB4OTksMHhlNiwweDE1LDB4YzMsMHgwOCwweDA1LDB4MzIsMHgwMywweDZmLDB4NTIsCi0gIDB4ODAsMHgxOSwweGUwLDB4ZDYsMHgzMywweGU1LDB4NmYsMHg4YiwweDhhLDB4ZDUsMHhkOSwweDI4LDB4YTMsMHg2ZCwweGYzLDB4YjUsCi0gIDB4NmEsMHgyZCwweDlhLDB4ODAsMHg1MSwweDRhLDB4MmMsMHhlNSwweDJjLDB4MDUsMHhiZiwweGE2LDB4MmQsMHgzMSwweDA2LDB4MGUsCi0gIDB4NzMsMHhlMywweGU5LDB4NjAsMHhkNiwweDI2LDB4ZGQsMHg5ZCwweDgyLDB4ODcsMHgwZCwweDUwLDB4MTEsMHg4YiwweDliLDB4YTAsCi0gIDB4M2IsMHgxNiwweDdmLDB4Y2EsMHgwNiwweGJjLDB4ZmQsMHhkMSwweGEwLDB4ODksMHg1YSwweGU5LDB4MDgsMHhmNiwweDlhLDB4NzAsCi0gIDB4MTEsMHhiOCwweGViLDB4YTcsMHhjNywweGU2LDB4ODcsMHhmOSwweDRlLDB4Y2EsMHgwNiwweDcxLDB4NDUsMHg0MywweDdjLDB4YTgsCi0gIDB4ZDMsMHhhMiwweDg1LDB4YmIsMHhiMSwweDhmLDB4MWYsMHg1MiwweGZiLDB4ZDMsMHhiOSwweDM2LDB4OWUsMHhlYywweGVjLDB4NmEsCi0gIDB4NTcsMHg5NCwweGZlLDB4NmMsMHgzYywweDgxLDB4MjUsMHgxNCwweGQ3LDB4M2EsMHhiMywweDRhLDB4MDIsMHg5YiwweDg2LDB4ODgsCi0gIDB4YjYsMHg3NCwweGQxLDB4MTYsMHg3NywweDNjLDB4OTgsMHgyZCwweDQwLDB4NDcsMHg3NywweDUwLDB4MDYsMHhiYiwweGU4LDB4OTIsCi0gIDB4MDQsMHg3MywweDZkLDB4MjIsMHgwNywweGI4LDB4OGYsMHgwYiwweDYwLDB4NDYsMHgwYiwweDgxLDB4ZjIsMHg0MywweGE4LDB4MDIsCi0gIDB4YzYsMHgwNiwweGExLDB4OTksMHhiNSwweGU0LDB4MTgsMHhlOCwweDc0LDB4MTgsMHgyMywweDM1LDB4N2UsMHhjZSwweDc4LDB4ZWUsCi0gIDB4OGEsMHhhZSwweGQxLDB4ZjIsMHhjNywweDFiLDB4NmUsMHg4MSwweGJiLDB4MjIsMHg3NSwweGRhLDB4MDksMHgwYSwweGFhLDB4ZWYsCi0gIDB4NDIsMHg2YiwweDI4LDB4OTgsMHg0ZiwweDQxLDB4OTQsMHg4MSwweDQ1LDB4YjcsMHg3MCwweGY2LDB4ODcsMHhkZSwweGFmLDB4YjYsCi0gIDB4YTUsMHhiZCwweGJlLDB4NzAsMHg0NywweDYzLDB4ZmMsMHhhZCwweDRlLDB4OTcsMHgwNiwweDUwLDB4YjAsMHg4MSwweDAyLDB4NzAsCi0gIDB4ZjgsMHg4MCwweGJiLDB4YTIsMHg2ZiwweGI0LDB4ZjksMHhlMSwweGY0LDB4OTUsMHgyYiwweDE5LDB4M2YsMHhmYywweGM5LDB4N2QsCi0gIDB4MzcsMHgxYSwweGZjLDB4NzAsMHhhZiwweGMxLDB4MGYsMHg3ZiwweGMzLDB4YzAsMHg4YSwweGZmLDB4NjksMHhkZiwweGZlLDB4NTEsCi0gIDB4MTAsMHg4NiwweGExLDB4MzgsMHg4ZSwweDQ3LDB4ZmMsMHg4MywweDgzLDB4OWIsMHhiYiwweDhiLDB4MWUsMHgyMCwweGNlLDB4MWQsCi0gIDB4MmEsMHgzOCwweGI5LDB4ZDQsMHhkZCwweGJiLDB4NjgsMHgzZCwweDgyLDB4NzgsMHgwMSwweDNkLDB4OGQsMHgxNywweDEwLDB4NWMsCi0gIDB4NDUsMHg3MCwweGQwLDB4YmQsMHgyMCwweDBlLDB4NTIsMHhmYiwweDVlLDB4NWIsMHg2ZCwweDFkLDB4MGEsMHhlZCwweGEwLDB4MjAsCi0gIDB4ZGYsMHhjZiwweGQyLDB4MTAsMHg5MiwweGYwLDB4OTYsMHhjMCwweGVmLDB4NTEsMHg5MiwweGE5LDB4ZGYsMHhiOCwweDY5LDB4M2UsCi0gIDB4NzQsMHhmYywweGE5LDB4ZTQsMHhjMywweGYwLDB4ZTEsMHg2YSwweDMwLDB4MGIsMHhlMiwweDdjLDB4YjgsMHgwZiwweDgzLDB4MzAsCi0gIDB4OTcsMHhjNywweGNhLDB4ZDIsMHg1OCwweDc4LDB4NWQsMHg0NSwweGM3LDB4ZGUsMHg5MywweGEwLDB4MzgsMHhkOCwweDRjLDB4NjQsCi0gIDB4YTAsMHhmOSwweDUwLDB4NjcsMHhlNiwweGQ5LDB4ZjUsMHgxYSwweDBiLDB4NmYsMHg2NywweDI5LDB4MjMsMHgwZCwweDhhLDB4YmUsCi0gIDB4MGUsMHhlMiwweDdjLDB4MjgsMHgzMywweGI5LDB4YmMsMHhlYSwweGE0LDB4ZjksMHhiMCwweGRmLDB4ZjMsMHg4ZSwweGViLDB4YTEsCi0gIDB4YWMsMHg1ZiwweDc4LDB4YmIsMHhhZSwweDZjLDB4N2MsMHg0NSwweGNkLDB4ZWEsMHhkNSwweGRiLDB4YTgsMHhjNSwweDhhLDB4YWUsCi0gIDB4NzUsMHhmNCwweDFkLDB4NzcsMHhhYSwweDlmLDB4MDIsMHgwMCwweDAwLDB4MDAsMHhlMCwweGRmLDB4NjksMHhlZiwweGQwLDB4YTAsCi0gIDB4NzcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDUwLDB4NGMsMHg3YiwweDg3LDB4MTYsMHhiZCwweDAzLDB4MDAsMHgwMCwweDAwLDB4ODAsCi0gIDB4NjIsMHhkYSwweDNiLDB4YjQsMHhiNSwweDc3LDB4ZjgsMHg3NSwweDI5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhiZSwweGM4LDB4Y2EsCi0gIDB4ZmIsMHgzOCwweDczLDB4YjgsMHg1OCwweGIzLDB4OTQsMHg1NywweDJiLDB4NzUsMHg2YiwweDQ2LDB4YTUsMHhmZiwweDI3LDB4MjQsCi0gIDB4N2IsMHg5YiwweGQ2LDB4NmMsMHg2YiwweGVmLDB4MzMsMHg0ZiwweGIzLDB4Y2YsMHg3NSwweDRmLDB4YWEsMHg3NSwweGYwLDB4YzUsCi0gIDB4ZjEsMHgzMywweDAxLDB4MDAsCisgIDB4MWYsMHg4YiwweDA4LDB4MDgsMHgwNCwweDQ0LDB4OWYsMHg0NiwweDAwLDB4MDMsMHg3MCwweDZjLDB4NzUsMHgzNCwweDMwLDB4MzUsCisgIDB4NWYsMHgzMSwweDVmLDB4MzEsMHgyZSwweDYyLDB4NjksMHg3NCwweDAwLDB4OTQsMHg5YSwweDBmLDB4NzAsMHgxNCwweDU1LDB4OWUsCisgIDB4YzcsMHg3ZiwweGZkLDB4YmEsMHg5MywweDc0LDB4YTYsMHgzYiwweGU5LDB4MzYsMHg3ZiwweDMwLDB4YjcsMHgwOCwweGQ3LDB4MTksCisgIDB4MDcsMHg3NiwweGM0LDB4NjEsMHgxOCwweDQyLDB4ODAsMHg5OCwweDBkLDB4NDksMHgzMywweGE0LDB4YWMsMHg3MSwweGM5LDB4MWUsCisgIDB4ZjEsMHhjZSwweGJiLDB4ZTIsMHhmNiwweGJjLDB4ZGQsMHgxMSwweDcxLDB4OGYsMHhiYiwweGUyLDB4MmMsMHhkNiwweGRkLDB4YjMsCisgIDB4YjgsMHgzYiwweDRiLDB4NWYsMHg2NiwweGEyLDB4MDQsMHg5MiwweDkyLDB4MDEsMHgzOSwweDM3LDB4YmEsMHhhYywweDM1LDB4NDAsCisgIDB4NmUsMHg4ZCwweDRhLDB4NTksMHgxMSwweDc1LDB4OGQsMHg4MiwweGJiLDB4NGQsMHgwYywweDNhLDB4NjAsMHhkNCwweGI5LDB4OTQsCisgIDB4N2IsMHg4YiwweDdmLDB4OGUsMHg2ZCwweGQ4LDB4YzAsMHg0NiwweDg5LDB4M2EsMHhjYiwweGEyLDB4MDYsMHg2NSwweGNkLDB4YmQsCisgIDB4ZDcsMHgzZCwweGRkLDB4ZDMsMHg5OSwweDllLDB4MDQsMHgzNywweDVhLDB4YzUsMHgyZiwweGFmLDB4MWYsMHg4ZiwweGY3LDB4ZmIsCisgIDB4Y2QsMHhlZiwweGZkLDB4N2UsMHg5ZiwweGZlLDB4YmUsMHg4MSwweDUyLDB4MjksMHg2MywweGZlLDB4MDcsMHhjMCwweGRjLDB4MDYsCisgIDB4ZDIsMHg5NiwweGNkLDB4ZmYsMHg1NiwweDFmLDB4NWEsMHhmZSwweGZkLDB4YTUsMHhkZiwweDVmLDB4MWEsMHhiYywweGYzLDB4ZjYsCisgIDB4OGQsMHhiMCwweDAxLDB4ODQsMHhiYSwweDFmLDB4MmQsMHgwZiwweGRkLDB4ZjEsMHhlMywweDFmLDB4MmUsMHhhZCwweGFmLDB4ODcsCisgIDB4ZGIsMHhjOSwweDZmLDB4YTEsMHhkMCwweGNhLDB4MjUsMHhlNCwweGZmLDB4YTUsMHgzNywweGMwLDB4NDYsMHgyOCwweDVkLDB4NWEsCisgIDB4ZDcsMHhiOCwweGZjLDB4ODYsMHhjNiwweGE1LDB4MmIsMHhlMSwweDBlLDB4NjAsMHg5NiwweGY1LDB4NGQsMHg5MSwweDlmLDB4MjcsCisgIDB4MWYsMHhmOSwweGRiLDB4MWYsMHg4NCwweDAwLDB4MzMsMHgwMCwweDUwLDB4MTIsMHg2MiwweGEyLDB4ZjQsMHg0ZiwweDIxLDB4YzQsCisgIDB4MjgsMHgwYywweGUwLDB4OTYsMHhjNSwweDIxLDB4ZDAsMHhlOCwweGVmLDB4OTAsMHg3ZCwweDVlLDB4MWEsMHgwMiwweGM1LDB4ZjksCisgIDB4M2IsMHgxMywweDAyLDB4MTUsMHhkYSwweDQxLDB4ZWQsMHg4MSwweDBhLDB4MTksMHhhZSwweGY4LDB4YzMsMHhhOCwweDFjLDB4YjYsCisgIDB4ZWMsMHgzZiwweDczLDB4ZmUsMHhkNCwweDA5LDB4M2MsMHhlMywweGI0LDB4ZGMsMHg0ZiwweGNiLDB4ODUsMHhhNCwweDY1LDB4YTIsCisgIDB4ZDAsMHhkNywweDU5LDB4MWYsMHhlYywweGY1LDB4ZGYsMHhmZCwweDVhLDB4ZWIsMHg3ZiwweDY2LDB4YWQsMHhmZiwweGU3LDB4Y2UsCisgIDB4ODcsMHg4YSwweGFmLDB4MzEsMHgxZCwweDgwLDB4YjMsMHhmNywweDYzLDB4ODYsMHg4NywweDAzLDB4MDYsMHg0MywweDE0LDB4NjQsCisgIDB4MjgsMHhhNiwweDg2LDB4NDIsMHg0NiwweDEwLDB4ODAsMHg2OSwweDE4LDB4ZWIsMHgwZiwweDViLDB4ZjMsMHg4NywweDhhLDB4YmUsCisgIDB4ODIsMHgyOSwweGRjLDB4YTIsMHg4YSwweDFhLDB4NWIsMHg4ZiwweDc2LDB4ZTIsMHgxNiwweDVkLDB4NGEsMHhiMSwweDc1LDB4ZjAsCisgIDB4MTYsMHgzNSwweDI2LDB4NTksMHhlMywweDExLDB4MzUsMHgzMiwweGIwLDB4YzUsMHg5YSwweDVmLDB4ZjMsMHgzMSwweDFjLDB4YzYsCisgIDB4NGIsMHhhMiwweDkxLDB4MmUsMHg0ZiwweDMzLDB4YmMsMHgxNywweDBiLDB4ZWEsMHg0MiwweDE3LDB4ZGEsMHgwZiwweDRmLDB4NjEsCisgIDB4NjIsMHgwYywweDIyLDB4ZmEsMHhjOCwweDMwLDB4MzIsMHg5YywweDE1LDB4YzUsMHgxMywweDQ1LDB4M2QsMHhkYywweDAxLDB4MTAsCisgIDB4NTUsMHhiZiwweGVjLDB4ZTksMHg4NCwweDE4LDB4MDQsMHgzNCwweDQxLDB4YWUsMHg2OCwweDg1LDB4MzgsMHgzNSwweDQyLDB4NjgsCisgIDB4MDQsMHg5ZSwweDM1LDB4OGQsMHg0MywweDhjLDB4YjUsMHhiZSwweGM2LDB4MWQsMHg4NCwweGMzLDB4MTAsMHg4YywweDk2LDB4ZjYsCisgIDB4YzYsMHhiZSwweDg5LDB4MWUsMHg4NSwweGUwLDB4NTEsMHhhMSwweDE3LDB4ZmQsMHgxZSwweDllLDB4ODIsMHhhMCwweDI2LDB4MGMsCisgIDB4YTAsMHgwOSwweGZhLDB4ODgsMHgxOCwweGRlLDB4MGMsMHgxNywweGNkLDB4Y2UsMHg1ZiwweDdkLDB4ZDUsMHgwNCwweDljLDB4ODcsCisgIDB4ZTYsMHgwZCwweGEyLDB4Y2MsMHgyZSwweDE0LDB4NTMsMHhiYiwweDlhLDB4ZWYsMHgyOCwweGU5LDB4ODksMHg2ZiwweDgwLDB4ZDcsCisgIDB4YTEsMHg1OSwweDkzLDB4MDYsMHhkOCwweDA5LDB4ZjgsMHhkMiwweDM0LDB4ZDIsMHg5YywweGI1LDB4N2UsMHg5MiwweDM5LDB4MDIsCisgIDB4NTMsMHhkMCwweGI0LDB4YmEsMHgzYywweDczLDB4ZWQsMHgwOCwweDRjLDB4ZjEsMHhmNywweGE5LDB4MjUsMHgxYSwweDNiLDB4NDAsCisgIDB4NDYsMHg1YSwweDM0LDB4MjksMHhjMywweDVlLDB4YjYsMHg4YywweDcxLDB4YjAsMHhkNiwweGQ3LDB4ZTQsMHg4MywweDc0LDB4OTEsCisgIDB4YTgsMHhmOCwweDczLDB4NzYsMHg4MSwweDdhLDB4MDIsMHgzNSwweGFiLDB4NTIsMHg2MiwweGNkLDB4NTksMHg2YiwweDU5LDB4N2IsCisgIDB4ZmQsMHg4YiwweDljLDB4MTUsMHhkOSwweDkzLDB4NDUsMHgwMSwweDYzLDB4OTMsMHhmYywweDQxLDB4ZjYsMHg5ZiwweGEwLDB4M2IsCisgIDB4MTksMHg4YywweGZjLDB4NDMsMHgwNSwweDdhLDB4NGQsMHgzYiwweDZjLDB4ZWQsMHhmZiwweGJjLDB4NjksMHg1YywweDIwLDB4ZDksCisgIDB4NmYsMHhmZSwweGE0LDB4YjgsMHgzNiwweDFhLDB4MDQsMHg1OCwweGM0LDB4ZGQsMHgwNSwweDM4LDB4Y2UsMHgwNCwweDQ2LDB4MDUsCisgIDB4NDAsMHg0NywweGFkLDB4YjAsMHhkOCwweGYxLDB4OTksMHgyNCwweDY3LDB4YzUsMHhmYywweGM5LDB4YzgsMHhkZiwweDgzLDB4MTcsCisgIDB4ZjAsMHhlMiwweGE4LDB4ZmYsMHg5ZiwweGQxLDB4NzcsMHg2MSwweDViLDB4YzcsMHg2MiwweDVkLDB4ODgsMHhhMCwweDc3LDB4ZTksCisgIDB4ODgsMHgyZSwweDZjLDB4NDUsMHhhNywweGUwLDB4NzEsMHhkMywweGY4LDB4Y2EsMHg1ZSwweDNmLDB4YzIsMHhiNywweGMxLDB4MWYsCisgIDB4YTEsMHg0OSwweDJkLDB4NjcsMHgxZSwweDgyLDB4ZDgsMHgxMCwweDM0LDB4OTEsMHhkNSwweDU4LDB4OGQsMHg4ZSwweDY4LDB4NTIsCisgIDB4ODgsMHgxZCwweDMxLDB4OGQsMHhhNSwweGVjLDB4MjgsMHhiMiwweDEyLDB4NDksMHhhZCwweGE2LDB4ZjEsMHg2OSwweDUxLDB4YTUsCisgIDB4OWIsMHhkOSwweDBjLDB4NTksMHg4NiwweDQ0LDB4MjMsMHhjZCwweDRlLDB4YWEsMHhmOSwweGYxLDB4NDksMHgxNywweDViLDB4ZjEsCisgIDB4ZTEsMHgzOSwweDIzLDB4M2UsMHgyOSwweDMxLDB4YzYsMHhmYSwweGIwLDB4MTYsMHhhOSwweGQzLDB4MjQsMHhjYywweDdhLDB4NWQsCisgIDB4ZjEsMHhmZiwweGQwLDB4Y2UsMHg5ZiwweDU0LDB4Y2QsMHg1ZSwweDc4LDB4MDEsMHgwMiwweDYxLDB4M2UsMHhiNCwweDViLDB4NTQsCisgIDB4ZWUsMHg2NywweDZhLDB4MzUsMHg0MSwweDBkLDB4Y2IsMHhiMCwweDBkLDB4MTYsMHg2YiwweGMyLDB4MTYsMHhmNCwweDNlLDB4NzksCisgIDB4NjQsMHgxOCwweDE3LDB4ZWMsMHhjZiwweDU3LDB4ODEsMHhjNywweDBjLDB4ZWYsMHhmOCwweDRkLDB4OWUsMHgwYSwweDc4LDB4MDAsCisgIDB4ZDcsMHhlYSwweDgyLDB4MWUsMHg1YiwweDAxLDB4ZGIsMHgyYywweDdmLDB4YjMsMHg4ZSwweGViLDB4NzYsMHg2NiwweDZmLDB4ZTIsCisgIDB4N2EsMHg2OCwweGQwLDB4NDYsMHhmYiwweDE1LDB4NTQsMHg5NiwweDg4LDB4NDcsMHhmNCwweDMxLDB4YTEsMHg3ZSwweDdmLDB4MTksCisgIDB4Y2UsMHhjZiwweGI3LDB4NTEsMHgzYiwweDNmLDB4YzcsMHhhYiwweGM3LDB4ZTEsMHgwYiwweDY4LDB4YzEsMHg2MiwweDkyLDB4YmQsCisgIDB4YTEsMHhmOCwweDQ0LDB4YTQsMHgwZSwweDRiLDB4M2EsMHg2YSwweDQ0LDB4MjcsMHhhMCwweDE5LDB4NGIsMHg0OSwweDk2LDB4M2UsCisgIDB4MzIsMHg4YywweDJmLDB4ZWMsMHhmZCwweDQ0LDB4OTgsMHgyNCwweDRjLDB4NDIsMHgzMywweDQ4LDB4YmMsMHg3MCwweDVhLDB4OWQsCisgIDB4NTQsMHg4OSwweDgxLDB4NTksMHg1ZCwweDM1LDB4NDYsMHg4OCwweDAxLDB4NTksMHg2MywweDE0LDB4YWMsMHhmNSwweDc5LDB4YjksCisgIDB4MGYsMHgyZSwweDkxLDB4ZjgsMHg4YiwweGNmLDB4NTUsMHgyZSwweDBjLDB4YmYsMHgwZSwweDc1LDB4YWEsMHhiNCwweGJiLDB4NjQsCisgIDB4NGMsMHhiZCwweDA0LDB4MzQsMHg5MSwweGQ4LDB4MzEsMHhjOCwweDFhLDB4NDMsMHhmNiwweDdlLDB4MzAsMHhiNywweDExLDB4NWUsCisgIDB4ODQsMHg2MCwweDdiLDB4NTcsMHhjMiwweDUzLDB4MDIsMHgxZCwweDA5LDB4YWYsMHg0YSwweGYyLDB4ZmYsMHgyYywweDI2LDB4MjMsCisgIDB4YWEsMHg5MCwweDQwLDB4NjMsMHhlNCwweDUxLDB4MjMsMHgzNSwweDc0LDB4YjAsMHhhYSwweDYwLDB4NDMsMHg5MSwweDhmLDB4Y2UsCisgIDB4MGYsMHhmYiwweGY3LDB4NzgsMHg3YywweGIwLDB4MWQsMHhiYywweGUxLDB4YjUsMHhlNiwweDM0LDB4N2IsMHhiZSwweDYxLDB4YmMsCisgIDB4NmEsMHhlNywweDgzLDB4NTIsMHhjNSwweGMxLDB4MzMsMHgxMCwweDUwLDB4NzksMHgxOSwweGY5LDB4YzgsMHgzMSwweDU0LDB4NTQsCisgIDB4NDEsMHg0NiwweGMzLDB4YzYsMHg0OCwweGQ2LDB4ZjAsMHg1MywweDYzLDB4ODgsMHhiMSwweGYyLDB4NjEsMHg2YiwweDU5LDB4ZDQsCisgIDB4NzAsMHg0YSwweGM0LDB4ODIsMHgxZiwweDUyLDB4NTAsMHg0NywweGJjLDB4NDMsMHhiNiwweDliLDB4YjYsMHhmMSwweDI2LDB4NmIsCisgIDB4ZTUsMHg2NywweDZmLDB4MTEsMHg3NSwweGFhLDB4YTUsMHg3ZCwweGM5LDB4MWUsMHhmNiwweDUzLDB4NjIsMHhmYywweDRhLDB4OTUsCisgIDB4ZGEsMHhkOSwweGY3LDB4MmQsMHgzNywweDM3LDB4MTIsMHhhMywweDkxLDB4MWEsMHhlNywweDhhLDB4YWQsMHg3YywweGE4LDB4MjEsCisgIDB4ZjMsMHhkZiwweDgxLDB4NTUsMHg0MywweDYyLDB4MjYsMHg1ZSwweGNmLDB4YmMsMHg0MSwweDEzLDB4MmYsMHg1ZCwweDcyLDB4MTEsCisgIDB4ZjIsMHhlMywweGYzLDB4YWEsMHg1ZCwweDFmLDB4MWEsMHg2YSwweDc0LDB4MTgsMHg4NCwweGEwLDB4MWMsMHhlOSwweDQ0LDB4YjUsCisgIDB4NmEsMHgxNywweDE3LDB4MDQsMHg4MSwweGVlLDB4ODcsMHg4YywweDRjLDB4MzMsMHhkZSwweGU0LDB4YWMsMHhmOCwweDQ0LDB4YTAsCisgIDB4OTMsMHgzOCwweDE1LDB4NTQsMHhmOSwweDEwLDB4ZjEsMHhiNywweDAzLDB4N2MsMHhlYSwweDVhLDB4YzMsMHg0ZCwweDI2LDB4YTAsCisgIDB4YjIsMHgwZSwweGM3LDB4NzMsMHg5ZiwweDU3LDB4MmYsMHhkNywweDA3LDB4MmYsMHgzMiwweGMxLDB4MjgsMHhiZiwweDQ3LDB4MDksCisgIDB4OTAsMHg3OCwweDkyLDB4ZTgsMHgzZCwweDVjLDB4MjgsMHg5ZSwweDc2LDB4M2UsMHgyNCwweGFiLDB4YzcsMHhjNCwweDc3LDB4YjgsCisgIDB4YTYsMHg0ZCwweDgxLDB4NDQsMHg2OSwweGIxLDB4NzcsMHhiYiwweGRlLDB4YWMsMHhhZSwweDRiLDB4YTAsMHhiMywweGYwLDB4ZWYsCisgIDB4NzksMHhmYiwweDFmLDB4YjcsMHhlYiwweDRmLDB4OGEsMHhlOSwweDgzLDB4MWIsMHhlOCwweGUwLDB4MjMsMHhjMiwweDM5LDB4ZjUsCisgIDB4NTIsMHhjMiwweDc4LDB4ZmEsMHg3YiwweDk3LDB4YmYsMHg1ZiwweGQ4LDB4ZjUsMHg4NywweDk3LDB4OGQsMHg3YywweDkzLDB4NDUsCisgIDB4YjQsMHhhNiwweDE2LDB4YTUsMHhkNCwweGU2LDB4NTIsMHhhOSwweDkzLDB4M2QsMHhlZCwweDhhLDB4ZmYsMHgwOSwweGJiLDB4ZmUsCisgIDB4ZjgsMHg4YiwweGZjLDB4ZjAsMHgxMiwweDJjLDB4ZTksMHhlNywweDc1LDB4ZjQsMHgyZCwweGZjLDB4ZTAsMHhlYSwweDI1LDB4MGYsCisgIDB4MDksMHhmYiwweGQxLDB4OTcsMHhhMSwweDk3LDB4MjAsMHg4OCwweGU3LDB4MjYsMHhkMSwweDM4LDB4NTAsMHg0MywweDQ4LDB4OTIsCisgIDB4ZmMsMHhiNiwweGYyLDB4YzEsMHg2ZiwweGQ2LDB4OWYsMHg0OSwweDhmLDB4MGYsMHg0OSwweDRhLDB4YmMsMHg4YiwweDljLDB4OGUsCisgIDB4MDYsMHhmNCwweDg2LDB4ZWYsMHg1OSwweDY2LDB4ZmEsMHg3OSwweDM5LDB4NjEsMHhkNywweDFmLDB4MmMsMHhkZiwweDZhLDB4MWMsCisgIDB4NTIsMHhjZiwweDE2LDB4NmYsMHgwZiwweDZjLDB4NTMsMHgxNywweDYzLDB4ZDYsMHg3MSwweDZjLDB4NmQsMHg2MywweGRjLDB4NWUsCisgIDB4YmYsMHhhYiwweGViLDB4OTQsMHhmYywweDM5LDB4NWUsMHhhNSwweDA3LDB4MWIsMHg4NCwweDM5LDB4ZjAsMHgxYSwweDMxLDB4YTQsCisgIDB4ZjUsMHhlNCwweDc0LDB4ZDAsMHgxMSwweDYxLDB4MmIsMHg3YiwweGNhLDB4MzAsMHhhNCwweGFkLDB4ZWMsMHg4NywweDc2LDB4ZmQsCisgIDB4ZTEsMHhhYiwweDhkLDB4N2EsMHhhMiwweDk1LDB4MGQsMHg1NCwweDZlLDB4YTQsMHgwNiwweDc2LDB4OTYsMHgxMSwweGRiLDB4MTgsCisgIDB4YjIsMHhlYiwweDBmLDB4MTQsMHhmZCwweDkyLDB4MzYsMHhhOSwweDY0LDB4ZjksMHg0OSwweDc2LDB4YmUsMHhmYywweDVhLDB4ODIsCisgIDB4MTEsMHhkYiwweGRlLDB4NTksMHhmMywweDk5LDB4M2EsMHg5NSwweDk4LDB4ZGUsMHhiZiwweDM0LDB4YmIsMHhmZSwweGY0LDB4ZDcsCisgIDB4ZWMsMHg1NSwweGM5LDB4MjYsMHgzYiwweGNiLDB4NmUsMHg2NiwweDZmLDB4YzUsMHhkYiwweGEwLDB4NzYsMHg4ZiwweGE3LDB4MWQsCisgIDB4YmQsMHg5ZCwweGJmLDB4N2YsMHhmNiwweDQ5LDB4ZmIsMHhmMywweDA1LDB4YmMsMHhkNywweGY0LDB4NTcsMHg0NiwweGZmLDB4ZTgsCisgIDB4N2IsMHg5MCwweGFmLDB4NmQsMHgyZCwweDZkLDB4N2YsMHhmNSwweDZkLDB4ZWUsMHgwNSwweGY4LDB4ZDcsMHg2OSwweGZlLDB4NmEsCisgIDB4NzYsMHhmZCwweDUxLDB4Y2MsMHhmYSwweDkzLDB4YjksMHg0OSwweDQyLDB4NmQsMHhjNSwweDMxLDB4NTUsMHhjMSwweGMyLDB4N2MsCisgIDB4NzgsMHg1NSwweGNkLDB4YWYsMHhlNywweDVkLDB4ZjYsMHg3OSwweGVmLDB4YWYsMHg5ZSwweGUwLDB4ODksMHg1MywweDk5LDB4ZjIsCisgIDB4ZTcsMHhkOCwweGRiLDB4ZTEsMHg3NSwweGVkLDB4MTAsMHgzMywweGVmLDB4MDgsMHhmOSwweDU4LDB4YmYsMHg4NCwweDdiLDB4YTcsCisgIDB4ZDcsMHg0ZiwweDdiLDB4M2YsMHg5OCwweDMxLDB4ZTIsMHhkMywweGI2LDB4YWUsMHhhYSwweDkyLDB4M2MsMHg4ZCwweDM0LDB4NDMsCisgIDB4ZjksMHgwMCwweGM5LDB4ODcsMHhmYywweGY4LDB4ZTQsMHhlYSwweDYxLDB4YWQsMHg2YywweGY0LDB4M2IsMHg0ZCwweGNjLDB4YjAsCisgIDB4N2YsMHg4NywweGRmLDB4YzAsMHgxMiwweGY0LDB4YTQsMHg0OSwweDM3LDB4Y2YsMHhhZiwweGU3LDB4NWEsMHhhYiwweGI1LDB4OWYsCisgIDB4N2QsMHhkYywweDY2LDB4ZjgsMHgyOSwweDA0LDB4YjcsMHhmNiwweDFmLDB4NzksMHhlOSwweDcxLDB4ZTgsMHhkNywweDAzLDB4MGEsCisgIDB4M2YsMHg4MCwweDdlLDB4MDcsMHg4NywweGE3LDB4ZjcsMHg1ZiwweGE0LDB4ZGIsMHhmNSwweDAxLDB4OTMsMHg3ZSwweDQ3LDB4YmEsCisgIDB4YjMsMHhjZSwweGVmLDB4NDIsMHgzZSwweGI5LDB4NWIsMHgwOSwweDJhLDB4YTUsMHg4OSwweDhhLDB4MzMsMHg4YSwweDZiLDB4YmUsCisgIDB4OWQsMHgwZiwweDdjLDB4OTUsMHg2OCwweDA0LDB4ODEsMHgwNywweGQ0LDB4MDMsMHhmYiwweGM4LDB4NjksMHgyZCwweDk1LDB4NDksCisgIDB4ZjQsMHhmMiwweGUzLDB4OTMsMHhhYiwweDNmLDB4NTAsMHhiNiwweDk5LDB4ZjYsMHg3NywweDRkLDB4YzQsMHg5NSwweDNlLDB4NDQsCisgIDB4ZGEsMHgwYSwweDk0LDB4MjUsMHg4YywweGY4LDB4NjQsMHhmZCwweDNkLDB4NmMsMHgxYSwweDlhLDB4NWQsMHg3ZiwweGY2LDB4MTUsCisgIDB4NWQsMHg4NiwweGRmLDB4MTIsMHhhNywweDk2LDB4NjgsMHhjNCwweGJiLDB4Y2IsMHhkMCwweDAyLDB4NGYsMHgxNywweGYyLDB4ZjcsCisgIDB4MDMsMHhiYiwweGZlLDB4NjgsMHg0NSwweGQ5LDB4MjQsMHhkMSwweDJiLDB4OWIsMHhlMSwweDMyLDB4NWUsMHg1OSwweGRiLDB4OTMsCisgIDB4NjIsMHgyZiwweGMwLDB4NmYsMHg2NywweGU0LDB4MWYsMHgyYywweDUzLDB4YzgsMHg2OSwweDRjLDB4NzYsMHg3NywweGIxLDB4MDEsCisgIDB4ZjgsMHgwMCwweDdiLDB4YzEsMHhkMywweDg1LDB4ZjQsMHg2NCwweDc3LDB4MWUsMHhmZiwweGU4LDB4YjksMHhmYSwweDVmLDB4ZDQsCisgIDB4OTYsMHg3NSwweGFhLDB4YjgsMHg4ZCwweDU2LDB4MjcsMHg5NSwweDM4LDB4M2UsMHhlYywweGVhLDB4NDcsMHg0MywweDM5LDB4ZmUsCisgIDB4YTksMHhhNiwweGZjLDB4YjMsMHgwOCwweDkzLDB4YTAsMHgwNSwweGUwLDB4MDksMHg2ZCwweGQxLDB4MDYsMHg0ZiwweDRmLDB4YzUsCisgIDB4MzksMHhhNSwweDNiLDB4MmYsMHg5ZSwweDM5LDB4ZmUsMHg4MSwweGFhLDB4MDAsMHg4ZCwweDQ2LDB4NzIsMHhlNywweDEzLDB4YzIsCisgIDB4NjYsMHhjOCwweDY4LDB4NGQsMHgyMSwweGJlLDB4OGIsMHhmZCwweDlkLDB4YWIsMHhmZiwweDZhLDB4NzYsMHhmZCwweDM5LDB4MGQsCisgIDB4NDYsMHg3ZiwweGRmLDB4MjUsMHhlOSwweGVjLDB4MTEsMHhmOCwweDEzLDB4YWMsMHgwNCwweDQ5LDB4YWIsMHg3NCwweGM3LDB4NjcsCisgIDB4ZDIsMHhjOSwweDNmLDB4ZjIsMHg3YiwweGQwLDB4M2MsMHgyMiwweGZhLDB4MGUsMHg0YywweGEwLDB4MTQsMHg1ZSwweGExLDB4OTIsCisgIDB4ZmEsMHg3MywweDE2LDB4ZDYsMHg5YSwweGNiLDB4NmUsMHhiNiwweGQ2LDB4Y2YsMHhkOCwweGY1LDB4MjcsMHhkNSwweDZhLDB4ZjAsCisgIDB4NGYsMHg4MiwweDFmLDB4MjQsMHhiYiwweDI1LDB4ZmQsMHg0OCwweDJkLDB4YzcsMHg2OCwweDhjLDB4OTksMHhiNiwweGZmLDB4NzIsCisgIDB4MjcsMHhmZiwweDljLDB4MzEsMHhlMywweDkzLDB4ZjYsMHgyOCwweGUxLDB4MTEsMHgwMiwweGE4LDB4M2UsMHgyMCwweGY1LDB4NTksCisgIDB4OTcsMHg2OSwweDdjLDB4M2MsMHgwNSwweGY5LDB4NjcsMHgwMywweDMzLDB4OWYsMHgzNiwweGZkLDB4YTQsMHgyNywweDUyLDB4N2MsCisgIDB4NGEsMHgyZSwweGMyLDB4YjUsMHg4YSwweGIwLDB4OWUsMHhmMCwweGNmLDB4MzQsMHgxZSwweGYwLDB4NmMsMHg0NSwweDI3LDB4MWQsCisgIDB4ZmMsMHg0MywweGYzLDB4YWQsMHgyOSwweDVkLDB4Y2UsMHg2ZCwweDliLDB4ODAsMHgzMCwweDU0LDB4NjksMHg1MiwweDA1LDB4MjksCisgIDB4YjMsMHg3MSwweDcyLDB4MjIsMHhjYSwweDQzLDB4NmMsMHg5YiwweDA1LDB4NDIsMHhhMywweDc2LDB4YmEsMHhhOSwweGYzLDB4NjgsCisgIDB4N2MsMHg1NiwweGE1LDB4MTcsMHhmZiwweDlhLDB4NDQsMHhlMywweDIyLDB4MDEsMHg4MywweDcyLDB4OTIsMHgzZiwweGVhLDB4OTQsCisgIDB4M2MsMHgxMywweGZmLDB4ZjQsMHgxNywweDE5LDB4NDEsMHg5NiwweDQ5LDB4NTgsMHg0OCwweGZjLDB4YTEsMHg5OSwweDIxLDB4ZDEsCisgIDB4MzgsMHgzMywweDFiLDB4ZmYsMHg1YywweDY1LDB4ZDQsMHgxMywweDJjLDB4MDAsMHg3YiwweDJiLDB4ZjcsMHgzYywweGRhLDB4MDcsCisgIDB4ODIsMHg0YSwweDc2LDB4ZmIsMHhmOCwweDhjLDB4ZmMsMHhhMywweDk5LDB4ZmMsMHhiMywweDgxLDB4NjAsMHhkZSwweDdjLDB4ZjgsCisgIDB4ODUsMHhiNiwweGY4LDB4YjYsMHhiOSwweDViLDB4ZDEsMHg2NywweDJlLDB4ZmUsMHhjOSwweGQ4LDB4ZTcsMHgzZCwweDUyLDB4NjUsCisgIDB4MDQsMHgyZCwweGQzLDB4N2QsMHgwZCwweDZhLDB4ZTMsMHg5ZiwweDU1LDB4OTUsMHhiNCwweDUwLDB4MWYsMHg3YiwweDEzLDB4MGUsCisgIDB4Y2MsMHhjMiwweDNmLDB4ZmQsMHgxNCwweDcyLDB4MTIsMHhkMiwweDQxLDB4ZDYsMHhjZiwweDdmLDB4MDYsMHhmNywweGM1LDB4MDUsCisgIDB4MWQsMHg1ZCwweDUyLDB4ZjIsMHhmOCwweDA3LDB4MzksMHhmOCwweDA3LDB4OGMsMHhhNiwweDIzLDB4YjMsMHg0NSwweGI0LDB4ZmIsCisgIDB4ZGMsMHg2NCwweGI2LDB4YTEsMHhjZSwweGQ5LDB4ZjgsMHhjNywweDY4LDB4NmEsMHg0MywweDY1LDB4MDMsMHg3MSwweDFmLDB4NzMsCisgIDB4MDksMHhkNywweDg1LDB4YTUsMHhjNCwweGVkLDB4YjQsMHg4ZCwweGNlLDB4Y2MsMHgzZiwweDQ2LDB4OTMsMHg2ZCwweDE3LDB4ZjYsCisgIDB4ZWUsMHhmMCwweDk1LDB4YmUsMHhiOCwweDllLDB4ZjAsMHg0ZiwweGMyLDB4NmIsMHhiNiwweDVkLDB4YzksMHhkMSwweDdmLDB4NzMsCisgIDB4ZmMsMHg1MywweDkzLDB4ZTUsMHgxZiwweDYxLDB4MzcsMHhkYSwweDI4LDB4YmYsMHgwOCwweGZiLDB4NTcsMHhjZiwweDRkLDB4YTAsCisgIDB4M2UsMHg2MywweGRhLDB4ZGMsMHg4MiwweGZjLDB4YzMsMHgwMywweDk3LDB4NmQsMHhmYSwweDc1LDB4NDUsMHhjNCwweDUwLDB4ZGEsCisgIDB4ZTcsMHhjYSwweGU4LDB4MTgsMHg0NywweDQ3LDB4M2MsMHgwZSwweDFlLDB4YzgsMHhkNSwweDlmLDB4NDEsMHgzZSwweDZhLDB4MzksCisgIDB4MTUsMHg4NSwweDQxLDB4YTYsMHgwMiwweDc2LDB4NjIsMHhkNiwweDI0LDB4NDAsMHhjMSwweGUxLDB4ZWYsMHhjNywweGFjLDB4YjUsCisgIDB4OWYsMHhkZSwweDc5LDB4NTksMHhhNywweGY2LDB4MTAsMHhlZiwweGZlLDB4NDQsMHg3OCwweDY2LDB4NjcsMHhmYSwweDZmLDB4ZGUsCisgIDB4YWYsMHhjOSwweGVmLDB4ZWYsMHhlNywweDRhLDB4YWMsMHg3OCwweGY2LDB4NTYsMHgxYiwweGJjLDB4YTQsMHg4YSwweGU5LDB4NmQsCisgIDB4NjMsMHhmMCwweDI5LDB4MWMsMHg2YSwweGFmLDB4MTksMHg2MCwweDE3LDB4YjgsMHg3OCwweGUwLDB4OWMsMHg5ZCwweDNmLDB4MGQsCisgIDB4NzIsMHg5NCwweGEzLDB4OTAsMHhlMywweGVmLDB4NDQsMHg3YSwweDYyLDB4MTIsMHhiYywweDUwLDB4ODYsMHgxMSwweDJlLDB4YzAsCisgIDB4M2YsMHhiOSwweGI3LDB4ZDgsMHg1NiwweGUyLDB4OWQsMHhhOCwweGYyLDB4MzUsMHg2OCwweDU4LDB4NzksMHg4NiwweGU5LDB4NTcsCisgIDB4ZjksMHgwNCwweGUyLDB4MTgsMHgwNywweGVmLDB4NjUsMHhmZCwweGNkLDB4ZjEsMHg5OCwweDExLDB4M2QsMHgwZCwweDc2LDB4OTEsCisgIDB4ZTgsMHgzZCwweGMxLDB4ZmIsMHhkNSwweGVkLDB4ODksMHg3MCwweDlmLDB4ZWEsMHg4YSwweDY3LDB4OGUsMHg3ZiwweDM4LDB4Y2EsCisgIDB4YjcsMHhjZCwweDYxLDB4NmUsMHgyZiwweDc5LDB4ZmEsMHg0YywweGM1LDB4YmYsMHhhYywweGU3LDB4ZTcsMHhkOCwweGZiLDB4NWYsCisgIDB4NTMsMHg4MCwweDdmLDB4ZmEsMHhjMSwweDk4LDB4YmYsMHgzYSwweGViLDB4ZGQsMHhkZCwweDExLDB4ZTksMHg1MSwweGUyLDB4NWQsCisgIDB4YmUsMHhiZiwweDFmLDB4ZGEsMHhmNSwweGM3LDB4MGYsMHgyNiwweGZmLDB4NDgsMHg3OCwweDhkLDB4MjIsMHhhNiwweGRhLDB4NTYsCisgIDB4ODAsMHhkNCwweGI5LDB4NDYsMHg4NywweDE0LDB4OWEsMHg5MSwweDdmLDB4MzgsMHhjYSwweDNmLDB4OGIsMHg3YiwweDA1LDB4N2QsCisgIDB4ODcsMHhiZiwweGY4LDB4YzEsMHhhMywweDVlLDB4NGEsMHgzYiwweGUzLDB4ZjAsMHgyZSwweDQ5LDB4NjMsMHgyMSwweGM3LDB4M2YsCisgIDB4ZWMsMHg4ZSwweDFjLDB4ZmYsMHhmYywweDk3LDB4NTEsMHg3ZiwweDA2LDB4MDUsMHgyZiwweDEyLDB4MjEsMHhhZSwweGI2LDB4MWUsCisgIDB4YTUsMHhjNywweDg0LDB4YmMsMHgyYiwweDA1LDB4YjQsMHg1MiwweDY3LDB4N2QsMHhiNiwweGViLDB4NGYsMHgyZCwweDczLDB4OGQsCisgIDB4NzksMHg3ZSwweDM3LDB4YTEsMHhmOSwweDkxLDB4NmQsMHg3YywweDZkLDB4NmEsMHhlZSwweDE2LDB4NzQsMHhhYSwweGUzLDB4MjcsCisgIDB4NzAsMHhkZCwweGI0LDB4ZjMsMHg5YiwweGNjLDB4YWQsMHhjZiwweGNmLDB4OTcsMHgzZiwweGVmLDB4NTgsMHhiNSwweDRmLDB4ZjAsCisgIDB4N2IsMHg5YiwweGYxLDB4OGQsMHg3OCwweGY5LDB4MDUsMHg4OSwweDYyLDB4Y2YsMHg2ZiwweGM4LDB4YjEsMHg5NSwweDRjLDB4ZmUsCisgIDB4OTksMHg5NywweGM3LDB4M2YsMHg2NSwweDI2LDB4ZmYsMHg5MCwweGQzLDB4MzcsMHg0MSwweDRlLDB4ZGYsMHgyZiwweDUzLDB4ZDIsCisgIDB4YzAsMHg5YSwweDhmLDB4ZTQsMHg5OSwweGY5LDB4NDcsMHgzNSwweGZiLDB4NTcsMHhiMiwweDJjLDB4YzUsMHhkZSwweDAzLDB4YWYsCisgIDB4ZTIsMHg2NSwweGZhLDB4YmEsMHg0OSwweDc2LDB4NGEsMHg5OSwweDcyLDB4ZjYsMHhhZiwweDc1LDB4OTMsMHg5NSwweGU5LDB4MWMsCisgIDB4ZmYsMHg1YywweDY1LDB4ZjAsMHgwZiwweGU2LDB4NTUsMHhkNCwweGE0LDB4ZmUsMHhhZiwweDcyLDB4ZGQsMHg5MCwweDQ0LDB4YjYsCisgIDB4YWQsMHhlNiwweGYzLDB4NWIsMHg4ZSwweDM3LDB4MTIsMHg2MCwweGQ0LDB4YWIsMHg0ZSwweDdlLDB4MGIsMHhiYSwweDA2LDB4MWUsCisgIDB4ZTYsMHg2ZSwweDMzLDB4YTYsMHgyOSwweGY5LDB4ZjMsMHg4NywweGVkLDB4ZmEsMHgxMywweGFkLDB4MWEsMHhlMSwweDQ5LDB4ZDAsCisgIDB4NzQsMHgxZSwweDc2LDB4MDQsMHg2MCwweGI3LDB4YjgsMHgyOCwweDEzLDB4NWIsMHg4ZSwweGRlLDB4NzIsMHhmNSwweGY3LDB4OTMsCisgIDB4NzYsMHg3ZSwweGZhLDB4MGQsMHhkZSwweDZiLDB4OTIsMHhjNSwweDI3LDB4ZDksMHgyNiwweGMyLDB4M2YsMHgzZiwweGJhLDB4MjgsCisgIDB4YmMsMHhjYywweDRlLDB4YTksMHhmOSwweGZlLDB4OWUsMHg3MCwweGVjLDB4YzcsMHgxOCwweGRjLDB4ZjMsMHhhMCwweGMyLDB4MWUsCisgIDB4NjQsMHhiZSwweGM0LDB4ZDMsMHhhNywweGQ5LDB4YzYsMHg5OCwweDVkLDB4MWYsMHg3NiwweGM5LDB4OTcsMHgxOSwweDUyLDB4YjQsCisgIDB4ZWYsMHgxMiwweGY1LDB4Y2EsMHgyNiwweGZlLDB4MTQsMHhiMywweDRjLDB4YmIsMHgyNiwweDUzLDB4NjksMHg5NiwweGYxLDB4MzIsCisgIDB4NDcsMHgzZCwweGQ3LDB4ZWQsMHhmZCwweDFjLDB4ZWQsMHhkYywweDRjLDB4OWIsMHg1NCwweDlhLDB4ZWYsMHg0NywweDA3LDB4OGIsCisgIDB4NjMsMHg4YywweDk3LDB4NzQsMHgyYiwweDMwLDB4ZGIsMHg5NiwweGU0LDB4NzgsMHg3ZiwweDNmLDB4YWQsMHg1YSwweGViLDB4MTMsCisgIDB4ZmUsMHg5MSwweGM5LDB4NTMsMHhjYywweGY3LDB4MTcsMHgwNywweDYwLDB4ODcsMHhlMiwweDNkLDB4Y2EsMHgwZiwweDc4LDB4MjcsCisgIDB4ZGMsMHhiYywweDk0LDB4YWIsMHgzZiwweDFjLDB4ZWQsMHg0NywweDQxLDB4MWMsMHg4MSwweGYyLDB4MWUsMHg4OCwweDgxLDB4YTIsCisgIDB4YWQsMHgwZCwweDE1LDB4OWIsMHg2MSwweDMxLDB4ZmEsMHhkZCwweDgxLDB4N2MsMHhmZSwweGMxLDB4MjIsMHhlZCwweGE3LDB4Y2QsCisgIDB4NTgsMHgxYywweDIwLDB4YmMsMHhiMSwweDgzLDB4NTksMHg3NiwweGY0LDB4ZTQsMHgwMCwweGQ5LDB4M2YsMHg3NSwweDUzLDB4NzAsCisgIDB4ZjgsMHgzYiwweDZlLDB4ZDcsMHg5ZiwweGU0LDB4YmMsMHhjYiwweDMyLDB4ZTksMHg1ZiwweDVhLDB4OTksMHg0YSwweGJjLDB4OWIsCisgIDB4ODAsMHg1ZiwweDY5LDB4ZGYsMHg3MywweGI4LDB4NzksMHgxOSwweDNlLDB4YzksMHhmYSwweGNiLDB4NWEsMHhmMSwweGQ0LDB4YjIsCisgIDB4ZmMsMHgyYywweDlkLDB4NjEsMHhlYiwweDYwLDB4MTgsMHhhZiwweGM0LDB4YTIsMHg4NiwweDFhLDB4ZTEsMHg5MywweDE5LDB4ZjksCisgIDB4NDcsMHgzMywweGY4LDB4MjcsMHg5OCwweDE0LDB4MGUsMHgyMiwweDQ1LDB4ZWUsMHhjMiwweGRlLDB4MjQsMHhkZiwweDhiLDB4OWUsCisgIDB4ODYsMHg3YywweGZlLDB4YzksMHhlOSwweDNmLDB4MjksMHg2ZSwweDg0LDB4N2IsMHgxNiwweDQ0LDB4MTAsMHhmYSwweGMyLDB4MWIsCisgIDB4YTEsMHgwYiwweDZkLDB4ZWMsMHgyOCwweDBkLDB4NTUsMHhmMCwweGFlLDB4N2UsMHg3NCwweDIxLDB4OGYsMHg3ZiwweDhjLDB4OTcsCisgIDB4OTQsMHgzYiwweGU5LDB4ZmEsMHg4OSwweGViLDB4ZTgsMHhmYSwweDRmLDB4Y2QsMHhjOCwweDNmLDB4NmEsMHhiNSwweDExLDB4ODQsCisgIDB4YjAsMHg3NCwweDJkLDB4MGEsMHhjNywweGI0LDB4ZDQsMHg4YSwweDhlLDB4YjIsMHg5ZSwweGY4LDB4YjUsMHhjYSwweGY5LDB4MmIsCisgIDB4ZTgsMHgzZiwweDJkLDB4MzcsMHg0YSwweGUzLDB4OTUsMHg4MywweDg0LDB4MGYsMHhlZiwweGQxLDB4Y2EsMHgzNSwweGY2LDB4YTIsCisgIDB4NDEsMHg4YywweGNlLDB4ZmUsMHgzZSwweGUxLDB4ZDIsMHg3ZiwweDQ4LDB4OTEsMHhlOSwweDgzLDB4OTQsMHg2YywweDdjLDB4MTAsCisgIDB4NjMsMHhmOCwweDhhLDB4ZmEsMHhjZiwweDZkLDB4NDIsMHgyNywweGUxLDB4YjcsMHg2ZSwweGVjLDB4MWQsMHgyNywweDg1LDB4ZjcsCisgIDB4OTgsMHgyYiwweDFmLDB4NzIsMHhmYywweDMzLDB4NmUsMHhmMSwweGUxLDB4ZjUsMHgyOCwweDA2LDB4YjEsMHhhNCwweGZmLDB4MDMsCisgIDB4YmUsMHhkNCwweDNiLDB4YWIsMHhmZSwweDkzLDB4ZTUsMHgxZiwweDYxLDB4M2MsMHhkYywweDA4LDB4MGYsMHgyNCwweGY2LDB4MjUsCisgIDB4ZjksMHg0ZCwweGRlLDB4ZDEsMHg5YywweGZlLDB4OTMsMHgzNSwweDJlLDB4NGYsMHhlMywweDFmLDB4MDIsMHgzOSwweDIwLDB4YzksCisgIDB4NmMsMHhhNywweDc3LDB4NDgsMHg2ZSwweGQwLDB4MDIsMHg0YSwweGJlLDB4ZmUsMHg1MywweDEyLDB4NzIsMHhlYSwweDNmLDB4MDYsCisgIDB4ZmYsMHhiNCwweDgwLDB4ZDQsMHg1ZSwweDc5LDB4MTIsMHhiZSwweDkyLDB4YmYsMHhkNSwweDI5LDB4ZmQsMHhhMSwweDAwLDB4M2YsCisgIDB4YmIsMHhmOCwweDI3LDB4NDIsMHg4MiwweGEwLDB4YzAsMHg5MywweDUwLDB4YTcsMHhmNSwweDYwLDB4ZDIsMHg5NCwweGYyLDB4ZTIsCisgIDB4YmYsMHhjNiwweGM1LDB4M2YsMHg0MywweGMyLDB4MTYsMHg0ZiwweDBkLDB4M2MsMHgwMCwweGZiLDB4MzQsMHgzZSwweDhhLDB4MTIsCisgIDB4NmUsMHhmZCwweGM3LDB4OGUsMHgzZiwweDM2LDB4ZjksMHgyNywweDJhLDB4YWMsMHg4ZiwweGNkLDB4ZTEsMHg3ZiwweDhlLDB4OTUsCisgIDB4OGYsMHg3OCwweDNmLDB4YmEsMHg1YiwweDdlLDB4M2MsMHg1ZiwweGZmLDB4YjEsMHhlMywweDlmLDB4ZTUsMHg5ZiwweGJmLDB4MTYsCisgIDB4ZTQsMHgwYSwweDBmLDB4YzQsMHgzOCwweDI1LDB4ZWQsMHhhZiwweDhmLDB4MWQsMHg1MywweDY2LDB4ZDMsMHg3ZiwweGZhLDB4NGQsCisgIDB4YzgsMHg4OSwweGIyLDB4OGQsMHhmMiwweGM3LDB4NWIsMHhlYSwweDcwLDB4NjAsMHg0YywweGY4LDB4NGYsMHhmYywweGUxLDB4Y2MsCisgIDB4ZmEsMHgwZiwweGQ4LDB4NGQsMHhlNywweDc0LDB4NzgsMHg1MiwweDZkLDB4YWUsMHgyMCwweGM2LDB4M2UsMHhlZSwweDhhLDB4ZmMsCisgIDB4YTMsMHg0OSwweDdiLDB4ZTMsMHgwYiwweGUxLDB4NzgsMHhjNywweDQwLDB4YWIsMHhmOCwweDBkLDB4MDIsMHhiOSwweDU3LDB4ZDQsCisgIDB4N2YsMHg1NiwweDBiLDB4YmQsMHhlMSwweDA1LDB4ZDAsMHhhMSwweDc5LDB4MjcsMHgzZCwweDg5LDB4OGEsMHg2ZiwweDFhLDB4ZmEsCisgIDB4NGYsMHhmOSwweDZjLDB4ZmMsMHg0MywweDA2LDB4M2QsMHg5YywweGJhLDB4YmQsMHhkNiwweDRiLDB4ZmEsMHhiYiwweGE3LDB4MGYsCisgIDB4ZTcsMHhlOSwweDE1LDB4MTUsMHgwZSwweGZlLDB4ZTEsMHgwYywweGZlLDB4ODksMHgwYSwweDM1LDB4YTgsMHgwOCwweDNhLDB4NDAsCisgIDB4MjEsMHhkOCwweDUzLDB4ZGUsMHgwOSwweDMzLDB4ZjMsMHg0ZiwweDQzLDB4OTksMHhjZCwweDNmLDB4YTQsMHhhNCwweDMzLDB4NzUsCisgIDB4NTQsMHgwOCwweDRhLDB4NGUsMHhkNywweDFmLDB4NGEsMHgzMCwweGZiLDB4MjYsMHg2MywweGViLDB4M2YsMHhmMywweGIyLDB4ZmUsCisgIDB4ZGUsMHhjMiwweDVlLDB4NDQsMHhjZiwweDQzLDB4NzMsMHhiYiwweGY0LDB4YjYsMHg3MCwweDhiLDB4ZTEsMHg2NiwweGI5LDB4OTMsCisgIDB4NjcsMHhiOCwweDFjLDB4NmYsMHgxOCwweGZjLDB4YTMsMHg0OSwweGU5LDB4YjgsMHgwZiwweDhlLDB4NDEsMHg1ZCwweDQ0LDB4NGMsCisgIDB4YjMsMHhmNSwweDZlLDB4ZmQsMHhjNywweGMxLDB4M2YsMHg1OSwweGM4LDB4NDksMHgyMiwweDFlLDB4NGUsMHg5MiwweDU0LDB4ZTMsCisgIDB4ZWYsMHgyNywweGRkLDB4NzYsMHg2NiwweGZlLDB4ODksMHgxNCwweGQ5LDB4NGUsMHhiNSwweGQ2LDB4NmUsMHg0NywweDRhLDB4YmIsCisgIDB4NDcsMHgwZSwweDczLDB4OTAsMHhjZiwweDNmLDB4YTMsMHgzOSwweGZlLDB4YTksMHhlZSwweGIzLDB4ODIsMHhkYywweGJhLDB4ZmEsCisgIDB4YTcsMHhiMiwweDU3LDB4ZjUsMHgzYywweDhjLDB4ZmUsMHg3YiwweDc2LDB4ZmQsMHg4NywweDZlLDB4ZjIsMHg4NywweDUyLDB4NDIsCisgIDB4ZjgsMHgwMSwweDNhLDB4N2UsMHhhNiwweDRlLDB4NWQsMHg5NCwweDYwLDB4MWQsMHg5ZiwweGVmLDB4OGIsMHhmOSwweGZjLDB4MzMsCisgIDB4Y2UsMHhmNCwweDcxLDB4OTcsMHhlOCwweDc5LDB4ZjksMHgwNiwweDdiLDB4MTAsMHgyZSwweGM1LDB4OGUsMHhhOCwweDY1LDB4MzUsCisgIDB4MzksMHgzNywweDBiLDB4ZTgsMHgzZiwweDdlLDB4ZDksMHhlMiwweDlmLDB4NzgsMHgyZCwweDljLDB4ZTQsMHhlNywweDkwLDB4ZjgsCisgIDB4YjMsMHg4YSwweDcyLDB4NDUsMHhmZCwweDY3LDB4MGYsMHhjMSwweGY4LDB4NDUsMHhlNCwweDdjLDB4NzksMHg3MSwweDM4LDB4NTksCisgIDB4YjksMHhkNSwweDkyLDB4N2QsMHgwYSwweGU5LDB4M2YsMHhkOSwweGY3LDB4MmYsMHg4MSwweDQxLDB4MjUsMHhjMywweDBmLDB4ODEsCisgIDB4NmYsMHgxMiwweDQyLDB4YzUsMHhhNSwweGFlLDB4ZmEsMHg5MywweGQzLDB4N2YsMHg5MiwweDI2LDB4ZmYsMHhhOCwweDY0LDB4ZjAsCisgIDB4MWEsMHhlNiwweDI3LDB4YmMsMHg4MiwweDNjLDB4YTEsMHhlMiwweDViLDB4OTksMHg5OSwweGY1LDB4OWYsMHg3ZSwweDdlLDB4M2UsCisgIDB4ODEsMHgxYywweDQyLDB4M2IsMHgxMSwweDYxLDB4MGUsMHhmYywweDFhLDB4MmYsMHhmNywweDhhLDB4ZWIsMHhkOSwweDBhLDB4NGIsCisgIDB4ZjYsMHgyOSwweGE0LDB4ZmYsMHhjYywweDMzLDB4ZWEsMHhhZCwweDRhLDB4YWEsMHhjNywweGQ5LDB4ZTIsMHhhNywweDRjLDB4NjMsCisgIDB4MGMsMHhkZSwweDliLDB4NDUsMHhmZiwweGExLDB4NGQsMHg2YSwweDU1LDB4NWYsMHhmOSwweGY4LDB4OWEsMHg2ZiwweGMxLDB4YjEsCisgIDB4N2QsMHhjYiwweGEyLDB4ODEsMHg0OSwweGI2LDB4MTksMHhhNiwweGYyLDB4ZmEsMHg5NywweGU2LDB4ZTQsMHgxZiwweGJhLDB4YzksCisgIDB4MzksMHhmYywweDg2LDB4ZjAsMHg1NSwweGY4LDB4N2UsMHhlNSwweDNhLDB4ZDUsMHgwMCwweDliLDB4OTksMHhmOSwweDA3LDB4NGMsCisgIDB4ZmUsMHgzOSwweGZhLDB4NWQsMHgwZCwweGQ1LDB4NTQsMHhkZCwweGRmLDB4NzQsMHgxYiwweGU2LDB4NmYsMHg0MSwweDU1LDB4YWUsCisgIDB4ZjksMHgwZSwweGZkLDB4YzcsMHhhYywweDNmLDB4NTQsMHg2ZiwweGY0LDB4NDAsMHgwNywweGY2LDB4MDMsMHhkZiwweDQwLDB4MGUsCisgIDB4NWEsMHg3ZSwweDNjLDB4NTMsMHgwZSwweGZkLDB4YzcsMHhlYywweDJmLDB4ZTQsMHg3NCwweDVmLDB4ZWYsMHgzZCwweDllLDB4YTgsCisgIDB4NmIsMHgwZiwweDBjLDB4NzQsMHhkNywweGJhLDB4NzgsMHhlNiwweDdjLDB4NGUsMHhmZiwweDMxLDB4ZjksMHgwNywweDQ5LDB4NDksCisgIDB4ZTEsMHgwMywweGI4LDB4YTQsMHgxMiwweDgzLDB4YTYsMHg4ZCwweDViLDB4ZmYsMHhiMSwweGQ2LDB4NjcsMHhlNCwweGNiLDB4YTYsCisgIDB4OWUsMHhhZiwweGIxLDB4MTcsMHg5NCwweDExLDB4YTYsMHgxZSwweDQ0LDB4OTksMHgwZCwweDI5LDB4MzMsMHhlYiwweDNmLDB4MTgsCisgIDB4MGMsMHhmZSwweDg5LDB4ZGUsMHhkNCwweGY3LDB4NGEsMHgxMiwweDI1LDB4ODcsMHhiYywweGJjLDB4M2YsMHg4MSwweDE2LDB4MTYsCisgIDB4ZTAsMHgxOSwweDA3LDB4ZmYsMHgzMCwweDc0LDB4M2UsMHgxOSwweDRjLDB4ZTEsMHhlZCwweDM4LDB4NzgsMHgxMywweGZmLDB4NGMsCisgIDB4ODUsMHhiNywweGY2LDB4NGEsMHhmYywweDEzLDB4ODAsMHg1MiwweDg1LDB4MDQsMHhhZCwweDFmLDB4ZmMsMHg1NCwweDg4LDB4ZTYsCisgIDB4YWUsMHhhMCwweGZmLDB4MTgsMHhmOSwweDgwLDB4NDksMHhiNywweDRhLDB4MzEsMHhjZCwweDEwLDB4YTAsMHhlNywweDJiLDB4ZGYsCisgIDB4ZGYsMHg5YywweGZlLDB4NDMsMHhmOCwweGM3LDB4ZjAsMHhiNywweDJjLDB4Y2EsMHgxZSwweDIxLDB4ZmQsMHhmZCwweDA1LDB4NTgsCisgIDB4OTIsMHgyNiwweGZkLDB4ZGQsMHg3NSwweGJmLDB4ODMsMHg2YywweGRlLDB4YjgsMHhlYSwweDJiLDB4OTQsMHhiZCwweGVkLDB4ZGEsCisgIDB4MGQsMHgxMywweDc4LDB4OTksMHhkMiwweDMzLDB4YzIsMHgzNiwweGUxLDB4NGYsMHhmMCwweGFhLDB4OTQsMHg3OCwweDMxLDB4OTcsCisgIDB4NDgsMHgxOSwweGJiLDB4M2UsMHg2MCwweGY4LDB4ZDgsMHhhMiwweDlkLDB4MGQsMHhkMCwweDg1LDB4NTcsMHgyOCwweDA0LDB4ZGIsCisgIDB4NWEsMHg1NCwweDMyLDB4OTIsMHgyMSwweDg1LDB4MjgsMHg2OCwweGViLDB4M2YsMHhmNiwweDc5LDB4ZTQsMHg4YiwweDQ2LDB4MjAsCisgIDB4MGUsMHg3ZSwweGVhLDB4MTQsMHg4NiwweDQzLDB4YjAsMHgwOCwweDc4LDB4NDQsMHg1ZSwweDM0LDB4MDgsMHhmZiwweGE0LDB4ZjksCisgIDB4NDMsMHg0OCwweGNjLDB4ZjksMHg2YiwweGM1LDB4OWYsMHhmMiwweDRmLDB4NTYsMHgyZCwweGQ5LDB4YzAsMHgzZiwweDhhLDB4ZWYsCisgIDB4ZjQsMHhlZSwweDQ4LDB4OTAsMHg2OCwweGQxLDB4MTEsMHhmZiwweDJlLDB4MTQsMHgyOCwweGMwLDB4M2YsMHhhNCwweGZmLDB4NjYsCisgIDB4ZDUsMHg4NiwweDAzLDB4OTAsMHhjMSwweDBkLDB4YjUsMHhlMiwweGNmLDB4NGEsMHgwMywweDcwLDB4MWUsMHhkZCwweGEzLDB4ODksCisgIDB4OGYsMHgwYSwweDAxLDB4MzcsMHhmZiwweGU4LDB4MjYsMHhmZiwweGQwLDB4MjAsMHg2NCwweDQ4LDB4MmEsMHhhZCwweDg0LDB4NWMsCisgIDB4NTgsMHgyNiwweDBiLDB4ZWEsMHgzZiwweDcwLDB4ZDAsMHgzYSwweDdkLDB4ZmIsMHhkNCwweDEzLDB4NzcsMHhkNSwweDU1LDB4NDksCisgIDB4N2QsMHhhYywweGI5LDB4YWMsMHg5OCwweDEwLDB4ODIsMHhkNiwweDNmLDB4ZWQsMHhkMCwweDdmLDB4OGEsMHg0NCwweDM1LDB4YmIsCisgIDB4NDksMHgwZCwweDc2LDB4ODQsMHhlNywweDI4LDB4NmIsMHgwNywweGQwLDB4Y2YsMHhmMCwweDYxLDB4NTgsMHgzMiwweDVhLDB4MTMsCisgIDB4ZjIsMHgwNCwweDJjLDB4ZDcsMHg3MiwweGZjLDB4YTMsMHgxNywweDdkLDB4YzcsMHgwYSwweDQyLDB4NGMsMHhjMSwweDlhLDB4MmYsCisgIDB4YmEsMHgzNiwweDg5LDB4YTQsMHhjMCwweDQzLDB4NGMsMHg2MCwweDkyLDB4MjQsMHg4NiwweDg4LDB4ZTIsMHhmOSwweGZjLDB4MTMsCisgIDB4MzUsMHhmOSwweDg3LDB4MzYsMHhmZCwweDUxLDB4YjUsMHgxMywweDJmLDB4MjAsMHg4NiwweGQ3LDB4YmMsMHgyMSwweGYyLDB4ZmYsCisgIDB4M2QsMHg3YSwweGNjLDB4MTIsMHg0NiwweDFjLDB4ZmEsMHgwZiwweDg4LDB4MTYsMHhlZCwweDYwLDB4ZDAsMHhkNCwweGZhLDB4NTYsCisgIDB4YTksMHg5ZSwweDM1LDB4NDcsMHhmOCwweDVkLDB4ODIsMHgwOCwweGFmLDB4NjQsMHhmNSwweDlmLDB4NjksMHhmYywweDczLDB4NWYsCisgIDB4MzYsMHgzZSwweDFlLDB4YWEsMHhmZiwweGVjLDB4YjQsMHhlMywweGYzLDB4M2YsMHhlYywweGFkLDB4MzMsMHhmMiwweDhmLDB4MDEsCisgIDB4ZTEsMHg0OCwweDY3LDB4NTYsMHhhOCwweDNiLDB4MDcsMHhkOCwweDhmLDB4OTIsMHhhZiwweDEzLDB4MDIsMHgzNywweDg4LDB4N2QsCisgIDB4MjYsMHhmZCwweDg3LDB4MTYsMHg4ZCwweDkzLDB4NzAsMHgzZiwweGFhLDB4NTUsMHg4OSwweGYxLDB4N2YsMHg5OCwweGYwLDB4OGYsCisgIDB4ZWUsMHgyYywweDQ0LDB4MmUsMHhmZCwweGM3LDB4YTQsMHg5ZCwweGE3LDB4ZjEsMHg4MiwweDI4LDB4MzEsMHhkZSwweDM0LDB4ZGMsCisgIDB4MjQsMHg4NSwweGM1LDB4MGUsMHg4NSwweDRiLDB4ZmYsMHgzMSwweDhhLDB4YjYsMHgxMiwweDhiLDB4MjQsMHhmZiwweDIwLDB4YWMsCisgIDB4NDAsMHgyMywweDQ2LDB4MTgsMHhmOSwweDdhLDB4OGYsMHgzOCwweDBiLDB4ZmYsMHgyNCwweGQ5LDB4NGIsMHhmOCwweDVjLDB4NzQsCisgIDB4ZTUsMHgxMSwweGU5LDB4MWMsMHhjMSwweDllLDB4MTMsMHhkMCwweDg0LDB4YzUsMHg3MSwweGMxLDB4NWYsMHg4OCwweDdmLDB4ZjIsCisgIDB4NmUsMHgxZiwweDc2LDB4NjIsMHhmNiwweGE4LDB4ZDEsMHhhMSwweDk2LDB4NzQsMHhjNCwweDY3LDB4ZTYsMHgxZiwweGRhLDB4ZDQsCisgIDB4Y2UsMHhjMiwweGYxLDB4NjQsMHg1ZCwweDU0LDB4NGEsMHgyMCwweDFmLDB4N2MsMHgwMCwweGNkLDB4YWQsMHg2MiwweDE1LDB4YmIsCisgIDB4MTAsMHhjZiwweGM0LDB4M2YsMHhiNCwweGM5LDB4MGUsMHgyYiwweDRmLDB4ODQsMHg1NywweGI0LDB4MGEsMHhiNCwweGZlLDB4NmMsCisgIDB4MjcsMHgxNSwweDg2LDB4NGYsMHg3OCwweDE3LDB4Y2UsMHhjNiwweDNmLDB4NTksMHhiZCwweDkxLDB4NzQsMHhmMywweDNlLDB4ZmMsCisgIDB4MDQsMHgxNSwweDVhLDB4ZTksMHgzZiwweGU0LDB4ZDYsMHg3ZiwweGI4LDB4NWMsMHhmNywweDE3LDB4MGYsMHg4MCwweDRmLDB4MTUsCisgIDB4YWEsMHgyYSwweDQ0LDB4MDIsMHg0MiwweGE0LDB4NjIsMHg1NywweDc5LDB4YjgsMHg0MiwweGZjLDB4YjMsMHgyOSwweGU3LDB4YWYsCisgIDB4NzksMHhmZiwweDQ1LDB4ZjgsMHg2NywweDljLDB4ODQsMHgyNSwweDQwLDB4MWEsMHg3MSwweDgxLDB4ZmIsMHhhZiwweGJmLDB4YjAsCisgIDB4ZmQsMHg3ZCwweGRiLDB4ZDAsMHg3ZiwweGE0LDB4MzQsMHg3MSwweGZjLDB4OTIsMHgwMSwweDQyLDB4MGUsMHhmZSwweDcxLDB4ZGMsCisgIDB4N2YsMHg1ZCwweDg0LDB4NzcsMHhhYywweGY5LDB4NmYsMHhjMCwweGQ1LDB4ODYsMHg4MSwweDhmLDB4NDMsMHg0YiwweDU0LDB4N2EsCisgIDB4OWYsMHhhZCwweDQ3LDB4YzcsMHgwYiwweGYwLDB4MGYsMHhkNywweDY1LDB4NDIsMHhjZSwweGI4LDB4YzEsMHgzZiwweDQyLDB4MGMsCisgIDB4ZTksMHhjOCwweDE4LDB4ZTEsMHg5MSwweDAyLDB4NWQsMHhmOSwweGZjLDB4YzMsMHgxMywweGZlLDB4ZDksMHg2NSwweGQxLDB4Y2UsCisgIDB4NzYsMHhjNiwweGE3LDB4Y2UsMHg5NSwweDYzLDB4YzcsMHhhOCwweGJmLDB4ZWQsMHg0MiwweDE1LDB4MjksMHhiYywweDFkLDB4MmUsCisgIDB4ZmQsMHg4NywweGYwLDB4Y2YsMHg3NiwweDhiLDB4NzYsMHgxZSwweDAxLDB4ZWYsMHg4ZCwweGMyLDB4YzMsMHg0NiwweDYwLDB4ODMsCisgIDB4NzQsMHg5YSwweGNmLDB4N2EsMHhlNCwweGU0LDB4OWYsMHg2MSwweDZiLDB4ZmYsMHhjNywweGUwLDB4NjgsMHg2NCwweDg1LDB4ODksCisgIDB4MzEsMHhjNiwweGI2LDB4MWYsMHgxNiwweDdjLDB4NzAsMHhkYywweGE1LDB4ZmYsMHgzMCwweDdkLDB4MGUsMHhkYSwweGU5LDB4YTUsCisgIDB4ZjcsMHg2NSwweGVjLDB4NzAsMHg3NiwweDQ0LDB4MjgsMHhhNCwweGZmLDB4YzgsMHgzNiwweDZkLDB4OWUsMHg5NiwweDUzLDB4ZDAsCisgIDB4MDgsMHg3ZiwweDQ5LDB4ZWYsMHg5NywweDUzLDB4YzYsMHg4ZCwweDY0LDB4MmUsMHhmZSwweDRlLDB4ZmUsMHg2OSwweDUwLDB4YjIsCisgIDB4OTAsMHgzMywweGM5LDB4M2QsMHhhOCwweDUzLDB4ZmQsMHhjNywweGQzLDB4ODAsMHg3NiwweGMwLDB4OTIsMHgxZSwweDBmLDB4MjUsCisgIDB4YzYsMHgwZiwweGRkLDB4ZmMsMHhmMywweDU3LDB4NGEsMHhmNiwweDUwLDB4YmMsMHgxMSwweDhkLDB4MGYsMHgxOSwweDg1LDB4NWEsCisgIDB4YTQsMHhkZiwweDRmLDB4ZDAsMHhjOSwweDVmLDB4MTMsMHg2NywweGU0LDB4MWYsMHg3YSwweDQ4LDB4ZDMsMHg2OCwweDI3LDB4NTcsCisgIDB4YWIsMHg5MSwweGQzLDB4NTcsMHg0NSwweGRlLDB4NWYsMHhjOCwweGZjLDB4MWYsMHhhMywweDc5LDB4OTYsMHg5MCwweDliLDB4Y2YsCisgIDB4M2YsMHgwNiwweGU0LDB4OGMsMHhjMiwweDZiLDB4ZjgsMHg4NiwweGE4LDB4NzAsMHg4OSwweDlkLDB4MGYsMHhhZiwweDc1LDB4YWMsCisgIDB4NGEsMHgwNiwweGQ2LDB4MGIsMHhmMywweDBiLDB4ZjEsMHg0ZiwweDdmLDB4YWUsMHg4OSwweGZmLDB4OTEsMHgyMywweGM2LDB4MzMsCisgIDB4NjYsMHg3ZiwweGM3LDB4NjUsMHg3YiwweDBhLDB4ZjIsMHg0ZiwweGY1LDB4MTcsMHhjNiwweGI3LDB4MzUsMHhjOCwweGIyLDB4MTcsCisgIDB4YzgsMHg2YiwweGZiLDB4NTIsMHhiZCwweDZkLDB4MmIsMHg2ZCwweDViLDB4ZjQsMHhmZSwweGViLDB4ZmQsMHg1YywweGZmLDB4NzIsCisgIDB4ZjIsMHg0ZiwweGFmLDB4ZmEsMHgxYiwweGIyLDB4YzksMHg3MiwweGIyLDB4N2YsMHg1MiwweDc2LDB4OTYsMHg2YiwweDllLDB4MmQsCisgIDB4MTYsMHhjZiwweGRjLDB4MWMsMHhhYiwweDJhLDB4YzQsMHgzZiwweGJkLDB4ZDksMHhiNywweGIzLDB4OGEsMHgwYywweDNjLDB4MmUsCisgIDB4ZDcsMHg4NiwweGY5LDB4MGMsMHgyZCwweDUzLDB4ZGMsMHg2MiwweDVjLDB4YmEsMHgzNSwweDU3LDB4YWYsMHg5YywweGZjLDB4OTMsCisgIDB4ODIsMHg4NywweDRjLDB4MzUsMHhlMywweDI4LDB4YzQsMHhhMywweGJlLDB4MzQsMHgwOSwweDYzLDB4YjYsMHhiZiwweGQ3LDB4ZTcsCisgIDB4MWEsMHhiZCwweDgzLDB4N2YsMHg4YSwweGZhLDB4YWQsMHgyNiwweGEyLDB4YzMsMHg3ZSwweGI1LDB4NGUsMHgxNywweDNmLDB4NWIsCisgIDB4OWIsMHgyZCwweDliLDB4ODMsMHhiOSwweGZlLDB4ZTUsMHhiOCwweGZmLDB4MjIsMHhiNSwweGMzLDB4MWMsMHhiYywweGY2LDB4YjQsCisgIDB4ZjIsMHhhNSwweGZhLDB4MWYsMHg2MSwweDY5LDB4MjAsMHgzZSwweDllLDB4MWQsMHg4OSwweDE3LDB4ZTIsMHgxZiwweDkyLDB4MjIsCisgIDB4OWYsMHg1OCwweGZkLDB4ZWUsMHgyZCwweDU4LDB4MTYsMHgyNSwweDQ2LDB4M2QsMHgyZCwweGUzLDB4MDMsMHg2NSwweGVkLDB4NmMsCisgIDB4MzMsMHg5ZSwweDgyLDB4YWIsMHhhNywweGYzLDB4NGYsMHgwNywweGY3LDB4ZWQsMHg3MCwweGI2LDB4NDksMHhiZCwweGMyLDB4NzUsCisgIDB4NmIsMHhkZSwweDhkLDB4MDIsMHhiZCwweDM4LDB4MzYsMHgxNCwweDg5LDB4NDQsMHhhZSwweGZmLDB4ZWEsMHgwZSwweGZkLDB4NDcsCisgIDB4NTEsMHhiMiwweGVhLDB4YzQsMHgxOSwweGE1LDB4N2IsMHhiYiwweDk3LDB4MWEsMHg0ZiwweGQzLDB4NjksMHg2YSwweDc2LDB4ZmUsCisgIDB4YzIsMHg3YywweGZlLDB4MDEsMHg0MywweGZkLDB4OTgsMHgxYiwweDIyLDB4NDEsMHhhMywweGVmLDB4NWYsMHhhNCwweDNmLDB4NzYsCisgIDB4MTksMHhjNCwweDI4LDB4YzgsMHhkZiwweGU2LDB4MGEsMHhmMCwweDhmLDB4MTgsMHg5NSwweGNmLDB4NWIsMHg0ZSwweGJkLDB4MGUsCisgIDB4ODcsMHhkNCwweDc1LDB4OTksMHgzNSwweDQ5LDB4ZWEsMHgyNiwweDk0LDB4NmQsMHgzMSwweGZhLDB4Y2IsMHg4YSwweDNjLDB4ZmUsCisgIDB4ZjksMHg0ZSwweGMyLDB4NTIsMHgzMywweGQyLDB4OWUsMHhjZiwweDA5LDB4OWEsMHgxMCwweDYzLDB4OGIsMHg5YiwweDdmLDB4ZGMsCisgIDB4ZjcsMHg1ZiwweDkzLDB4ZWMsMHhiZCwweDcwLDB4MzksMHhiNiwweDRjLDB4MjcsMHhhMCwweDc4LDB4YWYsMHg4YiwweDlmLDB4ZjMsCisgIDB4ZWYsMHhiZiwweDgyLDB4YTcsMHgwOSwweGU0LDB4MDQsMHg2MSwweDEwLDB4N2IsMHhlOSwweGY3LDB4N2YsMHg2YywweGVjLDB4YzksCisgIDB4ZGQsMHg3ZiwweDM5LDB4ZWEsMHg4ZiwweGRkLDB4OGYsMHhkYSwweDYwLDB4MTAsMHg5MSwweGYzLDB4MDUsMHhhOCwweGFkLDB4MDAsCisgIDB4ZWYsMHhlNSwweGU5LDB4M2YsMHgyNCwweDY4LDB4YzUsMHgwMSwweDE4LDB4MWMsMHg1ZSwweGE0LDB4OTEsMHhmNSwweDAzLDB4MmUsCisgIDB4ZmUsMHg3NCwweGRjLDB4N2YsMHg1NSwweDY3LDB4M2YsMHhmNCwweGQwLDB4ZDUsMHg5YiwweGU1LDB4MGMsMHg2ZSwweGQ0LDB4YTQsCisgIDB4YmUsMHg5MiwweGNkLDB4ZDMsMHhmOSwweDUwLDB4MjgsMHg3MCwweGZmLDB4NjUsMHg0NCwweDgzLDB4YTAsMHhmMSwweDBiLDB4OWEsCisgIDB4ODQsMHg0YiwweDJlLDB4Y2YsMHg3ZSwweGZmLDB4NDUsMHgxNiwweDY5LDB4YTQsMHhjNywweDcwLDB4MDIsMHhjNiwweDU1LDB4NjIsCisgIDB4M2MsMHg5NywweDRiLDB4NGIsMHgzYiwweGRmLDB4MWMsMHhmYywweGMzLDB4OTksMHhiYiwweDVkLDB4ZmIsMHgzMiwweDlhLDB4YTgsCisgIDB4MWEsMHhkNCwweDQ4LDB4M2UsMHhjYywweDI5LDB4YjAsMHg3ZiwweDI3LDB4ZmYsMHhkMCwweDY4LDB4OTAsMHhiMCwweDM0LDB4OTEsCisgIDB4NjgsMHgyNCwweDY1LDB4NWUsMHgxMywweDUwLDB4YjYsMHhlYywweDE0LDB4YmUsMHhmZiwweDcyLDB4ZjAsMHhjZiwweDI5LDB4ZTYsCisgIDB4ZjksMHg3NCwweGFkLDB4ZGUsMHgxZCwweGM5LDB4NjEsMHg4MCwweGFkLDB4ODcsMHg5YywweGNjLDB4ZDMsMHg3ZiwweDFhLDB4NGMsCisgIDB4YjUsMHg0NywweGE3LDB4ODYsMHg4ZiwweDE1LDB4ZjMsMHhiZSwweGZmLDB4NTMsMHg0MCwweGZmLDB4ZDEsMHgwYywweGVjLDB4ZjksCisgIDB4OTQsMHg0NiwweGUzLDB4MzQsMHhlYiwweDhlLDB4NGYsMHg0MSwweGZlLDB4OTksMHg4MCwweDBjLDB4Y2QsMHg0NiwweGNjLDB4YmEsCisgIDB4ZTMsMHg1MywweDkwLDB4N2YsMHhlOCwweGRiLDB4MTMsMHhmZCwweGZlLDB4MGYsMHhkYSwweGViLDB4N2EsMHg5ZiwweDJhLDB4YzQsCisgIDB4M2YsMHhjNSwweGE3LDB4ZTAsMHgxNywweGRhLDB4MDIsMHhkZCwweDUzLDB4NTMsMHhjMCwweGRmLDB4ODIsMHhmYywweDMzLDB4YzIsCisgIDB4M2YsMHg4YiwweDE1LDB4NGQsMHgwOCwweGM0LDB4N2EsMHg1YywweGY5LDB4NTYsMHg5MCwweDdmLDB4YzYsMHhlMSwweDMzLDB4N2MsCisgIDB4MzcsMHgyZSwweDFmLDB4NDMsMHhmZSwweGRjLDB4YzgsMHhjYywweGZhLDB4NGYsMHhhNywweGY1LDB4ZjYsMHhkZCwweGMxLDB4YmEsCisgIDB4YmYsMHgwZiwweGUzLDB4ZTYsMHgxZiwweGE2LDB4OTcsMHhmNiwweDNiLDB4OGQsMHhmNCwweDQ3LDB4ZjksMHhmYSwweGQ5LDB4ZjUsCisgIDB4OWYsMHhhYywweGM4LDB4YjAsMHhjYiwweDUwLDB4MWIsMHhiYywweDZhLDB4YjcsMHgwMywweDYzLDB4MGEsMHhlOSwweDNmLDB4OWMsCisgIDB4ZjksMHhiNCwweGQ0LDB4NzgsMHhjYSwweDJmLDB4YTQsMHg3ZiwweGQxLDB4YzcsMHhjYywweGZjLDB4ZmQsMHgxZiwweDNlLDB4ZmIsCisgIDB4ZmQsMHgxZiwweDUyLDB4N2YsMHhhOCwweGZhLDB4MDEsMHhhYSwweDUwLDB4ZTMsMHg3MSwweGViLDB4MjEsMHgwZSwweGZlLDB4MjksCisgIDB4MzUsMHhmNSwweDlmLDB4MzIsMHhkMywweGJiLDB4MTUsMHhjYywweDRlLDB4MmMsMHgyOCwweDJlLDB4N2YsMHgzZiwweGNlLDB4ZjEsCisgIDB4NGYsMHhiNSwweDQzLDB4Y2QsMHg3OCwweDk5LDB4MTgsMHgzYiwweGRmLDB4MmUsMHhhMCwweDZmLDB4MzgsMHhmOSwweDI3LDB4Y2IsCisgIDB4MDMsMHg2OSwweDk2LDB4ZGUsMHg3ZiwweDExLDB4NjMsMHgzNCwweGVlLDB4NzMsMHhlYiwweDQ1LDB4NmUsMHhmZCwweGM3LDB4NTAsCisgIDB4N2IsMHg0OCwweGU5LDB4MTEsMHgzYSwweDY3LDB4ZDUsMHg3ZiwweDgwLDB4MWIsMHg3NiwweDc5LDB4ZDcsMHg1YSwweDQwLDB4ZWYsCisgIDB4MmEsMHhhMCwweGZmLDB4NjQsMHhhMywweGI3LDB4N2IsMHhkNiwweGVmLDB4ZmYsMHhlYywweGFmLDB4ZWEsMHg5YiwweGVlLDB4ZGQsCisgIDB4YmEsMHgzZCwweGRkLDB4MWIsMHgwZCwweGQ5LDB4YzcsMHhiMSwweDdmLDB4ZTQsMHhiYSwweGZmLDB4Y2EsMHhjZSwweGVmLDB4MjcsCisgIDB4ODYsMHhjYywweGY2LDB4YjksMHhlMiwweDUzLDB4OTAsMHg3ZiwweDY4LDB4YjQsMHgxYiwweDQxLDB4OGEsMHhiMywweDQ5LDB4NTcsCisgIDB4ZmMsMHhmMywweGVmLDB4YmYsMHg0OCwweGI3LDB4ZDIsMHgwOSwweDg0LDB4M2MsMHhhNiwweDEyLDB4ZmUsMHgxOSwweDQ3LDB4ZmUsCisgIDB4MmIsMHhlYiwweDNmLDB4OWEsMHhmMCwweGZmLDB4ZWMsMHg1ZCwweDZmLDB4NzAsMHgxYywweDQ1LDB4NzYsMHhlZiwweDlkLDB4MWQsCisgIDB4Y2IsMHg2MywweDY5LDB4YTUsMHgxZCwweGRiLDB4MTIsMHgyNSwweDYyLDB4ZTMsMHg1YiwweGFmLDB4MDUsMHhhNywweGEzLDB4ZDYsCisgIDB4NmIsMHg1OSwweDBhLDB4M2UsMHhmZSwweDA4LDB4NjksMHgyYywweGE4LDB4OTQsMHg4YywweDU1LDB4ZTUsMHgyZCwweGMyLDB4MDcsCisgIDB4OTIsMHhhMiwweGE4LDB4MmQsMHhjYSwweDFmLDB4OWMsMHgyYSwweDFkLDB4NTEsMHgyNSwweGY5LDB4ZTAsMHhiYSwweDIzLDB4NjYsCisgIDB4MmMsMHgwYiwweDIyLDB4NjMsMHg1ZCwweGQwLDB4MDEsMHg5NywweDM4LDB4MDksMHhhMSwweGQ2LDB4MmUsMHg3ZiwweDMwLDB4NTcsCisgIDB4YWUsMHg4YSwweDY0LDB4NjMsMHg2MywweGQ5LDB4MTcsMHhkZCwweDU4LDB4MDgsMHg0ZSwweDE4LDB4NjMsMHg5NCwweDQwLDB4MTEsCisgIDB4MDMsMHgyZSwweDZlLDB4MjEsMHgyMiwweDI3LDB4NDAsMHhlNywweDA4LDB4NjMsMHgxYiwweGRiLDB4YzgsMHg3NiwweGJhLDB4N2IsCisgIDB4YTYsMHhiYiwweDVmLDB4Y2YsMHhmNCwweGVjLDB4OGUsMHg4ZiwweDRhLDB4OGEsMHhhYSwweGEwLDB4NGYsMHhhZiwweDc2LDB4YmIsCisgIDB4ZDYsMHhkMywweGNmLDB4MzMsMHhlZiwweGZkLDB4ZTYsMHhmNywweDdlLDB4ZWYsMHg3NSwweDBhLDB4M2YsMHgxZCwweDQzLDB4MGUsCisgIDB4MGUsMHg0NCwweDRiLDB4YjUsMHhlMCwweGYzLDB4NzIsMHhkYywweDVmLDB4ZmYsMHg3MiwweGZlLDB4ODksMHgzYywweGFkLDB4M2YsCisgIDB4NzcsMHhmMCwweGYzLDB4ZWIsMHgyOCwweGY4LDB4OTMsMHg2OSwweDU4LDB4ZmYsMHg3MiwweDQxLDB4NGUsMHg2NywweGZjLDB4NDMsCisgIDB4ZmQsMHhiYywweDdkLDB4MDcsMHgzNiwweDE2LDB4YmYsMHg2MCwweDk2LDB4ZTUsMHg3ZiwweGRjLDB4ZmEsMHhkNywweDhkLDB4MzEsCisgIDB4NmMsMHgyMCwweDk1LDB4ZmUsMHg0NywweDYzLDB4ZmUsMHhiMSwweGU2LDB4NWQsMHhiNSwweDY4LDB4OTIsMHhkYSwweDE0LDB4NmIsCisgIDB4YjMsMHhhZSwweGQ4LDB4M2YsMHg5YywweDRhLDB4OWUsMHg1MiwweGYwLDB4M2YsMHg5MywweGI1LDB4M2UsMHhmZSwweDg3LDB4NWMsCisgIDB4ZTQsMHg1MiwweDc0LDB4OTAsMHhjNCwweDlmLDB4ZmMsMHhiNiwweDg3LDB4NGEsMHhkNCwweGJmLDB4NmMsMHhmNCwweGJjLDB4NDksCisgIDB4M2YsMHhiNCwweGI0LDB4YTUsMHhiMSwweDgzLDB4ZTgsMHg2NiwweDY3LDB4YzksMHgwMywweDhhLDB4NzgsMHgyNSwweGQ1LDB4YmYsCisgIDB4M2MsMHg3ZiwweDU2LDB4MjQsMHhkMCwweGIwLDB4OTEsMHg3MiwweDk2LDB4ZDQsMHgwYiwweDM3LDB4NzIsMHhlMywweDNkLDB4NWYsCisgIDB4ZmQsMHg4YiwweGVlLDB4MzcsMHg4MywweDJlLDB4ZDksMHgzOCwweDdlLDB4ZjYsMHhjNSwweGY3LDB4MDUsMHhmNCwweDJkLDB4YzcsCisgIDB4MDEsMHgxZiwweGVlLDB4MzksMHg2MSwweDBmLDB4ZmUsMHhmNiwweDUyLDB4MGUsMHgxYiwweDgzLDB4NTUsMHhkZCwweDAxLDB4ZmYsCisgIDB4NGMsMHhmOSwweGY5LDB4MWYsMHgyMiwweGUzLDB4OWMsMHgyMywweGVmLDB4MjMsMHhjNCwweDlmLDB4YWQsMHg4MSwweDc4LDB4MmUsCisgIDB4ZjAsMHhkMiwweDMxLDB4YmQsMHhkYiwweDRkLDB4NTIsMHg3YiwweDdhLDB4NjcsMHhmNCwweDExLDB4MWIsMHgyNywweGIyLDB4ODEsCisgIDB4YTcsMHg4MiwweGY5LDB4MGIsMHhkNCwweGJmLDB4YmMsMHg3YywweDg3LDB4NmYsMHhhYSwweDE5LDB4MzQsMHhkMiwweDhmLDB4OGQsCisgIDB4YmQsMHg4YSwweDdjLDB4MTcsMHhlMCwweDdmLDB4ZGMsMHhmYiwweDBkLDB4MWIsMHhjNywweDI4LDB4ZGUsMHgyZSwweGMxLDB4ZmYsCisgIDB4MTgsMHg1ZSwweDM2LDB4MTksMHgyNCwweGZiLDB4ZDUsMHhhOCwweDkxLDB4MDksMHhkNCwweDQzLDB4OGIsMHg3ZSwweGZlLDB4YzcsCisgIDB4NDksMHgxNiwweGUzLDB4NzMsMHhjNiwweDc5LDB4YjYsMHhmMSwweDQ4LDB4ZjgsMHhlNywweDJhLDB4YzIsMHhmNywweDRmLDB4MTEsCisgIDB4N2YsMHhjYiwweGVmLDB4OWYsMHhiOSwweGQ0LDB4NWIsMHgyMSwweGY1LDB4MmYsMHgwMiwweDcyLDB4NjYsMHhlYywweDExLDB4ODIsCisgIDB4N2YsMHhhZSwweDcwLDB4ZmMsMHhiMywweGU4LDB4NGQsMHhlZCwweDBkLDB4YWYsMHhmZSwweDU1LDB4YzEsMHhlYiwweDVmLDB4ZjMsCisgIDB4YmEsMHgwYywweGI2LDB4M2IsMHhmYywweGEyLDB4ZDEsMHhlMCwweGMwLDB4ZmQsMHg4ZSwweGVmLDB4N2UsMHgzNiwweGE0LDB4ZmUsCisgIDB4ZTUsMHg3YSwweDBmLDB4ZmYsMHhiZSwweDQzLDB4ODUsMHg0MCwweGRlLDB4MjcsMHg1MywweDY5LDB4MGYsMHg5YSwweGNlLDB4MGEsCisgIDB4N2MsMHg1MiwweDA3LDB4ZjMsMHhhZiwweDRkLDB4ZDEsMHg2MCwweDI2LDB4YzYsMHhkYywweDYyLDB4N2QsMHgxMCwweDUyLDB4ZmYsCisgIDB4OTIsMHhiYywweGMxLDB4OGQsMHgwYiwweDVhLDB4OTgsMHhmZSwweGQ5LDB4YTksMHhlMSwweGRlLDB4NmUsMHhkYSwweDI2LDB4ZjIsCisgIDB4N2IsMHhjYSwweDgzLDB4ZWUsMHg1ZiwweDQ4LDB4ZjUsMHhhZiwweGNmLDB4ZjksMHhmZiwweGJlLDB4OTksMHg3NSwweDc2LDB4Y2MsCisgIDB4OGEsMHhlYiwweDNmLDB4YzMsMHhmOCwweDlmLDB4MGIsMHg4MSwweGZhLDB4OTcsMHg4YiwweDc2LDB4MmMsMHhlYywweDhkLDB4ZGIsCisgIDB4ODQsMHg3ZiwweDNlLDB4NjEsMHhmYywweGNmLDB4MmMsMHhjZiwweDc3LDB4YTQsMHhmZSwweDI1LDB4NTcsMHg3ZiwweDAwLDB4MGQsCisgIDB4ZjIsMHgyZSwweGUzLDB4N2YsMHhlNiwweGI4LDB4ZmUsMHg3MywweDlkLDB4OTEsMHhiMCwweGJlLDB4NzQsMHhkNSwweDNlLDB4MDQsCisgIDB4ZWQsMHgyYywweDI1LDB4NjgsMHg4NywweGUxLDB4OWYsMHg3YiwweGM2LDB4NTMsMHg5YywweGZmLDB4NjEsMHhlYiwweGFkLDB4MWIsCisgIDB4ODEsMHg3ZiwweDA4LDB4OTAsMHg3ZSwweGZhLDB4ZmMsMHgwZSwweGVlLDB4MWYsMHg0ZSwweDI0LDB4NGUsMHhmMiwweGY4LDB4ZjAsCisgIDB4MGIsMHg4OCwweDdmLDB4MmUsMHhhMywweGU2LDB4NjMsMHhjOSwweGZkLDB4ZjEsMHgxOSwweDcxLDB4N2YsMHg3YSwweGZlLDB4MTksCisgIDB4MTMsMHhmOCwweGU3LDB4NjcsMHg1MiwweGI0LDB4M2MsMHgyOCwweDg1LDB4OTEsMHhkMywweGY4LDB4NTUsMHhlYiwweDBlLDB4OGEsCisgIDB4N2YsMHgzOCwweGJlLDB4YjIsMHhhZCwweDE3LDB4MGMsMHg4MCwweDc2LDB4OTYsMHgxNywweGFiLDB4N2UsMHg1YywweGMxLDB4NjEsCisgIDB4Y2YsMHg0OSwweGNkLDB4ZGIsMHhlZiwweDg0LDB4MGEsMHhmZiwweGNjLDB4YTAsMHgwMywweDc2LDB4ODMsMHg3OCwweGFjLDB4NzYsCisgIDB4NjAsMHgyMywweGVkLDB4NTEsMHg5MSwweGVmLDB4MjMsMHgzNSwweGZlLDB4MzEsMHg5YiwweDI1LDB4ZDgsMHg3MywweDA5LDB4MWQsCisgIDB4NjcsMHhmOCwweDg3LDB4NWQsMHgzZiwweGE4LDB4N2YsMHg2MSwweDIzLDB4MjcsMHhhNywweDIxLDB4MjIsMHg4NCwweGJlLDB4ZDMsCisgIDB4YzUsMHgzZiwweGVjLDB4ZmEsMHgwMSwweGZmLDB4NDMsMHg2OCwweDgxLDB4NjYsMHgyYiwweGY5LDB4MDcsMHhiNCwweDNlLDB4MDIsCisgIDB4ODksMHgwMiwweDgyLDB4N2YsMHhkOCwweGY1LDB4MDMsMHhmZSwweDY3LDB4MGEsMHg2ZCwweDM3LDB4ODgsMHhmZSwweGI5LDB4NDMsCisgIDB4ZTAsMHg5ZiwweGQ0LDB4ZjYsMHgxMiwweGZjLDB4Y2YsMHgxNCwweGU1LDB4N2YsMHhkNiwweDAzLDB4YmMsMHgzNCwweDZlLDB4N2EsCisgIDB4ZWIsMHg0ZiwweGYyLDB4ZmIsMHgwZCwweDA5LDB4ZmUsMHhlNywweDU1LDB4ZmMsMHg3MiwweDQ4LDB4ZjUsMHhjZiwweGUyLDB4MTMsCisgIDB4Y2QsMHhlMywweDQzLDB4OGUsMHhjZiwweDYzLDB4Y2IsMHg0MSwweGZkLDB4OGIsMHhmMywweDNmLDB4MDQsMHhmZiwweGFjLDB4NjEsCisgIDB4OWYsMHhmOCwweGY4LDB4OWYsMHg1MywweDM3LDB4ODksMHhmZCwweDZhLDB4ZTcsMHhkMSwweDI4LDB4YzYsMHgwMywweDIyLDB4YWQsCisgIDB4OWYsMHhmNywweDhjLDB4YzUsMHhmZSwweGZhLDB4OTcsMHhhNywweDhlLDB4M2UsMHg0ZiwweGQ0LDB4ZDEsMHg5MywweGRiLDB4ZjgsCisgIDB4MjcsMHhlZiwweGEyLDB4MDAsMHhmZiwweGIzLDB4ZDksMHgyYywweGVhLDB4MDAsMHhlZCwweGVjLDB4MjYsMHhmOCwweDg3LDB4YzMsCisgIDB4OWUsMHhmZiwweGI0LDB4MTksMHhmZiwweGMzLDB4ZTMsMHg4ZiwweDAxLDB4ZWEsMHg1ZiwweGE5LDB4MTEsMHhiYiwweDUxLDB4MDIsCisgIDB4NDIsMHhhZiwweGE2LDB4YjYsMHgzMiwweGZkLDB4MzMsMHhmMywweGJmLDB4ODQsMHg3ZiwweDhlLDB4MTIsMHgzZSwweDhkLDB4MTgsCisgIDB4NzcsMHhiOCwweDA4LDB4OTMsMHhmYiwweGYzLDB4MzUsMHhiZSwweGJlLDB4NTAsMHgwNywweGFlLDB4OWYsMHhhOCwweGJiLDB4ZTcsCisgIDB4MDMsMHgxOCwweGYzLDB4NWIsMHgyNywweGMwLDB4ZmYsMHg0YywweDRiLDB4ZmMsMHg4ZiwweGMzLDB4OGMsMHg5OCwweGU3LDB4MzEsCisgIDB4ZWYsMHhhYiwweGIzLDB4MjEsMHhmOCwweGM3LDB4NmUsMHg4ZSwweDZkLDB4ODAsMHhmNywweDliLDB4ZWQsMHhmOSwweDdmLDB4Y2MsCisgIDB4NTcsMHhmZiwweGYyLDB4ZDAsMHhjZSwweDIxLDB4YjQsMHhkYiwweDA1LDB4NDIsMHhkZSwweDI3LDB4OTcsMHhkMCwweDUzLDB4YTEsCisgIDB4ZjgsMHhhNywweGM5LDB4M2MsMHhhMSwweGVmLDB4MjcsMHhlZiwweDBiLDB4YjcsMHhmNywweGYyLDB4MjcsMHhlOCwweDI0LDB4NmIsCisgIDB4NTQsMHg3OSwweDQzLDB4YzUsMHhmZiwweDljLDB4YjYsMHg0NywweDBkLDB4ODIsMHgxZiwweDdhLDB4YzksMHhmMywweDViLDB4NGQsCisgIDB4MTksMHhhMSwweDk0LDB4NTcsMHhjOCwweDJlLDB4ZjIsMHhmOCwweGIwLDB4YjcsMHg3ZiwweDE5LDB4NDMsMHgzYiwweGJmLDB4YjEsCisgIDB4MmYsMHhkOCwweGFiLDB4ODksMHhmZSwweDk5LDB4Y2IsMHg3ZSwweDNlLDB4YjQsMHg3ZSwweGVkLDB4N2UsMHhmNSwweDcxLDB4NTAsCisgIDB4ZmYsMHhlMywweGM2LDB4OTMsMHgzNiwweGU3LDB4ZTksMHgwMiwweDEyLDB4NjksMHg0ZSwweDYzLDB4ZjgsMHg0NywweGJjLDB4ZmYsCisgIDB4MzIsMHhmYywweDgzLDB4ZjMsMHg5NywweDc5LDB4Y2UsMHg2ZSwweDI5LDB4NTYsMHhmZCwweDQ5LDB4OTUsMHg5YiwweGJmLDB4ZGUsCisgIDB4YmEsMHhiOCwweGUyLDB4MDIsMHg2YiwweGU0LDB4MTEsMHhmYywweDhjLDB4YTcsMHhmZiwweDcxLDB4YTMsMHhjZCwweDQxLDB4MTMsCisgIDB4NWYsMHg3ZiwweDJlLDB4Y2UsMHg3NywweDc0LDB4Y2EsMHhmMiwweGFlLDB4ZmYsMHhiMywweDBhLDB4YjYsMHgxZSwweDM5LDB4NGIsCisgIDB4MGQsMHhiZSwweGZlLDB4OTcsMHg2OCwweDE3LDB4NWUsMHgyZiwweGYwLDB4ZGUsMHhiYiwweGFjLDB4NzAsMHgxZiwweGE4LDB4N2YsCisgIDB4YjksMHg2MSwweDY3LDB4ODgsMHhmOCwweGQzLDB4MDQsMHhmOSwweDlkLDB4YzUsMHg3MywweDExLDB4YWYsMHhmNiwweGQ2LDB4ZjEsCisgIDB4ZmQsMHhjZSwweGExLDB4YjMsMHg2ZSwweGZmLDB4MDgsMHhjZiwweDJmLDB4NmYsMHhiMiwweGY4LDB4ZjksMHg5OSwweGJmLDB4ZmUsCisgIDB4ZTUsMHhmOSwweDI3LDB4MzUsMHg0YSwweGQ2LDB4MGIsMHhmZiwweDMwLDB4NjEsMHg4NiwweDU0LDB4ZmYsMHgzMiwweDc4LDB4M2MsCisgIDB4YmYsMHg4YSwweDdlLDB4ZTgsMHgyNCwweDFkLDB4MjgsMHhmMywweDc4LDB4Y2IsMHgzNSwweDI2LDB4MDAsMHhmZiwweGQzLDB4MmQsCisgIDB4ZjIsMHhlZiwweDExLDB4ZmIsMHg1NiwweDY3LDB4YzcsMHg0MCwweDJmLDB4ZDcsMHhmZiwweDE0LDB4ZDEsMHg4ZSwweDc5LDB4ZjQsCisgIDB4YWIsMHg2OSwweGE4LDB4ZmYsMHg4MSwweGViLDB4NmYsMHg3MSwweDc2LDB4ZjQsMHg2YiwweDMzLDB4MzEsMHg5NiwweGFmLDB4Y2QsCisgIDB4MWQsMHhhMSwweGY4LDB4ODcsMHhmOCwweGU3LDB4MDgsMHg4OSwweGM2LDB4NjgsMHgxMSwweGQ3LDB4ZmYsMHg0YywweDMzLDB4ZmYsCisgIDB4OGMsMHhmMSwweGY4LDB4ODMsMHg3ZSwweDBhLDB4ZDAsMHhkZCwweDExLDB4NzQsMHg4MywweGYzLDB4MzQsMHhkYiwweDZmLDB4ZDUsCisgIDB4MTAsMHhjZSwweDQ3LDB4YzQsMHgzZiwweDFiLDB4ODYsMHgxNiwweDNiLDB4NDIsMHhmZiwweDUzLDB4MGQsMHhkMiwweDNhLDB4ZWQsCisgIDB4ZGYsMHg3MSwweDU0LDB4ZjgsMHg2NywweDJiLDB4ZjMsMHgyNywweGM3LDB4M2YsMHgxMywweGYxLDB4YWIsMHhmYSwweGI1LDB4ODYsCisgIDB4MTYsMHgwOSwweDM2LDB4ODcsMHhmMywweDNmLDB4ODQsMHhmNiwweDM5LDB4ODMsMHgwZSwweDRmLDB4YTYsMHgyNSwweGRhLDB4MjcsCisgIDB4OWMsMHhmZiwweGIxLDB4YWEsMHgxYSwweGI1LDB4MTMsMHhkOCwweDJkLDB4MjksMHgwOSwweGU2LDB4ODUsMHhmMywweDNmLDB4MzksCisgIDB4ODIsMHhhZiwweGYwLDB4NmIsMHg2YywweDVhLDB4ODIsMHg5MSwweGUxLDB4ZmEsMHg5ZiwweDllLDB4NjQsMHgzZiwweDcxLDB4NGIsCisgIDB4NDcsMHhiMywweDA0LDB4MGIsMHgzOSwweDdlLDB4MGUsMHhkNCwweGJmLDB4NzIsMHgxNCwweDE2LDB4Y2UsMHg5OSwweGJmLDB4NTIsCisgIDB4MDMsMHgyMSwweDNmLDB4ZmYsMHg4MywweDgzLDB4MTIsMHhmZSwweDdkLDB4ZmQsMHgyNywweDU2LDB4ODgsMHhkZSwweDBjLDB4ZDYsCisgIDB4YmYsMHgzMiwweDJlLDB4ZmIsMHhiNywweDEzLDB4ZGYsMHhhOCwweGMzLDB4YmUsMHhjYiwweDBlLDB4ZTUsMHg3ZiwweDQ4LDB4NWIsCisgIDB4OWMsMHhjMiwweDJkLDB4YTUsMHhmOCwweDlmLDB4MDcsMHgzMSwweDFlLDB4MzgsMHhlOCwweGEzLDB4NDEsMHg0MiwweGY5LDB4MWYsCisgIDB4MGMsMHg3MiwweDRjLDB4ODIsMHg3ZiwweGFjLDB4ZDYsMHgwOSwweDQ4LDB4ZmIsMHg4NCwweGYzLDB4M2YsMHhjOCwweDg1LDB4Y2QsCisgIDB4NjYsMHgwOCwweDUwLDB4MGMsMHhmMCwweDNmLDB4YzUsMHhjNCwweGEwLDB4YzIsMHgyZCwweDI1LDB4ZjgsMHgxZiwweDIzLDB4NDcsCisgIDB4ZTIsMHg4ZiwweGVmLDB4MzUsMHgyYSwweDk0LDB4ZmYsMHg1OSwweDU1LDB4MzQsMHgxZSwweGVjLDB4MDgsMHg2ZSwweDMzLDB4OWMsCisgIDB4ZmYsMHhiOSwweGRmLDB4YjgsMHgwMSwweDdiLDB4NmYsMHhkOCwweDBlLDB4ZjEsMHhhNywweDlmLDB4ZmYsMHg2OSwweDJmLDB4MjQsCisgIDB4NjYsMHgzMCwweGVjLDB4YjksMHg5YSwweGM4LDB4ZGEsMHg0ZiwweDAzLDB4ZmMsMHg0MywweDhjLDB4YWMsMHg5MiwweGZmLDB4ZDEsCisgIDB4ZmYsMHhjNSwweGE1LDB4N2QsMHg2YSwweDY0LDB4ZmMsMHg1MywweGEyLDB4ZmUsMHhmNSwweDBjLDB4NGUsMHg3MywweDVmLDB4ZTgsCisgIDB4Y2QsMHg2YiwweGUxLDB4NmIsMHg3ZSwweGI4LDB4ZmUsMHg4NywweGIxLDB4MGQsMHhiYiwweDI1LDB4ZGEsMHhhMSwweGE0LDB4ZmUsCisgIDB4YTcsMHhkNCwweDdhLDB4NzUsMHhmZCwweDBiLDB4MGQsMHhjNywweDgyLDB4ZmQsMHg1ZiwweGUxLDB4ZmEsMHgxZiwweGIyLDB4YmIsCisgIDB4NjYsMHhmNSwweDdlLDB4NDEsMHhmZCwweDhiLDB4ZTIsMHg5ZiwweGJiLDB4MjksMHg5ZiwweGEzLDB4NWYsMHhiMywweGU0LDB4NmQsCisgIDB4MmEsMHhmOSwweDFmLDB4ZDIsMHhmZiwweGQ1LDB4YjYsMHgzNiwweDgxLDB4ZDcsMHg5YiwweDk3LDB4OGMsMHg2NiwweGY1LDB4ZmEsCisgIDB4YTAsMHhmZSwweGM3LDB4MjAsMHgzMiwweDZjLDB4OGEsMHg3ZiwweGQ0LDB4ZmQsMHg1ZiwweDcyLDB4ZmQsMHgyYiwweDRiLDB4NjQsCisgIDB4MDYsMHg2NCwweDc3LDB4YTEsMHhmYiwweGY1LDB4ZjEsMHgzZiwweDFkLDB4OGQsMHhhZSwweDhjLDB4M2MsMHhiZCwweDU2LDB4ZWQsCisgIDB4NGYsMHg0OSwweGZmLDB4ODMsMHhhZiwweDNmLDB4OTcsMHg3OCwweDhlLDB4YzAsMHgzNiwweDJiLDB4ZTQsMHhmYSwweDAzLDB4ZjUsCisgIDB4YWYsMHg3NSwweGVlLDB4ZmQsMHg1MCwweDA4LDB4ZjEsMHg0ZiwweDgwLDB4ZmYsMHgzMSwweDVkLDB4NmYsMHg1YiwweDIxLDB4ZmUsCisgIDB4ZjcsMHhlYiwweDdmLDB4MzIsMHg2ZSwweDkxLDB4ZjIsMHgwOCwweGMxLDB4M2YsMHg4MCwweGY2LDB4MjksMHhjNSwweGZmLDB4YjgsCisgIDB4MzQsMHg0NSwweGVhLDB4OTgsMHhmMiwweDc5LDB4NTEsMHhlMSwweDFmLDB4MGMsMHg3YiwweDBlLDB4YTAsMHhlNSwweDRlLDB4OTksCisgIDB4ZmUsMHgyZiwweDVlLDB4ZmYsMHhjMiwweGIwLDB4YzcsMHhmOCwweDhhLDB4ZTAsMHgxZiwweDQwLDB4ZmIsMHg5NCwweGUyLDB4N2YsCisgIDB4NGEsMHhjNiwweDEzLDB4YmYsMHhmZSwweGE3LDB4N2QsMHgyYSwweDc5LDB4NGEsMHhkYiwweDYyLDB4ZmQsMHg2YSwweGYwLDB4ODAsCisgIDB4M2EsMHg3ZiwweDA1LDB4ZjQsMHgzZiwweDA0LDB4ZjYsMHgzYywweDg0LDB4NWUsMHg2ZSwweDVhLDB4YWQsMHg4ZSwweDNmLDB4YjIsCisgIDB4ZmUsMHg4NywweDE0LDB4ZjUsMHg5NiwweDRjLDB4NmEsMHgxOCwweDA4LDB4NjksMHgzNywweGIzLDB4NjUsMHhiMiwweGRlLDB4M2IsCisgIDB4ODAsMHg3ZiwweGNlLDB4MmUsMHhhOSwweGFkLDB4ZTgsMHhkMiwweDBmLDB4MGMsMHg4NiwweGU0LDB4M2IsMHg1OSwweGZmLDB4ZjMsCisgIDB4MzksMHg2YSwweDFiLDB4NGIsMHhkNiwweDEyLDB4ZDgsMHg2MywweDkxLDB4ZjcsMHg3NywweDZkLDB4YzYsMHhhZCwweDM4LDB4YTgsCisgIDB4ZmIsMHhiZiwweDIwLDB4ZmUsMHhmOSwweDNhLDB4MTUsMHhlMiwweDlmLDB4ODAsMHhmZSwweDg3LDB4ZTgsMHhlYiwweDVhLDB4NzEsCisgIDB4YjQsMHg2ZiwweDUxLDB4YzcsMHg3MywweDI3LDB4ODgsMHg3ZiwweDA2LDB4MzUsMHg5MiwweDg4LDB4NDksMHhmZSwweGVkLDB4NTAsCisgIDB4ZTgsMHg5OSwweDAzLDB4ZjgsMHhhNywweGQyLDB4YWQsMHg3NiwweDg1LDB4ZTQsMHg2YiwweDA1LDB4ZmUsMHgzMSwweDI5LDB4Y2QsCisgIDB4NTgsMHgwYywweGMzLDB4MDMsMHhkYywweGZkLDB4YWUsMHhmZSwweGM3LDB4YTksMHgxOSwweGE0LDB4YjAsMHhkMCwweDlmLDB4ZGYsCisgIDB4YzMsMHhmNCwweDNmLDB4NGUsMHgzMiwweGE3LDB4ZDgsMHg2NiwweDM5LDB4ZmUsMHhlNywweDFhLDB4ZTEsMHg3ZiwweDg4LDB4MGMsCisgIDB4ODYsMHhmNywweDdmLDB4MDUsMHhmOCwweDFmLDB4ZGIsMHgwYywweGEwLDB4OWQsMHg4ZSwweDZiLDB4OTYsMHhhYiwweDA4LDB4NGEsCisgIDB4Y2YsMHhkOCwweGE0LDB4MTEsMHhiZSwweDI2LDB4YTQsMHhmZSwweGM1LDB4OGQsMHg4MSwweGQ4LDB4YjMsMHg4YywweDExLDB4ZGEsCisgIDB4MTYsMHg4MiwweDdmLDB4N2MsMHg2ZSwweGFjLDB4ZjIsMHgwYywweDkzLDB4OTQsMHgxYSwweDJiLDB4MTUsMHhmOCwweDg3LDB4NzksCisgIDB4NjMsMHg4ZCwweDZiLDB4MzAsMHhiZCwweDljLDB4ZjksMHg0NiwweDA5LDB4ZmQsMHgwZiwweGYxLDB4YzYsMHhmNywweDIyLDB4ZTIsCisgIDB4MWYsMHhjOSwweGRiLDB4OTksMHhkNCwweDA3LDB4NWEsMHgxOSwweGZjLDB4MDMsMHhhZSwweDdmLDB4M2YsMHg3ZSwweDVmLDB4ODgsCisgIDB4ODAsMHg3ZiwweDgwLDB4N2YsMHgxMiwweGU4LDB4NTksMHhjZSwweDYwLDB4OTQsMHhhYSwweDdmLDB4YTEsMHg5NywweGZiLDB4NTYsCisgIDB4N2UsMHg4YywweDhkLDB4NjUsMHg1NiwweDA0LDB4ZmMsMHg4MywweGQxLDB4OGUsMHhmZSwweGE1LDB4ZDYsMHgzYSwweDllLDB4NmMsCisgIDB4NWEsMHg5MSwweGIwLDB4ZGUsMHgyZSwweDViLDB4ZmYsMHgxMiwweGRlLDB4ZTgsMHg4OSwweDVmLDB4YjksMHhmNywweDFhLDB4NWEsCisgIDB4MTUsMHhhNSwweGZlLDB4NzUsMHgxNCwweDZkLDB4YzEsMHg2OCwweDVjLDB4ZDAsMHgzZSwweDY1LDB4ZWIsMHg1ZiwweDMxLDB4ZGEsCisgIDB4NmQsMHhmYSwweGQzLDB4MTIsMHhmZCwweGVmLDB4OTIsMHhmZSwweGU3LDB4ZTUsMHhkZSwweDk1LDB4YzUsMHgxZCwweDliLDB4NmYsCisgIDB4ZjksMHhkMCwweGZlLDB4OWIsMHhiZSwweGYyLDB4ZjUsMHgyZiwweGFmLDB4YWQsMHg2MCwweDA5LDB4YmUsMHhkZiwweGZjLDB4ZjMsCisgIDB4MTYsMHg2ZSwweDA5LDB4YTksMHg3ZiwweDMxLDB4YTMsMHg1NCwweGZmLDB4YmIsMHhjNCwweGZmLDB4YzQsMHg2OCwweDIxLDB4MmMsCisgIDB4NTgsMHg4ZiwweDUwLDB4ZWEsMHg3ZiwweGE2LDB4NWMsMHgxOSwweDBjLDB4MTEsMHg4YSwweGJjLDB4MWUsMHgxMSwweGZmLDB4YzQsCisgIDB4NjgsMHhmZiwweGY1LDB4MjcsMHhjNiwweDdiLDB4NTEsMHhmMSwweGNmLDB4YTMsMHg2ZSwweGUxLDB4NmMsMHg3YiwweDQ0LDB4ZmMsCisgIDB4ZTMsMHgxYSwweDI3LDB4OTgsMHg0MiwweGU2LDB4ZDUsMHg3MCwweGZjLDB4YzMsMHhiYiwweGJkLDB4MjgsMHhmZiwweGUwLDB4ZWYsCisgIDB4M2YsMHhmMiwweGUzLDB4MWYsMHg3OSwweDc3LDB4OWYsMHg5NCwweGMxLDB4M2YsMHhlMCwweDViLDB4YWEsMHgxNywweDNhLDB4NTcsCisgIDB4NzgsMHgxZCwweDVmLDB4NzYsMHgzNSwweGM0LDB4M2YsMHhiYSwweDFmLDB4ZmYsMHhiOCwweDY4LDB4MjcsMHg0NiwweDhkLDB4OGYsCisgIDB4ZDAsMHgyOSwweGY3LDB4OTMsMHg4ZiwweDZkLDB4ZjcsMHhhYiwweGQ4LDB4ZGYsMHg0YSwweGY4LDB4ODcsMHhlZCwweDc3LDB4MDEsCisgIDB4MzUsMHg5YSwweGQyLDB4ZTMsMHg2OCwweDZiLDB4MmMsMHg2MywweDJkLDB4MzAsMHg0OSwweDQ3LDB4NTgsMHg3OCwweGZkLDB4YWIsCisgIDB4YzIsMHhmMywweGE3LDB4MmIsMHgwNCwweDkyLDB4ZmQsMHhmOSwweDI0LDB4OGYsMHgwZiwweDgwLDB4ZmYsMHg5OSwweGQyLDB4MmYsCisgIDB4NjksMHg5ZSwweDllLDB4ZTcsMHg3NSwweGI0LDB4NDUsMHhiYSwweGZlLDB4NjksMHhlNCwweGMzLDB4M2YsMHg2YywweGJmLDB4Y2IsCisgIDB4OTgsMHhiMSwweGE1LDB4N2MsMHhmZCwweGFiLDB4ZTAsMHgwZCwweDIyLDB4MTAsMHhiNCwweDhmLDB4YzAsMHgzZiwweGZjLDB4ZmUsCisgIDB4OTcsMHhmOCwweDlmLDB4MjMsMHg1YSwweGI2LDB4NzAsMHgxZiwweGU5LDB4NjcsMHg3YywweGFhLDB4M2MsMHhmZSwweDY5LDB4NzIsCisgIDB4Y2IsMHg1ZSwweGUzLDB4MzcsMHgzNiwweGY1LDB4NzIsMHg5YSwweDQyLDB4ZDQsMHhiZiwweDc0LDB4MTUsMHhmZiwweDQzLDB4OGMsCisgIDB4NjIsMHg1NSwweDhlLDB4ZDIsMHhiNiwweDY1LDB4ZjEsMHhjZiwweGU2LDB4ZjgsMHgwYiwweGQ0LDB4YTgsMHhkZSwweDE0LDB4M2YsCisgIDB4ODksMHg3ZSwweDVkLDB4MWUsMHhmZiwweGQwLDB4ZTgsMHhhMSwweGI1LDB4M2EsMHgzNSwweDgwLDB4ZGYsMHhiOCwweDFhLDB4OGEsCisgIDB4N2YsMHgwMCwweGRhLDB4MzksMHhiNSwweGY4LDB4MDIsMHg3YSwweGJjLDB4M2MsMHhmZSwweGExLDB4NTcsMHhiYiwweGYwLDB4NDcsCisgIDB4MTMsMHg1NSwweDBmLDB4NzgsMHhmZCwweGVmLDB4MGIsMHhjOCwweDI3LDB4YmYsMHg3NSwweGJmLDB4ZmEsMHg1YywweGMyLDB4M2YsCisgIDB4MTIsMHgzYSwweDVhLDB4OTIsMHgwZiwweGY2LDB4Y2IsMHg4NywweGYxLDB4M2YsMHhkNCwweDQwLDB4NWUsMHg3ZiwweGY3LDB4MDIsCisgIDB4ZDAsMHhkZiwweDE0LDB4ZDAsMHgzZiwweDgzLDB4NjgsMHgwOSwweGY2LDB4M2IsMHg1NywweDBlLDB4ZmYsMHgxMCwweGEzLDB4NmYsCisgIDB4M2UsMHhmOCwweGU0LDB4NzMsMHgzNSwweGZlLDB4YjksMHg4YiwweDQ3LDB4ZWYsMHg3YywweGQyLDB4ODksMHg5ZiwweDY3LDB4NjEsCisgIDB4ZmMsMHhiMSwweDEyLDB4ZjgsMHhjNywweGNiLDB4NTYsMHg1NiwweGNkLDB4ODAsMHgzNiwweDY1LDB4OTcsMHhjMywweDNmLDB4YjcsCisgIDB4MTIsMHhiZCwweDBhLDB4ZmQsMHg3NiwweGEyLDB4NmEsMHgyNywweGZlLDB4ZGYsMHg4ZiwweDgwLDB4N2YsMHgzYywweGZmLDB4NTgsCisgIDB4OTUsMHhlNiwweGEyLDB4ODksMHgzMiwweGY4LDB4ZTcsMHhhOCwweDg0LDB4MDYsMHg2ZCwweGExLDB4ZjcsMHhlZSwweDJlLDB4ODEsCisgIDB4N2YsMHhiYywweGZkLDB4NWEsMHgzNSwweDRlLDB4MmMsMHhkOCwweGJmLDB4MDMsMHhmMCwweDRmLDB4OWQsMHg1NCwweGZmLDB4YmEsCisgIDB4YWIsMHg3MywweDQwLDB4YzksMHhmZiwweGM0LDB4YjgsMHhmZiwweDIxLDB4ZmUsMHgzOSwweDZjLDB4YTcsMHhiYiwweDhjLDB4MjgsCisgIDB4ZmMsMHg0ZiwweGEzLDB4YmIsMHhiYiwweGZkLDB4ZTgsMHhkNiwweDhlLDB4NDYsMHgzNSwweGRlLDB4ZTMsMHhmYSwweGU3LDB4NzksCisgIDB4MDAsMHhmZiwweDFjLDB4NDYsMHhlOSwweGJjLDB4NTEsMHg4NiwweGZmLDB4ODEsMHhmOSwweGY3LDB4NTIsMHhhZSwweDMxLDB4OWYsCisgIDB4NTAsMHhlMSwweGMzLDB4MzAsMHhmYywweDYzLDB4YjcsMHhhMywweDcyLDB4ZjgsMHgwNywweDgxLDB4ZmIsMHhmMywweGUyLDB4YmQsCisgIDB4NmQsMHg1NiwweDAyLDB4ZTIsMHgyYiwweDA1LDB4ZmUsMHhhOSwweDAzLDB4ZjgsMHg2NywweGM4LDB4YzksMHg3NiwweDM2LDB4NDYsCisgIDB4ZTQsMHg3ZiwweDI4LDB4NWYsMHhlYSwweDM2LDB4MGUsMHg5YywweDYwLDB4ZjgsMHhhNywweDhjLDB4ZmUsMHgwNywweDFkLDB4MWEsCisgIDB4NWIsMHhiOSwweGE5LDB4MzMsMHgyMiwweGZmLDB4NDMsMHhkMCwweGNlLDB4NmMsMHg2NywweDliLDB4OTUsMHgyMSwweGM2LDB4ZGIsCisgIDB4ZWUsMHgyMCwweDIwLDB4MTUsMHhmZSwweGE5LDB4MTYsMHhmZSwweDIxLDB4YzQsMHg2OSwweDY3LDB4MzQsMHhmZSwweGM3LDB4ZjMsCisgIDB4M2YsMHg4ZSwweGRlLDB4ODgsMHhiOSwweGE1LDB4YTYsMHgzYywweGZlLDB4NzksMHgwOSwweGFkLDB4NDQsMHg0NiwweDE0LDB4ZmUsCisgIDB4YzcsMHhkYiwweGRkLDB4NDEsMHg3YiwweDU1LDB4ZGUsMHg4OCwweGM0LDB4ZmYsMHg3OCwweGZlLDB4ZWMsMHhjOCwweDllLDB4MzMsCisgIDB4YTIsMHhmMCwweDNmLDB4MWUsMHhkYSwweGI5LDB4NWEsMHg2OCwweDFmLDB4Y2MsMHhmOCwweGY4LDB4OWYsMHgxMCwweGZjLDB4ZTMsCisgIDB4OTYsMHgyMSwweDNhLDB4ZGEsMHhiNCwweDBkLDB4MTEsMHhmOSwweDFmLDB4OWEsMHhkZCwweDFhLDB4YjEsMHhmZiwweGFmLDB4ODcsCisgIDB4ZmYsMHg2OSwweGEwLDB4MzIsMHhlNiwweGViLDB4ZTAsMHg3ZiwweGIyLDB4OWQsMHhjYSwweGY1LDB4YTEsMHhmYywweDRmLDB4MjYsCisgIDB4ZDcsMHg3OCwweDVkLDB4ZmMsMHg0ZiwweDFiLDB4MWEsMHg4OCwweGMyLDB4ZmYsMHg3OCwweGJiLDB4YmIsMHgxMiwweGJiLDB4M2IsCisgIDB4MTcsMHg4MSwweGZmLDB4MTEsMHhlYiwweDUxLDB4N2IsMHhjZSwweDg4LDB4YzYsMHhmZiwweDU0LDB4MTEsMHgzYywweDMwLDB4NGQsCisgIDB4MWEsMHhlMSwweGNiLDB4ZjMsMHgzZiwweGVlLDB4YTYsMHgzYSwweDg4LDB4OTEsMHhjZCwweDE5LDB4OTEsMHhmOCwweDFmLDB4ZTIsCisgIDB4YjQsMHgzZCwweGIxLDB4MTcsMHg1MywweGQ5LDB4MGUsMHhiNSwweDNmLDB4ZmQsMHhmZCwweDVmLDB4ZWUsMHhkNSwweDhlLDB4YWMsCisgIDB4NmIsMHhjZCwweDI1LDB4MjIsMHhmMSwweDNmLDB4ZGUsMHhiNywweGJkLDB4NmQsMHg3ZiwweDExLDB4OGQsMHhmZiwweGYxLDB4YmMsCisgIDB4NmQsMHhiNSwweDk5LDB4MzUsMHg1MSwweGY4LDB4OWYsMHhhYywweGJkLDB4ODMsMHhhMCwweDlkLDB4NTEsMHhiNCwweGFhLDB4ZGYsCisgIDB4ODgsMHhjOCwweGZmLDB4OTAsMHhhNywweDYzLDB4ZDgsMHhjOCwweGU0LDB4MmEsMHg1NSwweGNmLDB4OGIsMHg1MiwweGZmLDB4N2MsCisgIDB4MWEsMHgxZCwweGQ0LDB4NTcsMHgzYSwweGNhLDB4ZTcsMHg1NywweDg5LDB4N2YsMHgzZSwweDQ0LDB4ZTcsMHhlZCwweGQ2LDB4N2MsCisgIDB4NGQsMHg0NCwweGZlLDB4ODcsMHhjNiwweDEzLDB4OWQsMHhmNiwweDdmLDB4OTUsMHhlNCwweDdmLDB4NDAsMHhmZSwweGQyLDB4NWIsCisgIDB4OWYsMHg1OSwweDlkLDB4ZTIsMHhmOSwweGFiLDB4M2EsMHgxNCwweGZmLDB4N2MsMHhjNSwweGFmLDB4M2YsMHg3NywweDliLDB4YTEsCisgIDB4YmEsMHg3ZSwweDE0LDB4ZTgsMHhmZiwweGYyLDB4ZDYsMHhjNywweGJmLDB4YWYsMHg4ZSwweDU3LDB4NzAsMHhmZSwweDBmLDB4MDUsCisgIDB4MzksMHgyZSwweDhkLDB4MzYsMHg2YywweDM1LDB4MjAsMHg2NSwweGJlLDB4ODMsMHhmYSwweGU3LDB4N2QsMHhiNCwweDQ4LDB4ZTEsCisgIDB4NzYsMHg3MywweDlmLDB4YmEsMHhhNSwweDRmLDB4OTksMHhiZiwweDQyLDB4ZjAsMHgwZiwweGJlLDB4NWIsMHg4NiwweGNhLDB4ZjEsCisgIDB4M2YsMHhjOCwweDBkLDB4ZGEsMHgzNSwweGIzLDB4NTQsMHhmZiwweGQzLDB4NjIsMHgyNywweGNhLDB4ZjAsMHgzZiwweGI1LDB4MDIsCisgIDB4ZmYsMHhlOCwweGMzLDB4NjMsMHg4ZCwweDdiLDB4ZmQsMHhmOSwweGViLDB4MTYsMHgzNSwweGZmLDB4ZTMsMHg3ZSwweDZiLDB4M2YsCisgIDB4NTIsMHhlYywweDU3LDB4ZjIsMHg0NSwweDEyLDB4ZmUsMHhlMSwweGQ5LDB4NmQsMHg0NCwweGJmLDB4ZDUsMHhmMSwweGM3LDB4ZTcsCisgIDB4MDYsMHgzNSwweGZmLDB4ZTMsMHhlZCwweGI3LDB4ZDksMHhjOSwweDk0LDB4ZTEsMHg3ZiwweDQwLDB4ZmQsMHg0YiwweDNmLDB4N2YsCisgIDB4MWQsMHhmYywweGNmLDB4MjksMHg1NywweGY2LDB4OWMsMHg0YSwweDc0LDB4YzYsMHhkYiwweGNjLDB4MDgsMHhmOCwweDY3LDB4NjcsCisgIDB4M2MsMHg4YiwweDhlLDB4ZjYsMHg2NiwweDUzLDB4OTUsMHg3YiwweGEzLDB4ZTksMHg5ZiwweDA3LDB4YjUsMHgyZSwweDdjLDB4NjMsCisgIDB4NjQsMHg3MSwweDQyLDB4NTAsMHhlOCwweGViLDB4ZTQsMHhmZSwweDJmLDB4OGYsMHg3ZiwweGEzLDB4OGUsMHg2ZCwweGFhLDB4N2MsCisgIDB4NGUsMHgwYiwweDMwLDB4NDIsMHgxZCwweDBhLDB4ZmUsMHhjNywweDhjLDB4OTMsMHg0MSwweDQ5LDB4YWQsMHhhOSwweDJlLDB4NTcsCisgIDB4M2YsMHhiNiwweDQ1LDB4OWEsMHgwZiwweGEwLDB4YzAsMHgzZiwweDllLDB4MmMsMHgwYSwweDI1LDB4OGIsMHgwMiwweDA2LDB4ODcsCisgIDB4ZjAsMHgzZiwweDFmLDB4YjgsMHg3YywweDJjLDB4N2QsMHgzMCwweDczLDB4NGEsMHg3ZCwweDZmLDB4MzgsMHhmZiwweDYzLDB4NTUsCisgIDB4YTUsMHg2MiwweGRkLDB4NjIsMHg3ZSwweDQyLDB4YTksMHhmYSwweDE3LDB4NzUsMHg4YiwweDhkLDB4ZGYsMHgxNywweDgyLDB4N2EsCisgIDB4YjAsMHg5MCwweGZhLDB4MTcsMHg2ZCwweDg0LDB4OWYsMHhhOSwweGEwLDB4MTMsMHgxMSwweGM5LDB4ZDgsMHg5ZiwweDUwLDB4ZmMsCisgIDB4OTMsMHgyMSwweGZlLDB4YzEsMHhiZiwweGFmLDB4M2QsMHg4NiwweDM2LDB4OTgsMHg3MSwweDU3LDB4MTEsMHgxNCwweDgyLDB4N2YsCisgIDB4NmUsMHg4MiwweGZlLDB4ODksMHgzZCwweDZlLDB4MjcsMHhmZiwweDJkLDB4MWEsMHhmZSwweGYxLDB4ZjgsMHg2YSwweDNiLDB4ZDksCisgIDB4NWYsMHg1YSwweGZmLDB4MWMsMHg2MywweGZjLDB4MzMsMHg4OSwweDFlLDB4ZGEsMHg0YSwweGJiLDB4MmEsMHhhZiwweGQwLDB4NGYsCisgIDB4MDIsMHhmYywweDYzLDB4YmUsMHgyMCwweGVkLDB4OTcsMHhjYywweDNiLDB4OGEsMHhhYSwweDdmLDB4YzYsMHg0NiwweGY3LDB4NDQsCisgIDB4NTUsMHhhYiwweGMyLDB4OWYsMHhhMSwweGZjLDB4NGYsMHhiYiwweDlkLDB4MmMsMHhlZSwweDg4LDB4YTQsMHg3ZiwweDE2LDB4YjIsCisgIDB4ZTcsMHg2ZCwweDQ1LDB4YjQsMHgzOSwweDMyLDB4ZmYsMHg2MywweDI1LDB4NzcsMHg1ZSwweDRmLDB4ZmQsMHg4YiwweDE0LDB4NTIsCisgIDB4YWYsMHgwYiwweGZmLDB4ODQsMHhjYywweGViLDB4MmIsMHhjOSwweGZmLDB4OTQsMHhjNCwweDNmLDB4ZjMsMHhmMiwweDgxLDB4NmMsCisgIDB4NWIsMHgxMiwweGZmLDB4MzAsMHgzYywweDMwLDB4MTksMHhmNywweDFhLDB4ZGIsMHg3MywweDUxLDB4ZjEsMHgwZiwweDk1LDB4M2QsCisgIDB4YWYsMHhkZCwweDMwLDB4NDksMHg4NSwweDM0LDB4ZTUsMHhmMSwweDhmLDB4OTYsMHhhMiwweDQ2LDB4MGQsMHgzMywweDI4LDB4ZmUsCisgIDB4OTksMHgwZSwweGM1LDB4M2YsMHg4MywweDllLDB4ZWMsMHg1OSwweDE4LDB4ZTUsMHhmMCwweDhmLDB4ZmIsMHgxZiwweDUxLDB4MjksCisgIDB4ZTksMHhjZiwweDVmLDB4YTQsMHg0NiwweDg3LDB4MDIsMHhmZiwweGQ0LDB4YmIsMHg5NywweDlkLDB4YWIsMHhmYSwweDNiLDB4YzUsCisgIDB4ZjUsMHgyYiwweGYwLDB4Y2YsMHhmMywweGFlLDB4ZWMsMHhiOSwweDkzLDB4MTYsMHhjMiwweDIyLDB4ZWIsMHg5ZiwweDQzLDB4OGMsCisgIDB4MjAsMHhmZSwweGYxLDB4ZDAsMHg0ZSwweDBkLDB4MTksMHhkNCwweDEzLDB4MTksMHhmZiwweDUwLDB4MDMsMHhlOCwweDdmLDB4NGEsCisgIDB4ZTEsMHg5ZiwweGNkLDB4ZWMsMHg2OSwweGRkLDB4MTgsMHgwZCwweGZmLDB4ZjQsMHgyOCwweDYwLDB4NGYsMHg1OSwweGZlLDB4ODcsCisgIDB4ZjEsMHhmOSwweDY1LDB4ZWIsMHg1ZiwweDI0LDB4NDksMHhiNSwweGIxLDB4NDQsMHhhNiwweGE4LDB4N2YsMHhlOSwweDEwLDB4ZmYsCisgIDB4NzgsMHg0MywweDBlLDB4MWYsMHgyMiwweDZkLDB4NWMsMHg0NCwweGQ4LDB4NWMsMHhiYSwweGZlLDB4ZTUsMHhlZCwweDc3LDB4NTYsCisgIDB4MTEsMHhhNiwweDRhLDB4ZjEsMHgzZiwweGI3LDB4YmIsMHg2ZCwweDNlLDB4ZWYsMHhhOCwweGViLDB4NWYsMHgzYywweDNlLDB4NzAsCisgIDB4ZmUsMHhlNywweDMwLDB4OTMsMHg5NSwweDE2LDB4MTQsMHhmYSwweDhkLDB4Y2YsMHg4MywweGZhLDB4NjcsMHhlZSwweDhkLDB4YmQsCisgIDB4OGIsMHg1ZCwweDYzLDB4YmUsMHhmYiwweDQ5LDB4NTYsMHg1ZCwweGZmLDB4OWEsMHhlZiwweDQ1LDB4ZWYsMHgzMSwweDIyLDB4MGMsCisgIDB4OTYsMHhlMywweGY5LDB4ODYsMHhkOSwweDE1LDB4OGUsMHhlNSwweGU3LDB4N2YsMHhkNiwweGYxLDB4NmMsMHg1NSwweGU4LDB4OGQsCisgIDB4NTIsMHhmZiwweGEyLDB4ZGYsMHhkMiwweDQ2LDB4YjAsMHhjMSwweDhhLDB4MTksMHgyMywweGIwLDB4NWUsMHg2NywweGY3LDB4MDMsCisgIDB4ZTMsMHg3ZiwweGM0LDB4NzQsMHgyOSwweDQ0LDB4MGMsMHhiZCwweDVjLDB4ZmQsMHgwYiwweGIyLDB4NWIsMHg5MSwweGYwLDB4NGYsCisgIDB4OGYsMHhhYSwweGZlLDB4MTUsMHgyYiwweDUxLDB4ZmYsMHg5YSwweGJmLDB4MDUsMHhjZCwweDk5LDB4MmQsMHg0ZCwweDg5LDB4ODgsCisgIDB4ZmEsMHgxZiwweGNhLDB4ZmYsMHg1OCwweDY5LDB4NWIsMHhjOSwweGZmLDB4Y2MsMHg3MiwweGZmLDB4MzcsMHhjMiwweGZhLDB4ZDcsCisgIDB4OTAsMHg5OSwweDM2LDB4OTQsMHhlZiwweGUzLDB4YTEsMHhmYSwweGU3LDB4ZGQsMHgwNSwweDU0LDB4OWEsMHhmZiwweDQxLDB4NzQsCisgIDB4ZmUsMHhiMCwweDg3LDB4MmUsMHg0NiwweGVjLDB4YTYsMHg2NiwweDVkLDB4ZTksMHgxZiwweDdlLDB4ZmQsMHhiYiwweDRjLDB4YzAsCisgIDB4ZmYsMHhlMCwweGY4LDB4NmMsMHhhZiwweDUyLDB4ZTIsMHg0MywweDkwLDB4N2YsMHhjNSwweGYzLDB4YTgsMHg1ZiwweDRhLDB4ZGMsCisgIDB4OTksMHg1MiwweGUyLDB4NzMsMHhhMSwweDdmLDB4NjYsMHhmZCwweDVmLDB4MmUsMHg3ZiwweDk1LDB4NDgsMHhmNywweDI5LDB4ZjksCisgIDB4MmIsMHhhMSwweDdmLDB4NzYsMHgyMCwweDFmLDB4NzgsMHhjNCwweDRlLDB4MmQsMHg1NCwweGJlLDB4N2YsMHhjZCwweGYyLDB4ZGIsCisgIDB4MjEsMHg4ZiwweDIwLDB4ZmYsMHg2MywweGFmLDB4MjgsMHg1NCwweGFhLDB4ZjgsMHg5MCwweDM5LDB4YmUsMHg1ZSwweGUyLDB4N2YsCisgIDB4Y2UsMHhhMiwweGMzLDB4N2EsMHg4ZCwweDUyLDB4ZmYsMHg1MywweGMxLDB4ZDYsMHg1YiwweDRiLDB4MjEsMHgzZiwweDY2LDB4ZmUsCisgIDB4ZWIsMHgxMywweGQ1LDB4NWYsMHgyOCwweGYxLDB4MGYsMHhkYiwweGFmLDB4MDEsMHhmOSwweDlmLDB4YWYsMHhlZCwweDY2LDB4YTQsCisgIDB4OGUsMHg1NywweDQyLDB4ZmYsMHgwOSwweGY5LDB4MWYsMHhkYSwweDdmLDB4NTEsMHg5YSwweGZmLDB4NDEsMHg5MCwweGZmLDB4MzksCisgIDB4ZDAsMHhiZiwweGJjLDB4NDksMHhhOSwweGZmLDB4ODEsMHhmYSwweDY3LDB4MTAsMHhjZiwweGY3LDB4NWIsMHhlOSwweDA3LDB4OTUsCisgIDB4ZjEsMHhlNywweDdkLDB4ODEsMHg3ZiwweDc0LDB4ODYsMHg3ZiwweDcwLDB4ZDAsMHhiZSwweDhhLDB4YmUsMHgxYywweDRhLDB4MmEsCisgIDB4ZjksMHgxZiwweGYxLDB4ZmIsMHg1MiwweDNlLDB4ZWEsMHgwYywweGM5LDB4NDcsMHg0MiwweDRmLDB4ZWIsMHhjZSwweDdmLDB4MTYsCisgIDB4N2EsMHhkNywweGRjLDB4MDksMHgyNSwweGZmLDB4YzMsMHhkNywweGRiLDB4YmEsMHhjOCwweGI2LDB4ZTYsMHg4OCwweDFkLDB4YzYsCisgIDB4ZmYsMHhiMCwweGYwLDB4YzMsMHhmYiwweGJmLDB4ZjgsMHg3NCwweGJlLDB4ZmUsMHgzMiwweGZjLDB4NGYsMHgyZCwweGM0LDB4M2YsCisgIDB4NTYsMHgyNiwweDhjLDB4MGYsMHg2MSwweGJmLDB4Y2YsMHhmYSwweGJmLDB4ZTgsMHhlZSwweDJlLDB4YTMsMHg2NSwweGE0LDB4ZWQsCisgIDB4M2QsMHhiOCwweDVmLDB4ZDEsMHhmZiwweDc1LDB4MTgsMHhmMiwweDIxLDB4ZDcsMHhhYywweDc2LDB4ZWIsMHg2OSwweGQ1LDB4N2UsCisgIDB4Y2YsMHhmMCwweGY4LDB4NzMsMHg3YiwweDFkLDB4ZjAsMHhjZiwweDVmLDB4MWIsMHgyZCwweDZhLDB4M2QsMHhjYywweDE5LDB4ZmUsCisgIDB4ZmMsMHhkNiwweDIzLDB4YTAsMHg3ZiwweGJlLDB4ODgsMHhkMiwweGM2LDB4MTIsMHgxNSwweGZmLDB4MjMsMHhmNCwweGM5LDB4OTYsCisgIDB4ZGUsMHgwNywweDc2LDB4NjcsMHgxNCwweDNhLDB4OTQsMHg3OCwweGVmLDB4ZGYsMHg2MywweDZjLDB4N2QsMHhiZCwweGJlLDB4MDcsCisgIDB4YTIsMHg5ZCwweDc0LDB4ODgsMHg5ZSwweDhhLDB4M2YsMHhlZiwweGRlLDB4ZmMsMHg0MywweDhmLDB4ZmYsMHgxOSwweDZjLDB4YzYsCisgIDB4ZGYsMHhhYSwweGY4LDB4MWYsMHg3ZSwweDNkLDB4ZDMsMHg1MiwweGZmLDB4OTcsMHhkZCwweGQ2LDB4YTMsMHhkYywweGVmLDB4NjUsCisgIDB4ODEsMHg2NywweDEwLDB4YjgsMHhkZiwweGE2LDB4YWQsMHg2NiwweGM0LDB4ZmQsMHg1ZiwweGFkLDB4YzQsMHgzZiwweDg2LDB4MGUsCisgIDB4ZjAsMHhjZiwweGU4LDB4ZTQsMHg4YSwweDVkLDB4NGEsMHhmZSwweDY3LDB4OGMsMHgzZiwweDVkLDB4YzYsMHhjZiwweGMxLDB4ZjMsCisgIDB4MzIsMHg4MiwweDUyLDB4NWIsMHg3OSwweDdjLDB4ODYsMHg4MSwweDI4LDB4ZDgsMHhmZiwweDQ1LDB4OWYsMHhkNiwweDQzLDB4YzYsCisgIDB4ZjIsMHg0NywweDQyLDB4ZjgsMHgxMCwweDc2LDB4YmYsMHgzNSwweGQ2LDB4NzMsMHhmZCwweGYzLDB4ODcsMHhmYSwweGRjLDB4OTMsCisgIDB4MmQsMHgxZiwweDI1LDB4MTgsMHhlYywweGE5LDB4MDYsMHhmOCwweGU3LDB4MzgsMHg4ZiwweDNmLDB4OTIsMHhmZSwweGY5LDB4MjIsCisgIDB4MWEsMHgyZCwweGM3LDB4ZmYsMHhlNCwweGY1LDB4NTEsMHg5MSwweGFkLDB4ZTYsMHhlYywweDk2LDB4ODYsMHhlNCwweDI1LDB4NDUsCisgIDB4ZmUsMHg5YSwweDE0LDB4N2EsMHg2MywweDA0LDB4ZjQsMHhjZiwweDJmLDB4ZDUsMHgyZiwweGVmLDB4NTIsMHhjNSwweDlmLDB4NDUsCisgIDB4OWYsMHg4OSwweGU3LDB4NTEsMHhmMCwweDNmLDB4Y2YsMHhhMywweGU3LDB4ZDAsMHg3MiwweDZiLDB4N2QsMHg0ZiwweDQ1LDB4NzAsCisgIDB4YmYsMHhhZiwweDU5LDB4ZmMsMHg3ZSwweGFiLDB4NzUsMHhkZiwweGVlLDB4ZTMsMHgzNCwweGRmLDB4MzksMHhhOSwweDllLDB4MWQsCisgIDB4YWEsMHhmOCwweDMzLDB4MDksMHhmMCwweGFhLDB4YmIsMHhkZiwweGVmLDB4MGQsMHhjNSwweGY2LDB4YTEsMHgyMywweDgzLDB4Y2QsCisgIDB4N2YsMHgxNSwweDU3LDB4ZWQsMHhmNywweGE0LDB4YTgsMHhiNywweDJlLDB4ODQsMHhkZCwweDVlLDB4ZDYsMHhlOCwweDAzLDB4NGEsCisgIDB4ZmYsMHg0YywweGViLDB4MDIsMHhmZiwweDgwLDB4NzgsMHhmZSwweDM1LDB4MzUsMHhiNCwweGUwLDB4ZmIsMHhmZSwweDM0LDB4ZTcsCisgIDB4N2YsMHg4ZSwweDQ5LDB4ZjUsMHgyZiwweDI3LDB4ZGIsMHhhMywweGQyLDB4ZjMsMHhhNCwweDhiLDB4YzEsMHhmZSwweDJmLDB4ZmEsCisgIDB4NmQsMHg3ZiwweDc2LDB4MTYsMHgxYiwweGRkLDB4MGEsMHhmZSwweDg3LDB4ZGQsMHgzZiwweDg2LDB4ZTksMHhhYiwweDdmLDB4YTksCisgIDB4ZTIsMHg3MywweDg3LDB4YjgsMHgzZiwweDUxLDB4YmQsMHhkYywweGRkLDB4NjYsMHhjMSwweGIyLDB4OTcsMHhlMCwweGJiLDB4MmEsCisgIDB4YjgsMHhmZSwweGI5LDB4Y2UsMHg1NywweGZmLDB4NTIsMHhmMywweDNmLDB4N2YsMHgxNCwweGEyLDB4ZmYsMHg2OSwweDc3LDB4MTIsCisgIDB4ZWIsMHgxNCwweGZkLDB4ODMsMHgwMCwweGZmLDB4ZDQsMHg0YiwweDY4LDB4NjcsMHhkNSwweDY5LDB4YTMsMHg3NywweDUxLDB4OTAsCisgIDB4ZmYsMHgxMSwweGY4LDB4NDcsMHhkNiwweGZmLDB4ZTgsMHhkZCwweGFmLDB4MTgsMHgyYSwweDdlLDB4MDMsMHg5YywweDdmLDB4MDEsCisgIDB4ZWIsMHg1ZiwweDQ3LDB4YjUsMHg0NywweDFkLDB4YTMsMHg3NCwweGZmLDB4YmIsMHg0ZiwweGZmLDB4ZDMsMHg5NiwweGVmLDB4MWEsCisgIDB4YjgsMHgyNywweGM4LDB4M2YsMHg4YywweGYzLDB4ZWIsMHhmNywweGY1LDB4N2YsMHhiNSwweDZkLDB4NTQsMHhlYiwweGMzLDB4OTUsCisgIDB4ZjgsMHgwNywweDFiLDB4YWQsMHg2YiwweGJiLDB4ZmEsMHhlMiwweDk5LDB4ODAsMHhiZSwweGU1LDB4NWMsMHgzOCwweGZmLDB4NjMsCisgIDB4ZDgsMHhmMSwweDQ3LDB4NmQsMHhmZiwweGZjLDB4ZWEsMHhiMywweDAwLDB4ZmYsMHg3NCwweDQ5LDB4NzgsMHgxOCwweGFmLDB4ZDcsCisgIDB4NmEsMHgwMiwweGU3LDB4ODMsMHgwMCwweGZjLDB4ZTMsMHg5ZSwweDdmLDB4YzEsMHhiMywweDdmLDB4ZGUsMHgzOCwweGE1LDB4M2QsCisgIDB4MWMsMHg5OCwweDg3LDB4MGMsMHhmMSwweDRmLDB4OTcsMHhjYiwweGZmLDB4NTAsMHhiNCwweDYzLDB4YjYsMHg1YSwweDg5LDB4ODYsCisgIDB4NzgsMHg0MiwweDdiLDB4MDUsMHhjOSwweDQyLDB4NjgsMHg4MCwweDdmLDB4ZWEsMHhhMCwweDdmLDB4ZjQsMHhmNiwweDhkLDB4ZDgsCisgIDB4MzgsMHg1ZCwweDBhLDB4ZmYsMHhkNCwweGM5LDB4NmEsMHhiZCwweDg5LDB4ODQsMHg4YSwweGZmLDB4MTksMHgwYiwweGViLDB4N2YsCisgIDB4Y2YsMHg4YywweDE5LDB4NGUsMHhmYywweGExLDB4MjAsMHhmZSwweGUxLDB4Y2YsMHg3YiwweDBhLDB4ZTIsMHgxZiwweDdhLDB4MTAsCisgIDB4NDYsMHhhNywweGY2LDB4NzAsMHgwOSwweGZjLDB4YjMsMHg4OSwweGYzLDB4M2YsMHgxZCwweGQ0LDB4MjgsMHhmNiwweGRmLDB4YTYsCisgIDB4OTgsMHhiNywweGYwLDB4YmUsMHg4MiwweGZmLDB4OTksMHg0ZiwweGQxLDB4Y2UsMHhkZSwweGNjLDB4NzQsMHg3YywweDUzLDB4MjksCisgIDB4ZmMsMHgxMywweDBiLDB4NjQsMHg3ZiwweDNhLDB4ZjYsMHgyNywweDJiLDB4ZTMsMHgxZiwweDkxLDB4OGYsMHgyNCwweGZjLDB4NDMsCisgIDB4MGUsMHhjMiwweDYwLDB4NjksMHgwZSwweDAyLDB4ODMsMHg5MCwweGZlLDB4YWYsMHgxMSwweDA0LDB4ZjAsMHhjZiwweDMyLDB4OTEsCisgIDB4N2YsMHhkMywweDQ1LDB4ZmUsMHhmZiwweDdiLDB4YmIsMHg5ZiwweGZmLDB4MzEsMHhhOCwweDcwLDB4MjUsMHgxNiwweDg2LDB4N2YsCisgIDB4MWEsMHg2YiwweDY1LDB4ZmUsMHgyNywweDY3LDB4ZDQsMHg3YSwweDMwLDB4YTAsMHg1MiwweDhkLDB4N2YsMHg2MCwweGZkLDB4ZWIsCisgIDB4MzAsMHgzNiwweDc4LDB4ZmUsMHg5NSwweGU2LDB4M2YsMHhjZiwweDY3LDB4ZWIsMHg3NywweGZhLDB4ZjQsMHgzYywweGI5LDB4ZTQsCisgIDB4ZWMsMHgzZCwweDBhLDB4M2MsMHgxMywweDU3LDB4ZjYsMHg3ZiwweDYxLDB4NjMsMHgyMywweGY2LDB4NGYsMHhmMCwweGZjLDB4OGIsCisgIDB4MzMsMHhlMCwweGZjLDB4MGIsMHhkMCwweGVkLDB4OGUsMHhkZCwweGZlLDB4ODcsMHg5ZSwweDEwLDB4ZGEsMHg4ZiwweDdmLDB4ZDgsCisgIDB4ZmYsMHg2ZiwweGE3LDB4ODQsMHg3ZiwweDUwLDB4YTYsMHhkMywweDU4LDB4ZDQsMHgxYiwweGM0LDB4M2YsMHg2ZiwweDczLDB4N2UsCisgIDB4YmIsMHgxZSwweGY5LDB4ZmQsMHhiOSwweGQzLDB4OWQsMHhhNywweGJkLDB4MzYsMHgwNCwweGZmLDB4YzgsMHhmZCwweDVmLDB4NWIsCisgIDB4YWMsMHgwNiwweDI1LDB4ZmUsMHg4OSwweGIxLDB4ZjUsMHgxMywweGEyLDB4ZmUsMHhiNSwweDkxLDB4OGMsMHg4MSwweGIyLDB4ZGUsCisgIDB4MWEsMHg1NCwweGY0LDB4YmYsMHg1ZiwweDA2LDB4ZjcsMHg4ZiwweGM0LDB4ZmYsMHhiNCwweGM2LDB4MzYsMHhmNCwweDQ1LDB4ZTcsCisgIDB4N2YsMHgzZSwweDgzLDB4YjAsMHgyNywweGE5LDB4YzQsMHgzZiwweDgwLDB4ZmYsMHg3MSwweDBkLDB4M2UsMHg4ZiwweDU3LDB4N2EsCisgIDB4MWYsMHgxNywweGU3LDB4NWYsMHgyYywweDA0LDB4ZjgsMHhjNywweDliLDB4ZjYsMHhmMywweDBlLDB4ZWQsMHhmZiwweGFhLDB4MDQsCisgIDB4Y2YsMHhlZiwweDg0LDB4MzgsMHhmZiwweDAyLDB4ZDYsMHhiZiwweDVlLDB4ZjYsMHhkYSwweGJlLDB4YzQsMHhmOSwweDE3LDB4MmYsCisgIDB4MDcsMHhmMCwweDBmLDB4OGUsMHhmZiwweDNmLDB4MTEsMHhlZiwweGZiLDB4MzgsMHhmYiwweDFjLDB4OGEsMHgwNywweGU3LDB4ZmIsCisgIDB4YzEsMHhmYSwweGQ3LDB4YTgsMHg5NCwweGFkLDB4MjYsMHhkZSwweGJhLDB4YjIsMHgyZCwweDk4LDB4YmYsMHg0ZSwweDA5LDB4ZmMsCisgIDB4NjMsMHhjMiwweGY4LDB4YTMsMHg1MywweGEzLDB4ZDYsMHgxMywweDIyLDB4OGEsMHhlYiwweGZmLDB4OTgsMHhhZiwweGY3LDB4ZWIsCisgIDB4N2YsMHhjNiwweGFiLDB4N2EsMHg1ZSwweDBiLDB4YzYsMHhhYiwweGQ3LDB4NmMsMHhiNiwweDNlLDB4NTUsMHgyYiwweDU1LDB4MzcsCisgIDB4YjIsMHg4NCwweDA4LDB4YmEsMHhiNywweDA0LDB4ZmUsMHhmMSwweGU5LDB4N2YsMHg2OCwweDc0LDB4MGQsMHhlNiwweGY3LDB4ODksCisgIDB4MTIsMHhmYywweGNmLDB4NTAsMHg3YywweDlmLDB4ZmYsMHg5MywweDdiLDB4MDQsMHhmZSwweDU5LDB4NmUsMHhmYSwweGIyLDB4NWIsCisgIDB4NjIsMHg3NiwweDViLDB4OWIsMHgxNSwweGU4LDB4N2YsMHg5NywweGNlLDB4YmYsMHg4MCwweGY5LDB4ZWIsMHg1OCwweGU1LDB4OTAsCisgIDB4NTcsMHg3ZiwweDQ5LDB4YWEsMHhmMSwweDhmLDB4MmYsMHhkZiwweDkxLDB4NDQsMHhhNiwweGVhLDB4N2YsMHhlNywweGY4LDB4YTcsCisgIDB4MzYsMHg5MCwweGZkLDB4MmIsMHgwNiwweDAyLDB4NzgsMHgzYiwweDg0LDB4ZmYsMHgyMSwweDZjLDB4OTgsMHgzNywweGY2LDB4NDcsCisgIDB4OWUsMHhmZiwweDVjLDB4YWMsMHhlMCwweGZjLDB4OGYsMHgwZiwweGZmLDB4YjgsMHg4NSwweGJmLDB4NDAsMHg3ZSwweGZmLDB4N2UsCisgIDB4MGYsMHhmZiwweDA3LDB4YjQsMHgzZSwweGI0LDB4MGIsMHgzNSwweDkyLDB4ZjAsMHgxNywweDZlLDB4MjAsMHhmOCwweGE3LDB4MjMsCisgIDB4N2MsMHg3NSwweDE2LDB4MzIsMHg0YiwweDE5LDB4ZjAsMHhhZiwweDBmLDB4MmQsMHg0NywweDg2LDB4YTUsMHg5OSwweGE1LDB4OGMsCisgIDB4NmYsMHhmMiwweGZiLDB4ZTQsMHg1OCwweDMzLDB4ODMsMHg5ZCwweDZmLDB4MTYsMHg2MiwweDgwLDB4YmYsMHhkMiwweDBiLDB4NWQsCisgIDB4ZTMsMHg5YiwweGZjLDB4ZmUsMHhmNSwweGZlLDB4N2QsMHhjYiwweGZjLDB4NmYsMHg5MiwweGIzLDB4ZmMsMHg0ZSwweGEwLDB4YmYsCisgIDB4NDQsMHg0YiwweDlkLDB4MTIsMHg4NiwweGZlLDB4N2IsMHhmZiwweGZlLDB4ZmYsMHhiMiwweGZmLDB4NzUsMHhkMywweDhlLDB4ZTAsCisgIDB4ZjMsMHgxOCwweDhmLDB4M2YsMHhkNywweGZiLDB4ZDcsMHhkYSwweDFhLDB4NjUsMHg1NSwweDMyLDB4ZjksMHg3YiwweGZlLDB4ZmMsCisgIDB4ZmYsMHhjMSwweDVmLDB4ZmIsMHhiNSwweDZiLDB4ZDcsMHg5YywweDMyLDB4YzYsMHhmZiwweGU3LDB4ZjUsMHhkZiwweGIyLDB4ZTcsCisgIDB4ZjEsMHhiYiwweDc4LDB4ZjgsMHg1ZCwweDNjLDB4ZmMsMHgwNiwweGZlLDB4ZmYsMHgyZSwweDFlLDB4OTYsMHhmYiwweGZiLDB4YjYsCisgIDB4YzUsMHg5ZiwweDZmLDB4ZDcsMHg3YSwweGM4LDB4OGYsMHhjNSwweGFlLDB4ZDksMHgyZCwweGJiLDB4MTIsMHgxNywweDVkLDB4ZTEsCisgIDB4NzQsMHg4NCwweGZhLDB4ZTAsMHg4MiwweGEzLDB4ZjYsMHhlZSwweDYyLDB4ZjUsMHg5MCwweDc2LDB4YjUsMHgxNCwweDNmLDB4ODYsCisgIDB4MDYsMHgxMiwweDA3LDB4NjIsMHgxOSwweGQ2LDB4NzYsMHg5YSwweGY2LDB4ZjQsMHg2MCwweGIxLDB4NTAsMHg3ZSwweGFjLDB4NGUsCisgIDB4NjIsMHgyMywweGQzLDB4Y2UsMHgwMiwweDA1LDB4M2YsMHgwOSwweGY0LDB4NTEsMHhiMSwweDVhLDB4ZjAsMHg3NiwweDcwLDB4MjAsCisgIDB4ZDYsMHhmNCwweDhlLDB4YjIsMHg3ZSwweGI3LDB4MzUsMHg5NiwweGYyLDB4ZDYsMHhlZiwweDQyLDB4OTAsMHhmZiwweGE5LDB4NmMsCisgIDB4Y2YsMHg3YiwweGIwLDB4ZjksMHhmMSwweDMyLDB4ZmMsMHg1OCwweDBkLDB4N2QsMHgwZCwweDg5LDB4YjUsMHg0ZCwweDU2LDB4ZTMsCisgIDB4OWYsMHg3NSwweGZjLDB4YmYsMHg3ZiwweDRlLDB4NWQsMHgxZiwweDNjLDB4NmEsMHg2NSwweDdiLDB4YjEsMHgzMSwweDE3LDB4NGQsCisgIDB4MWYsMHg0ZSwweDhjLDB4NmUsMHg4NCwweDhkLDB4MzcsMHg0YiwweGQ1LDB4MDcsMHhhNSwweGZlLDB4MzgsMHhmYiwweDQ3LDB4OTYsCisgIDB4YjIsMHg1ZSwweDI2LDB4ZDUsMHgwNywweGQ5LDB4N2MsMHhhNCwweDAxLDB4YzIsMHg4NiwweDRkLDB4NTYsMHhjMywweGZhLDB4YTAsCisgIDB4N2UsMHgyMCwweGQ2LDB4ZWEsMHg2YywweDY4LDB4NWEsMHgwYywweGY4LDB4MzEsMHg1ZiwweDdmLDB4MWMsMHhkNSwweDg3LDB4MDcsCisgIDB4ZTYsMHhjOSwweDBiLDB4N2UsMHg4YywweGYwLDB4ZGIsMHgxZiwweGEwLDB4MzUsMHg0ZSwweGI1LDB4ZWIsMHg4ZCwweGRiLDB4ODksCisgIDB4M2UsMHhmZiwweDc3LDB4MjksMHgzZiwweDdmLDB4MDgsMHhmOCwweDMxLDB4ZTksMHhmZCwweDE0LDB4ZGQsMHg4NiwweGRmLDB4NzcsCisgIDB4YjQsMHgxMywweDc2LDB4ZjgsMHhmOSwweDY4LDB4NDgsMHhlNiwweGM3LDB4NTYsMHgyYywweGE3LDB4ZmEsMHg3MCwweDNmLDB4MWYsCisgIDB4MDgsMHhlYiwweDgzLDB4ZDIsMHhmYiwweDY5LDB4NDMsMHgwMiwweGI2LDB4YTUsMHg4NCwweGYwLDB4NjMsMHhlZiwweGEzLDB4MzUsCisgIDB4NzYsMHhiNSwweGNiLDB4ODYsMHhkZCwweDU1LDB4MTgsMHgyOCwweGQwLDB4ZjksMHhkOCwweDg0LDB4MTYsMHg4YiwweGE5LDB4ZjgsCisgIDB4MzEsMHhhOSwweDNmLDB4Y2UsMHgwYSwweGFiLDB4MGYsMHgwMiwweDdlLDB4MDMsMHhiMCwweDI1LDB4NzcsMHgxNCwweGJjLDB4ZmUsCisgIDB4ZjEsMHhlZCwweDAxLDB4N2QsMHgxNCwweDViLDB4Y2YsMHhlNywweDQzLDB4MGUsMHg2YSwweDUzLDB4ZmEsMHg3MCwweDdmLDB4N2EsCisgIDB4MjMsMHg2NSwweGI3LDB4NWUsMHgyYywweDNiLDB4MWYsMHgxMiwweGNjLDB4MDcsMHg0OCwweDRmLDB4ZDksMHhmZSwweGY1LDB4ODIsCisgIDB4MWYsMHgyMywweGU5LDB4NTQsMHgzZSwweDBkLDB4YjYsMHgzNiwweDNkLDB4OGUsMHg5ZiwweDBhLDB4NWYsMHg3ZCwweDkwLDB4Y2YsCisgIDB4MjcsMHhkOSwweDZjLDB4ZTQsMHhlMSwweGVlLDB4OWEsMHhjOSwweDY5LDB4MjAsMHg0NCwweDg2LDB4MTQsMHgzYSwweDFmLDB4MTIsCisgIDB4ZWEsMHhjMywweGJmLDB4NzAsMHhlNywweDVkLDB4MDcsMHhmYiwweGUzLDB4Y2UsMHg0OCwweGYzLDB4OTEsMHhkZSwweDEzLDB4ZmEsCisgIDB4ZjAsMHhiYiwweGFjLDB4ZTQsMHhjZiwweGUyLDB4ZTcsMHg1MiwweGZlLDB4ZmUsMHhjMSwweDMzLDB4ZDIsMHg3YywweDZjLDB4YzAsCisgIDB4ODYsMHhhNSwweGVkLDB4ZjUsMHg3NiwweDdjLDB4OTcsMHhkNiwweDFmLDB4Y2EsMHg4ZiwweDU5LDB4ZjMsMHhjNiwweDdkLDB4ZmIsCisgIDB4NWQsMHhkNCwweDMxLDB4Y2UsMHhjNiwweDYyLDB4ODMsMHhmMywweDYxLDB4OTksMHhmZiwweDc3LDB4Y2EsMHhmMywweDIxLDB4ZTksCisgIDB4ZjksMHg3NCwweDdiLDB4ZDAsMHg4MiwweGYwLDB4ZmEsMHg2MCwweDFkLDB4YjgsMHhmZSwweDJmLDB4ZDAsMHg5ZCwweDU0LDB4MGYsCisgIDB4YWYsMHhhZiwweGQzLDB4ZTQsMHg3ZSwweDM3LDB4NTAsMHgxZiwweDhjLDB4ZWQsMHg5MSwweDRlLDB4OGYsMHhmZCwweGIzLDB4YTQsCisgIDB4OTgsMHg4ZiwweGNkLDB4ZDcsMHhjZiwweDA3LDB4ZjUsMHg0MSwweGE5LDB4M2YsMHgyZSwweDQ1LDB4OGQsMHhlMCwweDdjLDB4NGUsCisgIDB4YzgsMHg4ZiwweGVkLDB4MDUsMHhmNSwweGMxLDB4NDIsMHhkNiwweDVlLDB4NWYsMHhkMCwweGVlLDB4NGEsMHg4NSwweGQ3LDB4MDcsCisgIDB4MWIsMHhmYiwweGI4LDB4NWUsMHgzNywweDQxLDB4ZTYsMHhiMywweGU1LDB4YjEsMHg5MSwweGI0LDB4NzksMHg0NywweDRmLDB4ODAsCisgIDB4MWYsMHg1YiwweDhlLDB4NjQsMHg5OSwweDUwLDB4MmUsMHhmZSwweDYzLDB4ODUsMHg3MCwweDQ4LDB4ZjAsMHg2MywweDhkLDB4NjIsCisgIDB4M2UsMHhkMiwweDBiLDB4M2EsMHgxOSwweDhiLDB4MzQsMHhmZiwweGUyLDB4YjYsMHgxYiwweDAyLDB4ZmEsMHgyOCwweGMwLDB4OGYsCisgIDB4MmQsMHgwNSwweGYxLDB4ZmMsMHgzMiwweGYxLDB4YzYsMHhmMCwweGZhLDB4NTIsMHhmNSwweDQxLDB4MGIsMHhkNiwweDc3LDB4Y2UsCisgIDB4ZGIsMHhhYiwweGYzLDB4MDMsMHgxNywweGVmLDB4MjksMHhjOSwweDhmLDB4NDksMHhmMywweDkxLDB4MmMsMHgxYSwweDdmLDB4NGMsCisgIDB4N2MsMHhkOSwweDc3LDB4YjgsMHg5ZiwweDdjLDB4YzUsMHhmNCwweDUxLDB4ZmMsMHg3OSwweGI0LDB4MjUsMHgzZCwweGMzLDB4Y2QsCisgIDB4ZTMsMHgwYiwweDdhLDB4MTQsMHhlNywweDgzLDB4OGMsMHhmMywweGZhLDB4MjAsMHg5OSwweDBmLDB4ZDksMHhjMiwweGEyLDB4Y2QsCisgIDB4NmEsMHhiNCwweGIxLDB4MDcsMHhjNywweDFmLDB4ODQsMHhmYywweGZlLDB4MDQsMHhmNSwweDQxLDB4MmYsMHg3ZiwweDU1LDB4OTEsCisgIDB4NjMsMHhjOCwweDJlLDB4YTMsMHgzNSwweGY5LDB4ZWEsMHhkOSwweDJhLDB4YzMsMHhiZiwweDVmLDB4MGQsMHhjZSwweDg3LDB4MTQsCisgIDB4ZmUsMHgyMSwweDA3LDB4Y2IsMHg3NiwweDYxLDB4ZTMsMHg1MywweGIxLDB4OWUsMHgyOSwweDg4LDB4MDIsMHhmNSwweGMxLDB4OWEsCisgIDB4NTksMHg3YSwweDFlLDB4NjgsMHhjYiwweGJkLDB4ZDUsMHhlZSwweGEwLDB4NmMsMHgzOSwweDllLDB4NGYsMHg4MSwweGZhLDB4MjAsCisgIDB4YzgsMHg1ZiwweGMzLDB4NzYsMHhjYSwweDMyLDB4ODYsMHhiNCwweDRmLDB4MDMsMHhlNywweDczLDB4ODUsMHhmMSwweDYzLDB4NWIsCisgIDB4MWYsMHg3MSwweDZlLDB4MWMsMHhkMiwweDdlLDB4ODcsMHhmYywweGY1LDB4MjAsMHhjMCwweDhmLDB4NDEsMHgzZCwweGNjLDB4MDEsCisgIDB4ZWQsMHgxMSwweDZiLDB4MjcsMHgxOSwweDk0LDB4ZWQsMHg4YiwweGNmLDB4YjAsMHgzZSwweGU4LDB4ZDcsMHg4NywweDU3LDB4ZjcsCisgIDB4ZTAsMHhjNywweGM0LDB4OWYsMHg1ZiwweDhhLDB4MWMsMHg3MiwweDRiLDB4ZmQsMHg3MSwweGY0LDB4N2MsMHhjNiwweGQ5LDB4ZTAsCisgIDB4ZjksMHg1NiwweGYzLDB4NDUsMHg3ZCwweDcwLDB4MGMsMHhkZSwweDNmLDB4NWYsMHhkOSwweGVkLDB4NGUsMHhhNiwweDkzLDB4ZDYsCisgIDB4MDcsMHg2ZiwweDdiLDB4NWQsMHhjMiwweDNmLDB4ZmMsMHgzYywweDkxLDB4MzEsMHg0MywweDU2LDB4NDMsMHhmNSwweDU0LDB4ZjcsCisgIDB4NTcsMHg2NiwweDBhLDB4NDcsMHhlZCwweDE1LDB4YjMsMHg2YSwweGZjLDB4MzMsMHg4MSwweGE0LDB4N2MsMHhkNCwweDc4LDB4MmYsCisgIDB4YTksMHgwZiwweGUyLDB4ZTcsMHhhYiwweDYxLDB4MzIsMHg0NCwweDFmLDB4YTUsMHhiMywweGZhLDB4MjAsMHgzOSwweDY2LDB4NGUsCisgIDB4Y2IsMHg3NiwweDc4LDB4ZjUsMHhjMSwweDc0LDB4NDgsMHg3ZCwweDcwLDB4YTEsMHhhNCwweGNmLDB4NDEsMHhhZCwweGE2LDB4MzEsCisgIDB4MjAsMHhjNiwweDg2LDB4MmIsMHhmNCwweDUxLDB4ODUsMHg4NSwweGZjLDB4ZmMsMHgwYiwweDVhLDB4MWYsMHg4NCwweGYzLDB4YTMsCisgIDB4YjQsMHg5MiwweGY1LDB4NDEsMHg2ZCwweDQ2LDB4MjcsMHhmMywweDE5LDB4YTgsMHhmZSwweGZjLDB4MGQsMHhhMywweGVkLDB4MTUsCisgIDB4MDgsMHhiNCwweGU0LDB4ZjksMHg5MCwweGEwLDB4NWYsMHgyMCwweDNkLDB4NjEsMHgyYywweGMwLDB4ZDcsMHhiZiwweGEyLDB4NzMsCisgIDB4ZDUsMHhhOSwweDZhLDB4YTUsMHgzZSwweGFhLDB4MjgsMHhkZCwweDBmLDB4YTgsMHhjMSwweGU5LDB4NmMsMHhjNCwweGM2LDB4NjIsCisgIDB4MjcsMHg4MywweDgxLDB4ZTIsMHhhMiwweGFlLDB4MjAsMHhmZSwweDk5LDB4MzUsMHgyMSwweGZlLDB4ZTksMHhkZiwweDk1LDB4MzcsCisgIDB4YTYsMHg5ZiwweDc0LDB4ZWIsMHg2NSwweDBiLDB4OTQsMHhmOCwweDY3LDB4NTMsMHhiZCwweGE3LDB4OGYsMHg1YSwweDhkLDB4NjEsCisgIDB4Y2YsMHgwMSwweGIzLDB4YzksMHhjYSwweDM0LDB4ZTAsMHhjYiwweDI2LDB4ZmQsMHg3MSwweDA5LDB4MDEsMHg4NCwweDM0LDB4NzAsCisgIDB4M2UsMHg2YywweGFkLDB4OGMsMHg3ZiwweDJjLDB4N2EsMHg5MCwweGVlLDB4N2YsMHhhMywweGY2LDB4NzEsMHgwOSwweGZmLDB4Y2MsCisgIDB4NjMsMHhmYiwweDM1LDB4NzQsMHg4OSwweDlkLDB4N2UsMHhjYywweDYyLDB4ODMsMHg5MiwweDI2LDB4MTMsMHg0YSwweGZjLDB4NzMsCisgIDB4YzIsMHhmMCwweGY1LDB4ZGIsMHgyNiwweGFjLDB4MzgsMHhmOSwweDI0LDB4NzMsMHhjMiwweGU4LDB4ZTksMHg2MCwweGYxLDB4MjQsCisgIDB4YmUsMHgxZiwweGQ2LDB4MDcsMHg0ZCwweDg4LDB4ZWUsMHg2NiwweGQ3LDB4NmQsMHg0ZSwweDUzLDB4NjMsMHhjYSwweDUwLDB4ZTIsCisgIDB4OWYsMHgyZSwweDVkLDB4ZWUsMHgzZSwweDk4LDB4NmMsMHg2YywweGQ1LDB4ZjYsMHhkMSwweDRmLDB4MGMsMHgzNSwweGZlLDB4ZDEsCisgIDB4NjUsMHg3ZCwweDc4LDB4YTEsMHhmYSwweDIzLDB4NmEsMHhiNCwweGRhLDB4OTksMHgwOCwweGZhLDB4MjgsMHg3MiwweDUwLDB4ZDEsCisgIDB4NTYsMHgwNSwweDEwLDB4N2EsMHg0NiwweDVkLDB4MWYsMHhmYywweDE0LDB4YjUsMHg2ZSwweGNhLDB4ZmMsMHg0MywweGRjLDB4MWQsCisgIDB4MGIsMHg1OSwweDEzLDB4YTksMHgzZSwweDk4LDB4MzMsMHg3NiwweDZhLDB4NTMsMHhjNiwweDc2LDB4NzQsMHhlNywweGZkLDB4ODYsCisgIDB4ODQsMHg3ZiwweGQ4LDB4MWYsMHhhYiwweDBmLDB4YmEsMHhmMywweGIxLDB4MmQsMHhiYywweDllLDB4MGUsMHg4YSwweDVjLDB4NGIsCisgIDB4ODUsMHhjZCwweDBhLDB4ZmMsMHg5MywweDgyLDB4ZjUsMHg0MSwweDMyLDB4MTYsMHhjMCwweDIwLDB4NjMsMHgwMSwweGI2LDB4MjIsCisgIDB4N2EsMHg1MCwweDkxLDB4YTIsMHgzZSwweGI4LDB4ZjksMHgyNiwweGI2LDB4MjksMHhhYSwweGJlLDB4NWUsMHg0NiwweGZiLDB4ZDMsCisgIDB4ZTksMHg3YywweDAwLDB4ZDgsMHhhOCwweDc1LDB4NjYsMHhiZSwweDUyLDB4MWYsMHg3NSwweGM5LDB4MWQsMHg0NCwweDQ2LDB4YzcsCisgIDB4MWUsMHhjMiwweDQ2LDB4YjksMHhjNSwweDUwLDB4MWYsMHg0NSwweDNlLDB4NWMsMHhlMywweDc2LDB4ZDMsMHhlMywweGY4LDB4ZmMsCisgIDB4NDgsMHg4MiwweDA4LDB4Y2IsMHhkZiwweDQ0LDB4ZWQsMHhmNywweDI1LDB4OTQsMHhmOCwweGE3LDB4MWUsMHg4MSwweGZlLDB4YjgsCisgIDB4OGIsMHg2OCwweDhkLDB4OTksMHgyOSwweDY4LDB4NDUsMHgzMiwweDE2LDB4ZDIsMHgzNCwweGQ0LDB4ZjUsMHg0MSwweDI0LDB4ZDUsCisgIDB4MDcsMHg1MywweDc5LDB4N2MsMHgxYiwweDhjLDB4ZDMsMHhiMSwweDkwLDB4ODYsMHgxYSwweGZmLDB4ZDQsMHg4YSwweGZlLDB4MzgsCisgIDB4MGMsMHgzYiwweDJiLDB4ZjIsMHhkOCwweDlmLDB4ZTMsMHhkYSwweDc2LDB4MjQsMHgwYiwweGQ1LDB4NjQsMHg3ZCwweGQ0LDB4MDgsCisgIDB4YmQsMHg0OCwweGZhLDB4NmQsMHhiMywweGQ1LDB4YmEsMHhkMywweGZiLDB4ZmYsMHhjZCwweDI4LDB4ZjEsMHhjZiwweDg0LDB4YmYsCisgIDB4NWUsMHg1YywweGYzLDB4OGYsMHg5ZSwweDExLDB4NWUsMHgxZiwweDljLDB4NjYsMHhmOCwweDY3LDB4MWEsMHhlMywweDlmLDB4OTUsCisgIDB4YjQsMHgzZSwweDY4LDB4YjQsMHgxOSwweDE5LDB4MjUsMHhmZSwweDkxLDB4ZjQsMHg1MSwweDg3LDB4OWMsMHg1NSwweGNmLDB4MTksCisgIDB4NjQsMHgzZSwweGU0LDB4NjgsMHg2YSwweGQ1LDB4YTAsMHhhMSwweGQ2LDB4NDcsMHhlOSwweDcyLDB4ZjUsMHhiYywweDY4LDB4MzQsCisgIDB4M2QsMHg4OSwweDBkLDB4ODcsMHgxOCwweGRlLDB4OGIsMHhjMywweGZhLDB4YTYsMHhiNCwweGMwLDB4M2YsMHhjOCwweDA0LDB4ZDUsCisgIDB4YjEsMHg4MywweGQ2LDB4Y2EsMHgzMSwweDIzLDB4OTcsMHgzYSwweDZkLDB4MWYsMHg0NCwweDJiLDB4N2IsMHg4MSwweDUwLDB4NmEsCisgIDB4OTEsMHhjMCwweDNmLDB4YzYsMHhjZSwweDg3LDB4MDUsMHhkYSwweGY5LDB4MmYsMHg1NywweDE2LDB4ZjUsMHgxYiwweGU3LDB4ODIsCisgIDB4ZGQsMHg1YSwweDRjLDB4YTgsMHhmMSwweDRmLDB4ZGQsMHgzZSwweDMxLDB4NWQsMHhmNiwweDIyLDB4ODksMHg0ZSwweDgzLDB4ZDQsCisgIDB4NTgsMHg2MywweDg3LDB4ZTgsMHhhMywweGZhLDB4NDYsMHg0ZCwweDZmLDB4OWEsMHgwZCwweGVkLDB4NmYsMHgyYSwweDI0LDB4MjYsCisgIDB4NjgsMHhkYSwweDZhLDB4MjksMHhlOCwweDZlLDB4ZmUsMHhiYSwweDhiLDB4ZTIsMHgxZiwweDUxLDB4OGYsMHhmMywweGM1LDB4MWYsCisgIDB4YmIsMHgzYSwweDQ3LDB4ODEsMHhjZCwweDBmLDB4NGMsMHgwMywweDU0LDB4MGMsMHg4NSwweDNlLDB4Y2EsMHg1ZiwweDFmLDB4MWMsCisgIDB4MzQsMHhmMiwweDlhLDB4M2IsMHhkOCwweDdmLDB4ODEsMHhiMiwweDNlLDB4NjgsMHhmOSwweGUyLDB4OGYsMHhkZCwweDQ4LDB4MDcsCisgIDB4YjUsMHhhMSwweDQ2LDB4ZjQsMHg4MywweDEwLDB4N2QsMHgxNCwweDE3LDB4NzUsMHhkMywweGZjLDB4ZTUsMHgxOCwweDM2LDB4MGUsCisgIDB4YjMsMHg5NywweGYxLDB4OGQsMHhlNCwweGJkLDB4NTEsMHg1MiwweGU5LDB4YzUsMHg4NCwweGU4LDB4NDcsMHg1OCwweDA4LDB4ZmIsCisgIDB4MDcsMHhjOSwweGMxLDB4OWQsMHg3ZCwweDU0LDB4MjgsMHg4NSwweGUzLDB4YzksMHg1MCwweDRjLDB4ZDQsMHgwNywweGY5LDB4ZmQsCisgIDB4YmYsMHg5YywweGUyLDB4MWYsMHg2ZiwweDNlLDB4MDAsMHg5OSwweDk3LDB4OTgsMHgyMCwweGY5LDB4ZWUsMHhhNCwweGRkLDB4OTYsCisgIDB4OGYsMHg1MCwweDFmLDB4MjQsMHhlNywweGI5LDB4MzcsMHgzZSwweDg1LDB4OGQsMHg1ZiwweGU0LDB4YjMsMHg3OSwweDUwLDB4MWYsCisgIDB4NWMsMHgwNCwweGYxLDB4NGYsMHhiNywweDA5LDB4ZGYsMHhlZSwweDBiLDB4ZjcsMHhmNSwweDZiLDB4MDMsMHhhOCwweDNmLDB4OTUsCisgIDB4ZWQsMHg4ZiwweGE0LDB4OGYsMHhjYSwweGE2LDB4ZmEsMHg1MSwweGM1LDB4MDksMHhmMiwweGZlLDB4ODUsMHhmZSwweDU0LDB4NWQsCisgIDB4MWYsMHg4NCwweGZhLDB4MjgsMHg1MiwweDFmLDB4YWMsMHgyMCwweGZlLDB4OTksMHgwOCwweGFmLDB4MGYsMHhmZSwweDVjLDB4YWEsCisgIDB4MDYsMHhkZSwweGVkLDB4NTQsMHg5MywweGZkLDB4OWUsMHhmNywweDA5LDB4YTUsMHg0NCwweDdkLDB4ZDAsMHg3OSwweDQyLDB4ZDYsCisgIDB4NDcsMHhhNSwweGNhLDB4Y2MsMHg4NywweDFjLDB4OTMsMHhmNSwweDUxLDB4ZDksMHgxNCwweDE5LDB4ZTQsMHgxOCwweGU0LDB4N2YsCisgIDB4ZjgsMHg3YywweGRhLDB4ZTMsMHg2OCwweGMwLDB4ODQsMHhmNywweDAzLDB4NTIsMHhlYSwweDc1LDB4MDUsMHhmZSwweDI5LDB4NzIsCisgIDB4ZmMsMHhlMywweDdhLDB4MGYsMHhhOSwweGU3LDB4NDMsMHhmMiwweGZjLDB4YjgsMHhkNiwweGE3LDB4OGYsMHhiYSwweDQxLDB4YTksCisgIDB4OTcsMHgwYiwweDlmLDB4OGYsMHg2ZCwweGFiLDB4ZjUsMHg2MywweGExLDB4ZjMsMHg5MSwweDcyLDB4Y2EsMHhkZiwweDBmLDB4YzMsCisgIDB4M2YsMHg2NiwweGM4LDB4N2MsMHg0OCwweDgxLDB4N2YsMHgyNiwweGE0LDB4ZjgsMHg2MywweGNhLDB4NmUsMHgwMSwweGZkLDB4NzEsCisgIDB4ZWMsMHg3ZSwweDliLDB4OTUsMHhmNCwweDUxLDB4NGYsMHhjOCwweDM0LDB4ODgsMHhjMCwweDNmLDB4N2MsMHgzZSwweDc2LDB4YTcsCisgIDB4ZDEsMHg2NSwweDA5LDB4MzUsMHg3OCwweGFhLDB4ZDUsMHg1NiwweGNlLDB4ODcsMHg3YywweDVmLDB4Y2MsMHhjNywweGFlLDB4ZmIsCisgIDB4YTUsMHg1OSwweGRlLDB4M2YsMHg2MiwweDNlLDB4NzYsMHgyMywweGM0LDB4M2YsMHg1ZiwweGRhLDB4NGQsMHg4NCwweGZmLDB4MzksCisgIDB4MTMsMHhjMCwweGU3LDB4ODAsMHhmZiwweGE5LDB4MGYsMHhmMiwweDNmLDB4NzMsMHhlOCwweDNmLDB4ZmMsMHhmYywweDhmLDB4ZDAsCisgIDB4M2YsMHhmOCwweGY4LDB4OWYsMHg3YywweDE5LDB4ZmUsMHg2NywweDkzLDB4MWMsMHg3ZiwweDFhLDB4NjYsMHgyOSwweGZmLDB4ZTMsCisgIDB4OWYsMHhiNywweDIwLDB4ZmEsMHhkNywweGE2LDB4ZWIsMHgyNCwweDM1LDB4NzgsMHhjYiwweDllLDB4ODQsMHhlMCwweDdmLDB4NjAsCisgIDB4N2YsMHgxYywweGJiLDB4ZmUsMHhjZSwweDk4LDB4OGMsMHg3ZiwweGY0LDB4MTAsMHg3ZCwweDM4LDB4YmIsMHg3ZSwweGJmLDB4M2UsCisgIDB4NWMsMHhhZCwweDdmLDB4MGUsMHhjMywweDNmLDB4NzYsMHg1NiwweGFkLDB4NGYsMHgxNiwweGZjLDB4NGYsMHg0MCwweDFmLDB4YTUsCisgIDB4MzQsMHg0ZSwweGFhLDB4ZjEsMHhjZiwweGIwLDB4MmQsMHg4ZiwweDQ1LDB4ZTIsMHg3OCwweDQwLDB4Y2MsMHhjNywweGRlLDB4ZWMsCisgIDB4OWYsMHgwZiwweDEwLDB4YjUsMHgzZiwweDhlLDB4ZDAsMHgyMCwweGI0LDB4M2YsMHg0ZSwweGIxLDB4ZGYsMHgxNSwweGNhLDB4ZjksCisgIDB4ZDgsMHgwNCwweGZmLDB4NzgsMHg4NiwweDlmLDB4ZmYsMHgwMSwweGZkLDB4NzEsMHhmNSwweDQxLDB4MzUsMHg3OCwweDkxLDB4Y2QsCisgIDB4NDcsMHgxMiwweGYzLDB4MDEsMHgyYSwweDQyLDB4ZjAsMHg4ZiwweDZiLDB4MTQsMHg0YSwweGYwLDB4M2YsMHhmYSwweDFlLDB4YmYsCisgIDB4ZjcsMHhkMiwweGUzLDB4ODEsMHhmOSwweDQ4LDB4ZDIsMHg3YywweDZjLDB4NDMsMHhlOCwweGMzLDB4ZjksMHhmNSwweGZiLDB4ZjksCisgIDB4MWYsMHhiZSwweDVmLDB4YTIsMHg4ZiwweDFhLDB4NDEsMHgyMSwweGI3LDB4MDEsMHhlNywweDdmLDB4Y2UsMHg4MiwweGZiLDB4MDcsCisgIDB4ZjAsMHgzZiwweGQzLDB4N2MsMHg1MCwweGE0LDB4Y2YsMHhmZiwweDIxLDB4ZjMsMHhiMSwweDQ3LDB4N2QsMHhiNCwweDBmLDB4MzMsCisgIDB4ZWUsMHgwNywweGZkLDB4NzEsMHgyMiwweGZlLDB4MGMsMHhhMCwweDVkLDB4MzQsMHhmZSwweDU0LDB4YjgsMHgxMywweDVkLDB4M2MsCisgIDB4YmQsMHg0YSwweGI3LDB4MjMsMHhlOSwweGMzLDB4NmQsMHg4OCwweDdmLDB4NWUsMHhhMiwweDQ2LDB4ZmEsMHhiNCwweGZkLDB4ZjcsCisgIDB4YmUsMHhlNywweDU3LDB4ZjQsMHg0MywweGY1LDB4ZjcsMHgzZiwweGNjLDB4ZjksMHgxZiwweGY0LDB4MDksMHgxYiwweDk0LDB4ZWQsCisgIDB4ZTcsMHg3ZiwweGMwLDB4N2MsMHhlYywweDNhLDB4MzksMHhiZiwweDkzLDB4NmMsMHgwZSwweGUyLDB4ZWQsMHgwNywweGFjLDB4ZGYsCisgIDB4ODQsMHhjNywweDA3LDB4YTgsMHgwZiwweGJmLDB4MzIsMHhkOCwweDVlLDB4YWMsMHhiOSwweDE4LDB4YmYsMHgwNiwweGYzLDB4ZDcsCisgIDB4YWEsMHhhOSwweGU0LDB4MjUsMHgzOCwweDFmLDB4ZGIsMHgwMCwweGZjLDB4Y2YsMHgyMSwweGI0LDB4ZjIsMHgzNSwweDAyLDB4N2IsCisgIDB4ODIsMHhlNywweDgzLDB4ODgsMHhmOSwweGQ4LDB4ODIsMHhmZiwweDc5LDB4MWUsMHhjMywweGE0LDB4M2YsMHg5NywweDY0LDB4NjAsCisgIDB4YWUsMHhiMSwweGJlLDB4MjcsMHgwZCwweGU3LDB4MDMsMHg4MCwweGY4LDB4MzMsMHhlYywweDdiLDB4ZWQsMHgwMiwweGZkLDB4NzEsCisgIDB4ZmMsMHg3YSwweDQ0LDB4ZmUsMHhkYSwweDQ3LDB4ZjYsMHg1YiwweGFjLDB4MDEsMHg2MywweDkxLDB4NTQsMHhmMywweDAxLDB4NjIsCisgIDB4OTIsMHg3ZSwweDNlLDB4YTQsMHg1ZiwweGFjLDB4ZTgsMHhjMywweDNmLDB4NWUsMHhmNCwweDllLDB4MGIsMHg5YiwweDBmLDB4MjksCisgIDB4ZTYsMHg2MywweGVmLDB4NDIsMHgwYywweGZmLDB4ZTAsMHhlYiwweDE5LDB4YjIsMHg2ZSwweDU1LDB4ZTcsMHhhZiwweDkwLDB4ZjksCisgIDB4ZDgsMHgyMywweDQ2LDB4ZDksMHhmOSwweDkwLDB4OTUsMHgzYSwweGU4LDB4OGYsMHhkYiwweGVmLDB4YTMsMHhjNSwweDA0LDB4ZmUsCisgIDB4MTEsMHhmMywweGIxLDB4NmYsMHhlYSwweDg2LDB4ZmIsMHhhNSwweGYzLDB4MjEsMHg4MywweGZlLDB4NzEsMHg1NiwweDcwLDB4ZmMsCisgIDB4ZjMsMHhjZiwweDdjLDB4NTMsMHhlNCwweDdjLDB4ZDgsMHhiYiwweDk1LDB4ZmIsMHhmZCwweDYzLDB4ZjEsMHgzYywweGZlLDB4MGYsCisgIDB4N2IsMHhkNywweDFlLDB4MWMsMHhjNSwweDcxLDB4ZTYsMHg3YiwweDFlLDB4MmIsMHg4ZCwweGI0LDB4MmIsMHgzNCwweDdhLDB4MmMsCisgIDB4YWMsMHgxZCwweDIwLDB4YTMsMHgwNywweGEwLDB4NzMsMHg4NCwweDU4LDB4MGIsMHhiZiwweDcyLDB4NzAsMHgzMCwweDVhLDB4MDEsCisgIDB4MTEsMHg4ZiwweDk4LDB4OGQsMHhjMSwweGEwLDB4YTQsMHg1NCwweDU3LDB4NjMsMHgxNywweDU1LDB4ZjEsMHgxZiwweDljLDB4NGIsCisgIDB4MzgsMHg1NywweDE3LDB4ZTcsMHgxZSwweDc2LDB4YWYsMHgxZSwweDgwLDB4MmQsMHhlNywweGJjLDB4YzEsMHg5YywweGFkLDB4M2IsCisgIDB4NTMsMHg3NSwweDIyLDB4MjEsMHgzOSwweGQ3LDB4OTUsMHhjZiwweDA3LDB4YzQsMHgwZiwweGNlLDB4NzYsMHhkOSwweDIzLDB4NTksCisgIDB4MzgsMHgzMiwweGE3LDB4YzMsMHg5YywweDhmLDB4NzIsMHgxMSwweDliLDB4MzIsMHhiMiwweDhiLDB4NGEsMHg1NCwweDY1LDB4ZmIsCisgIDB4YWMsMHhlMywweGM4LDB4MTksMHgxMiwweDFiLDB4YWUsMHg3YiwweDVlLDB4ZGQsMHgzMywweGQzLDB4YmQsMHgzYiwweDZiLDB4ZWMsCisgIDB4NGIsMHg3MiwweGY2LDB4ZmUsMHhmNSwweDYzLDB4YjYsMHgxOSwweDc1LDB4N2YsMHhkYiwweGYzLDB4ZjUsMHg2ZiwweGJlLDB4YTcsCisgIDB4NTksMHgxNSwweDY2LDB4M2IsMHgwNSwweGYzLDB4ZTMsMHhjMCwweDEzLDB4NzIsMHg5MCwweGVkLDB4MTQsMHhhYywweDhmLDB4MjQsCisgIDB4NGYsMHg4NiwweGFjLDB4N2YsMHgzNiwweDc4LDB4ZDQsMHhjNywweGY3LDB4OTgsMHhmOSwweDcxLDB4NWMsMHhlMCwweGViLDB4OGYsCisgIDB4YTYsMHgwNCwweGE0LDB4ZDEsMHhlNCwweDAyLDB4NTIsMHgzOCwweGNiLDB4ZjQsMHhkNSwweDA3LDB4NzgsMHhkMSwweDJmLDB4MGQsCisgIDB4MzEsMHhiYywweDFmLDB4MGEsMHhkNywweDg3LDB4MGMsMHg4MywweDQyLDB4ZjUsMHgyMSwweDgzLDB4NjAsMHhiNCwweDUwLDB4N2QsCisgIDB4NDgsMHg0NywweDUwLDB4YzQsMHgyMiwweGVkLDB4ZjIsMHgxZiwweGY3LDB4ZjcsMHgwZCwweGY4LDB4YmYsMHg1OCwweGUwLDB4NGIsCisgIDB4OWMsMHhmZSwweGIwLDB4N2UsMHhkYSwweDMzLDB4Y2UsMHhhOSwweDBmLDB4OTksMHg3YywweDNlLDB4MjQsMHgwZCwweGFhLDB4YzIsCisgIDB4N2MsMHhlMSwweGZhLDB4NDgsMHhiOCwweDJjLDB4YzMsMHgyZSwweDk2LDB4N2MsMHhiOCwweGZkLDB4ZDEsMHgyMiwweGQ2LDB4YzcsCisgIDB4YTYsMHg1NiwweGI3LDB4ZGUsMHhiMiwweGZmLDB4NDQsMHhhOCwweDBmLDB4YzksMHg3OCwweGFjLDB4OGEsMHhkNywweDA3LDB4ZTAsCisgIDB4MDAsMHg1ZSwweDdkLDB4NDgsMHgxZSwweDI4LDB4NTQsMHgxZiwweDgwLDB4Y2QsMHg3ZiwweGRjLDB4ZjEsMHhlMSwweGZhLDB4MDAsCisgIDB4YTUsMHhkNSwweDQ3LDB4MmEsMHhhZCwweDNlLDB4NzYsMHg4NCwweGZhLDB4MDAsMHg5MSwweGY4LDB4MGYsMHhjNywweGZmLDB4YzUsCisgIDB4MDMsMHg5ZCwweGRjLDB4ZmEsMHg5MCwweDE0LDB4YTAsMHhlYiwweDJiLDB4ZjIsMHhmYSwweGEzLDB4ZjEsMHgwMCwweGFiLDB4M2UsCisgIDB4OTIsMHhiMywweGJhLDB4NDcsMHhkOSwweGViLDB4ZjUsMHhlNiwweDEzLDB4ZWEsMHg4ZiwweDE2LDB4MDAsMHhiMywweDAyLDB4ZjUsCisgIDB4OTEsMHg4MiwweGZkLDB4ZDEsMHg4MiwweGYzLDB4OWYsMHg2ZiwweGYzLDB4MWYsMHg3NywweDdmLDB4ZmEsMHhmYiwweGEzLDB4ZjEsCisgIDB4MDAsMHhiMSwweDNmLDB4MTQsMHhhZCwweDBmLDB4NzAsMHgwMywweGE3LDB4M2YsMHgxYSwweDJiLDB4MmQsMHg4ZSwweGFhLDB4MGYsCisgIDB4ZTAsMHg3ZSwweGMyLDB4ZjUsMHgwMSwweDAyLDB4YzAsMHhhYSwweDU3LDB4NDMsMHhlYSwweDYzLDB4NmIsMHg0MiwweGQ4LDB4ZGIsCisgIDB4MTUsMHgwNiwweDk0LDB4ZmYsMHg0YiwweDk5LDB4NWYsMHhjMSwweDJkLDB4MGIsMHg4MCwweGMxLDB4ZjUsMHgwOCwweDM0LDB4MWQsCisgIDB4ZTMsMHhkNSwweDA3LDB4YjgsMHg4NywweGFkLDB4NmYsMHgyOSwweGZmLDB4NTcsMHgzMiwweGNhLDB4ZjksMHg3NSwweDgyLDB4ZDQsCisgIDB4NDcsMHhiYSwweDhhLDB4ZDIsMHgzZiwweGJmLDB4YTQsMHgwYSwweGQ1LDB4OGUsMHhmMywweGViLDB4NjMsMHgxNywweDVmLDB4MmYsCisgIDB4ZTUsMHhmZiwweDkyLDB4MjksMHhlOSwweDA1LDB4ZGQsMHhlZSwweDkzLDB4NGUsMHgwNCwweDNlLDB4NjUsMHg3ZiwweDZlLDB4MDksCisgIDB4ZDUsMHg4NywweDBjLDB4ODIsMHhkMSwweDhkLDB4MDcsMHhlYiwweDhlLDB4YjEsMHhlYiwweDIzLDB4ZjksMHhmMiwweGU1LDB4MzcsCisgIDB4NTIsMHhmZiwweDkxLDB4ZDEsMHgxZiwweDJkLDB4NDQsMHgwMywweGJlLDB4NGMsMHhhZSwweGQ0LDB4MTEsMHhmYiwweDBmLDB4YWUsCisgIDB4MGYsMHhiMCwweDhjLDB4NzksMHg3ZSwweDQ5LDB4MWMsMHhmZiwweGQ3LDB4NzYsMHhmMCwweDY4LDB4YTEsMHhmMywweDZlLDB4NTYsCisgIDB4YzAsMHhmZSwweDAzLDB4YzIsMHhkOSwweDYxLDB4MGMsMHhmZSwweDQzLDB4ZWMsMHgzZiwweDRhLDB4MzgsMHg1YSwweGZlLDB4YmQsCisgIDB4NzAsMHg3YywweGI4LDB4ZTgsMHhmMSwweDlmLDB4NzksMHhiYywweGY1LDB4N2EsMHhlMCwweGMxLDB4MTksMHg2OSwweGJhLDB4OWMsCisgIDB4OTcsMHgxZiwweDE3LDB4YjksMHgzZiwweDQ4LDB4NTQsMHhmZSwweGMzLDB4YTgsMHg4ZiwweGNkLDB4NWEsMHhlZiwweDE1LDB4ZjAsCisgIDB4OWYsMHgwOCwweGZjLDB4NjQsMHg4MiwweDU3LDB4MWYsMHg5YiwweDAzLDB4M2UsMHg0YiwweGZlLDB4NTMsMHhhMCwweDNlLDB4MjQsCisgIDB4MTcsMHhjYywweDk0LDB4YzIsMHg3ZiwweGY4LDB4ZjUsMHgyMSwweGI5LDB4ZTAsMHg4ZCwweDAyLDB4ZjUsMHhiMSwweDk5LDB4ZjYsCisgIDB4MWYsMHg5YSwweGZmLDB4ODQsMHhiYSwweGY1LDB4N2QsMHg5YSwweGZjLDB4NjcsMHgxNCwweDQ0LDB4NTksMHgyZiwweGM1LDB4N2YsCisgIDB4ZjYsMHg3ZSwweGJlLDB4ZjksMHgwZiwweGE3LDB4OWYsMHhjNSwweDI3LDB4ZTYsMHgzZiwweDQ3LDB4ZmMsMHhmYywweDY3LDB4ZmUsCisgIDB4YTcsMHhjMiwweDdmLDB4YTgsMHhmYSwweDQ4LDB4YzMsMHg1YywweGZlLDB4NTMsMHhmZCwweGE5LDB4ZjAsMHgxZiwweDEwLDB4ZTQsCisgIDB4M2YsMHhjNSwweGZhLDB4ODMsMHhkNCwweDE0LDB4ZTEsMHgzZiwweGMxLDB4ZmUsMHhiMCwweGM5LDB4MjgsMHhmMywweGE3LDB4ZjgsCisgIDB4OGYsMHhmMCwweDI5LDB4ZjMsMHg5ZiwweGM4LDB4ZjksMHg3MSwweDlmLDB4OTAsMHhmZiwweGI0LDB4ZmEsMHhlZCwweDNmLDB4ZmIsCisgIDB4NjksMHhmZSwweDEzLDB4MGMsMHhkYiwweDYzLDB4ZjAsMHgxZiwweDVmLDB4N2QsMHg0OCwweDJlLDB4ZTAsMHhmMiwweDFmLDB4MGUsCisgIDB4MjAsMHhmYywweGM3LDB4YTQsMHhmYSwweGEzLDB4NDUsMHhlMiwweDNmLDB4OTEsMHhmNCwweDBmLDB4ZTEsMHgzZiwweGFhLDB4ZGIsCisgIDB4MWYsMHhiNiwweDMwLDB4ZmYsMHhmMSwweDdlLDB4MmYsMHgyMywweGQyLDB4ZmIsMHgxNywweGUxLDB4M2YsMHg0NiwweDk4LDB4ZmYsCisgIDB4ODgsMHhlMSwweGY1LDB4MWUsMHhmNywweGU2LDB4MzMsMHhjMCwweGM4LDB4OGYsMHhhMywweDgxLDB4MWMsMHhiMCwweGZmLDB4OTgsCisgIDB4NWMsMHhmZSwweGUzLDB4ZjMsMHg3ZiwweDZkLDB4YTMsMHhmOSwweDRmLDB4ZjEsMHhmMywweGFiLDB4NDAsMHg3ZSwweDVjLDB4MTgsCisgIDB4YWMsMHgzZiwweDU4LDB4Y2IsMHg4YiwweGZmLDB4ZTEsMHhmMiwweDAxLDB4NmYsMHg3ZiwweGMyLDB4MmEsMHgxZSwweGZmLDB4ODksCisgIDB4MTAsMHhmZiwweGMzLDB4MDMsMHg3NSwweGQzLDB4MjIsMHhjNSwweDdmLDB4MTQsMHg3YiwweDkzLDB4NzQsMHhkMiwweDgxLDB4NDAsCisgIDB4ZGEsMHhkMiwweGYxLDB4MDQsMHg5MywweGZmLDB4OGMsMHgwZCwweDMzLDB4NjksMHg4ZiwweGQ5LDB4NzQsMHg0MiwweGUxLDB4ZjksCisgIDB4YmYsMHg1OCwweGNiLDB4ZDQsMHhiNSwweDZlLDB4ZGEsMHgzMCwweGM4LDB4OGEsMHhmZiwweGYxLDB4OGIsMHhmMSwweDg3LDB4M2EsCisgIDB4NWQsMHg2OCwweDg4LDB4ZWYsMHhmZiwweGIyLDB4YzEsMHg3ZiwweDgzLDB4NWUsMHg5ZCwweDJlLDB4YTQsMHhmOSwweGVmLDB4NDUsCisgIDB4ZmIsMHhjMywweGFlLDB4ZjAsMHhmYiwweDA3LDB4OGIsMHhmMiwweDlmLDB4NzYsMHg5MywweDhlLDB4NmYsMHg5OSwweDA5LDB4ZjksCisgIDB4YmYsMHgyNCwweGRmLDB4ZmMsMHg1ZiwweDFjLDB4NjksMHg3ZiwweDlkLDB4OWUsMHgzZiwweDVkLDB4MWYsMHg4OSwweGE5LDB4N2YsCisgIDB4YTAsMHgzNiwweDQ1LDB4Y2IsMHg4NywweGY0LDB4ODcsMHhiZCwweDEwLDB4YTgsMHgwZiwweGUwLDB4ODIsMHhmZCwweDUzLDB4NzQsCisgIDB4M2MsMHg4YywweGNmLDB4ZmYsMHhlNSwweDA2LDB4ZjksMHhmOCwweDY4LDB4NGYsMHhkYSwweDJlLDB4OTQsMHhlZCwweGQ5LDB4N2YsCisgIDB4MjgsMHhmZiwweDE3LDB4NTMsMHgzZSwweGNiLDB4N2MsMHhmZSwweDYyLDB4ZTIsMHhmZiwweDBhLDB4YzQsMHhmZiwweDM4LDB4ZTAsCisgIDB4NDMsMHhkMCwweGRlLDB4ZWQsMHhkMywweDU3LDB4NWUsMHhmZCwweGNmLDB4YzksMHgxNCwweDUzLDB4ZmYsMHhjMCwweDg2LDB4OGMsCisgIDB4ZGYsMHhmZiwweGU1LDB4Y2EsMHgzMywweDU0LDB4MWYsMHg4MCwweDM0LDB4OGEsMHg2NSwweGZhLDB4YmYsMHhiNiwweGNiLDB4Y2MsCisgIDB4ZmQsMHgwNiwweDFhLDB4Y2YsMHhmYSwweGY0LDB4MGYsMHhjZiwweGZmLDB4ZTUsMHg4MCwweDczLDB4ODAsMHgzNCwweDhhLDB4Y2QsCisgIDB4MTUsMHhmNCwweDdmLDB4YjksMHhlMCwweDg1LDB4NDgsMHhmZSwweDJmLDB4MGYsMHhlNCwweGRiLDB4NzUsMHgyYSwweGJlLDB4YTUsCisgIDB4YmMsMHg0MCwweDdkLDB4MDAsMHgwNywweDg4LDB4NzcsMHhiNywweDk0LDB4ZTIsMHhmZiwweGQyLDB4MTcsMHhmYSwweDBhLDB4NjUsCisgIDB4ZjMsMHhmYywweDVmLDB4MDQsMHgzNCwweDNiLDB4ODUsMHhiMiwweDI1LDB4YWIsMHg5NCwweDc0LDB4NzEsMHhmZiwweGQ3LDB4ZDMsCisgIDB4NzYsMHgyMCwweDkwLDB4MTMsMHgxYSwweGM0LDB4ZjYsMHg3ZiwweDUxLDB4NDAsMHg1ZiwweGU2LDB4MmIsMHg5NCwweDRkLDB4ZjksCisgIDB4YmYsMHhhOCwweGYxLDB4MmEsMHg3MSwweDg0LDB4YzEsMHg5NSwweGJkLDB4NzQsMHhmYywweDBmLDB4YjMsMHgzZSwweGE0LDB4ZTEsCisgIDB4YTMsMHgzZCwweDVhLDB4NGIsMHg3NCwweGZmLDB4MTcsMHgzOCwweDE0LDB4MjgsMHgwYywweGM1LDB4OGMsMHhmZiwweGYxLDB4ZmYsCisgIDB4MTAsMHhlMywweDBhLDB4ZGIsMHhmZiwweGM1LDB4ZTMsMHg2ZiwweDg2LDB4MmYsMHhmZSwweDg3LDB4ZjgsMHhiZiwweDZhLDB4ZDgsCisgIDB4ZmMsMHg2NywweGY5LDB4ZWQsMHg0YiwweGE4LDB4MmIsMHg0YywweGZmLDB4NTcsMHg4MCwweGY2LDB4ZDAsMHhmMSwweDNmLDB4MmMsCisgIDB4ZmYsMHgxNywweGEwLDB4NjgsMHhjZiwweDBiLDB4ZWEsMHg5MiwweDdjLDB4MGIsMHhiYiwweDNlLDB4YTQsMHhhNywweDdmLDB4NzQsCisgIDB4OWYsMHg3ZSwweDZlLDB4OWQsMHhhMSwweGY1LDB4MGYsMHhjNywweGZmLDB4NDUsMHg4MCwweGIyLDB4MzgsMHhkYiwweGMyLDB4ZjMsCisgIDB4N2YsMHgzMSwweDY5LDB4Y2YsMHhmMiwweGE5LDB4NTYsMHhhZSwweGZmLDB4ZWIsMHgyZiwweDAyLDB4YTcsMHhiOSwweGE1LDB4NDYsCisgIDB4NzQsMHg5ZiwweDNlLDB4MjEsMHhlZiwweGJmLDB4N2IsMHg1ZiwweDA4LDB4NTUsMHgzMywweGJlLDB4MDQsMHgyZSwweGMxLDB4OWYsCisgIDB4NGUsMHhkMSwweGU3LDB4OTcsMHg0OSwweGY4LDB4YTcsMHg5ZCwweDdmLDB4MzEsMHhlYSwweDlmLDB4ZmYsMHhkMywweGEwLDB4NjksCisgIDB4NTUsMHg4YiwweDhmLDB4ZmYsMHhiOCwweGUzLDB4ZDksMHhmNiwweDlmLDB4YTcsMHg0MSwweDgzLDB4NGUsMHgxNywweDg2LDB4YTIsCisgIDB4ZWIsMHg0MywweGIyLDB4ZjQsMHhjZiwweDYxLDB4MmYsMHhmMSwweGM3LDB4YmUsMHhmMiwweDBhLDB4NTUsMHgxZiwweDIwLDB4ZTQsCisgIDB4YmYsMHg2MCwweDljLDB4MmYsMHgxYywweGZmLDB4MTcsMHhlZCwweDI4LDB4ZjQsMHgwNSwweDY2LDB4NzAsMHhmYywweDVmLDB4YTQsCisgIDB4NTAsMHg5MiwweDg5LDB4MGIsMHgwNSwweDMwLDB4ZmQsMHg1ZiwweDRjLDB4ZmUsMHhmMywweDJmLDB4NDYsMHg1YiwweDk2LDB4M2UsCisgIDB4YmYsMHgzOCwweGZlLDB4MmYsMHgwZiwweGEwLDB4NmQsMHg2NiwweGQyLDB4ZTMsMHhhOSwweGZhLDB4ZDgsMHhlMSwweGZhLDB4MDAsCisgIDB4OTYsMHg3YywweDVhLDB4NzUsMHhhYSwweDkwLDB4NzgsMHg4NiwweGYyLDB4N2YsMHhmMSwweGY4LDB4MGYsMHhhMCwweGU1LDB4NDMsCisgIDB4ZWEsMHg0MywweGVlLDB4MGYsMHhkNiwweDA3LDB4YjAsMHgwMywweGExLDB4ODUsMHg2MCwweDNkLDB4MjgsMHg4NiwweGZkLDB4ZTcsCisgIDB4OWUsMHhkZiwweDQ3LDB4ZmIsMHg0ZiwweGIwLDB4M2UsMHgxMiwweDFiLDB4NzAsMHhmYiwweGEzLDB4ZmQsMHg1ZiwweGQ5LDB4N2YsCisgIDB4ZTQsMHgyYiwweGIzLDB4ZmYsMHgxNCwweGY3LDB4N2YsMHg1NSwweDVkLDB4OTEsMHhmZCwweGE3LDB4NTAsMHg3ZiwweGI0LDB4YTIsCisgIDB4ZjYsMHg5ZiwweDA4LDB4ZjIsMHhmOSwweDE0LDB4ZmQsMHg1ZiwweGQxLDB4ZmEsMHhjMywweDdlLDB4NmUsMHhlZCwweDNmLDB4YmYsCisgIDB4MWQsMHhmZiwweDU3LDB4ZTEsMHhmZSwweDY4LDB4ODUsMHhlYywweDNmLDB4N2MsMHhmZiwweDE3LDB4MjcsMHhmZSwweGU3LDB4NGEsCisgIDB4ZmQsMHg1ZiwweGQxLDB4ZmEsMHhjMywweDQ2LDB4YjYsMHhmZiwweDkwLDB4ZmEsMHg0OCwweDYyLDB4NDEsMHhmYiwweDhmLDB4NjcsCisgIDB4N2YsMHg4OCwweDY4LDB4ZmYsMHg3MSwweGVmLDB4N2YsMHg4NSwweGY1LDB4YjEsMHhiOSwweGY2LDB4MWYsMHhkZCwweDFiLDB4NWYsCisgIDB4OWEsMHhmZCwweDI3LDB4ZDgsMHgxZiwweDhkLDB4MGQsMHgzOCwweGZkLDB4NDEsMHg0YSwweGFmLDB4OGYsMHg1ZCwweGQ0LDB4ZmUsCisgIDB4MTMsMHhlZSwweDhmLDB4MTYsMHhiMSwweDNmLDB4NmMsMHg0NCwweGZiLDB4MGYsMHg5YiwweGZmLDB4MDQsMHhlMywweDlkLDB4MGEsCisgIDB4ZjUsMHg0NywweDYzLDB4MDEsMHg1NiwweDdmLDB4MzQsMHg5MSwweDBhLDB4ODQsMHg3ZSwweDMzLDB4YTgsMHgzZiwweDBiLDB4ZjQsCisgIDB4NDcsMHgyMywweGEwLDB4OWMsMHhjMSwweDdmLDB4MjgsMHhmZiwweDU3LDB4ODEsMHhjMCwweDA2LDB4N2UsMHg3ZiwweGI0LDB4MTIsCisgIDB4ZWQsMHgzZiwweDljLDB4NzgsMHgyMSwweDdlLDB4N2YsMHgzNCwweGRjLDB4YmYsMHgzMiwweDIwLDB4MWYsMHg4OSwweDViLDB4MWYsCisgIDB4MjksMHhkOCwweDM2LDB4OTcsMHhjMSwweDdmLDB4MjIsMHhkOSwweDdmLDB4ZjgsMHhmZCwweDYxLDB4MDksMHhkOCwweDk2LDB4MzgsCisgIDB4NGYsMHgwYSwweDQ1LDB4MDYsMHhmOSwweGNmLDB4MmMsMHgxZiwweGRiLDB4YjksMHgxMywweDNjLDB4ZDcsMHg3NywweDI3LDB4NTQsCisgIDB4N2UsMHg0YywweDFhLDB4ODUsMHgxNCwweGUzLDB4M2YsMHgzZiwweGMyLDB4ZjksMHgxNCwweGI1LDB4NWUsMHhhMywweDkwLDB4NGMsCisgIDB4NjEsMHhmZSwweDYzLDB4ZmQsMHgyMiwweDNiLDB4NWIsMHhmMiwweGE0LDB4NTEsMHg0OCwweDcxLDB4ZmUsMHhkMywweDA2LDB4MTMsCisgIDB4MGYsMHhjNSwweGJkLDB4NDcsMHhhOSwweDI4LDB4ZmYsMHg5MSwweDU3LDB4YzIsMHhlYSwweGVlLDB4ZjgsMHg1ZiwweDk2LDB4YzAsCisgIDB4N2YsMHg1NCwweGM0LDB4M2YsMHg1YiwweGQ1LDB4YTgsMHhmYywweDA3LDB4YmQsMHhhZCwweDI5LDB4MDcsMHgyYiwweGVkLDB4YWYsCisgIDB4ODYsMHhhMiwweGYxLDB4MWYsMHg0NSwweGFkLDB4MmMsMHgyMSwweGZlLDB4NjcsMHhjOSwweDU0LDB4Y2IsMHgzNywweDQ5LDB4ZTMsCisgIDB4OGMsMHg1MywweGFhLDB4N2IsMHg3ZiwweDNlLDB4ZmYsMHg0OSwweDFjLDB4OGMsMHgyNywweGEyLDB4ZjMsMHgxZiwweDdmLDB4MjAsCisgIDB4NTksMHgxNCwweGZlLDB4OTMsMHhjOCwweGM3LDB4NWIsMHg0YiwweGUxLDB4M2YsMHg0YSwweGQ2LDB4NGIsMHhhNCwweDZkLDB4NjQsCisgIDB4ZjMsMHg5ZiwweDk0LDB4NmYsMHhiZCwweDk1LDB4Y2IsMHhjOSwweDdhLDB4MjMsMHhmMCwweDlmLDB4OTMsMHg5NSwweGQ3LDB4OTEsCisgIDB4NzgsMHhhYSwweGUyLDB4ZmMsMHg2NywweGM5LDB4YzgsMHhhYywweDY5LDB4YTksMHg4NSwweGQ4LDB4N2YsMHhkYywweGY5LDB4NzAsCisgIDB4ZjgsMHg4ZiwweGI4LDB4MDIsMHgyYywweDg2LDB4ZmQsMHhhNSwweGYwLDB4OWYsMHg0YywweDYyLDB4NmYsMHhiYywweDM5LDB4M2EsCisgIDB4ZmYsMHg2OSwweGM1LDB4ZjksMHg0NywweGNkLDB4YTUsMHhmMCwweDFmLDB4NDUsMHgyNSwweGUzLDB4OGIsMHhmMywweDFmLDB4ZjQsCisgIDB4N2UsMHg1NywweDVmLDB4ODksMHhiZSwweDEyLDB4MjMsMHhmMywweDlmLDB4NTYsMHgyYSwweDExLDB4YmIsMHgzOCwweGZmLDB4ZjksCisgIDB4MmIsMHhiZCwweGZhLDB4NjQsMHg0OSwweGZjLDB4MjcsMHg1YiwweDdkLDB4NWEsMHg2YSwweDJlLDB4ODEsMHhmZiwweDY4LDB4ZjEsCisgIDB4ZGQsMHhhNCwweDUxLDB4NDgsMHgyNCwweGZlLDB4NTMsMHgyZiwweGNhLDB4MjUsMHhmMCwweDlmLDB4YWUsMHgzOCwweDJkLDB4Y2YsCisgIDB4MjAsMHhmZiwweGU5LDB4NzgsMHgzMCwweDRjLDB4NjMsMHg4NiwweDg3LDB4OWEsMHg0YiwweGUyLDB4M2YsMHg3YiwweDRhLDB4ZTQsCisgIDB4M2YsMHgwMywweDQ0LDB4ZmUsMHgyYywweGZlLDB4OTMsMHgwOSwweGQzLDB4OWUsMHg5NiwweDkyLDB4ZjgsMHhjZiwweDRkLDB4ZTQsCisgIDB4NzksMHg4OSwweGM0LDB4N2YsMHg2NiwweGZhLDB4ZTYsMHhiYSwweGE2LDB4OTUsMHg0OCwweGZjLDB4YTcsMHgzYiwweDZlLDB4N2YsCisgIDB4YjUsMHhmMSwweGVlLDB4NGUsMHgxZSwweGZmLDB4MjEsMHhmNiwweDFmLDB4NzQsMHgwYywweGQ1LDB4OTcsMHhjOCwweDdmLDB4NGUsCisgIDB4N2IsMHhlNywweDU3LDB4NTMsMHgyNCwweGZlLDB4ZTMsMHhlOCwweDlmLDB4ZjEsMHhmOCwweDhlLDB4MjgsMHhmMSwweDNmLDB4NjMsCisgIDB4NDgsMHhlZCwweGNjLDB4OGQsMHhjZSwweDdmLDB4ZDAsMHg0MSwweGQwLDB4NmUsMHhjOSwweDczLDB4M2IsMHg4ZiwweGZmLDB4ZjgsCisgIDB4ZjUsMHgyNywweDUyLDB4YjMsMHg0ZiwweDVhLDB4ZmEsMHhmMywweDFlLDB4N2MsMHhlNSwweGRkLDB4NDgsMHhmYywweDg3LDB4NjUsCisgIDB4ZmYsMHg2MSwweGM1LDB4ZmYsMHg1OCwweDFhLDB4N2UsMHgyYywweDkxLDB4OTUsMHg5NiwweDgzLDB4MTIsMHhmOCwweDRmLDB4NjUsCisgIDB4OWUsMHgxNCwweDdlLDB4OGMsMHhlMiwweGZmLDB4NTIsMHhlOCwweGYxLDB4N2MsMHhmZSwweGUzLDB4ODEsMHg0YSwweGVhLDB4YmMsCisgIDB4ZTMsMHhmMiwweDFmLDB4MGIsMHhkOCwweDEyLDB4NGIsMHhmNCwweDkyLDB4NDIsMHhjNCwweDJjLDB4ZmUsMHhkMywweGU5LDB4M2YsCisgIDB4ZGYsMHhmOSwweGZjLDB4NDcsMHhiZCwweDBjLDB4NmYsMHg4YywweDFjLDB4ZmYsMHg2MywweDYyLDB4ZmUsMHgwMywweDFhLDB4OGIsCisgIDB4ZDksMHg3ZiwweDNjLDB4ZmIsMHhmMywweDQ0LDB4Y2MsMHgwYiwweGEyLDB4OGIsMHg2YSwweGZmLDB4MTEsMHg4MiwweGQ5LDB4ZWUsCisgIDB4MDQsMHhiOCwweGE5LDB4NzYsMHhjNCwweGZmLDB4NjUsMHhmMSwweDFmLDB4OTEsMHhkMywweDQ2LDB4ODcsMHg2MSwweGZmLDB4ZTEsCisgIDB4ZjksMHhiZiwweGEyLDB4ZTYsMHg3ZiwweDE1LDB4YjMsMHhmZiwweDljLDB4NjIsMHhlZiwweDg3LDB4ODIsMHhmNiwweDlmLDB4ZTcsCisgIDB4OGEsMHhiZSwweDJmLDB4NTAsMHhmZSwweGFmLDB4NjgsMHhmMSwweDNmLDB4OTQsMHhmZiwweDJiLDB4OWEsMHhmZCwweGM3LDB4ZjMsCisgIDB4N2YsMHgwNSwweGZhLDB4YzMsMHg3MiwweGVjLDB4M2YsMHhkZSwweGYzLDB4MTgsMHhjZCwweGZlLDB4YzMsMHhhZCwweDhmLDB4Y2QsCisgIDB4YjMsMHhmZiwweDc4LDB4ZmEsMHgwZCwweGZhLDB4ZWQsMHgzZiwweDdmLDB4NjIsMHg4MSwweDhhLDB4NDIsMHhmZCwweDQxLDB4MjIsCisgIDB4ZjksMHhkZiwweDQxLDB4MzEsMHhmZSwweGMzLDB4Y2QsMHhmZiwweDhhLDB4NjgsMHhmZiwweDcxLDB4ZTcsMHgxZiwweGQ1LDB4ZmUsCisgIDB4ZTMsMHhjZSwweGZmLDB4YjMsMHhiMSwweGZmLDB4MWMsMHhmNywweGYzLDB4MWYsMHhiZCwweDk4LDB4M2QsMHg4NCwweGY4LDB4YmYsCisgIDB4M2UsMHgyMywweGZiLDB4OGYsMHgzZiwweGZmLDB4NGIsMHgwZiwweDBjLDB4NTMsMHhiYywweDBjLDB4YTksMHhlZiwweDdkLDB4NDIsCisgIDB4ZmIsMHgwZiwweGYxLDB4N2YsMHg2MSwweGZlLDB4YTMsMHgwNSwweDk2LDB4NTksMHgxMSwweGVhLDB4MGYsMHhlMiwweGVkLDB4OWYsCisgIDB4YzIsMHhmNiwweDFmLDB4ODUsMHg5NSwweGZmLDB4NDUsMHhlYywweDNmLDB4ZGMsMHhjNCwweDJlLDB4YzIsMHg3ZiwweGE2LDB4MjMsCisgIDB4ZDksMHg3ZiwweGNlLDB4OTUsMHg2OCwweGZmLDB4ZTEsMHhlNCwweDdmLDB4N2QsMHgzNiwweGY2LDB4MWYsMHhhNSwweGY4LDB4ZjMsCisgIDB4NGIsMHhmYywweDVmLDB4ZDEsMHhlYywweDNmLDB4ZWYsMHhkMCwweGZjLDB4NDcsMHhmOSwweDhkLDB4NWEsMHg1NCwweDlmLDB4MTAsCisgIDB4N2UsMHgxMiwweGJiLDB4MjQsMHg1YywweGZlLDB4YzEsMHhjYSwweGE5LDB4ZjIsMHgyMiwweGY2LDB4MWYsMHg1NywweDNlLDB4YmUsCisgIDB4ZmUsMHhiMCwweDdjLDB4ZmIsMHgwZiwweGM5LDB4ZmYsMHhmMiwweGYzLDB4OWYsMHgwNSwweGVjLDB4ZjEsMHgzZSwweGZlLDB4YTMsCisgIDB4NTAsMHg2MSwweGNmLDB4MDksMHg4ZSwweGZkLDB4ODcsMHhjYSwweGZmLDB4N2EsMHg1YywweDU5LDB4NDksMHg1NiwweGI3LDB4OTAsCisgIDB4NjMsMHgzZiwweDI3LDB4ZmMsMHg0NywweGJmLDB4NzIsMHhmZSwweDUzLDB4MjgsMHhmZiwweDBiLDB4NDYsMHhiMiwweGZmLDB4MTQsCisgIDB4ZjMsMHg3ZiwweGI5LDB4NDAsMHgyOSwweGNlLDB4N2YsMHhkNiwweDg3LDB4ZTQsMHhiMywweDNlLDB4YzAsMHg3ZiwweDk4LDB4ZmUsCisgIDB4NDEsMHgwYywweGJjLDB4N2MsMHg3ZiwweDlhLDB4ZmYsMHg3YywweGZkLDB4YTMsMHg5YSwweDUyLDB4ZWQsMHgzZiwweDk3LDB4ZTAsCisgIDB4ZDIsMHhlNiwweGM0LDB4NjQsMHg3OSwweDNiLDB4OTgsMHg4NCwweGQ3LDB4NmEsMHg1NSwweDkzLDB4ZDIsMHhlYywweDIyLDB4ZmUsCisgIDB4YWYsMHg2NywweDYxLDB4MjMsMHg1MCwweGZhLDB4NDQsMHg2ZCwweDY0LDB4YjcsMHg4MiwweDAwLDB4YzgsMHgyYywweGI0LDB4NjgsCisgIDB4Y2YsMHgyYywweGFlLDB4ZmYsMHhlYiwweDU5LDB4YzEsMHg1MCwweDk0LDB4NWEsMHg1MSwweDg2LDB4MTAsMHgzNCwweDZhLDB4MGEsCisgIDB4YTgsMHg5NSwweDgzLDB4ZmIsMHgyMSwweDYwLDB4ZmYsMHg3OSwweDU2LDB4NDYsMHhiNywweDU1LDB4YzUsMHg1NSwweDYwLDB4MzcsCisgIDB4NDAsMHgwMCwweGEyLDB4ZDcsMHhhZSwweDgyLDB4ZjEsMHhjZiwweGVhLDB4NmYsMHg0MCwweGJiLDB4ZDEsMHhiYSwweDViLDB4NmEsCisgIDB4MDQsMHhhZiwweGMwLDB4YzMsMHgzMCwweDcxLDB4YjAsMHhiYSwweDI1LDB4NmMsMHgxZiwweDBiLDB4ZTQsMHg3ZiwweGJkLDB4YjgsCisgIDB4YWEsMHg3YSwweDU0LDB4M2EsMHhhOCwweDdmLDB4YWMsMHhhZSwweDg0LDB4YjMsMHg2NiwweGU2LDB4NWMsMHgwOCwweDE1LDB4MTIsCisgIDB4MGYsMHhkYSwweDdmLDB4ZmUsMHhkYywweDQ4LDB4MGMsMHg0YiwweDBiLDB4ZDUsMHg1NywweDYwLDB4M2IsMHg0YywweDFjLDB4OTEsCisgIDB4NWEsMHg0MiwweGY5LDB4ZGQsMHg3ZSwweGZiLDB4MGYsMHg2MiwweGZiLDB4ODYsMHgzMiwweDhjLDB4YTYsMHg3ZCwweDFmLDB4ZDQsCisgIDB4YTAsMHg3MiwweGE0LDB4YjYsMHhjNSwweDVmLDB4MGYsMHgyYSwweDY0LDB4ZmYsMHgzOSwweDBjLDB4YWUsMHg4MSwweDhhLDB4MjYsCisgIDB4MmEsMHhlMCwweDdlLDB4YTAsMHhlMSwweGZlLDB4MjAsMHhiMiwweDJhLDB4NTksMHg2MiwweDUxLDB4MjcsMHhkZCwweGQyLDB4MDEsCisgIDB4N2UsMHhmYiwweGNmLDB4ZDMsMHg3MCwweGYxLDB4ODgsMHg3MiwweDg3LDB4ZjgsMHgyNSwweGIwLDB4MTMsMHhlNywweDgzLDB4NzcsCisgIDB4ODksMHgzNywweDg0LDB4ZjIsMHhjMSwweGZkLDB4ZmUsMHhhZiwweDczLDB4ZTAsMHgwZiwweDkxLDB4NTgsMHhjYSwweDViLDB4YzEsCisgIDB4MzEsMHg5MCwweGQ2LDB4MTMsMHgyMCwweDJlLDB4ZTMsMHhmZSwweDIwLDB4MDUsMHhmYywweDVmLDB4OTcsMHg5YywweGI2LDB4NzEsCisgIDB4YzIsMHgyNSwweDVjLDB4MzYsMHhjMSwweDk0LDB4ZmUsMHhhNywweGI4LDB4ZmYsMHg2YiwweDJhLDB4ZjEsMHg1OCwweDI3LDB4MTIsCisgIDB4MGIsMHhiNCwweGYyLDB4MTMsMHg4ZiwweDg5LDB4NDEsMHhmOSwweDg0LDB4ZWQsMHgzZiwweDJkLDB4NDYsMHg2NSwweDRhLDB4ZGMsCisgIDB4MDUsMHhmNiwweDYzLDB4ZWQsMHg3MSwweDBhLDB4ZWMsMHgyYSwweGVhLDB4ZmYsMHg1MiwweGVlLDB4MTYsMHhlNywweDgzLDB4NDcsCisgIDB4ZWMsMHhiMCwweDlmLDB4MzcsMHg0MiwweGViLDB4MGQsMHhkOCwweDdmLDB4ZjQsMHg1NiwweGIzLDB4MGIsMHg2NywweGNmLDB4M2QsCisgIDB4ODQsMHg4OSwweGY0LDB4NTcsMHg2YiwweDVmLDB4MzEsMHg4MywweGZkLDB4NTYsMHgwMiwweGY2LDB4MWYsMHg3NSwweDQ1LDB4M2UsCisgIDB4MzEsMHgyMiwweDI5LDB4ZTAsMHgwZCwweGJkLDB4MWQsMHg1NiwweDFmLDB4OTAsMHhkZSwweDY1LDB4ZTQsMHhiZiwweGJiLDB4ZjMsCisgIDB4NDEsMHhmYywweDQ3LDB4YjUsMHhjYSwweGZlLDB4NTgsMHg2NSwweDAwLDB4MTUsMHhhYiwweDNmLDB4YzgsMHg0YywweDM0LDB4ZmYsCisgIDB4ZDcsMHgyZiwweDIwLDB4NGUsMHhlYiwweDRlLDB4YjAsMHhmOSwweDhmLDB4ZGYsMHhmZSwweDczLDB4NjcsMHgzNiwweGJlLDB4NTcsCisgIDB4ZmMsMHgyNSwweGI4LDB4NGYsMHg2ZiwweGQzLDB4MmIsMHhmNywweGQ2LDB4MTUsMHhlNywweDNmLDB4NGIsMHhmNCwweGY4LDB4MDksCisgIDB4ZjEsMHgzYywweGY4LDB4M2UsMHgwMiwweDBhLDB4MDYsMHhjNSwweGZjLDB4NWYsMHg4YiwweDdiLDB4ZTMsMHgzZCwweGUyLDB4ODcsCisgIDB4NjAsMHhkMCwweDVjLDB4OWMsMHhhZCwweGVjLDB4MTEsMHg0ZiwweDE2LDB4ZjUsMHg3ZiwweGI1LDB4ODIsMHg2YSwweGQwLDB4NjQsCisgIDB4MjIsMHgzNSwweGJmLDB4MDIsMHg4NywweGZkLDB4ODQsMHhkNywweDViLDB4MzgsMHhmZSwweDM5LDB4N2MsMHhlMiwweDA3LDB4ZWQsCisgIDB4M2YsMHgyYiwweGY1LDB4YzQsMHg0OSwweGU5LDB4NTcsMHhiOCwweGZlLDB4OGYsMHg5OSwweDM4LDB4MjEsMHg1ZCwweGU3LDB4MWYsCisgIDB4YmYsMHg4YiwweDExLDB4ZmYsMHhhYywweGUwLDB4NmEsMHgzNiwweGVhLDB4MTEsMHhhNCwweDFmLDB4YWEsMHhhMCwweDE4LDB4ZWEsCisgIDB4MGYsMHhkMiwweDE4LDB4YjIsMHhmZiwweDY0LDB4NzAsMHhiNCwweDBmLDB4M2MsMHgzNCwweDRiLDB4NDMsMHhhMCwweDJmLDB4NmMsCisgIDB4MDEsMHgwYiwweGRhLDB4N2YsMHg1YSwweGVkLDB4NmEsMHgzZiwweDg3LDB4NDAsMHhhMywweDVlLDB4OTEsMHgxNiwweGMzLDB4OGMsCisgIDB4MjgsMHg5YywweGZmLDB4OTUsMHhkOCwweDZiLDB4OTUsMHg3OSwweDNjLDB4OGMsMHg3ZiwweGRmLDB4NjYsMHgwNiwweGZmLDB4NzEsCisgIDB4ZjcsMHhhNywweDkzLDB4ZmYsMHg5NSwweDU5LDB4NTIsMHg5MCwweGZmLDB4MzAsMHhlMiwweDlmLDB4MDcsMHhlMiwweDBkLDB4ZTgsCisgIDB4ZDgsMHg2NCwweGQ3LDB4M2YsMHhlYywweDBjLDB4ZTYsMHg3ZiwweDJkLDB4ZjksMHg2MSwweDdjLDB4NGEsMHhiYywweDA5LDB4ZmMsCisgIDB4MzUsMHg2OCwweDQzLDB4NDAsMHhiYSwweDNiLDB4ZDAsMHgzMSwweDk2LDB4MTksMHhmZiwweDdjLDB4NWQsMHg1ZiwweDAyLDB4ZjQsCisgIDB4ODMsMHhiNiwweGE5LDB4ZjUsMHhlOSwweDVhLDB4YTUsMHgwMCwweGZmLDB4NzEsMHhmMiwweGJmLDB4NzQsMHhkYywweGE2LDB4YjksCisgIDB4NjYsMHhkMCwweDM2LDB4OWIsMHg3NCwweDE3LDB4Y2UsMHhmZiwweDQyLDB4MjQsMHg2NywweGYxLDB4NDgsMHhmNSwweGI0LDB4ZDQsCisgIDB4MGUsMHg1ZSwweGM2LDB4NmMsMHg2NywweDVhLDB4YmEsMHhiYSwweDc4LDB4ZmMsMHgzMywweDVlLDB4ZGQsMHg3YiwweGI4LDB4ZWQsCisgIDB4YjIsMHg4OSwweGMwLDB4NzQsMHgwMSwweGZmLDB4MTcsMHhjZSwweGZmLDB4M2EsMHg0MywweDlmLDB4NTYsMHhiMywweDJlLDB4NDgsCisgIDB4YmYsMHgwZSwweDlkLDB4NWYsMHhhMSwweGZjLDB4YWYsMHg3MSwweGRjLDB4OWYsMHg1YSwweDdmLDB4MGEsMHgyYywweDE5LDB4NTUsCisgIDB4YjIsMHg0OCwweGZmLDB4NzgsMHhmMywweGY3LDB4ZWEsMHgxZiwweGJhLDB4ZjcsMHhjNywweGZjLDB4YzcsMHhmMSwweDc2LDB4OWQsCisgIDB4YzAsMHhmOSwweGYyLDB4NjYsMHhhNSwweDIxLDB4ZmUsMHhiYywweDUwLDB4ZmMsMHhiMywweDliLDB4ZmYsMHhhNSwweDIyLDB4ZTksCisgIDB4MWQsMHhjNCwweDY2LDB4MTAsMHg4MCwweGE0LDB4NDEsMHhlNCwweDY5LDB4MzcsMHg0MiwweDNkLDB4ZTUsMHhjYiwweGZmLDB4N2EsCisgIDB4OTMsMHhmOCwweGJmLDB4YWMsMHg0MiwweGJiLDB4ZWYsMHg0MiwweDdlLDB4ZmMsMHhiMywweDYzLDB4ZmYsMHhkMSwweGVkLDB4NmYsCisgIDB4NzUsMHhlYiwweDViLDB4NGEsMHgzZSwweDc2LDB4NDYsMHg1OCwweGQzLDB4ZGIsMHg0MSwweGZlLDB4MDMsMHhhYiwweGE3LDB4ODQsCisgIDB4MTksMHgyYywweDhkLDB4ZTksMHhhYSwweGYzLDB4MTIsMHgzZSwweGVmLDB4OTYsMHhmOCwweGY0LDB4MzksMHg5NSwweGZmLDB4NjUsCisgIDB4ZTcsMHhiZiwweDgzLDB4ZjUsMHhiOCwweDRkLDB4ZWQsMHg3MywweDIzLDB4NTYsMHgxOCwweGNmLDB4NzQsMHhkOCwweDlmLDB4NjUsCisgIDB4MTAsMHhmZSwweGIzLDB4NWQsMHhiMCwweDJlLDB4MWUsMHhjMiwweGRmLDB4NmEsMHg2ZCwweDdhLDB4MDUsMHg3MywweDNjLDB4MzMsCisgIDB4ZmUsMHg1OSwweDQ1LDB4ZDIsMHhkMCwweDk1LDB4YjQsMHgyNSwweDlmLDB4ZWQsMHhiNiwweDdjLDB4OTYsMHg4NiwweGVjLDB4M2YsCisgIDB4OGEsMHg2YiwweGU0LDB4MjksMHg5ZiwweGIyLDB4MTYsMHg1ZSwweGU1LDB4YWUsMHhiNywweDU4LDB4ZmUsMHg1NywweGU3LDB4ZjMsCisgIDB4NzYsMHhmZCwweGJhLDB4MTksMHhlOSwweDQyLDB4OTgsMHhmZiwweDkwLDB4ZmMsMHhhZiwweGVmLDB4NWYsMHgwMCwweGFmLDB4ODIsCisgIDB4YTUsMHhmNCwweDZlLDB4ZTksMHgyYywweDY4LDB4ZmYsMHg0MSwweGYyLDB4MWYsMHgyYSwweDZlLDB4ZmYsMHhmMSwweDdlLDB4ZGYsCisgIDB4MDksMHhmMCwweDgwLDB4ZGEsMHgyZiwweDk3LDB4NjAsMHhmZiwweDkxLDB4OWYsMHhhOCwweDFkLDB4ZDIsMHgxNiwweDcyLDB4ZWQsCisgIDB4M2YsMHg2MiwweGIwLDB4ZmUsMHhhMSwweGZjLDB4MDQsMHg2MiwweDIzLDB4NGYsMHg0NywweGI2LDB4ZmYsMHhlNCwweGMwLDB4OTMsCisgIDB4NjgsMHg1MSwweGNiLDB4M2MsMHg2OSwweDhjLDB4NjIsMHhhMCwweGI5LDB4ZjIsMHg0OSwweDg1LDB4ZjksMHgwZiwweGMwLDB4ZjcsCisgIDB4NmYsMHg3NywweGVmLDB4YzYsMHgzMCwweDM0LDB4OGQsMHhmYSwweGY4LDB4Y2YsMHg4NSwweGZhLDB4ODUsMHhkOSwweGExLDB4ZTEsCisgIDB4OTAsMHhmZCwweDhhLDB4NmIsMHhmZiwweDMxLDB4ZTUsMHhjNSwweDYwLDB4YzgsMHhkNCwweDdjLDB4ZDIsMHgzOCwweDVlLDB4MjAsCisgIDB4ZmUsMHg2NywweDA2LDB4Y2MsMHgxNywweDczLDB4ODEsMHhlOCwweGRmLDB4YjcsMHgzNCwweDdlLDB4ZmUsMHhkNywweDFkLDB4NjAsCisgIDB4MzEsMHgxOCwweDAzLDB4MDcsMHg1ZCwweGI2LDB4NzMsMHg1ZCwweGQwLDB4ZmUsMHhhMywweDA2LDB4ZjksMHg0ZiwweGZkLDB4ZTMsCisgIDB4ZmMsMHhiMiwweDEyLDB4NDQsMHg5ZSwweDllLDB4ZmUsMHg1MSwweGU0LDB4MDMsMHg4OSwweDYzLDB4NDQsMHgzZSwweDQ1LDB4ZTMsCisgIDB4N2YsMHhhNiwweGQ1LDB4N2QsMHhlOCwweDE5LDB4ZTYsMHhiNCwweDg1LDB4NjUsMHhkNiwweDdmLDB4N2UsMHg1OCwweGRlLDB4ZDUsCisgIDB4YjcsMHhiZiwweDg0LDB4ZjgsMHg5ZiwweDdmLDB4MDYsMHgzOSwweDVkLDB4MmIsMHhiMiwweGRmLDB4MDgsMHhmZiwweDk5LDB4OTAsCisgIDB4OWYsMHg4NSwweGM3LDB4YTksMHg2OCwweDY3LDB4MDcsMHg4OCwweDdjLDB4ZmUsMHgzMywweDIyLDB4MDYsMHhkYiwweGMyLDB4YmUsCisgIDB4YWQsMHgxNCwweGUwLDB4M2YsMHhlMCwweDI3LDB4YzYsMHgyOCwweDY4LDB4ZjcsMHg5ZiwweGZlLDB4MDUsMHhmOSwweGNmLDB4MDIsCisgIDB4NzgsMHhkZiwweDU0LDB4YTMsMHhkMywweDFmLDB4ZDYsMHgzOSwweDc2LDB4NjEsMHgwMSwweGZlLDB4MjMsMHgzNywweDhiLDB4NDMsCisgIDB4NmEsMHhhMCwweDhkLDB4YTksMHhmZSwweDU1LDB4OTEsMHg1ZiwweGZmLDB4MzksMHgyNiwweGU2LDB4ZjQsMHg5MSwweGM4LDB4ZjEsCisgIDB4M2YsMHhkZCwweDhhLDB4ODksMHhmNCwweDUzLDB4M2IsMHhjMywweGRmLDB4YzcsMHhiMywweGZmLDB4MjAsMHgxYSwweDEzLDB4YjQsCisgIDB4ZTcsMHg4NCwweGY5LDB4OGYsMHg5NywweDdmLDB4OTEsMHhhYSwweGZhLDB4NTUsMHhkZiwweGJmLDB4MTksMHg3ZSwweGY5LDB4ODQsCisgIDB4ZmIsMHhhMywweGJkLDB4NGMsMHhkNSwweDNmLDB4OWMsMHg4MCwweGJiLDB4YjUsMHg0NiwweGJmLDB4ZDksMHg0NywweGU2LDB4YzcsCisgIDB4ZmYsMHgxOCwweDYwLDB4MTAsMHhlNiwweDBjLDB4MmQsMHg3MiwweGZjLDB4Y2YsMHgxMSwweGM0LDB4NjcsMHhlZSwweGQzLDB4MzksCisgIDB4NmQsMHg2MSwweDU5LDB4ZmMsMHg0NywweGZlLDB4MzEsMHg3OCwweDA1LDB4ZDEsMHgxZSwweDZiLDB4YjYsMHgxMSwweGVjLDB4M2YsCisgIDB4MTMsMHg2MCwweGEwLDB4YWMsMHg5NCwweGY4LDB4MWYsMHgwNSwweGVjLDB4NmYsMHgzNCwweGMzLDB4ZjIsMHhlNywweGM2LDB4ZmYsCisgIDB4MjgsMHgwMywweDVmLDB4NDUsMHhiNCwweGE3LDB4ZDEsMHg2NywweGVkLDB4YjksMHhhOCwweGYzLDB4ZWQsMHgzZiwweDhhLDB4NWMsCisgIDB4MGQsMHhmYSwweDYwLDB4YjEsMHhlNywweDg1LDB4ZjAsMHgxZiwweDAxLDB4Y2MsMHg1ZCwweGI4LDB4NTMsMHgyZiwweGY2LDB4ZmMsCisgIDB4MTIsMHhmZiwweDk3LDB4MDIsMHhhZiwweDQ2LDB4YWYsMHhkNSwweDg3LDB4N2MsMHg2YywweGU3LDB4ZjUsMHgwMiwweGYxLDB4M2YsCisgIDB4MmQsMHhmMiwweDAxLDB4ODYsMHgzNSwweGMzLDB4YmQsMHhhMiwweDg2LDB4ZjksMHg4ZiwweGZjLDB4NDIsMHhkNywweDI0LDB4ZjQsCisgIDB4OWQsMHg1ZiwweGQyLDB4MWIsMHhlMCwweDgzLDB4M2UsMHg1ZSwweGZjLDB4Y2YsMHgzZiwweDgyLDB4ZTcsMHhkZiwweGQ5LDB4NjksCisgIDB4YmYsMHg3NiwweDc5LDB4YjMsMHgzZCwweGE1LDB4YmIsMHhlZiwweDVmLDB4NzIsMHgyOCwweGZlLDB4NjcsMHgwNCwweDBjLDB4YWIsCisgIDB4M2IsMHgwMywweGZhLDB4ZWEsMHg2NCwweDI4LDB4ZjEsMHg4ZCwweGQ4LDB4N2YsMHg3MCwweDdmLDB4ZDgsMHhmZSwweDgwLDB4M2MsCisgIDB4Y2QsMHg1MCwweGJmLDB4NGIsMHhlMiwweGZmLDB4NTIsMHhkMCwweGY5LDB4NzUsMHg2YywweDc3LDB4NTAsMHg3ZiwweDA2LDB4MWIsCisgIDB4YzEsMHhkMywweGYxLDB4M2YsMHg4ZiwweDYzLDB4YTUsMHhlNCwweDdjLDB4MmIsMHg1OCwweDIwLDB4ZDAsMHgzZiwweGVlLDB4Y2IsCisgIDB4M2UsMHhmYiwweDBmLDB4MzgsMHhkMiwweDcyLDB4MmUsMHg1NCwweGY2LDB4ZTcsMHg0YywweDgwLDB4MGYsMHgxMCwweGZmLDB4ZDcsCisgIDB4YTgsMHhiYywweDIwLDB4ZmYsMHgxYywweGY0LDB4OWYsMHg1ZiwweDYzLDB4Y2UsMHhmYiwweDdiLDB4YTMsMHg3YiwweGE1LDB4OWQsCisgIDB4ZWUsMHgwZiwweGRiLDB4MDIsMHg4ZSwweDA0LDB4YzYsMHg0ZiwweGViLDB4ODEsMHg4YywweGY4LDB4MGMsMHg2NSwweGZmLDB4NTEsCisgIDB4MTMsMHhlOCwweDdkLDB4N2YsMHhhNCwweDg4LDB4N2MsMHgyOCwweGZlLDB4MzMsMHhiYywweDFkLDB4NmQsMHhmMiwweGMzLDB4MDEsCisgIDB4ZjksMHhiYywweDQ5LDB4ZWYsMHg4NywweDcyLDB4ZGEsMHhmZSwweDAzLDB4YzMsMHhmMSwweGNmLDB4OWQsMHg4MSwweGZhLDB4Y2YsCisgIDB4MGYsMHgzMiwweGUyLDB4N2YsMHgyNiwweGFjLDB4ZGQsMHhmMiwweDJhLDB4MDYsMHgzMywweGM1LDB4ZTMsMHg5ZiwweGZiLDB4ZGEsCisgIDB4YjYsMHg1OSwweDZjLDB4NjcsMHgwOCwweGI2LDB4Y2QsMHhjNCwweDlmLDB4NjcsMHhmMCwweDlmLDB4NTAsMHg3ZiwweGQ4LDB4NTEsCisgIDB4ZGMsMHhhZiwweDUzLDB4ZTksMHgxNywweDVhLDB4NGYsMHhjNCwweDliLDB4MTksMHhjZiwweGQ3LDB4YjksMHg2MCwweGZjLDB4OGYsCisgIDB4OGUsMHhhNSwweDlkLDB4NDEsMHg2MiwweDlmLDB4YjAsMHg4OSwweDI1LDB4ZGYsMHhmZSwweDQzLDB4ZmEsMHg1ZiwweDU4LDB4NjUsCisgIDB4ZjcsMHg1ZSwweGFiLDB4M2UsMHhkMiwweDE0LDB4M2UsMHg3ZiwweDQ3LDB4YmQsMHhmOSwweGJmLDB4OGQsMHhmYiwweDVmLDB4ODgsCisgIDB4ZjcsMHg5YSwweGY2LDB4MzIsMHhiMSwweDViLDB4ZjksMHgyMCwweGNiLDB4M2UsMHhjNiwweGVlLDB4MGYsMHg2YiwweDk5LDB4MzUsCisgIDB4NDYsMHgzYywweGI3LDB4NjMsMHg4ZCwweDE3LDB4YmEsMHg0ZiwweGY4LDB4Y2YsMHgzMSwweGI5LDB4ZDUsMHgyYSwweDUzLDB4MzksCisgIDB4NzQsMHhiOCwweGY2LDB4YjgsMHhiMywweDZkLDB4MzIsMHhhZCwweDJhLDB4ZTEsMHg2ZiwweGMxLDB4ZmMsMHhhZiwweDc3LDB4MDQsCisgIDB4Y2YsMHhmZSwweGZjLDB4MmEsMHhlYywweGNmLDB4ZTEsMHhmYSwweDkwLDB4OTksMHhiMCwweDg3LDB4NzQsMHhjNiwweGRiLDB4MGUsCisgIDB4YjcsMHgwYiwweGYzLDB4NjUsMHhkYywweDE2LDB4MTYsMHg5ZiwweGZlLDB4OTksMHg1ZCwweDM2LDB4MDgsMHg3YiwweGM0LDB4N2MsCisgIDB4ZmQsMHgyZiwweDljLDB4ZmEsMHhjZiwweDlkLDB4OTMsMHhjNiwweDRiLDB4Y2EsMHg3MiwweDU4LDB4YWQsMHg3OSwweDYxLDB4M2YsCisgIDB4OWQsMHhhYywweGZlLDB4YjAsMHg1NiwweGZjLDB4Y2YsMHgzMiwweDRjLDB4OWIsMHg0ZiwweGViLDB4OTcsMHhkNSwweDk1LDB4ZTMsCisgIDB4ZDUsMHhmZiwweDQ1LDB4YzksMHg0NywweGY3LDB4ZWMsMHgzZiwweGVlLDB4N2EsMHg5ZCwweGZhLDB4NWQsMHg1MywweGU4LDB4YjUsCisgIDB4NjUsMHgxMiwweGJjLDB4MDQsMHg5MSwweGEyLDB4Y2UsMHhiMywweGZhLDB4YzMsMHgxMiwweGZkLDB4ZWYsMHhkNCwweGRmLDB4NTAsCisgIDB4YjAsMHgxYSwweGQ5LDB4MDUsMHgxYSwweGYwLDB4ZTksMHgxMywweDhlLDB4MjgsMHgzOCwweDQ3LDB4ZjEsMHg0ZiwweDZjLDB4ZmYsCisgIDB4NjksMHg5ZCwweGFhLDB4YjQsMHhjYiwweDFlLDB4MzYsMHg4YywweGM0LDB4YmIsMHgxOCwweGViLDB4YTUsMHhmYywweDVmLDB4ZjYsCisgIDB4ZmIsMHhkNywweGI4LDB4OTUsMHg2ZCwweGQxLDB4MGYsMHg5MCwweDIyLDB4YmEsMHg0YSwweGE0LDB4ZGYsMHgzOCwweDFjLDB4ZmYsCisgIDB4NTcsMHgzMCwweGZlLDB4NjcsMHhhNCwweDRjLDB4NDMsMHgyZiwweGExLDB4YzcsMHhjNCwweDlmLDB4YTIsMHgxNywweGE1LDB4YjgsCisgIDB4MTUsMHhmNiwweDAzLDB4Y2IsMHg3ZCwweGZjLDB4YzcsMHhiYiwweGJmLDB4ZTMsMHhmZiwweDdhLDB4MTAsMHhkMSwweDFlLDB4ZmQsCisgIDB4MDIsMHg1OCwweGNlLDB4ZjMsMHg3ZiwweGI5LDB4ZTMsMHgzZCwweGZiLDB4Y2YsMHhkZiwweDQ5LDB4Y2QsMHhlOCwweGEwLDB4NmMsCisgIDB4ZDMsMHgzNywweGE4LDB4OTQsMHg3ZCwweDQwLDB4ZjUsMHhmOCwweDhmLDB4M2IsMHg5ZSwweGYyLDB4N2YsMHgyZCwweDAyLDB4YjgsCisgIDB4ZWMsMHg3MCwweDU1LDB4YmUsMHgzMiwweGVjLDB4ZTEsMHg5YSwweGY2LDB4N2UsMHg1ZiwweGQyLDB4ZmYsMHhlMiwweGVhLDB4ODUsCisgIDB4YzAsMHgyOSwweDUzLDB4MWMsMHgxZSwweDRmLDB4ZjksMHhiZiwweDgwLDB4NmIsMHhmZCwweDI4LDB4OTMsMHg2YiwweDcxLDB4MTksCisgIDB4YzAsMHgwYSwweDU1LDB4MGMsMHhkOSwweDQzLDB4MWEsMHhhOSwweGZjLDB4NzcsMHhjNSwweGIwLDB4ZGEsMHhjMiwweGEyLDB4NDUsCisgIDB4YjUsMHhlMCwweGIyLDB4YWIsMHhkOCwweGZlLDB4MTMsMHhlZSwweGJmLDB4NDAsMHhlYSwweDNmLDB4ZGIsMHhmNiwweDlmLDB4OTUsCisgIDB4ZDksMHhlYSwweDdjLDB4ZDMsMHg3OSwweDFiLDB4OTAsMHhiMCwweDlmLDB4M2EsMHg1NiwweGZlLDB4YmIsMHhlZCwweDNmLDB4Y2EsCisgIDB4NTQsMHg5ZiwweDkwLDB4ZmUsMHgxNCwweGJjLDB4OGYsMHg0MSwweGJlLDB4M2YsMHhjYywweDA3LDB4YTgsMHhmZSwweDE3LDB4NGUsCisgIDB4ZmQsMHhjMywweDIxLDB4YzQsMHg3NiwweDcwLDB4ZGIsMHgwYiwweDM1LDB4M2UsMHhjMCwweGYyLDB4N2YsMHg5MSwweGZhLDB4YmQsCisgIDB4NmUsMHhmYywweDRmLDB4NWEsMHgwYywweGI3LDB4ZjksMHhiMCwweGMxLDB4N2EsMHgzNSwweGYzLDB4OWEsMHhlMCwweDhlLDB4NGYsCisgIDB4YzUsMHg2YywweDZiLDB4Y2YsMHg1MCwweDVlLDB4ZmMsMHgwNSwweDk2LDB4YTcsMHgyMSwweGU1LDB4ODEsMHgyYiwweGM2LDB4NWEsCisgIDB4NGUsMHhmZCwweDY3LDB4NjcsMHg5MiwweDc2LDB4YmYsMHhkNywweGYyLDB4ODcsMHgwNSwweDA2LDB4ZmYsMHgyMSwweGZlLDB4MGUsCisgIDB4MmYsMHgxZiwweDUwLDB4ZDgsMHg1NiwweGMwLDB4ZmYsMHhjNSwweGU4LDB4N2YsMHg1MSwweDM3LDB4ZDUsMHg4OCwweGU0LDB4MmYsCisgIDB4NGMsMHg1MiwweDYxLDB4M2YsMHg5NiwweDI5LDB4MzIsMHgxMCwweGZmLDB4MzMsMHhlMCwweGY5LDB4YmYsMHg3ZSwweDBlLDB4ZWYsCisgIDB4ZDcsMHhkYSwweGEwLDB4MzIsMHgyMiwweGRkLDB4NDEsMHhkOSwweDdmLDB4YzQsMHgzNiwweDVlLDB4N2YsMHhkOCwweGM2LDB4ZTMsCisgIDB4NDIsMHgzZiwweGI0LDB4ZGEsMHg3NCwweDg2LDB4MzMsMHg5OCwweGE4LDB4ZmUsMHgxNywweDVlLDB4ZmMsMHhjZiwweDVkLDB4YTcsCisgIDB4ZDEsMHhmMywweDhiLDB4MWUsMHhjYywweDliLDB4MTgsMHhmYywweDI3LDB4NjQsMHhmZiwweDk5LDB4ZGEsMHg3OCwweGY3LDB4YTYsCisgIDB4YjcsMHhjMCwweGNmLDB4NzIsMHg3ZiwweDM0LDB4ZDUsMHg4NiwweDBiLDB4MjEsMHg3ZSwweGU4LDB4MzQsMHg4YSwweDU1LDB4YzMsCisgIDB4ZjUsMHg5ZiwweGU3LDB4YjksMHhmOSwweDVmLDB4NGQsMHg5MywweDIyLDB4ZDYsMHgxZSwweDU1LDB4YWMsMHg3ZSwweGU4LDB4YmUsCisgIDB4ZmUsMHgxNywweDU2LDB4ZmUsMHg1NywweGUyLDB4YzIsMHhhNiwweGI3LDB4NmEsMHg1ZiwweGVkLDB4YzMsMHhjMCwweDA5LDB4ZmIsCisgIDB4ZDksMHg3OCwweGExLDB4ZWUsMHg5MiwweDliLDB4MWEsMHhlNiwweGViLDB4N2YsMHhlMSwweGVhLDB4OWYsMHhkMywweDcwLDB4ZDAsCisgIDB4MDYsMHg0NCwweGZmLDB4YjgsMHg4NSwweDEwLDB4ODksMHhmZCwweGVkLDB4MDcsMHhiNiwweGZmLDB4NmIsMHg0YywweGQ5LDB4MjEsCisgIDB4OWUsMHg1NiwweDEwLDB4NGQsMHgzYSwweDgxLDB4MTQsMHg0YiwweDU4LDB4NWYsMHgxMSwweGZiLDB4OGYsMHhkNSwweDlmLDB4NWEsCisgIDB4YzAsMHhmNiwweGU3LDB4ZGEsMHg0OSwweGRjLDB4NjYsMHg2NSwweDU0LDB4NDksMHhkZiwweGVmLDB4ZWEsMHg5ZiwweDVhLDB4NTcsCisgIDB4OWUsMHg4ZCwweDU0LDB4ZmQsMHhlNywweGU0LDB4ZTMsMHhmOCwweDEwLDB4OTksMHg2YSwweDQ1LDB4ZmEsMHhkMywweDMyLDB4OWIsCisgIDB4ZTMsMHhiMCwweGQyLDB4ZDAsMHg3YSwweDhmLDB4N2IsMHhmYSwweDMwLDB4MGYsMHhkZSwweDRiLDB4ZDgsMHgxNywweDliLDB4M2UsCisgIDB4MDAsMHhiOCwweDVlLDB4MzQsMHhlYiwweDdkLDB4YjMsMHg4OSwweGY0LDB4ODcsMHhjZCwweGE5LDB4MWYsMHgyOSwweDk3LDB4Y2IsCisgIDB4ZDAsMHhjNSwweDk5LDB4YmEsMHg4ZiwweGMwLDB4YWIsMHhmOCwweGZlLDB4MGMsMHg3ZiwweDUwLDB4ZjksMHgwMSwweDhhLDB4ZmYsCisgIDB4NmMsMHg3NywweDhhLDB4ZDQsMHg2NSwweDNlLDB4OTAsMHg4NywweDAyLDB4NjksMHg1YywweDJjLDB4ZmIsMHgwZiwweDNlLDB4ZWYsCisgIDB4ZjAsMHhkYiwweGZkLDB4YjAsMHhmOCwweDlmLDB4MWEsMHhlMiwweDAzLDB4OWMsMHhmMSwweGNjLDB4ZmEsMHgzZiwweDY1LDB4OTgsCisgIDB4ZjYsMHgzMCwweGViLDB4NDMsMHg1MiwweGY5LDB4ZWYsMHg3NCwweGZkLDB4OWYsMHg3ZiwweDk1LDB4NTcsMHg5OCwweGNjLDB4ZmUsCisgIDB4NTYsMHgyMywweDY1LDB4ZWUsMHg3YywweDJjLDB4ZmIsMHg4ZiwweDY4LDB4ZDMsMHgxZSwweDk1LDB4ZWYsMHhmZiwweDVhLDB4ZDgsCisgIDB4ZWIsMHhmZCwweDA1LDB4YmIsMHhlOSwweGRlLDB4NzcsMHgyYSwweGU3LDB4OGUsMHgyMSwweDMwLDB4ZDksMHhiMiwweGI0LDB4ZjIsCisgIDB4NzcsMHhhMiwweDFmLDB4YTIsMHhkZCwweDc0LDB4NGYsMHg5OCwweDJjLDB4N2UsMHg3ZiwweDA1LDB4OGEsMHg3NCwweDc3LDB4YmMsCisgIDB4YTUsMHhkOCwweDY1LDB4ZjYsMHg0NSwweDNmLDB4YzQsMHg0ZiwweDJjLDB4ZmYsMHg3MCwweDNmLDB4NDQsMHg1NiwweDg3LDB4NDQsCisgIDB4YjksMHhjMCwweGZkLDB4ZTcsMHg5YSwweGE1LDB4ZjUsMHg0MywweDU0LDB4NGIsMHg5NCwweGJmLDB4NWEsMHg0OCwweGZlLDB4OGMsCisgIDB4N2UsMHg4OCwweDA5LDB4MzMsMHgyNCwweGYzLDB4MmYsMHhmYSwweDIxLDB4MTYsMHgwNiwweDlmLDB4ZTcsMHhmMSwweGJmLDB4NjMsCisgIDB4Y2YsMHhlMywweDI3LDB4ZWIsMHgwZiwweGViLDB4NDQsMHgwZSwweDA0LDB4YzAsMHhlZiwweDhkLDB4M2UsMHg5YywweDI0LDB4ZDIsCisgIDB4ZmUsMHg0ZSwweDQwLDB4ZmUsMHg5MywweGJmLDB4MmQsMHg3ZCwweDY4LDB4ZGQsMHhlZCwweDhiLDB4ZmUsMHhiMCwweDgxLDB4Y2YsCisgIDB4MTcsMHhmYSwweGYwLDB4ZmYsMHhmOSwweGY4LDB4YTMsMHgxZCwweDUyLDB4YWYsMHg3ZSwweDVhLDB4YmQsMHgxMSwweDU0LDB4OGQsCisgIDB4NWEsMHg2MCwweDkxLDB4MWMsMHhmYiwweDk5LDB4YjQsMHhjMywweGVjLDB4NTEsMHhlNywweGQ0LDB4NTcsMHgxZCwweGM1LDB4MjAsCisgIDB4M2IsMHg0NywweGFlLDB4MzIsMHhhZiwweGY1LDB4YzYsMHhhZiwweDVlLDB4MjUsMHhlZiwweDEwLDB4N2EsMHhmNCwweGFkLDB4MmEsCisgIDB4MTgsMHg4ZiwweGQ5LDB4MjAsMHg0OSwweDgwLDB4ZTAsMHgwMCwweGYzLDB4NWEsMHg5NywweDBmLDB4MDMsMHgyOCwweDBhLDB4MWEsCisgIDB4ZWMsMHhkMiwweDZhLDB4MTUsMHhkMCwweGU3LDB4MDAsMHg5OSwweDAyLDB4MGQsMHhiMCwweGNiLDB4NDAsMHhjMCwweDZiLDB4MmYsCisgIDB4ODMsMHhiNywweGI4LDB4ZDAsMHgwYiwweGJhLDB4YzEsMHg2YywweDMwLDB4MDgsMHgwNSwweGMzLDB4MDIsMHhjOSwweDAxLDB4ZTEsCisgIDB4MzYsMHhhMSwweDFiLDB4NmMsMHg0OSwweGM1LDB4NzYsMHgwYSwweDA2LDB4MDYsMHgyMCwweDQ2LDB4OGQsMHgzZiwweGRhLDB4MWQsCisgIDB4YmIsMHg0MSwweGY4LDB4M2EsMHhkYywweGQ0LDB4MjEsMHhlZiwweDhlLDB4ZGQsMHgyNSwweGY0LDB4YzAsMHhhZCwweDVhLDB4NzIsCisgIDB4YzIsMHgwMywweDAyLDB4MDIsMHgyMywweDA4LDB4NTAsMHhmMywweDM5LDB4YWEsMHhlYiwweDVhLDB4NTYsMHg5MSwweGM1LDB4MTgsCisgIDB4ZmEsMHg0YiwweDA2LDB4NDgsMHg4MSwweDMyLDB4MjAsMHgxMCwweDIwLDB4YmIsMHg4MCwweGFjLDB4ZjcsMHg2OCwweDk3LDB4N2MsCisgIDB4YmIsMHg5MCwweDgyLDB4NmIsMHgzNCwweDcwLDB4OWYsMHhkYywweDI4LDB4MjgsMHhmOSwweDBjLDB4NTAsMHg3NywweGNiLDB4MGQsCisgIDB4ODIsMHgwMiwweDMyLDB4OWEsMHgzYSwweDIwLDB4NmIsMHgzNiwweGEwLDB4YzcsMHhhZiwweDhiLDB4ZGQsMHgzMiwweGJhLDB4NzksCisgIDB4ZTQsMHhkNiwweGQ2LDB4ZmEsMHg1OSwweGIxLDB4NGMsMHgyZSwweDliLDB4ZGYsMHhhYywweGM0LDB4MmEsMHg2MywweDNhLDB4Y2MsCisgIDB4NmEsMHhmNSwweDJkLDB4NDksMHhkMSwweDA2LDB4Y2IsMHg5MywweDgwLDB4OTIsMHhjZiwweDVjLDB4YTEsMHgxYywweGRjLDB4NmEsCisgIDB4MjYsMHhiMywweDcyLDB4NDIsMHhkOCwweDhhLDB4NDAsMHg0ZCwweDZmLDB4YWMsMHg0NywweGQ4LDB4MDQsMHgzNiwweDliLDB4YzksCisgIDB4NzQsMHhlYywweDhmLDB4MDUsMHgwOSwweDgzLDB4OWIsMHg2NCwweGFmLDB4ZmMsMHgyYSwweDFhLDB4YWYsMHhlOSwweDBhLDB4YTgsCisgIDB4MDUsMHgzMiwweDQ0LDB4Y2EsMHgwNiwweDY5LDB4M2UsMHg1ZCwweGQwLDB4OTAsMHgwYSwweGVjLDB4ODQsMHgyYSwweDk0LDB4NTUsCisgIDB4NDEsMHg0NiwweGFhLDB4MDEsMHgwMywweGQwLDB4NDEsMHhjOSwweGM3LDB4MTAsMHg5MSwweGU4LDB4ODEsMHg4NiwweDU0LDB4ODcsCisgIDB4MDUsMHgxYSwweGVjLDB4NTAsMHgyYywweDdjLDB4NDUsMHhkMSwweGNhLDB4MWMsMHhkMCwweDQxLDB4YzksMHgyNywweDFiLDB4NmIsCisgIDB4MTYsMHhiZSwweDA5LDB4YjYsMHhlOCwweGY1LDB4MzAsMHhiNiwweGNkLDB4MDIsMHhmMywweGYyLDB4MzEsMHg0MywweDM4LDB4MDUsCisgIDB4ZmUsMHgwYywweDI0LDB4ZjMsMHgzMSwweGNkLDB4MDYsMHhmNCwweDdhLDB4ZjUsMHhiOCwweDAxLDB4NGUsMHg4MSwweDFiLDB4YjAsCisgIDB4ZTEsMHhjNCwweGZhLDB4YmQsMHhiNCwweDI0LDB4OTQsMHg2ZSwweDA3LDB4ZGQsMHg3MCwweDM2LDB4YTgsMHgyMiwweDgwLDB4ZGEsCisgIDB4M2YsMHg5ZCwweDcyLDB4M2EsMHg5NywweGQwLDB4M2EsMHhkMSwweDVmLDB4OTYsMHhkMywweDMwLDB4YTEsMHg0OSwweDhhLDB4M2EsCisgIDB4NTYsMHg5ZiwweDFlLDB4YzUsMHg1NywweGQ0LDB4OTcsMHg4MCwweDAzLDB4YTgsMHhkZiwweDBiLDB4N2QsMHhkMiwweGU4LDB4OWQsCisgIDB4NGEsMHhjMiwweDNiLDB4YzMsMHgwMSwweGE2LDB4MGIsMHgyNiwweGJjLDB4MmIsMHg5NCwweDdjLDB4MjQsMHgyMSwweDBkLDB4MzcsCisgIDB4NjgsMHg3NSwweDc4LDB4NzcsMHg1OSwweDIwLDB4NTEsMHgzZiwweDI2LDB4YTQsMHg3MywweDFiLDB4ZDIsMHg5YiwweDE0LDB4ZjksCisgIDB4OTgsMHgwYiwweGE4LDB4ZjEsMHg0NywweDMzLDB4MzEsMHgyMywweGQ3LDB4YWQsMHg2ZCwweDQxLDB4ZTMsMHgxZCwweDEwLDB4NDMsCisgIDB4NjAsMHgxNCwweDgzLDB4NjQsMHhiZiwweGEwLDB4ZDksMHgwMCwweDUyLDB4ZjIsMHhjOSwweDU4LDB4OTIsMHhmMywweDQ0LDB4ODgsCisgIDB4YzAsMHgxOCwweDAyLDB4NzgsMHgyMSwweDY4LDB4NDUsMHgwZSwweGEwLDB4ZDcsMHg3YiwweDhiLDB4NmMsMHhlNCwweDUyLDB4ZGEsCisgIDB4OWEsMHgyZSwweGIwLDB4MDcsMHg4MSwweGFiLDB4YjQsMHgzNSwweDA5LDB4MzAsMHgyNiwweDZmLDB4Y2IsMHgyNSwweGQyLDB4OWQsCisgIDB4NWQsMHgzNSwweDdiLDB4NjQsMHhjZCwweDA2LDB4YjQsMHgzYywweDhkLDB4NTgsMHhiNywweGIwLDB4MDUsMHhkYywweDBhLDB4ZWIsCisgIDB4MzUsMHgwNywweGM4LDB4ZTgsMHgwYSwweDU4LDB4MDMsMHg2YSwweDYwLDB4ZDIsMHg4OCwweGE1LDB4NmMsMHhhMCwweDUzLDB4ZmIsCisgIDB4YTcsMHg0YywweGY4LDB4MDYsMHhlYywweDMxLDB4OTIsMHhjMywweGIxLDB4MzIsMHhhMSwweDAzLDB4YWEsMHg4NiwweDljLDB4OGEsCisgIDB4OTUsMHg4MSwweDBlLDB4OTgsMHgzNSwweGVhLDB4NTMsMHhkNiwweDE1LDB4MGIsMHgxMCwweDczLDB4MTEsMHgzMCwweDZiLDB4YWQsCisgIDB4YmQsMHg1MCwweGFiLDB4Y2IsMHhiNSwweDAyLDB4ODAsMHgxZCwweDlhLDB4OGEsMHg5ZSwweDg1LDB4MWEsMHg3OSwweDQwLDB4ZDcsCisgIDB4ZDQsMHgyZSwweGViLDB4OGEsMHgwNSwweGQwLDB4MzEsMHhlNiwweGNkLDB4NjcsMHg4ZCwweDU4LDB4MDMsMHgwNywweDhjLDB4MDUsCisgIDB4YWEsMHhiMCwweDQ2LDB4ZmEsMHgwNiwweGRjLDB4NmMsMHgyNCwweDUzLDB4NTUsMHgxOCwweDljLDB4MzQsMHhhZSwweDQ3LDB4YTAsCisgIDB4ZGMsMHgwMSwweGQ0LDB4N2MsMHhjNiwweGQ3LDB4YzQsMHg3NiwweGY0LDB4ZjUsMHgxOCwweDViLDB4NTMsMHhjOSwweDk3LDB4NjMsCisgIDB4M2IsMHg3MiwweGZiLDB4OGMsMHg2ZiwweGE3LDB4ZTYsMHg2MSwweDcwLDB4ZGEsMHhmOCwweGFlLDB4N2QsMHhjNSwweDAyLDB4YjQsCisgIDB4M2UsMHg1OSwweDIzLDB4ZWMsMHg4MCwweGE3LDB4OGQsMHgxYiwweDUzLDB4NTUsMHgyZiwweDRiLDB4MzYsMHgxMCwweDMwLDB4ZTgsCisgIDB4MzEsMHhlNiwweGQ4LDB4NTcsMHgyYywweDYwLDB4ZDYsMHg1MCwweGUzLDB4ZDEsMHg0ZCwweGQwLDB4ZmQsMHhiYiwweGMxLDB4Y2IsCisgIDB4MzYsMHg0OCwweGE5LDB4MTgsMHgyNCwweDhjLDB4NGUsMHg3NCwweDdmLDB4ZDAsMHg2MCwweDAzLDB4YjMsMHg4NiwweGRhLDB4M2YsCisgIDB4ODIsMHgwNiwweGJhLDB4ZDAsMHgxMywweGUzLDB4ZTksMHg5ZiwweGQ4LDB4MTgsMHgwMiwweDNkLDB4ZGEsMHgxYywweDViLDB4MTEsCisgIDB4NTksMHgwMCwweDUyLDB4YmIsMHhhZCwweDRjLDB4YjgsMHgwZCwweDc2LDB4MWIsMHhiMywweDUzLDB4YzksMHg5ZCwweDFlLDB4MDAsCisgIDB4YjcsMHhlNSwweGJhLDB4MGQsMHg0YiwweGZmLDB4MzQsMHhkOCwweDgwLDB4MWEsMHhiZiwweDVhLDB4NGYsMHhhNiwweDg1LDB4MGQsCisgIDB4NjAsMHgxMywweDkwLDB4NjEsMHhhYywweDU3LDB4ZTgsMHgwMSwweDViLDB4NDEsMHhkMiwweGY0LDB4ODAsMHg5MCwweDc2LDB4MDAsCisgIDB4OTksMHhjZiwweDZhLDB4YjQsMHg3ZiwweDQ2LDB4OTQsMHgxNiwweGIxLDB4MTIsMHhlZCwweDFmLDB4MDMsMHhhNiwweGQwLDB4MjMsCisgIDB4MjgsMHg3OCwweGEwLDB4MWYsMHhlZCwweDFmLDB4MGIsMHg0MCwweDZhLDB4YmQsMHhlYiwweDY0LDB4NjMsMHgzZiwweGRhLDB4M2YsCisgIDB4OTUsMHg3OCwweDc3LDB4ZTUsMHgxNCwweDNiLDB4YzAsMHhjYiwweDAzLDB4ODYsMHgwZCwweGU4LDB4ZjEsMHg5ZCwweDBiLDB4YjIsCisgIDB4YTMsMHg5YiwweGRiLDB4NmYsMHg1NSwweDA2LDB4OTEsMHhiNiwweGM5LDB4NjUsMHgzNSwweGE0LDB4N2YsMHgxMCwweDE4LDB4NDAsCisgIDB4NmEsMHg0NywweDQxLDB4ZmEsMHgyNywweDBiLDB4MmQsMHgwMCwweDI4LDB4ZjksMHg1NCwweDBhLDB4ZDksMHg4OSwweGNkLDB4ZTksCisgIDB4YTQsMHgyMiwweDc3LDB4MGEsMHg1OSwweDEzLDB4ODEsMHg0NCwweDJjLDB4MGMsMHg3NCwweDRhLDB4M2UsMHg0MCwweDM3LDB4NTQsCisgIDB4NTUsMHg5NiwweDA1LDB4YzQsMHgzOCwweDMzLDB4NTgsMHhkYiwweDU4LDB4MmEsMHhkMCwweDA2LDB4ODAsMHgwMCwweDMyLDB4OWYsCisgIDB4OGMsMHhkOCwweDA4LDB4ZTEsMHg4OCwweGQ2LDB4MzUsMHgyYywweDhhLDB4MDAsMHhjMiwweGI0LDB4YTYsMHgyOCwweDE2LDB4ZDAsCisgIDB4MTAsMHg5MCwweGNhLDB4MmMsMHg5MCwweDUwLDB4YTgsMHhmOSwweGFjLDB4ZDYsMHhjYiwweDJkLDB4MjUsMHgyZiwweDI1LDB4NjEsCisgIDB4Y2MsMHhkNiwweGY2LDB4ZjMsMHhhMCwweGFiLDB4N2YsMHgwOCwweDIwLDB4ZWIsMHgxZCwweGQ0LDB4ZTcsMHg1OCwweGZhLDB4NDcsCisgIDB4MWEsMHg4NCwweDEyLDB4MDYsMHhlOCwweDc0LDB4MzAsMHgyNSwweDQzLDB4ZWUsMHgwMSwweDczLDB4OTAsMHhkYSwweGE5LDB4ZDEsCisgIDB4ODAsMHgwZCwweGU4LDB4ZjksMHhjYiwweDY5LDB4MjEsMHgwMSwweDNhLDB4ZDEsMHg1ZiwweGI2LDB4ODAsMHg4NCwweDllLDB4MjcsCisgIDB4MzksMHgwZCwweGYwLDB4ODMsMHhhNSwweDlhLDB4NDAsMHgxMywweDFjLDB4NDAsMHgwZCwweGI3LDB4OTUsMHg4YywweDhlLDB4ZjQsCisgIDB4Y2YsMHhiNSwweDMwLDB4NjEsMHg0OCwweGRkLDB4NjAsMHgyZiwweGI4LDB4MGUsMHg1NCwweDAwLDB4NTEsMHgwNywweDI3LDB4ZjUsCisgIDB4NjYsMHgwYywweGIwLDB4NDYsMHhhMiwweGM2LDB4Y2IsMHhkNywweGVhLDB4MWIsMHhiMiwweDc1LDB4ZjksMHhiZCwweDQ3LDB4MDUsCisgIDB4MDQsMHgzYSwweDM2LDB4ZDUsMHhkNywweDIzLDB4ZDAsMHhiMSwweDIxLDB4YmIsMHhhOSwweDVlLDB4MWUsMHhjZiwweDM1LDB4NjAsCisgIDB4YTAsMHhjYSwweGY0LDB4ZjgsMHg0NSwweGIxLDB4M2IsMHg0NiwweGJmLDB4OTUsMHhkZSwweGIyLDB4M2IsMHhmNiwweDIzLDB4MGIsCisgIDB4Y2MsMHhkZSwweDk3LDB4YjQsMHhjMSwweDk2LDB4MDcsMHg5MiwweGZmLDB4OTAsMHg3MywweDgwLDB4NmYsMHhmZSwweDM2LDB4ZTMsCisgIDB4YzcsMHhmMywweGIxLDB4YzgsMHhhNiwweDhlLDB4ZTYsMHhkMywweDZjLDB4Y2YsMHgyNywweDJmLDB4M2IsMHhmMywweGYxLDB4OGQsCisgIDB4ZGYsMHg2NiwweGQ0LDB4YTQsMHhlNCwweDM1LDB4ZTgsMHhmNywweDVhLDB4ODUsMHgwZiwweGIyLDB4MzIsMHhhZCwweDY2LDB4YjcsCisgIDB4N2MsMHg3YiwweDRkLDB4NmEsMHg2MCwweDRkLDB4NDMsMHhjZCwweGMwLDB4MmEsMHgwNywweGQwLDB4ZTMsMHhlNSwweDhlLDB4NmMsCisgIDB4Y2QsMHg2NiwweGY5LDB4NTYsMHg3NCwweDk4LDB4YzQsMHgxMCwweDg4LDB4MjUsMHg4NSwweGQ4LDB4YWEsMHhkNSwweDU5LDB4YjAsCisgIDB4NTksMHg0ZSwweDgyLDB4YTQsMHhiZSwweDNhLDB4YWIsMHg2ZSwweDRlLDB4MjQsMHg4NSwweDI0LDB4YmQsMHgxZiwweDk0LDB4MDYsCisgIDB4NTEsMHhkMSwweGZiLDB4NTQsMHg2ZCwweDUwLDB4NjksMHhjOCwweDI4LDB4ZDksMHhiZSwweDdhLDB4MDQsMHg4NCwweDRjLDB4MGEsCisgIDB4ODMsMHg5OCwweDcyLDB4ZGIsMHgyZCwweGY2LDB4MTUsMHg3YSwweDNhLDB4OTUsMHg0MCwweDg0LDB4NjAsMHgwNCwweGI0LDB4YTAsCisgIDB4OGQsMHgyNywweDQyLDB4N2QsMHg0NCwweDZkLDB4OTEsMHgxMSwweGM4LDB4ZGIsMHhjMCwweDE0LDB4ODcsMHhmNSwweDAzLDB4ZWEsCisgIDB4MzUsMHgzNCwweGRiLDB4MDYsMHgwOSwweGIxLDB4MGUsMHgwYywweDk4LDB4MGQsMHhlOSwweGQ0LDB4MDYsMHg2OSwweDEzLDB4MzgsCisgIDB4MzksMHg5NiwweDRjLDB4NTcsMHgyMSwweGEwLDB4NmUsMHgzNiwweGFmLDB4NDcsMHhjMCwweGFjLDB4NTMsMHg0ZiwweDlhLDB4ZDcsCisgIDB4YjcsMHg1NywweGQxLDB4ZjMsMHhhOSwweDEwLDB4ZWUsMHhlYSwweGU4LDB4YzksMHg2ZiwweGQ1LDB4ZTYsMHg2MSwweDFhLDB4MzAsCisgIDB4MTcsMHg3ZSwweGRiLDB4MDYsMHhmYiwweGUwLDB4NzcsMHgxMSwweDFmLDB4NTgsMHg3MywweDk3LDB4NzAsMHgxYSwweDgxLDB4YmYsCisgIDB4YTEsMHhlNSwweDFmLDB4NWYsMHg5NywweDc5LDB4M2QsMHhmZiwweGQ0LDB4ODEsMHhjNSwweDE1LDB4NWYsMHhjMSwweGUwLDB4YzksCisgIDB4MDMsMHg4YiwweGQ3LDB4YzYsMHg2ZiwweDU5LDB4NzcsMHg2MiwweGNmLDB4NTMsMHhjZCwweGZmLDB4NTQsMHgxMSwweGNmLDB4YWMsCisgIDB4M2IsMHg4OSwweGMxLDB4MWYsMHhkMCwweGYzLDB4NTksMHg3NiwweGVmLDB4Y2QsMHg5NywweGZmLDB4ZTMsMHhjNSwweGYzLDB4ZWYsCisgIDB4NWYsMHg1YywweDg5LDB4YzEsMHgzMywweGU3LDB4M2YsMHhiOCwweGI4LDB4ZWMsMHhkMiwweGM2LDB4MzMsMHgwZiwweDVkLDB4M2UsCisgIDB4ZmIsMHhmMSwweGM1LDB4NjUsMHhmNywweDZjLDB4YmMsMHg4YywweGMxLDB4YzcsMHhlMCwweDBhLDB4M2UsMHgyYiwweGZlLDB4YjYsCisgIDB4NjIsMHg2MSwweDY2LDB4NmQsMHg3ZSwweGNmLDB4YjYsMHgwNSwweDE3LDB4YWIsMHg3ZiwweGQyLDB4NzksMHgzOSwweGZmLDB4ZWIsCisgIDB4NmQsMHgyYiwweGZlLDB4N2UsMHhlZCwweGJkLDB4YWYsMHhhZCwweGNkLDB4M2YsMHhmMiwweGYxLDB4Y2EsMHhjYiwweDZiLDB4MTcsCisgIDB4YmQsMHhiNiwweGY2LDB4ZmMsMHgyMywweDY3LDB4ZTksMHhmMSwweDJiLDB4ZWYsMHhiOSwweGY5LDB4Y2MsMHg0MywweGNmLDB4OWMsCisgIDB4N2QsMHg5ZiwweDRjLDB4YzMsMHg5ZSwweGQ4LDB4ZDksMHgwZiwweGQwLDB4ZjgsMHg5YiwweGNmLDB4NTgsMHgzMywweGE0LDB4YzcsCisgIDB4MzcsMHhjZCwweGVmLDB4M2EsMHhiMywweGU3LDB4YzYsMHhiMywweDBmLDB4ZGMsMHhiNiwweDBjLDB4ZmYsMHhjNywweDQzLDB4NjcsCisgIDB4ZGYsMHg3ZiwweDFiLDB4ODEsMHhiNywweGVhLDB4OWUsMHgxOSwweDc4LDB4ZmYsMHg2MiwweDUzLDB4Y2EsMHgwMiwweGVmLDB4N2QsCisgIDB4Y2YsMHgzNywweGExLDB4YmUsMHg1ZSwweDdkLDB4OWYsMHhiYSwweDQ4LDB4YmQsMHg2ZiwweGI0LDB4MTEsMHgwMSwweDcwLDB4YTMsCisgIDB4NWMsMHg3MSwweDU0LDB4ZWMsMHhkNSwweGU3LDB4YWEsMHg4YiwweGVhLDB4MmQsMHg4MCwweGJlLDB4OWEsMHg1YiwweDQxLDB4Y2IsCisgIDB4NTMsMHgxZSwweGRjLDB4MDEsMHgxMCwweDA5LDB4YWMsMHgwNSwweGUzLDB4ODMsMHg5OCwweDBkLDB4NmUsMHhiMiwweGY4LDB4MjEsCisgIDB4MzgsMHhlZCwweDIzLDB4OGEsMHhmNCwweDc4LDB4ODcsMHgxZiwweDVlLDB4MDUsMHhmYSwweDczLDB4MTgsMHhjYywweDU2LDB4ZTQsCisgIDB4OWQsMHgyZSwweDNmLDB4ZjQsMHgwMCwweGY0LDB4NGQsMHhjOCwweDI2LDB4NjksMHhiOSwweDIwLDB4N2YsMHg1MywweDY5LDB4NDAsCisgIDB4M2UsMHhjYSwweGFhLDB4YmIsMHg4NCwweDA0LDB4ZWMsMHg4YywweGMzLDB4ODksMHg2ZCwweGVkLDB4YzIsMHhkYywweDgxLDB4YWYsCisgIDB4NjksMHgzNSwweGM3LDB4NjQsMHhiYywweDMxLDB4YmUsMHg3NiwweDUzLDB4Y2QsMHg4NCwweDBkLDB4YjQsMHgxYSwweGQzLDB4N2YsCisgIDB4N2YsMHg1NSwweDI5LDB4NDMsMHhmYywweDcwLDB4MTAsMHhiMSwweDJlLDB4ZWYsMHhmZSwweDBhLDB4MDYsMHg3ZCwweGU0LDB4MmYsCisgIDB4OTIsMHg0ZiwweDE1LDB4YTIsMHg4NSwweDg4LDB4MWYsMHgxYSwweDAwLDB4M2QsMHg1NiwweDgyLDB4MDIsMHgxMSwweDFiLDB4MWMsCisgIDB4OTYsMHg5YiwweGQxLDB4OTUsMHg0YywweGFmLDB4YmEsMHgwZiwweDMzLDB4NDYsMHg5OCwweDMxLDB4N2MsMHhlZiwweDY4LDB4NWYsCisgIDB4OTEsMHhkNywweDBkLDB4Y2UsMHg3ZSwweDZjLDB4ZjUsMHgxMSwweDc1LDB4YzksMHhjMCwweGI3LDB4NzIsMHhiNSwweDIzLDB4YWIsCisgIDB4MWUsMHhhYiwweGI5LDB4NDYsMHhlZSwweDMyLDB4NmYsMHhiMSwweGMxLDB4M2EsMHhmYiwweDBhLDB4MzUsMHg3YiwweGIzLDB4MGEsCisgIDB4ZDQsMHg4MSwweGZhLDB4ODksMHhkOCwweGMzLDB4NjAsMHgxMiwweDRhLDB4YTAsMHgxZSwweDcxLDB4MWYsMHhmYiwweGI0LDB4MzEsCisgIDB4NjMsMHgzNiwweGE4LDB4YzcsMHg0MCwweDI3LDB4ZmYsMHgwMSwweGJkLDB4YWEsMHhhYSwweDJhLDB4N2EsMHg5NywweGVkLDB4MDYsCisgIDB4ZjgsMHgyOSwweGMyLDB4NmYsMHhhMiwweDgyLDB4MGEsMHg1NiwweGExLDB4N2YsMHhjOCwweDU5LDB4NjEsMHhiNiwweDZhLDB4YmQsCisgIDB4MzQsMHhlYiwweDgyLDB4ZTcsMHhiZSwweDQ2LDB4ZjcsMHhiNywweDVmLDB4NTcsMHgzNSwweGQ5LDB4ZmYsMHhhNiwweDJhLDB4ZmIsCisgIDB4NWYsMHgzOSwweGU5LDB4ZjEsMHhiMiwweDYxLDB4MmIsMHg0OSwweGFjLDB4ZTgsMHg1MywweDQ4LDB4ZTMsMHgyMywweGZkLDB4NjksCisgIDB4MDgsMHhjMywweDE2LDB4MzEsMHg3MSwweGJlLDB4YWEsMHg4MSwweGRlLDB4NzgsMHg1NSwweGQwLDB4NDUsMHgwMywweDBjLDB4ODMsCisgIDB4ZmYsMHg2ZCwweGRmLDB4N2MsMHg1ZSwweGE0LDB4YjgsMHg4MiwweDM4LDB4NWUsMHg2ZiwweGU2LDB4ZWQsMHhhNCwweGM1LDB4ZDksCisgIDB4YTUsMHg3YiwweDMzLDB4MGIsMHhhZCwweDJjLDB4MzIsMHhhMywweGFiLDB4MWUsMHhiYywweGY0LDB4MmMsMHgwYSwweDhhLDB4MDcsCisgIDB4OWYsMHhiYiwweDMzLDB4ZWIsMHhhYywweGIwLDB4ZGEsMHg0NCwweDU0LDB4MDgsMHgzOSwweGI0LDB4YzEsMHg4YiwweGI3LDB4ZWMsCisgIDB4Y2QsMHg0YiwweGUyLDB4OWIsMHhjZCwweDQ1LDB4YzQsMHhjMywweGEyLDB4MjIsMHgwYSwweDgyLDB4N2IsMHhkMCwweGRjLDB4ODQsCisgIDB4ZmMsMHgwOSwweDMzLDB4MGIsMHgxOSwweDQ4LDB4NGUsMHg0MiwweDYyLDB4NmUsMHgyMSwweDFiLDB4YzgsMHhjNSwweGJiLDB4MTAsCisgIDB4NzIsMHg5MCwweGI1LDB4ZWEsMHhiZCwweGZlLDB4ZjEsMHg3YSwweGM3LDB4MDgsMHg3YSwweDg4LDB4MjAsMHhmNSwweGJkLDB4ZWMsCisgIDB4OTcsMHhkYSwweDM3LDB4NGQsMHg3NSwweGJmLDB4OWEsMHhlYSwweDRmLDB4ZjUsMHhjYywweDFjLDB4YTIsMHg5ZSwweDY1LDB4Y2QsCisgIDB4MmUsMHgzMiwweDYxLDB4NjYsMHg0YywweDY0LDB4MmQsMHg0ZiwweDVmLDB4NzUsMHgxNywweDJjLDB4MWYsMHhmNiwweDg4LDB4MGYsCisgIDB4MGQsMHgyOCwweGZhLDB4OWIsMHg2OCwweDZlLDB4NjcsMHhjNiwweGYyLDB4NjEsMHg3ZSwweGJmLDB4YTAsMHgzMywweDFmLDB4ZTcsCisgIDB4YzMsMHhmOSwweGQ0LDB4YTgsMHgzYywweGEyLDB4ZjIsMHhmNSwweDE1LDB4YjAsMHhkOCwweDg5LDB4ZDgsMHg5NiwweDliLDB4ZjksCisgIDB4NDEsMHgzOSwweDMyLDB4MjgsMHhlNSwweDYzLDB4ZjgsMHhhZCwweDBlLDB4NmIsMHhkNiwweDc4LDB4MDEsMHg5YSwweGUxLDB4NTcsCisgIDB4YTksMHhiMSwweDExLDB4NWQsMHhlNCwweDIzLDB4YzYsMHhmOSwweDcwLDB4ZGMsMHgxNCwweGY1LDB4MTAsMHg4YiwweGI3LDB4MWUsCisgIDB4MWYsMHg0ZiwweGIzLDB4NzQsMHg3YywweDI3LDB4MWYsMHg4NSwweDFiLDB4ZDksMHg4MCwweDJlLDB4YTIsMHg3ZiwweDZhLDB4MDIsCisgIDB4MzQsMHhiOCwweDVmLDB4NjQsMHhlNiwweGQyLDB4YzgsMHg0MiwweDllLDB4NGYsMHg0ZiwweDExLDB4MGQsMHhjZSwweDI2LDB4OWYsCisgIDB4ODUsMHhhMiwweDA2LDB4YWIsMHg4NiwweDBmLDB4MDUsMHg0NSwweGNhLDB4YTYsMHgyOCwweDlmLDB4MWUsMHg3ZCwweGE1LDB4NDQsCisgIDB4NjcsMHhmMywweDg2LDB4YzYsMHg3YSwweDQxLDB4M2UsMHgxNCwweGY0LDB4OTUsMHgzYiwweDZiLDB4YjQsMHgzMSwweGUwLDB4ZTQsCisgIDB4NzMsMHgwOSwweDY5LDB4NTAsMHgyNywweGFkLDB4MTgsMHgyZSwweDIxLDB4MjgsMHhiZSwweDMwLDB4NTgsMHg5OCwweGYzLDB4NjEsCisgIDB4NjYsMHg1NCwweDcxLDB4N2YsMHgxNywweDRiLDB4NzIsMHhiNSwweDNmLDB4OWIsMHg5YywweDA5LDB4ODMsMHhkMSwweDdmLDB4MWIsCisgIDB4ZTcsMHhmYSwweDIzLDB4NzYsMHhhZSwweGVhLDB4NDcsMHhjOSwweDYxLDB4NGIsMHg4MywweDY0LDB4NzYsMHg4ZCwweGYwLDB4NDQsCisgIDB4NjYsMHg4ZCwweGE5LDB4YTQsMHg5MSwweDYyLDB4N2QsMHg4YywweDdjLDB4ZDgsMHgzNiwweDU4LDB4MjgsMHg0NiwweGE5LDB4OTksCisgIDB4MTksMHg4OSwweGQ1LDB4ZmUsMHg2ZCwweDM0LDB4MTcsMHgzMywweDYyLDB4OWMsMHhkOSwweDc0LDB4ZWEsMHg2NywweDFhLDB4YzcsCisgIDB4NGMsMHhlNCwweDQzLDB4MjUsMHhkNywweDQ1LDB4YTIsMHg5NywweGVkLDB4NTgsMHgzYSwweDg3LDB4ZGIsMHgzNCwweGRkLDB4YzMsCisgIDB4MDgsMHhmNSwweDFmLDB4ZGYsMHhlZCwweDNmLDB4MGEsMHhjYiwweGY1LDB4OGEsMHgwZSwweDkzLDB4ZGEsMHgwMywweGY4LDB4MDEsCisgIDB4Y2QsMHhkZSwweGE0LDB4MTYsMHgwYSwweGU0LDB4NDMsMHhlZCwweDY1LDB4MjYsMHgyNCwweDUzLDB4YWMsMHg4NywweDZlLDB4MjIsCisgIDB4YWYsMHhiNywweGE2LDB4YmMsMHhjNSwweDM1LDB4ZDgsMHg5MCwweGM3LDB4YzUsMHgzZSwweDFjLDB4ZDUsMHg4MiwweDJkLDB4NzksCisgIDB4MWQsMHhjZCwweDE5LDB4YzcsMHgzOCwweGY1LDB4MmMsMHhiZSwweDQwLDB4MWEsMHhmNCwweGEyLDB4MGEsMHhjZSwweDBiLDB4NTgsCisgIDB4MmQsMHg3YiwweGIwLDB4NWEsMHhiMCwweGVkLDB4NWMsMHgyNSwweDJjLDB4ZWMsMHg4OSwweDNiLDB4MTksMHgyOCwweDNhLDB4ZjksCisgIDB4NjAsMHhmZCwweDM0LDB4NGQsMHg5MSwweGMwLDB4MmQsMHhhMiwweGMxLDB4OGQsMHhhNSwweDEyLDB4MWYsMHhhNiwweGM2LDB4YWQsCisgIDB4OWYsMHgwNSwweGE5LDB4ODYsMHg4ZCwweDY2LDB4ZDcsMHhmMywweDJiLDB4MzIsMHhlZSwweGZiLDB4NjgsMHg4MiwweDhhLDB4NTQsCisgIDB4ZGEsMHg2ZiwweDc2LDB4OGMsMHhlOSwweDFiLDB4MDMsMHhjZSwweGY1LDB4YzEsMHhmNywweGNiLDB4YTAsMHgxMSwweDRkLDB4NzgsCisgIDB4ZjAsMHg0YiwweDEzLDB4MDYsMHg4ZCwweDFmLDB4NDUsMHg1ZCwweDJjLDB4NDIsMHhhYywweDMxLDB4ODIsMHhhNiwweDE5LDB4MGYsCisgIDB4OGMsMHg1MSwweGNlLDB4ZjUsMHhmMSwweGE4LDB4ZmYsMHgxMCwweDFmLDB4ODIsMHhjMiwweDY5LDB4MTQsMHg3MCwweDNlLDB4ZjUsCisgIDB4ZTQsMHg4MiwweGIwLDB4YTAsMHhhOCwweGM2LDB4ZjgsMHgxMCwweGYzLDB4ZDksMHgzZiwweDRkLDB4N2MsMHg4OCwweGNkLDB4NjAsCisgIDB4M2YsMHgzMiwweGQ5LDB4N2MsMHgwYiwweGY5LDB4MTAsMHg1MiwweDNlLDB4Y2MsMHg0MSwweGQxLDB4YzksMHg0NywweGVjLDB4ZTgsCisgIDB4M2YsMHhhNSwweGI2LDB4OTMsMHgxYiwweGU3LDB4ZmEsMHhhOCwweGNhLDB4NTUsMHg3OCwweDA4LDB4MzUsMHhmYSwweGUyLDB4NDAsCisgIDB4MzIsMHhmMSwweDMwLDB4NmIsMHgzYiwweDFlLDB4OTksMHhmNSwweGJjLDB4MjMsMHgzOSwweGY5LDB4MjQsMHhiOCwweDRkLDB4NTMsCisgIDB4YjgsMHg0ZCwweDlhLDB4ZjYsMHgwYiwweDM3LDB4NGUsMHhmYiwweDViLDB4NzAsMHg1YywweGRjLDB4YzIsMHg0OCwweGJjLDB4OTUsCisgIDB4ZmUsMHhjYiwweGU5LDB4M2YsMHgzMSwweDllLDB4ZTAsMHgwOSwweDM1LDB4ZjUsMHg0ZCwweGY1LDB4OTEsMHg3ZSwweGJhLDB4MTEsCisgIDB4YTksMHhiYSwweDVmLDB4OTUsMHgzMCwweDg0LDB4NDgsMHg3OSwweDY0LDB4N2UsMHg4MiwweDM0LDB4ZTIsMHhkNCwweDMzLDB4YmUsCisgIDB4NTMsMHg4ZiwweGE5LDB4YzksMHhiOCwweDFhLDB4Y2IsMHhmYiwweGQwLDB4M2UsMHgzZCwweGE5LDB4YWEsMHgwZCwweDVjLDB4ZDYsCisgIDB4MDYsMHgyZiwweDQ2LDB4ZjMsMHgwMiwweGRhLDB4YWEsMHg0ZSwweDY2LDB4ZDMsMHhjOSwweDY3LDB4NTEsMHg1ZSwweDE5LDB4ODYsCisgIDB4ZDEsMHg1MiwweDA4LDB4ZGYsMHhjYiwweDY0LDB4ODAsMHhhNiwweDFlLDB4YTAsMHgxOSwweDFhLDB4NzMsMHgzNywweDMzLDB4NmUsCisgIDB4ZmYsMHg1MSwweGM0LDB4ODcsMHg4MywweDBhLDB4M2QsMHhhNywweGRjLDB4ZjksMHhkNCwweGQwLDB4ODksMHgxNCwweGQ3LDB4YTcsCisgIDB4ZDcsMHg0OSwweGY2LDB4ODQsMHhiNSwweDI1LDB4YTEsMHg3NSwweGU3LDB4NmIsMHgxZiwweDQxLDB4YjEsMHgxNSwweGRjLDB4Y2MsCisgIDB4YjAsMHhmMCwweDgxLDB4MWMsMHhlMywweDQzLDB4ZWMsMHgzZiwweDlkLDB4OGIsMHhjMSwweDhjLDB4ZWMsMHg5ZSwweGY2LDB4ZmQsCisgIDB4NGUsMHhlYywweDM3LDB4NjQsMHg1NywweDA0LDB4Y2EsMHgxYSwweDA4LDB4M2EsMHgzMiwweDBlLDB4NmMsMHhjNCwweGE5LDB4MWYsCisgIDB4MmEsMHhjMCwweGZjLDB4YjksMHg4MywweGJmLDB4MzYsMHg4MSwweDI1LDB4MDksMHhiNiwweDM2LDB4NDUsMHg2ZSwweDhhLDB4N2EsCisgIDB4MDAsMHg2OSwweGIxLDB4NTAsMHg5NSwweGY5LDB4YjAsMHg5ZiwweDE5LDB4MWIsMHg3MSwweGViLDB4NjcsMHhhNSwweDdhLDB4NDEsCisgIDB4ZGQsMHg3YiwweGRlLDB4M2EsMHhhYSwweDU3LDB4MmEsMHg1NSwweGY1LDB4ZGIsMHhmMywweDgzLDB4NDcsMHgyNywweDU3LDB4YzQsCisgIDB4MDUsMHgzNCwweGM3LDB4ZDAsMHg1NCwweDUzLDB4ZTMsMHhlNCwweDIzLDB4OTAsMHgwNywweDkwLDB4MGYsMHhmMSwweGE2LDB4ZmYsCisgIDB4ZjMsMHgxYywweGRkLDB4ZmQsMHgyZiwweDM3LDB4MGIsMHgwYywweDc4LDB4MmIsMHgwZiwweDFjLDB4YzksMHhmOCwweDcwLDB4ZjcsCisgIDB4ZDksMHhiMywweGM0LDB4ODcsMHhjZiwweGFlLDB4MWQsMHgzMSwweDdjLDB4ZjgsMHhjNCwweGYwLDB4ZTEsMHhlZiwweDY0LDB4OTYsCisgIDB4OWQsMHhlNSwweDcwLDB4MmEsMHhlMywweGMzLDB4OTMsMHgzNywweGNlLDB4MTMsMHgxZiwweDZlLDB4YmYsMHgzZSwweDY1LDB4YzAsCisgIDB4ZWMsMHg5NSwweGU1LDB4YzMsMHg1ZiwweGI3LDB4NWYsMHg2ZCwweDk3LDB4NzgsMHhlYywweDdkLDB4NjUsMHhiMCwweGYwLDB4ZTUsCisgIDB4M2EsMHgxZSwweGY2LDB4ZGYsMHgxNCwweDE0LDB4ZTcsMHgxZSwweDJmLDB4OTMsMHgzMSwweDdjLDB4NjgsMHgyMiwweGRmLDB4YmEsCisgIDB4ZWIsMHgwZCwweDE2LDB4ZmUsMHhmMywweDM3LDB4YTUsMHg5MSwweDgxLDB4ZTIsMHgwZCwweDYzLDB4MmMsMHgxZiwweDUyLDB4YTQsCisgIDB4YzQsMHhhYiwweDI3LDB4MzMsMHgzZSwweDNjLDB4YjAsMHhlZiwweGRjLDB4OWYsMHg3NywweGRhLDB4YjQsMHhmZSwweGJiLDB4NzMsCisgIDB4YTMsMHhjZiwweGU5LDB4ODUsMHgzOSwweDZhLDB4N2UsMHg3OCwweGY2LDB4MTEsMHg4ZSwweDU4LDB4ZjgsMHhiNiwweGM2LDB4YmYsCisgIDB4OGIsMHhmNSwweDBmLDB4M2YsMHgwYSwweDhiLDB4YzUsMHg2MiwweGIxLDB4NTgsMHgyYywweDE2LDB4OGIsMHhjNSwweGZhLDB4ZDQsCisgIDB4NjUsMHg2NiwweDA3LDB4YzksMHhiMywweDAzLDB4OGIsMHhjNSwweDYyLDB4YjEsMHg1OCwweDJjLDB4MTYsMHg4YiwweGM1LDB4N2EsCisgIDB4YjcsMHhjYywweGVjLDB4NTAsMHhlMywweGQ5LDB4ODEsMHhjNSwweDYyLDB4YjEsMHg1OCwweDJjLDB4MTYsMHg4YiwweGM1LDB4NjIsCisgIDB4YmQsMHg1YiwweDY2LDB4NzYsMHhmMCwweGNjLDB4ZWMsMHhmMCwweGIxLDB4NTMsMHg2MSwweGIxLDB4NTgsMHgyYywweDE2LDB4OGIsCisgIDB4YzUsMHg2MiwweGIxLDB4NTgsMHhmZiwweGEzLDB4MjIsMHhmYSwweDdkLDB4MWMsMHgzYywweGZiLDB4MjMsMHgwMiwweDRkLDB4YmYsCisgIDB4NWEsMHhhOSwweDQ2LDB4YTAsMHhkZSwweGZiLDB4ZjMsMHg4NCwweGY0LDB4YjUsMHgxMywweDExLDB4NmMsMHg4OCwweGUyLDB4OTgsCisgIDB4N2YsMHg3ZCwweGI5LDB4NzMsMHhkZCwweDFiLDB4M2IsMHgxYywweDI5LDB4YzIsMHhmMCwweDMzLDB4MDEsMHgwMCwKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC93dWg0MDUvd3VoNDA1LmMgYi9ib2FyZC9lc2Qvd3VoNDA1L3d1aDQwNS5jCmluZGV4IDVmZGU4ZDYuLmRiYTNjZTggMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC93dWg0MDUvd3VoNDA1LmMKKysrIGIvYm9hcmQvZXNkL3d1aDQwNS93dWg0MDUuYwpAQCAtMjE0LDUgKzIxNCwzIEBACiAKIAlyZXR1cm4gKDQqMTAyNCoxMDI0IDw8ICgodmFsICYgMHgwMDBlMDAwMCkgPj4gMTcpKTsKIH0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZXRpbi9kZWJyaXMvcGhhbnRvbS5jIGIvYm9hcmQvZXRpbi9kZWJyaXMvcGhhbnRvbS5jCmluZGV4IDBiODFmYzAuLjE4YWI1MDAgMTAwNjQ0Ci0tLSBhL2JvYXJkL2V0aW4vZGVicmlzL3BoYW50b20uYworKysgYi9ib2FyZC9ldGluL2RlYnJpcy9waGFudG9tLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAjZGVmaW5lIFJUQ19CQVNFIChDRkdfTlZSQU1fQkFTRV9BRERSICsgMHg3ZmZmOCkKIApkaWZmIC0tZ2l0IGEvYm9hcmQvZXRpbi9kZWJyaXMvdS1ib290LmxkcyBiL2JvYXJkL2V0aW4vZGVicmlzL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDJiY2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZXRpbi9kZWJyaXMvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2V0aW4va3ZtZTA4MC91LWJvb3QubGRzIGIvYm9hcmQvZXRpbi9rdm1lMDgwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTM2ODcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZXRpbi9rdm1lMDgwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA2Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXZiNjQyNjAvZXRoLmMgYi9ib2FyZC9ldmI2NDI2MC9ldGguYwppbmRleCBlYWZhNDhiLi5hZGQyYjNkIDEwMDY0NAotLS0gYS9ib2FyZC9ldmI2NDI2MC9ldGguYworKysgYi9ib2FyZC9ldmI2NDI2MC9ldGguYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgImV0aC5oIgogI2luY2x1ZGUgImV0aF9hZGRydGJsLmgiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAKICNkZWZpbmUgR1Q2NDI2eF9FVEhfQlVGX1NJWkUJMTUzNgogCkBAIC03OTcsMTEgKzc5NywxMSBAQAogCiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCQltaWlwaHlfcmVnaXN0ZXIoZGV2LT5uYW1lLAogCQkJCWd0NjQyNnhfbWlpcGh5X3JlYWQsIGd0NjQyNnhfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgogCX0KIAogfQotI2VuZGlmIC8qIENGR19DTURfTkVUICYmIENPTkZJR19ORVRfTVVMVEkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvZXZiNjQyNjAvc2VyaWFsLmMgYi9ib2FyZC9ldmI2NDI2MC9zZXJpYWwuYwppbmRleCAxOTE0NDVjLi5mMWJjYWIzIDEwMDY0NAotLS0gYS9ib2FyZC9ldmI2NDI2MC9zZXJpYWwuYworKysgYi9ib2FyZC9ldmI2NDI2MC9zZXJpYWwuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJfQogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIHZvaWQKIGtnZGJfc2VyaWFsX2luaXQodm9pZCkKIHsKQEAgLTE4Miw0ICsxODIsNCBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0tHREIJKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvZXZiNjQyNjAvenVtYV9wYmIuYyBiL2JvYXJkL2V2YjY0MjYwL3p1bWFfcGJiLmMKaW5kZXggZDY0MDI1YS4uMjk2ZTQ2MSAxMDA2NDQKLS0tIGEvYm9hcmQvZXZiNjQyNjAvenVtYV9wYmIuYworKysgYi9ib2FyZC9ldmI2NDI2MC96dW1hX3BiYi5jCkBAIC0xLDcgKzEsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2VuZGlmCiAKQEAgLTE2Niw3ICsxNjYsNyBAQAogCiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogc3RhdGljIGludCBsYXN0X2NtZCA9IDQ7CQkvKiB3cml0ZSBpbmNyZW1lbnQgKi8KIHN0YXRpYyBpbnQgbGFzdF9zaXplID0gNjQ7CkBAIC0yMTcsNCArMjE3LDQgQEAKIAkiICAgIC0gaW5pdCB6dW1hIG1ib3hcbiIKICk7CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9mYWRzL2ZhZHMuYyBiL2JvYXJkL2ZhZHMvZmFkcy5jCmluZGV4IDdiMDRhZjUuLjhmNTczNmIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ZhZHMvZmFkcy5jCisrKyBiL2JvYXJkL2ZhZHMvZmFkcy5jCkBAIC03NzgsNyArNzc4LDcgQEAKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAKICNpZmRlZiBDRkdfUENNQ0lBX01FTV9BRERSCiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY21jaWFfbWVtID0gKHVuc2lnbmVkIGNoYXIqKUNGR19QQ01DSUFfTUVNX0FERFI7CkBAIC05MjEsNyArOTIxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCmRpZmYgLS1naXQgYS9ib2FyZC9mYWRzL2ZhZHMuaCBiL2JvYXJkL2ZhZHMvZmFkcy5oCmluZGV4IDQxZjE4YjUuLmM2ZjdjY2QgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ZhZHMvZmFkcy5oCisrKyBiL2JvYXJkL2ZhZHMvZmFkcy5oCkBAIC05NSwyMSArOTUsMzMgQEAKICNkZWZpbmUgQ0ZHX0RJU0NPVkVSX1BIWQogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX0NPTU1BTkRTCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgICBcCi0JCQkgfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkgfCBDRkdfQ01EX0RIQ1AgICBcCi0JCQkgfCBDRkdfQ01EX0VDSE8gICBcCi0JCQkgfCBDRkdfQ01EX0lNTUFQICBcCi0JCQkgfCBDRkdfQ01EX0pGRlMyICBcCi0JCQkgfCBDRkdfQ01EX01JSSAgICBcCi0JCQkgfCBDRkdfQ01EX1BDTUNJQSBcCi0JCQkgfCBDRkdfQ01EX1BJTkcgICBcCi0JCQkpCi0jZW5kaWYgLyogIUNPTkZJR19DT01NQU5EUyAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKyNpZiAhZGVmaW5lZChGQURTX0NPTU1BTkRTX0FMUkVBRFlfREVGSU5FRCkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisjZGVmaW5lIENPTkZJR19DTURfUElORworCisjZW5kaWYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTE4LDcgKzEzMCw3IEBACiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJCS8qICN1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTcsNyArMjI5LDcgQEAKIAogI2RlZmluZQlDRkdfRElSRUNUX0ZMQVNIX1RGVFAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogLyoKICAqIEpGRlMyIHBhcnRpdGlvbnMKQEAgLTIzOCw3ICsyNTAsNyBAQAogKi8KIAogI2RlZmluZSBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ2FjaGUgQ29uZmlndXJhdGlvbgpAQCAtMjQ5LDcgKzI2MSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJMkMgY29uZmlndXJhdGlvbgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0ICovCiAjZGVmaW5lIENGR19JMkNfU1BFRUQJCTQwMDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MgZGVmYXVsdHMgKi8KICNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgpAQCAtNDY3LDcgKzQ3OSw3IEBACiAjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCTEKIAogI3VuZGVmCUNPTkZJR19BVEFQSQotI2lmIDAJLyogZG9lcyBub3QgbWFrZSBzZW5zZSB3aGVuIENGR19DTURfSURFIGlzIG5vdCBlbmFibGVkLCB0b28gKi8KKyNpZiAwCS8qIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugd2hlbiBDT05GSUdfQ01EX0lERSBpcyBub3QgZW5hYmxlZCwgdG9vICovCiAjZGVmaW5lIENPTkZJR19JREVfOHh4X1BDQ0FSRAkxCS8qIFVzZSBJREUgd2l0aCBQQyBDYXJkIEFkYXB0ZXIgKi8KICNlbmRpZgogI3VuZGVmCUNPTkZJR19JREVfOHh4X0RJUkVDVAkJLyogRGlyZWN0IElERQkgbm90IHN1cHBvcnRlZAkqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZmFkcy9wY21jaWEuYyBiL2JvYXJkL2ZhZHMvcGNtY2lhLmMKaW5kZXggOTc4YzE2Yi4uNTdhMjQ1NCAxMDA2NDQKLS0tIGEvYm9hcmQvZmFkcy9wY21jaWEuYworKysgYi9ib2FyZC9mYWRzL3BjbWNpYS5jCkBAIC00LDExICs0LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtNzMsMTIgKzczLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAkqKCh1aW50ICopQkNTUjEpICY9IH5CQ1NSMV9QQ0NFTjsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKICNlbmRpZgkvKiBDT05GSUdfUENNQ0lBICovCmRpZmYgLS1naXQgYS9ib2FyZC9mcmVlc2NhbGUvY29tbW9uL3BpeGlzLmMgYi9ib2FyZC9mcmVlc2NhbGUvY29tbW9uL3BpeGlzLmMKaW5kZXggYWY5ODE1Ny4uOTljYzJlZSAxMDA2NDQKLS0tIGEvYm9hcmQvZnJlZXNjYWxlL2NvbW1vbi9waXhpcy5jCisrKyBiL2JvYXJkL2ZyZWVzY2FsZS9jb21tb24vcGl4aXMuYwpAQCAtMzIxLDEwICszMjEsMTAgQEAKIAkJbXVsY29uc3QgPSAxOwogCQlmb3IgKGkgPSAwOyBpIDwgZGVjYXJyX2xlbjsgaSsrKQogCQkJbXVsY29uc3QgKj0gMTA7Ci0JCWRlY3ZhbCA9IHNpbXBsZV9zdHJ0b3VsKGRlY2FyciwgTlVMTCwgMTApOworCQlkZWN2YWwgPSBzaW1wbGVfc3RydG91bCgoY2hhciAqKWRlY2FyciwgTlVMTCwgMTApOwogCX0KIAotCWludHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGludGFyciwgTlVMTCwgMTApOworCWludHZhbCA9IHNpbXBsZV9zdHJ0b3VsKChjaGFyICopaW50YXJyLCBOVUxMLCAxMCk7CiAJaW50dmFsID0gaW50dmFsICogbXVsY29uc3Q7CiAKIAlyZXR2YWwgPSBpbnR2YWwgKyBkZWN2YWw7CkBAIC0zNjIsNyArMzYyLDcgQEAKIAogCQl2YWwgPSBzZXRfcHhfc3lzY2xrKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKSk7CiAKLQkJY29yZXBsbCA9IHN0cmZyYWN0b2ludChhcmd2WzNdKTsKKwkJY29yZXBsbCA9IHN0cmZyYWN0b2ludCgodWNoYXIgKilhcmd2WzNdKTsKIAkJdmFsID0gdmFsICsgc2V0X3B4X2NvcmVwbGwoY29yZXBsbCk7CiAJCXZhbCA9IHZhbCArIHNldF9weF9tcHhwbGwoc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgTlVMTCwgMTApKTsKIAkJaWYgKHZhbCA9PSAzKSB7CkBAIC00MTAsNyArNDEwLDcgQEAKIAkJCXJlYWRfZnJvbV9weF9yZWdzKDApOwogCQkJcmVhZF9mcm9tX3B4X3JlZ3NfYWx0YmFuaygwKTsKIAkJCXZhbCA9IHNldF9weF9zeXNjbGsoc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTApKTsKLQkJCWNvcmVwbGwgPSBzdHJmcmFjdG9pbnQoYXJndls0XSk7CisJCQljb3JlcGxsID0gc3RyZnJhY3RvaW50KCh1Y2hhciAqKWFyZ3ZbNF0pOwogCQkJdmFsID0gdmFsICsgc2V0X3B4X2NvcmVwbGwoY29yZXBsbCk7CiAJCQl2YWwgPSB2YWwgKyBzZXRfcHhfbXB4cGxsKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sCiAJCQkJCQkJCSBOVUxMLCAxMCkpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL01ha2VmaWxlIGIvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzk1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvTWFrZWZpbGUKQEAgLTAsMCArMSw1MCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gJChCT0FSRCkubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL2NvbmZpZy5tayBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwZDM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9jb25maWcubWsKQEAgLTAsMCArMSwyOCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIworIyBNUEM4MzIzRVJEQgorIworCitURVhUX0JBU0UgPSAweEZFMDAwMDAwCmRpZmYgLS1naXQgYS9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvbXBjODMyM2VyZGIuYyBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9tcGM4MzIzZXJkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODZmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvbXBjODMyM2VyZGIuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIE1pY2hhZWwgQmFya293c2tpIDxtaWNoYWVsLmJhcmtvd3NraUBmcmVlc2NhbGUuY29tPgorICogQmFzZWQgb24gbXBjODMyeG1kcyBmaWxlIGJ5IERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8aW9wb3J0cy5oPgorI2luY2x1ZGUgPG1wYzgzeHguaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxzcGQuaD4KKyNpbmNsdWRlIDxtaWlwaHkuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNpbmNsdWRlIDxwY2kuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQRF9FRVBST00pCisjaW5jbHVkZSA8c3BkX3NkcmFtLmg+CisjZWxzZQorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNlbmRpZgorCitjb25zdCBxZV9pb3BfY29uZl90IHFlX2lvcF9jb25mX3RhYltdID0geworCS8qIFVDQzMgKi8KKwl7MSwgIDAsIDEsIDAsIDF9LCAvKiBUeEQwICovCisJezEsICAxLCAxLCAwLCAxfSwgLyogVHhEMSAqLworCXsxLCAgMiwgMSwgMCwgMX0sIC8qIFR4RDIgKi8KKwl7MSwgIDMsIDEsIDAsIDF9LCAvKiBUeEQzICovCisJezEsICA5LCAxLCAwLCAxfSwgLyogVHhFUiAqLworCXsxLCAxMiwgMSwgMCwgMX0sIC8qIFR4RU4gKi8KKwl7MywgMjQsIDIsIDAsIDF9LCAvKiBUeENMSy0+Q0xLMTAgKi8KKworCXsxLCAgNCwgMiwgMCwgMX0sIC8qIFJ4RDAgKi8KKwl7MSwgIDUsIDIsIDAsIDF9LCAvKiBSeEQxICovCisJezEsICA2LCAyLCAwLCAxfSwgLyogUnhEMiAqLworCXsxLCAgNywgMiwgMCwgMX0sIC8qIFJ4RDMgKi8KKwl7MSwgIDgsIDIsIDAsIDF9LCAvKiBSeEVSICovCisJezEsIDEwLCAyLCAwLCAxfSwgLyogUnhEViAqLworCXswLCAxMywgMiwgMCwgMX0sIC8qIFJ4Q0xLLT5DTEs5ICovCisJezEsIDExLCAyLCAwLCAxfSwgLyogQ09MICovCisJezEsIDEzLCAyLCAwLCAxfSwgLyogQ1JTICovCisKKwkvKiBVQ0MyICovCisJezAsIDE4LCAxLCAwLCAxfSwgLyogVHhEMCAqLworCXswLCAxOSwgMSwgMCwgMX0sIC8qIFR4RDEgKi8KKwl7MCwgMjAsIDEsIDAsIDF9LCAvKiBUeEQyICovCisJezAsIDIxLCAxLCAwLCAxfSwgLyogVHhEMyAqLworCXswLCAyNywgMSwgMCwgMX0sIC8qIFR4RVIgKi8KKwl7MCwgMzAsIDEsIDAsIDF9LCAvKiBUeEVOICovCisJezMsIDIzLCAyLCAwLCAxfSwgLyogVHhDTEstPkNMSzMgKi8KKworCXswLCAyMiwgMiwgMCwgMX0sIC8qIFJ4RDAgKi8KKwl7MCwgMjMsIDIsIDAsIDF9LCAvKiBSeEQxICovCisJezAsIDI0LCAyLCAwLCAxfSwgLyogUnhEMiAqLworCXswLCAyNSwgMiwgMCwgMX0sIC8qIFJ4RDMgKi8KKwl7MCwgMjYsIDEsIDAsIDF9LCAvKiBSeEVSICovCisJezAsIDI4LCAyLCAwLCAxfSwgLyogUnhfRFYgKi8KKwl7MywgMjEsIDIsIDAsIDF9LCAvKiBSeENMSy0+Q0xLMTYgKi8KKwl7MCwgMjksIDIsIDAsIDF9LCAvKiBDT0wgKi8KKwl7MCwgMzEsIDIsIDAsIDF9LCAvKiBDUlMgKi8KKworCXszLCAgNCwgMywgMCwgMn0sIC8qIE1ESU8gKi8KKwl7MywgIDUsIDEsIDAsIDJ9LCAvKiBNREMgKi8KKworCXswLCAgMCwgMCwgMCwgUUVfSU9QX1RBQl9FTkR9LCAvKiBFTkQgb2YgdGFibGUgKi8KK307CisKK2ludCBib2FyZF9lYXJseV9pbml0X2Yodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGZpeGVkX3NkcmFtKHZvaWQpOworCitsb25nIGludCBpbml0ZHJhbShpbnQgYm9hcmRfdHlwZSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXUzMiBtc2l6ZSA9IDA7CisKKwlpZiAoKGltLT5zeXNjb25mLmltbXJiYXIgJiBJTU1SQkFSX0JBU0VfQUREUikgIT0gKHUzMikgaW0pCisJCXJldHVybiAtMTsKKworCS8qIEREUiBTRFJBTSAtIE1haW4gU09ESU1NICovCisJaW0tPnN5c2NvbmYuZGRybGF3WzBdLmJhciA9IENGR19ERFJfQkFTRSAmIExBV0JBUl9CQVI7CisKKwltc2l6ZSA9IGZpeGVkX3NkcmFtKCk7CisKKwlwdXRzKCJcbiAgIEREUiBSQU06ICIpOworCisJLyogcmV0dXJuIHRvdGFsIGJ1cyBTRFJBTSBzaXplKGJ5dGVzKSAgLS0gRERSICovCisJcmV0dXJuIChtc2l6ZSAqIDEwMjQgKiAxMDI0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmaXhlZCBzZHJhbSBpbml0IC0tIGRvZXNuJ3QgdXNlIHNlcmlhbCBwcmVzZW5jZSBkZXRlY3QuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGZpeGVkX3NkcmFtKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl1MzIgbXNpemUgPSAwOworCXUzMiBkZHJfc2l6ZTsKKwl1MzIgZGRyX3NpemVfbG9nMjsKKworCW1zaXplID0gQ0ZHX0REUl9TSVpFOworCWZvciAoZGRyX3NpemUgPSBtc2l6ZSA8PCAyMCwgZGRyX3NpemVfbG9nMiA9IDA7CisJICAgICAoZGRyX3NpemUgPiAxKTsgZGRyX3NpemUgPSBkZHJfc2l6ZSA+PiAxLCBkZHJfc2l6ZV9sb2cyKyspIHsKKwkJaWYgKGRkcl9zaXplICYgMSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWltLT5zeXNjb25mLmRkcmxhd1swXS5hciA9CisJICAgIExBV0FSX0VOIHwgKChkZHJfc2l6ZV9sb2cyIC0gMSkgJiBMQVdBUl9TSVpFKTsKKwlpbS0+ZGRyLnNkcmFtX2Nsa19jbnRsID0gQ0ZHX0REUl9DTEtfQ05UTDsKKwlpbS0+ZGRyLmNzYm5kc1swXS5jc2JuZHMgPSBDRkdfRERSX0NTMF9CTkRTOworCWltLT5kZHIuY3NfY29uZmlnWzBdID0gQ0ZHX0REUl9DUzBfQ09ORklHOworCWltLT5kZHIudGltaW5nX2NmZ18wID0gQ0ZHX0REUl9USU1JTkdfMDsKKwlpbS0+ZGRyLnRpbWluZ19jZmdfMSA9IENGR19ERFJfVElNSU5HXzE7CisJaW0tPmRkci50aW1pbmdfY2ZnXzIgPSBDRkdfRERSX1RJTUlOR18yOworCWltLT5kZHIudGltaW5nX2NmZ18zID0gQ0ZHX0REUl9USU1JTkdfMzsKKwlpbS0+ZGRyLnNkcmFtX2NmZyA9IENGR19ERFJfU0RSQU1fQ0ZHOworCWltLT5kZHIuc2RyYW1fY2ZnMiA9IENGR19ERFJfU0RSQU1fQ0ZHMjsKKwlpbS0+ZGRyLnNkcmFtX21vZGUgPSBDRkdfRERSX01PREU7CisJaW0tPmRkci5zZHJhbV9tb2RlMiA9IENGR19ERFJfTU9ERTI7CisJaW0tPmRkci5zZHJhbV9pbnRlcnZhbCA9IENGR19ERFJfSU5URVJWQUw7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7CisJdWRlbGF5KDIwMCk7CisKKwlpbS0+ZGRyLnNkcmFtX2NmZyB8PSBTRFJBTV9DRkdfTUVNX0VOOworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOworCXJldHVybiBtc2l6ZTsKK30KKworaW50IGNoZWNrYm9hcmQodm9pZCkKK3sKKwlwdXRzKCJCb2FyZDogRnJlZXNjYWxlIE1QQzgzMjNFUkRCXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfcmVnaW9uIHBjaV9yZWdpb25zW10gPSB7CisJeworCQlidXNfc3RhcnQ6IENGR19QQ0kxX01FTV9CQVNFLAorCQlwaHlzX3N0YXJ0OiBDRkdfUENJMV9NRU1fUEhZUywKKwkJc2l6ZTogQ0ZHX1BDSTFfTUVNX1NJWkUsCisJCWZsYWdzOiBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fUFJFRkVUQ0gKKwl9LAorCXsKKwkJYnVzX3N0YXJ0OiBDRkdfUENJMV9NTUlPX0JBU0UsCisJCXBoeXNfc3RhcnQ6IENGR19QQ0kxX01NSU9fUEhZUywKKwkJc2l6ZTogQ0ZHX1BDSTFfTU1JT19TSVpFLAorCQlmbGFnczogUENJX1JFR0lPTl9NRU0KKwl9LAorCXsKKwkJYnVzX3N0YXJ0OiBDRkdfUENJMV9JT19CQVNFLAorCQlwaHlzX3N0YXJ0OiBDRkdfUENJMV9JT19QSFlTLAorCQlzaXplOiBDRkdfUENJMV9JT19TSVpFLAorCQlmbGFnczogUENJX1JFR0lPTl9JTworCX0KK307CisKK3ZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKHZvbGF0aWxlIGltbWFwX3QgKilDRkdfSU1NUjsKKwl2b2xhdGlsZSBjbGs4M3h4X3QgKmNsayA9ICh2b2xhdGlsZSBjbGs4M3h4X3QgKikmaW1tci0+Y2xrOworCXZvbGF0aWxlIGxhdzgzeHhfdCAqcGNpX2xhdyA9IGltbXItPnN5c2NvbmYucGNpbGF3OworCXN0cnVjdCBwY2lfcmVnaW9uICpyZWdbXSA9IHsgcGNpX3JlZ2lvbnMgfTsKKworCS8qIEVuYWJsZSBhbGwgMyBQQ0lfQ0xLX09VVFBVVHMuICovCisJY2xrLT5vY2NyIHw9IDB4ZTAwMDAwMDA7CisKKwkvKiBDb25maWd1cmUgUENJIExvY2FsIEFjY2VzcyBXaW5kb3dzICovCisJcGNpX2xhd1swXS5iYXIgPSBDRkdfUENJMV9NRU1fUEhZUyAmIExBV0JBUl9CQVI7CisJcGNpX2xhd1swXS5hciA9IExCTEFXQVJfRU4gfCBMQkxBV0FSXzUxMk1COworCisJcGNpX2xhd1sxXS5iYXIgPSBDRkdfUENJMV9JT19QSFlTICYgTEFXQkFSX0JBUjsKKwlwY2lfbGF3WzFdLmFyID0gTEJMQVdBUl9FTiB8IExCTEFXQVJfMU1COworCisJbXBjODN4eF9wY2lfaW5pdCgxLCByZWcsIDApOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCisKKy8qCisgKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZS4KKyAqLwordm9pZCBmdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpOworCisjaWZkZWYgQ09ORklHX1BDSQordm9pZCBmdF9wY2lfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpOworI2VuZGlmCisKK3ZvaWQKK2Z0X2JvYXJkX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCWludCBub2Rlb2Zmc2V0OworCWludCB0bXBbMl07CisKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKGJsb2IsICIvbWVtb3J5Iik7CisJaWYgKG5vZGVvZmZzZXQgPj0gMCkgeworCQl0bXBbMF0gPSBjcHVfdG9fYmUzMihiZC0+YmlfbWVtc3RhcnQpOworCQl0bXBbMV0gPSBjcHVfdG9fYmUzMihiZC0+YmlfbWVtc2l6ZSk7CisJCWZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJyZWciLCB0bXAsIHNpemVvZih0bXApKTsKKwl9CisKKwlmdF9jcHVfc2V0dXAoYmxvYiwgYmQpOworCisjaWZkZWYgQ09ORklHX1BDSQorCWZ0X3BjaV9zZXR1cChibG9iLCBiZCk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBDT05GSUdfT0ZfQk9BUkRfU0VUVVAgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvTWFrZWZpbGUgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL01ha2VmaWxlCmluZGV4IGJlYzIxNjguLjMwOGY3MDcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvTWFrZWZpbGUKKysrIGIvYm9hcmQvZnJlZXNjYWxlL21wYzg1NDRkcy9NYWtlZmlsZQpAQCAtMjQsOSArMjQsOSBAQAogCiBpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKIAotIyBpZm5lcSAoJChPQkpUUkVFKSwkKFNSQ1RSRUUpKQotIyAkKHNoZWxsIG1rZGlyIC1wICQob2JqKS4vY29tbW9uKQotIyBlbmRpZgoraWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKKyQoc2hlbGwgbWtkaXIgLXAgJChvYmopLi4vY29tbW9uKQorZW5kaWYKIAogTElCCT0gJChvYmopbGliJChCT0FSRCkuYQogCmRpZmYgLS1naXQgYS9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL2luaXQuUyBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvaW5pdC5TCmluZGV4IDI5NmZlZTUuLmVhN2Q1NGQgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvaW5pdC5TCisrKyBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvaW5pdC5TCkBAIC01Miw4ICs1Miw4IEBACiAgKi8KIAogI2RlZmluZQllbnRyeV9zdGFydCBcCi0JbWZscglyMSAJOwlcCi0JYmwJMGYgCTsKKwltZmxyCXIxCTsJXAorCWJsCTBmCTsKIAogI2RlZmluZQllbnRyeV9lbmQgXAogMDoJbWZscglyMAk7CVwKQEAgLTIxNCw3ICsyMTQsNyBAQAogCS5sb25nCTAKIAkubG9uZwkoTEFXQVJfVFJHVF9ERFIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMTI4TSkpICYgfkxBV0FSX0VOCiAKLQkubG9uZwkoQ0ZHX1BDSTFfTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYKKwkubG9uZwkoQ0ZHX1BDSTFfTUVNX1BIWVM+PjEyKSAmIDB4ZmZmZmYKIAkubG9uZwlMQVdBUl9FTiB8IExBV0FSX1RSR1RfUENJMSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKQogCiAJLmxvbmcJKENGR19QQ0kxX0lPX1BIWVM+PjEyKSAmIDB4ZmZmZmYKZGlmZiAtLWdpdCBhL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvbXBjODU0NGRzLmMgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL21wYzg1NDRkcy5jCmluZGV4IDRmZjFkYTkuLjhkZGJiMDEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvbXBjODU0NGRzLmMKKysrIGIvYm9hcmQvZnJlZXNjYWxlL21wYzg1NDRkcy9tcGM4NTQ0ZHMuYwpAQCAtMjIsOCArMjIsMTAgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwY2kuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2ltbWFwXzg1eHguaD4KKyNpbmNsdWRlIDxhc20vaW1tYXBfZnNsX3BjaS5oPgogI2luY2x1ZGUgPHNwZC5oPgogI2luY2x1ZGUgPG1paXBoeS5oPgogCkBAIC01MSwxMiArNTMsMTkgQEAKIHsKIAl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19DQ1NSQkFSOwogCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICZpbW1hcC0+aW1fZ3VyOworCXZvbGF0aWxlIGNjc3JfbGJjX3QgKmxiYyA9ICZpbW1hcC0+aW1fbGJjOworCXZvbGF0aWxlIGNjc3JfbG9jYWxfZWNtX3QgKmVjbSA9ICZpbW1hcC0+aW1fbG9jYWxfZWNtOwogCiAJaWYgKCh1aW50KSZndXItPnBvcnBsbHNyICE9IDB4ZTAwZTAwMDApIHsKIAkJcHJpbnRmKCJpbW1hcCBzaXplIGVycm9yICV4XG4iLCZndXItPnBvcnBsbHNyKTsKIAl9CiAJcHJpbnRmICgiQm9hcmQ6IE1QQzg1NDREU1xuIik7CiAKKwlsYmMtPmx0ZXNyID0gMHhmZmZmZmZmZjsJLyogQ2xlYXIgTEJDIGVycm9yIGludGVycnVwdHMgKi8KKwlsYmMtPmx0ZWlyID0gMHhmZmZmZmZmZjsJLyogRW5hYmxlIExCQyBlcnJvciBpbnRlcnJ1cHRzICovCisJZWNtLT5lZWRyID0gMHhmZmZmZmZmZjsJCS8qIENsZWFyIGVjbSBlcnJvcnMgKi8KKwllY20tPmVlZXIgPSAweGZmZmZmZmZmOwkJLyogRW5hYmxlIGVjbSBlcnJvcnMgKi8KKwogCXJldHVybiAwOwogfQogCkBAIC0xMTgsNiArMTI3LDMxNiBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUENJMQorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kxX2hvc2U7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0lFMQorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2llMV9ob3NlOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJRTIKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpZTJfaG9zZTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSUUzCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaWUzX2hvc2U7CisjZW5kaWYKKworaW50IGZpcnN0X2ZyZWVfYnVzbm89MDsKKwordm9pZAorcGNpX2luaXRfYm9hcmQodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgY2Nzcl9ndXJfdCAqZ3VyID0gJmltbWFwLT5pbV9ndXI7CisJdWludCBkZXZkaXNyID0gZ3VyLT5kZXZkaXNyOworCXVpbnQgaW9fc2VsID0gKGd1ci0+cG9yZGV2c3IgJiBNUEM4NXh4X1BPUkRFVlNSX0lPX1NFTCkgPj4gMTk7CisJdWludCBob3N0X2FnZW50ID0gKGd1ci0+cG9yYm1zciAmIE1QQzg1eHhfUE9SQk1TUl9IQSkgPj4gMTY7CisKKwlkZWJ1ZyAoIiAgIHBjaV9pbml0X2JvYXJkOiBkZXZkaXNyPSV4LCBpb19zZWw9JXgsIGhvc3RfYWdlbnQ9JXhcbiIsCisJCWRldmRpc3IsIGlvX3NlbCwgaG9zdF9hZ2VudCk7CisKKwlpZiAoaW9fc2VsICYgMSkgeworCQlpZiAoIShndXItPnBvcmRldnNyICYgTVBDODV4eF9QT1JERVZTUl9TR01JSTFfRElTKSkKKwkJCXByaW50ZiAoIiAgICBlVFNFQzEgaXMgaW4gc2dtaWkgbW9kZS5cbiIpOworCQlpZiAoIShndXItPnBvcmRldnNyICYgTVBDODV4eF9QT1JERVZTUl9TR01JSTNfRElTKSkKKwkJCXByaW50ZiAoIiAgICBlVFNFQzMgaXMgaW4gc2dtaWkgbW9kZS5cbiIpOworCX0KKworI2lmZGVmIENPTkZJR19QQ0lFMworeworCXZvbGF0aWxlIGNjc3JfZnNsX3BjaV90ICpwY2kgPSAoY2Nzcl9mc2xfcGNpX3QgKikgQ0ZHX1BDSUUzX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaWUzX2hvc2U7CisJaW50IHBjaWVfZXAgPSAoaG9zdF9hZ2VudCA9PSAzKTsKKwlpbnQgcGNpZV9jb25maWd1cmVkICA9IGlvX3NlbCA+PSAxOworCisJaWYgKHBjaWVfY29uZmlndXJlZCAmJiAhKGRldmRpc3IgJiBNUEM4NXh4X0RFVkRJU1JfUENJRSkpeworCQlwcmludGYgKCJcbiAgICBQQ0lFMyBjb25uZWN0ZWQgdG8gVUxJIGFzICVzIChiYXNlIGFkZHJlc3MgJXgpIiwKKwkJCXBjaWVfZXAgPyAiRW5kIFBvaW50IiA6ICJSb290IENvbXBsZXgiLAorCQkJKHVpbnQpcGNpKTsKKwkJaWYgKHBjaS0+cG1lX21zZ19kZXQpIHsKKwkJCXBjaS0+cG1lX21zZ19kZXQgPSAweGZmZmZmZmZmOworCQkJZGVidWcgKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLHBjaS0+cG1lX21zZ19kZXQpOworCQl9CisJCXByaW50ZiAoIlxuIik7CisKKwkJLyogaW5ib3VuZCAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfUEhZUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJCSAgICAgICBDRkdfUENJRTNfTUVNX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSUUzX01FTV9QSFlTLAorCQkJICAgICAgIENGR19QQ0lFM19NRU1fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkJLyogb3V0Ym91bmQgaW8gKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCQkgICAgICAgQ0ZHX1BDSUUzX0lPX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSUUzX0lPX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSUUzX0lPX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKyNpZmRlZiBDRkdfUENJRTNfTUVNX0JBU0UyCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKKwkJCSAgICAgICBDRkdfUENJRTNfTUVNX0JBU0UyLAorCQkJICAgICAgIENGR19QQ0lFM19NRU1fUEhZUzIsCisJCQkgICAgICAgQ0ZHX1BDSUUzX01FTV9TSVpFMiwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisJCWhvc2UtPnJlZ2lvbl9jb3VudCsrOworI2VuZGlmCisJCWhvc2UtPmZpcnN0X2J1c25vPWZpcnN0X2ZyZWVfYnVzbm87CisJCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJCWZzbF9wY2lfaW5pdChob3NlKTsKKworCQlmaXJzdF9mcmVlX2J1c25vPWhvc2UtPmxhc3RfYnVzbm8rMTsKKwkJcHJpbnRmICgiICAgIFBDSUUzIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJCWhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCisJfSBlbHNlIHsKKwkJcHJpbnRmICgiICAgIFBDSUUzOiBkaXNhYmxlZFxuIik7CisJfQorCisgfQorI2Vsc2UKKwlndXItPmRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1BDSUUzOyAvKiBkaXNhYmxlICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0lFMQorIHsKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0lFMV9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2llMV9ob3NlOworCWludCBwY2llX2VwID0gKGhvc3RfYWdlbnQgPT0gNSk7CisJaW50IHBjaWVfY29uZmlndXJlZCAgPSBpb19zZWwgJiA2OworCisJaWYgKHBjaWVfY29uZmlndXJlZCAmJiAhKGRldmRpc3IgJiBNUEM4NXh4X0RFVkRJU1JfUENJRSkpeworCQlwcmludGYgKCJcbiAgICBQQ0lFMSBjb25uZWN0ZWQgdG8gU2xvdDIgYXMgJXMgKGJhc2UgYWRkcmVzcyAleCkiLAorCQkJcGNpZV9lcCA/ICJFbmQgUG9pbnQiIDogIlJvb3QgQ29tcGxleCIsCisJCQkodWludClwY2kpOworCQlpZiAocGNpLT5wbWVfbXNnX2RldCkgeworCQkJcGNpLT5wbWVfbXNnX2RldCA9IDB4ZmZmZmZmZmY7CisJCQlkZWJ1ZyAoIiB3aXRoIGVycm9ycy4gIENsZWFyaW5nLiAgTm93IDB4JTA4eCIscGNpLT5wbWVfbXNnX2RldCk7CisJCX0KKwkJcHJpbnRmICgiXG4iKTsKKworCQkvKiBpbmJvdW5kICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9QSFlTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkJICAgICAgIENGR19QQ0lFMV9NRU1fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJRTFfTUVNX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSUUxX01FTV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCQkvKiBvdXRib3VuZCBpbyAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwKKwkJCSAgICAgICBDRkdfUENJRTFfSU9fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJRTFfSU9fUEhZUywKKwkJCSAgICAgICBDRkdfUENJRTFfSU9fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCQlob3NlLT5yZWdpb25fY291bnQgPSAzOworI2lmZGVmIENGR19QQ0lFMV9NRU1fQkFTRTIKKwkJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAzLAorCQkJICAgICAgIENGR19QQ0lFMV9NRU1fQkFTRTIsCisJCQkgICAgICAgQ0ZHX1BDSUUxX01FTV9QSFlTMiwKKwkJCSAgICAgICBDRkdfUENJRTFfTUVNX1NJWkUyLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKwkJaG9zZS0+cmVnaW9uX2NvdW50Kys7CisjZW5kaWYKKwkJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKworCQlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKGludCkgJnBjaS0+Y2ZnX2FkZHIsIChpbnQpICZwY2ktPmNmZ19kYXRhKTsKKworCQlmc2xfcGNpX2luaXQoaG9zZSk7CisKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZigiICAgIFBDSUUxIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJICAgICAgIGhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCisJfSBlbHNlIHsKKwkJcHJpbnRmICgiICAgIFBDSUUxOiBkaXNhYmxlZFxuIik7CisJfQorCisgfQorI2Vsc2UKKwlndXItPmRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1BDSUU7IC8qIGRpc2FibGUgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSUUyCisgeworCXZvbGF0aWxlIGNjc3JfZnNsX3BjaV90ICpwY2kgPSAoY2Nzcl9mc2xfcGNpX3QgKikgQ0ZHX1BDSUUyX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaWUyX2hvc2U7CisJaW50IHBjaWVfZXAgPSAoaG9zdF9hZ2VudCA9PSAzKTsKKwlpbnQgcGNpZV9jb25maWd1cmVkICA9IGlvX3NlbCAmIDQ7CisKKwlpZiAocGNpZV9jb25maWd1cmVkICYmICEoZGV2ZGlzciAmIE1QQzg1eHhfREVWRElTUl9QQ0lFKSl7CisJCXByaW50ZiAoIlxuICAgIFBDSUUyIGNvbm5lY3RlZCB0byBTbG90IDEgYXMgJXMgKGJhc2UgYWRkcmVzcyAleCkiLAorCQkJcGNpZV9lcCA/ICJFbmQgUG9pbnQiIDogIlJvb3QgQ29tcGxleCIsCisJCQkodWludClwY2kpOworCQlpZiAocGNpLT5wbWVfbXNnX2RldCkgeworCQkJcGNpLT5wbWVfbXNnX2RldCA9IDB4ZmZmZmZmZmY7CisJCQlkZWJ1ZyAoIiB3aXRoIGVycm9ycy4gIENsZWFyaW5nLiAgTm93IDB4JTA4eCIscGNpLT5wbWVfbXNnX2RldCk7CisJCX0KKwkJcHJpbnRmICgiXG4iKTsKKworCQkvKiBpbmJvdW5kICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9QSFlTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkJICAgICAgIENGR19QQ0lFMl9NRU1fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJRTJfTUVNX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSUUyX01FTV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCQkvKiBvdXRib3VuZCBpbyAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwKKwkJCSAgICAgICBDRkdfUENJRTJfSU9fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJRTJfSU9fUEhZUywKKwkJCSAgICAgICBDRkdfUENJRTJfSU9fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCQlob3NlLT5yZWdpb25fY291bnQgPSAzOworI2lmZGVmIENGR19QQ0lFMl9NRU1fQkFTRTIKKwkJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAzLAorCQkJICAgICAgIENGR19QQ0lFMl9NRU1fQkFTRTIsCisJCQkgICAgICAgQ0ZHX1BDSUUyX01FTV9QSFlTMiwKKwkJCSAgICAgICBDRkdfUENJRTJfTUVNX1NJWkUyLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKwkJaG9zZS0+cmVnaW9uX2NvdW50Kys7CisjZW5kaWYKKwkJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKwkJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsIChpbnQpICZwY2ktPmNmZ19hZGRyLCAoaW50KSAmcGNpLT5jZmdfZGF0YSk7CisKKwkJZnNsX3BjaV9pbml0KGhvc2UpOworCQlmaXJzdF9mcmVlX2J1c25vPWhvc2UtPmxhc3RfYnVzbm8rMTsKKwkJcHJpbnRmICgiICAgIFBDSUUyIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJCWhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCisJfSBlbHNlIHsKKwkJcHJpbnRmICgiICAgIFBDSUUyOiBkaXNhYmxlZFxuIik7CisJfQorCisgfQorI2Vsc2UKKwlndXItPmRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1BDSUUyOyAvKiBkaXNhYmxlICovCisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX1BDSTEKK3sKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0kxX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaTFfaG9zZTsKKworCXVpbnQgcGNpX2FnZW50ID0gKGhvc3RfYWdlbnQgPT0gNik7CisJdWludCBwY2lfc3BlZWQgPSA2NjY2NjAwMDsgLypnZXRfY2xvY2tfZnJlcSAoKTsgUENJIFBTUEVFRCBpbiBbNDo1XSAqLworCXVpbnQgcGNpXzMyID0gMTsKKwl1aW50IHBjaV9hcmIgPSBndXItPnBvcmRldnNyICYgTVBDODV4eF9QT1JERVZTUl9QQ0kxX0FSQjsJLyogUE9SREVWU1JbMTRdICovCisJdWludCBwY2lfY2xrX3NlbCA9IGd1ci0+cG9ycGxsc3IgJiBNUEM4NXh4X1BPUkRFVlNSX1BDSTFfU1BEOwkvKiBQT1JQTExTUlsxNl0gKi8KKworCisJaWYgKCEoZGV2ZGlzciAmIE1QQzg1eHhfREVWRElTUl9QQ0kxKSkgeworCQlwcmludGYgKCJcbiAgICBQQ0k6ICVkIGJpdCwgJXMgTUh6LCAlcywgJXMsICVzIChiYXNlIGFkZHJlc3MgJXgpXG4iLAorCQkJKHBjaV8zMikgPyAzMiA6IDY0LAorCQkJKHBjaV9zcGVlZCA9PSAzMzMzMzAwMCkgPyAiMzMiIDoKKwkJCShwY2lfc3BlZWQgPT0gNjY2NjYwMDApID8gIjY2IiA6ICJ1bmtub3duIiwKKwkJCXBjaV9jbGtfc2VsID8gInN5bmMiIDogImFzeW5jIiwKKwkJCXBjaV9hZ2VudCA/ICJhZ2VudCIgOiAiaG9zdCIsCisJCQlwY2lfYXJiID8gImFyYml0ZXIiIDogImV4dGVybmFsLWFyYml0ZXIiLAorCQkJKHVpbnQpcGNpCisJCQkpOworCisJCS8qIGluYm91bmQgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfQlVTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fTUVNT1JZKTsKKworCQkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJCS8qIG91dGJvdW5kIGlvICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkJICAgICAgIENGR19QQ0kxX0lPX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9JT19TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCQlob3NlLT5yZWdpb25fY291bnQgPSAzOworI2lmZGVmIENGR19QQ0lFM19NRU1fQkFTRTIKKwkJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAzLAorCQkJICAgICAgIENGR19QQ0lFM19NRU1fQkFTRTIsCisJCQkgICAgICAgQ0ZHX1BDSUUzX01FTV9QSFlTMiwKKwkJCSAgICAgICBDRkdfUENJRTNfTUVNX1NJWkUyLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKwkJaG9zZS0+cmVnaW9uX2NvdW50Kys7CisjZW5kaWYKKwkJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKwkJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsIChpbnQpICZwY2ktPmNmZ19hZGRyLCAoaW50KSAmcGNpLT5jZmdfZGF0YSk7CisKKwkJZnNsX3BjaV9pbml0KGhvc2UpOworCQlmaXJzdF9mcmVlX2J1c25vPWhvc2UtPmxhc3RfYnVzbm8rMTsKKwkJcHJpbnRmICgiUENJIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJCWhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgICBQQ0k6IGRpc2FibGVkXG4iKTsKKwl9Cit9CisjZWxzZQorCWd1ci0+ZGV2ZGlzciB8PSBNUEM4NXh4X0RFVkRJU1JfUENJMTsgLyogZGlzYWJsZSAqLworI2VuZGlmCit9CisKKwogaW50IGxhc3Rfc3RhZ2VfaW5pdCh2b2lkKQogewogCXJldHVybiAwOwpAQCAtMTk3LDUgKzUxNiwzNiBAQAogCQkqcCsrID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXN0YXJ0KTsKIAkJKnAgPSBjcHVfdG9fYmUzMihiZC0+YmlfbWVtc2l6ZSk7CiAJfQorI2lmZGVmIENPTkZJR19QQ0lFMQorCXAgPSAodTMyICopZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUBhMDAwL2J1cy1yYW5nZSIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKKwkJcFswXSA9IDA7CisJCXBbMV0gPSBwY2llMV9ob3NlLmxhc3RfYnVzbm8gLSBwY2llMV9ob3NlLmZpcnN0X2J1c25vOworCQlkZWJ1ZygiUENJQGEwMDAgZmlyc3RfYnVzbm89JWQgbGFzdF9idXNubz0lZFxuIixwWzBdLHBbMV0pOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lFMgorCXAgPSAodTMyICopZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUA5MDAwL2J1cy1yYW5nZSIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKKwkJcFswXSA9IDA7CisJCXBbMV0gPSBwY2llMl9ob3NlLmxhc3RfYnVzbm8gLSBwY2llMl9ob3NlLmZpcnN0X2J1c25vOworCQlkZWJ1ZygiUENJQDkwMDAgZmlyc3RfYnVzbm89JWQgbGFzdF9idXNubz0lZFxuIixwWzBdLHBbMV0pOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lFMworCXAgPSAodTMyICopZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUBiMDAwL2J1cy1yYW5nZSIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKKwkJcFswXSA9IDA7CisJCXBbMV0gPSBwY2llM19ob3NlLmxhc3RfYnVzbm8gLSBwY2llM19ob3NlLmZpcnN0X2J1c25vOzsKKwkJZGVidWcoIlBDSUBiMDAwIGZpcnN0X2J1c25vPSVkIGxhc3RfYnVzbm89JWRcbiIscFswXSxwWzFdKTsKKwl9CisjZW5kaWYKKwlmdF9jcHVfc2V0dXAoYmxvYiwgYmQpOworCisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvbWVtb3J5L3JlZyIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKKwkJKnArKyA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zdGFydCk7CisJCSpwID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXNpemUpOworCX0KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvbTg4ZTYwNjAuYyBiL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L204OGU2MDYwLmMKaW5kZXggMDNhMDNkMC4uNThiNWI2ZSAxMDA2NDQKLS0tIGEvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvbTg4ZTYwNjAuYworKysgYi9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy9tODhlNjA2MC5jCkBAIC0zMSw3ICszMSw3IEBACiAKICNpbmNsdWRlICJtODhlNjA2MC5oIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiBzdGF0aWMgaW50CQlwcnRUYWJbTTg4WF9QUlRfQ05UXSA9IHsgOCwgOSwgMTAsIDExLCAxMiwgMTMgfTsKIHN0YXRpYyBpbnQJCXBoeVRhYltNODhYX1BIWV9DTlRdID0geyAwLCAxLCAyLCAzLCA0IH07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L3UtYm9vdC5sZHMgYi9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjgwNDhkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L3ZvdnBuLWd3LmMgYi9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy92b3Zwbi1ndy5jCmluZGV4IDk3ZjgxZWUuLjliNTQyOWEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L3ZvdnBuLWd3LmMKKysrIGIvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvdm92cG4tZ3cuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiB2b2lkIHJlc2V0X3BoeSAodm9pZCkKIHsKIAl2b2xhdGlsZSBpb3BvcnRfdCAqaW9wOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCWludCBpOwogCXVuc2lnbmVkIHNob3J0IHZhbDsKICNlbmRpZgpAQCAtMTkzLDcgKzE5Myw3IEBACiAKIAkvKiBSZXNldCB0aGUgUEhZICovCiAJaW9wLT5wZGF0ICY9IDB4ZmZmN2ZmZmY7CS8qIFBBMTIgPSB8U1dJVENIX1JFU0VUICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJdWRlbGF5KDIwMDAwKTsKIAlpb3AtPnBkYXQgfD0gMHgwMDA4MDAwMDsKIAlmb3IgKGk9MDsgaTwxMDA7IGkrKykgewpkaWZmIC0tZ2l0IGEvYm9hcmQvZzIwMDAvZzIwMDAuYyBiL2JvYXJkL2cyMDAwL2cyMDAwLmMKaW5kZXggMzliNWM3MDEuLjJkZmQ4N2MgMTAwNjQ0Ci0tLSBhL2JvYXJkL2cyMDAwL2cyMDAwLmMKKysrIGIvYm9hcmQvZzIwMDAvZzIwMDAuYwpAQCAtNzMsNyArNzMsNyBAQAogCiBpbnQgbWlzY19pbml0X3IgKHZvaWQpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAkvKgogCSAqIFNldCBOQU5ELUZMQVNIIEdQSU8gc2lnbmFscyB0byBkZWZhdWx0CiAJICovCkBAIC0xODQsNyArMTg0LDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2dlbjg2MHQvZ2VuODYwdC5jIGIvYm9hcmQvZ2VuODYwdC9nZW44NjB0LmMKaW5kZXggZWI3MzIyMS4uZDQ0OGY5ZiAxMDA2NDQKLS0tIGEvYm9hcmQvZ2VuODYwdC9nZW44NjB0LmMKKysrIGIvYm9hcmQvZ2VuODYwdC9nZW44NjB0LmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxzdGF0dXNfbGVkLmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ0ZHX0NNRF9NSUkpICYmIGRlZmluZWQoQ09ORklHX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKSAmJiBkZWZpbmVkKENPTkZJR19NSUkpCiAjaW5jbHVkZSA8bmV0Lmg+CiAjZW5kaWYKIApAQCAtMjIyLDcgKzIyMiw3IEBACiAgKiBEaXNrIE9uIENoaXAgKERPQykgTWlsbGVuaXVtIGluaXRpYWxpemF0aW9uLgogICogVGhlIERPQyBsaXZlcyBpbiB0aGUgQ1MyKiBzcGFjZQogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiBleHRlcm4gdm9pZCBkb2NfcHJvYmUgKHVsb25nIHBoeXNhZHIpOwogCiB2b2lkIGRvY19pbml0ICh2b2lkKQpAQCAtMjUwLDcgKzI1MCw3IEBACiAKIAljb25maWdfbXBjOHh4X2lvcG9ydHMgKGltbXIpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJbWlpX2luaXQgKCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYm9hcmQvZ2VuaWV0di9nZW5pZXR2LmMgYi9ib2FyZC9nZW5pZXR2L2dlbmlldHYuYwppbmRleCA1ZjhjODk5Li5jNzU1MDdmIDEwMDY0NAotLS0gYS9ib2FyZC9nZW5pZXR2L2dlbmlldHYuYworKysgYi9ib2FyZC9nZW5pZXR2L2dlbmlldHYuYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJcmV0dXJuIChzaXplKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogCiAjaWZkZWYJQ0ZHX1BDTUNJQV9NRU1fQUREUgogdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcGNtY2lhX21lbSA9ICh1bnNpZ25lZCBjaGFyICopIENGR19QQ01DSUFfTUVNX0FERFI7CkBAIC0zNTcsNCArMzU3LDQgQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2d0aC9wY21jaWEuYyBiL2JvYXJkL2d0aC9wY21jaWEuYwppbmRleCBmY2U1NDkyLi5jZmZjYmRlIDEwMDY0NAotLS0gYS9ib2FyZC9ndGgvcGNtY2lhLmMKKysrIGIvYm9hcmQvZ3RoL3BjbWNpYS5jCkBAIC00LDExICs0LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtODMsNyArODMsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJcmV0dXJuIDA7CS8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2d3ODI2MC91LWJvb3QubGRzIGIvYm9hcmQvZ3c4MjYwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjVjYjEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZ3c4MjYwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2hlcm1lcy9oZXJtZXMuYyBiL2JvYXJkL2hlcm1lcy9oZXJtZXMuYwppbmRleCBhNTIzZGIxLi44ZmQwODFmIDEwMDY0NAotLS0gYS9ib2FyZC9oZXJtZXMvaGVybWVzLmMKKysrIGIvYm9hcmQvaGVybWVzL2hlcm1lcy5jCkBAIC01OTcsNiArNTk3LDcgQEAKIHsKIAl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CiAKKwlpZiAoc3RhdHVzIDwgLTMyKSBzdGF0dXMgPSAtMTsJLyogbGV0IHRoaW5ncyBjb21wYXRpYmxlICovCiAJc3RhdHVzIF49IDB4MEY7CiAJc3RhdHVzID0gKHN0YXR1cyAmIDB4MEYpIDw8IDE0OwogCWltbXItPmltX2NwbS5jcF9wYmRhdCA9IChpbW1yLT5pbV9jcG0uY3BfcGJkYXQgJiB+UEJfTEVEX0FMTCkgfCBzdGF0dXM7CmRpZmYgLS1naXQgYS9ib2FyZC9oaWRkZW5fZHJhZ29uL3UtYm9vdC5sZHMgYi9ib2FyZC9oaWRkZW5fZHJhZ29uL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWNkMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaGlkZGVuX2RyYWdvbi91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9obWkxMDAxL2NvbmZpZy5tayBiL2JvYXJkL2htaTEwMDEvY29uZmlnLm1rCmluZGV4IDUxZThlODRjLi40ZmUxODMxIDEwMDY0NAotLS0gYS9ib2FyZC9obWkxMDAxL2NvbmZpZy5taworKysgYi9ib2FyZC9obWkxMDAxL2NvbmZpZy5tawpAQCAtMzksMyArMzksNCBAQAogZW5kaWYKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpL2JvYXJkCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9obWkxMDAxL3UtYm9vdC5sZHMgYi9ib2FyZC9obWkxMDAxL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2ExNGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaG1pMTAwMS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4gICovCi0gICAgLyogdGhlIHNlY3RvciBsYXlvdXQgb2Ygb3VyIGZsYXNoIGNoaXBzISAgICBYWFggRklYTUUgWFhYICAgKi8KLQotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8gICAgICAgICAgKC50ZXh0KQotICAgIGNwdS9tcGM1eHh4L3RyYXBzLm8gICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8gICAgICAgICAoLnRleHQpCi0gICAgbGliX3BwYy9jYWNoZS5vICAgICAgICAgICAgICgudGV4dCkKLSAgICBsaWJfcHBjL3RpbWUubyAgICAgICAgICAgICAgKC50ZXh0KQotCi0gICAgLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAgICAgICAgKC5wcGNlbnYpCi0KLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9oeW1vZC9ic3AuYyBiL2JvYXJkL2h5bW9kL2JzcC5jCmluZGV4IDY4NjhmMjYuLjEyZjE0MDIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL2JzcC5jCisrKyBiL2JvYXJkL2h5bW9kL2JzcC5jCkBAIC0zNCw3ICszNCw3IEBACiAgKiBCb2FyZCBTcGVjaWFsIENvbW1hbmRzOiBGUEdBIGxvYWQvc3RvcmUsIEVFUFJPTSBlcmFzZQogICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogI2RlZmluZSBMT0FEX1NVQ0NFU1MJCTAKICNkZWZpbmUgTE9BRF9GQUlMX05PQ09ORgkxCkBAIC00MDIsNiArNDAyLDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfQlNQICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvaHltb2QvY29uZmlnLm1rIGIvYm9hcmQvaHltb2QvY29uZmlnLm1rCmluZGV4IDBhOTk4NWYuLjJkZjMyMWYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL2NvbmZpZy5taworKysgYi9ib2FyZC9oeW1vZC9jb25maWcubWsKQEAgLTMwLDMgKzMwLDUgQEAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1JJChUT1BESVIpCiAKIE9CSkNGTEFHUyA9IC0tcmVtb3ZlLXNlY3Rpb249LnBwY2VudgorCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMgYi9ib2FyZC9oeW1vZC91LWJvb3QubGRzCmluZGV4IDMzN2EzOTUuLjliZjBmMDkgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMKKysrIGIvYm9hcmQvaHltb2QvdS1ib290LmxkcwpAQCAtNjksNyArNjksNiBAQAogICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQogCiAgICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKICAgICAqKC5nb3QxKQogICB9CiAgIF9ldGV4dCA9IC47CmRpZmYgLS1naXQgYS9ib2FyZC9pY2VjdWJlL2ljZWN1YmUuYyBiL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCmluZGV4IDI5NjA5OTguLmMwMjdmNmYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCisrKyBiL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCkBAIC0zNTksNyArMzU5LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiB2b2lkIGluaXRfaWRlX3Jlc2V0ICh2b2lkKQogewpAQCAtMzg0LDcgKzM4NCw3IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9ICBHUElPX1BTQzFfNDsKIAl9CiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCiB2b2lkCmRpZmYgLS1naXQgYS9ib2FyZC9pY2VjdWJlL3UtYm9vdC5sZHMgYi9ib2FyZC9pY2VjdWJlL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzQzMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaWNlY3ViZS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9pY3U4NjIvcGNtY2lhLmMgYi9ib2FyZC9pY3U4NjIvcGNtY2lhLmMKaW5kZXggMjBmNjUzYi4uMTFkZTE4MyAxMDA2NDQKLS0tIGEvYm9hcmQvaWN1ODYyL3BjbWNpYS5jCisrKyBiL2JvYXJkL2ljdTg2Mi9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL2lkczgyNDcvaWRzODI0Ny5jIGIvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKaW5kZXggN2I5YTgzZC4uMTk4MjNhNCAxMDA2NDQKLS0tIGEvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKKysrIGIvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKQEAgLTMwMCw3ICszMDAsNyBAQAogCWdkLT5iZC0+YmlfZmxhc2hzdGFydCA9IDB4ZmY4MDAwMDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogZXh0ZXJuIHVsb25nCiBuYW5kX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIApAQCAtMzE1LDQgKzMxNSw0IEBACiAJcHJpbnRmICgiJTRsdSBNQlxuIiwgdG90bGVuID4+MjApOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2lkczgyNDcvdS1ib290LmxkcyBiL2JvYXJkL2lkczgyNDcvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4YWVkMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9pZHM4MjQ3L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogSGVpa28gU2Nob2NoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxoc0BkZW54LmRlPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvaW5rYTR4MC9jb25maWcubWsgYi9ib2FyZC9pbmthNHgwL2NvbmZpZy5tawppbmRleCBjYjE5YTdkLi5mYzcwZWZlIDEwMDY0NAotLS0gYS9ib2FyZC9pbmthNHgwL2NvbmZpZy5taworKysgYi9ib2FyZC9pbmthNHgwL2NvbmZpZy5tawpAQCAtMzksMyArMzksNCBAQAogZW5kaWYKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpL2JvYXJkCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9pbmthNHgwL2lua2E0eDAuYyBiL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCmluZGV4IGQ2NzBjYzMuLjQ3OGEzMzEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCisrKyBiL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiB2b2lkIGluaXRfaWRlX3Jlc2V0ICh2b2lkKQogewpAQCAtMjYxLDQgKzI2MSw0IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9ICBHUElPX1BTQzFfNDsKIAl9CiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2lua2E0eDAvdS1ib290LmxkcyBiL2JvYXJkL2lua2E0eDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzYTE0Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9pbmthNHgwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbiAgKi8KLSAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhICAgIFhYWCBGSVhNRSBYWFggICAqLwotCi0gICAgY3B1L21wYzV4eHgvc3RhcnQubyAgICAgICAgICAoLnRleHQpCi0gICAgY3B1L21wYzV4eHgvdHJhcHMubyAgICAgICAgICAoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubyAgICAgICAgICgudGV4dCkKLSAgICBsaWJfcHBjL2NhY2hlLm8gICAgICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9wcGMvdGltZS5vICAgICAgICAgICAgICAoLnRleHQpCi0KLSAgICAuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICAgICAgICAoLnBwY2VudikKLQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2lwaGFzZTQ1MzkvdS1ib290LmxkcyBiL2JvYXJkL2lwaGFzZTQ1MzkvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhMDFlYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9pcGhhc2U0NTM5L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2lzcGFuL3UtYm9vdC5sZHMgYi9ib2FyZC9pc3Bhbi91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjgwNDhkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2lzcGFuL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL2l4ZHA0MjUvaXhkcDQyNS5jIGIvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKaW5kZXggZWFmN2NkZS4uMmEzM2Q2ZCAxMDA2NDQKLS0tIGEvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKKysrIGIvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ0kpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENJKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpCiBleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2U7CiBleHRlcm4gdm9pZCBwY2lfaXhwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICogaG9zZSk7CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2p1cGl0ZXIvanVwaXRlci5jIGIvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKaW5kZXggMDRmZGE0YS4uYjIyNzQ4NyAxMDA2NDQKLS0tIGEvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKKysrIGIvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCiB7CkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJKih2dV9sb25nICopIE1QQzVYWFhfV1VfR1BJT19EQVRBX08gfD0gIEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSAmJiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKIHZvaWQKZGlmZiAtLWdpdCBhL2JvYXJkL2p1cGl0ZXIvdS1ib290LmxkcyBiL2JvYXJkL2p1cGl0ZXIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNDMyZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9qdXBpdGVyL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2tiOTIwMi9rYjkyMDIuYyBiL2JvYXJkL2tiOTIwMi9rYjkyMDIuYwppbmRleCBlYzUxZGNhLi41OWVkOGZmIDEwMDY0NAotLS0gYS9ib2FyZC9rYjkyMDIva2I5MjAyLmMKKysrIGIvYm9hcmQva2I5MjAyL2tiOTIwMi5jCkBAIC02NSw3ICs2NSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfRFJJVkVSX0VUSEVSCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIHVuc2lnbmVkIGludCBseHQ5NzJfSXNQaHlDb25uZWN0ZWQgKEFUOTFQU19FTUFDIHBfbWFjKTsKIFVDSEFSIGx4dDk3Ml9HZXRMaW5rU3BlZWQgKEFUOTFQU19FTUFDIHBfbWFjKTsKQEAgLTkwLDUgKzkwLDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZSA9IGx4dDk3Ml9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2t1cC9jb21tb24vcGNtY2lhLmMgYi9ib2FyZC9rdXAvY29tbW9uL3BjbWNpYS5jCmluZGV4IDFmNjFhMGUuLmRlZjM4ZjEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2t1cC9jb21tb24vcGNtY2lhLmMKKysrIGIvYm9hcmQva3VwL2NvbW1vbi9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTExNSw3ICsxMTUsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL2xvZ29kbC9sb2dvZGwuYyBiL2JvYXJkL2xvZ29kbC9sb2dvZGwuYwppbmRleCAxNGZkMjhmLi44OTc3ODdiIDEwMDY0NAotLS0gYS9ib2FyZC9sb2dvZGwvbG9nb2RsLmMKKysrIGIvYm9hcmQvbG9nb2RsL2xvZ29kbC5jCkBAIC0xMDcsNiArMTA3LDcgQEAKIAogdm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCBzdGF0dXMpCiB7CisJaWYgKHN0YXR1cyA8IC0zMikgc3RhdHVzID0gLTE7ICAvKiBsZXQgdGhpbmdzIGNvbXBhdGlibGUgKi8KIAkvKgogCSAgc3dpdGNoKHN0YXR1cykgewogCSAgY2FzZSAgMTogbG9nb2RsX3NldF9sZWQoMCwxKTsgYnJlYWs7CmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbi9sd21vbi5jIGIvYm9hcmQvbHdtb24vbHdtb24uYwppbmRleCA5ZThlYTJkLi5jNjg5NzhhIDEwMDY0NAotLS0gYS9ib2FyZC9sd21vbi9sd21vbi5jCisrKyBiL2JvYXJkL2x3bW9uL2x3bW9uLmMKQEAgLTc2MSw3ICs3NjEsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLUJvYXJkIFNwZWNpYWwgQ29tbWFuZHM6IFBJQyByZWFkL3dyaXRlIC0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRiogRnVuY3Rpb246ICAgICBpbnQgZG9fcGljIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywKIEYqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgUCpBKloqCkBAIC05NjAsNyArOTYwLDcgQEAKIAkibHNiICAgICAtIHByaW50IGN1cnJlbnQgc2V0dGluZ1xuIgogKTsKIAotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVdGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbi9wY21jaWEuYyBiL2JvYXJkL2x3bW9uL3BjbWNpYS5jCmluZGV4IDIzNDkyODYuLmViY2E3YTIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2x3bW9uL3BjbWNpYS5jCisrKyBiL2JvYXJkL2x3bW9uL3BjbWNpYS5jCkBAIC01LDExICs1LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtMTI3LDcgKzEyNyw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiBpbnQgcGNtY2lhX3ZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbHdtb241L2x3bW9uNS5jIGIvYm9hcmQvbHdtb241L2x3bW9uNS5jCmluZGV4IGQ5MTYyODQuLjgzMGVjMTkgMTAwNjQ0Ci0tLSBhL2JvYXJkL2x3bW9uNS9sd21vbjUuYworKysgYi9ib2FyZC9sd21vbjUvbHdtb241LmMKQEAgLTQ1LDE2ICs0NSwxNiBAQAogCW10ZGNyKHVpYzBzciwgMHhmZmZmZmZmZik7ICAvKiBjbGVhciBhbGwuIGlmIHdyaXRlIHdpdGggMSB0aGVuIHRoZSBzdGF0dXMgaXMgY2xlYXJlZCAgKi8KIAltdGRjcih1aWMwZXIsIDB4MDAwMDAwMDApOyAgLyogZGlzYWJsZSBhbGwgKi8KIAltdGRjcih1aWMwY3IsIDB4MDAwMDAwMDApOyAgLyogd2UgaGF2ZSBub3QgY3JpdGljYWwgaW50ZXJydXB0cyBhdCB0aGUgbW9tZW50ICovCi0JbXRkY3IodWljMHByLCAweGZmZmZmN2ZmKTsgIC8qIEFkanVzdG1lbnQgb2YgdGhlIHBvbGFyaXR5ICovCi0JbXRkY3IodWljMHRyLCAweDAwMDAwODEwKTsgIC8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCisJbXRkY3IodWljMHByLCAweEZGQkZGMUVGKTsgIC8qIEFkanVzdG1lbnQgb2YgdGhlIHBvbGFyaXR5ICovCisJbXRkY3IodWljMHRyLCAweDAwMDAwOTAwKTsgIC8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCiAJbXRkY3IodWljMHZyLCAweDAwMDAwMDAwKTsgIC8qIGludDMxIGhpZ2hlc3QsIGJhc2U9MHgwMDAgaXMgd2l0aGluIEREUkFNICovCiAJbXRkY3IodWljMHNyLCAweGZmZmZmZmZmKTsgIC8qIGNsZWFyIGFsbCAqLwogCiAJbXRkY3IodWljMXNyLCAweGZmZmZmZmZmKTsgIC8qIGNsZWFyIGFsbCAqLwogCW10ZGNyKHVpYzFlciwgMHgwMDAwMDAwMCk7ICAvKiBkaXNhYmxlIGFsbCAqLwogCW10ZGNyKHVpYzFjciwgMHgwMDAwMDAwMCk7ICAvKiBhbGwgbm9uLWNyaXRpY2FsICovCi0JbXRkY3IodWljMXByLCAweEZGRkZDN0FEKTsgIC8qIEFkanVzdG1lbnQgb2YgdGhlIHBvbGFyaXR5ICovCi0JbXRkY3IodWljMXRyLCAweDA2MDAzODRBKTsgIC8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCisJbXRkY3IodWljMXByLCAweEZGRkZDNkE1KTsgIC8qIEFkanVzdG1lbnQgb2YgdGhlIHBvbGFyaXR5ICovCisJbXRkY3IodWljMXRyLCAweDYwMDAwMDQwKTsgIC8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCiAJbXRkY3IodWljMXZyLCAweDAwMDAwMDAwKTsgIC8qIGludDMxIGhpZ2hlc3QsIGJhc2U9MHgwMDAgaXMgd2l0aGluIEREUkFNICovCiAJbXRkY3IodWljMXNyLCAweGZmZmZmZmZmKTsgIC8qIGNsZWFyIGFsbCAqLwogCkBAIC02Miw5ICs2Miw5IEBACiAJbXRkY3IodWljMmVyLCAweDAwMDAwMDAwKTsgIC8qIGRpc2FibGUgYWxsICovCiAJbXRkY3IodWljMmNyLCAweDAwMDAwMDAwKTsgIC8qIGFsbCBub24tY3JpdGljYWwgKi8KIAltdGRjcih1aWMycHIsIDB4MjdDMDAwMDApOyAgLyogQWRqdXN0bWVudCBvZiB0aGUgcG9sYXJpdHkgKi8KLQltdGRjcih1aWMydHIsIDB4REZDMDAwMDApOyAgLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KKwltdGRjcih1aWMydHIsIDB4M0MwMDAwMDApOyAgLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KIAltdGRjcih1aWMydnIsIDB4MDAwMDAwMDApOyAgLyogaW50MzEgaGlnaGVzdCwgYmFzZT0weDAwMCBpcyB3aXRoaW4gRERSQU0gKi8KLQltdGRjcih1aWMyc3IsIDB4ZmZmZmZmZmYpOyAgLyogY2xlYXIgYWxsLiBXaHkgdGhpcz8/PyAqLworCW10ZGNyKHVpYzJzciwgMHhmZmZmZmZmZik7ICAvKiBjbGVhciBhbGwgKi8KIAogCS8qIFRyYWNlIFBpbnMgYXJlIGRpc2FibGVkLiBTRFIwX1BGQzAgUmVnaXN0ZXIgKi8KIAltdHNkcihTRFIwX1BGQzAsIDB4MCk7CkBAIC0xNTgsMTMgKzE1OCwxMyBAQAogCSh2b2lkKWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKIAkJCSAgICAtQ0ZHX01PTklUT1JfTEVOLAogCQkJICAgIDB4ZmZmZmZmZmYsCi0JCQkgICAgJmZsYXNoX2luZm9bMF0pOworCQkJICAgICZmbGFzaF9pbmZvWzFdKTsKIAogCS8qIEVudiBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KIAkodm9pZClmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCiAJCQkgICAgQ0ZHX0VOVl9BRERSX1JFRFVORCwKIAkJCSAgICBDRkdfRU5WX0FERFJfUkVEVU5EICsgMipDRkdfRU5WX1NFQ1RfU0laRSAtIDEsCi0JCQkgICAgJmZsYXNoX2luZm9bMF0pOworCQkJICAgICZmbGFzaF9pbmZvWzFdKTsKIAogCS8qCiAJICogVVNCIHN1ZmYuLi4KQEAgLTIyMSw4ICsyMjEsOCBAQAogCXVkZWxheSg1MDApOwogCWdwaW9fd3JpdGVfYml0KENGR19HUElPX0xJTUVfUlNULCAxKTsKIAotCS8qIExpbWUgbWVtb3J5IGNsb2NrIGFkanVzdGVkIHRvIDEzM01IeiAqLwotCW91dF9iZTMyKCh2b2lkICopQ0ZHX0xJTUVfU0RSQU1fQ0xPQ0ssIENGR19MSU1FX0NMT0NLXzEzM01IWik7CisJLyogTGltZSBtZW1vcnkgY2xvY2sgYWRqdXN0ZWQgdG8gMTAwTUh6ICovCisJb3V0X2JlMzIoKHZvaWQgKilDRkdfTElNRV9TRFJBTV9DTE9DSywgQ0ZHX0xJTUVfQ0xPQ0tfMTAwTUhaKTsKIAkvKiBXYWl0IHVudGlsbCB0aW1lIGV4cGlyZWQuIEJlY2F1c2Ugb2YgcmVxdWlyZW1lbnRzIGluIGxpbWUgbWFudWFsICovCiAJdWRlbGF5KDMwMCk7CiAJLyogV3JpdGUgbGltZSBjb250cm9sbGVyIG1lbW9yeSBwYXJhbWV0ZXJzICovCkBAIC0yMzcsNiArMjM3LDY0IEBACiAJZ3Bpb193cml0ZV9iaXQoQ0ZHX0dQSU9fUEhZMF9SU1QsIDEpOwogCWdwaW9fd3JpdGVfYml0KENGR19HUElPX1BIWTFfUlNULCAxKTsKIAorCS8qCisJICogSW5pdCBkaXNwbGF5IGNvbnRyb2xsZXIKKwkgKi8KKwkvKiBTZXR1cCBkb3QgY2xvY2sgKGludGVybmFsIFBMTCwgZGl2aXNpb24gcmF0ZSAxLzE2KSAqLworCW91dF9iZTMyKCh2b2lkICopMHhjMWZkMDEwMCwgMHgwMDAwMGYwMCk7CisKKwkvKiBMaW1lIEwwIGluaXQgKDE2IGJwcCwgNjQweDQ4MCkgKi8KKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZDAwMjAsIDB4ODAxNDAxZGYpOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZkMDAyNCwgMHgwKTsKKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZDAwMjgsIDB4MCk7CisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmQwMDJjLCAweDApOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZkMDExMCwgMHgwKTsKKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZDAxMTQsIDB4MCk7CisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmQwMTE4LCAweDAxZGYwMjgwKTsKKworCS8qIERpc3BsYXkgdGltaW5nIGluaXQgKi8KKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZDAwMDQsIDB4MDMxZjAwMDApOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZkMDAwOCwgMHgwMjdmMDI3Zik7CisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmQwMDBjLCAweDAxNWYwMjhmKTsKKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZDAwMTAsIDB4MDIwYzAwMDApOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZkMDAxNCwgMHgwMWRmMDFlYSk7CisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmQwMDE4LCAweDApOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZkMDAxYywgMHgwMWUwMDI4MCk7CisKKyNpZiAxCisJLyoKKwkgKiBDbGVhciBmcmFtZWJ1ZmZlciB1c2luZyBMaW1lJ3MgZHJhd2luZyBlbmdpbmUKKwkgKiAoZHJhdyBibHVlIHJlY3QuIHdpdGggd2hpdGUgYm9yZGVyIGFyb3VuZCBpdCkKKwkgKi8KKwkvKiBTZXR1cCBtb2RlIGFuZCBmYmJhc2UsIHhyZXMsIGZnLCBiZyAqLworCW91dF9iZTMyKCh2b2lkICopMHhjMWZmMDQyMCwgMHg4MzAwKTsKKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZjA0NDAsIDB4MDAwMCk7CisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmYwNDQ0LCAweDAyODApOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZmMDQ4MCwgMHg3ZmZmKTsKKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZjA0ODQsIDB4MDAwMCk7CisJLyogUmVzZXQgY2xpcHBpbmcgcmVjdGFuZ2xlICovCisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmYwNDU0LCAweDAwMDApOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZmMDQ1OCwgMHgwMjgwKTsKKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZjA0NWMsIDB4MDAwMCk7CisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmYwNDYwLCAweDAxZTApOworCS8qIERyYXcgd2hpdGUgcmVjdC4gKi8KKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZjA0YTAsIDB4MDk0MTAwMDApOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZmMDRhMCwgMHgwMDAwMDAwMCk7CisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmYwNGEwLCAweDAxZTAwMjgwKTsKKwl1ZGVsYXkoMjAwMCk7CisJLyogRHJhdyBibHVlIHJlY3QuICovCisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmYwNDgwLCAweDAwMWYpOworCW91dF9iZTMyKCh2b2lkICopMHhjMWZmMDRhMCwgMHgwOTQxMDAwMCk7CisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmYwNGEwLCAweDAwMDEwMDAxKTsKKwlvdXRfYmUzMigodm9pZCAqKTB4YzFmZjA0YTAsIDB4MDFkZTAyN2UpOworI2VuZGlmCisJLyogRGlzcGxheSBlbmFibGUsIEwwIGxheWVyICovCisJb3V0X2JlMzIoKHZvaWQgKikweGMxZmQwMTAwLCAweDgwMDEwZjAwKTsKKworCS8qIFRGVC1MQ0QgZW5hYmxlIC0gUFdNIGR1dHksIGxhbXAgb24gKi8KKwlvdXRfYmUzMigodm9pZCAqKTB4YzQwMDAwMjQsIDB4NjQpOworCW91dF9iZTMyKCh2b2lkICopMHhjNDAwMDAyMCwgMHg3MDEpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ2MywzICs1MjEsMTQgQEAKIAl2YWwgPSBncGlvX3JlYWRfb3V0X2JpdChDRkdfR1BJT19XQVRDSERPRykgPT0gMCA/IDEgOiAwOwogCWdwaW9fd3JpdGVfYml0KENGR19HUElPX1dBVENIRE9HLCB2YWwpOwogfQorCisjaWZkZWYgQ09ORklHX1BPU1QKKy8qCisgKiBSZXR1cm5zIDEgaWYga2V5cyBwcmVzc2VkIHRvIHN0YXJ0IHRoZSBwb3dlci1vbiBsb25nLXJ1bm5pbmcgdGVzdHMKKyAqIENhbGxlZCBmcm9tIGJvYXJkX2luaXRfZigpLgorICovCitpbnQgcG9zdF9ob3RrZXlzX3ByZXNzZWQodm9pZCkKK3sKKwlyZXR1cm4gKGN0cmxjKCkpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbjUvc2RyYW0uYyBiL2JvYXJkL2x3bW9uNS9zZHJhbS5jCmluZGV4IDlhNGE4ZWUuLmY5MDZiODUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2x3bW9uNS9zZHJhbS5jCisrKyBiL2JvYXJkL2x3bW9uNS9zZHJhbS5jCkBAIC01NCw3ICs1NCw2IEBACiAjZGVmaW5lIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRQlUTEJfV09SRDJfSV9FTkFCTEUJLyogZGlzYWJsZSBjYWNoaW5nIG9uIFNEUkFNICovCiAjZW5kaWYKIAotdm9pZCBwcm9ncmFtX3RsYih1MzIgcGh5c19hZGRyLCB1MzIgdmlydF9hZGRyLCB1MzIgc2l6ZSwgdTMyIHRsYl93b3JkMl9pX3ZhbHVlKTsKIHZvaWQgZGNiel9hcmVhKHUzMiBzdGFydF9hZGRyZXNzLCB1MzIgbnVtX2J5dGVzKTsKIHZvaWQgZGZsdXNoKHZvaWQpOwogCkBAIC00NzQsNyArNDczLDcgQEAKIAkJYmxhbmtfc3RyaW5nKHN0cmxlbihzdHIpKTsKIAl9IGVsc2UgewogCQkvKiBFQ0MgYml0IHNldCBtZXRob2QgZm9yIGNhY2hlZCBtZW1vcnkgKi8KLSNpZiAxIC8qIHRlc3Qtb25seTogd2lsbCByZW1vdmUgdGhpcyBkZWZpbmUgbGF0ZXIsIHdoZW4gRUNDIHByb2JsZW1zIGFyZSBzb2x2ZWQhICovCisjaWYgMCAvKiB0ZXN0LW9ubHk6IHdpbGwgcmVtb3ZlIHRoaXMgZGVmaW5lIGxhdGVyLCB3aGVuIEVDQyBwcm9ibGVtcyBhcmUgc29sdmVkISAqLwogCQkvKgogCQkgKiBTb21lIGJvYXJkcyAobGlrZSBsd21vbjUpIG5lZWQgdG8gcHJlc2VydmUgdGhlIG1lbW9yeQogCQkgKiBjb250ZW50IHVwb24gRUNDIGdlbmVyYXRpb24gKGZvciB0aGUgbG9nLWJ1ZmZlcikuCkBAIC00ODcsNiArNDg2LDExIEBACiAKIAkJY3VycmVudF9hZGRyZXNzID0gc3RhcnRfYWRkcmVzczsKIAkJd2hpbGUgKGN1cnJlbnRfYWRkcmVzcyA8IGVuZF9hZGRyZXNzKSB7CisJCQkvKgorCQkJICogVE9ETzogVGggZm9sbG93aW5nIHNlcXVlbmNlIGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkuCisJCQkgKiBKdXN0IGludmFsaWRhdGluZyBhbmQgZmx1c2hpbmcgdGhlIGNhY2hlIGRvZXNuJ3QKKwkJCSAqIHNlZW0gdG8gdHJpZ2dlciB0aGUgcmUtd3JpdGUgb2YgdGhlIG1lbW9yeS4KKwkJCSAqLwogCQkJcHBjRGNiaShjdXJyZW50X2FkZHJlc3MpOwogCQkJcHBjRGNiZihjdXJyZW50X2FkZHJlc3MpOwogCQkJY3VycmVudF9hZGRyZXNzICs9IENGR19DQUNIRUxJTkVfU0laRTsKQEAgLTUxNSwxOSArNTE5LDYgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgX19pbmxpbmVfXyB1MzIgZ2V0X21jc3Iodm9pZCkKLXsKLQl1MzIgdmFsOwotCi0JYXNtIHZvbGF0aWxlKCJtZnNwciAlMCwgMHgyM2MiIDogIj1yIiAodmFsKSA6KTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9tY3NyKHUzMiB2YWwpCi17Ci0JYXNtIHZvbGF0aWxlKCJtdHNwciAweDIzYywgJTAiIDogIj1yIiAodmFsKSA6KTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBpbml0ZHJhbSAtLSA0NDBFUHgncyBERFIgY29udHJvbGxlciBpcyBhIERFTkFMSSBDb3JlCkBAIC01MzUsOCArNTI2LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCiB7Ci0JdTMyIHZhbDsKLQogI2lmIDAgLyogdGVzdC1vbmx5OiB3aWxsIHJlbW92ZSB0aGlzIGRlZmluZSBsYXRlciwgd2hlbiBFQ0MgcHJvYmxlbXMgYXJlIHNvbHZlZCEgKi8KIAkvKiBDTD0zICovCiAJbXRzZHJhbShERFIwXzAyLCAweDAwMDAwMDAwKTsKQEAgLTY0MSwxNCArNjMwLDYgQEAKIAkgKiBQZXJmb3JtIGRhdGEgZXllIHNlYXJjaCBpZiByZXF1ZXN0ZWQuCiAJICovCiAJZGVuYWxpX2NvcmVfc2VhcmNoX2RhdGFfZXllKENGR19ERFJfQ0FDSEVEX0FERFIsIENGR19NQllURVNfU0RSQU0gPDwgMjApOwotCi0JLyoKLQkgKiBDbGVhciBwb3NzaWJsZSBlcnJvcnMgcmVzdWx0aW5nIGZyb20gZGF0YS1leWUtc2VhcmNoLgotCSAqIElmIG5vdCBkb25lLCB0aGVuIHdlIGNvdWxkIGdldCBhbiBpbnRlcnJ1cHQgbGF0ZXIgb24gd2hlbgotCSAqIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCi0JICovCi0JdmFsID0gZ2V0X21jc3IoKTsKLQlzZXRfbWNzcih2YWwpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRERSX0VDQwpAQCAtNjU4LDUgKzYzOSwxMiBAQAogCXByb2dyYW1fZWNjKENGR19ERFJfQ0FDSEVEX0FERFIsIENGR19NQllURVNfU0RSQU0gPDwgMjAsIDApOwogI2VuZGlmCiAKKwkvKgorCSAqIENsZWFyIHBvc3NpYmxlIGVycm9ycyByZXN1bHRpbmcgZnJvbSBkYXRhLWV5ZS1zZWFyY2guCisJICogSWYgbm90IGRvbmUsIHRoZW4gd2UgY291bGQgZ2V0IGFuIGludGVycnVwdCBsYXRlciBvbiB3aGVuCisJICogZXhjZXB0aW9ucyBhcmUgZW5hYmxlZC4KKwkgKi8KKwlzZXRfbWNzcihnZXRfbWNzcigpKTsKKwogCXJldHVybiAoQ0ZHX01CWVRFU19TRFJBTSA8PCAyMCk7CiB9CmRpZmYgLS1naXQgYS9ib2FyZC9tYng4eHgvcGNtY2lhLmMgYi9ib2FyZC9tYng4eHgvcGNtY2lhLmMKaW5kZXggMTMyYTY4OC4uYTAyYzg0OCAxMDA2NDQKLS0tIGEvYm9hcmQvbWJ4OHh4L3BjbWNpYS5jCisrKyBiL2JvYXJkL21ieDh4eC9wY21jaWEuYwpAQCAtNiwxMSArNiwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTE1NiwxMSArMTU2LDExIEBACiAJcmV0dXJuICgwKTsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZSAoaW50IHNsb3QpCiB7CiAJcmV0dXJuIDA7CS8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KIH0KLSNlbmRpZiAvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKICNlbmRpZgkvKiBDT05GSUdfUENNQ0lBICovCmRpZmYgLS1naXQgYS9ib2FyZC9tY2MyMDAvYXV0b191cGRhdGUuYyBiL2JvYXJkL21jYzIwMC9hdXRvX3VwZGF0ZS5jCmluZGV4IDkwZDAzZWMuLjI4ZTRjODcgMTAwNjQ0Ci0tLSBhL2JvYXJkL21jYzIwMC9hdXRvX3VwZGF0ZS5jCisrKyBiL2JvYXJkL21jYzIwMC9hdXRvX3VwZGF0ZS5jCkBAIC00NCw4ICs0NCw4IEBACiAjZXJyb3IgIm11c3QgZGVmaW5lIENGR19IVVNIX1BBUlNFUiIKICNlbmRpZgogCi0jaWYgIShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKLSNlcnJvciAibXVzdCBkZWZpbmUgQ0ZHX0NNRF9GQVQiCisjaWYgIWRlZmluZWQoQ09ORklHX0NNRF9GQVQpCisjZXJyb3IgIm11c3QgZGVmaW5lIENPTkZJR19DTURfRkFUIgogI2VuZGlmCiAKICN1bmRlZiBBVV9ERUJVRwpAQCAtMzMwLDYgKzMzMCw4IEBACiAJaW50IGksIHJlcyA9IDAsIGJpdG1hcF9maXJzdCwgY250LCBvbGRfY3RybGMsIGdvdF9jdHJsYzsKIAljaGFyICplbnY7CiAJbG9uZyBzdGFydCwgZW5kOworCisjaWYgMCAvKiBkaXNhYmxlIGtleS1wcmVzcyBkZXRlY3Rpb24gdG8gc3BlZWQgdXAgYm9vdC11cCB0aW1lICovCiAJdWNoYXIga2V5cGFkX3N0YXR1czFbMl0gPSB7MCwwfSwga2V5cGFkX3N0YXR1czJbMl0gPSB7MCwwfTsKIAogCS8qCkBAIC0zNDcsNiArMzQ5LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisjZW5kaWYKIAlhdV91c2Jfc3Rvcl9jdXJyX2RldiA9IC0xOwogCS8qIHN0YXJ0IFVTQiAqLwogCWlmICh1c2Jfc3RvcCgpIDwgMCkgewpAQCAtMzY0LDE4ICszNjcsMjEgQEAKIAlhdV91c2Jfc3Rvcl9jdXJyX2RldiA9IHVzYl9zdG9yX3NjYW4oMCk7CiAJaWYgKGF1X3VzYl9zdG9yX2N1cnJfZGV2ID09IC0xKSB7CiAJCWRlYnVnICgiTm8gZGV2aWNlIGZvdW5kLiBOb3QgaW5pdGlhbGl6ZWQ/XG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXMgPSAtMTsKKwkJZ290byB4aXQ7CiAJfQogCS8qIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGEgcGFydGl0aW9uIHRhYmxlICovCiAJc3Rvcl9kZXYgPSBnZXRfZGV2KCJ1c2IiLCAwKTsKIAlpZiAoc3Rvcl9kZXYgPT0gTlVMTCkgewogCQlkZWJ1ZyAoInVrbm93biBkZXZpY2UgdHlwZVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmVzID0gLTE7CisJCWdvdG8geGl0OwogCX0KIAlpZiAoZmF0X3JlZ2lzdGVyX2RldmljZShzdG9yX2RldiwgMSkgIT0gMCkgewogCQlkZWJ1ZyAoIlVuYWJsZSB0byB1c2UgVVNCICVkOiVkIGZvciBmYXRsc1xuIiwKIAkJCWF1X3VzYl9zdG9yX2N1cnJfZGV2LCAxKTsKLQkJcmV0dXJuIC0xOworCQlyZXMgPSAtMTsKKwkJZ290byB4aXQ7CiAJfQogCWlmIChmaWxlX2ZhdF9kZXRlY3RmcygpICE9IDApIHsKIAkJZGVidWcgKCJmaWxlX2ZhdF9kZXRlY3RmcyBmYWlsZWRcbiIpOwpAQCAtNTA0LDcgKzUxMCw3IEBACiAJCX0gd2hpbGUgKHJlcyA8IDApOwogI2VuZGlmCiAJfQotCXVzYl9zdG9wKCk7CisKIAkvKiByZXN0b3JlIHRoZSBvbGQgc3RhdGUgKi8KIAlkaXNhYmxlX2N0cmxjKG9sZF9jdHJsYyk7CiAjaWZkZWYgQ09ORklHX1BST0dSRVNTQkFSCkBAIC01MTcsNiArNTIzLDggQEAKIAkJbGNkX2VuYWJsZSgpOwogCX0KICNlbmRpZgotCXJldHVybiAwOworIHhpdDoKKwl1c2Jfc3RvcCgpOworCXJldHVybiByZXM7CiB9CiAjZW5kaWYgLyogQ09ORklHX0FVVE9fVVBEQVRFICovCmRpZmYgLS1naXQgYS9ib2FyZC9tY2MyMDAvbWNjMjAwLmMgYi9ib2FyZC9tY2MyMDAvbWNjMjAwLmMKaW5kZXggYWYwNDdlMi4uYTRjNDY0NCAxMDA2NDQKLS0tIGEvYm9hcmQvbWNjMjAwL21jYzIwMC5jCisrKyBiL2JvYXJkL21jYzIwMC9tY2MyMDAuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCAodm9pZCkKIHsKQEAgLTMyMCw5ICszMjAsOSBAQAogCWRlYnVnICgiaWRlX3Jlc2V0KCVkKVxuIiwgaWRlcmVzZXQpOwogCiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9tY2MyMDAvdS1ib290LmxkcyBiL2JvYXJkL21jYzIwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmRlYTZiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21jYzIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL21sMi9zZXJpYWwuYyBiL2JvYXJkL21sMi9zZXJpYWwuYwppbmRleCA3NDY4N2YxLi42NTkzMTQ1IDEwMDY0NAotLS0gYS9ib2FyZC9tbDIvc2VyaWFsLmMKKysrIGIvYm9hcmQvbWwyL3NlcmlhbC5jCkBAIC04OCw3ICs4OCw3IEBACiAJfQogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIHZvaWQga2dkYl9zZXJpYWxfaW5pdCAodm9pZCkKIHsKIH0KQEAgLTExMiw0ICsxMTIsNCBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvbW91c3NlL2NvbmZpZy5tayBiL2JvYXJkL21vdXNzZS9jb25maWcubWsKaW5kZXggNjRjZmZhNC4uOTMzZTZiMyAxMDA2NDQKLS0tIGEvYm9hcmQvbW91c3NlL2NvbmZpZy5taworKysgYi9ib2FyZC9tb3Vzc2UvY29uZmlnLm1rCkBAIC0yNiwzICsyNiw1IEBACiAjCiBURVhUX0JBU0UgPSAweEZGRjAwMDAwCiBQTEFURk9STV9DUFBGTEFHUyArPSAtRFRFWFRfQkFTRT0kKFRFWFRfQkFTRSkKKworTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9ib2FyZC9tb3Vzc2UvdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvYm9hcmQvbW91c3NlL3UtYm9vdC5sZHMgYi9ib2FyZC9tb3Vzc2UvdS1ib290LmxkcwppbmRleCA1NzM1OGI4Li5lYjRkOGU0IDEwMDY0NAotLS0gYS9ib2FyZC9tb3Vzc2UvdS1ib290LmxkcworKysgYi9ib2FyZC9tb3Vzc2UvdS1ib290LmxkcwpAQCAtNjAsNyArNjAsNiBAQAogICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKICAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKIAotICAgICooLmZpeHVwKQogICAgICooLmdvdDEpCiAgICAgLiA9IEFMSUdOKDE2KTsKICAgICAqKC5yb2RhdGEpCmRpZmYgLS1naXQgYS9ib2FyZC9tcDJ1c2IvbXAydXNiLmMgYi9ib2FyZC9tcDJ1c2IvbXAydXNiLmMKaW5kZXggNDg2ZDQ0Yy4uZGNkYTY5OSAxMDA2NDQKLS0tIGEvYm9hcmQvbXAydXNiL21wMnVzYi5jCisrKyBiL2JvYXJkL21wMnVzYi9tcDJ1c2IuYwpAQCAtNjEsNyArNjEsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTgxLDUgKzgxLDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZSA9IGRtOTE2MV9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgyNjBhZHMvdS1ib290LmxkcyBiL2JvYXJkL21wYzgyNjBhZHMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MDQ4ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MjYwYWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgyNjZhZHMvdS1ib290LmxkcyBiL2JvYXJkL21wYzgyNjZhZHMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyMDc1OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MjY2YWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4MzEzZXJkYi91LWJvb3QubGRzIGIvYm9hcmQvbXBjODMxM2VyZGIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3Yzg3YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MzEzZXJkYi91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDYKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzMnhlbWRzL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGM4MzJ4ZW1kcy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdjODdhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wYzgzMnhlbWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgzeHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM0OWVtZHMvbXBjODM0OWVtZHMuYyBiL2JvYXJkL21wYzgzNDllbWRzL21wYzgzNDllbWRzLmMKaW5kZXggMDcxNTkxZS4uNTIxZDFiYiAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODM0OWVtZHMvbXBjODM0OWVtZHMuYworKysgYi9ib2FyZC9tcGM4MzQ5ZW1kcy9tcGM4MzQ5ZW1kcy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8aTJjLmg+CiAjaW5jbHVkZSA8c3BkLmg+CiAjaW5jbHVkZSA8bWlpcGh5Lmg+Ci0jaW5jbHVkZSA8Y29tbWFuZC5oPgogI2lmIGRlZmluZWQoQ09ORklHX1NQRF9FRVBST00pCiAjaW5jbHVkZSA8c3BkX3NkcmFtLmg+CiAjZW5kaWYKQEAgLTI1OCwzMzIgKzI1Nyw2IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmIGRlZmluZWQoQ09ORklHX0REUl9FQ0NfQ01EKQotLyoKLSAqIEVDQyB1c2VyIGNvbW1hbmRzCi0gKi8KLXZvaWQgZWNjX3ByaW50X3N0YXR1cyh2b2lkKQotewotCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKLQl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOwotCi0JcHJpbnRmKCJcbkVDQyBtb2RlOiAlc1xuXG4iLCAoZGRyLT5zZHJhbV9jZmcgJiBTRFJBTV9DRkdfRUNDX0VOKSA/ICJPTiIgOiAiT0ZGIik7Ci0KLQkvKiBJbnRlcnJ1cHRzICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTpcbiIpOwotCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCi0JCQkoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fTUJFRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCi0JCQkoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fU0JFRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcblxuIiwKLQkJCShkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NU0VFKSA/IDEgOiAwKTsKLQotCS8qIEVycm9yIGRpc2FibGUgKi8KLQlwcmludGYoIk1lbW9yeSBFcnJvciBEaXNhYmxlOlxuIik7Ci0JcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKLQkJCShkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIFNpbmxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKLQkJCShkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3IgRGlzYWJsZTogJWRcblxuIiwKLQkJCShkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCkgPyAxIDogMCk7Ci0KLQkvKiBFcnJvciBpbmplY3Rpb24gKi8KLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaC9Mb3c6ICUwOGx4ICUwOGx4XG4iLAotCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfaGksIGRkci0+ZGF0YV9lcnJfaW5qZWN0X2xvKTsKLQotCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBFQ0M6XG4iKTsKLQlwcmludGYoIiAgRUNDIE1pcnJvciBCeXRlOiAlZFxuIiwKLQkJCShkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRU1CKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgRUNDIEluamVjdGlvbiBFbmFibGU6ICVkXG4iLAotCQkJKGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FSUVOKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgRUNDIEVycm9yIEluamVjdGlvbiBNYXNrOiAweCUwMnhcblxuIiwKLQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FRUlNKTsKLQotCS8qIFNCRSBjb3VudGVyL3RocmVzaG9sZCAqLwotCXByaW50ZigiTWVtb3J5IFNpbmdsZS1CaXQgRXJyb3IgTWFuYWdlbWVudCAoMC4uMjU1KTpcbiIpOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogJWRcbiIsCi0JCQkoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVUKSA+PiBFQ0NfRVJST1JfTUFOX1NCRVRfU0hJRlQpOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIENvdW50ZXI6ICVkXG5cbiIsCi0JCQkoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVDKSA+PiBFQ0NfRVJST1JfTUFOX1NCRUNfU0hJRlQpOwotCi0JLyogRXJyb3IgZGV0ZWN0ICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgRGV0ZWN0OlxuIik7Ci0JcHJpbnRmKCIgIE11bHRpcGxlIE1lbW9yeSBFcnJvcnM6ICVkXG4iLAotCQkJKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTU1FKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTXVsdGlwbGUtQml0IEVycm9yOiAlZFxuIiwKLQkJCShkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01CRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3I6ICVkXG4iLAotCQkJKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfU0JFKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTWVtb3J5IFNlbGVjdCBFcnJvcjogJWRcblxuIiwKLQkJCShkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01TRSkgPyAxIDogMCk7Ci0KLQkvKiBDYXB0dXJlIGRhdGEgKi8KLQlwcmludGYoIk1lbW9yeSBFcnJvciBBZGRyZXNzIENhcHR1cmU6IDB4JTA4bHhcbiIsIGRkci0+Y2FwdHVyZV9hZGRyZXNzKTsKLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggUmVhZCBDYXB0dXJlIEhpZ2gvTG93OiAlMDhseCAlMDhseFxuIiwKLQkJCWRkci0+Y2FwdHVyZV9kYXRhX2hpLCBkZHItPmNhcHR1cmVfZGF0YV9sbyk7Ci0JcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIFJlYWQgQ2FwdHVyZSBFQ0M6IDB4JTAyeFxuXG4iLAotCQlkZHItPmNhcHR1cmVfZWNjICYgQ0FQVFVSRV9FQ0NfRUNFKTsKLQotCXByaW50ZigiTWVtb3J5IEVycm9yIEF0dHJpYnV0ZXMgQ2FwdHVyZTpcbiIpOwotCXByaW50ZigiICBEYXRhIEJlYXQgTnVtYmVyOiAlZFxuIiwKLQkJCShkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfQk5VTSkgPj4gRUNDX0NBUFRfQVRUUl9CTlVNX1NISUZUKTsKLQlwcmludGYoIiAgVHJhbnNhY3Rpb24gU2l6ZTogJWRcbiIsCi0JCQkoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTSVopID4+IEVDQ19DQVBUX0FUVFJfVFNJWl9TSElGVCk7Ci0JcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFNvdXJjZTogJWRcbiIsCi0JCQkoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTUkMpID4+IEVDQ19DQVBUX0FUVFJfVFNSQ19TSElGVCk7Ci0JcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFR5cGU6ICVkXG4iLAotCQkJKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UVFlQKSA+PiBFQ0NfQ0FQVF9BVFRSX1RUWVBfU0hJRlQpOwotCXByaW50ZigiICBFcnJvciBJbmZvcm1hdGlvbiBWYWxpZDogJWRcblxuIiwKLQkJCWRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9WTEQpOwotfQotCi1pbnQgZG9fZWNjICggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOwotCXZvbGF0aWxlIGRkcjgzeHhfdCAqZGRyID0gJmltbWFwLT5kZHI7Ci0Jdm9sYXRpbGUgdTMyIHZhbDsKLQl1NjQgKmFkZHIsIGNvdW50LCB2YWw2NDsKLQlyZWdpc3RlciB1NjQgKmk7Ci0KLQlpZiAoYXJnYyA+IDQpIHsKLQkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKGFyZ2MgPT0gMikgewotCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJzdGF0dXMiKSA9PSAwKSB7Ci0JCQllY2NfcHJpbnRfc3RhdHVzKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImNhcHR1cmVjbGVhciIpID09IDApIHsKLQkJCWRkci0+Y2FwdHVyZV9hZGRyZXNzID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9kYXRhX2hpID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9kYXRhX2xvID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9lY2MgPSAwOwotCQkJZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgPSAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAoYXJnYyA9PSAzKSB7Ci0JCWlmIChzdHJjbXAoYXJndlsxXSwgInNiZWNudCIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKLQkJCWlmICh2YWwgPiAyNTUpIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBDb3VudGVyIHZhbHVlLCBzaG91bGQgYmUgMC4uMjU1XG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJdmFsID0gKHZhbCA8PCBFQ0NfRVJST1JfTUFOX1NCRUNfU0hJRlQpOwotCQkJdmFsIHw9IChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRVQpOwotCi0JCQlkZHItPmVycl9zYmUgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgInNiZXRociIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKLQkJCWlmICh2YWwgPiAyNTUpIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBDb3VudGVyIHZhbHVlLCBzaG91bGQgYmUgMC4uMjU1XG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJdmFsID0gKHZhbCA8PCBFQ0NfRVJST1JfTUFOX1NCRVRfU0hJRlQpOwotCQkJdmFsIHw9IChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRUMpOwotCi0JCQlkZHItPmVycl9zYmUgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImVycmRpc2FibGUiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVycl9kaXNhYmxlOwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICIrc2JlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9TQkVEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIittYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX01CRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK21zZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfTVNFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrYWxsIikgPT0gMCkgewotCQkJCXZhbCB8PSAoRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCB8Ci0JCQkJCUVDQ19FUlJPUl9ESVNBQkxFX01CRUQgfAotCQkJCQlFQ0NfRVJST1JfRElTQUJMRV9NU0VEKTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItc2JlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfU0JFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItbWJlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfTUJFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItbXNlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfTVNFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItYWxsIikgPT0gMCkgewotCQkJCXZhbCAmPSB+KEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQgfAotCQkJCQlFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKLQkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IGVycl9kaXNhYmxlIGZpZWxkXG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJZGRyLT5lcnJfZGlzYWJsZSA9IHZhbDsKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJlcnJkZXRlY3RjbHIiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVycl9kZXRlY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgIm1tZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NTUU7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAic2JlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX1NCRTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJtYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTUJFOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIm1zZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NU0U7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiYWxsIikgPT0gMCkgewotCQkJCXZhbCB8PSAoRUNDX0VSUk9SX0RFVEVDVF9NTUUgfAotCQkJCQlFQ0NfRVJST1JfREVURUNUX01CRSB8Ci0JCQkJCUVDQ19FUlJPUl9ERVRFQ1RfU0JFIHwKLQkJCQkJRUNDX0VSUk9SX0RFVEVDVF9NU0UpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBlcnJfZGV0ZWN0IGZpZWxkXG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJZGRyLT5lcnJfZGV0ZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RkYXRhaGkiKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0KLQkJCWRkci0+ZGF0YV9lcnJfaW5qZWN0X2hpID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RkYXRhbG8iKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0KLQkJCWRkci0+ZGF0YV9lcnJfaW5qZWN0X2xvID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RlY2MiKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0JCQlpZiAodmFsID4gMHhmZikgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IEVDQyBpbmplY3QgbWFzaywgc2hvdWxkIGJlIDB4MDAuLjB4ZmZcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQkJdmFsIHw9IChkZHItPmVjY19lcnJfaW5qZWN0ICYgfkVDQ19FUlJfSU5KRUNUX0VFSU0pOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3QiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVjY19lcnJfaW5qZWN0OwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJlbiIpID09IDApCi0JCQkJdmFsIHw9IEVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQllbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgImRpcyIpID09IDApCi0JCQkJdmFsICY9IH5FQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJZWxzZQotCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIm1pcnJvciIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKLQkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRU1COwotCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQotCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRU1COwotCQkJZWxzZQotCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAoYXJnYyA9PSA0KSB7Ci0JCWlmIChzdHJjbXAoYXJndlsxXSwgInRlc3QiKSA9PSAwKSB7Ci0JCQlhZGRyID0gKHU2NCAqKXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKLQkJCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOwotCi0JCQlpZiAoKHUzMilhZGRyICUgOCkgewotCQkJCXByaW50ZigiQWRkcmVzcyBub3QgYWxsaWduZWQgb24gZG91YmxlIHdvcmQgYm91bmRhcnlcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKLQkJCWljYWNoZV9kaXNhYmxlKCk7Ci0KLQkJCWZvciAoaSA9IGFkZHI7IGkgPCBhZGRyICsgY291bnQ7IGkrKykgewotCQkJCS8qIGVuYWJsZSBpbmplY3RzICovCi0JCQkJZGRyLT5lY2NfZXJyX2luamVjdCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKLQotCQkJCS8qIHdyaXRlIG1lbW9yeSBsb2NhdGlvbiBpbmplY3RpbmcgZXJyb3JzICovCi0JCQkJKmkgPSAweDExMjIzMzQ0NTU2Njc3ODhVTEw7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7Ci0KLQkJCQkvKiBkaXNhYmxlIGluamVjdHMgKi8KLQkJCQlkZHItPmVjY19lcnJfaW5qZWN0ICY9IH5FQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKLQotCQkJCS8qIHJlYWQgZGF0YSwgdGhpcyBnZW5lcmF0ZXMgRUNDIGVycm9yICovCi0JCQkJdmFsNjQgPSAqaTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQotCQkJCS8qIGRpc2FibGUgZXJyb3JzIGZvciBFQ0MgKi8KLQkJCQlkZHItPmVycl9kaXNhYmxlIHw9IH5FQ0NfRVJST1JfRU5BQkxFOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKLQotCQkJCS8qIHJlLWluaXRpYWxpemUgbWVtb3J5LCB3cml0ZSB0aGUgbG9jYXRpb24gYWdhaW4KLQkJCQkgKiBOT1QgaW5qZWN0aW5nIGVycm9ycyB0aGlzIHRpbWUgKi8KLQkJCQkqaSA9IDB4Y2FmZWNhZmVjYWZlY2FmZVVMTDsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQotCQkJCS8qIGVuYWJsZSBlcnJvcnMgZm9yIEVDQyAqLwotCQkJCWRkci0+ZXJyX2Rpc2FibGUgJj0gRUNDX0VSUk9SX0VOQUJMRTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7Ci0JCQl9Ci0KLQkJCWljYWNoZV9lbmFibGUoKTsKLQkJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKLQlyZXR1cm4gMTsKLX0KLQotVV9CT09UX0NNRCgKLQllY2MsICAgICA0LCAgICAgMCwgICAgICBkb19lY2MsCi0JImVjYyAgICAgLSBzdXBwb3J0IGZvciBERFIgRUNDIGZlYXR1cmVzXG4iLAotCSJzdGF0dXMgICAgICAgICAgICAgIC0gcHJpbnQgb3V0IHN0YXR1cyBpbmZvXG4iCi0JImVjYyBjYXB0dXJlY2xlYXIgICAgICAgIC0gY2xlYXIgY2FwdHVyZSByZWdzIGRhdGFcbiIKLQkiZWNjIHNiZWNudCA8dmFsPiAgICAgICAgLSBzZXQgU2luZ2xlLUJpdCBFcnJvciBjb3VudGVyXG4iCi0JImVjYyBzYmV0aHIgPHZhbD4gICAgICAgIC0gc2V0IFNpbmdsZS1CaXQgVGhyZXNob2xkXG4iCi0JImVjYyBlcnJkaXNhYmxlIDxmbGFnPiAgIC0gY2xlYXIvc2V0IGRpc2FibGUgTWVtb3J5IEVycm9yIERpc2FibGUsIGZsYWc6XG4iCi0JIiAgWy18K11zYmUgLSBTaW5nbGUtQml0IEVycm9yXG4iCi0JIiAgWy18K11tYmUgLSBNdWx0aXBsZS1CaXQgRXJyb3JcbiIKLQkiICBbLXwrXW1zZSAtIE1lbW9yeSBTZWxlY3QgRXJyb3JcbiIKLQkiICBbLXwrXWFsbCAtIGFsbCBlcnJvcnNcbiIKLQkiZWNjIGVycmRldGVjdGNsciA8ZmxhZz4gLSBjbGVhciBNZW1vcnkgRXJyb3IgRGV0ZWN0LCBmbGFnOlxuIgotCSIgIG1tZSAtIE11bHRpcGxlIE1lbW9yeSBFcnJvcnNcbiIKLQkiICBzYmUgLSBTaW5nbGUtQml0IEVycm9yXG4iCi0JIiAgbWJlIC0gTXVsdGlwbGUtQml0IEVycm9yXG4iCi0JIiAgbXNlIC0gTWVtb3J5IFNlbGVjdCBFcnJvclxuIgotCSIgIGFsbCAtIGFsbCBlcnJvcnNcbiIKLQkiZWNjIGluamVjdGRhdGFoaSA8aGk+ICAtIHNldCBNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2hcbiIKLQkiZWNjIGluamVjdGRhdGFsbyA8bG8+ICAtIHNldCBNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIExvd1xuIgotCSJlY2MgaW5qZWN0ZWNjIDxlY2M+ICAgIC0gc2V0IEVDQyBFcnJvciBJbmplY3Rpb24gTWFza1xuIgotCSJlY2MgaW5qZWN0IDxlbnxkaXM+ICAgIC0gZW5hYmxlL2Rpc2FibGUgZXJyb3IgaW5qZWN0aW9uXG4iCi0JImVjYyBtaXJyb3IgPGVufGRpcz4gICAgLSBlbmFibGUvZGlzYWJsZSBtaXJyb3IgYnl0ZVxuIgotCSJlY2MgdGVzdCA8YWRkcj4gPGNudD4gIC0gdGVzdCBtZW0gcmVnaW9uOlxuIgotCSIgIC0gZW5hYmxlcyBpbmplY3RzXG4iCi0JIiAgLSB3cml0ZXMgcGF0dGVybiBpbmplY3RpbmcgZXJyb3JzXG4iCi0JIiAgLSBkaXNhYmxlcyBpbmplY3RzXG4iCi0JIiAgLSByZWFkcyBwYXR0ZXJuIGJhY2ssIGdlbmVyYXRlcyBlcnJvclxuIgotCSIgIC0gcmUtaW5pdHMgbWVtb3J5IgotKTsKLSNlbmRpZiAvKiBpZiBkZWZpbmVkKENPTkZJR19ERFJfRUNDKSAmJiBkZWZpbmVkKENPTkZJR19ERFJfRUNDX0NNRCkgKi8KLQogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCiB2b2lkCiBmdF9ib2FyZF9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzNDllbWRzL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGM4MzQ5ZW1kcy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdjODdhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wYzgzNDllbWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgzeHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM0OWl0eC9jb25maWcubWsgYi9ib2FyZC9tcGM4MzQ5aXR4L2NvbmZpZy5tawppbmRleCAxOTAxZmRjLi43OWYxNzY1IDEwMDY0NAotLS0gYS9ib2FyZC9tcGM4MzQ5aXR4L2NvbmZpZy5taworKysgYi9ib2FyZC9tcGM4MzQ5aXR4L2NvbmZpZy5tawpAQCAtMjksOSArMjksMyBAQAogaWZuZGVmIFRFWFRfQkFTRQogVEVYVF9CQVNFICA9ICAgMHhGRUYwMDAwMAogZW5kaWYKLQotaWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKLSMgV2UgYXJlIGJ1aWxkaW5nIHUtYm9vdCBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSwgdXNlIGdlbmVyYXRlZAotIyAubGRzIHNjcmlwdCBmcm9tIE9CSlRSRUUgZGlyZWN0b3J5LgotTERTQ1JJUFQgOj0gJChPQkpUUkVFKS9ib2FyZC8kKEJPQVJERElSKS91LWJvb3QubGRzCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM0OWl0eC91LWJvb3QubGRzIGIvYm9hcmQvbXBjODM0OWl0eC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ0YzBmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wYzgzNDlpdHgvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAyMDA2LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM2MGVtZHMvbXBjODM2MGVtZHMuYyBiL2JvYXJkL21wYzgzNjBlbWRzL21wYzgzNjBlbWRzLmMKaW5kZXggNTYyZWI4Yi4uM2ZhMDkzZCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODM2MGVtZHMvbXBjODM2MGVtZHMuYworKysgYi9ib2FyZC9tcGM4MzYwZW1kcy9tcGM4MzYwZW1kcy5jCkBAIC0xLDggKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICoKICAqIERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+Ci0gKiBiYXNlZCBvbiBib2FyZC9tcGM4MzQ5ZW1kcy9tcGM4MzQ5ZW1kcy5jCiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICAqIHByb2plY3QuCkBAIC0xOSw3ICsxNyw2IEBACiAjaW5jbHVkZSA8aTJjLmg+CiAjaW5jbHVkZSA8c3BkLmg+CiAjaW5jbHVkZSA8bWlpcGh5Lmg+Ci0jaW5jbHVkZSA8Y29tbWFuZC5oPgogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKICNpbmNsdWRlIDxwY2kuaD4KICNlbmRpZgpAQCAtMzAsOCArMjcsNyBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogI2luY2x1ZGUgPGZ0X2J1aWxkLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjZWxpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCiAjaW5jbHVkZSA8bGliZmR0Lmg+CiAjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgogI2VuZGlmCkBAIC0xMDMsNyArOTksOSBAQAogCiAJLyogRGlzYWJsZSBHMVRYQ0xLLCBHMlRYQ0xLIGgvdyBidWZmZXJzIChyZXYuMiBoL3cgYnVnIHdvcmthcm91bmQpICovCiAJaWYgKGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwX1JFVjIwIHx8Ci0JICAgIGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwRV9SRVYyMCkKKwkgICAgaW1tci0+c3lzY29uZi5zcHJpZHIgPT0gU1BSXzgzNjBFX1JFVjIwIHx8CisJICAgIGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwX1JFVjIxIHx8CisJICAgIGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwRV9SRVYyMSkKIAkJYmNzclsweGVdID0gMHgzMDsKIAogCXJldHVybiAwOwpAQCAtMjg3LDM4MSArMjg1LDYgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19DTUQpCi0vKgotICogRUNDIHVzZXIgY29tbWFuZHMKLSAqLwotdm9pZCBlY2NfcHJpbnRfc3RhdHVzKHZvaWQpCi17Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKLQl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOwotCi0JcHJpbnRmKCJcbkVDQyBtb2RlOiAlc1xuXG4iLAotCSAgICAgICAoZGRyLT5zZHJhbV9jZmcgJiBTRFJBTV9DRkdfRUNDX0VOKSA/ICJPTiIgOiAiT0ZGIik7Ci0KLQkvKiBJbnRlcnJ1cHRzICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTpcbiIpOwotCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCi0JICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NQkVFKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX1NCRUUpID8gMSA6IDApOwotCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG5cbiIsCi0JICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NU0VFKSA/IDEgOiAwKTsKLQotCS8qIEVycm9yIGRpc2FibGUgKi8KLQlwcmludGYoIk1lbW9yeSBFcnJvciBEaXNhYmxlOlxuIik7Ci0JcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2Rpc2FibGUgJiBFQ0NfRVJST1JfRElTQUJMRV9NQkVEKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgU2lubGUtQml0IEVycm9yIERpc2FibGU6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQpID8gMSA6IDApOwotCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIERpc2FibGU6ICVkXG5cbiIsCi0JICAgICAgIChkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCkgPyAxIDogMCk7Ci0KLQkvKiBFcnJvciBpbmplY3Rpb24gKi8KLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaC9Mb3c6ICUwOGx4ICUwOGx4XG4iLAotCSAgICAgICBkZHItPmRhdGFfZXJyX2luamVjdF9oaSwgZGRyLT5kYXRhX2Vycl9pbmplY3RfbG8pOwotCi0JcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEVDQzpcbiIpOwotCXByaW50ZigiICBFQ0MgTWlycm9yIEJ5dGU6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VNQikgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIEVDQyBJbmplY3Rpb24gRW5hYmxlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FSUVOKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgRUNDIEVycm9yIEluamVjdGlvbiBNYXNrOiAweCUwMnhcblxuIiwKLQkgICAgICAgZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VFSU0pOwotCi0JLyogU0JFIGNvdW50ZXIvdGhyZXNob2xkICovCi0JcHJpbnRmKCJNZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOlxuIik7Ci0JcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3IgVGhyZXNob2xkOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFVCkgPj4gRUNDX0VSUk9SX01BTl9TQkVUX1NISUZUKTsKLQlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBDb3VudGVyOiAlZFxuXG4iLAotCSAgICAgICAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVDKSA+PiBFQ0NfRVJST1JfTUFOX1NCRUNfU0hJRlQpOwotCi0JLyogRXJyb3IgZGV0ZWN0ICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgRGV0ZWN0OlxuIik7Ci0JcHJpbnRmKCIgIE11bHRpcGxlIE1lbW9yeSBFcnJvcnM6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NTUUpID8gMSA6IDApOwotCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3I6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NQkUpID8gMSA6IDApOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfU0JFKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTWVtb3J5IFNlbGVjdCBFcnJvcjogJWRcblxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTVNFKSA/IDEgOiAwKTsKLQotCS8qIENhcHR1cmUgZGF0YSAqLwotCXByaW50ZigiTWVtb3J5IEVycm9yIEFkZHJlc3MgQ2FwdHVyZTogMHglMDhseFxuIiwgZGRyLT5jYXB0dXJlX2FkZHJlc3MpOwotCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBSZWFkIENhcHR1cmUgSGlnaC9Mb3c6ICUwOGx4ICUwOGx4XG4iLAotCSAgICAgICBkZHItPmNhcHR1cmVfZGF0YV9oaSwgZGRyLT5jYXB0dXJlX2RhdGFfbG8pOwotCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBSZWFkIENhcHR1cmUgRUNDOiAweCUwMnhcblxuIiwKLQkgICAgICAgZGRyLT5jYXB0dXJlX2VjYyAmIENBUFRVUkVfRUNDX0VDRSk7Ci0KLQlwcmludGYoIk1lbW9yeSBFcnJvciBBdHRyaWJ1dGVzIENhcHR1cmU6XG4iKTsKLQlwcmludGYoIiBEYXRhIEJlYXQgTnVtYmVyOiAlZFxuIiwKLQkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9CTlVNKSA+PgotCSAgICAgICBFQ0NfQ0FQVF9BVFRSX0JOVU1fU0hJRlQpOwotCXByaW50ZigiICBUcmFuc2FjdGlvbiBTaXplOiAlZFxuIiwKLQkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UU0laKSA+PgotCSAgICAgICBFQ0NfQ0FQVF9BVFRSX1RTSVpfU0hJRlQpOwotCXByaW50ZigiICBUcmFuc2FjdGlvbiBTb3VyY2U6ICVkXG4iLAotCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTUkMpID4+Ci0JICAgICAgIEVDQ19DQVBUX0FUVFJfVFNSQ19TSElGVCk7Ci0JcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFR5cGU6ICVkXG4iLAotCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RUWVApID4+Ci0JICAgICAgIEVDQ19DQVBUX0FUVFJfVFRZUF9TSElGVCk7Ci0JcHJpbnRmKCIgIEVycm9yIEluZm9ybWF0aW9uIFZhbGlkOiAlZFxuXG4iLAotCSAgICAgICBkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVkxEKTsKLX0KLQotaW50IGRvX2VjYyhjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKLQl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOwotCXZvbGF0aWxlIHUzMiB2YWw7Ci0JdTY0ICphZGRyOwotCXUzMiBjb3VudDsKLQlyZWdpc3RlciB1NjQgKmk7Ci0JdTMyIHJldFsyXTsKLQl1MzIgcGF0dGVyblsyXTsKLQl1MzIgd3JpdGViYWNrWzJdOwotCi0JLyogVGhlIHBhdHRlcm4gaXMgd3JpdHRlbiBpbnRvIG1lbW9yeSB0byBnZW5lcmF0ZSBlcnJvciAqLwotCXBhdHRlcm5bMF0gPSAweGZlZGNiYTk4VUw7Ci0JcGF0dGVyblsxXSA9IDB4NzY1NDMyMTBVTDsKLQotCS8qIEFmdGVyIGluamVjdGluZyBlcnJvciwgcmUtaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IHdpdGggdGhlIHZhbHVlICovCi0Jd3JpdGViYWNrWzBdID0gMHgwMTIzNDU2N1VMOwotCXdyaXRlYmFja1sxXSA9IDB4ODlhYmNkZWZVTDsKLQotCWlmIChhcmdjID4gNCkgewotCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmIChhcmdjID09IDIpIHsKLQkJaWYgKHN0cmNtcChhcmd2WzFdLCAic3RhdHVzIikgPT0gMCkgewotCQkJZWNjX3ByaW50X3N0YXR1cygpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJjYXB0dXJlY2xlYXIiKSA9PSAwKSB7Ci0JCQlkZHItPmNhcHR1cmVfYWRkcmVzcyA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZGF0YV9oaSA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZGF0YV9sbyA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZWNjID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzID0gMDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWlmIChhcmdjID09IDMpIHsKLQkJaWYgKHN0cmNtcChhcmd2WzFdLCAic2JlY250IikgPT0gMCkgewotCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOwotCQkJaWYgKHZhbCA+IDI1NSkgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IENvdW50ZXIgdmFsdWUsICIKLQkJCQkgICAgICAgInNob3VsZCBiZSAwLi4yNTVcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQl2YWwgPSAodmFsIDw8IEVDQ19FUlJPUl9NQU5fU0JFQ19TSElGVCk7Ci0JCQl2YWwgfD0gKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFVCk7Ci0KLQkJCWRkci0+ZXJyX3NiZSA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAic2JldGhyIikgPT0gMCkgewotCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOwotCQkJaWYgKHZhbCA+IDI1NSkgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IENvdW50ZXIgdmFsdWUsICIKLQkJCQkgICAgICAgInNob3VsZCBiZSAwLi4yNTVcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQl2YWwgPSAodmFsIDw8IEVDQ19FUlJPUl9NQU5fU0JFVF9TSElGVCk7Ci0JCQl2YWwgfD0gKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFQyk7Ci0KLQkJCWRkci0+ZXJyX3NiZSA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZXJyZGlzYWJsZSIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZXJyX2Rpc2FibGU7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgIitzYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK21iZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfTUJFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrbXNlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9NU0VEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIithbGwiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IChFQ0NfRVJST1JfRElTQUJMRV9TQkVEIHwKLQkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCB8Ci0JCQkJCUVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1zYmUiKSA9PSAwKSB7Ci0JCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9TQkVEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1tYmUiKSA9PSAwKSB7Ci0JCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9NQkVEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1tc2UiKSA9PSAwKSB7Ci0JCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9NU0VEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1hbGwiKSA9PSAwKSB7Ci0JCQkJdmFsICY9IH4oRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCB8Ci0JCQkJCSBFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKLQkJCQkJIEVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBlcnJfZGlzYWJsZSBmaWVsZFxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCWRkci0+ZXJyX2Rpc2FibGUgPSB2YWw7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImVycmRldGVjdGNsciIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZXJyX2RldGVjdDsKLQotCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAibW1lIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01NRTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJzYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfU0JFOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIm1iZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NQkU7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAibXNlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01TRTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJhbGwiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IChFQ0NfRVJST1JfREVURUNUX01NRSB8Ci0JCQkJCUVDQ19FUlJPUl9ERVRFQ1RfTUJFIHwKLQkJCQkJRUNDX0VSUk9SX0RFVEVDVF9TQkUgfAotCQkJCQlFQ0NfRVJST1JfREVURUNUX01TRSk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IGVycl9kZXRlY3QgZmllbGRcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlkZHItPmVycl9kZXRlY3QgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGRhdGFoaSIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKLQotCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfaGkgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGRhdGFsbyIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKLQotCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfbG8gPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGVjYyIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKLQkJCWlmICh2YWwgPiAweGZmKSB7Ci0JCQkJcHJpbnRmKCJJbmNvcnJlY3QgRUNDIGluamVjdCBtYXNrLCAiCi0JCQkJICAgICAgICJzaG91bGQgYmUgMHgwMC4uMHhmZlxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQl2YWwgfD0gKGRkci0+ZWNjX2Vycl9pbmplY3QgJiB+RUNDX0VSUl9JTkpFQ1RfRUVJTSk7Ci0KLQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdCIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKLQkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiZGlzIikgPT0gMCkKLQkJCQl2YWwgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCJJbmNvcnJlY3QgY29tbWFuZFxuIik7Ci0KLQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIm1pcnJvciIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKLQkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRU1COwotCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQotCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRU1COwotCQkJZWxzZQotCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKGFyZ2MgPT0gNCkgewotCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJ0ZXN0ZHciKSA9PSAwKSB7Ci0JCQlhZGRyID0gKHU2NCAqKSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0JCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKLQotCQkJaWYgKCh1MzIpIGFkZHIgJSA4KSB7Ci0JCQkJcHJpbnRmKCJBZGRyZXNzIG5vdCBhbGxpZ25lZCBvbiAiCi0JCQkJICAgICAgICJkb3VibGUgd29yZCBib3VuZGFyeVxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKLQotCQkJZm9yIChpID0gYWRkcjsgaSA8IGFkZHIgKyBjb3VudDsgaSsrKSB7Ci0KLQkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOwotCi0JCQkJLyogd3JpdGUgbWVtb3J5IGxvY2F0aW9uIGluamVjdGluZyBlcnJvcnMgKi8KLQkJCQlwcGNEV3N0b3JlKCh1MzIgKikgaSwgcGF0dGVybik7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQotCQkJCS8qIGRpc2FibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKLQotCQkJCS8qIHJlYWQgZGF0YSwgdGhpcyBnZW5lcmF0ZXMgRUNDIGVycm9yICovCi0JCQkJcHBjRFdsb2FkKCh1MzIgKikgaSwgcmV0KTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCi0JCQkJLyogcmUtaW5pdGlhbGl6ZSBtZW1vcnksIGRvdWJsZSB3b3JkIHdyaXRlIHRoZSBsb2NhdGlvbiBhZ2FpbiwKLQkJCQkgKiBnZW5lcmF0ZXMgbmV3IEVDQyBjb2RlIHRoaXMgdGltZSAqLwotCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCB3cml0ZWJhY2spOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0JCQl9Ci0JCQllbmFibGVfaW50ZXJydXB0cygpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHN0cmNtcChhcmd2WzFdLCAidGVzdHdvcmQiKSA9PSAwKSB7Ci0JCQlhZGRyID0gKHU2NCAqKSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0JCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKLQotCQkJaWYgKCh1MzIpIGFkZHIgJSA4KSB7Ci0JCQkJcHJpbnRmKCJBZGRyZXNzIG5vdCBhbGxpZ25lZCBvbiAiCi0JCQkJICAgICAgICJkb3VibGUgd29yZCBib3VuZGFyeVxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKLQotCQkJZm9yIChpID0gYWRkcjsgaSA8IGFkZHIgKyBjb3VudDsgaSsrKSB7Ci0KLQkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOwotCi0JCQkJLyogd3JpdGUgbWVtb3J5IGxvY2F0aW9uIGluamVjdGluZyBlcnJvcnMgKi8KLQkJCQkqKHUzMiAqKSBpID0gMHhmZWRjYmE5OFVMOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0KLQkJCQkvKiBzdWIgZG91YmxlIHdvcmQgd3JpdGUsCi0JCQkJICogYnVzIHdpbGwgcmVhZC1tb2RpZnktd3JpdGUsCi0JCQkJICogZ2VuZXJhdGVzIEVDQyBlcnJvciAqLwotCQkJCSooKHUzMiAqKSBpICsgMSkgPSAweDc2NTQzMjEwVUw7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQotCQkJCS8qIGRpc2FibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKLQotCQkJCS8qIHJlLWluaXRpYWxpemUgbWVtb3J5LAotCQkJCSAqIGRvdWJsZSB3b3JkIHdyaXRlIHRoZSBsb2NhdGlvbiBhZ2FpbiwKLQkJCQkgKiBnZW5lcmF0ZXMgbmV3IEVDQyBjb2RlIHRoaXMgdGltZSAqLwotCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCB3cml0ZWJhY2spOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0JCQl9Ci0JCQllbmFibGVfaW50ZXJydXB0cygpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwotCXJldHVybiAxOwotfQotCi1VX0JPT1RfQ01EKGVjYywgNCwgMCwgZG9fZWNjLAotCSAgICJlY2MgICAgIC0gc3VwcG9ydCBmb3IgRERSIEVDQyBmZWF0dXJlc1xuIiwKLQkgICAic3RhdHVzICAgICAgICAgICAgICAtIHByaW50IG91dCBzdGF0dXMgaW5mb1xuIgotCSAgICJlY2MgY2FwdHVyZWNsZWFyICAgICAgICAtIGNsZWFyIGNhcHR1cmUgcmVncyBkYXRhXG4iCi0JICAgImVjYyBzYmVjbnQgPHZhbD4gICAgICAgIC0gc2V0IFNpbmdsZS1CaXQgRXJyb3IgY291bnRlclxuIgotCSAgICJlY2Mgc2JldGhyIDx2YWw+ICAgICAgICAtIHNldCBTaW5nbGUtQml0IFRocmVzaG9sZFxuIgotCSAgICJlY2MgZXJyZGlzYWJsZSA8ZmxhZz4gICAtIGNsZWFyL3NldCBkaXNhYmxlIE1lbW9yeSBFcnJvciBEaXNhYmxlLCBmbGFnOlxuIgotCSAgICIgIFstfCtdc2JlIC0gU2luZ2xlLUJpdCBFcnJvclxuIgotCSAgICIgIFstfCtdbWJlIC0gTXVsdGlwbGUtQml0IEVycm9yXG4iCi0JICAgIiAgWy18K11tc2UgLSBNZW1vcnkgU2VsZWN0IEVycm9yXG4iCi0JICAgIiAgWy18K11hbGwgLSBhbGwgZXJyb3JzXG4iCi0JICAgImVjYyBlcnJkZXRlY3RjbHIgPGZsYWc+IC0gY2xlYXIgTWVtb3J5IEVycm9yIERldGVjdCwgZmxhZzpcbiIKLQkgICAiICBtbWUgLSBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzXG4iCi0JICAgIiAgc2JlIC0gU2luZ2xlLUJpdCBFcnJvclxuIgotCSAgICIgIG1iZSAtIE11bHRpcGxlLUJpdCBFcnJvclxuIgotCSAgICIgIG1zZSAtIE1lbW9yeSBTZWxlY3QgRXJyb3JcbiIKLQkgICAiICBhbGwgLSBhbGwgZXJyb3JzXG4iCi0JICAgImVjYyBpbmplY3RkYXRhaGkgPGhpPiAgLSBzZXQgTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoXG4iCi0JICAgImVjYyBpbmplY3RkYXRhbG8gPGxvPiAgLSBzZXQgTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBMb3dcbiIKLQkgICAiZWNjIGluamVjdGVjYyA8ZWNjPiAgICAtIHNldCBFQ0MgRXJyb3IgSW5qZWN0aW9uIE1hc2tcbiIKLQkgICAiZWNjIGluamVjdCA8ZW58ZGlzPiAgICAtIGVuYWJsZS9kaXNhYmxlIGVycm9yIGluamVjdGlvblxuIgotCSAgICJlY2MgbWlycm9yIDxlbnxkaXM+ICAgIC0gZW5hYmxlL2Rpc2FibGUgbWlycm9yIGJ5dGVcbiIKLQkgICAiZWNjIHRlc3RkdyA8YWRkcj4gPGNudD4gIC0gdGVzdCBtZW0gcmVnaW9uIHdpdGggZG91YmxlIHdvcmQgYWNjZXNzOlxuIgotCSAgICIgIC0gZW5hYmxlcyBpbmplY3RzXG4iCi0JICAgIiAgLSB3cml0ZXMgcGF0dGVybiBpbmplY3RpbmcgZXJyb3JzIHdpdGggZG91YmxlIHdvcmQgYWNjZXNzXG4iCi0JICAgIiAgLSBkaXNhYmxlcyBpbmplY3RzXG4iCi0JICAgIiAgLSByZWFkcyBwYXR0ZXJuIGJhY2sgd2l0aCBkb3VibGUgd29yZCBhY2Nlc3MsIGdlbmVyYXRlcyBlcnJvclxuIgotCSAgICIgIC0gcmUtaW5pdHMgbWVtb3J5XG4iCi0JICAgImVjYyB0ZXN0d29yZCA8YWRkcj4gPGNudD4gIC0gdGVzdCBtZW0gcmVnaW9uIHdpdGggd29yZCBhY2Nlc3M6XG4iCi0JICAgIiAgLSBlbmFibGVzIGluamVjdHNcbiIKLQkgICAiICAtIHdyaXRlcyBwYXR0ZXJuIGluamVjdGluZyBlcnJvcnMgd2l0aCB3b3JkIGFjY2Vzc1xuIgotCSAgICIgIC0gd3JpdGVzIHBhdHRlcm4gd2l0aCB3b3JkIGFjY2VzcywgZ2VuZXJhdGVzIGVycm9yXG4iCi0JICAgIiAgLSBkaXNhYmxlcyBpbmplY3RzXG4iICIgIC0gcmUtaW5pdHMgbWVtb3J5Iik7Ci0jZW5kaWYJCQkJLyogaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19DTUQpICovCi0KICNpZiAoZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpKSBcCiAgICAgICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQogCkBAIC02ODEsMTEgKzMwNCwxMSBAQAogCWludCBub2Rlb2Zmc2V0OwogCWludCB0bXBbMl07CiAKLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvbWVtb3J5Iik7CisJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aChibG9iLCAiL21lbW9yeSIpOwogCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKIAkJdG1wWzBdID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXN0YXJ0KTsKIAkJdG1wWzFdID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXNpemUpOwotCQlmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJyZWciLCB0bXAsIHNpemVvZih0bXApKTsKKwkJZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgInJlZyIsIHRtcCwgc2l6ZW9mKHRtcCkpOwogCX0KICNlbHNlCiAJdTMyICpwOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM2MGVtZHMvcGNpLmMgYi9ib2FyZC9tcGM4MzYwZW1kcy9wY2kuYwppbmRleCAxNThlZmZlLi44ZjkwNDcxIDEwMDY0NAotLS0gYS9ib2FyZC9tcGM4MzYwZW1kcy9wY2kuYworKysgYi9ib2FyZC9tcGM4MzYwZW1kcy9wY2kuYwpAQCAtMjAsOCArMjAsNyBAQAogI2luY2x1ZGUgPGkyYy5oPgogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKICNpbmNsdWRlIDxmdF9idWlsZC5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorI2VsaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQogI2luY2x1ZGUgPGxpYmZkdC5oPgogI2luY2x1ZGUgPGxpYmZkdF9lbnYuaD4KICNlbmRpZgpAQCAtMjA3LDcgKzIwNiw3IEBACiAKIAkvKiBTd2l0Y2ggdGVtcG9yYXJpbHkgdG8gSTJDIGJ1cyAjMiAqLwogCW9yaWdfaTJjX2J1cyA9IGkyY19nZXRfYnVzX251bSgpOwotIAlpMmNfc2V0X2J1c19udW0oMSk7CisJaTJjX3NldF9idXNfbnVtKDEpOwogCiAJdmFsOCA9IDA7CiAJaTJjX3dyaXRlKDB4MjMsIDB4NiwgMSwgJnZhbDgsIDEpOwpAQCAtMzExLDI2ICszMTAsMjUgQEAKIAlpbnQgZXJyOwogCWludCB0bXBbMl07CiAKLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvIiBPRl9TT0MgIi9wY2lAODUwMCIpOworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGgoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUA4NTAwIik7CiAJaWYgKG5vZGVvZmZzZXQgPj0gMCkgewogCQl0bXBbMF0gPSBjcHVfdG9fYmUzMihob3NlWzBdLmZpcnN0X2J1c25vKTsKIAkJdG1wWzFdID0gY3B1X3RvX2JlMzIoaG9zZVswXS5sYXN0X2J1c25vKTsKLQkJZXJyID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCAiYnVzLXJhbmdlIiwgdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJidXMtcmFuZ2UiLCB0bXAsIHNpemVvZih0bXApKTsKIAl9CiB9Ci0jZW5kaWYJCQkJLyogQ09ORklHX09GX0xJQkZEVCAqLwotI2lmZGVmIENPTkZJR19PRl9GTEFUX1RSRUUKKyNlbGlmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKIHZvaWQKIGZ0X3BjaV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKIHsKLSAgICAgICAJdTMyICpwOwotICAgICAgIAlpbnQgbGVuOworCXUzMiAqcDsKKwlpbnQgbGVuOwogCi0gICAgICAgCXAgPSAodTMyICopZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUA4NTAwL2J1cy1yYW5nZSIsICZsZW4pOwotICAgICAgIAlpZiAocCAhPSBOVUxMKSB7CisJcCA9ICh1MzIgKilmdF9nZXRfcHJvcChibG9iLCAiLyIgT0ZfU09DICIvcGNpQDg1MDAvYnVzLXJhbmdlIiwgJmxlbik7CisJaWYgKHAgIT0gTlVMTCkgewogCQlwWzBdID0gaG9zZVswXS5maXJzdF9idXNubzsKIAkJcFsxXSA9IGhvc2VbMF0ubGFzdF9idXNubzsKLSAgICAgICAJfQorCX0KIH0KICNlbmRpZgkJCQkvKiBDT05GSUdfT0ZfRkxBVF9UUkVFICovCiAjZW5kaWYJCQkJLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM2MGVtZHMvdS1ib290LmxkcyBiL2JvYXJkL21wYzgzNjBlbWRzL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2M4N2EuLjAwMDAwMDAKLS0tIGEvYm9hcmQvbXBjODM2MGVtZHMvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDA2Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NTYwYWRzL21wYzg1NjBhZHMuYyBiL2JvYXJkL21wYzg1NjBhZHMvbXBjODU2MGFkcy5jCmluZGV4IGQxOWJhZDYuLmVlZjUyNGIgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzg1NjBhZHMvbXBjODU2MGFkcy5jCisrKyBiL2JvYXJkL21wYzg1NjBhZHMvbXBjODU2MGFkcy5jCkBAIC01NTAsOCArNTUwLDMzIEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQogdm9pZAorZnRfc29jX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCXUzMiAqcDsKKwlpbnQgbGVuOworCisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9jcG1AZTAwMDAwMDAvYnJnLWZyZXF1ZW5jeSIsICZsZW4pOworCisJaWYgKHAgIT0gTlVMTCkKKwkJKnAgPSBjcHVfdG9fYmUzMihiZC0+YmlfYnJnZnJlcSk7CisKKwlwID0gZnRfZ2V0X3Byb3AoYmxvYiwKKwkJCSIvIiBPRl9TT0MgIi9jcG1AZTAwMDAwMDAvc2NjQDkxYTAwL2N1cnJlbnQtc3BlZWQiLAorCQkJJmxlbik7CisJaWYgKHAgIT0gTlVMTCkKKwkJKnAgPSBjcHVfdG9fYmUzMihiZC0+YmlfYmF1ZHJhdGUpOworCisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsCisJCQkiLyIgT0ZfU09DICIvY3BtQGUwMDAwMDAwL3NjY0A5MWEyMC9jdXJyZW50LXNwZWVkIiwKKwkJCSZsZW4pOworCWlmIChwICE9IE5VTEwpCisJCSpwID0gY3B1X3RvX2JlMzIoYmQtPmJpX2JhdWRyYXRlKTsKK30KKwordm9pZAogZnRfYm9hcmRfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCiB7CiAJZnRfY3B1X3NldHVwKGJsb2IsIGJkKTsKKwlmdF9zb2Nfc2V0dXAoYmxvYiwgYmQpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NTY4bWRzL2Jjc3IuYyBiL2JvYXJkL21wYzg1NjhtZHMvYmNzci5jCmluZGV4IDJlMmU4Y2QuLmFhZTBmOTggMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzg1NjhtZHMvYmNzci5jCisrKyBiL2JvYXJkL21wYzg1NjhtZHMvYmNzci5jCkBAIC00NywzICs0NywxMCBAQAogCiAJYmNzcls5XSAmPSB+KDB4MDEpOwogfQorCit2b2lkIGVuYWJsZV84NTY4bWRzX3FlX21kaW8oKQoreworCXU4ICpiY3NyID0gKHU4ICopKENGR19CQ1NSKTsKKworCWJjc3JbN10gfD0gMHgwMTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL21wYzg1NjhtZHMvYmNzci5oIGIvYm9hcmQvbXBjODU2OG1kcy9iY3NyLmgKaW5kZXggOGQ0Y2IyZi4uYWVmZDliZiAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODU2OG1kcy9iY3NyLmgKKysrIGIvYm9hcmQvbXBjODU2OG1kcy9iY3NyLmgKQEAgLTk1LDUgKzk1LDYgQEAKIHZvaWQgZW5hYmxlXzg1NjhtZHNfZHVhcnQodm9pZCk7CiB2b2lkIGVuYWJsZV84NTY4bWRzX2ZsYXNoX3dyaXRlKHZvaWQpOwogdm9pZCBkaXNhYmxlXzg1NjhtZHNfZmxhc2hfd3JpdGUodm9pZCk7Cit2b2lkIGVuYWJsZV84NTY4bWRzX3FlX21kaW8odm9pZCk7CiAKICNlbmRpZgkvKiBfX0JDU1JfSF8gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL21wYzg1NjhtZHMvaW5pdC5TIGIvYm9hcmQvbXBjODU2OG1kcy9pbml0LlMKaW5kZXggMGQ4Nzk4Mi4uOTcyYTdkNCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODU2OG1kcy9pbml0LlMKKysrIGIvYm9hcmQvbXBjODU2OG1kcy9pbml0LlMKQEAgLTE0Myw1NCArMTQzLDQyIEBACiAJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfRkxBU0hfQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQmUgMjoJMjU2TQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCi0JICogMHg4MDAwMDAwMAkyNTZNCVBDSTEgTUVNCisJICogVExCZSAyOgkxRwlOb24tY2FjaGVhYmxlLCBndWFyZGVkCisJICogMHg4MDAwMDAwMAk1MTJNCVBDSTEgTUVNCisJICogMHhhMDAwMDAwMCAJNTEyTQlQQ0llIE1FTQogCSAqLwogCS5sb25nIFRMQjFfTUFTMCgxLCAyLCAwKQotCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfMjU2TSkKKwkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzFHKQogCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX1BDSTFfTUVNX0JBU0UpLCAwLDAsMCwwLDEsMCwxLDApCiAJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfUENJMV9NRU1fQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQmUgMzoJMjU2TQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCi0JICogMHhhMDAwMDAwMAkyNTZNCVBDSWUgTWVtCi0JICovCi0JLmxvbmcgVExCMV9NQVMwKDEsIDMsIDApCi0JLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8yNTZNKQotCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX1BFWF9NRU1fQkFTRSksIDAsMCwwLDAsMSwwLDEsMCkKLQkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19QRVhfTUVNX0JBU0UpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQotCi0JLyoKLQkgKiBUTEJlIDQ6CVJlc2VydmVkIGZvciBmdXR1cmUgdXNhZ2UKLQkgKi8KLQotCS8qCi0JICogVExCZSA1Ogk2NE0JTm9uLWNhY2hlYWJsZSwgZ3VhcmRlZAorCSAqIFRMQmUgMzoJNjRNCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKIAkgKiAweGUwMDBfMDAwMAkxTQlDQ1NSQkFSCiAJICogMHhlMjAwXzAwMDAJOE0JUENJMSBJTwogCSAqIDB4ZTI4MF8wMDAwCThNCVBDSWUgSU8KIAkgKi8KLQkubG9uZyBUTEIxX01BUzAoMSwgNSwgMCkKKwkubG9uZyBUTEIxX01BUzAoMSwgMywgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzY0TSkKIAkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19DQ1NSQkFSKSwgMCwwLDAsMCwxLDAsMSwwKQogCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX0NDU1JCQVIpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQogCiAJLyoKLQkgKiBUTEJlIDY6CTY0TQlDYWNoZWFibGUsIG5vbi1ndWFyZGVkCisJICogVExCZSA0Ogk2NE0JQ2FjaGVhYmxlLCBub24tZ3VhcmRlZAogCSAqIDB4ZjAwMF8wMDAwCTY0TQlMQkMgU0RSQU0KIAkgKi8KLQkubG9uZyBUTEIxX01BUzAoMSwgNiwgMCkKKwkubG9uZyBUTEIxX01BUzAoMSwgNCwgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzY0TSkKIAkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19MQkNfU0RSQU1fQkFTRSksIDAsMCwwLDAsMCwwLDAsMCkKIAkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19MQkNfU0RSQU1fQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQmUgNzoJMjU2SwlOb24tY2FjaGVhYmxlLCBndWFyZGVkCisJICogVExCZSA1OgkyNTZLCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKIAkgKiAweGY4MDAwMDAwCTMySyBCQ1NSCiAJICogMHhmODAwODAwMAkzMksgUElCIChDUzQpCiAJICogMHhmODAxMDAwMAkzMksgUElCIChDUzUpCiAJICovCi0JLmxvbmcgVExCMV9NQVMwKDEsIDcsIDApCisJLmxvbmcgVExCMV9NQVMwKDEsIDUsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8yNTZLKQogCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX0JDU1JfQkFTRSksIDAsMCwwLDAsMSwwLDEsMCkKIAkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19CQ1NSX0JBU0UpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQpAQCAtMjAyLDEyICsxOTAsMTIgQEAKICAqIExBVyhMb2NhbCBBY2Nlc3MgV2luZG93KSBjb25maWd1cmF0aW9uOgogICoKICAqMCkgICAweDAwMDBfMDAwMCAgIDB4N2ZmZl9mZmZmICAgICBERFIgICAgICAgICAgICAgICAgICAgICAyRwotICoxKSAgIDB4ODAwMF8wMDAwICAgMHg5ZmZmX2ZmZmYgICAgIFBDSTEgTUVNICAgICAgICAgICAgICAgIDI1Nk1CCi0gKjIpICAgMHhhMDAwXzAwMDAgICAweGJmZmZfZmZmZiAgICAgUENJZSBNRU0gICAgICAgICAgICAgICAgMjU2TUIKLSAqNSkgICAweGMwMDBfMDAwMCAgIDB4ZGZmZl9mZmZmICAgICBTUklPICAgICAgICAgICAgICAgICAgICAyNTZNQgorICoxKSAgIDB4ODAwMF8wMDAwICAgMHg5ZmZmX2ZmZmYgICAgIFBDSTEgTUVNICAgICAgICAgICAgICAgIDUxMk1CCisgKjIpICAgMHhhMDAwXzAwMDAgICAweGJmZmZfZmZmZiAgICAgUENJZSBNRU0gICAgICAgICAgICAgICAgNTEyTUIKICAqLSkgICAweGUwMDBfMDAwMCAgIDB4ZTAwZl9mZmZmICAgICBDQ1NSICAgICAgICAgICAgICAgICAgICAxTQogICozKSAgIDB4ZTIwMF8wMDAwICAgMHhlMjdmX2ZmZmYgICAgIFBDSTEgSS9PICAgICAgICAgICAgICAgIDhNCi0gKjQpICAgMHhlMjgwXzAwMDAgICAweGUyZmZfZmZmZiAgICAgUENJZSBJLzAgICAgICAgICAgICAgICAgOE0KKyAqNCkgICAweGUyODBfMDAwMCAgIDB4ZTJmZl9mZmZmICAgICBQQ0llIEkvTyAgICAgICAgICAgICAgICA4TQorICo1KSAgIDB4YzAwMF8wMDAwICAgMHhkZmZmX2ZmZmYgICAgIFNSSU8gICAgICAgICAgICAgICAgICAgIDUxMk1CCiAgKjYuYSkgMHhmMDAwXzAwMDAgICAweGYzZmZfZmZmZiAgICAgU0RSQU0gICAgICAgICAgICAgICAgICAgNjRNQgogICo2LmIpIDB4ZjgwMF8wMDAwICAgMHhmODAwXzdmZmYgICAgIEJDU1IgICAgICAgICAgICAgICAgICAgIDMyS0IKICAqNi5jKSAweGY4MDBfODAwMCAgIDB4ZjgwMF9mZmZmICAgICBQSUIgKENTNCkJCSAgICAgMzJLQgpAQCAtMjI2LDIwICsyMTQsMjAgQEAKICNkZWZpbmUgTEFXQVIwICAoKExBV0FSX1RSR1RfSUZfRERSIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzEyOE0pKSAmIH5MQVdBUl9FTikKIAogI2RlZmluZSBMQVdCQVIxICgoQ0ZHX1BDSTFfTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSMQkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCisjZGVmaW5lIExBV0FSMQkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpCiAKICNkZWZpbmUgTEFXQkFSMiAoKENGR19QRVhfTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSMgkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BFWCB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKSkKKyNkZWZpbmUgTEFXQVIyCShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUEVYIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pKQogCiAjZGVmaW5lIExBV0JBUjMgKChDRkdfUENJMV9JT19QSFlTPj4xMikgJiAweGZmZmZmKQogI2RlZmluZSBMQVdBUjMJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QQ0kxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzhNKSkKIAogI2RlZmluZSBMQVdCQVI0ICgoQ0ZHX1BFWF9JT19QSFlTPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjQgIChMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUEVYIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzE2TSkpCisjZGVmaW5lIExBV0FSNCAgKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QRVggfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfOE0pKQogCiAKICNkZWZpbmUgTEFXQkFSNSAoKENGR19TUklPX01FTV9CQVNFPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjUJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9SSU8gfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCisjZGVmaW5lIExBV0FSNQkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1JJTyB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKSkKIAogLyogTEJDIHdpbmRvdyAtIG1hcHMgMjU2TS4gIFRoYXQncyBTRFJBTSwgQkNTUiwgUElCcywgYW5kIEZsYXNoICovCiAjZGVmaW5lIExBV0JBUjYgKChDRkdfTEJDX1NEUkFNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NTY4bWRzL21wYzg1NjhtZHMuYyBiL2JvYXJkL21wYzg1NjhtZHMvbXBjODU2OG1kcy5jCmluZGV4IDljNzk2MGQuLjgxOGZmMTMgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzg1NjhtZHMvbXBjODU2OG1kcy5jCisrKyBiL2JvYXJkL21wYzg1NjhtZHMvbXBjODU2OG1kcy5jCkBAIC0yNyw5ICsyNyw2NiBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaW1tYXBfODV4eC5oPgogI2luY2x1ZGUgPHNwZC5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGlvcG9ydHMuaD4KIAogI2luY2x1ZGUgImJjc3IuaCIKIAorY29uc3QgcWVfaW9wX2NvbmZfdCBxZV9pb3BfY29uZl90YWJbXSA9IHsKKwkvKiBHRVRIMSAqLworCXs0LCAxMCwgMSwgMCwgMn0sIC8qIFR4RDAgKi8KKwl7NCwgIDksIDEsIDAsIDJ9LCAvKiBUeEQxICovCisJezQsICA4LCAxLCAwLCAyfSwgLyogVHhEMiAqLworCXs0LCAgNywgMSwgMCwgMn0sIC8qIFR4RDMgKi8KKwl7NCwgMjMsIDEsIDAsIDJ9LCAvKiBUeEQ0ICovCisJezQsIDIyLCAxLCAwLCAyfSwgLyogVHhENSAqLworCXs0LCAyMSwgMSwgMCwgMn0sIC8qIFR4RDYgKi8KKwl7NCwgMjAsIDEsIDAsIDJ9LCAvKiBUeEQ3ICovCisJezQsIDE1LCAyLCAwLCAyfSwgLyogUnhEMCAqLworCXs0LCAxNCwgMiwgMCwgMn0sIC8qIFJ4RDEgKi8KKwl7NCwgMTMsIDIsIDAsIDJ9LCAvKiBSeEQyICovCisJezQsIDEyLCAyLCAwLCAyfSwgLyogUnhEMyAqLworCXs0LCAyOSwgMiwgMCwgMn0sIC8qIFJ4RDQgKi8KKwl7NCwgMjgsIDIsIDAsIDJ9LCAvKiBSeEQ1ICovCisJezQsIDI3LCAyLCAwLCAyfSwgLyogUnhENiAqLworCXs0LCAyNiwgMiwgMCwgMn0sIC8qIFJ4RDcgKi8KKwl7NCwgMTEsIDEsIDAsIDJ9LCAvKiBUWF9FTiAqLworCXs0LCAyNCwgMSwgMCwgMn0sIC8qIFRYX0VSICovCisJezQsIDE2LCAyLCAwLCAyfSwgLyogUlhfRFYgKi8KKwl7NCwgMzAsIDIsIDAsIDJ9LCAvKiBSWF9FUiAqLworCXs0LCAxNywgMiwgMCwgMn0sIC8qIFJYX0NMSyAqLworCXs0LCAxOSwgMSwgMCwgMn0sIC8qIEdUWF9DTEsgKi8KKwl7MSwgMzEsIDIsIDAsIDN9LCAvKiBHVFgxMjUgKi8KKworCS8qIEdFVEgyICovCisJezUsIDEwLCAxLCAwLCAyfSwgLyogVHhEMCAqLworCXs1LCAgOSwgMSwgMCwgMn0sIC8qIFR4RDEgKi8KKwl7NSwgIDgsIDEsIDAsIDJ9LCAvKiBUeEQyICovCisJezUsICA3LCAxLCAwLCAyfSwgLyogVHhEMyAqLworCXs1LCAyMywgMSwgMCwgMn0sIC8qIFR4RDQgKi8KKwl7NSwgMjIsIDEsIDAsIDJ9LCAvKiBUeEQ1ICovCisJezUsIDIxLCAxLCAwLCAyfSwgLyogVHhENiAqLworCXs1LCAyMCwgMSwgMCwgMn0sIC8qIFR4RDcgKi8KKwl7NSwgMTUsIDIsIDAsIDJ9LCAvKiBSeEQwICovCisJezUsIDE0LCAyLCAwLCAyfSwgLyogUnhEMSAqLworCXs1LCAxMywgMiwgMCwgMn0sIC8qIFJ4RDIgKi8KKwl7NSwgMTIsIDIsIDAsIDJ9LCAvKiBSeEQzICovCisJezUsIDI5LCAyLCAwLCAyfSwgLyogUnhENCAqLworCXs1LCAyOCwgMiwgMCwgMn0sIC8qIFJ4RDUgKi8KKwl7NSwgMjcsIDIsIDAsIDN9LCAvKiBSeEQ2ICovCisJezUsIDI2LCAyLCAwLCAyfSwgLyogUnhENyAqLworCXs1LCAxMSwgMSwgMCwgMn0sIC8qIFRYX0VOICovCisJezUsIDI0LCAxLCAwLCAyfSwgLyogVFhfRVIgKi8KKwl7NSwgMTYsIDIsIDAsIDJ9LCAvKiBSWF9EViAqLworCXs1LCAzMCwgMiwgMCwgMn0sIC8qIFJYX0VSICovCisJezUsIDE3LCAyLCAwLCAyfSwgLyogUlhfQ0xLICovCisJezUsIDE5LCAxLCAwLCAyfSwgLyogR1RYX0NMSyAqLworCXsxLCAzMSwgMiwgMCwgM30sIC8qIEdUWDEyNSAqLworCXs0LCAgNiwgMywgMCwgMn0sIC8qIE1ESU8gKi8KKwl7NCwgIDUsIDEsIDAsIDJ9LCAvKiBNREMgKi8KKwl7MCwgIDAsIDAsIDAsIFFFX0lPUF9UQUJfRU5EfSwgLyogRU5EIG9mIHRhYmxlICovCit9OworCiAKICNpZiBkZWZpbmVkKENPTkZJR19ERFJfRUNDKSAmJiAhZGVmaW5lZChDT05GSUdfRUNDX0lOSVRfVklBX0REUkNPTlRST0xMRVIpCiBleHRlcm4gdm9pZCBkZHJfZW5hYmxlX2VjYyh1bnNpZ25lZCBpbnQgZHJhbV9zaXplKTsKQEAgLTQ5LDYgKzEwNiwxOCBAQAogCiAJZW5hYmxlXzg1NjhtZHNfZHVhcnQoKTsKIAllbmFibGVfODU2OG1kc19mbGFzaF93cml0ZSgpOworI2lmIGRlZmluZWQoQ09ORklHX1FFKSAmJiAhZGVmaW5lZChDT05GSUdfZVRTRUNfTURJT19CVVMpCisJZW5hYmxlXzg1NjhtZHNfcWVfbWRpbygpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfSTJDMl9PRkZTRVQKKwkvKiBFbmFibGUgSTJDMl9TQ0wgYW5kIEkyQzJfU0RBICovCisJdm9sYXRpbGUgc3RydWN0IHBhcl9pbyAqcG9ydF9jOworCXBvcnRfYyA9IChzdHJ1Y3QgcGFyX2lvKikoQ0ZHX0lNTVIgKyAweGUwMTQwKTsKKwlwb3J0X2MtPmNwZGlyMiB8PSAweDBmMDAwMDAwOworCXBvcnRfYy0+Y3BwYXIyICY9IH4weDBmMDAwMDAwOworCXBvcnRfYy0+Y3BwYXIyIHw9IDB4MGEwMDAwMDA7CisjZW5kaWYKIAogCXJldHVybiAwOwogfQpAQCAtMjY5LDIwICszMzgsNjIgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2VbXSA9IHsKKwl7CiAjaWZuZGVmIENPTkZJR19QQ0lfUE5QCi0JeyBjb25maWdfdGFibGU6IHBjaV9tcGM4NTY4bWRzX2NvbmZpZ190YWJsZSx9LAorCWNvbmZpZ190YWJsZTogcGNpX21wYzg1NjhtZHNfY29uZmlnX3RhYmxlLAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX01QQzg1WFhfUENJMgotCXt9LAotI2VuZGlmCisJfQogfTsKIAogI2VuZGlmCS8qIENPTkZJR19QQ0kgKi8KIAorLyoKKyAqIHBpYl9pbml0KCkgLS0gSW5pdGlhbGl6ZSB0aGUgUENBOTU1NSBJTyBleHBhbmRlciBvbiB0aGUgUElCIGJvYXJkCisgKi8KK3ZvaWQKK3BpYl9pbml0KHZvaWQpCit7CisJdTggdmFsOCwgb3JpZ19pMmNfYnVzOworCS8qCisJICogQXNzaWduIFBJQiBQTUMyLzMgdG8gUENJIGJ1cworCSAqLworCisJLypzd2l0Y2ggdGVtcG9yYXJpbHkgdG8gSTJDIGJ1cyAjMiAqLworCW9yaWdfaTJjX2J1cyA9IGkyY19nZXRfYnVzX251bSgpOworCWkyY19zZXRfYnVzX251bSgxKTsKKworCXZhbDggPSAweDAwOworCWkyY193cml0ZSgweDIzLCAweDYsIDEsICZ2YWw4LCAxKTsKKwlpMmNfd3JpdGUoMHgyMywgMHg3LCAxLCAmdmFsOCwgMSk7CisJdmFsOCA9IDB4ZmY7CisJaTJjX3dyaXRlKDB4MjMsIDB4MiwgMSwgJnZhbDgsIDEpOworCWkyY193cml0ZSgweDIzLCAweDMsIDEsICZ2YWw4LCAxKTsKKworCXZhbDggPSAweDAwOworCWkyY193cml0ZSgweDI2LCAweDYsIDEsICZ2YWw4LCAxKTsKKwl2YWw4ID0gMHgzNDsKKwlpMmNfd3JpdGUoMHgyNiwgMHg3LCAxLCAmdmFsOCwgMSk7CisJdmFsOCA9IDB4Zjk7CisJaTJjX3dyaXRlKDB4MjYsIDB4MiwgMSwgJnZhbDgsIDEpOworCXZhbDggPSAweGZmOworCWkyY193cml0ZSgweDI2LCAweDMsIDEsICZ2YWw4LCAxKTsKKworCXZhbDggPSAweDAwOworCWkyY193cml0ZSgweDI3LCAweDYsIDEsICZ2YWw4LCAxKTsKKwlpMmNfd3JpdGUoMHgyNywgMHg3LCAxLCAmdmFsOCwgMSk7CisJdmFsOCA9IDB4ZmY7CisJaTJjX3dyaXRlKDB4MjcsIDB4MiwgMSwgJnZhbDgsIDEpOworCXZhbDggPSAweGVmOworCWkyY193cml0ZSgweDI3LCAweDMsIDEsICZ2YWw4LCAxKTsKKworCWFzbSgiZWllaW8iKTsKK30KKwogdm9pZAogcGNpX2luaXRfYm9hcmQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUENJCi0JcGNpX21wYzg1eHhfaW5pdCgmaG9zZSk7CisJcGliX2luaXQoKTsKKwlwY2lfbXBjODV4eF9pbml0KGhvc2UpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NjQxaHBjbi9tcGM4NjQxaHBjbi5jIGIvYm9hcmQvbXBjODY0MWhwY24vbXBjODY0MWhwY24uYwppbmRleCA3ZDdlMmFmLi4xYmZiZTg4IDEwMDY0NAotLS0gYS9ib2FyZC9tcGM4NjQxaHBjbi9tcGM4NjQxaHBjbi5jCisrKyBiL2JvYXJkL21wYzg2NDFocGNuL21wYzg2NDFocGNuLmMKQEAgLTExLDcgKzExLDcgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8cGNpLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF84Nnh4Lmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwX2ZzbF9wY2kuaD4KICNpbmNsdWRlIDxzcGQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtNTUsMzYgKzU2LDYgQEAKIHsKIAlwdXRzKCJCb2FyZDogTVBDODY0MUhQQ05cbiIpOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCi0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfQ0NTUkJBUjsKLQl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKLQl2b2xhdGlsZSBjY3NyX3BleF90ICpwZXgxID0gJmltbWFwLT5pbV9wZXgxOwotCi0JdWludCBkZXZkaXNyID0gZ3VyLT5kZXZkaXNyOwotCXVpbnQgaW9fc2VsID0gKGd1ci0+cG9yZGV2c3IgJiBNUEM4Nnh4X1BPUkRFVlNSX0lPX1NFTCkgPj4gMTY7Ci0JdWludCBob3N0MV9hZ2VudCA9IChndXItPnBvcmJtc3IgJiBNUEM4Nnh4X1BPUkJNU1JfSEEpID4+IDE3OwotCXVpbnQgcGV4MV9hZ2VudCA9IChob3N0MV9hZ2VudCA9PSAwKSB8fCAoaG9zdDFfYWdlbnQgPT0gMSk7Ci0KLQlpZiAoKGlvX3NlbCA9PSAyIHx8IGlvX3NlbCA9PSAzIHx8IGlvX3NlbCA9PSA1Ci0JICAgICB8fCBpb19zZWwgPT0gNiB8fCBpb19zZWwgPT0gNyB8fCBpb19zZWwgPT0gMHhGKQotCSAgICAmJiAhKGRldmRpc3IgJiBNUEM4Nnh4X0RFVkRJU1JfUENJRVgxKSkgewotCQlkZWJ1ZygiUENJLUVYUFJFU1MgMTogJXMgXG4iLCBwZXgxX2FnZW50ID8gIkFnZW50IiA6ICJIb3N0Iik7Ci0JCWRlYnVnKCIweCUwOHg9MHglMDh4ICIsICZwZXgxLT5wbWVfbXNnX2RldCwgcGV4MS0+cG1lX21zZ19kZXQpOwotCQlpZiAocGV4MS0+cG1lX21zZ19kZXQpIHsKLQkJCXBleDEtPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKLQkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAotCQkJICAgICAgcGV4MS0+cG1lX21zZ19kZXQpOwotCQl9Ci0JCWRlYnVnKCJcbiIpOwotCX0gZWxzZSB7Ci0JCXB1dHMoIlBDSS1FWFBSRVNTIDE6IERpc2FibGVkXG4iKTsKLQl9Ci0KLSNlbHNlCi0JcHV0cygiUENJLUVYUFJFU1MxOiBEaXNhYmxlZFxuIik7Ci0jZW5kaWYKLQogCXJldHVybiAwOwogfQogCkBAIC0yMTksMjEgKzE5MCwxMzggQEAKICNlbmRpZgogCiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMV9ob3NlID0gewogI2lmbmRlZiBDT05GSUdfUENJX1BOUAotICAgICAgY29uZmlnX3RhYmxlOnBjaV9tcGM4Nnh4Y3RzX2NvbmZpZ190YWJsZSwKKwljb25maWdfdGFibGU6cGNpX21wYzg2eHhjdHNfY29uZmlnX3RhYmxlCiAjZW5kaWYKIH07Ci0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKKyNpZmRlZiBDT05GSUdfUENJMgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kyX2hvc2U7CisjZW5kaWYJLyogQ09ORklHX1BDSTIgKi8KKworaW50IGZpcnN0X2ZyZWVfYnVzbm8gPSAwOworCisKIHZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUENJCi0JZXh0ZXJuIHZvaWQgcGNpX21wYzg2eHhfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0NDU1JCQVI7CisJdm9sYXRpbGUgY2Nzcl9ndXJfdCAqZ3VyID0gJmltbWFwLT5pbV9ndXI7CisJdWludCBkZXZkaXNyID0gZ3VyLT5kZXZkaXNyOworCXVpbnQgaW9fc2VsID0gKGd1ci0+cG9yZGV2c3IgJiBNUEM4Nnh4X1BPUkRFVlNSX0lPX1NFTCkgPj4gMTY7CiAKLQlwY2lfbXBjODZ4eF9pbml0KCZob3NlKTsKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisjaWZkZWYgQ09ORklHX1BDSTEKK3sKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0kxX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaTFfaG9zZTsKKyNpZmRlZiBERUJVRworCXVpbnQgaG9zdDFfYWdlbnQgPSAoZ3VyLT5wb3JibXNyICYgTVBDODZ4eF9QT1JCTVNSX0hBKSA+PiAxNzsKKwl1aW50IHBleDFfYWdlbnQgPSAoaG9zdDFfYWdlbnQgPT0gMCkgfHwgKGhvc3QxX2FnZW50ID09IDEpOworI2VuZGlmCisJaWYgKChpb19zZWwgPT0gMiB8fCBpb19zZWwgPT0gMyB8fCBpb19zZWwgPT0gNQorCSAgICAgfHwgaW9fc2VsID09IDYgfHwgaW9fc2VsID09IDcgfHwgaW9fc2VsID09IDB4RikKKwkgICAgJiYgIShkZXZkaXNyICYgTVBDODZ4eF9ERVZESVNSX1BDSUVYMSkpIHsKKwkJZGVidWcoIlBDSS1FWFBSRVNTIDE6ICVzIFxuIiwgcGV4MV9hZ2VudCA/ICJBZ2VudCIgOiAiSG9zdCIpOworCQlkZWJ1ZygiMHglMDh4PTB4JTA4eCAiLCAmcGNpLT5wbWVfbXNnX2RldCwgcGNpLT5wbWVfbXNnX2RldCk7CisJCWlmIChwY2ktPnBtZV9tc2dfZGV0KSB7CisJCQlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAorCQkJICAgICAgcGNpLT5wbWVfbXNnX2RldCk7CisJCX0KKwkJZGVidWcoIlxuIik7CisKKwkJLyogaW5ib3VuZCAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfUEhZUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkJLyogb3V0Ym91bmQgaW8gKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9JT19QSFlTLAorCQkJICAgICAgIENGR19QQ0kxX0lPX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKworCQlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCQlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKGludCkgJnBjaS0+Y2ZnX2FkZHIsIChpbnQpICZwY2ktPmNmZ19kYXRhKTsKKworCQlmc2xfcGNpX2luaXQoaG9zZSk7CisKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZiAoIiAgICBQQ0ktRVhQUkVTUyAxIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJCWhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCisJCS8qCisJCSAqIEFjdGl2YXRlIFVMSTE1NzUgbGVnYWN5IGNoaXAgYnkgcGVyZm9ybWluZyBhIGZha2UKKwkJICogbWVtb3J5IGFjY2Vzcy4gIE5lZWRlZCB0byBtYWtlIFVMSSBSVEMgd29yay4KKwkJICovCisJCWluX2JlMzIoKHVuc2lnbmVkICopICgoY2hhciAqKShDRkdfUENJMV9NRU1fQkFTRQorCQkJCSAgICAgICArIENGR19QQ0kxX01FTV9TSVpFIC0gMHgxMDAwMDAwKSkpOworCisJfSBlbHNlIHsKKwkJcHV0cygiUENJLUVYUFJFU1MgMTogRGlzYWJsZWRcbiIpOworCX0KK30KKyNlbHNlCisJcHV0cygiUENJLUVYUFJFU1MxOiBEaXNhYmxlZFxuIik7CisjZW5kaWYgLyogQ09ORklHX1BDSTEgKi8KKworI2lmZGVmIENPTkZJR19QQ0kyCit7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJMl9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2kyX2hvc2U7CisKKworCS8qIGluYm91bmQgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKKwkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJICAgICAgIENGR19QQ0kyX01FTV9CQVNFLAorCQkgICAgICAgQ0ZHX1BDSTJfTUVNX1BIWVMsCisJCSAgICAgICBDRkdfUENJMl9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIG91dGJvdW5kIGlvICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCSAgICAgICBDRkdfUENJMl9JT19CQVNFLAorCQkgICAgICAgQ0ZHX1BDSTJfSU9fUEhZUywKKwkJICAgICAgIENGR19QQ0kyX0lPX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisKKwlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJZnNsX3BjaV9pbml0KGhvc2UpOworCisJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJcHJpbnRmICgiICAgIFBDSS1FWFBSRVNTIDIgb24gYnVzICUwMnggLSAlMDJ4XG4iLAorCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKK30KKyNlbHNlCisJcHV0cygiUENJLUVYUFJFU1MgMjogRGlzYWJsZWRcbiIpOworI2VuZGlmIC8qIENPTkZJR19QQ0kyICovCisKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NjQxaHBjbi9zeXNfZWVwcm9tLmMgYi9ib2FyZC9tcGM4NjQxaHBjbi9zeXNfZWVwcm9tLmMKaW5kZXggNzRlMmEzZC4uN2JjNjYzYiAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODY0MWhwY24vc3lzX2VlcHJvbS5jCisrKyBiL2JvYXJkL21wYzg2NDFocGNuL3N5c19lZXByb20uYwpAQCAtNjgsNyArNjgsNyBAQAogCSAgICAgICBtYWNfZGF0YS5kYXRlWzVdLAogCSAgICAgICBtYWNfZGF0YS5kYXRlWzZdKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNwcmludGYoZXRoYWRkcltpXSwKKwkJc3ByaW50ZigoY2hhciAqKWV0aGFkZHJbaV0sCiAJCQkiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAogCQkJbWFjX2RhdGEubWFjW2ldWzBdLAogCQkJbWFjX2RhdGEubWFjW2ldWzFdLApAQCAtNzksMTAgKzc5LDEwIEBACiAJCXByaW50ZigiTUFDICVkICVzXG4iLCBpLCBldGhhZGRyW2ldKTsKIAl9CiAKLQlzZXRlbnYoImV0aGFkZHIiLCBldGhhZGRyWzBdKTsKLQlzZXRlbnYoImV0aDFhZGRyIiwgZXRoYWRkclsxXSk7Ci0Jc2V0ZW52KCJldGgyYWRkciIsIGV0aGFkZHJbMl0pOwotCXNldGVudigiZXRoM2FkZHIiLCBldGhhZGRyWzNdKTsKKwlzZXRlbnYoImV0aGFkZHIiLCAgKGNoYXIgKilldGhhZGRyWzBdKTsKKwlzZXRlbnYoImV0aDFhZGRyIiwgKGNoYXIgKilldGhhZGRyWzFdKTsKKwlzZXRlbnYoImV0aDJhZGRyIiwgKGNoYXIgKilldGhhZGRyWzJdKTsKKwlzZXRlbnYoImV0aDNhZGRyIiwgKGNoYXIgKilldGhhZGRyWzNdKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjM2LDcgKzIzNiw3IEBACiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkJaWYgKG1lbWNtcCgmbWFjX2RhdGEubWFjW2ldLCAiXDBcMFwwXDBcMFwwIiwgNikpIHsKLQkJCQlzcHJpbnRmKGV0aGFkZHJbaV0sCisJCQkJc3ByaW50ZigoY2hhciAqKWV0aGFkZHJbaV0sCiAJCQkJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCiAJCQkJCW1hY19kYXRhLm1hY1tpXVswXSwKIAkJCQkJbWFjX2RhdGEubWFjW2ldWzFdLApAQCAtMjQ0LDEwICsyNDQsMTAgQEAKIAkJCQkJbWFjX2RhdGEubWFjW2ldWzNdLAogCQkJCQltYWNfZGF0YS5tYWNbaV1bNF0sCiAJCQkJCW1hY19kYXRhLm1hY1tpXVs1XSk7Ci0JCQkJc3ByaW50ZihlbmV0dmFyLAorCQkJCXNwcmludGYoKGNoYXIgKillbmV0dmFyLAogCQkJCQlpID8gImV0aCVkYWRkciIgOiAiZXRoYWRkciIsCiAJCQkJCWkpOwotCQkJCXNldGVudihlbmV0dmFyLCBldGhhZGRyW2ldKTsKKwkJCQlzZXRlbnYoKGNoYXIgKillbmV0dmFyLCAoY2hhciAqKWV0aGFkZHJbaV0pOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODY0MWhwY24vdS1ib290LmxkcyBiL2JvYXJkL21wYzg2NDFocGNuL3UtYm9vdC5sZHMKaW5kZXggMzRiNTBlNC4uNTg2NDQ2NCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODY0MWhwY24vdS1ib290LmxkcworKysgYi9ib2FyZC9tcGM4NjQxaHBjbi91LWJvb3QubGRzCkBAIC01NywxMSArNTcsMTEgQEAKICAgICBjcHUvbXBjODZ4eC9jcHVfaW5pdC5vICgudGV4dCkKICAgICBjcHUvbXBjODZ4eC9jcHUubyAoLnRleHQpCiAgICAgY3B1L21wYzg2eHgvc3BlZWQubyAoLnRleHQpCi0gICAgY3B1L21wYzg2eHgvcGNpLm8gKC50ZXh0KQogICAgIGNvbW1vbi9kbG1hbGxvYy5vICgudGV4dCkKICAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vICgudGV4dCkKICAgICBsaWJfcHBjL2V4dGFibGUubyAoLnRleHQpCiAgICAgbGliX2dlbmVyaWMvemxpYi5vICgudGV4dCkKKyAgICBkcml2ZXJzL2Jpb3NfZW11bGF0b3IvYXRpYmlvcy5vICgudGV4dCkKICAgICAqKC50ZXh0KQogICAgICooLmZpeHVwKQogICAgICooLmdvdDEpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmMgYi9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmMKaW5kZXggMDZkMDIxYS4uMjc4YWQ1YyAxMDA2NDQKLS0tIGEvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5jCisrKyBiL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuYwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAKIAlpZiAoc3RyY21wKGFyZ3ZbMV0sICJmbGFzaCIpID09IDApCiAJewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRDKQogCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJmbG9wcHkiKSA9PSAwKSB7CiAgCQkJY2hhciAqbG9jYWxfYXJnc1szXTsKIAkJCWV4dGVybiBpbnQgZG9fZmRjYm9vdCAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CkBAIC00OTEsNyArNDkxLDcgQEAKIAkJCXJlc3VsdD1tcGxfcHJnX2ltYWdlKCh1Y2hhciAqKWxkX2FkZHIpOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykgKi8KKyNlbmRpZgogCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJtZW0iKSA9PSAwKSB7CiAJICAgIAkJaWYoYXJnYz09NCkgewogCQkJCWxkX2FkZHI9c2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOwpAQCAtNTY0LDcgKzU2NCw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlKHVsb25nIHBoeXNhZHIpOwogdm9pZCBkb2NfaW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuaCBiL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuaAppbmRleCA4ZjJlYzAzLi5kNGIxZjY4IDEwMDY0NAotLS0gYS9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmgKKysrIGIvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5oCkBAIC0zOSw3ICszOSw3IEBACiAKIHZvaWQgc2hvd19zdGRpb19kZXYodm9pZCk7CiB2b2lkIGNoZWNrX2Vudih2b2lkKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIHZvaWQgZG9jX2luaXQgKHZvaWQpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2JvYXJkL21wbC9wYXRpL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGwvcGF0aS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjAzZmVmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wbC9wYXRpL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQlXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMJTWFydGluIFdpbmlzdG9lcmZlciwgbWFydGlud2luaXN0b2VyZmVyQGdteC5jaAotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbgkqLwotICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEJWFhYIEZJWE1FIFhYWAkqLwotCi0gICAgY3B1L21wYzV4eC9zdGFydC5vCSgudGV4dCkKLQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgfQotICBfZXRleHQgPSAuOwotICBQUk9WSURFIChldGV4dCA9IC4pOwotICAucm9kYXRhICAgIDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oMjU2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oMjU2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLS8qICAgLiA9IGVudl9zdGFydDsKLQkucHBjZW52CToKLQl7Ci0JCWNvbW1vbi9lbnZpcm9ubWVudC5vICgucHBjZW52KQotCX0KLSovCi19CmRpZmYgLS1naXQgYS9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuYyBiL2JvYXJkL21wbC92Y21hOS92Y21hOS5jCmluZGV4IDBkMjAwM2QuLjQ1YWI2NTQgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wbC92Y21hOS92Y21hOS5jCisrKyBiL2JvYXJkL21wbC92Y21hOS92Y21hOS5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIC8qCiAgKiBOQU5EIGZsYXNoIGluaXRpYWxpemF0aW9uLgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIGV4dGVybiB1bG9uZwogbmFuZF9wcm9iZSh1bG9uZyBwaHlzYWRyKTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvbXBsL3ZjbWE5L3ZjbWE5LmggYi9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuaAppbmRleCBjMDE2N2Q1Li43YTMyMzQzIDEwMDY0NAotLS0gYS9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuaAorKysgYi9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuaApAQCAtMzEsNyArMzEsNyBAQAogCiB2b2lkIHByaW50X3ZjbWE5X2luZm8odm9pZCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogdHlwZWRlZiBlbnVtIHsKIAlORkNFX0xPVywKIAlORkNFX0hJR0gKZGlmZiAtLWdpdCBhL2JvYXJkL211c2Vua2kvdS1ib290LmxkcyBiL2JvYXJkL211c2Vua2kvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNTEwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9tdXNlbmtpL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZibHVlL3UtYm9vdC5sZHMgYi9ib2FyZC9tdmJsdWUvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNTEwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9tdmJsdWUvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9uYzY1MC9uYW5kLmMgYi9ib2FyZC9uYzY1MC9uYW5kLmMKaW5kZXggNmJiN2MzMS4uODYxN2Y3NCAxMDA2NDQKLS0tIGEvYm9hcmQvbmM2NTAvbmFuZC5jCisrKyBiL2JvYXJkL25jNjUwL25hbmQuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogCkBAIC0xMTUsNCArMTE1LDQgQEAKIC8qCW5hbmQtPm9wdGlvbnMgPSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUzsqLwogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHBob25lL25ldHBob25lLmMgYi9ib2FyZC9uZXRwaG9uZS9uZXRwaG9uZS5jCmluZGV4IDI5N2RlOTcuLmNjYzhiM2UgMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHBob25lL25ldHBob25lLmMKKysrIGIvYm9hcmQvbmV0cGhvbmUvbmV0cGhvbmUuYwpAQCAtNTk3LDcgKzU5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiAKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvY29tbW9uL2ZsYXNoLmMgYi9ib2FyZC9uZXRzdGFsL2NvbW1vbi9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmNiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2NvbW1vbi9mbGFzaC5jCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDQKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIE1vZGlmaWVkIDQvNS8yMDAxCisgKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc2VjdG9yIGVyYXNlIGNvbW1hbmQgaXNzdWVkCisgKiA0LzUvMjAwMQorICogQ2hyaXMgSGFsbGluYW4gLSBEUzQuQ09NLCBJbmMuIC0gY2xoQG5ldDFwbHVzLmNvbQorICoKKyAqIE1vZGlmaWVkIDYvNi8yMDA3CisgKiBBZGRlZCBpc3luYworICogTmlrbGF1cyBHaWdlciwgTmV0c3RhbCBNYXNjaGluZW4sIG5pa2xhdXMuZ2lnZXJAbmV0c3RhbC5jb20KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmIENGR19NQVhfRkxBU0hfQkFOS1MgIT0gMQorI2Vycm9yICJDRkdfTUFYX0ZMQVNIX0JBTktTIG11c3QgYmUgMSIKKyNlbmRpZgorZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CS8qIGluZm8gZm9yIEZMQVNIIGNoaXBzCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucworICovCitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKHZ1X2xvbmcgKiBhZGRyLCBmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBmbGFzaF9nZXRfb2Zmc2V0cyAodWxvbmcgYmFzZSwgZmxhc2hfaW5mb190ICogaW5mbyk7CisKKyNkZWZpbmUgQUREUjAJCTB4NTU1NQorI2RlZmluZSBBRERSMQkJMHgyYWFhCisjZGVmaW5lIEZMQVNIX1dPUkRfU0laRSB1bnNpZ25lZCBjaGFyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1bnNpZ25lZCBsb25nIGZsYXNoX2luaXQgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzaXplX2IwOworCisJLyogSW5pdDogbm8gRkxBU0hlcyBrbm93biAqLworCWZsYXNoX2luZm9bMF0uZmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCisJLyogU3RhdGljIEZMQVNIIEJhbmsgY29uZmlndXJhdGlvbiBoZXJlIC0gRklYTUUgWFhYICovCisKKwlzaXplX2IwID0gZmxhc2hfZ2V0X3NpemUgKCh2dV9sb25nICopIEZMQVNIX0JBU0UwX1BSRUxJTSwKKwkJCQkgICZmbGFzaF9pbmZvWzBdKTsKKworCWlmIChmbGFzaF9pbmZvWzBdLmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJcHJpbnRmICgiIyMgVW5rbm93biBGTEFTSCBvbiBCYW5rIDAtIFNpemU9MHglMDhseD0lbGQgTUJcbiIsCisJCQlzaXplX2IwLCBzaXplX2IwIDw8IDIwKTsKKwl9CisKKwkvKiBPbmx5IG9uZSBiYW5rICovCisJLyogU2V0dXAgb2Zmc2V0cyAqLworCWZsYXNoX2dldF9vZmZzZXRzIChGTEFTSF9CQVNFMF9QUkVMSU0sICZmbGFzaF9pbmZvWzBdKTsKKworCS8qIE1vbml0b3IgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisJKHZvaWQpIGZsYXNoX3Byb3RlY3QgKEZMQUdfUFJPVEVDVF9TRVQsCisJCQkgICAgICBGTEFTSF9CQVNFMF9QUkVMSU0sCisJCQkgICAgICBGTEFTSF9CQVNFMF9QUkVMSU0gKyBtb25pdG9yX2ZsYXNoX2xlbiAtIDEsCisJCQkgICAgICAmZmxhc2hfaW5mb1swXSk7CisJZmxhc2hfaW5mb1swXS5zaXplID0gc2l6ZV9iMDsKKworCXJldHVybiBzaXplX2IwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHRoZSBmbGFzaCBjaGlwcyBhcmUgdW5pZm9ybSBzZWN0b3IKKyAqIGRldmljZXMuIFRoaXMgaXMgdHJ1ZSBmb3IgYWxsIGxpa2VseSBmbGFzaCBkZXZpY2VzIG9uIGEgSENVeC4KKyAqLworc3RhdGljIHZvaWQgZmxhc2hfZ2V0X29mZnNldHMgKHVsb25nIGJhc2UsIGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJdW5zaWduZWQgaWR4OworCXVuc2lnbmVkIGxvbmcgc2VjdG9yX3NpemUgPSBpbmZvLT5zaXplIC8gaW5mby0+c2VjdG9yX2NvdW50OworCisJZm9yIChpZHggPSAwOyBpZHggPCBpbmZvLT5zZWN0b3JfY291bnQ7IGlkeCArPSAxKSB7CisJCWluZm8tPnN0YXJ0W2lkeF0gPSBiYXNlICsgKGlkeCAqIHNlY3Rvcl9zaXplKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBmbGFzaF9wcmludF9pbmZvIChmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCWludCBpOworCWludCBrOworCWludCBzaXplOworCWludCBlcmFzZWQ7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqZmxhc2g7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYgKCJtaXNzaW5nIG9yIHVua25vd24gRkxBU0ggdHlwZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spIHsKKwljYXNlIEZMQVNIX01BTl9BTUQ6CisJCXByaW50ZiAoIkFNRCAiKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9NQU5fRlVKOgorCQlwcmludGYgKCJGVUpJVFNVICIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX01BTl9TU1Q6CisJCXByaW50ZiAoIlNTVCAiKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9NQU5fU1RNOgorCQlwcmludGYgKCJTVCBNaWNybyAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBWZW5kb3IgIik7CisJCWJyZWFrOworCX0KKworCSAgLyogKFJlZHVjZWQgdGFibGUgb2Ygb25seSBwYXJ0cyBleHBlY3RlZCBpbiBIQ1V4IGJvYXJkcy4pICovCisJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCkgeworCWNhc2UgRkxBU0hfTUFOX0FNRCB8IEZMQVNIX0FNMDQwOgorCQlwcmludGYgKCJBTTI5RjA0MCAoNTEyIEtiaXQsIHVuaWZvcm0gc2VjdG9yIHNpemUpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9NQU5fU1RNIHwgRkxBU0hfQU0wNDA6CisJCXByaW50ZiAoIk1NMjlXMDQwVyAoNTEyIEtiaXQsIHVuaWZvcm0gc2VjdG9yIHNpemUpXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCQlicmVhazsKKwl9CisKKwlwcmludGYgKCIgIFNpemU6ICVsZCBLQiBpbiAlZCBTZWN0b3JzXG4iLAorCQlpbmZvLT5zaXplID4+IDEwLCBpbmZvLT5zZWN0b3JfY291bnQpOworCisJcHJpbnRmICgiICBTZWN0b3IgU3RhcnQgQWRkcmVzc2VzOiIpOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7ICsraSkgeworCQkvKgorCQkgKiBDaGVjayBpZiB3aG9sZSBzZWN0b3IgaXMgZXJhc2VkCisJCSAqLworCQlpZiAoaSAhPSAoaW5mby0+c2VjdG9yX2NvdW50IC0gMSkpCisJCQlzaXplID0gaW5mby0+c3RhcnRbaSArIDFdIC0gaW5mby0+c3RhcnRbaV07CisJCWVsc2UKKwkJCXNpemUgPSBpbmZvLT5zdGFydFswXSArIGluZm8tPnNpemUgLSBpbmZvLT5zdGFydFtpXTsKKwkJZXJhc2VkID0gMTsKKwkJZmxhc2ggPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBpbmZvLT5zdGFydFtpXTsKKwkJc2l6ZSA9IHNpemUgPj4gMjsJLyogZGl2aWRlIGJ5IDQgZm9yIGxvbmd3b3JkIGFjY2VzcyAqLworCQlmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7CisJCQlpZiAoKmZsYXNoKysgIT0gMHhmZmZmZmZmZikgeworCQkJCWVyYXNlZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoKGkgJSA1KSA9PSAwKQorCQkJcHJpbnRmICgiXG4gICAiKTsKKwkJcHJpbnRmICgiICUwOGxYJXMlcyIsCisJCQlpbmZvLT5zdGFydFtpXSwKKwkJCWVyYXNlZCA/ICIgRSIgOiAiICAiLCBpbmZvLT5wcm90ZWN0W2ldID8gIlJPICIgOiAiICAgIgorCQkpOworCX0KKwlwcmludGYgKCJcbiIpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgY2Fubm90IGJlIHJ1biBmcm9tIEZMQVNIIQorICovCitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKHZ1X2xvbmcgKiBhZGRyLCBmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCXNob3J0IGk7CisJRkxBU0hfV09SRF9TSVpFIHZhbHVlOworCXVsb25nIGJhc2UgPSAodWxvbmcpIGFkZHI7CisJdm9sYXRpbGUgRkxBU0hfV09SRF9TSVpFICphZGRyMiA9IChGTEFTSF9XT1JEX1NJWkUgKikgYWRkcjsKKworCS8qIFdyaXRlIGF1dG8gc2VsZWN0IGNvbW1hbmQ6IHJlYWQgTWFudWZhY3R1cmVyIElEICovCisJYXNtKCJpc3luYyIpOworCWFkZHIyW0FERFIwXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDBBQTAwQUE7CisJYXNtKCJpc3luYyIpOworCWFkZHIyW0FERFIxXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJYXNtKCJpc3luYyIpOworCWFkZHIyW0FERFIwXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDA5MDAwOTA7CisJYXNtKCJpc3luYyIpOworCisJdmFsdWUgPSBhZGRyMlswXTsKKwlhc20oImlzeW5jIik7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAoRkxBU0hfV09SRF9TSVpFKSBBTURfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0FNRDsKKwkJYnJlYWs7CisJY2FzZSAoRkxBU0hfV09SRF9TSVpFKSBGVUpfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0ZVSjsKKwkJYnJlYWs7CisJY2FzZSAoRkxBU0hfV09SRF9TSVpFKSBTU1RfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX1NTVDsKKwkJYnJlYWs7CisJY2FzZSAoRkxBU0hfV09SRF9TSVpFKVNUTV9NQU5VRkFDVDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fU1RNOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDA7CisJCWluZm8tPnNpemUgPSAwOworCQlwcmludGYoIlVua25vd24gZmxhc2ggbWFudWZhY3R1cmVyIGNvZGU6IDB4JXggYXQgJXBcbiIsCisJCSAgICAgICB2YWx1ZSwgYWRkcik7CisJCWFkZHIyW0FERFIwXSA9IChGTEFTSF9XT1JEX1NJWkUpIDA7CisJCXJldHVybiAoMCk7CS8qIG5vIG9yIHVua25vd24gZmxhc2ggICovCisJfQorCisJdmFsdWUgPSBhZGRyMlsxXTsJLyogZGV2aWNlIElECQkqLworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgKEZMQVNIX1dPUkRfU0laRSkgQU1EX0lEX0YwNDBCOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTA0MDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gODsKKwkJaW5mby0+c2l6ZSA9IDB4MDA4MDAwMDsJLyogPT4gNTEyIGtvICovCisJCWJyZWFrOworCWNhc2UgKEZMQVNIX1dPUkRfU0laRSkgQU1EX0lEX0xWMDQwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0wNDA7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJCWluZm8tPnNpemUgPSAweDAwODAwMDA7CS8qID0+IDUxMiBrbyAqLworCQlicmVhazsKKwljYXNlIChGTEFTSF9XT1JEX1NJWkUpU1RNX0lEX00yOVcwNDBCOiAvKiBtb3N0IGxpa2VsZSBIQ1U1IGNoaXAgKi8KKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0wNDA7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJCWluZm8tPnNpemUgPSAweDAwODAwMDA7IC8qID0+IDUxMiBrbyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCXJldHVybiAoMCk7CS8qID0+IG5vIG9yIHVua25vd24gZmxhc2ggKi8KKworCX0KKworCSAgLyogQ2FsY3VsYXRlIHRoZSBzZWN0b3Igb2Zmc2V0cyAoVXNlIEhDVXggT3B0aW1pemVkIGNvZGUpLiAqLworCWZsYXNoX2dldF9vZmZzZXRzKGJhc2UsIGluZm8pOworCisJLyogY2hlY2sgZm9yIHByb3RlY3RlZCBzZWN0b3JzICovCisJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCS8qIHJlYWQgc2VjdG9yIHByb3RlY3Rpb24gYXQgc2VjdG9yIGFkZHJlc3MsCisJCSAqKEE3IC4uIEEwKSA9IDB4MDIKKwkJICogRDAgPSAxIGlmIHByb3RlY3RlZAorCQkgKi8KKwkJYWRkcjIgPSAodm9sYXRpbGUgRkxBU0hfV09SRF9TSVpFICopIChpbmZvLT5zdGFydFtpXSk7CisJCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgPT0gRkxBU0hfTUFOX1NTVCkKKwkJCWluZm8tPnByb3RlY3RbaV0gPSAwOworCQllbHNlCisJCQlpbmZvLT5wcm90ZWN0W2ldID0gYWRkcjJbMl0gJiAxOworCX0KKworCS8qCisJICogUHJldmVudCB3cml0ZXMgdG8gdW5pbml0aWFsaXplZCBGTEFTSC4KKwkgKi8KKwlpZiAoaW5mby0+Zmxhc2hfaWQgIT0gRkxBU0hfVU5LTk9XTikgeworCQlhZGRyMiA9IChGTEFTSF9XT1JEX1NJWkUgKikgaW5mby0+c3RhcnRbMF07CisJCSphZGRyMiA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDBGMDAwRjA7CS8qIHJlc2V0IGJhbmsgKi8KKwl9CisKKwlyZXR1cm4gKGluZm8tPnNpemUpOworfQorCitpbnQgd2FpdF9mb3JfRFE3IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc2VjdCkKK3sKKwl1bG9uZyBzdGFydCwgbm93LCBsYXN0OworCXZvbGF0aWxlIEZMQVNIX1dPUkRfU0laRSAqYWRkciA9CisJCShGTEFTSF9XT1JEX1NJWkUgKikgKGluZm8tPnN0YXJ0W3NlY3RdKTsKKworCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwlsYXN0ID0gc3RhcnQ7CisJd2hpbGUgKChhZGRyWzBdICYgKEZMQVNIX1dPUkRfU0laRSkgMHgwMDgwMDA4MCkgIT0KKwkgICAgICAgKEZMQVNIX1dPUkRfU0laRSkgMHgwMDgwMDA4MCkgeworCQlpZiAoKG5vdyA9IGdldF90aW1lciAoc3RhcnQpKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCQlwcmludGYgKCJUaW1lb3V0XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiBzaG93IHRoYXQgd2UncmUgd2FpdGluZyAqLworCQlpZiAoKG5vdyAtIGxhc3QpID4gMTAwMCkgewkvKiBldmVyeSBzZWNvbmQgKi8KKwkJCXB1dGMgKCcuJyk7CisJCQlsYXN0ID0gbm93OworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsYXNoX2VyYXNlIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwl2b2xhdGlsZSBGTEFTSF9XT1JEX1NJWkUgKmFkZHIgPSAoRkxBU0hfV09SRF9TSVpFICopIChpbmZvLT5zdGFydFswXSk7CisJdm9sYXRpbGUgRkxBU0hfV09SRF9TSVpFICphZGRyMjsKKwlpbnQgZmxhZywgcHJvdCwgc2VjdCwgbF9zZWN0OworCWludCBpOworCisJaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCQlwcmludGYgKCItIG1pc3NpbmdcbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmICgiLSBubyBzZWN0b3JzIHRvIGVyYXNlXG4iKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYgKCJDYW4ndCBlcmFzZSB1bmtub3duIGZsYXNoIHR5cGUgLSBhYm9ydGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJvdCA9IDA7CisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7ICsrc2VjdCkgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCQkJcHJvdCsrOworCQl9CisJfQorCisJaWYgKHByb3QpIHsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyBub3QgZXJhc2VkIVxuIiwKKwkJCXByb3QpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIlxuIik7CisJfQorCisJbF9zZWN0ID0gLTE7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgewkvKiBub3QgcHJvdGVjdGVkICovCisJCQlhZGRyMiA9IChGTEFTSF9XT1JEX1NJWkUgKikgKGluZm8tPnN0YXJ0W3NlY3RdKTsKKwkJCXByaW50ZiAoIkVyYXNpbmcgc2VjdG9yICVwXG4iLCBhZGRyMik7CS8qIENMSCAqLworCisJCQlpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09CisJCQkgICAgRkxBU0hfTUFOX1NTVCkgeworCQkJCWFkZHJbQUREUjBdID0gKEZMQVNIX1dPUkRfU0laRSkgMHgwMEFBMDBBQTsKKwkJCQlhZGRyW0FERFIxXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJCQkJYWRkcltBRERSMF0gPSAoRkxBU0hfV09SRF9TSVpFKSAweDAwODAwMDgwOworCQkJCWFkZHJbQUREUjBdID0gKEZMQVNIX1dPUkRfU0laRSkgMHgwMEFBMDBBQTsKKwkJCQlhZGRyW0FERFIxXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJCQkJLyogYmxvY2sgZXJhc2UgKi8KKwkJCQlhZGRyMlswXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDA1MDAwNTA7CisJCQkJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHVkZWxheSAoMTAwMCk7CisJCQl9IGVsc2UgeworCQkJCWFkZHJbQUREUjBdID0gKEZMQVNIX1dPUkRfU0laRSkgMHgwMEFBMDBBQTsKKwkJCQlhZGRyW0FERFIxXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJCQkJYWRkcltBRERSMF0gPSAoRkxBU0hfV09SRF9TSVpFKSAweDAwODAwMDgwOworCQkJCWFkZHJbQUREUjBdID0gKEZMQVNIX1dPUkRfU0laRSkgMHgwMEFBMDBBQTsKKwkJCQlhZGRyW0FERFIxXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDA1NTAwNTU7CisJCQkJLyogc2VjdG9yIGVyYXNlICovCisJCQkJYWRkcjJbMF0gPSAoRkxBU0hfV09SRF9TSVpFKSAweDAwMzAwMDMwOworCQkJfQorCQkJbF9zZWN0ID0gc2VjdDsKKwkJCS8qCisJCQkgKiBXYWl0IGZvciBlYWNoIHNlY3RvciB0byBjb21wbGV0ZSwgaXQncyBtb3JlCisJCQkgKiByZWxpYWJsZS4gIEFjY29yZGluZyB0byBBTUQgU3BlYywgeW91IG11c3QKKwkJCSAqIGlzc3VlIGFsbCBlcmFzZSBjb21tYW5kcyB3aXRoaW4gYSBzcGVjaWZpZWQKKwkJCSAqIHRpbWVvdXQuICBUaGlzIGhhcyBiZWVuIHNlZW4gdG8gZmFpbCwgZXNwZWNpYWxseQorCQkJICogaWYgcHJpbnRmKClzIGFyZSBpbmNsdWRlZCAoZm9yIGRlYnVnKSEhCisJCQkgKi8KKwkJCXdhaXRfZm9yX0RRNyAoaW5mbywgc2VjdCk7CisJCX0KKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwkvKiB3YWl0IGF0IGxlYXN0IDgwdXMgLSBsZXQncyB3YWl0IDEgbXMgKi8KKwl1ZGVsYXkgKDEwMDApOworCisjaWYgMAorCS8qCisJICogV2Ugd2FpdCBmb3IgdGhlIGxhc3QgdHJpZ2dlcmVkIHNlY3RvcgorCSAqLworCWlmIChsX3NlY3QgPCAwKQorCQlnb3RvIERPTkU7CisJd2FpdF9mb3JfRFE3IChpbmZvLCBsX3NlY3QpOworCitET05FOgorI2VuZGlmCisJLyogcmVzZXQgdG8gcmVhZCBtb2RlICovCisJYWRkciA9IChGTEFTSF9XT1JEX1NJWkUgKikgaW5mby0+c3RhcnRbMF07CisJYWRkclswXSA9IChGTEFTSF9XT1JEX1NJWkUpIDB4MDBGMDAwRjA7CS8qIHJlc2V0IGJhbmsgKi8KKworCXByaW50ZiAoIiBkb25lXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCisKK2ludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1Y2hhciAqIHNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworCXVsb25nIGNwLCB3cCwgZGF0YTsKKwlpbnQgaSwgbCwgcmM7CisKKwl3cCA9IChhZGRyICYgfjMpOwkvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworCSAqLworCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IGw7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKikgY3ApOworCQl9CisJCWZvciAoOyBpIDwgNCAmJiBjbnQgPiAwOyArK2kpIHsKKwkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJCS0tY250OworCQkJKytjcDsKKwkJfQorCQlmb3IgKDsgY250ID09IDAgJiYgaSA8IDQ7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKikgY3ApOworCQl9CisKKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQgKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJd3AgKz0gNDsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorCSAqLworCXdoaWxlIChjbnQgPj0gNCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCQl9CisJCWlmICgocmMgPSB3cml0ZV93b3JkIChpbmZvLCB3cCwgZGF0YSkpICE9IDApIHsKKwkJCXJldHVybiAocmMpOworCQl9CisJCXdwICs9IDQ7CisJCWNudCAtPSA0OworCX0KKworCWlmIChjbnQgPT0gMCkgeworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IDQgJiYgY250ID4gMDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJLS1jbnQ7CisJfQorCWZvciAoOyBpIDwgNDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopIGNwKTsKKwl9CisKKwlyZXR1cm4gKHdyaXRlX3dvcmQgKGluZm8sIHdwLCBkYXRhKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSkKK3sKKwl2b2xhdGlsZSBGTEFTSF9XT1JEX1NJWkUgKmFkZHIyID0KKwkJKEZMQVNIX1dPUkRfU0laRSAqKSAoaW5mby0+c3RhcnRbMF0pOworCXZvbGF0aWxlIEZMQVNIX1dPUkRfU0laRSAqZGVzdDIgPSAoRkxBU0hfV09SRF9TSVpFICopIGRlc3Q7CisJdm9sYXRpbGUgRkxBU0hfV09SRF9TSVpFICpkYXRhMiA9IChGTEFTSF9XT1JEX1NJWkUgKikgJiBkYXRhOworCXVsb25nIHN0YXJ0OworCWludCBpOworCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisJaWYgKCgqKCh2b2xhdGlsZSBGTEFTSF9XT1JEX1NJWkUgKikgZGVzdCkgJgorCSAgICAoRkxBU0hfV09SRF9TSVpFKSBkYXRhKSAhPSAoRkxBU0hfV09SRF9TSVpFKSBkYXRhKSB7CisJCXJldHVybiAoMik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQgLyBzaXplb2YgKEZMQVNIX1dPUkRfU0laRSk7IGkrKykgeworCQlpbnQgZmxhZzsKKworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwkJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCQlhZGRyMltBRERSMF0gPSAoRkxBU0hfV09SRF9TSVpFKSAweDAwQUEwMEFBOworCQlhZGRyMltBRERSMV0gPSAoRkxBU0hfV09SRF9TSVpFKSAweDAwNTUwMDU1OworCQlhZGRyMltBRERSMF0gPSAoRkxBU0hfV09SRF9TSVpFKSAweDAwQTAwMEEwOworCisJCWRlc3QyW2ldID0gZGF0YTJbaV07CisKKwkJLyogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChmbGFnKQorCQkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwkJLyogZGF0YSBwb2xsaW5nIGZvciBENyAqLworCQlzdGFydCA9IGdldF90aW1lciAoMCk7CisJCXdoaWxlICgoZGVzdDJbaV0gJiAoRkxBU0hfV09SRF9TSVpFKSAweDAwODAwMDgwKSAhPQorCQkgICAgICAgKGRhdGEyW2ldICYgKEZMQVNIX1dPUkRfU0laRSkgMHgwMDgwMDA4MCkpIHsKKworCQkJaWYgKGdldF90aW1lciAoc3RhcnQpID4gQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQpIHsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvY29tbW9uL25tX2JzcC5jIGIvYm9hcmQvbmV0c3RhbC9jb21tb24vbm1fYnNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkZTQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YWwvY29tbW9uL25tX2JzcC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKihDKSBDb3B5cmlnaHQgMjAwNS0yMDA3IE5ldHN0YWwgTWFzY2hpbmVuIEFHCisgKiAgICBOaWtsYXVzIEdpZ2VyIChOaWtsYXVzLkdpZ2VyQG5ldHN0YWwuY29tKQorICoKKyAqICAgIFRoaXMgc291cmNlIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKKyAqICAgIGFuZC9vciBtb2RpZnkgaXQgaW4gc291cmNlIGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICAgIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworI2lmZGVmIENPTkZJR19DTURfQlNQCisvKgorICogQ29tbWFuZCBubV9ic3A6IE5ldHN0YWwgTWFzY2hpbmVuIEJTUCBzcGVjaWZpYyBjb21tYW5kCisgKi8KK2ludCBubV9ic3AoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJcHJpbnRmKCIlczogZmxhZyAlZCwgIGFyZ2MgJWQsICBhcmd2WzBdICVzXG4iLCAgX19GVU5DVElPTl9fLAorCSAgICAgICBmbGFnLCAgYXJnYywgIGFyZ3ZbMF0pOworCXByaW50ZigiTmV0c3RhbCBNYXNjaGluZW4gQlNQIHNwZWNpZmljIGNvbW1hbmQuIE5vbmUgYXQgdGhlIG1vbWVudC5cbiIpOworCXJldHVybiAwOworfQorCitVX0JPT1RfQ01EKAorCSAgbm1fYnNwLCAxLCAgICAgIDEsICAgICAgbm1fYnNwLAorCSAgIm5tX2JzcCAgLSBOZXRzdGFsIE1hc2NoaW5lbiBCU1Agc3BlY2lmaWMgY29tbWFuZC4gXG4iLAorCSAgIkhlbHAgZm9yIE5ldHN0YWwgTWFzY2hpbmVuIEJTUCBzcGVjaWZpYyBjb21tYW5kLlxuIgorCSAgKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3RhbC9oY3U0L01ha2VmaWxlIGIvYm9hcmQvbmV0c3RhbC9oY3U0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ODI1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2hjdTQvTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDcgTmV0c3RhbCBNYXNjaGluZW4gQUcKKyMgTmlrbGF1cyBHaWdlciAobmdAbmV0c3RhbC5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK3ZwYXRoIGZsYXNoLmMgLi4vY29tbW9uCitDT0JKUwk9ICQoQk9BUkQpLm8gZmxhc2gubworU09CSlMJPQorCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoU09CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvaGN1NC9SRUFETUUudHh0IGIvYm9hcmQvbmV0c3RhbC9oY3U0L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5YzY0YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YWwvaGN1NC9SRUFETUUudHh0CkBAIC0wLDAgKzEsNTkgQEAKK0hDVTQgQ29uZmlndXJhdGlvbiBEZXRhaWxzCisKK01lbW9yeSBCYW5rIDAgLS0gRmxhc2ggY2hpcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzB4ZmZmMDAwMDAgLSAweGZmZmZmZmZmCisKK1RoZSBmbGFzaCBjaGlwIGlzIHJlYWxseSBvbmx5IDUxMktieXRlcywgYnV0IHRoZSBoaWdoIGFkZHJlc3MgYml0IG9mCit0aGUgMU1lZyByZWdpb24gaXMgaWdub3JlZCwgc28gdGhlIGZsYXNoIGlzIHJlcGxpY2F0ZWQgdGhyb3VnaCB0aGUKK3JlZ2lvbi4gVGh1cywgdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggYSBmbGFzaCBiYXNlIGFkZHJlc3MgMHhmZmY4MDAwMC4KKworVGhlIHBsYWNlbWVudCBhdCB0aGUgZW5kIGlzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCByZXNldCBiZWhhdmlvciwKK3doZXJlIHRoZSBwcm9jZXNzb3IgaXRzZWxmIGluaXRpYWxseSB1c2VzIHRoaXMgYnVzIHRvIGxvYWQgdGhlIGJyYW5jaAordmVjdG9yIGFuZCBzdGFydCBydW5uaW5nLgorCitPbi1DaGlwIE1lbW9yeQorLS0tLS0tLS0tLS0tLS0KKworMHhmNDAwMDAwMCAtIDB4ZjQwMDBmZmYKKworVGhlIDQwNUdQciBpbmNsdWRlcyBhIDRLIG9uLWNoaXAgbWVtb3J5IHRoYXQgY2FuIGJlIHBsYWNlZCBob3dldmVyCitzb2Z0d2FyZSBjaG9vc2VzLiBJIGNob29zZSB0byBwbGFjZSB0aGUgbWVtb3J5IGF0IHRoaXMgYWRkcmVzcywgdG8KK2tlZXAgaXQgb3V0IG9mIHRoZSBjYWNoYWJsZSBhcmVhcy4KKworCitJbnRlcm5hbCBQZXJpcGhlcmFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMHhlZjYwMDMwMCAtIDB4ZWY2MDA4ZmYKKworVGhlc2UgYXJlIHNjYXR0ZXJlZCB2YXJpb3VzIHBlcmlwaGVyYWxzIGludGVybmFsIHRvIHRoZSBQUEM0MDVHUHIKK2NoaXAuCisKK0NoaXAtU2VsZWN0IDI6IEZsYXNoIE1lbW9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzB4NzAwMDAwMDAKKworQ2hpcC1TZWxlY3QgMzogQ0FOIEludGVyZmFjZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMHg3ODAwMDAwCisKKworQ2hpcC1TZWxlY3QgNDogSU1DLWJ1cyBzdGFuZGFyZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPdXIgSU8tQnVzIChzbG93IHZlcnNpb24pCisKKworQ2hpcC1TZWxlY3QgNTogSU1DLWJ1cyBmYXN0IChpbmFjdGl2ZSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK091ciBJTy1CdXMgKGZhc3QsIGJ1dCBub3QgeWV0IHVzZSkKKworCitNZW1vcnkgQmFuayAxIC0tIFNEUkFNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzB4MDAwMDAwMDAgLSAweDFmZmZmZmYgICAjIERlZmF1bHQgMzIgTUIKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvaGN1NC9jb25maWcubWsgYi9ib2FyZC9uZXRzdGFsL2hjdTQvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjYwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2hjdTQvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA1IE5ldHN0YWwgTWFzY2hpbmVuIEFHCisjICAgICBOaWtsYXVzIEdpZ2VyIChuZ0BuZXRzdGFsLmNvbSkKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIworIyBOZXRzdGFsIE1hc2NoaW5lbiBBRzogSENVNCBib2FyZHMKKyMKKworVEVYVF9CQVNFID0gMHhGRkZhMDAwMAorCitpZmVxICgkKGRlYnVnKSwxKQorUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURERUJVRyAtZworZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvaGN1NC9oY3U0LmMgYi9ib2FyZC9uZXRzdGFsL2hjdTQvaGN1NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTU2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2hjdTQvaGN1NC5jCkBAIC0wLDAgKzEsNDAwIEBACisvKgorICooQykgQ29weXJpZ2h0IDIwMDUtMjAwNyBOZXRzdGFsIE1hc2NoaW5lbiBBRworICogICAgTmlrbGF1cyBHaWdlciAoTmlrbGF1cy5HaWdlckBuZXRzdGFsLmNvbSkKKyAqCisgKiAgICBUaGlzIHNvdXJjZSBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CisgKiAgICBhbmQvb3IgbW9kaWZ5IGl0IGluIHNvdXJjZSBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlICA8Y29tbW9uLmg+CisjaW5jbHVkZSAgPHBwYzR4eC5oPgorI2luY2x1ZGUgIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSAgPGFzbS9pby5oPgorI2luY2x1ZGUgIDxhc20tcHBjL3UtYm9vdC5oPgorI2luY2x1ZGUgICIuLi9jb21tb24vbm1fYnNwLmMiCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjZGVmaW5lIEhDVV9NQUNIX1ZFUlNJT05TX1JFR0lTVEVSCSgweDdDMDAwMDAwICsgMHhGMDAwMDApCisKKyNkZWZpbmUgU0RSQU1fTEVOIDMyKjEwMjQqMTAyNCAvKiAzMiBNQiAtUkFNICovCisKKyNkZWZpbmUgRE9fVUdMWV9TRFJBTV9XT1JLQVJPVU5ECisKK2VudW0geworCS8qIEhXX0dFTkVSQVRJT05fSENVIHdpcmQgbmljaHQgbWVociB1bnRlcnN0dWV0enQgKi8KKwlIV19HRU5FUkFUSU9OX0hDVTIgID0gMHgxMCwKKwlIV19HRU5FUkFUSU9OX0hDVTMgID0gMHgxMCwKKwlIV19HRU5FUkFUSU9OX0hDVTQgID0gMHgyMCwKKwlIV19HRU5FUkFUSU9OX01DVSAgID0gMHgwOCwKKwlIV19HRU5FUkFUSU9OX01DVTIwID0gMHgwYSwKKwlIV19HRU5FUkFUSU9OX01DVTI1ID0gMHgwOSwKK307CisKK3ZvaWQgc3lzTGVkU2V0KHUzMiB2YWx1ZSk7Citsb25nIGludCBzcGRfc2RyYW0oaW50KHJlYWRfc3BkKSh1aW50IGFkZHIpKTsKKworI2lmZGVmIENPTkZJR19TUERfRUVQUk9NCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUcpCit2b2lkIHNob3dfc2RyYW1fcmVnaXN0ZXJzKHZvaWQpOworI2VuZGlmCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biB2ZXJ5IGVhcmx5LCBvdXQgb2YgZmxhc2gsIGFuZCBiZWZvcmUgZGV2aWNlcyBhcmUKKyAqIGluaXRpYWxpemVkLiBJdCBpcyBjYWxsZWQgYnkgbGliX3BwYy9ib2FyZC5jOmJvYXJkX2luaXRfZiBieSB2aXJ0dWUKKyAqIG9mIGJlaW5nIGluIHRoZSBpbml0X3NlcXVlbmNlIGFycmF5LgorICoKKyAqIFRoZSBTRFJBTSBoYXMgYmVlbiBpbml0aWFsaXplZCBhbHJlYWR5IC0tIHN0YXJ0LlM6c3RhcnQgY2FsbGVkCisgKiBpbml0LlM6aW5pdF9zZHJhbSBlYXJseSBvbiAtLSBidXQgaXQgaXMgbm90IHlldCBiZWluZyB1c2VkIGZvcgorICogYW55dGhpbmcsIG5vdCBldmVuIHN0YWNrLiBTbyBiZSBjYXJlZnVsLgorICovCisKKyNkZWZpbmUgQ1BDMF9DUjAJMHhiMQkvKiBDaGlwIGNvbnRyb2wgcmVnaXN0ZXIgMCAqLworI2RlZmluZSBDUEMwX0NSMSAgICAgICAgMHhiMgkvKiBDaGlwIGNvbnRyb2wgcmVnaXN0ZXIgMSAqLworLyogQXR0ZW50aW9uOiBJZiB5b3Ugd2FudCAxIG1pY3Jvc2VjcyB0aW1lcyBmcm9tIHRoZSBleHRlcm5hbCBvc2NpbGxhdG9yCisgKiB1c2UgIDB4MDA4MDQwNTEuIEJ1dCB0aGlzIGNhdXNlcyBwcm9ibGVtcyB3aXRoIHUtYm9vdCBhbmQgbGludXghCisgKi8KKyNkZWZpbmUgQ1BDMF9DUjFfVkFMVUUJMHgwMDAwNDA1MQorI2RlZmluZSBDUEMwX0VDUgkweGFhCS8qIEVkZ2UgY29uZGl0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEVCQzBfQ0ZHCTB4MjMJLyogRXh0ZXJuYWwgUGVyaXBoZXJhbCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIENQQzBfRUlSUgkweGI2CS8qIEV4dGVybmFsIEludGVycnVwdCBSZWdpc3RlciAqLworCisKK2ludCBib2FyZF9lYXJseV9pbml0X2YgKHZvaWQpCit7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgSW50ZXJydXB0IGNvbnRyb2xsZXIgc2V0dXAgZm9yIHRoZSBIQ1U0IGJvYXJkLgorCXwgTm90ZTogSVJRIDAtMTUgIDQwNUdQIGludGVybmFsbHkgZ2VuZXJhdGVkOyBoaWdoOyBsZXZlbCBzZW5zaXRpdmUKKwl8ICAgICAgIElSUSAxNiAgICA0MDVHUCBpbnRlcm5hbGx5IGdlbmVyYXRlZDsgbG93OyBsZXZlbCBzZW5zaXRpdmUKKwl8ICAgICAgIElSUSAxNy0yNCBSRVNFUlZFRC9VTlVTRUQKKwl8ICAgICAgIElSUSAzMSAoRVhUIElSUSA2KSAodW51c2VkKQorCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltdGRjciAodWljc3IsIDB4RkZGRkZGRkYpOyAvKiBjbGVhciBhbGwgaW50cyAqLworCW10ZGNyICh1aWNlciwgMHgwMDAwMDAwMCk7IC8qIGRpc2FibGUgYWxsIGludHMgKi8KKwltdGRjciAodWljY3IsIDB4MDAwMDAwMDApOyAvKiBzZXQgYWxsIHRvIGJlIG5vbi1jcml0aWNhbCAqLworCW10ZGNyICh1aWNwciwgMHhGRkZGRkY4Nyk7IC8qIHNldCBpbnQgcG9sYXJpdGllcyAqLworCW10ZGNyICh1aWN0ciwgMHgxMDAwMDAwMCk7IC8qIHNldCBpbnQgdHJpZ2dlciBsZXZlbHMgKi8KKwltdGRjciAodWljc3IsIDB4RkZGRkZGRkYpOyAvKiBjbGVhciBhbGwgaW50cyAqLworCisJbXRkY3IoQ1BDMF9DUjEsICBDUEMwX0NSMV9WQUxVRSk7CisJbXRkY3IoQ1BDMF9FQ1IsICAweDYwNjA2MDAwKTsKKwltdGRjcihDUEMwX0VJUlIsIDB4N2MwMDAwMDApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQk9BUkRfUFJFX0lOSVQKK2ludCBib2FyZF9wcmVfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gYm9hcmRfZWFybHlfaW5pdF9mICgpOworfQorI2VuZGlmCisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCXVuc2lnbmVkIGludCBqOworCXUxNiAqYm9hcmRWZXJzUmVnID0gKHUxNiAqKSBIQ1VfTUFDSF9WRVJTSU9OU19SRUdJU1RFUjsKKwl1MTYgZ2VuZXJhdGlvbiA9ICpib2FyZFZlcnNSZWcgJiAweGYwOworCXUxNiBpbmRleCAgICAgID0gKmJvYXJkVmVyc1JlZyAmIDB4MGY7CisKKwkvKiBGb3JjZSAvUlRTIHRvIGFjdGl2ZS4gVGhlIGJvYXJkIGl0IG5vdCB3aXJlZCBxdWl0ZQorCSAgIGNvcnJlY3RseSB0byB1c2UgY3RzL3J0YyBmbG93IGNvbnRyb2wsIHNvIGp1c3QgZm9yY2UgdGhlCisJICAgL1JTVCBhY3RpdmUgYW5kIGZvcmdldCBhYm91dCBpdC4gKi8KKwl3cml0ZWIgKHJlYWRiICgweGVmNjAwNDA0KSB8IDB4MDMsIDB4ZWY2MDA0MDQpOworCXByaW50ZiAoIlxuTmV0c3RhbCBNYXNjaGluZW4gQUcgIik7CisJaWYgKGdlbmVyYXRpb24gPT0gSFdfR0VORVJBVElPTl9IQ1UzKQorCQlwcmludGYgKCJIQ1UzOiBpbmRleCAlZFxuXG4iLCBpbmRleCk7CisJZWxzZSBpZiAoZ2VuZXJhdGlvbiA9PSBIV19HRU5FUkFUSU9OX0hDVTQpCisJCXByaW50ZiAoIkhDVTQ6IGluZGV4ICVkXG5cbiIsIGluZGV4KTsKKwkvKiBHUElPIGhlcmUgbm9jaCBuaWNodCByaWNodGlnIGluaXRpYWxpc2VydCAhISEgKi8KKwlzeXNMZWRTZXQoMCk7CisJZm9yIChqID0gMDsgaiA8IDc7IGorKykgeworCQlzeXNMZWRTZXQoMSA8PCBqKTsKKwkJdWRlbGF5KDUwICogMTAwMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3UzMiBzeXNMZWRHZXQodm9pZCkKK3sKKwlyZXR1cm4gKH4oKCoodTMyICopR1BJTzBfT1IpKSA+PiAyMykgJiAweGZmOworfQorCit2b2lkIHN5c0xlZFNldCh1MzIgdmFsdWUgLyogdmFsdWUgdG8gcGxhY2UgaW4gTEVEcyAqLykKK3sKKwl1MzIgICB0bXAgPSB+dmFsdWU7CisJdTMyICAgKmxlZFJlZzsKKworCXRtcCA9ICh0bXAgPDwgMjMpIHwgMHg3RkZGRkY7CisJbGVkUmVnID0gKHUzMiAqKUdQSU8wX09SOworCSpsZWRSZWcgPSB0bXA7Cit9CisKKy8qCisgKiBzZHJhbV9pbml0IC0gRHVtbXkgaW1wbGVtZW50YXRpb24gZm9yIHN0YXJ0LlMsIHNwZF9zZHJhbSAgb3IgaW5pdGRyYW0KKyAqCQl1c2VkIGZvciBIQ1V4CisgKi8KK3ZvaWQgc2RyYW1faW5pdCh2b2lkKQoreworCXJldHVybjsKK30KKworI2lmIGRlZmluZWQoREVCVUcpCit2b2lkIHNob3dfc2RyYW1fcmVnaXN0ZXJzKHZvaWQpCit7CisJdTMyIHZhbHVlOworCisJcHJpbnRmICgiU0RSQU0gQ29udHJvbGxlciBSZWdpc3RlcnMgLS1cbiIpOworCW1mc2RyYW0obWVtX21jb3B0MSwgdmFsdWUpOworCXByaW50ZiAoIiAgICBTRFJBTTBfQ0ZHICAgOiAweCUwOHhcbiIsIHZhbHVlKTsKKwltZnNkcmFtKG1lbV9zdGF0dXMsIHZhbHVlKTsKKwlwcmludGYgKCIgICAgU0RSQU0wX1NUQVRVUzogMHglMDh4XG4iLCB2YWx1ZSk7CisJbWZzZHJhbShtZW1fbWIwY2YsIHZhbHVlKTsKKwlwcmludGYgKCIgICAgU0RSQU0wX0IwQ1IgIDogMHglMDh4XG4iLCB2YWx1ZSk7CisJbWZzZHJhbShtZW1fbWIxY2YsIHZhbHVlKTsKKwlwcmludGYgKCIgICAgU0RSQU0wX0IxQ1IgIDogMHglMDh4XG4iLCB2YWx1ZSk7CisJbWZzZHJhbShtZW1fc2R0cjEsIHZhbHVlKTsKKwlwcmludGYgKCIgICAgU0RSQU0wX1RSICAgIDogMHglMDh4XG4iLCB2YWx1ZSk7CisJbWZzZHJhbShtZW1fcnRyLCB2YWx1ZSk7CisJcHJpbnRmICgiICAgIFNEUkFNMF9SVFIgICA6IDB4JTA4eFxuIiwgdmFsdWUpOworfQorI2VuZGlmCisKKy8qCisgKiB0aGlzIGlzIGV2ZW4gYWZ0ZXIgY2hlY2tib2FyZC4gSXQgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgU0RSQU0KKyAqIHRoYXQgd2UgaGF2ZSBpbnN0YWxsZWQuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGJvYXJkX2luaXRfZgorICogaW4gbGliX3BwYy9ib2FyZC5jIHRvIGluaXRpYWxpemUgdGhlIG1lbW9yeSBhbmQgcmV0dXJuIHdoYXQgSQorICogZm91bmQuIFRoZXNlIGFyZSBkZWZhdWx0IHZhbHVlLCB3aGljaCB3aWxsIGJlIG92ZXJyaWRkZW4gbGF0ZXIuCisgKi8KKworbG9uZyBpbnQgZml4ZWRfaGN1NF9zZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisjaWZkZWYgREVCVUcKKwlwcmludGYgKF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKKwkvKiBkaXNhYmxlIG1lbW9yeSBjb250cm9sbGVyICovCisJbXRkY3IgKG1lbWNmZ2EsIG1lbV9tY29wdDEpOworCW10ZGNyIChtZW1jZmdkLCAweDAwMDAwMDAwKTsKKworCXVkZWxheSAoNTAwKTsKKworCS8qIENsZWFyIFNEUkFNMF9CRVNSMCAoQnVzIEVycm9yIFN5bmRyb21lIFJlZ2lzdGVyKSAqLworCW10ZGNyIChtZW1jZmdhLCBtZW1fYmVzcmEpOworCW10ZGNyIChtZW1jZmdkLCAweGZmZmZmZmZmKTsKKworCS8qIENsZWFyIFNEUkFNMF9CRVNSMSAoQnVzIEVycm9yIFN5bmRyb21lIFJlZ2lzdGVyKSAqLworCW10ZGNyIChtZW1jZmdhLCBtZW1fYmVzcmIpOworCW10ZGNyIChtZW1jZmdkLCAweGZmZmZmZmZmKTsKKworCS8qIENsZWFyIFNEUkFNMF9FQ0NDRkcgKGRpc2FibGUgRUNDKSAqLworCW10ZGNyIChtZW1jZmdhLCBtZW1fZWNjY2YpOworCW10ZGNyIChtZW1jZmdkLCAweDAwMDAwMDAwKTsKKworCS8qIENsZWFyIFNEUkFNMF9FQ0NFU1IgKEVDQyBFcnJvciBTeW5kcm9tZSBSZWdpc3RlcikgKi8KKwltdGRjciAobWVtY2ZnYSwgbWVtX2VjY2Vycik7CisJbXRkY3IgKG1lbWNmZ2QsIDB4ZmZmZmZmZmYpOworCisJLyogVGltaW5nIHJlZ2lzdGVyOiBDQVNMPTIsIFBUQT0yLCBDVFA9MiwgTERGPTEsIFJGVEE9NSwgUkNEPTIKKwkgKiBUT0RPIG5nbmduZworCSAqLworCW10ZGNyIChtZW1jZmdhLCBtZW1fc2R0cjEpOworCW10ZGNyIChtZW1jZmdkLCAweDAwOGE0MDE1KTsKKworCS8qIE1lbW9yeSBCYW5rIDAgQ29uZmlnID09IEJBPTB4MDAwMDAwMDAsIFNaPTY0TSwgQU09MywgQkU9MQorCSAqIFRPRE8gbmduZ25nCisJICovCisJbXRkY3IgKG1lbWNmZ2EsIG1lbV9tYjBjZik7CisJbXRkY3IgKG1lbWNmZ2QsIDB4MDAwNjIwMDEpOworCisJLyogcmVmcmVzaCB0aW1lciA9IDB4NDAwICAqLworCW10ZGNyIChtZW1jZmdhLCBtZW1fcnRyKTsKKwltdGRjciAobWVtY2ZnZCwgMHgwNDAwMDAwMCk7CisKKwkvKiBQb3dlciBtYW5hZ2VtZW50IGlkbGUgdGltZXIgc2V0IHRvIHRoZSBkZWZhdWx0LiAqLworCW10ZGNyIChtZW1jZmdhLCBtZW1fcG1pdCk7CisJbXRkY3IgKG1lbWNmZ2QsIDB4MDdjMDAwMDApOworCisJdWRlbGF5ICg1MDApOworCisJLyogRW5hYmxlIGJhbmtzIChEQ0U9MSwgQlBSRj0xLCBFQ0NERD0xLCBFTURVTD0xKSBUT0RPICovCisJbXRkY3IgKG1lbWNmZ2EsIG1lbV9tY29wdDEpOworCW10ZGNyIChtZW1jZmdkLCAweDkwODAwMDAwKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgiJXM6IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKKwlyZXR1cm4gU0RSQU1fTEVOOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIGdldFNlcmlhbE5yCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdTMyIGdldFNlcmlhbE5yKHZvaWQpCit7CisJdTMyICpzZXJpYWwgPSAodTMyICopQ0ZHX0ZMQVNIX0JBU0U7CisKKwlpZiAoKnNlcmlhbCA9PSAweGZmZmZmZmZmKQorCQlyZXR1cm4gZ2V0X3RpY2tzKCk7CisKKwlyZXR1cm4gKnNlcmlhbDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIG1pc2NfaW5pdF9yLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgbWlzY19pbml0X3Iodm9pZCkKK3sKKwljaGFyICpzID0gZ2V0ZW52KCJldGhhZGRyIik7CisJY2hhciAqZTsKKwlpbnQgaTsKKwl1MzIgc2VyaWFsID0gZ2V0U2VyaWFsTnIoKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKKwkJZ2QtPmJkLT5iaV9lbmV0YWRkcltpXSA9IHMgPyBzaW1wbGVfc3RydG91bCAocywgJmUsIDE2KSA6IDA7CisJCWlmIChzKQorCQkJcyA9ICgqZSkgPyBlICsgMSA6IGU7CisJfQorCisJaWYgKGdkLT5iZC0+YmlfZW5ldGFkZHJbM10gPT0gMCAmJgorCSAgICBnZC0+YmQtPmJpX2VuZXRhZGRyWzRdID09IDAgJiYKKwkgICAgZ2QtPmJkLT5iaV9lbmV0YWRkcls1XSA9PSAwKSB7CisJCWNoYXIgZXRoYWRkclsyMl07CisJCS8qIFswLi4zXSBNdXN0IGJlIGluIHN5bmMgd2l0aCBDT05GSUdfRVRIQUREUiAqLworCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzBdID0gMHgwMDsKKwkJZ2QtPmJkLT5iaV9lbmV0YWRkclsxXSA9IDB4NjA7CisJCWdkLT5iZC0+YmlfZW5ldGFkZHJbMl0gPSAweDEzOworCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzNdID0gKHNlcmlhbCAgICAgICAgICA+PiAxNikgJiAweGZmOworCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzRdID0gKHNlcmlhbCAgICAgICAgICA+PiAgOCkgJiAweGZmOworCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzVdID0gKHNlcmlhbCAgICAgICAgICA+PiAgMCkgJiAweGZmOworCQlzcHJpbnRmIChldGhhZGRyLCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcMCIsCisJCQkgZ2QtPmJkLT5iaV9lbmV0YWRkclswXSwgZ2QtPmJkLT5iaV9lbmV0YWRkclsxXSwKKwkJCSBnZC0+YmQtPmJpX2VuZXRhZGRyWzJdLCBnZC0+YmQtPmJpX2VuZXRhZGRyWzNdLAorCQkJIGdkLT5iZC0+YmlfZW5ldGFkZHJbNF0sIGdkLT5iZC0+YmlfZW5ldGFkZHJbNV0pIDsKKwkJcHJpbnRmKCIlczogU2V0dGluZyBldGggJXMgc2VyaWFsIDB4JXhcbiIsICBfX0ZVTkNUSU9OX18sCisJCSAgICAgICBldGhhZGRyLCBzZXJpYWwpOworCQlzZXRlbnYgKCJldGhhZGRyIiwgZXRoYWRkcik7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgIERPX1VHTFlfU0RSQU1fV09SS0FST1VORAorI2luY2x1ZGUgImkyYy5oIgorCit2b2lkIHNldF9zcGRfZGVmYXVsdF92YWx1ZSh1bnNpZ25lZCBpbnQgc3BkX2FkZHIsdWNoYXIgZGVmX3ZhbCkKK3sKKwl1Y2hhciB2YWx1ZTsKKwlpbnQgcmVzID0gaTJjX3JlYWQoU1BEX0VFUFJPTV9BRERSRVNTLCBzcGRfYWRkciwgMSwgJnZhbHVlLCAxKSA7CisKKwlpZiAocmVzID09IDAgJiYgdmFsdWUgPT0gMHhmZikgeworCQlyZXMgPSBpMmNfd3JpdGUoU1BEX0VFUFJPTV9BRERSRVNTLAorCQkJCXNwZF9hZGRyLCAxLCAmZGVmX3ZhbCwgMSkgOworI2lmZGVmIERFQlVHCisJCXByaW50ZigiJXM6IFNldHRpbmcgc3BkIG9mZnNldCAlM2QgdG8gJTNkIHJlcyAlZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgc3BkX2FkZHIsICBkZWZfdmFsLCByZXMpOworI2VuZGlmCisJfQorfQorI2VuZGlmCisKK2xvbmcgaW50IGluaXRkcmFtKGludCBib2FyZF90eXBlKQoreworCWxvbmcgZHJhbV9zaXplID0gMDsKKworI2lmICFkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorCWRyYW1fc2l6ZSA9IGZpeGVkX2hjdTRfc2RyYW0oKTsKKyNlbHNlCisjaWZkZWYgIERPX1VHTFlfU0RSQU1fV09SS0FST1VORAorCS8qIFdvcmthcm91bmQgaWYgeW91IGhhdmUgbm8gd29ya2luZyBJMkMtRUVQUk9NLVNQRC1jb25maWd1cmF0aW9uICovCisJaTJjX2luaXQoQ0ZHX0kyQ19TUEVFRCwgQ0ZHX0kyQ19TTEFWRSk7CisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDIsICA0KTsgLyogU0RSQU0gVHlwZSAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSg3LCAgMCk7IC8qIG1vZHVsZSB3aWR0aCwgaGlnaCBieXRlICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDEyLCAxKTsgLyogUmVmcmVzaCBvciAweDgxICovCisKKwkvKiBPbmx5IGNvcnJlY3QgZm9yIEhDVTMgd2l0aCAzMiBNQiBSQU0qLworCS8qIE51bWJlciBvZiBieXRlcyB1c2VkIGJ5IG1vZHVsZSBtYW51ZmFjdHVyZXIgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoIDAsIDEyOCk7CisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKCAxLCAxMSApOyAvKiBUb3RhbCBTUEQgbWVtb3J5IHNpemUgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoIDIsIDQgICk7IC8qIE1lbW9yeSB0eXBlICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKCAzLCAxMiApOyAvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3MgYml0cyAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSggNCwgOSAgKTsgLyogTnVtYmVyIG9mIGNvbHVtbiBhZGRyZXNzIGJpdHMgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoIDUsIDEgICk7IC8qIE51bWJlciBvZiBtb2R1bGUgcm93cyAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSggNiwgMzIgKTsgLyogTW9kdWxlIGRhdGEgd2lkdGgsIExTQiAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSggNywgMCAgKTsgLyogTW9kdWxlIGRhdGEgd2lkdGgsIE1TQiAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSggOCwgMSAgKTsgLyogTW9kdWxlIGludGVyZmFjZSBzaWduYWwgbGV2ZWxzICovCisJLyogU0RSQU0gY3ljbGUgdGltZSBmb3IgaGlnaGVzdCBDTCAoVGNsaykgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoIDksIDExMik7CisJLyogU0RSQU0gYWNjZXNzIHRpbWUgZnJvbSBjbG9jayBmb3IgaGlnaGVzdCBDTCAoVGFjKSAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSgxMCwgODQgKTsKKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMTEsIDIgICk7IC8qIE1vZHVsZSBjb25maWd1cmF0aW9uIHR5cGUgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMTIsIDEyOCk7IC8qIFJlZnJlc2ggcmF0ZS90eXBlICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDEzLCAxNiApOyAvKiBQcmltYXJ5IFNEUkFNIHdpZHRoICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDE0LCA4ICApOyAvKiBFcnJvciBDaGVja2luZyBTRFJBTSB3aWR0aCAqLworCS8qIFNEUkFNIGRldmljZSBhdHRyaWJ1dGVzLCBtaW4gY2xvY2sgZGVsYXkgZm9yIGJhY2sgdG8gYmFjayAqLworCS8qcmFuZG9tIGNvbHVtbiBhZGRyZXNzZXMgKFRjY2QpICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDE1LCAxICApOworCS8qIFNEUkFNIGRldmljZSBhdHRyaWJ1dGVzLCBidXJzdCBsZW5ndGhzIHN1cHBvcnRlZCAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSgxNiwgMTQzKTsKKwkvKiBTRFJBTSBkZXZpY2UgYXR0cmlidXRlcywgbnVtYmVyIG9mIGJhbmtzIG9uIFNEUkFNIGRldmljZSAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSgxNywgNCAgKTsKKwkvKiBTRFJBTSBkZXZpY2UgYXR0cmlidXRlcywgQ0FTIGxhdGVuY3kgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMTgsIDYgICk7CisJLyogU0RSQU0gZGV2aWNlIGF0dHJpYnV0ZXMsIENTIGxhdGVuY3kgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMTksIDEgICk7CisJLyogU0RSQU0gZGV2aWNlIGF0dHJpYnV0ZXMsIFdFIGxhdGVuY3kgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMjAsIDEgICk7CisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDIxLCAwICApOyAvKiBTRFJBTSBtb2R1bGUgYXR0cmlidXRlcyAqLworCS8qIFNEUkFNIGRldmljZSBhdHRyaWJ1dGVzLCBnZW5lcmFsICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDIyLCAxNCApOworCS8qIFNEUkFNIGN5Y2xlIHRpbWUgZm9yIDJuZCBoaWdoZXN0IENMIChUY2xrKSAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSgyMywgMTE3KTsKKwkvKiBTRFJBTSBhY2Nlc3MgdGltZSBmcm9tIGNsb2NrIGZvcjJuZCBoaWdoZXN0IENMIChUYWMpICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDI0LCA4NCApOworCS8qIFNEUkFNIGN5Y2xlIHRpbWUgZm9yIDNyZCBoaWdoZXN0IENMIChUY2xrKSAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSgyNSwgMCAgKTsKKwkvKiBTRFJBTSBhY2Nlc3MgdGltZSBmcm9tIGNsb2NrIGZvcjNyZCBoaWdoZXN0IENMIChUYWMpICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDI2LCAwICApOworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSgyNywgMTUgKTsgLyogTWluaW11bSByb3cgcHJlY2hhcmdlIHRpbWUgKFRycCkgKi8KKwkvKiBNaW5pbXVtIHJvdyBhY3RpdmUgdG8gcm93IGFjdGl2ZSBkZWxheSAoVHJyZCkgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMjgsIDE0ICk7CisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDI5LCAxNSApOyAvKiBNaW5pbXVtIENBUyB0byBSQVMgZGVsYXkgKFRyY2QpICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDMwLCAzNyApOyAvKiBNaW5pbXVtIFJBUyBwdWxzZSB3aWR0aCAoVHJhcykgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMzEsIDggICk7IC8qIE1vZHVsZSBiYW5rIGRlbnNpdHkgKi8KKwkvKiBDb21tYW5kIGFuZCBBZGRyZXNzIHNpZ25hbCBpbnB1dCBzZXR1cCB0aW1lICovCisJc2V0X3NwZF9kZWZhdWx0X3ZhbHVlKDMyLCAyMSApOworCS8qIENvbW1hbmQgYW5kIEFkZHJlc3Mgc2lnbmFsIGlucHV0IGhvbGQgdGltZSAqLworCXNldF9zcGRfZGVmYXVsdF92YWx1ZSgzMywgOCAgKTsKKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMzQsIDIxICk7IC8qIERhdGEgc2lnbmFsIGlucHV0IHNldHVwIHRpbWUgKi8KKwlzZXRfc3BkX2RlZmF1bHRfdmFsdWUoMzUsIDggICk7IC8qIERhdGEgc2lnbmFsIGlucHV0IGhvbGQgdGltZSAqLworI2VuZGlmICAvKiBET19VR0xZX1NEUkFNX1dPUktBUk9VTkQgKi8KKwlkcmFtX3NpemUgPSBzcGRfc2RyYW0oMCk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHCisJc2hvd19zZHJhbV9yZWdpc3RlcnMoKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfRFJBTV9URVNUKQorCWJjdTRfdGVzdGRyYW0oZHJhbV9zaXplKTsKKwlwcmludGYoIiVzICVkIE1CIG9mIFNEUkFNXG4iLCBfX0ZVTkNUSU9OX18sIGRyYW1fc2l6ZS8oMTAyNCoxMDI0KSk7CisjZW5kaWYKKworCXJldHVybiBkcmFtX3NpemU7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9uZXRzdGFsL2hjdTQvdS1ib290LmxkcyBiL2JvYXJkL25ldHN0YWwvaGN1NC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTI4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2hjdTQvdS1ib290LmxkcwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA0CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLnJlc2V0dmVjIDB4RkZGRkZGRkMgOgorICB7CisgICAgKigucmVzZXR2ZWMpCisgIH0gPSAweGZmZmYKKworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICAgICAgOiB7CisgICAgLyogVGhlIHN0YXJ0Lm8gZmlsZSBpbmNsdWRlcyB0aGUgaW5pdGlhbCBqdW1wIHZlY3RvciB0aGF0CisgICAgICAgbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBiZWdpbm5pbmcuIEl0IGlzIHRoZSBiYXNpYyBydW4tCisgICAgICAgdGltZSBmdW5jdGlvbiB0aGF0IGNhbGxzIGFsbCBvdGhlciBmdW5jdGlvbnMuICovCisgICAgY3B1L3BwYzR4eC9zdGFydC5vCSgudGV4dCkKKworLyogICAgLiA9IGVudl9vZmZzZXQ7Ki8KKy8qICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KSovCisKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICAgICooLmdvdDEpCisgIH0KKyAgX2V0ZXh0ID0gLjsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3RhbC9oY3U1L01ha2VmaWxlIGIvYm9hcmQvbmV0c3RhbC9oY3U1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTMxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2hjdTUvTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDcgTmV0c3RhbCBNYXNjaGluZW4gQUcKKyMgTmlrbGF1cyBHaWdlciAobmdAbmV0c3RhbC5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK3ZwYXRoIGZsYXNoLmMgLi4vY29tbW9uCitDT0JKUwk9ICQoQk9BUkQpLm8gc2RyYW0ubyBmbGFzaC5vCitTT0JKUwk9IGluaXQubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoU09CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvaGN1NS9SRUFETUUudHh0IGIvYm9hcmQvbmV0c3RhbC9oY3U1L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExOGRhOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YWwvaGN1NS9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTc0IEBACitIQ1U1IGNvbmZpZ3VyYXRpb24gZGV0YWlscyBhbmQgc3RhcnR1cCBzZXF1ZW5jZQorCisoQykgQ29weXJpZ2h0IDIwMDcgTmV0c3RhbCBNYXNjaGluZW4gQUcKKyAgICBOaWtsYXVzIEdpZ2VyIChOaWtsYXVzLkdpZ2VyQG5ldHN0YWwuY29tKQorCitUT0RPOgorLS0tLS0KKy0gRml4IGVycm9yOiBXYWl0aW5nIGZvciBQSFkgYXV0byBuZWdvdGlhdGlvbiB0byBjb21wbGV0ZS4uLi4uIFRJTUVPVVQgIQorICAgICAtIERvZXMgbm90IG9jY3VyIGlmIGJvdGggRU1BQyBhcmUgY29ubmVjdGVkCistIEZpeCBSVFMvQ1RTIHByb2JsZW0gKEhXPykKKyAgQ09ORklHX1NFUklBTF9NVUxUSS9DT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gaGFuZ3MgYWZ0ZXIKKyAgU3dpdGNoaW5nIHRvIGludGVycnVwdCBkcml2ZW4gc2VyaWFsIGlucHV0IG1vZGUKKy0gTWFrZSB2eFdvcmtzIHN0YXJ0IGZyb20gdS1ib290LiBQb3NzaWJsZSByZWFzb25zCisgICAgLSBEb2VzIHZ4V29ya3MgbmVlZCBhbiBlbnRyeSBmb3IgdGhlIE1hY2hpbmUgQ2hlY2sgaW50ZXJydXB0IGxpa2UgdGhpcworICAgICAgdGxiZW50cnkoIDB4NDAwMDAwMDAsIFNaXzI1Nk0sIDAsIDEsIEFDX1J8QUNfV3xBQ19YfFNBX0d8U0FfSSApID8KKworQ2F2ZWF0czoKKy0tLS0tLS0tCitFcnJhdGEgQ0hJUF84OiBJbmNvcnJlY3QgV3JpdGUgdG8gRERSIFNEUkFNLiAod2FzIG5vdCBhcHBsaWVkIHRvIHNlcXVvaWEuYykKK3NlZSBoY3U1LmMuCisKKworTWVtb3J5IEJhbmsgMCAtLSBGbGFzaCBjaGlwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMHhmZmYwMDAwMCAtIDB4ZmZmZmZmZmYKKworVGhlIGZsYXNoIGNoaXAgaXMgcmVhbGx5IG9ubHkgNTEyS2J5dGVzLCBidXQgdGhlIGhpZ2ggYWRkcmVzcyBiaXQgb2YKK3RoZSAxTWVnIHJlZ2lvbiBpcyBpZ25vcmVkLCBzbyB0aGUgZmxhc2ggaXMgcmVwbGljYXRlZCB0aHJvdWdoIHRoZQorcmVnaW9uLiBUaHVzLCB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBhIGZsYXNoIGJhc2UgYWRkcmVzcyAweGZmZjgwMDAwLgorCitUaGUgcGxhY2VtZW50IGF0IHRoZSBlbmQgaXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHJlc2V0IGJlaGF2aW9yLAord2hlcmUgdGhlIHByb2Nlc3NvciBpdHNlbGYgaW5pdGlhbGx5IHVzZXMgdGhpcyBidXMgdG8gbG9hZCB0aGUgYnJhbmNoCit2ZWN0b3IgYW5kIHN0YXJ0IHJ1bm5pbmcuCisKK09uLUNoaXAgTWVtb3J5CistLS0tLS0tLS0tLS0tLQorCisweGUwMDEwMDAwLSAweGUwMDEzZmZmICAgQ0ZHX09DTV9CQVNFCitUaGUgNDQwRVB4IGluY2x1ZGVzIGEgMTZLIG9uLWNoaXAgbWVtb3J5IHRoYXQgY2FuIGJlIHBsYWNlZCBob3dldmVyCitzb2Z0d2FyZSBjaG9vc2VzLgorCitJbnRlcm5hbCBQZXJpcGhlcmFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMHhlZjYwMDMwMCAtIDB4ZWY2MDA4ZmYKKworVGhlc2UgYXJlIHNjYXR0ZXJlZCB2YXJpb3VzIHBlcmlwaGVyYWxzIGludGVybmFsIHRvIHRoZSBQUEM0NDBFUFgKK2NoaXAuCisKK0NoaXAtU2VsZWN0IDI6IEZsYXNoIE1lbW9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdCB1c2VkCisKK0NoaXAtU2VsZWN0IDM6IENBTiBJbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzB4YzgwMDAwMDogMiBJbnRlbCA4MjUyNyBDQU4tQ29udHJvbGxlcgorCisKK0NoaXAtU2VsZWN0IDQ6IElNQy1idXMgc3RhbmRhcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMHhjYzAwMDAwOiBOZXRzdGFsIHNwZWNpZmljIElPLUJ1cworCisKK0NoaXAtU2VsZWN0IDU6IElNQy1idXMgZmFzdCAoaW5hY3RpdmUpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisweGNlMDAwMDA6IE5ldHN0YWwgc3BlY2lmaWMgSU8tQnVzIChmYXN0LCBidXQgbm90IHlldCB1c2VkKQorCisKK01lbW9yeSBCYW5rIDEgLS0gRERSMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisweDAwMDAwMDAwIC0gMHhmZmZmZmZmICAgIyBEZWZhdWx0IDI1NiBNQgorCitQQ0kgPz8KKworVVNCID8/CitPbmx5IFVTQl9TVE9SQUdFIGlzIGVuYWJsZWQgdG8gbG9hZCB2eFdvcmtzCitmcm9tIGEgbWVtb3J5IHN0aWNrLgorCitTeXN0ZW0tTEVEcyA/Pz8gKEFuYWxvZyB6dSBIQ1U0ID8/PykKKworU3RhcnR1cCBzZXF1ZW5jZQorLS0tLS0tLS0tLS0tLS0tLQorCisoY3B1L3BwYzR4eC9yZXNldHZlYy5TKQorZGVwZW5kaW5nIG9uIGNvbmZpZ3Mgb3B0aW9uCitjYWxsIF9zdGFydF80NDAgX3N0YXJ0X3BjaSBvZGVyIF9zdGFydAorCisoY3B1L3BwYzR4eC9zdGFydC5TKQorCitfc3RhcnRfNDQwOgorCWluaXRpYWxpemUgcmVnaXN0ZXIgbGlrZQorCUNDUjAKKwlkZWJ1ZworCXNldHVwIGludGVycnVwdCB2ZWN0b3JzCisJY29uZmlndXJlIGNhY2hlIHJlZ2lvbnMKKwljbGVhciBhbmQgc2V0dXAgVExCCisJZW5hYmxlIGludGVybmFsIFJBTQorCWp1bXAgc3RhcnRfcmFtCisJd2hpY2ggaW4gdHVybiB3aWxsIGp1bXAgdG8gc3RhcnQKK19zdGFydDoKKwlDbGVhciBhbmQgc2V0IHVwIHNvbWUgcmVnaXN0ZXJzLgorCURlYnVnIHNldHVwCisJU2V0dXAgdGhlIGludGVybmFsIFNSQU0KKwlTZXR1cCB0aGUgc3RhY2sgaW4gaW50ZXJuYWwgU1JBTQorICAgIHNldHVwIHN0YWNrIHBvaW50ZXIgKHIxKQorICAgIHNldHVwIEdPVAorCWNhbGwgY3B1X2luaXRfZgkvKiBydW4gbG93LWxldmVsIENQVSBpbml0IGNvZGUJICAgKGZyb20gRmxhc2gpICovCisKKyAgICBjYWxsIGNwdV9pbml0X2YKKyAgICBib2FyZF9pbml0X2Y6IChsaWJfcHBjXGJvYXJkLmMpCisJaW5pdF9zZXF1ZW5jZSBkZWZpbmVzIGEgbGlzdCBvZiBmdW5jdGlvbiB0byBiZSBjYWxsZWQKKwkgICAgYm9hcmRfZWFybHlfaW5pdF9mOiAoYm9hcmQvbmV0c3RhbC9oY3U1L2hjdTUuYykKKwkJV2UgYXJlIHVzaW5nIEJvb3RzdHJhcC1PcHRpb24gQQorCQlpZiBDUFIwX0lDRkdfUkxJX01BU0sgPT0gMCB0aGVuIHNldCBzb21lIHJlZ2lzdGVycyBhbmQgcmVib290CisJCVNldHVwIHRoZSBHUElPIHBpbnMKKwkJU2V0dXAgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHBvbGFyaXRpZXMsIHRyaWdnZXJzLCBldGMuCisJCUV0aGVybmV0LCBQQ0ksIFVTQiBlbmFibGUKKwkJc2V0dXAgQk9PVCBGTEFTSCAoQ2hpcCB0aW1pbmcpCisJICAgIGluaXRfYmF1ZHJhdGUsCisJICAgIHNlcmlhbF9pbml0CisJICAgIGNoZWNrY3B1CisJICAgIG1pc2NfaW5pdF9mICNpZmRlZgorCSAgICBpbml0X2Z1bmNfaTJjICNpZmRlZgorCSAgICBwb3N0X2luaXRfZiAgI2lmZGVmCisJICAgIGluaXRfZnVuY19yYW0gLT4gY2FsbHMgaW5pdF9kcmFtIGJvYXJkL25ldHN0YWwvaGN1NS9zZHJhbS5jCisJCShFWUUgZnVuY3Rpb24gcmVtb3ZlZCEhKQorCSAgICB0ZXN0X2RyYW0gY2FsbAorCisJICogUmVzZXJ2ZSBtZW1vcnkgYXQgZW5kIG9mIFJBTSBmb3IgKHRvcCBkb3duIGluIHRoYXQgb3JkZXIpOgorCSAqICAtIGtlcm5lbCBsb2cgYnVmZmVyCisJICogIC0gcHJvdGVjdGVkIFJBTQorCSAqICAtIExDRCBmcmFtZWJ1ZmZlcgorCSAqICAtIG1vbml0b3IgY29kZQorCSAqICAtIGJvYXJkIGluZm8gc3RydWN0CisJU2F2ZSBsb2NhbCB2YXJpYWJsZXMgdG8gYm9hcmQgaW5mbyBzdHJ1Y3QKKwljYWxsIHJlbG9jYXRlX2NvZGUoKSBkb2VzIG5vdCByZXR1cm4KKwlyZWxvY2F0ZV9jb2RlOiAoY3B1L3BwYzR4eC9zdGFydC5TKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnJvbSBub3cgb24gb3VyIGNvcHkgaXMgaW4gUkFNIGFuZCB3ZSB3aWxsIHJ1biBmcm9tIHRoZXJlLAorCXN0YXJ0aW5nIHdpdGggYm9hcmRfaW5pdF9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgYm9hcmRfaW5pdF9yOiAobGliX3BwY1xib2FyZC5jKQorCXNldHVwIGJkIGZ1bmN0aW9uIHBvaW50ZXJzCisJdHJhcF9pbml0CisJZmxhc2hfaW5pdDogKGJvYXJkL25ldHN0YWwvaGN1NS9mbGFzaC5jKQorCQkvKiBzZXR1cCBmb3IgdS1ib290IGVyYXNlLCB1cGRhdGUgKi8KKwlzZXR1cCBiZCBmbGFzaCBpbmZvCisJY3B1X2luaXRfcjogKGNwdS9wcGM0eHgvY3B1X2luaXQuYykKKwkgICAgcGVyaXBoZXJhbCBjaGlwIHNlbGVjdCBpbiB1c2luZyBkZWZpbmVzIGxpa2UKKwkgICAgQ0ZHX0VCQ19QQjBBLCBDRkdfRUJDX1BCMEMgZnJvbSBoY3U1LmgKKwltZW1fbWFsbG9jX2luaXQKKwltYWxsb2NfYmluX3JlbG9jCisJc3BpX2luaXQgKHIgb3IgZik/Pz8gKENGR19FTlZfSVNfSU5fRUVQUk9NKQorCWVudl9yZWxvY2F0ZWQKKwltaXNjX2luaXRfcihiZCk6IChib2FyZC9uZXRzdGFsL2hjdTUuYykKKwkgICAgZXRoYWRkciBtaXQgc2VyaWFsIG51bWJlciBlcmfkbnplbgorICAgIFRoZW4gd2Ugd2lsbCBzb21laG93IGdvIGludG8gdGhlIGNvbW1hbmQgbG9vcAorCitNb3N0IG9mIHRoZSBIVyBzcGVjaWZpYyBjb2RlIGZvciB0aGUgSENVNSBtYXkgYmUgZm91bmQgaW4KK2luY2x1ZGUvY29uZmlncy9oY3U1LmgKK2JvYXJkL25ldHN0YWwvaGN1NS8qCitjcHUvcHBjNHh4LyoKK2xpYl9wcGMvKgoraW5jbHVkZS9wcGM0NDAuaAorCitEcml2ZXJzIGZvciBzZXJpYWwgZXRjIGFyZSBmb3VuZCB1bmRlciBkcml2ZXJzLworCitEb24ndCBhc2sgcXVlc3Rpb24gaWYgeW91IGRpZCBub3QgbG9vayBhdCB0aGUgUkVBRE1FICEhCitNb3N0IENGR18qIGFuZCBDT05GSUdfKiBzd2l0Y2hlcyBhcmUgbWVudGlvbmVkL2V4cGxhaW5lZCB0aGVyZS4KZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvaGN1NS9jb25maWcubWsgYi9ib2FyZC9uZXRzdGFsL2hjdTUvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDU3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2hjdTUvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA1IE5ldHN0YWwgTWFzY2hpbmVuIEFHCisjICAgICBOaWtsYXVzIEdpZ2VyIChuZ0BuZXRzdGFsLmNvbSkKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIworIyBOZXRzdGFsIE1hc2NoaW5lbiBBRzogSENVNSBib2FyZHMKKyMKKworVEVYVF9CQVNFID0gMHhGRkZhMDAwMAorCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR180NDA9MQorCitpZmVxICgkKGRlYnVnKSwxKQorUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURERUJVRyAtZworZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvaGN1NS9oY3U1LmMgYi9ib2FyZC9uZXRzdGFsL2hjdTUvaGN1NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGYwODEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2hjdTUvaGN1NS5jCkBAIC0wLDAgKzEsNTI1IEBACisvKgorICooQykgQ29weXJpZ2h0IDIwMDUtMjAwNyBOZXRzdGFsIE1hc2NoaW5lbiBBRworICogICAgTmlrbGF1cyBHaWdlciAoTmlrbGF1cy5HaWdlckBuZXRzdGFsLmNvbSkKKyAqCisgKiAgICBUaGlzIHNvdXJjZSBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CisgKiAgICBhbmQvb3IgbW9kaWZ5IGl0IGluIHNvdXJjZSBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8cHBjNDQwLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwordm9pZCBzeXNMZWRTZXQodTMyIHZhbHVlKTsKKworZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW0NGR19NQVhfRkxBU0hfQkFOS1NdOworCisjdW5kZWYgQk9PVFNUUkFQX09QVElPTl9BX0FDVElWRQorCisjZGVmaW5lIFNEUjBfQ1A0NDAJCTB4MDE4MAorCisjZGVmaW5lIFNZU1RFTV9SRVNFVAkJMHgzMDAwMDAwMAorI2RlZmluZSBDSElQX1JFU0VUCQkweDIwMDAwMDAwCisKKyNkZWZpbmUgU0RSMF9FQ0lEMAkJMHgwMDgwCisjZGVmaW5lIFNEUjBfRUNJRDEJCTB4MDA4MQorI2RlZmluZSBTRFIwX0VDSUQyCQkweDAwODIKKyNkZWZpbmUgU0RSMF9FQ0lEMwkJMHgwMDgzCisKKyNkZWZpbmUgU1lTX0lPX0FERFJFU1MJCTB4Y2NlMDAwMDAKKworI2RlZmluZSBERUZBVUxUX0VUSF9BRERSICAiZXRoYWRkciIKKy8qIGV0aGFkZHIgZm9yIGZpcnN0IG9yIGV0aGExZGRyIGZvciBzZWNvbmQgZXRoZXJuZXQgKi8KKworZW51bSB7CisJLyogSFdfR0VORVJBVElPTl9IQ1UxIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KKwlIV19HRU5FUkFUSU9OX0hDVTIgID0gMHgxMCwKKwlIV19HRU5FUkFUSU9OX0hDVTMgID0gMHgxMCwKKwlIV19HRU5FUkFUSU9OX0hDVTQgID0gMHgyMCwKKwlIV19HRU5FUkFUSU9OX0hDVTUgID0gMHgzMCwKKwlIV19HRU5FUkFUSU9OX01DVSAgID0gMHgwOCwKKwlIV19HRU5FUkFUSU9OX01DVTIwID0gMHgwYSwKKwlIV19HRU5FUkFUSU9OX01DVTI1ID0gMHgwOSwKK307CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcnVuIHZlcnkgZWFybHksIG91dCBvZiBmbGFzaCwgYW5kIGJlZm9yZSBkZXZpY2VzIGFyZQorICogaW5pdGlhbGl6ZWQuIEl0IGlzIGNhbGxlZCBieSBsaWJfcHBjL2JvYXJkLmM6Ym9hcmRfaW5pdF9mIGJ5IHZpcnR1ZQorICogb2YgYmVpbmcgaW4gdGhlIGluaXRfc2VxdWVuY2UgYXJyYXkuCisgKgorICogVGhlIFNEUkFNIGhhcyBiZWVuIGluaXRpYWxpemVkIGFscmVhZHkgLS0gc3RhcnQuUzpzdGFydCBjYWxsZWQKKyAqIGluaXQuUzppbml0X3NkcmFtIGVhcmx5IG9uIC0tIGJ1dCBpdCBpcyBub3QgeWV0IGJlaW5nIHVzZWQgZm9yCisgKiBhbnl0aGluZywgbm90IGV2ZW4gc3RhY2suIFNvIGJlIGNhcmVmdWwuCisgKi8KKworaW50IGJvYXJkX2Vhcmx5X2luaXRfZih2b2lkKQoreworCXUzMiByZWc7CisKKyNpZmRlZiBCT09UU1RSQVBfT1BUSU9OX0FfQUNUSVZFCisJLyogQm9vdGluZyB3aXRoIEJvb3RzdHJhcCBPcHRpb24gQQorCSAqIEZpcnN0IGJvb3QsIHdpdGggQ1BSMF9JQ0ZHX1JMSV9NQVNLID09IDAKKwkgKiBubyB3ZSBzZXR1cCB2YXJpb3MgYm9vdCBzdHJhcHBpbmcgcmVnaXN0ZXIsCisJICogdGhlbiB3ZSBkbyByZXNldCB0aGUgUFBDNDQwIHVzaW5nIGEgY2hpcCByZXNldAorCSAqIFVuZm9ydHVuYXRlbHksIHdlIGNhbm5vdCB1c2UgdGhpcyBvcHRpb24sIGFzIE50bzEgaXMgbm90IHNldAorCSAqIHdpdGggQm9vdHN0cmFwIE9wdGlvbiBBIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCBsYXRlciBvbiBieSBTVworCSAqIFRoZXJlIGFyZSBubyBvdGhlciBwb3NzaWJsZSBib29zdHJhcCBvcHRpb25zIHdpdGggYSA4IGJpdCBST00KKwkgKiBTZWUgRXJyYXRhIChWZXJzaW9uIDEuMDQpIENISVBfOQorCSAqLworCisJdTMyIGNwcjBpY2ZnOworCXUzMiBkYmNyOworCisJbWZjcHIoQ1BSMF9JQ0ZHLCBjcHIwaWNmZyk7CisJaWYgKCEoY3ByMGljZmcgJiBDUFIwX0lDRkdfUkxJX01BU0spKSB7CisJCW10Y3ByKENQUjBfTUFMRCwgICAweDAyMDAwMDAwKTsKKwkJbXRjcHIoQ1BSMF9PUEJELCAgIDB4MDIwMDAwMDApOworCSAgICAgICAgbXRjcHIoQ1BSMF9QRVJELCAgIDB4MDUwMDAwMDApOyAgLyogMTo1ICovCisJCW10Y3ByKENQUjBfUExMQywgICAweDQwMDAwMjM4KTsKKwkJbXRjcHIoQ1BSMF9QTExELCAgIDB4MDEwMTA0MTQpOworCQltdGNwcihDUFIwX1BSSU1BRCwgMHgwMTAwMDAwMCk7CisJCW10Y3ByKENQUjBfUFJJTUJELCAweDAxMDAwMDAwKTsKKwkJbXRjcHIoQ1BSMF9TUENJRCwgIDB4MDMwMDAwMDApOworCQltdHNkcihTRFIwX1BGQzAsICAgMHgwMDAwM0UwMCk7ICAvKiBbQ1RFXSA9IDAgKi8KKwkJbXRzZHIoU0RSMF9DUDQ0MCwgIDB4MEVBQUVBMDIpOyAgLyogW050bzFdID0gMSovCisJCW10Y3ByKENQUjBfSUNGRywgICBjcHIwaWNmZyB8IENQUjBfSUNGR19STElfTUFTSyk7CisKKwkJLyoKKwkJICogSW5pdGlhdGUgc3lzdGVtIHJlc2V0IGluIGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgREJDUgorCQkgKi8KKwkJZGJjciA9IG1mc3ByKGRiY3IwKTsKKwkJbXRzcHIoZGJjcjAsIGRiY3IgfCBDSElQX1JFU0VUKTsKKwl9CisJbXRzZHIoU0RSMF9DUDQ0MCwgMHgwRUFBRUEwMik7ICAvKiBbTnRvMV0gPSAxKi8KKyNlbmRpZgorCW10ZGNyKGViY2NmZ2EsIHhiY2ZnKTsKKwltdGRjcihlYmNjZmdkLCAweGI4NDAwMDAwKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXR1cCB0aGUgR1BJTyBwaW5zCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiB0ZXN0LW9ubHk6IHRha2UgR1BJTyBpbml0IGZyb20gcGNzNDQwZXAgPz8/PyBpbiBjb25maWcgZmlsZSAqLworCW91dDMyKEdQSU8wX09SLCAweDAwMDAwMDAwKTsKKwlvdXQzMihHUElPMF9UQ1IsIDB4N0MyRkYxQ0YpOworCW91dDMyKEdQSU8wX09TUkwsIDB4NDAwNTUwMDApOworCW91dDMyKEdQSU8wX09TUkgsIDB4MDAwMDAwMDApOworCW91dDMyKEdQSU8wX1RTUkwsIDB4NDAwNTUwMDApOworCW91dDMyKEdQSU8wX1RTUkgsIDB4MDAwMDA0MDApOworCW91dDMyKEdQSU8wX0lTUjFMLCAweDQwMDAwMDAwKTsKKwlvdXQzMihHUElPMF9JU1IxSCwgMHgwMDAwMDAwMCk7CisJb3V0MzIoR1BJTzBfSVNSMkwsIDB4MDAwMDAwMDApOworCW91dDMyKEdQSU8wX0lTUjJILCAweDAwMDAwMDAwKTsKKwlvdXQzMihHUElPMF9JU1IzTCwgMHgwMDAwMDAwMCk7CisJb3V0MzIoR1BJTzBfSVNSM0gsIDB4MDAwMDAwMDApOworCisJb3V0MzIoR1BJTzFfT1IsIDB4MDAwMDAwMDApOworCW91dDMyKEdQSU8xX1RDUiwgMHhDNjAwN0ZGRik7CisJb3V0MzIoR1BJTzFfT1NSTCwgMHgwMDE0MDAwMCk7CisJb3V0MzIoR1BJTzFfT1NSSCwgMHgwMDAwMDAwMCk7CisJb3V0MzIoR1BJTzFfVFNSTCwgMHgwMDAwMDAwMCk7CisJb3V0MzIoR1BJTzFfVFNSSCwgMHgwMDAwMDAwMCk7CisJb3V0MzIoR1BJTzFfSVNSMUwsIDB4MDU0MTU1NTUpOworCW91dDMyKEdQSU8xX0lTUjFILCAweDQwMDAwMDAwKTsKKwlvdXQzMihHUElPMV9JU1IyTCwgMHgwMDAwMDAwMCk7CisJb3V0MzIoR1BJTzFfSVNSMkgsIDB4MDAwMDAwMDApOworCW91dDMyKEdQSU8xX0lTUjNMLCAweDAwMDAwMDAwKTsKKwlvdXQzMihHUElPMV9JU1IzSCwgMHgwMDAwMDAwMCk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0dXAgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHBvbGFyaXRpZXMsIHRyaWdnZXJzLCBldGMuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltdGRjcih1aWMwc3IsIDB4ZmZmZmZmZmYpOwkvKiBjbGVhciBhbGwgKi8KKwltdGRjcih1aWMwZXIsIDB4MDAwMDAwMDApOwkvKiBkaXNhYmxlIGFsbCAqLworCW10ZGNyKHVpYzBjciwgMHgwMDAwMDAwNSk7CS8qIEFUSSAmIFVJQzEgY3JpdCBhcmUgY3JpdGljYWwgKi8KKwltdGRjcih1aWMwcHIsIDB4ZmZmZmY3ZmYpOwkvKiBwZXIgcmVmLWJvYXJkIG1hbnVhbCAqLworCW10ZGNyKHVpYzB0ciwgMHgwMDAwMDAwMCk7CS8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCisJbXRkY3IodWljMHZyLCAweDAwMDAwMDAwKTsJLyogaW50MzEgaGlnaGVzdCwgYmFzZT0weDAwMCAqLworCW10ZGNyKHVpYzBzciwgMHhmZmZmZmZmZik7CS8qIGNsZWFyIGFsbCAqLworCisJbXRkY3IodWljMXNyLCAweGZmZmZmZmZmKTsJLyogY2xlYXIgYWxsICovCisJbXRkY3IodWljMWVyLCAweDAwMDAwMDAwKTsJLyogZGlzYWJsZSBhbGwgKi8KKwltdGRjcih1aWMxY3IsIDB4MDAwMDAwMDApOwkvKiBhbGwgbm9uLWNyaXRpY2FsICovCisJbXRkY3IodWljMXByLCAweGZmZmZmZmZmKTsJLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KKwltdGRjcih1aWMxdHIsIDB4MDAwMDAwMDApOwkvKiBwZXIgcmVmLWJvYXJkIG1hbnVhbCAqLworCW10ZGNyKHVpYzF2ciwgMHgwMDAwMDAwMCk7CS8qIGludDMxIGhpZ2hlc3QsIGJhc2U9MHgwMDAgKi8KKwltdGRjcih1aWMxc3IsIDB4ZmZmZmZmZmYpOwkvKiBjbGVhciBhbGwgKi8KKworCW10ZGNyKHVpYzJzciwgMHhmZmZmZmZmZik7CS8qIGNsZWFyIGFsbCAqLworCW10ZGNyKHVpYzJlciwgMHgwMDAwMDAwMCk7CS8qIGRpc2FibGUgYWxsICovCisJbXRkY3IodWljMmNyLCAweDAwMDAwMDAwKTsJLyogYWxsIG5vbi1jcml0aWNhbCAqLworCW10ZGNyKHVpYzJwciwgMHhmZmZmZmZmZik7CS8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCisJbXRkY3IodWljMnRyLCAweDAwMDAwMDAwKTsJLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KKwltdGRjcih1aWMydnIsIDB4MDAwMDAwMDApOwkvKiBpbnQzMSBoaWdoZXN0LCBiYXNlPTB4MDAwICovCisJbXRkY3IodWljMnNyLCAweGZmZmZmZmZmKTsJLyogY2xlYXIgYWxsICovCisJbXRzZHIoc2RyX3BmYzAsIDB4MDAwMDNFMDApOwkvKiBQaW4gZnVuY3Rpb246ICAqLworCW10c2RyKHNkcl9wZmMxLCAweDAwODQ4MDAwKTsJLyogUGluIGZ1bmN0aW9uOiBVQVJUMCBoYXMgNCBwaW5zICovCisKKwkvKiBQQ0kgYXJiaXRlciBlbmFibGVkICovCisJbWZzZHIoc2RyX3BjaTAsIHJlZyk7CisJbXRzZHIoc2RyX3BjaTAsIDB4ODAwMDAwMDAgfCByZWcpOworCisJcGNpX3ByZV9pbml0KDApOworCisJLyogc2V0dXAgQk9PVCBGTEFTSCAqLworCW10c2RyKFNEUjBfQ1VTVDAsIDB4QzAwODIzNTApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBib2FyZF9wcmVfaW5pdCh2b2lkKQoreworCXJldHVybiBib2FyZF9lYXJseV9pbml0X2YoKTsKK30KKworaW50IGNoZWNrYm9hcmQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgajsKKwl1MTYgKmh3VmVyc1JlZyAgICA9ICh1MTYgKikgSENVX0hXX1ZFUlNJT05fUkVHSVNURVI7CisJdTE2ICpib2FyZFZlcnNSZWcgPSAodTE2ICopIEhDVV9DUExEX1ZFUlNJT05fUkVHSVNURVI7CisJdTE2IGdlbmVyYXRpb24gPSAqYm9hcmRWZXJzUmVnICYgMHhmMDsKKwl1MTYgaW5kZXggICAgICA9ICpib2FyZFZlcnNSZWcgJiAweDBmOworCXUzMiBlY2lkMCwgZWNpZDEsIGVjaWQyLCBlY2lkMzsKKworCXByaW50ZigiTmV0c3RhbCBNYXNjaGluZW4gQUc6ICIpOworCWlmIChnZW5lcmF0aW9uID09IEhXX0dFTkVSQVRJT05fSENVMykKKwkJcHJpbnRmKCJIQ1UzOiBpbmRleCAlZCIsIGluZGV4KTsKKwllbHNlIGlmIChnZW5lcmF0aW9uID09IEhXX0dFTkVSQVRJT05fSENVNCkKKwkJcHJpbnRmKCJIQ1U0OiBpbmRleCAlZCIsIGluZGV4KTsKKwllbHNlIGlmIChnZW5lcmF0aW9uID09IEhXX0dFTkVSQVRJT05fSENVNSkKKwkJcHJpbnRmKCJIQ1U1OiBpbmRleCAlZCIsIGluZGV4KTsKKwlwcmludGYoIiBIVyAweCUwMnhcbiIsICpod1ZlcnNSZWcgJiAweGZmKTsKKwltZnNkcihTRFIwX0VDSUQwLCBlY2lkMCk7CisJbWZzZHIoU0RSMF9FQ0lEMSwgZWNpZDEpOworCW1mc2RyKFNEUjBfRUNJRDIsIGVjaWQyKTsKKwltZnNkcihTRFIwX0VDSUQzLCBlY2lkMyk7CisKKwlwcmludGYoIkNoaXAgSUQgMHgleCAweCV4IDB4JXggMHgleFxuIiwgZWNpZDAsIGVjaWQxLCBlY2lkMiwgZWNpZDMpOworCWZvciAoaiA9IDA7aiA8IDY7IGorKykgeworCQlzeXNMZWRTZXQoMSA8PCBqKTsKKwkJdWRlbGF5KDIwMCAqIDEwMDApOworCX0KKworCXJldHVybiAwOworfQorCit1MzIgc3lzTGVkR2V0KHZvaWQpCit7CisJcmV0dXJuIGluMTYoU1lTX0lPX0FERFJFU1MpICYgMHgzZjsKK30KKwordm9pZCBzeXNMZWRTZXQodTMyIHZhbHVlIC8qIHZhbHVlIHRvIHBsYWNlIGluIExFRHMgKi8pCit7CisJb3V0MTYoU1lTX0lPX0FERFJFU1MsIHZhbHVlKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBnZXRTZXJpYWxOcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHUzMiBnZXRTZXJpYWxOcih2b2lkKQoreworCXUzMiAqc2VyaWFsID0gKHUzMiAqKUNGR19GTEFTSF9CQVNFOworCisJaWYgKCpzZXJpYWwgPT0gMHhmZmZmZmZmZikKKwkJcmV0dXJuIGdldF90aWNrcygpOworCisJcmV0dXJuICpzZXJpYWw7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBtaXNjX2luaXRfci4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBtaXNjX2luaXRfcih2b2lkKQoreworCWNoYXIgKnMgPSBnZXRlbnYoREVGQVVMVF9FVEhfQUREUik7CisJY2hhciAqZTsKKwlpbnQgaTsKKwl1MzIgc2VyaWFsID0gZ2V0U2VyaWFsTnIoKTsKKwl1bnNpZ25lZCBsb25nIHVzYjJkMGNyID0gMDsKKwl1bnNpZ25lZCBsb25nIHVzYjJwaHkwY3IsIHVzYjJoMGNyID0gMDsKKwl1bnNpZ25lZCBsb25nIHNkcjBfcGZjMTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKKwkJZ2QtPmJkLT5iaV9lbmV0YWRkcltpXSA9IHMgPyBzaW1wbGVfc3RydG91bChzLCAmZSwgMTYpIDogMDsKKwkJaWYgKHMpCisJCQlzID0gKCplKSA/IGUgKyAxIDogZTsKKwl9CisKKwlpZiAoZ2QtPmJkLT5iaV9lbmV0YWRkclszXSA9PSAwICYmCisJICAgIGdkLT5iZC0+YmlfZW5ldGFkZHJbNF0gPT0gMCAmJgorCSAgICBnZC0+YmQtPmJpX2VuZXRhZGRyWzVdID09IDApIHsKKwkJY2hhciBldGhhZGRyWzIyXTsKKworCQkvKiBNdXN0IGJlIGluIHN5bmMgd2l0aCBDT05GSUdfRVRIQUREUiAqLworCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzBdID0gMHgwMDsKKwkJZ2QtPmJkLT5iaV9lbmV0YWRkclsxXSA9IDB4NjA7CisJCWdkLT5iZC0+YmlfZW5ldGFkZHJbMl0gPSAweDEzOworCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzNdID0gKHNlcmlhbCA+PiAxNikgJiAweGZmOworCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzRdID0gKHNlcmlhbCA+PiAgOCkgJiAweGZmOworCQkvKiBieXRlWzVdLmJpdCAwIG11c3QgYmUgemVybyAqLworCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzVdID0gKHNlcmlhbCA+PiAgMCkgJiAweGZlOworCQlzcHJpbnRmKGV0aGFkZHIsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFwwIiwKKwkJCWdkLT5iZC0+YmlfZW5ldGFkZHJbMF0sIGdkLT5iZC0+YmlfZW5ldGFkZHJbMV0sCisJCQlnZC0+YmQtPmJpX2VuZXRhZGRyWzJdLCBnZC0+YmQtPmJpX2VuZXRhZGRyWzNdLAorCQkJZ2QtPmJkLT5iaV9lbmV0YWRkcls0XSwgZ2QtPmJkLT5iaV9lbmV0YWRkcls1XSkgOworCQlwcmludGYoIiVzOiBTZXR0aW5nIGV0aCAlcyBzZXJpYWwgMHgleFxuIiwgIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIGV0aGFkZHIsIHNlcmlhbCk7CisJCXNldGVudihERUZBVUxUX0VUSF9BRERSLCBldGhhZGRyKTsKKwl9CisKKyNpZmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNICisJLyogTW9uaXRvciBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKwkodm9pZClmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQkgICAgLUNGR19NT05JVE9SX0xFTiwKKwkJCSAgICAweGZmZmZmZmZmLAorCQkJICAgICZmbGFzaF9pbmZvWzBdKTsKKworCS8qIEVudiBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKwkodm9pZClmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQkgICAgQ0ZHX0VOVl9BRERSX1JFRFVORCwKKwkJCSAgICBDRkdfRU5WX0FERFJfUkVEVU5EICsgMipDRkdfRU5WX1NFQ1RfU0laRSAtIDEsCisJCQkgICAgJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCisKKwkvKgorCSAqIFVTQiBzdHVmZi4uLgorCSAqLworCisJLyogU0RSIFNldHRpbmcgKi8KKwltZnNkcihTRFIwX1BGQzEsIHNkcjBfcGZjMSk7CisJbWZzZHIoU0RSMF9VU0IyRDBDUiwgdXNiMmQwY3IpOworCW1mc2RyKFNEUjBfVVNCMlBIWTBDUiwgdXNiMnBoeTBjcik7CisJbWZzZHIoU0RSMF9VU0IySDBDUiwgdXNiMmgwY3IpOworCisJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgJn5TRFIwX1VTQjJQSFkwQ1JfWE9DTEtfTUFTSzsKKwl1c2IycGh5MGNyID0gdXNiMnBoeTBjciB8IFNEUjBfVVNCMlBIWTBDUl9YT0NMS19FWFRFUk5BTDsJLyowKi8KKwl1c2IycGh5MGNyID0gdXNiMnBoeTBjciAmflNEUjBfVVNCMlBIWTBDUl9XRElOVF9NQVNLOworCXVzYjJwaHkwY3IgPSB1c2IycGh5MGNyIHwgU0RSMF9VU0IyUEhZMENSX1dESU5UXzE2QklUXzMwTUhaOwkvKjEqLworCXVzYjJwaHkwY3IgPSB1c2IycGh5MGNyICZ+U0RSMF9VU0IyUEhZMENSX0RWQlVTX01BU0s7CisJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgfCBTRFIwX1VTQjJQSFkwQ1JfRFZCVVNfUFVSRElTOwkJLyowKi8KKwl1c2IycGh5MGNyID0gdXNiMnBoeTBjciAmflNEUjBfVVNCMlBIWTBDUl9EV05TVFJfTUFTSzsKKwl1c2IycGh5MGNyID0gdXNiMnBoeTBjciB8IFNEUjBfVVNCMlBIWTBDUl9EV05TVFJfSE9TVDsJCS8qMSovCisJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgJn5TRFIwX1VTQjJQSFkwQ1JfVVRNSUNOX01BU0s7CisJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgfCBTRFIwX1VTQjJQSFkwQ1JfVVRNSUNOX0hPU1Q7CQkvKjEqLworCisJLyogQW4gOC1iaXQvNjBNSHogaW50ZXJmYWNlIGlzIHRoZSBvbmx5IHBvc3NpYmxlIGFsdGVybmF0aXZlCisJICAgd2hlbiBjb25uZWN0aW5nIHRoZSBEZXZpY2UgdG8gdGhlIFBIWSAqLworCXVzYjJoMGNyICAgPSB1c2IyaDBjciAmflNEUjBfVVNCMkgwQ1JfV0RJTlRfTUFTSzsKKwl1c2IyaDBjciAgID0gdXNiMmgwY3IgfCBTRFIwX1VTQjJIMENSX1dESU5UXzE2QklUXzMwTUhaOwkvKjEqLworCisJLyogVG8gZW5hYmxlIHRoZSBVU0IgMi4wIERldmljZSBmdW5jdGlvbiB0aHJvdWdoIHRoZSBVVE1JIGludGVyZmFjZSAqLworCXVzYjJkMGNyID0gdXNiMmQwY3IgJn5TRFIwX1VTQjJEMENSX1VTQjJERVZfRUJDX1NFTF9NQVNLOworCXVzYjJkMGNyID0gdXNiMmQwY3IgfCBTRFIwX1VTQjJEMENSX1VTQjJERVZfU0VMRUNUSU9OOwkJLyoxKi8KKworCXNkcjBfcGZjMSA9IHNkcjBfcGZjMSAmflNEUjBfUEZDMV9VRVNfTUFTSzsKKwlzZHIwX3BmYzEgPSBzZHIwX3BmYzEgfCBTRFIwX1BGQzFfVUVTX1VTQjJEX1NFTDsJCS8qMCovCisKKwltdHNkcihTRFIwX1BGQzEsIHNkcjBfcGZjMSk7CisJbXRzZHIoU0RSMF9VU0IyRDBDUiwgdXNiMmQwY3IpOworCW10c2RyKFNEUjBfVVNCMlBIWTBDUiwgdXNiMnBoeTBjcik7CisJbXRzZHIoU0RSMF9VU0IySDBDUiwgdXNiMmgwY3IpOworCisJLypjbGVhciByZXNldHMqLworCXVkZWxheSgxMDAwKTsKKwltdHNkcihTRFIwX1NSU1QxLCAweDAwMDAwMDAwKTsKKwl1ZGVsYXkoMTAwMCk7CisJbXRzZHIoU0RSMF9TUlNUMCwgMHgwMDAwMDAwMCk7CisKKwlwcmludGYoIlVTQjogICBIb3N0KGludCBwaHkpIERldmljZShleHQgcGh5KVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBwY2lfcHJlX2luaXQKKyAqCisgKiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBqdXN0IHByaW9yIHRvIHJlZ2lzdGVyaW5nIHRoZSBob3NlIGFuZCBnaXZlcworICogIHRoZSBib2FyZCB0aGUgb3Bwb3J0dW5pdHkgdG8gY2hlY2sgdGhpbmdzLiBSZXR1cm5pbmcgYSB2YWx1ZSBvZiB6ZXJvCisgKiAgaW5kaWNhdGVzIHRoYXQgdGhpbmdzIGFyZSBiYWQgJiBQQ0kgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIGFib3J0ZWQuCisgKgorICoJRGlmZmVyZW50IGJvYXJkcyBtYXkgd2lzaCB0byBjdXN0b21pemUgdGhlIHBjaSBjb250cm9sbGVyIHN0cnVjdHVyZQorICoJKGFkZCByZWdpb25zLCBvdmVycmlkZSBkZWZhdWx0IGFjY2VzcyByb3V0aW5lcywgZXRjKSBvciBwZXJmb3JtCisgKgljZXJ0YWluIHByZS1pbml0aWFsaXphdGlvbiBhY3Rpb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQoraW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIEFzIG9mIGVycmF0YSB2ZXJzaW9uIDAuNCwgQ0hJUF84OiBJbmNvcnJlY3QgV3JpdGUgdG8gRERSIFNEUkFNLgorCSAqIFdvcmthcm91bmQ6IERpc2FibGUgd3JpdGUgcGlwZWxpbmluZyB0byBERFIgU0RSQU0gYnkgc2V0dGluZworCSAqIFBMQjBfQUNSW1dSUF0gPSAwLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICB8IFNldCBwcmlvcml0eSBmb3IgYWxsIFBMQjMgZGV2aWNlcyB0byAwLgorCSAgfCBTZXQgUExCMyBhcmJpdGVyIHRvIGZhaXIgbW9kZS4KKwkgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltZnNkcihzZHJfYW1wMSwgYWRkcik7CisJbXRzZHIoc2RyX2FtcDEsIChhZGRyICYgMHgwMDAwMDBGRikgfCAweDAwMDBGRjAwKTsKKwlhZGRyID0gbWZkY3IocGxiM19hY3IpOworCS8qIG10ZGNyKHBsYjNfYWNyLCBhZGRyICYgfnBsYjFfYWNyX3dycF9tYXNrKTsgKi8gIC8qIG5nbmduZyAqLworCW10ZGNyKHBsYjNfYWNyLCBhZGRyIHwgMHg4MDAwMDAwMCk7IC8qIFNlcXVvaWEgKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgIHwgU2V0IHByaW9yaXR5IGZvciBhbGwgUExCNCBkZXZpY2VzIHRvIDAuCisJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbWZzZHIoc2RyX2FtcDAsIGFkZHIpOworCW10c2RyKHNkcl9hbXAwLCAoYWRkciAmIDB4MDAwMDAwRkYpIHwgMHgwMDAwRkYwMCk7CisJYWRkciA9IG1mZGNyKHBsYjRfYWNyKSB8IDB4YTAwMDAwMDA7CS8qIFdhcyAweDgtLS0tICovCisJLyogbXRkY3IocGxiNF9hY3IsIGFkZHIgJiB+cGxiMV9hY3Jfd3JwX21hc2spOyAqLyAgLyogbmduZ25nICovCisJbXRkY3IocGxiNF9hY3IsIGFkZHIpOyAgLyogU2VxdW9pYSAqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgfCBTZXQgTmVidWxhIFBMQjQgYXJiaXRlciB0byBmYWlyIG1vZGUuCisJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogU2VnbWVudDAgKi8KKwlhZGRyID0gKG1mZGNyKHBsYjBfYWNyKSAmIH5wbGIwX2Fjcl9wcG1fbWFzaykgfCBwbGIwX2Fjcl9wcG1fZmFpcjsKKwlhZGRyID0gKGFkZHIgJiB+cGxiMF9hY3JfaGJ1X21hc2spIHwgcGxiMF9hY3JfaGJ1X2VuYWJsZWQ7CisJYWRkciA9IChhZGRyICYgfnBsYjBfYWNyX3JkcF9tYXNrKSB8IHBsYjBfYWNyX3JkcF80ZGVlcDsKKwkvKiBhZGRyID0gKGFkZHIgJiB+cGxiMF9hY3Jfd3JwX21hc2spOyAqLyAgLyogbmduZ25nICovCisJYWRkciA9IChhZGRyICYgfnBsYjBfYWNyX3dycF9tYXNrKSB8IHBsYjBfYWNyX3dycF8yZGVlcDsgLyogU2VxdW9pYSAqLworCisJLyogbXRkY3IocGxiMF9hY3IsIGFkZHIpOyAqLyAvKiBTZXF1b2lhICovCisJbXRkY3IocGxiMF9hY3IsIDApOyAgLyogUEFUQ0ggSEFCOiBXUklURSBQSVBFTElOSU5HIE9GRiAqLworCisJLyogU2VnbWVudDEgKi8KKwlhZGRyID0gKG1mZGNyKHBsYjFfYWNyKSAmIH5wbGIxX2Fjcl9wcG1fbWFzaykgfCBwbGIxX2Fjcl9wcG1fZmFpcjsKKwlhZGRyID0gKGFkZHIgJiB+cGxiMV9hY3JfaGJ1X21hc2spIHwgcGxiMV9hY3JfaGJ1X2VuYWJsZWQ7CisJYWRkciA9IChhZGRyICYgfnBsYjFfYWNyX3JkcF9tYXNrKSB8IHBsYjFfYWNyX3JkcF80ZGVlcDsKKwlhZGRyID0gKGFkZHIgJiB+cGxiMV9hY3Jfd3JwX21hc2spIDsKKwkvKiBtdGRjcihwbGIxX2FjciwgYWRkcik7ICovIC8qIFNlcXVvaWEgKi8KKwltdGRjcihwbGIxX2FjciwgMCk7ICAvKiBQQVRDSCBIQUI6IFdSSVRFIFBJUEVMSU5JTkcgT0ZGICovCisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19QQ0kpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgcGNpX3RhcmdldF9pbml0CisgKgorICoJVGhlIGJvb3RzdHJhcCBjb25maWd1cmF0aW9uIHByb3ZpZGVzIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBwY2kKKyAqCWluYm91bmQgbWFwIChQSU0pLiBCdXQgdGhlIGJvb3RzdHJhcCBjb25maWcgY2hvaWNlcyBhcmUgbGltaXRlZCBhbmQKKyAqCW1heSBub3QgYmUgc3VmZmljaWVudCBmb3IgYSBnaXZlbiBib2FyZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1RBUkdFVF9JTklUKQordm9pZCBwY2lfdGFyZ2V0X2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBTZXQgdXAgRGlyZWN0IE1NSU8gcmVnaXN0ZXJzCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICB8IFBvd2VyUEM0NDBFUFggUENJIE1hc3RlciBjb25maWd1cmF0aW9uLgorCSAgfCBNYXAgb25lIDFHaWcgcmFuZ2Ugb2YgUExCL3Byb2Nlc3NvciBhZGRyZXNzZXMgdG8gUENJIG1lbW9yeSBzcGFjZS4KKwkgIHwgICBQTEIgYWRkcmVzcyAweEEwMDAwMDAwLTB4REZGRkZGRkYgPT0+IFBDSSBhZGRyZXNzCisJICB8CQkgIDB4QTAwMDAwMDAtMHhERkZGRkZGRgorCSAgfCAgIFVzZSBieXRlIHJldmVyc2VkIG91dCByb3V0aW5lcyB0byBoYW5kbGUgZW5kaWFuZXNzLgorCSAgfCBNYWtlIHRoaXMgcmVnaW9uIG5vbi1wcmVmZXRjaGFibGUuCisJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogUE1NMCBNYXNrL0F0dHJpYnV0ZSAtIGRpc2FibGVkIGI0IHNldHRpbmcgKi8KKwlvdXQzMnIoUENJWDBfUE1NME1BLCAweDAwMDAwMDAwKTsKKwlvdXQzMnIoUENJWDBfUE1NMExBLCBDRkdfUENJX01FTUJBU0UpOwkvKiBQTU0wIExvY2FsIEFkZHJlc3MgKi8KKwkvKiBQTU0wIFBDSSBMb3cgQWRkcmVzcyAqLworCW91dDMycihQQ0lYMF9QTU0wUENJTEEsIENGR19QQ0lfTUVNQkFTRSk7CisJb3V0MzJyKFBDSVgwX1BNTTBQQ0lIQSwgMHgwMDAwMDAwMCk7CS8qIFBNTTAgUENJIEhpZ2ggQWRkcmVzcyAqLworCS8qIDUxMk0gKyBObyBwcmVmZXRjaGluZywgYW5kIGVuYWJsZSByZWdpb24gKi8KKwlvdXQzMnIoUENJWDBfUE1NME1BLCAweEUwMDAwMDAxKTsKKworCS8qIFBNTTAgTWFzay9BdHRyaWJ1dGUgLSBkaXNhYmxlZCBiNCBzZXR0aW5nICovCisJb3V0MzJyKFBDSVgwX1BNTTFNQSwgMHgwMDAwMDAwMCk7CisJb3V0MzJyKFBDSVgwX1BNTTFMQSwgQ0ZHX1BDSV9NRU1CQVNFMik7CS8qIFBNTTAgTG9jYWwgQWRkcmVzcyAqLworCS8qIFBNTTAgUENJIExvdyBBZGRyZXNzICovCisJb3V0MzJyKFBDSVgwX1BNTTFQQ0lMQSwgQ0ZHX1BDSV9NRU1CQVNFMik7CisJb3V0MzJyKFBDSVgwX1BNTTFQQ0lIQSwgMHgwMDAwMDAwMCk7CS8qIFBNTTAgUENJIEhpZ2ggQWRkcmVzcyAqLworCS8qIDUxMk0gKyBObyBwcmVmZXRjaGluZywgYW5kIGVuYWJsZSByZWdpb24gKi8KKwlvdXQzMnIoUENJWDBfUE1NMU1BLCAweEUwMDAwMDAxKTsKKworCW91dDMycihQQ0lYMF9QVE0xTVMsIDB4MDAwMDAwMDEpOwkvKiBNZW1vcnkgU2l6ZS9BdHRyaWJ1dGUgKi8KKwlvdXQzMnIoUENJWDBfUFRNMUxBLCAwKTsJLyogTG9jYWwgQWRkci4gUmVnICovCisJb3V0MzJyKFBDSVgwX1BUTTJNUywgMCk7CS8qIE1lbW9yeSBTaXplL0F0dHJpYnV0ZSAqLworCW91dDMycihQQ0lYMF9QVE0yTEEsIDApOwkvKiBMb2NhbCBBZGRyLiBSZWcgKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFNldCB1cCBDb25maWd1cmF0aW9uIHJlZ2lzdGVycworCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIFByb2dyYW0gdGhlIGJvYXJkJ3Mgc3Vic3lzdGVtIGlkL3ZlbmRvciBpZCAqLworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwKKwkJCSAgICAgIENGR19QQ0lfU1VCU1lTX1ZFTkRPUklEKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX1NVQlNZU1RFTV9JRCwgQ0ZHX1BDSV9TVUJTWVNfSUQpOworCisJLyogQ29uZmlndXJlIGNvbW1hbmQgcmVnaXN0ZXIgYXMgYnVzIG1hc3RlciAqLworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwgUENJX0NPTU1BTkRfTUFTVEVSKTsKKworCS8qIDI0MG5TIFBDSSBjbG9jayAqLworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfTEFURU5DWV9USU1FUiwgMSk7CisKKwkvKiBObyBlcnJvciByZXBvcnRpbmcgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX0VSUkVOLCAwKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoMCwgUENJX0JSREdPUFQyLCAweDAwMDAwMTAxKTsKK30KKyNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9UQVJHRVRfSU5JVCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBwY2lfbWFzdGVyX2luaXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX01BU1RFUl9JTklUKQordm9pZCBwY2lfbWFzdGVyX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXVuc2lnbmVkIHNob3J0IHRlbXBfc2hvcnQ7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgIHwgV3JpdGUgdGhlIFBvd2VyUEM0NDAgRVAgUENJIENvbmZpZ3VyYXRpb24gcmVncy4KKwkgIHwgICBFbmFibGUgUG93ZXJQQzQ0MCBFUCB0byBiZSBhIG1hc3RlciBvbiB0aGUgUENJIGJ1cyAoUE1NKS4KKwkgIHwgICBFbmFibGUgUG93ZXJQQzQ0MCBFUCB0byBhY3QgYXMgYSBQQ0kgbWVtb3J5IHRhcmdldCAoUFRNKS4KKwkgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoMCwgUENJX0NPTU1BTkQsICZ0ZW1wX3Nob3J0KTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX0NPTU1BTkQsCisJCQkgICAgICB0ZW1wX3Nob3J0IHwgUENJX0NPTU1BTkRfTUFTVEVSIHwKKwkJCSAgICAgIFBDSV9DT01NQU5EX01FTU9SWSk7Cit9CisjZW5kaWYKKy8qIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX01BU1RFUl9JTklUKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGlzX3BjaV9ob3N0CisgKgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgYSBwY2kgc2NhbiBzaG91bGQgYmUKKyAqCXBlcmZvcm1lZC4gV2l0aCB2YXJpb3VzIGhhcmR3YXJlIGVudmlyb25tZW50cyAoZXNwZWNpYWxseSBjUENJIGFuZAorICoJUFBNQykgaXQncyBpbnN1ZmZpY2llbnQgdG8gZGVwZW5kIG9uIHRoZSBzdGF0ZSBvZiB0aGUgYXJiaXRlciBlbmFibGUKKyAqCWJpdCBpbiB0aGUgc3RyYXAgcmVnaXN0ZXIsIG9yIGdlbmVyaWMgaG9zdC9hZGFwdGVyIGFzc3VtcHRpb25zLgorICoKKyAqCVJhdGhlciB0aGFuIGhhcmQtY29kZSBhIGJhZCBhc3N1bXB0aW9uIGluIHRoZSBnZW5lcmFsIDQ0MCBjb2RlLCB0aGUKKyAqCTQ0MCBwY2kgY29kZSByZXF1aXJlcyB0aGUgYm9hcmQgdG8gZGVjaWRlIGF0IHJ1bnRpbWUuCisgKgorICoJUmV0dXJuIDAgZm9yIGFkYXB0ZXIgbW9kZSwgbm9uLXplcm8gZm9yIGhvc3QgKG1vbmFyY2gpIG1vZGUuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQoraW50IGlzX3BjaV9ob3N0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgkJCQkvKiBkZWZpbmVkKENPTkZJR19QQ0kpICovCmRpZmYgLS1naXQgYS9ib2FyZC9uZXRzdGFsL2hjdTUvaW5pdC5TIGIvYm9hcmQvbmV0c3RhbC9oY3U1L2luaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWI2Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbmV0c3RhbC9oY3U1L2luaXQuUwpAQCAtMCwwICsxLDc5IEBACisvKgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRMQiBUQUJMRQorICoKKyAqIFRoaXMgdGFibGUgaXMgdXNlZCBieSB0aGUgY3B1IGJvb3QgY29kZSB0byBzZXR1cCB0aGUgaW5pdGlhbCB0bGIKKyAqIGVudHJpZXMuIFJhdGhlciB0aGFuIG1ha2UgYnJvYWQgYXNzdW1wdGlvbnMgaW4gdGhlIGNwdSBzb3VyY2UgdHJlZSwKKyAqIHRoaXMgdGFibGUgbGV0cyBlYWNoIGJvYXJkIHNldCB0aGluZ3MgdXAgaG93ZXZlciB0aGV5IGxpa2UuCisgKgorICogIFBvaW50ZXIgdG8gdGhlIHRhYmxlIGlzIHJldHVybmVkIGluIHIxCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLnNlY3Rpb24gLmJvb3RwZywiYXgiCisJLmdsb2JsIHRsYnRhYgorCit0bGJ0YWI6CisJdGxidGFiX3N0YXJ0CisKKwkvKiB2eFdvcmtzIG5lZWRzIHRoaXMgZW50cnkgZm9yIHRoZSBNYWNoaW5lIENoZWNrIGludGVycnVwdCwgICovCisJLyogdGxiZW50cnkoIDB4NDAwMDAwMDAsIFNaXzI1Nk0sIDAsIDEsIEFDX1J8QUNfV3xBQ19YfFNBX0d8U0FfSSApICovCisKKwkvKgorCSAqIEJPT1RfQ1MgKEZMQVNIKSBtdXN0IGJlIHNlY29uZC4gQmVmb3JlIHJlbG9jYXRpb24gU0FfSSBjYW4gYmUgb2ZmIHRvIHVzZSB0aGUKKwkgKiBzcGVlZCB1cCBib290IHByb2Nlc3MuIEl0IGlzIHBhdGNoZWQgYWZ0ZXIgcmVsb2NhdGlvbiB0byBlbmFibGUgU0FfSQorCSAqLworCXRsYmVudHJ5KCBDRkdfQk9PVF9CQVNFX0FERFIsIFNaXzFNLCBDRkdfQk9PVF9CQVNFX0FERFIsIDEsIEFDX1J8QUNfV3xBQ19YfFNBX0cgKQorCisJLyogVExCLWVudHJ5IGZvciBQQ0kgTWVtb3J5ICovCisJdGxiZW50cnkoIENGR19QQ0lfTUVNQkFTRSwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFLCAxLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKKwl0bGJlbnRyeSggQ0ZHX1BDSV9NRU1CQVNFMSwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFMSwgMSwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCisJdGxiZW50cnkoIENGR19QQ0lfTUVNQkFTRTIsIFNaXzI1Nk0sIENGR19QQ0lfTUVNQkFTRTIsIDEsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQorCXRsYmVudHJ5KCBDRkdfUENJX01FTUJBU0UzLCBTWl8yNTZNLCBDRkdfUENJX01FTUJBU0UzLCAxLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKKworCS8qIFRMQi1lbnRyeSBmb3IgRUJDIChDRkdfQ1BMRCkgKi8KKwkvKiB0bGJlbnRyeSggQ0ZHX0NQTEQsIFNaXzFLLCBDRkdfQ1BMRCwgMSwgQUNfUnxBQ19XfEFDX1h8U0FfR3xTQV9JICkgKi8KKwkvKiAJCUNBTiAqLworCXRsYmVudHJ5KCBDRkdfQ1NfMSwgU1pfMTZNLCBDRkdfQ1NfMSwgMSwgQUNfUnxBQ19XfEFDX1h8U0FfR3xTQV9JICkKKwkgLyogCQlJTUMgKyBDUExEICovCisJdGxiZW50cnkoIENGR19DU18yLCBTWl8xNk0sIENGR19DU18yLCAxLCBBQ19SfEFDX1d8QUNfWHxTQV9HfFNBX0kgKQorCXRsYmVudHJ5KCBDRkdfQ1NfMiArIDB4MTAwMDAwMCwgU1pfMTZNLCBDRkdfQ1NfMiArIDB4MTAwMDAwMCwgMSwgQUNfUnxBQ19XfEFDX1h8U0FfR3xTQV9JICkKKwkgLyogCQlJTUMtRmFzdCAqLworCXRsYmVudHJ5KCBDRkdfQ1NfMywgU1pfMTZNLCBDRkdfQ1NfMywgMSwgQUNfUnxBQ19XfEFDX1h8U0FfR3xTQV9JICkKKwl0bGJlbnRyeSggQ0ZHX0NTXzMgKyAweDEwMDAwMDAsIFNaXzE2TSwgQ0ZHX0NTXzMgKyAweDEwMDAwMDAsIDEsIEFDX1J8QUNfV3xBQ19YfFNBX0d8U0FfSSApCisKKwkvKiBUTEItZW50cnkgZm9yIEludGVybmFsIFJlZ2lzdGVycyAmIE9DTSAqLworCXRsYmVudHJ5KCBDRkdfUENJX0JBU0UsIFNaXzE2TSwgMHhlMDAwMDAwMCwgMCwgIEFDX1J8QUNfV3xBQ19YfFNBX0kgKQorCisJLypUTEItZW50cnkgUENJIHJlZ2lzdGVycyovCisJdGxiZW50cnkoIDB4RUVDMDAwMDAsIFNaXzFLLCAweEVFQzAwMDAwLCAxLCAgQUNfUnxBQ19XfEFDX1h8U0FfR3xTQV9JICkKKworCS8qIFRMQi1lbnRyeSBmb3IgcGVyaXBoZXJhbHMgKi8KKwl0bGJlbnRyeSggMHhFRjAwMDAwMCwgU1pfMTZNLCAweEVGMDAwMDAwLCAxLCBBQ19SfEFDX1d8QUNfWHxTQV9HfFNBX0kpCisKKwkvKiBUTEIgZm9yIFNEUkFNIHdpbGwgYmUgYWRkZWQgYnkgaW5pdGRyYW0gKHNkcmFtLmMpICovCisKKwl0bGJ0YWJfZW5kCmRpZmYgLS1naXQgYS9ib2FyZC9uZXRzdGFsL2hjdTUvc2RyYW0uYyBiL2JvYXJkL25ldHN0YWwvaGN1NS9zZHJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzkxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFsL2hjdTUvc2RyYW0uYwpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogTmlrbGF1cyBHaWdlciAoTmlrbGF1cy5HaWdlckBuZXRzdGFsLmNvbSkKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogU3lsdmllIEdvaGwsICAgICAgICAgICAgIEFNQ0MvSUJNLCBnb2hsLnN5bHZpZUBmci5pYm0uY29tCisgKiBKYWNxdWVsaW5lIFBpcmEtRmVycmlvbCwgQU1DQy9JQk0sIGpwaXJhLWZlcnJpb2xAZnIuaWJtLmNvbQorICogVGhpZXJyeSBSb21hbiwgICAgICAgICAgIEFNQ0MvSUJNLCB0aGllcnJ5X3JvbWFuQGZyLmlibS5jb20KKyAqIEFsYWluIFNhdXJlbCwgICAgICAgICAgICBBTUNDL0lCTSwgYWxhaW4uc2F1cmVsQGZyLmlibS5jb20KKyAqIFJvYmVydCBTbnlkZXIsICAgICAgICAgICBBTUNDL0lCTSwgcm9iLnNueWRlckBmci5pYm0uY29tCisgKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBTdGVmYW4gUm9lc2UsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHNyQGRlbnguZGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogZGVmaW5lIERFQlVHIGZvciBkZWJ1ZyBvdXRwdXQgKi8KKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxwcGM0NDAuaD4KKwordm9pZCBzeXNMZWRTZXQodTMyIHZhbHVlKTsKK3ZvaWQgZGNiel9hcmVhKHUzMiBzdGFydF9hZGRyZXNzLCB1MzIgbnVtX2J5dGVzKTsKK3ZvaWQgZGZsdXNoKHZvaWQpOworCisjZGVmaW5lIEREUl9EQ1JfQkFTRSAweDEwCisjZGVmaW5lIGRkcmNmZ2EgIChERFJfRENSX0JBU0UrMHgwKSAgIC8qIEREUiBjb25maWd1cmF0aW9uIGFkZHJlc3MgcmVnICovCisjZGVmaW5lIGRkcmNmZ2QgIChERFJfRENSX0JBU0UrMHgxKSAgIC8qIEREUiBjb25maWd1cmF0aW9uIGRhdGEgcmVnICAgICovCisKKyNkZWZpbmUgRERSMF8wMV9JTlRfTUFTS19NQVNLICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRERSMF8wMF9JTlRfQUNLX0FMTCAgICAgICAgICAgICAgIDB4N0YwMDAwMDAKKyNkZWZpbmUgRERSMF8wMV9JTlRfTUFTS19BTExfT04gICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRERSMF8wMV9JTlRfTUFTS19BTExfT0ZGICAgICAgICAgIDB4MDAwMDAwMDAKKworI2RlZmluZSBERFIwXzE3X0RMTExPQ0tSRUdfTUFTSyAgICAgICAgICAgMHgwMDAxMDAwMCAvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8xN19ETExMT0NLUkVHX1VOTE9DS0VEICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRERSMF8xN19ETExMT0NLUkVHX0xPQ0tFRCAgICAgICAgIDB4MDAwMTAwMDAKKworI2RlZmluZSBERFIwXzIyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYKKy8qIEVDQyAqLworI2RlZmluZSBERFIwXzIyX0NUUkxfUkFXX01BU0sgICAgICAgICAgICAgMHgwMzAwMDAwMAorI2RlZmluZSBERFIwXzIyX0NUUkxfUkFXX0VDQ19ESVNBQkxFICAgICAgMHgwMDAwMDAwMCAvKiBFQ0Mgbm90IGVuYWJsZWQgKi8KKyNkZWZpbmUgRERSMF8yMl9DVFJMX1JBV19FQ0NfQ0hFQ0tfT05MWSAgIDB4MDEwMDAwMDAgLyogRUNDIG5vIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgRERSMF8yMl9DVFJMX1JBV19OT19FQ0NfUkFNICAgICAgIDB4MDIwMDAwMDAgLyogTm90IGEgRUNDIFJBTSovCisjZGVmaW5lIEREUjBfMjJfQ1RSTF9SQVdfRUNDX0VOQUJMRSAgICAgICAweDAzMDAwMDAwIC8qIEVDQyBjb3JyZWN0aW5nIG9uICovCisjZGVmaW5lIEREUjBfMDNfQ0FTTEFUX0RFQ09ERShuKSAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjE2KSYweDcpCisKKyNpZmRlZiBDRkdfRU5BQkxFX1NEUkFNX0NBQ0hFCisjZGVmaW5lIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRQkwCQkvKiBlbmFibGUgY2FjaGluZyBvbiBERFIyICovCisjZWxzZQorI2RlZmluZSBNWV9UTEJfV09SRDJfSV9FTkFCTEUgVExCX1dPUkQyX0lfRU5BQkxFIC8qIGRpc2FibGUgY2FjaGluZyBvbiBERFIyICovCisjZW5kaWYKKwordm9pZCBwcm9ncmFtX3RsYih1MzIgcGh5c19hZGRyLCB1MzIgdmlydF9hZGRyLCB1MzIgc2l6ZSwgdTMyIHRsYl93b3JkMl9pX3ZhbHVlKTsKKworI2lmZGVmIENPTkZJR19BRERfUkFNX0lORk8KK3ZvaWQgYm9hcmRfYWRkX3JhbV9pbmZvKGludCB1c2VfZGVmYXVsdCkKK3sKKwlQUEM0NDBfU1lTX0lORk8gYm9hcmRfY2ZnOworCXUzMiB2YWw7CisJbWZzZHJhbShERFIwXzIyLCB2YWwpOworCXZhbCAmPSBERFIwXzIyX0NUUkxfUkFXX01BU0s7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIEREUjBfMjJfQ1RSTF9SQVdfRUNDX0RJU0FCTEU6CisJCXB1dHMoIiAoRUNDIGRpc2FibGVkIik7CisJCWJyZWFrOworCWNhc2UgRERSMF8yMl9DVFJMX1JBV19FQ0NfQ0hFQ0tfT05MWToKKwkJcHV0cygiIChFQ0MgY2hlY2sgb25seSIpOworCQlicmVhazsKKwljYXNlIEREUjBfMjJfQ1RSTF9SQVdfTk9fRUNDX1JBTToKKwkJcHV0cygiIChubyBFQ0MgcmFtIik7CisJCWJyZWFrOworCWNhc2UgRERSMF8yMl9DVFJMX1JBV19FQ0NfRU5BQkxFOgorCQlwdXRzKCIgKEVDQyBlbmFibGVkIik7CisJCWJyZWFrOworCX0KKworCWdldF9zeXNfaW5mbygmYm9hcmRfY2ZnKTsKKwlwcmludGYoIiwgJWQgTUh6IiwgKGJvYXJkX2NmZy5mcmVxUExCICogMikgLyAxMDAwMDAwKTsKKworCW1mc2RyYW0oRERSMF8wMywgdmFsKTsKKwl2YWwgPSBERFIwXzAzX0NBU0xBVF9ERUNPREUodmFsKTsKKwlwcmludGYoIiwgQ0wlZCkiLCB2YWwpOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHdhaXRfZm9yX2RsbGxvY2suCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgd2FpdF9mb3JfZGxsbG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCB3YWl0ID0gMDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFdhaXQgZm9yIHRoZSBEQ0MgbWFzdGVyIGRlbGF5IGxpbmUgdG8gZmluaXNoIGNhbGlicmF0aW9uCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRkY3IoZGRyY2ZnYSwgRERSMF8xNyk7CisJdmFsID0gRERSMF8xN19ETExMT0NLUkVHX1VOTE9DS0VEOworCisJd2hpbGUgKHdhaXQgIT0gMHhmZmZmKSB7CisJCXZhbCA9IG1mZGNyKGRkcmNmZ2QpOworCQlpZiAoKHZhbCAmIEREUjBfMTdfRExMTE9DS1JFR19NQVNLKSA9PQorCQkgICAgRERSMF8xN19ETExMT0NLUkVHX0xPQ0tFRCkKKwkJCS8qIGRsbGxvY2tyZWcgYml0IG9uICovCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJd2FpdCsrOworCX0KKwlkZWJ1ZygiMHglMDR4OiBERFIwXzE3IFZhbHVlIChkbGxsb2NrcmVnIGJpdCk6IDB4JTA4eFxuIiwgd2FpdCwgdmFsKTsKKwlkZWJ1ZygiV2FpdGluZyBmb3IgZGxsbG9ja3JlZyBiaXQgdG8gcmFpc2VcbiIpOworCisJcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzZHJhbV9wYW5pYyAtLSBQYW5pYyBpZiB3ZSBjYW5ub3QgY29uZmlndXJlIHRoZSBzZHJhbSBjb3JyZWN0bHkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZHJhbV9wYW5pYyhjb25zdCBjaGFyICpyZWFzb24pCit7CisJcHJpbnRmKCJcbiVzOiByZWFzb24gJXMiLCAgX19GVU5DVElPTl9fLCAgcmVhc29uKTsKKwlzeXNMZWRTZXQoMHhmZik7CisJd2hpbGUgKDEpIHsKKwl9CisJLyogTmV2ZXIgcmV0dXJuICovCit9CisKKyNpZmRlZiBDT05GSUdfRERSX0VDQworc3RhdGljIHZvaWQgYmxhbmtfc3RyaW5nKGludCBzaXplKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8c2l6ZTsgaSsrKQorCQlwdXRjKCdcYicpOworCWZvciAoaT0wOyBpPHNpemU7IGkrKykKKwkJcHV0YygnICcpOworCWZvciAoaT0wOyBpPHNpemU7IGkrKykKKwkJcHV0YygnXGInKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogcHJvZ3JhbV9lY2MuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBwcm9ncmFtX2VjYyh1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgbnVtX2J5dGVzLAorCQkJdW5zaWduZWQgbG9uZyB0bGJfd29yZDJfaV92YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfYWRkcmVzcz0gc3RhcnRfYWRkcmVzczsKKwlpbnQgbG9vcGkgPSAwOworCXUzMiB2YWw7CisKKwljaGFyIHN0cltdID0gIkVDQyBnZW5lcmF0aW9uIC0iOworCWNoYXIgc2xhc2hbXSA9ICJcXHwvLVxcfC8tIjsKKworCXN5bmMoKTsKKwllaWVpbygpOworCisJcHV0cyhzdHIpOworCisJaWYgKHRsYl93b3JkMl9pX3ZhbHVlID09IFRMQl9XT1JEMl9JX0VOQUJMRSkgeworCQkvKiBFQ0MgYml0IHNldCBtZXRob2QgZm9yIG5vbi1jYWNoZWQgbWVtb3J5ICovCisJCS8qIFRoaXMgdGFrZXMgdmFyaW91cyBzZWNvbmRzICovCisJCWZvcihjdXJyZW50X2FkZHJlc3MgPSAwOyBjdXJyZW50X2FkZHJlc3MgPCBudW1fYnl0ZXM7CisJCSAgICAgY3VycmVudF9hZGRyZXNzICs9IHNpemVvZih1MzIpKSB7CisJCQkqKHUzMiAqKWN1cnJlbnRfYWRkcmVzcyA9IDA7CisJCQlpZiAoKGN1cnJlbnRfYWRkcmVzcyAlICgyIDw8IDIwKSkgPT0gMCkgeworCQkJCXB1dGMoJ1xiJyk7CisJCQkJcHV0YyhzbGFzaFtsb29waSsrICUgOF0pOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogRUNDIGJpdCBzZXQgbWV0aG9kIGZvciBjYWNoZWQgbWVtb3J5ICovCisJCS8qIEZhc3QgbWV0aG9kLCBubyBub3RpY2VhYmxlIGRlbGF5ICovCisJCWRjYnpfYXJlYShzdGFydF9hZGRyZXNzLCBudW1fYnl0ZXMpOworCQlkZmx1c2goKTsKKwl9CisJYmxhbmtfc3RyaW5nKHN0cmxlbihzdHIpKTsKKworCS8qIENsZWFyIGVycm9yIHN0YXR1cyAqLworCW1mc2RyYW0oRERSMF8wMCwgdmFsKTsKKwltdHNkcmFtKEREUjBfMDAsIHZhbCB8IEREUjBfMDBfSU5UX0FDS19BTEwpOworCisJLyogU2V0ICdpbnRfbWFzaycgcGFyYW1ldGVyIHRvIGZ1bmN0aW9ubmFsIHZhbHVlICovCisJbWZzZHJhbShERFIwXzAxLCB2YWwpOworCW10c2RyYW0oRERSMF8wMSwgKCh2YWwgJn4gRERSMF8wMV9JTlRfTUFTS19NQVNLKSB8CisJCQkgIEREUjBfMDFfSU5UX01BU0tfQUxMX09GRikpOworCisJcmV0dXJuOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogaW5pdGRyYW0gLS0gNDQwRVB4J3MgRERSIGNvbnRyb2xsZXIgaXMgYSBERU5BTEkgQ29yZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisjZGVmaW5lCUhDVV9IV19TRFJBTV9DT05GSUdfTUFTSyAweDcKKyNkZWZpbmUgSU5WQUxJRF9IV19DT05GSUcgICAiSW52YWxpZCBIVy1Db25maWciCisJdTE2ICpod1ZlcnNSZWcgPSAodTE2ICopIEhDVV9IV19WRVJTSU9OX1JFR0lTVEVSOworCXVuc2lnbmVkIGludCBkcmFtX3NpemUgPSAwOworCisJbXRzZHJhbShERFIwXzAyLCAweDAwMDAwMDAwKTsKKworCS8qIFZhbHVlcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIEV4Y2VsLXRhYmxlIDw8QTAwMDE0OTIuPj4gISAqLworCW10c2RyYW0oRERSMF8wMCwgMHgwMDAwMTkwQSk7CisJbXRzZHJhbShERFIwXzAxLCAweDAxMDAwMDAwKTsKKwltdHNkcmFtKEREUjBfMDMsIDB4MDIwMzA2MDIpOworCW10c2RyYW0oRERSMF8wNCwgMHgwQTAyMDIwMCk7CisJbXRzZHJhbShERFIwXzA1LCAweDAyMDIwMzA3KTsKKwlzd2l0Y2ggKCpod1ZlcnNSZWcgJiBIQ1VfSFdfU0RSQU1fQ09ORklHX01BU0spIHsKKwljYXNlIDA6CisJCWRyYW1fc2l6ZSA9IDEyOCAqIDEwMjQgKiAxMDI0IDsKKwkJbXRzZHJhbShERFIwXzA2LCAweDAxMDJDODBEKTsgIC8qIDEyOE1CIFJBTSAqLworCQltdHNkcmFtKEREUjBfMTEsIDB4MDAwRkM4MDApOyAgLyogMTI4TUIgUkFNICovCisJCW10c2RyYW0oRERSMF80MywgMHgwMzBBMDMwMCk7ICAvKiAxMjhNQiBSQU0gKi8KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlkcmFtX3NpemUgPSAyNTYgKiAxMDI0ICogMTAyNCA7CisJCW10c2RyYW0oRERSMF8wNiwgMHgwMTAyQzgxMik7ICAvKiAyNTZNQiBSQU0gKi8KKwkJbXRzZHJhbShERFIwXzExLCAweDAwMTRDODAwKTsgIC8qIDI1Nk1CIFJBTSAqLworCQltdHNkcmFtKEREUjBfNDMsIDB4MDMwQTAyMDApOyAgLyogMjU2TUIgUkFNICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNkcmFtX3BhbmljKElOVkFMSURfSFdfQ09ORklHKTsKKwkJYnJlYWs7CisJfQorCWRyYW1fc2l6ZSAtPSAxNiAqIDEwMjQgKiAxMDI0OworCW10c2RyYW0oRERSMF8wNywgMHgwMDA5MDEwMCk7CisJLyoKKwkgKiBUQ1BEPTIwMCBjeWNsZXMgb2YgY2xvY2sgaW5wdXQgaXMgcmVxdWlyZWQgdG8gbG9jayB0aGUgRExMLgorCSAqIENLRSBtdXN0IGJlIEhJR0ggdGhlIGVudGlyZSB0aW1lLm10c2RyYW0oRERSMF8wOCwgMHgwMkM4MDAwMSk7CisJICovCisJbXRzZHJhbShERFIwXzA4LCAweDAyQzgwMDAxKTsKKwltdHNkcmFtKEREUjBfMDksIDB4MDAwMTFENUYpOworCW10c2RyYW0oRERSMF8xMCwgMHgwMDAwMDEwMCk7CisJbXRzZHJhbShERFIwXzEyLCAweDAwMDAwMDAzKTsKKwltdHNkcmFtKEREUjBfMTQsIDB4MDAwMDAwMDApOworCW10c2RyYW0oRERSMF8xNywgMHgxRDAwMDAwMCk7CisJbXRzZHJhbShERFIwXzE4LCAweDFEMUQxRDFEKTsKKwltdHNkcmFtKEREUjBfMTksIDB4MUQxRDFEMUQpOworCW10c2RyYW0oRERSMF8yMCwgMHgwQjBCMEIwQik7CisJbXRzZHJhbShERFIwXzIxLCAweDBCMEIwQjBCKTsKKwkjZGVmaW5lIEVDQ19SQU0gIDB4MDMyNjdGMEIKKwkjZGVmaW5lIE5PX0VDQ19SQU0gIDB4MDAyNjdGMEIKKyNpZmRlZiBDT05GSUdfRERSX0VDQworCW10c2RyYW0oRERSMF8yMiwgRUNDX1JBTSk7CisjZWxzZQorCW10c2RyYW0oRERSMF8yMiwgTk9fRUNDX1JBTSk7CisjZW5kaWYKKworCW10c2RyYW0oRERSMF8yMywgMHgwMDAwMDAwMCk7CisJbXRzZHJhbShERFIwXzI0LCAweDAxMDIwMDAxKTsKKwltdHNkcmFtKEREUjBfMjYsIDB4MkQ5MzA1MTcpOworCW10c2RyYW0oRERSMF8yNywgMHgwMDAwODIzNik7CisJbXRzZHJhbShERFIwXzI4LCAweDAwMDAwMDAwKTsKKwltdHNkcmFtKEREUjBfMzEsIDB4MDAwMDAwMDApOworCW10c2RyYW0oRERSMF80MiwgMHgwMTAwMDAwNik7CisJbXRzZHJhbShERFIwXzQ0LCAweDAwMDAwMDAzKTsKKwltdHNkcmFtKEREUjBfMDIsIDB4MDAwMDAwMDEpOworCXdhaXRfZm9yX2RsbGxvY2soKTsKKwltdHNkcmFtKEREUjBfMDAsIDB4NDAwMDAwMDApOyAgLyogWmVybyBpbml0IGJpdCAqLworCisJLyoKKwkgKiBQcm9ncmFtIHRsYiBlbnRyaWVzIGZvciB0aGlzIHNpemUgKGR5bmFtaWMpCisJICovCisJcHJvZ3JhbV90bGIoMCwgMCwgZHJhbV9zaXplLCBNWV9UTEJfV09SRDJfSV9FTkFCTEUpOworCisJLyoKKwkgKiBTZXR1cCAybmQgVExCIHdpdGggc2FtZSBwaHlzaWNhbCBhZGRyZXNzIGJ1dCBkaWZmZXJlbnQgdmlydHVhbAorCSAqIGFkZHJlc3Mgd2l0aCBjYWNoZSBlbmFibGVkLiBUaGlzIGlzIGRvbmUgZm9yIGZhc3QgRUNDIGdlbmVyYXRpb24uCisJICovCisJcHJvZ3JhbV90bGIoMCwgQ0ZHX0REUl9DQUNIRURfQUREUiwgZHJhbV9zaXplLCAwKTsKKworI2lmZGVmIENPTkZJR19ERFJfRUNDCisJLyoKKwkgKiBJZiBFQ0MgaXMgZW5hYmxlZCwgaW5pdGlhbGl6ZSB0aGUgcGFyaXR5IGJpdHMuCisJICovCisJcHJvZ3JhbV9lY2MoQ0ZHX0REUl9DQUNIRURfQUREUiwgZHJhbV9zaXplLCAwKTsKKyNlbmRpZgorCisJcmV0dXJuIChkcmFtX3NpemUpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3RhbC9oY3U1L3UtYm9vdC5sZHMgYi9ib2FyZC9uZXRzdGFsL2hjdTUvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI1NWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbmV0c3RhbC9oY3U1L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisKK1NFQ1RJT05TCit7CisgIC5yZXNldHZlYyAweEZGRkZGRkZDIDoKKyAgeworICAgICooLnJlc2V0dmVjKQorICB9ID0gMHhmZmZmCisKKyAgLmJvb3RwZyAweEZGRkZGMDAwIDoKKyAgeworICAgIGNwdS9wcGM0eHgvc3RhcnQubwkoLmJvb3RwZykKKyAgfSA9IDB4ZmZmZgorCisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4JKi8KKyAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhCVhYWCBGSVhNRSBYWFgJKi8KKworICAgIGNwdS9wcGM0eHgvc3RhcnQubwkoLnRleHQpCisKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICAgICooLmdvdDEpCisgIH0KKyAgX2V0ZXh0ID0gLjsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorCisgIHBwY2Vudl9hc3NlcnQgPSBBU1NFUlQoLiA8IDB4RkZGRjgwMDAsICIuYnNzIHNlY3Rpb24gdG9vIGJpZywgb3ZlcmxhcHMgLnBwY2VudiBzZWN0aW9uLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29uZmd1cmF0aW9uOiBDRkdfTU9OSVRPUl9CQVNFLCBDRkdfTU9OSVRPUl9MRU4gYW5kIFRFWFRfQkFTRSBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4iKTsKKworICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3Rhci9uYW5kLmMgYi9ib2FyZC9uZXRzdGFyL25hbmQuYwppbmRleCA3ODUyMzY1Li5kNDdlMWQ4IDEwMDY0NAotLS0gYS9ib2FyZC9uZXRzdGFyL25hbmQuYworKysgYi9ib2FyZC9uZXRzdGFyL25hbmQuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogCmRpZmYgLS1naXQgYS9ib2FyZC9uZXR0YS9uZXR0YS5jIGIvYm9hcmQvbmV0dGEvbmV0dGEuYwppbmRleCA0OTIzZTNhLi41YTc1ZTUzIDEwMDY0NAotLS0gYS9ib2FyZC9uZXR0YS9uZXR0YS5jCisrKyBiL2JvYXJkL25ldHRhL25ldHRhLmMKQEAgLTU1NSw3ICs1NTUsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiAKQEAgLTU3MCw3ICs1NzAsNyBAQAogfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIAogaW50IHBjbWNpYV9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9uZXR0YS9wY21jaWEuYyBiL2JvYXJkL25ldHRhL3BjbWNpYS5jCmluZGV4IGEzNzA5ZjcuLjg2YjNjZmIgMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHRhL3BjbWNpYS5jCisrKyBiL2JvYXJkL25ldHRhL3BjbWNpYS5jCkBAIC00LDExICs0LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtMjY0LDcgKzI2NCw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiBpbnQgcGNtY2lhX3ZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0dGEyL25ldHRhMi5jIGIvYm9hcmQvbmV0dGEyL25ldHRhMi5jCmluZGV4IDNjYTdiZDMuLmIyMTZjNWEgMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHRhMi9uZXR0YTIuYworKysgYi9ib2FyZC9uZXR0YTIvbmV0dGEyLmMKQEAgLTU5NSw3ICs1OTUsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogCmRpZmYgLS1naXQgYS9ib2FyZC9uZXR2aWEvbmV0dmlhLmMgYi9ib2FyZC9uZXR2aWEvbmV0dmlhLmMKaW5kZXggM2U2YzYxNi4uODU2Yjc3NiAxMDA2NDQKLS0tIGEvYm9hcmQvbmV0dmlhL25ldHZpYS5jCisrKyBiL2JvYXJkL25ldHZpYS9uZXR2aWEuYwpAQCAtNDE2LDcgKzQxNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiAKZGlmZiAtLWdpdCBhL2JvYXJkL28yZG50L3UtYm9vdC5sZHMgYi9ib2FyZC9vMmRudC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGRjMTE4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL28yZG50L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jIGIvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMKaW5kZXggZjdmNzVlMC4uMWI5MTdiMyAxMDA2NDQKLS0tIGEvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMKKysrIGIvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KICNpbmNsdWRlIDxpMmMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogI2VuZGlmCkBAIC04NDcsNyArODQ3LDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogdm9pZCBuYW5kX2luaXQodm9pZCkKIHsKICAgICBleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsKZGlmZiAtLWdpdCBhL2JvYXJkL294Yy91LWJvb3QubGRzIGIvYm9hcmQvb3hjL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWNkMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvb3hjL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3BjaXBwYzIvcGNpcHBjMi5jIGIvYm9hcmQvcGNpcHBjMi9wY2lwcGMyLmMKaW5kZXggYTIxNmM1NS4uMTE0OGM2YSAxMDA2NDQKLS0tIGEvYm9hcmQvcGNpcHBjMi9wY2lwcGMyLmMKKysrIGIvYm9hcmQvcGNpcHBjMi9wY2lwcGMyLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCQllbmFibGVfaW50ZXJydXB0cyAoKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogaW50IGRvX3dkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlzd2l0Y2ggKGFyZ2MpIHsKQEAgLTI0MSw1ICsyNDEsNSBAQAogCSJ3ZCAgICAgIC0gcHJpbnQgY3VycmVudCBzdGF0dXNcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCiAjZW5kaWYJLyogQ09ORklHX1dBVENIRE9HICovCmRpZmYgLS1naXQgYS9ib2FyZC9wY3M0NDBlcC9jb25maWcubWsgYi9ib2FyZC9wY3M0NDBlcC9jb25maWcubWsKaW5kZXggMzE5YzRmYS4uNGQ5NDJlYiAxMDA2NDQKLS0tIGEvYm9hcmQvcGNzNDQwZXAvY29uZmlnLm1rCisrKyBiL2JvYXJkL3BjczQ0MGVwL2NvbmZpZy5tawpAQCAtMjUsNiArMjUsOSBAQAogIyBQQ1M0NDBFUCBib2FyZAogIwogCisjIENoZWNrIHRoZSBVLUJvb3QgSW1hZ2Ugd2l0aCBhIFNIQTEgY2hlY2tzdW0KK0FMTCArPSAkKG9iail1LWJvb3Quc2hhMQorCiAjVEVYVF9CQVNFID0gMHgwMDAwMTAwMAogCiBpZmVxICgkKHJhbXN5bSksMSkKZGlmZiAtLWdpdCBhL2JvYXJkL3BjczQ0MGVwL2ZsYXNoLmMgYi9ib2FyZC9wY3M0NDBlcC9mbGFzaC5jCmluZGV4IGVjZTU0NzguLmM1YTYyZTIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BjczQ0MGVwL2ZsYXNoLmMKKysrIGIvYm9hcmQvcGNzNDQwZXAvZmxhc2guYwpAQCAtODIsNyArODIsOSBAQAogCWNhc2UgRkxBU0hfTUFOX0FNRDoJcHJpbnRmICgiQU1EICIpOwkJYnJlYWs7CiAJY2FzZSBGTEFTSF9NQU5fRlVKOglwcmludGYgKCJGVUpJVFNVICIpOwkJYnJlYWs7CiAJY2FzZSBGTEFTSF9NQU5fU1NUOglwcmludGYgKCJTU1QgIik7CQlicmVhazsKKwljYXNlIEZMQVNIX01BTl9TVE06CXByaW50ZiAoIlNUIE1pY3JvIik7CQlicmVhazsKIAljYXNlIEZMQVNIX01BTl9FWENFTDoJcHJpbnRmICgiRXhjZWwgU2VtaWNvbmR1Y3RvciAiKTsgYnJlYWs7CisJY2FzZSBGTEFTSF9NQU5fTVg6CXByaW50ZiAoIk1YSUMgIik7IGJyZWFrOwogCWRlZmF1bHQ6CQlwcmludGYgKCJVbmtub3duIFZlbmRvciAiKTsJYnJlYWs7CiAJfQogCkBAIC0xMTcsNiArMTE5LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBGTEFTSF9TU1QwNDA6CXByaW50ZiAoIlNTVDM5TEYvVkYwNDAgKDQgTWJpdCwgdW5pZm9ybSBzZWN0b3Igc2l6ZSlcbiIpOwogCQlicmVhazsKKwljYXNlIFNUTV9JRF9NMjlXMDQwQjoJcHJpbnRmICgiU1QgTWljcm8gTTI5VzA0MEIgKDQgTWJpdCwgdW5pZm9ybSBzZWN0b3Igc2l6ZSlcbiIpOworCQlicmVhazsKIAlkZWZhdWx0OgkJcHJpbnRmICgiVW5rbm93biBDaGlwIFR5cGVcbiIpOwogCQlicmVhazsKIAl9CkBAIC0xOTIsOSArMTk2LDE1IEBACiAJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSlTU1RfTUFOVUZBQ1Q6CiAJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX1NTVDsKIAkJYnJlYWs7CisJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSlTVE1fTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX1NUTTsKKwkJYnJlYWs7CiAJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSlFWENFTF9NQU5VRkFDVDoKIAkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fRVhDRUw7CiAJCWJyZWFrOworCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpTVhfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX01YOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CiAJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDA7CkBAIC0yMjIsNiArMjMyLDExIEBACiAJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CiAJCWluZm8tPnNpemUgPSAweDAwODAwMDA7CQkvKiA9PiAwLjUgTUIJKi8KIAkJYnJlYWs7CisJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSlTVE1fSURfTTI5VzA0MEI6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMDQwOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSA4OworCQlpbmZvLT5zaXplID0gMHgwMDgwMDAwOyAvKiA9PiAwLDUgTUIgKi8KKwkJYnJlYWs7CiAKIAljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKUFNRF9JRF9MVjgwMFQ6CiAJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNODAwVDsKZGlmZiAtLWdpdCBhL2JvYXJkL3BjczQ0MGVwL2luaXQuUyBiL2JvYXJkL3BjczQ0MGVwL2luaXQuUwppbmRleCAwZWVlNGQ4Li4zNmE0MGM5IDEwMDY0NAotLS0gYS9ib2FyZC9wY3M0NDBlcC9pbml0LlMKKysrIGIvYm9hcmQvcGNzNDQwZXAvaW5pdC5TCkBAIC04NywyNyArODcsMzIgQEAKICAgICAuZ2xvYmwgdGxidGFiCiAKIHRsYnRhYjoKLSAgICB0bGJ0YWJfc3RhcnQKKwl0bGJ0YWJfc3RhcnQKIAotICAgIC8qCi0gICAgICogQk9PVF9DUyAoRkxBU0gpIG11c3QgYmUgZmlyc3QuIEJlZm9yZSByZWxvY2F0aW9uIFNBX0kgY2FuIGJlIG9mZiB0byB1c2UgdGhlCi0gICAgICogc3BlZWQgdXAgYm9vdCBwcm9jZXNzLiBJdCBpcyBwYXRjaGVkIGFmdGVyIHJlbG9jYXRpb24gdG8gZW5hYmxlIFNBX0kKLSAgICAgKi8KLSAgICB0bGJlbnRyeSggQ0ZHX0JPT1RfQkFTRV9BRERSLCBTWl8yNTZNLCBDRkdfQk9PVF9CQVNFX0FERFIsIDAsIEFDX1J8QUNfV3xBQ19YfFNBX0cvKnxTQV9JKi8pCisJLyoKKwkgKiBCT09UX0NTIChGTEFTSCkgbXVzdCBiZSBmaXJzdC4gQmVmb3JlIHJlbG9jYXRpb24gU0FfSSBjYW4gYmUgb2ZmIHRvIHVzZSB0aGUKKwkgKiBzcGVlZCB1cCBib290IHByb2Nlc3MuIEl0IGlzIHBhdGNoZWQgYWZ0ZXIgcmVsb2NhdGlvbiB0byBlbmFibGUgU0FfSQorCSAqLworCXRsYmVudHJ5KCBDRkdfQk9PVF9CQVNFX0FERFIsIFNaXzI1Nk0sIENGR19CT09UX0JBU0VfQUREUiwgMCwgQUNfUnxBQ19XfEFDX1h8U0FfRy8qfFNBX0kqLykKIAotICAgIC8qIFRMQi1lbnRyeSBmb3IgaW5pdC1yYW0gaW4gZGNhY2hlIChTQV9JIG11c3QgYmUgdHVybmVkIG9mZiEpICovCi0gICAgdGxiZW50cnkoIENGR19JTklUX1JBTV9BRERSLCBTWl82NEssIENGR19JTklUX1JBTV9BRERSLCAwLCBBQ19SfEFDX1d8QUNfWHxTQV9HICkKKwkvKiBUTEItZW50cnkgZm9yIGluaXQtcmFtIGluIGRjYWNoZSAoU0FfSSBtdXN0IGJlIHR1cm5lZCBvZmYhKSAqLworCXRsYmVudHJ5KCBDRkdfSU5JVF9SQU1fQUREUiwgU1pfNjRLLCBDRkdfSU5JVF9SQU1fQUREUiwgMCwgQUNfUnxBQ19XfEFDX1h8U0FfRyApCiAKLSAgICB0bGJlbnRyeSggQ0ZHX1NEUkFNX0JBU0UsIFNaXzI1Nk0sIENGR19TRFJBTV9CQVNFLCAwLCBBQ19SfEFDX1d8QUNfWHxTQV9HfFNBX0kgKQotICAgIHRsYmVudHJ5KCBDRkdfUENJX0JBU0UsIFNaXzI1Nk0sIENGR19QQ0lfQkFTRSwgMCwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCisJLyoKKwkgKiBUTEIgZW50cmllcyBmb3IgU0RSQU0gYXJlIG5vdCBuZWVkZWQgb24gdGhpcyBwbGF0Zm9ybS4KKwkgKiBUaGV5IGFyZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgaW4gdGhlIFNQRCBERFIgZGV0ZWN0aW9uCisJICogcm91dGluZS4KKwkgKi8KIAotICAgIC8qIFBDSSAqLwotICAgIHRsYmVudHJ5KCBDRkdfUENJX01FTUJBU0UsIFNaXzI1Nk0sIENGR19QQ0lfTUVNQkFTRSwgMCwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCi0gICAgdGxiZW50cnkoIENGR19QQ0lfTUVNQkFTRTEsIFNaXzI1Nk0sIENGR19QQ0lfTUVNQkFTRTEsIDAsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQotICAgIHRsYmVudHJ5KCBDRkdfUENJX01FTUJBU0UyLCBTWl8yNTZNLCBDRkdfUENJX01FTUJBU0UyLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKLSAgICB0bGJlbnRyeSggQ0ZHX1BDSV9NRU1CQVNFMywgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFMywgMCwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCisJdGxiZW50cnkoIENGR19QQ0lfQkFTRSwgU1pfMjU2TSwgQ0ZHX1BDSV9CQVNFLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKIAotICAgIC8qIFVTQiAyLjAgRGV2aWNlICovCi0gICAgdGxiZW50cnkoIENGR19VU0JfREVWSUNFLCBTWl8xSywgMHg1MDAwMDAwMCwgMCwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCisJLyogUENJICovCisJdGxiZW50cnkoIENGR19QQ0lfTUVNQkFTRSwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKKwl0bGJlbnRyeSggQ0ZHX1BDSV9NRU1CQVNFMSwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFMSwgMCwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCisJdGxiZW50cnkoIENGR19QQ0lfTUVNQkFTRTIsIFNaXzI1Nk0sIENGR19QQ0lfTUVNQkFTRTIsIDAsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQorCXRsYmVudHJ5KCBDRkdfUENJX01FTUJBU0UzLCBTWl8yNTZNLCBDRkdfUENJX01FTUJBU0UzLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKIAotICAgIHRsYnRhYl9lbmQKKwkvKiBVU0IgMi4wIERldmljZSAqLworCXRsYmVudHJ5KCBDRkdfVVNCX0RFVklDRSwgU1pfMUssIDB4NTAwMDAwMDAsIDAsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQorCisJdGxidGFiX2VuZApkaWZmIC0tZ2l0IGEvYm9hcmQvcGNzNDQwZXAvcGNzNDQwZXAuYyBiL2JvYXJkL3BjczQ0MGVwL3BjczQ0MGVwLmMKaW5kZXggYjczYWIyYS4uZTI0N2ZlZSAxMDA2NDQKLS0tIGEvYm9hcmQvcGNzNDQwZXAvcGNzNDQwZXAuYworKysgYi9ib2FyZC9wY3M0NDBlcC9wY3M0NDBlcC5jCkBAIC0yMywyMCArMjMsMTE1IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxwcGM0eHguaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y3JjLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHNwZF9zZHJhbS5oPgorI2luY2x1ZGUgPHN0YXR1c19sZWQuaD4KKyNpbmNsdWRlIDxzaGExLmg+CiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCiBleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107IC8qIGluZm8gZm9yIEZMQVNIIGNoaXBzCSovCiAKLXN0YXRpYyB2b2lkIHNldF9sZWRzKGludCB2YWwpCit1bnNpZ25lZCBjaGFyCXNoYTFfY2hlY2tzdW1bU0hBMV9TVU1fTEVOXTsKKworLyogc3dhcCA0IEJpdHMgKEJpdDAgPSBCaXQzLCBCaXQxID0gQml0MiwgQml0MiA9IEJpdDEgYW5kIEJpdDMgPSBCaXQwKSAqLwordW5zaWduZWQgY2hhciBzd2FwYml0c1sxNl0gPSB7MHgwLCAweDgsIDB4NCwgMHhjLCAweDIsIDB4YSwgMHg2LCAweGUsCisJCQkgICAgICAweDEsIDB4OSwgMHg1LCAweGQsIDB4MywgMHhiLCAweDcsIDB4Zn07CisKK3N0YXRpYyB2b2lkIHNldF9sZWRzIChpbnQgdmFsKQogewotCXVuc2lnbmVkIGNoYXIgbGVkWzE2XSA9IHsweDAsIDB4OCwgMHg0LCAweGMsIDB4MiwgMHhhLCAweDYsIDB4ZSwKLQkJCQkgMHgxLCAweDksIDB4NSwgMHhkLCAweDMsIDB4YiwgMHg3LCAweGZ9OwotCW91dDMyKEdQSU8wX09SLCAoaW4zMihHUElPMF9PUikgJiB+MHg3ODAwMDAwMCkgfCAobGVkW3ZhbF0gPDwgMjcpKTsKKwlvdXQzMihHUElPMF9PUiwgKGluMzIgKEdQSU8wX09SKSAmIH4weDc4MDAwMDAwKSB8ICh2YWwgPDwgMjcpKTsKIH0KIAorI2RlZmluZSBHRVRfTEVEUyAoKGluMzIgKEdQSU8wX09SKSAmIDB4NzgwMDAwMDApID4+IDI3KQorCit2b2lkIF9fbGVkX2luaXQgKGxlZF9pZF90IG1hc2ssIGludCBzdGF0ZSkKK3sKKwlpbnQJdmFsID0gR0VUX0xFRFM7CisKKwlpZiAoc3RhdGUgPT0gU1RBVFVTX0xFRF9PTikKKwkJdmFsIHw9IG1hc2s7CisJZWxzZQorCQl2YWwgJj0gfm1hc2s7CisJc2V0X2xlZHMgKHZhbCk7Cit9CisKK3ZvaWQgX19sZWRfc2V0IChsZWRfaWRfdCBtYXNrLCBpbnQgc3RhdGUpCit7CisJaW50CXZhbCA9IEdFVF9MRURTOworCisJaWYgKHN0YXRlID09IFNUQVRVU19MRURfT04pCisJCXZhbCB8PSBtYXNrOworCWVsc2UgaWYgKHN0YXRlID09IFNUQVRVU19MRURfT0ZGKQorCQl2YWwgJj0gfm1hc2s7CisJc2V0X2xlZHMgKHZhbCk7Cit9CisKK3ZvaWQgX19sZWRfdG9nZ2xlIChsZWRfaWRfdCBtYXNrKQoreworCWludAl2YWwgPSBHRVRfTEVEUzsKKworCXZhbCBePSBtYXNrOworCXNldF9sZWRzICh2YWwpOworfQorCitzdGF0aWMgdm9pZCBzdGF0dXNfbGVkX2JsaW5rICh2b2lkKQoreworCWludAlpOworCWludAl2YWwgPSBHRVRfTEVEUzsKKworCS8qIHNldCBhbGwgTEVEIHdoaWNoIGFyZSBvbiwgdG8gc3RhdGUgQkxJTktJTkcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICh2YWwgJiAweDAxKSBzdGF0dXNfbGVkX3NldCAoMyAtIGksIFNUQVRVU19MRURfQkxJTktJTkcpOworCQllbHNlIHN0YXR1c19sZWRfc2V0ICgzIC0gaSwgU1RBVFVTX0xFRF9PRkYpOworCQl2YWwgPSB2YWwgPj4gMTsKKwl9Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MpCit2b2lkIHNob3dfYm9vdF9wcm9ncmVzcyAoaW50IHZhbCkKK3sKKwkvKiBmaW5kIGFsbCB2YWxpZCBDb2RlcyBmb3IgdmFsIGluIFJFQURNRSAqLworCWlmICh2YWwgPT0gLTMwKSByZXR1cm47CisJaWYgKHZhbCA8IDApIHsKKwkJLyogc210aGluZyBnb2VzIHdyb25nICovCisJCXN0YXR1c19sZWRfYmxpbmsgKCk7CisJCXJldHVybjsKKwl9CisJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSAxOgorCQkJLyogdmFsaWRhdGluZyBJbWFnZSAqLworCQkJc3RhdHVzX2xlZF9zZXQgKDAsIFNUQVRVU19MRURfT0ZGKTsKKwkJCXN0YXR1c19sZWRfc2V0ICgxLCBTVEFUVVNfTEVEX09OKTsKKwkJCXN0YXR1c19sZWRfc2V0ICgyLCBTVEFUVVNfTEVEX09OKTsKKwkJCWJyZWFrOworCQljYXNlIDE1OgorCQkJLyogYm9vdGluZyAqLworCQkJc3RhdHVzX2xlZF9zZXQgKDAsIFNUQVRVU19MRURfT04pOworCQkJc3RhdHVzX2xlZF9zZXQgKDEsIFNUQVRVU19MRURfT04pOworCQkJc3RhdHVzX2xlZF9zZXQgKDIsIFNUQVRVU19MRURfT04pOworCQkJYnJlYWs7CisjaWYgMAorCQljYXNlIDY0OgorCQkJLyogc3RhcnRpbmcgRXRoZXJuZXQgY29uZmlndXJhdGlvbiAqLworCQkJc3RhdHVzX2xlZF9zZXQgKDAsIFNUQVRVU19MRURfT0ZGKTsKKwkJCXN0YXR1c19sZWRfc2V0ICgxLCBTVEFUVVNfTEVEX09GRik7CisJCQlzdGF0dXNfbGVkX3NldCAoMiwgU1RBVFVTX0xFRF9PTik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIDgwOgorCQkJLyogbG9hZGluZyBJbWFnZSAqLworCQkJc3RhdHVzX2xlZF9zZXQgKDAsIFNUQVRVU19MRURfT04pOworCQkJc3RhdHVzX2xlZF9zZXQgKDEsIFNUQVRVU19MRURfT0ZGKTsKKwkJCXN0YXR1c19sZWRfc2V0ICgyLCBTVEFUVVNfTEVEX09OKTsKKwkJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCiBpbnQgYm9hcmRfZWFybHlfaW5pdF9mKHZvaWQpCiB7CiAJcmVnaXN0ZXIgdWludCByZWc7CkBAIC04NSw2ICsxODAsMjY2IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgRUVQUk9NX0xFTgkyNTYKK3ZvaWQgbG9hZF9zZXJudW1fZXRoYWRkciAodm9pZCkKK3sKKwlpbnQJcmV0OworCWNoYXIJYnVmW0VFUFJPTV9MRU5dOworCWNoYXIJbWFjWzMyXTsKKwljaGFyCSp1c2VfZWVwcm9tOworCXUxNgljaGVja3N1bWNyYzE2ID0gMDsKKworCS8qIHJlYWQgdGhlIE1BQ3MgZnJvbSBFRXByb20gKi8KKwlzdGF0dXNfbGVkX3NldCAoMCwgU1RBVFVTX0xFRF9PTik7CisJc3RhdHVzX2xlZF9zZXQgKDEsIFNUQVRVU19MRURfT04pOworCXJldCA9IGVlcHJvbV9yZWFkIChDRkdfSTJDX0VFUFJPTV9BRERSLCAwLCAodWNoYXIgKilidWYsIEVFUFJPTV9MRU4pOworCWlmIChyZXQgPT0gMCkgeworCQljaGVja3N1bWNyYzE2ID0gY3lnX2NyYzE2ICgodWNoYXIgKilidWYsIEVFUFJPTV9MRU4gLSAyKTsKKwkJLyogY2hlY2ssIGlmIHRoZSBFRXByb20gaXMgcHJvZ3JhbW1lZDoKKwkJICogLSBUaGUgUHJlZml4KEJ5dGUgMCwxLDIpIGlzIGVxdWFsIHRvICJBVFIiCisJCSAqIC0gVGhlIGNoZWNrc3VtLCBzdG9yZWQgaW4gdGhlIGxhc3QgMiBCeXRlcywgaXMgY29ycmVjdAorCQkgKi8KKwkJaWYgKChzdHJuY21wIChidWYsIkFUUiIsMykgIT0gMCkgfHwKKwkJICAgICgoY2hlY2tzdW1jcmMxNiA+PiA4KSAhPSBidWZbRUVQUk9NX0xFTiAtIDJdKSB8fAorCQkgICAgKChjaGVja3N1bWNyYzE2ICYgMHhmZikgIT0gYnVmW0VFUFJPTV9MRU4gLSAxXSkpIHsKKwkJCS8qIEVFcHJvbSBpcyBub3QgcHJvZ3JhbW1lZCAqLworCQkJcHJpbnRmKCIlczogRUVQUk9NIENoZWNrc3VtIG5vdCBPS1xuIiwgX19GVU5DVElPTl9fKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGdldCB0aGUgTUFDcyAqLworCQkJc3ByaW50ZiAobWFjLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCWJ1ZlszXSwKKwkJCQlidWZbNF0sCisJCQkJYnVmWzVdLAorCQkJCWJ1Zls2XSwKKwkJCQlidWZbN10sCisJCQkJYnVmWzhdKTsKKwkJCXNldGVudiAoImV0aGFkZHIiLCAoY2hhciAqKSBtYWMpOworCQkJc3ByaW50ZiAobWFjLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCWJ1Zls5XSwKKwkJCQlidWZbMTBdLAorCQkJCWJ1ZlsxMV0sCisJCQkJYnVmWzEyXSwKKwkJCQlidWZbMTNdLAorCQkJCWJ1ZlsxNF0pOworCQkJc2V0ZW52ICgiZXRoMWFkZHIiLCAoY2hhciAqKSBtYWMpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogc29tZSBlcnJvciByZWFkaW5nIHRoZSBFRXByb20gKi8KKwlpZiAoKHVzZV9lZXByb20gPSBnZXRlbnYgKCJ1c2VfZWVwcm9tX2V0aGFkZHIiKSkgPT0gTlVMTCkgeworCQkvKiBkb250IHVzZSBib290Y21kICovCisJCXNldGVudigiYm9vdGRlbGF5IiwgIi0xIik7CisJCXJldHVybjsKKwl9CisJLyogPT0gZGVmYXVsdCA/IHVzZSBzdGFuZGFyZCAqLworCWlmIChzdHJuY21wICh1c2VfZWVwcm9tLCAiZGVmYXVsdCIsIDcpID09IDApIHsKKwkJcmV0dXJuOworCX0KKwkvKiBFbnYgZG9lc250IGV4aXN0IC0+IGhhbmcgKi8KKwlzdGF0dXNfbGVkX2JsaW5rICgpOworCS8qIGhlcmUgd2UgZG8gdGhpcyAiaGFuZHkiIGJlY2F1c2Ugd2UgaGF2ZSBubyBpbnRlcnJ1cHRzCisJICAgYXQgdGhpcyB0aW1lICovCisJcHV0cyAoIiMjIyBFRVBST00gRVJST1IgIyMjIFBsZWFzZSBSRVNFVCB0aGUgYm9hcmQgIyMjXG4iKTsKKwlmb3IgKDs7KSB7CisJCV9fbGVkX3RvZ2dsZSAoMTIpOworCQl1ZGVsYXkgKDEwMDAwMCk7CisJfQorCXJldHVybjsKK30KKworI2lmZGVmIENPTkZJR19QUkVCT09UCisKK3N0YXRpYyB1Y2hhciBrYmRfbWFnaWNfcHJlZml4W10JCT0gImtleV9tYWdpYyI7CitzdGF0aWMgdWNoYXIga2JkX2NvbW1hbmRfcHJlZml4W10JPSAia2V5X2NtZCI7CisKK3N0cnVjdCBrYmRfZGF0YV90IHsKKwljaGFyIHMxOworCWNoYXIgczI7Cit9OworCitzdHJ1Y3Qga2JkX2RhdGFfdCogZ2V0X2tleXMgKHN0cnVjdCBrYmRfZGF0YV90ICprYmRfZGF0YSkKK3sKKwljaGFyICp2YWw7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkvKiB1c2UgdGhlIERJUHMgZm9yIHNvbWUgYm9vdG9wdGlvbnMgKi8KKwl2YWwgPSBnZXRlbnYgKEVOVl9OQU1FX0RJUCk7CisJdG1wID0gc2ltcGxlX3N0cnRvdWwgKHZhbCwgTlVMTCwgMTYpOworCisJa2JkX2RhdGEtPnMyID0gKHRtcCAmIDB4MGYpOworCWtiZF9kYXRhLT5zMSA9ICh0bXAgJiAweGYwKSA+PiA0OworCXJldHVybiBrYmRfZGF0YTsKK30KKworc3RhdGljIGludCBjb21wYXJlX21hZ2ljIChjb25zdCBzdHJ1Y3Qga2JkX2RhdGFfdCAqa2JkX2RhdGEsIGNoYXIgKnN0cikKK3sKKwljaGFyIHMxID0gc3RyWzBdOworCisJaWYgKHMxID49ICcwJyAmJiBzMSA8PSAnOScpCisJCXMxIC09ICcwJzsKKwllbHNlIGlmIChzMSA+PSAnYScgJiYgczEgPD0gJ2YnKQorCQlzMSA9IHMxIC0gJ2EnICsgMTA7CisJZWxzZSBpZiAoczEgPj0gJ0EnICYmIHMxIDw9ICdGJykKKwkJczEgPSBzMSAtICdBJyArIDEwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJaWYgKHMxICE9IGtiZF9kYXRhLT5zMSkgcmV0dXJuIC0xOworCisJczEgPSBzdHJbMV07CisJaWYgKHMxID49ICcwJyAmJiBzMSA8PSAnOScpCisJCXMxIC09ICcwJzsKKwllbHNlIGlmIChzMSA+PSAnYScgJiYgczEgPD0gJ2YnKQorCQlzMSA9IHMxIC0gJ2EnICsgMTA7CisJZWxzZSBpZiAoczEgPj0gJ0EnICYmIHMxIDw9ICdGJykKKwkJczEgPSBzMSAtICdBJyArIDEwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJaWYgKHMxICE9IGtiZF9kYXRhLT5zMikgcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqa2V5X21hdGNoIChjb25zdCBzdHJ1Y3Qga2JkX2RhdGFfdCAqa2JkX2RhdGEpCit7CisJY2hhciBtYWdpY1tzaXplb2YgKGtiZF9tYWdpY19wcmVmaXgpICsgMV07CisJY2hhciAqc3VmZml4OworCWNoYXIgKmtiZF9tYWdpY19rZXlzOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIHN0cmluZyBkZWZpbmVzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGFwcGVuZGVkCisJICogdG8gImtleV9tYWdpYyIgdG8gZm9ybSB0aGUgbmFtZXMgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQKKwkgKiBob2xkICJtYWdpYyIga2V5IGNvZGVzLCBpLiBlLiBzdWNoIGtleSBjb2RlcyB0aGF0IGNhbiBjYXVzZQorCSAqIHByZS1ib290IGFjdGlvbnMuIElmIHRoZSBzdHJpbmcgaXMgZW1wdHkgKCIiKSwgdGhlbiBvbmx5CisJICogImtleV9tYWdpYyIgaXMgY2hlY2tlZCAob2xkIGJlaGF2aW91cik7IHRoZSBzdHJpbmcgIjEyNSIgY2F1c2VzCisJICogY2hlY2tzIGZvciAia2V5X21hZ2ljMSIsICJrZXlfbWFnaWMyIiBhbmQgImtleV9tYWdpYzUiLCBldGMuCisJICovCisJaWYgKChrYmRfbWFnaWNfa2V5cyA9IGdldGVudiAoIm1hZ2ljX2tleXMiKSkgPT0gTlVMTCkKKwkJa2JkX21hZ2ljX2tleXMgPSAiIjsKKworCS8qIGxvb3Agb3ZlciBhbGwgbWFnaWMga2V5czsKKwkgKiB1c2UgJ1wwJyBzdWZmaXggaW4gY2FzZSBvZiBlbXB0eSBzdHJpbmcKKwkgKi8KKwlmb3IgKHN1ZmZpeCA9IGtiZF9tYWdpY19rZXlzOyAqc3VmZml4IHx8CisJCSAgICAgc3VmZml4ID09IGtiZF9tYWdpY19rZXlzOyArK3N1ZmZpeCkgeworCQlzcHJpbnRmIChtYWdpYywgIiVzJWMiLCBrYmRfbWFnaWNfcHJlZml4LCAqc3VmZml4KTsKKwkJaWYgKGNvbXBhcmVfbWFnaWMgKGtiZF9kYXRhLCBnZXRlbnYgKG1hZ2ljKSkgPT0gMCkgeworCQkJY2hhciBjbWRfbmFtZVtzaXplb2YgKGtiZF9jb21tYW5kX3ByZWZpeCkgKyAxXTsKKwkJCWNoYXIgKmNtZDsKKworCQkJc3ByaW50ZiAoY21kX25hbWUsICIlcyVjIiwga2JkX2NvbW1hbmRfcHJlZml4LCAqc3VmZml4KTsKKwkJCWNtZCA9IGdldGVudiAoY21kX25hbWUpOworCisJCQlyZXR1cm4gKGNtZCk7CisJCX0KKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19QUkVCT09UICovCisKK3N0YXRpYyBpbnQgcGNzNDQwZXBfcmVhZGlucHV0cyAodm9pZCkKK3sKKwlpbnQJaTsKKwljaGFyCXZhbHVlWzIwXTsKKworCS8qIHJlYWQgdGhlIGlucHV0cyBhbmQgc2V0IHRoZSBFbnZ2YXJzICovCisJLyogUmV2aXNpb24gTGV2ZWwgQml0IDI2IC0gMjkgKi8KKwlpID0gKChpbjMyIChHUElPMF9JUikgJiAweDAwMDAwMDNjKSA+PiAyKTsKKwlpID0gc3dhcGJpdHNbaV07CisJc3ByaW50ZiAodmFsdWUsICIlMDJ4IiwgaSk7CisJc2V0ZW52IChFTlZfTkFNRV9SRVZMRVYsIHZhbHVlKTsKKwkvKiBTb2xkZXIgU3dpdGNoIEJpdCAzMCAtIDMzICovCisJaSA9IChpbjMyIChHUElPMF9JUikgJiAweDAwMDAwMDAzKSA8PCAyOworCWkgKz0gKGluMzIgKEdQSU8xX0lSKSAmIDB4YzAwMDAwMDApID4+IDMwOworCWkgPSBzd2FwYml0c1tpXTsKKwlzcHJpbnRmICh2YWx1ZSwgIiUwMngiLCBpKTsKKwlzZXRlbnYgKEVOVl9OQU1FX1NPTERFUiwgdmFsdWUpOworCS8qIERJUCBTd2l0Y2ggQml0IDQ5IC0gNTYgKi8KKwlpID0gKChpbjMyIChHUElPMV9JUikgJiAweDAwMDA3ZjgwKSA+PiA3KTsKKwlpID0gKHN3YXBiaXRzW2kgJiAweDBmXSA8PCA0KSArIHN3YXBiaXRzWyhpICYgMHhmMCkgPj4gNF07CisJc3ByaW50ZiAodmFsdWUsICIlMDJ4IiwgaSk7CisJc2V0ZW52IChFTlZfTkFNRV9ESVAsIHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfU0hBMV9DSEVDS19VQl9JTUcpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsY3VsYXRlIGEgU0hBMSBzdW0gZm9yIHRoZSBVLUJvb3QgaW1hZ2UgaW4gRmxhc2guCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcGNzNDQwZXBfc2hhMSAoaW50IGRvY2hlY2spCit7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpwdHJvZmY7CisJdW5zaWduZWQgY2hhciBvdXRwdXRbMjBdOworCXVuc2lnbmVkIGNoYXIgb3JnWzIwXTsKKwlpbnQJaSwgbGVuID0gQ09ORklHX1NIQTFfTEVOOworCisJbWVtY3B5ICgoY2hhciAqKUNGR19MT0FEX0FERFIsIChjaGFyICopQ09ORklHX1NIQTFfU1RBUlQsIGxlbik7CisJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopQ0ZHX0xPQURfQUREUjsKKwlwdHJvZmYgPSAmZGF0YVtsZW4gKyBTSEExX1NVTV9QT1NdOworCisJZm9yIChpID0gMDsgaSA8IFNIQTFfU1VNX0xFTjsgaSsrKSB7CisJCW9yZ1tpXSA9IHB0cm9mZltpXTsKKwkJcHRyb2ZmW2ldID0gMDsKKwl9CisKKwlzaGExX2NzdW0gKCh1bnNpZ25lZCBjaGFyICopIGRhdGEsIGxlbiwgKHVuc2lnbmVkIGNoYXIgKilvdXRwdXQpOworCisJaWYgKGRvY2hlY2sgPT0gMikgeworCQlmb3IgKGkgPSAwOyBpIDwgMjAgOyBpKyspIHsKKwkJCXByaW50ZigiJTAyWCAiLCBvdXRwdXRbaV0pOworCQl9CisJCXByaW50ZigiXG4iKTsKKwl9CisJaWYgKGRvY2hlY2sgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgMjAgOyBpKyspIHsKKwkJCWlmIChvcmdbaV0gIT0gb3V0cHV0W2ldKSByZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRvIHNvbWUgY2hlY2tzIGFmdGVyIHRoZSBTSEExIGNoZWNrc3VtIGZyb20gdGhlIFUtQm9vdCBJbWFnZSB3YXMKKyAqIGNhbGN1bGF0ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBjczQ0MGVwX2NoZWNrc2hhMSAodm9pZCkKK3sKKwlpbnQJcmV0OworCWNoYXIJKmNzX3Rlc3Q7CisKKwlzdGF0dXNfbGVkX3NldCAoMCwgU1RBVFVTX0xFRF9PRkYpOworCXN0YXR1c19sZWRfc2V0ICgxLCBTVEFUVVNfTEVEX09GRik7CisJc3RhdHVzX2xlZF9zZXQgKDIsIFNUQVRVU19MRURfT04pOworCXJldCA9IHBjczQ0MGVwX3NoYTEgKDEpOworCWlmIChyZXQgPT0gMCkgcmV0dXJuOworCisJaWYgKChjc190ZXN0ID0gZ2V0ZW52ICgiY3NfdGVzdCIpKSA9PSBOVUxMKSB7CisJCS8qIEVudiBkb2VzbnQgZXhpc3QgLT4gaGFuZyAqLworCQlzdGF0dXNfbGVkX2JsaW5rICgpOworCQkvKiBoZXJlIHdlIGRvIHRoaXMgImhhbmR5IiBiZWNhdXNlIHdlIGhhdmUgbm8gaW50ZXJydXB0cworCQkgICBhdCB0aGlzIHRpbWUgKi8KKwkJcHV0cyAoIiMjIyBTSEExIEVSUk9SICMjIyBQbGVhc2UgUkVTRVQgdGhlIGJvYXJkICMjI1xuIik7CisJCWZvciAoOzspIHsKKwkJCV9fbGVkX3RvZ2dsZSAoMik7CisJCQl1ZGVsYXkgKDEwMDAwMCk7CisJCX0KKwl9CisKKwlpZiAoc3RybmNtcCAoY3NfdGVzdCwgIm9mZiIsIDMpID09IDApIHsKKwkJcHJpbnRmICgiU0hBMSBVLUJvb3Qgc3VtIE5PVCBvayFcbiIpOworCQlzZXRlbnYgKCJib290ZGVsYXkiLCAiLTEiKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIF9faW5saW5lX18gdm9pZCBwY3M0NDBlcF9jaGVja3NoYTEgKHZvaWQpIHsgZG8ge30gd2hpbGUgKDApO30KKyNlbmRpZgorCiBpbnQgbWlzY19pbml0X3IgKHZvaWQpCiB7CiAJdWludCBwYmNyOwpAQCAtMTM5LDYgKzQ5NCwxOCBAQAogCQkJICAgIENGR19FTlZfQUREUl9SRURVTkQgKyAyKkNGR19FTlZfU0VDVF9TSVpFIC0gMSwKIAkJCSAgICAmZmxhc2hfaW5mb1sxXSk7CiAKKwlwY3M0NDBlcF9yZWFkaW5wdXRzICgpOworCXBjczQ0MGVwX2NoZWNrc2hhMSAoKTsKKyNpZmRlZiBDT05GSUdfUFJFQk9PVAorCXsKKwkJc3RydWN0IGtiZF9kYXRhX3Qga2JkX2RhdGE7CisJCS8qIERlY29kZSBrZXlzICovCisJCWNoYXIgKnN0ciA9IHN0cmR1cCAoa2V5X21hdGNoIChnZXRfa2V5cyAoJmtiZF9kYXRhKSkpOworCQkvKiBTZXQgb3IgZGVsZXRlIGRlZmluaXRpb24gKi8KKwkJc2V0ZW52ICgicHJlYm9vdCIsIHN0cik7CisJCWZyZWUgKHN0cik7CisJfQorI2VuZGlmIC8qIENPTkZJR19QUkVCT09UICovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NiwxMyArNTIzLDMxIEBACiAJcmV0dXJuICgwKTsKIH0KIAordm9pZCBzcGRfZGRyX2luaXRfaGFuZyAodm9pZCkKK3sKKwlzdGF0dXNfbGVkX3NldCAoMCwgU1RBVFVTX0xFRF9PRkYpOworCXN0YXR1c19sZWRfc2V0ICgxLCBTVEFUVVNfTEVEX09OKTsKKwkvKiB3ZSBjYW5ub3QgdXNlIGhhbmcoKSBiZWNhdXNlIHdlIGFyZSBzdGlsbCBydW5uaW5nIGZyb20KKwkgICBGbGFzaCwgYW5kIHNvIHRoZSBzdGF0dXNfbGVkIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KKwlwdXRzICgiIyMjIFNEUkFNIEVSUk9SICMjIyBQbGVhc2UgUkVTRVQgdGhlIGJvYXJkICMjI1xuIik7CisJZm9yICg7OykgeworCQlfX2xlZF90b2dnbGUgKDQpOworCQl1ZGVsYXkgKDEwMDAwMCk7CisJfQorfQorCiBsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCiB7CiAJbG9uZyBkcmFtX3NpemUgPSAwOwogCi0Jc2V0X2xlZHMoMSk7CQkJLyogZGlzcGxheSBib290IGluZm8gY291bnRlciAqLworCXN0YXR1c19sZWRfc2V0ICgwLCBTVEFUVVNfTEVEX09OKTsKKwlzdGF0dXNfbGVkX3NldCAoMSwgU1RBVFVTX0xFRF9PRkYpOwogCWRyYW1fc2l6ZSA9IHNwZF9zZHJhbSgpOwotCXNldF9sZWRzKDIpOwkJCS8qIGRpc3BsYXkgYm9vdCBpbmZvIGNvdW50ZXIgKi8KKwlzdGF0dXNfbGVkX3NldCAoMCwgU1RBVFVTX0xFRF9PRkYpOworCXN0YXR1c19sZWRfc2V0ICgxLCBTVEFUVVNfTEVEX09OKTsKKwlpZiAoZHJhbV9zaXplID09IDApIHsKKwkJaGFuZygpOworCX0KIAogCXJldHVybiBkcmFtX3NpemU7CiB9CkBAIC0zNzcsMyArNzYyLDEzMiBAQAogCiB9CiAjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICJsZWQiIENvbW1hbmRvIGZvciB0aGUgVS1Cb290IHNoZWxsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkb19sZWQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludAlyY29kZSA9IDAsIGk7CisJdWxvbmcJcGF0dGVybiA9IDA7CisKKwlwYXR0ZXJuID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwlpZiAocGF0dGVybiA+IDB4NDAwKSB7CisJCWludAl2YWwgPSBHRVRfTEVEUzsKKwkJcHJpbnRmICgibGVkOiAleFxuIiwgdmFsKTsKKwkJcmV0dXJuIHJjb2RlOworCX0KKwlpZiAocGF0dGVybiA+IDB4MjAwKSB7CisJCXN0YXR1c19sZWRfYmxpbmsgKCk7CisJCWhhbmcgKCk7CisJCXJldHVybiByY29kZTsKKwl9CisJaWYgKHBhdHRlcm4gPiAweDEwMCkgeworCQlzdGF0dXNfbGVkX2JsaW5rICgpOworCQlyZXR1cm4gcmNvZGU7CisJfQorCXBhdHRlcm4gJj0gMHgwZjsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChwYXR0ZXJuICYgMHgwMSkgc3RhdHVzX2xlZF9zZXQgKGksIFNUQVRVU19MRURfT04pOworCQllbHNlIHN0YXR1c19sZWRfc2V0IChpLCBTVEFUVVNfTEVEX09GRik7CisJCXBhdHRlcm4gPSBwYXR0ZXJuID4+IDE7CisJfQorCXJldHVybiByY29kZTsKK30KKworVV9CT09UX0NNRCgKKyAJbGVkLAkyLAkxLAlkb19sZWQsCisgCSJsZWQgW2JpdG1hc2tdICAgLSBzZXQgdGhlIERJQUctTEVEXG4iLAorCSJbYml0bWFza10gMHgwMSA9IERJQUcgMSBvblxuIgorCSIgICAgICAgICAgICAgIDB4MDIgPSBESUFHIDIgb25cbiIKKwkiICAgICAgICAgICAgICAweDA0ID0gRElBRyAzIG9uXG4iCisJIiAgICAgICAgICAgICAgMHgwOCA9IERJQUcgNCBvblxuIgorCSIgICAgICAgICAgICAgID4gMHgxMDAgc2V0IHRoZSBMRUQsIHdobyBhcmUgb24sIHRvIHN0YXRlIGJsaW5raW5nXG4iCispOworCisjaWYgZGVmaW5lZChDT05GSUdfU0hBMV9DSEVDS19VQl9JTUcpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogInNoYTEiIENvbW1hbmRvIGZvciB0aGUgVS1Cb290IHNoZWxsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkb19zaGExIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQJcmNvZGUgPSAtMTsKKworCWlmIChhcmdjIDwgMikgeworICB1c2FnZToKKwkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGFyZ2MgPj0gMykgeworCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQl1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF07CisJCWludAlsZW47CisJCWludAlpOworCisJCWRhdGEgPSAodW5zaWduZWQgY2hhciAqKXNpbXBsZV9zdHJ0b3VsIChhcmd2WzFdLCBOVUxMLCAxNik7CisJCWxlbiA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzJdLCBOVUxMLCAxNik7CisJCXNoYTFfY3N1bSAoZGF0YSwgbGVuLCAodW5zaWduZWQgY2hhciAqKW91dHB1dCk7CisJCXByaW50ZiAoIlUtQm9vdCBzdW06XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDIwIDsgaSsrKSB7CisJCQlwcmludGYgKCIlMDJYICIsIG91dHB1dFtpXSk7CisJCX0KKwkJcHJpbnRmICgiXG4iKTsKKwkJaWYgKGFyZ2MgPT0gNCkgeworCQkJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJCW1lbWNweSAoZGF0YSwgb3V0cHV0LCAyMCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChhcmdjID09IDIpIHsKKwkJY2hhciAqcHRyID0gYXJndlsxXTsKKwkJaWYgKCpwdHIgIT0gJy0nKSBnb3RvIHVzYWdlOworCQlwdHIrKzsKKwkJaWYgKCgqcHRyID09ICdjJykgfHwgKCpwdHIgPT0gJ0MnKSkgeworCQkJcmNvZGUgPSBwY3M0NDBlcF9zaGExICgxKTsKKwkJCXByaW50ZiAoIlNIQTEgVS1Cb290IHN1bSAlc29rIVxuIiwgKHJjb2RlICE9IDApID8gIm5vdCAiIDogIiIpOworCQl9IGVsc2UgaWYgKCgqcHRyID09ICdwJykgfHwgKCpwdHIgPT0gJ1AnKSkgeworCQkJcmNvZGUgPSBwY3M0NDBlcF9zaGExICgyKTsKKwkJfSBlbHNlIHsKKwkJCXJjb2RlID0gcGNzNDQwZXBfc2hhMSAoMCk7CisJCX0KKwkJcmV0dXJuIHJjb2RlOworCX0KKwlyZXR1cm4gcmNvZGU7Cit9CisKK1VfQk9PVF9DTUQoCisgCXNoYTEsCTQsCTEsCWRvX3NoYTEsCisgCSJzaGExICAgIC0gY2FsY3VsYXRlIHRoZSBTSEExIFN1bVxuIiwKKwkiYWRkcmVzcyBsZW4gW2FkZHJdICBjYWxjdWxhdGUgdGhlIFNIQTEgc3VtIFtzYXZlIGF0IGFkZHJdXG4iCisJIiAgICAgLXAgY2FsY3VsYXRlIHRoZSBTSEExIHN1bSBmcm9tIHRoZSBVLUJvb3QgaW1hZ2UgaW4gZmxhc2ggYW5kIHByaW50XG4iCisJIiAgICAgLWMgY2hlY2sgdGhlIFUtQm9vdCBpbWFnZSBpbiBmbGFzaFxuIgorKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lERV9QUkVJTklUCitpbnQgaWRlX3ByZWluaXQgKHZvaWQpCit7CisJLyogU2V0IFRydWUgSURFIE1vZGUgKi8KKwlvdXQzMiAoR1BJTzBfT1IsIChpbjMyIChHUElPMF9PUikgfCAweDAwMTAwMDAwKSk7CisJb3V0MzIgKEdQSU8wX09SLCAoaW4zMiAoR1BJTzBfT1IpIHwgMHgwMDIwMDAwMCkpOworCW91dDMyIChHUElPMV9PUiwgKGluMzIgKEdQSU8xX09SKSAmIH4weDAwMDA4MDQwKSk7CisJdWRlbGF5ICgxMDAwMDApOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKK3ZvaWQgaWRlX3NldF9yZXNldCAoaW50IGlkZXJlc2V0KQoreworCWRlYnVnICgiaWRlX3Jlc2V0KCVkKVxuIiwgaWRlcmVzZXQpOworCWlmIChpZGVyZXNldCA9PSAwKSB7CisJCW91dDMyIChHUElPMF9PUiwgKGluMzIgKEdQSU8wX09SKSB8IDB4MDAyMDAwMDApKTsKKwl9IGVsc2UgeworCQlvdXQzMiAoR1BJTzBfT1IsIChpbjMyIChHUElPMF9PUikgJiB+MHgwMDIwMDAwMCkpOworCX0KKwl1ZGVsYXkgKDEwMDAwKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkIChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3BjczQ0MGVwL3UtYm9vdC5sZHMgYi9ib2FyZC9wY3M0NDBlcC91LWJvb3QubGRzCmluZGV4IDZhYjQ3NmEuLjY1MDZjY2QgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BjczQ0MGVwL3UtYm9vdC5sZHMKKysrIGIvYm9hcmQvcGNzNDQwZXAvdS1ib290LmxkcwpAQCAtNjUsNiArNjUsNyBAQAogICB7CiAgICAgY3B1L3BwYzR4eC9zdGFydC5vCSgudGV4dCkKICAgICBib2FyZC9wY3M0NDBlcC9pbml0Lm8JKC50ZXh0KQorICAgIGxpYl9nZW5lcmljL3NoYTEubwkJKC50ZXh0KQogCiAgICAgKigudGV4dCkKICAgICAqKC5maXh1cCkKZGlmZiAtLWdpdCBhL2JvYXJkL3BtNTIwL3BtNTIwLmMgYi9ib2FyZC9wbTUyMC9wbTUyMC5jCmluZGV4IDY1YzUyOTEuLjE0YzNmMWQgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BtNTIwL3BtNTIwLmMKKysrIGIvYm9hcmQvcG01MjAvcG01MjAuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCAodm9pZCkKIHsKQEAgLTMxMiw5ICszMTIsOSBAQAogCWRlYnVnICgiaWRlX3Jlc2V0KCVkKVxuIiwgaWRlcmVzZXQpOwogCiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9wbTUyMC91LWJvb3QubGRzIGIvYm9hcmQvcG01MjAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjMjk2OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9wbTUyMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3BtODI2L3BtODI2LmMgYi9ib2FyZC9wbTgyNi9wbTgyNi5jCmluZGV4IDc1MTRjZDcuLjE0MjBlNjQgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BtODI2L3BtODI2LmMKKysrIGIvYm9hcmQvcG04MjYvcG04MjYuYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJcmV0dXJuIChwc2l6ZSk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvcG04MjYvdS1ib290LmxkcyBiL2JvYXJkL3BtODI2L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjI5YzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvcG04MjYvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvcG04MjgvcG04MjguYyBiL2JvYXJkL3BtODI4L3BtODI4LmMKaW5kZXggMzE5MzI3NC4uOThjZDgwYiAxMDA2NDQKLS0tIGEvYm9hcmQvcG04MjgvcG04MjguYworKysgYi9ib2FyZC9wbTgyOC9wbTgyOC5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIAlyZXR1cm4gKHBzaXplKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9wbTgyOC91LWJvb3QubGRzIGIvYm9hcmQvcG04MjgvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4YzFjZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9wbTgyOC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3BuNjIvY21kX3BuNjIuYyBiL2JvYXJkL3BuNjIvY21kX3BuNjIuYwppbmRleCAzZWEwNjhkLi5mZmEyMGNkIDEwMDY0NAotLS0gYS9ib2FyZC9wbjYyL2NtZF9wbjYyLmMKKysrIGIvYm9hcmQvcG42Mi9jbWRfcG42Mi5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgInBuNjIuaCIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiBleHRlcm4gaW50IGRvX2Jvb3RtIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvcG42Mi91LWJvb3QubGRzIGIvYm9hcmQvcG42Mi91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVlM2ZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3BuNjIvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3ZzcHJpbnRmLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3BwbWM4MjYwL3UtYm9vdC5sZHMgYi9ib2FyZC9wcG1jODI2MC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQ0Yjc4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3BwbWM4MjYwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3Byb2RyaXZlL2FscHIvbmFuZC5jIGIvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKaW5kZXggZDY2YjA4OC4uMDk3ZTE4MyAxMDA2NDQKLS0tIGEvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKKysrIGIvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxuYW5kLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9wM214L3NlcmlhbC5jIGIvYm9hcmQvcHJvZHJpdmUvcDNteC9zZXJpYWwuYwppbmRleCBiYTMyYWMxLi5lMWFmMzdlIDEwMDY0NAotLS0gYS9ib2FyZC9wcm9kcml2ZS9wM214L3NlcmlhbC5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL3AzbXgvc2VyaWFsLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZCBrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQogewogfQpAQCAtMTA0LDQgKzEwNCw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9wZG5iMy9uYW5kLmMgYi9ib2FyZC9wcm9kcml2ZS9wZG5iMy9uYW5kLmMKaW5kZXggOTJmOWMwMS4uYjFlNzA0MSAxMDA2NDQKLS0tIGEvYm9hcmQvcHJvZHJpdmUvcGRuYjMvbmFuZC5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL3BkbmIzL25hbmQuYwpAQCAtMjMsNyArMjMsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogCmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9wZG5iMy9wZG5iMy5jIGIvYm9hcmQvcHJvZHJpdmUvcGRuYjMvcGRuYjMuYwppbmRleCBlMmZlZDVkLi5hMWEzMTBhIDEwMDY0NAotLS0gYS9ib2FyZC9wcm9kcml2ZS9wZG5iMy9wZG5iMy5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL3BkbmIzL3BkbmIzLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCSJhZGRyZXNzIHNpemVcbiAgICAtIGJvb3QgRlBHQSB3aXRoIGd6aXBwZWQgaW1hZ2UgYXQgPGFkZHJlc3M+XG4iCiApOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDSSkgfHwgZGVmaW5lZChDT05GSUdfUENJKQogZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlciBob3NlOwogZXh0ZXJuIHZvaWQgcGNpX2l4cF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2UpOwogCmRpZmYgLS1naXQgYS9ib2FyZC9yMzYwbXBpL3BjbWNpYS5jIGIvYm9hcmQvcjM2MG1waS9wY21jaWEuYwppbmRleCA3ZDM0YWM4Li5hODNjYThkIDEwMDY0NAotLS0gYS9ib2FyZC9yMzYwbXBpL3BjbWNpYS5jCisrKyBiL2JvYXJkL3IzNjBtcGkvcGNtY2lhLmMKQEAgLTQsMTEgKzQsMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC0xMjMsNyArMTIzLDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAKIGludCBwY21jaWFfdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCmRpZmYgLS1naXQgYS9ib2FyZC9yYXR0bGVyL3UtYm9vdC5sZHMgYi9ib2FyZC9yYXR0bGVyL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMmU2ZGEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvcmF0dGxlci91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwNQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBNb2RpZmllZCBieSBZdWxpIEJhcmNvaGVuIDx5dWxpQGFyYWJlbGxhc3cuY29tPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9ycHhzdXBlci91LWJvb3QubGRzIGIvYm9hcmQvcnB4c3VwZXIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2MjNkMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9ycHhzdXBlci91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9yc2Rwcm90by9jb25maWcubWsgYi9ib2FyZC9yc2Rwcm90by9jb25maWcubWsKaW5kZXggNTg0NGVjMS4uMzVjM2Q4YyAxMDA2NDQKLS0tIGEvYm9hcmQvcnNkcHJvdG8vY29uZmlnLm1rCisrKyBiL2JvYXJkL3JzZHByb3RvL2NvbmZpZy5tawpAQCAtMzEsMyArMzEsNSBAQAogCiBURVhUX0JBU0UgPSAweGZmMDAwMDAwCiAvKlRFWFRfQkFTRSAgPSAweDAwMjAwMDAwICovCisKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYm9hcmQvcnNkcHJvdG8vdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvYm9hcmQvcnNkcHJvdG8vdS1ib290LmxkcyBiL2JvYXJkL3JzZHByb3RvL3UtYm9vdC5sZHMKaW5kZXggNzBmYzNhNS4uOWJkNjI0OCAxMDA2NDQKLS0tIGEvYm9hcmQvcnNkcHJvdG8vdS1ib290LmxkcworKysgYi9ib2FyZC9yc2Rwcm90by91LWJvb3QubGRzCkBAIC01NSw3ICs1NSw2IEBACiAgIHsKICAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKICAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQogICAgICooLmdvdDEpCiAgICAgLyouID0gZW52X29mZnNldDsgKi8KICAgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2Fjc25nL3NhY3NuZy5jIGIvYm9hcmQvc2Fjc25nL3NhY3NuZy5jCmluZGV4IGU1MGI3NDcuLjI1MjA5ZTAgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NhY3NuZy9zYWNzbmcuYworKysgYi9ib2FyZC9zYWNzbmcvc2Fjc25nLmMKQEAgLTgzNyw3ICs4MzcsNyBAQAogLyoKICAqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgU1BJIGNoaXAgc2VsZWN0cyBmb3IgdGhlIFNQSSBjb21tYW5kLgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU1BJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TUEkpCiAKICNkZWZpbmUgU1BJX0FEQ19DU19NQVNLCTB4MDAwMDA4MDAKICNkZWZpbmUgU1BJX0RBQ19DU19NQVNLCTB4MDAwMDEwMDAKQEAgLTg3Myw3ICs4NzMsNyBAQAogfTsKIGludCBzcGlfY2hpcHNlbF9jbnQgPSBzaXplb2Yoc3BpX2NoaXBzZWwpIC8gc2l6ZW9mKHNwaV9jaGlwc2VsWzBdKTsKIAotI2VuZGlmIC8qIENGR19DTURfU1BJICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19NSVNDX0lOSVRfUiAqLwogCmRpZmYgLS1naXQgYS9ib2FyZC9zYWNzbmcvdS1ib290LmxkcyBiL2JvYXJkL3NhY3NuZy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTYyM2QwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3NhY3NuZy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zYW5kcG9pbnQvdS1ib290LmxkcyBiL2JvYXJkL3NhbmRwb2ludC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVjZDJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3NhbmRwb2ludC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zYmMyNDEweC9zYmMyNDEweC5jIGIvYm9hcmQvc2JjMjQxMHgvc2JjMjQxMHguYwppbmRleCA3MDMwOTg1Li5iNDg2NWUxIDEwMDY0NAotLS0gYS9ib2FyZC9zYmMyNDEweC9zYmMyNDEweC5jCisrKyBiL2JvYXJkL3NiYzI0MTB4L3NiYzI0MTB4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxzM2MyNDEwLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjZW5kaWYKIApAQCAtMTM2LDcgKzEzNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogZXh0ZXJuIHVsb25nIG5hbmRfcHJvYmUodWxvbmcgcGh5c2Fkcik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBORl9SZXNldCh2b2lkKQpAQCAtMTgwLDQgKzE4MCw0IEBACiAjZW5kaWYKIAlwcmludGYgKCIlNGx1IE1CXG4iLCBuYW5kX3Byb2JlKCh1bG9uZyluYW5kKSA+PiAyMCk7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzgyNDAvdS1ib290LmxkcyBiL2JvYXJkL3NiYzgyNDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlODVlNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9zYmM4MjQwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubyAoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zYmM4MjYwL3UtYm9vdC5sZHMgYi9ib2FyZC9zYmM4MjYwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjIzZDAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvc2JjODI2MC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zYmM4MzQ5L3UtYm9vdC5sZHMgYi9ib2FyZC9zYmM4MzQ5L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMmMwNzUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvc2JjODM0OS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuCi0gKiB1LWJvb3QubGRzIGZvciBXaW5kUml2ZXIgU0JDODM0OS4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgTVBDODM0OSB1LWJvb3QubGRzCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzg2NDFkL01ha2VmaWxlIGIvYm9hcmQvc2JjODY0MWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwYjcyNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NiYzg2NDFkL01ha2VmaWxlCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9ICQoQk9BUkQpLm8KK1NPQkpTCTo9IGluaXQubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChPQkpTKSAkKFNPQkpTKQorCisuUEhPTlk6IGRpc3RjbGVhbgorZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAoJG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzg2NDFkL2NvbmZpZy5tayBiL2JvYXJkL3NiYzg2NDFkL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE3NTRkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2JjODY0MWQvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisjIE1vZGlmaWVkIGJ5IEplZmYgQnJvd24KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIworIyBzYmM4NjQxIGJvYXJkCisjIGRlZmF1bHQgQ0NTUkJBUiBpcyBhdCAweGZmNzAwMDAwCisjCitURVhUX0JBU0UgPSAweGZmZjAwMDAwCisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX01QQzg2eHg9MQorUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODY0MT0xIC1tYWx0aXZlYyAtbWFiaT1hbHRpdmVjIC1tc29mdC1mbG9hdApkaWZmIC0tZ2l0IGEvYm9hcmQvc2JjODY0MWQvaW5pdC5TIGIvYm9hcmQvc2JjODY0MWQvaW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTFkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYmM4NjQxZC9pbml0LlMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbWVzLCBJbmMuIDx3d3cud2luZHJpdmVyLmNvbT4KKyAqIENvcHlyaWdodCAyMDA3IEVtYmVkZGVkIFNwZWNpYWx0aWVzLCBJbmMuCisgKiBKb2UgSGFtbWFuIGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIEplZmYgQnJvd24KKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gKHNyaWthbnRoLnNyaW5pdmFzYW5AZnJlZXNjYWxlLmNvbSkKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzg2eHguaD4KKworLyoKKyAqIExBVyhMb2NhbCBBY2Nlc3MgV2luZG93KSBjb25maWd1cmF0aW9uOgorICoKKyAqIDB4MDAwMF8wMDAwCTB4MGZmZl9mZmZmCUREUjEJMjU2TQorICogMHgxMDAwXzAwMDAJMHgxZmZmX2ZmZmYJRERSMgkyNTZNCisgKiAweGUwMDBfMDAwMAkweGZmZmZfZmZmZglMQkMJNTEyTQorICoKKyAqIE5vdGVzOgorICogICBDQ1NSQkFSIGRvZXNuJ3QgbmVlZCBhIGNvbmZpZ3VyZWQgTG9jYWwgQWNjZXNzIFdpbmRvdy4KKyAqICAgSWYgZmxhc2ggaXMgOE0gYXQgZGVmYXVsdCBwb3NpdGlvbiAobGFzdCA4TSksIG5vIExBVyBuZWVkZWQuCisgKi8KKworIyBERFIgQmFuayAxCisjICNkZWZpbmUgTEFXQkFSMSAoKENGR19ERFJfU0RSQU1fQkFTRT4+MTIpICYgMHhmZmZmZmYpCisjICNkZWZpbmUgTEFXQVIxIChMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfRERSMSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKSkKKworIyBERFIgQmFuayAyCisjICNkZWZpbmUgTEFXQkFSMiAoKENGR19ERFJfU0RSQU1fQkFTRTI+PjEyKSAmIDB4ZmZmZmZmKQorIyAjZGVmaW5lIExBV0FSMiAoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX0REUjIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCisKKyMgTEJDCisjICNkZWZpbmUgTEFXQkFSMyAoKDB4ZTAwMDAwMDA+PjEyKSAmIDB4ZmZmZmZmKQorIyAjZGVmaW5lIExBV0FSMyAoTEFXQVJfRU4gJiAoTEFXQVJfVFJHVF9JRl9MQkMgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpKQorCisvKgorICogTEFXIChMb2NhbCBBY2Nlc3MgV2luZG93KSBjb25maWd1cmF0aW9uOgorICoKKyAqIDB4MDAwMF8wMDAwCUREUgkJCTI1Nk0KKyAqIDB4MTAwMF8wMDAwCUREUjIJCQkyNTZNCisgKiAweDgwMDBfMDAwMAlQQ0kxIE1FTQkJNTEyTQorICogMHhhMDAwXzAwMDAJUENJMiBNRU0JCTUxMk0KKyAqIDB4YzAwMF8wMDAwCVJhcGlkSU8JCQk1MTJNCisgKiAweGUyMDBfMDAwMAlQQ0kxIElPCQkJMTZNCisgKiAweGUzMDBfMDAwMAlQQ0kyIElPCQkJMTZNCisgKiAweGY4MDBfMDAwMAlDQ1NSQkFSCQkJMk0KKyAqIDB4ZmUwMF8wMDAwCUZMQVNIIChib290IGJhbmspCTMyTQorICoKKyAqLworCisjZGVmaW5lIExBV0JBUjEgKChDRkdfRERSX1NEUkFNX0JBU0U+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjEJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9ERFIxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzI1Nk0pKQorCisjZGVmaW5lIExBV0JBUjIgKChDRkdfUENJMV9NRU1fQkFTRT4+MTIpICYgMHhmZmZmZmYpCisjZGVmaW5lIExBV0FSMgkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpCisKKyNkZWZpbmUgTEFXQkFSMyAoKENGR19QQ0kyX01FTV9CQVNFPj4xMikgJiAweGZmZmZmZikKKyNkZWZpbmUgTEFXQVIzCSh+TEFXQVJfRU4gJiAoTEFXQVJfVFJHVF9JRl9QQ0kyIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pKSkKKworI2RlZmluZSBMQVdCQVI0ICgoMHhmODAwMDAwMD4+MTIpICYgMHhmZmZmZmYpCisjZGVmaW5lIExBV0FSNAkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX0xCQyB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yTSkpCisKKyNkZWZpbmUgTEFXQkFSNSAoKENGR19QQ0kxX0lPX0JBU0U+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjUJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QQ0kxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzE2TSkpCisKKyNkZWZpbmUgTEFXQkFSNiAoKENGR19QQ0kyX0lPX0JBU0U+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjYJKH5MQVdBUl9FTiAmKCBMQVdBUl9UUkdUX0lGX1BDSTIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMTZNKSkpCisKKyNkZWZpbmUgTEFXQkFSNyAoKDB4ZmUwMDAwMDAgPj4xMikgJiAweGZmZmZmZikKKyNkZWZpbmUgTEFXQVI3CShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfTEJDIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzMyTSkpCisKKyNkZWZpbmUgTEFXQkFSOCAoKENGR19ERFJfU0RSQU1fQkFTRTI+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjggKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9ERFIyIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzI1Nk0pKQorCisjZGVmaW5lIExBV0JBUjkgKChDRkdfUklPX01FTV9CQVNFPj4xMikgJiAweGZmZmZmKQorI2RlZmluZSBMQVdBUjkgIChMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUklPIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pKQorCisJLnNlY3Rpb24gLmJvb3RwZywgImF4IgorCS5nbG9ibAlsYXdfZW50cnkKK2xhd19lbnRyeToKKwlsaXMJcjcsQ0ZHX0NDU1JCQVJAaAorCW9yaQlyNyxyNyxDRkdfQ0NTUkJBUkBsCisKKwlhZGRpICAgIHI0LHI3LDAKKwlhZGRpICAgIHI1LHI3LDAKKworCS8qIFNraXAgTEFXQVIwLCBzdGFydCBhdCBMQVdBUjEgKi8KKwlsaXMgICAgIHI2LExBV0JBUjFAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSMUBsCisJc3R3dSAgICByNiwgMHhjMjgocjQpCisKKwlsaXMgICAgIHI2LExBV0FSMUBoCisJb3JpICAgICByNixyNixMQVdBUjFAbAorCXN0d3UgICAgcjYsIDB4YzMwKHI1KQorCisJLyogTEFXQkFSMiwgTEFXQVIyICovCisJbGlzICAgICByNixMQVdCQVIyQGgKKwlvcmkgICAgIHI2LHI2LExBV0JBUjJAbAorCXN0d3UgICAgcjYsIDB4MjAocjQpCisKKwlsaXMgICAgIHI2LExBV0FSMkBoCisJb3JpICAgICByNixyNixMQVdBUjJAbAorCXN0d3UgICAgcjYsIDB4MjAocjUpCisKKwkvKiBMQVdCQVIzLCBMQVdBUjMgKi8KKwlsaXMgICAgIHI2LExBV0JBUjNAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSM0BsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVIzQGgKKwlvcmkgICAgIHI2LHI2LExBV0FSM0BsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCS8qIExBV0JBUjQsIExBV0FSNCAqLworCWxpcyAgICAgcjYsTEFXQkFSNEBoCisJb3JpICAgICByNixyNixMQVdCQVI0QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI0KQorCisJbGlzICAgICByNixMQVdBUjRAaAorCW9yaSAgICAgcjYscjYsTEFXQVI0QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI1KQorCisJLyogTEFXQkFSNSwgTEFXQVI1ICovCisJbGlzICAgICByNixMQVdCQVI1QGgKKwlvcmkgICAgIHI2LHI2LExBV0JBUjVAbAorCXN0d3UgICAgcjYsIDB4MjAocjQpCisKKwlsaXMgICAgIHI2LExBV0FSNUBoCisJb3JpICAgICByNixyNixMQVdBUjVAbAorCXN0d3UgICAgcjYsIDB4MjAocjUpCisKKwkvKiBMQVdCQVI2LCBMQVdBUjYgKi8KKwlsaXMgICAgIHI2LExBV0JBUjZAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSNkBsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVI2QGgKKwlvcmkgICAgIHI2LHI2LExBV0FSNkBsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCS8qIExBV0JBUjcsIExBV0FSNyAqLworCWxpcyAgICAgcjYsTEFXQkFSN0BoCisJb3JpICAgICByNixyNixMQVdCQVI3QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI0KQorCisJbGlzICAgICByNixMQVdBUjdAaAorCW9yaSAgICAgcjYscjYsTEFXQVI3QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI1KQorCisJLyogTEFXQkFSOCwgTEFXQVI4ICovCisJbGlzICAgICByNixMQVdCQVI4QGgKKwlvcmkgICAgIHI2LHI2LExBV0JBUjhAbAorCXN0d3UgICAgcjYsIDB4MjAocjQpCisKKwlsaXMgICAgIHI2LExBV0FSOEBoCisJb3JpICAgICByNixyNixMQVdBUjhAbAorCXN0d3UgICAgcjYsIDB4MjAocjUpCisKKwkvKiBMQVdCQVI5LCBMQVdBUjkgKi8KKwlsaXMgICAgIHI2LExBV0JBUjlAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSOUBsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVI5QGgKKwlvcmkgICAgIHI2LHI2LExBV0FSOUBsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCWJscgpkaWZmIC0tZ2l0IGEvYm9hcmQvc2JjODY0MWQvc2JjODY0MWQuYyBiL2JvYXJkL3NiYzg2NDFkL3NiYzg2NDFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkYzQyZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NiYzg2NDFkL3NiYzg2NDFkLmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbWVzLCBJbmMuIDx3d3cud2luZHJpdmVyLmNvbT4KKyAqIENvcHlyaWdodCAyMDA3IEVtYmVkZGVkIFNwZWNpYWx0aWVzLCBJbmMuCisgKiBKb2UgSGFtbWFuIGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIEplZmYgQnJvd24KKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gKHNyaWthbnRoLnNyaW5pdmFzYW5AZnJlZXNjYWxlLmNvbSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgU2NvdHQgTWNOdXR0IDxzbWNudXR0QGFydGVzeW5jcC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwXzg2eHguaD4KKyNpbmNsdWRlIDxhc20vaW1tYXBfZnNsX3BjaS5oPgorI2luY2x1ZGUgPHNwZC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQorI2luY2x1ZGUgPGZ0X2J1aWxkLmg+CitleHRlcm4gdm9pZCBmdF9jcHVfc2V0dXAgKHZvaWQgKmJsb2IsIGJkX3QgKiBiZCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmICFkZWZpbmVkKENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUikKK2V4dGVybiB2b2lkIGRkcl9lbmFibGVfZWNjICh1bnNpZ25lZCBpbnQgZHJhbV9zaXplKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKyNpbmNsdWRlICJzcGRfc2RyYW0uaCIKKyNlbmRpZgorCit2b2lkIHNkcmFtX2luaXQgKHZvaWQpOworbG9uZyBpbnQgZml4ZWRfc2RyYW0gKHZvaWQpOworCitpbnQgYm9hcmRfZWFybHlfaW5pdF9mICh2b2lkKQoreworCXJldHVybiAwOworfQorCitpbnQgY2hlY2tib2FyZCAodm9pZCkKK3sKKwlwdXRzICgiQm9hcmQ6IFdpbmQgUml2ZXIgU0JDODY0MURcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKwlsb25nIGRyYW1fc2l6ZSA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorCWRyYW1fc2l6ZSA9IHNwZF9zZHJhbSAoKTsKKyNlbHNlCisJZHJhbV9zaXplID0gZml4ZWRfc2RyYW0gKCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisJcHV0cyAoIiAgICBERFI6ICIpOworCXJldHVybiBkcmFtX3NpemU7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmICFkZWZpbmVkKENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUikKKwkvKgorCSAqIEluaXRpYWxpemUgYW5kIGVuYWJsZSBERFIgRUNDLgorCSAqLworCWRkcl9lbmFibGVfZWNjIChkcmFtX3NpemUpOworI2VuZGlmCisKKwlwdXRzICgiICAgIEREUjogIik7CisJcmV0dXJuIGRyYW1fc2l6ZTsKK30KKworI2lmIGRlZmluZWQoQ0ZHX0RSQU1fVEVTVCkKK2ludCB0ZXN0ZHJhbSAodm9pZCkKK3sKKwl1aW50ICpwc3RhcnQgPSAodWludCAqKSBDRkdfTUVNVEVTVF9TVEFSVDsKKwl1aW50ICpwZW5kID0gKHVpbnQgKikgQ0ZHX01FTVRFU1RfRU5EOworCXVpbnQgKnA7CisKKwlwdXRzICgiU0RSQU0gdGVzdCBwaGFzZSAxOlxuIik7CisJZm9yIChwID0gcHN0YXJ0OyBwIDwgcGVuZDsgcCsrKQorCQkqcCA9IDB4YWFhYWFhYWE7CisKKwlmb3IgKHAgPSBwc3RhcnQ7IHAgPCBwZW5kOyBwKyspIHsKKwkJaWYgKCpwICE9IDB4YWFhYWFhYWEpIHsKKwkJCXByaW50ZiAoIlNEUkFNIHRlc3QgZmFpbHMgYXQ6ICUwOHhcbiIsICh1aW50KSBwKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcHV0cyAoIlNEUkFNIHRlc3QgcGhhc2UgMjpcbiIpOworCWZvciAocCA9IHBzdGFydDsgcCA8IHBlbmQ7IHArKykKKwkJKnAgPSAweDU1NTU1NTU1OworCisJZm9yIChwID0gcHN0YXJ0OyBwIDwgcGVuZDsgcCsrKSB7CisJCWlmICgqcCAhPSAweDU1NTU1NTU1KSB7CisJCQlwcmludGYgKCJTRFJBTSB0ZXN0IGZhaWxzIGF0OiAlMDh4XG4iLCAodWludCkgcCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXB1dHMgKCJTRFJBTSB0ZXN0IHBhc3NlZC5cbiIpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKy8qCisgKiBGaXhlZCBzZHJhbSBpbml0IC0tIGRvZXNuJ3QgdXNlIHNlcmlhbCBwcmVzZW5jZSBkZXRlY3QuCisgKi8KK2xvbmcgaW50IGZpeGVkX3NkcmFtICh2b2lkKQoreworI2lmICFkZWZpbmVkKENGR19SQU1CT09UKQorCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyID0gJmltbWFwLT5pbV9kZHIxOworCisJZGRyLT5jczBfYm5kcyA9IENGR19ERFJfQ1MwX0JORFM7CisJZGRyLT5jczFfYm5kcyA9IENGR19ERFJfQ1MxX0JORFM7CisJZGRyLT5jczJfYm5kcyA9IENGR19ERFJfQ1MyX0JORFM7CisJZGRyLT5jczNfYm5kcyA9IENGR19ERFJfQ1MzX0JORFM7CisJZGRyLT5jczBfY29uZmlnID0gQ0ZHX0REUl9DUzBfQ09ORklHOworCWRkci0+Y3MxX2NvbmZpZyA9IENGR19ERFJfQ1MxX0NPTkZJRzsKKwlkZHItPmNzMl9jb25maWcgPSBDRkdfRERSX0NTMl9DT05GSUc7CisJZGRyLT5jczNfY29uZmlnID0gQ0ZHX0REUl9DUzNfQ09ORklHOworCWRkci0+ZXh0X3JlZnJlYyA9IENGR19ERFJfRVhUX1JFRlJFU0g7CisJZGRyLT50aW1pbmdfY2ZnXzAgPSBDRkdfRERSX1RJTUlOR18wOworCWRkci0+dGltaW5nX2NmZ18xID0gQ0ZHX0REUl9USU1JTkdfMTsKKwlkZHItPnRpbWluZ19jZmdfMiA9IENGR19ERFJfVElNSU5HXzI7CisJZGRyLT5zZHJhbV9jZmdfMSA9IENGR19ERFJfQ0ZHXzFBOworCWRkci0+c2RyYW1fY2ZnXzIgPSBDRkdfRERSX0NGR18yOworCWRkci0+c2RyYW1fbW9kZV8xID0gQ0ZHX0REUl9NT0RFXzE7CisJZGRyLT5zZHJhbV9tb2RlXzIgPSBDRkdfRERSX01PREVfMjsKKwlkZHItPnNkcmFtX21vZGVfY250bCA9IENGR19ERFJfTU9ERV9DVEw7CisJZGRyLT5zZHJhbV9pbnRlcnZhbCA9IENGR19ERFJfSU5URVJWQUw7CisJZGRyLT5zZHJhbV9kYXRhX2luaXQgPSBDRkdfRERSX0RBVEFfSU5JVDsKKwlkZHItPnNkcmFtX2Nsa19jbnRsID0gQ0ZHX0REUl9DTEtfQ1RSTDsKKworCWFzbSAoInN5bmM7aXN5bmMiKTsKKworCXVkZWxheSAoNTAwKTsKKworCWRkci0+c2RyYW1fY2ZnXzEgPSBDRkdfRERSX0NGR18xQjsKKwlhc20gKCJzeW5jOyBpc3luYyIpOworCisJdWRlbGF5ICg1MDApOworCWRkciA9ICZpbW1hcC0+aW1fZGRyMjsKKworCWRkci0+Y3MwX2JuZHMgPSBDRkdfRERSMl9DUzBfQk5EUzsKKwlkZHItPmNzMV9ibmRzID0gQ0ZHX0REUjJfQ1MxX0JORFM7CisJZGRyLT5jczJfYm5kcyA9IENGR19ERFIyX0NTMl9CTkRTOworCWRkci0+Y3MzX2JuZHMgPSBDRkdfRERSMl9DUzNfQk5EUzsKKwlkZHItPmNzMF9jb25maWcgPSBDRkdfRERSMl9DUzBfQ09ORklHOworCWRkci0+Y3MxX2NvbmZpZyA9IENGR19ERFIyX0NTMV9DT05GSUc7CisJZGRyLT5jczJfY29uZmlnID0gQ0ZHX0REUjJfQ1MyX0NPTkZJRzsKKwlkZHItPmNzM19jb25maWcgPSBDRkdfRERSMl9DUzNfQ09ORklHOworCWRkci0+ZXh0X3JlZnJlYyA9IENGR19ERFIyX0VYVF9SRUZSRVNIOworCWRkci0+dGltaW5nX2NmZ18wID0gQ0ZHX0REUjJfVElNSU5HXzA7CisJZGRyLT50aW1pbmdfY2ZnXzEgPSBDRkdfRERSMl9USU1JTkdfMTsKKwlkZHItPnRpbWluZ19jZmdfMiA9IENGR19ERFIyX1RJTUlOR18yOworCWRkci0+c2RyYW1fY2ZnXzEgPSBDRkdfRERSMl9DRkdfMUE7CisJZGRyLT5zZHJhbV9jZmdfMiA9IENGR19ERFIyX0NGR18yOworCWRkci0+c2RyYW1fbW9kZV8xID0gQ0ZHX0REUjJfTU9ERV8xOworCWRkci0+c2RyYW1fbW9kZV8yID0gQ0ZHX0REUjJfTU9ERV8yOworCWRkci0+c2RyYW1fbW9kZV9jbnRsID0gQ0ZHX0REUjJfTU9ERV9DVEw7CisJZGRyLT5zZHJhbV9pbnRlcnZhbCA9IENGR19ERFIyX0lOVEVSVkFMOworCWRkci0+c2RyYW1fZGF0YV9pbml0ID0gQ0ZHX0REUjJfREFUQV9JTklUOworCWRkci0+c2RyYW1fY2xrX2NudGwgPSBDRkdfRERSMl9DTEtfQ1RSTDsKKworCWFzbSAoInN5bmM7aXN5bmMiKTsKKworCXVkZWxheSAoNTAwKTsKKworCWRkci0+c2RyYW1fY2ZnXzEgPSBDRkdfRERSMl9DRkdfMUI7CisJYXNtICgic3luYzsgaXN5bmMiKTsKKworCXVkZWxheSAoNTAwKTsKKyNlbmRpZgorCXJldHVybiBDRkdfU0RSQU1fU0laRSAqIDEwMjQgKiAxMDI0OworfQorI2VuZGlmCQkJCS8qICFkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorLyoKKyAqIEluaXRpYWxpemUgUENJIERldmljZXMsIHJlcG9ydCBkZXZpY2VzIGZvdW5kLgorICovCisKKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfZnNsODZ4eGFkc19jb25maWdfdGFibGVbXSA9IHsKKwl7UENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgUENJX0lEU0VMX05VTUJFUiwgUENJX0FOWV9JRCwKKwkgcGNpX2NmZ2Z1bmNfY29uZmlnX2RldmljZSwge1BDSV9FTkVUMF9JT0FERFIsCisJCQkJICAgICBQQ0lfRU5FVDBfTUVNQUREUiwKKwkJCQkgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUn19LAorCXt9Cit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMV9ob3NlID0geworI2lmbmRlZiBDT05GSUdfUENJX1BOUAorCWNvbmZpZ190YWJsZTpwY2lfbXBjODZ4eGN0c19jb25maWdfdGFibGUKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNpZmRlZiBDT05GSUdfUENJMgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kyX2hvc2U7CisjZW5kaWYJLyogQ09ORklHX1BDSTIgKi8KKworaW50IGZpcnN0X2ZyZWVfYnVzbm8gPSAwOworCit2b2lkIHBjaV9pbml0X2JvYXJkKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfQ0NTUkJBUjsKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKKwl1aW50IGRldmRpc3IgPSBndXItPmRldmRpc3I7CisJdWludCBpb19zZWwgPSAoZ3VyLT5wb3JkZXZzciAmIE1QQzg2eHhfUE9SREVWU1JfSU9fU0VMKSA+PiAxNjsKKworI2lmZGVmIENPTkZJR19QQ0kxCit7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJMV9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2kxX2hvc2U7CisjaWZkZWYgREVCVUcKKwl1aW50IGhvc3QxX2FnZW50ID0gKGd1ci0+cG9yYm1zciAmIE1QQzg2eHhfUE9SQk1TUl9IQSkgPj4gMTc7CisJdWludCBwZXgxX2FnZW50ID0gKGhvc3QxX2FnZW50ID09IDApIHx8IChob3N0MV9hZ2VudCA9PSAxKTsKKyNlbmRpZgorCWlmICgoaW9fc2VsID09IDIgfHwgaW9fc2VsID09IDMgfHwgaW9fc2VsID09IDUKKwkgICAgIHx8IGlvX3NlbCA9PSA2IHx8IGlvX3NlbCA9PSA3IHx8IGlvX3NlbCA9PSAweEYpCisJICAgICYmICEoZGV2ZGlzciAmIE1QQzg2eHhfREVWRElTUl9QQ0lFWDEpKSB7CisJCWRlYnVnKCJQQ0ktRVhQUkVTUyAxOiAlcyBcbiIsIHBleDFfYWdlbnQgPyAiQWdlbnQiIDogIkhvc3QiKTsKKwkJZGVidWcoIjB4JTA4eD0weCUwOHggIiwgJnBjaS0+cG1lX21zZ19kZXQsIHBjaS0+cG1lX21zZ19kZXQpOworCQlpZiAocGNpLT5wbWVfbXNnX2RldCkgeworCQkJcGNpLT5wbWVfbXNnX2RldCA9IDB4ZmZmZmZmZmY7CisJCQlkZWJ1ZygiIHdpdGggZXJyb3JzLiAgQ2xlYXJpbmcuICBOb3cgMHglMDh4IiwKKwkJCSAgICAgIHBjaS0+cG1lX21zZ19kZXQpOworCQl9CisJCWRlYnVnKCJcbiIpOworCisJCS8qIGluYm91bmQgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfQlVTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fTUVNT1JZKTsKKworCQkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJCS8qIG91dGJvdW5kIGlvICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkJICAgICAgIENGR19QQ0kxX0lPX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9JT19TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisKKwkJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKwkJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsIChpbnQpICZwY2ktPmNmZ19hZGRyLCAoaW50KSAmcGNpLT5jZmdfZGF0YSk7CisKKwkJZnNsX3BjaV9pbml0KGhvc2UpOworCisJCWZpcnN0X2ZyZWVfYnVzbm89aG9zZS0+bGFzdF9idXNubysxOworCQlwcmludGYgKCIgICAgUENJLUVYUFJFU1MgMSBvbiBidXMgJTAyeCAtICUwMnhcbiIsCisJCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKKworCX0gZWxzZSB7CisJCXB1dHMoIlBDSS1FWFBSRVNTIDE6IERpc2FibGVkXG4iKTsKKwl9Cit9CisjZWxzZQorCXB1dHMoIlBDSS1FWFBSRVNTMTogRGlzYWJsZWRcbiIpOworI2VuZGlmIC8qIENPTkZJR19QQ0kxICovCisKKyNpZmRlZiBDT05GSUdfUENJMgoreworCXZvbGF0aWxlIGNjc3JfZnNsX3BjaV90ICpwY2kgPSAoY2Nzcl9mc2xfcGNpX3QgKikgQ0ZHX1BDSTJfQUREUjsKKwlleHRlcm4gdm9pZCBmc2xfcGNpX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAmcGNpMl9ob3NlOworCisKKwkvKiBpbmJvdW5kICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCSAgICAgICBDRkdfUENJX01FTU9SWV9QSFlTLAorCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCSAgICAgICBDRkdfUENJMl9NRU1fQkFTRSwKKwkJICAgICAgIENGR19QQ0kyX01FTV9QSFlTLAorCQkgICAgICAgQ0ZHX1BDSTJfTUVNX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBvdXRib3VuZCBpbyAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkgICAgICAgQ0ZHX1BDSTJfSU9fQkFTRSwKKwkJICAgICAgIENGR19QQ0kyX0lPX1BIWVMsCisJCSAgICAgICBDRkdfUENJMl9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwlob3NlLT5yZWdpb25fY291bnQgPSAzOworCisJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKwlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKGludCkgJnBjaS0+Y2ZnX2FkZHIsIChpbnQpICZwY2ktPmNmZ19kYXRhKTsKKworCWZzbF9wY2lfaW5pdChob3NlKTsKKworCWZpcnN0X2ZyZWVfYnVzbm89aG9zZS0+bGFzdF9idXNubysxOworCXByaW50ZiAoIiAgICBQQ0ktRVhQUkVTUyAyIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJaG9zZS0+Zmlyc3RfYnVzbm8saG9zZS0+bGFzdF9idXNubyk7Cit9CisjZWxzZQorCXB1dHMoIlBDSS1FWFBSRVNTIDI6IERpc2FibGVkXG4iKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJMiAqLworCit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQordm9pZCBmdF9ib2FyZF9zZXR1cCAodm9pZCAqYmxvYiwgYmRfdCAqIGJkKQoreworCXUzMiAqcDsKKwlpbnQgbGVuOworCisJZnRfY3B1X3NldHVwIChibG9iLCBiZCk7CisKKwlwID0gZnRfZ2V0X3Byb3AgKGJsb2IsICIvbWVtb3J5L3JlZyIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKKwkJKnArKyA9IGNwdV90b19iZTMyIChiZC0+YmlfbWVtc3RhcnQpOworCQkqcCA9IGNwdV90b19iZTMyIChiZC0+YmlfbWVtc2l6ZSk7CisJfQorfQorI2VuZGlmCisKK3ZvaWQgc2JjODY0MWRfcmVzZXRfYm9hcmQgKHZvaWQpCit7CisJcHV0cyAoIlJlc2V0dGluZyBib2FyZC4uLi5cbiIpOworfQorCisvKgorICogZ2V0X2JvYXJkX3N5c19jbGsKKyAqICAgICAgQ2xvY2sgaXMgZml4ZWQgYXQgMUdIeiBvbiB0aGlzIGJvYXJkLiBVc2VkIGZvciBDT05GSUdfU1lTX0NMS19GUkVRCisgKi8KKwordW5zaWduZWQgbG9uZyBnZXRfYm9hcmRfc3lzX2NsayAodWxvbmcgZHVtbXkpCit7CisJaW50IGk7CisJdWxvbmcgdmFsID0gMDsKKworCWkgPSA1OworCWkgJj0gMHgwNzsKKworCXN3aXRjaCAoaSkgeworCWNhc2UgMDoKKwkJdmFsID0gMzMwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdmFsID0gNDAwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gNTAwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdmFsID0gNjYwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdmFsID0gODMwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgNToKKwkJdmFsID0gMTAwMDAwMDAwOworCQlicmVhazsKKwljYXNlIDY6CisJCXZhbCA9IDEzNDAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl2YWwgPSAxNjYwMDAwMDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWw7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9zYmM4NjQxZC91LWJvb3QubGRzIGIvYm9hcmQvc2JjODY0MWQvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDBmMzUwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2JjODY0MWQvdS1ib290LmxkcwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKKworU0VDVElPTlMKK3sKKworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS9tcGM4Nnh4L3N0YXJ0Lm8JKC50ZXh0KQorICAgIGJvYXJkL3NiYzg2NDFkL2luaXQubyAoLmJvb3RwZykKKyAgICBjcHUvbXBjODZ4eC90cmFwcy5vICgudGV4dCkKKyAgICBjcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLm8gKC50ZXh0KQorICAgIGNwdS9tcGM4Nnh4L2NwdV9pbml0Lm8gKC50ZXh0KQorICAgIGNwdS9tcGM4Nnh4L2NwdS5vICgudGV4dCkKKyAgICBjcHUvbXBjODZ4eC9zcGVlZC5vICgudGV4dCkKKyAgICBjb21tb24vZGxtYWxsb2MubyAoLnRleHQpCisgICAgbGliX2dlbmVyaWMvY3JjMzIubyAoLnRleHQpCisgICAgbGliX3BwYy9leHRhYmxlLm8gKC50ZXh0KQorICAgIGxpYl9nZW5lcmljL3psaWIubyAoLnRleHQpCisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgICAqKC5nb3QxKQorICAgfQorICAgIF9ldGV4dCA9IC47CisgICAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgICAucm9kYXRhICAgIDoKKyAgIHsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3NjMy9zYzNuYW5kLmMgYi9ib2FyZC9zYzMvc2MzbmFuZC5jCmluZGV4IDdkYWE4NzcuLjAwOTU2N2IgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NjMy9zYzNuYW5kLmMKKysrIGIvYm9hcmQvc2MzL3NjM25hbmQuYwpAQCAtMjMsNyArMjMsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL3NjNTIwX2NkcC9zYzUyMF9jZHAuYyBiL2JvYXJkL3NjNTIwX2NkcC9zYzUyMF9jZHAuYwppbmRleCBiNmFkZDU5Li5mNmYwZTcyIDEwMDY0NAotLS0gYS9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwLmMKKysrIGIvYm9hcmQvc2M1MjBfY2RwL3NjNTIwX2NkcC5jCkBAIC01MDcsNiArNTA3LDcgQEAKIAogdm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MoaW50IHZhbCkKIHsKKwlpZiAodmFsIDwgLTMyKSB2YWwgPSAtMTsgIC8qIGxldCB0aGluZ3MgY29tcGF0aWJsZSAqLwogCW91dGIodmFsJjB4ZmYsIDB4ODApOwogCW91dGIoKHZhbCYweGZmMDApPj44LCAweDY4MCk7CiB9CmRpZmYgLS1naXQgYS9ib2FyZC9zYzUyMF9zcHVuay9zYzUyMF9zcHVuay5jIGIvYm9hcmQvc2M1MjBfc3B1bmsvc2M1MjBfc3B1bmsuYwppbmRleCBlZDIyNmZkLi5kMTE5YTdkIDEwMDY0NAotLS0gYS9ib2FyZC9zYzUyMF9zcHVuay9zYzUyMF9zcHVuay5jCisrKyBiL2JvYXJkL3NjNTIwX3NwdW5rL3NjNTIwX3NwdW5rLmMKQEAgLTUwNyw2ICs1MDcsNyBAQAogewogCWludCB2ZXJzaW9uID0gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1lTSU5GTyk7CiAKKwlpZiAodmFsIDwgLTMyKSB2YWwgPSAtMTsgIC8qIGxldCB0aGluZ3MgY29tcGF0aWJsZSAqLwogCWlmICh2ZXJzaW9uID09IDApIHsKIAkJLyogUElPMzEtUElPMTYgRGF0YSAqLwogCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPREFUQTMxXzE2LApkaWZmIC0tZ2l0IGEvYm9hcmQvc2llbWVucy9TQ00vdS1ib290LmxkcyBiL2JvYXJkL3NpZW1lbnMvU0NNL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjI5YzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvc2llbWVucy9TQ00vdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2llbWVucy9TTU40Mi9mbGFzaC5jIGIvYm9hcmQvc2llbWVucy9TTU40Mi9mbGFzaC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL2JvYXJkL3NpZW1lbnMvY29tbW9uL2ZwZ2EuYyBiL2JvYXJkL3NpZW1lbnMvY29tbW9uL2ZwZ2EuYwppbmRleCBlOTk0MWNkLi5mMDIyZWQ2IDEwMDY0NAotLS0gYS9ib2FyZC9zaWVtZW5zL2NvbW1vbi9mcGdhLmMKKysrIGIvYm9hcmQvc2llbWVucy9jb21tb24vZnBnYS5jCkBAIC0yMTksNyArMjE5LDcgQEAKICAgICByZXR1cm4gMTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAvKiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICovCiAKQEAgLTI5OSw3ICsyOTksNyBAQAogCSJmcGdhIGxvYWQgW25hbWVdIGFkZHIgLSBsb2FkIEZQR0EgY29uZmlndXJhdGlvbiBkYXRhXG4iCiApOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgogCiAvKiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICovCiAKZGlmZiAtLWdpdCBhL2JvYXJkL3NpZW1lbnMvcGN1X2UvcGN1X2UuYyBiL2JvYXJkL3NpZW1lbnMvcGN1X2UvcGN1X2UuYwppbmRleCAzZjA1ZTRhLi4yMzA5MDY5IDEwMDY0NAotLS0gYS9ib2FyZC9zaWVtZW5zL3BjdV9lL3BjdV9lLmMKKysrIGIvYm9hcmQvc2llbWVucy9wY3VfZS9wY3VfZS5jCkBAIC0zNjgsNyArMzY4LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEJvYXJkIFNwZWNpYWwgQ29tbWFuZHM6IGFjY2VzcyBmdW5jdGlvbnMgZm9yICJQVU1BIiBGUEdBCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogI2RlZmluZQlQVU1BX1JFQURfTU9ERQkwCiAjZGVmaW5lIFBVTUFfTE9BRF9NT0RFCTEKQEAgLTQwOCw3ICs0MDgsNyBAQAogCSAgICAic3RhdHVzIC0gcHJpbnQgUFVNQSBzdGF0dXNcbiIKIAkgICAgInB1bWEgbG9hZCBhZGRyIGxlbiAtIGxvYWQgUFVNQSBjb25maWd1cmF0aW9uIGRhdGFcbiIpOwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgogCiAvKiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICovCiAKZGlmZiAtLWdpdCBhL2JvYXJkL3NpeG5ldC9zaXhuZXQuYyBiL2JvYXJkL3NpeG5ldC9zaXhuZXQuYwppbmRleCBhNGNiNGRjLi43OThlMTg1IDEwMDY0NAotLS0gYS9ib2FyZC9zaXhuZXQvc2l4bmV0LmMKKysrIGIvYm9hcmQvc2l4bmV0L3NpeG5ldC5jCkBAIC0zMyw3ICszMyw3IEBACiAjIGluY2x1ZGUgPHN0YXR1c19sZWQuaD4KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAjZW5kaWYKQEAgLTc1LDkgKzc1LDkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZXJyb3IgIlNYTkk4NTVUIGhhcyBubyBQQ01DSUEgcG9ydCIKLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMzI3LDcgKzMyNyw3IEBACiAJcmV0dXJuICgwKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiB2b2lkIG5hbmRfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdG90bGVuID0gbmFuZF9wcm9iZShDRkdfREZMQVNIX0JBU0UpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvc2w4MjQ1L3UtYm9vdC5sZHMgYi9ib2FyZC9zbDgyNDUvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiOWZmZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9zbDgyNDUvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc29yY2VyeS91LWJvb3QubGRzIGIvYm9hcmQvc29yY2VyeS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODliYzc3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3NvcmNlcnkvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODIyMC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zcGMxOTIwL2hwaS5jIGIvYm9hcmQvc3BjMTkyMC9ocGkuYwppbmRleCAzYzM2Zjc5Li5jZDc3OTliIDEwMDY0NAotLS0gYS9ib2FyZC9zcGMxOTIwL2hwaS5jCisrKyBiL2JvYXJkL3NwYzE5MjAvaHBpLmMKQEAgLTEyMiw3ICsxMjIsOSBAQAogI2RlZmluZSBUSU5ZX0FVVE9JTkNfQkFTRV9BRERSIDB4MAogCiBzdGF0aWMgaW50IGhwaV9hY3RpdmF0ZSh2b2lkKTsKKyNpZiAwCiBzdGF0aWMgdm9pZCBocGlfaW5hY3RpdmF0ZSh2b2lkKTsKKyNlbmRpZgogc3RhdGljIHZvaWQgZHNwX3Jlc2V0KHZvaWQpOwogCiBzdGF0aWMgaW50IGhwaV93cml0ZV9pbmModTMyIGFkZHIsIHUzMiAqZGF0YSwgdTMyIGNvdW50KTsKQEAgLTEzMyw3ICsxMzUsOSBAQAogaW50IGhwaV90ZXN0KHZvaWQpOwogc3RhdGljIGludCBocGlfd3JpdGVfYWRkcl90ZXN0KHUzMiBhZGRyKTsKIHN0YXRpYyBpbnQgaHBpX3JlYWRfd3JpdGVfdGVzdCh1MzIgYWRkciwgdTMyIGRhdGEpOworI2lmZGVmIERPX1RJTllfVEVTVAogc3RhdGljIGludCBocGlfdGlueV9hdXRvaW5jX3Rlc3Qodm9pZCk7CisjZW5kaWYgLyogRE9fVElOWV9URVNUICovCiAjZW5kaWYgLyogQ09ORklHX1NQQzE5MjBfSFBJX1RFU1QgKi8KIAogCkBAIC0xODUsNiArMTg5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIDAKIC8qIHR1cm4gb2ZmIHRoZSBob3N0IHBvcnQgaW50ZXJmYWNlICovCiBzdGF0aWMgdm9pZCBocGlfaW5hY3RpdmF0ZSh2b2lkKQogewpAQCAtMjAwLDYgKzIwNSw3IEBACiAJLyogY3VycmVudGx5IGFsd2F5cyBvbiBUQkQgKi8KIAogfQorI2VuZGlmCiAKIC8qIHJlc2V0IHRoZSBEU1AgKi8KIHN0YXRpYyB2b2lkIGRzcF9yZXNldCh2b2lkKQpAQCAtNTcwLDYgKzU3Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBET19USU5ZX1RFU1QKIHN0YXRpYyBpbnQgaHBpX3RpbnlfYXV0b2luY190ZXN0KHZvaWQpCiB7CiAJaW50IGk7CkBAIC01OTksNSArNjA2LDYgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYgLyogRE9fVElOWV9URVNUICovCiAKICNlbmRpZiAvKiBDT05GSUdfU1BDMTkyMF9IUElfVEVTVCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvc3N2L2FkbnBlc2MxL2FkbnBlc2MxLmMgYi9ib2FyZC9zc3YvYWRucGVzYzEvYWRucGVzYzEuYwppbmRleCAyZjcwNGEwLi4yZWMzYTcyIDEwMDY0NAotLS0gYS9ib2FyZC9zc3YvYWRucGVzYzEvYWRucGVzYzEuYworKysgYi9ib2FyZC9zc3YvYWRucGVzYzEvYWRucGVzYzEuYwpAQCAtNjUsNyArNjUsNyBAQAogLyoKICAqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgU1BJIGNoaXAgc2VsZWN0cyBmb3IgdGhlIFNQSSBjb21tYW5kLgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU1BJKSAmJiBDT05GSUdfTklPU19TUEkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU1BJKSAmJiBDT05GSUdfTklPU19TUEkKIAogI2RlZmluZQlTUElfUlRDX0NTX01BU0sJMHgwMDAwMDAwMQogCkBAIC04OSw3ICs4OSw3IEBACiB9OwogaW50IHNwaV9jaGlwc2VsX2NudCA9IHNpemVvZihzcGlfY2hpcHNlbCkgLyBzaXplb2Yoc3BpX2NoaXBzZWxbMF0pOwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9TUEkgKi8KKyNlbmRpZgogCiAjaWYJZGVmaW5lZChDT05GSUdfUE9TVCkKIC8qCmRpZmYgLS1naXQgYS9ib2FyZC9zc3YvY29tbW9uL2NtZF9zbGVkLmMgYi9ib2FyZC9zc3YvY29tbW9uL2NtZF9zbGVkLmMKaW5kZXggZDYxZmEzZS4uNzEzZWQ2NSAxMDA2NDQKLS0tIGEvYm9hcmQvc3N2L2NvbW1vbi9jbWRfc2xlZC5jCisrKyBiL2JvYXJkL3Nzdi9jb21tb24vY21kX3NsZWQuYwpAQCAtNDYsNyArNDYsNyBAQAogCiBleHRlcm4gbGVkX2Rldl90IGxlZF9kZXZbXTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogaW50IGRvX3NsZWQgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpbnQgbGVkX2lkID0gMDsKQEAgLTE1OCw1ICsxNTgsNSBAQAogVV9CT09UX0NNRCAoc2xlZCwgMywgMCwgZG9fc2xlZCwKIAkgICAgInNsZWQgICAgLSBjaGVjayBhbmQgc2V0IHN0YXR1cyBsZWRcbiIsCiAJICAgICJzbGVkIFtuYW1lIFtzdGF0ZV1dXG4iIF9fTkFNRV9TVFIgIiAgICAtIHN0YXRlOiBvbnxvZmZ8YmxpbmtcbiIpOwotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKICNlbmRpZgkvKiBDT05GSUdfU1RBVFVTX0xFRCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvc3N2L2NvbW1vbi93ZF9waW8uYyBiL2JvYXJkL3Nzdi9jb21tb24vd2RfcGlvLmMKaW5kZXggMzIxNWFjOS4uOTk0NWM1OSAxMDA2NDQKLS0tIGEvYm9hcmQvc3N2L2NvbW1vbi93ZF9waW8uYworKysgYi9ib2FyZC9zc3YvY29tbW9uL3dkX3Bpby5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkJZW5hYmxlX2ludGVycnVwdHMgKCk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIGludCBkb193ZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJbmlvc19waW9fdCAqZW5hX3Bpb3AJID0gKG5pb3NfcGlvX3QqKUNPTkZJR19IV19XREVOQV9CQVNFOwpAQCAtMTU2LDUgKzE1Niw1IEBACiAJIndkIG9mZiAgLSBzd2l0Y2ggd2F0Y2hkb2cgb2ZmXG4iCiAJIndkICAgICAgLSBwcmludCBjdXJyZW50IHN0YXR1c1xuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCiAjZW5kaWYJLyogQ09ORklHX0hXX1dBVENIRE9HICovCmRpZmYgLS1naXQgYS9ib2FyZC9zdHh4dGMvc3R4eHRjLmMgYi9ib2FyZC9zdHh4dGMvc3R4eHRjLmMKaW5kZXggN2NhZjA2YS4uODdhMjAyMiAxMDA2NDQKLS0tIGEvYm9hcmQvc3R4eHRjL3N0eHh0Yy5jCisrKyBiL2JvYXJkL3N0eHh0Yy9zdHh4dGMuYwpAQCAtNTc0LDcgKzU3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiAKZGlmZiAtLWdpdCBhL2JvYXJkL3N2bV9zYzh4eC9zdm1fc2M4eHguYyBiL2JvYXJkL3N2bV9zYzh4eC9zdm1fc2M4eHguYwppbmRleCA5YmI5ZmQwLi5iOTAwZTZiIDEwMDY0NAotLS0gYS9ib2FyZC9zdm1fc2M4eHgvc3ZtX3NjOHh4LmMKKysrIGIvYm9hcmQvc3ZtX3NjOHh4L3N2bV9zYzh4eC5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAlyZXR1cm4gKHNpemVfYjAgKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC90b3RhbDUyMDAvdG90YWw1MjAwLmMgYi9ib2FyZC90b3RhbDUyMDAvdG90YWw1MjAwLmMKaW5kZXggMWEzNTE4Ny4uZjMyZGFkZiAxMDA2NDQKLS0tIGEvYm9hcmQvdG90YWw1MjAwL3RvdGFsNTIwMC5jCisrKyBiL2JvYXJkL3RvdGFsNTIwMC90b3RhbDUyMDAuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogLyogSVJEQV8xIGFrYSBQU0M2XzMgKHBpbiBDMTMpICovCiAjZGVmaW5lIEdQSU9fSVJEQV8xCTB4MjAwMDAwMDBVTApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX0dQSU9fREFUQV9PIHw9ICBHUElPX0lSREFfMTsKIAl9CiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19WSURFT19TRUQxMzgwNgogI2luY2x1ZGUgPHNlZDEzODA2Lmg+CmRpZmYgLS1naXQgYS9ib2FyZC90b3RhbDUyMDAvdS1ib290LmxkcyBiL2JvYXJkL3RvdGFsNTIwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2MyOTY4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3RvdGFsNTIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTUyMDAvY21kX3N0azUyeHguYyBiL2JvYXJkL3RxbTUyMDAvY21kX3N0azUyeHguYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDdhZjY5ZjIuLmI3NDY2NzkKLS0tIGEvYm9hcmQvdHFtNTIwMC9jbWRfc3RrNTJ4eC5jCisrKyBiL2JvYXJkL3RxbTUyMDAvY21kX3N0azUyeHguYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAjaWYgZGVmaW5lZChDT05GSUdfU1RLNTJYWCkgfHwgZGVmaW5lZChDT05GSUdfRk8zMDApCiAjZGVmaW5lIERFRkFVTFRfVk9MCTQ1CkBAIC0xMjQxLDQgKzEyNDEsNCBAQAogCSIgICAgIC0gbG9vcGJhY2sgcGx1ZyhzKSBmb3IgWDIxL1gyMiByZXF1aXJlZFxuIgogKTsKICNlbmRpZgotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTUyMDAvY21kX3RiNTIwMC5jIGIvYm9hcmQvdHFtNTIwMC9jbWRfdGI1MjAwLmMKaW5kZXggODc4NGIxZi4uMjE0ZGNhNiAxMDA2NDQKLS0tIGEvYm9hcmQvdHFtNTIwMC9jbWRfdGI1MjAwLmMKKysrIGIvYm9hcmQvdHFtNTIwMC9jbWRfdGI1MjAwLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKICNpZiBkZWZpbmVkIChDT05GSUdfVEI1MjAwKQogCiAjZGVmaW5lIFNNNTAxX1BBTkVMX0RJU1BMQVlfQ09OVFJPTAkweDAwMDgwMDAwVUwKQEAgLTEwMSw0ICsxMDEsNCBAQAogCSk7CiAKICNlbmRpZiAvKiBDT05GSUdfU1RLNTJYWCAqLwotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTUyMDAvdHFtNTIwMC5jIGIvYm9hcmQvdHFtNTIwMC90cW01MjAwLmMKaW5kZXggY2Y5NzYwMy4uNTFmNGFlYiAxMDA2NDQKLS0tIGEvYm9hcmQvdHFtNTIwMC90cW01MjAwLmMKKysrIGIvYm9hcmQvdHFtNTIwMC90cW01MjAwLmMKQEAgLTMzNiw3ICszMzYsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKICNpZiBkZWZpbmVkIChDT05GSUdfTUlOSUZBUCkKICNkZWZpbmUgU001MDFfUE9XRVJfTU9ERTBfR0FURQkJMHgwMDAwMDA0MFVMCkBAIC0zODksNyArMzg5LDcgQEAKIAl9CiAjZW5kaWYKIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BPU1QKIC8qCmRpZmYgLS1naXQgYS9ib2FyZC90cW01MjAwL3UtYm9vdC5sZHMgYi9ib2FyZC90cW01MjAwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzI5NjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvdHFtNTIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTgyNjAvdS1ib290LmxkcyBiL2JvYXJkL3RxbTgyNjAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmMjljNi4uMDAwMDAwMAotLS0gYS9ib2FyZC90cW04MjYwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTgyNzIvdHFtODI3Mi5jIGIvYm9hcmQvdHFtODI3Mi90cW04MjcyLmMKaW5kZXggNzBkMWJiOC4uN2JkNjQwMSAxMDA2NDQKLS0tIGEvYm9hcmQvdHFtODI3Mi90cW04MjcyLmMKKysrIGIvYm9hcmQvdHFtODI3Mi90cW04MjcyLmMKQEAgLTEwNjUsNyArMTA2NSw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNpbmNsdWRlIDxuYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgpAQCAtMTIxMiw3ICsxMjEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfTkFORCAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJCiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZTsKZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTgyNzIvdS1ib290LmxkcyBiL2JvYXJkL3RxbTgyNzIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmMjljNi4uMDAwMDAwMAotLS0gYS9ib2FyZC90cW04MjcyL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTgzNHgvdS1ib290LmxkcyBiL2JvYXJkL3RxbTgzNHgvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwY2ZhNi4uMDAwMDAwMAotLS0gYS9ib2FyZC90cW04MzR4L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvTWFrZWZpbGUgYi9ib2FyZC90cmFiL01ha2VmaWxlCmluZGV4IDg2OGNhNDIuLmZiZTFjMzYgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RyYWIvTWFrZWZpbGUKKysrIGIvYm9hcmQvdHJhYi9NYWtlZmlsZQpAQCAtNTAsNyArNTAsNiBAQAogJChvYmopdHJhYl9ma3Quc3JlYzoJJChPQkpTX0ZLVCkgJChMSUIpCiAJJChMRCkgLWcgLVR0ZXh0ICQoTE9BRF9BRERSKSAtbyAkKDw6Lm89KSAtZSB0cmFiX2ZrdCAkXiAkKExJQikgXAogCQktTCQob2JqKS4uLy4uL2V4YW1wbGVzIC1sc3R1YnMgXAotCQktTCQob2JqKS4uLy4uL2xpYl9nZW5lcmljIC1sZ2VuZXJpYyBcCiAJCS1MJChnY2NsaWJkaXIpIC1sZ2NjCiAJJChPQkpDT1BZKSAtTyBzcmVjICQoPDoubz0pICRACiAKZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvYXV0b191cGRhdGUuYyBiL2JvYXJkL3RyYWIvYXV0b191cGRhdGUuYwppbmRleCBmNDA3NGFlLi41NGQzNjQ1IDEwMDY0NAotLS0gYS9ib2FyZC90cmFiL2F1dG9fdXBkYXRlLmMKKysrIGIvYm9hcmQvdHJhYi9hdXRvX3VwZGF0ZS5jCkBAIC0zNCw3ICszNCw3IEBACiAKICNpZmRlZiBDT05GSUdfQVVUT19VUERBVEUKIAotI2lmbmRlZiBDT05GSUdfVVNCX09IQ0kKKyNpZm5kZWYgQ09ORklHX1VTQl9PSENJX05FVwogI2Vycm9yICJtdXN0IGRlZmluZSBDT05GSUdfVVNCX09IQ0kiCiAjZW5kaWYKIApAQCAtNDYsOCArNDYsOCBAQAogI2Vycm9yICJtdXN0IGRlZmluZSBDRkdfSFVTSF9QQVJTRVIiCiAjZW5kaWYKIAotI2lmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpCi0jZXJyb3IgIm11c3QgZGVmaW5lIENGR19DTURfRkFUIgorI2lmICFkZWZpbmVkKENPTkZJR19DTURfRkFUKQorI2Vycm9yICJtdXN0IGRlZmluZSBDT05GSUdfQ01EX0ZBVCIKICNlbmRpZgogCiAvKgpAQCAtNDUwLDcgKzQ1MCw3IEBACiB7CiAJYmxvY2tfZGV2X2Rlc2NfdCAqc3Rvcl9kZXY7CiAJbG9uZyBzejsKLQlpbnQgaSwgcmVzLCBiaXRtYXBfZmlyc3QsIGNudCwgb2xkX2N0cmxjLCBnb3RfY3RybGM7CisJaW50IGksIHJlcyA9IDAsIGJpdG1hcF9maXJzdCwgY250LCBvbGRfY3RybGMsIGdvdF9jdHJsYzsKIAljaGFyICplbnY7CiAJbG9uZyBzdGFydCwgZW5kOwogCkBAIC00NzcsMTggKzQ3NywyMSBAQAogCWF1X3VzYl9zdG9yX2N1cnJfZGV2ID0gdXNiX3N0b3Jfc2NhbigwKTsKIAlpZiAoYXVfdXNiX3N0b3JfY3Vycl9kZXYgPT0gLTEpIHsKIAkJZGVidWcgKCJObyBkZXZpY2UgZm91bmQuIE5vdCBpbml0aWFsaXplZD9cbiIpOwotCQlyZXR1cm4gLTE7CisJCXJlcyA9IC0xOworCQlnb3RvIHhpdDsKIAl9CiAJLyogY2hlY2sgd2hldGhlciBpdCBoYXMgYSBwYXJ0aXRpb24gdGFibGUgKi8KIAlzdG9yX2RldiA9IGdldF9kZXYoInVzYiIsIDApOwogCWlmIChzdG9yX2RldiA9PSBOVUxMKSB7CiAJCWRlYnVnICgidWtub3duIGRldmljZSB0eXBlXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXMgPSAtMTsKKwkJZ290byB4aXQ7CiAJfQogCWlmIChmYXRfcmVnaXN0ZXJfZGV2aWNlKHN0b3JfZGV2LCAxKSAhPSAwKSB7CiAJCWRlYnVnICgiVW5hYmxlIHRvIHVzZSBVU0IgJWQ6JWQgZm9yIGZhdGxzXG4iLAogCQkJYXVfdXNiX3N0b3JfY3Vycl9kZXYsIDEpOwotCQlyZXR1cm4gLTE7CisJCXJlcyA9IC0xOworCQlnb3RvIHhpdDsKIAl9CiAJaWYgKGZpbGVfZmF0X2RldGVjdGZzKCkgIT0gMCkgewogCQlkZWJ1ZyAoImZpbGVfZmF0X2RldGVjdGZzIGZhaWxlZFxuIik7CkBAIC02NDgsOSArNjUxLDEwIEBACiAJCQkvKiBlbmFibGUgdGhlIHBvd2VyIHN3aXRjaCAqLwogCQkJKkNQTERfVkZEX0JLICY9IH5QT1dFUl9PRkY7CiAJfQotCXVzYl9zdG9wKCk7CiAJLyogcmVzdG9yZSB0aGUgb2xkIHN0YXRlICovCiAJZGlzYWJsZV9jdHJsYyhvbGRfY3RybGMpOwotCXJldHVybiAwOworeGl0OgorCXVzYl9zdG9wKCk7CisJcmV0dXJuIHJlczsKIH0KICNlbmRpZiAvKiBDT05GSUdfQVVUT19VUERBVEUgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvY21kX3RyYWIuYyBiL2JvYXJkL3RyYWIvY21kX3RyYWIuYwppbmRleCBiODJjOGVkLi5kYWE2YWVlIDEwMDY0NAotLS0gYS9ib2FyZC90cmFiL2NtZF90cmFiLmMKKysrIGIvYm9hcmQvdHJhYi9jbWRfdHJhYi5jCkBAIC0zMiw3ICszMiw3IEBACiAgKiBUUkFCIGJvYXJkIHNwZWNpZmljIGNvbW1hbmRzLiBFc3BlY2lhbGx5IGNvbW1hbmRzIGZvciBidXJuLWluIGFuZCBmdW5jdGlvbgogICogdGVzdC4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAvKiBsaW1pdHMgZm9yIHZhbGlkIHJhbmdlIG9mIFZDQzVWIGluIG1WICAqLwogI2RlZmluZSBWQ0M1Vl9NSU4gICAgICAgNDUwMApAQCAtODQ2LDcgKzg0Niw3IEBACiB7CiAJaW50IGNvbnRhY3RfdGVtcDsKIAlpbnQgZGVsYXkgPSAwOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAJc3RydWN0IHJ0Y190aW1lIHRtOwogI2VuZGlmCiAKQEAgLTg2Miw3ICs4NjIsNyBAQAogCXNwaV9pbml0ICgpOwogCXdoaWxlICgxKSB7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCQlydGNfZ2V0ICgmdG0pOwogCQlwcmludGYgKCIlNGQtJTAyZC0lMDJkICUyZDolMDJkOiUwMmQgLSAiLAogCQkJdG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LApAQCAtODkzLDQgKzg5Myw0IEBACiAJIiAgICAgIEZvciBlYWNoIG1lYXN1cm1lbnQgYSB0aW1lc3RhbXAgaXMgcHJpbnRldGVkXG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvdHJhYi90cmFiX2ZrdC5jIGIvYm9hcmQvdHJhYi90cmFiX2ZrdC5jCmluZGV4IDcxYmU2ZTAuLjcyNzNlZjkgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RyYWIvdHJhYl9ma3QuYworKysgYi9ib2FyZC90cmFiL3RyYWJfZmt0LmMKQEAgLTE0OCwxNCArMTQ4LDE0IEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgdXBkY3JjKHVuc2lnbmVkIHNob3J0IGljcmMsIHVuc2lnbmVkIGNoYXIgKmljcCwKIAkJCSAgICAgdW5zaWduZWQgaW50IGljbnQpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiBzdGF0aWMgaW50IHRyYWJfZWVwcm9tX3JlYWQgKGNoYXIgKiphcmd2KTsKIHN0YXRpYyBpbnQgdHJhYl9lZXByb21fd3JpdGUgKGNoYXIgKiphcmd2KTsKIGludCBpMmNfd3JpdGVfbXVsdGlwbGUgKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsCiAJCQlpbnQgbGVuKTsKIGludCBpMmNfcmVhZF9tdWx0aXBsZSAoIHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsCiAJCQlpbnQgbGVuKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCiAKIC8qCiAgKiBUUkFCIGJvYXJkIHNwZWNpZmljIGNvbW1hbmRzLiBFc3BlY2lhbGx5IGNvbW1hbmRzIGZvciBidXJuLWluIGFuZCBmdW5jdGlvbgpAQCAtOTU5LDcgKzk1OSw3IEBACiAKIHN0YXRpYyBpbnQgdG91Y2hfd3JpdGVfY2xpYnJhdGlvbl92YWx1ZXMgKGludCBjYWxpYl9wb2ludCwgaW50IHgsIGludCB5KQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogCWludCB4X3ZlcmlmeSA9IDA7CiAJaW50IHlfdmVyaWZ5ID0gMDsKIApAQCAtMTAxOSwxMCArMTAxOSwxMCBAQAogCX0KIAlyZXR1cm4gMTsKICNlbHNlCi0JcHJpbnRmICgiTm8gSTJDIHN1cHBvcnQgZW5hYmxlZCAoQ0ZHX0NNRF9JMkMpLCBjb3VsZCBub3Qgd3JpdGUgIgorCXByaW50ZiAoIk5vIEkyQyBzdXBwb3J0IGVuYWJsZWQgKENPTkZJR19DTURfSTJDKSwgY291bGQgbm90IHdyaXRlICIKIAkJInRvIEVFUFJPTVxuIik7CiAJcmV0dXJuICgxKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCiB9CiAKIApAQCAtMTEwNSw3ICsxMTA1LDcgQEAKIAogaW50IGRvX3NlcmlhbF9udW1iZXIgKGNoYXIgKiphcmd2KQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogCXVuc2lnbmVkIGludCBzZXJpYWxfbnVtYmVyOwogCiAJaWYgKHN0cmNtcCAoYXJndlsyXSwgInJlYWQiKSA9PSAwKSB7CkBAIC0xMTMwLDE2ICsxMTMwLDE2IEBACiAJcHJpbnRmICgiJXM6IHVua25vd24gY29tbWFuZCAlc1xuIiwgX19GVU5DVElPTl9fLCBhcmd2WzJdKTsKIAlyZXR1cm4gKDEpOyAgICAgICAgICAgICAvKiB1bmtub3duIGNvbW1hbmQsIHJldHVybiBlcnJvciAqLwogI2Vsc2UKLQlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDRkdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCisJcHJpbnRmICgiTm8gSTJDIHN1cHBvcnQgZW5hYmxlZCAoQ09ORklHX0NNRF9JMkMpLCBjb3VsZCBub3Qgd3JpdGUgIgogCQkidG8gRUVQUk9NXG4iKTsKIAlyZXR1cm4gKDEpOwotI2VuZGlmIC8qIENGR19DTURfSTJDICovCisjZW5kaWYKIH0KIAogCiBpbnQgZG9fY3JjMTYgKHZvaWQpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAJaW50IGNyYzsKIAl1bnNpZ25lZCBjaGFyIGJ1ZltFRVBST01fTUFYX0NSQ19CVUZdOwogCkBAIC0xMTYwLDEwICsxMTYwLDEwIEBACiAJfQogCXJldHVybiAoMCk7CiAjZWxzZQotCXByaW50ZiAoIk5vIEkyQyBzdXBwb3J0IGVuYWJsZWQgKENGR19DTURfSTJDKSwgY291bGQgbm90IHdyaXRlICIKKwlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDT05GSUdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCiAJCSJ0byBFRVBST01cbiIpOwogCXJldHVybiAoMSk7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogfQogCiAKQEAgLTEyNjAsNyArMTI2MCw3IEBACiAKIGludCBkb19lZXByb20gKGNoYXIgKiphcmd2KQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogCWlmIChzdHJjbXAgKGFyZ3ZbMl0sICJyZWFkIikgPT0gMCkgewogCQlyZXR1cm4gKHRyYWJfZWVwcm9tX3JlYWQgKGFyZ3YpKTsKIAl9CkBAIC0xMjcyLDEzICsxMjcyLDEzIEBACiAJcHJpbnRmICgiJXM6IGludmFsaWQgcGFyYW1ldGVyICVzXG4iLCBfX0ZVTkNUSU9OX18sIGFyZ3ZbMl0pOwogCXJldHVybiAoMSk7CiAjZWxzZQotCXByaW50ZiAoIk5vIEkyQyBzdXBwb3J0IGVuYWJsZWQgKENGR19DTURfSTJDKSwgY291bGQgbm90IHdyaXRlICIKKwlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDT05GSUdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCiAJCSJ0byBFRVBST01cbiIpOwogCXJldHVybiAoMSk7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiBzdGF0aWMgaW50IHRyYWJfZWVwcm9tX3JlYWQgKGNoYXIgKiphcmd2KQogewogCWludCBpOwpAQCAtMTQwOCw0ICsxNDA4LDQgQEAKIAl9CiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC91YzEwMC9wY21jaWEuYyBiL2JvYXJkL3VjMTAwL3BjbWNpYS5jCmluZGV4IDZlNGI2ZDYuLjQwN2JkYjcgMTAwNjQ0Ci0tLSBhL2JvYXJkL3VjMTAwL3BjbWNpYS5jCisrKyBiL2JvYXJkL3VjMTAwL3BjbWNpYS5jCkBAIC00LDExICs0LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC0xMjMsNyArMTIzLDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CkBAIC0xNDksNyArMTQ5LDcgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAKIGludCBwY21jaWFfdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCmRpZmYgLS1naXQgYS9ib2FyZC91YzEwMS9jb25maWcubWsgYi9ib2FyZC91YzEwMS9jb25maWcubWsKaW5kZXggNTFlOGU4NGMuLjRmZTE4MzEgMTAwNjQ0Ci0tLSBhL2JvYXJkL3VjMTAxL2NvbmZpZy5taworKysgYi9ib2FyZC91YzEwMS9jb25maWcubWsKQEAgLTM5LDMgKzM5LDQgQEAKIGVuZGlmCiAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1EVEVYVF9CQVNFPSQoVEVYVF9CQVNFKSAtSSQoVE9QRElSKS9ib2FyZAorTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9jcHUvbXBjNXh4eC91LWJvb3QtY3VzdG9tbGF5b3V0LmxkcwpkaWZmIC0tZ2l0IGEvYm9hcmQvdWMxMDEvdS1ib290LmxkcyBiL2JvYXJkL3VjMTAxL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2ExNGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvdWMxMDEvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICAvKiBXQVJOSU5HIC0gdGhlIGZvbGxvd2luZyBpcyBoYW5kLW9wdGltaXplZCB0byBmaXQgd2l0aGluICAqLwotICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEgICAgWFhYIEZJWE1FIFhYWCAgICovCi0KLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vICAgICAgICAgICgudGV4dCkKLSAgICBjcHUvbXBjNXh4eC90cmFwcy5vICAgICAgICAgICgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9wcGMvY2FjaGUubyAgICAgICAgICAgICAoLnRleHQpCi0gICAgbGliX3BwYy90aW1lLm8gICAgICAgICAgICAgICgudGV4dCkKLQotICAgIC4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gICAgICAgICgucHBjZW52KQotCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvdXR4ODI0NS91LWJvb3QubGRzIGIvYm9hcmQvdXR4ODI0NS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWYzMDE4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3V0eDgyNDUvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMgotICogR3JlZ29yeSBFLiBBbGxlbiwgZ2FsbGVuQGFybHV0LnV0ZXhhcy5lZHUKLSAqIE1hdHRoZXcgRS4gS2FyZ2VyLCBrYXJnZXJAYXJsdXQudXRleGFzLmVkdQotICogQXBwbGllZCBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIFRoZSBVbml2ZXJzaXR5IG9mIFRleGFzIGF0IEF1c3RpbgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3ZzcHJpbnRmLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3YzOGIvdS1ib290LmxkcyBiL2JvYXJkL3YzOGIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkZWE2Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC92MzhiL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA2Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvdjM4Yi92MzhiLmMgYi9ib2FyZC92MzhiL3YzOGIuYwppbmRleCBhY2U0YWEyLi5lYzAzMmVlIDEwMDY0NAotLS0gYS9ib2FyZC92MzhiL3YzOGIuYworKysgYi9ib2FyZC92MzhiL3YzOGIuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiB9CiAKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIHZvaWQgaW5pdF9pZGVfcmVzZXQodm9pZCkKIHsKIAlkZWJ1ZygiaW5pdF9pZGVfcmVzZXRcbiIpOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJfSBlbHNlCiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9ICBHUElPX1BTQzFfNDsKIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAKICNpZmRlZiBDT05GSUdfSFdfV0FUQ0hET0cKZGlmZiAtLWdpdCBhL2JvYXJkL3c3by9jbWRfdnBkLmMgYi9ib2FyZC93N28vY21kX3ZwZC5jCmluZGV4IDQ0OTA4OWUuLmZkZDZjZWIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3c3by9jbWRfdnBkLmMKKysrIGIvYm9hcmQvdzdvL2NtZF92cGQuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAjaW5jbHVkZSAidnBkLmgiCiAKQEAgLTYzLDQgKzYzLDQgQEAKIAkgICIgICAgICAgIC0gUmVhZCBWUEQgRGF0YSBmcm9tIGRlZmF1bHQgYWRkcmVzcywgb3IgZGV2aWNlIGFkZHJlc3MgJ2Rldl9hZGRyJy5cbiIKICk7CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL3hpbGlueC9tbDMwMC9zZXJpYWwuYyBiL2JvYXJkL3hpbGlueC9tbDMwMC9zZXJpYWwuYwppbmRleCA5YjAzZjg5Li5iYTQxZjg1IDEwMDY0NAotLS0gYS9ib2FyZC94aWxpbngvbWwzMDAvc2VyaWFsLmMKKysrIGIvYm9hcmQveGlsaW54L21sMzAwL3NlcmlhbC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZAoga2dkYl9zZXJpYWxfaW5pdCh2b2lkKQogewpAQCAtMTUxLDQgKzE1MSw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmCQkJCS8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC94aWxpbngvbWw0MDEveHBhcmFtZXRlcnMuaCBiL2JvYXJkL3hpbGlueC9tbDQwMS94cGFyYW1ldGVycy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL2JvYXJkL3pldXMvTWFrZWZpbGUgYi9ib2FyZC96ZXVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZDRlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC96ZXVzL01ha2VmaWxlCkBAIC0wLDAgKzEsNTEgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA3CisjIFN0ZWZhbiBSb2VzZSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgc3JAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJPSAkKEJPQVJEKS5vIHVwZGF0ZS5vCitTT0JKUyAgID0KKworU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKFNPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC96ZXVzL2NvbmZpZy5tayBiL2JvYXJkL3pldXMvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZGY1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC96ZXVzL2NvbmZpZy5tawpAQCAtMCwwICsxLDI0IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitURVhUX0JBU0UgPSAweEZGRkMwMDAwCmRpZmYgLS1naXQgYS9ib2FyZC96ZXVzL3UtYm9vdC5sZHMgYi9ib2FyZC96ZXVzL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiODNlYgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3pldXMvdS1ib290LmxkcwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC5yZXNldHZlYyAweEZGRkZGRkZDIDoKKyAgeworICAgICooLnJlc2V0dmVjKQorICB9ID0gMHhmZmZmCisKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1L3BwYzR4eC9zdGFydC5vCSgudGV4dCkKKworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgICAgKiguZ290MSkKKyAgfQorICBfZXRleHQgPSAuOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvemV1cy91cGRhdGUuYyBiL2JvYXJkL3pldXMvdXBkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2NTE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3pldXMvdXBkYXRlLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIFN0ZWZhbiBSb2VzZSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgc3JAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorI2luY2x1ZGUgPGkyYy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfWkVVUykKKwordTggYnVmX3pldXNfY2VbXSA9IHsKKy8qMDAgICAgMDEgICAgMDIgICAgMDMgICAgMDQgICAgMDUgICAgMDYgICAgMDcgKi8KKyAgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMDggICAgMDkgICAgMGEgICAgMGIgICAgMGMgICAgMGQgICAgMGUgICAgMGYgKi8KKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMTAgICAgMTEgICAgMTIgICAgMTMgICAgMTQgICAgMTUgICAgMTYgICAgMTcgKi8KKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMTggICAgMTkgICAgMWEgICAgMWIgICAgMWMgICAgMWQgICAgMWUgICAgMWYgKi8KKyAgMHgwMCwgMHhjMCwgMHg1MCwgMHgxMiwgMHg3MiwgMHgzZSwgMHgwMCwgMHgwMCB9OworCit1OCBidWZfemV1c19wZVtdID0geworCisvKiBDUFVfQ0xPQ0tfRElWIDEgICAgPSAwMAorICAgQ1BVX1BMQl9GUkVRX0RJViAzID0gMTAKKyAgIE9QQl9QTEJfRlJFUV9ESVYgMiA9IDAxCisgICBFQkNfUExCX0ZSRVFfRElWIDIgPSAwMAorICAgTUFMX1BMQl9GUkVRX0RJViAxID0gMDAKKyAgIFBDSV9QTEJfRlJRX0RJViAzICA9IDEwCisgICBQTExfUExMT1VUQSAgICAgICAgPSBJUyBTRVQKKyAgIFBMTF9PUEVSQVRJTkcgICAgICA9IElTIE5PVCBTRVQKKyAgIFBMTF9GREJfTVVMIDEwICAgICA9IDEwMTAKKyAgIFBMTF9GV0RfRElWX0EgMyAgICA9IDEwMQorICAgUExMX0ZXRF9ESVZfQiAzICAgID0gMTAxCisgICBUVU5FICAgICAgICAgICAgICAgPSAweDJiZSAqLworLyowMCAgICAwMSAgICAwMiAgICAwMyAgICAwNCAgICAwNSAgICAwNiAgICAwNyAqLworICAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyowOCAgICAwOSAgICAwYSAgICAwYiAgICAwYyAgICAwZCAgICAwZSAgICAwZiAqLworICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyoxMCAgICAxMSAgICAxMiAgICAxMyAgICAxNCAgICAxNSAgICAxNiAgICAxNyAqLworICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyoxOCAgICAxOSAgICAxYSAgICAxYiAgICAxYyAgICAxZCAgICAxZSAgICAxZiAqLworICAweDAwLCAweDYwLCAweDY4LCAweDJkLCAweDQyLCAweGJlLCAweDAwLCAweDAwIH07CisKK3N0YXRpYyBpbnQgdXBkYXRlX2Jvb3RfZWVwcm9tKHZvaWQpCit7CisJdTMyIGxlbiA9IDB4MjA7CisJdTggY2hpcCA9IENGR19JMkNfRUVQUk9NX0FERFI7CisJdTggKnBidWY7CisJdTggYmFzZTsKKwlpbnQgaTsKKworCWlmIChpbl9iZTMyKCh2b2lkICopR1BJTzBfSVIpICYgR1BJT19WQUwoQ0ZHX0dQSU9fWkVVU19QRSkpIHsKKwkJcGJ1ZiA9IGJ1Zl96ZXVzX3BlOworCQliYXNlID0gMHg0MDsKKwl9IGVsc2UgeworCQlwYnVmID0gYnVmX3pldXNfY2U7CisJCWJhc2UgPSAweDAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgYmFzZSsrKSB7CisJCWlmIChpMmNfd3JpdGUoY2hpcCwgYmFzZSwgMSwgJnBidWZbaV0sIDEpICE9IDApIHsKKwkJCXByaW50ZigiaTJjX3dyaXRlIGZhaWxcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJdWRlbGF5KDExMDAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX3VwZGF0ZV9ib290X2VlcHJvbShjbWRfdGJsX3QqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKwlyZXR1cm4gdXBkYXRlX2Jvb3RfZWVwcm9tKCk7Cit9CisKK1VfQk9PVF9DTUQgKAorCXVwZGF0ZV9ib290X2VlcHJvbSwgMSwgMSwgZG9fdXBkYXRlX2Jvb3RfZWVwcm9tLAorCSJ1cGRhdGVfYm9vdF9lZXByb20gIC0gdXBkYXRlIGJvb3QgZWVwcm9tIGNvbnRlbnRcbiIsCisJTlVMTAorKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC96ZXVzL3pldXMuYyBiL2JvYXJkL3pldXMvemV1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjg1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC96ZXVzL3pldXMuYwpAQCAtMCwwICsxLDUxMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8ZW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxsb2didWZmLmg+CisjaW5jbHVkZSA8cG9zdC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjZGVmaW5lIFJFQk9PVF9NQUdJQwkweDA3MDgxOTY3CisjZGVmaW5lIFJFQk9PVF9OT1AJMHgwMDAwMDAwMAorI2RlZmluZSBSRUJPT1RfRE9fUE9TVAkweDAwMDAwMDAxCisKK2V4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsgLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMJKi8KK2V4dGVybiBlbnZfdCAqZW52X3B0cjsKK2V4dGVybiB1Y2hhciBkZWZhdWx0X2Vudmlyb25tZW50W107CisKK3Vsb25nIGZsYXNoX2dldF9zaXplKHVsb25nIGJhc2UsIGludCBiYW5rbnVtKTsKK3ZvaWQgZW52X2NyY191cGRhdGUodm9pZCk7CitpbnQgZG9fcmVzZXQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKworc3RhdGljIHUzMiBzdGFydF90aW1lOworCitpbnQgYm9hcmRfZWFybHlfaW5pdF9mKHZvaWQpCit7CisJbXRkY3IodWljc3IsIDB4RkZGRkZGRkYpOwkvKiBjbGVhciBhbGwgaW50cyAqLworCW10ZGNyKHVpY2VyLCAweDAwMDAwMDAwKTsJLyogZGlzYWJsZSBhbGwgaW50cyAqLworCW10ZGNyKHVpY2NyLCAweDAwMDAwMDAwKTsKKwltdGRjcih1aWNwciwgMHhGRkZGN0YwMCk7CS8qIHNldCBpbnQgcG9sYXJpdGllcyAqLworCW10ZGNyKHVpY3RyLCAweDAwMDAwMDAwKTsJLyogc2V0IGludCB0cmlnZ2VyIGxldmVscyAqLworCW10ZGNyKHVpY3NyLCAweEZGRkZGRkZGKTsJLyogY2xlYXIgYWxsIGludHMgKi8KKwltdGRjcih1aWN2Y3IsIDB4MDAwMDAwMDEpOwkvKiBzZXQgdmVjdCBiYXNlPTAsSU5UMCBoaWdoZXN0IHByaW9yaXR5ICovCisKKwkvKgorCSAqIENvbmZpZ3VyZSBDUEMwX1BDSSB0byBlbmFibGUgUGVyV0UgYXMgb3V0cHV0CisJICovCisJbXRkY3IoY3BjMF9wY2ksIENQQzBfUENJX1NQRSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1pc2NfaW5pdF9yKHZvaWQpCit7CisJdTMyIHBiY3I7CisJaW50IHNpemVfdmFsID0gMDsKKwl1MzIgcG9zdF9tYWdpYzsKKwl1MzIgcG9zdF92YWw7CisKKwlwb3N0X21hZ2ljID0gaW5fYmUzMigodm9pZCAqKUNGR19QT1NUX01BR0lDKTsKKwlwb3N0X3ZhbCA9IGluX2JlMzIoKHZvaWQgKilDRkdfUE9TVF9WQUwpOworCWlmICgocG9zdF9tYWdpYyA9PSBSRUJPT1RfTUFHSUMpICYmIChwb3N0X3ZhbCA9PSBSRUJPT1RfRE9fUE9TVCkpIHsKKwkJLyoKKwkJICogU2V0IHNwZWNpYWwgYm9vdGxpbmUgYm9vdHBhcmFtZXRlciB0byBwYXNzIHRoaXMgUE9TVCBib290CisJCSAqIG1vZGUgdG8gTGludXggdG8gcmVzZXQgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkCisJCSAqLworCQlzZXRlbnYoImFkZG1pc2MiLCAic2V0ZW52IGJvb3RhcmdzIFxcJHtib290YXJnc30gZmFjdG9yeV9yZXNldD15ZXMiKTsKKworCQkvKgorCQkgKiBOb3JtYWxseSBkb24ndCBydW4gUE9TVCB0ZXN0cywgb25seSB3aGVuIGVuYWJsZWQKKwkJICogdmlhIHRoZSBzdy1yZXNldCBidXR0b24uIFNvIGRpc2FibGUgZnVydGhlciB0ZXN0cworCQkgKiB1cG9uIG5leHQgYm9vdHVwIGhlcmUuCisJCSAqLworCQlvdXRfYmUzMigodm9pZCAqKUNGR19QT1NUX1ZBTCwgUkVCT09UX05PUCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT25seSBydW4gUE9TVCB3aGVuIGluaXRpYXRlZCB2aWEgdGhlIHN3LXJlc2V0IGJ1dHRvbiBtZWNoYW5pc20KKwkJICovCisJCXBvc3Rfd29yZF9zdG9yZSgwKTsKKwl9CisKKwkvKgorCSAqIEdldCBjdXJyZW50IHRpbWUKKwkgKi8KKwlzdGFydF90aW1lID0gZ2V0X3RpbWVyKDApOworCisJLyoKKwkgKiBGTEFTSCBzdHVmZi4uLgorCSAqLworCisJLyogUmUtZG8gc2l6aW5nIHRvIGdldCBmdWxsIGNvcnJlY3QgaW5mbyAqLworCisJLyogYWRqdXN0IGZsYXNoIHN0YXJ0IGFuZCBvZmZzZXQgKi8KKwltZmViYyhwYjBjciwgcGJjcik7CisJc3dpdGNoIChnZC0+YmQtPmJpX2ZsYXNoc2l6ZSkgeworCWNhc2UgMSA8PCAyMDoKKwkJc2l6ZV92YWwgPSAwOworCQlicmVhazsKKwljYXNlIDIgPDwgMjA6CisJCXNpemVfdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0IDw8IDIwOgorCQlzaXplX3ZhbCA9IDI7CisJCWJyZWFrOworCWNhc2UgOCA8PCAyMDoKKwkJc2l6ZV92YWwgPSAzOworCQlicmVhazsKKwljYXNlIDE2IDw8IDIwOgorCQlzaXplX3ZhbCA9IDQ7CisJCWJyZWFrOworCWNhc2UgMzIgPDwgMjA6CisJCXNpemVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSA2NCA8PCAyMDoKKwkJc2l6ZV92YWwgPSA2OworCQlicmVhazsKKwljYXNlIDEyOCA8PCAyMDoKKwkJc2l6ZV92YWwgPSA3OworCQlicmVhazsKKwl9CisJcGJjciA9IChwYmNyICYgMHgwMDAxZmZmZikgfCBnZC0+YmQtPmJpX2ZsYXNoc3RhcnQgfCAoc2l6ZV92YWwgPDwgMTcpOworCW10ZWJjKHBiMGNyLCBwYmNyKTsKKworCS8qCisJICogUmUtY2hlY2sgdG8gZ2V0IGNvcnJlY3QgYmFzZSBhZGRyZXNzCisJICovCisJZmxhc2hfZ2V0X3NpemUoZ2QtPmJkLT5iaV9mbGFzaHN0YXJ0LCAwKTsKKworCS8qIE1vbml0b3IgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisJKHZvaWQpZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkJICAgIC1DRkdfTU9OSVRPUl9MRU4sCisJCQkgICAgMHhmZmZmZmZmZiwKKwkJCSAgICAmZmxhc2hfaW5mb1swXSk7CisKKwkvKiBFbnYgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisJKHZvaWQpZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkJICAgIENGR19FTlZfQUREUl9SRURVTkQsCisJCQkgICAgQ0ZHX0VOVl9BRERSX1JFRFVORCArIDIqQ0ZHX0VOVl9TRUNUX1NJWkUgLSAxLAorCQkJICAgICZmbGFzaF9pbmZvWzBdKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6CisgKi8KK2ludCBjaGVja2JvYXJkKHZvaWQpCit7CisJY2hhciAqcyA9IGdldGVudigic2VyaWFsIyIpOworCisJcHV0cygiQm9hcmQ6IFpldXMtIik7CisKKwlpZiAoaW5fYmUzMigodm9pZCAqKUdQSU8wX0lSKSAmIEdQSU9fVkFMKENGR19HUElPX1pFVVNfUEUpKQorCQlwdXRzKCJQRSIpOworCWVsc2UKKwkJcHV0cygiQ0UiKTsKKworCXB1dHMoIiBvZiBCdWxsZXRFbmRQb2ludCIpOworCisJaWYgKHMgIT0gTlVMTCkgeworCQlwdXRzKCIsIHNlcmlhbCMgIik7CisJCXB1dHMocyk7CisJfQorCXB1dGMoJ1xuJyk7CisKKwkvKiBib3RoIExFRCdzIG9mZiAqLworCWdwaW9fd3JpdGVfYml0KENGR19HUElPX0xFRF9SRUQsIDApOworCWdwaW9fd3JpdGVfYml0KENGR19HUElPX0xFRF9HUkVFTiwgMCk7CisJdWRlbGF5KDEwMDAwKTsKKwkvKiBhbmQgb24gYWdhaW4gKi8KKwlncGlvX3dyaXRlX2JpdChDRkdfR1BJT19MRURfUkVELCAxKTsKKwlncGlvX3dyaXRlX2JpdChDRkdfR1BJT19MRURfR1JFRU4sIDEpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHUzMiBkZXRlY3Rfc2RyYW1fc2l6ZSh2b2lkKQoreworCXUzMiB2YWw7CisJdTMyIHNpemU7CisKKwltZnNkcmFtKG1lbV9tYjBjZiwgdmFsKTsKKwlzaXplID0gKDQgPDwgMjApIDw8ICgodmFsICYgMHgwMDBlMDAwMCkgPj4gMTcpOworCisJLyoKKwkgKiBDaGVjayBpZiAybmQgYmFuayBpcyBlbmFibGVkIHRvbworCSAqLworCW1mc2RyYW0obWVtX21iMWNmLCB2YWwpOworCWlmICh2YWwgJiAxKQorCQlzaXplICs9ICg0IDw8IDIwKSA8PCAoKHZhbCAmIDB4MDAwZTAwMDApID4+IDE3KTsKKworCXJldHVybiBzaXplOworfQorCitsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisJcmV0dXJuIGRldGVjdF9zZHJhbV9zaXplKCk7Cit9CisKKyNpZiBkZWZpbmVkKENGR19EUkFNX1RFU1QpCitpbnQgdGVzdGRyYW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICptZW0gPSAodW5zaWduZWQgbG9uZyAqKTA7CisJY29uc3QgdW5zaWduZWQgbG9uZyBrZW5kID0gKDEwMjQgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOworCXVuc2lnbmVkIGxvbmcgaywgbjsKKwl1bnNpZ25lZCBsb25nIG1zcjsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX2tieXRlczsKKworCXRvdGFsX2tieXRlcyA9IGRldGVjdF9zZHJhbV9zaXplKCk7CisKKwltc3IgPSBtZm1zcigpOworCW10bXNyKG1zciAmIH4oTVNSX0VFKSk7CisKKwlmb3IgKGsgPSAwOyBrIDwgdG90YWxfa2J5dGVzIDsKKwkgICAgICsraywgbWVtICs9ICgxMDI0IC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkgeworCQlpZiAoKGsgJiAxMDIzKSA9PSAwKSB7CisJCQlwcmludGYoIiUzZCBNQlxyIiwgayAvIDEwMjQpOworCQl9CisKKwkJbWVtc2V0KG1lbSwgMHhhYWFhYWFhYSwgMTAyNCk7CisJCWZvciAobiA9IDA7IG4gPCBrZW5kOyArK24pIHsKKwkJCWlmIChtZW1bbl0gIT0gMHhhYWFhYWFhYSkgeworCQkJCXByaW50ZigiU0RSQU0gdGVzdCBmYWlscyBhdDogJTA4eFxuIiwKKwkJCQkgICAgICAgKHVpbnQpICYgbWVtW25dKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJCW1lbXNldChtZW0sIDB4NTU1NTU1NTUsIDEwMjQpOworCQlmb3IgKG4gPSAwOyBuIDwga2VuZDsgKytuKSB7CisJCQlpZiAobWVtW25dICE9IDB4NTU1NTU1NTUpIHsKKwkJCQlwcmludGYoIlNEUkFNIHRlc3QgZmFpbHMgYXQ6ICUwOHhcbiIsCisJCQkJICAgICAgICh1aW50KSAmIG1lbVtuXSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcHJpbnRmKCJTRFJBTSB0ZXN0IHBhc3Nlc1xuIik7CisJbXRtc3IobXNyKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZGVmYXVsdF9lbnZfdmFyKGNoYXIgKmJ1ZiwgY2hhciAqdmFyKQoreworCWNoYXIgKnB0cjsKKwljaGFyICp2YWw7CisKKwkvKgorCSAqIEZpbmQgZW52IHZhcmlhYmxlCisJICovCisJcHRyID0gc3Ryc3RyKGJ1ZiArIDQsIHZhcik7CisJaWYgKHB0ciA9PSBOVUxMKSB7CisJCXByaW50ZigiRVJST1I6ICVzIG5vdCBmb3VuZCFcbiIsIHZhcik7CisJCXJldHVybiAtMTsKKwl9CisJcHRyICs9IHN0cmxlbih2YXIpICsgMTsKKworCS8qCisJICogTm93IHRoZSBldGhhZGRyIG5lZWRzIHRvIGJlIHVwZGF0ZWQgaW4gdGhlICJub3JtYWwiCisJICogZW52aXJvbm1lbnQgc3RvcmFnZSAtPiByZWR1bmRhbnQgZmxhc2guCisJICovCisJdmFsID0gcHRyOworCXNldGVudih2YXIsIHZhbCk7CisJcHJpbnRmKCJVcGRhdGVkICVzIGZyb20gZWVwcm9tIHRvICVzIVxuIiwgdmFyLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzdG9yZV9kZWZhdWx0KHZvaWQpCit7CisJY2hhciAqYnVmOworCWNoYXIgKmJ1Zl9zYXZlOworCXUzMiBjcmM7CisKKwkvKgorCSAqIFVucHJvdGVjdCBhbmQgZXJhc2UgZW52aXJvbm1lbnQgYXJlYQorCSAqLworCWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX0NMRUFSLAorCQkgICAgICBDRkdfRU5WX0FERFJfUkVEVU5ELAorCQkgICAgICBDRkdfRU5WX0FERFJfUkVEVU5EICsgMipDRkdfRU5WX1NFQ1RfU0laRSAtIDEsCisJCSAgICAgICZmbGFzaF9pbmZvWzBdKTsKKworCWZsYXNoX3NlY3RfZXJhc2UoQ0ZHX0VOVl9BRERSX1JFRFVORCwKKwkJCSBDRkdfRU5WX0FERFJfUkVEVU5EICsgMipDRkdfRU5WX1NFQ1RfU0laRSAtIDEpOworCisJLyoKKwkgKiBOb3cgcmVzdG9yZSBkZWZhdWx0IGVudmlyb25tZW50IGZyb20gVS1Cb290IGltYWdlCisJICogLT4gaXBhZGRyLCBzZXJ2ZXJpcC4uLgorCSAqLworCW1lbXNldChlbnZfcHRyLCAwLCBzaXplb2YoZW52X3QpKTsKKwltZW1jcHkoZW52X3B0ci0+ZGF0YSwgZGVmYXVsdF9lbnZpcm9ubWVudCwgRU5WX1NJWkUpOworI2lmZGVmIENGR19SRURVTkRBTkRfRU5WSVJPTk1FTlQKKwllbnZfcHRyLT5mbGFncyA9IDB4RkY7CisjZW5kaWYKKwllbnZfY3JjX3VwZGF0ZSgpOworCWdkLT5lbnZfdmFsaWQgPSAxOworCisJLyoKKwkgKiBSZWFkIGJvYXJkIHNwZWNpZmljIHZhbHVlcyBmcm9tIEkyQyBFRVBST00KKwkgKiBhbmQgc2V0IGVudiB2YXJpYWJsZXMgYWNjb3JkaW5nbHkKKwkgKiAtPiBldGhhZGRyLCBldGgxYWRkciwgc2VyaWFsIworCSAqLworCWJ1ZiA9IGJ1Zl9zYXZlID0gbWFsbG9jKEZBQ1RPUllfUkVTRVRfRU5WX1NJWkUpOworCWlmIChlZXByb21fcmVhZChGQUNUT1JZX1JFU0VUX0kyQ19FRVBST00sIEZBQ1RPUllfUkVTRVRfRU5WX09GRlMsCisJCQkodTggKilidWYsIEZBQ1RPUllfUkVTRVRfRU5WX1NJWkUpKSB7CisJCXB1dHMoIlxuRXJyb3IgcmVhZGluZyBFRVBST00hXG4iKTsKKwl9IGVsc2UgeworCQljcmMgPSBjcmMzMigwLCAodTggKikoYnVmICsgNCksIEZBQ1RPUllfUkVTRVRfRU5WX1NJWkUgLSA0KTsKKwkJaWYgKGNyYyAhPSAqKHUzMiAqKWJ1ZikgeworCQkJcHJpbnRmKCJFUlJPUjogY3JjIG1pc21hdGNoICUwOGx4ICUwOGx4XG4iLCBjcmMsICoodTMyICopYnVmKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWRlZmF1bHRfZW52X3ZhcihidWYsICJldGhhZGRyIik7CisJCWJ1ZiArPSA4ICsgMTg7CisJCWRlZmF1bHRfZW52X3ZhcihidWYsICJldGgxYWRkciIpOworCQlidWYgKz0gOSArIDE4OworCQlkZWZhdWx0X2Vudl92YXIoYnVmLCAic2VyaWFsIyIpOworCX0KKworCS8qCisJICogRmluYWxseSBzYXZlIHVwZGF0ZWQgZW52IHZhcmlhYmxlcyBiYWNrIHRvIGZsYXNoCisJICovCisJc2F2ZWVudigpOworCisJZnJlZShidWZfc2F2ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX3NldF9kZWZhdWx0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKmJ1ZjsKKwljaGFyICpidWZfc2F2ZTsKKwljaGFyIHN0clszMl07CisJdTMyIGNyYzsKKwljaGFyIHZhclszMl07CisKKwlpZiAoYXJnYyA8IDQpIHsKKwkJcHV0cygiRVJST1IhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ1ZiA9IGJ1Zl9zYXZlID0gbWFsbG9jKEZBQ1RPUllfUkVTRVRfRU5WX1NJWkUpOworCW1lbXNldChidWYsIDAsIEZBQ1RPUllfUkVTRVRfRU5WX1NJWkUpOworCisJc3RyY3B5KHZhciwgImV0aGFkZHIiKTsKKwlwcmludGYoIlNldHRpbmcgJXMgdG8gJXNcbiIsIHZhciwgYXJndlsxXSk7CisJc3ByaW50ZihzdHIsICIlcz0lcyIsIHZhciwgYXJndlsxXSk7CisJc3RyY3B5KGJ1ZiArIDQsIHN0cik7CisJYnVmICs9IHN0cmxlbihzdHIpICsgMTsKKworCXN0cmNweSh2YXIsICJldGgxYWRkciIpOworCXByaW50ZigiU2V0dGluZyAlcyB0byAlc1xuIiwgdmFyLCBhcmd2WzJdKTsKKwlzcHJpbnRmKHN0ciwgIiVzPSVzIiwgdmFyLCBhcmd2WzJdKTsKKwlzdHJjcHkoYnVmICsgNCwgc3RyKTsKKwlidWYgKz0gc3RybGVuKHN0cikgKyAxOworCisJc3RyY3B5KHZhciwgInNlcmlhbCMiKTsKKwlwcmludGYoIlNldHRpbmcgJXMgdG8gJXNcbiIsIHZhciwgYXJndlszXSk7CisJc3ByaW50ZihzdHIsICIlcz0lcyIsIHZhciwgYXJndlszXSk7CisJc3RyY3B5KGJ1ZiArIDQsIHN0cik7CisKKwljcmMgPSBjcmMzMigwLCAodTggKikoYnVmX3NhdmUgKyA0KSwgRkFDVE9SWV9SRVNFVF9FTlZfU0laRSAtIDQpOworCSoodTMyICopYnVmX3NhdmUgPSBjcmM7CisKKwlpZiAoZWVwcm9tX3dyaXRlKEZBQ1RPUllfUkVTRVRfSTJDX0VFUFJPTSwgRkFDVE9SWV9SRVNFVF9FTlZfT0ZGUywKKwkJCSAodTggKilidWZfc2F2ZSwgRkFDVE9SWV9SRVNFVF9FTlZfU0laRSkpIHsKKwkJcHV0cygiXG5FcnJvciB3cml0aW5nIEVFUFJPTSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZnJlZShidWZfc2F2ZSk7CisKKwlyZXR1cm4gMDsKK30KKworVV9CT09UX0NNRCgKKwlzZXRkZWYsCTQsCTEsCWRvX3NldF9kZWZhdWx0LAorCSJzZXRkZWYgIC0gd3JpdGUgYm9hcmQtc3BlY2lmaWMgdmFsdWVzIHRvIEVFUFJPTSAoZXRoYWRkci4uLilcbiIsCisJImV0aGFkZHIgZXRoMWFkZHIgc2VyaWFsI1xuICAgIC0gd3JpdGUgYm9hcmQtc3BlY2lmaWMgdmFsdWVzIHRvIEVFUFJPTVxuIgorCSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHN3X3Jlc2V0X3ByZXNzZWQodm9pZCkKK3sKKwlyZXR1cm4gIShpbl9iZTMyKCh2b2lkICopR1BJTzBfSVIpICYgR1BJT19WQUwoQ0ZHX0dQSU9fU1dfUkVTRVQpKTsKK30KKworaW50IGRvX2Noa3Jlc2V0KGNtZF90YmxfdCogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciogYXJndltdKQoreworCWludCBkZWx0YTsKKwlpbnQgY291bnQgPSAwOworCWludCBwb3N0ID0gMDsKKwlpbnQgZmFjdG9yeV9yZXNldCA9IDA7CisKKwlpZiAoIXN3X3Jlc2V0X3ByZXNzZWQoKSkgeworCQlwcmludGYoIlNXLVJlc2V0IGFscmVhZHkgaGlnaCAoQnV0dG9uIHJlbGVhc2VkKVxuIik7CisJCXByaW50ZigiLT4gTm8gYWN0aW9uIHRha2VuIVxuIik7CisJCXJldHVybiAwOworCX0KKworCXByaW50ZigiV2FpdGluZyBmb3IgU1ctUmVzZXQgYnV0dG9uIHRvIGJlIHJlbGVhc2VkLiIpOworCisJd2hpbGUgKDEpIHsKKwkJZGVsdGEgPSBnZXRfdGltZXIoc3RhcnRfdGltZSk7CisJCWlmICghc3dfcmVzZXRfcHJlc3NlZCgpKQorCQkJYnJlYWs7CisKKwkJaWYgKChkZWx0YSA+IENGR19USU1FX1BPU1QpICYmICFwb3N0KSB7CisJCQlwcmludGYoIlxuV2hlbiByZWxlYXNlZCBub3csIFBPU1QgdGVzdHMgd2lsbCBiZSBzdGFydGVkLiIpOworCQkJZ3Bpb193cml0ZV9iaXQoQ0ZHX0dQSU9fTEVEX0dSRUVOLCAwKTsKKwkJCXBvc3QgPSAxOworCQl9CisKKwkJaWYgKChkZWx0YSA+IENGR19USU1FX0ZBQ1RPUllfUkVTRVQpICYmICFmYWN0b3J5X3Jlc2V0KSB7CisJCQlwcmludGYoIlxuV2hlbiByZWxlYXNlZCBub3csIGZhY3RvcnkgZGVmYXVsdCB2YWx1ZXMiCisJCQkgICAgICAgIiB3aWxsIGJlIHJlc3RvcmVkLiIpOworCQkJZ3Bpb193cml0ZV9iaXQoQ0ZHX0dQSU9fTEVEX1JFRCwgMCk7CisJCQlmYWN0b3J5X3Jlc2V0ID0gMTsKKwkJfQorCisJCXVkZWxheSgxMDAwKTsKKwkJaWYgKCEoY291bnQrKyAlIDEwMDApKQorCQkJcHJpbnRmKCIuIik7CisJfQorCisKKwlwcmludGYoIlxuU1ctUmVzZXQgQnV0dG9uIHJlbGVhc2VkIGFmdGVyICVkIG1pbGxpLXNlY29uZHMhXG4iLCBkZWx0YSk7CisKKwlpZiAoZGVsdGEgPiBDRkdfVElNRV9GQUNUT1JZX1JFU0VUKSB7CisJCXByaW50ZigiU3RhcnRpbmcgZmFjdG9yeSByZXNldCB2YWx1ZSByZXN0b3JhdGlvbi4uLlxuIik7CisKKwkJLyoKKwkJICogUmVzdG9yZSBkZWZhdWx0IHNldHRpbmcKKwkJICovCisJCXJlc3RvcmVfZGVmYXVsdCgpOworCisJCS8qCisJCSAqIFJlc2V0IHRoZSBib2FyZCBmb3IgZGVmYXVsdCB0byBiZWNvbWUgdmFsaWQKKwkJICovCisJCWRvX3Jlc2V0KE5VTEwsIDAsIDAsIE5VTEwpOworCisJCXJldHVybiAwOworCX0KKworCWlmIChkZWx0YSA+IENGR19USU1FX1BPU1QpIHsKKwkJcHJpbnRmKCJTdGFydGluZyBQT1NUIGNvbmZpZ3VyYXRpb24uLi5cbiIpOworCisJCS8qCisJCSAqIEVuYWJsZSBQT1NUIHVwb24gbmV4dCBib290dXAKKwkJICovCisJCW91dF9iZTMyKCh2b2lkICopQ0ZHX1BPU1RfTUFHSUMsIFJFQk9PVF9NQUdJQyk7CisJCW91dF9iZTMyKCh2b2lkICopQ0ZHX1BPU1RfVkFMLCBSRUJPT1RfRE9fUE9TVCk7CisJCXBvc3RfYm9vdG1vZGVfaW5pdCgpOworCisJCS8qCisJCSAqIFJlc2V0IHRoZSBsb2didWZmZXIgZm9yIGEgY2xlYW4gc3RhcnQKKwkJICovCisJCWxvZ2J1ZmZfcmVzZXQoKTsKKworCQlkb19yZXNldChOVUxMLCAwLCAwLCBOVUxMKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworVV9CT09UX0NNRCAoCisJY2hrcmVzZXQsIDEsIDEsIGRvX2Noa3Jlc2V0LAorCSJjaGtyZXNldC0gQ2hlY2sgZm9yIHN0YXR1cyBvZiBTVy1yZXNldCBidXR0b24gYW5kIGFjdCBhY2NvcmRpbmdseVxuIiwKKwlOVUxMCispOworCisjaWYgZGVmaW5lZChDT05GSUdfUE9TVCkKKy8qCisgKiBSZXR1cm5zIDEgaWYga2V5cyBwcmVzc2VkIHRvIHN0YXJ0IHRoZSBwb3dlci1vbiBsb25nLXJ1bm5pbmcgdGVzdHMKKyAqIENhbGxlZCBmcm9tIGJvYXJkX2luaXRfZigpLgorICovCitpbnQgcG9zdF9ob3RrZXlzX3ByZXNzZWQodm9pZCkKK3sKKwl1MzIgcG9zdF9tYWdpYzsKKwl1MzIgcG9zdF92YWw7CisKKwlwb3N0X21hZ2ljID0gaW5fYmUzMigodm9pZCAqKUNGR19QT1NUX01BR0lDKTsKKwlwb3N0X3ZhbCA9IGluX2JlMzIoKHZvaWQgKilDRkdfUE9TVF9WQUwpOworCisJaWYgKChwb3N0X21hZ2ljID09IFJFQk9PVF9NQUdJQykgJiYgKHBvc3RfdmFsID09IFJFQk9PVF9ET19QT1NUKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvenBjMTkwMC91LWJvb3QubGRzIGIvYm9hcmQvenBjMTkwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGM0YjQ2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3pwYzE5MDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL3p5bG9uaXRlL25hbmQuYyBiL2JvYXJkL3p5bG9uaXRlL25hbmQuYwppbmRleCBhNDE3MTQzLi5hYTM5MzJhIDEwMDY0NAotLS0gYS9ib2FyZC96eWxvbml0ZS9uYW5kLmMKKysrIGIvYm9hcmQvenlsb25pdGUvbmFuZC5jCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaWZkZWYgQ09ORklHX05FV19OQU5EX0NPREUKIAogI2luY2x1ZGUgPG5hbmQuaD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9iZWRidWcuYyBiL2NvbW1vbi9iZWRidWcuYwppbmRleCA2OTY2ZGU3Li4zYmYxZmMzIDEwMDY0NAotLS0gYS9jb21tb24vYmVkYnVnLmMKKysrIGIvY29tbW9uL2JlZGJ1Zy5jCkBAIC0yLDcgKzIsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8YmVkYnVnL2JlZGJ1Zy5oPgpAQCAtMTI1Myw0ICsxMjUzLDQgQEAKICAqIHB1cnBvc2UuCiAgKi8KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfYXV0b3NjcmlwdC5jIGIvY29tbW9uL2NtZF9hdXRvc2NyaXB0LmMKaW5kZXggZTMyNTMwMi4uYTYwMzhhNiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9hdXRvc2NyaXB0LmMKKysrIGIvY29tbW9uL2NtZF9hdXRvc2NyaXB0LmMKQEAgLTQ3LDggKzQ3LDcgQEAKICNpbmNsdWRlIDxodXNoLmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0FVVE9TQ1JJUFQpIHx8IFwKLQkgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCApCisjaWYgZGVmaW5lZChDT05GSUdfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCiAKIGV4dGVybiBpbWFnZV9oZWFkZXJfdCBoZWFkZXI7CQkvKiBmcm9tIGNtZF9ib290bS5jICovCiBpbnQKQEAgLTE1MCw5ICsxNDksMTAgQEAKIAlyZXR1cm4gcmNvZGU7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQVVUT1NDUklQVCB8fCBDRkdfQ01EX0FVVE9TQ1JJUFQgKi8KKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKIGludAogZG9fYXV0b3NjcmlwdCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0xNzAsMTMgKzE3MCwxMyBAQAogCXJldHVybiByY29kZTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCiBVX0JPT1RfQ01EKAogCWF1dG9zY3IsIDIsIDAsCWRvX2F1dG9zY3JpcHQsCiAJImF1dG9zY3IgLSBydW4gc2NyaXB0IGZyb20gbWVtb3J5XG4iLAogCSJbYWRkcl0gLSBydW4gc2NyaXB0IHN0YXJ0aW5nIGF0IGFkZHIiCiAJIiAtIEEgdmFsaWQgYXV0b3NjciBoZWFkZXIgbXVzdCBiZSBwcmVzZW50XG4iCiApOwotI2VuZGlmIC8qIENGR19DTURfQVVUT1NDUklQVCAqLworI2VuZGlmCiAKLSNlbmRpZiAvKiBDT05GSUdfQVVUT1NDUklQVCB8fCBDRkdfQ01EX0FVVE9TQ1JJUFQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9iZGluZm8uYyBiL2NvbW1vbi9jbWRfYmRpbmZvLmMKaW5kZXggZDk3YzA5ZS4uY2NiODI2YiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9iZGluZm8uYworKysgYi9jb21tb24vY21kX2JkaW5mby5jCkBAIC0zMCw3ICszMCw3IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkRJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CREkpCiBzdGF0aWMgdm9pZCBwcmludF9udW0oY29uc3QgY2hhciAqLCB1bG9uZyk7CiAKICNpZm5kZWYgQ09ORklHX0FSTQkvKiBQb3dlclBDIGFuZCBvdGhlciAqLwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJcHJpbnRfbnVtICgic3JhbSBzaXplIiwJCSh1bG9uZyliZC0+Ymlfc3JhbXNpemUpOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJcHV0cyAoImV0aGFkZHIgICAgID0iKTsKIAlmb3IgKGk9MDsgaTw2OyArK2kpIHsKIAkJcHJpbnRmICgiJWMlMDJYIiwgaSA/ICc6JyA6ICcgJywgYmQtPmJpX2VuZXRhZGRyW2ldKTsKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXByaW50X251bSAoInNyYW0gc3RhcnQgICAgICIsCSh1bG9uZyliZC0+Ymlfc3JhbXN0YXJ0KTsKIAlwcmludF9udW0gKCJzcmFtIHNpemUgICAgICAiLAkodWxvbmcpYmQtPmJpX3NyYW1zaXplKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlwdXRzICgiZXRoYWRkciAgICAgPSIpOwogCWZvciAoaT0wOyBpPDY7ICsraSkgewogCQlwcmludGYgKCIlYyUwMlgiLCBpID8gJzonIDogJyAnLCBiZC0+YmlfZW5ldGFkZHJbaV0pOwpAQCAtMjg1LDQgKzI4NSw0IEBACiAJImJkaW5mbyAgLSBwcmludCBCb2FyZCBJbmZvIHN0cnVjdHVyZVxuIiwKIAlOVUxMCiApOwotI2VuZGlmCS8qIENGR19DTURfQkRJICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfYmVkYnVnLmMgYi9jb21tb24vY21kX2JlZGJ1Zy5jCmluZGV4IDQ4MDg2YTYuLjFjMzU0N2EgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfYmVkYnVnLmMKKysrIGIvY29tbW9uL2NtZF9iZWRidWcuYwpAQCAtMTMsNyArMTMsNyBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCiAjaWZuZGVmIE1BWAogI2RlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQpAQCAtNDEzLDcgKzQxMyw3IEBACiBVX0JPT1RfQ01EIChyZHVtcCwgMSwgMSwgZG9fYmVkYnVnX3JkdW1wLAogCSAgICAicmR1bXAgICAtIFNob3cgcmVnaXN0ZXJzLlxuIiwgIiAtIFNob3cgcmVnaXN0ZXJzLlxuIik7CiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZW5kaWYgLyogQ0ZHX0NNRF9CRURCVUcgKi8KKyNlbmRpZgogCiAKIC8qCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2JtcC5jIGIvY29tbW9uL2NtZF9ibXAuYwppbmRleCBhZDQxMmM4Li4yNDFhYTgzIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2JtcC5jCisrKyBiL2NvbW1vbi9jbWRfYm1wLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CTVApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JNUCkKIAogc3RhdGljIGludCBibXBfaW5mbyAodWxvbmcgYWRkcik7CiBzdGF0aWMgaW50IGJtcF9kaXNwbGF5ICh1bG9uZyBhZGRyLCBpbnQgeCwgaW50IHkpOwpAQCAtMTg4LDQgKzE4OCw0IEBACiAjZW5kaWYKIH0KIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19DTURfQk1QKSAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9jYWNoZS5jIGIvY29tbW9uL2NtZF9jYWNoZS5jCmluZGV4IDZjMjUwYmMuLjY3NWQ0M2YgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfY2FjaGUuYworKysgYi9jb21tb24vY21kX2NhY2hlLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DQUNIRSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0FDSEUpCiAKIHN0YXRpYyBpbnQgb25fb2ZmIChjb25zdCBjaGFyICopOwogCkBAIC0xMDksNCArMTA5LDQgQEAKIAkiICAgIC0gZW5hYmxlIG9yIGRpc2FibGUgZGF0YSAod3JpdGV0aHJvdWdoKSBjYWNoZVxuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfQ0FDSEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9jb25zb2xlLmMgYi9jb21tb24vY21kX2NvbnNvbGUuYwppbmRleCAxYmQzNzA5Li41ZTBmOTkwIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2NvbnNvbGUuYworKysgYi9jb21tb24vY21kX2NvbnNvbGUuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxkZXZpY2VzLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DT05TT0xFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DT05TT0xFKQogCiBleHRlcm4gdm9pZCBfZG9fY29uaW5mbyAodm9pZCk7CiBpbnQgZG9fY29uaW5mbyAoY21kX3RibF90ICogY21kLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKQEAgLTY4LDQgKzY4LDQgQEAKIAkiIgogKTsKIAotI2VuZGlmIC8qIENGR19DTURfQ09OU09MRSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2RhdGUuYyBiL2NvbW1vbi9jbWRfZGF0ZS5jCmluZGV4IDMzZDJlNTYuLjRhNDI1MzQgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZGF0ZS5jCisrKyBiL2NvbW1vbi9jbWRfZGF0ZS5jCkBAIC0zMSw3ICszMSw3IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogY29uc3QgY2hhciAqd2Vla2RheXNbXSA9IHsKIAkiU3VuIiwgIk1vbiIsICJUdWVzIiwgIldlZG5lcyIsICJUaHVycyIsICJGcmkiLCAiU2F0dXIiLApAQCAtMjExLDQgKzIxMSw0IEBACiAJIiAgLSB3aXRoICdyZXNldCcgYXJndW1lbnQ6IHJlc2V0IHRoZSBSVENcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kY3IuYyBiL2NvbW1vbi9jbWRfZGNyLmMKaW5kZXggNzIyMWE4Ni4uMTJmYTlkYiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kY3IuYworKysgYi9jb21tb24vY21kX2Rjci5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfNHh4KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TRVRHRVREQ1IpCisjaWYgZGVmaW5lZChDT05GSUdfNHh4KSAmJiBkZWZpbmVkKENPTkZJR19DTURfU0VUR0VURENSKQogCiB1bnNpZ25lZCBsb25nIGdldF9kY3IgKHVuc2lnbmVkIHNob3J0KTsKIHVuc2lnbmVkIGxvbmcgc2V0X2RjciAodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGxvbmcpOwpAQCAtMjQ2LDQgKzI0Niw0IEBACiAJImFkcl9kY3JuWy5kYXRfZGNybl0gb2Zmc2V0IHZhbHVlIC0gd3JpdGUgb2Zmc2V0IHRvIGFkcl9kY3JuLCB3cml0ZSB2YWx1ZSB0byBkYXRfZGNybi5cbiIKICk7CiAKLSNlbmRpZiAvKiBDT05GSUdfNHh4ICYgQ0ZHX0NNRF9TRVRHRVREQ1IgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kaWFnLmMgYi9jb21tb24vY21kX2RpYWcuYwppbmRleCA0NWM0YjMxLi5jYjk5Yjc3IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2RpYWcuYworKysgYi9jb21tb24vY21kX2RpYWcuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxwb3N0Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESUFHKSAmJiBkZWZpbmVkKENPTkZJR19QT1NUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESUFHKSAmJiBkZWZpbmVkKENPTkZJR19QT1NUKQogCiBpbnQgZG9fZGlhZyAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtNzcsNCArNzcsNCBAQAogCSIgICAgICAgICAtIHJ1biBzcGVjaWZpZWQgdGVzdHNcbiIKICk7CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0RJQUcgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kaXNwbGF5LmMgYi9jb21tb24vY21kX2Rpc3BsYXkuYwppbmRleCBhYmVlODQ0Li5kMTlmNDEyIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2Rpc3BsYXkuYworKysgYi9jb21tb24vY21kX2Rpc3BsYXkuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RJU1BMQVkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RJU1BMQVkpCiAKICN1bmRlZiBERUJVR19ESVNQCiAKQEAgLTc5LDQgKzc5LDQgQEAKIAkiICAgIC0gd2l0aG91dCBhcmd1bWVudHM6IGNsZWFyIGRvdCBtYXRyaXggZGlzcGxheVxuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfRElTUExBWSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2RvYy5jIGIvY29tbW9uL2NtZF9kb2MuYwppbmRleCBhYjM3NTE2Li5kNmQzYWZmIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2RvYy5jCisrKyBiL2NvbW1vbi9jbWRfZG9jLmMKQEAgLTEyLDE0ICsxMiw3IEBACiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCi0jIGluY2x1ZGUgPHN0YXR1c19sZWQuaD4KLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCi0jZWxzZQotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykKLSNlbmRpZgotCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmZ0bC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9kb2MyMDAwLmg+CkBAIC0yMTYsNiArMjA5LDcgQEAKIAlpbWFnZV9oZWFkZXJfdCAqaGRyOwogCWludCByY29kZSA9IDA7CiAKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDM0KTsKIAlzd2l0Y2ggKGFyZ2MpIHsKIAljYXNlIDE6CiAJCWFkZHIgPSBDRkdfTE9BRF9BRERSOwpAQCAtMjM2LDI0ICsyMzAsMjcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTM1KTsKIAkJcmV0dXJuIDE7CiAJfQogCisJc2hvd19ib290X3Byb2dyZXNzICgzNSk7CiAJaWYgKCFib290X2RldmljZSkgewogCQlwdXRzICgiXG4qKiBObyBib290IGRldmljZSAqKlxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0zNik7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDM2KTsKIAogCWRldiA9IHNpbXBsZV9zdHJ0b3VsKGJvb3RfZGV2aWNlLCAmZXAsIDE2KTsKIAogCWlmICgoZGV2ID49IENGR19NQVhfRE9DX0RFVklDRSkgfHwKIAkgICAgKGRvY19kZXZfZGVzY1tkZXZdLkNoaXBJRCA9PSBET0NfQ2hpcElEX1VOS05PV04pKSB7CiAJCXByaW50ZiAoIlxuKiogRGV2aWNlICVkIG5vdCBhdmFpbGFibGVcbiIsIGRldik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0zNyk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDM3KTsKIAogCXByaW50ZiAoIlxuTG9hZGluZyBmcm9tIGRldmljZSAlZDogJXMgYXQgMHglbFggKG9mZnNldCAweCVsWClcbiIsCiAJCWRldiwgZG9jX2Rldl9kZXNjW2Rldl0ubmFtZSwgZG9jX2Rldl9kZXNjW2Rldl0ucGh5c2FkciwKQEAgLTI2Miw5ICsyNTksMTAgQEAKIAlpZiAoZG9jX3J3IChkb2NfZGV2X2Rlc2MgKyBkZXYsIDEsIG9mZnNldCwKIAkJICAgIFNFQ1RPUlNJWkUsIE5VTEwsICh1X2NoYXIgKilhZGRyKSkgewogCQlwcmludGYgKCIqKiBSZWFkIGVycm9yIG9uICVkXG4iLCBkZXYpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtMzgpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICgzOCk7CiAKIAloZHIgPSAoaW1hZ2VfaGVhZGVyX3QgKilhZGRyOwogCkBAIC0yNzYsMTYgKzI3NCwxOCBAQAogCQljbnQgLT0gU0VDVE9SU0laRTsKIAl9IGVsc2UgewogCQlwdXRzICgiXG4qKiBCYWQgTWFnaWMgTnVtYmVyICoqXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTM5KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoMzkpOwogCiAJaWYgKGRvY19ydyAoZG9jX2Rldl9kZXNjICsgZGV2LCAxLCBvZmZzZXQgKyBTRUNUT1JTSVpFLCBjbnQsCiAJCSAgICBOVUxMLCAodV9jaGFyICopKGFkZHIrU0VDVE9SU0laRSkpKSB7CiAJCXByaW50ZiAoIioqIFJlYWQgZXJyb3Igb24gJWRcbiIsIGRldik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC00MCk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDQwKTsKIAogCS8qIExvYWRpbmcgb2ssIHVwZGF0ZSBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogCkBAIC0xNjA4LDQgKzE2MDgsNCBAQAogCX0KIH0KIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kdHQuYyBiL2NvbW1vbi9jbWRfZHR0LmMKaW5kZXggNGY3YjA0OS4uOGRhOTViZiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kdHQuYworKysgYi9jb21tb24vY21kX2R0dC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRFRUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EVFQpCiAKICNpbmNsdWRlIDxkdHQuaD4KICNpbmNsdWRlIDxpMmMuaD4KQEAgLTYxLDQgKzYxLDQgQEAKIAkgICIgICAgICAgIC0gUmVhZCB0ZW1wZXJhdHVyZSBmcm9tIGRpZ2l0YWwgdGhlcm1vbWV0ZXIgYW5kIHRoZXJtb3N0YXQuXG4iCiApOwogCi0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EVFQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9lZXByb20uYyBiL2NvbW1vbi9jbWRfZWVwcm9tLmMKaW5kZXggZDE1YTQxMi4uZTUwMDBlOSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9lZXByb20uYworKysgYi9jb21tb24vY21kX2VlcHJvbS5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUVQUk9NKSB8fCBkZWZpbmVkKENGR19FTlZfSVNfSU5fRUVQUk9NKQorI2lmIGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pIHx8IGRlZmluZWQoQ09ORklHX0NNRF9FRVBST00pCiAKIGV4dGVybiB2b2lkIGVlcHJvbV9pbml0ICAodm9pZCk7CiBleHRlcm4gaW50ICBlZXByb21fcmVhZCAgKHVuc2lnbmVkIGRldl9hZGRyLCB1bnNpZ25lZCBvZmZzZXQsCkBAIC02Miw3ICs2Miw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VFUFJPTSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRUVQUk9NKQogaW50IGRvX2VlcHJvbSAoIGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAljb25zdCBjaGFyICpjb25zdCBmbXQgPQpAQCAtMTEwLDcgKzExMCw3IEBACiAJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKIAlyZXR1cm4gMTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0VFUFJPTSAqLworI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCkBAIC0xMjEsNyArMTIxLDcgQEAKICAqICAgMHgwMDAwMG54eCBmb3IgRUVQUk9NIGFkZHJlc3Mgc2VsZWN0b3JzIGFuZCBwYWdlIG51bWJlciBhdCBuLgogICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FRVBST00pIHx8IGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pCisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0VFUFJPTSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0VFUFJPTSkKIAogI2lmbmRlZiBDT05GSUdfU1BJCiAjaWYgIWRlZmluZWQoQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4pIHx8IENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDwgMSB8fCBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiA+IDIKQEAgLTQyMiwxMCArNDIyLDExIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNlbmRpZgkvKiBDRkdfQ01EX0VFUFJPTSAqLworI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FRVBST00pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VFUFJPTSkKIAogI2lmZGVmIENGR19JMkNfTVVMVElfRUVQUk9NUwogVV9CT09UX0NNRCgKQEAgLTQ0NSw0ICs0NDYsNCBAQAogKTsKICNlbmRpZiAvKiBDRkdfSTJDX01VTFRJX0VFUFJPTVMgKi8KIAotI2VuZGlmCS8qIENGR19DTURfRUVQUk9NICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZWxmLmMgYi9jb21tb24vY21kX2VsZi5jCmluZGV4IDBlM2Q1NmYuLjYzYTU1OTMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZWxmLmMKKysrIGIvY29tbW9uL2NtZF9lbGYuYwpAQCAtMjMsNyArMjMsNyBAQAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VMRikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRUxGKQogCiAjaWZuZGVmIE1BWAogI2RlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQpAQCAtMTAxLDcgKzEwMSw3IEBACiAJZWxzZQogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHRmdHAgdGhlIGltYWdlIG91cnNlbHZlcyBiZWZvcmUgc3RhcnRpbmcgKi8KIAogCWlmICgoYXJnYyA9PSAyKSAmJiAoc3RyY21wIChhcmd2WzFdLCAidGZ0cCIpID09IDApKSB7CkBAIC0zMjQsNCArMzI0LDQgQEAKIAkiIFthZGRyZXNzXSAtIGxvYWQgYWRkcmVzcyBvZiB2eFdvcmtzIEVMRiBpbWFnZS5cbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0VMRiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2V4dDIuYyBiL2NvbW1vbi9jbWRfZXh0Mi5jCmluZGV4IDk0YmQ5YjYuLjhiZDJiNDcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZXh0Mi5jCisrKyBiL2NvbW1vbi9jbWRfZXh0Mi5jCkBAIC0zNSwxNCArMzUsMTQgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxwYXJ0Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FWFQyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FWFQyKQogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxpbWFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGV4dDJmcy5oPgotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpICYmIGRlZmluZWQoQ09ORklHX1VTQl9TVE9SQUdFKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVVNCKSAmJiBkZWZpbmVkKENPTkZJR19VU0JfU1RPUkFHRSkKICNpbmNsdWRlIDx1c2IuaD4KICNlbmRpZgogCkBAIC0yNjAsNCArMjYwLDQgQEAKIAkiICAgICAgdG8gYWRkcmVzcyAnYWRkcicgZnJvbSBleHQyIGZpbGVzeXN0ZW1cbiIKICk7CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VYVDIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9mYXQuYyBiL2NvbW1vbi9jbWRfZmF0LmMKaW5kZXggYWZhZjI5OS4uNTRmMGY5ZiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9mYXQuYworKysgYi9jb21tb24vY21kX2ZhdC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXRhLmg+CiAjaW5jbHVkZSA8cGFydC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GQVQpCiAKICN1bmRlZglERUJVRwogCkBAIC0zMjQsNCArMzI0LDQgQEAKIH0KICNlbmRpZgkvKiBOT1RfSU1QTEVNRU5URURfWUVUICovCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0ZBVCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2ZkYy5jIGIvY29tbW9uL2NtZF9mZGMuYwppbmRleCAwM2Y0Y2U2Li43MzQ5NDEyIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2ZkYy5jCisrKyBiL2NvbW1vbi9jbWRfZmRjLmMKQEAgLTQ3LDExICs0NywxMSBAQAogI2VuZGlmCiAKIAotLyojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgKi8KKy8qI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSAqLwogLyojaW5jbHVkZSA8cnRjLmg+ICovCiAvKiNlbmRpZiAqLwogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZEQykgfHwgZGVmaW5lZChDT05GSUdfQ01EX0ZET1MpCiAKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNzA3LDkgKzcwNyw5IEBACiAKIAlyZXR1cm4gVFJVRTsKIH0KLSNlbmRpZiAvKiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRDKXx8KENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykpKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogLyogTG93IGxldmVsIGZ1bmN0aW9ucyBmb3IgdGhlIEZsb3BweS1ET1MgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCkBAIC03NzIsOSArNzcyLDkgQEAKIAogCXJldHVybiAoZmRjX3JlYWRfZGF0YSAoYnVmZmVyLCBsZW4sIHBDTUQsIHBGRykpOwogfQotI2VuZGlmICAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GREMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZEQykKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBtYWluIHJvdXRpbmUgZG9fZmRjYm9vdAogICovCkBAIC04ODAsMTMgKzg4MCwxMyBAQAogfQogCiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQyAqLworI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GREMpCiAKIFVfQk9PVF9DTUQoCiAJZmRjYm9vdCwJMywJMSwJZG9fZmRjYm9vdCwKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZmRvcy5jIGIvY29tbW9uL2NtZF9mZG9zLmMKaW5kZXggZGMwMmIzNS4uZjlkYTk4ZCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9mZG9zLmMKKysrIGIvY29tbW9uL2NtZF9mZG9zLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8ZmRjLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBkb19mZG9zYm9vdCAtLQpAQCAtMTU0LDQgKzE1NCw0IEBACiAJIltkaXJlY3RvcnldXG4iCiApOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZmR0LmMgYi9jb21tb24vY21kX2ZkdC5jCmluZGV4IDA4ZmUzNTEuLjU3MWI4ZjEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZmR0LmMKKysrIGIvY29tbW9uL2NtZF9mZHQuYwpAQCAtMzcsNDYgKzM3LDMyIEBACiAjaW5jbHVkZSA8ZmR0X3N1cHBvcnQuaD4KIAogI2RlZmluZSBNQVhfTEVWRUwJMzIJCS8qIGhvdyBkZWVwbHkgbmVzdGVkIHdlIHdpbGwgZ28gKi8KLSNkZWZpbmUgU0NSQVRDSFBBRAkxMDI0CS8qIGJ5dGVzIG9mIHNjcmF0Y2hwYWQgbWVtb3J5ICovCisjZGVmaW5lIFNDUkFUQ0hQQUQJMTAyNAkJLyogYnl0ZXMgb2Ygc2NyYXRjaHBhZCBtZW1vcnkgKi8KIAogLyoKICAqIEdsb2JhbCBkYXRhIChmb3IgdGhlIGdkLT5iZCkKICAqLwogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLS8qCi0gKiBTY3JhdGNocGFkIG1lbW9yeS4KLSAqLwotc3RhdGljIGNoYXIgZGF0YVtTQ1JBVENIUEFEXTsKLQotCi0vKgotICogRnVuY3Rpb24gcHJvdG90eXBlcy9kZWNsYXJhdGlvbnMuCi0gKi8KIHN0YXRpYyBpbnQgZmR0X3ZhbGlkKHZvaWQpOwotc3RhdGljIHZvaWQgcHJpbnRfZGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKLQorc3RhdGljIGludCBmZHRfcGFyc2VfcHJvcChjaGFyICpwYXRocCwgY2hhciAqcHJvcCwgY2hhciAqbmV3dmFsLAorCWNoYXIgKmRhdGEsIGludCAqbGVuKTsKK3N0YXRpYyBpbnQgZmR0X3ByaW50KGNoYXIgKnBhdGhwLCBjaGFyICpwcm9wLCBpbnQgZGVwdGgpOwogCiAvKgogICogRmxhdHRlbmVkIERldmljZSBUcmVlIGNvbW1hbmQsIHNlZSB0aGUgaGVscCBmb3IgcGFyYW1ldGVyIGRlZmluaXRpb25zLgogICovCiBpbnQgZG9fZmR0IChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0JY2hhcgkJb3A7Ci0KIAlpZiAoYXJnYyA8IDIpIHsKIAkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JLyoKLQkgKiBGaWd1cmUgb3V0IHdoaWNoIHN1YmNvbW1hbmQgd2FzIGdpdmVuCi0JICovCi0Jb3AgPSBhcmd2WzFdWzBdOwogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCSAqIFNldCB0aGUgYWRkcmVzcyBvZiB0aGUgZmR0CiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWlmIChvcCA9PSAnYScpIHsKKwlpZiAoYXJndlsxXVswXSA9PSAnYScpIHsKIAkJLyoKIAkJICogU2V0IHRoZSBhZGRyZXNzIFthbmQgbGVuZ3RoXSBvZiB0aGUgZmR0LgogCQkgKi8KQEAgLTk0LDcgKzgwLDggQEAKIAkJCSAqLwogCQkJbGVuID0gIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKIAkJCWlmIChsZW4gPCBmZHRfdG90YWxzaXplKGZkdCkpIHsKLQkJCQlwcmludGYgKCJOZXcgbGVuZ3RoICVkIDwgZXhpc3RpbmcgbGVuZ3RoICVkLCBpZ25vcmluZy5cbiIsCisJCQkJcHJpbnRmICgiTmV3IGxlbmd0aCAlZCA8IGV4aXN0aW5nIGxlbmd0aCAlZCwgIgorCQkJCQkiaWdub3JpbmcuXG4iLAogCQkJCQlsZW4sIGZkdF90b3RhbHNpemUoZmR0KSk7CiAJCQl9IGVsc2UgewogCQkJCS8qCkBAIC0xMDIsNyArODksOCBAQAogCQkJCSAqLwogCQkJCWVyciA9IGZkdF9vcGVuX2ludG8oZmR0LCBmZHQsIGxlbik7CiAJCQkJaWYgKGVyciAhPSAwKSB7Ci0JCQkJCXByaW50ZiAoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCQkJcHJpbnRmICgibGliZmR0IGZkdF9vcGVuX2ludG8oKTogJXNcbiIsCisJCQkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xMTAsMTIgKzk4LDEyIEBACiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJICogTW92ZSB0aGUgZmR0CiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCX0gZWxzZSBpZiAob3AgPT0gJ20nKSB7CisJfSBlbHNlIGlmICgoYXJndlsxXVswXSA9PSAnbScpICYmIChhcmd2WzFdWzFdID09ICdvJykpIHsKIAkJc3RydWN0IGZkdF9oZWFkZXIgKm5ld2FkZHI7CiAJCWludCAgbGVuOwogCQlpbnQgIGVycjsKIAotCQlpZiAoYXJnYyAhPSA1KSB7CisJCWlmIChhcmdjIDwgNCkgewogCQkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xMjgsMTIgKzExNiwyMiBAQAogCQkJcmV0dXJuIDE7CiAJCX0KIAotCQluZXdhZGRyID0gKHN0cnVjdCBmZHRfaGVhZGVyICopc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOwotCQlsZW4gICAgID0gIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sIE5VTEwsIDE2KTsKLQkJaWYgKGxlbiA8IGZkdF90b3RhbHNpemUoZmR0KSkgewotCQkJcHJpbnRmICgiTmV3IGxlbmd0aCAlZCA8IGV4aXN0aW5nIGxlbmd0aCAlZCwgYWJvcnRpbmcuXG4iLAotCQkJCWxlbiwgZmR0X3RvdGFsc2l6ZShmZHQpKTsKLQkJCXJldHVybiAxOworCQluZXdhZGRyID0gKHN0cnVjdCBmZHRfaGVhZGVyICopc2ltcGxlX3N0cnRvdWwoYXJndlszXSxOVUxMLDE2KTsKKworCQkvKgorCQkgKiBJZiB0aGUgdXNlciBzcGVjaWZpZXMgYSBsZW5ndGgsIHVzZSB0aGF0LiAgT3RoZXJ3aXNlIHVzZSB0aGUKKwkJICogY3VycmVudCBsZW5ndGguCisJCSAqLworCQlpZiAoYXJnYyA8PSA0KSB7CisJCQlsZW4gPSBmZHRfdG90YWxzaXplKGZkdCk7CisJCX0gZWxzZSB7CisJCQlsZW4gPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCBOVUxMLCAxNik7CisJCQlpZiAobGVuIDwgZmR0X3RvdGFsc2l6ZShmZHQpKSB7CisJCQkJcHJpbnRmICgiTmV3IGxlbmd0aCAweCVYIDwgZXhpc3RpbmcgbGVuZ3RoICIKKwkJCQkJIjB4JVgsIGFib3J0aW5nLlxuIiwKKwkJCQkJbGVuLCBmZHRfdG90YWxzaXplKGZkdCkpOworCQkJCXJldHVybiAxOworCQkJfQogCQl9CiAKIAkJLyoKQEAgLTE0MSwyNiArMTM5LDU5IEBACiAJCSAqLwogCQllcnIgPSBmZHRfb3Blbl9pbnRvKGZkdCwgbmV3YWRkciwgbGVuKTsKIAkJaWYgKGVyciAhPSAwKSB7Ci0JCQlwcmludGYgKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CisJCQlwcmludGYgKCJsaWJmZHQgZmR0X29wZW5faW50bygpOiAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlmZHQgPSBuZXdhZGRyOwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBhIG5vZGUgaW4gdGhlIGZkdC4KKwkgKiBNYWtlIGEgbmV3IG5vZGUKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JfSBlbHNlIGlmIChvcCA9PSAncycpIHsKKwl9IGVsc2UgaWYgKChhcmd2WzFdWzBdID09ICdtJykgJiYgKGFyZ3ZbMV1bMV0gPT0gJ2snKSkgewogCQljaGFyICpwYXRocDsJCS8qIHBhdGggKi8KLQkJY2hhciAqcHJvcDsJCQkvKiBwcm9wZXJ0eSAqLwotCQlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpub2RlcDsJLyogbm9kZSBzdHJ1Y3QgcG9pbnRlciAqLwotCQljaGFyICpuZXd2YWw7CQkvKiB2YWx1ZSBmcm9tIHRoZSB1c2VyIChhcyBhIHN0cmluZykgKi8KLQkJY2hhciAqdnA7CQkJLyogdGVtcG9yYXJ5IHZhbHVlIHBvaW50ZXIgKi8KLQkJY2hhciAqY3A7CQkJLyogdGVtcG9yYXJ5IGNoYXIgcG9pbnRlciAqLworCQljaGFyICpub2RlcDsJCS8qIG5ldyBub2RlIHRvIGFkZCAqLwogCQlpbnQgIG5vZGVvZmZzZXQ7CS8qIG5vZGUgb2Zmc2V0IGZyb20gbGliZmR0ICovCi0JCWludCAgbGVuOwkJCS8qIG5ldyBsZW5ndGggb2YgdGhlIHByb3BlcnR5ICovCi0JCWludCAgb2xkbGVuOwkJLyogb3JpZ2luYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLwotCQl1bnNpZ25lZCBsb25nIHRtcDsJLyogaG9sZHMgY29udmVydGVkIHZhbHVlcyAqLwotCQlpbnQgIHJldDsJCQkvKiByZXR1cm4gdmFsdWUgKi8KKwkJaW50ICBlcnI7CisKKwkJLyoKKwkJICogUGFyYW1ldGVyczogTm9kZSBwYXRoLCBuZXcgbm9kZSB0byBiZSBhcHBlbmRlZCB0byB0aGUgcGF0aC4KKwkJICovCisJCWlmIChhcmdjIDwgNCkgeworCQkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcGF0aHAgPSBhcmd2WzJdOworCQlub2RlcCA9IGFyZ3ZbM107CisKKwkJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aCAoZmR0LCBwYXRocCk7CisJCWlmIChub2Rlb2Zmc2V0IDwgMCkgeworCQkJLyoKKwkJCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCisJCQkgKi8KKwkJCXByaW50ZiAoImxpYmZkdCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoKSByZXR1cm5lZCAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZXJyID0gZmR0X2FkZF9zdWJub2RlKGZkdCwgbm9kZW9mZnNldCwgbm9kZXApOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRmICgibGliZmR0IGZkdF9hZGRfc3Vibm9kZSgpOiAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU2V0IHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGluIHRoZSBmZHQuCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCX0gZWxzZSBpZiAoYXJndlsxXVswXSA9PSAncycpIHsKKwkJY2hhciAqcGF0aHA7CQkvKiBwYXRoICovCisJCWNoYXIgKnByb3A7CQkvKiBwcm9wZXJ0eSAqLworCQljaGFyICpuZXd2YWw7CQkvKiB2YWx1ZSBmcm9tIHRoZSB1c2VyIChhcyBhIHN0cmluZykgKi8KKwkJaW50ICBub2Rlb2Zmc2V0OwkvKiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCQlzdGF0aWMgY2hhciBkYXRhW1NDUkFUQ0hQQURdOwkvKiBzdG9yYWdlIGZvciB0aGUgcHJvcGVydHkgKi8KKwkJaW50ICBsZW47CQkvKiBuZXcgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLworCQlpbnQgIHJldDsJCS8qIHJldHVybiB2YWx1ZSAqLwogCiAJCS8qCiAJCSAqIFBhcmFtZXRlcnM6IE5vZGUgcGF0aCwgcHJvcGVydHksIHZhbHVlLgpAQCAtMTc0LDEyMSArMjA1LDM4IEBACiAJCXByb3AgICA9IGFyZ3ZbM107CiAJCW5ld3ZhbCA9IGFyZ3ZbNF07CiAKLQkJaWYgKHN0cmNtcChwYXRocCwgIi8iKSA9PSAwKSB7Ci0JCQlub2Rlb2Zmc2V0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZkdCwgcGF0aHApOwotCQkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7Ci0JCQkJLyoKLQkJCSAJICogTm90IGZvdW5kIG9yIHNvbWV0aGluZyBlbHNlIGJhZCBoYXBwZW5lZC4KLQkJCSAJICovCi0JCQkJcHJpbnRmICgibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KKwkJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aCAoZmR0LCBwYXRocCk7CisJCWlmIChub2Rlb2Zmc2V0IDwgMCkgeworCQkJLyoKKwkJCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCisJCQkgKi8KKwkJCXByaW50ZiAoImxpYmZkdCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoKSByZXR1cm5lZCAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQkJcmV0dXJuIDE7CiAJCX0KLQkJbm9kZXAgPSBmZHRfZ2V0cHJvcCAoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCAmb2xkbGVuKTsKLQkJaWYgKG9sZGxlbiA8IDApIHsKLQkJCXByaW50ZiAoImxpYmZkdCAlc1xuIiwgZmR0X3N0cmVycm9yKG9sZGxlbikpOwotCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSBpZiAob2xkbGVuID09IDApIHsKLQkJCS8qCi0JCQkgKiBUaGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBubyB2YWx1ZQotCQkJICovCi0JCQlwcmludGYoIiVzIGhhcyBubyB2YWx1ZSwgY2Fubm90IHNldCBvbmUgKHlldCkuXG4iLCBwcm9wKTsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIENvbnZlcnQgdGhlIG5ldyBwcm9wZXJ0eQotCQkJICovCi0JCQl2cCA9IGRhdGE7Ci0JCQlpZiAoKm5ld3ZhbCA9PSAnPCcpIHsKLQkJCQkvKgotCQkJCSAqIEJpZ2dlciB2YWx1ZXMgdGhhbiBieXRlcy4KLQkJCQkgKi8KLQkJCQlsZW4gPSAwOwotCQkJCW5ld3ZhbCsrOwotCQkJCXdoaWxlICgoKm5ld3ZhbCAhPSAnPicpICYmICgqbmV3dmFsICE9ICdcMCcpKSB7Ci0JCQkJCWNwID0gbmV3dmFsOwotCQkJCQl0bXAgPSBzaW1wbGVfc3RydG91bChjcCwgJm5ld3ZhbCwgMTYpOwotCQkJCQlpZiAoKG5ld3ZhbCAtIGNwKSA8PSAyKSB7Ci0JCQkJCQkqdnAgPSB0bXAgJiAweEZGOwotCQkJCQkJdnAgICs9IDE7Ci0JCQkJCQlsZW4gKz0gMTsKLQkJCQkJfSBlbHNlIGlmICgobmV3dmFsIC0gY3ApIDw9IDQpIHsKLQkJCQkJCSoodWludDE2X3QgKil2cCA9IF9fY3B1X3RvX2JlMTYodG1wKTsKLQkJCQkJCXZwICArPSAyOwotCQkJCQkJbGVuICs9IDI7Ci0JCQkJCX0gZWxzZSBpZiAoKG5ld3ZhbCAtIGNwKSA8PSA4KSB7Ci0JCQkJCQkqKHVpbnQzMl90ICopdnAgPSBfX2NwdV90b19iZTMyKHRtcCk7Ci0JCQkJCQl2cCAgKz0gNDsKLQkJCQkJCWxlbiArPSA0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJpbnRmKCJTb3JyeSwgSSBjb3VsZCBub3QgY29udmVydCBcIiVzXCJcbiIsIGNwKTsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9Ci0JCQkJCXdoaWxlICgqbmV3dmFsID09ICcgJykKLQkJCQkJCW5ld3ZhbCsrOwotCQkJCX0KLQkJCQlpZiAoKm5ld3ZhbCAhPSAnPicpIHsKLQkJCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnJWMnXG4iLCAqbmV3dmFsKTsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgqbmV3dmFsID09ICdbJykgewotCQkJCS8qCi0JCQkJICogQnl0ZSBzdHJlYW0uICBDb252ZXJ0IHRoZSB2YWx1ZXMuCi0JCQkJICovCi0JCQkJbGVuID0gMDsKLQkJCQluZXd2YWwrKzsKLQkJCQl3aGlsZSAoKCpuZXd2YWwgIT0gJ10nKSAmJiAoKm5ld3ZhbCAhPSAnXDAnKSkgewotCQkJCQl0bXAgPSBzaW1wbGVfc3RydG91bChuZXd2YWwsICZuZXd2YWwsIDE2KTsKLQkJCQkJKnZwKysgPSB0bXAgJiAweEZGOwotCQkJCQlsZW4rKzsKLQkJCQkJd2hpbGUgKCpuZXd2YWwgPT0gJyAnKQotCQkJCQkJbmV3dmFsKys7Ci0JCQkJfQotCQkJCWlmICgqbmV3dmFsICE9ICddJykgewotCQkJCQlwcmludGYoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICclYydcbiIsICpuZXd2YWwpOwotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogQXNzdW1lIGl0IGlzIGEgc3RyaW5nLiAgQ29weSBpdCBpbnRvIG91ciBkYXRhIGFyZWEgZm9yCi0JCQkJICogY29udmVuaWVuY2UgKGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgJ1wwJykuCi0JCQkJICovCi0JCQkJbGVuID0gc3RybGVuKG5ld3ZhbCkgKyAxOwotCQkJCXN0cmNweShkYXRhLCBuZXd2YWwpOwotCQkJfQorCQlyZXQgPSBmZHRfcGFyc2VfcHJvcChwYXRocCwgcHJvcCwgbmV3dmFsLCBkYXRhLCAmbGVuKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAotCQkJcmV0ID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCBkYXRhLCBsZW4pOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcmludGYgKCJsaWJmZHQgJXNcbiIsIGZkdF9zdHJlcnJvcihyZXQpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KKwkJcmV0ID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCBkYXRhLCBsZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRmICgibGliZmR0IGZkdF9zZXRwcm9wKCk6ICVzXG4iLCBmZHRfc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gMTsKIAkJfQogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJICogUHJpbnQgKHJlY3Vyc2l2ZSkgLyBMaXN0IChzaW5nbGUgbGV2ZWwpCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCX0gZWxzZSBpZiAoKG9wID09ICdwJykgfHwgKG9wID09ICdsJykpIHsKLQkJLyoKLQkJICogUmVjdXJzaXZlbHkgcHJpbnQgKGEgcG9ydGlvbiBvZikgdGhlIGZkdC4KLQkJICovCi0JCXN0YXRpYyBpbnQgb2Zmc3RhY2tbTUFYX0xFVkVMXTsKLQkJc3RhdGljIGNoYXIgdGFic1tNQVhfTEVWRUwrMV0gPSAiXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCI7CisJfSBlbHNlIGlmICgoYXJndlsxXVswXSA9PSAncCcpIHx8IChhcmd2WzFdWzBdID09ICdsJykpIHsKIAkJaW50IGRlcHRoID0gTUFYX0xFVkVMOwkvKiBob3cgZGVlcCB0byBwcmludCAqLwogCQljaGFyICpwYXRocDsJCS8qIHBhdGggKi8KLQkJY2hhciAqcHJvcDsJCQkvKiBwcm9wZXJ0eSAqLwotCQl2b2lkICpub2RlcDsJCS8qIHByb3BlcnR5IG5vZGUgcG9pbnRlciAqLwotCQlpbnQgIG5vZGVvZmZzZXQ7CS8qIG5vZGUgb2Zmc2V0IGZyb20gbGliZmR0ICovCi0JCWludCAgbmV4dG9mZnNldDsJLyogbmV4dCBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLwotCQl1aW50MzJfdCB0YWc7CQkvKiB0YWcgKi8KLQkJaW50ICBsZW47CQkJLyogbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLwotCQlpbnQgIGxldmVsID0gMDsJCS8qIGtlZXAgdHJhY2sgb2YgbmVzdGluZyBsZXZlbCAqLworCQljaGFyICpwcm9wOwkJLyogcHJvcGVydHkgKi8KKwkJaW50ICByZXQ7CQkvKiByZXR1cm4gdmFsdWUgKi8KIAogCQkvKgogCQkgKiBsaXN0IGlzIGFuIGFsaWFzIGZvciBwcmludCwgYnV0IGxpbWl0ZWQgdG8gMSBsZXZlbAogCQkgKi8KLQkJaWYgKG9wID09ICdsJykgeworCQlpZiAoYXJndlsxXVswXSA9PSAnbCcpIHsKIAkJCWRlcHRoID0gMTsKIAkJfQogCkBAIC0zMDIsOTkgKzI1MCwxNCBAQAogCQllbHNlCiAJCQlwcm9wID0gTlVMTDsKIAotCQlpZiAoc3RyY21wKHBhdGhwLCAiLyIpID09IDApIHsKLQkJCW5vZGVvZmZzZXQgPSAwOwotCQkJcHJpbnRmKCIvIik7Ci0JCX0gZWxzZSB7Ci0JCQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsIHBhdGhwKTsKLQkJCWlmIChub2Rlb2Zmc2V0IDwgMCkgewotCQkJCS8qCi0JCQkJICogTm90IGZvdW5kIG9yIHNvbWV0aGluZyBlbHNlIGJhZCBoYXBwZW5lZC4KLQkJCQkgKi8KLQkJCQlwcmludGYgKCJsaWJmZHQgJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogVGhlIHVzZXIgcGFzc2VkIGluIGEgcHJvcGVydHkgYXMgd2VsbCBhcyBub2RlIHBhdGguICBQcmludCBvbmx5Ci0JCSAqIHRoZSBnaXZlbiBwcm9wZXJ0eSBhbmQgdGhlbiByZXR1cm4uCi0JCSAqLwotCQlpZiAocHJvcCkgewotCQkJbm9kZXAgPSBmZHRfZ2V0cHJvcCAoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCAmbGVuKTsKLQkJCWlmIChsZW4gPT0gMCkgewotCQkJCXByaW50ZigiJXMgJXNcbiIsIHBhdGhwLCBwcm9wKTsJLyogbm8gcHJvcGVydHkgdmFsdWUgKi8KLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAobGVuID4gMCkgewotCQkJCXByaW50ZigiJXM9IiwgcHJvcCk7Ci0JCQkJcHJpbnRfZGF0YSAobm9kZXAsIGxlbik7Ci0JCQkJcHJpbnRmKCJcbiIpOwotCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGYgKCJsaWJmZHQgJXNcbiIsIGZkdF9zdHJlcnJvcihsZW4pKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFRoZSB1c2VyIHBhc3NlZCBpbiBhIG5vZGUgcGF0aCBhbmQgbm8gcHJvcGVydHksIHByaW50IHRoZSBub2RlCi0JCSAqIGFuZCBhbGwgc3Vibm9kZXMuCi0JCSAqLwotCQlvZmZzdGFja1swXSA9IG5vZGVvZmZzZXQ7Ci0KLQkJd2hpbGUobGV2ZWwgPj0gMCkgewotCQkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgbm9kZW9mZnNldCwgJm5leHRvZmZzZXQsICZwYXRocCk7Ci0JCQlzd2l0Y2godGFnKSB7Ci0JCQljYXNlIEZEVF9CRUdJTl9OT0RFOgotCQkJCWlmKGxldmVsIDw9IGRlcHRoKQotCQkJCQlwcmludGYoIiVzJXMge1xuIiwgJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdLCBwYXRocCk7Ci0JCQkJbGV2ZWwrKzsKLQkJCQlvZmZzdGFja1tsZXZlbF0gPSBub2Rlb2Zmc2V0OwotCQkJCWlmIChsZXZlbCA+PSBNQVhfTEVWRUwpIHsKLQkJCQkJcHJpbnRmKCJBYWFpaWkgPHNwbGF0PiBuZXN0ZWQgdG9vIGRlZXAuXG4iKTsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBGRFRfRU5EX05PREU6Ci0JCQkJbGV2ZWwtLTsKLQkJCQlpZihsZXZlbCA8PSBkZXB0aCkKLQkJCQkJcHJpbnRmKCIlc307XG4iLCAmdGFic1tNQVhfTEVWRUwgLSBsZXZlbF0pOwotCQkJCWlmIChsZXZlbCA9PSAwKSB7Ci0JCQkJCWxldmVsID0gLTE7CQkvKiBleGl0IHRoZSBsb29wICovCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBGRFRfUFJPUDoKLQkJCQlub2RlcCA9IGZkdF9nZXRwcm9wIChmZHQsIG9mZnN0YWNrW2xldmVsXSwgcGF0aHAsICZsZW4pOwotCQkJCWlmIChsZW4gPCAwKSB7Ci0JCQkJCXByaW50ZiAoImxpYmZkdCAlc1xuIiwgZmR0X3N0cmVycm9yKGxlbikpOwotCQkJCQlyZXR1cm4gMTsKLQkJCQl9IGVsc2UgaWYgKGxlbiA9PSAwKSB7Ci0JCQkJCS8qIHRoZSBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUgKi8KLQkJCQkJaWYobGV2ZWwgPD0gZGVwdGgpCi0JCQkJCQlwcmludGYoIiVzJXM7XG4iLCAmdGFic1tNQVhfTEVWRUwgLSBsZXZlbF0sIHBhdGhwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZihsZXZlbCA8PSBkZXB0aCkgewotCQkJCQkJcHJpbnRmKCIlcyVzPSIsICZ0YWJzW01BWF9MRVZFTCAtIGxldmVsXSwgcGF0aHApOwotCQkJCQkJcHJpbnRfZGF0YSAobm9kZXAsIGxlbik7Ci0JCQkJCQlwcmludGYoIjtcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBGRFRfTk9QOgotCQkJCWJyZWFrOwotCQkJY2FzZSBGRFRfRU5EOgotCQkJCXJldHVybiAxOwotCQkJZGVmYXVsdDoKLQkJCQlpZihsZXZlbCA8PSBkZXB0aCkKLQkJCQkJcHJpbnRmKCJVbmtub3duIHRhZyAweCUwOFhcbiIsIHRhZyk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlub2Rlb2Zmc2V0ID0gbmV4dG9mZnNldDsKLQkJfQorCQlyZXQgPSBmZHRfcHJpbnQocGF0aHAsIHByb3AsIGRlcHRoKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCSAqIFJlbW92ZSBhIHByb3BlcnR5L25vZGUKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JfSBlbHNlIGlmIChvcCA9PSAncicpIHsKKwl9IGVsc2UgaWYgKGFyZ3ZbMV1bMF0gPT0gJ3InKSB7CiAJCWludCAgbm9kZW9mZnNldDsJLyogbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KIAkJaW50ICBlcnI7CiAKQEAgLTQwMiwxNyArMjY1LDE0IEBACiAJCSAqIEdldCB0aGUgcGF0aC4gIFRoZSByb290IG5vZGUgaXMgYW4gb2RkYmFsbCwgdGhlIG9mZnNldAogCQkgKiBpcyB6ZXJvIGFuZCBoYXMgbm8gbmFtZS4KIAkJICovCi0JCWlmIChzdHJjbXAoYXJndlsyXSwgIi8iKSA9PSAwKSB7Ci0JCQlub2Rlb2Zmc2V0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZkdCwgYXJndlsyXSk7Ci0JCQlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJCQkvKgotCQkJCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCi0JCQkJICovCi0JCQkJcHJpbnRmICgibGliZmR0ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOwotCQkJCXJldHVybiAxOwotCQkJfQorCQlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsIGFyZ3ZbMl0pOworCQlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJCS8qCisJCQkgKiBOb3QgZm91bmQgb3Igc29tZXRoaW5nIGVsc2UgYmFkIGhhcHBlbmVkLgorCQkJICovCisJCQlwcmludGYgKCJsaWJmZHQgZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkgcmV0dXJuZWQgJXNcbiIsCisJCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKKwkJCXJldHVybiAxOwogCQl9CiAJCS8qCiAJCSAqIERvIHRoZSBkZWxldGUuICBBIGZvdXJ0aCBwYXJhbWV0ZXIgbWVhbnMgZGVsZXRlIGEgcHJvcGVydHksCkBAIC00MjEsMzkgKzI4MSw0MCBAQAogCQlpZiAoYXJnYyA+IDMpIHsKIAkJCWVyciA9IGZkdF9kZWxwcm9wKGZkdCwgbm9kZW9mZnNldCwgYXJndlszXSk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCXByaW50ZigiZmR0X2RlbHByb3AgbGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJCXByaW50ZigibGliZmR0IGZkdF9kZWxwcm9wKCk6ICAlc1xuIiwKKwkJCQkJZmR0X3N0cmVycm9yKGVycikpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQllcnIgPSBmZHRfZGVsX25vZGUoZmR0LCBub2Rlb2Zmc2V0KTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJcHJpbnRmKCJmZHRfZGVsX25vZGUgbGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJCXByaW50ZigibGliZmR0IGZkdF9kZWxfbm9kZSgpOiAgJXNcbiIsCisJCQkJCWZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBDcmVhdGUgYSBjaG9zZW4gbm9kZQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgaWYgKG9wID09ICdjJykgeworCX0KKyNpZmRlZiBDT05GSUdfT0ZfQk9BUkRfU0VUVVAKKwkvKiBDYWxsIHRoZSBib2FyZC1zcGVjaWZpYyBmaXh1cCByb3V0aW5lICovCisJZWxzZSBpZiAoYXJndlsxXVswXSA9PSAnYicpCisJCWZ0X2JvYXJkX3NldHVwKGZkdCwgZ2QtPmJkKTsKKyNlbmRpZgorCS8qIENyZWF0ZSBhIGNob3NlbiBub2RlICovCisJZWxzZSBpZiAoYXJndlsxXVswXSA9PSAnYycpCiAJCWZkdF9jaG9zZW4oZmR0LCAwLCAwLCAxKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIENyZWF0ZSBhIHUtYm9vdC1lbnYgbm9kZQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgaWYgKG9wID09ICdlJykgeworI2lmZGVmIENPTkZJR19PRl9IQVNfVUJPT1RfRU5WCisJLyogQ3JlYXRlIGEgdS1ib290LWVudiBub2RlICovCisJZWxzZSBpZiAoYXJndlsxXVswXSA9PSAnZScpCiAJCWZkdF9lbnYoZmR0KTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIENyZWF0ZSBhIGJkX3Qgbm9kZQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgaWYgKG9wID09ICdiJykgeworI2VuZGlmCisjaWZkZWYgQ09ORklHX09GX0hBU19CRF9UCisJLyogQ3JlYXRlIGEgYmRfdCBub2RlICovCisJZWxzZSBpZiAoYXJndlsxXVswXSA9PSAnYicpCiAJCWZkdF9iZF90KGZkdCk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBVbnJlY29nbml6ZWQgY29tbWFuZAotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgeworI2VuZGlmCisJZWxzZSB7CisJCS8qIFVucmVjb2duaXplZCBjb21tYW5kICovCiAJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CiAJCXJldHVybiAxOwogCX0KQEAgLTQ2MSw3ICszMjIsNyBAQAogCXJldHVybiAwOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGludCBmZHRfdmFsaWQodm9pZCkKIHsKQEAgLTQ3NywxOSArMzM4LDIxIEBACiAJCXJldHVybiAxOwkvKiB2YWxpZCAqLwogCiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRmKCJsaWJmZHQ6ICVzIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoImxpYmZkdCBmZHRfY2hlY2tfaGVhZGVyKCk6ICVzIiwgZmR0X3N0cmVycm9yKGVycikpOwogCQkvKgogCQkgKiBCZSBtb3JlIGluZm9ybWF0aXZlIG9uIGJhZCB2ZXJzaW9uLgogCQkgKi8KIAkJaWYgKGVyciA9PSAtRkRUX0VSUl9CQURWRVJTSU9OKSB7CiAJCQlpZiAoZmR0X3ZlcnNpb24oZmR0KSA8IEZEVF9GSVJTVF9TVVBQT1JURURfVkVSU0lPTikgewogCQkJCXByaW50ZiAoIiAtIHRvbyBvbGQsIGZkdCAkZCA8ICVkIiwKLQkJCQkJZmR0X3ZlcnNpb24oZmR0KSwgRkRUX0ZJUlNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKKwkJCQkJZmR0X3ZlcnNpb24oZmR0KSwKKwkJCQkJRkRUX0ZJUlNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKIAkJCQlmZHQgPSBOVUxMOwogCQkJfQogCQkJaWYgKGZkdF9sYXN0X2NvbXBfdmVyc2lvbihmZHQpID4gRkRUX0xBU1RfU1VQUE9SVEVEX1ZFUlNJT04pIHsKIAkJCQlwcmludGYgKCIgLSB0b28gbmV3LCBmZHQgJGQgPiAlZCIsCi0JCQkJCWZkdF92ZXJzaW9uKGZkdCksIEZEVF9MQVNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKKwkJCQkJZmR0X3ZlcnNpb24oZmR0KSwKKwkJCQkJRkRUX0xBU1RfU1VQUE9SVEVEX1ZFUlNJT04pOwogCQkJCWZkdCA9IE5VTEw7CiAJCQl9CiAJCQlyZXR1cm4gMDsKQEAgLTUwMCwxMyArMzYzLDkxIEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogT0YgZmxhdCB0cmVlIGhhbmRsaW5nCi0gKiBXcml0dGVuIGJ5OiBQYW50ZWxpcyBBbnRvbmlvdSA8cGFudGVsaXMuYW50b25pb3VAZ21haWwuY29tPgotICogVXBkYXRlZCBieTogTWF0dGhldyBNY0NsaW50b2NrIDxtc21AZnJlZXNjYWxlLmNvbT4KLSAqIENvbnZlcnRlZCB0byBsaWJmZHQgYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisgKiBQYXJzZSB0aGUgdXNlcidzIGlucHV0LCBwYXJ0aWFsbHkgaGV1cmlzdGljLiAgVmFsaWQgZm9ybWF0czoKKyAqIDwwMD4JCS0gaGV4IGJ5dGUKKyAqIDwwMDExPgktIGhleCBoYWxmIHdvcmQgKDE2IGJpdHMpCisgKiA8MDAxMTIyMzM+CS0gaGV4IHdvcmQgKDMyIGJpdHMpCisgKgkJLSBoZXggZG91YmxlIHdvcmRzICg2NCBiaXRzKSBhcmUgbm90IHN1cHBvcnRlZCwgbXVzdCB1c2UKKyAqCQkJYSBieXRlIHN0cmVhbSBpbnN0ZWFkLgorICogWzAwIDExIDIyIC4uIG5uXSAtIGJ5dGUgc3RyZWFtCisgKiAic3RyaW5nIgktIElmIHRoZSB0aGUgdmFsdWUgZG9lc24ndCBzdGFydCB3aXRoICI8IiBvciAiWyIsIGl0IGlzCisgKgkJCXRyZWF0ZWQgYXMgYSBzdHJpbmcuICBOb3RlIHRoYXQgdGhlIHF1b3RlcyBhcmUKKyAqCQkJc3RyaXBwZWQgYnkgdGhlIHBhcnNlciBiZWZvcmUgd2UgZ2V0IHRoZSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbnQgZmR0X3BhcnNlX3Byb3AoY2hhciAqcGF0aHAsIGNoYXIgKnByb3AsIGNoYXIgKm5ld3ZhbCwKKwljaGFyICpkYXRhLCBpbnQgKmxlbikKK3sKKwljaGFyICpjcDsJCS8qIHRlbXBvcmFyeSBjaGFyIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIHRtcDsJLyogaG9sZHMgY29udmVydGVkIHZhbHVlcyAqLworCisJaWYgKCpuZXd2YWwgPT0gJzwnKSB7CisJCS8qCisJCSAqIEJpZ2dlciB2YWx1ZXMgdGhhbiBieXRlcy4KKwkJICovCisJCSpsZW4gPSAwOworCQluZXd2YWwrKzsKKwkJd2hpbGUgKCgqbmV3dmFsICE9ICc+JykgJiYgKCpuZXd2YWwgIT0gJ1wwJykpIHsKKwkJCWNwID0gbmV3dmFsOworCQkJdG1wID0gc2ltcGxlX3N0cnRvdWwoY3AsICZuZXd2YWwsIDE2KTsKKwkJCWlmICgobmV3dmFsIC0gY3ApIDw9IDIpIHsKKwkJCQkqZGF0YSA9IHRtcCAmIDB4RkY7CisJCQkJZGF0YSAgKz0gMTsKKwkJCQkqbGVuICs9IDE7CisJCQl9IGVsc2UgaWYgKChuZXd2YWwgLSBjcCkgPD0gNCkgeworCQkJCSoodWludDE2X3QgKilkYXRhID0gX19jcHVfdG9fYmUxNih0bXApOworCQkJCWRhdGEgICs9IDI7CisJCQkJKmxlbiArPSAyOworCQkJfSBlbHNlIGlmICgobmV3dmFsIC0gY3ApIDw9IDgpIHsKKwkJCQkqKHVpbnQzMl90ICopZGF0YSA9IF9fY3B1X3RvX2JlMzIodG1wKTsKKwkJCQlkYXRhICArPSA0OworCQkJCSpsZW4gKz0gNDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCJTb3JyeSwgSSBjb3VsZCBub3QgY29udmVydCBcIiVzXCJcbiIsCisJCQkJCWNwKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXdoaWxlICgqbmV3dmFsID09ICcgJykKKwkJCQluZXd2YWwrKzsKKwkJfQorCQlpZiAoKm5ld3ZhbCAhPSAnPicpIHsKKwkJCXByaW50ZigiVW5leHBlY3RlZCBjaGFyYWN0ZXIgJyVjJ1xuIiwgKm5ld3ZhbCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSBpZiAoKm5ld3ZhbCA9PSAnWycpIHsKKwkJLyoKKwkJICogQnl0ZSBzdHJlYW0uICBDb252ZXJ0IHRoZSB2YWx1ZXMuCisJCSAqLworCQkqbGVuID0gMDsKKwkJbmV3dmFsKys7CisJCXdoaWxlICgoKm5ld3ZhbCAhPSAnXScpICYmICgqbmV3dmFsICE9ICdcMCcpKSB7CisJCQl0bXAgPSBzaW1wbGVfc3RydG91bChuZXd2YWwsICZuZXd2YWwsIDE2KTsKKwkJCSpkYXRhKysgPSB0bXAgJiAweEZGOworCQkJKmxlbiAgICA9ICpsZW4gKyAxOworCQkJd2hpbGUgKCpuZXd2YWwgPT0gJyAnKQorCQkJCW5ld3ZhbCsrOworCQl9CisJCWlmICgqbmV3dmFsICE9ICddJykgeworCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnJWMnXG4iLCAqbmV3dmFsKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQXNzdW1lIGl0IGlzIGEgc3RyaW5nLiAgQ29weSBpdCBpbnRvIG91ciBkYXRhIGFyZWEgZm9yCisJCSAqIGNvbnZlbmllbmNlIChpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nICdcMCcpLgorCQkgKi8KKwkJKmxlbiA9IHN0cmxlbihuZXd2YWwpICsgMTsKKwkJc3RyY3B5KGRhdGEsIG5ld3ZhbCk7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhldXJpc3RpYyB0byBndWVzcyBpZiB0aGlzIGlzIGEgc3RyaW5nIG9yIGNvbmNhdGVuYXRlZCBzdHJpbmdzLgogICovCiAKIHN0YXRpYyBpbnQgaXNfcHJpbnRhYmxlX3N0cmluZyhjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQpAQCAtNTQ2LDYgKzQ4NywxMiBAQAogCXJldHVybiAxOwogfQogCisKKy8qCisgKiBQcmludCB0aGUgcHJvcGVydHkgaW4gdGhlIGJlc3QgZm9ybWF0LCBhIGhldXJpc3RpYyBndWVzcy4gIFByaW50IGFzCisgKiBhIHN0cmluZywgY29uY2F0ZW5hdGVkIHN0cmluZ3MsIGEgYnl0ZSwgd29yZCwgZG91YmxlIHdvcmQsIG9yIChpZiBhbGwKKyAqIGVsc2UgZmFpbHMpIGl0IGlzIHByaW50ZWQgYXMgYSBzdHJlYW0gb2YgYnl0ZXMuCisgKi8KIHN0YXRpYyB2b2lkIHByaW50X2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKIHsKIAlpbnQgajsKQEAgLTYwMSwzMiArNTQ4LDE0NiBAQAogCX0KIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBSZWN1cnNpdmVseSBwcmludCAoYSBwb3J0aW9uIG9mKSB0aGUgZmR0LiAgVGhlIGRlcHRoIHBhcmFtZXRlcgorICogZGV0ZXJtaW5lcyBob3cgZGVlcGx5IG5lc3RlZCB0aGUgZmR0IGlzIHByaW50ZWQuCisgKi8KK3N0YXRpYyBpbnQgZmR0X3ByaW50KGNoYXIgKnBhdGhwLCBjaGFyICpwcm9wLCBpbnQgZGVwdGgpCit7CisJc3RhdGljIGludCBvZmZzdGFja1tNQVhfTEVWRUxdOworCXN0YXRpYyBjaGFyIHRhYnNbTUFYX0xFVkVMKzFdID0KKwkJIlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IgorCQkiXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQiOworCXZvaWQgKm5vZGVwOwkJLyogcHJvcGVydHkgbm9kZSBwb2ludGVyICovCisJaW50ICBub2Rlb2Zmc2V0OwkvKiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCWludCAgbmV4dG9mZnNldDsJLyogbmV4dCBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCXVpbnQzMl90IHRhZzsJCS8qIHRhZyAqLworCWludCAgbGVuOwkJLyogbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLworCWludCAgbGV2ZWwgPSAwOwkJLyoga2VlcCB0cmFjayBvZiBuZXN0aW5nIGxldmVsICovCisKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsIHBhdGhwKTsKKwlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJLyoKKwkJICogTm90IGZvdW5kIG9yIHNvbWV0aGluZyBlbHNlIGJhZCBoYXBwZW5lZC4KKwkJICovCisJCXByaW50ZiAoImxpYmZkdCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoKSByZXR1cm5lZCAlc1xuIiwKKwkJCWZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CisJCXJldHVybiAxOworCX0KKwkvKgorCSAqIFRoZSB1c2VyIHBhc3NlZCBpbiBhIHByb3BlcnR5IGFzIHdlbGwgYXMgbm9kZSBwYXRoLgorCSAqIFByaW50IG9ubHkgdGhlIGdpdmVuIHByb3BlcnR5IGFuZCB0aGVuIHJldHVybi4KKwkgKi8KKwlpZiAocHJvcCkgeworCQlub2RlcCA9IGZkdF9nZXRwcm9wIChmZHQsIG5vZGVvZmZzZXQsIHByb3AsICZsZW4pOworCQlpZiAobGVuID09IDApIHsKKwkJCS8qIG5vIHByb3BlcnR5IHZhbHVlICovCisJCQlwcmludGYoIiVzICVzXG4iLCBwYXRocCwgcHJvcCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChsZW4gPiAwKSB7CisJCQlwcmludGYoIiVzPSIsIHByb3ApOworCQkJcHJpbnRfZGF0YSAobm9kZXAsIGxlbik7CisJCQlwcmludGYoIlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoImxpYmZkdCBmZHRfZ2V0cHJvcCgpOiAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3IobGVuKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qCisJICogVGhlIHVzZXIgcGFzc2VkIGluIGEgbm9kZSBwYXRoIGFuZCBubyBwcm9wZXJ0eSwKKwkgKiBwcmludCB0aGUgbm9kZSBhbmQgYWxsIHN1Ym5vZGVzLgorCSAqLworCW9mZnN0YWNrWzBdID0gbm9kZW9mZnNldDsKKworCXdoaWxlKGxldmVsID49IDApIHsKKwkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgbm9kZW9mZnNldCwgJm5leHRvZmZzZXQsICZwYXRocCk7CisJCXN3aXRjaCh0YWcpIHsKKwkJY2FzZSBGRFRfQkVHSU5fTk9ERToKKwkJCWlmKGxldmVsIDw9IGRlcHRoKQorCQkJCXByaW50ZigiJXMlcyB7XG4iLAorCQkJCQkmdGFic1tNQVhfTEVWRUwgLSBsZXZlbF0sIHBhdGhwKTsKKwkJCWxldmVsKys7CisJCQlvZmZzdGFja1tsZXZlbF0gPSBub2Rlb2Zmc2V0OworCQkJaWYgKGxldmVsID49IE1BWF9MRVZFTCkgeworCQkJCXByaW50ZigiQWFhaWlpIDxzcGxhdD4gbmVzdGVkIHRvbyBkZWVwLiAiCisJCQkJCSJBYm9ydGluZy5cbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRkRUX0VORF9OT0RFOgorCQkJbGV2ZWwtLTsKKwkJCWlmKGxldmVsIDw9IGRlcHRoKQorCQkJCXByaW50ZigiJXN9O1xuIiwgJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdKTsKKwkJCWlmIChsZXZlbCA9PSAwKSB7CisJCQkJbGV2ZWwgPSAtMTsJCS8qIGV4aXQgdGhlIGxvb3AgKi8KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZEVF9QUk9QOgorCQkJbm9kZXAgPSBmZHRfZ2V0cHJvcCAoZmR0LCBvZmZzdGFja1tsZXZlbF0sIHBhdGhwLCAmbGVuKTsKKwkJCWlmIChsZW4gPCAwKSB7CisJCQkJcHJpbnRmICgibGliZmR0IGZkdF9nZXRwcm9wKCk6ICVzXG4iLAorCQkJCQlmZHRfc3RyZXJyb3IobGVuKSk7CisJCQkJcmV0dXJuIDE7CisJCQl9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisJCQkJLyogdGhlIHByb3BlcnR5IGhhcyBubyB2YWx1ZSAqLworCQkJCWlmKGxldmVsIDw9IGRlcHRoKQorCQkJCQlwcmludGYoIiVzJXM7XG4iLAorCQkJCQkJJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdLAorCQkJCQkJcGF0aHApOworCQkJfSBlbHNlIHsKKwkJCQlpZihsZXZlbCA8PSBkZXB0aCkgeworCQkJCQlwcmludGYoIiVzJXM9IiwKKwkJCQkJCSZ0YWJzW01BWF9MRVZFTCAtIGxldmVsXSwKKwkJCQkJCXBhdGhwKTsKKwkJCQkJcHJpbnRfZGF0YSAobm9kZXAsIGxlbik7CisJCQkJCXByaW50ZigiO1xuIik7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRkRUX05PUDoKKwkJCWJyZWFrOworCQljYXNlIEZEVF9FTkQ6CisJCQlyZXR1cm4gMTsKKwkJZGVmYXVsdDoKKwkJCWlmKGxldmVsIDw9IGRlcHRoKQorCQkJCXByaW50ZigiVW5rbm93biB0YWcgMHglMDhYXG4iLCB0YWcpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbm9kZW9mZnNldCA9IG5leHRvZmZzZXQ7CisJfQorCXJldHVybiAwOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIFVfQk9PVF9DTUQoCiAJZmR0LAk1LAkwLAlkb19mZHQsCiAJImZkdCAgICAgLSBmbGF0dGVuZWQgZGV2aWNlIHRyZWUgdXRpbGl0eSBjb21tYW5kc1xuIiwKIAkgICAgImFkZHIgICA8YWRkcj4gWzxsZW5ndGg+XSAgICAgICAgLSBTZXQgdGhlIGZkdCBsb2NhdGlvbiB0byA8YWRkcj5cbiIKKyNpZmRlZiBDT05GSUdfT0ZfQk9BUkRfU0VUVVAKKwkiZmR0IGJvYXJkc2V0dXAgICAgICAgICAgICAgICAgICAgICAgLSBEbyBib2FyZC1zcGVjaWZpYyBzZXQgdXBcbiIKKyNlbmRpZgogCSJmZHQgbW92ZSAgIDxmZHQ+IDxuZXdhZGRyPiA8bGVuZ3RoPiAtIENvcHkgdGhlIGZkdCB0byA8YWRkcj5cbiIKIAkiZmR0IHByaW50ICA8cGF0aD4gWzxwcm9wPl0gICAgICAgICAgLSBSZWN1cnNpdmUgcHJpbnQgc3RhcnRpbmcgYXQgPHBhdGg+XG4iCiAJImZkdCBsaXN0ICAgPHBhdGg+IFs8cHJvcD5dICAgICAgICAgIC0gUHJpbnQgb25lIGxldmVsIHN0YXJ0aW5nIGF0IDxwYXRoPlxuIgogCSJmZHQgc2V0ICAgIDxwYXRoPiA8cHJvcD4gWzx2YWw+XSAgICAtIFNldCA8cHJvcGVydHk+IFt0byA8dmFsPl1cbiIKIAkiZmR0IG1rbm9kZSA8cGF0aD4gPG5vZGU+ICAgICAgICAgICAgLSBDcmVhdGUgYSBuZXcgbm9kZSBhZnRlciA8cGF0aD5cbiIKIAkiZmR0IHJtICAgICA8cGF0aD4gWzxwcm9wPl0gICAgICAgICAgLSBEZWxldGUgdGhlIG5vZGUgb3IgPHByb3BlcnR5PlxuIgotCSJmZHQgY2hvc2VuIC0gQWRkL3VwZGF0ZSB0aGUgXCIvY2hvc2VuXCIgYnJhbmNoIGluIHRoZSB0cmVlXG4iCisJImZkdCBjaG9zZW4gLSBBZGQvdXBkYXRlIHRoZSAvY2hvc2VuIGJyYW5jaCBpbiB0aGUgdHJlZVxuIgogI2lmZGVmIENPTkZJR19PRl9IQVNfVUJPT1RfRU5WCi0JImZkdCBlbnYgICAgLSBBZGQvcmVwbGFjZSB0aGUgXCIvdS1ib290LWVudlwiIGJyYW5jaCBpbiB0aGUgdHJlZVxuIgorCSJmZHQgZW52ICAgIC0gQWRkL3JlcGxhY2UgdGhlIC91LWJvb3QtZW52IGJyYW5jaCBpbiB0aGUgdHJlZVxuIgogI2VuZGlmCiAjaWZkZWYgQ09ORklHX09GX0hBU19CRF9UCi0JImZkdCBiZF90ICAgLSBBZGQvcmVwbGFjZSB0aGUgXCIvYmRfdFwiIGJyYW5jaCBpbiB0aGUgdHJlZVxuIgorCSJmZHQgYmRfdCAgIC0gQWRkL3JlcGxhY2UgdGhlIC9iZF90IGJyYW5jaCBpbiB0aGUgdHJlZVxuIgogI2VuZGlmCiAJIkhpbnRzOlxuIgotCSIgKiBTZXQgYSBsYXJnZXIgbGVuZ3RoIHdpdGggdGhlIGZkdCBhZGRyIGNvbW1hbmQgdG8gYWRkIHRvIHRoZSBibG9iLlxuIgotCSIgKiBJZiB0aGUgcHJvcGVydHkgeW91IGFyZSBzZXR0aW5nL3ByaW50aW5nIGhhcyBhICcjJyBjaGFyYWN0ZXIsXG4iCi0JIiAgICAgeW91IE1VU1QgZXNjYXBlIGl0IHdpdGggYSBcXCBjaGFyYWN0ZXIgb3IgcXVvdGUgaXQgd2l0aCBcIiBvclxuIgotCSIgICAgIGl0IHdpbGwgYmUgaWdub3JlZCBhcyBhIGNvbW1lbnQuXG4iCi0JIiAqIElmIHRoZSB2YWx1ZSBoYXMgc3BhY2VzIGluIGl0LCB5b3UgTVVTVCBlc2NhcGUgdGhlIHNwYWNlcyB3aXRoXG4iCi0JIiAgICAgXFwgY2hhcmFjdGVycyBvciBxdW90ZSBpdCB3aXRoIFwiXCJcbiIKKwkiIElmIHRoZSBwcm9wZXJ0eSB5b3UgYXJlIHNldHRpbmcvcHJpbnRpbmcgaGFzIGEgJyMnIGNoYXJhY3RlciBvciBzcGFjZXMsXG4iCisJIiAgICAgeW91IE1VU1QgZXNjYXBlIGl0IHdpdGggYSBcXCBjaGFyYWN0ZXIgb3IgcXVvdGUgaXQgd2l0aCBcIi5cbiIKIAkiRXhhbXBsZXM6IGZkdCBwcmludCAvICAgICAgICAgICAgICAgIyBwcmludCB0aGUgd2hvbGUgdHJlZVxuIgogCSIgICAgICAgICAgZmR0IHByaW50IC9jcHVzIFwiI2FkZHJlc3MtY2VsbHNcIlxuIgogCSIgICAgICAgICAgZmR0IHNldCAgIC9jcHVzIFwiI2FkZHJlc3MtY2VsbHNcIiBcIlswMCAwMCAwMCAwMV1cIlxuIgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9mbGFzaC5jIGIvY29tbW9uL2NtZF9mbGFzaC5jCmluZGV4IGEzNGFiNzkuLjExYzg4NTcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZmxhc2guYworKysgYi9jb21tb24vY21kX2ZsYXNoLmMKQEAgLTMxLDkgKzMxLDkgQEAKICNpbmNsdWRlIDxkYXRhZmxhc2guaD4KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CiAKIC8qIHBhcml0aW9uIGhhbmRsaW5nIHJvdXRpbmVzICovCkBAIC0zMTEsNyArMzExLDcgQEAKIAlmbGFzaF9pbmZvX3QgKmluZm87CiAJdWxvbmcgYmFuaywgYWRkcl9maXJzdCwgYWRkcl9sYXN0OwogCWludCBuLCBzZWN0X2ZpcnN0LCBzZWN0X2xhc3Q7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogCXN0cnVjdCBtdGRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKIAl1OCBkZXZfdHlwZSwgZGV2X251bSwgcG51bTsKQEAgLTM0Myw3ICszNDMsNyBAQAogCQlyZXR1cm4gcmNvZGU7CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogCS8qIGVyYXNlIDxwYXJ0LWlkPiAtIGVyYXNlIHBhcnRpdGlvbiAqLwogCWlmICgoYXJnYyA9PSAyKSAmJiAoaWRfcGFyc2UoYXJndlsxXSwgTlVMTCwgJmRldl90eXBlLCAmZGV2X251bSkgPT0gMCkpIHsKIAkJbXRkcGFydHNfaW5pdCgpOwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJZmxhc2hfaW5mb190ICppbmZvOwogCXVsb25nIGJhbmssIGFkZHJfZmlyc3QsIGFkZHJfbGFzdDsKIAlpbnQgaSwgcCwgbiwgc2VjdF9maXJzdCwgc2VjdF9sYXN0OwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OwogCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQ7CiAJdTggZGV2X3R5cGUsIGRldl9udW0sIHBudW07CkBAIC01MzksNyArNTM5LDcgQEAKIAkJcmV0dXJuIHJjb2RlOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAkvKiBwcm90ZWN0IG9uL29mZiA8cGFydC1pZD4gKi8KIAlpZiAoKGFyZ2MgPT0gMykgJiYgKGlkX3BhcnNlKGFyZ3ZbMl0sIE5VTEwsICZkZXZfdHlwZSwgJmRldl9udW0pID09IDApKSB7CiAJCW10ZHBhcnRzX2luaXQoKTsKQEAgLTY3Miw3ICs2NzIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCiAjIGRlZmluZSBUTVBfRVJBU0UJImVyYXNlIDxwYXJ0LWlkPlxuICAgIC0gZXJhc2UgcGFydGl0aW9uXG4iCiAjIGRlZmluZSBUTVBfUFJPVF9PTgkicHJvdGVjdCBvbiA8cGFydC1pZD5cbiAgICAtIHByb3RlY3QgcGFydGl0aW9uXG4iCiAjIGRlZmluZSBUTVBfUFJPVF9PRkYJInByb3RlY3Qgb2ZmIDxwYXJ0LWlkPlxuICAgIC0gbWFrZSBwYXJ0aXRpb24gd3JpdGFibGVcbiIKQEAgLTczMiw0ICs3MzIsNCBAQAogI3VuZGVmCVRNUF9QUk9UX09OCiAjdW5kZWYJVE1QX1BST1RfT0ZGCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0ZMQVNIICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZnBnYS5jIGIvY29tbW9uL2NtZF9mcGdhLmMKaW5kZXggMzQ0NDA5MS4uM2ZjNGZjYSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9mcGdhLmMKKysrIGIvY29tbW9uL2NtZF9mcGdhLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpbmNsdWRlIDxuZXQuaD4KICNlbmRpZgogI2luY2x1ZGUgPGZwZ2EuaD4KQEAgLTQzLDcgKzQzLDcgQEAKICNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDT05GSUdfRlBHQSkgJiYgKCBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZQR0EgKQorI2lmIGRlZmluZWQgKENPTkZJR19GUEdBKSAmJiBkZWZpbmVkKENPTkZJR19DTURfRlBHQSkKIAogLyogTG9jYWwgZnVuY3Rpb25zICovCiBzdGF0aWMgdm9pZCBmcGdhX3VzYWdlIChjbWRfdGJsX3QgKiBjbWR0cCk7CkBAIC0zMjEsNCArMzIxLDQgQEAKIAkgICAgIlx0bG9hZGJcdExvYWQgZGV2aWNlIGZyb20gYml0c3RyZWFtIGJ1ZmZlciAoWGlsaW54IGRldmljZXMgb25seSlcbiIKIAkgICAgIlx0bG9hZG1rXHRMb2FkIGRldmljZSBnZW5lcmF0ZWQgd2l0aCBta2ltYWdlXG4iCiAJICAgICJcdGR1bXBcdExvYWQgZGV2aWNlIHRvIG1lbW9yeSBidWZmZXJcbiIpOwotI2VuZGlmIC8qIENPTkZJR19GUEdBICYmIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRlBHQSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2kyYy5jIGIvY29tbW9uL2NtZF9pMmMuYwppbmRleCA3NTU4MTBkLi5hNjg0YTU4IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2kyYy5jCisrKyBiL2NvbW1vbi9jbWRfaTJjLmMKQEAgLTg2LDcgKzg2LDcgQEAKICNpbmNsdWRlIDxpMmMuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAogCiAvKiBEaXNwbGF5IHZhbHVlcyBmcm9tIGxhc3QgY29tbWFuZC4KQEAgLTY1Nyw3ICs2NTcsNyBAQAogICogVGhlIFNEUkFNIGNvbW1hbmQgaXMgc2VwYXJhdGVseSBjb25maWd1cmVkIGJlY2F1c2UgbWFueQogICogKG1vc3Q/KSBlbWJlZGRlZCBib2FyZHMgZG9uJ3QgdXNlIFNEUkFNIERJTU1zLgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCiAvKgogICogU3ludGF4OgpAQCAtODc3LDcgKzg3Nyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1NEUkFNICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19DTURfVFJFRSkKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfTVVMVElfQlVTKQpAQCAtOTM4LDEwICs5MzgsMTAgQEAKIAkJcmV0dXJuIGRvX2kyY19wcm9iZShjbWR0cCwgZmxhZywgLS1hcmdjLCArK2FyZ3YpOwogCWlmICghc3RybmNtcChhcmd2WzFdLCAibG8iLCAyKSkKIAkJcmV0dXJuIGRvX2kyY19sb29wKGNtZHRwLCBmbGFnLCAtLWFyZ2MsICsrYXJndik7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCWlmICghc3RybmNtcChhcmd2WzFdLCAic2QiLCAyKSkKIAkJcmV0dXJuIGRvX3NkcmFtKGNtZHRwLCBmbGFnLCAtLWFyZ2MsICsrYXJndik7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9TRFJBTSAqLworI2VuZGlmCiAJZWxzZQogCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwogCXJldHVybiAwOwpAQCAtOTY1LDkgKzk2NSw5IEBACiAJImkyYyBjcmMzMiBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gY291bnQgLSBjb21wdXRlIENSQzMyIGNoZWNrc3VtXG4iCiAJImkyYyBwcm9iZSAtIHNob3cgZGV2aWNlcyBvbiB0aGUgSTJDIGJ1c1xuIgogCSJpMmMgbG9vcCBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gWyMgb2Ygb2JqZWN0c10gLSBsb29waW5nIHJlYWQgb2YgZGV2aWNlXG4iCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCSJpMmMgc2RyYW0gY2hpcCAtIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25cbiIKLSNlbmRpZiAgLyogQ0ZHX0NNRF9TRFJBTSAqLworI2VuZGlmCiApOwogI2VuZGlmIC8qIENPTkZJR19JMkNfQ01EX1RSRUUgKi8KIFVfQk9PVF9DTUQoCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogCSIgICAgLSBsb29wLCByZWFkaW5nIGEgc2V0IG9mIGFkZHJlc3Nlc1xuIgogKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NEUkFNKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TRFJBTSkKIFVfQk9PVF9DTUQoCiAJaXNkcmFtLAkyLAkxLAlkb19zZHJhbSwKIAkiaXNkcmFtICAtIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25cbiIsCkBAIC0xMDI1LDQgKzEwMjUsNCBAQAogKTsKICNlbmRpZgogCi0jZW5kaWYJLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9pZGUuYyBiL2NvbW1vbi9jbWRfaWRlLmMKaW5kZXggZTMwODQ3NC4uODlmZWZlZCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9pZGUuYworKysgYi9jb21tb24vY21kX2lkZS5jCkBAIC01OSwxMyArNTksNiBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfSURFXzh4eF9ESVJFQ1QKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogI2VuZGlmCkBAIC03OCw3ICs3MSw3IEBACiAjIGRlZmluZSBTWU5DCQkvKiBub3RoaW5nICovCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCiAjaWZkZWYgQ09ORklHX0lERV84eHhfRElSRUNUCiAvKiBUaW1pbmdzIGZvciBJREUgSW50ZXJmYWNlCkBAIC0xODUsNiArMTc4LDkgQEAKIHN0YXRpYyB2b2lkIG91dHB1dF9kYXRhKGludCBkZXYsIHVsb25nICpzZWN0X2J1ZiwgaW50IHdvcmRzKTsKIHN0YXRpYyB2b2lkIGlkZW50X2NweSAodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAorI2lmbmRlZiBDRkdfQVRBX1BPUlRfQUREUgorI2RlZmluZSBDRkdfQVRBX1BPUlRfQUREUihwb3J0KSAocG9ydCkKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FUQVBJCiBzdGF0aWMgdm9pZAlhdGFwaV9pbnF1aXJ5KGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKQEAgLTM4Miw2ICszNzgsNyBAQAogCWltYWdlX2hlYWRlcl90ICpoZHI7CiAJaW50IHJjb2RlID0gMDsKIAorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDEpOwogCXN3aXRjaCAoYXJnYykgewogCWNhc2UgMToKIAkJYWRkciA9IENGR19MT0FEX0FERFI7CkBAIC0zOTcsNDQgKzM5NCw1MCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNDIpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg0Mik7CiAKIAlpZiAoIWJvb3RfZGV2aWNlKSB7CiAJCXB1dHMgKCJcbioqIE5vIGJvb3QgZGV2aWNlICoqXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTQzKTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDMpOwogCiAJZGV2ID0gc2ltcGxlX3N0cnRvdWwoYm9vdF9kZXZpY2UsICZlcCwgMTYpOwogCiAJaWYgKGlkZV9kZXZfZGVzY1tkZXZdLnR5cGU9PURFVl9UWVBFX1VOS05PV04pIHsKIAkJcHJpbnRmICgiXG4qKiBEZXZpY2UgJWQgbm90IGF2YWlsYWJsZVxuIiwgZGV2KTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTQ0KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDQpOwogCiAJaWYgKCplcCkgewogCQlpZiAoKmVwICE9ICc6JykgewogCQkJcHV0cyAoIlxuKiogSW52YWxpZCBib290IGRldmljZSwgdXNlIGBkZXZbOnBhcnRdJyAqKlxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTQ1KTsKIAkJCXJldHVybiAxOwogCQl9CiAJCXBhcnQgPSBzaW1wbGVfc3RydG91bCgrK2VwLCBOVUxMLCAxNik7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDUpOwogCWlmIChnZXRfcGFydGl0aW9uX2luZm8gKCZpZGVfZGV2X2Rlc2NbZGV2XSwgcGFydCwgJmluZm8pKSB7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC00Nik7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDQ2KTsKIAlpZiAoKHN0cm5jbXAoKGNoYXIgKilpbmZvLnR5cGUsIEJPT1RfUEFSVF9UWVBFLCBzaXplb2YoaW5mby50eXBlKSkgIT0gMCkgJiYKIAkgICAgKHN0cm5jbXAoKGNoYXIgKilpbmZvLnR5cGUsIEJPT1RfUEFSVF9DT01QLCBzaXplb2YoaW5mby50eXBlKSkgIT0gMCkpIHsKIAkJcHJpbnRmICgiXG4qKiBJbnZhbGlkIHBhcnRpdGlvbiB0eXBlIFwiJS4zMnNcIiIKIAkJCSIgKGV4cGVjdCBcIiIgQk9PVF9QQVJUX1RZUEUgIlwiKVxuIiwKIAkJCWluZm8udHlwZSk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC00Nyk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDQ3KTsKIAogCXByaW50ZiAoIlxuTG9hZGluZyBmcm9tIElERSBkZXZpY2UgJWQsIHBhcnRpdGlvbiAlZDogIgogCQkiTmFtZTogJS4zMnMgIFR5cGU6ICUuMzJzXG4iLApAQCAtNDQ1LDI2ICs0NDgsMjkgQEAKIAogCWlmIChpZGVfZGV2X2Rlc2NbZGV2XS5ibG9ja19yZWFkIChkZXYsIGluZm8uc3RhcnQsIDEsICh1bG9uZyAqKWFkZHIpICE9IDEpIHsKIAkJcHJpbnRmICgiKiogUmVhZCBlcnJvciBvbiAlZDolZFxuIiwgZGV2LCBwYXJ0KTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTQ4KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDgpOwogCiAJaGRyID0gKGltYWdlX2hlYWRlcl90ICopYWRkcjsKIAogCWlmIChudG9obChoZHItPmloX21hZ2ljKSAhPSBJSF9NQUdJQykgewogCQlwcmludGYoIlxuKiogQmFkIE1hZ2ljIE51bWJlciAqKlxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC00OSk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDQ5KTsKIAogCWNoZWNrc3VtID0gbnRvaGwoaGRyLT5paF9oY3JjKTsKIAloZHItPmloX2hjcmMgPSAwOwogCiAJaWYgKGNyYzMyICgwLCAodWNoYXIgKiloZHIsIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpICE9IGNoZWNrc3VtKSB7CiAJCXB1dHMgKCJcbioqIEJhZCBIZWFkZXIgQ2hlY2tzdW0gKipcbiIpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0yKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTApOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg1MCk7CiAJaGRyLT5paF9oY3JjID0gaHRvbmwoY2hlY2tzdW0pOyAvKiByZXN0b3JlIGNoZWNrc3VtIGZvciBsYXRlciB1c2UgKi8KIAogCXByaW50X2ltYWdlX2hkciAoaGRyKTsKQEAgLTQ3Nyw5ICs0ODMsMTAgQEAKIAlpZiAoaWRlX2Rldl9kZXNjW2Rldl0uYmxvY2tfcmVhZCAoZGV2LCBpbmZvLnN0YXJ0KzEsIGNudCwKIAkJICAgICAgKHVsb25nICopKGFkZHIraW5mby5ibGtzeikpICE9IGNudCkgewogCQlwcmludGYgKCIqKiBSZWFkIGVycm9yIG9uICVkOiVkXG4iLCBkZXYsIHBhcnQpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTEpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg1MSk7CiAKIAogCS8qIExvYWRpbmcgb2ssIHVwZGF0ZSBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwpAQCAtODA3LDEzICs4MTQsMTMgQEAKIAogCS8qIEVuc3VyZSBJL08gb3BlcmF0aW9ucyBjb21wbGV0ZSAqLwogCUVJRUlPOwotCSooKHVjaGFyICopKEFUQV9DVVJSX0JBU0UoZGV2KStwb3J0KSkgPSB2YWw7CisJKigodTE2ICopKEFUQV9DVVJSX0JBU0UoZGV2KStDRkdfQVRBX1BPUlRfQUREUihwb3J0KSkpID0gdmFsOwogfQogI2Vsc2UJLyogISBfX1BQQ19fICovCiBzdGF0aWMgdm9pZCBfX2lubGluZV9fCiBpZGVfb3V0YihpbnQgZGV2LCBpbnQgcG9ydCwgdW5zaWduZWQgY2hhciB2YWwpCiB7Ci0Jb3V0Yih2YWwsIEFUQV9DVVJSX0JBU0UoZGV2KStwb3J0KTsKKwlvdXRiKHZhbCwgQVRBX0NVUlJfQkFTRShkZXYpK0NGR19BVEFfUE9SVF9BRERSKHBvcnQpKTsKIH0KICNlbmRpZgkvKiBfX1BQQ19fICovCiAKQEAgLTgyNSw3ICs4MzIsNyBAQAogCXVjaGFyIHZhbDsKIAkvKiBFbnN1cmUgSS9PIG9wZXJhdGlvbnMgY29tcGxldGUgKi8KIAlFSUVJTzsKLQl2YWwgPSAqKCh1Y2hhciAqKShBVEFfQ1VSUl9CQVNFKGRldikrcG9ydCkpOworCXZhbCA9ICooKHUxNiAqKShBVEFfQ1VSUl9CQVNFKGRldikrQ0ZHX0FUQV9QT1JUX0FERFIocG9ydCkpKTsKIAlkZWJ1ZyAoImlkZV9pbmIgKGRldj0gJWQsIHBvcnQ9IDB4JXgpIDogQCAweCUwOGx4IC0+IDB4JTAyeFxuIiwKIAkJZGV2LCBwb3J0LCAoQVRBX0NVUlJfQkFTRShkZXYpK3BvcnQpLCB2YWwpOwogCXJldHVybiAodmFsKTsKQEAgLTgzNCw3ICs4NDEsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgX19pbmxpbmVfXwogaWRlX2luYihpbnQgZGV2LCBpbnQgcG9ydCkKIHsKLSAgcmV0dXJuIGluYihBVEFfQ1VSUl9CQVNFKGRldikrcG9ydCk7CisgIHJldHVybiBpbmIoQVRBX0NVUlJfQkFTRShkZXYpK0NGR19BVEFfUE9SVF9BRERSKHBvcnQpKTsKIH0KICNlbmRpZgkvKiBfX1BQQ19fICovCiAKQEAgLTg5MSw2ICs4OTgsOSBAQAogI2lmZGVmIF9fTUlQU19fCiAJCSpkYnVmKysgPSBzd2FiMTZwKCh1MTYqKXBidWYpOwogCQkqZGJ1ZisrID0gc3dhYjE2cCgodTE2KilwYnVmKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BDUzQ0MEVQKQorCQkqZGJ1ZisrID0gKnBidWY7CisJCSpkYnVmKysgPSAqcGJ1ZjsKICNlbHNlCiAJCSpkYnVmKysgPSBsZF9sZTE2KHBidWYpOwogCQkqZGJ1ZisrID0gbGRfbGUxNihwYnVmKTsKQEAgLTkzMCwxMCArOTQwLDE4IEBACiAJcGJ1ZiA9ICh1c2hvcnQgKikoQVRBX0NVUlJfQkFTRShkZXYpK0FUQV9EQVRBX1JFRyk7CiAJZGJ1ZiA9ICh1c2hvcnQgKilzZWN0X2J1ZjsKIAl3aGlsZSAod29yZHMtLSkgeworI2lmIGRlZmluZWQoQ09ORklHX1BDUzQ0MEVQKQorCQkvKiBub3QgdGVzdGVkLCBiZWNhdXNlIENGIHdhcyB3cml0ZSBwcm90ZWN0ZWQgKi8KKwkJRUlFSU87CisJCSpwYnVmID0gbGRfbGUxNihkYnVmKyspOworCQlFSUVJTzsKKwkJKnBidWYgPSBsZF9sZTE2KGRidWYrKyk7CisjZWxzZQogCQlFSUVJTzsKIAkJKnBidWYgPSAqZGJ1ZisrOwogCQlFSUVJTzsKIAkJKnBidWYgPSAqZGJ1ZisrOworI2VuZGlmCiAJfQogI2VuZGlmCiB9CkBAIC05ODEsMTAgKzk5OSwxNyBAQAogCWRlYnVnKCJpbiBpbnB1dCBkYXRhIGJhc2UgZm9yIHJlYWQgaXMgJWx4XG4iLCAodW5zaWduZWQgbG9uZykgcGJ1Zik7CiAKIAl3aGlsZSAod29yZHMtLSkgeworI2lmIGRlZmluZWQoQ09ORklHX1BDUzQ0MEVQKQorCQlFSUVJTzsKKwkJKmRidWYrKyA9IGxkX2xlMTYocGJ1Zik7CisJCUVJRUlPOworCQkqZGJ1ZisrID0gbGRfbGUxNihwYnVmKTsKKyNlbHNlCiAJCUVJRUlPOwogCQkqZGJ1ZisrID0gKnBidWY7CiAJCUVJRUlPOwogCQkqZGJ1ZisrID0gKnBidWY7CisjZW5kaWYKIAl9CiAjZW5kaWYKIH0KQEAgLTIwODAsNCArMjEwNSw0IEBACiAJImxvYWRBZGRyIGRldjpwYXJ0XG4iCiApOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9pbW1hcC5jIGIvY29tbW9uL2NtZF9pbW1hcC5jCmluZGV4IGZhNzliNDUuLmFlOTU3NTggMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfaW1tYXAuYworKysgYi9jb21tb24vY21kX2ltbWFwLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JTU1BUCkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JTU1BUCkgJiYgXAogICAgIChkZWZpbmVkKENPTkZJR184eHgpIHx8IGRlZmluZWQoQ09ORklHXzgyNjApKQogCiAjaWYgZGVmaW5lZChDT05GSUdfOHh4KQpAQCAtNzIwLDQgKzcyMCw0IEBACiApOwogCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0lNTUFQICYmIChDT05GSUdfOHh4IHx8IENPTkZJR184MjYwKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2l0ZXN0LmMgYi9jb21tb24vY21kX2l0ZXN0LmMKaW5kZXggOGFkMTM0Zi4uOGUyMDUxNyAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9pdGVzdC5jCisrKyBiL2NvbW1vbi9jbWRfaXRlc3QuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lURVNUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JVEVTVCkKIAogI2RlZmluZSBFUQkwCiAjZGVmaW5lIE5FCTEKQEAgLTE5Nyw0ICsxOTcsNCBAQAogCSJpdGVzdFx0LSByZXR1cm4gdHJ1ZS9mYWxzZSBvbiBpbnRlZ2VyIGNvbXBhcmVcbiIsCiAJIlsuYiwgLncsIC5sLCAuc10gWypddmFsdWUxIDxvcD4gWypddmFsdWUyXG4iCiApOwotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVRFU1QgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9qZmZzMi5jIGIvY29tbW9uL2NtZF9qZmZzMi5jCmluZGV4IDdmZDFmYTMuLjUxM2EyMjYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfamZmczIuYworKysgYi9jb21tb24vY21kX2pmZnMyLmMKQEAgLTk0LDE4ICs5NCwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAjaW5jbHVkZSA8Y3JhbWZzL2NyYW1mc19mcy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpZmRlZiBDRkdfTkFORF9MRUdBQ1kKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KICNlbHNlIC8qICFDRkdfTkFORF9MRUdBQ1kgKi8KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPG5hbmQuaD4KICNlbmRpZiAvKiAhQ0ZHX05BTkRfTEVHQUNZICovCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgKi8KKyNlbmRpZgogLyogZW5hYmxlL2Rpc2FibGUgZGVidWdnaW5nIG1lc3NhZ2VzICovCiAjZGVmaW5lCURFQlVHX0pGRlMKICN1bmRlZglERUJVR19KRkZTCkBAIC0zMjEsNyArMzIxLDcgQEAKICAqLwogc3RhdGljIGludCBwYXJ0X3ZhbGlkYXRlX25vcihzdHJ1Y3QgbXRkaWRzICppZCwgc3RydWN0IHBhcnRfaW5mbyAqcGFydCkKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpCiAJLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMgKi8KIAlleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsKIAlmbGFzaF9pbmZvX3QgKmZsYXNoOwpAQCAtMzcwLDcgKzM3MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcGFydF92YWxpZGF0ZV9uYW5kKHN0cnVjdCBtdGRpZHMgKmlkLCBzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0KQogewotI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJLyogaW5mbyBmb3IgTkFORCBjaGlwcyAqLwogCW5hbmRfaW5mb190ICpuYW5kOwogCkBAIC03MTksNyArNzE5LDcgQEAKIHN0YXRpYyBpbnQgZGV2aWNlX3ZhbGlkYXRlKHU4IHR5cGUsIHU4IG51bSwgdTMyICpzaXplKQogewogCWlmICh0eXBlID09IE1URF9ERVZfVFlQRV9OT1IpIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpCiAJCWlmIChudW0gPCBDRkdfTUFYX0ZMQVNIX0JBTktTKSB7CiAJCQlleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsKIAkJCSpzaXplID0gZmxhc2hfaW5mb1tudW1dLnNpemU7CkBAIC03MzMsNyArNzMzLDcgQEAKIAkJcHJpbnRmKCJzdXBwb3J0IGZvciBGTEFTSCBkZXZpY2VzIG5vdCBwcmVzZW50XG4iKTsKICNlbmRpZgogCX0gZWxzZSBpZiAodHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkgewotI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJCWlmIChudW0gPCBDRkdfTUFYX05BTkRfREVWSUNFKSB7CiAjaWZuZGVmIENGR19OQU5EX0xFR0FDWQogCQkJKnNpemUgPSBuYW5kX2luZm9bbnVtXS5zaXplOwpAQCAtMjE5Miw0ICsyMTkyLDQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9sb2FkLmMgYi9jb21tb24vY21kX2xvYWQuYwppbmRleCBmNjNiOGU4Li4yMDRjM2ViIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2xvYWQuYworKysgYi9jb21tb24vY21kX2xvYWQuYwpAQCAtMzMsMjQgKzMzLDI0IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTE9BREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0xPQURCKQogc3RhdGljIHVsb25nIGxvYWRfc2VyaWFsX3ltb2RlbSAodWxvbmcgb2Zmc2V0KTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTE9BRFMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0xPQURTKQogc3RhdGljIHVsb25nIGxvYWRfc2VyaWFsICh1bG9uZyBvZmZzZXQpOwogc3RhdGljIGludCByZWFkX3JlY29yZCAoY2hhciAqYnVmLCB1bG9uZyBsZW4pOwotIyBpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQVZFUykKKyMgaWYgZGVmaW5lZChDT05GSUdfQ01EX1NBVkVTKQogc3RhdGljIGludCBzYXZlX3NlcmlhbCAodWxvbmcgb2Zmc2V0LCB1bG9uZyBzaXplKTsKIHN0YXRpYyBpbnQgd3JpdGVfcmVjb3JkIChjaGFyICpidWYpOwotIyBlbmRpZiAvKiBDRkdfQ01EX1NBVkVTICovCisjZW5kaWYKIAogc3RhdGljIGludCBkb19lY2hvID0gMTsKLSNlbmRpZiAvKiBDRkdfQ01EX0xPQURTICovCisjZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0xPQURTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9MT0FEUykKIGludCBkb19sb2FkX3NlcmlhbCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJdWxvbmcgb2Zmc2V0ID0gMDsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCXJldHVybiAocCAtIGJ1Zik7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQVZFUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0FWRVMpCiAKIGludCBkb19zYXZlX3NlcmlhbCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0zOTksMTMgKzM5OSwxNSBAQAogCX0KIAlyZXR1cm4gKDApOwogfQotIyBlbmRpZiAvKiBDRkdfQ01EX1NBVkVTICovCisjIGVuZGlmCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0xPQURTICovCisjZW5kaWYKIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTE9BREIpICAvKiBsb2FkYiBjb21tYW5kIChsb2FkIGJpbmFyeSkgaW5jbHVkZWQgKi8KLQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9MT0FEQikKKy8qCisgKiBsb2FkYiBjb21tYW5kIChsb2FkIGJpbmFyeSkgaW5jbHVkZWQKKyAqLwogI2RlZmluZSBYT05fQ0hBUiAgICAgICAgMTcKICNkZWZpbmUgWE9GRl9DSEFSICAgICAgIDE5CiAjZGVmaW5lIFNUQVJUX0NIQVIgICAgICAweDAxCkBAIC0xMDM2LDExICsxMDM4LDExIEBACiAJcmV0dXJuIG9mZnNldDsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfTE9BREIgKi8KKyNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTE9BRFMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0xPQURTKQogCiAjaWZkZWYJQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCiBVX0JPT1RfQ01EKApAQCAtMTA2NSw3ICsxMDY3LDcgQEAKICAqLwogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQVZFUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0FWRVMpCiAjaWZkZWYJQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCiBVX0JPT1RfQ01EKAogCXNhdmVzLCA0LCAwLAlkb19zYXZlX3NlcmlhbCwKQEAgLTEwODIsMTEgKzEwODQsMTEgQEAKIAkiICAgIC0gc2F2ZSBTLVJlY29yZCBmaWxlIG92ZXIgc2VyaWFsIGxpbmUgd2l0aCBvZmZzZXQgJ29mZicgYW5kIHNpemUgJ3NpemUnXG4iCiApOwogI2VuZGlmCS8qIENGR19MT0FEU19CQVVEX0NIQU5HRSAqLwotI2VuZGlmCS8qIENGR19DTURfU0FWRVMgKi8KLSNlbmRpZgkvKiBDRkdfQ01EX0xPQURTICovCisjZW5kaWYKKyNlbmRpZgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9MT0FEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTE9BREIpCiBVX0JPT1RfQ01EKAogCWxvYWRiLCAzLCAwLAlkb19sb2FkX3NlcmlhbF9iaW4sCiAJImxvYWRiICAgLSBsb2FkIGJpbmFyeSBmaWxlIG92ZXIgc2VyaWFsIGxpbmUgKGtlcm1pdCBtb2RlKVxuIiwKQEAgLTExMDMsMTEgKzExMDUsMTEgQEAKIAkiIHdpdGggb2Zmc2V0ICdvZmYnIGFuZCBiYXVkcmF0ZSAnYmF1ZCdcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0xPQURCICovCisjZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0hXRkxPVykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSFdGTE9XKQogaW50IGRvX2h3ZmxvdyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJZXh0ZXJuIGludCBod2Zsb3dfb25vZmYoaW50KTsKQEAgLTExMzMsNCArMTEzNSw0IEBACiAJIltvbnxvZmZdXG4gLSBjaGFuZ2UgUlRTL0NUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgb3ZlciBzZXJpYWwgbGluZVxuIgogKTsKIAotI2VuZGlmIC8qIENGR19DTURfSFdGTE9XICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbWVtLmMgYi9jb21tb24vY21kX21lbS5jCmluZGV4IGZjYmIwMjMuLmE5OTQyMTEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbWVtLmMKKysrIGIvY29tbW9uL2NtZF9tZW0uYwpAQCAtMjksMTggKzI5LDE5IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTU1DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NTUMpCiAjaW5jbHVkZSA8bW1jLmg+CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFTX0RBVEFGTEFTSAogI2luY2x1ZGUgPGRhdGFmbGFzaC5oPgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgKENGR19DTURfTUVNT1JZCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX0lURVNUCXwgXAotCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQlDTURfQ01EX1BPUlRJTwkpICkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUVNT1JZKQkJXAorICAgIHx8IGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCQlcCisgICAgfHwgZGVmaW5lZChDT05GSUdfQ01EX0lURVNUKQlcCisgICAgfHwgZGVmaW5lZChDT05GSUdfQ01EX1BDSSkJCVwKKyAgICB8fCBkZWZpbmVkKENPTkZJR19DTURfUE9SVElPKQorCiBpbnQgY21kX2dldF9kYXRhX3NpemUoY2hhciogYXJnLCBpbnQgZGVmYXVsdF9zaXplKQogewogCS8qIENoZWNrIGZvciBhIHNpemUgc3BlY2lmaWNhdGlvbiAuYiwgLncgb3IgLmwuCkBAIC02NCw3ICs2NSw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01FTU9SWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUVNT1JZKQogCiAjaWZkZWYJQ01EX01FTV9ERUJVRwogI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCkBAIC00MDMsNyArNDA0LDcgQEAKIAl9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01NQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTU1DKQogCWlmIChtbWMyaW5mbyhkZXN0KSkgewogCQlpbnQgcmM7CiAKQEAgLTExNDksNyArMTE1MCw3IEBACiAjZW5kaWYJLyogQ09ORklHX0NSQzMyX1ZFUklGWSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUVNT1JZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NRU1PUlkpCiBVX0JPT1RfQ01EKAogCW1kLCAgICAgMywgICAgIDEsICAgICAgZG9fbWVtX21kLAogCSJtZCAgICAgIC0gbWVtb3J5IGRpc3BsYXlcbiIsCkBAIC0xMjUyLDQgKzEyNTMsNCBAQAogI2VuZGlmIC8qIENPTkZJR19NWF9DWUNMSUMgKi8KIAogI2VuZGlmCi0jZW5kaWYJLyogQ0ZHX0NNRF9NRU1PUlkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9tZnNsLmMgYi9jb21tb24vY21kX21mc2wuYwppbmRleCBmZmEyNjY2Li44ZDRjMWEzIDEwMDY0NAotLS0gYS9jb21tb24vY21kX21mc2wuYworKysgYi9jb21tb24vY21kX21mc2wuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01GU0wpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01GU0wpCiAjaW5jbHVkZSA8YXNtL2FzbS5oPgogCiBpbnQgZG9fZnJkIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCkBAIC00MTQsNCArNDE0LDQgQEAKIAkJIiAxIC0gRUFSIC0gRXhjZXB0aW9uIGFkZHJlc3MgcmVnaXN0ZXJcbiIKIAkJIiAyIC0gRVNSIC0gRXhjZXB0aW9uIHN0YXR1cyByZWdpc3RlclxuIik7CiAKLSNlbmRpZgkJCQkvKiBDT05GSUdfTUlDUk9CTEFaRSAmIENGR19DTURfTUZTTCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX21paS5jIGIvY29tbW9uL2NtZF9taWkuYwppbmRleCBlNjU5NTM2Li5mNmI5OGQxIDEwMDY0NAotLS0gYS9jb21tb24vY21kX21paS5jCisrKyBiL2NvbW1vbi9jbWRfbWlpLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNpbmNsdWRlIDxtaWlwaHkuaD4KIAogI2lmZGVmIENPTkZJR19URVJTRV9NSUkKQEAgLTU5NSw0ICs1OTUsNCBAQAogCiAjZW5kaWYgLyogQ09ORklHX1RFUlNFX01JSSAqLwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9NSUkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9taXNjLmMgYi9jb21tb24vY21kX21pc2MuYwppbmRleCBhOTkyMjJkLi5jMGM2YjhmIDEwMDY0NAotLS0gYS9jb21tb24vY21kX21pc2MuYworKysgYi9jb21tb24vY21kX21pc2MuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JU0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JU0MpCiAKIGludCBkb19zbGVlcCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC01Miw3ICs1Miw3IEBACiB9CiAKIC8qIEltcGxlbWVudGVkIGluICQoQ1BVKS9pbnRlcnJ1cHRzLmMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKIGludCBkb19pcnFpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CiAKIFVfQk9PVF9DTUQoCkBAIC02MCw3ICs2MCw3IEBACiAJImlycWluZm8gLSBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBJUlFzXG4iLAogCU5VTEwKICk7Ci0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKIAogVV9CT09UX0NNRCgKIAlzbGVlcCAsICAgIDIsICAgIDEsICAgICBkb19zbGVlcCwKQEAgLTY5LDQgKzY5LDQgQEAKIAkiICAgIC0gZGVsYXkgZXhlY3V0aW9uIGZvciBOIHNlY29uZHMgKE4gaXMgX2RlY2ltYWxfICEhISlcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX01JU0MgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9tbWMuYyBiL2NvbW1vbi9jbWRfbW1jLmMKaW5kZXggNTczZWI5Ny4uMDY5YzZkMCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9tbWMuYworKysgYi9jb21tb24vY21kX21tYy5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTU1DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NTUMpCiAKICNpbmNsdWRlIDxtbWMuaD4KIApAQCAtNDMsNCArNDMsNCBAQAogCU5VTEwKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX01NQyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX25hbmQuYyBiL2NvbW1vbi9jbWRfbmFuZC5jCmluZGV4IDllZjMxZDQuLjI1NGE3NzUgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbmFuZC5jCisrKyBiL2NvbW1vbi9jbWRfbmFuZC5jCkBAIC0xOSwyNCArMTksMTYgQEAKICAqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDx3YXRjaGRvZy5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLQotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgogI2luY2x1ZGUgPG5hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAogLyogcGFyaXRpb24gaGFuZGxpbmcgcm91dGluZXMgKi8KIGludCBtdGRwYXJ0c19pbml0KHZvaWQpOwpAQCAtMTA0LDcgKzk2LDcgQEAKIGFyZ19vZmZfc2l6ZShpbnQgYXJnYywgY2hhciAqYXJndltdLCBuYW5kX2luZm9fdCAqbmFuZCwgdWxvbmcgKm9mZiwgdWxvbmcgKnNpemUpCiB7CiAJaW50IGlkeCA9IG5hbmRfY3Vycl9kZXZpY2U7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogCXN0cnVjdCBtdGRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKIAl1OCBwbnVtOwpAQCAtMTUyLDcgKzE0NCw3IEBACiAJCSpzaXplID0gbmFuZC0+c2l6ZSAtICpvZmY7CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIG91dDoKICNlbmRpZgogCXByaW50ZigiZGV2aWNlICVkICIsIGlkeCk7CkBAIC01MDMsMTcgKzQ5NSwxOSBAQAogCiAJaWYgKHIpIHsKIAkJcHV0cygiKiogUmVhZCBlcnJvclxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTU2KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNTYpOwogCiAJaGRyID0gKGltYWdlX2hlYWRlcl90ICopIGFkZHI7CiAKIAlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKIAkJcHJpbnRmKCJcbioqIEJhZCBNYWdpYyBOdW1iZXIgMHgleCAqKlxuIiwgaGRyLT5paF9tYWdpYyk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTU3KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNTcpOwogCiAJcHJpbnRfaW1hZ2VfaGRyKGhkcik7CiAKQEAgLTUzMiw5ICs1MjYsMTAgQEAKIAogCWlmIChyKSB7CiAJCXB1dHMoIioqIFJlYWQgZXJyb3JcbiIpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC01OCk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDU4KTsKIAogCS8qIExvYWRpbmcgb2ssIHVwZGF0ZSBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogCkBAIC01NjEsNyArNTU2LDcgQEAKIAljaGFyICpib290X2RldmljZSA9IE5VTEw7CiAJaW50IGlkeDsKIAl1bG9uZyBhZGRyLCBvZmZzZXQgPSAwOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OwogCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQ7CiAJdTggcG51bTsKQEAgLTU4Niw2ICs1ODEsNyBAQAogCX0KICNlbmRpZgogCisJc2hvd19ib290X3Byb2dyZXNzKDUyKTsKIAlzd2l0Y2ggKGFyZ2MpIHsKIAljYXNlIDE6CiAJCWFkZHIgPSBDRkdfTE9BRF9BRERSOwpAQCAtNjA1LDI3ICs2MDEsMzAgQEAKIAkJb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOwogCQlicmVhazsKIAlkZWZhdWx0OgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIHVzYWdlOgogI2VuZGlmCiAJCXByaW50ZigiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKLQkJU0hPV19CT09UX1BST0dSRVNTKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzKC01Myk7CiAJCXJldHVybiAxOwogCX0KIAorCXNob3dfYm9vdF9wcm9ncmVzcyg1Myk7CiAJaWYgKCFib290X2RldmljZSkgewogCQlwdXRzKCJcbioqIE5vIGJvb3QgZGV2aWNlICoqXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzKC01NCk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MoNTQpOwogCiAJaWR4ID0gc2ltcGxlX3N0cnRvdWwoYm9vdF9kZXZpY2UsIE5VTEwsIDE2KTsKIAogCWlmIChpZHggPCAwIHx8IGlkeCA+PSBDRkdfTUFYX05BTkRfREVWSUNFIHx8ICFuYW5kX2luZm9baWR4XS5uYW1lKSB7CiAJCXByaW50ZigiXG4qKiBEZXZpY2UgJWQgbm90IGF2YWlsYWJsZVxuIiwgaWR4KTsKLQkJU0hPV19CT09UX1BST0dSRVNTKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzKC01NSk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MoNTUpOwogCiAJcmV0dXJuIG5hbmRfbG9hZF9pbWFnZShjbWR0cCwgJm5hbmRfaW5mb1tpZHhdLCBvZmZzZXQsIGFkZHIsIGFyZ3ZbMF0pOwogfQpAQCAtNjM0LDcgKzYzMyw3IEBACiAJIm5ib290ICAgLSBib290IGZyb20gTkFORCBkZXZpY2VcbiIsCiAJIlsuamZmczJdIFtwYXJ0aXRpb25dIHwgW1tbbG9hZEFkZHJdIGRldl0gb2Zmc2V0XVxuIik7CiAKLSNlbmRpZgkJCQkvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCiAKICNlbHNlIC8qIENGR19OQU5EX0xFR0FDWSAqLwogLyoKQEAgLTY0NywxNCArNjQ2LDE0IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKKyNpZmRlZiBDT05GSUdfc2hvd19ib290X3Byb2dyZXNzCiAjIGluY2x1ZGUgPHN0YXR1c19sZWQuaD4KLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCisjIGRlZmluZSBzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQlzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQogI2Vsc2UKLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCisjIGRlZmluZSBzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogI2lmIDAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9pZHMuaD4KQEAgLTkxNCw2ICs5MTMsNyBAQAogCXVsb25nIG9mZnNldCA9IDA7CiAJaW1hZ2VfaGVhZGVyX3QgKmhkcjsKIAlpbnQgcmNvZGUgPSAwOworCXNob3dfYm9vdF9wcm9ncmVzcyAoNTIpOwogCXN3aXRjaCAoYXJnYykgewogCWNhc2UgMToKIAkJYWRkciA9IENGR19MT0FEX0FERFI7CkBAIC05MzQsMjQgKzkzNCwyNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTMpOwogCQlyZXR1cm4gMTsKIAl9CiAKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDUzKTsKIAlpZiAoIWJvb3RfZGV2aWNlKSB7CiAJCXB1dHMgKCJcbioqIE5vIGJvb3QgZGV2aWNlICoqXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTU0KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNTQpOwogCiAJZGV2ID0gc2ltcGxlX3N0cnRvdWwoYm9vdF9kZXZpY2UsICZlcCwgMTYpOwogCiAJaWYgKChkZXYgPj0gQ0ZHX01BWF9OQU5EX0RFVklDRSkgfHwKIAkgICAgKG5hbmRfZGV2X2Rlc2NbZGV2XS5DaGlwSUQgPT0gTkFORF9DaGlwSURfVU5LTk9XTikpIHsKIAkJcHJpbnRmICgiXG4qKiBEZXZpY2UgJWQgbm90IGF2YWlsYWJsZVxuIiwgZGV2KTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTU1KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNTUpOwogCiAJcHJpbnRmICgiXG5Mb2FkaW5nIGZyb20gZGV2aWNlICVkOiAlcyBhdCAweCVseCAob2Zmc2V0IDB4JWx4KVxuIiwKIAkJZGV2LCBuYW5kX2Rldl9kZXNjW2Rldl0ubmFtZSwgbmFuZF9kZXZfZGVzY1tkZXZdLklPX0FERFIsCkBAIC05NjAsOSArOTYzLDEwIEBACiAJaWYgKG5hbmRfbGVnYWN5X3J3IChuYW5kX2Rldl9kZXNjICsgZGV2LCBOQU5EUldfUkVBRCwgb2Zmc2V0LAogCQkJU0VDVE9SU0laRSwgTlVMTCwgKHVfY2hhciAqKWFkZHIpKSB7CiAJCXByaW50ZiAoIioqIFJlYWQgZXJyb3Igb24gJWRcbiIsIGRldik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC01Nik7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDU2KTsKIAogCWhkciA9IChpbWFnZV9oZWFkZXJfdCAqKWFkZHI7CiAKQEAgLTk3NCwxNyArOTc4LDE5IEBACiAJCWNudCAtPSBTRUNUT1JTSVpFOwogCX0gZWxzZSB7CiAJCXByaW50ZiAoIlxuKiogQmFkIE1hZ2ljIE51bWJlciAweCV4ICoqXG4iLCBudG9obChoZHItPmloX21hZ2ljKSk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC01Nyk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDU3KTsKIAogCWlmIChuYW5kX2xlZ2FjeV9ydyAobmFuZF9kZXZfZGVzYyArIGRldiwgTkFORFJXX1JFQUQsCiAJCQlvZmZzZXQgKyBTRUNUT1JTSVpFLCBjbnQsIE5VTEwsCiAJCQkodV9jaGFyICopKGFkZHIrU0VDVE9SU0laRSkpKSB7CiAJCXByaW50ZiAoIioqIFJlYWQgZXJyb3Igb24gJWRcbiIsIGRldik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC01OCk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDU4KTsKIAogCS8qIExvYWRpbmcgb2ssIHVwZGF0ZSBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogCkBAIC0xMDEyLDYgKzEwMTgsNiBAQAogCSJsb2FkQWRkciBkZXZcbiIKICk7CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCiAKICNlbmRpZiAvKiBDRkdfTkFORF9MRUdBQ1kgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbmV0LmMgYi9jb21tb24vY21kX25ldC5jCmluZGV4IDJjYjJjNWQuLjA3MTVmYmMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbmV0LmMKKysrIGIvY29tbW9uL2NtZF9uZXQuYwpAQCAtMjgsOCArMjgsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxuZXQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKLQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIGV4dGVybiBpbnQgZG9fYm9vdG0gKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOwogCkBAIC02OCw3ICs2Nyw3IEBACiAJIltsb2FkQWRkcmVzc10gW2Jvb3RmaWxlbmFtZV1cbiIKICk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogaW50IGRvX2RoY3AgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCXJldHVybiBuZXRib290X2NvbW1vbihESENQLCBjbWR0cCwgYXJnYywgYXJndik7CkBAIC03OSw5ICs3OCw5IEBACiAJImRoY3BcdC0gaW52b2tlIERIQ1AgY2xpZW50IHRvIG9idGFpbiBJUC9ib290IHBhcmFtc1xuIiwKIAkiXG4iCiApOwotI2VuZGlmCS8qIENGR19DTURfREhDUCAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIGludCBkb19uZnMgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCXJldHVybiBuZXRib290X2NvbW1vbihORlMsIGNtZHRwLCBhcmdjLCBhcmd2KTsKQEAgLTkyLDcgKzkxLDcgQEAKIAkibmZzXHQtIGJvb3QgaW1hZ2UgdmlhIG5ldHdvcmsgdXNpbmcgTkZTIHByb3RvY29sXG4iLAogCSJbbG9hZEFkZHJlc3NdIFtob3N0IGlwIGFkZHI6Ym9vdGZpbGVuYW1lXVxuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX05GUyAqLworI2VuZGlmCiAKIHN0YXRpYyB2b2lkIG5ldGJvb3RfdXBkYXRlX2VudiAodm9pZCkKIHsKQEAgLTEyOCw3ICsxMjcsNyBAQAogCQlpcF90b19zdHJpbmcgKE5ldE91ckROU0lQLCB0bXApOwogCQlzZXRlbnYgKCJkbnNpcCIsIHRtcCk7CiAJfQotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9ETlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0ROUzIpCiAJaWYgKE5ldE91ckROUzJJUCkgewogCQlpcF90b19zdHJpbmcgKE5ldE91ckROUzJJUCwgdG1wKTsKIAkJc2V0ZW52ICgiZG5zaXAyIiwgdG1wKTsKQEAgLTEzNywxMyArMTM2LDE1IEBACiAJaWYgKE5ldE91ck5JU0RvbWFpblswXSkKIAkJc2V0ZW52ICgiZG9tYWluIiwgTmV0T3VyTklTRG9tYWluKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApICYmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9USU1FT0ZGU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKSBcCisgICAgJiYgZGVmaW5lZChDT05GSUdfQk9PVFBfVElNRU9GRlNFVCkKIAlpZiAoTmV0VGltZU9mZnNldCkgewogCQlzcHJpbnRmICh0bXAsICIlZCIsIE5ldFRpbWVPZmZzZXQpOwogCQlzZXRlbnYgKCJ0aW1lb2Zmc2V0IiwgdG1wKTsKIAl9CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKSAmJiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfTlRQU0VSVkVSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKSBcCisgICAgJiYgZGVmaW5lZChDT05GSUdfQk9PVFBfTlRQU0VSVkVSKQogCWlmIChOZXROdHBTZXJ2ZXJJUCkgewogCQlpcF90b19zdHJpbmcgKE5ldE50cFNlcnZlcklQLCB0bXApOwogCQlzZXRlbnYgKCJudHBzZXJ2ZXJpcCIsIHRtcCk7CkBAIC0xODQsMTggKzE4NSwyNSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6IHByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTgwKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JaWYgKChzaXplID0gTmV0TG9vcChwcm90bykpIDwgMCkKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDgwKTsKKwlpZiAoKHNpemUgPSBOZXRMb29wKHByb3RvKSkgPCAwKSB7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTgxKTsKIAkJcmV0dXJuIDE7CisJfQogCisJc2hvd19ib290X3Byb2dyZXNzICg4MSk7CiAJLyogTmV0TG9vcCBvaywgdXBkYXRlIGVudmlyb25tZW50ICovCiAJbmV0Ym9vdF91cGRhdGVfZW52KCk7CiAKIAkvKiBkb25lIGlmIG5vIGZpbGUgd2FzIGxvYWRlZCAobm8gZXJyb3JzIHRob3VnaCkgKi8KLQlpZiAoc2l6ZSA9PSAwKQorCWlmIChzaXplID09IDApIHsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtODIpOwogCQlyZXR1cm4gMDsKKwl9CiAKIAkvKiBmbHVzaCBjYWNoZSAqLwogCWZsdXNoX2NhY2hlKGxvYWRfYWRkciwgc2l6ZSk7CkBAIC0yMDgsMTkgKzIxNiwyNSBAQAogCiAJCXByaW50ZiAoIkF1dG9tYXRpYyBib290IG9mIGltYWdlIGF0IGFkZHIgMHglMDhsWCAuLi5cbiIsCiAJCQlsb2FkX2FkZHIpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDgyKTsKIAkJcmNvZGUgPSBkb19ib290bSAoY21kdHAsIDAsIDEsIGxvY2FsX2FyZ3MpOwogCX0KIAogI2lmZGVmIENPTkZJR19BVVRPU0NSSVBUCiAJaWYgKCgocyA9IGdldGVudigiYXV0b3NjcmlwdCIpKSAhPSBOVUxMKSAmJiAoc3RyY21wKHMsInllcyIpID09IDApKSB7CiAJCXByaW50ZigiUnVubmluZyBhdXRvc2NyaXB0IGF0IGFkZHIgMHglMDhsWCAuLi5cbiIsIGxvYWRfYWRkcik7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoODMpOwogCQlyY29kZSA9IGF1dG9zY3JpcHQgKGxvYWRfYWRkcik7CiAJfQogI2VuZGlmCisJaWYgKHJjb2RlIDwgMCkKKwkJc2hvd19ib290X3Byb2dyZXNzICgtODMpOworCWVsc2UKKwkJc2hvd19ib290X3Byb2dyZXNzICg4NCk7CiAJcmV0dXJuIHJjb2RlOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIGludCBkb19waW5nIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpZiAoYXJnYyA8IDIpCkBAIC0yNDcsOSArMjYxLDkgQEAKIAkicGluZ1x0LSBzZW5kIElDTVAgRUNIT19SRVFVRVNUIHRvIG5ldHdvcmsgaG9zdFxuIiwKIAkicGluZ0FkZHJlc3NcbiIKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9QSU5HICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCiBzdGF0aWMgdm9pZCBjZHBfdXBkYXRlX2Vudih2b2lkKQogewpAQCAtMjkwLDkgKzMwNCw5IEBACiAJY2RwLAkxLAkxLAlkb19jZHAsCiAJImNkcFx0LSBQZXJmb3JtIENEUCBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiIsCiApOwotI2VuZGlmCS8qIENGR19DTURfQ0RQICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiBpbnQgZG9fc250cCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJY2hhciAqdG9mZjsKQEAgLTMyOCw2ICszNDIsNiBAQAogCSJzbnRwXHQtIHN5bmNocm9uaXplIFJUQyB2aWEgbmV0d29ya1xuIiwKIAkiW05UUCBzZXJ2ZXIgSVBdXG4iCiApOwotI2VuZGlmCS8qIENGR19DTURfU05UUCAqLworI2VuZGlmCiAKLSNlbmRpZgkvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX252ZWRpdC5jIGIvY29tbW9uL2NtZF9udmVkaXQuYwppbmRleCA5NzdlYzViLi4xZGIwZmMzIDEwMDY0NAotLS0gYS9jb21tb24vY21kX252ZWRpdC5jCisrKyBiL2NvbW1vbi9jbWRfbnZlZGl0LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpbmNsdWRlIDxzZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAjaW5jbHVkZSA8bmV0Lmg+CiAjZW5kaWYKIApAQCAtMTkzLDcgKzE5MywxMiBAQAogCQkgKiBFdGhlcm5ldCBBZGRyZXNzIGFuZCBzZXJpYWwjIGNhbiBiZSBzZXQgb25seSBvbmNlLAogCQkgKiB2ZXIgaXMgcmVhZG9ubHkuCiAJCSAqLworI2lmZGVmIENPTkZJR19IQVNfVUlECisJCS8qIEFsbG93IHNlcmlhbCMgZm9yY2VkIG92ZXJ3cml0ZSB3aXRoIDB4ZGVhZjRhZGQgZmxhZyAqLworCQlpZiAoICgoc3RyY21wIChuYW1lLCAic2VyaWFsIyIpID09IDApICYmIChmbGFnICE9IDB4ZGVhZjRhZGQpKSB8fAorI2Vsc2UKIAkJaWYgKCAoc3RyY21wIChuYW1lLCAic2VyaWFsIyIpID09IDApIHx8CisjZW5kaWYKIAkJICAgICgoc3RyY21wIChuYW1lLCAiZXRoYWRkciIpID09IDApCiAjaWYgZGVmaW5lZChDT05GSUdfT1ZFUldSSVRFX0VUSEFERFJfT05DRSkgJiYgZGVmaW5lZChDT05GSUdfRVRIQUREUikKIAkJICAgICAmJiAoc3RyY21wICgoY2hhciAqKWVudl9nZXRfYWRkcihvbGR2YWwpLE1LX1NUUihDT05GSUdfRVRIQUREUikpICE9IDApCkBAIC0zNjcsMTIgKzM3MiwxMiBAQAogCQlsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CiAJCXJldHVybiAwOwogCX0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlpZiAoc3RyY21wKGFyZ3ZbMV0sImJvb3RmaWxlIikgPT0gMCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgYXJndlsyXSwgc2l6ZW9mKEJvb3RGaWxlKSk7CiAJCXJldHVybiAwOwogCX0KLSNlbmRpZgkvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQU1JR0FPTkVHM1NFCiAJaWYgKHN0cmNtcChhcmd2WzFdLCAidmdhX2ZnX2NvbG9yIikgPT0gMCB8fApAQCAtMzk3LDcgKzQwMiwxNSBAQAogCQlfZG9fc2V0ZW52ICgwLCAzLCBhcmd2KTsKIH0KIAotaW50IGRvX3NldGVudiAoIGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQorI2lmZGVmIENPTkZJR19IQVNfVUlECit2b2lkIGZvcmNlZW52IChjaGFyICp2YXJuYW1lLCBjaGFyICp2YXJ2YWx1ZSkKK3sKKwljaGFyICphcmd2WzRdID0geyAiZm9yY2VlbnYiLCB2YXJuYW1lLCB2YXJ2YWx1ZSwgTlVMTCB9OworCV9kb19zZXRlbnYgKDB4ZGVhZjRhZGQsIDMsIGFyZ3YpOworfQorI2VuZGlmCisKK2ludCBkb19zZXRlbnYgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWlmIChhcmdjIDwgMikgewogCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwpAQCAtNDExLDcgKzQyNCw3IEBACiAgKiBQcm9tcHQgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlCiAgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FTS0VOVikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQVNLRU5WKQogaW50IGRvX2Fza2VudiAoIGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWV4dGVybiBjaGFyIGNvbnNvbGVfYnVmZmVyW0NGR19DQlNJWkVdOwpAQCAtNDgzLDcgKzQ5Niw3IEBACiAJLyogQ29udGludWUgY2FsbGluZyBzZXRlbnYgY29kZSAqLwogCXJldHVybiBfZG9fc2V0ZW52IChmbGFnLCBsZW4sIGxvY2FsX2FyZ3MpOwogfQotI2VuZGlmCS8qIENGR19DTURfQVNLRU5WICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTG9vayB1cCB2YXJpYWJsZSBmcm9tIGVudmlyb25tZW50LApAQCAtNTM4LDExICs1NTEsOSBAQAogCXJldHVybiAoLTEpOwogfQogCi0jaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX05WUkFNKSB8fCBkZWZpbmVkKENGR19FTlZfSVNfSU5fRUVQUk9NKSB8fCBcCi0gICAgKChDT05GSUdfQ09NTUFORFMgJiAoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9GTEFTSCkpID09IFwKLSAgICAgIChDRkdfQ01EX0VOVnxDRkdfQ01EX0ZMQVNIKSkgfHwgXAotICAgICgoQ09ORklHX0NPTU1BTkRTICYgKENGR19DTURfRU5WfENGR19DTURfTkFORCkpID09IFwKLSAgICAgIChDRkdfQ01EX0VOVnxDRkdfQ01EX05BTkQpKQorI2lmIGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9OVlJBTSkgfHwgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0VFUFJPTSkgXAorICAgIHx8IChkZWZpbmVkKENPTkZJR19DTURfRU5WKSAmJiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpKSBcCisgICAgfHwgKGRlZmluZWQoQ09ORklHX0NNRF9FTlYpICYmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSkKIGludCBkb19zYXZlZW52IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlleHRlcm4gY2hhciAqIGVudl9uYW1lX3NwZWM7CkBAIC01NTIsNyArNTYzLDYgQEAKIAlyZXR1cm4gKHNhdmVlbnYoKSA/IDEgOiAwKTsKIH0KIAotCiAjZW5kaWYKIAogCkBAIC01OTYsMjAgKzYwNiwxOCBAQAogCSIgICAgLSBkZWxldGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ25hbWUnXG4iCiApOwogCi0jaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX05WUkFNKSB8fCBkZWZpbmVkKENGR19FTlZfSVNfSU5fRUVQUk9NKSB8fCBcCi0gICAgKChDT05GSUdfQ09NTUFORFMgJiAoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9GTEFTSCkpID09IFwKLSAgICAgIChDRkdfQ01EX0VOVnxDRkdfQ01EX0ZMQVNIKSkgfHwgXAotICAgICgoQ09ORklHX0NPTU1BTkRTICYgKENGR19DTURfRU5WfENGR19DTURfTkFORCkpID09IFwKLSAgICAgIChDRkdfQ01EX0VOVnxDRkdfQ01EX05BTkQpKQorI2lmIGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9OVlJBTSkgfHwgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0VFUFJPTSkgXAorICAgIHx8IChkZWZpbmVkKENPTkZJR19DTURfRU5WKSAmJiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpKSBcCisgICAgfHwgKGRlZmluZWQoQ09ORklHX0NNRF9FTlYpICYmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSkKIFVfQk9PVF9DTUQoCiAJc2F2ZWVudiwgMSwgMCwJZG9fc2F2ZWVudiwKIAkic2F2ZWVudiAtIHNhdmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBlcnNpc3RlbnQgc3RvcmFnZVxuIiwKIAlOVUxMCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9FTlYgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVNLRU5WKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9BU0tFTlYpCiAKIFVfQk9PVF9DTUQoCiAJYXNrZW52LAlDRkdfTUFYQVJHUywJMSwJZG9fYXNrZW52LApAQCAtNjI0LDkgKzYzMiw5IEBACiAJIiAgICAtIGRpc3BsYXkgJ21lc3NhZ2UnIHN0cmluZyBhbmQgZ2V0IGVudmlyb25tZW50IHZhcmlhYmxlICduYW1lJyIKIAkiZnJvbSBzdGRpbiAobWF4ICdzaXplJyBjaGFycylcbiIKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9BU0tFTlYgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUlVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SVU4pCiBpbnQgZG9fcnVuIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CiBVX0JPT1RfQ01EKAogCXJ1biwJQ0ZHX01BWEFSR1MsCTEsCWRvX3J1biwKQEAgLTYzNCw0ICs2NDIsNCBAQAogCSJ2YXIgWy4uLl1cbiIKIAkiICAgIC0gcnVuIHRoZSBjb21tYW5kcyBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUocykgJ3ZhcidcbiIKICk7Ci0jZW5kaWYgIC8qIENGR19DTURfUlVOICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfcGNpLmMgYi9jb21tb24vY21kX3BjaS5jCmluZGV4IDQ1MDg1NDYuLjhiZTZkYTkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfcGNpLmMKKysrIGIvY29tbW9uL2NtZF9wY2kuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHBjaS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ0kpCiAKIGV4dGVybiBpbnQgY21kX2dldF9kYXRhX3NpemUoY2hhciogYXJnLCBpbnQgZGVmYXVsdF9zaXplKTsKIApAQCAtNTY1LDYgKzU2NSw2IEBACiAJIiAgICAtIHdyaXRlIHRvIENGRyBhZGRyZXNzXG4iCiApOwogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKSAqLworI2VuZGlmCiAKICNlbmRpZiAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3BjbWNpYS5jIGIvY29tbW9uL2NtZF9wY21jaWEuYwppbmRleCBiMWE1OTRmLi5kY2QwN2MwIDEwMDY0NAotLS0gYS9jb21tb24vY21kX3BjbWNpYS5jCisrKyBiL2NvbW1vbi9jbWRfcGNtY2lhLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogCiBleHRlcm4gaW50IHBjbWNpYV9vbiAodm9pZCk7CiBleHRlcm4gaW50IHBjbWNpYV9vZmYgKHZvaWQpOwpAQCAtOTMsMTMgKzkzLDEzIEBACiAJCQkicGluaXQgb2ZmIC0gcG93ZXIgb2ZmIFBDTUNJQSBzb2NrZXRcbiIKIAkgICk7CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICN1bmRlZglDSEVDS19JREVfREVWSUNFCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDSEVDS19JREVfREVWSUNFCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9wb3J0aW8uYyBiL2NvbW1vbi9jbWRfcG9ydGlvLmMKaW5kZXggZDJlNGM0Yi4uYmZlMzNlMyAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9wb3J0aW8uYworKysgYi9jb21tb24vY21kX3BvcnRpby5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUE9SVElPKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QT1JUSU8pCiAKIGV4dGVybiBpbnQgY21kX2dldF9kYXRhX3NpemUgKGNoYXIgKmFyZywgaW50IGRlZmF1bHRfc2l6ZSk7CiAKQEAgLTE2Niw0ICsxNjYsNCBAQAogCSIgICAgLSByZWFkIGRhdHVtIGZyb20gSU8gcG9ydFxuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfUE9SVElPICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfcmVnaW5mby5jIGIvY29tbW9uL2NtZF9yZWdpbmZvLmMKaW5kZXggZjQyOGY3ZS4uMTdlOWNkOSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9yZWdpbmZvLmMKKysrIGIvY29tbW9uL2NtZF9yZWdpbmZvLmMKQEAgLTMyLDcgKzMyLDggQEAKICNlbGlmIGRlZmluZWQgKENPTkZJR19NUEM1MjAwKQogI2luY2x1ZGUgPG1wYzV4eHguaD4KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JFR0lORk8pCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUkVHSU5GTykKIAogaW50IGRvX3JlZ2luZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtMzM0LDE0ICszMzUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVHSU5GTyAqLworI2VuZGlmCiAKIAogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmICggZGVmaW5lZChDT05GSUdfOHh4KSAgIHx8IGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBcCiAgICAgICBkZWZpbmVkKENPTkZJR180MDVFUCkgfHwgZGVmaW5lZChDT05GSUdfTVBDNTIwMCkgICkgJiYgXAotICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JFR0lORk8pCisgICAgZGVmaW5lZChDT05GSUdfQ01EX1JFR0lORk8pCiAKIFVfQk9PVF9DTUQoCiAgCXJlZ2luZm8sCTIsCTEsCWRvX3JlZ2luZm8sCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3JlaXNlci5jIGIvY29tbW9uL2NtZF9yZWlzZXIuYwppbmRleCAwOWM4NmU2Li4xYmEzOTI5IDEwMDY0NAotLS0gYS9jb21tb24vY21kX3JlaXNlci5jCisrKyBiL2NvbW1vbi9jbWRfcmVpc2VyLmMKQEAgLTI4LDcgKzI4LDcgQEAKICAqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVJU0VSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SRUlTRVIpCiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGltYWdlLmg+CkBAIC05MCw3ICs5MCw3IEBACiAJfQogCiAJaWYgKCFyZWlzZXJmc19tb3VudChwYXJ0X2xlbmd0aCkpIHsKLQkJcHJpbnRmICgiKiogQmFkIFJlaXNlZnMgcGFydGl0aW9uIG9yIGRpc2sgLSAlcyAlZDolZCAqKlxuIiwgIGFyZ3ZbMV0sIGRldiwgcGFydCk7CisJCXByaW50ZiAoIioqIEJhZCBSZWlzZXJmcyBwYXJ0aXRpb24gb3IgZGlzayAtICVzICVkOiVkICoqXG4iLCAgYXJndlsxXSwgZGV2LCBwYXJ0KTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0xODMsNyArMTgzLDcgQEAKIAkJCXJldHVybiAxOwogCQl9CiAKLQkJaWYgKHN0cm5jbXAoaW5mby50eXBlLCBCT09UX1BBUlRfVFlQRSwgc2l6ZW9mKGluZm8udHlwZSkpICE9IDApIHsKKwkJaWYgKHN0cm5jbXAoKGNoYXIgKilpbmZvLnR5cGUsIEJPT1RfUEFSVF9UWVBFLCBzaXplb2YoaW5mby50eXBlKSkgIT0gMCkgewogCQkJcHJpbnRmICgiXG4qKiBJbnZhbGlkIHBhcnRpdGlvbiB0eXBlIFwiJS4zMnNcIiIKIAkJCQkiIChleHBlY3QgXCIiIEJPT1RfUEFSVF9UWVBFICJcIilcbiIsCiAJCQkJaW5mby50eXBlKTsKQEAgLTIwNCw3ICsyMDQsNyBAQAogCX0KIAogCWlmICghcmVpc2VyZnNfbW91bnQocGFydF9sZW5ndGgpKSB7Ci0JCXByaW50ZiAoIioqIEJhZCBSZWlzZWZzIHBhcnRpdGlvbiBvciBkaXNrIC0gJXMgJWQ6JWQgKipcbiIsICBhcmd2WzFdLCBkZXYsIHBhcnQpOworCQlwcmludGYgKCIqKiBCYWQgUmVpc2VyZnMgcGFydGl0aW9uIG9yIGRpc2sgLSAlcyAlZDolZCAqKlxuIiwgIGFyZ3ZbMV0sIGRldiwgcGFydCk7CiAJCXJldHVybiAxOwogCX0KIApAQCAtMjQwLDQgKzI0MCw0IEBACiAJIiAgICAgIHRvIGFkZHJlc3MgJ2FkZHInIGZyb20gZG9zIGZpbGVzeXN0ZW1cbiIKICk7CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JFSVNFUiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3Njc2kuYyBiL2NvbW1vbi9jbWRfc2NzaS5jCmluZGV4IDAwYjg0ZmEuLmY1NjM5MzEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfc2NzaS5jCisrKyBiL2NvbW1vbi9jbWRfc2NzaS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8aW1hZ2UuaD4KICNpbmNsdWRlIDxwY2kuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAKICNpZmRlZiBDT05GSUdfU0NTSV9TWU01M0M4WFgKICNkZWZpbmUgU0NTSV9WRU5EX0lECTB4MTAwMApAQCAtNjA5LDQgKzYwOSw0IEBACiAJImxvYWRBZGRyIGRldjpwYXJ0XG4iCiApOwogCi0jZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfc3BpLmMgYi9jb21tb24vY21kX3NwaS5jCmluZGV4IGE2ZmRmN2YuLjMxMThkMjcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfc3BpLmMKKysrIGIvY29tbW9uL2NtZF9zcGkuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxzcGkuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NQSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU1BJKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEZWZpbml0aW9ucwpAQCAtMTQwLDQgKzE0MCw0IEBACiAJIjxkb3V0PiAgICAtIEhleGFkZWNpbWFsIHN0cmluZyB0aGF0IGdldHMgc2VudFxuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfU1BJICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfdW5pdmVyc2UuYyBiL2NvbW1vbi9jbWRfdW5pdmVyc2UuYwppbmRleCA4ZDdiNmZlLi44YmYwYjFmIDEwMDY0NAotLS0gYS9jb21tb24vY21kX3VuaXZlcnNlLmMKKysrIGIvY29tbW9uL2NtZF91bml2ZXJzZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlIDx1bml2ZXJzZS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVU5JVkVSU0UpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VOSVZFUlNFKQogCiAjZGVmaW5lIFBDSV9WRU5ET1IgUENJX1ZFTkRPUl9JRF9UVU5EUkEKICNkZWZpbmUgUENJX0RFVklDRSBQQ0lfREVWSUNFX0lEX1RVTkRSQV9DQTkxQzA0MgpAQCAtMzg3LDQgKzM4Nyw0IEBACiAJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDMgLT4gRDMyIERhdGEgV2lkdGhcbiIKICk7CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VTklWRVJTRSkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF91c2IuYyBiL2NvbW1vbi9jbWRfdXNiLmMKaW5kZXggOTA0ZGY3MS4uNDVlMDdmMSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF91c2IuYworKysgYi9jb21tb24vY21kX3VzYi5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPHBhcnQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVVNCKQogCiAjaW5jbHVkZSA8dXNiLmg+CiAKQEAgLTYwOSwxMCArNjA5LDEwIEBACiB9CiAKIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgKi8KKyNlbmRpZgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VTQikKIAogI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRQogVV9CT09UX0NNRCgKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfdmZkLmMgYi9jb21tb24vY21kX3ZmZC5jCmluZGV4IDVlNjIzYTIuLjI5YzM0OWQgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfdmZkLmMKKysrIGIvY29tbW9uL2NtZF92ZmQuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1ZGRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVkZEKQogCiAjaW5jbHVkZSA8dmZkX2xvZ28uaD4KICNkZWZpbmUgVkZEX1RFU1RfTE9HT19CTVBOUiAwCkBAIC03Myw3ICs3Myw3IEBACiAJInZmZCBBRERSXG4iCiAJIiAgICAtIGxvYWQgYml0bWFwIGF0IGFkZHJlc3MgQUREUlxuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX1ZGRCAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVkZECiBpbnQgdHJhYl92ZmQgKHVsb25nIGJpdG1hcCkKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfeGltZy5jIGIvY29tbW9uL2NtZF94aW1nLmMKaW5kZXggODM1OTE1My4uNTJlMDYxNCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF94aW1nLmMKKysrIGIvY29tbW9uL2NtZF94aW1nLmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1hJTUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1hJTUcpCiAKIC8qCiAgKiBNdWx0aSBJbWFnZSBleHRyYWN0CkBAIC0xNDEsNCArMTQxLDQgQEAKIAkgICAiYWRkciBwYXJ0IFtkZXN0XVxuIgogCSAgICIgICAgLSBleHRyYWN0IDxwYXJ0PiBmcm9tIGltYWdlIGF0IDxhZGRyPiBhbmQgY29weSB0byA8ZGVzdD5cbiIpOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9YSU1HICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jb21tYW5kLmMgYi9jb21tb24vY29tbWFuZC5jCmluZGV4IGU5MTc5NzUuLmFmMmY4Y2IgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jb21tYW5kLmMKKysrIGIvY29tbW9uL2NvbW1hbmQuYwpAQCAtNDIsNyArNDIsNyBAQAogCU5VTEwKICk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FQ0hPKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FQ0hPKQogCiBpbnQKIGRvX2VjaG8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtNzYsNyArNzYsNyBAQAogCSIgICAgLSBlY2hvIGFyZ3MgdG8gY29uc29sZTsgXFxjIHN1cHByZXNzZXMgbmV3bGluZVxuIgogKTsKIAotI2VuZGlmCS8qICBDRkdfQ01EX0VDSE8gKi8KKyNlbmRpZgogCiAjaWZkZWYgQ0ZHX0hVU0hfUEFSU0VSCiAKQEAgLTQwOSw3ICs0MDksNyBAQAogewogCWluc3RhbGxfYXV0b19jb21wbGV0ZV9oYW5kbGVyKCJwcmludGVudiIsIHZhcl9jb21wbGV0ZSk7CiAJaW5zdGFsbF9hdXRvX2NvbXBsZXRlX2hhbmRsZXIoInNldGVudiIsIHZhcl9jb21wbGV0ZSk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUlVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SVU4pCiAJaW5zdGFsbF9hdXRvX2NvbXBsZXRlX2hhbmRsZXIoInJ1biIsIHZhcl9jb21wbGV0ZSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NvbW1vbi9kb2NlY2MuYyBiL2NvbW1vbi9kb2NlY2MuYwppbmRleCA3OWFkYjQ4Li41ZGFhNmZjIDEwMDY0NAotLS0gYS9jb21tb24vZG9jZWNjLmMKKysrIGIvY29tbW9uL2RvY2VjYy5jCkBAIC0zMSw3ICszMSw3IEBACiAjdW5kZWYgRUNDX0RFQlVHCiAjdW5kZWYgUFNZQ0hPX0RFQlVHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9kb2MyMDAwLmg+CiAKQEAgLTUxNCw0ICs1MTQsNCBAQAogICAgIHJldHVybiBuYl9lcnJvcnM7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9lbnZfY29tbW9uLmMgYi9jb21tb24vZW52X2NvbW1vbi5jCmluZGV4IGViMzM0MjIuLmE0OTQ4MTIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9lbnZfY29tbW9uLmMKKysrIGIvY29tbW9uL2Vudl9jb21tb24uYwpAQCAtMzAsMTMgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCiAjaWZkZWYgQ09ORklHX0FNSUdBT05FRzNTRQpAQCAtMjMyLDcgKzIyNSw3IEBACiAJCXB1dHMgKCJVc2luZyBkZWZhdWx0IGVudmlyb25tZW50XG5cbiIpOwogI2Vsc2UKIAkJcHV0cyAoIioqKiBXYXJuaW5nIC0gYmFkIENSQywgdXNpbmcgZGVmYXVsdCBlbnZpcm9ubWVudFxuXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTYwKTsKICNlbmRpZgogCiAJCWlmIChzaXplb2YoZGVmYXVsdF9lbnZpcm9ubWVudCkgPiBFTlZfU0laRSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9lbnZfZmxhc2guYyBiL2NvbW1vbi9lbnZfZmxhc2guYwppbmRleCAxNjc0YjMwLi43YTM3ZTU1IDEwMDY0NAotLS0gYS9jb21tb24vZW52X2ZsYXNoLmMKKysrIGIvY29tbW9uL2Vudl9mbGFzaC5jCkBAIC0zNywxMCArMzcsMTAgQEAKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyYoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9GTEFTSCkpID09IChDRkdfQ01EX0VOVnxDRkdfQ01EX0ZMQVNIKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRU5WKSAmJiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpCiAjZGVmaW5lIENNRF9TQVZFRU5WCiAjZWxpZiBkZWZpbmVkKENGR19FTlZfQUREUl9SRURVTkQpCi0jZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX0FERFJfUkVEVU5EIHdpdGhvdXQgQ0ZHX0NNRF9FTlYgJiBDRkdfQ01EX0ZMQVNICisjZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX0FERFJfUkVEVU5EIHdpdGhvdXQgQ09ORklHX0NNRF9FTlYgJiBDT05GSUdfQ01EX0ZMQVNICiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0VOVl9TSVpFX1JFRFVORCkgJiYgKENGR19FTlZfU0laRV9SRURVTkQgPCBDRkdfRU5WX1NJWkUpCmRpZmYgLS1naXQgYS9jb21tb24vZW52X25hbmQuYyBiL2NvbW1vbi9lbnZfbmFuZC5jCmluZGV4IDY3YzRhNGUuLjM4YTA3ZjggMTAwNjQ0Ci0tLSBhL2NvbW1vbi9lbnZfbmFuZC5jCisrKyBiL2NvbW1vbi9lbnZfbmFuZC5jCkBAIC0zOSwxMCArMzksMTAgQEAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxuYW5kLmg+CiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyYoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9OQU5EKSkgPT0gKENGR19DTURfRU5WfENGR19DTURfTkFORCkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VOVikgJiYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjZGVmaW5lIENNRF9TQVZFRU5WCiAjZWxpZiBkZWZpbmVkKENGR19FTlZfT0ZGU0VUX1JFRFVORCkKLSNlcnJvciBDYW5ub3QgdXNlIENGR19FTlZfT0ZGU0VUX1JFRFVORCB3aXRob3V0IENGR19DTURfRU5WICYgQ0ZHX0NNRF9OQU5ECisjZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX09GRlNFVF9SRURVTkQgd2l0aG91dCBDT05GSUdfQ01EX0VOViAmIENPTkZJR19DTURfTkFORAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENGR19FTlZfU0laRV9SRURVTkQpICYmIChDRkdfRU5WX1NJWkVfUkVEVU5EICE9IENGR19FTlZfU0laRSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9leHBvcnRzLmMgYi9jb21tb24vZXhwb3J0cy5jCmluZGV4IDBjYjQzOTYuLmVjNDY1NmIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9leHBvcnRzLmMKKysrIGIvY29tbW9uL2V4cG9ydHMuYwpAQCAtMjgsMTIgKzI4LDE0IEBACiAJZ2QtPmp0W1hGX2dldF90aW1lcl0gPSAodm9pZCAqKSBnZXRfdGltZXI7CiAJZ2QtPmp0W1hGX3NpbXBsZV9zdHJ0b3VsXSA9ICh2b2lkICopIHNpbXBsZV9zdHJ0b3VsOwogCWdkLT5qdFtYRl91ZGVsYXldID0gKHZvaWQgKikgdWRlbGF5OworCWdkLT5qdFtYRl9zaW1wbGVfc3RydG9sXSA9ICh2b2lkICopIHNpbXBsZV9zdHJ0b2w7CisJZ2QtPmp0W1hGX3N0cmNtcF0gPSAodm9pZCAqKSBzdHJjbXA7CiAjaWYgZGVmaW5lZChDT05GSUdfSTM4NikgfHwgZGVmaW5lZChDT05GSUdfUFBDKQogCWdkLT5qdFtYRl9pbnN0YWxsX2hkbHJdID0gKHZvaWQgKikgaXJxX2luc3RhbGxfaGFuZGxlcjsKIAlnZC0+anRbWEZfZnJlZV9oZGxyXSA9ICh2b2lkICopIGlycV9mcmVlX2hhbmRsZXI7CiAjZW5kaWYJLyogSTM4NiB8fCBQUEMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAlnZC0+anRbWEZfaTJjX3dyaXRlXSA9ICh2b2lkICopIGkyY193cml0ZTsKIAlnZC0+anRbWEZfaTJjX3JlYWRdID0gKHZvaWQgKikgaTJjX3JlYWQ7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZkdF9zdXBwb3J0LmMgYi9jb21tb24vZmR0X3N1cHBvcnQuYwppbmRleCA2OTA5OWM0Li5jYWFhNjgyIDEwMDY0NAotLS0gYS9jb21tb24vZmR0X3N1cHBvcnQuYworKysgYi9jb21tb24vZmR0X3N1cHBvcnQuYwpAQCAtMzcsNiArMzcsMTAgQEAKICAqLwogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKKy8qCisgKiBmZHQgcG9pbnRzIHRvIG91ciB3b3JraW5nIGRldmljZSB0cmVlLgorICovCitzdHJ1Y3QgZmR0X2hlYWRlciAqZmR0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQ1LDEzICs0OSwxMiBAQAogCWJkX3QgKmJkID0gZ2QtPmJkOwogCWludCAgIG5vZGVvZmZzZXQ7CiAJaW50ICAgZXJyOwotCXUzMiAgIHRtcDsJCQkvKiB1c2VkIHRvIHNldCAzMiBiaXQgaW50ZWdlciBwcm9wZXJ0aWVzICovCi0JY2hhciAgKnN0cjsJCQkvKiB1c2VkIHRvIHNldCBzdHJpbmcgcHJvcGVydGllcyAqLwotCXVsb25nIGNsb2NrOworCXUzMiAgIHRtcDsJCS8qIHVzZWQgdG8gc2V0IDMyIGJpdCBpbnRlZ2VyIHByb3BlcnRpZXMgKi8KKwljaGFyICAqc3RyOwkJLyogdXNlZCB0byBzZXQgc3RyaW5nIHByb3BlcnRpZXMgKi8KIAogCWVyciA9IGZkdF9jaGVja19oZWFkZXIoZmR0KTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJcHJpbnRmKCJmZHRfY2hvc2VuOiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjMsMTEgKzY2LDEyIEBACiAKIAkJZXJyID0gZmR0X251bV9yZXNlcnZlbWFwKGZkdCwgJnVzZWQsICZ0b3RhbCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2Nob3NlbjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJaWYgKHVzZWQgPj0gdG90YWwpIHsKLQkJCXByaW50ZigiZmR0X2Nob3Nlbjogbm8gcm9vbSBpbiB0aGUgcmVzZXJ2ZWQgbWFwICglZCBvZiAlZClcbiIsCisJCQlwcmludGYoIldBUk5JTkc6ICIKKwkJCQkibm8gcm9vbSBpbiB0aGUgcmVzZXJ2ZWQgbWFwICglZCBvZiAlZClcbiIsCiAJCQkJdXNlZCwgdG90YWwpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC04NCw3ICs4OCw3IEBACiAJCWVyciA9IGZkdF9yZXBsYWNlX3Jlc2VydmVtYXBfZW50cnkoZmR0LCBqLAogCQkJaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0ICsgMSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2Nob3NlbjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC05Miw3ICs5Niw3IEBACiAJLyoKIAkgKiBGaW5kIHRoZSAiY2hvc2VuIiBub2RlLgogCSAqLwotCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZkdCwgIi9jaG9zZW4iKTsKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsICIvY2hvc2VuIik7CiAKIAkvKgogCSAqIElmIHdlIGhhdmUgYSAiY2hvc2VuIiBub2RlIGFscmVhZHkgdGhlICJmb3JjZSB0aGUgd3JpdGluZyIKQEAgLTExMCw3ICsxMTQsOCBAQAogCQkgKi8KIAkJbm9kZW9mZnNldCA9IGZkdF9hZGRfc3Vibm9kZShmZHQsIDAsICJjaG9zZW4iKTsKIAkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CisJCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL2Nob3NlbiAlcy5cbiIsCisJCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKIAkJCXJldHVybiBub2Rlb2Zmc2V0OwogCQl9CiAJfQpAQCAtMTIwLDQyICsxMjUsMzUgQEAKIAkgKi8KIAlzdHIgPSBnZXRlbnYoImJvb3RhcmdzIik7CiAJaWYgKHN0ciAhPSBOVUxMKSB7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImJvb3RhcmdzIiwgc3RyLCBzdHJsZW4oc3RyKSsxKTsKKwkJZXJyID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LAorCQkJImJvb3RhcmdzIiwgc3RyLCBzdHJsZW4oc3RyKSsxKTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiV0FSTklORzogY291bGQgbm90IHNldCBib290YXJncyAlcy5cbiIsCisJCQkJZmR0X3N0cmVycm9yKGVycikpOwogCX0KIAlpZiAoaW5pdHJkX3N0YXJ0ICYmIGluaXRyZF9lbmQpIHsKIAkJdG1wID0gX19jcHVfdG9fYmUzMihpbml0cmRfc3RhcnQpOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJsaW51eCxpbml0cmQtc3RhcnQiLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCSAibGludXgsaW5pdHJkLXN0YXJ0IiwgJnRtcCwgc2l6ZW9mKHRtcCkpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiAiCisJCQkJImNvdWxkIG5vdCBzZXQgbGludXgsaW5pdHJkLXN0YXJ0ICVzLlxuIiwKKwkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCXRtcCA9IF9fY3B1X3RvX2JlMzIoaW5pdHJkX2VuZCk7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImxpbnV4LGluaXRyZC1lbmQiLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCSJsaW51eCxpbml0cmQtZW5kIiwgJnRtcCwgc2l6ZW9mKHRtcCkpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiBjb3VsZCBub3Qgc2V0IGxpbnV4LGluaXRyZC1lbmQgJXMuXG4iLAorCQkJCWZkdF9zdHJlcnJvcihlcnIpKTsKIAl9CiAjaWZkZWYgT0ZfU1RET1VUX1BBVEgKLQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJsaW51eCxzdGRvdXQtcGF0aCIsIE9GX1NURE9VVF9QQVRILCBzdHJsZW4oT0ZfU1RET1VUX1BBVEgpKzEpOworCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJImxpbnV4LHN0ZG91dC1wYXRoIiwgT0ZfU1RET1VUX1BBVEgsIHN0cmxlbihPRl9TVERPVVRfUEFUSCkrMSk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgbGludXgsc3Rkb3V0LXBhdGggJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKGVycikpOwogI2VuZGlmCiAKLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvY3B1cyIpOwotCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKLQkJY2xvY2sgPSBjcHVfdG9fYmUzMihiZC0+YmlfaW50ZnJlcSk7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImNsb2NrLWZyZXF1ZW5jeSIsICZjbG9jaywgNCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7Ci0JfQotI2lmZGVmIE9GX1RCQ0xLCi0Jbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCAiL2NwdXMvIiBPRl9DUFUgIi90aW1lYmFzZS1mcmVxdWVuY3kiKTsKLQlpZiAobm9kZW9mZnNldCA+PSAwKSB7Ci0JCWNsb2NrID0gY3B1X3RvX2JlMzIoT0ZfVEJDTEspOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJjbG9jay1mcmVxdWVuY3kiLCAmY2xvY2ssIDQpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwotCX0KLSNlbmRpZgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3Nyw3ICsxNzUsNyBAQAogCiAJZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoImZkdF9lbnY6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xODUsMTEgKzE4MywxMSBAQAogCSAqIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSAidS1ib290LWVudiIgbm9kZSwgZGVsZXRlIGl0IGlmIHNvLgogCSAqIFRoZW4gY3JlYXRlIGEgbmV3IGVtcHR5IG5vZGUuCiAJICovCi0Jbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCAiL3UtYm9vdC1lbnYiKTsKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsICIvdS1ib290LWVudiIpOwogCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKIAkJZXJyID0gZmR0X2RlbF9ub2RlKGZkdCwgbm9kZW9mZnNldCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2VudjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0xOTgsNyArMTk2LDggQEAKIAkgKi8KIAlub2Rlb2Zmc2V0ID0gZmR0X2FkZF9zdWJub2RlKGZkdCwgMCwgInUtYm9vdC1lbnYiKTsKIAlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL3UtYm9vdC1lbnYgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKIAkJcmV0dXJuIG5vZGVvZmZzZXQ7CiAJfQogCkBAIC0yMjYsNyArMjI1LDggQEAKIAkJCWNvbnRpbnVlOwogCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIGx2YWwsIHJ2YWwsIHN0cmxlbihydmFsKSsxKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiBjb3VsZCBub3Qgc2V0ICVzICVzLlxuIiwKKwkJCQlsdmFsLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMjkyLDEyICsyOTIsMTIgQEAKIAliZF90ICpiZCA9IGdkLT5iZDsKIAlpbnQgICBub2Rlb2Zmc2V0OwogCWludCAgIGVycjsKLQl1MzIgICB0bXA7CQkJLyogdXNlZCB0byBzZXQgMzIgYml0IGludGVnZXIgcHJvcGVydGllcyAqLworCXUzMiAgIHRtcDsJCS8qIHVzZWQgdG8gc2V0IDMyIGJpdCBpbnRlZ2VyIHByb3BlcnRpZXMgKi8KIAlpbnQgaTsKIAogCWVyciA9IGZkdF9jaGVja19oZWFkZXIoZmR0KTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTMwNSwxMSArMzA1LDExIEBACiAJICogU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhICJiZF90IiBub2RlLCBkZWxldGUgaXQgaWYgc28uCiAJICogVGhlbiBjcmVhdGUgYSBuZXcgZW1wdHkgbm9kZS4KIAkgKi8KLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvYmRfdCIpOworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGggKGZkdCwgIi9iZF90Iik7CiAJaWYgKG5vZGVvZmZzZXQgPj0gMCkgewogCQllcnIgPSBmZHRfZGVsX25vZGUoZmR0LCBub2Rlb2Zmc2V0KTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0zMTgsNyArMzE4LDkgQEAKIAkgKi8KIAlub2Rlb2Zmc2V0ID0gZmR0X2FkZF9zdWJub2RlKGZkdCwgMCwgImJkX3QiKTsKIAlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL2JkX3QgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKKwkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CiAJCXJldHVybiBub2Rlb2Zmc2V0OwogCX0KIAkvKgpAQCAtMzI2LDIwICszMjgsMjMgQEAKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJkX21hcCkvc2l6ZW9mKGJkX21hcFswXSk7IGkrKykgewogCQl0bXAgPSBjcHVfdG9fYmUzMihnZXRlbnYoImJvb3RhcmdzIikpOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIGJkX21hcFtpXS5uYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCWJkX21hcFtpXS5uYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CiAJCWlmIChlcnIgPCAwKQotCQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CisJCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgJXMgJXMuXG4iLAorCQkJCWJkX21hcFtpXS5uYW1lLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJfQogCS8qCiAJICogQWRkIGEgY291cGxlIG9mIG9kZGJhbGwgZW50cmllcy4uLgogCSAqLwogCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImVuZXRhZGRyIiwgJmJkLT5iaV9lbmV0YWRkciwgNik7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgZW5ldGFkZHIgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKGVycikpOwogCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImV0aHNwZWVkIiwgJmJkLT5iaV9ldGhzcGVlZCwgNCk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwotCisJCXByaW50ZigiV0FSTklORzogY291bGQgbm90IHNldCBldGhzcGVlZCAlcy5cbiIsCisJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX09GX0hBU19CRF9UICovCmRpZmYgLS1naXQgYS9jb21tb24vZmxhc2guYyBiL2NvbW1vbi9mbGFzaC5jCmluZGV4IGE2NGJjOTguLjg4OGZmOWMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9mbGFzaC5jCisrKyBiL2NvbW1vbi9mbGFzaC5jCkBAIC00NywxNiArNDcsMTYgQEAKIAlzaG9ydCBzX2VuZCA9IGluZm8tPnNlY3Rvcl9jb3VudCAtIDE7CS8qIGluZGV4IG9mIGxhc3Qgc2VjdG9yICovCiAJaW50IGk7CiAKLQlkZWJ1ZyAoImZsYXNoX3Byb3RlY3QgJXM6IGZyb20gMHglMDhsWCB0byAweCUwOGxYXG4iLAotCQkoZmxhZyAmIEZMQUdfUFJPVEVDVF9TRVQpID8gIk9OIiA6Ci0JCQkoZmxhZyAmIEZMQUdfUFJPVEVDVF9DTEVBUikgPyAiT0ZGIiA6ICI/Pz8iLAotCQlmcm9tLCB0byk7Ci0KIAkvKiBEbyBub3RoaW5nIGlmIGlucHV0IGRhdGEgaXMgYmFkLiAqLwogCWlmIChpbmZvLT5zZWN0b3JfY291bnQgPT0gMCB8fCBpbmZvLT5zaXplID09IDAgfHwgdG8gPCBmcm9tKSB7CiAJCXJldHVybjsKIAl9CiAKKwlkZWJ1ZyAoImZsYXNoX3Byb3RlY3QgJXM6IGZyb20gMHglMDhsWCB0byAweCUwOGxYXG4iLAorCQkoZmxhZyAmIEZMQUdfUFJPVEVDVF9TRVQpID8gIk9OIiA6CisJCQkoZmxhZyAmIEZMQUdfUFJPVEVDVF9DTEVBUikgPyAiT0ZGIiA6ICI/Pz8iLAorCQlmcm9tLCB0byk7CisKIAkvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGlmIHdlIGhhdmUgbm8gZGF0YSBhYm91dCB0aGUgZmxhc2gKIAkgKiBvciB0aGUgcHJvdGVjdCByYW5nZSBhbmQgZmxhc2ggcmFuZ2UgZG9uJ3Qgb3ZlcmxhcC4KIAkgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9odXNoLmMgYi9jb21tb24vaHVzaC5jCmluZGV4IGZlYjU2MjcuLjU4MjYzNWMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9odXNoLmMKKysrIGIvY29tbW9uL2h1c2guYwpAQCAtMTY4Miw3ICsxNjgyLDcgQEAKIAkJCQlyZXR1cm4gLTE7CS8qIGdpdmUgdXAgYWZ0ZXIgYmFkIGNvbW1hbmQgKi8KIAkJCX0gZWxzZSB7CiAJCQkJaW50IHJjb2RlOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JPT1REKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CT09URCkKIAkgICAgZXh0ZXJuIGludCBkb19ib290ZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOwogCiAJCQkJLyogYXZvaWQgImJvb3RkIiByZWN1cnNpb24gKi8KQEAgLTE2OTQsNyArMTY5NCw3IEBACiAJCQkJZWxzZQogCQkJCQlmbGFnIHw9IENNRF9GTEFHX0JPT1REOwogCQkJCX0KLSNlbmRpZgkvKiBDRkdfQ01EX0JPT1REICovCisjZW5kaWYKIAkJCQkvKiBmb3VuZCAtIGNoZWNrIG1heCBhcmdzICovCiAJCQkJaWYgKChjaGlsZC0+YXJnYyAtIGkpID4gY21kdHAtPm1heGFyZ3MpIHsKIAkJCQkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKZGlmZiAtLWdpdCBhL2NvbW1vbi9rZ2RiLmMgYi9jb21tb24va2dkYi5jCmluZGV4IDZkZTZlYzkuLjFkMzQ2NjkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9rZ2RiLmMKKysrIGIvY29tbW9uL2tnZGIuYwpAQCAtOTIsNyArOTIsNyBAQAogI2luY2x1ZGUgPGtnZGIuaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCiAjdW5kZWYgS0dEQl9ERUJVRwogCkBAIC01OTEsNCArNTkxLDQgQEAKIAogaW50IGtnZGJfbm90X2NvbmZpZ3VyZWQgPSAxOwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9sY2QuYyBiL2NvbW1vbi9sY2QuYwppbmRleCBlYWVkMmFiLi45MTRkYzJlIDEwMDY0NAotLS0gYS9jb21tb24vbGNkLmMKKysrIGIvY29tbW9uL2xjZC5jCkBAIC01NzEsNyArNTcxLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfTENEX0xPR08gKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JNUCkgfHwgZGVmaW5lZChDT05GSUdfU1BMQVNIX1NDUkVFTikKIC8qCiAgKiBEaXNwbGF5IHRoZSBCTVAgZmlsZSBsb2NhdGVkIGF0IGFkZHJlc3MgYm1wX2ltYWdlLgogICogT25seSB1bmNvbXByZXNzZWQuCkBAIC03MDAsNyArNzAwLDcgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBDT05GSUdfU1BMQVNIX1NDUkVFTiAqLworI2VuZGlmCiAKIAogc3RhdGljIHZvaWQgKmxjZF9sb2dvICh2b2lkKQpkaWZmIC0tZ2l0IGEvY29tbW9uL21haW4uYyBiL2NvbW1vbi9tYWluLmMKaW5kZXggYTAwZWJjMS4uMzc5Njk1YyAxMDA2NDQKLS0tIGEvY29tbW9uL21haW4uYworKysgYi9jb21tb24vbWFpbi5jCkBAIC00NCw2ICs0NCwxMiBAQAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAjZW5kaWYKIAorLyoKKyAqIEJvYXJkLXNwZWNpZmljIFBsYXRmb3JtIGNvZGUgY2FuIHJlaW1wbGVtZW50IHNob3dfYm9vdF9wcm9ncmVzcyAoKSBpZiBuZWVkZWQKKyAqLwordm9pZCBpbmxpbmUgX19zaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCB2YWwpIHt9Cit2b2lkIGlubGluZSBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCB2YWwpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3Nob3dfYm9vdF9wcm9ncmVzcyIpKSk7CisKICNpZiBkZWZpbmVkKENPTkZJR19CT09UX1JFVFJZX1RJTUUpICYmIGRlZmluZWQoQ09ORklHX1JFU0VUX1RPX1JFVFJZKQogZXh0ZXJuIGludCBkb19yZXNldCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOwkJLyogZm9yIGRvX3Jlc2V0KCkgcHJvdG90eXBlICovCiAjZW5kaWYKQEAgLTEzMTEsNyArMTMxNyw3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk9PVEQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JPT1REKQogCQkvKiBhdm9pZCAiYm9vdGQiIHJlY3Vyc2lvbiAqLwogCQlpZiAoY21kdHAtPmNtZCA9PSBkb19ib290ZCkgewogI2lmZGVmIERFQlVHX1BBUlNFUgpAQCAtMTMyNSw3ICsxMzMxLDcgQEAKIAkJCQlmbGFnIHw9IENNRF9GTEFHX0JPT1REOwogCQkJfQogCQl9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9CT09URCAqLworI2VuZGlmCiAKIAkJLyogT0sgLSBjYWxsIGZ1bmN0aW9uIHRvIGRvIHRoZSBjb21tYW5kICovCiAJCWlmICgoY21kdHAtPmNtZCkgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KSAhPSAwKSB7CkBAIC0xMzQ0LDcgKzEzNTAsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JVTikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUlVOKQogaW50IGRvX3J1biAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWludCBpOwpAQCAtMTM3Miw0ICsxMzc4LDQgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9SVU4gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL21paXBoeXV0aWwuYyBiL2NvbW1vbi9taWlwaHl1dGlsLmMKaW5kZXggZTQxMWU1Ny4uYzY5NTAxZiAxMDA2NDQKLS0tIGEvY29tbW9uL21paXBoeXV0aWwuYworKysgYi9jb21tb24vbWlpcGh5dXRpbC5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8bWlpcGh5Lmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgpAQCAtNDcwLDQgKzQ3MCw0IEBACiB9CiAjZW5kaWYKIAotI2VuZGlmIC8qIENPTkZJR19NSUkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAqLworI2VuZGlmIC8qIENPTkZJR19NSUkgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9zb2Z0X2kyYy5jIGIvY29tbW9uL3NvZnRfaTJjLmMKaW5kZXggMGY2ZTNhOS4uYzVkN2UyMCAxMDA2NDQKLS0tIGEvY29tbW9uL3NvZnRfaTJjLmMKKysrIGIvY29tbW9uL3NvZnRfaTJjLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpZmRlZglDT05GSUdfTVBDODI2MAkJCS8qIG9ubHkgdmFsaWQgZm9yIE1QQzgyNjAgKi8KICNpbmNsdWRlIDxpb3BvcnRzLmg+CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQVQ5MVJNOTIwMERLCQkvKiBuZWVkIHRoaXMgZm9yIHRoZSBhdDkxcm05MjAwZGsgKi8KKyNpZmRlZglDT05GSUdfQVQ5MVJNOTIwMAkJLyogbmVlZCB0aGlzIGZvciB0aGUgYXQ5MXJtOTIwMCAqLwogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9zb2Z0X3NwaS5jIGIvY29tbW9uL3NvZnRfc3BpLmMKaW5kZXggMDBhNTdkZS4uZTQyNTA2MSAxMDA2NDQKLS0tIGEvY29tbW9uL3NvZnRfc3BpLmMKKysrIGIvY29tbW9uL3NvZnRfc3BpLmMKQEAgLTc5LDcgKzc5LDkgQEAKICAqLwogaW50ICBzcGlfeGZlcihzcGlfY2hpcHNlbF90eXBlIGNoaXBzZWwsIGludCBiaXRsZW4sIHVjaGFyICpkb3V0LCB1Y2hhciAqZGluKQogeworI2lmZGVmIENGR19JTU1SCiAJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisjZW5kaWYKIAl1Y2hhciB0bXBkaW4gID0gMDsKIAl1Y2hhciB0bXBkb3V0ID0gMDsKIAlpbnQgICBqOwpkaWZmIC0tZ2l0IGEvY29tbW9uL3VzYi5jIGIvY29tbW9uL3VzYi5jCmluZGV4IDA4NTc0OTQuLjkzM2FmYTkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi91c2IuYworKysgYi9jb21tb24vdXNiLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVVNCKQogCiAjaW5jbHVkZSA8dXNiLmg+CiAjaWZkZWYgQ09ORklHXzR4eApAQCAtMTI0Nyw2ICsxMjQ3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKSAqLworI2VuZGlmCiAKIC8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL3VzYl9rYmQuYyBiL2NvbW1vbi91c2Jfa2JkLmMKaW5kZXggNTZjMjE2Ni4uYWVjNTU4YSAxMDA2NDQKLS0tIGEvY29tbW9uL3VzYl9rYmQuYworKysgYi9jb21tb24vdXNiX2tiZC5jCkBAIC0xMjksNyArMTI5LDExIEBACiBzdGF0aWMgaW50IHVzYl9rYmRfZ2V0Yyh2b2lkKQogewogCWNoYXIgYzsKLQl3aGlsZSh1c2JfaW5fcG9pbnRlcj09dXNiX291dF9wb2ludGVyKTsKKwl3aGlsZSh1c2JfaW5fcG9pbnRlcj09dXNiX291dF9wb2ludGVyKSB7CisjaWZkZWYgQ0ZHX1VTQl9FVkVOVF9QT0xMCisJCXVzYl9ldmVudF9wb2xsKCk7CisjZW5kaWYKKwl9CiAJaWYoKHVzYl9vdXRfcG9pbnRlcisxKT09VVNCX0tCRF9CVUZGRVJfTEVOKQogCQl1c2Jfb3V0X3BvaW50ZXI9MDsKIAllbHNlCmRpZmYgLS1naXQgYS9jb21tb24vdXNiX3N0b3JhZ2UuYyBiL2NvbW1vbi91c2Jfc3RvcmFnZS5jCmluZGV4IDE5NmNlYjcuLjBmNzlmMzYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi91c2Jfc3RvcmFnZS5jCisrKyBiL2NvbW1vbi91c2Jfc3RvcmFnZS5jCkBAIC01NSw3ICs1NSw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VTQikKICNpbmNsdWRlIDxwYXJ0Lmg+CiAjaW5jbHVkZSA8dXNiLmg+CiAKQEAgLTEyNDksNCArMTI0OSw0IEBACiB9CiAKICNlbmRpZiAvKiBDT05GSUdfVVNCX1NUT1JBR0UgKi8KLSNlbmRpZiAvKiBDRkdfQ01EX1VTQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvNzR4eF83eHgva2dkYi5TIGIvY3B1Lzc0eHhfN3h4L2tnZGIuUwppbmRleCBlODM4NTEzLi40ZjIzMTIyIDEwMDY0NAotLS0gYS9jcHUvNzR4eF83eHgva2dkYi5TCisrKyBiL2NwdS83NHh4Xzd4eC9rZ2RiLlMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCiAgLyoKICAqIGNhY2hlIGZsdXNoaW5nIHJvdXRpbmVzIGZvciBrZ2RiCkBAIC03NCw0ICs3NCw0IEBACiAJU1lOQwogCWJscgogCi0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS83NHh4Xzd4eC90cmFwcy5jIGIvY3B1Lzc0eHhfN3h4L3RyYXBzLmMKaW5kZXggNTBjNWVlYi4uYjA2NjIyNyAxMDA2NDQKLS0tIGEvY3B1Lzc0eHhfN3h4L3RyYXBzLmMKKysrIGIvY3B1Lzc0eHhfN3h4L3RyYXBzLmMKQEAgLTQwLDcgKzQwLDcgQEAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogaW50ICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE2Niw3ICsxNjYsNyBAQAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE4MSw3ICsxODEsNyBAQAogCXVuc2lnbmVkIGNoYXIgKnAgPSByZWdzID8gKHVuc2lnbmVkIGNoYXIgKikocmVncy0+bmlwKSA6IE5VTEw7CiAJaW50IGksIGo7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDQsNyArMjA0LDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjE3LDcgKzIxNyw3IEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvTWFrZWZpbGUgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL01ha2VmaWxlCmluZGV4IDhkNGU0NzguLmFiNGM1MmMgMTAwNjQ0Ci0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvTWFrZWZpbGUKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9NYWtlZmlsZQpAQCAtMjYsNyArMjYsNyBAQAogTElCCT0gJChvYmopbGliJChTT0MpLmEKIAogQ09CSlMJPSBiY201MjIxLm8gZG05MTYxLm8gZXRoZXIubyBpMmMubyBpbnRlcnJ1cHRzLm8gXAotCSAgbHh0OTcyLm8gc2VyaWFsLm8gdXNiX29oY2kubworCSAgbHh0OTcyLm8gc2VyaWFsLm8gdXNiLm8gc3BpLm8KIFNPQkpTCT0gbG93bGV2ZWxfaW5pdC5vCiAKIFNSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvYmNtNTIyMS5jIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9iY201MjIxLmMKaW5kZXggNmRiMTQzNS4uYjUyYzYxNSAxMDA2NDQKLS0tIGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9iY201MjIxLmMKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9iY201MjIxLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTIyNyw2ICsyMjcsNiBAQAogCXJldHVybiBGQUxTRTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUICovCisjZW5kaWYKIAogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvZG05MTYxLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2RtOTE2MS5jCmluZGV4IDRiMTNjMjMuLjFiZWI2ZTggMTAwNjQ0Ci0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvZG05MTYxLmMKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9kbTkxNjEuYwpAQCAtMjcsNyArMjcsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qCiAgKiBOYW1lOgpAQCAtOTUsNyArOTUsNyBAQAogCQlyZXR1cm4gVFJVRTsKIAl9CiAKLQlpZiAoKHN0YXQxICYgRE05MTYxXzEwMEJBU0VfVDRfSEQpICYmIChzdGF0MiAmIERNOTE2MV8xMDBIRFgpKSB7CisJaWYgKChzdGF0MSAmIERNOTE2MV8xMDBCQVNFX1RYX0hEKSAmJiAoc3RhdDIgJiBETTkxNjFfMTAwSERYKSkgewogCQkvKnNldCBNSUkgZm9yIDEwMEJhc2VUWCBhbmQgSGFsZiBEdXBsZXggICovCiAJCXBfbWFjLT5FTUFDX0NGRyA9IChwX21hYy0+RU1BQ19DRkcgJgogCQkJCX4oQVQ5MUNfRU1BQ19TUEQgfCBBVDkxQ19FTUFDX0ZEKSkKQEAgLTE0MCw3ICsxNDAsNyBAQAogCWF0OTFybTkyMDBfRW1hY1JlYWRQaHkgKHBfbWFjLCBETTkxNjFfTURJTlRSLCAmSW50VmFsdWUpOwogCS8qIHNldCBGRFgsIFNQRCwgTGluaywgSU5UUiBtYXNrcyAqLwogCUludFZhbHVlIHw9IChETTkxNjFfRkRYX01BU0sgfCBETTkxNjFfU1BEX01BU0sgfAotCQkgICAgIERNOTE2MV9MSU5LX01BU0sgfCBETTkxNjFfSU5UUl9NQVNLKTsKKwkJCURNOTE2MV9MSU5LX01BU0sgfCBETTkxNjFfSU5UUl9NQVNLKTsKIAlhdDkxcm05MjAwX0VtYWNXcml0ZVBoeSAocF9tYWMsIERNOTE2MV9NRElOVFIsICZJbnRWYWx1ZSk7CiAJYXQ5MXJtOTIwMF9FbWFjRGlzYWJsZU1ESU8gKHBfbWFjKTsKIApAQCAtMTc0LDEwICsxNzQsMTEgQEAKIAlpZiAoIWF0OTFybTkyMDBfRW1hY1dyaXRlUGh5IChwX21hYywgRE05MTYxX0JNQ1IsICZ2YWx1ZSkpCiAJCXJldHVybiBGQUxTRTsKIAotCS8qIFNldCB0aGUgQXV0b19uZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICovCi0JLyogTUlJIGFkdmVydGlzaW5nIGZvciBOZXh0IHBhZ2UsIDEwMEJhc2VUeEZEIGFuZCBIRCwgMTBCYXNlVEZEIGFuZCBIRCwgSUVFRSA4MDIuMyAqLworCS8qIFNldCB0aGUgQXV0b19uZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCSovCisJLyogTUlJIGFkdmVydGlzaW5nIGZvciBOZXh0IHBhZ2UsIDEwMEJhc2VUeEZEIGFuZCBIRCwJKi8KKwkvKiAxMEJhc2VURkQgYW5kIEhELCBJRUVFIDgwMi4zICovCiAJUGh5QW5hciA9IERNOTE2MV9OUCB8IERNOTE2MV9UWF9GRFggfCBETTkxNjFfVFhfSERYIHwKLQkJICBETTkxNjFfMTBfRkRYIHwgRE05MTYxXzEwX0hEWCB8IERNOTE2MV9BTl9JRUVFXzgwMl8zOworCQkJRE05MTYxXzEwX0ZEWCB8IERNOTE2MV8xMF9IRFggfCBETTkxNjFfQU5fSUVFRV84MDJfMzsKIAlpZiAoIWF0OTFybTkyMDBfRW1hY1dyaXRlUGh5IChwX21hYywgRE05MTYxX0FOQVIsICZQaHlBbmFyKSkKIAkJcmV0dXJuIEZBTFNFOwogCkBAIC0yMjAsNiArMjIxLDYgQEAKIAlyZXR1cm4gRkFMU0U7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKICNlbmRpZgkvKiBDT05GSUdfRFJJVkVSX0VUSEVSICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2V0aGVyLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2V0aGVyLmMKaW5kZXggNjcwMDhkMC4uYzhmNTZhYSAxMDA2NDQKLS0tIGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9ldGhlci5jCisrKyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvZXRoZXIuYwpAQCAtNTAsNyArNTAsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qIGFsaWdubWVudCBhcyBwZXIgRXJyYXRhICMxMSAoNjQgYnl0ZXMpIGlzIGluc3VmZmljaWVudCEgKi8KIHJiZl90IHJiZmR0W1JCRl9GUkFNRU1BWF0gX19hdHRyaWJ1dGUoKGFsaWduZWQoNTEyKSkpOwpAQCAtMjY1LDcgKzI2NSw3IEBACiB7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogaW50ICBhdDkxcm05MjAwX21paXBoeV9yZWFkKGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgYWRkciwKIAkJdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIHNob3J0ICogdmFsdWUpCiB7CkBAIC0yODQsMTYgKzI4NCwxNiBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYJLyogZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogaW50IGF0OTFybTkyMDBfbWlpcGh5X2luaXRpYWxpemUoYmRfdCAqYmlzKQogewotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfcmVnaXN0ZXIoImF0OTFybTkyMDBwaHkiLCBhdDkxcm05MjAwX21paXBoeV9yZWFkLCBhdDkxcm05MjAwX21paXBoeV93cml0ZSk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUICovCisjZW5kaWYKIAogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvbHh0OTcyLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2x4dDk3Mi5jCmluZGV4IGYxMmM1OWMuLjRlZGNjOWEgMTAwNjQ0Ci0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvbHh0OTcyLmMKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9seHQ5NzIuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qCiAgKiBOYW1lOgpAQCAtMTg2LDYgKzE4Niw2IEBACiAJcmV0dXJuIChseHQ5NzJfR2V0TGlua1NwZWVkIChwX21hYykpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9zcGkuYyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1ZDE4NQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvc3BpLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIERyaXZlciBmb3IgQVRNRUwgRGF0YUZsYXNoIHN1cHBvcnQKKyAqIEF1dGhvciA6IEhhbWlkIElrZG91bWkgKEF0bWVsKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNpZmRlZiBDT05GSUdfSEFTX0RBVEFGTEFTSAorI2luY2x1ZGUgPGRhdGFmbGFzaC5oPgorCisjZGVmaW5lIEFUOTFDX1NQSV9DTEsJMTAwMDAwMDAJLyogTWF4IFZhbHVlID0gMTBNSHogdG8gYmUgY29tcGxpYW50IHRvCisJCQkJCXRoZSBDb250aW51b3VzIEFycmF5IFJlYWQgZnVuY3Rpb24gKi8KKworLyogQUMgQ2hhcmFjdGVyaXN0aWNzICovCisvKiBETFlCUyA9IHRDU1MgPSAyNTBucyBtaW4gYW5kIERMWUJDVCA9IHRDU0ggPSAyNTBucyAqLworI2RlZmluZSBEQVRBRkxBU0hfVENTUwkoMHhDIDw8IDE2KQorI2RlZmluZSBEQVRBRkxBU0hfVENIUwkoMHgxIDw8IDI0KQorCisjZGVmaW5lIEFUOTFDX1RJTUVPVVRfV1JEWQkJMjAwMDAwCisjZGVmaW5lIEFUOTFDX1NQSV9QQ1MwX1NFUklBTF9EQVRBRkxBU0gJMHhFCS8qIENoaXAgU2VsZWN0IDA6IE5QQ1MwJTExMTAgKi8KKyNkZWZpbmUgQVQ5MUNfU1BJX1BDUzNfREFUQUZMQVNIX0NBUkQJMHg3CS8qIENoaXAgU2VsZWN0IDM6IE5QQ1MzJTAxMTEgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCVNQSSBEYXRhRmxhc2ggSW5pdAkJCQkJICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQVQ5MUZfU3BpSW5pdCh2b2lkKQoreworCS8qIENvbmZpZ3VyZSBQSU9zICovCisJQVQ5MUNfQkFTRV9QSU9BLT5QSU9fQVNSID0KKwkJQVQ5MUNfUEEzX05QQ1MwIHwgQVQ5MUNfUEE0X05QQ1MxIHwgQVQ5MUNfUEExX01PU0kgfAorCQlBVDkxQ19QQTVfTlBDUzIgfCBBVDkxQ19QQTZfTlBDUzMgfCBBVDkxQ19QQTBfTUlTTyB8CisJCUFUOTFDX1BBMl9TUENLOworCUFUOTFDX0JBU0VfUElPQS0+UElPX1BEUiA9CisJCUFUOTFDX1BBM19OUENTMCB8IEFUOTFDX1BBNF9OUENTMSB8IEFUOTFDX1BBMV9NT1NJIHwKKwkJQVQ5MUNfUEE1X05QQ1MyIHwgQVQ5MUNfUEE2X05QQ1MzIHwgQVQ5MUNfUEEwX01JU08gfAorCQlBVDkxQ19QQTJfU1BDSzsKKwkvKiBFbmFibGUgQ0xvY2sgKi8KKwlBVDkxQ19CQVNFX1BNQy0+UE1DX1BDRVIgPSAxIDw8IEFUOTFDX0lEX1NQSTsKKworCS8qIFJlc2V0IHRoZSBTUEkgKi8KKwlBVDkxQ19CQVNFX1NQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NXUlNUOworCisJLyogQ29uZmlndXJlIFNQSSBpbiBNYXN0ZXIgTW9kZSB3aXRoIE5vIENTIHNlbGVjdGVkICEhISAqLworCUFUOTFDX0JBU0VfU1BJLT5TUElfTVIgPQorCQlBVDkxQ19TUElfTVNUUiB8IEFUOTFDX1NQSV9NT0RGRElTIHwgQVQ5MUNfU1BJX1BDUzsKKworCS8qIENvbmZpZ3VyZSBDUzAgYW5kIENTMyAqLworCSooQVQ5MUNfU1BJX0NTUiArIDApID0KKwkJQVQ5MUNfU1BJX0NQT0wgfCAoQVQ5MUNfU1BJX0RMWUJTICYgREFUQUZMQVNIX1RDU1MpIHwKKwkJKEFUOTFDX1NQSV9ETFlCQ1QgJiBEQVRBRkxBU0hfVENIUykgfAorCQkoKEFUOTFDX01BU1RFUl9DTE9DSyAvICgyKkFUOTFDX1NQSV9DTEspKSA8PCA4KTsKKworCSooQVQ5MUNfU1BJX0NTUiArIDMpID0KKwkJQVQ5MUNfU1BJX0NQT0wgfCAoQVQ5MUNfU1BJX0RMWUJTICYgREFUQUZMQVNIX1RDU1MpIHwKKwkJKEFUOTFDX1NQSV9ETFlCQ1QgJiBEQVRBRkxBU0hfVENIUykgfAorCQkoKEFUOTFDX01BU1RFUl9DTE9DSyAvICgyKkFUOTFDX1NQSV9DTEspKSA8PCA4KTsKK30KKwordm9pZCBBVDkxRl9TcGlFbmFibGUoaW50IGNzKQoreworCXN3aXRjaChjcykgeworCWNhc2UgMDoJLyogQ29uZmlndXJlIFNQSSBDUzAgZm9yIFNlcmlhbCBEYXRhRmxhc2ggQVQ0NURCeHggKi8KKwkJQVQ5MUNfQkFTRV9TUEktPlNQSV9NUiAmPSAweEZGRjBGRkZGOworCQlBVDkxQ19CQVNFX1NQSS0+U1BJX01SIHw9CisJCQkoKEFUOTFDX1NQSV9QQ1MwX1NFUklBTF9EQVRBRkxBU0g8PDE2KSAmCisJCQkJQVQ5MUNfU1BJX1BDUyk7CisJCWJyZWFrOworCWNhc2UgMzoJLyogQ29uZmlndXJlIFNQSSBDUzMgZm9yIFNlcmlhbCBEYXRhRmxhc2ggQ2FyZCAqLworCQkvKiBTZXQgdXAgUElPIFNEQ19UWVBFIHRvIHN3aXRjaCBvbiBEYXRhRmxhc2ggQ2FyZCAqLworCQkvKiBhbmQgbm90IE1NQy9TRENhcmQgKi8KKwkJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUEVSID0KKwkJCUFUOTFDX1BJT19QQjc7CS8qIFNldCBpbiBQSU8gbW9kZSAqLworCQlBVDkxQ19CQVNFX1BJT0ItPlBJT19PRVIgPQorCQkJQVQ5MUNfUElPX1BCNzsJLyogQ29uZmlndXJlIGluIG91dHB1dCAqLworCQkvKiBDbGVhciBPdXRwdXQgKi8KKwkJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fQ09EUiA9IEFUOTFDX1BJT19QQjc7CisJCS8qIENvbmZpZ3VyZSBQQ1MgKi8KKwkJQVQ5MUNfQkFTRV9TUEktPlNQSV9NUiAmPSAweEZGRjBGRkZGOworCQlBVDkxQ19CQVNFX1NQSS0+U1BJX01SIHw9CisJCQkoKEFUOTFDX1NQSV9QQ1MzX0RBVEFGTEFTSF9DQVJEPDwxNikgJiBBVDkxQ19TUElfUENTKTsKKwkJYnJlYWs7CisJfQorCisJLyogU1BJX0VuYWJsZSAqLworCUFUOTFDX0JBU0VfU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1BJRU47IH0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogXGZuICAgIEFUOTFGX1NwaVdyaXRlCQkJCQkJICAgICAqLworLyogXGJyaWVmIFNldCB0aGUgUERDIHJlZ2lzdGVycyBmb3IgYSB0cmFuc2ZlcnQJCQkJICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordW5zaWduZWQgaW50IEFUOTFGX1NwaVdyaXRlICggQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MgKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCisJcERlc2MtPnN0YXRlID0gQlVTWTsKKworCUFUOTFDX0JBU0VfU1BJLT5TUElfUFRDUiA9IEFUOTFDX1BEQ19UWFRESVMgKyBBVDkxQ19QRENfUlhURElTOworCisJLyogSW5pdGlhbGl6ZSB0aGUgVHJhbnNtaXQgYW5kIFJlY2VpdmUgUG9pbnRlciAqLworCUFUOTFDX0JBU0VfU1BJLT5TUElfUlBSID0gKHVuc2lnbmVkIGludClwRGVzYy0+cnhfY21kX3B0IDsKKwlBVDkxQ19CQVNFX1NQSS0+U1BJX1RQUiA9ICh1bnNpZ25lZCBpbnQpcERlc2MtPnR4X2NtZF9wdCA7CisKKwkvKiBJbnRpYWxpemUgdGhlIFRyYW5zbWl0IGFuZCBSZWNlaXZlIENvdW50ZXJzICovCisJQVQ5MUNfQkFTRV9TUEktPlNQSV9SQ1IgPSBwRGVzYy0+cnhfY21kX3NpemU7CisJQVQ5MUNfQkFTRV9TUEktPlNQSV9UQ1IgPSBwRGVzYy0+dHhfY21kX3NpemU7CisKKwlpZiAoIHBEZXNjLT50eF9kYXRhX3NpemUgIT0gMCApIHsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgTmV4dCBUcmFuc21pdCBhbmQgTmV4dCBSZWNlaXZlIFBvaW50ZXIgKi8KKwkJQVQ5MUNfQkFTRV9TUEktPlNQSV9STlBSID0gKHVuc2lnbmVkIGludClwRGVzYy0+cnhfZGF0YV9wdCA7CisJCUFUOTFDX0JBU0VfU1BJLT5TUElfVE5QUiA9ICh1bnNpZ25lZCBpbnQpcERlc2MtPnR4X2RhdGFfcHQgOworCisJCS8qIEludGlhbGl6ZSB0aGUgTmV4dCBUcmFuc21pdCBhbmQgTmV4dCBSZWNlaXZlIENvdW50ZXJzICovCisJCUFUOTFDX0JBU0VfU1BJLT5TUElfUk5DUiA9IHBEZXNjLT5yeF9kYXRhX3NpemUgOworCQlBVDkxQ19CQVNFX1NQSS0+U1BJX1ROQ1IgPSBwRGVzYy0+dHhfZGF0YV9zaXplIDsKKwl9CisKKwkvKiBhcm0gc2ltcGxlLCBub24gaW50ZXJydXB0IGRlcGVuZGVudCB0aW1lciAqLworCXJlc2V0X3RpbWVyX21hc2tlZCgpOworCXRpbWVvdXQgPSAwOworCisJQVQ5MUNfQkFTRV9TUEktPlNQSV9QVENSID0gQVQ5MUNfUERDX1RYVEVOICsgQVQ5MUNfUERDX1JYVEVOOworCXdoaWxlKCEoQVQ5MUNfQkFTRV9TUEktPlNQSV9TUiAmIEFUOTFDX1NQSV9SWEJVRkYpICYmCisJCSgodGltZW91dCA9IGdldF90aW1lcl9tYXNrZWQoKSApIDwgQ0ZHX1NQSV9XUklURV9UT1VUKSk7CisJQVQ5MUNfQkFTRV9TUEktPlNQSV9QVENSID0gQVQ5MUNfUERDX1RYVERJUyArIEFUOTFDX1BEQ19SWFRESVM7CisJcERlc2MtPnN0YXRlID0gSURMRTsKKworCWlmICh0aW1lb3V0ID49IENGR19TUElfV1JJVEVfVE9VVCl7CisJCXByaW50ZigiRXJyb3IgVGltZW91dFxuXHIiKTsKKwkJcmV0dXJuIERBVEFGTEFTSF9FUlJPUjsKKwl9CisKKwlyZXR1cm4gREFUQUZMQVNIX09LOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYi5jIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjYyNjJlCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2IuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxta0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpCisjIGlmZGVmIENPTkZJR19BVDkxUk05MjAwCisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCitpbnQgdXNiX2NwdV9pbml0KCkKK3sKKwkvKiBFbmFibGUgVVNCIGhvc3QgY2xvY2suICovCisJKkFUOTFDX1BNQ19TQ0VSID0gQVQ5MUNfUE1DX1VIUDsJLyogNDhNSHogY2xvY2sgZW5hYmxlZCBmb3IgVUhQICovCisJKkFUOTFDX1BNQ19QQ0VSID0gMSA8PCBBVDkxQ19JRF9VSFA7CS8qIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyICovCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X3N0b3AoKQoreworCS8qIEluaXRpYWxpemF0aW9uIGZhaWxlZCAqLworCSpBVDkxQ19QTUNfUENEUiA9IDEgPDwgQVQ5MUNfSURfVUhQOwkvKiBQZXJpcGhlcmFsIENsb2NrIERpc2FibGUgUmVnaXN0ZXIgKi8KKwkqQVQ5MUNfUE1DX1NDRFIgPSBBVDkxQ19QTUNfVUhQOwkvKiA0OE1IeiBjbG9jayBkaXNhYmxlZCBmb3IgVUhQICovCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X2luaXRfZmFpbCgpCit7CisJdXNiX2NwdV9zdG9wKCk7Cit9CisKKyMgZW5kaWYgLyogQ09ORklHX0FUOTFSTTkyMDAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYl9vaGNpLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYl9vaGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMmM1NmMuLjAwMDAwMDAKLS0tIGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2Jfb2hjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzNSArMCwwIEBACi0vKgotICogVVJCIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCIG9uIHRoZSBBVDkxUk05MjAwLgotICoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMwotICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPGdqQGRlbnguZGU+Ci0gKgotICogTm90ZTogTXVjaCBvZiB0aGlzIGNvZGUgaGFzIGJlZW4gZGVyaXZlZCBmcm9tIExpbnV4IDIuNAotICogKEMpIENvcHlyaWdodCAxOTk5IFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KLSAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyIERhdmlkIEJyb3duZWxsCi0gKgotICogTW9kaWZpZWQgZm9yIHRoZSBNUDJVU0IgYnkgKEMpIENvcHlyaWdodCAyMDA1IEVyaWMgQmVuYXJkCi0gKiBlYmVuYXJkQGV1a3JlYS5jb20gLSBiYXNlZCBvbiBzM2MyNHgwJ3MgZHJpdmVyCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKgotICovCi0vKgotICogSU1QT1JUQU5UIE5PVEVTCi0gKiAxIC0geW91IE1VU1QgZGVmaW5lIExJVFRMRUVORElBTiBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUKLSAqICAgICBib2FyZCBvciB0aGlzIGRyaXZlciB3aWxsIE5PVCB3b3JrIQotICogMiAtIHRoaXMgZHJpdmVyIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBVU0IgTWFzcyBTdG9yYWdlIERldmljZXMKLSAqICAgICAoQkJCKSBPTkxZLiBUaGVyZSBpcyBOTyBzdXBwb3J0IGZvciBJbnRlcnJ1cHQgb3IgSXNvY2hyb25vdXMgcGlwZXMhCi0gKiAzIC0gd2hlbiBydW5uaW5nIG9uIGEgUFFGUDIwOCBBVDkxUk05MjAwLCBkZWZpbmUgQ09ORklHX0FUOTFDX1BRRlBfVUhQQlVHCi0gKiAgICAgdG8gYWN0aXZhdGUgd29ya2Fyb3VuZCBmb3IgYnVnICM0MSBvciB0aGlzIGRyaXZlciB3aWxsIE5PVCB3b3JrIQotICovCi0KLSNpbmNsdWRlIDxjb21tb24uaD4KLS8qICNpbmNsdWRlIDxwY2kuaD4gbm8gUENJIG9uIHRoZSBTM0MyNFgwICovCi0KLSNpZmRlZiBDT05GSUdfVVNCX09IQ0kKLQotI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+Ci0KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDx1c2IuaD4KLSNpbmNsdWRlICJ1c2Jfb2hjaS5oIgotCi0jZGVmaW5lIE9IQ0lfVVNFX05QUwkJLyogZm9yY2UgTm9Qb3dlclN3aXRjaGluZyBtb2RlICovCi0jdW5kZWYgT0hDSV9WRVJCT1NFX0RFQlVHCS8qIG5vdCBhbHdheXMgaGVscGZ1bCAqLwotCi0vKiBGb3IgaW5pdGlhbGl6aW5nIGNvbnRyb2xsZXIgKG1hc2sgaW4gYW4gSENGUyBtb2RlIHRvbykgKi8KLSNkZWZpbmUgT0hDSV9DT05UUk9MX0lOSVQgXAotCShPSENJX0NUUkxfQ0JTUiAmIDB4MykgfCBPSENJX0NUUkxfSUUgfCBPSENJX0NUUkxfUExFCi0KLSNkZWZpbmUgcmVhZGwoYSkgKCooKHZ1X2xvbmcgKikoYSkpKQotI2RlZmluZSB3cml0ZWwoYSwgYikgKCooKHZ1X2xvbmcgKikoYikpID0gKCh2dV9sb25nKWEpKQotCi0jZGVmaW5lIG1pbl90KHR5cGUseCx5KSAoeyB0eXBlIF9feCA9ICh4KTsgdHlwZSBfX3kgPSAoeSk7IF9feCA8IF9feSA/IF9feDogX195OyB9KQotCi0jdW5kZWYgREVCVUcKLSNpZmRlZiBERUJVRwotI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiREVCVUc6ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKLSNlbmRpZiAvKiBERUJVRyAqLwotI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiRVJST1I6ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKLSN1bmRlZiBTSE9XX0lORk8KLSNpZmRlZiBTSE9XX0lORk8KLSNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJJTkZPOiAiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCi0jZWxzZQotI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSgwKQotI2VuZGlmCi0KLSNkZWZpbmUgbTE2X3N3YXAoeCkgc3dhcF8xNih4KQotI2RlZmluZSBtMzJfc3dhcCh4KSBzd2FwXzMyKHgpCi0KLS8qIGdsb2JhbCBvaGNpX3QgKi8KLXN0YXRpYyBvaGNpX3QgZ29oY2k7Ci0vKiB0aGlzIG11c3QgYmUgYWxpZ25lZCB0byBhIDI1NiBieXRlIGJvdW5kYXJ5ICovCi1zdHJ1Y3Qgb2hjaV9oY2NhIGdoY2NhWzFdOwotLyogYSBwb2ludGVyIHRvIHRoZSBhbGlnbmVkIHN0b3JhZ2UgKi8KLXN0cnVjdCBvaGNpX2hjY2EgKnBoY2NhOwotLyogdGhpcyBhbGxvY2F0ZXMgRURzIGZvciBhbGwgcG9zc2libGUgZW5kcG9pbnRzICovCi1zdHJ1Y3Qgb2hjaV9kZXZpY2Ugb2hjaV9kZXY7Ci0vKiB1cmJfcHJpdiAqLwotdXJiX3ByaXZfdCB1cmJfcHJpdjsKLS8qIFJIU0MgZmxhZyAqLwotaW50IGdvdF9yaHNjOwotLyogZGV2aWNlIHdoaWNoIHdhcyBkaXNjb25uZWN0ZWQgKi8KLXN0cnVjdCB1c2JfZGV2aWNlICpkZXZnb25lOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBBTUQtNzU2IChEMiByZXYpIHJlcG9ydHMgY29ycnVwdCByZWdpc3RlciBjb250ZW50cyBpbiBzb21lIGNhc2VzLgotICogVGhlIGVycmF0dW0gKCM0KSBkZXNjcmlwdGlvbiBpcyBpbmNvcnJlY3QuICBBTUQncyB3b3JrYXJvdW5kIHdhaXRzCi0gKiB0aWxsIHNvbWUgYml0cyAobW9zdGx5IHJlc2VydmVkKSBhcmUgY2xlYXI7IG9rIGZvciBhbGwgcmV2cy4KLSAqLwotI2RlZmluZSBPSENJX1FVSVJLX0FNRDc1NiAweGFiY2QKLSNkZWZpbmUgcmVhZF9yb290aHViKGhjLCByZWdpc3RlciwgbWFzaykgKHsgXAotCXUzMiB0ZW1wID0gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5yZWdpc3Rlcik7IFwKLQlpZiAoaGMtPmZsYWdzICYgT0hDSV9RVUlSS19BTUQ3NTYpIFwKLQkJd2hpbGUgKHRlbXAgJiBtYXNrKSBcCi0JCQl0ZW1wID0gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5yZWdpc3Rlcik7IFwKLQl0ZW1wOyB9KQotCi1zdGF0aWMgdTMyIHJvb3RodWJfYSAoc3RydWN0IG9oY2kgKmhjKQotCXsgcmV0dXJuIHJlYWRfcm9vdGh1YiAoaGMsIGEsIDB4ZmMwZmUwMDApOyB9Ci1zdGF0aWMgaW5saW5lIHUzMiByb290aHViX2IgKHN0cnVjdCBvaGNpICpoYykKLQl7IHJldHVybiByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLmIpOyB9Ci1zdGF0aWMgaW5saW5lIHUzMiByb290aHViX3N0YXR1cyAoc3RydWN0IG9oY2kgKmhjKQotCXsgcmV0dXJuIHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIuc3RhdHVzKTsgfQotc3RhdGljIHUzMiByb290aHViX3BvcnRzdGF0dXMgKHN0cnVjdCBvaGNpICpoYywgaW50IGkpCi0JeyByZXR1cm4gcmVhZF9yb290aHViIChoYywgcG9ydHN0YXR1cyBbaV0sIDB4ZmZlMGZjZTApOyB9Ci0KLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotc3RhdGljIGludCBoY19pbnRlcnJ1cHQgKHZvaWQpOwotc3RhdGljIHZvaWQKLXRkX3N1Ym1pdF9qb2IgKHN0cnVjdCB1c2JfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKiBidWZmZXIsCi0JaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKiBzZXR1cCwgdXJiX3ByaXZfdCAqIHVyYiwgaW50IGludGVydmFsKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogVVJCIHN1cHBvcnQgZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBmcmVlIEhDRC1wcml2YXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVVJCICovCi0KLXN0YXRpYyB2b2lkIHVyYl9mcmVlX3ByaXYgKHVyYl9wcml2X3QgKiB1cmIpCi17Ci0JaW50CQlpOwotCWludAkJbGFzdDsKLQlzdHJ1Y3QgdGQJKiB0ZDsKLQotCWxhc3QgPSB1cmItPmxlbmd0aCAtIDE7Ci0JaWYgKGxhc3QgPj0gMCkgewotCQlmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgewotCQkJdGQgPSB1cmItPnRkW2ldOwotCQkJaWYgKHRkKSB7Ci0JCQkJdGQtPnVzYl9kZXYgPSBOVUxMOwotCQkJCXVyYi0+dGRbaV0gPSBOVUxMOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyBpbnQgc29oY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyIChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldik7Ci0KLS8qIGRlYnVnfCBwcmludCB0aGUgbWFpbiBjb21wb25lbnRzIG9mIGFuIFVSQgotICogc21hbGw6IDApIGhlYWRlciArIGRhdGEgcGFja2V0cyAxKSBqdXN0IGhlYWRlciAqLwotCi1zdGF0aWMgdm9pZCBwa3RfcHJpbnQgKHN0cnVjdCB1c2JfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKiBidWZmZXIsCi0JaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKiBzZXR1cCwgY2hhciAqIHN0ciwgaW50IHNtYWxsKQotewotCXVyYl9wcml2X3QgKiBwdXJiID0gJnVyYl9wcml2OwotCi0JZGJnKCIlcyBVUkI6WyU0eF0gZGV2OiUyZCxlcDolMmQtJWMsdHlwZTolcyxsZW46JWQvJWQgc3RhdDolI2x4IiwKLQkJCXN0ciwKLQkJCXNvaGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlciAoZGV2KSwKLQkJCXVzYl9waXBlZGV2aWNlIChwaXBlKSwKLQkJCXVzYl9waXBlZW5kcG9pbnQgKHBpcGUpLAotCQkJdXNiX3BpcGVvdXQgKHBpcGUpPyAnTyc6ICdJJywKLQkJCXVzYl9waXBldHlwZSAocGlwZSkgPCAyPyAodXNiX3BpcGVpbnQgKHBpcGUpPyAiSU5UUiI6ICJJU09DIik6Ci0JCQkJKHVzYl9waXBlY29udHJvbCAocGlwZSk/ICJDVFJMIjogIkJVTEsiKSwKLQkJCXB1cmItPmFjdHVhbF9sZW5ndGgsCi0JCQl0cmFuc2Zlcl9sZW4sIGRldi0+c3RhdHVzKTsKLSNpZmRlZglPSENJX1ZFUkJPU0VfREVCVUcKLQlpZiAoIXNtYWxsKSB7Ci0JCWludCBpLCBsZW47Ci0KLQkJaWYgKHVzYl9waXBlY29udHJvbCAocGlwZSkpIHsKLQkJCXByaW50ZiAoX19GSUxFX18gIjogY21kKDgpOiIpOwotCQkJZm9yIChpID0gMDsgaSA8IDggOyBpKyspCi0JCQkJcHJpbnRmICgiICUwMngiLCAoKF9fdTggKikgc2V0dXApIFtpXSk7Ci0JCQlwcmludGYgKCJcbiIpOwotCQl9Ci0JCWlmICh0cmFuc2Zlcl9sZW4gPiAwICYmIGJ1ZmZlcikgewotCQkJcHJpbnRmIChfX0ZJTEVfXyAiOiBkYXRhKCVkLyVkKToiLAotCQkJCXB1cmItPmFjdHVhbF9sZW5ndGgsCi0JCQkJdHJhbnNmZXJfbGVuKTsKLQkJCWxlbiA9IHVzYl9waXBlb3V0IChwaXBlKT8KLQkJCQkJdHJhbnNmZXJfbGVuOiBwdXJiLT5hY3R1YWxfbGVuZ3RoOwotCQkJZm9yIChpID0gMDsgaSA8IDE2ICYmIGkgPCBsZW47IGkrKykKLQkJCQlwcmludGYgKCIgJTAyeCIsICgoX191OCAqKSBidWZmZXIpIFtpXSk7Ci0JCQlwcmludGYgKCIlc1xuIiwgaSA8IGxlbj8gIi4uLiI6ICIiKTsKLQkJfQotCX0KLSNlbmRpZgotfQotCi0vKiBqdXN0IGZvciBkZWJ1Z2dpbmc7IHByaW50cyBub24tZW1wdHkgYnJhbmNoZXMgb2YgdGhlIGludCBlZCB0cmVlIGluY2x1c2l2ZSBpc28gZWRzKi8KLXZvaWQgZXBfcHJpbnRfaW50X2VkcyAob2hjaV90ICpvaGNpLCBjaGFyICogc3RyKSB7Ci0JaW50IGksIGo7Ci0JIF9fdTMyICogZWRfcDsKLQlmb3IgKGk9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCWogPSA1OwotCQllZF9wID0gJihvaGNpLT5oY2NhLT5pbnRfdGFibGUgW2ldKTsKLQkJaWYgKCplZF9wID09IDApCi0JCSAgICBjb250aW51ZTsKLQkJcHJpbnRmIChfX0ZJTEVfXyAiOiAlcyBicmFuY2ggaW50ICUyZCglMngpOiIsIHN0ciwgaSwgaSk7Ci0JCXdoaWxlICgqZWRfcCAhPSAwICYmIGotLSkgewotCQkJZWRfdCAqZWQgPSAoZWRfdCAqKW0zMl9zd2FwKGVkX3ApOwotCQkJcHJpbnRmICgiIGVkOiAlNHg7IiwgZWQtPmh3SU5GTyk7Ci0JCQllZF9wID0gJmVkLT5od05leHRFRDsKLQkJfQotCQlwcmludGYgKCJcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgb2hjaV9kdW1wX2ludHJfbWFzayAoY2hhciAqbGFiZWwsIF9fdTMyIG1hc2spCi17Ci0JZGJnICgiJXM6IDB4JTA4eCVzJXMlcyVzJXMlcyVzJXMlcyIsCi0JCWxhYmVsLAotCQltYXNrLAotCQkobWFzayAmIE9IQ0lfSU5UUl9NSUUpID8gIiBNSUUiIDogIiIsCi0JCShtYXNrICYgT0hDSV9JTlRSX09DKSA/ICIgT0MiIDogIiIsCi0JCShtYXNrICYgT0hDSV9JTlRSX1JIU0MpID8gIiBSSFNDIiA6ICIiLAotCQkobWFzayAmIE9IQ0lfSU5UUl9GTk8pID8gIiBGTk8iIDogIiIsCi0JCShtYXNrICYgT0hDSV9JTlRSX1VFKSA/ICIgVUUiIDogIiIsCi0JCShtYXNrICYgT0hDSV9JTlRSX1JEKSA/ICIgUkQiIDogIiIsCi0JCShtYXNrICYgT0hDSV9JTlRSX1NGKSA/ICIgU0YiIDogIiIsCi0JCShtYXNrICYgT0hDSV9JTlRSX1dESCkgPyAiIFdESCIgOiAiIiwKLQkJKG1hc2sgJiBPSENJX0lOVFJfU08pID8gIiBTTyIgOiAiIgotCQkpOwotfQotCi1zdGF0aWMgdm9pZCBtYXliZV9wcmludF9lZHMgKGNoYXIgKmxhYmVsLCBfX3UzMiB2YWx1ZSkKLXsKLQllZF90ICplZHAgPSAoZWRfdCAqKXZhbHVlOwotCi0JaWYgKHZhbHVlKSB7Ci0JCWRiZyAoIiVzICUwOHgiLCBsYWJlbCwgdmFsdWUpOwotCQlkYmcgKCIlMDh4IiwgZWRwLT5od0lORk8pOwotCQlkYmcgKCIlMDh4IiwgZWRwLT5od1RhaWxQKTsKLQkJZGJnICgiJTA4eCIsIGVkcC0+aHdIZWFkUCk7Ci0JCWRiZyAoIiUwOHgiLCBlZHAtPmh3TmV4dEVEKTsKLQl9Ci19Ci0KLXN0YXRpYyBjaGFyICogaGNmczJzdHJpbmcgKGludCBzdGF0ZSkKLXsKLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgT0hDSV9VU0JfUkVTRVQ6CXJldHVybiAicmVzZXQiOwotCQljYXNlIE9IQ0lfVVNCX1JFU1VNRToJcmV0dXJuICJyZXN1bWUiOwotCQljYXNlIE9IQ0lfVVNCX09QRVI6CXJldHVybiAib3BlcmF0aW9uYWwiOwotCQljYXNlIE9IQ0lfVVNCX1NVU1BFTkQ6CXJldHVybiAic3VzcGVuZCI7Ci0JfQotCXJldHVybiAiPyI7Ci19Ci0KLS8qIGR1bXAgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLwotc3RhdGljIHZvaWQgb2hjaV9kdW1wX3N0YXR1cyAob2hjaV90ICpjb250cm9sbGVyKQotewotCXN0cnVjdCBvaGNpX3JlZ3MJKnJlZ3MgPSBjb250cm9sbGVyLT5yZWdzOwotCV9fdTMyCQkJdGVtcDsKLQotCXRlbXAgPSByZWFkbCAoJnJlZ3MtPnJldmlzaW9uKSAmIDB4ZmY7Ci0JaWYgKHRlbXAgIT0gMHgxMCkKLQkJZGJnICgic3BlYyAlZC4lZCIsICh0ZW1wID4+IDQpLCAodGVtcCAmIDB4MGYpKTsKLQotCXRlbXAgPSByZWFkbCAoJnJlZ3MtPmNvbnRyb2wpOwotCWRiZyAoImNvbnRyb2w6IDB4JTA4eCVzJXMlcyBIQ0ZTPSVzJXMlcyVzJXMgQ0JTUj0lZCIsIHRlbXAsCi0JCSh0ZW1wICYgT0hDSV9DVFJMX1JXRSkgPyAiIFJXRSIgOiAiIiwKLQkJKHRlbXAgJiBPSENJX0NUUkxfUldDKSA/ICIgUldDIiA6ICIiLAotCQkodGVtcCAmIE9IQ0lfQ1RSTF9JUikgPyAiIElSIiA6ICIiLAotCQloY2ZzMnN0cmluZyAodGVtcCAmIE9IQ0lfQ1RSTF9IQ0ZTKSwKLQkJKHRlbXAgJiBPSENJX0NUUkxfQkxFKSA/ICIgQkxFIiA6ICIiLAotCQkodGVtcCAmIE9IQ0lfQ1RSTF9DTEUpID8gIiBDTEUiIDogIiIsCi0JCSh0ZW1wICYgT0hDSV9DVFJMX0lFKSA/ICIgSUUiIDogIiIsCi0JCSh0ZW1wICYgT0hDSV9DVFJMX1BMRSkgPyAiIFBMRSIgOiAiIiwKLQkJdGVtcCAmIE9IQ0lfQ1RSTF9DQlNSCi0JCSk7Ci0KLQl0ZW1wID0gcmVhZGwgKCZyZWdzLT5jbWRzdGF0dXMpOwotCWRiZyAoImNtZHN0YXR1czogMHglMDh4IFNPQz0lZCVzJXMlcyVzIiwgdGVtcCwKLQkJKHRlbXAgJiBPSENJX1NPQykgPj4gMTYsCi0JCSh0ZW1wICYgT0hDSV9PQ1IpID8gIiBPQ1IiIDogIiIsCi0JCSh0ZW1wICYgT0hDSV9CTEYpID8gIiBCTEYiIDogIiIsCi0JCSh0ZW1wICYgT0hDSV9DTEYpID8gIiBDTEYiIDogIiIsCi0JCSh0ZW1wICYgT0hDSV9IQ1IpID8gIiBIQ1IiIDogIiIKLQkJKTsKLQotCW9oY2lfZHVtcF9pbnRyX21hc2sgKCJpbnRyc3RhdHVzIiwgcmVhZGwgKCZyZWdzLT5pbnRyc3RhdHVzKSk7Ci0Jb2hjaV9kdW1wX2ludHJfbWFzayAoImludHJlbmFibGUiLCByZWFkbCAoJnJlZ3MtPmludHJlbmFibGUpKTsKLQotCW1heWJlX3ByaW50X2VkcyAoImVkX3BlcmlvZGN1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX3BlcmlvZGN1cnJlbnQpKTsKLQotCW1heWJlX3ByaW50X2VkcyAoImVkX2NvbnRyb2xoZWFkIiwgcmVhZGwgKCZyZWdzLT5lZF9jb250cm9saGVhZCkpOwotCW1heWJlX3ByaW50X2VkcyAoImVkX2NvbnRyb2xjdXJyZW50IiwgcmVhZGwgKCZyZWdzLT5lZF9jb250cm9sY3VycmVudCkpOwotCi0JbWF5YmVfcHJpbnRfZWRzICgiZWRfYnVsa2hlYWQiLCByZWFkbCAoJnJlZ3MtPmVkX2J1bGtoZWFkKSk7Ci0JbWF5YmVfcHJpbnRfZWRzICgiZWRfYnVsa2N1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX2J1bGtjdXJyZW50KSk7Ci0KLQltYXliZV9wcmludF9lZHMgKCJkb25laGVhZCIsIHJlYWRsICgmcmVncy0+ZG9uZWhlYWQpKTsKLX0KLQotc3RhdGljIHZvaWQgb2hjaV9kdW1wX3Jvb3RodWIgKG9oY2lfdCAqY29udHJvbGxlciwgaW50IHZlcmJvc2UpCi17Ci0JX191MzIJCQl0ZW1wLCBuZHAsIGk7Ci0KLQl0ZW1wID0gcm9vdGh1Yl9hIChjb250cm9sbGVyKTsKLQluZHAgPSAodGVtcCAmIFJIX0FfTkRQKTsKLSNpZmRlZiBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKLQluZHAgPSAobmRwID09IDIpID8gMTowOwotI2VuZGlmCi0JaWYgKHZlcmJvc2UpIHsKLQkJZGJnICgicm9vdGh1Yi5hOiAlMDh4IFBPVFBHVD0lZCVzJXMlcyVzJXMgTkRQPSVkIiwgdGVtcCwKLQkJCSgodGVtcCAmIFJIX0FfUE9UUEdUKSA+PiAyNCkgJiAweGZmLAotCQkJKHRlbXAgJiBSSF9BX05PQ1ApID8gIiBOT0NQIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9BX09DUE0pID8gIiBPQ1BNIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9BX0RUKSA/ICIgRFQiIDogIiIsCi0JCQkodGVtcCAmIFJIX0FfTlBTKSA/ICIgTlBTIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9BX1BTTSkgPyAiIFBTTSIgOiAiIiwKLQkJCW5kcAotCQkJKTsKLQkJdGVtcCA9IHJvb3RodWJfYiAoY29udHJvbGxlcik7Ci0JCWRiZyAoInJvb3RodWIuYjogJTA4eCBQUENNPSUwNHggRFI9JTA0eCIsCi0JCQl0ZW1wLAotCQkJKHRlbXAgJiBSSF9CX1BQQ00pID4+IDE2LAotCQkJKHRlbXAgJiBSSF9CX0RSKQotCQkJKTsKLQkJdGVtcCA9IHJvb3RodWJfc3RhdHVzIChjb250cm9sbGVyKTsKLQkJZGJnICgicm9vdGh1Yi5zdGF0dXM6ICUwOHglcyVzJXMlcyVzJXMiLAotCQkJdGVtcCwKLQkJCSh0ZW1wICYgUkhfSFNfQ1JXRSkgPyAiIENSV0UiIDogIiIsCi0JCQkodGVtcCAmIFJIX0hTX09DSUMpID8gIiBPQ0lDIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9IU19MUFNDKSA/ICIgTFBTQyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfSFNfRFJXRSkgPyAiIERSV0UiIDogIiIsCi0JCQkodGVtcCAmIFJIX0hTX09DSSkgPyAiIE9DSSIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfSFNfTFBTKSA/ICIgTFBTIiA6ICIiCi0JCQkpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBuZHA7IGkrKykgewotCQl0ZW1wID0gcm9vdGh1Yl9wb3J0c3RhdHVzIChjb250cm9sbGVyLCBpKTsKLQkJZGJnICgicm9vdGh1Yi5wb3J0c3RhdHVzIFslZF0gPSAweCUwOHglcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMiLAotCQkJaSwKLQkJCXRlbXAsCi0JCQkodGVtcCAmIFJIX1BTX1BSU0MpID8gIiBQUlNDIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19PQ0lDKSA/ICIgT0NJQyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfUFNTQykgPyAiIFBTU0MiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX1BFU0MpID8gIiBQRVNDIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19DU0MpID8gIiBDU0MiIDogIiIsCi0KLQkJCSh0ZW1wICYgUkhfUFNfTFNEQSkgPyAiIExTREEiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX1BQUykgPyAiIFBQUyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfUFJTKSA/ICIgUFJTIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19QT0NJKSA/ICIgUE9DSSIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfUFNTKSA/ICIgUFNTIiA6ICIiLAotCi0JCQkodGVtcCAmIFJIX1BTX1BFUykgPyAiIFBFUyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfQ0NTKSA/ICIgQ0NTIiA6ICIiCi0JCQkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgb2hjaV9kdW1wIChvaGNpX3QgKmNvbnRyb2xsZXIsIGludCB2ZXJib3NlKQotewotCWRiZyAoIk9IQ0kgY29udHJvbGxlciB1c2ItJXMgc3RhdGUiLCBjb250cm9sbGVyLT5zbG90X25hbWUpOwotCi0JLyogZHVtcHMgc29tZSBvZiB0aGUgc3RhdGUgd2Uga25vdyBhYm91dCAqLwotCW9oY2lfZHVtcF9zdGF0dXMgKGNvbnRyb2xsZXIpOwotCWlmICh2ZXJib3NlKQotCQllcF9wcmludF9pbnRfZWRzIChjb250cm9sbGVyLCAiaGNjYSIpOwotCWRiZyAoImhjY2EgZnJhbWUgIyUwNHgiLCBjb250cm9sbGVyLT5oY2NhLT5mcmFtZV9ubyk7Ci0Jb2hjaV9kdW1wX3Jvb3RodWIgKGNvbnRyb2xsZXIsIDEpOwotfQotCi0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBJbnRlcmZhY2UgZnVuY3Rpb25zIChVUkIpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBnZXQgYSB0cmFuc2ZlciByZXF1ZXN0ICovCi0KLWludCBzb2hjaV9zdWJtaXRfam9iKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAotCQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXAsIGludCBpbnRlcnZhbCkKLXsKLQlvaGNpX3QgKm9oY2k7Ci0JZWRfdCAqIGVkOwotCXVyYl9wcml2X3QgKnB1cmJfcHJpdjsKLQlpbnQgaSwgc2l6ZSA9IDA7Ci0KLQlvaGNpID0gJmdvaGNpOwotCi0JLyogd2hlbiBjb250cm9sbGVyJ3MgaHVuZywgcGVybWl0IG9ubHkgcm9vdGh1YiBjbGVhbnVwIGF0dGVtcHRzCi0JICogc3VjaCBhcyBwb3dlcmluZyBkb3duIHBvcnRzICovCi0JaWYgKG9oY2ktPmRpc2FibGVkKSB7Ci0JCWVycigic29oY2lfc3VibWl0X2pvYjogRVBJUEUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGV2ZXJ5IGVuZHBvaW50IGhhcyBhIGVkLCBsb2NhdGUgYW5kIGZpbGwgaXQgKi8KLQlpZiAoIShlZCA9IGVwX2FkZF9lZCAoZGV2LCBwaXBlKSkpIHsKLQkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFTk9NRU0iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGZvciB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBVUkIgd2UgbmVlZCB0aGUgbnVtYmVyIG9mIFREcyAoc2l6ZSkgKi8KLQlzd2l0Y2ggKHVzYl9waXBldHlwZSAocGlwZSkpIHsKLQkJY2FzZSBQSVBFX0JVTEs6IC8qIG9uZSBURCBmb3IgZXZlcnkgNDA5NiBCeXRlICovCi0JCQlzaXplID0gKHRyYW5zZmVyX2xlbiAtIDEpIC8gNDA5NiArIDE7Ci0JCQlicmVhazsKLQkJY2FzZSBQSVBFX0NPTlRST0w6IC8qIDEgVEQgZm9yIHNldHVwLCAxIGZvciBBQ0sgYW5kIDEgZm9yIGV2ZXJ5IDQwOTYgQiAqLwotCQkJc2l6ZSA9ICh0cmFuc2Zlcl9sZW4gPT0gMCk/IDI6Ci0JCQkJCQkodHJhbnNmZXJfbGVuIC0gMSkgLyA0MDk2ICsgMzsKLQkJCWJyZWFrOwotCX0KLQotCWlmIChzaXplID49IChOX1VSQl9URCAtIDEpKSB7Ci0JCWVycigibmVlZCAlZCBURHMsIG9ubHkgaGF2ZSAlZCIsIHNpemUsIE5fVVJCX1REKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwdXJiX3ByaXYgPSAmdXJiX3ByaXY7Ci0JcHVyYl9wcml2LT5waXBlID0gcGlwZTsKLQotCS8qIGZpbGwgdGhlIHByaXZhdGUgcGFydCBvZiB0aGUgVVJCICovCi0JcHVyYl9wcml2LT5sZW5ndGggPSBzaXplOwotCXB1cmJfcHJpdi0+ZWQgPSBlZDsKLQlwdXJiX3ByaXYtPmFjdHVhbF9sZW5ndGggPSAwOwotCi0JLyogYWxsb2NhdGUgdGhlIFREcyAqLwotCS8qIG5vdGUgdGhhdCB0ZFswXSB3YXMgYWxsb2NhdGVkIGluIGVwX2FkZF9lZCAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJcHVyYl9wcml2LT50ZFtpXSA9IHRkX2FsbG9jIChkZXYpOwotCQlpZiAoIXB1cmJfcHJpdi0+dGRbaV0pIHsKLQkJCXB1cmJfcHJpdi0+bGVuZ3RoID0gaTsKLQkJCXVyYl9mcmVlX3ByaXYgKHB1cmJfcHJpdik7Ci0JCQllcnIoInNvaGNpX3N1Ym1pdF9qb2I6IEVOT01FTSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JaWYgKGVkLT5zdGF0ZSA9PSBFRF9ORVcgfHwgKGVkLT5zdGF0ZSAmIEVEX0RFTCkpIHsKLQkJdXJiX2ZyZWVfcHJpdiAocHVyYl9wcml2KTsKLQkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFSU5WQUwiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGxpbmsgdGhlIGVkIGludG8gYSBjaGFpbiBpZiBpcyBub3QgYWxyZWFkeSAqLwotCWlmIChlZC0+c3RhdGUgIT0gRURfT1BFUikKLQkJZXBfbGluayAob2hjaSwgZWQpOwotCi0JLyogZmlsbCB0aGUgVERzIGFuZCBsaW5rIGl0IHRvIHRoZSBlZCAqLwotCXRkX3N1Ym1pdF9qb2IoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsIHB1cmJfcHJpdiwgaW50ZXJ2YWwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBERUJVRwotLyogdGVsbCB1cyB0aGUgY3VycmVudCBVU0IgZnJhbWUgbnVtYmVyICovCi0KLXN0YXRpYyBpbnQgc29oY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyIChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKLXsKLQlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7Ci0KLQlyZXR1cm4gbTE2X3N3YXAgKG9oY2ktPmhjY2EtPmZyYW1lX25vKTsKLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBFRCBoYW5kbGluZyBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGxpbmsgYW4gZWQgaW50byBvbmUgb2YgdGhlIEhDIGNoYWlucyAqLwotCi1zdGF0aWMgaW50IGVwX2xpbmsgKG9oY2lfdCAqb2hjaSwgZWRfdCAqZWRpKQotewotCXZvbGF0aWxlIGVkX3QgKmVkID0gZWRpOwotCi0JZWQtPnN0YXRlID0gRURfT1BFUjsKLQotCXN3aXRjaCAoZWQtPnR5cGUpIHsKLQljYXNlIFBJUEVfQ09OVFJPTDoKLQkJZWQtPmh3TmV4dEVEID0gMDsKLQkJaWYgKG9oY2ktPmVkX2NvbnRyb2x0YWlsID09IE5VTEwpIHsKLQkJCXdyaXRlbCAoZWQsICZvaGNpLT5yZWdzLT5lZF9jb250cm9saGVhZCk7Ci0JCX0gZWxzZSB7Ci0JCQlvaGNpLT5lZF9jb250cm9sdGFpbC0+aHdOZXh0RUQgPSBtMzJfc3dhcCAoZWQpOwotCQl9Ci0JCWVkLT5lZF9wcmV2ID0gb2hjaS0+ZWRfY29udHJvbHRhaWw7Ci0JCWlmICghb2hjaS0+ZWRfY29udHJvbHRhaWwgJiYgIW9oY2ktPmVkX3JtX2xpc3RbMF0gJiYKLQkJCSFvaGNpLT5lZF9ybV9saXN0WzFdICYmICFvaGNpLT5zbGVlcGluZykgewotCQkJb2hjaS0+aGNfY29udHJvbCB8PSBPSENJX0NUUkxfQ0xFOwotCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7Ci0JCX0KLQkJb2hjaS0+ZWRfY29udHJvbHRhaWwgPSBlZGk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQSVBFX0JVTEs6Ci0JCWVkLT5od05leHRFRCA9IDA7Ci0JCWlmIChvaGNpLT5lZF9idWxrdGFpbCA9PSBOVUxMKSB7Ci0JCQl3cml0ZWwgKGVkLCAmb2hjaS0+cmVncy0+ZWRfYnVsa2hlYWQpOwotCQl9IGVsc2UgewotCQkJb2hjaS0+ZWRfYnVsa3RhaWwtPmh3TmV4dEVEID0gbTMyX3N3YXAgKGVkKTsKLQkJfQotCQllZC0+ZWRfcHJldiA9IG9oY2ktPmVkX2J1bGt0YWlsOwotCQlpZiAoIW9oY2ktPmVkX2J1bGt0YWlsICYmICFvaGNpLT5lZF9ybV9saXN0WzBdICYmCi0JCQkhb2hjaS0+ZWRfcm1fbGlzdFsxXSAmJiAhb2hjaS0+c2xlZXBpbmcpIHsKLQkJCW9oY2ktPmhjX2NvbnRyb2wgfD0gT0hDSV9DVFJMX0JMRTsKLQkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCQl9Ci0JCW9oY2ktPmVkX2J1bGt0YWlsID0gZWRpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHVubGluayBhbiBlZCBmcm9tIG9uZSBvZiB0aGUgSEMgY2hhaW5zLgotICoganVzdCB0aGUgbGluayB0byB0aGUgZWQgaXMgdW5saW5rZWQuCi0gKiB0aGUgbGluayBmcm9tIHRoZSBlZCBzdGlsbCBwb2ludHMgdG8gYW5vdGhlciBvcGVyYXRpb25hbCBlZCBvciAwCi0gKiBzbyB0aGUgSEMgY2FuIGV2ZW50dWFsbHkgZmluaXNoIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSB1bmxpbmtlZCBlZCAqLwotCi1zdGF0aWMgaW50IGVwX3VubGluayAob2hjaV90ICpvaGNpLCBlZF90ICplZCkKLXsKLQllZC0+aHdJTkZPIHw9IG0zMl9zd2FwIChPSENJX0VEX1NLSVApOwotCi0Jc3dpdGNoIChlZC0+dHlwZSkgewotCWNhc2UgUElQRV9DT05UUk9MOgotCQlpZiAoZWQtPmVkX3ByZXYgPT0gTlVMTCkgewotCQkJaWYgKCFlZC0+aHdOZXh0RUQpIHsKLQkJCQlvaGNpLT5oY19jb250cm9sICY9IH5PSENJX0NUUkxfQ0xFOwotCQkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCQkJfQotCQkJd3JpdGVsIChtMzJfc3dhcCAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSksICZvaGNpLT5yZWdzLT5lZF9jb250cm9saGVhZCk7Ci0JCX0gZWxzZSB7Ci0JCQllZC0+ZWRfcHJldi0+aHdOZXh0RUQgPSBlZC0+aHdOZXh0RUQ7Ci0JCX0KLQkJaWYgKG9oY2ktPmVkX2NvbnRyb2x0YWlsID09IGVkKSB7Ci0JCQlvaGNpLT5lZF9jb250cm9sdGFpbCA9IGVkLT5lZF9wcmV2OwotCQl9IGVsc2UgewotCQkJKChlZF90ICopbTMyX3N3YXAgKCooKF9fdTMyICopJmVkLT5od05leHRFRCkpKS0+ZWRfcHJldiA9IGVkLT5lZF9wcmV2OwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBQSVBFX0JVTEs6Ci0JCWlmIChlZC0+ZWRfcHJldiA9PSBOVUxMKSB7Ci0JCQlpZiAoIWVkLT5od05leHRFRCkgewotCQkJCW9oY2ktPmhjX2NvbnRyb2wgJj0gfk9IQ0lfQ1RSTF9CTEU7Ci0JCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7Ci0JCQl9Ci0JCQl3cml0ZWwgKG0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKLQkJfSBlbHNlIHsKLQkJCWVkLT5lZF9wcmV2LT5od05leHRFRCA9IGVkLT5od05leHRFRDsKLQkJfQotCQlpZiAob2hjaS0+ZWRfYnVsa3RhaWwgPT0gZWQpIHsKLQkJCW9oY2ktPmVkX2J1bGt0YWlsID0gZWQtPmVkX3ByZXY7Ci0JCX0gZWxzZSB7Ci0JCQkoKGVkX3QgKiltMzJfc3dhcCAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSkpLT5lZF9wcmV2ID0gZWQtPmVkX3ByZXY7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWVkLT5zdGF0ZSA9IEVEX1VOTElOSzsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBhZGQvcmVpbml0IGFuIGVuZHBvaW50OyB0aGlzIHNob3VsZCBiZSBkb25lIG9uY2UgYXQgdGhlIHVzYl9zZXRfY29uZmlndXJhdGlvbiBjb21tYW5kLAotICogYnV0IHRoZSBVU0Igc3RhY2sgaXMgYSBsaXR0bGUgYml0IHN0YXRlbGVzcwlzbyB3ZSBkbyBpdCBhdCBldmVyeSB0cmFuc2FjdGlvbgotICogaWYgdGhlIHN0YXRlIG9mIHRoZSBlZCBpcyBFRF9ORVcgdGhlbiBhIGR1bW15IHRkIGlzIGFkZGVkIGFuZCB0aGUgc3RhdGUgaXMgY2hhbmdlZCB0byBFRF9VTkxJTksKLSAqIGluIGFsbCBvdGhlciBjYXNlcyB0aGUgc3RhdGUgaXMgbGVmdCB1bmNoYW5nZWQKLSAqIHRoZSBlZCBpbmZvIGZpZWxkcyBhcmUgc2V0dGVkIGFueXdheSBldmVuIHRob3VnaCBtb3N0IG9mIHRoZW0gc2hvdWxkIG5vdCBjaGFuZ2UgKi8KLQotc3RhdGljIGVkX3QgKiBlcF9hZGRfZWQgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUpCi17Ci0JdGRfdCAqdGQ7Ci0JZWRfdCAqZWRfcmV0OwotCXZvbGF0aWxlIGVkX3QgKmVkOwotCi0JZWQgPSBlZF9yZXQgPSAmb2hjaV9kZXYuZWRbKHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpIDw8IDEpIHwKLQkJCSh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpPyAwOiB1c2JfcGlwZW91dCAocGlwZSkpXTsKLQotCWlmICgoZWQtPnN0YXRlICYgRURfREVMKSB8fCAoZWQtPnN0YXRlICYgRURfVVJCX0RFTCkpIHsKLQkJZXJyKCJlcF9hZGRfZWQ6IHBlbmRpbmcgZGVsZXRlIik7Ci0JCS8qIHBlbmRpbmcgZGVsZXRlIHJlcXVlc3QgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGVkLT5zdGF0ZSA9PSBFRF9ORVcpIHsKLQkJZWQtPmh3SU5GTyA9IG0zMl9zd2FwIChPSENJX0VEX1NLSVApOyAvKiBza2lwIGVkICovCi0JCS8qIGR1bW15IHRkOyBlbmQgb2YgdGQgbGlzdCBmb3IgZWQgKi8KLQkJdGQgPSB0ZF9hbGxvYyAodXNiX2Rldik7Ci0JCWVkLT5od1RhaWxQID0gbTMyX3N3YXAgKHRkKTsKLQkJZWQtPmh3SGVhZFAgPSBlZC0+aHdUYWlsUDsKLQkJZWQtPnN0YXRlID0gRURfVU5MSU5LOwotCQllZC0+dHlwZSA9IHVzYl9waXBldHlwZSAocGlwZSk7Ci0JCW9oY2lfZGV2LmVkX2NudCsrOwotCX0KLQotCWVkLT5od0lORk8gPSBtMzJfc3dhcCAodXNiX3BpcGVkZXZpY2UgKHBpcGUpCi0JCQl8IHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpIDw8IDcKLQkJCXwgKHVzYl9waXBlaXNvYyAocGlwZSk/IDB4ODAwMDogMCkKLQkJCXwgKHVzYl9waXBlY29udHJvbCAocGlwZSk/IDA6ICh1c2JfcGlwZW91dCAocGlwZSk/IDB4ODAwOiAweDEwMDApKQotCQkJfCB1c2JfcGlwZXNsb3cgKHBpcGUpIDw8IDEzCi0JCQl8IHVzYl9tYXhwYWNrZXQgKHVzYl9kZXYsIHBpcGUpIDw8IDE2KTsKLQotCXJldHVybiBlZF9yZXQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIFREIGhhbmRsaW5nIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZW5xdWV1ZSBuZXh0IFREIGZvciB0aGlzIFVSQiAoT0hDSSBzcGVjIDUuMi44LjIpICovCi0KLXN0YXRpYyB2b2lkIHRkX2ZpbGwgKG9oY2lfdCAqb2hjaSwgdW5zaWduZWQgaW50IGluZm8sCi0Jdm9pZCAqZGF0YSwgaW50IGxlbiwKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgaW5kZXgsIHVyYl9wcml2X3QgKnVyYl9wcml2KQotewotCXZvbGF0aWxlIHRkX3QgICp0ZCwgKnRkX3B0OwotI2lmZGVmIE9IQ0lfRklMTF9UUkFDRQotCWludCBpOwotI2VuZGlmCi0KLQlpZiAoaW5kZXggPiB1cmJfcHJpdi0+bGVuZ3RoKSB7Ci0JCWVycigiaW5kZXggPiBsZW5ndGgiKTsKLQkJcmV0dXJuOwotCX0KLQkvKiB1c2UgdGhpcyB0ZCBhcyB0aGUgbmV4dCBkdW1teSAqLwotCXRkX3B0ID0gdXJiX3ByaXYtPnRkIFtpbmRleF07Ci0JdGRfcHQtPmh3TmV4dFREID0gMDsKLQotCS8qIGZpbGwgdGhlIG9sZCBkdW1teSBURCAqLwotCXRkID0gdXJiX3ByaXYtPnRkIFtpbmRleF0gPSAodGRfdCAqKShtMzJfc3dhcCAodXJiX3ByaXYtPmVkLT5od1RhaWxQKSAmIH4weGYpOwotCi0JdGQtPmVkID0gdXJiX3ByaXYtPmVkOwotCXRkLT5uZXh0X2RsX3RkID0gTlVMTDsKLQl0ZC0+aW5kZXggPSBpbmRleDsKLQl0ZC0+ZGF0YSA9IChfX3UzMilkYXRhOwotI2lmZGVmIE9IQ0lfRklMTF9UUkFDRQotCWlmICgodXNiX3BpcGV0eXBlKHVyYl9wcml2LT5waXBlKSA9PSBQSVBFX0JVTEspICYmIHVzYl9waXBlb3V0KHVyYl9wcml2LT5waXBlKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCXByaW50ZigidGQtPmRhdGFbJWRdICUjMnggIixpLCAoKHVuc2lnbmVkIGNoYXIgKil0ZC0+ZGF0YSlbaV0pOwotCQlwcmludGYoIlxuIik7Ci0JfQotI2VuZGlmCi0JaWYgKCFsZW4pCi0JCWRhdGEgPSAwOwotCi0JdGQtPmh3SU5GTyA9IG0zMl9zd2FwIChpbmZvKTsKLQl0ZC0+aHdDQlAgPSBtMzJfc3dhcCAoZGF0YSk7Ci0JaWYgKGRhdGEpCi0JCXRkLT5od0JFID0gbTMyX3N3YXAgKGRhdGEgKyBsZW4gLSAxKTsKLQllbHNlCi0JCXRkLT5od0JFID0gMDsKLQl0ZC0+aHdOZXh0VEQgPSBtMzJfc3dhcCAodGRfcHQpOwotCXRkLT5od1BTVyBbMF0gPSBtMTZfc3dhcCAoKChfX3UzMilkYXRhICYgMHgwRkZGKSB8IDB4RTAwMCk7Ci0KLQkvKiBhcHBlbmQgdG8gcXVldWUgKi8KLQl0ZC0+ZWQtPmh3VGFpbFAgPSB0ZC0+aHdOZXh0VEQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHByZXBhcmUgYWxsIFREcyBvZiBhIHRyYW5zZmVyICovCi0KLXN0YXRpYyB2b2lkIHRkX3N1Ym1pdF9qb2IgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAotCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCwgdXJiX3ByaXZfdCAqdXJiLCBpbnQgaW50ZXJ2YWwpCi17Ci0Jb2hjaV90ICpvaGNpID0gJmdvaGNpOwotCWludCBkYXRhX2xlbiA9IHRyYW5zZmVyX2xlbjsKLQl2b2lkICpkYXRhOwotCWludCBjbnQgPSAwOwotCV9fdTMyIGluZm8gPSAwOwotCXVuc2lnbmVkIGludCB0b2dnbGUgPSAwOwotCi0JLyogT0hDSSBoYW5kbGVzIHRoZSBEQVRBLXRvZ2dsZXMgaXRzZWxmLCB3ZSBqdXN0IHVzZSB0aGUgVVNCLXRvZ2dsZSBiaXRzIGZvciByZXNldGluZyAqLwotCWlmKHVzYl9nZXR0b2dnbGUoZGV2LCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLCB1c2JfcGlwZW91dChwaXBlKSkpIHsKLQkJdG9nZ2xlID0gVERfVF9UT0dHTEU7Ci0JfSBlbHNlIHsKLQkJdG9nZ2xlID0gVERfVF9EQVRBMDsKLQkJdXNiX3NldHRvZ2dsZShkZXYsIHVzYl9waXBlZW5kcG9pbnQocGlwZSksIHVzYl9waXBlb3V0KHBpcGUpLCAxKTsKLQl9Ci0JdXJiLT50ZF9jbnQgPSAwOwotCWlmIChkYXRhX2xlbikKLQkJZGF0YSA9IGJ1ZmZlcjsKLQllbHNlCi0JCWRhdGEgPSAwOwotCi0Jc3dpdGNoICh1c2JfcGlwZXR5cGUgKHBpcGUpKSB7Ci0JY2FzZSBQSVBFX0JVTEs6Ci0JCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/Ci0JCQlURF9DQyB8IFREX0RQX09VVCA6IFREX0NDIHwgVERfRFBfSU4gOwotCQl3aGlsZShkYXRhX2xlbiA+IDQwOTYpIHsKLQkJCXRkX2ZpbGwgKG9oY2ksIGluZm8gfCAoY250PyBURF9UX1RPR0dMRTp0b2dnbGUpLCBkYXRhLCA0MDk2LCBkZXYsIGNudCwgdXJiKTsKLQkJCWRhdGEgKz0gNDA5NjsgZGF0YV9sZW4gLT0gNDA5NjsgY250Kys7Ci0JCX0KLQkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KLQkJCVREX0NDIHwgVERfRFBfT1VUIDogVERfQ0MgfCBURF9SIHwgVERfRFBfSU4gOwotCQl0ZF9maWxsIChvaGNpLCBpbmZvIHwgKGNudD8gVERfVF9UT0dHTEU6dG9nZ2xlKSwgZGF0YSwgZGF0YV9sZW4sIGRldiwgY250LCB1cmIpOwotCQljbnQrKzsKLQotCQlpZiAoIW9oY2ktPnNsZWVwaW5nKQotCQkJd3JpdGVsIChPSENJX0JMRiwgJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cyk7IC8qIHN0YXJ0IGJ1bGsgbGlzdCAqLwotCQlicmVhazsKLQotCWNhc2UgUElQRV9DT05UUk9MOgotCQlpbmZvID0gVERfQ0MgfCBURF9EUF9TRVRVUCB8IFREX1RfREFUQTA7Ci0JCXRkX2ZpbGwgKG9oY2ksIGluZm8sIHNldHVwLCA4LCBkZXYsIGNudCsrLCB1cmIpOwotCQlpZiAoZGF0YV9sZW4gPiAwKSB7Ci0JCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPwotCQkJCVREX0NDIHwgVERfUiB8IFREX0RQX09VVCB8IFREX1RfREFUQTEgOiBURF9DQyB8IFREX1IgfCBURF9EUF9JTiB8IFREX1RfREFUQTE7Ci0JCQkvKiBOT1RFOiAgbWlzaGFuZGxlcyB0cmFuc2ZlcnMgPjhLLCBzb21lID40SyAqLwotCQkJdGRfZmlsbCAob2hjaSwgaW5mbywgZGF0YSwgZGF0YV9sZW4sIGRldiwgY250KyssIHVyYik7Ci0JCX0KLQkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KLQkJCVREX0NDIHwgVERfRFBfSU4gfCBURF9UX0RBVEExOiBURF9DQyB8IFREX0RQX09VVCB8IFREX1RfREFUQTE7Ci0JCXRkX2ZpbGwgKG9oY2ksIGluZm8sIGRhdGEsIDAsIGRldiwgY250KyssIHVyYik7Ci0JCWlmICghb2hjaS0+c2xlZXBpbmcpCi0JCQl3cml0ZWwgKE9IQ0lfQ0xGLCAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsgLyogc3RhcnQgQ29udHJvbCBsaXN0ICovCi0JCWJyZWFrOwotCX0KLQlpZiAodXJiLT5sZW5ndGggIT0gY250KQotCQlkYmcoIlREIExFTkdUSCAlZCAhPSBDTlQgJWQiLCB1cmItPmxlbmd0aCwgY250KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRG9uZSBMaXN0IGhhbmRsaW5nIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKiBjYWxjdWxhdGUgdGhlIHRyYW5zZmVyIGxlbmd0aCBhbmQgdXBkYXRlIHRoZSB1cmIgKi8KLQotc3RhdGljIHZvaWQgZGxfdHJhbnNmZXJfbGVuZ3RoKHRkX3QgKiB0ZCkKLXsKLQlfX3UzMiB0ZElORk8sIHRkQkUsIHRkQ0JQOwotCXVyYl9wcml2X3QgKmx1cmJfcHJpdiA9ICZ1cmJfcHJpdjsKLQotCXRkSU5GTyA9IG0zMl9zd2FwICh0ZC0+aHdJTkZPKTsKLQl0ZEJFICAgPSBtMzJfc3dhcCAodGQtPmh3QkUpOwotCXRkQ0JQICA9IG0zMl9zd2FwICh0ZC0+aHdDQlApOwotCi0KLQlpZiAoISh1c2JfcGlwZXR5cGUgKGx1cmJfcHJpdi0+cGlwZSkgPT0gUElQRV9DT05UUk9MICYmCi0JICAgICgodGQtPmluZGV4ID09IDApIHx8ICh0ZC0+aW5kZXggPT0gbHVyYl9wcml2LT5sZW5ndGggLSAxKSkpKSB7Ci0JCWlmICh0ZEJFICE9IDApIHsKLQkJCWlmICh0ZC0+aHdDQlAgPT0gMCkKLQkJCQlsdXJiX3ByaXYtPmFjdHVhbF9sZW5ndGggKz0gdGRCRSAtIHRkLT5kYXRhICsgMTsKLQkJCWVsc2UKLQkJCQlsdXJiX3ByaXYtPmFjdHVhbF9sZW5ndGggKz0gdGRDQlAgLSB0ZC0+ZGF0YTsKLQkJfQotCX0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogcmVwbGllcyB0byB0aGUgcmVxdWVzdCBoYXZlIHRvIGJlIG9uIGEgRklGTyBiYXNpcyBzbwotICogd2UgcmV2ZXJzZSB0aGUgcmV2ZXJzZWQgZG9uZS1saXN0ICovCi0KLXN0YXRpYyB0ZF90ICogZGxfcmV2ZXJzZV9kb25lX2xpc3QgKG9oY2lfdCAqb2hjaSkKLXsKLQlfX3UzMiB0ZF9saXN0X2hjOwotCXRkX3QgKnRkX3JldiA9IE5VTEw7Ci0JdGRfdCAqdGRfbGlzdCA9IE5VTEw7Ci0JdXJiX3ByaXZfdCAqbHVyYl9wcml2ID0gTlVMTDsKLQotCXRkX2xpc3RfaGMgPSBtMzJfc3dhcCAob2hjaS0+aGNjYS0+ZG9uZV9oZWFkKSAmIDB4ZmZmZmZmZjA7Ci0Jb2hjaS0+aGNjYS0+ZG9uZV9oZWFkID0gMDsKLQotCXdoaWxlICh0ZF9saXN0X2hjKSB7Ci0JCXRkX2xpc3QgPSAodGRfdCAqKXRkX2xpc3RfaGM7Ci0KLQkJaWYgKFREX0NDX0dFVCAobTMyX3N3YXAgKHRkX2xpc3QtPmh3SU5GTykpKSB7Ci0JCQlsdXJiX3ByaXYgPSAmdXJiX3ByaXY7Ci0JCQlkYmcoIiBVU0ItZXJyb3Ivc3RhdHVzOiAleCA6ICVwIiwKLQkJCQkJVERfQ0NfR0VUIChtMzJfc3dhcCAodGRfbGlzdC0+aHdJTkZPKSksIHRkX2xpc3QpOwotCQkJaWYgKHRkX2xpc3QtPmVkLT5od0hlYWRQICYgbTMyX3N3YXAgKDB4MSkpIHsKLQkJCQlpZiAobHVyYl9wcml2ICYmICgodGRfbGlzdC0+aW5kZXggKyAxKSA8IGx1cmJfcHJpdi0+bGVuZ3RoKSkgewotCQkJCQl0ZF9saXN0LT5lZC0+aHdIZWFkUCA9Ci0JCQkJCQkobHVyYl9wcml2LT50ZFtsdXJiX3ByaXYtPmxlbmd0aCAtIDFdLT5od05leHRURCAmIG0zMl9zd2FwICgweGZmZmZmZmYwKSkgfAotCQkJCQkJCQkJKHRkX2xpc3QtPmVkLT5od0hlYWRQICYgbTMyX3N3YXAgKDB4MikpOwotCQkJCQlsdXJiX3ByaXYtPnRkX2NudCArPSBsdXJiX3ByaXYtPmxlbmd0aCAtIHRkX2xpc3QtPmluZGV4IC0gMTsKLQkJCQl9IGVsc2UKLQkJCQkJdGRfbGlzdC0+ZWQtPmh3SGVhZFAgJj0gbTMyX3N3YXAgKDB4ZmZmZmZmZjIpOwotCQkJfQotCQl9Ci0KLQkJdGRfbGlzdC0+bmV4dF9kbF90ZCA9IHRkX3JldjsKLQkJdGRfcmV2ID0gdGRfbGlzdDsKLQkJdGRfbGlzdF9oYyA9IG0zMl9zd2FwICh0ZF9saXN0LT5od05leHRURCkgJiAweGZmZmZmZmYwOwotCX0KLQlyZXR1cm4gdGRfbGlzdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogdGQgZG9uZSBsaXN0ICovCi1zdGF0aWMgaW50IGRsX2RvbmVfbGlzdCAob2hjaV90ICpvaGNpLCB0ZF90ICp0ZF9saXN0KQotewotCXRkX3QgKnRkX2xpc3RfbmV4dCA9IE5VTEw7Ci0JZWRfdCAqZWQ7Ci0JaW50IGNjID0gMDsKLQlpbnQgc3RhdCA9IDA7Ci0JLyogdXJiX3QgKnVyYjsgKi8KLQl1cmJfcHJpdl90ICpsdXJiX3ByaXY7Ci0JX191MzIgdGRJTkZPLCBlZEhlYWRQLCBlZFRhaWxQOwotCi0Jd2hpbGUgKHRkX2xpc3QpIHsKLQkJdGRfbGlzdF9uZXh0ID0gdGRfbGlzdC0+bmV4dF9kbF90ZDsKLQotCQlsdXJiX3ByaXYgPSAmdXJiX3ByaXY7Ci0JCXRkSU5GTyA9IG0zMl9zd2FwICh0ZF9saXN0LT5od0lORk8pOwotCi0JCWVkID0gdGRfbGlzdC0+ZWQ7Ci0KLQkJZGxfdHJhbnNmZXJfbGVuZ3RoKHRkX2xpc3QpOwotCi0JCS8qIGVycm9yIGNvZGUgb2YgdHJhbnNmZXIgKi8KLQkJY2MgPSBURF9DQ19HRVQgKHRkSU5GTyk7Ci0JCWlmIChjYyAhPSAwKSB7Ci0JCQlkYmcoIkNvbmRpdGlvbkNvZGUgJSN4IiwgY2MpOwotCQkJc3RhdCA9IGNjX3RvX2Vycm9yW2NjXTsKLQkJfQotCi0JCWlmIChlZC0+c3RhdGUgIT0gRURfTkVXKSB7Ci0JCQllZEhlYWRQID0gbTMyX3N3YXAgKGVkLT5od0hlYWRQKSAmIDB4ZmZmZmZmZjA7Ci0JCQllZFRhaWxQID0gbTMyX3N3YXAgKGVkLT5od1RhaWxQKTsKLQotCQkJLyogdW5saW5rIGVkcyBpZiB0aGV5IGFyZSBub3QgYnVzeSAqLwotCQkJaWYgKChlZEhlYWRQID09IGVkVGFpbFApICYmIChlZC0+c3RhdGUgPT0gRURfT1BFUikpCi0JCQkJZXBfdW5saW5rIChvaGNpLCBlZCk7Ci0JCX0KLQotCQl0ZF9saXN0ID0gdGRfbGlzdF9uZXh0OwotCX0KLQlyZXR1cm4gc3RhdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogVmlydHVhbCBSb290IEh1YgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRGV2aWNlIGRlc2NyaXB0b3IgKi8KLXN0YXRpYyBfX3U4IHJvb3RfaHViX2Rldl9kZXNbXSA9Ci17Ci0JMHgxMiwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCi0JMHgwMSwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgRGV2aWNlICovCi0JMHgxMCwJICAgIC8qCV9fdTE2IGJjZFVTQjsgdjEuMSAqLwotCTB4MDEsCi0JMHgwOSwJICAgIC8qCV9fdTggIGJEZXZpY2VDbGFzczsgSFVCX0NMQVNTQ09ERSAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7ICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGJEZXZpY2VQcm90b2NvbDsgKi8KLQkweDA4LAkgICAgLyoJX191OCAgYk1heFBhY2tldFNpemUwOyA4IEJ5dGVzICovCi0JMHgwMCwJICAgIC8qCV9fdTE2IGlkVmVuZG9yOyAqLwotCTB4MDAsCi0JMHgwMCwJICAgIC8qCV9fdTE2IGlkUHJvZHVjdDsgKi8KLQkweDAwLAotCTB4MDAsCSAgICAvKglfX3UxNiBiY2REZXZpY2U7ICovCi0JMHgwMCwKLQkweDAwLAkgICAgLyoJX191OCAgaU1hbnVmYWN0dXJlcjsgKi8KLQkweDAxLAkgICAgLyoJX191OCAgaVByb2R1Y3Q7ICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGlTZXJpYWxOdW1iZXI7ICovCi0JMHgwMQkgICAgLyoJX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOyAqLwotfTsKLQotCi0vKiBDb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KLXN0YXRpYyBfX3U4IHJvb3RfaHViX2NvbmZpZ19kZXNbXSA9Ci17Ci0JMHgwOSwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCi0JMHgwMiwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgQ29uZmlndXJhdGlvbiAqLwotCTB4MTksCSAgICAvKglfX3UxNiB3VG90YWxMZW5ndGg7ICovCi0JMHgwMCwKLQkweDAxLAkgICAgLyoJX191OCAgYk51bUludGVyZmFjZXM7ICovCi0JMHgwMSwJICAgIC8qCV9fdTggIGJDb25maWd1cmF0aW9uVmFsdWU7ICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGlDb25maWd1cmF0aW9uOyAqLwotCTB4NDAsCSAgICAvKglfX3U4ICBibUF0dHJpYnV0ZXM7Ci0JCSBCaXQgNzogQnVzLXBvd2VyZWQsIDY6IFNlbGYtcG93ZXJlZCwgNSBSZW1vdGUtd2Frd3VwLCA0Li4wOiByZXN2ZCAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBNYXhQb3dlcjsgKi8KLQotCS8qIGludGVyZmFjZSAqLwotCTB4MDksCSAgICAvKglfX3U4ICBpZl9iTGVuZ3RoOyAqLwotCTB4MDQsCSAgICAvKglfX3U4ICBpZl9iRGVzY3JpcHRvclR5cGU7IEludGVyZmFjZSAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlTnVtYmVyOyAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iQWx0ZXJuYXRlU2V0dGluZzsgKi8KLQkweDAxLAkgICAgLyoJX191OCAgaWZfYk51bUVuZHBvaW50czsgKi8KLQkweDA5LAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VTdWJDbGFzczsgKi8KLQkweDAwLAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZVByb3RvY29sOyAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBpZl9pSW50ZXJmYWNlOyAqLwotCi0JLyogZW5kcG9pbnQgKi8KLQkweDA3LAkgICAgLyoJX191OCAgZXBfYkxlbmd0aDsgKi8KLQkweDA1LAkgICAgLyoJX191OCAgZXBfYkRlc2NyaXB0b3JUeXBlOyBFbmRwb2ludCAqLwotCTB4ODEsCSAgICAvKglfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCi0JMHgwMywJICAgIC8qCV9fdTggIGVwX2JtQXR0cmlidXRlczsgSW50ZXJydXB0ICovCi0JMHgwMiwJICAgIC8qCV9fdTE2IGVwX3dNYXhQYWNrZXRTaXplOyAoKE1BWF9ST09UX1BPUlRTICsgMSkgLyA4ICovCi0JMHgwMCwKLQkweGZmCSAgICAvKglfX3U4ICBlcF9iSW50ZXJ2YWw7IDI1NSBtcyAqLwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MFtdID0KLXsKLQkweDA0LAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLwotCTB4MDMsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgU3RyaW5nLWRlc2NyaXB0b3IgKi8KLQkweDA5LAkJCS8qICBfX3U4ICBsYW5nIElEICovCi0JMHgwNCwJCQkvKiAgX191OCAgbGFuZyBJRCAqLwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MVtdID0KLXsKLQkyOCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KLQkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCi0JJ08nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSdDJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ0knLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSdSJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSd0JywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSd1JywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ2InLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLX07Ci0KLS8qIEh1YiBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9yIGlzIGNvbnN0cnVjdGVkIGR5bmFtaWNhbGx5ICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBPSyh4KQkJCWxlbiA9ICh4KTsgYnJlYWsKLSNpZmRlZiBERUJVRwotI2RlZmluZSBXUl9SSF9TVEFUKHgpCQl7aW5mbygiV1I6c3RhdHVzICUjOHgiLCAoeCkpO3dyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnN0YXR1cyk7fQotI2RlZmluZSBXUl9SSF9QT1JUU1RBVCh4KQl7aW5mbygiV1I6cG9ydHN0YXR1c1slZF0gJSM4eCIsIHdJbmRleC0xLCAoeCkpO3dyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnBvcnRzdGF0dXNbd0luZGV4LTFdKTt9Ci0jZWxzZQotI2RlZmluZSBXUl9SSF9TVEFUKHgpCQl3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5zdGF0dXMpCi0jZGVmaW5lIFdSX1JIX1BPUlRTVEFUKHgpCXdyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnBvcnRzdGF0dXNbd0luZGV4LTFdKQotI2VuZGlmCi0jZGVmaW5lIFJEX1JIX1NUQVQJCXJvb3RodWJfc3RhdHVzKCZnb2hjaSkKLSNkZWZpbmUgUkRfUkhfUE9SVFNUQVQJCXJvb3RodWJfcG9ydHN0YXR1cygmZ29oY2ksd0luZGV4LTEpCi0KLS8qIHJlcXVlc3QgdG8gdmlydHVhbCByb290IGh1YiAqLwotCi1pbnQgcmhfY2hlY2tfcG9ydF9zdGF0dXMob2hjaV90ICpjb250cm9sbGVyKQotewotCV9fdTMyIHRlbXAsIG5kcCwgaTsKLQlpbnQgcmVzOwotCi0JcmVzID0gLTE7Ci0JdGVtcCA9IHJvb3RodWJfYSAoY29udHJvbGxlcik7Ci0JbmRwID0gKHRlbXAgJiBSSF9BX05EUCk7Ci0jaWZkZWYgQ09ORklHX0FUOTFDX1BRRlBfVUhQQlVHCi0JbmRwID0gKG5kcCA9PSAyKSA/IDE6MDsKLSNlbmRpZgotCi0JZm9yIChpID0gMDsgaSA8IG5kcDsgaSsrKSB7Ci0JCXRlbXAgPSByb290aHViX3BvcnRzdGF0dXMgKGNvbnRyb2xsZXIsIGkpOwotCQkvKiBjaGVjayBmb3IgYSBkZXZpY2UgZGlzY29ubmVjdCAqLwotCQlpZiAoKCh0ZW1wICYgKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSA9PQotCQkJKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSAmJgotCQkJKCh0ZW1wICYgUkhfUFNfQ0NTKSA9PSAwKSkgewotCQkJcmVzID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgb2hjaV9zdWJtaXRfcmhfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKLQkJdm9pZCAqYnVmZmVyLCBpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqY21kKQotewotCXZvaWQgKiBkYXRhID0gYnVmZmVyOwotCWludCBsZW5pID0gdHJhbnNmZXJfbGVuOwotCWludCBsZW4gPSAwOwotCWludCBzdGF0ID0gMDsKLQlfX3UzMiBkYXRhYls0XTsKLQlfX3U4ICpkYXRhX2J1ZiA9IChfX3U4ICopZGF0YWI7Ci0JX191MTYgYm1SVHlwZV9iUmVxOwotCV9fdTE2IHdWYWx1ZTsKLQlfX3UxNiB3SW5kZXg7Ci0JX191MTYgd0xlbmd0aDsKLQotI2lmZGVmIERFQlVHCi11cmJfcHJpdi5hY3R1YWxfbGVuZ3RoID0gMDsKLXBrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBjbWQsICJTVUIocmgpIiwgdXNiX3BpcGVpbihwaXBlKSk7Ci0jZWxzZQotCXdhaXRfbXMoMSk7Ci0jZW5kaWYKLQlpZiAoKHBpcGUgJiBQSVBFX0lOVEVSUlVQVCkgPT0gUElQRV9JTlRFUlJVUFQpIHsKLQkJaW5mbygiUm9vdC1IdWIgc3VibWl0IElSUTogTk9UIGltcGxlbWVudGVkIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWJtUlR5cGVfYlJlcSAgPSBjbWQtPnJlcXVlc3R0eXBlIHwgKGNtZC0+cmVxdWVzdCA8PCA4KTsKLQl3VmFsdWUJICAgICAgPSBtMTZfc3dhcCAoY21kLT52YWx1ZSk7Ci0Jd0luZGV4CSAgICAgID0gbTE2X3N3YXAgKGNtZC0+aW5kZXgpOwotCXdMZW5ndGgJICAgICAgPSBtMTZfc3dhcCAoY21kLT5sZW5ndGgpOwotCi0JaW5mbygiUm9vdC1IdWI6IGFkcjogJTJ4IGNtZCglMXgpOiAlMDh4ICUwNHggJTA0eCAlMDR4IiwKLQkJZGV2LT5kZXZudW0sIDgsIGJtUlR5cGVfYlJlcSwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgpOwotCi0Jc3dpdGNoIChibVJUeXBlX2JSZXEpIHsKLQkvKiBSZXF1ZXN0IERlc3RpbmF0aW9uOgotCSAgIHdpdGhvdXQgZmxhZ3M6IERldmljZSwKLQkgICBSSF9JTlRFUkZBQ0U6IGludGVyZmFjZSwKLQkgICBSSF9FTkRQT0lOVDogZW5kcG9pbnQsCi0JICAgUkhfQ0xBU1MgbWVhbnMgSFVCIGhlcmUsCi0JICAgUkhfT1RIRVIgfCBSSF9DTEFTUwlhbG1vc3QgZXZlciBtZWFucyBIVUJfUE9SVCBoZXJlCi0JKi8KLQotCWNhc2UgUkhfR0VUX1NUQVRVUzoKLQkJCSooX191MTYgKikgZGF0YV9idWYgPSBtMTZfc3dhcCAoMSk7IE9LICgyKTsKLQljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9JTlRFUkZBQ0U6Ci0JCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gbTE2X3N3YXAgKDApOyBPSyAoMik7Ci0JY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfRU5EUE9JTlQ6Ci0JCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gbTE2X3N3YXAgKDApOyBPSyAoMik7Ci0JY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfQ0xBU1M6Ci0JCQkqKF9fdTMyICopIGRhdGFfYnVmID0gbTMyX3N3YXAgKAotCQkJCVJEX1JIX1NUQVQgJiB+KFJIX0hTX0NSV0UgfCBSSF9IU19EUldFKSk7Ci0JCQlPSyAoNCk7Ci0JY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKLQkJCSooX191MzIgKikgZGF0YV9idWYgPSBtMzJfc3dhcCAoUkRfUkhfUE9SVFNUQVQpOyBPSyAoNCk7Ci0KLQljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9FTkRQT0lOVDoKLQkJc3dpdGNoICh3VmFsdWUpIHsKLQkJCWNhc2UgKFJIX0VORFBPSU5UX1NUQUxMKTogT0sgKDApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfQ0xBU1M6Ci0JCXN3aXRjaCAod1ZhbHVlKSB7Ci0JCQljYXNlIFJIX0NfSFVCX0xPQ0FMX1BPV0VSOgotCQkJCU9LKDApOwotCQkJY2FzZSAoUkhfQ19IVUJfT1ZFUl9DVVJSRU5UKToKLQkJCQkJV1JfUkhfU1RBVChSSF9IU19PQ0lDKTsgT0sgKDApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKLQkJc3dpdGNoICh3VmFsdWUpIHsKLQkJCWNhc2UgKFJIX1BPUlRfRU5BQkxFKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NDUyApOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUE9DSSk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX1BPUlRfUE9XRVIpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfTFNEQSk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX0NfUE9SVF9DT05ORUNUSU9OKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NTQyApOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9DX1BPUlRfRU5BQkxFKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BFU0MpOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9DX1BPUlRfU1VTUEVORCk6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1NDKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCk6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19PQ0lDKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfQ19QT1JUX1JFU0VUKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BSU0MpOyBPSyAoMCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKLQkJc3dpdGNoICh3VmFsdWUpIHsKLQkJCWNhc2UgKFJIX1BPUlRfU1VTUEVORCk6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1MgKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfUE9SVF9SRVNFVCk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCi0JCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKLQkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QUlMpOwotCQkJCQlPSyAoMCk7Ci0JCQljYXNlIChSSF9QT1JUX1BPV0VSKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BQUyApOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCi0JCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKLQkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QRVMgKTsKLQkJCQkJT0sgKDApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSSF9TRVRfQUREUkVTUzogZ29oY2kucmguZGV2bnVtID0gd1ZhbHVlOyBPSygwKTsKLQotCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1I6Ci0JCXN3aXRjaCAoKHdWYWx1ZSAmIDB4ZmYwMCkgPj4gOCkgewotCQkJY2FzZSAoMHgwMSk6IC8qIGRldmljZSBkZXNjcmlwdG9yICovCi0JCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAotCQkJCQkgIGxlbmksCi0JCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAotCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX2Rldl9kZXMpLAotCQkJCQkgICAgICB3TGVuZ3RoKSk7Ci0JCQkJZGF0YV9idWYgPSByb290X2h1Yl9kZXZfZGVzOyBPSyhsZW4pOwotCQkJY2FzZSAoMHgwMik6IC8qIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLwotCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkJICBsZW5pLAotCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9jb25maWdfZGVzKSwKLQkJCQkJICAgICAgd0xlbmd0aCkpOwotCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfY29uZmlnX2RlczsgT0sobGVuKTsKLQkJCWNhc2UgKDB4MDMpOiAvKiBzdHJpbmcgZGVzY3JpcHRvcnMgKi8KLQkJCQlpZih3VmFsdWU9PTB4MDMwMCkgewotCQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCQkJCQkgIGxlbmksCi0JCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfc3RyX2luZGV4MCksCi0JCQkJCQkgICAgICB3TGVuZ3RoKSk7Ci0JCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfc3RyX2luZGV4MDsKLQkJCQkJT0sobGVuKTsKLQkJCQl9Ci0JCQkJaWYod1ZhbHVlPT0weDAzMDEpIHsKLQkJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAotCQkJCQkJICBsZW5pLAotCQkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX3N0cl9pbmRleDEpLAotCQkJCQkJICAgICAgd0xlbmd0aCkpOwotCQkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDE7Ci0JCQkJCU9LKGxlbik7Ci0JCQl9Ci0JCQlkZWZhdWx0OgotCQkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1IgfCBSSF9DTEFTUzoKLQl7Ci0JCV9fdTMyIHRlbXAgPSByb290aHViX2EgKCZnb2hjaSk7Ci0KLQkJZGF0YV9idWYgWzBdID0gOTsJCS8qIG1pbiBsZW5ndGg7ICovCi0JCWRhdGFfYnVmIFsxXSA9IDB4Mjk7Ci0JCWRhdGFfYnVmIFsyXSA9IHRlbXAgJiBSSF9BX05EUDsKLSNpZmRlZiBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKLQkJZGF0YV9idWYgWzJdID0gKGRhdGFfYnVmIFsyXSA9PSAyKSA/IDE6MDsKLSNlbmRpZgotCQlkYXRhX2J1ZiBbM10gPSAwOwotCQlpZiAodGVtcCAmIFJIX0FfUFNNKQkvKiBwZXItcG9ydCBwb3dlciBzd2l0Y2hpbmc/ICovCi0JCQlkYXRhX2J1ZiBbM10gfD0gMHgxOwotCQlpZiAodGVtcCAmIFJIX0FfTk9DUCkJLyogbm8gb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLwotCQkJZGF0YV9idWYgWzNdIHw9IDB4MTA7Ci0JCWVsc2UgaWYgKHRlbXAgJiBSSF9BX09DUE0pCS8qIHBlci1wb3J0IG92ZXJjdXJyZW50IHJlcG9ydGluZz8gKi8KLQkJCWRhdGFfYnVmIFszXSB8PSAweDg7Ci0KLQkJLyogY29ycmVzcG9uZHMgdG8gZGF0YV9idWZbNC03XSAqLwotCQlkYXRhYiBbMV0gPSAwOwotCQlkYXRhX2J1ZiBbNV0gPSAodGVtcCAmIFJIX0FfUE9UUEdUKSA+PiAyNDsKLQkJdGVtcCA9IHJvb3RodWJfYiAoJmdvaGNpKTsKLQkJZGF0YV9idWYgWzddID0gdGVtcCAmIFJIX0JfRFI7Ci0JCWlmIChkYXRhX2J1ZiBbMl0gPCA3KSB7Ci0JCQlkYXRhX2J1ZiBbOF0gPSAweGZmOwotCQl9IGVsc2UgewotCQkJZGF0YV9idWYgWzBdICs9IDI7Ci0JCQlkYXRhX2J1ZiBbOF0gPSAodGVtcCAmIFJIX0JfRFIpID4+IDg7Ci0JCQlkYXRhX2J1ZiBbMTBdID0gZGF0YV9idWYgWzldID0gMHhmZjsKLQkJfQotCi0JCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuaSwKLQkJbWluX3QodW5zaWduZWQgaW50LCBkYXRhX2J1ZiBbMF0sIHdMZW5ndGgpKTsKLQkJT0sgKGxlbik7Ci0JfQotCi0JY2FzZSBSSF9HRVRfQ09ORklHVVJBVElPTjoJKihfX3U4ICopIGRhdGFfYnVmID0gMHgwMTsgT0sgKDEpOwotCi0JY2FzZSBSSF9TRVRfQ09ORklHVVJBVElPTjoJV1JfUkhfU1RBVCAoMHgxMDAwMCk7IE9LICgwKTsKLQotCWRlZmF1bHQ6Ci0JCWRiZyAoInVuc3VwcG9ydGVkIHJvb3QgaHViIGNvbW1hbmQiKTsKLQkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOwotCX0KLQotI2lmZGVmCURFQlVHCi0Jb2hjaV9kdW1wX3Jvb3RodWIgKCZnb2hjaSwgMSk7Ci0jZWxzZQotCXdhaXRfbXMoMSk7Ci0jZW5kaWYKLQotCWxlbiA9IG1pbl90KGludCwgbGVuLCBsZW5pKTsKLQlpZiAoZGF0YSAhPSBkYXRhX2J1ZikKLQkgICAgbWVtY3B5IChkYXRhLCBkYXRhX2J1ZiwgbGVuKTsKLQlkZXYtPmFjdF9sZW4gPSBsZW47Ci0JZGV2LT5zdGF0dXMgPSBzdGF0OwotCi0jaWZkZWYgREVCVUcKLQlpZiAodHJhbnNmZXJfbGVuKQotCQl1cmJfcHJpdi5hY3R1YWxfbGVuZ3RoID0gdHJhbnNmZXJfbGVuOwotCXBrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBjbWQsICJSRVQocmgpIiwgMC8qdXNiX3BpcGVpbihwaXBlKSovKTsKLSNlbHNlCi0Jd2FpdF9tcygxKTsKLSNlbmRpZgotCi0JcmV0dXJuIHN0YXQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGNvbW1vbiBjb2RlIGZvciBoYW5kbGluZyBzdWJtaXQgbWVzc2FnZXMgLSB1c2VkIGZvciBhbGwgYnV0IHJvb3QgaHViICovCi0vKiBhY2Nlc3Nlcy4gKi8KLWludCBzdWJtaXRfY29tbW9uX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKLQkJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwLCBpbnQgaW50ZXJ2YWwpCi17Ci0JaW50IHN0YXQgPSAwOwotCWludCBtYXhzaXplID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUpOwotCWludCB0aW1lb3V0OwotCi0JLyogZGV2aWNlIHB1bGxlZD8gU2hvcnRjdXQgdGhlIGFjdGlvbi4gKi8KLQlpZiAoZGV2Z29uZSA9PSBkZXYpIHsKLQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQ1JDX0VSUjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0jaWZkZWYgREVCVUcKLQl1cmJfcHJpdi5hY3R1YWxfbGVuZ3RoID0gMDsKLQlwa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJTVUIiLCB1c2JfcGlwZWluKHBpcGUpKTsKLSNlbHNlCi0Jd2FpdF9tcygxKTsKLSNlbmRpZgotCWlmICghbWF4c2l6ZSkgewotCQllcnIoInN1Ym1pdF9jb21tb25fbWVzc2FnZTogcGlwZXNpemUgZm9yIHBpcGUgJWx4IGlzIHplcm8iLAotCQkJcGlwZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoc29oY2lfc3VibWl0X2pvYihkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgaW50ZXJ2YWwpIDwgMCkgewotCQllcnIoInNvaGNpX3N1Ym1pdF9qb2IgZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl3YWl0X21zKDEwKTsKLQkvKiBvaGNpX2R1bXBfc3RhdHVzKCZnb2hjaSk7ICovCi0KLQkvKiBhbGxvdyBtb3JlIHRpbWUgZm9yIGEgQlVMSyBkZXZpY2UgdG8gcmVhY3QgLSBzb21lIGFyZSBzbG93ICovCi0jZGVmaW5lIEJVTEtfVE8JIDUwMDAJLyogdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KLQlpZiAodXNiX3BpcGV0eXBlIChwaXBlKSA9PSBQSVBFX0JVTEspCi0JCXRpbWVvdXQgPSBCVUxLX1RPOwotCWVsc2UKLQkJdGltZW91dCA9IDEwMDsKLQotCS8qIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCi0JZm9yICg7OykgewotCQkvKiBjaGVjayB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIGRvbmUgKi8KLQkJc3RhdCA9IGhjX2ludGVycnVwdCgpOwotCQlpZiAoc3RhdCA8IDApIHsKLQkJCXN0YXQgPSBVU0JfU1RfQ1JDX0VSUjsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChzdGF0ID49IDAgJiYgc3RhdCAhPSAweGZmKSB7Ci0JCQkvKiAweGZmIGlzIHJldHVybmVkIGZvciBhbiBTRi1pbnRlcnJ1cHQgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWlmICgtLXRpbWVvdXQpIHsKLQkJCXdhaXRfbXMoMSk7Ci0JCX0gZWxzZSB7Ci0JCQllcnIoIkNUTDpUSU1FT1VUICIpOwotCQkJc3RhdCA9IFVTQl9TVF9DUkNfRVJSOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyogd2UgZ290IGFuIFJvb3QgSHViIFN0YXR1cyBDaGFuZ2UgaW50ZXJydXB0ICovCi0JaWYgKGdvdF9yaHNjKSB7Ci0jaWZkZWYgREVCVUcKLQkJb2hjaV9kdW1wX3Jvb3RodWIgKCZnb2hjaSwgMSk7Ci0jZW5kaWYKLQkJZ290X3Joc2MgPSAwOwotCQkvKiBhYnVzZSB0aW1lb3V0ICovCi0JCXRpbWVvdXQgPSByaF9jaGVja19wb3J0X3N0YXR1cygmZ29oY2kpOwotCQlpZiAodGltZW91dCA+PSAwKSB7Ci0jaWYgMCAvKiB0aGlzIGRvZXMgbm90aGluZyB1c2VmdWwsIGJ1dCBsZWF2ZSBpdCBoZXJlIGluIGNhc2UgdGhhdCBjaGFuZ2VzICovCi0JCQkvKiB0aGUgY2FsbGVkIHJvdXRpbmUgYWRkcyAxIHRvIHRoZSBwYXNzZWQgdmFsdWUgKi8KLQkJCXVzYl9odWJfcG9ydF9jb25uZWN0X2NoYW5nZShnb2hjaS5yaC5kZXYsIHRpbWVvdXQgLSAxKTsKLSNlbmRpZgotCQkJLyoKLQkJCSAqIFhYWAotCQkJICogVGhpcyBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYmVjYXVzZSBpdCBhc3N1bWVzCi0JCQkgKiB0aGF0IG9ubHkgb25lIGRldmljZSBpcyBldmVyIHBsdWdnZWQgaW4hCi0JCQkgKi8KLQkJCWRldmdvbmUgPSBkZXY7Ci0JCX0KLQl9Ci0KLQlkZXYtPnN0YXR1cyA9IHN0YXQ7Ci0JZGV2LT5hY3RfbGVuID0gdHJhbnNmZXJfbGVuOwotCi0jaWZkZWYgREVCVUcKLQlwa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJSRVQoY3RscikiLCB1c2JfcGlwZWluKHBpcGUpKTsKLSNlbHNlCi0Jd2FpdF9tcygxKTsKLSNlbmRpZgotCi0JLyogZnJlZSBURHMgaW4gdXJiX3ByaXYgKi8KLQl1cmJfZnJlZV9wcml2ICgmdXJiX3ByaXYpOwotCXJldHVybiAwOwotfQotCi0vKiBzdWJtaXQgcm91dGluZXMgY2FsbGVkIGZyb20gdXNiLmMgKi8KLWludCBzdWJtaXRfYnVsa19tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCi0JCWludCB0cmFuc2Zlcl9sZW4pCi17Ci0JaW5mbygic3VibWl0X2J1bGtfbXNnIik7Ci0JcmV0dXJuIHN1Ym1pdF9jb21tb25fbXNnKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIE5VTEwsIDApOwotfQotCi1pbnQgc3VibWl0X2NvbnRyb2xfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAotCQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXApCi17Ci0JaW50IG1heHNpemUgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7Ci0KLQlpbmZvKCJzdWJtaXRfY29udHJvbF9tc2ciKTsKLSNpZmRlZiBERUJVRwotCXVyYl9wcml2LmFjdHVhbF9sZW5ndGggPSAwOwotCXBrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgIlNVQiIsIHVzYl9waXBlaW4ocGlwZSkpOwotI2Vsc2UKLQl3YWl0X21zKDEpOwotI2VuZGlmCi0JaWYgKCFtYXhzaXplKSB7Ci0JCWVycigic3VibWl0X2NvbnRyb2xfbWVzc2FnZTogcGlwZXNpemUgZm9yIHBpcGUgJWx4IGlzIHplcm8iLAotCQkJcGlwZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCgocGlwZSA+PiA4KSAmIDB4N2YpID09IGdvaGNpLnJoLmRldm51bSkgewotCQlnb2hjaS5yaC5kZXYgPSBkZXY7Ci0JCS8qIHJvb3QgaHViIC0gcmVkaXJlY3QgKi8KLQkJcmV0dXJuIG9oY2lfc3VibWl0X3JoX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLAotCQkJc2V0dXApOwotCX0KLQotCXJldHVybiBzdWJtaXRfY29tbW9uX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgMCk7Ci19Ci0KLWludCBzdWJtaXRfaW50X21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKLQkJaW50IHRyYW5zZmVyX2xlbiwgaW50IGludGVydmFsKQotewotCWluZm8oInN1Ym1pdF9pbnRfbXNnIik7Ci0JcmV0dXJuIC0xOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBIQyBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHJlc2V0IHRoZSBIQyBhbmQgQlVTICovCi0KLXN0YXRpYyBpbnQgaGNfcmVzZXQgKG9oY2lfdCAqb2hjaSkKLXsKLQlpbnQgdGltZW91dCA9IDMwOwotCWludCBzbW1fdGltZW91dCA9IDUwOyAvKiAwLDUgc2VjICovCi0KLQlkYmcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JaWYgKHJlYWRsICgmb2hjaS0+cmVncy0+Y29udHJvbCkgJiBPSENJX0NUUkxfSVIpIHsgLyogU01NIG93bnMgdGhlIEhDICovCi0JCXdyaXRlbCAoT0hDSV9PQ1IsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiByZXF1ZXN0IG93bmVyc2hpcCAqLwotCQlpbmZvKCJVU0IgSEMgVGFrZU92ZXIgZnJvbSBTTU0iKTsKLQkJd2hpbGUgKHJlYWRsICgmb2hjaS0+cmVncy0+Y29udHJvbCkgJiBPSENJX0NUUkxfSVIpIHsKLQkJCXdhaXRfbXMgKDEwKTsKLQkJCWlmICgtLXNtbV90aW1lb3V0ID09IDApIHsKLQkJCQllcnIoIlVTQiBIQyBUYWtlT3ZlciBmYWlsZWQhIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCi0JLyogRGlzYWJsZSBIQyBpbnRlcnJ1cHRzICovCi0Jd3JpdGVsIChPSENJX0lOVFJfTUlFLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOwotCi0JZGJnKCJVU0IgSEMgcmVzZXRfaGMgdXNiLSVzOiBjdHJsID0gMHglWCA7XG4iLAotCQlvaGNpLT5zbG90X25hbWUsCi0JCXJlYWRsKCZvaGNpLT5yZWdzLT5jb250cm9sKSk7Ci0KLQkvKiBSZXNldCBVU0IgKG5lZWRlZCBieSBzb21lIGNvbnRyb2xsZXJzKSAqLwotCXdyaXRlbCAoMCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCi0JLyogSEMgUmVzZXQgcmVxdWlyZXMgbWF4IDEwIHVzIGRlbGF5ICovCi0Jd3JpdGVsIChPSENJX0hDUiwgICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOwotCXdoaWxlICgocmVhZGwgKCZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpICYgT0hDSV9IQ1IpICE9IDApIHsKLQkJaWYgKC0tdGltZW91dCA9PSAwKSB7Ci0JCQllcnIoIlVTQiBIQyByZXNldCB0aW1lZCBvdXQhIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdWRlbGF5ICgxKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFN0YXJ0IGFuIE9IQ0kgY29udHJvbGxlciwgc2V0IHRoZSBCVVMgb3BlcmF0aW9uYWwKLSAqIGVuYWJsZSBpbnRlcnJ1cHRzCi0gKiBjb25uZWN0IHRoZSB2aXJ0dWFsIHJvb3QgaHViICovCi0KLXN0YXRpYyBpbnQgaGNfc3RhcnQgKG9oY2lfdCAqIG9oY2kpCi17Ci0JX191MzIgbWFzazsKLQl1bnNpZ25lZCBpbnQgZm1pbnRlcnZhbDsKLQotCW9oY2ktPmRpc2FibGVkID0gMTsKLQotCS8qIFRlbGwgdGhlIGNvbnRyb2xsZXIgd2hlcmUgdGhlIGNvbnRyb2wgYW5kIGJ1bGsgbGlzdHMgYXJlCi0JICogVGhlIGxpc3RzIGFyZSBlbXB0eSBub3cuICovCi0KLQl3cml0ZWwgKDAsICZvaGNpLT5yZWdzLT5lZF9jb250cm9saGVhZCk7Ci0Jd3JpdGVsICgwLCAmb2hjaS0+cmVncy0+ZWRfYnVsa2hlYWQpOwotCi0Jd3JpdGVsICgoX191MzIpb2hjaS0+aGNjYSwgJm9oY2ktPnJlZ3MtPmhjY2EpOyAvKiBhIHJlc2V0IGNsZWFycyB0aGlzICovCi0KLQlmbWludGVydmFsID0gMHgyZWRmOwotCXdyaXRlbCAoKGZtaW50ZXJ2YWwgKiA5KSAvIDEwLCAmb2hjaS0+cmVncy0+cGVyaW9kaWNzdGFydCk7Ci0JZm1pbnRlcnZhbCB8PSAoKCgoZm1pbnRlcnZhbCAtIDIxMCkgKiA2KSAvIDcpIDw8IDE2KTsKLQl3cml0ZWwgKGZtaW50ZXJ2YWwsICZvaGNpLT5yZWdzLT5mbWludGVydmFsKTsKLQl3cml0ZWwgKDB4NjI4LCAmb2hjaS0+cmVncy0+bHN0aHJlc2gpOwotCi0JLyogc3RhcnQgY29udHJvbGxlciBvcGVyYXRpb25zICovCi0Jb2hjaS0+aGNfY29udHJvbCA9IE9IQ0lfQ09OVFJPTF9JTklUIHwgT0hDSV9VU0JfT1BFUjsKLQlvaGNpLT5kaXNhYmxlZCA9IDA7Ci0Jd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7Ci0KLQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0JbWFzayA9IChPSENJX0lOVFJfU08gfCBPSENJX0lOVFJfV0RIIHwgT0hDSV9JTlRSX1NGIHwgT0hDSV9JTlRSX1JEIHwKLQkJCU9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9GTk8gfCBPSENJX0lOVFJfUkhTQyB8Ci0JCQlPSENJX0lOVFJfT0MgfCBPSENJX0lOVFJfTUlFKTsKLQl3cml0ZWwgKG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7Ci0JLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KLQltYXNrICY9IH5PSENJX0lOVFJfTUlFOwotCXdyaXRlbCAobWFzaywgJm9oY2ktPnJlZ3MtPmludHJzdGF0dXMpOwotCS8qIENob29zZSB0aGUgaW50ZXJydXB0cyB3ZSBjYXJlIGFib3V0IG5vdyAgLSBidXQgdy9vIE1JRSAqLwotCW1hc2sgPSBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9XREggfCBPSENJX0lOVFJfU087Ci0Jd3JpdGVsIChtYXNrLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSk7Ci0KLSNpZmRlZglPSENJX1VTRV9OUFMKLQkvKiByZXF1aXJlZCBmb3IgQU1ELTc1NiBhbmQgc29tZSBNYWMgcGxhdGZvcm1zICovCi0Jd3JpdGVsICgocm9vdGh1Yl9hIChvaGNpKSB8IFJIX0FfTlBTKSAmIH5SSF9BX1BTTSwKLQkJJm9oY2ktPnJlZ3MtPnJvb3RodWIuYSk7Ci0Jd3JpdGVsIChSSF9IU19MUFNDLCAmb2hjaS0+cmVncy0+cm9vdGh1Yi5zdGF0dXMpOwotI2VuZGlmCS8qIE9IQ0lfVVNFX05QUyAqLwotCi0jZGVmaW5lIG1kZWxheShuKSAoe3Vuc2lnbmVkIGxvbmcgbXNlYz0obik7IHdoaWxlIChtc2VjLS0pIHVkZWxheSgxMDAwKTt9KQotCS8qIFBPVFBHVCBkZWxheSBpcyBiaXRzIDI0LTMxLCBpbiAyIG1zIHVuaXRzLiAqLwotCW1kZWxheSAoKHJvb3RodWJfYSAob2hjaSkgPj4gMjMpICYgMHgxZmUpOwotCi0JLyogY29ubmVjdCB0aGUgdmlydHVhbCByb290IGh1YiAqLwotCW9oY2ktPnJoLmRldm51bSA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogYW4gaW50ZXJydXB0IGhhcHBlbnMgKi8KLQotc3RhdGljIGludAotaGNfaW50ZXJydXB0ICh2b2lkKQotewotCW9oY2lfdCAqb2hjaSA9ICZnb2hjaTsKLQlzdHJ1Y3Qgb2hjaV9yZWdzICpyZWdzID0gb2hjaS0+cmVnczsKLQlpbnQgaW50czsKLQlpbnQgc3RhdCA9IC0xOwotCi0JaWYgKChvaGNpLT5oY2NhLT5kb25lX2hlYWQgIT0gMCkgJiYgIShtMzJfc3dhcCAob2hjaS0+aGNjYS0+ZG9uZV9oZWFkKSAmIDB4MDEpKSB7Ci0JCWludHMgPQlPSENJX0lOVFJfV0RIOwotCX0gZWxzZSB7Ci0JCWludHMgPSByZWFkbCAoJnJlZ3MtPmludHJzdGF0dXMpOwotCX0KLQotCS8qIGRiZygiSW50ZXJydXB0OiAleCBmcmFtZTogJXgiLCBpbnRzLCBsZTE2X3RvX2NwdSAob2hjaS0+aGNjYS0+ZnJhbWVfbm8pKTsgKi8KLQotCWlmIChpbnRzICYgT0hDSV9JTlRSX1JIU0MpIHsKLQkJZ290X3Joc2MgPSAxOwotCX0KLQotCWlmIChpbnRzICYgT0hDSV9JTlRSX1VFKSB7Ci0JCW9oY2ktPmRpc2FibGVkKys7Ci0JCWVyciAoIk9IQ0kgVW5yZWNvdmVyYWJsZSBFcnJvciwgY29udHJvbGxlciB1c2ItJXMgZGlzYWJsZWQiLAotCQkJb2hjaS0+c2xvdF9uYW1lKTsKLQkJLyogZS5nLiBkdWUgdG8gUENJIE1hc3Rlci9UYXJnZXQgQWJvcnQgKi8KLQotI2lmZGVmCURFQlVHCi0JCW9oY2lfZHVtcCAob2hjaSwgMSk7Ci0jZWxzZQotCXdhaXRfbXMoMSk7Ci0jZW5kaWYKLQkJLyogRklYTUU6IGJlIG9wdGltaXN0aWMsIGhvcGUgdGhhdCBidWcgd29uJ3QgcmVwZWF0IG9mdGVuLiAqLwotCQkvKiBNYWtlIHNvbWUgbm9uLWludGVycnVwdCBjb250ZXh0IHJlc3RhcnQgdGhlIGNvbnRyb2xsZXIuICovCi0JCS8qIENvdW50IGFuZCBsaW1pdCB0aGUgcmV0cmllcyB0aG91Z2g7IGVpdGhlciBoYXJkd2FyZSBvciAqLwotCQkvKiBzb2Z0d2FyZSBlcnJvcnMgY2FuIGdvIGZvcmV2ZXIuLi4gKi8KLQkJaGNfcmVzZXQgKG9oY2kpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGludHMgJiBPSENJX0lOVFJfV0RIKSB7Ci0JCXdhaXRfbXMoMSk7Ci0JCXdyaXRlbCAoT0hDSV9JTlRSX1dESCwgJnJlZ3MtPmludHJkaXNhYmxlKTsKLQkJc3RhdCA9IGRsX2RvbmVfbGlzdCAoJmdvaGNpLCBkbF9yZXZlcnNlX2RvbmVfbGlzdCAoJmdvaGNpKSk7Ci0JCXdyaXRlbCAoT0hDSV9JTlRSX1dESCwgJnJlZ3MtPmludHJlbmFibGUpOwotCX0KLQotCWlmIChpbnRzICYgT0hDSV9JTlRSX1NPKSB7Ci0JCWRiZygiVVNCIFNjaGVkdWxlIG92ZXJydW5cbiIpOwotCQl3cml0ZWwgKE9IQ0lfSU5UUl9TTywgJnJlZ3MtPmludHJlbmFibGUpOwotCQlzdGF0ID0gLTE7Ci0JfQotCi0JLyogRklYTUU6ICB0aGlzIGFzc3VtZXMgU09GICgxL21zKSBpbnRlcnJ1cHRzIGRvbid0IGdldCBsb3N0Li4uICovCi0JaWYgKGludHMgJiBPSENJX0lOVFJfU0YpIHsKLQkJdW5zaWduZWQgaW50IGZyYW1lID0gbTE2X3N3YXAgKG9oY2ktPmhjY2EtPmZyYW1lX25vKSAmIDE7Ci0JCXdhaXRfbXMoMSk7Ci0JCXdyaXRlbCAoT0hDSV9JTlRSX1NGLCAmcmVncy0+aW50cmRpc2FibGUpOwotCQlpZiAob2hjaS0+ZWRfcm1fbGlzdFtmcmFtZV0gIT0gTlVMTCkKLQkJCXdyaXRlbCAoT0hDSV9JTlRSX1NGLCAmcmVncy0+aW50cmVuYWJsZSk7Ci0JCXN0YXQgPSAweGZmOwotCX0KLQotCXdyaXRlbCAoaW50cywgJnJlZ3MtPmludHJzdGF0dXMpOwotCXJldHVybiBzdGF0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBEZS1hbGxvY2F0ZSBhbGwgcmVzb3VyY2VzLi4gKi8KLQotc3RhdGljIHZvaWQgaGNfcmVsZWFzZV9vaGNpIChvaGNpX3QgKm9oY2kpCi17Ci0JZGJnICgiVVNCIEhDIHJlbGVhc2Ugb2hjaSB1c2ItJXMiLCBvaGNpLT5zbG90X25hbWUpOwotCi0JaWYgKCFvaGNpLT5kaXNhYmxlZCkKLQkJaGNfcmVzZXQgKG9oY2kpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogbG93IGxldmVsIGluaXRhbGlzYXRpb24gcm91dGluZSwgY2FsbGVkIGZyb20gdXNiLmMKLSAqLwotc3RhdGljIGNoYXIgb2hjaV9pbml0ZWQgPSAwOwotCi1pbnQgdXNiX2xvd2xldmVsX2luaXQodm9pZCkKLXsKLQkvKgotCSAqIEVuYWJsZSBVU0IgaG9zdCBjbG9jay4KLQkgKi8KLQkqQVQ5MUNfUE1DX1NDRVIgPSBBVDkxQ19QTUNfVUhQOwkvKiA0OE1IeiBjbG9jayBlbmFibGVkIGZvciBVSFAgKi8KLQkqQVQ5MUNfUE1DX1BDRVIgPSAxIDw8IEFUOTFDX0lEX1VIUDsJLyogUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgUmVnaXN0ZXIgKi8KLQotCW1lbXNldCAoJmdvaGNpLCAwLCBzaXplb2YgKG9oY2lfdCkpOwotCW1lbXNldCAoJnVyYl9wcml2LCAwLCBzaXplb2YgKHVyYl9wcml2X3QpKTsKLQotCS8qIGFsaWduIHRoZSBzdG9yYWdlICovCi0JaWYgKChfX3UzMikmZ2hjY2FbMF0gJiAweGZmKSB7Ci0JCWVycigiSENDQSBub3QgYWxpZ25lZCEhIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcGhjY2EgPSAmZ2hjY2FbMF07Ci0JaW5mbygiYWxpZ25lZCBnaGNjYSAlcCIsIHBoY2NhKTsKLQltZW1zZXQoJm9oY2lfZGV2LCAwLCBzaXplb2Yoc3RydWN0IG9oY2lfZGV2aWNlKSk7Ci0JaWYgKChfX3UzMikmb2hjaV9kZXYuZWRbMF0gJiAweDcpIHsKLQkJZXJyKCJFRHMgbm90IGFsaWduZWQhISIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1lbXNldChndGQsIDAsIHNpemVvZih0ZF90KSAqIChOVU1fVEQgKyAxKSk7Ci0JaWYgKChfX3UzMilndGQgJiAweDcpIHsKLQkJZXJyKCJURHMgbm90IGFsaWduZWQhISIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXB0ZCA9IGd0ZDsKLQlnb2hjaS5oY2NhID0gcGhjY2E7Ci0JbWVtc2V0IChwaGNjYSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgb2hjaV9oY2NhKSk7Ci0KLQlnb2hjaS5kaXNhYmxlZCA9IDE7Ci0JZ29oY2kuc2xlZXBpbmcgPSAwOwotCWdvaGNpLmlycSA9IC0xOwotCWdvaGNpLnJlZ3MgPSAoc3RydWN0IG9oY2lfcmVncyAqKUFUOTFfVVNCX0hPU1RfQkFTRTsKLQotCWdvaGNpLmZsYWdzID0gMDsKLQlnb2hjaS5zbG90X25hbWUgPSAiYXQ5MXJtOTIwMCI7Ci0KLQlpZiAoaGNfcmVzZXQgKCZnb2hjaSkgPCAwKSB7Ci0JCWhjX3JlbGVhc2Vfb2hjaSAoJmdvaGNpKTsKLQkJLyogSW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0JCSpBVDkxQ19QTUNfUENFUiA9IEFUOTFDX0lEX1VIUDsKLQkJKkFUOTFDX1BNQ19TQ0RSID0gMSA8PCBBVDkxQ19QTUNfVUhQOwkvKiA0OE1IeiBjbG9jayBkaXNhYmxlZCBmb3IgVUhQICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBGSVhNRSB0aGlzIGlzIGEgc2Vjb25kIEhDIHJlc2V0OyB3aHk/PyAqLwotLyoJd3JpdGVsIChnb2hjaS5oY19jb250cm9sID0gT0hDSV9VU0JfUkVTRVQsICZnb2hjaS5yZWdzLT5jb250cm9sKTsKLQl3YWl0X21zICgxMCk7Ki8KLQotCWlmIChoY19zdGFydCAoJmdvaGNpKSA8IDApIHsKLQkJZXJyICgiY2FuJ3Qgc3RhcnQgdXNiLSVzIiwgZ29oY2kuc2xvdF9uYW1lKTsKLQkJaGNfcmVsZWFzZV9vaGNpICgmZ29oY2kpOwotCQkvKiBJbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLQkJKkFUOTFDX1BNQ19QQ0VSID0gQVQ5MUNfSURfVUhQOwotCQkqQVQ5MUNfUE1DX1NDRFIgPSAxIDw8IEFUOTFDX1BNQ19VSFA7CS8qIDQ4TUh6IGNsb2NrIGRpc2FibGVkIGZvciBVSFAgKi8KLQkJcmV0dXJuIC0xOwotCX0KLQotI2lmZGVmCURFQlVHCi0Jb2hjaV9kdW1wICgmZ29oY2ksIDEpOwotI2Vsc2UKLQl3YWl0X21zKDEpOwotI2VuZGlmCi0Jb2hjaV9pbml0ZWQgPSAxOwotCXJldHVybiAwOwotfQotCi1pbnQgdXNiX2xvd2xldmVsX3N0b3Aodm9pZCkKLXsKLQkvKiB0aGlzIGdldHMgY2FsbGVkIHJlYWxseSBlYXJseSAtIGJlZm9yZSB0aGUgY29udHJvbGxlciBoYXMgKi8KLQkvKiBldmVuIGJlZW4gaW5pdGlhbGl6ZWQhICovCi0JaWYgKCFvaGNpX2luaXRlZCkKLQkJcmV0dXJuIDA7Ci0JLyogVE9ETyByZWxlYXNlIGFueSBpbnRlcnJ1cHRzLCBldGMuICovCi0JLyogY2FsbCBoY19yZWxlYXNlX29oY2koKSBoZXJlID8gKi8KLQloY19yZXNldCAoJmdvaGNpKTsKLQkvKiBtYXkgbm90IHdhbnQgdG8gZG8gdGhpcyAqLwotCSpBVDkxQ19QTUNfUENFUiA9IDEgPDwgQVQ5MUNfSURfVUhQOwotCSpBVDkxQ19QTUNfU0NEUiA9IDEgPDwgQVQ5MUNfUE1DX1VIUDsJLyogNDhNSHogY2xvY2sgZGlzYWJsZWQgZm9yIFVIUCAqLwotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1VTQl9PSENJICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYl9vaGNpLmggYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYl9vaGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjRlOTMuLjAwMDAwMDAKLS0tIGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2Jfb2hjaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiBVUkIgT0hDSSBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0IuCi0gKgotICogKEMpIENvcHlyaWdodCAxOTk5IFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KLSAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAxIERhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICoKLSAqIHVzYi1vaGNpLmgKLSAqLwotCi0KLXN0YXRpYyBpbnQgY2NfdG9fZXJyb3JbMTZdID0gewotCi0vKiBtYXBwaW5nIG9mIHRoZSBPSENJIENDIHN0YXR1cyB0byBlcnJvciBjb2RlcyAqLwotCS8qIE5vICBFcnJvciAgKi8JICAgICAgIDAsCi0JLyogQ1JDIEVycm9yICAqLwkgICAgICAgVVNCX1NUX0NSQ19FUlIsCi0JLyogQml0IFN0dWZmICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCi0JLyogRGF0YSBUb2dnICAqLwkgICAgICAgVVNCX1NUX0NSQ19FUlIsCi0JLyogU3RhbGwgICAgICAqLwkgICAgICAgVVNCX1NUX1NUQUxMRUQsCi0JLyogRGV2Tm90UmVzcCAqLwkgICAgICAgLTEsCi0JLyogUElEQ2hlY2sgICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCi0JLyogVW5FeHBQSUQgICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCi0JLyogRGF0YU92ZXIgICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCi0JLyogRGF0YVVuZGVyICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCi0JLyogcmVzZXJ2ZCAgICAqLwkgICAgICAgLTEsCi0JLyogcmVzZXJ2ZCAgICAqLwkgICAgICAgLTEsCi0JLyogQnVmZmVyT3ZlciAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCi0JLyogQnVmZlVuZGVyICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCi0JLyogTm90IEFjY2VzcyAqLwkgICAgICAgLTEsCi0JLyogTm90IEFjY2VzcyAqLwkgICAgICAgLTEKLX07Ci0KLS8qIEVEIFN0YXRlcyAqLwotCi0jZGVmaW5lIEVEX05FVwkJMHgwMAotI2RlZmluZSBFRF9VTkxJTksJMHgwMQotI2RlZmluZSBFRF9PUEVSCQkweDAyCi0jZGVmaW5lIEVEX0RFTAkJMHgwNAotI2RlZmluZSBFRF9VUkJfREVMCTB4MDgKLQotLyogdXNiX29oY2lfZWQgKi8KLXN0cnVjdCBlZCB7Ci0JX191MzIgaHdJTkZPOwotCV9fdTMyIGh3VGFpbFA7Ci0JX191MzIgaHdIZWFkUDsKLQlfX3UzMiBod05leHRFRDsKLQotCXN0cnVjdCBlZCAqZWRfcHJldjsKLQlfX3U4IGludF9wZXJpb2Q7Ci0JX191OCBpbnRfYnJhbmNoOwotCV9fdTggaW50X2xvYWQ7Ci0JX191OCBpbnRfaW50ZXJ2YWw7Ci0JX191OCBzdGF0ZTsKLQlfX3U4IHR5cGU7Ci0JX191MTYgbGFzdF9pc287Ci0Jc3RydWN0IGVkICplZF9ybV9saXN0OwotCi0Jc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7Ci0JX191MzIgdW51c2VkWzNdOwotfSBfX2F0dHJpYnV0ZSgoYWxpZ25lZCgxNikpKTsKLXR5cGVkZWYgc3RydWN0IGVkIGVkX3Q7Ci0KLQotLyogVEQgaW5mbyBmaWVsZCAqLwotI2RlZmluZSBURF9DQwkgICAgMHhmMDAwMDAwMAotI2RlZmluZSBURF9DQ19HRVQodGRfcCkgKCh0ZF9wID4+MjgpICYgMHgwZikKLSNkZWZpbmUgVERfQ0NfU0VUKHRkX3AsIGNjKSAodGRfcCkgPSAoKHRkX3ApICYgMHgwZmZmZmZmZikgfCAoKChjYykgJiAweDBmKSA8PCAyOCkKLSNkZWZpbmUgVERfRUMJICAgIDB4MEMwMDAwMDAKLSNkZWZpbmUgVERfVAkgICAgMHgwMzAwMDAwMAotI2RlZmluZSBURF9UX0RBVEEwICAweDAyMDAwMDAwCi0jZGVmaW5lIFREX1RfREFUQTEgIDB4MDMwMDAwMDAKLSNkZWZpbmUgVERfVF9UT0dHTEUgMHgwMDAwMDAwMAotI2RlZmluZSBURF9SCSAgICAweDAwMDQwMDAwCi0jZGVmaW5lIFREX0RJCSAgICAweDAwRTAwMDAwCi0jZGVmaW5lIFREX0RJX1NFVChYKSAoKChYKSAmIDB4MDcpPDwgMjEpCi0jZGVmaW5lIFREX0RQCSAgICAweDAwMTgwMDAwCi0jZGVmaW5lIFREX0RQX1NFVFVQIDB4MDAwMDAwMDAKLSNkZWZpbmUgVERfRFBfSU4gICAgMHgwMDEwMDAwMAotI2RlZmluZSBURF9EUF9PVVQgICAweDAwMDgwMDAwCi0KLSNkZWZpbmUgVERfSVNPCSAgICAweDAwMDEwMDAwCi0jZGVmaW5lIFREX0RFTAkgICAgMHgwMDAyMDAwMAotCi0vKiBDQyBDb2RlcyAqLwotI2RlZmluZSBURF9DQ19OT0VSUk9SCSAgIDB4MDAKLSNkZWZpbmUgVERfQ0NfQ1JDCSAgIDB4MDEKLSNkZWZpbmUgVERfQ0NfQklUU1RVRkZJTkcgIDB4MDIKLSNkZWZpbmUgVERfQ0NfREFUQVRPR0dMRU0gIDB4MDMKLSNkZWZpbmUgVERfQ0NfU1RBTEwJICAgMHgwNAotI2RlZmluZSBURF9ERVZOT1RSRVNQCSAgIDB4MDUKLSNkZWZpbmUgVERfUElEQ0hFQ0tGQUlMCSAgIDB4MDYKLSNkZWZpbmUgVERfVU5FWFBFQ1RFRFBJRCAgIDB4MDcKLSNkZWZpbmUgVERfREFUQU9WRVJSVU4JICAgMHgwOAotI2RlZmluZSBURF9EQVRBVU5ERVJSVU4JICAgMHgwOQotI2RlZmluZSBURF9CVUZGRVJPVkVSUlVOICAgMHgwQwotI2RlZmluZSBURF9CVUZGRVJVTkRFUlJVTiAgMHgwRAotI2RlZmluZSBURF9OT1RBQ0NFU1NFRAkgICAweDBGCi0KLQotI2RlZmluZSBNQVhQU1cgMQotCi1zdHJ1Y3QgdGQgewotCV9fdTMyIGh3SU5GTzsKLQlfX3UzMiBod0NCUDsJCS8qIEN1cnJlbnQgQnVmZmVyIFBvaW50ZXIgKi8KLQlfX3UzMiBod05leHRURDsJCS8qIE5leHQgVEQgUG9pbnRlciAqLwotCV9fdTMyIGh3QkU7CQkvKiBNZW1vcnkgQnVmZmVyIEVuZCBQb2ludGVyICovCi0KLQlfX3UxNiBod1BTV1tNQVhQU1ddOwotCV9fdTggdW51c2VkOwotCV9fdTggaW5kZXg7Ci0Jc3RydWN0IGVkICplZDsKLQlzdHJ1Y3QgdGQgKm5leHRfZGxfdGQ7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7Ci0JaW50IHRyYW5zZmVyX2xlbjsKLQlfX3UzMiBkYXRhOwotCi0JX191MzIgdW51c2VkMlsyXTsKLX0gX19hdHRyaWJ1dGUoKGFsaWduZWQoMzIpKSk7Ci10eXBlZGVmIHN0cnVjdCB0ZCB0ZF90OwotCi0jZGVmaW5lIE9IQ0lfRURfU0tJUAkoMSA8PCAxNCkKLQotLyoKLSAqIFRoZSBIQ0NBIChIb3N0IENvbnRyb2xsZXIgQ29tbXVuaWNhdGlvbnMgQXJlYSkgaXMgYSAyNTYgYnl0ZQotICogc3RydWN0dXJlIGRlZmluZWQgaW4gdGhlIE9IQ0kgc3BlYy4gdGhhdCB0aGUgaG9zdCBjb250cm9sbGVyIGlzCi0gKiB0b2xkIHRoZSBiYXNlIGFkZHJlc3Mgb2YuICBJdCBtdXN0IGJlIDI1Ni1ieXRlIGFsaWduZWQuCi0gKi8KLQotI2RlZmluZSBOVU1fSU5UUyAzMgkvKiBwYXJ0IG9mIHRoZSBPSENJIHN0YW5kYXJkICovCi1zdHJ1Y3Qgb2hjaV9oY2NhIHsKLQlfX3UzMglpbnRfdGFibGVbTlVNX0lOVFNdOwkvKiBJbnRlcnJ1cHQgRUQgdGFibGUgKi8KLQlfX3UxNglmcmFtZV9ubzsJCS8qIGN1cnJlbnQgZnJhbWUgbnVtYmVyICovCi0JX191MTYJcGFkMTsJCQkvKiBzZXQgdG8gMCBvbiBlYWNoIGZyYW1lX25vIGNoYW5nZSAqLwotCV9fdTMyCWRvbmVfaGVhZDsJCS8qIGluZm8gcmV0dXJuZWQgZm9yIGFuIGludGVycnVwdCAqLwotCXU4CQlyZXNlcnZlZF9mb3JfaGNbMTE2XTsKLX0gX19hdHRyaWJ1dGUoKGFsaWduZWQoMjU2KSkpOwotCi0KLS8qCi0gKiBNYXhpbXVtIG51bWJlciBvZiByb290IGh1YiBwb3J0cy4KLSAqLwotI2RlZmluZSBNQVhfUk9PVF9QT1JUUwkxNQkvKiBtYXhpbXVtIE9IQ0kgcm9vdCBodWIgcG9ydHMgKi8KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgT0hDSSBjb250cm9sbGVyJ3MgbWVtb3J5IG1hcHBlZCBJL08KLSAqIHJlZ2lvbi4gIFRoaXMgaXMgTWVtb3J5IE1hcHBlZCBJL08uCVlvdSBtdXN0IHVzZSB0aGUgcmVhZGwoKSBhbmQKLSAqIHdyaXRlbCgpIG1hY3JvcyBkZWZpbmVkIGluIGFzbS9pby5oIHRvIGFjY2VzcyB0aGVzZSEhCi0gKi8KLXN0cnVjdCBvaGNpX3JlZ3MgewotCS8qIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcnMgKi8KLQlfX3UzMglyZXZpc2lvbjsKLQlfX3UzMgljb250cm9sOwotCV9fdTMyCWNtZHN0YXR1czsKLQlfX3UzMglpbnRyc3RhdHVzOwotCV9fdTMyCWludHJlbmFibGU7Ci0JX191MzIJaW50cmRpc2FibGU7Ci0JLyogbWVtb3J5IHBvaW50ZXJzICovCi0JX191MzIJaGNjYTsKLQlfX3UzMgllZF9wZXJpb2RjdXJyZW50OwotCV9fdTMyCWVkX2NvbnRyb2xoZWFkOwotCV9fdTMyCWVkX2NvbnRyb2xjdXJyZW50OwotCV9fdTMyCWVkX2J1bGtoZWFkOwotCV9fdTMyCWVkX2J1bGtjdXJyZW50OwotCV9fdTMyCWRvbmVoZWFkOwotCS8qIGZyYW1lIGNvdW50ZXJzICovCi0JX191MzIJZm1pbnRlcnZhbDsKLQlfX3UzMglmbXJlbWFpbmluZzsKLQlfX3UzMglmbW51bWJlcjsKLQlfX3UzMglwZXJpb2RpY3N0YXJ0OwotCV9fdTMyCWxzdGhyZXNoOwotCS8qIFJvb3QgaHViIHBvcnRzICovCi0Jc3RydWN0CW9oY2lfcm9vdGh1Yl9yZWdzIHsKLQkJX191MzIJYTsKLQkJX191MzIJYjsKLQkJX191MzIJc3RhdHVzOwotCQlfX3UzMglwb3J0c3RhdHVzW01BWF9ST09UX1BPUlRTXTsKLQl9IHJvb3RodWI7Ci19IF9fYXR0cmlidXRlKChhbGlnbmVkKDMyKSkpOwotCi0KLS8qIE9IQ0kgQ09OVFJPTCBBTkQgU1RBVFVTIFJFR0lTVEVSIE1BU0tTICovCi0KLS8qCi0gKiBIY0NvbnRyb2wgKGNvbnRyb2wpIHJlZ2lzdGVyIG1hc2tzCi0gKi8KLSNkZWZpbmUgT0hDSV9DVFJMX0NCU1IJKDMgPDwgMCkJLyogY29udHJvbC9idWxrIHNlcnZpY2UgcmF0aW8gKi8KLSNkZWZpbmUgT0hDSV9DVFJMX1BMRQkoMSA8PCAyKQkvKiBwZXJpb2RpYyBsaXN0IGVuYWJsZSAqLwotI2RlZmluZSBPSENJX0NUUkxfSUUJKDEgPDwgMykJLyogaXNvY2hyb25vdXMgZW5hYmxlICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9DTEUJKDEgPDwgNCkJLyogY29udHJvbCBsaXN0IGVuYWJsZSAqLwotI2RlZmluZSBPSENJX0NUUkxfQkxFCSgxIDw8IDUpCS8qIGJ1bGsgbGlzdCBlbmFibGUgKi8KLSNkZWZpbmUgT0hDSV9DVFJMX0hDRlMJKDMgPDwgNikJLyogaG9zdCBjb250cm9sbGVyIGZ1bmN0aW9uYWwgc3RhdGUgKi8KLSNkZWZpbmUgT0hDSV9DVFJMX0lSCSgxIDw8IDgpCS8qIGludGVycnVwdCByb3V0aW5nICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9SV0MJKDEgPDwgOSkJLyogcmVtb3RlIHdha2V1cCBjb25uZWN0ZWQgKi8KLSNkZWZpbmUgT0hDSV9DVFJMX1JXRQkoMSA8PCAxMCkJLyogcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KLQotLyogcHJlLXNoaWZ0ZWQgdmFsdWVzIGZvciBIQ0ZTICovCi0jCWRlZmluZSBPSENJX1VTQl9SRVNFVAkoMCA8PCA2KQotIwlkZWZpbmUgT0hDSV9VU0JfUkVTVU1FCSgxIDw8IDYpCi0jCWRlZmluZSBPSENJX1VTQl9PUEVSCSgyIDw8IDYpCi0jCWRlZmluZSBPSENJX1VTQl9TVVNQRU5EICgzIDw8IDYpCi0KLS8qCi0gKiBIY0NvbW1hbmRTdGF0dXMgKGNtZHN0YXR1cykgcmVnaXN0ZXIgbWFza3MKLSAqLwotI2RlZmluZSBPSENJX0hDUgkoMSA8PCAwKQkvKiBob3N0IGNvbnRyb2xsZXIgcmVzZXQgKi8KLSNkZWZpbmUgT0hDSV9DTEYJKDEgPDwgMSkJLyogY29udHJvbCBsaXN0IGZpbGxlZCAqLwotI2RlZmluZSBPSENJX0JMRgkoMSA8PCAyKQkvKiBidWxrIGxpc3QgZmlsbGVkICovCi0jZGVmaW5lIE9IQ0lfT0NSCSgxIDw8IDMpCS8qIG93bmVyc2hpcCBjaGFuZ2UgcmVxdWVzdCAqLwotI2RlZmluZSBPSENJX1NPQwkoMyA8PCAxNikJLyogc2NoZWR1bGluZyBvdmVycnVuIGNvdW50ICovCi0KLS8qCi0gKiBtYXNrcyB1c2VkIHdpdGggaW50ZXJydXB0IHJlZ2lzdGVyczoKLSAqIEhjSW50ZXJydXB0U3RhdHVzIChpbnRyc3RhdHVzKQotICogSGNJbnRlcnJ1cHRFbmFibGUgKGludHJlbmFibGUpCi0gKiBIY0ludGVycnVwdERpc2FibGUgKGludHJkaXNhYmxlKQotICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9TTwkoMSA8PCAwKQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gKi8KLSNkZWZpbmUgT0hDSV9JTlRSX1dESAkoMSA8PCAxKQkvKiB3cml0ZWJhY2sgb2YgZG9uZV9oZWFkICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9TRgkoMSA8PCAyKQkvKiBzdGFydCBmcmFtZSAqLwotI2RlZmluZSBPSENJX0lOVFJfUkQJKDEgPDwgMykJLyogcmVzdW1lIGRldGVjdCAqLwotI2RlZmluZSBPSENJX0lOVFJfVUUJKDEgPDwgNCkJLyogdW5yZWNvdmVyYWJsZSBlcnJvciAqLwotI2RlZmluZSBPSENJX0lOVFJfRk5PCSgxIDw8IDUpCS8qIGZyYW1lIG51bWJlciBvdmVyZmxvdyAqLwotI2RlZmluZSBPSENJX0lOVFJfUkhTQwkoMSA8PCA2KQkvKiByb290IGh1YiBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9PQwkoMSA8PCAzMCkJLyogb3duZXJzaGlwIGNoYW5nZSAqLwotI2RlZmluZSBPSENJX0lOVFJfTUlFCSgxIDw8IDMxKQkvKiBtYXN0ZXIgaW50ZXJydXB0IGVuYWJsZSAqLwotCi0KLS8qIFZpcnR1YWwgUm9vdCBIVUIgKi8KLXN0cnVjdCB2aXJ0X3Jvb3RfaHViIHsKLQlpbnQgZGV2bnVtOyAvKiBBZGRyZXNzIG9mIFJvb3QgSHViIGVuZHBvaW50ICovCi0Jdm9pZCAqZGV2OyAgLyogd2FzIHVyYiAqLwotCXZvaWQgKmludF9hZGRyOwotCWludCBzZW5kOwotCWludCBpbnRlcnZhbDsKLX07Ci0KLS8qIFVTQiBIVUIgQ09OU1RBTlRTIChub3QgT0hDSS1zcGVjaWZpYzsgc2VlIGh1Yi5oKSAqLwotCi0vKiBkZXN0aW5hdGlvbiBvZiByZXF1ZXN0ICovCi0jZGVmaW5lIFJIX0lOVEVSRkFDRQkJICAgMHgwMQotI2RlZmluZSBSSF9FTkRQT0lOVAkJICAgMHgwMgotI2RlZmluZSBSSF9PVEhFUgkJICAgMHgwMwotCi0jZGVmaW5lIFJIX0NMQVNTCQkgICAweDIwCi0jZGVmaW5lIFJIX1ZFTkRPUgkJICAgMHg0MAotCi0vKiBSZXF1ZXN0czogYlJlcXVlc3QgPDwgOCB8IGJtUmVxdWVzdFR5cGUgKi8KLSNkZWZpbmUgUkhfR0VUX1NUQVRVUwkJMHgwMDgwCi0jZGVmaW5lIFJIX0NMRUFSX0ZFQVRVUkUJMHgwMTAwCi0jZGVmaW5lIFJIX1NFVF9GRUFUVVJFCQkweDAzMDAKLSNkZWZpbmUgUkhfU0VUX0FERFJFU1MJCTB4MDUwMAotI2RlZmluZSBSSF9HRVRfREVTQ1JJUFRPUgkweDA2ODAKLSNkZWZpbmUgUkhfU0VUX0RFU0NSSVBUT1IJMHgwNzAwCi0jZGVmaW5lIFJIX0dFVF9DT05GSUdVUkFUSU9OCTB4MDg4MAotI2RlZmluZSBSSF9TRVRfQ09ORklHVVJBVElPTgkweDA5MDAKLSNkZWZpbmUgUkhfR0VUX1NUQVRFCQkweDAyODAKLSNkZWZpbmUgUkhfR0VUX0lOVEVSRkFDRQkweDBBODAKLSNkZWZpbmUgUkhfU0VUX0lOVEVSRkFDRQkweDBCMDAKLSNkZWZpbmUgUkhfU1lOQ19GUkFNRQkJMHgwQzgwCi0vKiBPdXIgVmVuZG9yIFNwZWNpZmljIFJlcXVlc3QgKi8KLSNkZWZpbmUgUkhfU0VUX0VQCQkweDIwMDAKLQotCi0vKiBIdWIgcG9ydCBmZWF0dXJlcyAqLwotI2RlZmluZSBSSF9QT1JUX0NPTk5FQ1RJT04JICAgMHgwMAotI2RlZmluZSBSSF9QT1JUX0VOQUJMRQkJICAgMHgwMQotI2RlZmluZSBSSF9QT1JUX1NVU1BFTkQJCSAgIDB4MDIKLSNkZWZpbmUgUkhfUE9SVF9PVkVSX0NVUlJFTlQJICAgMHgwMwotI2RlZmluZSBSSF9QT1JUX1JFU0VUCQkgICAweDA0Ci0jZGVmaW5lIFJIX1BPUlRfUE9XRVIJCSAgIDB4MDgKLSNkZWZpbmUgUkhfUE9SVF9MT1dfU1BFRUQJICAgMHgwOQotCi0jZGVmaW5lIFJIX0NfUE9SVF9DT05ORUNUSU9OCSAgIDB4MTAKLSNkZWZpbmUgUkhfQ19QT1JUX0VOQUJMRQkgICAweDExCi0jZGVmaW5lIFJIX0NfUE9SVF9TVVNQRU5ECSAgIDB4MTIKLSNkZWZpbmUgUkhfQ19QT1JUX09WRVJfQ1VSUkVOVAkgICAweDEzCi0jZGVmaW5lIFJIX0NfUE9SVF9SRVNFVAkJICAgMHgxNAotCi0vKiBIdWIgZmVhdHVyZXMgKi8KLSNkZWZpbmUgUkhfQ19IVUJfTE9DQUxfUE9XRVIJICAgMHgwMAotI2RlZmluZSBSSF9DX0hVQl9PVkVSX0NVUlJFTlQJICAgMHgwMQotCi0jZGVmaW5lIFJIX0RFVklDRV9SRU1PVEVfV0FLRVVQCSAgIDB4MDAKLSNkZWZpbmUgUkhfRU5EUE9JTlRfU1RBTEwJICAgMHgwMQotCi0jZGVmaW5lIFJIX0FDSwkJCSAgIDB4MDEKLSNkZWZpbmUgUkhfUkVRX0VSUgkJICAgLTEKLSNkZWZpbmUgUkhfTkFDSwkJCSAgIDB4MDAKLQotCi0vKiBPSENJIFJPT1QgSFVCIFJFR0lTVEVSIE1BU0tTICovCi0KLS8qIHJvb3RodWIucG9ydHN0YXR1cyBbaV0gYml0cyAqLwotI2RlZmluZSBSSF9QU19DQ1MJICAgICAweDAwMDAwMDAxCQkvKiBjdXJyZW50IGNvbm5lY3Qgc3RhdHVzICovCi0jZGVmaW5lIFJIX1BTX1BFUwkgICAgIDB4MDAwMDAwMDIJCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyovCi0jZGVmaW5lIFJIX1BTX1BTUwkgICAgIDB4MDAwMDAwMDQJCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMgKi8KLSNkZWZpbmUgUkhfUFNfUE9DSQkgICAgIDB4MDAwMDAwMDgJCS8qIHBvcnQgb3ZlciBjdXJyZW50IGluZGljYXRvciAqLwotI2RlZmluZSBSSF9QU19QUlMJICAgICAweDAwMDAwMDEwCQkvKiBwb3J0IHJlc2V0IHN0YXR1cyAqLwotI2RlZmluZSBSSF9QU19QUFMJICAgICAweDAwMDAwMTAwCQkvKiBwb3J0IHBvd2VyIHN0YXR1cyAqLwotI2RlZmluZSBSSF9QU19MU0RBCSAgICAgMHgwMDAwMDIwMAkJLyogbG93IHNwZWVkIGRldmljZSBhdHRhY2hlZCAqLwotI2RlZmluZSBSSF9QU19DU0MJICAgICAweDAwMDEwMDAwCQkvKiBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUgUkhfUFNfUEVTQwkgICAgIDB4MDAwMjAwMDAJCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUgUkhfUFNfUFNTQwkgICAgIDB4MDAwNDAwMDAJCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIFJIX1BTX09DSUMJICAgICAweDAwMDgwMDAwCQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZSAqLwotI2RlZmluZSBSSF9QU19QUlNDCSAgICAgMHgwMDEwMDAwMAkJLyogcG9ydCByZXNldCBzdGF0dXMgY2hhbmdlICovCi0KLS8qIHJvb3RodWIuc3RhdHVzIGJpdHMgKi8KLSNkZWZpbmUgUkhfSFNfTFBTCSAgICAgMHgwMDAwMDAwMQkJLyogbG9jYWwgcG93ZXIgc3RhdHVzICovCi0jZGVmaW5lIFJIX0hTX09DSQkgICAgIDB4MDAwMDAwMDIJCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUkhfSFNfRFJXRQkgICAgIDB4MDAwMDgwMDAJCS8qIGRldmljZSByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLwotI2RlZmluZSBSSF9IU19MUFNDCSAgICAgMHgwMDAxMDAwMAkJLyogbG9jYWwgcG93ZXIgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBSSF9IU19PQ0lDCSAgICAgMHgwMDAyMDAwMAkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciBjaGFuZ2UgKi8KLSNkZWZpbmUgUkhfSFNfQ1JXRQkgICAgIDB4ODAwMDAwMDAJCS8qIGNsZWFyIHJlbW90ZSB3YWtldXAgZW5hYmxlICovCi0KLS8qIHJvb3RodWIuYiBtYXNrcyAqLwotI2RlZmluZSBSSF9CX0RSCQkweDAwMDBmZmZmCQkvKiBkZXZpY2UgcmVtb3ZhYmxlIGZsYWdzICovCi0jZGVmaW5lIFJIX0JfUFBDTQkweGZmZmYwMDAwCQkvKiBwb3J0IHBvd2VyIGNvbnRyb2wgbWFzayAqLwotCi0vKiByb290aHViLmEgbWFza3MgKi8KLSNkZWZpbmUgUkhfQV9ORFAJKDB4ZmYgPDwgMCkJCS8qIG51bWJlciBvZiBkb3duc3RyZWFtIHBvcnRzICovCi0jZGVmaW5lIFJIX0FfUFNNCSgxIDw8IDgpCQkvKiBwb3dlciBzd2l0Y2hpbmcgbW9kZSAqLwotI2RlZmluZSBSSF9BX05QUwkoMSA8PCA5KQkJLyogbm8gcG93ZXIgc3dpdGNoaW5nICovCi0jZGVmaW5lIFJIX0FfRFQJCSgxIDw8IDEwKQkJLyogZGV2aWNlIHR5cGUgKG1ieikgKi8KLSNkZWZpbmUgUkhfQV9PQ1BNCSgxIDw8IDExKQkJLyogb3ZlciBjdXJyZW50IHByb3RlY3Rpb24gbW9kZSAqLwotI2RlZmluZSBSSF9BX05PQ1AJKDEgPDwgMTIpCQkvKiBubyBvdmVyIGN1cnJlbnQgcHJvdGVjdGlvbiAqLwotI2RlZmluZSBSSF9BX1BPVFBHVAkoMHhmZiA8PCAyNCkJCS8qIHBvd2VyIG9uIHRvIHBvd2VyIGdvb2QgdGltZSAqLwotCi0vKiB1cmIgKi8KLSNkZWZpbmUgTl9VUkJfVEQgNDgKLXR5cGVkZWYgc3RydWN0Ci17Ci0JZWRfdCAqZWQ7Ci0JX191MTYgbGVuZ3RoOwkvKiBudW1iZXIgb2YgdGRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgKi8KLQlfX3UxNiB0ZF9jbnQ7CS8qIG51bWJlciBvZiB0ZHMgYWxyZWFkeSBzZXJ2aWNlZCAqLwotCWludCAgIHN0YXRlOwotCXVuc2lnbmVkIGxvbmcgcGlwZTsKLQlpbnQgYWN0dWFsX2xlbmd0aDsKLQl0ZF90ICp0ZFtOX1VSQl9URF07CS8qIGxpc3QgcG9pbnRlciB0byBhbGwgY29ycmVzcG9uZGluZyBURHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCAqLwotfSB1cmJfcHJpdl90OwotI2RlZmluZSBVUkJfREVMIDEKLQotLyoKLSAqIFRoaXMgaXMgdGhlIGZ1bGwgb2hjaSBjb250cm9sbGVyIGRlc2NyaXB0aW9uCi0gKgotICogTm90ZSBob3cgdGhlICJwcm9wZXIiIFVTQiBpbmZvcm1hdGlvbiBpcyBqdXN0Ci0gKiBhIHN1YnNldCBvZiB3aGF0IHRoZSBmdWxsIGltcGxlbWVudGF0aW9uIG5lZWRzLiAoTGludXMpCi0gKi8KLQotCi10eXBlZGVmIHN0cnVjdCBvaGNpIHsKLQlzdHJ1Y3Qgb2hjaV9oY2NhICpoY2NhOwkJLyogaGNjYSAqLwotCS8qZG1hX2FkZHJfdCBoY2NhX2RtYTsqLwotCi0JaW50IGlycTsKLQlpbnQgZGlzYWJsZWQ7CQkJLyogZS5nLiBnb3QgYSBVRSwgd2UncmUgaHVuZyAqLwotCWludCBzbGVlcGluZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogZm9yIEhDIGJ1Z3MgKi8KLQotCXN0cnVjdCBvaGNpX3JlZ3MgKnJlZ3M7IC8qIE9IQ0kgY29udHJvbGxlcidzIG1lbW9yeSAqLwotCi0JZWRfdCAqZWRfcm1fbGlzdFsyXTsJIC8qIGxpc3RzIG9mIGFsbCBlbmRwb2ludHMgdG8gYmUgcmVtb3ZlZCAqLwotCWVkX3QgKmVkX2J1bGt0YWlsOwkgLyogbGFzdCBlbmRwb2ludCBvZiBidWxrIGxpc3QgKi8KLQllZF90ICplZF9jb250cm9sdGFpbDsJIC8qIGxhc3QgZW5kcG9pbnQgb2YgY29udHJvbCBsaXN0ICovCi0JaW50IGludHJzdGF0dXM7Ci0JX191MzIgaGNfY29udHJvbDsJCS8qIGNvcHkgb2YgdGhlIGhjIGNvbnRyb2wgcmVnICovCi0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldlszMl07Ci0Jc3RydWN0IHZpcnRfcm9vdF9odWIgcmg7Ci0KLQljb25zdCBjaGFyCSpzbG90X25hbWU7Ci19IG9oY2lfdDsKLQotI2RlZmluZSBOVU1fRURTIDgJCS8qIG51bSBvZiBwcmVhbGxvY2F0ZWQgZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KLQotc3RydWN0IG9oY2lfZGV2aWNlIHsKLQllZF90CWVkW05VTV9FRFNdOwotCWludCBlZF9jbnQ7Ci19OwotCi0vKiBoY2QgKi8KLS8qIGVuZHBvaW50ICovCi1zdGF0aWMgaW50IGVwX2xpbmsob2hjaV90ICogb2hjaSwgZWRfdCAqIGVkKTsKLXN0YXRpYyBpbnQgZXBfdW5saW5rKG9oY2lfdCAqIG9oY2ksIGVkX3QgKiBlZCk7Ci1zdGF0aWMgZWRfdCAqIGVwX2FkZF9lZChzdHJ1Y3QgdXNiX2RldmljZSAqIHVzYl9kZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHdlIG5lZWQgbW9yZSBURHMgdGhhbiBFRHMgKi8KLSNkZWZpbmUgTlVNX1REIDY0Ci0KLS8qICsxIHNvIHdlIGNhbiBhbGlnbiB0aGUgc3RvcmFnZSAqLwotdGRfdCBndGRbTlVNX1REKzFdOwotLyogcG9pbnRlcnMgdG8gYWxpZ25lZCBzdG9yYWdlICovCi10ZF90ICpwdGQ7Ci0KLS8qIFREcyAuLi4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRkICoKLXRkX2FsbG9jIChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgdGQJKnRkOwotCi0JdGQgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fVEQ7IGkrKykKLQl7Ci0JCWlmIChwdGRbaV0udXNiX2RldiA9PSBOVUxMKQotCQl7Ci0JCQl0ZCA9ICZwdGRbaV07Ci0JCQl0ZC0+dXNiX2RldiA9IHVzYl9kZXY7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiB0ZDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1lZF9mcmVlIChzdHJ1Y3QgZWQgKmVkKQotewotCWVkLT51c2JfZGV2ID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L3MzYzI0eDAvTWFrZWZpbGUgYi9jcHUvYXJtOTIwdC9zM2MyNHgwL01ha2VmaWxlCmluZGV4IDNhN2M0YjMuLjBmZjM2YzUgMTAwNjQ0Ci0tLSBhL2NwdS9hcm05MjB0L3MzYzI0eDAvTWFrZWZpbGUKKysrIGIvY3B1L2FybTkyMHQvczNjMjR4MC9NYWtlZmlsZQpAQCAtMjYsNyArMjYsNyBAQAogTElCCT0gJChvYmopbGliJChTT0MpLmEKIAogQ09CSlMJPSBpMmMubyBpbnRlcnJ1cHRzLm8gc2VyaWFsLm8gc3BlZWQubyBcCi0JICB1c2Jfb2hjaS5vCisJICB1c2IubwogCiBTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L3MzYzI0eDAvdXNiLmMgYi9jcHUvYXJtOTIwdC9zM2MyNHgwL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWQ1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTIwdC9zM2MyNHgwL3VzYi5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPG1rQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfTkVXKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkKKyMgaWYgZGVmaW5lZChDT05GSUdfUzNDMjQwMCkgfHwgZGVmaW5lZChDT05GSUdfUzNDMjQxMCkKKworI2lmIGRlZmluZWQoQ09ORklHX1MzQzI0MDApCisjIGluY2x1ZGUgPHMzYzI0MDAuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX1MzQzI0MTApCisjIGluY2x1ZGUgPHMzYzI0MTAuaD4KKyNlbmRpZgorCitpbnQgdXNiX2NwdV9pbml0ICh2b2lkKQoreworCisJUzNDMjRYMF9DTE9DS19QT1dFUiAqIGNvbnN0IGNsa19wb3dlciA9IFMzQzI0WDBfR2V0QmFzZV9DTE9DS19QT1dFUigpOworCVMzQzI0WDBfR1BJTyAqIGNvbnN0IGdwaW8gPSBTM0MyNFgwX0dldEJhc2VfR1BJTygpOworCisJLyoKKwkgKiBTZXQgdGhlIDQ4IE1IeiBVUExMIGNsb2NraW5nLiBWYWx1ZXMgYXJlIHRha2VuIGZyb20KKwkgKiAiUExMIHZhbHVlIHNlbGVjdGlvbiBndWlkZSIsIDYtMjMsIHMzYzI0MDBfVU0ucGRmLgorCSAqLworCWNsa19wb3dlci0+VVBMTENPTiA9ICgoNDAgPDwgMTIpICsgKDEgPDwgNCkgKyAyKTsKKwlncGlvLT5NSVNDQ1IgfD0gMHg4OyAvKiAxID0gdXNlIHBhZHMgcmVsYXRlZCBVU0IgZm9yIFVTQiBob3N0ICovCisKKwkvKgorCSAqIEVuYWJsZSBVU0IgaG9zdCBjbG9jay4KKwkgKi8KKwljbGtfcG93ZXItPkNMS0NPTiB8PSAoMSA8PCA0KTsKKworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9zdG9wICh2b2lkKQoreworCVMzQzI0WDBfQ0xPQ0tfUE9XRVIgKiBjb25zdCBjbGtfcG93ZXIgPSBTM0MyNFgwX0dldEJhc2VfQ0xPQ0tfUE9XRVIoKTsKKwkvKiBtYXkgbm90IHdhbnQgdG8gZG8gdGhpcyAqLworCWNsa19wb3dlci0+Q0xLQ09OICY9IH4oMSA8PCA0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfaW5pdF9mYWlsICh2b2lkKQoreworCVMzQzI0WDBfQ0xPQ0tfUE9XRVIgKiBjb25zdCBjbGtfcG93ZXIgPSBTM0MyNFgwX0dldEJhc2VfQ0xPQ0tfUE9XRVIoKTsKKwljbGtfcG93ZXItPkNMS0NPTiAmPSB+KDEgPDwgNCk7CisJcmV0dXJuIDA7Cit9CisKKyMgZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUzNDMjQwMCkgfHwgZGVmaW5lZChDT05GSUdfUzNDMjQxMCkgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9zdGFydC5TIGIvY3B1L2FybTkyMHQvc3RhcnQuUwppbmRleCAzNDZmMGQwLi5iOWMzNjRiIDEwMDY0NAotLS0gYS9jcHUvYXJtOTIwdC9zdGFydC5TCisrKyBiL2NwdS9hcm05MjB0L3N0YXJ0LlMKQEAgLTI3LDcgKzI3LDkgQEAKIAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPHZlcnNpb24uaD4KLQorI2lmCWRlZmluZWQoQ09ORklHX0FUOTFSTTkyMDBESykgfHwgZGVmaW5lZChDT05GSUdfQVQ5MVJNOTIwMEVLKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxUk05MjAwREYpCisjaW5jbHVkZQk8bGVkLmg+CisjZW5kaWYKIAogLyoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTYsNiArMTE4LDY5IEBACiAJb3JyCXIwLHIwLCMweGQzCiAJbXNyCWNwc3IscjAKIAorI2lmCUNPTkZJR19BVDkxUk05MjAwCisjaWYJZGVmaW5lZChDT05GSUdfQVQ5MVJNOTIwMERLKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxUk05MjAwRUspIHx8IGRlZmluZWQoQ09ORklHX0FUOTFSTTkyMDBERikKKwlibCBMRURfaW5pdAorCWJsIHJlZF9MRURfb24KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JPT1RCSU5GVU5DCisvKiBjb2RlIGJhc2VkIG9uIGVudHJ5LlMgZnJvbSBBVE1FTCAqLworI2RlZmluZSBBVDkxQ19CQVNFX0NLR1IgMHhGRkZGRkMyMAorI2RlZmluZSBDS0dSX01PUiAwCisJLyogR2V0IHRoZSBDS0dSIEJhc2UgQWRkcmVzcyAqLworCWxkciAgICAgcjEsID1BVDkxQ19CQVNFX0NLR1IKKworLyogTWFpbiBvc2NpbGxhdG9yIEVuYWJsZSByZWdpc3RlcglBUE1DX01PUiA6IEVuYWJsZSBtYWluIG9zY2lsbGF0b3IgLCBPU0NPVU5UID0gMHhGRiAqLworLyoJbGRyIAlyMCwgPSBBVDkxQ19DS0dSX01PU0NFTjpPUjpBVDkxQ19DS0dSX09TQ09VTlQgKi8KKwlsZHIgCXIwLCA9MHgwMDAwRkYwMQorCXN0ciAgICAgcjAsIFtyMSwgI0NLR1JfTU9SXQorCS8qIEFkZCBsb29wIHRvIGNvbXBlbnNhdGUgTWFpbiBPc2NpbGxhdG9yIHN0YXJ0dXAgdGltZSAqLworCWxkciAJcjAsID0weDAwMDAwMDEwCitMb29wT3NjOgorCXN1YnMgICAgcjAsIHIwLCAjMQorCWJoaSAgICAgTG9vcE9zYworCS8qIHNjcmF0Y2ggc3RhY2sgKi8KKwlsZHIgCXIxLCA9MHgwMDIwNDAwMAorCS8qIEluc3VyZSB3b3JkIGFsaWdubWVudCAqLworCWJpYyAgICAgcjEsIHIxLCAjMworCS8qIEluaXQgc3RhY2sgU1lTCSAqLworCW1vdiAgICAgc3AsIHIxCisJLyoKKwkgKiBUaGlzIGRvZXMgYSBsb3QgbW9yZSB0aGFuIGp1c3Qgc2V0IHVwIHRoZSBtZW1vcnksIHdoaWNoCisJICogaXMgd2h5IGl0J3MgY2FsbGVkIGxvd2xldmVsaW5pdAorCSAqLworCWJsCWxvd2xldmVsaW5pdCAvKiBpbiBtZW1zZXR1cC5TICovCisJYmwJaWNhY2hlX2VuYWJsZTsKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBSZWFkL21vZGlmeS93cml0ZSBDUDE1IGNvbnRyb2wgcmVnaXN0ZXIKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogcmVhZCBjcDE1IGNvbnRyb2wgcmVnaXN0ZXIgKGNwMTUgcjEpIGluIHIwCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisJbXJjICAgICBwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKwkvKiBSZXNldCBiaXQgOkxpdHRsZSBFbmRpYW4gZW5kIGZhc3QgYnVzIG1vZGUgKi8KKwlsZHIgICAgIHIzLCA9MHhDMDAwMDA4MAorCS8qIFNldCBiaXQgOkFzeW5jaHJvbm91cyBjbG9jayBtb2RlLCBOb3QgRmFzdCBCdXMgKi8KKwlsZHIgICAgIHI0LCA9MHhDMDAwMDAwMAorCWJpYyAgICAgcjAsIHIwLCByMworCW9yciAgICAgcjAsIHIwLCByNAorCS8qIHdyaXRlIHIwIGluIGNwMTUgY29udHJvbCByZWdpc3RlciAoY3AxNSByMSkgKi8KKwltY3IgICAgIHAxNSwgMCwgcjAsIGMxLCBjMCwgMAorI2VuZGlmIC8qIENPTkZJR19CT09UQklORlVOQyAqLworCS8qCisJICogcmVsb2NhdGUgZXhlY2VwdGlvbiB0YWJsZQorCSAqLworCWxkcglyMCwgPV9zdGFydAorCWxkcglyMSwgPTB4MAorCW1vdglyMiwgIzE2Citjb3B5ZXg6CisJc3VicwlyMiwgcjIsICMxCisJbGRyCXIzLCBbcjBdLCAjNAorCXN0cglyMywgW3IxXSwgIzQKKwlibmUJY29weWV4CisjZW5kaWYKKwogLyogdHVybiBvZmYgdGhlIHdhdGNoZG9nICovCiAjaWYgZGVmaW5lZChDT05GSUdfUzNDMjQwMCkKICMgZGVmaW5lIHBXVENPTgkJMHgxNTMwMDAwMApAQCAtMTYwLDYgKzIyNSwyNiBAQAogCWJsCWNwdV9pbml0X2NyaXQKICNlbmRpZgogCisjaWZkZWYJQ09ORklHX0FUOTFSTTkyMDAKKyNpZmRlZiBDT05GSUdfQk9PVEJJTkZVTkMKK3JlbG9jYXRlOgkJCQkvKiByZWxvY2F0ZSBVLUJvb3QgdG8gUkFNCSAgICAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgICAgIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIGRvbid0IHJlbG9jIGR1cmluZyBkZWJ1ZyAgICAgICAgICovCisJYmVxICAgICBzdGFja19zZXR1cAorCisJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAorCWxkcglyMywgX2Jzc19zdGFydAorCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLworCWFkZAlyMiwgcjAsIHIyCQkvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCitjb3B5X2xvb3A6CisJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlZWUgW3IyXSAgICAqLworCWJsZQljb3B5X2xvb3AKKyNlbmRpZiAvKiBDT05GSUdfQk9PVEJJTkZVTkMgKi8KKyNlbHNlCiAjaWZuZGVmIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCiByZWxvY2F0ZToJCQkJLyogcmVsb2NhdGUgVS1Cb290IHRvIFJBTQkgICAgKi8KIAlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KQEAgLTE3OCw3ICsyNjMsNyBAQAogCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlZWUgW3IyXSAgICAqLwogCWJsZQljb3B5X2xvb3AKICNlbmRpZgkvKiBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVCAqLwotCisjZW5kaWYKIAkvKiBTZXQgdXAgdGhlIHN0YWNrCQkJCQkJICAgICovCiBzdGFja19zZXR1cDoKIAlsZHIJcjAsIF9URVhUX0JBU0UJCS8qIHVwcGVyIDEyOCBLaUI6IHJlbG9jYXRlZCB1Ym9vdCAgICovCkBAIC0yNjIsNyArMzQ3LDExIEBACiAJICogZmluZCBhIGxvd2xldmVsX2luaXQuUyBpbiB5b3VyIGJvYXJkIGRpcmVjdG9yeS4KIAkgKi8KIAltb3YJaXAsIGxyCisjaWYJZGVmaW5lZChDT05GSUdfQVQ5MVJNOTIwMERLKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxUk05MjAwRUspIHx8IGRlZmluZWQoQ09ORklHX0FUOTFSTTkyMDBERikKKworI2Vsc2UKIAlibAlsb3dsZXZlbF9pbml0CisjZW5kaWYKIAltb3YJbHIsIGlwCiAJbW92CXBjLCBscgogI2VuZGlmIC8qIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9NYWtlZmlsZSBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjc3ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL01ha2VmaWxlCkBAIC0wLDAgKzEsNDkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChTT0MpLmEKKworQ09CSlMJPSB0aW1lci5vIGV0aGVyLm8gbHh0OTcyLm8gZHA4Mzg0OC5vIGkyYy5vIG5hbmQubworU09CSlMJPSBsb3dsZXZlbF9pbml0Lm8gcmVzZXQubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSAkKFNPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9kcDgzODQ4LmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvZHA4Mzg0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTk4NDUKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvZHA4Mzg0OC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODQ4IFBIWSBEcml2ZXIgZm9yIFRJIERhVmluY2kKKyAqIChUTVMzMjBETTY0NHgpIGJhc2VkIGJvYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8ZHA4Mzg0OC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2VtYWNfZGVmcy5oPgorCisjaWZkZWYgQ09ORklHX0RSSVZFUl9USV9FTUFDCisKKyNpZmRlZiBDT05GSUdfQ01EX05FVAorCitpbnQgZHA4Mzg0OF9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJaWQxLCBpZDI7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfUEhZSUQxX1JFRywgJmlkMSkpCisJCXJldHVybigwKTsKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfUEhZSUQyX1JFRywgJmlkMikpCisJCXJldHVybigwKTsKKworCWlmICgoaWQxID09IERQODM4NDhfUEhZSUQxX09VSSkgJiYgKGlkMiA9PSBEUDgzODQ4X1BIWUlEMl9PVUkpKQorCQlyZXR1cm4oMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkcDgzODQ4X2dldF9saW5rX3NwZWVkKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJCXRtcDsKKwl2b2xhdGlsZSBlbWFjX3JlZ3MqCWVtYWMgPSAoZW1hY19yZWdzICopRU1BQ19CQVNFX0FERFI7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfU1RBVF9SRUcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwlpZiAoISh0bXAgJiBEUDgzODQ4X0xJTktfU1RBVFVTKSkJLyogbGluayB1cD8gKi8KKwkJcmV0dXJuKDApOworCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBEUDgzODQ4X1BIWV9TVEFUX1JFRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCS8qIFNwZWVkIGRvZXNuJ3QgbWF0dGVyLCB0aGVyZSBpcyBubyBzZXR0aW5nIGZvciBpdCBpbiBFTUFDLi4uICovCisJaWYgKHRtcCAmIERQODM4NDhfU1BFRUQpIHsKKwkJaWYgKHRtcCAmIERQODM4NDhfRFVQTEVYKSB7CisJCQkvKiBzZXQgRE02NDR4IEVNQUMgZm9yIEZ1bGwgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEUgfCBFTUFDX01BQ0NPTlRST0xfRlVMTERVUExFWF9FTkFCTEU7CisJCX0gZWxzZSB7CisJCQkvKnNldCBETTY0NHggRU1BQyBmb3IgSGFsZiBEdXBsZXggICovCisJCQllbWFjLT5NQUNDT05UUk9MID0gRU1BQ19NQUNDT05UUk9MX01JSUVOX0VOQUJMRTsKKwkJfQorCisJCXJldHVybigxKTsKKwl9IGVsc2UgeworCQlpZiAodG1wICYgRFA4Mzg0OF9EVVBMRVgpIHsKKwkJCS8qIHNldCBETTY0NHggRU1BQyBmb3IgRnVsbCBEdXBsZXggICovCisJCQllbWFjLT5NQUNDT05UUk9MID0gRU1BQ19NQUNDT05UUk9MX01JSUVOX0VOQUJMRSB8IEVNQUNfTUFDQ09OVFJPTF9GVUxMRFVQTEVYX0VOQUJMRTsKKwkJfSBlbHNlIHsKKwkJCS8qc2V0IERNNjQ0eCBFTUFDIGZvciBIYWxmIER1cGxleCAgKi8KKwkJCWVtYWMtPk1BQ0NPTlRST0wgPSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFOworCQl9CisKKwkJcmV0dXJuKDEpOworCX0KKworCXJldHVybigwKTsKK30KKworCitpbnQgZHA4Mzg0OF9pbml0X3BoeShpbnQgcGh5X2FkZHIpCit7CisJaW50CXJldCA9IDE7CisKKwlpZiAoIWRwODM4NDhfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKSB7CisJCS8qIFRyeSBhbm90aGVyIHRpbWUgKi8KKwkJdWRlbGF5KDEwMDAwMCk7CisJCXJldCA9IGRwODM4NDhfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpOworCX0KKworCS8qIERpc2FibGUgUEhZIEludGVycnVwdHMgKi8KKwlkbTY0NHhfZXRoX3BoeV93cml0ZShwaHlfYWRkciwgRFA4Mzg0OF9QSFlfSU5UUl9DVFJMX1JFRywgMCk7CisKKwlyZXR1cm4ocmV0KTsKK30KKworCitpbnQgZHA4Mzg0OF9hdXRvX25lZ290aWF0ZShpbnQgcGh5X2FkZHIpCit7CisJdV9pbnQxNl90CXRtcDsKKworCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwkvKiBSZXN0YXJ0IEF1dG9fbmVnb3RpYXRpb24gICovCisJdG1wICY9IH5EUDgzODQ4X0FVVE9ORUc7CS8qIHJlbW92ZSBhdXRvbmVnb3RpYXRpb24gZW5hYmxlICovCisJdG1wIHw9IERQODM4NDhfSVNPTEFURTsJCS8qIEVsZWN0cmljYWxseSBpc29sYXRlIFBIWSAqLworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsIHRtcCk7CisKKwkvKiBTZXQgdGhlIEF1dG9fbmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCBSZWdpc3RlcgorCSAqIE1JSSBhZHZlcnRpc2luZyBmb3IgTmV4dCBwYWdlLCAxMDBCYXNlVHhGRCBhbmQgSEQsCisJICogMTBCYXNlVEZEIGFuZCBIRCwgSUVFRSA4MDIuMworCSAqLworCXRtcCA9IERQODM4NDhfTlAgfCBEUDgzODQ4X1RYX0ZEWCB8IERQODM4NDhfVFhfSERYIHwKKwkgCURQODM4NDhfMTBfRkRYIHwgRFA4Mzg0OF8xMF9IRFggfCBEUDgzODQ4X0FOX0lFRUVfODAyXzM7CisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIERQODM4NDhfQU5BX1JFRywgdG1wKTsKKworCisJLyogUmVhZCBDb250cm9sIFJlZ2lzdGVyICovCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwl0bXAgfD0gRFA4Mzg0OF9TUEVFRF9TRUxFQ1QgfCBEUDgzODQ4X0FVVE9ORUcgfCBEUDgzODQ4X0RVUExFWF9NT0RFOworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsIHRtcCk7CisKKwkvKiBSZXN0YXJ0IEF1dG9fbmVnb3RpYXRpb24gICovCisJdG1wIHw9IERQODM4NDhfUkVTVEFSVF9BVVRPTkVHOworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsIHRtcCk7CisKKwkvKmNoZWNrIEF1dG9OZWdvdGlhdGUgY29tcGxldGUgKi8KKwl1ZGVsYXkoMTAwMDApOworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgRFA4Mzg0OF9TVEFUX1JFRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCWlmICghKHRtcCAmIERQODM4NDhfQVVUT05FR19DT01QKSkKKwkJcmV0dXJuKDApOworCisJcmV0dXJuIChkcDgzODQ4X2dldF9saW5rX3NwZWVkKHBoeV9hZGRyKSk7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfQ01EX05FVCAqLworCisjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2V0aGVyLmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvZXRoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjZiYzdkCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2V0aGVyLmMKQEAgLTAsMCArMSw2NTAgQEAKKy8qCisgKiBFdGhlcm5ldCBkcml2ZXIgZm9yIFRJIFRNUzMyMERNNjQ0eCAoRGFWaW5jaSkgY2hpcHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFBhcnRzIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIFRJJ3MgZG02NDR4X2VtYWMuYy4gT3JpZ2luYWwgY29weXJpZ2h0CisgKiBmb2xsb3dzOgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBkbTY0NHhfZW1hYy5jCisgKgorICogVEkgRGFWaW5jaSAoRE02NDRYKSBFTUFDIHBlcmlwaGVyYWwgZHJpdmVyIHNvdXJjZSBmb3IgRFYtRVZNCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogTW9kaWZpY2F0aW9uczoKKyAqIHZlci4gMS4wOiBTZXAgMjAwNSwgQW5hbnQgR29sZSAtIENyZWF0ZWQgRU1BQyB2ZXJzaW9uIGZvciB1Qm9vdC4KKyAqIHZlciAgMS4xOiBOb3YgMjAwNSwgQW5hbnQgR29sZSAtIEV4dGVuZGVkIHRoZSBSWCBsb2dpYyBmb3IgbXVsdGlwbGUgZGVzY3JpcHRvcnMKKyAqCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8bWlpcGh5Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1hY19kZWZzLmg+CisKKyNpZmRlZiBDT05GSUdfRFJJVkVSX1RJX0VNQUMKKworI2lmZGVmIENPTkZJR19DTURfTkVUCisKK3Vuc2lnbmVkIGludAllbWFjX2RiZyA9IDA7CisjZGVmaW5lIGRlYnVnX2VtYWMoZm10LGFyZ3MuLi4pCWlmIChlbWFjX2RiZykgcHJpbnRmKGZtdCwjI2FyZ3MpCisKKy8qIEludGVybmFsIHN0YXRpYyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9od19pbml0ICh2b2lkKTsKK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9vcGVuICh2b2lkKTsKK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9jbG9zZSAodm9pZCk7CitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfc2VuZF9wYWNrZXQgKHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfcmN2X3BhY2tldCAodm9pZCk7CitzdGF0aWMgdm9pZCBkbTY0NHhfZXRoX21kaW9fZW5hYmxlKHZvaWQpOworCitzdGF0aWMgaW50IGdlbl9pbml0X3BoeShpbnQgcGh5X2FkZHIpOworc3RhdGljIGludCBnZW5faXNfcGh5X2Nvbm5lY3RlZChpbnQgcGh5X2FkZHIpOworc3RhdGljIGludCBnZW5fZ2V0X2xpbmtfc3BlZWQoaW50IHBoeV9hZGRyKTsKK3N0YXRpYyBpbnQgZ2VuX2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcik7CisKKy8qIFdyYXBwZXJzIGV4cG9ydGVkIHRvIHRoZSBVLUJvb3QgcHJvcGVyICovCitpbnQgZXRoX2h3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4oZG02NDR4X2V0aF9od19pbml0KCkpOworfQorCitpbnQgZXRoX2luaXQoYmRfdCAqIGJkKQoreworCXJldHVybihkbTY0NHhfZXRoX29wZW4oKSk7Cit9CisKK3ZvaWQgZXRoX2hhbHQodm9pZCkKK3sKKwlkbTY0NHhfZXRoX2Nsb3NlKCk7Cit9CisKK2ludCBldGhfc2VuZCh2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisJcmV0dXJuKGRtNjQ0eF9ldGhfc2VuZF9wYWNrZXQocGFja2V0LCBsZW5ndGgpKTsKK30KKworaW50IGV0aF9yeCh2b2lkKQoreworCXJldHVybihkbTY0NHhfZXRoX3Jjdl9wYWNrZXQoKSk7Cit9CisKK3ZvaWQgZXRoX21kaW9fZW5hYmxlKHZvaWQpCit7CisJZG02NDR4X2V0aF9tZGlvX2VuYWJsZSgpOworfQorLyogRW5kIG9mIHdyYXBwZXJzICovCisKKworc3RhdGljIHVfaW50OF90IGRtNjQ0eF9ldGhfbWFjX2FkZHJbXSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZW1hY19vcGVuKCkgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKKyAqIHRoZSBkZWZhdWx0IG1hYyBhZGRyZXNzLgorICovCit2b2lkIGRtNjQ0eF9ldGhfc2V0X21hY19hZGRyKGNvbnN0IHVfaW50OF90ICphZGRyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZG02NDR4X2V0aF9tYWNfYWRkcik7IGkrKykgeworCQlkbTY0NHhfZXRoX21hY19hZGRyW2ldID0gYWRkcltpXTsKKwl9Cit9CisKKy8qIEVNQUMgQWRkcmVzc2VzICovCitzdGF0aWMgdm9sYXRpbGUgZW1hY19yZWdzCSphZGFwX2VtYWMgPSAoZW1hY19yZWdzICopRU1BQ19CQVNFX0FERFI7CitzdGF0aWMgdm9sYXRpbGUgZXdyYXBfcmVncwkqYWRhcF9ld3JhcCA9IChld3JhcF9yZWdzICopRU1BQ19XUkFQUEVSX0JBU0VfQUREUjsKK3N0YXRpYyB2b2xhdGlsZSBtZGlvX3JlZ3MJKmFkYXBfbWRpbyA9IChtZGlvX3JlZ3MgKilFTUFDX01ESU9fQkFTRV9BRERSOworCisvKiBFTUFDIGRlc2NyaXB0b3JzICovCitzdGF0aWMgdm9sYXRpbGUgZW1hY19kZXNjCSplbWFjX3J4X2Rlc2MgPSAoZW1hY19kZXNjICopKEVNQUNfV1JBUFBFUl9SQU1fQUREUiArIEVNQUNfUlhfREVTQ19CQVNFKTsKK3N0YXRpYyB2b2xhdGlsZSBlbWFjX2Rlc2MJKmVtYWNfdHhfZGVzYyA9IChlbWFjX2Rlc2MgKikoRU1BQ19XUkFQUEVSX1JBTV9BRERSICsgRU1BQ19UWF9ERVNDX0JBU0UpOworc3RhdGljIHZvbGF0aWxlIGVtYWNfZGVzYwkqZW1hY19yeF9hY3RpdmVfaGVhZCA9IDA7CitzdGF0aWMgdm9sYXRpbGUgZW1hY19kZXNjCSplbWFjX3J4X2FjdGl2ZV90YWlsID0gMDsKK3N0YXRpYyBpbnQJCQllbWFjX3J4X3F1ZXVlX2FjdGl2ZSA9IDA7CisKKy8qIFJlY2VpdmUgcGFja2V0IGJ1ZmZlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyCQllbWFjX3J4X2J1ZmZlcnNbRU1BQ19NQVhfUlhfQlVGRkVSUyAqIChFTUFDX01BWF9FVEhFUk5FVF9QS1RfU0laRSArIEVNQUNfUEtUX0FMSUdOKV07CisKKy8qIFBIWSBhZGRyZXNzIGZvciBhIGRpc2NvdmVyZWQgUEhZICgweGZmIC0gbm90IGZvdW5kKSAqLworc3RhdGljIHZvbGF0aWxlIHVfaW50OF90CWFjdGl2ZV9waHlfYWRkciA9IDB4ZmY7CisKK3BoeV90CQkJCXBoeTsKKworc3RhdGljIHZvaWQgZG02NDR4X2V0aF9tZGlvX2VuYWJsZSh2b2lkKQoreworCXVfaW50MzJfdAljbGtkaXY7CisKKwljbGtkaXYgPSAoRU1BQ19NRElPX0JVU19GUkVRIC8gRU1BQ19NRElPX0NMT0NLX0ZSRVEpIC0gMTsKKworCWFkYXBfbWRpby0+Q09OVFJPTCA9IChjbGtkaXYgJiAweGZmKSB8CisJCU1ESU9fQ09OVFJPTF9FTkFCTEUgfAorCQlNRElPX0NPTlRST0xfRkFVTFQgfAorCQlNRElPX0NPTlRST0xfRkFVTFRfRU5BQkxFOworCisJd2hpbGUgKGFkYXBfbWRpby0+Q09OVFJPTCAmIE1ESU9fQ09OVFJPTF9JRExFKSB7O30KK30KKworLyoKKyAqIFRyaWVzIHRvIGZpbmQgYW4gYWN0aXZlIGNvbm5lY3RlZCBQSFkuIFJldHVybnMgMSBpZiBhZGRyZXNzIGlmIGZvdW5kLgorICogSWYgbm8gYWN0aXZlIFBIWSAob3IgbW9yZSB0aGFuIG9uZSBQSFkpIGZvdW5kIHJldHVybnMgMC4KKyAqIFNldHMgYWN0aXZlX3BoeV9hZGRyIHZhcmlhYmxlLgorICovCitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfcGh5X2RldGVjdCh2b2lkKQoreworCXVfaW50MzJfdAlwaHlfYWN0X3N0YXRlOworCWludAkJaTsKKworCWFjdGl2ZV9waHlfYWRkciA9IDB4ZmY7CisKKwlpZiAoKHBoeV9hY3Rfc3RhdGUgPSBhZGFwX21kaW8tPkFMSVZFKSA9PSAwKQorCQlyZXR1cm4oMCk7CQkJCS8qIE5vIGFjdGl2ZSBQSFlzICovCisKKwlkZWJ1Z19lbWFjKCJkbTY0NHhfZXRoX3BoeV9kZXRlY3QoKSwgQUxJVkUgPSAweCUwOHhcbiIsIHBoeV9hY3Rfc3RhdGUpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKHBoeV9hY3Rfc3RhdGUgJiAoMSA8PCBpKSkgeworCQkJaWYgKHBoeV9hY3Rfc3RhdGUgJiB+KDEgPDwgaSkpCisJCQkJcmV0dXJuKDApOwkJLyogTW9yZSB0aGFuIG9uZSBQSFkgKi8KKwkJCWVsc2UgeworCQkJCWFjdGl2ZV9waHlfYWRkciA9IGk7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKDApOwkvKiBKdXN0IHRvIG1ha2UgR0NDIGhhcHB5ICovCit9CisKKworLyogUmVhZCBhIFBIWSByZWdpc3RlciB2aWEgTURJTyBpbnRlZmFjZS4gUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlICovCitpbnQgZG02NDR4X2V0aF9waHlfcmVhZCh1X2ludDhfdCBwaHlfYWRkciwgdV9pbnQ4X3QgcmVnX251bSwgdV9pbnQxNl90ICpkYXRhKQoreworCWludAl0bXA7CisKKwl3aGlsZSAoYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCAmIE1ESU9fVVNFUkFDQ0VTUzBfR08pIHs7fQorCisJYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCA9IE1ESU9fVVNFUkFDQ0VTUzBfR08gfAorCQkJCU1ESU9fVVNFUkFDQ0VTUzBfV1JJVEVfUkVBRCB8CisJCQkJKChyZWdfbnVtICYgMHgxZikgPDwgMjEpIHwKKwkJCQkoKHBoeV9hZGRyICYgMHgxZikgPDwgMTYpOworCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXdoaWxlICgodG1wID0gYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCkgJiBNRElPX1VTRVJBQ0NFU1MwX0dPKSB7O30KKworCWlmICh0bXAgJiBNRElPX1VTRVJBQ0NFU1MwX0FDSykgeworCQkqZGF0YSA9IHRtcCAmIDB4ZmZmZjsKKwkJcmV0dXJuKDEpOworCX0KKworCSpkYXRhID0gLTE7CisJcmV0dXJuKDApOworfQorCisvKiBXcml0ZSB0byBhIFBIWSByZWdpc3RlciB2aWEgTURJTyBpbnRlZmFjZS4gQmxvY2tzIHVudGlsIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gKi8KK2ludCBkbTY0NHhfZXRoX3BoeV93cml0ZSh1X2ludDhfdCBwaHlfYWRkciwgdV9pbnQ4X3QgcmVnX251bSwgdV9pbnQxNl90IGRhdGEpCit7CisKKwl3aGlsZSAoYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCAmIE1ESU9fVVNFUkFDQ0VTUzBfR08pIHs7fQorCisJYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCA9IE1ESU9fVVNFUkFDQ0VTUzBfR08gfAorCQkJCU1ESU9fVVNFUkFDQ0VTUzBfV1JJVEVfV1JJVEUgfAorCQkJCSgocmVnX251bSAmIDB4MWYpIDw8IDIxKSB8CisJCQkJKChwaHlfYWRkciAmIDB4MWYpIDw8IDE2KSB8CisJCQkJKGRhdGEgJiAweGZmZmYpOworCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXdoaWxlIChhZGFwX21kaW8tPlVTRVJBQ0NFU1MwICYgTURJT19VU0VSQUNDRVNTMF9HTykgezt9CisKKwlyZXR1cm4oMSk7Cit9CisKKy8qIFBIWSBmdW5jdGlvbnMgZm9yIGEgZ2VuZXJpYyBQSFkgKi8KK3N0YXRpYyBpbnQgZ2VuX2luaXRfcGh5KGludCBwaHlfYWRkcikKK3sKKwlpbnQJcmV0ID0gMTsKKworCWlmIChnZW5fZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKSB7CisJCS8qIFRyeSBhbm90aGVyIHRpbWUgKi8KKwkJcmV0ID0gZ2VuX2dldF9saW5rX3NwZWVkKHBoeV9hZGRyKTsKKwl9CisKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGludCBnZW5faXNfcGh5X2Nvbm5lY3RlZChpbnQgcGh5X2FkZHIpCit7CisJdV9pbnQxNl90CWR1bW15OworCisJcmV0dXJuKGRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9QSFlJRFIxLCAmZHVtbXkpKTsKK30KKworc3RhdGljIGludCBnZW5fZ2V0X2xpbmtfc3BlZWQoaW50IHBoeV9hZGRyKQoreworCXVfaW50MTZfdAl0bXA7CisKKwlpZiAoZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgTUlJX1NUQVRVU19SRUcsICZ0bXApICYmICh0bXAgJiAweDA0KSkKKwkJcmV0dXJuKDEpOworCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGdlbl9hdXRvX25lZ290aWF0ZShpbnQgcGh5X2FkZHIpCit7CisJdV9pbnQxNl90CXRtcDsKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0JNQ1IsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwkvKiBSZXN0YXJ0IEF1dG9fbmVnb3RpYXRpb24gICovCisJdG1wIHw9IFBIWV9CTUNSX0FVVE9OOworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBQSFlfQk1DUiwgdG1wKTsKKworCS8qY2hlY2sgQXV0b05lZ290aWF0ZSBjb21wbGV0ZSAqLworCXVkZWxheSAoMTAwMDApOworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0JNU1IsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwlpZiAoISh0bXAgJiBQSFlfQk1TUl9BVVROX0NPTVApKQorCQlyZXR1cm4oMCk7CisKKwlyZXR1cm4oZ2VuX2dldF9saW5rX3NwZWVkKHBoeV9hZGRyKSk7Cit9CisvKiBFbmQgb2YgZ2VuZXJpYyBQSFkgZnVuY3Rpb25zICovCisKKworI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKK3N0YXRpYyBpbnQgZG02NDR4X21paV9waHlfcmVhZChjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBzaG9ydCAqdmFsdWUpCit7CisJcmV0dXJuKGRtNjQ0eF9ldGhfcGh5X3JlYWQoYWRkciwgcmVnLCB2YWx1ZSkgPyAwIDogMSk7Cit9CisKK3N0YXRpYyBpbnQgZG02NDR4X21paV9waHlfd3JpdGUoY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJcmV0dXJuKGRtNjQ0eF9ldGhfcGh5X3dyaXRlKGFkZHIsIHJlZywgdmFsdWUpID8gMCA6IDEpOworfQorCitpbnQgZG02NDR4X2V0aF9taWlwaHlfaW5pdGlhbGl6ZShiZF90ICpiaXMpCit7CisJbWlpcGh5X3JlZ2lzdGVyKHBoeS5uYW1lLCBkbTY0NHhfbWlpX3BoeV9yZWFkLCBkbTY0NHhfbWlpX3BoeV93cml0ZSk7CisKKwlyZXR1cm4oMSk7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGVtYWMgaGFyZHdhcmUuIEl0IGRvZXMgTk9UIGluaXRpYWxpemUKKyAqIEVNQUMgbW9kdWxlcyBwb3dlciBvciBwaW4gbXVsdGlwbGV4b3JzLCB0aGF0IGlzIGRvbmUgYnkgYm9hcmRfaW5pdCgpCisgKiBtdWNoIGVhcmxpZXIgaW4gYm9vdHVwIHByb2Nlc3MuIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBkbTY0NHhfZXRoX2h3X2luaXQodm9pZCkKK3sKKwl1X2ludDMyX3QJcGh5X2lkOworCXVfaW50MTZfdAl0bXA7CisJaW50CQlpOworCisJZG02NDR4X2V0aF9tZGlvX2VuYWJsZSgpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmIChhZGFwX21kaW8tPkFMSVZFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPj0gMjU2KSB7CisJCXByaW50ZigiTm8gRVRIIFBIWSBkZXRlY3RlZCEhIVxuIik7CisJCXJldHVybigwKTsKKwl9CisKKwkvKiBGaW5kIGlmIGEgUEhZIGlzIGNvbm5lY3RlZCBhbmQgZ2V0IGl0J3MgYWRkcmVzcyAqLworCWlmICghZG02NDR4X2V0aF9waHlfZGV0ZWN0KCkpCisJCXJldHVybigwKTsKKworCS8qIEdldCBQSFkgSUQgYW5kIGluaXRpYWxpemUgcGh5X29wcyBmb3IgYSBkZXRlY3RlZCBQSFkgKi8KKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQoYWN0aXZlX3BoeV9hZGRyLCBQSFlfUEhZSURSMSwgJnRtcCkpIHsKKwkJYWN0aXZlX3BoeV9hZGRyID0gMHhmZjsKKwkJcmV0dXJuKDApOworCX0KKworCXBoeV9pZCA9ICh0bXAgPDwgMTYpICYgMHhmZmZmMDAwMDsKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChhY3RpdmVfcGh5X2FkZHIsIFBIWV9QSFlJRFIyLCAmdG1wKSkgeworCQlhY3RpdmVfcGh5X2FkZHIgPSAweGZmOworCQlyZXR1cm4oMCk7CisJfQorCisJcGh5X2lkIHw9IHRtcCAmIDB4MDAwMGZmZmY7CisKKwlzd2l0Y2ggKHBoeV9pZCkgeworCQljYXNlIFBIWV9MWFQ5NzI6CisJCQlzcHJpbnRmKHBoeS5uYW1lLCAiTFhUOTcyIEAgMHglMDJ4IiwgYWN0aXZlX3BoeV9hZGRyKTsKKwkJCXBoeS5pbml0ID0gbHh0OTcyX2luaXRfcGh5OworCQkJcGh5LmlzX3BoeV9jb25uZWN0ZWQgPSBseHQ5NzJfaXNfcGh5X2Nvbm5lY3RlZDsKKwkJCXBoeS5nZXRfbGlua19zcGVlZCA9IGx4dDk3Ml9nZXRfbGlua19zcGVlZDsKKwkJCXBoeS5hdXRvX25lZ290aWF0ZSA9IGx4dDk3Ml9hdXRvX25lZ290aWF0ZTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9EUDgzODQ4OgorCQkJc3ByaW50ZihwaHkubmFtZSwgIkRQODM4NDggQCAweCUwMngiLCBhY3RpdmVfcGh5X2FkZHIpOworCQkJcGh5LmluaXQgPSBkcDgzODQ4X2luaXRfcGh5OworCQkJcGh5LmlzX3BoeV9jb25uZWN0ZWQgPSBkcDgzODQ4X2lzX3BoeV9jb25uZWN0ZWQ7CisJCQlwaHkuZ2V0X2xpbmtfc3BlZWQgPSBkcDgzODQ4X2dldF9saW5rX3NwZWVkOworCQkJcGh5LmF1dG9fbmVnb3RpYXRlID0gZHA4Mzg0OF9hdXRvX25lZ290aWF0ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwaHkubmFtZSwgIkdFTkVSSUMgQCAweCUwMngiLCBhY3RpdmVfcGh5X2FkZHIpOworCQkJcGh5LmluaXQgPSBnZW5faW5pdF9waHk7CisJCQlwaHkuaXNfcGh5X2Nvbm5lY3RlZCA9IGdlbl9pc19waHlfY29ubmVjdGVkOworCQkJcGh5LmdldF9saW5rX3NwZWVkID0gZ2VuX2dldF9saW5rX3NwZWVkOworCQkJcGh5LmF1dG9fbmVnb3RpYXRlID0gZ2VuX2F1dG9fbmVnb3RpYXRlOworCX0KKworCXJldHVybigxKTsKK30KKworCisvKiBFdGggZGV2aWNlIG9wZW4gKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9vcGVuKHZvaWQpCit7CisJZHZfcmVnX3AJCWFkZHI7CisJdV9pbnQzMl90CQljbGtkaXYsIGNudDsKKwl2b2xhdGlsZSBlbWFjX2Rlc2MJKnJ4X2Rlc2M7CisKKwlkZWJ1Z19lbWFjKCIrIGVtYWNfb3BlblxuIik7CisKKwkvKiBSZXNldCBFTUFDIG1vZHVsZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzIGluIHdyYXBwZXIgKi8KKwlhZGFwX2VtYWMtPlNPRlRSRVNFVCA9IDE7CisJd2hpbGUgKGFkYXBfZW1hYy0+U09GVFJFU0VUICE9IDApIHs7fQorCWFkYXBfZXdyYXAtPkVXQ1RMID0gMDsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDU7IGNudCsrKSB7CisJCWNsa2RpdiA9IGFkYXBfZXdyYXAtPkVXQ1RMOworCX0KKworCXJ4X2Rlc2MgPSBlbWFjX3J4X2Rlc2M7CisKKwlhZGFwX2VtYWMtPlRYQ09OVFJPTCA9IDB4MDE7CisJYWRhcF9lbWFjLT5SWENPTlRST0wgPSAweDAxOworCisJLyogU2V0IE1BQyBBZGRyZXNzZXMgJiBJbml0IG11bHRpY2FzdCBIYXNoIHRvIDAgKGRpc2FibGUgYW55IG11bHRpY2FzdCByZWNlaXZlKSAqLworCS8qIFVzaW5nIGNoYW5uZWwgMCBvbmx5IC0gb3RoZXIgY2hhbm5lbHMgYXJlIGRpc2FibGVkICovCisJYWRhcF9lbWFjLT5NQUNJTkRFWCA9IDA7CisJYWRhcF9lbWFjLT5NQUNBRERSSEkgPQorCQkoZG02NDR4X2V0aF9tYWNfYWRkclszXSA8PCAyNCkgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclsyXSA8PCAxNikgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclsxXSA8PCA4KSAgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclswXSk7CisJYWRhcF9lbWFjLT5NQUNBRERSTE8gPQorCQkoZG02NDR4X2V0aF9tYWNfYWRkcls1XSA8PCA4KSB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzRdKTsKKworCWFkYXBfZW1hYy0+TUFDSEFTSDEgPSAwOworCWFkYXBfZW1hYy0+TUFDSEFTSDIgPSAwOworCisJLyogU2V0IHNvdXJjZSBNQUMgYWRkcmVzcyAtIFJFUVVJUkVEICovCisJYWRhcF9lbWFjLT5NQUNTUkNBRERSSEkgPQorCQkoZG02NDR4X2V0aF9tYWNfYWRkclszXSA8PCAyNCkgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclsyXSA8PCAxNikgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclsxXSA8PCA4KSAgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclswXSk7CisJYWRhcF9lbWFjLT5NQUNTUkNBRERSTE8gPQorCQkoZG02NDR4X2V0aF9tYWNfYWRkcls0XSA8PCA4KSB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzVdKTsKKworCS8qIFNldCBETUEgOCBUWCAvIDggUlggSGVhZCBwb2ludGVycyB0byAwICovCisJYWRkciA9ICZhZGFwX2VtYWMtPlRYMEhEUDsKKwlmb3IoY250ID0gMDsgY250IDwgMTY7IGNudCsrKQorCQkqYWRkcisrID0gMDsKKworCWFkZHIgPSAmYWRhcF9lbWFjLT5SWDBIRFA7CisJZm9yKGNudCA9IDA7IGNudCA8IDE2OyBjbnQrKykKKwkJKmFkZHIrKyA9IDA7CisKKwkvKiBDbGVhciBTdGF0aXN0aWNzIChkbyB0aGlzIGJlZm9yZSBzZXR0aW5nIE1hY0NvbnRyb2wgcmVnaXN0ZXIpICovCisJYWRkciA9ICZhZGFwX2VtYWMtPlJYR09PREZSQU1FUzsKKwlmb3IoY250ID0gMDsgY250IDwgRU1BQ19OVU1fU1RBVFM7IGNudCsrKQorCQkqYWRkcisrID0gMDsKKworCS8qIE5vIG11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJYWRhcF9lbWFjLT5NQUNIQVNIMSA9IDA7CisJYWRhcF9lbWFjLT5NQUNIQVNIMiA9IDA7CisKKwkvKiBDcmVhdGUgUlggcXVldWUgYW5kIHNldCByZWNlaXZlIHByb2Nlc3MgaW4gcGxhY2UgKi8KKwllbWFjX3J4X2FjdGl2ZV9oZWFkID0gZW1hY19yeF9kZXNjOworCWZvciAoY250ID0gMDsgY250IDwgRU1BQ19NQVhfUlhfQlVGRkVSUzsgY250KyspIHsKKwkJcnhfZGVzYy0+bmV4dCA9ICh1X2ludDMyX3QpKHJ4X2Rlc2MgKyAxKTsKKwkJcnhfZGVzYy0+YnVmZmVyID0gJmVtYWNfcnhfYnVmZmVyc1tjbnQgKiAoRU1BQ19NQVhfRVRIRVJORVRfUEtUX1NJWkUgKyBFTUFDX1BLVF9BTElHTildOworCQlyeF9kZXNjLT5idWZmX29mZl9sZW4gPSBFTUFDX01BWF9FVEhFUk5FVF9QS1RfU0laRTsKKwkJcnhfZGVzYy0+cGt0X2ZsYWdfbGVuID0gRU1BQ19DUFBJX09XTkVSU0hJUF9CSVQ7CisJCXJ4X2Rlc2MrKzsKKwl9CisKKwkvKiBTZXQgdGhlIGxhc3QgZGVzY3JpcHRvcidzICJuZXh0IiBwYXJhbWV0ZXIgdG8gMCB0byBlbmQgdGhlIFJYIGRlc2MgbGlzdCAqLworCXJ4X2Rlc2MtLTsKKwlyeF9kZXNjLT5uZXh0ID0gMDsKKwllbWFjX3J4X2FjdGl2ZV90YWlsID0gcnhfZGVzYzsKKwllbWFjX3J4X3F1ZXVlX2FjdGl2ZSA9IDE7CisKKwkvKiBFbmFibGUgVFgvUlggKi8KKwlhZGFwX2VtYWMtPlJYTUFYTEVOID0gRU1BQ19NQVhfRVRIRVJORVRfUEtUX1NJWkU7CisJYWRhcF9lbWFjLT5SWEJVRkZFUk9GRlNFVCA9IDA7CisKKwkvKiBObyBmYW5jeSBjb25maWdzIC0gVXNlIHRoaXMgZm9yIHByb21pc2NvdXMgZm9yIGRlYnVnIC0gRU1BQ19SWE1CUEVOQUJMRV9SWENBRkVOX0VOQUJMRSAqLworCWFkYXBfZW1hYy0+UlhNQlBFTkFCTEUgPSBFTUFDX1JYTUJQRU5BQkxFX1JYQlJPQURFTjsKKworCS8qIEVuYWJsZSBjaCAwIG9ubHkgKi8KKwlhZGFwX2VtYWMtPlJYVU5JQ0FTVFNFVCA9IDB4MDE7CisKKwkvKiBFbmFibGUgTUlJIGludGVyZmFjZSBhbmQgRnVsbCBkdXBsZXggbW9kZSAqLworCWFkYXBfZW1hYy0+TUFDQ09OVFJPTCA9IChFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFIHwgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFKTsKKworCS8qIEluaXQgTURJTyAmIGdldCBsaW5rIHN0YXRlICovCisJY2xrZGl2ID0gKEVNQUNfTURJT19CVVNfRlJFUSAvIEVNQUNfTURJT19DTE9DS19GUkVRKSAtIDE7CisJYWRhcF9tZGlvLT5DT05UUk9MID0gKChjbGtkaXYgJiAweGZmKSB8IE1ESU9fQ09OVFJPTF9FTkFCTEUgfCBNRElPX0NPTlRST0xfRkFVTFQpOworCisJaWYgKCFwaHkuZ2V0X2xpbmtfc3BlZWQoYWN0aXZlX3BoeV9hZGRyKSkKKwkJcmV0dXJuKDApOworCisJLyogU3RhcnQgcmVjZWl2ZSBwcm9jZXNzICovCisJYWRhcF9lbWFjLT5SWDBIRFAgPSAodV9pbnQzMl90KWVtYWNfcnhfZGVzYzsKKworCWRlYnVnX2VtYWMoIi0gZW1hY19vcGVuXG4iKTsKKworCXJldHVybigxKTsKK30KKworLyogRU1BQyBDaGFubmVsIFRlYXJkb3duICovCitzdGF0aWMgdm9pZCBkbTY0NHhfZXRoX2NoX3RlYXJkb3duKGludCBjaCkKK3sKKwlkdl9yZWcJCWRseSA9IDB4ZmY7CisJZHZfcmVnCQljbnQ7CisKKwlkZWJ1Z19lbWFjKCIrIGVtYWNfY2hfdGVhcmRvd25cbiIpOworCisJaWYgKGNoID09IEVNQUNfQ0hfVFgpIHsKKwkJLyogSW5pdCBUWCBjaGFubmVsIHRlYXJkb3duICovCisJCWFkYXBfZW1hYy0+VFhURUFSRE9XTiA9IDE7CisJCWZvcihjbnQgPSAwOyBjbnQgIT0gMHhmZmZmZmZmYzsgY250ID0gYWRhcF9lbWFjLT5UWDBDUCkgeworCQkJLyogV2FpdCBoZXJlIGZvciBUeCB0ZWFyZG93biBjb21wbGV0aW9uIGludGVycnVwdCB0byBvY2N1cgorCQkJICogTm90ZTogQSB0YXNrIGRlbGF5IGNhbiBiZSBjYWxsZWQgaGVyZSB0byBwZW5kIHJhdGhlciB0aGFuCisJCQkgKiBvY2N1cHlpbmcgQ1BVIGN5Y2xlcyAtIGFueXdheSBpdCBoYXMgYmVlbiBmb3VuZCB0aGF0IHRlYXJkb3duCisJCQkgKiB0YWtlcyB2ZXJ5IGZldyBjcHUgY3ljbGVzIGFuZCBkb2VzIG5vdCBhZmZlY3QgZnVuY3Rpb25hbGl0eSAqLworCQkJIGRseS0tOworCQkJIHVkZWxheSgxKTsKKwkJCSBpZiAoZGx5ID09IDApCisJCQkgCWJyZWFrOworCQl9CisJCWFkYXBfZW1hYy0+VFgwQ1AgPSBjbnQ7CisJCWFkYXBfZW1hYy0+VFgwSERQID0gMDsKKwl9IGVsc2UgeworCQkvKiBJbml0IFJYIGNoYW5uZWwgdGVhcmRvd24gKi8KKwkJYWRhcF9lbWFjLT5SWFRFQVJET1dOID0gMTsKKwkJZm9yKGNudCA9IDA7IGNudCAhPSAweGZmZmZmZmZjOyBjbnQgPSBhZGFwX2VtYWMtPlJYMENQKSB7CisJCQkvKiBXYWl0IGhlcmUgZm9yIFJ4IHRlYXJkb3duIGNvbXBsZXRpb24gaW50ZXJydXB0IHRvIG9jY3VyCisJCQkgKiBOb3RlOiBBIHRhc2sgZGVsYXkgY2FuIGJlIGNhbGxlZCBoZXJlIHRvIHBlbmQgcmF0aGVyIHRoYW4KKwkJCSAqIG9jY3VweWluZyBDUFUgY3ljbGVzIC0gYW55d2F5IGl0IGhhcyBiZWVuIGZvdW5kIHRoYXQgdGVhcmRvd24KKwkJCSAqIHRha2VzIHZlcnkgZmV3IGNwdSBjeWNsZXMgYW5kIGRvZXMgbm90IGFmZmVjdCBmdW5jdGlvbmFsaXR5ICovCisJCQkgZGx5LS07CisJCQkgdWRlbGF5KDEpOworCQkJIGlmIChkbHkgPT0gMCkKKwkJCSAJYnJlYWs7CisJCX0KKwkJYWRhcF9lbWFjLT5SWDBDUCA9IGNudDsKKwkJYWRhcF9lbWFjLT5SWDBIRFAgPSAwOworCX0KKworCWRlYnVnX2VtYWMoIi0gZW1hY19jaF90ZWFyZG93blxuIik7Cit9CisKKy8qIEV0aCBkZXZpY2UgY2xvc2UgKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9jbG9zZSh2b2lkKQoreworCWRlYnVnX2VtYWMoIisgZW1hY19jbG9zZVxuIik7CisKKwlkbTY0NHhfZXRoX2NoX3RlYXJkb3duKEVNQUNfQ0hfVFgpOwkvKiBUWCBDaGFubmVsIHRlYXJkb3duICovCisJZG02NDR4X2V0aF9jaF90ZWFyZG93bihFTUFDX0NIX1JYKTsJLyogUlggQ2hhbm5lbCB0ZWFyZG93biAqLworCisJLyogUmVzZXQgRU1BQyBtb2R1bGUgYW5kIGRpc2FibGUgaW50ZXJydXB0cyBpbiB3cmFwcGVyICovCisJYWRhcF9lbWFjLT5TT0ZUUkVTRVQgPSAxOworCWFkYXBfZXdyYXAtPkVXQ1RMID0gMDsKKworCWRlYnVnX2VtYWMoIi0gZW1hY19jbG9zZVxuIik7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50IHR4X3NlbmRfbG9vcCA9IDA7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc2luZ2xlIHBhY2tldCBvbiB0aGUgbmV0d29yayBhbmQgcmV0dXJucworICogcG9zaXRpdmUgbnVtYmVyIChudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQpIG9yIG5lZ2F0aXZlIGZvciBlcnJvcgorICovCitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfc2VuZF9wYWNrZXQodm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCWludCByZXRfc3RhdHVzID0gLTE7CisJdHhfc2VuZF9sb29wID0gMDsKKworCS8qIFJldHVybiBlcnJvciBpZiBubyBsaW5rICovCisJaWYgKCFwaHkuZ2V0X2xpbmtfc3BlZWQoYWN0aXZlX3BoeV9hZGRyKSkKKwl7CisJCXByaW50ZigiV0FSTjogZW1hY19zZW5kX3BhY2tldDogTm8gbGlua1xuIik7CisJCXJldHVybiAocmV0X3N0YXR1cyk7CisJfQorCisJLyogQ2hlY2sgcGFja2V0IHNpemUgYW5kIGlmIDwgRU1BQ19NSU5fRVRIRVJORVRfUEtUX1NJWkUsIHBhZCBpdCB1cCAqLworCWlmIChsZW5ndGggPCBFTUFDX01JTl9FVEhFUk5FVF9QS1RfU0laRSkKKwl7CisJCWxlbmd0aCA9IEVNQUNfTUlOX0VUSEVSTkVUX1BLVF9TSVpFOworCX0KKworCS8qIFBvcHVsYXRlIHRoZSBUWCBkZXNjcmlwdG9yICovCisJZW1hY190eF9kZXNjLT5uZXh0ICAgICAgICAgPSAwOworCWVtYWNfdHhfZGVzYy0+YnVmZmVyICAgICAgID0gKHVfaW50OF90ICopcGFja2V0OworCWVtYWNfdHhfZGVzYy0+YnVmZl9vZmZfbGVuID0gKGxlbmd0aCAmIDB4ZmZmZik7CisJZW1hY190eF9kZXNjLT5wa3RfZmxhZ19sZW4gPSAoKGxlbmd0aCAmIDB4ZmZmZikgfAorCQkJRU1BQ19DUFBJX1NPUF9CSVQgfAorCQkJRU1BQ19DUFBJX09XTkVSU0hJUF9CSVQgfAorCQkJRU1BQ19DUFBJX0VPUF9CSVQpOworCS8qIFNlbmQgdGhlIHBhY2tldCAqLworCWFkYXBfZW1hYy0+VFgwSERQID0gKHVuc2lnbmVkIGludCllbWFjX3R4X2Rlc2M7CisKKwkvKiBXYWl0IGZvciBwYWNrZXQgdG8gY29tcGxldGUgb3IgbGluayBkb3duICovCisJd2hpbGUgKDEpIHsKKwkgICAgICAgIGlmICghcGh5LmdldF9saW5rX3NwZWVkKGFjdGl2ZV9waHlfYWRkcikpIHsKKwkgICAgICAgIAlkbTY0NHhfZXRoX2NoX3RlYXJkb3duKEVNQUNfQ0hfVFgpOworCSAgICAgICAgCXJldHVybiAocmV0X3N0YXR1cyk7CisJICAgICAgICB9CisJICAgICAgICBpZiAoYWRhcF9lbWFjLT5UWElOVFNUQVRSQVcgJiAweDAxKSB7CisJICAgICAgICAJcmV0X3N0YXR1cyA9IGxlbmd0aDsKKwkgICAgICAgIAlicmVhazsKKwkJfQorCSAgICAgICAgdHhfc2VuZF9sb29wKys7CisJfQorCisJcmV0dXJuKHJldF9zdGF0dXMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlY2VpcHQgb2YgYSBwYWNrZXQgZnJvbSB0aGUgbmV0d29yaworICovCitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfcmN2X3BhY2tldCh2b2lkKQoreworCXZvbGF0aWxlIGVtYWNfZGVzYwkqcnhfY3Vycl9kZXNjOworCXZvbGF0aWxlIGVtYWNfZGVzYwkqY3Vycl9kZXNjOworCXZvbGF0aWxlIGVtYWNfZGVzYwkqdGFpbF9kZXNjOworCWludAkJCXN0YXR1cywgcmV0ID0gLTE7CisKKwlyeF9jdXJyX2Rlc2MgPSBlbWFjX3J4X2FjdGl2ZV9oZWFkOworCXN0YXR1cyA9IHJ4X2N1cnJfZGVzYy0+cGt0X2ZsYWdfbGVuOworCWlmICgocnhfY3Vycl9kZXNjKSAmJiAoKHN0YXR1cyAmIEVNQUNfQ1BQSV9PV05FUlNISVBfQklUKSA9PSAwKSkgeworCSAgICAgICAgaWYgKHN0YXR1cyAmIEVNQUNfQ1BQSV9SWF9FUlJPUl9GUkFNRSkgeworCSAgICAgICAgCS8qIEVycm9yIGluIHBhY2tldCAtIGRpc2NhcmQgaXQgYW5kIHJlcXVldWUgZGVzYyAqLworCSAgICAgICAgCXByaW50ZigiV0FSTjogZW1hY19yY3ZfcGt0OiBFcnJvciBpbiBwYWNrZXRcbiIpOworCQl9IGVsc2UgeworCQkJTmV0UmVjZWl2ZShyeF9jdXJyX2Rlc2MtPmJ1ZmZlciwgKHJ4X2N1cnJfZGVzYy0+YnVmZl9vZmZfbGVuICYgMHhmZmZmKSk7CisJCQlyZXQgPSByeF9jdXJyX2Rlc2MtPmJ1ZmZfb2ZmX2xlbiAmIDB4ZmZmZjsKKwkgICAgICAgIH0KKworCSAgICAgICAgLyogQWNrIHJlY2VpdmVkIHBhY2tldCBkZXNjcmlwdG9yICovCisJICAgICAgICBhZGFwX2VtYWMtPlJYMENQID0gKHVuc2lnbmVkIGludClyeF9jdXJyX2Rlc2M7CisJICAgICAgICBjdXJyX2Rlc2MgPSByeF9jdXJyX2Rlc2M7CisJICAgICAgICBlbWFjX3J4X2FjdGl2ZV9oZWFkID0gKHZvbGF0aWxlIGVtYWNfZGVzYyAqKXJ4X2N1cnJfZGVzYy0+bmV4dDsKKworCSAgICAgICAgaWYgKHN0YXR1cyAmIEVNQUNfQ1BQSV9FT1FfQklUKSB7CisJICAgICAgICAJaWYgKGVtYWNfcnhfYWN0aXZlX2hlYWQpIHsKKwkgICAgICAgIAkJYWRhcF9lbWFjLT5SWDBIRFAgPSAodW5zaWduZWQgaW50KWVtYWNfcnhfYWN0aXZlX2hlYWQ7CisJCQl9IGVsc2UgeworCQkJCWVtYWNfcnhfcXVldWVfYWN0aXZlID0gMDsKKwkJCQlwcmludGYoIklORk86ZW1hY19yY3ZfcGFja2V0OiBSWCBRdWV1ZSBub3QgYWN0aXZlXG4iKTsKKwkJCX0KKwkJfQorCisJCS8qIFJlY3ljbGUgUlggZGVzY3JpcHRvciAqLworCQlyeF9jdXJyX2Rlc2MtPmJ1ZmZfb2ZmX2xlbiA9IEVNQUNfTUFYX0VUSEVSTkVUX1BLVF9TSVpFOworCQlyeF9jdXJyX2Rlc2MtPnBrdF9mbGFnX2xlbiA9IEVNQUNfQ1BQSV9PV05FUlNISVBfQklUOworCQlyeF9jdXJyX2Rlc2MtPm5leHQgPSAwOworCisJCWlmIChlbWFjX3J4X2FjdGl2ZV9oZWFkID09IDApIHsKKwkJCXByaW50ZigiSU5GTzogZW1hY19yY3ZfcGt0OiBhY3RpdmUgcXVldWUgaGVhZCA9IDBcbiIpOworCQkJZW1hY19yeF9hY3RpdmVfaGVhZCA9IGN1cnJfZGVzYzsKKwkJCWVtYWNfcnhfYWN0aXZlX3RhaWwgPSBjdXJyX2Rlc2M7CisJCQlpZiAoZW1hY19yeF9xdWV1ZV9hY3RpdmUgIT0gMCkgeworCQkJCWFkYXBfZW1hYy0+UlgwSERQID0gKHVuc2lnbmVkIGludCllbWFjX3J4X2FjdGl2ZV9oZWFkOworCQkJCXByaW50ZigiSU5GTzogZW1hY19yY3ZfcGt0OiBhY3RpdmUgcXVldWUgaGVhZCA9IDAsIEhEUCBmaXJlZFxuIik7CisJCQkJZW1hY19yeF9xdWV1ZV9hY3RpdmUgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJdGFpbF9kZXNjID0gZW1hY19yeF9hY3RpdmVfdGFpbDsKKwkJCWVtYWNfcnhfYWN0aXZlX3RhaWwgPSBjdXJyX2Rlc2M7CisJCQl0YWlsX2Rlc2MtPm5leHQgPSAodW5zaWduZWQgaW50KWN1cnJfZGVzYzsKKwkJCXN0YXR1cyA9IHRhaWxfZGVzYy0+cGt0X2ZsYWdfbGVuOworCQkJaWYgKHN0YXR1cyAmIEVNQUNfQ1BQSV9FT1FfQklUKSB7CisJCQkJYWRhcF9lbWFjLT5SWDBIRFAgPSAodW5zaWduZWQgaW50KWN1cnJfZGVzYzsKKwkJCQlzdGF0dXMgJj0gfkVNQUNfQ1BQSV9FT1FfQklUOworCQkJCXRhaWxfZGVzYy0+cGt0X2ZsYWdfbGVuID0gc3RhdHVzOworCQkJfQorCQl9CisJCXJldHVybihyZXQpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQ01EX05FVCAqLworCisjZW5kaWYgLyogQ09ORklHX0RSSVZFUl9USV9FTUFDICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvaTJjLmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5ZGMwMwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9pMmMuYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIFRJIERhVmluY2kgKFRNUzMyMERNNjQ0eCkgSTJDIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfRFJJVkVSX0RBVklOQ0lfSTJDCisKKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2kyY19kZWZzLmg+CisKKyNkZWZpbmUgQ0hFQ0tfTkFDSygpIFwKKwlkbyB7XAorCQlpZiAodG1wICYgKEkyQ19USU1FT1VUIHwgSTJDX1NUQVRfTkFDSykpIHtcCisJCQlSRUcoSTJDX0NPTikgPSAwO1wKKwkJCXJldHVybigxKTtcCisJCX1cCisJfSB3aGlsZSAoMCkKKworCitzdGF0aWMgaW50IHdhaXRfZm9yX2J1cyh2b2lkKQoreworCWludAlzdGF0LCB0aW1lb3V0OworCisJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAxMDsgdGltZW91dCsrKSB7CisJCWlmICghKChzdGF0ID0gUkVHKEkyQ19TVEFUKSkgJiBJMkNfU1RBVF9CQikpIHsKKwkJCVJFRyhJMkNfU1RBVCkgPSAweGZmZmY7CisJCQlyZXR1cm4oMCk7CisJCX0KKworCQlSRUcoSTJDX1NUQVQpID0gc3RhdDsKKwkJdWRlbGF5KDUwMDAwKTsKKwl9CisKKwlSRUcoSTJDX1NUQVQpID0gMHhmZmZmOworCXJldHVybigxKTsKK30KKworCitzdGF0aWMgaW50IHBvbGxfaTJjX2lycShpbnQgbWFzaykKK3sKKwlpbnQJc3RhdCwgdGltZW91dDsKKworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAxMDsgdGltZW91dCsrKSB7CisJCXVkZWxheSgxMDAwKTsKKwkJc3RhdCA9IFJFRyhJMkNfU1RBVCk7CisJCWlmIChzdGF0ICYgbWFzaykgeworCQkJcmV0dXJuKHN0YXQpOworCQl9CisJfQorCisJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwlyZXR1cm4oc3RhdCB8IEkyQ19USU1FT1VUKTsKK30KKworCit2b2lkIGZsdXNoX3J4KHZvaWQpCit7CisJaW50CWR1bW15OworCisJd2hpbGUgKDEpIHsKKwkJaWYgKCEoUkVHKEkyQ19TVEFUKSAmIEkyQ19TVEFUX1JSRFkpKQorCQkJYnJlYWs7CisKKwkJZHVtbXkgPSBSRUcoSTJDX0RSUik7CisJCVJFRyhJMkNfU1RBVCkgPSBJMkNfU1RBVF9SUkRZOworCQl1ZGVsYXkoMTAwMCk7CisJfQorfQorCisKK3ZvaWQgaTJjX2luaXQoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGQpCit7CisJdV9pbnQzMl90CWRpdiwgcHNjOworCisJaWYgKFJFRyhJMkNfQ09OKSAmIEkyQ19DT05fRU4pIHsKKwkJUkVHKEkyQ19DT04pID0gMDsKKwkJdWRlbGF5ICg1MDAwMCk7CisJfQorCisJcHNjID0gMjsKKwlkaXYgPSAoQ0ZHX0haX0NMT0NLIC8gKChwc2MgKyAxKSAqIHNwZWVkKSkgLSAxMDsJLyogU0NMTCArIFNDTEggKi8KKwlSRUcoSTJDX1BTQykgPSBwc2M7CQkJLyogMjdNSHogLyAoMiArIDEpID0gOU1IeiAqLworCVJFRyhJMkNfU0NMTCkgPSAoZGl2ICogNTApIC8gMTAwOwkvKiA1MCUgRHV0eSAqLworCVJFRyhJMkNfU0NMSCkgPSBkaXYgLSBSRUcoSTJDX1NDTEwpOworCisJUkVHKEkyQ19PQSkgPSBzbGF2ZWFkZDsKKwlSRUcoSTJDX0NOVCkgPSAwOworCisJLyogSW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgb3IgSTJDIG1vZHVsZSB3b24ndCB3b3JrICovCisJUkVHKEkyQ19JRSkgPSBJMkNfSUVfU0NEX0lFIHwgSTJDX0lFX1hSRFlfSUUgfAorCQlJMkNfSUVfUlJEWV9JRSB8IEkyQ19JRV9BUkRZX0lFIHwgSTJDX0lFX05BQ0tfSUU7CisKKwkvKiBOb3cgZW5hYmxlIEkyQyBjb250cm9sbGVyIChnZXQgaXQgb3V0IG9mIHJlc2V0KSAqLworCVJFRyhJMkNfQ09OKSA9IEkyQ19DT05fRU47CisKKwl1ZGVsYXkoMTAwMCk7Cit9CisKKworaW50IGkyY19wcm9iZSh1X2ludDhfdCBjaGlwKQoreworCWludAlyYyA9IDE7CisKKwlpZiAoY2hpcCA9PSBSRUcoSTJDX09BKSkgeworCQlyZXR1cm4ocmMpOworCX0KKworCVJFRyhJMkNfQ09OKSA9IDA7CisJaWYgKHdhaXRfZm9yX2J1cygpKSB7cmV0dXJuKDEpO30KKworCS8qIHRyeSB0byByZWFkIG9uZSBieXRlIGZyb20gY3VycmVudCAob3Igb25seSkgYWRkcmVzcyAqLworCVJFRyhJMkNfQ05UKSA9IDE7CisJUkVHKEkyQ19TQSkgPSBjaGlwOworCVJFRyhJMkNfQ09OKSA9IChJMkNfQ09OX0VOIHwgSTJDX0NPTl9NU1QgfCBJMkNfQ09OX1NUVCB8IEkyQ19DT05fU1RQKTsKKwl1ZGVsYXkgKDUwMDAwKTsKKworCWlmICghKFJFRyhJMkNfU1RBVCkgJiBJMkNfU1RBVF9OQUNLKSkgeworCQlyYyA9IDA7CisJCWZsdXNoX3J4KCk7CisJCVJFRyhJMkNfU1RBVCkgPSAweGZmZmY7CisJfSBlbHNlIHsKKwkJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwkJUkVHKEkyQ19DT04pIHw9IEkyQ19DT05fU1RQOworCQl1ZGVsYXkoMjAwMDApOworCQlpZiAod2FpdF9mb3JfYnVzKCkpIHtyZXR1cm4oMSk7fQorCX0KKworCWZsdXNoX3J4KCk7CisJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwlSRUcoSTJDX0NOVCkgPSAwOworCXJldHVybihyYyk7Cit9CisKKworaW50IGkyY19yZWFkKHVfaW50OF90IGNoaXAsIHVfaW50MzJfdCBhZGRyLCBpbnQgYWxlbiwgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDMyX3QJdG1wOworCWludAkJaTsKKworCWlmICgoYWxlbiA8IDApIHx8IChhbGVuID4gMikpIHsKKwkJcHJpbnRmKCIlcygpOiBib2d1cyBhZGRyZXNzIGxlbmd0aCAleFxuIiwgX19GVU5DVElPTl9fLCBhbGVuKTsKKwkJcmV0dXJuKDEpOworCX0KKworCWlmICh3YWl0X2Zvcl9idXMoKSkge3JldHVybigxKTt9CisKKwlpZiAoYWxlbiAhPSAwKSB7CisJCS8qIFN0YXJ0IGFkZHJlc3MgcGhhc2UgKi8KKwkJdG1wID0gSTJDX0NPTl9FTiB8IEkyQ19DT05fTVNUIHwgSTJDX0NPTl9TVFQgfCBJMkNfQ09OX1RSWDsKKwkJUkVHKEkyQ19DTlQpID0gYWxlbjsKKwkJUkVHKEkyQ19TQSkgPSBjaGlwOworCQlSRUcoSTJDX0NPTikgPSB0bXA7CisKKwkJdG1wID0gcG9sbF9pMmNfaXJxKEkyQ19TVEFUX1hSRFkgfCBJMkNfU1RBVF9OQUNLKTsKKworCQlDSEVDS19OQUNLKCk7CisKKwkJc3dpdGNoIChhbGVuKSB7CisJCQljYXNlIDI6CisJCQkJLyogU2VuZCBhZGRyZXNzIE1TQnl0ZSAqLworCQkJCWlmICh0bXAgJiBJMkNfU1RBVF9YUkRZKSB7CisJCQkJCVJFRyhJMkNfRFhSKSA9IChhZGRyID4+IDgpICYgMHhmZjsKKwkJCQl9IGVsc2UgeworCQkJCQlSRUcoSTJDX0NPTikgPSAwOworCQkJCQlyZXR1cm4oMSk7CisJCQkJfQorCisJCQkJdG1wID0gcG9sbF9pMmNfaXJxKEkyQ19TVEFUX1hSRFkgfCBJMkNfU1RBVF9OQUNLKTsKKworCQkJCUNIRUNLX05BQ0soKTsKKwkJCQkvKiBObyBicmVhaywgZmFsbCB0aHJvdWdoICovCisJCQljYXNlIDE6CisJCQkJLyogU2VuZCBhZGRyZXNzIExTQnl0ZSAqLworCQkJCWlmICh0bXAgJiBJMkNfU1RBVF9YUkRZKSB7CisJCQkJCVJFRyhJMkNfRFhSKSA9IGFkZHIgJiAweGZmOworCQkJCX0gZWxzZSB7CisJCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJCXJldHVybigxKTsKKwkJCQl9CisKKwkJCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfWFJEWSB8IEkyQ19TVEFUX05BQ0sgfCBJMkNfU1RBVF9BUkRZKTsKKworCQkJCUNIRUNLX05BQ0soKTsKKworCQkJCWlmICghKHRtcCAmIEkyQ19TVEFUX0FSRFkpKSB7CisJCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJCXJldHVybigxKTsKKwkJCQl9CisJCX0KKwl9CisKKwkvKiBBZGRyZXNzIHBoYXNlIGlzIG92ZXIsIG5vdyByZWFkICdsZW4nIGJ5dGVzIGFuZCBzdG9wICovCisJdG1wID0gSTJDX0NPTl9FTiB8IEkyQ19DT05fTVNUIHwgSTJDX0NPTl9TVFQgfCBJMkNfQ09OX1NUUDsKKwlSRUcoSTJDX0NOVCkgPSBsZW4gJiAweGZmZmY7CisJUkVHKEkyQ19TQSkgPSBjaGlwOworCVJFRyhJMkNfQ09OKSA9IHRtcDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfUlJEWSB8IEkyQ19TVEFUX05BQ0sgfCBJMkNfU1RBVF9ST1ZSKTsKKworCQlDSEVDS19OQUNLKCk7CisKKwkJaWYgKHRtcCAmIEkyQ19TVEFUX1JSRFkpIHsKKwkJCWJ1ZltpXSA9IFJFRyhJMkNfRFJSKTsKKwkJfSBlbHNlIHsKKwkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQlyZXR1cm4oMSk7CisJCX0KKwl9CisKKwl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfU0NEIHwgSTJDX1NUQVRfTkFDSyk7CisKKwlDSEVDS19OQUNLKCk7CisKKwlpZiAoISh0bXAgJiBJMkNfU1RBVF9TQ0QpKSB7CisJCVJFRyhJMkNfQ09OKSA9IDA7CisJCXJldHVybigxKTsKKwl9CisKKwlmbHVzaF9yeCgpOworCVJFRyhJMkNfU1RBVCkgPSAweGZmZmY7CisJUkVHKEkyQ19DTlQpID0gMDsKKwlSRUcoSTJDX0NPTikgPSAwOworCisJcmV0dXJuKDApOworfQorCisKK2ludCBpMmNfd3JpdGUodV9pbnQ4X3QgY2hpcCwgdV9pbnQzMl90IGFkZHIsIGludCBhbGVuLCB1X2ludDhfdCAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50MzJfdAl0bXA7CisJaW50CQlpOworCisJaWYgKChhbGVuIDwgMCkgfHwgKGFsZW4gPiAyKSkgeworCQlwcmludGYoIiVzKCk6IGJvZ3VzIGFkZHJlc3MgbGVuZ3RoICV4XG4iLCBfX0ZVTkNUSU9OX18sIGFsZW4pOworCQlyZXR1cm4oMSk7CisJfQorCWlmIChsZW4gPCAwKSB7CisJCXByaW50ZigiJXMoKTogYm9ndXMgbGVuZ3RoICV4XG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisJCXJldHVybigxKTsKKwl9CisKKwlpZiAod2FpdF9mb3JfYnVzKCkpIHtyZXR1cm4oMSk7fQorCisJLyogU3RhcnQgYWRkcmVzcyBwaGFzZSAqLworCXRtcCA9IEkyQ19DT05fRU4gfCBJMkNfQ09OX01TVCB8IEkyQ19DT05fU1RUIHwgSTJDX0NPTl9UUlggfCBJMkNfQ09OX1NUUDsKKwlSRUcoSTJDX0NOVCkgPSAoYWxlbiA9PSAwKSA/IGxlbiAmIDB4ZmZmZiA6IChsZW4gJiAweGZmZmYpICsgYWxlbjsKKwlSRUcoSTJDX1NBKSA9IGNoaXA7CisJUkVHKEkyQ19DT04pID0gdG1wOworCisJc3dpdGNoIChhbGVuKSB7CisJCWNhc2UgMjoKKwkJCS8qIFNlbmQgYWRkcmVzcyBNU0J5dGUgKi8KKwkJCXRtcCA9IHBvbGxfaTJjX2lycShJMkNfU1RBVF9YUkRZIHwgSTJDX1NUQVRfTkFDSyk7CisKKwkJCUNIRUNLX05BQ0soKTsKKworCQkJaWYgKHRtcCAmIEkyQ19TVEFUX1hSRFkpIHsKKwkJCQlSRUcoSTJDX0RYUikgPSAoYWRkciA+PiA4KSAmIDB4ZmY7CisJCQl9IGVsc2UgeworCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCQkJLyogTm8gYnJlYWssIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQkvKiBTZW5kIGFkZHJlc3MgTFNCeXRlICovCisJCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfWFJEWSB8IEkyQ19TVEFUX05BQ0spOworCisJCQlDSEVDS19OQUNLKCk7CisKKwkJCWlmICh0bXAgJiBJMkNfU1RBVF9YUkRZKSB7CisJCQkJUkVHKEkyQ19EWFIpID0gYWRkciAmIDB4ZmY7CisJCQl9IGVsc2UgeworCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfWFJEWSB8IEkyQ19TVEFUX05BQ0spOworCisJCUNIRUNLX05BQ0soKTsKKworCQlpZiAodG1wICYgSTJDX1NUQVRfWFJEWSkgeworCQkJUkVHKEkyQ19EWFIpID0gYnVmW2ldOworCQl9IGVsc2UgeworCQkJcmV0dXJuKDEpOworCQl9CisJfQorCisJdG1wID0gcG9sbF9pMmNfaXJxKEkyQ19TVEFUX1NDRCB8IEkyQ19TVEFUX05BQ0spOworCisJQ0hFQ0tfTkFDSygpOworCisJaWYgKCEodG1wICYgSTJDX1NUQVRfU0NEKSkgeworCQlSRUcoSTJDX0NPTikgPSAwOworCQlyZXR1cm4oMSk7CisJfQorCisJZmx1c2hfcngoKTsKKwlSRUcoSTJDX1NUQVQpID0gMHhmZmZmOworCVJFRyhJMkNfQ05UKSA9IDA7CisJUkVHKEkyQ19DT04pID0gMDsKKworCXJldHVybigwKTsKK30KKworCit1X2ludDhfdCBpMmNfcmVnX3JlYWQodV9pbnQ4X3QgY2hpcCwgdV9pbnQ4X3QgcmVnKQoreworCXVfaW50OF90CXRtcDsKKworCWkyY19yZWFkKGNoaXAsIHJlZywgMSwgJnRtcCwgMSk7CisJcmV0dXJuKHRtcCk7Cit9CisKKwordm9pZCBpMmNfcmVnX3dyaXRlKHVfaW50OF90IGNoaXAsIHVfaW50OF90IHJlZywgdV9pbnQ4X3QgdmFsKQoreworCXVfaW50OF90CXRtcDsKKworCWkyY193cml0ZShjaGlwLCByZWcsIDEsICZ0bXAsIDEpOworfQorCisjZW5kaWYgLyogQ09ORklHX0RSSVZFUl9EQVZJTkNJX0kyQyAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2xvd2xldmVsX2luaXQuUyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9sb3dsZXZlbF9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3YzExMgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9sb3dsZXZlbF9pbml0LlMKQEAgLTAsMCArMSw3MDcgQEAKKy8qCisgKiBMb3ctbGV2ZWwgYm9hcmQgc2V0dXAgY29kZSBmb3IgVEkgRGFWaW5jaSBTb0MgYmFzZWQgYm9hcmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBQYXJ0aWFsbHkgYmFzZWQgb24gVEkgc291cmNlcywgb3JpZ2luYWwgY29weXJpZ2h0cyBmb2xsb3c6CisgKi8KKworLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEtzaGl0aWogR3VwdGEgPEtzaGl0aWpAdGkuY29tPgorICoKKyAqIE1vZGlmaWVkIGZvciBPTUFQIDE2MTAgSDIgYm9hcmQgYnkgTmlzaGFudCBLYW1hdCwgSmFuIDIwMDQKKyAqCisgKiBNb2RpZmllZCBmb3IgT01BUCA1OTEyIE9TSyBib2FyZCBieSBSaXNoaSBCaGF0dGFjaGFyeWEsIEFwciAyMDA0CisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBNb2RpZmllZCBmb3IgRFYtRVZNIGJvYXJkIGJ5IFJpc2hpIEJoYXR0YWNoYXJ5YSwgQXByIDIwMDUKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIE1vZGlmaWVkIGZvciBEVi1FVk0gYm9hcmQgYnkgU3dhbWluYXRoYW4gUywgTm92IDIwMDUKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLmdsb2JsCWxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogTWFzayBhbGwgSVJRcyBieSBzZXR0aW5nIGFsbCBiaXRzIGluIHRoZSBFSU5UIGRlZmF1bHQgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbW92CXIxLCAkMAorCWxkcglyMCwgPUVJTlRfRU5BQkxFMAorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgPUVJTlRfRU5BQkxFMQorCXN0cglyMSwgW3IwXQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogUHV0IHRoZSBHRU0gaW4gcmVzZXQJCQkJCSoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBQdXQgdGhlIEdFTSBpbiByZXNldCAqLworCWxkcglyOCwgUFNDX0dFTV9GTEFHX0NMRUFSCisJbGRyCXI2LCBNRENUTF9HRU0KKwlsZHIJcjcsIFtyNl0KKwlhbmQJcjcsIHI3LCByOAorCXN0cglyNywgW3I2XQorCisJLyogRW5hYmxlIHRoZSBQb3dlciBEb21haW4gVHJhbnNpdGlvbiBDb21tYW5kICovCisJbGRyCXI2LCBQVENNRAorCWxkcglyNywgW3I2XQorCW9ycglyNywgcjcsICQweDAyCisJc3RyCXI3LCBbcjZdCisKKwkvKiBDaGVjayBmb3IgVHJhbnNpdGlvbiBDb21wbGV0ZShQVFNUQVQpICovCitjaGVja1N0YXRDbGtTdG9wR2VtOgorCWxkcglyNiwgUFRTVEFUCisJbGRyCXI3LCBbcjZdCisJYW5kcwlyNywgcjcsICQweDAyCisJYm5lCWNoZWNrU3RhdENsa1N0b3BHZW0KKworCS8qIENoZWNrIGZvciBHRU0gUmVzZXQgQ29tcGxldGlvbiAqLworY2hlY2tHZW1TdGF0Q2xrU3RvcDoKKwlsZHIJcjYsIE1EU1RBVF9HRU0KKwlsZHIJcjcsIFtyNl0KKwlhbmRzCXI3LCByNywgJDB4MTAwCisJYm5lCWNoZWNrR2VtU3RhdENsa1N0b3AKKworCS8qIERvIHRoaXMgZm9yIGVuYWJsaW5nIGEgV0RUIGluaXRpYXRlZCByZXNldCB0aGlzIGlzIGEgd29ya2Fyb3VuZAorCSAgIGZvciBhIGNoaXAgYnVnLiAgTm90IHJlcXVpcmVkIHVuZGVyIG5vcm1hbCBzaXR1YXRpb25zICovCisJbGRyCXI2LCBQMTM5NAorCW1vdglyMTAsICQwCisJc3RyCXIxMCwgW3I2XQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogRW5hYmxlIEwxICYgTDIgTWVtb3JpZXMgaW4gRmFzdCBtb2RlICAgICAgICAgICAgICAgICAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyNiwgREZUX0VOQUJMRQorCW1vdglyMTAsICQweDAxCisJc3RyCXIxMCwgW3I2XQorCisJbGRyCXI2LCBNTUFSR19CUkYwCisJbGRyCXIxMCwgTU1BUkdfQlJGMF9WQUwKKwlzdHIJcjEwLCBbcjZdCisKKwlsZHIJcjYsIERGVF9FTkFCTEUKKwltb3YJcjEwLCAkMAorCXN0cglyMTAsIFtyNl0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIEREUjIgUExMIEluaXRpYWxpemF0aW9uCQkJICAgIAkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogU2VsZWN0IHRoZSBDbG9jayBNb2RlIERlcGVuZGluZyBvbiB0aGUgVmFsdWUgd3JpdHRlbiBpbiB0aGUgQm9vdCBUYWJsZSBieSB0aGUgcnVuIHNjcmlwdCAqLworCW1vdglyMTAsICQwCisJbGRyCXI2LCBQTEwyX0NUTAorCWxkcglyNywgUExMX0NMS1NSQ19NQVNLCisJbGRyCXI4LCBbcjZdCisJYW5kCXI4LCByOCwgcjcKKwltb3YJcjksIHIxMCwgbHNsICQ4CisJb3JyCXI4LCByOCwgcjkKKwlzdHIJcjgsIFtyNl0KKworCS8qIFNlbGVjdCB0aGUgUExMRU4gc291cmNlICovCisJbGRyCXI3LCBQTExfRU5TUkNfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBCeXBhc3MgdGhlIFBMTCAqLworCWxkcglyNywgUExMX0JZUEFTU19NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIFdhaXQgZm9yIGZldyBjeWNsZXMgdG8gYWxsb3cgUExMRU4gTXV4IHN3aXRjaCBwcm9wZXJseSB0byBieXBhc3MgQ2xvY2sgKi8KKwltb3YJcjEwLCAkMHgyMAorV2FpdFBQTDJMb29wOgorCXN1YnMJcjEwLCByMTAsICQxCisJYm5lCVdhaXRQUEwyTG9vcAorCisJLyogUmVzZXQgdGhlIFBMTCAqLworCWxkcglyNywgUExMX1JFU0VUX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogUG93ZXIgdXAgdGhlIFBMTCAqLworCWxkcglyNywgUExMX1BXUlVQX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogRW5hYmxlIHRoZSBQTEwgZnJvbSBEaXNhYmxlIE1vZGUgKi8KKwlsZHIJcjcsIFBMTF9ESVNBQkxFX0VOQUJMRV9NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIFByb2dyYW0gdGhlIFBMTCBNdWx0aXBsaWVyICovCisJbGRyCXI2LCBQTEwyX1BMTE0KKwltb3YJcjIsICQweDE3CS8qIDE2MiBNSHogKi8KKwlzdHIJcjIsIFtyNl0KKworCS8qIFByb2dyYW0gdGhlIFBMTDIgRGl2aXNvciBWYWx1ZSAqLworCWxkcglyNiwgUExMMl9ESVYyCisJbW92CXIzLCAkMHgwMQorCXN0cglyMywgW3I2XQorCisJLyogUHJvZ3JhbSB0aGUgUExMMiBEaXZpc29yIFZhbHVlICovCisJbGRyCXI2LCBQTEwyX0RJVjEKKwltb3YJcjQsICQweDBiCS8qIDU0IE1IeiAqLworCXN0cglyNCwgW3I2XQorCisJLyogUExMMiBESVYyIE1NUiAqLworCWxkcglyOCwgUExMMl9ESVZfTUFTSworCWxkcglyNiwgUExMMl9ESVYyCisJbGRyCXI5LCBbcjZdCisJYW5kCXI4LCByOCwgcjkKKwltb3YJcjksICQweDAxCisJbW92CXI5LCByOSwgbHNsICQxNQorCW9ycglyOCwgcjgsIHI5CisJc3RyCXI4LCBbcjZdCisKKwkvKiBQcm9ncmFtIHRoZSBHT1NFVCBiaXQgdG8gdGFrZSBuZXcgZGl2aWRlciB2YWx1ZXMgKi8KKwlsZHIJcjYsIFBMTDJfUExMQ01ECisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDEKKwlzdHIJcjcsIFtyNl0KKworCS8qIFdhaXQgZm9yIERvbmUgKi8KKwlsZHIJcjYsIFBMTDJfUExMU1RBVAorZG9uZUxvb3BfMDoKKwlsZHIJcjcsIFtyNl0KKwlhbmRzCXI3LCByNywgJDB4MDEKKwlibmUJZG9uZUxvb3BfMAorCisJLyogUExMMiBESVYxIE1NUiAqLworCWxkcglyOCwgUExMMl9ESVZfTUFTSworCWxkcglyNiwgUExMMl9ESVYxCisJbGRyCXI5LCBbcjZdCisJYW5kCXI4LCByOCwgcjkKKwltb3YJcjksICQweDAxCisJbW92CXI5LCByOSwgbHNsICQxNQorCW9ycglyOCwgcjgsIHI5CisJc3RyCXI4LCBbcjZdCisKKwkvKiBQcm9ncmFtIHRoZSBHT1NFVCBiaXQgdG8gdGFrZSBuZXcgZGl2aWRlciB2YWx1ZXMgKi8KKwlsZHIJcjYsIFBMTDJfUExMQ01ECisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDEKKwlzdHIJcjcsIFtyNl0KKworCS8qIFdhaXQgZm9yIERvbmUgKi8KKwlsZHIJcjYsIFBMTDJfUExMU1RBVAorZG9uZUxvb3A6CisJbGRyCXI3LCBbcjZdCisJYW5kcwlyNywgcjcsICQweDAxCisJYm5lCWRvbmVMb29wCisKKwkvKiBXYWl0IGZvciBQTEwgdG8gUmVzZXQgUHJvcGVybHkgKi8KKwltb3YJcjEwLCAkMHgyMTgKK1Jlc2V0UFBMMkxvb3A6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJUmVzZXRQUEwyTG9vcAorCisJLyogQnJpbmcgUExMIG91dCBvZiBSZXNldCAqLworCWxkcglyNiwgUExMMl9DVEwKKwlsZHIJcjgsIFtyNl0KKwlvcnIJcjgsIHI4LCAkMHgwOAorCXN0cglyOCwgW3I2XQorCisJLyogV2FpdCBmb3IgUExMIHRvIExvY2sgKi8KKwlsZHIJcjEwLCBQTExfTE9DS19DT1VOVAorUExMMkxvY2s6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJUExMMkxvY2sKKworCS8qIEVuYWJsZSB0aGUgUExMICovCisJbGRyCXI2LCBQTEwyX0NUTAorCWxkcglyOCwgW3I2XQorCW9ycglyOCwgcjgsICQweDAxCisJc3RyCXI4LCBbcjZdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBJc3N1ZSBTb2Z0IFJlc2V0IHRvIEREUiBNb2R1bGUJCQkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogU2h1dCBkb3duIHRoZSBERFIyIExQU0MgTW9kdWxlICovCisJbGRyCXI4LCBQU0NfRkxBR19DTEVBUgorCWxkcglyNiwgTURDVExfRERSMgorCWxkcglyNywgW3I2XQorCWFuZAlyNywgcjcsIHI4CisJb3JyCXI3LCByNywgJDB4MDMKKwlzdHIJcjcsIFtyNl0KKworCS8qIEVuYWJsZSB0aGUgUG93ZXIgRG9tYWluIFRyYW5zaXRpb24gQ29tbWFuZCAqLworCWxkcglyNiwgUFRDTUQKKwlsZHIJcjcsIFtyNl0KKwlvcnIJcjcsIHI3LCAkMHgwMQorCXN0cglyNywgW3I2XQorCisJLyogQ2hlY2sgZm9yIFRyYW5zaXRpb24gQ29tcGxldGUoUFRTVEFUKSAqLworY2hlY2tTdGF0Q2xrU3RvcDoKKwlsZHIJcjYsIFBUU1RBVAorCWxkcglyNywgW3I2XQorCWFuZHMJcjcsIHI3LCAkMHgwMQorCWJuZQljaGVja1N0YXRDbGtTdG9wCisKKwkvKiBDaGVjayBmb3IgRERSMiBDb250cm9sbGVyIEVuYWJsZSBDb21wbGV0aW9uICovCitjaGVja0REUlN0YXRDbGtTdG9wOgorCWxkcglyNiwgTURTVEFUX0REUjIKKwlsZHIJcjcsIFtyNl0KKwlhbmQJcjcsIHI3LCAkMHgxZgorCWNtcAlyNywgJDB4MDMKKwlibmUJY2hlY2tERFJTdGF0Q2xrU3RvcAorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogUHJvZ3JhbSBERFIyIE1NUnMgZm9yIDE2Mk1IeiBTZXR0aW5nCQkJKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIFByb2dyYW0gUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlsZHIJcjYsIEREUkNUTAorCWxkcglyNywgRERSQ1RMX1ZBTAorCXN0cglyNywgW3I2XQorCisJLyogUHJvZ3JhbSBTRFJBTSBCYW5rIENvbmZpZyBSZWdpc3RlciAqLworCWxkcglyNiwgU0RDRkcKKwlsZHIJcjcsIFNEQ0ZHX1ZBTAorCXN0cglyNywgW3I2XQorCisJLyogUHJvZ3JhbSBTRFJBTSBUSU0tMCBDb25maWcgUmVnaXN0ZXIgKi8KKwlsZHIJcjYsIFNEVElNMAorCWxkcglyNywgU0RUSU0wX1ZBTF8xNjJNSHoKKwlzdHIJcjcsIFtyNl0KKworCS8qIFByb2dyYW0gU0RSQU0gVElNLTEgQ29uZmlnIFJlZ2lzdGVyICovCisJbGRyCXI2LCBTRFRJTTEKKwlsZHIJcjcsIFNEVElNMV9WQUxfMTYyTUh6CisJc3RyCXI3LCBbcjZdCisKKwkvKiBQcm9ncmFtIHRoZSBTRFJBTSBCYW5rIENvbmZpZyBDb250cm9sIFJlZ2lzdGVyICovCisJbGRyCXIxMCwgTUFTS19WQUwKKwlsZHIJcjgsIFNEQ0ZHCisJbGRyCXI5LCBTRENGR19WQUwKKwlhbmQJcjksIHI5LCByMTAKKwlzdHIJcjksIFtyOF0KKworCS8qIFByb2dyYW0gU0RSQU0gU0RSRUYgQ29uZmlnIFJlZ2lzdGVyICovCisJbGRyCXI2LCBTRFJFRgorCWxkcglyNywgU0RSRUZfVkFMCisJc3RyCXI3LCBbcjZdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBJc3N1ZSBTb2Z0IFJlc2V0IHRvIEREUiBNb2R1bGUJCQkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogSXNzdWUgYSBEdW1teSBERFIyIHJlYWQvd3JpdGUgKi8KKwlsZHIJcjgsIEREUjJfU1RBUlRfQUREUgorCWxkcglyNywgRFVNTVlfVkFMCisJc3RyCXI3LCBbcjhdCisJbGRyCXI3LCBbcjhdCisKKwkvKiBTaHV0IGRvd24gdGhlIEREUjIgTFBTQyBNb2R1bGUgKi8KKwlsZHIJcjgsIFBTQ19GTEFHX0NMRUFSCisJbGRyCXI2LCBNRENUTF9ERFIyCisJbGRyCXI3LCBbcjZdCisJYW5kCXI3LCByNywgcjgKKwlvcnIJcjcsIHI3LCAkMHgwMQorCXN0cglyNywgW3I2XQorCisJLyogRW5hYmxlIHRoZSBQb3dlciBEb21haW4gVHJhbnNpdGlvbiBDb21tYW5kICovCisJbGRyCXI2LCBQVENNRAorCWxkcglyNywgW3I2XQorCW9ycglyNywgcjcsICQweDAxCisJc3RyCXI3LCBbcjZdCisKKwkvKiBDaGVjayBmb3IgVHJhbnNpdGlvbiBDb21wbGV0ZShQVFNUQVQpICovCitjaGVja1N0YXRDbGtTdG9wMjoKKwlsZHIJcjYsIFBUU1RBVAorCWxkcglyNywgW3I2XQorCWFuZHMJcjcsIHI3LCAkMHgwMQorCWJuZQljaGVja1N0YXRDbGtTdG9wMgorCisJLyogQ2hlY2sgZm9yIEREUjIgQ29udHJvbGxlciBFbmFibGUgQ29tcGxldGlvbiAqLworY2hlY2tERFJTdGF0Q2xrU3RvcDI6CisJbGRyCXI2LCBNRFNUQVRfRERSMgorCWxkcglyNywgW3I2XQorCWFuZAlyNywgcjcsICQweDFmCisJY21wCXI3LCAkMHgwMQorCWJuZQljaGVja0REUlN0YXRDbGtTdG9wMgorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogVHVybiBERFIyIENvbnRyb2xsZXIgQ2xvY2tzIE9uCQkJKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIEVuYWJsZSB0aGUgRERSMiBMUFNDIE1vZHVsZSAqLworCWxkcglyNiwgTURDVExfRERSMgorCWxkcglyNywgW3I2XQorCW9ycglyNywgcjcsICQweDAzCisJc3RyCXI3LCBbcjZdCisKKwkvKiBFbmFibGUgdGhlIFBvd2VyIERvbWFpbiBUcmFuc2l0aW9uIENvbW1hbmQgKi8KKwlsZHIJcjYsIFBUQ01ECisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDEKKwlzdHIJcjcsIFtyNl0KKworCS8qIENoZWNrIGZvciBUcmFuc2l0aW9uIENvbXBsZXRlKFBUU1RBVCkgKi8KK2NoZWNrU3RhdENsa0VuMjoKKwlsZHIJcjYsIFBUU1RBVAorCWxkcglyNywgW3I2XQorCWFuZHMJcjcsIHI3LCAkMHgwMQorCWJuZQljaGVja1N0YXRDbGtFbjIKKworCS8qIENoZWNrIGZvciBERFIyIENvbnRyb2xsZXIgRW5hYmxlIENvbXBsZXRpb24gKi8KK2NoZWNrRERSU3RhdENsa0VuMjoKKwlsZHIJcjYsIE1EU1RBVF9ERFIyCisJbGRyCXI3LCBbcjZdCisJYW5kCXI3LCByNywgJDB4MWYKKwljbXAJcjcsICQweDAzCisJYm5lCWNoZWNrRERSU3RhdENsa0VuMgorCisJLyogIEREUiBXcml0ZXMgYW5kIFJlYWRzICovCisJbGRyCXI2LCBDRkdURVNUCisJbW92CXIzLCAkMHgwMQorCXN0cglyMywgW3I2XQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogU3lzdGVtIFBMTCBJbml0aWFsaXphdGlvbgkJCQkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogU2VsZWN0IHRoZSBDbG9jayBNb2RlIERlcGVuZGluZyBvbiB0aGUgVmFsdWUgd3JpdHRlbiBpbiB0aGUgQm9vdCBUYWJsZSBieSB0aGUgcnVuIHNjcmlwdCAqLworCW1vdglyMiwgJDAKKwlsZHIJcjYsIFBMTDFfQ1RMCisJbGRyCXI3LCBQTExfQ0xLU1JDX01BU0sKKwlsZHIJcjgsIFtyNl0KKwlhbmQJcjgsIHI4LCByNworCW1vdglyOSwgcjIsIGxzbCAkOAorCW9ycglyOCwgcjgsIHI5CisJc3RyCXI4LCBbcjZdCisKKwkvKiBTZWxlY3QgdGhlIFBMTEVOIHNvdXJjZSAqLworCWxkcglyNywgUExMX0VOU1JDX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogQnlwYXNzIHRoZSBQTEwgKi8KKwlsZHIJcjcsIFBMTF9CWVBBU1NfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBXYWl0IGZvciBmZXcgY3ljbGVzIHRvIGFsbG93IFBMTEVOIE11eCBzd2l0Y2ggcHJvcGVybHkgdG8gYnlwYXNzIENsb2NrICovCisJbW92CXIxMCwgJDB4MjAKKworV2FpdExvb3A6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJV2FpdExvb3AKKworCS8qIFJlc2V0IHRoZSBQTEwgKi8KKwlsZHIJcjcsIFBMTF9SRVNFVF9NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIERpc2FibGUgdGhlIFBMTCAqLworCW9ycglyOCwgcjgsICQweDEwCisJc3RyCXI4LCBbcjZdCisKKwkvKiBQb3dlciB1cCB0aGUgUExMICovCisJbGRyCXI3LCBQTExfUFdSVVBfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBFbmFibGUgdGhlIFBMTCBmcm9tIERpc2FibGUgTW9kZSAqLworCWxkcglyNywgUExMX0RJU0FCTEVfRU5BQkxFX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogUHJvZ3JhbSB0aGUgUExMIE11bHRpcGxpZXIgKi8KKwlsZHIJcjYsIFBMTDFfUExMTQorCW1vdglyMywgJDB4MTUJLyogRm9yIDU5NE1IeiAqLworCXN0cglyMywgW3I2XQorCisJLyogV2FpdCBmb3IgUExMIHRvIFJlc2V0IFByb3Blcmx5ICovCisJbW92CXIxMCwgJDB4ZmYKKworUmVzZXRMb29wOgorCXN1YnMJcjEwLCByMTAsICQxCisJYm5lCVJlc2V0TG9vcAorCisJLyogQnJpbmcgUExMIG91dCBvZiBSZXNldCAqLworCWxkcglyNiwgUExMMV9DVEwKKwlvcnIJcjgsIHI4LCAkMHgwOAorCXN0cglyOCwgW3I2XQorCisJLyogV2FpdCBmb3IgUExMIHRvIExvY2sgKi8KKwlsZHIJcjEwLCBQTExfTE9DS19DT1VOVAorCitQTEwxTG9jazoKKwlzdWJzCXIxMCwgcjEwLCAkMQorCWJuZQlQTEwxTG9jaworCisJLyogRW5hYmxlIHRoZSBQTEwgKi8KKwlvcnIJcjgsIHI4LCAkMHgwMQorCXN0cglyOCwgW3I2XQorCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBBRU1JRiBjb25maWd1cmF0aW9uIGZvciBOT1IgRmxhc2ggKGRvdWJsZSBjaGVjaykgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLCBfUElOTVVYMAorCWxkcglyMSwgX0RFVl9TRVRUSU5HCisJc3RyCXIxLCBbcjBdCisKKwlsZHIJcjAsIFdBSVRDRkcKKwlsZHIJcjEsIFdBSVRDRkdfVkFMCisJbGRyCXIyLCBbcjBdCisJb3JyCXIyLCByMiwgcjEKKwlzdHIJcjIsIFtyMF0KKworCWxkcglyMCwgQUNGRzMKKwlsZHIJcjEsIEFDRkczX1ZBTAorCWxkcglyMiwgW3IwXQorCWFuZAlyMSwgcjIsIHIxCisJc3RyCXIxLCBbcjBdCisKKwlsZHIJcjAsIEFDRkc0CisJbGRyCXIxLCBBQ0ZHNF9WQUwKKwlsZHIJcjIsIFtyMF0KKwlhbmQJcjEsIHIyLCByMQorCXN0cglyMSwgW3IwXQorCisJbGRyCXIwLCBBQ0ZHNQorCWxkcglyMSwgQUNGRzVfVkFMCisJbGRyCXIyLCBbcjBdCisJYW5kCXIxLCByMiwgcjEKKwlzdHIJcjEsIFtyMF0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogVlRQIG1hbnVhbCBDYWxpYnJhdGlvbiAgICAgICAgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsZHIJcjAsIFZUUElPQ1IKKwlsZHIJcjEsIFZUUF9NTVIwCisJc3RyCXIxLCBbcjBdCisKKwlsZHIJcjAsIFZUUElPQ1IKKwlsZHIJcjEsIFZUUF9NTVIxCisJc3RyCXIxLCBbcjBdCisKKwkvKiBXYWl0IGZvciAzMyBWVFAgQ0xLIGN5Y2xlcy4gIFZSUCBvcGVyYXRlcyBhdCAyNyBNSHogKi8KKwlsZHIJcjEwLCBWVFBfTE9DS19DT1VOVAorVlRQTG9jazoKKwlzdWJzCXIxMCwgcjEwLCAkMQorCWJuZQlWVFBMb2NrCisKKwlsZHIJcjYsIERGVF9FTkFCTEUKKwltb3YJcjEwLCAkMHgwMQorCXN0cglyMTAsIFtyNl0KKworCWxkcglyNiwgRERSVlRQUgorCWxkcglyNywgW3I2XQorCWFuZAlyNywgcjcsICQweDFmCisJYW5kCXI4LCByNywgJDB4M2UwCisJb3JyCXI4LCByNywgcjgKKwlsZHIJcjcsIFZUUF9SRUNBTAorCW9ycglyOCwgcjcsIHI4CisJbGRyCXI3LCBWVFBfRU4KKwlvcnIJcjgsIHI3LCByOAorCXN0cglyOCwgW3IwXQorCisKKwkvKiBXYWl0IGZvciAzMyBWVFAgQ0xLIGN5Y2xlcy4gIFZSUCBvcGVyYXRlcyBhdCAyNyBNSHogKi8KKwlsZHIJcjEwLCBWVFBfTE9DS19DT1VOVAorVlRQMUxvY2s6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJVlRQMUxvY2sKKworCWxkcglyMSwgW3IwXQorCWxkcglyMiwgVlRQX01BU0sKKwlhbmQJcjIsIHIxLCByMgorCXN0cglyMiwgW3IwXQorCisJbGRyCXI2LCBERlRfRU5BQkxFCisJbW92CXIxMCwgJDAKKwlzdHIJcjEwLCBbcjZdCisKKwkvKgorCSAqIENhbGwgYm9hcmQtc3BlY2lmaWMgbG93bGV2ZWwgaW5pdC4KKyAJICogVGhhdCBNVVNUIGJlIHByZXNlbnQgYW5kIFRIQVQgcmV0dXJucworCSAqIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgd2l0aCAibW92IHBjLCBsci4iCisJICovCisJYglkdl9ib2FyZF9pbml0CisKKy5sdG9yZworCitfUElOTVVYMDoKKwkud29yZAkweDAxYzQwMDAwCQkvKiBEZXZpY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KK19QSU5NVVgxOgorCS53b3JkCTB4MDFjNDAwMDQJCS8qIERldmljZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworCitfREVWX1NFVFRJTkc6CisJLndvcmQJMHgwMDAwMGMxZgorCitXQUlUQ0ZHOgorCS53b3JkCTB4MDFlMDAwMDQKK1dBSVRDRkdfVkFMOgorCS53b3JkCTAKK0FDRkczOgorCS53b3JkCTB4MDFlMDAwMTQKK0FDRkczX1ZBTDoKKwkud29yZAkweDNmZmZmZmZkCitBQ0ZHNDoKKwkud29yZAkweDAxZTAwMDE4CitBQ0ZHNF9WQUw6CisJLndvcmQJMHgzZmZmZmZmZAorQUNGRzU6CisJLndvcmQJMHgwMWUwMDAxYworQUNGRzVfVkFMOgorCS53b3JkCTB4M2ZmZmZmZmQKKworTURDVExfRERSMjoKKwkud29yZAkweDAxYzQxYTM0CitNRFNUQVRfRERSMjoKKwkud29yZAkweDAxYzQxODM0CisKK1BUQ01EOgorCS53b3JkCTB4MDFjNDExMjAKK1BUU1RBVDoKKwkud29yZAkweDAxYzQxMTI4CisKK0VJTlRfRU5BQkxFMDoKKwkud29yZAkweDAxYzQ4MDE4CitFSU5UX0VOQUJMRTE6CisJLndvcmQJMHgwMWM0ODAxYworCitQU0NfRkxBR19DTEVBUjoKKwkud29yZAkweGZmZmZmZmUwCitQU0NfR0VNX0ZMQUdfQ0xFQVI6CisJLndvcmQJMHhmZmZmZmVmZgorCisvKiBERFIyIE1NUiAmIENPTkZJR1VSQVRJT04gVkFMVUVTLCAxNjIgTUhaIGNsb2NrICovCitERFJDVEw6CisJLndvcmQJMHgyMDAwMDBlNAorRERSQ1RMX1ZBTDoKKwkud29yZAkweDUwMDA2NDA1CitTRFJFRjoKKwkud29yZAkweDIwMDAwMDBjCitTRFJFRl9WQUw6CisJLndvcmQJMHgwMDAwMDVjMworU0RDRkc6CisJLndvcmQJMHgyMDAwMDAwOAorU0RDRkdfVkFMOgorI2lmZGVmCUREUl80QkFOS1MKKwkud29yZAkweDAwMTc4NjIyCisjZWxpZiBkZWZpbmVkIEREUl84QkFOS1MKKwkud29yZAkweDAwMTc4NjMyCisjZWxzZQorI2Vycm9yICJVbmtub3duIEREUiBjb25maWd1cmF0aW9uISEhIgorI2VuZGlmCitTRFRJTTA6CisJLndvcmQJMHgyMDAwMDAxMAorU0RUSU0wX1ZBTF8xNjJNSHo6CisJLndvcmQJMHgyODkyMzIxMQorU0RUSU0xOgorCS53b3JkCTB4MjAwMDAwMTQKK1NEVElNMV9WQUxfMTYyTUh6OgorCS53b3JkCTB4MDAxNmM3MjIKK1ZUUElPQ1I6CisJLndvcmQJMHgyMDAwMDBmMAkvKiBWVFAgSU8gQ29udHJvbCByZWdpc3RlciAqLworRERSVlRQUjoKKwkud29yZAkweDAxYzQyMDMwCS8qIEREUiBWUFRSIE1NUiAqLworVlRQX01NUjA6CisJLndvcmQJMHgyMDFmCitWVFBfTU1SMToKKwkud29yZAkweGEwMWYKK0RGVF9FTkFCTEU6CisJLndvcmQJMHgwMWM0MDA0YworVlRQX0xPQ0tfQ09VTlQ6CisJLndvcmQJMHg1YjAKK1ZUUF9NQVNLOgorCS53b3JkCTB4ZmZmZmRmZmYKK1ZUUF9SRUNBTDoKKwkud29yZAkweDQwMDAwCitWVFBfRU46CisJLndvcmQJMHgwMjAwMAorQ0ZHVEVTVDoKKwkud29yZAkweDgwMDEwMDAwCitNQVNLX1ZBTDoKKwkud29yZAkweDAwMDAwZmZmCisKKy8qIEdFTSBQb3dlciBVcCAmIExQU0MgQ29udHJvbCBSZWdpc3RlciAqLworTURDVExfR0VNOgorCS53b3JkCTB4MDFjNDFhOWMKK01EU1RBVF9HRU06CisJLndvcmQJMHgwMWM0MTg5YworCisvKiBGb3IgV0RUIHJlc2V0IGNoaXAgYnVnICovCitQMTM5NDoKKwkud29yZAkweDAxYzQxYTIwCisKK1BMTF9DTEtTUkNfTUFTSzoKKwkud29yZAkweGZmZmZmZWZmCS8qIE1hc2sgdGhlIENsb2NrIE1vZGUgYml0ICovCitQTExfRU5TUkNfTUFTSzoKKwkud29yZAkweGZmZmZmZmRmCS8qIFNlbGVjdCB0aGUgUExMRU4gc291cmNlICovCitQTExfQllQQVNTX01BU0s6CisJLndvcmQJMHhmZmZmZmZmZQkvKiBQdXQgdGhlIFBMTCBpbiBCWVBBU1MgKi8KK1BMTF9SRVNFVF9NQVNLOgorCS53b3JkCTB4ZmZmZmZmZjcJLyogUHV0IHRoZSBQTEwgaW4gUmVzZXQgTW9kZSAqLworUExMX1BXUlVQX01BU0s6CisJLndvcmQJMHhmZmZmZmZmZAkvKiBQTEwgUG93ZXIgdXAgTWFzayBCaXQgICovCitQTExfRElTQUJMRV9FTkFCTEVfTUFTSzoKKwkud29yZAkweGZmZmZmZmVmCS8qIEVuYWJsZSB0aGUgUExMIGZyb20gRGlzYWJsZSAqLworUExMX0xPQ0tfQ09VTlQ6CisJLndvcmQJMHgyMDAwCisKKy8qIFBMTDEtU1lTVEVNIFBMTCBNTVJzICovCitQTEwxX0NUTDoKKwkud29yZAkweDAxYzQwOTAwCitQTEwxX1BMTE06CisJLndvcmQJMHgwMWM0MDkxMAorCisvKiBQTEwyLVNZU1RFTSBQTEwgTU1ScyAqLworUExMMl9DVEw6CisJLndvcmQJMHgwMWM0MGQwMAorUExMMl9QTExNOgorCS53b3JkCTB4MDFjNDBkMTAKK1BMTDJfRElWMToKKwkud29yZAkweDAxYzQwZDE4CitQTEwyX0RJVjI6CisJLndvcmQJMHgwMWM0MGQxYworUExMMl9QTExDTUQ6CisJLndvcmQJMHgwMWM0MGQzOAorUExMMl9QTExTVEFUOgorCS53b3JkCTB4MDFjNDBkM2MKK1BMTDJfRElWX01BU0s6CisJLndvcmQJMHhmZmZmN2ZmZgorCitNTUFSR19CUkYwOgorCS53b3JkCTB4MDFjNDIwMTAJLyogQlJGIG1hcmdpbiBtb2RlIDAgKFIvVykqLworTU1BUkdfQlJGMF9WQUw6CisJLndvcmQJMHgwMDQ0NDQwMAorCitERFIyX1NUQVJUX0FERFI6CisJLndvcmQJMHg4MDAwMDAwMAorRFVNTVlfVkFMOgorCS53b3JkCTB4YTU1YWE1NWEKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9seHQ5NzIuYyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9seHQ5NzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWViNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2x4dDk3Mi5jCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogSW50ZWwgTFhUOTcxL0xYVDk3MiBQSFkgRHJpdmVyIGZvciBUSSBEYVZpbmNpCisgKiAoVE1TMzIwRE02NDR4KSBiYXNlZCBib2FyZHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPGx4dDk3MWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9lbWFjX2RlZnMuaD4KKworI2lmZGVmIENPTkZJR19EUklWRVJfVElfRU1BQworCisjaWZkZWYgQ09ORklHX0NNRF9ORVQKKworaW50IGx4dDk3Ml9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJaWQxLCBpZDI7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9DT01NT05fSUQxLCAmaWQxKSkKKwkJcmV0dXJuKDApOworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0NPTU1PTl9JRDIsICZpZDIpKQorCQlyZXR1cm4oMCk7CisKKwlpZiAoKGlkMSA9PSAoMHgwMDEzKSkgJiYgKChpZDIgICYgMHhmZmYwKSA9PSAweDc4ZTApKQorCQlyZXR1cm4oMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBseHQ5NzJfZ2V0X2xpbmtfc3BlZWQoaW50IHBoeV9hZGRyKQoreworCXVfaW50MTZfdAkJc3RhdDEsIHRtcDsKKwl2b2xhdGlsZSBlbWFjX3JlZ3MqCWVtYWMgPSAoZW1hY19yZWdzICopRU1BQ19CQVNFX0FERFI7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9MWFQ5NzFfU1RBVDIsICZzdGF0MSkpCisJCXJldHVybigwKTsKKworCWlmICghKHN0YXQxICYgUEhZX0xYVDk3MV9TVEFUMl9MSU5LKSkJLyogbGluayB1cD8gKi8KKwkJcmV0dXJuKDApOworCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBQSFlfTFhUOTcxX0RJR19DRkcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwl0bXAgfD0gUEhZX0xYVDk3MV9ESUdfQ0ZHX01JSV9EUklWRTsKKworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBQSFlfTFhUOTcxX0RJR19DRkcsIHRtcCk7CisJLyogUmVhZCBiYWNrICovCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBQSFlfTFhUOTcxX0RJR19DRkcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKworCS8qIFNwZWVkIGRvZXNuJ3QgbWF0dGVyLCB0aGVyZSBpcyBubyBzZXR0aW5nIGZvciBpdCBpbiBFTUFDLi4uICovCisJaWYgKHN0YXQxICYgUEhZX0xYVDk3MV9TVEFUMl8xMDBCVFgpIHsKKwkJaWYgKHN0YXQxICYgUEhZX0xYVDk3MV9TVEFUMl9EVVBMRVhfTU9ERSkgeworCQkJLyogc2V0IERNNjQ0eCBFTUFDIGZvciBGdWxsIER1cGxleCAgKi8KKwkJCWVtYWMtPk1BQ0NPTlRST0wgPSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFIHwgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFOworCQl9IGVsc2UgeworCQkJLypzZXQgRE02NDR4IEVNQUMgZm9yIEhhbGYgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEU7CisJCX0KKworCQlyZXR1cm4oMSk7CisJfSBlbHNlIHsKKwkJaWYgKHN0YXQxICYgUEhZX0xYVDk3MV9TVEFUMl9EVVBMRVhfTU9ERSkgeworCQkJLyogc2V0IERNNjQ0eCBFTUFDIGZvciBGdWxsIER1cGxleCAgKi8KKwkJCWVtYWMtPk1BQ0NPTlRST0wgPSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFIHwgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFOworCQl9IGVsc2UgeworCQkJLypzZXQgRE02NDR4IEVNQUMgZm9yIEhhbGYgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEU7CisJCX0KKworCQlyZXR1cm4oMSk7CisJfQorCisJcmV0dXJuKDApOworfQorCisKK2ludCBseHQ5NzJfaW5pdF9waHkoaW50IHBoeV9hZGRyKQoreworCWludAlyZXQgPSAxOworCisJaWYgKCFseHQ5NzJfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKSB7CisJCS8qIFRyeSBhbm90aGVyIHRpbWUgKi8KKwkJcmV0ID0gbHh0OTcyX2dldF9saW5rX3NwZWVkKHBoeV9hZGRyKTsKKwl9CisKKwkvKiBEaXNhYmxlIFBIWSBJbnRlcnJ1cHRzICovCisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIFBIWV9MWFQ5NzFfSU5UX0VOQUJMRSwgMCk7CisKKwlyZXR1cm4ocmV0KTsKK30KKworCitpbnQgbHh0OTcyX2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJdG1wOworCisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9DT01NT05fQ1RSTCwgJnRtcCkpCisJCXJldHVybigwKTsKKworCS8qIFJlc3RhcnQgQXV0b19uZWdvdGlhdGlvbiAgKi8KKwl0bXAgfD0gUEhZX0NPTU1PTl9DVFJMX1JFU19BVVRPOworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBQSFlfQ09NTU9OX0NUUkwsIHRtcCk7CisKKwkvKmNoZWNrIEF1dG9OZWdvdGlhdGUgY29tcGxldGUgKi8KKwl1ZGVsYXkgKDEwMDAwKTsKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9DT01NT05fU1RBVCwgJnRtcCkpCisJCXJldHVybigwKTsKKworCWlmICghKHRtcCAmIFBIWV9DT01NT05fU1RBVF9BTl9DT01QKSkKKwkJcmV0dXJuKDApOworCisJcmV0dXJuIChseHQ5NzJfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19DTURfTkVUICovCisKKyNlbmRpZgkvKiBDT05GSUdfRFJJVkVSX0VUSEVSICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvbmFuZC5jIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL25hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdiZTlmCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL25hbmQuYwpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIE5BTkQgZHJpdmVyIGZvciBUSSBEYVZpbmNpIGJhc2VkIGJvYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogQmFzZWQgb24gTGludXggRGFWaW5jaSBOQU5EIGRyaXZlciBieSBUSS4gT3JpZ2luYWwgY29weXJpZ2h0IGZvbGxvd3M6CisgKi8KKworLyoKKyAqCisgKiBsaW51eC9kcml2ZXJzL210ZC9uYW5kL25hbmRfZGF2aW5jaS5jCisgKgorICogTkFORCBGbGFzaCBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBPdmVydmlldzoKKyAqICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKKyAqICAgRGFWaW5jaSBib2FyZCB3aGljaCB1dGlsaXplcyB0aGUgU2Ftc3VuZyBrOWsyZzA4IHBhcnQuCisgKgorIE1vZGlmaWNhdGlvbnM6CisgdmVyLiAxLjA6IEZlYiAyMDA1LCBWaW5vZC9TdWRoYWthcgorIC0KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX1VTRV9OQU5ECisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorCisjaW5jbHVkZSA8bmFuZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL25hbmRfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2VtaWZfZGVmcy5oPgorCitleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOworCitzdGF0aWMgdm9pZCBuYW5kX2RhdmluY2lfaHdjb250cm9sKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kKQoreworCXN0cnVjdAkJbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXVfaW50MzJfdAlJT19BRERSX1cgPSAodV9pbnQzMl90KXRoaXMtPklPX0FERFJfVzsKKworCUlPX0FERFJfVyAmPSB+KE1BU0tfQUxFfE1BU0tfQ0xFKTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgTkFORF9DVExfU0VUQ0xFOgorCQkJSU9fQUREUl9XIHw9IE1BU0tfQ0xFOworCQkJYnJlYWs7CisJCWNhc2UgTkFORF9DVExfU0VUQUxFOgorCQkJSU9fQUREUl9XIHw9IE1BU0tfQUxFOworCQkJYnJlYWs7CisJfQorCisJdGhpcy0+SU9fQUREUl9XID0gKHZvaWQgKilJT19BRERSX1c7Cit9CisKKy8qIFNldCBXUCBvbiBkZXNlbGVjdCwgd3JpdGUgZW5hYmxlIG9uIHNlbGVjdCAqLworc3RhdGljIHZvaWQgbmFuZF9kYXZpbmNpX3NlbGVjdF9jaGlwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCkKK3sKKyNkZWZpbmUgR1BJT19TRVRfREFUQTAxCTB4MDFjNjcwMTgKKyNkZWZpbmUgR1BJT19DTFJfREFUQTAxCTB4MDFjNjcwMWMKKyNkZWZpbmUgR1BJT19OQU5EX1dQCSgxIDw8IDQpCisjaWZkZWYgU09OQVRBX0JPQVJEX0dQSU9XUAorCWlmIChjaGlwIDwgMCkgeworCQlSRUcoR1BJT19DTFJfREFUQTAxKSB8PSBHUElPX05BTkRfV1A7CisJfSBlbHNlIHsKKwkJUkVHKEdQSU9fU0VUX0RBVEEwMSkgfD0gR1BJT19OQU5EX1dQOworCX0KKyNlbmRpZgorfQorCisjaWZkZWYgQ0ZHX05BTkRfSFdfRUNDCisjaWZkZWYgQ0ZHX05BTkRfTEFSR0VQQUdFCitzdGF0aWMgc3RydWN0IG5hbmRfb29iaW5mbyBkYXZpbmNpX25hbmRfb29iaW5mbyA9IHsKKwkudXNlZWNjID0gTVREX05BTkRFQ0NfQVVUT1BMQUNFLAorCS5lY2NieXRlcyA9IDEyLAorCS5lY2Nwb3MgPSB7OCwgOSwgMTAsIDI0LCAyNSwgMjYsIDQwLCA0MSwgNDIsIDU2LCA1NywgNTh9LAorCS5vb2JmcmVlID0geyB7MiwgNn0sIHsxMiwgMTJ9LCB7MjgsIDEyfSwgezQ0LCAxMn0sIHs2MCwgNH0gfQorfTsKKyNlbGlmIGRlZmluZWQoQ0ZHX05BTkRfU01BTExQQUdFKQorc3RhdGljIHN0cnVjdCBuYW5kX29vYmluZm8gZGF2aW5jaV9uYW5kX29vYmluZm8gPSB7CisJLnVzZWVjYyA9IE1URF9OQU5ERUNDX0FVVE9QTEFDRSwKKwkuZWNjYnl0ZXMgPSAzLAorCS5lY2Nwb3MgPSB7MCwgMSwgMn0sCisJLm9vYmZyZWUgPSB7IHs2LCAyfSwgezgsIDh9IH0KK307CisjZWxzZQorI2Vycm9yICJFaXRoZXIgQ0ZHX05BTkRfTEFSR0VQQUdFIG9yIENGR19OQU5EX1NNQUxMUEFHRSBtdXN0IGJlIGRlZmluZWQhIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG5hbmRfZGF2aW5jaV9lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQoreworCWVtaWZyZWdzCWVtaWZfYWRkcjsKKwlpbnQJCWR1bW15OworCisJZW1pZl9hZGRyID0gKGVtaWZyZWdzKURBVklOQ0lfQVNZTkNfRU1JRl9DTlRSTF9CQVNFOworCisJZHVtbXkgPSBlbWlmX2FkZHItPk5BTkRGMUVDQzsKKwlkdW1teSA9IGVtaWZfYWRkci0+TkFOREYyRUNDOworCWR1bW15ID0gZW1pZl9hZGRyLT5OQU5ERjNFQ0M7CisJZHVtbXkgPSBlbWlmX2FkZHItPk5BTkRGNEVDQzsKKworCWVtaWZfYWRkci0+TkFOREZDUiB8PSAoMSA8PCA4KTsKK30KKworc3RhdGljIHVfaW50MzJfdCBuYW5kX2RhdmluY2lfcmVhZGVjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9pbnQzMl90IHJlZ2lvbikKK3sKKwl1X2ludDMyX3QJZWNjID0gMDsKKwllbWlmcmVncwllbWlmX2Jhc2VfYWRkcjsKKworCWVtaWZfYmFzZV9hZGRyID0gKGVtaWZyZWdzKURBVklOQ0lfQVNZTkNfRU1JRl9DTlRSTF9CQVNFOworCisJaWYgKHJlZ2lvbiA9PSAxKQorCQllY2MgPSBlbWlmX2Jhc2VfYWRkci0+TkFOREYxRUNDOworCWVsc2UgaWYgKHJlZ2lvbiA9PSAyKQorCQllY2MgPSBlbWlmX2Jhc2VfYWRkci0+TkFOREYyRUNDOworCWVsc2UgaWYgKHJlZ2lvbiA9PSAzKQorCQllY2MgPSBlbWlmX2Jhc2VfYWRkci0+TkFOREYzRUNDOworCWVsc2UgaWYgKHJlZ2lvbiA9PSA0KQorCQllY2MgPSBlbWlmX2Jhc2VfYWRkci0+TkFOREY0RUNDOworCisJcmV0dXJuKGVjYyk7Cit9CisKK3N0YXRpYyBpbnQgbmFuZF9kYXZpbmNpX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQoreworCXVfaW50MzJfdAkJdG1wOworCWludAkJCXJlZ2lvbiwgbjsKKwlzdHJ1Y3QgbmFuZF9jaGlwCSp0aGlzID0gbXRkLT5wcml2OworCisJbiA9ICh0aGlzLT5lY2Ntb2RlID09IE5BTkRfRUNDX0hXMTJfMjA0OCkgPyA0IDogMTsKKworCXJlZ2lvbiA9IDE7CisJd2hpbGUgKG4tLSkgeworCQl0bXAgPSBuYW5kX2RhdmluY2lfcmVhZGVjYyhtdGQsIHJlZ2lvbik7CisJCSplY2NfY29kZSsrID0gdG1wOworCQkqZWNjX2NvZGUrKyA9IHRtcCA+PiAxNjsKKwkJKmVjY19jb2RlKysgPSAoKHRtcCA+PiA4KSAmIDB4MGYpIHwgKCh0bXAgPj4gMjApICYgMHhmMCk7CisJCXJlZ2lvbisrOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIG5hbmRfZGF2aW5jaV9nZW5fdHJ1ZV9lY2ModV9pbnQ4X3QgKmVjY19idWYpCit7CisJdV9pbnQzMl90CXRtcCA9IGVjY19idWZbMF0gfCAoZWNjX2J1ZlsxXSA8PCAxNikgfCAoKGVjY19idWZbMl0gJiAweGYwKSA8PCAyMCkgfCAoKGVjY19idWZbMl0gJiAweDBmKSA8PCA4KTsKKworCWVjY19idWZbMF0gPSB+KFA2NG8odG1wKSB8IFA2NGUodG1wKSB8IFAzMm8odG1wKSB8IFAzMmUodG1wKSB8IFAxNm8odG1wKSB8IFAxNmUodG1wKSB8IFA4byh0bXApIHwgUDhlKHRtcCkpOworCWVjY19idWZbMV0gPSB+KFAxMDI0byh0bXApIHwgUDEwMjRlKHRtcCkgfCBQNTEybyh0bXApIHwgUDUxMmUodG1wKSB8IFAyNTZvKHRtcCkgfCBQMjU2ZSh0bXApIHwgUDEyOG8odG1wKSB8IFAxMjhlKHRtcCkpOworCWVjY19idWZbMl0gPSB+KCBQNG8odG1wKSB8IFA0ZSh0bXApIHwgUDJvKHRtcCkgfCBQMmUodG1wKSB8IFAxbyh0bXApIHwgUDFlKHRtcCkgfCBQMjA0OG8odG1wKSB8IFAyMDQ4ZSh0bXApKTsKK30KKworc3RhdGljIGludCBuYW5kX2RhdmluY2lfY29tcGFyZV9lY2ModV9pbnQ4X3QgKmVjY19uYW5kLCB1X2ludDhfdCAqZWNjX2NhbGMsIHVfaW50OF90ICpwYWdlX2RhdGEpCit7CisJdV9pbnQzMl90CWk7CisJdV9pbnQ4X3QJdG1wMF9iaXRbOF0sIHRtcDFfYml0WzhdLCB0bXAyX2JpdFs4XTsKKwl1X2ludDhfdAljb21wMF9iaXRbOF0sIGNvbXAxX2JpdFs4XSwgY29tcDJfYml0WzhdOworCXVfaW50OF90CWVjY19iaXRbMjRdOworCXVfaW50OF90CWVjY19zdW0gPSAwOworCXVfaW50OF90CWZpbmRfYml0ID0gMDsKKwl1X2ludDMyX3QJZmluZF9ieXRlID0gMDsKKwlpbnQJCWlzX2VjY19mZjsKKworCWlzX2VjY19mZiA9ICgoKmVjY19uYW5kID09IDB4ZmYpICYmICgqKGVjY19uYW5kICsgMSkgPT0gMHhmZikgJiYgKCooZWNjX25hbmQgKyAyKSA9PSAweGZmKSk7CisKKwluYW5kX2RhdmluY2lfZ2VuX3RydWVfZWNjKGVjY19uYW5kKTsKKwluYW5kX2RhdmluY2lfZ2VuX3RydWVfZWNjKGVjY19jYWxjKTsKKworCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKSB7CisJCSooZWNjX25hbmQgKyBpKSA9IH4oKihlY2NfbmFuZCArIGkpKTsKKwkJKihlY2NfY2FsYyArIGkpID0gfigqKGVjY19jYWxjICsgaSkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdG1wMF9iaXRbaV0gPSAqZWNjX25hbmQgJSAyOworCQkqZWNjX25hbmQgPSAqZWNjX25hbmQgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdG1wMV9iaXRbaV0gPSAqKGVjY19uYW5kICsgMSkgJSAyOworCQkqKGVjY19uYW5kICsgMSkgPSAqKGVjY19uYW5kICsgMSkgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdG1wMl9iaXRbaV0gPSAqKGVjY19uYW5kICsgMikgJSAyOworCQkqKGVjY19uYW5kICsgMikgPSAqKGVjY19uYW5kICsgMikgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJY29tcDBfYml0W2ldID0gKmVjY19jYWxjICUgMjsKKwkJKmVjY19jYWxjID0gKmVjY19jYWxjIC8gMjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWNvbXAxX2JpdFtpXSA9ICooZWNjX2NhbGMgKyAxKSAlIDI7CisJCSooZWNjX2NhbGMgKyAxKSA9ICooZWNjX2NhbGMgKyAxKSAvIDI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQljb21wMl9iaXRbaV0gPSAqKGVjY19jYWxjICsgMikgJSAyOworCQkqKGVjY19jYWxjICsgMikgPSAqKGVjY19jYWxjICsgMikgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGk8IDY7IGkrKykKKwkJZWNjX2JpdFtpXSA9IHRtcDJfYml0W2kgKyAyXSBeIGNvbXAyX2JpdFtpICsgMl07CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQllY2NfYml0W2kgKyA2XSA9IHRtcDBfYml0W2ldIF4gY29tcDBfYml0W2ldOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJZWNjX2JpdFtpICsgMTRdID0gdG1wMV9iaXRbaV0gXiBjb21wMV9iaXRbaV07CisKKwllY2NfYml0WzIyXSA9IHRtcDJfYml0WzBdIF4gY29tcDJfYml0WzBdOworCWVjY19iaXRbMjNdID0gdG1wMl9iaXRbMV0gXiBjb21wMl9iaXRbMV07CisKKwlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykKKwkJZWNjX3N1bSArPSBlY2NfYml0W2ldOworCisJc3dpdGNoIChlY2Nfc3VtKSB7CisJCWNhc2UgMDoKKwkJCS8qIE5vdCByZWFjaGVkIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIGlmCisJCQkgICBFQ0MgdmFsdWVzIGFyZSBlcXVhbCAqLworCQkJcmV0dXJuIDA7CisJCWNhc2UgMToKKwkJCS8qIFVuY29ycmVjdGFibGUgZXJyb3IgKi8KKwkJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAiRUNDIFVOQ09SUkVDVEVEX0VSUk9SIDFcbiIpOworCQkJcmV0dXJuKC0xKTsKKwkJY2FzZSAxMjoKKwkJCS8qIENvcnJlY3RhYmxlIGVycm9yICovCisJCQlmaW5kX2J5dGUgPSAoZWNjX2JpdFsyM10gPDwgOCkgKworCQkJCShlY2NfYml0WzIxXSA8PCA3KSArCisJCQkJKGVjY19iaXRbMTldIDw8IDYpICsKKwkJCQkoZWNjX2JpdFsxN10gPDwgNSkgKworCQkJCShlY2NfYml0WzE1XSA8PCA0KSArCisJCQkJKGVjY19iaXRbMTNdIDw8IDMpICsKKwkJCQkoZWNjX2JpdFsxMV0gPDwgMikgKworCQkJCShlY2NfYml0WzldICA8PCAxKSArCisJCQkJZWNjX2JpdFs3XTsKKworCQkJZmluZF9iaXQgPSAoZWNjX2JpdFs1XSA8PCAyKSArIChlY2NfYml0WzNdIDw8IDEpICsgZWNjX2JpdFsxXTsKKworCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJDb3JyZWN0aW5nIHNpbmdsZSBiaXQgRUNDIGVycm9yIGF0IG9mZnNldDogJWQsIGJpdDogJWRcbiIsIGZpbmRfYnl0ZSwgZmluZF9iaXQpOworCisJCQlwYWdlX2RhdGFbZmluZF9ieXRlXSBePSAoMSA8PCBmaW5kX2JpdCk7CisKKwkJCXJldHVybigwKTsKKwkJZGVmYXVsdDoKKwkJCWlmIChpc19lY2NfZmYpIHsKKwkJCQlpZiAoZWNjX2NhbGNbMF0gPT0gMCAmJiBlY2NfY2FsY1sxXSA9PSAwICYmIGVjY19jYWxjWzJdID09IDApCisJCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAiVU5DT1JSRUNURURfRVJST1IgZGVmYXVsdFxuIik7CisJCQlyZXR1cm4oLTEpOworCX0KK30KKworc3RhdGljIGludCBuYW5kX2RhdmluY2lfY29ycmVjdF9kYXRhKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYykKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwCSp0aGlzOworCWludAkJCWJsb2NrX2NvdW50ID0gMCwgaSwgcmM7CisKKwl0aGlzID0gbXRkLT5wcml2OworCWJsb2NrX2NvdW50ID0gKHRoaXMtPmVjY21vZGUgPT0gTkFORF9FQ0NfSFcxMl8yMDQ4KSA/IDQgOiAxOworCWZvciAoaSA9IDA7IGkgPCBibG9ja19jb3VudDsgaSsrKSB7CisJCWlmIChtZW1jbXAocmVhZF9lY2MsIGNhbGNfZWNjLCAzKSAhPSAwKSB7CisJCQlyYyA9IG5hbmRfZGF2aW5jaV9jb21wYXJlX2VjYyhyZWFkX2VjYywgY2FsY19lY2MsIGRhdCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcmV0dXJuKHJjKTsKKwkJCX0KKwkJfQorCQlyZWFkX2VjYyArPSAzOworCQljYWxjX2VjYyArPSAzOworCQlkYXQgKz0gNTEyOworCX0KKwlyZXR1cm4oMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBuYW5kX2RhdmluY2lfZGV2X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCWVtaWZyZWdzCWVtaWZfYWRkcjsKKworCWVtaWZfYWRkciA9IChlbWlmcmVncylEQVZJTkNJX0FTWU5DX0VNSUZfQ05UUkxfQkFTRTsKKworCXJldHVybihlbWlmX2FkZHItPk5BTkRGU1IgJiAweDEpOworfQorCitzdGF0aWMgaW50IG5hbmRfZGF2aW5jaV93YWl0ZnVuYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgaW50IHN0YXRlKQoreworCXdoaWxlKCFuYW5kX2RhdmluY2lfZGV2X3JlYWR5KG10ZCkpIHs7fQorCSpOQU5EX0NFMENMRSA9IE5BTkRfU1RBVFVTOworCXJldHVybigqTkFORF9DRTBEQVRBKTsKK30KKworc3RhdGljIHZvaWQgbmFuZF9mbGFzaF9pbml0KHZvaWQpCit7CisJdV9pbnQzMl90CWFjZmcxID0gMHgzZmZmZmZmYzsKKwl1X2ludDMyX3QJYWNmZzIgPSAweDNmZmZmZmZjOworCXVfaW50MzJfdAlhY2ZnMyA9IDB4M2ZmZmZmZmM7CisJdV9pbnQzMl90CWFjZmc0ID0gMHgzZmZmZmZmYzsKKwllbWlmcmVncwllbWlmX3JlZ3M7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiAgTkFORCBGTEFTSCBDSElQIFRJTUVPVVQgQCA0NTkgTUh6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgQUVNSUYuQ0xLIGZyZXEgICA9IFBMTDEvNiA9IDQ1OS82ID0gNzYuNSBNSHogICAgICAgICAgICAgICAgICAgICoKKwkgKiAgQUVNSUYuQ0xLIHBlcmlvZCA9IDEvNzYuNSBNSHogPSAxMy4xIG5zICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJIGFjZmcxID0gMAorCSAJfCAoMCA8PCAzMSApCS8qIHNlbGVjdFN0cm9iZSAqLworCSAJfCAoMCA8PCAzMCApCS8qIGV4dFdhaXQgKi8KKwkgCXwgKDEgPDwgMjYgKQkvKiB3cml0ZVNldHVwCTEwIG5zICovCisJIAl8ICgzIDw8IDIwICkJLyogd3JpdGVTdHJvYmUJNDAgbnMgKi8KKwkgCXwgKDEgPDwgMTcgKQkvKiB3cml0ZUhvbGQJMTAgbnMgKi8KKwkgCXwgKDEgPDwgMTMgKQkvKiByZWFkU2V0dXAJMTAgbnMgKi8KKwkgCXwgKDUgPDwgNyApCS8qIHJlYWRTdHJvYmUJNjAgbnMgKi8KKwkgCXwgKDEgPDwgNCApCS8qIHJlYWRIb2xkCTEwIG5zICovCisJIAl8ICgzIDw8IDIgKQkvKiB0dXJuQXJvdW5kCT8/IG5zICovCisJIAl8ICgwIDw8IDAgKQkvKiBhc3luY1NpemUJOC1iaXQgYnVzICovCisJIAk7CisKKwllbWlmX3JlZ3MgPSAoZW1pZnJlZ3MpREFWSU5DSV9BU1lOQ19FTUlGX0NOVFJMX0JBU0U7CisKKwllbWlmX3JlZ3MtPkFXQ0NSIHw9IDB4MTAwMDAwMDA7CisJZW1pZl9yZWdzLT5BQjFDUiA9IGFjZmcxOwkvKiAweDA4MjQ0MTI4ICovOworCWVtaWZfcmVncy0+QUIyQ1IgPSBhY2ZnMjsKKwllbWlmX3JlZ3MtPkFCM0NSID0gYWNmZzM7CisJZW1pZl9yZWdzLT5BQjRDUiA9IGFjZmc0OworCWVtaWZfcmVncy0+TkFOREZDUiA9IDB4MDAwMDAxMDE7Cit9CisKK2ludCBib2FyZF9uYW5kX2luaXQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKK3sKKwluYW5kLT5JT19BRERSX1IgICA9ICh2b2lkICBfX2lvbWVtICopTkFORF9DRTBEQVRBOworCW5hbmQtPklPX0FERFJfVyAgID0gKHZvaWQgIF9faW9tZW0gKilOQU5EX0NFMERBVEE7CisJbmFuZC0+Y2hpcF9kZWxheSAgPSAwOworCW5hbmQtPnNlbGVjdF9jaGlwID0gbmFuZF9kYXZpbmNpX3NlbGVjdF9jaGlwOworI2lmZGVmIENGR19OQU5EX1VTRV9GTEFTSF9CQlQKKwluYW5kLT5vcHRpb25zCSAgPSBOQU5EX1VTRV9GTEFTSF9CQlQ7CisjZW5kaWYKKyNpZmRlZiBDRkdfTkFORF9IV19FQ0MKKyNpZmRlZiBDRkdfTkFORF9MQVJHRVBBR0UKKwluYW5kLT5lY2Ntb2RlICAgICA9IE5BTkRfRUNDX0hXMTJfMjA0ODsKKyNlbGlmIGRlZmluZWQoQ0ZHX05BTkRfU01BTExQQUdFKQorCW5hbmQtPmVjY21vZGUgICAgID0gTkFORF9FQ0NfSFczXzUxMjsKKyNlbHNlCisjZXJyb3IgIkVpdGhlciBDRkdfTkFORF9MQVJHRVBBR0Ugb3IgQ0ZHX05BTkRfU01BTExQQUdFIG11c3QgYmUgZGVmaW5lZCEiCisjZW5kaWYKKwluYW5kLT5hdXRvb29iCSAgPSAmZGF2aW5jaV9uYW5kX29vYmluZm87CisJbmFuZC0+Y2FsY3VsYXRlX2VjYyA9IG5hbmRfZGF2aW5jaV9jYWxjdWxhdGVfZWNjOworCW5hbmQtPmNvcnJlY3RfZGF0YSAgPSBuYW5kX2RhdmluY2lfY29ycmVjdF9kYXRhOworCW5hbmQtPmVuYWJsZV9od2VjYyAgPSBuYW5kX2RhdmluY2lfZW5hYmxlX2h3ZWNjOworI2Vsc2UKKwluYW5kLT5lY2Ntb2RlICAgICA9IE5BTkRfRUNDX1NPRlQ7CisjZW5kaWYKKworCS8qIFNldCBhZGRyZXNzIG9mIGhhcmR3YXJlIGNvbnRyb2wgZnVuY3Rpb24gKi8KKwluYW5kLT5od2NvbnRyb2wgPSBuYW5kX2RhdmluY2lfaHdjb250cm9sOworCisJbmFuZC0+ZGV2X3JlYWR5ID0gbmFuZF9kYXZpbmNpX2Rldl9yZWFkeTsKKwluYW5kLT53YWl0ZnVuYyA9IG5hbmRfZGF2aW5jaV93YWl0ZnVuYzsKKworCW5hbmRfZmxhc2hfaW5pdCgpOworCisJcmV0dXJuKDApOworfQorCisjZWxzZQorI2Vycm9yICJVLUJvb3QgbGVnYWN5IE5BTkQgc3VwcG9ydCBub3QgYXZhaWxhYmxlIGZvciBEYVZpbmNpIGNoaXBzIgorI2VuZGlmCisjZW5kaWYJLyogQ0ZHX1VTRV9OQU5EICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvcmVzZXQuUyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9yZXNldC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODdkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvcmVzZXQuUwpAQCAtMCwwICsxLDc3IEBACisvKgorICogUHJvY2Vzc29yIHJlc2V0IHVzaW5nIFdEVCBmb3IgVEkgVE1TMzIwRE02NDR4IFNvQy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisuZ2xvYmwgcmVzZXRfY3B1CityZXNldF9jcHU6CisJbGRyCXIwLCBXRFRfVEdDUgorCW1vdglyMSwgJDB4MDgKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjEsIFtyMF0KKwlvcnIJcjEsIHIxLCAkMHgwMworCXN0cglyMSwgW3IwXQorCW1vdglyMSwgJDAKKwlsZHIJcjAsIFdEVF9USU0xMgorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgV0RUX1RJTTM0CisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCBXRFRfUFJEMTIKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjAsIFdEVF9QUkQzNAorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgV0RUX1RDUgorCWxkcglyMSwgW3IwXQorCW9ycglyMSwgcjEsICQweDQwCisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCBXRFRfV0RUQ1IKKwlsZHIJcjEsIFtyMF0KKwlvcnIJcjEsIHIxLCAkMHg0MDAwCisJc3RyCXIxLCBbcjBdCisJbGRyCXIxLCBXRFRDUl9WQUwxCisJc3RyCXIxLCBbcjBdCisJbGRyCXIxLCBXRFRDUl9WQUwyCisJc3RyCXIxLCBbcjBdCisJbm9wCisJbm9wCisJbm9wCisJbm9wCityZXNldF9jcHVfbG9vcDoKKwliCXJlc2V0X2NwdV9sb29wCisKK1dEVF9UR0NSOgorCS53b3JkCTB4MDFjMjFjMjQKK1dEVF9USU0xMjoKKwkud29yZAkweDAxYzIxYzEwCitXRFRfVElNMzQ6CisJLndvcmQJMHgwMWMyMWMxNAorV0RUX1BSRDEyOgorCS53b3JkCTB4MDFjMjFjMTgKK1dEVF9QUkQzNDoKKwkud29yZAkweDAxYzIxYzFjCitXRFRfVENSOgorCS53b3JkCTB4MDFjMjFjMjAKK1dEVF9XRFRDUjoKKwkud29yZAkweDAxYzIxYzI4CitXRFRDUl9WQUwxOgorCS53b3JkCTB4YTVjNjQwMDAKK1dEVENSX1ZBTDI6CisJLndvcmQJMHhkYTdlNDAwMApkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL3RpbWVyLmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmIxZGRhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL3RpbWVyLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFRleGFzIEluc3RydW1lbnRzIDx3d3cudGkuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyLTIwMDQKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBoaWxpcHBlIFJvYmluLCBBUk0gTHRkLiA8cGhpbGlwcGUucm9iaW5AYXJtLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFybTkyNmVqcy5oPgorCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB7CisJdV9pbnQzMl90CXBpZDEyOworCXVfaW50MzJfdAllbXVtZ3RfY2xrc3BlZDsKKwl1X2ludDMyX3QJZ3BpbnRfZW47CisJdV9pbnQzMl90CWdwZGlyX2RhdDsKKwl1X2ludDMyX3QJdGltMTI7CisJdV9pbnQzMl90CXRpbTM0OworCXVfaW50MzJfdAlwcmQxMjsKKwl1X2ludDMyX3QJcHJkMzQ7CisJdV9pbnQzMl90CXRjcjsKKwl1X2ludDMyX3QJdGdjcjsKKwl1X2ludDMyX3QJd2R0Y3I7CisJdV9pbnQzMl90CXRsZ2M7CisJdV9pbnQzMl90CXRsbXI7Cit9IGRhdmluY2lfdGltZXI7CisKK2RhdmluY2lfdGltZXIJCSp0aW1lciA9IChkYXZpbmNpX3RpbWVyICopQ0ZHX1RJTUVSQkFTRTsKKworI2RlZmluZSBUSU1FUl9MT0FEX1ZBTAkoQ0ZHX0haX0NMT0NLIC8gQ0ZHX0haKQorI2RlZmluZSBSRUFEX1RJTUVSCXRpbWVyLT50aW0zNAorCitzdGF0aWMgdWxvbmcgdGltZXN0YW1wOworc3RhdGljIHVsb25nIGxhc3RpbmM7CisKK2ludCB0aW1lcl9pbml0KHZvaWQpCit7CisJLyogV2UgYXJlIHVzaW5nIHRpbWVyMzQgaW4gdW5jaGFpbmVkIDMyLWJpdCBtb2RlLCBmdWxsIHNwZWVkICovCisJdGltZXItPnRjciA9IDB4MDsKKwl0aW1lci0+dGdjciA9IDB4MDsKKwl0aW1lci0+dGdjciA9IDB4MDY7CisJdGltZXItPnRpbTM0ID0gMHgwOworCXRpbWVyLT5wcmQzNCA9IFRJTUVSX0xPQURfVkFMOworCWxhc3RpbmMgPSAwOworCXRpbWVyLT50Y3IgPSAweDgwIDw8IDE2OworCXRpbWVzdGFtcCA9IDA7CisKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgcmVzZXRfdGltZXIodm9pZCkKK3sKKwlyZXNldF90aW1lcl9tYXNrZWQoKTsKK30KKwordWxvbmcgZ2V0X3RpbWVyKHVsb25nIGJhc2UpCit7CisJcmV0dXJuKGdldF90aW1lcl9tYXNrZWQoKSAtIGJhc2UpOworfQorCit2b2lkIHNldF90aW1lcih1bG9uZyB0KQoreworCXRpbWVzdGFtcCA9IHQ7Cit9CisKK3ZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKwl1ZGVsYXlfbWFza2VkKHVzZWMpOworfQorCit2b2lkIHJlc2V0X3RpbWVyX21hc2tlZCh2b2lkKQoreworCWxhc3RpbmMgPSBSRUFEX1RJTUVSOworCXRpbWVzdGFtcCA9IDA7Cit9CisKK3Vsb25nIGdldF90aW1lcl9yYXcodm9pZCkKK3sKKwl1bG9uZyBub3cgPSBSRUFEX1RJTUVSOworCisJaWYgKG5vdyA+PSBsYXN0aW5jKSB7CisJCS8qIG5vcm1hbCBtb2RlICovCisJCXRpbWVzdGFtcCArPSBub3cgLSBsYXN0aW5jOworCX0gZWxzZSB7CisJCS8qIG92ZXJmbG93IC4uLiAqLworCQl0aW1lc3RhbXAgKz0gbm93ICsgVElNRVJfTE9BRF9WQUwgLSBsYXN0aW5jOworCX0KKwlsYXN0aW5jID0gbm93OworCXJldHVybiB0aW1lc3RhbXA7Cit9CisKK3Vsb25nIGdldF90aW1lcl9tYXNrZWQodm9pZCkKK3sKKwlyZXR1cm4oZ2V0X3RpbWVyX3JhdygpIC8gVElNRVJfTE9BRF9WQUwpOworfQorCit2b2lkIHVkZWxheV9tYXNrZWQodW5zaWduZWQgbG9uZyB1c2VjKQoreworCXVsb25nIHRtbzsKKwl1bG9uZyBlbmR0aW1lOworCXNpZ25lZCBsb25nIGRpZmY7CisKKwl0bW8gPSBDRkdfSFpfQ0xPQ0sgLyAxMDAwOworCXRtbyAqPSB1c2VjOworCXRtbyAvPSAxMDAwOworCisJZW5kdGltZSA9IGdldF90aW1lcl9yYXcoKSArIHRtbzsKKworCWRvIHsKKwkJdWxvbmcgbm93ID0gZ2V0X3RpbWVyX3JhdygpOworCQlkaWZmID0gZW5kdGltZSAtIG5vdzsKKwl9IHdoaWxlIChkaWZmID49IDApOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gUG93ZXJQQyBjb2RlIChyZWFkIHRpbWViYXNlIGFzIGxvbmcgbG9uZykuCisgKiBPbiBBUk0gaXQganVzdCByZXR1cm5zIHRoZSB0aW1lciB2YWx1ZS4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIGdldF90aWNrcyh2b2lkKQoreworCXJldHVybihnZXRfdGltZXIoMCkpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gUG93ZXJQQyBjb2RlICh0aW1lYmFzZSBjbG9jayBmcmVxdWVuY3kpLgorICogT24gQVJNIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiB0aW1lciB0aWNrcyBwZXIgc2Vjb25kLgorICovCit1bG9uZyBnZXRfdGJjbGsodm9pZCkKK3sKKwl1bG9uZyB0YmNsazsKKworCXRiY2xrID0gQ0ZHX0haOworCXJldHVybih0YmNsayk7Cit9CmRpZmYgLS1naXQgYS9jcHUvYXQzMmFwL2F0bWVsX21jaS5jIGIvY3B1L2F0MzJhcC9hdG1lbF9tY2kuYwppbmRleCA5ZjYyYzBmLi5jZjQ4YmUxIDEwMDY0NAotLS0gYS9jcHUvYXQzMmFwL2F0bWVsX21jaS5jCisrKyBiL2NwdS9hdDMyYXAvYXRtZWxfbWNpLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNkZWZpbmUgTU1DX0RFRkFVTFRfUkNBCQkxCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbW1jX3JjYTsKK3N0YXRpYyBpbnQgbW1jX2NhcmRfaXNfc2Q7CiBzdGF0aWMgYmxvY2tfZGV2X2Rlc2NfdCBtbWNfYmxrZGV2OwogCiBibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KQpAQCAtODIsNyArODMsOSBAQAogCiAJYmxrbGVuICY9IDB4ZmZmYzsKIAltbWNpX3dyaXRlbChNUiwgKE1NQ0lfQkYoQ0xLRElWLCBjbGtkaXYpCi0JCQkgfCBNTUNJX0JGKEJMS0xFTiwgYmxrbGVuKSkpOworCQkJIHwgTU1DSV9CRihCTEtMRU4sIGJsa2xlbikKKwkJCSB8IE1NQ0lfQklUKFJEUFJPT0YpCisJCQkgfCBNTUNJX0JJVChXUlBST09GKSkpOwogfQogCiAjZGVmaW5lIFJFU1BfTk9fQ1JDCTEKQEAgLTIyNSw3ICsyMjgsNyBAQAogCQkJCSpidWZmZXIrKyA9IGRhdGE7CiAJCQkJd29yZGNvdW50Kys7CiAJCQl9Ci0JCX0gd2hpbGUod29yZGNvdW50IDwgKDUxMiAvIDQpKTsKKwkJfSB3aGlsZSh3b3JkY291bnQgPCAobW1jX2Jsa2Rldi5ibGtzeiAvIDQpKTsKIAogCQlwcl9kZWJ1ZygibW1jOiByZWFkICV1IHdvcmRzLCB3YWl0aW5nIGZvciBCTEtFXG4iLCB3b3JkY291bnQpOwogCkBAIC0yNDMsNyArMjQ2LDcgQEAKIAogZmFpbDoKIAltbWNfY21kKE1NQ19DTURfU0VORF9TVEFUVVMsIG1tY19yY2EgPDwgMTYsICZjYXJkX3N0YXR1cywgUjEgfCBOQ1IpOwotCXByaW50ZigibW1jOiBicmVhZCBmYWlsZWQsIGNhcmQgc3RhdHVzID0gIiwgY2FyZF9zdGF0dXMpOworCXByaW50ZigibW1jOiBicmVhZCBmYWlsZWQsIGNhcmQgc3RhdHVzID0gJTA4eFxuIiwgY2FyZF9zdGF0dXMpOwogCWdvdG8gb3V0OwogfQogCkBAIC0zNzEsNiArMzc0LDcgQEAKIAltbWNfcmNhID0gcmVzcFswXSA+PiAxNjsKIAlpZiAodmVyYm9zZSkKIAkJcHJpbnRmKCJTRCBDYXJkIGRldGVjdGVkIChSQ0EgJXUpXG4iLCBtbWNfcmNhKTsKKwltbWNfY2FyZF9pc19zZCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwNSwxMCArNDA5LDY0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgbWNpX3NldF9kYXRhX3RpbWVvdXQoc3RydWN0IG1tY19jc2QgKmNzZCkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR0b211bF90b19zaGlmdFtdID0geworCQkwLCA0LCA3LCA4LCAxMCwgMTIsIDE2LCAyMCwKKwl9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGFhY19leHBbXSA9IHsKKwkJMSwgMTAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCwgMTAwMDAwMDAsCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRhYWNfbWFudFtdID0geworCQkwLCAgMTAsIDEyLCAxMywgMTUsIDYwLCAyNSwgMzAsCisJCTM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDcwLCA4MCwKKwl9OworCXVuc2lnbmVkIGludCB0aW1lb3V0X25zLCB0aW1lb3V0X2Nsa3M7CisJdW5zaWduZWQgaW50IGUsIG07CisJdW5zaWduZWQgaW50IGR0b2N5YywgZHRvbXVsOworCXVuc2lnbmVkIGludCBzaGlmdDsKKwl1MzIgZHRvcjsKKworCWUgPSBjc2QtPnRhYWMgJiAweDA3OworCW0gPSAoY3NkLT50YWFjID4+IDMpICYgMHgwZjsKKworCXRpbWVvdXRfbnMgPSAodGFhY19leHBbZV0gKiB0YWFjX21hbnRbbV0gKyA5KSAvIDEwOworCXRpbWVvdXRfY2xrcyA9IGNzZC0+bnNhYyAqIDEwMDsKKworCXRpbWVvdXRfY2xrcyArPSAoKCh0aW1lb3V0X25zICsgOSkgLyAxMCkKKwkJCSAqICgoQ0ZHX01NQ19DTEtfUFAgKyA5OTk5OSkgLyAxMDAwMDApICsgOTk5OSkgLyAxMDAwMDsKKwlpZiAoIW1tY19jYXJkX2lzX3NkKQorCQl0aW1lb3V0X2Nsa3MgKj0gMTA7CisJZWxzZQorCQl0aW1lb3V0X2Nsa3MgKj0gMTAwOworCisJZHRvY3ljID0gdGltZW91dF9jbGtzOworCWR0b211bCA9IDA7CisJd2hpbGUgKGR0b2N5YyA+IDE1ICYmIGR0b211bCA8IDgpIHsKKwkJZHRvbXVsKys7CisJCXNoaWZ0ID0gZHRvbXVsX3RvX3NoaWZ0W2R0b211bF07CisJCWR0b2N5YyA9ICh0aW1lb3V0X2Nsa3MgKyAoMSA8PCBzaGlmdCkgLSAxKSA+PiBzaGlmdDsKKwl9CisKKwlpZiAoZHRvbXVsID49IDgpIHsKKwkJZHRvbXVsID0gNzsKKwkJZHRvY3ljID0gMTU7CisJCXB1dHMoIldhcm5pbmc6IFVzaW5nIG1heGltdW0gZGF0YSB0aW1lb3V0XG4iKTsKKwl9CisKKwlkdG9yID0gKE1NQ0lfQkYoRFRPTVVMLCBkdG9tdWwpCisJCXwgTU1DSV9CRihEVE9DWUMsIGR0b2N5YykpOworCW1tY2lfd3JpdGVsKERUT1IsIGR0b3IpOworCisJcHJpbnRmKCJtbWM6IFVzaW5nICV1IGN5Y2xlcyBkYXRhIHRpbWVvdXQgKERUT1I9MHgleClcbiIsCisJICAgICAgIGR0b2N5YyA8PCBzaGlmdCwgZHRvcik7Cit9CisKIGludCBtbWNfaW5pdChpbnQgdmVyYm9zZSkKIHsKIAlzdHJ1Y3QgbW1jX2NpZCBjaWQ7CiAJc3RydWN0IG1tY19jc2QgY3NkOworCXVuc2lnbmVkIGludCBtYXhfYmxrc3o7CiAJaW50IHJldDsKIAogCS8qIEluaXRpYWxpemUgY29udHJvbGxlciAqLwpAQCAtNDE4LDYgKzQ3Niw4IEBACiAJbW1jaV93cml0ZWwoSURSLCB+MFVMKTsKIAltY2lfc2V0X21vZGUoQ0ZHX01NQ19DTEtfT0QsIE1NQ19ERUZBVUxUX0JMS0xFTik7CiAKKwltbWNfY2FyZF9pc19zZCA9IDA7CisKIAlyZXQgPSBzZF9pbml0X2NhcmQoJmNpZCwgdmVyYm9zZSk7CiAJaWYgKHJldCkgewogCQltbWNfcmNhID0gTU1DX0RFRkFVTFRfUkNBOwpAQCAtNDMzLDYgKzQ5Myw4IEBACiAJaWYgKHZlcmJvc2UpCiAJCW1tY19kdW1wX2NzZCgmY3NkKTsKIAorCW1jaV9zZXRfZGF0YV90aW1lb3V0KCZjc2QpOworCiAJLyogSW5pdGlhbGl6ZSB0aGUgYmxvY2tkZXYgc3RydWN0dXJlICovCiAJbW1jX2Jsa2Rldi5pZl90eXBlID0gSUZfVFlQRV9NTUM7CiAJbW1jX2Jsa2Rldi5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfRE9TOwpAQCAtNDQ0LDcgKzUwNiwxNyBAQAogCQlzaXplb2YobW1jX2Jsa2Rldi5wcm9kdWN0KSk7CiAJc3ByaW50ZigoY2hhciAqKW1tY19ibGtkZXYucmV2aXNpb24sICIleCAleCIsCiAJCWNpZC5wcnYgPj4gNCwgY2lkLnBydiAmIDB4MGYpOwotCW1tY19ibGtkZXYuYmxrc3ogPSAxIDw8IGNzZC5yZWFkX2JsX2xlbjsKKworCS8qCisJICogSWYgd2UgY2FuJ3QgdXNlIDUxMiBieXRlIGJsb2NrcywgcmVmdXNlIHRvIGRlYWwgd2l0aCB0aGUKKwkgKiBjYXJkLiBUb25zIG9mIGNvZGUgZWxzZXdoZXJlIHNlZW1zIHRvIGRlcGVuZCBvbiB0aGlzLgorCSAqLworCW1heF9ibGtzeiA9IDEgPDwgY3NkLnJlYWRfYmxfbGVuOworCWlmIChtYXhfYmxrc3ogPCA1MTIgfHwgKG1heF9ibGtzeiA+IDUxMiAmJiAhY3NkLnJlYWRfYmxfcGFydGlhbCkpIHsKKwkJcHJpbnRmKCJDYXJkIGRvZXMgbm90IHN1cHBvcnQgNTEyIGJ5dGUgcmVhZHMsIGFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltbWNfYmxrZGV2LmJsa3N6ID0gNTEyOwogCW1tY19ibGtkZXYubGJhID0gKGNzZC5jX3NpemUgKyAxKSAqICgxIDw8IChjc2QuY19zaXplX211bHQgKyAyKSk7CiAKIAltY2lfc2V0X21vZGUoQ0ZHX01NQ19DTEtfUFAsIG1tY19ibGtkZXYuYmxrc3opOwpkaWZmIC0tZ2l0IGEvY3B1L2F0MzJhcC9hdG1lbF9tY2kuaCBiL2NwdS9hdDMyYXAvYXRtZWxfbWNpLmgKaW5kZXggMGZmYmM0Zi4uNWI0ZjVjOSAxMDA2NDQKLS0tIGEvY3B1L2F0MzJhcC9hdG1lbF9tY2kuaAorKysgYi9jcHUvYXQzMmFwL2F0bWVsX21jaS5oCkBAIC01Nyw2ICs1NywxMCBAQAogI2RlZmluZSBNTUNJX0NMS0RJVl9TSVpFCQkJOAogI2RlZmluZSBNTUNJX1BXU0RJVl9PRkZTRVQJCQk4CiAjZGVmaW5lIE1NQ0lfUFdTRElWX1NJWkUJCQkzCisjZGVmaW5lIE1NQ0lfUkRQUk9PRl9PRkZTRVQJCQkxMQorI2RlZmluZSBNTUNJX1JEUFJPT0ZfU0laRQkJCTEKKyNkZWZpbmUgTU1DSV9XUlBST09GX09GRlNFVAkJCTEyCisjZGVmaW5lIE1NQ0lfV1JQUk9PRl9TSVpFCQkJMQogI2RlZmluZSBNTUNJX1BEQ1BBRFZfT0ZGU0VUCQkJMTQKICNkZWZpbmUgTU1DSV9QRENQQURWX1NJWkUJCQkxCiAjZGVmaW5lIE1NQ0lfUERDTU9ERV9PRkZTRVQJCQkxNQpkaWZmIC0tZ2l0IGEvY3B1L2F0MzJhcC9pbnRlcnJ1cHRzLmMgYi9jcHUvYXQzMmFwL2ludGVycnVwdHMuYwppbmRleCBjOWUwNDk5Li5iZWYxZjMwIDEwMDY0NAotLS0gYS9jcHUvYXQzMmFwL2ludGVycnVwdHMuYworKysgYi9jcHUvYXQzMmFwL2ludGVycnVwdHMuYwpAQCAtMjAsOCArMjAsOCBAQAogICogTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGRpdjY0Lmg+CiAKLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CmRpZmYgLS1naXQgYS9jcHUvaTM4Ni9zZXJpYWwuYyBiL2NwdS9pMzg2L3NlcmlhbC5jCmluZGV4IGU3Mjk5YTcuLmJhZjM1ZTUgMTAwNjQ0Ci0tLSBhL2NwdS9pMzg2L3NlcmlhbC5jCisrKyBiL2NwdS9pMzg2L3NlcmlhbC5jCkBAIC0zOTQsNyArMzk0LDcgQEAKICNlbmRpZgkvKiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIC8qCiAgIEFTIEhBUk5PSVMgOiBhY2NvcmRpbmcgdG8gQ09ORklHX0tHREJfU0VSX0lOREVYIGtnZGIgdXNlcyBzZXJpYWwgcG9ydAogICBudW1iZXIgMCBvciBudW1iZXIgMQpAQCAtNTAwLDQgKzUwMCw0IEBACiAJcmV0dXJuOwogfQogI2VuZGlmCS8qIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKSAqLwotI2VuZGlmCS8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvaXhwL2NwdS5jIGIvY3B1L2l4cC9jcHUuYwppbmRleCA3ZjlmMzM0Li4yYzdkNWEwIDEwMDY0NAotLS0gYS9jcHUvaXhwL2NwdS5jCisrKyBiL2NwdS9peHAvY3B1LmMKQEAgLTg1LDcgKzg1LDcgQEAKIAlGSVFfU1RBQ0tfU1RBUlQgPSBJUlFfU1RBQ0tfU1RBUlQgLSBDT05GSUdfU1RBQ0tTSVpFX0lSUTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKSB8fCBkZWZpbmVkIChDT05GSUdfUENJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ0kpIHx8IGRlZmluZWQgKENPTkZJR19QQ0kpCiAJcGNpX2luaXQoKTsKICNlbmRpZgogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvY3B1L2l4cC9ucGUvbnBlLmMgYi9jcHUvaXhwL25wZS9ucGUuYwppbmRleCBhYjdjYThiLi43ZTRhZjQ0IDEwMDY0NAotLS0gYS9jcHUvaXhwL25wZS9ucGUuYworKysgYi9jcHUvaXhwL25wZS9ucGUuYwpAQCAtNjgyLDcgKzY4Miw3IEBACiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsIG5wZV9taWlwaHlfcmVhZCwgbnBlX21paXBoeV93cml0ZSk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY3B1L21jZjUyeDIvZmVjLmMgYi9jcHUvbWNmNTJ4Mi9mZWMuYwppbmRleCBiNjU0MGI1Li5lZjljNzk4IDEwMDY0NAotLS0gYS9jcHUvbWNmNTJ4Mi9mZWMuYworKysgYi9jcHUvbWNmNTJ4Mi9mZWMuYwpAQCAtNTMsNyArNTMsNyBAQAogI3VuZGVmCUVUX0RFQlVHCiAjdW5kZWYJTUlJX0RFQlVHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoRkVDX0VORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChGRUNfRU5FVCkKIAogI2lmZGVmIENGR19ESVNDT1ZFUl9QSFkKICNpbmNsdWRlIDxtaWlwaHkuaD4KQEAgLTM2Myw3ICszNjMsNyBAQAogfQogCiAKLSNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAKIHN0YXRpYyBpbnQgcGh5YWRkciA9IC0xOwkvKiBkaWRuJ3QgZmluZCBhIFBIWSB5ZXQgKi8KIHN0YXRpYyB1aW50IHBoeXR5cGU7CkBAIC00MTksNyArNDE5LDcgQEAKICNlbmRpZgogCXJldHVybiAobWlpX3JlcGx5ICYgMHhmZmZmKTsJLyogZGF0YSByZWFkIGZyb20gcGh5ICovCiB9Ci0jZW5kaWYgLyogQ0ZHX0RJU0NPVkVSX1BIWSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0RJU0NPVkVSX1BIWSkKIHN0YXRpYyB2b2lkIG1paV9kaXNjb3Zlcl9waHkgKHZvaWQpCkBAIC00ODUsNyArNDg1LDcgQEAKIH0KICNlbmRpZiAvKiBDRkdfRElTQ09WRVJfUEhZICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCiBzdGF0aWMgaW50IG1paV9pbml0X2RvbmUgPSAwOwogCkBAIC01OTEsMTMgKzU5MSwxMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkgKi8KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCwgRkVDX0VORVQgKi8KKyNlbmRpZgorI2VuZGlmCiAKIGludCBtY2Y1MngyX21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoRkVDX0VORVQpCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKEZFQ19FTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCW1paXBoeV9yZWdpc3RlcigibWNmNTJ4MnBoeSIsIG1jZjUyeDJfbWlpcGh5X3JlYWQsIG1jZjUyeDJfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbWljcm9ibGF6ZS9jYWNoZS5jIGIvY3B1L21pY3JvYmxhemUvY2FjaGUuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDRmMzZhODQuLjZjZTBiNTUKLS0tIGEvY3B1L21pY3JvYmxhemUvY2FjaGUuYworKysgYi9jcHUvbWljcm9ibGF6ZS9jYWNoZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0FDSEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NBQ0hFKQogCiBpbnQgZGNhY2hlX3N0YXR1cyAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2NwdS9taWNyb2JsYXplL2ludGVycnVwdHMuYyBiL2NwdS9taWNyb2JsYXplL2ludGVycnVwdHMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGI2MTE1M2YuLjNmMDRiMjkKLS0tIGEvY3B1L21pY3JvYmxhemUvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9taWNyb2JsYXplL2ludGVycnVwdHMuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogI2lmZGVmIENGR19JTlRDXzAKIGludCBkb19pcnFpbmZvIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0yMTcsNCArMjE3LDQgQEAKIAlwdXRzICgiVW5kZWZpbmVkIGludGVycnVwdCBjb250cm9sbGVyXG4iKTsKIH0KICNlbmRpZgotI2VuZGlmCQkJCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9taWNyb2JsYXplL2lycS5TIGIvY3B1L21pY3JvYmxhemUvaXJxLlMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvY3B1L21pcHMvYXUxeDAwX2V0aC5jIGIvY3B1L21pcHMvYXUxeDAwX2V0aC5jCmluZGV4IDA3OGU4MzIuLmI2OTc0MWEgMTAwNjQ0Ci0tLSBhL2NwdS9taXBzL2F1MXgwMF9ldGguYworKysgYi9jcHUvbWlwcy9hdTF4MDBfZXRoLmMKQEAgLTYzLDcgKzYzLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYXUxeDAwLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNpbmNsdWRlIDxtaWlwaHkuaD4KICNlbmRpZgogCkBAIC0yNDEsNyArMjQxLDcgQEAKIAogCWV0aF9yZWdpc3RlcihkZXYpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJYXUxeDAwX21paXBoeV9yZWFkLCBhdTF4MDBfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgpAQCAtMjQ5LDcgKzI0OSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIGludCAgYXUxeDAwX21paXBoeV9yZWFkKGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgYWRkciwKIAkJdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIHNob3J0ICogdmFsdWUpCiB7CkBAIC0zMDYsNiArMzA2LDYgQEAKIAkqbWlpX2NvbnRyb2xfcmVnID0gbWlpX2NvbnRyb2w7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkgKi8KKyNlbmRpZgogCiAjZW5kaWYgLyogQ09ORklHX0FVMVgwMCAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvTWFrZWZpbGUgYi9jcHUvbXBjNTEyeC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUzNWIyCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvTWFrZWZpbGUKQEAgLTAsMCArMSw0NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubyBzZXJpYWwubyBmZWMubyBpMmMubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L2NvbmZpZy5tayBiL2NwdS9tcGM1MTJ4L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA3YzVhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19NUEM1MTJYIC1EQ09ORklHX0UzMDAgXAorCQkJLWZmaXhlZC1yMiAtZmZpeGVkLXIyOSAtbXNvZnQtZmxvYXQgLW1jcHU9NjAzZQpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvY3B1LmMgYi9jcHUvbXBjNTEyeC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2NhZTZlCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvY3B1LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBNUEM1MTJ4IGZhbWlseS4KKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgzeHggY29kZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitpbnQgY2hlY2tjcHUgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOworCXVsb25nIGNsb2NrID0gZ2QtPmNwdV9jbGs7CisJdTMyIHB2ciA9IGdldF9wdnIgKCk7CisJdTMyIHNwcmlkciA9IGltbXItPnN5c2NvbmYuc3ByaWRyOworCWNoYXIgYnVmWzMyXTsKKworCXB1dHMgKCJDUFU6ICAgIik7CisKKwlzd2l0Y2ggKHNwcmlkciAmIDB4ZmZmZjAwMDApIHsKKwljYXNlIFNQUl81MTIxRToKKwkJcHV0cyAoIk1QQzUxMjFlICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJVbmtub3duIHBhcnQgSUQgJTA4eCAiLCBzcHJpZHIgJiAweGZmZmYwMDAwKTsKKwl9CisJcHJpbnRmICgicmV2LiAlZC4lZCwgQ29yZSAiLCBTVlJfTUpSRVYgKHNwcmlkciksIFNWUl9NTlJFViAoc3ByaWRyKSk7CisKKwlzd2l0Y2ggKHB2ciAmIDB4ZmZmZjAwMDApIHsKKwljYXNlIFBWUl9FMzAwQzQ6CisJCXB1dHMgKCJlMzAwYzQgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB1dHMgKCJ1bmtub3duICIpOworCX0KKwlwcmludGYgKCJhdCAlcyBNSHosIENTQiBhdCAlM2QgTUh6XG4iLCBzdHJtaHooYnVmLCBjbG9jayksCisJCWdkLT5jc2JfY2xrIC8gMTAwMDAwMCk7CisJcmV0dXJuIDA7Cit9CisKKworaW50Citkb19yZXNldCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVsb25nIG1zcjsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCisJLyogSW50ZXJydXB0cyBhbmQgTU1VIG9mZiAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWZtc3IgICAgJTAiOiI9ciIgKG1zcik6KTsKKworCW1zciAmPSB+KCBNU1JfRUUgfCBNU1JfSVIgfCBNU1JfRFIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgibXRtc3IgICAgJTAiOjoiciIgKG1zcikpOworCisJLyoKKwkgKiBFbmFibGUgUmVzZXQgQ29udHJvbCBSZWcgLSAiUlNURSIgaXMgdGhlIG1hZ2ljIHdvcmQgdGhhdCBsZXQgdXMgZ28KKwkgKi8KKwlpbW1hcC0+cmVzZXQucnByID0gMHg1MjUzNTQ0NTsKKworCS8qIFZlcmlmeSBSZXNldCBDb250cm9sIFJlZyBpcyBlbmFibGVkICovCisJd2hpbGUgKCEoKGltbWFwLT5yZXNldC5yY2VyKSAmIFJDRVJfQ1JFKSkKKwkJOworCisJcHJpbnRmICgiUmVzZXR0aW5nIHRoZSBib2FyZC5cbiIpOworCXVkZWxheSgyMDApOworCisJLyogUGVyZm9ybSByZXNldCAqLworCWltbWFwLT5yZXNldC5yY3IgPSBSQ1JfU1dIUjsKKworCS8qIFVucmVhY2hlZC4uLiAqLworCXJldHVybiAxOworfQorCisKKy8qCisgKiBHZXQgdGltZWJhc2UgY2xvY2sgZnJlcXVlbmN5IChsaWtlIGNwdV9jbGsgaW4gSHopCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworCXVsb25nIHRiY2xrOworCisJdGJjbGsgPSAoZ2QtPmJ1c19jbGsgKyAzTCkgLyA0TDsKKworCXJldHVybiB0YmNsazsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCit2b2lkIHdhdGNoZG9nX3Jlc2V0ICh2b2lkKQoreworCWludCByZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwkvKiBSZXNldCB3YXRjaGRvZyAqLworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwlpbW1yLT53ZHQuc3dzcnIgPSAweDU1NmM7CisJaW1tci0+d2R0LnN3c3JyID0gMHhhYTM5OworCisJaWYgKHJlX2VuYWJsZSkKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L2NwdV9pbml0LmMgYi9jcHUvbXBjNTEyeC9jcHVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTQ5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9jcHVfaW5pdC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgzeHggY29kZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qCisgKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAsIGluaXRpYWxpemUgcmVnaXN0ZXJzLAorICovCit2b2lkIGNwdV9pbml0X2YgKHZvbGF0aWxlIGltbWFwX3QgKiBpbSkKK3sKKwl1MzIgaXBzX2RpdjsKKworCS8qIFBvaW50ZXIgaXMgd3JpdGFibGUgc2luY2Ugd2UgYWxsb2NhdGVkIGEgcmVnaXN0ZXIgZm9yIGl0ICovCisJZ2QgPSAoZ2RfdCAqKSAoQ0ZHX0lOSVRfUkFNX0FERFIgKyBDRkdfR0JMX0RBVEFfT0ZGU0VUKTsKKworCS8qIENsZWFyIGluaXRpYWwgZ2xvYmFsIGRhdGEgKi8KKwltZW1zZXQgKCh2b2lkICopIGdkLCAwLCBzaXplb2YgKGdkX3QpKTsKKworCS8qIHN5c3RlbSBwZXJmb3JtYW5jZSB0d2Vha2luZyAqLworCisjaWZkZWYgQ0ZHX0FDUl9QSVBFX0RFUAorCS8qIEFyYml0ZXIgcGlwZWxpbmUgZGVwdGggKi8KKwlpbS0+YXJiaXRlci5hY3IgPSAoaW0tPmFyYml0ZXIuYWNyICYgfkFDUl9QSVBFX0RFUCkgfAorCQkJICAoQ0ZHX0FDUl9QSVBFX0RFUCA8PCBBQ1JfUElQRV9ERVBfU0hJRlQpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfQUNSX1JQVENOVAorCS8qIEFyYml0ZXIgcmVwZWF0IGNvdW50ICovCisJaW0tPmFyYml0ZXIuYWNyID0gKChpbS0+YXJiaXRlci5hY3IgJiB+KEFDUl9SUFRDTlQpKSB8CisJCQkgICAoQ0ZHX0FDUl9SUFRDTlQgPDwgQUNSX1JQVENOVF9TSElGVCkpOworI2VuZGlmCisKKwkvKiBSU1IgLSBSZXNldCBTdGF0dXMgUmVnaXN0ZXIgLSBjbGVhciBhbGwgc3RhdHVzICovCisJZ2QtPnJlc2V0X3N0YXR1cyA9IGltLT5yZXNldC5yc3I7CisJaW0tPnJlc2V0LnJzciA9IH4oUlNSX1JFUyk7CisKKwkvKgorCSAqIFJNUiAtIFJlc2V0IE1vZGUgUmVnaXN0ZXIgLSBlbmFibGUgY2hlY2tzdG9wIHJlc2V0CisJICovCisJaW0tPnJlc2V0LnJtciA9IChSTVJfQ1NSRSAmICgxIDw8IFJNUl9DU1JFX1NISUZUKSk7CisKKwkvKiBTZXQgSVBTLUNTQiBkaXZpZGVyOiBJUFMgPSAxLzIgQ1NCICovCisJaXBzX2RpdiA9IGltLT5jbGsuc2NmclswXTsKKwlpcHNfZGl2ICY9IH4oU0NGUjFfSVBTX0RJVl9NQVNLKTsKKwlpcHNfZGl2IHw9IFNDRlIxX0lQU19ESVYgPDwgU0NGUjFfSVBTX0RJVl9TSElGVDsKKwlpbS0+Y2xrLnNjZnJbMF0gPSBpcHNfZGl2OworCisJLyoKKwkgKiBFbmFibGUgVGltZSBCYXNlL0RlY3JlbWVudGVyCisJICoKKwkgKiBOT1RJQ0U6IFRCIG5lZWRzIHRvIGJlIGVuYWJsZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gb3JkZXIgdG8KKwkgKiBoYXZlIHVkZWxheSgpIHdvcmtpbmc7IGlmIG5vdCBlbmFibGVkLCB1c3VhbGx5IGxlYWRzIHRvIGEgaGFuZywgbGlrZQorCSAqIGR1cmluZyBGTEFTSCBjaGlwIGlkZW50aWZpY2F0aW9uIGV0Yy4KKwkgKi8KKwlpbS0+c3lzY29uZi5zcGNyIHw9IFNQQ1JfVEJFTjsKK30KKworaW50IGNwdV9pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC9mZWMuYyBiL2NwdS9tcGM1MTJ4L2ZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTQyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9mZWMuYwpAQCAtMCwwICsxLDgwMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDOHh4IEZFQyBkcml2ZXIuCisgKiBBZGFwdGVkIGZvciBNUEM1MTJ4IGJ5IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM1MTJ4Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8bWlpcGh5Lmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjZGVmaW5lIERFQlVHIDAKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAorCWRlZmluZWQoQ09ORklHX01QQzUxMnhfRkVDKQorCisjaWYgIShkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpKQorI2Vycm9yICJDT05GSUdfTUlJIGhhcyB0byBiZSBkZWZpbmVkISIKKyNlbmRpZgorCisjaWYgKERFQlVHICYgMHg0MCkKK3N0YXRpYyB1aW50MzIgbG9jYWxfY3JjMzIoY2hhciAqc3RyaW5nLCB1bnNpZ25lZCBpbnQgY3JjX3ZhbHVlLCBpbnQgbGVuKTsKKyNlbmRpZgorCitpbnQgZmVjNTEyeF9taWlwaHlfcmVhZChjaGFyICpkZXZuYW1lLCB1aW50OCBwaHlBZGRyLCB1aW50OCByZWdBZGRyLCB1aW50MTYgKiByZXRWYWwpOworaW50IGZlYzUxMnhfbWlpcGh5X3dyaXRlKGNoYXIgKmRldm5hbWUsIHVpbnQ4IHBoeUFkZHIsIHVpbnQ4IHJlZ0FkZHIsIHVpbnQxNiBkYXRhKTsKK2ludCBtcGM1MTJ4X2ZlY19pbml0X3BoeShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBiZF90ICogYmlzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChERUJVRyAmIDB4MikKK3N0YXRpYyB2b2lkIG1wYzUxMnhfZmVjX3BoeWR1bXAgKGNoYXIgKmRldm5hbWUpCit7CisJdWludDE2IHBoeVN0YXR1cywgaTsKKwl1aW50OCBwaHlBZGRyID0gQ09ORklHX1BIWV9BRERSOworCXVpbnQ4IHJlZ19tYXNrW10gPSB7CisJCS8qIHJlZ3MgdG8gcHJpbnQ6IDAuLi44LCAyMSwyNywzMSAqLworCQkxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgICAgIDEsIDAsIDAsIDAsICAwLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLCAgMCwgMSwgMCwgMCwgICAgIDAsIDAsIDAsIDEsICAwLCAwLCAwLCAxLAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlpZiAocmVnX21hc2tbaV0pIHsKKwkJCW1paXBoeV9yZWFkIChkZXZuYW1lLCBwaHlBZGRyLCBpLCAmcGh5U3RhdHVzKTsKKwkJCXByaW50ZiAoIk1paSByZWcgJWQ6IDB4JTA0eFxuIiwgaSwgcGh5U3RhdHVzKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG1wYzUxMnhfZmVjX2JkX2luaXQgKG1wYzUxMnhfZmVjX3ByaXYgKmZlYykKK3sKKwlpbnQgaXg7CisKKwkvKgorCSAqIFJlY2VpdmUgQkRzIGluaXQKKwkgKi8KKwlmb3IgKGl4ID0gMDsgaXggPCBGRUNfUkJEX05VTTsgaXgrKykgeworCQlmZWMtPmJkQmFzZS0+cmJkW2l4XS5kYXRhUG9pbnRlciA9ICh1aW50MzIpJmZlYy0+YmRCYXNlLT5yZWN2X2ZyYW1lc1tpeF07CisJCWZlYy0+YmRCYXNlLT5yYmRbaXhdLnN0YXR1cyA9IEZFQ19SQkRfRU1QVFk7CisJCWZlYy0+YmRCYXNlLT5yYmRbaXhdLmRhdGFMZW5ndGggPSAwOworCX0KKworCS8qCisJICogaGF2ZSB0aGUgbGFzdCBSQkQgdG8gY2xvc2UgdGhlIHJpbmcKKwkgKi8KKwlmZWMtPmJkQmFzZS0+cmJkW2l4IC0gMV0uc3RhdHVzIHw9IEZFQ19SQkRfV1JBUDsKKwlmZWMtPnJiZEluZGV4ID0gMDsKKworCS8qCisJICogVHJhc21pdCBCRHMgaW5pdAorCSAqLworCWZvciAoaXggPSAwOyBpeCA8IEZFQ19UQkRfTlVNOyBpeCsrKSB7CisJCWZlYy0+YmRCYXNlLT50YmRbaXhdLnN0YXR1cyA9IDA7CisJfQorCisJLyoKKwkgKiBIYXZlIHRoZSBsYXN0IFRCRCB0byBjbG9zZSB0aGUgcmluZworCSAqLworCWZlYy0+YmRCYXNlLT50YmRbaXggLSAxXS5zdGF0dXMgfD0gRkVDX1RCRF9XUkFQOworCisJLyoKKwkgKiBJbml0aWFsaXplIHNvbWUgaW5kaWNlcworCSAqLworCWZlYy0+dGJkSW5kZXggPSAwOworCWZlYy0+dXNlZFRiZEluZGV4ID0gMDsKKwlmZWMtPmNsZWFuVGJkTnVtID0gRkVDX1RCRF9OVU07CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXBjNTEyeF9mZWNfcmJkX2NsZWFuIChtcGM1MTJ4X2ZlY19wcml2ICpmZWMsIHZvbGF0aWxlIEZFQ19SQkQgKiBwUmJkKQoreworCS8qCisJICogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3IgYXMgZW1wdHkKKwkgKi8KKwlpZiAoKGZlYy0+cmJkSW5kZXgpID09IChGRUNfUkJEX05VTSAtIDEpKQorCQlwUmJkLT5zdGF0dXMgPSAoRkVDX1JCRF9XUkFQIHwgRkVDX1JCRF9FTVBUWSk7CisJZWxzZQorCQlwUmJkLT5zdGF0dXMgPSBGRUNfUkJEX0VNUFRZOworCisJcFJiZC0+ZGF0YUxlbmd0aCA9IDA7CisKKwkvKgorCSAqIEluY3JlbWVudCBCRCBjb3VudAorCSAqLworCWZlYy0+cmJkSW5kZXggPSAoZmVjLT5yYmRJbmRleCArIDEpICUgRkVDX1JCRF9OVU07CisKKwkvKgorCSAqIE5vdywgd2UgaGF2ZSBhbiBlbXB0eSBSeEJELCBub3RpZnkgRkVDCisJICovCisJZmVjLT5ldGgtPnJfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CS8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXBjNTEyeF9mZWNfdGJkX3NjcnViIChtcGM1MTJ4X2ZlY19wcml2ICpmZWMpCit7CisJdm9sYXRpbGUgRkVDX1RCRCAqcFVzZWRUYmQ7CisKKyNpZiAoREVCVUcgJiAweDEpCisJcHJpbnRmICgidGJkX3NjcnViOiBmZWMtPmNsZWFuVGJkTnVtID0gJWQsIGZlYy0+dXNlZFRiZEluZGV4ID0gJWRcbiIsCisJCWZlYy0+Y2xlYW5UYmROdW0sIGZlYy0+dXNlZFRiZEluZGV4KTsKKyNlbmRpZgorCisJLyoKKwkgKiBwcm9jZXNzIGFsbCB0aGUgY29uc3VtZWQgVEJEcworCSAqLworCXdoaWxlIChmZWMtPmNsZWFuVGJkTnVtIDwgRkVDX1RCRF9OVU0pIHsKKwkJcFVzZWRUYmQgPSAmZmVjLT5iZEJhc2UtPnRiZFtmZWMtPnVzZWRUYmRJbmRleF07CisJCWlmIChwVXNlZFRiZC0+c3RhdHVzICYgRkVDX1RCRF9SRUFEWSkgeworI2lmIChERUJVRyAmIDB4MjApCisJCQlwcmludGYgKCJDYW5ub3QgY2xlYW4gVEJEICVkLCBpbiB1c2VcbiIsIGZlYy0+dXNlZFRiZEluZGV4KTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogY2xlYW4gdGhpcyBidWZmZXIgZGVzY3JpcHRvcgorCQkgKi8KKwkJaWYgKGZlYy0+dXNlZFRiZEluZGV4ID09IChGRUNfVEJEX05VTSAtIDEpKQorCQkJcFVzZWRUYmQtPnN0YXR1cyA9IEZFQ19UQkRfV1JBUDsKKwkJZWxzZQorCQkJcFVzZWRUYmQtPnN0YXR1cyA9IDA7CisKKwkJLyoKKwkJICogdXBkYXRlIHNvbWUgaW5kZWNlcyBmb3IgYSBjb3JyZWN0IGhhbmRsaW5nIG9mIHRoZSBUQkQgcmluZworCQkgKi8KKwkJZmVjLT5jbGVhblRiZE51bSsrOworCQlmZWMtPnVzZWRUYmRJbmRleCA9IChmZWMtPnVzZWRUYmRJbmRleCArIDEpICUgRkVDX1RCRF9OVU07CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtcGM1MTJ4X2ZlY19zZXRfaHdhZGRyIChtcGM1MTJ4X2ZlY19wcml2ICpmZWMsIGNoYXIgKm1hYykKK3sKKwl1aW50OCBjdXJyQnl0ZTsJCQkvKiBieXRlIGZvciB3aGljaCB0byBjb21wdXRlIHRoZSBDUkMgKi8KKwlpbnQgYnl0ZTsJCQkvKiBsb29wIC0gY291bnRlciAqLworCWludCBiaXQ7CQkJLyogbG9vcCAtIGNvdW50ZXIgKi8KKwl1aW50MzIgY3JjID0gMHhmZmZmZmZmZjsJLyogaW5pdGlhbCB2YWx1ZSAqLworCisJLyoKKwkgKiBUaGUgYWxnb3JpdGhtIHVzZWQgaXMgdGhlIGZvbGxvd2luZzoKKwkgKiB3ZSBsb29wIG9uIGVhY2ggb2YgdGhlIHNpeCBieXRlcyBvZiB0aGUgcHJvdmlkZWQgYWRkcmVzcywKKwkgKiBhbmQgd2UgY29tcHV0ZSB0aGUgQ1JDIGJ5IGxlZnQtc2hpZnRpbmcgdGhlIHByZXZpb3VzCisJICogdmFsdWUgYnkgb25lIHBvc2l0aW9uLCBzbyB0aGF0IGVhY2ggYml0IGluIHRoZSBjdXJyZW50CisJICogYnl0ZSBvZiB0aGUgYWRkcmVzcyBtYXkgY29udHJpYnV0ZSB0aGUgY2FsY3VsYXRpb24uIElmCisJICogdGhlIGxhdHRlciBhbmQgdGhlIE1TQiBpbiB0aGUgQ1JDIGFyZSBkaWZmZXJlbnQsIHRoZW4KKwkgKiB0aGUgQ1JDIHZhbHVlIHNvIGNvbXB1dGVkIGlzIGFsc28gZXgtb3JlZCB3aXRoIHRoZQorCSAqICJwb2x5bm9taXVtIGdlbmVyYXRvciIuIFRoZSBjdXJyZW50IGJ5dGUgb2YgdGhlIGFkZHJlc3MKKwkgKiBpcyBhbHNvIHNoaWZ0ZWQgcmlnaHQgYnkgb25lIGJpdCBhdCBlYWNoIGl0ZXJhdGlvbi4KKwkgKiBUaGlzIGlzIGJlY2F1c2UgdGhlIENSQyBnZW5lcmF0b3JlIGluIGhhcmR3YXJlIGlzIGltcGxlbWVudGVkCisJICogYXMgYSBzaGlmdC1yZWdpc3RlciB3aXRoIGFzIG1hbnkgZXgtb3JlcyBhcyB0aGUgcmFkaXhlcworCSAqIGluIHRoZSBwb2x5bm9taXVtLiBUaGlzIHN1Z2dlc3RzIHRoYXQgd2UgcmVwcmVzZW50IHRoZQorCSAqIHBvbHlub21pdW1tIGl0c2VsZiBhcyBhIDMyLWJpdCBjb25zdGFudC4KKwkgKi8KKwlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgNjsgYnl0ZSsrKSB7CisJCWN1cnJCeXRlID0gbWFjW2J5dGVdOworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CisJCQlpZiAoKGN1cnJCeXRlICYgMHgwMSkgXiAoY3JjICYgMHgwMSkpIHsKKwkJCQljcmMgPj49IDE7CisJCQkJY3JjID0gY3JjIF4gMHhlZGI4ODMyMDsKKwkJCX0gZWxzZSB7CisJCQkJY3JjID4+PSAxOworCQkJfQorCQkJY3VyckJ5dGUgPj49IDE7CisJCX0KKwl9CisKKwljcmMgPSBjcmMgPj4gMjY7CisKKwkvKgorCSAqIFNldCBpbmRpdmlkdWFsIGhhc2ggdGFibGUgcmVnaXN0ZXIKKwkgKi8KKwlpZiAoY3JjID49IDMyKSB7CisJCWZlYy0+ZXRoLT5pYWRkcjEgPSAoMSA8PCAoY3JjIC0gMzIpKTsKKwkJZmVjLT5ldGgtPmlhZGRyMiA9IDA7CisJfSBlbHNlIHsKKwkJZmVjLT5ldGgtPmlhZGRyMSA9IDA7CisJCWZlYy0+ZXRoLT5pYWRkcjIgPSAoMSA8PCBjcmMpOworCX0KKworCS8qCisJICogU2V0IHBoeXNpY2FsIGFkZHJlc3MKKwkgKi8KKwlmZWMtPmV0aC0+cGFkZHIxID0gKG1hY1swXSA8PCAyNCkgKyAobWFjWzFdIDw8IDE2KSArIChtYWNbMl0gPDwgOCkgKyBtYWNbM107CisJZmVjLT5ldGgtPnBhZGRyMiA9IChtYWNbNF0gPDwgMjQpICsgKG1hY1s1XSA8PCAxNikgKyAweDg4MDg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbXBjNTEyeF9mZWNfaW5pdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgYmRfdCAqIGJpcykKK3sKKwltcGM1MTJ4X2ZlY19wcml2ICpmZWMgPSAobXBjNTEyeF9mZWNfcHJpdiAqKWRldi0+cHJpdjsKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYgKCJtcGM1MTJ4X2ZlY19pbml0Li4uIEJlZ2luXG4iKTsKKyNlbmRpZgorCisJLyogU2V0IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisJZmVjLT5ldGgtPmltYXNrID0gMHgwMDAwMDAwMDsKKworCS8qIENsZWFyIEZFQy1MaXRlIGludGVycnVwdCBldmVudCByZWdpc3RlcihJRVZFTlQpICovCisJZmVjLT5ldGgtPmlldmVudCA9IDB4ZmZmZmZmZmY7CisKKwkvKiBTZXQgdHJhbnNtaXQgZmlmbyB3YXRlcm1hcmsgcmVnaXN0ZXIoWF9XTVJLKSwgZGVmYXVsdCA9IDY0ICovCisJZmVjLT5ldGgtPnhfd21yayA9IDB4MDsKKworCS8qIFNldCBPcGNvZGUvUGF1c2UgRHVyYXRpb24gUmVnaXN0ZXIgKi8KKwlmZWMtPmV0aC0+b3BfcGF1c2UgPSAweDAwMDEwMDIwOworCisJLyogRnJhbWUgbGVuZ3RoPTE1MTg7IE1JSSBtb2RlICovCisJZmVjLT5ldGgtPnJfY250cmwgPSAweDA1ZWUwMDBjOworCisJLyogSGFsZi1kdXBsZXgsIGhlYXJ0YmVhdCBkaXNhYmxlZCAqLworCWZlYy0+ZXRoLT54X2NudHJsID0gMHgwMDAwMDAwMDsKKworCS8qIEVuYWJsZSBNSUIgY291bnRlcnMgKi8KKwlmZWMtPmV0aC0+bWliX2NvbnRyb2wgPSAweDA7CisKKwkvKiBTZXR1cCByZWN2IGZpZm8gc3RhcnQgYW5kIGJ1ZmYgc2l6ZSAqLworCWZlYy0+ZXRoLT5yX2ZzdGFydCA9IDB4NTAwOworCWZlYy0+ZXRoLT5yX2J1ZmZfc2l6ZSA9IDB4NWUwOworCisJLyogU2V0dXAgQkQgYmFzZSBhZGRyZXNzZXMgKi8KKwlmZWMtPmV0aC0+cl9kZXNfc3RhcnQgPSAodWludDMyKWZlYy0+YmRCYXNlLT5yYmQ7CisJZmVjLT5ldGgtPnhfZGVzX3N0YXJ0ID0gKHVpbnQzMilmZWMtPmJkQmFzZS0+dGJkOworCisJLyogRE1BIENvbnRyb2wgKi8KKwlmZWMtPmV0aC0+ZG1hX2NvbnRyb2wgPSAweGMwMDAwMDAwOworCisJLyogRW5hYmxlIEZFQyAqLworCWZlYy0+ZXRoLT5lY250cmwgfD0gMHgwMDAwMDAwNjsKKworCS8qIEluaXRpbGl6ZSBhZGRyZXNzZXMgYW5kIHN0YXR1cyB3b3JkcyBvZiBCRHMgKi8KKwltcGM1MTJ4X2ZlY19iZF9pbml0IChmZWMpOworCisJIC8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUgKi8KKwlmZWMtPmV0aC0+cl9kZXNfYWN0aXZlID0gMHgwMTAwMDAwMDsKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYoIm1wYzUxMnhfZmVjX2luaXQuLi4gRG9uZSBcbiIpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtcGM1MTJ4X2ZlY19pbml0X3BoeSAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgYmRfdCAqIGJpcykKK3sKKwltcGM1MTJ4X2ZlY19wcml2ICpmZWMgPSAobXBjNTEyeF9mZWNfcHJpdiAqKWRldi0+cHJpdjsKKwljb25zdCB1aW50OCBwaHlBZGRyID0gQ09ORklHX1BIWV9BRERSOwkvKiBPbmx5IG9uZSBQSFkgKi8KKwlpbnQgdGltZW91dCA9IDE7CisJdWludDE2IHBoeVN0YXR1czsKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYgKCJtcGM1MTJ4X2ZlY19pbml0X3BoeS4uLiBCZWdpblxuIik7CisjZW5kaWYKKworCS8qCisJICogQ2xlYXIgRkVDLUxpdGUgaW50ZXJydXB0IGV2ZW50IHJlZ2lzdGVyKElFVkVOVCkKKwkgKi8KKwlmZWMtPmV0aC0+aWV2ZW50ID0gMHhmZmZmZmZmZjsKKworCS8qCisJICogU2V0IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCisJICovCisJZmVjLT5ldGgtPmltYXNrID0gMHgwMDAwMDAwMDsKKworCWlmIChmZWMtPnhjdl90eXBlICE9IFNFVkVOV0lSRSkgeworCQkvKgorCQkgKiBTZXQgTUlJX1NQRUVEID0gKDEvKG1paV9zcGVlZCAqIDIpKSAqIFN5c3RlbSBDbG9jaworCQkgKiBhbmQgZG8gbm90IGRyb3AgdGhlIFByZWFtYmxlLgorCQkgKi8KKwkJZmVjLT5ldGgtPm1paV9zcGVlZCA9ICgoKGdkLT5pcGJfY2xrIC8gMTAwMDAwMCkgLyA1KSArIDEpIDw8IDE7CisKKwkJLyoKKwkJICogUmVzZXQgUEhZLCB0aGVuIGRlbGF5IDMwMG5zCisJCSAqLworCQltaWlwaHlfd3JpdGUgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgwLCAweDgwMDApOworCQl1ZGVsYXkgKDEwMDApOworCisJCWlmIChmZWMtPnhjdl90eXBlID09IE1JSTEwKSB7CisJCS8qCisJCSAqIEZvcmNlIDEwQmFzZS1ULCBGRFggb3BlcmF0aW9uCisJCSAqLworI2lmIChERUJVRyAmIDB4MikKKwkJCXByaW50ZiAoIkZvcmNpbmcgMTAgTWJwcyBldGhlcm5ldCBsaW5rLi4uICIpOworI2VuZGlmCisJCQltaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworCisJCQltaWlwaHlfd3JpdGUgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgwLCAweDAxODApOworCisJCQl0aW1lb3V0ID0gMjA7CisJCQlkbyB7ICAgIC8qIHdhaXQgZm9yIGxpbmsgc3RhdHVzIHRvIGdvIGRvd24gKi8KKwkJCQl1ZGVsYXkgKDEwMDAwKTsKKwkJCQlpZiAoKHRpbWVvdXQtLSkgPT0gMCkgeworI2lmIChERUJVRyAmIDB4MikKKwkJCQkJcHJpbnRmICgiaG1tbSwgc2hvdWxkIG5vdCBoYXZlIHdhaXRlZC4uLiIpOworI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworI2lmIChERUJVRyAmIDB4MikKKwkJCQlwcmludGYgKCI9Iik7CisjZW5kaWYKKwkJCX0gd2hpbGUgKChwaHlTdGF0dXMgJiAweDAwMDQpKTsgLyogIWxpbmsgdXAgKi8KKworCQkJdGltZW91dCA9IDEwMDA7CisJCQlkbyB7ICAgIC8qIHdhaXQgZm9yIGxpbmsgc3RhdHVzIHRvIGNvbWUgYmFjayB1cCAqLworCQkJCXVkZWxheSAoMTAwMDApOworCQkJCWlmICgodGltZW91dC0tKSA9PSAwKSB7CisJCQkJCXByaW50ZiAoImZhaWxlZC4gTGluayBpcyBkb3duLlxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworI2lmIChERUJVRyAmIDB4MikKKwkJCQlwcmludGYgKCIrIik7CisjZW5kaWYKKwkJCX0gd2hpbGUgKCEocGh5U3RhdHVzICYgMHgwMDA0KSk7IC8qICFsaW5rIHVwICovCisKKyNpZiAoREVCVUcgJiAweDIpCisJCQlwcmludGYgKCJkb25lLlxuIik7CisjZW5kaWYKKwkJfSBlbHNlIHsJLyogTUlJMTAwICovCisJCQkvKgorCQkJICogU2V0IHRoZSBhdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIgYml0cworCQkJICovCisJCQltaWlwaHlfd3JpdGUgKGRldi0+bmFtZSwgcGh5QWRkciwgMHg0LCAweDAxZTEpOworCisJCQkvKgorCQkJICogU2V0IE1ESU8gYml0IDAuMTIgPSAxKCYmIGJpdCAwLjk9MT8pIHRvIGVuYWJsZSBhdXRvLW5lZ290aWF0aW9uCisJCQkgKi8KKwkJCW1paXBoeV93cml0ZSAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDAsIDB4MTIwMCk7CisKKwkJCS8qCisJCQkgKiBXYWl0IGZvciBBTiBjb21wbGV0aW9uCisJCQkgKi8KKwkJCXRpbWVvdXQgPSA1MDAwMDsKKwkJCWRvIHsKKwkJCQl1ZGVsYXkgKDEwMDApOworCisJCQkJaWYgKCh0aW1lb3V0LS0pID09IDApIHsKKyNpZiAoREVCVUcgJiAweDIpCisJCQkJCXByaW50ZiAoIlBIWSBhdXRvIG5lZyAwIGZhaWxlZC4uLlxuIik7CisjZW5kaWYKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCWlmIChtaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpICE9IDApIHsKKyNpZiAoREVCVUcgJiAweDIpCisJCQkJCXByaW50ZiAoIlBIWSBhdXRvIG5lZyAxIGZhaWxlZCAweCUwNHguLi5cbiIsIHBoeVN0YXR1cyk7CisjZW5kaWYKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0gd2hpbGUgKCEocGh5U3RhdHVzICYgMHgwMDA0KSk7CisKKyNpZiAoREVCVUcgJiAweDIpCisJCQlwcmludGYgKCJQSFkgYXV0byBuZWcgY29tcGxldGUhIFxuIik7CisjZW5kaWYKKwkJfQorCX0KKworI2lmIChERUJVRyAmIDB4MikKKwlpZiAoZmVjLT54Y3ZfdHlwZSAhPSBTRVZFTldJUkUpCisJCW1wYzUxMnhfZmVjX3BoeWR1bXAgKGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYgKCJtcGM1MTJ4X2ZlY19pbml0X3BoeS4uLiBEb25lIFxuIik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXBjNTEyeF9mZWNfaGFsdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwltcGM1MTJ4X2ZlY19wcml2ICpmZWMgPSAobXBjNTEyeF9mZWNfcHJpdiAqKWRldi0+cHJpdjsKKwlpbnQgY291bnRlciA9IDB4ZmZmZjsKKworI2lmIChERUJVRyAmIDB4MikKKwlpZiAoZmVjLT54Y3ZfdHlwZSAhPSBTRVZFTldJUkUpCisJCW1wYzUxMnhfZmVjX3BoeWR1bXAgKGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qCisJICogbWFzayBGRUMgY2hpcCBpbnRlcnJ1cHRzCisJICovCisJZmVjLT5ldGgtPmltYXNrID0gMDsKKworCS8qCisJICogaXNzdWUgZ3JhY2VmdWwgc3RvcCBjb21tYW5kIHRvIHRoZSBGRUMgdHJhbnNtaXR0ZXIgaWYgbmVjZXNzYXJ5CisJICovCisJZmVjLT5ldGgtPnhfY250cmwgfD0gMHgwMDAwMDAwMTsKKworCS8qCisJICogd2FpdCBmb3IgZ3JhY2VmdWwgc3RvcCB0byByZWdpc3RlcgorCSAqLworCXdoaWxlICgoY291bnRlci0tKSAmJiAoIShmZWMtPmV0aC0+aWV2ZW50ICYgMHgxMDAwMDAwMCkpKSA7CisKKwkvKgorCSAqIERpc2FibGUgdGhlIEV0aGVybmV0IENvbnRyb2xsZXIKKwkgKi8KKwlmZWMtPmV0aC0+ZWNudHJsICY9IDB4ZmZmZmZmZmQ7CisKKwkvKgorCSAqIElzc3VlIGEgcmVzZXQgY29tbWFuZCB0byB0aGUgRkVDIGNoaXAKKwkgKi8KKwlmZWMtPmV0aC0+ZWNudHJsIHw9IDB4MTsKKworCS8qCisJICogd2FpdCBhdCBsZWFzdCAxNiBjbG9jayBjeWNsZXMKKwkgKi8KKwl1ZGVsYXkgKDEwKTsKKyNpZiAoREVCVUcgJiAweDMpCisJcHJpbnRmICgiRXRoZXJuZXQgdGFzayBzdG9wcGVkXG4iKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbXBjNTEyeF9mZWNfc2VuZCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdm9sYXRpbGUgdm9pZCAqZXRoX2RhdGEsCisJCWludCBkYXRhX2xlbmd0aCkKK3sKKwkvKgorCSAqIFRoaXMgcm91dGluZSB0cmFuc21pdHMgb25lIGZyYW1lLiAgVGhpcyByb3V0aW5lIG9ubHkgYWNjZXB0cworCSAqIDYtYnl0ZSBFdGhlcm5ldCBhZGRyZXNzZXMuCisJICovCisJbXBjNTEyeF9mZWNfcHJpdiAqZmVjID0gKG1wYzUxMnhfZmVjX3ByaXYgKilkZXYtPnByaXY7CisJdm9sYXRpbGUgRkVDX1RCRCAqcFRiZDsKKworI2lmIChERUJVRyAmIDB4MjApCisJcHJpbnRmKCJ0YmQgc3RhdHVzOiAweCUwNHhcbiIsIGZlYy0+dGJkQmFzZVtmZWMtPnRiZEluZGV4XS5zdGF0dXMpOworI2VuZGlmCisKKwkvKgorCSAqIENsZWFyIFR4IEJEIHJpbmcgYXQgZmlyc3QKKwkgKi8KKwltcGM1MTJ4X2ZlY190YmRfc2NydWIgKGZlYyk7CisKKwkvKgorCSAqIENoZWNrIGZvciB2YWxpZCBsZW5ndGggb2YgZGF0YS4KKwkgKi8KKwlpZiAoKGRhdGFfbGVuZ3RoID4gMTUwMCkgfHwgKGRhdGFfbGVuZ3RoIDw9IDApKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSBudW1iZXIgb2YgdmFjYW50IFR4QkRzLgorCSAqLworCWlmIChmZWMtPmNsZWFuVGJkTnVtIDwgMSkgeworI2lmIChERUJVRyAmIDB4MjApCisJCXByaW50ZiAoIk5vIGF2YWlsYWJsZSBUeEJEcyAuLi5cbiIpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgZmlyc3QgVHhCRCB0byBzZW5kIHRoZSBtYWMgaGVhZGVyCisJICovCisJcFRiZCA9ICZmZWMtPmJkQmFzZS0+dGJkW2ZlYy0+dGJkSW5kZXhdOworCXBUYmQtPmRhdGFMZW5ndGggPSBkYXRhX2xlbmd0aDsKKwlwVGJkLT5kYXRhUG9pbnRlciA9ICh1aW50MzIpZXRoX2RhdGE7CisJcFRiZC0+c3RhdHVzIHw9IEZFQ19UQkRfTEFTVCB8IEZFQ19UQkRfVEMgfCBGRUNfVEJEX1JFQURZOworCWZlYy0+dGJkSW5kZXggPSAoZmVjLT50YmRJbmRleCArIDEpICUgRkVDX1RCRF9OVU07CisKKwkvKiBBY3RpdmF0ZSB0cmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBwb2xsaW5nICovCisJZmVjLT5ldGgtPnhfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CS8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUJKi8KKworI2lmIChERUJVRyAmIDB4OCkKKwlwcmludGYgKCAiKyIgKTsKKyNlbmRpZgorCisJZmVjLT5jbGVhblRiZE51bSAtPSAxOworCisJLyoKKwkgKiB3YWl0IHVudGlsIGZyYW1lIGlzIHNlbnQgLgorCSAqLworCXdoaWxlIChwVGJkLT5zdGF0dXMgJiBGRUNfVEJEX1JFQURZKSB7CisJCXVkZWxheSAoMTApOworI2lmIChERUJVRyAmIDB4OCkKKwkJcHJpbnRmICgiVERCIHN0YXR1cyA9ICUwNHhcbiIsIHBUYmQtPnN0YXR1cyk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG1wYzUxMnhfZmVjX3JlY3YgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBUaGlzIGNvbW1hbmQgcHVsbHMgb25lIGZyYW1lIGZyb20gdGhlIGNhcmQKKwkgKi8KKwltcGM1MTJ4X2ZlY19wcml2ICpmZWMgPSAobXBjNTEyeF9mZWNfcHJpdiAqKWRldi0+cHJpdjsKKwl2b2xhdGlsZSBGRUNfUkJEICpwUmJkID0gJmZlYy0+YmRCYXNlLT5yYmRbZmVjLT5yYmRJbmRleF07CisJdW5zaWduZWQgbG9uZyBpZXZlbnQ7CisJaW50IGZyYW1lX2xlbmd0aCwgbGVuID0gMDsKKwl1Y2hhciBidWZmW0ZFQ19NQVhfUEtUX1NJWkVdOworCisjaWYgKERFQlVHICYgMHgxKQorCXByaW50ZiAoIm1wYzUxMnhfZmVjX3JlY3YgJWQgU3RhcnQuLi5cbiIsIGZlYy0+cmJkSW5kZXgpOworI2VuZGlmCisjaWYgKERFQlVHICYgMHg4KQorCXByaW50ZiggIi0iICk7CisjZW5kaWYKKworCS8qCisJICogQ2hlY2sgaWYgYW55IGNyaXRpY2FsIGV2ZW50cyBoYXZlIGhhcHBlbmVkCisJICovCisJaWV2ZW50ID0gZmVjLT5ldGgtPmlldmVudDsKKwlmZWMtPmV0aC0+aWV2ZW50ID0gaWV2ZW50OworCWlmIChpZXZlbnQgJiAweDIwMDYwMDAwKSB7CisJCS8qIEJBQlQsIFJ4L1R4IEZJRk8gZXJyb3JzICovCisJCW1wYzUxMnhfZmVjX2hhbHQgKGRldik7CisJCW1wYzUxMnhfZmVjX2luaXQgKGRldiwgTlVMTCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaWV2ZW50ICYgMHg4MDAwMDAwMCkgeworCQkvKiBIZWFydGJlYXQgZXJyb3IgKi8KKwkJZmVjLT5ldGgtPnhfY250cmwgfD0gMHgwMDAwMDAwMTsKKwl9CisJaWYgKGlldmVudCAmIDB4MTAwMDAwMDApIHsKKwkJLyogR3JhY2VmdWwgc3RvcCBjb21wbGV0ZSAqLworCQlpZiAoZmVjLT5ldGgtPnhfY250cmwgJiAweDAwMDAwMDAxKSB7CisJCQltcGM1MTJ4X2ZlY19oYWx0IChkZXYpOworCQkJZmVjLT5ldGgtPnhfY250cmwgJj0gfjB4MDAwMDAwMDE7CisJCQltcGM1MTJ4X2ZlY19pbml0IChkZXYsIE5VTEwpOworCQl9CisJfQorCisJaWYgKCEocFJiZC0+c3RhdHVzICYgRkVDX1JCRF9FTVBUWSkpIHsKKwkJaWYgKChwUmJkLT5zdGF0dXMgJiBGRUNfUkJEX0xBU1QpICYmCisJCQkhKHBSYmQtPnN0YXR1cyAmIEZFQ19SQkRfRVJSKSAmJgorCQkJKChwUmJkLT5kYXRhTGVuZ3RoIC0gNCkgPiAxNCkpIHsKKworCQkJLyoKKwkJCSAqIEdldCBidWZmZXIgc2l6ZQorCQkJICovCisJCQlmcmFtZV9sZW5ndGggPSBwUmJkLT5kYXRhTGVuZ3RoIC0gNDsKKworI2lmIChERUJVRyAmIDB4MjApCisJCQl7CisJCQkJaW50IGk7CisJCQkJcHJpbnRmICgicmVjdiBkYXRhIGhkcjoiKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKKwkJCQkJcHJpbnRmICgiJXggIiwgKigodWludDgqKXBSYmQtPmRhdGFQb2ludGVyICsgaSkpOworCQkJCXByaW50ZigiXG4iKTsKKwkJCX0KKyNlbmRpZgorCisJCQkvKgorCQkJICogIEZpbGwgdGhlIGJ1ZmZlciBhbmQgcGFzcyBpdCB0byB1cHBlciBsYXllcnMKKwkJCSAqLworCQkJbWVtY3B5IChidWZmLCAodm9pZCopcFJiZC0+ZGF0YVBvaW50ZXIsIGZyYW1lX2xlbmd0aCk7CisJCQlOZXRSZWNlaXZlICgodWNoYXIqKWJ1ZmYsIGZyYW1lX2xlbmd0aCk7CisJCQlsZW4gPSBmcmFtZV9sZW5ndGg7CisJCX0KKworCQkvKgorCQkgKiBSZXNldCBidWZmZXIgZGVzY3JpcHRvciBhcyBlbXB0eQorCQkgKi8KKwkJbXBjNTEyeF9mZWNfcmJkX2NsZWFuIChmZWMsIHBSYmQpOworCX0KKworCS8qIFRyeSB0byBmaWxsIEJ1ZmZlciBEZXNjcmlwdG9ycyAqLworCWZlYy0+ZXRoLT5yX2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOwkvKiBEZXNjcmlwdG9yIHBvbGxpbmcgYWN0aXZlICovCisJcmV0dXJuIGxlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1wYzUxMnhfZmVjX2luaXRpYWxpemUgKGJkX3QgKiBiaXMpCit7CisKKwlpbW1hcF90ICppbSA9IChpbW1hcF90KikgQ0ZHX0lNTVI7CisJbXBjNTEyeF9mZWNfcHJpdiAqZmVjOworCXN0cnVjdCBldGhfZGV2aWNlICpkZXY7CisJaW50IGk7CisJY2hhciAqdG1wLCAqZW5kLCBlbnZfZW5ldGFkZHJbNl07CisJdWludDMyICpyZWc7CisJdm9pZCAqIGJkOworCisJZmVjID0gKG1wYzUxMnhfZmVjX3ByaXYgKikgbWFsbG9jIChzaXplb2YoKmZlYykpOworCWRldiA9IChzdHJ1Y3QgZXRoX2RldmljZSAqKSBtYWxsb2MgKHNpemVvZigqZGV2KSk7CisJbWVtc2V0IChkZXYsIDAsIHNpemVvZiAqZGV2KTsKKworCWZlYy0+ZXRoID0gKGV0aGVybmV0X3JlZ3MgKikgTVBDNTEyWF9GRUM7CisKKyMgaWZuZGVmIENPTkZJR19GRUNfMTBNQklUCisJZmVjLT54Y3ZfdHlwZSA9IE1JSTEwMDsKKyMgZWxzZQorCWZlYy0+eGN2X3R5cGUgPSBNSUkxMDsKKyMgZW5kaWYKKwlkZXYtPnByaXYgPSAodm9pZCAqKWZlYzsKKwlkZXYtPmlvYmFzZSA9IE1QQzUxMlhfRkVDOworCWRldi0+aW5pdCA9IG1wYzUxMnhfZmVjX2luaXQ7CisJZGV2LT5oYWx0ID0gbXBjNTEyeF9mZWNfaGFsdDsKKwlkZXYtPnNlbmQgPSBtcGM1MTJ4X2ZlY19zZW5kOworCWRldi0+cmVjdiA9IG1wYzUxMnhfZmVjX3JlY3Y7CisKKwlzcHJpbnRmIChkZXYtPm5hbWUsICJGRUMgRVRIRVJORVQiKTsKKwlldGhfcmVnaXN0ZXIgKGRldik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCisJbWlpcGh5X3JlZ2lzdGVyIChkZXYtPm5hbWUsCisJCQlmZWM1MTJ4X21paXBoeV9yZWFkLCBmZWM1MTJ4X21paXBoeV93cml0ZSk7CisjZW5kaWYKKworCS8qCisJICogSW5pdGlhbGl6ZSBJXE8gcGlucworCSAqLworCXJlZyA9ICh1aW50MzIgKikgJihpbS0+aW9fY3RybC5yZWdzW1BTQzBfMF9JRFhdKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorCQlyZWdbaV0gPSBJT0NUUkxfTVVYX0ZFQyB8IDB4MDAwMDAwMDE7CisKKwlpbS0+aW9fY3RybC5yZWdzW1NQRElGX1RYQ0xPQ0tfSURYXSA9IElPQ1RSTF9NVVhfRkVDIHwgMHgwMDAwMDAwMTsKKwlpbS0+aW9fY3RybC5yZWdzW1NQRElGX1RYX0lEWF0gPSBJT0NUUkxfTVVYX0ZFQyB8IDB4MDAwMDAwMDE7CisJaW0tPmlvX2N0cmwucmVnc1tTUERJRl9SWF9JRFhdID0gSU9DVFJMX01VWF9GRUMgfCAweDAwMDAwMDAxOworCisJLyogQ2xlYW4gdXAgc3BhY2UgRkVDJ3MgTUlCIGFuZCBGSUZPIFJBTSAuLi4qLworCW1lbXNldCAoKHZvaWQgKikgTVBDNTEyWF9GRUMgKyAweDIwMCwgMHgwMCwgMHg0MDApOworCisJLyoKKwkgKiBNYWxsb2Mgc3BhY2UgZm9yIEJEcyAgKG11c3QgYmUgcXVhZCB3b3JkLWFsaWduZWQpCisJICogdGhpcyBwb2ludGVyIGlzIGxvc3QsIHNvIGNhbm5vdCBiZSBmcmVlZAorCSAqLworCWJkID0gbWFsbG9jIChzaXplb2YobXBjNTEyeF9idWZmX2Rlc2NzKSArIDB4MWYpOworCWZlYy0+YmRCYXNlID0gKG1wYzUxMnhfYnVmZl9kZXNjcyopKCh1aW50MzIpYmQgJiAweGZmZmZmZmYwKTsKKwltZW1zZXQgKCh2b2lkICopIGJkLCAweDAwLCBzaXplb2YobXBjNTEyeF9idWZmX2Rlc2NzKSArIDB4MWYpOworCisJLyoKKwkgKiBTZXQgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKwkgKi8KKwlmZWMtPmV0aC0+aW1hc2sgPSAweDAwMDAwMDAwOworCisJLyoKKwkgKiBDbGVhciBGRUMtTGl0ZSBpbnRlcnJ1cHQgZXZlbnQgcmVnaXN0ZXIoSUVWRU5UKQorCSAqLworCWZlYy0+ZXRoLT5pZXZlbnQgPSAweGZmZmZmZmZmOworCisJLyoKKwkgKiBUcnkgdG8gc2V0IHRoZSBtYWMgYWRkcmVzcyBub3cuIFRoZSBmZWMgbWFjIGFkZHJlc3MgaXMKKwkgKiBhIGdhcmJhZ2UgYWZ0ZXIgcmVzZXQuIFdoZW4gbm90IHVzaW5nIGZlYyBmb3IgYm9vdGluZworCSAqIHRoZSBMaW51eCBmZWMgZHJpdmVyIHdpbGwgdHJ5IHRvIHdvcmsgd2l0aCB0aGlzIGdhcmJhZ2UuCisJICovCisJdG1wID0gZ2V0ZW52ICgiZXRoYWRkciIpOworCWlmICh0bXApIHsKKwkJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCQllbnZfZW5ldGFkZHJbaV0gPSB0bXAgPyBzaW1wbGVfc3RydG91bCAodG1wLCAmZW5kLCAxNikgOiAwOworCQkJaWYgKHRtcCkKKwkJCQl0bXAgPSAoKmVuZCkgPyBlbmQrMSA6IGVuZDsKKwkJfQorCQltcGM1MTJ4X2ZlY19zZXRfaHdhZGRyIChmZWMsIGVudl9lbmV0YWRkcik7CisJCWZlYy0+ZXRoLT5nYWRkcjEgPSAweDAwMDAwMDAwOworCQlmZWMtPmV0aC0+Z2FkZHIyID0gMHgwMDAwMDAwMDsKKwl9CisKKwltcGM1MTJ4X2ZlY19pbml0X3BoeSAoZGV2LCBiaXMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIE1JSS1pbnRlcmZhY2UgcmVsYXRlZCBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmZWM1MTJ4X21paXBoeV9yZWFkIChjaGFyICpkZXZuYW1lLCB1aW50OCBwaHlBZGRyLCB1aW50OCByZWdBZGRyLCB1aW50MTYgKiByZXRWYWwpCit7CisJZXRoZXJuZXRfcmVncyAqZXRoID0gKGV0aGVybmV0X3JlZ3MgKikgTVBDNTEyWF9GRUM7CisJdWludDMyIHJlZzsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZIHJlZ2lzdGVyICovCisJdWludDMyIHBoeTsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZICovCisJaW50IHRpbWVvdXQgPSAweGZmZmY7CisKKwkvKgorCSAqIHJlYWRpbmcgZnJvbSBhbnkgUEhZJ3MgcmVnaXN0ZXIgaXMgZG9uZSBieSBwcm9wZXJseQorCSAqIHByb2dyYW1taW5nIHRoZSBGRUMncyBNSUkgZGF0YSByZWdpc3Rlci4KKwkgKi8KKwlyZWcgPSByZWdBZGRyIDw8IEZFQ19NSUlfREFUQV9SQV9TSElGVDsKKwlwaHkgPSBwaHlBZGRyIDw8IEZFQ19NSUlfREFUQV9QQV9TSElGVDsKKworCWV0aC0+bWlpX2RhdGEgPSAoRkVDX01JSV9EQVRBX1NUIHwgRkVDX01JSV9EQVRBX09QX1JEIHwgRkVDX01JSV9EQVRBX1RBIHwgcGh5IHwgcmVnKTsKKworCS8qCisJICogd2FpdCBmb3IgdGhlIHJlbGF0ZWQgaW50ZXJydXB0CisJICovCisJd2hpbGUgKCh0aW1lb3V0LS0pICYmICghKGV0aC0+aWV2ZW50ICYgMHgwMDgwMDAwMCkpKSA7CisKKwlpZiAodGltZW91dCA9PSAwKSB7CisjaWYgKERFQlVHICYgMHgyKQorCQlwcmludGYgKCJSZWFkIE1ESU8gZmFpbGVkLi4uXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBjbGVhciBtaWkgaW50ZXJydXB0IGJpdAorCSAqLworCWV0aC0+aWV2ZW50ID0gMHgwMDgwMDAwMDsKKworCS8qCisJICogaXQncyBub3cgc2FmZSB0byByZWFkIHRoZSBQSFkncyByZWdpc3RlcgorCSAqLworCSpyZXRWYWwgPSAodWludDE2KSBldGgtPm1paV9kYXRhOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmZWM1MTJ4X21paXBoeV93cml0ZSAoY2hhciAqZGV2bmFtZSwgdWludDggcGh5QWRkciwgdWludDggcmVnQWRkciwgdWludDE2IGRhdGEpCit7CisJZXRoZXJuZXRfcmVncyAqZXRoID0gKGV0aGVybmV0X3JlZ3MgKikgTVBDNTEyWF9GRUM7CisJdWludDMyIHJlZzsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZIHJlZ2lzdGVyICovCisJdWludDMyIHBoeTsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZICovCisJaW50IHRpbWVvdXQgPSAweGZmZmY7CisKKwlyZWcgPSByZWdBZGRyIDw8IEZFQ19NSUlfREFUQV9SQV9TSElGVDsKKwlwaHkgPSBwaHlBZGRyIDw8IEZFQ19NSUlfREFUQV9QQV9TSElGVDsKKworCWV0aC0+bWlpX2RhdGEgPSAoRkVDX01JSV9EQVRBX1NUIHwgRkVDX01JSV9EQVRBX09QX1dSIHwKKwkJCUZFQ19NSUlfREFUQV9UQSB8IHBoeSB8IHJlZyB8IGRhdGEpOworCisJLyoKKwkgKiB3YWl0IGZvciB0aGUgTUlJIGludGVycnVwdAorCSAqLworCXdoaWxlICgodGltZW91dC0tKSAmJiAoIShldGgtPmlldmVudCAmIDB4MDA4MDAwMDApKSkgOworCisJaWYgKHRpbWVvdXQgPT0gMCkgeworI2lmIChERUJVRyAmIDB4MikKKwkJcHJpbnRmICgiV3JpdGUgTURJTyBmYWlsZWQuLi5cbiIpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIGNsZWFyIE1JSSBpbnRlcnJ1cHQgYml0CisJICovCisJZXRoLT5pZXZlbnQgPSAweDAwODAwMDAwOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAoREVCVUcgJiAweDQwKQorc3RhdGljIHVpbnQzMiBsb2NhbF9jcmMzMiAoY2hhciAqc3RyaW5nLCB1bnNpZ25lZCBpbnQgY3JjX3ZhbHVlLCBpbnQgbGVuKQoreworCWludCBpOworCWNoYXIgYzsKKwl1bnNpZ25lZCBpbnQgY3JjLCBjb3VudDsKKworCS8qCisJICogY3JjMzIgYWxnb3JpdGhtCisJICovCisJLyoKKwkgKiBjcmMgPSAweGZmZmZmZmZmOyAqIFRoZSBpbml0aWFsaXplZCB2YWx1ZSBzaG91bGQgYmUgMHhmZmZmZmZmZgorCSAqLworCWNyYyA9IGNyY192YWx1ZTsKKworCWZvciAoaSA9IGxlbjsgLS1pID49IDA7KSB7CisJCWMgPSAqc3RyaW5nKys7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDg7IGNvdW50KyspIHsKKwkJCWlmICgoYyAmIDB4MDEpIF4gKGNyYyAmIDB4MDEpKSB7CisJCQkJY3JjID4+PSAxOworCQkJCWNyYyA9IGNyYyBeIDB4ZWRiODgzMjA7CisJCQl9IGVsc2UgeworCQkJCWNyYyA+Pj0gMTsKKwkJCX0KKwkJCWMgPj49IDE7CisJCX0KKwl9CisKKwkvKgorCSAqIEluIGJpZyBlbmRpYW4gc3lzdGVtLCBkbyBieXRlIHN3YXBpbmcgZm9yIGNyYyB2YWx1ZQorCSAqLworCSAvKiovIHJldHVybiBjcmM7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworI2VuZGlmIC8qIENPTkZJR19NUEM1MTJ4X0ZFQyAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvZmVjLmggYi9jcHUvbXBjNTEyeC9mZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQ4NzdhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvZmVjLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgLSAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDOHh4IGRyaXZlcidzIGhlYWRlciBmaWxlLgorICovCisKKyNpZm5kZWYgX19NUEM1MTJYX0ZFQ19ICisjZGVmaW5lIF9fTVBDNTEyWF9GRUNfSAorCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjNTEyeC5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7CisKK3R5cGVkZWYgc3RydWN0IGV0aGVybmV0X3JlZ2lzdGVyX3NldCB7CisKKy8qIFsxMDoyXWFkZHIgPSAwMCAqLworCisvKiAgQ29udHJvbCBhbmQgc3RhdHVzIFJlZ2lzdGVycyAob2Zmc2V0IDAwMC0xRkYpICovCisKKwl2b2xhdGlsZSB1aW50MzIgZmVjX2lkOwkJCS8qIE1CQVJfRVRIICsgMHgwMDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWV2ZW50OwkJCS8qIE1CQVJfRVRIICsgMHgwMDQgKi8KKwl2b2xhdGlsZSB1aW50MzIgaW1hc2s7CQkJLyogTUJBUl9FVEggKyAweDAwOCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzBbMV07CQkvKiBNQkFSX0VUSCArIDB4MDBDICovCisJdm9sYXRpbGUgdWludDMyIHJfZGVzX2FjdGl2ZTsJCS8qIE1CQVJfRVRIICsgMHgwMTAgKi8KKwl2b2xhdGlsZSB1aW50MzIgeF9kZXNfYWN0aXZlOwkJLyogTUJBUl9FVEggKyAweDAxNCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzFbM107CQkvKiBNQkFSX0VUSCArIDB4MDE4LTAyMCAqLworCXZvbGF0aWxlIHVpbnQzMiBlY250cmw7CQkJLyogTUJBUl9FVEggKyAweDAyNCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzJbNl07CQkvKiBNQkFSX0VUSCArIDB4MDI4LTAzQyAqLworCXZvbGF0aWxlIHVpbnQzMiBtaWlfZGF0YTsJCS8qIE1CQVJfRVRIICsgMHgwNDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgbWlpX3NwZWVkOwkJLyogTUJBUl9FVEggKyAweDA0NCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzNbN107CQkvKiBNQkFSX0VUSCArIDB4MDQ4LTA2MCAqLworCXZvbGF0aWxlIHVpbnQzMiBtaWJfY29udHJvbDsJCS8qIE1CQVJfRVRIICsgMHgwNjQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVM0WzddOwkJLyogTUJBUl9FVEggKyAweDA2OC04MCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2NudHJsOwkJLyogTUJBUl9FVEggKyAweDA4NCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2hhc2g7CQkJLyogTUJBUl9FVEggKyAweDA4OCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzVbMTRdOwkJLyogTUJBUl9FVEggKyAweDA4Yy0wQzAgKi8KKwl2b2xhdGlsZSB1aW50MzIgeF9jbnRybDsJCS8qIE1CQVJfRVRIICsgMHgwQzQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVM2WzddOwkJLyogTUJBUl9FVEggKyAweDBDOC0wRTAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcGFkZHIxOwkJCS8qIE1CQVJfRVRIICsgMHgwRTQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcGFkZHIyOwkJCS8qIE1CQVJfRVRIICsgMHgwRTggKi8KKwl2b2xhdGlsZSB1aW50MzIgb3BfcGF1c2U7CQkvKiBNQkFSX0VUSCArIDB4MEVDICovCisKKwl2b2xhdGlsZSB1aW50MzIgUkVTN1sxMF07CQkvKiBNQkFSX0VUSCArIDB4MEYwLTExNCAqLworCXZvbGF0aWxlIHVpbnQzMiBpYWRkcjE7CQkJLyogTUJBUl9FVEggKyAweDExOCAqLworCXZvbGF0aWxlIHVpbnQzMiBpYWRkcjI7CQkJLyogTUJBUl9FVEggKyAweDExQyAqLworCXZvbGF0aWxlIHVpbnQzMiBnYWRkcjE7CQkJLyogTUJBUl9FVEggKyAweDEyMCAqLworCXZvbGF0aWxlIHVpbnQzMiBnYWRkcjI7CQkJLyogTUJBUl9FVEggKyAweDEyNCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzhbNl07CQkvKiBNQkFSX0VUSCArIDB4MTI4LTEzQyAqLworCXZvbGF0aWxlIHVpbnQzMiBmaWZvX2lkOwkJLyogTUJBUl9FVEggKyAweDE0MCAqLworCXZvbGF0aWxlIHVpbnQzMiB4X3dtcms7CQkJLyogTUJBUl9FVEggKyAweDE0NCAqLworCXZvbGF0aWxlIHVpbnQzMiBSRVM5WzFdOwkJLyogTUJBUl9FVEggKyAweDE0OCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2JvdW5kOwkJLyogTUJBUl9FVEggKyAweDE0QyAqLworCXZvbGF0aWxlIHVpbnQzMiByX2ZzdGFydDsJCS8qIE1CQVJfRVRIICsgMHgxNTAgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVMxMFsxMV07CQkvKiBNQkFSX0VUSCArIDB4MTU0LTE3QyAqLworCXZvbGF0aWxlIHVpbnQzMiByX2Rlc19zdGFydDsJCS8qIE1CQVJfRVRIICsgMHgxODAgKi8KKwl2b2xhdGlsZSB1aW50MzIgeF9kZXNfc3RhcnQ7CQkvKiBNQkFSX0VUSCArIDB4MTg0ICovCisJdm9sYXRpbGUgdWludDMyIHJfYnVmZl9zaXplOwkJLyogTUJBUl9FVEggKyAweDE4OCAqLworCXZvbGF0aWxlIHVpbnQzMiBSRVMxMVsyNl07CQkvKiBNQkFSX0VUSCArIDB4MThDLTFGMCAqLworCXZvbGF0aWxlIHVpbnQzMiBkbWFfY29udHJvbDsJCS8qIE1CQVJfRVRIICsgMHgxRjQgKi8KKwl2b2xhdGlsZSB1aW50MzIgUkVTMTJbMl07CQkvKiBNQkFSX0VUSCArIDB4MUY4LTFGQyAqLworCisvKiAgTUlCIENPVU5URVJTIChPZmZzZXQgMjAwLTJGRikgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfZHJvcDsJCS8qIE1CQVJfRVRIICsgMHgyMDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3BhY2tldHM7CQkvKiBNQkFSX0VUSCArIDB4MjA0ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9iY19wa3Q7CQkvKiBNQkFSX0VUSCArIDB4MjA4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9tY19wa3Q7CQkvKiBNQkFSX0VUSCArIDB4MjBDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9jcmNfYWxpZ247CS8qIE1CQVJfRVRIICsgMHgyMTAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3VuZGVyc2l6ZTsJLyogTUJBUl9FVEggKyAweDIxNCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3Rfb3ZlcnNpemU7CS8qIE1CQVJfRVRIICsgMHgyMTggKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X2ZyYWc7CQkvKiBNQkFSX0VUSCArIDB4MjFDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9qYWI7CQkvKiBNQkFSX0VUSCArIDB4MjIwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9jb2w7CQkvKiBNQkFSX0VUSCArIDB4MjI0ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wNjQ7CQkvKiBNQkFSX0VUSCArIDB4MjI4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wNjV0bzEyNzsJLyogTUJBUl9FVEggKyAweDIyQyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfcDEyOHRvMjU1OwkvKiBNQkFSX0VUSCArIDB4MjMwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wMjU2dG81MTE7CS8qIE1CQVJfRVRIICsgMHgyMzQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3A1MTJ0bzEwMjM7CS8qIE1CQVJfRVRIICsgMHgyMzggKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3AxMDI0dG8yMDQ3OwkvKiBNQkFSX0VUSCArIDB4MjNDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wX2d0ZTIwNDg7CS8qIE1CQVJfRVRIICsgMHgyNDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X29jdGV0czsJCS8qIE1CQVJfRVRIICsgMHgyNDQgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X2Ryb3A7CQkvKiBNQkFSX0VUSCArIDB4MjQ4ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9mcmFtZV9vazsJLyogTUJBUl9FVEggKyAweDI0QyAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfMWNvbDsJCS8qIE1CQVJfRVRIICsgMHgyNTAgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X21jb2w7CQkvKiBNQkFSX0VUSCArIDB4MjU0ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9kZWY7CQkvKiBNQkFSX0VUSCArIDB4MjU4ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9sY29sOwkJLyogTUJBUl9FVEggKyAweDI1QyAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfZXhjb2w7CQkvKiBNQkFSX0VUSCArIDB4MjYwICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9tYWNlcnI7CQkvKiBNQkFSX0VUSCArIDB4MjY0ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9jc2VycjsJCS8qIE1CQVJfRVRIICsgMHgyNjggKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X3NxZTsJCS8qIE1CQVJfRVRIICsgMHgyNkMgKi8KKwl2b2xhdGlsZSB1aW50MzIgdF9mZHhmYzsJCS8qIE1CQVJfRVRIICsgMHgyNzAgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X29jdGV0c19vazsJLyogTUJBUl9FVEggKyAweDI3NCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzEzWzJdOwkJLyogTUJBUl9FVEggKyAweDI3OC0yN0MgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX2Ryb3A7CQkvKiBNQkFSX0VUSCArIDB4MjgwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wYWNrZXRzOwkJLyogTUJBUl9FVEggKyAweDI4NCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfYmNfcGt0OwkJLyogTUJBUl9FVEggKyAweDI4OCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfbWNfcGt0OwkJLyogTUJBUl9FVEggKyAweDI4QyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfY3JjX2FsaWduOwkvKiBNQkFSX0VUSCArIDB4MjkwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl91bmRlcnNpemU7CS8qIE1CQVJfRVRIICsgMHgyOTQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX292ZXJzaXplOwkvKiBNQkFSX0VUSCArIDB4Mjk4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9mcmFnOwkJLyogTUJBUl9FVEggKyAweDI5QyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfamFiOwkJLyogTUJBUl9FVEggKyAweDJBMCAqLworCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9yZXN2ZF8wOwkJLyogTUJBUl9FVEggKyAweDJBNCAqLworCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wNjQ7CQkvKiBNQkFSX0VUSCArIDB4MkE4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wNjV0bzEyNzsJLyogTUJBUl9FVEggKyAweDJBQyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfcDEyOHRvMjU1OwkvKiBNQkFSX0VUSCArIDB4MkIwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wMjU2dG81MTE7CS8qIE1CQVJfRVRIICsgMHgyQjQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX3A1MTJ0bzEwMjM7CS8qIE1CQVJfRVRIICsgMHgyQjggKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX3AxMDI0dG8yMDQ3OwkvKiBNQkFSX0VUSCArIDB4MkJDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wX2d0ZTIwNDg7CS8qIE1CQVJfRVRIICsgMHgyQzAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX29jdGV0czsJCS8qIE1CQVJfRVRIICsgMHgyQzQgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV9yX2Ryb3A7CQkvKiBNQkFSX0VUSCArIDB4MkM4ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfcl9mcmFtZV9vazsJLyogTUJBUl9FVEggKyAweDJDQyAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3JfY3JjOwkJLyogTUJBUl9FVEggKyAweDJEMCAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3JfYWxpZ247CQkvKiBNQkFSX0VUSCArIDB4MkQ0ICovCisJdm9sYXRpbGUgdWludDMyIHJfbWFjZXJyOwkJLyogTUJBUl9FVEggKyAweDJEOCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2ZkeGZjOwkJLyogTUJBUl9FVEggKyAweDJEQyAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3Jfb2N0ZXRzX29rOwkvKiBNQkFSX0VUSCArIDB4MkUwICovCisKKwl2b2xhdGlsZSB1aW50MzIgUkVTMTRbNl07CQkvKiBNQkFSX0VUSCArIDB4MkU0LTJGQyAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzE1WzY0XTsJCS8qIE1CQVJfRVRIICsgMHgzMDAtM0ZGICovCit9IGV0aGVybmV0X3JlZ3M7CisKKy8qIFJlY2VpdmUgJiBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgQnVmZmVyRGVzY3JpcHRvciB7CisJdWludDE2IHN0YXR1czsKKwl1aW50MTYgZGF0YUxlbmd0aDsKKwl1aW50MzIgZGF0YVBvaW50ZXI7Cit9IEZFQ19SQkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTYgc3RhdHVzOworCXVpbnQxNiBkYXRhTGVuZ3RoOworCXVpbnQzMiBkYXRhUG9pbnRlcjsKK30gRkVDX1RCRDsKKworLyogcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgZW51bSB7CisJU0VWRU5XSVJFLAkJCS8qIDctd2lyZSAgICAgICAqLworCU1JSTEwLAkJCQkvKiBNSUkgMTBNYnBzICAgKi8KKwlNSUkxMDAJCQkJLyogTUlJIDEwME1icHMgICovCit9IHhjZWl2ZXJfdHlwZTsKKworLyogQkQgTnVtZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRkVDX1RCRF9OVU0JCTQ4CS8qIFRoZSB1c2VyIGNhbiBhZGp1c3QgdGhpcyB2YWx1ZSAqLworI2RlZmluZSBGRUNfUkJEX05VTQkJMzIJLyogVGhlIHVzZXIgY2FuIGFkanVzdCB0aGlzIHZhbHVlICovCisKKy8qIHBhY2tldCBzaXplIGxpbWl0ICovCisjZGVmaW5lIEZFQ19NQVhfUEtUX1NJWkUJMTUzNgorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDggZnJhbWVbRkVDX01BWF9QS1RfU0laRV07Cit9IG1wYzUxMnhfZnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlGRUNfUkJEIHJiZFtGRUNfUkJEX05VTV07CQkJLyogUkJEIHJpbmcgKi8KKwlGRUNfVEJEIHRiZFtGRUNfVEJEX05VTV07CQkJLyogVEJEIHJpbmcgKi8KKwltcGM1MTJ4X2ZyYW1lIHJlY3ZfZnJhbWVzW0ZFQ19SQkRfTlVNXTsJCS8qIHJlY2VpdmUgYnVmZiAqLworfSBtcGM1MTJ4X2J1ZmZfZGVzY3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlldGhlcm5ldF9yZWdzICpldGg7CisJeGNlaXZlcl90eXBlIHhjdl90eXBlOwkJLyogdHJhbnNjZWl2ZXIgdHlwZSAqLworCW1wYzUxMnhfYnVmZl9kZXNjcyAqYmRCYXNlOwkvKiBCRCByaW5ncyBhbmQgcmVjdiBidWZmZXIgKi8KKwl1aW50MTYgcmJkSW5kZXg7CQkvKiBuZXh0IHJlY2VpdmUgQkQgdG8gcmVhZCAqLworCXVpbnQxNiB0YmRJbmRleDsJCS8qIG5leHQgdHJhbnNtaXQgQkQgdG8gc2VuZCAqLworCXVpbnQxNiB1c2VkVGJkSW5kZXg7CQkvKiBuZXh0IHRyYW5zbWl0IEJEIHRvIGNsZWFuICovCisJdWludDE2IGNsZWFuVGJkTnVtOwkJLyogdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdHJhbnNtaXQgQkRzICovCit9IG1wYzUxMnhfZmVjX3ByaXY7CisKKy8qIFJCRCBiaXRzIGRlZmluaXRpb25zICovCisjZGVmaW5lIEZFQ19SQkRfRU1QVFkJCTB4ODAwMAkvKiBCdWZmZXIgaXMgZW1wdHkgKi8KKyNkZWZpbmUgRkVDX1JCRF9XUkFQCQkweDIwMDAJLyogTGFzdCBCRCBpbiByaW5nICovCisjZGVmaW5lIEZFQ19SQkRfTEFTVAkJMHgwODAwCS8qIEJ1ZmZlciBpcyBsYXN0IGluIGZyYW1lKHVzZWxlc3MpICovCisjZGVmaW5lIEZFQ19SQkRfTUlTUwkJMHgwMTAwCS8qIE1pc3MgYml0IGZvciBwcm9tIG1vZGUgKi8KKyNkZWZpbmUgRkVDX1JCRF9CQwkJMHgwMDgwCS8qIFRoZSByZWNlaXZlZCBmcmFtZSBpcyBicm9hZGNhc3QgZnJhbWUgKi8KKyNkZWZpbmUgRkVDX1JCRF9NQwkJMHgwMDQwCS8qIFRoZSByZWNlaXZlZCBmcmFtZSBpcyBtdWx0aWNhc3QgZnJhbWUgKi8KKyNkZWZpbmUgRkVDX1JCRF9MRwkJMHgwMDIwCS8qIEZyYW1lIGxlbmd0aCB2aW9sYXRpb24gKi8KKyNkZWZpbmUgRkVDX1JCRF9OTwkJMHgwMDEwCS8qIE5vbm9jdGV0IGFsaWduIGZyYW1lICovCisjZGVmaW5lIEZFQ19SQkRfU0gJCTB4MDAwOAkvKiBTaG9ydCBmcmFtZSAqLworI2RlZmluZSBGRUNfUkJEX0NSCQkweDAwMDQJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIEZFQ19SQkRfT1YJCTB4MDAwMgkvKiBSZWNlaXZlIEZJRk8gb3ZlcnJ1biAqLworI2RlZmluZSBGRUNfUkJEX1RSCQkweDAwMDEJLyogRnJhbWUgaXMgdHJ1bmNhdGVkICovCisjZGVmaW5lIEZFQ19SQkRfRVJSCQkoRkVDX1JCRF9MRyB8IEZFQ19SQkRfTk8gfCBGRUNfUkJEX0NSIHwgXAorCQkJCUZFQ19SQkRfT1YgfCBGRUNfUkJEX1RSKQorCisvKiBUQkQgYml0cyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBGRUNfVEJEX1JFQURZCQkweDgwMDAJLyogQnVmZmVyIGlzIHJlYWR5ICovCisjZGVmaW5lIEZFQ19UQkRfV1JBUAkJMHgyMDAwCS8qIExhc3QgQkQgaW4gcmluZyAqLworI2RlZmluZSBGRUNfVEJEX0xBU1QJCTB4MDgwMAkvKiBCdWZmZXIgaXMgbGFzdCBpbiBmcmFtZSAqLworI2RlZmluZSBGRUNfVEJEX1RDCQkweDA0MDAJLyogVHJhbnNtaXQgdGhlIENSQyAqLworI2RlZmluZSBGRUNfVEJEX0FCQwkJMHgwMjAwCS8qIEFwcGVuZCBiYWQgQ1JDICovCisKKy8qIE1JSS1yZWxhdGVkIGRlZmluaXRpb3MgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX1NUCQkweDQwMDAwMDAwCS8qIFN0YXJ0IG9mIGZyYW1lIGRlbGltaXRlciAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfT1BfUkQJMHgyMDAwMDAwMAkvKiBQZXJmb3JtIGEgcmVhZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX09QX1dSCTB4MTAwMDAwMDAJLyogUGVyZm9ybSBhIHdyaXRlIG9wZXJhdGlvbiAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfUEFfTVNLCTB4MGY4MDAwMDAJLyogUEhZIEFkZHJlc3MgZmllbGQgbWFzayAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfUkFfTVNLCTB4MDA3YzAwMDAJLyogUEhZIFJlZ2lzdGVyIGZpZWxkIG1hc2sgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX1RBCQkweDAwMDIwMDAwCS8qIFR1cm5hcm91bmQgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX0RBVEFNU0sJMHgwMDAwZmZmZgkvKiBQSFkgZGF0YSBmaWVsZCAqLworCisjZGVmaW5lIEZFQ19NSUlfREFUQV9SQV9TSElGVAkxOAkvKiBNSUkgUmVnaXN0ZXIgYWRkcmVzcyBiaXRzICovCisjZGVmaW5lIEZFQ19NSUlfREFUQV9QQV9TSElGVAkyMwkvKiBNSUkgUEhZIGFkZHJlc3MgYml0cyAqLworCisjZW5kaWYJLyogX19NUEM1MTJYX0ZFQ19IICovCmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC9pMmMuYyBiL2NwdS9tcGM1MTJ4L2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTI4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9pMmMuYwpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMyAtIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQmFzZWQgb24gdGhlIE1QQzV4eHggY29kZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWZkZWYgQ09ORklHX0hBUkRfSTJDCisKKyNpbmNsdWRlIDxtcGM1MTJ4Lmg+CisjaW5jbHVkZSA8aTJjLmg+CisKKyNkZWZpbmUgaW1tciAoKGltbWFwX3QgKilDRkdfSU1NUikKKworLyogYnkgZGVmYXVsdCBzZXQgSTJDIGJ1cyAwIGFjdGl2ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBidXNfbnVtID0gMDsKKworI2RlZmluZSBJMkNfVElNRU9VVAkxMDAKKyNkZWZpbmUgSTJDX1JFVFJJRVMJMworCitzdHJ1Y3QgbXBjNTEyeF9pMmNfdGFwIHsKKwlpbnQgc2NsMnRhcDsKKwlpbnQgdGFwMnRhcDsKK307CisKK3N0YXRpYyBpbnQgIG1wY19yZWdfaW4odm9sYXRpbGUgdTMyICpyZWcpOworc3RhdGljIHZvaWQgbXBjX3JlZ19vdXQodm9sYXRpbGUgdTMyICpyZWcsIGludCB2YWwsIGludCBtYXNrKTsKK3N0YXRpYyBpbnQgIHdhaXRfZm9yX2JiKHZvaWQpOworc3RhdGljIGludCAgd2FpdF9mb3JfcGluKGludCAqc3RhdHVzKTsKK3N0YXRpYyBpbnQgIGRvX2FkZHJlc3ModWNoYXIgY2hpcCwgY2hhciByZHdyX2ZsYWcpOworc3RhdGljIGludCAgc2VuZF9ieXRlcyh1Y2hhciBjaGlwLCBjaGFyICpidWYsIGludCBsZW4pOworc3RhdGljIGludCAgcmVjZWl2ZV9ieXRlcyh1Y2hhciBjaGlwLCBjaGFyICpidWYsIGludCBsZW4pOworc3RhdGljIGludCAgbXBjX2dldF9mZHIoaW50KTsKKworc3RhdGljIGludCBtcGNfcmVnX2luICh2b2xhdGlsZSB1MzIgKnJlZykKK3sKKwlpbnQgcmV0ID0gKnJlZyA+PiAyNDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXBjX3JlZ19vdXQgKHZvbGF0aWxlIHUzMiAqcmVnLCBpbnQgdmFsLCBpbnQgbWFzaykKK3sKKwlpbnQgdG1wOworCisJaWYgKCFtYXNrKSB7CisJCSpyZWcgPSB2YWwgPDwgMjQ7CisJfSBlbHNlIHsKKwkJdG1wID0gbXBjX3JlZ19pbiAocmVnKTsKKwkJKnJlZyA9ICgodG1wICYgfm1hc2spIHwgKHZhbCAmIG1hc2spKSA8PCAyNDsKKwl9CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX2JiICh2b2lkKQoreworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgdGltZW91dCA9IEkyQ19USU1FT1VUOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBtcGNfcmVnX2luICgmcmVncy0+bXNyKTsKKworCXdoaWxlICh0aW1lb3V0LS0gJiYgKHN0YXR1cyAmIEkyQ19CQikpIHsKKwkJdm9sYXRpbGUgaW50IHRlbXA7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKwkJdGVtcCA9IG1wY19yZWdfaW4gKCZyZWdzLT5tZHIpOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCAwKTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19FTiwgMCk7CisKKwkJdWRlbGF5ICgxMDAwKTsKKwkJc3RhdHVzID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1zcik7CisJfQorCisJcmV0dXJuIChzdGF0dXMgJiBJMkNfQkIpOworfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX3BpbiAoaW50ICpzdGF0dXMpCit7CisJaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbW1yLT5pMmMuZGV2W2J1c19udW1dOworCWludCB0aW1lb3V0ID0gSTJDX1RJTUVPVVQ7CisKKwkqc3RhdHVzID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1zcik7CisKKwl3aGlsZSAodGltZW91dC0tICYmICEoKnN0YXR1cyAmIEkyQ19JRikpIHsKKwkJdWRlbGF5ICgxMDAwKTsKKwkJKnN0YXR1cyA9IG1wY19yZWdfaW4gKCZyZWdzLT5tc3IpOworCX0KKworCWlmICghKCpzdGF0dXMgJiBJMkNfSUYpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1zciwgMCwgSTJDX0lGKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2FkZHJlc3MgKHVjaGFyIGNoaXAsIGNoYXIgcmR3cl9mbGFnKQoreworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgc3RhdHVzOworCisJY2hpcCA8PD0gMTsKKworCWlmIChyZHdyX2ZsYWcpIHsKKwkJY2hpcCB8PSAxOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfVFgsIEkyQ19UWCk7CisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tZHIsIGNoaXAsIDApOworCisJaWYgKHdhaXRfZm9yX3BpbiAoJnN0YXR1cykpIHsKKwkJcmV0dXJuIC0yOworCX0KKworCWlmIChzdGF0dXMgJiBJMkNfUlhBSykgeworCQlyZXR1cm4gLTM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9ieXRlcyAodWNoYXIgY2hpcCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgd3Jjb3VudDsKKwlpbnQgc3RhdHVzOworCisJZm9yICh3cmNvdW50ID0gMDsgd3Jjb3VudCA8IGxlbjsgKyt3cmNvdW50KSB7CisKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tZHIsIGJ1Zlt3cmNvdW50XSwgMCk7CisKKwkJaWYgKHdhaXRfZm9yX3BpbiAoJnN0YXR1cykpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIEkyQ19SWEFLKSB7CisJCQlicmVhazsKKwkJfQorCisJfQorCisJcmV0dXJuICEod3Jjb3VudCA9PSBsZW4pOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfYnl0ZXMgKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltbXItPmkyYy5kZXZbYnVzX251bV07CisJaW50IGR1bW15ICAgPSAxOworCWludCByZGNvdW50ID0gMDsKKwlpbnQgc3RhdHVzOworCWludCBpOworCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19UWCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJYnVmW3JkY291bnRdID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1kcik7CisKKwkJaWYgKGR1bW15KSB7CisJCQlkdW1teSA9IDA7CisJCX0gZWxzZSB7CisJCQlyZGNvdW50Kys7CisJCX0KKworCQlpZiAod2FpdF9mb3JfcGluICgmc3RhdHVzKSkgeworCQkJcmV0dXJuIC00OworCQl9CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19UWEFLLCBJMkNfVFhBSyk7CisJYnVmW3JkY291bnQrK10gPSBtcGNfcmVnX2luICgmcmVncy0+bWRyKTsKKworCWlmICh3YWl0X2Zvcl9waW4gKCZzdGF0dXMpKSB7CisJCXJldHVybiAtNTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1RYQUspOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqIEkyQyBBUEkgKioqKioqKioqKioqKioqKi8KKwordm9pZCBpMmNfaW5pdCAoaW50IHNwZWVkLCBpbnQgc2FkZHIpCit7CisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgSTJDX0JVU19DTlQ7IGkrKyl7CisJCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltpXTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIDApOworCisJCS8qIFNldCBjbG9jayAqLworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1mZHIsIG1wY19nZXRfZmRyIChzcGVlZCksIDApOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1hZHIsIHNhZGRyIDw8IDEsIDApOworCisJCS8qIEVuYWJsZSBtb2R1bGUgKi8KKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19FTiwgSTJDX0lOSVRfTUFTSyk7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bXNyLCAwLCBJMkNfSUYpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWltbXItPmkyYy5pY3IgPSAwOworCS8qIFR1cm4gb2ZmIGZpbHRlcnMgKi8KKwlpbW1yLT5pMmMubWlmciA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG1wY19nZXRfZmRyIChpbnQgc3BlZWQpCit7CisJc3RhdGljIGludCBmZHIgPSAtMTsKKworCWlmIChmZHIgPT0gLTEpIHsKKwkJdWxvbmcgYmVzdF9zcGVlZCA9IDA7CisJCXVsb25nIGRpdmlkZXI7CisJCXVsb25nIGlwYiwgc2NsOworCQl1bG9uZyBiZXN0bWF0Y2ggPSAweGZmZmZmZmZmVUw7CisJCWludCBiZXN0X2kgPSAwLCBiZXN0X2ogPSAwLCBpLCBqOworCQlpbnQgU0NMX1RhcFtdID0geyA5LCAxMCwgMTIsIDE1LCA1LCA2LCA3LCA4fTsKKwkJc3RydWN0IG1wYzUxMnhfaTJjX3RhcCBzY2x0YXBbXSA9IHsKKwkJCXs0LCAxfSwKKwkJCXs0LCAyfSwKKwkJCXs2LCA0fSwKKwkJCXs2LCA4fSwKKwkJCXsxNCwgMTZ9LAorCQkJezMwLCAzMn0sCisJCQl7NjIsIDY0fSwKKwkJCXsxMjYsIDEyOH0KKwkJfTsKKworCQlpcGIgPSBnZC0+aXBiX2NsazsKKwkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJCWZvciAoaiA9IDc7IGogPj0gMDsgai0tKSB7CisJCQkJc2NsID0gMiAqIChzY2x0YXBbal0uc2NsMnRhcCArCisJCQkJCSAgIChTQ0xfVGFwW2ldIC0gMSkgKiBzY2x0YXBbal0udGFwMnRhcAorCQkJCQkgICArIDIpOworCQkJCWlmIChpcGIgPD0gc3BlZWQqc2NsKSB7CisJCQkJCWlmICgoc3BlZWQqc2NsIC0gaXBiKSA8IGJlc3RtYXRjaCkgeworCQkJCQkJYmVzdG1hdGNoID0gc3BlZWQqc2NsIC0gaXBiOworCQkJCQkJYmVzdF9pID0gaTsKKwkJCQkJCWJlc3RfaiA9IGo7CisJCQkJCQliZXN0X3NwZWVkID0gaXBiL3NjbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlkaXZpZGVyID0gKGJlc3RfaSAmIDMpIHwgKChiZXN0X2kgJiA0KSA8PCAzKSB8IChiZXN0X2ogPDwgMik7CisJCWlmIChnZC0+ZmxhZ3MgJiBHRF9GTEdfUkVMT0MpIHsKKwkJCWZkciA9IGRpdmlkZXI7CisJCX0gZWxzZSB7CisJCQlkZWJ1ZygiJWxkIGtIeiwgXG4iLCBiZXN0X3NwZWVkIC8gMTAwMCk7CisJCQlyZXR1cm4gZGl2aWRlcjsKKwkJfQorCX0KKworCXJldHVybiBmZHI7Cit9CisKK2ludCBpMmNfcHJvYmUgKHVjaGFyIGNoaXApCit7CisJaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbW1yLT5pMmMuZGV2W2J1c19udW1dOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEkyQ19SRVRSSUVTOyBpKyspIHsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19TVEEsIEkyQ19TVEEpOworCisJCWlmICghIGRvX2FkZHJlc3MgKGNoaXAsIDApKSB7CisJCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJCQl1ZGVsYXkgKDUwMCk7CisJCQlicmVhazsKKwkJfQorCisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCBJMkNfU1RBKTsKKwkJdWRlbGF5ICg1MDApOworCX0KKworCXJldHVybiAoaSA9PSBJMkNfUkVUUklFUyk7Cit9CisKK2ludCBpMmNfcmVhZCAodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwljaGFyIHhhZGRyWzRdOworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgcmV0ID0gLTE7CisKKwl4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisJeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworCXhhZGRyWzJdID0gKGFkZHIgPj4gIDgpICYgMHhGRjsKKwl4YWRkclszXSA9ICBhZGRyCSYgMHhGRjsKKworCWlmICh3YWl0X2Zvcl9iYiAoKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogYnVzIGlzIGJ1c3lcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19TVEEsIEkyQ19TVEEpOworCWlmIChkb19hZGRyZXNzIChjaGlwLCAwKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogZmFpbGVkIHRvIGFkZHJlc3MgY2hpcFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoc2VuZF9ieXRlcyAoY2hpcCwgJnhhZGRyWzQtYWxlbl0sIGFsZW4pKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgSTJDX1JTVEEsIEkyQ19SU1RBKTsKKwlpZiAoZG9fYWRkcmVzcyAoY2hpcCwgMSkpIHsKKwkJcHJpbnRmICgiaTJjX3JlYWQ6IGZhaWxlZCB0byBhZGRyZXNzIGNoaXBcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJaWYgKHJlY2VpdmVfYnl0ZXMgKGNoaXAsIChjaGFyICopYnVmLCBsZW4pKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiByZWNlaXZlX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlyZXQgPSAwOworRG9uZToKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGkyY193cml0ZSAodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwljaGFyIHhhZGRyWzRdOworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgcmV0ID0gLTE7CisKKwl4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisJeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworCXhhZGRyWzJdID0gKGFkZHIgPj4gIDgpICYgMHhGRjsKKwl4YWRkclszXSA9ICBhZGRyCSYgMHhGRjsKKworCWlmICh3YWl0X2Zvcl9iYiAoKSkgeworCQlwcmludGYgKCJpMmNfd3JpdGU6IGJ1cyBpcyBidXN5XG4iKTsKKwkJZ290byBEb25lOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKwlpZiAoZG9fYWRkcmVzcyAoY2hpcCwgMCkpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBmYWlsZWQgdG8gYWRkcmVzcyBjaGlwXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmIChzZW5kX2J5dGVzIChjaGlwLCAmeGFkZHJbNC1hbGVuXSwgYWxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoc2VuZF9ieXRlcyAoY2hpcCwgKGNoYXIgKilidWYsIGxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlyZXQgPSAwOworRG9uZToKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJcmV0dXJuIHJldDsKK30KKwordWNoYXIgaTJjX3JlZ19yZWFkICh1Y2hhciBjaGlwLCB1Y2hhciByZWcpCit7CisJdWNoYXIgYnVmOworCisJaTJjX3JlYWQgKGNoaXAsIHJlZywgMSwgJmJ1ZiwgMSk7CisKKwlyZXR1cm4gYnVmOworfQorCit2b2lkIGkyY19yZWdfd3JpdGUgKHVjaGFyIGNoaXAsIHVjaGFyIHJlZywgdWNoYXIgdmFsKQoreworCWkyY193cml0ZSAoY2hpcCwgcmVnLCAxLCAmdmFsLCAxKTsKKworCXJldHVybjsKK30KKworCitpbnQgaTJjX3NldF9idXNfbnVtICh1bnNpZ25lZCBpbnQgYnVzKQoreworCWlmIChidXMgPj0gSTJDX0JVU19DTlQpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlidXNfbnVtID0gYnVzOworCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCBpMmNfZ2V0X2J1c19udW0gKHZvaWQpCit7CisJcmV0dXJuIGJ1c19udW07Cit9CisKKy8qIFRPRE8gKi8KK3Vuc2lnbmVkIGludCBpMmNfZ2V0X2J1c19zcGVlZCAodm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBpMmNfc2V0X2J1c19zcGVlZCAodW5zaWduZWQgaW50IHNwZWVkKQoreworCWlmIChzcGVlZCAhPSBDRkdfSTJDX1NQRUVEKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIENPTkZJR19IQVJEX0kyQyAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvaW50ZXJydXB0cy5jIGIvY3B1L21wYzUxMngvaW50ZXJydXB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzI0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogRGVyaXZlZCBmcm9tIHRoZSBNUEM4M3h4IGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworc3RydWN0IGlycV9hY3Rpb24geworCWludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXI7CisJdm9pZCAqYXJnOworCXVsb25nIGNvdW50OworfTsKKworaW50IGludGVycnVwdF9pbml0X2NwdSAodW5zaWduZWQgKmRlY3JlbWVudGVyX2NvdW50KQoreworCSpkZWNyZW1lbnRlcl9jb3VudCA9IGdldF90YmNsayAoKSAvIENGR19IWjsKKworCXJldHVybiAwOworfQorCisvKgorICogSW5zdGFsbCBhbmQgZnJlZSBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLwordm9pZAoraXJxX2luc3RhbGxfaGFuZGxlciAoaW50IGlycSwgaW50ZXJydXB0X2hhbmRsZXJfdCAqIGhhbmRsZXIsIHZvaWQgKmFyZykKK3sKK30KKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyIChpbnQgaXJxKQoreworfQorCit2b2lkIHRpbWVyX2ludGVycnVwdF9jcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L3NlcmlhbC5jIGIvY3B1L21wYzUxMngvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwZmYyYwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L3NlcmlhbC5jCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwIC0gMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBCYXNlZCBvbnQgdGhlIE1QQzUyMDAgUFNDIGRyaXZlci4KKyAqIEFkYXB0ZWQgZm9yIE1QQzUxMnggYnkgSmFuIFdyb2JlbCA8d3JyQHNlbWloYWxmLmNvbT4KKyAqLworCisvKgorICogTWluaW1hbCBzZXJpYWwgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2Ugb25lIG9mIHRoZSBQU0MgcG9ydHMKKyAqIGFzIHNlcmlhbCBjb25zb2xlIGludGVyZmFjZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfUFNDX0NPTlNPTEUpCisKK3N0YXRpYyB2b2lkIGZpZm9faW5pdCAodm9sYXRpbGUgcHNjNTEyeF90ICpwc2MpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKworCS8qIHJlc2V0IFJ4ICYgVHggZmlmbyBzbGljZSAqLworCXBzYy0+cmZjbWQgPSBQU0NfRklGT19SRVNFVF9TTElDRTsKKwlwc2MtPnRmY21kID0gUFNDX0ZJRk9fUkVTRVRfU0xJQ0U7CisKKwkvKiBkaXNhYmxlIFR4ICYgUnggRklGTyBpbnRlcnJ1cHRzICovCisJcHNjLT5yZmludG1hc2sgPSAwOworCXBzYy0+dGZpbnRtYXNrID0gMDsKKworCXBzYy0+dGZzaXplID0gQ09OU09MRV9GSUZPX1RYX1NJWkUgfCAoQ09OU09MRV9GSUZPX1RYX0FERFIgPDwgMTYpOworCXBzYy0+cmZzaXplID0gQ09OU09MRV9GSUZPX1JYX1NJWkUgfCAoQ09OU09MRV9GSUZPX1JYX0FERFIgPDwgMTYpOworCisJLyogZW5hYmxlIFR4ICYgUnggRklGTyBzbGljZSAqLworCXBzYy0+cmZjbWQgPSBQU0NfRklGT19FTkFCTEVfU0xJQ0U7CisJcHNjLT50ZmNtZCA9IFBTQ19GSUZPX0VOQUJMRV9TTElDRTsKKworCWltLT5maWZvYy5maWZvY19jbWQgPSBGSUZPQ19ESVNBQkxFX0NMT0NLX0dBVEU7CisJX19hc21fXyB2b2xhdGlsZSAoInN5bmMiKTsKK30KKworaW50IHNlcmlhbF9pbml0KHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKwl1bnNpZ25lZCBsb25nIGJhc2VjbGs7CisJaW50IGRpdjsKKworCWZpZm9faW5pdCAocHNjKTsKKworCS8qIHNldCBNUiByZWdpc3RlciB0byBwb2ludCB0byBNUjEgKi8KKwlwc2MtPmNvbW1hbmQgPSBQU0NfU0VMX01PREVfUkVHXzE7CisKKwkvKiBkaXNhYmxlIFR4L1J4ICovCisJcHNjLT5jb21tYW5kID0gUFNDX1RYX0RJU0FCTEUgfCBQU0NfUlhfRElTQUJMRTsKKworCS8qIGNob29zZSB0aGUgcHJlc2NhbGVyCWJ5IDE2IGZvciB0aGUgVHgvUnggY2xvY2sgZ2VuZXJhdGlvbiAqLworCXBzYy0+cHNjX2Nsb2NrX3NlbGVjdCA9ICAweGRkMDA7CisKKwkvKiBzd2l0Y2ggdG8gVUFSVCBtb2RlICovCisJcHNjLT5zaWNyID0gMDsKKworCS8qIG1vZGUgcmVnaXN0ZXIgcG9pbnRzIHRvIG1yMSAqLworCS8qIGNvbmZpZ3VyZSBwYXJpdHksIGJpdCBsZW5ndGggYW5kIHNvIG9uIGluIG1vZGUgcmVnaXN0ZXIgMSovCisJcHNjLT5tb2RlID0gUFNDX01PREVfOF9CSVRTIHwgUFNDX01PREVfUEFSTk9ORTsKKwkvKiBub3csIG1vZGUgcmVnaXN0ZXIgcG9pbnRzIHRvIG1yMiAqLworCXBzYy0+bW9kZSA9IFBTQ19NT0RFXzFfU1RPUEJJVDsKKworCS8qIGNhbGN1bGF0ZSBkaXZpZG9yIGZvciBzZXR0aW5nIFBTQyBDVFVSIGFuZCBDVExSIHJlZ2lzdGVycyAqLworCWJhc2VjbGsgPSAoZ2QtPmlwYl9jbGsgKyA4KSAvIDE2OworCWRpdiA9IChiYXNlY2xrICsgKGdkLT5iYXVkcmF0ZSAvIDIpKSAvIGdkLT5iYXVkcmF0ZTsKKworCXBzYy0+Y3R1ciA9IChkaXYgPj4gOCkgJiAweGZmOworCS8qIHNldCBiYXVkcmF0ZSAqLworCXBzYy0+Y3RsciA9IGRpdiAmIDB4ZmY7CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJcHNjLT5wc2NfaW1yID0gMDsKKworCS8qIHJlc2V0IGFuZCBlbmFibGUgUngvVHggKi8KKwlwc2MtPmNvbW1hbmQgPSBQU0NfUlNUX1JYOworCXBzYy0+Y29tbWFuZCA9IFBTQ19SU1RfVFg7CisJcHNjLT5jb21tYW5kID0gUFNDX1JYX0VOQUJMRSB8IFBTQ19UWF9FTkFCTEU7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzZXJpYWxfcHV0YyAoY29uc3QgY2hhciBjKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCWlmIChjID09ICdcbicpCisJCXNlcmlhbF9wdXRjICgnXHInKTsKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLiAqLworCXdoaWxlICghKHBzYy0+cHNjX3N0YXR1cyAmIFBTQ19TUl9UWEVNUCkpCisJCTsKKworCXBzYy0+dGZkYXRhXzggPSBjOworfQorCit2b2lkIHNlcmlhbF9wdXRjX3JhdyAoY29uc3QgY2hhciBjKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgcHNjNTEyeF90ICpwc2MgPSAocHNjNTEyeF90ICopICZpbS0+cHNjW0NPTkZJR19QU0NfQ09OU09MRV07CisKKwkvKiBXYWl0IGZvciBsYXN0IGNoYXJhY3RlciB0byBnby4gKi8KKwl3aGlsZSAoIShwc2MtPnBzY19zdGF0dXMgJiBQU0NfU1JfVFhFTVApKQorCQk7CisKKwlwc2MtPnRmZGF0YV84ID0gYzsKK30KKworCit2b2lkIHNlcmlhbF9wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzZXJpYWxfcHV0YyAoKnMrKyk7CisJfQorfQorCitpbnQgc2VyaWFsX2dldGMgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCS8qIFdhaXQgZm9yIGEgY2hhcmFjdGVyIHRvIGFycml2ZS4gKi8KKwl3aGlsZSAocHNjLT5yZnN0YXQgJiBQU0NfRklGT19FTVBUWSkKKwkJOworCisJcmV0dXJuIHBzYy0+cmZkYXRhXzg7Cit9CisKK2ludCBzZXJpYWxfdHN0YyAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJcmV0dXJuICEocHNjLT5yZnN0YXQgJiBQU0NfRklGT19FTVBUWSk7Cit9CisKK3ZvaWQgc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCXVuc2lnbmVkIGxvbmcgYmFzZWNsaywgZGl2OworCisJYmFzZWNsayA9IChnZC0+Y3NiX2NsayArIDgpIC8gMTY7CisJZGl2ID0gKGJhc2VjbGsgKyAoZ2QtPmJhdWRyYXRlIC8gMikpIC8gZ2QtPmJhdWRyYXRlOworCisJcHNjLT5jdHVyID0gKGRpdiA+PiA4KSAmIDB4RkY7CisJcHNjLT5jdGxyID0gIGRpdiAmIDB4ZmY7IC8qIHNldCBiYXVkcmF0ZSAqLworfQorCit2b2lkIHNlcmlhbF9zZXRydHMoaW50IHMpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCWlmIChzKSB7CisJCS8qIEFzc2VydCBSVFMgKGJlY29tZSBMT1cpICovCisJCXBzYy0+b3AxID0gMHgxOworCX0KKwllbHNlIHsKKwkJLyogTmVnYXRlIFJUUyAoYmVjb21lIEhJR0gpICovCisJCXBzYy0+b3AwID0gMHgxOworCX0KK30KKworaW50IHNlcmlhbF9nZXRjdHModm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJcmV0dXJuIChwc2MtPmlwICYgMHgxKSA/IDAgOiAxOworfQorI2VuZGlmIC8qIENPTkZJR19QU0NfQ09OU09MRSAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvc3BlZWQuYyBiL2NwdS9tcGM1MTJ4L3NwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwOTgyNwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L3NwZWVkLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEJhc2VkIG9uIHRoZSBNUEM4M3h4IGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworc3RhdGljIGludCBzcG1mX211bHRbXSA9IHsKKwk2OCwgMSwgMTIsIDE2LAorCTIwLCAyNCwgMjgsIDMyLAorCTM2LCA0MCwgNDQsIDQ4LAorCTUyLCA1NiwgNjAsIDY0Cit9OworCitzdGF0aWMgaW50IGNwbWZfbXVsdFtdWzJdID0geworCXswLCAxfSwgezAsIDF9LCAvKiAwIGFuZCAxIGFyZSBub3QgdmFsaWQgKi8KKwl7MSwgMX0sIHszLCAyfSwKKwl7MiwgMX0sIHs1LCAyfSwKKwl7MywgMX0sIHs3LCAyfSwKKwl7MCwgMX0sIHswLCAxfSwgLyogYW5kIGFsbCBhYm92ZSA3IGFyZSBub3QgdmFsaWQgdG9vICovCisJezAsIDF9LCB7MCwgMX0sCisJezAsIDF9LCB7MCwgMX0sCisJezAsIDF9LCB7MCwgMX0KK307CisKK3N0YXRpYyBpbnQgc3lzX2Rpdmlkb3JzW11bMl0gPSB7CisJezIsIDF9LCB7NSwgMn0sIHszLCAxfSwgezcsIDJ9LCB7NCwgMX0sCisJezksIDJ9LCB7NSwgMX0sIHs3LCAxfSwgezYsIDF9LCB7OCwgMX0sCisJezksIDF9LCB7MTEsIDF9LCB7MTAsIDF9LCB7MTIsIDF9LCB7MTMsIDF9LAorCXsxNSwgMX0sIHsxNCwgMX0sIHsxNiwgMX0sIHsxNywgMX0sIHsxOSwgMX0sCisJezE4LCAxfSwgezIwLCAxfSwgezIxLCAxfSwgezIzLCAxfSwgezIyLCAxfSwKKwl7MjQsIDF9LCB7MjUsIDF9LCB7MjcsIDF9LCB7MjYsIDF9LCB7MjgsIDF9LAorCXsyOSwgMX0sIHszMSwgMX0sIHszMCwgMX0sIHszMiwgMX0sIHszMywgMX0KK307CisKK2ludCBnZXRfY2xvY2tzICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdTggc3BtZjsKKwl1OCBjcG1mOworCXU4IHN5c19kaXY7CisJdTggaXBzX2RpdjsKKwl1MzIgcmVmX2NsayA9IENGR19NUEM1MTJYX0NMS0lOOworCXUzMiBzcGxsOworCXUzMiBzeXNfY2xrOworCXUzMiBjb3JlX2NsazsKKwl1MzIgY3NiX2NsazsKKwl1MzIgaXBzX2NsazsKKworCWlmICgoaW0tPnN5c2NvbmYuaW1tcmJhciAmIElNTVJCQVJfQkFTRV9BRERSKSAhPSAodTMyKSBpbSkKKwkJcmV0dXJuIC0xOworCisJc3BtZiA9IChpbS0+Y2xrLnNwbXIgJiBTUE1SX1NQTUYpID4+IFNQTVJfU1BNRl9TSElGVDsKKwlzcGxsID0gcmVmX2NsayAqIHNwbWZfbXVsdFtzcG1mXTsKKworCXN5c19kaXYgPSAoaW0tPmNsay5zY2ZyWzFdICYgU0NGUjJfU1lTX0RJVikgPj4gU0NGUjJfU1lTX0RJVl9TSElGVDsKKwlzeXNfY2xrID0gKHNwbGwgKiBzeXNfZGl2aWRvcnNbc3lzX2Rpdl1bMV0pIC8gc3lzX2Rpdmlkb3JzW3N5c19kaXZdWzBdOworCisJY3NiX2NsayA9IHN5c19jbGsgLyAyOworCisJY3BtZiA9IChpbS0+Y2xrLnNwbXIgJiBTUE1SX0NQTUYpID4+IFNQTVJfQ1BNRl9TSElGVDsKKwljb3JlX2NsayA9IChjc2JfY2xrICogY3BtZl9tdWx0W2NwbWZdWzBdKSAvIGNwbWZfbXVsdFtjcG1mXVsxXTsKKworCWlwc19kaXYgPSAoaW0tPmNsay5zY2ZyWzBdICYgU0NGUjFfSVBTX0RJVl9NQVNLKSA+PiBTQ0ZSMV9JUFNfRElWX1NISUZUOworCWlmIChpcHNfZGl2ICE9IDApIHsKKwkJaXBzX2NsayA9IGNzYl9jbGsgLyBpcHNfZGl2OworCX0gZWxzZSB7CisJCS8qIGluIGNhc2Ugd2UgY2Fubm90IGdldCBhIHNhbmUgSVBTIGRpdmlzb3IsIGZhaWwgZ3JhY2VmdWxseSAqLworCQlpcHNfY2xrID0gMDsKKwl9CisKKwlnZC0+aXBiX2NsayA9IGlwc19jbGs7CisJZ2QtPmNzYl9jbGsgPSBjc2JfY2xrOworCWdkLT5jcHVfY2xrID0gY29yZV9jbGs7CisJZ2QtPmJ1c19jbGsgPSBjc2JfY2xrOworCXJldHVybiAwOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2J1c19mcmVxCisgKiByZXR1cm4gc3lzdGVtIGJ1cyBmcmVxIGluIEh6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgZ2V0X2J1c19mcmVxICh1bG9uZyBkdW1teSkKK3sKKwlyZXR1cm4gZ2QtPmNzYl9jbGs7Cit9CisKK2ludCBkb19jbG9ja3MgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlwcmludGYgKCJDbG9jayBjb25maWd1cmF0aW9uOlxuIik7CisJcHJpbnRmICgiICBDUFU6ICAgICAgICAgICAgICAgICAlNGQgTUh6XG4iLCBnZC0+Y3B1X2NsayAvIDEwMDAwMDApOworCXByaW50ZiAoIiAgQ29oZXJlbnQgU3lzdGVtIEJ1czogJTRkIE1IelxuIiwgZ2QtPmNzYl9jbGsgLyAxMDAwMDAwKTsKKwlwcmludGYgKCIgIElQUyBCdXM6ICAgICAgICAgICAgICU0ZCBNSHpcbiIsIGdkLT5pcGJfY2xrIC8gMTAwMDAwMCk7CisJcHJpbnRmICgiICBERFI6ICAgICAgICAgICAgICAgICAlNGQgTUh6XG4iLCAyICogZ2QtPmNzYl9jbGsgLyAxMDAwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworVV9CT09UX0NNRChjbG9ja3MsIDEsIDAsIGRvX2Nsb2NrcywKKwkiY2xvY2tzICAtIHByaW50IGNsb2NrIGNvbmZpZ3VyYXRpb25cbiIsCisJIiAgICBjbG9ja3NcbiIKKyk7CisKK2ludCBwcnRfbXBjNTEyeF9jbGtzICh2b2lkKQoreworCWRvX2Nsb2NrcyAoTlVMTCwgMCwgMCwgTlVMTCk7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L3N0YXJ0LlMgYi9jcHUvbXBjNTEyeC9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGM2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9zdGFydC5TCkBAIC0wLDAgKzEsNzgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk4ICBEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0PgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBNYWdudXMgRGFtbSA8a2llcmF5cGMwMS5wLnkua2llLmVyYS5lcmljc3Nvbi5zZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNyBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICogQ29weXJpZ2h0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIDIwMDQsIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQmFzZWQgb24gdGhlIE1QQzgzeHggY29kZS4KKyAqLworCisvKgorICogIFUtQm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgTVBDNTEyeCBiYXNlZCBFbWJlZGRlZCBCb2FyZHMKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjNTEyeC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2RlZmluZSBDT05GSUdfNTIxWAkxCQkvKiBuZWVkZWQgZm9yIExpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZXMqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZm5kZWYgIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgIENPTkZJR19JREVOVF9TVFJJTkcgIk1QQzUxMlgiCisjZW5kaWYKKworLyoKKyAqIEZsb2F0aW5nIFBvaW50IGVuYWJsZSwgTWFjaGluZSBDaGVjayBhbmQgUmVjb3ZlcmFibGUgSW50ZXJyLgorICovCisjdW5kZWYJTVNSX0tFUk5FTAorI2lmZGVmIERFQlVHCisjZGVmaW5lIE1TUl9LRVJORUwgKE1TUl9GUHxNU1JfUkkpCisjZWxzZQorI2RlZmluZSBNU1JfS0VSTkVMIChNU1JfRlB8TVNSX01FfE1TUl9SSSkKKyNlbmRpZgorCisvKiBNYWNyb3MgZm9yIG1hbmlwdWxhdGluZyBDU3hfU1RBUlQvU1RPUCAqLworI2RlZmluZSBTVEFSVF9SRUcoc3RhcnQpCSgoc3RhcnQpID4+IDE2KQorI2RlZmluZSBTVE9QX1JFRyhzdGFydCwgc2l6ZSkJKCgoc3RhcnQpICsgKHNpemUpIC0gMSkgPj4gMTYpCisKKy8qCisgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCisgKgorICogVXNlIHIxNCB0byBhY2Nlc3MgdGhlIEdPVAorICovCisJU1RBUlRfR09UCisJR09UX0VOVFJZKF9HT1QyX1RBQkxFXykKKwlHT1RfRU5UUlkoX0ZJWFVQX1RBQkxFXykKKworCUdPVF9FTlRSWShfc3RhcnQpCisJR09UX0VOVFJZKF9zdGFydF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWShfZW5kX29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisKKwlHT1RfRU5UUlkoX19pbml0X2VuZCkKKwlHT1RfRU5UUlkoX2VuZCkKKwlHT1RfRU5UUlkoX19ic3Nfc3RhcnQpCisJRU5EX0dPVAorCisvKgorICogTWFnaWMgbnVtYmVyIGFuZCB2ZXJzaW9uIHN0cmluZworICovCisJLmxvbmcJMHgyNzA1MTk1NgkJLyogVS1Cb290IE1hZ2ljIE51bWJlciAqLworCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwordmVyc2lvbl9zdHJpbmc6CisJLmFzY2lpIFVfQk9PVF9WRVJTSU9OCisJLmFzY2lpICIgKCIsIF9fREFURV9fLCAiIC0gIiwgX19USU1FX18sICIpIgorCS5hc2NpaSAiICIsIENPTkZJR19JREVOVF9TVFJJTkcsICJcMCIKKworLyoKKyAqIFZlY3RvciBUYWJsZQorICovCisJLnRleHQKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKworCS5nbG9ibAlfc3RhcnQKKwkvKiBTdGFydCBmcm9tIGhlcmUgYWZ0ZXIgcmVzZXQvcG93ZXIgb24gKi8KK19zdGFydDoKKwlsaQlyMjEsIEJPT1RGTEFHX0NPTEQgIC8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisJYglib290X2NvbGQKKworCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycworX3N0YXJ0X29mX3ZlY3RvcnM6CisKKy8qIE1hY2hpbmUgY2hlY2sgKi8KKwlTVERfRVhDRVBUSU9OKDB4MjAwLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKworLyogRGF0YSBTdG9yYWdlIGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4MzAwLCBEYXRhU3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW5zdHJ1Y3Rpb24gU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDQwMCwgSW5zdFN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEV4dGVybmFsIEludGVycnVwdCBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDUwMCwgRXh0SW50ZXJydXB0LCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLworCS4gPSAweDYwMAorQWxpZ25tZW50OgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwltZnNwcglyNCxEQVIKKwlzdHcJcjQsX0RBUihyMjEpCisJbWZzcHIJcjUsRFNJU1IKKwlzdHcJcjUsX0RTSVNSKHIyMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJbGkJcjIwLE1TUl9LRVJORUwKKwlybHdpbWkJcjIwLHIyMywwLDE2LDE2CQkvKiBjb3B5IEVFIGJpdCBmcm9tIHNhdmVkIE1TUiAqLworCXJsd2ltaQlyMjAscjIzLDAsMjUsMjUJCS8qIGNvcHkgSVAgYml0IGZyb20gc2F2ZWQgTVNSICovCisJbHd6CXI2LEdPVCh0cmFuc2Zlcl90b19oYW5kbGVyKQorCW10bHIJcjYKKwlibHJsCisuTF9BbGlnbm1lbnQ6CisJLmxvbmcJQWxpZ25tZW50RXhjZXB0aW9uIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwkubG9uZwlpbnRfcmV0dXJuIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKworLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KKwkuID0gMHg3MDAKK1Byb2dyYW1DaGVjazoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWxpCXIyMCxNU1JfS0VSTkVMCisJcmx3aW1pCXIyMCxyMjMsMCwxNiwxNgkJLyogY29weSBFRSBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KKwlybHdpbWkJcjIwLHIyMywwLDI1LDI1CQkvKiBjb3B5IElQIGJpdCBmcm9tIHNhdmVkIE1TUiAqLworCWx3eglyNixHT1QodHJhbnNmZXJfdG9faGFuZGxlcikKKwltdGxyCXI2CisJYmxybAorLkxfUHJvZ3JhbUNoZWNrOgorCS5sb25nCVByb2dyYW1DaGVja0V4Y2VwdGlvbiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisKKy8qIEZsb2F0aW5nIFBvaW50IFVuaXQgdW5hdmFpbGFibGUgZXhjZXB0aW9uICovCisJU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogRGVjcmVtZW50ZXIgKi8KKwlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgdGltZXJfaW50ZXJydXB0KQorCisvKiBDcml0aWNhbCBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4YTAwLCBDcml0aWNhbCwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogU3lzdGVtIENhbGwgKi8KKwlTVERfRVhDRVBUSU9OKDB4YzAwLCBTeXN0ZW1DYWxsLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBUcmFjZSBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4ZDAwLCBUcmFjZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogUGVyZm9ybWFuY2UgTW9uaXRvciBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4ZjAwLCBQZXJmTW9uLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnRydWN0aW9uIFRyYW5zbGF0aW9uIE1pc3MgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTAwMCwgSW5zdHJ1Y3Rpb25UTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBEYXRhIExvYWQgVHJhbnNsYXRpb24gTWlzcyAqLworCVNURF9FWENFUFRJT04oMHgxMTAwLCBEYXRhTG9hZFRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisKKy8qIERhdGEgU3RvcmUgVHJhbnNsYXRpb24gTWlzcyAqLworCVNURF9FWENFUFRJT04oMHgxMjAwLCBEYXRhU3RvcmVUTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnN0cnVjdGlvbiBBZGRyZXNzIEJyZWFrcG9pbnQgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTMwMCwgSW5zdHJ1Y3Rpb25BZGRyQnJlYWtwb2ludCwgRGVidWdFeGNlcHRpb24pCisKKy8qIFN5c3RlbSBNYW5hZ2VtZW50IGludGVycnVwdCAqLworCVNURF9FWENFUFRJT04oMHgxNDAwLCBTeXN0ZW1NZ210SW50ZXJydXB0LCBVbmtub3duRXhjZXB0aW9uKQorCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisJLiA9IDB4MzAwMAorYm9vdF9jb2xkOgorCS8qIFNhdmUgbXNyIGNvbnRlbnRzICovCisJbWZtc3IJcjUKKworCS8qIFNldCBJTU1SIGFyZWEgdG8gb3VyIHByZWZlcnJlZCBsb2NhdGlvbiAqLworCWxpcwlyNCwgQ09ORklHX0RFRkFVTFRfSU1NUkBoCisJbGlzCXIzLCBDRkdfSU1NUkBoCisJb3JpCXIzLCByMywgQ0ZHX0lNTVJAbAorCXN0dwlyMywgSU1NUkJBUihyNCkKKwltdHNwcglNQkFSLCByMwkJLyogSU1NUkJBUiBpcyBtaXJyb3JlZCBpbnRvIHRoZSBNQkFSIFNQUiAoMzExKSAqLworCisJLyogSW5pdGlhbGlzZSB0aGUgbWFjaGluZSAqLworCWJsCWNwdV9lYXJseV9pbml0CisKKwkvKgorCSAqIFNldCB1cCBMb2NhbCBBY2Nlc3MgV2luZG93czoKKwkgKgorCSAqIDEpIEJvb3QvQ1MwIChib290IEZMQVNIKQorCSAqIDIpIE9uLWNoaXAgU1JBTSAoaW5pdGlhbCBzdGFjayBwdXJwb3NlcykKKwkgKi8KKworCS8qIEJvb3QgQ1MvQ1MwIHdpbmRvdyByYW5nZSAqLworCWxpcyAgICAgcjMsIENGR19JTU1SQGgKKwlvcmkgICAgIHIzLCByMywgQ0ZHX0lNTVJAbAorCisJbGlzCXI0LCBTVEFSVF9SRUcoQ0ZHX0ZMQVNIX0JBU0UpCisJb3JpCXI0LCByNCwgU1RPUF9SRUcoQ0ZHX0ZMQVNIX0JBU0UsIENGR19GTEFTSF9TSVpFKQorCXN0dwlyNCwgTFBDUzBBVyhyMykKKworCS8qCisJICogVGhlIFNSQU0gd2luZG93IGhhcyBhIGZpeGVkIHNpemUgKDI1NkspLCBzbyBvbmx5IHRoZSBzdGFydCBhZGRyZXNzCisJICogaXMgbmVjZXNzYXJ5CisJICovCisJbGlzIAlyNCwgU1RBUlRfUkVHKENGR19TUkFNX0JBU0UpICYgMHhmZjAwCisJc3R3CXI0LCBTUkFNQkFSKHIzKQorCisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gTVBDNTEyMWUgUk0sIGNvbmZpZ3VyaW5nIGxvY2FsIGFjY2VzcyB3aW5kb3dzIHNob3VsZAorCSAqIGJlIGZvbGxvd2VkIGJ5IGEgZHVtbXkgcmVhZCBvZiB0aGUgY29uZmlnIHJlZ2lzdGVyIHRoYXQgd2FzCisJICogbW9kaWZpZWQgbGFzdCBhbmQgYW4gaXN5bmMKKwkgKi8KKwlsd3oJcjQsIFNSQU1CQVIocjMpCisJaXN5bmMKKworCS8qCisJICogU2V0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIEJvb3QvQ1MwLCB0aGUgU1JBTSB3aW5kb3cgZG9lcyBub3QgaGF2ZSBhCisJICogY29uZmlnIHJlZ2lzdGVyIHNvIG5vIHBhcmFtcyBjYW4gYmUgc2V0IGZvciBpdAorCSAqLworCWxpcyAgICAgcjMsIChDRkdfSU1NUiArIExQQ19PRkZTRVQpQGgKKwlvcmkgICAgIHIzLCByMywgKENGR19JTU1SICsgTFBDX09GRlNFVClAbAorCisJbGlzICAgICByNCwgQ0ZHX0NTMF9DRkdAaAorCW9yaSAgICAgcjQsIHI0LCBDRkdfQ1MwX0NGR0BsCisJc3R3ICAgICByNCwgQ1MwX0NPTkZJRyhyMykKKworCS8qIE1hc3RlciBlbmFibGUgYWxsIENTJ3MgKi8KKwlsaXMJcjQsIENTX0NUUkxfTUVAaAorCW9yaQlyNCwgcjQsIENTX0NUUkxfTUVAbAorCXN0dwlyNCwgQ1NfQ1RSTChyMykKKworCWxpcwlyNCwgKENGR19NT05JVE9SX0JBU0UpQGgKKwlvcmkJcjQsIHI0LCAoQ0ZHX01PTklUT1JfQkFTRSlAbAorCWFkZGkJcjUsIHI0LCBpbl9mbGFzaCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyNQorCWJscgorCitpbl9mbGFzaDoKKwlsaXMJcjEsIChDRkdfSU5JVF9SQU1fQUREUiArIENGR19HQkxfREFUQV9PRkZTRVQpQGgKKwlvcmkJcjEsIHIxLCAoQ0ZHX0lOSVRfUkFNX0FERFIgKyBDRkdfR0JMX0RBVEFfT0ZGU0VUKUBsCisKKwlsaQlyMCwgMAkJLyogTWFrZSByb29tIGZvciBzdGFjayBmcmFtZSBoZWFkZXIgYW5kCSovCisJc3R3dQlyMCwgLTQocjEpCS8qIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvIHRoYXQJKi8KKwlzdHd1CXIwLCAtNChyMSkJLyogc3RhY2sgYmFja3RyYWNlcyB0ZXJtaW5hdGUgY2xlYW5seQkqLworCisJLyogbGV0IHRoZSBDLWNvZGUgc2V0IHVwIHRoZSByZXN0CQkJKi8KKwkvKgkJCQkJCQkqLworCS8qIEJlIGNhcmVmdWwgdG8ga2VlcCBjb2RlIHJlbG9jYXRhYmxlICYgc3RhY2sgaHVtYmxlCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJR0VUX0dPVAkJCS8qIGluaXRpYWxpemUgR09UIGFjY2VzcwkqLworCisJLyogcjM6IElNTVIgKi8KKwlsaXMJcjMsIENGR19JTU1SQGgKKwkvKiBydW4gbG93LWxldmVsIENQVSBpbml0IGNvZGUgKGluIEZsYXNoKSAqLworCWJsCWNwdV9pbml0X2YKKworCS8qIHIzOiBCT09URkxBRyAqLworCW1yCXIzLCByMjEKKwkvKiBydW4gMXN0IHBhcnQgb2YgYm9hcmQgaW5pdCBjb2RlIChpbiBGbGFzaCkgKi8KKwlibAlib2FyZF9pbml0X2YKKworCS8qIE5PVFJFQUNIRUQgLSBib2FyZF9pbml0X2YoKSBkb2VzIG5vdCByZXR1cm4gKi8KKworLyoKKyAqIFRoaXMgY29kZSBmaW5pc2hlcyBzYXZpbmcgdGhlIHJlZ2lzdGVycyB0byB0aGUgZXhjZXB0aW9uIGZyYW1lCisgKiBhbmQganVtcHMgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBleGNlcHRpb24uCisgKiBSZWdpc3RlciByMjEgaXMgcG9pbnRlciBpbnRvIHRyYXAgZnJhbWUsIHIxIGhhcyBuZXcgc3RhY2sgcG9pbnRlci4KKyAqLworCS5nbG9ibAl0cmFuc2Zlcl90b19oYW5kbGVyCit0cmFuc2Zlcl90b19oYW5kbGVyOgorCXN0dwlyMjIsX05JUChyMjEpCisJbGlzCXIyMixNU1JfUE9XQGgKKwlhbmRjCXIyMyxyMjMscjIyCisJc3R3CXIyMyxfTVNSKHIyMSkKKwlTQVZFX0dQUig3LCByMjEpCisJU0FWRV80R1BSUyg4LCByMjEpCisJU0FWRV84R1BSUygxMiwgcjIxKQorCVNBVkVfOEdQUlMoMjQsIHIyMSkKKwltZmxyCXIyMworCWFuZGkuCXIyNCxyMjMsMHgzZjAwCQkvKiBnZXQgdmVjdG9yIG9mZnNldCAqLworCXN0dwlyMjQsVFJBUChyMjEpCisJbGkJcjIyLDAKKwlzdHcJcjIyLFJFU1VMVChyMjEpCisJbHd6CXIyNCwwKHIyMykJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBoYW5kbGVyICovCisJbHd6CXIyMyw0KHIyMykJCS8qIHdoZXJlIHRvIGdvIHdoZW4gZG9uZSAqLworCW10c3ByCVNSUjAscjI0CisJbXRzcHIJU1JSMSxyMjAKKwltdGxyCXIyMworCVNZTkMKKwlyZmkJCQkJLyoganVtcCB0byBoYW5kbGVyLCBlbmFibGUgTU1VICovCisKK2ludF9yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1JSMCxyMgorCW10c3ByCVNSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZpCisKKy8qCisgKiBUaGlzIGNvZGUgaW5pdGlhbGlzZXMgdGhlIG1hY2hpbmUsIGl0IGV4cGVjdHMgb3JpZ2luYWwgTVNSIGNvbnRlbnRzIHRvIGJlIGluIHI1LgorICovCitjcHVfZWFybHlfaW5pdDoKKwkvKiBJbml0aWFsaXplIG1hY2hpbmUgc3RhdHVzOyBlbmFibGUgbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpCXIzLCBNU1JfS0VSTkVMCQkJLyogU2V0IE1FIGFuZCBSSSBmbGFncyAqLworCXJsd2ltaQlyMywgcjUsIDAsIDI1LCAyNQkJLyogcHJlc2VydmUgSVAgYml0ICovCisjaWZkZWYgREVCVUcKKwlybHdpbWkJcjMsIHI1LCAwLCAyMSwgMjIJCS8qIGRlYnVnZ2VyIG1pZ2h0IHNldCBTRSwgQkUgYml0cyAqLworI2VuZGlmCisJbXRtc3IJcjMKKwlTWU5DCisJbXRzcHIJU1JSMSwgcjMJCQkvKiBNaXJyb3IgY3VycmVudCBNU1Igc3RhdGUgaW4gU1JSMSAqLworCisJbGlzCXIzLCBDRkdfSU1NUkBoCisKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwkvKiBJbml0aWFsaXNlIHRoZSB3YXRjaGRvZyBhbmQgcmVzZXQgaXQgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaXMgcjQsIENGR19XQVRDSERPR19WQUxVRQorCW9yaSByNCwgcjQsIChTV0NSUl9TV0VOIHwgU1dDUlJfU1dSSSB8IFNXQ1JSX1NXUFIpCisJc3R3IHI0LCBTV0NSUihyMykKKworCS8qIHJlc2V0ICovCisJbGkJcjQsIDB4NTU2QworCXN0aAlyNCwgU1dTUlJAbChyMykKKwlsaQlyNCwgMHgwCisJb3JpCXI0LCByNCwgMHhBQTM5CisJc3RoCXI0LCBTV1NSUkBsKHIzKQorI2Vsc2UKKwkvKiBEaXNhYmxlIHRoZSB3YXRjaGRvZyAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbHd6IHI0LCBTV0NSUihyMykKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiBpdCdzIGVuYWJsZWQgZm9yIGRpc2FibGluZzogb25jZSBkaXNhYmxlZCBieSBzL3cKKwkgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byByZS1lbmFibGUgaXQKKwkgKi8KKwlhbmRpLiByNCwgcjQsIDB4NAorCWJlcSAxZgorCXhvciByNCwgcjQsIHI0CisJc3R3IHI0LCBTV0NSUihyMykKKzE6CisjZW5kaWYgLyogQ09ORklHX1dBVENIRE9HICovCisKKwkvKiBJbml0aWFsaXplIHRoZSBIYXJkd2FyZSBJbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgUmVnaXN0ZXJzICovCisJLyogSElEMCBhbHNvIGNvbnRhaW5zIGNhY2hlIGNvbnRyb2wJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaXMJcjMsIENGR19ISUQwX0lOSVRAaAorCW9yaQlyMywgcjMsIENGR19ISUQwX0lOSVRAbAorCVNZTkMKKwltdHNwcglISUQwLCByMworCisJbGlzCXIzLCBDRkdfSElEMF9GSU5BTEBoCisJb3JpCXIzLCByMywgQ0ZHX0hJRDBfRklOQUxAbAorCVNZTkMKKwltdHNwcglISUQwLCByMworCisJbGlzCXIzLCBDRkdfSElEMkBoCisJb3JpCXIzLCByMywgQ0ZHX0hJRDJAbAorCVNZTkMKKwltdHNwcglISUQyLCByMworCXN5bmMKKwlibHIKKworCisvKiBDYWNoZSBmdW5jdGlvbnMuCisgKgorICogTm90ZTogcmVxdWlyZXMgdGhhdCBhbGwgY2FjaGUgYml0cyBpbgorICogSElEMCBhcmUgaW4gdGhlIGxvdyBoYWxmIHdvcmQuCisgKi8KKwkuZ2xvYmwJaWNhY2hlX2VuYWJsZQoraWNhY2hlX2VuYWJsZToKKwltZnNwcglyMywgSElEMAorCW9yaQlyMywgcjMsIEhJRDBfSUNFCisJbGlzCXI0LCAwCisJb3JpCXI0LCByNCwgSElEMF9JTE9DSworCWFuZGMJcjMsIHIzLCByNAorCW9yaQlyNCwgcjMsIEhJRDBfSUNGSQorCWlzeW5jCisJbXRzcHIJSElEMCwgcjQgICAgLyogc2V0cyBlbmFibGUgYW5kIGludmFsaWRhdGUsIGNsZWFycyBsb2NrICovCisJaXN5bmMKKwltdHNwcglISUQwLCByMwkvKiBjbGVhcnMgaW52YWxpZGF0ZSAqLworCWJscgorCisJLmdsb2JsCWljYWNoZV9kaXNhYmxlCitpY2FjaGVfZGlzYWJsZToKKwltZnNwcglyMywgSElEMAorCWxpcwlyNCwgMAorCW9yaQlyNCwgcjQsIEhJRDBfSUNFfEhJRDBfSUxPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlvcmkJcjQsIHIzLCBISUQwX0lDRkkKKwlpc3luYworCW10c3ByCUhJRDAsIHI0ICAgICAvKiBzZXRzIGludmFsaWRhdGUsIGNsZWFycyBlbmFibGUgYW5kIGxvY2sqLworCWlzeW5jCisJbXRzcHIJSElEMCwgcjMJLyogY2xlYXJzIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlpY2FjaGVfc3RhdHVzCitpY2FjaGVfc3RhdHVzOgorCW1mc3ByCXIzLCBISUQwCisJcmx3aW5tCXIzLCByMywgKDMxIC0gSElEMF9JQ0VfU0hJRlQgKyAxKSwgMzEsIDMxCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX2VuYWJsZQorZGNhY2hlX2VuYWJsZToKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0RDRkl8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNQorCW10c3ByCUhJRDAsIHIzCQkvKiBubyBpbnZhbGlkYXRlLCB1bmxvY2sgKi8KKwlvcmkJcjMsIHIzLCBISUQwX0RDRQorCW9yaQlyNSwgcjMsIEhJRDBfRENGSQorCW10c3ByCUhJRDAsIHI1CQkvKiBlbmFibGUgKyBpbnZhbGlkYXRlICovCisJbXRzcHIJSElEMCwgcjMJCS8qIGVuYWJsZSAqLworCXN5bmMKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZGlzYWJsZQorZGNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0RDRXxISUQwX0RMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9EQ0kKKwlzeW5jCisJbXRzcHIJSElEMCwgcjQJLyogc2V0cyBpbnZhbGlkYXRlLCBjbGVhcnMgZW5hYmxlIGFuZCBsb2NrICovCisJc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX3N0YXR1cworZGNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXJsd2lubQlyMywgcjMsICgzMSAtIEhJRDBfRENFX1NISUZUICsgMSksIDMxLCAzMQorCWJscgorCisJLmdsb2JsIGdldF9wdnIKK2dldF9wdnI6CisJbWZzcHIJcjMsIFBWUgorCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgcHBjRGNiZiAqLworLyogRGVzY3JpcHRpb246CSBEYXRhIENhY2hlIGJsb2NrIGZsdXNoICovCisvKiBJbnB1dDoJIHIzID0gZWZmZWN0aXZlIGFkZHJlc3MgKi8KKy8qIE91dHB1dDoJIG5vbmUuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJcHBjRGNiZgorcHBjRGNiZjoKKwlkY2JmCXIwLHIzCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBwcGNEY2JpICovCisvKiBEZXNjcmlwdGlvbjoJIERhdGEgQ2FjaGUgYmxvY2sgSW52YWxpZGF0ZSAqLworLyogSW5wdXQ6CSByMyA9IGVmZmVjdGl2ZSBhZGRyZXNzICovCisvKiBPdXRwdXQ6CSBub25lLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCXBwY0RjYmkKK3BwY0RjYmk6CisJZGNiaQlyMCxyMworCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJIHBwY0RjYnoKKyAqIERlc2NyaXB0aW9uOgkgRGF0YSBDYWNoZSBibG9jayB6ZXJvLgorICogSW5wdXQ6CSByMyA9IGVmZmVjdGl2ZSBhZGRyZXNzCisgKiBPdXRwdXQ6CSBub25lLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLmdsb2JsCXBwY0RjYnoKK3BwY0RjYno6CisJZGNieglyMCxyMworCWJscgorCisJLmdsb2JsCXBwY0RXc3RvcmUKK3BwY0RXc3RvcmU6CisJbGZkCTEsIDAocjQpCisJc3RmZAkxLCAwKHIzKQorCWJscgorCisJLmdsb2JsCXBwY0RXbG9hZAorcHBjRFdsb2FkOgorCWxmZAkxLCAwKHIzKQorCXN0ZmQJMSwgMChyNCkKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIHZvaWQgcmVsb2NhdGVfY29kZSAoYWRkcl9zcCwgZ2QsIGFkZHJfbW9uaSkKKyAqCisgKiBUaGlzICJmdW5jdGlvbiIgZG9lcyBub3QgcmV0dXJuLCBpbnN0ZWFkIGl0IGNvbnRpbnVlcyBpbiBSQU0KKyAqIGFmdGVyIHJlbG9jYXRpbmcgdGhlIG1vbml0b3IgY29kZS4KKyAqCisgKiByMyA9IGRlc3QKKyAqIHI0ID0gc3JjCisgKiByNSA9IGxlbmd0aCBpbiBieXRlcworICogcjYgPSBjYWNoZWxpbmVzaXplCisgKi8KKwkuZ2xvYmwJcmVsb2NhdGVfY29kZQorcmVsb2NhdGVfY29kZToKKwltcglyMSwgIHIzCQkvKiBTZXQgbmV3IHN0YWNrIHBvaW50ZXIJKi8KKwltcglyOSwgIHI0CQkvKiBTYXZlIGNvcHkgb2YgR2xvYmFsIERhdGEgcG9pbnRlciAqLworCW1yCXIxMCwgcjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisKKwltcglyMywgIHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKwlsaXMJcjQsIENGR19NT05JVE9SX0JBU0VAaAkJLyogU291cmNlICAgICAgQWRkcmVzcyAqLworCW9yaQlyNCwgcjQsIENGR19NT05JVE9SX0JBU0VAbAorCWx3eglyNSwgR09UKF9faW5pdF9lbmQpCisJc3ViCXI1LCByNSwgcjQKKwlsaQlyNiwgQ0ZHX0NBQ0hFTElORV9TSVpFCQkvKiBDYWNoZSBMaW5lIFNpemUgKi8KKworCS8qCisJICogRml4IEdPVCBwb2ludGVyOgorCSAqCisJICogTmV3IEdPVC1QVFIgPSAob2xkIEdPVC1QVFIgLSBDRkdfTU9OSVRPUl9CQVNFKQorCSAqCQkrIERlc3RpbmF0aW9uIEFkZHJlc3MKKwkgKgorCSAqIE9mZnNldDoKKwkgKi8KKwlzdWIJcjE1LCByMTAsIHI0CisKKwkvKiBGaXJzdCBvdXIgb3duIEdPVCAqLworCWFkZAlyMTQsIHIxNCwgcjE1CisJLyogdGhlbiB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisJY21wbHcJY3IxLHIzLHI0CisJYWRkaQlyMCxyNSwzCisJc3J3aS4JcjAscjAsMgorCWJlcQljcjEsNGYJCS8qIEluIHBsYWNlIGNvcHkgaXMgbm90IG5lY2Vzc2FyeSAqLworCWJlcQk3ZgkJLyogUHJvdGVjdCBhZ2FpbnN0IDAgY291bnQJICAqLworCW10Y3RyCXIwCisJYmdlCWNyMSwyZgorCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorCisJLyogY29weSAqLworMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJbXRjdHIJcjAKKwlsYQlyOCwtNChyNCkKKwlsYQlyNywtNChyMykKKworCS8qIGFuZCBjb21wYXJlICovCisyMDoJbHd6dQlyMjAsNChyOCkKKwlsd3p1CXIyMSw0KHI3KQorCXhvci4gcjIyLCByMjAsIHIyMQorCWJuZSAgMzBmCisJYmRuegkyMGIKKwliIDRmCisKKwkvKiBjb21wYXJlIGZhaWxlZCAqLworMzA6CWxpIHIzLCAwCisJYmxyCisKKzI6CXNsd2kJcjAscjAsMiAvKiByZSBjb3B5IGluIHJldmVyc2Ugb3JkZXIgLi4uIHkgZG8gd2UgbmVlZGVkIGl0PyAqLworCWFkZAlyOCxyNCxyMAorCWFkZAlyNyxyMyxyMAorMzoJbHd6dQlyMCwtNChyOCkKKwlzdHd1CXIwLC00KHI3KQorCWJkbnoJM2IKKworLyoKKyAqIE5vdyBmbHVzaCB0aGUgY2FjaGU6IG5vdGUgdGhhdCB3ZSBtdXN0IHN0YXJ0IGZyb20gYSBjYWNoZSBhbGlnbmVkCisgKiBhZGRyZXNzLiBPdGhlcndpc2Ugd2UgbWlnaHQgbWlzcyBvbmUgY2FjaGUgbGluZS4KKyAqLworNDoJY21wd2kJcjYsMAorCWFkZAlyNSxyMyxyNQorCWJlcQk3ZgkJLyogQWx3YXlzIGZsdXNoIHByZWZldGNoIHF1ZXVlIGluIGFueSBjYXNlICovCisJc3ViaQlyMCxyNiwxCisJYW5kYwlyMyxyMyxyMAorCW1yCXI0LHIzCis1OglkY2JzdAkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNWIKKwlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGRjYnN0IHRvIGNvbXBsZXRlIG9uIGJ1cyAqLworCW1yCXI0LHIzCis2OglpY2JpCTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk2YgorNzoJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBpY2JpIHRvIGNvbXBsZXRlIG9uIGJ1cwkqLworCWlzeW5jCisKKy8qCisgKiBXZSBhcmUgZG9uZS4gRG8gbm90IHJldHVybiwgaW5zdGVhZCBicmFuY2ggdG8gc2Vjb25kIHBhcnQgb2YgYm9hcmQKKyAqIGluaXRpYWxpemF0aW9uLCBub3cgcnVubmluZyBmcm9tIFJBTS4KKyAqLworCWFkZGkJcjAsIHIxMCwgaW5fcmFtIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwltdGxyCXIwCisJYmxyCisKK2luX3JhbToKKwkvKgorCSAqIFJlbG9jYXRpb24gRnVuY3Rpb24sIHIxNCBwb2ludCB0byBnb3QyKzB4ODAwMAorCSAqCisJICogQWRqdXN0IGdvdDIgcG9pbnRlcnMsIG5vIG5lZWQgdG8gY2hlY2sgZm9yIDAsIHRoaXMgY29kZQorCSAqIGFscmVhZHkgcHV0cyBhIGZldyBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKwkgKi8KKwlsaQlyMCxfX2dvdDJfZW50cmllc0BzZWN0b2ZmQGwKKwlsYQlyMyxHT1QoX0dPVDJfVEFCTEVfKQorCWx3eglyMTEsR09UKF9HT1QyX1RBQkxFXykKKwltdGN0cglyMAorCXN1YglyMTEscjMscjExCisJYWRkaQlyMyxyMywtNAorMToJbHd6dQlyMCw0KHIzKQorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjAsMChyMykKKwliZG56CTFiCisKKwkvKgorCSAqIE5vdyBhZGp1c3QgdGhlIGZpeHVwcyBhbmQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXh1cHMKKwkgKiBpbiBjYXNlIHdlIG5lZWQgdG8gbW92ZSBvdXJzZWx2ZXMgYWdhaW4uCisJICovCisyOglsaQlyMCxfX2ZpeHVwX2VudHJpZXNAc2VjdG9mZkBsCisJbHd6CXIzLEdPVChfRklYVVBfVEFCTEVfKQorCWNtcHdpCXIwLDAKKwltdGN0cglyMAorCWFkZGkJcjMscjMsLTQKKwliZXEJNGYKKzM6CWx3enUJcjQsNChyMykKKwlsd3p1eAlyMCxyNCxyMTEKKwlhZGQJcjAscjAscjExCisJc3R3CXIxMCwwKHIzKQorCXN0dwlyMCwwKHI0KQorCWJkbnoJM2IKKzQ6CitjbGVhcl9ic3M6CisJLyoKKwkgKiBOb3cgY2xlYXIgQlNTIHNlZ21lbnQKKwkgKi8KKwlsd3oJcjMsR09UKF9fYnNzX3N0YXJ0KQorCWx3eglyNCxHT1QoX2VuZCkKKworCWNtcGx3CTAsIHIzLCByNAorCWJlcQk2ZgorCisJbGkJcjAsIDAKKzU6CisJc3R3CXIwLCAwKHIzKQorCWFkZGkJcjMsIHIzLCA0CisJY21wbHcJMCwgcjMsIHI0CisJYm5lCTViCis2OgorCW1yCXIzLCByOQkJLyogR2xvYmFsIERhdGEgcG9pbnRlcgkJKi8KKwltcglyNCwgcjEwCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCQkqLworCWJsCWJvYXJkX2luaXRfcgorCisJLyoKKwkgKiBDb3B5IGV4Y2VwdGlvbiB2ZWN0b3IgY29kZSB0byBsb3cgbWVtb3J5CisJICoKKwkgKiByMzogZGVzdF9hZGRyCisJICogcjc6IHNvdXJjZSBhZGRyZXNzLCByODogZW5kIGFkZHJlc3MsIHI5OiB0YXJnZXQgYWRkcmVzcworCSAqLworCS5nbG9ibAl0cmFwX2luaXQKK3RyYXBfaW5pdDoKKwlsd3oJcjcsIEdPVChfc3RhcnQpCisJbHd6CXI4LCBHT1QoX2VuZF9vZl92ZWN0b3JzKQorCisJbGkJcjksIDB4MTAwCS8qIHJlc2V0IHZlY3RvciBhdCAweDEwMCAqLworCisJY21wbHcJMCwgcjcsIHI4CisJYmdlbHIJCQkvKiByZXR1cm4gaWYgcjc+PXI4IC0ganVzdCBpbiBjYXNlICovCisKKwltZmxyCXI0CQkvKiBzYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKzE6CisJbHd6CXIwLCAwKHI3KQorCXN0dwlyMCwgMChyOSkKKwlhZGRpCXI3LCByNywgNAorCWFkZGkJcjksIHI5LCA0CisJY21wbHcJMCwgcjcsIHI4CisJYm5lCTFiCisKKwkvKgorCSAqIHJlbG9jYXRlIGBoZGxyJyBhbmQgYGludF9yZXR1cm4nIGVudHJpZXMKKwkgKi8KKwlsaQlyNywgLkxfTWFjaGluZUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzI6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yICovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTJiCisKKwlsaQlyNywgLkxfQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfRlBVbmF2YWlsYWJsZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIFN5c3RlbUNhbGwgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMzoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IgKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJM2IKKworCWxpCXI3LCAuTF9UcmFjZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIF9lbmRfb2ZfdmVjdG9ycyAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCis0OgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvciAqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAk0YgorCisJbWZtc3IJcjMJCQkvKiBub3cgdGhhdCB0aGUgdmVjdG9ycyBoYXZlICovCisJbGlzCXI3LCBNU1JfSVBAaAkJLyogcmVsb2NhdGVkIGludG8gbG93IG1lbW9yeSAqLworCW9yaQlyNywgcjcsIE1TUl9JUEBsCS8qIE1TUltJUF0gY2FuIGJlIHR1cm5lZCBvZmYgKi8KKwlhbmRjCXIzLCByMywgcjcJCS8qIChpZiBpdCB3YXMgb24pICovCisJU1lOQwkJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMworCVNZTkMKKworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIgICAgKi8KKwlibHIKKworCS8qCisJICogRnVuY3Rpb246IHJlbG9jYXRlIGVudHJpZXMgZm9yIG9uZSBleGNlcHRpb24gdmVjdG9yCisJICovCit0cmFwX3JlbG9jOgorCWx3eglyMCwgMChyNykJCS8qIGhkbHIgLi4uCQkqLworCWFkZAlyMCwgcjAsIHIzCQkvKiAgLi4uICs9IGRlc3RfYWRkcgkqLworCXN0dwlyMCwgMChyNykKKworCWx3eglyMCwgNChyNykJCS8qIGludF9yZXR1cm4gLi4uCSovCisJYWRkCXIwLCByMCwgcjMJCS8qICAuLi4gKz0gZGVzdF9hZGRyCSovCisJc3R3CXIwLCA0KHI3KQorCisJYmxyCmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC90cmFwcy5jIGIvY3B1L21wYzUxMngvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDU1YzkyCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvdHJhcHMuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCAtIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDODN4eCBjb2RlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBoYXJkd2FyZQorICogZXhjZXB0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlKHVuc2lnbmVkIGxvbmcpOworCisjZGVmaW5lIEVORF9PRl9NRU0JKGdkLT5iZC0+YmlfbWVtc3RhcnQgKyBnZC0+YmQtPmJpX21lbXNpemUpCisKKy8qCisgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKKyAqLworCit2b2lkCitwcmludF9iYWNrdHJhY2UgKHVuc2lnbmVkIGxvbmcgKnNwKQoreworCWludCBjbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgaTsKKworCXB1dHMgKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludClzcCA+IEVORF9PRl9NRU0pCisJCQlicmVhazsKKworCQlpID0gc3BbMV07CisJCWlmIChjbnQrKyAlIDcgPT0gMCkKKwkJCXB1dGMgKCdcbicpOworCQlwcmludGYgKCIlMDhsWCAiLCBpKTsKKwkJaWYgKGNudCA+IDMyKSBicmVhazsKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSAqc3A7CisJfQorCXB1dGMgKCdcbicpOworfQorCit2b2lkIHNob3dfcmVncyAoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpOworCisJcHJpbnRmICgiTklQOiAlMDhsWCBYRVI6ICUwOGxYIExSOiAlMDhsWCBSRUdTOiAlcCBUUkFQOiAlMDRseCBEQVI6ICUwOGxYXG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPnhlciwgcmVncy0+bGluaywgcmVncywgcmVncy0+dHJhcCwgcmVncy0+ZGFyKTsKKwlwcmludGYgKCJNU1I6ICUwOGx4IEVFOiAlMDF4IFBSOiAlMDF4IEZQOiAlMDF4IE1FOiAlMDF4IElSL0RSOiAlMDF4JTAxeFxuIiwKKwkgICAgICAgcmVncy0+bXNyLCByZWdzLT5tc3IgJiBNU1JfRUUgPyAxIDogMCwgcmVncy0+bXNyICYgTVNSX1BSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9GUCA/IDEgOiAwLHJlZ3MtPm1zciAmIE1TUl9NRSA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3IgJiBNU1JfSVIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0RSID8gMSA6IDApOworCisJcHV0YyAoJ1xuJyk7CisJZm9yIChpID0gMDsgIGkgPCAzMjsgIGkrKykgeworCQlpZiAoKGkgJSA4KSA9PSAwKSB7CisJCQlwcmludGYgKCJHUFIlMDJkOiAiLCBpKTsKKwkJfQorCisJCXByaW50ZiAoIiUwOGxYICIsIHJlZ3MtPmdwcltpXSk7CisJCWlmICgoaSAlIDgpID09IDcpIHsKKwkJCXB1dGMgKCdcbicpOworCQl9CisJfQorfQorCisKK3ZvaWQKK19leGNlcHRpb24gKGludCBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYyAoIkV4Y2VwdGlvbiBhdCBwYyAlbHggc2lnbmFsICVkIiwgcmVncy0+bmlwLHNpZ25yKTsKK30KKworCit2b2lkCitNYWNoaW5lQ2hlY2tFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZml4dXA7CisKKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSAocmVncy0+bmlwKSkgIT0gMCkgeworCQlyZWdzLT5uaXAgPSBmaXh1cDsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwdXRzICgiTWFjaGluZSBjaGVjay5cbkNhdXNlZCBieSAoZnJvbSBtc3IpOiAiKTsKKwlwcmludGYgKCJyZWdzICVwICIscmVncyk7CisJc3dpdGNoIChyZWdzLT5tc3IgJiAweDAwRkYwMDAwKSB7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMCk6CisJCXB1dHMgKCJJbnN0cnVjdGlvbiBjYWNoZSBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMSk6CisJCXB1dHMgKCJEYXRhIGNhY2hlIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDEyKToKKwkJcHV0cyAoIk1hY2hpbmUgY2hlY2sgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMyk6CisJCXB1dHMgKCJUcmFuc2ZlciBlcnJvciBhY2sgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxNCk6CisJCXB1dHMgKCJEYXRhIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDE1KToKKwkJcHV0cyAoIkFkZHJlc3MgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB1dHMgKCJVbmtub3duIHZhbHVlcyBpbiBtc3JcbiIpOworCX0KKwlzaG93X3JlZ3MgKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSAoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCisJcGFuaWMgKCJtYWNoaW5lIGNoZWNrIik7Cit9CisKK3ZvaWQKK0FsaWdubWVudEV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MgKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSAoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljICgiQWxpZ25tZW50IEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitQcm9ncmFtQ2hlY2tFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYyAoIlByb2dyYW0gQ2hlY2sgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1NvZnRFbXVFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYyAoIlNvZnR3YXJlIEVtdWxhdGlvbiBFeGNlcHRpb24iKTsKK30KKworCit2b2lkCitVbmtub3duRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXByaW50ZiAoIkJhZCB0cmFwIGF0IFBDOiAlbHgsIFNSOiAlbHgsIHZlY3Rvcj0lbHhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+bXNyLCByZWdzLT50cmFwKTsKKwlfZXhjZXB0aW9uICgwLCByZWdzKTsKK30KKworI2lmZGVmIENPTkZJR19DTURfQkVEQlVHCitleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludCAoc3RydWN0IHB0X3JlZ3MgKik7CisjZW5kaWYKKwordm9pZAorRGVidWdFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ZiAoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOworCXNob3dfcmVncyAocmVncyk7CisjaWZkZWYgQ09ORklHX0NNRF9CRURCVUcKKwlkb19iZWRidWdfYnJlYWtwb2ludCAocmVncyk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHgvY29uZmlnLm1rIGIvY3B1L21wYzV4eC9jb25maWcubWsKaW5kZXggNWIyNmE3Ni4uZTk1YjhhMSAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eC9jb25maWcubWsKKysrIGIvY3B1L21wYzV4eC9jb25maWcubWsKQEAgLTI4LDYgKzI4LDkgQEAKICMKIAogCi1QTEFURk9STV9SRUxGTEFHUyArPSAJLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpCitQTEFURk9STV9SRUxGTEFHUyArPSAJLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0JLURDT05GSUdfNXh4IC1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgLW1wb3dlcnBjIC1tc29mdC1mbG9hdAorCisjIFVzZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICBCb2FyZCBwb3J0IGNhbiBvdmVycmlkZSBpbiBib2FyZC8qL2NvbmZpZy5taworTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9jcHUvbXBjNXh4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHgvaW50ZXJydXB0cy5jIGIvY3B1L21wYzV4eC9pbnRlcnJ1cHRzLmMKaW5kZXggN2Y2ZTEzNi4uYTRmNDdjNyAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eC9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L21wYzV4eC9pbnRlcnJ1cHRzLmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCXJldHVybjsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBpcnFpbmZvIC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgSVJRcwpAQCAtMjA0LDQgKzIwNCw0IEBACiB9CiAKIAotI2VuZGlmICAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4L3RyYXBzLmMgYi9jcHUvbXBjNXh4L3RyYXBzLmMKaW5kZXggMTRmZDU5ZS4uZDIyYjg5YSAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eC90cmFwcy5jCisrKyBiL2NwdS9tcGM1eHgvdHJhcHMuYwpAQCAtMzYsMTEgKzM2LDExIEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIGV4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50KHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgKi8KIHZvaWQgQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE3OSw3ICsxNzksNyBAQAogICovCiB2b2lkIFByb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xOTMsNyArMTkzLDcgQEAKICAqLwogdm9pZCBTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIwOCw3ICsyMDgsNyBAQAogICovCiB2b2lkIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjI0LDcgKzIyNCw3IEBACiB7CiAJcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgCXNob3dfcmVncyhyZWdzKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKICAgCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHgvdS1ib290LmxkcyBiL2NwdS9tcGM1eHgvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDAwMWIxCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzV4eC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCVdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUKKyAqIChDKSBDb3B5cmlnaHQgMjAwMwlNYXJ0aW4gV2luaXN0b2VyZmVyLCBtYXJ0aW53aW5pc3RvZXJmZXJAZ214LmNoCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICAvKiBXQVJOSU5HIC0gdGhlIGZvbGxvd2luZyBpcyBoYW5kLW9wdGltaXplZCB0byBmaXQgd2l0aGluCSovCisgICAgLyogdGhlIHNlY3RvciBsYXlvdXQgb2Ygb3VyIGZsYXNoIGNoaXBzIQlYWFggRklYTUUgWFhYCSovCisKKyAgICBjcHUvbXBjNXh4L3N0YXJ0Lm8JKC50ZXh0KQorCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICB9CisgIF9ldGV4dCA9IC47CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgOgorICB7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgICAgKigucm9kYXRhLnN0cjEuNCkKKyAgICAqKC5laF9mcmFtZSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDAwRkYpICYgMHhGRkZGRkYwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4yOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pPj4yOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKworICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworLyogICAuID0gZW52X3N0YXJ0OworCS5wcGNlbnYJOgorCXsKKwkJY29tbW9uL2Vudmlyb25tZW50Lm8gKC5wcGNlbnYpCisJfQorKi8KK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L01ha2VmaWxlIGIvY3B1L21wYzV4eHgvTWFrZWZpbGUKaW5kZXggMjM1YWRiNy4uMzEyYjBiZiAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvTWFrZWZpbGUKKysrIGIvY3B1L21wYzV4eHgvTWFrZWZpbGUKQEAgLTI4LDcgKzI4LDcgQEAKIFNUQVJUCT0gc3RhcnQubwogU09CSlMJPSBpby5vIGZpcm13YXJlX3NjX3Rhc2tfYmVzdGNvbW0uaW1wbC5vIGZpcm13YXJlX3NjX3Rhc2suaW1wbC5vCiBDT0JKUwk9IGkyYy5vIHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBmZWMubyBpZGUubyBpbnRlcnJ1cHRzLm8gXAotCSAgbG9hZHRhc2subyBwY2lfbXBjNTIwMC5vIHNlcmlhbC5vIHNwZWVkLm8gdXNiX29oY2kubworCSAgbG9hZHRhc2subyBwY2lfbXBjNTIwMC5vIHNlcmlhbC5vIHNwZWVkLm8gdXNiX29oY2kubyB1c2IubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L2NvbmZpZy5tayBiL2NwdS9tcGM1eHh4L2NvbmZpZy5tawppbmRleCBlY2Q5NGU5Li4wZTg2MWM0IDEwMDY0NAotLS0gYS9jcHUvbXBjNXh4eC9jb25maWcubWsKKysrIGIvY3B1L21wYzV4eHgvY29uZmlnLm1rCkBAIC0yMSw3ICsyMSwxMCBAQAogIyBNQSAwMjExMS0xMzA3IFVTQQogIwogCi1QTEFURk9STV9SRUxGTEFHUyArPSAtZlBJQyAtZmZpeGVkLXIxNCAtbWVhYmkKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaSAtbXJlbG9jYXRhYmxlCiAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX01QQzV4eHggLWZmaXhlZC1yMiAtZmZpeGVkLXIyOSBcCiAJCSAgICAgLW1zdHJpbmcgLW1jcHU9NjAzZSAtbW11bHRpcGxlCisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L2NwdV9pbml0LmMgYi9jcHUvbXBjNXh4eC9jcHVfaW5pdC5jCmluZGV4IGQ3NDQwMzAuLmJjNjIwMWUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHh4L2NwdV9pbml0LmMKKysrIGIvY3B1L21wYzV4eHgvY3B1X2luaXQuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJLyogcm91dGUgY3JpdGljYWwgaW50cyB0byBub3JtYWwgaW50cyAqLwogCSoodnVfbG9uZyAqKU1QQzVYWFhfSUNUTF9FWFQgfD0gMHgwMDAwMDAwMTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDNXh4eF9GRUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDNXh4eF9GRUMpCiAJLyogbG9hZCBGRUMgbWljcm9jb2RlICovCiAJbG9hZHRhc2soMCwgMik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L2ZlYy5jIGIvY3B1L21wYzV4eHgvZmVjLmMKaW5kZXggODEzNjM2Ni4uMWQzZGE3NyAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvZmVjLmMKKysrIGIvY3B1L21wYzV4eHgvZmVjLmMKQEAgLTE4LDEwICsxOCwxMCBAQAogCiAvKiAjZGVmaW5lIERFQlVHCTB4MjggKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCiAJZGVmaW5lZChDT05GSUdfTVBDNXh4eF9GRUMpCiAKLSNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkKKyNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpCiAjZXJyb3IgIkNPTkZJR19NSUkgaGFzIHRvIGJlIGRlZmluZWQhIgogI2VuZGlmCiAKQEAgLTg4OSwxMyArODg5LDIwIEBACiAJZmVjLT5ldGggPSAoZXRoZXJuZXRfcmVncyAqKU1QQzVYWFhfRkVDOwogCWZlYy0+dGJkQmFzZSA9IChGRUNfVEJEICopRkVDX0JEX0JBU0U7CiAJZmVjLT5yYmRCYXNlID0gKEZFQ19SQkQgKikoRkVDX0JEX0JBU0UgKyBGRUNfVEJEX05VTSAqIHNpemVvZihGRUNfVEJEKSk7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ0FOTUIpICAgIHx8IGRlZmluZWQoQ09ORklHX0hNSTEwMDEpCXx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19JQ0VDVUJFKSAgfHwgZGVmaW5lZChDT05GSUdfSU5LQTRYMCkJfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0pVUElURVIpICB8fCBkZWZpbmVkKENPTkZJR19NQ0MyMDApCXx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19NT1RJT05QUk8pfHwgZGVmaW5lZChDT05GSUdfTzJETlQpCXx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19QTTUyMCkgICAgfHwgZGVmaW5lZChDT05GSUdfVE9QNTIwMCkJfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1RRTTUyMDApICB8fCBkZWZpbmVkKENPTkZJR19VQzEwMSkJfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1YzOEIpCisjaWYgZGVmaW5lZChDT05GSUdfQ0FOTUIpCQl8fCBcCisJZGVmaW5lZChDT05GSUdfQ001MjAwKQkJfHwgXAorCWRlZmluZWQoQ09ORklHX0hNSTEwMDEpCQl8fCBcCisJZGVmaW5lZChDT05GSUdfSUNFQ1VCRSkJCXx8IFwKKwlkZWZpbmVkKENPTkZJR19JTktBNFgwKQkJfHwgXAorCWRlZmluZWQoQ09ORklHX0pVUElURVIpCQl8fCBcCisJZGVmaW5lZChDT05GSUdfTUNDMjAwKQkJfHwgXAorCWRlZmluZWQoQ09ORklHX01PVElPTlBSTykJfHwgXAorCWRlZmluZWQoQ09ORklHX08yRE5UKQkJfHwgXAorCWRlZmluZWQoQ09ORklHX1BNNTIwKQkJfHwgXAorCWRlZmluZWQoQ09ORklHX1RPUDUyMDApCQl8fCBcCisJZGVmaW5lZChDT05GSUdfVFFNNTIwMCkJCXx8IFwKKwlkZWZpbmVkKENPTkZJR19VQzEwMSkJCXx8IFwKKwlkZWZpbmVkKENPTkZJR19WMzhCKQogIyBpZm5kZWYgQ09ORklHX0ZFQ18xME1CSVQKIAlmZWMtPnhjdl90eXBlID0gTUlJMTAwOwogIyBlbHNlCkBAIC05MTcsNyArOTI0LDcgQEAKIAlzcHJpbnRmKGRldi0+bmFtZSwgIkZFQyBFVEhFUk5FVCIpOwogCWV0aF9yZWdpc3RlcihkZXYpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCW1paXBoeV9yZWdpc3RlciAoZGV2LT5uYW1lLAogCQkJZmVjNXh4eF9taWlwaHlfcmVhZCwgZmVjNXh4eF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4eC9pZGUuYyBiL2NwdS9tcGM1eHh4L2lkZS5jCmluZGV4IDI5Yjk5ZjYuLjA4N2RkYWMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHh4L2lkZS5jCisrKyBiL2NwdS9tcGM1eHh4L2lkZS5jCkBAIC0yNCw3ICsyNCw3IEBACiAgKi8KICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmZGVmIENGR19DTURfSURFCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNpbmNsdWRlIDxtcGM1eHh4Lmg+CiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwpAQCAtODUsNCArODUsNCBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0lERSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4eC9pbnRlcnJ1cHRzLmMgYi9jcHUvbXBjNXh4eC9pbnRlcnJ1cHRzLmMKaW5kZXggYmVlYjIyMi4uODgxNmRkMSAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9tcGM1eHh4L2ludGVycnVwdHMuYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiB2b2lkIGRvX2lycWluZm8oY21kX3RibF90ICogY21kdHAsIGJkX3QgKiBiZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaW50IGlycSwgcmVfZW5hYmxlOwpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eHgvdHJhcHMuYyBiL2NwdS9tcGM1eHh4L3RyYXBzLmMKaW5kZXggMmVlNzgyYi4uZGFhMWVjNiAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvdHJhcHMuYworKysgYi9jcHUvbXBjNXh4eC90cmFwcy5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKQEAgLTEyMyw3ICsxMjMsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTU4LDcgKzE1OCw3IEBACiB2b2lkCiBBbGlnbm1lbnRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTcwLDcgKzE3MCw3IEBACiB2b2lkCiBQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTgyLDcgKzE4Miw3IEBACiB2b2lkCiBTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE5NSw3ICsxOTUsNyBAQAogdm9pZAogVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDQsNyArMjA0LDcgQEAKIAlfZXhjZXB0aW9uKDAsIHJlZ3MpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiBleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbmRpZgogCkBAIC0yMTQsNyArMjE0LDcgQEAKIAogICBwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOwogICBzaG93X3JlZ3MocmVncyk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAgIGRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzIGIvY3B1L21wYzV4eHgvdS1ib290LWN1c3RvbWxheW91dC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNzk0MwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICAvKiBXQVJOSU5HIC0gdGhlIGZvbGxvd2luZyBpcyBoYW5kLW9wdGltaXplZCB0byBmaXQgd2l0aGluICAqLworICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEgICAgWFhYIEZJWE1FIFhYWCAgICovCisKKyAgICBjcHUvbXBjNXh4eC9zdGFydC5vICAgICAgICAgICgudGV4dCkKKyAgICBjcHUvbXBjNXh4eC90cmFwcy5vICAgICAgICAgICgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vICAgICAgICAgKC50ZXh0KQorICAgIGxpYl9wcGMvY2FjaGUubyAgICAgICAgICAgICAoLnRleHQpCisgICAgbGliX3BwYy90aW1lLm8gICAgICAgICAgICAgICgudGV4dCkKKworICAgIC4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47CisgICAgY29tbW9uL2Vudmlyb25tZW50Lm8gICAgICAgICgucHBjZW52KQorCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICAgIC4gPSBBTElHTigxNik7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgICAgKigucm9kYXRhLnN0cjEuNCkKKyAgICAqKC5laF9mcmFtZSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eHgvdS1ib290LmxkcyBiL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4YTNhZgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L3VzYi5jIGIvY3B1L21wYzV4eHgvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MDlmYwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1eHh4L3VzYi5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIE1hcmt1cyBLbG90emJ1ZWNoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPG1rQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfTkVXKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkKKworI2luY2x1ZGUgPG1wYzV4eHguaD4KKworaW50IHVzYl9jcHVfaW5pdCgpCit7CisJLyogU2V0IHRoZSBVU0IgQ2xvY2sJCQkJCQkgICAgICovCisJKih2dV9sb25nICopTVBDNVhYWF9DRE1fNDhfRkRDID0gQ09ORklHX1VTQl9DTE9DSzsKKworCS8qIHJlbW92ZSBhbGwgVVNCIGJpdHMgZmlyc3QgYmVmb3JlIE9SaW5nIGluIG91cnMgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX0dQU19QT1JUX0NPTkZJRyAmPSB+MHgwMDgwNzAwMDsKKworCS8qIEFjdGl2YXRlIFVTQiBwb3J0CQkJCQkJICAgICAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfR1BTX1BPUlRfQ09ORklHIHw9IENPTkZJR19VU0JfQ09ORklHOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X3N0b3AoKQoreworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9pbml0X2ZhaWwoKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0kpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKSAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvY29uZmlnLm1rIGIvY3B1L21wYzgyMjAvY29uZmlnLm1rCmluZGV4IDZmZWM1ZGYuLmM0MWNhZmUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjIwL2NvbmZpZy5taworKysgYi9jcHUvbXBjODIyMC9jb25maWcubWsKQEAgLTIxLDcgKzIxLDEwIEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODIyMCAtZmZpeGVkLXIyIC1mZml4ZWQtcjI5IFwKIAkJICAgICAtbXN0cmluZyAtbWNwdT02MDNlIC1tbXVsdGlwbGUKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvY3B1L21wYzgyMjAvdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvY3B1X2luaXQuYyBiL2NwdS9tcGM4MjIwL2NwdV9pbml0LmMKaW5kZXggM2NmNWY2Ni4uMGRhYWM1YiAxMDA2NDQKLS0tIGEvY3B1L21wYzgyMjAvY3B1X2luaXQuYworKysgYi9jcHUvbXBjODIyMC9jcHVfaW5pdC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkvKiByb3V0ZSBjcml0aWNhbCBpbnRzIHRvIG5vcm1hbCBpbnRzICovCiAJKih2dV9sb25nICopIDB4ZjAwMDA3MTAgfD0gMHgwMDAwMDAwMTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCiAJLyogbG9hZCBGRUMgbWljcm9jb2RlICovCiAJbG9hZHRhc2sgKDAsIDIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjODIyMC9mZWMuYyBiL2NwdS9tcGM4MjIwL2ZlYy5jCmluZGV4IDEyMDFlNzkuLjk5MmUwZmYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjIwL2ZlYy5jCisrKyBiL2NwdS9tcGM4MjIwL2ZlYy5jCkBAIC0xNSwxMCArMTUsMTAgQEAKICNpbmNsdWRlICJmZWMuaCIKIAogI3VuZGVmICBERUJVRwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCiAgICAgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCiAKLSNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkKKyNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpCiAjZXJyb3IgIkNPTkZJR19NSUkgaGFzIHRvIGJlIGRlZmluZWQhIgogI2VuZGlmCiAKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCXNwcmludGYgKGRldi0+bmFtZSwgIkZFQyBFVEhFUk5FVCIpOwogCWV0aF9yZWdpc3RlciAoZGV2KTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfcmVnaXN0ZXIgKGRldi0+bmFtZSwKIAkJCWZlYzgyMjBfbWlpcGh5X3JlYWQsIGZlYzgyMjBfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvdHJhcHMuYyBiL2NwdS9tcGM4MjIwL3RyYXBzLmMKaW5kZXggY2RlZTJiZS4uODljY2ExZCAxMDA2NDQKLS0tIGEvY3B1L21wYzgyMjAvdHJhcHMuYworKysgYi9jcHUvbXBjODIyMC90cmFwcy5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJcmVncy0+bmlwID0gZml4dXA7CiAJCXJldHVybjsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKIAkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogdm9pZCBBbGlnbm1lbnRFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyCiAJICAgICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIHZvaWQgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcgogCSAgICAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCiAJCXJldHVybjsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiB2b2lkIFNvZnRFbXVFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyCiAJICAgICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIHZvaWQgVW5rbm93bkV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKIAkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CkBAIC0xOTksNyArMTk5LDcgQEAKIAlfZXhjZXB0aW9uICgwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQgKHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAJcHJpbnRmICgiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwKTsKIAlzaG93X3JlZ3MgKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCWRvX2JlZGJ1Z19icmVha3BvaW50IChyZWdzKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvdS1ib290LmxkcyBiL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5OWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS9tcGM4MjIwL3N0YXJ0Lm8JKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L2NvbmZpZy5tayBiL2NwdS9tcGM4MjR4L2NvbmZpZy5tawppbmRleCBkYWM2MWQ4Li4xN2ZkYjIxIDEwMDY0NAotLS0gYS9jcHUvbXBjODI0eC9jb25maWcubWsKKysrIGIvY3B1L21wYzgyNHgvY29uZmlnLm1rCkBAIC0yMSw2ICsyMSw5IEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaSAtZm5vLXN0cmljdC1hbGlhc2luZworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODI0WCAtZmZpeGVkLXIyIC1mZml4ZWQtcjI5IC1tc3RyaW5nIC1tY3B1PTYwM2UgLW1zb2Z0LWZsb2F0CisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM4MjR4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L3RyYXBzLmMgYi9jcHUvbXBjODI0eC90cmFwcy5jCmluZGV4IDA3MWQwMDMuLjBhNzI0MzAgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjR4L3RyYXBzLmMKKysrIGIvY3B1L21wYzgyNHgvdHJhcHMuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJX2V4Y2VwdGlvbigwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMTg1LDcgKzE4NSw3IEBACiAKICAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogICBkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvbXBjODI0eC91LWJvb3QubGRzIGIvY3B1L21wYzgyNHgvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JlZjRhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzgyNHgvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL2JlZGJ1Z182MDNlLmMgYi9jcHUvbXBjODI2MC9iZWRidWdfNjAzZS5jCmluZGV4IGJlMDljZmIuLmYxYmU0ODUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2JlZGJ1Z182MDNlLmMKKysrIGIvY3B1L21wYzgyNjAvYmVkYnVnXzYwM2UuYwpAQCAtMTAsNyArMTAsOCBAQAogI2luY2x1ZGUgPGJlZGJ1Zy9yZWdzLmg+CiAjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKSAmJiAoZGVmaW5lZChDT05GSUdfTVBDODI0WCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODI2MCkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykgXAorCSYmIChkZWZpbmVkKENPTkZJR19NUEM4MjRYKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjYwKSkKIAogI2RlZmluZSBNQVhfQlJFQUtfUE9JTlRTIDEKIApkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvY29uZmlnLm1rIGIvY3B1L21wYzgyNjAvY29uZmlnLm1rCmluZGV4IGRkN2E3MWYuLmQ0MDFlNGMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2NvbmZpZy5taworKysgYi9jcHUvbXBjODI2MC9jb25maWcubWsKQEAgLTIxLDcgKzIxLDEwIEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfODI2MCAtRENPTkZJR19DUE0yIC1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgXAogCQkgICAgIC1tc3RyaW5nIC1tY3B1PTYwM2UgLW1tdWx0aXBsZQorCisjIFVzZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICBCb2FyZCBwb3J0IGNhbiBvdmVycmlkZSBpbiBib2FyZC8qL2NvbmZpZy5taworTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9jcHUvbXBjODI2MC91LWJvb3QubGRzCmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC9jcHVfaW5pdC5jIGIvY3B1L21wYzgyNjAvY3B1X2luaXQuYwppbmRleCAzODBkN2FmLi4zNmZjMWViIDEwMDY0NAotLS0gYS9jcHUvbXBjODI2MC9jcHVfaW5pdC5jCisrKyBiL2NwdS9tcGM4MjYwL2NwdV9pbml0LmMKQEAgLTE4Miw3ICsxODIsNyBAQAogI2VuZGlmCiAKIAkvKiBub3cgcmVzdHJpY3QgdG8gcHJlbGltaW5hcnkgcmFuZ2UgKi8KLQkvKiB0aGUgUFMgY2FtZSBmcm9tIHRoZSBIUkNXLCBkb27CtHQgY2hhbmdlIGl0ICovCisJLyogdGhlIFBTIGNhbWUgZnJvbSB0aGUgSFJDVywgZG9utHQgY2hhbmdlIGl0ICovCiAJbWVtY3RsLT5tZW1jX2JyMCA9IFNFVF9WQUxfTUFTSyhtZW1jdGwtPm1lbWNfYnIwICwgQ0ZHX0JSMF9QUkVMSU0sIEJSeF9QU19NU0spOwogCW1lbWN0bC0+bWVtY19vcjAgPSBDRkdfT1IwX1BSRUxJTTsKIApkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvZXRoZXJfZmNjLmMgYi9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYwppbmRleCA1ODRjNDBmLi4zN2JmNDQ1IDEwMDY0NAotLS0gYS9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYworKysgYi9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYwpAQCAtNDcsMTMgKzQ3LDEzIEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjaW5jbHVkZSA8bWlpcGh5Lmg+CiAjZW5kaWYKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykgJiYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgXAogCWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAogc3RhdGljIHN0cnVjdCBldGhlcl9mY2NfaW5mb19zCkBAIC0zOTMsNyArMzkzLDcgQEAKIAogCQlldGhfcmVnaXN0ZXIoZGV2KTsKIAotI2lmIChkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkpIFwKKyNpZiAoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkgXAogCQkmJiBkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCQltaWlwaHlfcmVnaXN0ZXIoZGV2LT5uYW1lLAogCQkJCWJiX21paXBoeV9yZWFkLAliYl9taWlwaHlfd3JpdGUpOwpAQCAtMTE4Nyw0ICsxMTg3LDQgQEAKIAogI2VuZGlmIC8qIENPTkZJR19FVEhFUl9MT09QQkFDS19URVNUICovCiAKLSNlbmRpZgkvKiBDT05GSUdfRVRIRVJfT05fRkNDICYmIENGR19DTURfTkVUICYmIENPTkZJR19ORVRfTVVMVEkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvZXRoZXJfc2NjLmMgYi9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYwppbmRleCBhNzMzYjQ1Li5lNTY4MzlkIDEwMDY0NAotLS0gYS9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYworKysgYi9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX1NDQykgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX1NDQykgJiYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogI2lmIChDT05GSUdfRVRIRVJfSU5ERVggPT0gMSkKICMgIGRlZmluZSBQUk9GRl9FTkVUICAgICAgICAgICAgUFJPRkZfU0NDMQpAQCAtMzUzLDQgKzM1Myw0IEBACiB9CiAjZW5kaWYKIAotI2VuZGlmICAvKiBDT05GSUdfRVRIRVJfT05fU0NDICYmIENGR19DTURfTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL2ludGVycnVwdHMuYyBiL2NwdS9tcGM4MjYwL2ludGVycnVwdHMuYwppbmRleCA1NmU5YTcyLi5iZjBkNGQwIDEwMDY0NAotLS0gYS9jcHUvbXBjODI2MC9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L21wYzgyNjAvaW50ZXJydXB0cy5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKIAogLyogcmlwcGVkIHRoaXMgb3V0IG9mIHBwYzR4eC9pbnRlcnJ1cHRzLmMgKi8KIApAQCAtMjc2LDQgKzI3Niw0IEBACiAJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOwogfQogCi0jZW5kaWYJCQkJCQkJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAva2dkYi5TIGIvY3B1L21wYzgyNjAva2dkYi5TCmluZGV4IDJhMjUwMjQuLmRhZTg3YmIgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2tnZGIuUworKysgYi9jcHUvbXBjODI2MC9rZ2RiLlMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCiAgLyoKICAqIGNhY2hlIGZsdXNoaW5nIHJvdXRpbmVzIGZvciBrZ2RiCkBAIC02OSw0ICs2OSw0IEBACiAJU1lOQwogCWJscgogCi0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL3RyYXBzLmMgYi9jcHUvbXBjODI2MC90cmFwcy5jCmluZGV4IDBjMzllNDMuLmI1ZDQxNmMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL3RyYXBzLmMKKysrIGIvY3B1L21wYzgyNjAvdHJhcHMuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vbTgyNjBfcGNpLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogaW50ICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE4Niw3ICsxODYsNyBAQAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE5OCw3ICsxOTgsNyBAQAogdm9pZAogUHJvZ3JhbUNoZWNrRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIxMCw3ICsyMTAsNyBAQAogdm9pZAogU29mdEVtdUV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMjMsNyArMjIzLDcgQEAKIHZvaWQKIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjMyLDcgKzIzMiw3IEBACiAJX2V4Y2VwdGlvbigwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMjQyLDcgKzI0Miw3IEBACiAKICAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogICBkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC91LWJvb3QubGRzIGIvY3B1L21wYzgyNjAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFiYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzgyNjAvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1L21wYzgyNjAvc3RhcnQubwkJKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L01ha2VmaWxlIGIvY3B1L21wYzgzeHgvTWFrZWZpbGUKaW5kZXggYmI5NmY3Ny4uMjMyOTk3MCAxMDA2NDQKLS0tIGEvY3B1L21wYzgzeHgvTWFrZWZpbGUKKysrIGIvY3B1L21wYzgzeHgvTWFrZWZpbGUKQEAgLTI5LDcgKzI5LDcgQEAKIAogU1RBUlQJPSBzdGFydC5vCiBDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubyBcCi0JICBzcGRfc2RyYW0ubyBxZV9pby5vIHBjaS5vCisJICBzcGRfc2RyYW0ubyBlY2MubyBxZV9pby5vIHBjaS5vCiAKIFNSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvY3B1L21wYzgzeHgvY29uZmlnLm1rIGIvY3B1L21wYzgzeHgvY29uZmlnLm1rCmluZGV4IDhiNGZmOTIuLjJlYzM5NWQgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L2NvbmZpZy5taworKysgYi9jcHUvbXBjODN4eC9jb25maWcubWsKQEAgLTIwLDcgKzIwLDEwIEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODNYWCAtRENPTkZJR19FMzAwIFwKIAkJCS1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgLW1zb2Z0LWZsb2F0CisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L2NwdS5jIGIvY3B1L21wYzgzeHgvY3B1LmMKaW5kZXggODQxZmU4Mi4uYWRmODA4MyAxMDA2NDQKLS0tIGEvY3B1L21wYzgzeHgvY3B1LmMKKysrIGIvY3B1L21wYzgzeHgvY3B1LmMKQEAgLTMzLDggKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogI2luY2x1ZGUgPGZ0X2J1aWxkLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjZWxpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCiAjaW5jbHVkZSA8bGliZmR0Lmg+CiAjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgogI2VuZGlmCkBAIC0xMTMsMTIgKzExMiwxNCBAQAogCWNhc2UgU1BSXzgzNjBFX1JFVjExOgogCWNhc2UgU1BSXzgzNjBFX1JFVjEyOgogCWNhc2UgU1BSXzgzNjBFX1JFVjIwOgorCWNhc2UgU1BSXzgzNjBFX1JFVjIxOgogCQlwdXRzKCJNUEM4MzYwRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgU1BSXzgzNjBfUkVWMTA6CiAJY2FzZSBTUFJfODM2MF9SRVYxMToKIAljYXNlIFNQUl84MzYwX1JFVjEyOgogCWNhc2UgU1BSXzgzNjBfUkVWMjA6CisJY2FzZSBTUFJfODM2MF9SRVYyMToKIAkJcHV0cygiTVBDODM2MCwgIik7CiAJCWJyZWFrOwogCWNhc2UgU1BSXzgzMjNFX1JFVjEwOgpAQCAtMTUwLDcgKzE1MSw4IEBACiAJCXB1dHMoIk1QQzgzMTNFLCAiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHV0cygiUmV2OiBVbmtub3duIHJldmlzaW9uIG51bWJlci5cbldhcm5pbmc6IFVuc3VwcG9ydGVkIGNwdSByZXZpc2lvbiFcbiIpOworCQlwcmludGYoIlJldjogVW5rbm93biByZXZpc2lvbiBudW1iZXI6JTA4eFxuIgorCQkJIldhcm5pbmc6IFVuc3VwcG9ydGVkIGNwdSByZXZpc2lvbiFcbiIsc3ByaWRyKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMjksMTU0ICszMzEsMTY3IEBACiAvKgogICogIlNldHRlciIgZnVuY3Rpb25zIHVzZWQgdG8gYWRkL21vZGlmeSBGRFQgZW50cmllcy4KICAqLwotc3RhdGljIGludCBmZHRfc2V0X2V0aDAodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCitzdGF0aWMgaW50IGZkdF9zZXRfZXRoMCh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCiB7CiAJLyoKIAkgKiBGaXggaXQgdXAgaWYgaXQgZXhpc3RzLCBkb24ndCBjcmVhdGUgaXQgaWYgaXQgZG9lc24ndCBleGlzdC4KIAkgKi8KLQlpZiAoZmR0X2dldF9wcm9wZXJ0eShmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIDApKSB7Ci0JCXJldHVybiBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0YWRkciwgNik7CisJaWYgKGZkdF9nZXRfcHJvcGVydHkoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKKwkJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0YWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNpZmRlZiBDT05GSUdfSEFTX0VUSDEKIC8qIHNlY29uZCBvbmJvYXJkIGV0aGVybmV0IHBvcnQgKi8KLXN0YXRpYyBpbnQgZmR0X3NldF9ldGgxKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQorc3RhdGljIGludCBmZHRfc2V0X2V0aDEodm9pZCAqYmxvYiwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQogewogCS8qCiAJICogRml4IGl0IHVwIGlmIGl0IGV4aXN0cywgZG9uJ3QgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCiAJICovCi0JaWYgKGZkdF9nZXRfcHJvcGVydHkoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgewotCQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBiZC0+YmlfZW5ldDFhZGRyLCA2KTsKKwlpZiAoZmR0X2dldF9wcm9wZXJ0eShibG9iLCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgeworCQlyZXR1cm4gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQxYWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVNfRVRIMgogLyogdGhpcmQgb25ib2FyZCBldGhlcm5ldCBwb3J0ICovCi1zdGF0aWMgaW50IGZkdF9zZXRfZXRoMih2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKK3N0YXRpYyBpbnQgZmR0X3NldF9ldGgyKHZvaWQgKmJsb2IsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKIHsKIAkvKgogCSAqIEZpeCBpdCB1cCBpZiBpdCBleGlzdHMsIGRvbid0IGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LgogCSAqLwotCWlmIChmZHRfZ2V0X3Byb3BlcnR5KGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKLQkJcmV0dXJuIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQyYWRkciwgNik7CisJaWYgKGZkdF9nZXRfcHJvcGVydHkoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKKwkJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0MmFkZHIsIDYpOwogCX0KLQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFTX0VUSDMKIC8qIGZvdXJ0aCBvbmJvYXJkIGV0aGVybmV0IHBvcnQgKi8KLXN0YXRpYyBpbnQgZmR0X3NldF9ldGgzKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQorc3RhdGljIGludCBmZHRfc2V0X2V0aDModm9pZCAqYmxvYiwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQogewogCS8qCiAJICogRml4IGl0IHVwIGlmIGl0IGV4aXN0cywgZG9uJ3QgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCiAJICovCi0JaWYgKGZkdF9nZXRfcHJvcGVydHkoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgewotCQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBiZC0+YmlfZW5ldDNhZGRyLCA2KTsKKwlpZiAoZmR0X2dldF9wcm9wZXJ0eShibG9iLCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgeworCQlyZXR1cm4gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQzYWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGZkdF9zZXRfYnVzZnJlcSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKK3N0YXRpYyBpbnQgZmR0X3NldF9idXNmcmVxKHZvaWQgKmJsb2IsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKIHsKIAl1MzIgIHRtcDsKIAkvKgogCSAqIENyZWF0ZSBvciB1cGRhdGUgdGhlIHByb3BlcnR5LgogCSAqLwogCXRtcCA9IGNwdV90b19iZTMyKGJkLT5iaV9idXNmcmVxKTsKLQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsICZ0bXAsIHNpemVvZih0bXApKTsKIH0KIAorc3RhdGljIGludCBmZHRfc2V0X3RiZnJlcSh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCit7CisJdTMyICB0bXA7CisJLyoKKwkgKiBDcmVhdGUgb3IgdXBkYXRlIHRoZSBwcm9wZXJ0eS4KKwkgKi8KKwl0bXAgPSBjcHVfdG9fYmUzMihPRl9UQkNMSyk7CisJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsICZ0bXAsIHNpemVvZih0bXApKTsKK30KKworCiAvKgotICogRml4dXBzIHRvIHRoZSBmZHQuICBJZiAiY3JlYXRlIiBpcyBUUlVFLCB0aGUgbm9kZSBpcyBjcmVhdGVkCi0gKiB1bmNvbmRpdGlvbmFsbHkuICBJZiAiY3JlYXRlIiBpcyBGQUxTRSwgdGhlIG5vZGUgaXMgdXBkYXRlZAotICogb25seSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAqIEZpeHVwcyB0byB0aGUgZmR0LgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAljaGFyICpub2RlOwogCWNoYXIgKnByb3A7Ci0JaW50ICgqc2V0X2ZuKSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCk7CisJaW50ICgqc2V0X2ZuKSh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpOwogfSBmaXh1cF9wcm9wc1tdID0gewogCXsJIi9jcHVzLyIgT0ZfQ1BVLAotCQkgImJ1cy1mcmVxdWVuY3kiLAotCQlmZHRfc2V0X2J1c2ZyZXEKKwkJInRpbWViYXNlLWZyZXF1ZW5jeSIsCisJCWZkdF9zZXRfdGJmcmVxCiAJfSwKLQl7CSIvY3B1cy8iIE9GX1NPQywKKwl7CSIvY3B1cy8iIE9GX0NQVSwKIAkJImJ1cy1mcmVxdWVuY3kiLAogCQlmZHRfc2V0X2J1c2ZyZXEKIAl9LAotCXsJIi8iIE9GX1NPQyAiL3NlcmlhbEA0NTAwLyIsCisJewkiL2NwdXMvIiBPRl9DUFUsCiAJCSJjbG9jay1mcmVxdWVuY3kiLAogCQlmZHRfc2V0X2J1c2ZyZXEKIAl9LAotCXsJIi8iIE9GX1NPQyAiL3NlcmlhbEA0NjAwLyIsCisJewkiLyIgT0ZfU09DICIvc2VyaWFsQDQ1MDAiLAorCQkiY2xvY2stZnJlcXVlbmN5IiwKKwkJZmR0X3NldF9idXNmcmVxCisJfSwKKwl7CSIvIiBPRl9TT0MgIi9zZXJpYWxANDYwMCIsCiAJCSJjbG9jay1mcmVxdWVuY3kiLAogCQlmZHRfc2V0X2J1c2ZyZXEKIAl9LAogI2lmZGVmIENPTkZJR19UU0VDMQotCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI0MDAwLAorCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI0MDAwIiwKIAkJIm1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgwCiAJfSwKLQl7CSIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNDAwMCwKKwl7CSIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNDAwMCIsCiAJCSJsb2NhbC1tYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMAogCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVFNFQzIKLQl7CSIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNTAwMCwKKwl7CSIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNTAwMCIsCiAJCSJtYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMQogCX0sCi0JewkiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjUwMDAsCisJewkiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjUwMDAiLAogCQkibG9jYWwtbWFjLWFkZHJlc3MiLAogCQlmZHRfc2V0X2V0aDEKIAl9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1VFQ19FVEgxCiAjaWYgQ0ZHX1VFQzFfVUNDX05VTSA9PSAwICAvKiBVQ0MxICovCi0JewkiLyIgT0ZfUUUgIi91Y2NAMjAwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMjAwMCIsCiAJCSJtYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMAogCX0sCi0JewkiLyIgT0ZfUUUgIi91Y2NAMjAwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMjAwMCIsCiAJCSJsb2NhbC1tYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMAogCX0sCiAjZWxpZiBDRkdfVUVDMV9VQ0NfTlVNID09IDIgIC8qIFVDQzMgKi8KLQl7CSIvIiBPRl9RRSAiL3VjY0AyMjAwL21hYy1hZGRyZXNzIiwKKwl7CSIvIiBPRl9RRSAiL3VjY0AyMjAwIiwKIAkJIm1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgwCiAJfSwKLQl7CSIvIiBPRl9RRSAiL3VjY0AyMjAwL21hYy1hZGRyZXNzIiwKKwl7CSIvIiBPRl9RRSAiL3VjY0AyMjAwIiwKIAkJImxvY2FsLW1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgwCiAJfSwKICNlbmRpZgotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1VFQ19FVEgxICovCiAjaWZkZWYgQ09ORklHX1VFQ19FVEgyCiAjaWYgQ0ZHX1VFQzJfVUNDX05VTSA9PSAxICAvKiBVQ0MyICovCi0JewkiLyIgT0ZfUUUgIi91Y2NAMzAwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMzAwMCIsCiAJCSJtYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMQogCX0sCi0JewkiLyIgT0ZfUUUgIi91Y2NAMzAwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMzAwMCIsCiAJCSJsb2NhbC1tYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMQogCX0sCiAjZWxpZiBDRkdfVUVDMV9VQ0NfTlVNID09IDMgIC8qIFVDQzQgKi8KLQl7CSIvIiBPRl9RRSAiL3VjY0AzMjAwL21hYy1hZGRyZXNzIiwKKwl7CSIvIiBPRl9RRSAiL3VjY0AzMjAwIiwKIAkJIm1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgxCiAJfSwKLQl7CSIvIiBPRl9RRSAiL3VjY0AzMjAwL21hYy1hZGRyZXNzIiwKKwl7CSIvIiBPRl9RRSAiL3VjY0AzMjAwIiwKIAkJImxvY2FsLW1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgxCiAJfSwKICNlbmRpZgotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1VFQ19FVEgyICovCiB9OwogCiB2b2lkCkBAIC00ODcsMjAgKzUwMiwyMyBAQAogCWludCAgajsKIAogCWZvciAoaiA9IDA7IGogPCAoc2l6ZW9mKGZpeHVwX3Byb3BzKSAvIHNpemVvZihmaXh1cF9wcm9wc1swXSkpOyBqKyspIHsKLQkJbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldChmZHQsIGZpeHVwX3Byb3BzW2pdLm5vZGUpOworCQlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKGJsb2IsIGZpeHVwX3Byb3BzW2pdLm5vZGUpOwogCQlpZiAobm9kZW9mZnNldCA+PSAwKSB7Ci0JCQllcnIgPSAoKmZpeHVwX3Byb3BzW2pdLnNldF9mbikoYmxvYiwgbm9kZW9mZnNldCwgZml4dXBfcHJvcHNbal0ucHJvcCwgYmQpOworCQkJZXJyID0gZml4dXBfcHJvcHNbal0uc2V0X2ZuKGJsb2IsIG5vZGVvZmZzZXQsCisJCQkJCQkgICAgZml4dXBfcHJvcHNbal0ucHJvcCwgYmQpOwogCQkJaWYgKGVyciA8IDApCi0JCQkJcHJpbnRmKCJzZXRfZm4vbGliZmR0OiAlcyAlcyByZXR1cm5lZCAlc1xuIiwKKwkJCQlkZWJ1ZygiUHJvYmxlbSBzZXR0aW5nICVzID0gJXM6ICVzXG4iLAogCQkJCQlmaXh1cF9wcm9wc1tqXS5ub2RlLAogCQkJCQlmaXh1cF9wcm9wc1tqXS5wcm9wLAogCQkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CisJCX0gZWxzZSB7CisJCQlkZWJ1ZygiQ291bGRuJ3QgZmluZCAlczogJXNcbiIsCisJCQkJZml4dXBfcHJvcHNbal0ubm9kZSwKKwkJCQlmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOwogCQl9CiAJfQogfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCisjZWxpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCiB2b2lkCiBmdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCiB7CmRpZmYgLS1naXQgYS9jcHUvbXBjODN4eC9jcHVfaW5pdC5jIGIvY3B1L21wYzgzeHgvY3B1X2luaXQuYwppbmRleCAzYWM5MTYxLi43MjI0OTc5IDEwMDY0NAotLS0gYS9jcHUvbXBjODN4eC9jcHVfaW5pdC5jCisrKyBiL2NwdS9tcGM4M3h4L2NwdV9pbml0LmMKQEAgLTgzLDIwICs4MywzMCBAQAogCWltLT5zeXNjb25mLnNwY3IgPSAoaW0tPnN5c2NvbmYuc3BjciAmIH5TUENSX1RTRUMyRVApIHwgKENGR19TUENSX1RTRUMyRVAgPDwgU1BDUl9UU0VDMkVQX1NISUZUKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01QQzgzNFgKICNpZmRlZiBDRkdfU0NDUl9UU0VDMUNNCiAJLyogVFNFQzEgY2xvY2sgbW9kZSAqLwogCWltLT5jbGsuc2NjciA9IChpbS0+Y2xrLnNjY3IgJiB+U0NDUl9UU0VDMUNNKSB8IChDRkdfU0NDUl9UU0VDMUNNIDw8IFNDQ1JfVFNFQzFDTV9TSElGVCk7CiAjZW5kaWYKKwogI2lmZGVmIENGR19TQ0NSX1RTRUMyQ00KIAkvKiBUU0VDMiAmIEkyQzEgY2xvY2sgbW9kZSAqLwogCWltLT5jbGsuc2NjciA9IChpbS0+Y2xrLnNjY3IgJiB+U0NDUl9UU0VDMkNNKSB8IChDRkdfU0NDUl9UU0VDMkNNIDw8IFNDQ1JfVFNFQzJDTV9TSElGVCk7CiAjZW5kaWYKKworI2lmZGVmIENGR19TQ0NSX1RTRUMxT04KKwkvKiBUU0VDMSBjbG9jayBzd2l0Y2ggKi8KKwlpbS0+Y2xrLnNjY3IgPSAoaW0tPmNsay5zY2NyICYgflNDQ1JfVFNFQzFPTikgfCAoQ0ZHX1NDQ1JfVFNFQzFPTiA8PCBTQ0NSX1RTRUMxT05fU0hJRlQpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfU0NDUl9UU0VDMk9OCisJLyogVFNFQzIgY2xvY2sgc3dpdGNoICovCisJaW0tPmNsay5zY2NyID0gKGltLT5jbGsuc2NjciAmIH5TQ0NSX1RTRUMyT04pIHwgKENGR19TQ0NSX1RTRUMyT04gPDwgU0NDUl9UU0VDMk9OX1NISUZUKTsKKyNlbmRpZgorCiAjaWZkZWYgQ0ZHX1NDQ1JfVVNCTVBIQ00KIAkvKiBVU0IgTVBIIGNsb2NrIG1vZGUgKi8KIAlpbS0+Y2xrLnNjY3IgPSAoaW0tPmNsay5zY2NyICYgflNDQ1JfVVNCTVBIQ00pIHwgKENGR19TQ0NSX1VTQk1QSENNIDw8IFNDQ1JfVVNCTVBIQ01fU0hJRlQpOwogI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX01QQzgzNFggKi8KIAogI2lmZGVmIENGR19TQ0NSX1BDSUNNCiAJLyogUENJICYgRE1BIGNsb2NrIG1vZGUgKi8KQEAgLTI0NywzICsyNTcsMzkgQEAKICNlbmRpZgogCXJldHVybiAwOwogfQorCisvKgorICogRmlndXJlIG91dCB0aGUgY2F1c2Ugb2YgdGhlIHJlc2V0CisgKi8KK2ludCBwcnRfODN4eF9yc3Iodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJdWxvbmcgbWFzazsKKwkJY2hhciAqZGVzYzsKKwl9IGJpdHNbXSA9IHsKKwkJeworCQlSU1JfU1dTUiwgIlNvZnR3YXJlIFNvZnQifSwgeworCQlSU1JfU1dIUiwgIlNvZnR3YXJlIEhhcmQifSwgeworCQlSU1JfSlNSUywgIkpUQUcgU29mdCJ9LCB7CisJCVJTUl9DU0hSLCAiQ2hlY2sgU3RvcCJ9LCB7CisJCVJTUl9TV1JTLCAiU29mdHdhcmUgV2F0Y2hkb2cifSwgeworCQlSU1JfQk1SUywgIkJ1cyBNb25pdG9yIn0sIHsKKwkJUlNSX1NSUywgICJFeHRlcm5hbC9JbnRlcm5hbCBTb2Z0In0sIHsKKwkJUlNSX0hSUywgICJFeHRlcm5hbC9JbnRlcm5hbCBIYXJkIn0KKwl9OworCXN0YXRpYyBpbnQgbiA9IHNpemVvZiBiaXRzIC8gc2l6ZW9mIGJpdHNbMF07CisJdWxvbmcgcnNyID0gZ2QtPnJlc2V0X3N0YXR1czsKKwlpbnQgaTsKKwljaGFyICpzZXA7CisKKwlwdXRzKCJSZXNldCBTdGF0dXM6Iik7CisKKwlzZXAgPSAiICI7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJaWYgKHJzciAmIGJpdHNbaV0ubWFzaykgeworCQkJcHJpbnRmKCIlcyVzIiwgc2VwLCBiaXRzW2ldLmRlc2MpOworCQkJc2VwID0gIiwgIjsKKwkJfQorCXB1dHMoIlxuXG4iKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L2VjYy5jIGIvY3B1L21wYzgzeHgvZWNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxMzA5NAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4M3h4L2VjYy5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAqIGJhc2VkIG9uIHRoZSBjb250cmlidXRpb24gb2YgTWFyaWFuIEJhbGFrb3dpY3ogPG04QHNlbWloYWxmLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4M3h4Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19DTUQpCit2b2lkIGVjY19wcmludF9zdGF0dXModm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIGRkcjgzeHhfdCAqZGRyID0gJmltbWFwLT5kZHI7CisKKwlwcmludGYoIlxuRUNDIG1vZGU6ICVzXG5cbiIsCisJICAgICAgIChkZHItPnNkcmFtX2NmZyAmIFNEUkFNX0NGR19FQ0NfRU4pID8gIk9OIiA6ICJPRkYiKTsKKworCS8qIEludGVycnVwdHMgKi8KKwlwcmludGYoIk1lbW9yeSBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOlxuIik7CisJcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX01CRUUpID8gMSA6IDApOworCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fU0JFRSkgPyAxIDogMCk7CisJcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcblxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX01TRUUpID8gMSA6IDApOworCisJLyogRXJyb3IgZGlzYWJsZSAqLworCXByaW50ZigiTWVtb3J5IEVycm9yIERpc2FibGU6XG4iKTsKKwlwcmludGYoIiAgTXVsdGlwbGUtQml0IEVycm9yIERpc2FibGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX01CRUQpID8gMSA6IDApOworCXByaW50ZigiICBTaW5sZS1CaXQgRXJyb3IgRGlzYWJsZTogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCkgPyAxIDogMCk7CisJcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3IgRGlzYWJsZTogJWRcblxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2Rpc2FibGUgJiBFQ0NfRVJST1JfRElTQUJMRV9NU0VEKSA/IDEgOiAwKTsKKworCS8qIEVycm9yIGluamVjdGlvbiAqLworCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoL0xvdzogJTA4bHggJTA4bHhcbiIsCisJICAgICAgIGRkci0+ZGF0YV9lcnJfaW5qZWN0X2hpLCBkZHItPmRhdGFfZXJyX2luamVjdF9sbyk7CisKKwlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgRUNDOlxuIik7CisJcHJpbnRmKCIgIEVDQyBNaXJyb3IgQnl0ZTogJWRcbiIsCisJICAgICAgIChkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRU1CKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgRUNDIEluamVjdGlvbiBFbmFibGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VJRU4pID8gMSA6IDApOworCXByaW50ZigiICBFQ0MgRXJyb3IgSW5qZWN0aW9uIE1hc2s6IDB4JTAyeFxuXG4iLAorCSAgICAgICBkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRUVJTSk7CisKKwkvKiBTQkUgY291bnRlci90aHJlc2hvbGQgKi8KKwlwcmludGYoIk1lbW9yeSBTaW5nbGUtQml0IEVycm9yIE1hbmFnZW1lbnQgKDAuLjI1NSk6XG4iKTsKKwlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQ6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVUKSA+PiBFQ0NfRVJST1JfTUFOX1NCRVRfU0hJRlQpOworCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIENvdW50ZXI6ICVkXG5cbiIsCisJICAgICAgIChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRUMpID4+IEVDQ19FUlJPUl9NQU5fU0JFQ19TSElGVCk7CisKKwkvKiBFcnJvciBkZXRlY3QgKi8KKwlwcmludGYoIk1lbW9yeSBFcnJvciBEZXRlY3Q6XG4iKTsKKwlwcmludGYoIiAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01NRSkgPyAxIDogMCk7CisJcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvcjogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01CRSkgPyAxIDogMCk7CisJcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3I6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9TQkUpID8gMSA6IDApOworCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yOiAlZFxuXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NU0UpID8gMSA6IDApOworCisJLyogQ2FwdHVyZSBkYXRhICovCisJcHJpbnRmKCJNZW1vcnkgRXJyb3IgQWRkcmVzcyBDYXB0dXJlOiAweCUwOGx4XG4iLCBkZHItPmNhcHR1cmVfYWRkcmVzcyk7CisJcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIFJlYWQgQ2FwdHVyZSBIaWdoL0xvdzogJTA4bHggJTA4bHhcbiIsCisJICAgICAgIGRkci0+Y2FwdHVyZV9kYXRhX2hpLCBkZHItPmNhcHR1cmVfZGF0YV9sbyk7CisJcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIFJlYWQgQ2FwdHVyZSBFQ0M6IDB4JTAyeFxuXG4iLAorCSAgICAgICBkZHItPmNhcHR1cmVfZWNjICYgQ0FQVFVSRV9FQ0NfRUNFKTsKKworCXByaW50ZigiTWVtb3J5IEVycm9yIEF0dHJpYnV0ZXMgQ2FwdHVyZTpcbiIpOworCXByaW50ZigiIERhdGEgQmVhdCBOdW1iZXI6ICVkXG4iLAorCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX0JOVU0pID4+CisJICAgICAgIEVDQ19DQVBUX0FUVFJfQk5VTV9TSElGVCk7CisJcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFNpemU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTSVopID4+CisJICAgICAgIEVDQ19DQVBUX0FUVFJfVFNJWl9TSElGVCk7CisJcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFNvdXJjZTogJWRcbiIsCisJICAgICAgIChkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVFNSQykgPj4KKwkgICAgICAgRUNDX0NBUFRfQVRUUl9UU1JDX1NISUZUKTsKKwlwcmludGYoIiAgVHJhbnNhY3Rpb24gVHlwZTogJWRcbiIsCisJICAgICAgIChkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVFRZUCkgPj4KKwkgICAgICAgRUNDX0NBUFRfQVRUUl9UVFlQX1NISUZUKTsKKwlwcmludGYoIiAgRXJyb3IgSW5mb3JtYXRpb24gVmFsaWQ6ICVkXG5cbiIsCisJICAgICAgIGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9WTEQpOworfQorCitpbnQgZG9fZWNjKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIGRkcjgzeHhfdCAqZGRyID0gJmltbWFwLT5kZHI7CisJdm9sYXRpbGUgdTMyIHZhbDsKKwl1NjQgKmFkZHI7CisJdTMyIGNvdW50OworCXJlZ2lzdGVyIHU2NCAqaTsKKwl1MzIgcmV0WzJdOworCXUzMiBwYXR0ZXJuWzJdOworCXUzMiB3cml0ZWJhY2tbMl07CisKKwkvKiBUaGUgcGF0dGVybiBpcyB3cml0dGVuIGludG8gbWVtb3J5IHRvIGdlbmVyYXRlIGVycm9yICovCisJcGF0dGVyblswXSA9IDB4ZmVkY2JhOThVTDsKKwlwYXR0ZXJuWzFdID0gMHg3NjU0MzIxMFVMOworCisJLyogQWZ0ZXIgaW5qZWN0aW5nIGVycm9yLCByZS1pbml0aWFsaXplIHRoZSBtZW1vcnkgd2l0aCB0aGUgdmFsdWUgKi8KKwl3cml0ZWJhY2tbMF0gPSAweDAxMjM0NTY3VUw7CisJd3JpdGViYWNrWzFdID0gMHg4OWFiY2RlZlVMOworCisJaWYgKGFyZ2MgPiA0KSB7CisJCXByaW50ZigiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJzdGF0dXMiKSA9PSAwKSB7CisJCQllY2NfcHJpbnRfc3RhdHVzKCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImNhcHR1cmVjbGVhciIpID09IDApIHsKKwkJCWRkci0+Y2FwdHVyZV9hZGRyZXNzID0gMDsKKwkJCWRkci0+Y2FwdHVyZV9kYXRhX2hpID0gMDsKKwkJCWRkci0+Y2FwdHVyZV9kYXRhX2xvID0gMDsKKwkJCWRkci0+Y2FwdHVyZV9lY2MgPSAwOworCQkJZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKGFyZ2MgPT0gMykgeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJzYmVjbnQiKSA9PSAwKSB7CisJCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCk7CisJCQlpZiAodmFsID4gMjU1KSB7CisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgQ291bnRlciB2YWx1ZSwgIgorCQkJCSAgICAgICAic2hvdWxkIGJlIDAuLjI1NVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCXZhbCA9ICh2YWwgPDwgRUNDX0VSUk9SX01BTl9TQkVDX1NISUZUKTsKKwkJCXZhbCB8PSAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVUKTsKKworCQkJZGRyLT5lcnJfc2JlID0gdmFsOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJzYmV0aHIiKSA9PSAwKSB7CisJCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCk7CisJCQlpZiAodmFsID4gMjU1KSB7CisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgQ291bnRlciB2YWx1ZSwgIgorCQkJCSAgICAgICAic2hvdWxkIGJlIDAuLjI1NVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCXZhbCA9ICh2YWwgPDwgRUNDX0VSUk9SX01BTl9TQkVUX1NISUZUKTsKKwkJCXZhbCB8PSAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVDKTsKKworCQkJZGRyLT5lcnJfc2JlID0gdmFsOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJlcnJkaXNhYmxlIikgPT0gMCkgeworCQkJdmFsID0gZGRyLT5lcnJfZGlzYWJsZTsKKworCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAiK3NiZSIpID09IDApIHsKKwkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfU0JFRDsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrbWJlIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9NQkVEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIittc2UiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX01TRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK2FsbCIpID09IDApIHsKKwkJCQl2YWwgfD0gKEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQgfAorCQkJCQlFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKKwkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCk7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLXNiZSIpID09IDApIHsKKwkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX1NCRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLW1iZSIpID09IDApIHsKKwkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX01CRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLW1zZSIpID09IDApIHsKKwkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX01TRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLWFsbCIpID09IDApIHsKKwkJCQl2YWwgJj0gfihFQ0NfRVJST1JfRElTQUJMRV9TQkVEIHwKKwkJCQkJIEVDQ19FUlJPUl9ESVNBQkxFX01CRUQgfAorCQkJCQkgRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiSW5jb3JyZWN0IGVycl9kaXNhYmxlIGZpZWxkXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJZGRyLT5lcnJfZGlzYWJsZSA9IHZhbDsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZXJyZGV0ZWN0Y2xyIikgPT0gMCkgeworCQkJdmFsID0gZGRyLT5lcnJfZGV0ZWN0OworCisJCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJtbWUiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTU1FOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgInNiZSIpID09IDApIHsKKwkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9TQkU7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAibWJlIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01CRTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJtc2UiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTVNFOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgImFsbCIpID09IDApIHsKKwkJCQl2YWwgfD0gKEVDQ19FUlJPUl9ERVRFQ1RfTU1FIHwKKwkJCQkJRUNDX0VSUk9SX0RFVEVDVF9NQkUgfAorCQkJCQlFQ0NfRVJST1JfREVURUNUX1NCRSB8CisJCQkJCUVDQ19FUlJPUl9ERVRFQ1RfTVNFKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgZXJyX2RldGVjdCBmaWVsZFxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWRkci0+ZXJyX2RldGVjdCA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZGF0YWhpIikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCisJCQlkZHItPmRhdGFfZXJyX2luamVjdF9oaSA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZGF0YWxvIikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCisJCQlkZHItPmRhdGFfZXJyX2luamVjdF9sbyA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZWNjIikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCQkJaWYgKHZhbCA+IDB4ZmYpIHsKKwkJCQlwcmludGYoIkluY29ycmVjdCBFQ0MgaW5qZWN0IG1hc2ssICIKKwkJCQkgICAgICAgInNob3VsZCBiZSAweDAwLi4weGZmXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXZhbCB8PSAoZGRyLT5lY2NfZXJyX2luamVjdCAmIH5FQ0NfRVJSX0lOSkVDVF9FRUlNKTsKKworCQkJZGRyLT5lY2NfZXJyX2luamVjdCA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0IikgPT0gMCkgeworCQkJdmFsID0gZGRyLT5lY2NfZXJyX2luamVjdDsKKworCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAiZW4iKSA9PSAwKQorCQkJCXZhbCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOworCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQorCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCWVsc2UKKwkJCQlwcmludGYoIkluY29ycmVjdCBjb21tYW5kXG4iKTsKKworCQkJZGRyLT5lY2NfZXJyX2luamVjdCA9IHZhbDsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAibWlycm9yIikgPT0gMCkgeworCQkJdmFsID0gZGRyLT5lY2NfZXJyX2luamVjdDsKKworCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAiZW4iKSA9PSAwKQorCQkJCXZhbCB8PSBFQ0NfRVJSX0lOSkVDVF9FTUI7CisJCQllbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgImRpcyIpID09IDApCisJCQkJdmFsICY9IH5FQ0NfRVJSX0lOSkVDVF9FTUI7CisJCQllbHNlCisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgY29tbWFuZFxuIik7CisKKwkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoYXJnYyA9PSA0KSB7CisJCWlmIChzdHJjbXAoYXJndlsxXSwgInRlc3RkdyIpID09IDApIHsKKwkJCWFkZHIgPSAodTY0ICopIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCisJCQlpZiAoKHUzMikgYWRkciAlIDgpIHsKKwkJCQlwcmludGYoIkFkZHJlc3Mgbm90IGFsbGlnbmVkIG9uICIKKwkJCQkgICAgICAgImRvdWJsZSB3b3JkIGJvdW5kYXJ5XG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWRpc2FibGVfaW50ZXJydXB0cygpOworCisJCQlmb3IgKGkgPSBhZGRyOyBpIDwgYWRkciArIGNvdW50OyBpKyspIHsKKworCQkJCS8qIGVuYWJsZSBpbmplY3RzICovCisJCQkJZGRyLT5lY2NfZXJyX2luamVjdCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7CisKKwkJCQkvKiB3cml0ZSBtZW1vcnkgbG9jYXRpb24gaW5qZWN0aW5nIGVycm9ycyAqLworCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCBwYXR0ZXJuKTsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCisJCQkJLyogZGlzYWJsZSBpbmplY3RzICovCisJCQkJZGRyLT5lY2NfZXJyX2luamVjdCAmPSB+RUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOworCisJCQkJLyogcmVhZCBkYXRhLCB0aGlzIGdlbmVyYXRlcyBFQ0MgZXJyb3IgKi8KKwkJCQlwcGNEV2xvYWQoKHUzMiAqKSBpLCByZXQpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisKKwkJCQkvKiByZS1pbml0aWFsaXplIG1lbW9yeSwgZG91YmxlIHdvcmQgd3JpdGUgdGhlIGxvY2F0aW9uIGFnYWluLAorCQkJCSAqIGdlbmVyYXRlcyBuZXcgRUNDIGNvZGUgdGhpcyB0aW1lICovCisJCQkJcHBjRFdzdG9yZSgodTMyICopIGksIHdyaXRlYmFjayk7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKwkJCX0KKwkJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJ0ZXN0d29yZCIpID09IDApIHsKKwkJCWFkZHIgPSAodTY0ICopIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCisJCQlpZiAoKHUzMikgYWRkciAlIDgpIHsKKwkJCQlwcmludGYoIkFkZHJlc3Mgbm90IGFsbGlnbmVkIG9uICIKKwkJCQkgICAgICAgImRvdWJsZSB3b3JkIGJvdW5kYXJ5XG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWRpc2FibGVfaW50ZXJydXB0cygpOworCisJCQlmb3IgKGkgPSBhZGRyOyBpIDwgYWRkciArIGNvdW50OyBpKyspIHsKKworCQkJCS8qIGVuYWJsZSBpbmplY3RzICovCisJCQkJZGRyLT5lY2NfZXJyX2luamVjdCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7CisKKwkJCQkvKiB3cml0ZSBtZW1vcnkgbG9jYXRpb24gaW5qZWN0aW5nIGVycm9ycyAqLworCQkJCSoodTMyICopIGkgPSAweGZlZGNiYTk4VUw7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKworCQkJCS8qIHN1YiBkb3VibGUgd29yZCB3cml0ZSwKKwkJCQkgKiBidXMgd2lsbCByZWFkLW1vZGlmeS13cml0ZSwKKwkJCQkgKiBnZW5lcmF0ZXMgRUNDIGVycm9yICovCisJCQkJKigodTMyICopIGkgKyAxKSA9IDB4NzY1NDMyMTBVTDsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCisJCQkJLyogZGlzYWJsZSBpbmplY3RzICovCisJCQkJZGRyLT5lY2NfZXJyX2luamVjdCAmPSB+RUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOworCisJCQkJLyogcmUtaW5pdGlhbGl6ZSBtZW1vcnksCisJCQkJICogZG91YmxlIHdvcmQgd3JpdGUgdGhlIGxvY2F0aW9uIGFnYWluLAorCQkJCSAqIGdlbmVyYXRlcyBuZXcgRUNDIGNvZGUgdGhpcyB0aW1lICovCisJCQkJcHBjRFdzdG9yZSgodTMyICopIGksIHdyaXRlYmFjayk7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKwkJCX0KKwkJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJcmV0dXJuIDE7Cit9CisKK1VfQk9PVF9DTUQoZWNjLCA0LCAwLCBkb19lY2MsCisJICAgImVjYyAgICAgLSBzdXBwb3J0IGZvciBERFIgRUNDIGZlYXR1cmVzXG4iLAorCSAgICJzdGF0dXMgICAgICAgICAgICAgIC0gcHJpbnQgb3V0IHN0YXR1cyBpbmZvXG4iCisJICAgImVjYyBjYXB0dXJlY2xlYXIgICAgICAgIC0gY2xlYXIgY2FwdHVyZSByZWdzIGRhdGFcbiIKKwkgICAiZWNjIHNiZWNudCA8dmFsPiAgICAgICAgLSBzZXQgU2luZ2xlLUJpdCBFcnJvciBjb3VudGVyXG4iCisJICAgImVjYyBzYmV0aHIgPHZhbD4gICAgICAgIC0gc2V0IFNpbmdsZS1CaXQgVGhyZXNob2xkXG4iCisJICAgImVjYyBlcnJkaXNhYmxlIDxmbGFnPiAgIC0gY2xlYXIvc2V0IGRpc2FibGUgTWVtb3J5IEVycm9yIERpc2FibGUsIGZsYWc6XG4iCisJICAgIiAgWy18K11zYmUgLSBTaW5nbGUtQml0IEVycm9yXG4iCisJICAgIiAgWy18K11tYmUgLSBNdWx0aXBsZS1CaXQgRXJyb3JcbiIKKwkgICAiICBbLXwrXW1zZSAtIE1lbW9yeSBTZWxlY3QgRXJyb3JcbiIKKwkgICAiICBbLXwrXWFsbCAtIGFsbCBlcnJvcnNcbiIKKwkgICAiZWNjIGVycmRldGVjdGNsciA8ZmxhZz4gLSBjbGVhciBNZW1vcnkgRXJyb3IgRGV0ZWN0LCBmbGFnOlxuIgorCSAgICIgIG1tZSAtIE11bHRpcGxlIE1lbW9yeSBFcnJvcnNcbiIKKwkgICAiICBzYmUgLSBTaW5nbGUtQml0IEVycm9yXG4iCisJICAgIiAgbWJlIC0gTXVsdGlwbGUtQml0IEVycm9yXG4iCisJICAgIiAgbXNlIC0gTWVtb3J5IFNlbGVjdCBFcnJvclxuIgorCSAgICIgIGFsbCAtIGFsbCBlcnJvcnNcbiIKKwkgICAiZWNjIGluamVjdGRhdGFoaSA8aGk+ICAtIHNldCBNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2hcbiIKKwkgICAiZWNjIGluamVjdGRhdGFsbyA8bG8+ICAtIHNldCBNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIExvd1xuIgorCSAgICJlY2MgaW5qZWN0ZWNjIDxlY2M+ICAgIC0gc2V0IEVDQyBFcnJvciBJbmplY3Rpb24gTWFza1xuIgorCSAgICJlY2MgaW5qZWN0IDxlbnxkaXM+ICAgIC0gZW5hYmxlL2Rpc2FibGUgZXJyb3IgaW5qZWN0aW9uXG4iCisJICAgImVjYyBtaXJyb3IgPGVufGRpcz4gICAgLSBlbmFibGUvZGlzYWJsZSBtaXJyb3IgYnl0ZVxuIgorCSAgICJlY2MgdGVzdGR3IDxhZGRyPiA8Y250PiAgLSB0ZXN0IG1lbSByZWdpb24gd2l0aCBkb3VibGUgd29yZCBhY2Nlc3M6XG4iCisJICAgIiAgLSBlbmFibGVzIGluamVjdHNcbiIKKwkgICAiICAtIHdyaXRlcyBwYXR0ZXJuIGluamVjdGluZyBlcnJvcnMgd2l0aCBkb3VibGUgd29yZCBhY2Nlc3NcbiIKKwkgICAiICAtIGRpc2FibGVzIGluamVjdHNcbiIKKwkgICAiICAtIHJlYWRzIHBhdHRlcm4gYmFjayB3aXRoIGRvdWJsZSB3b3JkIGFjY2VzcywgZ2VuZXJhdGVzIGVycm9yXG4iCisJICAgIiAgLSByZS1pbml0cyBtZW1vcnlcbiIKKwkgICAiZWNjIHRlc3R3b3JkIDxhZGRyPiA8Y250PiAgLSB0ZXN0IG1lbSByZWdpb24gd2l0aCB3b3JkIGFjY2VzczpcbiIKKwkgICAiICAtIGVuYWJsZXMgaW5qZWN0c1xuIgorCSAgICIgIC0gd3JpdGVzIHBhdHRlcm4gaW5qZWN0aW5nIGVycm9ycyB3aXRoIHdvcmQgYWNjZXNzXG4iCisJICAgIiAgLSB3cml0ZXMgcGF0dGVybiB3aXRoIHdvcmQgYWNjZXNzLCBnZW5lcmF0ZXMgZXJyb3JcbiIKKwkgICAiICAtIGRpc2FibGVzIGluamVjdHNcbiIgIiAgLSByZS1pbml0cyBtZW1vcnkiKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgzeHgvaW50ZXJydXB0cy5jIGIvY3B1L21wYzgzeHgvaW50ZXJydXB0cy5jCmluZGV4IGJiMWZlMWEuLjk4ZWQyMWMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L2ludGVycnVwdHMuYworKysgYi9jcHUvbXBjODN4eC9pbnRlcnJ1cHRzLmMKQEAgLTgxLDcgKzgxLDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiAKIC8qIHJpcHBlZCB0aGlzIG91dCBvZiBwcGM0eHgvaW50ZXJydXB0cy5jICovCiAKQEAgLTk0LDQgKzk0LDQgQEAKIHsKIH0KIAotI2VuZGlmCQkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjODN4eC9wY2kuYyBiL2NwdS9tcGM4M3h4L3BjaS5jCmluZGV4IDc4NWQ2MTIuLjIyOTgyMTggMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L3BjaS5jCisrKyBiL2NwdS9tcGM4M3h4L3BjaS5jCkBAIC0yNSw3ICsyNSwxNCBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8cGNpLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogI2luY2x1ZGUgPGZ0X2J1aWxkLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPGFzbS9tcGM4MzQ5X3BjaS5oPgogCiAjaWZkZWYgQ09ORklHXzgzWFhfR0VORVJJQ19QQ0kKQEAgLTE2Myw3ICsxNzAsMzQgQEAKIAkJcGNpX2luaXRfYnVzKGksIHJlZ1tpXSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfT0ZfRkxBVF9UUkVFCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQordm9pZCBmdF9wY2lfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJaW50IG5vZGVvZmZzZXQ7CisJaW50IGVycjsKKwlpbnQgdG1wWzJdOworCisJaWYgKHBjaV9udW1fYnVzZXMgPCAxKQorCQlyZXR1cm47CisKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAODUwMCIpOworCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKKwkJdG1wWzBdID0gY3B1X3RvX2JlMzIocGNpX2hvc2VbMF0uZmlyc3RfYnVzbm8pOworCQl0bXBbMV0gPSBjcHVfdG9fYmUzMihwY2lfaG9zZVswXS5sYXN0X2J1c25vKTsKKwkJZXJyID0gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgImJ1cy1yYW5nZSIsIHRtcCwgc2l6ZW9mKHRtcCkpOworCX0KKworCWlmIChwY2lfbnVtX2J1c2VzIDwgMikKKwkJcmV0dXJuOworCisJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aChibG9iLCAiLyIgT0ZfU09DICIvcGNpQDg2MDAiKTsKKwlpZiAobm9kZW9mZnNldCA+PSAwKSB7CisJCXRtcFswXSA9IGNwdV90b19iZTMyKHBjaV9ob3NlWzBdLmZpcnN0X2J1c25vKTsKKwkJdG1wWzFdID0gY3B1X3RvX2JlMzIocGNpX2hvc2VbMF0ubGFzdF9idXNubyk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJidXMtcmFuZ2UiLCB0bXAsIHNpemVvZih0bXApKTsKKwl9Cit9CisjZWxpZiBDT05GSUdfT0ZfRkxBVF9UUkVFCiB2b2lkIGZ0X3BjaV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKIHsKIAl1MzIgKnA7CmRpZmYgLS1naXQgYS9jcHUvbXBjODN4eC9zcGRfc2RyYW0uYyBiL2NwdS9tcGM4M3h4L3NwZF9zZHJhbS5jCmluZGV4IDY0NzgxM2YuLjU0ZjBjODMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L3NwZF9zZHJhbS5jCisrKyBiL2NwdS9tcGM4M3h4L3NwZF9zZHJhbS5jCkBAIC01NzQsNyArNTc0LDEwIEBACiAKIAkvKiBDaGVjayBESU1NIGRhdGEgYnVzIHdpZHRoICovCiAJaWYgKHNwZC5kYXRhd19sc2IgPT0gMHgyMCkgewotCQlidXJzdGxlbiA9IDB4MDM7IC8qIDMyIGJpdCBkYXRhIGJ1cywgYnVyc3QgbGVuIGlzIDggKi8KKwkJaWYgKHNwZC5tZW1fdHlwZSA9PSBTUERfTUVNVFlQRV9ERFIpCisJCQlidXJzdGxlbiA9IDB4MDM7IC8qIDMyIGJpdCBkYXRhIGJ1cywgYnVyc3QgbGVuIGlzIDggKi8KKwkJZWxzZQorCQkJYnVyc3RsZW4gPSAweDAyOyAvKiAzMiBiaXQgZGF0YSBidXMsIGJ1cnN0IGxlbiBpcyA0ICovCiAJCXByaW50ZigiXG4gICBERFIgRElNTTogZGF0YSBidXMgd2lkdGggaXMgMzIgYml0Iik7CiAJfSBlbHNlIHsKIAkJYnVyc3RsZW4gPSAweDAyOyAvKiBPdGhlcnMgYWN0IGFzIDY0IGJpdCBidXMsIGJ1cnN0IGxlbiBpcyA0ICovCkBAIC03MzAsOCArNzMzLDEyIEBACiAJCXNkcmFtX2NmZyB8PSAweDEwMDAwMDAwOwogCiAJLyogVGhlIERJTU0gaXMgMzJiaXQgd2lkdGggKi8KLQlpZiAoc3BkLmRhdGF3X2xzYiA9PSAweDIwKQotCQlzZHJhbV9jZmcgfD0gMHgwMDBDMDAwMDsKKwlpZiAoc3BkLmRhdGF3X2xzYiA9PSAweDIwKSB7CisJCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSKQorCQkJc2RyYW1fY2ZnIHw9IDB4MDAwQzAwMDA7CisJCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSMikKKwkJCXNkcmFtX2NmZyB8PSAweDAwMDgwMDAwOworCX0KIAogCWRkcmNfZWNjX2VuYWJsZSA9IDA7CiAKZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L3RyYXBzLmMgYi9jcHUvbXBjODN4eC90cmFwcy5jCmluZGV4IDE1MmZhNzMuLmRmZDZjMDMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L3RyYXBzLmMKKysrIGIvY3B1L21wYzgzeHgvdHJhcHMuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNzYsNyArMTc2LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xODgsNyArMTg4LDcgQEAKIHZvaWQKIFByb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDAsNyArMjAwLDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjEzLDcgKzIxMyw3IEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIyMiw3ICsyMjIsNyBAQAogCV9leGNlcHRpb24oMCwgcmVncyk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIGV4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50KHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTIzMSw3ICsyMzEsNyBAQAogewogCXByaW50ZigiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CiAJc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMgYi9jcHUvbXBjODN4eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjYzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjODN4eC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CitFTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC9NYWtlZmlsZSBiL2NwdS9tcGM4NXh4L01ha2VmaWxlCmluZGV4IGZmNjdkY2QuLjMyMDkxZmEgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4NXh4L01ha2VmaWxlCisrKyBiL2NwdS9tcGM4NXh4L01ha2VmaWxlCkBAIC0zMCw3ICszMCw3IEBACiAKIFNUQVJUCT0gc3RhcnQubyByZXNldHZlYy5vCiBDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubyBcCi0JICBwY2kubyBzZXJpYWxfc2NjLm8gY29tbXByb2MubyBldGhlcl9mY2MubyBzcGRfc2RyYW0ubworCSAgcGNpLm8gc2VyaWFsX3NjYy5vIGNvbW1wcm9jLm8gZXRoZXJfZmNjLm8gc3BkX3NkcmFtLm8gcWVfaW8ubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L2NwdS5jIGIvY3B1L21wYzg1eHgvY3B1LmMKaW5kZXggMWQ3OTFjOS4uMDhlMDQ2OCAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvY3B1LmMKKysrIGIvY3B1L21wYzg1eHgvY3B1LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCWlmIChwICE9IE5VTEwpCiAJCSpwID0gY3B1X3RvX2JlMzIoY2xvY2spOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVFNFQzEpCisjaWYgZGVmaW5lZChDT05GSUdfSEFTX0VUSDApCiAJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNDAwMC9tYWMtYWRkcmVzcyIsICZsZW4pOwogCWlmIChwKQogCQltZW1jcHkocCwgYmQtPmJpX2VuZXRhZGRyLCA2KTsKQEAgLTMwOCw2ICszMDgsMTcgQEAKIAlwID0gZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI2MDAwL2xvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7CiAJaWYgKHApCiAJCW1lbWNweShwLCBiZC0+YmlfZW5ldDJhZGRyLCA2KTsKKworI2lmZGVmIENPTkZJR19VRUNfRVRICisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9RRSAiL3VjY0AyMDAwL21hYy1hZGRyZXNzIiwgJmxlbik7CisJaWYgKHApCisJCW1lbWNweShwLCBiZC0+YmlfZW5ldDJhZGRyLCA2KTsKKworCXAgPSBmdF9nZXRfcHJvcChibG9iLCAiLyIgT0ZfUUUgIi91Y2NAMjAwMC9sb2NhbC1tYWMtYWRkcmVzcyIsICZsZW4pOworCWlmIChwKQorCQltZW1jcHkocCwgYmQtPmJpX2VuZXQyYWRkciwgNik7CisKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19IQVNfRVRIMykKQEAgLTMxOCw2ICszMjksMTcgQEAKIAlwID0gZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI3MDAwL2xvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7CiAJaWYgKHApCiAJCW1lbWNweShwLCBiZC0+YmlfZW5ldDNhZGRyLCA2KTsKKworI2lmZGVmIENPTkZJR19VRUNfRVRICisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9RRSAiL3VjY0AzMDAwL21hYy1hZGRyZXNzIiwgJmxlbik7CisJaWYgKHApCisJCW1lbWNweShwLCBiZC0+YmlfZW5ldDNhZGRyLCA2KTsKKworCXAgPSBmdF9nZXRfcHJvcChibG9iLCAiLyIgT0ZfUUUgIi91Y2NAMzAwMC9sb2NhbC1tYWMtYWRkcmVzcyIsICZsZW4pOworCWlmIChwKQorCQltZW1jcHkocCwgYmQtPmJpX2VuZXQzYWRkciwgNik7CisKKyNlbmRpZgogI2VuZGlmCiAKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L2NwdV9pbml0LmMgYi9jcHUvbXBjODV4eC9jcHVfaW5pdC5jCmluZGV4IDk1MTcxNDYuLjdiOTk2MTAgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4NXh4L2NwdV9pbml0LmMKKysrIGIvY3B1L21wYzg1eHgvY3B1X2luaXQuYwpAQCAtMSw0ICsxLDYgQEAKIC8qCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqCiAgKiAoQykgQ29weXJpZ2h0IDIwMDMgTW90b3JvbGEgSW5jLgogICogTW9kaWZpZWQgYnkgWGlhbmdodWEgWGlhbywgWC5YaWFvQG1vdG9yb2xhLmNvbQogICoKQEAgLTMyLDYgKzM0LDI5IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCisjaWZkZWYgQ09ORklHX1FFCitleHRlcm4gcWVfaW9wX2NvbmZfdCBxZV9pb3BfY29uZl90YWJbXTsKK2V4dGVybiB2b2lkIHFlX2NvbmZpZ19pb3Bpbih1OCBwb3J0LCB1OCBwaW4sIGludCBkaXIsCisJCQkJaW50IG9wZW5fZHJhaW4sIGludCBhc3NpZ24pOworZXh0ZXJuIHZvaWQgcWVfaW5pdCh1aW50IHFlX2Jhc2UpOworZXh0ZXJuIHZvaWQgcWVfcmVzZXQodm9pZCk7CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19xZV9pb3BvcnRzKHZvaWQpCit7CisJdTggICAgICBwb3J0LCBwaW47CisJaW50ICAgICBkaXIsIG9wZW5fZHJhaW4sIGFzc2lnbjsKKwlpbnQgICAgIGk7CisKKwlmb3IgKGkgPSAwOyBxZV9pb3BfY29uZl90YWJbaV0uYXNzaWduICE9IFFFX0lPUF9UQUJfRU5EOyBpKyspIHsKKwkJcG9ydAkJPSBxZV9pb3BfY29uZl90YWJbaV0ucG9ydDsKKwkJcGluCQk9IHFlX2lvcF9jb25mX3RhYltpXS5waW47CisJCWRpcgkJPSBxZV9pb3BfY29uZl90YWJbaV0uZGlyOworCQlvcGVuX2RyYWluCT0gcWVfaW9wX2NvbmZfdGFiW2ldLm9wZW5fZHJhaW47CisJCWFzc2lnbgkJPSBxZV9pb3BfY29uZl90YWJbaV0uYXNzaWduOworCQlxZV9jb25maWdfaW9waW4ocG9ydCwgcGluLCBkaXIsIG9wZW5fZHJhaW4sIGFzc2lnbik7CisJfQorfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQ1BNMgogc3RhdGljIHZvaWQgY29uZmlnXzg1NjBfaW9wb3J0cyAodm9sYXRpbGUgaW1tYXBfdCAqIGltbXIpCkBAIC0xMzMsMTUgKzE1OCwxOCBAQAogI2VuZGlmCiAKIAkvKiBub3cgcmVzdHJpY3QgdG8gcHJlbGltaW5hcnkgcmFuZ2UgKi8KKwkvKiBpZiBjczEgaXMgYWxyZWFkeSBzZXQgdmlhIGRlYnVnZ2VyLCBsZWF2ZSBjczAvY3MxIGFsb25lICovCisJaWYgKCEgbWVtY3RsLT5icjEgJiAxKSB7CiAjaWYgZGVmaW5lZChDRkdfQlIwX1BSRUxJTSkgJiYgZGVmaW5lZChDRkdfT1IwX1BSRUxJTSkKLQltZW1jdGwtPmJyMCA9IENGR19CUjBfUFJFTElNOwotCW1lbWN0bC0+b3IwID0gQ0ZHX09SMF9QUkVMSU07CisJCW1lbWN0bC0+YnIwID0gQ0ZHX0JSMF9QUkVMSU07CisJCW1lbWN0bC0+b3IwID0gQ0ZHX09SMF9QUkVMSU07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0JSMV9QUkVMSU0pICYmIGRlZmluZWQoQ0ZHX09SMV9QUkVMSU0pCi0JbWVtY3RsLT5vcjEgPSBDRkdfT1IxX1BSRUxJTTsKLQltZW1jdGwtPmJyMSA9IENGR19CUjFfUFJFTElNOworCQltZW1jdGwtPm9yMSA9IENGR19PUjFfUFJFTElNOworCQltZW1jdGwtPmJyMSA9IENGR19CUjFfUFJFTElNOwogI2VuZGlmCisJfQogCiAjaWYgZGVmaW5lZChDRkdfQlIyX1BSRUxJTSkgJiYgZGVmaW5lZChDRkdfT1IyX1BSRUxJTSkKIAltZW1jdGwtPm9yMiA9IENGR19PUjJfUFJFTElNOwpAQCAtMTc2LDYgKzIwNCwxMSBAQAogI2lmIGRlZmluZWQoQ09ORklHX0NQTTIpCiAJbTg1NjBfY3BtX3Jlc2V0KCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUUUKKwkvKiBDb25maWcgUUUgaW9wb3J0cyAqLworCWNvbmZpZ19xZV9pb3BvcnRzKCk7CisjZW5kaWYKKwogfQogCiAKQEAgLTE4NSwxNiArMjE4LDI1IEBACiAgKiBUaGUgbmV3ZXIgODU0OCwgZXRjLCBwYXJ0cyBoYXZlIHR3aWNlIGFzIG11Y2ggY2FjaGUsIGJ1dAogICogdXNlIHRoZSBzYW1lIGJpdC1lbmNvZGluZyBhcyB0aGUgb2xkZXIgODU1NSwgZXRjLCBwYXJ0cy4KICAqCi0gKiBGSVhNRTogVXNlIFBWUl9WRVIocHZyKSA9PSAxIHRlc3QgaGVyZSBpbnN0ZWFkIG9mIFNWUl9WRVIoKT8KICAqLwogCiBpbnQgY3B1X2luaXRfcih2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX0NMRUFSX0xBVzApIHx8IGRlZmluZWQoQ09ORklHX0wyX0NBQ0hFKQorCXZvbGF0aWxlIGltbWFwX3QgICAgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DTEVBUl9MQVcwCisJdm9sYXRpbGUgY2Nzcl9sb2NhbF9lY21fdCAqZWNtID0gJmltbWFwLT5pbV9sb2NhbF9lY207CisKKwkvKiBjbGVhciBhbHRlcm5hdGUgYm9vdCBsb2NhdGlvbiBMQVcgKHVzZWQgZm9yIHNkcmFtLCBvciBkZHIgYmFuaykgKi8KKwllY20tPmxhd2FyMCA9IDA7CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX0wyX0NBQ0hFKQotCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKIAl2b2xhdGlsZSBjY3NyX2wyY2FjaGVfdCAqbDJjYWNoZSA9ICZpbW1hcC0+aW1fbDJjYWNoZTsKIAl2b2xhdGlsZSB1aW50IGNhY2hlX2N0bDsKIAl1aW50IHN2ciwgdmVyOworCXVpbnQgbDJzcmJhcjsKIAogCXN2ciA9IGdldF9zdnIoKTsKIAl2ZXIgPSBTVlJfVkVSKHN2cik7CkBAIC0yMDQsMzMgKzI0Niw1NSBAQAogCiAJc3dpdGNoIChjYWNoZV9jdGwgJiAweDMwMDAwMDAwKSB7CiAJY2FzZSAweDIwMDAwMDAwOgotCQlpZiAodmVyID09IFNWUl84NTQ4IHx8IHZlciA9PSBTVlJfODU0OF9FKSB7CisJCWlmICh2ZXIgPT0gU1ZSXzg1NDggfHwgdmVyID09IFNWUl84NTQ4X0UgfHwKKwkJICAgIHZlciA9PSBTVlJfODU0NCkgewogCQkJcHJpbnRmICgiTDIgY2FjaGUgNTEyS0I6Iik7CisJCQkvKiBzZXQgTDJFPTEsIEwyST0xLCAmIEwyU1JBTT0wICovCisJCQljYWNoZV9jdGwgPSAweGMwMDAwMDAwOwogCQl9IGVsc2UgewogCQkJcHJpbnRmICgiTDIgY2FjaGUgMjU2S0I6Iik7CisJCQkvKiBzZXQgTDJFPTEsIEwyST0xLCAmIEwyQkxLU1o9MiAoMjU2IEtieXRlKSAqLworCQkJY2FjaGVfY3RsID0gMHhjODAwMDAwMDsKIAkJfQogCQlicmVhazsKLQljYXNlIDB4MDAwMDAwMDA6CiAJY2FzZSAweDEwMDAwMDAwOgorCQlwcmludGYgKCJMMiBjYWNoZSAyNTZLQjoiKTsKKwkJaWYgKHZlciA9PSBTVlJfODU0NCB8fCB2ZXIgPT0gU1ZSXzg1NDRfRSkgeworCQkJY2FjaGVfY3RsID0gMHhjMDAwMDAwMDsgLyogc2V0IEwyRT0xLCBMMkk9MSwgJiBMMlNSQU09MCAqLworCQl9CisJCWJyZWFrOwogCWNhc2UgMHgzMDAwMDAwMDoKKwljYXNlIDB4MDAwMDAwMDA6CiAJZGVmYXVsdDoKIAkJcHJpbnRmICgiTDIgY2FjaGUgdW5rbm93biBzaXplICgweCUwOHgpXG4iLCBjYWNoZV9jdGwpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JYXNtKCJtc3luYztpc3luYyIpOwotCWwyY2FjaGUtPmwyY3RsID0gMHg2ODAwMDAwMDsgLyogaW52YWxpZGF0ZSAqLwotCWNhY2hlX2N0bCA9IGwyY2FjaGUtPmwyY3RsOwotCWFzbSgibXN5bmM7aXN5bmMiKTsKLQotCWwyY2FjaGUtPmwyY3RsID0gMHhhODAwMDAwMDsgLyogZW5hYmxlIDI1NktCIEwyIGNhY2hlICovCi0JY2FjaGVfY3RsID0gbDJjYWNoZS0+bDJjdGw7Ci0JYXNtKCJtc3luYztpc3luYyIpOwotCi0JcHJpbnRmKCIgZW5hYmxlZFxuIik7CisJaWYgKGwyY2FjaGUtPmwyY3RsICYgMHg4MDAwMDAwMCkgeworCQlwcmludGYoIiBhbHJlYWR5IGVuYWJsZWQuIik7CisJCWwyc3JiYXIgPSBsMmNhY2hlLT5sMnNyYmFyMDsKKyNpZmRlZiBDRkdfSU5JVF9MMl9BRERSCisJCWlmIChsMmNhY2hlLT5sMmN0bCAmIDB4MDAwMTAwMDAgJiYgbDJzcmJhciA+PSBDRkdfRkxBU0hfQkFTRSkgeworCQkJbDJzcmJhciA9IENGR19JTklUX0wyX0FERFI7CisJCQlsMmNhY2hlLT5sMnNyYmFyMCA9IGwyc3JiYXI7CisJCQlwcmludGYoIiAgTW92aW5nIHRvIDB4JTA4eCIsIENGR19JTklUX0wyX0FERFIpOworCQl9CisjZW5kaWYgLyogQ0ZHX0lOSVRfTDJfQUREUiAqLworCQlwdXRzKCJcbiIpOworCX0gZWxzZSB7CisJCWFzbSgibXN5bmM7aXN5bmMiKTsKKwkJbDJjYWNoZS0+bDJjdGwgPSBjYWNoZV9jdGw7IC8qIGludmFsaWRhdGUgJiBlbmFibGUgKi8KKwkJYXNtKCJtc3luYztpc3luYyIpOworCQlwcmludGYoIiBlbmFibGVkXG4iKTsKKwl9CiAjZWxzZQogCXByaW50ZigiTDIgY2FjaGU6IGRpc2FibGVkXG4iKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19RRQorCXVpbnQgcWVfYmFzZSA9IENGR19JTU1SICsgMHgwMDA4MDAwMDsgLyogUUUgaW1tciBiYXNlICovCisJcWVfaW5pdChxZV9iYXNlKTsKKwlxZV9yZXNldCgpOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L2V0aGVyX2ZjYy5jIGIvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKaW5kZXggZDE1ZDI0Mi4uNWIyM2E4MCAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKKysrIGIvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKQEAgLTQ4LDEzICs0OCwxMyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG5ldC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogI2luY2x1ZGUgPG1paXBoeS5oPgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUE0yKQogCi0jaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpICYmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIFwKIAlkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAKIHN0YXRpYyBzdHJ1Y3QgZXRoZXJfZmNjX2luZm9fcwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpKSBcCisjaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpIFwKIAkJJiYgZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKIAkJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJCQliYl9taWlwaHlfcmVhZCwJYmJfbWlpcGh5X3dyaXRlKTsKQEAgLTQ2OCw2ICs0NjgsNiBAQAogCXJldHVybiAxOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0VUSEVSX09OX0ZDQyAmJiBDRkdfQ01EX05FVCAmJiBDT05GSUdfTkVUX01VTFRJICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19DUE0yICovCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC9pbnRlcnJ1cHRzLmMgYi9jcHUvbXBjODV4eC9pbnRlcnJ1cHRzLmMKaW5kZXggODMyNzgxYi4uYmY3MzdkNiAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9tcGM4NXh4L2ludGVycnVwdHMuYwpAQCAtODksNiArODksMzkgQEAKIAltdHNwcihTUFJOX1RDUiwgVENSX1BJRSk7CiAJc2V0X2RlYyAoZGVjcmVtZW50ZXJfY291bnQpOwogCXNldF9tc3IgKGdldF9tc3IgKCkgfCBNU1JfRUUpOworCisjaWZkZWYgQ09ORklHX0lOVEVSUlVQVFMKKwl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPSAmaW1tci0+aW1fcGljOworCisJcGljLT5paXZwcjEgPSAweDgxMDAwMjsJLyogNTAyMjAgZW5hYmxlIGVjbSBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMUAleCA9ICV4XG4iLCZwaWMtPmlpdnByMSwgcGljLT5paXZwcjEpOworCisJcGljLT5paXZwcjIgPSAweDgxMDAwMjsJLyogNTAyNDAgZW5hYmxlIGRkciBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMkAleCA9ICV4XG4iLCZwaWMtPmlpdnByMiwgcGljLT5paXZwcjIpOworCisJcGljLT5paXZwcjMgPSAweDgxMDAwMzsJLyogNTAyNjAgZW5hYmxlIGxiYyBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByM0AleCA9ICV4XG4iLCZwaWMtPmlpdnByMywgcGljLT5paXZwcjMpOworCisjaWZkZWYgQ09ORklHX1BDSTEKKwlwaWMtPmlpdnByOCA9IDB4ODEwMDA4OwkvKiBlbmFibGUgcGNpMSBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByOEAleCA9ICV4XG4iLCZwaWMtPmlpdnByOCwgcGljLT5paXZwcjgpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUENJMikgfHwgZGVmaW5lZChDT05GSUdfUENJRTIpCisJcGljLT5paXZwcjkgPSAweDgxMDAwOTsJLyogZW5hYmxlIHBjaTEgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjlAJXggPSAleFxuIiwmcGljLT5paXZwcjksIHBpYy0+aWl2cHI5KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lFMQorCXBpYy0+aWl2cHIxMCA9IDB4ODEwMDBhOwkvKiBlbmFibGUgcGNpZTEgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjEwQCV4ID0gJXhcbiIsJnBpYy0+aWl2cHIxMCwgcGljLT5paXZwcjEwKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lFMworCXBpYy0+aWl2cHIxMSA9IDB4ODEwMDBiOwkvKiBlbmFibGUgcGNpZTMgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjExQCV4ID0gJXhcbiIsJnBpYy0+aWl2cHIxMSwgcGljLT5paXZwcjExKTsKKyNlbmRpZgorCisJcGljLT5jdHByPTA7CQkvKiA0MDA4MCBjbGVhciBjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgKi8KKyNlbmRpZgorCiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMTQ0LDcgKzE3Nyw3IEBACiAJdGltZXN0YW1wID0gdDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE1OSw0ICsxOTIsNCBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L3BjaS5jIGIvY3B1L21wYzg1eHgvcGNpLmMKaW5kZXggM2MxYTMyMy4uZGIwOWU0NSAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvcGNpLmMKKysrIGIvY3B1L21wYzg1eHgvcGNpLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCQl1OCBoZWFkZXJfdHlwZTsKIAogCQlwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsCi0JCQkJCSAgUENJX0JERigwLDE3LDApLAorCQkJCQkgIFBDSV9CREYoMCxCUklER0VfSUQsMCksCiAJCQkJCSAgUENJX0hFQURFUl9UWVBFLAogCQkJCQkgICZoZWFkZXJfdHlwZSk7CiAJfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzg1eHgvcWVfaW8uYyBiL2NwdS9tcGM4NXh4L3FlX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3OGJjNQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4NXh4L3FlX2lvLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgKiBiYXNlZCBvbiBzb3VyY2UgY29kZSBvZiBTaGxvbWkgR3JpZGlzaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJhc20vZXJybm8uaCIKKyNpbmNsdWRlICJhc20vaW8uaCIKKyNpbmNsdWRlICJhc20vaW1tYXBfODV4eC5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfUUUpCisjZGVmaW5lCU5VTV9PRl9QSU5TCTMyCit2b2lkIHFlX2NvbmZpZ19pb3Bpbih1OCBwb3J0LCB1OCBwaW4sIGludCBkaXIsIGludCBvcGVuX2RyYWluLCBpbnQgYXNzaWduKQoreworCXUzMgkJCXBpbl8yYml0X21hc2s7CisJdTMyCQkJcGluXzJiaXRfZGlyOworCXUzMgkJCXBpbl8yYml0X2Fzc2lnbjsKKwl1MzIJCQlwaW5fMWJpdF9tYXNrOworCXUzMgkJCXRtcF92YWw7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAodm9sYXRpbGUgaW1tYXBfdCAqKUNGR19JTU1SOworCXZvbGF0aWxlIHBhcl9pb190CSpwYXJfaW8gPSAodm9sYXRpbGUgcGFyX2lvX3QgKikKKwkJCQkJCSYoaW0tPmltX2d1ci5xZV9wYXJfaW8pOworCisJLyogQ2FjdWxhdGUgcGluIGxvY2F0aW9uIGFuZCAyYml0IG1hc2sgYW5kIGRpciAqLworCXBpbl8yYml0X21hc2sgPSAodTMyKSgweDMgPDwgKE5VTV9PRl9QSU5TLShwaW4lKE5VTV9PRl9QSU5TLzIpKzEpKjIpKTsKKwlwaW5fMmJpdF9kaXIgPSAodTMyKShkaXIgPDwgKE5VTV9PRl9QSU5TLShwaW4lKE5VTV9PRl9QSU5TLzIpKzEpKjIpKTsKKworCS8qIFNldHVwIHRoZSBkaXJlY3Rpb24gKi8KKwl0bXBfdmFsID0gKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtIDEpID8gXAorCQlpbl9iZTMyKCZwYXJfaW9bcG9ydF0uY3BkaXIyKSA6CisJCWluX2JlMzIoJnBhcl9pb1twb3J0XS5jcGRpcjEpOworCisJaWYgKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtMSkgeworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwZGlyMiwgfnBpbl8yYml0X21hc2sgJiB0bXBfdmFsKTsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcGRpcjIsIHBpbl8yYml0X2RpciB8IHRtcF92YWwpOworCX0gZWxzZSB7CisJCW91dF9iZTMyKCZwYXJfaW9bcG9ydF0uY3BkaXIxLCB+cGluXzJiaXRfbWFzayAmIHRtcF92YWwpOworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwZGlyMSwgcGluXzJiaXRfZGlyIHwgdG1wX3ZhbCk7CisJfQorCisJLyogQ2FsY3VsYXRlIHBpbiBsb2NhdGlvbiBmb3IgMWJpdCBtYXNrICovCisJcGluXzFiaXRfbWFzayA9ICh1MzIpKDEgPDwgKE5VTV9PRl9QSU5TIC0gKHBpbisxKSkpOworCisJLyogU2V0dXAgdGhlIG9wZW4gZHJhaW4gKi8KKwl0bXBfdmFsID0gaW5fYmUzMigmcGFyX2lvW3BvcnRdLmNwb2RyKTsKKwlpZiAob3Blbl9kcmFpbikKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcG9kciwgcGluXzFiaXRfbWFzayB8IHRtcF92YWwpOworCWVsc2UKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcG9kciwgfnBpbl8xYml0X21hc2sgJiB0bXBfdmFsKTsKKworCS8qIFNldHVwIHRoZSBhc3NpZ25tZW50ICovCisJdG1wX3ZhbCA9IChwaW4gPiAoTlVNX09GX1BJTlMvMikgLSAxKSA/CisJCWluX2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjIpOgorCQlpbl9iZTMyKCZwYXJfaW9bcG9ydF0uY3BwYXIxKTsKKwlwaW5fMmJpdF9hc3NpZ24gPSAodTMyKShhc3NpZ24KKwkJCQk8PCAoTlVNX09GX1BJTlMgLSAocGluJShOVU1fT0ZfUElOUy8yKSsxKSoyKSk7CisKKwkvKiBDbGVhciBhbmQgc2V0IDIgYml0cyBtYXNrICovCisJaWYgKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtIDEpIHsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjIsIH5waW5fMmJpdF9tYXNrICYgdG1wX3ZhbCk7CisJCW91dF9iZTMyKCZwYXJfaW9bcG9ydF0uY3BwYXIyLCBwaW5fMmJpdF9hc3NpZ24gfCB0bXBfdmFsKTsKKwl9IGVsc2UgeworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwcGFyMSwgfnBpbl8yYml0X21hc2sgJiB0bXBfdmFsKTsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjEsIHBpbl8yYml0X2Fzc2lnbiB8IHRtcF92YWwpOworCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19RRSAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzg1eHgvc3BkX3NkcmFtLmMgYi9jcHUvbXBjODV4eC9zcGRfc2RyYW0uYwppbmRleCAzNzc3ZjQ5Li41ZGMyMjNhIDEwMDY0NAotLS0gYS9jcHUvbXBjODV4eC9zcGRfc2RyYW0uYworKysgYi9jcHUvbXBjODV4eC9zcGRfc2RyYW0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIENvcHlyaWdodCAyMDA0LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICogKEMpIENvcHlyaWdodCAyMDAzIE1vdG9yb2xhIEluYy4KICAqIFhpYW5naHVhIFhpYW8gKFguWGlhb0Btb3Rvcm9sYS5jb20pCiAgKgpAQCAtMTczLDExICsxNzMsMTAgQEAKIHsKIAl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CiAJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyID0gJmltbWFwLT5pbV9kZHI7Ci0Jdm9sYXRpbGUgY2Nzcl9ndXJfdCAqZ3VyID0gJmltbWFwLT5pbV9ndXI7CiAJc3BkX2VlcHJvbV90IHNwZDsKIAl1bnNpZ25lZCBpbnQgbl9yYW5rczsKIAl1bnNpZ25lZCBpbnQgcmFua19kZW5zaXR5OwotCXVuc2lnbmVkIGludCBvZHRfcmRfY2ZnLCBvZHRfd3JfY2ZnOworCXVuc2lnbmVkIGludCBvZHRfcmRfY2ZnLCBvZHRfd3JfY2ZnLCBiYV9iaXRzOwogCXVuc2lnbmVkIGludCBvZHRfY2ZnLCBtb2RlX29kdF9lbmFibGU7CiAJdW5zaWduZWQgaW50IHJlZnJlc2hfY2xrOwogI2lmZGVmIE1QQzg1eHhfRERSX1NEUkFNX0NMS19DTlRMCkBAIC0xODksNyArMTg4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbWF4X2RhdGFfcmF0ZSwgZWZmZWN0aXZlX2RhdGFfcmF0ZTsKIAl1bnNpZ25lZCBpbnQgYnVzZnJlcTsKIAl1bnNpZ25lZCBzZHJhbV9jZmc7Ci0JdW5zaWduZWQgaW50IG1lbXNpemU7CisJdW5zaWduZWQgaW50IG1lbXNpemUgPSAwOwogCXVuc2lnbmVkIGNoYXIgY2FzbGF0LCBjYXNsYXRfY3RybDsKIAl1bnNpZ25lZCBpbnQgdHJmYywgdHJmY19jbGssIHRyZmNfbG93LCB0cmZjX2hpZ2g7CiAJdW5zaWduZWQgaW50IHRyY2RfY2xrOwpAQCAtMjA0LDYgKzIwMyw0NiBAQAogCXVuc2lnbmVkIGludCBtb2RlX2Nhc2xhdDsKIAl1bnNpZ25lZCBjaGFyIHNkcmFtX3R5cGU7CiAJdW5zaWduZWQgY2hhciBkX2luaXQ7CisJdW5zaWduZWQgaW50IGJuZHM7CisKKwkvKgorCSAqIFNraXAgY29uZmlndXJhdGlvbiBpZiBhbHJlYWR5IGNvbmZpZ3VyZWQuCisJICogbWVtc2l6ZSBpcyBkZXRlcm1pbmVkIGZyb20gbGFzdCBjb25maWd1cmVkIGNoaXAgc2VsZWN0LgorCSAqLworCWlmIChkZHItPmNzMF9jb25maWcgJiAweDgwMDAwMDAwKSB7CisJCWRlYnVnKCIgY3MwIGFscmVhZHkgY29uZmlndXJlZCwgYm5kcz0leFxuIixkZHItPmNzMF9ibmRzKTsKKwkJYm5kcyA9IDB4ZmZmICYgZGRyLT5jczBfYm5kczsKKwkJaWYgKGJuZHMgPCAweGZmKSB7IC8qIGRvIG5vdCBhZGQgaWYgYXQgdG9wIG9mIDRHICovCisJCQltZW1zaXplID0gKGJuZHMgKyAxKSA8PCA0OworCQl9CisJfQorCWlmIChkZHItPmNzMV9jb25maWcgJiAweDgwMDAwMDAwKSB7CisJCWRlYnVnKCIgY3MxIGFscmVhZHkgY29uZmlndXJlZCwgYm5kcz0leFxuIixkZHItPmNzMV9ibmRzKTsKKwkJYm5kcyA9IDB4ZmZmICYgZGRyLT5jczFfYm5kczsKKwkJaWYgKGJuZHMgPCAweGZmKSB7IC8qIGRvIG5vdCBhZGQgaWYgYXQgdG9wIG9mIDRHICovCisJCQltZW1zaXplID0gKGJuZHMgKyAxKSA8PCA0OyAvKiBhc3N1bWUgb3JkZXJlZCBibmRzICovCisJCX0KKwl9CisJaWYgKGRkci0+Y3MyX2NvbmZpZyAmIDB4ODAwMDAwMDApIHsKKwkJZGVidWcoIiBjczIgYWxyZWFkeSBjb25maWd1cmVkLCBibmRzPSV4XG4iLGRkci0+Y3MyX2JuZHMpOworCQlibmRzID0gMHhmZmYgJiBkZHItPmNzMl9ibmRzOworCQlpZiAoYm5kcyA8IDB4ZmYpIHsgLyogZG8gbm90IGFkZCBpZiBhdCB0b3Agb2YgNEcgKi8KKwkJCW1lbXNpemUgPSAoYm5kcyArIDEpIDw8IDQ7CisJCX0KKwl9CisJaWYgKGRkci0+Y3MzX2NvbmZpZyAmIDB4ODAwMDAwMDApIHsKKwkJZGVidWcoIiBjczMgYWxyZWFkeSBjb25maWd1cmVkLCBibmRzPSV4XG4iLGRkci0+Y3MzX2JuZHMpOworCQlibmRzID0gMHhmZmYgJiBkZHItPmNzM19ibmRzOworCQlpZiAoYm5kcyA8IDB4ZmYpIHsgLyogZG8gbm90IGFkZCBpZiBhdCB0b3Agb2YgNEcgKi8KKwkJCW1lbXNpemUgPSAoYm5kcyArIDEpIDw8IDQ7CisJCX0KKwl9CisKKwlpZiAobWVtc2l6ZSkgeworCQlwcmludGYoIiAgICAgICBSZXVzaW5nIGN1cnJlbnQgJWRNQiBjb25maWd1cmF0aW9uXG4iLG1lbXNpemUpOworCQltZW1zaXplID0gc2V0dXBfbGF3c19hbmRfdGxicyhtZW1zaXplKTsKKwkJcmV0dXJuIG1lbXNpemUgPDwgMjA7CisJfQogCiAJLyoKIAkgKiBSZWFkIFNQRCBpbmZvcm1hdGlvbi4KQEAgLTI2Miw2ICszMDEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKyNpZmRlZiBDT05GSUdfTVBDODU0OAogCS8qCiAJICogQWRqdXN0IEREUiBJSSBJTyB2b2x0YWdlIGJpYXNpbmcuCiAJICogT25seSA4NTQ4IHJldiAxIG5lZWRzIHRoZSBmaXgKQEAgLTI2OSw5ICszMDksMTEgQEAKIAlpZiAoKFNWUl9WRVIoZ2V0X3N2cigpKSA9PSBTVlJfODU0OF9FKSAmJgogCQkJKFNWUl9NSlJFVihnZXRfc3ZyKCkpID09IDEpICYmCiAJCQkoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUjIpKSB7CisJCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICZpbW1hcC0+aW1fZ3VyOwogCQlndXItPmRkcmlvb3ZjciA9ICgweDgwMDAwMDAwCS8qIEVuYWJsZSAqLwogCQkJCSAgfCAweDEwMDAwMDAwKTsvKiBWU0VMIHRvIDEuOFYgKi8KIAl9CisjZW5kaWYKIAogCS8qCiAJICogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGVhY2ggUmFuayBpbiBieXRlcy4KQEAgLTI5OSw5ICszNDEsMTQgQEAKICNlbmRpZgogCX0KIAorCWJhX2JpdHMgPSAwOworCWlmIChzcGQubmJhbmtzID09IDB4OCkKKwkJYmFfYml0cyA9IDE7CisKIAlkZHItPmNzMF9jb25maWcgPSAoIDEgPDwgMzEKIAkJCSAgICB8IChvZHRfcmRfY2ZnIDw8IDIwKQogCQkJICAgIHwgKG9kdF93cl9jZmcgPDwgMTYpCisJCQkgICAgfCAoYmFfYml0cyA8PCAxNCkKIAkJCSAgICB8IChzcGQubnJvd19hZGRyIC0gMTIpIDw8IDgKIAkJCSAgICB8IChzcGQubmNvbF9hZGRyIC0gOCkgKTsKIAlkZWJ1ZygiXG4iKTsKQEAgLTY0NSwxMyArNjkyLDEwIEBACiAJICovCiAJY3BvID0gMDsKIAlpZiAoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUjIpIHsKLQkJaWYgKGVmZmVjdGl2ZV9kYXRhX3JhdGUgPT0gMjY2IHx8IGVmZmVjdGl2ZV9kYXRhX3JhdGUgPT0gMzMzKSB7CisJCWlmIChlZmZlY3RpdmVfZGF0YV9yYXRlIDw9IDMzMykgewogCQkJY3BvID0gMHg3OwkJLyogUkVBRF9MQVQgKyA1LzQgKi8KLQkJfSBlbHNlIGlmIChlZmZlY3RpdmVfZGF0YV9yYXRlID09IDQwMCkgewotCQkJY3BvID0gMHg5OwkJLyogUkVBRF9MQVQgKyA3LzQgKi8KIAkJfSBlbHNlIHsKLQkJCS8qIFB1cmUgc3BlY3VsYXRpb24gKi8KLQkJCWNwbyA9IDB4YjsKKwkJCWNwbyA9IDB4OTsJCS8qIFJFQURfTEFUICsgNy80ICovCiAJCX0KIAl9CiAKQEAgLTg1OCw3ICs5MDIsMTIgQEAKIAlpZiAoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUikKIAkJY2xrX2FkanVzdCA9IDB4NjsKIAllbHNlCisjaWZkZWYgQ09ORklHX01QQzg1NjgKKwkJLyogRW1waXJhbGx5IHNldHRpbmcgY2xrX2FkanVzdCAqLworCQljbGtfYWRqdXN0ID0gMHg2OworI2Vsc2UKIAkJY2xrX2FkanVzdCA9IDB4NzsKKyNlbmRpZgogCiAJZGRyLT5zZHJhbV9jbGtfY250bCA9ICgwCiAJCQkgICAgICAgfCAweDgwMDAwMDAwCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC9zdGFydC5TIGIvY3B1L21wYzg1eHgvc3RhcnQuUwppbmRleCA3N2MxNTVjLi4yYzk4YzJhIDEwMDY0NAotLS0gYS9jcHUvbXBjODV4eC9zdGFydC5TCisrKyBiL2NwdS9tcGM4NXh4L3N0YXJ0LlMKQEAgLTEsNyArMSw2IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KICAqIENvcHlyaWdodCAoQykgMjAwMyAgTW90b3JvbGEsSW5jLgotICogWGlhbmdodWEgWGlhbzxYLlhpYW9AbW90b3JvbGEuY29tPgogICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAgKiBwcm9qZWN0LgpAQCAtNDYsNyArNDUsNyBAQAogI2VuZGlmCiAKICN1bmRlZglNU1JfS0VSTkVMCi0jZGVmaW5lIE1TUl9LRVJORUwgKCBNU1JfTUUgICkJLyogTWFjaGluZSBDaGVjayAqLworI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FICkJLyogTWFjaGluZSBDaGVjayAqLwogCiAvKgogICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQpAQCAtODAsMTEwICs3OSwzNyBAQAogICoKICAqLwogCi0gICAgLnNlY3Rpb24gLmJvb3RwZywiYXgiCi0gICAgLmdsb2JsIF9zdGFydF9lNTAwCisJLnNlY3Rpb24gLmJvb3RwZywiYXgiCisJLmdsb2JsIF9zdGFydF9lNTAwCiAKIF9zdGFydF9lNTAwOgotCW1mc3ByCXIwLCBQVlIKLQlsaXMJcjEsIFBWUl84NXh4X1JFVjFAaAotCW9yaQlyMSwgcjEsIFBWUl84NXh4X1JFVjFAbAotCWNtcHcJcjAsIHIxCi0JYm5lCTFmCiAKLQkvKiBTZW1pLWJvZ3VzIGVycmF0YSBmaXh1cCBmb3IgUmV2IDEgKi8KLQlsaQlyMCwweDIwMDAKLQltdHNwcgk5NzcscjAKKy8qIGNsZWFyIHJlZ2lzdGVycy9hcnJheXMgbm90IHJlc2V0IGJ5IGhhcmR3YXJlICovCiAKLQkvKgotCSAqIEJlZm9yZSBpbnZhbGlkYXRpbmcgTU1VIEwxL0wyLCByZWFkIFRMQjEgRW50cnkgMCBhbmQgdGhlbgotCSAqIHdyaXRlIGl0IGJhY2sgaW1tZWRpYXRlbHkgdG8gZml4dXAgYSBSZXYgMSBidWcgKEVycmF0YSBDUFU0KQotCSAqIGZvciB0aGlzIGluaXRpYWwgVExCMSBlbnRyeSAwLCBvdGhlcndpc2UgdGhlIFRMQjEgZW50cnkgMAotCSAqIHdpbGwgYmUgaW52YWxpZGF0ZWQgKGluY29ycmVjdGx5KS4KLQkgKi8KLQlsaXMJcjIsMHgxMDAwCi0JbXRzcHIJTUFTMCxyMgotCXRsYnJlCi0JdGxid2UKLQlpc3luYwotCi0xOgotCS8qCi0JICogQ2xlYXIgYW5kIHNldCB1cCBzb21lIHJlZ2lzdGVycy4KLQkgKiBOb3RlOiBTb21lIHJlZ2lzdGVycyBuZWVkIHN0cmljdCBzeW5jaHJvbml6YXRpb24gYnkKLQkgKiBzeW5jL21iYXIvbXN5bmMvaXN5bmMgd2hlbiBiZWluZyAibXRzcHIiLgotCSAqIEJvb2tFOiBpc3luYyBiZWZvcmUgUElELHRsYml2YXgsdGxid2UKLQkgKiBCb29rRTogaXN5bmMgYWZ0ZXIgTVNSLFBJRDsgbXN5bmNfaXN5bmMgYWZ0ZXIgdGxiaXZheCAmIHRsYndlCi0JICogRTUwMDogIG1zeW5jLGlzeW5jIGJlZm9yZSBMMUNTUjAKLQkgKiBFNTAwOiAgaXN5bmMgYWZ0ZXIgQkJFQVIsQkJUQVIsQlVDU1IsREJDUjAsREJDUjEsSElEMCxISUQxLAotCSAqCSAgTDFDU1IwLCBMMUNTUjEsIE1BU1swLDEsMiwzLDQsNl0sTU1VQ1NSMCwgUElEWzAsMSwyXSwKLQkgKgkgIFNQRUZDU1IKLQkgKi8KLQotCS8qIGludmFsaWRhdGUgZC1jYWNoZSAqLwotCW1mc3ByCXIwLEwxQ1NSMAotCW9yaQlyMCxyMCwweDAwMDIKLQltc3luYwotCWlzeW5jCi0JbXRzcHIJTDFDU1IwLHIwCi0JaXN5bmMKLQotCS8qIGRpc2FibGUgZC1jYWNoZSAqLwotCWxpCXIwLDB4MAotCW10c3ByCUwxQ1NSMCxyMAotCi0JLyogaW52YWxpZGF0ZSBpLWNhY2hlICovCi0JbWZzcHIJcjAsTDFDU1IxCi0Jb3JpCXIwLHIwLDB4MDAwMgotCW10c3ByCUwxQ1NSMSxyMAotCWlzeW5jCi0KLQkvKiBkaXNhYmxlIGktY2FjaGUgKi8KLQlsaQlyMCwweDAKLQltdHNwcglMMUNTUjEscjAKLQlpc3luYwotCi0JLyogY2xlYXIgcmVnaXN0ZXJzICovCi0JbGkJcjAsMAotCW10c3ByCVNSUjAscjAKLQltdHNwcglTUlIxLHIwCi0JbXRzcHIJQ1NSUjAscjAKLQltdHNwcglDU1JSMSxyMAotCW10c3ByCU1DU1JSMCxyMAotCW10c3ByCU1DU1JSMSxyMAotCi0JbXRzcHIJRVNSLHIwCi0JbXRzcHIJTUNTUixyMAotCW10c3ByCURFQVIscjAKLQotCS8qIG5vdCBuZWVkZWQgYW5kIGNvbmZsaWN0cyB3aXRoIHNvbWUgZGVidWdnZXJzICovCi0JLyogbXRzcHIJREJDUjAscjAgKi8KLQltdHNwcglEQkNSMSxyMAotCW10c3ByCURCQ1IyLHIwCi0JLyogbm90IG5lZWRlZCBhbmQgY29uZmxpY3RzIHdpdGggc29tZSBkZWJ1Z2dlcnMgKi8KLQkvKiBtdHNwcglJQUMxLHIwICovCi0JLyogbXRzcHIJSUFDMixyMCAqLwotCW10c3ByCURBQzEscjAKLQltdHNwcglEQUMyLHIwCisJLyogTDEgKi8KKwlsaQlyMCwyCisJbXRzcHIJTDFDU1IwLHIwCS8qIGludmFsaWRhdGUgZC1jYWNoZSAqLworCW10c3ByCUwxQ1NSMSxyMCAJLyogaW52YWxpZGF0ZSBpLWNhY2hlICovCiAKIAltZnNwcglyMSxEQlNSCiAJbXRzcHIJREJTUixyMQkJLyogQ2xlYXIgYWxsIHZhbGlkIGJpdHMgKi8KIAotCW10c3ByCVBJRDAscjAKLQltdHNwcglQSUQxLHIwCi0JbXRzcHIJUElEMixyMAotCW10c3ByCVRDUixyMAorCS8qCisJICoJRW5hYmxlIEwxIENhY2hlcyBlYXJseQorCSAqCisJICovCiAKLQltdHNwcglCVUNTUixyMAkvKiBkaXNhYmxlIGJyYW5jaCBwcmVkaWN0aW9uICovCi0JbXRzcHIJTUFTNCxyMAotCW10c3ByCU1BUzYscjAKLSNpZiBkZWZpbmVkKENPTkZJR19FTkFCTEVfMzZCSVRfUEhZUykKLQltdHNwcglNQVM3LHIwCi0jZW5kaWYKKwlsaXMJcjIsTDFDU1IwX0NQRUBICS8qIGVuYWJsZSBwYXJpdHkgKi8KKwlvcmkJcjIscjIsTDFDU1IwX0RDRQorCW10c3ByCUwxQ1NSMCxyMgkvKiBlbmFibGUgTDEgRGNhY2hlICovCiAJaXN5bmMKKwltdHNwcglMMUNTUjEscjIJLyogZW5hYmxlIEwxIEljYWNoZSAqLworCWlzeW5jCisJbXN5bmMKIAogCS8qIFNldHVwIGludGVycnVwdCB2ZWN0b3JzICovCiAJbGlzCXIxLFRFWFRfQkFTRUBoCi0JbXRzcHIgSVZQUiwgcjEKKwltdHNwcglJVlBSLHIxCiAKIAlsaQlyMSwweDAxMDAKIAltdHNwcglJVk9SMCxyMQkvKiAwOiBDcml0aWNhbCBpbnB1dCAqLwpAQCAtMjE3LDI2ICsxNDMsNiBAQAogCWxpCXIxLDB4MGYwMAogCW10c3ByCUlWT1IxNSxyMQkvKiAxNTogRGVidWcgKi8KIAotCS8qCi0JICogSW52YWxpZGF0ZSBNTVUgTDEvTDIKLQkgKgotCSAqIE5vdGU6IFRoZXJlIGlzIGEgZml4dXAgZWFybGllciBmb3IgRXJyYXRhIENQVTQgb24KLQkgKiBSZXYgMSBwYXJ0cyB0aGF0IG11c3QgcHJlY2VkZSB0aGlzIE1NVSBpbnZhbGlkYXRpb24uCi0JICovCi0JbGkJcjIsIDB4MDAxZQotCW10c3ByCU1NVUNTUjAsIHIyCi0JaXN5bmMKLQotCS8qCi0JICogSW52YWxpZGF0ZSBhbGwgVExCMCBlbnRyaWVzLgotCSAqLwotCWxpCXIzLDQKLQlsaQlyNCwwCi0JdGxiaXZheCByNCxyMwotCS8qCi0JICogVG8gYXZvaWQgUkVWMSBFcnJhdGEgQ1BVNiBpc3N1ZXMsIG1ha2Ugc3VyZQotCSAqIHRoZSBpbnN0cnVjdGlvbiBmb2xsb3dpbmcgdGxiaXZheCBpcyBub3QgYSBzdG9yZS4KLQkgKi8KIAogCS8qCiAJICogQWZ0ZXIgcmVzZXQsIENDU1JCQVIgaXMgbG9jYXRlZCBhdCBDRkdfQ0NTUkJBUl9ERUZBVUxULCBpLmUuCkBAIC0yNTQsMTQgKzE2MCwxNCBAQAogCWx3enUJcjQsMChyNSkJLyogaG93IG1hbnkgVExCMSBlbnRyaWVzIHdlIGFjdHVhbGx5IHVzZSAqLwogCW10Y3RyCXI0CiAKLTA6CWx3enUJcjAsNChyNSkKLQlsd3p1CXIxLDQocjUpCi0JbHd6dQlyMiw0KHI1KQotCWx3enUJcjMsNChyNSkKLQltdHNwcglNQVMwLHIwCi0JbXRzcHIJTUFTMSxyMQotCW10c3ByCU1BUzIscjIKLQltdHNwcglNQVMzLHIzCiswOglsd3p1CXI2LDQocjUpCisJbHd6dQlyNyw0KHI1KQorCWx3enUJcjgsNChyNSkKKwlsd3p1CXI5LDQocjUpCisJbXRzcHIJTUFTMCxyNgorCW10c3ByCU1BUzEscjcKKwltdHNwcglNQVMyLHI4CisJbXRzcHIJTUFTMyxyOQogCWlzeW5jCiAJbXN5bmMKIAl0bGJ3ZQpAQCAtMjcxLDIyICsxNzcsMjIgQEAKIDE6CiAjaWYgKENGR19DQ1NSQkFSX0RFRkFVTFQgIT0gQ0ZHX0NDU1JCQVIpCiAJLyogU3BlY2lhbCBzZXF1ZW5jZSBuZWVkZWQgdG8gdXBkYXRlIENDU1JCQVIgaXRzZWxmICovCi0JbGlzCXI0LCBDRkdfQ0NTUkJBUl9ERUZBVUxUQGgKLQlvcmkJcjQsIHI0LCBDRkdfQ0NTUkJBUl9ERUZBVUxUQGwKKwlsaXMJcjQsQ0ZHX0NDU1JCQVJfREVGQVVMVEBoCisJb3JpCXI0LHI0LENGR19DQ1NSQkFSX0RFRkFVTFRAbAogCi0JbGlzCXI1LCBDRkdfQ0NTUkJBUkBoCi0Jb3JpCXI1LCByNSwgQ0ZHX0NDU1JCQVJAbAorCWxpcwlyNSxDRkdfQ0NTUkJBUkBoCisJb3JpCXI1LHI1LENGR19DQ1NSQkFSQGwKIAlzcndpCXI2LHI1LDEyCi0Jc3R3CXI2LCAwKHI0KQorCXN0dwlyNiwwKHI0KQogCWlzeW5jCiAKLQlsaXMJcjUsIDB4ZmZmZgorCWxpcwlyNSwweGZmZmYKIAlvcmkJcjUscjUsMHhmMDAwCi0JbHd6CXI1LCAwKHI1KQorCWx3eglyNSwwKHI1KQogCWlzeW5jCiAKLQlsaXMJcjMsIENGR19DQ1NSQkFSQGgKLQlsd3oJcjUsIENGR19DQ1NSQkFSQGwocjMpCisJbGlzCXIzLENGR19DQ1NSQkFSQGgKKwlsd3oJcjUsQ0ZHX0NDU1JCQVJAbChyMykKIAlpc3luYwogI2VuZGlmCiAKQEAgLTMwMCw4ICsyMDYsOCBAQAogCWx3enUJcjUsMChyNikJLyogaG93IG1hbnkgd2luZG93cyB3ZSBhY3R1YWxseSB1c2UgKi8KIAltdGN0cglyNQogCi0JbGkJcjIsMHgwYzI4CS8qIHRoZSBmaXJzdCBwYWlyIGlzIHJlc2VydmVkIGZvciBib290LW92ZXItcmlvLW9yLXBjaSAqLwotCWxpCXIxLDB4MGMzMAorCWxpCXIyLDB4MGMyOAkvKiB0aGUgZmlyc3QgcGFpciBpcyByZXNlcnZlZCBmb3IgKi8KKwlsaQlyMSwweDBjMzAJLyogYm9vdC1vdmVyLXJpby1vci1wY2kgKi8KIAogMDoJbHd6dQlyNCw0KHI2KQogCWx3enUJcjMsNChyNikKQEAgLTMxMSwzMSArMjE3LDYgQEAKIAlhZGRpCXIxLHIxLDB4MDAyMAogCWJkbnoJMGIKIAotCS8qIEp1bXAgb3V0IHRoZSBsYXN0IDRLIHBhZ2UgYW5kIGNvbnRpbnVlIHRvICdub3JtYWwnIHN0YXJ0ICovCi0xOglibAkzZgotCWIJX3N0YXJ0Ci0KLTM6CWxpCXIwLDAKLQltdHNwcglTUlIxLHIwCQkvKiBLZWVwIHRoaW5ncyBkaXNhYmxlZCBmb3Igbm93ICovCi0JbWZscglyMQotCW10c3ByCVNSUjAscjEKLQlyZmkKLQotLyoKLSAqIHIzIC0gMXN0IGFyZyB0byBib2FyZF9pbml0KCk6IElNTVAgcG9pbnRlcgotICogcjQgLSAybmQgYXJnIHRvIGJvYXJkX2luaXQoKTogYm9vdCBmbGFnCi0gKi8KLQkudGV4dAotCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQk9PVCBNYWdpYyBOdW1iZXIJCQkqLwotCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwotdmVyc2lvbl9zdHJpbmc6Ci0JLmFzY2lpIFVfQk9PVF9WRVJTSU9OCi0JLmFzY2lpICIgKCIsIF9fREFURV9fLCAiIC0gIiwgX19USU1FX18sICIpIgotCS5hc2NpaSBDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCi0KLQkuID0gRVhDX09GRl9TWVNfUkVTRVQKLQkuZ2xvYmwJX3N0YXJ0Ci1fc3RhcnQ6CiAJLyogQ2xlYXIgYW5kIHNldCB1cCBzb21lIHJlZ2lzdGVycy4gKi8KIAlsaQlyMCwweDAwMDAKIAlsaXMJcjEsMHhmZmZmCkBAIC0zNTQsMTcgKzIzNSwxNCBAQAogCiAJLyogRW5hYmxlIFRpbWUgQmFzZSBhbmQgU2VsZWN0IFRpbWUgQmFzZSBDbG9jayAqLwogCWxpcwlyMCxISUQwX0VNQ1BAaAkJLyogRW5hYmxlIG1hY2hpbmUgY2hlY2sgKi8KLQlvcmkJcjAscjAsMHg0MDAwCQkvKiB0aW1lIGJhc2UgaXMgcHJvY2Vzc29yIGNsb2NrICovCiAjaWYgZGVmaW5lZChDT05GSUdfRU5BQkxFXzM2QklUX1BIWVMpCi0Jb3JpCXIwLHIwLDB4MDA4MAkJLyogZW5hYmxlIE1BUzcgdXBkYXRlcyAqLworCW9yaQlyMCxyMCwoSElEMF9UQkVOfEhJRDBfRU5NQVM3KUBsCS8qIEVuYWJsZSBUaW1lYmFzZSAmIE1BUzcgKi8KKyNlbHNlCisJb3JpCXIwLHIwLEhJRDBfVEJFTkBsCS8qIGVuYWJsZSBUaW1lYmFzZSAqLwogI2VuZGlmCiAJbXRzcHIJSElEMCxyMAogCi0jaWYgZGVmaW5lZChDT05GSUdfQUREUl9TVFJFQU1JTkcpCi0JbGkJcjAsMHgzMDAwCi0jZWxzZQotCWxpCXIwLDB4MTAwMAotI2VuZGlmCisJbGkJcjAsKEhJRDFfQVNUTUV8SElEMV9BQkUpQGwJLyogQWRkciBzdHJlYW1pbmcgJiBicm9hZGNhc3QgKi8KIAltdHNwcglISUQxLHIwCiAKIAkvKiBFbmFibGUgQnJhbmNoIFByZWRpY3Rpb24gKi8KQEAgLTM4MywzNyArMjYxLDUzIEBACiAjZW5kaWYKIAogLyogTDEgRENhY2hlIGlzIHVzZWQgZm9yIGluaXRpYWwgUkFNICovCi0JbWZzcHIJcjIsIEwxQ1NSMAotCW9yaQlyMiwgcjIsIDB4MDAwMwotCW9yaXMJcjIsIHIyLCAweDAwMDEKLQltdHNwcglMMUNTUjAsIHIyCS8qIGVuYWJsZS9pbnZhbGlkYXRlIEwxIERjYWNoZSAqLwotCWlzeW5jCiAKIAkvKiBBbGxvY2F0ZSBJbml0aWFsIFJBTSBpbiBkYXRhIGNhY2hlLgogCSAqLwotCWxpcwlyMywgQ0ZHX0lOSVRfUkFNX0FERFJAaAotCW9yaQlyMywgcjMsIENGR19JTklUX1JBTV9BRERSQGwKLQlsaQlyMiwgNTEyIC8qIDUxMiozMj0xNksgKi8KKwlsaXMJcjMsQ0ZHX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMyxyMyxDRkdfSU5JVF9SQU1fQUREUkBsCisJbGkJcjIsNTEyIC8qIDUxMiozMj0xNksgKi8KIAltdGN0cglyMgotCWxpCXIwLCAwCisJbGkJcjAsMAogMToKLQlkY2J6CXIwLCByMwotCWRjYnRscwkwLHIwLCByMwotCWFkZGkJcjMsIHIzLCAzMgorCWRjYnoJcjAscjMKKwlkY2J0bHMJMCxyMCxyMworCWFkZGkJcjMscjMsMzIKIAliZG56CTFiCiAKLSNpZm5kZWYgQ0ZHX1JBTUJPT1QKKwkvKiBKdW1wIG91dCB0aGUgbGFzdCA0SyBwYWdlIGFuZCBjb250aW51ZSB0byAnbm9ybWFsJyBzdGFydCAqLworI2lmZGVmIENGR19SQU1CT09UCisJYmwJM2YKKwliCV9zdGFydF9jb250CisjZWxzZQogCS8qIENhbGN1bGF0ZSBhYnNvbHV0ZSBhZGRyZXNzIGluIEZMQVNIIGFuZCBqdW1wIHRoZXJlCQkqLwogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCWxpcwlyMywgQ0ZHX01PTklUT1JfQkFTRUBoCi0Jb3JpCXIzLCByMywgQ0ZHX01PTklUT1JfQkFTRUBsCi0JYWRkaQlyMywgcjMsIGluX2ZsYXNoIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaXMJcjMsQ0ZHX01PTklUT1JfQkFTRUBoCisJb3JpCXIzLHIzLENGR19NT05JVE9SX0JBU0VAbAorCWFkZGkJcjMscjMsX3N0YXJ0X2NvbnQgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJbXRscglyMwotCWJscgorI2VuZGlmCiAKLWluX2ZsYXNoOgotI2VuZGlmCS8qIENGR19SQU1CT09UICovCiszOglsaQlyMCwwCisJbXRzcHIJU1JSMSxyMAkJLyogS2VlcCB0aGluZ3MgZGlzYWJsZWQgZm9yIG5vdyAqLworCW1mbHIJcjEKKwltdHNwcglTUlIwLHIxCisJcmZpCisJaXN5bmMKIAorCS50ZXh0CisJLmdsb2JsCV9zdGFydAorX3N0YXJ0OgorCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQk9PVCBNYWdpYyBOdW1iZXIgKi8KKwkuZ2xvYmwJdmVyc2lvbl9zdHJpbmcKK3ZlcnNpb25fc3RyaW5nOgorCS5hc2NpaSBVX0JPT1RfVkVSU0lPTgorCS5hc2NpaSAiICgiLCBfX0RBVEVfXywgIiAtICIsIF9fVElNRV9fLCAiKSIKKwkuYXNjaWkgQ09ORklHX0lERU5UX1NUUklORywgIlwwIgorCisJLmFsaWduCTQKKwkuZ2xvYmwJX3N0YXJ0X2NvbnQKK19zdGFydF9jb250OgogCS8qIFNldHVwIHRoZSBzdGFjayBpbiBpbml0aWFsIFJBTSxjb3VsZCBiZSBMMi1hcy1TUkFNIG9yIEwxIGRjYWNoZSovCiAJbGlzCXIxLENGR19JTklUX1JBTV9BRERSQGgKIAlvcmkJcjEscjEsQ0ZHX0lOSVRfU1BfT0ZGU0VUQGwKQEAgLTQyNCwyNiArMzE4LDI0IEBACiAKIAlzdHd1CXIxLC04KHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCiAJbGlzCXIwLFJFU0VUX1ZFQ1RPUkBoCS8qIEFkZHJlc3Mgb2YgcmVzZXQgdmVjdG9yICovCi0Jb3JpCXIwLHIwLCBSRVNFVF9WRUNUT1JAbAorCW9yaQlyMCxyMCxSRVNFVF9WRUNUT1JAbAogCXN0d3UJcjEsLTgocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KIAlzdHcJcjAsKzEyKHIxKQkJLyogU2F2ZSByZXR1cm4gYWRkciAodW5kZXJmbG93IHZlY3QpICovCiAKIAlHRVRfR09UCiAJYmwJY3B1X2luaXRfZgotCWJsCWljYWNoZV9lbmFibGUKIAlibAlib2FyZF9pbml0X2YKIAlpc3luYwogCi0vKiAtLUZJWE1FLS0gbWFjaGluZSBjaGVjayB3aXRoIE1DU1JSbiBhbmQgcmZtY2kgKi8KLQorCS4gPSBFWENfT0ZGX1NZU19SRVNFVAogCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycwogX3N0YXJ0X29mX3ZlY3RvcnM6Ci0jaWYgMAorCiAvKiBDcml0aWNhbCBpbnB1dC4gKi8KLQlDUklUX0VYQ0VQVElPTigweDAxMDAsIENyaXRjYWxJbnB1dCwgQ3JpdGNhbElucHV0RXhjZXB0aW9uKQotI2VuZGlmCi0vKiBNYWNoaW5lIGNoZWNrIC0tRklYTUUtLSBTaG91bGQgYmUgTUFDSF9FWENFUFRJT04gKi8KLQlDUklUX0VYQ0VQVElPTigweDAyMDAsIE1hY2hpbmVDaGVjaywgTWFjaGluZUNoZWNrRXhjZXB0aW9uKQorCUNSSVRfRVhDRVBUSU9OKDB4MDEwMCwgQ3JpdGljYWxJbnB1dCwgQ3JpdGNhbElucHV0RXhjZXB0aW9uKQorCisvKiBNYWNoaW5lIGNoZWNrICovCisJTUNLX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCiAKIC8qIERhdGEgU3RvcmFnZSBleGNlcHRpb24uICovCiAJU1REX0VYQ0VQVElPTigweDAzMDAsIERhdGFTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQpAQCAtNDUyLDcgKzM0NCw3IEBACiAJU1REX0VYQ0VQVElPTigweDA0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQogCiAvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLwotCVNURF9FWENFUFRJT04oMHgwNTAwLCBFeHRJbnRlcnJ1cHQsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDA1MDAsIEV4dEludGVycnVwdCwgRXh0SW50RXhjZXB0aW9uKQogCiAvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLwogCS4gPSAweDA2MDAKQEAgLTQ2OSw4ICszNjEsOCBAQAogCW10bHIJcjYKIAlibHJsCiAuTF9BbGlnbm1lbnQ6Ci0JLmxvbmcJQWxpZ25tZW50RXhjZXB0aW9uIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKLQkubG9uZwlpbnRfcmV0dXJuIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwkubG9uZwlBbGlnbm1lbnRFeGNlcHRpb24gLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAogLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KIAkuID0gMHgwNzAwCkBAIC00ODMsOCArMzc1LDggQEAKIAltdGxyCXI2CiAJYmxybAogLkxfUHJvZ3JhbUNoZWNrOgotCS5sb25nCVByb2dyYW1DaGVja0V4Y2VwdGlvbiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCi0JLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJLmxvbmcJUHJvZ3JhbUNoZWNrRXhjZXB0aW9uIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCS5sb25nCWludF9yZXR1cm4gLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAKIAkvKiBObyBGUFUgb24gTVBDODV4eC4gIFRoaXMgZXhjZXB0aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4uCiAJKi8KQEAgLTQ5NiwyMyArMzg4LDIzIEBACiAgKiByMy0uLi4gYXJndW1lbnRzCiAgKi8KIFN5c3RlbUNhbGw6Ci0JYWRkaXMJcjExLHIwLDAJCS8qIGdldCBmdW5jdGlvbnMgdGFibGUgYWRkciAqLwotCW9yaQlyMTEscjExLDAJCS8qIE5vdGU6IHRoaXMgY29kZSBpcyBwYXRjaGVkIGluIHRyYXBfaW5pdCAqLwotCWFkZGlzCXIxMixyMCwwCQkvKiBnZXQgbnVtYmVyIG9mIGZ1bmN0aW9ucyAqLworCWFkZGlzCXIxMSxyMCwwCS8qIGdldCBmdW5jdGlvbnMgdGFibGUgYWRkciAqLworCW9yaQlyMTEscjExLDAJLyogTm90ZTogdGhpcyBjb2RlIGlzIHBhdGNoZWQgaW4gdHJhcF9pbml0ICovCisJYWRkaXMJcjEyLHIwLDAJLyogZ2V0IG51bWJlciBvZiBmdW5jdGlvbnMgKi8KIAlvcmkJcjEyLHIxMiwwCiAKLQljbXBsdwkwLCByMCwgcjEyCisJY21wbHcJMCxyMCxyMTIKIAliZ2UJMWYKIAotCXJsd2lubQlyMCxyMCwyLDAsMzEJCS8qIGZuX2FkZHIgPSBmbl90YmxbcjBdICovCisJcmx3aW5tCXIwLHIwLDIsMCwzMQkvKiBmbl9hZGRyID0gZm5fdGJsW3IwXSAqLwogCWFkZAlyMTEscjExLHIwCiAJbHd6CXIxMSwwKHIxMSkKIAotCWxpCXIyMCwweGQwMC00CQkvKiBHZXQgc3RhY2sgcG9pbnRlciAqLworCWxpCXIyMCwweGQwMC00CS8qIEdldCBzdGFjayBwb2ludGVyICovCiAJbHd6CXIxMiwwKHIyMCkKLQlzdWJpCXIxMixyMTIsMTIJCS8qIEFkanVzdCBzdGFjayBwb2ludGVyICovCisJc3ViaQlyMTIscjEyLDEyCS8qIEFkanVzdCBzdGFjayBwb2ludGVyICovCiAJbGkJcjAsMHhjMDArX2VuZF9iYWNrLVN5c3RlbUNhbGwKLQljbXBsdwkwLCByMCwgcjEyCQkvKiBDaGVjayBzdGFjayBvdmVyZmxvdyAqLworCWNtcGx3CTAscjAscjEyCS8qIENoZWNrIHN0YWNrIG92ZXJmbG93ICovCiAJYmd0CTFmCiAJc3R3CXIxMiwwKHIyMCkKIApAQCAtNTcwLDcgKzQ2Miw3IEBACiBfZW5kX29mX3ZlY3RvcnM6CiAKIAotCS4gPSAweDIxMDAKKwkuID0gLiArICgweDEwMCAtICggLiAmIDB4ZmYgKSkJLyogYWxpZ24gZm9yIGRlYnVnICovCiAKIC8qCiAgKiBUaGlzIGNvZGUgZmluaXNoZXMgc2F2aW5nIHRoZSByZWdpc3RlcnMgdG8gdGhlIGV4Y2VwdGlvbiBmcmFtZQpAQCAtNjU1LDI2ICs1NDcsNTggQEAKIAlSRVNUX0dQUigzMSwgcjEpCiAJbHd6CXIyLF9OSVAocjEpCS8qIFJlc3RvcmUgZW52aXJvbm1lbnQgKi8KIAlsd3oJcjAsX01TUihyMSkKLQltdHNwcgk5OTAscjIJCS8qIFNSUjIgKi8KLQltdHNwcgk5OTEscjAJCS8qIFNSUjMgKi8KKwltdHNwcglTUFJOX0NTUlIwLHIyCisJbXRzcHIJU1BSTl9DU1JSMSxyMAogCWx3eglyMCxHUFIwKHIxKQogCWx3eglyMixHUFIyKHIxKQogCWx3eglyMSxHUFIxKHIxKQogCVNZTkMKIAlyZmNpCiAKK21ja19yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1BSTl9NQ1NSUjAscjIKKwltdHNwcglTUFJOX01DU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZm1jaQorCiAvKiBDYWNoZSBmdW5jdGlvbnMuCiAqLwogaW52YWxpZGF0ZV9pY2FjaGU6CiAJbWZzcHIJcjAsTDFDU1IxCi0Jb3JpCXIwLHIwLDB4MDAwMgorCW9yaQlyMCxyMCxMMUNTUjFfSUNGSQorCW1zeW5jCisJaXN5bmMKIAltdHNwcglMMUNTUjEscjAKIAlpc3luYwotCWJscgkJCQkvKiAgIGVudGlyZSBJIGNhY2hlICovCisJYmxyCQkJCS8qIGVudGlyZSBJIGNhY2hlICovCiAKIGludmFsaWRhdGVfZGNhY2hlOgogCW1mc3ByCXIwLEwxQ1NSMAotCW9yaQlyMCxyMCwweDAwMDIKKwlvcmkJcjAscjAsTDFDU1IwX0RDRkkKIAltc3luYwogCWlzeW5jCiAJbXRzcHIJTDFDU1IwLHIwCkBAIC02OTcsOSArNjIxLDkgQEAKIAkuZ2xvYmwJaWNhY2hlX2Rpc2FibGUKIGljYWNoZV9kaXNhYmxlOgogCW1mc3ByCXIwLEwxQ1NSMQotCWxpcwlyMSwweGZmZmZmZmZlQGgKLQlvcmkJcjEscjEsMHhmZmZmZmZmZUBsCi0JYW5kCXIwLHIwLHIxCisJbGlzCXIzLDAKKwlvcmkJcjMscjMsTDFDU1IxX0lDRQorCWFuZGMJcjAscjAscjMKIAltdHNwcglMMUNTUjEscjAKIAlpc3luYwogCWJscgpAQCAtNzA3LDcgKzYzMSw3IEBACiAJLmdsb2JsCWljYWNoZV9zdGF0dXMKIGljYWNoZV9zdGF0dXM6CiAJbWZzcHIJcjMsTDFDU1IxCi0JYW5kaS4JcjMscjMsMQorCWFuZGkuCXIzLHIzLEwxQ1NSMV9JQ0UKIAlibHIKIAogCS5nbG9ibAlkY2FjaGVfZW5hYmxlCkBAIC03MjcsMTIgKzY1MSwxMCBAQAogCiAJLmdsb2JsCWRjYWNoZV9kaXNhYmxlCiBkY2FjaGVfZGlzYWJsZToKLQltZnNwcglyMCxMMUNTUjAKLQlsaXMJcjEsMHhmZmZmZmZmZUBoCi0Jb3JpCXIxLHIxLDB4ZmZmZmZmZmVAbAotCWFuZAlyMCxyMCxyMQotCW1zeW5jCi0JaXN5bmMKKwltZnNwcglyMyxMMUNTUjAKKwlsaXMJcjQsMAorCW9yaQlyNCxyNCxMMUNTUjBfRENFCisJYW5kYwlyMyxyMyxyNAogCW10c3ByCUwxQ1NSMCxyMAogCWlzeW5jCiAJYmxyCkBAIC03NDAsMjcgKzY2MiwyNyBAQAogCS5nbG9ibAlkY2FjaGVfc3RhdHVzCiBkY2FjaGVfc3RhdHVzOgogCW1mc3ByCXIzLEwxQ1NSMAotCWFuZGkuCXIzLHIzLDEKKwlhbmRpLglyMyxyMyxMMUNTUjBfRENFCiAJYmxyCiAKIAkuZ2xvYmwgZ2V0X3BpcgogZ2V0X3BpcjoKLQltZnNwcglyMywgUElSCisJbWZzcHIJcjMsUElSCiAJYmxyCiAKIAkuZ2xvYmwgZ2V0X3B2cgogZ2V0X3B2cjoKLQltZnNwcglyMywgUFZSCisJbWZzcHIJcjMsUFZSCiAJYmxyCiAKIAkuZ2xvYmwgZ2V0X3N2cgogZ2V0X3N2cjoKLQltZnNwcglyMywgU1ZSCisJbWZzcHIJcjMsU1ZSCiAJYmxyCiAKIAkuZ2xvYmwgd3JfdGNyCiB3cl90Y3I6Ci0JbXRzcHIJVENSLCByMworCW10c3ByCVRDUixyMwogCWJscgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTkxMywxNiArODM1LDE2IEBACiAgKi8KIAkuZ2xvYmwJcmVsb2NhdGVfY29kZQogcmVsb2NhdGVfY29kZToKLQltcglyMSwgIHIzCQkvKiBTZXQgbmV3IHN0YWNrIHBvaW50ZXIJCSovCi0JbXIJcjksICByNAkJLyogU2F2ZSBjb3B5IG9mIEluaXQgRGF0YSBwb2ludGVyCSovCi0JbXIJcjEwLCByNQkJLyogU2F2ZSBjb3B5IG9mIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKwltcglyMSxyMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyCQkqLworCW1yCXI5LHI0CQkvKiBTYXZlIGNvcHkgb2YgSW5pdCBEYXRhIHBvaW50ZXIJKi8KKwltcglyMTAscjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCiAKLQltcglyMywgIHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KLQlsaXMJcjQsIENGR19NT05JVE9SX0JBU0VAaAkJLyogU291cmNlICAgICAgQWRkcmVzcwkqLwotCW9yaQlyNCwgcjQsIENGR19NT05JVE9SX0JBU0VAbAorCW1yCXIzLHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKwlsaXMJcjQsQ0ZHX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LHI0LENGR19NT05JVE9SX0JBU0VAbAogCWx3eglyNSxHT1QoX19pbml0X2VuZCkKIAlzdWIJcjUscjUscjQKLQlsaQlyNiwgQ0ZHX0NBQ0hFTElORV9TSVpFCQkvKiBDYWNoZSBMaW5lIFNpemUJKi8KKwlsaQlyNixDRkdfQ0FDSEVMSU5FX1NJWkUJCS8qIENhY2hlIExpbmUgU2l6ZQkqLwogCiAJLyoKIAkgKiBGaXggR09UIHBvaW50ZXI6CkBAIC05MzEsMTIgKzg1MywxMiBAQAogCSAqCiAJICogT2Zmc2V0OgogCSAqLwotCXN1YglyMTUsIHIxMCwgcjQKKwlzdWIJcjE1LHIxMCxyNAogCiAJLyogRmlyc3Qgb3VyIG93biBHT1QgKi8KLQlhZGQJcjE0LCByMTQsIHIxNQorCWFkZAlyMTQscjE0LHIxNQogCS8qIHRoZSB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLwotCWFkZAlyMzAsIHIzMCwgcjE1CisJYWRkCXIzMCxyMzAscjE1CiAKIAkvKgogCSAqIE5vdyByZWxvY2F0ZSBjb2RlCkBAIC05OTcsMTAgKzkxOSwxMCBAQAogICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgogICovCiAKLQlhZGRpCXIwLCByMTAsIGluX3JhbSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYWRkaQlyMCxyMTAsaW5fcmFtIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCW10bHIJcjAKIAlibHIJCQkJLyogTkVWRVIgUkVUVVJOUyEgKi8KLQorCS5nbG9ibAlpbl9yYW0KIGluX3JhbToKIAogCS8qCkBAIC0xMDQ0LDE5ICs5NjYsMTkgQEAKIAlsd3oJcjMsR09UKF9fYnNzX3N0YXJ0KQogCWx3eglyNCxHT1QoX2VuZCkKIAotCWNtcGx3CTAsIHIzLCByNAorCWNtcGx3CTAscjMscjQKIAliZXEJNmYKIAotCWxpCXIwLCAwCisJbGkJcjAsMAogNToKLQlzdHcJcjAsIDAocjMpCi0JYWRkaQlyMywgcjMsIDQKLQljbXBsdwkwLCByMywgcjQKKwlzdHcJcjAsMChyMykKKwlhZGRpCXIzLHIzLDQKKwljbXBsdwkwLHIzLHI0CiAJYm5lCTViCiA2OgogCi0JbXIJcjMsIHI5CQkvKiBJbml0IERhdGEgcG9pbnRlcgkJKi8KLQltcglyNCwgcjEwCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCQkqLworCW1yCXIzLHI5CQkvKiBJbml0IERhdGEgcG9pbnRlcgkJKi8KKwltcglyNCxyMTAJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJCSovCiAJYmwJYm9hcmRfaW5pdF9yCiAKIAkvKgpAQCAtMTA2Nyw1MiArOTg5LDU0IEBACiAJICovCiAJLmdsb2JsCXRyYXBfaW5pdAogdHJhcF9pbml0OgotCWx3eglyNywgR09UKF9zdGFydCkKLQlsd3oJcjgsIEdPVChfZW5kX29mX3ZlY3RvcnMpCisJbHd6CXI3LEdPVChfc3RhcnRfb2ZfdmVjdG9ycykKKwlsd3oJcjgsR09UKF9lbmRfb2ZfdmVjdG9ycykKIAotCWxpCXI5LCAweDEwMAkJLyogcmVzZXQgdmVjdG9yIGFsd2F5cyBhdCAweDEwMCAqLworCWxpCXI5LDB4MTAwCQkvKiByZXNldCB2ZWN0b3IgYWx3YXlzIGF0IDB4MTAwICovCiAKLQljbXBsdwkwLCByNywgcjgKKwljbXBsdwkwLHI3LHI4CiAJYmdlbHIJCQkJLyogcmV0dXJuIGlmIHI3Pj1yOCAtIGp1c3QgaW4gY2FzZSAqLwogCiAJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlcgkJKi8KIDE6Ci0JbHd6CXIwLCAwKHI3KQotCXN0dwlyMCwgMChyOSkKLQlhZGRpCXI3LCByNywgNAotCWFkZGkJcjksIHI5LCA0Ci0JY21wbHcJMCwgcjcsIHI4CisJbHd6CXIwLDAocjcpCisJc3R3CXIwLDAocjkpCisJYWRkaQlyNyxyNyw0CisJYWRkaQlyOSxyOSw0CisJY21wbHcJMCxyNyxyOAogCWJuZQkxYgogCiAJLyoKIAkgKiByZWxvY2F0ZSBgaGRscicgYW5kIGBpbnRfcmV0dXJuJyBlbnRyaWVzCiAJICovCi0JbGkJcjcsIC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjcsLkxfQ3JpdGljYWxJbnB1dCAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAlibAl0cmFwX3JlbG9jCi0JbGkJcjcsIC5MX0RhdGFTdG9yYWdlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyNywuTF9NYWNoaW5lQ2hlY2sgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJYmwJdHJhcF9yZWxvYwotCWxpCXI3LCAuTF9JbnN0U3RvcmFnZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjcsLkxfRGF0YVN0b3JhZ2UgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJYmwJdHJhcF9yZWxvYwotCWxpCXI3LCAuTF9FeHRJbnRlcnJ1cHQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI3LC5MX0luc3RTdG9yYWdlIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCWJsCXRyYXBfcmVsb2MKLQlsaQlyNywgLkxfQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyNywuTF9FeHRJbnRlcnJ1cHQgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJYmwJdHJhcF9yZWxvYwotCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI3LC5MX0FsaWdubWVudCAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAlibAl0cmFwX3JlbG9jCi0JbGkJcjcsIC5MX0ZQVW5hdmFpbGFibGUgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI3LC5MX1Byb2dyYW1DaGVjayAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAlibAl0cmFwX3JlbG9jCi0JbGkJcjcsIC5MX0RlY3JlbWVudGVyIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyNywuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCWJsCXRyYXBfcmVsb2MKLQlsaQlyNywgLkxfSW50ZXJ2YWxUaW1lciAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCi0JbGkJcjgsIF9lbmRfb2ZfdmVjdG9ycyAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjcsLkxfRGVjcmVtZW50ZXIgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJYmwJdHJhcF9yZWxvYworCWxpCXI3LC5MX0ludGVydmFsVGltZXIgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJbGkJcjgsX2VuZF9vZl92ZWN0b3JzIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogMjoKIAlibAl0cmFwX3JlbG9jCi0JYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KLQljbXBsdwkwLCByNywgcjgKKwlhZGRpCXI3LHI3LDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLHI3LHI4CiAJYmx0CTJiCiAKIAlsaXMJcjcsMHgwCi0JbXRzcHIJSVZQUiwgcjcKKwltdHNwcglJVlBSLHI3CiAKIAltdGxyCXI0CQkJLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyCSovCiAJYmxyCkBAIC0xMTIxLDEzICsxMDQ1LDEzIEBACiAJICogRnVuY3Rpb246IHJlbG9jYXRlIGVudHJpZXMgZm9yIG9uZSBleGNlcHRpb24gdmVjdG9yCiAJICovCiB0cmFwX3JlbG9jOgotCWx3eglyMCwgMChyNykJCS8qIGhkbHIgLi4uCQkJKi8KLQlhZGQJcjAsIHIwLCByMwkJLyogIC4uLiArPSBkZXN0X2FkZHIJCSovCi0Jc3R3CXIwLCAwKHI3KQorCWx3eglyMCwwKHI3KQkJLyogaGRsciAuLi4JCQkqLworCWFkZAlyMCxyMCxyMwkJLyogIC4uLiArPSBkZXN0X2FkZHIJCSovCisJc3R3CXIwLDAocjcpCiAKLQlsd3oJcjAsIDQocjcpCQkvKiBpbnRfcmV0dXJuIC4uLgkJKi8KLQlhZGQJcjAsIHIwLCByMwkJLyogIC4uLiArPSBkZXN0X2FkZHIJCSovCi0Jc3R3CXIwLCA0KHI3KQorCWx3eglyMCw0KHI3KQkJLyogaW50X3JldHVybiAuLi4JCSovCisJYWRkCXIwLHIwLHIzCQkvKiAgLi4uICs9IGRlc3RfYWRkcgkJKi8KKwlzdHcJcjAsNChyNykKIAogCWJscgogCkBAIC0xMTM1LDEzICsxMDU5LDEzIEBACiAuZ2xvYmwgdW5sb2NrX3JhbV9pbl9jYWNoZQogdW5sb2NrX3JhbV9pbl9jYWNoZToKIAkvKiBpbnZhbGlkYXRlIHRoZSBJTklUX1JBTSBzZWN0aW9uICovCi0JbGlzCXIzLCAoQ0ZHX0lOSVRfUkFNX0FERFIgJiB+MzEpQGgKLQlvcmkJcjMsIHIzLCAoQ0ZHX0lOSVRfUkFNX0FERFIgJiB+MzEpQGwKLQlsaQlyMiw1MTIKLQltdGN0cglyMgotMToJaWNiaQlyMCwgcjMKLQlkY2JpCXIwLCByMwotCWFkZGkJcjMsIHIzLCAzMgorCWxpcwlyMywoQ0ZHX0lOSVRfUkFNX0FERFIgJiB+MzEpQGgKKwlvcmkJcjMscjMsKENGR19JTklUX1JBTV9BRERSICYgfjMxKUBsCisJbGkJcjQsNTEyCisJbXRjdHIJcjQKKzE6CWljYmkJcjAscjMKKwlkY2JpCXIwLHIzCisJYWRkaQlyMyxyMywzMgogCWJkbnoJMWIKIAlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGljYmkgdG8gY29tcGxldGUgb24gYnVzICovCiAJaXN5bmMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L3RyYXBzLmMgYi9jcHUvbXBjODV4eC90cmFwcy5jCmluZGV4IDkwNGYwNTIuLmVmYzgwYzcgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4NXh4L3RyYXBzLmMKKysrIGIvY3B1L21wYzg1eHgvdHJhcHMuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBsaW51eC9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwogICoKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICogQ29weXJpZ2h0IChDKSAyMDAzIE1vdG9yb2xhCiAgKiBNb2RpZmllZCBieSBYaWFuZ2h1YSBYaWFvKHgueGlhb0Btb3Rvcm9sYS5jb20pCiAgKgpAQCAtNDEsNyArNDIsNyBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKQEAgLTc0LDcgKzc1LDcgQEAKICNkZWZpbmUgRVNSX0RJWiAweDAwNDAwMDAwCiAjZGVmaW5lIEVTUl9VMEYgMHgwMDAwODAwMAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiBleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbmRpZgogCkBAIC0xNDUsMTAgKzE0NiwxMyBAQAogCXBhbmljKCJDcml0aWNhbCBJbnB1dCBFeGNlcHRpb24iKTsKIH0KIAoraW50IG1hY2hpbmVjaGVja19jb3VudCA9IDA7CitpbnQgbWFjaGluZWNoZWNrX2Vycm9yID0gMDsKIHZvaWQKIE1hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGZpeHVwOworCXVuc2lnbmVkIGludCBtY3NyLCBtY3NycjAsIG1jc3JyMSwgbWNhcjsKIAogCS8qIFByb2JpbmcgUENJIHVzaW5nIGNvbmZpZyBjeWNsZXMgY2F1c2UgdGhpcyBleGNlcHRpb24KIAkgKiB3aGVuIGEgZGV2aWNlIGlzIG5vdCBwcmVzZW50LiAgQ2F0Y2ggaXQgYW5kIHJldHVybiB0bwpAQCAtMTU5LDQwICsxNjMsNjggQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisJbWNzcnIwID0gbWZzcHIoU1BSTl9NQ1NSUjApOworCW1jc3JyMSA9IG1mc3ByKFNQUk5fTUNTUlIxKTsKKwltY3NyID0gbWZzcHIoU1BSTl9NQ1NSKTsKKwltY2FyID0gbWZzcHIoU1BSTl9NQ0FSKTsKKworCW1hY2hpbmVjaGVja19jb3VudCsrOworCW1hY2hpbmVjaGVja19lcnJvcj0xOworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKIAogCXByaW50ZigiTWFjaGluZSBjaGVjayBpbiBrZXJuZWwgbW9kZS5cbiIpOwotCXByaW50ZigiQ2F1c2VkIGJ5IChmcm9tIG1zcik6ICIpOwotCXByaW50ZigicmVncyAlcCAiLHJlZ3MpOwotCXN3aXRjaCggcmVncy0+bXNyICYgMHgwMDBGMDAwMCkgewotCWNhc2UgKDB4ODAwMDAwMDA+PjEyKToKLQkJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIHNpZ25hbCAtIHByb2JhYmx5IGR1ZSB0byBtbSBmYXVsdFxuIgotCQkgICAgICAgIndpdGggbW11IG9mZlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgKDB4ODAwMDAwMDA+PjEzKToKLQkJcHJpbnRmKCJUcmFuc2ZlciBlcnJvciBhY2sgc2lnbmFsXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAoMHg4MDAwMDAwMD4+MTQpOgotCQlwcmludGYoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgKDB4ODAwMDAwMDA+PjE1KToKLQkJcHJpbnRmKCJBZGRyZXNzIHBhcml0eSBzaWduYWxcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIlVua25vd24gdmFsdWVzIGluIG1zclxuIik7Ci0JfQorCXByaW50ZigiQ2F1c2VkIGJ5IChmcm9tIG1jc3IpOiAiKTsKKwlwcmludGYoIm1jc3IgPSAweCUwOHhcbiIsIG1jc3IpOworCWlmIChtY3NyICYgMHg4MDAwMDAwMCkKKwkJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIGlucHV0IHBpblxuIik7CisJaWYgKG1jc3IgJiAweDQwMDAwMDAwKQorCQlwcmludGYoIkluc3RydWN0aW9uIGNhY2hlIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDIwMDAwMDAwKQorCQlwcmludGYoIkRhdGEgY2FjaGUgcHVzaCBwYXJpdHkgZXJyb3JcbiIpOworCWlmIChtY3NyICYgMHgxMDAwMDAwMCkKKwkJcHJpbnRmKCJEYXRhIGNhY2hlIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDgwKQorCQlwcmludGYoIkJ1cyBpbnN0cnVjdGlvbiBhZGRyZXNzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwNDApCisJCXByaW50ZigiQnVzIFJlYWQgYWRkcmVzcyBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDIwKQorCQlwcmludGYoIkJ1cyBXcml0ZSBhZGRyZXNzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMTApCisJCXByaW50ZigiQnVzIEluc3RydWN0aW9uIGRhdGEgYnVzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMDgpCisJCXByaW50ZigiQnVzIFJlYWQgZGF0YSBidXMgZXJyb3JcbiIpOworCWlmIChtY3NyICYgMHgwMDAwMDAwNCkKKwkJcHJpbnRmKCJCdXMgV3JpdGUgYnVzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMDIpCisJCXByaW50ZigiQnVzIEluc3RydWN0aW9uIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDAxKQorCQlwcmludGYoIkJ1cyBSZWFkIHBhcml0eSBlcnJvclxuIik7CisKIAlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRmKCJNQ1NSPTB4JTA4eCBcdE1DU1JSMD0weCUwOHggXG5NQ1NSUjE9MHglMDh4IFx0TUNBUj0weCUwOHhcbiIsCisJICAgICAgIG1jc3IsIG1jc3JyMCwgbWNzcnIxLCBtY2FyKTsKIAlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOwotCXBhbmljKCJtYWNoaW5lIGNoZWNrIik7CisJaWYgKG1hY2hpbmVjaGVja19jb3VudCA+IDEwKSB7CisJCXBhbmljKCJtYWNoaW5lIGNoZWNrIGNvdW50IHRvbyBoaWdoXG4iKTsKKwl9CisKKwlpZiAobWFjaGluZWNoZWNrX2NvdW50ID4gMSkgeworCQlyZWdzLT5uaXAgKz0gNDsgLyogc2tpcCBvZmZlbmRpbmcgaW5zdHJ1Y3Rpb24gKi8KKwkJcHJpbnRmKCJTa2lwcGluZyBjdXJyZW50IGluc3RyLCBSZXR1cm5pbmcgdG8gMHglMDh4XG4iLAorCQkgICAgICAgcmVncy0+bmlwKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlJldHVybmluZyBiYWNrIHRvIDB4JTA4eFxuIixyZWdzLT5uaXApOworCX0KIH0KIAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIwNyw3ICsyMzksNyBAQAogewogCWxvbmcgZXNyX3ZhbDsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTI0NCw3ICsyNzYsNyBAQAogdm9pZAogVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yNTMsMTMgKzI4NSw0MCBAQAogCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CiAJX2V4Y2VwdGlvbigwLCByZWdzKTsKIH0KK3ZvaWQKK0V4dEludEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgY2Nzcl9waWNfdCAqcGljID0gJmltbWFwLT5pbV9waWM7CisJdWludCB2ZWN0OworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZigiRXh0ZXJuYWwgSW50ZXJydXB0IEV4Y2VwdGlvbiBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4IiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOworCXZlY3QgPSBwaWMtPmlhY2swOworCXByaW50ZigiIGlycSBJQUNLMEAlMDV4PSVkXG4iLCZwaWMtPmlhY2swLHZlY3QpOworCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCW1hY2hpbmVjaGVja19jb3VudCsrOworI2lmZGVmIEVYVElOVF9OT1NLSVAKKwlwcmludGYoIlJldHVybmluZyBiYWNrIHRvIDB4JTA4eFxuIixyZWdzLT5uaXApOworI2Vsc2UKKwlyZWdzLT5uaXAgKz0gNDsgLyogc2tpcCBvZmZlbmRpbmcgaW5zdHJ1Y3Rpb24gKi8KKwlwcmludGYoIlNraXBwaW5nIGN1cnJlbnQgaW5zdHIsIFJldHVybmluZyB0byAweCUwOHhcbiIscmVncy0+bmlwKTsKKyNlbmRpZgorCit9CiAKIHZvaWQKIERlYnVnRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXByaW50ZigiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CiAJc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L01ha2VmaWxlIGIvY3B1L21wYzg2eHgvTWFrZWZpbGUKaW5kZXggZmZmY2ZkMi4uNmQ5MzAwZSAxMDA2NDQKLS0tIGEvY3B1L21wYzg2eHgvTWFrZWZpbGUKKysrIGIvY3B1L21wYzg2eHgvTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiAjCisjIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAjIChDKSBDb3B5cmlnaHQgMjAwMiwyMDAzIE1vdG9yb2xhIEluYy4KICMgWGlhbmdodWEgWGlhbyxYLlhpYW9AbW90b3JvbGEuY29tCiAjCkBAIC0zMCw3ICszMSw3IEBACiBTVEFSVAk9IHN0YXJ0Lm8gI3Jlc2V0dmVjLm8KIFNPQkpTCT0gY2FjaGUubwogQ09CSlMJPSB0cmFwcy5vIGNwdS5vIGNwdV9pbml0Lm8gc3BlZWQubyBpbnRlcnJ1cHRzLm8gXAotCSAgcGNpLm8gcGNpZV9pbmRpcmVjdC5vIHNwZF9zZHJhbS5vCisJICBzcGRfc2RyYW0ubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L2NwdV9pbml0LmMgYi9jcHUvbXBjODZ4eC9jcHVfaW5pdC5jCmluZGV4IDQ2NzNkMDUuLmM4ZTQ2NjYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4Nnh4L2NwdV9pbml0LmMKKysrIGIvY3B1L21wYzg2eHgvY3B1X2luaXQuYwpAQCAtMTA0LDggKzEwNCw4IEBACiAJLyogZW5hYmxlIHRoZSB0aW1lYmFzZSBiaXQgaW4gSElEMCAqLwogCXNldF9oaWQwKGdldF9oaWQwKCkgfCAweDQwMDAwMDApOwogCi0JLyogZW5hYmxlIFNZTkNCRSB8IEFCRSBiaXRzIGluICBISUQxICovCi0Jc2V0X2hpZDEoZ2V0X2hpZDEoKSB8IDB4MDAwMDBDMDApOworCS8qIGVuYWJsZSBFTUNQLCBTWU5DQkUgfCBBQkUgYml0cyBpbiBISUQxICovCisJc2V0X2hpZDEoZ2V0X2hpZDEoKSB8IDB4ODAwMDBDMDApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvaW50ZXJydXB0cy5jIGIvY3B1L21wYzg2eHgvaW50ZXJydXB0cy5jCmluZGV4IDQ5ODIwYmIuLmQ5ZjYzNGYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4Nnh4L2ludGVycnVwdHMuYworKysgYi9jcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLmMKQEAgLTgsNyArOCw3IEBACiAgKiAoQykgQ29weXJpZ2h0IDIwMDMgTW90b3JvbGEgSW5jLiAoTVBDODV4eCBwb3J0KQogICogWGlhbmdodWEgWGlhbyAoWC5YaWFvQG1vdG9yb2xhLmNvbSkKICAqCi0gKiAoQykgQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuIChNUEM4Nnh4IFBvcnQpCisgKiAoQykgQ29weXJpZ2h0IDIwMDQsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuIChNUEM4Nnh4IFBvcnQpCiAgKiBKZWZmIEJyb3duCiAgKiBTcmlrYW50aCBTcmluaXZhc2FuIChzcmlrYW50aC5zcmluaXZhc2FuQGZyZWVzY2FsZS5jb20pCiAgKgpAQCAtNzEsNyArNzEsNyBAQAogfQogCiAvKiBpbnRlcnJ1cHQgaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8KLWludCBpbnRlcnJ1cHRfaW5pdF9jcHUodW5zaWduZWQgKmRlY3JlbWVudGVyX2NvdW50KQoraW50IGludGVycnVwdF9pbml0X2NwdSh1bnNpZ25lZCBsb25nICpkZWNyZW1lbnRlcl9jb3VudCkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTgwLDI1ICs4MCwxMCBAQAogewogCWludCByZXQ7CiAKLQkvKgotCSAqIFRoZSBJUlEwIG9uIFJldiAyIGlzIHB1bGxlZCBoaWdoIChsb3cgaW4gUmV2IDEueCkgdG8KLQkgKiBpbXBsZW1lbnQgUEVYMTAgZXJyYXRhLiAgQXMgSU5UIGlzIGFjdGl2ZSBoaWdoLCBpdAotCSAqIHdpbGwgY2F1c2UgY29yZSB0byB0YWtlIDB4NTAwIGludGVycnVwdC4KLQkgKgotCSAqIER1ZSB0byB0aGUgUElDJ3MgZGVmYXVsdCBwYXNzIHRocm91Z2ggbW9kZSwgYXMgc29vbgotCSAqIGFzIGludGVycnVwdHMgYXJlIGVuYWJsZWQgKE1TUltFRV0gPSAxKSwgYW4gaW50ZXJydXB0Ci0JICogd2lsbCBiZSB0YWtlbiBhbmQgdS1ib290IHdpbGwgaGFuZy4gIFRoaXMgaXMgZHVlIHRvIGEKLQkgKiBoYXJkd2FyZSBjaGFuZ2UgKHBlciBhbiBlcnJhdGEgZml4KSBvbiBuZXcgcmV2aXNpb25zCi0JICogb2YgdGhlIGJvYXJkIHdpdGggUmV2IDIueCBwYXJ0cy4KLQkgKgotCSAqIFNldHRpbmcgdGhlIFBJQyB0byBtaXhlZCBtb2RlIHByZXZlbnRzIHRoZSBoYW5nLgotCSAqLwotCWlmICgoZ2V0X3N2cigpICYgMHhmMCkgPT0gMHgyMCkgewotCQl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKLQkJaW1tci0+aW1fcGljLmdjciA9IE1QQzg2eHhfUElDR0NSX1JTVDsKLQkJd2hpbGUgKGltbXItPmltX3BpYy5nY3IgJiBNUEM4Nnh4X1BJQ0dDUl9SU1QpOwotCQlpbW1yLT5pbV9waWMuZ2NyID0gTVBDODZ4eF9QSUNHQ1JfTU9ERTsKLQl9CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJaW1tci0+aW1fcGljLmdjciA9IE1QQzg2eHhfUElDR0NSX1JTVDsKKwl3aGlsZSAoaW1tci0+aW1fcGljLmdjciAmIE1QQzg2eHhfUElDR0NSX1JTVCk7CisJaW1tci0+aW1fcGljLmdjciA9IE1QQzg2eHhfUElDR0NSX01PREU7CiAKIAkvKiBjYWxsIGNwdSBzcGVjaWZpYyBmdW5jdGlvbiBmcm9tICQoQ1BVKS9pbnRlcnJ1cHRzLmMgKi8KIAlyZXQgPSBpbnRlcnJ1cHRfaW5pdF9jcHUoJmRlY3JlbWVudGVyX2NvdW50KTsKQEAgLTEwNyw3ICs5Miw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlkZWNyZW1lbnRlcl9jb3VudCA9IGdldF90YmNsaygpIC8gQ0ZHX0haOwotCWRlYnVnKCJpbnRlcnJ1cHQgaW5pdDogdGJjbGsoKSA9ICVkIE1IeiwgZGVjcmVtZW50ZXJfY291bnQgPSAlZFxuIiwKKwlkZWJ1ZygiaW50ZXJydXB0IGluaXQ6IHRiY2xrKCkgPSAlZCBNSHosIGRlY3JlbWVudGVyX2NvdW50ID0gJWxkXG4iLAogCSAgICAgIChnZXRfdGJjbGsoKSAvIDEwMDAwMDApLAogCSAgICAgIGRlY3JlbWVudGVyX2NvdW50KTsKIApAQCAtMTE5LDYgKzEwNCwzMCBAQAogCSAgICAgIGdldF9tc3IoKSwKIAkgICAgICBnZXRfZGVjKCkpOwogCisjaWZkZWYgQ09ORklHX0lOVEVSUlVQVFMKKwl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPSAmaW1tci0+aW1fcGljOworCisJcGljLT5paXZwcjEgPSAweDgxMDAwMTsJLyogNTAyMjAgZW5hYmxlIG1jbSBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMUAleCA9ICV4XG4iLCAmcGljLT5paXZwcjEsIHBpYy0+aWl2cHIxKTsKKworCXBpYy0+aWl2cHIyID0gMHg4MTAwMDI7CS8qIDUwMjQwIGVuYWJsZSBkZHIgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjJAJXggPSAleFxuIiwgJnBpYy0+aWl2cHIyLCBwaWMtPmlpdnByMik7CisKKwlwaWMtPmlpdnByMyA9IDB4ODEwMDAzOwkvKiA1MDI2MCBlbmFibGUgbGJjIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHIzQCV4ID0gJXhcbiIsICZwaWMtPmlpdnByMywgcGljLT5paXZwcjMpOworCisjaWYgZGVmaW5lZChDT05GSUdfUENJMSkgfHwgZGVmaW5lZChDT05GSUdfUENJRTEpCisJcGljLT5paXZwcjggPSAweDgxMDAwODsJLyogZW5hYmxlIHBjaWUxIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHI4QCV4ID0gJXhcbiIsICZwaWMtPmlpdnByOCwgcGljLT5paXZwcjgpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUENJMikgfHwgZGVmaW5lZChDT05GSUdfUENJRTIpCisJcGljLT5paXZwcjkgPSAweDgxMDAwOTsJLyogZW5hYmxlIHBjaWUyIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHI5QCV4ID0gJXhcbiIsICZwaWMtPmlpdnByOSwgcGljLT5paXZwcjkpOworI2VuZGlmCisKKwlwaWMtPmN0cHIgPSAwOwkvKiA0MDA4MCBjbGVhciBjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgKi8KKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OCw4ICsxNjcsNiBAQAogCiAJdGltZXN0YW1wKys7CiAKLQlwcGNEY2JmKCZ0aW1lc3RhbXApOwotCiAJLyogUmVzdG9yZSBEZWNyZW1lbnRlciBDb3VudCAqLwogCXNldF9kZWMoZGVjcmVtZW50ZXJfY291bnQpOwogCmRpZmYgLS1naXQgYS9jcHUvbXBjODZ4eC9wY2kuYyBiL2NwdS9tcGM4Nnh4L3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODY1NDhkLi4wMDAwMDAwCi0tLSBhL2NwdS9tcGM4Nnh4L3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLEluYy4KLSAqIDIwMDUsIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogRWQgU3dhcnRob3V0IChlZC5zd2FydGhvdXRAZnJlZXNjYWxlLmNvbSkKLSAqIEphc29uIEppbiAoSmFzb24uamluQGZyZWVzY2FsZS5jb20pCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotLyoKLSAqIFBDSUUgQ29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3Mgc3VwcG9ydCBmb3IgUENJRSBCcmlkZ2UKLSAqLwotI2luY2x1ZGUgPGNvbW1vbi5oPgotI2luY2x1ZGUgPHBjaS5oPgotCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotdm9pZAotcGNpX21wYzg2eHhfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCi17Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfQ0NTUkJBUjsKLQl2b2xhdGlsZSBjY3NyX3BleF90ICpwY2llMSA9ICZpbW1hcC0+aW1fcGV4MTsKLQl1MTYgdGVtcDE2OwotCXUzMiB0ZW1wMzI7Ci0KLQl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKLQl1aW50IGhvc3QxX2FnZW50ID0gKGd1ci0+cG9yYm1zciAmIE1QQzg2eHhfUE9SQk1TUl9IQSkgPj4gMTc7Ci0JdWludCBwY2llMV9ob3N0ID0gKGhvc3QxX2FnZW50ID09IDIpIHx8IChob3N0MV9hZ2VudCA9PSAzKTsKLQl1aW50IHBjaWUxX2FnZW50ID0gKGhvc3QxX2FnZW50ID09IDApIHx8IChob3N0MV9hZ2VudCA9PSAxKTsKLQl1aW50IGRldmRpc3IgPSBndXItPmRldmRpc3I7Ci0JdWludCBpb19zZWwgPSAoZ3VyLT5wb3JkZXZzciAmIE1QQzg2eHhfUE9SREVWU1JfSU9fU0VMKSA+PiAxNjsKLQotCWlmICgoaW9fc2VsID09IDIgfHwgaW9fc2VsID09IDMgfHwgaW9fc2VsID09IDUgfHwgaW9fc2VsID09IDYgfHwKLQkgICAgIGlvX3NlbCA9PSA3IHx8IGlvX3NlbCA9PSAweGYpCi0JICAgICYmICEoZGV2ZGlzciAmIE1QQzg2eHhfREVWRElTUl9QQ0lFWDEpKSB7Ci0JCXByaW50ZigiUENJLUVYUFJFU1MgMTogQ29uZmlndXJlZCBhcyAlcyBcbiIsCi0JCSAgICAgICBwY2llMV9hZ2VudCA/ICJBZ2VudCIgOiAiSG9zdCIpOwotCQlpZiAocGNpZTFfYWdlbnQpCi0JCQlyZXR1cm47CS8qRG9uJ3Qgc2NhbiBidXMgd2hlbiBjb25maWd1cmVkIGFzIGFnZW50ICovCi0JCXByaW50ZigiICAgICAgICAgICAgICAgU2Nhbm5pbmcgUENJRSBidXMiKTsKLQkJZGVidWcoIjB4JTA4eD0weCUwOHggIiwKLQkJICAgICAgJnBjaWUxLT5wbWVfbXNnX2RldCwKLQkJICAgICAgcGNpZTEtPnBtZV9tc2dfZGV0KTsKLQkJaWYgKHBjaWUxLT5wbWVfbXNnX2RldCkgewotCQkJcGNpZTEtPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKLQkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAotCQkJICAgICAgcGNpZTEtPnBtZV9tc2dfZGV0KTsKLQkJfQotCQlkZWJ1ZygiXG4iKTsKLQl9IGVsc2UgewotCQlwcmludGYoIlBDSS1FWFBSRVNTIDEgZGlzYWJsZWQhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogU2V0IGZpcnN0X2J1cz0wIG9ubHkgc2tpcHBlZCBCMDpEMDpGMCB3aGljaCBpcwotCSAqIGEgcmVzZXJ2ZWQgZGV2aWNlIGluIE0xNTc1LCBidXQgbWFrZSBpdCBlYXN5IGZvcgotCSAqIG1vc3Qgb2YgdGhlIHNjYW4gcHJvY2Vzcy4KLQkgKi8KLQlob3NlLT5maXJzdF9idXNubyA9IDB4MDA7Ci0JaG9zZS0+bGFzdF9idXNubyA9IDB4ZmU7Ci0KLQlwY2llX3NldHVwX2luZGlyZWN0KGhvc2UsIChDRkdfSU1NUiArIDB4ODAwMCksIChDRkdfSU1NUiArIDB4ODAwNCkpOwotCi0JcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLAotCQkJCSAgUENJX0JERigwLCAwLCAwKSwgUENJX0NPTU1BTkQsICZ0ZW1wMTYpOwotCXRlbXAxNiB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwKLQkgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfSU87Ci0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwKLQkJCQkgICBQQ0lfQkRGKDAsIDAsIDApLCBQQ0lfQ09NTUFORCwgdGVtcDE2KTsKLQotCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIFBDSV9CREYoMCwgMCwgMCksIFBDSV9TVEFUVVMsIDB4ZmZmZik7Ci0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwKLQkJCQkgICBQQ0lfQkRGKDAsIDAsIDApLCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7Ci0KLQlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBQQ0lfQkRGKDAsIDAsIDApLCBQQ0lfUFJJTUFSWV9CVVMsCi0JCQkJICAgJnRlbXAzMik7Ci0JdGVtcDMyID0gKHRlbXAzMiAmIDB4ZmYwMDAwMDApIHwgKDB4ZmYpIHwgKDB4MCA8PCA4KSB8ICgweGZlIDw8IDE2KTsKLQlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgUENJX0JERigwLCAwLCAwKSwgUENJX1BSSU1BUllfQlVTLAotCQkJCSAgICB0ZW1wMzIpOwotCi0JcGNpZTEtPnBvd2FyMSA9IDA7Ci0JcGNpZTEtPnBvd2FyMiA9IDA7Ci0JcGNpZTEtPnBpd2FyMSA9IDA7Ci0JcGNpZTEtPnBpd2FyMSA9IDA7Ci0KLQlwY2llMS0+cG93YmFyMSA9IChDRkdfUENJMV9NRU1fQkFTRSA+PiAxMikgJiAweDAwMGZmZmZmOwotCXBjaWUxLT5wb3dhcjEgPSAweDgwMDQ0MDFjOwkvKiA1MTJNIE1FTSBzcGFjZSAqLwotCXBjaWUxLT5wb3RhcjEgPSAoQ0ZHX1BDSTFfTUVNX0JBU0UgPj4gMTIpICYgMHgwMDBmZmZmZjsKLQlwY2llMS0+cG90ZWFyMSA9IDB4MDAwMDAwMDA7Ci0KLQlwY2llMS0+cG93YmFyMiA9IChDRkdfUENJMV9JT19CQVNFID4+IDEyKSAmIDB4MDAwZmZmZmY7Ci0JcGNpZTEtPnBvd2FyMiA9IDB4ODAwODgwMTc7CS8qIDE2TSBJTyBzcGFjZSAqLwotCXBjaWUxLT5wb3RhcjIgPSAweDAwMDAwMDAwOwotCXBjaWUxLT5wb3RlYXIyID0gMHgwMDAwMDAwMDsKLQotCXBjaWUxLT5waXRhcjEgPSAweDAwMDAwMDAwOwotCXBjaWUxLT5waXdiYXIxID0gMHgwMDAwMDAwMDsKLQkvKiBFbmFibGUsIFByZWZldGNoLCBMb2NhbCBNZW0sICogU25vb3AgUi9XLCAyRyAqLwotCXBjaWUxLT5waXdhcjEgPSAweGEwZjU1MDFlOwotCi0JcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCi0JCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCi0JCSAgICAgICBDRkdfUENJX01FTU9SWV9QSFlTLAotCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKLQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOwotCi0JcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCi0JCSAgICAgICBDRkdfUENJMV9NRU1fQkFTRSwKLQkJICAgICAgIENGR19QQ0kxX01FTV9QSFlTLAotCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1NJWkUsCi0JCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7Ci0KLQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwKLQkJICAgICAgIENGR19QQ0kxX0lPX0JBU0UsCi0JCSAgICAgICBDRkdfUENJMV9JT19QSFlTLAotCQkgICAgICAgQ0ZHX1BDSTFfSU9fU0laRSwKLQkJICAgICAgIFBDSV9SRUdJT05fSU8pOwotCi0JaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKLQotCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOwotCi0JaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7Ci0JZGVidWcoInBjaWVfbXBjODZ4eF9pbml0OiBsYXN0X2J1c25vICV4XG4iLCBob3NlLT5sYXN0X2J1c25vKTsKLQlkZWJ1ZygicGNpZV9tcGM4Nnh4IGluaXQ6IGN1cnJlbnRfYnVzbm8gJXhcbiAiLCBob3NlLT5jdXJyZW50X2J1c25vKTsKLQotCXByaW50ZigiLi4uLlBDSUUxIHNjYW4gJiBlbnVtZXJhdGlvbiBkb25lXG4iKTsKLX0KLSNlbmRpZgkJCQkvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9jcHUvbXBjODZ4eC9wY2llX2luZGlyZWN0LmMgYi9jcHUvbXBjODZ4eC9wY2llX2luZGlyZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGFkNzYuLjAwMDAwMDAKLS0tIGEvY3B1L21wYzg2eHgvcGNpZV9pbmRpcmVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciBpbmRpcmVjdCBQQ0kgYnJpZGdlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKiAyMDA2LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBwYXJ0bHkgZGVyaXZlZCBmcm9tCi0gKiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9wY2llLmMKLSAqLwotCi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0KLSNpZmRlZiBDT05GSUdfUENJCi0KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8cGNpLmg+Ci0KLSNkZWZpbmUgUENJX0NGR19PVVQgCW91dF9iZTMyCi0jZGVmaW5lIFBFWF9GSVgJCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyKzB4NCwgMHgwNDAwZmZmZikKLQotc3RhdGljIGludAotaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkgIHBjaV9kZXZfdCBkZXYsCi0JCQkgIGludCBvZmZzZXQsCi0JCQkgIGludCBsZW4sCi0JCQkgIHUzMiAqdmFsKQotewotCWludCBidXMgPSBQQ0lfQlVTKGRldik7Ci0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfZGF0YTsKLQl1MzIgdGVtcDsKLQotCVBFWF9GSVg7Ci0JaWYgKGJ1cyA9PSAweGZmKSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgIGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDEpOwotCX0gZWxzZSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgIGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDApOwotCX0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlQRVhfRklYOwotCXRlbXAgPSBpbl9sZTMyKCh1MzIgKikgY2ZnX2RhdGEpOwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpICogOCkpICYgMHhmZjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpICogOCkpICYgMHhmZmZmOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkqdmFsID0gdGVtcDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3dyaXRlX2NvbmZpZ19wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCSAgIHBjaV9kZXZfdCBkZXYsCi0JCQkgICBpbnQgb2Zmc2V0LAotCQkJICAgaW50IGxlbiwKLQkJCSAgIHUzMiB2YWwpCi17Ci0JaW50IGJ1cyA9IFBDSV9CVVMoZGV2KTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfZGF0YTsKLQl1MzIgdGVtcDsKLQotCVBFWF9GSVg7Ci0JaWYgKGJ1cyA9PSAweGZmKSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgIGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDEpOwotCX0gZWxzZSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgIGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDApOwotCX0KLQotCS8qCi0JICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCi0JICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgotCSAqLwotCS8qIEVSUkFUQSBQQ0ktRXggMTIgLSBDb25maWd1cmF0aW9uIEFkZHJlc3MvRGF0YSBBbGlnbm1lbnQgKi8KLQljZmdfZGF0YSA9IGhvc2UtPmNmZ19kYXRhOwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQlQRVhfRklYOwotCQl0ZW1wID0gaW5fbGUzMigodTMyICopIGNmZ19kYXRhKTsKLQkJdGVtcCA9ICh0ZW1wICYgfigweGZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpIHwKLQkJICAgICh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKLQkJUEVYX0ZJWDsKLQkJb3V0X2xlMzIoKHUzMiAqKSBjZmdfZGF0YSwgdGVtcCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJUEVYX0ZJWDsKLQkJdGVtcCA9IGluX2xlMzIoKHUzMiAqKSBjZmdfZGF0YSk7Ci0JCXRlbXAgPSAodGVtcCAmIH4oMHhmZmZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpOwotCQl0ZW1wIHw9ICh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKLQkJUEVYX0ZJWDsKLQkJb3V0X2xlMzIoKHUzMiAqKSBjZmdfZGF0YSwgdGVtcCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVBFWF9GSVg7Ci0JCW91dF9sZTMyKCh1MzIgKikgY2ZnX2RhdGEsIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQlQRVhfRklYOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF9yZWFkX2NvbmZpZ19ieXRlX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJICAgICAgIHBjaV9kZXZfdCBkZXYsCi0JCQkgICAgICAgaW50IG9mZnNldCwKLQkJCSAgICAgICB1OCAqdmFsKQotewotCXUzMiB2YWwzMjsKLQlpbmRpcmVjdF9yZWFkX2NvbmZpZ19wY2llKGhvc2UsIGRldiwgb2Zmc2V0LCAxLCAmdmFsMzIpOwotCSp2YWwgPSAodTgpIHZhbDMyOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF9yZWFkX2NvbmZpZ193b3JkX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJICAgICAgIHBjaV9kZXZfdCBkZXYsCi0JCQkgICAgICAgaW50IG9mZnNldCwKLQkJCSAgICAgICB1MTYgKnZhbCkKLXsKLQl1MzIgdmFsMzI7Ci0JaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZShob3NlLCBkZXYsIG9mZnNldCwgMiwgJnZhbDMyKTsKLQkqdmFsID0gKHUxNikgdmFsMzI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3JlYWRfY29uZmlnX2R3b3JkX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCXBjaV9kZXZfdCBkZXYsCi0JCQkJaW50IG9mZnNldCwKLQkJCQl1MzIgKnZhbCkKLXsKLQlyZXR1cm4gaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZShob3NlLCBkZXYsIG9mZnNldCwgNCwgdmFsKTsKLX0KLQotc3RhdGljIGludAotaW5kaXJlY3Rfd3JpdGVfY29uZmlnX2J5dGVfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJcGNpX2Rldl90IGRldiwKLQkJCQlpbnQgb2Zmc2V0LAotCQkJCXU4IHZhbCkKLXsKLQlyZXR1cm4gaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3BjaWUoaG9zZSwgZGV2LCBvZmZzZXQsIDEsICh1MzIpIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3dyaXRlX2NvbmZpZ193b3JkX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCXBjaV9kZXZfdCBkZXYsCi0JCQkJaW50IG9mZnNldCwKLQkJCQl1bnNpZ25lZCBzaG9ydCB2YWwpCi17Ci0JcmV0dXJuIGluZGlyZWN0X3dyaXRlX2NvbmZpZ19wY2llKGhvc2UsIGRldiwgb2Zmc2V0LCAyLCAodTMyKSB2YWwpOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF93cml0ZV9jb25maWdfZHdvcmRfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJIHBjaV9kZXZfdCBkZXYsCi0JCQkJIGludCBvZmZzZXQsCi0JCQkJIHUzMiB2YWwpCi17Ci0JcmV0dXJuIGluZGlyZWN0X3dyaXRlX2NvbmZpZ19wY2llKGhvc2UsIGRldiwgb2Zmc2V0LCA0LCB2YWwpOwotfQotCi12b2lkCi1wY2llX3NldHVwX2luZGlyZWN0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpCi17Ci0JcGNpX3NldF9vcHMoaG9zZSwKLQkJICAgIGluZGlyZWN0X3JlYWRfY29uZmlnX2J5dGVfcGNpZSwKLQkJICAgIGluZGlyZWN0X3JlYWRfY29uZmlnX3dvcmRfcGNpZSwKLQkJICAgIGluZGlyZWN0X3JlYWRfY29uZmlnX2R3b3JkX3BjaWUsCi0JCSAgICBpbmRpcmVjdF93cml0ZV9jb25maWdfYnl0ZV9wY2llLAotCQkgICAgaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3dvcmRfcGNpZSwKLQkJICAgIGluZGlyZWN0X3dyaXRlX2NvbmZpZ19kd29yZF9wY2llKTsKLQotCWhvc2UtPmNmZ19hZGRyID0gKHVuc2lnbmVkIGludCAqKWNmZ19hZGRyOwotCWhvc2UtPmNmZ19kYXRhID0gKHVuc2lnbmVkIGNoYXIgKiljZmdfZGF0YTsKLX0KLQotI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L3N0YXJ0LlMgYi9jcHUvbXBjODZ4eC9zdGFydC5TCmluZGV4IDQxMjc0NWIuLmM4MzMxMGEgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4Nnh4L3N0YXJ0LlMKKysrIGIvY3B1L21wYzg2eHgvc3RhcnQuUwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIENvcHlyaWdodCAyMDA0LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICogU3Jpa2FudGggU3Jpbml2YXNhbiA8c3Jpa2FudGguc3Jpbml2YWFuQGZyZWVzY2FsZS5jb20+CiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKQEAgLTQ0LDExICs0NCw5IEBACiAjZGVmaW5lIENPTkZJR19JREVOVF9TVFJJTkcgIiIKICNlbmRpZgogCi0vKiBXZSBkb24ndCB3YW50IHRoZSAgTU1VIHlldC4KLSovCi0jdW5kZWYJTVNSX0tFUk5FTAotLyogTWFjaGluZSBDaGVjayBhbmQgUmVjb3ZlcmFibGUgSW50ZXJyLiAqLwotI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FIHwgTVNSX1JJICkKKy8qCisgKiBOZWVkIE1TUl9EUiB8IE1TUl9JUiBlbmFibGVkIHRvIGFjY2VzcyBJL08gKHByaW50ZikgaW4gZXhjZXB0aW9ucworICovCiAKIC8qCiAgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCkBAIC0xOTUsMTcgKzE5MywyMSBAQAogCWJsCXNlY29uZGFyeV9jcHVfc2V0dXAKICNlbmRpZgogCisxOgorI2lmZGVmIENGR19SQU1CT09UCiAJLyogZGlzYWJsZSBldmVyeXRoaW5nICovCi0xOglsaQlyMCwgMAorCWxpCXIwLCAwCiAJbXRzcHIJSElEMCwgcjAKIAlzeW5jCiAJbXRtc3IJMAorI2VuZGlmCisKIAlibAlpbnZhbGlkYXRlX2JhdHMKIAlzeW5jCiAKICNpZmRlZiBDRkdfTDIKIAkvKiBpbml0IHRoZSBMMiBjYWNoZSAqLwotCWFkZGlzCXIzLCByMCwgTDJfSU5JVEBoCisJbGlzCXIzLCBMMl9JTklUQGgKIAlvcmkJcjMsIHIzLCBMMl9JTklUQGwKIAltdHNwcglsMmNyLCByMwogCS8qIGludmFsaWRhdGUgdGhlIEwyIGNhY2hlICovCkBAIC0yNDEsNjkgKzI0Myw5IEBACiAJYmwJc2V0dXBfY2NzcmJhcgogI2VuZGlmCiAKLQotCS8qIC0tIE1QQzg2NDEgUmV2IDEuMCBNQ00gRXJyYXRhIGZpeHVwcyAtLSAqLwotCi0JLyogc2tpcCBmaXh1cHMgaWYgbm90IFJldiAxLjAgKi8KLQltZnNwcglyNCwgU1ZSCi0Jcmx3aW5tCXI0LHI0LDAsMjQsMzEKLQljbXB3aQlyNCwweDEwCi0JYm5lCTFmCi0KLQlsaXMJcjMsTUNNX0FCQ1JAaGEKLQlsd3oJcjQsTUNNX0FCQ1JAbChyMykJLyogQUJDUiAtPiByNCAqLwotCi0JLyogc2V0IEFCQ1JbQV9TVFJNX0NOVF0gPSAwICovCi0Jcmx3aW5tCXI0LHI0LDAsMCwyOQotCi0JLyogc2V0IEFCQ1JbQVJCX1BPTElDWV0gdG8gMHgxIChyb3VuZC1yb2JpbikgKi8KLQlhZGRpCXIwLHIwLDEKLQlybHdpbWkJcjQscjAsMTIsMTgsMTkKLQotCXN0dwlyNCxNQ01fQUJDUkBsKHIzKQkvKiByNCAtPiBBQkNSICovCi0Jc3luYwotCi0JLyogU2V0IERCQ1JbRVJEX0RJU10gKi8KLQlsaXMJcjMsTUNNX0RCQ1JAaGEKLQlsd3oJcjQsTUNNX0RCQ1JAbChyMykKLQlvcmlzCXI0LCByNCwgMHg0MDAwCi0Jc3R3CXI0LE1DTV9EQkNSQGwocjMpCi0Jc3luYwotMToKIAkvKiBzZXR1cCB0aGUgbGF3IGVudHJpZXMgKi8KIAlibAlsYXdfZW50cnkKIAlzeW5jCi0KLQotI2lmIChFTVVMQVRPUl9SVU4gPT0gMSkKLQkvKiBPbiB0aGUgZW11bGF0b3Igd2Ugd2FudCB0byBhZGp1c3QgdGhlc2UgQVNBUCAqLwotCS8qIG90aGVyd2lzZSB0aGluZ3MgYXJlIHNsb29vb3cgKi8KLQkvKiBTZXR1cCBPUjAgKExBTEUgRklYKSovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpCXIzLCByMywgMHg1MDA0Ci0JbGkJcjQsIDB4MEZGMwotCXN0dwlyNCwgMChyMykKLQlzeW5jCi0KLQkvKiBTZXR1cCBMQ1JSICovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpCXIzLCByMywgMHg1MEQ0Ci0JbGlzCXI0LCAweDgwMDAKLQlvcmkJcjQsIHI0LCAweDAwMDIKLQlzdHcJcjQsIDAocjMpCi0Jc3luYwotI2VuZGlmCi0jaWYgMQotCS8qIG1ha2Ugc3VyZSB0aW1lciBlbmFibGVkIGluIGd1dHMgcmVnaXN0ZXIgdG9vICovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpcwlyMyxyMywgMHhFCi0Jb3JpCXIzLHIzLDB4MDA3MAotCWx3eglyNCwgMChyMykKLQlsaXMJcjUsMHhGRkZDCi0Jb3JpCXI1LHI1LDB4NUZGRgotCWFuZAlyNCxyNCxyNQotCXN0dwlyNCwwKHIzKQotI2VuZGlmCiAJLyoKIAkgKiBDYWNoZSBtdXN0IGJlIGVuYWJsZWQgaGVyZSBmb3Igc3RhY2staW4tY2FjaGUgdHJpY2suCiAJICogVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgQkFUUy4KQEAgLTM0Niw4ICsyODgsNiBAQAogCiAjaWZkZWYJUlVOX0RJQUcKIAotCS8qIFNyaToJIENvZGUgdG8gcnVuIHRoZSBkaWFnbm9zdGljIGF1dG9tYXRpY2FsbHkgKi8KLQogCS8qIExvYWQgUFhfQVVYIHJlZ2lzdGVyIGFkZHJlc3MgaW4gcjQgKi8KIAlsaXMJcjQsIDB4ZjgxMAogCW9yaQlyNCwgcjQsIDB4NgpAQCAtMzkyLDYgKzMzMiw3IEBACiAJLmdsb2JsCWludmFsaWRhdGVfYmF0cwogaW52YWxpZGF0ZV9iYXRzOgogCisJbGkJcjAsIDAKIAkvKiBpbnZhbGlkYXRlIEJBVHMgKi8KIAltdHNwcglJQkFUMFUsIHIwCiAJbXRzcHIJSUJBVDFVLCByMApAQCAtMTA0MCw2ICs5ODEsNyBAQAogCW1mbXNyCXI3CiAJbGkJcjgsTVNSX0lQCiAJYW5kYwlyNyxyNyxyOAorCW9yaQlyNyxyNyxNU1JfTUUJCS8qIEVuYWJsZSBNYWNoaW5lIENoZWNrICovCiAJbXRtc3IJcjcKIAogCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIJKi8KQEAgLTEyMjQsOCArMTE2Niw5IEBACiAJc3luYwogCWlzeW5jCiAKLQkvKlNZTkNCRXxBQkUgaW4gSElEMSovCisJLyogTUNQfFNZTkNCRXxBQkUgaW4gSElEMSAqLwogCW1mc3ByCXI0LCBISUQxCisJb3JpcwlyNCwgcjQsIDB4ODAwMAogCW9yaQlyNCwgcjQsIDB4MEMwMAogCW10c3ByCUhJRDEsIHI0CiAJc3luYwpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvdHJhcHMuYyBiL2NwdS9tcGM4Nnh4L3RyYXBzLmMKaW5kZXggOGVhMTRlNS4uYzg0YmZiZiAxMDA2NDQKLS0tIGEvY3B1L21wYzg2eHgvdHJhcHMuYworKysgYi9jcHUvbXBjODZ4eC90cmFwcy5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTEzMCw4ICsxMzAsMTEgQEAKIAlwcmludGYoIk1hY2hpbmUgY2hlY2sgaW4ga2VybmVsIG1vZGUuXG4iKTsKIAlwcmludGYoIkNhdXNlZCBieSAoZnJvbSBtc3IpOiAiKTsKIAlwcmludGYoInJlZ3MgJXAgIiwgcmVncyk7Ci0Jc3dpdGNoIChyZWdzLT5tc3IgJiAweDAwMEYwMDAwKSB7Ci0JY2FzZSAoMHg4MDAwMDAwMCA+PiAxMik6CisJc3dpdGNoICggcmVncy0+bXNyICYgMHgwMDFGMDAwMCkgeworCWNhc2UgKDB4ODAwMDAwMDA+PjExKToKKwkJcHJpbnRmKCJNU1MgZXJyb3IuIE1TU1NSMDogJTA4eFxuIiwgbWZzcHIoU1BSTl9NU1NTUjApKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTIpOgogCQlwcmludGYoIk1hY2hpbmUgY2hlY2sgc2lnbmFsIC0gcHJvYmFibHkgZHVlIHRvIG1tIGZhdWx0XG4iCiAJCSAgICAgICAid2l0aCBtbXUgb2ZmXG4iKTsKIAkJYnJlYWs7CkBAIC0xNTUsNyArMTU4LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTcwLDcgKzE3Myw3IEBACiAJdW5zaWduZWQgY2hhciAqcCA9IHJlZ3MgPyAodW5zaWduZWQgY2hhciAqKShyZWdzLT5uaXApIDogTlVMTDsKIAlpbnQgaSwgajsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xOTMsNyArMTk2LDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIwNSwxMCArMjA4LDExIEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCisJcHJpbnRmKCJVbmtub3duRXhjZXB0aW9uIHJlZ3NAJXhcbiIsIHJlZ3MpOwogCXByaW50ZigiQmFkIHRyYXAgYXQgUEM6ICVseCwgU1I6ICVseCwgdmVjdG9yPSVseFxuIiwKIAkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOwogCV9leGNlcHRpb24oMCwgcmVncyk7CmRpZmYgLS1naXQgYS9jcHUvbXBjOHh4L2JlZGJ1Z184NjAuYyBiL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCmluZGV4IGU5MWExMDAuLjVkNTIzNjYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCisrKyBiL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgogI2luY2x1ZGUgPGJlZGJ1Zy90eXBlLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpICYmIGRlZmluZWQoQ09ORklHXzh4eCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKSAmJiBkZWZpbmVkKENPTkZJR184eHgpCiAKICNkZWZpbmUgTUFYX0JSRUFLX1BPSU5UUyAyCiAKZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvZmVjLmMgYi9jcHUvbXBjOHh4L2ZlYy5jCmluZGV4IDZkMjc1NWUuLjA4YTM3MTUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvZmVjLmMKKysrIGIvY3B1L21wYzh4eC9mZWMuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjdW5kZWYJRVRfREVCVUcKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIFwKIAkoZGVmaW5lZChGRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMSkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMikpCiAKIC8qIGNvbXBhdGliaWxpdHkgdGVzdCwgaWYgb25seSBGRUNfRU5FVCBkZWZpbmVkIGFzc3VtZSBFVEhFUiBvbiBGRUMxICovCkBAIC00OSw3ICs0OSw3IEBACiAjaWYgZGVmaW5lZChXQU5UX01JSSkKICNpbmNsdWRlIDxtaWlwaHkuaD4KIAotI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpKQorI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkKICNlcnJvciAiQ09ORklHX01JSSBoYXMgdG8gYmUgZGVmaW5lZCEiCiAjZW5kaWYKIApAQCAtMTgyLDcgKzE4Miw3IEBACiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCiAJCQlmZWM4eHhfbWlpcGh5X3JlYWQsIGZlYzh4eF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCkBAIC0yNjgsNyArMjY4LDcgQEAKIAogCQkJbGVuZ3RoIC09IDQ7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAkJCWlmICgocnhbMF0gJiAxKSAhPSAwCiAJCQkgICAgJiYgbWVtY21wICgodWNoYXIgKikgcngsIE5ldEJjYXN0QWRkciwgNikgIT0gMAogCQkJICAgICYmIG1lbWNtcCAoKHVjaGFyICopIHJ4LCBOZXRDRFBBZGRyLCA2KSAhPSAwKQpAQCAtNjA4LDcgKzYwOCw3IEBACiAJZmVjcC0+ZmVjX2FkZHJfaGlnaCA9IChlYVs0XSA8PCA4KSB8IChlYVs1XSk7CiAjdW5kZWYgZWEKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCS8qCiAJICogVHVybiBvbiBtdWx0aWNhc3QgYWRkcmVzcyBoYXNoIHRhYmxlCiAJICovCkBAIC03ODcsNyArNzg3LDcgQEAKIAllZmlzLT5pbml0aWFsaXplZCA9IDA7CiB9CiAKLSNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpIHx8IGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ0ZHX0RJU0NPVkVSX1BIWSkgfHwgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCiAvKiBNYWtlIE1JSSByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciB0aGUgRkVDLgogKi8KQEAgLTg1Miw3ICs4NTIsNyBAQAogI2VuZGlmCiAJcmV0dXJuIChtaWlfcmVwbHkgJiAweGZmZmYpOwkJLyogZGF0YSByZWFkIGZyb20gcGh5ICovCiB9Ci0jZW5kaWYgLyogQ0ZHX0RJU0NPVkVSX1BIWSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0RJU0NPVkVSX1BIWSkKIHN0YXRpYyBpbnQgbWlpX2Rpc2NvdmVyX3BoeShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQpAQCAtOTI2LDcgKzkyNiw3IEBACiB9CiAjZW5kaWYJLyogQ0ZHX0RJU0NPVkVSX1BIWSAqLwogCi0jaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkgJiYgIWRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCisjaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbWlpX2luaXQgLS0gSW5pdGlhbGl6ZSB0aGUgTUlJIGZvciBNSUkgY29tbWFuZCB3aXRob3V0IGV0aGVybmV0CkBAIC0xMDIwLDYgKzEwMjAsNiBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkqLworI2VuZGlmCiAKLSNlbmRpZgkvKiBDRkdfQ01EX05FVCwgRkVDX0VORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzh4eC9rZ2RiLlMgYi9jcHUvbXBjOHh4L2tnZGIuUwppbmRleCAxMWMzYzY5Li44MTJiYWEzIDEwMDY0NAotLS0gYS9jcHUvbXBjOHh4L2tnZGIuUworKysgYi9jcHUvbXBjOHh4L2tnZGIuUwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAKICAvKgogICogY2FjaGUgZmx1c2hpbmcgcm91dGluZXMgZm9yIGtnZGIKQEAgLTcxLDQgKzcxLDQgQEAKIAlTWU5DCiAJYmxyCiAKLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzh4eC9zY2MuYyBiL2NwdS9tcGM4eHgvc2NjLmMKaW5kZXggNmI5MTEwZi4uNzQ0ZGNkZCAxMDA2NDQKLS0tIGEvY3B1L21wYzh4eC9zY2MuYworKysgYi9jcHUvbXBjOHh4L3NjYy5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bmV0Lmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKFNDQ19FTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoU0NDX0VORVQpCiAKIC8qIEV0aGVybmV0IFRyYW5zbWl0IGFuZCBSZWNlaXZlIEJ1ZmZlcnMgKi8KICNkZWZpbmUgREJVRl9MRU5HVEggIDE1MjAKQEAgLTU2Nyw0ICs1NjcsNCBAQAogCQkoU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQpOwogfQogI2VuZGlmCi0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQsIFNDQ19FTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvc2VyaWFsLmMgYi9jcHUvbXBjOHh4L3NlcmlhbC5jCmluZGV4IGZmYzg5OGMuLjY4ODA0Y2MgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvc2VyaWFsLmMKKysrIGIvY3B1L21wYzh4eC9zZXJpYWwuYwpAQCAtNjY2LDcgKzY2Niw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAKIHZvaWQKIGtnZGJfc2VyaWFsX2luaXQodm9pZCkKQEAgLTcyMyw2ICs3MjMsNiBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0tHREIJKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHXzh4eF9DT05TX05PTkUgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvdHJhcHMuYyBiL2NwdS9tcGM4eHgvdHJhcHMuYwppbmRleCA2N2I3NWNjLi5lMWVjODg5IDEwMDY0NAotLS0gYS9jcHUvbXBjOHh4L3RyYXBzLmMKKysrIGIvY3B1L21wYzh4eC90cmFwcy5jCkBAIC0zNiwxMSArMzYsMTEgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIGludCAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqKSA9IDA7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMTI2LDcgKzEyNiw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNTksNyArMTU5LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNzEsNyArMTcxLDcgQEAKIHZvaWQKIFByb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xODMsNyArMTgzLDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTk2LDcgKzE5Niw3IEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIxMCw3ICsyMTAsNyBAQAogewogICBwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOwogICBzaG93X3JlZ3MocmVncyk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAgIGRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9uaW9zL2NwdS5jIGIvY3B1L25pb3MvY3B1LmMKaW5kZXggZDJiYjJjMC4uNTUxOWU4MiAxMDA2NDQKLS0tIGEvY3B1L25pb3MvY3B1LmMKKysrIGIvY3B1L25pb3MvY3B1LmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogCS8qIEdldCBjcHUgdmVyc2lvbiBpbmZvICovCiAJdmFsID0gcmRjdGwgKENUTF9DUFVfSUQpOwotCXByaW50ZiAoIkNQVTogIik7CisJcHV0cyAoIkNQVTogICAiKTsKIAlwcmludGYgKCIlcyIsICh2YWwgJiAweDAwMDA4MDAwKSA/ICJOaW9zLTE2ICIgOiAiTmlvcy0zMiAiKTsKIAlyZXZfbWFqb3IgPSAodmFsPj4xMikgJiAweDA3OwogCXJldl9taW5vciA9ICh2YWw+PjQpICYgMHgwZmY7CmRpZmYgLS1naXQgYS9jcHUvbmlvcy9pbnRlcnJ1cHRzLmMgYi9jcHUvbmlvcy9pbnRlcnJ1cHRzLmMKaW5kZXggNDhmYzgxZS4uNzVlNDkxZCAxMDA2NDQKLS0tIGEvY3B1L25pb3MvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9uaW9zL2ludGVycnVwdHMuYwpAQCAtMTczLDcgKzE3Myw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogaW50IGRvX2lycWluZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWludCB2ZWM7CkBAIC0xOTMsNCArMTkzLDQgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9uaW9zMi9pbnRlcnJ1cHRzLmMgYi9jcHUvbmlvczIvaW50ZXJydXB0cy5jCmluZGV4IDQ2ODUxNjEuLmFlYjViNjUgMTAwNjQ0Ci0tLSBhL2NwdS9uaW9zMi9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L25pb3MyL2ludGVycnVwdHMuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiBpbnQgZG9faXJxaW5mbyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaW50IGk7CkBAIC0yMjgsNCArMjI4LDQgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvNDQwc3BlX3BjaWUuYyBiL2NwdS9wcGM0eHgvNDQwc3BlX3BjaWUuYwppbmRleCBkNmM0YmU1Li5iZjY4Y2MxIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4LzQ0MHNwZV9wY2llLmMKKysrIGIvY3B1L3BwYzR4eC80NDBzcGVfcGNpZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogKEMpIENvcHlyaWdodCAyMDA2IC0gMjAwNwogICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC00MCw2ICs0MCwzNCBAQAogCUxOS1dfWDgJCQk9IDB4OAogfTsKIAorc3RhdGljIGlubGluZSBpbnQgcGNpZV9pbl84KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkcikKK3sKKwlpbnQgcmV0OworCisJUENJRV9JTihsYnp4LCByZXQsIGFkZHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGNpZV9pbl9sZTE2KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIpCit7CisJaW50IHJldDsKKworCVBDSUVfSU4obGhicngsIHJldCwgYWRkcikKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcGNpZV9pbl9sZTMyKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIpCit7CisJdW5zaWduZWQgcmV0OworCisJUENJRV9JTihsd2JyeCwgcmV0LCBhZGRyKTsKKworCXJldHVybiByZXQ7Cit9CisKKwogc3RhdGljIGludCBwY2llX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdW5zaWduZWQgaW50IGRldmZuLAogCWludCBvZmZzZXQsIGludCBsZW4sIHUzMiAqdmFsKSB7CiAKQEAgLTU1LDEzICs4MywxMyBAQAogCiAJc3dpdGNoIChsZW4pIHsKIAljYXNlIDE6Ci0JCSp2YWwgPSBpbl84KGhvc2UtPmNmZ19kYXRhICsgb2Zmc2V0KTsKKwkJKnZhbCA9IHBjaWVfaW5fOChob3NlLT5jZmdfZGF0YSArIG9mZnNldCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJKnZhbCA9IGluX2xlMTYoKHUxNiAqKShob3NlLT5jZmdfZGF0YSArIG9mZnNldCkpOworCQkqdmFsID0gcGNpZV9pbl9sZTE2KCh1MTYgKikoaG9zZS0+Y2ZnX2RhdGEgKyBvZmZzZXQpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJKnZhbCA9IGluX2xlMzIoKHUzMiAqKShob3NlLT5jZmdfZGF0YSArIG9mZnNldCkpOworCQkqdmFsID0gcGNpZV9pbl9sZTMyKCh1MzIqKShob3NlLT5jZmdfZGF0YSArIG9mZnNldCkpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC03ODMsOSArODExLDE0IEBACiAJLyoKIAkgKiBTZXQgYnVzIG51bWJlcnMgb24gb3VyIHJvb3QgcG9ydAogCSAqLwotCW91dF84KCh1OCAqKW1iYXNlICsgUENJX1BSSU1BUllfQlVTLCAwKTsKLQlvdXRfOCgodTggKiltYmFzZSArIFBDSV9TRUNPTkRBUllfQlVTLCAxKTsKLQlvdXRfOCgodTggKiltYmFzZSArIFBDSV9TVUJPUkRJTkFURV9CVVMsIDEpOworCWlmIChwcGM0NDBzcGVfcmV2QigpKSB7CisJCW91dF84KCh1OCAqKW1iYXNlICsgUENJX1BSSU1BUllfQlVTLCAwKTsKKwkJb3V0XzgoKHU4ICopbWJhc2UgKyBQQ0lfU0VDT05EQVJZX0JVUywgMSk7CisJCW91dF84KCh1OCAqKW1iYXNlICsgUENJX1NVQk9SRElOQVRFX0JVUywgMSk7CisJfSBlbHNlIHsKKwkJb3V0XzgoKHU4ICopbWJhc2UgKyBQQ0lfUFJJTUFSWV9CVVMsIDApOworCQlvdXRfOCgodTggKiltYmFzZSArIFBDSV9TRUNPTkRBUllfQlVTLCAwKTsKKwl9CiAKIAkvKgogCSAqIFNldCB1cCBvdXRib3VuZCB0cmFuc2xhdGlvbiB0byBob3NlLT5tZW1fc3BhY2UgZnJvbSBQTEIKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvNDQwc3BlX3BjaWUuaCBiL2NwdS9wcGM0eHgvNDQwc3BlX3BjaWUuaAppbmRleCAyYmVjYzc3Li5lYjdjZWNmIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4LzQ0MHNwZV9wY2llLmgKKysrIGIvY3B1L3BwYzR4eC80NDBzcGVfcGNpZS5oCkBAIC0xNDUsOCArMTQ1LDggQEAKICNkZWZpbmUgUEVDRkdfUElNRU4JCTB4MzNjCiAjZGVmaW5lIFBFQ0ZHX1BJTTBMQUwJCTB4MzQwCiAjZGVmaW5lIFBFQ0ZHX1BJTTBMQUgJCTB4MzQ0Ci0jZGVmaW5lIFBFQ0ZHX1BJTTFMQUwgICAgIAkweDM0OAotI2RlZmluZSBQRUNGR19QSU0xTEFIICAgICAJMHgzNGMKKyNkZWZpbmUgUEVDRkdfUElNMUxBTAkJMHgzNDgKKyNkZWZpbmUgUEVDRkdfUElNMUxBSAkJMHgzNGMKICNkZWZpbmUgUEVDRkdfUElNMDFTQUwJCTB4MzUwCiAjZGVmaW5lIFBFQ0ZHX1BJTTAxU0FICQkweDM1NAogCkBAIC0xNjEsNiArMTYxLDIxIEBACiAJbXRkY3IoRENSTl9TRFIwX0NGR0FERFIsIG9mZnNldCk7IFwKIAltdGRjcihEQ1JOX1NEUjBfQ0ZHREFUQSxkYXRhKTt9KQogCisjZGVmaW5lIFBDSUVfSU4ob3Bjb2RlLCByZXQsIGFkZHIpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCSJzeW5jXG4iCQkJXAorCQkjb3Bjb2RlICIgJTAsMCwlMVxuIgkJXAorCQkiMTogdHdpIDAsJTAsMFxuIgkJXAorCQkiaXN5bmNcbiIJCQlcCisJCSJiIDNmXG4iCQkJXAorCQkiMjogbGkgJTAsLTFcbiIJCQlcCisJCSIzOlxuIgkJCQlcCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCVwKKwkJIi5iYWxpZ24gNFxuIgkJCVwKKwkJIi5sb25nIDFiLDJiXG4iCQkJXAorCQkiLnByZXZpb3VzXG4iCQkJXAorCQk6ICI9ciIgKHJldCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7CisKIGludCBwcGM0NDBzcGVfaW5pdF9wY2llKHZvaWQpOwogaW50IHBwYzQ0MHNwZV9pbml0X3BjaWVfcm9vdHBvcnQoaW50IHBvcnQpOwogdm9pZCB5dWNjYV9zZXR1cF9wY2llX2ZwZ2Ffcm9vdHBvaW50KGludCBwb3J0KTsKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvNDR4X3NwZF9kZHIuYyBiL2NwdS9wcGM0eHgvNDR4X3NwZF9kZHIuYwppbmRleCBlMjRjZDgxLi40YTRjNmYyIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyLmMKKysrIGIvY3B1L3BwYzR4eC80NHhfc3BkX2Rkci5jCkBAIC03MCw2ICs3MCwxNSBAQAogCiAjZGVmaW5lIE9ORV9CSUxMSU9OCTEwMDAwMDAwMDAKIAorLyoKKyAqIEJvYXJkLXNwZWNpZmljIFBsYXRmb3JtIGNvZGUgY2FuIHJlaW1wbGVtZW50IHNwZF9kZHJfaW5pdF9oYW5nICgpIGlmIG5lZWRlZAorICovCit2b2lkIF9fc3BkX2Rkcl9pbml0X2hhbmcgKHZvaWQpCit7CisJaGFuZyAoKTsKK30KK3ZvaWQgc3BkX2Rkcl9pbml0X2hhbmcgKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3NwZF9kZHJfaW5pdF9oYW5nIikpKTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICB8ICBNZW1vcnkgQ29udHJvbGxlciBPcHRpb25zIDAKICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI2MCw5ICsyNjksOCBAQAogdHlwZWRlZiBzdHJ1Y3QgYmFua19wYXJhbSBCQU5LUEFSTVM7CiAKICNpZmRlZiBDRkdfU0lNVUxBVEVfU1BEX0VFUFJPTQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY2ZnX3NpbXVsYXRlX3NwZF9lZXByb21bMTI4XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tWzEyOF07CiAjZW5kaWYKLXZvaWQgcHJvZ3JhbV90bGIodTMyIHBoeXNfYWRkciwgdTMyIHZpcnRfYWRkciwgdTMyIHNpemUsIHUzMiB0bGJfd29yZDJfaV92YWx1ZSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNwZF9yZWFkKHVjaGFyIGNoaXAsIHVpbnQgYWRkcik7CiBzdGF0aWMgdm9pZCBnZXRfc3BkX2luZm8odW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCkBAIC00NjcsNyArNDc1LDcgQEAKIAogCWlmIChkaW1tX2ZvdW5kID09IEZBTFNFKSB7CiAJCXByaW50ZigiRVJST1IgLSBObyBtZW1vcnkgaW5zdGFsbGVkLiBJbnN0YWxsIGEgRERSLVNEUkFNIERJTU0uXG5cbiIpOwotCQloYW5nKCk7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCX0KIH0KIApAQCAtNDkwLDcgKzQ5OCw3IEBACiAJCQkJICAgICAgIGRpbW1fbnVtKTsKIAkJCQlwcmludGYoIk9ubHkgRERSIFNEUkFNIERJTU1zIGFyZSBzdXBwb3J0ZWQuXG4iKTsKIAkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC01MTAsNyArNTE4LDcgQEAKIAkJCWlmICh2b2x0YWdlX3R5cGUgIT0gMHgwNCkgewogCQkJCXByaW50ZigiRVJST1I6IERJTU0gJWx1IHdpdGggdW5zdXBwb3J0ZWQgdm9sdGFnZSBsZXZlbC5cbiIsCiAJCQkJICAgICAgIGRpbW1fbnVtKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQl9IGVsc2UgewogCQkJCWRlYnVnKCJESU1NICVsdSB2b2x0YWdlIGxldmVsIHN1cHBvcnRlZC5cbiIsIGRpbW1fbnVtKTsKIAkJCX0KQEAgLTU4MSw3ICs1ODksNyBAQAogCQkJCXByaW50ZigiV0FSTklORzogRElNTSB3aXRoIGRhdGF3aWR0aCBvZiAlbHUgYml0cy5cbiIsCiAJCQkJICAgICAgIGRhdGFfd2lkdGgpOwogCQkJCXByaW50ZigiT25seSBESU1NcyB3aXRoIDMyIG9yIDY0IGJpdCBkYXRhd2lkdGhzIHN1cHBvcnRlZC5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CkBAIC03NjksNyArNzc3LDcgQEAKIAkJCQlpZiAoKHRjeWNfcmVnICYgMHgwRikgPj0gMTApIHsKIAkJCQkJcHJpbnRmKCJFUlJPUjogVGN5YyBpbmNvcnJlY3QgZm9yIERJTU0gaW4gc2xvdCAlbHVcbiIsCiAJCQkJCSAgICAgICBkaW1tX251bSk7Ci0JCQkJCWhhbmcoKTsKKwkJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJfQogCiAJCQkJY3ljbGVfdGltZV9uc194XzEwW2Nhc19pbmRleF0gPQpAQCAtODQ5LDcgKzg1Nyw3IEBACiAJCXByaW50ZigiRVJST1I6IE5vIHN1cHBvcnRlZCBDQVMgbGF0ZW5jeSB3aXRoIHRoZSBpbnN0YWxsZWQgRElNTXMuXG4iKTsKIAkJcHJpbnRmKCJPbmx5IENBUyBsYXRlbmNpZXMgb2YgMi4wLCAyLjUsIGFuZCAzLjAgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQlwcmludGYoIk1ha2Ugc3VyZSB0aGUgUExCIHNwZWVkIGlzIHdpdGhpbiB0aGUgc3VwcG9ydGVkIHJhbmdlLlxuIik7Ci0JCWhhbmcoKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJfQogCiAJLyoKQEAgLTEwMDgsNiArMTAxNiw3IEBACiAJCQkgKi8KIAkJCWZvciAoaSA9IDA7IGkgPCBOVU1NRU1URVNUUzsgaSsrKSB7CiAJCQkJZm9yIChqID0gMDsgaiA8IE5VTU1FTVdPUkRTOyBqKyspIHsKKwkJCQkJLyogcHJpbnRmKCJiYW5rIGVuYWJsZWQgYmFzZToleFxuIiwgJm1lbWJhc2Vbal0pOyAqLwogCQkJCQltZW1iYXNlW2pdID0gdGVzdFtpXVtqXTsKIAkJCQkJcHBjRGNiZigodW5zaWduZWQgbG9uZykmKG1lbWJhc2Vbal0pKTsKIAkJCQl9CkBAIC0xMTYwLDcgKzExNjksNyBAQAogCSAqLwogCWlmICh3aW5kb3dfZm91bmQgPT0gRkFMU0UpIHsKIAkJcHJpbnRmKCJFUlJPUjogQ2Fubm90IGRldGVybWluZSBhIGNvbW1vbiByZWFkIGRlbGF5LlxuIik7Ci0JCWhhbmcoKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJfQogCiAJLyoKQEAgLTEzMTAsNyArMTMxOSw3IEBACiAJCQkJcHJpbnRmKCJFUlJPUjogVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIHRoZSBiYW5rc2l6ZTogJWQuXG4iLAogCQkJCSAgICAgICBiYW5rX3NpemVfaWQpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQl9CiAKIAkJCXN3aXRjaCAobnVtX2NvbF9hZGRyKSB7CkBAIC0xMzMyLDcgKzEzNDEsNyBAQAogCQkJCXByaW50ZigiRVJST1I6IFVuc3VwcG9ydGVkIHZhbHVlIGZvciBudW1iZXIgb2YgIgogCQkJCSAgICAgICAiY29sdW1uIGFkZHJlc3NlczogJWQuXG4iLCBudW1fY29sX2FkZHIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQl9CiAKIAkJCS8qCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyMi5jIGIvY3B1L3BwYzR4eC80NHhfc3BkX2RkcjIuYwppbmRleCBiNWMwZjUzLi4xOGI5MGJhIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyMi5jCisrKyBiL2NwdS9wcGM0eHgvNDR4X3NwZF9kZHIyLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogLyogRGVmaW5lcyBmb3IgdGhlIFJlYWQgQ3ljbGUgRGVsYXkgdGVzdCAqLwogI2RlZmluZSBOVU1NRU1URVNUUwk4CiAjZGVmaW5lIE5VTU1FTVdPUkRTCTgKLSNkZWZpbmUgTlVNTE9PUFMJMjU2CQkvKiBtZW1vcnkgdGVzdCBsb29wcyAqLworI2RlZmluZSBOVU1MT09QUwk2NAkJLyogbWVtb3J5IHRlc3QgbG9vcHMgKi8KIAogI3VuZGVmIENPTkZJR19FQ0NfRVJST1JfUkVTRVQJCS8qIHRlc3Qtb25seTogc2VlIGRlc2NyaXB0aW9uIGJlbG93LCBhdCBjaGVja19lY2MoKSAqLwogCkBAIC0xMjksNiArMTI5LDM2IEBACiAjZGVmaW5lIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRQlUTEJfV09SRDJfSV9FTkFCTEUJLyogZGlzYWJsZSBjYWNoaW5nIG9uIFNEUkFNICovCiAjZW5kaWYKIAorLyoKKyAqIEJvYXJkLXNwZWNpZmljIFBsYXRmb3JtIGNvZGUgY2FuIHJlaW1wbGVtZW50IHNwZF9kZHJfaW5pdF9oYW5nICgpIGlmIG5lZWRlZAorICovCit2b2lkIF9fc3BkX2Rkcl9pbml0X2hhbmcgKHZvaWQpCit7CisJaGFuZyAoKTsKK30KK3ZvaWQgc3BkX2Rkcl9pbml0X2hhbmcgKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3NwZF9kZHJfaW5pdF9oYW5nIikpKTsKKworLyoKKyAqIFRvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIGZvciBib2FyZCBzcGVjaWZpYyBjb25maWcgdmFsdWVzIGluIHRoaXMgY29tbW9uCisgKiBERFIgc2V0dXAgY29kZSwgd2UgaW1wbGVtZW50IGhlICJ3ZWFrIiBkZWZhdWx0IGZ1bmN0aW9ucyBoZXJlLiBUaGV5IHJldHVybgorICogdGhlIGRlZmF1bHQgdmFsdWUgYmFjayB0byB0aGUgY2FsbGVyLgorICoKKyAqIFBsZWFzZSBzZWUgaW5jbHVkZS9jb25maWdzL3l1Y2NhLmggZm9yIGFuIGV4YW1wbGUgZm9yYSBib2FyZCBzcGVjaWZpYworICogaW1wbGVtZW50YXRpb24uCisgKi8KK3UzMiBfX2Rkcl93cmR0cih1MzIgZGVmYXVsdF92YWwpCit7CisJcmV0dXJuIGRlZmF1bHRfdmFsOworfQordTMyIGRkcl93cmR0cih1MzIpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2Rkcl93cmR0ciIpKSk7CisKK3UzMiBfX2Rkcl9jbGt0cih1MzIgZGVmYXVsdF92YWwpCit7CisJcmV0dXJuIGRlZmF1bHRfdmFsOworfQordTMyIGRkcl9jbGt0cih1MzIpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2Rkcl9jbGt0ciIpKSk7CisKKwogLyogUHJpdmF0ZSBTdHJ1Y3R1cmUgRGVmaW5pdGlvbnMgKi8KIAogLyogZW51bSBvbmx5IHRvIGVhc2UgY29kZSBmb3IgY2FzIGxhdGVuY3kgc2V0dGluZyAqLwpAQCAtMTQ0LDcgKzE3NCw2IEBACiAgKiBQcm90b3R5cGVzCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNkcmFtX21lbXNpemUodm9pZCk7Ci12b2lkIHByb2dyYW1fdGxiKHUzMiBwaHlzX2FkZHIsIHUzMiB2aXJ0X2FkZHIsIHUzMiBzaXplLCB1MzIgdGxiX3dvcmQyX2lfdmFsdWUpOwogc3RhdGljIHZvaWQgZ2V0X3NwZF9pbmZvKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAogCQkJIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAogCQkJIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpOwpAQCAtMjA2LDkgKzIzNSw3IEBACiAjZWxzZQogc3RhdGljIHZvaWQJRFFTX2NhbGlicmF0aW9uX3Byb2Nlc3Modm9pZCk7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKERFQlVHKQogc3RhdGljIHZvaWQgcHBjNDQwc3Bfc2RyYW1fcmVnaXN0ZXJfZHVtcCh2b2lkKTsKLSNlbmRpZgogaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CiB2b2lkIGRjYnpfYXJlYSh1MzIgc3RhcnRfYWRkcmVzcywgdTMyIG51bV9ieXRlcyk7CiB2b2lkIGRmbHVzaCh2b2lkKTsKQEAgLTQ1OSwxNyArNDg2LDE0IEBACiAJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJbWZzZHJhbShTRFJBTV9XUkRUUiwgdmFsKTsKIAltdHNkcmFtKFNEUkFNX1dSRFRSLCAodmFsICYgfihTRFJBTV9XUkRUUl9MTFdQX01BU0sgfCBTRFJBTV9XUkRUUl9XVFJfTUFTSykpIHwKLQkJKFNEUkFNX1dSRFRSX0xMV1BfMV9DWUMgfCBTRFJBTV9XUkRUUl9XVFJfOTBfREVHX0FEVikpOworCQlkZHJfd3JkdHIoU0RSQU1fV1JEVFJfTExXUF8xX0NZQyB8IFNEUkFNX1dSRFRSX1dUUl85MF9ERUdfQURWKSk7CiAKIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqIFNldCB0aGUgU0RSQU0gQ2xvY2sgVGltaW5nIFJlZ2lzdGVyCiAJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJbWZzZHJhbShTRFJBTV9DTEtUUiwgdmFsKTsKLSNpZmRlZiBDRkdfNDR4X0REUjJfQ0tUUl8xODAKLQltdHNkcmFtKFNEUkFNX0NMS1RSLCAodmFsICYgflNEUkFNX0NMS1RSX0NMS1BfTUFTSykgfCBTRFJBTV9DTEtUUl9DTEtQXzE4MF9ERUdfQURWKTsKLSNlbHNlCi0JbXRzZHJhbShTRFJBTV9DTEtUUiwgKHZhbCAmIH5TRFJBTV9DTEtUUl9DTEtQX01BU0spIHwgU0RSQU1fQ0xLVFJfQ0xLUF8wX0RFRyk7Ci0jZW5kaWYKKwltdHNkcmFtKFNEUkFNX0NMS1RSLCAodmFsICYgflNEUkFNX0NMS1RSX0NMS1BfTUFTSykgfAorCQlkZHJfY2xrdHIoU0RSQU1fQ0xLVFJfQ0xLUF8wX0RFRykpOwogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgKiBQcm9ncmFtIHRoZSBCeENGIHJlZ2lzdGVycy4KQEAgLTUyOCw3ICs1NTIsMTIgQEAKIAlkcmFtX3NpemUgPSBzZHJhbV9tZW1zaXplKCk7CiAKIAkvKiBhbmQgcHJvZ3JhbSB0bGIgZW50cmllcyBmb3IgdGhpcyBzaXplIChkeW5hbWljKSAqLwotCXByb2dyYW1fdGxiKDAsIDAsIGRyYW1fc2l6ZSwgTVlfVExCX1dPUkQyX0lfRU5BQkxFKTsKKworCS8qCisJICogUHJvZ3JhbSBUTEIgZW50cmllcyB3aXRoIGNhY2hlcyBlbmFibGVkLCBmb3IgYmVzdCBwZXJmb3JtYWNlCisJICogd2hpbGUgYXV0by1jYWxpYnJhdGluZyBhbmQgRUNDIGdlbmVyYXRpb24KKwkgKi8KKwlwcm9ncmFtX3RsYigwLCAwLCBkcmFtX3NpemUsIDApOwogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgKiBEUVMgY2FsaWJyYXRpb24uCkBAIC01MzksMTIgKzU2OCwxOCBAQAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICogSWYgZWNjIGlzIGVuYWJsZWQsIGluaXRpYWxpemUgdGhlIHBhcml0eSBiaXRzLgogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXByb2dyYW1fZWNjKGRpbW1fcG9wdWxhdGVkLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MsIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRSk7CisJcHJvZ3JhbV9lY2MoZGltbV9wb3B1bGF0ZWQsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcywgMCk7CiAjZW5kaWYKIAotI2lmZGVmIERFQlVHCisJLyoKKwkgKiBOb3cgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gKGF1dG8tY2FsaWJyYXRpb24gYW5kIEVDQyBnZW5lcmF0aW9uKQorCSAqIHJlbW92ZSB0aGUgVExCIGVudHJpZXMgd2l0aCBjYWNoZXMgZW5hYmxlZCBhbmQgcHJvZ3JhbSBhZ2FpbiB3aXRoCisJICogZGVzaXJlZCBjYWNoZSBmdW5jdGlvbmFsaXR5CisJICovCisJcmVtb3ZlX3RsYigwLCBkcmFtX3NpemUpOworCXByb2dyYW1fdGxiKDAsIDAsIGRyYW1fc2l6ZSwgTVlfVExCX1dPUkQyX0lfRU5BQkxFKTsKKwogCXBwYzQ0MHNwX3NkcmFtX3JlZ2lzdGVyX2R1bXAoKTsKLSNlbmRpZgogCiAJcmV0dXJuIGRyYW1fc2l6ZTsKIH0KQEAgLTU4Miw3ICs2MTcsNyBAQAogCiAJaWYgKGRpbW1fZm91bmQgPT0gRkFMU0UpIHsKIAkJcHJpbnRmKCJFUlJPUiAtIE5vIG1lbW9yeSBpbnN0YWxsZWQuIEluc3RhbGwgYSBERFItU0RSQU0gRElNTS5cblxuIik7Ci0JCWhhbmcoKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJfQogfQogCkBAIC02MjksNDIgKzY2NCw0MiBAQAogCQkJCSAgICAgICAic2xvdCAlZC5cbiIsICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwogCQkJCXByaW50ZigiT25seSBERFIgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDI6CiAJCQkJcHJpbnRmKCJFUlJPUjogRURPIERJTU0gZGV0ZWN0ZWQgaW4gc2xvdCAlZC5cbiIsCiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwogCQkJCXByaW50ZigiT25seSBERFIgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDM6CiAJCQkJcHJpbnRmKCJFUlJPUjogUGlwZWxpbmVkIE5pYmJsZSBESU1NIGRldGVjdGVkIGluIHNsb3QgJWQuXG4iLAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKIAkJCQlwcmludGYoIk9ubHkgRERSIGFuZCBERFIyIFNEUkFNIERJTU1zIGFyZSBzdXBwb3J0ZWQuXG4iKTsKIAkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSA0OgogCQkJCXByaW50ZigiRVJST1I6IFNEUkFNIERJTU0gZGV0ZWN0ZWQgaW4gc2xvdCAlZC5cbiIsCiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwogCQkJCXByaW50ZigiT25seSBERFIgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDU6CiAJCQkJcHJpbnRmKCJFUlJPUjogTXVsdGlwbGV4ZWQgUk9NIERJTU0gZGV0ZWN0ZWQgaW4gc2xvdCAlZC5cbiIsCiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwogCQkJCXByaW50ZigiT25seSBERFIgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDY6CiAJCQkJcHJpbnRmKCJFUlJPUjogU0dSQU0gRElNTSBkZXRlY3RlZCBpbiBzbG90ICVkLlxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7CiAJCQkJcHJpbnRmKCJPbmx5IEREUiBhbmQgRERSMiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgNzoKIAkJCQlkZWJ1ZygiRElNTSBzbG90ICVkOiBERFIxIFNEUkFNIGRldGVjdGVkXG4iLCBkaW1tX251bSk7CkBAIC02NzksNyArNzE0LDcgQEAKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7CiAJCQkJcHJpbnRmKCJPbmx5IEREUjEgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTY4OSw3ICs3MjQsNyBAQAogCQkgICAgJiYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSAgICE9IFNEUkFNX05PTkUpCiAJCSAgICAmJiAoZGltbV9wb3B1bGF0ZWRbZGltbV9udW0tMV0gIT0gZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dKSkgewogCQkJcHJpbnRmKCJFUlJPUjogRElNTSdzIEREUjEgYW5kIEREUjIgdHlwZSBjYW4gbm90IGJlIG1peGVkLlxuIik7Ci0JCQloYW5nKCk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJfQogCX0KIH0KQEAgLTc2NCw3ICs3OTksNyBAQAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KShjYWxjX2N5Y2xlX3RpbWUqMTApKTsKIAkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0sIG9yIGNoYW5nZSBERFIgZnJlcXVlbmN5IHZpYSAiCiAJCQkJICAgICAgICJzdHJhcHBpbmcgYml0cy5cblxuIik7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJfQogCQl9CiAJfQpAQCAtNzk2LDcgKzgzMSw3IEBACiAJCQkJICAgICAgICJzbG90ICVkIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBkaW1tX3JhbmssIGRpbW1fbnVtKTsKIAkJCQlwcmludGYoIk9ubHkgJWQgcmFua3MgYXJlIHN1cHBvcnRlZCBmb3IgYWxsIERJTU0uXG4iLCBNQVhSQU5LUyk7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCX0gZWxzZQogCQkJCXRvdGFsX3JhbmsgKz0gZGltbV9yYW5rOwogCQl9CkBAIC04MDUsNyArODQwLDcgQEAKIAkJCSAgICAgICAiZm9yIGFsbCBzbG90cy5cbiIsICh1bnNpZ25lZCBpbnQpdG90YWxfcmFuayk7CiAJCQlwcmludGYoIk9ubHkgJWQgcmFua3MgYXJlIHN1cHBvcnRlZCBmb3IgYWxsIERJTU0uXG4iLCBNQVhSQU5LUyk7CiAJCQlwcmludGYoIlJlbW92ZSBvbmUgb2YgdGhlIERJTU0gbW9kdWxlcy5cblxuIik7Ci0JCQloYW5nKCk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJfQogCX0KIH0KQEAgLTgzMCwyOCArODY1LDI4IEBACiAJCQkJcHJpbnRmKCJUaGlzIERJTU0gaXMgNS4wIFZvbHQvVFRMLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSBpbiBzbG90ICVkIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAweDAxOgogCQkJCXByaW50ZigiRVJST1I6IE9ubHkgRElNTXMgRERSIDIuNVYgb3IgRERSMiAxLjhWIGFyZSBzdXBwb3J0ZWQuXG4iKTsKIAkJCQlwcmludGYoIlRoaXMgRElNTSBpcyBMVlRUTC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgaW4gc2xvdCAlZCB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIsCiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMHgwMjoKIAkJCQlwcmludGYoIkVSUk9SOiBPbmx5IERJTU1zIEREUiAyLjVWIG9yIEREUjIgMS44ViBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJUaGlzIERJTU0gaXMgMS41IFZvbHQuXG4iKTsKIAkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIGluIHNsb3QgJWQgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iLAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4MDM6CiAJCQkJcHJpbnRmKCJFUlJPUjogT25seSBESU1NcyBERFIgMi41ViBvciBERFIyIDEuOFYgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiVGhpcyBESU1NIGlzIDMuMyBWb2x0L1RUTC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgaW4gc2xvdCAlZCB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIsCiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMHgwNDoKIAkJCQkvKiAyLjUgVm9sdGFnZSBvbmx5IGZvciBERFIxICovCkBAIC04NjMsNyArODk4LDcgQEAKIAkJCQlwcmludGYoIkVSUk9SOiBPbmx5IERJTU1zIEREUiAyLjVWIG9yIEREUjIgMS44ViBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSBpbiBzbG90ICVkIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0xMDA2LDEzICsxMDQxLDEzIEBACiAJaWYgKChkaW1tX3BvcHVsYXRlZFswXSAhPSBTRFJBTV9OT05FKSAmJiAoZGltbV9wb3B1bGF0ZWRbMV0gIT0gU0RSQU1fTk9ORSkpIHsKIAkJaWYgKGJ1ZjAgIT0gYnVmMSkgewogCQkJcHJpbnRmKCJFUlJPUjogRElNTSdzIGJ1ZmZlcmVkL3VuYnVmZmVyZWQsIHJlZ2lzdGVyZWQsIGNsb2NraW5nIGRvbid0IG1hdGNoLlxuIik7Ci0JCQloYW5nKCk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJfQogCX0KIAogCWlmICgoZGltbV82NGJpdCA9PSBUUlVFKSAmJiAoZGltbV8zMmJpdCA9PSBUUlVFKSkgewogCQlwcmludGYoIkVSUk9SOiBDYW5ub3QgbWl4IDMyIGJpdCBhbmQgNjQgYml0IEREUi1TRFJBTSBESU1NcyB0b2dldGhlci5cbiIpOwotCQloYW5nKCk7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCX0KIAllbHNlIGlmICgoZGltbV82NGJpdCA9PSBUUlVFKSAmJiAoZGltbV8zMmJpdCA9PSBGQUxTRSkpIHsKIAkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9ETVdEXzY0OwpAQCAtMTAyMCw3ICsxMDU1LDcgQEAKIAkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9ETVdEXzMyOwogCX0gZWxzZSB7CiAJCXByaW50ZigiRVJST1I6IFBsZWFzZSBpbnN0YWxsIG9ubHkgMzIgb3IgNjQgYml0IEREUi1TRFJBTSBESU1Ncy5cblxuIik7Ci0JCWhhbmcoKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJfQogCiAJaWYgKGVjY19lbmFibGVkID09IFRSVUUpCkBAIC0xMjA5LDcgKzEyNDQsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGYoIkVSUk9SOiB1Y29kZSBlcnJvciBvbiBzZWxlY3RlZF9jYXMgdmFsdWUgJWQiLCBzZWxlY3RlZF9jYXMpOwotCQkJaGFuZygpOworCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMjQxLDcgKzEyNzYsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGYoIkVSUk9SOiB3cml0ZSByZWNvdmVyeSBub3Qgc3VwcG9ydCAoJWQpIiwgd3JpdGVfcmVjb3ZlcnkpOwotCQkJaGFuZygpOworCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQlicmVhazsKIAkJfQogI2Vsc2UKQEAgLTEyNTksNyArMTI5NCw3IEBACiAJCQlvZHMgPSBPRFNfUkVEVUNFRDsKIAkJfSBlbHNlIHsKIAkJCXByaW50ZigiRVJST1I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBESU1NJ3MgKCVkKSIsIHRvdGFsX2RpbW0pOwotCQkJaGFuZygpOworCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCX0KIAogCQltciA9IENNRF9FTVIgfCBTRUxFQ1RfTVIgfCBCVVJTVF9MRU5fNCB8IHdyIHwgY2FzOwpAQCAtMTI4NCw3ICsxMzE5LDcgQEAKIAkJbXRzZHJhbShTRFJBTV9JTklUUExSMTMsIDB4ODA4MDAwMDAgfCBlbXIpOwkJLyogRU1SIE9DRCBFeGl0ICovCiAJfSBlbHNlIHsKIAkJcHJpbnRmKCJFUlJPUjogdWNvZGUgZXJyb3IgYXMgdW5rbm93biBERFIgdHlwZSBpbiBwcm9ncmFtX2luaXRwbHIiKTsKLQkJaGFuZygpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAl9CiB9CiAKQEAgLTEzODksNyArMTQyNCw3IEBACiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlwcmludGYoIkVSUk9SOiBTUEQgcmVwb3J0ZWQgVGN5YyBpcyBpbmNvcnJlY3QgZm9yIERJTU0gIgogCQkJCQkJICAgICAgICJpbiBzbG90ICVkXG4iLCAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKLQkJCQkJCWhhbmcoKTsKKwkJCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKIAkJCQkJLyogQ29udmVydCBmcm9tIGhleCB0byBkZWNpbWFsICovCkBAIC0xNTI2LDcgKzE1NjEsNyBAQAogCQkJcHJpbnRmKCJFUlJPUjogQ2Fubm90IGZpbmQgYSBzdXBwb3J0ZWQgQ0FTIGxhdGVuY3kgd2l0aCB0aGUgaW5zdGFsbGVkIERJTU1zLlxuIik7CiAJCQlwcmludGYoIk9ubHkgRElNTXMgRERSMSB3aXRoIENBUyBsYXRlbmNpZXMgb2YgMi4wLCAyLjUsIGFuZCAzLjAgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJcHJpbnRmKCJNYWtlIHN1cmUgdGhlIFBMQiBzcGVlZCBpcyB3aXRoaW4gdGhlIHN1cHBvcnRlZCByYW5nZSBvZiB0aGUgRElNTXMuXG5cbiIpOwotCQkJaGFuZygpOworCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCX0KIAl9IGVsc2UgeyAvKiBERFIyICovCiAJCWRlYnVnKCJjYXNfM18wX2F2YWlsYWJsZT0lZFxuIiwgY2FzXzNfMF9hdmFpbGFibGUpOwpAQCAtMTU0OSw3ICsxNTg0LDcgQEAKIAkJCSAgICAgICBjYXNfM18wX2F2YWlsYWJsZSwgY2FzXzRfMF9hdmFpbGFibGUsIGNhc181XzBfYXZhaWxhYmxlKTsKIAkJCXByaW50Zigic2RyYW1fZnJlcT0lZCBjeWNsZTM9JWQgY3ljbGU0PSVkIGN5Y2xlNT0lZFxuXG4iLAogCQkJICAgICAgIHNkcmFtX2ZyZXEsIGN5Y2xlXzNfMF9jbGssIGN5Y2xlXzRfMF9jbGssIGN5Y2xlXzVfMF9jbGspOwotCQkJaGFuZygpOworCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCX0KIAl9CiAKQEAgLTE2NTgsNyArMTY5Myw3IEBACiAJCQkJcHJpbnRmKCJFUlJPUjogRElNTSAlZCB1bnN1cHBvcnRlZCByZWZyZXNoIHJhdGUvdHlwZS5cbiIsCiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIwNjYsNyArMjEwMSw3IEBACiAJCQkJCXByaW50ZigiRVJST1I6IFVuc3VwcG9ydGVkIHZhbHVlIGZvciBudW1iZXIgb2YgIgogCQkJCQkgICAgICAgImNvbHVtbiBhZGRyZXNzZXM6ICVkLlxuIiwgKHVuc2lnbmVkIGludCludW1fY29sX2FkZHIpOwogCQkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7Ci0JCQkJCWhhbmcoKTsKKwkJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJfQogCQkJfQogCkBAIC0yMTQ4LDcgKzIxODMsNyBAQAogCQkJCXByaW50ZigiRVJST1I6IFVuc3VwcG9ydGVkIHZhbHVlIGZvciB0aGUgYmFua3NpemU6ICVkLlxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClyYW5rX3NpemVfaWQpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQl9CiAKIAkJCWlmICgoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dICE9IFNEUkFNX05PTkUpICYmIChkaW1tX251bSA9PSAxKSkKQEAgLTI2OTMsNyArMjcyOCw4IEBACiAJCXByaW50ZigiXG5FUlJPUjogQ2Fubm90IGRldGVybWluZSBhIGNvbW1vbiByZWFkIGRlbGF5IGZvciB0aGUgIgogCQkgICAgICAgIkRJTU0ocykgaW5zdGFsbGVkLlxuIik7CiAJCWRlYnVnKCIlc1slZF0gRVJST1IgOiBcbiIsIF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7Ci0JCWhhbmcoKTsKKwkJcHBjNDQwc3Bfc2RyYW1fcmVnaXN0ZXJfZHVtcCgpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAl9CiAKIAlibGFua19zdHJpbmcoc3RybGVuKHN0cikpOwpAQCAtMjg0OSw3ICsyODg1LDcgQEAKIAlpZiAod2luZG93X2ZvdW5kID09IEZBTFNFKSB7CiAJCXByaW50ZigiRVJST1I6IENhbm5vdCBkZXRlcm1pbmUgYSBjb21tb24gcmVhZCBkZWxheSBmb3IgdGhlICIKIAkJICAgICAgICJESU1NKHMpIGluc3RhbGxlZC5cbiIpOwotCQloYW5nKCk7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCX0KIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMDE4LDUgKzMwNTQsOSBAQAogCWRjcl9kYXRhID0gbWZkY3IoU0RSQU1fUjNCQVMpOwogCXByaW50ZigiICAgICAgICBNUTNfQjBCQVMgICAgICAgPSAweCUwOFhcbiIsIGRjcl9kYXRhKTsKIH0KKyNlbHNlCitzdGF0aWMgdm9pZCBwcGM0NDBzcF9zZHJhbV9yZWdpc3Rlcl9kdW1wKHZvaWQpCit7Cit9CiAjZW5kaWYKICNlbmRpZiAvKiBDT05GSUdfU1BEX0VFUFJPTSAqLwpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC80eHhfZW5ldC5jIGIvY3B1L3BwYzR4eC80eHhfZW5ldC5jCmluZGV4IDEyMDBkMDIuLmNjOGU3MzQgMTAwNjQ0Ci0tLSBhL2NwdS9wcGM0eHgvNHh4X2VuZXQuYworKysgYi9jcHUvcHBjNHh4LzR4eF9lbmV0LmMKQEAgLTk0LDkgKzk0LDkgQEAKICAqIG5ldHdvcmsgc3VwcG9ydCBlbmFibGVkLgogICogUmVtYXJrOiBDT05GSUdfNDA1IGRlc2NyaWJlcyBYaWxpbnggUFBDNDA1IEZQR0Egd2l0aG91dCBFTUFDIGNvbnRyb2xsZXIhCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmICFkZWZpbmVkKENPTkZJR180MDUpICYmICFkZWZpbmVkKENPTkZJR19JT1A0ODApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgIWRlZmluZWQoQ09ORklHXzQwNSkgJiYgIWRlZmluZWQoQ09ORklHX0lPUDQ4MCkKIAotI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpKQorI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkKICNlcnJvciAiQ09ORklHX01JSSBoYXMgdG8gYmUgZGVmaW5lZCEiCiAjZW5kaWYKIApAQCAtMTQxNSwxMCArMTQxNSw4IEBACiAJCQlpZiAoKE1BTF9SWF9DVFJMX0VNUFRZICYgaHdfcC0+cnhbaV0uY3RybCkKIAkJCSAgICB8fCAobG9vcF9jb3VudCA+PSBOVU1fUlhfQlVGRikpCiAJCQkJYnJlYWs7CisKIAkJCWxvb3BfY291bnQrKzsKLQkJCWh3X3AtPnJ4X3Nsb3QrKzsKLQkJCWlmIChOVU1fUlhfQlVGRiA9PSBod19wLT5yeF9zbG90KQotCQkJCWh3X3AtPnJ4X3Nsb3QgPSAwOwogCQkJaGFuZGxlZCsrOwogCQkJZGF0YV9sZW4gPSAodW5zaWduZWQgbG9uZykgaHdfcC0+cnhbaV0uZGF0YV9sZW47CS8qIEdldCBsZW4gKi8KIAkJCWlmIChkYXRhX2xlbikgewpAQCAtMTQ2OCw2ICsxNDY2LDEwIEBACiAJCQkJaWYgKE5VTV9SWF9CVUZGID09IGh3X3AtPnJ4X2lfaW5kZXgpCiAJCQkJCWh3X3AtPnJ4X2lfaW5kZXggPSAwOwogCisJCQkJaHdfcC0+cnhfc2xvdCsrOworCQkJCWlmIChOVU1fUlhfQlVGRiA9PSBod19wLT5yeF9zbG90KQorCQkJCQlod19wLT5yeF9zbG90ID0gMDsKKwogCQkJCS8qICBBUy5IQVJOT0lTCiAJCQkJICogZnJlZSByZWNlaXZlIGJ1ZmZlciBvbmx5IHdoZW4KIAkJCQkgKiBidWZmZXIgaGFzIGJlZW4gaGFuZGxlZCAoZXRoX3J4KQpAQCAtMTY4Myw3ICsxNjg1LDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAkJbWlpcGh5X3JlZ2lzdGVyIChkZXYtPm5hbWUsCiAJCQkJIGVtYWM0eHhfbWlpcGh5X3JlYWQsIGVtYWM0eHhfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgpAQCAtMTcyNCw3ICsxNzI2LDcgQEAKIAogaW50IGVtYWM0eHhfbWlpcGh5X2luaXRpYWxpemUgKGJkX3QgKiBiaXMpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCW1paXBoeV9yZWdpc3RlciAoInBwY180eHhfZXRoMCIsCiAJCQkgZW1hYzR4eF9taWlwaHlfcmVhZCwgZW1hYzR4eF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCkBAIC0xNzMzLDQgKzE3MzUsNCBAQAogfQogI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICovCiAKLSNlbmRpZiAvKiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L01ha2VmaWxlIGIvY3B1L3BwYzR4eC9NYWtlZmlsZQppbmRleCA0MDY4YjUzLi5hZjlkYTViIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L01ha2VmaWxlCisrKyBiL2NwdS9wcGM0eHgvTWFrZWZpbGUKQEAgLTI3LDEyICsyNywxMiBAQAogCiBTVEFSVAk9IHN0YXJ0Lm8gcmVzZXR2ZWMubyBrZ2RiLm8KIFNPQkpTCT0gZGNyLm8KLUNPQkpTCT0gNDA1Z3BfcGNpLm8gNHh4X2VuZXQubyBcCitDT0JKUwk9IDQwNWdwX3BjaS5vIDQ0MHNwZV9wY2llLm8gNHh4X2VuZXQubyBcCiAJICBiZWRidWdfNDA1Lm8gY29tbXByb2MubyBcCiAJICBjcHUubyBjcHVfaW5pdC5vIGdwaW8ubyBpMmMubyBpbnRlcnJ1cHRzLm8gXAogCSAgbWlpcGh5Lm8gbmRmYy5vIHNkcmFtLm8gc2VyaWFsLm8gXAogCSAgNDB4X3NwZF9zZHJhbS5vIDQ0eF9zcGRfZGRyLm8gNDR4X3NwZF9kZHIyLm8gc3BlZWQubyBcCi0JICB0bGIubyB0cmFwcy5vIHVzYl9vaGNpLm8gdXNiZGV2Lm8gXAorCSAgdGxiLm8gdHJhcHMubyB1c2Jfb2hjaS5vIHVzYi5vIHVzYmRldi5vIFwKIAkgIDQ0MHNwZV9wY2llLm8KIAogU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9iZWRidWdfNDA1LmMgYi9jcHUvcHBjNHh4L2JlZGJ1Z180MDUuYwppbmRleCBhM2MyMTE5Li41ZWY1NjA3IDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L2JlZGJ1Z180MDUuYworKysgYi9jcHUvcHBjNHh4L2JlZGJ1Z180MDUuYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGJlZGJ1Zy9yZWdzLmg+CiAjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKSAmJiBkZWZpbmVkKENPTkZJR180eHgpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykgJiYgZGVmaW5lZChDT05GSUdfNHh4KQogCiAjZGVmaW5lIE1BWF9CUkVBS19QT0lOVFMgNAogCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L2Rjci5TIGIvY3B1L3BwYzR4eC9kY3IuUwppbmRleCA3MTAyMzY0Li45MzQ2NWEzIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L2Rjci5TCisrKyBiL2NwdS9wcGM0eHgvZGNyLlMKQEAgLTIyLDcgKzIyLDcgQEAKICAqLwogI2luY2x1ZGUgPGNvbmZpZy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfNHh4KSAmJiBkZWZpbmVkKENGR19DTURfU0VUR0VURENSKQorI2lmIGRlZmluZWQoQ09ORklHXzR4eCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX1NFVEdFVERDUikKIAogI2luY2x1ZGUgPHBwYzR4eC5oPgogCkBAIC0xOTUsNCArMTk1LDQgQEAKIAkJYmxyCQkJCS8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCiAuTGZlNDoJCS5zaXplCXNldF9kY3IsLkxmZTQtc2V0X2RjcgogLyogZW5kIHNldF9kY3IoKSAqLwotI2VuZGlmIC8qIENPTkZJR180eHggJiBDRkdfQ01EX1NFVEdFVERDUiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L2dwaW8uYyBiL2NwdS9wcGM0eHgvZ3Bpby5jCmluZGV4IDUyMzUyMDMuLjUwZjJmZGYgMTAwNjQ0Ci0tLSBhL2NwdS9wcGM0eHgvZ3Bpby5jCisrKyBiL2NwdS9wcGM0eHgvZ3Bpby5jCkBAIC0xODYsNiArMTg2LDcgQEAKIAkJCQkJCW91dDMyKEdQSU8wX1RDUiwgcmVnKTsKIAkJCQkJfQogCisjaWZkZWYgR1BJTzEKIAkJCQkJaWYgKGdwaW9fY29yZSA9PSBHUElPMSkgewogCQkJCQkJLyoKIAkJCQkJCSAqIFNldHVwIG91dHB1dCB2YWx1ZQpAQCAtMTkzLDE2ICsxOTQsMTcgQEAKIAkJCQkJCSAqIDAgLT4gbG93IGxldmVsCiAJCQkJCQkgKiBlbHNlIC0+IGRvbid0IHRvdWNoCiAJCQkJCQkgKi8KLQkJCQkJCXJlZyA9IGluMzIoR1BJTzBfT1IpOworCQkJCQkJcmVnID0gaW4zMihHUElPMV9PUik7CiAJCQkJCQlpZiAoZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5vdXRfdmFsID09IEdQSU9fT1VUXzEpCiAJCQkJCQkJcmVnIHw9ICgweDgwMDAwMDAwID4+IChpKSk7CiAJCQkJCQllbHNlIGlmIChncGlvX3RhYltncGlvX2NvcmVdW2ldLm91dF92YWwgPT0gR1BJT19PVVRfMCkKIAkJCQkJCQlyZWcgJj0gfigweDgwMDAwMDAwID4+IChpKSk7Ci0JCQkJCQlvdXQzMihHUElPMF9PUiwgcmVnKTsKKwkJCQkJCW91dDMyKEdQSU8xX09SLCByZWcpOwogCiAJCQkJCQlyZWcgPSBpbjMyKEdQSU8xX1RDUikgfCAoMHg4MDAwMDAwMCA+PiAoaSkpOwogCQkJCQkJb3V0MzIoR1BJTzFfVENSLCByZWcpOwogCQkJCQl9CisjZW5kaWYgLyogR1BJTzEgKi8KIAogCQkJCQlyZWcgPSBpbjMyKEdQSU9fT1MoY29yZV9hZGQrb2ZmcykpCiAJCQkJCQkmIH4oR1BJT19NQVNLID4+IChqKjIpKTsKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvaW50ZXJydXB0cy5jIGIvY3B1L3BwYzR4eC9pbnRlcnJ1cHRzLmMKaW5kZXggYzVhOWYwMi4uY2E1NjVjYyAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L3BwYzR4eC9pbnRlcnJ1cHRzLmMKQEAgLTYyOCw3ICs2MjgsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY5OCw0ICs2OTgsNCBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgva2dkYi5TIGIvY3B1L3BwYzR4eC9rZ2RiLlMKaW5kZXggYmUyODM0MC4uOGM0YmJmMiAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9rZ2RiLlMKKysrIGIvY3B1L3BwYzR4eC9rZ2RiLlMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIC8qCiAgKiBjYWNoZSBmbHVzaGluZyByb3V0aW5lcyBmb3Iga2dkYgogICovCkBAIC03NSw0ICs3NSw0IEBACiAJU1lOQwogCWJscgogCi0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvbmRmYy5jIGIvY3B1L3BwYzR4eC9uZGZjLmMKaW5kZXggZjYzZmM3OS4uMzk4NDU3NyAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9uZGZjLmMKKysrIGIvY3B1L3BwYzR4eC9uZGZjLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkgJiYgXAogCShkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1IpIHx8CSAgICAgXAogCSBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSWCkgfHwJICAgICBcCiAJIGRlZmluZWQoQ09ORklHXzQwNUVaKSkKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvc2RyYW0uYyBiL2NwdS9wcGM0eHgvc2RyYW0uYwppbmRleCBkNTIwY2QzLi4yNzI0ZDkxIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L3NkcmFtLmMKKysrIGIvY3B1L3BwYzR4eC9zZHJhbS5jCkBAIC0xODcsMTQgKzE4NywxNCBAQAogCQkvKgogCQkgKiBEaXNhYmxlIG1lbW9yeSBjb250cm9sbGVyLgogCQkgKi8KLQkJbXRzZHJhbTAobWVtX21jb3B0MSwgMHgwMDAwMDAwMCk7CisJCW10c2RyYW0obWVtX21jb3B0MSwgMHgwMDAwMDAwMCk7CiAKIAkJLyoKIAkJICogU2V0IE1CMENGIGZvciBiYW5rIDAuCiAJCSAqLwotCQltdHNkcmFtMChtZW1fbWIwY2YsIG1iMGNmW2ldLnJlZyk7Ci0JCW10c2RyYW0wKG1lbV9zZHRyMSwgc2R0cjEpOwotCQltdHNkcmFtMChtZW1fcnRyLCBjb21wdXRlX3J0cihzcGVlZCwgbWIwY2ZbaV0ucm93cywgNjQpKTsKKwkJbXRzZHJhbShtZW1fbWIwY2YsIG1iMGNmW2ldLnJlZyk7CisJCW10c2RyYW0obWVtX3NkdHIxLCBzZHRyMSk7CisJCW10c2RyYW0obWVtX3J0ciwgY29tcHV0ZV9ydHIoc3BlZWQsIG1iMGNmW2ldLnJvd3MsIDY0KSk7CiAKIAkJdWRlbGF5KDIwMCk7CiAKQEAgLTIwMywxNCArMjAzLDM0IEBACiAJCSAqIFNldCBEQ19FTiB0byAnMScgYW5kIEJSRF9QUkYgdG8gJzAxJyBmb3IgMTYgYnl0ZSBQTEIgQnVyc3QKIAkJICogcmVhZC9wcmVmZXRjaC4KIAkJICovCi0JCW10c2RyYW0wKG1lbV9tY29wdDEsIDB4ODA4MDAwMDApOworCQltdHNkcmFtKG1lbV9tY29wdDEsIDB4ODA4MDAwMDApOwogCiAJCXVkZWxheSgxMDAwMCk7CiAKIAkJaWYgKGdldF9yYW1fc2l6ZSgwLCBtYjBjZltpXS5zaXplKSA9PSBtYjBjZltpXS5zaXplKSB7CiAJCQkvKgotCQkJICogT0ssIHNpemUgZGV0ZWN0ZWQgLT4gYWxsIGRvbmUKKwkJCSAqIE9LLCBzaXplIGRldGVjdGVkLiAgRW5hYmxlIHNlY29uZCBiYW5rIGlmCisJCQkgKiBkZWZpbmVkIChhc3N1bWVzIHNhbWUgdHlwZSBhcyBiYW5rIDApCiAJCQkgKi8KKyNpZmRlZiBDT05GSUdfU0RSQU1fQkFOSzEKKwkJCXUzMiBiMWNyID0gbWIwY2ZbaV0uc2l6ZSB8IG1iMGNmW2ldLnJlZzsKKworCQkJbXRzZHJhbShtZW1fbWNvcHQxLCAweDAwMDAwMDAwKTsKKwkJCW10c2RyYW0obWVtX21iMWNmLCBiMWNyKTsgLyogU0RSQU0wX0IxQ1IgKi8KKwkJCW10c2RyYW0obWVtX21jb3B0MSwgMHg4MDgwMDAwMCk7CisJCQl1ZGVsYXkoMTAwMDApOworCisJCQkvKgorCQkJICogQ2hlY2sgaWYgMm5kIGJhbmsgaXMgcmVhbGx5IGF2YWlsYWJsZS4KKwkJCSAqIElmIHRoZSBzaXplIG5vdCBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QKKwkJCSAqIGJhbmssIHRoZW4gZGlzYWJsZSB0aGUgMm5kIGJhbmsgY29tcGxldGVseS4KKwkJCSAqLworCQkJaWYgKGdldF9yYW1fc2l6ZSgobG9uZyAqKW1iMGNmW2ldLnNpemUsIG1iMGNmW2ldLnNpemUpICE9CisJCQkgICAgbWIwY2ZbaV0uc2l6ZSkgeworCQkJCW10c2RyYW0obWVtX21iMWNmLCAwKTsKKwkJCQltdHNkcmFtKG1lbV9tY29wdDEsIDApOworCQkJfQorI2VuZGlmCiAJCQlyZXR1cm47CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3NkcmFtLmggYi9jcHUvcHBjNHh4L3NkcmFtLmgKaW5kZXggNjJiNTQ0Mi4uNGZiOWIxYSAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9zZHJhbS5oCisrKyBiL2NwdS9wcGM0eHgvc2RyYW0uaApAQCAtMjksOCArMjksNiBAQAogCiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAKLSNkZWZpbmUgbXRzZHJhbTAocmVnLCBkYXRhKSAgbXRkY3IobWVtY2ZnYSxyZWcpO210ZGNyKG1lbWNmZ2QsZGF0YSkKLQogI2RlZmluZSBPTkVfQklMTElPTgkxMDAwMDAwMDAwCiAKIHN0cnVjdCBzZHJhbV9jb25mX3MgewpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9zZXJpYWwuYyBiL2NwdS9wcGM0eHgvc2VyaWFsLmMKaW5kZXggZTYyZGQ5ZC4uNjA3MTJiMSAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9zZXJpYWwuYworKysgYi9jcHUvcHBjNHh4L3NlcmlhbC5jCkBAIC00NDgsMTIgKzQ0OCwxNyBAQAogCXVuc2lnbmVkIGxvbmcgaTsKIAl1bnNpZ25lZCBsb25nIGVzdDsJCS8qIGN1cnJlbnQgZXN0aW1hdGUgKi8KIAl1bnNpZ25lZCBsb25nIHBsbG91dGI7CisJdW5zaWduZWQgbG9uZyBjcHJfcGxsYzsKIAl1MzIgcmVnOwogCisJLyogY2hlY2sgdGhlIHBsbCBmZWVkYmFjayBzb3VyY2UgKi8KKwltZmNwcihjcHJwbGxjLCBjcHJfcGxsYyk7CisKIAlnZXRfc3lzX2luZm8oJnN5c2luZm8pOwogCi0JcGxsb3V0YiA9ICgoQ09ORklHX1NZU19DTEtfRlJFUSAqIHN5c2luZm8ucGxsRndkRGl2ICogc3lzaW5mby5wbGxGYmtEaXYpCi0JCSAgIC8gc3lzaW5mby5wbGxGd2REaXZCKTsKKwlwbGxvdXRiID0gKChDT05GSUdfU1lTX0NMS19GUkVRICogKChjcHJfcGxsYyAmIFBMTENfU1JDX01BU0spID8KKwkJc3lzaW5mby5wbGxGd2REaXZCIDogc3lzaW5mby5wbGxGd2REaXYpICogc3lzaW5mby5wbGxGYmtEaXYpIC8KKwkJc3lzaW5mby5wbGxGd2REaXZCKTsKIAl1ZGl2ID0gMjU2OwkJCS8qIEFzc3VtZSBsb3dlc3QgcG9zc2libGUgc2VyaWFsIGNsayAqLwogCWRpdiA9IHBsbG91dGIgLyAoMTYgKiBiYXVkcmF0ZSk7IC8qIHRvdGFsIGRpdmlzb3IgKi8KIAl1bWluID0gKHBsbG91dGIgLyBnZXRfT1BCX2ZyZXEoKSkgPDwgMTsJLyogMiB4IE9QQiBkaXZpc29yICovCkBAIC04NDMsNyArODQ4LDcgQEAKIAogI2VuZGlmCS8qIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIC8qCiAgIEFTIEhBUk5PSVMgOiBhY2NvcmRpbmcgdG8gQ09ORklHX0tHREJfU0VSX0lOREVYIGtnZGIgdXNlcyBzZXJpYWwgcG9ydAogICBudW1iZXIgMCBvciBudW1iZXIgMQpAQCAtOTQ5LDcgKzk1NCw3IEBACiAJcmV0dXJuOwogfQogI2VuZGlmCS8qIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKSAqLwotI2VuZGlmCS8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCiAKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvc3BlZWQuYyBiL2NwdS9wcGM0eHgvc3BlZWQuYwppbmRleCAwMjhiMTFhLi5kYTUzMzBhIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L3NwZWVkLmMKKysrIGIvY3B1L3BwYzR4eC9zcGVlZC5jCkBAIC03NzEsNiArNzcxLDcgQEAKIHZvaWQgZ2V0X3N5c19pbmZvIChQUEM0MDVfU1lTX0lORk8gKiBzeXNJbmZvKQogewogCXVuc2lnbmVkIGxvbmcgY3ByX3BsbGQ7CisJdW5zaWduZWQgbG9uZyBjcHJfcGxsYzsKIAl1bnNpZ25lZCBsb25nIGNwcl9wcmltYWQ7CiAJdW5zaWduZWQgbG9uZyBzeXNDbGtQZXJpb2RQcyA9IE9ORV9CSUxMSU9OIC8gKENPTkZJR19TWVNfQ0xLX0ZSRVEvMTAwMCk7CiAJdW5zaWduZWQgbG9uZyBwcmltYWRfY3B1ZHY7CkBAIC03ODAsNiArNzgxLDcgQEAKIAkgKiBSZWFkIFBMTCBNb2RlIHJlZ2lzdGVycwogCSAqLwogCW1mY3ByKGNwcnBsbGQsIGNwcl9wbGxkKTsKKwltZmNwcihjcHJwbGxjLCBjcHJfcGxsYyk7CiAKIAkvKgogCSAqIERldGVybWluZSBmb3J3YXJkIGRpdmlkZXIgQQpAQCAtNzg3LDIwICs3ODksMTggQEAKIAlzeXNJbmZvLT5wbGxGd2REaXYgPSAoKGNwcl9wbGxkICYgUExMRF9GV0RWQV9NQVNLKSA+PiAxNik7CiAKIAkvKgotCSAqIERldGVybWluZSBmb3J3YXJkIGRpdmlkZXIgQiAoc2hvdWxkIGJlIGVxdWFsIHRvIEEpCisJICogRGV0ZXJtaW5lIGZvcndhcmQgZGl2aWRlciBCCiAJICovCiAJc3lzSW5mby0+cGxsRndkRGl2QiA9ICgoY3ByX3BsbGQgJiBQTExEX0ZXRFZCX01BU0spID4+IDgpOwotCWlmIChzeXNJbmZvLT5wbGxGd2REaXZCID09IDApIHsKKwlpZiAoc3lzSW5mby0+cGxsRndkRGl2QiA9PSAwKQogCQlzeXNJbmZvLT5wbGxGd2REaXZCID0gODsKLQl9CiAKIAkvKgogCSAqIERldGVybWluZSBGQktfRElWLgogCSAqLwogCXN5c0luZm8tPnBsbEZia0RpdiA9ICgoY3ByX3BsbGQgJiBQTExEX0ZCRFZfTUFTSykgPj4gMjQpOwotCWlmIChzeXNJbmZvLT5wbGxGYmtEaXYgPT0gMCkgeworCWlmIChzeXNJbmZvLT5wbGxGYmtEaXYgPT0gMCkKIAkJc3lzSW5mby0+cGxsRmJrRGl2ID0gMjU2OwotCX0KIAogCS8qCiAJICogUmVhZCBDUFJfUFJJTUFEIHJlZ2lzdGVyCkBAIC04MTAsMzAgKzgxMCwzMCBAQAogCSAqIERldGVybWluZSBQTEJfRElWLgogCSAqLwogCXN5c0luZm8tPnBsbFBsYkRpdiA9ICgoY3ByX3ByaW1hZCAmIFBSSU1BRF9QTEJEVl9NQVNLKSA+PiAxNik7Ci0JaWYgKHN5c0luZm8tPnBsbFBsYkRpdiA9PSAwKSB7CisJaWYgKHN5c0luZm8tPnBsbFBsYkRpdiA9PSAwKQogCQlzeXNJbmZvLT5wbGxQbGJEaXYgPSAxNjsKLQl9CiAKIAkvKgogCSAqIERldGVybWluZSBFWFRCVVNfRElWLgogCSAqLwogCXN5c0luZm8tPnBsbEV4dEJ1c0RpdiA9IChjcHJfcHJpbWFkICYgUFJJTUFEX0VCQ0RWX01BU0spOwotCWlmIChzeXNJbmZvLT5wbGxFeHRCdXNEaXYgPT0gMCkgeworCWlmIChzeXNJbmZvLT5wbGxFeHRCdXNEaXYgPT0gMCkKIAkJc3lzSW5mby0+cGxsRXh0QnVzRGl2ID0gMTY7Ci0JfQogCiAJLyoKIAkgKiBEZXRlcm1pbmUgT1BCX0RJVi4KIAkgKi8KIAlzeXNJbmZvLT5wbGxPcGJEaXYgPSAoKGNwcl9wcmltYWQgJiBQUklNQURfT1BCRFZfTUFTSykgPj4gOCk7Ci0JaWYgKHN5c0luZm8tPnBsbE9wYkRpdiA9PSAwKSB7CisJaWYgKHN5c0luZm8tPnBsbE9wYkRpdiA9PSAwKQogCQlzeXNJbmZvLT5wbGxPcGJEaXYgPSAxNjsKLQl9CiAKIAkvKgogCSAqIERldGVybWluZSB0aGUgTSBmYWN0b3IKIAkgKi8KLQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogc3lzSW5mby0+cGxsRndkRGl2QjsKKwlpZiAoY3ByX3BsbGMgJiBQTExDX1NSQ19NQVNLKQorCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogc3lzSW5mby0+cGxsRndkRGl2QjsKKwllbHNlCisJCW0gPSBzeXNJbmZvLT5wbGxGYmtEaXYgKiBzeXNJbmZvLT5wbGxGd2REaXY7CiAKIAkvKgogCSAqIERldGVybWluZSBWQ08gY2xvY2sgZnJlcXVlbmN5CkBAIC04NDUsMTYgKzg0NSwxNyBAQAogCSAqIERldGVybWluZSBDUFUgY2xvY2sgZnJlcXVlbmN5CiAJICovCiAJcHJpbWFkX2NwdWR2ID0gKChjcHJfcHJpbWFkICYgUFJJTUFEX0NQVURWX01BU0spID4+IDI0KTsKLQlpZiAocHJpbWFkX2NwdWR2ID09IDApIHsKKwlpZiAocHJpbWFkX2NwdWR2ID09IDApCiAJCXByaW1hZF9jcHVkdiA9IDE2OwotCX0KIAotCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSAoQ09ORklHX1NZU19DTEtfRlJFUSAqIHN5c0luZm8tPnBsbEZia0RpdikgLyBwcmltYWRfY3B1ZHY7CisJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IChDT05GSUdfU1lTX0NMS19GUkVRICogbSkgLworCQlzeXNJbmZvLT5wbGxGd2REaXYgLyBwcmltYWRfY3B1ZHY7CiAKIAkvKgogCSAqIERldGVybWluZSBQTEIgY2xvY2sgZnJlcXVlbmN5CiAJICovCi0Jc3lzSW5mby0+ZnJlcVBMQiA9IChDT05GSUdfU1lTX0NMS19GUkVRICogc3lzSW5mby0+cGxsRmJrRGl2KSAvIHN5c0luZm8tPnBsbFBsYkRpdjsKKwlzeXNJbmZvLT5mcmVxUExCID0gKENPTkZJR19TWVNfQ0xLX0ZSRVEgKiBtKSAvCisJCXN5c0luZm8tPnBsbEZ3ZERpdiAvIHN5c0luZm8tPnBsbFBsYkRpdjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3N0YXJ0LlMgYi9jcHUvcHBjNHh4L3N0YXJ0LlMKaW5kZXggNjA4NmI2Yy4uOTYyNmI2NSAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9zdGFydC5TCisrKyBiL2NwdS9wcGM0eHgvc3RhcnQuUwpAQCAtMTIyMiw3ICsxMjIyLDcgQEAKICAqLwogI2lmZGVmIENPTkZJR180NDAKICAgICAgICAuZ2xvYmwgIGRjYWNoZV9kaXNhYmxlCi0gICAgICAgLmdsb2JsICBpY2FjaGVfZGlzYWJsZQkKKyAgICAgICAuZ2xvYmwgIGljYWNoZV9kaXNhYmxlCiAgICAgICAgLmdsb2JsICBpY2FjaGVfZW5hYmxlCiBkY2FjaGVfZGlzYWJsZToKIGljYWNoZV9kaXNhYmxlOgpAQCAtMTg3MCwyOCArMTg3MCw2IEBACiAJbXRkY3IJZWJjY2ZnZCxyMwogI2VuZGlmCiAKLSNpZm5kZWYgQ0ZHX0NQQzBfUENJCi0JbGkJcjMsQ1BDMF9QQ0lfSE9TVF9DRkdfRU4KLSNpZmRlZiBDT05GSUdfQlVCSU5HQQotCS8qCi0JIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JISBDaGVjayBGUEdBIGZvciBQQ0kgaW50ZXJuYWwvZXh0ZXJuYWwgYXJiaXRyYXRpb24KLQkhICAgSWYgYm9hcmQgaXMgc2V0IHRvIGludGVybmFsIGFyYml0cmF0aW9uLCB1cGRhdGUgY3BjMF9wY2kKLQkhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkqLwotCWFkZGlzCXI1LHIwLEZQR0FfUkVHMUBoICAgICAgLyogc2V0IG9mZnNldCBmb3IgRlBHQV9SRUcxICovCi0Jb3JpCXI1LHI1LEZQR0FfUkVHMUBsCi0JbGJ6CXI1LDB4MChyNSkJCS8qIHJlYWQgdG8gZ2V0IFBDSSBhcmIgc2VsZWN0aW9uICovCi0JYW5kaS4JcjYscjUsRlBHQV9SRUcxX1BDSV9JTlRfQVJCICAvKiB1c2luZyBpbnRlcm5hbCBhcmJpdGVyID8qLwotCWJlcQkuLnBjaV9jZmdfc2V0CQkgIC8qIGlmIG5vdCBzZXQsIHRoZW4gYnlwYXNzIHJlZyB3cml0ZSovCi0jZW5kaWYKLQlvcmkJcjMscjMsQ1BDMF9QQ0lfQVJCSVRfRU4KLSNlbHNlIC8qIENGR19DUEMwX1BDSSAqLwotCWxpCXIzLENGR19DUEMwX1BDSQotI2VuZGlmIC8qIENGR19DUEMwX1BDSSAqLwotLi5wY2lfY2ZnX3NldDoKLQltdGRjcglDUEMwX1BDSSwgcjMJCSAvKiBFbmFibGUgaW50ZXJuYWwgYXJiaXRlciovCi0KIAkvKgogCSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSEgQ2hlY2sgdG8gc2VlIGlmIGNoaXAgaXMgaW4gYnlwYXNzIG1vZGUuCkBAIC0xOTQ3LDExICsxOTI1LDUwIEBACiAuLm5vX3BsbHNldDoKICNlbmRpZiAvKiBDT05GSUdfQlVCSU5HQSAqLwogCisjaWZkZWYgQ09ORklHX1RBSUhVCisJbWZkY3IJcjQsIENQQzBfQk9PVAorCWFuZGkuCXI1LCByNCwgQ1BDMF9CT09UX1NFUEBsCisJYm5lCXN0cmFwXzEJCQkvKiBzZXJpYWwgZWVwcm9tIHByZXNlbnQgKi8KKwlhZGRpcwlyNSwwLENQTERfUkVHMF9BRERSQGgKKwlvcmkJcjUscjUsQ1BMRF9SRUcwX0FERFJAbAorCWFuZGkuCXI1LCByNSwgMHgxMAorCWJuZQlfcGNpXzY2bWh6CisjZW5kaWYgLyogQ09ORklHX1RBSUhVICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19aRVVTKQorCW1mZGNyCXI0LCBDUEMwX0JPT1QKKwlhbmRpLglyNSwgcjQsIENQQzBfQk9PVF9TRVBAbAorCWJuZQlzdHJhcF8xICAJLyogc2VyaWFsIGVlcHJvbSBwcmVzZW50ICovCisJbGlzCXIzLDB4MDAwMAorCWFkZGkJcjMscjMsMHgzMDMwCisJbGlzCXI0LDB4ODA0MgorCWFkZGkJcjQscjQsMHgyMjNlCisJYgkxZgorc3RyYXBfMToKKwltZmRjcglyMywgQ1BDMF9QTExNUjAKKwltZmRjcglyNCwgQ1BDMF9QTExNUjEKKwliCTFmCisjZW5kaWYKKwogCWFkZGlzCXIzLDAsUExMTVIwX0RFRkFVTFRAaAkgICAgLyogUExMTVIwIGRlZmF1bHQgdmFsdWUgKi8KIAlvcmkJcjMscjMsUExMTVIwX0RFRkFVTFRAbAkgICAvKiAqLwogCWFkZGlzCXI0LDAsUExMTVIxX0RFRkFVTFRAaAkgICAgLyogUExMTVIxIGRlZmF1bHQgdmFsdWUgKi8KIAlvcmkJcjQscjQsUExMTVIxX0RFRkFVTFRAbAkgICAvKiAqLwogCisjaWZkZWYgQ09ORklHX1RBSUhVCisJYgkxZgorX3BjaV82Nm1oejoKKwlhZGRpcwlyMywwLFBMTE1SMF9ERUZBVUxUX1BDSTY2QGgKKwlvcmkJcjMscjMsUExMTVIwX0RFRkFVTFRfUENJNjZAbAorCWFkZGlzCXI0LDAsUExMTVIxX0RFRkFVTFRfUENJNjZAaAorCW9yaQlyNCxyNCxQTExNUjFfREVGQVVMVF9QQ0k2NkBsCisJYgkxZgorc3RyYXBfMToKKwltZmRjcglyMywgQ1BDMF9QTExNUjAKKwltZmRjcglyNCwgQ1BDMF9QTExNUjEKKyNlbmRpZiAvKiBDT05GSUdfVEFJSFUgKi8KKworMToKIAliCXBsbF93cml0ZQkJICAvKiBXcml0ZSB0aGUgQ1BDMF9QTExNUiB3aXRoIG5ldyB2YWx1ZSAqLwogCiBwbGxfZG9uZToKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvdGxiLmMgYi9jcHUvcHBjNHh4L3RsYi5jCmluZGV4IDA0OWE3ODUuLjA5ODY5NGMgMTAwNjQ0Ci0tLSBhL2NwdS9wcGM0eHgvdGxiLmMKKysrIGIvY3B1L3BwYzR4eC90bGIuYwpAQCAtMjUsNyArMjUsNiBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfNDQwKQogCi0jaW5jbHVkZSA8cHBjNHh4Lmg+CiAjaW5jbHVkZSA8cHBjNDQwLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgpAQCAtMzYsNiArMzUsNjcgQEAKIAl1bnNpZ25lZCBsb25nIHRsYl93b3JkMl9pX3ZhbHVlOwogfSByZWdpb25fdDsKIAordm9pZCByZW1vdmVfdGxiKHUzMiB2YWRkciwgdTMyIHNpemUpCit7CisJaW50IGk7CisJdTMyIHRsYl93b3JkMF92YWx1ZTsKKwl1MzIgdGxiX3ZhZGRyOworCXUzMiB0bGJfc2l6ZSA9IDA7CisKKwkvKiBGaXJzdCwgZmluZCB0aGUgaW5kZXggb2YgYSBUTEIgZW50cnkgbm90IGJlaW5nIHVzZWQgKi8KKwlmb3IgKGk9MDsgaTxQUEM0WFhfVExCX1NJWkU7IGkrKykgeworCQl0bGJfd29yZDBfdmFsdWUgPSBtZnRsYjEoaSk7CisJCXRsYl92YWRkciA9IFRMQl9XT1JEMF9FUE5fREVDT0RFKHRsYl93b3JkMF92YWx1ZSk7CisJCWlmICgoKHRsYl93b3JkMF92YWx1ZSAmIFRMQl9XT1JEMF9WX01BU0spID09IFRMQl9XT1JEMF9WX0VOQUJMRSkgJiYKKwkJICAgICh0bGJfdmFkZHIgPj0gdmFkZHIpKSB7CisJCQkvKgorCQkJICogVExCIGlzIGVuYWJsZWQgYW5kIHN0YXJ0IGFkZHJlc3MgaXMgbG93ZXIgb3IgZXF1YWwKKwkJCSAqIHRoYW4gdGhlIGFyZWEgd2UgYXJlIGxvb2tpbmcgZm9yLiBOb3cgd2Ugb25seSBoYXZlCisJCQkgKiB0byBjaGVjayB0aGUgc2l6ZS9lbmQgYWRkcmVzcyBmb3IgYSBtYXRjaC4KKwkJCSAqLworCQkJc3dpdGNoICh0bGJfd29yZDBfdmFsdWUgJiBUTEJfV09SRDBfU0laRV9NQVNLKSB7CisJCQljYXNlIFRMQl9XT1JEMF9TSVpFXzFLQjoKKwkJCQl0bGJfc2l6ZSA9IDEgPDwgMTA7CisJCQkJYnJlYWs7CisJCQljYXNlIFRMQl9XT1JEMF9TSVpFXzRLQjoKKwkJCQl0bGJfc2l6ZSA9IDQgPDwgMTA7CisJCQkJYnJlYWs7CisJCQljYXNlIFRMQl9XT1JEMF9TSVpFXzE2S0I6CisJCQkJdGxiX3NpemUgPSAxNiA8PCAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfNjRLQjoKKwkJCQl0bGJfc2l6ZSA9IDY0IDw8IDEwOworCQkJCWJyZWFrOworCQkJY2FzZSBUTEJfV09SRDBfU0laRV8yNTZLQjoKKwkJCQl0bGJfc2l6ZSA9IDI1NiA8PCAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfMU1COgorCQkJCXRsYl9zaXplID0gMSA8PCAyMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfMTZNQjoKKwkJCQl0bGJfc2l6ZSA9IDE2IDw8IDIwOworCQkJCWJyZWFrOworCQkJY2FzZSBUTEJfV09SRDBfU0laRV8yNTZNQjoKKwkJCQl0bGJfc2l6ZSA9IDI1NiA8PCAyMDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIE5vdyBjaGVjayB0aGUgZW5kLWFkZHJlc3MgaWYgaXQncyBpbiB0aGUgcmFuZ2UKKwkJCSAqLworCQkJaWYgKCh0bGJfdmFkZHIgKyB0bGJfc2l6ZSAtIDEpIDw9ICh2YWRkciArIHNpemUgLSAxKSkKKwkJCQkvKgorCQkJCSAqIEZvdW5kIGEgVExCIGluIHRoZSByYW5nZS4KKwkJCQkgKiBEaXNhYmxlIGl0IGJ5IHdyaXRpbmcgMCB0byB0bGIwIHdvcmQuCisJCQkJICovCisJCQkJbXR0bGIxKGksIDApOworCQl9CisJfQorCisJLyogRXhlY3V0ZSBhbiBJU1lOQyBpbnN0cnVjdGlvbiBzbyB0aGF0IHRoZSBuZXcgVExCIGVudHJ5IHRha2VzIGVmZmVjdCAqLworCWFzbSgiaXN5bmMiKTsKK30KKwogc3RhdGljIGludCBhZGRfdGxiX2VudHJ5KHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAogCQkJIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAogCQkJIHVuc2lnbmVkIGxvbmcgdGxiX3dvcmQwX3NpemVfdmFsdWUsCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3RyYXBzLmMgYi9jcHUvcHBjNHh4L3RyYXBzLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlYjk0MjBlLi5mNTM2NWNiCi0tLSBhL2NwdS9wcGM0eHgvdHJhcHMuYworKysgYi9jcHUvcHBjNHh4L3RyYXBzLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogaW50ICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC03OCw3ICs3OCw3IEBACiAjZGVmaW5lIEVTUl9ESVogMHgwMDQwMDAwMAogI2RlZmluZSBFU1JfVTBGIDB4MDAwMDgwMDAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMTQ3LDE4ICsxNDcsMjUgQEAKIAl1bnNpZ25lZCBsb25nIGZpeHVwLCB2YWw7CiAjaWYgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpCiAJdTMyIHZhbHVlMjsKKwlpbnQgY29ycl9lY2MgPSAwOworCWludCB1bmNvcnJfZWNjID0gMDsKICNlbmRpZgogCi0JLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgotCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCi0JICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkvKiBQcm9iaW5nIFBDSShFKSB1c2luZyBjb25maWcgY3ljbGVzIG1heSBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuIFRvIGdyYWNlZnVsbHkgcmVjb3ZlciBpbiBzdWNoCisJICogc2NlbmFyaW9zIGNvbmZpZyByZWFkL3dyaXRlIHJvdXRpbmVzIG5lZWQgdG8gYmUgaW5zdHJ1bWVudGVkIGluCisJICogb3JkZXIgdG8gcmV0dXJuIHZpYSBmaXh1cCBoYW5kbGVyLiBGb3IgZXhhbXBsZXMgcmVmZXIgdG8KKwkgKiBwY2llX2luXzgoKSwgcGNpZV9pbl9sZTE2KCkgYW5kIHBjaWVfaW5fbGUzMigpCiAJICovCiAJaWYgKChmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGUocmVncy0+bmlwKSkgIT0gMCkgewogCQlyZWdzLT5uaXAgPSBmaXh1cDsKKwkJdmFsID0gbWZzcHIoTUNTUik7CisJCS8qIENsZWFyIE1DU1IgKi8KKwkJbXRzcHIoU1BSTl9NQ1NSLCB2YWwpOwogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjE0LDE0ICsyMjEsMjIgQEAKIAkJcHJpbnRmKCJERFIwOiBBdCBsZWFzdCBvbmUgaW50ZXJydXB0IGFjdGl2ZVxuIik7CiAJaWYgKHZhbCAmIDB4NDApCiAJCXByaW50ZigiRERSMDogRFJBTSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZS5cbiIpOwotCWlmICh2YWwgJiAweDIwKQorCWlmICh2YWwgJiAweDIwKSB7CiAJCXByaW50ZigiRERSMDogTXVsdGlwbGUgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnRzLlxuIik7Ci0JaWYgKHZhbCAmIDB4MTApCisJCXVuY29ycl9lY2MgPSAxOworCX0KKwlpZiAodmFsICYgMHgxMCkgewogCQlwcmludGYoIkREUjA6IFNpbmdsZSB1bmNvcnJlY3RhYmxlIEVDQyBldmVudC5cbiIpOwotCWlmICh2YWwgJiAweDA4KQorCQl1bmNvcnJfZWNjID0gMTsKKwl9CisJaWYgKHZhbCAmIDB4MDgpIHsKIAkJcHJpbnRmKCJERFIwOiBNdWx0aXBsZSBjb3JyZWN0YWJsZSBFQ0MgZXZlbnRzLlxuIik7Ci0JaWYgKHZhbCAmIDB4MDQpCisJCWNvcnJfZWNjID0gMTsKKwl9CisJaWYgKHZhbCAmIDB4MDQpIHsKIAkJcHJpbnRmKCJERFIwOiBTaW5nbGUgY29ycmVjdGFibGUgRUNDIGV2ZW50LlxuIik7CisJCWNvcnJfZWNjID0gMTsKKwl9CiAJaWYgKHZhbCAmIDB4MDIpCiAJCXByaW50ZigiTXVsdGlwbGUgYWNjZXNzZXMgb3V0c2lkZSB0aGUgZGVmaW5lZCIKIAkJICAgICAgICIgcGh5c2ljYWwgbWVtb3J5IHNwYWNlIGRldGVjdGVkXG4iKTsKQEAgLTI1MiwxMSArMjY3LDExIEBACiAJCXByaW50ZigiRERSMDogTm8gRERSMCBlcnJvciBrbm93IDB4JXggJXBcbiIsIHZhbCwgdmFsdWUyKTsKIAl9CiAJbWZzZHJhbShERFIwXzIzLCB2YWwpOwotCWlmICggKHZhbCA+PiAxNikgJiAweGZmKQorCWlmICgoKHZhbCA+PiAxNikgJiAweGZmKSAmJiBjb3JyX2VjYykKIAkJcHJpbnRmKCJERFIwOiBTeW5kcm9tZSBmb3IgY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JXhcbiIsCiAJCSAgICAgICAodmFsID4+IDE2KSAmIDB4ZmYpOwogCW1mc2RyYW0oRERSMF8yMywgdmFsKTsKLQlpZiAoICh2YWwgPj4gOCkgJiAweGZmKQorCWlmICgoKHZhbCA+PiA4KSAmIDB4ZmYpICYmIHVuY29ycl9lY2MpCiAJCXByaW50ZigiRERSMDogU3luZHJvbWUgZm9yIHVuY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JXhcbiIsCiAJCSAgICAgICAodmFsID4+IDgpICYgMHhmZik7CiAJbWZzZHJhbShERFIwXzMzLCB2YWwpOwpAQCAtMjY0LDI4ICsyNzksMjggQEAKIAkJcHJpbnRmKCJERFIwOiBBZGRyZXNzIG9mIGNvbW1hbmQgdGhhdCBjYXVzZWQgYW4gIgogCQkgICAgICAgIk91dC1vZi1SYW5nZSBpbnRlcnJ1cHQgJXBcbiIsIHZhbCk7CiAJbWZzZHJhbShERFIwXzM0LCB2YWwpOwotCWlmICh2YWwpCisJaWYgKHZhbCAmJiB1bmNvcnJfZWNjKQogCQlwcmludGYoIkREUjA6IEFkZHJlc3Mgb2YgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnQgJXBcbiIsIHZhbCk7CiAJbWZzZHJhbShERFIwXzM1LCB2YWwpOwotCWlmICh2YWwpCisJaWYgKHZhbCAmJiB1bmNvcnJfZWNjKQogCQlwcmludGYoIkREUjA6IEFkZHJlc3Mgb2YgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnQgJXBcbiIsIHZhbCk7CiAJbWZzZHJhbShERFIwXzM2LCB2YWwpOwotCWlmICh2YWwpCisJaWYgKHZhbCAmJiB1bmNvcnJfZWNjKQogCQlwcmludGYoIkREUjA6IERhdGEgb2YgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnQgMHglMDh4XG4iLCB2YWwpOwogCW1mc2RyYW0oRERSMF8zNywgdmFsKTsKLQlpZiAodmFsKQorCWlmICh2YWwgJiYgdW5jb3JyX2VjYykKIAkJcHJpbnRmKCJERFIwOiBEYXRhIG9mIHVuY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JTA4eFxuIiwgdmFsKTsKIAltZnNkcmFtKEREUjBfMzgsIHZhbCk7Ci0JaWYgKHZhbCkKKwlpZiAodmFsICYmIGNvcnJfZWNjKQogCQlwcmludGYoIkREUjA6IEFkZHJlc3Mgb2YgY29ycmVjdGFibGUgRUNDIGV2ZW50ICVwXG4iLCB2YWwpOwogCW1mc2RyYW0oRERSMF8zOSwgdmFsKTsKLQlpZiAodmFsKQorCWlmICh2YWwgJiYgY29ycl9lY2MpCiAJCXByaW50ZigiRERSMDogQWRkcmVzcyBvZiBjb3JyZWN0YWJsZSBFQ0MgZXZlbnQgJXBcbiIsIHZhbCk7CiAJbWZzZHJhbShERFIwXzQwLCB2YWwpOwotCWlmICh2YWwpCisJaWYgKHZhbCAmJiBjb3JyX2VjYykKIAkJcHJpbnRmKCJERFIwOiBEYXRhIG9mIGNvcnJlY3RhYmxlIEVDQyBldmVudCAweCUwOHhcbiIsIHZhbCk7CiAJbWZzZHJhbShERFIwXzQxLCB2YWwpOwotCWlmICh2YWwpCisJaWYgKHZhbCAmJiBjb3JyX2VjYykKIAkJcHJpbnRmKCJERFIwOiBEYXRhIG9mIGNvcnJlY3RhYmxlIEVDQyBldmVudCAweCUwOHhcbiIsIHZhbCk7CiAjZW5kaWYgLyogQ09ORklHXzQ0MEVQWCAqLwogI2VuZGlmIC8qIENPTkZJR180NDAgKi8KQEAgLTI5Nyw3ICszMTIsNyBAQAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTMxMiw3ICszMjcsNyBAQAogewogCWxvbmcgZXNyX3ZhbDsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTM0OSw3ICszNjQsNyBAQAogdm9pZAogVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0zNjQsNyArMzc5LDcgQEAKIHsKIAlwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOwogCXNob3dfcmVncyhyZWdzKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIAlkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3VzYi5jIGIvY3B1L3BwYzR4eC91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzJlZDhjCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L3BwYzR4eC91c2IuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBNYXJrdXMgS2xvdHpidWVjaGVyLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxta0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpCisKKyNpbmNsdWRlICJ1c2JkZXYuaCIKKworaW50IHVzYl9jcHVfaW5pdCh2b2lkKQoreworCisjaWYgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkKKwl1c2JfZGV2X2luaXQoKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X3N0b3Aodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfaW5pdF9mYWlsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpICovCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3VzYmRldi5jIGIvY3B1L3BwYzR4eC91c2JkZXYuYwppbmRleCA2MTQwZDJhLi41OTI0YTZjIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L3VzYmRldi5jCisrKyBiL2NwdS9wcGM0eHgvdXNiZGV2LmMKQEAgLTMsNyArMyw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi0jaWYgKGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCisjaWYgKGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpKSAmJiBkZWZpbmVkKENPTkZJR19DTURfVVNCKQogCiAjaW5jbHVkZSA8dXNiLmg+CiAjaW5jbHVkZSAidXNiZGV2LmgiCmRpZmYgLS1naXQgYS9jcHUvcHhhL01ha2VmaWxlIGIvY3B1L3B4YS9NYWtlZmlsZQppbmRleCBjZGVkN2ZmLi44YjQzNjdlIDEwMDY0NAotLS0gYS9jcHUvcHhhL01ha2VmaWxlCisrKyBiL2NwdS9weGEvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIExJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCiAKIFNUQVJUCT0gc3RhcnQubwotQ09CSlMJPSBzZXJpYWwubyBpbnRlcnJ1cHRzLm8gY3B1Lm8gaTJjLm8gcHhhZmIubyBtbWMubworQ09CSlMJPSBzZXJpYWwubyBpbnRlcnJ1cHRzLm8gY3B1Lm8gaTJjLm8gcHhhZmIubyBtbWMubyB1c2IubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9weGEvdXNiLmMgYi9jcHUvcHhhL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZjQ1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvcHhhL3VzYi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIE1hcmt1cyBLbG90emJ1ZWNoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPG1rQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfTkVXKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkKKyMgaWYgZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKSB8fCBkZWZpbmVkKENPTkZJR19QWEEyN1gpCisKKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCitpbnQgdXNiX2NwdV9pbml0KCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfTU9OQUhBTlMpCisJLyogRW5hYmxlIFVTQiBob3N0IGNsb2NrLiAqLworCUNLRU5BIHw9IChDS0VOQV8yX1VTQkhPU1QgfCAgQ0tFTkFfMjBfVURDKTsKKwl1ZGVsYXkoMTAwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1BYQTI3WCkKKwkvKiBFbmFibGUgVVNCIGhvc3QgY2xvY2suICovCisJQ0tFTiB8PSBDS0VOMTBfVVNCSE9TVDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKQorCS8qIENvbmZpZ3VyZSBQb3J0IDIgZm9yIEhvc3QgKFVTQiBDbGllbnQgUmVnaXN0ZXJzKSAqLworCVVQMk9DUiA9IDB4MzAwMGM7CisjZW5kaWYKKworCVVIQ0hSIHw9IFVIQ0hSX0ZIUjsKKwl3YWl0X21zKDExKTsKKwlVSENIUiAmPSB+VUhDSFJfRkhSOworCisJVUhDSFIgfD0gVUhDSFJfRlNCSVI7CisJd2hpbGUgKFVIQ0hSICYgVUhDSFJfRlNCSVIpCisJCXVkZWxheSgxKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9NT05BSEFOUykKKwlVSENIUiAmPSB+VUhDSFJfU1NFUDA7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19QWEEyN1gpCisJVUhDSFIgJj0gflVIQ0hSX1NTRVAyOworI2VuZGlmCisJVUhDSFIgJj0gflVIQ0hSX1NTRVAxOworCVVIQ0hSICY9IH5VSENIUl9TU0U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfc3RvcCgpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X2luaXRfZmFpbCgpCit7CisJcmV0dXJuIDA7Cit9CisKKyMgZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKSB8fCBkZWZpbmVkKENPTkZJR19QWEEyN1gpICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0kpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKSAqLwpkaWZmIC0tZ2l0IGEvZGlzay9wYXJ0LmMgYi9kaXNrL3BhcnQuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDI1NWIxNDAuLjU2Yjk0MjcKLS0tIGEvZGlzay9wYXJ0LmMKKysrIGIvZGlzay9wYXJ0LmMKQEAgLTM0LDkgKzM0LDkgQEAKICNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQogI2VuZGlmCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApCiAKQEAgLTQ2LDEzICs0NiwxMyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBibG9ja19kcnZyIGJsb2NrX2RydnJbXSA9IHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKIAl7IC5uYW1lID0gImlkZSIsIC5nZXRfZGV2ID0gaWRlX2dldF9kZXYsIH0sCiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKQogCXsgLm5hbWUgPSAic2NzaSIsIC5nZXRfZGV2ID0gc2NzaV9nZXRfZGV2LCB9LAogI2VuZGlmCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgJiYgZGVmaW5lZChDT05GSUdfVVNCX1NUT1JBR0UpKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpICYmIGRlZmluZWQoQ09ORklHX1VTQl9TVE9SQUdFKQogCXsgLm5hbWUgPSAidXNiIiwgLmdldF9kZXYgPSB1c2Jfc3Rvcl9nZXRfZGV2LCB9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DKQpAQCAtODYsOSArODYsOSBAQAogfQogI2VuZGlmCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApCiAKQEAgLTE3NCwxMyArMTc0LDEyIEBACiAJCXB1dHMgKCIgICAgICAgICAgICBDYXBhY2l0eTogbm90IGF2YWlsYWJsZVxuIik7CiAJfQogfQotI2VuZGlmCS8qIENGR19DTURfSURFIHx8IENGR19DTURfU0NTSSB8fCBDRkdfQ01EX1VTQiB8fCBDT05GSUdfTU1DICovCisjZW5kaWYKIAotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCXx8IFwKKyNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfVVNCKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX01NQykJCXx8IFwKLSAgICAgKGRlZmluZWQoQ09ORklHX01NQykgJiYgZGVmaW5lZChDT05GSUdfTFBDMjI5MikpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSAgICAgICAgICApCiAKICNpZiBkZWZpbmVkKENPTkZJR19NQUNfUEFSVElUSU9OKSB8fCBcCkBAIC0yMjMsNyArMjIyLDcgQEAKIGludCBnZXRfcGFydGl0aW9uX2luZm8gKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQgcGFydAogCQkJCQksIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pCiB7Ci0JCXN3aXRjaCAoZGV2X2Rlc2MtPnBhcnRfdHlwZSkgeworCXN3aXRjaCAoZGV2X2Rlc2MtPnBhcnRfdHlwZSkgewogI2lmZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAJY2FzZSBQQVJUX1RZUEVfTUFDOgogCQlpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvX21hYyhkZXZfZGVzYyxwYXJ0LGluZm8pID09IDApIHsKQEAgLTMzMSw0ICszMzAsNCBAQAogIyBlcnJvciBub3IgQ09ORklHX0lTT19QQVJUSVRJT04gY29uZmlndXJlZCEKICNlbmRpZgogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSB8fCBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc2svcGFydF9hbWlnYS5jIGIvZGlzay9wYXJ0X2FtaWdhLmMKaW5kZXggNDFlNjhmYy4uNmMzZDc0OCAxMDA2NDQKLS0tIGEvZGlzay9wYXJ0X2FtaWdhLmMKKysrIGIvZGlzay9wYXJ0X2FtaWdhLmMKQEAgLTI2LDkgKzI2LDkgQEAKICNpbmNsdWRlIDxpZGUuaD4KICNpbmNsdWRlICJwYXJ0X2FtaWdhLmgiCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApICYmIGRlZmluZWQoQ09ORklHX0FNSUdBX1BBUlRJVElPTikKIApkaWZmIC0tZ2l0IGEvZGlzay9wYXJ0X2Rvcy5jIGIvZGlzay9wYXJ0X2Rvcy5jCmluZGV4IDEzM2VlNzkuLjQ3MDdmODAgMTAwNjQ0Ci0tLSBhL2Rpc2svcGFydF9kb3MuYworKysgYi9kaXNrL3BhcnRfZG9zLmMKQEAgLTM1LDkgKzM1LDkgQEAKICNpbmNsdWRlIDxpZGUuaD4KICNpbmNsdWRlICJwYXJ0X2Rvcy5oIgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKSAmJiBkZWZpbmVkKENPTkZJR19ET1NfUEFSVElUSU9OKQogCkBAIC0yNDgsNCArMjQ4LDQgQEAKIH0KIAogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBDT05GSUdfRE9TX1BBUlRJVElPTiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kaXNrL3BhcnRfaXNvLmMgYi9kaXNrL3BhcnRfaXNvLmMKaW5kZXggMDczNTMyNC4uMDZkZDc1ZSAxMDA2NDQKLS0tIGEvZGlzay9wYXJ0X2lzby5jCisrKyBiL2Rpc2svcGFydF9pc28uYwpAQCAtMjUsOSArMjUsOSBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlICJwYXJ0X2lzby5oIgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKSAmJiBkZWZpbmVkKENPTkZJR19JU09fUEFSVElUSU9OKQogCkBAIC0yNTcsNCArMjU3LDQgQEAKIAlyZXR1cm4oZ2V0X3BhcnRpdGlvbl9pbmZvX2lzb192ZXJiKGRldl9kZXNjLDAsJmluZm8sMCkpOwogfQogCi0jZW5kaWYgLyogKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkpICYmIGRlZmluZWQoQ09ORklHX0lTT19QQVJUSVRJT04pICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc2svcGFydF9tYWMuYyBiL2Rpc2svcGFydF9tYWMuYwppbmRleCA4YzIzZTIxLi5kMzAzYTczIDEwMDY0NAotLS0gYS9kaXNrL3BhcnRfbWFjLmMKKysrIGIvZGlzay9wYXJ0X21hYy5jCkBAIC0zNCw5ICszNCw5IEBACiAjaW5jbHVkZSA8aWRlLmg+CiAjaW5jbHVkZSAicGFydF9tYWMuaCIKIAotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCXx8IFwKKyNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfVVNCKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX01NQykgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICkgJiYgZGVmaW5lZChDT05GSUdfTUFDX1BBUlRJVElPTikKIApAQCAtMjUxLDQgKzI1MSw0IEBACiAJcmV0dXJuICgwKTsKIH0KIAotI2VuZGlmCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgQ09ORklHX01BQ19QQVJUSVRJT04gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5KRkZTMiBiL2RvYy9SRUFETUUuSkZGUzIKaW5kZXggMjcwZGE5MC4uYzVkNjdmZCAxMDA2NDQKLS0tIGEvZG9jL1JFQURNRS5KRkZTMgorKysgYi9kb2MvUkVBRE1FLkpGRlMyCkBAIC0yLDcgKzIsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSkZGUzIgaW4gVS1Cb290IGlzIGEgcmVhZCBvbmx5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBmaWxlIHN5c3RlbSBpbgotTGludXggd2l0aCB0aGUgc2FtZSBuYW1lLiBUbyB1c2UgSkZGUzIgZGVmaW5lIENGR19DTURfSkZGUzIuCitMaW51eCB3aXRoIHRoZSBzYW1lIG5hbWUuIFRvIHVzZSBKRkZTMiBkZWZpbmUgQ09ORklHX0NNRF9KRkZTMi4KIAogVGhlIG1vZHVsZSBhZGRzIHRocmVlIG5ldyBjb21tYW5kcy4KIGZzbG9hZCAgLSBsb2FkIGJpbmFyeSBmaWxlIGZyb20gYSBmaWxlIHN5c3RlbSBpbWFnZQpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5QSVA0MDUgYi9kb2MvUkVBRE1FLlBJUDQwNQppbmRleCBjNWNjZjE4Li42MTBmZjIxIDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLlBJUDQwNQorKysgYi9kb2MvUkVBRE1FLlBJUDQwNQpAQCAtMzIsMTAgKzMyLDggQEAKIC0gaW5jbHVkZS9jbWRfYnNwLmgJCWFkZGVkIFBJUDQwNSBjb21tYW5kcyBkZWZpbml0aW9ucwogLSBpbmNsdWRlL2NtZF9jb25kZWZzLmgJCWFkZGVkIEZsb3BweSBhbmQgU0NTSSBzdXBwb3J0CiAtIGluY2x1ZGUvY21kX2Rpc2suaAkJY2hhbmdlZCB0byB3b3JrIHdpdGggYmxvY2sgZGV2aWNlIGRlc2NyaXB0aW9uCi0tIGluY2x1ZGUvY29uZmlnX0xBTlRFQy5oCWV4Y2x1ZGVkIENGR19DTURfRkRDIGFuZCBDRkdfQ01EX1NDU0kgZnJvbQotCQkJCUNPTkZJR19DTURfRlVMTAotLSBpbmNsdWRlL2NvbmZpZ19oeW1vZC5oCWV4Y2x1ZGVkIENGR19DTURfRkRDIGFuZCBDRkdfQ01EX1NDU0kgZnJvbQotCQkJCUNPTkZJR19DTURfRlVMTAorLSBpbmNsdWRlL2NvbmZpZ19MQU5URUMuaAlleGNsdWRlZCBDT05GSUdfQ01EX0ZEQyBhbmQgQ09ORklHX0NNRF9TQ1NJCistIGluY2x1ZGUvY29uZmlnX2h5bW9kLmgJZXhjbHVkZWQgQ09ORklHX0NNRF9GREMgYW5kIENPTkZJR19DTURfU0NTSQogLSBpbmNsdWRlL2ZsYXNoLmgJCWFkZGVkIElOVEVMX0lEXzI4RjMyMEMzVCAgMHg4OEM0ODhDNAogLSBpbmNsdWRlL2kyYy5oCQkJYWRkZWQgImRlZmluZWQoQ09ORklHX1BJUDQwNSkiCiAtIGluY2x1ZGUvaW1hZ2UuaAkJYWRkZWQgSUhfT1NfVV9CT09ULCBJSF9UWVBFX0ZJUk1XQVJFCkBAIC04OCw4ICs4Niw4IEBACiAKIE5ldyBDb21tYW5kczoKIC0tLS0tLS0tLS0tLS0KLUNGR19DTURfU0NTSQlTQ1NJIFN1cHBvcnQKLUNGR19DTUZfRkRDCUZsb3BweSBkaXNrIHN1cHBvcnQKK0NPTkZJR19DTURfU0NTSQlTQ1NJIFN1cHBvcnQKK0NPTkZJR19DTUZfRkRDCUZsb3BweSBkaXNrIHN1cHBvcnQKIAogSURFIGFkZGl0aW9uczoKIC0tLS0tLS0tLS0tLS0tCkBAIC0xNzIsOCArMTcwLDggQEAKIEZsb3BweSBzdXBwb3J0OgogLS0tLS0tLS0tLS0tLS0tCiBTdXBwb3J0IG9mIGEgc3RhbmRhcmQgZmxvcHB5IGRpc2sgY29udHJvbGxlciBhdCBhZGRyZXNzIENGR19JU0FfSU9fQkFTRV9BRERSRVNTCi0rIDB4M0YwLiBFbmFibGVkIHdpdGggZGVmaW5lIENGR19DTURfRkRDLiBSZWFkcyBhIHVuZm9ybWF0ZWQgZmxvcHB5IGRpc2sgd2l0aCBhCi1pbWFnZSBoZWFkZXIgKHNlZTogbWtpbWFnZSkuIE5vIGludGVycnVwdHMgYW5kIG5vIERNQSBhcmUgdXNlZCBmb3IgdGhpcy4KKysgMHgzRjAuIEVuYWJsZWQgd2l0aCBkZWZpbmUgQ09ORklHX0NNRF9GREMuIFJlYWRzIGEgdW5mb3JtYXRlZCBmbG9wcHkgZGlzaword2l0aCBhIGltYWdlIGhlYWRlciAoc2VlOiBta2ltYWdlKS4gTm8gaW50ZXJydXB0cyBhbmQgbm8gRE1BIGFyZSB1c2VkIGZvciB0aGlzLgogQWRkZWQgZmlsZXM6CiAtIGNvbW1vbi9jbWRfZmRjLmMKIC0gaW5jbHVkZS9jbWRfZmRjLmgKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuU05UUCBiL2RvYy9SRUFETUUuU05UUAppbmRleCBmZDZmMjA5Li45ZWRjOTU3IDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLlNOVFAKKysrIGIvZG9jL1JFQURNRS5TTlRQCkBAIC0xLDUgKzEsNSBAQAotVG8gdXNlIFNOVFAgc3VwcG9ydCwgYWRkIGEgZGVmaW5lIENGR19DTURfU05UUCB0byBDT05GSUdfQ09NTUFORFMgaW4KLXRoZSBjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGJvYXJkLgorVG8gdXNlIFNOVFAgc3VwcG9ydCwgYWRkIGRlZmluZSBDT05GSUdfQ01EX1NOVFAgdG8gdGhlCitjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGJvYXJkLgogCiBUaGUgInNudHAiIGNvbW1hbmQgZ2V0cyBuZXR3b3JrIHRpbWUgZnJvbSBOVFAgdGltZSBzZXJ2ZXIgYW5kCiBzeW5jcm9uaXplIFJUQyBvZiB0aGUgYm9hcmQuIFRoaXMgY29tbWFuZCBuZWVkcyB0aGUgY29tbWFuZCBsaW5lCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLmJhbWJvbyBiL2RvYy9SRUFETUUuYmFtYm9vCmluZGV4IGI1MGJlMDEuLmUxMzljNmQgMTAwNjQ0Ci0tLSBhL2RvYy9SRUFETUUuYmFtYm9vCisrKyBiL2RvYy9SRUFETUUuYmFtYm9vCkBAIC0xLDMgKzEsNjUgQEAKK1RoZSAyIGltcG9ydGFudCBkaXBzd2l0Y2hlcyBhcmUgY29uZmlndXJlZCBhcyBzaG93biBiZWxvdzoKKworU1cxIChmb3IgMzNNSHogU3lzQ2xrKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUzEgICBTMiAgIFMzICAgUzQgICBTNSAgIFM2ICAgUzcgICBTOAorT0ZGICBPRkYgIE9GRiAgT0ZGICBPRkYgIE9GRiAgT0ZGICBPTgorCitTVzcgKGZvciBPcC1Db2RlIEZsYXNoIGFuZCBCb290IE9wdGlvbiBIKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1MxICAgUzIgICBTMyAgIFM0ICAgUzUgICBTNiAgIFM3ICAgUzgKK09GRiAgT0ZGICBPRkYgIE9OICAgT0ZGICBPRkYgIE9GRiAgT0ZGCisKK1RoZSBFRVBST00gYXQgbG9jYXRpb24gMHg1MiBpcyBsb2FkZWQgd2l0aCB0aGVzZSAxNiBieXRlczoKK0M0NzA0MkE2IDA1RDdBMTkwIDQwMDgyMzUwIDBkMDUwMDAwCisKK1NEUjBfU0RTVFAwW0VOR106CTEJCTogUExMJ3MgVkNPIGlzIHRoZSBzb3VyY2UgZm9yIFBMTCBmb3J3YXJkIGRpdmlzb3JzCitTRFIwX1NEU1RQMFtTUkNdOgkxCQk6IEZlZWRiYWNrIG9yaWdpbmF0ZXMgZnJvbSBQTExPVVRCCitTRFIwX1NEU1RQMFtTRUxdOgkwCQk6IEZlZWRiYWNrIHNlbGVjdGlvbiBpcyBQTEwgb3V0cHV0CitTRFIwX1NEU1RQMFtUVU5FXToJMTAwMDExMTAwMAk6IDEwIDw9IE0gPD0gMjIsIDYwME1IeiA8IFZDTyA8PSA5MDBNSHoKK1NEUjBfU0RTVFAwW0ZCRFZdOgk0CQk6IFBMTCBmZWVkYmFjayBkaXZpc29yCitTRFIwX1NEU1RQMFtGQkRWQV06CTIJCTogUExMIGZvcndhcmQgZGl2aXNvciBBCitTRFIwX1NEU1RQMFtGQkRWQl06CTUJCTogUExMIGZvcndhcmQgZGl2aXNvciBCCitTRFIwX1NEU1RQMFtQUkJEVjBdOgkxCQk6IFBMTCBwcmltYXJ5IGRpdmlzb3IgQgorU0RSMF9TRFNUUDBbT1BCRFYwXToJMgkJOiBPUEIgY2xvY2sgZGl2aXNvcgorU0RSMF9TRFNUUDBbTEZCRFZdOgkxCQk6IFBMTCBsb2NhbCBmZWVkYmFjayBkaXZpc29yCitTRFIwX1NEU1RQMFtQRVJEVjBdOgkzCQk6IFBlcmlwaGVyYWwgY2xvY2sgZGl2aXNvciAwCitTRFIwX1NEU1RQMFtNQUxEVjBdOgkyCQk6IE1BTCBjbG9jayBkaXZpc29yIDAKK1NEUjBfU0RTVFAwW1BDSURWMF06CTIJCTogU3luYyBQQ0kgY2xvY2sgZGl2aXNvciAwCitTRFIwX1NEU1RQMFtQTExUSU1FUl06CTcJCTogUExMIGxvY2tpbmcgdGltZXIKK1NEUjBfU0RTVFAwW1JXXToJMQkJOiBFQkMgUk9NIHdpZHRoOiAxNi1iaXQKK1NEUjBfU0RTVFAwW1JMXToJMAkJOiBFQkMgUk9NIGxvY2F0aW9uOiBFQkMKK1NEUjBfU0RTVFAwW1BBRV06CTAJCTogUENJIGludGVybmFsIGFyYml0ZXI6IGRpc2FibGVkCitTRFIwX1NEU1RQMFtQSENFXToJMAkJOiBQQ0kgaG9zdCBjb25maWd1cmF0aW9uOiBkaXNhYmxlZAorU0RSMF9TRFNUUDBbWk1dOgkzCQk6IFpNSUkgbW9kZTogUk1JSSBtb2RlIDEwMAorU0RSMF9TRFNUUDBbQ1RFXToJMAkJOiBDUFUgdHJhY2U6IGRpc2FibGVkCitTRFIwX1NEU1RQMFtOdG8xXToJMAkJOiBDUFUvUExCIHJhdGlvIE4vUDogbm90IE4gdG8gMQorU0RSMF9TRFNUUDBbUEFNRV06CTEJCTogUENJIGFzeW5jaHJvbm91cyBtb2RlOiBlbmFibGVkCitTRFIwX1NEU1RQMFtNRU1dOgkxCQk6IE11bHRpcGxleDogRU1BQworU0RSMF9TRFNUUDBbTkVdOgkwCQk6IE5ERkM6IGRpc2FibGVkCitTRFIwX1NEU1RQMFtOQlddOgkwCQk6IE5ERkMgYm9vdCB3aWR0aDogOC1iaXQKK1NEUjBfU0RTVFAwW05CV106CTAJCTogTkRGQyBib290IHBhZ2Ugc2VsZWN0aW9uCitTRFIwX1NEU1RQMFtOQkFDXToJMAkJOiBOREZDIGJvb3QgYWRkcmVzcyBzZWxlY3Rpb24gY3ljbGU6IDMgQWRkci4gQ3ljbGVzLCAxIENvbC4gKyAyIFJvdyAoNTEyIHBhZ2Ugc2l6ZSkKK1NEUjBfU0RTVFAwW05BUkVdOgkwCQk6IE5ERkMgYXV0byByZWFkIDogZGlzYWJsZWQKK1NEUjBfU0RTVFAwW05SQl06CTAJCTogTkRGQyBSZWFkeS9CdXN5IDogUmVhZHkKK1NEUjBfU0RTVFAwW05EUlNDXToJMzMzMzMJCTogTkRGQyBkZXZpY2UgcmVzZXQgY291bnRlcgorU0RSMF9TRFNUUDBbTkNHMF06CTAJCTogTkRGQy9FQkMgY2hpcCBzZWxlY3QgZ2F0aW5nIENTMCA6IEVCQworU0RSMF9TRFNUUDBbTkNHMV06CTAJCTogTkRGQy9FQkMgY2hpcCBzZWxlY3QgZ2F0aW5nIENTMSA6IEVCQworU0RSMF9TRFNUUDBbTkNHMl06CTAJCTogTkRGQy9FQkMgY2hpcCBzZWxlY3QgZ2F0aW5nIENTMiA6IEVCQworU0RSMF9TRFNUUDBbTkNHM106CTAJCTogTkRGQy9FQkMgY2hpcCBzZWxlY3QgZ2F0aW5nIENTMyA6IEVCQworU0RSMF9TRFNUUDBbTkNSRENdOgkzMzMzCQk6IE5ERkMgZGV2aWNlIHJlYWQgY291bnQKKworUFBDNDQwRVAgQ2xvY2tpbmcgQ29uZmlndXJhdGlvbgorCitTeXNDbGsgaXMgMzMuME1IeiwgTSBpcyAyMCwgVkNPIGlzIDY2MC4wTUh6LCBDUFUgaXMgMzMwLjBNSHosIFBMQiBpcyAxMzIuME1IegorT1BCIGlzIDY2LjBNSHosIEVCQyBpcyA0NC4wTUh6LCBNQUwgaXMgNjYuME1IeiwgU3luYyBQQ0kgaXMgNjYuME1IegorCitUaGUgYWJvdmUgaW5mb3JtYXRpb24gaXMgcmVwb3J0ZWQgYnkgRXVnZW5lIE8nQnJpZW4KKzxFdWdlbmUuTydCcmllbkBhZHZhbnRlY2hhbXQuY29tPi4gVGhhbmtzIGEgbG90LgorCisyMDA3LTA4LTA2LCBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBBTUNDIDQ0MEVQIGV2YWwgYm9hcmQgIkJhbWJvbyIgd2FzIGNoYW5nZWQKIHRvIG9ubHkgdXNlIDM4NCBrYnl0ZXMgb2YgRkxBU0ggZm9yIHRoZSBVLUJvb3QgaW1hZ2UuIFRoaXMgd2F5IHRoZQogcmVkdW5kYW50IGVudmlyb25tZW50IGNhbiBiZSBzYXZlZCBpbiB0aGUgcmVtYWluaW5nIDIgc2VjdG9ycyBvZiB0aGUKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuYmVkYnVnIGIvZG9jL1JFQURNRS5iZWRidWcKaW5kZXggOWNmYjQyMS4uMjYxNmFjYyAxMDA2NDQKLS0tIGEvZG9jL1JFQURNRS5iZWRidWcKKysrIGIvZG9jL1JFQURNRS5iZWRidWcKQEAgLTMxLDEyICszMSw2IEBACiAJaWYgaXQgaXMgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiwgcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiBvcgogCWEgdHJhcC4gQWxzbyBhZGRlZCBkZWJ1ZyB0cmFwIGhhbmRsZXIuCiAKLS4vaW5jbHVkZS9jbWRfY29uZmRlZnMuaAotCUFkZGVkIGRlZmluaXRpb24gb2YgQ0ZHX0NNRF9CRURCVUcuCi0KLS4vaW5jbHVkZS9jb25maWdfV0FMTlVUNDA1LmgKLQlBZGRlZCBDRkdfQ01EX0JFREJVRyB0byB0aGUgQ09ORklHX0NPTU1BTkRTIGZvciB0aGUgV0FMTlVULgotCiAuL2luY2x1ZGUvcHBjX2FzbS50bXBsCiAJQWRkZWQgY29kZSB0byBoYW5kbGUgY3JpdGljYWwgZXhjZXB0aW9ucwogCkBAIC03OCwxMCArNzIsNiBAQAogCWNwdS9tcGM4eHgvdHJhcHMuYwogCQlBZGRlZCBuZXcgcm91dGluZSBEZWJ1Z0V4Y2VwdGlvbigpCiAKLQlpbmNsdWRlL2NvbmZpZ19NQlguaAotCQlBZGRlZCBDRkdfQ01EX0JFREJVRyB0byBDT05GSUdfQ09NTUFORFMgZGVmaW5lCi0KLQogTmV3IEZpbGVzOgogCiAJY3B1L21wYzh4eC9iZWRidWdfODYwLmMKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuZ2VuZXJpY191c2Jfb2hjaSBiL2RvYy9SRUFETUUuZ2VuZXJpY191c2Jfb2hjaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRkZDFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5nZW5lcmljX3VzYl9vaGNpCkBAIC0wLDAgKzEsNTcgQEAKK05vdGVzIG9uIHRoZSB0aGUgZ2VuZXJpYyBVU0ItT0hDSSBkcml2ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkcml2ZXIgKGRyaXZlcnMvdXNiX29oY2kuW2NoXSkgaXMgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2Ugb2YKK3ZhcmlvdXMgZXhpc3RpbmcgT0hDSSBkcml2ZXJzIHRoYXQgd2VyZSBiYXNpY2FsbHkgaWRlbnRpY2FsIGJlc2lkZQorY3B1L2JvYXJkIGRlcGVuZGFudCBpbml0YWxpemF0aW9uLiBUaGlzIGluaXRhbGl6YXRpb24gaGFzIGJlZW4gbW92ZWQKK2ludG8gY3B1L2JvYXJkIGRpcmVjdG9yaWVzIGFuZCBhcmUgY2FsbGVkIHZpYSB0aGUgaG9va3MgYmVsb3cuCisKK0NvbmZpZ3VyYXRpb24gb3B0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJQ09ORklHX1VTQl9PSENJX05FVzogZW5hYmxlIHRoZSBuZXcgT0hDSSBkcml2ZXIKKworCUNGR19VU0JfT0hDSV9CT0FSRF9JTklUOiBjYWxsIHRoZSBib2FyZCBkZXBlbmRhbnQgaG9va3M6CisKKwkJICAtIGV4dGVybiBpbnQgdXNiX2JvYXJkX2luaXQodm9pZCk7CisJCSAgLSBleHRlcm4gaW50IHVzYl9ib2FyZF9zdG9wKHZvaWQpOworCQkgIC0gZXh0ZXJuIGludCB1c2JfY3B1X2luaXRfZmFpbCh2b2lkKTsKKworCUNGR19VU0JfT0hDSV9DUFVfSU5JVDogY2FsbCB0aGUgY3B1IGRlcGVuZGFudCBob29rczoKKworCQkgIC0gZXh0ZXJuIGludCB1c2JfY3B1X2luaXQodm9pZCk7CisJCSAgLSBleHRlcm4gaW50IHVzYl9jcHVfc3RvcCh2b2lkKTsKKwkJICAtIGV4dGVybiBpbnQgdXNiX2NwdV9pbml0X2ZhaWwodm9pZCk7CisKKwlDRkdfVVNCX09IQ0lfUkVHU19CQVNFOiBkZWZpbmVzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIE9IQ0kKKwkJCQlyZWdpc3RlcnMKKworCUNGR19VU0JfT0hDSV9TTE9UX05BTUU6IHNsb3QgbmFtZQorCisJQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTOiBtYXhpbWFsIG51bWJlciBvZiBwb3J0cyBvZiB0aGUKKwkJCQkgICAgIHJvb3QgaHViLgorCisKK0VuZGlhbm5lc3MgaXNzdWVzCistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFVTQiBidXMgb3BlcmF0ZXMgaW4gbGl0dGxlIGVuZGlhbiwgYnV0IHVuZm9ydHVuYXRlbHkgdGhlcmUgYXJlCitPSENJIGNvbnRyb2xsZXJzIHRoYXQgb3BlcmF0ZSBpbiBiaWcgZW5kaWFuIHN1Y2ggYXMgcHBjNHh4IGFuZAorbXBjNXh4eC4gRm9yIHRoZXNlIHRoZSBjb25maWcgb3B0aW9uCisKKwlDRkdfT0hDSV9CRV9DT05UUk9MTEVSCisKK25lZWRzIHRvIGJlIGRlZmluZWQuCisKKworUENJIENvbnRyb2xsZXJzCistLS0tLS0tLS0tLS0tLS0tCisKK1lvdSdsbCBuZWVkIHRvIGRlZmluZQorCisJQ09ORklHX1BDSV9PSENJCisKK1BDSSBDb250cm9sbGVycyBuZWVkIHRvIGRvIGJ5dGUgc3dhcHBpbmcgb24gcmVnaXN0ZXIgYWNjZXNzZXMsIHNvIHRoZXkKK3Nob3VsZCB0byBkZWZpbmU6CisKKwlDRkdfT0hDSV9TV0FQX1JFR19BQ0NFU1MKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUubXBjODMyM2VyZGIgYi9kb2MvUkVBRE1FLm1wYzgzMjNlcmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODk4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLm1wYzgzMjNlcmRiCkBAIC0wLDAgKzEsNzEgQEAKK0ZyZWVzY2FsZSBNUEM4MzIzRVJEQiBCb2FyZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4JTWVtb3J5IE1hcAorCVRoZSBtZW1vcnkgbWFwIGxvb2tzIGxpa2UgdGhpczoKKworCTB4MDAwMF8wMDAwCTB4MDNmZl9mZmZmCUREUgkJIDY0TQorCTB4ODAwMF8wMDAwCTB4OGZmZl9mZmZmCVBDSSBNRU0JCSAyNTZNCisJMHg5MDAwXzAwMDAJMHg5ZmZmX2ZmZmYJUENJX01NSU8JIDI1Nk0KKwkweGUwMDBfMDAwMAkweGUwMGZfZmZmZglJTU1SCQkgMU0KKwkweGQwMDBfMDAwMAkweGQzZmZfZmZmZglQQ0kgSU8JCSA2NE0KKwkweGZlMDBfMDAwMAkweGZlZmZfZmZmZglOT1IgRkxBU0ggKENTMCkJIDE2TQorCisyLglDb21waWxhdGlvbgorCisJQXNzdW1pbmcgeW91J3JlIHVzaW5nIEJBU0ggKG9yIHNpbWlsYXIpIGFzIHlvdXIgc2hlbGw6CisKKwlleHBvcnQgQ1JPU1NfQ09NUElMRT15b3VyLWNyb3NzLWNvbXBpbGVyLXByZWZpeC0KKwltYWtlIGRpc3RjbGVhbgorCW1ha2UgTVBDODMyM0VSREJfY29uZmlnCisJbWFrZQorCiszLglEb3dubG9hZGluZyBhbmQgRmxhc2hpbmcgSW1hZ2VzCisKKzMuMQlSZWZsYXNoIFUtYm9vdCBJbWFnZSB1c2luZyBVLWJvb3QKKworCU4uYiwgaGF2ZSBhbiBhbHRlcm5hdGUgbWVhbnMgb2YgcHJvZ3JhbW1pbmcKKwl0aGUgZmxhc2ggYXZhaWxhYmxlIGlmIHRoZSBuZXcgdS1ib290IGRvZXNuJ3QgYm9vdC4KKworCUZpcnN0IHRyeSBhOgorCisJdGZ0cGJvb3QgJGxvYWRhZGRyICR1Ym9vdAorCisJdG8gbWFrZSBzdXJlIHRoYXQgdGhlIFRGVFAgbG9hZCB3aWxsIHN1Y2NlZWQgYmVmb3JlCisJYW4gZXJhc2UgZ29lcyBhaGVhZCBhbmQgd2lwZXMgb3V0IHlvdXIgY3VycmVudCBmaXJtd2FyZS4KKwlUaGVuIGRvIGE6CisKKwlydW4gdGZ0cGZsYXNoCisKKwl3aGljaCBpcyBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHNlcXVlbmNlOgorCisJdGZ0cCAkbG9hZGFkZHIgdS1ib290LmJpbgorCXByb3RlY3Qgb2ZmIGZlMDAwMDAwICskZmlsZXNpemUKKwllcmFzZSBmZTAwMDAwMCArJGZpbGVzaXplCisJY3AuYiAkbG9hZGFkZHIgZmUwMDAwMDAgJGZpbGVzaXplCisKKwlUbyBrZWVwIHlvdXIgb2xkIHUtYm9vdCdzIGVudmlyb25tZW50IHZhcmlhYmxlcywgZG8gYToKKworCXNhdmVlbnYKKworCXByaW9yIHRvIHJlc2V0dGluZyB0aGUgYm9hcmQuCisKKzMuMglEb3dubG9hZGluZyBhbmQgQm9vdGluZyBMaW51eCBLZXJuZWwKKworCUVuc3VyZSB0aGF0IGFsbCBuZXR3b3JraW5nLXJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKKwlwcm9wZXJseSAoaW5jbHVkaW5nIGlwYWRkciwgc2VydmVyaXAsIGdhdGV3YXlpcCAoaWYgbmVlZGVkKSwKKwluZXRtYXNrLCBldGhhZGRyLCBldGgxYWRkciwgcm9vdHBhdGggKGlmIHVzaW5nIE5GUyByb290KSwKKwlmZHRmaWxlLCBhbmQgYm9vdGZpbGUpLgorCisJVGhlbiwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmcsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdQorCXdhbnQgYW4gTkZTIHJvb3Qgb3IgYSByYW1kaXNrIHJvb3Q6CisKKwlydW4gbmZzYm9vdAorCisJb3IKKworCXJ1biByYW1ib290CisKKzQJTm90ZXMKKworCVRoZSBjb25zb2xlIGJhdWRyYXRlIGZvciBNUEM4MzIzRVJEQiBpcyAxMTUyMDBicHMuCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLm1wYzgzNDllbWRzLmRkcmVjYyBiL2RvYy9SRUFETUUubXBjODM0OWVtZHMuZGRyZWNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI0OWMzLi4wMDAwMDAwCi0tLSBhL2RvYy9SRUFETUUubXBjODM0OWVtZHMuZGRyZWNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLU92ZXJ2aWV3Ci09PT09PT09PQotCi1UaGUgb3ZlcmFsbCB1c2FnZSBwYXR0ZXJuIGZvciBFQ0MgZGlhZ25vc3RpYyBjb21tYW5kcyBpcyB0aGUgZm9sbG93aW5nOgotCi0gICogKGluamVjdGluZyBlcnJvcnMgaXMgaW5pdGlhbGx5IGRpc2FibGVkKQotCi0gICogZGVmaW5lIGluamVjdCBtYXNrICh3aGljaCB0ZWxscyB0aGUgRERSIGNvbnRyb2xsZXIgd2hhdCB0eXBlIG9mIGVycm9ycwotICAgIHdlJ2xsIGJlIGluamVjdGluZzogc2luZ2xlL211bHRpcGxlIGJpdCBldGMuKQotCi0gICogZW5hYmxlIGluamVjdGluZyBlcnJvcnMgLSBmcm9tIG5vdyBvbiB0aGUgY29udHJvbGxlciBpbmplY3RzIGVycm9ycyBhcwotICAgIGluZGljYXRlZCBpbiB0aGUgaW5qZWN0IG1hc2sKLQotSU1QT1JUQU5UIE5PVElDRTogZW5hYmxpbmcgaW5qZWN0aW5nIG11bHRpcGxlLWJpdCBlcnJvcnMgaXMgcG90ZW50aWFsbHkKLWRhbmdlcm91cyBhcyBzdWNoIGVycm9ycyBhcmUgTk9UIGNvcnJlY3RlZCBieSB0aGUgY29udHJvbGxlci4gVGhlcmVmb3JlIGNhdXRpb24KLXNob3VsZCBiZSB0YWtlbiB3aGVuIGVuYWJsaW5nIHRoZSBpbmplY3Rpb24gb2YgbXVsdGlwbGUtYml0IGVycm9yczogaXQgaXMgb25seQotc2FmZSB3aGVuIHVzZWQgb24gYSBjYXJlZnVsbHkgc2VsZWN0ZWQgbWVtb3J5IGFyZWEgYW5kIHVzZWQgdW5kZXIgY29udHJvbCBvZgotdGhlICdlY2MgdGVzdCcgY29tbWFuZCAoc2VlIGV4YW1wbGUgJ0luamVjdGluZyBNdWx0aXBsZS1CaXQgRXJyb3JzJyBiZWxvdykuIEluCi1wYXJ0aWN1bGFyLCB3aGVuIHlvdSBzaW1wbHkgc2V0IHRoZSBtdWx0aXBsZS1iaXQgZXJyb3JzIGluIGluamVjdCBtYXNrIGFuZAotZW5hYmxlIGluamVjdGlvbiwgVS1Cb290IGlzIHZlcnkgbGlrZWx5IHRvIGhhbmcgcXVpY2tseSBhcyB0aGUgZXJyb3JzIHdpbGwgYmUKLWluamVjdGVkIHdoZW4gaXQgYWNjZXNzZXMgaXRzIGNvZGUsIGRhdGEgZXRjLgotCi0KLVVzZSBjYXNlcyBmb3IgRERSICdlY2MnIGNvbW1hbmQ6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1CZWZvcmUgZXhlY3V0aW5nIHBhcnRpY3VsYXIgdGVzdHMgcmVzZXQgdGFyZ2V0IGJvYXJkIG9yIGNsZWFyIHN0YXR1cyByZWdpc3RlcnM6Ci0KLT0+IGVjYyBjYXB0dXJlY2xlYXIKLT0+IGVjYyBlcnJkZXRlY3RjbHIgYWxsCi09PiBlY2Mgc2JlY250IDAKLQotCi1JbmplY3RpbmcgU2luZ2xlLUJpdCBFcnJvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBTZXQgMSBiaXQgaW4gRGF0YSBQYXRoIEVycm9yIEluamVjdCBNYXNrCi0KLT0+IGVjYyBpbmplY3RkYXRhaGkgMQotCi0yLiBSdW4gdGVzdCBvdmVyIHNvbWUgbWVtb3J5IHJlZ2lvbgotCi09PiBlY2MgdGVzdCAyMDAwMDAgMTAKLQotMy4gQ2hlY2sgRUNDIHN0YXR1cwotCi09PiBlY2Mgc3RhdHVzCi0uLi4KLU1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaC9Mb3c6IDAwMDAwMDAxIDAwMDAwMDAwCi0uLi4KLU1lbW9yeSBTaW5nbGUtQml0IEVycm9yIE1hbmFnZW1lbnQgKDAuLjI1NSk6Ci0gIFNpbmdsZS1CaXQgRXJyb3IgVGhyZXNob2xkOiAyNTUKLSAgU2luZ2xlIEJpdCBFcnJvciBDb3VudGVyOiAxNgotLi4uCi1NZW1vcnkgRXJyb3IgRGV0ZWN0OgotICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAwCi0gIE11bHRpcGxlLUJpdCBFcnJvcjogMAotICBTaW5nbGUtQml0IEVycm9yOiAwCi0uLi4KLQotMTYgZXJyb3JzIHdlcmUgZ2VuZXJhdGVkLCBTaW5nbGUtQml0IEVycm9yIGZsYWcgd2FzIG5vdCBzZXQgYXMgU2luZ2xlIEJpdCBFcnJvcgotQ291bnRlciBkaWQgbm90IHJlYWNoICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZC4KLQotNC4gTWFrZSBzdXJlIHVzZWQgbWVtb3J5IHJlZ2lvbiBnb3QgcmUtaW5pdGlhbGl6ZWQgd2l0aCAweGNhZmVjYWZlIHBhdHRlcm4KLQotPT4gbWQgMjAwMDAwCi0wMDIwMDAwMDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwMTA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDIwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDAzMDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwNDA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDUwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA2MDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwNzA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDgwOiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA5MDogZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgICAgLi4uLi4uLi4uLi4uLi4uLgotCi0KLUluamVjdGluZyBNdWx0aXBsZS1CaXQgRXJyb3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBTZXQgbW9yZSB0aGFuIDEgYml0IGluIERhdGEgUGF0aCBFcnJvciBJbmplY3QgTWFzawotCi09PiBlY2MgaW5qZWN0ZGF0YWhpIDUKLQotMi4gUnVuIHRlc3Qgb3ZlciBzb21lIG1lbW9yeSByZWdpb24KLQotPT4gZWNjIHRlc3QgMjAwMDAwIDEwCi0KLTMuIENoZWNrIEVDQyBzdGF0dXMKLQotPT4gZWNjIHN0YXR1cwotLi4uCi1NZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2gvTG93OiAwMDAwMDAwNSAwMDAwMDAwMAotLi4uCi1NZW1vcnkgRXJyb3IgRGV0ZWN0OgotICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAxCi0gIE11bHRpcGxlLUJpdCBFcnJvcjogMQotICBTaW5nbGUtQml0IEVycm9yOiAwCi0uLi4KLQotT2JzZXJ2ZSB0aGF0IGJvdGggTXVsdGlwbGUgTWVtb3J5IEVycm9ycyBhbmQgTXVsdGlwbGUtQml0IEVycm9yIGZsYWdzIGFyZSBzZXQuCi0KLTQuIE1ha2Ugc3VyZSB1c2VkIG1lbW9yeSByZWdpb24gZ290IHJlLWluaXRpYWxpemVkIHdpdGggMHhjYWZlY2FmZSBwYXR0ZXJuCi0KLT0+IG1kIDIwMDAwMAotMDAyMDAwMDA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDEwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDAyMDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwMzA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDQwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA1MDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwNjA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDcwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA4MDogZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwOTA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KLQotCi1UZXN0IFNpbmdsZS1CaXQgRXJyb3IgQ291bnRlciBhbmQgVGhyZXNob2xkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTEuIFNldCAxIGJpdCBpbiBEYXRhIFBhdGggRXJyb3IgSW5qZWN0IE1hc2sKLQotPT4gZWNjIGluamVjdGRhdGFoaSAxCi0KLTIuIEVuYWJsZSBlcnJvciBpbmplY3Rpb24KLQotPT4gZWNjIGluamVjdCBlbgotCi0zLiBMZXQgdS1ib290IHJ1biBmb3IgYSB3aXRoIFNpbmdsZS1CaXQgZXJyb3IgaW5qZWN0aW9uIGVuYWJsZWQKLQotNC4gRGlzYWJsZSBlcnJvciBpbmplY3Rpb24KLQotPT4gZWNjIGluamVjdCBkaXMKLQotNC4gQ2hlY2sgc3RhdHVzCi0KLT0+IGVjYyBzdGF0dXMKLQotLi4uCi1NZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOgotICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogMjU1Ci0gIFNpbmdsZSBCaXQgRXJyb3IgQ291bnRlcjogNjAKLQotTWVtb3J5IEVycm9yIERldGVjdDoKLSAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMQotICBNdWx0aXBsZS1CaXQgRXJyb3I6IDAKLSAgU2luZ2xlLUJpdCBFcnJvcjogMQotLi4uCi0KLU9ic2VydmUgdGhhdCBTaW5nbGUtQml0IEVycm9yIGlzICdvbicgd2hpY2ggbWVhbnMgdGhhdCBTaW5nbGUtQml0IEVycm9yIENvdW50ZXIKLXJlYWNoZWQgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQuIE11bHRpcGxlIE1lbW9yeSBFcnJvcnMgYml0IGlzIGFsc28gJ29uJywgdGhhdAotaXMgQ291bnRlciByZWFjaGVkIFRocmVzaG9sZCBtb3JlIHRoYW4gb25lIHRpbWUgKGl0IHdyYXBzIGJhY2sgYWZ0ZXIgcmVhY2hpbmcKLVRocmVzaG9sZCkuCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLm1wYzgzNjBlbWRzIGIvZG9jL1JFQURNRS5tcGM4MzYwZW1kcwppbmRleCBjODc0NjlmLi41ZjIwMjQ3IDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLm1wYzgzNjBlbWRzCisrKyBiL2RvYy9SRUFETUUubXBjODM2MGVtZHMKQEAgLTIxLDcgKzIxLDEzIEBACiAJU1czWzE6OF09IDAwMDBfMDAwMSByZWZlcnMgdG8gYml0cyBsYWJlbGVkIDEgdGhyb3VnaCA2IGlzIHNldCBhcyAiT24iCiAJCWFuZCBiaXRzIGxhYmVsZWQgOCBpcyBzZXQgYXMgIk9mZiIuCiAKLTEuMQlGb3IgdGhlIE1QQzgzNjBFIFBCIFBST1RPIEJvYXJkCisxLjEJVGhlcmUgYXJlIHRocmVlIHR5cGUgYm9hcmRzIGZvciBNUEM4MzYwRSBzaWxpY29uIHVwIHRvIG5vdywgVGhleSBhcmUKKworCSogTVBDODM2MEUtTURTLVBCIFBST1RPIChhLmsuYSA4MzYwU1lTIFBST1RPVFlQRSkKKwkqIE1QQzgzNjBFLU1EUy1QQiBQSUxPVCAoYS5rLmEgODM2MFNZUyBQSUxPVCkKKwkqIE1QQzgzNjBFQS1NRFMtUEIgUFJPVE8gKGEuay5hIDgzNjBTWVMyIFBST1RPVFlQRSkKKworMS4yCUZvciBhbGwgdGhlIE1QQzgzNjBFTURTIEJvYXJkCiAKIAlGaXJzdCwgbWFrZSBzdXJlIHRoZSBib2FyZCBkZWZhdWx0IHNldHRpbmcgaXMgY29uc2lzdGVudCB3aXRoIHRoZQogCWRvY3VtZW50IHNoaXBwZWQgd2l0aCB5b3VyIGJvYXJkLiBUaGVuIGFwcGx5IHRoZSBmb2xsb3dpbmcgc2V0dGluZzoKQEAgLTMzLDYgKzM5LDIxIEBACiAJSlA2IDEtMgogCW9uIGJvYXJkIE9zY2lsbGF0b3I6IDY2TQogCisxLjMJU2luY2UgZGlmZmVyZW50IGJvYXJkL2NoaXAgcmV2LiBjb21iaW5hdGlvbnMgaGF2ZSBBQyB0aW1pbmcgaXNzdWVzLAorCXUtYm9vdCBmb3JjZXMgUkdNSUktSUQgKFJHTUlJIHdpdGggSW50ZXJuYWwgRGVsYXkpIG1vZGUgb24gYnkgZGVmYXVsdAorCWJ5IHRoZSBwYXRjaCAobXBjODN4eDogRGlzYWJsZSBHMVRYQ0xLLCBHMlRYQ0xLIGgvdyBidWZmZXJzKS4KKworCVdoZW4gdGhlIHJldjIueCBzaWxpY29uIG1vdW50IG9uIHRoZXNlIGJvYXJkcywgYW5kIGlmIHlvdSBhcmUgdXNpbmcKKwl1LWJvb3QgdmVyc2lvbiBhZnRlciB0aGlzIHBhdGNoLCB0byBtYWtlIHRoZSBldGhlcm5ldCBpbnRlcmZhY2VzIHVzYWJsZSwKKwlhbmQgdG8gZW5hYmxlIFJHTUlJLUlEIG9uIHlvdXIgYm9hcmQsIHlvdSBoYXZlIHRvIHNldHVwIHRoZSBqdW1wZXJzCisJY29ycmVjdGx5LgorCisJKiBNUEM4MzYwRS1NRFMtUEIgUFJPVE8KKwkgIG5vdGhpbmcgdG8gZG8KKwkqIE1QQzgzNjBFLU1EUy1QQiBQSUxPVAorCSAgSlA5IGFuZCBKUDggc2hvdWxkIGJlIE9OCisJKiBNUEM4MzYwRUEtTURTLVBCIFBST1RPCisJICBKUDIgYW5kIEpQMyBzaG91bGQgYmUgT04KIAogMi4JTWVtb3J5IE1hcAogCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLm1wYzgzeHguZGRyZWNjIGIvZG9jL1JFQURNRS5tcGM4M3h4LmRkcmVjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDI5ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5tcGM4M3h4LmRkcmVjYwpAQCAtMCwwICsxLDE1NCBAQAorT3ZlcnZpZXcKKz09PT09PT09CisKK1RoZSBvdmVyYWxsIHVzYWdlIHBhdHRlcm4gZm9yIEVDQyBkaWFnbm9zdGljIGNvbW1hbmRzIGlzIHRoZSBmb2xsb3dpbmc6CisKKyAgKiAoaW5qZWN0aW5nIGVycm9ycyBpcyBpbml0aWFsbHkgZGlzYWJsZWQpCisKKyAgKiBkZWZpbmUgaW5qZWN0IG1hc2sgKHdoaWNoIHRlbGxzIHRoZSBERFIgY29udHJvbGxlciB3aGF0IHR5cGUgb2YgZXJyb3JzCisgICAgd2UnbGwgYmUgaW5qZWN0aW5nOiBzaW5nbGUvbXVsdGlwbGUgYml0IGV0Yy4pCisKKyAgKiBlbmFibGUgaW5qZWN0aW5nIGVycm9ycyAtIGZyb20gbm93IG9uIHRoZSBjb250cm9sbGVyIGluamVjdHMgZXJyb3JzIGFzCisgICAgaW5kaWNhdGVkIGluIHRoZSBpbmplY3QgbWFzaworCitJTVBPUlRBTlQgTk9USUNFOiBlbmFibGluZyBpbmplY3RpbmcgbXVsdGlwbGUtYml0IGVycm9ycyBpcyBwb3RlbnRpYWxseQorZGFuZ2Vyb3VzIGFzIHN1Y2ggZXJyb3JzIGFyZSBOT1QgY29ycmVjdGVkIGJ5IHRoZSBjb250cm9sbGVyLiBUaGVyZWZvcmUgY2F1dGlvbgorc2hvdWxkIGJlIHRha2VuIHdoZW4gZW5hYmxpbmcgdGhlIGluamVjdGlvbiBvZiBtdWx0aXBsZS1iaXQgZXJyb3JzOiBpdCBpcyBvbmx5CitzYWZlIHdoZW4gdXNlZCBvbiBhIGNhcmVmdWxseSBzZWxlY3RlZCBtZW1vcnkgYXJlYSBhbmQgdXNlZCB1bmRlciBjb250cm9sIG9mCit0aGUgJ2VjYyB0ZXN0ZHcnICdlY2MgdGVzdHdvcmQnIGNvbW1hbmQgKHNlZSBleGFtcGxlICdJbmplY3RpbmcgTXVsdGlwbGUtQml0CitFcnJvcnMnIGJlbG93KS4gSW4gcGFydGljdWxhciwgd2hlbiB5b3Ugc2ltcGx5IHNldCB0aGUgbXVsdGlwbGUtYml0IGVycm9ycyBpbgoraW5qZWN0IG1hc2sgYW5kIGVuYWJsZSBpbmplY3Rpb24sIFUtQm9vdCBpcyB2ZXJ5IGxpa2VseSB0byBoYW5nIHF1aWNrbHkgYXMgdGhlCitlcnJvcnMgd2lsbCBiZSBpbmplY3RlZCB3aGVuIGl0IGFjY2Vzc2VzIGl0cyBjb2RlLCBkYXRhIGV0Yy4KKworCitVc2UgY2FzZXMgZm9yIEREUiAnZWNjJyBjb21tYW5kOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQmVmb3JlIGV4ZWN1dGluZyBwYXJ0aWN1bGFyIHRlc3RzIHJlc2V0IHRhcmdldCBib2FyZCBvciBjbGVhciBzdGF0dXMgcmVnaXN0ZXJzOgorCis9PiBlY2MgY2FwdHVyZWNsZWFyCis9PiBlY2MgZXJyZGV0ZWN0Y2xyIGFsbAorPT4gZWNjIHNiZWNudCAwCisKKworSW5qZWN0aW5nIFNpbmdsZS1CaXQgRXJyb3JzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gU2V0IDEgYml0IGluIERhdGEgUGF0aCBFcnJvciBJbmplY3QgTWFzaworCis9PiBlY2MgaW5qZWN0ZGF0YWhpIDEKKworMi4gUnVuIHRlc3Qgb3ZlciBzb21lIG1lbW9yeSByZWdpb24KKworPT4gZWNjIHRlc3RkdyAyMDAwMDAgMTAKKworMy4gQ2hlY2sgRUNDIHN0YXR1cworCis9PiBlY2Mgc3RhdHVzCisuLi4KK01lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaC9Mb3c6IDAwMDAwMDAxIDAwMDAwMDAwCisuLi4KK01lbW9yeSBTaW5nbGUtQml0IEVycm9yIE1hbmFnZW1lbnQgKDAuLjI1NSk6CisgIFNpbmdsZS1CaXQgRXJyb3IgVGhyZXNob2xkOiAyNTUKKyAgU2luZ2xlIEJpdCBFcnJvciBDb3VudGVyOiAxNgorLi4uCitNZW1vcnkgRXJyb3IgRGV0ZWN0OgorICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAwCisgIE11bHRpcGxlLUJpdCBFcnJvcjogMAorICBTaW5nbGUtQml0IEVycm9yOiAwCisuLi4KKworMTYgZXJyb3JzIHdlcmUgZ2VuZXJhdGVkLCBTaW5nbGUtQml0IEVycm9yIGZsYWcgd2FzIG5vdCBzZXQgYXMgU2luZ2xlIEJpdCBFcnJvcgorQ291bnRlciBkaWQgbm90IHJlYWNoICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZC4KKworNC4gTWFrZSBzdXJlIHVzZWQgbWVtb3J5IHJlZ2lvbiBnb3QgcmUtaW5pdGlhbGl6ZWQgd2l0aCAweDAxMjM0NTY3ODlhYmNkZWYKKworPT4gbWQgMjAwMDAwCiswMDIwMDAwMDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwMTA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDIwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDAzMDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwNDA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDUwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA2MDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwNzA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDgwOiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiAgICAuLi4uLi4uLi4uLi4uLi4uCiswMDIwMDA5MDogZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgICAgLi4uLi4uLi4uLi4uLi4uLgorCitJbmplY3RpbmcgTXVsdGlwbGUtQml0IEVycm9ycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gU2V0IG1vcmUgdGhhbiAxIGJpdCBpbiBEYXRhIFBhdGggRXJyb3IgSW5qZWN0IE1hc2sKKworPT4gZWNjIGluamVjdGRhdGFoaSAxCis9PiBlY2MgaW5qZWN0ZGF0YWxvIDEKKworMi4gUnVuIHRlc3Qgb3ZlciBzb21lIG1lbW9yeSByZWdpb24KKworPT4gZWNjIHRlc3R3b3JkIDIwMDAwMCAxCisKKzMuIENoZWNrIEVDQyBzdGF0dXMKKworPT4gZWNjIHN0YXR1cworLi4uCitNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2gvTG93OiAwMDAwMDAwMSAwMDAwMDAwMQorLi4uCitNZW1vcnkgRXJyb3IgRGV0ZWN0OgorICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAwCisgIE11bHRpcGxlLUJpdCBFcnJvcjogMQorICBTaW5nbGUtQml0IEVycm9yOiAwCisuLi4KKworVGhlIE11bHRpcGxlIE1lbW9yeSBFcnJvcnMgZmxhZ3Mgbm90IHNldCBhbmQgTXVsdGlwbGUtQml0IEVycm9yIGZsYWdzIGFyZSBzZXQuCisKKzQuIE1ha2Ugc3VyZSB1c2VkIG1lbW9yeSByZWdpb24gZ290IHJlLWluaXRpYWxpemVkIHdpdGggMHgwMTIzNDU2Nzg5YWJjZGVmCisKKz0+IG1kIDIwMDAwMAorMDAyMDAwMDA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDEwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDAyMDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwMzA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDQwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA1MDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwNjA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDcwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA4MDogZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgICAgLi4uLi4uLi4uLi4uLi4uLgorMDAyMDAwOTA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KKworCitUZXN0IFNpbmdsZS1CaXQgRXJyb3IgQ291bnRlciBhbmQgVGhyZXNob2xkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIFNldCAxIGJpdCBpbiBEYXRhIFBhdGggRXJyb3IgSW5qZWN0IE1hc2sKKworPT4gZWNjIGluamVjdGRhdGFoaSAxCisKKzIuIEVuYWJsZSBlcnJvciBpbmplY3Rpb24KKworPT4gZWNjIGluamVjdCBlbgorCiszLiBMZXQgdS1ib290IHJ1biBmb3IgYSB3aXRoIFNpbmdsZS1CaXQgZXJyb3IgaW5qZWN0aW9uIGVuYWJsZWQKKworNC4gRGlzYWJsZSBlcnJvciBpbmplY3Rpb24KKworPT4gZWNjIGluamVjdCBkaXMKKworNC4gQ2hlY2sgc3RhdHVzCisKKz0+IGVjYyBzdGF0dXMKKworLi4uCitNZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOgorICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogMjU1CisgIFNpbmdsZSBCaXQgRXJyb3IgQ291bnRlcjogMTk5CisKK01lbW9yeSBFcnJvciBEZXRlY3Q6CisgIE11bHRpcGxlIE1lbW9yeSBFcnJvcnM6IDEKKyAgTXVsdGlwbGUtQml0IEVycm9yOiAwCisgIFNpbmdsZS1CaXQgRXJyb3I6IDEKKy4uLgorCitPYnNlcnZlIHRoYXQgU2luZ2xlLUJpdCBFcnJvciBpcyAnb24nIHdoaWNoIG1lYW5zIHRoYXQgU2luZ2xlLUJpdCBFcnJvciBDb3VudGVyCityZWFjaGVkIFNpbmdsZS1CaXQgRXJyb3IgVGhyZXNob2xkLiBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzIGJpdCBpcyBhbHNvICdvbicsIHRoYXQKK2lzIENvdW50ZXIgcmVhY2hlZCBUaHJlc2hvbGQgbW9yZSB0aGFuIG9uZSB0aW1lIChpdCB3cmFwcyBiYWNrIGFmdGVyIHJlYWNoaW5nCitUaHJlc2hvbGQpLgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5tcGM4NTQ0ZHMgYi9kb2MvUkVBRE1FLm1wYzg1NDRkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI1N2EwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5tcGM4NTQ0ZHMKQEAgLTAsMCArMSwxMjIgQEAKK092ZXJ2aWV3CistLS0tLS0tLQorVGhlIE1QQzg1NDREUyBzeXN0ZW0gaXMgc2ltaWxhciB0byB0aGUgODV4eCBDRFMgc3lzdGVtcyBzdWNoCithcyB0aGUgTVBDODU0OENEUyBkdWUgdG8gdGhlIHNpbWlsYXIgRTUwMCBjb3JlLiAgSG93ZXZlciwgaXQKK2lzIHBsYWNlZCBvbiB0aGUgc2FtZSBib2FyZCBhcyB0aGUgODY0MSBIUENOIHN5c3RlbS4KKworCitGbGFzaCBCYW5rcworLS0tLS0tLS0tLS0KK0xpa2UgdGhlIDg1eHggQ0RTIHN5c3RlbXMsIHRoZSA4NTQ0IERTIGJvYXJkIGhhcyB0d28gZmxhc2ggYmFua3MuCitUaGV5IGFyZSBib3RoIHByZXNlbnQgb24gYm9vdCwgYnV0IHRoZXJlIGxvY2F0aW9ucyBjYW4gYmUgc3dhcHBlZAordXNpbmcgdGhlIGRpcC1zd2l0Y2ggU1cxMCwgYml0IDIuCisKK0hvd2V2ZXIsIHVubGlrZSB0aGUgQ0RTIHN5c3RlbXMsIGJ1dCBzaW1pbGFyIHRvIHRoZSA4NjQxIEhQQ04KK2JvYXJkLCBhIHJ1bnRpbWUgcmVzZXQgdGhyb3VnaCB0aGUgRlBHQSBjYW4gYWxzbyBhZmZlY3QgYSBzd2FwCitvbiB0aGUgZmxhc2ggYmFuayBtYXBwaW5ncyBmb3IgdGhlIG5leHQgcmVzZXQgY3ljbGUuCisKK0lycmVzcGVjdGl2ZSBvZiB0aGUgc3dpdGNoIFNXMTBbMl0sIGJvb3RpbmcgaXMgYWx3YXlzIGZyb20gdGhlCitib290IGJhbmsgYXQgMHhmZmY4XzAwMDAuCisKKworTWVtb3J5IE1hcAorLS0tLS0tLS0tLQorCisweGZmODBfMDAwMCAtIDB4ZmZiZl9mZmZmCUFsZXJuYXRlIGJhbmsJCTRNQgorMHhmZmMwXzAwMDAgLSAweGZmZmZfZmZmZglCb290IGJhbmsJCTRNQgorCisweGZmYjhfMDAwMAkJCUFsdGVybmF0ZSBpbWFnZSBzdGFydAk1MTJLQgorMHhmZmY4XzAwMDAJCQlCb290IGltYWdlIHN0YXJ0CTUxMktCCisKKworRmxhc2hpbmcgSW1hZ2VzCistLS0tLS0tLS0tLS0tLS0KKworRm9yIGV4YW1wbGUsIHRvIHBsYWNlIGEgbmV3IGltYWdlIGluIHRoZSBhbHRlcm5hdGUgZmxhc2ggYmFuaworYW5kIHRoZW4gcmVzZXQgd2l0aCB0aGF0IG5ldyBpbWFnZSB0ZW1wb3JhcmlseSwgdXNlIHRoaXM6CisKKyAgICB0ZnRwIDEwMDAwMDAgdS1ib290LmJpbi44NTQ0ZHMKKyAgICBlcmFzZSBmZmI4MDAwMCBmZmJmZmZmZgorICAgIGNwLmIgMTAwMDAwMCBmZmI4MDAwMCA4MDAwMAorICAgIHBpeGlzX3Jlc2V0IGFsdGJhbmsKKworCitUbyBvdmVyd3JpdGUgdGhlIGltYWdlIGluIHRoZSBib290IGZsYXNoIGJhbms6CisKKyAgICB0ZnRwIDEwMDAwMDAgdS1ib290LmJpbi44NTQ0ZHMKKyAgICBwcm90ZWN0IG9mZiBhbGwKKyAgICBlcmFzZSBmZmY4MDAwMCBmZmZmZmZmZgorICAgIGNwLmIgMTAwMDAwMCBmZmY4MDAwMCA4MDAwMAorCitPdGhlciBleGFtcGxlIFUtQm9vdCBpbWFnZSBhbmQgZmxhc2ggbWFuaXB1bGF0aW9ucyBleGFtcGxlcworY2FuIGJlIGZvdW5kIGluIHRoZSBSRUFETUUubXBjODV4eGNkcyBmaWxlIGFzIHdlbGwuCisKKworVGhlIHBpeGlzX3Jlc2V0IGNvbW1hbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIG5ldyBjb21tYW5kLCAicGl4aXNfcmVzZXQiLCBpcyBpbnRyb2R1Y2VkIHRvIHJlc2V0IG1wYzg2NDFocGNuIGJvYXJkCit1c2luZyB0aGUgRlBHQSBzZXF1ZW5jZXIuICBXaGVuIHRoZSBib2FyZCByZXN0YXJ0cywgaXQgaGFzIHRoZSBvcHRpb24KK29mIHVzaW5nIGVpdGhlciB0aGUgY3VycmVudCBvciBhbHRlcm5hdGUgZmxhc2ggYmFuayBhcyB0aGUgYm9vdAoraW1hZ2UsIHdpdGggb3Igd2l0aG91dCB0aGUgd2F0Y2hkb2cgdGltZXIgZW5hYmxlZCwgYW5kIGZpbmFsbHkgd2l0aAorb3Igd2l0aG91dCBmcmVxdWVuY3kgY2hhbmdlcy4KKworVXNhZ2UgaXM7CisKKwlwaXhpc19yZXNldAorCXBpeGlzX3Jlc2V0IGFsdGJhbmsKKwlwaXhpc19yZXNldCBhbHRiYW5rIHdkCisJcGl4aXNfcmVzZXQgYWx0YmFuayBjZiA8U1lTQ0xLIGZyZXE+IDxDT1JFUExMIHJhdGlvPiA8TVBYUExMIHJhdGlvPgorCXBpeGlzX3Jlc2V0IGNmIDxTWVNDTEsgZnJlcT4gPENPUkVQTEwgcmF0aW8+IDxNUFhQTEwgcmF0aW8+CisKK0V4YW1wbGVzOworCisJLyogcmVzZXQgdG8gY3VycmVudCBiYW5rLCBsaWtlICJyZXNldCIgY29tbWFuZCAqLworCXBpeGlzX3Jlc2V0CisKKwkvKiByZXNldCBib2FyZCBidXQgdXNlIHRoZSB0byBhbHRlcm5hdGUgZmxhc2ggYmFuayAqLworCXBpeGlzX3Jlc2V0IGFsdGJhbmsKKworCS8qIHJlc2V0IGJvYXJkLCB1c2UgYWx0ZXJuYXRlIGZsYXNoIGJhbmsgd2l0aCB3YXRjaGRvZyB0aW1lciBlbmFibGVkKi8KKwlwaXhpc19yZXNldCBhbHRiYW5rIHdkCisKKwkvKiByZXNldCBib2FyZCB0byBhbHRlcm5hdGUgYmFuayB3aXRoIGZyZXF1ZW5jeSBjaGFuZ2VkLgorCSAqIDQwIGlzIFNZU0NMSywgMi41IGlzIENPUkVQTEwgcmF0aW8sIDEwIGlzIE1QWFBMTCByYXRpbworCSAqLworCXBpeGlzLXJlc2V0IGFsdGJhbmsgY2YgNDAgMi41IDEwCisKK1ZhbGlkIGNsb2NrIGNob2ljZXMgYXJlIGluIHRoZSA4NjQxIFJlZmVyZW5jZSBNYW51YWxzLgorCisKK1VzaW5nIHRoZSBEZXZpY2UgVHJlZSBTb3VyY2UgRmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUbyBjcmVhdGUgdGhlIERUQiAoRGV2aWNlIFRyZWUgQmluYXJ5KSBpbWFnZSBmaWxlLAordXNlIGEgY29tbWFuZCBzaW1pbGFyIHRvIHRoaXM6CisKKyAgICBkdGMgLWIgMCAtZiAtSSBkdHMgLU8gZHRiIG1wYzg1NDRkcy5kdHMgPiBtcGM4NTQ0ZHMuZHRiCisKK0xpa2VseSwgdGhhdCAuZHRzIGZpbGUgd2lsbCBjb21lIGZyb20gaGVyZTsKKworICAgIGxpbnV4LTIuNi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cworCitBZnRlciBwbGFjaW5nIHRoZSBEVEIgZmlsZSBpbiB5b3VyIFRGVFAgZGlzayBhcmVhLAoreW91IGNhbiBkb3dubG9hZCB0aGF0IGR0YiBmaWxlIHVzaW5nIGEgY29tbWFuZCBsaWtlOgorCisgICAgdGZ0cCA5MDAwMDAgbXBjODU0NGRzLmR0YgorCitCdXJuIGl0IHRvIGZsYXNoIGlmIHlvdSB3YW50LgorCisKK0Jvb3RpbmcgTGludXgKKy0tLS0tLS0tLS0tLS0KKworUGxhY2UgYSBsaW51eCB1SW1hZ2UgaW4gdGhlIFRGVFAgZGlzayBhcmVhIHRvby4KKworICAgIHRmdHAgMTAwMDAwMCB1SW1hZ2UuODU0NAorICAgIHRmdHAgOTAwMDAwIG1wYzg1NDRkcy5kdGIKKyAgICBib290bSAxMDAwMDAwIC0gOTAwMDAwCisKK1dhdGNoIHlvdXIgZXRoYWN0LCBuZXRkZXYgYW5kIGJvb3RhcmdzIFUtQm9vdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCitZb3UgbWF5IHdhbnQgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcyB0b286CisKKyAgICBzZXRlbnYgZXRoYWN0IGVUU0VDMworICAgIHNldGVudiBuZXRkZXYgZXRoMQpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5uYW5kIGIvZG9jL1JFQURNRS5uYW5kCmluZGV4IDVjMzE4NDUuLmM1YzVlZjIgMTAwNjQ0Ci0tLSBhL2RvYy9SRUFETUUubmFuZAorKysgYi9kb2MvUkVBRE1FLm5hbmQKQEAgLTkzLDggKzkzLDggQEAKIAogQ29uZmlndXJhdGlvbiBPcHRpb25zOgogCi0gICBDRkdfQ01EX05BTkQKLSAgICAgIEEgZ29vZCBvbmUgdG8gYWRkIHRvIENPTkZJR19DT01NQU5EUyBzaW5jZSBpdCBlbmFibGVzIE5BTkQgc3VwcG9ydC4KKyAgIENPTkZJR19DTURfTkFORAorICAgICAgRW5hYmxlcyBOQU5EIHN1cHBvcnQgYW5kIGNvbW1tYW5kcy4KIAogICAgQ09ORklHX01URF9OQU5EX0VDQ19KRkZTMgogICAgICAgRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdGhlIEVycm9yIENvcnJlY3Rpb24gQ29kZSBpbmZvcm1hdGlvbiBpbgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5zYmM4NjQxZCBiL2RvYy9SRUFETUUuc2JjODY0MWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1MTQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUuc2JjODY0MWQKQEAgLTAsMCArMSwyOCBAQAorV2luZCBSaXZlciBTQkM4NjQxRCByZWZlcmVuY2UgYm9hcmQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDcmVhdGVkIDA2LzE0LzIwMDcgSm9lIEhhbW1hbgorQ29weXJpZ2h0IDIwMDcsIEVtYmVkZGVkIFNwZWNpYWx0aWVzLCBJbmMuCitDb3B5cmlnaHQgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbWVzLCBJbmMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisxLiBCdWlsZGluZyBVLUJvb3QKKy0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIFNCQzg2NDFEIGNvZGUgaXMga25vd24gdG8gYnVpbGQgdXNpbmcgRUxESyA0LjEuCisKKyAgICAkIG1ha2Ugc2JjODY0MWRfY29uZmlnCisgICAgQ29uZmlndXJpbmcgZm9yIHNiYzg2NDFkIGJvYXJkLi4uCisKKyAgICAkIG1ha2UKKworCisyLiBTd2l0Y2ggYW5kIEp1bXBlciBTZXR0aW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbCBKdW1wZXJzICYgU3dpdGNoZXMgYXJlIGluIHRoZWlyIGRlZmF1bHQgcG9zaXRpb25zLiAgUGxlYXNlIHJlZmVyIHRvCit0aGUgYm9hcmQgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4gIFNvbWUgc2V0dGluZ3MgY29udHJvbCBDUFUgdm9sdGFnZXMKK2FuZCBzZXR0aW5ncyBtYXkgY2hhbmdlIHdpdGggYm9hcmQgcmV2aXNpb25zLgorCiszLiBLbm93biBsaW1pdGF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BDSToKKwlUaGUgUENJIGNvbW1hbmQgbWF5IGhhbmcgaWYgbm8gYm9hcmRzIGFyZSBwcmVzZW50IGluIGVpdGhlciBzbG90LgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5zaGExIGIvZG9jL1JFQURNRS5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTJmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLnNoYTEKQEAgLTAsMCArMSw1NyBAQAorU0hBMSB1c2FnZToKKy0tLS0tLS0tLS0tCisKK0luIHRoZSBVLUJvb3QgSW1hZ2UgZm9yIHRoZSBwY3M0NDBlcCBib2FyZCBpcyBhIFNIQTEgY2hlY2tzdW0gaW50ZWdyYXRlZC4KK1RoaXMgU0hBMSBzdW0gaXMgdXNlZCwgdG8gY2hlY2ssIGlmIHRoZSBVLUJvb3QgSW1hZ2UgaW4gRmxhc2ggaXMgbm90Citjb3JydXB0ZWQuCisKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCBpcyBhdmFpbGFibGU6CisKKz0+IGhlbHAgc2hhMQorc2hhMSBhZGRyZXNzIGxlbiBbYWRkcl0gIGNhbGN1bGF0ZSB0aGUgU0hBMSBzdW0gW3NhdmUgYXQgYWRkcl0KKyAgICAgLXAgY2FsY3VsYXRlIHRoZSBTSEExIHN1bSBmcm9tIHRoZSBVLUJvb3QgaW1hZ2UgaW4gZmxhc2ggYW5kIHByaW50CisgICAgIC1jIGNoZWNrIHRoZSBVLUJvb3QgaW1hZ2UgaW4gZmxhc2gKKworInNoYTEgLXAiCisJY2FsY3VsYXRlcyBhbmQgcHJpbnRzIHRoZSBTSEExIHN1bSwgZnJvbSB0aGUgSW1hZ2Ugc3RvcmVkIGluIEZsYXNoCisKKyJzaGExIC1jIgorCWNoZWNrLCBpZiB0aGUgU0hBMSBzdW0gZnJvbSB0aGUgSW1hZ2Ugc3RvcmVkIGluIEZsYXNoIGlzIGNvcnJlY3QKKworCitJdCBpcyBwb3NzaWJsZSB0byBjYWxjdWxhdGUgYSBTSEExIGNoZWNrc3VtIGZyb20gYSBtZW1vcnlyYW5nZSB3aXRoOgorCisic2hhMSBhZGRyZXNzIGxlbiIKKworSWYgeW91IHdhbnQgdG8gc3RvcmUgYSBuZXcgSW1hZ2UgaW4gRmxhc2ggZm9yIHRoZSBwY3M0NDBlcCBib2FyZCwKK3doaWNoIGhhcyBubyBTSEExIHN1bSwgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgorCithKSBjcCB0aGUgbmV3IEltYWdlIG9uIGEgcG9zaXRpb24gaW4gUkFNIChoZXJlIDB4MzAwMDAwKQorICAgKGZvciB0aGlzIGV4YW1wbGUgd2UgdXNlIHRoZSBJbWFnZSBmcm9tIEZsYXNoLCBzdG9yZWQgYXQgMHhmZmZhMDAwMCBhbmQKKyAgICAweDYwMDAwIEJ5dGVzIGxvbmcpCisKKyJjcC5iIGZmZmEwMDAwIDMwMDAwMCA2MDAwMCIKKworYikgSW5pdGlhbGl6ZSB0aGUgU0hBMSBzdW0gaW4gdGhlIEltYWdlIHdpdGggMHgwMAorICAgVGhlIFNIQTEgc3VtIGlzIHN0b3JlZCBpbiBGbGFzaCBhdDoKKwkJCSAgIENGR19NT05JVE9SX0JBU0UgKyBDRkdfTU9OSVRPUl9MRU4gKyBTSEExX1NVTV9QT1MKKyAgIGZvciB0aGUgcGNzNDQwZXAgRmxhc2g6CSAweGZmZmEwMDAwICsJICAgICAgMHg2MDAwMCArICAgICAgICAtMHgyMAorCQkJICAgID0gMHhmZmZmZmZlMAorICAgZm9yIHRoZSBleGFtcGxlIGluIFJBTToJICAgMHgzMDAwMDAgKwkgICAgICAweDYwMDAwICsgICAgICAgIC0weDIwCisJCQkgICAgPSAweDM1ZmZlMAorCisgICBub3RlOiBhIFNIQTEgY2hlY2tzdW0gaXMgMjAgYnl0ZXMgbG9uZy4KKworIm13LmIgMzVmZmUwIDAgMTQiCisKK2MpIG5vdyBjYWxjdWxhdGUgdGhlIFNIQTEgc3VtIGZyb20gdGhlIG1lbW9yeXJhbmdlIGFuZCB3cml0ZQorICAgdGhlIGNhbGN1bGF0ZWQgY2hlY2tzdW0gYXQgdGhlIHJpZ2h0IHBsYWNlOgorCisic2hhMSAzMDAwMDAgNjAwMDAgMzVmZmUwIgorCitOb3cgeW91IGhhdmUgYSBVLUJvb3QtSW1hZ2UgZm9yIHRoZSBwY3M0NDBlcCBib2FyZCB3aXRoIHRoZSBjb3JyZWN0IFNIQTEgc3VtLgorCitJZiB5b3UgZG8gYSAiLi9NQUtFQUxMIHBjczQ0MGVwIiBvciBhICJtYWtlIGFsbCIgdG8gZ2V0IHRoZSBVLUJvb3QgaW1hZ2UsCit0aGUgY29ycmVjdCBTSEExIHN1bSB3aWxsIGJlIGF1dG9tYWdpY2FsbHkgaW5jbHVkZWQgaW4gdGhlIFUtQm9vdCBpbWFnZS4KKworSGVpa28gU2Nob2NoZXIsIDExIEp1bCAyMDA3CmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLnVzYiBiL2RvYy9SRUFETUUudXNiCmluZGV4IDQxZjc2ZjQuLmIzYmNiOTEgMTAwNjQ0Ci0tLSBhL2RvYy9SRUFETUUudXNiCisrKyBiL2RvYy9SRUFETUUudXNiCkBAIC03Myw4ICs3Myw4IEBACiAKIENvbmZpZyBTd2l0Y2hlczoKIC0tLS0tLS0tLS0tLS0tLS0KLUNGR19DTURfVVNCCSAgICBlbmFibGVzIGJhc2ljIFVTQiBzdXBwb3J0IGFuZCB0aGUgdXNiIGNvbW1hbmQKLUNPTkZJR19VU0JfVUhDSQkgICAgZGVmaW5lcyB0aGUgbG93bGV2ZWwgcGFydC5BIGxvd2xldmVsIHBhcnQgbXVzdCBiZSBkZWZpbmVkIGlmCi0JCSAgICB1c2luZyBDRkdfQ01EX1VTQgorQ09ORklHX0NNRF9VU0IJICAgIGVuYWJsZXMgYmFzaWMgVVNCIHN1cHBvcnQgYW5kIHRoZSB1c2IgY29tbWFuZAorQ09ORklHX1VTQl9VSENJCSAgICBkZWZpbmVzIHRoZSBsb3dsZXZlbCBwYXJ0LkEgbG93bGV2ZWwgcGFydCBtdXN0IGJlIGRlZmluZWQKKwkJICAgIGlmIHVzaW5nIENPTkZJR19DTURfVVNCCiBDT05GSUdfVVNCX0tFWUJPQVJEIGVuYWJsZXMgdGhlIFVTQiBLZXlib2FyZAogQ09ORklHX1VTQl9TVE9SQUdFICBlbmFibGVzIHRoZSBVU0Igc3RvcmFnZSBkZXZpY2VzCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLnpldXMgYi9kb2MvUkVBRE1FLnpldXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0OGQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUuemV1cwpAQCAtMCwwICsxLDczIEBACisKK1N0b3JhZ2Ugb2YgdGhlIGJvYXJkIHNwZWNpZmljIHZhbHVlcyAoZXRoYWRkci4uLikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGJvYXJkIHNwZWNpZmljIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSB1bmlxdWUKK2ZvciBlYWNoIGluZGl2aWR1YWwgYm9hcmQsIGNhbiBiZSBzdG9yZWQgaW4gdGhlIEkyQyBFRVBST00uIFRoaXMKK3dpbGwgYmUgZG9uZSBmcm9tIG9mZnNldCAweDgwIHdpdGggdGhlIGxlbmd0aCBvZiAweDgwIGJ5dGVzLiBUaGUKK2ZvbGxvd2luZyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHN0b3JlIHRoZSB2YWx1ZXMgaGVyZToKKworPT4gc2V0ZGVmIGRlOjIwOjZhOmVkOmUyOjcyIGRlOjIwOjZhOmVkOmUyOjczIEFCMDAwMQorCisJICBldGhhZGRyICAgICAgICAgICBldGgxYWRkciAgICAgICAgICBzZXJpYWwjCisKK05vdyB0aG9zZSAzIHZhbHVlcyBhcmUgc3RvcmVkIGludG8gdGhlIEkyQyBFRVBST00uIEEgQ1JDIGlzIGFkZGVkCit0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGdldCBub3QgY29ycnVwdGVkLgorCisKK1NXLVJlc2V0IFB1c2hidXR0b24gaGFuZGxpbmc6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgU1ctcmVzZXQgcHVzaCBidXR0b24gaXMgY29ubmVjdGVkIHRvIGEgR1BJTyBpbnB1dCB0b28uIFRoaXMKK3dheSBVLUJvb3QgY2FuICJzZWUiIGhvdyBsb25nIHRoZSBTVy1yZXNldCB3YXMgcHJlc3NlZCwgYW5kIGEKK3NwZWNpZmljIGFjdGlvbiBjYW4gYmUgdGFrZW4uIFR3byBkaWZmZXJlbnQgYWN0aW9ucyBhcmUgc3VwcG9ydGVkOgorCithKSBSZWxlYXNlIGFmdGVyIG1vcmUgdGhhbiA1IHNlY29uZHMgYW5kIGxlc3MgdGhlbiAxMCBzZWNvbmRzOgorICAgLT4gUnVuIFBPU1QKKworICAgUGxlYXNlIG5vdGUsIHRoYXQgdGhlIFBPU1QgdGVzdCB3aWxsIHRha2UgYSB3aGlsZSAoYXBwcm94LiAxIG1pbgorICAgb24gdGhlIDEyOE1CeXRlIGJvYXJkKS4gVGhpcyBpcyBtYWlubHkgZHVlIHRvIHRoZSBzeXN0ZW0gbWVtb3J5CisgICB0ZXN0LgorCitiKSBSZWxlYXNlIGFmdGVyIG1vcmUgdGhhbiAxMCBzZWNvbmRzOgorICAgLT4gUmVzdG9yZSBmYWN0b3J5IGRlZmF1bHQgc2V0dGluZ3MKKworICAgVGhlIGZhY3RvcnkgZGVmYXVsdCB2YWx1ZXMgYXJlIHJlc3RvcmVkLiBUaGUgZGVmYXVsdCBlbnZpcm9ubWVudAorICAgdmFyaWFibGVzIGFyZSByZXN0b3JlZCAoaXBhZGRyLCBzZXJ2ZXJpcC4uLikgYW5kIHRoZSBib2FyZAorICAgc3BlY2lmaWMgdmFsdWVzIChldGhhZGRyLCBldGgxYWRkciBhbmQgc2VyaWFsIykgYXJlIHJlc3RvcmVkCisgICB0byB0aGUgZW52aXJvbm1lbnQgZnJvbSB0aGUgSTJDIEVFUFJPTS4gQWxzbyBhIGJvb3RsaW5lIHBhcmFtZXRlcgorICAgaXMgYWRkZWQgdG8gdGhlIExpbnV4IGJvb3RsaW5lIHRvIHNpZ25hbCB0aGUgTGludXgga2VybmVsIHVwb24KKyAgIHRoZSBuZXh0IHN0YXJ0dXAsIHRoYXQgdGhlIGZhY3RvcnkgZGVmYXVsdHMgc2hvdWxkIGJlIHJlc3RvcmVkLgorCitUaGUgY29tbWFuZCB0byBjaGVjayB0aGlzIHN3LXJlc2V0IHN0YXR1cyBhbmQgYWN0IGFjY29yZGluZ2x5IGlzCisKKz0+IGNoa3Jlc2V0CisKK1RoaXMgY29tbWFuZCBpcyBhZGRlZCB0byB0aGUgZGVmYXVsdCAiYm9vdGNtZCIsIHNvIHRoYXQgaXQgaXMgY2FsbGVkCithdXRvbWF0aWNhbGx5IHVwb24gc3RhcnR1cC4KKworQWxzbywgdGhlIDIgTEVEJ3MgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoaXMKK2NvbW1hbmQgKHRpbWUgcGFzc2VkIHNpbmNlIHB1c2hpbmcgdGhlIGJ1dHRvbikuIFdoZW4gdGhlIFBPU1QgdGVzdAord2lsbCBiZSBydW4sIHRoZSBncmVlbiBMRUQgd2lsbCBiZSBzd2l0Y2hlZCBvZmYsIGFuZCB3aGVuIHRoZQorZmFjdG9yeSByZXN0b3JlIHdpbGwgYmUgaW5pdGlhdGVkLCB0aGUgcmVnIExFRCB3aWxsIGJlIHN3aXRjaGVkIG9mZi4KKworCitMb2dnaW4gb2YgUE9TVCByZXN1bHRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHJlc3VsdHMgb2YgdGhlIFBPU1QgdGVzdHMgYXJlIGxvZ2dlZCBpbiBhIGxvZ2J1ZmZlciBsb2NhdGVkIGF0IHRoZSBlbmQKK29mIHRoZSBvbmJvYXJkIG1lbW9yeS4gSXQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIFUtQm9vdCBjb21tYW5kICJsb2ciOgorCis9PiBsb2cgc2hvdworPDQ+UE9TVCBtZW1vcnkgUEFTU0VECis8ND5QT1NUIGNhY2hlIFBBU1NFRAorPDQ+UE9TVCBjcHUgUEFTU0VECis8ND5QT1NUIHVhcnQgUEFTU0VECis8ND5QT1NUIGV0aGVybmV0IFBBU1NFRAorCitUaGUgREVOWCBMaW51eCBrZXJuZWwgdHJlZSBoYXMgc3VwcG9ydCBmb3IgdGhpcyBsb2cgYnVmZmVyIGluY2x1ZGVkLiBFeGFjdGx5Cit0aGlzIGJ1ZmZlciBpcyB1c2VkIGZvciBsb2dnaW5nIG9mIGFsbCBrZXJuZWwgbWVzc2FnZXMgdG9vLiBCeSBlbmFibGluZyB0aGUKK2NvbXBpbGUgdGltZSBvcHRpb24gIkNPTkZJR19MT0dCVUZGRVIiIHRoaXMgc3VwcG9ydCBpcyBlbmFibGVkLiBUaGlzIHdheSB5b3UKK2NhbiBhY2Nlc3MgdGhlIFUtQm9vdCBsb2cgbWVzc2FnZXMgZnJvbSBMaW51eCB0b28uCisKKzIwMDctMDgtMTAsIFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNDhmZDRlYS4uM2VlNjMxMgotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTI3LDExICsyNywxMSBAQAogCiBMSUIJPSAkKG9iailsaWJkcml2ZXJzLmEKIAotQ09CSlMJPSAzYzU4OS5vIDU3MDFybHMubyBhbGk1MTJ4Lm8gYXRhX3BpaXgubyBhdG1lbF91c2FydC5vIFwKK0NPQkpTCT0gM2M1ODkubyA1NzAxcmxzLm8gYWxpNTEyeC5vIGF0NDUubyBhdGFfcGlpeC5vIGF0bWVsX3VzYXJ0Lm8gXAogCSAgYmNtNTcweC5vIGJjbTU3MHhfYXV0b25lZy5vIGNmYl9jb25zb2xlLm8gY2ZpX2ZsYXNoLm8gXAogCSAgY3M4OTAwLm8gY3Q2OTAwMC5vIGRhdGFmbGFzaC5vIGRjMjExNHgubyBkbTkwMDB4Lm8gXAogCSAgZTEwMDAubyBlZXBybzEwMC5vIGVuYzI4ajYwLm8gXAotCSAgaTgwNDIubyBpbmNhLWlwX3N3Lm8ga2V5Ym9hcmQubyBcCisJICBpODA0Mi5vIGluY2EtaXBfc3cubyBpc3AxMTZ4LWhjZC5vIGtleWJvYXJkLm8gXAogCSAgbGFuOTFjOTYubyBtYWNiLm8gXAogCSAgbmF0c2VtaS5vIG5lMjAwMC5vIG5ldGFybV9ldGgubyBuZXRjb25zb2xlLm8gXAogCSAgbnMxNjU1MC5vIG5zODM4MngubyBuczg3MzA4Lm8gbnM3NTIwX2V0aC5vIG9tYXAxNTEwX2kyYy5vIFwKQEAgLTQ3LDEyICs0NywxNCBAQAogCSAgc3RhdHVzX2xlZC5vIHN5bTUzYzh4eC5vIHN5c3RlbWFjZS5vIGFoY2kubyBcCiAJICB0aV9wY2kxNDEwYS5vIHRpZ29uMy5vIHRzZWMubyBcCiAJICB0c2kxMDhfZXRoLm8gdHNpMTA4X2kyYy5vIHRzaTEwOF9wY2kubyBcCi0JICB1c2JkY29yZS5vIHVzYmRjb3JlX2VwMC5vIHVzYmRjb3JlX29tYXAxNTEwLm8gdXNidHR5Lm8gXAorCSAgdXNiX29oY2kubyBcCisJICB1c2JkY29yZS5vIHVzYmRjb3JlX2VwMC5vIHVzYmRjb3JlX21wYzh4eC5vIHVzYmRjb3JlX29tYXAxNTEwLm8gXAorCSAgdXNidHR5Lm8gXAogCSAgdmlkZW9tb2Rlcy5vIHc4M2M1NTNmLm8gXAogCSAga3M4Njk1ZXRoLm8gXAogCSAgcHhhX3BjbWNpYS5vIG1wYzh4eF9wY21jaWEubyB0cW04eHhfcGNtY2lhLm8JXAogCSAgcnB4X3BjbWNpYS5vIFwKLQkgIGZzbF9pMmMubworCSAgZnNsX2kyYy5vIGZzbF9wY2lfaW5pdC5vIGF0aV9yYWRlb25fZmIubwogCiBTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWhjaS5jIGIvZHJpdmVycy9haGNpLmMKaW5kZXggOGNlZmYwMC4uM2Q4MmM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9haGNpLmMKKysrIGIvZHJpdmVycy9haGNpLmMKQEAgLTI1MywxMyArMjUzLDE0IEBACiAKIHN0YXRpYyBpbnQgYWhjaV9pbml0X29uZShwY2lfZGV2X3QgcGRldikKIHsKLQl1MzIgaW9iYXNlLCB2ZW5kb3I7CisJdTMyIGlvYmFzZTsKKwl1MTYgdmVuZG9yOwogCWludCByYzsKIAogCW1lbXNldCgodm9pZCAqKWF0YWlkLCAwLCBzaXplb2YoaGRfZHJpdmVpZF90ICopICogQUhDSV9NQVhfUE9SVFMpOwogCi0JcHJvYmVfZW50ID0gbWFsbG9jKHNpemVvZihwcm9iZV9lbnQpKTsKLQltZW1zZXQocHJvYmVfZW50LCAwLCBzaXplb2YocHJvYmVfZW50KSk7CisJcHJvYmVfZW50ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWhjaV9wcm9iZV9lbnQpKTsKKwltZW1zZXQocHJvYmVfZW50LCAwLCBzaXplb2Yoc3RydWN0IGFoY2lfcHJvYmVfZW50KSk7CiAJcHJvYmVfZW50LT5kZXYgPSBwZGV2OwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIEFIQ0lfUENJX0JBUiwgJmlvYmFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0NDUuYyBiL2RyaXZlcnMvYXQ0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwN2ZmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0NDUuYwpAQCAtMCwwICsxLDU2NiBAQAorLyogRHJpdmVyIGZvciBBVE1FTCBEYXRhRmxhc2ggc3VwcG9ydAorICogQXV0aG9yIDogSGFtaWQgSWtkb3VtaSAoQXRtZWwpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19IQVNfREFUQUZMQVNICisjaW5jbHVkZSA8ZGF0YWZsYXNoLmg+CisKKy8qCisgKiBzcGkuYyBBUEkKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludAlBVDkxRl9TcGlXcml0ZSAoQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MpOworZXh0ZXJuIHZvaWQgCQlBVDkxRl9TcGlFbmFibGUoaW50IGNzKTsKKworI2RlZmluZSBBVDkxQ19USU1FT1VUX1dSRFkJCQkyMDAwMDAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogXGZuICAgIEFUOTFGX0RhdGFGbGFzaFNlbmRDb21tYW5kCQkJCQkqLworLyogXGJyaWVmIEdlbmVyaWMgZnVuY3Rpb24gdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGRhdGFmbGFzaAkJKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoU2VuZENvbW1hbmQoCisJQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAorCXVuc2lnbmVkIGNoYXIgT3BDb2RlLAorCXVuc2lnbmVkIGludCBDbWRTaXplLAorCXVuc2lnbmVkIGludCBEYXRhZmxhc2hBZGRyZXNzKQoreworCXVuc2lnbmVkIGludCBhZHI7CisKKwlpZiAoIChwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+c3RhdGUpICE9IElETEUpCisJCXJldHVybiBEQVRBRkxBU0hfQlVTWTsKKworCS8qIHByb2Nlc3MgdGhlIGFkZHJlc3MgdG8gb2J0YWluIHBhZ2UgYWRkcmVzcyBhbmQgYnl0ZSBhZGRyZXNzICovCisJYWRyID0gKChEYXRhZmxhc2hBZGRyZXNzIC8gKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKSA8PAorCQlwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlX29mZnNldCkgKyAoRGF0YWZsYXNoQWRkcmVzcyAlCisJCShwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplKSk7CisKKwkvKiBmaWxsIHRoZSAgY29tbWFuZCAgYnVmZmVyICovCisJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMF0gPSBPcENvZGU7CisJaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkgeworCQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFsxXSA9CisJCQkodW5zaWduZWQgY2hhcikoKGFkciAmIDB4MEYwMDAwMDApID4+IDI0KTsKKwkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPQorCQkJKHVuc2lnbmVkIGNoYXIpKChhZHIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzNdID0KKwkJCSh1bnNpZ25lZCBjaGFyKSgoYWRyICYgMHgwMDAwRkYwMCkgPj4gOCk7CisJCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzRdID0KKwkJCSh1bnNpZ25lZCBjaGFyKShhZHIgJiAweDAwMDAwMEZGKTsKKwl9IGVsc2UgeworCQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFsxXSA9CisJCQkodW5zaWduZWQgY2hhcikoKGFkciAmIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPQorCQkJKHVuc2lnbmVkIGNoYXIpKChhZHIgJiAweDAwMDBGRjAwKSA+PiA4KTsKKwkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbM10gPQorCQkJKHVuc2lnbmVkIGNoYXIpKGFkciAmIDB4MDAwMDAwRkYpOworCQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFs0XSA9IDA7CisJfQorCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzVdID0gMDsKKwlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFs2XSA9IDA7CisJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbN10gPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgU3BpRGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGkgd3JpdGUgZnVjdGlvbiAqLworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9jbWRfcHQgICA9CisJCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kOworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9jbWRfc2l6ZSA9ICBDbWRTaXplOworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9jbWRfcHQgICA9CisJCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kOworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9jbWRfc2l6ZSA9ICBDbWRTaXplOworCisJLyogc2VuZCB0aGUgY29tbWFuZCBhbmQgcmVhZCB0aGUgZGF0YSAqLworCXJldHVybiBBVDkxRl9TcGlXcml0ZSAocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MpOyB9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFxmbiAgICBBVDkxRl9EYXRhRmxhc2hHZXRTdGF0dXMJCQkJCSovCisvKiBcYnJpZWYgUmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBkYXRhZmxhc2gJCQkqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hHZXRTdGF0dXMoQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MpCit7CisJQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIHN0YXR1czsKKworCS8qIGlmIGEgdHJhbnNmZXJ0IGlzIGluIHByb2dyZXNzID09PiByZXR1cm4gMCAqLworCWlmKCAocERlc2MtPnN0YXRlKSAhPSBJRExFKQorCQlyZXR1cm4gREFUQUZMQVNIX0JVU1k7CisKKwkvKiBmaXJzdCBzZW5kIHRoZSByZWFkIHN0YXR1cyBjb21tYW5kIChEN0gpICovCisJcERlc2MtPmNvbW1hbmRbMF0gPSBEQl9TVEFUVVM7CisJcERlc2MtPmNvbW1hbmRbMV0gPSAwOworCisJcERlc2MtPkRhdGFGbGFzaF9zdGF0ZSAgPSBHRVRfU1RBVFVTOworCXBEZXNjLT50eF9kYXRhX3NpemUgCT0gMDsJLyogVHJhbnNtaXQgdGhlIGNvbW1hbmQgKi8KKwkJCQkJLyogYW5kIHJlY2VpdmUgcmVzcG9uc2UgKi8KKwlwRGVzYy0+dHhfY21kX3B0IAkJPSBwRGVzYy0+Y29tbWFuZDsKKwlwRGVzYy0+cnhfY21kX3B0IAkJPSBwRGVzYy0+Y29tbWFuZDsKKwlwRGVzYy0+cnhfY21kX3NpemUgCQk9IDI7CisJcERlc2MtPnR4X2NtZF9zaXplIAkJPSAyOworCXN0YXR1cyA9IEFUOTFGX1NwaVdyaXRlIChwRGVzYyk7CisKKwlwRGVzYy0+RGF0YUZsYXNoX3N0YXRlID0gKiggKHVuc2lnbmVkIGNoYXIgKikgKHBEZXNjLT5yeF9jbWRfcHQpICsxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFxmbiAgICBBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkJCQkJCSovCisvKiBcYnJpZWYgd2FpdCBmb3IgZGF0YWZsYXNoIHJlYWR5IChiaXQ3IG9mIHRoZSBzdGF0dXMgcmVnaXN0ZXIgPT0gMSkJKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KEFUOTFQU19EYXRhZmxhc2hEZXNjCitwRGF0YUZsYXNoRGVzYywgdW5zaWduZWQgaW50IHRpbWVvdXQpCit7CisJcERhdGFGbGFzaERlc2MtPkRhdGFGbGFzaF9zdGF0ZSA9IElETEU7CisKKwlkbyB7CisJCUFUOTFGX0RhdGFGbGFzaEdldFN0YXR1cyhwRGF0YUZsYXNoRGVzYyk7CisJCXRpbWVvdXQtLTsKKwl9IHdoaWxlKCAoKHBEYXRhRmxhc2hEZXNjLT5EYXRhRmxhc2hfc3RhdGUgJiAweDgwKSAhPSAweDgwKSAmJgorCQkJKHRpbWVvdXQgPiAwKSApOworCisJaWYoKHBEYXRhRmxhc2hEZXNjLT5EYXRhRmxhc2hfc3RhdGUgJiAweDgwKSAhPSAweDgwKQorCQlyZXR1cm4gREFUQUZMQVNIX0VSUk9SOworCisJcmV0dXJuIERBVEFGTEFTSF9PSzsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9EYXRhRmxhc2hDb250aW51b3VzUmVhZCAJCQkgICAgKi8KKy8qIE9iamVjdCAgICAgICAgICAgICAgOiBDb250aW51b3VzIHN0cmVhbSBSZWFkIAkJCSAgICAqLworLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCSAgICAqLworLyoJCQkJCQk6IDxzcmM+ID0gZGF0YWZsYXNoIGFkZHJlc3MgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgOiA8KmRhdGFCdWZmZXI+ID0gZGF0YSBidWZmZXIgcG9pbnRlcgkJICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgIDogPHNpemVUb1JlYWQ+ID0gZGF0YSBidWZmZXIgc2l6ZQkJICAgICovCisvKiBSZXR1cm4gdmFsdWUJCTogU3RhdGUgb2YgdGhlIGRhdGFmbGFzaAkJCSAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoQ29udGludW91c1JlYWQgKAorCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKKwlpbnQgc3JjLAorCXVuc2lnbmVkIGNoYXIgKmRhdGFCdWZmZXIsCisJaW50IHNpemVUb1JlYWQgKQoreworCUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBzdGF0dXM7CisJLyogVGVzdCB0aGUgc2l6ZSB0byByZWFkIGluIHRoZSBkZXZpY2UgKi8KKwlpZiAoIChzcmMgKyBzaXplVG9SZWFkKSA+CisJCShwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplICoKKwkJKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlcikpKQorCQlyZXR1cm4gREFUQUZMQVNIX01FTU9SWV9PVkVSRkxPVzsKKworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9kYXRhX3B0ID0gZGF0YUJ1ZmZlcjsKKwlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+cnhfZGF0YV9zaXplID0gc2l6ZVRvUmVhZDsKKwlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfZGF0YV9wdCA9IGRhdGFCdWZmZXI7CisJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfc2l6ZSA9IHNpemVUb1JlYWQ7CisKKwlzdGF0dXMgPSBBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZAorCQkJKHBEYXRhRmxhc2gsIERCX0NPTlRJTlVPVVNfQVJSQVlfUkVBRCwgOCwgc3JjKTsKKwkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBkYXRhZmxhc2ggKi8KKwlyZXR1cm4oc3RhdHVzKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfRGF0YUZsYXNoUGFnZVBnbUJ1ZgkJCSAgICAgKi8KKy8qIE9iamVjdCAgICAgICAgICAgICAgOiBNYWluIG1lbW9yeSBwYWdlIHByb2dyYW0gdGhydSBidWZmZXIgMSBvciBidWZmZXIgMiAgKi8KKy8qIElucHV0IFBhcmFtZXRlcnMgICAgOiBEYXRhRmxhc2ggU2VydmljZQkJCQkgICAgICovCisvKgkJCQkJCTogPCpzcmM+ID0gU291cmNlIGJ1ZmZlciAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgOiA8ZGVzdD4gPSBkYXRhZmxhc2ggZGVzdGluYXRpb24gYWRkcmVzcwkJICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA6IDxTaXplVG9Xcml0ZT4gPSBkYXRhIGJ1ZmZlciBzaXplCQkgICAgICovCisvKiBSZXR1cm4gdmFsdWUJCTogU3RhdGUgb2YgdGhlIGRhdGFmbGFzaAkJCSAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hQYWdlUGdtQnVmKAorCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKKwl1bnNpZ25lZCBjaGFyICpzcmMsCisJdW5zaWduZWQgaW50IGRlc3QsCisJdW5zaWduZWQgaW50IFNpemVUb1dyaXRlKQoreworCWludCBjbWRzaXplOworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3B0ID0gc3JjOworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3NpemUgPSBTaXplVG9Xcml0ZTsKKwlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+cnhfZGF0YV9wdCA9IHNyYzsKKwlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+cnhfZGF0YV9zaXplID0gU2l6ZVRvV3JpdGU7CisKKwljbWRzaXplID0gNDsKKwkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBkYXRhZmxhc2ggKi8KKwlpZiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyID49IDE2Mzg0KQorCQljbWRzaXplID0gNTsKKwlyZXR1cm4oQVQ5MUZfRGF0YUZsYXNoU2VuZENvbW1hbmQgKHBEYXRhRmxhc2gsIERCX1BBR0VfUEdNX0JVRjEsCitjbWRzaXplLCBkZXN0KSk7IH0KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfTWFpbk1lbW9yeVRvQnVmZmVyVHJhbnNmZXJ0CQkgICAgICovCisvKiBPYmplY3QgICAgICAgICAgICAgIDogUmVhZCBhIHBhZ2UgaW4gdGhlIFNSQU0gQnVmZmVyIDEgb3IgMgkJICAgICAqLworLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgOiBQYWdlIGNvbmNlcm5lZAkJCQkJICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA6IAkJCQkJCSAgICAgKi8KKy8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX01haW5NZW1vcnlUb0J1ZmZlclRyYW5zZmVydCgKKwlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCisJdW5zaWduZWQgY2hhciBCdWZmZXJDb21tYW5kLAorCXVuc2lnbmVkIGludCBwYWdlKQoreworCWludCBjbWRzaXplOworCS8qIFRlc3QgaWYgdGhlIGJ1ZmZlciBjb21tYW5kIGlzIGxlZ2FsICovCisJaWYgKChCdWZmZXJDb21tYW5kICE9IERCX1BBR0VfMl9CVUYxX1RSRikKKwkJJiYgKEJ1ZmZlckNvbW1hbmQgIT0gREJfUEFHRV8yX0JVRjJfVFJGKSkKKwkJcmV0dXJuIERBVEFGTEFTSF9CQURfQ09NTUFORDsKKworCS8qIG5vIGRhdGEgdG8gdHJhbnNtaXQgb3IgcmVjZWl2ZSAqLworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3NpemUgPSAwOworCWNtZHNpemUgPSA0OworCWlmIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIgPj0gMTYzODQpCisJCWNtZHNpemUgPSA1OworCXJldHVybihBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZCAocERhdGFGbGFzaCwgQnVmZmVyQ29tbWFuZCwgY21kc2l6ZSwKK3BhZ2UqcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9EYXRhRmxhc2hXcml0ZUJ1ZmZlcgkJCSAgICAgKi8KKy8qIE9iamVjdCAgICAgICAgICAgICAgOiBXcml0ZSBkYXRhIHRvIHRoZSBpbnRlcm5hbCBzcmFtIGJ1ZmZlciAxIG9yIDIJICAgICAqLworLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCSAgICAgKi8KKy8qCQkJOiA8QnVmZmVyQ29tbWFuZD4gPSBjb21tYW5kIHRvIHdyaXRlIGJ1ZmZlcjEgb3IgMiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA6IDwqZGF0YUJ1ZmZlcj4gPSBkYXRhIGJ1ZmZlciB0byB3cml0ZQkJICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA6IDxidWZmZXJBZGRyZXNzPiA9IGFkZHJlc3MgaW4gdGhlIGludGVybmFsIGJ1ZmZlciAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA6IDxTaXplVG9Xcml0ZT4gPSBkYXRhIGJ1ZmZlciBzaXplCQkgICAgICovCisvKiBSZXR1cm4gdmFsdWUJCTogU3RhdGUgb2YgdGhlIGRhdGFmbGFzaAkJCSAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hXcml0ZUJ1ZmZlciAoCisJQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAorCXVuc2lnbmVkIGNoYXIgQnVmZmVyQ29tbWFuZCwKKwl1bnNpZ25lZCBjaGFyICpkYXRhQnVmZmVyLAorCXVuc2lnbmVkIGludCBidWZmZXJBZGRyZXNzLAorCWludCBTaXplVG9Xcml0ZSApCit7CisJaW50IGNtZHNpemU7CisJLyogVGVzdCBpZiB0aGUgYnVmZmVyIGNvbW1hbmQgaXMgbGVnYWwgKi8KKwlpZiAoKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMV9XUklURSkKKwkJJiYgKEJ1ZmZlckNvbW1hbmQgIT0gREJfQlVGMl9XUklURSkpCisJCXJldHVybiBEQVRBRkxBU0hfQkFEX0NPTU1BTkQ7CisKKwkvKiBidWZmZXIgYWRkcmVzcyBtdXN0IGJlIGxvd2VyIHRoYW4gcGFnZSBzaXplICovCisJaWYgKGJ1ZmZlckFkZHJlc3MgPiBwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplKQorCQlyZXR1cm4gREFUQUZMQVNIX0JBRF9BRERSRVNTOworCisJaWYgKCAocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnN0YXRlKSAgIT0gSURMRSkKKwkJcmV0dXJuIERBVEFGTEFTSF9CVVNZOworCisJLyogU2VuZCBmaXJzdCBXcml0ZSBDb21tYW5kICovCisJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMF0gPSBCdWZmZXJDb21tYW5kOworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzFdID0gMDsKKwlpZiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyID49IDE2Mzg0KSB7CisJICAgIAlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFsyXSA9IDA7CisJICAgIAlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZFszXSA9CisJCQkodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpKGJ1ZmZlckFkZHJlc3MgJgorCQkJCXBEYXRhRmxhc2gtPnBEZXZpY2UtPmJ5dGVfbWFzaykpID4+IDgpOworCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbNF0gPQorCQkJKHVuc2lnbmVkIGNoYXIpKCh1bnNpZ25lZCBpbnQpYnVmZmVyQWRkcmVzcyAgJiAweDAwRkYpOworCQljbWRzaXplID0gNTsKKwl9IGVsc2UgeworCSAgICAJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmRbMl0gPQorCQkJKHVuc2lnbmVkIGNoYXIpKCgodW5zaWduZWQgaW50KShidWZmZXJBZGRyZXNzICYKKwkJCQlwRGF0YUZsYXNoLT5wRGV2aWNlLT5ieXRlX21hc2spKSA+PiA4KTsKKwkgICAgCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzNdID0KKwkJCSh1bnNpZ25lZCBjaGFyKSgodW5zaWduZWQgaW50KWJ1ZmZlckFkZHJlc3MgICYgMHgwMEZGKTsKKwkgICAgCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5jb21tYW5kWzRdID0gMDsKKwkJY21kc2l6ZSA9IDQ7CisJfQorCisJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2NtZF9wdCAJID0KKwkJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPmNvbW1hbmQ7CisJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2NtZF9zaXplID0gY21kc2l6ZTsKKwlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+cnhfY21kX3B0IAkgPQorCQlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+Y29tbWFuZDsKKwlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+cnhfY21kX3NpemUgPSBjbWRzaXplOworCisJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnJ4X2RhdGFfcHQgCT0gZGF0YUJ1ZmZlcjsKKwlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfZGF0YV9wdCAJPSBkYXRhQnVmZmVyOworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT5yeF9kYXRhX3NpemUgCT0gU2l6ZVRvV3JpdGU7CisJcERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MtPnR4X2RhdGFfc2l6ZSAJPSBTaXplVG9Xcml0ZTsKKworCXJldHVybiBBVDkxRl9TcGlXcml0ZShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9QYWdlRXJhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9iamVjdCAgICAgICAgICAgICAgOiBFcmFzZSBhIHBhZ2UgCQkJCQkgICAgICovCisvKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogRGF0YUZsYXNoIFNlcnZpY2UJCQkJICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA6IFBhZ2UgY29uY2VybmVkCQkJCQkgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgIDogCQkJCQkJICAgICAqLworLyogUmV0dXJuIHZhbHVlCQk6IFN0YXRlIG9mIHRoZSBkYXRhZmxhc2gJCQkgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfUGFnZUVyYXNlKAorCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKKwl1bnNpZ25lZCBpbnQgcGFnZSkKK3sKKwlpbnQgY21kc2l6ZTsKKwkvKiBUZXN0IGlmIHRoZSBidWZmZXIgY29tbWFuZCBpcyBsZWdhbCAqLworCS8qIG5vIGRhdGEgdG8gdHJhbnNtaXQgb3IgcmVjZWl2ZSAqLworICAgIAlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfZGF0YV9zaXplID0gMDsKKworCWNtZHNpemUgPSA0OworCWlmIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIgPj0gMTYzODQpCisJCWNtZHNpemUgPSA1OworCXJldHVybihBVDkxRl9EYXRhRmxhc2hTZW5kQ29tbWFuZCAocERhdGFGbGFzaCwgREJfUEFHRV9FUkFTRSwgY21kc2l6ZSwKK3BhZ2UqcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9CbG9ja0VyYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9iamVjdCAgICAgICAgICAgICAgOiBFcmFzZSBhIEJsb2NrIAkJCQkJICAgICAqLworLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IERhdGFGbGFzaCBTZXJ2aWNlCQkJCSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgOiBQYWdlIGNvbmNlcm5lZAkJCQkJICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA6IAkJCQkJCSAgICAgKi8KKy8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX0Jsb2NrRXJhc2UoCisJQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAorCXVuc2lnbmVkIGludCBibG9jaykKK3sKKwlpbnQgY21kc2l6ZTsKKwkvKiBUZXN0IGlmIHRoZSBidWZmZXIgY29tbWFuZCBpcyBsZWdhbCAqLworCS8qIG5vIGRhdGEgdG8gdHJhbnNtaXQgb3IgcmVjZWl2ZSAqLworICAgIAlwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYy0+dHhfZGF0YV9zaXplID0gMDsKKwljbWRzaXplID0gNDsKKwlpZiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyID49IDE2Mzg0KQorCQljbWRzaXplID0gNTsKKwlyZXR1cm4oQVQ5MUZfRGF0YUZsYXNoU2VuZENvbW1hbmQgKHBEYXRhRmxhc2gsIERCX0JMT0NLX0VSQVNFLGNtZHNpemUsCitibG9jayo4KnBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluCQkJICAgICAqLworLyogT2JqZWN0ICAgICAgICAgICAgICA6IFdyaXRlIGJ1ZmZlciB0byB0aGUgbWFpbiBtZW1vcnkJCSAgICAgKi8KKy8qIElucHV0IFBhcmFtZXRlcnMgICAgOiBEYXRhRmxhc2ggU2VydmljZQkJCQkgICAgICovCisvKgkJOiA8QnVmZmVyQ29tbWFuZD4gPSBjb21tYW5kIHRvIHNlbmQgdG8gYnVmZmVyMSBvciBidWZmZXIyICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgIDogPGRlc3Q+ID0gbWFpbiBtZW1vcnkgYWRkcmVzcwkJCSAgICAgKi8KKy8qIFJldHVybiB2YWx1ZQkJOiBTdGF0ZSBvZiB0aGUgZGF0YWZsYXNoCQkJICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluICgKKwlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCisJdW5zaWduZWQgY2hhciBCdWZmZXJDb21tYW5kLAorCXVuc2lnbmVkIGludCBkZXN0ICkKK3sKKwlpbnQgY21kc2l6ZTsKKwkvKiBUZXN0IGlmIHRoZSBidWZmZXIgY29tbWFuZCBpcyBjb3JyZWN0ICovCisJaWYgKChCdWZmZXJDb21tYW5kICE9IERCX0JVRjFfUEFHRV9QR00pICYmCisJICAgIChCdWZmZXJDb21tYW5kICE9IERCX0JVRjFfUEFHRV9FUkFTRV9QR00pICYmCisJICAgIChCdWZmZXJDb21tYW5kICE9IERCX0JVRjJfUEFHRV9QR00pICYmCisJICAgIChCdWZmZXJDb21tYW5kICE9IERCX0JVRjJfUEFHRV9FUkFTRV9QR00pICkKKwkJcmV0dXJuIERBVEFGTEFTSF9CQURfQ09NTUFORDsKKworCS8qIG5vIGRhdGEgdG8gdHJhbnNtaXQgb3IgcmVjZWl2ZSAqLworCXBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLT50eF9kYXRhX3NpemUgPSAwOworCisJY21kc2l6ZSA9IDQ7CisJaWYgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlciA+PSAxNjM4NCkKKwkJY21kc2l6ZSA9IDU7CisJLyogU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgZGF0YWZsYXNoICovCisJcmV0dXJuKEFUOTFGX0RhdGFGbGFzaFNlbmRDb21tYW5kIChwRGF0YUZsYXNoLCBCdWZmZXJDb21tYW5kLCBjbWRzaXplLAorCQkJCQkJZGVzdCkpOyB9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX1BhcnRpYWxQYWdlV3JpdGUJCQkJICAgICAqLworLyogT2JqZWN0ICAgICAgICAgICAgICA6IEVyYXNlIHBhcnRpZWxseSBhIHBhZ2UJCQkJICAgICAqLworLyogSW5wdXQgUGFyYW1ldGVycyAgICA6IDxwYWdlPiA9IHBhZ2UgbnVtYmVyCQkJCSAgICAgKi8KKy8qCQkJOiA8QWRySW5wYWdlPiA9IGFkciB0byBiZWdpbiB0aGUgZmFkaW5nCQkgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgIDogPGxlbmd0aD4gPSBOdW1iZXIgb2YgYnl0ZXMgdG8gZXJhc2UJCSAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9QYXJ0aWFsUGFnZVdyaXRlICgKKwlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCisJdW5zaWduZWQgY2hhciAqc3JjLAorCXVuc2lnbmVkIGludCBkZXN0LAorCXVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCBwYWdlOworCXVuc2lnbmVkIGludCBBZHJJblBhZ2U7CisKKwlwYWdlID0gZGVzdCAvIChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplKTsKKwlBZHJJblBhZ2UgPSBkZXN0ICUgKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpOworCisJLyogUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHBhZ2UgaW4gdGhlIFNyYW0gQnVmZmVyICovCisJQVQ5MUZfTWFpbk1lbW9yeVRvQnVmZmVyVHJhbnNmZXJ0KHBEYXRhRmxhc2gsCisJCQkJCQlEQl9QQUdFXzJfQlVGMV9UUkYsIHBhZ2UpOworCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywKKwkJCQkJCUFUOTFDX1RJTUVPVVRfV1JEWSk7CisJLypVcGRhdGUgdGhlIFNSQU0gYnVmZmVyICovCisJQVQ5MUZfRGF0YUZsYXNoV3JpdGVCdWZmZXIocERhdGFGbGFzaCwgREJfQlVGMV9XUklURSwgc3JjLAorCQkJCQlBZHJJblBhZ2UsIHNpemUpOworCisJQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLAorCQkJCQlBVDkxQ19USU1FT1VUX1dSRFkpOworCisJLyogRXJhc2UgcGFnZSBpZiBhIDEyOCBNYml0cyBkZXZpY2UgKi8KKwlpZiAocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyID49IDE2Mzg0KSB7CisJCUFUOTFGX1BhZ2VFcmFzZShwRGF0YUZsYXNoLCBwYWdlKTsKKwkJLyogUmV3cml0ZSB0aGUgbW9kaWZpZWQgU3JhbSBCdWZmZXIgaW4gdGhlIG1haW4gbWVtb3J5ICovCisJCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywKKwkJCQkJCUFUOTFDX1RJTUVPVVRfV1JEWSk7CisJfQorCisJLyogUmV3cml0ZSB0aGUgbW9kaWZpZWQgU3JhbSBCdWZmZXIgaW4gdGhlIG1haW4gbWVtb3J5ICovCisJcmV0dXJuKEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluKHBEYXRhRmxhc2gsIERCX0JVRjFfUEFHRV9FUkFTRV9QR00sCisJCQkJKHBhZ2UqcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFGbGFzaFdyaXRlCQkJCSAgICAgKi8KKy8qIE9iamVjdCAgICAgICAgICAgICAgOgkJCQkJCSAgICAgKi8KKy8qIElucHV0IFBhcmFtZXRlcnMgICAgOiA8KnNyYz4gPSBTb3VyY2UgYnVmZmVyCQkJCSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgOiA8ZGVzdD4gPSBkYXRhZmxhc2ggYWRyZXNzCQkJICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA6IDxzaXplPiA9IGRhdGEgYnVmZmVyIHNpemUJCQkgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoV3JpdGUoCisJQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAorCXVuc2lnbmVkIGNoYXIgKnNyYywKKwlpbnQgZGVzdCwKKwlpbnQgc2l6ZSApCit7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgcGFnZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJQVQ5MUZfU3BpRW5hYmxlKHBEYXRhRmxhc2gtPnBEZXZpY2UtPmNzKTsKKworCWlmICggKGRlc3QgKyBzaXplKSA+IChwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplICoKKwkJCQkJKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlcikpKQorCQlyZXR1cm4gREFUQUZMQVNIX01FTU9SWV9PVkVSRkxPVzsKKworCS8qIElmIGRlc3RpbmF0aW9uIGRvZXMgbm90IGZpdCBhIHBhZ2Ugc3RhcnQgYWRkcmVzcyAqLworCWlmICgoZGVzdCAlICgodW5zaWduZWQgaW50KShwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplKSkpICAhPSAwICkKKwl7CisJCWxlbmd0aCA9IHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUgLQorCQkJCShkZXN0ICUKKwkJCQkoKHVuc2lnbmVkIGludCkKKwkJCQkocERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSkpKTsKKworCQlpZiAoc2l6ZSA8IGxlbmd0aCkKKwkJCWxlbmd0aCA9IHNpemU7CisKKwkJaWYoIUFUOTFGX1BhcnRpYWxQYWdlV3JpdGUocERhdGFGbGFzaCxzcmMsIGRlc3QsIGxlbmd0aCkpCisJCQlyZXR1cm4gREFUQUZMQVNIX0VSUk9SOworCisJCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywKKwkJCUFUOTFDX1RJTUVPVVRfV1JEWSk7CisKKwkJLyogVXBkYXRlIHNpemUsIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KKwkJc2l6ZSAtPSBsZW5ndGg7CisJCWRlc3QgKz0gbGVuZ3RoOworCQlzcmMgKz0gbGVuZ3RoOworCX0KKworCXdoaWxlICgoIHNpemUgLSBwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplICkgPj0gMCApIHsKKwkJLyogcHJvZ3JhbSBkYXRhZmxhc2ggcGFnZSAqLworCQlwYWdlID0gKHVuc2lnbmVkIGludClkZXN0IC8gKHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpOworCisJCXN0YXR1cyA9IEFUOTFGX0RhdGFGbGFzaFdyaXRlQnVmZmVyKHBEYXRhRmxhc2gsCisJCQkJREJfQlVGMV9XUklURSwgc3JjLCAwLAorCQkJCXBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUpOworCQlBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsCisJCQkJCQlBVDkxQ19USU1FT1VUX1dSRFkpOworCisJCXN0YXR1cyA9IEFUOTFGX1BhZ2VFcmFzZShwRGF0YUZsYXNoLCBwYWdlKTsKKwkJQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLAorCQkJCQkJQVQ5MUNfVElNRU9VVF9XUkRZKTsKKwkJaWYgKCFzdGF0dXMpCisJCQlyZXR1cm4gREFUQUZMQVNIX0VSUk9SOworCisJCXN0YXR1cyA9IEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluIChwRGF0YUZsYXNoLAorCQkJCQkJREJfQlVGMV9QQUdFX1BHTSwgZGVzdCk7CisJCWlmKCFzdGF0dXMpCisJCQlyZXR1cm4gREFUQUZMQVNIX0VSUk9SOworCisJCUFUOTFGX0RhdGFGbGFzaFdhaXRSZWFkeShwRGF0YUZsYXNoLT5wRGF0YUZsYXNoRGVzYywKKwkJCQkJCUFUOTFDX1RJTUVPVVRfV1JEWSk7CisKKwkJLyogVXBkYXRlIHNpemUsIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KKwkJc2l6ZSAtPSBwRGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19zaXplOworCQlkZXN0ICs9IHBEYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemU7CisJCXNyYyAgKz0gcERhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZTsKKwl9CisKKwkvKiBJZiBzdGlsbCBzb21lIGJ5dGVzIHRvIHJlYWQgKi8KKwlpZiAoIHNpemUgPiAwICkgeworCQkvKiBwcm9ncmFtIGRhdGFmbGFzaCBwYWdlICovCisJCWlmKCFBVDkxRl9QYXJ0aWFsUGFnZVdyaXRlKHBEYXRhRmxhc2gsIHNyYywgZGVzdCwgc2l6ZSkgKQorCQkJcmV0dXJuIERBVEFGTEFTSF9FUlJPUjsKKworCQlBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsCisJCQkJCQlBVDkxQ19USU1FT1VUX1dSRFkpOworCX0KKwlyZXR1cm4gREFUQUZMQVNIX09LOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBBVDkxRl9EYXRhRmxhc2hSZWFkIAkJCQkgICAgICovCisvKiBPYmplY3QgICAgICAgICAgICAgIDogUmVhZCBhIGJsb2NrIGluIGRhdGFmbGFzaAkJCSAgICAgKi8KKy8qIElucHV0IFBhcmFtZXRlcnMgICAgOiAJCQkJCQkgICAgICovCisvKiBSZXR1cm4gdmFsdWUJCTogCQkJCQkJICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IEFUOTFGX0RhdGFGbGFzaFJlYWQoCisJQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAorCXVuc2lnbmVkIGxvbmcgYWRkciwKKwl1bnNpZ25lZCBsb25nIHNpemUsCisJY2hhciAqYnVmZmVyKQoreworCXVuc2lnbmVkIGxvbmcgU2l6ZVRvUmVhZDsKKworCUFUOTFGX1NwaUVuYWJsZShwRGF0YUZsYXNoLT5wRGV2aWNlLT5jcyk7CisKKwlpZihBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkocERhdGFGbGFzaC0+cERhdGFGbGFzaERlc2MsCisJCQkJCUFUOTFDX1RJTUVPVVRfV1JEWSkgIT0gREFUQUZMQVNIX09LKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlTaXplVG9SZWFkID0gKHNpemUgPCAweDgwMDApPyBzaXplOjB4ODAwMDsKKworCQlpZiAoQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5KHBEYXRhRmxhc2gtPnBEYXRhRmxhc2hEZXNjLAorCQkJCQlBVDkxQ19USU1FT1VUX1dSRFkpICE9IERBVEFGTEFTSF9PSykKKwkJCXJldHVybiAtMTsKKworCQlpZiAoQVQ5MUZfRGF0YUZsYXNoQ29udGludW91c1JlYWQgKHBEYXRhRmxhc2gsIGFkZHIsCisJCQkJKHVjaGFyICopIGJ1ZmZlciwgU2l6ZVRvUmVhZCkgIT0gREFUQUZMQVNIX09LKQorCQkJcmV0dXJuIC0xOworCisJCXNpemUgLT0gU2l6ZVRvUmVhZDsKKwkJYWRkciArPSBTaXplVG9SZWFkOworCQlidWZmZXIgKz0gU2l6ZVRvUmVhZDsKKwl9CisKKwlyZXR1cm4gREFUQUZMQVNIX09LOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGdW5jdGlvbiBOYW1lICAgICAgIDogQVQ5MUZfRGF0YWZsYXNoUHJvYmUgCQkJCSAgICAgKi8KKy8qIE9iamVjdCAgICAgICAgICAgICAgOiAJCQkJCQkgICAgICovCisvKiBJbnB1dCBQYXJhbWV0ZXJzICAgIDogCQkJCQkJICAgICAqLworLyogUmV0dXJuIHZhbHVlCSAgICAgICA6IERhdGFmbGFzaCBzdGF0dXMgcmVnaXN0ZXIJCQkgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgQVQ5MUZfRGF0YWZsYXNoUHJvYmUoaW50IGNzLCBBVDkxUFNfRGF0YWZsYXNoRGVzYyBwRGVzYykgeworCUFUOTFGX1NwaUVuYWJsZShjcyk7CisJQVQ5MUZfRGF0YUZsYXNoR2V0U3RhdHVzKHBEZXNjKTsKKwlyZXR1cm4oKHBEZXNjLT5jb21tYW5kWzFdID09IDB4RkYpPyAwOiBwRGVzYy0+Y29tbWFuZFsxXSAmIDB4M0MpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0aV9pZHMuaCBiL2RyaXZlcnMvYXRpX2lkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNzJhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0aV9pZHMuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIEFUSSBQQ0kgSURzIGZyb20gWEZyZWU4Niwga2VwdCBoZXJlIHRvIG1ha2Ugc3luYydpbmcgd2l0aAorICogWEZyZWUgbXVjaCBzaW1wbGVyLiBDdXJyZW50bHksIHRoaXMgbGlzdCBpcyBvbmx5IHVzZWQgYnkKKyAqIHJhZGVvbmZiCisgKi8KKworI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zMTUwICAgICAgICAgICAgIDB4MzE1MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zMTUxICAgICAgICAgICAgIDB4MzE1MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zMTUyICAgICAgICAgICAgIDB4MzE1MgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zMTUzICAgICAgICAgICAgIDB4MzE1MworI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zMTU0ICAgICAgICAgICAgIDB4MzE1NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zMTU2ICAgICAgICAgICAgIDB4MzE1NgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zRTUwICAgICAgICAgICAgIDB4M0U1MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zRTUxICAgICAgICAgICAgIDB4M0U1MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zRTUyICAgICAgICAgICAgIDB4M0U1MgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zRTUzICAgICAgICAgICAgIDB4M0U1MworI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zRTU0ICAgICAgICAgICAgIDB4M0U1NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF8zRTU2ICAgICAgICAgICAgIDB4M0U1NgorI2RlZmluZSBQQ0lfQ0hJUF9SUzEwMF80MTM2CQkweDQxMzYKKyNkZWZpbmUgUENJX0NISVBfUlMyMDBfNDEzNwkJMHg0MTM3CisjZGVmaW5lIFBDSV9DSElQX1IzMDBfQUQJCTB4NDE0NAorI2RlZmluZSBQQ0lfQ0hJUF9SMzAwX0FFCQkweDQxNDUKKyNkZWZpbmUgUENJX0NISVBfUjMwMF9BRgkJMHg0MTQ2CisjZGVmaW5lIFBDSV9DSElQX1IzMDBfQUcJCTB4NDE0NworI2RlZmluZSBQQ0lfQ0hJUF9SMzUwX0FIICAgICAgICAgICAgICAgIDB4NDE0OAorI2RlZmluZSBQQ0lfQ0hJUF9SMzUwX0FJICAgICAgICAgICAgICAgIDB4NDE0OQorI2RlZmluZSBQQ0lfQ0hJUF9SMzUwX0FKICAgICAgICAgICAgICAgIDB4NDE0QQorI2RlZmluZSBQQ0lfQ0hJUF9SMzUwX0FLICAgICAgICAgICAgICAgIDB4NDE0QgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9BUCAgICAgICAgICAgICAgIDB4NDE1MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9BUSAgICAgICAgICAgICAgIDB4NDE1MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM2MF9BUiAgICAgICAgICAgICAgIDB4NDE1MgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9BUyAgICAgICAgICAgICAgIDB4NDE1MworI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9BVCAgICAgICAgICAgICAgIDB4NDE1NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9BViAgICAgICAgICAgICAgIDB4NDE1NgorI2RlZmluZSBQQ0lfQ0hJUF9NQUNIMzIJCTB4NDE1OAorI2RlZmluZSBQQ0lfQ0hJUF9SUzI1MF80MjM3CQkweDQyMzcKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9CQgkJMHg0MjQyCisjZGVmaW5lIFBDSV9DSElQX1IyMDBfQkMJCTB4NDI0MworI2RlZmluZSBQQ0lfQ0hJUF9SUzEwMF80MzM2CQkweDQzMzYKKyNkZWZpbmUgUENJX0NISVBfUlMyMDBfNDMzNwkJMHg0MzM3CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NENUCQkweDQzNTQKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0Q1gJCTB4NDM1OAorI2RlZmluZSBQQ0lfQ0hJUF9SUzI1MF80NDM3CQkweDQ0MzcKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0RVQJCTB4NDU1NAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHQgkJMHg0NzQyCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdECQkweDQ3NDQKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R0kJCTB4NDc0OQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHTAkJMHg0NzRDCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdNCQkweDQ3NEQKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R04JCTB4NDc0RQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHTwkJMHg0NzRGCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdQCQkweDQ3NTAKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1EJCTB4NDc1MQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHUgkJMHg0NzUyCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdTCQkweDQ3NTMKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1QJCTB4NDc1NAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHVQkJMHg0NzU1CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdWCQkweDQ3NTYKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1cJCTB4NDc1NworI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHWAkJMHg0NzU4CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdZCQkweDQ3NTkKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1oJCTB4NDc1QQorI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9JZAkJMHg0OTY0CisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0llCQkweDQ5NjUKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfSWYJCTB4NDk2NgorI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9JZwkJMHg0OTY3CisjZGVmaW5lIFBDSV9DSElQX1I0MjBfSkggICAgICAgICAgICAgICAgMHg0QTQ4CisjZGVmaW5lIFBDSV9DSElQX1I0MjBfSkkgICAgICAgICAgICAgICAgMHg0QTQ5CisjZGVmaW5lIFBDSV9DSElQX1I0MjBfSkogICAgICAgICAgICAgICAgMHg0QTRBCisjZGVmaW5lIFBDSV9DSElQX1I0MjBfSksgICAgICAgICAgICAgICAgMHg0QTRCCisjZGVmaW5lIFBDSV9DSElQX1I0MjBfSkwgICAgICAgICAgICAgICAgMHg0QTRDCisjZGVmaW5lIFBDSV9DSElQX1I0MjBfSk0gICAgICAgICAgICAgICAgMHg0QTRECisjZGVmaW5lIFBDSV9DSElQX1I0MjBfSk4gICAgICAgICAgICAgICAgMHg0QTRFCisjZGVmaW5lIFBDSV9DSElQX1I0MjBfSlAgICAgICAgICAgICAgICAgMHg0QTUwCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExCCQkweDRDNDIKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TEQJCTB4NEM0NAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4TEUJCTB4NEM0NQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4TEYJCTB4NEM0NgorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMRwkJMHg0QzQ3CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExJCQkweDRDNDkKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TE0JCTB4NEM0RAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMTgkJMHg0QzRFCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExQCQkweDRDNTAKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TFEJCTB4NEM1MQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMUgkJMHg0QzUyCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExTCQkweDRDNTMKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TFQJCTB4NEM1NAorI2RlZmluZSBQQ0lfQ0hJUF9SQURFT05fTFcJCTB4NEM1NworI2RlZmluZSBQQ0lfQ0hJUF9SQURFT05fTFgJCTB4NEM1OAorI2RlZmluZSBQQ0lfQ0hJUF9SQURFT05fTFkJCTB4NEM1OQorI2RlZmluZSBQQ0lfQ0hJUF9SQURFT05fTFoJCTB4NEM1QQorI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9MZAkJMHg0QzY0CisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0xlCQkweDRDNjUKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfTGYJCTB4NEM2NgorI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9MZwkJMHg0QzY3CisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0xuCQkweDRDNkUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOE1GCQkweDRENDYKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOE1MCQkweDRENEMKKyNkZWZpbmUgUENJX0NISVBfUjMwMF9ORAkJMHg0RTQ0CisjZGVmaW5lIFBDSV9DSElQX1IzMDBfTkUJCTB4NEU0NQorI2RlZmluZSBQQ0lfQ0hJUF9SMzAwX05GCQkweDRFNDYKKyNkZWZpbmUgUENJX0NISVBfUjMwMF9ORwkJMHg0RTQ3CisjZGVmaW5lIFBDSV9DSElQX1IzNTBfTkggICAgICAgICAgICAgICAgMHg0RTQ4CisjZGVmaW5lIFBDSV9DSElQX1IzNTBfTkkgICAgICAgICAgICAgICAgMHg0RTQ5CisjZGVmaW5lIFBDSV9DSElQX1IzNjBfTkogICAgICAgICAgICAgICAgMHg0RTRBCisjZGVmaW5lIFBDSV9DSElQX1IzNTBfTksgICAgICAgICAgICAgICAgMHg0RTRCCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX05QICAgICAgICAgICAgICAgMHg0RTUwCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX05RICAgICAgICAgICAgICAgMHg0RTUxCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX05SICAgICAgICAgICAgICAgMHg0RTUyCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX05TICAgICAgICAgICAgICAgMHg0RTUzCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX05UICAgICAgICAgICAgICAgMHg0RTU0CisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX05WICAgICAgICAgICAgICAgMHg0RTU2CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQQQkJMHg1MDQxCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQQgkJMHg1MDQyCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQQwkJMHg1MDQzCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQRAkJMHg1MDQ0CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQRQkJMHg1MDQ1CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQRgkJMHg1MDQ2CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQRwkJMHg1MDQ3CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQSAkJMHg1MDQ4CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQSQkJMHg1MDQ5CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQSgkJMHg1MDRBCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQSwkJMHg1MDRCCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQTAkJMHg1MDRDCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQTQkJMHg1MDRECisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQTgkJMHg1MDRFCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQTwkJMHg1MDRGCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQUAkJMHg1MDUwCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQUQkJMHg1MDUxCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQUgkJMHg1MDUyCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQUwkJMHg1MDUzCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQVAkJMHg1MDU0CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQVQkJMHg1MDU1CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQVgkJMHg1MDU2CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQVwkJMHg1MDU3CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhQWAkJMHg1MDU4CisjZGVmaW5lIFBDSV9DSElQX1JBREVPTl9RRAkJMHg1MTQ0CisjZGVmaW5lIFBDSV9DSElQX1JBREVPTl9RRQkJMHg1MTQ1CisjZGVmaW5lIFBDSV9DSElQX1JBREVPTl9RRgkJMHg1MTQ2CisjZGVmaW5lIFBDSV9DSElQX1JBREVPTl9RRwkJMHg1MTQ3CisjZGVmaW5lIFBDSV9DSElQX1IyMDBfUUgJCTB4NTE0OAorI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX1FJCQkweDUxNDkKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9RSgkJMHg1MTRBCisjZGVmaW5lIFBDSV9DSElQX1IyMDBfUUsJCTB4NTE0QgorI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX1FMCQkweDUxNEMKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9RTQkJMHg1MTRECisjZGVmaW5lIFBDSV9DSElQX1IyMDBfUU4JCTB4NTE0RQorI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX1FPCQkweDUxNEYKKyNkZWZpbmUgUENJX0NISVBfUlYyMDBfUVcJCTB4NTE1NworI2RlZmluZSBQQ0lfQ0hJUF9SVjIwMF9RWAkJMHg1MTU4CisjZGVmaW5lIFBDSV9DSElQX1JWMTAwX1FZCQkweDUxNTkKKyNkZWZpbmUgUENJX0NISVBfUlYxMDBfUVoJCTB4NTE1QQorI2RlZmluZSBQQ0lfQ0hJUF9STjUwCQkJMHg1MTVFCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhSRQkJMHg1MjQ1CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhSRgkJMHg1MjQ2CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhSRwkJMHg1MjQ3CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhSSwkJMHg1MjRCCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhSTAkJMHg1MjRDCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhTRQkJMHg1MzQ1CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhTRgkJMHg1MzQ2CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhTRwkJMHg1MzQ3CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhTSAkJMHg1MzQ4CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhTSwkJMHg1MzRCCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhTTAkJMHg1MzRDCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhTTQkJMHg1MzRECisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhTTgkJMHg1MzRFCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhURgkJMHg1NDQ2CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhUTAkJMHg1NDRDCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhUUgkJMHg1NDUyCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhUUwkJMHg1NDUzCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhUVAkJMHg1NDU0CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhUVQkJMHg1NDU1CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzU0NjAgICAgICAgICAgICAgMHg1NDYwCisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzU0NjEgICAgICAgICAgICAgMHg1NDYxCisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzU0NjIgICAgICAgICAgICAgMHg1NDYyCisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzU0NjMgICAgICAgICAgICAgMHg1NDYzCisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzU0NjQgICAgICAgICAgICAgMHg1NDY0CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzU0NjUgICAgICAgICAgICAgMHg1NDY1CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzU0NjYgICAgICAgICAgICAgMHg1NDY2CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzU0NjcgICAgICAgICAgICAgMHg1NDY3CisjZGVmaW5lIFBDSV9DSElQX1I0MjNfVUggICAgICAgICAgICAgICAgMHg1NTQ4CisjZGVmaW5lIFBDSV9DSElQX1I0MjNfVUkgICAgICAgICAgICAgICAgMHg1NTQ5CisjZGVmaW5lIFBDSV9DSElQX1I0MjNfVUogICAgICAgICAgICAgICAgMHg1NTRBCisjZGVmaW5lIFBDSV9DSElQX1I0MjNfVUsgICAgICAgICAgICAgICAgMHg1NTRCCisjZGVmaW5lIFBDSV9DSElQX1I0MjNfVVEgICAgICAgICAgICAgICAgMHg1NTUxCisjZGVmaW5lIFBDSV9DSElQX1I0MjNfVVIgICAgICAgICAgICAgICAgMHg1NTUyCisjZGVmaW5lIFBDSV9DSElQX1I0MjNfVVQgICAgICAgICAgICAgICAgMHg1NTU0CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NFZUCQkweDU2NTQKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0VlUJCTB4NTY1NQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRWVgkJMHg1NjU2CisjZGVmaW5lIFBDSV9DSElQX1JTMzAwXzU4MzQJCTB4NTgzNAorI2RlZmluZSBQQ0lfQ0hJUF9SUzMwMF81ODM1CQkweDU4MzUKKyNkZWZpbmUgUENJX0NISVBfUlMzMDBfNTgzNgkJMHg1ODM2CisjZGVmaW5lIFBDSV9DSElQX1JTMzAwXzU4MzcJCTB4NTgzNworI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjYwICAgICAgICAgICAgIDB4NUI2MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjYxICAgICAgICAgICAgIDB4NUI2MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjYyICAgICAgICAgICAgIDB4NUI2MgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjYzICAgICAgICAgICAgIDB4NUI2MworI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjY0ICAgICAgICAgICAgIDB4NUI2NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjY1ICAgICAgICAgICAgIDB4NUI2NQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjY2ICAgICAgICAgICAgIDB4NUI2NgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjY3ICAgICAgICAgICAgIDB4NUI2NworI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYwCQkweDU5NjAKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MQkJMHg1OTYxCisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjIJCTB4NTk2MgorI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTY0CQkweDU5NjQKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNUM2MQkJMHg1QzYxCisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzVDNjMJCTB4NUM2MworI2RlZmluZSBQQ0lfQ0hJUF9SNDIzXzVENTcgICAgICAgICAgICAgIDB4NUQ1NworI2RlZmluZSBQQ0lfQ0hJUF9SUzM1MF83ODM0ICAgICAgICAgICAgIDB4NzgzNAorI2RlZmluZSBQQ0lfQ0hJUF9SUzM1MF83ODM1ICAgICAgICAgICAgIDB4NzgzNQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGlfcmFkZW9uX2ZiLmMgYi9kcml2ZXJzL2F0aV9yYWRlb25fZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTc0ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdGlfcmFkZW9uX2ZiLmMKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBBVEkgUmFkZW9uIFZpZGVvIGNhcmQgRnJhbWVidWZmZXIgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBaaGFuZyBXZWkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorICogSmFzb24gSmluIDxqYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBTb21lIGNvZGVzIG9mIHRoaXMgZmlsZSBpcyBwYXJ0bHkgcG9ydGVkIGZyb20gTGludXgga2VybmVsCisgKiBBVEkgdmlkZW8gZnJhbWVidWZmZXIgZHJpdmVyLgorICoKKyAqIE5vdyB0aGUgZHJpdmVyIGlzIHRlc3RlZCBvbiBiZWxvdyBBVEkgY2hpcHM6CisgKiAgIDkyMDAKKyAqICAgWDMwMAorICogICBYNzAwCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19BVElfUkFERU9OX0ZCCisKKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHZpZGVvX2ZiLmg+CisKKyNpbmNsdWRlIDxyYWRlb24uaD4KKyNpbmNsdWRlICJhdGlfaWRzLmgiCisjaW5jbHVkZSAiYXRpX3JhZGVvbl9mYi5oIgorCisjdW5kZWYgREVCVUcKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQUklOVCh4Li4uKSBwcmludGYoeCkKKyNlbHNlCisjZGVmaW5lIERQUklOVCh4Li4uKSBkb3t9d2hpbGUoMCkKKyNlbmRpZgorCisjaWZuZGVmIG1pbl90CisjZGVmaW5lIG1pbl90KHR5cGUseCx5KSBcCisJKHsgdHlwZSBfX3ggPSAoeCk7IHR5cGUgX195ID0gKHkpOyBfX3ggPCBfX3kgPyBfX3g6IF9feTsgfSkKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9NQVBQRURfVlJBTQkoMjA0OCoyMDQ4KjQpCisjZGVmaW5lIE1JTl9NQVBQRURfVlJBTQkoMTAyNCo3NjgqMSkKKworLyojZGVmaW5lIFBDSV9WRU5ET1JfSURfQVRJKi8KKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MAkJMHg1OTYwCisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjEJCTB4NTk2MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYyCQkweDU5NjIKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2NAkJMHg1OTY0CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjAJCTB4NUI2MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM4MF81NjU3CQkweDU2NTcKKyNkZWZpbmUgUENJX0NISVBfUjQyMF81NTRkCQkweDU1NGQKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGF0aV9yYWRlb25fcGNpX2lkc1tdID0geworCXtQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0NISVBfUlYyODBfNTk2MH0sCisJe1BDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQ0hJUF9SVjI4MF81OTYxfSwKKwl7UENJX1ZFTkRPUl9JRF9BVEksIFBDSV9DSElQX1JWMjgwXzU5NjJ9LAorCXtQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0NISVBfUlYyODBfNTk2NH0sCisJe1BDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQ0hJUF9SVjM3MF81QjYwfSwKKwl7UENJX1ZFTkRPUl9JRF9BVEksIFBDSV9DSElQX1JWMzgwXzU2NTd9LAorCXtQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0NISVBfUjQyMF81NTRkfSwKKwl7MCwgMH0KK307CisKK3N0YXRpYyB1MTYgYXRpX3JhZGVvbl9pZF9mYW1pbHlfdGFibGVbXVsyXSA9IHsKKwl7UENJX0NISVBfUlYyODBfNTk2MCwgQ0hJUF9GQU1JTFlfUlYyODB9LAorCXtQQ0lfQ0hJUF9SVjI4MF81OTYxLCBDSElQX0ZBTUlMWV9SVjI4MH0sCisJe1BDSV9DSElQX1JWMjgwXzU5NjIsIENISVBfRkFNSUxZX1JWMjgwfSwKKwl7UENJX0NISVBfUlYyODBfNTk2NCwgQ0hJUF9GQU1JTFlfUlYyODB9LAorCXtQQ0lfQ0hJUF9SVjM3MF81QjYwLCBDSElQX0ZBTUlMWV9SVjM4MH0sCisJe1BDSV9DSElQX1JWMzgwXzU2NTcsIENISVBfRkFNSUxZX1JWMzgwfSwKKwl7UENJX0NISVBfUjQyMF81NTRkLCAgQ0hJUF9GQU1JTFlfUjQyMH0sCisJezAsIDB9Cit9OworCit1MTYgZ2V0X3JhZGVvbl9pZF9mYW1pbHkodTE2IGRldmljZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgYXRpX3JhZGVvbl9pZF9mYW1pbHlfdGFibGVbMF1baV07IGkrPTIpCisJCWlmIChhdGlfcmFkZW9uX2lkX2ZhbWlseV90YWJsZVswXVtpXSA9PSBkZXZpY2UpCisJCQlyZXR1cm4gYXRpX3JhZGVvbl9pZF9mYW1pbHlfdGFibGVbMF1baSArIDFdOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm87CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9pZGVudGlmeV92cmFtKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykKK3sKKwl1MzIgdG1wOworCisJLyogZnJhbWVidWZmZXIgc2l6ZSAqLworCWlmICgocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzEwMCkgfHwKKwkJKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMyMDApIHx8CisJCShyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMzAwKSkgeworCQl1MzIgdG9tID0gSU5SRUcoTkJfVE9NKTsKKwkJdG1wID0gKCgoKHRvbSA+PiAxNikgLSAodG9tICYgMHhmZmZmKSArIDEpIDw8IDYpICogMTAyNCk7CisKKwkJcmFkZW9uX2ZpZm9fd2FpdCg2KTsKKwkJT1VUUkVHKE1DX0ZCX0xPQ0FUSU9OLCB0b20pOworCQlPVVRSRUcoRElTUExBWV9CQVNFX0FERFIsICh0b20gJiAweGZmZmYpIDw8IDE2KTsKKwkJT1VUUkVHKENSVEMyX0RJU1BMQVlfQkFTRV9BRERSLCAodG9tICYgMHhmZmZmKSA8PCAxNik7CisJCU9VVFJFRyhPVjBfQkFTRV9BRERSLCAodG9tICYgMHhmZmZmKSA8PCAxNik7CisKKwkJLyogVGhpcyBpcyBzdXBwb3NlZCB0byBmaXggdGhlIGNydGMyIG5vaXNlIHByb2JsZW0uICovCisJCU9VVFJFRyhHUlBIMl9CVUZGRVJfQ05UTCwgSU5SRUcoR1JQSDJfQlVGRkVSX0NOVEwpICYgfjB4N2YwMDAwKTsKKworCQlpZiAoKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMxMDApIHx8CisJCQkocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzIwMCkpIHsKKwkJLyogVGhpcyBpcyB0byB3b3JrYXJvdW5kIHRoZSBhc2ljIGJ1ZyBmb3IgUk1YLCBzb21lIHZlcnNpb25zCisJCSAgIG9mIEJJT1MgZG9zZW4ndCBoYXZlIHRoaXMgcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LgorCQkqLworCQkJT1VUUkVHUChDUlRDX01PUkVfQ05UTCwgQ1JUQ19IX0NVVE9GRl9BQ1RJVkVfRU4sCisJCQkJfkNSVENfSF9DVVRPRkZfQUNUSVZFX0VOKTsKKwkJfQorCX0gZWxzZSB7CisJCXRtcCA9IElOUkVHKENPTkZJR19NRU1TSVpFKTsKKwl9CisKKwkvKiBtZW0gc2l6ZSBpcyBiaXRzIFsyODowXSwgbWFzayBvZmYgdGhlIHJlc3QgKi8KKwlyaW5mby0+dmlkZW9fcmFtID0gdG1wICYgQ09ORklHX01FTVNJWkVfTUFTSzsKKworCS8qCisJICogSGFjayB0byBnZXQgYXJvdW5kIHNvbWUgYnVzdGVkIHByb2R1Y3Rpb24gTTYncworCSAqIHJlcG9ydGluZyBubyByYW0KKwkgKi8KKwlpZiAocmluZm8tPnZpZGVvX3JhbSA9PSAwKSB7CisJCXN3aXRjaCAocmluZm8tPnBkZXYuZGV2aWNlKSB7CisJCWNhc2UgUENJX0NISVBfUkFERU9OX0xZOgorCQljYXNlIFBDSV9DSElQX1JBREVPTl9MWjoKKwkJCXJpbmZvLT52aWRlb19yYW0gPSA4MTkyICogMTAyNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyB0cnkgdG8gaWRlbnRpZnkgVlJBTSB0eXBlCisJICovCisJaWYgKChyaW5mby0+ZmFtaWx5ID49IENISVBfRkFNSUxZX1IzMDApIHx8CisJICAgIChJTlJFRyhNRU1fU0RSQU1fTU9ERV9SRUcpICYgKDE8PDMwKSkpCisJCXJpbmZvLT52cmFtX2RkciA9IDE7CisJZWxzZQorCQlyaW5mby0+dnJhbV9kZHIgPSAwOworCisJdG1wID0gSU5SRUcoTUVNX0NOVEwpOworCWlmIChJU19SMzAwX1ZBUklBTlQocmluZm8pKSB7CisJCXRtcCAmPSAgUjMwMF9NRU1fTlVNX0NIQU5ORUxTX01BU0s7CisJCXN3aXRjaCAodG1wKSB7CisJCWNhc2UgMDogIHJpbmZvLT52cmFtX3dpZHRoID0gNjQ7IGJyZWFrOworCQljYXNlIDE6ICByaW5mby0+dnJhbV93aWR0aCA9IDEyODsgYnJlYWs7CisJCWNhc2UgMjogIHJpbmZvLT52cmFtX3dpZHRoID0gMjU2OyBicmVhazsKKwkJZGVmYXVsdDogcmluZm8tPnZyYW1fd2lkdGggPSAxMjg7IGJyZWFrOworCQl9CisJfSBlbHNlIGlmICgocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjEwMCkgfHwKKwkJICAgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMxMDApIHx8CisJCSAgIChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMjAwKSl7CisJCWlmICh0bXAgJiBSVjEwMF9NRU1fSEFMRl9NT0RFKQorCQkJcmluZm8tPnZyYW1fd2lkdGggPSAzMjsKKwkJZWxzZQorCQkJcmluZm8tPnZyYW1fd2lkdGggPSA2NDsKKwl9IGVsc2UgeworCQlpZiAodG1wICYgTUVNX05VTV9DSEFOTkVMU19NQVNLKQorCQkJcmluZm8tPnZyYW1fd2lkdGggPSAxMjg7CisJCWVsc2UKKwkJCXJpbmZvLT52cmFtX3dpZHRoID0gNjQ7CisJfQorCisJLyogVGhpcyBtYXkgbm90IGJlIGNvcnJlY3QsIGFzIHNvbWUgY2FyZHMgY2FuIGhhdmUgaGFsZiBvZiBjaGFubmVsIGRpc2FibGVkCisJICogVG9EbzogaWRlbnRpZnkgdGhlc2UgY2FzZXMKKwkgKi8KKworCURQUklOVCgicmFkZW9uZmI6IEZvdW5kICVsZGsgb2YgJXMgJWQgYml0cyB3aWRlIHZpZGVvcmFtXG4iLAorCSAgICAgICByaW5mby0+dmlkZW9fcmFtIC8gMTAyNCwKKwkgICAgICAgcmluZm8tPnZyYW1fZGRyID8gIkREUiIgOiAiU0RSQU0iLAorCSAgICAgICByaW5mby0+dnJhbV93aWR0aCk7CisKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX3dyaXRlX3BsbF9yZWdzKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgc3RydWN0IHJhZGVvbl9yZWdzICptb2RlKQoreworCWludCBpOworCisJcmFkZW9uX2ZpZm9fd2FpdCgyMCk7CisKKyNpZiAwCisJLyogV29ya2Fyb3VuZCBmcm9tIFhGcmVlICovCisJaWYgKHJpbmZvLT5pc19tb2JpbGl0eSkgeworCQkvKiBBIHRlbXBvcmFsIHdvcmthcm91bmQgZm9yIHRoZSBvY2NhdGlvbmFsIGJsYW5raW5nIG9uIGNlcnRhaW4gbGFwdG9wCisJCSAqIHBhbmVscy4gVGhpcyBhcHBlYXJzIHRvIHJlbGF0ZWQgdG8gdGhlIFBMTCBkaXZpZGVyIHJlZ2lzdGVycworCQkgKiAoZmFpbCB0byBsb2NrPykuIEl0IG9jY3VycyBldmVuIHdoZW4gYWxsIGRpdmlkZXJzIGFyZSB0aGUgc2FtZQorCQkgKiB3aXRoIHRoZWlyIG9sZCBzZXR0aW5ncy4gSW4gdGhpcyBjYXNlIHdlIHJlYWxseSBkb24ndCBuZWVkIHRvCisJCSAqIGZpZGRsZSB3aXRoIFBMTCByZWdpc3RlcnMuIEJ5IGRvaW5nIHRoaXMgd2UgY2FuIGF2b2lkIHRoZSBibGFua2luZworCQkgKiBwcm9ibGVtIHdpdGggc29tZSBwYW5lbHMuCisJCSAqLworCQlpZiAoKG1vZGUtPnBwbGxfcmVmX2RpdiA9PSAoSU5QTEwoUFBMTF9SRUZfRElWKSAmIFBQTExfUkVGX0RJVl9NQVNLKSkgJiYKKwkJICAgIChtb2RlLT5wcGxsX2Rpdl8zID09IChJTlBMTChQUExMX0RJVl8zKSAmCisJCQkJCSAgKFBQTExfUE9TVDNfRElWX01BU0sgfCBQUExMX0ZCM19ESVZfTUFTSykpKSkgeworCQkJLyogV2Ugc3RpbGwgaGF2ZSB0byBmb3JjZSBhIHN3aXRjaCB0byBzZWxlY3RlZCBQUExMIGRpdiB0aGFua3MgdG8KKwkJCSAqIGFuIFhGcmVlODYgZHJpdmVyIGJ1ZyB3aGljaCB3aWxsIHN3aXRjaCBpdCBhd2F5IGluIHNvbWUgY2FzZXMKKwkJCSAqIGV2ZW4gd2hlbiB1c2luZyBVc2VGRGV2ICovCisJCQlPVVRSRUdQKENMT0NLX0NOVExfSU5ERVgsCisJCQkJbW9kZS0+Y2xrX2NudGxfaW5kZXggJiBQUExMX0RJVl9TRUxfTUFTSywKKwkJCQl+UFBMTF9ESVZfU0VMX01BU0spOworCQkJcmFkZW9uX3BsbF9lcnJhdGFfYWZ0ZXJfaW5kZXgocmluZm8pOworCQkJcmFkZW9uX3BsbF9lcnJhdGFfYWZ0ZXJfZGF0YShyaW5mbyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYKKwlpZihyaW5mby0+cGRldi5kZXZpY2UgPT0gUENJX0NISVBfUlYzNzBfNUI2MCkgcmV0dXJuOworCisJLyogU3dpY2ggVkNLTCBjbG9jayBpbnB1dCB0byBDUFVDTEsgc28gaXQgc3RheXMgZmVkIHdoaWxlIFBQTEwgdXBkYXRlcyovCisJT1VUUExMUChWQ0xLX0VDUF9DTlRMLCBWQ0xLX1NSQ19TRUxfQ1BVQ0xLLCB+VkNMS19TUkNfU0VMX01BU0spOworCisJLyogUmVzZXQgUFBMTCAmIGVuYWJsZSBhdG9taWMgdXBkYXRlICovCisJT1VUUExMUChQUExMX0NOVEwsCisJCVBQTExfUkVTRVQgfCBQUExMX0FUT01JQ19VUERBVEVfRU4gfCBQUExMX1ZHQV9BVE9NSUNfVVBEQVRFX0VOLAorCQl+KFBQTExfUkVTRVQgfCBQUExMX0FUT01JQ19VUERBVEVfRU4gfCBQUExMX1ZHQV9BVE9NSUNfVVBEQVRFX0VOKSk7CisKKwkvKiBTd2l0Y2ggdG8gc2VsZWN0ZWQgUFBMTCBkaXZpZGVyICovCisJT1VUUkVHUChDTE9DS19DTlRMX0lOREVYLAorCQltb2RlLT5jbGtfY250bF9pbmRleCAmIFBQTExfRElWX1NFTF9NQVNLLAorCQl+UFBMTF9ESVZfU0VMX01BU0spOworCisJLyogU2V0IFBQTEwgcmVmLiBkaXYgKi8KKwlpZiAocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SMzAwIHx8CisJICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMzMDAgfHwKKwkgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SMzUwIHx8CisJICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYzNTApIHsKKwkJaWYgKG1vZGUtPnBwbGxfcmVmX2RpdiAmIFIzMDBfUFBMTF9SRUZfRElWX0FDQ19NQVNLKSB7CisJCQkvKiBXaGVuIHJlc3RvcmluZyBjb25zb2xlIG1vZGUsIHVzZSBzYXZlZCBQUExMX1JFRl9ESVYKKwkJCSAqIHNldHRpbmcuCisJCQkgKi8KKwkJCU9VVFBMTFAoUFBMTF9SRUZfRElWLCBtb2RlLT5wcGxsX3JlZl9kaXYsIDApOworCQl9IGVsc2UgeworCQkJLyogUjMwMCB1c2VzIHJlZl9kaXZfYWNjIGZpZWxkIGFzIHJlYWwgcmVmIGRpdmlkZXIgKi8KKwkJCU9VVFBMTFAoUFBMTF9SRUZfRElWLAorCQkJCShtb2RlLT5wcGxsX3JlZl9kaXYgPDwgUjMwMF9QUExMX1JFRl9ESVZfQUNDX1NISUZUKSwKKwkJCQl+UjMwMF9QUExMX1JFRl9ESVZfQUNDX01BU0spOworCQl9CisJfSBlbHNlCisJCU9VVFBMTFAoUFBMTF9SRUZfRElWLCBtb2RlLT5wcGxsX3JlZl9kaXYsIH5QUExMX1JFRl9ESVZfTUFTSyk7CisKKwkvKiBTZXQgUFBMTCBkaXZpZGVyIDMgJiBwb3N0IGRpdmlkZXIqLworCU9VVFBMTFAoUFBMTF9ESVZfMywgbW9kZS0+cHBsbF9kaXZfMywgflBQTExfRkIzX0RJVl9NQVNLKTsKKwlPVVRQTExQKFBQTExfRElWXzMsIG1vZGUtPnBwbGxfZGl2XzMsIH5QUExMX1BPU1QzX0RJVl9NQVNLKTsKKworCS8qIFdyaXRlIHVwZGF0ZSAqLworCXdoaWxlIChJTlBMTChQUExMX1JFRl9ESVYpICYgUFBMTF9BVE9NSUNfVVBEQVRFX1IpCisJCTsKKwlPVVRQTExQKFBQTExfUkVGX0RJViwgUFBMTF9BVE9NSUNfVVBEQVRFX1csIH5QUExMX0FUT01JQ19VUERBVEVfVyk7CisKKwkvKiBXYWl0IHJlYWQgdXBkYXRlIGNvbXBsZXRlICovCisJLyogRklYTUU6IENlcnRhaW4gcmV2aXNpb25zIG9mIFIzMDAgY2FuJ3QgcmVjb3ZlciBoZXJlLiAgTm90IHN1cmUgb2YKKwkgICB0aGUgY2F1c2UgeWV0LCBidXQgdGhpcyB3b3JrYXJvdW5kIHdpbGwgbWFzayB0aGUgcHJvYmxlbSBmb3Igbm93LgorCSAgIE90aGVyIGNoaXBzIHVzdWFsbHkgd2lsbCBwYXNzIGF0IHRoZSB2ZXJ5IGZpcnN0IHRlc3QsIHNvIHRoZQorCSAgIHdvcmthcm91bmQgc2hvdWxkbid0IGhhdmUgYW55IGVmZmVjdCBvbiB0aGVtLiAqLworCWZvciAoaSA9IDA7IChpIDwgMTAwMDAgJiYgSU5QTEwoUFBMTF9SRUZfRElWKSAmIFBQTExfQVRPTUlDX1VQREFURV9SKTsgaSsrKQorCQk7CisKKwlPVVRQTEwoSFRPVEFMX0NOVEwsIDApOworCisJLyogQ2xlYXIgcmVzZXQgJiBhdG9taWMgdXBkYXRlICovCisJT1VUUExMUChQUExMX0NOVEwsIDAsCisJCX4oUFBMTF9SRVNFVCB8IFBQTExfU0xFRVAgfCBQUExMX0FUT01JQ19VUERBVEVfRU4gfCBQUExMX1ZHQV9BVE9NSUNfVVBEQVRFX0VOKSk7CisKKwkvKiBXZSBtYXkgd2FudCBzb21lIGxvY2tpbmcgLi4uIG9oIHdlbGwgKi8KKwl1ZGVsYXkoNTAwMCk7CisKKwkvKiBTd2l0Y2ggYmFjayBWQ0xLIHNvdXJjZSB0byBQUExMICovCisJT1VUUExMUChWQ0xLX0VDUF9DTlRMLCBWQ0xLX1NSQ19TRUxfUFBMTENMSywgflZDTEtfU1JDX1NFTF9NQVNLKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiByZWc7CisJdTMyIHZhbDsKK30gcmVnX3ZhbDsKKworCisvKiB0aGVzZSBjb21tb24gcmVncyBhcmUgY2xlYXJlZCBiZWZvcmUgbW9kZSBzZXR0aW5nIHNvIHRoZXkgZG8gbm90CisgKiBpbnRlcmZlcmUgd2l0aCBhbnl0aGluZworICovCitzdGF0aWMgcmVnX3ZhbCBjb21tb25fcmVnc1tdID0geworCXsgT1ZSX0NMUiwgMCB9LAorCXsgT1ZSX1dJRF9MRUZUX1JJR0hULCAwIH0sCisJeyBPVlJfV0lEX1RPUF9CT1RUT00sIDAgfSwKKwl7IE9WMF9TQ0FMRV9DTlRMLCAwIH0sCisJeyBTVUJQSUNfQ05UTCwgMCB9LAorCXsgVklQSF9DT05UUk9MLCAwIH0sCisJeyBJMkNfQ05UTF8xLCAwIH0sCisJeyBHRU5fSU5UX0NOVEwsIDAgfSwKKwl7IENBUDBfVFJJR19DTlRMLCAwIH0sCisJeyBDQVAxX1RSSUdfQ05UTCwgMCB9LAorfTsKKworCit2b2lkIHJhZGVvbl9zZXRtb2RlKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHJhZGVvbl9yZWdzICptb2RlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3JlZ3MpKTsKKworCW1vZGUtPmNydGNfZ2VuX2NudGwgPSAweDAzMDAwMjAwOworCW1vZGUtPmNydGNfZXh0X2NudGwgPSAweDAwMDA4MDQ4OworCW1vZGUtPmRhY19jbnRsID0gMHhmZjAwMjEwMDsKKwltb2RlLT5jcnRjX2hfdG90YWxfZGlzcCA9IDB4NGYwMDYzOworCW1vZGUtPmNydGNfaF9zeW5jX3N0cnRfd2lkID0gMHg4YzAyYTI7CisJbW9kZS0+Y3J0Y192X3RvdGFsX2Rpc3AgPSAweDAxZGYwMjBjOworCW1vZGUtPmNydGNfdl9zeW5jX3N0cnRfd2lkID0gMHg4MjAxZWE7CisJbW9kZS0+Y3J0Y19waXRjaCA9IDB4MDA1MDAwNTA7CisKKwlPVVRSRUcoQ1JUQ19HRU5fQ05UTCwgbW9kZS0+Y3J0Y19nZW5fY250bCk7CisJT1VUUkVHUChDUlRDX0VYVF9DTlRMLCBtb2RlLT5jcnRjX2V4dF9jbnRsLAorCQl+KENSVENfSFNZTkNfRElTIHwgQ1JUQ19WU1lOQ19ESVMgfCBDUlRDX0RJU1BMQVlfRElTKSk7CisJT1VUUkVHUChEQUNfQ05UTCwgbW9kZS0+ZGFjX2NudGwsIERBQ19SQU5HRV9DTlRMIHwgREFDX0JMQU5LSU5HKTsKKwlPVVRSRUcoQ1JUQ19IX1RPVEFMX0RJU1AsIG1vZGUtPmNydGNfaF90b3RhbF9kaXNwKTsKKwlPVVRSRUcoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIG1vZGUtPmNydGNfaF9zeW5jX3N0cnRfd2lkKTsKKwlPVVRSRUcoQ1JUQ19WX1RPVEFMX0RJU1AsIG1vZGUtPmNydGNfdl90b3RhbF9kaXNwKTsKKwlPVVRSRUcoQ1JUQ19WX1NZTkNfU1RSVF9XSUQsIG1vZGUtPmNydGNfdl9zeW5jX3N0cnRfd2lkKTsKKwlPVVRSRUcoQ1JUQ19PRkZTRVQsIDApOworCU9VVFJFRyhDUlRDX09GRlNFVF9DTlRMLCAwKTsKKwlPVVRSRUcoQ1JUQ19QSVRDSCwgbW9kZS0+Y3J0Y19waXRjaCk7CisKKwltb2RlLT5jbGtfY250bF9pbmRleCA9IDB4MzAwOworCW1vZGUtPnBwbGxfcmVmX2RpdiA9IDB4YzsKKwltb2RlLT5wcGxsX2Rpdl8zID0gMHgwMDAzMDA1OTsKKworCXJhZGVvbl93cml0ZV9wbGxfcmVncyhyaW5mbywgbW9kZSk7Cit9CisKK2ludCByYWRlb25fcHJvYmUoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKQoreworCXBjaV9kZXZfdCBwZGV2OworCXUxNiBkaWQ7CisKKwlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlcyhhdGlfcmFkZW9uX3BjaV9pZHMsIDApOworCisJaWYgKHBkZXYgIT0gLTEpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0RFVklDRV9JRCwgJmRpZCk7CisJCXByaW50ZigiQVRJIFJhZGVvbiB2aWRlbyBjYXJkICglMDR4LCAlMDR4KSBmb3VuZCBAKCVkOiVkOiVkKVxuIiwKKwkJCQlQQ0lfVkVORE9SX0lEX0FUSSwgZGlkLCAocGRldiA+PiAxNikgJiAweGZmLAorCQkJCShwZGV2ID4+IDExKSAmIDB4MWYsIChwZGV2ID4+IDgpICYgMHg3KTsKKworCQlzdHJjcHkocmluZm8tPm5hbWUsICJBVEkgUmFkZW9uIik7CisJCXJpbmZvLT5wZGV2LnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQVRJOworCQlyaW5mby0+cGRldi5kZXZpY2UgPSBkaWQ7CisJCXJpbmZvLT5mYW1pbHkgPSBnZXRfcmFkZW9uX2lkX2ZhbWlseShyaW5mby0+cGRldi5kZXZpY2UpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLAorCQkJCSZyaW5mby0+ZmJfYmFzZV9waHlzKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMiwKKwkJCQkmcmluZm8tPm1taW9fYmFzZV9waHlzKTsKKwkJcmluZm8tPmZiX2Jhc2VfcGh5cyAmPSAweGZmZmZmMDAwOworCQlyaW5mby0+bW1pb19iYXNlX3BoeXMgJj0gfjB4MDQ7CisKKwkJcmluZm8tPm1taW9fYmFzZSA9ICh2b2lkICopcmluZm8tPm1taW9fYmFzZV9waHlzOworCQlEUFJJTlQoInJpbmZvLT5tbWlvX2Jhc2UgPSAweCV4XG4iLHJpbmZvLT5tbWlvX2Jhc2UpOworCQlyaW5mby0+ZmJfbG9jYWxfYmFzZSA9IElOUkVHKE1DX0ZCX0xPQ0FUSU9OKSA8PCAxNjsKKwkJRFBSSU5UKCJyaW5mby0+ZmJfbG9jYWxfYmFzZSA9IDB4JXhcbiIscmluZm8tPmZiX2xvY2FsX2Jhc2UpOworCQkvKiBQb3N0QklPUyB3aXRoIHg4NiBlbXVsYXRlciAqLworCQlCb290VmlkZW9DYXJkQklPUyhwZGV2LCBOVUxMLCAwKTsKKworCQkvKgorCQkgKiBDaGVjayBmb3IgZXJyYXRhCisJCSAqIChUaGVzZSB3aWxsIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUgZm9yIHRoZSBjaGlwZmFtaWx5CisJCSAqIFIzMDAsIFJWMjAwLCBSUzIwMCwgUlYxMDAsIFJTMTAwLikKKwkJICovCisKKwkJLyogR2V0IFZSQU0gc2l6ZSBhbmQgdHlwZSAqLworCQlyYWRlb25faWRlbnRpZnlfdnJhbShyaW5mbyk7CisKKwkJcmluZm8tPm1hcHBlZF92cmFtID0gbWluX3QodW5zaWduZWQgbG9uZywgTUFYX01BUFBFRF9WUkFNLAorCQkJCXJpbmZvLT52aWRlb19yYW0pOworCQlyaW5mby0+ZmJfYmFzZSA9ICh2b2lkICopcmluZm8tPmZiX2Jhc2VfcGh5czsKKworCQlEUFJJTlQoIlJhZGVvbjogZnJhbWVidWZmZXIgYmFzZSBwaHkgYWRkcmVzcyAweCUwOHgsIiBcCisJCSAgICAgICJNTUlPIGJhc2UgcGh5IGFkZHJlc3MgMHglMDh4LCIgXAorCQkgICAgICAiZnJhbWVidWZmZXIgbG9jYWwgYmFzZSAweCUwOHguXG4gIiwKKwkJICAgICAgcmluZm8tPmZiX2Jhc2VfcGh5cywgcmluZm8tPm1taW9fYmFzZV9waHlzLAorCQkgICAgICByaW5mby0+ZmJfbG9jYWxfYmFzZSk7CisKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIFRoZSBHcmFwaGljIERldmljZQorICovCitHcmFwaGljRGV2aWNlIGN0ZmI7CisKKyNkZWZpbmUgQ1VSU09SX1NJWkUJMHgxMDAwCS8qIGluIEtCeXRlIGZvciBIVyBDdXJzb3IgKi8KKyNkZWZpbmUgUEFUVEVSTl9BRFIJKHBHRC0+ZHByQmFzZSArIENVUlNPUl9TSVpFKQkvKiBwYXR0ZXJuIE1lbW9yeSBhZnRlciBDdXJzb3IgTWVtb3J5ICovCisjZGVmaW5lIFBBVFRFUk5fU0laRQk4KjgqNAkvKiA0IEJ5dGVzIHBlciBQaXhlbCA4IHggOCBQaXhlbCAqLworI2RlZmluZSBBQ0NFTE1FTU9SWQkoQ1VSU09SX1NJWkUgKyBQQVRURVJOX1NJWkUpCS8qIHJlc2VydmVkIE1lbW9yeSBmb3IgQklUQmx0IGFuZCBodyBjdXJzb3IgKi8KKwordm9pZCAqdmlkZW9faHdfaW5pdCh2b2lkKQoreworCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKKwlpbnQgaTsKKwl1MzIgKnZtOworCisJcmluZm8gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25mYl9pbmZvKSk7CisKKwlpZihyYWRlb25fcHJvYmUocmluZm8pKSB7CisJCXByaW50ZigiTm8gcmFkZW9uIHZpZGVvIGNhcmQgZm91bmQhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmlsbCBpbiBHcmFwaGljIGRldmljZSBzdHJ1Y3QgKi8KKwlzcHJpbnRmIChwR0QtPm1vZGVJZGVudCwgIiVkeCVkeCVkICVsZGtIeiAlbGRIeiIsIDY0MCwKKwkJIDQ4MCwgMTYsICgxMDAwIC8gMTAwMCksCisJCSAoMjAwMCAvIDEwMDApKTsKKwlwcmludGYgKCIlc1xuIiwgcEdELT5tb2RlSWRlbnQpOworCisJcEdELT53aW5TaXplWCA9IDY0MDsKKwlwR0QtPndpblNpemVZID0gNDgwOworCXBHRC0+cGxuU2l6ZVggPSA2NDA7CisJcEdELT5wbG5TaXplWSA9IDQ4MDsKKworCXBHRC0+Z2RmQnl0ZXNQUCA9IDE7CisJcEdELT5nZGZJbmRleCA9IEdERl9fOEJJVF9JTkRFWDsKKworCXBHRC0+aXNhQmFzZSA9IENGR19JU0FfSU9fQkFTRV9BRERSRVNTOworCXBHRC0+cGNpQmFzZSA9IHJpbmZvLT5mYl9iYXNlX3BoeXM7CisJcEdELT5mcmFtZUFkcnMgPSByaW5mby0+ZmJfYmFzZV9waHlzOworCXBHRC0+bWVtU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CisKKwkvKiBDdXJzb3IgU3RhcnQgQWRkcmVzcyAqLworCXBHRC0+ZHByQmFzZSA9CisJICAgIChwR0QtPndpblNpemVYICogcEdELT53aW5TaXplWSAqIHBHRC0+Z2RmQnl0ZXNQUCkgKyByaW5mby0+ZmJfYmFzZV9waHlzOworCWlmICgocEdELT5kcHJCYXNlICYgMHgwZmZmKSAhPSAwKSB7CisJCS8qIGFsbGlnbiBpdCAqLworCQlwR0QtPmRwckJhc2UgJj0gMHhmZmZmZjAwMDsKKwkJcEdELT5kcHJCYXNlICs9IDB4MDAwMDEwMDA7CisJfQorCURQUklOVCAoIkN1cnNvciBTdGFydCAleCBQYXR0ZXJuIFN0YXJ0ICV4XG4iLCBwR0QtPmRwckJhc2UsCisJCVBBVFRFUk5fQURSKTsKKwlwR0QtPnZwckJhc2UgPSByaW5mby0+ZmJfYmFzZV9waHlzOwkvKiBEdW1teSAqLworCXBHRC0+Y3ByQmFzZSA9IHJpbmZvLT5mYl9iYXNlX3BoeXM7CS8qIER1bW15ICovCisJLyogc2V0IHVwIEhhcmR3YXJlICovCisKKwkvKiBDbGVhciB2aWRlbyBtZW1vcnkgKi8KKwlpID0gcEdELT5tZW1TaXplIC8gNDsKKwl2bSA9ICh1bnNpZ25lZCBpbnQgKikgcEdELT5wY2lCYXNlOworCXdoaWxlIChpLS0pCisJCSp2bSsrID0gMDsKKwkvKlNldERyYXdpbmdFbmdpbmUgKGJpdHNfcGVyX3BpeGVsKTsqLworCisJcmFkZW9uX3NldG1vZGUoKTsKKworCXJldHVybiAoKHZvaWQgKikgcEdEKTsKK30KKwordm9pZCB2aWRlb19zZXRfbHV0ICh1bnNpZ25lZCBpbnQgaW5kZXgsCS8qIGNvbG9yIG51bWJlciAqLworCSAgICAgICB1bnNpZ25lZCBjaGFyIHIsCS8qIHJlZCAqLworCSAgICAgICB1bnNpZ25lZCBjaGFyIGcsCS8qIGdyZWVuICovCisJICAgICAgIHVuc2lnbmVkIGNoYXIgYgkvKiBibHVlICovCisJICAgICAgICkKK3sKKwlPVVRSRUcoUEFMRVRURV9JTkRFWCwgaW5kZXgpOworCU9VVFJFRyhQQUxFVFRFX0RBVEEsIChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRpX3JhZGVvbl9mYi5oIGIvZHJpdmVycy9hdGlfcmFkZW9uX2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjNGI4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRpX3JhZGVvbl9mYi5oCkBAIC0wLDAgKzEsMjgyIEBACisjaWZuZGVmIF9fQVRJX1JBREVPTl9GQl9ICisjZGVmaW5lIF9fQVRJX1JBREVPTl9GQl9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vc3Qgb2YgdGhlIGRlZmluaXRpb25zIGhlcmUgYXJlIGFkYXB0ZWQgcmlnaHQgZnJvbSBYRnJlZTg2ICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDaGlwIGZhbWlsaWVzLiBNdXN0IGZpdCBpbiB0aGUgbG93IDE2IGJpdHMgb2YgYSBsb25nIHdvcmQKKyAqLworZW51bSByYWRlb25fZmFtaWx5IHsKKwlDSElQX0ZBTUlMWV9VTktOT1csCisJQ0hJUF9GQU1JTFlfTEVHQUNZLAorCUNISVBfRkFNSUxZX1JBREVPTiwKKwlDSElQX0ZBTUlMWV9SVjEwMCwKKwlDSElQX0ZBTUlMWV9SUzEwMCwgICAgLyogVTEgKElHUDMyME0pIG9yIEEzIChJR1AzMjApKi8KKwlDSElQX0ZBTUlMWV9SVjIwMCwKKwlDSElQX0ZBTUlMWV9SUzIwMCwgICAgLyogVTIgKElHUDMzME0vMzQwTS8zNTBNKSBvciBBNCAoSUdQMzMwLzM0MC8zNDUvMzUwKSwKKwkJCQkgUlMyNTAgKElHUCA3MDAwKSAqLworCUNISVBfRkFNSUxZX1IyMDAsCisJQ0hJUF9GQU1JTFlfUlYyNTAsCisJQ0hJUF9GQU1JTFlfUlMzMDAsICAgIC8qIFJhZGVvbiA5MDAwIElHUCAqLworCUNISVBfRkFNSUxZX1JWMjgwLAorCUNISVBfRkFNSUxZX1IzMDAsCisJQ0hJUF9GQU1JTFlfUjM1MCwKKwlDSElQX0ZBTUlMWV9SVjM1MCwKKwlDSElQX0ZBTUlMWV9SVjM4MCwgICAgLyogUlYzNzAvUlYzODAvTTIyL00yNCAqLworCUNISVBfRkFNSUxZX1I0MjAsICAgICAvKiBSNDIwL1I0MjMvTTE4ICovCisJQ0hJUF9GQU1JTFlfTEFTVCwKK307CisKKyNkZWZpbmUgSVNfUlYxMDBfVkFSSUFOVChyaW5mbykgKCgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYxMDApICB8fCBcCisJCQkJICgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYyMDApICB8fCBcCisJCQkJICgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMxMDApICB8fCBcCisJCQkJICgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMyMDApICB8fCBcCisJCQkJICgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYyNTApICB8fCBcCisJCQkJICgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYyODApICB8fCBcCisJCQkJICgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMzMDApKQorCisjZGVmaW5lIElTX1IzMDBfVkFSSUFOVChyaW5mbykgKCgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjMwMCkgIHx8IFwKKwkJCQkoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMzUwKSB8fCBcCisJCQkJKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SMzUwKSAgfHwgXAorCQkJCSgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYzODApIHx8IFwKKwkJCQkoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1I0MjApKQorCitzdHJ1Y3QgcmFkZW9uZmJfaW5mbyB7CisJY2hhciBuYW1lWzIwXTsKKworCXN0cnVjdCBwY2lfZGV2aWNlX2lkCXBkZXY7CisJdTE2IAkJCWZhbWlseTsKKworCXUzMiAJCQlmYl9iYXNlX3BoeXM7CisJdTMyIAkJCW1taW9fYmFzZV9waHlzOworCisJdm9pZCAJCQkqbW1pb19iYXNlOworCXZvaWQgCQkJKmZiX2Jhc2U7CisKKwl1MzIJCQl2aWRlb19yYW07CisJdTMyCQkJbWFwcGVkX3ZyYW07CisJaW50CQkJdnJhbV93aWR0aDsKKwlpbnQJCQl2cmFtX2RkcjsKKworCXUzMiAJCQlmYl9sb2NhbF9iYXNlOworfTsKKworI2RlZmluZSBJTlJFRzgoYWRkcikJCXJlYWRiKChyaW5mby0+bW1pb19iYXNlKSthZGRyKQorI2RlZmluZSBPVVRSRUc4KGFkZHIsdmFsKQl3cml0ZWIodmFsLCAocmluZm8tPm1taW9fYmFzZSkrYWRkcikKKyNkZWZpbmUgSU5SRUcxNihhZGRyKQkJcmVhZHcoKHJpbmZvLT5tbWlvX2Jhc2UpK2FkZHIpCisjZGVmaW5lIE9VVFJFRzE2KGFkZHIsdmFsKQl3cml0ZXcodmFsLCAocmluZm8tPm1taW9fYmFzZSkrYWRkcikKKyNkZWZpbmUgSU5SRUcoYWRkcikJCXJlYWRsKChyaW5mby0+bW1pb19iYXNlKSthZGRyKQorI2RlZmluZSBPVVRSRUcoYWRkcix2YWwpCXdyaXRlbCh2YWwsIChyaW5mby0+bW1pb19iYXNlKSthZGRyKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX09VVFJFR1Aoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCB1MzIgYWRkciwKKwkJICAgICAgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwl0bXAgPSBJTlJFRyhhZGRyKTsKKwl0bXAgJj0gKG1hc2spOworCXRtcCB8PSAodmFsKTsKKwlPVVRSRUcoYWRkciwgdG1wKTsKK30KKworI2RlZmluZSBPVVRSRUdQKGFkZHIsdmFsLG1hc2spCV9PVVRSRUdQKHJpbmZvLCBhZGRyLCB2YWwsbWFzaykKKworLyoKKyAqIDJEIEVuZ2luZSBoZWxwZXIgcm91dGluZXMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9lbmdpbmVfZmx1c2ggKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykKK3sKKwlpbnQgaTsKKworCS8qIGluaXRpYXRlIGZsdXNoICovCisJT1VUUkVHUChSQjJEX0RTVENBQ0hFX0NUTFNUQVQsIFJCMkRfRENfRkxVU0hfQUxMLAorCSAgICAgICAgflJCMkRfRENfRkxVU0hfQUxMKTsKKworCWZvciAoaT0wOyBpIDwgMjAwMDAwMDsgaSsrKSB7CisJCWlmICghKElOUkVHKFJCMkRfRFNUQ0FDSEVfQ1RMU1RBVCkgJiBSQjJEX0RDX0JVU1kpKQorCQkJcmV0dXJuOworCQl1ZGVsYXkoMSk7CisJfQorCXByaW50ZigicmFkZW9uZmI6IEZsdXNoIFRpbWVvdXQgIVxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfcmFkZW9uX2ZpZm9fd2FpdChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8sIGludCBlbnRyaWVzKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8MjAwMDAwMDsgaSsrKSB7CisJCWlmICgoSU5SRUcoUkJCTV9TVEFUVVMpICYgMHg3ZikgPj0gZW50cmllcykKKwkJCXJldHVybjsKKwkJdWRlbGF5KDEpOworCX0KKwlwcmludGYoInJhZGVvbmZiOiBGSUZPIFRpbWVvdXQgIVxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfcmFkZW9uX2VuZ2luZV9pZGxlKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykKK3sKKwlpbnQgaTsKKworCS8qIGVuc3VyZSBGSUZPIGlzIGVtcHR5IGJlZm9yZSB3YWl0aW5nIGZvciBpZGxlICovCisJX3JhZGVvbl9maWZvX3dhaXQgKHJpbmZvLCA2NCk7CisKKwlmb3IgKGk9MDsgaTwyMDAwMDAwOyBpKyspIHsKKwkJaWYgKCgoSU5SRUcoUkJCTV9TVEFUVVMpICYgR1VJX0FDVElWRSkpID09IDApIHsKKwkJCXJhZGVvbl9lbmdpbmVfZmx1c2ggKHJpbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCXByaW50ZigicmFkZW9uZmI6IElkbGUgVGltZW91dCAhXG4iKTsKK30KKworI2RlZmluZSByYWRlb25fZW5naW5lX2lkbGUoKQkJX3JhZGVvbl9lbmdpbmVfaWRsZShyaW5mbykKKyNkZWZpbmUgcmFkZW9uX2ZpZm9fd2FpdChlbnRyaWVzKQlfcmFkZW9uX2ZpZm9fd2FpdChyaW5mbyxlbnRyaWVzKQorI2RlZmluZSByYWRlb25fbXNsZWVwKG1zKQkJX3JhZGVvbl9tc2xlZXAocmluZm8sbXMpCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgdmFyaW91cyByZWdpc3RlcnMgbWFuaXB1bGF0ZWQgYnkgdGhpcworICogZHJpdmVyIGZvciBzZXR0aW5nIG9yIHJlc3RvcmluZyBhIG1vZGUuIEl0J3MgbW9zdGx5IGNvcGllZCBmcm9tCisgKiBYRnJlZSdzIFJBREVPTlNhdmVSZWMgc3RydWN0dXJlLiBBIGZldyBjaGlwIHNldHRpbmdzIG1pZ2h0IHN0aWxsIGJlCisgKiB0d2Vha2VkIHdpdGhvdXQgYmVlaW5nIHJlZmxlY3RlZCBvciBzYXZlZCBpbiB0aGVzZSByZWdpc3RlcnMgdGhvdWdoCisgKi8KK3N0cnVjdCByYWRlb25fcmVncyB7CisJLyogQ29tbW9uIHJlZ2lzdGVycyAqLworCXUzMgkJb3ZyX2NscjsKKwl1MzIJCW92cl93aWRfbGVmdF9yaWdodDsKKwl1MzIJCW92cl93aWRfdG9wX2JvdHRvbTsKKwl1MzIJCW92MF9zY2FsZV9jbnRsOworCXUzMgkJbXBwX3RiX2NvbmZpZzsKKwl1MzIJCW1wcF9ncF9jb25maWc7CisJdTMyCQlzdWJwaWNfY250bDsKKwl1MzIJCXZpcGhfY29udHJvbDsKKwl1MzIJCWkyY19jbnRsXzE7CisJdTMyCQlnZW5faW50X2NudGw7CisJdTMyCQljYXAwX3RyaWdfY250bDsKKwl1MzIJCWNhcDFfdHJpZ19jbnRsOworCXUzMgkJYnVzX2NudGw7CisJdTMyCQlzdXJmYWNlX2NudGw7CisJdTMyCQliaW9zXzVfc2NyYXRjaDsKKworCS8qIE90aGVyIHJlZ2lzdGVycyB0byBzYXZlIGZvciBWVCBzd2l0Y2hlcyBvciBkcml2ZXIgbG9hZC91bmxvYWQgKi8KKwl1MzIJCWRwX2RhdGF0eXBlOworCXUzMgkJcmJibV9zb2Z0X3Jlc2V0OworCXUzMgkJY2xvY2tfY250bF9pbmRleDsKKwl1MzIJCWFtY2dwaW9fZW5fcmVnOworCXUzMgkJYW1jZ3Bpb19tYXNrOworCisJLyogU3VyZmFjZS90aWxpbmcgcmVnaXN0ZXJzICovCisJdTMyCQlzdXJmX2xvd2VyX2JvdW5kWzhdOworCXUzMgkJc3VyZl91cHBlcl9ib3VuZFs4XTsKKwl1MzIJCXN1cmZfaW5mb1s4XTsKKworCS8qIENSVEMgcmVnaXN0ZXJzICovCisJdTMyCQljcnRjX2dlbl9jbnRsOworCXUzMgkJY3J0Y19leHRfY250bDsKKwl1MzIJCWRhY19jbnRsOworCXUzMgkJY3J0Y19oX3RvdGFsX2Rpc3A7CisJdTMyCQljcnRjX2hfc3luY19zdHJ0X3dpZDsKKwl1MzIJCWNydGNfdl90b3RhbF9kaXNwOworCXUzMgkJY3J0Y192X3N5bmNfc3RydF93aWQ7CisJdTMyCQljcnRjX29mZnNldDsKKwl1MzIJCWNydGNfb2Zmc2V0X2NudGw7CisJdTMyCQljcnRjX3BpdGNoOworCXUzMgkJZGlzcF9tZXJnZV9jbnRsOworCXUzMgkJZ3JwaF9idWZmZXJfY250bDsKKwl1MzIJCWNydGNfbW9yZV9jbnRsOworCisJLyogQ1JUQzIgcmVnaXN0ZXJzICovCisJdTMyCQljcnRjMl9nZW5fY250bDsKKwl1MzIJCWRhYzJfY250bDsKKwl1MzIJCWRpc3Bfb3V0cHV0X2NudGw7CisJdTMyCQlkaXNwX2h3X2RlYnVnOworCXUzMgkJZGlzcDJfbWVyZ2VfY250bDsKKwl1MzIJCWdycGgyX2J1ZmZlcl9jbnRsOworCXUzMgkJY3J0YzJfaF90b3RhbF9kaXNwOworCXUzMgkJY3J0YzJfaF9zeW5jX3N0cnRfd2lkOworCXUzMgkJY3J0YzJfdl90b3RhbF9kaXNwOworCXUzMgkJY3J0YzJfdl9zeW5jX3N0cnRfd2lkOworCXUzMgkJY3J0YzJfb2Zmc2V0OworCXUzMgkJY3J0YzJfb2Zmc2V0X2NudGw7CisJdTMyCQljcnRjMl9waXRjaDsKKworCS8qIEZsYXQgcGFuZWwgcmVncyAqLworCXUzMiAJCWZwX2NydGNfaF90b3RhbF9kaXNwOworCXUzMgkJZnBfY3J0Y192X3RvdGFsX2Rpc3A7CisJdTMyCQlmcF9nZW5fY250bDsKKwl1MzIJCWZwMl9nZW5fY250bDsKKwl1MzIJCWZwX2hfc3luY19zdHJ0X3dpZDsKKwl1MzIJCWZwMl9oX3N5bmNfc3RydF93aWQ7CisJdTMyCQlmcF9ob3J6X3N0cmV0Y2g7CisJdTMyCQlmcF9wYW5lbF9jbnRsOworCXUzMgkJZnBfdl9zeW5jX3N0cnRfd2lkOworCXUzMgkJZnAyX3Zfc3luY19zdHJ0X3dpZDsKKwl1MzIJCWZwX3ZlcnRfc3RyZXRjaDsKKwl1MzIJCWx2ZHNfZ2VuX2NudGw7CisJdTMyCQlsdmRzX3BsbF9jbnRsOworCXUzMgkJdG1kc19jcmM7CisJdTMyCQl0bWRzX3RyYW5zbWl0dGVyX2NudGw7CisKKwkvKiBDb21wdXRlZCB2YWx1ZXMgZm9yIFBMTCAqLworCXUzMgkJZG90X2Nsb2NrX2ZyZXE7CisJaW50CQlmZWVkYmFja19kaXY7CisJaW50CQlwb3N0X2RpdjsKKworCS8qIFBMTCByZWdpc3RlcnMgKi8KKwl1MzIJCXBwbGxfZGl2XzM7CisJdTMyCQlwcGxsX3JlZl9kaXY7CisJdTMyCQl2Y2xrX2VjcF9jbnRsOworCXUzMgkJY2xrX2NudGxfaW5kZXg7CisKKwkvKiBDb21wdXRlZCB2YWx1ZXMgZm9yIFBMTDIgKi8KKwl1MzIJCWRvdF9jbG9ja19mcmVxXzI7CisJaW50CQlmZWVkYmFja19kaXZfMjsKKwlpbnQJCXBvc3RfZGl2XzI7CisKKwkvKiBQTEwyIHJlZ2lzdGVycyAqLworCXUzMgkJcDJwbGxfcmVmX2RpdjsKKwl1MzIJCXAycGxsX2Rpdl8wOworCXUzMgkJaHRvdGFsX2NudGwyOworCisJLyogUGFsZXR0ZSAqLworCWludAkJcGFsZXR0ZV92YWxpZDsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIF9fSU5QTEwoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCB1MzIgYWRkcikKK3sKKwl1MzIgZGF0YTsKKworCU9VVFJFRzgoQ0xPQ0tfQ05UTF9JTkRFWCwgYWRkciAmIDB4MDAwMDAwM2YpOworCS8qIHJhZGVvbl9wbGxfZXJyYXRhX2FmdGVyX2luZGV4KHJpbmZvKTsgKi8KKwlkYXRhID0gSU5SRUcoQ0xPQ0tfQ05UTF9EQVRBKTsKKwkvKiByYWRlb25fcGxsX2VycmF0YV9hZnRlcl9kYXRhKHJpbmZvKTsgKi8KKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fT1VUUExMKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgdW5zaWduZWQgaW50IGluZGV4LAorCQkJICAgIHUzMiB2YWwpCit7CisKKwlPVVRSRUc4KENMT0NLX0NOVExfSU5ERVgsIChpbmRleCAmIDB4MDAwMDAwM2YpIHwgMHgwMDAwMDA4MCk7CisJLyogcmFkZW9uX3BsbF9lcnJhdGFfYWZ0ZXJfaW5kZXgocmluZm8pOyAqLworCU9VVFJFRyhDTE9DS19DTlRMX0RBVEEsIHZhbCk7CisJLyogcmFkZW9uX3BsbF9lcnJhdGFfYWZ0ZXJfZGF0YShyaW5mbyk7ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX09VVFBMTFAoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCQkgICAgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwl0bXAgID0gX19JTlBMTChyaW5mbywgaW5kZXgpOworCXRtcCAmPSAobWFzayk7CisJdG1wIHw9ICh2YWwpOworCV9fT1VUUExMKHJpbmZvLCBpbmRleCwgdG1wKTsKK30KKworI2RlZmluZSBJTlBMTChhZGRyKQkJCV9fSU5QTEwocmluZm8sIGFkZHIpCisjZGVmaW5lIE9VVFBMTChpbmRleCwgdmFsKQkJX19PVVRQTEwocmluZm8sIGluZGV4LCB2YWwpCisjZGVmaW5lIE9VVFBMTFAoaW5kZXgsIHZhbCwgbWFzaykJX19PVVRQTExQKHJpbmZvLCBpbmRleCwgdmFsLCBtYXNrKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtNTcweC5jIGIvZHJpdmVycy9iY201NzB4LmMKaW5kZXggNWY2MzJhNi4uYzhmNDA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY201NzB4LmMKKysrIGIvZHJpdmVycy9iY201NzB4LmMKQEAgLTYsOCArNiw4IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgKCFkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpKSAmJiBcCi0JZGVmaW5lZChDT05GSUdfQkNNNTcweCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgKCFkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpKSAmJiBkZWZpbmVkKENPTkZJR19CQ001NzB4KQogCiAjaWZkZWYgQ09ORklHX0JNVwogI2luY2x1ZGUgPG1wYzgyNHguaD4KQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxwY2kuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIAotCiAvKgogICogUENJIFJlZ2lzdGVycyBhbmQgZGVmaW5pdGlvbnMuCiAgKi8KQEAgLTMxLDcgKzMwLDYgQEAKICNkZWZpbmUgQkNNNTcwWF9NQkFSIAkweDgwMTAwMDAwCiAjZGVmaW5lIEJDTTU3MFhfSUxJTkUgICAxCiAKLQogI2RlZmluZSBTRUNPTkRfVVNFQwkxMDAwMDAwCiAjZGVmaW5lIE1BWF9QQUNLRVRfU0laRSAxNjAwCiAjZGVmaW5lIE1BWF9VTklUUyAgICAgICA0CkBAIC0zOSw2MiArMzcsNjEgQEAKIC8qIEdsb2JhbHMgdG8gdGhpcyBtb2R1bGUgKi8KIGludCBpbml0aWFsaXplZCA9IDA7CiB1bnNpZ25lZCBpbnQgaW9CYXNlID0gMDsKLXZvbGF0aWxlIFBMTV9ERVZJQ0VfQkxPQ0sgICAgcERldmljZSA9IE5VTEw7ICAgICAgICAvKiA1NzB4IHNvZnRjICovCi12b2xhdGlsZSBQVU1fREVWSUNFX0JMT0NLICAgIHBVbURldmljZSA9IE5VTEw7Cit2b2xhdGlsZSBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UgPSBOVUxMOwkvKiA1NzB4IHNvZnRjICovCit2b2xhdGlsZSBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IE5VTEw7CiAKIC8qIFVzZWQgdG8gcGFzcyB0aGUgZnVsbC1kdXBsZXggZmxhZywgZXRjLiAqLwotaW50IGxpbmVfc3BlZWRbTUFYX1VOSVRTXSA9IHswLDAsMCwwfTsKLXN0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHsxLDEsMSwxfTsKLXN0YXRpYyBpbnQgcnhfZmxvd19jb250cm9sW01BWF9VTklUU10gPSB7MCwwLDAsMH07Ci1zdGF0aWMgaW50IHR4X2Zsb3dfY29udHJvbFtNQVhfVU5JVFNdID0gezAsMCwwLDB9Owotc3RhdGljIGludCBhdXRvX2Zsb3dfY29udHJvbFtNQVhfVU5JVFNdID0gezAsMCwwLDB9Owotc3RhdGljIGludCB0eF9jaGVja3N1bVtNQVhfVU5JVFNdID0gezEsMSwxLDF9Owotc3RhdGljIGludCByeF9jaGVja3N1bVtNQVhfVU5JVFNdID0gezEsMSwxLDF9Owotc3RhdGljIGludCBhdXRvX3NwZWVkW01BWF9VTklUU10gPSB7MSwxLDEsMX07CitpbnQgbGluZV9zcGVlZFtNQVhfVU5JVFNdID0geyAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU10gPSB7IDEsIDEsIDEsIDEgfTsKK3N0YXRpYyBpbnQgcnhfZmxvd19jb250cm9sW01BWF9VTklUU10gPSB7IDAsIDAsIDAsIDAgfTsKK3N0YXRpYyBpbnQgdHhfZmxvd19jb250cm9sW01BWF9VTklUU10gPSB7IDAsIDAsIDAsIDAgfTsKK3N0YXRpYyBpbnQgYXV0b19mbG93X2NvbnRyb2xbTUFYX1VOSVRTXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGludCB0eF9jaGVja3N1bVtNQVhfVU5JVFNdID0geyAxLCAxLCAxLCAxIH07CitzdGF0aWMgaW50IHJ4X2NoZWNrc3VtW01BWF9VTklUU10gPSB7IDEsIDEsIDEsIDEgfTsKK3N0YXRpYyBpbnQgYXV0b19zcGVlZFtNQVhfVU5JVFNdID0geyAxLCAxLCAxLCAxIH07CiAKICNpZiBKVU1CT19GUkFNRVMKIC8qIEp1bWJvIE1UVSBmb3IgaW50ZXJmYWNlcy4gKi8KLXN0YXRpYyBpbnQgbXR1W01BWF9VTklUU10gPSB7MCwwLDAsMH07CitzdGF0aWMgaW50IG10dVtNQVhfVU5JVFNdID0geyAwLCAwLCAwLCAwIH07CiAjZW5kaWYKIAogLyogVHVybiBvbiBXYWtlLW9uIGxhbiBmb3IgYSBkZXZpY2UgdW5pdCAqLwotc3RhdGljIGludCBlbmFibGVfd29sW01BWF9VTklUU10gPSB7MCwwLDAsMH07CitzdGF0aWMgaW50IGVuYWJsZV93b2xbTUFYX1VOSVRTXSA9IHsgMCwgMCwgMCwgMCB9OwogCiAjZGVmaW5lIFRYX0RFU0NfQ05UIERFRkFVTFRfVFhfUEFDS0VUX0RFU0NfQ09VTlQKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdHhfcGt0X2Rlc2NfY250W01BWF9VTklUU10gPQotCXtUWF9ERVNDX0NOVCxUWF9ERVNDX0NOVCxUWF9ERVNDX0NOVCwgVFhfREVTQ19DTlR9OworICAgIHsgVFhfREVTQ19DTlQsIFRYX0RFU0NfQ05ULCBUWF9ERVNDX0NOVCwgVFhfREVTQ19DTlQgfTsKIAogI2RlZmluZSBSWF9ERVNDX0NOVCBERUZBVUxUX1NURF9SQ1ZfREVTQ19DT1VOVAogc3RhdGljIHVuc2lnbmVkIGludCByeF9zdGRfZGVzY19jbnRbTUFYX1VOSVRTXSA9Ci0Je1JYX0RFU0NfQ05ULFJYX0RFU0NfQ05ULFJYX0RFU0NfQ05ULFJYX0RFU0NfQ05UfTsKKyAgICB7IFJYX0RFU0NfQ05ULCBSWF9ERVNDX0NOVCwgUlhfREVTQ19DTlQsIFJYX0RFU0NfQ05UIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcnhfYWRhcHRpdmVfY29hbGVzY2VbTUFYX1VOSVRTXSA9IHsxLDEsMSwxfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhfYWRhcHRpdmVfY29hbGVzY2VbTUFYX1VOSVRTXSA9IHsgMSwgMSwgMSwgMSB9OwogCiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAogI2RlZmluZSBKQk9fREVTQ19DTlQgREVGQVVMVF9KVU1CT19SQ1ZfREVTQ19DT1VOVAogc3RhdGljIHVuc2lnbmVkIGludCByeF9qdW1ib19kZXNjX2NudFtNQVhfVU5JVFNdID0KLQl7SkJPX0RFU0NfQ05ULCBKQk9fREVTQ19DTlQsIEpCT19ERVNDX0NOVCwgSkJPX0RFU0NfQ05UfTsKKyAgICB7IEpCT19ERVNDX0NOVCwgSkJPX0RFU0NfQ05ULCBKQk9fREVTQ19DTlQsIEpCT19ERVNDX0NOVCB9OwogI2VuZGlmCiAjZGVmaW5lIFJYX0NPQUxfVEsgREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTCiBzdGF0aWMgdW5zaWduZWQgaW50IHJ4X2NvYWxlc2NlX3RpY2tzW01BWF9VTklUU10gPQotCXtSWF9DT0FMX1RLLCBSWF9DT0FMX1RLLCBSWF9DT0FMX1RLLCBSWF9DT0FMX1RLfTsKKyAgICB7IFJYX0NPQUxfVEssIFJYX0NPQUxfVEssIFJYX0NPQUxfVEssIFJYX0NPQUxfVEsgfTsKIAogI2RlZmluZSBSWF9DT0FMX0ZNIERFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVMKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcnhfbWF4X2NvYWxlc2NlX2ZyYW1lc1tNQVhfVU5JVFNdID0KLQl7UlhfQ09BTF9GTSwgUlhfQ09BTF9GTSwgUlhfQ09BTF9GTSwgUlhfQ09BTF9GTX07CisgICAgeyBSWF9DT0FMX0ZNLCBSWF9DT0FMX0ZNLCBSWF9DT0FMX0ZNLCBSWF9DT0FMX0ZNIH07CiAKICNkZWZpbmUgVFhfQ09BTF9USyBERUZBVUxUX1RYX0NPQUxFU0NJTkdfVElDS1MKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdHhfY29hbGVzY2VfdGlja3NbTUFYX1VOSVRTXSA9Ci0Je1RYX0NPQUxfVEssIFRYX0NPQUxfVEssIFRYX0NPQUxfVEssIFRYX0NPQUxfVEt9OworICAgIHsgVFhfQ09BTF9USywgVFhfQ09BTF9USywgVFhfQ09BTF9USywgVFhfQ09BTF9USyB9OwogCiAjZGVmaW5lIFRYX0NPQUxfRk0gREVGQVVMVF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUwogc3RhdGljIHVuc2lnbmVkIGludCB0eF9tYXhfY29hbGVzY2VfZnJhbWVzW01BWF9VTklUU10gPQotCXtUWF9DT0FMX0ZNLCBUWF9DT0FMX0ZNLCBUWF9DT0FMX0ZNLCBUWF9DT0FMX0ZNfTsKKyAgICB7IFRYX0NPQUxfRk0sIFRYX0NPQUxfRk0sIFRYX0NPQUxfRk0sIFRYX0NPQUxfRk0gfTsKIAogI2RlZmluZSBTVF9DT0FMX1RLIERFRkFVTFRfU1RBVFNfQ09BTEVTQ0lOR19USUNLUwogc3RhdGljIHVuc2lnbmVkIGludCBzdGF0c19jb2FsZXNjZV90aWNrc1tNQVhfVU5JVFNdID0KLQl7U1RfQ09BTF9USywgU1RfQ09BTF9USywgU1RfQ09BTF9USywgU1RfQ09BTF9US307Ci0KKyAgICB7IFNUX0NPQUxfVEssIFNUX0NPQUxfVEssIFNUX0NPQUxfVEssIFNUX0NPQUxfVEsgfTsKIAogLyoKICAqIExlZ2l0aW1hdGUgdmFsdWVzIGZvciBCQ001NzB4IGRldmljZSB0eXBlcwpAQCAtMTM0LDcwNyArMTMxLDcwMSBAQAogCiAvKiBDaGlwLVJldiBuYW1lcyBmb3IgZWFjaCBkZXZpY2UtdHlwZSAqLwogc3RhdGljIHN0cnVjdCB7Ci0gICAgY2hhciogbmFtZTsKKwljaGFyICpuYW1lOwogfSBjaGlwX3JldltdID0gewotICAgICAgIHsiQkNNNTcwMFZJR0lMIn0sCi0gICAgICAgeyJCQ001NzAwQTYifSwKLSAgICAgICB7IkJDTTU3MDBUNiJ9LAotICAgICAgIHsiQkNNNTcwMEE5In0sCi0gICAgICAgeyJCQ001NzAwVDkifSwKLSAgICAgICB7IkJDTTU3MDAifSwKLSAgICAgICB7IkJDTTU3MDFBNSJ9LAotICAgICAgIHsiQkNNNTcwMVQxIn0sCi0gICAgICAgeyJCQ001NzAxVDgifSwKLSAgICAgICB7IkJDTTU3MDFBNyJ9LAotICAgICAgIHsiQkNNNTcwMUExMCJ9LAotICAgICAgIHsiQkNNNTcwMUExMiJ9LAotICAgICAgIHsiQkNNNTcwMSJ9LAotICAgICAgIHsiQkNNNTcwMiJ9LAotICAgICAgIHsiQkNNNTcwMyJ9LAotICAgICAgIHsiQkNNNTcwM0EzMSJ9LAotICAgICAgIHsiVEM5OTZUIn0sCi0gICAgICAgeyJUQzk5NlNUIn0sCi0gICAgICAgeyJUQzk5NlNTWCJ9LAotICAgICAgIHsiVEM5OTZTWCJ9LAotICAgICAgIHsiVEM5OTZCVCJ9LAotICAgICAgIHsiVEM5OTdUIn0sCi0gICAgICAgeyJUQzk5N1NYIn0sCi0gICAgICAgeyJUQzEwMDBUIn0sCi0gICAgICAgeyJUQzk0MEJSMDEifSwKLSAgICAgICB7IlRDOTQyQlIwMSJ9LAotICAgICAgIHsiTkM2NzcwIn0sCi0gICAgICAgeyJOQzc3NjAifSwKLSAgICAgICB7Ik5DNzc3MCJ9LAotICAgICAgIHsiTkM3NzgwIn0sCi0gICAgICAgezB9CisJeworCSJCQ001NzAwVklHSUwifSwgeworCSJCQ001NzAwQTYifSwgeworCSJCQ001NzAwVDYifSwgeworCSJCQ001NzAwQTkifSwgeworCSJCQ001NzAwVDkifSwgeworCSJCQ001NzAwIn0sIHsKKwkiQkNNNTcwMUE1In0sIHsKKwkiQkNNNTcwMVQxIn0sIHsKKwkiQkNNNTcwMVQ4In0sIHsKKwkiQkNNNTcwMUE3In0sIHsKKwkiQkNNNTcwMUExMCJ9LCB7CisJIkJDTTU3MDFBMTIifSwgeworCSJCQ001NzAxIn0sIHsKKwkiQkNNNTcwMiJ9LCB7CisJIkJDTTU3MDMifSwgeworCSJCQ001NzAzQTMxIn0sIHsKKwkiVEM5OTZUIn0sIHsKKwkiVEM5OTZTVCJ9LCB7CisJIlRDOTk2U1NYIn0sIHsKKwkiVEM5OTZTWCJ9LCB7CisJIlRDOTk2QlQifSwgeworCSJUQzk5N1QifSwgeworCSJUQzk5N1NYIn0sIHsKKwkiVEMxMDAwVCJ9LCB7CisJIlRDOTQwQlIwMSJ9LCB7CisJIlRDOTQyQlIwMSJ9LCB7CisJIk5DNjc3MCJ9LCB7CisJIk5DNzc2MCJ9LCB7CisJIk5DNzc3MCJ9LCB7CisJIk5DNzc4MCJ9LCB7CisJMH0KIH07CiAKLQogLyogaW5kZXhlZCBieSBib2FyZF90LCBhYm92ZSAqLwogc3RhdGljIHN0cnVjdCB7Ci0gICAgY2hhciAqbmFtZTsKKwljaGFyICpuYW1lOwogfSBib2FyZF9pbmZvW10gPSB7Ci0JeyAiQnJvYWRjb20gVmlnaWwgQjU3MDAgMTAwMEJhc2UtVCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMCAxMDAwQmFzZS1TWCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVNYIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDAgMTAwMEJhc2UtVCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAwIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDEgMTAwMEJhc2UtVCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDEgMTAwMEJhc2UtU1giIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDEgMTAwMEJhc2UtVCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAxIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDIgMTAwMEJhc2UtVCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAzIDEwMDBCYXNlLVQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMyAxMDAwQmFzZS1TWCIgfSwKLQl7ICIzQ29tIDNDOTk2IDEwLzEwMC8xMDAwIFNlcnZlciBOSUMiIH0sCi0JeyAiM0NvbSAzQzk5NiAxMC8xMDAvMTAwMCBTZXJ2ZXIgTklDIiB9LAotCXsgIjNDb20gM0M5OTYgR2lnYWJpdCBGaWJlci1TWCBTZXJ2ZXIgTklDIiB9LAotCXsgIjNDb20gM0M5OTYgR2lnYWJpdCBGaWJlci1TWCBTZXJ2ZXIgTklDIiB9LAotCXsgIjNDb20gM0M5OTZCIEdpZ2FiaXQgU2VydmVyIE5JQyIgfSwKLQl7ICIzQ29tIDNDOTk3IEdpZ2FiaXQgU2VydmVyIE5JQyIgfSwKLQl7ICIzQ29tIDNDOTk3IEdpZ2FiaXQgRmliZXItU1ggU2VydmVyIE5JQyIgfSwKLQl7ICIzQ29tIDNDMTAwMCBHaWdhYml0IE5JQyIgfSwKLQl7ICIzQ29tIDNDOTQwIEdpZ2FiaXQgTE9NICgyMVgyMSkiIH0sCi0JeyAiM0NvbSAzQzk0MiBHaWdhYml0IExPTSAoMzFYMzEpIiB9LAotCXsgIkNvbXBhcSBOQzY3NzAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciIgfSwKLQl7ICJDb21wYXEgTkM3NzYwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIiIH0sCi0JeyAiQ29tcGFxIE5DNzc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIiB9LAotCXsgIkNvbXBhcSBOQzc3ODAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciIgfSwKLQl7IDAgfSwKLX07CisJeworCSJCcm9hZGNvbSBWaWdpbCBCNTcwMCAxMDAwQmFzZS1UIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMCAxMDAwQmFzZS1UIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMCAxMDAwQmFzZS1TWCJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDAgMTAwMEJhc2UtU1gifSwgeworCSJCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVQifSwgeworCSJCcm9hZGNvbSBCQ001NzAwIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1TWCJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDEgMTAwMEJhc2UtVCJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDEgMTAwMEJhc2UtVCJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDEifSwgeworCSJCcm9hZGNvbSBCQ001NzAyIDEwMDBCYXNlLVQifSwgeworCSJCcm9hZGNvbSBCQ001NzAzIDEwMDBCYXNlLVQifSwgeworCSJCcm9hZGNvbSBCQ001NzAzIDEwMDBCYXNlLVNYIn0sIHsKKwkiM0NvbSAzQzk5NiAxMC8xMDAvMTAwMCBTZXJ2ZXIgTklDIn0sIHsKKwkiM0NvbSAzQzk5NiAxMC8xMDAvMTAwMCBTZXJ2ZXIgTklDIn0sIHsKKwkiM0NvbSAzQzk5NiBHaWdhYml0IEZpYmVyLVNYIFNlcnZlciBOSUMifSwgeworCSIzQ29tIDNDOTk2IEdpZ2FiaXQgRmliZXItU1ggU2VydmVyIE5JQyJ9LCB7CisJIjNDb20gM0M5OTZCIEdpZ2FiaXQgU2VydmVyIE5JQyJ9LCB7CisJIjNDb20gM0M5OTcgR2lnYWJpdCBTZXJ2ZXIgTklDIn0sIHsKKwkiM0NvbSAzQzk5NyBHaWdhYml0IEZpYmVyLVNYIFNlcnZlciBOSUMifSwgeworCSIzQ29tIDNDMTAwMCBHaWdhYml0IE5JQyJ9LCB7CisJIjNDb20gM0M5NDAgR2lnYWJpdCBMT00gKDIxWDIxKSJ9LCB7CisJIjNDb20gM0M5NDIgR2lnYWJpdCBMT00gKDMxWDMxKSJ9LCB7CisJIkNvbXBhcSBOQzY3NzAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciJ9LCB7CisJIkNvbXBhcSBOQzc3NjAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciJ9LCB7CisJIkNvbXBhcSBOQzc3NzAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciJ9LCB7CisJIkNvbXBhcSBOQzc3ODAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciJ9LCB7CiswfSx9OwogCiAvKiBQQ0kgRGV2aWNlcyB3aGljaCB1c2UgdGhlIDU3MHggY2hpcHNldCAqLwogc3RydWN0IHBjaV9kZXZpY2VfdGFibGUgewotICAgIHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwgZGV2aWNlX2lkOyAvKiBWZW5kb3IvRGV2aWNlSUQgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCBzdWJ2ZW5kb3IsIHN1YmRldmljZTsgLyogU3Vic3lzdGVtIElEJ3Mgb3IgUENJX0FOWV9JRCAqLwotICAgIHVuc2lnbmVkIGludCBjbGFzcywgY2xhc3NfbWFzazsgLyogKGNsYXNzLHN1YmNsYXNzLHByb2ctaWYpIHRyaXBsZXQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGJvYXJkX2lkOwkgICAgLyogRGF0YSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgKi8KLSAgICBpbnQgaW9fc2l6ZSwgbWluX2xhdGVuY3k7CisJdW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLCBkZXZpY2VfaWQ7CS8qIFZlbmRvci9EZXZpY2VJRCAqLworCXVuc2lnbmVkIHNob3J0IHN1YnZlbmRvciwgc3ViZGV2aWNlOwkvKiBTdWJzeXN0ZW0gSUQncyBvciBQQ0lfQU5ZX0lEICovCisJdW5zaWduZWQgaW50IGNsYXNzLCBjbGFzc19tYXNrOwkvKiAoY2xhc3Msc3ViY2xhc3MscHJvZy1pZikgdHJpcGxldCAqLworCXVuc2lnbmVkIGxvbmcgYm9hcmRfaWQ7CS8qIERhdGEgcHJpdmF0ZSB0byB0aGUgZHJpdmVyICovCisJaW50IGlvX3NpemUsIG1pbl9sYXRlbmN5OwogfSBiY201NzB4RGV2aWNlc1tdID0gewotCXsweDE0ZTQsIDB4MTY0NCwgMHgxMDE0LCAweDAyNzcsIDAsIDAsIEJDTTU3MDBWSUdJTCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHgxNjQ0LCAwLCAwLCBCQ001NzAwQTYgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDE0ZTQsIDB4MiwgMCwgMCwgQkNNNTcwMFQ2ICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NCwgMHgxNGU0LCAweDMsIDAsIDAsIEJDTTU3MDBBOSAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHg0LCAwLCAwLCBCQ001NzAwVDkgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwMjgsIDB4ZDEsIDAsIDAsIEJDTTU3MDAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwMjgsIDB4MDEwNiwgMCwgMCwgQkNNNTcwMCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTAyOCwgMHgwMTA5LCAwLCAwLCBCQ001NzAwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NCwgMHgxMDI4LCAweDAxMGEsIDAsIDAsIEJDTTU3MDAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwMCwgMCwgMCwgVEM5OTZUICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NCwgMHgxMGI3LCAweDEwMDEsIDAsIDAsIFRDOTk2U1QgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwMiwgMCwgMCwgVEM5OTZTU1ggLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwMywgMCwgMCwgVEM5OTdUICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NCwgMHgxMGI3LCAweDEwMDUsIDAsIDAsIFRDOTk3U1ggLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwOCwgMCwgMCwgVEM5NDJCUjAxICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwMCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgMSwgMCwgMCwgQkNNNTcwMUE1ICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCA1LCAwLCAwLCBCQ001NzAxVDEgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDYsIDAsIDAsIEJDTTU3MDFUOCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgNywgMCwgMCwgQkNNNTcwMUE3ICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCA4LCAwLCAwLCBCQ001NzAxQTEwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCAweDgwMDgsIDAsIDAsIEJDTTU3MDFBMTIgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDBlMTEsIDB4YzEsIDAsIDAsIE5DNjc3MCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MGUxMSwgMHg3YywgMCwgMCwgTkM3NzcwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgwZTExLCAweDg1LCAwLCAwLCBOQzc3ODAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDEwMjgsIDB4MDEyMSwgMCwgMCwgQkNNNTcwMSAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MTBiNywgMHgxMDA0LCAwLCAwLCBUQzk5NlNYICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgxMGI3LCAweDEwMDYsIDAsIDAsIFRDOTk2QlQgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDEwYjcsIDB4MTAwNywgMCwgMCwgVEMxMDAwVCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MTBiNywgMHgxMDA4LCAwLCAwLCBUQzk0MEJSMDEgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAxICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NiwgMHgxNGU0LCAweDgwMDksIDAsIDAsIEJDTTU3MDIgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ2LCAweDBlMTEsIDB4YmIsIDAsIDAsIE5DNzc2MCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDIgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNmE2LCAweDE0ZTQsIDB4ODAwOSwgMCwgMCwgQkNNNTcwMiAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2YTYsIDB4MGUxMSwgMHhiYiwgMCwgMCwgTkM3NzYwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTZhNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwMiAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDcsIDB4MTRlNCwgMHgwMDA5LCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NywgMHgxNGU0LCAweDAwMGEsIDAsIDAsIEJDTTU3MDNBMzEgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ3LCAweDE0ZTQsIDB4MDAwYiwgMCwgMCwgQkNNNTcwMyAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDcsIDB4MTRlNCwgMHg4MDBhLCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NywgMHgwZTExLCAweDlhLCAwLCAwLCBOQzc3NzAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ3LCAweDBlMTEsIDB4OTksIDAsIDAsIE5DNzc4MCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDMgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNmE3LCAweDE0ZTQsIDB4MDAwOSwgMCwgMCwgQkNNNTcwMyAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2YTcsIDB4MTRlNCwgMHgwMDBhLCAwLCAwLCBCQ001NzAzQTMxICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTZhNywgMHgxNGU0LCAweDAwMGIsIDAsIDAsIEJDTTU3MDMgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNmE3LCAweDE0ZTQsIDB4ODAwYSwgMCwgMCwgQkNNNTcwMyAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2YTcsIDB4MGUxMSwgMHg5YSwgMCwgMCwgTkM3NzcwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTZhNywgMHgwZTExLCAweDk5LCAwLCAwLCBOQzc3ODAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNmE3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9CisJeworCTB4MTRlNCwgMHgxNjQ0LCAweDEwMTQsIDB4MDI3NywgMCwgMCwgQkNNNTcwMFZJR0lMLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDE0ZTQsIDB4MTY0NCwgMCwgMCwgQkNNNTcwMEE2LCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDE0ZTQsIDB4MiwgMCwgMCwgQkNNNTcwMFQ2LCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDE0ZTQsIDB4MywgMCwgMCwgQkNNNTcwMEE5LCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDE0ZTQsIDB4NCwgMCwgMCwgQkNNNTcwMFQ5LCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDEwMjgsIDB4ZDEsIDAsIDAsIEJDTTU3MDAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTAyOCwgMHgwMTA2LCAwLCAwLCBCQ001NzAwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDEwMjgsIDB4MDEwOSwgMCwgMCwgQkNNNTcwMCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NCwgMHgxMDI4LCAweDAxMGEsIDAsIDAsIEJDTTU3MDAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDAwLCAwLCAwLCBUQzk5NlQsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDAxLCAwLCAwLCBUQzk5NlNULCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwMiwgMCwgMCwgVEM5OTZTU1gsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDAzLCAwLCAwLCBUQzk5N1QsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDA1LCAwLCAwLCBUQzk5N1NYLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwOCwgMCwgMCwgVEM5NDJCUjAxLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDEsIDAsIDAsIEJDTTU3MDFBNSwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCA1LCAwLCAwLCBCQ001NzAxVDEsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgNiwgMCwgMCwgQkNNNTcwMVQ4LCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDcsIDAsIDAsIEJDTTU3MDFBNywgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCA4LCAwLCAwLCBCQ001NzAxQTEwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDB4ODAwOCwgMCwgMCwgQkNNNTcwMUExMiwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgwZTExLCAweGMxLCAwLCAwLCBOQzY3NzAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MGUxMSwgMHg3YywgMCwgMCwgTkM3NzcwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDBlMTEsIDB4ODUsIDAsIDAsIE5DNzc4MCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgxMDI4LCAweDAxMjEsIDAsIDAsIEJDTTU3MDEsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MTBiNywgMHgxMDA0LCAwLCAwLCBUQzk5NlNYLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDEwYjcsIDB4MTAwNiwgMCwgMCwgVEM5OTZCVCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgxMGI3LCAweDEwMDcsIDAsIDAsIFRDMTAwMFQsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MTBiNywgMHgxMDA4LCAwLCAwLCBUQzk0MEJSMDEsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDEsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDYsIDB4MTRlNCwgMHg4MDA5LCAwLCAwLCBCQ001NzAyLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ2LCAweDBlMTEsIDB4YmIsIDAsIDAsIE5DNzc2MCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwMiwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTZhNiwgMHgxNGU0LCAweDgwMDksIDAsIDAsIEJDTTU3MDIsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2YTYsIDB4MGUxMSwgMHhiYiwgMCwgMCwgTkM3NzYwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNmE2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAyLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ3LCAweDE0ZTQsIDB4MDAwOSwgMCwgMCwgQkNNNTcwMywgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NywgMHgxNGU0LCAweDAwMGEsIDAsIDAsIEJDTTU3MDNBMzEsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDcsIDB4MTRlNCwgMHgwMDBiLCAwLCAwLCBCQ001NzAzLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ3LCAweDE0ZTQsIDB4ODAwYSwgMCwgMCwgQkNNNTcwMywgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NywgMHgwZTExLCAweDlhLCAwLCAwLCBOQzc3NzAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDcsIDB4MGUxMSwgMHg5OSwgMCwgMCwgTkM3NzgwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAzLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNmE3LCAweDE0ZTQsIDB4MDAwOSwgMCwgMCwgQkNNNTcwMywgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTZhNywgMHgxNGU0LCAweDAwMGEsIDAsIDAsIEJDTTU3MDNBMzEsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2YTcsIDB4MTRlNCwgMHgwMDBiLCAwLCAwLCBCQ001NzAzLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNmE3LCAweDE0ZTQsIDB4ODAwYSwgMCwgMCwgQkNNNTcwMywgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTZhNywgMHgwZTExLCAweDlhLCAwLCAwLCBOQzc3NzAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2YTcsIDB4MGUxMSwgMHg5OSwgMCwgMCwgTkM3NzgwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNmE3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAzLCAxMjgsIDMyfQogfTsKIAogI2RlZmluZSBuNTcweERldmljZXMgICAoc2l6ZW9mKGJjbTU3MHhEZXZpY2VzKS9zaXplb2YoYmNtNTcweERldmljZXNbMF0pKQogCi0KIC8qCiAgKiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgYmNtNTcweCBwYWNrZXQgcG9vbC4KICAqLwotdm9pZCAqCi1iY201NzB4UGt0QWxsb2MoaW50IHUsIGludCBwa3NpemUpCit2b2lkICpiY201NzB4UGt0QWxsb2MgKGludCB1LCBpbnQgcGtzaXplKQogewotICAgIHJldHVybiBtYWxsb2MocGtzaXplKTsKKwlyZXR1cm4gbWFsbG9jIChwa3NpemUpOwogfQogCiAvKgogICogRnJlZSBhIHBhY2tldCBwcmV2aW91c2x5IGFsbG9jYXRlZCBmcm9tIHRoZSBiY201NzB4IHBhY2tldAogICogYnVmZmVyIHBvb2wuCiAgKi8KLXZvaWQKLWJjbTU3MHhQa3RGcmVlKGludCB1LCB2b2lkICpwKQordm9pZCBiY201NzB4UGt0RnJlZSAoaW50IHUsIHZvaWQgKnApCiB7Ci0gICAgZnJlZShwKTsKKwlmcmVlIChwKTsKIH0KIAotaW50Ci1iY201NzB4UmVwbGVuaXNoUnhCdWZmZXJzKFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlKQoraW50IGJjbTU3MHhSZXBsZW5pc2hSeEJ1ZmZlcnMgKFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlKQogewotICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKLSAgICBQVU1fUEFDS0VUIHBVbVBhY2tldDsKLSAgICB2b2lkICpza2I7Ci0gICAgaW50IHF1ZXVlX3J4ID0gMDsKLSAgICBpbnQgcmV0ID0gMDsKKwlQTE1fUEFDS0VUIHBQYWNrZXQ7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQ7CisJdm9pZCAqc2tiOworCWludCBxdWV1ZV9yeCA9IDA7CisJaW50IHJldCA9IDA7CiAKLSAgICB3aGlsZSAoKHBVbVBhY2tldCA9IChQVU1fUEFDS0VUKQotCSAgICBRUV9Qb3BIZWFkKCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIpKSAhPSAwKSB7CisJd2hpbGUgKChwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkKKwkJUVFfUG9wSGVhZCAoJnBVbURldmljZS0+cnhfb3V0X29mX2J1Zl9xLkNvbnRhaW5lcikpICE9IDApIHsKIAotCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgcFVtUGFja2V0OworCQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIHBVbVBhY2tldDsKIAotCS8qIHJldXNlIGFuIG9sZCBza2IgKi8KLQlpZiAocFVtUGFja2V0LT5za2J1ZmYpIHsKLQkgICAgUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKLQkgICAgcXVldWVfcnggPSAxOwotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKCAoIHNrYiA9IGJjbTU3MHhQa3RBbGxvYyhwVW1EZXZpY2UtPmluZGV4LAotCQkJCSAgICAgcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclNpemUgKyAyKSkgPT0gMCkgewotCSAgICBRUV9QdXNoSGVhZCgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyLHBQYWNrZXQpOwotCSAgICBwcmludGYoIk5PVElDRTogT3V0IG9mIFJYIG1lbW9yeS5cbiIpOwotCSAgICByZXQgPSAxOwotCSAgICBicmVhazsKKwkJLyogcmV1c2UgYW4gb2xkIHNrYiAqLworCQlpZiAocFVtUGFja2V0LT5za2J1ZmYpIHsKKwkJCVFRX1B1c2hUYWlsICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsCisJCQkJICAgICBwUGFja2V0KTsKKwkJCXF1ZXVlX3J4ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoc2tiID0gYmNtNTcweFBrdEFsbG9jIChwVW1EZXZpY2UtPmluZGV4LAorCQkJCQkgICAgcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclNpemUgKyAyKSkgPT0KKwkJICAgIDApIHsKKwkJCVFRX1B1c2hIZWFkICgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyLAorCQkJCSAgICAgcFBhY2tldCk7CisJCQlwcmludGYgKCJOT1RJQ0U6IE91dCBvZiBSWCBtZW1vcnkuXG4iKTsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCXBVbVBhY2tldC0+c2tidWZmID0gc2tiOworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJcXVldWVfcnggPSAxOwogCX0KIAotCXBVbVBhY2tldC0+c2tidWZmID0gc2tiOwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7Ci0JcXVldWVfcnggPSAxOwotICAgIH0KKwlpZiAocXVldWVfcngpIHsKKwkJTE1fUXVldWVSeFBhY2tldHMgKHBEZXZpY2UpOworCX0KIAotICAgIGlmIChxdWV1ZV9yeCkgewotCUxNX1F1ZXVlUnhQYWNrZXRzKHBEZXZpY2UpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKICAqIFByb2JlLCBNYXAsIGFuZCBJbml0IDU3MHggZGV2aWNlLgogICovCi1pbnQgZXRoX2luaXQoYmRfdCAqYmlzKQoraW50IGV0aF9pbml0IChiZF90ICogYmlzKQogewotICAgIGludCBpLCBydiwgZGV2Rm91bmQgPSBGQUxTRTsKLSAgICBwY2lfZGV2X3QgIGRldmJ1c2ZuOwotICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwlpbnQgaSwgcnYsIGRldkZvdW5kID0gRkFMU0U7CisJcGNpX2Rldl90IGRldmJ1c2ZuOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKIAotICAgIC8qIEZpbmQgUENJIGRldmljZSwgaWYgaXQgZXhpc3RzLCBjb25maWd1cmUgLi4uICAqLwotICAgIGZvciggaSA9IDA7IGkgPCBuNTcweERldmljZXM7IGkrKyl7Ci0JZGV2YnVzZm4gPSBwY2lfZmluZF9kZXZpY2UoYmNtNTcweERldmljZXNbaV0udmVuZG9yX2lkLAotCQkJCSAgIGJjbTU3MHhEZXZpY2VzW2ldLmRldmljZV9pZCwgMCk7Ci0JaWYoZGV2YnVzZm4gPT0gLTEpIHsKLQkgICAgY29udGludWU7IC8qIE5vIGRldmljZSBvZiB0aGF0IHZlbmRvci9kZXZpY2UgSUQgKi8KKwkvKiBGaW5kIFBDSSBkZXZpY2UsIGlmIGl0IGV4aXN0cywgY29uZmlndXJlIC4uLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbjU3MHhEZXZpY2VzOyBpKyspIHsKKwkJZGV2YnVzZm4gPSBwY2lfZmluZF9kZXZpY2UgKGJjbTU3MHhEZXZpY2VzW2ldLnZlbmRvcl9pZCwKKwkJCQkJICAgIGJjbTU3MHhEZXZpY2VzW2ldLmRldmljZV9pZCwgMCk7CisJCWlmIChkZXZidXNmbiA9PSAtMSkgeworCQkJY29udGludWU7CS8qIE5vIGRldmljZSBvZiB0aGF0IHZlbmRvci9kZXZpY2UgSUQgKi8KKwkJfSBlbHNlIHsKKworCQkJLyogU2V0IElMSU5FICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKGRldmJ1c2ZuLAorCQkJCQkgICAgICAgUENJX0lOVEVSUlVQVF9MSU5FLAorCQkJCQkgICAgICAgQkNNNTcwWF9JTElORSk7CisKKwkJCS8qCisJCQkgKiAweDEwIC0gMHgxNCBkZWZpbmUgb25lIDY0LWJpdCBNQkFSLgorCQkJICogMHgxNCBpcyB0aGUgaGlnaGVyLW9yZGVyIGFkZHJlc3MgYml0cyBvZiB0aGUgQkFSLgorCQkJICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChkZXZidXNmbiwKKwkJCQkJCVBDSV9CQVNFX0FERFJFU1NfMSwgMCk7CisKKwkJCWlvQmFzZSA9IEJDTTU3MFhfTUJBUjsKKworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoZGV2YnVzZm4sCisJCQkJCQlQQ0lfQkFTRV9BRERSRVNTXzAsIGlvQmFzZSk7CisKKwkJCS8qCisJCQkgKiBFbmFibGUgUENJIG1lbW9yeSwgSU8sIGFuZCBNYXN0ZXIgLS0gZG9uJ3QKKwkJCSAqIHJlc2V0IGFueSBzdGF0dXMgYml0cyBpbiBkb2luZyBzby4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQgKGRldmJ1c2ZuLCBQQ0lfQ09NTUFORCwgJnN0YXR1cyk7CisKKwkJCXN0YXR1cyB8PSBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVI7CisKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZCAoZGV2YnVzZm4sIFBDSV9DT01NQU5ELCBzdGF0dXMpOworCisJCQlwcmludGYKKwkJCSAgICAoIlxuJXM6IGJ1cyAlZCwgZGV2aWNlICVkLCBmdW5jdGlvbiAlZDogTUJBUj0weCV4XG4iLAorCQkJICAgICBib2FyZF9pbmZvW2JjbTU3MHhEZXZpY2VzW2ldLmJvYXJkX2lkXS5uYW1lLAorCQkJICAgICBQQ0lfQlVTIChkZXZidXNmbiksIFBDSV9ERVYgKGRldmJ1c2ZuKSwKKwkJCSAgICAgUENJX0ZVTkMgKGRldmJ1c2ZuKSwgaW9CYXNlKTsKKworCQkJLyogQWxsb2NhdGUgb25jZSwgYnV0IGFsd2F5cyBjbGVhciBvbiBpbml0ICovCisJCQlpZiAoIXBEZXZpY2UpIHsKKwkJCQlwRGV2aWNlID0gbWFsbG9jIChzaXplb2YgKFVNX0RFVklDRV9CTE9DSykpOworCQkJCXBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworCQkJCW1lbXNldCAocERldmljZSwgMHgwLCBzaXplb2YgKFVNX0RFVklDRV9CTE9DSykpOworCQkJfQorCisJCQkvKiBDb25maWd1cmUgcGNpIGRldiBzdHJ1Y3R1cmUgKi8KKwkJCXBVbURldmljZS0+cGRldiA9IGRldmJ1c2ZuOworCQkJcFVtRGV2aWNlLT5pbmRleCA9IDA7CisJCQlwVW1EZXZpY2UtPnR4X3BrdCA9IDA7CisJCQlwVW1EZXZpY2UtPnJ4X3BrdCA9IDA7CisJCQlkZXZGb3VuZCA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZGV2Rm91bmQpIHsKKwkJcHJpbnRmCisJCSAgICAoImV0aF9pbml0OiBGQUlMVVJFOiBubyBCQ001NzB4IEV0aGVybmV0IGRldmljZXMgZm91bmQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldHVwIGRlZmF1bHRzIGZvciBjaGlwICovCisJcERldmljZS0+VGFza1RvT2ZmbG9hZCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOworCisJaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDBfQjApIHsKKwkJcERldmljZS0+VGFza1RvT2ZmbG9hZCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOwogCX0gZWxzZSB7CiAKLQkgICAgLyogU2V0IElMSU5FICovCi0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXZidXNmbiwKLQkJCQkgIFBDSV9JTlRFUlJVUFRfTElORSwgQkNNNTcwWF9JTElORSk7CisJCWlmIChyeF9jaGVja3N1bVtpXSkgeworCQkJcERldmljZS0+VGFza1RvT2ZmbG9hZCB8PQorCQkJICAgIExNX1RBU0tfT0ZGTE9BRF9SWF9UQ1BfQ0hFQ0tTVU0gfAorCQkJICAgIExNX1RBU0tfT0ZGTE9BRF9SWF9VRFBfQ0hFQ0tTVU07CisJCX0KIAotCSAgICAvKgotCSAgICAgKiAweDEwIC0gMHgxNCBkZWZpbmUgb25lIDY0LWJpdCBNQkFSLgotCSAgICAgKiAweDE0IGlzIHRoZSBoaWdoZXItb3JkZXIgYWRkcmVzcyBiaXRzIG9mIHRoZSBCQVIuCi0JICAgICAqLwotCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldmJ1c2ZuLAotCQkJCSAgIFBDSV9CQVNFX0FERFJFU1NfMSwgMCk7Ci0KLQkgICAgaW9CYXNlID0gQkNNNTcwWF9NQkFSOwotCi0JICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2YnVzZm4sCi0JCQkJICAgUENJX0JBU0VfQUREUkVTU18wLCBpb0Jhc2UpOwotCi0JICAgIC8qCi0JICAgICAqIEVuYWJsZSBQQ0kgbWVtb3J5LCBJTywgYW5kIE1hc3RlciAtLSBkb24ndAotCSAgICAgKiByZXNldCBhbnkgc3RhdHVzIGJpdHMgaW4gZG9pbmcgc28uCi0JICAgICAqLwotCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChkZXZidXNmbiwKLQkJCQkgUENJX0NPTU1BTkQsICZzdGF0dXMpOwotCi0JICAgIHN0YXR1cyB8PSBQQ0lfQ09NTUFORF9NRU1PUll8UENJX0NPTU1BTkRfTUFTVEVSOwotCi0JICAgIHBjaV93cml0ZV9jb25maWdfd29yZChkZXZidXNmbiwKLQkJCQkgIFBDSV9DT01NQU5ELCBzdGF0dXMpOwotCi0JICAgIHByaW50ZigiXG4lczogYnVzICVkLCBkZXZpY2UgJWQsIGZ1bmN0aW9uICVkOiBNQkFSPTB4JXhcbiIsCi0JCSAgIGJvYXJkX2luZm9bYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUsCi0JCSAgIFBDSV9CVVMoZGV2YnVzZm4pLAotCQkgICBQQ0lfREVWKGRldmJ1c2ZuKSwKLQkJICAgUENJX0ZVTkMoZGV2YnVzZm4pLAotCQkgICBpb0Jhc2UpOwotCi0JICAgIC8qIEFsbG9jYXRlIG9uY2UsIGJ1dCBhbHdheXMgY2xlYXIgb24gaW5pdCAqLwotCSAgICBpZiAoIXBEZXZpY2UpIHsKLQkJcERldmljZSA9IG1hbGxvYyhzaXplb2YoVU1fREVWSUNFX0JMT0NLKSk7Ci0JCXBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKXBEZXZpY2U7Ci0JCW1lbXNldChwRGV2aWNlLCAweDAsIHNpemVvZihVTV9ERVZJQ0VfQkxPQ0spKTsKLQkgICAgfQotCi0JICAgIC8qIENvbmZpZ3VyZSBwY2kgZGV2IHN0cnVjdHVyZSAqLwotCSAgICBwVW1EZXZpY2UtPnBkZXYgPSBkZXZidXNmbjsKLQkgICAgcFVtRGV2aWNlLT5pbmRleCA9IDA7Ci0JICAgIHBVbURldmljZS0+dHhfcGt0ID0gMDsKLQkgICAgcFVtRGV2aWNlLT5yeF9wa3QgPSAwOwotCSAgICBkZXZGb3VuZCA9IFRSVUU7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICBpZighZGV2Rm91bmQpewotCXByaW50ZigiZXRoX2luaXQ6IEZBSUxVUkU6IG5vIEJDTTU3MHggRXRoZXJuZXQgZGV2aWNlcyBmb3VuZC5cbiIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBTZXR1cCBkZWZhdWx0cyBmb3IgY2hpcCAqLwotICAgIHBEZXZpY2UtPlRhc2tUb09mZmxvYWQgPSBMTV9UQVNLX09GRkxPQURfTk9ORTsKLQotICAgIGlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAwX0IwKSB7Ci0JcERldmljZS0+VGFza1RvT2ZmbG9hZCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOwotICAgIH0gZWxzZSB7Ci0KLQlpZiAocnhfY2hlY2tzdW1baV0pIHsKLQkgICAgcERldmljZS0+VGFza1RvT2ZmbG9hZCB8PQotCQlMTV9UQVNLX09GRkxPQURfUlhfVENQX0NIRUNLU1VNIHwKLQkJTE1fVEFTS19PRkZMT0FEX1JYX1VEUF9DSEVDS1NVTTsKKwkJaWYgKHR4X2NoZWNrc3VtW2ldKSB7CisJCQlwRGV2aWNlLT5UYXNrVG9PZmZsb2FkIHw9CisJCQkgICAgTE1fVEFTS19PRkZMT0FEX1RYX1RDUF9DSEVDS1NVTSB8CisJCQkgICAgTE1fVEFTS19PRkZMT0FEX1RYX1VEUF9DSEVDS1NVTTsKKwkJCXBEZXZpY2UtPk5vVHhQc2V1ZG9IZHJDaGtzdW0gPSBUUlVFOworCQl9CiAJfQogCi0JaWYgKHR4X2NoZWNrc3VtW2ldKSB7Ci0JICAgIHBEZXZpY2UtPlRhc2tUb09mZmxvYWQgfD0KLQkJTE1fVEFTS19PRkZMT0FEX1RYX1RDUF9DSEVDS1NVTSB8Ci0JCUxNX1RBU0tfT0ZGTE9BRF9UWF9VRFBfQ0hFQ0tTVU07Ci0JICAgIHBEZXZpY2UtPk5vVHhQc2V1ZG9IZHJDaGtzdW0gPSBUUlVFOworCS8qIFNldCBEZXZpY2UgUENJIE1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKwlwRGV2aWNlLT5wTWFwcGVkTWVtQmFzZSA9IChQTE1fVUlOVDgpIGlvQmFzZTsKKworCS8qIFB1bGwgZG93biBhZGFwdGVyIGluZm8gKi8KKwlpZiAoKHJ2ID0gTE1fR2V0QWRhcHRlckluZm8gKHBEZXZpY2UpKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlwcmludGYgKCJiY201NzB4RW5kOiBMTV9HZXRBZGFwdGVySW5mbyBmYWlsZWQ6IHJ2PSVkIVxuIiwgcnYpOworCQlyZXR1cm4gLTI7CiAJfQotICAgIH0KIAotICAgIC8qIFNldCBEZXZpY2UgUENJIE1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSAgICBwRGV2aWNlLT5wTWFwcGVkTWVtQmFzZSA9IChQTE1fVUlOVDgpIGlvQmFzZTsKKwkvKiBMb2NrIG5vdCBuZWVkZWQgKi8KKwlwVW1EZXZpY2UtPmRvX2dsb2JhbF9sb2NrID0gMDsKIAotICAgIC8qIFB1bGwgZG93biBhZGFwdGVyIGluZm8gKi8KLSAgICBpZiAoKHJ2ID0gTE1fR2V0QWRhcHRlckluZm8ocERldmljZSkpICE9IExNX1NUQVRVU19TVUNDRVNTKSB7Ci0JcHJpbnRmKCJiY201NzB4RW5kOiBMTV9HZXRBZGFwdGVySW5mbyBmYWlsZWQ6IHJ2PSVkIVxuIiwgcnYgKTsKLQlyZXR1cm4gLTI7Ci0gICAgfQorCWlmIChUM19BU0lDX1JFViAocFVtRGV2aWNlLT5sbV9kZXYuQ2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCS8qIFRoZSA1NzAwIGNoaXAgd29ya3MgYmVzdCB3aXRob3V0IGludGVybGVhdmVkIHJlZ2lzdGVyICovCisJCS8qIGFjY2Vzc2VzIG9uIGNlcnRhaW4gbWFjaGluZXMuICovCisJCXBVbURldmljZS0+ZG9fZ2xvYmFsX2xvY2sgPSAxOworCX0KIAotICAgIC8qIExvY2sgbm90IG5lZWRlZCAqLwotICAgIHBVbURldmljZS0+ZG9fZ2xvYmFsX2xvY2sgPSAwOworCS8qIFNldHVwIHRpbWVyIGRlbGF5cyAqLworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCXBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IFRSVUU7CisJCXBVbURldmljZS0+dGltZXJfaW50ZXJ2YWwgPSBDRkdfSFo7CisJfSBlbHNlIHsKKwkJcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWiAvIDUwOworCX0KIAotICAgIGlmIChUM19BU0lDX1JFVihwVW1EZXZpY2UtPmxtX2Rldi5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKLQkvKiBUaGUgNTcwMCBjaGlwIHdvcmtzIGJlc3Qgd2l0aG91dCBpbnRlcmxlYXZlZCByZWdpc3RlciAqLwotCS8qIGFjY2Vzc2VzIG9uIGNlcnRhaW4gbWFjaGluZXMuICovCi0JcFVtRGV2aWNlLT5kb19nbG9iYWxfbG9jayA9IDE7Ci0gICAgfQorCS8qIEdyYWIgbmFtZSAuLi4uICovCisJcFVtRGV2aWNlLT5uYW1lID0KKwkgICAgKGNoYXIgKiltYWxsb2MgKHN0cmxlbiAoYm9hcmRfaW5mb1tiY201NzB4RGV2aWNlc1tpXS5ib2FyZF9pZF0ubmFtZSkKKwkJCSAgICArIDEpOworCXN0cmNweSAocFVtRGV2aWNlLT5uYW1lLCBib2FyZF9pbmZvW2JjbTU3MHhEZXZpY2VzW2ldLmJvYXJkX2lkXS5uYW1lKTsKIAotICAgIC8qIFNldHVwIHRpbWVyIGRlbGF5cyAqLwotICAgIGlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKLQlwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMgPSBUUlVFOwotCXBVbURldmljZS0+dGltZXJfaW50ZXJ2YWwgPSBDRkdfSFo7Ci0gICAgfQotICAgIGVsc2UgewotCXBVbURldmljZS0+dGltZXJfaW50ZXJ2YWwgPSBDRkdfSFogLyA1MDsKLSAgICB9CisJbWVtY3B5IChwRGV2aWNlLT5Ob2RlQWRkcmVzcywgYmlzLT5iaV9lbmV0YWRkciwgNik7CisJTE1fU2V0TWFjQWRkcmVzcyAocERldmljZSwgYmlzLT5iaV9lbmV0YWRkcik7CisJLyogSW5pdCBxdWV1ZXMgIC4uICovCisJUVFfSW5pdFF1ZXVlICgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyLAorCQkgICAgICBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQpOworCXBVbURldmljZS0+cnhfbGFzdF9jbnQgPSBwVW1EZXZpY2UtPnR4X2xhc3RfY250ID0gMDsKIAotICAgIC8qIEdyYWIgbmFtZSAuLi4uICovCi0gICAgcFVtRGV2aWNlLT5uYW1lID0KLQkoY2hhciopbWFsbG9jKHN0cmxlbihib2FyZF9pbmZvW2JjbTU3MHhEZXZpY2VzW2ldLmJvYXJkX2lkXS5uYW1lKSsxKTsKLSAgICBzdHJjcHkocFVtRGV2aWNlLT5uYW1lLGJvYXJkX2luZm9bYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUpOworCS8qIGRlbGF5IGZvciA0IHNlY29uZHMgKi8KKwlwVW1EZXZpY2UtPmRlbGF5ZWRfbGlua19pbmQgPSAoNCAqIENGR19IWikgLyBwVW1EZXZpY2UtPnRpbWVyX2ludGVydmFsOwogCi0gICAgbWVtY3B5KHBEZXZpY2UtPk5vZGVBZGRyZXNzLCBiaXMtPmJpX2VuZXRhZGRyLCA2KTsKLSAgICBMTV9TZXRNYWNBZGRyZXNzKHBEZXZpY2UsIGJpcy0+YmlfZW5ldGFkZHIpOwotICAgIC8qIEluaXQgcXVldWVzICAuLiAqLwotICAgIFFRX0luaXRRdWV1ZSgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyLAotCQkgTUFYX1JYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKLSAgICBwVW1EZXZpY2UtPnJ4X2xhc3RfY250ID0gcFVtRGV2aWNlLT50eF9sYXN0X2NudCA9IDA7CisJcFVtRGV2aWNlLT5hZGFwdGl2ZV9leHBpcnkgPSBDRkdfSFogLyBwVW1EZXZpY2UtPnRpbWVyX2ludGVydmFsOwogCi0gICAgLyogZGVsYXkgZm9yIDQgc2Vjb25kcyAqLwotICAgIHBVbURldmljZS0+ZGVsYXllZF9saW5rX2luZCA9Ci0JKDQgKiBDRkdfSFopIC8gcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbDsKKwkvKiBTb21ldGltZXMgd2UgZ2V0IHNwdXJpb3VzIGludHMuIGFmdGVyIHJlc2V0IHdoZW4gbGluayBpcyBkb3duLiAqLworCS8qIFRoaXMgZmllbGQgdGVsbHMgdGhlIGlzciB0byBzZXJ2aWNlIHRoZSBpbnQuIGV2ZW4gaWYgdGhlcmUgaXMgKi8KKwkvKiBubyBzdGF0dXMgYmxvY2sgdXBkYXRlLiAqLworCXBVbURldmljZS0+YWRhcHRlcl9qdXN0X2luaXRlZCA9CisJICAgICgzICogQ0ZHX0haKSAvIHBVbURldmljZS0+dGltZXJfaW50ZXJ2YWw7CiAKLSAgICBwVW1EZXZpY2UtPmFkYXB0aXZlX2V4cGlyeSA9Ci0JQ0ZHX0haIC8gcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbDsKKwkvKiBJbml0aWFsaXplIDU3MHggKi8KKwlpZiAoTE1fSW5pdGlhbGl6ZUFkYXB0ZXIgKHBEZXZpY2UpICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCXByaW50ZiAoIkVSUk9SOiBBZGFwdGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gRVJST1I7CisJfQogCi0gICAgLyogU29tZXRpbWVzIHdlIGdldCBzcHVyaW91cyBpbnRzLiBhZnRlciByZXNldCB3aGVuIGxpbmsgaXMgZG93bi4gKi8KLSAgICAvKiBUaGlzIGZpZWxkIHRlbGxzIHRoZSBpc3IgdG8gc2VydmljZSB0aGUgaW50LiBldmVuIGlmIHRoZXJlIGlzICovCi0gICAgLyogbm8gc3RhdHVzIGJsb2NrIHVwZGF0ZS4gKi8KLSAgICBwVW1EZXZpY2UtPmFkYXB0ZXJfanVzdF9pbml0ZWQgPQotCSgzICogQ0ZHX0haKSAvIHBVbURldmljZS0+dGltZXJfaW50ZXJ2YWw7CisJLyogRW5hYmxlIGNoaXAgSVNSICovCisJTE1fRW5hYmxlSW50ZXJydXB0IChwRGV2aWNlKTsKIAotICAgIC8qIEluaXRpYWxpemUgNTcweCAqLwotICAgIGlmIChMTV9Jbml0aWFsaXplQWRhcHRlcihwRGV2aWNlKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgewotCXByaW50ZigiRVJST1I6IEFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7Ci0JcmV0dXJuIEVSUk9SOwotICAgIH0KKwkvKiBDbGVhciBNQyB0YWJsZSAqLworCUxNX011bHRpY2FzdENsZWFyIChwRGV2aWNlKTsKIAotICAgIC8qIEVuYWJsZSBjaGlwIElTUiAqLwotICAgIExNX0VuYWJsZUludGVycnVwdChwRGV2aWNlKTsKKwkvKiBFbmFibGUgTXVsdGljYXN0ICovCisJTE1fU2V0UmVjZWl2ZU1hc2sgKHBEZXZpY2UsCisJCQkgICBwRGV2aWNlLT5SZWNlaXZlTWFzayB8IExNX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKIAotICAgIC8qIENsZWFyIE1DIHRhYmxlICovCi0gICAgTE1fTXVsdGljYXN0Q2xlYXIocERldmljZSk7CisJcFVtRGV2aWNlLT5vcGVuZWQgPSAxOworCXBVbURldmljZS0+dHhfZnVsbCA9IDA7CisJcFVtRGV2aWNlLT50eF9wa3QgPSAwOworCXBVbURldmljZS0+cnhfcGt0ID0gMDsKKwlwcmludGYgKCJldGglZDogJXMgQDB4JWx4LCIsCisJCXBEZXZpY2UtPmluZGV4LCBwVW1EZXZpY2UtPm5hbWUsICh1bnNpZ25lZCBsb25nKWlvQmFzZSk7CisJcHJpbnRmICgibm9kZSBhZGRyICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJcHJpbnRmICgiJTIuMngiLCBwRGV2aWNlLT5Ob2RlQWRkcmVzc1tpXSk7CisJfQorCXByaW50ZiAoIlxuIik7CiAKLSAgICAvKiBFbmFibGUgTXVsdGljYXN0ICovCi0gICAgTE1fU2V0UmVjZWl2ZU1hc2socERldmljZSwKLQkJICAgICAgcERldmljZS0+UmVjZWl2ZU1hc2sgfCBMTV9BQ0NFUFRfQUxMX01VTFRJQ0FTVCk7CisJcHJpbnRmICgiZXRoJWQ6ICIsIHBEZXZpY2UtPmluZGV4KTsKKwlwcmludGYgKCIlcyB3aXRoICIsIGNoaXBfcmV2W2JjbTU3MHhEZXZpY2VzW2ldLmJvYXJkX2lkXS5uYW1lKTsKIAotICAgIHBVbURldmljZS0+b3BlbmVkID0gMTsKLSAgICBwVW1EZXZpY2UtPnR4X2Z1bGwgPSAwOwotICAgIHBVbURldmljZS0+dHhfcGt0ID0gMDsKLSAgICBwVW1EZXZpY2UtPnJ4X3BrdCA9IDA7Ci0gICAgcHJpbnRmKCJldGglZDogJXMgQDB4JWx4LCIsCi0JICAgcERldmljZS0+aW5kZXgsIHBVbURldmljZS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpaW9CYXNlKTsKLSAgICBwcmludGYoCSJub2RlIGFkZHIgIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewotCXByaW50ZigiJTIuMngiLCBwRGV2aWNlLT5Ob2RlQWRkcmVzc1tpXSk7Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKKwlpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDAwX1BIWV9JRCkKKwkJcHJpbnRmICgiQnJvYWRjb20gQkNNNTQwMCBDb3BwZXIgIik7CisJZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDAxX1BIWV9JRCkKKwkJcHJpbnRmICgiQnJvYWRjb20gQkNNNTQwMSBDb3BwZXIgIik7CisJZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDExX1BIWV9JRCkKKwkJcHJpbnRmICgiQnJvYWRjb20gQkNNNTQxMSBDb3BwZXIgIik7CisJZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NzAxX1BIWV9JRCkKKwkJcHJpbnRmICgiQnJvYWRjb20gQkNNNTcwMSBJbnRlZ3JhdGVkIENvcHBlciAiKTsKKwllbHNlIGlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU3MDNfUEhZX0lEKQorCQlwcmludGYgKCJCcm9hZGNvbSBCQ001NzAzIEludGVncmF0ZWQgQ29wcGVyICIpOworCWVsc2UgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNODAwMl9QSFlfSUQpCisJCXByaW50ZiAoIkJyb2FkY29tIEJDTTgwMDIgU2VyRGVzICIpOworCWVsc2UgaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkKKwkJcHJpbnRmICgiQWdpbGVudCBIRE1QLTE2MzYgU2VyRGVzICIpOworCWVsc2UKKwkJcHJpbnRmICgiVW5rbm93biAiKTsKKwlwcmludGYgKCJ0cmFuc2NlaXZlciBmb3VuZFxuIik7CiAKLSAgICBwcmludGYoImV0aCVkOiAiLCBwRGV2aWNlLT5pbmRleCk7Ci0gICAgcHJpbnRmKCIlcyB3aXRoICIsCi0JICAgY2hpcF9yZXZbYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUpOworCXByaW50ZiAoImV0aCVkOiAlcywgTVRVOiAlZCwiLAorCQlwRGV2aWNlLT5pbmRleCwgcERldmljZS0+QnVzU3BlZWRTdHIsIDE1MDApOwogCi0gICAgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTQwMF9QSFlfSUQpCi0JcHJpbnRmKCJCcm9hZGNvbSBCQ001NDAwIENvcHBlciAiKTsKLSAgICBlbHNlIGlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU0MDFfUEhZX0lEKQotCXByaW50ZigiQnJvYWRjb20gQkNNNTQwMSBDb3BwZXIgIik7Ci0gICAgZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDExX1BIWV9JRCkKLQlwcmludGYoIkJyb2FkY29tIEJDTTU0MTEgQ29wcGVyICIpOwotICAgIGVsc2UgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTcwMV9QSFlfSUQpCi0JcHJpbnRmKCJCcm9hZGNvbSBCQ001NzAxIEludGVncmF0ZWQgQ29wcGVyICIpOwotICAgIGVsc2UgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTcwM19QSFlfSUQpCi0JcHJpbnRmKCJCcm9hZGNvbSBCQ001NzAzIEludGVncmF0ZWQgQ29wcGVyICIpOwotICAgIGVsc2UgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNODAwMl9QSFlfSUQpCi0JcHJpbnRmKCJCcm9hZGNvbSBCQ004MDAyIFNlckRlcyAiKTsKLSAgICBlbHNlIGlmIChwRGV2aWNlLT5FbmFibGVUYmkpCi0JcHJpbnRmKCJBZ2lsZW50IEhETVAtMTYzNiBTZXJEZXMgIik7Ci0gICAgZWxzZQotCXByaW50ZigiVW5rbm93biAiKTsKLSAgICBwcmludGYoInRyYW5zY2VpdmVyIGZvdW5kXG4iKTsKKwlpZiAoKHBEZXZpY2UtPkNoaXBSZXZJZCAhPSBUM19DSElQX0lEXzU3MDBfQjApICYmIHJ4X2NoZWNrc3VtW2ldKQorCQlwcmludGYgKCJSeCBDaGVja3N1bSBPTlxuIik7CisJZWxzZQorCQlwcmludGYgKCJSeCBDaGVja3N1bSBPRkZcbiIpOworCWluaXRpYWxpemVkKys7CiAKLSAgICBwcmludGYoImV0aCVkOiAlcywgTVRVOiAlZCwiLAotCSAgIHBEZXZpY2UtPmluZGV4LCBwRGV2aWNlLT5CdXNTcGVlZFN0ciwgMTUwMCk7Ci0KLSAgICBpZiAoKHBEZXZpY2UtPkNoaXBSZXZJZCAhPSBUM19DSElQX0lEXzU3MDBfQjApICYmCi0JcnhfY2hlY2tzdW1baV0pCi0JcHJpbnRmKCJSeCBDaGVja3N1bSBPTlxuIik7Ci0gICAgZWxzZQotCXByaW50ZigiUnggQ2hlY2tzdW0gT0ZGXG4iKTsKLSAgICBpbml0aWFsaXplZCsrOwotCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIC8qIEV0aGVybmV0IEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KLXZvaWQKLWV0aF9pc3Iodm9pZCkKK3ZvaWQgZXRoX2lzciAodm9pZCkKIHsKLSAgICBMTV9VSU5UMzIgb2xkdGFnLCBuZXd0YWc7Ci0gICAgaW50IGk7CisJTE1fVUlOVDMyIG9sZHRhZywgbmV3dGFnOworCWludCBpOwogCi0gICAgcFVtRGV2aWNlLT5pbnRlcnJ1cHQgPSAxOworCXBVbURldmljZS0+aW50ZXJydXB0ID0gMTsKIAotICAgIGlmIChwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMpIHsKLQlpZiAoKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJiBTVEFUVVNfQkxPQ0tfVVBEQVRFRCkgfHwKLQkgICAgcFVtRGV2aWNlLT5hZGFwdGVyX2p1c3RfaW5pdGVkKSB7Ci0JICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIDEpOwotCSAgICBvbGR0YWcgPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzVGFnOworCWlmIChwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMpIHsKKwkJaWYgKChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgU1RBVFVTX0JMT0NLX1VQREFURUQpIHx8CisJCSAgICBwVW1EZXZpY2UtPmFkYXB0ZXJfanVzdF9pbml0ZWQpIHsKKwkJCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93LCAxKTsKKwkJCW9sZHRhZyA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXNUYWc7CiAKLQkgICAgZm9yIChpID0gMDsgOyBpKyspIHsKLQkJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyAmPSB+U1RBVFVTX0JMT0NLX1VQREFURUQ7Ci0JCUxNX1NlcnZpY2VJbnRlcnJ1cHRzKHBEZXZpY2UpOwotCQluZXd0YWcgPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzVGFnOwotCQlpZiAoKG5ld3RhZyA9PSBvbGR0YWcpIHx8IChpID4gNTApKSB7Ci0JCSAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93LCBuZXd0YWcgPDwgMjQpOwotCQkgICAgaWYgKHBEZXZpY2UtPlVuZGlGaXgpIHsKLQkJCVJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLAotCQkJICAgICAgIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8IDB4Mik7Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQkJIH0KLQkJb2xkdGFnID0gbmV3dGFnOwotCSAgICB9CisJCQlmb3IgKGkgPSAwOzsgaSsrKSB7CisJCQkJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyAmPQorCQkJCSAgICB+U1RBVFVTX0JMT0NLX1VQREFURUQ7CisJCQkJTE1fU2VydmljZUludGVycnVwdHMgKHBEZXZpY2UpOworCQkJCW5ld3RhZyA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXNUYWc7CisJCQkJaWYgKChuZXd0YWcgPT0gb2xkdGFnKSB8fCAoaSA+IDUwKSkgeworCQkJCQlNQl9SRUdfV1IgKHBEZXZpY2UsCisJCQkJCQkgICBNYWlsYm94LkludGVycnVwdFswXS5Mb3csCisJCQkJCQkgICBuZXd0YWcgPDwgMjQpOworCQkJCQlpZiAocERldmljZS0+VW5kaUZpeCkgeworCQkJCQkJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLAorCQkJCQkJCXBEZXZpY2UtPgorCQkJCQkJCUdyY0xvY2FsQ3RybCB8IDB4Mik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW9sZHRhZyA9IG5ld3RhZzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlIChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgU1RBVFVTX0JMT0NLX1VQREFURUQpIHsKKwkJCXVuc2lnbmVkIGludCBkdW1teTsKKworCQkJcERldmljZS0+cE1lbVZpZXctPk1haWxib3guSW50ZXJydXB0WzBdLkxvdyA9IDE7CisJCQlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICY9CisJCQkgICAgflNUQVRVU19CTE9DS19VUERBVEVEOworCQkJTE1fU2VydmljZUludGVycnVwdHMgKHBEZXZpY2UpOworCQkJcERldmljZS0+cE1lbVZpZXctPk1haWxib3guSW50ZXJydXB0WzBdLkxvdyA9IDA7CisJCQlkdW1teSA9IHBEZXZpY2UtPnBNZW1WaWV3LT5NYWlsYm94LkludGVycnVwdFswXS5Mb3c7CisJCX0KIAl9Ci0gICAgfQotICAgIGVsc2UgewotCXdoaWxlIChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgU1RBVFVTX0JMT0NLX1VQREFURUQpIHsKLQkgICAgdW5zaWduZWQgaW50IGR1bW15OwogCi0JICAgIHBEZXZpY2UtPnBNZW1WaWV3LT5NYWlsYm94LkludGVycnVwdFswXS5Mb3cgPSAxOwotCSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICY9IH5TVEFUVVNfQkxPQ0tfVVBEQVRFRDsKLQkgICAgTE1fU2VydmljZUludGVycnVwdHMocERldmljZSk7Ci0JICAgIHBEZXZpY2UtPnBNZW1WaWV3LT5NYWlsYm94LkludGVycnVwdFswXS5Mb3cgPSAwOwotCSAgICBkdW1teSA9IHBEZXZpY2UtPnBNZW1WaWV3LT5NYWlsYm94LkludGVycnVwdFswXS5Mb3c7CisJLyogQWxsb2NhdGUgbmV3IFJYIGJ1ZmZlcnMgKi8KKwlpZiAoUVFfR2V0RW50cnlDbnQgKCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIpKSB7CisJCWJjbTU3MHhSZXBsZW5pc2hSeEJ1ZmZlcnMgKHBVbURldmljZSk7CiAJfQotICAgIH0KIAotICAgIC8qIEFsbG9jYXRlIG5ldyBSWCBidWZmZXJzICovCi0gICAgaWYgKFFRX0dldEVudHJ5Q250KCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIpKSB7Ci0JYmNtNTcweFJlcGxlbmlzaFJ4QnVmZmVycyhwVW1EZXZpY2UpOwotICAgIH0KLQotICAgIC8qIFF1ZXVlIHBhY2tldHMgKi8KLSAgICBpZiAoUVFfR2V0RW50cnlDbnQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKSkgewotCUxNX1F1ZXVlUnhQYWNrZXRzKHBEZXZpY2UpOwotICAgIH0KLQotICAgIGlmIChwVW1EZXZpY2UtPnR4X3F1ZXVlZCkgewotCXBVbURldmljZS0+dHhfcXVldWVkID0gMDsKLSAgICB9Ci0KLSAgICBpZihwVW1EZXZpY2UtPnR4X2Z1bGwpewotCWlmKHBEZXZpY2UtPkxpbmtTdGF0dXMgIT0gTE1fU1RBVFVTX0xJTktfRE9XTil7Ci0JICAgIHByaW50ZigiTk9USUNFOiB0eCB3YXMgcHJldmlvdXNseSBibG9ja2VkLCByZXN0YXJ0aW5nIE1VWFxuIik7Ci0JICAgIHBVbURldmljZS0+dHhfZnVsbCA9IDA7CisJLyogUXVldWUgcGFja2V0cyAqLworCWlmIChRUV9HZXRFbnRyeUNudCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKSkgeworCQlMTV9RdWV1ZVJ4UGFja2V0cyAocERldmljZSk7CiAJfQotICAgIH0KIAotICAgIHBVbURldmljZS0+aW50ZXJydXB0ID0gMDsKKwlpZiAocFVtRGV2aWNlLT50eF9xdWV1ZWQpIHsKKwkJcFVtRGV2aWNlLT50eF9xdWV1ZWQgPSAwOworCX0KKworCWlmIChwVW1EZXZpY2UtPnR4X2Z1bGwpIHsKKwkJaWYgKHBEZXZpY2UtPkxpbmtTdGF0dXMgIT0gTE1fU1RBVFVTX0xJTktfRE9XTikgeworCQkJcHJpbnRmCisJCQkgICAgKCJOT1RJQ0U6IHR4IHdhcyBwcmV2aW91c2x5IGJsb2NrZWQsIHJlc3RhcnRpbmcgTVVYXG4iKTsKKwkJCXBVbURldmljZS0+dHhfZnVsbCA9IDA7CisJCX0KKwl9CisKKwlwVW1EZXZpY2UtPmludGVycnVwdCA9IDA7CiAKIH0KIAotaW50Ci1ldGhfc2VuZCh2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCitpbnQgZXRoX3NlbmQgKHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKIHsKLSAgICBpbnQgc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKICNpZiBFVF9ERUJVRwotICAgIHVuc2lnbmVkIGNoYXIqIHB0ciA9ICh1bnNpZ25lZCBjaGFyKilwYWNrZXQ7CisJdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKilwYWNrZXQ7CiAjZW5kaWYKLSAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7Ci0gICAgUFVNX1BBQ0tFVCBwVW1QYWNrZXQ7CisJUExNX1BBQ0tFVCBwUGFja2V0OworCVBVTV9QQUNLRVQgcFVtUGFja2V0OwogCi0gICAgLyogTGluayBkb3duLCByZXR1cm4gKi8KLSAgICB3aGlsZShwRGV2aWNlLT5MaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0RPV04pIHsKKwkvKiBMaW5rIGRvd24sIHJldHVybiAqLworCXdoaWxlIChwRGV2aWNlLT5MaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0RPV04pIHsKICNpZiAwCi0JcHJpbnRmKCJldGglZDogbGluayBkb3duIC0gY2hlY2sgY2FibGUgb3IgbGluayBwYXJ0bmVyLlxuIiwKLQkgICAgICAgcFVtRGV2aWNlLT5pbmRleCk7CisJCXByaW50ZiAoImV0aCVkOiBsaW5rIGRvd24gLSBjaGVjayBjYWJsZSBvciBsaW5rIHBhcnRuZXIuXG4iLAorCQkJcFVtRGV2aWNlLT5pbmRleCk7CiAjZW5kaWYKLQlldGhfaXNyKCk7CisJCWV0aF9pc3IgKCk7CiAKLQkvKiBXYWl0IHRvIHNlZSBsaW5rIGZvciBvbmUtaGFsZiBhIHNlY29uZCBiZWZvcmUgc2VuZGluZyAuLi4gKi8KLQl1ZGVsYXkoMTUwMDAwMCk7CisJCS8qIFdhaXQgdG8gc2VlIGxpbmsgZm9yIG9uZS1oYWxmIGEgc2Vjb25kIGJlZm9yZSBzZW5kaW5nIC4uLiAqLworCQl1ZGVsYXkgKDE1MDAwMDApOwogCi0gICAgfQotCi0gICAgLyogQ2xlYXIgc2VudCBmbGFnICovCi0gICAgcFVtRGV2aWNlLT50eF9wa3QgPSAwOwotCi0gICAgLyogUHJldmlvdXNseSBibG9ja2VkICovCi0gICAgaWYocFVtRGV2aWNlLT50eF9mdWxsKXsKLQlwcmludGYoImV0aCVkOiB0eCBibG9ja2VkLlxuIiwgcFVtRGV2aWNlLT5pbmRleCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcFBhY2tldCA9IChQTE1fUEFDS0VUKQotCVFRX1BvcEhlYWQoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKLQotICAgIGlmIChwUGFja2V0ID09IDApIHsKLQlwVW1EZXZpY2UtPnR4X2Z1bGwgPSAxOwotCXByaW50ZigiYmNtNTcweEVuZFNlbmQ6IFRYIGZ1bGwhXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAocERldmljZS0+U2VuZEJkTGVmdC5jb3VudGVyID09IDApIHsKLQlwVW1EZXZpY2UtPnR4X2Z1bGwgPSAxOwotCXByaW50ZigiYmNtNTcweEVuZFNlbmQ6IG5vIG1vcmUgVFggZGVzY3JpcHRvcnMhXG4iKTsKLQlRUV9QdXNoSGVhZCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChsZW5ndGggPD0gMCl7Ci0JcHJpbnRmKCJldGg6IGJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIGxlbmd0aCk7Ci0JZ290byBvdXQ7Ci0gICAgfQotCi0gICAgLyogR2V0IHBhY2tldCBidWZmZXJzIGFuZCBmcmFnbWVudCBsaXN0ICovCi0gICAgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7Ci0gICAgLyogU2luZ2xlIERNQSBEZXNjcmlwdG9yIHRyYW5zbWl0LgotICAgICAqIEZyYWdtZW50cyBtYXkgYmUgcHJvdmlkZWQsIGJ1dCBvbmUgRE1BIGRlc2NyaXB0b3IgbWF4IGlzCi0gICAgICogdXNlZCB0byBzZW5kIHRoZSBwYWNrZXQuCi0gICAgICovCi0gICAgaWYgKE1NX0NvYWxlc2NlVHhCdWZmZXIgKHBEZXZpY2UsIHBQYWNrZXQpICE9IExNX1NUQVRVU19TVUNDRVNTKSB7Ci0JaWYgKHBVbVBhY2tldC0+c2tidWZmID09IE5VTEwpewotCSAgICAvKiBQYWNrZXQgd2FzIGRpc2NhcmRlZCAqLwotCSAgICBwcmludGYoIlRYOiBmYWlsZWQgKDEpXG4iKTsKLQkgICAgc3RhdHVzID0gMTsKLQl9IGVsc2V7Ci0JICAgIHByaW50ZigiVFg6IGZhaWxlZCAoMilcbiIpOwotCSAgICBzdGF0dXMgPSAyOwotCX0KLQlRUV9QdXNoSGVhZCAoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKLQlyZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8qIENvcHkgcGFja2V0IHRvIERNQSBidWZmZXIgKi8KLSAgICBtZW1zZXQocFVtUGFja2V0LT5za2J1ZmYsIDB4MCwgTUFYX1BBQ0tFVF9TSVpFKTsKLSAgICBtZW1jcHkoKHZvaWQqKXBVbVBhY2tldC0+c2tidWZmLCAodm9pZCopcGFja2V0LCBsZW5ndGgpOwotICAgIHBQYWNrZXQtPlBhY2tldFNpemUgPSBsZW5ndGg7Ci0gICAgcFBhY2tldC0+RmxhZ3MgfD0gU05EX0JEX0ZMQUdfRU5EfFNORF9CRF9GTEFHX0NPQUxfTk9XOwotICAgIHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50ID0gMTsKLSAgICAvKiBXZSd2ZSBhbHJlYWR5IHByb3ZpZGVkIGEgZnJhbWUgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiAqLwotICAgIHBQYWNrZXQtPkZsYWdzICY9IH5TTkRfQkRfRkxBR19UQ1BfVURQX0NLU1VNOwotCi0gICAgaWYgKCBMTV9TZW5kUGFja2V0KHBEZXZpY2UsIHBQYWNrZXQpID09IExNX1NUQVRVU19GQUlMVVJFKXsKLQkvKgotCSAqICBBIGxvd2VyIGxldmVsIHNlbmQgZmFpbHVyZSB3aWxsIHB1c2ggdGhlIHBhY2tldCBkZXNjcmlwdG9yIGJhY2sKLQkgKiAgaW4gdGhlIGZyZWUgcXVldWUsIHNvIGp1c3QgZGVhbCB3aXRoIHRoZSBWeFdvcmtzIGNsdXN0ZXJzLgotCSAqLwotCWlmIChwVW1QYWNrZXQtPnNrYnVmZiA9PSBOVUxMKXsKLQkgICAgcHJpbnRmKCJUWCBmYWlsZWQgKDEpIVxuIik7Ci0JICAgIC8qIFBhY2tldCB3YXMgZGlzY2FyZGVkICovCi0JICAgIHN0YXR1cyA9IDM7Ci0JfSBlbHNlIHsKLQkgICAgLyogQSByZXNvdXJjZSBwcm9ibGVtIC4uLiAqLwotCSAgICBwcmludGYoIlRYIGZhaWxlZCAoMikhXG4iKTsKLQkgICAgc3RhdHVzID0gNDsKIAl9CiAKLQlpZiAoUVFfR2V0RW50cnlDbnQoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyKSA9PSAwKSB7Ci0JICAgIHByaW50ZigiVFg6IGVtcHR5USFcbiIpOwotCSAgICBwVW1EZXZpY2UtPnR4X2Z1bGwgPSAxOwotCX0KLSAgICB9CisJLyogQ2xlYXIgc2VudCBmbGFnICovCisJcFVtRGV2aWNlLT50eF9wa3QgPSAwOwogCi0gICAgd2hpbGUocFVtRGV2aWNlLT50eF9wa3QgPT0gMCl7Ci0JLyogU2VydmljZSBUWCAqLwotCWV0aF9pc3IoKTsKLSAgICB9Ci0jaWYgRVRfREVCVUcKLSAgICBwcmludGYoImV0aF9zZW5kOiAweCV4LCAlZCBieXRlc1xuIgotCSAgICJbJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXhdIC4uLlxuIiwKLQkgICAoaW50KXBQYWNrZXQsIGxlbmd0aCwKLQkgICBwdHJbMF0scHRyWzFdLHB0clsyXSxwdHJbM10scHRyWzRdLHB0cls1XSwKLQkgICBwdHJbNl0scHRyWzddLHB0cls4XSxwdHJbOV0scHRyWzEwXSxwdHJbMTFdLHB0clsxMl0sCi0JICAgcHRyWzEzXSxwdHJbMTRdLHB0clsxNV0pOwotI2VuZGlmCi0gICAgcFVtRGV2aWNlLT50eF9wa3QgPSAwOwotICAgIFFRX1B1c2hIZWFkKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7Ci0KLSAgICAvKiBEb25lIHdpdGggc2VuZCAqLwotIG91dDoKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0KLS8qIEV0aGVybmV0IHJlY2VpdmUgKi8KLWludAotZXRoX3J4KHZvaWQpCi17Ci0gICAgUExNX1BBQ0tFVCAgICAgICAgICBwUGFja2V0ID0gTlVMTDsKLSAgICBQVU1fUEFDS0VUICAgICAgICAgIHBVbVBhY2tldCA9IE5VTEw7Ci0gICAgdm9pZCAqc2tiOwotICAgIGludCBzaXplPTA7Ci0KLSAgICB3aGlsZShUUlVFKSB7Ci0KLSAgICBiY201NzB4X3NlcnZpY2VfaXNyOgotCS8qIFB1bGwgZG93biBwYWNrZXQgaWYgaXQgaXMgdGhlcmUgKi8KLQlldGhfaXNyKCk7Ci0KLQkvKiBJbmRpY2F0ZSBSWCBwYWNrZXRzIGNhbGxlZCAqLwotCWlmKHBVbURldmljZS0+cnhfcGt0KXsKLQkgICAgLyogcHJpbnRmKCJldGhfcng6IGdvdCBhIHBhY2tldC4uLlxuIik7ICovCi0JICAgIHBVbURldmljZS0+cnhfcGt0ID0gMDsKLQl9IGVsc2UgewotCSAgICAvKiBwcmludGYoImV0aF9yeDogd2FpdGluZyBmb3IgcGFja2V0Li4uXG4iKTsgKi8KLQkgICAgZ290byBiY201NzB4X3NlcnZpY2VfaXNyOworCS8qIFByZXZpb3VzbHkgYmxvY2tlZCAqLworCWlmIChwVW1EZXZpY2UtPnR4X2Z1bGwpIHsKKwkJcHJpbnRmICgiZXRoJWQ6IHR4IGJsb2NrZWQuXG4iLCBwVW1EZXZpY2UtPmluZGV4KTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJcFBhY2tldCA9IChQTE1fUEFDS0VUKQotCSAgICBRUV9Qb3BIZWFkKCZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIpOworCSAgICBRUV9Qb3BIZWFkICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIpOwogCi0JaWYgKHBQYWNrZXQgPT0gMCl7Ci0JICAgIHByaW50ZigiZXRoX3J4OiBlbXB0eSBwYWNrZXQhXG4iKTsKLQkgICAgZ290byBiY201NzB4X3NlcnZpY2VfaXNyOworCWlmIChwUGFja2V0ID09IDApIHsKKwkJcFVtRGV2aWNlLT50eF9mdWxsID0gMTsKKwkJcHJpbnRmICgiYmNtNTcweEVuZFNlbmQ6IFRYIGZ1bGwhXG4iKTsKKwkJcmV0dXJuIDA7CiAJfQogCisJaWYgKHBEZXZpY2UtPlNlbmRCZExlZnQuY291bnRlciA9PSAwKSB7CisJCXBVbURldmljZS0+dHhfZnVsbCA9IDE7CisJCXByaW50ZiAoImJjbTU3MHhFbmRTZW5kOiBubyBtb3JlIFRYIGRlc2NyaXB0b3JzIVxuIik7CisJCVFRX1B1c2hIZWFkICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobGVuZ3RoIDw9IDApIHsKKwkJcHJpbnRmICgiZXRoOiBiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBsZW5ndGgpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBHZXQgcGFja2V0IGJ1ZmZlcnMgYW5kIGZyYWdtZW50IGxpc3QgKi8KIAlwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKLSNpZiBFVF9ERUJVRwotCXByaW50ZigiZXRoX3J4OiBwYWNrZXQgQDB4JXhcbiIsCi0JICAgICAgIChpbnQpcFBhY2tldCk7Ci0jZW5kaWYKLQkvKiBJZiB0aGUgcGFja2V0IGdlbmVyYXRlZCBhbiBlcnJvciwgcmV1c2UgYnVmZmVyICovCi0JaWYgKChwUGFja2V0LT5QYWNrZXRTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHx8Ci0JICAgICgoc2l6ZSA9IHBQYWNrZXQtPlBhY2tldFNpemUpID4gcERldmljZS0+UnhNdHUpKSB7Ci0KLQkgICAgLyogcmV1c2Ugc2tiICovCi0JICAgIFFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7Ci0JICAgIHByaW50ZigiZXRoX3J4OiBlcnJvciBpbiBwYWNrZXQgZG1hIVxuIik7Ci0JICAgIGdvdG8gYmNtNTcweF9zZXJ2aWNlX2lzcjsKKwkvKiBTaW5nbGUgRE1BIERlc2NyaXB0b3IgdHJhbnNtaXQuCisJICogRnJhZ21lbnRzIG1heSBiZSBwcm92aWRlZCwgYnV0IG9uZSBETUEgZGVzY3JpcHRvciBtYXggaXMKKwkgKiB1c2VkIHRvIHNlbmQgdGhlIHBhY2tldC4KKwkgKi8KKwlpZiAoTU1fQ29hbGVzY2VUeEJ1ZmZlciAocERldmljZSwgcFBhY2tldCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKHBVbVBhY2tldC0+c2tidWZmID09IE5VTEwpIHsKKwkJCS8qIFBhY2tldCB3YXMgZGlzY2FyZGVkICovCisJCQlwcmludGYgKCJUWDogZmFpbGVkICgxKVxuIik7CisJCQlzdGF0dXMgPSAxOworCQl9IGVsc2UgeworCQkJcHJpbnRmICgiVFg6IGZhaWxlZCAoMilcbiIpOworCQkJc3RhdHVzID0gMjsKKwkJfQorCQlRUV9QdXNoSGVhZCAoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAKLQkvKiBTZXQgc2l6ZSBhbmQgYWRkcmVzcyAqLwotCXNrYiA9IHBVbVBhY2tldC0+c2tidWZmOwotCXNpemUgPSBwUGFja2V0LT5QYWNrZXRTaXplOworCS8qIENvcHkgcGFja2V0IHRvIERNQSBidWZmZXIgKi8KKwltZW1zZXQgKHBVbVBhY2tldC0+c2tidWZmLCAweDAsIE1BWF9QQUNLRVRfU0laRSk7CisJbWVtY3B5ICgodm9pZCAqKXBVbVBhY2tldC0+c2tidWZmLCAodm9pZCAqKXBhY2tldCwgbGVuZ3RoKTsKKwlwUGFja2V0LT5QYWNrZXRTaXplID0gbGVuZ3RoOworCXBQYWNrZXQtPkZsYWdzIHw9IFNORF9CRF9GTEFHX0VORCB8IFNORF9CRF9GTEFHX0NPQUxfTk9XOworCXBQYWNrZXQtPnUuVHguRnJhZ0NvdW50ID0gMTsKKwkvKiBXZSd2ZSBhbHJlYWR5IHByb3ZpZGVkIGEgZnJhbWUgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiAqLworCXBQYWNrZXQtPkZsYWdzICY9IH5TTkRfQkRfRkxBR19UQ1BfVURQX0NLU1VNOwogCi0JLyogUGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZSBwcm90b2NvbAotCSAqIGxheWVycy4KLQkgKi8KLQlOZXRSZWNlaXZlKHNrYiwgc2l6ZSk7CisJaWYgKExNX1NlbmRQYWNrZXQgKHBEZXZpY2UsIHBQYWNrZXQpID09IExNX1NUQVRVU19GQUlMVVJFKSB7CisJCS8qCisJCSAqICBBIGxvd2VyIGxldmVsIHNlbmQgZmFpbHVyZSB3aWxsIHB1c2ggdGhlIHBhY2tldCBkZXNjcmlwdG9yIGJhY2sKKwkJICogIGluIHRoZSBmcmVlIHF1ZXVlLCBzbyBqdXN0IGRlYWwgd2l0aCB0aGUgVnhXb3JrcyBjbHVzdGVycy4KKwkJICovCisJCWlmIChwVW1QYWNrZXQtPnNrYnVmZiA9PSBOVUxMKSB7CisJCQlwcmludGYgKCJUWCBmYWlsZWQgKDEpIVxuIik7CisJCQkvKiBQYWNrZXQgd2FzIGRpc2NhcmRlZCAqLworCQkJc3RhdHVzID0gMzsKKwkJfSBlbHNlIHsKKwkJCS8qIEEgcmVzb3VyY2UgcHJvYmxlbSAuLi4gKi8KKwkJCXByaW50ZiAoIlRYIGZhaWxlZCAoMikhXG4iKTsKKwkJCXN0YXR1cyA9IDQ7CisJCX0KIAotCS8qIEZyZWUgcGFja2V0IGJ1ZmZlciAqLwotCWJjbTU3MHhQa3RGcmVlIChwVW1EZXZpY2UtPmluZGV4LCBza2IpOwotCXBVbVBhY2tldC0+c2tidWZmID0gTlVMTDsKKwkJaWYgKFFRX0dldEVudHJ5Q250ICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIpID09IDApIHsKKwkJCXByaW50ZiAoIlRYOiBlbXB0eVEhXG4iKTsKKwkJCXBVbURldmljZS0+dHhfZnVsbCA9IDE7CisJCX0KKwl9CiAKLQkvKiBSZXVzZSBTS0IgKi8KLQlRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCXdoaWxlIChwVW1EZXZpY2UtPnR4X3BrdCA9PSAwKSB7CisJCS8qIFNlcnZpY2UgVFggKi8KKwkJZXRoX2lzciAoKTsKKwl9CisjaWYgRVRfREVCVUcKKwlwcmludGYgKCJldGhfc2VuZDogMHgleCwgJWQgYnl0ZXNcbiIKKwkJIlsleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleF0gLi4uXG4iLAorCQkoaW50KXBQYWNrZXQsIGxlbmd0aCwKKwkJcHRyWzBdLCBwdHJbMV0sIHB0clsyXSwgcHRyWzNdLCBwdHJbNF0sIHB0cls1XSwKKwkJcHRyWzZdLCBwdHJbN10sIHB0cls4XSwgcHRyWzldLCBwdHJbMTBdLCBwdHJbMTFdLCBwdHJbMTJdLAorCQlwdHJbMTNdLCBwdHJbMTRdLCBwdHJbMTVdKTsKKyNlbmRpZgorCXBVbURldmljZS0+dHhfcGt0ID0gMDsKKwlRUV9QdXNoSGVhZCAoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotCXJldHVybiAwOyAvKiBHb3QgYSBwYWNrZXQsIGJhaWwgLi4uICovCi0gICAgfQotICAgIHJldHVybiBzaXplOworCS8qIERvbmUgd2l0aCBzZW5kICovCisgICAgICBvdXQ6CisJcmV0dXJuIHN0YXR1czsKIH0KIAorLyogRXRoZXJuZXQgcmVjZWl2ZSAqLworaW50IGV0aF9yeCAodm9pZCkKK3sKKwlQTE1fUEFDS0VUIHBQYWNrZXQgPSBOVUxMOworCVBVTV9QQUNLRVQgcFVtUGFja2V0ID0gTlVMTDsKKwl2b2lkICpza2I7CisJaW50IHNpemUgPSAwOworCisJd2hpbGUgKFRSVUUpIHsKKworCSAgICAgIGJjbTU3MHhfc2VydmljZV9pc3I6CisJCS8qIFB1bGwgZG93biBwYWNrZXQgaWYgaXQgaXMgdGhlcmUgKi8KKwkJZXRoX2lzciAoKTsKKworCQkvKiBJbmRpY2F0ZSBSWCBwYWNrZXRzIGNhbGxlZCAqLworCQlpZiAocFVtRGV2aWNlLT5yeF9wa3QpIHsKKwkJCS8qIHByaW50ZigiZXRoX3J4OiBnb3QgYSBwYWNrZXQuLi5cbiIpOyAqLworCQkJcFVtRGV2aWNlLT5yeF9wa3QgPSAwOworCQl9IGVsc2UgeworCQkJLyogcHJpbnRmKCJldGhfcng6IHdhaXRpbmcgZm9yIHBhY2tldC4uLlxuIik7ICovCisJCQlnb3RvIGJjbTU3MHhfc2VydmljZV9pc3I7CisJCX0KKworCQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpCisJCSAgICBRUV9Qb3BIZWFkICgmcERldmljZS0+UnhQYWNrZXRSZWNlaXZlZFEuQ29udGFpbmVyKTsKKworCQlpZiAocFBhY2tldCA9PSAwKSB7CisJCQlwcmludGYgKCJldGhfcng6IGVtcHR5IHBhY2tldCFcbiIpOworCQkJZ290byBiY201NzB4X3NlcnZpY2VfaXNyOworCQl9CisKKwkJcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisjaWYgRVRfREVCVUcKKwkJcHJpbnRmICgiZXRoX3J4OiBwYWNrZXQgQDB4JXhcbiIsIChpbnQpcFBhY2tldCk7CisjZW5kaWYKKwkJLyogSWYgdGhlIHBhY2tldCBnZW5lcmF0ZWQgYW4gZXJyb3IsIHJldXNlIGJ1ZmZlciAqLworCQlpZiAoKHBQYWNrZXQtPlBhY2tldFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgfHwKKwkJICAgICgoc2l6ZSA9IHBQYWNrZXQtPlBhY2tldFNpemUpID4gcERldmljZS0+UnhNdHUpKSB7CisKKwkJCS8qIHJldXNlIHNrYiAqLworCQkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwKKwkJCQkgICAgIHBQYWNrZXQpOworCQkJcHJpbnRmICgiZXRoX3J4OiBlcnJvciBpbiBwYWNrZXQgZG1hIVxuIik7CisJCQlnb3RvIGJjbTU3MHhfc2VydmljZV9pc3I7CisJCX0KKworCQkvKiBTZXQgc2l6ZSBhbmQgYWRkcmVzcyAqLworCQlza2IgPSBwVW1QYWNrZXQtPnNrYnVmZjsKKwkJc2l6ZSA9IHBQYWNrZXQtPlBhY2tldFNpemU7CisKKwkJLyogUGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZSBwcm90b2NvbAorCQkgKiBsYXllcnMuCisJCSAqLworCQlOZXRSZWNlaXZlIChza2IsIHNpemUpOworCisJCS8qIEZyZWUgcGFja2V0IGJ1ZmZlciAqLworCQliY201NzB4UGt0RnJlZSAocFVtRGV2aWNlLT5pbmRleCwgc2tiKTsKKwkJcFVtUGFja2V0LT5za2J1ZmYgPSBOVUxMOworCisJCS8qIFJldXNlIFNLQiAqLworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKworCQlyZXR1cm4gMDsJLyogR290IGEgcGFja2V0LCBiYWlsIC4uLiAqLworCX0KKwlyZXR1cm4gc2l6ZTsKK30KIAogLyogU2h1dCBkb3duIGRldmljZSAqLwotdm9pZAotZXRoX2hhbHQodm9pZCkKK3ZvaWQgZXRoX2hhbHQgKHZvaWQpCiB7Ci0gICAgaW50IGk7Ci0gICAgaWYgKCBpbml0aWFsaXplZCkKLSAgICBpZiAocERldmljZSAmJiBwVW1EZXZpY2UgJiYgcFVtRGV2aWNlLT5vcGVuZWQpewotCXByaW50ZigiXG5ldGglZDolcywiLCBwVW1EZXZpY2UtPmluZGV4LCBwVW1EZXZpY2UtPm5hbWUpOwotCXByaW50ZigiSEFMVCwiKTsKLQkvKiBzdG9wIGRldmljZSAqLwotCUxNX0hhbHQocERldmljZSk7Ci0JcHJpbnRmKCJQT1dFUiBET1dOLCIpOwotCUxNX1NldFBvd2VyU3RhdGUocERldmljZSwgTE1fUE9XRVJfU1RBVEVfRDMpOworCWludCBpOworCWlmIChpbml0aWFsaXplZCkKKwkJaWYgKHBEZXZpY2UgJiYgcFVtRGV2aWNlICYmIHBVbURldmljZS0+b3BlbmVkKSB7CisJCQlwcmludGYgKCJcbmV0aCVkOiVzLCIsIHBVbURldmljZS0+aW5kZXgsCisJCQkJcFVtRGV2aWNlLT5uYW1lKTsKKwkJCXByaW50ZiAoIkhBTFQsIik7CisJCQkvKiBzdG9wIGRldmljZSAqLworCQkJTE1fSGFsdCAocERldmljZSk7CisJCQlwcmludGYgKCJQT1dFUiBET1dOLCIpOworCQkJTE1fU2V0UG93ZXJTdGF0ZSAocERldmljZSwgTE1fUE9XRVJfU1RBVEVfRDMpOwogCi0JLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgZGV2aWNlIGluIHRpZ29uMyAqLwotCWZvciAoaSA9IDA7IGkgPCBwVW1EZXZpY2UtPm1lbV9saXN0X251bTsgaSsrKSAgewotCSAgICBpZiAocFVtRGV2aWNlLT5tZW1fbGlzdFtpXSkgIHsKLQkJLyogc2FuaXR5IGNoZWNrICovCi0JCWlmIChwVW1EZXZpY2UtPmRtYV9saXN0W2ldKSB7ICAvKiBjYWNoZS1zYWZlIG1lbW9yeSAqLwotCQkgICAgZnJlZShwVW1EZXZpY2UtPm1lbV9saXN0W2ldKTsKLQkJfSBlbHNlIHsKLQkJICAgIGZyZWUocFVtRGV2aWNlLT5tZW1fbGlzdFtpXSk7ICAvKiBub3JtYWwgbWVtb3J5ICAgKi8KKwkJCS8qIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGRldmljZSBpbiB0aWdvbjMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBwVW1EZXZpY2UtPm1lbV9saXN0X251bTsgaSsrKSB7CisJCQkJaWYgKHBVbURldmljZS0+bWVtX2xpc3RbaV0pIHsKKwkJCQkJLyogc2FuaXR5IGNoZWNrICovCisJCQkJCWlmIChwVW1EZXZpY2UtPmRtYV9saXN0W2ldKSB7CS8qIGNhY2hlLXNhZmUgbWVtb3J5ICovCisJCQkJCQlmcmVlIChwVW1EZXZpY2UtPm1lbV9saXN0W2ldKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZyZWUgKHBVbURldmljZS0+bWVtX2xpc3RbaV0pOwkvKiBub3JtYWwgbWVtb3J5ICAgKi8KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXBVbURldmljZS0+b3BlbmVkID0gMDsKKwkJCWZyZWUgKHBEZXZpY2UpOworCQkJcERldmljZSA9IE5VTEw7CisJCQlwVW1EZXZpY2UgPSBOVUxMOworCQkJaW5pdGlhbGl6ZWQgPSAwOworCQkJcHJpbnRmICgiZG9uZSAtIG9mZmxpbmUuXG4iKTsKIAkJfQotCSAgICB9Ci0JfQotCXBVbURldmljZS0+b3BlbmVkID0gMDsKLQlmcmVlKHBEZXZpY2UpOwotCXBEZXZpY2UgPSBOVUxMOwotCXBVbURldmljZSA9IE5VTEw7Ci0JaW5pdGlhbGl6ZWQgPSAwOwotCXByaW50ZigiZG9uZSAtIG9mZmxpbmUuXG4iKTsKLSAgICB9CiB9CiAKLQogLyoKICAqCiAgKiBNaWRkbGUgTW9kdWxlOiBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgSFcgZHJpdmVyICh0aWdvbjMgbW9kdWxlcykgYW5kCkBAIC04NDMsNDA5ICs4MzQsMzgwIEBACiAgKi8KIAogLyogTWlkZGxlIG1vZHVsZSBkZXBlbmRlbmN5IC0gc2l6ZSBvZiBhIHBhY2tldCBkZXNjcmlwdG9yICovCi1pbnQgTU1fUGFja2V0X0Rlc2NfU2l6ZSA9IHNpemVvZihVTV9QQUNLRVQpOwotCitpbnQgTU1fUGFja2V0X0Rlc2NfU2l6ZSA9IHNpemVvZiAoVU1fUEFDS0VUKTsKIAogTE1fU1RBVFVTCi1NTV9SZWFkQ29uZmlnMzIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotCQlMTV9VSU5UMzIgT2Zmc2V0LAotCQlMTV9VSU5UMzIgKnBWYWx1ZTMyKQorTU1fUmVhZENvbmZpZzMyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCSBMTV9VSU5UMzIgT2Zmc2V0LCBMTV9VSU5UMzIgKiBwVmFsdWUzMikKIHsKLSAgICBVTV9ERVZJQ0VfQkxPQ0sgKnBVbURldmljZTsKLSAgICBwVW1EZXZpY2UgPSAoVU1fREVWSUNFX0JMT0NLICopIHBEZXZpY2U7Ci0gICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBVbURldmljZS0+cGRldiwKLQkJCSAgT2Zmc2V0LCAodTMyICopIHBWYWx1ZTMyKTsKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotTE1fU1RBVFVTCi1NTV9Xcml0ZUNvbmZpZzMyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLQkJIExNX1VJTlQzMiBPZmZzZXQsCi0JCSBMTV9VSU5UMzIgVmFsdWUzMikKLXsKLSAgICBVTV9ERVZJQ0VfQkxPQ0sgKnBVbURldmljZTsKLSAgICBwVW1EZXZpY2UgPSAoVU1fREVWSUNFX0JMT0NLICopIHBEZXZpY2U7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwVW1EZXZpY2UtPnBkZXYsCi0JCQkgICBPZmZzZXQsIFZhbHVlMzIpOwotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1MTV9TVEFUVVMKLU1NX1JlYWRDb25maWcxNihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0JCUxNX1VJTlQzMiBPZmZzZXQsCi0JCUxNX1VJTlQxNiAqcFZhbHVlMTYpCi17Ci0gICAgVU1fREVWSUNFX0JMT0NLICpwVW1EZXZpY2U7Ci0gICAgcFVtRGV2aWNlID0gKFVNX0RFVklDRV9CTE9DSyAqKSBwRGV2aWNlOwotICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBVbURldmljZS0+cGRldiwKLQkJCSBPZmZzZXQsICh1MTYqKSBwVmFsdWUxNik7Ci0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCVVNX0RFVklDRV9CTE9DSyAqcFVtRGV2aWNlOworCXBVbURldmljZSA9IChVTV9ERVZJQ0VfQkxPQ0sgKikgcERldmljZTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKHBVbURldmljZS0+cGRldiwgT2Zmc2V0LCAodTMyICopIHBWYWx1ZTMyKTsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIExNX1NUQVRVUwotTU1fV3JpdGVDb25maWcxNihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0JCSBMTV9VSU5UMzIgT2Zmc2V0LAotCQkgTE1fVUlOVDE2IFZhbHVlMTYpCitNTV9Xcml0ZUNvbmZpZzMyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsIExNX1VJTlQzMiBWYWx1ZTMyKQogewotICAgIFVNX0RFVklDRV9CTE9DSyAqcFVtRGV2aWNlOwotICAgIHBVbURldmljZSA9IChVTV9ERVZJQ0VfQkxPQ0sgKikgcERldmljZTsKLSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQocFVtRGV2aWNlLT5wZGV2LAotCQkJICBPZmZzZXQsIFZhbHVlMTYpOwotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1MTV9TVEFUVVMKLU1NX0FsbG9jYXRlU2hhcmVkTWVtb3J5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsb2NrU2l6ZSwKLQkJCVBMTV9WT0lEICpwTWVtb3J5QmxvY2tWaXJ0LAotCQkJUExNX1BIWVNJQ0FMX0FERFJFU1MgcE1lbW9yeUJsb2NrUGh5LAotCQkJTE1fQk9PTCBDYWNoZWQpCi17Ci0gICAgUExNX1ZPSUQgcHZpcnQ7Ci0gICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKLSAgICBkbWFfYWRkcl90IG1hcHBpbmc7Ci0KLSAgICBwdmlydCA9IG1hbGxvYyhCbG9ja1NpemUpOwotICAgIG1hcHBpbmcgPSAoZG1hX2FkZHJfdCkocHZpcnQpOwotICAgIGlmICghcHZpcnQpCi0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotCi0gICAgcFVtRGV2aWNlLT5tZW1fbGlzdFtwVW1EZXZpY2UtPm1lbV9saXN0X251bV0gPSBwdmlydDsKLSAgICBwVW1EZXZpY2UtPmRtYV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtXSA9IG1hcHBpbmc7Ci0gICAgcFVtRGV2aWNlLT5tZW1fc2l6ZV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtKytdID0gQmxvY2tTaXplOwotICAgIG1lbXNldChwdmlydCwgMCwgQmxvY2tTaXplKTsKLQotICAgICpwTWVtb3J5QmxvY2tWaXJ0ID0gKFBMTV9WT0lEKSBwdmlydDsKLSAgICBNTV9TZXRBZGRyIChwTWVtb3J5QmxvY2tQaHksIChkbWFfYWRkcl90KSBtYXBwaW5nKTsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1MTV9TVEFUVVMKLU1NX0FsbG9jYXRlTWVtb3J5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsb2NrU2l6ZSwKLQlQTE1fVk9JRCAqcE1lbW9yeUJsb2NrVmlydCkKLXsKLSAgICBQTE1fVk9JRCBwdmlydDsKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotCi0gICAgcHZpcnQgPSBtYWxsb2MoQmxvY2tTaXplKTsKLQotICAgIGlmICghcHZpcnQpCi0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotCi0gICAgcFVtRGV2aWNlLT5tZW1fbGlzdFtwVW1EZXZpY2UtPm1lbV9saXN0X251bV0gPSBwdmlydDsKLSAgICBwVW1EZXZpY2UtPmRtYV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtXSA9IDA7Ci0gICAgcFVtRGV2aWNlLT5tZW1fc2l6ZV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtKytdID0gQmxvY2tTaXplOwotICAgIG1lbXNldChwdmlydCwgMCwgQmxvY2tTaXplKTsKLSAgICAqcE1lbW9yeUJsb2NrVmlydCA9IHB2aXJ0OwotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCVVNX0RFVklDRV9CTE9DSyAqcFVtRGV2aWNlOworCXBVbURldmljZSA9IChVTV9ERVZJQ0VfQkxPQ0sgKikgcERldmljZTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChwVW1EZXZpY2UtPnBkZXYsIE9mZnNldCwgVmFsdWUzMik7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCiBMTV9TVEFUVVMKLU1NX01hcE1lbUJhc2UoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTU1fUmVhZENvbmZpZzE2IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCSBMTV9VSU5UMzIgT2Zmc2V0LCBMTV9VSU5UMTYgKiBwVmFsdWUxNikKIHsKLSAgICBwcmludGYoIkJDTTU3MHggUENJIE1lbW9yeSBiYXNlIGFkZHJlc3MgQDB4JXhcbiIsCi0JICAgKHVuc2lnbmVkIGludClwRGV2aWNlLT5wTWFwcGVkTWVtQmFzZSk7Ci0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCVVNX0RFVklDRV9CTE9DSyAqcFVtRGV2aWNlOworCXBVbURldmljZSA9IChVTV9ERVZJQ0VfQkxPQ0sgKikgcERldmljZTsKKwlwY2lfcmVhZF9jb25maWdfd29yZCAocFVtRGV2aWNlLT5wZGV2LCBPZmZzZXQsICh1MTYgKikgcFZhbHVlMTYpOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAogTE1fU1RBVFVTCi1NTV9Jbml0aWFsaXplVW1QYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK01NX1dyaXRlQ29uZmlnMTYgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwgTE1fVUlOVDE2IFZhbHVlMTYpCiB7Ci0gICAgaW50IGk7Ci0gICAgdm9pZCogc2tiOwotICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7Ci0gICAgUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSBOVUxMOwotICAgIFBMTV9QQUNLRVQgcFBhY2tldCA9IE5VTEw7CisJVU1fREVWSUNFX0JMT0NLICpwVW1EZXZpY2U7CisJcFVtRGV2aWNlID0gKFVNX0RFVklDRV9CTE9DSyAqKSBwRGV2aWNlOworCXBjaV93cml0ZV9jb25maWdfd29yZCAocFVtRGV2aWNlLT5wZGV2LCBPZmZzZXQsIFZhbHVlMTYpOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KIAotICAgIGZvciAoaSA9IDA7IGkgPCBwRGV2aWNlLT5SeFBhY2tldERlc2NDbnQ7IGkrKykgewotCXBQYWNrZXQgPSBRUV9Qb3BIZWFkKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7Ci0JcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CitMTV9TVEFUVVMKK01NX0FsbG9jYXRlU2hhcmVkTWVtb3J5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbG9ja1NpemUsCisJCQkgUExNX1ZPSUQgKiBwTWVtb3J5QmxvY2tWaXJ0LAorCQkJIFBMTV9QSFlTSUNBTF9BRERSRVNTIHBNZW1vcnlCbG9ja1BoeSwgTE1fQk9PTCBDYWNoZWQpCit7CisJUExNX1ZPSUQgcHZpcnQ7CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CiAKLQlpZiAocFBhY2tldCA9PSAwKSB7Ci0JICAgIHByaW50ZigiTU1fSW5pdGlhbGl6ZVVtUGFja2V0czogQmFkIFJ4UGFja2V0RnJlZVFcbiIpOworCXB2aXJ0ID0gbWFsbG9jIChCbG9ja1NpemUpOworCW1hcHBpbmcgPSAoZG1hX2FkZHJfdCkgKHB2aXJ0KTsKKwlpZiAoIXB2aXJ0KQorCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisKKwlwVW1EZXZpY2UtPm1lbV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtXSA9IHB2aXJ0OworCXBVbURldmljZS0+ZG1hX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW1dID0gbWFwcGluZzsKKwlwVW1EZXZpY2UtPm1lbV9zaXplX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW0rK10gPSBCbG9ja1NpemU7CisJbWVtc2V0IChwdmlydCwgMCwgQmxvY2tTaXplKTsKKworCSpwTWVtb3J5QmxvY2tWaXJ0ID0gKFBMTV9WT0lEKSBwdmlydDsKKwlNTV9TZXRBZGRyIChwTWVtb3J5QmxvY2tQaHksIChkbWFfYWRkcl90KSBtYXBwaW5nKTsKKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworTE1fU1RBVFVTCitNTV9BbGxvY2F0ZU1lbW9yeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxvY2tTaXplLAorCQkgICBQTE1fVk9JRCAqIHBNZW1vcnlCbG9ja1ZpcnQpCit7CisJUExNX1ZPSUQgcHZpcnQ7CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKworCXB2aXJ0ID0gbWFsbG9jIChCbG9ja1NpemUpOworCisJaWYgKCFwdmlydCkKKwkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCisJcFVtRGV2aWNlLT5tZW1fbGlzdFtwVW1EZXZpY2UtPm1lbV9saXN0X251bV0gPSBwdmlydDsKKwlwVW1EZXZpY2UtPmRtYV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtXSA9IDA7CisJcFVtRGV2aWNlLT5tZW1fc2l6ZV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtKytdID0gQmxvY2tTaXplOworCW1lbXNldCAocHZpcnQsIDAsIEJsb2NrU2l6ZSk7CisJKnBNZW1vcnlCbG9ja1ZpcnQgPSBwdmlydDsKKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworTE1fU1RBVFVTIE1NX01hcE1lbUJhc2UgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKwlwcmludGYgKCJCQ001NzB4IFBDSSBNZW1vcnkgYmFzZSBhZGRyZXNzIEAweCV4XG4iLAorCQkodW5zaWduZWQgaW50KXBEZXZpY2UtPnBNYXBwZWRNZW1CYXNlKTsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0xNX1NUQVRVUyBNTV9Jbml0aWFsaXplVW1QYWNrZXRzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisJaW50IGk7CisJdm9pZCAqc2tiOworCVBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSBOVUxMOworCVBMTV9QQUNLRVQgcFBhY2tldCA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcERldmljZS0+UnhQYWNrZXREZXNjQ250OyBpKyspIHsKKwkJcFBhY2tldCA9IFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7CisJCXBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OworCisJCWlmIChwUGFja2V0ID09IDApIHsKKwkJCXByaW50ZiAoIk1NX0luaXRpYWxpemVVbVBhY2tldHM6IEJhZCBSeFBhY2tldEZyZWVRXG4iKTsKKwkJfQorCisJCXNrYiA9IGJjbTU3MHhQa3RBbGxvYyAocFVtRGV2aWNlLT5pbmRleCwKKwkJCQkgICAgICAgcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclNpemUgKyAyKTsKKworCQlpZiAoc2tiID09IDApIHsKKwkJCXBVbVBhY2tldC0+c2tidWZmID0gMDsKKwkJCVFRX1B1c2hUYWlsICgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyLAorCQkJCSAgICAgcFBhY2tldCk7CisJCQlwcmludGYgKCJNTV9Jbml0aWFsaXplVW1QYWNrZXRzOiBvdXQgb2YgYnVmZmVyLlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBVbVBhY2tldC0+c2tidWZmID0gc2tiOworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAl9CiAKLQlza2IgPSBiY201NzB4UGt0QWxsb2MocFVtRGV2aWNlLT5pbmRleCwKLQkJCSAgICAgIHBQYWNrZXQtPnUuUnguUnhCdWZmZXJTaXplICsgMik7CisJcFVtRGV2aWNlLT5yeF9sb3dfYnVmX3RocmVzaCA9IHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudCAvIDg7CiAKLQlpZiAoc2tiID09IDApIHsKLQkgICAgcFVtUGFja2V0LT5za2J1ZmYgPSAwOwotCSAgICBRUV9QdXNoVGFpbCgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyLCBwUGFja2V0KTsKLQkgICAgcHJpbnRmKCJNTV9Jbml0aWFsaXplVW1QYWNrZXRzOiBvdXQgb2YgYnVmZmVyLlxuIik7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCXBVbVBhY2tldC0+c2tidWZmID0gc2tiOwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7Ci0gICAgfQotCi0gICAgcFVtRGV2aWNlLT5yeF9sb3dfYnVmX3RocmVzaCA9IHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudCAvIDg7Ci0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCi1MTV9TVEFUVVMKLU1NX0dldENvbmZpZyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTU1fR2V0Q29uZmlnIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKLSAgICBpbnQgaW5kZXggPSBwRGV2aWNlLT5pbmRleDsKKwlQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworCWludCBpbmRleCA9IHBEZXZpY2UtPmluZGV4OwogCi0gICAgaWYgKGF1dG9fc3BlZWRbaW5kZXhdID09IDApCi0JcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBUUlVFOwotICAgIGVsc2UKLQlwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOwotCi0gICAgaWYgKGxpbmVfc3BlZWRbaW5kZXhdID09IDApIHsKLQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQotCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPOwotCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UgewotCWlmIChsaW5lX3NwZWVkW2luZGV4XSA9PSAxMDAwKSB7Ci0JICAgIGlmIChwRGV2aWNlLT5FbmFibGVUYmkpIHsKLQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KLQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0ZJQkVSXzEwMDBNQlBTX0ZVTExfRFVQTEVYOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGZ1bGxfZHVwbGV4W2luZGV4XSkgewotCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQotCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwMDBNQlBTX0ZVTExfRFVQTEVYOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQotCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwMDBNQlBTOwotCSAgICB9Ci0JICAgIGlmICghcERldmljZS0+RW5hYmxlVGJpKQorCWlmIChhdXRvX3NwZWVkW2luZGV4XSA9PSAwKQorCQlwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IFRSVUU7CisJZWxzZQogCQlwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOworCisJaWYgKGxpbmVfc3BlZWRbaW5kZXhdID09IDApIHsKKwkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTzsKKwkJcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKKwl9IGVsc2UgeworCQlpZiAobGluZV9zcGVlZFtpbmRleF0gPT0gMTAwMCkgeworCQkJaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkgeworCQkJCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9CisJCQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0ZJQkVSXzEwMDBNQlBTX0ZVTExfRFVQTEVYOworCQkJfSBlbHNlIGlmIChmdWxsX2R1cGxleFtpbmRleF0pIHsKKwkJCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQorCQkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwME1CUFNfRlVMTF9EVVBMRVg7CisJCQl9IGVsc2UgeworCQkJCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9CisJCQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDAwTUJQUzsKKwkJCX0KKwkJCWlmICghcERldmljZS0+RW5hYmxlVGJpKQorCQkJCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7CisJCX0gZWxzZSBpZiAobGluZV9zcGVlZFtpbmRleF0gPT0gMTAwKSB7CisJCQlpZiAoZnVsbF9kdXBsZXhbaW5kZXhdKSB7CisJCQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwME1CUFNfRlVMTF9EVVBMRVg7CisJCQl9IGVsc2UgeworCQkJCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9CisJCQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDBNQlBTOworCQkJfQorCQl9IGVsc2UgaWYgKGxpbmVfc3BlZWRbaW5kZXhdID09IDEwKSB7CisJCQlpZiAoZnVsbF9kdXBsZXhbaW5kZXhdKSB7CisJCQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQU19GVUxMX0RVUExFWDsKKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQUzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9CisJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTzsKKwkJCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7CisJCX0KKwogCX0KLQllbHNlIGlmIChsaW5lX3NwZWVkW2luZGV4XSA9PSAxMDApIHsKLQkgICAgaWYgKGZ1bGxfZHVwbGV4W2luZGV4XSkgewotCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQotCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwME1CUFNfRlVMTF9EVVBMRVg7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9Ci0JCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwTUJQUzsKLQkgICAgfQorCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID0gMDsKKwlpZiAocnhfZmxvd19jb250cm9sW2luZGV4XSAhPSAwKSB7CisJCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwIHw9IExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOwogCX0KLQllbHNlIGlmIChsaW5lX3NwZWVkW2luZGV4XSA9PSAxMCkgewotCSAgICBpZiAoZnVsbF9kdXBsZXhbaW5kZXhdKSB7Ci0JCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9Ci0JCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTX0ZVTExfRFVQTEVYOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQotCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQUzsKLQkgICAgfQorCWlmICh0eF9mbG93X2NvbnRyb2xbaW5kZXhdICE9IDApIHsKKwkJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0gTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFOwogCX0KLQllbHNlIHsKLQkgICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KLQkJTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTzsKLQkgICAgcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKKwlpZiAoKGF1dG9fZmxvd19jb250cm9sW2luZGV4XSAhPSAwKSAmJgorCSAgICAocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UpKSB7CisKKwkJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7CisJCWlmICgodHhfZmxvd19jb250cm9sW2luZGV4XSA9PSAwKSAmJgorCQkgICAgKHJ4X2Zsb3dfY29udHJvbFtpbmRleF0gPT0gMCkpIHsKKwkJCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwIHw9CisJCQkgICAgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFIHwKKwkJCSAgICBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKKwkJfQogCX0KIAotICAgIH0KLSAgICBwRGV2aWNlLT5GbG93Q29udHJvbENhcCA9IDA7Ci0gICAgaWYgKHJ4X2Zsb3dfY29udHJvbFtpbmRleF0gIT0gMCkgewotCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwIHw9IExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOwotICAgIH0KLSAgICBpZiAodHhfZmxvd19jb250cm9sW2luZGV4XSAhPSAwKSB7Ci0JcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0gTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFOwotICAgIH0KLSAgICBpZiAoKGF1dG9fZmxvd19jb250cm9sW2luZGV4XSAhPSAwKSAmJgotCShwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9PSBGQUxTRSkpIHsKLQotCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwIHw9IExNX0ZMT1dfQ09OVFJPTF9BVVRPX1BBVVNFOwotCWlmICgodHhfZmxvd19jb250cm9sW2luZGV4XSA9PSAwKSAmJgotCSAgICAocnhfZmxvd19jb250cm9sW2luZGV4XSA9PSAwKSkgewotCSAgICBwRGV2aWNlLT5GbG93Q29udHJvbENhcCB8PQotCQlMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UgfAotCQlMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKLQl9Ci0gICAgfQotCi0gICAgLyogRGVmYXVsdCBNVFUgZm9yIG5vdyAqLwotICAgIHBVbURldmljZS0+bXR1ID0gMTUwMDsKKwkvKiBEZWZhdWx0IE1UVSBmb3Igbm93ICovCisJcFVtRGV2aWNlLT5tdHUgPSAxNTAwOwogCiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIGlmIChwVW1EZXZpY2UtPm10dSA+IDE1MDApIHsKLQlwRGV2aWNlLT5SeE10dSA9IHBVbURldmljZS0+bXR1OwotCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gREVGQVVMVF9KVU1CT19SQ1ZfREVTQ19DT1VOVDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSAwOwotICAgIH0KLSAgICBwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCA9IHJ4X2p1bWJvX2Rlc2NfY250W2luZGV4XTsKKwlpZiAocFVtRGV2aWNlLT5tdHUgPiAxNTAwKSB7CisJCXBEZXZpY2UtPlJ4TXR1ID0gcFVtRGV2aWNlLT5tdHU7CisJCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gREVGQVVMVF9KVU1CT19SQ1ZfREVTQ19DT1VOVDsKKwl9IGVsc2UgeworCQlwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCA9IDA7CisJfQorCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gcnhfanVtYm9fZGVzY19jbnRbaW5kZXhdOwogI2Vsc2UKLSAgICBwRGV2aWNlLT5SeE10dSA9IHBVbURldmljZS0+bXR1OworCXBEZXZpY2UtPlJ4TXR1ID0gcFVtRGV2aWNlLT5tdHU7CiAjZW5kaWYKIAotICAgIGlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKLQlwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMgPSBUUlVFOwotCXBVbURldmljZS0+dGltZXJfaW50ZXJ2YWwgPSBDRkdfSFo7Ci0gICAgfQotICAgIGVsc2UgewotCXBVbURldmljZS0+dGltZXJfaW50ZXJ2YWwgPSBDRkdfSFovNTA7Ci0gICAgfQotCi0gICAgcERldmljZS0+VHhQYWNrZXREZXNjQ250ID0gdHhfcGt0X2Rlc2NfY250W2luZGV4XTsKLSAgICBwRGV2aWNlLT5SeFN0ZERlc2NDbnQgPSByeF9zdGRfZGVzY19jbnRbaW5kZXhdOwotICAgIC8qIE5vdGU6ICBhZGFwdGl2ZSBjb2FsZXNjZW5jZSByZWFsbHkgaXNuJ3QgYWRhcHRpdmUgaW4gdGhpcyBkcml2ZXIgKi8KLSAgICBwVW1EZXZpY2UtPnJ4X2FkYXB0aXZlX2NvYWxlc2NlID0gcnhfYWRhcHRpdmVfY29hbGVzY2VbaW5kZXhdOwotICAgIGlmICghcFVtRGV2aWNlLT5yeF9hZGFwdGl2ZV9jb2FsZXNjZSkgewotCXBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID0gcnhfY29hbGVzY2VfdGlja3NbaW5kZXhdOwotCWlmIChwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrcyA+IE1BWF9SWF9DT0FMRVNDSU5HX1RJQ0tTKQotCSAgICBwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrcyA9IE1BWF9SWF9DT0FMRVNDSU5HX1RJQ0tTOwotCXBVbURldmljZS0+cnhfY3Vycl9jb2FsZXNjZV90aWNrcyA9cERldmljZS0+UnhDb2FsZXNjaW5nVGlja3M7Ci0KLQlwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lcyA9IHJ4X21heF9jb2FsZXNjZV9mcmFtZXNbaW5kZXhdOwotCWlmIChwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lcz5NQVhfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVMpCi0JICAgIHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzID0KLQkJCQlNQVhfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVM7Ci0JcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX2ZyYW1lcyA9Ci0JICAgIHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzOwotCXBEZXZpY2UtPlN0YXRzQ29hbGVzY2luZ1RpY2tzID0gc3RhdHNfY29hbGVzY2VfdGlja3NbaW5kZXhdOwotCWlmIChwRGV2aWNlLT5TdGF0c0NvYWxlc2NpbmdUaWNrcz5NQVhfU1RBVFNfQ09BTEVTQ0lOR19USUNLUykKLQkgICAgcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3M9Ci0JCU1BWF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTOwotCX0KLQllbHNlIHsKLQkgICAgcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX2ZyYW1lcyA9Ci0JCURFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVM7Ci0JICAgIHBVbURldmljZS0+cnhfY3Vycl9jb2FsZXNjZV90aWNrcyA9Ci0JCURFRkFVTFRfUlhfQ09BTEVTQ0lOR19USUNLUzsKLQl9Ci0gICAgcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3MgPSB0eF9jb2FsZXNjZV90aWNrc1tpbmRleF07Ci0gICAgaWYgKHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzID4gTUFYX1RYX0NPQUxFU0NJTkdfVElDS1MpCi0JcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3MgPSBNQVhfVFhfQ09BTEVTQ0lOR19USUNLUzsKLSAgICBwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lcyA9IHR4X21heF9jb2FsZXNjZV9mcmFtZXNbaW5kZXhdOwotICAgIGlmIChwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lcyA+IE1BWF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUykKLQlwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lcyA9IE1BWF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKLQotICAgIGlmIChlbmFibGVfd29sW2luZGV4XSkgewotCXBEZXZpY2UtPldha2VVcE1vZGVDYXAgPSBMTV9XQUtFX1VQX01PREVfTUFHSUNfUEFDS0VUOwotCXBEZXZpY2UtPldha2VVcE1vZGUgPSBMTV9XQUtFX1VQX01PREVfTUFHSUNfUEFDS0VUOwotICAgIH0KLSAgICBwRGV2aWNlLT5OaWNTZW5kQmQgPSBUUlVFOwotCi0gICAgLyogRG9uJ3QgdXBkYXRlIHN0YXR1cyBibG9ja3MgZHVyaW5nIGludGVycnVwdCAqLwotICAgIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gMDsKLSAgICBwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9IDA7Ci0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci0KLX0KLQotCi1MTV9TVEFUVVMKLU1NX1N0YXJ0VHhEbWEoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCi17Ci0gICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKLSAgICBwcmludGYoIlN0YXJ0IFRYIERNQTogZGV2PSVkIHBhY2tldCBAMHgleFxuIiwKLQkgICAoaW50KXBVbURldmljZS0+aW5kZXgsICh1bnNpZ25lZCBpbnQpcFBhY2tldCk7Ci0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLUxNX1NUQVRVUwotTU1fQ29tcGxldGVUeERtYShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCkKLXsKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotICAgIHByaW50ZigiQ29tcGxldGUgVFggRE1BOiBkZXY9JWQgcGFja2V0IEAweCV4XG4iLAotCSAgIChpbnQpcFVtRGV2aWNlLT5pbmRleCwgKHVuc2lnbmVkIGludClwUGFja2V0KTsKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotTE1fU1RBVFVTCi1NTV9JbmRpY2F0ZVN0YXR1cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1NUQVRVUyBTdGF0dXMpCi17Ci0gICAgY2hhciBidWZbMTI4XTsKLSAgICBjaGFyIGxjZFs0XTsKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotICAgIExNX0ZMT1dfQ09OVFJPTCBmbG93X2NvbnRyb2w7Ci0KLSAgICBwVW1EZXZpY2UtPmRlbGF5ZWRfbGlua19pbmQgPSAwOwotICAgIG1lbXNldChsY2QsIDB4MCwgNCk7Ci0KLSAgICBpZiAoU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0RPV04pIHsKLQlzcHJpbnRmKGJ1ZiwiZXRoJWQ6ICVzOiBOSUMgTGluayBpcyBkb3duXG4iLAotCQlwVW1EZXZpY2UtPmluZGV4LHBVbURldmljZS0+bmFtZSk7Ci0JbGNkWzBdID0gJ0wnO2xjZFsxXT0nTic7bGNkWzJdPSdLJztsY2RbM10gPSAnPyc7Ci0gICAgfSBlbHNlIGlmIChTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKSB7Ci0Jc3ByaW50ZihidWYsImV0aCVkOiVzOiAiLCBwVW1EZXZpY2UtPmluZGV4LCBwVW1EZXZpY2UtPm5hbWUpOwotCi0JaWYgKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKXsKLQkgICAgc3RyY2F0KGJ1ZiwiMTAwMCBNYnBzICIpOwotCSAgICBsY2RbMF0gPSAnMSc7bGNkWzFdPSdHJztsY2RbMl09J0InOwotCX0gZWxzZSBpZiAocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwTUJQUyl7Ci0JICAgIHN0cmNhdChidWYsIjEwMCBNYnBzICIpOwotCSAgICBsY2RbMF0gPSAnMSc7bGNkWzFdPScwJztsY2RbMl09JzAnOwotCX0gZWxzZSBpZiAocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTBNQlBTKXsKLQkgICAgc3RyY2F0KGJ1ZiwiMTAgTWJwcyAiKTsKLQkgICAgbGNkWzBdID0gJzEnO2xjZFsxXT0nMCc7bGNkWzJdPScgJzsKLQl9Ci0JaWYgKHBEZXZpY2UtPkR1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfRlVMTCl7Ci0JICAgIHN0cmNhdChidWYsICJmdWxsIGR1cGxleCIpOwotCSAgICBsY2RbM10gPSAnRic7CisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJcERldmljZS0+VXNlVGFnZ2VkU3RhdHVzID0gVFJVRTsKKwkJcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWjsKIAl9IGVsc2UgewotCSAgICBzdHJjYXQoYnVmLCAiaGFsZiBkdXBsZXgiKTsKLQkgICAgbGNkWzNdID0gJ0gnOworCQlwVW1EZXZpY2UtPnRpbWVyX2ludGVydmFsID0gQ0ZHX0haIC8gNTA7CiAJfQotCXN0cmNhdChidWYsICIgbGluayB1cCIpOwogCi0JZmxvd19jb250cm9sID0gcERldmljZS0+Rmxvd0NvbnRyb2wgJgotCSAgICAoTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UgfAotCSAgICAgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFKTsKKwlwRGV2aWNlLT5UeFBhY2tldERlc2NDbnQgPSB0eF9wa3RfZGVzY19jbnRbaW5kZXhdOworCXBEZXZpY2UtPlJ4U3RkRGVzY0NudCA9IHJ4X3N0ZF9kZXNjX2NudFtpbmRleF07CisJLyogTm90ZTogIGFkYXB0aXZlIGNvYWxlc2NlbmNlIHJlYWxseSBpc24ndCBhZGFwdGl2ZSBpbiB0aGlzIGRyaXZlciAqLworCXBVbURldmljZS0+cnhfYWRhcHRpdmVfY29hbGVzY2UgPSByeF9hZGFwdGl2ZV9jb2FsZXNjZVtpbmRleF07CisJaWYgKCFwVW1EZXZpY2UtPnJ4X2FkYXB0aXZlX2NvYWxlc2NlKSB7CisJCXBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID0gcnhfY29hbGVzY2VfdGlja3NbaW5kZXhdOworCQlpZiAocERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MgPiBNQVhfUlhfQ09BTEVTQ0lOR19USUNLUykKKwkJCXBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID0gTUFYX1JYX0NPQUxFU0NJTkdfVElDS1M7CisJCXBVbURldmljZS0+cnhfY3Vycl9jb2FsZXNjZV90aWNrcyA9IHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzOwogCi0JaWYgKGZsb3dfY29udHJvbCkgewotCSAgICBpZiAoZmxvd19jb250cm9sICYgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UpIHsKLQkJc3RyY2F0KGJ1ZiwiLCByZWNlaXZlICIpOwotCQlpZiAoZmxvd19jb250cm9sICYgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFKQotCQkgICAgc3RyY2F0KGJ1ZiwiICYgdHJhbnNtaXQgIik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXN0cmNhdChidWYsIiwgdHJhbnNtaXQgIik7Ci0JICAgIH0KLQkgICAgc3RyY2F0KGJ1ZiwiZmxvdyBjb250cm9sIE9OIik7CisJCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzID0gcnhfbWF4X2NvYWxlc2NlX2ZyYW1lc1tpbmRleF07CisJCWlmIChwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lcyA+IE1BWF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUykKKwkJCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzID0KKwkJCSAgICBNQVhfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVM7CisJCXBVbURldmljZS0+cnhfY3Vycl9jb2FsZXNjZV9mcmFtZXMgPQorCQkgICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXM7CisJCXBEZXZpY2UtPlN0YXRzQ29hbGVzY2luZ1RpY2tzID0gc3RhdHNfY29hbGVzY2VfdGlja3NbaW5kZXhdOworCQlpZiAocERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MgPiBNQVhfU1RBVFNfQ09BTEVTQ0lOR19USUNLUykKKwkJCXBEZXZpY2UtPlN0YXRzQ29hbGVzY2luZ1RpY2tzID0KKwkJCSAgICBNQVhfU1RBVFNfQ09BTEVTQ0lOR19USUNLUzsKIAl9IGVsc2UgewotCSAgICBzdHJjYXQoYnVmLCAiLCBmbG93IGNvbnRyb2wgT0ZGIik7CisJCXBVbURldmljZS0+cnhfY3Vycl9jb2FsZXNjZV9mcmFtZXMgPQorCQkgICAgREVGQVVMVF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKKwkJcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX3RpY2tzID0gREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTOwogCX0KLQlzdHJjYXQoYnVmLCJcbiIpOwotCXByaW50ZigiJXMiLGJ1Zik7Ci0gICAgfQorCXBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzID0gdHhfY29hbGVzY2VfdGlja3NbaW5kZXhdOworCWlmIChwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyA+IE1BWF9UWF9DT0FMRVNDSU5HX1RJQ0tTKQorCQlwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyA9IE1BWF9UWF9DT0FMRVNDSU5HX1RJQ0tTOworCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID0gdHhfbWF4X2NvYWxlc2NlX2ZyYW1lc1tpbmRleF07CisJaWYgKHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID4gTUFYX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTKQorCQlwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lcyA9IE1BWF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKKworCWlmIChlbmFibGVfd29sW2luZGV4XSkgeworCQlwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwID0gTE1fV0FLRV9VUF9NT0RFX01BR0lDX1BBQ0tFVDsKKwkJcERldmljZS0+V2FrZVVwTW9kZSA9IExNX1dBS0VfVVBfTU9ERV9NQUdJQ19QQUNLRVQ7CisJfQorCXBEZXZpY2UtPk5pY1NlbmRCZCA9IFRSVUU7CisKKwkvKiBEb24ndCB1cGRhdGUgc3RhdHVzIGJsb2NrcyBkdXJpbmcgaW50ZXJydXB0ICovCisJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOworCXBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gMDsKKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKworfQorCitMTV9TVEFUVVMgTU1fU3RhcnRUeERtYSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCit7CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKwlwcmludGYgKCJTdGFydCBUWCBETUE6IGRldj0lZCBwYWNrZXQgQDB4JXhcbiIsCisJCShpbnQpcFVtRGV2aWNlLT5pbmRleCwgKHVuc2lnbmVkIGludClwUGFja2V0KTsKKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworTE1fU1RBVFVTIE1NX0NvbXBsZXRlVHhEbWEgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQoreworCVBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisJcHJpbnRmICgiQ29tcGxldGUgVFggRE1BOiBkZXY9JWQgcGFja2V0IEAweCV4XG4iLAorCQkoaW50KXBVbURldmljZS0+aW5kZXgsICh1bnNpZ25lZCBpbnQpcFBhY2tldCk7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitMTV9TVEFUVVMgTU1fSW5kaWNhdGVTdGF0dXMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fU1RBVFVTIFN0YXR1cykKK3sKKwljaGFyIGJ1ZlsxMjhdOworCWNoYXIgbGNkWzRdOworCVBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisJTE1fRkxPV19DT05UUk9MIGZsb3dfY29udHJvbDsKKworCXBVbURldmljZS0+ZGVsYXllZF9saW5rX2luZCA9IDA7CisJbWVtc2V0IChsY2QsIDB4MCwgNCk7CisKKwlpZiAoU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0RPV04pIHsKKwkJc3ByaW50ZiAoYnVmLCAiZXRoJWQ6ICVzOiBOSUMgTGluayBpcyBkb3duXG4iLAorCQkJIHBVbURldmljZS0+aW5kZXgsIHBVbURldmljZS0+bmFtZSk7CisJCWxjZFswXSA9ICdMJzsKKwkJbGNkWzFdID0gJ04nOworCQlsY2RbMl0gPSAnSyc7CisJCWxjZFszXSA9ICc/JzsKKwl9IGVsc2UgaWYgKFN0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpIHsKKwkJc3ByaW50ZiAoYnVmLCAiZXRoJWQ6JXM6ICIsIHBVbURldmljZS0+aW5kZXgsIHBVbURldmljZS0+bmFtZSk7CisKKwkJaWYgKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKSB7CisJCQlzdHJjYXQgKGJ1ZiwgIjEwMDAgTWJwcyAiKTsKKwkJCWxjZFswXSA9ICcxJzsKKwkJCWxjZFsxXSA9ICdHJzsKKwkJCWxjZFsyXSA9ICdCJzsKKwkJfSBlbHNlIGlmIChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDBNQlBTKSB7CisJCQlzdHJjYXQgKGJ1ZiwgIjEwMCBNYnBzICIpOworCQkJbGNkWzBdID0gJzEnOworCQkJbGNkWzFdID0gJzAnOworCQkJbGNkWzJdID0gJzAnOworCQl9IGVsc2UgaWYgKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwTUJQUykgeworCQkJc3RyY2F0IChidWYsICIxMCBNYnBzICIpOworCQkJbGNkWzBdID0gJzEnOworCQkJbGNkWzFdID0gJzAnOworCQkJbGNkWzJdID0gJyAnOworCQl9CisJCWlmIChwRGV2aWNlLT5EdXBsZXhNb2RlID09IExNX0RVUExFWF9NT0RFX0ZVTEwpIHsKKwkJCXN0cmNhdCAoYnVmLCAiZnVsbCBkdXBsZXgiKTsKKwkJCWxjZFszXSA9ICdGJzsKKwkJfSBlbHNlIHsKKwkJCXN0cmNhdCAoYnVmLCAiaGFsZiBkdXBsZXgiKTsKKwkJCWxjZFszXSA9ICdIJzsKKwkJfQorCQlzdHJjYXQgKGJ1ZiwgIiBsaW5rIHVwIik7CisKKwkJZmxvd19jb250cm9sID0gcERldmljZS0+Rmxvd0NvbnRyb2wgJgorCQkgICAgKExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFIHwKKwkJICAgICBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpOworCisJCWlmIChmbG93X2NvbnRyb2wpIHsKKwkJCWlmIChmbG93X2NvbnRyb2wgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkgeworCQkJCXN0cmNhdCAoYnVmLCAiLCByZWNlaXZlICIpOworCQkJCWlmIChmbG93X2NvbnRyb2wgJgorCQkJCSAgICBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpCisJCQkJCXN0cmNhdCAoYnVmLCAiICYgdHJhbnNtaXQgIik7CisJCQl9IGVsc2UgeworCQkJCXN0cmNhdCAoYnVmLCAiLCB0cmFuc21pdCAiKTsKKwkJCX0KKwkJCXN0cmNhdCAoYnVmLCAiZmxvdyBjb250cm9sIE9OIik7CisJCX0gZWxzZSB7CisJCQlzdHJjYXQgKGJ1ZiwgIiwgZmxvdyBjb250cm9sIE9GRiIpOworCQl9CisJCXN0cmNhdCAoYnVmLCAiXG4iKTsKKwkJcHJpbnRmICgiJXMiLCBidWYpOworCX0KICNpZiAwCi0gICAgc3lzTGVkRHNwbHkobGNkWzBdLGxjZFsxXSxsY2RbMl0sbGNkWzNdKTsKKwlzeXNMZWREc3BseSAobGNkWzBdLCBsY2RbMV0sIGxjZFsyXSwgbGNkWzNdKTsKICNlbmRpZgotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLUxNX1NUQVRVUwotTU1fRnJlZVJ4QnVmZmVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQorTE1fU1RBVFVTIE1NX0ZyZWVSeEJ1ZmZlciAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCiB7CiAKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotICAgIFBVTV9QQUNLRVQgcFVtUGFja2V0OwotICAgIHZvaWQgKnNrYjsKKwlQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworCVBVTV9QQUNLRVQgcFVtUGFja2V0OworCXZvaWQgKnNrYjsKIAotICAgIHBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OworCXBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OwogCi0gICAgaWYgKChza2IgPSBwVW1QYWNrZXQtPnNrYnVmZikpCi0JYmNtNTcweFBrdEZyZWUocFVtRGV2aWNlLT5pbmRleCwgc2tiKTsKKwlpZiAoKHNrYiA9IHBVbVBhY2tldC0+c2tidWZmKSkKKwkJYmNtNTcweFBrdEZyZWUgKHBVbURldmljZS0+aW5kZXgsIHNrYik7CiAKLSAgICBwVW1QYWNrZXQtPnNrYnVmZiA9IDA7CisJcFVtUGFja2V0LT5za2J1ZmYgPSAwOwogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgbG9uZwotTU1fQW5HZXRDdXJyZW50VGltZV91cyhQQU5fU1RBVEVfSU5GTyBwQW5JbmZvKQordW5zaWduZWQgbG9uZyBNTV9BbkdldEN1cnJlbnRUaW1lX3VzIChQQU5fU1RBVEVfSU5GTyBwQW5JbmZvKQogewotICAgIHJldHVybiBnZXRfdGltZXIoMCk7CisJcmV0dXJuIGdldF90aW1lciAoMCk7CiB9CiAKIC8qCkBAIC0xMjU4LDg2ICsxMjIwLDgyIEBACiAgKiAgIG5vbi1mYXRhbC4gIFRoZSBpbmNvbWluZyBjbHVzdGVyIGNoYWluIGlzIG5vdCBmcmVlZCwgZ2l2aW5nCiAgKiAgIHRoZSBjYWxsZXIgdGhlIGNob2ljZSBvZiB3aGV0aGVyIHRvIHRyeSBhIHJldHJhbnNtaXQgbGF0ZXIuCiAgKi8KLUxNX1NUQVRVUwotTU1fQ29hbGVzY2VUeEJ1ZmZlcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCkKK0xNX1NUQVRVUyBNTV9Db2FsZXNjZVR4QnVmZmVyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCkKIHsKLSAgICBQVU1fUEFDS0VUIHBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OwotICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7Ci0gICAgdm9pZCAqc2tibmV3OwotICAgIGludCBsZW4gPSAwOworCVBVTV9QQUNLRVQgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKwl2b2lkICpza2JuZXc7CisJaW50IGxlbiA9IDA7CiAKLSAgICBpZiAobGVuID09IDApCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gKExNX1NUQVRVU19TVUNDRVNTKTsKKworCWlmIChsZW4gPiBNQVhfUEFDS0VUX1NJWkUpIHsKKwkJcHJpbnRmICgiZXRoJWQ6IHhtaXQgZnJhbWUgZGlzY2FyZGVkLCB0b28gYmlnISwgc2l6ZSA9ICVkXG4iLAorCQkJcFVtRGV2aWNlLT5pbmRleCwgbGVuKTsKKwkJcmV0dXJuIChMTV9TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJc2tibmV3ID0gYmNtNTcweFBrdEFsbG9jIChwVW1EZXZpY2UtPmluZGV4LCBNQVhfUEFDS0VUX1NJWkUpOworCisJaWYgKHNrYm5ldyA9PSBOVUxMKSB7CisJCXBVbURldmljZS0+dHhfZnVsbCA9IDE7CisJCXByaW50ZiAoImV0aCVkOiBvdXQgb2YgdHJhbnNtaXQgYnVmZmVycyIsIHBVbURldmljZS0+aW5kZXgpOworCQlyZXR1cm4gKExNX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwkvKiBOZXcgcGFja2V0IHZhbHVlcyAqLworCXBVbVBhY2tldC0+c2tidWZmID0gc2tibmV3OworCXBVbVBhY2tldC0+bG1fcGFja2V0LnUuVHguRnJhZ0NvdW50ID0gMTsKKwogCXJldHVybiAoTE1fU1RBVFVTX1NVQ0NFU1MpOwotCi0gICAgaWYgKGxlbiA+IE1BWF9QQUNLRVRfU0laRSl7Ci0JcHJpbnRmICgiZXRoJWQ6IHhtaXQgZnJhbWUgZGlzY2FyZGVkLCB0b28gYmlnISwgc2l6ZSA9ICVkXG4iLAotCQlwVW1EZXZpY2UtPmluZGV4LCBsZW4pOwotCXJldHVybiAoTE1fU1RBVFVTX0ZBSUxVUkUpOwotICAgIH0KLQotICAgIHNrYm5ldyA9IGJjbTU3MHhQa3RBbGxvYyhwVW1EZXZpY2UtPmluZGV4LCBNQVhfUEFDS0VUX1NJWkUpOwotCi0gICAgaWYgKHNrYm5ldyA9PSBOVUxMKSB7Ci0JcFVtRGV2aWNlLT50eF9mdWxsID0gMTsKLQlwcmludGYgKCJldGglZDogb3V0IG9mIHRyYW5zbWl0IGJ1ZmZlcnMiLCBwVW1EZXZpY2UtPmluZGV4KTsKLQlyZXR1cm4gKExNX1NUQVRVU19GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICAvKiBOZXcgcGFja2V0IHZhbHVlcyAqLwotICAgIHBVbVBhY2tldC0+c2tidWZmID0gc2tibmV3OwotICAgIHBVbVBhY2tldC0+bG1fcGFja2V0LnUuVHguRnJhZ0NvdW50ID0gMTsKLQotICAgIHJldHVybiAoTE1fU1RBVFVTX1NVQ0NFU1MpOwogfQogCi0KLUxNX1NUQVRVUwotTU1fSW5kaWNhdGVSeFBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTE1fU1RBVFVTIE1NX0luZGljYXRlUnhQYWNrZXRzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKLSAgICBwVW1EZXZpY2UtPnJ4X3BrdCA9IDE7Ci0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCVBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisJcFVtRGV2aWNlLT5yeF9wa3QgPSAxOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAotTE1fU1RBVFVTCi1NTV9JbmRpY2F0ZVR4UGFja2V0cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTU1fSW5kaWNhdGVUeFBhY2tldHMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKLSAgICBQVU1fUEFDS0VUIHBVbVBhY2tldDsKLSAgICB2b2lkICpza2I7Ci0gICAgd2hpbGUgKCBUUlVFICkgeworCVBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisJUExNX1BBQ0tFVCBwUGFja2V0OworCVBVTV9QQUNLRVQgcFVtUGFja2V0OworCXZvaWQgKnNrYjsKKwl3aGlsZSAoVFJVRSkgewogCi0JcFBhY2tldCA9IChQTE1fUEFDS0VUKQotCSAgICBRUV9Qb3BIZWFkKCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lcik7CisJCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkKKwkJICAgIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lcik7CiAKLQlpZiAocFBhY2tldCA9PSAwKQotCSAgICBicmVhazsKKwkJaWYgKHBQYWNrZXQgPT0gMCkKKwkJCWJyZWFrOwogCi0JcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7Ci0Jc2tiID0gKHZvaWQqKXBVbVBhY2tldC0+c2tidWZmOworCQlwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKKwkJc2tiID0gKHZvaWQgKilwVW1QYWNrZXQtPnNrYnVmZjsKIAotCS8qCi0JKiBGcmVlIE1CTEsgaWYgd2UgdHJhbnNtaXR0ZWQgYSBmcmFnbWVudGVkIHBhY2tldCBvciBhCi0JKiBub24tZnJhZ21lbnRlZCBwYWNrZXQgc3RyYWlnaHQgZnJvbSB0aGUgVnhXb3JrcwotCSogYnVmZmVyIHBvb2wuIElmIHBhY2tldCB3YXMgY29waWVkIHRvIGEgbG9jYWwgdHJhbnNtaXQKLQkqIGJ1ZmZlciwgdGhlbiB0aGVyZSdzIG5vIE1CVUYgdG8gZnJlZSwganVzdCBmcmVlCi0JKiB0aGUgdHJhbnNtaXQgYnVmZmVyIGJhY2sgdG8gdGhlIGNsdXN0ZXIgcG9vbC4KLQkqLworCQkvKgorCQkgKiBGcmVlIE1CTEsgaWYgd2UgdHJhbnNtaXR0ZWQgYSBmcmFnbWVudGVkIHBhY2tldCBvciBhCisJCSAqIG5vbi1mcmFnbWVudGVkIHBhY2tldCBzdHJhaWdodCBmcm9tIHRoZSBWeFdvcmtzCisJCSAqIGJ1ZmZlciBwb29sLiBJZiBwYWNrZXQgd2FzIGNvcGllZCB0byBhIGxvY2FsIHRyYW5zbWl0CisJCSAqIGJ1ZmZlciwgdGhlbiB0aGVyZSdzIG5vIE1CVUYgdG8gZnJlZSwganVzdCBmcmVlCisJCSAqIHRoZSB0cmFuc21pdCBidWZmZXIgYmFjayB0byB0aGUgY2x1c3RlciBwb29sLgorCQkgKi8KIAotCWlmIChza2IpCi0JICAgIGJjbTU3MHhQa3RGcmVlIChwVW1EZXZpY2UtPmluZGV4LCBza2IpOworCQlpZiAoc2tiKQorCQkJYmNtNTcweFBrdEZyZWUgKHBVbURldmljZS0+aW5kZXgsIHNrYik7CiAKLQlwVW1QYWNrZXQtPnNrYnVmZiA9IDA7Ci0JUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKLQlwVW1EZXZpY2UtPnR4X3BrdCA9IDE7Ci0gICAgfQotICAgIGlmIChwVW1EZXZpY2UtPnR4X2Z1bGwpIHsKLQlpZiAoUVFfR2V0RW50cnlDbnQoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyKSA+PQotCSAgICAoUVFfR2V0U2l6ZSgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIpID4+IDEpKQotCSAgICBwVW1EZXZpY2UtPnR4X2Z1bGwgPSAwOwotICAgIH0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJCXBVbVBhY2tldC0+c2tidWZmID0gMDsKKwkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCXBVbURldmljZS0+dHhfcGt0ID0gMTsKKwl9CisJaWYgKHBVbURldmljZS0+dHhfZnVsbCkgeworCQlpZiAoUVFfR2V0RW50cnlDbnQgKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lcikgPj0KKwkJICAgIChRUV9HZXRTaXplICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIpID4+IDEpKQorCQkJcFVtRGV2aWNlLT50eF9mdWxsID0gMDsKKwl9CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCiAvKgpAQCAtMTM0NSwxNiArMTMwMywxMiBAQAogICogIFJldHVybiBpdHMgbGVuZ3RoIGFuZCBwaHlzaWNhbCBhZGRyZXNzLgogICovCiB2b2lkIE1NX01hcFR4RG1hCi0gICAgKAotICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLSAgICBzdHJ1Y3QgX0xNX1BBQ0tFVCAqcFBhY2tldCwKLSAgICBUM182NEJJVF9IT1NUX0FERFIgKnBhZGRyLAotICAgIExNX1VJTlQzMiAqbGVuLAotICAgIGludCBmcmFnKQotewotICAgIFBVTV9QQUNLRVQgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7Ci0gICAgKmxlbiA9IHBQYWNrZXQtPlBhY2tldFNpemU7Ci0gICAgTU1fU2V0VDNBZGRyKHBhZGRyLCAoZG1hX2FkZHJfdCkgcFVtUGFja2V0LT5za2J1ZmYpOworICAgIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisgICAgIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LAorICAgICBUM182NEJJVF9IT1NUX0FERFIgKiBwYWRkciwgTE1fVUlOVDMyICogbGVuLCBpbnQgZnJhZykgeworCVBVTV9QQUNLRVQgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisJKmxlbiA9IHBQYWNrZXQtPlBhY2tldFNpemU7CisJTU1fU2V0VDNBZGRyIChwYWRkciwgKGRtYV9hZGRyX3QpIHBVbVBhY2tldC0+c2tidWZmKTsKIH0KIAogLyoKQEAgLTEzNjIsMzUgKzEzMTYsMzEgQEAKICAqICB0byBhIHBoeXNpY2FsIGFkZHJlc3MgYXMgc2VlbiBmcm9tIGEgUENJIGRldmljZS4gIFN0b3JlIHRoZQogICogIHJlc3VsdCBhdCBwYWRkci4KICAqLwotdm9pZCBNTV9NYXBSeERtYSgKLQkJIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLQkJIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LAotCQkgVDNfNjRCSVRfSE9TVF9BRERSICpwYWRkcikKK3ZvaWQgTU1fTWFwUnhEbWEgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJICBzdHJ1Y3QgX0xNX1BBQ0tFVCAqcFBhY2tldCwgVDNfNjRCSVRfSE9TVF9BRERSICogcGFkZHIpCiB7Ci0gICAgUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKLSAgICBNTV9TZXRUM0FkZHIocGFkZHIsIChkbWFfYWRkcl90KSBwVW1QYWNrZXQtPnNrYnVmZik7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKKwlNTV9TZXRUM0FkZHIgKHBhZGRyLCAoZG1hX2FkZHJfdCkgcFVtUGFja2V0LT5za2J1ZmYpOwogfQogCi12b2lkCi1NTV9TZXRBZGRyIChMTV9QSFlTSUNBTF9BRERSRVNTICpwYWRkciwgZG1hX2FkZHJfdCBhZGRyKQordm9pZCBNTV9TZXRBZGRyIChMTV9QSFlTSUNBTF9BRERSRVNTICogcGFkZHIsIGRtYV9hZGRyX3QgYWRkcikKIHsKICNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKLQlwYWRkci0+SGlnaCA9ICgodW5zaWduZWQgbG9uZykgYWRkcikgPj4gMzI7Ci0JcGFkZHItPkxvdyA9ICgodW5zaWduZWQgbG9uZykgYWRkcikgJiAweGZmZmZmZmZmOworCXBhZGRyLT5IaWdoID0gKCh1bnNpZ25lZCBsb25nKWFkZHIpID4+IDMyOworCXBhZGRyLT5Mb3cgPSAoKHVuc2lnbmVkIGxvbmcpYWRkcikgJiAweGZmZmZmZmZmOwogI2Vsc2UKIAlwYWRkci0+SGlnaCA9IDA7Ci0JcGFkZHItPkxvdyA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOworCXBhZGRyLT5Mb3cgPSAodW5zaWduZWQgbG9uZylhZGRyOwogI2VuZGlmCiB9CiAKLXZvaWQKLU1NX1NldFQzQWRkcihUM182NEJJVF9IT1NUX0FERFIgKnBhZGRyLCBkbWFfYWRkcl90IGFkZHIpCit2b2lkIE1NX1NldFQzQWRkciAoVDNfNjRCSVRfSE9TVF9BRERSICogcGFkZHIsIGRtYV9hZGRyX3QgYWRkcikKIHsKLQl1bnNpZ25lZCBsb25nIGJhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CisJdW5zaWduZWQgbG9uZyBiYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CiAjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCi0Jc2V0XzY0Yml0X2FkZHIocGFkZHIsIGJhZGRyICYgMHhmZmZmZmZmZiwgYmFkZHIgPj4gMzIpOworCXNldF82NGJpdF9hZGRyIChwYWRkciwgYmFkZHIgJiAweGZmZmZmZmZmLCBiYWRkciA+PiAzMik7CiAjZWxzZQotCXNldF82NGJpdF9hZGRyKHBhZGRyLCBiYWRkciwgMCk7CisJc2V0XzY0Yml0X2FkZHIgKHBhZGRyLCBiYWRkciwgMCk7CiAjZW5kaWYKIH0KIApAQCAtMTQwMyw0MiArMTM1MywzOCBAQAogICogSWYgYW55IHVzZXMgb2YgdGhlIGZ1bmN0aW9uIHJlbWFpbiwgdGhleSB3aWxsIHJlZmVyIHRvIHRoZSBzaW5nbGUgY29weQogICogaW4gdGhlIGxpYnJhcnkuCiAgKi8KLXZvaWQKLWF0b21pY19zZXQoYXRvbWljX3QqIGVudHJ5LCBpbnQgdmFsKQordm9pZCBhdG9taWNfc2V0IChhdG9taWNfdCAqIGVudHJ5LCBpbnQgdmFsKQogewotICAgIGVudHJ5LT5jb3VudGVyID0gdmFsOwotfQotaW50Ci1hdG9taWNfcmVhZChhdG9taWNfdCogZW50cnkpCi17Ci0gICAgcmV0dXJuIGVudHJ5LT5jb3VudGVyOwotfQotdm9pZAotYXRvbWljX2luYyhhdG9taWNfdCogZW50cnkpCi17Ci0gICAgaWYoZW50cnkpCi0JZW50cnktPmNvdW50ZXIrKzsKKwllbnRyeS0+Y291bnRlciA9IHZhbDsKIH0KIAotdm9pZAotYXRvbWljX2RlYyhhdG9taWNfdCogZW50cnkpCitpbnQgYXRvbWljX3JlYWQgKGF0b21pY190ICogZW50cnkpCiB7Ci0gICAgaWYoZW50cnkpCi0JZW50cnktPmNvdW50ZXItLTsKKwlyZXR1cm4gZW50cnktPmNvdW50ZXI7CiB9CiAKLXZvaWQKLWF0b21pY19zdWIoaW50IGEsIGF0b21pY190KiBlbnRyeSkKK3ZvaWQgYXRvbWljX2luYyAoYXRvbWljX3QgKiBlbnRyeSkKIHsKLSAgICBpZihlbnRyeSkKLQllbnRyeS0+Y291bnRlciAtPSBhOworCWlmIChlbnRyeSkKKwkJZW50cnktPmNvdW50ZXIrKzsKIH0KIAotdm9pZAotYXRvbWljX2FkZChpbnQgYSwgYXRvbWljX3QqIGVudHJ5KQordm9pZCBhdG9taWNfZGVjIChhdG9taWNfdCAqIGVudHJ5KQogewotICAgIGlmKGVudHJ5KQotCWVudHJ5LT5jb3VudGVyICs9IGE7CisJaWYgKGVudHJ5KQorCQllbnRyeS0+Y291bnRlci0tOworfQorCit2b2lkIGF0b21pY19zdWIgKGludCBhLCBhdG9taWNfdCAqIGVudHJ5KQoreworCWlmIChlbnRyeSkKKwkJZW50cnktPmNvdW50ZXIgLT0gYTsKK30KKwordm9pZCBhdG9taWNfYWRkIChpbnQgYSwgYXRvbWljX3QgKiBlbnRyeSkKK3sKKwlpZiAoZW50cnkpCisJCWVudHJ5LT5jb3VudGVyICs9IGE7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNDQ2LDY4ICsxMzkyLDU3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1RUV9Jbml0UXVldWUoCi1QUVFfQ09OVEFJTkVSIHBRdWV1ZSwKLXVuc2lnbmVkIGludCBRdWV1ZVNpemUpIHsKLSAgICBwUXVldWUtPkhlYWQgPSAwOwotICAgIHBRdWV1ZS0+VGFpbCA9IDA7Ci0gICAgcFF1ZXVlLT5TaXplID0gUXVldWVTaXplKzE7Ci0gICAgYXRvbWljX3NldCgmcFF1ZXVlLT5FbnRyeUNudCwgMCk7Ci19IC8qIFFRX0luaXRRdWV1ZSAqLwotCit2b2lkIFFRX0luaXRRdWV1ZSAoUFFRX0NPTlRBSU5FUiBwUXVldWUsIHVuc2lnbmVkIGludCBRdWV1ZVNpemUpCit7CisJcFF1ZXVlLT5IZWFkID0gMDsKKwlwUXVldWUtPlRhaWwgPSAwOworCXBRdWV1ZS0+U2l6ZSA9IFF1ZXVlU2l6ZSArIDE7CisJYXRvbWljX3NldCAoJnBRdWV1ZS0+RW50cnlDbnQsIDApOworfQkJCQkvKiBRUV9Jbml0UXVldWUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyCi1RUV9GdWxsKAotUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKLSAgICB1bnNpZ25lZCBpbnQgTmV3SGVhZDsKK2NoYXIgUVFfRnVsbCAoUFFRX0NPTlRBSU5FUiBwUXVldWUpCit7CisJdW5zaWduZWQgaW50IE5ld0hlYWQ7CiAKLSAgICBOZXdIZWFkID0gKHBRdWV1ZS0+SGVhZCArIDEpICUgcFF1ZXVlLT5TaXplOworCU5ld0hlYWQgPSAocFF1ZXVlLT5IZWFkICsgMSkgJSBwUXVldWUtPlNpemU7CiAKLSAgICByZXR1cm4oTmV3SGVhZCA9PSBwUXVldWUtPlRhaWwpOwotfSAvKiBRUV9GdWxsICovCi0KKwlyZXR1cm4gKE5ld0hlYWQgPT0gcFF1ZXVlLT5UYWlsKTsKK30JCQkJLyogUVFfRnVsbCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIKLVFRX0VtcHR5KAotUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKLSAgICByZXR1cm4ocFF1ZXVlLT5IZWFkID09IHBRdWV1ZS0+VGFpbCk7Ci19IC8qIFFRX0VtcHR5ICovCi0KK2NoYXIgUVFfRW1wdHkgKFBRUV9DT05UQUlORVIgcFF1ZXVlKQoreworCXJldHVybiAocFF1ZXVlLT5IZWFkID09IHBRdWV1ZS0+VGFpbCk7Cit9CQkJCS8qIFFRX0VtcHR5ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgaW50Ci1RUV9HZXRTaXplKAotUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKLSAgICByZXR1cm4gcFF1ZXVlLT5TaXplOwotfSAvKiBRUV9HZXRTaXplICovCi0KK3Vuc2lnbmVkIGludCBRUV9HZXRTaXplIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSkKK3sKKwlyZXR1cm4gcFF1ZXVlLT5TaXplOworfQkJCQkvKiBRUV9HZXRTaXplICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgaW50Ci1RUV9HZXRFbnRyeUNudCgKLVBRUV9DT05UQUlORVIgcFF1ZXVlKSB7Ci0gICAgcmV0dXJuIGF0b21pY19yZWFkKCZwUXVldWUtPkVudHJ5Q250KTsKLX0gLyogUVFfR2V0RW50cnlDbnQgKi8KLQordW5zaWduZWQgaW50IFFRX0dldEVudHJ5Q250IChQUVFfQ09OVEFJTkVSIHBRdWV1ZSkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQgKCZwUXVldWUtPkVudHJ5Q250KTsKK30JCQkJLyogUVFfR2V0RW50cnlDbnQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNTE2LDI4ICsxNDUxLDI1IEBACiAvKiAgICBUUlVFIGVudHJ5IHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRkFMU0UgcXVldWUgaXMgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyCi1RUV9QdXNoSGVhZCgKLVBRUV9DT05UQUlORVIgcFF1ZXVlLAotUFFRX0VOVFJZIHBFbnRyeSkgewotICAgIHVuc2lnbmVkIGludCBIZWFkOworY2hhciBRUV9QdXNoSGVhZCAoUFFRX0NPTlRBSU5FUiBwUXVldWUsIFBRUV9FTlRSWSBwRW50cnkpCit7CisJdW5zaWduZWQgaW50IEhlYWQ7CiAKLSAgICBIZWFkID0gKHBRdWV1ZS0+SGVhZCArIDEpICUgcFF1ZXVlLT5TaXplOworCUhlYWQgPSAocFF1ZXVlLT5IZWFkICsgMSkgJSBwUXVldWUtPlNpemU7CiAKICNpZiAhZGVmaW5lZChRUV9OT19PVkVSRkxPV19DSEVDSykKLSAgICBpZihIZWFkID09IHBRdWV1ZS0+VGFpbCkgewotCXJldHVybiAwOwotICAgIH0gLyogaWYgKi8KLSNlbmRpZiAvKiBRUV9OT19PVkVSRkxPV19DSEVDSyAqLworCWlmIChIZWFkID09IHBRdWV1ZS0+VGFpbCkgeworCQlyZXR1cm4gMDsKKwl9CQkJLyogaWYgKi8KKyNlbmRpZgkJCQkvKiBRUV9OT19PVkVSRkxPV19DSEVDSyAqLwogCi0gICAgcFF1ZXVlLT5BcnJheVtwUXVldWUtPkhlYWRdID0gcEVudHJ5OwotICAgIHdtYigpOwotICAgIHBRdWV1ZS0+SGVhZCA9IEhlYWQ7Ci0gICAgYXRvbWljX2luYygmcFF1ZXVlLT5FbnRyeUNudCk7CisJcFF1ZXVlLT5BcnJheVtwUXVldWUtPkhlYWRdID0gcEVudHJ5OworCXdtYiAoKTsKKwlwUXVldWUtPkhlYWQgPSBIZWFkOworCWF0b21pY19pbmMgKCZwUXVldWUtPkVudHJ5Q250KTsKIAotICAgIHJldHVybiAtMTsKLX0gLyogUVFfUHVzaEhlYWQgKi8KLQorCXJldHVybiAtMTsKK30JCQkJLyogUVFfUHVzaEhlYWQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNTQ2LDE0NiArMTQ3OCwxMjYgQEAKIC8qICAgIFRSVUUgZW50cnkgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGQUxTRSBxdWV1ZSBpcyBmdWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIKLVFRX1B1c2hUYWlsKAotUFFRX0NPTlRBSU5FUiBwUXVldWUsCi1QUVFfRU5UUlkgcEVudHJ5KSB7Ci0gICAgdW5zaWduZWQgaW50IFRhaWw7CitjaGFyIFFRX1B1c2hUYWlsIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSwgUFFRX0VOVFJZIHBFbnRyeSkKK3sKKwl1bnNpZ25lZCBpbnQgVGFpbDsKIAotICAgIFRhaWwgPSBwUXVldWUtPlRhaWw7Ci0gICAgaWYoVGFpbCA9PSAwKSB7Ci0JVGFpbCA9IHBRdWV1ZS0+U2l6ZTsKLSAgICB9IC8qIGlmICovCi0gICAgVGFpbC0tOworCVRhaWwgPSBwUXVldWUtPlRhaWw7CisJaWYgKFRhaWwgPT0gMCkgeworCQlUYWlsID0gcFF1ZXVlLT5TaXplOworCX0JCQkvKiBpZiAqLworCVRhaWwtLTsKIAogI2lmICFkZWZpbmVkKFFRX05PX09WRVJGTE9XX0NIRUNLKQotICAgIGlmKFRhaWwgPT0gcFF1ZXVlLT5IZWFkKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfSAvKiBpZiAqLwotI2VuZGlmIC8qIFFRX05PX09WRVJGTE9XX0NIRUNLICovCisJaWYgKFRhaWwgPT0gcFF1ZXVlLT5IZWFkKSB7CisJCXJldHVybiAwOworCX0JCQkvKiBpZiAqLworI2VuZGlmCQkJCS8qIFFRX05PX09WRVJGTE9XX0NIRUNLICovCiAKLSAgICBwUXVldWUtPkFycmF5W1RhaWxdID0gcEVudHJ5OwotICAgIHdtYigpOwotICAgIHBRdWV1ZS0+VGFpbCA9IFRhaWw7Ci0gICAgYXRvbWljX2luYygmcFF1ZXVlLT5FbnRyeUNudCk7CisJcFF1ZXVlLT5BcnJheVtUYWlsXSA9IHBFbnRyeTsKKwl3bWIgKCk7CisJcFF1ZXVlLT5UYWlsID0gVGFpbDsKKwlhdG9taWNfaW5jICgmcFF1ZXVlLT5FbnRyeUNudCk7CiAKLSAgICByZXR1cm4gLTE7Ci19IC8qIFFRX1B1c2hUYWlsICovCi0KKwlyZXR1cm4gLTE7Cit9CQkJCS8qIFFRX1B1c2hUYWlsICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUFFRX0VOVFJZCi1RUV9Qb3BIZWFkKAotUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKLSAgICB1bnNpZ25lZCBpbnQgSGVhZDsKLSAgICBQUVFfRU5UUlkgRW50cnk7CitQUVFfRU5UUlkgUVFfUG9wSGVhZCAoUFFRX0NPTlRBSU5FUiBwUXVldWUpCit7CisJdW5zaWduZWQgaW50IEhlYWQ7CisJUFFRX0VOVFJZIEVudHJ5OwogCi0gICAgSGVhZCA9IHBRdWV1ZS0+SGVhZDsKKwlIZWFkID0gcFF1ZXVlLT5IZWFkOwogCiAjaWYgIWRlZmluZWQoUVFfTk9fVU5ERVJGTE9XX0NIRUNLKQotICAgIGlmKEhlYWQgPT0gcFF1ZXVlLT5UYWlsKSB7Ci0JcmV0dXJuIChQUVFfRU5UUlkpIDA7Ci0gICAgfSAvKiBpZiAqLwotI2VuZGlmIC8qIFFRX05PX1VOREVSRkxPV19DSEVDSyAqLworCWlmIChIZWFkID09IHBRdWV1ZS0+VGFpbCkgeworCQlyZXR1cm4gKFBRUV9FTlRSWSkgMDsKKwl9CQkJLyogaWYgKi8KKyNlbmRpZgkJCQkvKiBRUV9OT19VTkRFUkZMT1dfQ0hFQ0sgKi8KIAotICAgIGlmKEhlYWQgPT0gMCkgewotCUhlYWQgPSBwUXVldWUtPlNpemU7Ci0gICAgfSAvKiBpZiAqLwotICAgIEhlYWQtLTsKKwlpZiAoSGVhZCA9PSAwKSB7CisJCUhlYWQgPSBwUXVldWUtPlNpemU7CisJfQkJCS8qIGlmICovCisJSGVhZC0tOwogCi0gICAgRW50cnkgPSBwUXVldWUtPkFycmF5W0hlYWRdOwotICAgIG1lbWJhcigpOworCUVudHJ5ID0gcFF1ZXVlLT5BcnJheVtIZWFkXTsKKwltZW1iYXIgKCk7CiAKLSAgICBwUXVldWUtPkhlYWQgPSBIZWFkOwotICAgIGF0b21pY19kZWMoJnBRdWV1ZS0+RW50cnlDbnQpOworCXBRdWV1ZS0+SGVhZCA9IEhlYWQ7CisJYXRvbWljX2RlYyAoJnBRdWV1ZS0+RW50cnlDbnQpOwogCi0gICAgcmV0dXJuIEVudHJ5OwotfSAvKiBRUV9Qb3BIZWFkICovCi0KKwlyZXR1cm4gRW50cnk7Cit9CQkJCS8qIFFRX1BvcEhlYWQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QUVFfRU5UUlkKLVFRX1BvcFRhaWwoCi1QUVFfQ09OVEFJTkVSIHBRdWV1ZSkgewotICAgIHVuc2lnbmVkIGludCBUYWlsOwotICAgIFBRUV9FTlRSWSBFbnRyeTsKK1BRUV9FTlRSWSBRUV9Qb3BUYWlsIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgVGFpbDsKKwlQUVFfRU5UUlkgRW50cnk7CiAKLSAgICBUYWlsID0gcFF1ZXVlLT5UYWlsOworCVRhaWwgPSBwUXVldWUtPlRhaWw7CiAKICNpZiAhZGVmaW5lZChRUV9OT19VTkRFUkZMT1dfQ0hFQ0spCi0gICAgaWYoVGFpbCA9PSBwUXVldWUtPkhlYWQpIHsKLQlyZXR1cm4gKFBRUV9FTlRSWSkgMDsKLSAgICB9IC8qIGlmICovCi0jZW5kaWYgLyogUVFfTk9fVU5ERVJGTE9XX0NIRUNLICovCisJaWYgKFRhaWwgPT0gcFF1ZXVlLT5IZWFkKSB7CisJCXJldHVybiAoUFFRX0VOVFJZKSAwOworCX0JCQkvKiBpZiAqLworI2VuZGlmCQkJCS8qIFFRX05PX1VOREVSRkxPV19DSEVDSyAqLwogCi0gICAgRW50cnkgPSBwUXVldWUtPkFycmF5W1RhaWxdOwotICAgIG1lbWJhcigpOwotICAgIHBRdWV1ZS0+VGFpbCA9IChUYWlsICsgMSkgJSBwUXVldWUtPlNpemU7Ci0gICAgYXRvbWljX2RlYygmcFF1ZXVlLT5FbnRyeUNudCk7CisJRW50cnkgPSBwUXVldWUtPkFycmF5W1RhaWxdOworCW1lbWJhciAoKTsKKwlwUXVldWUtPlRhaWwgPSAoVGFpbCArIDEpICUgcFF1ZXVlLT5TaXplOworCWF0b21pY19kZWMgKCZwUXVldWUtPkVudHJ5Q250KTsKIAotICAgIHJldHVybiBFbnRyeTsKLX0gLyogUVFfUG9wVGFpbCAqLwotCisJcmV0dXJuIEVudHJ5OworfQkJCQkvKiBRUV9Qb3BUYWlsICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUFFRX0VOVFJZCi1RUV9HZXRIZWFkKAotICAgIFBRUV9DT05UQUlORVIgcFF1ZXVlLAotICAgIHVuc2lnbmVkIGludCBJZHgpCitQUVFfRU5UUlkgUVFfR2V0SGVhZCAoUFFRX0NPTlRBSU5FUiBwUXVldWUsIHVuc2lnbmVkIGludCBJZHgpCiB7Ci0gICAgaWYoSWR4ID49IGF0b21pY19yZWFkKCZwUXVldWUtPkVudHJ5Q250KSkKLSAgICB7Ci0JcmV0dXJuIChQUVFfRU5UUlkpIDA7Ci0gICAgfQorCWlmIChJZHggPj0gYXRvbWljX3JlYWQgKCZwUXVldWUtPkVudHJ5Q250KSkgeworCQlyZXR1cm4gKFBRUV9FTlRSWSkgMDsKKwl9CiAKLSAgICBpZihwUXVldWUtPkhlYWQgPiBJZHgpCi0gICAgewotCUlkeCA9IHBRdWV1ZS0+SGVhZCAtIElkeDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlJZHggPSBwUXVldWUtPlNpemUgLSAoSWR4IC0gcFF1ZXVlLT5IZWFkKTsKLSAgICB9Ci0gICAgSWR4LS07CisJaWYgKHBRdWV1ZS0+SGVhZCA+IElkeCkgeworCQlJZHggPSBwUXVldWUtPkhlYWQgLSBJZHg7CisJfSBlbHNlIHsKKwkJSWR4ID0gcFF1ZXVlLT5TaXplIC0gKElkeCAtIHBRdWV1ZS0+SGVhZCk7CisJfQorCUlkeC0tOwogCi0gICAgcmV0dXJuIHBRdWV1ZS0+QXJyYXlbSWR4XTsKKwlyZXR1cm4gcFF1ZXVlLT5BcnJheVtJZHhdOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUFFRX0VOVFJZCi1RUV9HZXRUYWlsKAotICAgIFBRUV9DT05UQUlORVIgcFF1ZXVlLAotICAgIHVuc2lnbmVkIGludCBJZHgpCitQUVFfRU5UUlkgUVFfR2V0VGFpbCAoUFFRX0NPTlRBSU5FUiBwUXVldWUsIHVuc2lnbmVkIGludCBJZHgpCiB7Ci0gICAgaWYoSWR4ID49IGF0b21pY19yZWFkKCZwUXVldWUtPkVudHJ5Q250KSkKLSAgICB7Ci0JcmV0dXJuIChQUVFfRU5UUlkpIDA7Ci0gICAgfQorCWlmIChJZHggPj0gYXRvbWljX3JlYWQgKCZwUXVldWUtPkVudHJ5Q250KSkgeworCQlyZXR1cm4gKFBRUV9FTlRSWSkgMDsKKwl9CiAKLSAgICBJZHggKz0gcFF1ZXVlLT5UYWlsOwotICAgIGlmKElkeCA+PSBwUXVldWUtPlNpemUpCi0gICAgewotCUlkeCA9IElkeCAtIHBRdWV1ZS0+U2l6ZTsKLSAgICB9CisJSWR4ICs9IHBRdWV1ZS0+VGFpbDsKKwlpZiAoSWR4ID49IHBRdWV1ZS0+U2l6ZSkgeworCQlJZHggPSBJZHggLSBwUXVldWUtPlNpemU7CisJfQogCi0gICAgcmV0dXJuIHBRdWV1ZS0+QXJyYXlbSWR4XTsKKwlyZXR1cm4gcFF1ZXVlLT5BcnJheVtJZHhdOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQsICFDT05GSUdfTkVUX01VTFRJLCBDT05GSUdfQkNNNTcweCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbTU3MHhfbG0uaCBiL2RyaXZlcnMvYmNtNTcweF9sbS5oCmluZGV4IDYwN2YzZmQuLjJlYTZjYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtNTcweF9sbS5oCisrKyBiL2RyaXZlcnMvYmNtNTcweF9sbS5oCkBAIC0xOSwyOSArMTksMjggQEAKICNpbmNsdWRlICJiY201NzB4X3F1ZXVlLmgiCiAjaW5jbHVkZSAiYmNtNTcweF9iaXRzLmgiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEJhc2ljIHR5cGVzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBjaGFyICAgICAgICAgICBMTV9DSEFSLCAgICAqUExNX0NIQVI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgIExNX1VJTlQsICAgICpQTE1fVUlOVDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgTE1fVUlOVDgsICAgKlBMTV9VSU5UODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgTE1fVUlOVDE2LCAgKlBMTV9VSU5UMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgIExNX1VJTlQzMiwgICpQTE1fVUlOVDMyOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICBMTV9DT1VOVEVSLCAqUExNX0NPVU5URVI7Ci10eXBlZGVmIHZvaWQgICAgICAgICAgIExNX1ZPSUQsICAgICpQTE1fVk9JRDsKLXR5cGVkZWYgY2hhciAgICAgICAgICAgTE1fQk9PTCwgICAgKlBMTV9CT09MOwordHlwZWRlZiBjaGFyIExNX0NIQVIsICpQTE1fQ0hBUjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IExNX1VJTlQsICpQTE1fVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBMTV9VSU5UOCwgKlBMTV9VSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgTE1fVUlOVDE2LCAqUExNX1VJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IExNX1VJTlQzMiwgKlBMTV9VSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBMTV9DT1VOVEVSLCAqUExNX0NPVU5URVI7Cit0eXBlZGVmIHZvaWQgTE1fVk9JRCwgKlBMTV9WT0lEOwordHlwZWRlZiBjaGFyIExNX0JPT0wsICpQTE1fQk9PTDsKIAogLyogNjRiaXQgdmFsdWUuICovCiB0eXBlZGVmIHN0cnVjdCB7CiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0gICAgTE1fVUlOVDMyIEhpZ2g7Ci0gICAgTE1fVUlOVDMyIExvdzsKLSNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLwotICAgIExNX1VJTlQzMiBMb3c7Ci0gICAgTE1fVUlOVDMyIEhpZ2g7Ci0jZW5kaWYgLyogIUJJR19FTkRJQU5fSE9TVCAqLworCUxNX1VJTlQzMiBIaWdoOworCUxNX1VJTlQzMiBMb3c7CisjZWxzZQkJCQkvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKwlMTV9VSU5UMzIgTG93OworCUxNX1VJTlQzMiBIaWdoOworI2VuZGlmCQkJCS8qICFCSUdfRU5ESUFOX0hPU1QgKi8KIH0gTE1fVUlOVDY0LCAqUExNX1VJTlQ2NDsKIAogdHlwZWRlZiBMTV9VSU5UNjQgTE1fUEhZU0lDQUxfQUREUkVTUywgKlBMTV9QSFlTSUNBTF9BRERSRVNTOwpAQCAtNTgsMTUgKzU3LDEzIEBACiAJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAKLQogI2lmbmRlZiBOVUxMCiAjZGVmaW5lIE5VTEwgICAgICAgICAgICAgICAgKCh2b2lkICopIDApCi0jZW5kaWYgLyogTlVMTCAqLworI2VuZGlmCQkJCS8qIE5VTEwgKi8KIAogI2lmbmRlZiBPRkZTRVRPRgogI2RlZmluZSBPRkZTRVRPRihfcywgX20pICAgIChNTV9VSU5UX1BUUigmKCgoX3MgKikgMCktPl9tKSkpCi0jZW5kaWYgLyogT0ZGU0VUT0YgKi8KLQorI2VuZGlmCQkJCS8qIE9GRlNFVE9GICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTaW1wbGUgbWFjcm9zLiAqLwpAQCAtMTAwLDI2ICs5NywyNCBAQAogICAgICgodW5zaWduZWQgY2hhciAqKSAoX0RzdCkpWzRdID0gKCh1bnNpZ25lZCBjaGFyICopIChfU3JjKSlbNF07ICAgICAgICAgIFwKICAgICAoKHVuc2lnbmVkIGNoYXIgKikgKF9Ec3QpKVs1XSA9ICgodW5zaWduZWQgY2hhciAqKSAoX1NyYykpWzVdOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBDb25zdGFudHMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIEVUSEVSTkVUX0FERFJFU1NfU0laRSAgICAgICAgICAgNgogI2RlZmluZSBFVEhFUk5FVF9QQUNLRVRfSEVBREVSX1NJWkUgICAgIDE0Ci0jZGVmaW5lIE1JTl9FVEhFUk5FVF9QQUNLRVRfU0laRSAgICAgICAgNjQgICAgICAvKiB3aXRoIDQgYnl0ZSBjcmMuICovCi0jZGVmaW5lIE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRSAgICAgICAgMTUxOCAgICAvKiB3aXRoIDQgYnl0ZSBjcmMuICovCisjZGVmaW5lIE1JTl9FVEhFUk5FVF9QQUNLRVRfU0laRSAgICAgICAgNjQJLyogd2l0aCA0IGJ5dGUgY3JjLiAqLworI2RlZmluZSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkUgICAgICAgIDE1MTgJLyogd2l0aCA0IGJ5dGUgY3JjLiAqLwogI2RlZmluZSBNSU5fRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDIDYwCiAjZGVmaW5lIE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkMgMTUxNAotI2RlZmluZSBNQVhfRVRIRVJORVRfUEFDS0VUX0JVRkZFUl9TSVpFIDE1MzYgICAgLyogQSBuaWNlIGV2ZW4gbnVtYmVyLiAqLworI2RlZmluZSBNQVhfRVRIRVJORVRfUEFDS0VUX0JVRkZFUl9TSVpFIDE1MzYJLyogQSBuaWNlIGV2ZW4gbnVtYmVyLiAqLwogCiAjaWZuZGVmIExNX01BWF9NQ19UQUJMRV9TSVpFCiAjZGVmaW5lIExNX01BWF9NQ19UQUJMRV9TSVpFICAgICAgICAgICAgMzIKLSNlbmRpZiAvKiBMTV9NQVhfTUNfVEFCTEVfU0laRSAqLworI2VuZGlmCQkJCS8qIExNX01BWF9NQ19UQUJMRV9TSVpFICovCiAjZGVmaW5lIExNX01DX0VOVFJZX1NJWkUgICAgICAgICAgICAgICAgKEVUSEVSTkVUX0FERFJFU1NfU0laRSsxKQogI2RlZmluZSBMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWCAgICAgIChMTV9NQ19FTlRSWV9TSVpFLTEpCiAKLQogLyogUmVjZWl2ZSBmaWx0ZXIgbWFza3MuICovCiAjZGVmaW5lIExNX0FDQ0VQVF9VTklDQVNUICAgICAgICAgICAgICAgMHgwMDAxCiAjZGVmaW5lIExNX0FDQ0VQVF9NVUxUSUNBU1QgICAgICAgICAgICAgMHgwMDAyCkBAIC0xMjksNyArMTI0LDYgQEAKIAogI2RlZmluZSBMTV9QUk9NSVNDVU9VU19NT0RFICAgICAgICAgICAgIDB4MTAwMDAKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUENJIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjksMjAgKzE2MywyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIExNX1VJTlQzMiBGcmFnU2l6ZTsKLSAgICBMTV9QSFlTSUNBTF9BRERSRVNTIEZyYWdCdWY7CisJTE1fVUlOVDMyIEZyYWdTaXplOworCUxNX1BIWVNJQ0FMX0FERFJFU1MgRnJhZ0J1ZjsKIH0gTE1fRlJBRywgKlBMTV9GUkFHOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogRnJhZ0NvdW50IGlzIGluaXRpYWxpemVkIGZvciB0aGUgY2FsbGVyIHRvIHRoZSBtYXhpbXVtIGFycmF5IHNpemUsIG9uICovCi0gICAgLyogcmV0dXJuIEZyYWdDb3VudCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBhY3R1YWwgZnJhZ21lbnRzIGluIHRoZSBhcnJheS4gKi8KLSAgICBMTV9VSU5UMzIgRnJhZ0NvdW50OworCS8qIEZyYWdDb3VudCBpcyBpbml0aWFsaXplZCBmb3IgdGhlIGNhbGxlciB0byB0aGUgbWF4aW11bSBhcnJheSBzaXplLCBvbiAqLworCS8qIHJldHVybiBGcmFnQ291bnQgaXMgdGhlIG51bWJlciBvZiB0aGUgYWN0dWFsIGZyYWdtZW50cyBpbiB0aGUgYXJyYXkuICovCisJTE1fVUlOVDMyIEZyYWdDb3VudDsKIAotICAgIC8qIFRvdGFsIGJ1ZmZlciBzaXplLiAqLwotICAgIExNX1VJTlQzMiBUb3RhbFNpemU7CisJLyogVG90YWwgYnVmZmVyIHNpemUuICovCisJTE1fVUlOVDMyIFRvdGFsU2l6ZTsKIAotICAgIC8qIEZyYWdtZW50IGFycmF5IGJ1ZmZlci4gKi8KLSAgICBMTV9GUkFHIEZyYWdtZW50c1sxXTsKKwkvKiBGcmFnbWVudCBhcnJheSBidWZmZXIuICovCisJTE1fRlJBRyBGcmFnbWVudHNbMV07CiB9IExNX0ZSQUdfTElTVCwgKlBMTV9GUkFHX0xJU1Q7CiAKICNkZWZpbmUgREVDTEFSRV9GUkFHX0xJU1RfQlVGRkVSX1RZUEUoX0ZSQUdfTElTVF9UWVBFX05BTUUsIF9NQVhfRlJBR19DT1VOVCkgXApAQCAtMTkxLDcgKzE4NSw2IEBACiAJTE1fRlJBRyBGcmFnTGlzdEJ1ZmZlcltfTUFYX0ZSQUdfQ09VTlQtMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gX0ZSQUdfTElTVF9UWVBFX05BTUUsICpQIyNfRlJBR19MSVNUX1RZUEVfTkFNRQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTdGF0dXMgY29kZXMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjE3LDcgKzIxMCw2IEBACiAKIHR5cGVkZWYgTE1fVUlOVCBMTV9TVEFUVVMsICpQTE1fU1RBVFVTOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZXF1ZXN0ZWQgbWVkaWEgdHlwZS4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDAsNyArMjMyLDYgQEAKIAogdHlwZWRlZiBMTV9VSU5UMzIgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUsICpQTE1fUkVRVUVTVEVEX01FRElBX1RZUEU7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE1lZGlhIHR5cGUuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjU0LDcgKzI0NSw2IEBACiAKIHR5cGVkZWYgTE1fVUlOVDMyIExNX01FRElBX1RZUEUsICpQTE1fTUVESUFfVFlQRTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTGluZSBzcGVlZC4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNjYsNyArMjU2LDYgQEAKIAogdHlwZWRlZiBMTV9VSU5UMzIgTE1fTElORV9TUEVFRCwgKlBMTV9MSU5FX1NQRUVEOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEdXBsZXggbW9kZS4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNzcsNyArMjY2LDYgQEAKIAogdHlwZWRlZiBMTV9VSU5UMzIgTE1fRFVQTEVYX01PREUsICpQTE1fRFVQTEVYX01PREU7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFBvd2VyIHN0YXRlLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI4OSw3ICsyNzcsNiBAQAogCiB0eXBlZGVmIExNX1VJTlQzMiBMTV9QT1dFUl9TVEFURSwgKlBMTV9QT1dFUl9TVEFURTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVGFzayBvZmZsb2FkaW5nLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMwNSw3ICsyOTIsNiBAQAogCiB0eXBlZGVmIExNX1VJTlQzMiBMTV9UQVNLX09GRkxPQUQsICpQTE1fVEFTS19PRkZMT0FEOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGbG93IGNvbnRyb2wuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzI0LDcgKzMxMCw2IEBACiAKIHR5cGVkZWYgTE1fVUlOVDMyIExNX0ZMT1dfQ09OVFJPTCwgKlBMTV9GTE9XX0NPTlRST0w7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFdha2UgdXAgbW9kZS4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMzYsNyArMzIxLDYgQEAKIAogdHlwZWRlZiBMTV9VSU5UMzIgTE1fV0FLRV9VUF9NT0RFLCAqUExNX1dBS0VfVVBfTU9ERTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQ291bnRlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzYyLDcgKzM0Niw2IEBACiAKIHR5cGVkZWYgTE1fVUlOVDMyIExNX0NPVU5URVJfVFlQRSwgKlBMTV9DT1VOVEVSX1RZUEU7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvcndhcmQgZGVmaW5pdGlvbi4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNzAsODIgKzM1Myw4MiBAQAogdHlwZWRlZiBzdHJ1Y3QgX0xNX0RFVklDRV9CTE9DSyAqUExNX0RFVklDRV9CTE9DSzsKIHR5cGVkZWYgc3RydWN0IF9MTV9QQUNLRVQgKlBMTV9QQUNLRVQ7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MTV9TVEFUVVMgTE1fR2V0QWRhcHRlckluZm8oUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBMTV9Jbml0aWFsaXplQWRhcHRlcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX1Jlc2V0QWRhcHRlcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX0Rpc2FibGVJbnRlcnJ1cHQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBMTV9FbmFibGVJbnRlcnJ1cHQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBMTV9TZW5kUGFja2V0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKLUxNX1NUQVRVUyBMTV9TZXJ2aWNlSW50ZXJydXB0cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX1F1ZXVlUnhQYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fU2V0UmVjZWl2ZU1hc2soUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWFzayk7Ci1MTV9TVEFUVVMgTE1fSGFsdChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX0Fib3J0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fTXVsdGljYXN0QWRkKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBNY0FkZHJlc3MpOwotTE1fU1RBVFVTIExNX011bHRpY2FzdERlbChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwTWNBZGRyZXNzKTsKLUxNX1NUQVRVUyBMTV9NdWx0aWNhc3RDbGVhcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX1NldE1hY0FkZHJlc3MoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcE1hY0FkZHJlc3MpOwotTE1fU1RBVFVTIExNX0xvb3BiYWNrQWRkcmVzcyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwQWRkcmVzcyk7CitMTV9TVEFUVVMgTE1fR2V0QWRhcHRlckluZm8gKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fSW5pdGlhbGl6ZUFkYXB0ZXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fUmVzZXRBZGFwdGVyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX0Rpc2FibGVJbnRlcnJ1cHQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fRW5hYmxlSW50ZXJydXB0IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX1NlbmRQYWNrZXQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKK0xNX1NUQVRVUyBMTV9TZXJ2aWNlSW50ZXJydXB0cyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9RdWV1ZVJ4UGFja2V0cyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9TZXRSZWNlaXZlTWFzayAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWFzayk7CitMTV9TVEFUVVMgTE1fSGFsdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9BYm9ydCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9NdWx0aWNhc3RBZGQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBNY0FkZHJlc3MpOworTE1fU1RBVFVTIExNX011bHRpY2FzdERlbCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcE1jQWRkcmVzcyk7CitMTV9TVEFUVVMgTE1fTXVsdGljYXN0Q2xlYXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fU2V0TWFjQWRkcmVzcyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcE1hY0FkZHJlc3MpOworTE1fU1RBVFVTIExNX0xvb3BiYWNrQWRkcmVzcyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcEFkZHJlc3MpOwogCi1MTV9VSU5UMzIgTE1fR2V0Q3JjQ291bnRlcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fVUlOVDMyIExNX0dldENyY0NvdW50ZXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CiAKLUxNX1dBS0VfVVBfTU9ERSBMTV9QTUNhcGFiaWxpdGllcyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX053dWZBZGQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQnl0ZU1hc2tTaXplLAotICAgIExNX1VJTlQ4ICpwQnl0ZU1hc2ssIExNX1VJTlQ4ICpwUGF0dGVybik7Ci1MTV9TVEFUVVMgTE1fTnd1ZlJlbW92ZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCeXRlTWFza1NpemUsCi0gICAgTE1fVUlOVDggKnBCeXRlTWFzaywgTE1fVUlOVDggKnBQYXR0ZXJuKTsKLUxNX1NUQVRVUyBMTV9TZXRQb3dlclN0YXRlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fUE9XRVJfU1RBVEUgUG93ZXJMZXZlbCk7CitMTV9XQUtFX1VQX01PREUgTE1fUE1DYXBhYmlsaXRpZXMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fTnd1ZkFkZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQnl0ZU1hc2tTaXplLAorCQkgICAgICBMTV9VSU5UOCAqIHBCeXRlTWFzaywgTE1fVUlOVDggKiBwUGF0dGVybik7CitMTV9TVEFUVVMgTE1fTnd1ZlJlbW92ZSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQnl0ZU1hc2tTaXplLAorCQkJIExNX1VJTlQ4ICogcEJ5dGVNYXNrLCBMTV9VSU5UOCAqIHBQYXR0ZXJuKTsKK0xNX1NUQVRVUyBMTV9TZXRQb3dlclN0YXRlIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkgICAgTE1fUE9XRVJfU1RBVEUgUG93ZXJMZXZlbCk7CiAKLUxNX1ZPSUQgTE1fUmVhZFBoeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBQaHlSZWcsCi0gICAgUExNX1VJTlQzMiBwRGF0YTMyKTsKLUxNX1ZPSUQgTE1fV3JpdGVQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUGh5UmVnLAotICAgIExNX1VJTlQzMiBEYXRhMzIpOworTE1fVk9JRCBMTV9SZWFkUGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBQaHlSZWcsCisJCSAgICBQTE1fVUlOVDMyIHBEYXRhMzIpOworTE1fVk9JRCBMTV9Xcml0ZVBoeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUGh5UmVnLAorCQkgICAgIExNX1VJTlQzMiBEYXRhMzIpOwogCi1MTV9TVEFUVVMgTE1fQ29udHJvbExvb3BCYWNrKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIENvbnRyb2wpOwotTE1fU1RBVFVTIExNX1NldHVwUGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1pbnQgTE1fQmxpbmtMRUQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxpbmtEdXJhdGlvbik7Ci0KK0xNX1NUQVRVUyBMTV9Db250cm9sTG9vcEJhY2sgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIENvbnRyb2wpOworTE1fU1RBVFVTIExNX1NldHVwUGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworaW50IExNX0JsaW5rTEVEIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbGlua0R1cmF0aW9uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFRoZXNlIGFyZSB0aGUgT1Mgc3BlY2lmaWMgZnVuY3Rpb25zIGNhbGxlZCBieSBMTUFDLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTE1fU1RBVFVTIE1NX1JlYWRDb25maWcxNihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsCi0gICAgTE1fVUlOVDE2ICpwVmFsdWUxNik7Ci1MTV9TVEFUVVMgTU1fV3JpdGVDb25maWcxNihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsCi0gICAgTE1fVUlOVDE2IFZhbHVlMTYpOwotTE1fU1RBVFVTIE1NX1JlYWRDb25maWczMihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsCi0gICAgTE1fVUlOVDMyICpwVmFsdWUzMik7Ci1MTV9TVEFUVVMgTU1fV3JpdGVDb25maWczMihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsCi0gICAgTE1fVUlOVDMyIFZhbHVlMzIpOwotTE1fU1RBVFVTIE1NX01hcE1lbUJhc2UoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBNTV9NYXBJb0Jhc2UoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBNTV9JbmRpY2F0ZVJ4UGFja2V0cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIE1NX0luZGljYXRlVHhQYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTU1fU3RhcnRUeERtYShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCk7Ci1MTV9TVEFUVVMgTU1fQ29tcGxldGVUeERtYShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCk7Ci1MTV9TVEFUVVMgTU1fQWxsb2NhdGVNZW1vcnkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxvY2tTaXplLAotICAgIFBMTV9WT0lEICpwTWVtb3J5QmxvY2tWaXJ0KTsKLUxNX1NUQVRVUyBNTV9BbGxvY2F0ZVNoYXJlZE1lbW9yeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbG9ja1NpemUsCi0gICAgUExNX1ZPSUQgKnBNZW1vcnlCbG9ja1ZpcnQsIFBMTV9QSFlTSUNBTF9BRERSRVNTIHBNZW1vcnlCbG9ja1BoeSwKLSAgICBMTV9CT09MIENhY2hlZCk7Ci1MTV9TVEFUVVMgTU1fR2V0Q29uZmlnKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTU1fSW5kaWNhdGVTdGF0dXMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9TVEFUVVMgU3RhdHVzKTsKLUxNX1NUQVRVUyBNTV9Jbml0aWFsaXplVW1QYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTU1fRnJlZVJ4QnVmZmVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKLUxNX1NUQVRVUyBNTV9Db2FsZXNjZVR4QnVmZmVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKLUxNX1NUQVRVUyBMTV9NYnVmV29ya0Fyb3VuZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX1NldExpbmtTcGVlZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0JCQkgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSk7CitMTV9TVEFUVVMgTU1fUmVhZENvbmZpZzE2IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsCisJCQkgICBMTV9VSU5UMTYgKiBwVmFsdWUxNik7CitMTV9TVEFUVVMgTU1fV3JpdGVDb25maWcxNiAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgT2Zmc2V0LAorCQkJICAgIExNX1VJTlQxNiBWYWx1ZTE2KTsKK0xNX1NUQVRVUyBNTV9SZWFkQ29uZmlnMzIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKKwkJCSAgIExNX1VJTlQzMiAqIHBWYWx1ZTMyKTsKK0xNX1NUQVRVUyBNTV9Xcml0ZUNvbmZpZzMyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsCisJCQkgICAgTE1fVUlOVDMyIFZhbHVlMzIpOworTE1fU1RBVFVTIE1NX01hcE1lbUJhc2UgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTU1fTWFwSW9CYXNlIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIE1NX0luZGljYXRlUnhQYWNrZXRzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIE1NX0luZGljYXRlVHhQYWNrZXRzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIE1NX1N0YXJ0VHhEbWEgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKK0xNX1NUQVRVUyBNTV9Db21wbGV0ZVR4RG1hIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCk7CitMTV9TVEFUVVMgTU1fQWxsb2NhdGVNZW1vcnkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsb2NrU2l6ZSwKKwkJCSAgICAgUExNX1ZPSUQgKiBwTWVtb3J5QmxvY2tWaXJ0KTsKK0xNX1NUQVRVUyBNTV9BbGxvY2F0ZVNoYXJlZE1lbW9yeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkJCSAgIExNX1VJTlQzMiBCbG9ja1NpemUsCisJCQkJICAgUExNX1ZPSUQgKiBwTWVtb3J5QmxvY2tWaXJ0LAorCQkJCSAgIFBMTV9QSFlTSUNBTF9BRERSRVNTIHBNZW1vcnlCbG9ja1BoeSwKKwkJCQkgICBMTV9CT09MIENhY2hlZCk7CitMTV9TVEFUVVMgTU1fR2V0Q29uZmlnIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIE1NX0luZGljYXRlU3RhdHVzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1NUQVRVUyBTdGF0dXMpOworTE1fU1RBVFVTIE1NX0luaXRpYWxpemVVbVBhY2tldHMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTU1fRnJlZVJ4QnVmZmVyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCk7CitMTV9TVEFUVVMgTU1fQ29hbGVzY2VUeEJ1ZmZlciAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpOworTE1fU1RBVFVTIExNX01idWZXb3JrQXJvdW5kIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX1NldExpbmtTcGVlZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkJICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlKTsKIAogI2lmIElOQ0xVREVfNTcwM19BMF9GSVgKLUxNX1NUQVRVUyBMTV9Mb2FkNTcwM0RtYVdGaXJtd2FyZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX0xvYWQ1NzAzRG1hV0Zpcm13YXJlIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwogI2VuZGlmCiAKLQotI2VuZGlmIC8qIExNX0ggKi8KKyNlbmRpZgkJCQkvKiBMTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbTU3MHhfbW0uaCBiL2RyaXZlcnMvYmNtNTcweF9tbS5oCmluZGV4IGI3Y2JmOGEuLmZmNTMwMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtNTcweF9tbS5oCisrKyBiL2RyaXZlcnMvYmNtNTcweF9tbS5oCkBAIC00NSw3ICs0NSw3IEBACiAKICNkZWZpbmUgTU1fUEFDS0VUX0RFU0NfU0laRSBNTV9QYWNrZXRfRGVzY19TaXplCiAKLURFQ0xBUkVfUVVFVUVfVFlQRShVTV9SWF9QQUNLRVRfUSwgTUFYX1JYX1BBQ0tFVF9ERVNDX0NPVU5UKzEpOworREVDTEFSRV9RVUVVRV9UWVBFIChVTV9SWF9QQUNLRVRfUSwgTUFYX1JYX1BBQ0tFVF9ERVNDX0NPVU5UICsgMSk7CiAKICNkZWZpbmUgTUFYX01FTSAxNgogCkBAIC02NSw1MSArNjUsNTAgQEAKIAlpbnQgbXR1OwogCWludCBpbmRleDsKIAlpbnQgb3BlbmVkOwotCWludCBkZWxheWVkX2xpbmtfaW5kOyAvKiBEZWxheSBsaW5rIHN0YXR1cyBkdXJpbmcgaW5pdGlhbCBsb2FkICovCi0JaW50IGFkYXB0ZXJfanVzdF9pbml0ZWQ7IC8qIHRoZSBmaXJzdCBmZXcgc2Vjb25kcyBhZnRlciBpbml0LiAqLwotCWludCBzcHVyaW91c19pbnQ7ICAgICAgICAgICAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisJaW50IGRlbGF5ZWRfbGlua19pbmQ7CS8qIERlbGF5IGxpbmsgc3RhdHVzIGR1cmluZyBpbml0aWFsIGxvYWQgKi8KKwlpbnQgYWRhcHRlcl9qdXN0X2luaXRlZDsJLyogdGhlIGZpcnN0IGZldyBzZWNvbmRzIGFmdGVyIGluaXQuICovCisJaW50IHNwdXJpb3VzX2ludDsJLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCiAJaW50IHRpbWVyX2ludGVydmFsOwogCWludCBhZGFwdGl2ZV9leHBpcnk7Ci0JaW50IGNyY19jb3VudGVyX2V4cGlyeTsgICAgICAgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KLQlpbnQgcG9sbF90aWJfZXhwaXJ5OyAgICAgICAgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLworCWludCBjcmNfY291bnRlcl9leHBpcnk7CS8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLworCWludCBwb2xsX3RpYl9leHBpcnk7CS8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLwogCWludCB0eF9mdWxsOwogCWludCB0eF9xdWV1ZWQ7CiAJaW50IGxpbmVfc3BlZWQ7CQkvKiBpbiBNYnBzLCAwIGlmIGxpbmsgaXMgZG93biAqLwogCVVNX1JYX1BBQ0tFVF9RIHJ4X291dF9vZl9idWZfcTsKIAlpbnQgcnhfb3V0X29mX2J1ZjsKLQlpbnQgcnhfbG93X2J1Zl90aHJlc2g7IC8qIGNoYW5nZWQgdG8gcnhfYnVmX3JlcGxfdGhyZXNoICovCisJaW50IHJ4X2xvd19idWZfdGhyZXNoOwkvKiBjaGFuZ2VkIHRvIHJ4X2J1Zl9yZXBsX3RocmVzaCAqLwogCWludCByeF9idWZfcmVwbF9wYW5pY190aHJlc2g7Ci0JaW50IHJ4X2J1Zl9hbGlnbjsgICAgICAgICAgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KKwlpbnQgcnhfYnVmX2FsaWduOwkvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KIAlpbnQgZG9fZ2xvYmFsX2xvY2s7CiAJbXV0ZXhfdCBnbG9iYWxfbG9jazsKIAltdXRleF90IHVuZGlfbG9jazsKIAlsb25nIHVuZGlfZmxhZ3M7CiAJdm9sYXRpbGUgaW50IGludGVycnVwdDsKIAlpbnQgdGFza2xldF9wZW5kaW5nOwotCWludCB0YXNrbGV0X2J1c3k7CSAgICAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisJaW50IHRhc2tsZXRfYnVzeTsJLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCiAJaW50IHJ4X3BrdDsKIAlpbnQgdHhfcGt0OwotI2lmZGVmIE5JQ0VfU1VQUE9SVCAgIC8qIHVuc3VwcG9ydGVkLCB0aGlzIGlzIGEgbGludXggaW9jdGwgKi8KLQl2b2lkICgqbmljZV9yeCkodm9pZCosIHZvaWQqICk7Ci0Jdm9pZCogbmljZV9jdHg7Ci0jZW5kaWYgLyogTklDRV9TVVBQT1JUICovCisjaWZkZWYgTklDRV9TVVBQT1JUCQkvKiB1bnN1cHBvcnRlZCwgdGhpcyBpcyBhIGxpbnV4IGlvY3RsICovCisJdm9pZCAoKm5pY2VfcngpICh2b2lkICosIHZvaWQgKik7CisJdm9pZCAqbmljZV9jdHg7CisjZW5kaWYJCQkJLyogTklDRV9TVVBQT1JUICovCiAJaW50IHJ4X2FkYXB0aXZlX2NvYWxlc2NlOwogCXVuc2lnbmVkIGludCByeF9sYXN0X2NudDsKIAl1bnNpZ25lZCBpbnQgdHhfbGFzdF9jbnQ7CiAJdW5zaWduZWQgaW50IHJ4X2N1cnJfY29hbGVzY2VfZnJhbWVzOwogCXVuc2lnbmVkIGludCByeF9jdXJyX2NvYWxlc2NlX3RpY2tzOwotCXVuc2lnbmVkIGludCB0eF9jdXJyX2NvYWxlc2NlX2ZyYW1lczsgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLwotI2lmIFRJR09OM19ERUJVRyAgICAgICAgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgdHhfY3Vycl9jb2FsZXNjZV9mcmFtZXM7CS8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLworI2lmIFRJR09OM19ERUJVRwkJLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCiAJdWludCB0eF96Y19jb3VudDsKIAl1aW50IHR4X2Noa3N1bV9jb3VudDsKIAl1aW50IHR4X2hpbWVtX2NvdW50OwogCXVpbnQgcnhfZ29vZF9jaGtzdW1fY291bnQ7CiAjZW5kaWYKLQl1bnNpZ25lZCBpbnQgcnhfYmFkX2Noa3N1bV9jb3VudDsgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KLQl1bnNpZ25lZCBpbnQgcnhfbWlzY19lcnJvcnM7ICAgICAgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgcnhfYmFkX2Noa3N1bV9jb3VudDsJLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisJdW5zaWduZWQgaW50IHJ4X21pc2NfZXJyb3JzOwkvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KIH0gVU1fREVWSUNFX0JMT0NLLCAqUFVNX0RFVklDRV9CTE9DSzsKIAotCiAvKiBQaHlzaWNhbC9QQ0kgRE1BIGFkZHJlc3MgKi8KIHR5cGVkZWYgdW5pb24gewogCWRtYV9hZGRyX3QgZG1hX21hcDsKQEAgLTExNyw5ICsxMTYsOSBAQAogCiAvKiBQYWNrZXQgKi8KIHR5cGVkZWYgc3RydWN0Ci1fVU1fUEFDS0VUIHsKLSAgICBMTV9QQUNLRVQgbG1fcGFja2V0OwotICAgIHZvaWQqIHNrYnVmZjsgICAgICAvKiBBZGRyZXNzIG9mIHBhY2tldCBidWZmZXIgKi8KKyAgICBfVU1fUEFDS0VUIHsKKwlMTV9QQUNLRVQgbG1fcGFja2V0OworCXZvaWQgKnNrYnVmZjsJCS8qIEFkZHJlc3Mgb2YgcGFja2V0IGJ1ZmZlciAqLwogfSBVTV9QQUNLRVQsICpQVU1fUEFDS0VUOwogCiAjZGVmaW5lIE1NX0FDUVVJUkVfVU5ESV9MT0NLKF9wRGV2aWNlKQpAQCAtMTM3LDE1ICsxMzYsMTQgQEAKIAogI2RlZmluZSBNRU1fVE9fUENJX1BIWVMoYWRkcikgKGFkZHIpCiAKLWV4dGVybiB2b2lkIE1NX1NldEFkZHIgKExNX1BIWVNJQ0FMX0FERFJFU1MgKnBhZGRyLCBkbWFfYWRkcl90IGFkZHIpOwotZXh0ZXJuIHZvaWQgTU1fU2V0VDNBZGRyKFQzXzY0QklUX0hPU1RfQUREUiAqcGFkZHIsIGRtYV9hZGRyX3QgYWRkcik7CitleHRlcm4gdm9pZCBNTV9TZXRBZGRyIChMTV9QSFlTSUNBTF9BRERSRVNTICogcGFkZHIsIGRtYV9hZGRyX3QgYWRkcik7CitleHRlcm4gdm9pZCBNTV9TZXRUM0FkZHIgKFQzXzY0QklUX0hPU1RfQUREUiAqIHBhZGRyLCBkbWFfYWRkcl90IGFkZHIpOwogZXh0ZXJuIHZvaWQgTU1fTWFwVHhEbWEgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLQkJCSBzdHJ1Y3QgX0xNX1BBQ0tFVCAqcFBhY2tldCwgVDNfNjRCSVRfSE9TVF9BRERSICpwYWRkciwKLQkJCSBMTV9VSU5UMzIgKmxlbiwgaW50IGZyYWcpOwotZXh0ZXJuIHZvaWQgTU1fTWFwUnhEbWEgKCBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0JCQkgIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LAotCQkJICBUM182NEJJVF9IT1NUX0FERFIgKnBhZGRyKTsKLQorCQkJIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LCBUM182NEJJVF9IT1NUX0FERFIgKiBwYWRkciwKKwkJCSBMTV9VSU5UMzIgKiBsZW4sIGludCBmcmFnKTsKK2V4dGVybiB2b2lkIE1NX01hcFJ4RG1hIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkgc3RydWN0IF9MTV9QQUNLRVQgKnBQYWNrZXQsCisJCQkgVDNfNjRCSVRfSE9TVF9BRERSICogcGFkZHIpOwogCiAvKiBCU1AgbmVlZHMgdG8gcHJvdmlkZSBzeXNVc2VjRGVsYXkgYW5kIHN5c1NlcmlhbFByaW50U3RyaW5nICovCiBleHRlcm4gdm9pZCBzeXNTZXJpYWxQcmludFN0cmluZyAoY2hhciAqcyk7CkBAIC0xNTcsNCArMTU1LDQgQEAKICNpZiAwCiAjZGVmaW5lIGNwdV90b19sZTMyKHZhbCkgTE9OR1NXQVAodmFsKQogI2VuZGlmCi0jZW5kaWYgLyogTU1fSCAqLworI2VuZGlmCQkJCS8qIE1NX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9NYWtlZmlsZSBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODZlODNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL01ha2VmaWxlCkBAIC0wLDAgKzEsMzAgQEAKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIgOj0gJChvYmopbGliYXRpYmlvc2VtdS5hCisKK1g4NkRJUiAgPSAuL3g4NmVtdQorCitPQkpTCT0gYXRpYmlvcy5vIGJpb3NlbXUubyBiZXN5cy5vIGJpb3MubyAgXAorCSQoWDg2RElSKS9kZWNvZGUubyBcCisJJChYODZESVIpL29wczIubyBcCisJJChYODZESVIpL29wcy5vIFwKKwkkKFg4NkRJUikvcHJpbV9vcHMubyBcCisJJChYODZESVIpL3N5cy5vIFwKKwkkKFg4NkRJUikvZGVidWcubworCitDRkxBR1MgKz0gLUkuIC1JLi9pbmNsdWRlICAtSSQoWDg2RElSKSAtSSQoVE9QRElSKS9pbmNsdWRlIFwKKwktRF9fUFBDX18gIC1EX19CSUdfRU5ESUFOX18KKworYWxsOgkkKExJQikKKworJChMSUIpOiAkKE9CSlMpCisJJChBUikgY3J2ICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisuZGVwZW5kOglNYWtlZmlsZSAkKE9CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKE9CSlM6Lm89LmMpID4gJEAKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYXRpYmlvcy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2F0aWJpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc5Zjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2F0aWJpb3MuYwpAQCAtMCwwICsxLDM0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCSAgICAgVmlkZW8gQk9PVCBHcmFwaGljcyBDYXJkIFBPU1QgTW9kdWxlCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogICBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorKgorKiAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogICBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisqICAgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgYXBwZWFyaW5nIGluIHRoZSBmaWxlIExJQ0VOU0UuR1BMIGluY2x1ZGVkCisqICAgaW4gdGhlIHBhY2thZ2luZyBvZiB0aGlzIGZpbGUuCisqCisqICAgTGljZW5zZWVzIGhvbGRpbmcgYSB2YWxpZCBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIHRoaXMgcHJvZHVjdCBmcm9tCisqICAgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBtYXkgdXNlIHRoaXMgZmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisqICAgQ29tbWVyY2lhbCBMaWNlbnNlIEFncmVlbWVudCBwcm92aWRlZCB3aXRoIHRoZSBTb2Z0d2FyZS4KKyoKKyogICBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgQVMgSVMgd2l0aCBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCwgSU5DTFVESU5HCisqICAgVEhFIFdBUlJBTlRZIE9GIERFU0lHTiwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyogICBQVVJQT1NFLgorKgorKiAgIFNlZSBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9saWNlbnNlLyBmb3IgaW5mb3JtYXRpb24gYWJvdXQKKyogICB0aGUgbGljZW5zaW5nIG9wdGlvbnMgYXZhaWxhYmxlIGFuZCBob3cgdG8gcHVyY2hhc2UgYSBDb21tZXJjaWFsCisqICAgTGljZW5zZSBBZ3JlZW1lbnQuCisqCisqICAgQ29udGFjdCBsaWNlbnNlQHNjaXRlY2hzb2Z0LmNvbSBpZiBhbnkgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2luZworKiAgIGFyZSBub3QgY2xlYXIgdG8geW91LCBvciB5b3UgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgbGljZW5zaW5nIG9wdGlvbnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJTGludXggS2VybmVsCisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglNb2R1bGUgdG8gaW1wbGVtZW50IGJvb3RpbmcgUENJL0FHUCBjb250cm9sbGVycyBvbiB0aGUKKyoJCWJ1cy4gV2UgdXNlIHRoZSB4ODYgcmVhbCBtb2RlIGVtdWxhdG9yIHRvIHJ1biB0aGUgQklPUyBvbgorKgkJZ3JhcGhpY3MgY29udHJvbGxlcnMgdG8gYnJpbmcgdGhlIGNhcmRzIHVwLgorKgorKgkJTm90ZSB0aGF0IGF0IHByZXNlbnQgdGhpcyBtb2R1bGUgZG9lcyAqbm90KiBzdXBwb3J0CisqCQltdWx0aXBsZSBjb250cm9sbGVycy4KKyoKKyoJCVRoZSBvcmlnbmFsIG5hbWUgb2YgdGhpcyBmaWxlIGlzIHdhcm1ib290LmMuCisqCQlKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdCB0byBydW4gdGhlIEFUSSB2aWRlbyBjYXJkCisqCQlCSU9TIGluIHUtYm9vdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfQklPU0VNVQorCisjaW5jbHVkZSAiYmlvc2VtdWkuaCIKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworLyogTGVuZ3RoIG9mIHRoZSBCSU9TIGltYWdlICovCisjZGVmaW5lIE1BWF9CSU9TTEVOCSAgICAoMTI4ICogMTAyNEwpCisKKy8qIERlZmluZSBzb21lIHVzZWZ1bCB0eXBlcyBhbmQgbWFjcm9zICovCisjZGVmaW5lIHRydWUJCSAgICAxCisjZGVmaW5lIGZhbHNlCQkgICAgMAorCisvKiBQbGFjZSB0byBzYXZlIFBDSSBCQVIncyB0aGF0IHdlIGNoYW5nZSBhbmQgbGF0ZXIgcmVzdG9yZSAqLworc3RhdGljIHUzMiBzYXZlUk9NQmFzZUFkZHJlc3M7CitzdGF0aWMgdTMyIHNhdmVCYXNlQWRkcmVzczEwOworc3RhdGljIHUzMiBzYXZlQmFzZUFkZHJlc3MxNDsKK3N0YXRpYyB1MzIgc2F2ZUJhc2VBZGRyZXNzMTg7CitzdGF0aWMgdTMyIHNhdmVCYXNlQWRkcmVzczIwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BjaWRldgktIFBDSSBkZXZpY2UgaW5mbyBmb3IgdGhlIHZpZGVvIGNhcmQgb24gdGhlIGJ1cyB0byBib290CitWR0FJbmZvIC0gQklPUyBlbXVsYXRvciBWR0EgaW5mbyBzdHJ1Y3R1cmUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIEJJT1MgUE9TVCBjb2RlIG9uIHRoZSBjb250cm9sbGVyLiBXZSBhc3N1bWUgdGhhdAorYXQgdGhpcyBzdGFnZSB0aGUgY29udHJvbGxlciBoYXMgaXRzIEkvTyBhbmQgbWVtb3J5IHNwYWNlIGVuYWJsZWQgYW5kCit0aGF0IGFsbCBvdGhlciBjb250cm9sbGVycyBhcmUgaW4gYSBkaXNhYmxlZCBzdGF0ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBQQ0lfZG9CSU9TUE9TVChwY2lfZGV2X3QgcGNpZGV2LCBCRV9WR0FJbmZvICogVkdBSW5mbykKK3sKKwlSTVJFR1MgcmVnczsKKwlSTVNSRUdTIHNyZWdzOworCisJLyogRGV0ZXJtaW5lIHRoZSB2YWx1ZSB0byBzdG9yZSBpbiBBWCBmb3IgQklPUyBQT1NULiBQZXIgdGhlIFBDSSBzcGVjcywKKwkgQUggbXVzdCBjb250YWluIHRoZSBidXMgYW5kIEFMIG11c3QgY29udGFpbiB0aGUgZGV2Zm4sIGVuY29kZWQgYXMKKwkgKGRldiA8PCAzKSB8IGZuCisJICovCisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOworCW1lbXNldCgmc3JlZ3MsIDAsIHNpemVvZihzcmVncykpOworCXJlZ3MueC5heCA9ICgoaW50KVBDSV9CVVMocGNpZGV2KSA8PCA4KSB8CisJICAgICgoaW50KVBDSV9ERVYocGNpZGV2KSA8PCAzKSB8IChpbnQpUENJX0ZVTkMocGNpZGV2KTsKKworCS8qU2V0dXAgdGhlIFg4NiBlbXVsYXRvciBmb3IgdGhlIFZHQSBCSU9TKi8KKwlCRV9zZXRWR0EoVkdBSW5mbyk7CisKKwkvKkV4ZWN1dGUgdGhlIEJJT1MgUE9TVCBjb2RlKi8KKwlCRV9jYWxsUmVhbE1vZGUoMHhDMDAwLCAweDAwMDMsICZyZWdzLCAmc3JlZ3MpOworCisJLypDbGVhbnVwIGFuZCBleGl0Ki8KKwlCRV9nZXRWR0EoVkdBSW5mbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGNpZGV2CS0gUENJIGRldmljZSBpbmZvIGZvciB0aGUgdmlkZW8gY2FyZCBvbiB0aGUgYnVzCitiYXIJLSBQbGFjZSB0byByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciBvZmZzZXQgdG8gdXNlCisKK1JFVFVSTlM6CitUaGUgYWRkcmVzcyB0byB1c2UgdG8gbWFwIHRoZSBzZWNvbmRhcnkgQklPUyAoQUdQIGRldmljZXMpCisKK1JFTUFSS1M6CitTZWFyY2hlcyBhbGwgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIGZvciB0aGUgZGV2aWNlIGxvb2tpbmcgZm9yIGEKK21lbW9yeSBtYXBwaW5nIHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3VyIFJPTSBCSU9TLiBXZSB1c3VhbGx5IGVuZCB1cAorZmluZGluZyB0aGUgZnJhbWVidWZmZXIgbWFwcGluZyAodXN1YWxseSBCQVIgMHgxMCksIGFuZCB3ZSB1c2UgdGhpcyBtYXBwaW5nCit0byBtYXAgdGhlIEJJT1MgZm9yIHRoZSBkZXZpY2UgaW50by4gV2UgdXNlIGEgbWFwcGluZyB0aGF0IGlzIGFscmVhZHkKK2Fzc2lnbmVkIHRvIHRoZSBkZXZpY2UgdG8gZW5zdXJlIHRoZSBtZW1vcnkgcmFuZ2Ugd2lsbCBiZSBwYXNzZWQgdGhyb3VnaAorYnkgYW55IFBDSS0+UENJIG9yIEFHUC0+UENJIGJyaWRnZSB0aGF0IG1heSBiZSBwcmVzZW50LgorCitOT1RFOiBVc3VhbGx5IHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBBR1AgZGV2aWNlcywgYnV0IGl0IG1heSBiZQorICAgICAgdXNlZCBmb3IgUENJIGRldmljZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBQT1NUJ2VkIGFuZCB0aGUgQklPUworICAgICAgUk9NIGJhc2UgYWRkcmVzcyBoYXMgYmVlbiB6ZXJvJ2VkIG91dC4KKworTk9URTogVGhpcyBmdW5jdGlvbiBsZWF2ZXMgdGhlIG9yaWdpbmFsIG1lbW9yeSBhcGVydHVyZSBkaXNhYmxlZCBieSBsZWF2aW5nCisgICAgICBpdCBwcm9ncmFtbWVkIHRvIGFsbCAxJ3MuIEl0IG11c3QgYmUgcmVzdG9yZWQgdG8gdGhlIGNvcnJlY3QgdmFsdWUKKyAgICAgIGxhdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1MzIgUENJX2ZpbmRCSU9TQWRkcihwY2lfZGV2X3QgcGNpZGV2LCBpbnQgKmJhcikKK3sKKwl1MzIgYmFzZSwgc2l6ZTsKKworCWZvciAoKmJhciA9IDB4MTA7ICpiYXIgPD0gMHgxNDsgKCpiYXIpICs9IDQpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgKmJhciwgJmJhc2UpOworCQlpZiAoIShiYXNlICYgMHgxKSkgeworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsICpiYXIsIDB4RkZGRkZGRkYpOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgKmJhciwgJnNpemUpOworCQkJc2l6ZSA9IH4oc2l6ZSAmIH4weEZGKSArIDE7CisJCQlpZiAoc2l6ZSA+PSBNQVhfQklPU0xFTikKKwkJCQlyZXR1cm4gYmFzZSAmIH4weEZGOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NvbWUgbm9uLXg4NiBMaW51eCBrZXJuZWxzIG1hcCBQQ0kgcmVsb2NhdGVhYmxlIEkvTyB0byB2YWx1ZXMgdGhhdAorYXJlIGFib3ZlIDY0Sywgd2hpY2ggd2lsbCBub3Qgd29yayB3aXRoIHRoZSBCSU9TIGltYWdlIHRoYXQgcmVxdWlyZXMKK3RoZSBvZmZzZXQgZm9yIHRoZSBJL08gcG9ydHMgdG8gYmUgYSBtYXhpbXVtIG9mIDE2LWJpdHMuIElkZWFsbHkKK3NvbWVvbmUgc2hvdWxkIGZpeCB0aGUga2VybmVsIHRvIG1hcCB0aGUgSS9PIHBvcnRzIGZvciBWR0EgY29tcGF0aWJsZQorZGV2aWNlcyB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiAob3IganVzdCBhbGwgSS9PIHBvcnRzIHNpbmNlIGl0IGlzCit1bmxpa2VseSB5b3UgY2FuIGhhdmUgZW5vdWdoIGRldmljZXMgaW4gdGhlIG1hY2hpbmUgdG8gdXNlIHVwIGFsbAorNjRLIG9mIHRoZSBJL08gc3BhY2UgLSBhIHRvdGFsIG9mIG1vcmUgdGhhbiAyNTYgY2FyZHMgd291bGQgYmUKK25lY2Vzc2FyeSkuCisKK0FueXdheSB0byBmaXggdGhpcyB3ZSBjaGFuZ2UgYWxsIEkvTyBtYXBwZWQgYmFzZSByZWdpc3RlcnMgYW5kCitjaG9wIG9mZiB0aGUgdG9wIGJpdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUENJX2ZpeHVwSU9iYXNlKHBjaV9kZXZfdCBwY2lkZXYsIGludCByZWcsIHUzMiAqIGJhc2UpCit7CisJaWYgKCgqYmFzZSAmIDB4MSkgJiYgKCpiYXNlID4gMHhGRkZFKSkgeworCQkqYmFzZSAmPSAweEZGRkY7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCByZWcsICpiYXNlKTsKKworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwY2lkZXYJLSBQQ0kgZGV2aWNlIGluZm8gZm9yIHRoZSB2aWRlbyBjYXJkIG9uIHRoZSBidXMKKworUkVUVVJOUzoKK1BvaW50ZXJzIHRvIHRoZSBtYXBwZWQgQklPUyBpbWFnZQorCitSRU1BUktTOgorTWFwcyBhIHBvaW50ZXIgdG8gdGhlIEJJT1MgaW1hZ2Ugb24gdGhlIGdyYXBoaWNzIGNhcmQgb24gdGhlIFBDSSBidXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqUENJX21hcEJJT1NJbWFnZShwY2lfZGV2X3QgcGNpZGV2KQoreworCXUzMiBCSU9TSW1hZ2VQaHlzOworCWludCBCSU9TSW1hZ2VCQVI7CisJdTggKkJJT1NJbWFnZTsKKworCS8qU2F2ZSBQQ0kgQkFSIHJlZ2lzdGVycyB0aGF0IG1pZ2h0IGdldCBjaGFuZ2VkKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZzYXZlUk9NQmFzZUFkZHJlc3MpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJnNhdmVCYXNlQWRkcmVzczEwKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEsICZzYXZlQmFzZUFkZHJlc3MxNCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18yLCAmc2F2ZUJhc2VBZGRyZXNzMTgpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfNCwgJnNhdmVCYXNlQWRkcmVzczIwKTsKKworCS8qRml4IHVwIEkvTyBiYXNlIHJlZ2lzdGVycyB0byBsZXNzIHRoYW4gNjRLICovCisJaWYoc2F2ZUJhc2VBZGRyZXNzMTQgIT0gMCkKKwkJUENJX2ZpeHVwSU9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18xLCAmc2F2ZUJhc2VBZGRyZXNzMTQpOworCWVsc2UKKwkJUENJX2ZpeHVwSU9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU180LCAmc2F2ZUJhc2VBZGRyZXNzMjApOworCisJLyogU29tZSBjYXJkcyBoYXZlIHByb2JsZW1zIHRoYXQgc3RvcCB1cyBmcm9tIGJlaW5nIGFibGUgdG8gcmVhZCB0aGUKKwkgQklPUyBpbWFnZSBmcm9tIHRoZSBST00gQkFSLiBUbyBmaXggdGhpcyB3ZSBoYXZlIHRvIGRvIHNvbWUgY2hpcHNldAorCSBzcGVjaWZpYyBwcm9ncmFtbWluZyBmb3IgZGlmZmVyZW50IGNhcmRzIHRvIHNvbHZlIHRoaXMgcHJvYmxlbS4KKwkqLworCisJaWYgKChCSU9TSW1hZ2VQaHlzID0gUENJX2ZpbmRCSU9TQWRkcihwY2lkZXYsICZCSU9TSW1hZ2VCQVIpKSA9PSAwKSB7CisJCXByaW50ZigiRmluZCBiaW9zIGFkZHIgZXJyb3JcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlCSU9TSW1hZ2UgPSAodTggKikgQklPU0ltYWdlUGh5czsKKworCS8qQ2hhbmdlIHRoZSBQQ0kgQkFSIHJlZ2lzdGVycyB0byBtYXAgaXQgb250byB0aGUgYnVzLiovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIEJJT1NJbWFnZUJBUiwgMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9ST01fQUREUkVTUywgQklPU0ltYWdlUGh5cyB8IDB4MSk7CisKKwl1ZGVsYXkoMSk7CisKKwkvKkNoZWNrIHRoYXQgdGhlIEJJT1MgaW1hZ2UgaXMgdmFsaWQuIElmIG5vdCBmYWlsLCBvciByZXR1cm4gdGhlCisJIGNvbXBpbGVkIGluIEJJT1MgaW1hZ2UgaWYgdGhhdCBvcHRpb24gd2FzIGVuYWJsZWQKKwkgKi8KKwlpZiAoQklPU0ltYWdlWzBdICE9IDB4NTUgfHwgQklPU0ltYWdlWzFdICE9IDB4QUEgfHwgQklPU0ltYWdlWzJdID09IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIEJJT1NJbWFnZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwY2lkZXYJLSBQQ0kgZGV2aWNlIGluZm8gZm9yIHRoZSB2aWRlbyBjYXJkIG9uIHRoZSBidXMKKworUkVNQVJLUzoKK1VubWFwcyB0aGUgQklPUyBpbWFnZSBmb3IgdGhlIGRldmljZSBhbmQgcmVzdG9yZXMgZnJhbWVidWZmZXIgbWFwcGluZ3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBDSV91bm1hcEJJT1NJbWFnZShwY2lfZGV2X3QgcGNpZGV2LCB2b2lkICpCSU9TSW1hZ2UpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9ST01fQUREUkVTUywgc2F2ZVJPTUJhc2VBZGRyZXNzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18wLCBzYXZlQmFzZUFkZHJlc3MxMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSwgc2F2ZUJhc2VBZGRyZXNzMTQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsIHNhdmVCYXNlQWRkcmVzczE4KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU180LCBzYXZlQmFzZUFkZHJlc3MyMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGNpZGV2CS0gUENJIGRldmljZSBpbmZvIGZvciB0aGUgdmlkZW8gY2FyZCBvbiB0aGUgYnVzIHRvIGJvb3QKK1ZHQUluZm8gLSBCSU9TIGVtdWxhdG9yIFZHQSBpbmZvIHN0cnVjdHVyZQorCitSRVRVUk5TOgorVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQsIGZhbHNlIGlmIG5vdC4KKworUkVNQVJLUzoKK0xvYWRzIGFuZCBQT1NUJ3MgdGhlIGRpc3BsYXkgY29udHJvbGxlcnMgQklPUywgZGlyZWN0bHkgZnJvbSB0aGUgQklPUworaW1hZ2Ugd2UgY2FuIGV4dHJhY3Qgb3ZlciB0aGUgUENJIGJ1cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFBDSV9wb3N0Q29udHJvbGxlcihwY2lfZGV2X3QgcGNpZGV2LCBCRV9WR0FJbmZvICogVkdBSW5mbykKK3sKKwl1MzIgQklPU0ltYWdlTGVuOworCXVjaGFyICptYXBwZWRCSU9TOworCXVjaGFyICpjb3B5T2ZCSU9TOworCisJLypBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgY29weSBvZiBCSU9TIGZyb20gZGlzcGxheSBjb250cm9sbGVyKi8KKwlpZiAoKG1hcHBlZEJJT1MgPSBQQ0lfbWFwQklPU0ltYWdlKHBjaWRldikpID09IE5VTEwpIHsKKwkJcHJpbnRmKCJ2aWRlb2Jvb3Q6IFZpZGVvIFJPTSBmYWlsZWQgdG8gbWFwIVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlCSU9TSW1hZ2VMZW4gPSBtYXBwZWRCSU9TWzJdICogNTEyOworCisJaWYgKChjb3B5T2ZCSU9TID0gbWFsbG9jKEJJT1NJbWFnZUxlbikpID09IE5VTEwpIHsKKwkJcHJpbnRmKCJ2aWRlb2Jvb3Q6IE91dCBvZiBtZW1vcnkhXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwltZW1jcHkoY29weU9mQklPUywgbWFwcGVkQklPUywgQklPU0ltYWdlTGVuKTsKKworCVBDSV91bm1hcEJJT1NJbWFnZShwY2lkZXYsIG1hcHBlZEJJT1MpOworCisJLypTYXZlIGluZm9ybWF0aW9uIGluIFZHQUluZm8gc3RydWN0dXJlKi8KKwlWR0FJbmZvLT5mdW5jdGlvbiA9IFBDSV9GVU5DKHBjaWRldik7CisJVkdBSW5mby0+ZGV2aWNlID0gUENJX0RFVihwY2lkZXYpOworCVZHQUluZm8tPmJ1cyA9IFBDSV9CVVMocGNpZGV2KTsKKwlWR0FJbmZvLT5wY2lkZXYgPSBwY2lkZXY7CisJVkdBSW5mby0+QklPU0ltYWdlID0gY29weU9mQklPUzsKKwlWR0FJbmZvLT5CSU9TSW1hZ2VMZW4gPSBCSU9TSW1hZ2VMZW47CisKKwkvKk5vdyBleGVjdXRlIHRoZSBCSU9TIFBPU1QgZm9yIHRoZSBkZXZpY2UqLworCWlmIChjb3B5T2ZCSU9TWzBdICE9IDB4NTUgfHwgY29weU9mQklPU1sxXSAhPSAweEFBKSB7CisJCXByaW50ZigidmlkZW9ib290OiBWaWRlbyBST00gaW1hZ2UgaXMgaW52YWxpZCFcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJUENJX2RvQklPU1BPU1QocGNpZGV2LCBWR0FJbmZvKTsKKworCS8qUmVzZXQgdGhlIHNpemUgb2YgdGhlIEJJT1MgaW1hZ2UgdG8gdGhlIGZpbmFsIHNpemUqLworCVZHQUluZm8tPkJJT1NJbWFnZUxlbiA9IGNvcHlPZkJJT1NbMl0gKiA1MTI7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGNpZGV2CSAgICAtIFBDSSBkZXZpY2UgaW5mbyBmb3IgdGhlIHZpZGVvIGNhcmQgb24gdGhlIGJ1cyB0byBib290CitwVkdBSW5mbyAgICAtIFBsYWNlIHRvIHJldHVybiBWR0EgaW5mbyBzdHJ1Y3R1cmUgaXMgcmVxdWVzdGVkCitjbGVhblVwCSAgICAtIFRydWUgdG8gY2xlYW4gdXAgb24gZXhpdCwgZmFsc2UgdG8gbGVhdmUgZW11bGF0b3IgYWN0aXZlCisKK1JFTUFSS1M6CitCb290cyB0aGUgUENJL0FHUCB2aWRlbyBjYXJkIG9uIHRoZSBidXMgdXNpbmcgdGhlIFZpZGVvIFJPTSBCSU9TIGltYWdlCithbmQgdGhlIFg4NiBCSU9TIGVtdWxhdG9yIG1vZHVsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgQm9vdFZpZGVvQ2FyZEJJT1MocGNpX2Rldl90IHBjaWRldiwgQkVfVkdBSW5mbyAqKiBwVkdBSW5mbywgaW50IGNsZWFuVXApCit7CisJQkVfVkdBSW5mbyAqVkdBSW5mbzsKKworCXByaW50ZigidmlkZW9ib290OiBCb290aW5nIFBDSSB2aWRlbyBjYXJkIGJ1cyAlZCwgZnVuY3Rpb24gJWQsIGRldmljZSAlZFxuIiwKKwkgICAgIFBDSV9CVVMocGNpZGV2KSwgUENJX0ZVTkMocGNpZGV2KSwgUENJX0RFVihwY2lkZXYpKTsKKworCS8qSW5pdGlhbGlzZSB0aGUgeDg2IEJJT1MgZW11bGF0b3IqLworCWlmICgoVkdBSW5mbyA9IG1hbGxvYyhzaXplb2YoKlZHQUluZm8pKSkgPT0gTlVMTCkgeworCQlwcmludGYoInZpZGVvYm9vdDogT3V0IG9mIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCW1lbXNldChWR0FJbmZvLCAwLCBzaXplb2YoKlZHQUluZm8pKTsKKwlCRV9pbml0KDAsIDY1NTM2LCBWR0FJbmZvLCAwKTsKKworCS8qUG9zdCBhbGwgdGhlIGRpc3BsYXkgY29udHJvbGxlciBCSU9TJ2VzKi8KKwlQQ0lfcG9zdENvbnRyb2xsZXIocGNpZGV2LCBWR0FJbmZvKTsKKworCS8qQ2xlYW51cCBhbmQgZXhpdCB0aGUgZW11bGF0b3IgaWYgcmVxdWVzdGVkLiBJZiB0aGUgQklPUyBlbXVsYXRvcgorCWlzIG5lZWRlZCBhZnRlciBib290aW5nIHRoZSBjYXJkLCB3ZSB3aWxsIG5vdCBjYWxsIEJFX2V4aXQgYW5kCisJbGVhdmUgaXQgZW5hYmxlZCBmb3IgZnVydGhlciB1c2UgKGllOiBWRVNBIGRyaXZlciBldGMpLgorCSovCisJaWYgKGNsZWFuVXApIHsKKwkJQkVfZXhpdCgpOworCQlpZiAoVkdBSW5mby0+QklPU0ltYWdlKQorCQkJZnJlZShWR0FJbmZvLT5CSU9TSW1hZ2UpOworCQlmcmVlKFZHQUluZm8pOworCQlWR0FJbmZvID0gTlVMTDsKKwl9CisJLypSZXR1cm4gVkdBIGluZm8gcG9pbnRlciBpZiB0aGUgY2FsbGVyIHJlcXVlc3RlZCBpdCovCisJaWYgKHBWR0FJbmZvKQorCQkqcFZHQUluZm8gPSBWR0FJbmZvOworCXJldHVybiB0cnVlOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iZXN5cy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jlc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0YmM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iZXN5cy5jCkBAIC0wLDAgKzEsNzIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqICAgSmFzb24gSmluPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorKgorKiAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogICBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisqICAgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgYXBwZWFyaW5nIGluIHRoZSBmaWxlIExJQ0VOU0UuR1BMIGluY2x1ZGVkCisqICAgaW4gdGhlIHBhY2thZ2luZyBvZiB0aGlzIGZpbGUuCisqCisqICAgTGljZW5zZWVzIGhvbGRpbmcgYSB2YWxpZCBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIHRoaXMgcHJvZHVjdCBmcm9tCisqICAgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBtYXkgdXNlIHRoaXMgZmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisqICAgQ29tbWVyY2lhbCBMaWNlbnNlIEFncmVlbWVudCBwcm92aWRlZCB3aXRoIHRoZSBTb2Z0d2FyZS4KKyoKKyogICBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgQVMgSVMgd2l0aCBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCwgSU5DTFVESU5HCisqICAgVEhFIFdBUlJBTlRZIE9GIERFU0lHTiwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyogICBQVVJQT1NFLgorKgorKiAgIFNlZSBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9saWNlbnNlLyBmb3IgaW5mb3JtYXRpb24gYWJvdXQKKyogICB0aGUgbGljZW5zaW5nIG9wdGlvbnMgYXZhaWxhYmxlIGFuZCBob3cgdG8gcHVyY2hhc2UgYSBDb21tZXJjaWFsCisqICAgTGljZW5zZSBBZ3JlZW1lbnQuCisqCisqICAgQ29udGFjdCBsaWNlbnNlQHNjaXRlY2hzb2Z0LmNvbSBpZiBhbnkgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2luZworKiAgIGFyZSBub3QgY2xlYXIgdG8geW91LCBvciB5b3UgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgbGljZW5zaW5nIG9wdGlvbnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgQklPUyBlbXVsYXRvciBJL08gYW5kIG1lbW9yeSBhY2Nlc3MKKyogICAgICAgICAgICAgICBmdW5jdGlvbnMuCisqCisqCQlKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdCB0byBydW4gdGhlIEFUSSB2aWRlbyBjYXJkCisqCQlCSU9TIGluIHUtYm9vdC4gUmVtb3ZlZCBzb21lIGVtdWxhdGUgZnVuY3Rpb25zIHN1Y2ggYXMgdGhlCisqCQl0aW1lciBwb3J0IGFjY2Vzcy4gTWFkZSBhbGwgdGhlIFZHQSBwb3J0IGV4Y2VwdCByZWFkaW5nIDB4M2MzCisqCQliZSBlbXVsYXRlZC4gU2VlbXMgbGlrZSByZWFkaW5nIDB4M2MzIHNob3VsZCByZXR1cm4gdGhlIGhpZ2gKKyoJCTE2IGJpdCBvZiB0aGUgaW8gcG9ydC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaW9zZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19pMzg2X18KK3N0YXRpYyBjaGFyICpCRV9iaW9zRGF0ZSA9ICIwOC8xNC85OSI7CitzdGF0aWMgdTggQkVfbW9kZWwgPSAweEZDOworc3RhdGljIHU4IEJFX3N1Ym1vZGVsID0gMHgwMDsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byBjb252ZXJ0CisKK1JFVFVSTlM6CitBY3R1YWwgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZCBvciB3cml0ZSB0aGUgZGF0YQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBlbXVsYXRvciBtZW1vcnkgYWRkcmVzcyBpbiBhIDMyLWJpdCByYW5nZSB0bworYSByZWFsIG1lbW9yeSBhZGRyZXNzIHRoYXQgd2Ugd2lzaCB0byBhY2Nlc3MuIEl0IGhhbmRsZXMgc3BsaXR0aW5nIHVwIHRoZQorbWVtb3J5IGFkZHJlc3Mgc3BhY2UgYXBwcm9wcmlhdGVseSB0byBhY2Nlc3MgdGhlIGVtdWxhdG9yIEJJT1MgaW1hZ2UsIHZpZGVvCittZW1vcnkgYW5kIHN5c3RlbSBCSU9TIGV0Yy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTggKkJFX21lbWFkZHIodTMyIGFkZHIpCit7CisJaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgeworCQlyZXR1cm4gKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7CisJfSBlbHNlIGlmIChhZGRyID4gX0JFX2Vudi5iaW9zbWVtX2xpbWl0ICYmIGFkZHIgPCAweEQwMDAwKSB7CisJCURCKHByaW50ZigiQkVfbWVtYWRkcjogYWRkcmVzcyAlI2x4IG1heSBiZSBpbnZhbGlkIVxuIiwgYWRkcik7KQorCQlyZXR1cm4gTS5tZW1fYmFzZTsKKwl9IGVsc2UgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKKwkJcmV0dXJuICh1OCopKF9CRV9lbnYuYnVzbWVtX2Jhc2UgKyBhZGRyIC0gMHhBMDAwMCk7CisJfQorI2lmZGVmIF9faTM4Nl9fCisJZWxzZSBpZiAoYWRkciA+PSAweEQwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgeworCQkvKiBXZSBtYXAgdGhlIHJlYWwgU3lzdGVtIEJJT1MgZGlyZWN0bHkgb24gcmVhbCBQQydzICovCisJCURCKHByaW50ZigiQkVfbWVtYWRkcjogU3lzdGVtIEJJT1MgYWRkcmVzcyAlI2x4XG4iLCBhZGRyKTspCisJCSAgICByZXR1cm4gX0JFX2Vudi5idXNtZW1fYmFzZSArIGFkZHIgLSAweEEwMDAwOworCX0KKyNlbHNlCisJZWxzZSBpZiAoYWRkciA+PSAweEZGRkY1ICYmIGFkZHIgPCAweEZGRkZFKSB7CisJCS8qIFJldHVybiBhIGZha2VkIEJJT1MgZGF0ZSBzdHJpbmcgZm9yIG5vbi14ODYgbWFjaGluZXMgKi8KKwkJREIocHJpbnRmKCJCRV9tZW1hZGRyIC0gUmV0dXJuaW5nIEJJT1MgZGF0ZVxuIik7KQorCQlyZXR1cm4gQkVfYmlvc0RhdGUgKyBhZGRyIC0gMHhGRkZGNTsKKwl9IGVsc2UgaWYgKGFkZHIgPT0gMHhGRkZGRSkgeworCQkvKiBSZXR1cm4gc3lzdGVtIG1vZGVsIGlkZW50aWZpZXIgZm9yIG5vbi14ODYgbWFjaGluZXMgKi8KKwkJREIocHJpbnRmKCJCRV9tZW1hZGRyIC0gUmV0dXJuaW5nIG1vZGVsXG4iKTspCisJCXJldHVybiAmQkVfbW9kZWw7CisJfSBlbHNlIGlmIChhZGRyID09IDB4RkZGRkYpIHsKKwkJLyogUmV0dXJuIHN5c3RlbSBzdWJtb2RlbCBpZGVudGlmaWVyIGZvciBub24teDg2IG1hY2hpbmVzICovCisJCURCKHByaW50ZigiQkVfbWVtYWRkciAtIFJldHVybmluZyBzdWJtb2RlbFxuIik7KQorCQlyZXR1cm4gJkJFX3N1Ym1vZGVsOworCX0KKyNlbmRpZgorCWVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMSkgeworCQlIQUxUX1NZUygpOworCQlyZXR1cm4gTS5tZW1fYmFzZTsKKwl9CisKKwlyZXR1cm4gTS5tZW1fYmFzZSArIGFkZHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKKworUkVUVVJOUzoKK0J5dGUgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KKworUkVNQVJLUzoKK1JlYWRzIGEgYnl0ZSB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5CityZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBYODZBUEkgQkVfcmRiKHUzMiBhZGRyKQoreworCWlmIChfQkVfZW52LmVtdWxhdGVWR0EgJiYgYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCXU4IHZhbCA9IHJlYWRiX2xlKEJFX21lbWFkZHIoYWRkcikpOworCQlyZXR1cm4gdmFsOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAorCitSRVRVUk5TOgorV29yZCB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgorCitSRU1BUktTOgorUmVhZHMgYSB3b3JkIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKK3JlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBYODZBUEkgQkVfcmR3KHUzMiBhZGRyKQoreworCWlmIChfQkVfZW52LmVtdWxhdGVWR0EgJiYgYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCXU4ICpiYXNlID0gQkVfbWVtYWRkcihhZGRyKTsKKwkJdTE2IHZhbCA9IHJlYWR3X2xlKGJhc2UpOworCQlyZXR1cm4gdmFsOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAorCitSRVRVUk5TOgorTG9uZyB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgorCitSRU1BUktTOgorUmVhZHMgYSAzMi1iaXQgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIFg4NkFQSSBCRV9yZGwodTMyIGFkZHIpCit7CisJaWYgKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiBhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJdTggKmJhc2UgPSBCRV9tZW1hZGRyKGFkZHIpOworCQl1MzIgdmFsID0gcmVhZGxfbGUoYmFzZSk7CisJCXJldHVybiB2YWw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIGJ5dGUgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfd3JiKHUzMiBhZGRyLCB1OCB2YWwpCit7CisJaWYgKCEoX0JFX2Vudi5lbXVsYXRlVkdBICYmIGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpKSB7CisJCXdyaXRlYl9sZShCRV9tZW1hZGRyKGFkZHIpLCB2YWwpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKK3JlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX3dydyh1MzIgYWRkciwgdTE2IHZhbCkKK3sKKwlpZiAoIShfQkVfZW52LmVtdWxhdGVWR0EgJiYgYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikpIHsKKwkJdTggKmJhc2UgPSBCRV9tZW1hZGRyKGFkZHIpOworCQl3cml0ZXdfbGUoYmFzZSwgdmFsKTsKKworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSAzMi1iaXQgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfd3JsKHUzMiBhZGRyLCB1MzIgdmFsKQoreworCWlmICghKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiBhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSkgeworCQl1OCAqYmFzZSA9IEJFX21lbWFkZHIoYWRkcik7CisJCXdyaXRlbF9sZShiYXNlLCB2YWwpOworCX0KK30KKworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKF9faTM4Nl9fKQorCisvKiBGb3IgTm9uLUludGVsIG1hY2hpbmVzIHdlIG1heSBuZWVkIHRvIGVtdWxhdGUgc29tZSBJL08gcG9ydCBhY2Nlc3NlcyB0aGF0CisgKiB0aGUgQklPUyBtYXkgdHJ5IHRvIGFjY2Vzcywgc3VjaCBhcyB0aGUgUENJIGNvbmZpZyByZWdpc3RlcnMuCisgKi8KKworI2RlZmluZSBJU19USU1FUl9QT1JUKHBvcnQpICgweDQwIDw9IHBvcnQgJiYgcG9ydCA8PSAweDQzKQorI2RlZmluZSBJU19DTU9TX1BPUlQocG9ydCkgICgweDcwIDw9IHBvcnQgJiYgcG9ydCA8PSAweDcxKQorLyojZGVmaW5lIElTX1ZHQV9QT1JUKHBvcnQpICAgKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiAweDNDMCA8PSBwb3J0ICYmIHBvcnQgPD0gMHgzREEpKi8KKyNkZWZpbmUgSVNfVkdBX1BPUlQocG9ydCkgICAoMHgzQzAgPD0gcG9ydCAmJiBwb3J0IDw9IDB4M0RBKQorI2RlZmluZSBJU19QQ0lfUE9SVChwb3J0KSAgICgweENGOCA8PSBwb3J0ICYmIHBvcnQgPD0gMHhDRkYpCisjZGVmaW5lIElTX1NQS1JfUE9SVChwb3J0KSAgKHBvcnQgPT0gMHg2MSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byByZWFkIGZyb20KK3R5cGUgICAgLSBUeXBlIG9mIGFjY2VzcyB0byBwZXJmb3JtCisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCByZWFkIGZyb20gdGhlIFN0YW5kYXJkIFZHQSBJL08gcG9ydHMuIElmIHRoZSB0YXJnZXQKK2hhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgbWFwcGluZyB0aGUgVkdBIEkvTyBhbmQgbWVtb3J5IChzdWNoIGFzIHNvbWUKK1Bvd2VyUEMgc3lzdGVtcyksIHdlIGVtdWxhdGUgdGhlIFZHQSBzbyB0aGF0IHRoZSBCSU9TIHdpbGwgc3RpbGwgYmUgYWJsZSB0bworc2V0IE5vblZHQSBkaXNwbGF5IG1vZGVzIHN1Y2ggYXMgb24gQVRJIGhhcmR3YXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1OCBWR0FfaW5wYiAoY29uc3QgaW50IHBvcnQpCit7CisJdTggdmFsID0gMHhmZjsKKworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMHgzQzA6CisJCS8qIDNDMCBoYXMgZnVua3kgY2hhcmFjdGVyaXN0aWNzIGJlY2F1c2UgaXQgY2FuIGFjdCBhcyBlaXRoZXIKKwkJICAgYSBkYXRhIHJlZ2lzdGVyIG9yIGluZGV4IHJlZ2lzdGVyIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUKKwkJICAgb2YgYW4gaW50ZXJuYWwgZmxpcCBmbG9wIGluIHRoZSBoYXJkd2FyZS4gSGVuY2Ugd2UgaGF2ZQorCQkgICB0byBlbXVsYXRlIHRoYXQgZnVuY3Rpb25hbGl0eSBpbiBoZXJlLiAqLworCQlpZiAoX0JFX2Vudi5mbGlwRmxvcDNDMCA9PSAwKSB7CisJCQkvKiBBY2Nlc3MgM0MwIGFzIGluZGV4IHJlZ2lzdGVyICovCisJCQl2YWwgPSBfQkVfZW52LmVtdTNDMDsKKwkJfSBlbHNlIHsKKwkJCS8qIEFjY2VzcyAzQzAgYXMgZGF0YSByZWdpc3RlciAqLworCQkJaWYgKF9CRV9lbnYuZW11M0MwIDwgQVRUX0MpCisJCQkJdmFsID0gX0JFX2Vudi5lbXUzQzFbX0JFX2Vudi5lbXUzQzBdOworCQl9CisJCV9CRV9lbnYuZmxpcEZsb3AzQzAgXj0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDNDMToKKwkJaWYgKF9CRV9lbnYuZW11M0MwIDwgQVRUX0MpCisJCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzFbX0JFX2Vudi5lbXUzQzBdOworCQlicmVhazsKKwljYXNlIDB4M0NDOgorCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzI7CisJY2FzZSAweDNDNDoKKwkJcmV0dXJuIF9CRV9lbnYuZW11M0M0OworCWNhc2UgMHgzQzU6CisJCWlmIChfQkVfZW52LmVtdTNDNCA8IEFUVF9DKQorCQkJcmV0dXJuIF9CRV9lbnYuZW11M0M1W19CRV9lbnYuZW11M0M0XTsKKwkJYnJlYWs7CisJY2FzZSAweDNDNjoKKwkJcmV0dXJuIF9CRV9lbnYuZW11M0M2OworCWNhc2UgMHgzQzc6CisJCXJldHVybiBfQkVfZW52LmVtdTNDNzsKKwljYXNlIDB4M0M4OgorCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzg7CisJY2FzZSAweDNDOToKKwkJaWYgKF9CRV9lbnYuZW11M0M3IDwgUEFMX0MpCisJCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzlbX0JFX2Vudi5lbXUzQzcrK107CisJCWJyZWFrOworCWNhc2UgMHgzQ0U6CisJCXJldHVybiBfQkVfZW52LmVtdTNDRTsKKwljYXNlIDB4M0NGOgorCQlpZiAoX0JFX2Vudi5lbXUzQ0UgPCBHUkFfQykKKwkJCXJldHVybiBfQkVfZW52LmVtdTNDRltfQkVfZW52LmVtdTNDRV07CisJCWJyZWFrOworCWNhc2UgMHgzRDQ6CisJCWlmIChfQkVfZW52LmVtdTNDMiAmIDB4MSkKKwkJCXJldHVybiBfQkVfZW52LmVtdTNENDsKKwkJYnJlYWs7CisJY2FzZSAweDNENToKKwkJaWYgKChfQkVfZW52LmVtdTNDMiAmIDB4MSkgJiYgKF9CRV9lbnYuZW11M0Q0IDwgQ1JUX0MpKQorCQkJcmV0dXJuIF9CRV9lbnYuZW11M0Q1W19CRV9lbnYuZW11M0Q0XTsKKwkJYnJlYWs7CisJY2FzZSAweDNEQToKKwkJX0JFX2Vudi5mbGlwRmxvcDNDMCA9IDA7CisJCXZhbCA9IF9CRV9lbnYuZW11M0RBOworCQlfQkVfZW52LmVtdTNEQSBePSAweDk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHdyaXRlIHRvCit0eXBlICAgIC0gVHlwZSBvZiBhY2Nlc3MgdG8gcGVyZm9ybQorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgd3JpdGUgdG8gb25lIG9mIHRoZSA4MjUzIHRpbWVyIHJlZ2lzdGVycy4gRm9yIG5vdword2Ugb25seSBlbXVsYXRlIHRpbWVyIDAgd2hpY2ggaXMgdGhlIG9ubHkgdGltZXIgdGhhdCB0aGUgQklPUyBjb2RlIGFwcGVhcnMKK3RvIHVzZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBWR0Ffb3V0cGIgKGludCBwb3J0LCB1OCB2YWwpCit7CisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSAweDNDMDoKKwkJLyogM0MwIGhhcyBmdW5reSBjaGFyYWN0ZXJpc3RpY3MgYmVjYXVzZSBpdCBjYW4gYWN0IGFzIGVpdGhlcgorCQkgICBhIGRhdGEgcmVnaXN0ZXIgb3IgaW5kZXggcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZQorCQkgICBvZiBhbiBpbnRlcm5hbCBmbGlwIGZsb3AgaW4gdGhlIGhhcmR3YXJlLiBIZW5jZSB3ZSBoYXZlCisJCSAgIHRvIGVtdWxhdGUgdGhhdCBmdW5jdGlvbmFsaXR5IGluIGhlcmUuICovCisJCWlmIChfQkVfZW52LmZsaXBGbG9wM0MwID09IDApIHsKKwkJCS8qIEFjY2VzcyAzQzAgYXMgaW5kZXggcmVnaXN0ZXIgKi8KKwkJCV9CRV9lbnYuZW11M0MwID0gdmFsOworCQl9IGVsc2UgeworCQkJLyogQWNjZXNzIDNDMCBhcyBkYXRhIHJlZ2lzdGVyICovCisJCQlpZiAoX0JFX2Vudi5lbXUzQzAgPCBBVFRfQykKKwkJCQlfQkVfZW52LmVtdTNDMVtfQkVfZW52LmVtdTNDMF0gPSB2YWw7CisJCX0KKwkJX0JFX2Vudi5mbGlwRmxvcDNDMCBePSAxOworCQlicmVhazsKKwljYXNlIDB4M0MyOgorCQlfQkVfZW52LmVtdTNDMiA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNDNDoKKwkJX0JFX2Vudi5lbXUzQzQgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMHgzQzU6CisJCWlmIChfQkVfZW52LmVtdTNDNCA8IEFUVF9DKQorCQkJX0JFX2Vudi5lbXUzQzVbX0JFX2Vudi5lbXUzQzRdID0gdmFsOworCQlicmVhazsKKwljYXNlIDB4M0M2OgorCQlfQkVfZW52LmVtdTNDNiA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNDNzoKKwkJX0JFX2Vudi5lbXUzQzcgPSAoaW50KSB2YWwgKjM7CisKKwkJYnJlYWs7CisJY2FzZSAweDNDODoKKwkJX0JFX2Vudi5lbXUzQzggPSAoaW50KSB2YWwgKjM7CisKKwkJYnJlYWs7CisJY2FzZSAweDNDOToKKwkJaWYgKF9CRV9lbnYuZW11M0M4IDwgUEFMX0MpCisJCQlfQkVfZW52LmVtdTNDOVtfQkVfZW52LmVtdTNDOCsrXSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNDRToKKwkJX0JFX2Vudi5lbXUzQ0UgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMHgzQ0Y6CisJCWlmIChfQkVfZW52LmVtdTNDRSA8IEdSQV9DKQorCQkJX0JFX2Vudi5lbXUzQ0ZbX0JFX2Vudi5lbXUzQ0VdID0gdmFsOworCQlicmVhazsKKwljYXNlIDB4M0Q0OgorCQlpZiAoX0JFX2Vudi5lbXUzQzIgJiAweDEpCisJCQlfQkVfZW52LmVtdTNENCA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNENToKKwkJaWYgKChfQkVfZW52LmVtdTNDMiAmIDB4MSkgJiYgKF9CRV9lbnYuZW11M0Q0IDwgQ1JUX0MpKQorCQkJX0JFX2Vudi5lbXUzRDVbX0JFX2Vudi5lbXUzRDRdID0gdmFsOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnT2Zmc2V0ICAgLSBPZmZzZXQgaW50byByZWdpc3RlciBzcGFjZSBmb3Igbm9uLURXT1JEIGFjY2Vzc2VzCit2YWx1ZSAgICAgICAtIFZhbHVlIHRvIHdyaXRlIHRvIHJlZ2lzdGVyIGZvciBQQ0lfV1JJVEVfKiBvcGVyYXRpb25zCitmdW5jICAgICAgICAtIEZ1bmN0aW9uIHRvIHBlcmZvcm0gKFBDSUFjY2Vzc1JlZ0ZsYWdzKQorCitSRVRVUk5TOgorVmFsdWUgcmVhZCBmcm9tIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIFBDSV9SRUFEXyogb3BlcmF0aW9ucworCitSRU1BUktTOgorQWNjZXNzZXMgYSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlciBieSBkZWNvZGluZyB0aGUgdmFsdWUgY3VycmVudGx5CitzdG9yZWQgaW4gdGhlIF9CRV9lbnYuY29uZmlnQWRkcmVzcyB2YXJpYWJsZSBhbmQgcGFzc2luZyBpdCB0aHJvdWdoIHRvIHRoZQorcG9ydGFibGUgUENJX2FjY2Vzc1JlZyBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTMyIEJFX2FjY2Vzc1JlZyhpbnQgcmVnT2Zmc2V0LCB1MzIgdmFsdWUsIGludCBmdW5jKQoreworI2lmZGVmIF9fS0VSTkVMX18KKwlpbnQgZnVuY3Rpb24sIGRldmljZSwgYnVzOworCXU4IHZhbDg7CisJdTE2IHZhbDE2OworCXUzMiB2YWwzMjsKKworCisJLyogRGVjb2RlIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlcyBmb3IgdGhlIHJlZ2lzdGVyIHdlIHdpc2ggdG8KKwkgKiBhY2Nlc3MKKwkgKi8KKwlyZWdPZmZzZXQgKz0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4RkYpOworCWZ1bmN0aW9uID0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyA+PiA4KSAmIDB4NzsKKwlkZXZpY2UgPSAoX0JFX2Vudi5jb25maWdBZGRyZXNzID4+IDExKSAmIDB4MUY7CisJYnVzID0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyA+PiAxNikgJiAweEZGOworCisJLyogSWdub3JlIGFjY2Vzc2VzIHRvIGFsbCBkZXZpY2VzIG90aGVyIHRoYW4gdGhlIG9uZSB3ZSdyZSBQT1NUaW5nICovCisJaWYgKChmdW5jdGlvbiA9PSBfQkVfZW52LnZnYUluZm8uZnVuY3Rpb24pICYmCisJICAgIChkZXZpY2UgPT0gX0JFX2Vudi52Z2FJbmZvLmRldmljZSkgJiYKKwkgICAgKGJ1cyA9PSBfQkVfZW52LnZnYUluZm8uYnVzKSkgeworCQlzd2l0Y2ggKGZ1bmMpIHsKKwkJY2FzZSBSRUdfUkVBRF9CWVRFOgorCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgcmVnT2Zmc2V0LAorCQkJCQkgICAgICZ2YWw4KTsKKwkJCXJldHVybiB2YWw4OworCQljYXNlIFJFR19SRUFEX1dPUkQ6CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChfQkVfZW52LnZnYUluZm8ucGNpZGV2LCByZWdPZmZzZXQsCisJCQkJCSAgICAgJnZhbDE2KTsKKwkJCXJldHVybiB2YWwxNjsKKwkJY2FzZSBSRUdfUkVBRF9EV09SRDoKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChfQkVfZW52LnZnYUluZm8ucGNpZGV2LCByZWdPZmZzZXQsCisJCQkJCSAgICAgICZ2YWwzMik7CisJCQlyZXR1cm4gdmFsMzI7CisJCWNhc2UgUkVHX1dSSVRFX0JZVEU6CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgcmVnT2Zmc2V0LAorCQkJCQkgICAgICB2YWx1ZSk7CisKKwkJCXJldHVybiAwOworCQljYXNlIFJFR19XUklURV9XT1JEOgorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsIHJlZ09mZnNldCwKKwkJCQkJICAgICAgdmFsdWUpOworCisJCQlyZXR1cm4gMDsKKwkJY2FzZSBSRUdfV1JJVEVfRFdPUkQ6CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsCisJCQkJCSAgICAgICByZWdPZmZzZXQsIHZhbHVlKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCVBDSURldmljZUluZm8gcGNpSW5mbzsKKworCXBjaUluZm8ubWVjaDEgPSAxOworCXBjaUluZm8uc2xvdC5pID0gMDsKKwlwY2lJbmZvLnNsb3QucC5GdW5jdGlvbiA9IChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgPj4gOCkgJiAweDc7CisJcGNpSW5mby5zbG90LnAuRGV2aWNlID0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyA+PiAxMSkgJiAweDFGOworCXBjaUluZm8uc2xvdC5wLkJ1cyA9IChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgPj4gMTYpICYgMHhGRjsKKwlwY2lJbmZvLnNsb3QucC5FbmFibGUgPSAxOworCisJLyogSWdub3JlIGFjY2Vzc2VzIHRvIGFsbCBkZXZpY2VzIG90aGVyIHRoYW4gdGhlIG9uZSB3ZSdyZSBQT1NUaW5nICovCisJaWYgKChwY2lJbmZvLnNsb3QucC5GdW5jdGlvbiA9PQorCSAgICAgX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPnNsb3QucC5GdW5jdGlvbikKKwkgICAgJiYgKHBjaUluZm8uc2xvdC5wLkRldmljZSA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+c2xvdC5wLkRldmljZSkKKwkgICAgJiYgKHBjaUluZm8uc2xvdC5wLkJ1cyA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+c2xvdC5wLkJ1cykpCisJCXJldHVybiBQQ0lfYWNjZXNzUmVnKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweEZGKSArIHJlZ09mZnNldCwKKwkJCQkgICAgIHZhbHVlLCBmdW5jLCAmcGNpSW5mbyk7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byByZWFkIGZyb20KK3R5cGUgICAgLSBUeXBlIG9mIGFjY2VzcyB0byBwZXJmb3JtCisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCByZWFkIGZyb20gb25lIG9mIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMuCitXZSBlbXVsYXRlIHRoaXMgdXNpbmcgb3VyIFBDSV9hY2Nlc3NSZWcgZnVuY3Rpb24gd2hpY2ggd2lsbCBhY2Nlc3MgdGhlIFBDSQorY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMgaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1MzIgUENJX2lucChpbnQgcG9ydCwgaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSRUdfUkVBRF9CWVRFOgorCQlpZiAoKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4ODAwMDAwMDApICYmIDB4Q0ZDIDw9IHBvcnQKKwkJICAgICYmIHBvcnQgPD0gMHhDRkYpCisJCQlyZXR1cm4gQkVfYWNjZXNzUmVnKHBvcnQgLSAweENGQywgMCwgUkVHX1JFQURfQllURSk7CisJCWJyZWFrOworCWNhc2UgUkVHX1JFQURfV09SRDoKKwkJaWYgKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweDgwMDAwMDAwKSAmJiAweENGQyA8PSBwb3J0CisJCSAgICAmJiBwb3J0IDw9IDB4Q0ZGKQorCQkJcmV0dXJuIEJFX2FjY2Vzc1JlZyhwb3J0IC0gMHhDRkMsIDAsIFJFR19SRUFEX1dPUkQpOworCQlicmVhazsKKwljYXNlIFJFR19SRUFEX0RXT1JEOgorCQlpZiAocG9ydCA9PSAweENGOCkKKwkJCXJldHVybiBfQkVfZW52LmNvbmZpZ0FkZHJlc3M7CisJCWVsc2UgaWYgKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweDgwMDAwMDAwKSAmJiBwb3J0ID09IDB4Q0ZDKQorCQkJcmV0dXJuIEJFX2FjY2Vzc1JlZygwLCAwLCBSRUdfUkVBRF9EV09SRCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bwordHlwZSAgICAtIFR5cGUgb2YgYWNjZXNzIHRvIHBlcmZvcm0KKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIHdyaXRlIHRvIG9uZSBvZiB0aGUgUENJIGNvbnRyb2wgcmVnaXN0ZXJzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFBDSV9vdXRwKGludCBwb3J0LCB1MzIgdmFsLCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJFR19XUklURV9CWVRFOgorCQlpZiAoKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4ODAwMDAwMDApICYmIDB4Q0ZDIDw9IHBvcnQKKwkJICAgICYmIHBvcnQgPD0gMHhDRkYpCisJCQlCRV9hY2Nlc3NSZWcocG9ydCAtIDB4Q0ZDLCB2YWwsIFJFR19XUklURV9CWVRFKTsKKwkJYnJlYWs7CisJY2FzZSBSRUdfV1JJVEVfV09SRDoKKwkJaWYgKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweDgwMDAwMDAwKSAmJiAweENGQyA8PSBwb3J0CisJCSAgICAmJiBwb3J0IDw9IDB4Q0ZGKQorCQkJQkVfYWNjZXNzUmVnKHBvcnQgLSAweENGQywgdmFsLCBSRUdfV1JJVEVfV09SRCk7CisJCWJyZWFrOworCWNhc2UgUkVHX1dSSVRFX0RXT1JEOgorCQlpZiAocG9ydCA9PSAweENGOCkKKwkJeworCQkJX0JFX2Vudi5jb25maWdBZGRyZXNzID0gdmFsICYgMHg4MEZGRkZGQzsKKwkJfQorCQllbHNlIGlmICgoX0JFX2Vudi5jb25maWdBZGRyZXNzICYgMHg4MDAwMDAwMCkgJiYgcG9ydCA9PSAweENGQykKKwkJCUJFX2FjY2Vzc1JlZygwLCB2YWwsIFJFR19XUklURV9EV09SRCk7CisJCWJyZWFrOworCX0KK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcG9ydCAgICAtIFBvcnQgdG8gd3JpdGUgdG8KKworUkVUVVJOUzoKK1ZhbHVlIHJlYWQgZnJvbSB0aGUgSS9PIHBvcnQKKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIDgtYml0IHJlYWQgZnJvbSBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggWDg2QVBJIEJFX2luYihYODZFTVVfcGlvQWRkciBwb3J0KQoreworCXU4IHZhbCA9IDA7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCAhZGVmaW5lZChfX2kzODZfXykKKwlpZiAoSVNfVkdBX1BPUlQocG9ydCkpeworCQkvKnNlZW1zIHJlYWRpbmcgcG9ydCAweDNjMyByZXR1cm4gdGhlIGhpZ2ggMTYgYml0IG9mIGlvIHBvcnQqLworCQlpZihwb3J0ID09IDB4M2MzKQorCQkJdmFsID0gTE9HX2lucGIocG9ydCk7CisJCWVsc2UKKwkJCXZhbCA9IFZHQV9pbnBiKHBvcnQpOworCX0KKwllbHNlIGlmIChJU19USU1FUl9QT1JUKHBvcnQpKQorCQlEQihwcmludGYoIkNhbiBub3QgaW50ZXJlcHQgVElNRVIgcG9ydCBub3chXG4iKTspCisJZWxzZSBpZiAoSVNfU1BLUl9QT1JUKHBvcnQpKQorCQlEQihwcmludGYoIkNhbiBub3QgaW50ZXJlcHQgU1BFQUtFUiBwb3J0IG5vdyFcbiIpOykKKwllbHNlIGlmIChJU19DTU9TX1BPUlQocG9ydCkpCisJCURCKHByaW50ZigiQ2FuIG5vdCBpbnRlcmVwdCBDTU9TIHBvcnQgbm93IVxuIik7KQorCWVsc2UgaWYgKElTX1BDSV9QT1JUKHBvcnQpKQorCQl2YWwgPSBQQ0lfaW5wKHBvcnQsIFJFR19SRUFEX0JZVEUpOworCWVsc2UgaWYgKHBvcnQgPCAweDEwMCkgeworCQlEQihwcmludGYoIldBUk46IElOVkFMSUQgaW5iLiUwNFggLT4gJTAyWFxuIiwgKHUxNikgcG9ydCwgdmFsKTspCisJCXZhbCA9IExPR19pbnBiKHBvcnQpOworCX0gZWxzZQorI2VuZGlmCisJCXZhbCA9IExPR19pbnBiKHBvcnQpOworCXJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcG9ydCAgICAtIFBvcnQgdG8gd3JpdGUgdG8KKworUkVUVVJOUzoKK1ZhbHVlIHJlYWQgZnJvbSB0aGUgSS9PIHBvcnQKKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIDE2LWJpdCByZWFkIGZyb20gYW4gSS9PIHBvcnQuIFdlIGhhbmRsZSBzcGVjaWFsIGNhc2VzCit0aGF0IHdlIG5lZWQgdG8gZW11bGF0ZSBpbiBoZXJlLCBhbmQgZmFsbCB0aHJvdWdoIHRvIHJlZmxlY3RpbmcgdGhlIHdyaXRlCit0aHJvdWdoIHRvIHRoZSByZWFsIGhhcmR3YXJlIGlmIHdlIGRvbid0IG5lZWQgdG8gc3BlY2lhbCBjYXNlIGl0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBYODZBUEkgQkVfaW53KFg4NkVNVV9waW9BZGRyIHBvcnQpCit7CisJdTE2IHZhbCA9IDA7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCAhZGVmaW5lZChfX2kzODZfXykKKwlpZiAoSVNfUENJX1BPUlQocG9ydCkpCisJCXZhbCA9IFBDSV9pbnAocG9ydCwgUkVHX1JFQURfV09SRCk7CisJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCURCKHByaW50ZigiV0FSTjogTWF5YmUgSU5WQUxJRCBpbncuJTA0WCAtPiAlMDRYXG4iLCAodTE2KSBwb3J0LCB2YWwpOykKKwkJdmFsID0gTE9HX2lucHcocG9ydCk7CisJfSBlbHNlCisjZW5kaWYKKwkJdmFsID0gTE9HX2lucHcocG9ydCk7CisJcmV0dXJuIHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bworCitSRVRVUk5TOgorVmFsdWUgcmVhZCBmcm9tIHRoZSBJL08gcG9ydAorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgMzItYml0IHJlYWQgZnJvbSBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIFg4NkFQSSBCRV9pbmwoWDg2RU1VX3Bpb0FkZHIgcG9ydCkKK3sKKwl1MzIgdmFsID0gMDsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKF9faTM4Nl9fKQorCWlmIChJU19QQ0lfUE9SVChwb3J0KSkKKwkJdmFsID0gUENJX2lucChwb3J0LCBSRUdfUkVBRF9EV09SRCk7CisJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCXZhbCA9IExPR19pbnBkKHBvcnQpOworCX0gZWxzZQorI2VuZGlmCisJCXZhbCA9IExPR19pbnBkKHBvcnQpOworCXJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcG9ydCAgICAtIFBvcnQgdG8gd3JpdGUgdG8KK3ZhbCAgICAgLSBWYWx1ZSB0byB3cml0ZSB0byBwb3J0CisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCA4LWJpdCB3cml0ZSB0byBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfb3V0YihYODZFTVVfcGlvQWRkciBwb3J0LCB1OCB2YWwpCit7CisjaWYgZGVmaW5lZChERUJVRykgfHwgIWRlZmluZWQoX19pMzg2X18pCisJaWYgKElTX1ZHQV9QT1JUKHBvcnQpKQorCQlWR0Ffb3V0cGIocG9ydCwgdmFsKTsKKwllbHNlIGlmIChJU19USU1FUl9QT1JUKHBvcnQpKQorCQlEQihwcmludGYoIkNhbiBub3QgaW50ZXJlcHQgVElNRVIgcG9ydCBub3chXG4iKTspCisJZWxzZSBpZiAoSVNfU1BLUl9QT1JUKHBvcnQpKQorCQlEQihwcmludGYoIkNhbiBub3QgaW50ZXJlcHQgU1BFQUtFUiBwb3J0IG5vdyFcbiIpOykKKwllbHNlIGlmIChJU19DTU9TX1BPUlQocG9ydCkpCisJCURCKHByaW50ZigiQ2FuIG5vdCBpbnRlcmVwdCBDTU9TIHBvcnQgbm93IVxuIik7KQorCWVsc2UgaWYgKElTX1BDSV9QT1JUKHBvcnQpKQorCQlQQ0lfb3V0cChwb3J0LCB2YWwsIFJFR19XUklURV9CWVRFKTsKKwllbHNlIGlmIChwb3J0IDwgMHgxMDApIHsKKwkJREIocHJpbnRmKCJXQVJOOk1heWJlIElOVkFMSUQgb3V0Yi4lMDRYIDwtICUwMlhcbiIsICh1MTYpIHBvcnQsIHZhbCk7KQorCQlMT0dfb3V0cGIocG9ydCwgdmFsKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlMT0dfb3V0cGIocG9ydCwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bwordmFsICAgICAtIFZhbHVlIHRvIHdyaXRlIHRvIHBvcnQKKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIDE2LWJpdCB3cml0ZSB0byBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfb3V0dyhYODZFTVVfcGlvQWRkciBwb3J0LCB1MTYgdmFsKQoreworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKF9faTM4Nl9fKQorCQlpZiAoSVNfVkdBX1BPUlQocG9ydCkpIHsKKwkJCVZHQV9vdXRwYihwb3J0LCB2YWwpOworCQkJVkdBX291dHBiKHBvcnQgKyAxLCB2YWwgPj4gOCk7CisJCX0gZWxzZSBpZiAoSVNfUENJX1BPUlQocG9ydCkpCisJCQlQQ0lfb3V0cChwb3J0LCB2YWwsIFJFR19XUklURV9XT1JEKTsKKwkJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCQlEQihwcmludGYoIldBUk46IE1BeWJlIElOVkFMSUQgb3V0dy4lMDRYIDwtICUwNFhcbiIsICh1MTYpIHBvcnQsCisJCQkgICAgICAgdmFsKTspCisJCQlMT0dfb3V0cHcocG9ydCwgdmFsKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCUxPR19vdXRwdyhwb3J0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHdyaXRlIHRvCit2YWwgICAgIC0gVmFsdWUgdG8gd3JpdGUgdG8gcG9ydAorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgMzItYml0IHdyaXRlIHRvIGFuIEkvTyBwb3J0LiBXZSBoYW5kbGUgc3BlY2lhbCBjYXNlcwordGhhdCB3ZSBuZWVkIHRvIGVtdWxhdGUgaW4gaGVyZSwgYW5kIGZhbGwgdGhyb3VnaCB0byByZWZsZWN0aW5nIHRoZSB3cml0ZQordGhyb3VnaCB0byB0aGUgcmVhbCBoYXJkd2FyZSBpZiB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV9vdXRsKFg4NkVNVV9waW9BZGRyIHBvcnQsIHUzMiB2YWwpCit7CisjaWYgZGVmaW5lZChERUJVRykgfHwgIWRlZmluZWQoX19pMzg2X18pCisJaWYgKElTX1BDSV9QT1JUKHBvcnQpKQorCQlQQ0lfb3V0cChwb3J0LCB2YWwsIFJFR19XUklURV9EV09SRCk7CisJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCURCKHByaW50ZigiV0FSTjogSU5WQUxJRCBvdXRsLiUwNFggPC0gJTA4WFxuIiwgKHUxNikgcG9ydCx2YWwpOykKKwkJTE9HX291dHBkKHBvcnQsIHZhbCk7CisJfSBlbHNlCisjZW5kaWYKKwkJTE9HX291dHBkKHBvcnQsIHZhbCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zLmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTFiZmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBNb2R1bGUgaW1wbGVtZW50aW5nIHRoZSBCSU9TIHNwZWNpZmljIGZ1bmN0aW9ucy4KKyoKKyogCQlKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdCB0byBydW4gdGhlIEFUSSB2aWRlbyBjYXJkCisqIAkJdmlkZW8gQklPUy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaW9zZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50bm8gICAtIEludGVycnVwdCBudW1iZXIgYmVpbmcgc2VydmljZWQKKworUkVNQVJLUzoKK0hhbmRsZXIgZm9yIHVuZGVmaW5lZCBpbnRlcnJ1cHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSB1bmRlZmluZWRfaW50cihpbnQgaW50bm8pCit7CisJaWYgKEJFX3JkdyhpbnRubyAqIDQgKyAyKSA9PSBCSU9TX1NFRykgeworCQlEQihwcmludGYoImJpb3NFbXU6IHVuZGVmaW5lZCBpbnRlcnJ1cHQgJXhoIGNhbGxlZCFcbiIsIGludG5vKTspCisJfSBlbHNlCisJCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IHN5c3RlbSBCSU9TIEludCAxMGggKHRoZSBkZWZhdWx0IGlzIHN0b3JlZAoraW4gdGhlIEludCA0MmggdmVjdG9yIGJ5IHRoZSBzeXN0ZW0gQklPUyBhdCBib290dXApLiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlCithIHNtYWxsIG51bWJlciBvZiBzcGVjaWFsIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBCSU9TIGR1cmluZyBQT1NUIHRpbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIGludDQyKGludCBpbnRubykKK3sKKwlpZiAoTS54ODYuUl9BSCA9PSAweDEyICYmIE0ueDg2LlJfQkwgPT0gMHgzMikgeworCQlpZiAoTS54ODYuUl9BTCA9PSAwKSB7CisJCQkvKiBFbmFibGUgQ1BVIGFjY2Vzc2VzIHRvIHZpZGVvIG1lbW9yeSAqLworCQkJUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpIHwgKHU4KSAweDAyKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChNLng4Ni5SX0FMID09IDEpIHsKKwkJCS8qIERpc2FibGUgQ1BVIGFjY2Vzc2VzIHRvIHZpZGVvIG1lbW9yeSAqLworCQkJUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpICYgKHU4KSB+IDB4MDIpOworCQkJcmV0dXJuOworCQl9CisjaWZkZWYgIERFQlVHCisJCWVsc2UgeworCQkJcHJpbnRmKCJpbnQ0MjogdW5rbm93biBmdW5jdGlvbiBBSD0weDEyLCBCTD0weDMyLCBBTD0lIzAyeFxuIiwKKwkJCSAgICAgTS54ODYuUl9BTCk7CisJCX0KKyNlbmRpZgorCX0KKyNpZmRlZiAgREVCVUcKKwllbHNlIHsKKwkJcHJpbnRmKCJpbnQ0MjogdW5rbm93biBmdW5jdGlvbiBBSD0lIzAyeCwgQUw9JSMwMngsIEJMPSUjMDJ4XG4iLAorCQkgICAgIE0ueDg2LlJfQUgsIE0ueDg2LlJfQUwsIE0ueDg2LlJfQkwpOworCX0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2ludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgc3lzdGVtIEJJT1MgSW50IDEwaC4gSWYgdGhlIFBPU1QgY29kZQoraGFzIG5vdCB5ZXQgcmUtdmVjdG9yZWQgdGhlIEludCAxMGggQklPUyBpbnRlcnJ1cHQgdmVjdG9yLCB3ZSBoYW5kbGUgdGhpcworYnkgc2ltcGx5IGNhbGxpbmcgdGhlIGludDQyIGludGVycnVwdCBoYW5kbGVyIGFib3ZlLiBWZXJ5IGVhcmx5IGluIHRoZQorQklPUyBQT1NUIHByb2Nlc3MsIHRoZSB2ZWN0b3IgZ2V0cyByZXBsYWNlZCBhbmQgd2Ugc2ltcGx5IGxldCB0aGUgcmVhbAorbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciBwcm9jZXNzIHRoZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIGludDEwKGludCBpbnRubykKK3sKKwlpZiAoQkVfcmR3KGludG5vICogNCArIDIpID09IEJJT1NfU0VHKQorCQlpbnQ0MihpbnRubyk7CisJZWxzZQorCQlYODZFTVVfcHJlcGFyZUZvckludChpbnRubyk7Cit9CisKKy8qIFJlc3VsdCBjb2RlcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MgKi8KKworI2RlZmluZSBTVUNDRVNTRlVMICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRlVOQ19OT1RfU1VQUE9SVCAgICAweDgxCisjZGVmaW5lIEJBRF9WRU5ET1JfSUQgICAgICAgMHg4MworI2RlZmluZSBERVZJQ0VfTk9UX0ZPVU5EICAgIDB4ODYKKyNkZWZpbmUgQkFEX1JFR0lTVEVSX05VTUJFUiAweDg3CisjZGVmaW5lIFNFVF9GQUlMRUQgICAgICAgICAgMHg4OAorI2RlZmluZSBCVUZGRVJfVE9PX1NNQUxMICAgIDB4ODkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IEludCAxQWggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSByZWFsCittb2RlIGNvZGUsIHdoaWNoIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBQQ0kgQklPUyBmdW5jdGlvbnMuIFNpbmNlIHdlIG9ubHkKK3dhbnQgdG8gYWxsb3cgdGhlIHJlYWwgbW9kZSBCSU9TIGNvZGUgKm9ubHkqIHNlZSB0aGUgUENJIGNvbmZpZyBzcGFjZSBmb3IKK2l0cyBvd24gZGV2aWNlLCB3ZSBvbmx5IHJldHVybiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmljIFBDSSBjb25maWcKK3NwYWNlIHRoYXQgd2UgaGF2ZSBwYXNzZWQgaW4gdG8gdGhlIGluaXQgZnVuY3Rpb24uIFRoaXMgc29sdmVzIHByb2JsZW1zCit3aGVuIHVzaW5nIHRoZSBCSU9TIHRvIHdhcm0gYm9vdCBhIHNlY29uZGFyeSBhZGFwdGVyIHdoZW4gdGhlcmUgaXMgYW4KK2lkZW50aWNhbCBhZGFwdGVyIGJlZm9yZSBpdCBvbiB0aGUgYnVzIChzb21lIEJJT1MnZXMgZ2V0IGNvbmZ1c2VkIGluIHRoaXMKK2Nhc2UpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSBpbnQxQShpbnQgdW51c2VkKQoreworCXUxNiBwY2lTbG90OworCisjaWZkZWYgX19LRVJORUxfXworCXU4IGludGVyZmFjZSwgc3ViY2xhc3MsIGJhc2VjbGFzczsKKworCS8qIEluaXRpYWxpc2UgdGhlIFBDSSBzbG90IG51bWJlciAqLworCXBjaVNsb3QgPSAoKGludClfQkVfZW52LnZnYUluZm8uYnVzIDw8IDgpIHwKKwkgICAgKChpbnQpX0JFX2Vudi52Z2FJbmZvLmRldmljZSA8PCAzKSB8IChpbnQpX0JFX2Vudi52Z2FJbmZvLmZ1bmN0aW9uOworI2Vsc2UKKy8qIEZhaWwgaWYgbm8gUENJIGRldmljZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkICovCisJaWYgKCFfQkVfZW52LnZnYUluZm8ucGNpSW5mbykKKwkJcmV0dXJuOworCisJcGNpU2xvdCA9ICh1MTYpIChfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+c2xvdC5pID4+IDgpOworI2VuZGlmCisJc3dpdGNoIChNLng4Ni5SX0FYKSB7CisJY2FzZSAweEIxMDE6CQkvKiBQQ0kgYmlvcyBwcmVzZW50PyAqLworCQlNLng4Ni5SX0FMID0gMHgwMDsJLyogbm8gY29uZmlnIHNwYWNlL3NwZWNpYWwgY3ljbGUgZ2VuZXJhdGlvbiBzdXBwb3J0ICovCisJCU0ueDg2LlJfRURYID0gMHgyMDQ5NDM1MDsJLyogIiBJQ1AiICovCisJCU0ueDg2LlJfQlggPSAweDAyMTA7CS8qIFZlcnNpb24gMi4xMCAqLworCQlNLng4Ni5SX0NMID0gMDsJLyogTWF4IGJ1cyBudW1iZXIgaW4gc3lzdGVtICovCisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTAyOgkJLyogRmluZCBQQ0kgZGV2aWNlICovCisJCU0ueDg2LlJfQUggPSBERVZJQ0VfTk9UX0ZPVU5EOworI2lmZGVmIF9fS0VSTkVMX18KKwkJaWYgKE0ueDg2LlJfRFggPT0gX0JFX2Vudi52Z2FJbmZvLlZlbmRvcklEICYmCisJCSAgICBNLng4Ni5SX0NYID09IF9CRV9lbnYudmdhSW5mby5EZXZpY2VJRCAmJiBNLng4Ni5SX1NJID09IDApIHsKKyNlbHNlCisJCWlmIChNLng4Ni5SX0RYID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5WZW5kb3JJRCAmJgorCQkgICAgTS54ODYuUl9DWCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+RGV2aWNlSUQgJiYKKwkJICAgIE0ueDg2LlJfU0kgPT0gMCkgeworI2VuZGlmCisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKwkJCU0ueDg2LlJfQlggPSBwY2lTbG90OworCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKwkJYnJlYWs7CisJY2FzZSAweEIxMDM6CQkvKiBGaW5kIFBDSSBjbGFzcyBjb2RlICovCisJCU0ueDg2LlJfQUggPSBERVZJQ0VfTk9UX0ZPVU5EOworI2lmZGVmIF9fS0VSTkVMX18KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgUENJX0NMQVNTX1BST0csCisJCQkJICAgICAmaW50ZXJmYWNlKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgUENJX0NMQVNTX0RFVklDRSwKKwkJCQkgICAgICZzdWJjbGFzcyk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsCisJCQkJICAgICBQQ0lfQ0xBU1NfREVWSUNFICsgMSwgJmJhc2VjbGFzcyk7CisJCWlmIChNLng4Ni5SX0NMID09IGludGVyZmFjZSAmJiBNLng4Ni5SX0NIID09IHN1YmNsYXNzCisJCSAgICAmJiAodTgpIChNLng4Ni5SX0VDWCA+PiAxNikgPT0gYmFzZWNsYXNzKSB7CisjZWxzZQorCQlpZiAoTS54ODYuUl9DTCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+SW50ZXJmYWNlICYmCisJCSAgICBNLng4Ni5SX0NIID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5TdWJDbGFzcyAmJgorCQkgICAgKHU4KSAoTS54ODYuUl9FQ1ggPj4gMTYpID09CisJCSAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+QmFzZUNsYXNzKSB7CisjZW5kaWYKKwkJCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOworCQkJTS54ODYuUl9CWCA9IHBjaVNsb3Q7CisJCX0KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOworCQlicmVhazsKKwljYXNlIDB4QjEwODoJCS8qIFJlYWQgY29uZmlndXJhdGlvbiBieXRlICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShfQkVfZW52LnZnYUluZm8ucGNpZGV2LCBNLng4Ni5SX0RJLAorCQkJCQkgICAgICZNLng4Ni5SX0NMKTsKKyNlbHNlCisJCQlNLng4Ni5SX0NMID0KKwkJCSAgICAodTgpIFBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwgMCwgUENJX1JFQURfQllURSwKKwkJCQkJICAgICAgIF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKKyNlbmRpZgorCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKwkJYnJlYWs7CisJY2FzZSAweEIxMDk6CQkvKiBSZWFkIGNvbmZpZ3VyYXRpb24gd29yZCAqLworCQlNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKKwkJaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgeworCQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisjaWZkZWYgX19LRVJORUxfXworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgTS54ODYuUl9ESSwKKwkJCQkJICAgICAmTS54ODYuUl9DWCk7CisjZWxzZQorCQkJTS54ODYuUl9DWCA9CisJCQkgICAgKHUxNikgUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCAwLCBQQ0lfUkVBRF9XT1JELAorCQkJCQkJX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOworI2VuZGlmCisJCX0KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOworCQlicmVhazsKKwljYXNlIDB4QjEwQToJCS8qIFJlYWQgY29uZmlndXJhdGlvbiBkd29yZCAqLworCQlNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKKwkJaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgeworCQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisjaWZkZWYgX19LRVJORUxfXworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsCisJCQkJCSAgICAgIE0ueDg2LlJfREksICZNLng4Ni5SX0VDWCk7CisjZWxzZQorCQkJTS54ODYuUl9FQ1ggPQorCQkJICAgICh1MzIpIFBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwgMCwgUENJX1JFQURfRFdPUkQsCisJCQkJCQlfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTBCOgkJLyogV3JpdGUgY29uZmlndXJhdGlvbiBieXRlICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwKKwkJCQkJICAgICAgTS54ODYuUl9ESSwgTS54ODYuUl9DTCk7CisjZWxzZQorCQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCBNLng4Ni5SX0NMLCBQQ0lfV1JJVEVfQllURSwKKwkJCQkgICAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTBDOgkJLyogV3JpdGUgY29uZmlndXJhdGlvbiB3b3JkICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwKKwkJCQkJICAgICAgTS54ODYuUl9ESSwgTS54ODYuUl9DWCk7CisjZWxzZQorCQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCBNLng4Ni5SX0NYLCBQQ0lfV1JJVEVfV09SRCwKKwkJCQkgICAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTBEOgkJLyogV3JpdGUgY29uZmlndXJhdGlvbiBkd29yZCAqLworCQlNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKKwkJaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgeworCQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisjaWZkZWYgX19LRVJORUxfXworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChfQkVfZW52LnZnYUluZm8ucGNpZGV2LAorCQkJCQkgICAgICAgTS54ODYuUl9ESSwgTS54ODYuUl9FQ1gpOworI2Vsc2UKKwkJCVBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwgTS54ODYuUl9FQ1gsIFBDSV9XUklURV9EV09SRCwKKwkJCQkgICAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiYmlvc0VtdS9iaW9zLmludDFhOiB1bmtub3duIGZ1bmN0aW9uIEFYPSUjMDR4XG4iLAorCQkgICAgICAgTS54ODYuUl9BWCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIEJJT1MgZW11bGF0aW9uIGZ1bmN0aW9ucyBmb3IgdGhlIHNwZWNpZmljCitQQ0kgZGlzcGxheSBkZXZpY2UuIFdlIGluc3VsYXRlIHRoZSByZWFsIG1vZGUgQklPUyBmcm9tIGFueSBvdGhlciBkZXZpY2VzCitvbiB0aGUgYnVzLCBzbyB0aGF0IGl0IHdpbGwgd29yayBjb3JyZWN0bHkgdGhpbmtpbmcgdGhhdCBpdCBpcyB0aGUgb25seQorZGV2aWNlIHByZXNlbnQgb24gdGhlIGJ1cyAoaWU6IGF2b2lkaW5nIGFueSBhZGFwdGVycyBwcmVzZW50IGluIGZyb20gb2YKK3RoZSBkZXZpY2Ugd2UgYXJlIHRyeWluZyB0byBjb250cm9sKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJFX2NvbnN0TEVfMzIodikgICAgKCgoKCgodikmMHhmZjAwKT4+OCl8KCgodikmMHhmZik8PDgpKTw8MTYpfCgoKCgodikmMHhmZjAwMDAwMCk+PjgpfCgoKHYpJjB4MDBmZjAwMDApPDw4KSk+PjE2KSkKKwordm9pZCBfQkVfYmlvc19pbml0KHUzMiAqIGludHJUYWIpCit7CisJaW50IGk7CisJWDg2RU1VX2ludHJGdW5jcyBiaW9zX2ludHJfdGFiWzI1Nl07CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJaW50clRhYltpXSA9IEJFX2NvbnN0TEVfMzIoQklPU19TRUcgPDwgMTYpOworCQliaW9zX2ludHJfdGFiW2ldID0gdW5kZWZpbmVkX2ludHI7CisJfQorCWJpb3NfaW50cl90YWJbMHgxMF0gPSBpbnQxMDsKKwliaW9zX2ludHJfdGFiWzB4MUFdID0gaW50MUE7CisJYmlvc19pbnRyX3RhYlsweDQyXSA9IGludDQyOworCWJpb3NfaW50cl90YWJbMHg2RF0gPSBpbnQxMDsKKwlYODZFTVVfc2V0dXBJbnRyRnVuY3MoYmlvc19pbnRyX3RhYik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zZW11LmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvc2VtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2FlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvc2VtdS5jCkBAIC0wLDAgKzEsMzczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCSBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKKyoJCSAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqICBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorKgorKgkJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCVRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CU1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHN5c3RlbSBzcGVjaWZpYyBmdW5jdGlvbnMuIFRoaXMKKyoJCW1vZHVsZSBpcyBhbHdheXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbiB0aGUgT1MgZGVwZWRlbnQKKyoJCWxpYnJhcmllcywgYW5kIG5ldmVyIGluIGEgYmluYXJ5IHBvcnRhYmxlIGRyaXZlci4KKyoKKyoJCUphc29uIHBvcnRlZCB0aGlzIGZpbGUgdG8gdS1ib290IHRvIHJ1biB0aGUgQVRJIHZpZGVvIGNhcmQgQklPUworKgkJaW4gdS1ib290LiBNYWRlIGFsbCB0aGUgdmlkZW8gbWVtb3J5IGJlIGVtdWxhdGVkIGR1cmluZyB0aGUKKyoJCUJJT1MgcnVuaW5nIHByb2Nlc3Mgd2hpY2ggbWF5IGFmZmVjdCB0aGUgVkdBIGZ1bmN0aW9uIGJ1dCB0aGUKKyoJCWZyYW1idWZmZXIgZnVuY3Rpb24gY2FuIHdvcmsgYWZ0ZXIgcnVuIHRoZSBCSU9TLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpb3NlbXVpLmgiCisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19CSU9TRU1VKQorCitCRV9zeXNFbnYgX0JFX2VudiA9IHt7MH19Oworc3RhdGljIFg4NkVNVV9tZW1GdW5jcyBfQkVfbWVtIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5nb3QyIikpKSA9IHsKKwlCRV9yZGIsCisJQkVfcmR3LAorCUJFX3JkbCwKKwlCRV93cmIsCisJQkVfd3J3LAorCUJFX3dybCwKKwl9OworCitzdGF0aWMgWDg2RU1VX3Bpb0Z1bmNzIF9CRV9waW8gX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmdvdDIiKSkpID0geworCUJFX2luYiwKKwlCRV9pbncsCisJQkVfaW5sLAorCUJFX291dGIsCisJQkVfb3V0dywKKwlCRV9vdXRsLAorCX07CisKKyNkZWZpbmUgT0ZGKGFkZHIpCSh1MTYpKCgoYWRkcikgPj4gMCkgJiAweGZmZmYpCisjZGVmaW5lIFNFRyhhZGRyKQkodTE2KSgoKGFkZHIpID4+IDQpICYgMHhmMDAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2RlYnVnRmxhZ3MgIC0gRmxhZ3MgdG8gZW5hYmxlIGRlYnVnZ2luZyBvcHRpb25zIChkZWJ1ZyBidWlsZHMgb25seSkKK21lbVNpemUJICAgIC0gQW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgcmVhbCBtb2RlIG1hY2hpbmUKK2luZm8JICAgIC0gUG9pbnRlciB0byBkZWZhdWx0IFZHQSBkZXZpY2UgaW5mb3JtYXRpb24KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb25zIGluaXRpYWxpc2VzIHRoZSBCRWxpYiwgYW5kIHVzZXMgdGhlIHBhc3NlZCBpbgorQklPUyBpbWFnZSBhcyB0aGUgQklPUyB0aGF0IGlzIHVzZWQgYW5kIGVtdWxhdGVkIGF0IDB4QzAwMDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFg4NkFQSSBCRV9pbml0KHUzMiBkZWJ1Z0ZsYWdzLCBpbnQgbWVtU2l6ZSwgQkVfVkdBSW5mbyAqIGluZm8sIGludCBzaGFyZWQpCit7CisjaWYgIWRlZmluZWQoX19EUklWRVJfXykgICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCisKKwlQTV9pbml0KCk7CisjZW5kaWYKKwltZW1zZXQoJk0sIDAsIHNpemVvZihNKSk7CisJaWYgKG1lbVNpemUgPCAyMDQ4MCl7CisJCXByaW50ZigiRW11bGF0b3IgcmVxdWlyZXMgYXQgbGVhc3QgMjBLYiBvZiBtZW1vcnkhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJTS5tZW1fYmFzZSA9ICh1bnNpZ25lZCBsb25nKW1hbGxvYyhtZW1TaXplKTsKKworCWlmIChNLm1lbV9iYXNlID09IE5VTEwpeworCQlwcmludGYoIkJpb3NlbXU6T3V0IG9mIG1lbW9yeSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCU0ubWVtX3NpemUgPSBtZW1TaXplOworCisJX0JFX2Vudi5lbXVsYXRlVkdBID0gMDsKKwlfQkVfZW52LmJ1c21lbV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpbWFsbG9jKDEyOCAqIDEwMjQpOworCWlmIChfQkVfZW52LmJ1c21lbV9iYXNlID09IE5VTEwpeworCQlwcmludGYoIkJpb3NlbXU6T3V0IG9mIG1lbW9yeSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCU0ueDg2LmRlYnVnID0gZGVidWdGbGFnczsKKwlfQkVfYmlvc19pbml0KCh1MzIqKWluZm8tPkxvd01lbSk7CisJWDg2RU1VX3NldHVwTWVtRnVuY3MoJl9CRV9tZW0pOworCVg4NkVNVV9zZXR1cFBpb0Z1bmNzKCZfQkVfcGlvKTsKKwlCRV9zZXRWR0EoaW5mbyk7CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW5mbwkgICAgLSBQb2ludGVyIHRvIFZHQSBkZXZpY2UgaW5mb3JtYXRpb24gdG8gbWFrZSBjdXJyZW50CisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIFZHQSBCSU9TIGZ1bmN0aW9ucyBpbiB0aGUgZW11bGF0b3IgdG8gcG9pbnQgdG8gdGhlCitzcGVjaWZpYyBWR0EgQklPUyBpbiB1c2UuIFRoaXMgaW5jbHVkZXMgc3dhcHBpbmcgdGhlIEJJT1MgaW50ZXJydXB0Cit2ZWN0b3JzLCBCSU9TIGltYWdlIGFuZCBCSU9TIGRhdGEgYXJlYSB0byB0aGUgbmV3IEJJT1MuIFRoaXMgYWxsb3dzIHRoZQorcmVhbCBtb2RlIEJJT1MgdG8gYmUgc3dhcHBlZCB3aXRob3V0IHJlc2V0dGluZyB0aGUgZW50aXJlIGVtdWxhdG9yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX3NldFZHQShCRV9WR0FJbmZvICogaW5mbykKK3sKKworI2lmZGVmIF9fS0VSTkVMX18KKwlfQkVfZW52LnZnYUluZm8uZnVuY3Rpb24gPSBpbmZvLT5mdW5jdGlvbjsKKwlfQkVfZW52LnZnYUluZm8uZGV2aWNlID0gaW5mby0+ZGV2aWNlOworCV9CRV9lbnYudmdhSW5mby5idXMgPSBpbmZvLT5idXM7CisJX0JFX2Vudi52Z2FJbmZvLnBjaWRldiA9IGluZm8tPnBjaWRldjsKKyNlbHNlCisJX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8gPSBpbmZvLT5wY2lJbmZvOworI2VuZGlmCisJX0JFX2Vudi52Z2FJbmZvLkJJT1NJbWFnZSA9IGluZm8tPkJJT1NJbWFnZTsKKwlpZiAoaW5mby0+QklPU0ltYWdlKSB7CisJCV9CRV9lbnYuYmlvc21lbV9iYXNlID0gKHVsb25nKSBpbmZvLT5CSU9TSW1hZ2U7CisJCV9CRV9lbnYuYmlvc21lbV9saW1pdCA9IDB4QzAwMDAgKyBpbmZvLT5CSU9TSW1hZ2VMZW4gLSAxOworCX0gZWxzZSB7CisJCV9CRV9lbnYuYmlvc21lbV9iYXNlID0gX0JFX2Vudi5idXNtZW1fYmFzZSArIDB4MjAwMDA7CisJCV9CRV9lbnYuYmlvc21lbV9saW1pdCA9IDB4QzdGRkY7CisJfQorCWlmICgqKCh1MzIgKikgaW5mby0+TG93TWVtKSA9PSAwKQorCQlfQkVfYmlvc19pbml0KCh1MzIgKikgaW5mby0+TG93TWVtKTsKKwltZW1jcHkoKHU4ICopIE0ubWVtX2Jhc2UsIGluZm8tPkxvd01lbSwgc2l6ZW9mKGluZm8tPkxvd01lbSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2luZm8JICAgIC0gUG9pbnRlciB0byBWR0EgZGV2aWNlIGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGN1cnJlbnQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVkdBIEJJT1MgZnVuY3Rpb25zIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlCitlbXVsYXRvciwgc28gdGhleSBjYW4gYmUgcmVzdG9yZWQgYXQgYSBsYXRlciBkYXRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX2dldFZHQShCRV9WR0FJbmZvICogaW5mbykKK3sKKyNpZmRlZiBfX0tFUk5FTF9fCisJaW5mby0+ZnVuY3Rpb24gPSBfQkVfZW52LnZnYUluZm8uZnVuY3Rpb247CisJaW5mby0+ZGV2aWNlID0gX0JFX2Vudi52Z2FJbmZvLmRldmljZTsKKwlpbmZvLT5idXMgPSBfQkVfZW52LnZnYUluZm8uYnVzOworCWluZm8tPnBjaWRldiA9IF9CRV9lbnYudmdhSW5mby5wY2lkZXY7CisjZWxzZQorCWluZm8tPnBjaUluZm8gPSBfQkVfZW52LnZnYUluZm8ucGNpSW5mbzsKKyNlbmRpZgorCWluZm8tPkJJT1NJbWFnZSA9IF9CRV9lbnYudmdhSW5mby5CSU9TSW1hZ2U7CisJbWVtY3B5KGluZm8tPkxvd01lbSwgKHU4ICopIE0ubWVtX2Jhc2UsIHNpemVvZihpbmZvLT5Mb3dNZW0pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityX3NlZwktIFNlZ21lbnQgZm9yIHBvaW50ZXIgdG8gY29udmVydAorcl9vZmYJLSBPZmZzZXQgZm9yIHBvaW50ZXIgdG8gY29udmVydAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBtYXBzIGEgcmVhbCBtb2RlIHBvaW50ZXIgaW4gdGhlIGVtdWxhdG9yIG1lbW9yeSB0byBhIHByb3RlY3RlZAorbW9kZSBwb2ludGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlyZWN0bHkgYWNjZXNzIHRoZSBtZW1vcnkuCisKK05PVEU6CVRoZSBtZW1vcnkgaXMgKmFsd2F5cyogaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvbiBvbiBub24teDg2CisJc3lzdGVtcyB5b3Ugd2lsbCBuZWVkIHRvIGRvIGVuZGlhbiB0cmFuc2xhdGlvbnMgdG8gYWNjZXNzIHRoaXMKKwltZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqWDg2QVBJIEJFX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsIHVpbnQgcl9vZmYpCit7CisJdTMyIGFkZHIgPSAoKHUzMikgcl9zZWcgPDwgNCkgKyByX29mZjsKKworCWlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKKwkJcmV0dXJuICh2b2lkICopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApOworCX0gZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgeworCQlyZXR1cm4gKHZvaWQgKikoX0JFX2Vudi5idXNtZW1fYmFzZSArIGFkZHIgLSAweEEwMDAwKTsKKwl9CisJcmV0dXJuICh2b2lkICopKE0ubWVtX2Jhc2UgKyBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitsZW4JLSBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgVkVTQSBidWZmZXIKK3JzZWcJLSBQbGFjZSB0byBzdG9yZSBWRVNBIGJ1ZmZlciBzZWdtZW50Cityb2ZmCS0gUGxhY2UgdG8gc3RvcmUgVkVTQSBidWZmZXIgb2Zmc2V0CisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGluIHJlYWwKK19CRV9waW9tb2RlIGVtdWxhdG9yIG1lbW9yeS4gVGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGlzIGFsd2F5cyAxMDI0IGJ5dGVzIGxvbmcsCithbmQgbG9jYXRlZCBhdCAxNUtiIGludG8gdGhlIHN0YXJ0IG9mIHRoZSByZWFsIG1vZGUgbWVtb3J5ICgxNktiIGlzIHdoZXJlCit3ZSBwdXQgdGhlIHJlYWwgbW9kZSBjb2RlIHdlIGV4ZWN1dGUgZm9yIGlzc3VpbmcgaW50ZXJydXB0cykuCisKK05PVEU6CVRoZSBtZW1vcnkgaXMgKmFsd2F5cyogaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvbiBvbiBub24teDg2CisJc3lzdGVtcyB5b3Ugd2lsbCBuZWVkIHRvIGRvIGVuZGlhbiB0cmFuc2xhdGlvbnMgdG8gYWNjZXNzIHRoaXMKKwltZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqWDg2QVBJIEJFX2dldFZFU0FCdWYodWludCAqIGxlbiwgdWludCAqIHJzZWcsIHVpbnQgKiByb2ZmKQoreworCSpsZW4gPSAxMDI0OworCSpyc2VnID0gU0VHKDB4MDNDMDApOworCSpyb2ZmID0gT0ZGKDB4MDNDMDApOworCXJldHVybiAodm9pZCAqKShNLm1lbV9iYXNlICsgKCh1MzIpICogcnNlZyA8PCA0KSArICpyb2ZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDbGVhbnMgdXAgYW5kIGV4aXRzIHRoZSBlbXVsYXRvci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV9leGl0KHZvaWQpCit7CisJZnJlZShNLm1lbV9iYXNlKTsKKwlmcmVlKF9CRV9lbnYuYnVzbWVtX2Jhc2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZwktIFNlZ21lbnQgb2YgY29kZSB0byBjYWxsCitvZmYJLSBPZmZzZXQgb2YgY29kZSB0byBjYWxsCityZWdzCS0gUmVhbCBtb2RlIHJlZ2lzdGVycyB0byBsb2FkCitzcmVncwktIFJlYWwgbW9kZSBzZWdtZW50IHJlZ2lzdGVycyB0byBsb2FkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAorYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KK09uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiB0aGUgc2FtZQorc3RydWN0dXJlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV9jYWxsUmVhbE1vZGUodWludCBzZWcsIHVpbnQgb2ZmLCBSTVJFR1MgKiByZWdzLCBSTVNSRUdTICogc3JlZ3MpCit7CisJTS54ODYuUl9FQVggPSByZWdzLT5lLmVheDsKKwlNLng4Ni5SX0VCWCA9IHJlZ3MtPmUuZWJ4OworCU0ueDg2LlJfRUNYID0gcmVncy0+ZS5lY3g7CisJTS54ODYuUl9FRFggPSByZWdzLT5lLmVkeDsKKwlNLng4Ni5SX0VTSSA9IHJlZ3MtPmUuZXNpOworCU0ueDg2LlJfRURJID0gcmVncy0+ZS5lZGk7CisJTS54ODYuUl9EUyA9IHNyZWdzLT5kczsKKwlNLng4Ni5SX0VTID0gc3JlZ3MtPmVzOworCU0ueDg2LlJfRlMgPSBzcmVncy0+ZnM7CisJTS54ODYuUl9HUyA9IHNyZWdzLT5nczsKKworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAwXSA9IDB4OUE7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDFdID0gKHU4KSBvZmY7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDJdID0gKHU4KSAob2ZmID4+IDgpOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAzXSA9ICh1OCkgc2VnOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDA0XSA9ICh1OCkgKHNlZyA+PiA4KTsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwNV0gPSAweEYxOwkvKiBJbGxlZ2FsIG9wLWNvZGUgKi8KKwlNLng4Ni5SX0NTID0gU0VHKDB4MDQwMDApOworCU0ueDg2LlJfSVAgPSBPRkYoMHgwNDAwMCk7CisKKwlNLng4Ni5SX1NTID0gU0VHKE0ubWVtX3NpemUgLSAyKTsKKwlNLng4Ni5SX1NQID0gT0ZGKE0ubWVtX3NpemUgLSAyKSArIDI7CisKKwlYODZFTVVfZXhlYygpOworCisJcmVncy0+ZS5jZmxhZyA9IE0ueDg2LlJfRUZMRyAmIEZfQ0Y7CisJcmVncy0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKKwlyZWdzLT5lLmVieCA9IE0ueDg2LlJfRUJYOworCXJlZ3MtPmUuZWN4ID0gTS54ODYuUl9FQ1g7CisJcmVncy0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKKwlyZWdzLT5lLmVzaSA9IE0ueDg2LlJfRVNJOworCXJlZ3MtPmUuZWRpID0gTS54ODYuUl9FREk7CisJc3JlZ3MtPmRzID0gTS54ODYuUl9EUzsKKwlzcmVncy0+ZXMgPSBNLng4Ni5SX0VTOworCXNyZWdzLT5mcyA9IE0ueDg2LlJfRlM7CisJc3JlZ3MtPmdzID0gTS54ODYuUl9HUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubwktIEludGVycnVwdCBudW1iZXIgdG8gZXhlY3V0ZQoraW4JLSBSZWFsIG1vZGUgcmVnaXN0ZXJzIHRvIGxvYWQKK291dAktIFBsYWNlIHRvIHN0b3JlIHJlc3VsdGluZyByZWFsIG1vZGUgcmVnaXN0ZXJzCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAorYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KK09uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiBvdXQgc3R1Y3R1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFg4NkFQSSBCRV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqIGluLCBSTVJFR1MgKiBvdXQpCit7CisJTS54ODYuUl9FQVggPSBpbi0+ZS5lYXg7CisJTS54ODYuUl9FQlggPSBpbi0+ZS5lYng7CisJTS54ODYuUl9FQ1ggPSBpbi0+ZS5lY3g7CisJTS54ODYuUl9FRFggPSBpbi0+ZS5lZHg7CisJTS54ODYuUl9FU0kgPSBpbi0+ZS5lc2k7CisJTS54ODYuUl9FREkgPSBpbi0+ZS5lZGk7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDBdID0gMHhDRDsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpIGludG5vOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAyXSA9IDB4RjE7CisJTS54ODYuUl9DUyA9IFNFRygweDA0MDAwKTsKKwlNLng4Ni5SX0lQID0gT0ZGKDB4MDQwMDApOworCisJTS54ODYuUl9TUyA9IFNFRyhNLm1lbV9zaXplIC0gMSk7CisJTS54ODYuUl9TUCA9IE9GRihNLm1lbV9zaXplIC0gMSkgLSAxOworCisJWDg2RU1VX2V4ZWMoKTsKKwlvdXQtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOworCW91dC0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKKwlvdXQtPmUuZWJ4ID0gTS54ODYuUl9FQlg7CisJb3V0LT5lLmVjeCA9IE0ueDg2LlJfRUNYOworCW91dC0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKKwlvdXQtPmUuZXNpID0gTS54ODYuUl9FU0k7CisJb3V0LT5lLmVkaSA9IE0ueDg2LlJfRURJOworCXJldHVybiBvdXQtPnguYXg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50bm8JLSBJbnRlcnJ1cHQgbnVtYmVyIHRvIGV4ZWN1dGUKK2luCS0gUmVhbCBtb2RlIHJlZ2lzdGVycyB0byBsb2FkCitvdXQJLSBQbGFjZSB0byBzdG9yZSByZXN1bHRpbmcgcmVhbCBtb2RlIHJlZ2lzdGVycworc3JlZ3MJLSBSZWFsIG1vZGUgc2VnbWVudCByZWdpc3RlcnMgdG8gbG9hZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbnMgY2FsbHMgYSByZWFsIG1vZGUgaW50ZXJydXB0IGZ1bmN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcywKK2FuZCBsb2FkcyBhbGwgdGhlIHg4NiByZWdpc3RlcnMgZnJvbSB0aGUgcGFzc2VkIGluIHJlZ2lzdGVycyBzdHJ1Y3R1cmUuCitPbiBleGl0IHRoZSByZWdpc3RlcnMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCBhcmUgcmV0dXJuZWQgaW4gb3V0IHN0dWN0dXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBYODZBUEkgQkVfaW50ODZ4KGludCBpbnRubywgUk1SRUdTICogaW4sIFJNUkVHUyAqIG91dCwgUk1TUkVHUyAqIHNyZWdzKQoreworCU0ueDg2LlJfRUFYID0gaW4tPmUuZWF4OworCU0ueDg2LlJfRUJYID0gaW4tPmUuZWJ4OworCU0ueDg2LlJfRUNYID0gaW4tPmUuZWN4OworCU0ueDg2LlJfRURYID0gaW4tPmUuZWR4OworCU0ueDg2LlJfRVNJID0gaW4tPmUuZXNpOworCU0ueDg2LlJfRURJID0gaW4tPmUuZWRpOworCU0ueDg2LlJfRFMgPSBzcmVncy0+ZHM7CisJTS54ODYuUl9FUyA9IHNyZWdzLT5lczsKKwlNLng4Ni5SX0ZTID0gc3JlZ3MtPmZzOworCU0ueDg2LlJfR1MgPSBzcmVncy0+Z3M7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDBdID0gMHhDRDsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpIGludG5vOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAyXSA9IDB4RjE7CisJTS54ODYuUl9DUyA9IFNFRygweDA0MDAwKTsKKwlNLng4Ni5SX0lQID0gT0ZGKDB4MDQwMDApOworCisJTS54ODYuUl9TUyA9IFNFRyhNLm1lbV9zaXplIC0gMSk7CisJTS54ODYuUl9TUCA9IE9GRihNLm1lbV9zaXplIC0gMSkgLSAxOworCisJWDg2RU1VX2V4ZWMoKTsKKwlvdXQtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOworCW91dC0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKKwlvdXQtPmUuZWJ4ID0gTS54ODYuUl9FQlg7CisJb3V0LT5lLmVjeCA9IE0ueDg2LlJfRUNYOworCW91dC0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKKwlvdXQtPmUuZXNpID0gTS54ODYuUl9FU0k7CisJb3V0LT5lLmVkaSA9IE0ueDg2LlJfRURJOworCXNyZWdzLT5kcyA9IE0ueDg2LlJfRFM7CisJc3JlZ3MtPmVzID0gTS54ODYuUl9FUzsKKwlzcmVncy0+ZnMgPSBNLng4Ni5SX0ZTOworCXNyZWdzLT5ncyA9IE0ueDg2LlJfR1M7CisJcmV0dXJuIG91dC0+eC5heDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jpb3NlbXVpLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvc2VtdWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVlNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jpb3NlbXVpLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKgkJICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOglBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJSW50ZXJuYWwgaGVhZGVyIGZpbGUgZm9yIHRoZSBCSU9TIGVtdWxhdG9yIGxpYnJhcnkuCisqCisqCQlKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdCwgQWRkZWQgc29tZSBhcmNoaXRlY3R1cmUKKyoJCXJlbGF0ZWQgTWFjcm8uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQklPU0VNVUlfSAorI2RlZmluZSBfX0JJT1NFTVVJX0gKKworI2luY2x1ZGUgImJpb3NlbXUuaCIKKyNpbmNsdWRlIDxhc20vaW8uaD4KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQih4KQl4CisjZWxzZQorI2RlZmluZSBEQih4KQlkb3t9d2hpbGUoMCk7CisjZW5kaWYKKworI2RlZmluZSBCSU9TX1NFRwkweGZmZjAKK2V4dGVybiBYODZFTVVfc3lzRW52IF9YODZFTVVfZW52OworI2RlZmluZSBNCQlfWDg2RU1VX2VudgorCisvKiBNYWNyb3MgdG8gcmVhZCBhbmQgd3JpdGUgdmFsdWVzIHRvIHg4NiBlbXVsYXRvciBtZW1vcnkuIE1lbW9yeSBpcyBhbHdheXMKKyAqIGNvbnNpZGVyZWQgdG8gYmUgbGl0dGxlIGVuZGlhbiwgc28gd2UgdXNlIG1hY3JvcyB0byBkbyBlbmRpYW4gc3dhcHBpbmcKKyAqIHdoZXJlIG5lY2Vzc2FyeS4KKyAqLworCisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyNkZWZpbmUgcmVhZGJfbGUoYmFzZSkJICAgICooKHU4KikoYmFzZSkpCisjZGVmaW5lIHJlYWR3X2xlKGJhc2UpCSAgICAoKHUxNilyZWFkYl9sZShiYXNlKSB8ICgodTE2KXJlYWRiX2xlKChiYXNlKSArIDEpIDw8IDgpKQorI2RlZmluZSByZWFkbF9sZShiYXNlKQkgICAgKCh1MzIpcmVhZGJfbGUoKGJhc2UpICsgMCkgfCAoKHUzMilyZWFkYl9sZSgoYmFzZSkgKyAxKSA8PCA4KSB8IFwKKwkJCSAgICAoKHUzMilyZWFkYl9sZSgoYmFzZSkgKyAyKSA8PCAxNikgfCAoKHUzMilyZWFkYl9sZSgoYmFzZSkgKyAzKSA8PCAyNCkpCisjZGVmaW5lIHdyaXRlYl9sZShiYXNlLCB2KSAgKigodTgqKShiYXNlKSkgPSAodikKKyNkZWZpbmUgd3JpdGV3X2xlKGJhc2UsIHYpICB3cml0ZWJfbGUoYmFzZSArIDAsICh2ID4+IDApICYgMHhmZiksCVwKKwkJCSAgICB3cml0ZWJfbGUoYmFzZSArIDEsICh2ID4+IDgpICYgMHhmZikKKyNkZWZpbmUgd3JpdGVsX2xlKGJhc2UsIHYpICB3cml0ZWJfbGUoYmFzZSArIDAsICh2ID4+IDApICYgMHhmZiksCVwKKwkJCSAgICB3cml0ZWJfbGUoYmFzZSArIDEsICh2ID4+IDgpICYgMHhmZiksCVwKKwkJCSAgICB3cml0ZWJfbGUoYmFzZSArIDIsICh2ID4+IDE2KSAmIDB4ZmYpLAlcCisJCQkgICAgd3JpdGViX2xlKGJhc2UgKyAzLCAodiA+PiAyNCkgJiAweGZmKQorI2Vsc2UKKyNkZWZpbmUgcmVhZGJfbGUoYmFzZSkJICAgICooKHU4KikoYmFzZSkpCisjZGVmaW5lIHJlYWR3X2xlKGJhc2UpCSAgICAqKCh1MTYqKShiYXNlKSkKKyNkZWZpbmUgcmVhZGxfbGUoYmFzZSkJICAgICooKHUzMiopKGJhc2UpKQorI2RlZmluZSB3cml0ZWJfbGUoYmFzZSwgdikgICooKHU4KikoYmFzZSkpID0gKHYpCisjZGVmaW5lIHdyaXRld19sZShiYXNlLCB2KSAgKigodTE2KikoYmFzZSkpID0gKHYpCisjZGVmaW5lIHdyaXRlbF9sZShiYXNlLCB2KSAgKigodTMyKikoYmFzZSkpID0gKHYpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiBjb2RlcyBwYXNzZWQgdG8gdGhlIGVtdWxhdGVkIEkvTyBwb3J0IGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgdGhlCit0eXBlIG9mIG9wZXJhdGlvbiB0byBwZXJmb3JtLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisJUkVHX1JFQURfQllURSA9IDAsCisJUkVHX1JFQURfV09SRCA9IDEsCisJUkVHX1JFQURfRFdPUkQgPSAyLAorCVJFR19XUklURV9CWVRFID0gMywKKwlSRUdfV1JJVEVfV09SRCA9IDQsCisJUkVHX1dSSVRFX0RXT1JEID0gNQorfSBSZWdpc3RlckZsYWdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIGNvZGVzIHBhc3NlZCB0byB0aGUgZW11bGF0ZWQgSS9PIHBvcnQgZnVuY3Rpb25zIHRvIGRldGVybWluZSB0aGUKK3R5cGUgb2Ygb3BlcmF0aW9uIHRvIHBlcmZvcm0uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKwlQT1JUX0JZVEUgPSAxLAorCVBPUlRfV09SRCA9IDIsCisJUE9SVF9EV09SRCA9IDMsCit9IFBvcnRJbmZvRmxhZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBmb3IgdGhlIEJJT1MgZW11bGF0b3Igc3lzdGVtCitlbnZpcm9ubWVudCBhcyB1c2VkIGJ5IHRoZSBYODYgZW11bGF0b3IgbGlicmFyeS4KKworSEVBREVSOgorYmlvc2VtdS5oCisKK01FTUJFUlM6Cit0eXBlCSAgICAtIFR5cGUgb2YgcG9ydCBhY2Nlc3MgKDEgPSBieXRlLCAyID0gd29yZCwgMyA9IGR3b3JkKQorZGVmVmFsCSAgICAtIERlZmF1bHQgcG93ZXIgb24gdmFsdWUKK2ZpbmFsVmFsICAgIC0gRmluYWwgdmFsdWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggdHlwZTsKKwl1MzIgZGVmVmFsOworCXUzMiBmaW5hbFZhbDsKK30gQkVfcG9ydEluZm87CisKKyNkZWZpbmUgUE1faW5wYihwb3J0KQlpbmIocG9ydCtWSURFT19JT19PRkZTRVQpCisjZGVmaW5lIFBNX2lucHcocG9ydCkJaW53KHBvcnQrVklERU9fSU9fT0ZGU0VUKQorI2RlZmluZSBQTV9pbnBkKHBvcnQpCWlubChwb3J0K1ZJREVPX0lPX09GRlNFVCkKKyNkZWZpbmUgUE1fb3V0cGIocG9ydCx2YWwpCW91dGIodmFsLHBvcnQrVklERU9fSU9fT0ZGU0VUKQorI2RlZmluZSBQTV9vdXRwdyhwb3J0LHZhbCkJb3V0dyh2YWwscG9ydCtWSURFT19JT19PRkZTRVQpCisjZGVmaW5lIFBNX291dHBkKHBvcnQsdmFsKQlvdXRsKHZhbCxwb3J0K1ZJREVPX0lPX09GRlNFVCkKKworI2RlZmluZSBMT0dfaW5wYihwb3J0KQlQTV9pbnBiKHBvcnQpCisjZGVmaW5lIExPR19pbnB3KHBvcnQpCVBNX2lucHcocG9ydCkKKyNkZWZpbmUgTE9HX2lucGQocG9ydCkJUE1faW5wZChwb3J0KQorI2RlZmluZSBMT0dfb3V0cGIocG9ydCx2YWwpCVBNX291dHBiKHBvcnQsdmFsKQorI2RlZmluZSBMT0dfb3V0cHcocG9ydCx2YWwpCVBNX291dHB3KHBvcnQsdmFsKQorI2RlZmluZSBMT0dfb3V0cGQocG9ydCx2YWwpCVBNX291dHBkKHBvcnQsdmFsKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBiaW9zLmMgKi8KKwordm9pZCBfQkVfYmlvc19pbml0KHUzMiAqIGludHJUYWIpOwordm9pZCBfQkVfc2V0dXBfZnVuY3Modm9pZCk7CisKKy8qIGJlc3lzLmMgKi8KKyNkZWZpbmUgREVCVUdfSU8oKQkoTS54ODYuZGVidWcgJiBERUJVR19JT19UUkFDRV9GKQorCit1OCBYODZBUEkgQkVfcmRiKHUzMiBhZGRyKTsKK3UxNiBYODZBUEkgQkVfcmR3KHUzMiBhZGRyKTsKK3UzMiBYODZBUEkgQkVfcmRsKHUzMiBhZGRyKTsKK3ZvaWQgWDg2QVBJIEJFX3dyYih1MzIgYWRkciwgdTggdmFsKTsKK3ZvaWQgWDg2QVBJIEJFX3dydyh1MzIgYWRkciwgdTE2IHZhbCk7Cit2b2lkIFg4NkFQSSBCRV93cmwodTMyIGFkZHIsIHUzMiB2YWwpOworCit1OCBYODZBUEkgQkVfaW5iKFg4NkVNVV9waW9BZGRyIHBvcnQpOwordTE2IFg4NkFQSSBCRV9pbncoWDg2RU1VX3Bpb0FkZHIgcG9ydCk7Cit1MzIgWDg2QVBJIEJFX2lubChYODZFTVVfcGlvQWRkciBwb3J0KTsKK3ZvaWQgWDg2QVBJIEJFX291dGIoWDg2RU1VX3Bpb0FkZHIgcG9ydCwgdTggdmFsKTsKK3ZvaWQgWDg2QVBJIEJFX291dHcoWDg2RU1VX3Bpb0FkZHIgcG9ydCwgdTE2IHZhbCk7Cit2b2lkIFg4NkFQSSBCRV9vdXRsKFg4NkVNVV9waW9BZGRyIHBvcnQsIHUzMiB2YWwpOworI2VuZGlmCisvKiBfX0JJT1NFTVVJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL2Jpb3NlbXUuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL2Jpb3NlbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2NiMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUvYmlvc2VtdS5oCkBAIC0wLDAgKzEsMzkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSByZWFsIG1vZGUgeDg2IEJJT1MgZW11bGF0b3IsIHdoaWNoIGlzCisqICAgICAgICAgICAgICAgdXNlZCB0byB3YXJtYm9vdCBhbnkgbnVtYmVyIG9mIFZHQSBjb21wYXRpYmxlIFBDSS9BR1AKKyogICAgICAgICAgICAgICBjb250cm9sbGVycyB1bmRlciBhbnkgT1MsIG9uIGFueSBwcm9jZXNzb3IgZmFtaWx5IHRoYXQKKyogICAgICAgICAgICAgICBzdXBwb3J0cyBQQ0kuIFdlIGFsc28gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY2FsbAorKiAgICAgICAgICAgICAgIHJlYWwgbW9kZSBCSU9TIGZ1bmN0aW9ucyBhbmQgSW50IDEwaCBmdW5jdGlvbnMgKGluY2x1ZGluZworKiAgICAgICAgICAgICAgIHRoZSBWRVNBIEJJT1MpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0JJT1NFTVVfSAorI2RlZmluZSBfX0JJT1NFTVVfSAorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgIng4NmVtdS5oIgorI2Vsc2UKKyNpbmNsdWRlICJ4ODZlbXUuaCIKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgInBjaWxpYi5oIgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgcGFjaygxKQorCisjaWZuZGVmIF9fS0VSTkVMX18KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgVkdBCitjb250cm9sbGVyLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYWxsb3cgdGhlIFZHQSBjb250cm9sbGVyIHRvIGJlCitzd2FwcGVkIG9uIHRoZSBmbHkgd2l0aGluIHRoZSBCSU9TIGVtdWxhdG9yLgorCitIRUFERVI6CitiaW9zZW11LmgKKworTUVNQkVSUzoKK3BjaUluZm8gICAgICAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYmxvY2sgZm9yIHRoZSBjb250cm9sbGVyCitCSU9TSW1hZ2UgICAgICAgLSBQb2ludGVyIHRvIGEgcmVhZC93cml0ZSBjb3B5IG9mIHRoZSBCSU9TIGltYWdlCitCSU9TSW1hZ2VMZW4gICAgLSBMZW5ndGggb2YgdGhlIEJJT1MgaW1hZ2UKK0xvd01lbSAgICAgICAgICAtIENvcHkgb2Yga2V5IGxvdyBtZW1vcnkgYXJlYXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJUENJRGV2aWNlSW5mbyAqcGNpSW5mbzsKKwl2b2lkICpCSU9TSW1hZ2U7CisJdWxvbmcgQklPU0ltYWdlTGVuOworCXVjaGFyIExvd01lbVsxNTM2XTsKK30gQkVfVkdBSW5mbzsKKyNlbHNlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGRldGFpbHMgZm9yIHRoZSBCSU9TIGVtdWxhdG9yIHN5c3RlbQorZW52aXJvbm1lbnQgYXMgdXNlZCBieSB0aGUgWDg2IGVtdWxhdG9yIGxpYnJhcnkuCisKK0hFQURFUjoKK2Jpb3NlbXUuaAorCitNRU1CRVJTOgordmdhSW5mbyAgICAgICAgIC0gVkdBIEJJT1MgaW5mb3JtYXRpb24gc3RydWN0dXJlCitiaW9zbWVtX2Jhc2UgICAgLSBCYXNlIG9mIHRoZSBCSU9TIGltYWdlCitiaW9zbWVtX2xpbWl0ICAgLSBMaW1pdCBvZiB0aGUgQklPUyBpbWFnZQorYnVzbWVtX2Jhc2UgICAgIC0gQmFzZSBvZiB0aGUgVkdBIGJ1cyBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGZ1bmN0aW9uOworCWludCBkZXZpY2U7CisJaW50IGJ1czsKKwl1MzIgVmVuZG9ySUQ7CisJdTMyIERldmljZUlEOworCXBjaV9kZXZfdCBwY2lkZXY7CisJdm9pZCAqQklPU0ltYWdlOworCXUzMiBCSU9TSW1hZ2VMZW47CisJdTggTG93TWVtWzE1MzZdOworfSBCRV9WR0FJbmZvOworCisjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLworCisjZGVmaW5lIENSVF9DICAgMjQJCS8qIDI0ICBDUlQgQ29udHJvbGxlciBSZWdpc3RlcnMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVRUX0MgICAyMQkJLyogMjEgIEF0dHJpYnV0ZSBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAqLworI2RlZmluZSBHUkFfQyAgIDkJCS8qIDkgICBHcmFwaGljcyBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAgKi8KKyNkZWZpbmUgU0VRX0MgICA1CQkvKiA1ICAgU2VxdWVuY2VyIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBBTF9DICAgNzY4CQkvKiA3NjggUGFsZXR0ZSBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBmb3IgdGhlIEJJT1MgZW11bGF0b3Igc3lzdGVtCitlbnZpcm9ubWVudCBhcyB1c2VkIGJ5IHRoZSBYODYgZW11bGF0b3IgbGlicmFyeS4KKworSEVBREVSOgorYmlvc2VtdS5oCisKK01FTUJFUlM6Cit2Z2FJbmZvICAgICAgICAgLSBWR0EgQklPUyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKK2Jpb3NtZW1fYmFzZSAgICAtIEJhc2Ugb2YgdGhlIEJJT1MgaW1hZ2UKK2Jpb3NtZW1fbGltaXQgICAtIExpbWl0IG9mIHRoZSBCSU9TIGltYWdlCitidXNtZW1fYmFzZSAgICAgLSBCYXNlIG9mIHRoZSBWR0EgYnVzIG1lbW9yeQordGltZXIgICAgICAgICAgIC0gVGltZXIgdXNlZCB0byBlbXVsYXRlIFBDIHRpbWVyIHBvcnRzCit0aW1lcjAgICAgICAgICAgLSBMYXRjaGVkIHZhbHVlIGZvciB0aW1lciAwCit0aW1lcjBMYXRjaGVkICAgLSBUcnVlIGlmIHRpbWVyIDAgdmFsdWUgd2FzIGp1c3QgbGF0Y2hlZAordGltZXIyICAgICAgICAgIC0gQ3VycmVudCB2YWx1ZSBmb3IgdGltZXIgMgorZW11bGF0ZVZHQSAgICAgIC0gVHJ1ZSB0byBlbXVsYXRlIFZHQSBJL08gYW5kIG1lbW9yeSBhY2Nlc3NlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCUJFX1ZHQUluZm8gdmdhSW5mbzsKKwl1bG9uZyBiaW9zbWVtX2Jhc2U7CisJdWxvbmcgYmlvc21lbV9saW1pdDsKKwl1bG9uZyBidXNtZW1fYmFzZTsKKworCXUzMiB0aW1lcjA7CisJaW50IHRpbWVyMExhdGNoZWQ7CisJdTMyIHRpbWVyMTsKKwlpbnQgdGltZXIxTGF0Y2hlZDsKKwl1MzIgdGltZXIyOworCWludCB0aW1lcjJMYXRjaGVkOworCisJaW50IGVtdWxhdGVWR0E7CisJdTggZW11NjE7CisJdTggZW11NzA7CisJaW50IGZsaXBGbG9wM0MwOworCXUzMiBjb25maWdBZGRyZXNzOworCXU4IGVtdTNDMDsKKwl1OCBlbXUzQzFbQVRUX0NdOworCXU4IGVtdTNDMjsKKwl1OCBlbXUzQzQ7CisJdTggZW11M0M1W1NFUV9DXTsKKwl1OCBlbXUzQzY7CisJdWludCBlbXUzQzc7CisJdWludCBlbXUzQzg7CisJdTggZW11M0M5W1BBTF9DXTsKKwl1OCBlbXUzQ0U7CisJdTggZW11M0NGW0dSQV9DXTsKKwl1OCBlbXUzRDQ7CisJdTggZW11M0Q1W0NSVF9DXTsKKwl1OCBlbXUzREE7CisKK30gQkVfc3lzRW52OworCisjaWZkZWYgX19LRVJORUxfXworCisvKiBEZWZpbmUgc29tZSB0eXBlcyB3aGVuIGNvbXBpbGluZyBmb3IgdGhlIExpbnV4IGtlcm5lbCB0aGF0IG5vcm1hbGx5CisgKiBjb21lIGZyb20gdGhlIFNjaVRlY2ggUE0gbGlicmFyeS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSAzMi1iaXQgZXh0ZW5kZWQgeDg2IENQVSByZWdpc3RlcnMKKworSEVBREVSOgorcG1hcGkuaAorCitNRU1CRVJTOgorZWF4ICAgICAtIFZhbHVlIG9mIHRoZSBFQVggcmVnaXN0ZXIKK2VieCAgICAgLSBWYWx1ZSBvZiB0aGUgRUJYIHJlZ2lzdGVyCitlY3ggICAgIC0gVmFsdWUgb2YgdGhlIEVDWCByZWdpc3RlcgorZWR4ICAgICAtIFZhbHVlIG9mIHRoZSBFRFggcmVnaXN0ZXIKK2VzaSAgICAgLSBWYWx1ZSBvZiB0aGUgRVNJIHJlZ2lzdGVyCitlZGkgICAgIC0gVmFsdWUgb2YgdGhlIEVESSByZWdpc3RlcgorY2ZsYWcgICAtIFZhbHVlIG9mIHRoZSBjYXJyeSBmbGFnCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBlYXg7CisJdTMyIGVieDsKKwl1MzIgZWN4OworCXUzMiBlZHg7CisJdTMyIGVzaTsKKwl1MzIgZWRpOworCXUzMiBjZmxhZzsKK30gUk1EV09SRFJFR1M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIDE2LWJpdCB4ODYgQ1BVIHJlZ2lzdGVycworCitIRUFERVI6CitwbWFwaS5oCisKK01FTUJFUlM6CitheCAgICAgIC0gVmFsdWUgb2YgdGhlIEFYIHJlZ2lzdGVyCitieCAgICAgIC0gVmFsdWUgb2YgdGhlIEJYIHJlZ2lzdGVyCitjeCAgICAgIC0gVmFsdWUgb2YgdGhlIENYIHJlZ2lzdGVyCitkeCAgICAgIC0gVmFsdWUgb2YgdGhlIERYIHJlZ2lzdGVyCitzaSAgICAgIC0gVmFsdWUgb2YgdGhlIFNJIHJlZ2lzdGVyCitkaSAgICAgIC0gVmFsdWUgb2YgdGhlIERJIHJlZ2lzdGVyCitjZmxhZyAgIC0gVmFsdWUgb2YgdGhlIGNhcnJ5IGZsYWcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19CSUdfRU5ESUFOX18KK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgYXhfaGksIGF4OworCXUxNiBieF9oaSwgYng7CisJdTE2IGN4X2hpLCBjeDsKKwl1MTYgZHhfaGksIGR4OworCXUxNiBzaV9oaSwgc2k7CisJdTE2IGRpX2hpLCBkaTsKKwl1MTYgY2ZsYWdfaGksIGNmbGFnOworfSBSTVdPUkRSRUdTOworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgYXgsIGF4X2hpOworCXUxNiBieCwgYnhfaGk7CisJdTE2IGN4LCBjeF9oaTsKKwl1MTYgZHgsIGR4X2hpOworCXUxNiBzaSwgc2lfaGk7CisJdTE2IGRpLCBkaV9oaTsKKwl1MTYgY2ZsYWcsIGNmbGFnX2hpOworfSBSTVdPUkRSRUdTOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIDgtYml0IHg4NiBDUFUgcmVnaXN0ZXJzCisKK0hFQURFUjoKK3BtYXBpLmgKKworTUVNQkVSUzoKK2FsICAgICAgLSBWYWx1ZSBvZiB0aGUgQUwgcmVnaXN0ZXIKK2FoICAgICAgLSBWYWx1ZSBvZiB0aGUgQUggcmVnaXN0ZXIKK2JsICAgICAgLSBWYWx1ZSBvZiB0aGUgQkwgcmVnaXN0ZXIKK2JoICAgICAgLSBWYWx1ZSBvZiB0aGUgQkggcmVnaXN0ZXIKK2NsICAgICAgLSBWYWx1ZSBvZiB0aGUgQ0wgcmVnaXN0ZXIKK2NoICAgICAgLSBWYWx1ZSBvZiB0aGUgQ0ggcmVnaXN0ZXIKK2RsICAgICAgLSBWYWx1ZSBvZiB0aGUgREwgcmVnaXN0ZXIKK2RoICAgICAgLSBWYWx1ZSBvZiB0aGUgREggcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19CSUdfRU5ESUFOX18KK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgYXhfaGk7CisJdTggYWgsIGFsOworCXUxNiBieF9oaTsKKwl1OCBiaCwgYmw7CisJdTE2IGN4X2hpOworCXU4IGNoLCBjbDsKKwl1MTYgZHhfaGk7CisJdTggZGgsIGRsOworfSBSTUJZVEVSRUdTOworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsKKwl1OCBhbDsKKwl1OCBhaDsKKwl1MTYgYXhfaGk7CisJdTggYmw7CisJdTggYmg7CisJdTE2IGJ4X2hpOworCXU4IGNsOworCXU4IGNoOworCXUxNiBjeF9oaTsKKwl1OCBkbDsKKwl1OCBkaDsKKwl1MTYgZHhfaGk7Cit9IFJNQllURVJFR1M7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbGwgdGhlIHg4NiBDUFUgcmVnaXN0ZXJzCisKK0hFQURFUjoKK3BtYXBpLmgKKworTUVNQkVSUzoKK2UgICAtIE1lbWJlciB0byBhY2Nlc3MgcmVnaXN0ZXJzIGFzIDMyLWJpdCB2YWx1ZXMKK3ggICAtIE1lbWJlciB0byBhY2Nlc3MgcmVnaXN0ZXJzIGFzIDE2LWJpdCB2YWx1ZXMKK2ggICAtIE1lbWJlciB0byBhY2Nlc3MgcmVnaXN0ZXJzIGFzIDgtYml0IHZhbHVlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdW5pb24geworCVJNRFdPUkRSRUdTIGU7CisJUk1XT1JEUkVHUyB4OworCVJNQllURVJFR1MgaDsKK30gUk1SRUdTOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZXNjcmliaW5nIGFsbCB0aGUgeDg2IHNlZ21lbnQgcmVnaXN0ZXJzCisKK0hFQURFUjoKK3BtYXBpLmgKKworTUVNQkVSUzoKK2VzICAtIEVTIHNlZ21lbnQgcmVnaXN0ZXIKK2NzICAtIENTIHNlZ21lbnQgcmVnaXN0ZXIKK3NzICAtIFNTIHNlZ21lbnQgcmVnaXN0ZXIKK2RzICAtIERTIHNlZ21lbnQgcmVnaXN0ZXIKK2ZzICAtIEZTIHNlZ21lbnQgcmVnaXN0ZXIKK2dzICAtIEdTIHNlZ21lbnQgcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGVzOworCXUxNiBjczsKKwl1MTYgc3M7CisJdTE2IGRzOworCXUxNiBmczsKKwl1MTYgZ3M7Cit9IFJNU1JFR1M7CisKKyNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCisKKyNpZm5kZWYgX19LRVJORUxfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZWZpbmluZyBhbGwgdGhlIEJJT1MgRW11bGF0b3IgQVBJIGZ1bmN0aW9ucyBhcyBleHBvcnRlZCBmcm9tCit0aGUgQmluYXJ5IFBvcnRhYmxlIERMTC4KK3tzZWNyZXR9CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVsb25nIGR3U2l6ZTsKKwkgaWJvb2woUE1BUElQIEJFX2luaXQpICh1MzIgZGVidWdGbGFncywgaW50IG1lbVNpemUsIEJFX1ZHQUluZm8gKiBpbmZvKTsKKwl2b2lkIChQTUFQSVAgQkVfc2V0VkdBKSAoQkVfVkdBSW5mbyAqIGluZm8pOworCXZvaWQgKFBNQVBJUCBCRV9nZXRWR0EpIChCRV9WR0FJbmZvICogaW5mbyk7CisJdm9pZCAqKFBNQVBJUCBCRV9tYXBSZWFsUG9pbnRlcikgKHVpbnQgcl9zZWcsIHVpbnQgcl9vZmYpOworCXZvaWQgKihQTUFQSVAgQkVfZ2V0VkVTQUJ1ZikgKHVpbnQgKiBsZW4sIHVpbnQgKiByc2VnLCB1aW50ICogcm9mZik7CisJdm9pZCAoUE1BUElQIEJFX2NhbGxSZWFsTW9kZSkgKHVpbnQgc2VnLCB1aW50IG9mZiwgUk1SRUdTICogcmVncywKKwkJCQkgICAgICAgUk1TUkVHUyAqIHNyZWdzKTsKKwlpbnQgKFBNQVBJUCBCRV9pbnQ4NikgKGludCBpbnRubywgUk1SRUdTICogaW4sIFJNUkVHUyAqIG91dCk7CisJaW50IChQTUFQSVAgQkVfaW50ODZ4KSAoaW50IGludG5vLCBSTVJFR1MgKiBpbiwgUk1SRUdTICogb3V0LAorCQkJCVJNU1JFR1MgKiBzcmVncyk7CisJdm9pZCAqcmVzZXJ2ZWQxOworCXZvaWQgKFBNQVBJUCBCRV9leGl0KSAodm9pZCk7Cit9IEJFX2V4cG9ydHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gcG9pbnRlciB0eXBlIGZvciB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCBpbml0aWFsaXNhdGlvbiBlbnRyeSBwb2ludC4KK3tzZWNyZXR9CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBCRV9leHBvcnRzICooUE1BUElQIEJFX2luaXRMaWJyYXJ5X3QpIChQTV9pbXBvcnRzICogUE1JbXApOworI2VuZGlmCisKKyNwcmFnbWEgcGFjaygpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgewkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKworLyoge3NlY3JldH0gR2xvYmFsIEJJT1MgZW11bGF0b3Igc3lzdGVtIGVudmlyb25tZW50ICovCisJZXh0ZXJuIEJFX3N5c0VudiBfQkVfZW52OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBCSU9TIGVtdWxhdG9yIGxpYnJhcnkgZW50cnkgcG9pbnRzICovCisJaW50IFg4NkFQSSBCRV9pbml0KHUzMiBkZWJ1Z0ZsYWdzLCBpbnQgbWVtU2l6ZSwgQkVfVkdBSW5mbyAqIGluZm8sCisJCQkgICBpbnQgc2hhcmVkKTsKKwl2b2lkIFg4NkFQSSBCRV9zZXRWR0EoQkVfVkdBSW5mbyAqIGluZm8pOworCXZvaWQgWDg2QVBJIEJFX2dldFZHQShCRV9WR0FJbmZvICogaW5mbyk7CisJdm9pZCBYODZBUEkgQkVfc2V0RGVidWdGbGFncyh1MzIgZGVidWdGbGFncyk7CisJdm9pZCAqWDg2QVBJIEJFX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsIHVpbnQgcl9vZmYpOworCXZvaWQgKlg4NkFQSSBCRV9nZXRWRVNBQnVmKHVpbnQgKiBsZW4sIHVpbnQgKiByc2VnLCB1aW50ICogcm9mZik7CisJdm9pZCBYODZBUEkgQkVfY2FsbFJlYWxNb2RlKHVpbnQgc2VnLCB1aW50IG9mZiwgUk1SRUdTICogcmVncywKKwkJCQkgICAgUk1TUkVHUyAqIHNyZWdzKTsKKwlpbnQgWDg2QVBJIEJFX2ludDg2KGludCBpbnRubywgUk1SRUdTICogaW4sIFJNUkVHUyAqIG91dCk7CisJaW50IFg4NkFQSSBCRV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKiBpbiwgUk1SRUdTICogb3V0LAorCQkJICAgICBSTVNSRUdTICogc3JlZ3MpOworCXZvaWQgWDg2QVBJIEJFX2V4aXQodm9pZCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30JCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAgICAgKi8KKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9fQklPU0VNVV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDRiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUuaApAQCAtMCwwICsxLDE5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHB1YmxpYyBzcGVjaWZpYyBmdW5jdGlvbnMuCisqICAgICAgICAgICAgICAgQW55IGFwcGxpY2F0aW9uIGxpbmtpbmcgYWdhaW5zdCB1cyBzaG91bGQgb25seQorKiAgICAgICAgICAgICAgIGluY2x1ZGUgdGhpcyBoZWFkZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfWDg2RU1VX0gKKyNkZWZpbmUgX19YODZFTVVfWDg2RU1VX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2RlZmluZSBYODZBUEkKKyNkZWZpbmUgWDg2QVBJUCAqCit0eXBlZGVmIHUxNiBYODZFTVVfcGlvQWRkcjsKKworI2luY2x1ZGUgIng4NmVtdS9yZWdzLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgcGFjaygxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9udGVycyB0byBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbnMgdXNlZCBieSB0aGUKK2VtdWxhdG9yLiBUaGlzIGlzIHVzZWQgc28gdGhhdCB0aGUgdXNlciBwcm9ncmFtIGNhbiBob29rIGFsbCBwcm9ncmFtbWVkCitJL08gZm9yIHRoZSBlbXVsYXRvciB0byBoYW5kbGVkIGFzIG5lY2Vzc2FyeSBieSB0aGUgdXNlciBwcm9ncmFtLiBCeQorZGVmYXVsdCB0aGUgZW11bGF0b3IgY29udGFpbnMgc2ltcGxlIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCBkbyBhY2Nlc3MgdGhlCitoYXJkd2FyZSBpbiBhbnkgd2F5LiBUbyBhbGxvdyB0aGUgZW11YWx0b3IgYWNjZXNzIHRoZSBoYXJkd2FyZSwgeW91IHdpbGwKK25lZWQgdG8gb3ZlcnJpZGUgdGhlIHByb2dyYW1tZWQgSS9PIGZ1bmN0aW9ucyB1c2luZyB0aGUgWDg2RU1VX3NldHVwUGlvRnVuY3MKK2Z1bmN0aW9uLgorCitIRUFERVI6Cit4ODZlbXUuaAorCitNRU1CRVJTOgoraW5iICAgICAtIEZ1bmN0aW9uIHRvIHJlYWQgYSBieXRlIGZyb20gYW4gSS9PIHBvcnQKK2ludyAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgd29yZCBmcm9tIGFuIEkvTyBwb3J0CitpbmwgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGR3b3JkIGZyb20gYW4gSS9PIHBvcnQKK291dGIgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGJ5dGUgdG8gYW4gSS9PIHBvcnQKK291dHcgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIHdvcmQgdG8gYW4gSS9PIHBvcnQKK291dGwgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGR3b3JkIHRvIGFuIEkvTyBwb3J0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4KFg4NkFQSVAgaW5iKSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJdTE2KFg4NkFQSVAgaW53KSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJdTMyKFg4NkFQSVAgaW5sKSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJdm9pZCAoWDg2QVBJUCBvdXRiKSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKTsKKwl2b2lkIChYODZBUElQIG91dHcpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKTsKKwl2b2lkIChYODZBUElQIG91dGwpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1MzIgdmFsKTsKK30gWDg2RU1VX3Bpb0Z1bmNzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9udGVycyB0byBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZQorZW11bGF0b3IuIFRoaXMgaXMgdXNlZCBzbyB0aGF0IHRoZSB1c2VyIHByb2dyYW0gY2FuIGhvb2sgYWxsIG1lbW9yeQorYWNjZXNzIGZ1bmN0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBlbXVsYXRvci4gQnkgZGVmYXVsdCB0aGUgZW11bGF0b3IKK2NvbnRhaW5zIHNpbXBsZSBmdW5jdGlvbnMgdGhhdCBvbmx5IGFjY2VzcyB0aGUgaW50ZXJuYWwgbWVtb3J5IG9mIHRoZQorZW11bGF0b3IuIElmIHlvdSBuZWVkIHNwZWNpYWxpc2VkIGZ1bmN0aW9ucyB0byBoYW5kbGUgYWNjZXNzIHRvIGRpZmZlcmVudAordHlwZXMgb2YgbWVtb3J5IChpZTogaGFyZHdhcmUgZnJhbWVidWZmZXIgYWNjZXNzZXMgYW5kIEJJT1MgbWVtb3J5IGFjY2VzcworZXRjKSwgeW91IHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIHVzaW5nIHRoZSBYODZFTVVfc2V0dXBNZW1GdW5jcworZnVuY3Rpb24uCisKK0hFQURFUjoKK3g4NmVtdS5oCisKK01FTUJFUlM6CityZGIgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGJ5dGUgZnJvbSBhbiBhZGRyZXNzCityZHcgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIHdvcmQgZnJvbSBhbiBhZGRyZXNzCityZGwgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGR3b3JkIGZyb20gYW4gYWRkcmVzcword3JiICAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgYnl0ZSB0byBhbiBhZGRyZXNzCit3cncgICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSB3b3JkIHRvIGFuIGFkZHJlc3MKK3dybCAgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGR3b3JkIHRvIGFuIGFkZHJlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdTgoWDg2QVBJUCByZGIpICh1MzIgYWRkcik7CisJdTE2KFg4NkFQSVAgcmR3KSAodTMyIGFkZHIpOworCXUzMihYODZBUElQIHJkbCkgKHUzMiBhZGRyKTsKKwl2b2lkIChYODZBUElQIHdyYikgKHUzMiBhZGRyLCB1OCB2YWwpOworCXZvaWQgKFg4NkFQSVAgd3J3KSAodTMyIGFkZHIsIHUxNiB2YWwpOworCXZvaWQgKFg4NkFQSVAgd3JsKSAodTMyIGFkZHIsIHUzMiB2YWwpOworfSBYODZFTVVfbWVtRnVuY3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEhlcmUgYXJlIHRoZSBkZWZhdWx0IG1lbW9yeSByZWFkIGFuZCB3cml0ZQorICBmdW5jdGlvbiBpbiBjYXNlIHRoZXkgYXJlIG5lZWRlZCBhcyBmYWxsYmFja3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdTggWDg2QVBJIHJkYih1MzIgYWRkcik7CitleHRlcm4gdTE2IFg4NkFQSSByZHcodTMyIGFkZHIpOworZXh0ZXJuIHUzMiBYODZBUEkgcmRsKHUzMiBhZGRyKTsKK2V4dGVybiB2b2lkIFg4NkFQSSB3cmIodTMyIGFkZHIsIHU4IHZhbCk7CitleHRlcm4gdm9pZCBYODZBUEkgd3J3KHUzMiBhZGRyLCB1MTYgdmFsKTsKK2V4dGVybiB2b2lkIFg4NkFQSSB3cmwodTMyIGFkZHIsIHUzMiB2YWwpOworCisjcHJhZ21hIHBhY2soKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB2b2lkIChYODZBUElQIFg4NkVNVV9pbnRyRnVuY3MpIChpbnQgbnVtKTsKK2V4dGVybiBYODZFTVVfaW50ckZ1bmNzIF9YODZFTVVfaW50clRhYlsyNTZdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKwl2b2lkIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKFg4NkVNVV9tZW1GdW5jcyAqIGZ1bmNzKTsKKwl2b2lkIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKFg4NkVNVV9waW9GdW5jcyAqIGZ1bmNzKTsKKwl2b2lkIFg4NkVNVV9zZXR1cEludHJGdW5jcyhYODZFTVVfaW50ckZ1bmNzIGZ1bmNzW10pOworCXZvaWQgWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50IG51bSk7CisKKy8qIGRlY29kZS5jICovCisKKwl2b2lkIFg4NkVNVV9leGVjKHZvaWQpOworCXZvaWQgWDg2RU1VX2hhbHRfc3lzKHZvaWQpOworCisjaWZkZWYgIERFQlVHCisjZGVmaW5lIEhBTFRfU1lTKCkgIFwKKyAgICBwcmludGYoImhhbHRfc3lzOiBmaWxlICVzLCBsaW5lICVkXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pLCBcCisgICAgWDg2RU1VX2hhbHRfc3lzKCkKKyNlbHNlCisjZGVmaW5lIEhBTFRfU1lTKCkgIFg4NkVNVV9oYWx0X3N5cygpCisjZW5kaWYKKworLyogRGVidWcgb3B0aW9ucyAqLworCisjZGVmaW5lIERFQlVHX0RFQ09ERV9GICAgICAgICAgIDB4MDAwMQkvKiBwcmludCBkZWNvZGVkIGluc3RydWN0aW9uICAqLworI2RlZmluZSBERUJVR19UUkFDRV9GICAgICAgICAgICAweDAwMDIJLyogZHVtcCByZWdzIGJlZm9yZS9hZnRlciBleGVjdXRpb24gKi8KKyNkZWZpbmUgREVCVUdfU1RFUF9GICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIERFQlVHX0RJU0FTU0VNQkxFX0YgICAgIDB4MDAwOAorI2RlZmluZSBERUJVR19CUkVBS19GICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgREVCVUdfU1ZDX0YgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIERFQlVHX1NBVkVfQ1NfSVAgICAgICAgIDB4MDA0MAorI2RlZmluZSBERUJVR19GU19GICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgREVCVUdfUFJPQ19GICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIERFQlVHX1NZU0lOVF9GICAgICAgICAgIDB4MDIwMAkvKiBiaW9zIHN5c3RlbSBpbnRlcnJ1cHRzLiAqLworI2RlZmluZSBERUJVR19UUkFDRUNBTExfRiAgICAgICAweDA0MDAKKyNkZWZpbmUgREVCVUdfSU5TVFJVTUVOVF9GICAgICAgMHgwODAwCisjZGVmaW5lIERFQlVHX01FTV9UUkFDRV9GICAgICAgIDB4MTAwMAorI2RlZmluZSBERUJVR19JT19UUkFDRV9GICAgICAgICAweDIwMDAKKyNkZWZpbmUgREVCVUdfVFJBQ0VDQUxMX1JFR1NfRiAgMHg0MDAwCisjZGVmaW5lIERFQlVHX0RFQ09ERV9OT1BSSU5UX0YgIDB4ODAwMAorI2RlZmluZSBERUJVR19FWElUICAgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIERFQlVHX1NZU19GICAgICAgICAgICAgIChERUJVR19TVkNfRnxERUJVR19GU19GfERFQlVHX1BST0NfRikKKworCXZvaWQgWDg2RU1VX3RyYWNlX3JlZ3Modm9pZCk7CisJdm9pZCBYODZFTVVfdHJhY2VfeHJlZ3Modm9pZCk7CisJdm9pZCBYODZFTVVfZHVtcF9tZW1vcnkodTE2IHNlZywgdTE2IG9mZiwgdTMyIGFtdCk7CisJaW50IFg4NkVNVV90cmFjZV9vbih2b2lkKTsKKwlpbnQgWDg2RU1VX3RyYWNlX29mZih2b2lkKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQkJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLworI2VuZGlmCisjZW5kaWYJCQkJLyogX19YODZFTVVfWDg2RU1VX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9kZWJ1Zy5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4YzlkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9kZWJ1Zy5oCkBAIC0wLDAgKzEsMjA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyoJCSAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLglUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglIZWFkZXIgZmlsZSBmb3IgZGVidWcgZGVmaW5pdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX0RFQlVHX0gKKyNkZWZpbmUgX19YODZFTVVfREVCVUdfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjaGVja3MgdG8gYmUgZW5hYmxlZCBmb3IgInJ1bnRpbWUiICovCisKKyNkZWZpbmUgQ0hFQ0tfSVBfRkVUQ0hfRgkJMHgxCisjZGVmaW5lIENIRUNLX1NQX0FDQ0VTU19GCQkweDIKKyNkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTU19GCQkweDQJLyp1c2luZyByZWd1bGFyIGxpbmVhciBwb2ludGVyICovCisjZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTX0YJCTB4OAkvKnVzaW5nIHNlZ21lbnQ6b2Zmc2V0ICovCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgQ0hFQ0tfSVBfRkVUQ0goKQkJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfSVBfRkVUQ0hfRikKKyMgZGVmaW5lIENIRUNLX1NQX0FDQ0VTUygpCQkoTS54ODYuY2hlY2sgJiBDSEVDS19TUF9BQ0NFU1NfRikKKyMgZGVmaW5lIENIRUNLX01FTV9BQ0NFU1MoKQkJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfTUVNX0FDQ0VTU19GKQorIyBkZWZpbmUgQ0hFQ0tfREFUQV9BQ0NFU1MoKQkJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfREFUQV9BQ0NFU1NfRikKKyNlbHNlCisjIGRlZmluZSBDSEVDS19JUF9GRVRDSCgpCisjIGRlZmluZSBDSEVDS19TUF9BQ0NFU1MoKQorIyBkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTUygpCisjIGRlZmluZSBDSEVDS19EQVRBX0FDQ0VTUygpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBERUJVR19JTlNUUlVNRU5UKCkJKE0ueDg2LmRlYnVnICYgREVCVUdfSU5TVFJVTUVOVF9GKQorIyBkZWZpbmUgREVCVUdfREVDT0RFKCkJCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0RFQ09ERV9GKQorIyBkZWZpbmUgREVCVUdfVFJBQ0UoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfVFJBQ0VfRikKKyMgZGVmaW5lIERFQlVHX1NURVAoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfU1RFUF9GKQorIyBkZWZpbmUgREVCVUdfRElTQVNTRU1CTEUoKQkoTS54ODYuZGVidWcgJiBERUJVR19ESVNBU1NFTUJMRV9GKQorIyBkZWZpbmUgREVCVUdfQlJFQUsoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfQlJFQUtfRikKKyMgZGVmaW5lIERFQlVHX1NWQygpCQkoTS54ODYuZGVidWcgJiBERUJVR19TVkNfRikKKyMgZGVmaW5lIERFQlVHX1NBVkVfSVBfQ1MoKQkoTS54ODYuZGVidWcgJiBERUJVR19TQVZFX0NTX0lQKQorCisjIGRlZmluZSBERUJVR19GUygpCQkoTS54ODYuZGVidWcgJiBERUJVR19GU19GKQorIyBkZWZpbmUgREVCVUdfUFJPQygpCQkoTS54ODYuZGVidWcgJiBERUJVR19QUk9DX0YpCisjIGRlZmluZSBERUJVR19TWVNJTlQoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfU1lTSU5UX0YpCisjIGRlZmluZSBERUJVR19UUkFDRUNBTEwoKQkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRUNBTExfRikKKyMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTFJFR1MoKQkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRUNBTExfUkVHU19GKQorIyBkZWZpbmUgREVCVUdfU1lTKCkJCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NZU19GKQorIyBkZWZpbmUgREVCVUdfTUVNX1RSQUNFKCkJKE0ueDg2LmRlYnVnICYgREVCVUdfTUVNX1RSQUNFX0YpCisjIGRlZmluZSBERUJVR19JT19UUkFDRSgpCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0lPX1RSQUNFX0YpCisjIGRlZmluZSBERUJVR19ERUNPREVfTk9QUklOVCgpIChNLng4Ni5kZWJ1ZyAmIERFQlVHX0RFQ09ERV9OT1BSSU5UX0YpCisjZWxzZQorIyBkZWZpbmUgREVCVUdfSU5TVFJVTUVOVCgpCTAKKyMgZGVmaW5lIERFQlVHX0RFQ09ERSgpCQkwCisjIGRlZmluZSBERUJVR19UUkFDRSgpCQkwCisjIGRlZmluZSBERUJVR19TVEVQKCkJCTAKKyMgZGVmaW5lIERFQlVHX0RJU0FTU0VNQkxFKCkJMAorIyBkZWZpbmUgREVCVUdfQlJFQUsoKQkJMAorIyBkZWZpbmUgREVCVUdfU1ZDKCkJCTAKKyMgZGVmaW5lIERFQlVHX1NBVkVfSVBfQ1MoKQkwCisjIGRlZmluZSBERUJVR19GUygpCQkwCisjIGRlZmluZSBERUJVR19QUk9DKCkJCTAKKyMgZGVmaW5lIERFQlVHX1NZU0lOVCgpCQkwCisjIGRlZmluZSBERUJVR19UUkFDRUNBTEwoKQkwCisjIGRlZmluZSBERUJVR19UUkFDRUNBTExSRUdTKCkJMAorIyBkZWZpbmUgREVCVUdfU1lTKCkJCTAKKyMgZGVmaW5lIERFQlVHX01FTV9UUkFDRSgpCTAKKyMgZGVmaW5lIERFQlVHX0lPX1RSQUNFKCkJMAorIyBkZWZpbmUgREVCVUdfREVDT0RFX05PUFJJTlQoKSAwCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisKKyMgZGVmaW5lIERFQ09ERV9QUklOVEYoeCkJaWYgKERFQlVHX0RFQ09ERSgpKSBcCisJCQkJICAgIHg4NmVtdV9kZWNvZGVfcHJpbnRmKHgpCisjIGRlZmluZSBERUNPREVfUFJJTlRGMih4LHkpCWlmIChERUJVR19ERUNPREUoKSkgXAorCQkJCSAgICB4ODZlbXVfZGVjb2RlX3ByaW50ZjIoeCx5KQorCisvKgorICogVGhlIGZvbGxvd2luZyBhbGxvdyB1cyB0byBsb29rIGF0IHRoZSBieXRlcyBvZiBhbiBpbnN0cnVjdGlvbi4gIFRoZQorICogZmlyc3QgSU5DUl9JTlNUUk5fTEVOLCBpcyBjYWxsZWQgZXZlcnl0aW1lIGJ5dGVzIGFyZSBjb25zdW1lZCBpbgorICogdGhlIGRlY29kaW5nIHByb2Nlc3MuICBUaGUgU0FWRV9JUF9DUyBpcyBjYWxsZWQgaW5pdGlhbGx5IHdoZW4gdGhlCisgKiBtYWpvciBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uIGlzIGFjY2Vzc2VkLgorICovCisjZGVmaW5lIElOQ19ERUNPREVEX0lOU1RfTEVOKHgpCQkJICAgIFwKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpCQkJCSAgICBcCisJeDg2ZW11X2luY19kZWNvZGVkX2luc3RfbGVuKHgpCisKKyNkZWZpbmUgU0FWRV9JUF9DUyh4LHkpCQkJCQkJXAorICAgIGlmIChERUJVR19ERUNPREUoKSB8IERFQlVHX1RSQUNFQ0FMTCgpIHwgREVCVUdfQlJFQUsoKSBcCisJICAgICAgfCBERUJVR19JT19UUkFDRSgpIHwgREVCVUdfU0FWRV9JUF9DUygpKSB7IFwKKwlNLng4Ni5zYXZlZF9jcyA9IHg7CQkJCQlcCisJTS54ODYuc2F2ZWRfaXAgPSB5OwkJCQkJXAorICAgIH0KKyNlbHNlCisjIGRlZmluZSBJTkNfREVDT0RFRF9JTlNUX0xFTih4KQorIyBkZWZpbmUgREVDT0RFX1BSSU5URih4KQorIyBkZWZpbmUgREVDT0RFX1BSSU5URjIoeCx5KQorIyBkZWZpbmUgU0FWRV9JUF9DUyh4LHkpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFRSQUNFX1JFR1MoKQkJCQkJICAgIFwKKyAgICBpZiAoREVCVUdfRElTQVNTRU1CTEUoKSkgewkJCQkgICAgXAorCXg4NmVtdV9qdXN0X2Rpc2Fzc2VtYmxlKCk7CQkJICAgIFwKKwlnb3RvIEVuZE9mVGhlSW5zdHJ1Y3Rpb25Qcm9jZWR1cmU7CQkgICAgXAorICAgIH0JCQkJCQkJICAgIFwKKyAgICBpZiAoREVCVUdfVFJBQ0UoKSB8fCBERUJVR19ERUNPREUoKSkgWDg2RU1VX3RyYWNlX3JlZ3MoKQorI2Vsc2UKKyMgZGVmaW5lIFRSQUNFX1JFR1MoKQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgU0lOR0xFX1NURVAoKQkgICAgaWYgKERFQlVHX1NURVAoKSkgeDg2ZW11X3NpbmdsZV9zdGVwKCkKKyNlbHNlCisjIGRlZmluZSBTSU5HTEVfU1RFUCgpCisjZW5kaWYKKworI2RlZmluZSBUUkFDRV9BTkRfU1RFUCgpICAgIFwKKyAgICBUUkFDRV9SRUdTKCk7CSAgICBcCisgICAgU0lOR0xFX1NURVAoKQorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIFNUQVJUX09GX0lOU1RSKCkKKyMgZGVmaW5lIEVORF9PRl9JTlNUUigpCSAgICBFbmRPZlRoZUluc3RydWN0aW9uUHJvY2VkdXJlOiB4ODZlbXVfZW5kX2luc3RyKCk7CisjIGRlZmluZSBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKSAgICB4ODZlbXVfZW5kX2luc3RyKCk7CisjZWxzZQorIyBkZWZpbmUgU1RBUlRfT0ZfSU5TVFIoKQorIyBkZWZpbmUgRU5EX09GX0lOU1RSKCkKKyMgZGVmaW5lIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSAgQ0FMTF9UUkFDRSh1LHYsdyx4LHMpCQkJCQlcCisgICAgaWYgKERFQlVHX1RSQUNFQ0FMTFJFR1MoKSkJCQkJCVwKKwl4ODZlbXVfZHVtcF9yZWdzKCk7CQkJCQlcCisgICAgaWYgKERFQlVHX1RSQUNFQ0FMTCgpKQkJCQkJXAorCXByaW50aygiJTA0eDolMDR4OiBDQUxMICVzJTA0eDolMDR4XG4iLCB1ICwgdiwgcywgdywgeCk7CisjIGRlZmluZSBSRVRVUk5fVFJBQ0Uobix1LHYpCQkJCQlcCisgICAgaWYgKERFQlVHX1RSQUNFQ0FMTFJFR1MoKSkJCQkJCVwKKwl4ODZlbXVfZHVtcF9yZWdzKCk7CQkJCQlcCisgICAgaWYgKERFQlVHX1RSQUNFQ0FMTCgpKQkJCQkJXAorCXByaW50aygiJTA0eDolMDR4OiAlc1xuIix1LHYsbik7CisjZWxzZQorIyBkZWZpbmUgQ0FMTF9UUkFDRSh1LHYsdyx4LHMpCisjIGRlZmluZSBSRVRVUk5fVFJBQ0Uobix1LHYpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCKHgpCXgKKyNlbHNlCisjZGVmaW5lIERCKHgpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKwlleHRlcm4gdm9pZCB4ODZlbXVfaW5jX2RlY29kZWRfaW5zdF9sZW4oaW50IHgpOworCWV4dGVybiB2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmKGNoYXIgKngpOworCWV4dGVybiB2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmMihjaGFyICp4LCBpbnQgeSk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUodm9pZCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X3NpbmdsZV9zdGVwKHZvaWQpOworCWV4dGVybiB2b2lkIHg4NmVtdV9lbmRfaW5zdHIodm9pZCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2R1bXBfcmVncyh2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfZHVtcF94cmVncyh2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfcHJpbnRfaW50X3ZlY3QodTE2IGl2KTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfaW5zdHJ1bWVudF9pbnN0cnVjdGlvbih2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKHZvaWQpOworCWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19zcF9hY2Nlc3Modm9pZCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3ModTMyIHApOworCWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19kYXRhX2FjY2Vzcyh1aW50IHMsIHVpbnQgbyk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQkJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKwkgICAgKi8KKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9fWDg2RU1VX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9kZWNvZGUuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9kZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc2OWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L2RlY29kZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBpbnN0cnVjdGlvbiBkZWNvZGluZyBsb2dpYy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfREVDT0RFX0gKKyNkZWZpbmUgX19YODZFTVVfREVDT0RFX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSW5zdHJ1Y3Rpb24gRGVjb2RpbmcgU3R1ZmYgKi8KKworI2RlZmluZSBGRVRDSF9ERUNPREVfTU9EUk0obW9kLHJoLHJsKSAgIGZldGNoX2RlY29kZV9tb2RybSgmbW9kLCZyaCwmcmwpCisjZGVmaW5lIERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHIpICAgICAgZGVjb2RlX3JtX2J5dGVfcmVnaXN0ZXIocikKKyNkZWZpbmUgREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocikgICAgICBkZWNvZGVfcm1fd29yZF9yZWdpc3RlcihyKQorI2RlZmluZSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyKSAgICAgIGRlY29kZV9ybV9sb25nX3JlZ2lzdGVyKHIpCisjZGVmaW5lIERFQ09ERV9DTEVBUl9TRUdPVlIoKSAgICAgICAgICAgTS54ODYubW9kZSAmPSB+U1lTTU9ERV9DTFJNQVNLCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKwordm9pZCAgICB4ODZlbXVfaW50cl9yYWlzZSAodTggdHlwZSk7Cit2b2lkICAgIGZldGNoX2RlY29kZV9tb2RybSAoaW50ICptb2QsaW50ICpyZWdoLGludCAqcmVnbCk7Cit1OCAgICAgIGZldGNoX2J5dGVfaW1tICh2b2lkKTsKK3UxNiAgICAgZmV0Y2hfd29yZF9pbW0gKHZvaWQpOwordTMyICAgICBmZXRjaF9sb25nX2ltbSAodm9pZCk7Cit1OCAgICAgIGZldGNoX2RhdGFfYnl0ZSAodWludCBvZmZzZXQpOwordTggICAgICBmZXRjaF9kYXRhX2J5dGVfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0KTsKK3UxNiAgICAgZmV0Y2hfZGF0YV93b3JkICh1aW50IG9mZnNldCk7Cit1MTYgICAgIGZldGNoX2RhdGFfd29yZF9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQpOwordTMyICAgICBmZXRjaF9kYXRhX2xvbmcgKHVpbnQgb2Zmc2V0KTsKK3UzMiAgICAgZmV0Y2hfZGF0YV9sb25nX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfYnl0ZSAodWludCBvZmZzZXQsIHU4IHZhbCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfYnl0ZV9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHU4IHZhbCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfd29yZCAodWludCBvZmZzZXQsIHUxNiB2YWwpOwordm9pZCAgICBzdG9yZV9kYXRhX3dvcmRfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0LCB1MTYgdmFsKTsKK3ZvaWQgICAgc3RvcmVfZGF0YV9sb25nICh1aW50IG9mZnNldCwgdTMyIHZhbCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHUzMiB2YWwpOwordTgqICAgICBkZWNvZGVfcm1fYnl0ZV9yZWdpc3RlcihpbnQgcmVnKTsKK3UxNiogICAgZGVjb2RlX3JtX3dvcmRfcmVnaXN0ZXIoaW50IHJlZyk7Cit1MzIqICAgIGRlY29kZV9ybV9sb25nX3JlZ2lzdGVyKGludCByZWcpOwordTE2KiAgICBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKGludCByZWcpOwordW5zaWduZWQgZGVjb2RlX3JtMDBfYWRkcmVzcyhpbnQgcm0pOwordW5zaWduZWQgZGVjb2RlX3JtMDFfYWRkcmVzcyhpbnQgcm0pOwordW5zaWduZWQgZGVjb2RlX3JtMTBfYWRkcmVzcyhpbnQgcm0pOwordW5zaWduZWQgZGVjb2RlX3JtWFhfYWRkcmVzcyhpbnQgbW9kLCBpbnQgcm0pOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9ERUNPREVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L29wcy5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjIzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvb3BzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIG9wZXJhbmQgZGVjb2RpbmcgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9PUFNfSAorI2RlZmluZSBfX1g4NkVNVV9PUFNfSAorCitleHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYlsweDEwMF0pKHU4IG9wMSk7CitleHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYjJbMHgxMDBdKSh1OCBvcDIpOworCisjZW5kaWYgLyogX19YODZFTVVfT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9wcmltX2FzbS5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3ByaW1fYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiNGNhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9wcmltX2FzbS5oCkBAIC0wLDAgKzEsOTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBXYXRjb20gQysrIDEwLjYgb3IgbGF0ZXIKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBJbmxpbmUgYXNzZW1ibGVyIHZlcnNpb25zIG9mIHRoZSBwcmltaXRpdmUgb3BlcmFuZAorKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBmb3IgZmFzdGVyIHBlcmZvcm1hbmNlLiBBdCB0aGUgbW9tZW50IHRoaXMgaXMKKyogICAgICAgICAgICAgICB4ODYgaW5saW5lIGFzc2VtYmxlciwgYnV0IHRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBiZSByZXBsYWNlZAorKiAgICAgICAgICAgICAgIHdpdGggbmF0aXZlIGlubGluZSBhc3NlbWJsZXIgZm9yIGVhY2ggc3VwcG9ydGVkIHByb2Nlc3NvcgorKiAgICAgICAgICAgICAgIHBsYXRmb3JtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9QUklNX0FTTV9ICisjZGVmaW5lIF9fWDg2RU1VX1BSSU1fQVNNX0gKKworI2lmZGVmICBfX1dBVENPTUNfXworCisjaWZuZGVmIFZBTElEQVRFCisjZGVmaW5lIF9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18KKyNlbmRpZgorCit1MzIgZ2V0X2ZsYWdzX2FzbSh2b2lkKTsKKyNwcmFnbWEgYXV4IGdldF9mbGFnc19hc20gPSAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIGVheCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheF07CisKK3UxNiBhYWFfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkKTsKKyNwcmFnbWEgYXV4IGFhYV93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYWFhIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4XTsKKwordTE2IGFhc193b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggYWFzX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhYXMiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MTYgYWFkX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCk7CisjcHJhZ21hIGF1eCBhYWRfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFhZCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheF07CisKK3UxNiBhYW1fd29yZF9hc20odTMyICogZmxhZ3MsIHU4IGQpOworI3ByYWdtYSBhdXggYWFtX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhYW0iICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1OCBhZGNfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggYWRjX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhZGMgICAgYWwsYmwiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgYWRjX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggYWRjX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhZGMgICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgYWRjX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggYWRjX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhZGMgICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IGFkZF9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBhZGRfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkZCAgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiBhZGRfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBhZGRfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkZCAgICBheCxieCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiBhZGRfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBhZGRfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkZCAgICBlYXgsZWJ4IiAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggYW5kX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGFuZF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYW5kICAgIGFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordTE2IGFuZF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGFuZF93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYW5kICAgIGF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordTMyIGFuZF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGFuZF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYW5kICAgIGVheCxlYngiICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlYnhdOworCit1OCBjbXBfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggY21wX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjbXAgICAgYWwsYmwiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgY21wX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggY21wX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjbXAgICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgY21wX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggY21wX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjbXAgICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IGRhYV9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBkYWFfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRhYSIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbF07CisKK3U4IGRhc19ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBkYXNfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRhcyIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbF07CisKK3U4IGRlY19ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBkZWNfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRlYyAgICBhbCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbF07CisKK3UxNiBkZWNfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkKTsKKyNwcmFnbWEgYXV4IGRlY193b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGVjICAgIGF4IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4XTsKKwordTMyIGRlY19sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQpOworI3ByYWdtYSBhdXggZGVjX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJkZWMgICAgZWF4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4XTsKKwordTggaW5jX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkKTsKKyNwcmFnbWEgYXV4IGluY19ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaW5jICAgIGFsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsXTsKKwordTE2IGluY193b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggaW5jX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpbmMgICAgYXgiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MzIgaW5jX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCk7CisjcHJhZ21hIGF1eCBpbmNfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImluYyAgICBlYXgiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXhdOworCit1OCBvcl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBvcl9ieXRlX2FzbSA9ICAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm9yIGFsLGJsIiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiBvcl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IG9yX3dvcmRfYXNtID0gICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAib3IgYXgsYngiICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordTMyIG9yX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggb3JfbG9uZ19hc20gPSAgICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJvciBlYXgsZWJ4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IG5lZ19ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBuZWdfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm5lZyAgICBhbCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbF07CisKK3UxNiBuZWdfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkKTsKKyNwcmFnbWEgYXV4IG5lZ193b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibmVnICAgIGF4IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4XTsKKwordTMyIG5lZ19sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQpOworI3ByYWdtYSBhdXggbmVnX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJuZWcgICAgZWF4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4XTsKKwordTggbm90X2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkKTsKKyNwcmFnbWEgYXV4IG5vdF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibm90ICAgIGFsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsXTsKKwordTE2IG5vdF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggbm90X3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJub3QgICAgYXgiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MzIgbm90X2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCk7CisjcHJhZ21hIGF1eCBub3RfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm5vdCAgICBlYXgiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXhdOworCit1OCByY2xfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcmNsX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyY2wgICAgYWwsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgY2xdOworCit1MTYgcmNsX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByY2xfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJjbCAgICBheCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBjbF07CisKK3UzMiByY2xfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJjbF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmNsICAgIGVheCxjbCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBjbF07CisKK3U4IHJjcl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCByY3JfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJjciAgICBhbCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiByY3Jfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJjcl93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmNyICAgIGF4LGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyIHJjcl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHU4IHMpOworI3ByYWdtYSBhdXggcmNyX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyY3IgICAgZWF4LGNsIiAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggcm9sX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJvbF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicm9sICAgIGFsLGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGNsXTsKKwordTE2IHJvbF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcm9sX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyb2wgICAgYXgsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggY2xdOworCit1MzIgcm9sX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByb2xfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJvbCAgICBlYXgsY2wiICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggY2xdOworCit1OCByb3JfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcm9yX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyb3IgICAgYWwsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgY2xdOworCit1MTYgcm9yX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByb3Jfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJvciAgICBheCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBjbF07CisKK3UzMiByb3JfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJvcl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicm9yICAgIGVheCxjbCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBjbF07CisKK3U4IHNobF9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaGxfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNobCAgICBhbCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiBzaGxfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNobF93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hsICAgIGF4LGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyIHNobF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2hsX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaGwgICAgZWF4LGNsIiAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggc2hyX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNocl9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hyICAgIGFsLGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGNsXTsKKwordTE2IHNocl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2hyX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaHIgICAgYXgsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggY2xdOworCit1MzIgc2hyX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaHJfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNociAgICBlYXgsY2wiICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggY2xdOworCit1OCBzYXJfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2FyX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzYXIgICAgYWwsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgY2xdOworCit1MTYgc2FyX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzYXJfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNhciAgICBheCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBjbF07CisKK3UzMiBzYXJfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNhcl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2FyICAgIGVheCxjbCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBjbF07CisKK3UxNiBzaGxkX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOworI3ByYWdtYSBhdXggc2hsZF93b3JkX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaGxkICAgYXgsZHgsY2wiICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbZHhdIFtjbF0gICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggZHggY2xdOworCit1MzIgc2hsZF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNobGRfbG9uZ19hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hsZCAgIGVheCxlZHgsY2wiICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlZHhdIFtjbF0gICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlZHggY2xdOworCit1MTYgc2hyZF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBmaWxsLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNocmRfd29yZF9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hyZCAgIGF4LGR4LGNsIiAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2R4XSBbY2xdICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGR4IGNsXTsKKwordTMyIHNocmRfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaHJkX2xvbmdfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNocmQgICBlYXgsZWR4LGNsIiAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWR4XSBbY2xdICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWR4IGNsXTsKKwordTggc2JiX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNiYl9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2JiICAgIGFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordTE2IHNiYl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IHNiYl93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2JiICAgIGF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordTMyIHNiYl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IHNiYl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2JiICAgIGVheCxlYngiICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlYnhdOworCit1OCBzdWJfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc3ViX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzdWIgICAgYWwsYmwiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgc3ViX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggc3ViX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzdWIgICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgc3ViX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggc3ViX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzdWIgICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3ZvaWQgdGVzdF9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCB0ZXN0X2J5dGVfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInRlc3QgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3ZvaWQgdGVzdF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IHRlc3Rfd29yZF9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidGVzdCAgIGF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordm9pZCB0ZXN0X2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggdGVzdF9sb25nX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ0ZXN0ICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IHhvcl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCB4b3JfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInhvciAgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiB4b3Jfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCB4b3Jfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInhvciAgICBheCxieCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiB4b3JfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCB4b3JfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInhvciAgICBlYXgsZWJ4IiAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordm9pZCBpbXVsX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1MTYgKiBheCwgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBpbXVsX2J5dGVfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImltdWwgICBibCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxheCIgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbYWxdIFtibF0gICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgYXggYmxdOworCit2b2lkIGltdWxfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiAqIGF4LCB1MTYgKiBkeCwgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGltdWxfd29yZF9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaW11bCAgIGJ4IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGF4IiAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGR4IiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2J4XVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYnggZHhdOworCit2b2lkIGltdWxfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiAqIGVheCwgdTMyICogZWR4LCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggaW11bF9sb25nX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpbXVsICAgZWJ4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sZWF4IiAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZWR4IiAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VieF0gXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWJ4IGVkeF07CisKK3ZvaWQgbXVsX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1MTYgKiBheCwgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBtdWxfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm11bCAgICBibCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxheCIgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbYWxdIFtibF0gICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgYXggYmxdOworCit2b2lkIG11bF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2ICogYXgsIHUxNiAqIGR4LCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggbXVsX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtdWwgICAgYngiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sYXgiICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZHgiICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYnhdXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBieCBkeF07CisKK3ZvaWQgbXVsX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgKiBlYXgsIHUzMiAqIGVkeCwgdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IG11bF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibXVsICAgIGVieCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGVheCIgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGVkeCIgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlYnhdIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgZWF4IGVieCBlZHhdOworCit2b2lkIGlkaXZfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4ICogYWwsIHU4ICogYWgsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGlkaXZfYnl0ZV9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaWRpdiAgIGJsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGFsIiAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGFoIiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2JsXVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYmxdOworCit2b2lkIGlkaXZfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiAqIGF4LCB1MTYgKiBkeCwgdTE2IGRsbywgdTE2IGRoaSwgdTE2IHMpOworI3ByYWdtYSBhdXggaWRpdl93b3JkX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpZGl2ICAgYngiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sYXgiICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZHgiICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbZHhdIFtieF1cCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGR4IGJ4XTsKKwordm9pZCBpZGl2X2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgKiBlYXgsIHUzMiAqIGVkeCwgdTMyIGRsbywgdTMyIGRoaSwgdTMyIHMpOworI3ByYWdtYSBhdXggaWRpdl9sb25nX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpZGl2ICAgZWJ4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sZWF4IiAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZWR4IiAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VkeF0gW2VieF1cCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlZHggZWJ4XTsKKwordm9pZCBkaXZfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4ICogYWwsIHU4ICogYWgsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGRpdl9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGl2ICAgIGJsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGFsIiAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGFoIiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2JsXVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYmxdOworCit2b2lkIGRpdl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2ICogYXgsIHUxNiAqIGR4LCB1MTYgZGxvLCB1MTYgZGhpLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBkaXZfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRpdiAgICBieCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxheCIgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZWN4XSxkeCIgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtkeF0gW2J4XVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggZHggYnhdOworCit2b2lkIGRpdl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyICogZWF4LCB1MzIgKiBlZHgsIHUzMiBkbG8sIHUzMiBkaGksIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGRpdl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGl2ICAgIGVieCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGVheCIgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGVkeCIgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlZHhdIFtlYnhdXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWR4IGVieF07CisKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX19YODZFTVVfUFJJTV9BU01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3ByaW1fb3BzLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcHJpbV9vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjkxZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3ByaW1fb3BzLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBwcmltaXRpdmUgb3BlcmF0aW9uIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfUFJJTV9PUFNfSAorI2RlZmluZSBfX1g4NkVNVV9QUklNX09QU19ICisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKwordTE2ICAgICBhYWFfd29yZCAodTE2IGQpOwordTE2ICAgICBhYXNfd29yZCAodTE2IGQpOwordTE2ICAgICBhYWRfd29yZCAodTE2IGQpOwordTE2ICAgICBhYW1fd29yZCAodTggZCk7Cit1OCAgICAgIGFkY19ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgYWRjX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIGFkY19sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBhZGRfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIGFkZF93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBhZGRfbG9uZyAodTMyIGQsIHUzMiBzKTsKK3U4ICAgICAgYW5kX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBhbmRfd29yZCAodTE2IGQsIHUxNiBzKTsKK3UzMiAgICAgYW5kX2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIGNtcF9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgY21wX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIGNtcF9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBkYWFfYnl0ZSAodTggZCk7Cit1OCAgICAgIGRhc19ieXRlICh1OCBkKTsKK3U4ICAgICAgZGVjX2J5dGUgKHU4IGQpOwordTE2ICAgICBkZWNfd29yZCAodTE2IGQpOwordTMyICAgICBkZWNfbG9uZyAodTMyIGQpOwordTggICAgICBpbmNfYnl0ZSAodTggZCk7Cit1MTYgICAgIGluY193b3JkICh1MTYgZCk7Cit1MzIgICAgIGluY19sb25nICh1MzIgZCk7Cit1OCAgICAgIG9yX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBvcl93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBvcl9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBuZWdfYnl0ZSAodTggcyk7Cit1MTYgICAgIG5lZ193b3JkICh1MTYgcyk7Cit1MzIgICAgIG5lZ19sb25nICh1MzIgcyk7Cit1OCAgICAgIG5vdF9ieXRlICh1OCBzKTsKK3UxNiAgICAgbm90X3dvcmQgKHUxNiBzKTsKK3UzMiAgICAgbm90X2xvbmcgKHUzMiBzKTsKK3U4ICAgICAgcmNsX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICByY2xfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICByY2xfbG9uZyAodTMyIGQsIHU4IHMpOwordTggICAgICByY3JfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHJjcl93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHJjcl9sb25nICh1MzIgZCwgdTggcyk7Cit1OCAgICAgIHJvbF9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgcm9sX3dvcmQgKHUxNiBkLCB1OCBzKTsKK3UzMiAgICAgcm9sX2xvbmcgKHUzMiBkLCB1OCBzKTsKK3U4ICAgICAgcm9yX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICByb3Jfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICByb3JfbG9uZyAodTMyIGQsIHU4IHMpOwordTggICAgICBzaGxfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHNobF93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHNobF9sb25nICh1MzIgZCwgdTggcyk7Cit1OCAgICAgIHNocl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgc2hyX3dvcmQgKHUxNiBkLCB1OCBzKTsKK3UzMiAgICAgc2hyX2xvbmcgKHUzMiBkLCB1OCBzKTsKK3U4ICAgICAgc2FyX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBzYXJfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICBzYXJfbG9uZyAodTMyIGQsIHU4IHMpOwordTE2ICAgICBzaGxkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7Cit1MzIgICAgIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKK3UxNiAgICAgc2hyZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOwordTMyICAgICBzaHJkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7Cit1OCAgICAgIHNiYl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgc2JiX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIHNiYl9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBzdWJfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHN1Yl93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBzdWJfbG9uZyAodTMyIGQsIHUzMiBzKTsKK3ZvaWQgICAgdGVzdF9ieXRlICh1OCBkLCB1OCBzKTsKK3ZvaWQgICAgdGVzdF93b3JkICh1MTYgZCwgdTE2IHMpOwordm9pZCAgICB0ZXN0X2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIHhvcl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgeG9yX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIHhvcl9sb25nICh1MzIgZCwgdTMyIHMpOwordm9pZCAgICBpbXVsX2J5dGUgKHU4IHMpOwordm9pZCAgICBpbXVsX3dvcmQgKHUxNiBzKTsKK3ZvaWQgICAgaW11bF9sb25nICh1MzIgcyk7Cit2b2lkICAgIGltdWxfbG9uZ19kaXJlY3QodTMyICpyZXNfbG8sIHUzMiogcmVzX2hpLHUzMiBkLCB1MzIgcyk7Cit2b2lkICAgIG11bF9ieXRlICh1OCBzKTsKK3ZvaWQgICAgbXVsX3dvcmQgKHUxNiBzKTsKK3ZvaWQgICAgbXVsX2xvbmcgKHUzMiBzKTsKK3ZvaWQgICAgaWRpdl9ieXRlICh1OCBzKTsKK3ZvaWQgICAgaWRpdl93b3JkICh1MTYgcyk7Cit2b2lkICAgIGlkaXZfbG9uZyAodTMyIHMpOwordm9pZCAgICBkaXZfYnl0ZSAodTggcyk7Cit2b2lkICAgIGRpdl93b3JkICh1MTYgcyk7Cit2b2lkICAgIGRpdl9sb25nICh1MzIgcyk7Cit2b2lkICAgIGlucyAoaW50IHNpemUpOwordm9pZCAgICBvdXRzIChpbnQgc2l6ZSk7Cit1MTYgICAgIG1lbV9hY2Nlc3Nfd29yZCAoaW50IGFkZHIpOwordm9pZCAgICBwdXNoX3dvcmQgKHUxNiB3KTsKK3ZvaWQgICAgcHVzaF9sb25nICh1MzIgdyk7Cit1MTYgICAgIHBvcF93b3JkICh2b2lkKTsKK3UzMiAgICAgcG9wX2xvbmcgKHZvaWQpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9QUklNX09QU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcmVncy5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZlZGQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3JlZ3MuaApAQCAtMCwwICsxLDM0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKgkJQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqCQkgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOglBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJSGVhZGVyIGZpbGUgZm9yIHg4NiByZWdpc3RlciBkZWZpbml0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfUkVHU19ICisjZGVmaW5lIF9fWDg2RU1VX1JFR1NfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIHBhY2soMSkKKworLyoKKyAqIEdlbmVyYWwgRUFYLCBFQlgsIEVDWCwgRURYIHR5cGUgcmVnaXN0ZXJzLiAgTm90ZSB0aGF0IGZvcgorICogcG9ydGFiaWxpdHksIGFuZCBzcGVlZCwgdGhlIGlzc3VlIG9mIGJ5dGUgc3dhcHBpbmcgaXMgbm90IGFkZHJlc3NlZAorICogaW4gdGhlIHJlZ2lzdGVycy4gIEFsbCByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0aGUgZGVmYXVsdCBmb3JtYXQKKyAqIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgVGhlIG9ubHkgY3JpdGljYWwgaXNzdWUgaXMgdGhhdCB0aGUKKyAqIHJlZ2lzdGVycyBzaG91bGQgbGluZSB1cCBFWEFDVExZIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGV5IGRvIGluCisgKiB0aGUgMzg2LiAgVGhhdCBpczoKKyAqCisgKiBFQVggJiAweGZmICA9PT0gQUwKKyAqIEVBWCAmIDB4ZmZmZiA9PSBBWAorICoKKyAqIGV0Yy4JIFRoZSByZXN1bHQgaXMgdGhhdCBhbG90IG9mIHRoZSBjYWxjdWxhdGlvbnMgY2FuIHRoZW4gYmUKKyAqIGRvbmUgdXNpbmcgdGhlIG5hdGl2ZSBpbnN0cnVjdGlvbiBzZXQgZnVsbHkuCisgKi8KKworI2lmZGVmCV9fQklHX0VORElBTl9fCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgZV9yZWc7Cit9IEkzMl9yZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBmaWxsZXIwLCB4X3JlZzsKK30gSTE2X3JlZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTggZmlsbGVyMCwgZmlsbGVyMSwgaF9yZWcsIGxfcmVnOworfSBJOF9yZWdfdDsKKworI2Vsc2UJCQkJLyogIV9fQklHX0VORElBTl9fICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgZV9yZWc7Cit9IEkzMl9yZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiB4X3JlZzsKK30gSTE2X3JlZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTggbF9yZWcsIGhfcmVnOworfSBJOF9yZWdfdDsKKworI2VuZGlmCQkJCS8qIEJJR19FTkRJQU4gKi8KKwordHlwZWRlZiB1bmlvbiB7CisJSTMyX3JlZ190IEkzMl9yZWc7CisJSTE2X3JlZ190IEkxNl9yZWc7CisJSThfcmVnX3QgSThfcmVnOworfSBpMzg2X2dlbmVyYWxfcmVnaXN0ZXI7CisKK3N0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyB7CisJaTM4Nl9nZW5lcmFsX3JlZ2lzdGVyIEEsIEIsIEMsIEQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyBHZW5fcmVnX3Q7CisKK3N0cnVjdCBpMzg2X3NwZWNpYWxfcmVncyB7CisJaTM4Nl9nZW5lcmFsX3JlZ2lzdGVyIFNQLCBCUCwgU0ksIERJLCBJUDsKKwl1MzIgRkxBR1M7Cit9OworCisvKgorICogU2VnbWVudCByZWdpc3RlcnMgaGVyZSByZXByZXNlbnQgdGhlIDE2IGJpdCBxdWFudGl0aWVzCisgKiBDUywgRFMsIEVTLCBTUy4KKyAqLworCisjdW5kZWYgQ1MKKyN1bmRlZiBEUworI3VuZGVmIFNTCisjdW5kZWYgRVMKKyN1bmRlZiBGUworI3VuZGVmIEdTCisKK3N0cnVjdCBpMzg2X3NlZ21lbnRfcmVncyB7CisJdTE2IENTLCBEUywgU1MsIEVTLCBGUywgR1M7Cit9OworCisvKiA4IGJpdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9BSCAgZ2VuLkEuSThfcmVnLmhfcmVnCisjZGVmaW5lIFJfQUwgIGdlbi5BLkk4X3JlZy5sX3JlZworI2RlZmluZSBSX0JIICBnZW4uQi5JOF9yZWcuaF9yZWcKKyNkZWZpbmUgUl9CTCAgZ2VuLkIuSThfcmVnLmxfcmVnCisjZGVmaW5lIFJfQ0ggIGdlbi5DLkk4X3JlZy5oX3JlZworI2RlZmluZSBSX0NMICBnZW4uQy5JOF9yZWcubF9yZWcKKyNkZWZpbmUgUl9ESCAgZ2VuLkQuSThfcmVnLmhfcmVnCisjZGVmaW5lIFJfREwgIGdlbi5ELkk4X3JlZy5sX3JlZworCisvKiAxNiBiaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfQVggIGdlbi5BLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9CWCAgZ2VuLkIuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0NYICBnZW4uQy5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfRFggIGdlbi5ELkkxNl9yZWcueF9yZWcKKworLyogMzIgYml0IGV4dGVuZGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBSX0VBWCAgZ2VuLkEuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VCWCAgZ2VuLkIuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VDWCAgZ2VuLkMuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VEWCAgZ2VuLkQuSTMyX3JlZy5lX3JlZworCisvKiBzcGVjaWFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBSX1NQICBzcGMuU1AuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0JQICBzcGMuQlAuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX1NJICBzcGMuU0kuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0RJICBzcGMuREkuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0lQICBzcGMuSVAuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0ZMRyBzcGMuRkxBR1MKKworLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9TUCAgc3BjLlNQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9CUCAgc3BjLkJQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9TSSAgc3BjLlNJLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9ESSAgc3BjLkRJLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9JUCAgc3BjLklQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9GTEcgc3BjLkZMQUdTCisKKy8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfRVNQICBzcGMuU1AuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VCUCAgc3BjLkJQLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FU0kgIHNwYy5TSS5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRURJICBzcGMuREkuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VJUCAgc3BjLklQLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FRkxHIHNwYy5GTEFHUworCisvKiBzZWdtZW50IHJlZ2lzdGVycyAqLworI2RlZmluZSBSX0NTICBzZWcuQ1MKKyNkZWZpbmUgUl9EUyAgc2VnLkRTCisjZGVmaW5lIFJfU1MgIHNlZy5TUworI2RlZmluZSBSX0VTICBzZWcuRVMKKyNkZWZpbmUgUl9GUyAgc2VnLkZTCisjZGVmaW5lIFJfR1MgIHNlZy5HUworCisvKiBmbGFnIGNvbmRpdGlvbnMgICAqLworI2RlZmluZSBGQl9DRiAweDAwMDEJCS8qIENBUlJZIGZsYWcgICovCisjZGVmaW5lIEZCX1BGIDB4MDAwNAkJLyogUEFSSVRZIGZsYWcgKi8KKyNkZWZpbmUgRkJfQUYgMHgwMDEwCQkvKiBBVVgJZmxhZyAgICovCisjZGVmaW5lIEZCX1pGIDB4MDA0MAkJLyogWkVSTyBmbGFnICAgKi8KKyNkZWZpbmUgRkJfU0YgMHgwMDgwCQkvKiBTSUdOIGZsYWcgICAqLworI2RlZmluZSBGQl9URiAweDAxMDAJCS8qIFRSQVAgZmxhZyAgICovCisjZGVmaW5lIEZCX0lGIDB4MDIwMAkJLyogSU5URVJSVVBUIEVOQUJMRSBmbGFnICovCisjZGVmaW5lIEZCX0RGIDB4MDQwMAkJLyogRElSIGZsYWcgICAgKi8KKyNkZWZpbmUgRkJfT0YgMHgwODAwCQkvKiBPVkVSRkxPVyBmbGFnICovCisKKy8qIDgwMjg2IGFuZCBhYm92ZSBhbHdheXMgaGF2ZSBiaXQjMSBzZXQgKi8KKyNkZWZpbmUgRl9BTFdBWVNfT04gICgweDAwMDIpCS8qIGZsYWcgYml0cyBhbHdheXMgb24gKi8KKworLyoKKyAqIERlZmluZSBhIG1hc2sgZm9yIG9ubHkgdGhvc2UgZmxhZyBiaXRzIHdlIHdpbGwgZXZlciBwYXNzIGJhY2sKKyAqICh2aWEgUFVTSEYpCisgKi8KKyNkZWZpbmUgRl9NU0sgKEZCX0NGfEZCX1BGfEZCX0FGfEZCX1pGfEZCX1NGfEZCX1RGfEZCX0lGfEZCX0RGfEZCX09GKQorCisvKiBmb2xsb3dpbmcgYml0cyBtYXNrZWQgaW4gdG8gYSAxNmJpdCBxdWFudGl0eSAqLworCisjZGVmaW5lIEZfQ0YgMHgwMDAxCQkvKiBDQVJSWSBmbGFnICAqLworI2RlZmluZSBGX1BGIDB4MDAwNAkJLyogUEFSSVRZIGZsYWcgKi8KKyNkZWZpbmUgRl9BRiAweDAwMTAJCS8qIEFVWAlmbGFnICAgKi8KKyNkZWZpbmUgRl9aRiAweDAwNDAJCS8qIFpFUk8gZmxhZyAgICovCisjZGVmaW5lIEZfU0YgMHgwMDgwCQkvKiBTSUdOIGZsYWcgICAqLworI2RlZmluZSBGX1RGIDB4MDEwMAkJLyogVFJBUCBmbGFnICAgKi8KKyNkZWZpbmUgRl9JRiAweDAyMDAJCS8qIElOVEVSUlVQVCBFTkFCTEUgZmxhZyAqLworI2RlZmluZSBGX0RGIDB4MDQwMAkJLyogRElSIGZsYWcgICAgKi8KKyNkZWZpbmUgRl9PRiAweDA4MDAJCS8qIE9WRVJGTE9XIGZsYWcgKi8KKworI2RlZmluZSBUT0dHTEVfRkxBRyhmbGFnKQkoTS54ODYuUl9GTEcgXj0gKGZsYWcpKQorI2RlZmluZSBTRVRfRkxBRyhmbGFnKQkJKE0ueDg2LlJfRkxHIHw9IChmbGFnKSkKKyNkZWZpbmUgQ0xFQVJfRkxBRyhmbGFnKQkoTS54ODYuUl9GTEcgJj0gfihmbGFnKSkKKyNkZWZpbmUgQUNDRVNTX0ZMQUcoZmxhZykJKE0ueDg2LlJfRkxHICYgKGZsYWcpKQorI2RlZmluZSBDTEVBUkFMTF9GTEFHKG0pCShNLng4Ni5SX0ZMRyA9IDApCisKKyNkZWZpbmUgQ09ORElUSU9OQUxfU0VUX0ZMQUcoQ09ORCxGTEFHKSBcCisgIGlmIChDT05EKSBTRVRfRkxBRyhGTEFHKTsgZWxzZSBDTEVBUl9GTEFHKEZMQUcpCisKKyNkZWZpbmUgRl9QRl9DQUxDIDB4MDEwMDAwCS8qIFBBUklUWSBmbGFnIGhhcyBiZWVuIGNhbGNlZAkgICovCisjZGVmaW5lIEZfWkZfQ0FMQyAweDAyMDAwMAkvKiBaRVJPIGZsYWcgaGFzIGJlZW4gY2FsY2VkCSAgKi8KKyNkZWZpbmUgRl9TRl9DQUxDIDB4MDQwMDAwCS8qIFNJR04gZmxhZyBoYXMgYmVlbiBjYWxjZWQJICAqLworCisjZGVmaW5lIEZfQUxMX0NBTEMJMHhmZjAwMDAJLyogQWxsIGhhdmUgYmVlbiBjYWxjZWQJICAqLworCisvKgorICogRW11bGF0b3IgbWFjaGluZSBzdGF0ZS4KKyAqIFNlZ21lbnQgdXNhZ2UgY29udHJvbC4KKyAqLworI2RlZmluZSBTWVNNT0RFX1NFR19EU19TUwkweDAwMDAwMDAxCisjZGVmaW5lIFNZU01PREVfU0VHT1ZSX0NTCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfRFMJMHgwMDAwMDAwNAorI2RlZmluZSBTWVNNT0RFX1NFR09WUl9FUwkweDAwMDAwMDA4CisjZGVmaW5lIFNZU01PREVfU0VHT1ZSX0ZTCTB4MDAwMDAwMTAKKyNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfR1MJMHgwMDAwMDAyMAorI2RlZmluZSBTWVNNT0RFX1NFR09WUl9TUwkweDAwMDAwMDQwCisjZGVmaW5lIFNZU01PREVfUFJFRklYX1JFUEUJMHgwMDAwMDA4MAorI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9SRVBORQkweDAwMDAwMTAwCisjZGVmaW5lIFNZU01PREVfUFJFRklYX0RBVEEJMHgwMDAwMDIwMAorI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9BRERSCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1lTTU9ERV9JTlRSX1BFTkRJTkcJMHgxMDAwMDAwMAorI2RlZmluZSBTWVNNT0RFX0VYVFJOX0lOVFIJMHgyMDAwMDAwMAorI2RlZmluZSBTWVNNT0RFX0hBTFRFRAkJMHg0MDAwMDAwMAorCisjZGVmaW5lIFNZU01PREVfU0VHTUFTSyAoU1lTTU9ERV9TRUdfRFNfU1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfQ1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRFMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRVMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRlMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfR1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfU1MpCisjZGVmaW5lIFNZU01PREVfQ0xSTUFTSyAoU1lTTU9ERV9TRUdfRFNfU1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfQ1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRFMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRVMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRlMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfR1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfU1MJfCBcCisJCQkgU1lTTU9ERV9QUkVGSVhfREFUQQl8IFwKKwkJCSBTWVNNT0RFX1BSRUZJWF9BRERSKQorCisjZGVmaW5lCSBJTlRSX1NZTkNICSAgICAgIDB4MQorI2RlZmluZQkgSU5UUl9BU1lOQ0gJICAgICAgMHgyCisjZGVmaW5lCSBJTlRSX0hBTFRFRAkgICAgICAweDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyBnZW47CisJc3RydWN0IGkzODZfc3BlY2lhbF9yZWdzIHNwYzsKKwlzdHJ1Y3QgaTM4Nl9zZWdtZW50X3JlZ3Mgc2VnOworCS8qCisJICogTU9ERSBjb250YWlucyBpbmZvcm1hdGlvbiBvbjoKKwkgKiAgUkVQRSBwcmVmaXgJCSAgICAyIGJpdHMgIHJlcGUscmVwbmUKKwkgKiAgU0VHTUVOVCBvdmVycmlkZXMJICAgIDUgYml0cyAgbm9ybWFsLERTLFNTLENTLEVTCisJICogIERlbGF5ZWQgZmxhZyBzZXQJICAgIDMgYml0cyAgKHplcm8sIHNpZ25lZCwgcGFyaXR5KQorCSAqICByZXNlcnZlZAkJICAgIDYgYml0cworCSAqICBpbnRlcnJ1cHQgIwkJICAgIDggYml0cyAgaW5zdHJ1Y3Rpb24gcmFpc2VkIGludGVycnVwdAorCSAqICBCSU9TIHZpZGVvIHNlZ3JlZ3MJICAgIDQgYml0cworCSAqICBJbnRlcnJ1cHQgUGVuZGluZwkgICAgMSBiaXRzCisJICogIEV4dGVybiBpbnRlcnJ1cHQJICAgIDEgYml0cworCSAqICBIYWx0ZWQJCSAgICAxIGJpdHMKKwkgKi8KKwlsb25nIG1vZGU7CisJdTggaW50bm87CisJdm9sYXRpbGUgaW50IGludHI7CS8qIG1hc2sgb2YgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJaW50IGRlYnVnOworI2lmZGVmIERFQlVHCisJaW50IGNoZWNrOworCXUxNiBzYXZlZF9pcDsKKwl1MTYgc2F2ZWRfY3M7CisJaW50IGVuY19wb3M7CisJaW50IGVuY19zdHJfcG9zOworCWNoYXIgZGVjb2RlX2J1ZlszMl07CS8qIGVuY29kZWQgYnl0ZSBzdHJlYW0JKi8KKwljaGFyIGRlY29kZWRfYnVmWzI1Nl07CS8qIGRpc2Fzc2VtYmxlZCBzdHJpbmdzICovCisjZW5kaWYKK30gWDg2RU1VX3JlZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIG1haW50YWluaW5nIHRoZSBlbXVsYXRvciBtYWNoaW5lIHN0YXRlLgorCitNRU1CRVJTOgoreDg2CQktIFg4NiByZWdpc3RlcnMKK21lbV9iYXNlCS0gQmFzZSByZWFsIG1vZGUgbWVtb3J5IGZvciB0aGUgZW11bGF0b3IKK21lbV9zaXplCS0gU2l6ZSBvZiB0aGUgcmVhbCBtb2RlIG1lbW9yeSBibG9jayBmb3IgdGhlIGVtdWxhdG9yCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI3VuZGVmIHg4NgordHlwZWRlZiBzdHJ1Y3QgeworCVg4NkVNVV9yZWdzIHg4NjsKKwl1OCAqbWVtX2Jhc2U7CisJdTMyIG1lbV9zaXplOworCXZvaWQgKnByaXZhdGU7Cit9IFg4NkVNVV9zeXNFbnY7CisKKyNwcmFnbWEgcGFjaygpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCisvKiBHbG9iYWwgZW11bGF0b3IgbWFjaGluZSBzdGF0ZS4KKyAqCisgKiBXZSBrZWVwIGl0IGdsb2JhbCB0byBhdm9pZCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpbiB0aGUgY29kZSBmb3Igc3BlZWQuCisgKi8KKworCWV4dGVybiBYODZFTVVfc3lzRW52IF9YODZFTVVfZW52OworI2RlZmluZQkgIE0JCV9YODZFTVVfZW52CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZ1bmN0aW9uIHRvIGxvZyBpbmZvcm1hdGlvbiBhdCBydW50aW1lICovCisKKyNpZm5kZWYgX19LRVJORUxfXworCXZvaWQgcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNlbmRpZgorCisjaWZkZWYJX19jcGx1c3BsdXMKK30JCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysJICAgICovCisjZW5kaWYKKyNlbmRpZgkJCQkvKiBfX1g4NkVNVV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS94ODZlbXVpLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUveDg2ZW11aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDk1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUveDg2ZW11aS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3Igc3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb25zCisqICAgICAgICAgICAgICAgYXJlIGFsd2F5cyBjb21waWxlZCBhbmQgbGlua2VkIGluIHRoZSBPUyBkZXBlZGVudCBsaWJyYXJpZXMsCisqICAgICAgICAgICAgICAgYW5kIG5ldmVyIGluIGEgYmluYXJ5IHBvcnRhYmxlIGRyaXZlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfWDg2RU1VSV9ICisjZGVmaW5lIF9fWDg2RU1VX1g4NkVNVUlfSAorCisvKiBJZiB3ZSBhcmUgY29tcGlsaW5nIGluIEMrKyBtb2RlLCB3ZSBjYW4gY29tcGlsZSBzb21lIGZ1bmN0aW9ucyBhcworICogaW5saW5lIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlIChob3dldmVyIHRoZSBjb2RlIHNpemUgaW5jcmVhc2VzIHF1aXRlCisgKiBkcmFtYXRpY2FsbHkgaW4gdGhpcyBjYXNlKS4KKyAqLworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX05PX0lOTElORSkKKyNkZWZpbmUgX0lOTElORSBpbmxpbmUKKyNlbHNlCisjZGVmaW5lIF9JTkxJTkUgc3RhdGljCisjZW5kaWYKKworLyogR2V0IHJpZCBvZiB1bnVzZWQgcGFyYW1ldGVycyBpbiBDKysgY29tcGlsYXRpb24gbW9kZSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgWDg2RU1VX1VOVVNFRCh2KQorI2Vsc2UKKyNkZWZpbmUgWDg2RU1VX1VOVVNFRCh2KSAgICB2CisjZW5kaWYKKworI2luY2x1ZGUgIng4NmVtdS5oIgorI2luY2x1ZGUgIng4NmVtdS9yZWdzLmgiCisjaW5jbHVkZSAieDg2ZW11L2RlYnVnLmgiCisjaW5jbHVkZSAieDg2ZW11L2RlY29kZS5oIgorI2luY2x1ZGUgIng4NmVtdS9vcHMuaCIKKyNpbmNsdWRlICJ4ODZlbXUvcHJpbV9vcHMuaCIKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2RlZmluZSBwcmludGsgcHJpbnRmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5saW5lIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCisJZXh0ZXJuIHU4KFg4NkFQSVAgc3lzX3JkYikgKHUzMiBhZGRyKTsKKwlleHRlcm4gdTE2KFg4NkFQSVAgc3lzX3JkdykgKHUzMiBhZGRyKTsKKwlleHRlcm4gdTMyKFg4NkFQSVAgc3lzX3JkbCkgKHUzMiBhZGRyKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfd3JiKSAodTMyIGFkZHIsIHU4IHZhbCk7CisJZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX3dydykgKHUzMiBhZGRyLCB1MTYgdmFsKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfd3JsKSAodTMyIGFkZHIsIHUzMiB2YWwpOworCisJZXh0ZXJuIHU4KFg4NkFQSVAgc3lzX2luYikgKFg4NkVNVV9waW9BZGRyIGFkZHIpOworCWV4dGVybiB1MTYoWDg2QVBJUCBzeXNfaW53KSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJZXh0ZXJuIHUzMihYODZBUElQIHN5c19pbmwpIChYODZFTVVfcGlvQWRkciBhZGRyKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfb3V0YikgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHU4IHZhbCk7CisJZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX291dHcpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfb3V0bCkgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CQkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCisjZW5kaWYKKyNlbmRpZgkJCQkvKiBfX1g4NkVNVV9YODZFTVVJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvZGVidWcuYyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU3MzljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9kZWJ1Zy5jCkBAIC0wLDAgKzEsNDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gaGFuZGxlIGRlYnVnZ2luZyBvZiB0aGUKKyogICAgICAgICAgICAgICBlbXVsYXRvci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCisKK3N0YXRpYyB2b2lkIHByaW50X2VuY29kZWRfYnl0ZXModTE2IHMsIHUxNiBvKTsKK3N0YXRpYyB2b2lkIHByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24odm9pZCk7CitzdGF0aWMgaW50IHBhcnNlX2xpbmUoY2hhciAqcywgaW50ICpwcywgaW50ICpuKTsKKworLyogc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgZGVidWcncyBvdXRwdXQuICovCit2b2lkIFg4NkVNVV90cmFjZV9yZWdzKHZvaWQpCit7CisJaWYgKERFQlVHX1RSQUNFKCkpIHsKKwkJeDg2ZW11X2R1bXBfcmVncygpOworCX0KKwlpZiAoREVCVUdfREVDT0RFKCkgJiYgIURFQlVHX0RFQ09ERV9OT1BSSU5UKCkpIHsKKwkJcHJpbnRrKCIlMDR4OiUwNHggIiwgTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwKTsKKwkJcHJpbnRfZW5jb2RlZF9ieXRlcyhNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOworCQlwcmludF9kZWNvZGVkX2luc3RydWN0aW9uKCk7CisJfQorfQorCit2b2lkIFg4NkVNVV90cmFjZV94cmVncyh2b2lkKQoreworCWlmIChERUJVR19UUkFDRSgpKSB7CisJCXg4NmVtdV9kdW1wX3hyZWdzKCk7CisJfQorfQorCit2b2lkIHg4NmVtdV9qdXN0X2Rpc2Fzc2VtYmxlKHZvaWQpCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgY2FsbGVkIGlmIHRoZSBmbGFnIERFQlVHX0RJU0FTU0VNQkxFIGlzIHNldCBraW5kCisJICogb2YgYSBoYWNrIQorCSAqLworCXByaW50aygiJTA0eDolMDR4ICIsIE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7CisJcHJpbnRfZW5jb2RlZF9ieXRlcyhNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOworCXByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24oKTsKK30KKworc3RhdGljIHZvaWQgZGlzYXNzZW1ibGVfZm9yd2FyZCh1MTYgc2VnLCB1MTYgb2ZmLCBpbnQgbikKK3sKKwlYODZFTVVfc3lzRW52IHRyZWdzOworCWludCBpOworCXU4IG9wMTsKKwkvKgorCSAqIGhhY2ssIGhhY2ssIGhhY2suICBXaGF0IHdlIGRvIGlzIHVzZSB0aGUgZXhhY3QgbWFjaGluZXJ5IHNldCB1cAorCSAqIGZvciBleGVjdXRpb24sIGV4Y2VwdCB0aGF0IG5vdyB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHN0YXRlCisJICogZmxhZyBhc3NvY2lhdGVkIHdpdGggdGhlICJleGVjdXRpb24iLCBhbmQgd2UgYXJlIHVzaW5nIGEgY29weQorCSAqIG9mIHRoZSByZWdpc3RlciBzdHJ1Y3QuICBBbGwgdGhlIG1ham9yIG9wY29kZXMsIG9uY2UgZnVsbHkKKwkgKiBkZWNvZGVkLCBoYXZlIHRoZSBmb2xsb3dpbmcgdHdvIHN0ZXBzOiBUUkFDRV9SRUdTKHIsbSk7CisJICogU0lOR0xFX1NURVAocixtKTsgd2hpY2ggZGlzYXBwZWFyIGlmIERFQlVHIGlzIG5vdCBkZWZpbmVkIHRvCisJICogdGhlIHByZXByb2Nlc3Nvci4gIFRoZSBUUkFDRV9SRUdTIG1hY3JvIGV4cGFuZHMgdG86CisJICoKKwkgKiBpZiAoZGVidWcmREVCVUdfRElTQVNTRU1CTEUpCisJICogICAgIHtqdXN0X2Rpc2Fzc2VtYmxlKCk7IGdvdG8gRW5kT2ZJbnN0cnVjdGlvbjt9CisJICogICAgIGlmIChkZWJ1ZyZERUJVR19UUkFDRSkgdHJhY2VfcmVncyhyLG0pOworCSAqCisJICogLi4uLi4uICBhbmQgYXQgdGhlIGxhc3QgbGluZSBvZiB0aGUgcm91dGluZS4KKwkgKgorCSAqIEVuZE9mSW5zdHJ1Y3Rpb246IGVuZF9pbnN0cigpOworCSAqCisJICogVXAgdG8gdGhlIHBvaW50IHdoZXJlIFRSQUNFX1JFRyBpcyBleHBhbmRlZCwgTk8gbW9kaWZpY2F0aW9ucworCSAqIGFyZSBkb25lIHRvIGFueSByZWdpc3RlciBFWENFUFQgdGhlIElQIHJlZ2lzdGVyLCBmb3IgZmV0Y2ggYW5kCisJICogZGVjb2RpbmcgcHVycG9zZXMuCisJICoKKwkgKiBUaGlzIHdhcyBkb25lIGZvciBhbiBlbnRpcmVseSBkaWZmZXJlbnQgcmVhc29uLCBidXQgbWFrZXMgYQorCSAqIG5pY2Ugd2F5IHRvIGdldCB0aGUgc3lzdGVtIHRvIGhlbHAgZGVidWcgY29kZXMuCisJICovCisJdHJlZ3MgPSBNOworCXRyZWdzLng4Ni5SX0lQID0gb2ZmOworCXRyZWdzLng4Ni5SX0NTID0gc2VnOworCisJLyogcmVzZXQgdGhlIGRlY29kaW5nIGJ1ZmZlcnMgKi8KKwl0cmVncy54ODYuZW5jX3N0cl9wb3MgPSAwOworCXRyZWdzLng4Ni5lbmNfcG9zID0gMDsKKworCS8qIHR1cm4gb24gdGhlICJkaXNhc3NlbWJsZSBvbmx5LCBubyBleGVjdXRlIiBmbGFnICovCisJdHJlZ3MueDg2LmRlYnVnIHw9IERFQlVHX0RJU0FTU0VNQkxFX0Y7CisKKwkvKiBEVU1QIE5FWFQgbiBpbnN0cnVjdGlvbnMgdG8gc2NyZWVuIGluIHN0cmFpZ2h0X2xpbmUgZmFzaGlvbiAqLworCS8qCisJICogVGhpcyBsb29rcyBsaWtlIHRoZSByZWd1bGFyIGluc3RydWN0aW9uIGZldGNoIHN0cmVhbSwgZXhjZXB0CisJICogdGhhdCB3aGVuIHRoaXMgb2NjdXJzLCBlYWNoIGZldGNoZWQgb3Bjb2RlLCB1cG9uIHNlZWluZyB0aGUKKwkgKiBERUJVR19ESVNBU1NFTUJMRSBmbGFnIHNldCwgZXhpdHMgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVjb2RpbmcKKwkgKiB0aGUgaW5zdHJ1Y3Rpb24uICBYWFggLS0tIENIRUNLIFRIQVQgTUVNIElTIE5PVCBBRkZFQ1RFRCEhIQorCSAqIE5vdGUgdGhlIHVzZSBvZiBhIGNvcHkgb2YgdGhlIHJlZ2lzdGVyIHN0cnVjdHVyZS4uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJb3AxID0gKCpzeXNfcmRiKSAoKCh1MzIpIE0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7CisJCSh4ODZlbXVfb3B0YWJbb3AxXSkgKG9wMSk7CisJfQorCS8qIGVuZCBtYWpvciBoYWNrIG1vZGUuICovCit9CisKK3ZvaWQgeDg2ZW11X2NoZWNrX2lwX2FjY2Vzcyh2b2lkKQoreworCS8qIE5VTEwgYXMgb2Ygbm93ICovCit9CisKK3ZvaWQgeDg2ZW11X2NoZWNrX3NwX2FjY2Vzcyh2b2lkKQoreworfQorCit2b2lkIHg4NmVtdV9jaGVja19tZW1fYWNjZXNzKHUzMiBkdW1teSkKK3sKKwkvKiAgY2hlY2sgYm91bmRzLCBldGMgKi8KK30KKwordm9pZCB4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3ModWludCBkdW1teTEsIHVpbnQgZHVtbXkyKQoreworCS8qICBjaGVjayBib3VuZHMsIGV0YyAqLworfQorCit2b2lkIHg4NmVtdV9pbmNfZGVjb2RlZF9pbnN0X2xlbihpbnQgeCkKK3sKKwlNLng4Ni5lbmNfcG9zICs9IHg7Cit9CisKK3ZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYoY2hhciAqeCkKK3sKKwlzcHJpbnRmKE0ueDg2LmRlY29kZWRfYnVmICsgTS54ODYuZW5jX3N0cl9wb3MsICIlcyIsIHgpOworCU0ueDg2LmVuY19zdHJfcG9zICs9IHN0cmxlbih4KTsKK30KKwordm9pZCB4ODZlbXVfZGVjb2RlX3ByaW50ZjIoY2hhciAqeCwgaW50IHkpCit7CisJY2hhciB0ZW1wWzEwMF07CisJc3ByaW50Zih0ZW1wLCB4LCB5KTsKKwlzcHJpbnRmKE0ueDg2LmRlY29kZWRfYnVmICsgTS54ODYuZW5jX3N0cl9wb3MsICIlcyIsIHRlbXApOworCU0ueDg2LmVuY19zdHJfcG9zICs9IHN0cmxlbih0ZW1wKTsKK30KKwordm9pZCB4ODZlbXVfZW5kX2luc3RyKHZvaWQpCit7CisJTS54ODYuZW5jX3N0cl9wb3MgPSAwOworCU0ueDg2LmVuY19wb3MgPSAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9lbmNvZGVkX2J5dGVzKHUxNiBzLCB1MTYgbykKK3sKKwlpbnQgaTsKKwljaGFyIGJ1ZjFbNjRdOworCWZvciAoaSA9IDA7IGkgPCBNLng4Ni5lbmNfcG9zOyBpKyspIHsKKwkJc3ByaW50ZihidWYxICsgMiAqIGksICIlMDJ4IiwgZmV0Y2hfZGF0YV9ieXRlX2FicyhzLCBvICsgaSkpOworCX0KKwlwcmludGsoIiUtMjBzIiwgYnVmMSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24odm9pZCkKK3sKKwlwcmludGsoIiVzIiwgTS54ODYuZGVjb2RlZF9idWYpOworfQorCit2b2lkIHg4NmVtdV9wcmludF9pbnRfdmVjdCh1MTYgaXYpCit7CisJdTE2IHNlZywgb2ZmOworCisJaWYgKGl2ID4gMjU2KQorCQlyZXR1cm47CisJc2VnID0gZmV0Y2hfZGF0YV93b3JkX2FicygwLCBpdiAqIDQpOworCW9mZiA9IGZldGNoX2RhdGFfd29yZF9hYnMoMCwgaXYgKiA0ICsgMik7CisJcHJpbnRrKCIlMDR4OiUwNHggIiwgc2VnLCBvZmYpOworfQorCit2b2lkIFg4NkVNVV9kdW1wX21lbW9yeSh1MTYgc2VnLCB1MTYgb2ZmLCB1MzIgYW10KQoreworCXUzMiBzdGFydCA9IG9mZiAmIDB4ZmZmZmZmZjA7CisJdTMyIGVuZCA9IChvZmYgKyAxNikgJiAweGZmZmZmZmYwOworCXUzMiBpOworCXUzMiBjdXJyZW50OworCisJY3VycmVudCA9IHN0YXJ0OworCXdoaWxlIChlbmQgPD0gb2ZmICsgYW10KSB7CisJCXByaW50aygiJTA0eDolMDR4ICIsIHNlZywgc3RhcnQpOworCQlmb3IgKGkgPSBzdGFydDsgaSA8IG9mZjsgaSsrKQorCQkJcHJpbnRrKCIgICAiKTsKKwkJZm9yICg7IGkgPCBlbmQ7IGkrKykKKwkJCXByaW50aygiJTAyeCAiLCBmZXRjaF9kYXRhX2J5dGVfYWJzKHNlZywgaSkpOworCQlwcmludGsoIlxuIik7CisJCXN0YXJ0ID0gZW5kOworCQllbmQgPSBzdGFydCArIDE2OworCX0KK30KKwordm9pZCB4ODZlbXVfc2luZ2xlX3N0ZXAodm9pZCkKK3sKKwljaGFyIHNbMTAyNF07CisJaW50IHBzWzEwXTsKKwlpbnQgbnRvazsKKwlpbnQgY21kOworCWludCBkb25lOworCWludCBzZWdtZW50OworCWludCBvZmZzZXQ7CisJc3RhdGljIGludCBicmVha3BvaW50OworCXN0YXRpYyBpbnQgbm9EZWNvZGUgPSAxOworCisJY2hhciAqcDsKKworCWlmIChERUJVR19CUkVBSygpKSB7CisJCWlmIChNLng4Ni5zYXZlZF9pcCAhPSBicmVha3BvaW50KSB7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfREVDT0RFX05PUFJJTlRfRjsKKwkJCU0ueDg2LmRlYnVnIHw9IERFQlVHX1RSQUNFX0Y7CisJCQlNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfQlJFQUtfRjsKKwkJCXByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24oKTsKKwkJCVg4NkVNVV90cmFjZV9yZWdzKCk7CisJCX0KKwl9CisJZG9uZSA9IDA7CisJb2Zmc2V0ID0gTS54ODYuc2F2ZWRfaXA7CisJd2hpbGUgKCFkb25lKSB7CisJCXByaW50aygiLSIpOworCQljbWQgPSBwYXJzZV9saW5lKHMsIHBzLCAmbnRvayk7CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgJ3UnOgorCQkJZGlzYXNzZW1ibGVfZm9yd2FyZChNLng4Ni5zYXZlZF9jcywgKHUxNikgb2Zmc2V0LCAxMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlpZiAobnRvayA9PSAyKSB7CisJCQkJc2VnbWVudCA9IE0ueDg2LnNhdmVkX2NzOworCQkJCW9mZnNldCA9IHBzWzFdOworCQkJCVg4NkVNVV9kdW1wX21lbW9yeShzZWdtZW50LCAodTE2KSBvZmZzZXQsIDE2KTsKKwkJCQlvZmZzZXQgKz0gMTY7CisJCQl9IGVsc2UgaWYgKG50b2sgPT0gMykgeworCQkJCXNlZ21lbnQgPSBwc1sxXTsKKwkJCQlvZmZzZXQgPSBwc1syXTsKKwkJCQlYODZFTVVfZHVtcF9tZW1vcnkoc2VnbWVudCwgKHUxNikgb2Zmc2V0LCAxNik7CisJCQkJb2Zmc2V0ICs9IDE2OworCQkJfSBlbHNlIHsKKwkJCQlzZWdtZW50ID0gTS54ODYuc2F2ZWRfY3M7CisJCQkJWDg2RU1VX2R1bXBfbWVtb3J5KHNlZ21lbnQsICh1MTYpIG9mZnNldCwgMTYpOworCQkJCW9mZnNldCArPSAxNjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCU0ueDg2LmRlYnVnIF49IERFQlVHX1RSQUNFQ0FMTF9GOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJTS54ODYuZGVidWcgXj0KKwkJCSAgICBERUJVR19TVkNfRiB8IERFQlVHX1NZU19GIHwgREVCVUdfU1lTSU5UX0Y7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlYODZFTVVfdHJhY2VfcmVncygpOworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJWDg2RU1VX3RyYWNlX3hyZWdzKCk7CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisJCQlpZiAobnRvayA9PSAyKSB7CisJCQkJYnJlYWtwb2ludCA9IHBzWzFdOworCQkJCWlmIChub0RlY29kZSkgeworCQkJCQlNLng4Ni5kZWJ1ZyB8PSBERUJVR19ERUNPREVfTk9QUklOVF9GOworCQkJCX0gZWxzZSB7CisJCQkJCU0ueDg2LmRlYnVnICY9IH5ERUJVR19ERUNPREVfTk9QUklOVF9GOworCQkJCX0KKwkJCQlNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfVFJBQ0VfRjsKKwkJCQlNLng4Ni5kZWJ1ZyB8PSBERUJVR19CUkVBS19GOworCQkJCWRvbmUgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJTS54ODYuZGVidWcgfD0gREVCVUdfRVhJVDsKKwkJCXJldHVybjsKKwkJY2FzZSAnUCc6CisJCQlub0RlY29kZSA9IChub0RlY29kZSkgPyAwIDogMTsKKwkJCXByaW50aygiVG9nZ2xlZCBkZWNvZGluZyB0byAlc1xuIiwKKwkJCSAgICAgICAobm9EZWNvZGUpID8gIkZBTFNFIiA6ICJUUlVFIik7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCWNhc2UgMDoKKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK2ludCBYODZFTVVfdHJhY2Vfb24odm9pZCkKK3sKKwlyZXR1cm4gTS54ODYuZGVidWcgfD0gREVCVUdfU1RFUF9GIHwgREVCVUdfREVDT0RFX0YgfCBERUJVR19UUkFDRV9GOworfQorCitpbnQgWDg2RU1VX3RyYWNlX29mZih2b2lkKQoreworCXJldHVybiBNLng4Ni5kZWJ1ZyAmPSB+KERFQlVHX1NURVBfRiB8IERFQlVHX0RFQ09ERV9GIHwgREVCVUdfVFJBQ0VfRik7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbGluZShjaGFyICpzLCBpbnQgKnBzLCBpbnQgKm4pCit7CisJaW50IGNtZDsKKworCSpuID0gMDsKKwl3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpCisJCXMrKzsKKwlwc1sqbl0gPSAqczsKKwlzd2l0Y2ggKCpzKSB7CisJY2FzZSAnXG4nOgorCQkqbiArPSAxOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQljbWQgPSAqczsKKwkJKm4gKz0gMTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoKnMgIT0gJyAnICYmICpzICE9ICdcdCcgJiYgKnMgIT0gJ1xuJykKKwkJCXMrKzsKKworCQlpZiAoKnMgPT0gJ1xuJykKKwkJCXJldHVybiBjbWQ7CisKKwkJd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKQorCQkJcysrOworCisJCSpuICs9IDE7CisJfQorfQorCisjZW5kaWYJCQkJLyogREVCVUcgKi8KKwordm9pZCB4ODZlbXVfZHVtcF9yZWdzKHZvaWQpCit7CisJcHJpbnRrKCJcdEFYPSUwNHggICIsIE0ueDg2LlJfQVgpOworCXByaW50aygiQlg9JTA0eCAgIiwgTS54ODYuUl9CWCk7CisJcHJpbnRrKCJDWD0lMDR4ICAiLCBNLng4Ni5SX0NYKTsKKwlwcmludGsoIkRYPSUwNHggICIsIE0ueDg2LlJfRFgpOworCXByaW50aygiU1A9JTA0eCAgIiwgTS54ODYuUl9TUCk7CisJcHJpbnRrKCJCUD0lMDR4ICAiLCBNLng4Ni5SX0JQKTsKKwlwcmludGsoIlNJPSUwNHggICIsIE0ueDg2LlJfU0kpOworCXByaW50aygiREk9JTA0eFxuIiwgTS54ODYuUl9ESSk7CisJcHJpbnRrKCJcdERTPSUwNHggICIsIE0ueDg2LlJfRFMpOworCXByaW50aygiRVM9JTA0eCAgIiwgTS54ODYuUl9FUyk7CisJcHJpbnRrKCJTUz0lMDR4ICAiLCBNLng4Ni5SX1NTKTsKKwlwcmludGsoIkNTPSUwNHggICIsIE0ueDg2LlJfQ1MpOworCXByaW50aygiSVA9JTA0eCAgICIsIE0ueDg2LlJfSVApOworCWlmIChBQ0NFU1NfRkxBRyhGX09GKSkKKwkJcHJpbnRrKCJPViAiKTsJLyogQ0hFQ0tFRC4uLiAqLworCWVsc2UKKwkJcHJpbnRrKCJOViAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCisJCXByaW50aygiRE4gIik7CisJZWxzZQorCQlwcmludGsoIlVQICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0lGKSkKKwkJcHJpbnRrKCJFSSAiKTsKKwllbHNlCisJCXByaW50aygiREkgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfU0YpKQorCQlwcmludGsoIk5HICIpOworCWVsc2UKKwkJcHJpbnRrKCJQTCAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCisJCXByaW50aygiWlIgIik7CisJZWxzZQorCQlwcmludGsoIk5aICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0FGKSkKKwkJcHJpbnRrKCJBQyAiKTsKKwllbHNlCisJCXByaW50aygiTkEgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfUEYpKQorCQlwcmludGsoIlBFICIpOworCWVsc2UKKwkJcHJpbnRrKCJQTyAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJCXByaW50aygiQ1kgIik7CisJZWxzZQorCQlwcmludGsoIk5DICIpOworCXByaW50aygiXG4iKTsKK30KKwordm9pZCB4ODZlbXVfZHVtcF94cmVncyh2b2lkKQoreworCXByaW50aygiXHRFQVg9JTA4eCAgIiwgTS54ODYuUl9FQVgpOworCXByaW50aygiRUJYPSUwOHggICIsIE0ueDg2LlJfRUJYKTsKKwlwcmludGsoIkVDWD0lMDh4ICAiLCBNLng4Ni5SX0VDWCk7CisJcHJpbnRrKCJFRFg9JTA4eCAgXG4iLCBNLng4Ni5SX0VEWCk7CisJcHJpbnRrKCJcdEVTUD0lMDh4ICAiLCBNLng4Ni5SX0VTUCk7CisJcHJpbnRrKCJFQlA9JTA4eCAgIiwgTS54ODYuUl9FQlApOworCXByaW50aygiRVNJPSUwOHggICIsIE0ueDg2LlJfRVNJKTsKKwlwcmludGsoIkVEST0lMDh4XG4iLCBNLng4Ni5SX0VESSk7CisJcHJpbnRrKCJcdERTPSUwNHggICIsIE0ueDg2LlJfRFMpOworCXByaW50aygiRVM9JTA0eCAgIiwgTS54ODYuUl9FUyk7CisJcHJpbnRrKCJTUz0lMDR4ICAiLCBNLng4Ni5SX1NTKTsKKwlwcmludGsoIkNTPSUwNHggICIsIE0ueDg2LlJfQ1MpOworCXByaW50aygiRUlQPSUwOHhcblx0IiwgTS54ODYuUl9FSVApOworCWlmIChBQ0NFU1NfRkxBRyhGX09GKSkKKwkJcHJpbnRrKCJPViAiKTsJLyogQ0hFQ0tFRC4uLiAqLworCWVsc2UKKwkJcHJpbnRrKCJOViAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCisJCXByaW50aygiRE4gIik7CisJZWxzZQorCQlwcmludGsoIlVQICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0lGKSkKKwkJcHJpbnRrKCJFSSAiKTsKKwllbHNlCisJCXByaW50aygiREkgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfU0YpKQorCQlwcmludGsoIk5HICIpOworCWVsc2UKKwkJcHJpbnRrKCJQTCAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCisJCXByaW50aygiWlIgIik7CisJZWxzZQorCQlwcmludGsoIk5aICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0FGKSkKKwkJcHJpbnRrKCJBQyAiKTsKKwllbHNlCisJCXByaW50aygiTkEgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfUEYpKQorCQlwcmludGsoIlBFICIpOworCWVsc2UKKwkJcHJpbnRrKCJQTyAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJCXByaW50aygiQ1kgIik7CisJZWxzZQorCQlwcmludGsoIk5DICIpOworCXByaW50aygiXG4iKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L2RlY29kZS5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzlmMGEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9kZWNvZGUuYwpAQCAtMCwwICsxLDExNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyoJCUNvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKgkJICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCVRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CVRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB3aGljaCBhcmUgcmVsYXRlZCB0bworKgkJaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgYW5kIGFjY2Vzc2VzcyBvZiBpbW1lZGlhdGUgZGF0YSB2aWEgSVAuICBldGMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0JJT1NFTVUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBhbnkgcGVuZGluZyBhc3ljaHJvbm91cyBpbnRlcnJ1cHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHg4NmVtdV9pbnRyX2hhbmRsZSh2b2lkKQoreworICAgIHU4CWludG5vOworCisgICAgaWYgKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSB7CisJaW50bm8gPSBNLng4Ni5pbnRubzsKKwlpZiAoX1g4NkVNVV9pbnRyVGFiW2ludG5vXSkgeworCSAgICAoKl9YODZFTVVfaW50clRhYltpbnRub10pKGludG5vKTsKKwl9IGVsc2UgeworCSAgICBwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7CisJICAgIENMRUFSX0ZMQUcoRl9JRik7CisJICAgIENMRUFSX0ZMQUcoRl9URik7CisJICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwkgICAgTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChpbnRubyAqIDQgKyAyKTsKKwkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworCSAgICBNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKGludG5vICogNCk7CisJICAgIE0ueDg2LmludHIgPSAwOworCX0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50cm51bSAtIEludGVycnVwdCBudW1iZXIgdG8gcmFpc2UKKworUkVNQVJLUzoKK1JhaXNlIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHRvIGJlIGhhbmRsZWQgYmVmb3JlIHRoZSBleGVjdXRpb24gb2YgdGhlCituZXh0IGluc3RydWN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11X2ludHJfcmFpc2UoCisgICAgdTggaW50cm51bSkKK3sKKyAgICBNLng4Ni5pbnRubyA9IGludHJudW07CisgICAgTS54ODYuaW50ciB8PSBJTlRSX1NZTkNIOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01haW4gZXhlY3V0aW9uIGxvb3AgZm9yIHRoZSBlbXVsYXRvci4gV2UgcmV0dXJuIGZyb20gaGVyZSB3aGVuIHRoZSBzeXN0ZW0KK2hhbHRzLCB3aGljaCBpcyBub3JtYWxseSBjYXVzZWQgYnkgYSBzdGFjayBmYXVsdCB3aGVuIHdlIHJldHVybiBmcm9tIHRoZQorb3JpZ2luYWwgcmVhbCBtb2RlIGNhbGwuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfZXhlYyh2b2lkKQoreworICAgIHU4IG9wMTsKKworICAgIE0ueDg2LmludHIgPSAwOworICAgIERCKHg4NmVtdV9lbmRfaW5zdHIoKTspCisKKyAgICBmb3IgKDs7KSB7CitEQigJaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJICAgIHg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCisJLyogSWYgZGVidWdnaW5nLCBzYXZlIHRoZSBJUCBhbmQgQ1MgdmFsdWVzLiAqLworCVNBVkVfSVBfQ1MoTS54ODYuUl9DUywgTS54ODYuUl9JUCk7CisJSU5DX0RFQ09ERURfSU5TVF9MRU4oMSk7CisJaWYgKE0ueDg2LmludHIpIHsKKwkgICAgaWYgKE0ueDg2LmludHIgJiBJTlRSX0hBTFRFRCkgeworREIoCQlpZiAoTS54ODYuUl9TUCAhPSAwKSB7CisJCSAgICBwcmludGsoImhhbHRlZFxuIik7CisJCSAgICBYODZFTVVfdHJhY2VfcmVncygpOworCQkgICAgfQorCQllbHNlIHsKKwkJICAgIGlmIChNLng4Ni5kZWJ1ZykKKwkJCXByaW50aygiU2VydmljZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwkJICAgIH0pCisJCXJldHVybjsKKwkgICAgfQorCSAgICBpZiAoKChNLng4Ni5pbnRyICYgSU5UUl9TWU5DSCkgJiYgKE0ueDg2LmludG5vID09IDAgfHwgTS54ODYuaW50bm8gPT0gMikpIHx8CisJCSFBQ0NFU1NfRkxBRyhGX0lGKSkgeworCQl4ODZlbXVfaW50cl9oYW5kbGUoKTsKKwkgICAgfQorCX0KKwlvcDEgPSAoKnN5c19yZGIpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7CisJKCp4ODZlbXVfb3B0YWJbb3AxXSkob3AxKTsKKwlpZiAoTS54ODYuZGVidWcgJiBERUJVR19FWElUKSB7CisJICAgIE0ueDg2LmRlYnVnICY9IH5ERUJVR19FWElUOworCSAgICByZXR1cm47CisJfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYWx0cyB0aGUgc3lzdGVtIGJ5IHNldHRpbmcgdGhlIGhhbHRlZCBzeXN0ZW0gZmxhZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkVNVV9oYWx0X3N5cyh2b2lkKQoreworICAgIE0ueDg2LmludHIgfD0gSU5UUl9IQUxURUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW9kCS0gTW9kIHZhbHVlIGZyb20gZGVjb2RlZCBieXRlCityZWdoCS0gUmVnIGggdmFsdWUgZnJvbSBkZWNvZGVkIGJ5dGUKK3JlZ2wJLSBSZWcgbCB2YWx1ZSBmcm9tIGRlY29kZWQgYnl0ZQorCitSRU1BUktTOgorUmFpc2UgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgdG8gYmUgaGFuZGxlZCBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKK25leHQgaW5zdHJ1Y3Rpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmRiKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGZldGNoX2RlY29kZV9tb2RybSgKKyAgICBpbnQgKm1vZCwKKyAgICBpbnQgKnJlZ2gsCisgICAgaW50ICpyZWdsKQoreworICAgIGludCBmZXRjaGVkOworCitEQiggaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKKyAgICBmZXRjaGVkID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOworICAgIElOQ19ERUNPREVEX0lOU1RfTEVOKDEpOworICAgICptb2QgID0gKGZldGNoZWQgPj4gNikgJiAweDAzOworICAgICpyZWdoID0gKGZldGNoZWQgPj4gMykgJiAweDA3OworICAgICpyZWdsID0gKGZldGNoZWQgPj4gMCkgJiAweDA3OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0ltbWVkaWF0ZSBieXRlIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCittb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZGIpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGZldGNoX2J5dGVfaW1tKHZvaWQpCit7CisgICAgdTggZmV0Y2hlZDsKKworREIoIGlmIChDSEVDS19JUF9GRVRDSCgpKQorCXg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCisgICAgZmV0Y2hlZCA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKKyAgICBJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKKyAgICByZXR1cm4gZmV0Y2hlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitJbW1lZGlhdGUgd29yZCB2YWx1ZSByZWFkIGZyb20gaW5zdHJ1Y3Rpb24gcXVldWUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW1tZWRpYXRlIGJ5dGUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gcXVldWUsIGFuZAorbW92ZXMgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgdG8gdGhlIG5leHQgdmFsdWUuCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmR3KSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgZmV0Y2hfd29yZF9pbW0odm9pZCkKK3sKKyAgICB1MTYgZmV0Y2hlZDsKKworREIoIGlmIChDSEVDS19JUF9GRVRDSCgpKQorCXg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCisgICAgZmV0Y2hlZCA9ICgqc3lzX3JkdykoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKSk7CisgICAgTS54ODYuUl9JUCArPSAyOworICAgIElOQ19ERUNPREVEX0lOU1RfTEVOKDIpOworICAgIHJldHVybiBmZXRjaGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0ltbWVkaWF0ZSBsb25lIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCittb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZHcpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBmZXRjaF9sb25nX2ltbSh2b2lkKQoreworICAgIHUzMiBmZXRjaGVkOworCitEQiggaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKKyAgICBmZXRjaGVkID0gKCpzeXNfcmRsKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVApKTsKKyAgICBNLng4Ni5SX0lQICs9IDQ7CisgICAgSU5DX0RFQ09ERURfSU5TVF9MRU4oNCk7CisgICAgcmV0dXJuIGZldGNoZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVRVUk5TOgorVmFsdWUgb2YgdGhlIGRlZmF1bHQgZGF0YSBzZWdtZW50CisKK1JFTUFSS1M6CitJbmxpbmUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBkZWZhdWx0IGRhdGEgc2VnbWVudCBmb3IgdGhlIGN1cnJlbnQKK2luc3RydWN0aW9uLgorCitPbiB0aGUgeDg2IHByb2Nlc3NvciwgdGhlIGRlZmF1bHQgc2VnbWVudCBpcyBub3QgYWx3YXlzIERTIGlmIHRoZXJlIGlzCitubyBzZWdtZW50IG92ZXJyaWRlLiBBZGRyZXNzIG1vZGVzIHN1Y2ggYXMgLTNbQlBdIG9yIDEwW0JQK1NJXSBhbGwgcmVmZXIgdG8KK2FkZHJlc3NlcyByZWxhdGl2ZSB0byBTUyAoaWU6IG9uIHRoZSBzdGFjaykuIFNvLCBhdCB0aGUgbWluaW11bSwgYWxsCitkZWNvZGluZ3Mgb2YgYWRkcmVzc2luZyBtb2RlcyB3b3VsZCBoYXZlIHRvIHNldC9jbGVhciBhIGJpdCBkZXNjcmliaW5nCit3aGV0aGVyIHRoZSBhY2Nlc3MgaXMgcmVsYXRpdmUgdG8gRFMgb3IgU1MuICBUaGF0IGlzIHRoZSBmdW5jdGlvbiBvZiB0aGUKK2NwdS1zdGF0ZS12YXJpYmxlIE0ueDg2Lm1vZGUuIFRoZXJlIGFyZSBzZXZlcmFsIHBvdGVudGlhbCBzdGF0ZXM6CisKKyAgICByZXBlIHByZWZpeCBzZWVuICAoaGFuZGxlZCBlbHNld2hlcmUpCisgICAgcmVwbmUgcHJlZml4IHNlZW4gIChkaXR0bykKKworICAgIGNzIHNlZ21lbnQgb3ZlcnJpZGUKKyAgICBkcyBzZWdtZW50IG92ZXJyaWRlCisgICAgZXMgc2VnbWVudCBvdmVycmlkZQorICAgIGZzIHNlZ21lbnQgb3ZlcnJpZGUKKyAgICBncyBzZWdtZW50IG92ZXJyaWRlCisgICAgc3Mgc2VnbWVudCBvdmVycmlkZQorCisgICAgZHMvc3Mgc2VsZWN0IChpbiBhYnNlbnNlIG9mIG92ZXJyaWRlKQorCitFYWNoIG9mIHRoZSBhYm92ZSA3IGl0ZW1zIGFyZSBoYW5kbGVkIHdpdGggYSBiaXQgaW4gdGhlIG1vZGUgZmllbGQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworX0lOTElORSB1MzIgZ2V0X2RhdGFfc2VnbWVudCh2b2lkKQoreworI2RlZmluZSBHRVRfU0VHTUVOVChzZWdtZW50KQorICAgIHN3aXRjaCAoTS54ODYubW9kZSAmIFNZU01PREVfU0VHTUFTSykgeworICAgICAgY2FzZSAwOgkJCS8qIGRlZmF1bHQgY2FzZTogdXNlIGRzIHJlZ2lzdGVyICovCisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0RTOgorICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9EUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCXJldHVybglNLng4Ni5SX0RTOworICAgICAgY2FzZSBTWVNNT0RFX1NFR19EU19TUzoJLyogbm9uLW92ZXJyaWRkZW4sIHVzZSBzcyByZWdpc3RlciAqLworCXJldHVybglNLng4Ni5SX1NTOworICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9DUzoKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfQ1MgfCBTWVNNT0RFX1NFR19EU19TUzoKKwlyZXR1cm4JTS54ODYuUl9DUzsKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRVM6CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0VTIHwgU1lTTU9ERV9TRUdfRFNfU1M6CisJcmV0dXJuCU0ueDg2LlJfRVM7CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0ZTOgorICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9GUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCXJldHVybglNLng4Ni5SX0ZTOworICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9HUzoKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfR1MgfCBTWVNNT0RFX1NFR19EU19TUzoKKwlyZXR1cm4JTS54ODYuUl9HUzsKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfU1M6CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX1NTIHwgU1lTTU9ERV9TRUdfRFNfU1M6CisJcmV0dXJuCU0ueDg2LlJfU1M7CisgICAgICBkZWZhdWx0OgorI2lmZGVmCURFQlVHCisJcHJpbnRrKCJlcnJvcjogc2hvdWxkIG5vdCBoYXBwZW46ICBtdWx0aXBsZSBvdmVycmlkZXMuXG4iKTsKKyNlbmRpZgorCUhBTFRfU1lTKCk7CisJcmV0dXJuIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZmV0Y2hfZGF0YV9ieXRlKAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkYikoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitXb3JkIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgZmV0Y2hfZGF0YV93b3JkKAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkdykoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZmV0Y2hfZGF0YV9sb25nKAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkbCkoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZmV0Y2hfZGF0YV9ieXRlX2FicygKKyAgICB1aW50IHNlZ21lbnQsCisgICAgdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKKyNlbmRpZgorICAgIHJldHVybiAoKnN5c19yZGIpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZ21lbnQgLSBTZWdtZW50IHRvIGxvYWQgZGF0YSBmcm9tCitvZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KKworUkVUVVJOUzoKK1dvcmQgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBmZXRjaF9kYXRhX3dvcmRfYWJzKAorICAgIHVpbnQgc2VnbWVudCwKKyAgICB1aW50IG9mZnNldCkKK3sKKyNpZmRlZiBERUJVRworICAgIGlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQorCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkdykoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorTG9uZyB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGZldGNoX2RhdGFfbG9uZ19hYnMoCisgICAgdWludCBzZWdtZW50LAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gKCpzeXNfcmRsKSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAordmFsCS0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIHdvcmQgdmFsdWUgdG8gYW4gc2VnbWVudGVkIG1lbW9yeSBsb2NhdGlvbi4gVGhlIHNlZ21lbnQgdXNlZCBpcwordGhlIGN1cnJlbnQgJ2RlZmF1bHQnIHNlZ21lbnQsIHdoaWNoIG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdG9yZV9kYXRhX2J5dGUoCisgICAgdWludCBvZmZzZXQsCisgICAgdTggdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgKCpzeXNfd3JiKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCit0aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfd29yZCgKKyAgICB1aW50IG9mZnNldCwKKyAgICB1MTYgdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgKCpzeXNfd3J3KSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgbG9uZyB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCit0aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfbG9uZygKKyAgICB1aW50IG9mZnNldCwKKyAgICB1MzIgdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgKCpzeXNfd3JsKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZ21lbnQgLSBTZWdtZW50IHRvIHN0b3JlIGRhdGEgYXQKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgYnl0ZSB2YWx1ZSB0byBhbiBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3RvcmVfZGF0YV9ieXRlX2FicygKKyAgICB1aW50IHNlZ21lbnQsCisgICAgdWludCBvZmZzZXQsCisgICAgdTggdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cmIpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gc3RvcmUgZGF0YSBhdAorb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKK3ZhbAktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdG9yZV9kYXRhX3dvcmRfYWJzKAorICAgIHVpbnQgc2VnbWVudCwKKyAgICB1aW50IG9mZnNldCwKKyAgICB1MTYgdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cncpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gc3RvcmUgZGF0YSBhdAorb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKK3ZhbAktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBsb25nIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdG9yZV9kYXRhX2xvbmdfYWJzKAorICAgIHVpbnQgc2VnbWVudCwKKyAgICB1aW50IG9mZnNldCwKKyAgICB1MzIgdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cmwpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnIC0gUmVnaXN0ZXIgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorCitSRU1BUktTOgorUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCittb2RybSBieXRlLCBmb3IgYnl0ZSBvcGVyYW5kcy4gQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTgqIGRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKAorICAgIGludCByZWcpCit7CisgICAgc3dpdGNoIChyZWcpIHsKKyAgICAgIGNhc2UgMDoKKwlERUNPREVfUFJJTlRGKCJBTCIpOworCXJldHVybiAmTS54ODYuUl9BTDsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJDTCIpOworCXJldHVybiAmTS54ODYuUl9DTDsKKyAgICAgIGNhc2UgMjoKKwlERUNPREVfUFJJTlRGKCJETCIpOworCXJldHVybiAmTS54ODYuUl9ETDsKKyAgICAgIGNhc2UgMzoKKwlERUNPREVfUFJJTlRGKCJCTCIpOworCXJldHVybiAmTS54ODYuUl9CTDsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCJBSCIpOworCXJldHVybiAmTS54ODYuUl9BSDsKKyAgICAgIGNhc2UgNToKKwlERUNPREVfUFJJTlRGKCJDSCIpOworCXJldHVybiAmTS54ODYuUl9DSDsKKyAgICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJESCIpOworCXJldHVybiAmTS54ODYuUl9ESDsKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJCSCIpOworCXJldHVybiAmTS54ODYuUl9CSDsKKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gTlVMTDsJCS8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcgLSBSZWdpc3RlciB0byBkZWNvZGUKKworUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKK21vZHJtIGJ5dGUsIGZvciB3b3JkIG9wZXJhbmRzLglBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYqIGRlY29kZV9ybV93b3JkX3JlZ2lzdGVyKAorICAgIGludCByZWcpCit7CisgICAgc3dpdGNoIChyZWcpIHsKKyAgICAgIGNhc2UgMDoKKwlERUNPREVfUFJJTlRGKCJBWCIpOworCXJldHVybiAmTS54ODYuUl9BWDsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJDWCIpOworCXJldHVybiAmTS54ODYuUl9DWDsKKyAgICAgIGNhc2UgMjoKKwlERUNPREVfUFJJTlRGKCJEWCIpOworCXJldHVybiAmTS54ODYuUl9EWDsKKyAgICAgIGNhc2UgMzoKKwlERUNPREVfUFJJTlRGKCJCWCIpOworCXJldHVybiAmTS54ODYuUl9CWDsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCJTUCIpOworCXJldHVybiAmTS54ODYuUl9TUDsKKyAgICAgIGNhc2UgNToKKwlERUNPREVfUFJJTlRGKCJCUCIpOworCXJldHVybiAmTS54ODYuUl9CUDsKKyAgICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJTSSIpOworCXJldHVybiAmTS54ODYuUl9TSTsKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJESSIpOworCXJldHVybiAmTS54ODYuUl9ESTsKKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gTlVMTDsJCS8qIE5PVFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JlZyAtIFJlZ2lzdGVyIHRvIGRlY29kZQorCitSRVRVUk5TOgorUG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKKworUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIGdpdmVuIGJ5IHRoZSBSL1JNIGZpZWxkIG9mIHRoZQorbW9kcm0gYnl0ZSwgZm9yIGR3b3JkIG9wZXJhbmRzLgkgQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyKiBkZWNvZGVfcm1fbG9uZ19yZWdpc3RlcigKKyAgICBpbnQgcmVnKQoreworICAgIHN3aXRjaCAocmVnKSB7CisgICAgICBjYXNlIDA6CisJREVDT0RFX1BSSU5URigiRUFYIik7CisJcmV0dXJuICZNLng4Ni5SX0VBWDsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJFQ1giKTsKKwlyZXR1cm4gJk0ueDg2LlJfRUNYOworICAgICAgY2FzZSAyOgorCURFQ09ERV9QUklOVEYoIkVEWCIpOworCXJldHVybiAmTS54ODYuUl9FRFg7CisgICAgICBjYXNlIDM6CisJREVDT0RFX1BSSU5URigiRUJYIik7CisJcmV0dXJuICZNLng4Ni5SX0VCWDsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCJFU1AiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRVNQOworICAgICAgY2FzZSA1OgorCURFQ09ERV9QUklOVEYoIkVCUCIpOworCXJldHVybiAmTS54ODYuUl9FQlA7CisgICAgICBjYXNlIDY6CisJREVDT0RFX1BSSU5URigiRVNJIik7CisJcmV0dXJuICZNLng4Ni5SX0VTSTsKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJFREkiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRURJOworICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiBOVUxMOwkJLyogTk9UUkVBQ0hFRCBPUiBSRUFDSEVEIE9OIEVSUk9SICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnIC0gUmVnaXN0ZXIgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorCitSRU1BUktTOgorUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCittb2RybSBieXRlLCBmb3Igd29yZCBvcGVyYW5kcywgbW9kaWZpZWQgZnJvbSBhYm92ZSBmb3IgdGhlIHdlaXJkbworc3BlY2lhbCBjYXNlIG9mIHNlZ3JlZyBvcGVyYW5kcy4gIEFsc28gZW5hYmxlcyB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiogZGVjb2RlX3JtX3NlZ19yZWdpc3RlcigKKyAgICBpbnQgcmVnKQoreworICAgIHN3aXRjaCAocmVnKSB7CisgICAgICBjYXNlIDA6CisJREVDT0RFX1BSSU5URigiRVMiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRVM7CisgICAgICBjYXNlIDE6CisJREVDT0RFX1BSSU5URigiQ1MiKTsKKwlyZXR1cm4gJk0ueDg2LlJfQ1M7CisgICAgICBjYXNlIDI6CisJREVDT0RFX1BSSU5URigiU1MiKTsKKwlyZXR1cm4gJk0ueDg2LlJfU1M7CisgICAgICBjYXNlIDM6CisJREVDT0RFX1BSSU5URigiRFMiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRFM7CisgICAgICBjYXNlIDQ6CisJREVDT0RFX1BSSU5URigiRlMiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRlM7CisgICAgICBjYXNlIDU6CisJREVDT0RFX1BSSU5URigiR1MiKTsKKwlyZXR1cm4gJk0ueDg2LlJfR1M7CisgICAgICBjYXNlIDY6CisgICAgICBjYXNlIDc6CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBTRUdSRUciKTsKKwlicmVhazsKKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gTlVMTDsJCS8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzY2FsZSAtIHNjYWxlIHZhbHVlIG9mIFNJQiBieXRlCitpbmRleCAtIGluZGV4IHZhbHVlIG9mIFNJQiBieXRlCisKK1JFVFVSTlM6CitWYWx1ZSBvZiBzY2FsZSAqIGluZGV4CisKK1JFTUFSS1M6CitEZWNvZGVzIHNjYWxlL2luZGV4IG9mIFNJQiBieXRlIGFuZCByZXR1cm5zIHJlbGV2YW50IG9mZnNldCBwYXJ0IG9mCitlZmZlY3RpdmUgYWRkcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBkZWNvZGVfc2liX3NpKAorICAgIGludCBzY2FsZSwKKyAgICBpbnQgaW5kZXgpCit7CisgICAgc2NhbGUgPSAxIDw8IHNjYWxlOworICAgIGlmIChzY2FsZSA+IDEpIHsKKwlERUNPREVfUFJJTlRGMigiWyVkKiIsIHNjYWxlKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlsiKTsKKyAgICB9CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgY2FzZSAwOgorCURFQ09ERV9QUklOVEYoIkVBWF0iKTsKKwlyZXR1cm4gTS54ODYuUl9FQVggKiBpbmRleDsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJFQ1hdIik7CisJcmV0dXJuIE0ueDg2LlJfRUNYICogaW5kZXg7CisgICAgICBjYXNlIDI6CisJREVDT0RFX1BSSU5URigiRURYXSIpOworCXJldHVybiBNLng4Ni5SX0VEWCAqIGluZGV4OworICAgICAgY2FzZSAzOgorCURFQ09ERV9QUklOVEYoIkVCWF0iKTsKKwlyZXR1cm4gTS54ODYuUl9FQlggKiBpbmRleDsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCIwXSIpOworCXJldHVybiAwOworICAgICAgY2FzZSA1OgorCURFQ09ERV9QUklOVEYoIkVCUF0iKTsKKwlyZXR1cm4gTS54ODYuUl9FQlAgKiBpbmRleDsKKyAgICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJFU0ldIik7CisJcmV0dXJuIE0ueDg2LlJfRVNJICogaW5kZXg7CisgICAgICBjYXNlIDc6CisJREVDT0RFX1BSSU5URigiRURJXSIpOworCXJldHVybiBNLng4Ni5SX0VESSAqIGluZGV4OworICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiAwOwkJCS8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cittb2QgLSBNT0QgdmFsdWUgb2YgcHJlY2VkaW5nIE1vZFIvTSBieXRlCisKK1JFVFVSTlM6CitPZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZworCitSRU1BUktTOgorRGVjb2RlcyBTSUIgYWRkcmVzc2luZyBieXRlIGFuZCByZXR1cm5zIGNhbGN1bGF0ZWQgZWZmZWN0aXZlIGFkZHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgZGVjb2RlX3NpYl9hZGRyZXNzKAorICAgIGludCBtb2QpCit7CisgICAgaW50IHNpYiAgID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpbnQgc3MgICAgPSAoc2liID4+IDYpICYgMHgwMzsKKyAgICBpbnQgaW5kZXggPSAoc2liID4+IDMpICYgMHgwNzsKKyAgICBpbnQgYmFzZSAgPSBzaWIgJiAweDA3OworICAgIGludCBvZmZzZXQgPSAwOworICAgIGludCBkaXNwbGFjZW1lbnQ7CisKKyAgICBzd2l0Y2ggKGJhc2UpIHsKKyAgICAgIGNhc2UgMDoKKwlERUNPREVfUFJJTlRGKCJbRUFYXSIpOworCW9mZnNldCA9IE0ueDg2LlJfRUFYOworCWJyZWFrOworICAgICAgY2FzZSAxOgorCURFQ09ERV9QUklOVEYoIltFQ1hdIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FQ1g7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJREVDT0RFX1BSSU5URigiW0VEWF0iKTsKKwlvZmZzZXQgPSBNLng4Ni5SX0VEWDsKKwlicmVhazsKKyAgICAgIGNhc2UgMzoKKwlERUNPREVfUFJJTlRGKCJbRUJYXSIpOworCW9mZnNldCA9IE0ueDg2LlJfRUJYOworCWJyZWFrOworICAgICAgY2FzZSA0OgorCURFQ09ERV9QUklOVEYoIltFU1BdIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FU1A7CisJYnJlYWs7CisgICAgICBjYXNlIDU6CisJc3dpdGNoIChtb2QpIHsKKwkgIGNhc2UgMDoKKwkgICAgZGlzcGxhY2VtZW50ID0gKHMzMilmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiWyVkXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIG9mZnNldCA9IGRpc3BsYWNlbWVudDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDE6CisJICAgIGRpc3BsYWNlbWVudCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiWyVkXVtFQlBdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgb2Zmc2V0ID0gTS54ODYuUl9FQlAgKyBkaXNwbGFjZW1lbnQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAyOgorCSAgICBkaXNwbGFjZW1lbnQgPSAoczMyKWZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJWRdW0VCUF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBvZmZzZXQgPSBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBIQUxUX1NZUygpOworCX0KKwlERUNPREVfUFJJTlRGKCJbRUFYXSIpOworCW9mZnNldCA9IE0ueDg2LlJfRUFYOworCWJyZWFrOworICAgICAgY2FzZSA2OgorCURFQ09ERV9QUklOVEYoIltFU0ldIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FU0k7CisJYnJlYWs7CisgICAgICBjYXNlIDc6CisJREVDT0RFX1BSSU5URigiW0VESV0iKTsKKwlvZmZzZXQgPSBNLng4Ni5SX0VESTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJSEFMVF9TWVMoKTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IGRlY29kZV9zaWJfc2koc3MsIGluZGV4KTsKKyAgICByZXR1cm4gb2Zmc2V0OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcm0gIC0gUk0gdmFsdWUgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitPZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZworCitSRU1BUktTOgorUmV0dXJuIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgbW9kPTAwIGFkZHJlc3NpbmcuICBBbHNvIGVuYWJsZXMgdGhlCitkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisKK05PVEU6CVRoZSBjb2RlIHdoaWNoIHNwZWNpZmllcyB0aGUgY29ycmVzcG9uZGluZyBzZWdtZW50IChkcyB2cyBzcykKKwliZWxvdyBpbiB0aGUgY2FzZSBvZiBbQlArLi5dLiAgVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGF0IHRoZQorCXBvaW50IHRoYXQgdGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCwgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvCisJU1lTTU9ERV9TRUdfRFNfU1Mgd2lsbCBiZSB6ZXJvLgkgQWZ0ZXIgZXZlcnkgaW5zdHJ1Y3Rpb24KKwlleGNlcHQgdGhlIHNlZ21lbnQgb3ZlcnJpZGUgaW5zdHJ1Y3Rpb25zLCB0aGlzIGJpdCAoYXMgd2VsbAorCWFzIGFueSBiaXRzIGluZGljYXRpbmcgc2VnbWVudCBvdmVycmlkZXMpIHdpbGwgYmUgY2xlYXIuICBTbworCWlmIGEgU1MgYWNjZXNzIGlzIG5lZWRlZCwgc2V0IHRoaXMgYml0LgkgT3RoZXJ3aXNlLCBEUyBhY2Nlc3MKKwlvY2N1cnMgKHVubGVzcyBhbnkgb2YgdGhlIHNlZ21lbnQgb3ZlcnJpZGUgYml0cyBhcmUgc2V0KS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBkZWNvZGVfcm0wMF9hZGRyZXNzKAorICAgIGludCBybSkKK3sKKyAgICB1bnNpZ25lZCBvZmZzZXQ7CisKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0FERFIpIHsKKwkvKiAzMi1iaXQgYWRkcmVzc2luZyAqLworCXN3aXRjaCAocm0pIHsKKwkgIGNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiW0VBWF0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUFYOworCSAgY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJbRUNYXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9FQ1g7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIltFRFhdIik7CisJICAgIHJldHVybiBNLng4Ni5SX0VEWDsKKwkgIGNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiW0VCWF0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUJYOworCSAgY2FzZSA0OgorCSAgICByZXR1cm4gZGVjb2RlX3NpYl9hZGRyZXNzKDApOworCSAgY2FzZSA1OgorCSAgICBvZmZzZXQgPSBmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiWyUwOHhdIiwgb2Zmc2V0KTsKKwkgICAgcmV0dXJuIG9mZnNldDsKKwkgIGNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiW0VTSV0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRVNJOworCSAgY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJbRURJXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9FREk7CisJfQorICAgIH0gZWxzZSB7CisJLyogMTYtYml0IGFkZHJlc3NpbmcgKi8KKwlzd2l0Y2ggKHJtKSB7CisJICBjYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYoIltCWCtTSV0iKTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9TSSkgJiAweGZmZmY7CisJICBjYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIltCWCtESV0iKTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9ESSkgJiAweGZmZmY7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIltCUCtTSV0iKTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9TSSkgJiAweGZmZmY7CisJICBjYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIltCUCtESV0iKTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9ESSkgJiAweGZmZmY7CisJICBjYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIltTSV0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfU0k7CisJICBjYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIltESV0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfREk7CisJICBjYXNlIDY6CisJICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJTA0eF0iLCBvZmZzZXQpOworCSAgICByZXR1cm4gb2Zmc2V0OworCSAgY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJbQlhdIik7CisJICAgIHJldHVybiBNLng4Ni5SX0JYOworCX0KKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitybSAgLSBSTSB2YWx1ZSB0byBkZWNvZGUKKworUkVUVVJOUzoKK09mZnNldCBpbiBtZW1vcnkgZm9yIHRoZSBhZGRyZXNzIGRlY29kaW5nCisKK1JFTUFSS1M6CitSZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSBtb2Q9MDEgYWRkcmVzc2luZy4gIEFsc28gZW5hYmxlcyB0aGUKK2RlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBkZWNvZGVfcm0wMV9hZGRyZXNzKAorICAgIGludCBybSkKK3sKKyAgICBpbnQgZGlzcGxhY2VtZW50OworCisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9BRERSKSB7CisJLyogMzItYml0IGFkZHJlc3NpbmcgKi8KKwlpZiAocm0gIT0gNCkKKwkgICAgZGlzcGxhY2VtZW50ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisJZWxzZQorCSAgICBkaXNwbGFjZW1lbnQgPSAwOworCisJc3dpdGNoIChybSkgeworCSAgY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUFYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VBWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VDWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FQ1ggKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFRFhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURYICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgNDogeworCSAgICBpbnQgb2Zmc2V0ID0gZGVjb2RlX3NpYl9hZGRyZXNzKDEpOworCSAgICBkaXNwbGFjZW1lbnQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIlslZF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gb2Zmc2V0ICsgZGlzcGxhY2VtZW50OworCSAgfQorCSAgY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJQXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FU0kgKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURJICsgZGlzcGxhY2VtZW50OworCX0KKyAgICB9IGVsc2UgeworCS8qIDE2LWJpdCBhZGRyZXNzaW5nICovCisJZGlzcGxhY2VtZW50ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisJc3dpdGNoIChybSkgeworCSAgY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlgrU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQK1NJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7CisJICAgIHJldHVybiAoTS54ODYuUl9CUCArIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7CisJICAgIHJldHVybiAoTS54ODYuUl9CUCArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCX0KKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gMDsJCQkvKiBTSE9VTEQgTk9UIEhBUFBFTiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JtICAtIFJNIHZhbHVlIHRvIGRlY29kZQorCitSRVRVUk5TOgorT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcKKworUkVNQVJLUzoKK1JldHVybiB0aGUgb2Zmc2V0IGdpdmVuIGJ5IG1vZD0xMCBhZGRyZXNzaW5nLiAgQWxzbyBlbmFibGVzIHRoZQorZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGRlY29kZV9ybTEwX2FkZHJlc3MoCisgICAgaW50IHJtKQoreworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfQUREUikgeworCWludCBkaXNwbGFjZW1lbnQ7CisKKwkvKiAzMi1iaXQgYWRkcmVzc2luZyAqLworCWlmIChybSAhPSA0KQorCSAgICBkaXNwbGFjZW1lbnQgPSAoczMyKWZldGNoX2xvbmdfaW1tKCk7CisJZWxzZQorCSAgICBkaXNwbGFjZW1lbnQgPSAwOworCisJc3dpdGNoIChybSkgeworCSAgY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUFYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VBWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VDWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FQ1ggKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFRFhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURYICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgNDogeworCSAgICBpbnQgb2Zmc2V0ID0gZGVjb2RlX3NpYl9hZGRyZXNzKDIpOworCSAgICBkaXNwbGFjZW1lbnQgPSAoczMyKWZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJWRdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIG9mZnNldCArIGRpc3BsYWNlbWVudDsKKwkgIH0KKwkgIGNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VCUF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FQlAgKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRVNJICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRURJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VESSArIGRpc3BsYWNlbWVudDsKKwl9CisgICAgfSBlbHNlIHsKKwlpbnQgZGlzcGxhY2VtZW50ID0gKHMxNilmZXRjaF93b3JkX2ltbSgpOworCisJLyogMTYtYml0IGFkZHJlc3NpbmcgKi8KKwlzd2l0Y2ggKHJtKSB7CisJICBjYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK0RJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9CWCArIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW1NJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlBdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9CWCArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJfQorICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiAwOwkJCS8qIFNIT1VMRCBOT1QgSEFQUEVOICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW9kIC0gbW9kaWZpZXIKK3JtICAtIFJNIHZhbHVlIHRvIGRlY29kZQorCitSRVRVUk5TOgorT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcsIG11bHRpcGxleGluZyBjYWxscyB0bwordGhlIGRlY29kZV9ybVhYX2FkZHJlc3MgZnVuY3Rpb25zCisKK1JFTUFSS1M6CitSZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSAibW9kIiBhZGRyZXNzaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5zaWduZWQgZGVjb2RlX3JtWFhfYWRkcmVzcyhpbnQgbW9kLCBpbnQgcm0pCit7CisgIGlmKG1vZCA9PSAwKQorICAgIHJldHVybiBkZWNvZGVfcm0wMF9hZGRyZXNzKHJtKTsKKyAgaWYobW9kID09IDEpCisgICAgcmV0dXJuIGRlY29kZV9ybTAxX2FkZHJlc3Mocm0pOworICByZXR1cm4gZGVjb2RlX3JtMTBfYWRkcmVzcyhybSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9vcHMuYyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzNGZiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvb3BzLmMKQEAgLTAsMCArMSw1NDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKgkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOgkJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CVRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB0byBpbXBsZW1lbnQgdGhlIGRlY29kaW5nCisqCQlhbmQgZW11bGF0aW9uIG9mIGFsbCB0aGUgeDg2IHByb2Nlc3NvciBpbnN0cnVjdGlvbnMuCisqCisqIFRoZXJlIGFyZSBhcHByb3hpbWF0ZWx5IDI1MCBzdWJyb3V0aW5lcyBpbiBoZXJlLCB3aGljaCBjb3JyZXNwb25kCisqIHRvIHRoZSAyNTYgYnl0ZS0ib3Bjb2RlcyIgZm91bmQgb24gdGhlIDgwODYuCVRoZSB0YWJsZSB3aGljaAorKiBkaXNwYXRjaGVzIHRoaXMgaXMgZm91bmQgaW4gdGhlIGZpbGVzIG9wdGFiLltjaF0uCisqCisqIEVhY2ggb3Bjb2RlIHByb2MgaGFzIGEgY29tbWVudCBwcmVjZWVkaW5nIGl0IHdoaWNoIGdpdmVzIGl0J3MgdGFibGUKKyogYWRkcmVzcy4gIFNldmVyYWwgb3Bjb2RlcyBhcmUgbWlzc2luZyAodW5kZWZpbmVkKSBpbiB0aGUgdGFibGUuCisqCisqIEVhY2ggcHJvYyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBmb3IgZGVjb2RpbmcgKERFQ09ERV9QUklOVEYgYW5kCisqIERFQ09ERV9QUklOVEYyKSwgZGVidWdnaW5nIChUUkFDRV9SRUdTLCBTSU5HTEVfU1RFUCksIGFuZCBtaXNjCisqIGZ1bmN0aW9ucyAoU1RBUlRfT0ZfSU5TVFIsIEVORF9PRl9JTlNUUikuCisqCisqIE1hbnkgb2YgdGhlIHByb2NlZHVyZXMgYXJlICpWRVJZKiBzaW1pbGFyIGluIGNvZGluZy4JVGhpcyBoYXMKKyogYWxsb3dlZCBmb3IgYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBjb2RlIHRvIGJlIGdlbmVyYXRlZCBpbiBhIGZhaXJseQorKiBzaG9ydCBhbW91bnQgb2YgdGltZSAoaS5lLiBjdXQsIHBhc3RlLCBhbmQgbW9kaWZ5KS4gIFRoZSByZXN1bHQgaXMKKyogdGhhdCBtdWNoIG9mIHRoZSBjb2RlIGJlbG93IGNvdWxkIGhhdmUgYmVlbiBmb2xkZWQgaW50byBzdWJyb3V0aW5lcworKiBmb3IgYSBsYXJnZSByZWR1Y3Rpb24gaW4gc2l6ZSBvZiB0aGlzIGZpbGUuICBUaGUgZG93bnNpZGUgd291bGQgYmUKKyogdGhhdCB0aGVyZSB3b3VsZCBiZSBhIHBlbmFsdHkgaW4gZXhlY3V0aW9uIHNwZWVkLiAgVGhlIGZpbGUgY291bGQKKyogYWxzbyBoYXZlIGJlZW4gKk1VQ0gqIGxhcmdlciBieSBpbmxpbmluZyBjZXJ0YWluIGZ1bmN0aW9ucyB3aGljaAorKiB3ZXJlIGNhbGxlZC4JVGhpcyBjb3VsZCBoYXZlIHJlc3VsdGVkIGV2ZW4gZmFzdGVyIGV4ZWN1dGlvbi4JIFRoZQorKiBwcmltZSBkaXJlY3RpdmUgSSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGlubGluZSB0aGUgY29kZSBvciB0bworKiBtb2R1bGFyaXplIGl0LCB3YXMgYmFzaWNhbGx5OiAxKSBubyB1bm5lY2Vzc2FyeSBzdWJyb3V0aW5lIGNhbGxzLAorKiAyKSBubyByb3V0aW5lcyBtb3JlIHRoYW4gYWJvdXQgMjAwIGxpbmVzIGluIHNpemUsIGFuZCAzKSBtb2R1bGFyaXplCisqIGFueSBjb2RlIHRoYXQgSSBtaWdodCBub3QgZ2V0IHJpZ2h0IHRoZSBmaXJzdCB0aW1lLiAgVGhlIGZldGNoXyoKKyogc3Vicm91dGluZXMgZmFsbCBpbnRvIHRoZSBsYXR0ZXIgY2F0ZWdvcnkuICBUaGUgVGhlIGRlY29kZV8qIGZhbGwKKyogaW50byB0aGUgc2Vjb25kIGNhdGVnb3J5LiAgVGhlIGNvZGluZyBvZiB0aGUgInN3aXRjaChtb2QpeyAuLi4uIH0iCisqIGluIG1hbnkgb2YgdGhlIHN1YnJvdXRpbmVzIGJlbG93IGZhbGxzIGludG8gdGhlIGZpcnN0IGNhdGVnb3J5LgorKiBFc3BlY2lhbGx5LCB0aGUgY29kaW5nIG9mIHthZGQsYW5kLG9yLHN1YiwuLi59X3tieXRlLHdvcmR9CisqIHN1YnJvdXRpbmVzIGFyZSBhbiBlc3BlY2lhbGx5IGdsYXJpbmcgY2FzZSBvZiB0aGUgdGhpcmQgZ3VpZGVsaW5lLgorKiBTaW5jZSBzbyBtdWNoIG9mIHRoZSBjb2RlIGlzIGNsb25lZCBmcm9tIG90aGVyIG1vZHVsZXMgKGNvbXBhcmUKKyogb3Bjb2RlICMwMCB0byBvcGNvZGUgIzAxKSwgbWFraW5nIHRoZSBiYXNpYyBvcGVyYXRpb25zIHN1YnJvdXRpbmUKKyogY2FsbHMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQ7IG90aGVyd2lzZSBtaXN0YWtlcyBpbiBjb2RpbmcgYW4KKyogImFkZCIgd291bGQgcmVwcmVzZW50IGEgbmlnaHRtYXJlIGluIG1haW50ZW5hbmNlLgorKgorKiBKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdC4gcGxhY2UgYWxsIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluCisqIHRoZSBnb3QyIHNlY3Rvci4gUmVtb3ZlZCBzb21lIG9wY29kZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogY29uc3RhbnQgYXJyYXlzIHRvIGRvIHNldmVyYWwgaW5zdHJ1Y3Rpb25zIGluIGp1c3Qgb25lIGZ1bmN0aW9uICovCisKKyNpZmRlZiBERUJVRworc3RhdGljIGNoYXIgKng4NmVtdV9HZW5PcE5hbWVbOF0gPSB7CisgICAgIkFERCIsICJPUiIsICJBREMiLCAiU0JCIiwgIkFORCIsICJTVUIiLCAiWE9SIiwgIkNNUCJ9OworI2VuZGlmCisKKy8qIHVzZWQgYnkgc2V2ZXJhbCBvcGNvZGVzICAqLworc3RhdGljIHU4ICgqZ2Vub3BfYnl0ZV9vcGVyYXRpb25bXSkodTggZCwgdTggcykgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24oIi5nb3QyIikpKSA9Cit7CisgICAgYWRkX2J5dGUsCQkvKiAwMCAqLworICAgIG9yX2J5dGUsCQkvKiAwMSAqLworICAgIGFkY19ieXRlLAkJLyogMDIgKi8KKyAgICBzYmJfYnl0ZSwJCS8qIDAzICovCisgICAgYW5kX2J5dGUsCQkvKiAwNCAqLworICAgIHN1Yl9ieXRlLAkJLyogMDUgKi8KKyAgICB4b3JfYnl0ZSwJCS8qIDA2ICovCisgICAgY21wX2J5dGUsCQkvKiAwNyAqLworfTsKKworc3RhdGljIHUxNiAoKmdlbm9wX3dvcmRfb3BlcmF0aW9uW10pKHUxNiBkLCB1MTYgcykgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24oIi5nb3QyIikpKSA9Cit7CisgICAgYWRkX3dvcmQsCQkvKjAwICovCisgICAgb3Jfd29yZCwJCS8qMDEgKi8KKyAgICBhZGNfd29yZCwJCS8qMDIgKi8KKyAgICBzYmJfd29yZCwJCS8qMDMgKi8KKyAgICBhbmRfd29yZCwJCS8qMDQgKi8KKyAgICBzdWJfd29yZCwJCS8qMDUgKi8KKyAgICB4b3Jfd29yZCwJCS8qMDYgKi8KKyAgICBjbXBfd29yZCwJCS8qMDcgKi8KK307CisKK3N0YXRpYyB1MzIgKCpnZW5vcF9sb25nX29wZXJhdGlvbltdKSh1MzIgZCwgdTMyIHMpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworICAgIGFkZF9sb25nLAkJLyowMCAqLworICAgIG9yX2xvbmcsCQkvKjAxICovCisgICAgYWRjX2xvbmcsCQkvKjAyICovCisgICAgc2JiX2xvbmcsCQkvKjAzICovCisgICAgYW5kX2xvbmcsCQkvKjA0ICovCisgICAgc3ViX2xvbmcsCQkvKjA1ICovCisgICAgeG9yX2xvbmcsCQkvKjA2ICovCisgICAgY21wX2xvbmcsCQkvKjA3ICovCit9OworCisvKiB1c2VkIGJ5IG9wY29kZXMgODAsIGMwLCBkMCwgYW5kIGQyLiAqLworc3RhdGljIHU4KCpvcGNEMF9ieXRlX29wZXJhdGlvbltdKSh1OCBkLCB1OCBzKSBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbigiLmdvdDIiKSkpID0KK3sKKyAgICByb2xfYnl0ZSwKKyAgICByb3JfYnl0ZSwKKyAgICByY2xfYnl0ZSwKKyAgICByY3JfYnl0ZSwKKyAgICBzaGxfYnl0ZSwKKyAgICBzaHJfYnl0ZSwKKyAgICBzaGxfYnl0ZSwJCS8qIHNhbF9ieXRlID09PSBzaGxfYnl0ZSAgYnkgZGVmaW5pdGlvbiAqLworICAgIHNhcl9ieXRlLAorfTsKKworLyogdXNlZCBieSBvcGNvZGVzIGMxLCBkMSwgYW5kIGQzLiAqLworc3RhdGljIHUxNigqb3BjRDFfd29yZF9vcGVyYXRpb25bXSkodTE2IHMsIHU4IGQpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworICAgIHJvbF93b3JkLAorICAgIHJvcl93b3JkLAorICAgIHJjbF93b3JkLAorICAgIHJjcl93b3JkLAorICAgIHNobF93b3JkLAorICAgIHNocl93b3JkLAorICAgIHNobF93b3JkLAkJLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCisgICAgc2FyX3dvcmQsCit9OworCisvKiB1c2VkIGJ5IG9wY29kZXMgYzEsIGQxLCBhbmQgZDMuICovCitzdGF0aWMgdTMyICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bXSkodTMyIHMsIHU4IGQpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworICAgIHJvbF9sb25nLAorICAgIHJvcl9sb25nLAorICAgIHJjbF9sb25nLAorICAgIHJjcl9sb25nLAorICAgIHNobF9sb25nLAorICAgIHNocl9sb25nLAorICAgIHNobF9sb25nLAkJLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCisgICAgc2FyX2xvbmcsCit9OworCisjaWZkZWYgREVCVUcKKworc3RhdGljIGNoYXIgKm9wRjZfbmFtZXNbOF0gPQorICB7ICJURVNUXHQiLCAiIiwgIk5PVFx0IiwgIk5FR1x0IiwgIk1VTFx0IiwgIklNVUxcdCIsICJESVZcdCIsICJJRElWXHQiIH07CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29wMSAtIEluc3RydWN0aW9uIG9wIGNvZGUKKworUkVNQVJLUzoKK0hhbmRsZXMgaWxsZWdhbCBvcGNvZGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaWxsZWdhbF9vcCgKKyAgICB1OCBvcDEpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYuUl9TUCAhPSAwKSB7CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBYODYgT1BDT0RFXG4iKTsKKwlUUkFDRV9SRUdTKCk7CisJREIoIHByaW50aygiJTA0eDolMDR4OiAlMDJYIElMTEVHQUwgWDg2IE9QQ09ERSFcbiIsCisJICAgIE0ueDg2LlJfQ1MsIE0ueDg2LlJfSVAtMSxvcDEpKTsKKwlIQUxUX1NZUygpOworCX0KKyAgICBlbHNlIHsKKwkvKiBJZiB3ZSBnZXQgaGVyZSwgaXQgbWVhbnMgdGhlIHN0YWNrIHBvaW50ZXIgaXMgYmFjayB0byB6ZXJvCisJICogc28gd2UgYXJlIGp1c3QgcmV0dXJuaW5nIGZyb20gYW4gZW11bGF0b3Igc2VydmljZSBjYWxsCisJICogc28gdGhlcnRlIGlzIG5vIG5lZWQgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlLiBXZSB0cmFwCisJICogdGhlIGVtdWxhdG9yIHdpdGggYW4gMHhGMSBvcGNvZGUgdG8gZmluaXNoIHRoZSBzZXJ2aWNlCisJICogY2FsbC4KKwkgKi8KKwlYODZFTVVfaGFsdF9zeXMoKTsKKwl9CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGVzIDB4MDAsIDB4MDgsIDB4MTAsIDB4MTgsIDB4MjAsIDB4MjgsIDB4MzAsIDB4MzgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2dlbm9wX2J5dGVfUk1fUih1OCBvcDEpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1OCBkZXN0dmFsOworCisgICAgb3AxID0gKG9wMSA+PiAzKSAmIDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworICAgIERFQ09ERV9QUklOVEYoIlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZihtb2Q8MykKKwl7IGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCxybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gZ2Vub3BfYnl0ZV9vcGVyYXRpb25bb3AxXShkZXN0dmFsLCAqc3JjcmVnKTsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIGVsc2UKKwl7CQkJLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gZ2Vub3BfYnl0ZV9vcGVyYXRpb25bb3AxXSgqZGVzdHJlZywgKnNyY3JlZyk7CisJfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwMSwgMHgwOSwgMHgxMSwgMHgxOSwgMHgyMSwgMHgyOSwgMHgzMSwgMHgzOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SKHU4IG9wMSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgb3AxID0gKG9wMSA+PiAzKSAmIDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworICAgIERFQ09ERV9QUklOVEYoIlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKworICAgIGlmKG1vZDwzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc3JjcmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZ2Vub3BfbG9uZ19vcGVyYXRpb25bb3AxXShkZXN0dmFsLCAqc3JjcmVnKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsOworCSAgICB1MTYgKnNyY3JlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGdlbm9wX3dvcmRfb3BlcmF0aW9uW29wMV0oZGVzdHZhbCwgKnNyY3JlZyk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBnZW5vcF9sb25nX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnLCAqc3JjcmVnKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBnZW5vcF93b3JkX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnLCAqc3JjcmVnKTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwMiwgMHgwYSwgMHgxMiwgMHgxYSwgMHgyMiwgMHgyYSwgMHgzMiwgMHgzYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNKHU4IG9wMSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTggc3JjdmFsOworCisgICAgb3AxID0gKG9wMSA+PiAzKSAmIDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworICAgIERFQ09ERV9QUklOVEYoIlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLHJsKTsKKwlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICB9IGVsc2UgewkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJc3JjdmFsID0gKnNyY3JlZzsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICpkZXN0cmVnID0gZ2Vub3BfYnl0ZV9vcGVyYXRpb25bb3AxXSgqZGVzdHJlZywgc3JjdmFsKTsKKworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwMywgMHgwYiwgMHgxMywgMHgxYiwgMHgyMywgMHgyYiwgMHgzMywgMHgzYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNKHU4IG9wMSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTMyICpkZXN0cmVnMzIsIHNyY3ZhbDsKKyAgICB1MTYgKmRlc3RyZWc7CisKKyAgICBvcDEgPSAob3AxID4+IDMpICYgMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKHg4NmVtdV9HZW5PcE5hbWVbb3AxXSk7CisgICAgREVDT0RFX1BSSU5URigiXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QscmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICBkZXN0cmVnMzIgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnMzIgPSBnZW5vcF9sb25nX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnMzIsIHNyY3ZhbCk7CisJfSBlbHNlIHsKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBnZW5vcF93b3JkX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnLCBzcmN2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZzsKKwkgICAgZGVzdHJlZzMyID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWczMiA9IGdlbm9wX2xvbmdfb3BlcmF0aW9uW29wMV0oKmRlc3RyZWczMiwgKnNyY3JlZyk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpzcmNyZWc7CisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGdlbm9wX3dvcmRfb3BlcmF0aW9uW29wMV0oKmRlc3RyZWcsICpzcmNyZWcpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlcyAweDA0LCAweDBjLCAweDE0LCAweDFjLCAweDI0LCAweDJjLCAweDM0LCAweDNjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSh1OCBvcDEpCit7CisgICAgdTggc3JjdmFsOworCisgICAgb3AxID0gKG9wMSA+PiAzKSAmIDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworICAgIERFQ09ERV9QUklOVEYoIlx0QUwsIik7CisgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FMID0gZ2Vub3BfYnl0ZV9vcGVyYXRpb25bb3AxXShNLng4Ni5SX0FMLCBzcmN2YWwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwNSwgMHgwZCwgMHgxNSwgMHgxZCwgMHgyNSwgMHgyZCwgMHgzNSwgMHgzZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3Bfd29yZF9BWF9JTU0odTggb3AxKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBvcDEgPSAob3AxID4+IDMpICYgMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKHg4NmVtdV9HZW5PcE5hbWVbb3AxXSk7CisJREVDT0RFX1BSSU5URigiXHRFQVgsIik7CisJc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoeDg2ZW11X0dlbk9wTmFtZVtvcDFdKTsKKwlERUNPREVfUFJJTlRGKCJcdEFYLCIpOworCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCU0ueDg2LlJfRUFYID0gZ2Vub3BfbG9uZ19vcGVyYXRpb25bb3AxXShNLng4Ni5SX0VBWCwgc3JjdmFsKTsKKyAgICB9IGVsc2UgeworCU0ueDg2LlJfQVggPSBnZW5vcF93b3JkX29wZXJhdGlvbltvcDFdKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MDYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0RVNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfRVMpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDA3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHRFU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0VTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9DUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRDU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYuIEVzY2FwZSBmb3IgdHdvLWJ5dGUgb3Bjb2RlICgyODYgb3IgYmV0dGVyKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdHdvX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IG9wMiA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKKyAgICBJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKKyAgICAoKng4NmVtdV9vcHRhYjJbb3AyXSkob3AyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdFNTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHB1c2hfd29yZChNLng4Ni5SX1NTKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgxNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBPUFx0U1NcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9TUyA9IHBvcF93b3JkKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0RFNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfRFMpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDFmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHREU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0RTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0VTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkVTOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0VTOworICAgIC8qCisgICAgICogbm90ZSB0aGUgbGFjayBvZiBERUNPREVfQ0xFQVJfU0VHT1ZSKHIpIHNpbmNlLCBoZXJlIGlzIG9uZSBvZiA0CisgICAgICogb3Bjb2RlIHN1YnJvdXRpbmVzIHdlIGRvIG5vdCB3YW50IHRvIGRvIHRoaXMuCisgICAgICovCisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZGFhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkRBQVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FMID0gZGFhX2J5dGUoTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NlZ292cl9DUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDUzpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9DUzsKKyAgICAvKiBub3RlIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgaGVyZS4gKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDJmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9kYXModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiREFTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSBkYXNfYnl0ZShNLng4Ni5SX0FMKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNTOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX1NTOworICAgIC8qIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgISAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MzcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FhYSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBQUFcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BWCA9IGFhYV93b3JkKE0ueDg2LlJfQVgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiRFM6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRFM7CisgICAgLyogTk8gREVDT0RFX0NMRUFSX1NFR09WUiEgKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDNmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hYXModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUFTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQVggPSBhYXNfd29yZChNLng4Ni5SX0FYKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0MCAtIDB4NDcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luY19yZWdpc3Rlcih1OCBvcDEpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBvcDEgJj0gMHg3OworICAgIERFQ09ERV9QUklOVEYoIklOQ1x0Iik7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJdTMyICpyZWc7CisJcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IGluY19sb25nKCpyZWcpOworICAgIH0gZWxzZSB7CisJdTE2ICpyZWc7CisJcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IGluY193b3JkKCpyZWcpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0OCAtIDB4NEYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2RlY19yZWdpc3Rlcih1OCBvcDEpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBvcDEgJj0gMHg3OworICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0Iik7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJdTMyICpyZWc7CisJcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IGRlY19sb25nKCpyZWcpOworICAgIH0gZWxzZSB7CisJdTE2ICpyZWc7CisJcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IGRlY193b3JkKCpyZWcpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg1MCAtIDB4NTcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIodTggb3AxKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgb3AxICY9IDB4NzsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHQiKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlwdXNoX2xvbmcoKnJlZyk7CisgICAgfSBlbHNlIHsKKwl1MTYgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlwdXNoX3dvcmQoKnJlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDU4IC0gMHg1RgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX3JlZ2lzdGVyKHU4IG9wMSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIG9wMSAmPSAweDc7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHQiKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworCXUxNiAqcmVnOworCXJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKG9wMSk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpyZWcgPSBwb3Bfd29yZCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2MAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9hbGwodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiUFVTSEFEXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlBVU0hBXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgb2xkX3NwID0gTS54ODYuUl9FU1A7CisKKwlwdXNoX2xvbmcoTS54ODYuUl9FQVgpOworCXB1c2hfbG9uZyhNLng4Ni5SX0VDWCk7CisJcHVzaF9sb25nKE0ueDg2LlJfRURYKTsKKwlwdXNoX2xvbmcoTS54ODYuUl9FQlgpOworCXB1c2hfbG9uZyhvbGRfc3ApOworCXB1c2hfbG9uZyhNLng4Ni5SX0VCUCk7CisJcHVzaF9sb25nKE0ueDg2LlJfRVNJKTsKKwlwdXNoX2xvbmcoTS54ODYuUl9FREkpOworICAgIH0gZWxzZSB7CisJdTE2IG9sZF9zcCA9IE0ueDg2LlJfU1A7CisKKwlwdXNoX3dvcmQoTS54ODYuUl9BWCk7CisJcHVzaF93b3JkKE0ueDg2LlJfQ1gpOworCXB1c2hfd29yZChNLng4Ni5SX0RYKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9CWCk7CisJcHVzaF93b3JkKG9sZF9zcCk7CisJcHVzaF93b3JkKE0ueDg2LlJfQlApOworCXB1c2hfd29yZChNLng4Ni5SX1NJKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9ESSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDYxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfYWxsKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIlBPUEFEXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlBPUEFcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCU0ueDg2LlJfRURJID0gcG9wX2xvbmcoKTsKKwlNLng4Ni5SX0VTSSA9IHBvcF9sb25nKCk7CisJTS54ODYuUl9FQlAgPSBwb3BfbG9uZygpOworCU0ueDg2LlJfRVNQICs9IDQ7CSAgICAgICAvKiBza2lwIEVTUCAqLworCU0ueDg2LlJfRUJYID0gcG9wX2xvbmcoKTsKKwlNLng4Ni5SX0VEWCA9IHBvcF9sb25nKCk7CisJTS54ODYuUl9FQ1ggPSBwb3BfbG9uZygpOworCU0ueDg2LlJfRUFYID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworCU0ueDg2LlJfREkgPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfU0kgPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfQlAgPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfU1AgKz0gMjsJICAgICAgIC8qIHNraXAgU1AgKi8KKwlNLng4Ni5SX0JYID0gcG9wX3dvcmQoKTsKKwlNLng4Ni5SX0RYID0gcG9wX3dvcmQoKTsKKwlNLng4Ni5SX0NYID0gcG9wX3dvcmQoKTsKKwlNLng4Ni5SX0FYID0gcG9wX3dvcmQoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKm9wY29kZSAweDYyCUlMTEVHQUwgT1AsIGNhbGxzIHg4NmVtdU9wX2lsbGVnYWxfb3AoKSAqLworLypvcGNvZGUgMHg2MwlJTExFR0FMIE9QLCBjYWxscyB4ODZlbXVPcF9pbGxlZ2FsX29wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfRlModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiRlM6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRlM7CisgICAgLyoKKyAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKKyAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KKyAgICAgKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfR1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiR1M6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfR1M7CisgICAgLyoKKyAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKKyAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KKyAgICAgKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY2IC0gcHJlZml4IGZvciAzMi1iaXQgcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3ByZWZpeF9kYXRhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkRBVEE6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9QUkVGSVhfREFUQTsKKyAgICAvKiBub3RlIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgaGVyZS4gKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY3IC0gcHJlZml4IGZvciAzMi1iaXQgYWRkcmVzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHJlZml4X2FkZHIodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUREUjpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9BRERSOworICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfd29yZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCWltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgfSBlbHNlIHsKKwlpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiUFVTSFx0JXhcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlwdXNoX2xvbmcoaW1tKTsKKyAgICB9IGVsc2UgeworCXB1c2hfd29yZCgodTE2KWltbSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbXVsX3dvcmRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisJICAgIHUzMiByZXNfbG8scmVzX2hpOworCSAgICBzMzIgaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOworCSAgICBpZiAoKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgPT0gMCkgJiYgKHJlc19oaSA9PSAweDAwMDAwMDAwKSkgfHwKKwkJKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJlc19oaSA9PSAweEZGRkZGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCSAgICB1MzIgcmVzOworCSAgICBzMTYgaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKKwkgICAgaWYgKCgoKHJlcyAmIDB4ODAwMCkgPT0gMCkgJiYgKChyZXMgPj4gMTYpID09IDB4MDAwMCkpIHx8CisJCSgoKHJlcyAmIDB4ODAwMCkgIT0gMCkgJiYgKChyZXMgPj4gMTYpID09IDB4RkZGRikpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTMyIHJlc19sbyxyZXNfaGk7CisJICAgIHMzMiBpbW07CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqc3JjcmVnLChzMzIpaW1tKTsKKwkgICAgaWYgKCgoKHJlc19sbyAmIDB4ODAwMDAwMDApID09IDApICYmIChyZXNfaGkgPT0gMHgwMDAwMDAwMCkpIHx8CisJCSgoKHJlc19sbyAmIDB4ODAwMDAwMDApICE9IDApICYmIChyZXNfaGkgPT0gMHhGRkZGRkZGRikpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCSAgICB1MzIgcmVzOworCSAgICBzMTYgaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisJICAgIHJlcyA9IChzMTYpKnNyY3JlZyAqIChzMTYpaW1tOworCSAgICBpZiAoKCgocmVzICYgMHg4MDAwKSA9PSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHgwMDAwKSkgfHwKKwkJKCgocmVzICYgMHg4MDAwKSAhPSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHhGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUxNilyZXM7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2YQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9ieXRlX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczE2IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaW1tID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIlBVU0hcdCVkXG4iLCBpbW0pOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKGltbSk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NmIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2ltdWxfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBzOAlpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisJICAgIHUzMiByZXNfbG8scmVzX2hpOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOworCSAgICBpZiAoKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgPT0gMCkgJiYgKHJlc19oaSA9PSAweDAwMDAwMDAwKSkgfHwKKwkJKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJlc19oaSA9PSAweEZGRkZGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCSAgICB1MzIgcmVzOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKKwkgICAgaWYgKCgoKHJlcyAmIDB4ODAwMCkgPT0gMCkgJiYgKChyZXMgPj4gMTYpID09IDB4MDAwMCkpIHx8CisJCSgoKHJlcyAmIDB4ODAwMCkgIT0gMCkgJiYgKChyZXMgPj4gMTYpID09IDB4RkZGRikpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqc3JjcmVnLChzMzIpaW1tKTsKKwkgICAgaWYgKCgoKHJlc19sbyAmIDB4ODAwMDAwMDApID09IDApICYmIChyZXNfaGkgPT0gMHgwMDAwMDAwMCkpIHx8CisJCSgoKHJlc19sbyAmIDB4ODAwMDAwMDApICE9IDApICYmIChyZXNfaGkgPT0gMHhGRkZGRkZGRikpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCSAgICB1MzIgcmVzOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHJlcyA9IChzMTYpKnNyY3JlZyAqIChzMTYpaW1tOworCSAgICBpZiAoKCgocmVzICYgMHg4MDAwKSA9PSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHgwMDAwKSkgfHwKKwkJKCgocmVzICYgMHg4MDAwKSAhPSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHhGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUxNilyZXM7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2YworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5zX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5TQlxuIik7CisgICAgaW5zKDEpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIklOU0RcbiIpOworCWlucyg0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIklOU1dcbiIpOworCWlucygyKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3V0c19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9VVFNCXG4iKTsKKyAgICBvdXRzKDEpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NmYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJPVVRTRFxuIik7CisJb3V0cyg0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIk9VVFNXXG4iKTsKKwlvdXRzKDIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDcwIC0gMHg3RgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB4ODZlbXVfY2hlY2tfanVtcF9jb25kaXRpb24odTggb3ApOworCit2b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kKHU4IG9wMSkKK3sKKyAgICBzOCBvZmZzZXQ7CisgICAgdTE2IHRhcmdldDsKKyAgICBpbnQgY29uZDsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgb3ZlcmZsb3cgZmxhZyBpcyBzZXQgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGNvbmQgPSB4ODZlbXVfY2hlY2tfanVtcF9jb25kaXRpb24ob3AxICYgMHhGKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChjb25kKQorCU0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wYzgwX2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGltbTsKKyAgICB1OCBkZXN0dmFsOworCisgICAgLyoKKyAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4JUGFydCBvZiB0aGUgb3Bjb2RlCisgICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0CisgICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwlERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpnZW5vcF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworCWlmIChyaCAhPSA3KQorCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKmdlbm9wX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworCWlmIChyaCAhPSA3KQorCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDgxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGM4MV93b3JkX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIC8qCisgICAgICogV2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuCVBhcnQgb2YgdGhlIG9wY29kZQorICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAorICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKwkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisJICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCisJICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKgorICAgICAqIEtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgKiBtb2RlLgorICAgICAqLworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbCxpbW07CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKmdlbm9wX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWwsaW1tOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpnZW5vcF93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBkZXN0dmFsLGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3BfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQkqZGVzdHJlZyA9IGRlc3R2YWw7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgZGVzdHZhbCxpbW07CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKmdlbm9wX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJKmRlc3RyZWcgPSBkZXN0dmFsOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wYzgyX2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGltbTsKKyAgICB1OCBkZXN0dmFsOworCisgICAgLyoKKyAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4JUGFydCBvZiB0aGUgb3Bjb2RlCisgICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0CisgICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbiBTaW1pbGFyIHRvIG9wY29kZSA4MSwgZXhjZXB0IHRoYXQKKyAgICAgKiB0aGUgaW1tZWRpYXRlIGJ5dGUgaXMgc2lnbiBleHRlbmRlZCB0byBhIHdvcmQgbGVuZ3RoLgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqZ2Vub3BfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKwlpZiAocmggIT0gNykKKwkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpnZW5vcF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKKwlpZiAocmggIT0gNykKKwkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4MworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjODNfd29yZF9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICAvKgorICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LglQYXJ0IG9mIHRoZSBvcGNvZGUKKyAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKKyAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uIFNpbWlsYXIgdG8gb3Bjb2RlIDgxLCBleGNlcHQgdGhhdAorICAgICAqIHRoZSBpbW1lZGlhdGUgYnl0ZSBpcyBzaWduIGV4dGVuZGVkIHRvIGEgd29yZCBsZW5ndGguCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKyAgICAgICBzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCxybCk7CisKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWwsaW1tOworCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3BfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKwkgICAgaWYgKHJoICE9IDcpCisJCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbCxpbW07CisKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpnZW5vcF93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBkZXN0dmFsLGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKmdlbm9wX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJKmRlc3RyZWcgPSBkZXN0dmFsOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZzsKKwkgICAgdTE2IGRlc3R2YWwsaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3Bfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQkqZGVzdHJlZyA9IGRlc3R2YWw7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4NAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdGVzdF9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiVEVTVFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJdGVzdF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0ZXN0X2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4NQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdGVzdF93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc3JjcmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisJICAgIHUxNiAqc3JjcmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisgICAgdTggdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0bXAgPSAqc3JjcmVnOworCSpzcmNyZWcgPSBkZXN0dmFsOworCWRlc3R2YWwgPSB0bXA7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0bXAgPSAqc3JjcmVnOworCSpzcmNyZWcgPSAqZGVzdHJlZzsKKwkqZGVzdHJlZyA9IHRtcDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZzsKKwkgICAgdTMyIGRlc3R2YWwsdG1wOworCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgdG1wID0gKnNyY3JlZzsKKwkgICAgKnNyY3JlZyA9IGRlc3R2YWw7CisJICAgIGRlc3R2YWwgPSB0bXA7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZzsKKwkgICAgdTE2IGRlc3R2YWwsdG1wOworCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgdG1wID0gKnNyY3JlZzsKKwkgICAgKnNyY3JlZyA9IGRlc3R2YWw7CisJICAgIGRlc3R2YWwgPSB0bXA7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisJICAgIHUzMiB0bXA7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRtcCA9ICpzcmNyZWc7CisJICAgICpzcmNyZWcgPSAqZGVzdHJlZzsKKwkgICAgKmRlc3RyZWcgPSB0bXA7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisJICAgIHUxNiB0bXA7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRtcCA9ICpzcmNyZWc7CisJICAgICpzcmNyZWcgPSAqZGVzdHJlZzsKKwkgICAgKmRlc3RyZWcgPSB0bXA7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4OAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsICpzcmNyZWcpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9ICpzcmNyZWc7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDg5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpzcmNyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsICpzcmNyZWcpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4YQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gKnNyY3JlZzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OGIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywgKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywgKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OGMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX1JNX1NSKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTE2ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1MTYgZGVzdHZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKnNyY3JlZzsKKwlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSAqc3JjcmVnOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4ZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbGVhX3dvcmRfUl9NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTE2ICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisvKgorICogVE9ETzogTmVlZCB0byBoYW5kbGUgYWRkcmVzcyBzaXplIHByZWZpeCEKKyAqCisgKiBsZWEJZWF4LFtlYXgrZWJ4KjJdID8/CisgKi8KKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEVBXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnNyY3JlZyA9ICh1MTYpZGVzdG9mZnNldDsKKwl9CisgICAgLyogfSBlbHNlIHsgdW5kZWZpbmVkLiAgRG8gbm90aGluZy4gfSAqLworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDhlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9TUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHUxNiAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1MTYgc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gc3JjdmFsOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gKnNyY3JlZzsKKyAgICB9CisgICAgLyoKKyAgICAgKiBDbGVhbiB1cCwgYW5kIHJlc2V0IGFsbCB0aGUgUl94U1AgcG9pbnRlcnMgdG8gdGhlIGNvcnJlY3QKKyAgICAgKiBsb2NhdGlvbnMuICBUaGlzIGlzIGFib3V0IDN4IHRvbyBtdWNoIG92ZXJoZWFkIChkb2luZyBhbGwgdGhlCisgICAgICogc2VncmVnIHB0cnMgd2hlbiBvbmx5IG9uZSBpcyBuZWVkZWQsIGJ1dCB0aGlzIGluc3RydWN0aW9uCisgICAgICogKmNhbm5vdCogYmUgdGhhdCBjb21tb24sIGFuZCB0aGlzIGlzbid0IHRvbyBtdWNoIHdvcmsgYW55d2F5LgorICAgICAqLworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDhmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBPUFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAocmggIT0gMCkgeworCURFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RFIE9GIE9QQ09ERSA4RlxuIik7CisJSEFMVF9TWVMoKTsKKyAgICB9CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IHBvcF9sb25nKCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gcG9wX3dvcmQoKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCS8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHBvcF9sb25nKCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gcG9wX3dvcmQoKTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDkwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9ub3AodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTk9QXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDkxLTB4OTcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3Rlcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHRtcDsKKworICAgIG9wMSAmPSAweDc7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworCisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJdTMyICpyZWczMjsKKwlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsIik7CisJcmVnMzIgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0bXAgPSBNLng4Ni5SX0VBWDsKKwlNLng4Ni5SX0VBWCA9ICpyZWczMjsKKwkqcmVnMzIgPSB0bXA7CisgICAgfSBlbHNlIHsKKwl1MTYgKnJlZzE2OworCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLCIpOworCXJlZzE2ID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJdG1wID0gTS54ODYuUl9BWDsKKwlNLng4Ni5SX0VBWCA9ICpyZWcxNjsKKwkqcmVnMTYgPSAodTE2KXRtcDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2Nidyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJDV0RFXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIkNCV1xuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJaWYgKE0ueDg2LlJfQVggJiAweDgwMDApIHsKKwkgICAgTS54ODYuUl9FQVggfD0gMHhmZmZmMDAwMDsKKwl9IGVsc2UgeworCSAgICBNLng4Ni5SX0VBWCAmPSAweDAwMDBmZmZmOworCX0KKyAgICB9IGVsc2UgeworCWlmIChNLng4Ni5SX0FMICYgMHg4MCkgeworCSAgICBNLng4Ni5SX0FIID0gMHhmZjsKKwl9IGVsc2UgeworCSAgICBNLng4Ni5SX0FIID0gMHgwOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2N3ZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJDRFFcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiQ1dEXG4iKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URigiQ1dEXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCWlmIChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApIHsKKwkgICAgTS54ODYuUl9FRFggPSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJICAgIE0ueDg2LlJfRURYID0gMHgwOworCX0KKyAgICB9IGVsc2UgeworCWlmIChNLng4Ni5SX0FYICYgMHg4MDAwKSB7CisJICAgIE0ueDg2LlJfRFggPSAweGZmZmY7CisJfSBlbHNlIHsKKwkgICAgTS54ODYuUl9EWCA9IDB4MDsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDlhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jYWxsX2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBmYXJzZWcsIGZhcm9mZjsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisJREVDT0RFX1BSSU5URigiQ0FMTFx0Iik7CisJZmFyb2ZmID0gZmV0Y2hfd29yZF9pbW0oKTsKKwlmYXJzZWcgPSBmZXRjaF93b3JkX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIlMDR4OiIsIGZhcnNlZyk7CisJREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGZhcm9mZik7CisJQ0FMTF9UUkFDRShNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsIGZhcnNlZywgZmFyb2ZmLCAiRkFSICIpOworCisgICAgLyogWFhYCisgICAgICoKKyAgICAgKiBIb29rZWQgaW50ZXJydXB0IHZlY3RvcnMgY2FsbGluZyBpbnRvIG91ciAiQklPUyIgd2lsbCBjYXVzZQorICAgICAqIHByb2JsZW1zIHVubGVzcyBhbGwgaW50ZXJzZWdtZW50IHN0dWZmIGlzIGNoZWNrZWQgZm9yIEJJT1MKKyAgICAgKiBhY2Nlc3MuCUNoZWNrIG5lZWRlZCBoZXJlLiAgRm9yIG1vbWVudCwgbGV0IGl0IGFsb25lLgorICAgICAqLworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOworICAgIE0ueDg2LlJfQ1MgPSBmYXJzZWc7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworICAgIE0ueDg2LlJfSVAgPSBmYXJvZmY7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3dhaXQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiV0FJVCIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgLyogTkFEQS4gICovCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hmX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBmbGFnczsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiUFVTSEZEXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlBVU0hGXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKworICAgIC8qIGNsZWFyIG91dCAqYWxsKiBiaXRzIG5vdCByZXByZXNlbnRpbmcgZmxhZ3MsIGFuZCB0dXJuIG9uIHJlYWwgYml0cyAqLworICAgIGZsYWdzID0gKE0ueDg2LlJfRUZMRyAmIEZfTVNLKSB8IEZfQUxXQVlTX09OOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCXB1c2hfbG9uZyhmbGFncyk7CisgICAgfSBlbHNlIHsKKwlwdXNoX3dvcmQoKHUxNilmbGFncyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDlkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BmX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiUE9QRkRcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiUE9QRlxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJTS54ODYuUl9FRkxHID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworCU0ueDg2LlJfRkxHID0gcG9wX3dvcmQoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NhaGYodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0FIRlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAvKiBjbGVhciB0aGUgbG93ZXIgYml0cyBvZiB0aGUgZmxhZyByZWdpc3RlciAqLworICAgIE0ueDg2LlJfRkxHICY9IDB4ZmZmZmZmMDA7CisgICAgLyogb3IgaW4gdGhlIEFIIHJlZ2lzdGVyIGludG8gdGhlIGZsYWdzIHJlZ2lzdGVyICovCisgICAgTS54ODYuUl9GTEcgfD0gTS54ODYuUl9BSDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5ZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbGFoZih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMQUhGXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCU0ueDg2LlJfQUggPSAodTgpKE0ueDg2LlJfRkxHICYgMHhmZik7CisgICAgLyp1bmRvY3VtZW50ZWQgVEMrKyBiZWhhdmlvcj8/PyBOb3BlLiAgSXQncyBkb2N1bWVudGVkLCBidXQKKyAgICAgICB5b3UgaGF2ZSB0b28gbG9vayByZWFsIGhhcmQgdG8gbm90aWNlIGl0LiAqLworICAgIE0ueDg2LlJfQUggfD0gMHgyOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGEwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfQUxfTV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QUwsIik7CisgICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiWyUwNHhdXG4iLCBvZmZzZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShvZmZzZXQpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGExCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfQVhfTV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URjIoIk1PVlx0RUFYLFslMDR4XVxuIiwgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYyKCJNT1ZcdEFYLFslMDR4XVxuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlNLng4Ni5SX0VBWCA9IGZldGNoX2RhdGFfbG9uZyhvZmZzZXQpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9BWCA9IGZldGNoX2RhdGFfd29yZChvZmZzZXQpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X01fQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIlslMDR4XSxBTFxuIiwgb2Zmc2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHN0b3JlX2RhdGFfYnl0ZShvZmZzZXQsIE0ueDg2LlJfQUwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGEzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfTV9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URjIoIk1PVlx0WyUwNHhdLEVBWFxuIiwgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYyKCJNT1ZcdFslMDR4XSxBWFxuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlzdG9yZV9kYXRhX2xvbmcob2Zmc2V0LCBNLng4Ni5SX0VBWCk7CisgICAgfSBlbHNlIHsKKwlzdG9yZV9kYXRhX3dvcmQob2Zmc2V0LCBNLng4Ni5SX0FYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdnNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTgJdmFsOworICAgIHUzMiBjb3VudDsKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZTXHRCWVRFXG4iKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC0xOworICAgIGVsc2UKKwlpbmMgPSAxOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgY291bnQgPSAxOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJY291bnQgPSBNLng4Ni5SX0NYOworCU0ueDg2LlJfQ1ggPSAwOworCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0KKyAgICB3aGlsZSAoY291bnQtLSkgeworCXZhbCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKKwlzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIHZhbCk7CisJTS54ODYuUl9TSSArPSBpbmM7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiB2YWw7CisgICAgaW50IGluYzsKKyAgICB1MzIgY291bnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIk1PVlNcdERXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAgICAvKiBkb3duICovCisJICAgIGluYyA9IC00OworCWVsc2UKKwkgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIk1PVlNcdFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJICAgIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTI7CisJZWxzZQorCSAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGNvdW50ID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCWNvdW50ID0gTS54ODYuUl9DWDsKKwlNLng4Ni5SX0NYID0gMDsKKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9CisgICAgd2hpbGUgKGNvdW50LS0pIHsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdmFsID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOworCSAgICBzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdmFsID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOworCSAgICBzdG9yZV9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksICh1MTYpdmFsKTsKKwl9CisJTS54ODYuUl9TSSArPSBpbmM7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbXBzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHM4IHZhbDEsIHZhbDI7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ01QU1x0QllURVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC0xOworICAgIGVsc2UKKwlpbmMgPSAxOworCisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIFJFUEUJICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICB2YWwxID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOworCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkJICAgICBjbXBfYnl0ZSh2YWwxLCB2YWwyKTsKKwkgICAgTS54ODYuUl9DWCAtPSAxOworCSAgICBNLng4Ni5SX1NJICs9IGluYzsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJICAgIGlmICggKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBFKSAmJiAoQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCkgKSBicmVhazsKKwkgICAgaWYgKCAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSAmJiBBQ0NFU1NfRkxBRyhGX1pGKSApIGJyZWFrOworCX0KKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworCXZhbDEgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7CisJdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJY21wX2J5dGUodmFsMSwgdmFsMik7CisJTS54ODYuUl9TSSArPSBpbmM7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbXBzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiB2YWwxLHZhbDI7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiQ01QU1x0RFdPUkRcbiIpOworCWluYyA9IDQ7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGKCJDTVBTXHRXT1JEXG4iKTsKKwlpbmMgPSAyOworICAgIH0KKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC1pbmM7CisKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBSRVBFCSAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXZhbDEgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7CisJCXZhbDIgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCQljbXBfbG9uZyh2YWwxLCB2YWwyKTsKKwkgICAgfSBlbHNlIHsKKwkJdmFsMSA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKwkJdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJCWNtcF93b3JkKCh1MTYpdmFsMSwgKHUxNil2YWwyKTsKKwkgICAgfQorCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfU0kgKz0gaW5jOworCSAgICBNLng4Ni5SX0RJICs9IGluYzsKKwkgICAgaWYgKCAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUEUpICYmIEFDQ0VTU19GTEFHKEZfWkYpID09IDAgKSBicmVhazsKKwkgICAgaWYgKCAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSAmJiBBQ0NFU1NfRkxBRyhGX1pGKSApIGJyZWFrOworCX0KKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB2YWwxID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOworCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkgICAgY21wX2xvbmcodmFsMSwgdmFsMik7CisJfSBlbHNlIHsKKwkgICAgdmFsMSA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKwkgICAgdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJICAgIGNtcF93b3JkKCh1MTYpdmFsMSwgKHUxNil2YWwyKTsKKwl9CisJTS54ODYuUl9TSSArPSBpbmM7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF90ZXN0X0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiVEVTVFx0QUwsIik7CisgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaW1tKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCXRlc3RfYnl0ZShNLng4Ni5SX0FMLCAodTgpaW1tKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdGVzdF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIlRFU1RcdEVBWCwiKTsKKwlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiVEVTVFx0QVgsIik7CisJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJdGVzdF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOworICAgIH0gZWxzZSB7CisJdGVzdF93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N0b3NfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU1RPU1x0QllURVxuIik7CisgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KKwlpbmMgPSAtMTsKKyAgICBlbHNlCisJaW5jID0gMTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICBzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIE0ueDg2LlJfQUwpOworCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfREkgKz0gaW5jOworCX0KKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BTCk7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGFiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdG9zX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBpbmM7CisgICAgdTMyIGNvdW50OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJTVE9TXHREV09SRFxuIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfREYpKQkgLyogZG93biAqLworCSAgICBpbmMgPSAtNDsKKwllbHNlCisJICAgIGluYyA9IDQ7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGKCJTVE9TXHRXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAvKiBkb3duICovCisJICAgIGluYyA9IC0yOworCWVsc2UKKwkgICAgaW5jID0gMjsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBjb3VudCA9IDE7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwljb3VudCA9IE0ueDg2LlJfQ1g7CisJTS54ODYuUl9DWCA9IDA7CisJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfQorICAgIHdoaWxlIChjb3VudC0tKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9FQVgpOworCX0gZWxzZSB7CisJICAgIHN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BWCk7CisJfQorCU0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbG9kc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT0RTXHRCWVRFXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisJaW5jID0gLTE7CisgICAgZWxzZQorCWluYyA9IDE7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisJICAgIE0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9TSSArPSBpbmM7CisJfQorCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKKwlNLng4Ni5SX1NJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xvZHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGluYzsKKyAgICB1MzIgY291bnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIkxPRFNcdERXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAvKiBkb3duICovCisJICAgIGluYyA9IC00OworCWVsc2UKKwkgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIkxPRFNcdFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTI7CisJZWxzZQorCSAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGNvdW50ID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCWNvdW50ID0gTS54ODYuUl9DWDsKKwlNLng4Ni5SX0NYID0gMDsKKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9CisgICAgd2hpbGUgKGNvdW50LS0pIHsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgTS54ODYuUl9FQVggPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7CisJfSBlbHNlIHsKKwkgICAgTS54ODYuUl9BWCA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKwl9CisJTS54ODYuUl9TSSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGFlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zY2FzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHM4IHZhbDI7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0NBU1x0QllURVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC0xOworICAgIGVsc2UKKwlpbmMgPSAxOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgeworCS8qIFJFUEUJICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkgICAgY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQorCQlicmVhazsKKwl9CisJTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKKyAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgeworCS8qIFJFUE5FICAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKwkgICAgdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJICAgIGNtcF9ieXRlKE0ueDg2LlJfQUwsIHZhbDIpOworCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfREkgKz0gaW5jOworCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCisJCWJyZWFrOwkJLyogemVybyBmbGFnIHNldCBtZWFucyBlcXVhbCAqLworCX0KKwlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBORTsKKyAgICB9IGVsc2UgeworCXZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCWNtcF9ieXRlKE0ueDg2LlJfQUwsIHZhbDIpOworCU0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Nhc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworICAgIHUzMiB2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIlNDQVNcdERXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAvKiBkb3duICovCisJICAgIGluYyA9IC00OworCWVsc2UKKwkgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlNDQVNcdFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTI7CisJZWxzZQorCSAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgeworCS8qIFJFUEUJICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJdmFsID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkJY21wX2xvbmcoTS54ODYuUl9FQVgsIHZhbCk7CisJICAgIH0gZWxzZSB7CisJCXZhbCA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJCWNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpdmFsKTsKKwkgICAgfQorCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfREkgKz0gaW5jOworCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCkKKwkJYnJlYWs7CisJfQorCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUEU7CisgICAgfSBlbHNlIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpIHsKKwkvKiBSRVBORSAgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl2YWwgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCQljbXBfbG9uZyhNLng4Ni5SX0VBWCwgdmFsKTsKKwkgICAgfSBlbHNlIHsKKwkJdmFsID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkJY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNil2YWwpOworCSAgICB9CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKKwkJYnJlYWs7CQkvKiB6ZXJvIGZsYWcgc2V0IG1lYW5zIGVxdWFsICovCisJfQorCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOworICAgIH0gZWxzZSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHZhbCA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJICAgIGNtcF9sb25nKE0ueDg2LlJfRUFYLCB2YWwpOworCX0gZWxzZSB7CisJICAgIHZhbCA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJICAgIGNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpdmFsKTsKKwl9CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGIwIC0gMHhiNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NKHU4IG9wMSkKK3sKKyAgICB1OCBpbW0sICpwdHI7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgcHRyID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIob3AxICYgMHg3KTsKKyAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAqcHRyID0gaW1tOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGI4IC0gMHhiZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgc3JjdmFsOworCisgICAgb3AxICY9IDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzMyOworCXJlZzMyID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIob3AxKTsKKwlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIHNyY3ZhbCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnMzIgPSBzcmN2YWw7CisgICAgfSBlbHNlIHsKKwl1MTYgKnJlZzE2OworCXJlZzE2ID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIHNyY3ZhbCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnMTYgPSAodTE2KXNyY3ZhbDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0MwX2J5dGVfUk1fTUVNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisgICAgdTggYW10OworCisgICAgLyoKKyAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKKyAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAorICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKwkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisJICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCisJICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgaWYgKG1vZCA8IDMpIHsKKwlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwkqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGMxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNDMV93b3JkX1JNX01FTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBhbXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXRfbmVhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFVFx0Iik7CisgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJUkVUVVJOX1RSQUNFKCJSRVQiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfU1AgKz0gaW1tOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGMzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXRfbmVhcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJSRVRcbiIpOworCVJFVFVSTl9UUkFDRSgiUkVUIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbGVzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCByaCwgcmw7CisgICAgdTE2ICpkc3RyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxFU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCU0ueDg2LlJfRVMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgfQorICAgIC8qIGVsc2UgVU5ERUZJTkVEIQkJCSByZWdpc3RlciB0byByZWdpc3RlciAqLworCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xkc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmgsIHJsOworICAgIHUxNiAqZHN0cmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRFNcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwlNLng4Ni5SX0RTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgIH0KKyAgICAvKiBlbHNlIFVOREVGSU5FRCEgKi8KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChyaCAhPSAwKSB7CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBERUNPREUgT0YgT1BDT0RFIGM2XG4iKTsKKwlIQUxUX1NZUygpOworICAgIH0KKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwlMnhcbiIsIGltbSk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgaW1tKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwlERUNPREVfUFJJTlRGMigiLCUyeFxuIiwgaW1tKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gaW1tOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKHJoICE9IDApIHsKKwlERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ERSBPRiBPUENPREUgOEZcbiIpOworCUhBTFRfU1lTKCk7CisgICAgfQorICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBpbW07CisKKwkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGltbSk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGltbTsKKworCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBpbW0pOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQkJdTMyICpkZXN0cmVnOworCQkJdTMyIGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGltbTsKKwl9IGVsc2UgeworCQkJdTE2ICpkZXN0cmVnOworCQkJdTE2IGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGltbTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9lbnRlcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGxvY2FsLGZyYW1lX3BvaW50ZXI7CisgICAgdTgJbmVzdGluZzsKKyAgICBpbnQgaTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgbG9jYWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIG5lc3RpbmcgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCJFTlRFUiAleFxuIiwgbG9jYWwpOworICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIG5lc3RpbmcpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfQlApOworICAgIGZyYW1lX3BvaW50ZXIgPSBNLng4Ni5SX1NQOworICAgIGlmIChuZXN0aW5nID4gMCkgeworCWZvciAoaSA9IDE7IGkgPCBuZXN0aW5nOyBpKyspIHsKKwkgICAgTS54ODYuUl9CUCAtPSAyOworCSAgICBwdXNoX3dvcmQoZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX1NTLCBNLng4Ni5SX0JQKSk7CisJICAgIH0KKwlwdXNoX3dvcmQoZnJhbWVfcG9pbnRlcik7CisJfQorICAgIE0ueDg2LlJfQlAgPSBmcmFtZV9wb2ludGVyOworICAgIE0ueDg2LlJfU1AgPSAodTE2KShNLng4Ni5SX1NQIC0gbG9jYWwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sZWF2ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRUFWRVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX1NQID0gTS54ODYuUl9CUDsKKyAgICBNLng4Ni5SX0JQID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcmV0X2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFVEZcdCIpOworICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworCVJFVFVSTl9UUkFDRSgiUkVURiIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOworCVRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9DUyA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9TUCArPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4Y2IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JldF9mYXIodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUkVURlxuIik7CisJUkVUVVJOX1RSQUNFKCJSRVRGIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKKyAgICBNLng4Ni5SX0NTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW50Myh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IHRtcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5UIDNcbiIpOworICAgIHRtcCA9ICh1MTYpIG1lbV9hY2Nlc3Nfd29yZCgzICogNCArIDIpOworICAgIC8qIGFjY2VzcyB0aGUgc2VnbWVudCByZWdpc3RlciAqLworICAgIFRSQUNFX0FORF9TVEVQKCk7CisJaWYgKF9YODZFTVVfaW50clRhYlszXSkgeworCQkoKl9YODZFTVVfaW50clRhYlszXSkoMyk7CisgICAgfSBlbHNlIHsKKwlwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7CisJQ0xFQVJfRkxBRyhGX0lGKTsKKwlDTEVBUl9GTEFHKEZfVEYpOworCXB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwlNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKDMgKiA0ICsgMik7CisJcHVzaF93b3JkKE0ueDg2LlJfSVApOworCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoMyAqIDQpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW50X0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IHRtcDsKKyAgICB1OCBpbnRudW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklOVFx0Iik7CisgICAgaW50bnVtID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGludG51bSk7CisgICAgdG1wID0gbWVtX2FjY2Vzc193b3JkKGludG51bSAqIDQgKyAyKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCWlmIChfWDg2RU1VX2ludHJUYWJbaW50bnVtXSkgeworCQkoKl9YODZFTVVfaW50clRhYltpbnRudW1dKShpbnRudW0pOworICAgIH0gZWxzZSB7CisJcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOworCUNMRUFSX0ZMQUcoRl9JRik7CisJQ0xFQVJfRkxBRyhGX1RGKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisJTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0ICsgMik7CisJcHVzaF93b3JkKE0ueDg2LlJfSVApOworCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoaW50bnVtICogNCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbnRvKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlRPXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX09GKSkgeworCXRtcCA9IG1lbV9hY2Nlc3Nfd29yZCg0ICogNCArIDIpOworCQlpZiAoX1g4NkVNVV9pbnRyVGFiWzRdKSB7CisJCQkoKl9YODZFTVVfaW50clRhYls0XSkoNCk7CisJfSBlbHNlIHsKKwkgICAgcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOworCSAgICBDTEVBUl9GTEFHKEZfSUYpOworCSAgICBDTEVBUl9GTEFHKEZfVEYpOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisJICAgIE0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoNCAqIDQgKyAyKTsKKwkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworCSAgICBNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKDQgKiA0KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGNmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pcmV0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklSRVRcbiIpOworCisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKworICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfQ1MgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfRkxHID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRDBfYnl0ZV9STV8xKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgaWYgKG1vZCA8IDMpIHsKKwlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsMVxuIik7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiLDFcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIDEpOworCSpkZXN0cmVnID0gZGVzdHZhbDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZDEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0QxX3dvcmRfUk1fMSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIC8qCisgICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCisgICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKKyAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCQl1MzIgZGVzdHZhbDsKKwkJCXUzMiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCAxKTsKKwkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOworCX0gZWxzZSB7CisJCQl1MTYgZGVzdHZhbDsKKwkJCXUxNiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCAxKTsKKwkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZDIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0QyX2J5dGVfUk1fQ0wodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbDsKKyAgICB1OCBhbXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgYW10ID0gTS54ODYuUl9DTDsKKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIixDTFxuIik7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7CisJKmRlc3RyZWcgPSBkZXN0dmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkMworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRDNfd29yZF9STV9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBhbXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgYW10ID0gTS54ODYuUl9DTDsKKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGQ0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hYW0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IGE7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFBTVxuIik7CisgICAgYSA9IGZldGNoX2J5dGVfaW1tKCk7ICAgICAgLyogdGhpcyBpcyBhIHN0dXBpZCBlbmNvZGluZy4gKi8KKyAgICBpZiAoYSAhPSAxMCkgeworCURFQ09ERV9QUklOVEYoIkVSUk9SIERFQ09ESU5HIEFBTVxuIik7CisJVFJBQ0VfUkVHUygpOworCUhBTFRfU1lTKCk7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgLyogbm90ZSB0aGUgdHlwZSBjaGFuZ2UgaGVyZSAtLS0gcmV0dXJuaW5nIEFMIGFuZCBBSCBpbiBBWC4gKi8KKyAgICBNLng4Ni5SX0FYID0gYWFtX3dvcmQoTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZDUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FhZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggYTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUFEXG4iKTsKKyAgICBhID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQVggPSBhYWRfd29yZChNLng4Ni5SX0FYKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qIG9wY29kZSAweGQ2IElMTEVHQUwgT1BDT0RFICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeGxhdCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGFkZHI7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlhMQVRcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisJYWRkciA9ICh1MTYpKE0ueDg2LlJfQlggKyAodTgpTS54ODYuUl9BTCk7CisgICAgTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShhZGRyKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qIGluc3R1Y3Rpb25zCUQ4IC4uIERGIGFyZSBpbiBpODdfb3BzLmMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGUwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sb29wbmUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHMxNiBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTE9PUE5FXHQiKTsKKyAgICBpcCA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpcCArPSAoczE2KSBNLng4Ni5SX0lQOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgaWYgKE0ueDg2LlJfQ1ggIT0gMCAmJiAhQUNDRVNTX0ZMQUcoRl9aRikpCSAgICAvKiBDWCAhPSAwIGFuZCAhWkYgKi8KKwlNLng4Ni5SX0lQID0gaXA7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xvb3BlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzMTYgaXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxPT1BFXHQiKTsKKyAgICBpcCA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpcCArPSAoczE2KSBNLng4Ni5SX0lQOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgaWYgKE0ueDg2LlJfQ1ggIT0gMCAmJiBBQ0NFU1NfRkxBRyhGX1pGKSkJICAgIC8qIENYICE9IDAgYW5kIFpGICovCisJTS54ODYuUl9JUCA9IGlwOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGUyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sb29wKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzMTYgaXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxPT1BcdCIpOworICAgIGlwID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGlwICs9IChzMTYpIE0ueDg2LlJfSVA7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQ1ggLT0gMTsKKyAgICBpZiAoTS54ODYuUl9DWCAhPSAwKQorCU0ueDg2LlJfSVAgPSBpcDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlMworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfamN4eih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IHRhcmdldDsKKyAgICBzOAlvZmZzZXQ7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIG92ZXJmbG93IGZsYWcgaXMgc2V0ICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKQ1haXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgb2Zmc2V0KTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYuUl9DWCA9PSAwKQorCU0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBwb3J0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlx0Iik7CisJcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXgsQUxcbiIsIHBvcnQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9ICgqc3lzX2luYikocG9ydCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBwb3J0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlx0Iik7CisJcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGMigiRUFYLCV4XG4iLCBwb3J0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYyKCJBWCwleFxuIiwgcG9ydCk7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJTS54ODYuUl9FQVggPSAoKnN5c19pbmwpKHBvcnQpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9BWCA9ICgqc3lzX2ludykocG9ydCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGU2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vdXRfYnl0ZV9JTU1fQUwodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IHBvcnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9VVFx0Iik7CisJcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXgsQUxcbiIsIHBvcnQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgKCpzeXNfb3V0YikocG9ydCwgTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dF93b3JkX0lNTV9BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggcG9ydDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiT1VUXHQiKTsKKwlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYyKCIleCxFQVhcbiIsIHBvcnQpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URjIoIiV4LEFYXG4iLCBwb3J0KTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkoKnN5c19vdXRsKShwb3J0LCBNLng4Ni5SX0VBWCk7CisgICAgfSBlbHNlIHsKKwkoKnN5c19vdXR3KShwb3J0LCBNLng4Ni5SX0FYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NhbGxfbmVhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHMxNiBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisJREVDT0RFX1BSSU5URigiQ0FMTFx0Iik7CisJaXAgPSAoczE2KSBmZXRjaF93b3JkX2ltbSgpOworCWlwICs9IChzMTYpIE0ueDg2LlJfSVA7CSAgIC8qIENIRUNLIFNJR04gKi8KKwlERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworCUNBTExfVFJBQ0UoTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCBNLng4Ni5SX0NTLCBpcCwgIiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworICAgIE0ueDg2LlJfSVAgPSBpcDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOworICAgIGlwID0gKHMxNilmZXRjaF93b3JkX2ltbSgpOworICAgIGlwICs9IChzMTYpTS54ODYuUl9JUDsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9ICh1MTYpaXA7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfZmFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGNzLCBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSk1QXHRGQVIgIik7CisgICAgaXAgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIGNzID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eDoiLCBjcyk7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSBpcDsKKyAgICBNLng4Ni5SX0NTID0gY3M7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiB0YXJnZXQ7CisgICAgczggb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyBvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luX2J5dGVfQUxfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5cdEFMLERYXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSAoKnN5c19pbmIpKE0ueDg2LlJfRFgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbl93b3JkX0FYX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIklOXHRFQVgsRFhcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiSU5cdEFYLERYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlNLng4Ni5SX0VBWCA9ICgqc3lzX2lubCkoTS54ODYuUl9EWCk7CisgICAgfSBlbHNlIHsKKwlNLng4Ni5SX0FYID0gKCpzeXNfaW53KShNLng4Ni5SX0RYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dF9ieXRlX0RYX0FMKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9VVFx0RFgsQUxcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgKCpzeXNfb3V0YikoTS54ODYuUl9EWCwgTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dF93b3JkX0RYX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIk9VVFx0RFgsRUFYXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIk9VVFx0RFgsQVhcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSgqc3lzX291dGwpKE0ueDg2LlJfRFgsIE0ueDg2LlJfRUFYKTsKKyAgICB9IGVsc2UgeworCSgqc3lzX291dHcpKE0ueDg2LlJfRFgsIE0ueDg2LlJfQVgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbG9jayh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT0NLOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qb3Bjb2RlIDB4ZjEgSUxMRUdBTCBPUEVSQVRJT04gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGYyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXBuZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJSRVBORVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX1JFUE5FOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGYzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXBlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFUEVcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9SRVBFOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9oYWx0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkhBTFRcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgSEFMVF9TWVMoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY21jKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBjb21wbGVtZW50IHRoZSBjYXJyeSBmbGFnLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ01DXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIFRPR0dMRV9GTEFHKEZfQ0YpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNGNl9ieXRlX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWwsIHNyY3ZhbDsKKworICAgIC8qIGxvbmcsIGRyYXduIG91dCBjb2RlIGZvbGxvd3MuICBEb3VibGUgc3dpdGNoIGZvciBhIHRvdGFsCisgICAgICAgb2YgMzIgY2FzZXMuICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBERUNPREVfUFJJTlRGKG9wRjZfbmFtZXNbcmhdKTsKKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgkJLyogdGVzdCBieXRlIGltbSAqLworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlMDJ4XG4iLCBzcmN2YWwpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X2J5dGUoZGVzdHZhbCwgc3JjdmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7CisJICAgIEhBTFRfU1lTKCk7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IG5vdF9ieXRlKGRlc3R2YWwpOworCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IG5lZ19ieXRlKGRlc3R2YWwpOworCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgbXVsX2J5dGUoZGVzdHZhbCk7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9ieXRlKGRlc3R2YWwpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRpdl9ieXRlKGRlc3R2YWwpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpZGl2X2J5dGUoZGVzdHZhbCk7CisJICAgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiBtb2Q9MTEgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CQkvKiB0ZXN0IGJ5dGUgaW1tICovCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiUwMnhcbiIsIHNyY3ZhbCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRlc3RfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7CisJICAgIEhBTFRfU1lTKCk7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBub3RfYnl0ZSgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBuZWdfYnl0ZSgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgbXVsX2J5dGUoKmRlc3RyZWcpOwkgICAgIC8qISEhICAqLworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGltdWxfYnl0ZSgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGl2X2J5dGUoKmRlc3RyZWcpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpZGl2X2J5dGUoKmRlc3RyZWcpOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNGN193b3JkX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIERFQ09ERV9QUklOVEYob3BGNl9uYW1lc1tyaF0pOworICAgIGlmIChtb2QgPCAzKSB7CisKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWwsIHNyY3ZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSAwOgorCQlERUNPREVfUFJJTlRGKCIsIik7CisJCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisJCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJdGVzdF9sb25nKGRlc3R2YWwsIHNyY3ZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCURFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY3XG4iKTsKKwkJSEFMVF9TWVMoKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IG5vdF9sb25nKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDM6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRlc3R2YWwgPSBuZWdfbG9uZyhkZXN0dmFsKTsKKwkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA0OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQltdWxfbG9uZyhkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNToKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaW11bF9sb25nKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkaXZfbG9uZyhkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaWRpdl9sb25nKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsLCBzcmN2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSAwOgkgICAgLyogdGVzdCB3b3JkIGltbSAqLworCQlERUNPREVfUFJJTlRGKCIsIik7CisJCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisJCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJdGVzdF93b3JkKGRlc3R2YWwsIHNyY3ZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCURFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY3XG4iKTsKKwkJSEFMVF9TWVMoKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IG5vdF93b3JkKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDM6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRlc3R2YWwgPSBuZWdfd29yZChkZXN0dmFsKTsKKwkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA0OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQltdWxfd29yZChkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNToKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaW11bF93b3JkKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkaXZfd29yZChkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaWRpdl93b3JkKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgfQorCX0KKworICAgIH0gZWxzZSB7CQkJIC8qIG1vZD0xMSAqLworCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSAwOgkgICAgLyogdGVzdCB3b3JkIGltbSAqLworCQlERUNPREVfUFJJTlRGKCIsIik7CisJCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisJCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJdGVzdF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSAxOgorCQlERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7CisJCUhBTFRfU1lTKCk7CisJCWJyZWFrOworCSAgICBjYXNlIDI6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCSpkZXN0cmVnID0gbm90X2xvbmcoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSAzOgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IG5lZ19sb25nKCpkZXN0cmVnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNDoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJbXVsX2xvbmcoKmRlc3RyZWcpOwkgLyohISEJKi8KKwkJYnJlYWs7CisJICAgIGNhc2UgNToKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaW11bF9sb25nKCpkZXN0cmVnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGl2X2xvbmcoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpZGl2X2xvbmcoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZzsKKwkgICAgdTE2IHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSAwOgkgICAgLyogdGVzdCB3b3JkIGltbSAqLworCQlERUNPREVfUFJJTlRGKCIsIik7CisJCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisJCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJdGVzdF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSAxOgorCQlERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7CisJCUhBTFRfU1lTKCk7CisJCWJyZWFrOworCSAgICBjYXNlIDI6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCSpkZXN0cmVnID0gbm90X3dvcmQoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSAzOgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IG5lZ193b3JkKCpkZXN0cmVnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNDoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJbXVsX3dvcmQoKmRlc3RyZWcpOwkgLyohISEJKi8KKwkJYnJlYWs7CisJICAgIGNhc2UgNToKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaW11bF93b3JkKCpkZXN0cmVnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGl2X3dvcmQoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpZGl2X3dvcmQoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NsYyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgdGhlIGNhcnJ5IGZsYWcuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTENcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc3RjKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBzZXQgdGhlIGNhcnJ5IGZsYWcuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTVENcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NsaSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkNMSVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBDTEVBUl9GTEFHKEZfSUYpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGZiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdGkodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIC8qIGVuYWJsZSAgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNUSVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBTRVRfRkxBRyhGX0lGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY2xkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBjbGVhciBpbnRlcnJ1cHRzLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ0xEXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIENMRUFSX0ZMQUcoRl9ERik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N0ZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNURFxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBTRVRfRkxBRyhGX0RGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRkVfYnl0ZV9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmgsIHJsOworICAgIHU4IGRlc3R2YWw7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4ICpkZXN0cmVnOworCisgICAgLyogWWV0IGFub3RoZXIgc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJJTkNcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGMigiSUxMRUdBTCBPUCBNQUpPUiBPUCAweEZFIE1JTk9SIE9QICV4IFxuIiwgbW9kKTsKKwkgICAgSEFMVF9TWVMoKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworCVRSQUNFX0FORF9TVEVQKCk7CisJaWYgKHJoID09IDApCisJICBkZXN0dmFsID0gaW5jX2J5dGUoZGVzdHZhbCk7CisJZWxzZQorCSAgZGVzdHZhbCA9IGRlY19ieXRlKGRlc3R2YWwpOworCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICB9IGVsc2UgeworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWlmIChyaCA9PSAwKQorCSAgKmRlc3RyZWcgPSBpbmNfYnl0ZSgqZGVzdHJlZyk7CisJZWxzZQorCSAgKmRlc3RyZWcgPSBkZWNfYnl0ZSgqZGVzdHJlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGZmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNGRl93b3JkX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCByaCwgcmw7CisgICAgdWludCBkZXN0b2Zmc2V0ID0gMDsKKwl1MTYgKmRlc3RyZWc7CisJdTE2IGRlc3R2YWwsZGVzdHZhbDI7CisKKyAgICAvKiBZZXQgYW5vdGhlciBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24uICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQlERUNPREVfUFJJTlRGKCJJTkNcdERXT1JEIFBUUiAiKTsKKwkgICAgfSBlbHNlIHsKKwkJREVDT0RFX1BSSU5URigiSU5DXHRXT1JEIFBUUiAiKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQlERUNPREVfUFJJTlRGKCJERUNcdERXT1JEIFBUUiAiKTsKKwkgICAgfSBlbHNlIHsKKwkJREVDT0RFX1BSSU5URigiREVDXHRXT1JEIFBUUiAiKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIkNBTExcdCAiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJDQUxMXHRGQVIgIik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiSk1QXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJKTVBcdEZBUiAiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ESU5HIE9GIE9QQ09ERSBGRlx0Iik7CisJICAgIEhBTFRfU1lTKCk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoJCS8qIGluYyB3b3JkIHB0ciAuLi4gKi8KKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXUzMiBkZXN0dmFsOworCisJCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRlc3R2YWwgPSBpbmNfbG9uZyhkZXN0dmFsKTsKKwkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCSAgICB9IGVsc2UgeworCQl1MTYgZGVzdHZhbDsKKworCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkZXN0dmFsID0gaW5jX3dvcmQoZGVzdHZhbCk7CisJCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDE6CQkvKiBkZWMgd29yZCBwdHIgLi4uICovCisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl1MzIgZGVzdHZhbDsKKworCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkZXN0dmFsID0gZGVjX2xvbmcoZGVzdHZhbCk7CisJCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkgICAgfSBlbHNlIHsKKwkJdTE2IGRlc3R2YWw7CisKKwkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IGRlY193b3JkKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAyOgkJLyogY2FsbCB3b3JkIHB0ciAuLi4gKi8KKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgkJLyogY2FsbCBmYXIgcHRyIC4uLiAqLworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworCSAgICBicmVhazsKKwljYXNlIDQ6CQkvKiBqbXAgd29yZCBwdHIgLi4uICovCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworCSAgICBicmVhazsKKwljYXNlIDU6CQkvKiBqbXAgZmFyIHB0ciAuLi4gKi8KKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKwkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOworCSAgICBicmVhazsKKwljYXNlIDY6CQkvKiAgcHVzaCB3b3JkIHB0ciAuLi4gKi8KKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXUzMiBkZXN0dmFsOworCisJCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCXB1c2hfbG9uZyhkZXN0dmFsKTsKKwkgICAgfSBlbHNlIHsKKwkJdTE2IGRlc3R2YWw7CisKKwkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJcHVzaF93b3JkKGRlc3R2YWwpOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgeworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl1MzIgKmRlc3RyZWc7CisKKwkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJKmRlc3RyZWcgPSBpbmNfbG9uZygqZGVzdHJlZyk7CisJICAgIH0gZWxzZSB7CisJCXUxNiAqZGVzdHJlZzsKKworCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IGluY193b3JkKCpkZXN0cmVnKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl1MzIgKmRlc3RyZWc7CisKKwkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJKmRlc3RyZWcgPSBkZWNfbG9uZygqZGVzdHJlZyk7CisJICAgIH0gZWxzZSB7CisJCXUxNiAqZGVzdHJlZzsKKworCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IGRlY193b3JkKCpkZXN0cmVnKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDI6CQkvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJICAgIE0ueDg2LlJfSVAgPSAqZGVzdHJlZzsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgkJLyogam1wIGZhciBwdHIgLi4uICovCisJICAgIERFQ09ERV9QUklOVEYoIk9QRVJBVElPTiBVTkRFRklORUQgMFhGRiBcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBIQUxUX1NZUygpOworCSAgICBicmVhazsKKworCWNhc2UgNDoJCS8qIGptcAkuLi4gKi8KKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgTS54ODYuUl9JUCA9ICh1MTYpICgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWNhc2UgNToJCS8qIGptcCBmYXIgcHRyIC4uLiAqLworCSAgICBERUNPREVfUFJJTlRGKCJPUEVSQVRJT04gVU5ERUZJTkVEIDBYRkYgXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgSEFMVF9TWVMoKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJdTMyICpkZXN0cmVnOworCisJCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCXB1c2hfbG9uZygqZGVzdHJlZyk7CisJICAgIH0gZWxzZSB7CisJCXUxNiAqZGVzdHJlZzsKKworCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlwdXNoX3dvcmQoKmRlc3RyZWcpOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaW5nbGUgYnl0ZSBvcGVyYXRpb24gY29kZSB0YWJsZToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKCp4ODZlbXVfb3B0YWJbMjU2XSkodTgpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworLyogIDB4MDAgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MDEgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MDIgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MDMgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MDQgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgwNSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDA2ICovIHg4NmVtdU9wX3B1c2hfRVMsCisvKiAgMHgwNyAqLyB4ODZlbXVPcF9wb3BfRVMsCisKKy8qICAweDA4ICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUk1fUiwKKy8qICAweDA5ICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUk1fUiwKKy8qICAweDBhICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUl9STSwKKy8qICAweDBiICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUl9STSwKKy8qICAweDBjICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfQUxfSU1NLAorLyogIDB4MGQgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9BWF9JTU0sCisvKiAgMHgwZSAqLyB4ODZlbXVPcF9wdXNoX0NTLAorLyogIDB4MGYgKi8geDg2ZW11T3BfdHdvX2J5dGUsCisKKy8qICAweDEwICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUk1fUiwKKy8qICAweDExICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUk1fUiwKKy8qICAweDEyICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUl9STSwKKy8qICAweDEzICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUl9STSwKKy8qICAweDE0ICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfQUxfSU1NLAorLyogIDB4MTUgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9BWF9JTU0sCisvKiAgMHgxNiAqLyB4ODZlbXVPcF9wdXNoX1NTLAorLyogIDB4MTcgKi8geDg2ZW11T3BfcG9wX1NTLAorCisvKiAgMHgxOCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JNX1IsCisvKiAgMHgxOSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JNX1IsCisvKiAgMHgxYSAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JfUk0sCisvKiAgMHgxYiAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JfUk0sCisvKiAgMHgxYyAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSwKKy8qICAweDFkICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfQVhfSU1NLAorLyogIDB4MWUgKi8geDg2ZW11T3BfcHVzaF9EUywKKy8qICAweDFmICovIHg4NmVtdU9wX3BvcF9EUywKKworLyogIDB4MjAgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MjEgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MjIgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MjMgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MjQgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgyNSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDI2ICovIHg4NmVtdU9wX3NlZ292cl9FUywKKy8qICAweDI3ICovIHg4NmVtdU9wX2RhYSwKKworLyogIDB4MjggKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MjkgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MmEgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MmIgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MmMgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgyZCAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDJlICovIHg4NmVtdU9wX3NlZ292cl9DUywKKy8qICAweDJmICovIHg4NmVtdU9wX2RhcywKKworLyogIDB4MzAgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MzEgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MzIgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MzMgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MzQgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgzNSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDM2ICovIHg4NmVtdU9wX3NlZ292cl9TUywKKy8qICAweDM3ICovIHg4NmVtdU9wX2FhYSwKKworLyogIDB4MzggKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MzkgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4M2EgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4M2IgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4M2MgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgzZCAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDNlICovIHg4NmVtdU9wX3NlZ292cl9EUywKKy8qICAweDNmICovIHg4NmVtdU9wX2FhcywKKworLyogIDB4NDAgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDEgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDIgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDMgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDQgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDUgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDYgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDcgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorCisvKiAgMHg0OCAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0OSAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0YSAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0YiAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0YyAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0ZCAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0ZSAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0ZiAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisKKy8qICAweDUwICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisvKiAgMHg1MSAqLyB4ODZlbXVPcF9wdXNoX3JlZ2lzdGVyLAorLyogIDB4NTIgKi8geDg2ZW11T3BfcHVzaF9yZWdpc3RlciwKKy8qICAweDUzICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisvKiAgMHg1NCAqLyB4ODZlbXVPcF9wdXNoX3JlZ2lzdGVyLAorLyogIDB4NTUgKi8geDg2ZW11T3BfcHVzaF9yZWdpc3RlciwKKy8qICAweDU2ICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisvKiAgMHg1NyAqLyB4ODZlbXVPcF9wdXNoX3JlZ2lzdGVyLAorCisvKiAgMHg1OCAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1OSAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1YSAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1YiAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1YyAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1ZCAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1ZSAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1ZiAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisKKy8qICAweDYwICovIHg4NmVtdU9wX3B1c2hfYWxsLAorLyogIDB4NjEgKi8geDg2ZW11T3BfcG9wX2FsbCwKKy8qICAweDYyICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsICAgLyogYm91bmQgKi8KKy8qICAweDYzICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsICAgLyogYXJwbCAqLworLyogIDB4NjQgKi8geDg2ZW11T3Bfc2Vnb3ZyX0ZTLAorLyogIDB4NjUgKi8geDg2ZW11T3Bfc2Vnb3ZyX0dTLAorLyogIDB4NjYgKi8geDg2ZW11T3BfcHJlZml4X2RhdGEsCisvKiAgMHg2NyAqLyB4ODZlbXVPcF9wcmVmaXhfYWRkciwKKworLyogIDB4NjggKi8geDg2ZW11T3BfcHVzaF93b3JkX0lNTSwKKy8qICAweDY5ICovIHg4NmVtdU9wX2ltdWxfd29yZF9JTU0sCisvKiAgMHg2YSAqLyB4ODZlbXVPcF9wdXNoX2J5dGVfSU1NLAorLyogIDB4NmIgKi8geDg2ZW11T3BfaW11bF9ieXRlX0lNTSwKKy8qICAweDZjICovIHg4NmVtdU9wX2luc19ieXRlLAorLyogIDB4NmQgKi8geDg2ZW11T3BfaW5zX3dvcmQsCisvKiAgMHg2ZSAqLyB4ODZlbXVPcF9vdXRzX2J5dGUsCisvKiAgMHg2ZiAqLyB4ODZlbXVPcF9vdXRzX3dvcmQsCisKKy8qICAweDcwICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzEgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3MiAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDczICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzQgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3NSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDc2ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzcgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisKKy8qICAweDc4ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzkgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3YSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDdiICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4N2MgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3ZCAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDdlICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4N2YgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisKKy8qICAweDgwICovIHg4NmVtdU9wX29wYzgwX2J5dGVfUk1fSU1NLAorLyogIDB4ODEgKi8geDg2ZW11T3Bfb3BjODFfd29yZF9STV9JTU0sCisvKiAgMHg4MiAqLyB4ODZlbXVPcF9vcGM4Ml9ieXRlX1JNX0lNTSwKKy8qICAweDgzICovIHg4NmVtdU9wX29wYzgzX3dvcmRfUk1fSU1NLAorLyogIDB4ODQgKi8geDg2ZW11T3BfdGVzdF9ieXRlX1JNX1IsCisvKiAgMHg4NSAqLyB4ODZlbXVPcF90ZXN0X3dvcmRfUk1fUiwKKy8qICAweDg2ICovIHg4NmVtdU9wX3hjaGdfYnl0ZV9STV9SLAorLyogIDB4ODcgKi8geDg2ZW11T3BfeGNoZ193b3JkX1JNX1IsCisKKy8qICAweDg4ICovIHg4NmVtdU9wX21vdl9ieXRlX1JNX1IsCisvKiAgMHg4OSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9SLAorLyogIDB4OGEgKi8geDg2ZW11T3BfbW92X2J5dGVfUl9STSwKKy8qICAweDhiICovIHg4NmVtdU9wX21vdl93b3JkX1JfUk0sCisvKiAgMHg4YyAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9TUiwKKy8qICAweDhkICovIHg4NmVtdU9wX2xlYV93b3JkX1JfTSwKKy8qICAweDhlICovIHg4NmVtdU9wX21vdl93b3JkX1NSX1JNLAorLyogIDB4OGYgKi8geDg2ZW11T3BfcG9wX1JNLAorCisvKiAgMHg5MCAqLyB4ODZlbXVPcF9ub3AsCisvKiAgMHg5MSAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5MiAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5MyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5NCAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5NSAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5NiAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5NyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisKKy8qICAweDk4ICovIHg4NmVtdU9wX2NidywKKy8qICAweDk5ICovIHg4NmVtdU9wX2N3ZCwKKy8qICAweDlhICovIHg4NmVtdU9wX2NhbGxfZmFyX0lNTSwKKy8qICAweDliICovIHg4NmVtdU9wX3dhaXQsCisvKiAgMHg5YyAqLyB4ODZlbXVPcF9wdXNoZl93b3JkLAorLyogIDB4OWQgKi8geDg2ZW11T3BfcG9wZl93b3JkLAorLyogIDB4OWUgKi8geDg2ZW11T3Bfc2FoZiwKKy8qICAweDlmICovIHg4NmVtdU9wX2xhaGYsCisKKy8qICAweGEwICovIHg4NmVtdU9wX21vdl9BTF9NX0lNTSwKKy8qICAweGExICovIHg4NmVtdU9wX21vdl9BWF9NX0lNTSwKKy8qICAweGEyICovIHg4NmVtdU9wX21vdl9NX0FMX0lNTSwKKy8qICAweGEzICovIHg4NmVtdU9wX21vdl9NX0FYX0lNTSwKKy8qICAweGE0ICovIHg4NmVtdU9wX21vdnNfYnl0ZSwKKy8qICAweGE1ICovIHg4NmVtdU9wX21vdnNfd29yZCwKKy8qICAweGE2ICovIHg4NmVtdU9wX2NtcHNfYnl0ZSwKKy8qICAweGE3ICovIHg4NmVtdU9wX2NtcHNfd29yZCwKKy8qICAweGE4ICovIHg4NmVtdU9wX3Rlc3RfQUxfSU1NLAorLyogIDB4YTkgKi8geDg2ZW11T3BfdGVzdF9BWF9JTU0sCisvKiAgMHhhYSAqLyB4ODZlbXVPcF9zdG9zX2J5dGUsCisvKiAgMHhhYiAqLyB4ODZlbXVPcF9zdG9zX3dvcmQsCisvKiAgMHhhYyAqLyB4ODZlbXVPcF9sb2RzX2J5dGUsCisvKiAgMHhhZCAqLyB4ODZlbXVPcF9sb2RzX3dvcmQsCisvKiAgMHhhYyAqLyB4ODZlbXVPcF9zY2FzX2J5dGUsCisvKiAgMHhhZCAqLyB4ODZlbXVPcF9zY2FzX3dvcmQsCisKKy8qICAweGIwICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGIxICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGIyICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGIzICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGI0ICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGI1ICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGI2ICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGI3ICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKworLyogIDB4YjggKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjkgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmEgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmIgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmMgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmQgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmUgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmYgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorCisvKiAgMHhjMCAqLyB4ODZlbXVPcF9vcGNDMF9ieXRlX1JNX01FTSwKKy8qICAweGMxICovIHg4NmVtdU9wX29wY0MxX3dvcmRfUk1fTUVNLAorLyogIDB4YzIgKi8geDg2ZW11T3BfcmV0X25lYXJfSU1NLAorLyogIDB4YzMgKi8geDg2ZW11T3BfcmV0X25lYXIsCisvKiAgMHhjNCAqLyB4ODZlbXVPcF9sZXNfUl9JTU0sCisvKiAgMHhjNSAqLyB4ODZlbXVPcF9sZHNfUl9JTU0sCisvKiAgMHhjNiAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9STV9JTU0sCisvKiAgMHhjNyAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9JTU0sCisvKiAgMHhjOCAqLyB4ODZlbXVPcF9lbnRlciwKKy8qICAweGM5ICovIHg4NmVtdU9wX2xlYXZlLAorLyogIDB4Y2EgKi8geDg2ZW11T3BfcmV0X2Zhcl9JTU0sCisvKiAgMHhjYiAqLyB4ODZlbXVPcF9yZXRfZmFyLAorLyogIDB4Y2MgKi8geDg2ZW11T3BfaW50MywKKy8qICAweGNkICovIHg4NmVtdU9wX2ludF9JTU0sCisvKiAgMHhjZSAqLyB4ODZlbXVPcF9pbnRvLAorLyogIDB4Y2YgKi8geDg2ZW11T3BfaXJldCwKKworLyogIDB4ZDAgKi8geDg2ZW11T3Bfb3BjRDBfYnl0ZV9STV8xLAorLyogIDB4ZDEgKi8geDg2ZW11T3Bfb3BjRDFfd29yZF9STV8xLAorLyogIDB4ZDIgKi8geDg2ZW11T3Bfb3BjRDJfYnl0ZV9STV9DTCwKKy8qICAweGQzICovIHg4NmVtdU9wX29wY0QzX3dvcmRfUk1fQ0wsCisvKiAgMHhkNCAqLyB4ODZlbXVPcF9hYW0sCisvKiAgMHhkNSAqLyB4ODZlbXVPcF9hYWQsCisvKiAgMHhkNiAqLyB4ODZlbXVPcF9pbGxlZ2FsX29wLCAgIC8qIFVuZG9jdW1lbnRlZCBTRVRBTEMgaW5zdHJ1Y3Rpb24gKi8KKy8qICAweGQ3ICovIHg4NmVtdU9wX3hsYXQsCisvKiAgMHhkOCAqLyBOVUxMLCAvKng4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDgsKi8KKy8qICAweGQ5ICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOSwqLworLyogIDB4ZGEgKi8gTlVMTCwgLyp4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RhLCovCisvKiAgMHhkYiAqLyBOVUxMLCAvKng4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGIsKi8KKy8qICAweGRjICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYywqLworLyogIDB4ZGQgKi8gTlVMTCwgLyp4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RkLCovCisvKiAgMHhkZSAqLyBOVUxMLCAvKng4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGUsKi8KKy8qICAweGRmICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZiwqLworCisvKiAgMHhlMCAqLyB4ODZlbXVPcF9sb29wbmUsCisvKiAgMHhlMSAqLyB4ODZlbXVPcF9sb29wZSwKKy8qICAweGUyICovIHg4NmVtdU9wX2xvb3AsCisvKiAgMHhlMyAqLyB4ODZlbXVPcF9qY3h6LAorLyogIDB4ZTQgKi8geDg2ZW11T3BfaW5fYnl0ZV9BTF9JTU0sCisvKiAgMHhlNSAqLyB4ODZlbXVPcF9pbl93b3JkX0FYX0lNTSwKKy8qICAweGU2ICovIHg4NmVtdU9wX291dF9ieXRlX0lNTV9BTCwKKy8qICAweGU3ICovIHg4NmVtdU9wX291dF93b3JkX0lNTV9BWCwKKworLyogIDB4ZTggKi8geDg2ZW11T3BfY2FsbF9uZWFyX0lNTSwKKy8qICAweGU5ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9JTU0sCisvKiAgMHhlYSAqLyB4ODZlbXVPcF9qdW1wX2Zhcl9JTU0sCisvKiAgMHhlYiAqLyB4ODZlbXVPcF9qdW1wX2J5dGVfSU1NLAorLyogIDB4ZWMgKi8geDg2ZW11T3BfaW5fYnl0ZV9BTF9EWCwKKy8qICAweGVkICovIHg4NmVtdU9wX2luX3dvcmRfQVhfRFgsCisvKiAgMHhlZSAqLyB4ODZlbXVPcF9vdXRfYnl0ZV9EWF9BTCwKKy8qICAweGVmICovIHg4NmVtdU9wX291dF93b3JkX0RYX0FYLAorCisvKiAgMHhmMCAqLyB4ODZlbXVPcF9sb2NrLAorLyogIDB4ZjEgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwKKy8qICAweGYyICovIHg4NmVtdU9wX3JlcG5lLAorLyogIDB4ZjMgKi8geDg2ZW11T3BfcmVwZSwKKy8qICAweGY0ICovIHg4NmVtdU9wX2hhbHQsCisvKiAgMHhmNSAqLyB4ODZlbXVPcF9jbWMsCisvKiAgMHhmNiAqLyB4ODZlbXVPcF9vcGNGNl9ieXRlX1JNLAorLyogIDB4ZjcgKi8geDg2ZW11T3Bfb3BjRjdfd29yZF9STSwKKworLyogIDB4ZjggKi8geDg2ZW11T3BfY2xjLAorLyogIDB4ZjkgKi8geDg2ZW11T3Bfc3RjLAorLyogIDB4ZmEgKi8geDg2ZW11T3BfY2xpLAorLyogIDB4ZmIgKi8geDg2ZW11T3Bfc3RpLAorLyogIDB4ZmMgKi8geDg2ZW11T3BfY2xkLAorLyogIDB4ZmQgKi8geDg2ZW11T3Bfc3RkLAorLyogIDB4ZmUgKi8geDg2ZW11T3Bfb3BjRkVfYnl0ZV9STSwKKy8qICAweGZmICovIHg4NmVtdU9wX29wY0ZGX3dvcmRfUk0sCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvb3BzMi5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9vcHMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvb3BzMi5jCkBAIC0wLDAgKzEsMTc3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqICBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorKgorKgkJQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqCQkgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOglBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHRvIGltcGxlbWVudCB0aGUgZGVjb2RpbmcKKyoJCWFuZCBlbXVsYXRpb24gb2YgYWxsIHRoZSB4ODYgZXh0ZW5kZWQgdHdvLWJ5dGUgcHJvY2Vzc29yCisqCQlpbnN0cnVjdGlvbnMuCisqCisqCQlKYXNvbiBwb3J0IHRoaXMgZmlsZSB0byB1LWJvb3QuIFB1dCB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvCisqCQlnb3QyIHNlY3Rvci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvcDEgLSBJbnN0cnVjdGlvbiBvcCBjb2RlCisKK1JFTUFSS1M6CitIYW5kbGVzIGlsbGVnYWwgb3Bjb2Rlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9pbGxlZ2FsX29wKAorICAgIHU4IG9wMikKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERVxuIik7CisgICAgVFJBQ0VfUkVHUygpOworICAgIHByaW50aygiJTA0eDolMDR4OiAlMDJYIElMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERSFcbiIsCisJTS54ODYuUl9DUywgTS54ODYuUl9JUC0yLG9wMik7CisgICAgSEFMVF9TWVMoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworI2RlZmluZSB4b3JsKGEsYikgICAoKGEpICYmICEoYikpIHx8ICghKGEpICYmIChiKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4ODAtMHg4RgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB4ODZlbXVfY2hlY2tfanVtcF9jb25kaXRpb24odTggb3ApCit7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgY2FzZSAweDA6CisJREVDT0RFX1BSSU5URigiSk9cdCIpOworCXJldHVybiBBQ0NFU1NfRkxBRyhGX09GKTsKKyAgICAgIGNhc2UgMHgxOgorCURFQ09ERV9QUklOVEYoIkpOT1x0Iik7CisJcmV0dXJuICFBQ0NFU1NfRkxBRyhGX09GKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHgyOgorCURFQ09ERV9QUklOVEYoIkpCXHQiKTsKKwlyZXR1cm4gQUNDRVNTX0ZMQUcoRl9DRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4MzoKKwlERUNPREVfUFJJTlRGKCJKTkJcdCIpOworCXJldHVybiAhQUNDRVNTX0ZMQUcoRl9DRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4NDoKKwlERUNPREVfUFJJTlRGKCJKWlx0Iik7CisJcmV0dXJuIEFDQ0VTU19GTEFHKEZfWkYpOworCWJyZWFrOworICAgICAgY2FzZSAweDU6CisJREVDT0RFX1BSSU5URigiSk5aXHQiKTsKKwlyZXR1cm4gIUFDQ0VTU19GTEFHKEZfWkYpOworCWJyZWFrOworICAgICAgY2FzZSAweDY6CisJREVDT0RFX1BSSU5URigiSkJFXHQiKTsKKwlyZXR1cm4gQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4NzoKKwlERUNPREVfUFJJTlRGKCJKTkJFXHQiKTsKKwlyZXR1cm4gIShBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4ODoKKwlERUNPREVfUFJJTlRGKCJKU1x0Iik7CisJcmV0dXJuIEFDQ0VTU19GTEFHKEZfU0YpOworCWJyZWFrOworICAgICAgY2FzZSAweDk6CisJREVDT0RFX1BSSU5URigiSk5TXHQiKTsKKwlyZXR1cm4gIUFDQ0VTU19GTEFHKEZfU0YpOworCWJyZWFrOworICAgICAgY2FzZSAweGE6CisJREVDT0RFX1BSSU5URigiSlBcdCIpOworCXJldHVybiBBQ0NFU1NfRkxBRyhGX1BGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHhiOgorCURFQ09ERV9QUklOVEYoIkpOUFx0Iik7CisJcmV0dXJuICFBQ0NFU1NfRkxBRyhGX1BGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHhjOgorCURFQ09ERV9QUklOVEYoIkpMXHQiKTsKKwlyZXR1cm4geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOworCWJyZWFrOworICAgICAgY2FzZSAweGQ6CisJREVDT0RFX1BSSU5URigiSk5MXHQiKTsKKwlyZXR1cm4gIXhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHhlOgorCURFQ09ERV9QUklOVEYoIkpMRVx0Iik7CisJcmV0dXJuICh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKKwkJQUNDRVNTX0ZMQUcoRl9aRikpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlERUNPREVfUFJJTlRGKCJKTkxFXHQiKTsKKwlyZXR1cm4gISh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKKwkJIEFDQ0VTU19GTEFHKEZfWkYpKTsKKyAgICB9Cit9CisKK3ZvaWQgeDg2ZW11T3AyX2xvbmdfanVtcCh1OCBvcDIpCit7CisgICAgczMyIHRhcmdldDsKKyAgICBpbnQgY29uZDsKKworICAgIC8qIGNvbmRpdGlvbmFsIGp1bXAgdG8gd29yZCBvZmZzZXQuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBjb25kID0geDg2ZW11X2NoZWNrX2p1bXBfY29uZGl0aW9uKG9wMiAmIDB4Rik7CisgICAgdGFyZ2V0ID0gKHMxNikgZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB0YXJnZXQgKz0gKHMxNikgTS54ODYuUl9JUDsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChjb25kKQorCU0ueDg2LlJfSVAgPSAodTE2KXRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweDkwLTB4OUYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zZXRfYnl0ZSh1OCBvcDIpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OAkqZGVzdHJlZzsKKyAgICBjaGFyICpuYW1lID0gMDsKKyAgICBpbnQgY29uZCA9IDA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIHN3aXRjaCAob3AyKSB7CisgICAgICBjYXNlIDB4OTA6CisJbmFtZSA9ICJTRVRPXHQiOworCWNvbmQgPQlBQ0NFU1NfRkxBRyhGX09GKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5MToKKwluYW1lID0gIlNFVE5PXHQiOworCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9PRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTI6CisJbmFtZSA9ICJTRVRCXHQiOworCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX0NGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5MzoKKwluYW1lID0gIlNFVE5CXHQiOworCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9DRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTQ6CisJbmFtZSA9ICJTRVRaXHQiOworCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1pGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5NToKKwluYW1lID0gIlNFVE5aXHQiOworCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9aRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTY6CisJbmFtZSA9ICJTRVRCRVx0IjsKKwljb25kID0gQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTc6CisJbmFtZSA9ICJTRVROQkVcdCI7CisJY29uZCA9ICEoQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRikpOworCWJyZWFrOworICAgICAgY2FzZSAweDk4OgorCW5hbWUgPSAiU0VUU1x0IjsKKwljb25kID0gQUNDRVNTX0ZMQUcoRl9TRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTk6CisJbmFtZSA9ICJTRVROU1x0IjsKKwljb25kID0gIUFDQ0VTU19GTEFHKEZfU0YpOworCWJyZWFrOworICAgICAgY2FzZSAweDlhOgorCW5hbWUgPSAiU0VUUFx0IjsKKwljb25kID0gQUNDRVNTX0ZMQUcoRl9QRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWI6CisJbmFtZSA9ICJTRVROUFx0IjsKKwljb25kID0gIUFDQ0VTU19GTEFHKEZfUEYpOworCWJyZWFrOworICAgICAgY2FzZSAweDljOgorCW5hbWUgPSAiU0VUTFx0IjsKKwljb25kID0geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOworCWJyZWFrOworICAgICAgY2FzZSAweDlkOgorCW5hbWUgPSAiU0VUTkxcdCI7CisJY29uZCA9ICF4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWU6CisJbmFtZSA9ICJTRVRMRVx0IjsKKwljb25kID0gKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAorCQlBQ0NFU1NfRkxBRyhGX1pGKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWY6CisJbmFtZSA9ICJTRVROTEVcdCI7CisJY29uZCA9ICEoeG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpIHx8CisJCSBBQ0NFU1NfRkxBRyhGX1pGKSk7CisJYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYobmFtZSk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCVRSQUNFX0FORF9TVEVQKCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGNvbmQgPyAweDAxIDogMHgwMCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSBjb25kID8gMHgwMSA6IDB4MDA7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9wdXNoX0ZTKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEZTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHB1c2hfd29yZChNLng4Ni5SX0ZTKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGExCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfcG9wX0ZTKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RlNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9GUyA9IHBvcF93b3JkKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhMworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2J0X1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBpbnQgYml0LGRpc3A7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJUXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbDsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWw7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywqc2hpZnRyZWc7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmICgweDEgPDwgYml0KSxGX0NGKTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zaGxkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBzaGlmdDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaGxkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaGxkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zaGxkX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTSExEXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBkZXN0dmFsOworCSAgICB1MzIgKnNoaWZ0cmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaGxkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaGxkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3B1c2hfR1ModTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0R1NcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfR1MpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9wb3BfR1ModTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHRHU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0dTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRzX1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBpbnQgYml0LGRpc3A7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJUU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBzcmN2YWwsbWFzazsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLG1hc2s7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkgICAgbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywqc2hpZnRyZWc7CisJICAgIHUzMiBtYXNrOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJICAgICpzcmNyZWcgfD0gbWFzazsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZywqc2hpZnRyZWc7CisJICAgIHUxNiBtYXNrOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBtYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOworCSAgICAqc3JjcmVnIHw9IG1hc2s7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfc2hyZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggc2hpZnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsOworCSAgICB1MTYgKnNoaWZ0cmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCpzaGlmdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc2hyZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc2hyZF93b3JkKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfc2hyZF9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc2hyZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc2hyZF93b3JkKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YWYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9pbXVsX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisJICAgIHUzMiByZXNfbG8scmVzX2hpOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMilzcmN2YWwpOworCSAgICBpZiAocmVzX2hpICE9IDApIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9IGVsc2UgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCSAgICB1MzIgcmVzOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHJlcyA9IChzMTYpKmRlc3RyZWcgKiAoczE2KXNyY3ZhbDsKKwkgICAgaWYgKHJlcyA+IDB4RkZGRikgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisJICAgIHUzMiByZXNfbG8scmVzX2hpOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpkZXN0cmVnLChzMzIpKnNyY3JlZyk7CisJICAgIGlmIChyZXNfaGkgIT0gMCkgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTMyIHJlczsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpKnNyY3JlZzsKKwkgICAgaWYgKHJlcyA+IDB4RkZGRikgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9sc3NfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1MTYgKmRzdHJlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTFNTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJTS54ODYuUl9TUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCS8qIFVOREVGSU5FRCEgKi8KKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGIzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRyX1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBpbnQgYml0LGRpc3A7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJUUlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsLG1hc2s7CisJICAgIHUzMiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCAmIH5tYXNrKTsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLG1hc2s7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7CisJICAgIG1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgJiB+bWFzaykpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywqc2hpZnRyZWc7CisJICAgIHUzMiBtYXNrOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJICAgICpzcmNyZWcgJj0gfm1hc2s7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOworCSAgICB1MTYgbWFzazsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgKnNyY3JlZyAmPSB+bWFzazsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9sZnNfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1MTYgKmRzdHJlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEZTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJTS54ODYuUl9GUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCS8qIFVOREVGSU5FRCEgKi8KKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGI1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfbGdzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCByaCwgcmw7CisgICAgdTE2ICpkc3RyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxHU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCU0ueDg2LlJfR1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwkvKiBVTkRFRklORUQhICovCisJVFJBQ0VfQU5EX1NURVAoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnp4X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZaWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc3JjdmFsOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHU4CSpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKnNyY3JlZzsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHU4CSpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKnNyY3JlZzsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9tb3Z6eF93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1MzIgKmRlc3RyZWc7CisgICAgdTMyIHNyY3ZhbDsKKyAgICB1MTYgKnNyY3JlZzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WWlhcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSAqc3JjcmVnOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRYX0kodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1OCBzaGlmdDsKKyAgICBpbnQgYml0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAocmgpIHsKKyAgICBjYXNlIDQ6CisJREVDT0RFX1BSSU5URigiQlRcdCIpOworCWJyZWFrOworICAgIGNhc2UgNToKKwlERUNPREVfUFJJTlRGKCJCVFNcdCIpOworCWJyZWFrOworICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJCVFJcdCIpOworCWJyZWFrOworICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJCVENcdCIpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFXG4iKTsKKwlUUkFDRV9SRUdTKCk7CisJcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlglMDJYIElMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERSBFWFRFTlNJT04hXG4iLAorCQlNLng4Ni5SX0NTLCBNLng4Ni5SX0lQLTMsb3AyLCAobW9kPDw2KXwocmg8PDMpfHJsKTsKKwlIQUxUX1NZUygpOworICAgIH0KKyAgICBpZiAobW9kIDwgMykgeworCisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgc2hpZnQpOworCVRSQUNFX0FORF9TVEVQKCk7CisKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbCwgbWFzazsKKworCSAgICBiaXQgPSBzaGlmdCAmIDB4MUY7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzd2l0Y2ggKHJoKSB7CisJICAgIGNhc2UgNToKKwkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7CisJCWJyZWFrOworCSAgICBjYXNlIDY6CisJCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsIG1hc2s7CisKKwkgICAgYml0ID0gc2hpZnQgJiAweEY7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzd2l0Y2ggKHJoKSB7CisJICAgIGNhc2UgNToKKwkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7CisJCWJyZWFrOworCSAgICBjYXNlIDY6CisJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZzsKKwkgICAgdTMyIG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gc2hpZnQgJiAweDFGOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgc3dpdGNoIChyaCkgeworCSAgICBjYXNlIDU6CisJCSpzcmNyZWcgfD0gbWFzazsKKwkJYnJlYWs7CisJICAgIGNhc2UgNjoKKwkJKnNyY3JlZyAmPSB+bWFzazsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJKnNyY3JlZyBePSBtYXNrOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZzsKKwkgICAgdTE2IG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gc2hpZnQgJiAweEY7CisJICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOworCSAgICBzd2l0Y2ggKHJoKSB7CisJICAgIGNhc2UgNToKKwkJKnNyY3JlZyB8PSBtYXNrOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQkqc3JjcmVnICY9IH5tYXNrOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQkqc3JjcmVnIF49IG1hc2s7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2J0Y19SKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgaW50IGJpdCxkaXNwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJCVENcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbCxtYXNrOworCSAgICB1MzIgKnNoaWZ0cmVnOworCisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgXiBtYXNrKTsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLG1hc2s7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7CisJICAgIG1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgXiBtYXNrKSk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKKwkgICAgdTMyIG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgKnNyY3JlZyBePSBtYXNrOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKKwkgICAgdTE2IG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7CisJICAgIG1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJICAgICpzcmNyZWcgXj0gbWFzazsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YmMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9ic2YodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQlNGXG4iKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKKworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKKwkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9CisgICAgfSBlbHNlIHsJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywgKmRzdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCisJCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnLCAqZHN0cmVnOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKKwkJaWYgKCgqc3JjcmVnID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnNyKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJTRlxuIik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOworCisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQorCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpzcmNyZWcsICpkc3RyZWc7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQorCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZywgKmRzdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnN4X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZTWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSAoczMyKSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSAoczE2KSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnOworCSAgICB1OAkqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IChzMzIpKChzOCkqc3JjcmVnKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHU4CSpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKHMxNikoKHM4KSpzcmNyZWcpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnN4X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHUzMiAqZGVzdHJlZzsKKyAgICB1MzIgc3JjdmFsOworICAgIHUxNiAqc3JjcmVnOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZTWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJc3JjdmFsID0gKHMzMikoKHMxNilmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KSk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gc3JjdmFsOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9IChzMzIpKChzMTYpKnNyY3JlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRG91YmxlIGJ5dGUgb3BlcmF0aW9uIGNvZGUgdGFibGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICgqeDg2ZW11X29wdGFiMlsyNTZdKSh1OCkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmdvdDIiKSkpID0KK3sKKy8qICAweDAwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogR3JvdXAgRiAocmluZyAwIFBNKSAgICAgICovCisvKiAgMHgwMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIEdyb3VwIEcgKHJpbmcgMCBQTSkgICAgICAqLworLyogIDB4MDIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsYXIgKHJpbmcgMCBQTSkJICAgICAgICovCisvKiAgMHgwMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxzbCAocmluZyAwIFBNKQkgICAgICAgKi8KKy8qICAweDA0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MDUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsb2FkYWxsICh1bmRvY3VtZW50ZWQpICAgKi8KKy8qICAweDA2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogY2x0cyAocmluZyAwIFBNKQkgICAgICAgKi8KKy8qICAweDA3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbG9hZGFsbCAodW5kb2N1bWVudGVkKSAgICovCisvKiAgMHgwOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGludmQgKHJpbmcgMCBQTSkJICAgICAgICovCisvKiAgMHgwOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIHdiaW52ZCAocmluZyAwIFBNKSAgICAgICAqLworLyogIDB4MGEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDBjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MGQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDBmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHgxMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDExICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDE0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDE3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDFhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MWIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDFkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4MjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsY3JlZyAocmluZyAwIFBNKSAqLworLyogIDB4MjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsZHJlZyAocmluZyAwIFBNKSAqLworLyogIDB4MjIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgY3JlZyxyZWczMiAocmluZyAwIFBNKSAqLworLyogIDB4MjMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgZHJlZyxyZWczMiAocmluZyAwIFBNKSAqLworLyogIDB4MjQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsdHJlZyAocmluZyAwIFBNKSAqLworLyogIDB4MjUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiB0cmVnLHJlZzMyIChyaW5nIDAgUE0pICovCisvKiAgMHgyNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDI4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDJiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MmMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDJlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MmYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDMwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDMzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDM2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDM5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4M2EgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDNjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4M2QgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDNmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHg0MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQ0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQ3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDRhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NGIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDRkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NGUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4NTAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDUyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDU1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDU4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDViICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NWMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDVlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NWYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDYwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDYzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDY2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDY5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NmEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDZjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NmQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDZmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHg3MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDcxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDc0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDc3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDdhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4N2IgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDdkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4N2UgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4ODAgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDgxICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4MiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODMgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDg0ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4NSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODYgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDg3ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4OCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODkgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDhhICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4YiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4OGMgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDhkICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4ZSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4OGYgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKworLyogIDB4OTAgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTEgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTIgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTMgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTQgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTUgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTYgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTcgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTggKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTkgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWEgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWIgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWMgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWQgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWUgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWYgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorCisvKiAgMHhhMCAqLyB4ODZlbXVPcDJfcHVzaF9GUywKKy8qICAweGExICovIHg4NmVtdU9wMl9wb3BfRlMsCisvKiAgMHhhMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGEzICovIHg4NmVtdU9wMl9idF9SLAorLyogIDB4YTQgKi8geDg2ZW11T3AyX3NobGRfSU1NLAorLyogIDB4YTUgKi8geDg2ZW11T3AyX3NobGRfQ0wsCisvKiAgMHhhNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGE3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YTggKi8geDg2ZW11T3AyX3B1c2hfR1MsCisvKiAgMHhhOSAqLyB4ODZlbXVPcDJfcG9wX0dTLAorLyogIDB4YWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhhYiAqLyB4ODZlbXVPcDJfYnRfUiwKKy8qICAweGFjICovIHg4NmVtdU9wMl9zaHJkX0lNTSwKKy8qICAweGFkICovIHg4NmVtdU9wMl9zaHJkX0NMLAorLyogIDB4YWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhhZiAqLyB4ODZlbXVPcDJfaW11bF9SX1JNLAorCisvKiAgMHhiMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGNtcHhjaGcgKi8KKy8qICAweGIxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogY21weGNoZyAqLworLyogIDB4YjIgKi8geDg2ZW11T3AyX2xzc19SX0lNTSwKKy8qICAweGIzICovIHg4NmVtdU9wMl9idHJfUiwKKy8qICAweGI0ICovIHg4NmVtdU9wMl9sZnNfUl9JTU0sCisvKiAgMHhiNSAqLyB4ODZlbXVPcDJfbGdzX1JfSU1NLAorLyogIDB4YjYgKi8geDg2ZW11T3AyX21vdnp4X2J5dGVfUl9STSwKKy8qICAweGI3ICovIHg4NmVtdU9wMl9tb3Z6eF93b3JkX1JfUk0sCisvKiAgMHhiOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGI5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YmEgKi8geDg2ZW11T3AyX2J0WF9JLAorLyogIDB4YmIgKi8geDg2ZW11T3AyX2J0Y19SLAorLyogIDB4YmMgKi8geDg2ZW11T3AyX2JzZiwKKy8qICAweGJkICovIHg4NmVtdU9wMl9ic3IsCisvKiAgMHhiZSAqLyB4ODZlbXVPcDJfbW92c3hfYnl0ZV9SX1JNLAorLyogIDB4YmYgKi8geDg2ZW11T3AyX21vdnN4X3dvcmRfUl9STSwKKworLyogIDB4YzAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiB4YWRkICovCisvKiAgMHhjMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IHhhZGQgKi8KKy8qICAweGMyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YzMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhjNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGM1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YzYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhjNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGM4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGM5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKworLyogIDB4ZDAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQ1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQ4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGRiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZGMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGRlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZGYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweGUwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGUzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGU2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGU5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGVjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZWQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGVmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHhmMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGYxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGY0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGY3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGZhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZmIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGZkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZmUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9wcmltX29wcy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9wcmltX29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTUyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L3ByaW1fb3BzLmMKQEAgLTAsMCArMSwyNDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyoJCSAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLglUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gaW1wbGVtZW50IHRoZSBwcmltaXRpdmUKKyoJCW1hY2hpbmUgb3BlcmF0aW9ucyB1c2VkIGJ5IHRoZSBlbXVsYXRpb24gY29kZSBpbiBvcHMuYworKgorKiBDYXJyeSBDaGFpbiBDYWxjdWxhdGlvbgorKgorKiBUaGlzIHJlcHJlc2VudHMgYSBzb21ld2hhdCBleHBlbnNpdmUgY2FsY3VsYXRpb24gd2hpY2ggaXMKKyogYXBwYXJlbnRseSByZXF1aXJlZCB0byBlbXVsYXRlIHRoZSBzZXR0aW5nIG9mIHRoZSBPRjM0MzM2NCBhbmQgQUYgZmxhZy4KKyogVGhlIGxhdHRlciBpcyBub3Qgc28gaW1wb3J0YW50LCBidXQgdGhlIGZvcm1lciBpcy4gIFRoZSBvdmVyZmxvdworKiBmbGFnIGlzIHRoZSBYT1Igb2YgdGhlIHRvcCB0d28gYml0cyBvZiB0aGUgY2FycnkgY2hhaW4gZm9yIGFuCisqIGFkZGl0aW9uIChzaW1pbGFyIGZvciBzdWJ0cmFjdGlvbikuICBTaW5jZSB3ZSBkbyBub3Qgd2FudCB0bworKiBzaW11bGF0ZSB0aGUgYWRkaXRpb24gaW4gYSBiaXR3aXNlIG1hbm5lciwgd2UgdHJ5IHRvIGNhbGN1bGF0ZSB0aGUKKyogY2FycnkgY2hhaW4gZ2l2ZW4gdGhlIHR3byBvcGVyYW5kcyBhbmQgdGhlIHJlc3VsdC4KKyoKKyogU28sIGdpdmVuIHRoZSBmb2xsb3dpbmcgdGFibGUsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGFkZGl0aW9uIG9mIHR3bworKiBiaXRzLCB3ZSBjYW4gZGVyaXZlIGEgZm9ybXVsYSBmb3IgdGhlIGNhcnJ5IGNoYWluLgorKgorKiBhICAgYgkgIGNpbglyICAgICBjb3V0CisqIDAgICAwCSAgMAkwICAgICAwCisqIDAgICAwCSAgMQkxICAgICAwCisqIDAgICAxCSAgMAkxICAgICAwCisqIDAgICAxCSAgMQkwICAgICAxCisqIDEgICAwCSAgMAkxICAgICAwCisqIDEgICAwCSAgMQkwICAgICAxCisqIDEgICAxCSAgMAkwICAgICAxCisqIDEgICAxCSAgMQkxICAgICAxCisqCisqIENvbnN0cnVjdGlvbiBvZiB0YWJsZSBmb3IgY291dDoKKyoKKyogYWIKKyogciAgXAkwMCAgIDAxCSAgMTEgIDEwCisqIHwtLS0tLS0tLS0tLS0tLS0tLS0KKyogMCAgfAkgMCAgICAxCSAgIDEgICAxCisqIDEgIHwJIDAgICAgMAkgICAxICAgMAorKgorKiBCeSBpbnNwZWN0aW9uLCBvbmUgZ2V0czogIGNjID0gYWIgKyAgcicoYSArIGIpCisqCisqIFRoYXQgcmVwcmVzZW50cyBhbG90IG9mIG9wZXJhdGlvbnMsIGJ1dCBOTyBDSE9JQ0UuLi4uCisqCisqIEJvcnJvdyBDaGFpbiBDYWxjdWxhdGlvbi4KKyoKKyogVGhlIGZvbGxvd2luZyB0YWJsZSByZXByZXNlbnRzIHRoZSBzdWJ0cmFjdGlvbiBvZiB0d28gYml0cywgZnJvbQorKiB3aGljaCB3ZSBjYW4gZGVyaXZlIGEgZm9ybXVsYSBmb3IgdGhlIGJvcnJvdyBjaGFpbi4KKyoKKyogYSAgIGIJICBiaW4JciAgICAgYm91dAorKiAwICAgMAkgIDAJMCAgICAgMAorKiAwICAgMAkgIDEJMSAgICAgMQorKiAwICAgMQkgIDAJMSAgICAgMQorKiAwICAgMQkgIDEJMCAgICAgMQorKiAxICAgMAkgIDAJMSAgICAgMAorKiAxICAgMAkgIDEJMCAgICAgMAorKiAxICAgMQkgIDAJMCAgICAgMAorKiAxICAgMQkgIDEJMSAgICAgMQorKgorKiBDb25zdHJ1Y3Rpb24gb2YgdGFibGUgZm9yIGNvdXQ6CisqCisqIGFiCisqIHIgIFwJMDAgICAwMQkgIDExICAxMAorKiB8LS0tLS0tLS0tLS0tLS0tLS0tCisqIDAgIHwJIDAgICAgMQkgICAwICAgMAorKiAxICB8CSAxICAgIDEJICAgMSAgIDAKKyoKKyogQnkgaW5zcGVjdGlvbiwgb25lIGdldHM6ICBiYyA9IGEnYiArCXIoYScgKyBiKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQUklNX09QU19OT19SRURFRklORV9BU00KKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiB4ODZlbXVfcGFyaXR5X3RhYls4XSA9Cit7CisgICAgMHg5NjY5Njk5NiwKKyAgICAweDY5OTY5NjY5LAorICAgIDB4Njk5Njk2NjksCisgICAgMHg5NjY5Njk5NiwKKyAgICAweDY5OTY5NjY5LAorICAgIDB4OTY2OTY5OTYsCisgICAgMHg5NjY5Njk5NiwKKyAgICAweDY5OTY5NjY5LAorfTsKKworI2RlZmluZSBQQVJJVFkoeCkgICAoKCh4ODZlbXVfcGFyaXR5X3RhYlsoeCkgLyAzMl0gPj4gKCh4KSAlIDMyKSkgJiAxKSA9PSAwKQorI2RlZmluZSBYT1IyKHgpCSAgICAoKCh4KSBeICgoeCk+PjEpKSAmIDB4MSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgYWJzKGludCB2KQoreworCXJldHVybiAodj4wKT92Oi12OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tIFNpZGUgZWZmZWN0cyBoZWxwZXIgZnVuY3Rpb25zIC0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK2ltcGxlbWVudHMgc2lkZSBlZmVjdHMgZm9yIGJ5dGUgb3BlcmF0aW9ucyB0aGF0IGRvbid0IG92ZXJmbG93CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzZXRfcGFyaXR5X2ZsYWcodTMyIHJlcykKK3sKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhGRiksIEZfUEYpOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3pwX2ZsYWdzXzgodTggcmVzKQoreworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKyAgICBzZXRfcGFyaXR5X2ZsYWcocmVzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3N6cF9mbGFnc18xNih1MTYgcmVzKQoreworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhyZXMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3pwX2ZsYWdzXzMyKHUzMiByZXMpCit7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhyZXMpOworfQorCitzdGF0aWMgdm9pZCBub19jYXJyeV9ieXRlX3NpZGVfZWZmKHU4IHJlcykKK3sKKyAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgQ0xFQVJfRkxBRyhGX0FGKTsKKyAgICBzZXRfc3pwX2ZsYWdzXzgocmVzKTsKK30KKworc3RhdGljIHZvaWQgbm9fY2Fycnlfd29yZF9zaWRlX2VmZih1MTYgcmVzKQoreworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfQUYpOworICAgIHNldF9zenBfZmxhZ3NfMTYocmVzKTsKK30KKworc3RhdGljIHZvaWQgbm9fY2FycnlfbG9uZ19zaWRlX2VmZih1MzIgcmVzKQoreworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfQUYpOworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKK30KKworc3RhdGljIHZvaWQgY2FsY19jYXJyeV9jaGFpbihpbnQgYml0cywgdTMyIGQsIHUzMiBzLCB1MzIgcmVzLCBpbnQgc2V0X2NhcnJ5KQoreworICAgIHUzMiBjYzsKKworICAgIGNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IChiaXRzIC0gMikpLCBGX09GKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7CisgICAgaWYgKHNldF9jYXJyeSkgeworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmICgxIDw8IGJpdHMpLCBGX0NGKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfYm9ycm93X2NoYWluKGludCBiaXRzLCB1MzIgZCwgdTMyIHMsIHUzMiByZXMsIGludCBzZXRfY2FycnkpCit7CisgICAgdTMyIGJjOworCisgICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAoYml0cyAtIDIpKSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIGlmIChzZXRfY2FycnkpIHsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmICgxIDw8IChiaXRzIC0gMSkpLCBGX0NGKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUFBIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGFhYV93b3JkKHUxNiBkKQoreworICAgIHUxNiByZXM7CisgICAgaWYgKChkICYgMHhmKSA+IDB4OSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgeworCWQgKz0gMHg2OworCWQgKz0gMHgxMDA7CisJU0VUX0ZMQUcoRl9BRik7CisJU0VUX0ZMQUcoRl9DRik7CisgICAgfSBlbHNlIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9BRik7CisgICAgfQorICAgIHJlcyA9ICh1MTYpKGQgJiAweEZGMEYpOworICAgIHNldF9zenBfZmxhZ3NfMTYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFBQSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhYXNfd29yZCh1MTYgZCkKK3sKKyAgICB1MTYgcmVzOworICAgIGlmICgoZCAmIDB4ZikgPiAweDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKKwlkIC09IDB4NjsKKwlkIC09IDB4MTAwOworCVNFVF9GTEFHKEZfQUYpOworCVNFVF9GTEFHKEZfQ0YpOworICAgIH0gZWxzZSB7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfQUYpOworICAgIH0KKyAgICByZXMgPSAodTE2KShkICYgMHhGRjBGKTsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBQUQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWFkX3dvcmQodTE2IGQpCit7CisgICAgdTE2IGw7CisgICAgdTggaGIsIGxiOworCisgICAgaGIgPSAodTgpKChkID4+IDgpICYgMHhmZik7CisgICAgbGIgPSAodTgpKChkICYgMHhmZikpOworICAgIGwgPSAodTE2KSgobGIgKyAxMCAqIGhiKSAmIDB4RkYpOworCisgICAgbm9fY2FycnlfYnl0ZV9zaWRlX2VmZihsICYgMHhGRik7CisgICAgcmV0dXJuIGw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUFNIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGFhbV93b3JkKHU4IGQpCit7CisgICAgdTE2IGgsIGw7CisKKyAgICBoID0gKHUxNikoZCAvIDEwKTsKKyAgICBsID0gKHUxNikoZCAlIDEwKTsKKyAgICBsIHw9ICh1MTYpKGggPDwgOCk7CisKKyAgICBub19jYXJyeV9ieXRlX3NpZGVfZWZmKGwgJiAweEZGKTsKKyAgICByZXR1cm4gbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBhZGNfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgczsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHJlcysrOworCisgICAgc2V0X3N6cF9mbGFnc184KHJlcyk7CisgICAgY2FsY19jYXJyeV9jaGFpbig4LHMsZCxyZXMsMSk7CisKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWRjX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgczsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJcmVzKys7CisKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDE2LHMsZCxyZXMsMSk7CisKKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQURDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGFkY19sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgbG87ICAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworICAgIHUzMiBoaTsKKyAgICB1MzIgcmVzOworCisgICAgbG8gPSAoZCAmIDB4RkZGRikgKyAocyAmIDB4RkZGRik7CisgICAgcmVzID0gZCArIHM7CisKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsKKwlsbysrOworCXJlcysrOworICAgIH0KKworICAgIGhpID0gKGxvID4+IDE2KSArIChkID4+IDE2KSArIChzID4+IDE2KTsKKworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDMyLHMsZCxyZXMsMCk7CisKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhoaSAmIDB4MTAwMDAsIEZfQ0YpOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBhZGRfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgczsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgY2FsY19jYXJyeV9jaGFpbig4LHMsZCxyZXMsMSk7CisKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWRkX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgczsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDE2LHMsZCxyZXMsMSk7CisKKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUREIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGFkZF9sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgcmVzOworCisgICAgcmVzID0gZCArIHM7CisgICAgc2V0X3N6cF9mbGFnc18zMihyZXMpOworICAgIGNhbGNfY2FycnlfY2hhaW4oMzIscyxkLHJlcywwKTsKKworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA8IGQgfHwgcmVzIDwgcywgRl9DRik7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFORCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGFuZF9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgJiBzOworCisgICAgbm9fY2FycnlfYnl0ZV9zaWRlX2VmZihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQU5EIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGFuZF93b3JkKHUxNiBkLCB1MTYgcykKK3sKKyAgICB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAmIHM7CisKKyAgICBub19jYXJyeV93b3JkX3NpZGVfZWZmKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBTkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgYW5kX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICYgczsKKyAgICBub19jYXJyeV9sb25nX3NpZGVfZWZmKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBDTVAgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBjbXBfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oOCwgZCwgcywgcmVzLCAxKTsKKworICAgIHJldHVybiBkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIENNUCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBjbXBfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgLSBzOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDE2LCBkLCBzLCByZXMsIDEpOworCisgICAgcmV0dXJuIGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQ01QIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGNtcF9sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAtIHM7CisgICAgc2V0X3N6cF9mbGFnc18zMihyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDMyLCBkLCBzLCByZXMsIDEpOworCisgICAgcmV0dXJuIGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgREFBIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZGFhX2J5dGUodTggZCkKK3sKKyAgICB1MzIgcmVzID0gZDsKKyAgICBpZiAoKGQgJiAweGYpID4gOSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgeworCXJlcyArPSA2OworCVNFVF9GTEFHKEZfQUYpOworICAgIH0KKyAgICBpZiAocmVzID4gMHg5RiB8fCBBQ0NFU1NfRkxBRyhGX0NGKSkgeworCXJlcyArPSAweDYwOworCVNFVF9GTEFHKEZfQ0YpOworICAgIH0KKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgREFTIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZGFzX2J5dGUodTggZCkKK3sKKyAgICBpZiAoKGQgJiAweGYpID4gOSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgeworCWQgLT0gNjsKKwlTRVRfRkxBRyhGX0FGKTsKKyAgICB9CisgICAgaWYgKGQgPiAweDlGIHx8IEFDQ0VTU19GTEFHKEZfQ0YpKSB7CisJZCAtPSAweDYwOworCVNFVF9GTEFHKEZfQ0YpOworICAgIH0KKyAgICBzZXRfc3pwX2ZsYWdzXzgoZCk7CisgICAgcmV0dXJuIGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgREVDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZGVjX2J5dGUodTggZCkKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAtIDE7CisgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDgsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBERUMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgZGVjX3dvcmQodTE2IGQpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgLSAxOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDE2LCBkLCAxLCByZXMsIDApOworCisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERFQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBkZWNfbG9uZyh1MzIgZCkKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAtIDE7CisKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oMzIsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElOQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGluY19ieXRlKHU4IGQpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyAxOworICAgIHNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDgsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTkMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgaW5jX3dvcmQodTE2IGQpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyAxOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfY2FycnlfY2hhaW4oMTYsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU5DIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGluY19sb25nKHUzMiBkKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgMTsKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgY2FsY19jYXJyeV9jaGFpbigzMiwgZCwgMSwgcmVzLCAwKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBvcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgfCBzOworICAgIG5vX2NhcnJ5X2J5dGVfc2lkZV9lZmYocmVzKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgb3Jfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTE2IHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgfCBzOworICAgIG5vX2NhcnJ5X3dvcmRfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIG9yX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkIHwgczsKKyAgICBub19jYXJyeV9sb25nX3NpZGVfZWZmKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IG5lZ19ieXRlKHU4IHMpCit7CisgICAgdTggcmVzOworCisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocyAhPSAwLCBGX0NGKTsKKyAgICByZXMgPSAodTgpLXM7CisgICAgc2V0X3N6cF9mbGFnc184KHJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oOCwgMCwgcywgcmVzLCAwKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgbmVnX3dvcmQodTE2IHMpCit7CisgICAgdTE2IHJlczsKKworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHMgIT0gMCwgRl9DRik7CisgICAgcmVzID0gKHUxNiktczsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKyAgICBjYWxjX2JvcnJvd19jaGFpbigxNiwgMCwgcywgcmVzLCAwKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgbmVnX2xvbmcodTMyIHMpCit7CisgICAgdTMyIHJlczsKKworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHMgIT0gMCwgRl9DRik7CisgICAgcmVzID0gKHUzMiktczsKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oMzIsIDAsIHMsIHJlcywgMCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IG5vdF9ieXRlKHU4IHMpCit7CisgICAgcmV0dXJuIH5zOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBub3Rfd29yZCh1MTYgcykKK3sKKyAgICByZXR1cm4gfnM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTk9UIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIG5vdF9sb25nKHUzMiBzKQoreworICAgIHJldHVybiB+czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBSQ0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCByY2xfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzaywgY2Y7CisKKyAgICAvKiBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4gKi8KKyAgICAvKiBoYXZlCisKKyAgICAgICBDRiAgQl83IEJfNiBCXzUgQl80IEJfMyBCXzIgQl8xIEJfMAorCisgICAgICAgd2FudCB0byByb3RhdGUgdGhyb3VnaCB0aGUgY2FycnkgYnkgInMiIGJpdHMuICBXZSBjb3VsZAorICAgICAgIGxvb3AsIGJ1dCB0aGF0J3MgaW5lZmZpY2llbnQuICBTbyB0aGUgd2lkdGggaXMgOSwKKyAgICAgICBhbmQgd2Ugc3BsaXQgaW50byB0aHJlZSBwYXJ0czoKKworICAgICAgIFRoZSBuZXcgY2FycnkgZmxhZyAgICh3YXMgQl9uKQorICAgICAgIHRoZSBzdHVmZiBpbiBCX24tMSAuLiBCXzAKKyAgICAgICB0aGUgc3R1ZmYgaW4gQl83IC4uIEJfbisxCisKKyAgICAgICBUaGUgbmV3IHJvdGF0ZSBpcyBkb25lIG1vZCA5LCBhbmQgZ2l2ZW4gdGhpcywKKyAgICAgICBmb3IgYSByb3RhdGlvbiBvZiBuIGJpdHMgKG1vZCA5KSB0aGUgbmV3IGNhcnJ5IGZsYWcgaXMKKyAgICAgICB0aGVuIGxvY2F0ZWQgbiBiaXRzIGZyb20gdGhlIE1TQi4gIFRoZSBsb3cgcGFydCBpcworICAgICAgIHRoZW4gc2hpZnRlZCB1cCBjbnQgYml0cywgYW5kIHRoZSBoaWdoIHBhcnQgaXMgb3InZAorICAgICAgIGluLiAgVXNpbmcgQ0FQUyBmb3IgbmV3IHZhbHVlcywgYW5kIGxvd2VyY2FzZSBmb3IgdGhlCisgICAgICAgb3JpZ2luYWwgdmFsdWVzLCB0aGlzIGNhbiBiZSBleHByZXNzZWQgYXM6CisKKyAgICAgICBJRiBuID4gMAorICAgICAgIDEpIENGIDwtCSBiXyg4LW4pCisgICAgICAgMikgQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXzAKKyAgICAgICAzKSBCXyhuLTEpIDwtIGNmCisgICAgICAgNCkgQl8obi0yKSAuLiBCXzAgPC0gIGJfNyAuLiBiXyg4LShuLTEpKQorICAgICAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgOSkgIT0gMCkgeworCS8qIGV4dHJhY3QgdGhlIG5ldyBDQVJSWSBGTEFHLiAqLworCS8qIENGIDwtICBiXyg4LW4pCSAgICAgICovCisJY2YgPSAoZCA+PiAoOCAtIGNudCkpICYgMHgxOworCisJLyogZ2V0IHRoZSBsb3cgc3R1ZmYgd2hpY2ggcm90YXRlZAorCSAgIGludG8gdGhlIHJhbmdlIEJfNyAuLiBCX2NudCAqLworCS8qIEJfKDcpIC4uIEJfKG4pICA8LSAgYl8oOC0obisxKSkgLi4gYl8wICAqLworCS8qIG5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBzaWRlIGRvbmUgYnkgdGhlIG1hc2sgKi8KKwlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZjsKKworCS8qIG5vdyB0aGUgaGlnaCBzdHVmZiB3aGljaCByb3RhdGVkIGFyb3VuZAorCSAgIGludG8gdGhlIHBvc2l0aW9ucyBCX2NudC0yIC4uIEJfMCAqLworCS8qIEJfKG4tMikgLi4gQl8wIDwtICBiXzcgLi4gYl8oOC0obi0xKSkgKi8KKwkvKiBzaGlmdCBpdCBkb3dud2FyZCwgNy0obi0yKSA9IDktbiBwb3NpdGlvbnMuCisJICAgYW5kIG1hc2sgb2ZmIHRoZSByZXN1bHQgYmVmb3JlIG9yJ2luZyBpbi4KKwkgKi8KKwltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7CisJcmVzIHw9IChkID4+ICg5IC0gY250KSkgJiBtYXNrOworCisJLyogaWYgdGhlIGNhcnJ5IGZsYWcgd2FzIHNldCwgb3IgaXQgaW4uCSAqLworCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeyAgICAgLyogY2FycnkgZmxhZyBpcyBzZXQgKi8KKwkgICAgLyoJQl8obi0xKSA8LSBjZiAqLworCSAgICByZXMgfD0gMSA8PCAoY250IC0gMSk7CisJfQorCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIGJhc2VkIG9uIHRoZSB2YXJpYWJsZSAiY2YiICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCS8qIE9WRVJGTE9XIGlzIHNldCAqSUZGKiBjbnQ9PTEsIHRoZW4gaXQgaXMgdGhlCisJICAgeG9yIG9mIENGIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBCbGVjY2suICovCisJLyogcGFyZW50aGVzaXplZCB0aGlzIGV4cHJlc3Npb24gc2luY2UgaXQgYXBwZWFycyB0bworCSAgIGJlIGNhdXNpbmcgT0YgdG8gYmUgbWlzc2V0ICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDYpICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworCisgICAgfQorICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiByY2xfd29yZCh1MTYgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2ssIGNmOworCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSAxNykgIT0gMCkgeworCWNmID0gKGQgPj4gKDE2IC0gY250KSkgJiAweDE7CisJcmVzID0gKGQgPDwgY250KSAmIDB4ZmZmZjsKKwltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7CisJcmVzIHw9IChkID4+ICgxNyAtIGNudCkpICYgbWFzazsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsKKwkgICAgcmVzIHw9IDEgPDwgKGNudCAtIDEpOworCX0KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDE0KSAmIDB4MikpLAorCQkJICAgICBGX09GKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByY2xfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQsIG1hc2ssIGNmOworCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSAzMykgIT0gMCkgeworCWNmID0gKGQgPj4gKDMyIC0gY250KSkgJiAweDE7CisJcmVzID0gKGQgPDwgY250KSAmIDB4ZmZmZmZmZmY7CisJbWFzayA9ICgxIDw8IChjbnQgLSAxKSkgLSAxOworCXJlcyB8PSAoZCA+PiAoMzMgLSBjbnQpKSAmIG1hc2s7CisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLworCSAgICByZXMgfD0gMSA8PCAoY250IC0gMSk7CisJfQorCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjbnQgPT0gMSAmJiBYT1IyKGNmICsgKChyZXMgPj4gMzApICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJjcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlcywgY250OworICAgIHUzMiBtYXNrLCBjZiwgb2NmID0gMDsKKworICAgIC8qIHJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5ICovCisgICAgLyoKKyAgICAgICBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4KKyAgICAgICBkIGlzIHRoZSBieXRlIG9iamVjdCByb3RhdGVkLgorCisgICAgICAgaGF2ZQorCisgICAgICAgQ0YgIEJfNyBCXzYgQl81IEJfNCBCXzMgQl8yIEJfMSBCXzAKKworICAgICAgIFRoZSBuZXcgcm90YXRlIGlzIGRvbmUgbW9kIDksIGFuZCBnaXZlbiB0aGlzLAorICAgICAgIGZvciBhIHJvdGF0aW9uIG9mIG4gYml0cyAobW9kIDkpIHRoZSBuZXcgY2FycnkgZmxhZyBpcworICAgICAgIHRoZW4gbG9jYXRlZCBuIGJpdHMgZnJvbSB0aGUgTFNCLiAgVGhlIGxvdyBwYXJ0IGlzCisgICAgICAgdGhlbiBzaGlmdGVkIHVwIGNudCBiaXRzLCBhbmQgdGhlIGhpZ2ggcGFydCBpcyBvcidkCisgICAgICAgaW4uICBVc2luZyBDQVBTIGZvciBuZXcgdmFsdWVzLCBhbmQgbG93ZXJjYXNlIGZvciB0aGUKKyAgICAgICBvcmlnaW5hbCB2YWx1ZXMsIHRoaXMgY2FuIGJlIGV4cHJlc3NlZCBhczoKKworICAgICAgIElGIG4gPiAwCisgICAgICAgMSkgQ0YgPC0JIGJfKG4tMSkKKyAgICAgICAyKSBCXyg4LShuKzEpKSAuLiBCXygwKQk8LSAgYl8oNykgLi4gYl8obikKKyAgICAgICAzKSBCXyg4LW4pIDwtIGNmCisgICAgICAgNCkgQl8oNykgLi4gQl8oOC0obi0xKSkgPC0gIGJfKG4tMikgLi4gYl8oMCkKKyAgICAgKi8KKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDkpICE9IDApIHsKKwkvKiBleHRyYWN0IHRoZSBuZXcgQ0FSUlkgRkxBRy4gKi8KKwkvKiBDRiA8LSAgYl8obi0xKQkgICAgICAgKi8KKwlpZiAoY250ID09IDEpIHsKKwkgICAgY2YgPSBkICYgMHgxOworCSAgICAvKiBub3RlIGhhY2tlcnkgaGVyZS4gIEFjY2Vzc19mbGFnKC4uKSBldmFsdWF0ZXMgdG8gZWl0aGVyCisJICAgICAgIDAgaWYgZmxhZyBub3Qgc2V0CisJICAgICAgIG5vbi16ZXJvIGlmIGZsYWcgaXMgc2V0LgorCSAgICAgICBkb2luZyBhY2Nlc3NfZmxhZyguLikgIT0gMCBjYXN0cyB0aGF0IGludG8gZWl0aGVyCisJICAgICAgIDAuLjEgaW4gYW55IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmbGFncyByZWdpc3RlcgorCSAgICAgICAoaS5lLiBwYWNrZWQgYml0IGFycmF5IG9yIHVucGFja2VkLikKKwkgICAgICovCisJICAgIG9jZiA9IEFDQ0VTU19GTEFHKEZfQ0YpICE9IDA7CisJfSBlbHNlCisJICAgIGNmID0gKGQgPj4gKGNudCAtIDEpKSAmIDB4MTsKKworCS8qIEJfKDgtKG4rMSkpIC4uIEJfKDApCSA8LSAgYl8oNykgLi4gYl9uICAqLworCS8qIG5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBzaWRlIGRvbmUgYnkgdGhlIG1hc2sKKwkgICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGRvbmUgYnkgc2hpZnRpbmcgdGhlCisJICAgb2JqZWN0IHRvIHRoZSByaWdodC4JIFRoZSByZXN1bHQgbXVzdCBiZSBtYXNrZWQsCisJICAgaW4gY2FzZSB0aGUgb2JqZWN0IGNhbWUgaW4gYW5kIHdhcyB0cmVhdGVkCisJICAgYXMgYSBuZWdhdGl2ZSBudW1iZXIuICBOZWVkZWQ/Pz8gKi8KKworCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKKwlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKworCS8qIG5vdyB0aGUgaGlnaCBzdHVmZiB3aGljaCByb3RhdGVkIGFyb3VuZAorCSAgIGludG8gdGhlIHBvc2l0aW9ucyBCX2NudC0yIC4uIEJfMCAqLworCS8qIEJfKDcpIC4uIEJfKDgtKG4tMSkpIDwtICBiXyhuLTIpIC4uIGJfKDApICovCisJLyogc2hpZnQgaXQgZG93bndhcmQsIDctKG4tMikgPSA5LW4gcG9zaXRpb25zLgorCSAgIGFuZCBtYXNrIG9mZiB0aGUgcmVzdWx0IGJlZm9yZSBvcidpbmcgaW4uCisJICovCisJcmVzIHw9IChkIDw8ICg5IC0gY250KSk7CisKKwkvKiBpZiB0aGUgY2FycnkgZmxhZyB3YXMgc2V0LCBvciBpdCBpbi4JICovCisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLworCSAgICAvKglCXyg4LW4pIDwtIGNmICovCisJICAgIHJlcyB8PSAxIDw8ICg4IC0gY250KTsKKwl9CisJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgYmFzZWQgb24gdGhlIHZhcmlhYmxlICJjZiIgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIGNudD09MSwgdGhlbiBpdCBpcyB0aGUKKwkgICB4b3Igb2YgQ0YgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIEJsZWNjay4gKi8KKwkvKiBwYXJlbnRoZXNpemVkLi4uICovCisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIob2NmICsgKChkID4+IDYpICYgMHgyKSksCisJCQkJIEZfT0YpOworCX0KKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUkNSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHJjcl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHUzMiByZXMsIGNudDsKKyAgICB1MzIgbWFzaywgY2YsIG9jZiA9IDA7CisKKyAgICAvKiByb3RhdGUgcmlnaHQgdGhyb3VnaCBjYXJyeSAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgMTcpICE9IDApIHsKKwlpZiAoY250ID09IDEpIHsKKwkgICAgY2YgPSBkICYgMHgxOworCSAgICBvY2YgPSBBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwOworCX0gZWxzZQorCSAgICBjZiA9IChkID4+IChjbnQgLSAxKSkgJiAweDE7CisJbWFzayA9ICgxIDw8ICgxNiAtIGNudCkpIC0gMTsKKwlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKwlyZXMgfD0gKGQgPDwgKDE3IC0gY250KSk7CisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7CisJICAgIHJlcyB8PSAxIDw8ICgxNiAtIGNudCk7CisJfQorCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihvY2YgKyAoKGQgPj4gMTQpICYgMHgyKSksCisJCQkJIEZfT0YpOworCX0KKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByY3JfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQ7CisgICAgdTMyIG1hc2ssIGNmLCBvY2YgPSAwOworCisgICAgLyogcm90YXRlIHJpZ2h0IHRocm91Z2ggY2FycnkgKi8KKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDMzKSAhPSAwKSB7CisJaWYgKGNudCA9PSAxKSB7CisJICAgIGNmID0gZCAmIDB4MTsKKwkgICAgb2NmID0gQUNDRVNTX0ZMQUcoRl9DRikgIT0gMDsKKwl9IGVsc2UKKwkgICAgY2YgPSAoZCA+PiAoY250IC0gMSkpICYgMHgxOworCW1hc2sgPSAoMSA8PCAoMzIgLSBjbnQpKSAtIDE7CisJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7CisJaWYgKGNudCAhPSAxKQorCSAgICByZXMgfD0gKGQgPDwgKDMzIC0gY250KSk7CisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLworCSAgICByZXMgfD0gMSA8PCAoMzIgLSBjbnQpOworCX0KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIob2NmICsgKChkID4+IDMwKSAmIDB4MikpLAorCQkJCSBGX09GKTsKKwl9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9MIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcm9sX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7CisKKyAgICAvKiByb3RhdGUgbGVmdCAqLworICAgIC8qCisgICAgICAgcyBpcyB0aGUgcm90YXRlIGRpc3RhbmNlLiAgSXQgdmFyaWVzIGZyb20gMCAtIDguCisgICAgICAgZCBpcyB0aGUgYnl0ZSBvYmplY3Qgcm90YXRlZC4KKworICAgICAgIGhhdmUKKworICAgICAgIENGICBCXzcgLi4uIEJfMAorCisgICAgICAgVGhlIG5ldyByb3RhdGUgaXMgZG9uZSBtb2QgOC4KKyAgICAgICBNdWNoIHNpbXBsZXIgdGhhbiB0aGUgInJjbCIgb3IgInJjciIgb3BlcmF0aW9ucy4KKworICAgICAgIElGIG4gPiAwCisgICAgICAgMSkgQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXygwKQorICAgICAgIDIpIEJfKG4tMSkgLi4gQl8oMCkgPC0gIGJfKDcpIC4uIGJfKDgtbikKKyAgICAgKi8KKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDgpICE9IDApIHsKKwkvKiBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfKDApICovCisJcmVzID0gKGQgPDwgY250KTsKKworCS8qIEJfKG4tMSkgLi4gQl8oMCkgPC0JYl8oNykgLi4gYl8oOC1uKSAqLworCW1hc2sgPSAoMSA8PCBjbnQpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKDggLSBjbnQpKSAmIG1hc2s7CisKKwkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhCQkJCSAgICAgICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKKwkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogcz09MSwgdGhlbiBpdCBpcyB0aGUKKwkgICB4b3Igb2YgQ0YgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIEJsZWNjay4gKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKKwkJCSAgICAgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDYpICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworICAgIH0gaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworICAgIH0KKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBST0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgcm9sX3dvcmQodTE2IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOworCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSAxNikgIT0gMCkgeworCXJlcyA9IChkIDw8IGNudCk7CisJbWFzayA9ICgxIDw8IGNudCkgLSAxOworCXJlcyB8PSAoZCA+PiAoMTYgLSBjbnQpKSAmIG1hc2s7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKKwkJCSAgICAgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDE0KSAmIDB4MikpLAorCQkJICAgICBGX09GKTsKKyAgICB9IGlmIChzICE9IDApIHsKKwkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhCQkJCSAgICAgICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJPTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByb2xfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQsIG1hc2s7CisKKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDMyKSAhPSAwKSB7CisJcmVzID0gKGQgPDwgY250KTsKKwltYXNrID0gKDEgPDwgY250KSAtIDE7CisJcmVzIHw9IChkID4+ICgzMiAtIGNudCkpICYgbWFzazsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJgorCQkJICAgICBYT1IyKChyZXMgJiAweDEpICsgKChyZXMgPj4gMzApICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworICAgIH0gaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJvcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOworCisgICAgLyogcm90YXRlIHJpZ2h0ICovCisgICAgLyoKKyAgICAgICBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4KKyAgICAgICBkIGlzIHRoZSBieXRlIG9iamVjdCByb3RhdGVkLgorCisgICAgICAgaGF2ZQorCisgICAgICAgQl83IC4uLiBCXzAKKworICAgICAgIFRoZSByb3RhdGUgaXMgZG9uZSBtb2QgOC4KKworICAgICAgIElGIG4gPiAwCisgICAgICAgMSkgQl8oOC0obisxKSkgLi4gQl8oMCkJPC0gIGJfKDcpIC4uIGJfKG4pCisgICAgICAgMikgQl8oNykgLi4gQl8oOC1uKSA8LSAgYl8obi0xKSAuLiBiXygwKQorICAgICAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgOCkgIT0gMCkgewkJLyogbm90IGEgdHlwbywgZG8gbmFkYSBpZiBjbnQ9PTAgKi8KKwkvKiBCXyg3KSAuLiBCXyg4LW4pIDwtCWJfKG4tMSkgLi4gYl8oMCkgKi8KKwlyZXMgPSAoZCA8PCAoOCAtIGNudCkpOworCisJLyogQl8oOC0obisxKSkgLi4gQl8oMCkJIDwtICBiXyg3KSAuLiBiXyhuKSAqLworCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKGNudCkpICYgbWFzazsKKworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX0NGKTsKKwkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogcz09MSwgdGhlbiBpdCBpcyB0aGUKKwkgICB4b3Igb2YgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMuICBCbGVjY2suICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDYpLCBGX09GKTsKKyAgICB9IGVsc2UgaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX0NGKTsKKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHJvcl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKKworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgMTYpICE9IDApIHsKKwlyZXMgPSAoZCA8PCAoMTYgLSBjbnQpKTsKKwltYXNrID0gKDEgPDwgKDE2IC0gY250KSkgLSAxOworCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDE0KSwgRl9PRik7CisgICAgfSBlbHNlIGlmIChzICE9IDApIHsKKwkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhCQkJCSAgICAgICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX0NGKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByb3JfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQsIG1hc2s7CisKKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDMyKSAhPSAwKSB7CisJcmVzID0gKGQgPDwgKDMyIC0gY250KSk7CisJbWFzayA9ICgxIDw8ICgzMiAtIGNudCkpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKGNudCkpICYgbWFzazsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYgWE9SMihyZXMgPj4gMzApLCBGX09GKTsKKyAgICB9IGVsc2UgaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSEwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBzaGxfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDgpIHsKKwljbnQgPSBzICUgODsKKworCS8qIGxhc3QgYml0IHNoaWZ0ZWQgb3V0IGdvZXMgaW50byBjYXJyeSBmbGFnICovCisJaWYgKGNudCA+IDApIHsKKwkgICAgcmVzID0gZCA8PCBjbnQ7CisJICAgIGNmID0gZCAmICgxIDw8ICg4IC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9ICh1OCkgZDsKKwl9CisKKwlpZiAoY250ID09IDEpIHsKKwkgICAgLyogTmVlZHMgc2ltcGxpZmljYXRpb24uICovCisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKAorCQkJCSAgICAoKChyZXMgJiAweDgwKSA9PSAweDgwKSBeCisJCQkJICAgICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLAorCSAgICAvKiB3YXMgKE0ueDg2LlJfRkxHJkZfQ0YpPT1GX0NGKSksICovCisJCQkJICAgIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNITCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzaGxfd29yZCh1MTYgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisgICAgaWYgKHMgPCAxNikgeworCWNudCA9IHMgJSAxNjsKKwlpZiAoY250ID4gMCkgeworCSAgICByZXMgPSBkIDw8IGNudDsKKwkgICAgY2YgPSBkICYgKDEgPDwgKDE2IC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gKHUxNikgZDsKKwl9CisKKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoCisJCQkJICAgICgoKHJlcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSBeCisJCQkJICAgICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLAorCQkJCSAgICBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSEwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2hsX2xvbmcodTMyIGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMzIpIHsKKwljbnQgPSBzICUgMzI7CisJaWYgKGNudCA+IDApIHsKKwkgICAgcmVzID0gZCA8PCBjbnQ7CisJICAgIGNmID0gZCAmICgxIDw8ICgzMiAtIGNudCkpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMzIoKHUzMilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoKChyZXMgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKSBeCisJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwMDAwMCwgRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCVNFVF9GTEFHKEZfUEYpOworCVNFVF9GTEFHKEZfWkYpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNIUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHNocl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgOCkgeworCWNudCA9IHMgJSA4OworCWlmIChjbnQgPiAwKSB7CisJICAgIGNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJICAgIHJlcyA9IGQgPj4gY250OworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSAodTgpIGQ7CisJfQorCisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDYpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPj4gKHMtMSkpICYgMHgxLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNIUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzaHJfd29yZCh1MTYgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisgICAgaWYgKHMgPCAxNikgeworCWNudCA9IHMgJSAxNjsKKwlpZiAoY250ID4gMCkgeworCSAgICBjZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworCSAgICByZXMgPSBkID4+IGNudDsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCSAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSBkOworCX0KKworCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAxNCksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJU0VUX0ZMQUcoRl9aRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlDTEVBUl9GTEFHKEZfUEYpOworICAgIH0KKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNocl9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDMyKSB7CisJY250ID0gcyAlIDMyOworCWlmIChjbnQgPiAwKSB7CisJICAgIGNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJICAgIHJlcyA9IGQgPj4gY250OworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMzIoKHUzMilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAzMCksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJU0VUX0ZMQUcoRl9aRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlDTEVBUl9GTEFHKEZfUEYpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNBUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHNhcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZiwgbWFzaywgc2Y7CisKKyAgICByZXMgPSBkOworICAgIHNmID0gZCAmIDB4ODA7CisgICAgY250ID0gcyAlIDg7CisgICAgaWYgKGNudCA+IDAgJiYgY250IDwgOCkgeworCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKKwljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlpZiAoc2YpIHsKKwkgICAgcmVzIHw9IH5tYXNrOworCX0KKwlzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgfSBlbHNlIGlmIChjbnQgPj0gOCkgeworCWlmIChzZikgeworCSAgICByZXMgPSAweGZmOworCSAgICBTRVRfRkxBRyhGX0NGKTsKKwkgICAgQ0xFQVJfRkxBRyhGX1pGKTsKKwkgICAgU0VUX0ZMQUcoRl9TRik7CisJICAgIFNFVF9GTEFHKEZfUEYpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IDA7CisJICAgIENMRUFSX0ZMQUcoRl9DRik7CisJICAgIFNFVF9GTEFHKEZfWkYpOworCSAgICBDTEVBUl9GTEFHKEZfU0YpOworCSAgICBDTEVBUl9GTEFHKEZfUEYpOworCX0KKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHNhcl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOworCisgICAgc2YgPSBkICYgMHg4MDAwOworICAgIGNudCA9IHMgJSAxNjsKKyAgICByZXMgPSBkOworICAgIGlmIChjbnQgPiAwICYmIGNudCA8IDE2KSB7CisJbWFzayA9ICgxIDw8ICgxNiAtIGNudCkpIC0gMTsKKwljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlpZiAoc2YpIHsKKwkgICAgcmVzIHw9IH5tYXNrOworCX0KKwlzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKyAgICB9IGVsc2UgaWYgKGNudCA+PSAxNikgeworCWlmIChzZikgeworCSAgICByZXMgPSAweGZmZmY7CisJICAgIFNFVF9GTEFHKEZfQ0YpOworCSAgICBDTEVBUl9GTEFHKEZfWkYpOworCSAgICBTRVRfRkxBRyhGX1NGKTsKKwkgICAgU0VUX0ZMQUcoRl9QRik7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gMDsKKwkgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKwkgICAgU0VUX0ZMQUcoRl9aRik7CisJICAgIENMRUFSX0ZMQUcoRl9TRik7CisJICAgIENMRUFSX0ZMQUcoRl9QRik7CisJfQorICAgIH0KKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNhcl9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHUzMiBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOworCisgICAgc2YgPSBkICYgMHg4MDAwMDAwMDsKKyAgICBjbnQgPSBzICUgMzI7CisgICAgcmVzID0gZDsKKyAgICBpZiAoY250ID4gMCAmJiBjbnQgPCAzMikgeworCW1hc2sgPSAoMSA8PCAoMzIgLSBjbnQpKSAtIDE7CisJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJaWYgKHNmKSB7CisJICAgIHJlcyB8PSB+bWFzazsKKwl9CisJc2V0X3N6cF9mbGFnc18zMihyZXMpOworICAgIH0gZWxzZSBpZiAoY250ID49IDMyKSB7CisJaWYgKHNmKSB7CisJICAgIHJlcyA9IDB4ZmZmZmZmZmY7CisJICAgIFNFVF9GTEFHKEZfQ0YpOworCSAgICBDTEVBUl9GTEFHKEZfWkYpOworCSAgICBTRVRfRkxBRyhGX1NGKTsKKwkgICAgU0VUX0ZMQUcoRl9QRik7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gMDsKKwkgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKwkgICAgU0VUX0ZMQUcoRl9aRik7CisJICAgIENMRUFSX0ZMQUcoRl9TRik7CisJICAgIENMRUFSX0ZMQUcoRl9QRik7CisJfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNITEQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2hsZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMTYpIHsKKwljbnQgPSBzICUgMTY7CisJaWYgKGNudCA+IDApIHsKKwkgICAgcmVzID0gKGQgPDwgY250KSB8IChmaWxsID4+ICgxNi1jbnQpKTsKKwkgICAgY2YgPSBkICYgKDEgPDwgKDE2IC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gZDsKKwl9CisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCgoKHJlcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSBeCisJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSExEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDMyKSB7CisJY250ID0gcyAlIDMyOworCWlmIChjbnQgPiAwKSB7CisJICAgIHJlcyA9IChkIDw8IGNudCkgfCAoZmlsbCA+PiAoMzItY250KSk7CisJICAgIGNmID0gZCAmICgxIDw8ICgzMiAtIGNudCkpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMzIoKHUzMilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoKChyZXMgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKSBeCisJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwMDAwMCwgRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCVNFVF9GTEFHKEZfUEYpOworCVNFVF9GTEFHKEZfWkYpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNIUkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2hyZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMTYpIHsKKwljbnQgPSBzICUgMTY7CisJaWYgKGNudCA+IDApIHsKKwkgICAgY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkgICAgcmVzID0gKGQgPj4gY250KSB8IChmaWxsIDw8ICgxNiAtIGNudCkpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDE0KSwgRl9PRik7CisJfSBlbHNlIHsKKwkgICAgQ0xFQVJfRkxBRyhGX09GKTsKKwl9CisgICAgfSBlbHNlIHsKKwlyZXMgPSAwOworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlTRVRfRkxBRyhGX1pGKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCUNMRUFSX0ZMQUcoRl9QRik7CisgICAgfQorICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSFJEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNocmRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDMyKSB7CisJY250ID0gcyAlIDMyOworCWlmIChjbnQgPiAwKSB7CisJICAgIGNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJICAgIHJlcyA9IChkID4+IGNudCkgfCAoZmlsbCA8PCAoMzIgLSBjbnQpKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCSAgICBzZXRfc3pwX2ZsYWdzXzMyKCh1MzIpcmVzKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSBkOworCX0KKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gMzApLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCVNFVF9GTEFHKEZfWkYpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJQ0xFQVJfRkxBRyhGX1BGKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBzYmJfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgdTMyIGJjOworCisgICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorCXJlcyA9IGQgLSBzIC0gMTsKKyAgICBlbHNlCisJcmVzID0gZCAtIHM7CisgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKyAgICBiYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAsIEZfQ0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2JiX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgdTMyIGJjOworCisgICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorCXJlcyA9IGQgLSBzIC0gMTsKKyAgICBlbHNlCisJcmVzID0gZCAtIHM7CisgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwLCBGX0NGKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2JiX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgdTMyIGJjOworCisgICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorCXJlcyA9IGQgLSBzIC0gMTsKKyAgICBlbHNlCisJcmVzID0gZCAtIHM7CisKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwMDAwMCwgRl9DRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHN1Yl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MCwgRl9DRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzdWJfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisgICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAsIEZfQ0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMTQpLCBGX09GKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBzdWJfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwMDAwMCwgRl9DRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFRFU1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRlc3RfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICYgczsKKworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworICAgIC8qIEFGID09IGRvbnQgY2FyZSAqLworICAgIENMRUFSX0ZMQUcoRl9DRik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGVzdF93b3JkKHUxNiBkLCB1MTYgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAmIHM7CisKKyAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIC8qIEFGID09IGRvbnQgY2FyZSAqLworICAgIENMRUFSX0ZMQUcoRl9DRik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGVzdF9sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAmIHM7CisKKyAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKyAgICAvKiBBRiA9PSBkb250IGNhcmUgKi8KKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHhvcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgXiBzOworICAgIG5vX2NhcnJ5X2J5dGVfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiB4b3Jfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTE2IHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgXiBzOworICAgIG5vX2NhcnJ5X3dvcmRfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB4b3JfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgXiBzOworICAgIG5vX2NhcnJ5X2xvbmdfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGltdWxfYnl0ZSh1OCBzKQoreworICAgIHMxNiByZXMgPSAoczE2KSgoczgpTS54ODYuUl9BTCAqIChzOClzKTsKKworICAgIE0ueDg2LlJfQVggPSByZXM7CisgICAgaWYgKCgoTS54ODYuUl9BTCAmIDB4ODApID09IDAgJiYgTS54ODYuUl9BSCA9PSAweDAwKSB8fAorCSgoTS54ODYuUl9BTCAmIDB4ODApICE9IDAgJiYgTS54ODYuUl9BSCA9PSAweEZGKSkgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICB9IGVsc2UgeworCVNFVF9GTEFHKEZfQ0YpOworCVNFVF9GTEFHKEZfT0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbXVsX3dvcmQodTE2IHMpCit7CisgICAgczMyIHJlcyA9IChzMTYpTS54ODYuUl9BWCAqIChzMTYpczsKKworICAgIE0ueDg2LlJfQVggPSAodTE2KXJlczsKKyAgICBNLng4Ni5SX0RYID0gKHUxNikocmVzID4+IDE2KTsKKyAgICBpZiAoKChNLng4Ni5SX0FYICYgMHg4MDAwKSA9PSAwICYmIE0ueDg2LlJfRFggPT0gMHgwMDAwKSB8fAorCSgoTS54ODYuUl9BWCAmIDB4ODAwMCkgIT0gMCAmJiBNLng4Ni5SX0RYID09IDB4RkZGRikpIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgfSBlbHNlIHsKKwlTRVRfRkxBRyhGX0NGKTsKKwlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW11bF9sb25nX2RpcmVjdCh1MzIgKnJlc19sbywgdTMyKiByZXNfaGksdTMyIGQsIHUzMiBzKQoreworI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCisgICAgczY0IHJlcyA9IChzMzIpZCAqIChzMzIpczsKKworICAgICpyZXNfbG8gPSAodTMyKXJlczsKKyAgICAqcmVzX2hpID0gKHUzMikocmVzID4+IDMyKTsKKyNlbHNlCisgICAgdTMyIGRfbG8sZF9oaSxkX3NpZ247CisgICAgdTMyIHNfbG8sc19oaSxzX3NpZ247CisgICAgdTMyIHJsb19sbyxybG9faGkscmhpX2xvOworCisgICAgaWYgKChkX3NpZ24gPSBkICYgMHg4MDAwMDAwMCkgIT0gMCkKKwlkID0gLWQ7CisgICAgZF9sbyA9IGQgJiAweEZGRkY7CisgICAgZF9oaSA9IGQgPj4gMTY7CisgICAgaWYgKChzX3NpZ24gPSBzICYgMHg4MDAwMDAwMCkgIT0gMCkKKwlzID0gLXM7CisgICAgc19sbyA9IHMgJiAweEZGRkY7CisgICAgc19oaSA9IHMgPj4gMTY7CisgICAgcmxvX2xvID0gZF9sbyAqIHNfbG87CisgICAgcmxvX2hpID0gKGRfaGkgKiBzX2xvICsgZF9sbyAqIHNfaGkpICsgKHJsb19sbyA+PiAxNik7CisgICAgcmhpX2xvID0gZF9oaSAqIHNfaGkgKyAocmxvX2hpID4+IDE2KTsKKyAgICAqcmVzX2xvID0gKHJsb19oaSA8PCAxNikgfCAocmxvX2xvICYgMHhGRkZGKTsKKyAgICAqcmVzX2hpID0gcmhpX2xvOworICAgIGlmIChkX3NpZ24gIT0gc19zaWduKSB7CisJZCA9IH4qcmVzX2xvOworCXMgPSAoKChkICYgMHhGRkZGKSArIDEpID4+IDE2KSArIChkID4+IDE2KTsKKwkqcmVzX2xvID0gfipyZXNfbG8rMTsKKwkqcmVzX2hpID0gfipyZXNfaGkrKHMgPj4gMTYpOworCX0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGltdWxfbG9uZyh1MzIgcykKK3sKKyAgICBpbXVsX2xvbmdfZGlyZWN0KCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscyk7CisgICAgaWYgKCgoTS54ODYuUl9FQVggJiAweDgwMDAwMDAwKSA9PSAwICYmIE0ueDg2LlJfRURYID09IDB4MDAwMDAwMDApIHx8CisJKChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApICE9IDAgJiYgTS54ODYuUl9FRFggPT0gMHhGRkZGRkZGRikpIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgfSBlbHNlIHsKKwlTRVRfRkxBRyhGX0NGKTsKKwlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdWxfYnl0ZSh1OCBzKQoreworICAgIHUxNiByZXMgPSAodTE2KShNLng4Ni5SX0FMICogcyk7CisKKyAgICBNLng4Ni5SX0FYID0gcmVzOworICAgIGlmIChNLng4Ni5SX0FIID09IDApIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgfSBlbHNlIHsKKwlTRVRfRkxBRyhGX0NGKTsKKwlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdWxfd29yZCh1MTYgcykKK3sKKyAgICB1MzIgcmVzID0gTS54ODYuUl9BWCAqIHM7CisKKyAgICBNLng4Ni5SX0FYID0gKHUxNilyZXM7CisgICAgTS54ODYuUl9EWCA9ICh1MTYpKHJlcyA+PiAxNik7CisgICAgaWYgKE0ueDg2LlJfRFggPT0gMCkgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICB9IGVsc2UgeworCVNFVF9GTEFHKEZfQ0YpOworCVNFVF9GTEFHKEZfT0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG11bF9sb25nKHUzMiBzKQoreworI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCisgICAgdTY0IHJlcyA9ICh1MzIpTS54ODYuUl9FQVggKiAodTMyKXM7CisKKyAgICBNLng4Ni5SX0VBWCA9ICh1MzIpcmVzOworICAgIE0ueDg2LlJfRURYID0gKHUzMikocmVzID4+IDMyKTsKKyNlbHNlCisgICAgdTMyIGEsYV9sbyxhX2hpOworICAgIHUzMiBzX2xvLHNfaGk7CisgICAgdTMyIHJsb19sbyxybG9faGkscmhpX2xvOworCisgICAgYSA9IE0ueDg2LlJfRUFYOworICAgIGFfbG8gPSBhICYgMHhGRkZGOworICAgIGFfaGkgPSBhID4+IDE2OworICAgIHNfbG8gPSBzICYgMHhGRkZGOworICAgIHNfaGkgPSBzID4+IDE2OworICAgIHJsb19sbyA9IGFfbG8gKiBzX2xvOworICAgIHJsb19oaSA9IChhX2hpICogc19sbyArIGFfbG8gKiBzX2hpKSArIChybG9fbG8gPj4gMTYpOworICAgIHJoaV9sbyA9IGFfaGkgKiBzX2hpICsgKHJsb19oaSA+PiAxNik7CisgICAgTS54ODYuUl9FQVggPSAocmxvX2hpIDw8IDE2KSB8IChybG9fbG8gJiAweEZGRkYpOworICAgIE0ueDg2LlJfRURYID0gcmhpX2xvOworI2VuZGlmCisgICAgaWYgKE0ueDg2LlJfRURYID09IDApIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgfSBlbHNlIHsKKwlTRVRfRkxBRyhGX0NGKTsKKwlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSURJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWRpdl9ieXRlKHU4IHMpCit7CisgICAgczMyIGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoczE2KU0ueDg2LlJfQVg7CisgICAgaWYgKHMgPT0gMCkgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgZGl2ID0gZHZkIC8gKHM4KXM7CisgICAgbW9kID0gZHZkICUgKHM4KXM7CisgICAgaWYgKGFicyhkaXYpID4gMHg3ZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgTS54ODYuUl9BTCA9IChzOCkgZGl2OworICAgIE0ueDg2LlJfQUggPSAoczgpIG1vZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpZGl2X3dvcmQodTE2IHMpCit7CisgICAgczMyIGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoKChzMzIpTS54ODYuUl9EWCkgPDwgMTYpIHwgTS54ODYuUl9BWDsKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkaXYgPSBkdmQgLyAoczE2KXM7CisgICAgbW9kID0gZHZkICUgKHMxNilzOworICAgIGlmIChhYnMoZGl2KSA+IDB4N2ZmZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfU0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGRpdiA9PSAwLCBGX1pGKTsKKyAgICBzZXRfcGFyaXR5X2ZsYWcobW9kKTsKKworICAgIE0ueDg2LlJfQVggPSAodTE2KWRpdjsKKyAgICBNLng4Ni5SX0RYID0gKHUxNiltb2Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSURJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWRpdl9sb25nKHUzMiBzKQoreworI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCisgICAgczY0IGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoKChzNjQpTS54ODYuUl9FRFgpIDw8IDMyKSB8IE0ueDg2LlJfRUFYOworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRpdiA9IGR2ZCAvIChzMzIpczsKKyAgICBtb2QgPSBkdmQgJSAoczMyKXM7CisgICAgaWYgKGFicyhkaXYpID4gMHg3ZmZmZmZmZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisjZWxzZQorICAgIHMzMiBkaXYgPSAwLCBtb2Q7CisgICAgczMyIGhfZHZkID0gTS54ODYuUl9FRFg7CisgICAgdTMyIGxfZHZkID0gTS54ODYuUl9FQVg7CisgICAgdTMyIGFic19zID0gcyAmIDB4N0ZGRkZGRkY7CisgICAgdTMyIGFic19oX2R2ZCA9IGhfZHZkICYgMHg3RkZGRkZGRjsKKyAgICB1MzIgaF9zID0gYWJzX3MgPj4gMTsKKyAgICB1MzIgbF9zID0gYWJzX3MgPDwgMzE7CisgICAgaW50IGNvdW50ZXIgPSAzMTsKKyAgICBpbnQgY2Fycnk7CisKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkbyB7CisJZGl2IDw8PSAxOworCWNhcnJ5ID0gKGxfZHZkID49IGxfcykgPyAwIDogMTsKKworCWlmIChhYnNfaF9kdmQgPCAoaF9zICsgY2FycnkpKSB7CisJICAgIGhfcyA+Pj0gMTsKKwkgICAgbF9zID0gYWJzX3MgPDwgKC0tY291bnRlcik7CisJICAgIGNvbnRpbnVlOworCX0gZWxzZSB7CisJICAgIGFic19oX2R2ZCAtPSAoaF9zICsgY2FycnkpOworCSAgICBsX2R2ZCA9IGNhcnJ5ID8gKCgweEZGRkZGRkZGIC0gbF9zKSArIGxfZHZkICsgMSkKKwkJOiAobF9kdmQgLSBsX3MpOworCSAgICBoX3MgPj49IDE7CisJICAgIGxfcyA9IGFic19zIDw8ICgtLWNvdW50ZXIpOworCSAgICBkaXYgfD0gMTsKKwkgICAgY29udGludWU7CisJfQorCisgICAgfSB3aGlsZSAoY291bnRlciA+IC0xKTsKKyAgICAvKiBvdmVyZmxvdyAqLworICAgIGlmIChhYnNfaF9kdmQgfHwgKGxfZHZkID4gYWJzX3MpKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICAvKiBzaWduICovCisgICAgZGl2IHw9ICgoaF9kdmQgJiAweDEwMDAwMDAwKSBeIChzICYgMHgxMDAwMDAwMCkpOworICAgIG1vZCA9IGxfZHZkOworCisjZW5kaWYKKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgIENMRUFSX0ZMQUcoRl9BRik7CisgICAgQ0xFQVJfRkxBRyhGX1NGKTsKKyAgICBTRVRfRkxBRyhGX1pGKTsKKyAgICBzZXRfcGFyaXR5X2ZsYWcobW9kKTsKKworICAgIE0ueDg2LlJfRUFYID0gKHUzMilkaXY7CisgICAgTS54ODYuUl9FRFggPSAodTMyKW1vZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGRpdl9ieXRlKHU4IHMpCit7CisgICAgdTMyIGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSBNLng4Ni5SX0FYOworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRpdiA9IGR2ZCAvICh1OClzOworICAgIG1vZCA9IGR2ZCAlICh1OClzOworICAgIGlmIChhYnMoZGl2KSA+IDB4ZmYpIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIE0ueDg2LlJfQUwgPSAodTgpZGl2OworICAgIE0ueDg2LlJfQUggPSAodTgpbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZGl2X3dvcmQodTE2IHMpCit7CisgICAgdTMyIGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoKCh1MzIpTS54ODYuUl9EWCkgPDwgMTYpIHwgTS54ODYuUl9BWDsKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkaXYgPSBkdmQgLyAodTE2KXM7CisgICAgbW9kID0gZHZkICUgKHUxNilzOworICAgIGlmIChhYnMoZGl2KSA+IDB4ZmZmZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfU0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGRpdiA9PSAwLCBGX1pGKTsKKyAgICBzZXRfcGFyaXR5X2ZsYWcobW9kKTsKKworICAgIE0ueDg2LlJfQVggPSAodTE2KWRpdjsKKyAgICBNLng4Ni5SX0RYID0gKHUxNiltb2Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkaXZfbG9uZyh1MzIgcykKK3sKKyNpZmRlZglfX0hBU19MT05HX0xPTkdfXworICAgIHU2NCBkdmQsIGRpdiwgbW9kOworCisgICAgZHZkID0gKCgodTY0KU0ueDg2LlJfRURYKSA8PCAzMikgfCBNLng4Ni5SX0VBWDsKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkaXYgPSBkdmQgLyAodTMyKXM7CisgICAgbW9kID0gZHZkICUgKHUzMilzOworICAgIGlmIChhYnMoZGl2KSA+IDB4ZmZmZmZmZmYpIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorI2Vsc2UKKyAgICBzMzIgZGl2ID0gMCwgbW9kOworICAgIHMzMiBoX2R2ZCA9IE0ueDg2LlJfRURYOworICAgIHUzMiBsX2R2ZCA9IE0ueDg2LlJfRUFYOworCisgICAgdTMyIGhfcyA9IHM7CisgICAgdTMyIGxfcyA9IDA7CisgICAgaW50IGNvdW50ZXIgPSAzMjsKKyAgICBpbnQgY2Fycnk7CisKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkbyB7CisJZGl2IDw8PSAxOworCWNhcnJ5ID0gKGxfZHZkID49IGxfcykgPyAwIDogMTsKKworCWlmIChoX2R2ZCA8IChoX3MgKyBjYXJyeSkpIHsKKwkgICAgaF9zID4+PSAxOworCSAgICBsX3MgPSBzIDw8ICgtLWNvdW50ZXIpOworCSAgICBjb250aW51ZTsKKwl9IGVsc2UgeworCSAgICBoX2R2ZCAtPSAoaF9zICsgY2FycnkpOworCSAgICBsX2R2ZCA9IGNhcnJ5ID8gKCgweEZGRkZGRkZGIC0gbF9zKSArIGxfZHZkICsgMSkKKwkJOiAobF9kdmQgLSBsX3MpOworCSAgICBoX3MgPj49IDE7CisJICAgIGxfcyA9IHMgPDwgKC0tY291bnRlcik7CisJICAgIGRpdiB8PSAxOworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICB9IHdoaWxlIChjb3VudGVyID4gLTEpOworICAgIC8qIG92ZXJmbG93ICovCisgICAgaWYgKGhfZHZkIHx8IChsX2R2ZCA+IHMpKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBtb2QgPSBsX2R2ZDsKKyNlbmRpZgorICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgQ0xFQVJfRkxBRyhGX0FGKTsKKyAgICBDTEVBUl9GTEFHKEZfU0YpOworICAgIFNFVF9GTEFHKEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhtb2QpOworCisgICAgTS54ODYuUl9FQVggPSAodTMyKWRpdjsKKyAgICBNLng4Ni5SX0VEWCA9ICh1MzIpbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElOIHN0cmluZyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc2luZ2xlX2luKGludCBzaXplKQoreworICAgIGlmKHNpemUgPT0gMSkKKwlzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksKCpzeXNfaW5iKShNLng4Ni5SX0RYKSk7CisgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorCXN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwoKnN5c19pbncpKE0ueDg2LlJfRFgpKTsKKyAgICBlbHNlCisJc3RvcmVfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCgqc3lzX2lubCkoTS54ODYuUl9EWCkpOworfQorCit2b2lkIGlucyhpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaW5jID0gc2l6ZTsKKworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgeworCWluYyA9IC1zaXplOworICAgIH0KKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIGluIHVudGlsIENYIGlzIFpFUk8uICovCisJdTMyIGNvdW50ID0gKChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgPworCQkgICAgIE0ueDg2LlJfRUNYIDogTS54ODYuUl9DWCk7CisKKwl3aGlsZSAoY291bnQtLSkgeworCSAgc2luZ2xlX2luKHNpemUpOworCSAgTS54ODYuUl9ESSArPSBpbmM7CisJICB9CisJTS54ODYuUl9DWCA9IDA7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIE0ueDg2LlJfRUNYID0gMDsKKwl9CisJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfSBlbHNlIHsKKwlzaW5nbGVfaW4oc2l6ZSk7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE9VVCBzdHJpbmcgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHNpbmdsZV9vdXQoaW50IHNpemUpCit7CisgICAgIGlmKHNpemUgPT0gMSkKKyAgICAgICAoKnN5c19vdXRiKShNLng4Ni5SX0RYLGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOworICAgICBlbHNlIGlmIChzaXplID09IDIpCisgICAgICAgKCpzeXNfb3V0dykoTS54ODYuUl9EWCxmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKKyAgICAgZWxzZQorICAgICAgICgqc3lzX291dGwpKE0ueDg2LlJfRFgsZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7Cit9CisKK3ZvaWQgb3V0cyhpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaW5jID0gc2l6ZTsKKworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgeworCWluYyA9IC1zaXplOworICAgIH0KKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIG91dCB1bnRpbCBDWCBpcyBaRVJPLiAqLworCXUzMiBjb3VudCA9ICgoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpID8KKwkJICAgICBNLng4Ni5SX0VDWCA6IE0ueDg2LlJfQ1gpOworCXdoaWxlIChjb3VudC0tKSB7CisJICBzaW5nbGVfb3V0KHNpemUpOworCSAgTS54ODYuUl9TSSArPSBpbmM7CisJICB9CisJTS54ODYuUl9DWCA9IDA7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIE0ueDg2LlJfRUNYID0gMDsKKwl9CisJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfSBlbHNlIHsKKwlzaW5nbGVfb3V0KHNpemUpOworCU0ueDg2LlJfU0kgKz0gaW5jOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyCS0gQWRkcmVzcyB0byBmZXRjaCB3b3JkIGZyb20KKworUkVNQVJLUzoKK0ZldGNoZXMgYSB3b3JkIGZyb20gZW11bGF0b3IgbWVtb3J5IHVzaW5nIGFuIGFic29sdXRlIGFkZHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IG1lbV9hY2Nlc3Nfd29yZChpbnQgYWRkcikKK3sKK0RCKCBpZiAoQ0hFQ0tfTUVNX0FDQ0VTUygpKQorICAgICAgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3MoYWRkcik7KQorICAgIHJldHVybiAoKnN5c19yZHcpKGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1B1c2hlcyBhIHdvcmQgb250byB0aGUgc3RhY2suCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcywgYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHB1c2hfd29yZCh1MTYgdykKK3sKK0RCKCBpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisgICAgICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorICAgIE0ueDg2LlJfU1AgLT0gMjsKKyAgICAoKnN5c193cncpKCgodTMyKU0ueDg2LlJfU1MgPDwgNCkgICsgTS54ODYuUl9TUCwgdyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUHVzaGVzIGEgbG9uZyBvbnRvIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHVzaF9sb25nKHUzMiB3KQoreworREIoIGlmIChDSEVDS19TUF9BQ0NFU1MoKSkKKyAgICAgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCisgICAgTS54ODYuUl9TUCAtPSA0OworICAgICgqc3lzX3dybCkoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQLCB3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQb3BzIGEgd29yZCBmcm9tIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBwb3Bfd29yZCh2b2lkKQoreworICAgIHUxNiByZXM7CisKK0RCKCBpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisgICAgICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorICAgIHJlcyA9ICgqc3lzX3JkdykoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQKTsKKyAgICBNLng4Ni5SX1NQICs9IDI7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQb3BzIGEgbG9uZyBmcm9tIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBwb3BfbG9uZyh2b2lkKQoreworICAgIHUzMiByZXM7CisKK0RCKCBpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisgICAgICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorICAgIHJlcyA9ICgqc3lzX3JkbCkoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQKTsKKyAgICBNLng4Ni5SX1NQICs9IDQ7CisgICAgcmV0dXJuIHJlczsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L3N5cy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9zeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYzODlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9zeXMuYwpAQCAtMCwwICsxLDMyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHdoaWNoIGFyZSByZWxhdGVkIHRvCisqICAgICAgICAgICAgICAgcHJvZ3JhbW1lZCBJL08gYW5kIG1lbW9yeSBhY2Nlc3MuIEluY2x1ZGVkIGluIHRoaXMgbW9kdWxlCisqICAgICAgICAgICAgICAgYXJlIGRlZmF1bHQgZnVuY3Rpb25zIHRoYXQgZG8gbm90aGluZy4gRm9yIHJlYWwgdXNlcyB0aGVzZQorKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucyB3aWxsIGhhdmUgdG8gYmUgb3ZlcnJpZGVuIGJ5IHRoZSB1c2VyIGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0JJT1NFTVUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1g4NkVNVV9zeXNFbnYgX1g4NkVNVV9lbnY7CS8qIEdsb2JhbCBlbXVsYXRvciBtYWNoaW5lIHN0YXRlICovCitYODZFTVVfaW50ckZ1bmNzIF9YODZFTVVfaW50clRhYlsyNTZdOworCitpbnQgZGVidWdfaW50cjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgorCitSRU1BUktTOgorUmVhZHMgYSBieXRlIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBYODZBUEkgcmRiKHUzMiBhZGRyKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitXb3JkIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIHdvcmQgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBYODZBUEkgcmR3KHUzMiBhZGRyKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCitSRU1BUktTOgorUmVhZHMgYSBsb25nIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgWDg2QVBJIHJkbCh1MzIgYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBieXRlIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSB3cmIodTMyIGFkZHIsIHU4IHZhbCkKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSB3cncodTMyIGFkZHIsIHUxNiB2YWwpCit7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKK3ZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgbG9uZyB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgd3JsKHUzMiBhZGRyLCB1MzIgdmFsKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBQSU8gYWRkcmVzcyB0byByZWFkCitSRVRVUk46CiswCitSRU1BUktTOgorRGVmYXVsdCBQSU8gYnl0ZSByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbmIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHU4IFg4NkFQSSBwX2luYihYODZFTVVfcGlvQWRkciBhZGRyKQoreworCURCKGlmIChERUJVR19JT19UUkFDRSgpKQorCSAgIHByaW50aygiaW5iICUjMDR4IFxuIiwgYWRkcik7KQorCQlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gUElPIGFkZHJlc3MgdG8gcmVhZAorUkVUVVJOOgorMAorUkVNQVJLUzoKK0RlZmF1bHQgUElPIHdvcmQgcmVhZCBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgaW53LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1MTYgWDg2QVBJIHBfaW53KFg4NkVNVV9waW9BZGRyIGFkZHIpCit7CisJREIoaWYgKERFQlVHX0lPX1RSQUNFKCkpCisJICAgcHJpbnRrKCJpbncgJSMwNHggXG4iLCBhZGRyKTspCisJCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBQSU8gYWRkcmVzcyB0byByZWFkCitSRVRVUk46CiswCitSRU1BUktTOgorRGVmYXVsdCBQSU8gbG9uZyByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbmwuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHUzMiBYODZBUEkgcF9pbmwoWDg2RU1VX3Bpb0FkZHIgYWRkcikKK3sKKwlEQihpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkgICBwcmludGsoImlubCAlIzA0eCBcbiIsIGFkZHIpOykKKwkJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIFBJTyBhZGRyZXNzIHRvIHdyaXRlCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyBieXRlIHdyaXRlIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBvdXRiLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSBwX291dGIoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKQoreworCURCKGlmIChERUJVR19JT19UUkFDRSgpKQorCSAgIHByaW50aygib3V0YiAlIzAyeCAtPiAlIzA0eCBcbiIsIHZhbCwgYWRkcik7KQorCQlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIFBJTyBhZGRyZXNzIHRvIHdyaXRlCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyB3b3JkIHdyaXRlIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBvdXR3LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSBwX291dHcoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTE2IHZhbCkKK3sKKwlEQihpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkgICBwcmludGsoIm91dHcgJSMwNHggLT4gJSMwNHggXG4iLCB2YWwsIGFkZHIpOykKKwkJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBQSU8gYWRkcmVzcyB0byB3cml0ZQordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCitSRU1BUktTOgorRGVmYXVsdCBQSU8gO29uZyB3cml0ZSBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgb3V0bC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBYODZBUEkgcF9vdXRsKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpCit7CisJREIoaWYgKERFQlVHX0lPX1RSQUNFKCkpCisJICAgcHJpbnRrKCJvdXRsICUjMDh4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCisJCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTgoWDg2QVBJUCBzeXNfcmRiKSAodTMyIGFkZHIpID0gcmRiOwordTE2KFg4NkFQSVAgc3lzX3JkdykgKHUzMiBhZGRyKSA9IHJkdzsKK3UzMihYODZBUElQIHN5c19yZGwpICh1MzIgYWRkcikgPSByZGw7Cit2b2lkIChYODZBUElQIHN5c193cmIpICh1MzIgYWRkciwgdTggdmFsKSA9IHdyYjsKK3ZvaWQgKFg4NkFQSVAgc3lzX3dydykgKHUzMiBhZGRyLCB1MTYgdmFsKSA9IHdydzsKK3ZvaWQgKFg4NkFQSVAgc3lzX3dybCkgKHUzMiBhZGRyLCB1MzIgdmFsKSA9IHdybDsKK3U4KFg4NkFQSVAgc3lzX2luYikgKFg4NkVNVV9waW9BZGRyIGFkZHIpID0gcF9pbmI7Cit1MTYoWDg2QVBJUCBzeXNfaW53KSAoWDg2RU1VX3Bpb0FkZHIgYWRkcikgPSBwX2ludzsKK3UzMihYODZBUElQIHN5c19pbmwpIChYODZFTVVfcGlvQWRkciBhZGRyKSA9IHBfaW5sOwordm9pZCAoWDg2QVBJUCBzeXNfb3V0YikgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHU4IHZhbCkgPSBwX291dGI7Cit2b2lkIChYODZBUElQIHN5c19vdXR3KSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTE2IHZhbCkgPSBwX291dHc7Cit2b2lkIChYODZBUElQIHN5c19vdXRsKSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTMyIHZhbCkgPSBwX291dGw7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZnVuY3MgICAtIE5ldyBtZW1vcnkgZnVuY3Rpb24gcG9pbnRlcnMgdG8gbWFrZSBhY3RpdmUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB3aGljaCBhY2Nlc3MKK21lbW9yeSBzcGFjZSwgYWxsb3dpbmcgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgdGhlc2UgZnVuY3Rpb25zCithbmQgaG9vayB0aGVtIG91dCBhcyBuZWNlc3NhcnkgZm9yIHRoZWlyIGFwcGxpY2F0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2RU1VX3NldHVwTWVtRnVuY3MoWDg2RU1VX21lbUZ1bmNzICogZnVuY3MpCit7CisJc3lzX3JkYiA9IGZ1bmNzLT5yZGI7CisJc3lzX3JkdyA9IGZ1bmNzLT5yZHc7CisJc3lzX3JkbCA9IGZ1bmNzLT5yZGw7CisJc3lzX3dyYiA9IGZ1bmNzLT53cmI7CisJc3lzX3dydyA9IGZ1bmNzLT53cnc7CisJc3lzX3dybCA9IGZ1bmNzLT53cmw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZnVuY3MgICAtIE5ldyBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbiBwb2ludGVycyB0byBtYWtlIGFjdGl2ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGFjY2VzcworSS9PIHNwYWNlLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBvdmVycmlkZSB0aGVzZSBmdW5jdGlvbnMKK2FuZCBob29rIHRoZW0gb3V0IGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfc2V0dXBQaW9GdW5jcyhYODZFTVVfcGlvRnVuY3MgKiBmdW5jcykKK3sKKwlzeXNfaW5iID0gZnVuY3MtPmluYjsKKwlzeXNfaW53ID0gZnVuY3MtPmludzsKKwlzeXNfaW5sID0gZnVuY3MtPmlubDsKKwlzeXNfb3V0YiA9IGZ1bmNzLT5vdXRiOworCXN5c19vdXR3ID0gZnVuY3MtPm91dHc7CisJc3lzX291dGwgPSBmdW5jcy0+b3V0bDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitmdW5jcyAgIC0gTmV3IGludGVycnVwdCB2ZWN0b3IgdGFibGUgdG8gbWFrZSBhY3RpdmUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB3aGljaCBoYW5kbGUKK2ludGVycnVwdCBwcm9jZXNzaW5nIGluIHRoZSBlbXVsYXRvciwgYWxsb3dpbmcgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8KK2hvb2sgaW50ZXJydXB0cyBhcyBuZWNlc3NhcnkgZm9yIHRoZWlyIGFwcGxpY2F0aW9uLiBBbnkgaW50ZXJydXB0cyB0aGF0CithcmUgbm90IGhvb2tlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiwgYW5kIHJlZmxlY3RlZCBhbmQgaGFuZGxlZCBpbnRlcm5hbGx5CitpbiB0aGUgZW11bGF0b3IgdmlhIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlLiBUaGlzIGFsbG93cyB0aGUgYXBwbGljYXRpb24KK3RvIGdldCBjb250cm9sIHdoZW4gdGhlIGNvZGUgYmVpbmcgZW11bGF0ZWQgZXhlY3V0ZXMgc3BlY2lmaWMgc29mdHdhcmUKK2ludGVycnVwdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfc2V0dXBJbnRyRnVuY3MoWDg2RU1VX2ludHJGdW5jcyBmdW5jc1tdKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlfWDg2RU1VX2ludHJUYWJbaV0gPSBOVUxMOworCWlmIChmdW5jcykgeworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlfWDg2RU1VX2ludHJUYWJbaV0gPSBmdW5jc1tpXTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50IC0gTmV3IHNvZnR3YXJlIGludGVycnVwdCB0byBwcmVwYXJlIGZvcgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB1cCB0aGUgZW11bGF0b3Igc3RhdGUgdG8gZXhjZXV0ZSBhIHNvZnR3YXJlCitpbnRlcnJ1cHQuIFRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlIHVzZXIgYXBwbGljYXRpb24gY29kZSB0byBhbGxvdyBhbgoraW50ZXJydXB0IHRvIGJlIGhvb2tlZCwgZXhhbWluZWQgYW5kIHRoZW4gcmVmbGVjdGVkIGJhY2sgdG8gdGhlIGVtdWxhdG9yCitzbyB0aGF0IHRoZSBjb2RlIGluIHRoZSBlbXVsYXRvciB3aWxsIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIHNvZnR3YXJlCitpbnRlcnJ1cHQgYXMgcGVyIG5vcm1hbC4gVGhpcyBlc3NlbnRpYWxseSBhbGxvd3Mgc3lzdGVtIGNvZGUgdG8gYWN0aXZlbHkKK2hvb2sgYW5kIGhhbmRsZSBjZXJ0YWluIHNvZnR3YXJlIGludGVycnVwdHMgYXMgbmVjZXNzYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50IG51bSkKK3sKKwlwdXNoX3dvcmQoKHUxNikgTS54ODYuUl9GTEcpOworCUNMRUFSX0ZMQUcoRl9JRik7CisJQ0xFQVJfRkxBRyhGX1RGKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisJTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChudW0gKiA0ICsgMik7CisJcHVzaF93b3JkKE0ueDg2LlJfSVApOworCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQobnVtICogNCk7CisJTS54ODYuaW50ciA9IDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZmJfY29uc29sZS5jIGIvZHJpdmVycy9jZmJfY29uc29sZS5jCmluZGV4IDk3MjdhZWIuLmJjZjg3NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2ZiX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NmYl9jb25zb2xlLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAkJCSAgICAgICBsb29wIGluIFZJREVPX1RTVENfRkNUIChpODA0MikKICBDRkdfQ09OU09MRV9CTElOS19DT1VOVCAgICAgLSB2YWx1ZSBmb3IgZGVsYXkgbG9vcCAtIGJsaW5rIHJhdGUKICBDT05GSUdfQ09OU09MRV9USU1FCSAgICAgLSBkaXNwbGF5IHRpbWUvZGF0ZSBpbiB1cHBlciByaWdodCBjb3JuZXIsCi0JCQkgICAgICAgbmVlZHMgQ0ZHX0NNRF9EQVRFIGFuZCBDT05GSUdfQ09OU09MRV9DVVJTT1IKKwkJCSAgICAgICBuZWVkcyBDT05GSUdfQ01EX0RBVEUgYW5kIENPTkZJR19DT05TT0xFX0NVUlNPUgogIENPTkZJR19WSURFT19MT0dPCSAgICAgLSBkaXNwbGF5IExpbnV4IExvZ28gaW4gdXBwZXIgbGVmdCBjb3JuZXIKICBDT05GSUdfVklERU9fQk1QX0xPR08JICAgICAtIHVzZSBibXBfbG9nbyBpbnN0ZWFkIG9mIGxpbnV4X2xvZ28KICBDT05GSUdfQ09OU09MRV9FWFRSQV9JTkZPICAgLSBkaXNwbGF5IGFkZGl0aW9uYWwgYm9hcmQgaW5mb3JtYXRpb24gc3RyaW5ncwpAQCAtMTc1LDE1ICsxNzUsMTUgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGRldmljZXMuaD4KICNpbmNsdWRlIDx2aWRlb19mb250Lmg+Ci0jaWZkZWYgQ0ZHX0NNRF9EQVRFCi0jaW5jbHVkZSA8cnRjLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKKyNpbmNsdWRlIDxydGMuaD4KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxibXBfbGF5b3V0Lmg+Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBDT05GSUdfU1BMQVNIX1NDUkVFTiAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEN1cnNvciBkZWZpbml0aW9uOgkJCQkJCQkgICAgICovCkBAIC03MDksNyArNzA5LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAKICNkZWZpbmUgRklMTF84QklUXzMzMlJHQihyLGcsYikJewkJCVwKIAkqZmIgPSAoKHI+PjUpPDw1KSB8ICgoZz4+NSk8PDIpIHwgKGI+PjYpOwlcCkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CTVApIHx8IENPTkZJR19TUExBU0hfU0NSRUVOICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NzODkwMC5jIGIvZHJpdmVycy9jczg5MDAuYwppbmRleCAwODI0MzRjLi44MGM0YmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NzODkwMC5jCisrKyBiL2RyaXZlcnMvY3M4OTAwLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAogI2lmZGVmIENPTkZJR19EUklWRVJfQ1M4OTAwCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogI3VuZGVmIERFQlVHCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGF0YWZsYXNoLmMgYi9kcml2ZXJzL2RhdGFmbGFzaC5jCmluZGV4IDE3ZWI4NTkuLjkxOTAzYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGF0YWZsYXNoLmMKKysrIGIvZHJpdmVycy9kYXRhZmxhc2guYwpAQCAtMjYsMTggKzI2LDY3IEBACiBBVDkxU19EQVRBRkxBU0hfSU5GTyBkYXRhZmxhc2hfaW5mb1tDRkdfTUFYX0RBVEFGTEFTSF9CQU5LU107CiBzdGF0aWMgQVQ5MVNfRGF0YUZsYXNoIERhdGFGbGFzaEluc3Q7CiAKKyNpZmRlZiBDT05GSUdfQVQ5MVNBTTkyNjBFSworaW50IGNzW11bQ0ZHX01BWF9EQVRBRkxBU0hfQkFOS1NdID0geworCXtDRkdfREFUQUZMQVNIX0xPR0lDX0FERFJfQ1MwLCAwfSwJLyogTG9naWNhbCBhZHJlc3MsIENTICovCisJe0NGR19EQVRBRkxBU0hfTE9HSUNfQUREUl9DUzEsIDF9Cit9OworI2VsaWYgZGVmaW5lZChDT05GSUdfQVQ5MVNBTTkyNjNFSykKK2ludCBjc1tdW0NGR19NQVhfREFUQUZMQVNIX0JBTktTXSA9IHsKKwl7Q0ZHX0RBVEFGTEFTSF9MT0dJQ19BRERSX0NTMCwgMH0JLyogTG9naWNhbCBhZHJlc3MsIENTICovCit9OworI2Vsc2UKIGludCBjc1tdW0NGR19NQVhfREFUQUZMQVNIX0JBTktTXSA9IHsKIAl7Q0ZHX0RBVEFGTEFTSF9MT0dJQ19BRERSX0NTMCwgMH0sCS8qIExvZ2ljYWwgYWRyZXNzLCBDUyAqLwogCXtDRkdfREFUQUZMQVNIX0xPR0lDX0FERFJfQ1MzLCAzfQogfTsKKyNlbmRpZgogCiAvKmRlZmluZSB0aGUgYXJlYSBvZmZzZXRzKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BVDkxU0FNOTI2MUVLKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxU0FNOTI2MEVLKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxU0FNOTI2M0VLKQorI2lmCWRlZmluZWQoQ09ORklHX05FV19QQVJUSVRJT04pCitkYXRhZmxhc2hfcHJvdGVjdF90IGFyZWFfbGlzdFtOQl9EQVRBRkxBU0hfQVJFQV0gPSB7CisJezB4MDAwMDAwMDAsCTB4MDAwMDNGRkYsIAlGTEFHX1BST1RFQ1RfU0VULAkwLCAgICAJCSJCb290c3RyYXAifSwgIAkvKiBST00gY29kZSAqLworCXsweDAwMDA0MjAwLAkweDAwMDA4M0ZGLCAJRkxBR19QUk9URUNUX0NMRUFSLAkwLCAgICAJCSJFbnZpcm9ubWVudCJ9LAkvKiB1LWJvb3QgZW52aXJvbm1lbnQgKi8KKwl7MHgwMDAwODQwMCwJMHgwMDAzRERGRiwJRkxBR19QUk9URUNUX1NFVCwJMCwgICAgCQkiVS1Cb290In0sICAgICAJLyogdS1ib290IGNvZGUgKi8KKwl7MHgwMDAzREUwMCwJMHgwMDA0MUZGRiwJRkxBR19QUk9URUNUX0NMRUFSLAlGTEFHX1NFVEVOViwJIk1PTiJ9LAkgICAgICAgCS8qIFJvb20gZm9yIGFsdGVybmF0aXZlIGJvb3QgbW9uaXRvciAqLworCXsweDAwMDQyMDAwLAkweDAwMThCRkZGLAlGTEFHX1BST1RFQ1RfQ0xFQVIsCUZMQUdfU0VURU5WLAkiT1MifSwJICAgICAgIAkvKiBkYXRhIGFyZWEgc2l6ZSB0byB0dW5lICovCisJezB4MDAxOEMwMDAsCTB4RkZGRkZGRkYsCUZMQUdfUFJPVEVDVF9DTEVBUiwJRkxBR19TRVRFTlYsCSJGUyJ9LAkgICAgICAgCS8qIGRhdGEgYXJlYSBzaXplIHRvIHR1bmUgKi8KK307CisjZWxzZQorZGF0YWZsYXNoX3Byb3RlY3RfdCBhcmVhX2xpc3RbTkJfREFUQUZMQVNIX0FSRUFdID0geworCXswLCAweDNmZmYsIEZMQUdfUFJPVEVDVF9TRVR9LAkJCS8qIFJPTSBjb2RlICovCisJezB4NDAwMCwgMHg3ZmZmLCBGTEFHX1BST1RFQ1RfQ0xFQVJ9LAkJLyogdS1ib290IGVudmlyb25tZW50ICovCisJezB4ODAwMCwgMHgzN2ZmZiwgRkxBR19QUk9URUNUX1NFVH0sCQkvKiB1LWJvb3QgY29kZSAqLworCXsweDM4MDAwLCAweDFmZmZmZiwgRkxBR19QUk9URUNUX0NMRUFSfSwJLyogZGF0YSBhcmVhIHNpemUgdG8gdHVuZSAqLworfTsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChDT05GSUdfTkVXX1BBUlRJVElPTikKKy8qZGVmaW5lIHRoZSBhcmVhIG9mZnNldHMqLworLyogSW52YWxpZCBwYXJ0aXRpb25zIHNob3VsZCBiZSBkZWZpbmVkIHdpdGggc3RhcnQgPiBlbmQgKi8KK2RhdGFmbGFzaF9wcm90ZWN0X3QgYXJlYV9saXN0W05CX0RBVEFGTEFTSF9BUkVBKkNGR19NQVhfREFUQUZMQVNIX0JBTktTXSA9IHsKKwl7MHgwMDAwMDAwMCwgMHgwMDAwODNmZiwgRkxBR19QUk9URUNUX1NFVCwJMCwJCSJCb290c3RyYXAifSwJLyogUk9NIGNvZGUgKi8KKwl7MHgwMDAwODQwMCwgMHgwMDAyMGZmZiwgRkxBR19QUk9URUNUX1NFVCwJMCwJCSJVLUJvb3QifSwJLyogdS1ib290IGNvZGUgKi8KKwl7MHgwMDAyMTAwMCwgMHgwMDAyOTNmZiwgRkxBR19QUk9URUNUX0NMRUFSLAkwLAkJIkVudmlyb25tZW50In0sCS8qIHUtYm9vdCBlbnZpcm9ubWVudCA4S2IgKi8KKwl7MHgwMDAyOTQwMCwgMHgwMDA0MWZmZiwgRkxBR19QUk9URUNUX0lOVkFMSUQsCTAsCQkiPFVudXNlZD4ifSwJLyogUmVzdCBvZiBTZWN0b3IgMSAqLworCXsweDAwMDQyMDAwLCAweDAwMThCZmZmLCBGTEFHX1BST1RFQ1RfQ0xFQVIsCUZMQUdfU0VURU5WLAkiT1MifSwJLyogZGF0YSBhcmVhIHNpemUgdG8gdHVuZSAqLworCXsweDAwMThDMDAwLCAweGZmZmZmZmZmLCBGTEFHX1BST1RFQ1RfQ0xFQVIsCUZMQUdfU0VURU5WLAkiRlMifSwJLyogZGF0YSBhcmVhIHNpemUgdG8gdHVuZSAqLworCisJezB4MDAwMDAwMDAsIDB4ZmZmZmZmZmYsIEZMQUdfUFJPVEVDVF9DTEVBUiwJRkxBR19TRVRFTlYsCSJEYXRhIn0sCS8qIGRhdGEgYXJlYSAqLworCXsweGZmZmZmZmZmLCAweDAwMDAwMDAwLCBGTEFHX1BST1RFQ1RfSU5WQUxJRCwJMCwJCSI8SW52YWxpZD4ifSwJLyogSW52YWxpZCAqLworCXsweGZmZmZmZmZmLCAweDAwMDAwMDAwLCBGTEFHX1BST1RFQ1RfSU5WQUxJRCwJMCwJCSI8SW52YWxpZD4ifSwJLyogSW52YWxpZCAqLworCXsweGZmZmZmZmZmLCAweDAwMDAwMDAwLCBGTEFHX1BST1RFQ1RfSU5WQUxJRCwJMCwJCSI8SW52YWxpZD4ifSwJLyogSW52YWxpZCAqLworCXsweGZmZmZmZmZmLCAweDAwMDAwMDAwLCBGTEFHX1BST1RFQ1RfSU5WQUxJRCwJMCwJCSI8SW52YWxpZD4ifSwJLyogSW52YWxpZCAqLworCXsweGZmZmZmZmZmLCAweDAwMDAwMDAwLCBGTEFHX1BST1RFQ1RfSU5WQUxJRCwJMCwJCSI8SW52YWxpZD4ifSwJLyogSW52YWxpZCAqLworfTsKKyNlbHNlCiBkYXRhZmxhc2hfcHJvdGVjdF90IGFyZWFfbGlzdFtOQl9EQVRBRkxBU0hfQVJFQV0gPSB7CiAJezAsIDB4N2ZmZiwgRkxBR19QUk9URUNUX1NFVH0sCQkJLyogUk9NIGNvZGUgKi8KIAl7MHg4MDAwLCAweDFmZmZmLCBGTEFHX1BST1RFQ1RfU0VUfSwJCS8qIHUtYm9vdCBjb2RlICovCiAJezB4MjAwMDAsIDB4MjdmZmYsIEZMQUdfUFJPVEVDVF9DTEVBUn0sCQkvKiB1LWJvb3QgZW52aXJvbm1lbnQgKi8KIAl7MHgyODAwMCwgMHgxZmZmZmYsIEZMQUdfUFJPVEVDVF9DTEVBUn0sCS8qIGRhdGEgYXJlYSBzaXplIHRvIHR1bmUgKi8KIH07CisjZW5kaWYKIAogZXh0ZXJuIHZvaWQgQVQ5MUZfU3BpSW5pdCAodm9pZCk7CiBleHRlcm4gaW50IEFUOTFGX0RhdGFmbGFzaFByb2JlIChpbnQgaSwgQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MpOwpAQCAtNDUsMjIgKzk0LDI4IEBACiAJCQkJdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqYnVmZmVyKTsKIGV4dGVybiBpbnQgQVQ5MUZfRGF0YUZsYXNoV3JpdGUoIEFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKLQkJCQkgICAgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJICAgICAgICAgICAgaW50IGRlc3QsCi0JCQkJICAgIGludCBzaXplICk7CisJCQkJdW5zaWduZWQgY2hhciAqc3JjLAorCQkJCWludCBkZXN0LAorCQkJCWludCBzaXplICk7CiAKIGludCBBVDkxRl9EYXRhZmxhc2hJbml0ICh2b2lkKQogewogCWludCBpLCBqOwogCWludCBkZmNvZGU7CisJaW50IHBhcnQgPSAwOworCWludCBsYXN0X3BhcnQ7CisJaW50IGZvdW5kW0NGR19NQVhfREFUQUZMQVNIX0JBTktTXTsKKwl1bnNpZ25lZCBjaGFyIHByb3RlY3RlZDsKIAogCUFUOTFGX1NwaUluaXQgKCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQ0ZHX01BWF9EQVRBRkxBU0hfQkFOS1M7IGkrKykgeworCQlmb3VuZFtpXSA9IDA7CiAJCWRhdGFmbGFzaF9pbmZvW2ldLkRlc2Muc3RhdGUgPSBJRExFOwogCQlkYXRhZmxhc2hfaW5mb1tpXS5pZCA9IDA7CiAJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5wYWdlc19udW1iZXIgPSAwOwotCQlkZmNvZGUgPSBBVDkxRl9EYXRhZmxhc2hQcm9iZSAoY3NbaV1bMV0sICZkYXRhZmxhc2hfaW5mb1tpXS5EZXNjKTsKKwkJZGZjb2RlID0gQVQ5MUZfRGF0YWZsYXNoUHJvYmUgKGNzW2ldWzFdLAorCQkJCSZkYXRhZmxhc2hfaW5mb1tpXS5EZXNjKTsKIAogCQlzd2l0Y2ggKGRmY29kZSkgewogCQljYXNlIEFUNDVEQjE2MToKQEAgLTcyLDYgKzEyNyw3IEBACiAJCQlkYXRhZmxhc2hfaW5mb1tpXS5EZXNjLkRhdGFGbGFzaF9zdGF0ZSA9IElETEU7CiAJCQlkYXRhZmxhc2hfaW5mb1tpXS5sb2dpY2FsX2FkZHJlc3MgPSBjc1tpXVswXTsKIAkJCWRhdGFmbGFzaF9pbmZvW2ldLmlkID0gZGZjb2RlOworCQkJZm91bmRbaV0gKz0gZGZjb2RlOzsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQVQ0NURCMzIxOgpAQCAtODMsNiArMTM5LDcgQEAKIAkJCWRhdGFmbGFzaF9pbmZvW2ldLkRlc2MuRGF0YUZsYXNoX3N0YXRlID0gSURMRTsKIAkJCWRhdGFmbGFzaF9pbmZvW2ldLmxvZ2ljYWxfYWRkcmVzcyA9IGNzW2ldWzBdOwogCQkJZGF0YWZsYXNoX2luZm9baV0uaWQgPSBkZmNvZGU7CisJCQlmb3VuZFtpXSArPSBkZmNvZGU7OwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBVDQ1REI2NDI6CkBAIC05NCw3ICsxNTEsOSBAQAogCQkJZGF0YWZsYXNoX2luZm9baV0uRGVzYy5EYXRhRmxhc2hfc3RhdGUgPSBJRExFOwogCQkJZGF0YWZsYXNoX2luZm9baV0ubG9naWNhbF9hZGRyZXNzID0gY3NbaV1bMF07CiAJCQlkYXRhZmxhc2hfaW5mb1tpXS5pZCA9IGRmY29kZTsKKwkJCWZvdW5kW2ldICs9IGRmY29kZTs7CiAJCQlicmVhazsKKwogCQljYXNlIEFUNDVEQjEyODoKIAkJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5wYWdlc19udW1iZXIgPSAxNjM4NDsKIAkJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5wYWdlc19zaXplID0gMTA1NjsKQEAgLTEwNCw5ICsxNjMsMTEgQEAKIAkJCWRhdGFmbGFzaF9pbmZvW2ldLkRlc2MuRGF0YUZsYXNoX3N0YXRlID0gSURMRTsKIAkJCWRhdGFmbGFzaF9pbmZvW2ldLmxvZ2ljYWxfYWRkcmVzcyA9IGNzW2ldWzBdOwogCQkJZGF0YWZsYXNoX2luZm9baV0uaWQgPSBkZmNvZGU7CisJCQlmb3VuZFtpXSArPSBkZmNvZGU7OwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKKwkJCWRmY29kZSA9IDA7CiAJCQlicmVhazsKIAkJfQogCQkvKiBzZXQgdGhlIGxhc3QgYXJlYSBlbmQgdG8gdGhlIGRhdGFmbGFzaCBzaXplKi8KQEAgLTExNCwxNiArMTc1LDY0IEBACiAJCQkJKGRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5wYWdlc19udW1iZXIgKgogCQkJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5wYWdlc19zaXplKS0xOwogCisJCWxhc3RfcGFydD0wOwogCQkvKiBzZXQgdGhlIGFyZWEgYWRkcmVzc2VzICovCiAJCWZvcihqID0gMDsgajxOQl9EQVRBRkxBU0hfQVJFQTsgaisrKSB7Ci0JCQlkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLnN0YXJ0ID0gYXJlYV9saXN0W2pdLnN0YXJ0ICsgZGF0YWZsYXNoX2luZm9baV0ubG9naWNhbF9hZGRyZXNzOwotCQkJZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFtqXS5lbmQgPSBhcmVhX2xpc3Rbal0uZW5kICsgZGF0YWZsYXNoX2luZm9baV0ubG9naWNhbF9hZGRyZXNzOwotCQkJZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFtqXS5wcm90ZWN0ZWQgPSBhcmVhX2xpc3Rbal0ucHJvdGVjdGVkOworCQkJaWYoZm91bmRbaV0hPTApIHsKKwkJCQlkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLnN0YXJ0ID0KKwkJCQkJYXJlYV9saXN0W3BhcnRdLnN0YXJ0ICsKKwkJCQkJZGF0YWZsYXNoX2luZm9baV0ubG9naWNhbF9hZGRyZXNzOworCQkJCWlmKGFyZWFfbGlzdFtwYXJ0XS5lbmQgPT0gMHhmZmZmZmZmZikgeworCQkJCQlkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLmVuZCA9CisJCQkJCQlkYXRhZmxhc2hfaW5mb1tpXS5lbmRfYWRkcmVzcyArCisJCQkJCQlkYXRhZmxhc2hfaW5mbwlbaV0ubG9naWNhbF9hZGRyZXNzOworCQkJCQlsYXN0X3BhcnQgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5hcmVhX2xpc3Rbal0uZW5kID0KKwkJCQkJCWFyZWFfbGlzdFtwYXJ0XS5lbmQgKworCQkJCQkJZGF0YWZsYXNoX2luZm9baV0ubG9naWNhbF9hZGRyZXNzOworCQkJCX0KKwkJCQlwcm90ZWN0ZWQgPSBhcmVhX2xpc3RbcGFydF0ucHJvdGVjdGVkOworCQkJCS8qIFNldCB0aGUgZW52aXJvbm1lbnQgYWNjb3JkaW5nIHRvIHRoZSBsYWJlbC4uLiovCisJCQkJaWYocHJvdGVjdGVkID09IEZMQUdfUFJPVEVDVF9JTlZBTElEKSB7CisJCQkJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5hcmVhX2xpc3Rbal0ucHJvdGVjdGVkID0KKwkJCQkJCUZMQUdfUFJPVEVDVF9JTlZBTElEOworCQkJCX0gZWxzZSB7CisJCQkJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5hcmVhX2xpc3Rbal0ucHJvdGVjdGVkID0KKwkJCQkJCXByb3RlY3RlZDsKKwkJCQl9CisJCQkJc3RyY3B5KChjaGFyKikoZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFtqXS5sYWJlbCksCisJCQkJCQkoY29uc3QgY2hhciAqKWFyZWFfbGlzdFtwYXJ0XS5sYWJlbCk7CisJCQl9CisJCQlwYXJ0Kys7CiAJCX0KIAl9Ci0JcmV0dXJuICgxKTsKKwlyZXR1cm4gZm91bmRbMF07CiB9CiAKKyNpZmRlZglDT05GSUdfTkVXX0RGX1BBUlRJVElPTgoraW50IEFUOTFGX0RhdGFmbGFzaFNldEVudiAodm9pZCkKK3sKKwlpbnQgaSwgajsKKwlpbnQgcGFydDsKKwl1bnNpZ25lZCBjaGFyIGVudjsKKwl1bnNpZ25lZCBjaGFyIHNbMzJdOwkvKiBXaWxsIGZpdCBhIGxvbmcgaW50IGluIGhleCAqLworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJZm9yIChpID0gMCwgcGFydD0gMDsgaSA8IENGR19NQVhfREFUQUZMQVNIX0JBTktTOyBpKyspIHsKKwkJZm9yKGogPSAwOyBqPE5CX0RBVEFGTEFTSF9BUkVBOyBqKyspIHsKKwkJCWVudiA9IGFyZWFfbGlzdFtwYXJ0XS5zZXRlbnY7CisJCQkvKiBTZXQgdGhlIGVudmlyb25tZW50IGFjY29yZGluZyB0byB0aGUgbGFiZWwuLi4qLworCQkJaWYoKGVudiAmIEZMQUdfU0VURU5WKSA9PSBGTEFHX1NFVEVOVikgeworCQkJCXN0YXJ0ID0KKwkJCQlkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLnN0YXJ0OworCQkJCXNwcmludGYocywiJVgiLHN0YXJ0KTsKKwkJCQlzZXRlbnYoYXJlYV9saXN0W3BhcnRdLmxhYmVsLHMpOworCQkJfQorCQkJcGFydCsrOworCQl9CisJfQorfQorI2VuZGlmCiAKIHZvaWQgZGF0YWZsYXNoX3ByaW50X2luZm8gKHZvaWQpCiB7CkBAIC0xMzEsMjUgKzI0MCwyNSBAQAogCiAJZm9yIChpID0gMDsgaSA8IENGR19NQVhfREFUQUZMQVNIX0JBTktTOyBpKyspIHsKIAkJaWYgKGRhdGFmbGFzaF9pbmZvW2ldLmlkICE9IDApIHsKLQkJCXByaW50ZiAoIkRhdGFGbGFzaDoiKTsKKwkJCXByaW50ZigiRGF0YUZsYXNoOiIpOwogCQkJc3dpdGNoIChkYXRhZmxhc2hfaW5mb1tpXS5pZCkgewogCQkJY2FzZSBBVDQ1REIxNjE6Ci0JCQkJcHJpbnRmICgiQVQ0NURCMTYxXG4iKTsKKwkJCQlwcmludGYoIkFUNDVEQjE2MVxuIik7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQVQ0NURCMzIxOgotCQkJCXByaW50ZiAoIkFUNDVEQjMyMVxuIik7CisJCQkJcHJpbnRmKCJBVDQ1REIzMjFcbiIpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFUNDVEQjY0MjoKLQkJCQlwcmludGYgKCJBVDQ1REI2NDJcbiIpOworCQkJCXByaW50ZigiQVQ0NURCNjQyXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQVQ0NURCMTI4OgotCQkJCXByaW50ZiAoIkFUNDVEQjEyOFxuIik7CisJCQkJcHJpbnRmKCJBVDQ1REIxMjhcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlwcmludGYgKCJOYiBwYWdlczogJTZkXG4iCisJCQlwcmludGYoIk5iIHBhZ2VzOiAlNmRcbiIKIAkJCQkiUGFnZSBTaXplOiAlNmRcbiIKIAkJCQkiU2l6ZT0lOGQgYnl0ZXNcbiIKIAkJCQkiTG9naWNhbCBhZGRyZXNzOiAweCUwOFhcbiIsCkBAIC0xNTksMjggKzI2OCw0NCBAQAogCQkJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5wYWdlc19zaXplLAogCQkJCSh1bnNpZ25lZCBpbnQpIGRhdGFmbGFzaF9pbmZvW2ldLmxvZ2ljYWxfYWRkcmVzcyk7CiAJCQlmb3IgKGo9MDsgajwgTkJfREFUQUZMQVNIX0FSRUE7IGorKykgewotCQkJCXByaW50ZiAoIkFyZWEgJWk6XHQlMDhsWCB0byAlMDhsWCAlc1xuIiwgaiwKLQkJCQkJZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFtqXS5zdGFydCwKLQkJCQkJZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFtqXS5lbmQsCi0JCQkJCShkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLnByb3RlY3RlZCA9PQotCQkJCQlGTEFHX1BST1RFQ1RfU0VUKSA/ICIoUk8pIiA6ICIiKTsKKwkJCQlzd2l0Y2goZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFtqXS5wcm90ZWN0ZWQpIHsKKwkJCQljYXNlCUZMQUdfUFJPVEVDVF9TRVQ6CisJCQkJY2FzZQlGTEFHX1BST1RFQ1RfQ0xFQVI6CisJCQkJCXByaW50ZigiQXJlYSAlaTpcdCUwOGxYIHRvICUwOGxYICVzIiwgaiwKKwkJCQkJCWRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5hcmVhX2xpc3Rbal0uc3RhcnQsCisJCQkJCQlkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLmVuZCwKKwkJCQkJCShkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLnByb3RlY3RlZD09RkxBR19QUk9URUNUX1NFVCkgPyAiKFJPKSIgOiAiICAgICIpOworI2lmZGVmCUNPTkZJR19ORVdfREZfUEFSVElUSU9OCisJCQkJCQlwcmludGYoIiAlc1xuIiwJZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFtqXS5sYWJlbCk7CisjZWxzZQorCQkJCQkJcHJpbnRmKCJcbiIpOworI2VuZGlmCisJCQkJCWJyZWFrOworI2lmZGVmCUNPTkZJR19ORVdfREZfUEFSVElUSU9OCisJCQkJY2FzZQlGTEFHX1BST1RFQ1RfSU5WQUxJRDoKKwkJCQkJYnJlYWs7CisjZW5kaWYKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CiB9CiAKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFmbGFzaFNlbGVjdCAJCQkJCSovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogU2VsZWN0IHRoZSBjb3JyZWN0IGRldmljZQkJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotQVQ5MVBTX0RhdGFGbGFzaCBBVDkxRl9EYXRhZmxhc2hTZWxlY3QgKEFUOTFQU19EYXRhRmxhc2ggcEZsYXNoLCB1bnNpZ25lZCBsb25nICphZGRyKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IEFUOTFGX0RhdGFmbGFzaFNlbGVjdCAJCQkJICAgICAqLworLyogT2JqZWN0ICAgICAgICAgICAgICA6IFNlbGVjdCB0aGUgY29ycmVjdCBkZXZpY2UJCQkgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitBVDkxUFNfRGF0YUZsYXNoIEFUOTFGX0RhdGFmbGFzaFNlbGVjdCAoQVQ5MVBTX0RhdGFGbGFzaCBwRmxhc2gsCisJCQkJdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAljaGFyIGFkZHJfdmFsaWQgPSAwOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IENGR19NQVhfREFUQUZMQVNIX0JBTktTOyBpKyspCi0JCWlmICgoKmFkZHIgJiAweEZGMDAwMDAwKSA9PSBkYXRhZmxhc2hfaW5mb1tpXS5sb2dpY2FsX2FkZHJlc3MpIHsKKwkJaWYgKCBkYXRhZmxhc2hfaW5mb1tpXS5pZAorCQkJJiYgKCgoKGludCkgYWRkcikgJiAweEZGMDAwMDAwKSA9PQorCQkJZGF0YWZsYXNoX2luZm9baV0ubG9naWNhbF9hZGRyZXNzKSkgewogCQkJYWRkcl92YWxpZCA9IDE7CiAJCQlicmVhazsKIAkJfQpAQCAtMTk0LDEwICszMTksMTAgQEAKIAlyZXR1cm4gKHBGbGFzaCk7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBhZGRyX2RhdGFmbGFzaCAJCQkJCSovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogVGVzdCBpZiBhZGRyZXNzIGlzIHZhbGlkCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGdW5jdGlvbiBOYW1lICAgICAgIDogYWRkcl9kYXRhZmxhc2ggCQkgICAgCQkgICAgICovCisvKiBPYmplY3QgICAgICAgICAgICAgIDogVGVzdCBpZiBhZGRyZXNzIGlzIHZhbGlkCQkJICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50IGFkZHJfZGF0YWZsYXNoICh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJaW50IGFkZHJfdmFsaWQgPSAwOwpAQCAtMjEzLDI1ICszMzgsMjcgQEAKIAogCXJldHVybiBhZGRyX3ZhbGlkOwogfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogc2l6ZV9kYXRhZmxhc2ggCQkJCQkqLwotLyogT2JqZWN0ICAgICAgICAgICAgICA6IFRlc3QgaWYgYWRkcmVzcyBpcyB2YWxpZCByZWdhcmRpbmcgdGhlIHNpemUJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBzaXplX2RhdGFmbGFzaCAoQVQ5MVBTX0RhdGFGbGFzaCBwZGF0YUZsYXNoLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBzaXplX2RhdGFmbGFzaCAJCQkJICAgICAqLworLyogT2JqZWN0ICAgICAgICAgICAgICA6IFRlc3QgaWYgYWRkcmVzcyBpcyB2YWxpZCByZWdhcmRpbmcgdGhlIHNpemUJICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNpemVfZGF0YWZsYXNoIChBVDkxUFNfRGF0YUZsYXNoIHBkYXRhRmxhc2gsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAkvKiBpcyBvdXRzaWRlIHRoZSBkYXRhZmxhc2ggKi8KIAlpZiAoKChpbnQpYWRkciAmIDB4MEZGRkZGRkYpID4gKHBkYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX3NpemUgKgogCQlwZGF0YUZsYXNoLT5wRGV2aWNlLT5wYWdlc19udW1iZXIpKSByZXR1cm4gMDsKIAkvKiBpcyB0b28gbGFyZ2UgZm9yIHRoZSBkYXRhZmxhc2ggKi8KIAlpZiAoc2l6ZSA+ICgocGRhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfc2l6ZSAqCi0JCXBkYXRhRmxhc2gtPnBEZXZpY2UtPnBhZ2VzX251bWJlcikgLSAoKGludClhZGRyICYgMHgwRkZGRkZGRikpKSByZXR1cm4gMDsKKwkJcGRhdGFGbGFzaC0+cERldmljZS0+cGFnZXNfbnVtYmVyKSAtCisJCSgoaW50KWFkZHIgJiAweDBGRkZGRkZGKSkpIHJldHVybiAwOwogCiAJcmV0dXJuIDE7CiB9Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBwcm90X2RhdGFmbGFzaCAJCQkJCSovCi0vKiBPYmplY3QgICAgICAgICAgICAgIDogVGVzdCBpZiBkZXN0aW5hdGlvbiBhcmVhIGlzIHByb3RlY3RlZAkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiBwcm90X2RhdGFmbGFzaCAJCQkJICAgICAqLworLyogT2JqZWN0ICAgICAgICAgICAgICA6IFRlc3QgaWYgZGVzdGluYXRpb24gYXJlYSBpcyBwcm90ZWN0ZWQJCSAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludCBwcm90X2RhdGFmbGFzaCAoQVQ5MVBTX0RhdGFGbGFzaCBwZGF0YUZsYXNoLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiBpbnQgYXJlYTsKQEAgLTI0MSwxNyArMzY4LDIzIEBACiAJCQkoYWRkciA8IHBkYXRhRmxhc2gtPnBEZXZpY2UtPmFyZWFfbGlzdFthcmVhXS5lbmQpKQogCQkJYnJlYWs7CiAJfQotCWlmIChhcmVhID09IE5CX0RBVEFGTEFTSF9BUkVBKSByZXR1cm4gLTE7CisJaWYgKGFyZWEgPT0gTkJfREFUQUZMQVNIX0FSRUEpCisJCXJldHVybiAtMTsKKwogCS8qdGVzdCBwcm90ZWN0aW9uIHZhbHVlKi8KLQlpZiAocGRhdGFGbGFzaC0+cERldmljZS0+YXJlYV9saXN0W2FyZWFdLnByb3RlY3RlZCA9PSBGTEFHX1BST1RFQ1RfU0VUKSByZXR1cm4gMDsKKwlpZiAocGRhdGFGbGFzaC0+cERldmljZS0+YXJlYV9saXN0W2FyZWFdLnByb3RlY3RlZCA9PSBGTEFHX1BST1RFQ1RfU0VUKQorCQlyZXR1cm4gMDsKKwlpZiAocGRhdGFGbGFzaC0+cERldmljZS0+YXJlYV9saXN0W2FyZWFdLnByb3RlY3RlZCA9PSBGTEFHX1BST1RFQ1RfSU5WQUxJRCkKKwkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKIH0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gTmFtZSAgICAgICA6IGRhdGFmbGFzaF9yZWFsX3Byb3RlY3QJCQkJKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiBwcm90ZWN0L3VucHJvdGVjdCBhcmVhCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBkYXRhZmxhc2hfcmVhbF9wcm90ZWN0IChpbnQgZmxhZywgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCB1bnNpZ25lZCBsb25nIGVuZF9hZGRyKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGdW5jdGlvbiBOYW1lICAgICAgIDogZGF0YWZsYXNoX3JlYWxfcHJvdGVjdAkJCQkgICAgKi8KKy8qIE9iamVjdCAgICAgICAgICAgICAgOiBwcm90ZWN0L3VucHJvdGVjdCBhcmVhCQkJCSAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgZGF0YWZsYXNoX3JlYWxfcHJvdGVjdCAoaW50IGZsYWcsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwKKwkJCQl1bnNpZ25lZCBsb25nIGVuZF9hZGRyKQogewogaW50IGksaiwgYXJlYTEsIGFyZWEyLCBhZGRyX3ZhbGlkID0gMDsKIAkvKiBmaW5kIGRhdGFmbGFzaCAqLwpAQCAtMjY3LDI3ICs0MDAsMzggQEAKIAl9CiAJLyogZmluZCBzdGFydCBhcmVhICovCiAJZm9yIChhcmVhMT0wOyBhcmVhMSA8IE5CX0RBVEFGTEFTSF9BUkVBOyBhcmVhMSsrKSB7Ci0JCWlmIChzdGFydF9hZGRyID09IGRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5hcmVhX2xpc3RbYXJlYTFdLnN0YXJ0KSBicmVhazsKKwkJaWYgKHN0YXJ0X2FkZHIgPT0gZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFthcmVhMV0uc3RhcnQpCisJCQlicmVhazsKIAl9CiAJaWYgKGFyZWExID09IE5CX0RBVEFGTEFTSF9BUkVBKSByZXR1cm4gLTE7CiAJLyogZmluZCBlbmQgYXJlYSAqLwogCWZvciAoYXJlYTI9MDsgYXJlYTIgPCBOQl9EQVRBRkxBU0hfQVJFQTsgYXJlYTIrKykgewotCQlpZiAoZW5kX2FkZHIgPT0gZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFthcmVhMl0uZW5kKSBicmVhazsKKwkJaWYgKGVuZF9hZGRyID09IGRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5hcmVhX2xpc3RbYXJlYTJdLmVuZCkKKwkJCWJyZWFrOwogCX0KLQlpZiAoYXJlYTIgPT0gTkJfREFUQUZMQVNIX0FSRUEpIHJldHVybiAtMTsKKwlpZiAoYXJlYTIgPT0gTkJfREFUQUZMQVNIX0FSRUEpCisJCXJldHVybiAtMTsKIAogCS8qc2V0IHByb3RlY3Rpb24gdmFsdWUqLwogCWZvcihqID0gYXJlYTE7IGogPCBhcmVhMisxIDsgaisrKQotCQlpZiAoZmxhZyA9PSAwKSBkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLnByb3RlY3RlZCA9IEZMQUdfUFJPVEVDVF9DTEVBUjsKLQkJZWxzZSBkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLnByb3RlY3RlZCA9IEZMQUdfUFJPVEVDVF9TRVQ7CisJCWlmKGRhdGFmbGFzaF9pbmZvW2ldLkRldmljZS5hcmVhX2xpc3Rbal0ucHJvdGVjdGVkCisJCQkJIT0gRkxBR19QUk9URUNUX0lOVkFMSUQpIHsKKwkJCWlmIChmbGFnID09IDApIHsKKwkJCQlkYXRhZmxhc2hfaW5mb1tpXS5EZXZpY2UuYXJlYV9saXN0W2pdLnByb3RlY3RlZAorCQkJCQk9IEZMQUdfUFJPVEVDVF9DTEVBUjsKKwkJCX0gZWxzZSB7CisJCQkJZGF0YWZsYXNoX2luZm9baV0uRGV2aWNlLmFyZWFfbGlzdFtqXS5wcm90ZWN0ZWQKKwkJCQkJPSBGTEFHX1BST1RFQ1RfU0VUOworCQkJfQorCQl9CiAKIAlyZXR1cm4gKGFyZWEyLWFyZWExKzEpOwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogcmVhZF9kYXRhZmxhc2ggCQkJCQkqLwotLyogT2JqZWN0ICAgICAgICAgICAgICA6IGRhdGFmbGFzaCBtZW1vcnkgcmVhZAkJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZ1bmN0aW9uIE5hbWUgICAgICAgOiByZWFkX2RhdGFmbGFzaCAJCQkJICAgICAqLworLyogT2JqZWN0ICAgICAgICAgICAgICA6IGRhdGFmbGFzaCBtZW1vcnkgcmVhZAkJCQkgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQgcmVhZF9kYXRhZmxhc2ggKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBjaGFyICpyZXN1bHQpCiB7CiAJdW5zaWduZWQgbG9uZyBBZGRyVG9SZWFkID0gYWRkcjsKQEAgLTMwNSwxMiArNDQ5LDEyIEBACiB9CiAKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBOYW1lICAgICAgIDogd3JpdGVfZGF0YWZsYXNoIAkJCQkgICAgICAgKi8KLS8qIE9iamVjdCAgICAgICAgICAgICAgOiB3cml0ZSBhIGJsb2NrIGluIGRhdGFmbGFzaAkJCSAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGdW5jdGlvbiBOYW1lICAgICAgIDogd3JpdGVfZGF0YWZsYXNoIAkJCQkgICAgICovCisvKiBPYmplY3QgICAgICAgICAgICAgIDogd3JpdGUgYSBibG9jayBpbiBkYXRhZmxhc2gJCQkgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQgd3JpdGVfZGF0YWZsYXNoICh1bnNpZ25lZCBsb25nIGFkZHJfZGVzdCwgdW5zaWduZWQgbG9uZyBhZGRyX3NyYywKLQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUpCisJCQl1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBBZGRyVG9Xcml0ZSA9IGFkZHJfZGVzdDsKIAlBVDkxUFNfRGF0YUZsYXNoIHBGbGFzaCA9ICZEYXRhRmxhc2hJbnN0OwpAQCAtMzI5LDcgKzQ3Myw4IEBACiAJaWYgKEFkZHJUb1dyaXRlID09IC0xKQogCQlyZXR1cm4gLTE7CiAKLQlyZXR1cm4gQVQ5MUZfRGF0YUZsYXNoV3JpdGUgKHBGbGFzaCwgKHVjaGFyICopYWRkcl9zcmMsIEFkZHJUb1dyaXRlLCBzaXplKTsKKwlyZXR1cm4gQVQ5MUZfRGF0YUZsYXNoV3JpdGUgKHBGbGFzaCwgKHVjaGFyICopYWRkcl9zcmMsCisJCQkJCQlBZGRyVG9Xcml0ZSwgc2l6ZSk7CiB9CiAKIApAQCAtMzM5LDIyICs0ODQsMjIgQEAKIAljYXNlIEVSUl9PSzoKIAkJYnJlYWs7CiAJY2FzZSBFUlJfVElNT1VUOgotCQlwcmludGYgKCJUaW1lb3V0IHdyaXRpbmcgdG8gRGF0YUZsYXNoXG4iKTsKKwkJcHJpbnRmKCJUaW1lb3V0IHdyaXRpbmcgdG8gRGF0YUZsYXNoXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBFUlJfUFJPVEVDVEVEOgotCQlwcmludGYgKCJDYW4ndCB3cml0ZSB0byBwcm90ZWN0ZWQgRGF0YUZsYXNoIHNlY3RvcnNcbiIpOworCQlwcmludGYoIkNhbid0IHdyaXRlIHRvIHByb3RlY3RlZC9pbnZhbGlkIERhdGFGbGFzaCBzZWN0b3JzXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBFUlJfSU5WQUw6Ci0JCXByaW50ZiAoIk91dHNpZGUgYXZhaWxhYmxlIERhdGFGbGFzaFxuIik7CisJCXByaW50ZigiT3V0c2lkZSBhdmFpbGFibGUgRGF0YUZsYXNoXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBFUlJfVU5LTk9XTl9GTEFTSF9UWVBFOgotCQlwcmludGYgKCJVbmtub3duIFR5cGUgb2YgRGF0YUZsYXNoXG4iKTsKKwkJcHJpbnRmKCJVbmtub3duIFR5cGUgb2YgRGF0YUZsYXNoXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBFUlJfUFJPR19FUlJPUjoKLQkJcHJpbnRmICgiR2VuZXJhbCBEYXRhRmxhc2ggUHJvZ3JhbW1pbmcgRXJyb3JcbiIpOworCQlwcmludGYoIkdlbmVyYWwgRGF0YUZsYXNoIFByb2dyYW1taW5nIEVycm9yXG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRmICgiJXNbJWRdIEZJWE1FOiByYz0lZFxuIiwgX19GSUxFX18sIF9fTElORV9fLCBlcnIpOworCQlwcmludGYoIiVzWyVkXSBGSVhNRTogcmM9JWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgZXJyKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kYzIxMTR4LmMgYi9kcml2ZXJzL2RjMjExNHguYwppbmRleCBjNDNjZDVlLi5kNTI3NWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RjMjExNHguYworKysgYi9kcml2ZXJzL2RjMjExNHguYwpAQCAtMjAsOCArMjAsOCBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAotCSYmIGRlZmluZWQoQ09ORklHX1RVTElQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX1RVTElQKQogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CkBAIC03NjgsNCArNzY4LDQgQEAKIH0KICNlbmRpZgkvKiBVUERBVEVfU1JPTSAqLwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQgJiYgQ09ORklHX05FVF9NVUxUSSAmJiBDT05GSUdfVFVMSVAgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbTkwMDB4LmMgYi9kcml2ZXJzL2RtOTAwMHguYwppbmRleCA2ODc3MDc2Li43OGFjYjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtOTAwMHguYworKysgYi9kcml2ZXJzL2RtOTAwMHguYwpAQCAtMzAyLDYgKzMwMiwyMSBAQAogCS8qIFNldCBOb2RlIGFkZHJlc3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQkoKHUxNiAqKSBiZC0+YmlfZW5ldGFkZHIpW2ldID0gcmVhZF9zcm9tX3dvcmQoaSk7CisKKwlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcihiZC0+YmlfZW5ldGFkZHIpICYmCisJICAgICFpc19tdXRsaWNhc3RfZXRoZXJfYWRkcihiZC0+YmlfZW5ldGFkZHIpKSB7CisJCS8qIHRyeSByZWFkaW5nIGZyb20gZW52aXJvbm1lbnQgKi8KKwkJdTggaTsKKwkJY2hhciAqcywgKmU7CisJCXMgPSBnZXRlbnYgKCJldGhhZGRyIik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKKwkJCWJkLT5iaV9lbmV0YWRkcltpXSA9IHMgPworCQkJCXNpbXBsZV9zdHJ0b3VsIChzLCAmZSwgMTYpIDogMDsKKwkJCWlmIChzKQorCQkJCXMgPSAoKmUpID8gZSArIDEgOiBlOworCQl9CisJfQorCiAJcHJpbnRmKCJNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBiZC0+YmlfZW5ldGFkZHJbMF0sCiAJICAgICAgIGJkLT5iaV9lbmV0YWRkclsxXSwgYmQtPmJpX2VuZXRhZGRyWzJdLCBiZC0+YmlfZW5ldGFkZHJbM10sCiAJICAgICAgIGJkLT5iaV9lbmV0YWRkcls0XSwgYmQtPmJpX2VuZXRhZGRyWzVdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZTEwMDAuYyBiL2RyaXZlcnMvZTEwMDAuYwppbmRleCA5MjdhY2JiLi5mMDc0MWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2UxMDAwLmMKKysrIGIvZHJpdmVycy9lMTAwMC5jCkBAIC00NCw4ICs0NCw4IEBACiAKICNpbmNsdWRlICJlMTAwMC5oIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKLQlkZWZpbmVkKENPTkZJR19FMTAwMCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19FMTAwMCkKIAogI2RlZmluZSBUT1VUX0xPT1AgICAxMDAwMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZXBybzEwMC5jIGIvZHJpdmVycy9lZXBybzEwMC5jCmluZGV4IDA0YzE3ZjYuLjczODE0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWVwcm8xMDAuYworKysgYi9kcml2ZXJzL2VlcHJvMTAwLmMKQEAgLTMwLDggKzMwLDggQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAotCWRlZmluZWQoQ09ORklHX0VFUFJPMTAwKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX0VFUFJPMTAwKQogCiAJLyogRXRoZXJuZXQgY2hpcCByZWdpc3RlcnMuCiAJICovCkBAIC0yNzIsNyArMjcyLDcgQEAKIAkqKHZvbGF0aWxlIHUzMiAqKSAoKGFkZHIgKyBkZXYtPmlvYmFzZSkpID0gY3B1X3RvX2xlMzIgKGNvbW1hbmQpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogc3RhdGljIGlubGluZSBpbnQgSU5MIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCB1X2xvbmcgYWRkcikKIHsKIAlyZXR1cm4gbGUzMl90b19jcHUgKCoodm9sYXRpbGUgdTMyICopIChhZGRyICsgZGV2LT5pb2Jhc2UpKTsKQEAgLTM4Niw3ICszODYsNyBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogLyogV2FpdCBmb3IgdGhlIGNoaXAgZ2V0IHRoZSBjb21tYW5kLgogKi8KQEAgLTQ2Miw3ICs0NjIsNyBAQAogCiAJCWV0aF9yZWdpc3RlciAoZGV2KTsKIAotI2lmIGRlZmluZWQgKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkIChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCQkvKiByZWdpc3RlciBtaWkgY29tbWFuZCBhY2Nlc3Mgcm91dGluZXMgKi8KIAkJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJCQllZXBybzEwMF9taWlwaHlfcmVhZCwgZWVwcm8xMDBfbWlpcGh5X3dyaXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZW5jMjhqNjAuYyBiL2RyaXZlcnMvZW5jMjhqNjAuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZzbF9pMmMuYyBiL2RyaXZlcnMvZnNsX2kyYy5jCmluZGV4IGViYWU1YWYuLjIyNDg1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZnNsX2kyYy5jCisrKyBiL2RyaXZlcnMvZnNsX2kyYy5jCkBAIC02OSw5ICs2OSwxMCBAQAogCWRldiA9IChzdHJ1Y3QgZnNsX2kyYyAqKSAoQ0ZHX0lNTVIgKyBDRkdfSTJDMl9PRkZTRVQpOwogCiAJd3JpdGViKDAsICZkZXYtPmNyKTsJCQkvKiBzdG9wIEkyQyBjb250cm9sbGVyICovCisJdWRlbGF5KDUpOwkJCQkvKiBsZXQgaXQgc2h1dGRvd24gaW4gcGVhY2UgKi8KIAl3cml0ZWIoMHgzRiwgJmRldi0+ZmRyKTsJCS8qIHNldCBidXMgc3BlZWQgKi8KIAl3cml0ZWIoMHgzRiwgJmRldi0+ZGZzcnIpOwkJLyogc2V0IGRlZmF1bHQgZmlsdGVyICovCi0Jd3JpdGViKHNsYXZlYWRkLCAmZGV2LT5hZHIpOwkJLyogd3JpdGUgc2xhdmUgYWRkcmVzcyAqLworCXdyaXRlYihzbGF2ZWFkZCA8PCAxLCAmZGV2LT5hZHIpOwkvKiB3cml0ZSBzbGF2ZSBhZGRyZXNzICovCiAJd3JpdGViKDB4MCwgJmRldi0+c3IpOwkJCS8qIGNsZWFyIHN0YXR1cyByZWdpc3RlciAqLwogCXdyaXRlYihJMkNfQ1JfTUVOLCAmZGV2LT5jcik7CQkvKiBzdGFydCBJMkMgY29udHJvbGxlciAqLwogI2VuZGlmCS8qIENGR19JMkMyX09GRlNFVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mc2xfcGNpX2luaXQuYyBiL2RyaXZlcnMvZnNsX3BjaV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4NGRjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnNsX3BjaV9pbml0LmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19GU0xfUENJX0lOSVQKKworLyoKKyAqIFBDSS9QQ0lFIENvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24gZm9yIG1wYzg1eHgvbXBjODZ4eCBzb2MncworICoKKyAqIEluaXRpYWxpemUgY29udHJvbGxlciBhbmQgY2FsbCB0aGUgY29tbW9uIGRyaXZlci9wY2kgcGNpX2hvc2Vfc2NhbiB0bworICogc2NhbiBmb3IgYnJpZGdlcyBhbmQgZGV2aWNlcy4KKyAqCisgKiBIb3NlIGZpZWxkcyB3aGljaCBuZWVkIHRvIGJlIHByZS1pbml0aWFsaXplZCBieSBib2FyZCBzcGVjaWZpYyBjb2RlOgorICogICByZWdpb25zW10KKyAqICAgZmlyc3RfYnVzbm8KKyAqCisgKiBGaWVsZHMgdXBkYXRlZDoKKyAqICAgbGFzdF9idXNubworICovCisKKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vaW1tYXBfZnNsX3BjaS5oPgorCit2b2lkIHBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCXBjaV9kZXZfdCBkZXYsIGludCBzdWJfYnVzKTsKK3ZvaWQgcGNpYXV0b19wb3N0c2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCXBjaV9kZXZfdCBkZXYsIGludCBzdWJfYnVzKTsKKwordm9pZCBwY2lhdXRvX2NvbmZpZ19pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7Cit2b2lkCitmc2xfcGNpX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXUxNiB0ZW1wMTY7CisJdTMyIHRlbXAzMjsKKwlpbnQgYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKKwlpbnQgZW5hYmxlZDsKKwl1MTYgbHRzc207CisJdTggdGVtcDg7CisJaW50IHI7CisJaW50IGJyaWRnZTsKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIGhvc2UtPmNmZ19hZGRyOworCXBjaV9kZXZfdCBkZXYgPSBQQ0lfQkRGKGJ1c25vLDAsMCk7CisKKwkvKiBJbml0aWFsaXplIEFUTVUgcmVnaXN0ZXJzIGJhc2VkIG9uIGhvc2UgcmVnaW9ucyBhbmQgZmxhZ3MgKi8KKwl2b2xhdGlsZSBwb3RfdCAqcG89JnBjaS0+cG90WzFdOwkvKiBza2lwIDAgKi8KKwl2b2xhdGlsZSBwaXRfdCAqcGk9JnBjaS0+cGl0WzBdOwkvKiByYW5nZXMgZnJvbTogMyB0byAxICovCisKKyNpZmRlZiBERUJVRworCWludCBuZWdfbGlua193OworI2VuZGlmCisKKwlmb3IgKHI9MDsgcjxob3NlLT5yZWdpb25fY291bnQ7IHIrKykgeworCQlpZiAoaG9zZS0+cmVnaW9uc1tyXS5mbGFncyAmIFBDSV9SRUdJT05fTUVNT1JZKSB7IC8qIGluYm91bmQgKi8KKwkJCXBpLT5waXRhciA9IChob3NlLT5yZWdpb25zW3JdLmJ1c19zdGFydCA+PiAxMikgJiAweDAwMGZmZmZmOworCQkJcGktPnBpd2JhciA9IChob3NlLT5yZWdpb25zW3JdLnBoeXNfc3RhcnQgPj4gMTIpICYgMHgwMDBmZmZmZjsKKwkJCXBpLT5waXdiZWFyID0gMDsKKwkJCXBpLT5waXdhciA9IFBJV0FSX0VOIHwgUElXQVJfUEYgfCBQSVdBUl9MT0NBTCB8CisJCQkJUElXQVJfUkVBRF9TTk9PUCB8IFBJV0FSX1dSSVRFX1NOT09QIHwKKwkJCQkoX19pbG9nMihob3NlLT5yZWdpb25zW3JdLnNpemUpIC0gMSk7CisJCQlwaSsrOworCQl9IGVsc2UgeyAvKiBPdXRib3VuZCAqLworCQkJcG8tPnBvd2JhciA9IChob3NlLT5yZWdpb25zW3JdLnBoeXNfc3RhcnQgPj4gMTIpICYgMHgwMDBmZmZmZjsKKwkJCXBvLT5wb3RhciA9IChob3NlLT5yZWdpb25zW3JdLmJ1c19zdGFydCA+PiAxMikgJiAweDAwMGZmZmZmOworCQkJcG8tPnBvdGVhciA9IDA7CisJCQlpZiAoaG9zZS0+cmVnaW9uc1tyXS5mbGFncyAmIFBDSV9SRUdJT05fSU8pCisJCQkJcG8tPnBvd2FyID0gUE9XQVJfRU4gfCBQT1dBUl9JT19SRUFEIHwgUE9XQVJfSU9fV1JJVEUgfAorCQkJCQkoX19pbG9nMihob3NlLT5yZWdpb25zW3JdLnNpemUpIC0gMSk7CisJCQllbHNlCisJCQkJcG8tPnBvd2FyID0gUE9XQVJfRU4gfCBQT1dBUl9NRU1fUkVBRCB8IFBPV0FSX01FTV9XUklURSB8CisJCQkJCShfX2lsb2cyKGhvc2UtPnJlZ2lvbnNbcl0uc2l6ZSkgLSAxKTsKKwkJCXBvKys7CisJCX0KKwl9CisKKwlwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKKwlwY2lhdXRvX2NvbmZpZ19pbml0KGhvc2UpOwkvKiBncmFiIHBjaV97bWVtLHByZWZldGNoLGlvfSAqLworCWhvc2UtPmN1cnJlbnRfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKKworCXBjaS0+cGVkciA9IDB4ZmZmZmZmZmY7CQkvKiBDbGVhciBhbnkgZXJyb3JzICovCisJcGNpLT5wZWVyID0gfjB4MjAxNDA7CQkvKiBFbmFibGUgQWxsIEVycm9yIEludGVydXB0cyBleGNlcHQKKwkJCQkJICogLSBNYXN0ZXIgYWJvcnQgKHBjaSkKKwkJCQkJICogLSBNYXN0ZXIgUEVSUiAocGNpKQorCQkJCQkgKiAtIElDQ0EgKFBDSWUpCisJCQkJCSAqLworCXBjaV9ob3NlX3JlYWRfY29uZmlnX2R3b3JkIChob3NlLCBkZXYsIFBDSV9EQ1IsICZ0ZW1wMzIpOworCXRlbXAzMiB8PSAweGYwMDBlOwkJLyogc2V0IFVSUiwgRkVSLCBORkVSIChidXQgbm90IENFUikgKi8KKwlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfRENSLCB0ZW1wMzIpOworCisJcGNpX2hvc2VfcmVhZF9jb25maWdfYnl0ZSAoaG9zZSwgZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZ0ZW1wOCk7CisJYnJpZGdlID0gdGVtcDggJiBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOyAvKiBCcmlkZ2UsIHN1Y2ggYXMgcGNpZSAqLworCisJaWYgKCBicmlkZ2UgKSB7CisKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9MVFNTTSwgJmx0c3NtKTsKKwkJZW5hYmxlZCA9IGx0c3NtID49IFBDSV9MVFNTTV9MMDsKKworCQlpZiAoIWVuYWJsZWQpIHsKKwkJCWRlYnVnKCIuLi4uUENJRSBsaW5rIGVycm9yLiAgU2tpcHBpbmcgc2Nhbi4iCisJCQkgICAgICAiTFRTU009MHglMDJ4XG4iLCBsdHNzbSk7CisJCQlob3NlLT5sYXN0X2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CisJCQlyZXR1cm47CisJCX0KKworCQlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwkJcGNpLT5wbWVfbXNnX2ludF9lbiA9IDB4ZmZmZmZmZmY7CisjaWZkZWYgREVCVUcKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9MU1IsICZ0ZW1wMTYpOworCQluZWdfbGlua193ID0gKHRlbXAxNiAmIDB4M2YwICkgPj4gNDsKKwkJcHJpbnRmKCIuLi5QQ0lFIExUU1NNPTB4JXgsIE5lZ290aWF0ZWQgbGluayB3aWR0aD0lZFxuIiwKKwkJICAgICAgbHRzc20sIG5lZ19saW5rX3cpOworI2VuZGlmCisJCWhvc2UtPmN1cnJlbnRfYnVzbm8rKzsgLyogU3RhcnQgc2NhbiB3aXRoIHNlY29uZGFyeSAqLworCQlwY2lhdXRvX3ByZXNjYW5fc2V0dXBfYnJpZGdlKGhvc2UsIGRldiwgaG9zZS0+Y3VycmVudF9idXNubyk7CisKKwl9CisKKwkvKiBDYWxsIHNldHVwIHRvIGFsbG9jYXRlIFBDU1JCQVIgd2luZG93ICovCisJcGNpYXV0b19zZXR1cF9kZXZpY2UoaG9zZSwgZGV2LCAxLCBob3NlLT5wY2lfbWVtLAorCQkJICAgICBob3NlLT5wY2lfcHJlZmV0Y2gsIGhvc2UtPnBjaV9pbyk7CisjaWZuZGVmIENPTkZJR19QQ0lfTk9TQ0FOCisJcHJpbnRmICgiICAgICAgICAgICAgICAgU2Nhbm5pbmcgUENJIGJ1cyAlMDJ4XG4iLCBob3NlLT5jdXJyZW50X2J1c25vKTsKKwlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbl9idXMoaG9zZSxob3NlLT5jdXJyZW50X2J1c25vKTsKKworCWlmICggYnJpZGdlICkgeyAvKiB1cGRhdGUgbGltaXQgcmVncyBhbmQgc3Vib3JkaW5hdGUgYnVzbm8gKi8KKwkJcGNpYXV0b19wb3N0c2Nhbl9zZXR1cF9icmlkZ2UoaG9zZSwgZGV2LCBob3NlLT5sYXN0X2J1c25vKTsKKwl9CisjZWxzZQorCWhvc2UtPmxhc3RfYnVzbm8gPSBob3NlLT5jdXJyZW50X2J1c25vOworI2VuZGlmCisKKwkvKiBDbGVhciBhbGwgZXJyb3IgaW5kaWNhdGlvbnMgKi8KKworCXBjaS0+cG1lX21zZ19kZXQgPSAweGZmZmZmZmZmOworCXBjaS0+cGVkciA9IDB4ZmZmZmZmZmY7CisKKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkIChob3NlLCBkZXYsIFBDSV9EU1IsICZ0ZW1wMTYpOworCWlmICh0ZW1wMTYpIHsKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LAorCQkJCQlQQ0lfRFNSLCAweGZmZmYpOworCX0KKworCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQgKGhvc2UsIGRldiwgUENJX1NFQ19TVEFUVVMsICZ0ZW1wMTYpOworCWlmICh0ZW1wMTYpIHsKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfU0VDX1NUQVRVUywgMHhmZmZmKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRlNMX1BDSSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmNhLWlwX3N3LmMgYi9kcml2ZXJzL2luY2EtaXBfc3cuYwppbmRleCBhYjIyYjRkLi5lNGFhZWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luY2EtaXBfc3cuYworKysgYi9kcml2ZXJzL2luY2EtaXBfc3cuYwpAQCAtMjYsOCArMjYsOCBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAotCSYmIGRlZmluZWQoQ09ORklHX0lOQ0FfSVBfU1dJVENIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX0lOQ0FfSVBfU1dJVENIKQogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzcDExNngtaGNkLmMgYi9kcml2ZXJzL2lzcDExNngtaGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyYmM3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXNwMTE2eC1oY2QuYwpAQCAtMCwwICsxLDE0MTMgQEAKKy8qCisgKiBJU1AxMTZ4IEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikgZm9yIHUtYm9vdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBsaW51eC5pdD4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEV1cm90ZWNoIFMucC5BLiA8aW5mb0BldXJvdGVjaC5pdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKgorICogRGVyaXZlZCBpbiBwYXJ0IGZyb20gdGhlIFNMODExIEhDRCBkcml2ZXIgInUtYm9vdC9kcml2ZXJzL3NsODExX3VzYi5jIgorICogKG9yaWdpbmFsIGNvcHlyaWdodCBtZXNzYWdlIGZvbGxvd3MpOgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNAorICogICAgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAgICBUaGlzIGNvZGUgaXMgYmFzZWQgb24gbGludXggZHJpdmVyIGZvciBzbDgxMWhzIGNoaXAsIHNvdXJjZSBhdAorICogICAgZHJpdmVycy91c2IvaG9zdC9zbDgxMS5jOgorICoKKyAqICAgIFNMODExIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgZHJpdmVyIGZvciBVU0IuCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDAzLzA2LCBDb3VyYWdlIENvLiwgTHRkLgorICoKKyAqICAgIEJhc2VkIG9uOgorICogICAgICAgICAxLnVoY2kuYyBieSBMaW51cyBUb3J2YWxkcywgSm9oYW5uZXMgRXJkZmVsdCwgUmFuZHkgRHVubGFwLAorICogICAgICAgICAgIEdlb3JnIEFjaGVyLCBEZXRpIEZsaWVnbCwgVGhvbWFzIFNhaWxlciwgUm9tYW4gV2Vpc3NnYWVyYmVyLAorICogICAgICAgICAgIEFkYW0gUmljaHRlciwgR3JlZ29yeSBQLiBTbWl0aDsKKyAqICAgICAgICAgMi5PcmlnaW5hbCBTTDgxMSBkcml2ZXIgKGhjX3NsODExLm8pIGJ5IFBlaSBMaXUgPHBibEBjeXByZXNzLmNvbT4KKyAqICAgICAgICAgMy5SZXdyaXRlZCBhcyBzbDgxMS5vIGJ5IFlpbiBBaWh1YSA8eWluYWg6Y291cmFnZXRlY2guY29tLmNuPgorICoKKyAqICAgIFtbR05VL0dQTCBkaXNjbGFpbWVyXV0KKyAqCisgKiBhbmQgaW4gcGFydCBmcm9tIEFVMXgwMCBPSENJIEhDRCBkcml2ZXIgInUtYm9vdC9jcHUvbWlwcy9hdTF4MDBfdXNiX29oY2kuYyIKKyAqIChvcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZSBmb2xsb3dzKToKKyAqCisgKiAgICBVUkIgT0hDSSBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0Igb24gdGhlIEFVMXgwMC4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDMKKyAqICAgIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxnakBkZW54LmRlPgorICoKKyAqICAgIFtbR05VL0dQTCBkaXNjbGFpbWVyXV0KKyAqCisgKiAgICBOb3RlOiBQYXJ0IG9mIHRoaXMgY29kZSBoYXMgYmVlbiBkZXJpdmVkIGZyb20gbGludXgKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfVVNCX0lTUDExNlhfSENECisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8dXNiLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisvKgorICogSVNQMTE2eCBjaGlwcyByZXF1aXJlIGNlcnRhaW4gZGVsYXlzIGJldHdlZW4gYWNjZXNzZXMgdG8gaXRzCisgKiByZWdpc3RlcnMuIFRoZSBmb2xsb3dpbmcgdGltaW5nIG9wdGlvbnMgZXhpc3QuCisgKgorICogMS4gQ29uZmlndXJlIHlvdXIgbWVtb3J5IGNvbnRyb2xsZXIgKHRoZSBiZXN0KQorICogMi4gVXNlIG5kZWxheSAoZWFzaWVzdCwgcG9vcmVzdCkuIEZvciB0aGF0LCBlbmFibGUgdGhlIGZvbGxvd2luZyBtYWNyby4KKyAqCisgKiBWYWx1ZSBpcyBpbiBtaWNyb3NlY29uZHMuCisgKi8KKyNpZmRlZiBJU1AxMTZYX0hDRF9VU0VfVURFTEFZCisjZGVmaW5lIFVERUxBWQkJMQorI2VuZGlmCisKKy8qCisgKiBPbiBzb21lIChzbG93bHk/KSBtYWNoaW5lcyBhbiBleHRyYSBkZWxheSBhZnRlciBkYXRhIHBhY2tpbmcgaW50bworICogY29udHJvbGxlcidzIEZJRk9zIGlzIHJlcXVpcmVkLCAqIG90aGVyd2lzZSB5b3UgbWF5IGdldCB0aGUgZm9sbG93aW5nCisgKiBlcnJvcjoKKyAqCisgKiAgIHVib290PiB1c2Igc3RhcnQKKyAqICAgKFJlKXN0YXJ0IFVTQi4uLgorICogICBVU0I6ICAgc2Nhbm5pbmcgYnVzIGZvciBkZXZpY2VzLi4uIGlzcDExNng6IGlzcDExNnhfc3VibWl0X2pvYjogQ1RMOlRJTUVPVVQKKyAqICAgaXNwMTE2eDogaXNwMTE2eF9zdWJtaXRfam9iOiAqKioqKiogRklGTyBub3QgcmVhZHkhICoqKioqKgorICoKKyAqICAgICAgICAgVVNCIGRldmljZSBub3QgcmVzcG9uZGluZywgZ2l2aW5nIHVwIChzdGF0dXM9NCkKKyAqICAgICAgICAgaXNwMTE2eDogaXNwMTE2eF9zdWJtaXRfam9iOiAqKioqKiogRklGTyBub3QgZW1wdHkhICoqKioqKgorICogICAgICAgICBpc3AxMTZ4OiBpc3AxMTZ4X3N1Ym1pdF9qb2I6ICoqKioqKiBGSUZPIG5vdCBlbXB0eSEgKioqKioqCisgKiAgICAgICAgIGlzcDExNng6IGlzcDExNnhfc3VibWl0X2pvYjogKioqKioqIEZJRk8gbm90IGVtcHR5ISAqKioqKioKKyAqICAgICAgICAgMyBVU0IgRGV2aWNlKHMpIGZvdW5kCisgKiAgICAgICAgICAgICAgICBzY2FubmluZyBidXMgZm9yIHN0b3JhZ2UgZGV2aWNlcy4uLiAwIFN0b3JhZ2UgRGV2aWNlKHMpIGZvdW5kCisgKgorICogVmFsdWUgaXMgaW4gbWlsbGlzZWNvbmRzLgorICovCisjaWZkZWYgSVNQMTE2WF9IQ0RfVVNFX0VYVFJBX0RFTEFZCisjZGVmaW5lIEVYVFJBX0RFTEFZCTIKKyNlbmRpZgorCisvKgorICogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBpZiB5b3Ugd2lzaCBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzLgorICovCisjdW5kZWYgREVCVUcJCQkvKiBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjdW5kZWYgVFJBQ0UJCQkvKiBlbmFibGUgdHJhY2luZyBjb2RlICovCisjdW5kZWYgVkVSQk9TRQkJCS8qIHZlcmJvc2UgZGVidWdnaW5nIG1lc3NhZ2VzICovCisKKyNpbmNsdWRlICJpc3AxMTZ4LmgiCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjA4IEphbiAyMDA3Igorc3RhdGljIGNvbnN0IGNoYXIgaGNkX25hbWVbXSA9ICJpc3AxMTZ4LWhjZCI7CisKK3N0cnVjdCBpc3AxMTZ4IGlzcDExNnhfZGV2Oworc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSBpc3AxMTZ4X2JvYXJkOworaW50IGdvdF9yaHNjID0gMDsJCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KK3N0cnVjdCB1c2JfZGV2aWNlICpkZXZnb25lOwkvKiBkZXZpY2Ugd2hpY2ggd2FzIGRpc2Nvbm5lY3RlZCAqLworaW50IHJoX2Rldm51bSA9IDA7CQkvKiBhZGRyZXNzIG9mIFJvb3QgSHViIGVuZHBvaW50ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBBTElHTih4LGEpCSgoKHgpKyhhKS0xVUwpJn4oKGEpLTFVTCkpCisjZGVmaW5lIG1pbl90KHR5cGUseCx5KQlcCisJKHsgdHlwZSBfX3ggPSAoeCk7IHR5cGUgX195ID0gKHkpOyBfX3ggPCBfX3kgPyBfX3ggOiBfX3k7IH0pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBpc3AxMTZ4X3Jlc2V0KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KTsKKworLyogLS0tIERlYnVnZ2luZyBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIGlzcDExNnhfc2hvd19yZWcoZCwgcikgewkJCQlcCisJaWYgKChyKSA8IDB4MjApIHsJCQkJCVwKKwkJREJHKCIlLTEyc1slMDJ4XTogJTA4eCIsICNyLAkJCVwKKwkJCXIsIGlzcDExNnhfcmVhZF9yZWczMihkLCByKSk7CQlcCisJfSBlbHNlIHsJCQkJCQlcCisJCURCRygiJS0xMnNbJTAyeF06ICAgICAlMDR4IiwgI3IsCQlcCisJCQlyLCBpc3AxMTZ4X3JlYWRfcmVnMTYoZCwgcikpOyAgCQlcCisJfQkJCQkJCQlcCit9CisKKyNkZWZpbmUgaXNwMTE2eF9zaG93X3JlZ3MoZCkgewkJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENSRVZJU0lPTik7CQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENDT05UUk9MKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENDTURTVEFUKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENJTlRTVEFUKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENJTlRFTkIpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0ZNSU5UVkwpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0ZNUkVNKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENGTU5VTSk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDTFNUSFJFU0gpOwkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhERVNDQSk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhERVNDQik7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhTVEFUVVMpOwkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhQT1JUMSk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhQT1JUMik7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDSFdDRkcpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0RNQUNGRyk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDWEZFUkNUUik7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDdVBJTlQpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ3VQSU5URU5CKTsJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0NISVBJRCk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDU0NSQVRDSCk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDSVRMQlVGTEVOKTsJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0FUTEJVRkxFTik7CQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENCVUZTVEFUKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENSRElUTDBMRU4pOwkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkRJVEwxTEVOKTsJCQlcCit9CisKKyNpZiBkZWZpbmVkKFRSQUNFKQorCitzdGF0aWMgaW50IGlzcDExNnhfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gJmlzcDExNnhfZGV2OworCisJcmV0dXJuIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0ZNTlVNKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCSAgICAgaW50IGxlbiwgY2hhciAqc3RyKQoreworI2lmIGRlZmluZWQoVkVSQk9TRSkKKwlpbnQgaTsKKyNlbmRpZgorCisJREJHKCIlcyBVUkI6WyU0eF0gZGV2OiUyZCxlcDolMmQtJWMsdHlwZTolcyxsZW46JWQgc3RhdDolI2x4IiwKKwkgICAgc3RyLAorCSAgICBpc3AxMTZ4X2dldF9jdXJyZW50X2ZyYW1lX251bWJlcihkZXYpLAorCSAgICB1c2JfcGlwZWRldmljZShwaXBlKSwKKwkgICAgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwKKwkgICAgdXNiX3BpcGVvdXQocGlwZSkgPyAnTycgOiAnSScsCisJICAgIHVzYl9waXBldHlwZShwaXBlKSA8IDIgPworCSAgICAodXNiX3BpcGVpbnQocGlwZSkgPworCSAgICAgIklOVFIiIDogIklTT0MiKSA6CisJICAgICh1c2JfcGlwZWNvbnRyb2wocGlwZSkgPyAiQ1RSTCIgOiAiQlVMSyIpLCBsZW4sIGRldi0+c3RhdHVzKTsKKyNpZiBkZWZpbmVkKFZFUkJPU0UpCisJaWYgKGxlbiA+IDAgJiYgYnVmZmVyKSB7CisJCXByaW50ZihfX0ZJTEVfXyAiOiBkYXRhKCVkKToiLCBsZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgaSA8IGxlbjsgaSsrKQorCQkJcHJpbnRmKCIgJTAyeCIsICgoX191OCAqKSBidWZmZXIpW2ldKTsKKwkJcHJpbnRmKCIlc1xuIiwgaSA8IGxlbiA/ICIuLi4iIDogIiIpOworCX0KKyNlbmRpZgorfQorCisjZGVmaW5lIFBURF9ESVJfU1RSKHB0ZCkgICh7Y2hhciBfX2M7CQlcCisJc3dpdGNoKFBURF9HRVRfRElSKHB0ZCkpewkJXAorCWNhc2UgMDogIF9fYyA9ICdzJzsgYnJlYWs7CQlcCisJY2FzZSAxOiAgX19jID0gJ28nOyBicmVhazsJCVwKKwlkZWZhdWx0OiBfX2MgPSAnaSc7IGJyZWFrOwkJXAorCX07IF9fYzt9KQorCisvKgorICBEdW1wIFBURCBpbmZvLiBUaGUgY29kZSBkb2N1bWVudHMgdGhlIGZvcm1hdAorICBwZXJmZWN0bHksIHJpZ2h0IDopCisqLworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcHRkKHN0cnVjdCBwdGQgKnB0ZCkKK3sKKyNpZiBkZWZpbmVkKFZFUkJPU0UpCisJaW50IGs7CisjZW5kaWYKKworCURCRygiUFREKGV4dCkgOiBjYzoleCAlZCVjJWQgJWQsJWQsJWQgdDoleCAleCV4JXgiLAorCSAgICBQVERfR0VUX0NDKHB0ZCksCisJICAgIFBURF9HRVRfRkEocHRkKSwgUFREX0RJUl9TVFIocHRkKSwgUFREX0dFVF9FUChwdGQpLAorCSAgICBQVERfR0VUX0NPVU5UKHB0ZCksIFBURF9HRVRfTEVOKHB0ZCksIFBURF9HRVRfTVBTKHB0ZCksCisJICAgIFBURF9HRVRfVE9HR0xFKHB0ZCksCisJICAgIFBURF9HRVRfQUNUSVZFKHB0ZCksIFBURF9HRVRfU1BEKHB0ZCksIFBURF9HRVRfTEFTVChwdGQpKTsKKyNpZiBkZWZpbmVkKFZFUkJPU0UpCisJcHJpbnRmKCJpc3AxMTZ4OiAlczogUFREKGJ5dGUpOiAiLCBfX0ZVTkNUSU9OX18pOworCWZvciAoayA9IDA7IGsgPCBzaXplb2Yoc3RydWN0IHB0ZCk7ICsraykKKwkJcHJpbnRmKCIlMDJ4ICIsICgodTggKikgcHRkKVtrXSk7CisJcHJpbnRmKCJcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3B0ZF9kYXRhKHN0cnVjdCBwdGQgKnB0ZCwgdTggKiBidWYsIGludCB0eXBlKQoreworI2lmIGRlZmluZWQoVkVSQk9TRSkKKwlpbnQgazsKKworCWlmICh0eXBlID09IDAgLyogMHV0IGRhdGEgKi8gKSB7CisJCXByaW50ZigiaXNwMTE2eDogJXM6IG91dCBkYXRhOiAiLCBfX0ZVTkNUSU9OX18pOworCQlmb3IgKGsgPSAwOyBrIDwgUFREX0dFVF9MRU4ocHRkKTsgKytrKQorCQkJcHJpbnRmKCIlMDJ4ICIsICgodTggKikgYnVmKVtrXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisJaWYgKHR5cGUgPT0gMSAvKiAxbiBkYXRhICovICkgeworCQlwcmludGYoImlzcDExNng6ICVzOiBpbiBkYXRhOiAiLCBfX0ZVTkNUSU9OX18pOworCQlmb3IgKGsgPSAwOyBrIDwgUFREX0dFVF9DT1VOVChwdGQpOyArK2spCisJCQlwcmludGYoIiUwMnggIiwgKCh1OCAqKSBidWYpW2tdKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKworCWlmIChQVERfR0VUX0xBU1QocHRkKSkKKwkJREJHKCItLS0gbGFzdCBQVEQgLS0tIik7CisjZW5kaWYKK30KKworI2Vsc2UKKworI2RlZmluZSBkdW1wX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgbGVuLCBzdHIpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkdW1wX3BrdChkZXYsIHBpcGUsIGJ1ZmZlciwgbGVuLCBzZXR1cCwgc3RyLCBzbWFsbCkJZG8ge30gd2hpbGUgKDApCisKKyNkZWZpbmUgZHVtcF9wdGQocHRkKQkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkdW1wX3B0ZF9kYXRhKHB0ZCwgYnVmLCB0eXBlKQlkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCisKKy8qIC0tLSBWaXJ0dWFsIFJvb3QgSHViIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRGV2aWNlIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2Rldl9kZXNbXSA9IHsKKwkweDEyLAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDEsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgRGV2aWNlICovCisJMHgxMCwJCQkvKiAgX191MTYgYmNkVVNCOyB2MS4xICovCisJMHgwMSwKKwkweDA5LAkJCS8qICBfX3U4ICBiRGV2aWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJCQkvKiAgX191OCAgYkRldmljZVByb3RvY29sOyAqLworCTB4MDgsCQkJLyogIF9fdTggIGJNYXhQYWNrZXRTaXplMDsgOCBCeXRlcyAqLworCTB4MDAsCQkJLyogIF9fdTE2IGlkVmVuZG9yOyAqLworCTB4MDAsCisJMHgwMCwJCQkvKiAgX191MTYgaWRQcm9kdWN0OyAqLworCTB4MDAsCisJMHgwMCwJCQkvKiAgX191MTYgYmNkRGV2aWNlOyAqLworCTB4MDAsCisJMHgwMCwJCQkvKiAgX191OCAgaU1hbnVmYWN0dXJlcjsgKi8KKwkweDAxLAkJCS8qICBfX3U4ICBpUHJvZHVjdDsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpU2VyaWFsTnVtYmVyOyAqLworCTB4MDEJCQkvKiAgX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOyAqLworfTsKKworLyogQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yICovCitzdGF0aWMgX191OCByb290X2h1Yl9jb25maWdfZGVzW10gPSB7CisJMHgwOSwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAyLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IENvbmZpZ3VyYXRpb24gKi8KKwkweDE5LAkJCS8qICBfX3UxNiB3VG90YWxMZW5ndGg7ICovCisJMHgwMCwKKwkweDAxLAkJCS8qICBfX3U4ICBiTnVtSW50ZXJmYWNlczsgKi8KKwkweDAxLAkJCS8qICBfX3U4ICBiQ29uZmlndXJhdGlvblZhbHVlOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlDb25maWd1cmF0aW9uOyAqLworCTB4NDAsCQkJLyogIF9fdTggIGJtQXR0cmlidXRlczsKKwkJCQkgICBCaXQgNzogQnVzLXBvd2VyZWQsIDY6IFNlbGYtcG93ZXJlZCwgNSBSZW1vdGUtd2Frd3VwLCA0Li4wOiByZXN2ZCAqLworCTB4MDAsCQkJLyogIF9fdTggIE1heFBvd2VyOyAqLworCisJLyogaW50ZXJmYWNlICovCisJMHgwOSwJCQkvKiAgX191OCAgaWZfYkxlbmd0aDsgKi8KKwkweDA0LAkJCS8qICBfX3U4ICBpZl9iRGVzY3JpcHRvclR5cGU7IEludGVyZmFjZSAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2JJbnRlcmZhY2VOdW1iZXI7ICovCisJMHgwMCwJCQkvKiAgX191OCAgaWZfYkFsdGVybmF0ZVNldHRpbmc7ICovCisJMHgwMSwJCQkvKiAgX191OCAgaWZfYk51bUVuZHBvaW50czsgKi8KKwkweDA5LAkJCS8qICBfX3U4ICBpZl9iSW50ZXJmYWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpZl9iSW50ZXJmYWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJCQkvKiAgX191OCAgaWZfYkludGVyZmFjZVByb3RvY29sOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2lJbnRlcmZhY2U7ICovCisKKwkvKiBlbmRwb2ludCAqLworCTB4MDcsCQkJLyogIF9fdTggIGVwX2JMZW5ndGg7ICovCisJMHgwNSwJCQkvKiAgX191OCAgZXBfYkRlc2NyaXB0b3JUeXBlOyBFbmRwb2ludCAqLworCTB4ODEsCQkJLyogIF9fdTggIGVwX2JFbmRwb2ludEFkZHJlc3M7IElOIEVuZHBvaW50IDEgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBlcF9ibUF0dHJpYnV0ZXM7IEludGVycnVwdCAqLworCTB4MDAsCQkJLyogIF9fdTE2IGVwX3dNYXhQYWNrZXRTaXplOyAoKE1BWF9ST09UX1BPUlRTICsgMSkgLyA4ICovCisJMHgwMiwKKwkweGZmCQkJLyogIF9fdTggIGVwX2JJbnRlcnZhbDsgMjU1IG1zICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciByb290X2h1Yl9zdHJfaW5kZXgwW10gPSB7CisJMHgwNCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJMHgwOSwJCQkvKiAgX191OCAgbGFuZyBJRCAqLworCTB4MDQsCQkJLyogIF9fdTggIGxhbmcgSUQgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX3N0cl9pbmRleDFbXSA9IHsKKwkweDIyLAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDMsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgU3RyaW5nLWRlc2NyaXB0b3IgKi8KKwknSScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ1MnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdQJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknMScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJzEnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSc2JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkneCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdSJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd0JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd1JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknYicsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCit9OworCisvKgorICogSHViIGNsYXNzLXNwZWNpZmljIGRlc2NyaXB0b3IgaXMgY29uc3RydWN0ZWQgZHluYW1pY2FsbHkKKyAqLworCisvKiAtLS0gVmlydHVhbCByb290IGh1YiBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcmhfY2hlY2tfcG9ydF9zdGF0dXMoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTMyIHRlbXAsIG5kcCwgaTsKKwlpbnQgcmVzOworCisJcmVzID0gLTE7CisJdGVtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTKTsKKwluZHAgPSAodGVtcCAmIFJIX0FfTkRQKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmRwOyBpKyspIHsKKwkJdGVtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyBpKTsKKwkJLyogY2hlY2sgZm9yIGEgZGV2aWNlIGRpc2Nvbm5lY3QgKi8KKwkJaWYgKCgodGVtcCAmIChSSF9QU19QRVNDIHwgUkhfUFNfQ1NDKSkgPT0KKwkJICAgICAoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpICYmICgodGVtcCAmIFJIX1BTX0NDUykgPT0gMCkpIHsKKwkJCXJlcyA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiAtLS0gSEMgbWFuYWdlbWVudCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdyaXRlIGxlbiBieXRlcyB0byBmaWZvLCBwYWQgdGlsbCAzMi1iaXQgYm91bmRhcnkKKyAqLworc3RhdGljIHZvaWQgd3JpdGVfcHRkZGF0YV90b19maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB2b2lkICpidWYsIGludCBsZW4pCit7CisJdTggKmRwID0gKHU4ICopIGJ1ZjsKKwl1MTYgKmRwMiA9ICh1MTYgKikgYnVmOworCXUxNiB3OworCWludCBxdW90ID0gbGVuICUgNDsKKworCWlmICgodW5zaWduZWQgbG9uZylkcDIgJiAxKSB7CisJCS8qIG5vdCBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikgeworCQkJdyA9ICpkcCsrOworCQkJdyB8PSAqZHArKyA8PCA4OworCQkJaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KGlzcDExNngsIHcpOworCQl9CisJCWlmIChsZW4pCisJCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCAodTE2KSAqIGRwKTsKKwl9IGVsc2UgeworCQkvKiBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikKKwkJCWlzcDExNnhfcmF3X3dyaXRlX2RhdGExNihpc3AxMTZ4LCAqZHAyKyspOworCQlpZiAobGVuKQorCQkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgMHhmZiAmICooKHU4ICopIGRwMikpOworCX0KKwlpZiAocXVvdCA9PSAxIHx8IHF1b3QgPT0gMikKKwkJaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KGlzcDExNngsIDApOworfQorCisvKiBSZWFkIGxlbiBieXRlcyBmcm9tIGZpZm8gYW5kIHRoZW4gcmVhZCB0aWxsIDMyLWJpdCBib3VuZGFyeQorICovCitzdGF0aWMgdm9pZCByZWFkX3B0ZGRhdGFfZnJvbV9maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB2b2lkICpidWYsIGludCBsZW4pCit7CisJdTggKmRwID0gKHU4ICopIGJ1ZjsKKwl1MTYgKmRwMiA9ICh1MTYgKikgYnVmOworCXUxNiB3OworCWludCBxdW90ID0gbGVuICUgNDsKKworCWlmICgodW5zaWduZWQgbG9uZylkcDIgJiAxKSB7CisJCS8qIG5vdCBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikgeworCQkJdyA9IGlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQkJKmRwKysgPSB3ICYgMHhmZjsKKwkJCSpkcCsrID0gKHcgPj4gOCkgJiAweGZmOworCQl9CisJCWlmIChsZW4pCisJCQkqZHAgPSAweGZmICYgaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwl9IGVsc2UgeworCQkvKiBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikKKwkJCSpkcDIrKyA9IGlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlpZiAobGVuKQorCQkJKih1OCAqKSBkcDIgPSAweGZmICYgaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwl9CisJaWYgKHF1b3QgPT0gMSB8fCBxdW90ID09IDIpCisJCWlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworfQorCisvKiBXcml0ZSBQVEQncyBhbmQgZGF0YSBmb3Igc2NoZWR1bGVkIHRyYW5zZmVycyBpbnRvIHRoZSBmaWZvIHJhbS4KKyAqIEZpZm8gbXVzdCBiZSBlbXB0eSBhbmQgcmVhZHkgKi8KK3N0YXRpYyB2b2lkIHBhY2tfZmlmbyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBwaXBlLCBzdHJ1Y3QgcHRkICpwdGQsIGludCBuLCB2b2lkICpkYXRhLAorCQkgICAgICBpbnQgbGVuKQoreworCWludCBidWZsZW4gPSBuICogc2l6ZW9mKHN0cnVjdCBwdGQpICsgbGVuOworCWludCBpLCBkb25lOworCisJREJHKCItLS0gcGFjayBidWZmZXIgJXAgLSAlZCBieXRlcyAoZmlmbyAlZCkgLS0tIiwgZGF0YSwgbGVuLCBidWZsZW4pOworCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5ULCBIQ3VQSU5UX0FJSUVPVCk7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ1hGRVJDVFIsIGJ1Zmxlbik7CisJaXNwMTE2eF93cml0ZV9hZGRyKGlzcDExNngsIEhDQVRMUE9SVCB8IElTUDExNnhfV1JJVEVfT0ZGU0VUKTsKKworCWRvbmUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJREJHKCJpPSVkIC0gZG9uZT0lZCAtIGxlbj0lZCIsIGksIGRvbmUsIFBURF9HRVRfTEVOKCZwdGRbaV0pKTsKKworCQlkdW1wX3B0ZCgmcHRkW2ldKTsKKwkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgcHRkW2ldLmNvdW50KTsKKwkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgcHRkW2ldLm1wcyk7CisJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsIHB0ZFtpXS5sZW4pOworCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCBwdGRbaV0uZmFkZHIpOworCisJCWR1bXBfcHRkX2RhdGEoJnB0ZFtpXSwgKF9fdTggKikgZGF0YSArIGRvbmUsIDApOworCQl3cml0ZV9wdGRkYXRhX3RvX2ZpZm8oaXNwMTE2eCwKKwkJCQkgICAgICAoX191OCAqKSBkYXRhICsgZG9uZSwKKwkJCQkgICAgICBQVERfR0VUX0xFTigmcHRkW2ldKSk7CisKKwkJZG9uZSArPSBQVERfR0VUX0xFTigmcHRkW2ldKTsKKwl9Cit9CisKKy8qIFJlYWQgdGhlIHByb2Nlc3NlZCBQVEQncyBhbmQgZGF0YSBmcm9tIGZpZm8gcmFtIGJhY2sgdG8gVVJCcycgYnVmZmVycy4KKyAqIEZpZm8gbXVzdCBiZSBmdWxsIGFuZCBkb25lICovCitzdGF0aWMgaW50IHVucGFja19maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBwaXBlLCBzdHJ1Y3QgcHRkICpwdGQsIGludCBuLCB2b2lkICpkYXRhLAorCQkgICAgICAgaW50IGxlbikKK3sKKwlpbnQgYnVmbGVuID0gbiAqIHNpemVvZihzdHJ1Y3QgcHRkKSArIGxlbjsKKwlpbnQgaSwgZG9uZSwgY2MsIHJldDsKKworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVCwgSEN1UElOVF9BSUlFT1QpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSENYRkVSQ1RSLCBidWZsZW4pOworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCBIQ0FUTFBPUlQpOworCisJcmV0ID0gVERfQ0NfTk9FUlJPUjsKKwlkb25lID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCURCRygiaT0lZCAtIGRvbmU9JWQgLSBsZW49JWQiLCBpLCBkb25lLCBQVERfR0VUX0xFTigmcHRkW2ldKSk7CisKKwkJcHRkW2ldLmNvdW50ID0gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJcHRkW2ldLm1wcyA9IGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJCXB0ZFtpXS5sZW4gPSBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlwdGRbaV0uZmFkZHIgPSBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlkdW1wX3B0ZCgmcHRkW2ldKTsKKworCQlyZWFkX3B0ZGRhdGFfZnJvbV9maWZvKGlzcDExNngsCisJCQkJICAgICAgIChfX3U4ICopIGRhdGEgKyBkb25lLAorCQkJCSAgICAgICBQVERfR0VUX0xFTigmcHRkW2ldKSk7CisJCWR1bXBfcHRkX2RhdGEoJnB0ZFtpXSwgKF9fdTggKikgZGF0YSArIGRvbmUsIDEpOworCisJCWRvbmUgKz0gUFREX0dFVF9MRU4oJnB0ZFtpXSk7CisKKwkJY2MgPSBQVERfR0VUX0NDKCZwdGRbaV0pOworCQlpZiAoY2MgPT0gVERfREFUQVVOREVSUlVOKSB7CS8qIHVuZGVycnVuIGlzIG5vIGVycm9yLi4uICovCisJCQlEQkcoImFsbG93ZWQgZGF0YSB1bmRlcnJ1biIpOworCQkJY2MgPSBURF9DQ19OT0VSUk9SOworCQl9CisJCWlmIChjYyAhPSBURF9DQ19OT0VSUk9SICYmIHJldCA9PSBURF9DQ19OT0VSUk9SKQorCQkJcmV0ID0gY2M7CisJfQorCisJREJHKCItLS0gdW5wYWNrIGJ1ZmZlciAlcCAtICVkIGJ5dGVzIChmaWZvICVkKSAtLS0iLCBkYXRhLCBsZW4sIGJ1Zmxlbik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBJbnRlcnJ1cHQgaGFuZGxpbmcKKyAqLworc3RhdGljIGludCBpc3AxMTZ4X2ludGVycnVwdChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwl1MTYgaXJxc3RhdDsKKwl1MzIgaW50c3RhdDsKKwlpbnQgcmV0ID0gMDsKKworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgMCk7CisJaXJxc3RhdCA9IGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5UKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIGlycXN0YXQpOworCURCRygiPj4+Pj4+IGlycXN0YXQgJXggPDw8PDw8IiwgaXJxc3RhdCk7CisKKwlpZiAoaXJxc3RhdCAmIEhDdVBJTlRfQVRMKSB7CisJCURCRygiPj4+Pj4+IEhDdVBJTlRfQVRMIDw8PDw8PCIpOworCQl1ZGVsYXkoNTAwKTsKKwkJcmV0ID0gMTsKKwl9CisKKwlpZiAoaXJxc3RhdCAmIEhDdVBJTlRfT1BSKSB7CisJCWludHN0YXQgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENJTlRTVEFUKTsKKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0lOVFNUQVQsIGludHN0YXQpOworCQlEQkcoIj4+Pj4+PiBIQ3VQSU5UX09QUiAleCA8PDw8PDwiLCBpbnRzdGF0KTsKKworCQlpZiAoaW50c3RhdCAmIEhDSU5UX1VFKSB7CisJCQlFUlIoInVucmVjb3ZlcmFibGUgZXJyb3IsIGNvbnRyb2xsZXIgZGlzYWJsZWQiKTsKKworCQkJLyogRklYTUU6IGJlIG9wdGltaXN0aWMsIGhvcGUgdGhhdCBidWcgd29uJ3QgcmVwZWF0CisJCQkgKiBvZnRlbi4gTWFrZSBzb21lIG5vbi1pbnRlcnJ1cHQgY29udGV4dCByZXN0YXJ0IHRoZQorCQkJICogY29udHJvbGxlci4gQ291bnQgYW5kIGxpbWl0IHRoZSByZXRyaWVzIHRob3VnaDsKKwkJCSAqIGVpdGhlciBoYXJkd2FyZSBvciBzb2Z0d2FyZSBlcnJvcnMgY2FuIGdvIGZvcmV2ZXIuLi4KKwkJCSAqLworCQkJaXNwMTE2eF9yZXNldChpc3AxMTZ4KTsKKwkJCXJldCA9IC0xOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGludHN0YXQgJiBIQ0lOVF9SSFNDKSB7CisJCQlnb3RfcmhzYyA9IDE7CisJCQlyZXQgPSAxOworCQkJLyogV2hlbiByb290IGh1YiBvciBhbnkgb2YgaXRzIHBvcnRzIGlzIGdvaW5nCisJCQkgICB0byBjb21lIG91dCBvZiBzdXNwZW5kLCBpdCBtYXkgdGFrZSBtb3JlCisJCQkgICB0aGFuIDEwbXMgZm9yIHN0YXR1cyBiaXRzIHRvIHN0YWJpbGl6ZS4gKi8KKwkJCXdhaXRfbXMoMjApOworCQl9CisKKwkJaWYgKGludHN0YXQgJiBIQ0lOVF9TTykgeworCQkJRVJSKCJzY2hlZHVsZSBvdmVycnVuIik7CisJCQlyZXQgPSAtMTsKKwkJfQorCisJCWlycXN0YXQgJj0gfkhDdVBJTlRfT1BSOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUFREX05VTQkJCTY0CS8qIGl0IHNob3VsZCBiZSBlbm91Z3RoLi4uICovCitzdHJ1Y3QgcHRkIHB0ZFtQVERfTlVNXTsKK3N0YXRpYyBpbmxpbmUgaW50IG1heF90cmFuc2Zlcl9sZW4oc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlKQoreworCXJldHVybiBtaW4oUFREX05VTSAqIHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlKSwgUFREX05VTSAqIDE2KTsKK30KKworLyogRG8gYW4gVVNCIHRyYW5zZmVyCisgKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9zdWJtaXRfam9iKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKKwkJCSAgICAgIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9ICZpc3AxMTZ4X2RldjsKKwlpbnQgdHlwZSA9IHVzYl9waXBldHlwZShwaXBlKTsKKwlpbnQgZXBudW0gPSB1c2JfcGlwZWVuZHBvaW50KHBpcGUpOworCWludCBtYXggPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7CisJaW50IGRpcl9vdXQgPSB1c2JfcGlwZW91dChwaXBlKTsKKwlpbnQgc3BlZWRfbG93ID0gdXNiX3BpcGVzbG93KHBpcGUpOworCWludCBpLCBkb25lLCBzdGF0LCB0aW1lb3V0LCBjYzsKKwlpbnQgcmV0cmllcyA9IDEwOworCisJREJHKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlkdW1wX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgbGVuLCAiU1VCTUlUIik7CisJREJHKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworCWlmIChpc3AxMTZ4LT5kaXNhYmxlZCkgeworCQlFUlIoIkVQSVBFIik7CisJCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBkZXZpY2UgcHVsbGVkPyBTaG9ydGN1dCB0aGUgYWN0aW9uLiAqLworCWlmIChkZXZnb25lID09IGRldikgeworCQlFUlIoIkVOT0RFViIpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQlyZXR1cm4gVVNCX1NUX0NSQ19FUlI7CisJfQorCisJaWYgKCFtYXgpIHsKKwkJRVJSKCJwaXBlc2l6ZSBmb3IgcGlwZSAlbHggaXMgemVybyIsIHBpcGUpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHR5cGUgPT0gUElQRV9JU09DSFJPTk9VUykgeworCQlFUlIoImlzb2Nocm9ub3VzIHRyYW5zZmVycyBub3Qgc3VwcG9ydGVkIik7CisJCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBGSUZPIG5vdCBlbXB0eT8gKi8KKwlpZiAoaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDQlVGU1RBVCkgJiBIQ0JVRlNUQVRfQVRMX0ZVTEwpIHsKKwkJRVJSKCIqKioqKiogRklGTyBub3QgZW1wdHkhICoqKioqKiIpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9CVUZfRVJSOworCQlyZXR1cm4gLTE7CisJfQorCisgICAgICByZXRyeToKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDSU5UU1RBVCwgMHhmZik7CisKKwkvKiBQcmVwYXJlIHRoZSBQVEQgZGF0YSAqLworCWRvbmUgPSAwOworCWkgPSAwOworCWRvIHsKKwkJcHRkW2ldLmNvdW50ID0gUFREX0NDX01TSyB8IFBURF9BQ1RJVkVfTVNLIHwKKwkJICAgIFBURF9UT0dHTEUodXNiX2dldHRvZ2dsZShkZXYsIGVwbnVtLCBkaXJfb3V0KSk7CisJCXB0ZFtpXS5tcHMgPSBQVERfTVBTKG1heCkgfCBQVERfU1BEKHNwZWVkX2xvdykgfCBQVERfRVAoZXBudW0pOworCQlwdGRbaV0ubGVuID0gUFREX0xFTihtYXggPiBsZW4gLSBkb25lID8gbGVuIC0gZG9uZSA6IG1heCkgfAorCQkgICAgUFREX0RJUihkaXIpOworCQlwdGRbaV0uZmFkZHIgPSBQVERfRkEodXNiX3BpcGVkZXZpY2UocGlwZSkpOworCisJCXVzYl9kb3RvZ2dsZShkZXYsIGVwbnVtLCBkaXJfb3V0KTsKKwkJZG9uZSArPSBQVERfR0VUX0xFTigmcHRkW2ldKTsKKwkJaSsrOworCQlpZiAoaSA+PSBQVERfTlVNKSB7CisJCQlFUlIoIioqKioqKiBDYW5ub3QgcGFjayBidWZmZXIhICoqKioqKiIpOworCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQlVGX0VSUjsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gd2hpbGUgKGRvbmUgPCBsZW4pOworCXB0ZFtpIC0gMV0ubXBzIHw9IFBURF9MQVNUX01TSzsKKworCS8qIFBhY2sgZGF0YSBpbnRvIEZJRk8gcmFtICovCisJcGFja19maWZvKGlzcDExNngsIGRldiwgcGlwZSwgcHRkLCBpLCBidWZmZXIsIGxlbik7CisjaWZkZWYgRVhUUkFfREVMQVkKKwl3YWl0X21zKEVYVFJBX0RFTEFZKTsKKyNlbmRpZgorCisJLyogU3RhcnQgdGhlIGRhdGEgdHJhbnNmZXIgKi8KKworCS8qIEFsbG93IG1vcmUgdGltZSBmb3IgYSBCVUxLIGRldmljZSB0byByZWFjdCAtIHNvbWUgYXJlIHNsb3cgKi8KKwlpZiAodXNiX3BpcGV0eXBlKHBpcGUpID09IFBJUEVfQlVMSykKKwkJdGltZW91dCA9IDUwMDA7CisJZWxzZQorCQl0aW1lb3V0ID0gMTAwOworCisJLyogV2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlmb3IgKDs7KSB7CisJCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaXMgZG9uZSAqLworCQlzdGF0ID0gaXNwMTE2eF9pbnRlcnJ1cHQoaXNwMTE2eCk7CisKKwkJaWYgKHN0YXQgPCAwKSB7CisJCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0YXQgPiAwKQorCQkJYnJlYWs7CisKKwkJLyogQ2hlY2sgdGhlIHRpbWVvdXQgKi8KKwkJaWYgKC0tdGltZW91dCkKKwkJCXVkZWxheSgxKTsKKwkJZWxzZSB7CisJCQlFUlIoIkNUTDpUSU1FT1VUICIpOworCQkJc3RhdCA9IFVTQl9TVF9DUkNfRVJSOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBXZSBnb3QgYW4gUm9vdCBIdWIgU3RhdHVzIENoYW5nZSBpbnRlcnJ1cHQgKi8KKwlpZiAoZ290X3Joc2MpIHsKKwkJaXNwMTE2eF9zaG93X3JlZ3MoaXNwMTE2eCk7CisKKwkJZ290X3Joc2MgPSAwOworCisJCS8qIEFidXNlIHRpbWVvdXQgKi8KKwkJdGltZW91dCA9IHJoX2NoZWNrX3BvcnRfc3RhdHVzKGlzcDExNngpOworCQlpZiAodGltZW91dCA+PSAwKSB7CisJCQkvKgorCQkJICogRklYTUUhIE5PVEUhIEFBQUFSR0ghCisJCQkgKiBUaGlzIGlzIHBvdGVudGlhbGx5IGRhbmdlcm91cyBiZWNhdXNlIGl0IGFzc3VtZXMKKwkJCSAqIHRoYXQgb25seSBvbmUgZGV2aWNlIGlzIGV2ZXIgcGx1Z2dlZCBpbiEKKwkJCSAqLworCQkJZGV2Z29uZSA9IGRldjsKKwkJfQorCX0KKworCS8qIE9rLCBub3cgd2UgY2FuIHJlYWQgdHJhbnNmZXIgc3RhdHVzICovCisKKwkvKiBGSUZPIG5vdCByZWFkeT8gKi8KKwlpZiAoIShpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSENCVUZTVEFUKSAmIEhDQlVGU1RBVF9BVExfRE9ORSkpIHsKKwkJRVJSKCIqKioqKiogRklGTyBub3QgcmVhZHkhICoqKioqKiIpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9CVUZfRVJSOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVW5wYWNrIGRhdGEgZnJvbSBGSUZPIHJhbSAqLworCWNjID0gdW5wYWNrX2ZpZm8oaXNwMTE2eCwgZGV2LCBwaXBlLCBwdGQsIGksIGJ1ZmZlciwgbGVuKTsKKworCS8qIE1tbS4uLiBzb21ldGltZSB3ZSBnZXQgMHgwZiBhcyBjYyB3aGljaCBpcyBhIG5vbiBzZW5zZSEKKwkgKiBKdXN0IHJldHJ5IHRoZSB0cmFuc2Zlci4uLgorCSAqLworCWlmIChjYyA9PSAweDBmICYmIHJldHJpZXMtLSA+IDApIHsKKwkJdXNiX2RvdG9nZ2xlKGRldiwgZXBudW0sIGRpcl9vdXQpOworCQlnb3RvIHJldHJ5OworCX0KKworCWlmIChjYyAhPSBURF9DQ19OT0VSUk9SKSB7CisJCURCRygiKioqKioqIGNvbXBsZXRpdGlvbiBjb2RlIGVycm9yICV4ICoqKioqKiIsIGNjKTsKKwkJc3dpdGNoIChjYykgeworCQljYXNlIFREX0NDX0JJVFNUVUZGSU5HOgorCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQklUX0VSUjsKKwkJCWJyZWFrOworCQljYXNlIFREX0NDX1NUQUxMOgorCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfU1RBTExFRDsKKwkJCWJyZWFrOworCQljYXNlIFREX0JVRkZFUk9WRVJSVU46CisJCWNhc2UgVERfQlVGRkVSVU5ERVJSVU46CisJCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9CVUZfRVJSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQl9CisJCXJldHVybiAtY2M7CisJfQorCisJZHVtcF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgIlNVQk1JVChyZXQpIik7CisKKwlkZXYtPnN0YXR1cyA9IDA7CisJcmV0dXJuIGRvbmU7Cit9CisKKy8qIEFkYXB0ZWQgZnJvbSBhdTF4MDBfdXNiX29oY2kuYworICovCitzdGF0aWMgaW50IGlzcDExNnhfc3VibWl0X3JoX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCQkJIHZvaWQgKmJ1ZmZlciwgaW50IHRyYW5zZmVyX2xlbiwKKwkJCQkgc3RydWN0IGRldnJlcXVlc3QgKmNtZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9ICZpc3AxMTZ4X2RldjsKKwl1MzIgdG1wID0gMDsKKworCWludCBsZW5pID0gdHJhbnNmZXJfbGVuOworCWludCBsZW4gPSAwOworCWludCBzdGF0ID0gMDsKKwl1MzIgZGF0YWJbNF07CisJdTggKmRhdGFfYnVmID0gKHU4ICopIGRhdGFiOworCXUxNiBibVJUeXBlX2JSZXE7CisJdTE2IHdWYWx1ZTsKKwl1MTYgd0luZGV4OworCXUxNiB3TGVuZ3RoOworCisJaWYgKChwaXBlICYgUElQRV9JTlRFUlJVUFQpID09IFBJUEVfSU5URVJSVVBUKSB7CisJCUlORk8oIlJvb3QtSHViIHN1Ym1pdCBJUlE6IE5PVCBpbXBsZW1lbnRlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlibVJUeXBlX2JSZXEgPSBjbWQtPnJlcXVlc3R0eXBlIHwgKGNtZC0+cmVxdWVzdCA8PCA4KTsKKwl3VmFsdWUgPSBzd2FwXzE2KGNtZC0+dmFsdWUpOworCXdJbmRleCA9IHN3YXBfMTYoY21kLT5pbmRleCk7CisJd0xlbmd0aCA9IHN3YXBfMTYoY21kLT5sZW5ndGgpOworCisJREJHKCItLS0gSFVCIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlEQkcoInN1Ym1pdCByaCB1cmIsIHJlcT0leCB2YWw9JSN4IGluZGV4PSUjeCBsZW49JWQiLAorCSAgICBibVJUeXBlX2JSZXEsIHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoKTsKKwlkdW1wX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCAiUkgiKTsKKwlEQkcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCisJc3dpdGNoIChibVJUeXBlX2JSZXEpIHsKKwljYXNlIFJIX0dFVF9TVEFUVVM6CisJCURCRygiUkhfR0VUX1NUQVRVUyIpOworCisJCSooX191MTYgKikgZGF0YV9idWYgPSBzd2FwXzE2KDEpOworCQlsZW4gPSAyOworCQlicmVhazsKKworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0lOVEVSRkFDRToKKwkJREJHKCJSSF9HRVRfU1RBVFVTIHwgUkhfSU5URVJGQUNFIik7CisKKwkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IHN3YXBfMTYoMCk7CisJCWxlbiA9IDI7CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfRU5EUE9JTlQ6CisJCURCRygiUkhfR0VUX1NUQVRVUyB8IFJIX0VORFBPSU5UIik7CisKKwkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IHN3YXBfMTYoMCk7CisJCWxlbiA9IDI7CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfR0VUX1NUQVRVUyB8IFJIX0NMQVNTIik7CisKKwkJdG1wID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMpOworCisJCSooX191MzIgKikgZGF0YV9idWYgPSBzd2FwXzMyKHRtcCAmIH4oUkhfSFNfQ1JXRSB8IFJIX0hTX0RSV0UpKTsKKwkJbGVuID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgorCQlEQkcoIlJIX0dFVF9TVEFUVVMgfCBSSF9PVEhFUiB8IFJIX0NMQVNTIik7CisKKwkJdG1wID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEpOworCQkqKF9fdTMyICopIGRhdGFfYnVmID0gc3dhcF8zMih0bXApOworCQlpc3AxMTZ4X3Nob3dfcmVncyhpc3AxMTZ4KTsKKwkJbGVuID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9FTkRQT0lOVDoKKwkJREJHKCJSSF9DTEVBUl9GRUFUVVJFIHwgUkhfRU5EUE9JTlQiKTsKKworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFJIX0VORFBPSU5UX1NUQUxMOgorCQkJREJHKCJDX0hVQl9FTkRQT0lOVF9TVEFMTCIpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTIik7CisKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBSSF9DX0hVQl9MT0NBTF9QT1dFUjoKKwkJCURCRygiQ19IVUJfTE9DQUxfUE9XRVIiKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFJIX0NfSFVCX09WRVJfQ1VSUkVOVDoKKwkJCURCRygiQ19IVUJfT1ZFUl9DVVJSRU5UIik7CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMsIFJIX0hTX09DSUMpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJREJHKCJSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUyIpOworCisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgUkhfUE9SVF9FTkFCTEU6CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19DQ1MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfUE9SVF9TVVNQRU5EOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfUE9DSSk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9QT1JUX1BPV0VSOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfTFNEQSk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9DX1BPUlRfQ09OTkVDVElPTjoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX0NTQyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9DX1BPUlRfRU5BQkxFOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfUEVTQyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9DX1BPUlRfU1VTUEVORDoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BTU0MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfQ19QT1JUX09WRVJfQ1VSUkVOVDoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BPQ0kpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfQ19QT1JUX1JFU0VUOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfUFJTQyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUVSUigiaW52YWxpZCB3VmFsdWUiKTsKKwkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCisJCWlzcDExNnhfc2hvd19yZWdzKGlzcDExNngpOworCisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfU0VUX0ZFQVRVUkUgfCBSSF9PVEhFUiB8IFJIX0NMQVNTIik7CisKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBSSF9QT1JUX1NVU1BFTkQ6CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19QU1MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfUE9SVF9SRVNFVDoKKwkJCS8qIFNwaW4gdW50aWwgYW55IGN1cnJlbnQgcmVzZXQgZmluaXNoZXMgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJdG1wID0KKwkJCQkgICAgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsCisJCQkJCQkgICAgICAgSENSSFBPUlQxICsgd0luZGV4IC0gMSk7CisJCQkJaWYgKCEodG1wICYgUkhfUFNfUFJTKSkKKwkJCQkJYnJlYWs7CisJCQkJd2FpdF9tcygxKTsKKwkJCX0KKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BSUyk7CisJCQl3YWl0X21zKDEwKTsKKworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfUE9SVF9QT1dFUjoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BQUyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9QT1JUX0VOQUJMRToKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BFUyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUVSUigiaW52YWxpZCB3VmFsdWUiKTsKKwkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCisJCWlzcDExNnhfc2hvd19yZWdzKGlzcDExNngpOworCisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfQUREUkVTUzoKKwkJREJHKCJSSF9TRVRfQUREUkVTUyIpOworCisJCXJoX2Rldm51bSA9IHdWYWx1ZTsKKwkJbGVuID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9ERVNDUklQVE9SOgorCQlEQkcoIlJIX0dFVF9ERVNDUklQVE9SOiAleCwgJWQiLCB3VmFsdWUsIHdMZW5ndGgpOworCisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgKFVTQl9EVF9ERVZJQ0UgPDwgOCk6CS8qIGRldmljZSBkZXNjcmlwdG9yICovCisJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJICAgIGxlbmksIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCXNpemVvZihyb290X2h1Yl9kZXZfZGVzKSwKKwkJCQkJCXdMZW5ndGgpKTsKKwkJCWRhdGFfYnVmID0gcm9vdF9odWJfZGV2X2RlczsKKwkJCWJyZWFrOworCisJCWNhc2UgKFVTQl9EVF9DT05GSUcgPDwgOCk6CS8qIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCSAgICBsZW5pLCBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQlzaXplb2Yocm9vdF9odWJfY29uZmlnX2RlcyksCisJCQkJCQl3TGVuZ3RoKSk7CisJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX2NvbmZpZ19kZXM7CisJCQlicmVhazsKKworCQljYXNlICgoVVNCX0RUX1NUUklORyA8PCA4KSB8IDB4MDApOgkvKiBzdHJpbmcgMCBkZXNjcmlwdG9ycyAqLworCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCSAgICBsZW5pLCBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQlzaXplb2Yocm9vdF9odWJfc3RyX2luZGV4MCksCisJCQkJCQl3TGVuZ3RoKSk7CisJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDA7CisJCQlicmVhazsKKworCQljYXNlICgoVVNCX0RUX1NUUklORyA8PCA4KSB8IDB4MDEpOgkvKiBzdHJpbmcgMSBkZXNjcmlwdG9ycyAqLworCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCSAgICBsZW5pLCBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQlzaXplb2Yocm9vdF9odWJfc3RyX2luZGV4MSksCisJCQkJCQl3TGVuZ3RoKSk7CisJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJRVJSKCJpbnZhbGlkIHdWYWx1ZSIpOworCQkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9ERVNDUklQVE9SIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfR0VUX0RFU0NSSVBUT1IgfCBSSF9DTEFTUyIpOworCisJCXRtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EpOworCisJCWRhdGFfYnVmWzBdID0gMHgwOTsJLyogbWluIGxlbmd0aDsgKi8KKwkJZGF0YV9idWZbMV0gPSAweDI5OworCQlkYXRhX2J1ZlsyXSA9IHRtcCAmIFJIX0FfTkRQOworCQlkYXRhX2J1ZlszXSA9IDA7CisJCWlmICh0bXAgJiBSSF9BX1BTTSkJLyogcGVyLXBvcnQgcG93ZXIgc3dpdGNoaW5nPyAqLworCQkJZGF0YV9idWZbM10gfD0gMHgwMTsKKwkJaWYgKHRtcCAmIFJIX0FfTk9DUCkJLyogbm8gb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLworCQkJZGF0YV9idWZbM10gfD0gMHgxMDsKKwkJZWxzZSBpZiAodG1wICYgUkhfQV9PQ1BNKQkvKiBwZXItcG9ydCBvdmVyY3VycmVudCByZXA/ICovCisJCQlkYXRhX2J1ZlszXSB8PSAweDA4OworCisJCS8qIENvcnJlc3BvbmRzIHRvIGRhdGFfYnVmWzQtN10gKi8KKwkJZGF0YWJbMV0gPSAwOworCQlkYXRhX2J1Zls1XSA9ICh0bXAgJiBSSF9BX1BPVFBHVCkgPj4gMjQ7CisKKwkJdG1wID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQik7CisKKwkJZGF0YV9idWZbN10gPSB0bXAgJiBSSF9CX0RSOworCQlpZiAoZGF0YV9idWZbMl0gPCA3KQorCQkJZGF0YV9idWZbOF0gPSAweGZmOworCQllbHNlIHsKKwkJCWRhdGFfYnVmWzBdICs9IDI7CisJCQlkYXRhX2J1Zls4XSA9ICh0bXAgJiBSSF9CX0RSKSA+PiA4OworCQkJZGF0YV9idWZbMTBdID0gZGF0YV9idWZbOV0gPSAweGZmOworCQl9CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW5pLAorCQkJICAgIG1pbl90KHVuc2lnbmVkIGludCwgZGF0YV9idWZbMF0sIHdMZW5ndGgpKTsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9DT05GSUdVUkFUSU9OOgorCQlEQkcoIlJIX0dFVF9DT05GSUdVUkFUSU9OIik7CisKKwkJKihfX3U4ICopIGRhdGFfYnVmID0gMHgwMTsKKwkJbGVuID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFJIX1NFVF9DT05GSUdVUkFUSU9OOgorCQlEQkcoIlJIX1NFVF9DT05GSUdVUkFUSU9OIik7CisKKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTLCBSSF9IU19MUFNDKTsKKwkJbGVuID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlFUlIoIioqKiAqKiogKioqIHVuc3VwcG9ydGVkIHJvb3QgaHViIGNvbW1hbmQgKioqICoqKiAqKioiKTsKKwkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOworCX0KKworCWxlbiA9IG1pbl90KGludCwgbGVuLCBsZW5pKTsKKwlpZiAoYnVmZmVyICE9IGRhdGFfYnVmKQorCQltZW1jcHkoYnVmZmVyLCBkYXRhX2J1ZiwgbGVuKTsKKworCWRldi0+YWN0X2xlbiA9IGxlbjsKKwlkZXYtPnN0YXR1cyA9IHN0YXQ7CisJREJHKCJkZXYgYWN0X2xlbiAlZCwgc3RhdHVzICVkIiwgZGV2LT5hY3RfbGVuLCBkZXYtPnN0YXR1cyk7CisKKwlkdW1wX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCAiUkgocmV0KSIpOworCisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qIC0tLSBUcmFuc2ZlciBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IHN1Ym1pdF9pbnRfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQkgICBpbnQgbGVuLCBpbnQgaW50ZXJ2YWwpCit7CisJREJHKCJkZXY9JXAgcGlwZT0lI2x4IGJ1Zj0lcCBzaXplPSVkIGludD0lZCIsCisJICAgIGRldiwgcGlwZSwgYnVmZmVyLCBsZW4sIGludGVydmFsKTsKKworCXJldHVybiAtMTsKK30KKworaW50IHN1Ym1pdF9jb250cm9sX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgIGludCBsZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCkKK3sKKwlpbnQgZGV2bnVtID0gdXNiX3BpcGVkZXZpY2UocGlwZSk7CisJaW50IGVwbnVtID0gdXNiX3BpcGVlbmRwb2ludChwaXBlKTsKKwlpbnQgbWF4ID0gbWF4X3RyYW5zZmVyX2xlbihkZXYsIHBpcGUpOworCWludCBkaXJfaW4gPSB1c2JfcGlwZWluKHBpcGUpOworCWludCBkb25lLCByZXQ7CisKKwkvKiBDb250cm9sIG1lc3NhZ2UgaXMgZm9yIHRoZSBIVUI/ICovCisJaWYgKGRldm51bSA9PSByaF9kZXZudW0pCisJCXJldHVybiBpc3AxMTZ4X3N1Ym1pdF9yaF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgc2V0dXApOworCisJLyogT2ssIG5vIEhVQiBtZXNzYWdlIHNvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIGRldmljZSAqLworCisJLyogU2V0dXAgcGhhc2UgKi8KKwlEQkcoIi0tLSBTRVRVUCBQSEFTRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCXVzYl9zZXR0b2dnbGUoZGV2LCBlcG51bSwgMSwgMCk7CisJcmV0ID0gaXNwMTE2eF9zdWJtaXRfam9iKGRldiwgcGlwZSwKKwkJCQkgUFREX0RJUl9TRVRVUCwKKwkJCQkgc2V0dXAsIHNpemVvZihzdHJ1Y3QgZGV2cmVxdWVzdCkpOworCWlmIChyZXQgPCAwKSB7CisJCURCRygiY29udHJvbCBzZXR1cCBwaGFzZSBlcnJvciAocmV0ID0gJWQiLCByZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRGF0YSBwaGFzZSAqLworCURCRygiLS0tIERBVEEgUEhBU0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJZG9uZSA9IDA7CisJdXNiX3NldHRvZ2dsZShkZXYsIGVwbnVtLCAhZGlyX2luLCAxKTsKKwl3aGlsZSAoZG9uZSA8IGxlbikgeworCQlyZXQgPSBpc3AxMTZ4X3N1Ym1pdF9qb2IoZGV2LCBwaXBlLAorCQkJCQkgZGlyX2luID8gUFREX0RJUl9JTiA6IFBURF9ESVJfT1VULAorCQkJCQkgKF9fdTggKikgYnVmZmVyICsgZG9uZSwKKwkJCQkJIG1heCA+IGxlbiAtIGRvbmUgPyBsZW4gLSBkb25lIDogbWF4KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURCRygiY29udHJvbCBkYXRhIHBoYXNlIGVycm9yIChyZXQgPSAlZCkiLCByZXQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRvbmUgKz0gcmV0OworCisJCWlmIChkaXJfaW4gJiYgcmV0IDwgbWF4KQkvKiBzaG9ydCBwYWNrZXQgKi8KKwkJCWJyZWFrOworCX0KKworCS8qIFN0YXR1cyBwaGFzZSAqLworCURCRygiLS0tIFNUQVRVUyBQSEFTRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJdXNiX3NldHRvZ2dsZShkZXYsIGVwbnVtLCAhZGlyX2luLCAxKTsKKwlyZXQgPSBpc3AxMTZ4X3N1Ym1pdF9qb2IoZGV2LCBwaXBlLAorCQkJCSAhZGlyX2luID8gUFREX0RJUl9JTiA6IFBURF9ESVJfT1VULCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlEQkcoImNvbnRyb2wgc3RhdHVzIHBoYXNlIGVycm9yIChyZXQgPSAlZCIsIHJldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXYtPmFjdF9sZW4gPSBkb25lOworCisJZHVtcF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgIkRFVihyZXQpIik7CisKKwlyZXR1cm4gZG9uZTsKK30KKworaW50IHN1Ym1pdF9idWxrX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgIGludCBsZW4pCit7CisJaW50IGRpcl9vdXQgPSB1c2JfcGlwZW91dChwaXBlKTsKKwlpbnQgbWF4ID0gbWF4X3RyYW5zZmVyX2xlbihkZXYsIHBpcGUpOworCWludCBkb25lLCByZXQ7CisKKwlEQkcoIi0tLSBCVUxLIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCURCRygiZGV2PSVsZCBwaXBlPSVsZCBidWY9JXAgc2l6ZT0lZCBkaXJfb3V0PSVkIiwKKwkgICAgdXNiX3BpcGVkZXZpY2UocGlwZSksIHVzYl9waXBlZW5kcG9pbnQocGlwZSksIGJ1ZmZlciwgbGVuLCBkaXJfb3V0KTsKKworCWRvbmUgPSAwOworCXdoaWxlIChkb25lIDwgbGVuKSB7CisJCXJldCA9IGlzcDExNnhfc3VibWl0X2pvYihkZXYsIHBpcGUsCisJCQkJCSAhZGlyX291dCA/IFBURF9ESVJfSU4gOiBQVERfRElSX09VVCwKKwkJCQkJIChfX3U4ICopIGJ1ZmZlciArIGRvbmUsCisJCQkJCSBtYXggPiBsZW4gLSBkb25lID8gbGVuIC0gZG9uZSA6IG1heCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEQkcoImVycm9yIG9uIGJ1bGsgbWVzc2FnZSAocmV0ID0gJWQpIiwgcmV0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWRvbmUgKz0gcmV0OworCisJCWlmICghZGlyX291dCAmJiByZXQgPCBtYXgpCS8qIHNob3J0IHBhY2tldCAqLworCQkJYnJlYWs7CisJfQorCisJZGV2LT5hY3RfbGVuID0gZG9uZTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0gQmFzaWMgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgaXNwMTE2eF9zd19yZXNldChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlpbnQgcmV0cmllcyA9IDE1OworCWludCByZXQgPSAwOworCisJREJHKCIiKTsKKworCWlzcDExNngtPmRpc2FibGVkID0gMTsKKworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSENTV1JFUywgSENTV1JFU19NQUdJQyk7CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0NNRFNUQVQsIEhDQ01EU1RBVF9IQ1IpOworCXdoaWxlICgtLXJldHJpZXMpIHsKKwkJLyogSXQgdXN1YWxseSByZXNldHMgd2l0aGluIDEgbXMgKi8KKwkJd2FpdF9tcygxKTsKKwkJaWYgKCEoaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDQ01EU1RBVCkgJiBIQ0NNRFNUQVRfSENSKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJldHJpZXMpIHsKKwkJRVJSKCJzb2Z0d2FyZSByZXNldCB0aW1lb3V0Iik7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzcDExNnhfcmVzZXQoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdW5zaWduZWQgbG9uZyB0OworCXUxNiBjbGtyZHkgPSAwOworCWludCByZXQsIHRpbWVvdXQgPSAxNSAvKiBtcyAqLyA7CisKKwlEQkcoIiIpOworCisJcmV0ID0gaXNwMTE2eF9zd19yZXNldChpc3AxMTZ4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yICh0ID0gMDsgdCA8IHRpbWVvdXQ7IHQrKykgeworCQljbGtyZHkgPSBpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSEN1UElOVCkgJiBIQ3VQSU5UX0NMS1JEWTsKKwkJaWYgKGNsa3JkeSkKKwkJCWJyZWFrOworCQl3YWl0X21zKDEpOworCX0KKwlpZiAoIWNsa3JkeSkgeworCQlFUlIoImNsb2NrIG5vdCByZWFkeSBhZnRlciAlZG1zIiwgdGltZW91dCk7CisJCS8qIEFmdGVyIHN3X3Jlc2V0IHRoZSBjbG9jayB3b24ndCByZXBvcnQgdG8gYmUgcmVhZHksIGlmCisJCSAgIEhfV0FLRVVQIHBpbiBpcyBoaWdoLiAqLworCQlFUlIoInBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgSF9XQUtFVVAgcGluIGlzIHB1bGxlZCBsb3chIik7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3N0b3Aoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTMyIHZhbDsKKworCURCRygiIik7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsIDApOworCisJLyogU3dpdGNoIG9mZiBwb3J0cycgcG93ZXIsIHNvbWUgZGV2aWNlcyBkb24ndCBjb21lIHVwCisJICAgYWZ0ZXIgbmV4dCAnc3RhcnQnIHdpdGhvdXQgdGhpcyAqLworCXZhbCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EpOworCXZhbCAmPSB+KFJIX0FfTlBTIHwgUkhfQV9QU00pOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBLCB2YWwpOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUywgUkhfSFNfTFBTKTsKKworCWlzcDExNnhfc3dfcmVzZXQoaXNwMTE2eCk7Cit9CisKKy8qCisgKiAgQ29uZmlndXJlIHRoZSBjaGlwLiBUaGUgY2hpcCBtdXN0IGJlIHN1Y2Nlc3NmdWxseSByZXNldCBieSBub3cuCisgKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9zdGFydChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eF9wbGF0Zm9ybV9kYXRhICpib2FyZCA9IGlzcDExNngtPmJvYXJkOworCXUzMiB2YWw7CisKKwlEQkcoIiIpOworCisJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIDB4ZmYpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgMCk7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDSVRMQlVGTEVOLCBJU1AxMTZ4X0lUTF9CVUZTSVpFKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDQVRMQlVGTEVOLCBJU1AxMTZ4X0FUTF9CVUZTSVpFKTsKKworCS8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KKwl2YWwgPSBIQ0hXQ0ZHX0RCV0lEVEgoMSk7CisJaWYgKGJvYXJkLT5zZWwxNUtyZXMpCisJCXZhbCB8PSBIQ0hXQ0ZHXzE1S1JTRUw7CisJLyogUmVtb3RlIHdha2V1cCB3b24ndCB3b3JrIHdpdGhvdXQgd29ya2luZyBjbG9jayAqLworCWlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJCXZhbCB8PSBIQ0hXQ0ZHX0NMS05PVFNUT1A7CisJaWYgKGJvYXJkLT5vY19lbmFibGUpCisJCXZhbCB8PSBIQ0hXQ0ZHX0FOQUxPR19PQzsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDSFdDRkcsIHZhbCk7CisKKwkvKiAtLS0gUm9vdCBodWIgY29uZmlndXJhdGlvbiAqLworCXZhbCA9ICgyNSA8PCAyNCkgJiBSSF9BX1BPVFBHVDsKKwkvKiBBTjEwMDAzXzEucGRmIHJlY29tbWVuZHMgUkhfQV9OUFMgKG5vIHBvd2VyIHN3aXRjaGluZykgdG8KKwkgICBiZSBhbHdheXMgc2V0LiBZZXQsIGluc3RlYWQsIHdlIHJlcXVlc3QgaW5kaXZpZHVhbCBwb3J0CisJICAgcG93ZXIgc3dpdGNoaW5nLiAqLworCXZhbCB8PSBSSF9BX1BTTTsKKwkvKiBSZXBvcnQgb3ZlcmN1cnJlbnQgcGVyIHBvcnQgKi8KKwl2YWwgfD0gUkhfQV9PQ1BNOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBLCB2YWwpOworCWlzcDExNngtPnJoZGVzY2EgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBKTsKKworCXZhbCA9IFJIX0JfUFBDTTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQiwgdmFsKTsKKwlpc3AxMTZ4LT5yaGRlc2NiID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQik7CisKKwl2YWwgPSAwOworCWlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJCXZhbCB8PSBSSF9IU19EUldFOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUywgdmFsKTsKKwlpc3AxMTZ4LT5yaHN0YXR1cyA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTKTsKKworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENGTUlOVFZMLCAweDI3NzgyZWRmKTsKKworCS8qIEdvIG9wZXJhdGlvbmFsICovCisJdmFsID0gSENDT05UUk9MX1VTQl9PUEVSOworCWlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJCXZhbCB8PSBIQ0NPTlRST0xfUldFOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDT05UUk9MLCB2YWwpOworCisJLyogRGlzYWJsZSBwb3J0cyB0byBhdm9pZCByYWNlIGluIGRldmljZSBlbnVtZXJhdGlvbiAqLworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxLCBSSF9QU19DQ1MpOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQyLCBSSF9QU19DQ1MpOworCisJaXNwMTE2eF9zaG93X3JlZ3MoaXNwMTE2eCk7CisKKwlpc3AxMTZ4LT5kaXNhYmxlZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tIEluaXQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgaXNwMTE2eF9jaGVja19pZChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlpbnQgdmFsOworCisJdmFsID0gaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDQ0hJUElEKTsKKwlpZiAoKHZhbCAmIEhDQ0hJUElEX01BU0spICE9IEhDQ0hJUElEX01BR0lDKSB7CisJCUVSUigiaW52YWxpZCBjaGlwIElEICUwNHgiLCB2YWwpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfbG93bGV2ZWxfaW5pdCh2b2lkKQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gJmlzcDExNnhfZGV2OworCisJREJHKCIiKTsKKworCS8qIEluaXQgZGV2aWNlIHJlZ2lzdGVycyBhZGRyICovCisJaXNwMTE2eC0+YWRkcl9yZWcgPSAodTE2ICopIElTUDExNlhfSENEX0FERFI7CisJaXNwMTE2eC0+ZGF0YV9yZWcgPSAodTE2ICopIElTUDExNlhfSENEX0RBVEE7CisKKwkvKiBTZXR1cCBzcGVjaWZpYyBib2FyZCBzZXR0aW5ncyAqLworI2lmZGVmIElTUDExNlhfSENEX1NFTDE1a1JFUworCWlzcDExNnhfYm9hcmQuc2VsMTVLcmVzID0gMTsKKyNlbmRpZgorI2lmZGVmIElTUDExNlhfSENEX09DX0VOQUJMRQorCWlzcDExNnhfYm9hcmQub2NfZW5hYmxlID0gMTsKKyNlbmRpZgorI2lmZGVmIElTUDExNlhfSENEX1JFTU9URV9XQUtFVVBfRU5BQkxFCisJaXNwMTE2eF9ib2FyZC5yZW1vdGVfd2FrZXVwX2VuYWJsZSA9IDE7CisjZW5kaWYKKwlpc3AxMTZ4LT5ib2FyZCA9ICZpc3AxMTZ4X2JvYXJkOworCisJLyogVHJ5IHRvIGdldCBJU1AxMTZ4IHNpbGljb24gY2hpcCBJRCAqLworCWlmIChpc3AxMTZ4X2NoZWNrX2lkKGlzcDExNngpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaXNwMTE2eC0+ZGlzYWJsZWQgPSAxOworCWlzcDExNngtPnNsZWVwaW5nID0gMDsKKworCWlzcDExNnhfcmVzZXQoaXNwMTE2eCk7CisJaXNwMTE2eF9zdGFydChpc3AxMTZ4KTsKKworCXJldHVybiAwOworfQorCitpbnQgdXNiX2xvd2xldmVsX3N0b3Aodm9pZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9ICZpc3AxMTZ4X2RldjsKKworCURCRygiIik7CisKKwlpZiAoIWlzcDExNngtPmRpc2FibGVkKQorCQlpc3AxMTZ4X3N0b3AoaXNwMTE2eCk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCQkJCS8qIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNwMTE2eC5oIGIvZHJpdmVycy9pc3AxMTZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjZTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXNwMTE2eC5oCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogSVNQMTE2eCByZWdpc3RlciBkZWNsYXJhdGlvbnMgYW5kIEhDRCBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRXVyb3RlY2ggUy5wLkEuIDxpbmZvQGV1cm90ZWNoLml0PgorICogQ29weXJpZ2h0IChDKSAyMDA1IE9sYXYgS29uZ2FzIDxva0BhcnRlY2Rlc2lnbi5lZT4KKyAqIFBvcnRpb25zOgorICogQ29weXJpZ2h0IChDKSAyMDA0IExvdGhhciBXYXNzbWFubgorICogQ29weXJpZ2h0IChDKSAyMDA0IFBzaW9uIFRla2xvZ2l4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKGZtdCwgYXJncy4uLikJXAorCQlwcmludGYoImlzcDExNng6ICVzOiAiIGZtdCAiXG4iICwgX19GVU5DVElPTl9fICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBWRVJCT1NFCisjICAgIGRlZmluZSBWREJHCQlEQkcKKyNlbHNlCisjICAgIGRlZmluZSBWREJHKGZtdCwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBFUlIoZm10LCBhcmdzLi4uKQlcCisJCXByaW50ZigiaXNwMTE2eDogJXM6ICIgZm10ICJcbiIgLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2RlZmluZSBXQVJOKGZtdCwgYXJncy4uLikJXAorCQlwcmludGYoImlzcDExNng6ICVzOiAiIGZtdCAiXG4iICwgX19GVU5DVElPTl9fICwgIyMgYXJncykKKyNkZWZpbmUgSU5GTyhmbXQsIGFyZ3MuLi4pCVwKKwkJcHJpbnRmKCJpc3AxMTZ4OiAiIGZtdCAiXG4iICwgIyMgYXJncykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB1cyBvZiAxbXMgZnJhbWUgKi8KKyNkZWZpbmUgIE1BWF9MT0FEX0xJTUlUCQk4NTAKKworLyogRnVsbCBzcGVlZDogbWF4ICMgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgZm9yIGEgc2luZ2xlIHVyYgorICAgYXQgYSB0aW1lIG11c3QgYmUgPCAxMDI0ICYmIG11c3QgYmUgbXVsdGlwbGUgb2YgNjQuCisgICA4MzIgYWxsb3dzIHRyYW5zZmVyaW5nIDRraUIgd2l0aGluIDUgZnJhbWVzLiAqLworI2RlZmluZSBNQVhfVFJBTlNGRVJfU0laRV9GVUxMU1BFRUQJODMyCisKKy8qIExvdyBzcGVlZDogdGhlcmUgaXMgbm8gcmVhc29uIHRvIHNjaGVkdWxlIGluIHZlcnkgYmlnCisgICBjaHVua3M7IG9mdGVuIHRoZSByZXF1ZXN0ZWQgbG9uZyB0cmFuc2ZlcnMgYXJlIGZvcgorICAgc3RyaW5nIGRlc2NyaXB0b3JzIGNvbnRhaW5pbmcgc2hvcnQgc3RyaW5ncy4gKi8KKyNkZWZpbmUgTUFYX1RSQU5TRkVSX1NJWkVfTE9XU1BFRUQJNjQKKworLyogQnl0ZXRpbWUgKHVzKSwgYSByb3VnaCBpbmRpY2F0aW9uIG9mIGhvdyBtdWNoIHRpbWUgaXQKKyAgIHdvdWxkIHRha2UgdG8gdHJhbnNmZXIgYSBieXRlIG9mIHVzZWZ1bCBkYXRhIG92ZXIgVVNCICovCisjZGVmaW5lIEJZVEVfVElNRV9GVUxMU1BFRUQJMQorI2RlZmluZSBCWVRFX1RJTUVfTE9XU1BFRUQJMjAKKworLyogQnVmZmVyIHNpemVzICovCisjZGVmaW5lIElTUDExNnhfQlVGX1NJWkUJNDA5NgorI2RlZmluZSBJU1AxMTZ4X0lUTF9CVUZTSVpFCTAKKyNkZWZpbmUgSVNQMTE2eF9BVExfQlVGU0laRQkoKElTUDExNnhfQlVGX1NJWkUpIC0gMiooSVNQMTE2eF9JVExfQlVGU0laRSkpCisKKyNkZWZpbmUgSVNQMTE2eF9XUklURV9PRkZTRVQJMHg4MAorCisvKiAtLS0gSVNQMTE2eCByZWdpc3RlcnMvYml0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUJSENSRVZJU0lPTgkweDAwCisjZGVmaW5lCUhDQ09OVFJPTAkweDAxCisjZGVmaW5lCQlIQ0NPTlRST0xfSENGUwkoMyA8PCA2KQkvKiBob3N0IGNvbnRyb2xsZXIKKwkJCQkJCSAgIGZ1bmN0aW9uYWwgc3RhdGUgKi8KKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfUkVTRVQJKDAgPDwgNikKKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfUkVTVU1FCSgxIDw8IDYpCisjZGVmaW5lCQlIQ0NPTlRST0xfVVNCX09QRVIJKDIgPDwgNikKKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfU1VTUEVORAkoMyA8PCA2KQorI2RlZmluZQkJSENDT05UUk9MX1JXQwkoMSA8PCA5KQkvKiByZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAqLworI2RlZmluZQkJSENDT05UUk9MX1JXRQkoMSA8PCAxMCkJLyogcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KKyNkZWZpbmUJSENDTURTVEFUCTB4MDIKKyNkZWZpbmUJCUhDQ01EU1RBVF9IQ1IJKDEgPDwgMCkJLyogaG9zdCBjb250cm9sbGVyIHJlc2V0ICovCisjZGVmaW5lCQlIQ0NNRFNUQVRfU09DCSgzIDw8IDE2KQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gY291bnQgKi8KKyNkZWZpbmUJSENJTlRTVEFUCTB4MDMKKyNkZWZpbmUJCUhDSU5UX1NPCSgxIDw8IDApCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biAqLworI2RlZmluZQkJSENJTlRfV0RICSgxIDw8IDEpCS8qIHdyaXRlYmFjayBvZiBkb25lX2hlYWQgKi8KKyNkZWZpbmUJCUhDSU5UX1NGCSgxIDw8IDIpCS8qIHN0YXJ0IGZyYW1lICovCisjZGVmaW5lCQlIQ0lOVF9SRAkoMSA8PCAzKQkvKiByZXN1bWUgZGV0ZWN0ICovCisjZGVmaW5lCQlIQ0lOVF9VRQkoMSA8PCA0KQkvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCisjZGVmaW5lCQlIQ0lOVF9GTk8JKDEgPDwgNSkJLyogZnJhbWUgbnVtYmVyIG92ZXJmbG93ICovCisjZGVmaW5lCQlIQ0lOVF9SSFNDCSgxIDw8IDYpCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCUhDSU5UX09DCSgxIDw8IDMwKQkvKiBvd25lcnNoaXAgY2hhbmdlICovCisjZGVmaW5lCQlIQ0lOVF9NSUUJKDEgPDwgMzEpCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lCUhDSU5URU5CCTB4MDQKKyNkZWZpbmUJSENJTlRESVMJMHgwNQorI2RlZmluZQlIQ0ZNSU5UVkwJMHgwZAorI2RlZmluZQlIQ0ZNUkVNCQkweDBlCisjZGVmaW5lCUhDRk1OVU0JCTB4MGYKKyNkZWZpbmUJSENMU1RIUkVTSAkweDExCisjZGVmaW5lCUhDUkhERVNDQQkweDEyCisjZGVmaW5lCQlSSF9BX05EUAkoMHgzIDw8IDApCS8qICMgZG93bnN0cmVhbSBwb3J0cyAqLworI2RlZmluZQkJUkhfQV9QU00JKDEgPDwgOCkJLyogcG93ZXIgc3dpdGNoaW5nIG1vZGUgKi8KKyNkZWZpbmUJCVJIX0FfTlBTCSgxIDw8IDkpCS8qIG5vIHBvd2VyIHN3aXRjaGluZyAqLworI2RlZmluZQkJUkhfQV9EVAkJKDEgPDwgMTApCS8qIGRldmljZSB0eXBlIChtYnopICovCisjZGVmaW5lCQlSSF9BX09DUE0JKDEgPDwgMTEpCS8qIG92ZXJjdXJyZW50IHByb3RlY3Rpb24KKwkJCQkJCSAgIG1vZGUgKi8KKyNkZWZpbmUJCVJIX0FfTk9DUAkoMSA8PCAxMikJLyogbm8gb3ZlcmN1cnJlbnQgcHJvdGVjdGlvbiAqLworI2RlZmluZQkJUkhfQV9QT1RQR1QJKDB4ZmYgPDwgMjQpCS8qIHBvd2VyIG9uIC0+IHBvd2VyIGdvb2QKKwkJCQkJCSAgIHRpbWUgKi8KKyNkZWZpbmUJSENSSERFU0NCCTB4MTMKKyNkZWZpbmUJCVJIX0JfRFIJCSgweGZmZmYgPDwgMCkJLyogZGV2aWNlIHJlbW92YWJsZSBmbGFncyAqLworI2RlZmluZQkJUkhfQl9QUENNCSgweGZmZmYgPDwgMTYpCS8qIHBvcnQgcG93ZXIgY29udHJvbCBtYXNrICovCisjZGVmaW5lCUhDUkhTVEFUVVMJMHgxNAorI2RlZmluZQkJUkhfSFNfTFBTCSgxIDw8IDApCS8qIGxvY2FsIHBvd2VyIHN0YXR1cyAqLworI2RlZmluZQkJUkhfSFNfT0NJCSgxIDw8IDEpCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUJCVJIX0hTX0RSV0UJKDEgPDwgMTUpCS8qIGRldmljZSByZW1vdGUgd2FrZXVwCisJCQkJCQkgICBlbmFibGUgKi8KKyNkZWZpbmUJCVJIX0hTX0xQU0MJKDEgPDwgMTYpCS8qIGxvY2FsIHBvd2VyIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX0hTX09DSUMJKDEgPDwgMTcpCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IKKwkJCQkJCSAgIGNoYW5nZSAqLworI2RlZmluZQkJUkhfSFNfQ1JXRQkoMSA8PCAzMSkJLyogY2xlYXIgcmVtb3RlIHdha2V1cAorCQkJCQkJICAgZW5hYmxlICovCisjZGVmaW5lCUhDUkhQT1JUMQkweDE1CisjZGVmaW5lCQlSSF9QU19DQ1MJKDEgPDwgMCkJLyogY3VycmVudCBjb25uZWN0IHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfUEVTCSgxIDw8IDEpCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfUFNTCSgxIDw8IDIpCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX1BPQ0kJKDEgPDwgMykJLyogcG9ydCBvdmVyIGN1cnJlbnQKKwkJCQkJCSAgIGluZGljYXRvciAqLworI2RlZmluZQkJUkhfUFNfUFJTCSgxIDw8IDQpCS8qIHBvcnQgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lCQlSSF9QU19QUFMJKDEgPDwgOCkJLyogcG9ydCBwb3dlciBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX0xTREEJKDEgPDwgOSkJLyogbG93IHNwZWVkIGRldmljZSBhdHRhY2hlZCAqLworI2RlZmluZQkJUkhfUFNfQ1NDCSgxIDw8IDE2KQkvKiBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX1BTX1BFU0MJKDEgPDwgMTcpCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX1BTX1BTU0MJKDEgPDwgMTgpCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMKKwkJCQkJCSAgIGNoYW5nZSAqLworI2RlZmluZQkJUkhfUFNfT0NJQwkoMSA8PCAxOSkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvcgorCQkJCQkJICAgY2hhbmdlICovCisjZGVmaW5lCQlSSF9QU19QUlNDCSgxIDw8IDIwKQkvKiBwb3J0IHJlc2V0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCUhDUkhQT1JUX0NMUk1BU0sJKDB4MWYgPDwgMTYpCisjZGVmaW5lCUhDUkhQT1JUMgkweDE2CisjZGVmaW5lCUhDSFdDRkcJCTB4MjAKKyNkZWZpbmUJCUhDSFdDRkdfMTVLUlNFTAkJKDEgPDwgMTIpCisjZGVmaW5lCQlIQ0hXQ0ZHX0NMS05PVFNUT1AJKDEgPDwgMTEpCisjZGVmaW5lCQlIQ0hXQ0ZHX0FOQUxPR19PQwkoMSA8PCAxMCkKKyNkZWZpbmUJCUhDSFdDRkdfREFDS19NT0RFCSgxIDw8IDgpCisjZGVmaW5lCQlIQ0hXQ0ZHX0VPVF9QT0wJCSgxIDw8IDcpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RBQ0tfUE9MCSgxIDw8IDYpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RSRVFfUE9MCSgxIDw8IDUpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RCV0lEVEhfTUFTSwkoMHgwMyA8PCAzKQorI2RlZmluZQkJSENIV0NGR19EQldJRFRIKG4pCSgoKG4pIDw8IDMpICYgSENIV0NGR19EQldJRFRIX01BU0spCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9QT0wJCSgxIDw8IDIpCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9UUklHR0VSCSgxIDw8IDEpCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9FTkFCTEUJKDEgPDwgMCkKKyNkZWZpbmUJSENETUFDRkcJMHgyMQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOX01BU0sJKDB4MDMgPDwgNSkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTihuKQkoKChuKSA8PCA1KSAmIEhDRE1BQ0ZHX0JVUlNUX0xFTl9NQVNLKQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOXzEJSENETUFDRkdfQlVSU1RfTEVOKDApCisjZGVmaW5lCQlIQ0RNQUNGR19CVVJTVF9MRU5fNAlIQ0RNQUNGR19CVVJTVF9MRU4oMSkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTl84CUhDRE1BQ0ZHX0JVUlNUX0xFTigyKQorI2RlZmluZQkJSENETUFDRkdfRE1BX0VOQUJMRQkoMSA8PCA0KQorI2RlZmluZQkJSENETUFDRkdfQlVGX1RZUEVfTUFTSwkoMHgwNyA8PCAxKQorI2RlZmluZQkJSENETUFDRkdfQ1RSX1NFTAkoMSA8PCAyKQorI2RlZmluZQkJSENETUFDRkdfSVRMQVRMX1NFTAkoMSA8PCAxKQorI2RlZmluZQkJSENETUFDRkdfRE1BX1JXX1NFTEVDVAkoMSA8PCAwKQorI2RlZmluZQlIQ1hGRVJDVFIJMHgyMgorI2RlZmluZQlIQ3VQSU5UCQkweDI0CisjZGVmaW5lCQlIQ3VQSU5UX1NPRgkJKDEgPDwgMCkKKyNkZWZpbmUJCUhDdVBJTlRfQVRMCQkoMSA8PCAxKQorI2RlZmluZQkJSEN1UElOVF9BSUlFT1QJCSgxIDw8IDIpCisjZGVmaW5lCQlIQ3VQSU5UX09QUgkJKDEgPDwgNCkKKyNkZWZpbmUJCUhDdVBJTlRfU1VTUAkJKDEgPDwgNSkKKyNkZWZpbmUJCUhDdVBJTlRfQ0xLUkRZCQkoMSA8PCA2KQorI2RlZmluZQlIQ3VQSU5URU5CCTB4MjUKKyNkZWZpbmUJSENDSElQSUQJMHgyNworI2RlZmluZQkJSENDSElQSURfTUFTSwkJMHhmZjAwCisjZGVmaW5lCQlIQ0NISVBJRF9NQUdJQwkJMHg2MTAwCisjZGVmaW5lCUhDU0NSQVRDSAkweDI4CisjZGVmaW5lCUhDU1dSRVMJCTB4MjkKKyNkZWZpbmUJCUhDU1dSRVNfTUFHSUMJCTB4MDBmNgorI2RlZmluZQlIQ0lUTEJVRkxFTgkweDJhCisjZGVmaW5lCUhDQVRMQlVGTEVOCTB4MmIKKyNkZWZpbmUJSENCVUZTVEFUCTB4MmMKKyNkZWZpbmUJCUhDQlVGU1RBVF9JVEwwX0ZVTEwJKDEgPDwgMCkKKyNkZWZpbmUJCUhDQlVGU1RBVF9JVEwxX0ZVTEwJKDEgPDwgMSkKKyNkZWZpbmUJCUhDQlVGU1RBVF9BVExfRlVMTAkoMSA8PCAyKQorI2RlZmluZQkJSENCVUZTVEFUX0lUTDBfRE9ORQkoMSA8PCAzKQorI2RlZmluZQkJSENCVUZTVEFUX0lUTDFfRE9ORQkoMSA8PCA0KQorI2RlZmluZQkJSENCVUZTVEFUX0FUTF9ET05FCSgxIDw8IDUpCisjZGVmaW5lCUhDUkRJVEwwTEVOCTB4MmQKKyNkZWZpbmUJSENSRElUTDFMRU4JMHgyZQorI2RlZmluZQlIQ0lUTFBPUlQJMHg0MAorI2RlZmluZQlIQ0FUTFBPUlQJMHg0MQorCisvKiBQVEQgYWNjZXNzb3IgbWFjcm9zLiAqLworI2RlZmluZSBQVERfR0VUX0NPVU5UKHApCSgoKHApLT5jb3VudCAmIFBURF9DT1VOVF9NU0spID4+IDApCisjZGVmaW5lIFBURF9DT1VOVCh2KQkJKCgodikgPDwgMCkgJiBQVERfQ09VTlRfTVNLKQorI2RlZmluZSBQVERfR0VUX1RPR0dMRShwKQkoKChwKS0+Y291bnQgJiBQVERfVE9HR0xFX01TSykgPj4gMTApCisjZGVmaW5lIFBURF9UT0dHTEUodikJCSgoKHYpIDw8IDEwKSAmIFBURF9UT0dHTEVfTVNLKQorI2RlZmluZSBQVERfR0VUX0FDVElWRShwKQkoKChwKS0+Y291bnQgJiBQVERfQUNUSVZFX01TSykgPj4gMTEpCisjZGVmaW5lIFBURF9BQ1RJVkUodikJCSgoKHYpIDw8IDExKSAmIFBURF9BQ1RJVkVfTVNLKQorI2RlZmluZSBQVERfR0VUX0NDKHApCQkoKChwKS0+Y291bnQgJiBQVERfQ0NfTVNLKSA+PiAxMikKKyNkZWZpbmUgUFREX0NDKHYpCQkoKCh2KSA8PCAxMikgJiBQVERfQ0NfTVNLKQorI2RlZmluZSBQVERfR0VUX01QUyhwKQkJKCgocCktPm1wcyAmIFBURF9NUFNfTVNLKSA+PiAwKQorI2RlZmluZSBQVERfTVBTKHYpCQkoKCh2KSA8PCAwKSAmIFBURF9NUFNfTVNLKQorI2RlZmluZSBQVERfR0VUX1NQRChwKQkJKCgocCktPm1wcyAmIFBURF9TUERfTVNLKSA+PiAxMCkKKyNkZWZpbmUgUFREX1NQRCh2KQkJKCgodikgPDwgMTApICYgUFREX1NQRF9NU0spCisjZGVmaW5lIFBURF9HRVRfTEFTVChwKQkJKCgocCktPm1wcyAmIFBURF9MQVNUX01TSykgPj4gMTEpCisjZGVmaW5lIFBURF9MQVNUKHYpCQkoKCh2KSA8PCAxMSkgJiBQVERfTEFTVF9NU0spCisjZGVmaW5lIFBURF9HRVRfRVAocCkJCSgoKHApLT5tcHMgJiBQVERfRVBfTVNLKSA+PiAxMikKKyNkZWZpbmUgUFREX0VQKHYpCQkoKCh2KSA8PCAxMikgJiBQVERfRVBfTVNLKQorI2RlZmluZSBQVERfR0VUX0xFTihwKQkJKCgocCktPmxlbiAmIFBURF9MRU5fTVNLKSA+PiAwKQorI2RlZmluZSBQVERfTEVOKHYpCQkoKCh2KSA8PCAwKSAmIFBURF9MRU5fTVNLKQorI2RlZmluZSBQVERfR0VUX0RJUihwKQkJKCgocCktPmxlbiAmIFBURF9ESVJfTVNLKSA+PiAxMCkKKyNkZWZpbmUgUFREX0RJUih2KQkJKCgodikgPDwgMTApICYgUFREX0RJUl9NU0spCisjZGVmaW5lIFBURF9HRVRfQjVfNShwKQkJKCgocCktPmxlbiAmIFBURF9CNV81X01TSykgPj4gMTMpCisjZGVmaW5lIFBURF9CNV81KHYpCQkoKCh2KSA8PCAxMykgJiBQVERfQjVfNV9NU0spCisjZGVmaW5lIFBURF9HRVRfRkEocCkJCSgoKHApLT5mYWRkciAmIFBURF9GQV9NU0spID4+IDApCisjZGVmaW5lIFBURF9GQSh2KQkJKCgodikgPDwgMCkgJiBQVERfRkFfTVNLKQorI2RlZmluZSBQVERfR0VUX0ZNVChwKQkJKCgocCktPmZhZGRyICYgUFREX0ZNVF9NU0spID4+IDcpCisjZGVmaW5lIFBURF9GTVQodikJCSgoKHYpIDw8IDcpICYgUFREX0ZNVF9NU0spCisKKy8qICBIYXJkd2FyZSB0cmFuc2ZlciBzdGF0dXMgY29kZXMgLS0gQ0MgZnJvbSBwdGQtPmNvdW50ICovCisjZGVmaW5lIFREX0NDX05PRVJST1IgICAgICAweDAwCisjZGVmaW5lIFREX0NDX0NSQyAgICAgICAgICAweDAxCisjZGVmaW5lIFREX0NDX0JJVFNUVUZGSU5HICAweDAyCisjZGVmaW5lIFREX0NDX0RBVEFUT0dHTEVNICAweDAzCisjZGVmaW5lIFREX0NDX1NUQUxMICAgICAgICAweDA0CisjZGVmaW5lIFREX0RFVk5PVFJFU1AgICAgICAweDA1CisjZGVmaW5lIFREX1BJRENIRUNLRkFJTCAgICAweDA2CisjZGVmaW5lIFREX1VORVhQRUNURURQSUQgICAweDA3CisjZGVmaW5lIFREX0RBVEFPVkVSUlVOICAgICAweDA4CisjZGVmaW5lIFREX0RBVEFVTkRFUlJVTiAgICAweDA5CisgICAgLyogMHgwQSwgMHgwQiByZXNlcnZlZCBmb3IgaGFyZHdhcmUgKi8KKyNkZWZpbmUgVERfQlVGRkVST1ZFUlJVTiAgIDB4MEMKKyNkZWZpbmUgVERfQlVGRkVSVU5ERVJSVU4gIDB4MEQKKyAgICAvKiAweDBFLCAweDBGIHJlc2VydmVkIGZvciBIQ0QgKi8KKyNkZWZpbmUgVERfTk9UQUNDRVNTRUQgICAgIDB4MEYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lCUxPRzJfUEVSSU9ESUNfU0laRQk1CS8qIGFyYml0cmFyeTsgdGhpcyBtYXRjaGVzIE9IQ0kgKi8KKyNkZWZpbmUJUEVSSU9ESUNfU0laRQkJKDEgPDwgTE9HMl9QRVJJT0RJQ19TSVpFKQorCisvKiBQaGlsaXBzIHRyYW5zZmVyIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBwdGQgeworCXUxNiBjb3VudDsKKyNkZWZpbmUJUFREX0NPVU5UX01TSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUJUFREX1RPR0dMRV9NU0sJKDEgPDwgMTApCisjZGVmaW5lCVBURF9BQ1RJVkVfTVNLCSgxIDw8IDExKQorI2RlZmluZQlQVERfQ0NfTVNLCSgweGYgPDwgMTIpCisJdTE2IG1wczsKKyNkZWZpbmUJUFREX01QU19NU0sJKDB4M2ZmIDw8IDApCisjZGVmaW5lCVBURF9TUERfTVNLCSgxIDw8IDEwKQorI2RlZmluZQlQVERfTEFTVF9NU0sJKDEgPDwgMTEpCisjZGVmaW5lCVBURF9FUF9NU0sJKDB4ZiA8PCAxMikKKwl1MTYgbGVuOworI2RlZmluZQlQVERfTEVOX01TSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUJUFREX0RJUl9NU0sJKDMgPDwgMTApCisjZGVmaW5lCVBURF9ESVJfU0VUVVAJKDApCisjZGVmaW5lCVBURF9ESVJfT1VUCSgxKQorI2RlZmluZQlQVERfRElSX0lOCSgyKQorI2RlZmluZQlQVERfQjVfNV9NU0sJKDEgPDwgMTMpCisJdTE2IGZhZGRyOworI2RlZmluZQlQVERfRkFfTVNLCSgweDdmIDw8IDApCisjZGVmaW5lCVBURF9GTVRfTVNLCSgxIDw8IDcpCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoMikpKTsKKworc3RydWN0IGlzcDExNnhfZXAgeworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCBwdGQgcHRkOworCisJdTggbWF4cGFja2V0OworCXU4IGVwbnVtOworCXU4IG5leHRwaWQ7CisKKwl1MTYgbGVuZ3RoOwkJLyogb2YgY3VycmVudCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiB0byBkYXRhYnVmICovCisKKwl1MTYgZXJyb3JfY291bnQ7Cit9OworCisvKiBVUkIgc3RydWN0ICovCisjZGVmaW5lIE5fVVJCX1RECQk0OAorI2RlZmluZSBVUkJfREVMCQkJMQordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBpc3AxMTZ4X2VwICplZDsKKwl2b2lkICp0cmFuc2Zlcl9idWZmZXI7CS8qIChpbikgYXNzb2NpYXRlZCBkYXRhIGJ1ZmZlciAqLworCWludCBhY3R1YWxfbGVuZ3RoOwkvKiAocmV0dXJuKSBhY3R1YWwgdHJhbnNmZXIgbGVuZ3RoICovCisJdW5zaWduZWQgbG9uZyBwaXBlOwkvKiAoaW4pIHBpcGUgaW5mb3JtYXRpb24gKi8KKyNpZiAwCisJaW50IHN0YXRlOworI2VuZGlmCit9IHVyYl9wcml2X3Q7CisKK3N0cnVjdCBpc3AxMTZ4X3BsYXRmb3JtX2RhdGEgeworCS8qIEVuYWJsZSBpbnRlcm5hbCByZXNpc3RvcnMgb24gZG93bnN0cmVhbSBwb3J0cyAqLworCXVuc2lnbmVkIHNlbDE1S3JlczoxOworCS8qIE9uLWNoaXAgb3ZlcmN1cnJlbnQgZGV0ZWN0aW9uICovCisJdW5zaWduZWQgb2NfZW5hYmxlOjE7CisJLyogRW5hYmxlIHdha2V1cCBieSBkZXZpY2VzIG9uIHVzYiBidXMgKGUuZy4gd2FrZXVwCisJICAgYnkgYXR0YWNobWVudC9kZXRhY2htZW50IG9yIGJ5IGRldmljZSBhY3Rpdml0eQorCSAgIHN1Y2ggYXMgbW92aW5nIGEgbW91c2UpLiBXaGVuIGNob3NlbiwgdGhpcyBvcHRpb24KKwkgICBwcmV2ZW50cyBzdG9wcGluZyBpbnRlcm5hbCBjbG9jaywgaW5jcmVhc2luZworCSAgIHRoZXJlYnkgcG93ZXIgY29uc3VtcHRpb24gaW4gc3VzcGVuZGVkIHN0YXRlLiAqLworCXVuc2lnbmVkIHJlbW90ZV93YWtldXBfZW5hYmxlOjE7Cit9OworCitzdHJ1Y3QgaXNwMTE2eCB7CisJdTE2ICphZGRyX3JlZzsKKwl1MTYgKmRhdGFfcmVnOworCisJc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSAqYm9hcmQ7CisKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJdW5zaWduZWQgbG9uZyBzdGF0MSwgc3RhdDIsIHN0YXQ0LCBzdGF0OCwgc3RhdDE2OworCisJLyogU3RhdHVzIGZsYWdzICovCisJdW5zaWduZWQgZGlzYWJsZWQ6MTsKKwl1bnNpZ25lZCBzbGVlcGluZzoxOworCisJLyogUm9vdCBodWIgcmVnaXN0ZXJzICovCisJdTMyIHJoZGVzY2E7CisJdTMyIHJoZGVzY2I7CisJdTMyIHJoc3RhdHVzOworCXUzMiByaHBvcnRbMl07CisKKwkvKiBTY2hlZHVsZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqYXRsX2FjdGl2ZTsKKwlpbnQgYXRsX2J1ZmxlbjsKKwlpbnQgYXRsX2J1ZnNocnQ7CisJaW50IGF0bF9sYXN0X2RpcjsKKwlpbnQgYXRsX2ZpbmlzaGluZzsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogSW50ZXItaW8gZGVsYXkgKG5zKS4gVGhlIGNoaXAgaXMgcGlja3kgYWJvdXQgYWNjZXNzIHRpbWluZ3M7IGl0CisgKiBleHBlY3RzIGF0IGxlYXN0OgorICogMTUwbnMgZGVsYXkgYmV0d2VlbiBjb25zZWN1dGl2ZSBhY2Nlc3NlcyB0byBEQVRBX1JFRywKKyAqIDMwMG5zIGRlbGF5IGJldHdlZW4gYWNjZXNzIHRvIEFERFJfUkVHIGFuZCBEQVRBX1JFRworICogT0UsIFdFIE1VU1QgTk9UIGJlIGNoYW5nZWQgZHVyaW5nIHRoZXNlIGludGVydmFscworICovCisjaWYgZGVmaW5lZChVREVMQVkpCisjZGVmaW5lCWlzcDExNnhfZGVsYXkoaCxkKQl1ZGVsYXkoZCkKKyNlbHNlCisjZGVmaW5lCWlzcDExNnhfZGVsYXkoaCxkKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTE2eF93cml0ZV9hZGRyKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1bnNpZ25lZCByZWcpCit7CisJd3JpdGV3KHJlZyAmIDB4ZmYsIGlzcDExNngtPmFkZHJfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMTZ4X3dyaXRlX2RhdGExNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdTE2IHZhbCkKK3sKKwl3cml0ZXcodmFsLCBpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1MTYgdmFsKQoreworCV9fcmF3X3dyaXRldyh2YWwsIGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGlzcDExNnhfcmVhZF9kYXRhMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTE2IHZhbDsKKworCXZhbCA9IHJlYWR3KGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MTYgaXNwMTE2eF9yYXdfcmVhZF9kYXRhMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTE2IHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWR3KGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzcDExNnhfd3JpdGVfZGF0YTMyKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1MzIgdmFsKQoreworCXdyaXRldyh2YWwgJiAweGZmZmYsIGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7CisJd3JpdGV3KHZhbCA+PiAxNiwgaXNwMTE2eC0+ZGF0YV9yZWcpOworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgVURFTEFZKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaXNwMTE2eF9yZWFkX2RhdGEzMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKHUzMikgcmVhZHcoaXNwMTE2eC0+ZGF0YV9yZWcpOworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgVURFTEFZKTsKKwl2YWwgfD0gKCh1MzIpIHJlYWR3KGlzcDExNngtPmRhdGFfcmVnKSkgPDwgMTY7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworCXJldHVybiB2YWw7Cit9CisKKy8qIExldCdzIGtlZXAgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyBvdXQgb2YgbGluZS4gSGludDoKKyAgIHdlIHdhaXQgYXQgbGVhc3QgMTUwIG5zIGF0IGV2ZXJ5IGFjY2Vzcy4KKyovCitzdGF0aWMgdTE2IGlzcDExNnhfcmVhZF9yZWcxNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcpOworCXJldHVybiBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworfQorCitzdGF0aWMgdTMyIGlzcDExNnhfcmVhZF9yZWczMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcpOworCXJldHVybiBpc3AxMTZ4X3JlYWRfZGF0YTMyKGlzcDExNngpOworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3dyaXRlX3JlZzE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1bnNpZ25lZCByZWcsCisJCQkJdW5zaWduZWQgdmFsKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcgfCBJU1AxMTZ4X1dSSVRFX09GRlNFVCk7CisJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgKHUxNikgKHZhbCAmIDB4ZmZmZikpOworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3dyaXRlX3JlZzMyKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1bnNpZ25lZCByZWcsCisJCQkJdW5zaWduZWQgdmFsKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcgfCBJU1AxMTZ4X1dSSVRFX09GRlNFVCk7CisJaXNwMTE2eF93cml0ZV9kYXRhMzIoaXNwMTE2eCwgKHUzMikgdmFsKTsKK30KKworLyogLS0tIFVTQiBIVUIgY29uc3RhbnRzIChub3QgT0hDSS1zcGVjaWZpYzsgc2VlIGh1Yi5oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBkZXN0aW5hdGlvbiBvZiByZXF1ZXN0ICovCisjZGVmaW5lIFJIX0lOVEVSRkFDRSAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkhfRU5EUE9JTlQgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSSF9PVEhFUiAgICAgICAgICAgICAgICAgICAweDAzCisKKyNkZWZpbmUgUkhfQ0xBU1MgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBSSF9WRU5ET1IgICAgICAgICAgICAgICAgICAweDQwCisKKy8qIFJlcXVlc3RzOiBiUmVxdWVzdCA8PCA4IHwgYm1SZXF1ZXN0VHlwZSAqLworI2RlZmluZSBSSF9HRVRfU1RBVFVTICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUkhfQ0xFQVJfRkVBVFVSRSAgICAgICAgMHgwMTAwCisjZGVmaW5lIFJIX1NFVF9GRUFUVVJFICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBSSF9TRVRfQUREUkVTUyAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgUkhfR0VUX0RFU0NSSVBUT1IgICAgICAgMHgwNjgwCisjZGVmaW5lIFJIX1NFVF9ERVNDUklQVE9SICAgICAgIDB4MDcwMAorI2RlZmluZSBSSF9HRVRfQ09ORklHVVJBVElPTiAgICAweDA4ODAKKyNkZWZpbmUgUkhfU0VUX0NPTkZJR1VSQVRJT04gICAgMHgwOTAwCisjZGVmaW5lIFJIX0dFVF9TVEFURSAgICAgICAgICAgIDB4MDI4MAorI2RlZmluZSBSSF9HRVRfSU5URVJGQUNFICAgICAgICAweDBBODAKKyNkZWZpbmUgUkhfU0VUX0lOVEVSRkFDRSAgICAgICAgMHgwQjAwCisjZGVmaW5lIFJIX1NZTkNfRlJBTUUgICAgICAgICAgIDB4MEM4MAorLyogT3VyIFZlbmRvciBTcGVjaWZpYyBSZXF1ZXN0ICovCisjZGVmaW5lIFJIX1NFVF9FUCAgICAgICAgICAgICAgIDB4MjAwMAorCisvKiBIdWIgcG9ydCBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9QT1JUX0NPTk5FQ1RJT04gICAgICAgICAweDAwCisjZGVmaW5lIFJIX1BPUlRfRU5BQkxFICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkhfUE9SVF9TVVNQRU5EICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSSF9QT1JUX09WRVJfQ1VSUkVOVCAgICAgICAweDAzCisjZGVmaW5lIFJIX1BPUlRfUkVTRVQgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUkhfUE9SVF9QT1dFUiAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBSSF9QT1JUX0xPV19TUEVFRCAgICAgICAgICAweDA5CisKKyNkZWZpbmUgUkhfQ19QT1JUX0NPTk5FQ1RJT04gICAgICAgMHgxMAorI2RlZmluZSBSSF9DX1BPUlRfRU5BQkxFICAgICAgICAgICAweDExCisjZGVmaW5lIFJIX0NfUE9SVF9TVVNQRU5EICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCAgICAgMHgxMworI2RlZmluZSBSSF9DX1BPUlRfUkVTRVQgICAgICAgICAgICAweDE0CisKKy8qIEh1YiBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9DX0hVQl9MT0NBTF9QT1dFUiAgICAgICAweDAwCisjZGVmaW5lIFJIX0NfSFVCX09WRVJfQ1VSUkVOVCAgICAgIDB4MDEKKworI2RlZmluZSBSSF9ERVZJQ0VfUkVNT1RFX1dBS0VVUCAgICAweDAwCisjZGVmaW5lIFJIX0VORFBPSU5UX1NUQUxMICAgICAgICAgIDB4MDEKKworI2RlZmluZSBSSF9BQ0sgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJIX1JFUV9FUlIgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIFJIX05BQ0sgICAgICAgICAgICAgICAgICAgIDB4MDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGFuOTFjOTYuYyBiL2RyaXZlcnMvbGFuOTFjOTYuYwppbmRleCBhNTBjNWYwLi5lY2RjYmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xhbjkxYzk2LmMKKysrIGIvZHJpdmVycy9sYW45MWM5Ni5jCkBAIC02NSw3ICs2NSw3IEBACiAKICNpZmRlZiBDT05GSUdfRFJJVkVSX0xBTjkxQzk2CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2IuYyBiL2RyaXZlcnMvbWFjYi5jCmluZGV4IDE4NmFiMTkuLjk1Y2RjNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjYi5jCisrKyBiL2RyaXZlcnMvbWFjYi5jCkBAIC0xNyw3ICsxNyw4IEBACiAgKi8KICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX01BQ0IpICYmIChDT05GSUdfQ09NTUFORFMgJiAoQ0ZHX0NNRF9ORVQgfCBDRkdfQ01EX01JSSkpCisjaWYgZGVmaW5lZChDT05GSUdfTUFDQikgXAorCSYmIChkZWZpbmVkKENPTkZJR19DTURfTkVUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkKIAogLyoKICAqIFRoZSB1LWJvb3QgbmV0d29ya2luZyBzdGFjayBpcyBhIGxpdHRsZSB3ZWlyZC4gIEl0IHNlZW1zIGxpa2UgdGhlCkBAIC01MSw2ICs1Miw4IEBACiAKICNpbmNsdWRlICJtYWNiLmgiCiAKKyNkZWZpbmUgYmFycmllcigpIGFzbSB2b2xhdGlsZSgiIiA6OjogIm1lbW9yeSIpCisKICNkZWZpbmUgQ0ZHX01BQ0JfUlhfQlVGRkVSX1NJWkUJCTQwOTYKICNkZWZpbmUgQ0ZHX01BQ0JfUlhfUklOR19TSVpFCQkoQ0ZHX01BQ0JfUlhfQlVGRkVSX1NJWkUgLyAxMjgpCiAjZGVmaW5lIENGR19NQUNCX1RYX1JJTkdfU0laRQkJMTYKQEAgLTE2Myw3ICsxNjYsNyBAQAogCXJldHVybiBNQUNCX0JGRVhUKERBVEEsIGZyYW1lKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiBzdGF0aWMgaW50IG1hY2Jfc2VuZChzdHJ1Y3QgZXRoX2RldmljZSAqbmV0ZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsCiAJCSAgICAgaW50IGxlbmd0aCkKQEAgLTE4NSwzMSArMTg4LDMxIEBACiAKIAltYWNiLT50eF9yaW5nW3R4X2hlYWRdLmN0cmwgPSBjdHJsOwogCW1hY2ItPnR4X3JpbmdbdHhfaGVhZF0uYWRkciA9IHBhZGRyOworCWJhcnJpZXIoKTsKIAltYWNiX3dyaXRlbChtYWNiLCBOQ1IsIE1BQ0JfQklUKFRFKSB8IE1BQ0JfQklUKFJFKSB8IE1BQ0JfQklUKFRTVEFSVCkpOwogCiAJLyoKIAkgKiBJIGd1ZXNzIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5ldHdvcmtpbmcgY29yZSBtYXkKIAkgKiByZS11c2UgdGhlIHRyYW5zbWl0IGJ1ZmZlciBhcyBzb29uIGFzIHdlIHJldHVybi4uLgogCSAqLwotCWkgPSAwOwotCXdoaWxlICghKG1hY2ItPnR4X3JpbmdbdHhfaGVhZF0uY3RybCAmIFRYQlVGX1VTRUQpKSB7Ci0JCWlmIChpID4gQ0ZHX01BQ0JfVFhfVElNRU9VVCkgewotCQkJcHJpbnRmKCIlczogVFggdGltZW91dFxuIiwgbmV0ZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDw9IENGR19NQUNCX1RYX1RJTUVPVVQ7IGkrKykgeworCQliYXJyaWVyKCk7CisJCWN0cmwgPSBtYWNiLT50eF9yaW5nW3R4X2hlYWRdLmN0cmw7CisJCWlmIChjdHJsICYgVFhCVUZfVVNFRCkKIAkJCWJyZWFrOwotCQl9CiAJCXVkZWxheSgxKTsKLQkJaSsrOwogCX0KIAogCWRtYV91bm1hcF9zaW5nbGUocGFja2V0LCBsZW5ndGgsIHBhZGRyKTsKIAogCWlmIChpIDw9IENGR19NQUNCX1RYX1RJTUVPVVQpIHsKLQkJY3RybCA9IG1hY2ItPnR4X3JpbmdbdHhfaGVhZF0uY3RybDsKIAkJaWYgKGN0cmwgJiBUWEJVRl9VTkRFUlJVTikKIAkJCXByaW50ZigiJXM6IFRYIHVuZGVycnVuXG4iLCBuZXRkZXYtPm5hbWUpOwogCQlpZiAoY3RybCAmIFRYQlVGX0VYSEFVU1RFRCkKIAkJCXByaW50ZigiJXM6IFRYIGJ1ZmZlcnMgZXhoYXVzdGVkIGluIG1pZCBmcmFtZVxuIiwKIAkJCSAgICAgICBuZXRkZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCXByaW50ZigiJXM6IFRYIHRpbWVvdXRcbiIsIG5ldGRldi0+bmFtZSk7CiAJfQogCiAJLyogTm8gb25lIGNhcmVzIGFueXdheSAqLwpAQCAtMjM0LDYgKzIzNyw3IEBACiAJCWkrKzsKIAl9CiAKKwliYXJyaWVyKCk7CiAJbWFjYi0+cnhfdGFpbCA9IG5ld190YWlsOwogfQogCkBAIC0yODMsMTEgKzI4NywzOCBAQAogCQkJCXJ4X3RhaWwgPSAwOwogCQkJfQogCQl9CisJCWJhcnJpZXIoKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbWFjYl9waHlfcmVzZXQoc3RydWN0IG1hY2JfZGV2aWNlICptYWNiKQoreworCXN0cnVjdCBldGhfZGV2aWNlICpuZXRkZXYgPSAmbWFjYi0+bmV0ZGV2OworCWludCBpOworCXUxNiBzdGF0dXMsIGFkdjsKKworCWFkdiA9IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX0FMTDsKKwltYWNiX21kaW9fd3JpdGUobWFjYiwgTUlJX0FEVkVSVElTRSwgYWR2KTsKKwlwcmludGYoIiVzOiBTdGFydGluZyBhdXRvbmVnb3RpYXRpb24uLi5cbiIsIG5ldGRldi0+bmFtZSk7CisJbWFjYl9tZGlvX3dyaXRlKG1hY2IsIE1JSV9CTUNSLCAoQk1DUl9BTkVOQUJMRQorCQkJCQkgfCBCTUNSX0FOUkVTVEFSVCkpOworCisJZm9yIChpID0gMDsgaSA8IENGR19NQUNCX0FVVE9ORUdfVElNRU9VVCAvIDEwMDsgaSsrKSB7CisJCXN0YXR1cyA9IG1hY2JfbWRpb19yZWFkKG1hY2IsIE1JSV9CTVNSKTsKKwkJaWYgKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKworCWlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkKKwkJcHJpbnRmKCIlczogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlXG4iLCBuZXRkZXYtPm5hbWUpOworCWVsc2UKKwkJcHJpbnRmKCIlczogQXV0b25lZ290aWF0aW9uIHRpbWVkIG91dCAoc3RhdHVzPTB4JTA0eClcbiIsCisJCSAgICAgICBuZXRkZXYtPm5hbWUsIHN0YXR1cyk7Cit9CisKIHN0YXRpYyBpbnQgbWFjYl9waHlfaW5pdChzdHJ1Y3QgbWFjYl9kZXZpY2UgKm1hY2IpCiB7CiAJc3RydWN0IGV0aF9kZXZpY2UgKm5ldGRldiA9ICZtYWNiLT5uZXRkZXY7CkBAIC0zMDMsMzYgKzMzNCwxNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlhZHYgPSBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9BTEw7Ci0JbWFjYl9tZGlvX3dyaXRlKG1hY2IsIE1JSV9BRFZFUlRJU0UsIGFkdik7Ci0JcHJpbnRmKCIlczogU3RhcnRpbmcgYXV0b25lZ290aWF0aW9uLi4uXG4iLCBuZXRkZXYtPm5hbWUpOwotCW1hY2JfbWRpb193cml0ZShtYWNiLCBNSUlfQk1DUiwgKEJNQ1JfQU5FTkFCTEUKLQkJCQkJIHwgQk1DUl9BTlJFU1RBUlQpKTsKLQotI2lmIDAKLQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQotCQlwcmludGYoIm1paSVkOiAweCUwNHhcbiIsIGksIG1hY2JfbWRpb19yZWFkKG1hY2IsIGkpKTsKLSNlbmRpZgotCi0JZm9yIChpID0gMDsgaSA8IENGR19NQUNCX0FVVE9ORUdfVElNRU9VVCAvIDEwMDsgaSsrKSB7Ci0JCXN0YXR1cyA9IG1hY2JfbWRpb19yZWFkKG1hY2IsIE1JSV9CTVNSKTsKLQkJaWYgKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMDApOwotCX0KLQotCWlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkKLQkJcHJpbnRmKCIlczogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlXG4iLCBuZXRkZXYtPm5hbWUpOwotCWVsc2UKLQkJcHJpbnRmKCIlczogQXV0b25lZ290aWF0aW9uIHRpbWVkIG91dCAoc3RhdHVzPTB4JTA0eClcbiIsCi0JCSAgICAgICBuZXRkZXYtPm5hbWUsIHN0YXR1cyk7Ci0KKwlzdGF0dXMgPSBtYWNiX21kaW9fcmVhZChtYWNiLCBNSUlfQk1TUik7CiAJaWYgKCEoc3RhdHVzICYgQk1TUl9MU1RBVFVTKSkgeworCQkvKiBUcnkgdG8gcmUtbmVnb3RpYXRlIGlmIHdlIGRvbid0IGhhdmUgbGluayBhbHJlYWR5LiAqLworCQltYWNiX3BoeV9yZXNldChtYWNiKTsKKwogCQlmb3IgKGkgPSAwOyBpIDwgQ0ZHX01BQ0JfQVVUT05FR19USU1FT1VUIC8gMTAwOyBpKyspIHsKLQkJCXVkZWxheSgxMDApOwogCQkJc3RhdHVzID0gbWFjYl9tZGlvX3JlYWQobWFjYiwgTUlJX0JNU1IpOwogCQkJaWYgKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykKIAkJCQlicmVhazsKKwkJCXVkZWxheSgxMDApOwogCQl9CiAJfQogCkBAIC0zNDEsNiArMzUyLDcgQEAKIAkJICAgICAgIG5ldGRldi0+bmFtZSwgc3RhdHVzKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKKwkJYWR2ID0gbWFjYl9tZGlvX3JlYWQobWFjYiwgTUlJX0FEVkVSVElTRSk7CiAJCWxwYSA9IG1hY2JfbWRpb19yZWFkKG1hY2IsIE1JSV9MUEEpOwogCQltZWRpYSA9IG1paV9ud2F5X3Jlc3VsdChscGEgJiBhZHYpOwogCQlzcGVlZCA9IChtZWRpYSAmIChBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMDBIQUxGKQpAQCAtNDkyLDkgKzUwNCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCiBpbnQgbWlpcGh5X3JlYWQodW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgc2hvcnQgKnZhbHVlKQogewpAQCAtNTcwLDYgKzU4Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19NQUNCICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21wYzh4eF9wY21jaWEuYyBiL2RyaXZlcnMvbXBjOHh4X3BjbWNpYS5jCmluZGV4IDM5OWE3MTkuLjhhMzRjZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXBjOHh4X3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvbXBjOHh4X3BjbWNpYS5jCkBAIC02LDExICs2LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtMjMsNyArMjMsNyBAQAogZXh0ZXJuIGludCBwY21jaWFfaGFyZHdhcmVfZW5hYmxlIChpbnQgc2xvdCk7CiBleHRlcm4gaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCk7CiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGV4dGVybiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpOwogI2VuZGlmCiAKQEAgLTE4OSw3ICsxODksNyBAQAogCXJldHVybiByYzsKIH0KIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9vZmYgKHZvaWQpCiB7CiAJaW50IGk7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAlwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShfc2xvdF8pOwogCXJldHVybiAwOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiBzdGF0aWMgdV9pbnQgbTh4eF9nZXRfZ3JheWNvZGUodV9pbnQgc2l6ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kLmMgYi9kcml2ZXJzL25hbmQvbmFuZC5jCmluZGV4IDlmZWY3MWQuLjI3YjU3OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmFuZC9uYW5kLmMKKysrIGIvZHJpdmVycy9uYW5kL25hbmQuYwpAQCAtMjMsNyArMjMsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPG5hbmQuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kL25hbmRfYmFzZS5jIGIvZHJpdmVycy9uYW5kL25hbmRfYmFzZS5jCmluZGV4IGM2ZmVlMTguLjE1MWY1MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmFuZC9uYW5kX2Jhc2UuYworKysgYi9kcml2ZXJzL25hbmQvbmFuZF9iYXNlLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDx3YXRjaGRvZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kL25hbmRfYmJ0LmMgYi9kcml2ZXJzL25hbmQvbmFuZF9iYnQuYwppbmRleCBhYWE5NDAwLi4xOWE5YmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25hbmQvbmFuZF9iYnQuYworKysgYi9kcml2ZXJzL25hbmQvbmFuZF9iYnQuYwpAQCAtNTQsNyArNTQsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9jb21wYXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kX2VjYy5jIGIvZHJpdmVycy9uYW5kL25hbmRfZWNjLmMKaW5kZXggOTAyNzRlNi4uNGM1MzJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kL25hbmRfZWNjLmMKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfZWNjLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlPGxpbnV4L210ZC9tdGQuaD4KIApAQCAtMTk3LDQgKzE5Nyw0IEBACiAJcmV0dXJuIC0xOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kX2lkcy5jIGIvZHJpdmVycy9uYW5kL25hbmRfaWRzLmMKaW5kZXggNzBmZGZkMy4uNmQ3ZTM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kL25hbmRfaWRzLmMKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfaWRzLmMKQEAgLTEzLDcgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hbmQvbmFuZF91dGlsLmMgYi9kcml2ZXJzL25hbmQvbmFuZF91dGlsLmMKaW5kZXggMTBiZjAzNi4uY2YwNTA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kL25hbmRfdXRpbC5jCisrKyBiL2RyaXZlcnMvbmFuZC9uYW5kX3V0aWwuYwpAQCAtMzIsMTEgKzMyLDEyIEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHdhdGNoZG9nLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8ZGl2NjQuaD4KIAogI2luY2x1ZGUgPG5hbmQuaD4KICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgpAQCAtMjA4LDEwICsyMDksMTAgQEAKIAkJfQogCiAJCWlmICghb3B0cy0+cXVpZXQpIHsKLQkJCWludCBwZXJjZW50ID0gKGludCkKLQkJCQkoKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuID0odW5zaWduZWQgbG9uZyBsb25nKQogCQkJCSAoZXJhc2UuYWRkcittZW1pbmZvLT5lcmFzZXNpemUtb3B0cy0+b2Zmc2V0KQotCQkJCSAqIDEwMCAvIGVyYXNlX2xlbmd0aCk7CisJCQkJICogMTAwOworCQkJaW50IHBlcmNlbnQgPSAoaW50KWRvX2RpdihuLCBlcmFzZV9sZW5ndGgpOwogCiAJCQkvKiBvdXRwdXQgcHJvZ3Jlc3MgbWVzc2FnZSBvbmx5IGF0IHdob2xlIHBlcmNlbnQKIAkJCSAqIHN0ZXBzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHByaW50ZWQKQEAgLTQ3NSwxMCArNDc2LDkgQEAKIAkJaW1nbGVuIC09IHJlYWRsZW47CiAKIAkJaWYgKCFvcHRzLT5xdWlldCkgewotCQkJaW50IHBlcmNlbnQgPSAoaW50KQotCQkJCSgodW5zaWduZWQgbG9uZyBsb25nKQotCQkJCSAob3B0cy0+bGVuZ3RoLWltZ2xlbikgKiAxMDAKLQkJCQkgLyBvcHRzLT5sZW5ndGgpOworCQkJdW5zaWduZWQgbG9uZyBsb25nIG4gPSAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCSAob3B0cy0+bGVuZ3RoLWltZ2xlbikgKiAxMDA7CisJCQlpbnQgcGVyY2VudCA9IChpbnQpZG9fZGl2KG4sIG9wdHMtPmxlbmd0aCk7CiAJCQkvKiBvdXRwdXQgcHJvZ3Jlc3MgbWVzc2FnZSBvbmx5IGF0IHdob2xlIHBlcmNlbnQKIAkJCSAqIHN0ZXBzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHByaW50ZWQKIAkJCSAqIG9uIChzbG93KSBzZXJpYWwgY29uc29sZXMKQEAgLTY1MSwxMCArNjUxLDkgQEAKIAkJfQogCiAJCWlmICghb3B0cy0+cXVpZXQpIHsKLQkJCWludCBwZXJjZW50ID0gKGludCkKLQkJCQkoKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkgKG9wdHMtPmxlbmd0aC1pbWdsZW4pICogMTAwCi0JCQkJIC8gb3B0cy0+bGVuZ3RoKTsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuID0gKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkgKG9wdHMtPmxlbmd0aC1pbWdsZW4pICogMTAwOworCQkJaW50IHBlcmNlbnQgPSAoaW50KWRvX2RpdihuICxvcHRzLT5sZW5ndGgpOwogCQkJLyogb3V0cHV0IHByb2dyZXNzIG1lc3NhZ2Ugb25seSBhdCB3aG9sZSBwZXJjZW50CiAJCQkgKiBzdGVwcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBwcmludGVkCiAJCQkgKiBvbiAoc2xvdykgc2VyaWFsIGNvbnNvbGVzCkBAIC04NTksNCArODU4LDQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hbmRfbGVnYWN5L25hbmRfbGVnYWN5LmMgYi9kcml2ZXJzL25hbmRfbGVnYWN5L25hbmRfbGVnYWN5LmMKaW5kZXggNDU4MDQ2ZC4uNDlkMmViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kX2xlZ2FjeS9uYW5kX2xlZ2FjeS5jCisrKyBiL2RyaXZlcnMvbmFuZF9sZWdhY3kvbmFuZF9sZWdhY3kuYwpAQCAtMTUsMTQgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDx3YXRjaGRvZy5oPgogCi0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQlzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQotI2Vsc2UKLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCi0jZW5kaWYKLQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2lkcy5oPgpAQCAtMTYxNiw0ICsxNjA5LDQgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfSkZGUzJfTkFORCAqLwogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmF0c2VtaS5jIGIvZHJpdmVycy9uYXRzZW1pLmMKaW5kZXggYjAwOWRiNi4uMDc1ZDZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYXRzZW1pLmMKKysrIGIvZHJpdmVycy9uYXRzZW1pLmMKQEAgLTU2LDggKzU2LDggQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxwY2kuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCi0JZGVmaW5lZChDT05GSUdfTkFUU0VNSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19OQVRTRU1JKQogCiAvKiBkZWZpbmVzICovCiAjZGVmaW5lIEVFUFJPTV9TSVpFIDB4YiAvKjEyIDE2LWJpdCBjaHVua3MsIG9yIDI0IGJ5dGVzKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0YXJtX2V0aC5jIGIvZHJpdmVycy9uZXRhcm1fZXRoLmMKaW5kZXggODliM2E4My4uYTk5ZWU1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXRhcm1fZXRoLmMKKysrIGIvZHJpdmVycy9uZXRhcm1fZXRoLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9uZXRhcm1fcmVnaXN0ZXJzLmg+CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiBzdGF0aWMgaW50IG5hX21paV9wb2xsX2J1c3kgKHZvaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25zODM4MnguYyBiL2RyaXZlcnMvbnM4MzgyeC5jCmluZGV4IDk3NmY4NmEuLmY4YjE0M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnM4MzgyeC5jCisrKyBiL2RyaXZlcnMvbnM4MzgyeC5jCkBAIC01Niw4ICs1Niw4IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8cGNpLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAotCWRlZmluZWQoQ09ORklHX05TODM4MlgpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgXAorCSYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgZGVmaW5lZChDT05GSUdfTlM4MzgyWCkKIAogLyogZGVmaW5lcyAqLwogI2RlZmluZSBEU0laRSAgICAgMHgwMDAwMEZGRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kuYyBiL2RyaXZlcnMvcGNpLmMKaW5kZXggMDUwNTgyZi4uNDE1ODkxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kuYworKysgYi9kcml2ZXJzL3BjaS5jCkBAIC00OTAsMTAgKzQ5MCwxNiBAQAogCiBpbnQgcGNpX2hvc2Vfc2NhbihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiB7CisJLyogU3RhcnQgc2NhbiBhdCBjdXJyZW50X2J1c25vLgorCSAqIFBDSWUgd2lsbCBzdGFydCBzY2FuIGF0IGZpcnN0X2J1c25vKzEuCisJICovCisJLyogRm9yIGxlZ2FjeSBzdXBwb3J0LCBlbnN1cmUgY3VycmVudD49Zmlyc3QgKi8KKwlpZiAoaG9zZS0+Zmlyc3RfYnVzbm8gPiBob3NlLT5jdXJyZW50X2J1c25vKQorCQlob3NlLT5jdXJyZW50X2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CiAjaWZkZWYgQ09ORklHX1BDSV9QTlAKIAlwY2lhdXRvX2NvbmZpZ19pbml0KGhvc2UpOwogI2VuZGlmCi0JcmV0dXJuIHBjaV9ob3NlX3NjYW5fYnVzKGhvc2UsIGhvc2UtPmZpcnN0X2J1c25vKTsKKwlyZXR1cm4gcGNpX2hvc2Vfc2Nhbl9idXMoaG9zZSwgaG9zZS0+Y3VycmVudF9idXNubyk7CiB9CiAKIHZvaWQgcGNpX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpX2F1dG8uYyBiL2RyaXZlcnMvcGNpX2F1dG8uYwppbmRleCBmMTcwYzJkLi4yMzc4NTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaV9hdXRvLmMKKysrIGIvZHJpdmVycy9wY2lfYXV0by5jCkBAIC02NSw3ICs2NSw3IEBACiAKIAlyZXMtPmJ1c19sb3dlciA9IGFkZHIgKyBzaXplOwogCi0JREVCVUdGKCJhZGRyZXNzPTB4JWx4IiwgYWRkcik7CisJREVCVUdGKCJhZGRyZXNzPTB4JWx4IGJ1c19sb3dlcj0leCIsIGFkZHIsIHJlcy0+YnVzX2xvd2VyKTsKIAogCSpiYXIgPSBhZGRyOwogCXJldHVybiAwOwpAQCAtOTQsNyArOTQsNyBAQAogCXBjaV9ob3NlX3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsICZjbWRzdGF0KTsKIAljbWRzdGF0ID0gKGNtZHN0YXQgJiB+KFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKSkgfCBQQ0lfQ09NTUFORF9NQVNURVI7CiAKLQlmb3IgKGJhciA9IFBDSV9CQVNFX0FERFJFU1NfMDsgYmFyIDw9IFBDSV9CQVNFX0FERFJFU1NfMCArIChiYXJzX251bSo0KTsgYmFyICs9IDQpIHsKKwlmb3IgKGJhciA9IFBDSV9CQVNFX0FERFJFU1NfMDsgYmFyIDwgUENJX0JBU0VfQUREUkVTU18wICsgKGJhcnNfbnVtKjQpOyBiYXIgKz0gNCkgewogCQkvKiBUaWNrbGUgdGhlIEJBUiBhbmQgZ2V0IHRoZSByZXNwb25zZSAqLwogCQlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBiYXIsIDB4ZmZmZmZmZmYpOwogCQlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIGJhciwgJmJhcl9yZXNwb25zZSk7CkBAIC0xNTQsNyArMTU0LDcgQEAKIAlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKIH0KIAotc3RhdGljIHZvaWQgcGNpYXV0b19wcmVzY2FuX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCit2b2lkIHBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAogCQkJCQkgcGNpX2Rldl90IGRldiwgaW50IHN1Yl9idXMpCiB7CiAJc3RydWN0IHBjaV9yZWdpb24gKnBjaV9tZW0gPSBob3NlLT5wY2lfbWVtOwpAQCAtMTY1LDggKzE2NSwxMCBAQAogCXBjaV9ob3NlX3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsICZjbWRzdGF0KTsKIAogCS8qIENvbmZpZ3VyZSBidXMgbnVtYmVyIHJlZ2lzdGVycyAqLwotCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX1BSSU1BUllfQlVTLCBQQ0lfQlVTKGRldikpOwotCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX1NFQ09OREFSWV9CVVMsIHN1Yl9idXMpOworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX1BSSU1BUllfQlVTLAorCQkJCSAgIFBDSV9CVVMoZGV2KSAtIGhvc2UtPmZpcnN0X2J1c25vKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9TRUNPTkRBUllfQlVTLAorCQkJCSAgIHN1Yl9idXMgLSBob3NlLT5maXJzdF9idXNubyk7CiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfU1VCT1JESU5BVEVfQlVTLCAweGZmKTsKIAogCWlmIChwY2lfbWVtKSB7CkBAIC0yMTEsNyArMjEzLDcgQEAKIAlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgY21kc3RhdCB8IFBDSV9DT01NQU5EX01BU1RFUik7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKK3ZvaWQgcGNpYXV0b19wb3N0c2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAogCQkJCQkgIHBjaV9kZXZfdCBkZXYsIGludCBzdWJfYnVzKQogewogCXN0cnVjdCBwY2lfcmVnaW9uICpwY2lfbWVtID0gaG9zZS0+cGNpX21lbTsKQEAgLTIxOSw3ICsyMjEsOCBAQAogCXN0cnVjdCBwY2lfcmVnaW9uICpwY2lfaW8gPSBob3NlLT5wY2lfaW87CiAKIAkvKiBDb25maWd1cmUgYnVzIG51bWJlciByZWdpc3RlcnMgKi8KLQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9TVUJPUkRJTkFURV9CVVMsIHN1Yl9idXMpOworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX1NVQk9SRElOQVRFX0JVUywKKwkJCQkgICBzdWJfYnVzIC0gaG9zZS0+Zmlyc3RfYnVzbm8pOwogCiAJaWYgKHBjaV9tZW0pIHsKIAkJLyogUm91bmQgbWVtb3J5IGFsbG9jYXRvciB0byAxTUIgYm91bmRhcnkgKi8KQEAgLTI4MiwyNSArMjg1LDM2IEBACiAJaWYgKGhvc2UtPnBjaV9tZW0pIHsKIAkJcGNpYXV0b19yZWdpb25faW5pdChob3NlLT5wY2lfbWVtKTsKIAotCQlERUJVR0YoIlBDSSBBdXRvY29uZmlnOiBNZW1vcnkgcmVnaW9uOiBbJWx4LSVseF1cbiIsCisJCURFQlVHRigiUENJIEF1dG9jb25maWc6IEJ1cyBNZW1vcnkgcmVnaW9uOiBbJWx4LSVseF0sXG4iCisJCSAgICAgICAiXHRcdFBoeXNpY2FsIE1lbW9yeSBbJXgtJXhdXG4iLAogCQkgICAgaG9zZS0+cGNpX21lbS0+YnVzX3N0YXJ0LAotCQkgICAgaG9zZS0+cGNpX21lbS0+YnVzX3N0YXJ0ICsgaG9zZS0+cGNpX21lbS0+c2l6ZSAtIDEpOworCQkgICAgaG9zZS0+cGNpX21lbS0+YnVzX3N0YXJ0ICsgaG9zZS0+cGNpX21lbS0+c2l6ZSAtIDEsCisJCSAgICBob3NlLT5wY2lfbWVtLT5waHlzX3N0YXJ0LAorCQkgICAgaG9zZS0+cGNpX21lbS0+cGh5c19zdGFydCArIGhvc2UtPnBjaV9tZW0tPnNpemUgLSAxKTsKIAl9CiAKIAlpZiAoaG9zZS0+cGNpX3ByZWZldGNoKSB7CiAJCXBjaWF1dG9fcmVnaW9uX2luaXQoaG9zZS0+cGNpX3ByZWZldGNoKTsKIAotCQlERUJVR0YoIlBDSSBBdXRvY29uZmlnOiBQcmVmZXRjaGFibGUgTWVtb3J5IHJlZ2lvbjogWyVseC0lbHhdXG4iLAorCQlERUJVR0YoIlBDSSBBdXRvY29uZmlnOiBCdXMgUHJlZmV0Y2hhYmxlIE1lbTogWyVseC0lbHhdLFxuIgorCQkgICAgICAgIlx0XHRQaHlzaWNhbCBNZW1vcnkgWyV4LSV4XVxuIiwKIAkJICAgIGhvc2UtPnBjaV9wcmVmZXRjaC0+YnVzX3N0YXJ0LAotCQkgICAgaG9zZS0+cGNpX3ByZWZldGNoLT5idXNfc3RhcnQgKyBob3NlLT5wY2lfcHJlZmV0Y2gtPnNpemUgLSAxKTsKKwkJICAgIGhvc2UtPnBjaV9wcmVmZXRjaC0+YnVzX3N0YXJ0ICsgaG9zZS0+cGNpX3ByZWZldGNoLT5zaXplIC0gMSwKKwkJICAgIGhvc2UtPnBjaV9wcmVmZXRjaC0+cGh5c19zdGFydCwKKwkJICAgIGhvc2UtPnBjaV9wcmVmZXRjaC0+cGh5c19zdGFydCArCisJCQkJaG9zZS0+cGNpX3ByZWZldGNoLT5zaXplIC0gMSk7CiAJfQogCiAJaWYgKGhvc2UtPnBjaV9pbykgewogCQlwY2lhdXRvX3JlZ2lvbl9pbml0KGhvc2UtPnBjaV9pbyk7CiAKLQkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogSS9PIHJlZ2lvbjogWyVseC0lbHhdXG4iLAorCQlERUJVR0YoIlBDSSBBdXRvY29uZmlnOiBCdXMgSS9PIHJlZ2lvbjogWyVseC0lbHhdLFxuIgorCQkgICAgICAgIlx0XHRQaHlzaWNhbCBNZW1vcnk6IFsleC0leF1cbiIsCiAJCSAgICBob3NlLT5wY2lfaW8tPmJ1c19zdGFydCwKLQkJICAgIGhvc2UtPnBjaV9pby0+YnVzX3N0YXJ0ICsgaG9zZS0+cGNpX2lvLT5zaXplIC0gMSk7CisJCSAgICBob3NlLT5wY2lfaW8tPmJ1c19zdGFydCArIGhvc2UtPnBjaV9pby0+c2l6ZSAtIDEsCisJCSAgICBob3NlLT5wY2lfaW8tPnBoeXNfc3RhcnQsCisJCSAgICBob3NlLT5wY2lfaW8tPnBoeXNfc3RhcnQgKyBob3NlLT5wY2lfaW8tPnNpemUgLSAxKTsKKwogCX0KIH0KIApAQCAtMzE3LDYgKzMzMSwxMiBAQAogCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQ0xBU1NfREVWSUNFLCAmY2xhc3MpOwogCiAJc3dpdGNoKGNsYXNzKSB7CisJY2FzZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX1BPV0VSUEM6IC8qIGFuIGFnZW50IG9yIGVuZC1wb2ludCAqLworCQlERUJVR0YoIlBDSSBBdXRvQ29uZmlnOiBGb3VuZCBQb3dlclBDIGRldmljZVxuIik7CisJCXBjaWF1dG9fc2V0dXBfZGV2aWNlKGhvc2UsIGRldiwgNiwgaG9zZS0+cGNpX21lbSwKKwkJCQkgICAgIGhvc2UtPnBjaV9wcmVmZXRjaCwgaG9zZS0+cGNpX2lvKTsKKwkJYnJlYWs7CisKIAljYXNlIFBDSV9DTEFTU19CUklER0VfUENJOgogCQlob3NlLT5jdXJyZW50X2J1c25vKys7CiAJCXBjaWF1dG9fc2V0dXBfZGV2aWNlKGhvc2UsIGRldiwgMiwgaG9zZS0+cGNpX21lbSwgaG9zZS0+cGNpX3ByZWZldGNoLCBob3NlLT5wY2lfaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2lfaW5kaXJlY3QuYyBiL2RyaXZlcnMvcGNpX2luZGlyZWN0LmMKaW5kZXggZDdiZTA4MS4uYTgyMjBmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2lfaW5kaXJlY3QuYworKysgYi9kcml2ZXJzL3BjaV9pbmRpcmVjdC5jCkBAIC00NSw3ICs0NSw3IEBACiAJY2ZnXyMjcncodmFsLCBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiBtYXNrKSwgdHlwZSwgb3ApOwkgXAogCXJldHVybiAwOyAgICAJCQkJCSAJCSBcCiB9Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19FNTAwKQorI2VsaWYgZGVmaW5lZChDT05GSUdfRTUwMCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODZ4eCkKICNkZWZpbmUgSU5ESVJFQ1RfUENJX09QKHJ3LCBzaXplLCB0eXBlLCBvcCwgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICBcCiBzdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogaW5kaXJlY3RfIyNydyMjX2NvbmZpZ18jI3NpemUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAgICAgICAgICAgICAgIFwKQEAgLTU1LDcgKzU1LDcgQEAKIAliID0gUENJX0JVUyhkZXYpOyBkID0gUENJX0RFVihkZXYpOyBmID0gUENJX0ZVTkMoZGV2KTsJCSBcCiAJYiA9IGIgLSBob3NlLT5maXJzdF9idXNubzsJCQkJCSBcCiAJZGV2ID0gUENJX0JERihiLCBkLCBmKTsJCQkJCQkgXAotCSooaG9zZS0+Y2ZnX2FkZHIpID0gZGV2IHwgKG9mZnNldCAmIDB4ZmMpIHwgMHg4MDAwMDAwMDsgICAgICAgICAgXAorCSooaG9zZS0+Y2ZnX2FkZHIpID0gZGV2IHwgKG9mZnNldCAmIDB4ZmMpIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwgMHg4MDAwMDAwMDsgXAogCXN5bmMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCWNmZ18jI3J3KHZhbCwgaG9zZS0+Y2ZnX2RhdGEgKyAob2Zmc2V0ICYgbWFzayksIHR5cGUsIG9wKTsgICAgICAgXAogCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY25ldC5jIGIvZHJpdmVycy9wY25ldC5jCmluZGV4IGRhOWFjN2YuLjJhZjBlOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNuZXQuYworKysgYi9kcml2ZXJzL3BjbmV0LmMKQEAgLTQ1LDggKzQ1LDggQEAKICNkZWZpbmUgUENORVRfREVCVUcyKGZtdCxhcmdzLi4uKQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAotICAgICYmIGRlZmluZWQoQ09ORklHX1BDTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX1BDTkVUKQogCiAjaWYgIWRlZmluZWQoQ09ORl9QQ05FVF83OUM5NzMpICYmIGRlZmluZWQoQ09ORl9QQ05FVF83OUM5NzUpCiAjZXJyb3IgIk1hY3JvIGZvciBQQ25ldCBjaGlwIHZlcnNpb24gaXMgbm90IGRlZmluZWQhIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGIyODAwX2V0aC5jIGIvZHJpdmVycy9wbGIyODAwX2V0aC5jCmluZGV4IDRjNjgzZDcuLjBhZTVkODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxiMjgwMF9ldGguYworKysgYi9kcml2ZXJzL3BsYjI4MDBfZXRoLmMKQEAgLTI1LDggKzI1LDggQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpIFwKLQkmJiBkZWZpbmVkKENPTkZJR19QTEIyODAwX0VUSEVSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX1BMQjI4MDBfRVRIRVIpCiAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxuZXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHhhX3BjbWNpYS5jIGIvZHJpdmVycy9weGFfcGNtY2lhLmMKaW5kZXggZDlkMzhiYi4uNjAyMGU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9weGFfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9weGFfcGNtY2lhLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfb2ZmICh2b2lkKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9xZS9xZS5jIGIvZHJpdmVycy9xZS9xZS5jCmluZGV4IDVmMjA5NjIuLjBmNTIzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcWUvcWUuYworKysgYi9kcml2ZXJzL3FlL3FlLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAlvdXRfYmUzMigmcC0+c2RhcW1yLCAwKTsKIAogCS8qIEFsbG9jYXRlIDJLQiB0ZW1wb3JhcnkgYnVmZmVyIGZvciBzZG1hICovCi0Jc2RtYV9idWZmZXJfYmFzZSA9IHFlX211cmFtX2FsbG9jKDIwNDgsIDY0KTsKKwlzZG1hX2J1ZmZlcl9iYXNlID0gcWVfbXVyYW1fYWxsb2MoMjA0OCwgNDA5Nik7CiAJb3V0X2JlMzIoJnAtPnNkd2Jjciwgc2RtYV9idWZmZXJfYmFzZSAmIFFFX1NERUJDUl9CQV9NQVNLKTsKIAogCS8qIENsZWFyIHNkbWEgc3RhdHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3FlL3FlLmggYi9kcml2ZXJzL3FlL3FlLmgKaW5kZXggMGJjZDBhOS4uNDAwYjFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9xZS9xZS5oCisrKyBiL2RyaXZlcnMvcWUvcWUuaApAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBRRV9OVU1fT0ZfQlJHUwkxNgogI2RlZmluZSBVQ0NfTUFYX05VTQk4CiAKLSNkZWZpbmUgUUVfREFUQU9OTFlfQkFTRQkodWludCkoMTI4KQorI2RlZmluZSBRRV9EQVRBT05MWV9CQVNFCTAKICNkZWZpbmUgUUVfREFUQU9OTFlfU0laRQkoUUVfTVVSQU1fU0laRSAtIFFFX0RBVEFPTkxZX0JBU0UpCiAKIC8qIFFFIHRocmVhZHMgU05VTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9xZS91ZWMuYyBiL2RyaXZlcnMvcWUvdWVjLmMKaW5kZXggYzQxNmE2Ny4uODlhNzI3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9xZS91ZWMuYworKysgYi9kcml2ZXJzL3FlL3VlYy5jCkBAIC0zOTEsMTcgKzM5MSwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGluaXRfbWlpX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbih1ZWNfdCAqdWVjX3JlZ3MpCitzdGF0aWMgaW50IGluaXRfbWlpX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbih1ZWNfbWlpX3QgKnVlY19taWlfcmVncykKIHsKIAl1aW50CQl0aW1lb3V0ID0gMHgxMDAwOwogCXUzMgkJbWlpbWNmZyA9IDA7CiAKLQltaWltY2ZnID0gaW5fYmUzMigmdWVjX3JlZ3MtPm1paW1jZmcpOworCW1paW1jZmcgPSBpbl9iZTMyKCZ1ZWNfbWlpX3JlZ3MtPm1paW1jZmcpOwogCW1paW1jZmcgfD0gTUlJTUNGR19NTkdNTlRfQ0xDX0RJVl9JTklUX1ZBTFVFOwotCW91dF9iZTMyKCZ1ZWNfcmVncy0+bWlpbWNmZywgbWlpbWNmZyk7CisJb3V0X2JlMzIoJnVlY19taWlfcmVncy0+bWlpbWNmZywgbWlpbWNmZyk7CiAKIAkvKiBXYWl0IHVudGlsIHRoZSBidXMgaXMgZnJlZSAqLwotCXdoaWxlICgoaW5fYmUzMigmdWVjX3JlZ3MtPm1paW1jZmcpICYgTUlJTUlORF9CVVNZKSAmJiB0aW1lb3V0LS0pOworCXdoaWxlICgoaW5fYmUzMigmdWVjX21paV9yZWdzLT5taWltY2ZnKSAmIE1JSU1JTkRfQlVTWSkgJiYgdGltZW91dC0tKTsKIAlpZiAodGltZW91dCA8PSAwKSB7CiAJCXByaW50ZigiJXM6IFRoZSBNSUkgQnVzIGlzIHN0dWNrISIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRVRJTUVET1VUOwpAQCAtNDEzLDEzICs0MTMsMTMgQEAKIHN0YXRpYyBpbnQgaW5pdF9waHkoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKIHsKIAl1ZWNfcHJpdmF0ZV90CQkqdWVjOwotCXVlY190CQkJKnVlY19yZWdzOworCXVlY19taWlfdAkJKnVtaWlfcmVnczsKIAlzdHJ1Y3QgdWVjX21paV9pbmZvCSptaWlfaW5mbzsKIAlzdHJ1Y3QgcGh5X2luZm8JCSpjdXJwaHk7CiAJaW50CQkJZXJyOwogCiAJdWVjID0gKHVlY19wcml2YXRlX3QgKilkZXYtPnByaXY7Ci0JdWVjX3JlZ3MgPSB1ZWMtPnVlY19yZWdzOworCXVtaWlfcmVncyA9IHVlYy0+dWVjX21paV9yZWdzOwogCiAJdWVjLT5vbGRsaW5rID0gMDsKIAl1ZWMtPm9sZHNwZWVkID0gMDsKQEAgLTQ1MSwxOSArNDUxLDE5IEBACiAJbWlpX2luZm8tPm1paV9pZCA9IHVlYy0+dWVjX2luZm8tPnBoeV9hZGRyZXNzOwogCW1paV9pbmZvLT5kZXYgPSBkZXY7CiAKLQltaWlfaW5mby0+bWRpb19yZWFkID0gJnJlYWRfcGh5X3JlZzsKLQltaWlfaW5mby0+bWRpb193cml0ZSA9ICZ3cml0ZV9waHlfcmVnOworCW1paV9pbmZvLT5tZGlvX3JlYWQgPSAmdWVjX3JlYWRfcGh5X3JlZzsKKwltaWlfaW5mby0+bWRpb193cml0ZSA9ICZ1ZWNfd3JpdGVfcGh5X3JlZzsKIAogCXVlYy0+bWlpX2luZm8gPSBtaWlfaW5mbzsKIAotCWlmIChpbml0X21paV9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24odWVjX3JlZ3MpKSB7CisJaWYgKGluaXRfbWlpX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbih1bWlpX3JlZ3MpKSB7CiAJCXByaW50ZigiJXM6IFRoZSBNSUkgQnVzIGlzIHN0dWNrISIsIGRldi0+bmFtZSk7CiAJCWVyciA9IC0xOwogCQlnb3RvIGJ1c19mYWlsOwogCX0KIAogCS8qIGdldCBpbmZvIGZvciB0aGlzIFBIWSAqLwotCWN1cnBoeSA9IGdldF9waHlfaW5mbyh1ZWMtPm1paV9pbmZvKTsKKwljdXJwaHkgPSB1ZWNfZ2V0X3BoeV9pbmZvKHVlYy0+bWlpX2luZm8pOwogCWlmICghY3VycGh5KSB7CiAJCXByaW50ZigiJXM6IE5vIFBIWSBmb3VuZCIsIGRldi0+bmFtZSk7CiAJCWVyciA9IC0xOwpAQCAtOTg5LDYgKzk4OSwxMyBAQAogCS8qIFNldHVwIE1BQyBpbnRlcmZhY2UgbW9kZSAqLwogCXVlY19zZXRfbWFjX2lmX21vZGUodWVjLCB1ZWNfaW5mby0+ZW5ldF9pbnRlcmZhY2UpOwogCisJLyogU2V0dXAgTUlJIG1hbmFnZW1lbnQgYmFzZSAqLworI2lmbmRlZiBDT05GSUdfZVRTRUNfTURJT19CVVMKKwl1ZWMtPnVlY19taWlfcmVncyA9ICh1ZWNfbWlpX3QgKikoJnVlY19yZWdzLT5taWltY2ZnKTsKKyNlbHNlCisJdWVjLT51ZWNfbWlpX3JlZ3MgPSAodWVjX21paV90ICopIENPTkZJR19NSUlNX0FERFJFU1M7CisjZW5kaWYKKwogCS8qIFNldHVwIE1JSSBtYXN0ZXIgY2xvY2sgc291cmNlICovCiAJcWVfc2V0X21paV9jbGtfc3JjKHVlY19pbmZvLT51Zl9pbmZvLnVjY19udW0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3FlL3VlYy5oIGIvZHJpdmVycy9xZS91ZWMuaAppbmRleCAwNDk1MDI2Li5jMzg0MDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3FlL3VlYy5oCisrKyBiL2RyaXZlcnMvcWUvdWVjLmgKQEAgLTY3NSw2ICs2NzUsNyBAQAogCXVjY19mYXN0X3ByaXZhdGVfdAkJKnVjY2Y7CiAJc3RydWN0IGV0aF9kZXZpY2UJCSpkZXY7CiAJdWVjX3QJCQkJKnVlY19yZWdzOworCXVlY19taWlfdAkJCSp1ZWNfbWlpX3JlZ3M7CiAJLyogZW5ldCBpbml0IGNvbW1hbmQgcGFyYW1ldGVyICovCiAJdWVjX2luaXRfY21kX3ByYW1fdAkJKnBfaW5pdF9lbmV0X3BhcmFtOwogCXUzMgkJCQlpbml0X2VuZXRfcGFyYW1fb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9xZS91ZWNfcGh5LmMgYi9kcml2ZXJzL3FlL3VlY19waHkuYwppbmRleCA3NmZkMzg4Li5jYTZmYWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3FlL3VlY19waHkuYworKysgYi9kcml2ZXJzL3FlL3VlY19waHkuYwpAQCAtNjAsMTQgKzYwLDE0IEBACiAvKiBXcml0ZSB2YWx1ZSB0byB0aGUgUEhZIGZvciB0aGlzIGRldmljZSB0byB0aGUgcmVnaXN0ZXIgYXQgcmVnbnVtLCAqLwogLyogd2FpdGluZyB1bnRpbCB0aGUgd3JpdGUgaXMgZG9uZSBiZWZvcmUgaXQgcmV0dXJucy4gIEFsbCBQSFkgKi8KIC8qIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgdGhyb3VnaCB0aGUgVFNFQzEgTUlJTSByZWdzICovCi12b2lkIHdyaXRlX3BoeV9yZWcgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0sIGludCB2YWx1ZSkKK3ZvaWQgdWVjX3dyaXRlX3BoeV9yZWcgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0sIGludCB2YWx1ZSkKIHsKIAl1ZWNfcHJpdmF0ZV90ICp1Z2V0aCA9ICh1ZWNfcHJpdmF0ZV90ICopIGRldi0+cHJpdjsKLQl1ZWNfdCAqdWdfcmVnczsKKwl1ZWNfbWlpX3QgKnVnX3JlZ3M7CiAJZW5ldF90YmlfbWlpX3JlZ19lIG1paV9yZWcgPSAoZW5ldF90YmlfbWlpX3JlZ19lKSByZWdudW07CiAJdTMyIHRtcF9yZWc7CiAKLQl1Z19yZWdzID0gdWdldGgtPnVlY19yZWdzOworCXVnX3JlZ3MgPSB1Z2V0aC0+dWVjX21paV9yZWdzOwogCiAJLyogU3RvcCB0aGUgTUlJIG1hbmFnZW1lbnQgcmVhZCBjeWNsZSAqLwogCW91dF9iZTMyICgmdWdfcmVncy0+bWlpbWNvbSwgMCk7CkBAIC04NywxNSArODcsMTUgQEAKIC8qIFJlYWRzIGZyb20gcmVnaXN0ZXIgcmVnbnVtIGluIHRoZSBQSFkgZm9yIGRldmljZSBkZXYsICovCiAvKiByZXR1cm5pbmcgdGhlIHZhbHVlLiAgQ2xlYXJzIG1paW1jb20gZmlyc3QuICBBbGwgUEhZICovCiAvKiBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIHRocm91Z2ggdGhlIFRTRUMxIE1JSU0gcmVncyAqLwotaW50IHJlYWRfcGh5X3JlZyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSkKK2ludCB1ZWNfcmVhZF9waHlfcmVnIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKQogewogCXVlY19wcml2YXRlX3QgKnVnZXRoID0gKHVlY19wcml2YXRlX3QgKikgZGV2LT5wcml2OwotCXVlY190ICp1Z19yZWdzOworCXVlY19taWlfdCAqdWdfcmVnczsKIAllbmV0X3RiaV9taWlfcmVnX2UgbWlpX3JlZyA9IChlbmV0X3RiaV9taWlfcmVnX2UpIHJlZ251bTsKIAl1MzIgdG1wX3JlZzsKIAl1MTYgdmFsdWU7CiAKLQl1Z19yZWdzID0gdWdldGgtPnVlY19yZWdzOworCXVnX3JlZ3MgPSB1Z2V0aC0+dWVjX21paV9yZWdzOwogCiAJLyogU2V0dGluZyB1cCB0aGUgTUlJIE1hbmdlbWVudCBBZGRyZXNzIFJlZ2lzdGVyICovCiAJdG1wX3JlZyA9ICgodTMyKSBtaWlfaWQgPDwgTUlJTUFERF9QSFlfQUREUkVTU19TSElGVCkgfCBtaWlfcmVnOwpAQCAtNTIxLDcgKzUyMSw3IEBACiAvKiBVc2UgdGhlIFBIWSBJRCByZWdpc3RlcnMgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBQSFkgaXMgYXR0YWNoZWQKICAqIHRvIGRldmljZSBkZXYuICByZXR1cm4gYSBzdHJ1Y3QgcGh5X2luZm8gc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhhdCBQSFkKICAqLwotc3RydWN0IHBoeV9pbmZvICpnZXRfcGh5X2luZm8gKHN0cnVjdCB1ZWNfbWlpX2luZm8gKm1paV9pbmZvKQorc3RydWN0IHBoeV9pbmZvICp1ZWNfZ2V0X3BoeV9pbmZvIChzdHJ1Y3QgdWVjX21paV9pbmZvICptaWlfaW5mbykKIHsKIAl1MTYgcGh5X3JlZzsKIAl1MzIgcGh5X0lEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9xZS91ZWNfcGh5LmggYi9kcml2ZXJzL3FlL3VlY19waHkuaAppbmRleCA5YmQ5MjZkLi5lNTlhOTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3FlL3VlY19waHkuaAorKysgYi9kcml2ZXJzL3FlL3VlY19waHkuaApAQCAtMjQ5LDEwICsyNDksMTAgQEAKIAl2b2lkICgqY2xvc2UpIChzdHJ1Y3QgdWVjX21paV9pbmZvICogbWlpX2luZm8pOwogfTsKIAotc3RydWN0IHBoeV9pbmZvICpnZXRfcGh5X2luZm8gKHN0cnVjdCB1ZWNfbWlpX2luZm8gKm1paV9pbmZvKTsKLXZvaWQgd3JpdGVfcGh5X3JlZyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSwKK3N0cnVjdCBwaHlfaW5mbyAqdWVjX2dldF9waHlfaW5mbyAoc3RydWN0IHVlY19taWlfaW5mbyAqbWlpX2luZm8pOwordm9pZCB1ZWNfd3JpdGVfcGh5X3JlZyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSwKIAkJICAgIGludCB2YWx1ZSk7Ci1pbnQgcmVhZF9waHlfcmVnIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKTsKK2ludCB1ZWNfcmVhZF9waHlfcmVnIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKTsKIHZvaWQgbWlpX2NsZWFyX3BoeV9pbnRlcnJ1cHQgKHN0cnVjdCB1ZWNfbWlpX2luZm8gKm1paV9pbmZvKTsKIHZvaWQgbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0IChzdHJ1Y3QgdWVjX21paV9pbmZvICptaWlfaW5mbywKIAkJCQkgIHUzMiBpbnRlcnJ1cHRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnB4X3BjbWNpYS5jIGIvZHJpdmVycy9ycHhfcGNtY2lhLmMKaW5kZXggMmEwYTllMC4uYzdjNDI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ycHhfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9ycHhfcGNtY2lhLmMKQEAgLTksMTEgKzksMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCUNPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtNjIsMTIgKzYyLDEyIEBACiAJcmV0dXJuIDA7CS8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBzdGF0aWMgaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXJldHVybiAwOwkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCiB9Ci0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAKICNlbmRpZgkvKiBDT05GSUdfUENNQ0lBICYmIChDT05GSUdfUlBYQ0xBU1NJQyB8fCBDT05GSUdfUlBYTElURSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRsODAxOS5jIGIvZHJpdmVycy9ydGw4MDE5LmMKaW5kZXggNjJiOTI0NS4uNDA5YTY5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGw4MDE5LmMKKysrIGIvZHJpdmVycy9ydGw4MDE5LmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2lmZGVmIENPTkZJR19EUklWRVJfUlRMODAxOQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIAogLyogcGFja2V0IHBhZ2UgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGw4MTM5LmMgYi9kcml2ZXJzL3J0bDgxMzkuYwppbmRleCBhZmUxYTRmLi4yMzY3MTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0bDgxMzkuYworKysgYi9kcml2ZXJzL3J0bDgxMzkuYwpAQCAtNzcsNyArNzcsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHBjaS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKIAlkZWZpbmVkKENPTkZJR19SVEw4MTM5KQogCiAjZGVmaW5lIFRJQ0tTX1BFUl9TRUMJQ0ZHX0haCkBAIC0xOTMsNiArMTkzLDEyIEBACiBzdGF0aWMgaW50IHJ0bF90cmFuc21pdChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpOwogc3RhdGljIGludCBydGxfcG9sbChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpOworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQLyogIFRoaXMgZHJpdmVyIGFscmVhZHkgYWNjZXB0cyBhbGwgYi9tY2FzdCAqLworc3RhdGljIGludCBydGxfYmNhc3RfYWRkciAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdTggYmNhc3RfbWFjLCB1OCBzZXQpCit7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3VwcG9ydGVkW10gPSB7CiAgICAgICAge1BDSV9WRU5ET1JfSURfUkVBTFRFSywgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzl9LApAQCAtMjI4LDYgKzIzNCw5IEBACiAJCWRldi0+aGFsdCA9IHJ0bF9kaXNhYmxlOwogCQlkZXYtPnNlbmQgPSBydGxfdHJhbnNtaXQ7CiAJCWRldi0+cmVjdiA9IHJ0bF9wb2xsOworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCWRldi0+bWNhc3QgPSBydGxfYmNhc3RfYWRkcjsKKyNlbmRpZgogCiAJCWV0aF9yZWdpc3RlciAoZGV2KTsKIApAQCAtNTM1LDQgKzU0NCw0IEBACiAJCXVkZWxheSAoMTAwKTsgLyogd2FpdCAxMDB1cyAqLwogCX0KIH0KLSNlbmRpZgkvKiBDRkdfQ01EX05FVCAmJiBDT05GSUdfTkVUX01VTFRJICYmIENPTkZJR19SVEw4MTM5ICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRsODE2OS5jIGIvZHJpdmVycy9ydGw4MTY5LmMKaW5kZXggMzM5M2JhOC4uNjNlYTJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGw4MTY5LmMKKysrIGIvZHJpdmVycy9ydGw4MTY5LmMKQEAgLTU1LDcgKzU1LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxwY2kuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCiAJZGVmaW5lZChDT05GSUdfUlRMODE2OSkKIAogI3VuZGVmIERFQlVHX1JUTDgxNjkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2s5OGxpbi91Ym9vdF9kcnYuYyBiL2RyaXZlcnMvc2s5OGxpbi91Ym9vdF9kcnYuYwppbmRleCAyNjNkYWM4Li5kMDJjZDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NrOThsaW4vdWJvb3RfZHJ2LmMKKysrIGIvZHJpdmVycy9zazk4bGluL3Vib290X2Rydi5jCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCiAJZGVmaW5lZChDT05GSUdfU0s5OCkKIAogI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3ltNTNjOHh4LmMgYi9kcml2ZXJzL3N5bTUzYzh4eC5jCmluZGV4IGFlMTBmODAuLjI5ZWVjY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3ltNTNjOHh4LmMKKysrIGIvZHJpdmVycy9zeW01M2M4eHguYwpAQCAtNTEsNyArNTEsNyBAQAogI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICYmIGRlZmluZWQoQ09ORklHX1NDU0lfU1lNNTNDOFhYKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSAmJiBkZWZpbmVkKENPTkZJR19TQ1NJX1NZTTUzQzhYWCkKIAogI3VuZGVmIFNDU0lfU0lOR0xFX1NURVAKIC8qCkBAIC03ODcsNyArNzg3LDcgQEAKIAlzY3NpX3dyaXRlX2J5dGUoRE1PREUsMHgwMCk7CiAjZW5kaWYKIH0KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKSAqLworI2VuZGlmCiAKIAogI2VuZGlmIC8qIENPTkZJR19TQ1NJX1NZTTUzQzhYWCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aV9wY2kxNDEwYS5jIGIvZHJpdmVycy90aV9wY2kxNDEwYS5jCmluZGV4IGQ1Mjk3YjUuLjIwOGNhNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGlfcGNpMTQxMGEuYworKysgYi9kcml2ZXJzL3RpX3BjaTE0MTBhLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAogI2luY2x1ZGUgPHBjbWNpYS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKSAmJiBkZWZpbmVkKENPTkZJR19JREVfVElfQ0FSREJVUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKSAmJiBkZWZpbmVkKENPTkZJR19JREVfVElfQ0FSREJVUykKIAogaW50IHBjbWNpYV9vbihpbnQgaWRlX2Jhc2VfYnVzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90aWdvbjMuYyBiL2RyaXZlcnMvdGlnb24zLmMKaW5kZXggZWMyY2QyYS4uNWY2YTRlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy90aWdvbjMuYworKysgYi9kcml2ZXJzL3RpZ29uMy5jCkBAIC0xMiw3ICsxMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmICFkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKIAlkZWZpbmVkKENPTkZJR19USUdPTjMpCiAjaWZkZWYgQ09ORklHX0JNVwogI2luY2x1ZGUgPG1wYzgyNHguaD4KQEAgLTI2LDY5ICsyNiw3MCBAQAogLyogTG9jYWwgZnVuY3Rpb25zLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTE1fU1RBVFVTIExNX0Fib3J0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fUXVldWVSeFBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9BYm9ydCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9RdWV1ZVJ4UGFja2V0cyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKIAotc3RhdGljIExNX1NUQVRVUyBMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUoCi0gICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlLAotICAgIFBMTV9NRURJQV9UWVBFIHBNZWRpYVR5cGUsIFBMTV9MSU5FX1NQRUVEIHBMaW5lU3BlZWQsCi0gICAgUExNX0RVUExFWF9NT0RFIHBEdXBsZXhNb2RlKTsKK3N0YXRpYyBMTV9TVEFUVVMgTE1fVHJhbnNsYXRlUmVxdWVzdGVkTWVkaWFUeXBlIChMTV9SRVFVRVNURURfTUVESUFfVFlQRQorCQkJCQkJIFJlcXVlc3RlZE1lZGlhVHlwZSwKKwkJCQkJCSBQTE1fTUVESUFfVFlQRSBwTWVkaWFUeXBlLAorCQkJCQkJIFBMTV9MSU5FX1NQRUVEIHBMaW5lU3BlZWQsCisJCQkJCQkgUExNX0RVUExFWF9NT0RFIHBEdXBsZXhNb2RlKTsKIAotc3RhdGljIExNX1NUQVRVUyBMTV9Jbml0QmNtNTQweFBoeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworc3RhdGljIExNX1NUQVRVUyBMTV9Jbml0QmNtNTQweFBoeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKIAotX19pbmxpbmUgc3RhdGljIExNX1ZPSUQgTE1fU2VydmljZVJ4SW50ZXJydXB0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1fX2lubGluZSBzdGF0aWMgTE1fVk9JRCBMTV9TZXJ2aWNlVHhJbnRlcnJ1cHQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK19faW5saW5lIHN0YXRpYyBMTV9WT0lEIExNX1NlcnZpY2VSeEludGVycnVwdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK19faW5saW5lIHN0YXRpYyBMTV9WT0lEIExNX1NlcnZpY2VUeEludGVycnVwdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKIAotc3RhdGljIExNX1NUQVRVUyBMTV9Gb3JjZUF1dG9OZWdCY201NDB4UGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUpOwotc3RhdGljIExNX1NUQVRVUyBMTV9Gb3JjZUF1dG9OZWcoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSk7Ci1zdGF0aWMgTE1fVUlOVDMyIEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLVNUQVRJQyBMTV9TVEFUVVMgTE1fU2V0Rmxvd0NvbnRyb2woUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotICAgIExNX1VJTlQzMiBMb2NhbFBoeUFkLCBMTV9VSU5UMzIgUmVtb3RlUGh5QWQpOworc3RhdGljIExNX1NUQVRVUyBMTV9Gb3JjZUF1dG9OZWdCY201NDB4UGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRQorCQkJCQkgICAgUmVxdWVzdGVkTWVkaWFUeXBlKTsKK3N0YXRpYyBMTV9TVEFUVVMgTE1fRm9yY2VBdXRvTmVnIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkJICBMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUpOworc3RhdGljIExNX1VJTlQzMiBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworU1RBVElDIExNX1NUQVRVUyBMTV9TZXRGbG93Q29udHJvbCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkJCSAgICBMTV9VSU5UMzIgTG9jYWxQaHlBZCwKKwkJCQkgICAgTE1fVUlOVDMyIFJlbW90ZVBoeUFkKTsKICNpZiBJTkNMVURFX1RCSV9TVVBQT1JUCi1TVEFUSUMgTE1fU1RBVFVTIExNX1NldHVwRmliZXJQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLVNUQVRJQyBMTV9TVEFUVVMgTE1fSW5pdEJjbTgwMHhQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK1NUQVRJQyBMTV9TVEFUVVMgTE1fU2V0dXBGaWJlclBoeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK1NUQVRJQyBMTV9TVEFUVVMgTE1fSW5pdEJjbTgwMHhQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CiAjZW5kaWYKLVNUQVRJQyBMTV9TVEFUVVMgTE1fU2V0dXBDb3BwZXJQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLVNUQVRJQyBQTE1fQURBUFRFUl9JTkZPIExNX0dldEFkYXB0ZXJJbmZvQnlTc2lkKExNX1VJTlQxNiBTdmlkLCBMTV9VSU5UMTYgU3NpZCk7Ci1TVEFUSUMgTE1fU1RBVFVTIExNX0RtYVRlc3QoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcEJ1ZmZlclZpcnQsCi0JICAgTE1fUEhZU0lDQUxfQUREUkVTUyBCdWZmZXJQaHksIExNX1VJTlQzMiBCdWZmZXJTaXplKTsKLVNUQVRJQyBMTV9TVEFUVVMgTE1fSGFsdENwdShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsTE1fVUlOVDMyIGNwdV9udW1iZXIpOwotU1RBVElDIExNX1NUQVRVUyBMTV9SZXNldENoaXAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLVNUQVRJQyBMTV9TVEFUVVMgTE1fVGVzdDRHQm91bmRhcnkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQsCi0gICAgUFQzX1NORF9CRCBwU2VuZEJkKTsKK1NUQVRJQyBMTV9TVEFUVVMgTE1fU2V0dXBDb3BwZXJQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitTVEFUSUMgUExNX0FEQVBURVJfSU5GTyBMTV9HZXRBZGFwdGVySW5mb0J5U3NpZCAoTE1fVUlOVDE2IFN2aWQsCisJCQkJCQkgTE1fVUlOVDE2IFNzaWQpOworU1RBVElDIExNX1NUQVRVUyBMTV9EbWFUZXN0IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwQnVmZmVyVmlydCwKKwkJCSAgICAgTE1fUEhZU0lDQUxfQUREUkVTUyBCdWZmZXJQaHksCisJCQkgICAgIExNX1VJTlQzMiBCdWZmZXJTaXplKTsKK1NUQVRJQyBMTV9TVEFUVVMgTE1fSGFsdENwdSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgY3B1X251bWJlcik7CitTVEFUSUMgTE1fU1RBVFVTIExNX1Jlc2V0Q2hpcCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK1NUQVRJQyBMTV9TVEFUVVMgTE1fVGVzdDRHQm91bmRhcnkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJCQkgICAgUExNX1BBQ0tFVCBwUGFja2V0LCBQVDNfU05EX0JEIHBTZW5kQmQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRXh0ZXJuYWwgZnVuY3Rpb25zLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTE1fU1RBVFVTIExNX0xvYWRSbHNGaXJtd2FyZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotCitMTV9TVEFUVVMgTE1fTG9hZFJsc0Zpcm13YXJlIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1VJTlQzMgotTE1fUmVnUmRJbmQoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1MTV9VSU5UMzIgUmVnaXN0ZXIpIHsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKK0xNX1VJTlQzMiBMTV9SZWdSZEluZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUmVnaXN0ZXIpCit7CisJTE1fVUlOVDMyIFZhbHVlMzI7CiAKICNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECi0gICAgTU1fQUNRVUlSRV9VTkRJX0xPQ0socERldmljZSk7CisJTU1fQUNRVUlSRV9VTkRJX0xPQ0sgKHBEZXZpY2UpOwogI2VuZGlmCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfUkVHX0FERFJfUkVHLCBSZWdpc3Rlcik7Ci0gICAgTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9SRUdfREFUQV9SRUcsICZWYWx1ZTMyKTsKKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUkVHX0FERFJfUkVHLCBSZWdpc3Rlcik7CisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUkVHX0RBVEFfUkVHLCAmVmFsdWUzMik7CiAjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAotICAgIE1NX1JFTEVBU0VfVU5ESV9MT0NLKHBEZXZpY2UpOworCU1NX1JFTEVBU0VfVU5ESV9MT0NLIChwRGV2aWNlKTsKICNlbmRpZgogCi0gICAgcmV0dXJuIFZhbHVlMzI7Ci19IC8qIExNX1JlZ1JkSW5kICovCi0KKwlyZXR1cm4gVmFsdWUzMjsKK30JCQkJLyogTE1fUmVnUmRJbmQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05Niw0NyArOTcsNDEgQEAKIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTE1fVk9JRAotTE1fUmVnV3JJbmQoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1MTV9VSU5UMzIgUmVnaXN0ZXIsCi1MTV9VSU5UMzIgVmFsdWUzMikgeworTE1fUmVnV3JJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyLCBMTV9VSU5UMzIgVmFsdWUzMikKK3sKIAogI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKLSAgICBNTV9BQ1FVSVJFX1VORElfTE9DSyhwRGV2aWNlKTsKKwlNTV9BQ1FVSVJFX1VORElfTE9DSyAocERldmljZSk7CiAjZW5kaWYKLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9SRUdfQUREUl9SRUcsIFJlZ2lzdGVyKTsKLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9SRUdfREFUQV9SRUcsIFZhbHVlMzIpOworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9SRUdfQUREUl9SRUcsIFJlZ2lzdGVyKTsKKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUkVHX0RBVEFfUkVHLCBWYWx1ZTMyKTsKICNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECi0gICAgTU1fUkVMRUFTRV9VTkRJX0xPQ0socERldmljZSk7CisJTU1fUkVMRUFTRV9VTkRJX0xPQ0sgKHBEZXZpY2UpOwogI2VuZGlmCi19IC8qIExNX1JlZ1dySW5kICovCi0KK30JCQkJLyogTE1fUmVnV3JJbmQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9VSU5UMzIKLUxNX01lbVJkSW5kKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotTE1fVUlOVDMyIE1lbUFkZHIpIHsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKK0xNX1VJTlQzMiBMTV9NZW1SZEluZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWVtQWRkcikKK3sKKwlMTV9VSU5UMzIgVmFsdWUzMjsKIAotICAgIE1NX0FDUVVJUkVfVU5ESV9MT0NLKHBEZXZpY2UpOworCU1NX0FDUVVJUkVfVU5ESV9MT0NLIChwRGV2aWNlKTsKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBNZW1BZGRyKTsKLSAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5NZW1XaW5kb3dEYXRhKTsKLSAgICAvKiAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsdUludE1lbS5NYnVmWyhNZW1BZGRyICYgMHg3ZmZmKS80XSk7ICovCisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgVDNfUENJX01FTV9XSU5fQUREUl9SRUcsIE1lbUFkZHIpOworCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIFBjaUNmZy5NZW1XaW5kb3dEYXRhKTsKKwkvKiAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsdUludE1lbS5NYnVmWyhNZW1BZGRyICYgMHg3ZmZmKS80XSk7ICovCiAjZWxzZQotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fQUREUl9SRUcsIE1lbUFkZHIpOwotICAgIE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9EQVRBX1JFRywgJlZhbHVlMzIpOworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBNZW1BZGRyKTsKKwlNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0RBVEFfUkVHLCAmVmFsdWUzMik7CiAjZW5kaWYKLSAgICBNTV9SRUxFQVNFX1VORElfTE9DSyhwRGV2aWNlKTsKKwlNTV9SRUxFQVNFX1VORElfTE9DSyAocERldmljZSk7CiAKLSAgICByZXR1cm4gVmFsdWUzMjsKLX0gLyogTE1fTWVtUmRJbmQgKi8KLQorCXJldHVybiBWYWx1ZTMyOworfQkJCQkvKiBMTV9NZW1SZEluZCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0NCw1MTIgKzEzOSw0NTUgQEAKIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTE1fVk9JRAotTE1fTWVtV3JJbmQoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1MTV9VSU5UMzIgTWVtQWRkciwKLUxNX1VJTlQzMiBWYWx1ZTMyKSB7Ci0gICAgTU1fQUNRVUlSRV9VTkRJX0xPQ0socERldmljZSk7CitMTV9NZW1XckluZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWVtQWRkciwgTE1fVUlOVDMyIFZhbHVlMzIpCit7CisJTU1fQUNRVUlSRV9VTkRJX0xPQ0sgKHBEZXZpY2UpOwogI2lmZGVmIEJJR19FTkRJQU5fSE9TVAotICAgIFJFR19XUihwRGV2aWNlLFBjaUNmZy5NZW1XaW5kb3dCYXNlQWRkcixNZW1BZGRyKTsKLSAgICBSRUdfV1IocERldmljZSx1SW50TWVtLk1idWZbKE1lbUFkZHIgJiAweDdmZmYpLzRdLFZhbHVlMzIpOworCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLk1lbVdpbmRvd0Jhc2VBZGRyLCBNZW1BZGRyKTsKKwlSRUdfV1IgKHBEZXZpY2UsIHVJbnRNZW0uTWJ1ZlsoTWVtQWRkciAmIDB4N2ZmZikgLyA0XSwgVmFsdWUzMik7CiAjZWxzZQotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fQUREUl9SRUcsIE1lbUFkZHIpOwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fREFUQV9SRUcsIFZhbHVlMzIpOworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBNZW1BZGRyKTsKKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9EQVRBX1JFRywgVmFsdWUzMik7CiAjZW5kaWYKLSAgICBNTV9SRUxFQVNFX1VORElfTE9DSyhwRGV2aWNlKTsKLX0gLyogTE1fTWVtV3JJbmQgKi8KLQorCU1NX1JFTEVBU0VfVU5ESV9MT0NLIChwRGV2aWNlKTsKK30JCQkJLyogTE1fTWVtV3JJbmQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX1F1ZXVlUnhQYWNrZXRzKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKSB7Ci0gICAgTE1fU1RBVFVTIExtc3RhdHVzOwotICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKLSAgICBQVDNfUkNWX0JEIHBSY3ZCZDsKLSAgICBMTV9VSU5UMzIgU3RkQmRBZGRlZCA9IDA7CitMTV9TVEFUVVMgTE1fUXVldWVSeFBhY2tldHMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKwlMTV9TVEFUVVMgTG1zdGF0dXM7CisJUExNX1BBQ0tFVCBwUGFja2V0OworCVBUM19SQ1ZfQkQgcFJjdkJkOworCUxNX1VJTlQzMiBTdGRCZEFkZGVkID0gMDsKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgTE1fVUlOVDMyIEp1bWJvQmRBZGRlZCA9IDA7Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCUxNX1VJTlQzMiBKdW1ib0JkQWRkZWQgPSAwOworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KIAotICAgIExtc3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7CisJTG1zdGF0dXMgPSBMTV9TVEFUVVNfU1VDQ0VTUzsKIAotICAgIHBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIpOwotICAgIHdoaWxlKHBQYWNrZXQpIHsKLQlzd2l0Y2gocFBhY2tldC0+dS5SeC5SY3ZQcm9kUmluZykgeworCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKwl3aGlsZSAocFBhY2tldCkgeworCQlzd2l0Y2ggKHBQYWNrZXQtPnUuUnguUmN2UHJvZFJpbmcpIHsKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0JICAgIGNhc2UgVDNfSlVNQk9fUkNWX1BST0RfUklORzogICAgICAgIC8qIEp1bWJvIFJlY2VpdmUgUmluZy4gKi8KLQkJLyogSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIGRlc2NyaXB0b3IuICovCi0JCXBSY3ZCZCA9Ci0JCSAgICAmcERldmljZS0+cFJ4SnVtYm9CZFZpcnRbcERldmljZS0+UnhKdW1ib1Byb2RJZHhdOwotCQlwUmN2QmQtPkZsYWdzID0gUkNWX0JEX0ZMQUdfRU5EIHwgUkNWX0JEX0ZMQUdfSlVNQk9fUklORzsKLQkJcFJjdkJkLT5MZW4gPSAoTE1fVUlOVDE2KSBwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZTsKKwkJY2FzZSBUM19KVU1CT19SQ1ZfUFJPRF9SSU5HOgkvKiBKdW1ibyBSZWNlaXZlIFJpbmcuICovCisJCQkvKiBJbml0aWFsaXplIHRoZSBidWZmZXIgZGVzY3JpcHRvci4gKi8KKwkJCXBSY3ZCZCA9CisJCQkgICAgJnBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0W3BEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4XTsKKwkJCXBSY3ZCZC0+RmxhZ3MgPQorCQkJICAgIFJDVl9CRF9GTEFHX0VORCB8IFJDVl9CRF9GTEFHX0pVTUJPX1JJTkc7CisJCQlwUmN2QmQtPkxlbiA9IChMTV9VSU5UMTYpIHBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplOwogCi0JCS8qIEluaXRpYWxpemUgdGhlIHJlY2VpdmUgYnVmZmVyIHBvaW50ZXIgKi8KLSNpZiAwIC8qIEppbW15LCBkZWxldGVkIGluIG5ldyAqLwotCQlwUmN2QmQtPkhvc3RBZGRyLkxvdyA9IHBQYWNrZXQtPnUuUnguUnhCdWZmZXJQaHkuTG93OwotCQlwUmN2QmQtPkhvc3RBZGRyLkhpZ2ggPSBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyUGh5LkhpZ2g7CisJCQkvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIGJ1ZmZlciBwb2ludGVyICovCisjaWYgMAkJCQkvKiBKaW1teSwgZGVsZXRlZCBpbiBuZXcgKi8KKwkJCXBSY3ZCZC0+SG9zdEFkZHIuTG93ID0gcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclBoeS5Mb3c7CisJCQlwUmN2QmQtPkhvc3RBZGRyLkhpZ2ggPSBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyUGh5LkhpZ2g7CiAjZW5kaWYKLQkJTU1fTWFwUnhEbWEocERldmljZSwgcFBhY2tldCwgJnBSY3ZCZC0+SG9zdEFkZHIpOworCQkJTU1fTWFwUnhEbWEgKHBEZXZpY2UsIHBQYWNrZXQsICZwUmN2QmQtPkhvc3RBZGRyKTsKIAotCQkvKiBUaGUgb3BhcXVlIGZpZWxkIG1heSBwb2ludCB0byBhbiBvZmZzZXQgZnJvbSBhIGZpeCBhZGRyLiAqLwotCQlwUmN2QmQtPk9wYXF1ZSA9IChMTV9VSU5UMzIpIChNTV9VSU5UX1BUUihwUGFja2V0KSAtCi0JCSAgICBNTV9VSU5UX1BUUihwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpKTsKKwkJCS8qIFRoZSBvcGFxdWUgZmllbGQgbWF5IHBvaW50IHRvIGFuIG9mZnNldCBmcm9tIGEgZml4IGFkZHIuICovCisJCQlwUmN2QmQtPk9wYXF1ZSA9IChMTV9VSU5UMzIpIChNTV9VSU5UX1BUUiAocFBhY2tldCkgLQorCQkJCQkJICAgICAgTU1fVUlOVF9QVFIgKHBEZXZpY2UtPgorCQkJCQkJCQkgICBwUGFja2V0RGVzY0Jhc2UpKTsKIAotCQkvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4LiAqLwotCQlwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCA9IChwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCArIDEpICYKLQkJICAgIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKwkJCS8qIFVwZGF0ZSB0aGUgcHJvZHVjZXIgaW5kZXguICovCisJCQlwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCA9CisJCQkgICAgKHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4ICsKKwkJCSAgICAgMSkgJiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0s7CiAKLQkJSnVtYm9CZEFkZGVkKys7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KLQotCSAgICBjYXNlIFQzX1NURF9SQ1ZfUFJPRF9SSU5HOiAgICAgIC8qIFN0YW5kYXJkIFJlY2VpdmUgUmluZy4gKi8KLQkJLyogSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIGRlc2NyaXB0b3IuICovCi0JCXBSY3ZCZCA9ICZwRGV2aWNlLT5wUnhTdGRCZFZpcnRbcERldmljZS0+UnhTdGRQcm9kSWR4XTsKLQkJcFJjdkJkLT5GbGFncyA9IFJDVl9CRF9GTEFHX0VORDsKLQkJcFJjdkJkLT5MZW4gPSBNQVhfU1REX1JDVl9CVUZGRVJfU0laRTsKLQotCQkvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIGJ1ZmZlciBwb2ludGVyICovCi0jaWYgMCAgLyogSmltbXksIGRlbGV0ZWQgaW4gbmV3IHJlcGxhY2VkIHdpdGggTU1fTWFwUnhEbWEgKi8KLQkJcFJjdkJkLT5Ib3N0QWRkci5Mb3cgPSBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyUGh5LkxvdzsKLQkJcFJjdkJkLT5Ib3N0QWRkci5IaWdoID0gcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclBoeS5IaWdoOwotI2VuZGlmCi0JCU1NX01hcFJ4RG1hKHBEZXZpY2UsIHBQYWNrZXQsICZwUmN2QmQtPkhvc3RBZGRyKTsKLQotCQkvKiBUaGUgb3BhcXVlIGZpZWxkIG1heSBwb2ludCB0byBhbiBvZmZzZXQgZnJvbSBhIGZpeCBhZGRyLiAqLwotCQlwUmN2QmQtPk9wYXF1ZSA9IChMTV9VSU5UMzIpIChNTV9VSU5UX1BUUihwUGFja2V0KSAtCi0JCSAgICBNTV9VSU5UX1BUUihwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpKTsKLQotCQkvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4LiAqLwotCQlwRGV2aWNlLT5SeFN0ZFByb2RJZHggPSAocERldmljZS0+UnhTdGRQcm9kSWR4ICsgMSkgJgotCQkgICAgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKLQotCQlTdGRCZEFkZGVkKys7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgVDNfVU5LTk9XTl9SQ1ZfUFJPRF9SSU5HOgotCSAgICBkZWZhdWx0OgotCQlMbXN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOwotCQlicmVhazsKLQl9IC8qIHN3aXRjaCAqLwotCi0JLyogQmFpbCBvdXQgaWYgdGhlcmUgaXMgYW55IGVycm9yLiAqLwotCWlmKExtc3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQotCXsKLQkgICAgYnJlYWs7Ci0JfQotCi0JcFBhY2tldCA9IChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7Ci0gICAgfSAvKiB3aGlsZSAqLwotCi0gICAgd21iKCk7Ci0gICAgLyogVXBkYXRlIHRoZSBwcm9jZWR1cmUgaW5kZXguICovCi0gICAgaWYoU3RkQmRBZGRlZCkKLSAgICB7Ci0JTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guUmN2U3RkUHJvZElkeC5Mb3csIHBEZXZpY2UtPlJ4U3RkUHJvZElkeCk7Ci0gICAgfQotI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKLSAgICBpZihKdW1ib0JkQWRkZWQpCi0gICAgewotCU1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlJjdkp1bWJvUHJvZElkeC5Mb3csCi0JICAgIHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4KTsKLSAgICB9Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLwotCi0gICAgcmV0dXJuIExtc3RhdHVzOwotfSAvKiBMTV9RdWV1ZVJ4UGFja2V0cyAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotU1RBVElDIExNX1ZPSUQKLUxNX052cmFtSW5pdCgKLSAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCi17Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDMyIGo7Ci0KLSAgICAvKiBJbnRpYWxpemUgY2xvY2sgcGVyaW9kIGFuZCBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFZhbHVlMzIgPSBTRUVQUk9NX0FERFJfQ0xLX1BFUkQoU0VFUFJPTV9DTE9DS19QRVJJT0QpIHwKLQlTRUVQUk9NX0FERFJfRlNNX1JFU0VUOwotICAgIFJFR19XUihwRGV2aWNlLCBHcmMuRWVwcm9tQWRkciwgVmFsdWUzMik7Ci0KLSAgICBmb3IoaiA9IDA7IGogPCAxMDA7IGorKykKLSAgICB7Ci0JTU1fV2FpdCgxMCk7Ci0gICAgfQotCi0gICAgLyogU2VyaWFsIGVlcHJvbSBhY2Nlc3MgdXNpbmcgdGhlIEdyYy5FZXByb21BZGRyL0VlcHJvbURhdGEgcmVnaXN0ZXJzLiAqLwotICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgR3JjLkxvY2FsQ3RybCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIFZhbHVlMzIgfCBHUkNfTUlTQ19MT0NBTF9DVFJMX0FVVE9fU0VFUFJPTSk7Ci0KLSAgICAvKiBTZXQgdGhlIDU3MDEgY29tcGF0aWJpbGl0eSBtb2RlIGlmIHdlIGFyZSB1c2luZyBFRVBST00uICovCi0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAwICYmCi0JVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAxKQotICAgIHsKLQlWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE52cmFtLkNvbmZpZzEpOwotCWlmKChWYWx1ZTMyICYgRkxBU0hfSU5URVJGQUNFX0VOQUJMRSkgPT0gMCkKLQl7Ci0JICAgIC8qIFVzZSB0aGUgbmV3IGludGVyZmFjZSB0byByZWFkIEVFUFJPTS4gKi8KLQkgICAgVmFsdWUzMiAmPSB+RkxBU0hfQ09NUEFUX0JZUEFTUzsKLQotCSAgICBSRUdfV1IocERldmljZSwgTnZyYW0uQ29uZmlnMSwgVmFsdWUzMik7Ci0JfQotICAgIH0KLX0gLyogTE1fTnZSYW1Jbml0ICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TVEFUSUMgTE1fU1RBVFVTCi1MTV9FZXByb21SZWFkKAotICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLSAgICBMTV9VSU5UMzIgT2Zmc2V0LAotICAgIExNX1VJTlQzMiAqcERhdGEpCi17Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDMyIEFkZHI7Ci0gICAgTE1fVUlOVDMyIERldjsKLSAgICBMTV9VSU5UMzIgajsKLQotICAgIGlmKE9mZnNldCA+IFNFRVBST01fQ0hJUF9TSVpFKQotICAgIHsKLQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgRGV2ID0gT2Zmc2V0IC8gU0VFUFJPTV9DSElQX1NJWkU7Ci0gICAgQWRkciA9IE9mZnNldCAlIFNFRVBST01fQ0hJUF9TSVpFOwotCi0gICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBHcmMuRWVwcm9tQWRkcik7Ci0gICAgVmFsdWUzMiAmPSB+KFNFRVBST01fQUREUl9BRERSRVNTX01BU0sgfCBTRUVQUk9NX0FERFJfREVWX0lEX01BU0sgfAotCVNFRVBST01fQUREUl9SV19NQVNLKTsKLSAgICBSRUdfV1IocERldmljZSwgR3JjLkVlcHJvbUFkZHIsIFZhbHVlMzIgfCBTRUVQUk9NX0FERFJfREVWX0lEKERldikgfAotCVNFRVBST01fQUREUl9BRERSRVNTKEFkZHIpIHwgU0VFUFJPTV9BRERSX1NUQVJUIHwgU0VFUFJPTV9BRERSX1JFQUQpOwotCi0gICAgZm9yKGogPSAwOyBqIDwgMTAwMDsgaisrKQotICAgIHsKLQlWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEdyYy5FZXByb21BZGRyKTsKLQlpZihWYWx1ZTMyICYgU0VFUFJPTV9BRERSX0NPTVBMRVRFKQotCXsKLQkgICAgYnJlYWs7Ci0JfQotCU1NX1dhaXQoMTApOwotICAgIH0KLQotICAgIGlmKFZhbHVlMzIgJiBTRUVQUk9NX0FERFJfQ09NUExFVEUpCi0gICAgewotCVZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgR3JjLkVlcHJvbURhdGEpOwotCSpwRGF0YSA9IFZhbHVlMzI7Ci0KLQlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci0gICAgfQotCi0gICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotfSAvKiBMTV9FZXByb21SZWFkICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TVEFUSUMgTE1fU1RBVFVTCi1MTV9OdnJhbVJlYWQoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotICAgIExNX1VJTlQzMiBPZmZzZXQsCi0gICAgTE1fVUlOVDMyICpwRGF0YSkKLXsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKLSAgICBMTV9TVEFUVVMgU3RhdHVzOwotICAgIExNX1VJTlQzMiBqOwotCi0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQotICAgIHsKLQlTdGF0dXMgPSBMTV9FZXByb21SZWFkKHBEZXZpY2UsIE9mZnNldCwgcERhdGEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCS8qIERldGVybWluZSBpZiB3ZSBoYXZlIGZsYXNoIG9yIEVFUFJPTS4gKi8KLQlWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE52cmFtLkNvbmZpZzEpOwotCWlmKFZhbHVlMzIgJiBGTEFTSF9JTlRFUkZBQ0VfRU5BQkxFKQotCXsKLQkgICAgaWYoVmFsdWUzMiAmIEZMQVNIX1NTUkFNX0JVRkZFUlJFRF9NT0RFKQotCSAgICB7Ci0JCU9mZnNldCA9ICgoT2Zmc2V0L0JVRkZFUkVEX0ZMQVNIX1BBR0VfU0laRSkgPDwKLQkJICAgIEJVRkZFUkVEX0ZMQVNIX1BBR0VfUE9TKSArCi0JCSAgICAoT2Zmc2V0ICUgQlVGRkVSRURfRkxBU0hfUEFHRV9TSVpFKTsKLQkgICAgfQotCX0KLQotCVJFR19XUihwRGV2aWNlLCBOdnJhbS5Td0FyYiwgU1dfQVJCX1JFUV9TRVQxKTsKLQlmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKQotCXsKLQkgICAgaWYgKFJFR19SRChwRGV2aWNlLCBOdnJhbS5Td0FyYikgJiBTV19BUkJfR05UMSkKLQkgICAgewotCQlicmVhazsKLQkgICAgfQotCSAgICBNTV9XYWl0KDIwKTsKLQl9Ci0JaWYgKGogPT0gMTAwMCkKLQl7Ci0JICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvKiBSZWFkIGZyb20gZmxhc2ggb3IgRUVQUk9NIHdpdGggdGhlIG5ldyA1NzAzLzAyIGludGVyZmFjZS4gKi8KLQlSRUdfV1IocERldmljZSwgTnZyYW0uQWRkciwgT2Zmc2V0ICYgTlZSQU1fQUREUkVTU19NQVNLKTsKLQotCVJFR19XUihwRGV2aWNlLCBOdnJhbS5DbWQsIE5WUkFNX0NNRF9SRCB8IE5WUkFNX0NNRF9ET19JVCB8Ci0JICAgIE5WUkFNX0NNRF9GSVJTVCB8IE5WUkFNX0NNRF9MQVNUIHwgTlZSQU1fQ01EX0RPTkUpOwotCi0JLyogV2FpdCBmb3IgdGhlIGRvbmUgYml0IHRvIGNsZWFyLiAqLwotCWZvcihqID0gMDsgaiA8IDUwMDsgaisrKQotCXsKLQkgICAgTU1fV2FpdCgxMCk7Ci0KLQkgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5DbWQpOwotCSAgICBpZighKFZhbHVlMzIgJiBOVlJBTV9DTURfRE9ORSkpCi0JICAgIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLQkvKiBXYWl0IGZvciB0aGUgZG9uZSBiaXQuICovCi0JaWYoIShWYWx1ZTMyICYgTlZSQU1fQ01EX0RPTkUpKQotCXsKLQkgICAgZm9yKGogPSAwOyBqIDwgNTAwOyBqKyspCi0JICAgIHsKLQkJTU1fV2FpdCgxMCk7Ci0KLQkJVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5DbWQpOwotCQlpZihWYWx1ZTMyICYgTlZSQU1fQ01EX0RPTkUpCi0JCXsKLQkJICAgIE1NX1dhaXQoMTApOwotCi0JCSAgICAqcERhdGEgPSBSRUdfUkQocERldmljZSwgTnZyYW0uUmVhZERhdGEpOwotCi0JCSAgICAvKiBDaGFuZ2UgdGhlIGVuZGlhbmVzcy4gKi8KLQkJICAgICpwRGF0YSA9ICgoKnBEYXRhICYgMHhmZikgPDwgMjQpfCAoKCpwRGF0YSAmIDB4ZmYwMCkgPDwgOCl8Ci0JCQkoKCpwRGF0YSAmIDB4ZmYwMDAwKSA+PiA4KSB8ICgoKnBEYXRhID4+IDI0KSAmIDB4ZmYpOwotCi0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0JUkVHX1dSKHBEZXZpY2UsIE52cmFtLlN3QXJiLCBTV19BUkJfUkVRX0NMUjEpOwotCWlmKFZhbHVlMzIgJiBOVlJBTV9DTURfRE9ORSkKLQl7Ci0JICAgIFN0YXR1cyA9IExNX1NUQVRVU19TVUNDRVNTOwotCX0KLQllbHNlCi0JewotCSAgICBTdGF0dXMgPSBMTV9TVEFUVVNfRkFJTFVSRTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0gLyogTE1fTnZyYW1SZWFkICovCi0KLQotU1RBVElDIHZvaWQKLUxNX1JlYWRWUEQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQotewotICAgIExNX1VJTlQzMiBWcGRfYXJyWzI1Ni80XTsKLSAgICBMTV9VSU5UOCAqVnBkID0gKExNX1VJTlQ4ICopICZWcGRfYXJyWzBdOwotICAgIExNX1VJTlQzMiAqVnBkX2RwdHIgPSAmVnBkX2FyclswXTsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKLSAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgIC8qIFJlYWQgUE4gZnJvbSBWUEQgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqICs9IDQsIFZwZF9kcHRyKysgKQotICAgIHsKLQlpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIDB4MTAwICsgaiwgJlZhbHVlMzIpICE9IExNX1NUQVRVU19TVUNDRVNTKSB7Ci0JICAgIHByaW50ZigiQkNNNTcweDogTE1fUmVhZFZQRDogVlBEIHJlYWQgZmFpbGVkIgotCQkgICAiIChubyBFRVBST00gb25ib2FyZClcbiIpOwotCSAgICByZXR1cm47Ci0JfQotCSpWcGRfZHB0ciA9IGNwdV90b19sZTMyKFZhbHVlMzIpOwotICAgIH0KLSAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyApCi0gICAgewotCXVuc2lnbmVkIGludCBWcGRfcl9sZW47Ci0JdW5zaWduZWQgaW50IFZwZF9yX2VuZDsKLQotCWlmICgoVnBkW2pdID09IDB4ODIpIHx8IChWcGRbal0gPT0gMHg5MSkpCi0JewotCSAgICBqID0gaiArIDMgKyBWcGRbaiArIDFdICsgKFZwZFtqICsgMl0gPDwgOCk7Ci0JfQotCWVsc2UgaWYgKFZwZFtqXSA9PSAweDkwKQotCXsKLQkgICAgVnBkX3JfbGVuID0gIFZwZFtqICsgMV0gKyAoVnBkW2ogKyAyXSA8PCA4KTsKLQkgICAgaiArPSAzOwotCSAgICBWcGRfcl9lbmQgPSBWcGRfcl9sZW4gKyBqOwotCSAgICB3aGlsZSAoaiA8IFZwZF9yX2VuZCkKLQkgICAgewotCQlpZiAoKFZwZFtqXSA9PSAnUCcpICYmIChWcGRbaiArIDFdID09ICdOJykpCi0JCXsKLQkJICAgIHVuc2lnbmVkIGludCBsZW4gPSBWcGRbaiArIDJdOwotCi0JCSAgICBpZiAobGVuIDw9IDI0KQotCQkgICAgewotCQkJbWVtY3B5KHBEZXZpY2UtPlBhcnRObywgJlZwZFtqICsgM10sIGxlbik7Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIGlmIChWcGRbaiArIDJdID09IDApCi0JCSAgICB7CisJCQlKdW1ib0JkQWRkZWQrKzsKIAkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgaiA9IGogKyBWcGRbaiArIDJdOworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKworCQljYXNlIFQzX1NURF9SQ1ZfUFJPRF9SSU5HOgkvKiBTdGFuZGFyZCBSZWNlaXZlIFJpbmcuICovCisJCQkvKiBJbml0aWFsaXplIHRoZSBidWZmZXIgZGVzY3JpcHRvci4gKi8KKwkJCXBSY3ZCZCA9ICZwRGV2aWNlLT5wUnhTdGRCZFZpcnRbcERldmljZS0+UnhTdGRQcm9kSWR4XTsKKwkJCXBSY3ZCZC0+RmxhZ3MgPSBSQ1ZfQkRfRkxBR19FTkQ7CisJCQlwUmN2QmQtPkxlbiA9IE1BWF9TVERfUkNWX0JVRkZFUl9TSVpFOworCisJCQkvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIGJ1ZmZlciBwb2ludGVyICovCisjaWYgMAkJCQkvKiBKaW1teSwgZGVsZXRlZCBpbiBuZXcgcmVwbGFjZWQgd2l0aCBNTV9NYXBSeERtYSAqLworCQkJcFJjdkJkLT5Ib3N0QWRkci5Mb3cgPSBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyUGh5LkxvdzsKKwkJCXBSY3ZCZC0+SG9zdEFkZHIuSGlnaCA9IHBQYWNrZXQtPnUuUnguUnhCdWZmZXJQaHkuSGlnaDsKKyNlbmRpZgorCQkJTU1fTWFwUnhEbWEgKHBEZXZpY2UsIHBQYWNrZXQsICZwUmN2QmQtPkhvc3RBZGRyKTsKKworCQkJLyogVGhlIG9wYXF1ZSBmaWVsZCBtYXkgcG9pbnQgdG8gYW4gb2Zmc2V0IGZyb20gYSBmaXggYWRkci4gKi8KKwkJCXBSY3ZCZC0+T3BhcXVlID0gKExNX1VJTlQzMikgKE1NX1VJTlRfUFRSIChwUGFja2V0KSAtCisJCQkJCQkgICAgICBNTV9VSU5UX1BUUiAocERldmljZS0+CisJCQkJCQkJCSAgIHBQYWNrZXREZXNjQmFzZSkpOworCisJCQkvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4LiAqLworCQkJcERldmljZS0+UnhTdGRQcm9kSWR4ID0gKHBEZXZpY2UtPlJ4U3RkUHJvZElkeCArIDEpICYKKwkJCSAgICBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworCisJCQlTdGRCZEFkZGVkKys7CisJCQlicmVhazsKKworCQljYXNlIFQzX1VOS05PV05fUkNWX1BST0RfUklORzoKKwkJZGVmYXVsdDoKKwkJCUxtc3RhdHVzID0gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQkJLyogc3dpdGNoICovCisKKwkJLyogQmFpbCBvdXQgaWYgdGhlcmUgaXMgYW55IGVycm9yLiAqLworCQlpZiAoTG1zdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWJyZWFrOwogCQl9Ci0JICAgIH0KLQkgICAgYnJlYWs7CisKKwkJcFBhY2tldCA9CisJCSAgICAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKwl9CQkJLyogd2hpbGUgKi8KKworCXdtYiAoKTsKKwkvKiBVcGRhdGUgdGhlIHByb2NlZHVyZSBpbmRleC4gKi8KKwlpZiAoU3RkQmRBZGRlZCkgeworCQlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guUmN2U3RkUHJvZElkeC5Mb3csCisJCQkgICBwRGV2aWNlLT5SeFN0ZFByb2RJZHgpOwogCX0KLQllbHNlIHsKLQkgICAgYnJlYWs7CisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorCWlmIChKdW1ib0JkQWRkZWQpIHsKKwkJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlJjdkp1bWJvUHJvZElkeC5Mb3csCisJCQkgICBwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCk7CiAJfQotICAgIH0KKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisKKwlyZXR1cm4gTG1zdGF0dXM7Cit9CQkJCS8qIExNX1F1ZXVlUnhQYWNrZXRzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU1RBVElDIExNX1ZPSUQgTE1fTnZyYW1Jbml0IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fVUlOVDMyIGo7CisKKwkvKiBJbnRpYWxpemUgY2xvY2sgcGVyaW9kIGFuZCBzdGF0ZSBtYWNoaW5lLiAqLworCVZhbHVlMzIgPSBTRUVQUk9NX0FERFJfQ0xLX1BFUkQgKFNFRVBST01fQ0xPQ0tfUEVSSU9EKSB8CisJICAgIFNFRVBST01fQUREUl9GU01fUkVTRVQ7CisJUkVHX1dSIChwRGV2aWNlLCBHcmMuRWVwcm9tQWRkciwgVmFsdWUzMik7CisKKwlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspIHsKKwkJTU1fV2FpdCAoMTApOworCX0KKworCS8qIFNlcmlhbCBlZXByb20gYWNjZXNzIHVzaW5nIHRoZSBHcmMuRWVwcm9tQWRkci9FZXByb21EYXRhIHJlZ2lzdGVycy4gKi8KKwlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsCisJCVZhbHVlMzIgfCBHUkNfTUlTQ19MT0NBTF9DVFJMX0FVVE9fU0VFUFJPTSk7CisKKwkvKiBTZXQgdGhlIDU3MDEgY29tcGF0aWJpbGl0eSBtb2RlIGlmIHdlIGFyZSB1c2luZyBFRVBST00uICovCisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDAgJiYKKwkgICAgVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBOdnJhbS5Db25maWcxKTsKKwkJaWYgKChWYWx1ZTMyICYgRkxBU0hfSU5URVJGQUNFX0VOQUJMRSkgPT0gMCkgeworCQkJLyogVXNlIHRoZSBuZXcgaW50ZXJmYWNlIHRvIHJlYWQgRUVQUk9NLiAqLworCQkJVmFsdWUzMiAmPSB+RkxBU0hfQ09NUEFUX0JZUEFTUzsKKworCQkJUkVHX1dSIChwRGV2aWNlLCBOdnJhbS5Db25maWcxLCBWYWx1ZTMyKTsKKwkJfQorCX0KK30JCQkJLyogTE1fTnZSYW1Jbml0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU1RBVElDIExNX1NUQVRVUworTE1fRWVwcm9tUmVhZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgT2Zmc2V0LCBMTV9VSU5UMzIgKiBwRGF0YSkKK3sKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9VSU5UMzIgQWRkcjsKKwlMTV9VSU5UMzIgRGV2OworCUxNX1VJTlQzMiBqOworCisJaWYgKE9mZnNldCA+IFNFRVBST01fQ0hJUF9TSVpFKSB7CisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlEZXYgPSBPZmZzZXQgLyBTRUVQUk9NX0NISVBfU0laRTsKKwlBZGRyID0gT2Zmc2V0ICUgU0VFUFJPTV9DSElQX1NJWkU7CisKKwlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBHcmMuRWVwcm9tQWRkcik7CisJVmFsdWUzMiAmPSB+KFNFRVBST01fQUREUl9BRERSRVNTX01BU0sgfCBTRUVQUk9NX0FERFJfREVWX0lEX01BU0sgfAorCQkgICAgIFNFRVBST01fQUREUl9SV19NQVNLKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEdyYy5FZXByb21BZGRyLCBWYWx1ZTMyIHwgU0VFUFJPTV9BRERSX0RFVl9JRCAoRGV2KSB8CisJCVNFRVBST01fQUREUl9BRERSRVNTIChBZGRyKSB8IFNFRVBST01fQUREUl9TVEFSVCB8CisJCVNFRVBST01fQUREUl9SRUFEKTsKKworCWZvciAoaiA9IDA7IGogPCAxMDAwOyBqKyspIHsKKwkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgR3JjLkVlcHJvbUFkZHIpOworCQlpZiAoVmFsdWUzMiAmIFNFRVBST01fQUREUl9DT01QTEVURSkgeworCQkJYnJlYWs7CisJCX0KKwkJTU1fV2FpdCAoMTApOworCX0KKworCWlmIChWYWx1ZTMyICYgU0VFUFJPTV9BRERSX0NPTVBMRVRFKSB7CisJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIEdyYy5FZXByb21EYXRhKTsKKwkJKnBEYXRhID0gVmFsdWUzMjsKKworCQlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworfQkJCQkvKiBMTV9FZXByb21SZWFkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU1RBVElDIExNX1NUQVRVUworTE1fTnZyYW1SZWFkIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsIExNX1VJTlQzMiAqIHBEYXRhKQoreworCUxNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1NUQVRVUyBTdGF0dXM7CisJTE1fVUlOVDMyIGo7CisKKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCVN0YXR1cyA9IExNX0VlcHJvbVJlYWQgKHBEZXZpY2UsIE9mZnNldCwgcERhdGEpOworCX0gZWxzZSB7CisJCS8qIERldGVybWluZSBpZiB3ZSBoYXZlIGZsYXNoIG9yIEVFUFJPTS4gKi8KKwkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTnZyYW0uQ29uZmlnMSk7CisJCWlmIChWYWx1ZTMyICYgRkxBU0hfSU5URVJGQUNFX0VOQUJMRSkgeworCQkJaWYgKFZhbHVlMzIgJiBGTEFTSF9TU1JBTV9CVUZGRVJSRURfTU9ERSkgeworCQkJCU9mZnNldCA9ICgoT2Zmc2V0IC8gQlVGRkVSRURfRkxBU0hfUEFHRV9TSVpFKSA8PAorCQkJCQkgIEJVRkZFUkVEX0ZMQVNIX1BBR0VfUE9TKSArCisJCQkJICAgIChPZmZzZXQgJSBCVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUpOworCQkJfQorCQl9CisKKwkJUkVHX1dSIChwRGV2aWNlLCBOdnJhbS5Td0FyYiwgU1dfQVJCX1JFUV9TRVQxKTsKKwkJZm9yIChqID0gMDsgaiA8IDEwMDA7IGorKykgeworCQkJaWYgKFJFR19SRCAocERldmljZSwgTnZyYW0uU3dBcmIpICYgU1dfQVJCX0dOVDEpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCU1NX1dhaXQgKDIwKTsKKwkJfQorCQlpZiAoaiA9PSAxMDAwKSB7CisJCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCX0KKworCQkvKiBSZWFkIGZyb20gZmxhc2ggb3IgRUVQUk9NIHdpdGggdGhlIG5ldyA1NzAzLzAyIGludGVyZmFjZS4gKi8KKwkJUkVHX1dSIChwRGV2aWNlLCBOdnJhbS5BZGRyLCBPZmZzZXQgJiBOVlJBTV9BRERSRVNTX01BU0spOworCisJCVJFR19XUiAocERldmljZSwgTnZyYW0uQ21kLCBOVlJBTV9DTURfUkQgfCBOVlJBTV9DTURfRE9fSVQgfAorCQkJTlZSQU1fQ01EX0ZJUlNUIHwgTlZSQU1fQ01EX0xBU1QgfCBOVlJBTV9DTURfRE9ORSk7CisKKwkJLyogV2FpdCBmb3IgdGhlIGRvbmUgYml0IHRvIGNsZWFyLiAqLworCQlmb3IgKGogPSAwOyBqIDwgNTAwOyBqKyspIHsKKwkJCU1NX1dhaXQgKDEwKTsKKworCQkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTnZyYW0uQ21kKTsKKwkJCWlmICghKFZhbHVlMzIgJiBOVlJBTV9DTURfRE9ORSkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIFdhaXQgZm9yIHRoZSBkb25lIGJpdC4gKi8KKwkJaWYgKCEoVmFsdWUzMiAmIE5WUkFNX0NNRF9ET05FKSkgeworCQkJZm9yIChqID0gMDsgaiA8IDUwMDsgaisrKSB7CisJCQkJTU1fV2FpdCAoMTApOworCisJCQkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTnZyYW0uQ21kKTsKKwkJCQlpZiAoVmFsdWUzMiAmIE5WUkFNX0NNRF9ET05FKSB7CisJCQkJCU1NX1dhaXQgKDEwKTsKKworCQkJCQkqcERhdGEgPQorCQkJCQkgICAgUkVHX1JEIChwRGV2aWNlLCBOdnJhbS5SZWFkRGF0YSk7CisKKwkJCQkJLyogQ2hhbmdlIHRoZSBlbmRpYW5lc3MuICovCisJCQkJCSpwRGF0YSA9CisJCQkJCSAgICAoKCpwRGF0YSAmIDB4ZmYpIDw8IDI0KSB8CisJCQkJCSAgICAoKCpwRGF0YSAmIDB4ZmYwMCkgPDwgOCkgfAorCQkJCQkgICAgKCgqcERhdGEgJiAweGZmMDAwMCkgPj4gOCkgfAorCQkJCQkgICAgKCgqcERhdGEgPj4gMjQpICYgMHhmZik7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJUkVHX1dSIChwRGV2aWNlLCBOdnJhbS5Td0FyYiwgU1dfQVJCX1JFUV9DTFIxKTsKKwkJaWYgKFZhbHVlMzIgJiBOVlJBTV9DTURfRE9ORSkgeworCQkJU3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQlTdGF0dXMgPSBMTV9TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKworCXJldHVybiBTdGF0dXM7Cit9CQkJCS8qIExNX052cmFtUmVhZCAqLworCitTVEFUSUMgdm9pZCBMTV9SZWFkVlBEIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisJTE1fVUlOVDMyIFZwZF9hcnJbMjU2IC8gNF07CisJTE1fVUlOVDggKlZwZCA9IChMTV9VSU5UOCAqKSAmIFZwZF9hcnJbMF07CisJTE1fVUlOVDMyICpWcGRfZHB0ciA9ICZWcGRfYXJyWzBdOworCUxNX1VJTlQzMiBWYWx1ZTMyOworCXVuc2lnbmVkIGludCBqOworCisJLyogUmVhZCBQTiBmcm9tIFZQRCAqLworCWZvciAoaiA9IDA7IGogPCAyNTY7IGogKz0gNCwgVnBkX2RwdHIrKykgeworCQlpZiAoTE1fTnZyYW1SZWFkIChwRGV2aWNlLCAweDEwMCArIGosICZWYWx1ZTMyKSAhPQorCQkgICAgTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXByaW50ZiAoIkJDTTU3MHg6IExNX1JlYWRWUEQ6IFZQRCByZWFkIGZhaWxlZCIKKwkJCQkiIChubyBFRVBST00gb25ib2FyZClcbiIpOworCQkJcmV0dXJuOworCQl9CisJCSpWcGRfZHB0ciA9IGNwdV90b19sZTMyIChWYWx1ZTMyKTsKKwl9CisJZm9yIChqID0gMDsgaiA8IDI1NjspIHsKKwkJdW5zaWduZWQgaW50IFZwZF9yX2xlbjsKKwkJdW5zaWduZWQgaW50IFZwZF9yX2VuZDsKKworCQlpZiAoKFZwZFtqXSA9PSAweDgyKSB8fCAoVnBkW2pdID09IDB4OTEpKSB7CisJCQlqID0gaiArIDMgKyBWcGRbaiArIDFdICsgKFZwZFtqICsgMl0gPDwgOCk7CisJCX0gZWxzZSBpZiAoVnBkW2pdID09IDB4OTApIHsKKwkJCVZwZF9yX2xlbiA9IFZwZFtqICsgMV0gKyAoVnBkW2ogKyAyXSA8PCA4KTsKKwkJCWogKz0gMzsKKwkJCVZwZF9yX2VuZCA9IFZwZF9yX2xlbiArIGo7CisJCQl3aGlsZSAoaiA8IFZwZF9yX2VuZCkgeworCQkJCWlmICgoVnBkW2pdID09ICdQJykgJiYgKFZwZFtqICsgMV0gPT0gJ04nKSkgeworCQkJCQl1bnNpZ25lZCBpbnQgbGVuID0gVnBkW2ogKyAyXTsKKworCQkJCQlpZiAobGVuIDw9IDI0KSB7CisJCQkJCQltZW1jcHkgKHBEZXZpY2UtPlBhcnRObywKKwkJCQkJCQkmVnBkW2ogKyAzXSwgbGVuKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoVnBkW2ogKyAyXSA9PSAwKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlqID0gaiArIFZwZFtqICsgMl07CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KIH0KIAotU1RBVElDIHZvaWQKLUxNX1JlYWRCb290Q29kZVZlcnNpb24oUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorU1RBVElDIHZvaWQgTE1fUmVhZEJvb3RDb2RlVmVyc2lvbiAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIExNX1VJTlQzMiBWYWx1ZTMyLCBvZmZzZXQsIHZlcl9vZmZzZXQ7Ci0gICAgaW50IGk7CisJTE1fVUlOVDMyIFZhbHVlMzIsIG9mZnNldCwgdmVyX29mZnNldDsKKwlpbnQgaTsKIAotICAgIGlmIChMTV9OdnJhbVJlYWQocERldmljZSwgMHgwLCAmVmFsdWUzMikgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0JcmV0dXJuOwotICAgIGlmIChWYWx1ZTMyICE9IDB4YWE1NTk5NjYpCi0JcmV0dXJuOwotICAgIGlmIChMTV9OdnJhbVJlYWQocERldmljZSwgMHhjLCAmb2Zmc2V0KSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLQlyZXR1cm47Ci0KLSAgICBvZmZzZXQgPSAoKG9mZnNldCAmIDB4ZmYpIDw8IDI0KXwgKChvZmZzZXQgJiAweGZmMDApIDw8IDgpfAotCSgob2Zmc2V0ICYgMHhmZjAwMDApID4+IDgpIHwgKChvZmZzZXQgPj4gMjQpICYgMHhmZik7Ci0gICAgaWYgKExNX052cmFtUmVhZChwRGV2aWNlLCBvZmZzZXQsICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLQlyZXR1cm47Ci0gICAgaWYgKChWYWx1ZTMyID09IDB4MDMwMDAwMGUpICYmCi0JKExNX052cmFtUmVhZChwRGV2aWNlLCBvZmZzZXQgKyA0LCAmVmFsdWUzMikgPT0gTE1fU1RBVFVTX1NVQ0NFU1MpICYmCi0JKFZhbHVlMzIgPT0gMCkpIHsKLQotCWlmIChMTV9OdnJhbVJlYWQocERldmljZSwgb2Zmc2V0ICsgOCwgJnZlcl9vZmZzZXQpICE9IExNX1NUQVRVU19TVUNDRVNTKQotCSAgICByZXR1cm47Ci0JdmVyX29mZnNldCA9ICgodmVyX29mZnNldCAmIDB4ZmYwMDAwKSA+PiA4KSB8Ci0JICAgICgodmVyX29mZnNldCA+PiAyNCkgJiAweGZmKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gNCkgewotCSAgICBpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIG9mZnNldCArIHZlcl9vZmZzZXQgKyBpLCAmVmFsdWUzMikgIT0KLQkJTE1fU1RBVFVTX1NVQ0NFU1MpCi0JICAgIHsKKwlpZiAoTE1fTnZyYW1SZWFkIChwRGV2aWNlLCAweDAsICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKIAkJcmV0dXJuOwotCSAgICB9Ci0JICAgICooKExNX1VJTlQzMiAqKSAmcERldmljZS0+Qm9vdENvZGVWZXJbaV0pID0gY3B1X3RvX2xlMzIoVmFsdWUzMik7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQljaGFyIGM7CisJaWYgKFZhbHVlMzIgIT0gMHhhYTU1OTk2NikKKwkJcmV0dXJuOworCWlmIChMTV9OdnJhbVJlYWQgKHBEZXZpY2UsIDB4YywgJm9mZnNldCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybjsKIAotCWlmIChMTV9OdnJhbVJlYWQocERldmljZSwgMHg5NCwgJlZhbHVlMzIpICE9IExNX1NUQVRVU19TVUNDRVNTKQotCSAgICByZXR1cm47CisJb2Zmc2V0ID0gKChvZmZzZXQgJiAweGZmKSA8PCAyNCkgfCAoKG9mZnNldCAmIDB4ZmYwMCkgPDwgOCkgfAorCSAgICAoKG9mZnNldCAmIDB4ZmYwMDAwKSA+PiA4KSB8ICgob2Zmc2V0ID4+IDI0KSAmIDB4ZmYpOworCWlmIChMTV9OdnJhbVJlYWQgKHBEZXZpY2UsIG9mZnNldCwgJlZhbHVlMzIpICE9IExNX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisJaWYgKChWYWx1ZTMyID09IDB4MDMwMDAwMGUpICYmCisJICAgIChMTV9OdnJhbVJlYWQgKHBEZXZpY2UsIG9mZnNldCArIDQsICZWYWx1ZTMyKSA9PSBMTV9TVEFUVVNfU1VDQ0VTUykKKwkgICAgJiYgKFZhbHVlMzIgPT0gMCkpIHsKIAotCWkgPSAwOwotCWMgPSAoKFZhbHVlMzIgJiAweGZmMDAwMCkgPj4gMTYpOworCQlpZiAoTE1fTnZyYW1SZWFkIChwRGV2aWNlLCBvZmZzZXQgKyA4LCAmdmVyX29mZnNldCkgIT0KKwkJICAgIExNX1NUQVRVU19TVUNDRVNTKQorCQkJcmV0dXJuOworCQl2ZXJfb2Zmc2V0ID0gKCh2ZXJfb2Zmc2V0ICYgMHhmZjAwMDApID4+IDgpIHwKKwkJICAgICgodmVyX29mZnNldCA+PiAyNCkgJiAweGZmKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKKwkJCWlmIChMTV9OdnJhbVJlYWQKKwkJCSAgICAocERldmljZSwgb2Zmc2V0ICsgdmVyX29mZnNldCArIGksCisJCQkgICAgICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCSooKExNX1VJTlQzMiAqKSAmIHBEZXZpY2UtPkJvb3RDb2RlVmVyW2ldKSA9CisJCQkgICAgY3B1X3RvX2xlMzIgKFZhbHVlMzIpOworCQl9CisJfSBlbHNlIHsKKwkJY2hhciBjOwogCi0JaWYgKGMgPCAxMCkgewotCSAgICBwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gYyArICcwJzsKKwkJaWYgKExNX052cmFtUmVhZCAocERldmljZSwgMHg5NCwgJlZhbHVlMzIpICE9IExNX1NUQVRVU19TVUNDRVNTKQorCQkJcmV0dXJuOworCisJCWkgPSAwOworCQljID0gKChWYWx1ZTMyICYgMHhmZjAwMDApID4+IDE2KTsKKworCQlpZiAoYyA8IDEwKSB7CisJCQlwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gYyArICcwJzsKKwkJfSBlbHNlIHsKKwkJCXBEZXZpY2UtPkJvb3RDb2RlVmVyW2krK10gPSAoYyAvIDEwKSArICcwJzsKKwkJCXBEZXZpY2UtPkJvb3RDb2RlVmVyW2krK10gPSAoYyAlIDEwKSArICcwJzsKKwkJfQorCQlwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gJy4nOworCQljID0gKFZhbHVlMzIgJiAweGZmMDAwMDAwKSA+PiAyNDsKKwkJaWYgKGMgPCAxMCkgeworCQkJcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IGMgKyAnMCc7CisJCX0gZWxzZSB7CisJCQlwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gKGMgLyAxMCkgKyAnMCc7CisJCQlwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gKGMgJSAxMCkgKyAnMCc7CisJCX0KKwkJcERldmljZS0+Qm9vdENvZGVWZXJbaV0gPSAwOwogCX0KLQllbHNlIHsKLQkgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IChjIC8gMTApICsgJzAnOwotCSAgICBwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gKGMgJSAxMCkgKyAnMCc7Ci0JfQotCXBEZXZpY2UtPkJvb3RDb2RlVmVyW2krK10gPSAnLic7Ci0JYyA9IChWYWx1ZTMyICYgMHhmZjAwMDAwMCkgPj4gMjQ7Ci0JaWYgKGMgPCAxMCkgewotCSAgICBwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gYyArICcwJzsKLQl9Ci0JZWxzZSB7Ci0JICAgIHBEZXZpY2UtPkJvb3RDb2RlVmVyW2krK10gPSAoYyAvIDEwKSArICcwJzsKLQkgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IChjICUgMTApICsgJzAnOwotCX0KLQlwRGV2aWNlLT5Cb290Q29kZVZlcltpXSA9IDA7Ci0gICAgfQogfQogCi1TVEFUSUMgdm9pZAotTE1fR2V0QnVzU3BlZWQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorU1RBVElDIHZvaWQgTE1fR2V0QnVzU3BlZWQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBMTV9VSU5UMzIgUGNpU3RhdGUgPSBwRGV2aWNlLT5QY2lTdGF0ZTsKLSAgICBMTV9VSU5UMzIgQ2xvY2tDdHJsOwotICAgIGNoYXIgKlNwZWVkU3RyID0gIiI7CisJTE1fVUlOVDMyIFBjaVN0YXRlID0gcERldmljZS0+UGNpU3RhdGU7CisJTE1fVUlOVDMyIENsb2NrQ3RybDsKKwljaGFyICpTcGVlZFN0ciA9ICIiOwogCi0gICAgaWYgKFBjaVN0YXRlICYgVDNfUENJX1NUQVRFXzMyQklUX1BDSV9CVVMpCi0gICAgewotCXN0cmNweShwRGV2aWNlLT5CdXNTcGVlZFN0ciwgIjMyLWJpdCAiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlzdHJjcHkocERldmljZS0+QnVzU3BlZWRTdHIsICI2NC1iaXQgIik7Ci0gICAgfQotICAgIGlmIChQY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpCi0gICAgewotCXN0cmNhdChwRGV2aWNlLT5CdXNTcGVlZFN0ciwgIlBDSSAiKTsKLQlpZiAoUGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfSElHSF9CVVNfU1BFRUQpCi0JewotCSAgICBTcGVlZFN0ciA9ICI2Nk1IeiI7CisJaWYgKFBjaVN0YXRlICYgVDNfUENJX1NUQVRFXzMyQklUX1BDSV9CVVMpIHsKKwkJc3RyY3B5IChwRGV2aWNlLT5CdXNTcGVlZFN0ciwgIjMyLWJpdCAiKTsKKwl9IGVsc2UgeworCQlzdHJjcHkgKHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCAiNjQtYml0ICIpOwogCX0KLQllbHNlCi0JewotCSAgICBTcGVlZFN0ciA9ICIzM01IeiI7CisJaWYgKFBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkgeworCQlzdHJjYXQgKHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCAiUENJICIpOworCQlpZiAoUGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfSElHSF9CVVNfU1BFRUQpIHsKKwkJCVNwZWVkU3RyID0gIjY2TUh6IjsKKwkJfSBlbHNlIHsKKwkJCVNwZWVkU3RyID0gIjMzTUh6IjsKKwkJfQorCX0gZWxzZSB7CisJCXN0cmNhdCAocERldmljZS0+QnVzU3BlZWRTdHIsICJQQ0lYICIpOworCQlpZiAocERldmljZS0+Qm9uZElkID09IEdSQ19NSVNDX0JEX0lEXzU3MDRDSU9CRSkgeworCQkJU3BlZWRTdHIgPSAiMTMzTUh6IjsKKwkJfSBlbHNlIHsKKwkJCUNsb2NrQ3RybCA9IFJFR19SRCAocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCkgJiAweDFmOworCQkJc3dpdGNoIChDbG9ja0N0cmwpIHsKKwkJCWNhc2UgMDoKKwkJCQlTcGVlZFN0ciA9ICIzM01IeiI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQlTcGVlZFN0ciA9ICI1ME1IeiI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNDoKKwkJCQlTcGVlZFN0ciA9ICI2Nk1IeiI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNjoKKwkJCQlTcGVlZFN0ciA9ICIxMDBNSHoiOworCQkJCWJyZWFrOworCisJCQljYXNlIDc6CisJCQkJU3BlZWRTdHIgPSAiMTMzTUh6IjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQogCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlzdHJjYXQocERldmljZS0+QnVzU3BlZWRTdHIsICJQQ0lYICIpOwotCWlmIChwRGV2aWNlLT5Cb25kSWQgPT0gR1JDX01JU0NfQkRfSURfNTcwNENJT0JFKQotCXsKLQkgICAgU3BlZWRTdHIgPSAiMTMzTUh6IjsKLQl9Ci0JZWxzZQotCXsKLQkgICAgQ2xvY2tDdHJsID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwpICYgMHgxZjsKLQkgICAgc3dpdGNoIChDbG9ja0N0cmwpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCQlTcGVlZFN0ciA9ICIzM01IeiI7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgMjoKLQkJU3BlZWRTdHIgPSAiNTBNSHoiOwotCQlicmVhazsKLQotCSAgICBjYXNlIDQ6Ci0JCVNwZWVkU3RyID0gIjY2TUh6IjsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSA2OgotCQlTcGVlZFN0ciA9ICIxMDBNSHoiOwotCQlicmVhazsKLQotCSAgICBjYXNlIDc6Ci0JCVNwZWVkU3RyID0gIjEzM01IeiI7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBzdHJjYXQocERldmljZS0+QnVzU3BlZWRTdHIsIFNwZWVkU3RyKTsKKwlzdHJjYXQgKHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCBTcGVlZFN0cik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02NjAsOTc3ICs1OTgsODkwIEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX0dldEFkYXB0ZXJJbmZvKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTE1fU1RBVFVTIExNX0dldEFkYXB0ZXJJbmZvIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgUExNX0FEQVBURVJfSU5GTyBwQWRhcHRlckluZm87Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fU1RBVFVTIFN0YXR1czsKLSAgICBMTV9VSU5UMzIgajsKLSAgICBMTV9VSU5UMzIgRWVTaWdGb3VuZDsKLSAgICBMTV9VSU5UMzIgRWVQaHlUeXBlU2VyZGVzID0gMDsKLSAgICBMTV9VSU5UMzIgRWVQaHlMZWRNb2RlID0gMDsKLSAgICBMTV9VSU5UMzIgRWVQaHlJZCA9IDA7CisJUExNX0FEQVBURVJfSU5GTyBwQWRhcHRlckluZm87CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fU1RBVFVTIFN0YXR1czsKKwlMTV9VSU5UMzIgajsKKwlMTV9VSU5UMzIgRWVTaWdGb3VuZDsKKwlMTV9VSU5UMzIgRWVQaHlUeXBlU2VyZGVzID0gMDsKKwlMTV9VSU5UMzIgRWVQaHlMZWRNb2RlID0gMDsKKwlMTV9VSU5UMzIgRWVQaHlJZCA9IDA7CiAKLSAgICAvKiBHZXQgRGV2aWNlIElkIGFuZCBWZW5kb3IgSWQgKi8KLSAgICBTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX1ZFTkRPUl9JRF9SRUcsICZWYWx1ZTMyKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQotICAgIHBEZXZpY2UtPlBjaVZlbmRvcklkID0gKExNX1VJTlQxNikgVmFsdWUzMjsKLSAgICBwRGV2aWNlLT5QY2lEZXZpY2VJZCA9IChMTV9VSU5UMTYpIChWYWx1ZTMyID4+IDE2KTsKKwkvKiBHZXQgRGV2aWNlIElkIGFuZCBWZW5kb3IgSWQgKi8KKwlTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9WRU5ET1JfSURfUkVHLCAmVmFsdWUzMik7CisJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gU3RhdHVzOworCX0KKwlwRGV2aWNlLT5QY2lWZW5kb3JJZCA9IChMTV9VSU5UMTYpIFZhbHVlMzI7CisJcERldmljZS0+UGNpRGV2aWNlSWQgPSAoTE1fVUlOVDE2KSAoVmFsdWUzMiA+PiAxNik7CiAKLSAgICAvKiBJZiB3ZSBhcmUgbm90IGdldHRpbmcgdGhlIHdyaXRlIGFkYXB0ZXIsIGV4aXQuICovCi0gICAgaWYoKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDApICYmCi0gICAgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDEpICYmCi0gICAgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDIpICYmCi0gICAgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDJ4KSAmJgotICAgICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAyRkUpICYmCi0gICAgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDMpICYmCi0gICAgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDN4KSAmJgotICAgICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzA0KSkKLSAgICB7Ci0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotICAgIH0KKwkvKiBJZiB3ZSBhcmUgbm90IGdldHRpbmcgdGhlIHdyaXRlIGFkYXB0ZXIsIGV4aXQuICovCisJaWYgKChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAwKSAmJgorCSAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMSkgJiYKKwkgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDIpICYmCisJICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAyeCkgJiYKKwkgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDJGRSkgJiYKKwkgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDMpICYmCisJICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAzeCkgJiYgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDQpKSB7CisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwl9CiAKLSAgICBTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX1JFVl9JRF9SRUcsICZWYWx1ZTMyKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQotICAgIHBEZXZpY2UtPlBjaVJldklkID0gKExNX1VJTlQ4KSBWYWx1ZTMyOworCVN0YXR1cyA9IE1NX1JlYWRDb25maWczMiAocERldmljZSwgUENJX1JFVl9JRF9SRUcsICZWYWx1ZTMyKTsKKwlpZiAoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldHVybiBTdGF0dXM7CisJfQorCXBEZXZpY2UtPlBjaVJldklkID0gKExNX1VJTlQ4KSBWYWx1ZTMyOwogCi0gICAgLyogR2V0IElSUS4gKi8KLSAgICBTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX0lOVF9MSU5FX1JFRywgJlZhbHVlMzIpOwotICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLSAgICB7Ci0JcmV0dXJuIFN0YXR1czsKLSAgICB9Ci0gICAgcERldmljZS0+SXJxID0gKExNX1VJTlQ4KSBWYWx1ZTMyOworCS8qIEdldCBJUlEuICovCisJU3RhdHVzID0gTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBQQ0lfSU5UX0xJTkVfUkVHLCAmVmFsdWUzMik7CisJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gU3RhdHVzOworCX0KKwlwRGV2aWNlLT5JcnEgPSAoTE1fVUlOVDgpIFZhbHVlMzI7CiAKLSAgICAvKiBHZXQgaW50ZXJydXB0IHBpbi4gKi8KLSAgICBwRGV2aWNlLT5JbnRQaW4gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDgpOworCS8qIEdldCBpbnRlcnJ1cHQgcGluLiAqLworCXBEZXZpY2UtPkludFBpbiA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gOCk7CiAKLSAgICAvKiBHZXQgY2hpcCByZXZpc2lvbiBpZC4gKi8KLSAgICBTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX01JU0NfSE9TVF9DVFJMX1JFRywgJlZhbHVlMzIpOwotICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9IFZhbHVlMzIgPj4gMTY7CisJLyogR2V0IGNoaXAgcmV2aXNpb24gaWQuICovCisJU3RhdHVzID0gTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfTUlTQ19IT1NUX0NUUkxfUkVHLCAmVmFsdWUzMik7CisJcERldmljZS0+Q2hpcFJldklkID0gVmFsdWUzMiA+PiAxNjsKIAotICAgIC8qIEdldCBzdWJzeXN0ZW0gdmVuZG9yLiAqLwotICAgIFN0YXR1cyA9IE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRF9SRUcsICZWYWx1ZTMyKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQotICAgIHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkID0gKExNX1VJTlQxNikgVmFsdWUzMjsKKwkvKiBHZXQgc3Vic3lzdGVtIHZlbmRvci4gKi8KKwlTdGF0dXMgPQorCSAgICBNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lEX1JFRywgJlZhbHVlMzIpOworCWlmIChTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIFN0YXR1czsKKwl9CisJcERldmljZS0+U3Vic3lzdGVtVmVuZG9ySWQgPSAoTE1fVUlOVDE2KSBWYWx1ZTMyOwogCi0gICAgLyogR2V0IFBDSSBzdWJzeXN0ZW0gaWQuICovCi0gICAgcERldmljZS0+U3Vic3lzdGVtSWQgPSAoTE1fVUlOVDE2KSAoVmFsdWUzMiA+PiAxNik7CisJLyogR2V0IFBDSSBzdWJzeXN0ZW0gaWQuICovCisJcERldmljZS0+U3Vic3lzdGVtSWQgPSAoTE1fVUlOVDE2KSAoVmFsdWUzMiA+PiAxNik7CiAKLSAgICAvKiBHZXQgdGhlIGNhY2hlIGxpbmUgc2l6ZS4gKi8KLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX0NBQ0hFX0xJTkVfU0laRV9SRUcsICZWYWx1ZTMyKTsKLSAgICBwRGV2aWNlLT5DYWNoZUxpbmVTaXplID0gKExNX1VJTlQ4KSBWYWx1ZTMyOwotICAgIHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnID0gVmFsdWUzMjsKKwkvKiBHZXQgdGhlIGNhY2hlIGxpbmUgc2l6ZS4gKi8KKwlNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9DQUNIRV9MSU5FX1NJWkVfUkVHLCAmVmFsdWUzMik7CisJcERldmljZS0+Q2FjaGVMaW5lU2l6ZSA9IChMTV9VSU5UOCkgVmFsdWUzMjsKKwlwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyA9IFZhbHVlMzI7CiAKLSAgICBpZihwRGV2aWNlLT5DaGlwUmV2SWQgIT0gVDNfQ0hJUF9JRF81NzAzX0ExICYmCi0JcERldmljZS0+Q2hpcFJldklkICE9IFQzX0NISVBfSURfNTcwM19BMiAmJgotCXBEZXZpY2UtPkNoaXBSZXZJZCAhPSBUM19DSElQX0lEXzU3MDRfQTApCi0gICAgewotCXBEZXZpY2UtPlVuZGlGaXggPSBGQUxTRTsKLSAgICB9CisJaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCAhPSBUM19DSElQX0lEXzU3MDNfQTEgJiYKKwkgICAgcERldmljZS0+Q2hpcFJldklkICE9IFQzX0NISVBfSURfNTcwM19BMiAmJgorCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgIT0gVDNfQ0hJUF9JRF81NzA0X0EwKSB7CisJCXBEZXZpY2UtPlVuZGlGaXggPSBGQUxTRTsKKwl9CiAjaWYgIVBDSVhfVEFSR0VUX1dPUktBUk9VTkQKLSAgICBwRGV2aWNlLT5VbmRpRml4ID0gRkFMU0U7CisJcERldmljZS0+VW5kaUZpeCA9IEZBTFNFOwogI2VuZGlmCi0gICAgLyogTWFwIHRoZSBtZW1vcnkgYmFzZSB0byBzeXN0ZW0gYWRkcmVzcyBzcGFjZS4gKi8KLSAgICBpZiAoIXBEZXZpY2UtPlVuZGlGaXgpCi0gICAgewotCVN0YXR1cyA9IE1NX01hcE1lbUJhc2UocERldmljZSk7Ci0JaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQotCXsKLQkgICAgcmV0dXJuIFN0YXR1czsKKwkvKiBNYXAgdGhlIG1lbW9yeSBiYXNlIHRvIHN5c3RlbSBhZGRyZXNzIHNwYWNlLiAqLworCWlmICghcERldmljZS0+VW5kaUZpeCkgeworCQlTdGF0dXMgPSBNTV9NYXBNZW1CYXNlIChwRGV2aWNlKTsKKwkJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQorCQkvKiBJbml0aWFsaXplIHRoZSBtZW1vcnkgdmlldyBwb2ludGVyLiAqLworCQlwRGV2aWNlLT5wTWVtVmlldyA9IChQVDNfU1REX01FTV9NQVApIHBEZXZpY2UtPnBNYXBwZWRNZW1CYXNlOwogCX0KLQkvKiBJbml0aWFsaXplIHRoZSBtZW1vcnkgdmlldyBwb2ludGVyLiAqLwotCXBEZXZpY2UtPnBNZW1WaWV3ID0gKFBUM19TVERfTUVNX01BUCkgcERldmljZS0+cE1hcHBlZE1lbUJhc2U7Ci0gICAgfQorI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKKwkvKiBzdG9yZSB3aGV0aGVyIHdlIGFyZSBpbiBQQ0kgYXJlIFBDSS1YIG1vZGUgKi8KKwlwRGV2aWNlLT5FbmFibGVQY2lYRml4ID0gRkFMU0U7CisKKwlNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9TVEFURV9SRUcsICZWYWx1ZTMyKTsKKwlpZiAoKFZhbHVlMzIgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSA9PSAwKSB7CisJCS8qIEVuYWJsZSBQQ0ktWCB3b3JrYXJvdW5kIG9ubHkgaWYgd2UgYXJlIHJ1bm5pbmcgb24gNTcwMCBCWC4gKi8KKwkJaWYgKFQzX0NISVBfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0NISVBfUkVWXzU3MDBfQlgpIHsKKwkJCXBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBUUlVFOworCQl9CisJfQorCWlmIChwRGV2aWNlLT5VbmRpRml4KSB7CisJCXBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBUUlVFOworCX0KKyNlbmRpZgorCS8qIEJ4IGJ1ZzogZHVlIHRvIHRoZSAiYnl0ZV9lbmFibGUgYnVnIiBpbiBQQ0ktWCBtb2RlLCB0aGUgcG93ZXIgKi8KKwkvKiBtYW5hZ2VtZW50IHJlZ2lzdGVyIG1heSBiZSBjbG9iYmVyZWQgd2hpY2ggbWF5IGNhdXNlIHRoZSAqLworCS8qIEJDTTU3MDAgdG8gZ28gaW50byBEMyBzdGF0ZS4gIFdoaWxlIGluIHRoaXMgc3RhdGUsIHdlIHdpbGwgKi8KKwkvKiBub3QgaGF2ZSBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVyIGFjY2Vzcy4gIEFzIGEgd29ya2Fyb3VuZCwgd2UgKi8KKwkvKiBuZWVkIHRvIHJlc3RvcmUgdGhlIGRldmljZSB0byBEMCBzdGF0ZS4gKi8KKwlNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKKwlWYWx1ZTMyIHw9IFQzX1BNX1BNRV9BU1NFUlRFRDsKKwlWYWx1ZTMyICY9IH5UM19QTV9QT1dFUl9TVEFURV9NQVNLOworCVZhbHVlMzIgfD0gVDNfUE1fUE9XRVJfU1RBVEVfRDA7CisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgVmFsdWUzMik7CisKKwkvKiByZWFkIHRoZSBjdXJyZW50IFBDSSBjb21tYW5kIHdvcmQgKi8KKwlNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9DT01NQU5EX1JFRywgJlZhbHVlMzIpOworCisJLyogTWFrZSBzdXJlIGJ1cy1tYXN0ZXJpbmcgaXMgZW5hYmxlZC4gKi8KKwlWYWx1ZTMyIHw9IFBDSV9CVVNNQVNURVJfRU5BQkxFOwogCiAjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAotICAgIC8qIHN0b3JlIHdoZXRoZXIgd2UgYXJlIGluIFBDSSBhcmUgUENJLVggbW9kZSAqLwotICAgIHBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBGQUxTRTsKLQotICAgIE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBUM19QQ0lfU1RBVEVfUkVHLCAmVmFsdWUzMik7Ci0gICAgaWYoKFZhbHVlMzIgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSA9PSAwKQotICAgIHsKLQkvKiBFbmFibGUgUENJLVggd29ya2Fyb3VuZCBvbmx5IGlmIHdlIGFyZSBydW5uaW5nIG9uIDU3MDAgQlguICovCi0JaWYoVDNfQ0hJUF9SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19DSElQX1JFVl81NzAwX0JYKQotCXsKLQkgICAgcERldmljZS0+RW5hYmxlUGNpWEZpeCA9IFRSVUU7CisJLyogaWYgd2UgYXJlIGluIFBDSS1YIG1vZGUsIGFsc28gbWFrZSBzdXJlIG1lbS1tYXBwaW5nIGFuZCBTRVJSIy9QRVJSIworCSAgIGFyZSBlbmFibGVkICovCisJaWYgKHBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPT0gVFJVRSkgeworCQlWYWx1ZTMyIHw9IChQQ0lfTUVNX1NQQUNFX0VOQUJMRSB8IFBDSV9TWVNURU1fRVJST1JfRU5BQkxFIHwKKwkJCSAgICBQQ0lfUEFSSVRZX0VSUk9SX0VOQUJMRSk7CiAJfQotICAgIH0KLSAgICBpZiAocERldmljZS0+VW5kaUZpeCkKLSAgICB7Ci0JcERldmljZS0+RW5hYmxlUGNpWEZpeCA9IFRSVUU7Ci0gICAgfQotI2VuZGlmCi0gICAgLyogQnggYnVnOiBkdWUgdG8gdGhlICJieXRlX2VuYWJsZSBidWciIGluIFBDSS1YIG1vZGUsIHRoZSBwb3dlciAqLwotICAgIC8qIG1hbmFnZW1lbnQgcmVnaXN0ZXIgbWF5IGJlIGNsb2JiZXJlZCB3aGljaCBtYXkgY2F1c2UgdGhlICovCi0gICAgLyogQkNNNTcwMCB0byBnbyBpbnRvIEQzIHN0YXRlLiAgV2hpbGUgaW4gdGhpcyBzdGF0ZSwgd2Ugd2lsbCAqLwotICAgIC8qIG5vdCBoYXZlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgYWNjZXNzLiAgQXMgYSB3b3JrYXJvdW5kLCB3ZSAqLwotICAgIC8qIG5lZWQgdG8gcmVzdG9yZSB0aGUgZGV2aWNlIHRvIEQwIHN0YXRlLiAqLwotICAgIE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBUM19QQ0lfUE1fU1RBVFVTX0NUUkxfUkVHLCAmVmFsdWUzMik7Ci0gICAgVmFsdWUzMiB8PSBUM19QTV9QTUVfQVNTRVJURUQ7Ci0gICAgVmFsdWUzMiAmPSB+VDNfUE1fUE9XRVJfU1RBVEVfTUFTSzsKLSAgICBWYWx1ZTMyIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QwOwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgVmFsdWUzMik7Ci0KLSAgICAvKiByZWFkIHRoZSBjdXJyZW50IFBDSSBjb21tYW5kIHdvcmQgKi8KLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX0NPTU1BTkRfUkVHLCAmVmFsdWUzMik7Ci0KLSAgICAvKiBNYWtlIHN1cmUgYnVzLW1hc3RlcmluZyBpcyBlbmFibGVkLiAqLwotICAgIFZhbHVlMzIgfD0gUENJX0JVU01BU1RFUl9FTkFCTEU7Ci0KLSNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECi0gICAgLyogaWYgd2UgYXJlIGluIFBDSS1YIG1vZGUsIGFsc28gbWFrZSBzdXJlIG1lbS1tYXBwaW5nIGFuZCBTRVJSIy9QRVJSIwotCWFyZSBlbmFibGVkICovCi0gICAgaWYgKHBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPT0gVFJVRSkgewotCVZhbHVlMzIgfD0gKFBDSV9NRU1fU1BBQ0VfRU5BQkxFIHwgUENJX1NZU1RFTV9FUlJPUl9FTkFCTEUgfAotCQkgICAgUENJX1BBUklUWV9FUlJPUl9FTkFCTEUpOwotICAgIH0KLSAgICBpZiAocERldmljZS0+VW5kaUZpeCkKLSAgICB7Ci0JVmFsdWUzMiAmPSB+UENJX01FTV9TUEFDRV9FTkFCTEU7Ci0gICAgfQotCisJaWYgKHBEZXZpY2UtPlVuZGlGaXgpIHsKKwkJVmFsdWUzMiAmPSB+UENJX01FTV9TUEFDRV9FTkFCTEU7CisJfQogI2VuZGlmCiAKLSAgICBpZihwRGV2aWNlLT5FbmFibGVNV0kpCi0gICAgewotCVZhbHVlMzIgfD0gUENJX01FTU9SWV9XUklURV9JTlZBTElEQVRFOwotICAgIH0KLSAgICBlbHNlIHsKLQlWYWx1ZTMyICY9ICh+UENJX01FTU9SWV9XUklURV9JTlZBTElEQVRFKTsKLSAgICB9CisJaWYgKHBEZXZpY2UtPkVuYWJsZU1XSSkgeworCQlWYWx1ZTMyIHw9IFBDSV9NRU1PUllfV1JJVEVfSU5WQUxJREFURTsKKwl9IGVsc2UgeworCQlWYWx1ZTMyICY9ICh+UENJX01FTU9SWV9XUklURV9JTlZBTElEQVRFKTsKKwl9CiAKLSAgICAvKiBFcnJvciBvdXQgaWYgbWVtLW1hcHBpbmcgaXMgTk9UIGVuYWJsZWQgZm9yIFBDSSBzeXN0ZW1zICovCi0gICAgaWYgKCEoVmFsdWUzMiB8IFBDSV9NRU1fU1BBQ0VfRU5BQkxFKSkKLSAgICB7Ci0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotICAgIH0KKwkvKiBFcnJvciBvdXQgaWYgbWVtLW1hcHBpbmcgaXMgTk9UIGVuYWJsZWQgZm9yIFBDSSBzeXN0ZW1zICovCisJaWYgKCEoVmFsdWUzMiB8IFBDSV9NRU1fU1BBQ0VfRU5BQkxFKSkgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQogCi0gICAgLyogc2F2ZSB0aGUgdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIGludG8gdGhlIFBDSSBjb21tYW5kIHdvcmQgKi8KLSAgICBwRGV2aWNlLT5QY2lDb21tYW5kU3RhdHVzV29yZHMgPSBWYWx1ZTMyOworCS8qIHNhdmUgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byB3cml0ZSBpbnRvIHRoZSBQQ0kgY29tbWFuZCB3b3JkICovCisJcERldmljZS0+UGNpQ29tbWFuZFN0YXR1c1dvcmRzID0gVmFsdWUzMjsKIAotICAgIFN0YXR1cyA9IE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgUENJX0NPTU1BTkRfUkVHLCBWYWx1ZTMyKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQorCVN0YXR1cyA9IE1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9DT01NQU5EX1JFRywgVmFsdWUzMik7CisJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gU3RhdHVzOworCX0KIAotICAgIC8qIFNldCBwb3dlciBzdGF0ZSB0byBEMC4gKi8KLSAgICBMTV9TZXRQb3dlclN0YXRlKHBEZXZpY2UsIExNX1BPV0VSX1NUQVRFX0QwKTsKKwkvKiBTZXQgcG93ZXIgc3RhdGUgdG8gRDAuICovCisJTE1fU2V0UG93ZXJTdGF0ZSAocERldmljZSwgTE1fUE9XRVJfU1RBVEVfRDApOwogCiAjaWZkZWYgQklHX0VORElBTl9QQ0kKLSAgICBwRGV2aWNlLT5NaXNjSG9zdEN0cmwgPQotCU1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCB8Ci0JTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0lORElSRUNUX0FDQ0VTUyB8Ci0JTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0VORElBTl9XT1JEX1NXQVAgfAotCU1JU0NfSE9TVF9DVFJMX0VOQUJMRV9QQ0lfU1RBVEVfUkVHX1JXOwotI2Vsc2UgLyogTm8gQ1BVIFN3YXAgbW9kZXMgZm9yIFBDSSBJTyAqLworCXBEZXZpY2UtPk1pc2NIb3N0Q3RybCA9CisJICAgIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCB8CisJICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTkRJUkVDVF9BQ0NFU1MgfAorCSAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX1dPUkRfU1dBUCB8CisJICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9QQ0lfU1RBVEVfUkVHX1JXOworI2Vsc2UJCQkJLyogTm8gQ1BVIFN3YXAgbW9kZXMgZm9yIFBDSSBJTyAqLwogCi0gICAgLyogU2V0dXAgdGhlIG1vZGUgcmVnaXN0ZXJzLiAqLwotICAgIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCA9Ci0JTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UIHwKLQlNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX1dPUkRfU1dBUCB8CisJLyogU2V0dXAgdGhlIG1vZGUgcmVnaXN0ZXJzLiAqLworCXBEZXZpY2UtPk1pc2NIb3N0Q3RybCA9CisJICAgIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCB8CisJICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9FTkRJQU5fV09SRF9TV0FQIHwKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLQlNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX0JZVEVfU1dBUCB8Ci0jZW5kaWYgLyogQklHX0VORElBTl9IT1NUICovCi0JTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0lORElSRUNUX0FDQ0VTUyB8Ci0JTUlTQ19IT1NUX0NUUkxfRU5BQkxFX1BDSV9TVEFURV9SRUdfUlc7Ci0jZW5kaWYgLyogIUJJR19FTkRJQU5fUENJICovCisJICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9FTkRJQU5fQllURV9TV0FQIHwKKyNlbmRpZgkJCQkvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKwkgICAgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0lORElSRUNUX0FDQ0VTUyB8CisJICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9QQ0lfU1RBVEVfUkVHX1JXOworI2VuZGlmCQkJCS8qICFCSUdfRU5ESUFOX1BDSSAqLwogCi0gICAgLyogd3JpdGUgdG8gUENJIG1pc2MgaG9zdCBjdHIgZmlyc3QgaW4gb3JkZXIgdG8gZW5hYmxlIGluZGlyZWN0IGFjY2Vzc2VzICovCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfTUlTQ19IT1NUX0NUUkxfUkVHLCBwRGV2aWNlLT5NaXNjSG9zdEN0cmwpOworCS8qIHdyaXRlIHRvIFBDSSBtaXNjIGhvc3QgY3RyIGZpcnN0IGluIG9yZGVyIHRvIGVuYWJsZSBpbmRpcmVjdCBhY2Nlc3NlcyAqLworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NSVNDX0hPU1RfQ1RSTF9SRUcsCisJCQkgIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCk7CiAKLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCwgcERldmljZS0+TWlzY0hvc3RDdHJsKTsKKwlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5NaXNjSG9zdEN0cmwsIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCk7CiAKICNpZmRlZiBCSUdfRU5ESUFOX1BDSQotICAgIFZhbHVlMzIgPSBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQXwKLQkgICAgICBHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEE7CisJVmFsdWUzMiA9IEdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBIHwgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBOwogI2Vsc2UKIC8qIE5vIENQVSBTd2FwIG1vZGVzIGZvciBQQ0kgSU8gKi8KICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLSAgICBWYWx1ZTMyID0gR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBIHwKLQkgICAgICBHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEE7CisJVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8CisJICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQTsKICNlbHNlCi0gICAgVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8IEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBOworCVZhbHVlMzIgPSBHUkNfTU9ERV9CWVRFX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfCBHUkNfTU9ERV9CWVRFX1NXQVBfREFUQTsKICNlbmRpZgotI2VuZGlmIC8qICFCSUdfRU5ESUFOX1BDSSAqLworI2VuZGlmCQkJCS8qICFCSUdfRU5ESUFOX1BDSSAqLwogCi0gICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Nb2RlLCBWYWx1ZTMyKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Nb2RlLCBWYWx1ZTMyKTsKIAotICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxIHwKLQkgICAgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMSk7Ci0gICAgfQotICAgIE1NX1dhaXQoNDApOworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCVJFR19XUiAocERldmljZSwgR3JjLkxvY2FsQ3RybCwKKwkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxIHwKKwkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEpOworCX0KKwlNTV9XYWl0ICg0MCk7CiAKLSAgICAvKiBFbmFibGUgaW5kaXJlY3QgbWVtb3J5IGFjY2VzcyAqLwotICAgIFJFR19XUihwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUsIFQzX01FTV9BUkJJVEVSX01PREVfRU5BQkxFKTsKKwkvKiBFbmFibGUgaW5kaXJlY3QgbWVtb3J5IGFjY2VzcyAqLworCVJFR19XUiAocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLCBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSk7CiAKLSAgICBpZiAoUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwpICYgVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0spCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSyB8Ci0JCVQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLKTsKLQlSRUdfV1IocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0spOwotCU1NX1dhaXQoNDApOyAgLyogcmVxdWlyZWQgZGVsYXkgaXMgMjd1c2VjICovCi0gICAgfQotICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCAwKTsKLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1lbVdpbmRvd0Jhc2VBZGRyLCAwKTsKKwlpZiAoUkVHX1JEIChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsKSAmIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLKSB7CisJCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0sgfAorCQkJVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0spOworCQlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsCisJCQlUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyk7CisJCU1NX1dhaXQgKDQwKTsJLyogcmVxdWlyZWQgZGVsYXkgaXMgMjd1c2VjICovCisJfQorCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgMCk7CisJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuTWVtV2luZG93QmFzZUFkZHIsIDApOwogCiAjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAotICAgIE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBUM19QQ0lfU1RBVEVfUkVHLCAmVmFsdWUzMik7Ci0gICAgaWYgKChwRGV2aWNlLT5FbmFibGVQY2lYRml4ID09IEZBTFNFKSAmJgotCSgoVmFsdWUzMiAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpID09IDApKQotICAgIHsKLQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAotCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwIHx8Ci0JICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjIgfHwKLQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CNSkKLQl7Ci0JICAgIF9fcmF3X3dyaXRlbCgwLCAmKHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLk1lbUJsb2NrMzJLWzB4MzAwXSkpOwotCSAgICBfX3Jhd193cml0ZWwoMCwgJihwRGV2aWNlLT5wTWVtVmlldy0+dUludE1lbS5NZW1CbG9jazMyS1sweDMwMV0pKTsKLQkgICAgX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsICYocERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uTWVtQmxvY2szMktbMHgzMDFdKSk7Ci0JICAgIGlmIChfX3Jhd19yZWFkbCgmKHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLk1lbUJsb2NrMzJLWzB4MzAwXSkpKQotCSAgICB7Ci0JCXBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBUUlVFOwotCSAgICB9CisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfU1RBVEVfUkVHLCAmVmFsdWUzMik7CisJaWYgKChwRGV2aWNlLT5FbmFibGVQY2lYRml4ID09IEZBTFNFKSAmJgorCSAgICAoKFZhbHVlMzIgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSA9PSAwKSkgeworCQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorCQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCB8fAorCQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMiB8fAorCQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CNSkgeworCQkJX19yYXdfd3JpdGVsICgwLAorCQkJCSAgICAgICYocERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uCisJCQkJCU1lbUJsb2NrMzJLWzB4MzAwXSkpOworCQkJX19yYXdfd3JpdGVsICgwLAorCQkJCSAgICAgICYocERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uCisJCQkJCU1lbUJsb2NrMzJLWzB4MzAxXSkpOworCQkJX19yYXdfd3JpdGVsICgweGZmZmZmZmZmLAorCQkJCSAgICAgICYocERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uCisJCQkJCU1lbUJsb2NrMzJLWzB4MzAxXSkpOworCQkJaWYgKF9fcmF3X3JlYWRsCisJCQkgICAgKCYocERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uTWVtQmxvY2szMktbMHgzMDBdKSkpCisJCQl7CisJCQkJcERldmljZS0+RW5hYmxlUGNpWEZpeCA9IFRSVUU7CisJCQl9CisJCX0KIAl9Ci0gICAgfQogI2VuZGlmCiAjaWYgMQotICAgIC8qCi0gICAgKiAgVGhpcyBjb2RlIHdhcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVsc2UgYmxvY2sgYmVsb3csIGJ1dCB0aGF0J3MKLSAgICAqICBhIGJ1ZyBpZiBub2RlIGFkZHJlc3MgaW4gc2hhcmVkIG1lbW9yeS4KLSAgICAqLwotICAgIE1NX1dhaXQoNTApOwotICAgIExNX052cmFtSW5pdChwRGV2aWNlKTsKKwkvKgorCSAqICBUaGlzIGNvZGUgd2FzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWxzZSBibG9jayBiZWxvdywgYnV0IHRoYXQncworCSAqICBhIGJ1ZyBpZiBub2RlIGFkZHJlc3MgaW4gc2hhcmVkIG1lbW9yeS4KKwkgKi8KKwlNTV9XYWl0ICg1MCk7CisJTE1fTnZyYW1Jbml0IChwRGV2aWNlKTsKICNlbmRpZgotICAgIC8qIEdldCB0aGUgbm9kZSBhZGRyZXNzLiAgRmlyc3QgdHJ5IHRvIGdldCBpbiBmcm9tIHRoZSBzaGFyZWQgbWVtb3J5LiAqLwotICAgIC8qIElmIHRoZSBzaWduYXR1cmUgaXMgbm90IHByZXNlbnQsIHRoZW4gZ2V0IGl0IGZyb20gdGhlIE5WUkFNLiAqLwotICAgIFZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUKHBEZXZpY2UsIFQzX01BQ19BRERSX0hJR0hfTUFJTEJPWCk7Ci0gICAgaWYoKFZhbHVlMzIgPj4gMTYpID09IDB4NDg0YikKLSAgICB7CisJLyogR2V0IHRoZSBub2RlIGFkZHJlc3MuICBGaXJzdCB0cnkgdG8gZ2V0IGluIGZyb20gdGhlIHNoYXJlZCBtZW1vcnkuICovCisJLyogSWYgdGhlIHNpZ25hdHVyZSBpcyBub3QgcHJlc2VudCwgdGhlbiBnZXQgaXQgZnJvbSB0aGUgTlZSQU0uICovCisJVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQgKHBEZXZpY2UsIFQzX01BQ19BRERSX0hJR0hfTUFJTEJPWCk7CisJaWYgKChWYWx1ZTMyID4+IDE2KSA9PSAweDQ4NGIpIHsKIAotCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzBdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiA4KTsKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1sxXSA9IChMTV9VSU5UOCkgVmFsdWUzMjsKKwkJcERldmljZS0+Tm9kZUFkZHJlc3NbMF0gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDgpOworCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1sxXSA9IChMTV9VSU5UOCkgVmFsdWUzMjsKIAotCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUKHBEZXZpY2UsIFQzX01BQ19BRERSX0xPV19NQUlMQk9YKTsKKwkJVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQgKHBEZXZpY2UsIFQzX01BQ19BRERSX0xPV19NQUlMQk9YKTsKIAotCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzJdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAyNCk7Ci0JcERldmljZS0+Tm9kZUFkZHJlc3NbM10gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDE2KTsKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1s0XSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gOCk7Ci0JcERldmljZS0+Tm9kZUFkZHJlc3NbNV0gPSAoTE1fVUlOVDgpIFZhbHVlMzI7CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzJdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAyNCk7CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAxNik7CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiA4KTsKKwkJcERldmljZS0+Tm9kZUFkZHJlc3NbNV0gPSAoTE1fVUlOVDgpIFZhbHVlMzI7CiAKLQlTdGF0dXMgPSBMTV9TVEFUVVNfU1VDQ0VTUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlTdGF0dXMgPSBMTV9OdnJhbVJlYWQocERldmljZSwgMHg3YywgJlZhbHVlMzIpOwotCWlmKFN0YXR1cyA9PSBMTV9TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzBdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAxNik7Ci0JICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAyNCk7CisJCVN0YXR1cyA9IExNX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCVN0YXR1cyA9IExNX052cmFtUmVhZCAocERldmljZSwgMHg3YywgJlZhbHVlMzIpOworCQlpZiAoU3RhdHVzID09IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMTYpOworCQkJcERldmljZS0+Tm9kZUFkZHJlc3NbMV0gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDI0KTsKIAotCSAgICBTdGF0dXMgPSBMTV9OdnJhbVJlYWQocERldmljZSwgMHg4MCwgJlZhbHVlMzIpOworCQkJU3RhdHVzID0gTE1fTnZyYW1SZWFkIChwRGV2aWNlLCAweDgwLCAmVmFsdWUzMik7CiAKLQkgICAgcERldmljZS0+Tm9kZUFkZHJlc3NbMl0gPSAoTE1fVUlOVDgpIFZhbHVlMzI7Ci0JICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiA4KTsKLQkgICAgcERldmljZS0+Tm9kZUFkZHJlc3NbNF0gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDE2KTsKLQkgICAgcERldmljZS0+Tm9kZUFkZHJlc3NbNV0gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDI0KTsKKwkJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzJdID0gKExNX1VJTlQ4KSBWYWx1ZTMyOworCQkJcERldmljZS0+Tm9kZUFkZHJlc3NbM10gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDgpOworCQkJcERldmljZS0+Tm9kZUFkZHJlc3NbNF0gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDE2KTsKKwkJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAyNCk7CisJCX0KIAl9Ci0gICAgfQogCi0gICAgLyogQXNzaWduIGEgZGVmYXVsdCBhZGRyZXNzLiAqLwotICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLSAgICB7CisJLyogQXNzaWduIGEgZGVmYXVsdCBhZGRyZXNzLiAqLworCWlmIChTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKICNpZm5kZWYgRU1CRURERUQKLQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBnZXQgTUFDIGFkZHIgZnJvbSBOVlJBTS4gVXNpbmcgZGVmYXVsdC5cbiIpOworCQlwcmludGsgKEtFUk5fRVJSCisJCQkiQ2Fubm90IGdldCBNQUMgYWRkciBmcm9tIE5WUkFNLiBVc2luZyBkZWZhdWx0LlxuIik7CiAjZW5kaWYKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSA9IDB4MDA7IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdID0gMHgxMDsKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSA9IDB4MTg7IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdID0gMHg2ODsKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1s0XSA9IDB4NjE7IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdID0gMHg3NjsKLSAgICB9CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzBdID0gMHgwMDsKKwkJcERldmljZS0+Tm9kZUFkZHJlc3NbMV0gPSAweDEwOworCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSA9IDB4MTg7CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdID0gMHg2ODsKKwkJcERldmljZS0+Tm9kZUFkZHJlc3NbNF0gPSAweDYxOworCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1s1XSA9IDB4NzY7CisJfQogCi0gICAgcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbMF0gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXTsKLSAgICBwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1sxXSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdOwotICAgIHBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzJdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbMl07Ci0gICAgcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbM10gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXTsKLSAgICBwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1s0XSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdOwotICAgIHBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzVdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbNV07CisJcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbMF0gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXTsKKwlwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1sxXSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdOworCXBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzJdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbMl07CisJcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbM10gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXTsKKwlwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1s0XSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdOworCXBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzVdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbNV07CiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHZhbHVlcy4gKi8KLSAgICBwRGV2aWNlLT5Ob1R4UHNldWRvSGRyQ2hrc3VtID0gRkFMU0U7Ci0gICAgcERldmljZS0+Tm9SeFBzZXVkb0hkckNoa3N1bSA9IEZBTFNFOwotICAgIHBEZXZpY2UtPk5pY1NlbmRCZCA9IEZBTFNFOwotICAgIHBEZXZpY2UtPlR4UGFja2V0RGVzY0NudCA9IERFRkFVTFRfVFhfUEFDS0VUX0RFU0NfQ09VTlQ7Ci0gICAgcERldmljZS0+UnhTdGREZXNjQ250ID0gREVGQVVMVF9TVERfUkNWX0RFU0NfQ09VTlQ7Ci0gICAgcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MgPSBERUZBVUxUX1JYX0NPQUxFU0NJTkdfVElDS1M7Ci0gICAgcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3MgPSBERUZBVUxUX1RYX0NPQUxFU0NJTkdfVElDS1M7Ci0gICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXMgPSBERUZBVUxUX1JYX01BWF9DT0FMRVNDRURfRlJBTUVTOwotICAgIHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID0gREVGQVVMVF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKLSAgICBwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9IEJBRF9ERUZBVUxUX1ZBTFVFOwotICAgIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gQkFEX0RFRkFVTFRfVkFMVUU7Ci0gICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPSBCQURfREVGQVVMVF9WQUxVRTsKLSAgICBwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9IEJBRF9ERUZBVUxUX1ZBTFVFOwotICAgIHBEZXZpY2UtPlN0YXRzQ29hbGVzY2luZ1RpY2tzID0gREVGQVVMVF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTOwotICAgIHBEZXZpY2UtPkVuYWJsZU1XSSA9IEZBTFNFOwotICAgIHBEZXZpY2UtPlR4TXR1ID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQzsKLSAgICBwRGV2aWNlLT5SeE10dSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkM7Ci0gICAgcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKLSAgICBwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX0FVVE87Ci0gICAgcERldmljZS0+TGlua0NobmdNb2RlID0gVDNfTElOS19DSE5HX01PREVfQVVUTzsKLSAgICBwRGV2aWNlLT5MZWRNb2RlID0gTEVEX01PREVfQVVUTzsKLSAgICBwRGV2aWNlLT5SZXNldFBoeU9uSW5pdCA9IFRSVUU7Ci0gICAgcERldmljZS0+RGVsYXlQY2lHcmFudCA9IFRSVUU7Ci0gICAgcERldmljZS0+VXNlVGFnZ2VkU3RhdHVzID0gRkFMU0U7Ci0gICAgcERldmljZS0+T25lRG1hQXRPbmNlID0gQkFEX0RFRkFVTFRfVkFMVUU7CisJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB2YWx1ZXMuICovCisJcERldmljZS0+Tm9UeFBzZXVkb0hkckNoa3N1bSA9IEZBTFNFOworCXBEZXZpY2UtPk5vUnhQc2V1ZG9IZHJDaGtzdW0gPSBGQUxTRTsKKwlwRGV2aWNlLT5OaWNTZW5kQmQgPSBGQUxTRTsKKwlwRGV2aWNlLT5UeFBhY2tldERlc2NDbnQgPSBERUZBVUxUX1RYX1BBQ0tFVF9ERVNDX0NPVU5UOworCXBEZXZpY2UtPlJ4U3RkRGVzY0NudCA9IERFRkFVTFRfU1REX1JDVl9ERVNDX0NPVU5UOworCXBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID0gREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTOworCXBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzID0gREVGQVVMVF9UWF9DT0FMRVNDSU5HX1RJQ0tTOworCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzID0gREVGQVVMVF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKKwlwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lcyA9IERFRkFVTFRfVFhfTUFYX0NPQUxFU0NFRF9GUkFNRVM7CisJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSBCQURfREVGQVVMVF9WQUxVRTsKKwlwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9IEJBRF9ERUZBVUxUX1ZBTFVFOworCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gQkFEX0RFRkFVTFRfVkFMVUU7CisJcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPSBCQURfREVGQVVMVF9WQUxVRTsKKwlwRGV2aWNlLT5TdGF0c0NvYWxlc2NpbmdUaWNrcyA9IERFRkFVTFRfU1RBVFNfQ09BTEVTQ0lOR19USUNLUzsKKwlwRGV2aWNlLT5FbmFibGVNV0kgPSBGQUxTRTsKKwlwRGV2aWNlLT5UeE10dSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkM7CisJcERldmljZS0+UnhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOworCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7CisJcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9BVVRPOworCXBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9IFQzX0xJTktfQ0hOR19NT0RFX0FVVE87CisJcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX0FVVE87CisJcERldmljZS0+UmVzZXRQaHlPbkluaXQgPSBUUlVFOworCXBEZXZpY2UtPkRlbGF5UGNpR3JhbnQgPSBUUlVFOworCXBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IEZBTFNFOworCXBEZXZpY2UtPk9uZURtYUF0T25jZSA9IEJBRF9ERUZBVUxUX1ZBTFVFOwogCi0gICAgcERldmljZS0+RG1hTWJ1Zkxvd01hcmsgPSBUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLX0pVTUJPOwotICAgIHBEZXZpY2UtPlJ4TWFjTWJ1Zkxvd01hcmsgPSBUM19ERUZfUlhfTUFDX01CVUZfTE9XX1dNQVJLX0pVTUJPOwotICAgIHBEZXZpY2UtPk1idWZIaWdoTWFyayA9IFQzX0RFRl9NQlVGX0hJR0hfV01BUktfSlVNQk87CisJcERldmljZS0+RG1hTWJ1Zkxvd01hcmsgPSBUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLX0pVTUJPOworCXBEZXZpY2UtPlJ4TWFjTWJ1Zkxvd01hcmsgPSBUM19ERUZfUlhfTUFDX01CVUZfTE9XX1dNQVJLX0pVTUJPOworCXBEZXZpY2UtPk1idWZIaWdoTWFyayA9IFQzX0RFRl9NQlVGX0hJR0hfV01BUktfSlVNQk87CiAKLSAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPOwotICAgIHBEZXZpY2UtPlRhc2tPZmZsb2FkQ2FwID0gTE1fVEFTS19PRkZMT0FEX05PTkU7Ci0gICAgcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRTsKLSAgICBwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKwlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPOworCXBEZXZpY2UtPlRhc2tPZmZsb2FkQ2FwID0gTE1fVEFTS19PRkZMT0FEX05PTkU7CisJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRTsKKwlwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKICNpZiBJTkNMVURFX1RCSV9TVVBQT1JUCi0gICAgcERldmljZS0+UG9sbFRiaUxpbmsgPSBCQURfREVGQVVMVF9WQUxVRTsKKwlwRGV2aWNlLT5Qb2xsVGJpTGluayA9IEJBRF9ERUZBVUxUX1ZBTFVFOwogI2VuZGlmCiAKLSAgICBzd2l0Y2ggKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkpCi0gICAgewotICAgIGNhc2UgVDNfQVNJQ19SRVZfNTcwNDoKLQlwRGV2aWNlLT5NYnVmQmFzZSA9IFQzX05JQ19NQlVGX1BPT0xfQUREUjsKLQlwRGV2aWNlLT5NYnVmU2l6ZSA9IFQzX05JQ19NQlVGX1BPT0xfU0laRTY0OwotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JcERldmljZS0+TWJ1ZkJhc2UgPSBUM19OSUNfTUJVRl9QT09MX0FERFI7Ci0JcERldmljZS0+TWJ1ZlNpemUgPSBUM19OSUNfTUJVRl9QT09MX1NJWkU5NjsKLQlicmVhazsKLSAgICB9CisJc3dpdGNoIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSkgeworCWNhc2UgVDNfQVNJQ19SRVZfNTcwNDoKKwkJcERldmljZS0+TWJ1ZkJhc2UgPSBUM19OSUNfTUJVRl9QT09MX0FERFI7CisJCXBEZXZpY2UtPk1idWZTaXplID0gVDNfTklDX01CVUZfUE9PTF9TSVpFNjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBEZXZpY2UtPk1idWZCYXNlID0gVDNfTklDX01CVUZfUE9PTF9BRERSOworCQlwRGV2aWNlLT5NYnVmU2l6ZSA9IFQzX05JQ19NQlVGX1BPT0xfU0laRTk2OworCQlicmVhazsKKwl9CiAKLSAgICBwRGV2aWNlLT5MaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKLSAgICBwRGV2aWNlLT5RdWV1ZVJ4UGFja2V0cyA9IFRSVUU7CisJcERldmljZS0+TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047CisJcERldmljZS0+UXVldWVSeFBhY2tldHMgPSBUUlVFOwogCi0gICAgcERldmljZS0+RW5hYmxlV2lyZVNwZWVkID0gVFJVRTsKKwlwRGV2aWNlLT5FbmFibGVXaXJlU3BlZWQgPSBUUlVFOwogCiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIHBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gREVGQVVMVF9KVU1CT19SQ1ZfREVTQ19DT1VOVDsKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisJcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSBERUZBVUxUX0pVTUJPX1JDVl9ERVNDX0NPVU5UOworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KIAotICAgIC8qIE1ha2UgdGhpcyBpcyBhIGtub3duIGFkYXB0ZXIuICovCi0gICAgcEFkYXB0ZXJJbmZvID0gTE1fR2V0QWRhcHRlckluZm9CeVNzaWQocERldmljZS0+U3Vic3lzdGVtVmVuZG9ySWQsCi0JcERldmljZS0+U3Vic3lzdGVtSWQpOworCS8qIE1ha2UgdGhpcyBpcyBhIGtub3duIGFkYXB0ZXIuICovCisJcEFkYXB0ZXJJbmZvID0gTE1fR2V0QWRhcHRlckluZm9CeVNzaWQgKHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkLAorCQkJCQkJcERldmljZS0+U3Vic3lzdGVtSWQpOwogCi0gICAgcERldmljZS0+Qm9uZElkID0gUkVHX1JEKHBEZXZpY2UsIEdyYy5NaXNjQ2ZnKSAmIEdSQ19NSVNDX0JEX0lEX01BU0s7Ci0gICAgaWYgKHBEZXZpY2UtPkJvbmRJZCAhPSBHUkNfTUlTQ19CRF9JRF81NzAwICYmCi0JcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDEgJiYKLQlwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMkZFICYmCi0JcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDMgJiYKLQlwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwM1MgJiYKLQlwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwNCAmJgotCXBEZXZpY2UtPkJvbmRJZCAhPSBHUkNfTUlTQ19CRF9JRF81NzA0Q0lPQkUpCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfVU5LTk9XTl9BREFQVEVSOwotICAgIH0KLQotICAgIHBEZXZpY2UtPlNwbGl0TW9kZUVuYWJsZSA9IFNQTElUX01PREVfRElTQUJMRTsKLSAgICBpZiAoKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDRfQTApICYmCi0JKHBEZXZpY2UtPkJvbmRJZCA9PSBHUkNfTUlTQ19CRF9JRF81NzA0Q0lPQkUpKQotICAgIHsKLQlwRGV2aWNlLT5TcGxpdE1vZGVFbmFibGUgPSBTUExJVF9NT0RFX0VOQUJMRTsKLQlwRGV2aWNlLT5TcGxpdE1vZGVNYXhSZXEgPSBTUExJVF9NT0RFXzU3MDRfTUFYX1JFUTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgRWVwcm9tIGluZm8uICovCi0gICAgVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQocERldmljZSwgVDNfTklDX0RBVEFfU0lHX0FERFIpOwotICAgIGlmIChWYWx1ZTMyID09IFQzX05JQ19EQVRBX1NJRykKLSAgICB7Ci0JRWVTaWdGb3VuZCA9IFRSVUU7Ci0JVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQocERldmljZSwgVDNfTklDX0RBVEFfTklDX0NGR19BRERSKTsKLQotCS8qIERldGVybWluZSBQSFkgdHlwZS4gKi8KLQlzd2l0Y2ggKFZhbHVlMzIgJiBUM19OSUNfQ0ZHX1BIWV9UWVBFX01BU0spCi0JewotCSAgICBjYXNlIFQzX05JQ19DRkdfUEhZX1RZUEVfQ09QUEVSOgotCQlFZVBoeVR5cGVTZXJkZXMgPSBGQUxTRTsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBUM19OSUNfQ0ZHX1BIWV9UWVBFX0ZJQkVSOgotCQlFZVBoeVR5cGVTZXJkZXMgPSBUUlVFOwotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQlFZVBoeVR5cGVTZXJkZXMgPSBGQUxTRTsKLQkJYnJlYWs7CisJcERldmljZS0+Qm9uZElkID0gUkVHX1JEIChwRGV2aWNlLCBHcmMuTWlzY0NmZykgJiBHUkNfTUlTQ19CRF9JRF9NQVNLOworCWlmIChwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMCAmJgorCSAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMSAmJgorCSAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMkZFICYmCisJICAgIHBEZXZpY2UtPkJvbmRJZCAhPSBHUkNfTUlTQ19CRF9JRF81NzAzICYmCisJICAgIHBEZXZpY2UtPkJvbmRJZCAhPSBHUkNfTUlTQ19CRF9JRF81NzAzUyAmJgorCSAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwNCAmJgorCSAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwNENJT0JFKSB7CisJCXJldHVybiBMTV9TVEFUVVNfVU5LTk9XTl9BREFQVEVSOwogCX0KIAotCS8qIERldGVybWluZSBQSFkgbGVkIG1vZGUuICovCi0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKLQl7Ci0JICAgIHN3aXRjaChWYWx1ZTMyICYgVDNfTklDX0NGR19MRURfTU9ERV9NQVNLKQotCSAgICB7Ci0JCWNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9UUklQTEVfU1BFRUQ6Ci0JCSAgICBFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9USFJFRV9MSU5LOwotCQkgICAgYnJlYWs7CisJcERldmljZS0+U3BsaXRNb2RlRW5hYmxlID0gU1BMSVRfTU9ERV9ESVNBQkxFOworCWlmICgocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkgJiYKKwkgICAgKHBEZXZpY2UtPkJvbmRJZCA9PSBHUkNfTUlTQ19CRF9JRF81NzA0Q0lPQkUpKSB7CisJCXBEZXZpY2UtPlNwbGl0TW9kZUVuYWJsZSA9IFNQTElUX01PREVfRU5BQkxFOworCQlwRGV2aWNlLT5TcGxpdE1vZGVNYXhSZXEgPSBTUExJVF9NT0RFXzU3MDRfTUFYX1JFUTsKKwl9CiAKLQkJY2FzZSBUM19OSUNfQ0ZHX0xFRF9NT0RFX0xJTktfU1BFRUQ6Ci0JCSAgICBFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9MSU5LMTA7Ci0JCSAgICBicmVhazsKKwkvKiBHZXQgRWVwcm9tIGluZm8uICovCisJVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQgKHBEZXZpY2UsIFQzX05JQ19EQVRBX1NJR19BRERSKTsKKwlpZiAoVmFsdWUzMiA9PSBUM19OSUNfREFUQV9TSUcpIHsKKwkJRWVTaWdGb3VuZCA9IFRSVUU7CisJCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUIChwRGV2aWNlLCBUM19OSUNfREFUQV9OSUNfQ0ZHX0FERFIpOworCisJCS8qIERldGVybWluZSBQSFkgdHlwZS4gKi8KKwkJc3dpdGNoIChWYWx1ZTMyICYgVDNfTklDX0NGR19QSFlfVFlQRV9NQVNLKSB7CisJCWNhc2UgVDNfTklDX0NGR19QSFlfVFlQRV9DT1BQRVI6CisJCQlFZVBoeVR5cGVTZXJkZXMgPSBGQUxTRTsKKwkJCWJyZWFrOworCisJCWNhc2UgVDNfTklDX0NGR19QSFlfVFlQRV9GSUJFUjoKKwkJCUVlUGh5VHlwZVNlcmRlcyA9IFRSVUU7CisJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkgICAgRWVQaHlMZWRNb2RlID0gTEVEX01PREVfQVVUTzsKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JICAgIHN3aXRjaChWYWx1ZTMyICYgVDNfTklDX0NGR19MRURfTU9ERV9NQVNLKQotCSAgICB7Ci0JCWNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9PUEVOX0RSQUlOOgotCQkgICAgRWVQaHlMZWRNb2RlID0gTEVEX01PREVfT1BFTl9EUkFJTjsKLQkJICAgIGJyZWFrOworCQkJRWVQaHlUeXBlU2VyZGVzID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQogCi0JCWNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9PVVRQVVQ6Ci0JCSAgICBFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9PVVRQVVQ7Ci0JCSAgICBicmVhazsKKwkJLyogRGV0ZXJtaW5lIFBIWSBsZWQgbW9kZS4gKi8KKwkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKwkJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJCXN3aXRjaCAoVmFsdWUzMiAmIFQzX05JQ19DRkdfTEVEX01PREVfTUFTSykgeworCQkJY2FzZSBUM19OSUNfQ0ZHX0xFRF9NT0RFX1RSSVBMRV9TUEVFRDoKKwkJCQlFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9USFJFRV9MSU5LOworCQkJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCSAgICBFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9BVVRPOwotCQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0JaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMSB8fAotCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0EyKQotCXsKLQkgICAgLyogRW5hYmxlIEVFUFJPTSB3cml0ZSBwcm90ZWN0aW9uLiAqLwotCSAgICBpZihWYWx1ZTMyICYgVDNfTklDX0VFUFJPTV9XUCkKLQkgICAgewotCQlwRGV2aWNlLT5FZXByb21XcCA9IFRSVUU7Ci0JICAgIH0KKwkJCWNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9MSU5LX1NQRUVEOgorCQkJCUVlUGh5TGVkTW9kZSA9IExFRF9NT0RFX0xJTksxMDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9BVVRPOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChWYWx1ZTMyICYgVDNfTklDX0NGR19MRURfTU9ERV9NQVNLKSB7CisJCQljYXNlIFQzX05JQ19DRkdfTEVEX01PREVfT1BFTl9EUkFJTjoKKwkJCQlFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9PUEVOX0RSQUlOOworCQkJCWJyZWFrOworCisJCQljYXNlIFQzX05JQ19DRkdfTEVEX01PREVfT1VUUFVUOgorCQkJCUVlUGh5TGVkTW9kZSA9IExFRF9NT0RFX09VVFBVVDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9BVVRPOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0ExIHx8CisJCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0EyKSB7CisJCQkvKiBFbmFibGUgRUVQUk9NIHdyaXRlIHByb3RlY3Rpb24uICovCisJCQlpZiAoVmFsdWUzMiAmIFQzX05JQ19FRVBST01fV1ApIHsKKwkJCQlwRGV2aWNlLT5FZXByb21XcCA9IFRSVUU7CisJCQl9CisJCX0KKworCQkvKiBHZXQgdGhlIFBIWSBJZC4gKi8KKwkJVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQgKHBEZXZpY2UsIFQzX05JQ19EQVRBX1BIWV9JRF9BRERSKTsKKwkJaWYgKFZhbHVlMzIpIHsKKwkJCUVlUGh5SWQgPSAoKChWYWx1ZTMyICYgVDNfTklDX1BIWV9JRDFfTUFTSykgPj4gMTYpICYKKwkJCQkgICBQSFlfSUQxX09VSV9NQVNLKSA8PCAxMDsKKworCQkJVmFsdWUzMiA9IFZhbHVlMzIgJiBUM19OSUNfUEhZX0lEMl9NQVNLOworCisJCQlFZVBoeUlkIHw9ICgoVmFsdWUzMiAmIFBIWV9JRDJfT1VJX01BU0spIDw8IDE2KSB8CisJCQkgICAgKFZhbHVlMzIgJiBQSFlfSUQyX01PREVMX01BU0spIHwgKFZhbHVlMzIgJgorCQkJCQkJCSAgICAgIFBIWV9JRDJfUkVWX01BU0spOworCQl9IGVsc2UgeworCQkJRWVQaHlJZCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlFZVNpZ0ZvdW5kID0gRkFMU0U7CiAJfQogCi0JLyogR2V0IHRoZSBQSFkgSWQuICovCi0JVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQocERldmljZSwgVDNfTklDX0RBVEFfUEhZX0lEX0FERFIpOwotCWlmIChWYWx1ZTMyKQotCXsKLQkgICAgRWVQaHlJZCA9ICgoKFZhbHVlMzIgJiBUM19OSUNfUEhZX0lEMV9NQVNLKSA+PiAxNikgJgotCQlQSFlfSUQxX09VSV9NQVNLKSA8PCAxMDsKKwkvKiBTZXQgdGhlIFBIWSBhZGRyZXNzLiAqLworCXBEZXZpY2UtPlBoeUFkZHIgPSBQSFlfREVWSUNFX0lEOwogCi0JICAgIFZhbHVlMzIgPSBWYWx1ZTMyICYgVDNfTklDX1BIWV9JRDJfTUFTSzsKKwkvKiBEaXNhYmxlIGF1dG8gcG9sbGluZy4gKi8KKwlwRGV2aWNlLT5NaU1vZGUgPSAweGMwMDAwOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7CisJTU1fV2FpdCAoNDApOwogCi0JICAgIEVlUGh5SWQgfD0gKChWYWx1ZTMyICYgUEhZX0lEMl9PVUlfTUFTSykgPDwgMTYpIHwKLQkgICAgICAoVmFsdWUzMiAmIFBIWV9JRDJfTU9ERUxfTUFTSykgfCAoVmFsdWUzMiAmIFBIWV9JRDJfUkVWX01BU0spOwotCX0KLQllbHNlCi0JewotCSAgICBFZVBoeUlkID0gMDsKLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JRWVTaWdGb3VuZCA9IEZBTFNFOwotICAgIH0KKwkvKiBHZXQgdGhlIFBIWSBpZC4gKi8KKwlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfSUQxX1JFRywgJlZhbHVlMzIpOworCXBEZXZpY2UtPlBoeUlkID0gKFZhbHVlMzIgJiBQSFlfSUQxX09VSV9NQVNLKSA8PCAxMDsKIAotICAgIC8qIFNldCB0aGUgUEhZIGFkZHJlc3MuICovCi0gICAgcERldmljZS0+UGh5QWRkciA9IFBIWV9ERVZJQ0VfSUQ7CisJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX0lEMl9SRUcsICZWYWx1ZTMyKTsKKwlwRGV2aWNlLT5QaHlJZCB8PSAoKFZhbHVlMzIgJiBQSFlfSUQyX09VSV9NQVNLKSA8PCAxNikgfAorCSAgICAoVmFsdWUzMiAmIFBIWV9JRDJfTU9ERUxfTUFTSykgfCAoVmFsdWUzMiAmIFBIWV9JRDJfUkVWX01BU0spOwogCi0gICAgLyogRGlzYWJsZSBhdXRvIHBvbGxpbmcuICovCi0gICAgcERldmljZS0+TWlNb2RlID0gMHhjMDAwMDsKLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7Ci0gICAgTU1fV2FpdCg0MCk7Ci0KLSAgICAvKiBHZXQgdGhlIFBIWSBpZC4gKi8KLSAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9JRDFfUkVHLCAmVmFsdWUzMik7Ci0gICAgcERldmljZS0+UGh5SWQgPSAoVmFsdWUzMiAmIFBIWV9JRDFfT1VJX01BU0spIDw8IDEwOwotCi0gICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfSUQyX1JFRywgJlZhbHVlMzIpOwotICAgIHBEZXZpY2UtPlBoeUlkIHw9ICgoVmFsdWUzMiAmIFBIWV9JRDJfT1VJX01BU0spIDw8IDE2KSB8Ci0gICAgICAoVmFsdWUzMiAmIFBIWV9JRDJfTU9ERUxfTUFTSykgfCAoVmFsdWUzMiAmIFBIWV9JRDJfUkVWX01BU0spOwotCi0gICAgLyogU2V0IHRoZSBFbmFibGVUYmkgZmxhZyB0byBmYWxzZSBpZiB3ZSBoYXZlIGEgY29wcGVyIFBIWS4gKi8KLSAgICBzd2l0Y2gocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykKLSAgICB7CisJLyogU2V0IHRoZSBFbmFibGVUYmkgZmxhZyB0byBmYWxzZSBpZiB3ZSBoYXZlIGEgY29wcGVyIFBIWS4gKi8KKwlzd2l0Y2ggKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spIHsKIAljYXNlIFBIWV9CQ001NDAwX1BIWV9JRDoKLQkgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7Ci0JICAgIGJyZWFrOworCQlwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKwkJYnJlYWs7CiAKIAljYXNlIFBIWV9CQ001NDAxX1BIWV9JRDoKLQkgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7Ci0JICAgIGJyZWFrOworCQlwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKwkJYnJlYWs7CiAKIAljYXNlIFBIWV9CQ001NDExX1BIWV9JRDoKLQkgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7Ci0JICAgIGJyZWFrOworCQlwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKwkJYnJlYWs7CiAKIAljYXNlIFBIWV9CQ001NzAxX1BIWV9JRDoKLQkgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7Ci0JICAgIGJyZWFrOworCQlwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKwkJYnJlYWs7CiAKIAljYXNlIFBIWV9CQ001NzAzX1BIWV9JRDoKLQkgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7Ci0JICAgIGJyZWFrOworCQlwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKwkJYnJlYWs7CiAKIAljYXNlIFBIWV9CQ001NzA0X1BIWV9JRDoKLQkgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7Ci0JICAgIGJyZWFrOworCQlwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKwkJYnJlYWs7CiAKIAljYXNlIFBIWV9CQ004MDAyX1BIWV9JRDoKLQkgICAgcERldmljZS0+RW5hYmxlVGJpID0gVFJVRTsKLQkgICAgYnJlYWs7CisJCXBEZXZpY2UtPkVuYWJsZVRiaSA9IFRSVUU7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAotCSAgICBpZiAocEFkYXB0ZXJJbmZvKQotCSAgICB7Ci0JCXBEZXZpY2UtPlBoeUlkID0gcEFkYXB0ZXJJbmZvLT5QaHlJZDsKLQkJcERldmljZS0+RW5hYmxlVGJpID0gcEFkYXB0ZXJJbmZvLT5TZXJkZXM7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoRWVTaWdGb3VuZCkKLQkgICAgewotCQlwRGV2aWNlLT5QaHlJZCA9IEVlUGh5SWQ7Ci0JCXBEZXZpY2UtPkVuYWJsZVRiaSA9IEVlUGh5VHlwZVNlcmRlczsKLQkgICAgfQotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBCYWlsIG91dCBpZiB3ZSBkb24ndCBrbm93IHRoZSBjb3BwZXIgUEhZIGlkLiAqLwotICAgIGlmKFVOS05PV05fUEhZX0lEKHBEZXZpY2UtPlBoeUlkKSAmJiAhcERldmljZS0+RW5hYmxlVGJpKQotICAgIHsKLQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAzKQotICAgIHsKLQlpZigocERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcgJiAweGZmMDApIDwgMHg0MDAwKQotCXsKLQkgICAgcERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcgJj0gMHhmZmZmMDBmZjsKLQkgICAgcERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcgfD0gMHg0MDAwOwotCX0KLSAgICB9Ci0gICAgLyogQ2hhbmdlIGRyaXZlciBwYXJhbWV0ZXJzLiAqLwotICAgIFN0YXR1cyA9IE1NX0dldENvbmZpZyhwRGV2aWNlKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQotCi0jaWYgSU5DTFVERV81NzAxX0FYX0ZJWAotICAgIGlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0EwIHx8Ci0JcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkKLSAgICB7Ci0JcERldmljZS0+UmVzZXRQaHlPbkluaXQgPSBUUlVFOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogU2F2ZSB0aGUgY3VycmVudCBwaHkgbGluayBzdGF0dXMuICovCi0gICAgaWYoIXBEZXZpY2UtPkVuYWJsZVRiaSkKLSAgICB7Ci0JTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQotCS8qIElmIHdlIGRvbid0IGhhdmUgbGluayByZXNldCB0aGUgUEhZLiAqLwotCWlmKCEoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKSB8fCBwRGV2aWNlLT5SZXNldFBoeU9uSW5pdCkKLQl7Ci0KLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCBQSFlfQ1RSTF9QSFlfUkVTRVQpOwotCi0JICAgIGZvcihqID0gMDsgaiA8IDEwMDsgaisrKQotCSAgICB7Ci0JCU1NX1dhaXQoMTApOwotCi0JCUxNX1JlYWRQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCAmVmFsdWUzMik7Ci0JCWlmKFZhbHVlMzIgJiYgIShWYWx1ZTMyICYgUEhZX0NUUkxfUEhZX1JFU0VUKSkKLQkJewotCQkgICAgTU1fV2FpdCg0MCk7Ci0JCSAgICBicmVhazsKKwkJaWYgKHBBZGFwdGVySW5mbykgeworCQkJcERldmljZS0+UGh5SWQgPSBwQWRhcHRlckluZm8tPlBoeUlkOworCQkJcERldmljZS0+RW5hYmxlVGJpID0gcEFkYXB0ZXJJbmZvLT5TZXJkZXM7CisJCX0gZWxzZSBpZiAoRWVTaWdGb3VuZCkgeworCQkJcERldmljZS0+UGh5SWQgPSBFZVBoeUlkOworCQkJcERldmljZS0+RW5hYmxlVGJpID0gRWVQaHlUeXBlU2VyZGVzOwogCQl9Ci0JICAgIH0KKwkJYnJlYWs7CisJfQogCisJLyogQmFpbCBvdXQgaWYgd2UgZG9uJ3Qga25vdyB0aGUgY29wcGVyIFBIWSBpZC4gKi8KKwlpZiAoVU5LTk9XTl9QSFlfSUQgKHBEZXZpY2UtPlBoeUlkKSAmJiAhcERldmljZS0+RW5hYmxlVGJpKSB7CisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMykgeworCQlpZiAoKHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnICYgMHhmZjAwKSA8IDB4NDAwMCkgeworCQkJcERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcgJj0gMHhmZmZmMDBmZjsKKwkJCXBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnIHw9IDB4NDAwMDsKKwkJfQorCX0KKwkvKiBDaGFuZ2UgZHJpdmVyIHBhcmFtZXRlcnMuICovCisJU3RhdHVzID0gTU1fR2V0Q29uZmlnIChwRGV2aWNlKTsKKwlpZiAoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldHVybiBTdGF0dXM7CisJfQorI2lmIElOQ0xVREVfNTcwMV9BWF9GSVgKKwlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwKSB7CisJCXBEZXZpY2UtPlJlc2V0UGh5T25Jbml0ID0gVFJVRTsKKwl9CisjZW5kaWYKKworCS8qIFNhdmUgdGhlIGN1cnJlbnQgcGh5IGxpbmsgc3RhdHVzLiAqLworCWlmICghcERldmljZS0+RW5hYmxlVGJpKSB7CisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBsaW5rIHJlc2V0IHRoZSBQSFkuICovCisJCWlmICghKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykKKwkJICAgIHx8IHBEZXZpY2UtPlJlc2V0UGh5T25Jbml0KSB7CisKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsIFBIWV9DVFJMX1BIWV9SRVNFVCk7CisKKwkJCWZvciAoaiA9IDA7IGogPCAxMDA7IGorKykgeworCQkJCU1NX1dhaXQgKDEwKTsKKworCQkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOworCQkJCWlmIChWYWx1ZTMyICYmICEoVmFsdWUzMiAmIFBIWV9DVFJMX1BIWV9SRVNFVCkpIHsKKwkJCQkJTU1fV2FpdCAoNDApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CiAKICNpZiBJTkNMVURFXzU3MDFfQVhfRklYCi0JICAgIC8qIDU3MDFfQVhfQlggYnVnOiAgb25seSBhZHZlcnRpc2VzIDEwbWIgc3BlZWQuICovCi0JICAgIGlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKLQkJcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkKLQkgICAgeworCQkJLyogNTcwMV9BWF9CWCBidWc6ICBvbmx5IGFkdmVydGlzZXMgMTBtYiBzcGVlZC4gKi8KKwkJCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0EwIHx8CisJCQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkgewogCi0JCVZhbHVlMzIgPSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRCB8Ci0JCSAgICBQSFlfQU5fQURfMTBCQVNFVF9IQUxGIHwgUEhZX0FOX0FEXzEwQkFTRVRfRlVMTCB8Ci0JCSAgICBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEwgfCBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7Ci0JCVZhbHVlMzIgfD0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhwRGV2aWNlKTsKLQkJTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7Ci0JCXBEZXZpY2UtPmFkdmVydGlzaW5nID0gVmFsdWUzMjsKKwkJCQlWYWx1ZTMyID0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0QgfAorCQkJCSAgICBQSFlfQU5fQURfMTBCQVNFVF9IQUxGIHwKKwkJCQkgICAgUEhZX0FOX0FEXzEwQkFTRVRfRlVMTCB8CisJCQkJICAgIFBIWV9BTl9BRF8xMDBCQVNFVFhfRlVMTCB8CisJCQkJICAgIFBIWV9BTl9BRF8xMDBCQVNFVFhfSEFMRjsKKwkJCQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKHBEZXZpY2UpOworCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKKwkJCQlwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CiAKLQkJVmFsdWUzMiA9IEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0hBTEYgfAotCQkgICAgQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTCB8IEJDTTU0MFhfQ09ORklHX0FTX01BU1RFUiB8Ci0JCSAgICBCQ001NDBYX0VOQUJMRV9DT05GSUdfQVNfTUFTVEVSOwotCQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgVmFsdWUzMik7Ci0JCXBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IFZhbHVlMzI7CisJCQkJVmFsdWUzMiA9IEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0hBTEYgfAorCQkJCSAgICBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9GVUxMIHwKKwkJCQkgICAgQkNNNTQwWF9DT05GSUdfQVNfTUFTVEVSIHwKKwkJCQkgICAgQkNNNTQwWF9FTkFCTEVfQ09ORklHX0FTX01BU1RFUjsKKwkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwKKwkJCQkJICAgICBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywKKwkJCQkJICAgICBWYWx1ZTMyKTsKKwkJCQlwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOwogCi0JCUxNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgUEhZX0NUUkxfQVVUT19ORUdfRU5BQkxFIHwKLQkJICAgIFBIWV9DVFJMX1JFU1RBUlRfQVVUT19ORUcpOwotCSAgICB9CisJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIFBIWV9DVFJMX1JFRywKKwkJCQkJICAgICBQSFlfQ1RSTF9BVVRPX05FR19FTkFCTEUgfAorCQkJCQkgICAgIFBIWV9DVFJMX1JFU1RBUlRfQVVUT19ORUcpOworCQkJfQogI2VuZGlmCi0JICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMykKLQkgICAgewotCQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDE4LCAweDBjMDApOwotCQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDE3LCAweDIwMWYpOwotCQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDE1LCAweDJhYWEpOwotCSAgICB9Ci0JICAgIGlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDRfQTApCi0JICAgIHsKLQkJTE1fV3JpdGVQaHkocERldmljZSwgMHgxYywgMHg4ZDY4KTsKLQkJTE1fV3JpdGVQaHkocERldmljZSwgMHgxYywgMHg4ZDY4KTsKLQkgICAgfQotCSAgICAvKiBFbmFibGUgRXRoZXJuZXRAV2lyZVNwZWVkLiAqLwotCSAgICBpZihwRGV2aWNlLT5FbmFibGVXaXJlU3BlZWQpCi0JICAgIHsKLQkJTE1fV3JpdGVQaHkocERldmljZSwgMHgxOCwgMHg3MDA3KTsKLQkJTE1fUmVhZFBoeShwRGV2aWNlLCAweDE4LCAmVmFsdWUzMik7Ci0JCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTgsIFZhbHVlMzIgfCBCSVRfMTUgfCBCSVRfNCk7Ci0JICAgIH0KKwkJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PQorCQkJICAgIFQzX0FTSUNfUkVWXzU3MDMpIHsKKwkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxOCwgMHgwYzAwKTsKKwkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxNywgMHgyMDFmKTsKKwkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxNSwgMHgyYWFhKTsKKwkJCX0KKwkJCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKSB7CisJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MWMsIDB4OGQ2OCk7CisJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MWMsIDB4OGQ2OCk7CisJCQl9CisJCQkvKiBFbmFibGUgRXRoZXJuZXRAV2lyZVNwZWVkLiAqLworCQkJaWYgKHBEZXZpY2UtPkVuYWJsZVdpcmVTcGVlZCkgeworCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDE4LCAweDcwMDcpOworCQkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIDB4MTgsICZWYWx1ZTMyKTsKKwkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxOCwKKwkJCQkJICAgICBWYWx1ZTMyIHwgQklUXzE1IHwgQklUXzQpOworCQkJfQorCQl9CiAJfQotICAgIH0KIAotICAgIC8qIFR1cm4gb2ZmIHRhcCBwb3dlciBtYW5hZ2VtZW50LiAqLwotICAgIGlmKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTQwMV9QSFlfSUQpCi0gICAgewotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsIDB4MGMyMCk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMik7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxODA0KTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHgwMDEzKTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDEyMDQpOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDEzMik7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwMjMyKTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHgyMDFmKTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDBhMjApOworCS8qIFR1cm4gb2ZmIHRhcCBwb3dlciBtYW5hZ2VtZW50LiAqLworCWlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU0MDFfUEhZX0lEKSB7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDBjMjApOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMik7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDE4MDQpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMyk7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDEyMDQpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAxMzIpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAyMzIpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MjAxZik7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDBhMjApOwogCi0JTU1fV2FpdCg0MCk7Ci0gICAgfQotCisJCU1NX1dhaXQgKDQwKTsKKwl9CiAjaWYgSU5DTFVERV9UQklfU1VQUE9SVAotICAgIHBEZXZpY2UtPklnbm9yZVRiaUxpbmtDaGFuZ2UgPSBGQUxTRTsKKwlwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlID0gRkFMU0U7CiAKLSAgICBpZihwRGV2aWNlLT5FbmFibGVUYmkpCi0gICAgewotCXBEZXZpY2UtPldha2VVcE1vZGVDYXAgPSBMTV9XQUtFX1VQX01PREVfTk9ORTsKLQlwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX0xJTktfUkVBRFk7Ci0JaWYgKChwRGV2aWNlLT5Qb2xsVGJpTGluayA9PSBCQURfREVGQVVMVF9WQUxVRSkgfHwKLQkgICAgcERldmljZS0+RGlzYWJsZUF1dG9OZWcpCi0JewotCSAgICBwRGV2aWNlLT5Qb2xsVGJpTGluayA9IEZBTFNFOworCWlmIChwRGV2aWNlLT5FbmFibGVUYmkpIHsKKwkJcERldmljZS0+V2FrZVVwTW9kZUNhcCA9IExNX1dBS0VfVVBfTU9ERV9OT05FOworCQlwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX0xJTktfUkVBRFk7CisJCWlmICgocERldmljZS0+UG9sbFRiaUxpbmsgPT0gQkFEX0RFRkFVTFRfVkFMVUUpIHx8CisJCSAgICBwRGV2aWNlLT5EaXNhYmxlQXV0b05lZykgeworCQkJcERldmljZS0+UG9sbFRiaUxpbmsgPSBGQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJCXBEZXZpY2UtPlBvbGxUYmlMaW5rID0gRkFMU0U7CiAJfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXBEZXZpY2UtPlBvbGxUYmlMaW5rID0gRkFMU0U7Ci0gICAgfQotI2VuZGlmIC8qIElOQ0xVREVfVEJJX1NVUFBPUlQgKi8KKyNlbmRpZgkJCQkvKiBJTkNMVURFX1RCSV9TVVBQT1JUICovCiAKLSAgICAvKiBVc2VUYWdnZWRTdGF0dXMgaXMgb25seSB2YWxpZCBmb3IgNTcwMSBhbmQgbGF0ZXIuICovCi0gICAgaWYgKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkKLSAgICB7Ci0JcERldmljZS0+VXNlVGFnZ2VkU3RhdHVzID0gRkFMU0U7CisJLyogVXNlVGFnZ2VkU3RhdHVzIGlzIG9ubHkgdmFsaWQgZm9yIDU3MDEgYW5kIGxhdGVyLiAqLworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCXBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IEZBTFNFOwogCi0JcERldmljZS0+Q29hbGVzY2VNb2RlID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlwRGV2aWNlLT5Db2FsZXNjZU1vZGUgPSBIT1NUX0NPQUxFU0NFX0NMRUFSX1RJQ0tTX09OX1JYX0JEX0VWRU5UIHwKLQkgICAgSE9TVF9DT0FMRVNDRV9DTEVBUl9USUNLU19PTl9UWF9CRF9FVkVOVDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHN0YXR1cyBibG9jayBzaXplLiAqLwotICAgIGlmKFQzX0NISVBfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQ0hJUF9SRVZfNTcwMF9BWCAmJgotCVQzX0NISVBfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQ0hJUF9SRVZfNTcwMF9CWCkKLSAgICB7Ci0JcERldmljZS0+Q29hbGVzY2VNb2RlIHw9IEhPU1RfQ09BTEVTQ0VfMzJfQllURV9TVEFUVVNfTU9ERTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0aGUgRFVSSU5HX0lOVCBjb2FsZXNjaW5nIHRpY2tzIHBhcmFtZXRlcnMuICovCi0gICAgaWYocERldmljZS0+VXNlVGFnZ2VkU3RhdHVzKQotICAgIHsKLQlpZihwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKLQl7Ci0JICAgIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0KLQkJREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTX0RVUklOR19JTlQ7CisJCXBEZXZpY2UtPkNvYWxlc2NlTW9kZSA9IDA7CisJfSBlbHNlIHsKKwkJcERldmljZS0+Q29hbGVzY2VNb2RlID0KKwkJICAgIEhPU1RfQ09BTEVTQ0VfQ0xFQVJfVElDS1NfT05fUlhfQkRfRVZFTlQgfAorCQkgICAgSE9TVF9DT0FMRVNDRV9DTEVBUl9USUNLU19PTl9UWF9CRF9FVkVOVDsKIAl9CiAKLQlpZihwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKLQl7Ci0JICAgIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0KLQkJREVGQVVMVF9UWF9DT0FMRVNDSU5HX1RJQ0tTX0RVUklOR19JTlQ7CisJLyogU2V0IHRoZSBzdGF0dXMgYmxvY2sgc2l6ZS4gKi8KKwlpZiAoVDNfQ0hJUF9SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQ0hJUF9SRVZfNTcwMF9BWCAmJgorCSAgICBUM19DSElQX1JFViAocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19DSElQX1JFVl81NzAwX0JYKSB7CisJCXBEZXZpY2UtPkNvYWxlc2NlTW9kZSB8PSBIT1NUX0NPQUxFU0NFXzMyX0JZVEVfU1RBVFVTX01PREU7CiAJfQogCi0JaWYocERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpCi0JewotCSAgICBwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9Ci0JCURFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVNfRFVSSU5HX0lOVDsKLQl9CisJLyogQ2hlY2sgdGhlIERVUklOR19JTlQgY29hbGVzY2luZyB0aWNrcyBwYXJhbWV0ZXJzLiAqLworCWlmIChwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMpIHsKKwkJaWYgKHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKSB7CisJCQlwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9CisJCQkgICAgREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTX0RVUklOR19JTlQ7CisJCX0KIAotCWlmKHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKQotCXsKLQkgICAgcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPQotCQlERUZBVUxUX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTX0RVUklOR19JTlQ7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWlmKHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKQotCXsKLQkgICAgcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOwotCX0KKwkJaWYgKHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKSB7CisJCQlwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9CisJCQkgICAgREVGQVVMVF9UWF9DT0FMRVNDSU5HX1RJQ0tTX0RVUklOR19JTlQ7CisJCX0KIAotCWlmKHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKQotCXsKLQkgICAgcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOwotCX0KKwkJaWYgKHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKSB7CisJCQlwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9CisJCQkgICAgREVGQVVMVF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FU19EVVJJTkdfSU5UOworCQl9CiAKLQlpZihwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKLQl7Ci0JICAgIHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gMDsKLQl9CisJCWlmIChwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkgeworCQkJcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPQorCQkJICAgIERFRkFVTFRfVFhfTUFYX0NPQUxFU0NFRF9GUkFNRVNfRFVSSU5HX0lOVDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkgeworCQkJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOworCQl9CiAKLQlpZihwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKLQl7Ci0JICAgIHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gMDsKKwkJaWYgKHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKSB7CisJCQlwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9IDA7CisJCX0KKworCQlpZiAocERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpIHsKKwkJCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gMDsKKwkJfQorCisJCWlmIChwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkgeworCQkJcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPSAwOworCQl9CiAJfQotICAgIH0KIAogI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKLSAgICBpZihwRGV2aWNlLT5SeE10dSA8PSAoTUFYX1NURF9SQ1ZfQlVGRkVSX1NJWkUgLSA4IC8qIENSQyAqLykpCi0gICAgewotCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gMDsKLQlpZihwRGV2aWNlLT5SeE10dSA8PSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDKQotCXsKLQkgICAgcERldmljZS0+UnhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZSA9IChwRGV2aWNlLT5SeE10dSArIDggLyogQ1JDICsgVkxBTiAqLyArCi0JICAgIENPTU1PTl9DQUNIRV9MSU5FX1NJWkUtMSkgJiB+Q09NTU9OX0NBQ0hFX0xJTkVfTUFTSzsKKwlpZiAocERldmljZS0+UnhNdHUgPD0gKE1BWF9TVERfUkNWX0JVRkZFUl9TSVpFIC0gOCAvKiBDUkMgKi8gKSkgeworCQlwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCA9IDA7CisJCWlmIChwRGV2aWNlLT5SeE10dSA8PSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDKSB7CisJCQlwRGV2aWNlLT5SeE10dSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkM7CisJCX0KKwl9IGVsc2UgeworCQlwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZSA9CisJCSAgICAocERldmljZS0+UnhNdHUgKyA4IC8qIENSQyArIFZMQU4gKi8gICsKKwkJICAgICBDT01NT05fQ0FDSEVfTElORV9TSVpFIC0gMSkgJiB+Q09NTU9OX0NBQ0hFX0xJTkVfTUFTSzsKIAotCWlmKHBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplID4gTUFYX0pVTUJPX1JDVl9CVUZGRVJfU0laRSkKLQl7Ci0JICAgIHBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplID0gREVGQVVMVF9KVU1CT19SQ1ZfQlVGRkVSX1NJWkU7Ci0JICAgIHBEZXZpY2UtPlJ4TXR1ID0gcERldmljZS0+UnhKdW1ib0J1ZmZlclNpemUgLSA4IC8qIENSQyArIFZMQU4gKi87Ci0JfQotCXBEZXZpY2UtPlR4TXR1ID0gcERldmljZS0+UnhNdHU7CisJCWlmIChwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZSA+IE1BWF9KVU1CT19SQ1ZfQlVGRkVSX1NJWkUpIHsKKwkJCXBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplID0KKwkJCSAgICBERUZBVUxUX0pVTUJPX1JDVl9CVUZGRVJfU0laRTsKKwkJCXBEZXZpY2UtPlJ4TXR1ID0KKwkJCSAgICBwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZSAtIDggLyogQ1JDICsgVkxBTiAqLyA7CisJCX0KKwkJcERldmljZS0+VHhNdHUgPSBwRGV2aWNlLT5SeE10dTsKIAotICAgIH0KKwl9CiAjZWxzZQotICAgIHBEZXZpY2UtPlJ4TXR1ID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQzsKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisJcERldmljZS0+UnhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KIAotICAgIHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudCA9CisJcERldmljZS0+UnhQYWNrZXREZXNjQ250ID0KICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0JcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgKwotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KLQlwRGV2aWNlLT5SeFN0ZERlc2NDbnQ7CisJICAgIHBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ICsKKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisJICAgIHBEZXZpY2UtPlJ4U3RkRGVzY0NudDsKIAotICAgIGlmKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQykKLSAgICB7Ci0JcERldmljZS0+VHhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOwotICAgIH0KLQotICAgIGlmKHBEZXZpY2UtPlR4TXR1ID4gTUFYX0pVTUJPX1RYX0JVRkZFUl9TSVpFKQotICAgIHsKLQlwRGV2aWNlLT5UeE10dSA9IE1BWF9KVU1CT19UWF9CVUZGRVJfU0laRTsKLSAgICB9Ci0KLSAgICAvKiBDb25maWd1cmUgdGhlIHByb3BlciB3YXlzIHRvIGdldCBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCi0gICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUTykKLSAgICB7Ci0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQotCXsKLQkgICAgcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQ7CisJaWYgKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQykgeworCQlwRGV2aWNlLT5UeE10dSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkM7CiAJfQotCWVsc2UKLQl7Ci0JICAgIHBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfTElOS19SRUFEWTsKLQl9Ci0gICAgfQotICAgIGVsc2UgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQotICAgIHsKLQkvKiBBdXRvLXBvbGxpbmcgZG9lcyBub3Qgd29yayBvbiA1NzAwX0FYIGFuZCA1NzAwX0JYLiAqLwotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkKLQl7Ci0JICAgIHBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUOwotCX0KLSAgICB9CiAKLSAgICAvKiBEZXRlcm1pbmUgdGhlIG1ldGhvZCB0byBnZXQgbGluayBjaGFuZ2Ugc3RhdHVzLiAqLwotICAgIGlmKHBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9PSBUM19MSU5LX0NITkdfTU9ERV9BVVRPKQotICAgIHsKLQkvKiBUaGUgbGluayBzdGF0dXMgYml0IGluIHRoZSBzdGF0dXMgYmxvY2sgZG9lcyBub3Qgd29yayBvbiA1NzAwX0FYICovCi0JLyogYW5kIDU3MDBfQlggY2hpcHMuICovCi0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQotCXsKLQkgICAgcERldmljZS0+TGlua0NobmdNb2RlID0gVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19SRUc7CisJaWYgKHBEZXZpY2UtPlR4TXR1ID4gTUFYX0pVTUJPX1RYX0JVRkZFUl9TSVpFKSB7CisJCXBEZXZpY2UtPlR4TXR1ID0gTUFYX0pVTUJPX1RYX0JVRkZFUl9TSVpFOwogCX0KLQllbHNlCi0JewotCSAgICBwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPSBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX0JMT0NLOwotCX0KLSAgICB9CiAKLSAgICBpZihwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQgfHwKLQlUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCi0gICAgewotCXBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9IFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHOwotICAgIH0KLQotICAgIC8qIENvbmZpZ3VyZSBQSFkgbGVkIG1vZGUuICovCi0gICAgaWYocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9BVVRPKQotICAgIHsKLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKLQkgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQotCXsKLQkgICAgaWYocERldmljZS0+U3Vic3lzdGVtVmVuZG9ySWQgPT0gVDNfU1ZJRF9ERUxMKQotCSAgICB7Ci0JCXBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9MSU5LMTA7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCXBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9USFJFRV9MSU5LOwotCi0JCWlmKEVlU2lnRm91bmQgJiYgRWVQaHlMZWRNb2RlICE9IExFRF9NT0RFX0FVVE8pCi0JCXsKLQkJICAgIHBEZXZpY2UtPkxlZE1vZGUgPSBFZVBoeUxlZE1vZGU7CisJLyogQ29uZmlndXJlIHRoZSBwcm9wZXIgd2F5cyB0byBnZXQgbGluayBjaGFuZ2UgaW50ZXJydXB0LiAqLworCWlmIChwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPKSB7CisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCQlwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVDsKKwkJfSBlbHNlIHsKKwkJCXBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfTElOS19SRUFEWTsKIAkJfQotCSAgICB9CisJfSBlbHNlIGlmIChwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpIHsKKwkJLyogQXV0by1wb2xsaW5nIGRvZXMgbm90IHdvcmsgb24gNTcwMF9BWCBhbmQgNTcwMF9CWC4gKi8KKwkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKKwkJCXBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUOworCQl9CisJfQogCi0JICAgIC8qIGJ1Zz8gNTcwMSBpbiBMSU5LMTAgbW9kZSBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgd2hlbiAqLwotCSAgICAvKiBQaHlJbnRNb2RlIGlzIExJTktfUkVBRFkuICovCi0JICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMCAmJgotI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKLQkJcERldmljZS0+RW5hYmxlVGJpID09IEZBTFNFICYmCi0jZW5kaWYKLQkJcERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9MSU5LMTApCi0JICAgIHsKLQkJcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQ7CisJLyogRGV0ZXJtaW5lIHRoZSBtZXRob2QgdG8gZ2V0IGxpbmsgY2hhbmdlIHN0YXR1cy4gKi8KKwlpZiAocERldmljZS0+TGlua0NobmdNb2RlID09IFQzX0xJTktfQ0hOR19NT0RFX0FVVE8pIHsKKwkJLyogVGhlIGxpbmsgc3RhdHVzIGJpdCBpbiB0aGUgc3RhdHVzIGJsb2NrIGRvZXMgbm90IHdvcmsgb24gNTcwMF9BWCAqLworCQkvKiBhbmQgNTcwMF9CWCBjaGlwcy4gKi8KKwkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKKwkJCXBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9CisJCQkgICAgVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19SRUc7CisJCX0gZWxzZSB7CisJCQlwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPQorCQkJICAgIFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfQkxPQ0s7CisJCX0KKwl9CisKKwlpZiAocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUIHx8CisJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKIAkJcERldmljZS0+TGlua0NobmdNb2RlID0gVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19SRUc7Ci0JICAgIH0KLQotCSAgICBpZihwRGV2aWNlLT5FbmFibGVUYmkpCi0JICAgIHsKLQkJcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX1RIUkVFX0xJTks7Ci0JICAgIH0KIAl9Ci0JZWxzZQotCXsKLQkgICAgaWYoRWVTaWdGb3VuZCAmJiBFZVBoeUxlZE1vZGUgIT0gTEVEX01PREVfQVVUTykKLQkgICAgewotCQlwRGV2aWNlLT5MZWRNb2RlID0gRWVQaHlMZWRNb2RlOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlwRGV2aWNlLT5MZWRNb2RlID0gTEVEX01PREVfT1BFTl9EUkFJTjsKLQkgICAgfQorCisJLyogQ29uZmlndXJlIFBIWSBsZWQgbW9kZS4gKi8KKwlpZiAocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9BVVRPKSB7CisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCQlpZiAocERldmljZS0+U3Vic3lzdGVtVmVuZG9ySWQgPT0gVDNfU1ZJRF9ERUxMKSB7CisJCQkJcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX0xJTksxMDsKKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX1RIUkVFX0xJTks7CisKKwkJCQlpZiAoRWVTaWdGb3VuZCAmJiBFZVBoeUxlZE1vZGUgIT0gTEVEX01PREVfQVVUTykgeworCQkJCQlwRGV2aWNlLT5MZWRNb2RlID0gRWVQaHlMZWRNb2RlOworCQkJCX0KKwkJCX0KKworCQkJLyogYnVnPyA1NzAxIGluIExJTksxMCBtb2RlIGRvZXMgbm90IHNlZW0gdG8gd29yayB3aGVuICovCisJCQkvKiBQaHlJbnRNb2RlIGlzIExJTktfUkVBRFkuICovCisJCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMAorCQkJICAgICYmCisjaWYgSU5DTFVERV9UQklfU1VQUE9SVAorCQkJICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9PSBGQUxTRSAmJgorI2VuZGlmCisJCQkgICAgcERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9MSU5LMTApIHsKKwkJCQlwRGV2aWNlLT5QaHlJbnRNb2RlID0KKwkJCQkgICAgVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVDsKKwkJCQlwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPQorCQkJCSAgICBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX1JFRzsKKwkJCX0KKworCQkJaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkgeworCQkJCXBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9USFJFRV9MSU5LOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKEVlU2lnRm91bmQgJiYgRWVQaHlMZWRNb2RlICE9IExFRF9NT0RFX0FVVE8pIHsKKwkJCQlwRGV2aWNlLT5MZWRNb2RlID0gRWVQaHlMZWRNb2RlOworCQkJfSBlbHNlIHsKKwkJCQlwRGV2aWNlLT5MZWRNb2RlID0gTEVEX01PREVfT1BFTl9EUkFJTjsKKwkJCX0KKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBFbmFibGUgT25lRG1hQXRPbmNlLiAqLwotICAgIGlmKHBEZXZpY2UtPk9uZURtYUF0T25jZSA9PSBCQURfREVGQVVMVF9WQUxVRSkKLSAgICB7Ci0JcERldmljZS0+T25lRG1hQXRPbmNlID0gRkFMU0U7Ci0gICAgfQorCS8qIEVuYWJsZSBPbmVEbWFBdE9uY2UuICovCisJaWYgKHBEZXZpY2UtPk9uZURtYUF0T25jZSA9PSBCQURfREVGQVVMVF9WQUxVRSkgeworCQlwRGV2aWNlLT5PbmVEbWFBdE9uY2UgPSBGQUxTRTsKKwl9CiAKLSAgICBpZiAoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAotCXBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjAgfHwKLQlwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IyKQotICAgIHsKLQlwRGV2aWNlLT5Xb2xTcGVlZCA9IFdPTF9TUEVFRF8xME1COwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXBEZXZpY2UtPldvbFNwZWVkID0gV09MX1NQRUVEXzEwME1COwotICAgIH0KKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0EwIHx8CisJICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjAgfHwKKwkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMikgeworCQlwRGV2aWNlLT5Xb2xTcGVlZCA9IFdPTF9TUEVFRF8xME1COworCX0gZWxzZSB7CisJCXBEZXZpY2UtPldvbFNwZWVkID0gV09MX1NQRUVEXzEwME1COworCX0KIAotICAgIC8qIE9mZmxvYWRpbmdzLiAqLwotICAgIHBEZXZpY2UtPlRhc2tUb09mZmxvYWQgPSBMTV9UQVNLX09GRkxPQURfTk9ORTsKKwkvKiBPZmZsb2FkaW5ncy4gKi8KKwlwRGV2aWNlLT5UYXNrVG9PZmZsb2FkID0gTE1fVEFTS19PRkZMT0FEX05PTkU7CiAKLSAgICAvKiBUdXJuIG9mZiB0YXNrIG9mZmxvYWRpbmcgb24gQXguICovCi0gICAgaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMF9CMCkKLSAgICB7Ci0JcERldmljZS0+VGFza09mZmxvYWRDYXAgJj0gfihMTV9UQVNLX09GRkxPQURfVFhfVENQX0NIRUNLU1VNIHwKLQkgICAgTE1fVEFTS19PRkZMT0FEX1RYX1VEUF9DSEVDS1NVTSk7Ci0gICAgfQotICAgIHBEZXZpY2UtPlBjaVN0YXRlID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSk7Ci0gICAgTE1fUmVhZFZQRChwRGV2aWNlKTsKLSAgICBMTV9SZWFkQm9vdENvZGVWZXJzaW9uKHBEZXZpY2UpOwotICAgIExNX0dldEJ1c1NwZWVkKHBEZXZpY2UpOworCS8qIFR1cm4gb2ZmIHRhc2sgb2ZmbG9hZGluZyBvbiBBeC4gKi8KKwlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMF9CMCkgeworCQlwRGV2aWNlLT5UYXNrT2ZmbG9hZENhcCAmPSB+KExNX1RBU0tfT0ZGTE9BRF9UWF9UQ1BfQ0hFQ0tTVU0gfAorCQkJCQkgICAgIExNX1RBU0tfT0ZGTE9BRF9UWF9VRFBfQ0hFQ0tTVU0pOworCX0KKwlwRGV2aWNlLT5QY2lTdGF0ZSA9IFJFR19SRCAocERldmljZSwgUGNpQ2ZnLlBjaVN0YXRlKTsKKwlMTV9SZWFkVlBEIChwRGV2aWNlKTsKKwlMTV9SZWFkQm9vdENvZGVWZXJzaW9uIChwRGV2aWNlKTsKKwlMTV9HZXRCdXNTcGVlZCAocERldmljZSk7CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19IC8qIExNX0dldEFkYXB0ZXJJbmZvICovCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9HZXRBZGFwdGVySW5mbyAqLwogCi1TVEFUSUMgUExNX0FEQVBURVJfSU5GTwotTE1fR2V0QWRhcHRlckluZm9CeVNzaWQoCi0gICAgTE1fVUlOVDE2IFN2aWQsCi0gICAgTE1fVUlOVDE2IFNzaWQpCitTVEFUSUMgUExNX0FEQVBURVJfSU5GTyBMTV9HZXRBZGFwdGVySW5mb0J5U3NpZCAoTE1fVUlOVDE2IFN2aWQsIExNX1VJTlQxNiBTc2lkKQogewotICAgIHN0YXRpYyBMTV9BREFQVEVSX0lORk8gQWRhcHRlckFycltdID0KLSAgICB7Ci0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwQTYsIFBIWV9CQ001NDAxX1BIWV9JRCwgMH0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTUsIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwVDYsIFBIWV9CQ004MDAyX1BIWV9JRCwgMX0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwQTksIDAsIDEgfSwKLQl7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFUMSwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKLQl7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFUOCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKLQl7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBNywgMCwgMX0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTEwLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAotCXsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUExMiwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKLQl7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDNBeDEsIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAzQXgyLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCXN0YXRpYyBMTV9BREFQVEVSX0lORk8gQWRhcHRlckFycltdID0geworCQl7VDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMEE2LAorCQkgUEhZX0JDTTU0MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBNSwKKwkJIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCisJCXtUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwVDYsCisJCSBQSFlfQkNNODAwMl9QSFlfSUQsIDF9LAorCQl7VDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMEE5LCAwLCAxfSwKKwkJe1QzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFUMSwKKwkJIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCisJCXtUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxVDgsCisJCSBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUE3LCAwLCAxfSwKKwkJe1QzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBMTAsCisJCSBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUExMiwKKwkJIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCisJCXtUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAzQXgxLAorCQkgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDNBeDIsCisJCSBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAogCi0JeyBUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzk5NlQsIFBIWV9CQ001NDAxX1BIWV9JRCwgMCB9LAotCXsgVDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5OTZCVCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwIH0sCi0JeyBUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzk5NlNYLCAwLCAxIH0sCi0JeyBUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzEwMDBULCBQSFlfQkNNNTcwMV9QSFlfSUQsIDAgfSwKLQl7IFQzX1NWSURfM0NPTSwgVDNfU1NJRF8zQ09NXzNDOTQwQlIwMSwgUEhZX0JDTTU3MDFfUEhZX0lELCAwIH0sCisJCXtUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzk5NlQsIFBIWV9CQ001NDAxX1BIWV9JRCwgMH0sCisJCXtUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzk5NkJULCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5OTZTWCwgMCwgMX0sCisJCXtUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzEwMDBULCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5NDBCUjAxLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAogCi0JeyBUM19TVklEX0RFTEwsIFQzX1NTSURfREVMTF9WSVBFUiwgUEhZX0JDTTU0MDFfUEhZX0lELCAwIH0sCi0JeyBUM19TVklEX0RFTEwsIFQzX1NTSURfREVMTF9KQUdVQVIsIFBIWV9CQ001NDAxX1BIWV9JRCwgMCB9LAotCXsgVDNfU1ZJRF9ERUxMLCBUM19TU0lEX0RFTExfTUVSTE9ULCBQSFlfQkNNNTQxMV9QSFlfSUQsIDAgfSwKLQl7IFQzX1NWSURfREVMTCwgVDNfU1NJRF9ERUxMX1NMSU1fTUVSTE9ULCBQSFlfQkNNNTQxMV9QSFlfSUQsIDAgfSwKKwkJe1QzX1NWSURfREVMTCwgVDNfU1NJRF9ERUxMX1ZJUEVSLCBQSFlfQkNNNTQwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9ERUxMLCBUM19TU0lEX0RFTExfSkFHVUFSLCBQSFlfQkNNNTQwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9ERUxMLCBUM19TU0lEX0RFTExfTUVSTE9ULCBQSFlfQkNNNTQxMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9ERUxMLCBUM19TU0lEX0RFTExfU0xJTV9NRVJMT1QsIFBIWV9CQ001NDExX1BIWV9JRCwgMH0sCiAKLQl7IFQzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9CQU5TSEVFLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDAgfSwKLQl7IFQzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9CQU5TSEVFXzIsIFBIWV9CQ001NzAxX1BIWV9JRCwgMCB9LAotCXsgVDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX0NIQU5HRUxJTkcsIDAsIDEgfSwKLQl7IFQzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9OQzc3ODAsIFBIWV9CQ001NzAxX1BIWV9JRCwgMCB9LAotCXsgVDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX05DNzc4MF8yLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDAgfSwKKwkJe1QzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9CQU5TSEVFLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX0JBTlNIRUVfMiwgUEhZX0JDTTU3MDFfUEhZX0lELAorCQkgMH0sCisJCXtUM19TVklEX0NPTVBBUSwgVDNfU1NJRF9DT01QQVFfQ0hBTkdFTElORywgMCwgMX0sCisJCXtUM19TVklEX0NPTVBBUSwgVDNfU1NJRF9DT01QQVFfTkM3NzgwLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX05DNzc4MF8yLCBQSFlfQkNNNTcwMV9QSFlfSUQsCisJCSAwfSwKIAotICAgIH07Ci0gICAgTE1fVUlOVDMyIGo7CisJfTsKKwlMTV9VSU5UMzIgajsKIAotICAgIGZvcihqID0gMDsgaiA8IHNpemVvZihBZGFwdGVyQXJyKS9zaXplb2YoTE1fQURBUFRFUl9JTkZPKTsgaisrKQotICAgIHsKLQlpZihBZGFwdGVyQXJyW2pdLlN2aWQgPT0gU3ZpZCAmJiBBZGFwdGVyQXJyW2pdLlNzaWQgPT0gU3NpZCkKLQl7Ci0JICAgIHJldHVybiAmQWRhcHRlckFycltqXTsKKwlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mIChBZGFwdGVyQXJyKSAvIHNpemVvZiAoTE1fQURBUFRFUl9JTkZPKTsgaisrKSB7CisJCWlmIChBZGFwdGVyQXJyW2pdLlN2aWQgPT0gU3ZpZCAmJiBBZGFwdGVyQXJyW2pdLlNzaWQgPT0gU3NpZCkgeworCQkJcmV0dXJuICZBZGFwdGVyQXJyW2pdOworCQl9CiAJfQotICAgIH0KIAotICAgIHJldHVybiBOVUxMOworCXJldHVybiBOVUxMOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhpcyByb3V0aW5lIHNldHMgdXAgcmVjZWl2ZS90cmFuc21pdCBidWZmZXIgZGVzY3JpcHRpb25zIHF1ZXVlcy4gICAgICAgKi8KQEAgLTE2MzgsMjM3ICsxNDg5LDIyNiBAQAogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9Jbml0aWFsaXplQWRhcHRlcigKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBMTV9Jbml0aWFsaXplQWRhcHRlciAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgTWVtUGh5OwotICAgIFBMTV9VSU5UOCBwTWVtVmlydDsKLSAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7Ci0gICAgTE1fU1RBVFVTIFN0YXR1czsKLSAgICBMTV9VSU5UMzIgU2l6ZTsKLSAgICBMTV9VSU5UMzIgajsKKwlMTV9QSFlTSUNBTF9BRERSRVNTIE1lbVBoeTsKKwlQTE1fVUlOVDggcE1lbVZpcnQ7CisJUExNX1BBQ0tFVCBwUGFja2V0OworCUxNX1NUQVRVUyBTdGF0dXM7CisJTE1fVUlOVDMyIFNpemU7CisJTE1fVUlOVDMyIGo7CiAKLSAgICAvKiBTZXQgcG93ZXIgc3RhdGUgdG8gRDAuICovCi0gICAgTE1fU2V0UG93ZXJTdGF0ZShwRGV2aWNlLCBMTV9QT1dFUl9TVEFURV9EMCk7CisJLyogU2V0IHBvd2VyIHN0YXRlIHRvIEQwLiAqLworCUxNX1NldFBvd2VyU3RhdGUgKHBEZXZpY2UsIExNX1BPV0VSX1NUQVRFX0QwKTsKIAotICAgIC8qIEludGlhbGl6ZSB0aGUgcXVldWVzLiAqLwotICAgIFFRX0luaXRRdWV1ZSgmcERldmljZS0+UnhQYWNrZXRSZWNlaXZlZFEuQ29udGFpbmVyLAotCU1BWF9SWF9QQUNLRVRfREVTQ19DT1VOVCk7Ci0gICAgUVFfSW5pdFF1ZXVlKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwKLQlNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQpOworCS8qIEludGlhbGl6ZSB0aGUgcXVldWVzLiAqLworCVFRX0luaXRRdWV1ZSAoJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lciwKKwkJICAgICAgTUFYX1JYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKKwlRUV9Jbml0UXVldWUgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwKKwkJICAgICAgTUFYX1JYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKIAotICAgIFFRX0luaXRRdWV1ZSgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsTUFYX1RYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKLSAgICBRUV9Jbml0UXVldWUoJnBEZXZpY2UtPlR4UGFja2V0QWN0aXZlUS5Db250YWluZXIsTUFYX1RYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKLSAgICBRUV9Jbml0UXVldWUoJnBEZXZpY2UtPlR4UGFja2V0WG1pdHRlZFEuQ29udGFpbmVyLE1BWF9UWF9QQUNLRVRfREVTQ19DT1VOVCk7CisJUVFfSW5pdFF1ZXVlICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsCisJCSAgICAgIE1BWF9UWF9QQUNLRVRfREVTQ19DT1VOVCk7CisJUVFfSW5pdFF1ZXVlICgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lciwKKwkJICAgICAgTUFYX1RYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKKwlRUV9Jbml0UXVldWUgKCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lciwKKwkJICAgICAgTUFYX1RYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKIAotICAgIC8qIEFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgZm9yOiBzdGF0dXMgYmxvY2ssIHRoZSBidWZmZXJzIGZvciByZWNlaXZlICovCi0gICAgLyogcmluZ3MgLS0gc3RhbmRhcmQsIG1pbmksIGp1bWJvLCBhbmQgcmV0dXJuIHJpbmdzLiAqLwotICAgIFNpemUgPSBUM19TVEFUVVNfQkxPQ0tfU0laRSArIHNpemVvZihUM19TVEFUU19CTE9DSykgKwotCVQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mKFQzX1JDVl9CRCkgKworCS8qIEFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgZm9yOiBzdGF0dXMgYmxvY2ssIHRoZSBidWZmZXJzIGZvciByZWNlaXZlICovCisJLyogcmluZ3MgLS0gc3RhbmRhcmQsIG1pbmksIGp1bWJvLCBhbmQgcmV0dXJuIHJpbmdzLiAqLworCVNpemUgPSBUM19TVEFUVVNfQkxPQ0tfU0laRSArIHNpemVvZiAoVDNfU1RBVFNfQkxPQ0spICsKKwkgICAgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YgKFQzX1JDVl9CRCkgKwogI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKLQlUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mKFQzX1JDVl9CRCkgKwotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KLQlUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpOworCSAgICBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mIChUM19SQ1ZfQkQpICsKKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisJICAgIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mIChUM19SQ1ZfQkQpOwogCi0gICAgLyogTWVtb3J5IGZvciBob3N0IGJhc2VkIFNlbmQgQkQuICovCi0gICAgaWYocERldmljZS0+TmljU2VuZEJkID09IEZBTFNFKQotICAgIHsKLQlTaXplICs9IHNpemVvZihUM19TTkRfQkQpICogVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBibG9jay4gKi8KLSAgICBTdGF0dXMgPSBNTV9BbGxvY2F0ZVNoYXJlZE1lbW9yeShwRGV2aWNlLCBTaXplLCAoUExNX1ZPSUQpICZwTWVtVmlydCwgJk1lbVBoeSwgRkFMU0UpOwotICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLSAgICB7Ci0JcmV0dXJuIFN0YXR1czsKLSAgICB9Ci0KLSAgICAvKiBQcm9ncmFtIERNQSBSZWFkL1dyaXRlICovCi0gICAgaWYgKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX05PVF9QQ0lfWF9CVVMpCi0gICAgewotCXBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPSAweDc2M2YwMDBmOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwNCkKLQl7Ci0JICAgIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPSAweDc2MWYwMDAwOworCS8qIE1lbW9yeSBmb3IgaG9zdCBiYXNlZCBTZW5kIEJELiAqLworCWlmIChwRGV2aWNlLT5OaWNTZW5kQmQgPT0gRkFMU0UpIHsKKwkJU2l6ZSArPSBzaXplb2YgKFQzX1NORF9CRCkgKiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVDsKIAl9Ci0JZWxzZQotCXsKLQkgICAgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCA9IDB4NzYxYjAwMGY7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGJsb2NrLiAqLworCVN0YXR1cyA9CisJICAgIE1NX0FsbG9jYXRlU2hhcmVkTWVtb3J5IChwRGV2aWNlLCBTaXplLCAoUExNX1ZPSUQpICYgcE1lbVZpcnQsCisJCQkJICAgICAmTWVtUGh5LCBGQUxTRSk7CisJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gU3RhdHVzOwogCX0KLQlpZihwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0ExIHx8Ci0JICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDNfQTIpCi0JewotCSAgICBwRGV2aWNlLT5PbmVEbWFBdE9uY2UgPSBUUlVFOworCisJLyogUHJvZ3JhbSBETUEgUmVhZC9Xcml0ZSAqLworCWlmIChwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9OT1RfUENJX1hfQlVTKSB7CisJCXBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPSAweDc2M2YwMDBmOworCX0gZWxzZSB7CisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzA0KSB7CisJCQlwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsID0gMHg3NjFmMDAwMDsKKwkJfSBlbHNlIHsKKwkJCXBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPSAweDc2MWIwMDBmOworCQl9CisJCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0ExIHx8CisJCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0EyKSB7CisJCQlwRGV2aWNlLT5PbmVEbWFBdE9uY2UgPSBUUlVFOworCQl9CiAJfQotICAgIH0KLSAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDMpCi0gICAgewotCXBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgJj0gMHhmZmZmZmZmMDsKLSAgICB9CisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDMpIHsKKwkJcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCAmPSAweGZmZmZmZmYwOworCX0KIAotICAgIGlmKHBEZXZpY2UtPk9uZURtYUF0T25jZSkKLSAgICB7Ci0JcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCB8PSBETUFfQ1RSTF9XUklURV9PTkVfRE1BX0FUX09OQ0U7Ci0gICAgfQotICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuRG1hUmVhZFdyaXRlQ3RybCwgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCk7CisJaWYgKHBEZXZpY2UtPk9uZURtYUF0T25jZSkgeworCQlwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsIHw9IERNQV9DVFJMX1dSSVRFX09ORV9ETUFfQVRfT05DRTsKKwl9CisJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuRG1hUmVhZFdyaXRlQ3RybCwgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCk7CiAKLSAgICBpZiAoTE1fRG1hVGVzdChwRGV2aWNlLCBwTWVtVmlydCwgTWVtUGh5LCAweDQwMCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLSAgICB9CisJaWYgKExNX0RtYVRlc3QgKHBEZXZpY2UsIHBNZW1WaXJ0LCBNZW1QaHksIDB4NDAwKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQogCi0gICAgLyogU3RhdHVzIGJsb2NrLiAqLwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0ID0gKFBUM19TVEFUVVNfQkxPQ0spIHBNZW1WaXJ0OwotICAgIHBEZXZpY2UtPlN0YXR1c0Jsa1BoeSA9IE1lbVBoeTsKLSAgICBwTWVtVmlydCArPSBUM19TVEFUVVNfQkxPQ0tfU0laRTsKLSAgICBMTV9JTkNfUEhZU0lDQUxfQUREUkVTUygmTWVtUGh5LCBUM19TVEFUVVNfQkxPQ0tfU0laRSk7CisJLyogU3RhdHVzIGJsb2NrLiAqLworCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0ID0gKFBUM19TVEFUVVNfQkxPQ0spIHBNZW1WaXJ0OworCXBEZXZpY2UtPlN0YXR1c0Jsa1BoeSA9IE1lbVBoeTsKKwlwTWVtVmlydCArPSBUM19TVEFUVVNfQkxPQ0tfU0laRTsKKwlMTV9JTkNfUEhZU0lDQUxfQUREUkVTUyAoJk1lbVBoeSwgVDNfU1RBVFVTX0JMT0NLX1NJWkUpOwogCi0gICAgLyogU3RhdGlzdGljcyBibG9jay4gKi8KLSAgICBwRGV2aWNlLT5wU3RhdHNCbGtWaXJ0ID0gKFBUM19TVEFUU19CTE9DSykgcE1lbVZpcnQ7Ci0gICAgcERldmljZS0+U3RhdHNCbGtQaHkgPSBNZW1QaHk7Ci0gICAgcE1lbVZpcnQgKz0gc2l6ZW9mKFQzX1NUQVRTX0JMT0NLKTsKLSAgICBMTV9JTkNfUEhZU0lDQUxfQUREUkVTUygmTWVtUGh5LCBzaXplb2YoVDNfU1RBVFNfQkxPQ0spKTsKKwkvKiBTdGF0aXN0aWNzIGJsb2NrLiAqLworCXBEZXZpY2UtPnBTdGF0c0Jsa1ZpcnQgPSAoUFQzX1NUQVRTX0JMT0NLKSBwTWVtVmlydDsKKwlwRGV2aWNlLT5TdGF0c0Jsa1BoeSA9IE1lbVBoeTsKKwlwTWVtVmlydCArPSBzaXplb2YgKFQzX1NUQVRTX0JMT0NLKTsKKwlMTV9JTkNfUEhZU0lDQUxfQUREUkVTUyAoJk1lbVBoeSwgc2l6ZW9mIChUM19TVEFUU19CTE9DSykpOwogCi0gICAgLyogUmVjZWl2ZSBzdGFuZGFyZCBCRCBidWZmZXIuICovCi0gICAgcERldmljZS0+cFJ4U3RkQmRWaXJ0ID0gKFBUM19SQ1ZfQkQpIHBNZW1WaXJ0OwotICAgIHBEZXZpY2UtPlJ4U3RkQmRQaHkgPSBNZW1QaHk7CisJLyogUmVjZWl2ZSBzdGFuZGFyZCBCRCBidWZmZXIuICovCisJcERldmljZS0+cFJ4U3RkQmRWaXJ0ID0gKFBUM19SQ1ZfQkQpIHBNZW1WaXJ0OworCXBEZXZpY2UtPlJ4U3RkQmRQaHkgPSBNZW1QaHk7CiAKLSAgICBwTWVtVmlydCArPSBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpOwotICAgIExNX0lOQ19QSFlTSUNBTF9BRERSRVNTKCZNZW1QaHksCi0JVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKSk7CisJcE1lbVZpcnQgKz0gVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YgKFQzX1JDVl9CRCk7CisJTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MgKCZNZW1QaHksCisJCQkJIFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UICoKKwkJCQkgc2l6ZW9mIChUM19SQ1ZfQkQpKTsKIAogI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKLSAgICAvKiBSZWNlaXZlIGp1bWJvIEJEIGJ1ZmZlci4gKi8KLSAgICBwRGV2aWNlLT5wUnhKdW1ib0JkVmlydCA9IChQVDNfUkNWX0JEKSBwTWVtVmlydDsKLSAgICBwRGV2aWNlLT5SeEp1bWJvQmRQaHkgPSBNZW1QaHk7CisJLyogUmVjZWl2ZSBqdW1ibyBCRCBidWZmZXIuICovCisJcERldmljZS0+cFJ4SnVtYm9CZFZpcnQgPSAoUFQzX1JDVl9CRCkgcE1lbVZpcnQ7CisJcERldmljZS0+UnhKdW1ib0JkUGh5ID0gTWVtUGh5OwogCi0gICAgcE1lbVZpcnQgKz0gVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpOwotICAgIExNX0lOQ19QSFlTSUNBTF9BRERSRVNTKCZNZW1QaHksCi0JVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpKTsKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisJcE1lbVZpcnQgKz0gVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZiAoVDNfUkNWX0JEKTsKKwlMTV9JTkNfUEhZU0lDQUxfQUREUkVTUyAoJk1lbVBoeSwKKwkJCQkgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqCisJCQkJIHNpemVvZiAoVDNfUkNWX0JEKSk7CisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLwogCi0gICAgLyogUmVjZWl2ZSByZXR1cm4gQkQgYnVmZmVyLiAqLwotICAgIHBEZXZpY2UtPnBSY3ZSZXRCZFZpcnQgPSAoUFQzX1JDVl9CRCkgcE1lbVZpcnQ7Ci0gICAgcERldmljZS0+UmN2UmV0QmRQaHkgPSBNZW1QaHk7CisJLyogUmVjZWl2ZSByZXR1cm4gQkQgYnVmZmVyLiAqLworCXBEZXZpY2UtPnBSY3ZSZXRCZFZpcnQgPSAoUFQzX1JDVl9CRCkgcE1lbVZpcnQ7CisJcERldmljZS0+UmN2UmV0QmRQaHkgPSBNZW1QaHk7CiAKLSAgICBwTWVtVmlydCArPSBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpOwotICAgIExNX0lOQ19QSFlTSUNBTF9BRERSRVNTKCZNZW1QaHksCi0JVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKSk7CisJcE1lbVZpcnQgKz0gVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YgKFQzX1JDVl9CRCk7CisJTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MgKCZNZW1QaHksCisJCQkJIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UICoKKwkJCQkgc2l6ZW9mIChUM19SQ1ZfQkQpKTsKIAotICAgIC8qIFNldCB1cCBTZW5kIEJELiAqLwotICAgIGlmKHBEZXZpY2UtPk5pY1NlbmRCZCA9PSBGQUxTRSkKLSAgICB7Ci0JcERldmljZS0+cFNlbmRCZFZpcnQgPSAoUFQzX1NORF9CRCkgcE1lbVZpcnQ7Ci0JcERldmljZS0+U2VuZEJkUGh5ID0gTWVtUGh5OworCS8qIFNldCB1cCBTZW5kIEJELiAqLworCWlmIChwRGV2aWNlLT5OaWNTZW5kQmQgPT0gRkFMU0UpIHsKKwkJcERldmljZS0+cFNlbmRCZFZpcnQgPSAoUFQzX1NORF9CRCkgcE1lbVZpcnQ7CisJCXBEZXZpY2UtPlNlbmRCZFBoeSA9IE1lbVBoeTsKIAotCXBNZW1WaXJ0ICs9IHNpemVvZihUM19TTkRfQkQpICogVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7Ci0JTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MoJk1lbVBoeSwKLQkgICAgc2l6ZW9mKFQzX1NORF9CRCkgKiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JcERldmljZS0+cFNlbmRCZFZpcnQgPSAoUFQzX1NORF9CRCkKLQkgICAgcERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uRmlyc3QzMmsuQnVmZmVyRGVzYzsKLQlwRGV2aWNlLT5TZW5kQmRQaHkuSGlnaCA9IDA7Ci0JcERldmljZS0+U2VuZEJkUGh5LkxvdyA9IFQzX05JQ19TTkRfQlVGRkVSX0RFU0NfQUREUjsKLSAgICB9CisJCXBNZW1WaXJ0ICs9IHNpemVvZiAoVDNfU05EX0JEKSAqIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UOworCQlMTV9JTkNfUEhZU0lDQUxfQUREUkVTUyAoJk1lbVBoeSwKKwkJCQkJIHNpemVvZiAoVDNfU05EX0JEKSAqCisJCQkJCSBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVCk7CisJfSBlbHNlIHsKKwkJcERldmljZS0+cFNlbmRCZFZpcnQgPSAoUFQzX1NORF9CRCkKKwkJICAgIHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLkZpcnN0MzJrLkJ1ZmZlckRlc2M7CisJCXBEZXZpY2UtPlNlbmRCZFBoeS5IaWdoID0gMDsKKwkJcERldmljZS0+U2VuZEJkUGh5LkxvdyA9IFQzX05JQ19TTkRfQlVGRkVSX0RFU0NfQUREUjsKKwl9CiAKLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHBhY2tldCBkZXNjcmlwdG9ycy4gKi8KLSAgICBTaXplID0gKHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudCArCi0JcERldmljZS0+VHhQYWNrZXREZXNjQ250KSAqIE1NX1BBQ0tFVF9ERVNDX1NJWkU7Ci0gICAgU3RhdHVzID0gTU1fQWxsb2NhdGVNZW1vcnkocERldmljZSwgU2l6ZSwgKFBMTV9WT0lEICopICZwUGFja2V0KTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQotICAgIHBEZXZpY2UtPnBQYWNrZXREZXNjQmFzZSA9IChQTE1fVk9JRCkgcFBhY2tldDsKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHBhY2tldCBkZXNjcmlwdG9ycy4gKi8KKwlTaXplID0gKHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudCArCisJCXBEZXZpY2UtPlR4UGFja2V0RGVzY0NudCkgKiBNTV9QQUNLRVRfREVTQ19TSVpFOworCVN0YXR1cyA9IE1NX0FsbG9jYXRlTWVtb3J5IChwRGV2aWNlLCBTaXplLCAoUExNX1ZPSUQgKikgJiBwUGFja2V0KTsKKwlpZiAoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldHVybiBTdGF0dXM7CisJfQorCXBEZXZpY2UtPnBQYWNrZXREZXNjQmFzZSA9IChQTE1fVk9JRCkgcFBhY2tldDsKIAotICAgIC8qIENyZWF0ZSB0cmFuc21pdCBwYWNrZXQgZGVzY3JpcHRvcnMgZnJvbSB0aGUgbWVtb3J5IGJsb2NrIGFuZCBhZGQgdGhlbSAqLwotICAgIC8qIHRvIHRoZSBUeFBhY2tldEZyZWVRIGZvciBlYWNoIHNlbmQgcmluZy4gKi8KLSAgICBmb3IoaiA9IDA7IGogPCBwRGV2aWNlLT5UeFBhY2tldERlc2NDbnQ7IGorKykKLSAgICB7Ci0JLyogUmluZyBpbmRleC4gKi8KLQlwUGFja2V0LT5GbGFncyA9IDA7CisJLyogQ3JlYXRlIHRyYW5zbWl0IHBhY2tldCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBtZW1vcnkgYmxvY2sgYW5kIGFkZCB0aGVtICovCisJLyogdG8gdGhlIFR4UGFja2V0RnJlZVEgZm9yIGVhY2ggc2VuZCByaW5nLiAqLworCWZvciAoaiA9IDA7IGogPCBwRGV2aWNlLT5UeFBhY2tldERlc2NDbnQ7IGorKykgeworCQkvKiBSaW5nIGluZGV4LiAqLworCQlwUGFja2V0LT5GbGFncyA9IDA7CiAKLQkvKiBRdWV1ZSB0aGUgZGVzY3JpcHRvciBpbiB0aGUgVHhQYWNrZXRGcmVlUSBvZiB0aGUgJ2snIHJpbmcuICovCi0JUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJLyogUXVldWUgdGhlIGRlc2NyaXB0b3IgaW4gdGhlIFR4UGFja2V0RnJlZVEgb2YgdGhlICdrJyByaW5nLiAqLworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLwotCS8qIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbmNsdWRpbmcgdGhlICovCi0JLyogb3Mtc3BlY2lmaWMgZXh0ZW5zaW9ucyBpbiB0aGUgVU1fUEFDS0VUIHN0cnVjdHVyZS4gKi8KLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpICgoUExNX1VJTlQ4KSBwUGFja2V0ICsgTU1fUEFDS0VUX0RFU0NfU0laRSk7Ci0gICAgfSAvKiBmb3Ioai4uICovCisJCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLworCQkvKiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW5jbHVkaW5nIHRoZSAqLworCQkvKiBvcy1zcGVjaWZpYyBleHRlbnNpb25zIGluIHRoZSBVTV9QQUNLRVQgc3RydWN0dXJlLiAqLworCQlwUGFja2V0ID0KKwkJICAgIChQTE1fUEFDS0VUKSAoKFBMTV9VSU5UOCkgcFBhY2tldCArIE1NX1BBQ0tFVF9ERVNDX1NJWkUpOworCX0JCQkvKiBmb3Ioai4uICovCiAKLSAgICAvKiBDcmVhdGUgcmVjZWl2ZSBwYWNrZXQgZGVzY3JpcHRvcnMgZnJvbSB0aGUgbWVtb3J5IGJsb2NrIGFuZCBhZGQgdGhlbSAqLwotICAgIC8qIHRvIHRoZSBSeFBhY2tldEZyZWVRLiAgQ3JlYXRlIHRoZSBTdGFuZGFyZCBwYWNrZXQgZGVzY3JpcHRvcnMuICovCi0gICAgZm9yKGogPSAwOyBqIDwgcERldmljZS0+UnhTdGREZXNjQ250OyBqKyspCi0gICAgewotCS8qIFJlY2VpdmUgcHJvZHVjZXIgcmluZy4gKi8KLQlwUGFja2V0LT51LlJ4LlJjdlByb2RSaW5nID0gVDNfU1REX1JDVl9QUk9EX1JJTkc7CisJLyogQ3JlYXRlIHJlY2VpdmUgcGFja2V0IGRlc2NyaXB0b3JzIGZyb20gdGhlIG1lbW9yeSBibG9jayBhbmQgYWRkIHRoZW0gKi8KKwkvKiB0byB0aGUgUnhQYWNrZXRGcmVlUS4gIENyZWF0ZSB0aGUgU3RhbmRhcmQgcGFja2V0IGRlc2NyaXB0b3JzLiAqLworCWZvciAoaiA9IDA7IGogPCBwRGV2aWNlLT5SeFN0ZERlc2NDbnQ7IGorKykgeworCQkvKiBSZWNlaXZlIHByb2R1Y2VyIHJpbmcuICovCisJCXBQYWNrZXQtPnUuUnguUmN2UHJvZFJpbmcgPSBUM19TVERfUkNWX1BST0RfUklORzsKIAotCS8qIFJlY2VpdmUgYnVmZmVyIHNpemUuICovCi0JcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclNpemUgPSBNQVhfU1REX1JDVl9CVUZGRVJfU0laRTsKKwkJLyogUmVjZWl2ZSBidWZmZXIgc2l6ZS4gKi8KKwkJcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclNpemUgPSBNQVhfU1REX1JDVl9CVUZGRVJfU0laRTsKIAotCS8qIEFkZCB0aGUgZGVzY3JpcHRvciB0byBSeFBhY2tldEZyZWVRLiAqLwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCS8qIEFkZCB0aGUgZGVzY3JpcHRvciB0byBSeFBhY2tldEZyZWVRLiAqLworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLwotCS8qIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbmNsdWRpbmcgdGhlICovCi0JLyogb3Mtc3BlY2lmaWMgZXh0ZW5zaW9ucyBpbiB0aGUgVU1fUEFDS0VUIHN0cnVjdHVyZS4gKi8KLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpICgoUExNX1VJTlQ4KSBwUGFja2V0ICsgTU1fUEFDS0VUX0RFU0NfU0laRSk7Ci0gICAgfSAvKiBmb3IgKi8KKwkJLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IuICBNTV9QQUNLRVRfREVTQ19TSVpFICovCisJCS8qIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbmNsdWRpbmcgdGhlICovCisJCS8qIG9zLXNwZWNpZmljIGV4dGVuc2lvbnMgaW4gdGhlIFVNX1BBQ0tFVCBzdHJ1Y3R1cmUuICovCisJCXBQYWNrZXQgPQorCQkgICAgKFBMTV9QQUNLRVQpICgoUExNX1VJTlQ4KSBwUGFja2V0ICsgTU1fUEFDS0VUX0RFU0NfU0laRSk7CisJfQkJCS8qIGZvciAqLwogCiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIC8qIENyZWF0ZSB0aGUgSnVtYm8gcGFja2V0IGRlc2NyaXB0b3JzLiAqLwotICAgIGZvcihqID0gMDsgaiA8IHBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250OyBqKyspCi0gICAgewotCS8qIFJlY2VpdmUgcHJvZHVjZXIgcmluZy4gKi8KLQlwUGFja2V0LT51LlJ4LlJjdlByb2RSaW5nID0gVDNfSlVNQk9fUkNWX1BST0RfUklORzsKKwkvKiBDcmVhdGUgdGhlIEp1bWJvIHBhY2tldCBkZXNjcmlwdG9ycy4gKi8KKwlmb3IgKGogPSAwOyBqIDwgcERldmljZS0+UnhKdW1ib0Rlc2NDbnQ7IGorKykgeworCQkvKiBSZWNlaXZlIHByb2R1Y2VyIHJpbmcuICovCisJCXBQYWNrZXQtPnUuUnguUmN2UHJvZFJpbmcgPSBUM19KVU1CT19SQ1ZfUFJPRF9SSU5HOwogCi0JLyogUmVjZWl2ZSBidWZmZXIgc2l6ZS4gKi8KLQlwUGFja2V0LT51LlJ4LlJ4QnVmZmVyU2l6ZSA9IHBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplOworCQkvKiBSZWNlaXZlIGJ1ZmZlciBzaXplLiAqLworCQlwUGFja2V0LT51LlJ4LlJ4QnVmZmVyU2l6ZSA9IHBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplOwogCi0JLyogQWRkIHRoZSBkZXNjcmlwdG9yIHRvIFJ4UGFja2V0RnJlZVEuICovCi0JUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJLyogQWRkIHRoZSBkZXNjcmlwdG9yIHRvIFJ4UGFja2V0RnJlZVEuICovCisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwogCi0JLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IuICBNTV9QQUNLRVRfREVTQ19TSVpFICovCi0JLyogaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHBhY2tldCBkZXNjcmlwdG9yIGluY2x1ZGluZyB0aGUgKi8KLQkvKiBvcy1zcGVjaWZpYyBleHRlbnNpb25zIGluIHRoZSBVTV9QQUNLRVQgc3RydWN0dXJlLiAqLwotCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgKChQTE1fVUlOVDgpIHBQYWNrZXQgKyBNTV9QQUNLRVRfREVTQ19TSVpFKTsKLSAgICB9IC8qIGZvciAqLwotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKwkJLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IuICBNTV9QQUNLRVRfREVTQ19TSVpFICovCisJCS8qIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbmNsdWRpbmcgdGhlICovCisJCS8qIG9zLXNwZWNpZmljIGV4dGVuc2lvbnMgaW4gdGhlIFVNX1BBQ0tFVCBzdHJ1Y3R1cmUuICovCisJCXBQYWNrZXQgPQorCQkgICAgKFBMTV9QQUNLRVQpICgoUExNX1VJTlQ4KSBwUGFja2V0ICsgTU1fUEFDS0VUX0RFU0NfU0laRSk7CisJfQkJCS8qIGZvciAqLworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KIAotICAgIC8qIEluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCBkZXNjcmlwdG9ycy4gKi8KLSAgICBTdGF0dXMgPSBNTV9Jbml0aWFsaXplVW1QYWNrZXRzKHBEZXZpY2UpOwotICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLSAgICB7Ci0JcmV0dXJuIFN0YXR1czsKLSAgICB9IC8qIGlmICovCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3JzLiAqLworCVN0YXR1cyA9IE1NX0luaXRpYWxpemVVbVBhY2tldHMgKHBEZXZpY2UpOworCWlmIChTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIFN0YXR1czsKKwl9CiAKLSAgICAvKiBEZWZhdWx0IHJlY2VpdmUgbWFzay4gKi8KLSAgICBwRGV2aWNlLT5SZWNlaXZlTWFzayA9IExNX0FDQ0VQVF9NVUxUSUNBU1QgfCBMTV9BQ0NFUFRfQlJPQURDQVNUIHwKLQlMTV9BQ0NFUFRfVU5JQ0FTVDsKKwkvKiBpZiAqLworCS8qIERlZmF1bHQgcmVjZWl2ZSBtYXNrLiAqLworCXBEZXZpY2UtPlJlY2VpdmVNYXNrID0gTE1fQUNDRVBUX01VTFRJQ0FTVCB8IExNX0FDQ0VQVF9CUk9BRENBU1QgfAorCSAgICBMTV9BQ0NFUFRfVU5JQ0FTVDsKIAotICAgIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gdGhlIGZpcnN0IDMyayBtZW1vcnkgd2luZG93IG9yIE5pY1NlbmRCZC4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1lbVdpbmRvd0Jhc2VBZGRyLCAwKTsKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIGluIHRoZSBmaXJzdCAzMmsgbWVtb3J5IHdpbmRvdyBvciBOaWNTZW5kQmQuICovCisJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuTWVtV2luZG93QmFzZUFkZHIsIDApOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuICovCi0gICAgU3RhdHVzID0gTE1fUmVzZXRBZGFwdGVyKHBEZXZpY2UpOwotICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLSAgICB7Ci0JcmV0dXJuIFN0YXR1czsKLSAgICB9CisJLyogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuICovCisJU3RhdHVzID0gTE1fUmVzZXRBZGFwdGVyIChwRGV2aWNlKTsKKwlpZiAoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldHVybiBTdGF0dXM7CisJfQogCi0gICAgLyogV2UgYXJlIGRvbmUgd2l0aCBpbml0aWFsaXphdGlvbi4gKi8KLSAgICBwRGV2aWNlLT5Jbml0RG9uZSA9IFRSVUU7CisJLyogV2UgYXJlIGRvbmUgd2l0aCBpbml0aWFsaXphdGlvbi4gKi8KKwlwRGV2aWNlLT5Jbml0RG9uZSA9IFRSVUU7CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19IC8qIExNX0luaXRpYWxpemVBZGFwdGVyICovCi0KKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX0luaXRpYWxpemVBZGFwdGVyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTg3OCw0MTQgKzE3MTgsNDA4IEBACiAvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExNX1NUQVRVUwotTE1fQ250cmxCbG9jaygKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLUxNX1VJTlQzMiBtYXNrLExNX1VJTlQzMiBjbnRybCkKK0xNX0NudHJsQmxvY2sgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIG1hc2ssIExNX1VJTlQzMiBjbnRybCkKIHsKLSAgICBMTV9VSU5UMzIgaixpLGRhdGE7Ci0gICAgTE1fVUlOVDMyIE1heFdhaXRDbnQ7CisJTE1fVUlOVDMyIGosIGksIGRhdGE7CisJTE1fVUlOVDMyIE1heFdhaXRDbnQ7CiAKLSAgICBNYXhXYWl0Q250ID0gMjsKLSAgICBqID0gMDsKKwlNYXhXYWl0Q250ID0gMjsKKwlqID0gMDsKIAotICAgIGZvcihpID0gMCA7IGkgPCAzMjsgaSsrKQotICAgIHsKLQlpZighKG1hc2sgJiAoMSA8PCBpKSkpCi0JICAgIGNvbnRpbnVlOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmICghKG1hc2sgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKIAotCXN3aXRjaCAoMSA8PCBpKQotCXsKLQkgICAgY2FzZSBUM19CTE9DS19ETUFfUkQ6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgRG1hUmVhZC5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gfkRNQV9SRUFEX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIERtYVJlYWQuTW9kZSwgZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBEbWFSZWFkLk1vZGUpICYgRE1BX1JFQURfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIERtYVJlYWQuTW9kZSwgZGF0YSB8IERNQV9SRUFEX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCXN3aXRjaCAoMSA8PCBpKSB7CisJCWNhc2UgVDNfQkxPQ0tfRE1BX1JEOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgRG1hUmVhZC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+RE1BX1JFQURfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIERtYVJlYWQuTW9kZSkgJgorCQkJCQkgICAgIERNQV9SRUFEX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBEbWFSZWFkLk1vZGUsCisJCQkJCWRhdGEgfCBETUFfUkVBRF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX0RNQV9DT01QOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsRG1hQ29tcC5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gfkRNQV9DT01QX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIERtYUNvbXAuTW9kZSwgZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBEbWFDb21wLk1vZGUpICYgRE1BX0NPTVBfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIERtYUNvbXAuTW9kZSwgZGF0YSB8IERNQV9DT01QX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfRE1BX0NPTVA6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBEbWFDb21wLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5ETUFfQ09NUF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIERtYUNvbXAuTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgRG1hQ29tcC5Nb2RlKSAmCisJCQkJCSAgICAgRE1BX0NPTVBfTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIERtYUNvbXAuTW9kZSwKKwkJCQkJZGF0YSB8IERNQV9DT01QX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfUlhfQkRfSU5JVElBVE9SOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5SQ1ZfQkRfSU5fTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgUmN2QmRJbi5Nb2RlLGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgUmN2QmRJbi5Nb2RlKSAmIFJDVl9CRF9JTl9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgUmN2QmRJbi5Nb2RlLGRhdGEgfCBSQ1ZfQkRfSU5fTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19SWF9CRF9JTklUSUFUT1I6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBSY3ZCZEluLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5SQ1ZfQkRfSU5fTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBSY3ZCZEluLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSkgJgorCQkJCQkgICAgIFJDVl9CRF9JTl9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgUmN2QmRJbi5Nb2RlLAorCQkJCQlkYXRhIHwgUkNWX0JEX0lOX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfUlhfQkRfQ09NUDoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5SQ1ZfQkRfQ09NUF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSxkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkJkQ29tcC5Nb2RlKSAmIFJDVl9CRF9DT01QX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSxkYXRhIHwgUkNWX0JEX0NPTVBfTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19SWF9CRF9DT01QOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgUmN2QmRDb21wLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5SQ1ZfQkRfQ09NUF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkJkQ29tcC5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSkgJgorCQkJCQkgICAgIFJDVl9CRF9DT01QX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSwKKwkJCQkJZGF0YSB8IFJDVl9CRF9DT01QX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfRE1BX1dSOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+RE1BX1dSSVRFX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUsZGF0YSk7CisJCWNhc2UgVDNfQkxPQ0tfRE1BX1dSOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgRG1hV3JpdGUuTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gfkRNQV9XUklURV9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUsIGRhdGEpOwogCi0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBEbWFXcml0ZS5Nb2RlKSAmIERNQV9XUklURV9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgRG1hV3JpdGUuTW9kZSxkYXRhIHwgRE1BX1dSSVRFX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgRG1hV3JpdGUuTW9kZSkgJgorCQkJCQkgICAgIERNQV9XUklURV9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgRG1hV3JpdGUuTW9kZSwKKwkJCQkJZGF0YSB8IERNQV9XUklURV9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX01TSV9IQU5ETEVSOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIE1zaS5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gfk1TSV9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBNc2kuTW9kZSwgZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBNc2kuTW9kZSkgJiBNU0lfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIE1zaS5Nb2RlLCBkYXRhIHxNU0lfTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19NU0lfSEFORExFUjoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIE1zaS5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+TVNJX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgTXNpLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIE1zaS5Nb2RlKSAmCisJCQkJCSAgICAgTVNJX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBNc2kuTW9kZSwKKwkJCQkJZGF0YSB8IE1TSV9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1JYX0xJU1RfUExNVDoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gflJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSxkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUpICYgUkNWX0xJU1RfUExNVF9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSxkYXRhIHwgUkNWX0xJU1RfUExNVF9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX1JYX0xJU1RfUExNVDoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5SQ1ZfTElTVF9QTE1UX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSkKKwkJCQkJICAgICAmIFJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUsCisJCQkJCWRhdGEgfCBSQ1ZfTElTVF9QTE1UX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfUlhfTElTVF9TRUxFQ1RPUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBSY3ZMaXN0U2VsLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+UkNWX0xJU1RfU0VMX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSxkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSkgJiBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSxkYXRhIHxSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19SWF9MSVNUX1NFTEVDVE9SOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgUmN2TGlzdFNlbC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+UkNWX0xJU1RfU0VMX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgUmN2TGlzdFNlbC5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBSY3ZMaXN0U2VsLk1vZGUpICYKKwkJCQkJICAgICBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSwKKwkJCQkJZGF0YSB8IFJDVl9MSVNUX1NFTF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1JYX0RBVEFfSU5JVElBVE9SOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+UkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uTW9kZSxkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUpICYgUkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUsIGRhdGEgfCBSQ1ZfREFUQV9CRF9JTl9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX1JYX0RBVEFfSU5JVElBVE9SOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgUmN2RGF0YUJkSW4uTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gflJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgUmN2RGF0YUJkSW4uTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgUmN2RGF0YUJkSW4uTW9kZSkKKwkJCQkJICAgICAmIFJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlLAorCQkJCQlkYXRhIHwgUkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19SWF9EQVRBX0NPTVA6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgUmN2RGF0YUNvbXAuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5SQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFDb21wLk1vZGUsZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlKSAmIFJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFDb21wLk1vZGUsZGF0YSB8IFJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19SWF9EQVRBX0NPTVA6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+UkNWX0RBVEFfQ09NUF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFDb21wLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUpCisJCQkJCSAgICAgJiBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLAorCQkJCQlkYXRhIHwgUkNWX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX0hPU1RfQ09BTEVTSU5HOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gfkhPU1RfQ09BTEVTQ0VfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlLCBkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFNuZEJkSW4uTW9kZSkgJiBIT1NUX0NPQUxFU0NFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLk1vZGUsIGRhdGEgfCBIT1NUX0NPQUxFU0NFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX0hPU1RfQ09BTEVTSU5HOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgSG9zdENvYWxlc2NlLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5IT1NUX0NPQUxFU0NFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBTbmRCZEluLk1vZGUpICYKKwkJCQkJICAgICBIT1NUX0NPQUxFU0NFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLk1vZGUsCisJCQkJCWRhdGEgfCBIT1NUX0NPQUxFU0NFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX01BQ19SWF9FTkdJTkU6Ci0JCWlmKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIHBEZXZpY2UtPlJ4TW9kZSAmPSB+UlhfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIHBEZXZpY2UtPlJ4TW9kZSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSkgJiBSWF9NT0RFX0VOQUJMRSkpCi0JCQl7Ci0JCQkgICAgYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfTUFDX1JYX0VOR0lORToKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJcERldmljZS0+UnhNb2RlICY9IH5SWF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLAorCQkJCQlwRGV2aWNlLT5SeE1vZGUpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlKSAmCisJCQkJCSAgICAgUlhfTU9ERV9FTkFCTEUpKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwRGV2aWNlLT5SeE1vZGUgfD0gUlhfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwKKwkJCQkJcERldmljZS0+UnhNb2RlKTsKIAkJCX0KLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJewotCQkgICAgcERldmljZS0+UnhNb2RlIHw9IFJYX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBwRGV2aWNlLT5SeE1vZGUpOwotCQl9Ci0JCWJyZWFrOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19NQlVGX0NMVVNURVJfRlJFRToKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5NQlVGX0NMVVNURVJfRlJFRV9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSxkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIE1idWZDbHVzdGVyRnJlZS5Nb2RlKSAmIE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSwgZGF0YSB8IE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfTUJVRl9DTFVTVEVSX0ZSRUU6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gfk1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQKKwkJCQkJICAgICAocERldmljZSwKKwkJCQkJICAgICAgTWJ1ZkNsdXN0ZXJGcmVlLgorCQkJCQkgICAgICBNb2RlKSAmCisJCQkJCSAgICAgTUJVRl9DTFVTVEVSX0ZSRUVfTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1idWZDbHVzdGVyRnJlZS5Nb2RlLAorCQkJCQlkYXRhIHwgTUJVRl9DTFVTVEVSX0ZSRUVfTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19TRU5EX0JEX0lOSVRJQVRPUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBTbmRCZEluLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+U05EX0JEX0lOX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFNuZEJkSW4uTW9kZSwgZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBTbmRCZEluLk1vZGUpICYgU05EX0JEX0lOX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZEluLk1vZGUsIGRhdGEgIHwgU05EX0JEX0lOX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfU0VORF9CRF9JTklUSUFUT1I6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBTbmRCZEluLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5TTkRfQkRfSU5fTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBTbmRCZEluLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIFNuZEJkSW4uTW9kZSkgJgorCQkJCQkgICAgIFNORF9CRF9JTl9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgU25kQmRJbi5Nb2RlLAorCQkJCQlkYXRhIHwgU05EX0JEX0lOX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfU0VORF9CRF9DT01QOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFNuZEJkQ29tcC5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gflNORF9CRF9DT01QX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFNuZEJkQ29tcC5Nb2RlLCBkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFNuZEJkQ29tcC5Nb2RlKSAmIFNORF9CRF9DT01QX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSwgZGF0YSB8IFNORF9CRF9DT01QX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfU0VORF9CRF9DT01QOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgU25kQmRDb21wLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5TTkRfQkRfQ09NUF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFNuZEJkQ29tcC5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSkgJgorCQkJCQkgICAgIFNORF9CRF9DT01QX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSwKKwkJCQkJZGF0YSB8IFNORF9CRF9DT01QX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfU0VORF9CRF9TRUxFQ1RPUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBTbmRCZFNlbC5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gflNORF9CRF9TRUxfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgU25kQmRTZWwuTW9kZSwgZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBTbmRCZFNlbC5Nb2RlKSAmIFNORF9CRF9TRUxfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUsIGRhdGEgfCBTTkRfQkRfU0VMX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfU0VORF9CRF9TRUxFQ1RPUjoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5TTkRfQkRfU0VMX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgU25kQmRTZWwuTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgU25kQmRTZWwuTW9kZSkgJgorCQkJCQkgICAgIFNORF9CRF9TRUxfTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUsCisJCQkJCWRhdGEgfCBTTkRfQkRfU0VMX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfU0VORF9EQVRBX0lOSVRJQVRPUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5UM19TTkRfREFUQV9JTl9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSxkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFNuZERhdGFJbi5Nb2RlKSAmIFQzX1NORF9EQVRBX0lOX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSxkYXRhIHwgVDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19TRU5EX0RBVEFfSU5JVElBVE9SOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgU25kRGF0YUluLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5UM19TTkRfREFUQV9JTl9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFNuZERhdGFJbi5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSkgJgorCQkJCQkgICAgIFQzX1NORF9EQVRBX0lOX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSwKKwkJCQkJZGF0YSB8IFQzX1NORF9EQVRBX0lOX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfU0VORF9EQVRBX0NPTVA6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgU25kRGF0YUNvbXAuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5TTkRfREFUQV9DT01QX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUsIGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgU25kRGF0YUNvbXAuTW9kZSkgJiBTTkRfREFUQV9DT01QX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlLGRhdGEgfCBTTkRfREFUQV9DT01QX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfU0VORF9EQVRBX0NPTVA6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+U05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUpCisJCQkJCSAgICAgJiBTTkRfREFUQV9DT01QX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlLAorCQkJCQlkYXRhIHwgU05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX01BQ19UWF9FTkdJTkU6Ci0JCWlmKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIHBEZXZpY2UtPlR4TW9kZSAmPSB+VFhfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeE1vZGUsIHBEZXZpY2UtPlR4TW9kZSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlR4TW9kZSkgJiBUWF9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIHBEZXZpY2UtPlR4TW9kZSB8PSBUWF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlR4TW9kZSwgcERldmljZS0+VHhNb2RlKTsKLQkJfQotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19NQUNfVFhfRU5HSU5FOgorCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlwRGV2aWNlLT5UeE1vZGUgJj0gflRYX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5UeE1vZGUsCisJCQkJCXBEZXZpY2UtPlR4TW9kZSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgTWFjQ3RybC5UeE1vZGUpICYKKwkJCQkJICAgICBUWF9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+VHhNb2RlIHw9IFRYX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5UeE1vZGUsCisJCQkJCXBEZXZpY2UtPlR4TW9kZSk7CisJCQl9CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX01FTV9BUkJJVE9SOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIE1lbUFyYml0ZXIuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5UM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUsIGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgTWVtQXJiaXRlci5Nb2RlKSAmIFQzX01FTV9BUkJJVEVSX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUsZGF0YXxUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX01FTV9BUkJJVE9SOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgTWVtQXJiaXRlci5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+VDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIE1lbUFyYml0ZXIuTW9kZSkgJgorCQkJCQkgICAgIFQzX01FTV9BUkJJVEVSX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUsCisJCQkJCWRhdGEgfCBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX01CVUZfTUFOQUdFUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBCdWZNZ3IuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5CVUZNR1JfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1vZGUsZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBCdWZNZ3IuTW9kZSkgJiBCVUZNR1JfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlLGRhdGEgfCAgQlVGTUdSX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfTUJVRl9NQU5BR0VSOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgQnVmTWdyLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5CVUZNR1JfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgQnVmTWdyLk1vZGUpICYKKwkJCQkJICAgICBCVUZNR1JfTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlLAorCQkJCQlkYXRhIHwgQlVGTUdSX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfTUFDX0dMT0JBTDoKLQkJaWYoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgcERldmljZS0+TWFjTW9kZSAmPSB+KE1BQ19NT0RFX0VOQUJMRV9UREUgfAotCQkJTUFDX01PREVfRU5BQkxFX1JERSB8Ci0JCQlNQUNfTU9ERV9FTkFCTEVfRkhERSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBwRGV2aWNlLT5NYWNNb2RlIHw9IChNQUNfTU9ERV9FTkFCTEVfVERFIHwKLQkJCU1BQ19NT0RFX0VOQUJMRV9SREUgfAotCQkJTUFDX01PREVfRU5BQkxFX0ZIREUpOwotCQl9Ci0JCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19NQUNfR0xPQkFMOgorCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlwRGV2aWNlLT5NYWNNb2RlICY9IH4oTUFDX01PREVfRU5BQkxFX1RERSB8CisJCQkJCQkgICAgICBNQUNfTU9ERV9FTkFCTEVfUkRFIHwKKwkJCQkJCSAgICAgIE1BQ19NT0RFX0VOQUJMRV9GSERFKTsKKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+TWFjTW9kZSB8PSAoTUFDX01PREVfRU5BQkxFX1RERSB8CisJCQkJCQkgICAgIE1BQ19NT0RFX0VOQUJMRV9SREUgfAorCQkJCQkJICAgICBNQUNfTU9ERV9FTkFCTEVfRkhERSk7CisJCQl9CisJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CisJCQlicmVhazsKIAotCSAgICBkZWZhdWx0OgotCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0JfSAvKiBzd2l0Y2ggKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwkJfQkJLyogc3dpdGNoICovCiAKLQlpZihqID49IE1heFdhaXRDbnQpCi0JewotCSAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCWlmIChqID49IE1heFdhaXRDbnQpIHsKKwkJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwkJfQogCX0KLSAgICB9CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjI5NSw2ODIgKzIxMjksNjMxIEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX1Jlc2V0QWRhcHRlcigKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBMTV9SZXNldEFkYXB0ZXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKLSAgICBMTV9VSU5UMTYgVmFsdWUxNjsKLSAgICBMTV9VSU5UMzIgaiwgazsKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9VSU5UMTYgVmFsdWUxNjsKKwlMTV9VSU5UMzIgaiwgazsKIAotICAgIC8qIERpc2FibGUgaW50ZXJydXB0LiAqLwotICAgIExNX0Rpc2FibGVJbnRlcnJ1cHQocERldmljZSk7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHQuICovCisJTE1fRGlzYWJsZUludGVycnVwdCAocERldmljZSk7CiAKLSAgICAvKiBNYXkgZ2V0IGEgc3B1cmlvdXMgaW50ZXJydXB0ICovCi0gICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyA9IFNUQVRVU19CTE9DS19VUERBVEVEOworCS8qIE1heSBnZXQgYSBzcHVyaW91cyBpbnRlcnJ1cHQgKi8KKwlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0gU1RBVFVTX0JMT0NLX1VQREFURUQ7CiAKLSAgICAvKiBEaXNhYmxlIHRyYW5zbWl0IGFuZCByZWNlaXZlIERNQSBlbmdpbmVzLiAgQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMuICovCi0gICAgaWYocERldmljZS0+SW5pdERvbmUpCi0gICAgewotCUxNX0Fib3J0KHBEZXZpY2UpOwotICAgIH0KLQotICAgIHBEZXZpY2UtPlNodXR0aW5nRG93biA9IEZBTFNFOwotCi0gICAgTE1fUmVzZXRDaGlwKHBEZXZpY2UpOwotCi0gICAgLyogQnVnOiBBdGhsb24gZml4IGZvciBCMyBzaWxpY29uIG9ubHkuICBUaGlzIGJpdCBkb2VzIG5vdCBkbyBhbnl0aGluZyAqLwotICAgIC8qIGluIG90aGVyIGNoaXAgcmV2aXNpb25zLiAqLwotICAgIGlmKHBEZXZpY2UtPkRlbGF5UGNpR3JhbnQpCi0gICAgewotCVZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCk7Ci0JUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFZhbHVlMzIgfCBCSVRfMzEpOwotICAgIH0KLQotICAgIGlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDRfQTApCi0gICAgewotCWlmICghKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkpCi0JewotCSAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSk7Ci0JICAgIFZhbHVlMzIgfD0gVDNfUENJX1NUQVRFX1JFVFJZX1NBTUVfRE1BOwotCSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLlBjaVN0YXRlLCBWYWx1ZTMyKTsKKwkvKiBEaXNhYmxlIHRyYW5zbWl0IGFuZCByZWNlaXZlIERNQSBlbmdpbmVzLiAgQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMuICovCisJaWYgKHBEZXZpY2UtPkluaXREb25lKSB7CisJCUxNX0Fib3J0IChwRGV2aWNlKTsKIAl9Ci0gICAgfQogCi0gICAgLyogRW5hYmxlIFRhZ2dlZFN0YXR1cyBtb2RlLiAqLwotICAgIGlmKHBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cykKLSAgICB7Ci0JcERldmljZS0+TWlzY0hvc3RDdHJsIHw9IE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9UQUdHRURfU1RBVFVTX01PREU7Ci0gICAgfQorCXBEZXZpY2UtPlNodXR0aW5nRG93biA9IEZBTFNFOwogCi0gICAgLyogUmVzdG9yZSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBQQ0lfQ0FDSEVfTElORV9TSVpFX1JFRywKLQlwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyk7Ci0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRF9SRUcsCi0JKHBEZXZpY2UtPlN1YnN5c3RlbUlkIDw8IDE2KSB8IHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkKTsKKwlMTV9SZXNldENoaXAgKHBEZXZpY2UpOwogCi0gICAgLyogQ2xlYXIgdGhlIHN0YXRpc3RpY3MgYmxvY2suICovCi0gICAgZm9yKGogPSAweDAzMDA7IGogPCAweDBiMDA7IGorKykKLSAgICB7Ci0JTUVNX1dSX09GRlNFVChwRGV2aWNlLCBqLCAwKTsKLSAgICB9CisJLyogQnVnOiBBdGhsb24gZml4IGZvciBCMyBzaWxpY29uIG9ubHkuICBUaGlzIGJpdCBkb2VzIG5vdCBkbyBhbnl0aGluZyAqLworCS8qIGluIG90aGVyIGNoaXAgcmV2aXNpb25zLiAqLworCWlmIChwRGV2aWNlLT5EZWxheVBjaUdyYW50KSB7CisJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwpOworCQlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFZhbHVlMzIgfCBCSVRfMzEpOworCX0KIAotICAgIC8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpcyBCbG9jayAqLwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPSAwOwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZTdGRDb25JZHggPSAwOwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZKdW1ib0NvbklkeCA9IDA7Ci0gICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdk1pbmlDb25JZHggPSAwOworCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKSB7CisJCWlmICghKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkpIHsKKwkJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSk7CisJCQlWYWx1ZTMyIHw9IFQzX1BDSV9TVEFURV9SRVRSWV9TQU1FX0RNQTsKKwkJCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLlBjaVN0YXRlLCBWYWx1ZTMyKTsKKwkJfQorCX0KIAotICAgIGZvcihqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgewotICAgICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5JZHhbal0uUmN2UHJvZElkeCA9IDA7Ci0gICAgICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFtqXS5TZW5kQ29uSWR4ID0gMDsKLSAgICB9CisJLyogRW5hYmxlIFRhZ2dlZFN0YXR1cyBtb2RlLiAqLworCWlmIChwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMpIHsKKwkJcERldmljZS0+TWlzY0hvc3RDdHJsIHw9CisJCSAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfVEFHR0VEX1NUQVRVU19NT0RFOworCX0KIAotICAgIGZvcihrID0gMDsgayA8IFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UIDtrKyspCi0gICAgewotICAgICAgIHBEZXZpY2UtPnBSeFN0ZEJkVmlydFtrXS5Ib3N0QWRkci5IaWdoID0gMDsKLSAgICAgICBwRGV2aWNlLT5wUnhTdGRCZFZpcnRba10uSG9zdEFkZHIuTG93ID0gMDsKLSAgICB9CisJLyogUmVzdG9yZSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgUENJX0NBQ0hFX0xJTkVfU0laRV9SRUcsCisJCQkgIHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnKTsKKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRF9SRUcsCisJCQkgIChwRGV2aWNlLT5TdWJzeXN0ZW1JZCA8PCAxNikgfCBwRGV2aWNlLT4KKwkJCSAgU3Vic3lzdGVtVmVuZG9ySWQpOworCisJLyogQ2xlYXIgdGhlIHN0YXRpc3RpY3MgYmxvY2suICovCisJZm9yIChqID0gMHgwMzAwOyBqIDwgMHgwYjAwOyBqKyspIHsKKwkJTUVNX1dSX09GRlNFVCAocERldmljZSwgaiwgMCk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGlzIEJsb2NrICovCisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyA9IDA7CisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdlN0ZENvbklkeCA9IDA7CisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdkp1bWJvQ29uSWR4ID0gMDsKKwlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2TWluaUNvbklkeCA9IDA7CisKKwlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4W2pdLlJjdlByb2RJZHggPSAwOworCQlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4W2pdLlNlbmRDb25JZHggPSAwOworCX0KKworCWZvciAoayA9IDA7IGsgPCBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVDsgaysrKSB7CisJCXBEZXZpY2UtPnBSeFN0ZEJkVmlydFtrXS5Ib3N0QWRkci5IaWdoID0gMDsKKwkJcERldmljZS0+cFJ4U3RkQmRWaXJ0W2tdLkhvc3RBZGRyLkxvdyA9IDA7CisJfQogCiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIC8qIFJlY2VpdmUganVtYm8gQkQgYnVmZmVyLiAqLwotICAgIGZvcihrID0gMDsgayA8IFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQ7IGsrKykKLSAgICB7Ci0JcERldmljZS0+cFJ4SnVtYm9CZFZpcnRba10uSG9zdEFkZHIuSGlnaCA9IDA7Ci0JcERldmljZS0+cFJ4SnVtYm9CZFZpcnRba10uSG9zdEFkZHIuTG93ID0gMDsKLSAgICB9CisJLyogUmVjZWl2ZSBqdW1ibyBCRCBidWZmZXIuICovCisJZm9yIChrID0gMDsgayA8IFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQ7IGsrKykgeworCQlwRGV2aWNlLT5wUnhKdW1ib0JkVmlydFtrXS5Ib3N0QWRkci5IaWdoID0gMDsKKwkJcERldmljZS0+cFJ4SnVtYm9CZFZpcnRba10uSG9zdEFkZHIuTG93ID0gMDsKKwl9CiAjZW5kaWYKIAotICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuRG1hUmVhZFdyaXRlQ3RybCwgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCk7CisJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuRG1hUmVhZFdyaXRlQ3RybCwgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCk7CiAKLSAgICAvKiBHUkMgbW9kZSBjb250cm9sIHJlZ2lzdGVyLiAqLwotI2lmZGVmIEJJR19FTkRJQU5fUENJICAgIC8qIEppbW15LCB0aGlzIGlmZGVmIGJsb2NrIGRlbGV0ZWQgaW4gbmV3IGNvZGUhICovCi0gICAgVmFsdWUzMiA9Ci0JR1JDX01PREVfV09SRF9TV0FQX0RBVEEgfAotCUdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8Ci0JR1JDX01PREVfSU5UX09OX01BQ19BVFROIHwKLQlHUkNfTU9ERV9IT1NUX1NUQUNLX1VQOworCS8qIEdSQyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIuICovCisjaWZkZWYgQklHX0VORElBTl9QQ0kJCS8qIEppbW15LCB0aGlzIGlmZGVmIGJsb2NrIGRlbGV0ZWQgaW4gbmV3IGNvZGUhICovCisJVmFsdWUzMiA9CisJICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBIHwKKwkgICAgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBIHwKKwkgICAgR1JDX01PREVfSU5UX09OX01BQ19BVFROIHwgR1JDX01PREVfSE9TVF9TVEFDS19VUDsKICNlbHNlCi0gICAgLyogTm8gQ1BVIFN3YXAgbW9kZXMgZm9yIFBDSSBJTyAqLwotICAgIFZhbHVlMzIgPQorCS8qIE5vIENQVSBTd2FwIG1vZGVzIGZvciBQQ0kgSU8gKi8KKwlWYWx1ZTMyID0KICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLQlHUkNfTU9ERV9CWVRFX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfAotCUdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8Ci0JR1JDX01PREVfQllURV9TV0FQX0RBVEEgfAotCUdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBIHwKKwkgICAgR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBIHwKKwkgICAgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBIHwKKwkgICAgR1JDX01PREVfQllURV9TV0FQX0RBVEEgfCBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8CiAjZWxzZQotCUdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8Ci0JR1JDX01PREVfQllURV9TV0FQX0RBVEEgfAotCUdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBIHwKKwkgICAgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBIHwKKwkgICAgR1JDX01PREVfQllURV9TV0FQX0RBVEEgfCBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8CiAjZW5kaWYKLQlHUkNfTU9ERV9JTlRfT05fTUFDX0FUVE4gfAotCUdSQ19NT0RFX0hPU1RfU1RBQ0tfVVA7Ci0jZW5kaWYgLyogIUJJR19FTkRJQU5fUENJICovCisJICAgIEdSQ19NT0RFX0lOVF9PTl9NQUNfQVRUTiB8IEdSQ19NT0RFX0hPU1RfU1RBQ0tfVVA7CisjZW5kaWYJCQkJLyogIUJJR19FTkRJQU5fUENJICovCiAKLSAgICAvKiBDb25maWd1cmUgc2VuZCBCRCBtb2RlLiAqLwotICAgIGlmKHBEZXZpY2UtPk5pY1NlbmRCZCA9PSBGQUxTRSkKLSAgICB7Ci0JVmFsdWUzMiB8PSBHUkNfTU9ERV9IT1NUX1NFTkRfQkRTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCVZhbHVlMzIgfD0gR1JDX01PREVfNFhfTklDX0JBU0VEX1NFTkRfUklOR1M7Ci0gICAgfQotCi0gICAgLyogQ29uZmlndXJlIHBzZXVkbyBjaGVja3N1bSBtb2RlLiAqLwotICAgIGlmKHBEZXZpY2UtPk5vVHhQc2V1ZG9IZHJDaGtzdW0pCi0gICAgewotCVZhbHVlMzIgfD0gR1JDX01PREVfVFhfTk9fUFNFVURPX0hFQURFUl9DSEtTVU07Ci0gICAgfQotCi0gICAgaWYocERldmljZS0+Tm9SeFBzZXVkb0hkckNoa3N1bSkKLSAgICB7Ci0JVmFsdWUzMiB8PSBHUkNfTU9ERV9SWF9OT19QU0VVRE9fSEVBREVSX0NIS1NVTTsKLSAgICB9Ci0KLSAgICBSRUdfV1IocERldmljZSwgR3JjLk1vZGUsIFZhbHVlMzIpOwotCi0gICAgLyogU2V0dXAgdGhlIHRpbWVyIHByZXNjYWxhciByZWdpc3Rlci4gKi8KLSAgICBSRUdfV1IocERldmljZSwgR3JjLk1pc2NDZmcsIDY1IDw8IDEpOyAgICAgIC8qIENsb2NrIGlzIGFsd2FzeSA2Nk1oei4gKi8KLQotICAgIC8qIFNldCB1cCB0aGUgTUJVRiBwb29sIGJhc2UgYWRkcmVzcyBhbmQgc2l6ZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZQb29sQWRkciwgcERldmljZS0+TWJ1ZkJhc2UpOwotICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlBvb2xTaXplLCBwRGV2aWNlLT5NYnVmU2l6ZSk7Ci0KLSAgICAvKiBTZXQgdXAgdGhlIERNQSBkZXNjcmlwdG9yIHBvb2wgYmFzZSBhZGRyZXNzIGFuZCBzaXplLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuRG1hRGVzY1Bvb2xBZGRyLCBUM19OSUNfRE1BX0RFU0NfUE9PTF9BRERSKTsKLSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLkRtYURlc2NQb29sU2l6ZSwgVDNfTklDX0RNQV9ERVNDX1BPT0xfU0laRSk7Ci0KLSAgICAvKiBDb25maWd1cmUgTUJVRiBhbmQgVGhyZXNob2xkIHdhdGVybWFya3MgKi8KLSAgICAvKiBDb25maWd1cmUgdGhlIERNQSByZWFkIE1CVUYgbG93IHdhdGVyIG1hcmsuICovCi0gICAgaWYocERldmljZS0+RG1hTWJ1Zkxvd01hcmspCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlJlYWREbWFMb3dXYXRlck1hcmssCi0JICAgIHBEZXZpY2UtPkRtYU1idWZMb3dNYXJrKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihwRGV2aWNlLT5UeE10dSA8IE1BWF9FVEhFUk5FVF9QQUNLRVRfQlVGRkVSX1NJWkUpCi0JewotCSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZSZWFkRG1hTG93V2F0ZXJNYXJrLAotCQlUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLKTsKKwkvKiBDb25maWd1cmUgc2VuZCBCRCBtb2RlLiAqLworCWlmIChwRGV2aWNlLT5OaWNTZW5kQmQgPT0gRkFMU0UpIHsKKwkJVmFsdWUzMiB8PSBHUkNfTU9ERV9IT1NUX1NFTkRfQkRTOworCX0gZWxzZSB7CisJCVZhbHVlMzIgfD0gR1JDX01PREVfNFhfTklDX0JBU0VEX1NFTkRfUklOR1M7CiAJfQotCWVsc2UKLQl7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlJlYWREbWFMb3dXYXRlck1hcmssCi0JCVQzX0RFRl9ETUFfTUJVRl9MT1dfV01BUktfSlVNQk8pOworCisJLyogQ29uZmlndXJlIHBzZXVkbyBjaGVja3N1bSBtb2RlLiAqLworCWlmIChwRGV2aWNlLT5Ob1R4UHNldWRvSGRyQ2hrc3VtKSB7CisJCVZhbHVlMzIgfD0gR1JDX01PREVfVFhfTk9fUFNFVURPX0hFQURFUl9DSEtTVU07CiAJfQotICAgIH0KIAotICAgIC8qIENvbmZpZ3VyZSB0aGUgTUFDIFJ4IE1CVUYgbG93IHdhdGVyIG1hcmsuICovCi0gICAgaWYocERldmljZS0+UnhNYWNNYnVmTG93TWFyaykKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmTWFjUnhMb3dXYXRlck1hcmssCi0JICAgIHBEZXZpY2UtPlJ4TWFjTWJ1Zkxvd01hcmspOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWlmKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9CVUZGRVJfU0laRSkKLQl7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1Zk1hY1J4TG93V2F0ZXJNYXJrLAotCQlUM19ERUZfUlhfTUFDX01CVUZfTE9XX1dNQVJLKTsKKwlpZiAocERldmljZS0+Tm9SeFBzZXVkb0hkckNoa3N1bSkgeworCQlWYWx1ZTMyIHw9IEdSQ19NT0RFX1JYX05PX1BTRVVET19IRUFERVJfQ0hLU1VNOwogCX0KLQllbHNlCi0JewotCSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZNYWNSeExvd1dhdGVyTWFyaywKLQkJVDNfREVGX1JYX01BQ19NQlVGX0xPV19XTUFSS19KVU1CTyk7CisKKwlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Nb2RlLCBWYWx1ZTMyKTsKKworCS8qIFNldHVwIHRoZSB0aW1lciBwcmVzY2FsYXIgcmVnaXN0ZXIuICovCisJUkVHX1dSIChwRGV2aWNlLCBHcmMuTWlzY0NmZywgNjUgPDwgMSk7CS8qIENsb2NrIGlzIGFsd2FzeSA2Nk1oei4gKi8KKworCS8qIFNldCB1cCB0aGUgTUJVRiBwb29sIGJhc2UgYWRkcmVzcyBhbmQgc2l6ZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUG9vbEFkZHIsIHBEZXZpY2UtPk1idWZCYXNlKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUG9vbFNpemUsIHBEZXZpY2UtPk1idWZTaXplKTsKKworCS8qIFNldCB1cCB0aGUgRE1BIGRlc2NyaXB0b3IgcG9vbCBiYXNlIGFkZHJlc3MgYW5kIHNpemUuICovCisJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuRG1hRGVzY1Bvb2xBZGRyLCBUM19OSUNfRE1BX0RFU0NfUE9PTF9BRERSKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5EbWFEZXNjUG9vbFNpemUsIFQzX05JQ19ETUFfREVTQ19QT09MX1NJWkUpOworCisJLyogQ29uZmlndXJlIE1CVUYgYW5kIFRocmVzaG9sZCB3YXRlcm1hcmtzICovCisJLyogQ29uZmlndXJlIHRoZSBETUEgcmVhZCBNQlVGIGxvdyB3YXRlciBtYXJrLiAqLworCWlmIChwRGV2aWNlLT5EbWFNYnVmTG93TWFyaykgeworCQlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUmVhZERtYUxvd1dhdGVyTWFyaywKKwkJCXBEZXZpY2UtPkRtYU1idWZMb3dNYXJrKTsKKwl9IGVsc2UgeworCQlpZiAocERldmljZS0+VHhNdHUgPCBNQVhfRVRIRVJORVRfUEFDS0VUX0JVRkZFUl9TSVpFKSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUmVhZERtYUxvd1dhdGVyTWFyaywKKwkJCQlUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLKTsKKwkJfSBlbHNlIHsKKwkJCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1idWZSZWFkRG1hTG93V2F0ZXJNYXJrLAorCQkJCVQzX0RFRl9ETUFfTUJVRl9MT1dfV01BUktfSlVNQk8pOworCQl9CiAJfQotICAgIH0KIAotICAgIC8qIENvbmZpZ3VyZSB0aGUgTUJVRiBoaWdoIHdhdGVyIG1hcmsuICovCi0gICAgaWYocERldmljZS0+TWJ1ZkhpZ2hNYXJrKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZIaWdoV2F0ZXJNYXJrLCBwRGV2aWNlLT5NYnVmSGlnaE1hcmspOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWlmKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9CVUZGRVJfU0laRSkKLQl7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZkhpZ2hXYXRlck1hcmssCi0JCVQzX0RFRl9NQlVGX0hJR0hfV01BUkspOworCS8qIENvbmZpZ3VyZSB0aGUgTUFDIFJ4IE1CVUYgbG93IHdhdGVyIG1hcmsuICovCisJaWYgKHBEZXZpY2UtPlJ4TWFjTWJ1Zkxvd01hcmspIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTWJ1Zk1hY1J4TG93V2F0ZXJNYXJrLAorCQkJcERldmljZS0+UnhNYWNNYnVmTG93TWFyayk7CisJfSBlbHNlIHsKKwkJaWYgKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9CVUZGRVJfU0laRSkgeworCQkJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTWJ1Zk1hY1J4TG93V2F0ZXJNYXJrLAorCQkJCVQzX0RFRl9SWF9NQUNfTUJVRl9MT1dfV01BUkspOworCQl9IGVsc2UgeworCQkJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTWJ1Zk1hY1J4TG93V2F0ZXJNYXJrLAorCQkJCVQzX0RFRl9SWF9NQUNfTUJVRl9MT1dfV01BUktfSlVNQk8pOworCQl9CiAJfQotCWVsc2UKLQl7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZkhpZ2hXYXRlck1hcmssCi0JCVQzX0RFRl9NQlVGX0hJR0hfV01BUktfSlVNQk8pOworCisJLyogQ29uZmlndXJlIHRoZSBNQlVGIGhpZ2ggd2F0ZXIgbWFyay4gKi8KKwlpZiAocERldmljZS0+TWJ1ZkhpZ2hNYXJrKSB7CisJCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1idWZIaWdoV2F0ZXJNYXJrLAorCQkJcERldmljZS0+TWJ1ZkhpZ2hNYXJrKTsKKwl9IGVsc2UgeworCQlpZiAocERldmljZS0+VHhNdHUgPCBNQVhfRVRIRVJORVRfUEFDS0VUX0JVRkZFUl9TSVpFKSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5NYnVmSGlnaFdhdGVyTWFyaywKKwkJCQlUM19ERUZfTUJVRl9ISUdIX1dNQVJLKTsKKwkJfSBlbHNlIHsKKwkJCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1idWZIaWdoV2F0ZXJNYXJrLAorCQkJCVQzX0RFRl9NQlVGX0hJR0hfV01BUktfSlVNQk8pOworCQl9CiAJfQotICAgIH0KIAotICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuRG1hTG93V2F0ZXJNYXJrLCBUM19ERUZfRE1BX0RFU0NfTE9XX1dNQVJLKTsKLSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLkRtYUhpZ2hXYXRlck1hcmssIFQzX0RFRl9ETUFfREVTQ19ISUdIX1dNQVJLKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5EbWFMb3dXYXRlck1hcmssIFQzX0RFRl9ETUFfREVTQ19MT1dfV01BUkspOworCVJFR19XUiAocERldmljZSwgQnVmTWdyLkRtYUhpZ2hXYXRlck1hcmssIFQzX0RFRl9ETUFfREVTQ19ISUdIX1dNQVJLKTsKIAotICAgIC8qIEVuYWJsZSBidWZmZXIgbWFuYWdlci4gKi8KLSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1vZGUsIEJVRk1HUl9NT0RFX0VOQUJMRSB8IEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFKTsKKwkvKiBFbmFibGUgYnVmZmVyIG1hbmFnZXIuICovCisJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTW9kZSwKKwkJQlVGTUdSX01PREVfRU5BQkxFIHwgQlVGTUdSX01PREVfQVRUTl9FTkFCTEUpOwogCi0gICAgZm9yKGogPSAwIDtqIDwgMjAwMDsgaisrKQotICAgIHsKLQlpZihSRUdfUkQocERldmljZSwgQnVmTWdyLk1vZGUpICYgQlVGTUdSX01PREVfRU5BQkxFKQotCSAgICBicmVhazsKLQlNTV9XYWl0KDEwKTsKLSAgICB9CisJZm9yIChqID0gMDsgaiA8IDIwMDA7IGorKykgeworCQlpZiAoUkVHX1JEIChwRGV2aWNlLCBCdWZNZ3IuTW9kZSkgJiBCVUZNR1JfTU9ERV9FTkFCTEUpCisJCQlicmVhazsKKwkJTU1fV2FpdCAoMTApOworCX0KIAotICAgIGlmKGogPj0gMjAwMCkKLSAgICB7Ci0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotICAgIH0KKwlpZiAoaiA+PSAyMDAwKSB7CisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwl9CiAKLSAgICAvKiBFbmFibGUgdGhlIEZUUXMuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEZ0cS5SZXNldCwgMHhmZmZmZmZmZik7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEZ0cS5SZXNldCwgMCk7CisJLyogRW5hYmxlIHRoZSBGVFFzLiAqLworCVJFR19XUiAocERldmljZSwgRnRxLlJlc2V0LCAweGZmZmZmZmZmKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEZ0cS5SZXNldCwgMCk7CiAKLSAgICAvKiBXYWl0IHVudGlsIEZUUSBpcyByZWFkeSAqLwotICAgIGZvcihqID0gMDsgaiA8IDIwMDA7IGorKykKLSAgICB7Ci0JaWYoUkVHX1JEKHBEZXZpY2UsIEZ0cS5SZXNldCkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JTU1fV2FpdCgxMCk7Ci0gICAgfQorCS8qIFdhaXQgdW50aWwgRlRRIGlzIHJlYWR5ICovCisJZm9yIChqID0gMDsgaiA8IDIwMDA7IGorKykgeworCQlpZiAoUkVHX1JEIChwRGV2aWNlLCBGdHEuUmVzZXQpID09IDApCisJCQlicmVhazsKKwkJTU1fV2FpdCAoMTApOworCX0KIAotICAgIGlmKGogPj0gMjAwMCkKLSAgICB7Ci0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotICAgIH0KKwlpZiAoaiA+PSAyMDAwKSB7CisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwl9CiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSBTdGFuZGFyZCBSZWNlaXZlIFJDQi4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uU3RkUmN2UmNiLkhvc3RSaW5nQWRkci5IaWdoLAotCXBEZXZpY2UtPlJ4U3RkQmRQaHkuSGlnaCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi5Ib3N0UmluZ0FkZHIuTG93LAotCXBEZXZpY2UtPlJ4U3RkQmRQaHkuTG93KTsKLSAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uU3RkUmN2UmNiLnUuTWF4TGVuX0ZsYWdzLAotCU1BWF9TVERfUkNWX0JVRkZFUl9TSVpFIDw8IDE2KTsKKwkvKiBJbml0aWFsaXplIHRoZSBTdGFuZGFyZCBSZWNlaXZlIFJDQi4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi5Ib3N0UmluZ0FkZHIuSGlnaCwKKwkJcERldmljZS0+UnhTdGRCZFBoeS5IaWdoKTsKKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi5Ib3N0UmluZ0FkZHIuTG93LAorCQlwRGV2aWNlLT5SeFN0ZEJkUGh5Lkxvdyk7CisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5TdGRSY3ZSY2IudS5NYXhMZW5fRmxhZ3MsCisJCU1BWF9TVERfUkNWX0JVRkZFUl9TSVpFIDw8IDE2KTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIEp1bWJvIFJlY2VpdmUgUkNCLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi51Lk1heExlbl9GbGFncywKLQlUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEKTsKKwkvKiBJbml0aWFsaXplIHRoZSBKdW1ibyBSZWNlaXZlIFJDQi4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLnUuTWF4TGVuX0ZsYWdzLAorCQlUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEKTsKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLkhvc3RSaW5nQWRkci5IaWdoLAotCXBEZXZpY2UtPlJ4SnVtYm9CZFBoeS5IaWdoKTsKLSAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uSnVtYm9SY3ZSY2IuSG9zdFJpbmdBZGRyLkxvdywKLQlwRGV2aWNlLT5SeEp1bWJvQmRQaHkuTG93KTsKKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLkhvc3RSaW5nQWRkci5IaWdoLAorCQlwRGV2aWNlLT5SeEp1bWJvQmRQaHkuSGlnaCk7CisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi5Ib3N0UmluZ0FkZHIuTG93LAorCQlwRGV2aWNlLT5SeEp1bWJvQmRQaHkuTG93KTsKIAotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi51Lk1heExlbl9GbGFncywgMCk7CisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi51Lk1heExlbl9GbGFncywgMCk7CiAKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgTWluaSBSZWNlaXZlIFJDQi4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uTWluaVJjdlJjYi51Lk1heExlbl9GbGFncywKLQlUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEKTsKKwkvKiBJbml0aWFsaXplIHRoZSBNaW5pIFJlY2VpdmUgUkNCLiAqLworCVJFR19XUiAocERldmljZSwgUmN2RGF0YUJkSW4uTWluaVJjdlJjYi51Lk1heExlbl9GbGFncywKKwkJVDNfUkNCX0ZMQUdfUklOR19ESVNBQkxFRCk7CiAKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi5OaWNSaW5nQWRkciwKLQkgICAgKExNX1VJTlQzMikgVDNfTklDX1NURF9SQ1ZfQlVGRkVSX0RFU0NfQUREUik7Ci0JUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLk5pY1JpbmdBZGRyLAotCSAgICAoTE1fVUlOVDMyKSBUM19OSUNfSlVNQk9fUkNWX0JVRkZFUl9ERVNDX0FERFIpOwotICAgIH0KKwl7CisJCVJFR19XUiAocERldmljZSwgUmN2RGF0YUJkSW4uU3RkUmN2UmNiLk5pY1JpbmdBZGRyLAorCQkJKExNX1VJTlQzMikgVDNfTklDX1NURF9SQ1ZfQlVGRkVSX0RFU0NfQUREUik7CisJCVJFR19XUiAocERldmljZSwgUmN2RGF0YUJkSW4uSnVtYm9SY3ZSY2IuTmljUmluZ0FkZHIsCisJCQkoTE1fVUlOVDMyKSBUM19OSUNfSlVNQk9fUkNWX0JVRkZFUl9ERVNDX0FERFIpOworCX0KIAotICAgIC8qIFJlY2VpdmUgQkQgUmluZyByZXBsZW5pc2ggdGhyZXNob2xkLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZCZEluLlN0ZFJjdlRocmVzaG9sZCwgcERldmljZS0+UnhTdGREZXNjQ250LzgpOworCS8qIFJlY2VpdmUgQkQgUmluZyByZXBsZW5pc2ggdGhyZXNob2xkLiAqLworCVJFR19XUiAocERldmljZSwgUmN2QmRJbi5TdGRSY3ZUaHJlc2hvbGQsIHBEZXZpY2UtPlJ4U3RkRGVzY0NudCAvIDgpOwogI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKLSAgICBSRUdfV1IocERldmljZSwgUmN2QmRJbi5KdW1ib1JjdlRocmVzaG9sZCwgcERldmljZS0+UnhKdW1ib0Rlc2NDbnQvOCk7Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCVJFR19XUiAocERldmljZSwgUmN2QmRJbi5KdW1ib1JjdlRocmVzaG9sZCwKKwkJcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgLyA4KTsKKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCiAKLSAgICAvKiBEaXNhYmxlIGFsbCB0aGUgdW51c2VkIHJpbmdzLiAqLwotICAgIGZvcihqID0gMDsgaiA8IFQzX01BWF9TRU5EX1JDQl9DT1VOVDsgaisrKSB7Ci0JTUVNX1dSKHBEZXZpY2UsIFNlbmRSY2Jbal0udS5NYXhMZW5fRmxhZ3MsIFQzX1JDQl9GTEFHX1JJTkdfRElTQUJMRUQpOwotICAgIH0gLyogZm9yICovCisJLyogRGlzYWJsZSBhbGwgdGhlIHVudXNlZCByaW5ncy4gKi8KKwlmb3IgKGogPSAwOyBqIDwgVDNfTUFYX1NFTkRfUkNCX0NPVU5UOyBqKyspIHsKKwkJTUVNX1dSIChwRGV2aWNlLCBTZW5kUmNiW2pdLnUuTWF4TGVuX0ZsYWdzLAorCQkJVDNfUkNCX0ZMQUdfUklOR19ESVNBQkxFRCk7CisJfQkJCS8qIGZvciAqLwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgaW5kaWNlcy4gKi8KLSAgICBwRGV2aWNlLT5TZW5kUHJvZElkeCA9IDA7Ci0gICAgcERldmljZS0+U2VuZENvbklkeCA9IDA7CisJLyogSW5pdGlhbGl6ZSB0aGUgaW5kaWNlcy4gKi8KKwlwRGV2aWNlLT5TZW5kUHJvZElkeCA9IDA7CisJcERldmljZS0+U2VuZENvbklkeCA9IDA7CiAKLSAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5TZW5kSG9zdFByb2RJZHhbMF0uTG93LCAwKTsKLSAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5TZW5kTmljUHJvZElkeFswXS5Mb3csIDApOworCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5TZW5kSG9zdFByb2RJZHhbMF0uTG93LCAwKTsKKwlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guU2VuZE5pY1Byb2RJZHhbMF0uTG93LCAwKTsKIAotICAgIC8qIFNldCB1cCBob3N0IG9yIE5JQyBiYXNlZCBzZW5kIFJDQi4gKi8KLSAgICBpZihwRGV2aWNlLT5OaWNTZW5kQmQgPT0gRkFMU0UpCi0gICAgewotCU1FTV9XUihwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLAotCSAgICBwRGV2aWNlLT5TZW5kQmRQaHkuSGlnaCk7Ci0JTUVNX1dSKHBEZXZpY2UsIFNlbmRSY2JbMF0uSG9zdFJpbmdBZGRyLkxvdywKLQkgICAgcERldmljZS0+U2VuZEJkUGh5Lkxvdyk7CisJLyogU2V0IHVwIGhvc3Qgb3IgTklDIGJhc2VkIHNlbmQgUkNCLiAqLworCWlmIChwRGV2aWNlLT5OaWNTZW5kQmQgPT0gRkFMU0UpIHsKKwkJTUVNX1dSIChwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLAorCQkJcERldmljZS0+U2VuZEJkUGh5LkhpZ2gpOworCQlNRU1fV1IgKHBEZXZpY2UsIFNlbmRSY2JbMF0uSG9zdFJpbmdBZGRyLkxvdywKKwkJCXBEZXZpY2UtPlNlbmRCZFBoeS5Mb3cpOworCisJCS8qIFNldCB1cCB0aGUgTklDIHJpbmcgYWRkcmVzcyBpbiB0aGUgUkNCLiAqLworCQlNRU1fV1IgKHBEZXZpY2UsIFNlbmRSY2JbMF0uTmljUmluZ0FkZHIsCisJCQlUM19OSUNfU05EX0JVRkZFUl9ERVNDX0FERFIpOworCisJCS8qIFNldHVwIHRoZSBSQ0IuICovCisJCU1FTV9XUiAocERldmljZSwgU2VuZFJjYlswXS51Lk1heExlbl9GbGFncywKKwkJCVQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UIDw8IDE2KTsKKworCQlmb3IgKGsgPSAwOyBrIDwgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7IGsrKykgeworCQkJcERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuSGlnaCA9IDA7CisJCQlwRGV2aWNlLT5wU2VuZEJkVmlydFtrXS5Ib3N0QWRkci5Mb3cgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJTUVNX1dSIChwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLCAwKTsKKwkJTUVNX1dSIChwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5Mb3csIDApOworCQlNRU1fV1IgKHBEZXZpY2UsIFNlbmRSY2JbMF0uTmljUmluZ0FkZHIsCisJCQlwRGV2aWNlLT5TZW5kQmRQaHkuTG93KTsKKworCQlmb3IgKGsgPSAwOyBrIDwgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7IGsrKykgeworCQkJX19yYXdfd3JpdGVsICgwLAorCQkJCSAgICAgICYocERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuSGlnaCkpOworCQkJX19yYXdfd3JpdGVsICgwLAorCQkJCSAgICAgICYocERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuTG93KSk7CisJCQlfX3Jhd193cml0ZWwgKDAsCisJCQkJICAgICAgJihwRGV2aWNlLT5wU2VuZEJkVmlydFtrXS51MS5MZW5fRmxhZ3MpKTsKKwkJCXBEZXZpY2UtPlNoYWRvd1NlbmRCZFtrXS5Ib3N0QWRkci5IaWdoID0gMDsKKwkJCXBEZXZpY2UtPlNoYWRvd1NlbmRCZFtrXS51MS5MZW5fRmxhZ3MgPSAwOworCQl9CisJfQorCWF0b21pY19zZXQgKCZwRGV2aWNlLT5TZW5kQmRMZWZ0LCBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVCAtIDEpOworCisJLyogQ29uZmlndXJlIHRoZSByZWNlaXZlIHJldHVybiByaW5ncy4gKi8KKwlmb3IgKGogPSAwOyBqIDwgVDNfTUFYX1JDVl9SRVRVUk5fUkNCX0NPVU5UOyBqKyspIHsKKwkJTUVNX1dSIChwRGV2aWNlLCBSY3ZSZXRSY2Jbal0udS5NYXhMZW5fRmxhZ3MsCisJCQlUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEKTsKKwl9CisKKwlwRGV2aWNlLT5SY3ZSZXRDb25JZHggPSAwOworCisJTUVNX1dSIChwRGV2aWNlLCBSY3ZSZXRSY2JbMF0uSG9zdFJpbmdBZGRyLkhpZ2gsCisJCXBEZXZpY2UtPlJjdlJldEJkUGh5LkhpZ2gpOworCU1FTV9XUiAocERldmljZSwgUmN2UmV0UmNiWzBdLkhvc3RSaW5nQWRkci5Mb3csCisJCXBEZXZpY2UtPlJjdlJldEJkUGh5Lkxvdyk7CiAKIAkvKiBTZXQgdXAgdGhlIE5JQyByaW5nIGFkZHJlc3MgaW4gdGhlIFJDQi4gKi8KLQlNRU1fV1IocERldmljZSwgU2VuZFJjYlswXS5OaWNSaW5nQWRkcixUM19OSUNfU05EX0JVRkZFUl9ERVNDX0FERFIpOworCS8qIE5vdCB2ZXJ5IGNsZWFyIGZyb20gdGhlIHNwZWMuICBJIGFtIGd1ZXNzaW5nIHRoYXQgZm9yIFJlY2VpdmUgKi8KKwkvKiBSZXR1cm4gUmluZywgTmljUmluZ0FkZHIgaXMgbm90IHVzZWQuICovCisJTUVNX1dSIChwRGV2aWNlLCBSY3ZSZXRSY2JbMF0uTmljUmluZ0FkZHIsIDApOwogCiAJLyogU2V0dXAgdGhlIFJDQi4gKi8KLQlNRU1fV1IocERldmljZSwgU2VuZFJjYlswXS51Lk1heExlbl9GbGFncywKLQkgICAgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQgPDwgMTYpOworCU1FTV9XUiAocERldmljZSwgUmN2UmV0UmNiWzBdLnUuTWF4TGVuX0ZsYWdzLAorCQlUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCA8PCAxNik7CiAKLQlmb3IoayA9IDA7IGsgPCBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVDsgaysrKQotCXsKLQkgICAgcERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuSGlnaCA9IDA7Ci0JICAgIHBEZXZpY2UtPnBTZW5kQmRWaXJ0W2tdLkhvc3RBZGRyLkxvdyA9IDA7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCU1FTV9XUihwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLCAwKTsKLQlNRU1fV1IocERldmljZSwgU2VuZFJjYlswXS5Ib3N0UmluZ0FkZHIuTG93LCAwKTsKLQlNRU1fV1IocERldmljZSwgU2VuZFJjYlswXS5OaWNSaW5nQWRkciwKLQkgICAgcERldmljZS0+U2VuZEJkUGh5Lkxvdyk7Ci0KLQlmb3IoayA9IDA7IGsgPCBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVDsgaysrKQotCXsKLQkgICAgX19yYXdfd3JpdGVsKDAsICYocERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuSGlnaCkpOwotCSAgICBfX3Jhd193cml0ZWwoMCwgJihwRGV2aWNlLT5wU2VuZEJkVmlydFtrXS5Ib3N0QWRkci5Mb3cpKTsKLQkgICAgX19yYXdfd3JpdGVsKDAsICYocERldmljZS0+cFNlbmRCZFZpcnRba10udTEuTGVuX0ZsYWdzKSk7Ci0JICAgIHBEZXZpY2UtPlNoYWRvd1NlbmRCZFtrXS5Ib3N0QWRkci5IaWdoID0gMDsKLQkgICAgcERldmljZS0+U2hhZG93U2VuZEJkW2tdLnUxLkxlbl9GbGFncyA9IDA7Ci0JfQotICAgIH0KLSAgICBhdG9taWNfc2V0KCZwRGV2aWNlLT5TZW5kQmRMZWZ0LCBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVC0xKTsKLQotICAgIC8qIENvbmZpZ3VyZSB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZ3MuICovCi0gICAgZm9yKGogPSAwOyBqIDwgVDNfTUFYX1JDVl9SRVRVUk5fUkNCX0NPVU5UOyBqKyspCi0gICAgewotCU1FTV9XUihwRGV2aWNlLCBSY3ZSZXRSY2Jbal0udS5NYXhMZW5fRmxhZ3MsIFQzX1JDQl9GTEFHX1JJTkdfRElTQUJMRUQpOwotICAgIH0KLQotICAgIHBEZXZpY2UtPlJjdlJldENvbklkeCA9IDA7Ci0KLSAgICBNRU1fV1IocERldmljZSwgUmN2UmV0UmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLAotCXBEZXZpY2UtPlJjdlJldEJkUGh5LkhpZ2gpOwotICAgIE1FTV9XUihwRGV2aWNlLCBSY3ZSZXRSY2JbMF0uSG9zdFJpbmdBZGRyLkxvdywKLQlwRGV2aWNlLT5SY3ZSZXRCZFBoeS5Mb3cpOwotCi0gICAgLyogU2V0IHVwIHRoZSBOSUMgcmluZyBhZGRyZXNzIGluIHRoZSBSQ0IuICovCi0gICAgLyogTm90IHZlcnkgY2xlYXIgZnJvbSB0aGUgc3BlYy4gIEkgYW0gZ3Vlc3NpbmcgdGhhdCBmb3IgUmVjZWl2ZSAqLwotICAgIC8qIFJldHVybiBSaW5nLCBOaWNSaW5nQWRkciBpcyBub3QgdXNlZC4gKi8KLSAgICBNRU1fV1IocERldmljZSwgUmN2UmV0UmNiWzBdLk5pY1JpbmdBZGRyLCAwKTsKLQotICAgIC8qIFNldHVwIHRoZSBSQ0IuICovCi0gICAgTUVNX1dSKHBEZXZpY2UsIFJjdlJldFJjYlswXS51Lk1heExlbl9GbGFncywKLQlUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCA8PCAxNik7Ci0KLSAgICAvKiBSZWluaXRpYWxpemUgUlggcmluZyBwcm9kdWNlciBpbmRleCAqLwotICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlJjdlN0ZFByb2RJZHguTG93LCAwKTsKLSAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5SY3ZKdW1ib1Byb2RJZHguTG93LCAwKTsKLSAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5SY3ZNaW5pUHJvZElkeC5Mb3csIDApOworCS8qIFJlaW5pdGlhbGl6ZSBSWCByaW5nIHByb2R1Y2VyIGluZGV4ICovCisJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlJjdlN0ZFByb2RJZHguTG93LCAwKTsKKwlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guUmN2SnVtYm9Qcm9kSWR4LkxvdywgMCk7CisJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlJjdk1pbmlQcm9kSWR4LkxvdywgMCk7CiAKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgcERldmljZS0+UnhKdW1ib1Byb2RJZHggPSAwOwotICAgIHBEZXZpY2UtPlJ4SnVtYm9RdWV1ZWRDbnQgPSAwOworCXBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4ID0gMDsKKwlwRGV2aWNlLT5SeEp1bWJvUXVldWVkQ250ID0gMDsKICNlbmRpZgogCi0gICAgLyogUmVpbml0aWFsaXplIG91ciBjb3B5IG9mIHRoZSBpbmRpY2VzLiAqLwotICAgIHBEZXZpY2UtPlJ4U3RkUHJvZElkeCA9IDA7Ci0gICAgcERldmljZS0+UnhTdGRRdWV1ZWRDbnQgPSAwOworCS8qIFJlaW5pdGlhbGl6ZSBvdXIgY29weSBvZiB0aGUgaW5kaWNlcy4gKi8KKwlwRGV2aWNlLT5SeFN0ZFByb2RJZHggPSAwOworCXBEZXZpY2UtPlJ4U3RkUXVldWVkQ250ID0gMDsKIAogI2lmIFQzX0pVTUJPX1JDVl9FTlRSWV9DT1VOVAotICAgIHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4ID0gMDsKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfRU5UUllfQ09VTlQgKi8KKwlwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCA9IDA7CisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX0VOVFJZX0NPVU5UICovCiAKLSAgICAvKiBDb25maWd1cmUgdGhlIE1BQyBhZGRyZXNzLiAqLwotICAgIExNX1NldE1hY0FkZHJlc3MocERldmljZSwgcERldmljZS0+Tm9kZUFkZHJlc3MpOworCS8qIENvbmZpZ3VyZSB0aGUgTUFDIGFkZHJlc3MuICovCisJTE1fU2V0TWFjQWRkcmVzcyAocERldmljZSwgcERldmljZS0+Tm9kZUFkZHJlc3MpOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJhbnNtaXQgcmFuZG9tIGJhY2tvZmYgc2VlZC4gKi8KLSAgICBWYWx1ZTMyID0gKHBEZXZpY2UtPk5vZGVBZGRyZXNzWzBdICsgcERldmljZS0+Tm9kZUFkZHJlc3NbMV0gKwotCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzJdICsgcERldmljZS0+Tm9kZUFkZHJlc3NbM10gKwotCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdICsgcERldmljZS0+Tm9kZUFkZHJlc3NbNV0pICYKLQlNQUNfVFhfQkFDS09GRl9TRUVEX01BU0s7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhCYWNrb2ZmU2VlZCwgVmFsdWUzMik7CisJLyogSW5pdGlhbGl6ZSB0aGUgdHJhbnNtaXQgcmFuZG9tIGJhY2tvZmYgc2VlZC4gKi8KKwlWYWx1ZTMyID0gKHBEZXZpY2UtPk5vZGVBZGRyZXNzWzBdICsgcERldmljZS0+Tm9kZUFkZHJlc3NbMV0gKworCQkgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSArIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdICsKKwkJICAgcERldmljZS0+Tm9kZUFkZHJlc3NbNF0gKyBwRGV2aWNlLT5Ob2RlQWRkcmVzc1s1XSkgJgorCSAgICBNQUNfVFhfQkFDS09GRl9TRUVEX01BU0s7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlR4QmFja29mZlNlZWQsIFZhbHVlMzIpOwogCi0gICAgLyogUmVjZWl2ZSBNVFUuICBGcmFtZXMgbGFyZ2VyIHRoYW4gdGhlIE1UVSBpcyBtYXJrZWQgYXMgb3ZlcnNpemVkLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk10dVNpemUsIHBEZXZpY2UtPlJ4TXR1ICsgOCk7ICAgLyogQ1JDICsgVkxBTi4gKi8KKwkvKiBSZWNlaXZlIE1UVS4gIEZyYW1lcyBsYXJnZXIgdGhhbiB0aGUgTVRVIGlzIG1hcmtlZCBhcyBvdmVyc2l6ZWQuICovCisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk10dVNpemUsIHBEZXZpY2UtPlJ4TXR1ICsgOCk7CS8qIENSQyArIFZMQU4uICovCiAKLSAgICAvKiBDb25maWd1cmUgVGltZSBzbG90L0lQRyBwZXIgODAyLjMgKi8KLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeExlbmd0aHMsIDB4MjYyMCk7CisJLyogQ29uZmlndXJlIFRpbWUgc2xvdC9JUEcgcGVyIDgwMi4zICovCisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlR4TGVuZ3RocywgMHgyNjIwKTsKIAotICAgIC8qCi0gICAgICogQ29uZmlndXJlIFJlY2VpdmUgUnVsZXMgc28gdGhhdCBwYWNrZXRzIGRvbid0IG1hdGNoCi0gICAgICogUHJvZ3JhbW1ibGUgcnVsZSB3aWxsIGJlIHF1ZXVlZCB0byBSZXR1cm4gUmluZyAxCi0gICAgICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZUNmZywgUlhfUlVMRV9ERUZBVUxUX0NMQVNTKTsKKwkvKgorCSAqIENvbmZpZ3VyZSBSZWNlaXZlIFJ1bGVzIHNvIHRoYXQgcGFja2V0cyBkb24ndCBtYXRjaAorCSAqIFByb2dyYW1tYmxlIHJ1bGUgd2lsbCBiZSBxdWV1ZWQgdG8gUmV0dXJuIFJpbmcgMQorCSAqLworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlQ2ZnLCBSWF9SVUxFX0RFRkFVTFRfQ0xBU1MpOwogCi0gICAgLyoKLSAgICAgKiBDb25maWd1cmUgdG8gaGF2ZSAxNiBDbGFzc2VzIG9mIFNlcnZpY2VzIChDT1MpIGFuZCBvbmUKLSAgICAgKiBxdWV1ZSBwZXIgY2xhc3MuICBCYWQgZnJhbWVzIGFyZSBxdWV1ZWQgdG8gUlJSIzEuCi0gICAgICogQW5kIGZyYW1lcyBkb24ndCBtYXRjaCBydWxlcyBhcmUgYWxzbyBxdWV1ZWQgdG8gQ09TIzEuCi0gICAgICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RQbG10LkNvbmZpZywgMHgxODEpOworCS8qCisJICogQ29uZmlndXJlIHRvIGhhdmUgMTYgQ2xhc3NlcyBvZiBTZXJ2aWNlcyAoQ09TKSBhbmQgb25lCisJICogcXVldWUgcGVyIGNsYXNzLiAgQmFkIGZyYW1lcyBhcmUgcXVldWVkIHRvIFJSUiMxLgorCSAqIEFuZCBmcmFtZXMgZG9uJ3QgbWF0Y2ggcnVsZXMgYXJlIGFsc28gcXVldWVkIHRvIENPUyMxLgorCSAqLworCVJFR19XUiAocERldmljZSwgUmN2TGlzdFBsbXQuQ29uZmlnLCAweDE4MSk7CiAKLSAgICAvKiBFbmFibGUgUmVjZWl2ZSBQbGFjZW1lbnQgU3RhdGlzdGljcyAqLwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0UGxtdC5TdGF0c0VuYWJsZU1hc2ssMHhmZmZmZmYpOwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0UGxtdC5TdGF0c0N0cmwsIFJDVl9MSVNUX1NUQVRTX0VOQUJMRSk7CisJLyogRW5hYmxlIFJlY2VpdmUgUGxhY2VtZW50IFN0YXRpc3RpY3MgKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RQbG10LlN0YXRzRW5hYmxlTWFzaywgMHhmZmZmZmYpOworCVJFR19XUiAocERldmljZSwgUmN2TGlzdFBsbXQuU3RhdHNDdHJsLCBSQ1ZfTElTVF9TVEFUU19FTkFCTEUpOwogCi0gICAgLyogRW5hYmxlIFNlbmQgRGF0YSBJbml0YXRvciBTdGF0aXN0aWNzICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFNuZERhdGFJbi5TdGF0c0VuYWJsZU1hc2ssMHhmZmZmZmYpOwotICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhSW4uU3RhdHNDdHJsLAotCVQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRU5BQkxFIHwgXAotCVQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRkFTVEVSX1VQREFURSk7CisJLyogRW5hYmxlIFNlbmQgRGF0YSBJbml0YXRvciBTdGF0aXN0aWNzICovCisJUkVHX1dSIChwRGV2aWNlLCBTbmREYXRhSW4uU3RhdHNFbmFibGVNYXNrLCAweGZmZmZmZik7CisJUkVHX1dSIChwRGV2aWNlLCBTbmREYXRhSW4uU3RhdHNDdHJsLAorCQlUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0VOQUJMRSB8CisJCVQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRkFTVEVSX1VQREFURSk7CiAKLSAgICAvKiBEaXNhYmxlIHRoZSBob3N0IGNvYWxlc2Npbmcgc3RhdGUgbWFjaGluZSBiZWZvcmUgY29uZmlndXJpbmcgaXQncyAqLwotICAgIC8qIHBhcmFtZXRlcnMuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlLCAwKTsKLSAgICBmb3IoaiA9IDA7IGogPCAyMDAwOyBqKyspCi0gICAgewotCVZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgSG9zdENvYWxlc2NlLk1vZGUpOwotCWlmKCEoVmFsdWUzMiAmIEhPU1RfQ09BTEVTQ0VfRU5BQkxFKSkKLQl7Ci0JICAgIGJyZWFrOworCS8qIERpc2FibGUgdGhlIGhvc3QgY29hbGVzY2luZyBzdGF0ZSBtYWNoaW5lIGJlZm9yZSBjb25maWd1cmluZyBpdCdzICovCisJLyogcGFyYW1ldGVycy4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlLCAwKTsKKwlmb3IgKGogPSAwOyBqIDwgMjAwMDsgaisrKSB7CisJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlKTsKKwkJaWYgKCEoVmFsdWUzMiAmIEhPU1RfQ09BTEVTQ0VfRU5BQkxFKSkgeworCQkJYnJlYWs7CisJCX0KKwkJTU1fV2FpdCAoMTApOwogCX0KLQlNTV9XYWl0KDEwKTsKLSAgICB9CiAKLSAgICAvKiBIb3N0IGNvYWxlc2NpbmcgY29uZmlndXJhdGlvbnMuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5SeENvYWxlc2NpbmdUaWNrcywgcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MpOwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuVHhDb2FsZXNjaW5nVGlja3MsIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzKTsKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlJ4TWF4Q29hbGVzY2VkRnJhbWVzLAotCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzKTsKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlR4TWF4Q29hbGVzY2VkRnJhbWVzLAotCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzKTsKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlJ4Q29hbGVzY2VkVGlja0R1cmluZ0ludCwKLQlwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5UeENvYWxlc2NlZFRpY2tEdXJpbmdJbnQsCi0JcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQpOwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuUnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQsCi0JcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQpOwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuVHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQsCi0JcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQpOworCS8qIEhvc3QgY29hbGVzY2luZyBjb25maWd1cmF0aW9ucy4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5SeENvYWxlc2NpbmdUaWNrcywKKwkJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MpOworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlR4Q29hbGVzY2luZ1RpY2tzLAorCQlwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyk7CisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuUnhNYXhDb2FsZXNjZWRGcmFtZXMsCisJCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5UeE1heENvYWxlc2NlZEZyYW1lcywKKwkJcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXMpOworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlJ4Q29hbGVzY2VkVGlja0R1cmluZ0ludCwKKwkJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQpOworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlR4Q29hbGVzY2VkVGlja0R1cmluZ0ludCwKKwkJcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQpOworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50LAorCQlwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCk7CisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuVHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQsCisJCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50KTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXR1cyBibG9jay4gIFRoZSBOSUMgd2lsbCBETUEgKi8KLSAgICAvKiB0aGUgc3RhdHVzIGJsb2NrIHRvIHRoaXMgbWVtb3J5IHdoaWNoIHJlc2lkZXMgb24gdGhlIGhvc3QuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0dXNCbGtIb3N0QWRkci5IaWdoLAotCXBEZXZpY2UtPlN0YXR1c0Jsa1BoeS5IaWdoKTsKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXR1c0Jsa0hvc3RBZGRyLkxvdywKLQlwRGV2aWNlLT5TdGF0dXNCbGtQaHkuTG93KTsKKwkvKiBJbml0aWFsaXplIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGF0dXMgYmxvY2suICBUaGUgTklDIHdpbGwgRE1BICovCisJLyogdGhlIHN0YXR1cyBibG9jayB0byB0aGlzIG1lbW9yeSB3aGljaCByZXNpZGVzIG9uIHRoZSBob3N0LiAqLworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXR1c0Jsa0hvc3RBZGRyLkhpZ2gsCisJCXBEZXZpY2UtPlN0YXR1c0Jsa1BoeS5IaWdoKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0dXNCbGtIb3N0QWRkci5Mb3csCisJCXBEZXZpY2UtPlN0YXR1c0Jsa1BoeS5Mb3cpOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhdGlzdGljcyBibG9jay4gIFRoZSBOSUMgd2lsbCBETUEgKi8KLSAgICAvKiB0aGUgc3RhdGlzdGljcyB0byB0aGlzIGJsb2NrIG9mIG1lbW9yeS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXRzQmxrSG9zdEFkZHIuSGlnaCwKLQlwRGV2aWNlLT5TdGF0c0Jsa1BoeS5IaWdoKTsKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXRzQmxrSG9zdEFkZHIuTG93LAotCXBEZXZpY2UtPlN0YXRzQmxrUGh5Lkxvdyk7CisJLyogSW5pdGlhbGl6ZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhdGlzdGljcyBibG9jay4gIFRoZSBOSUMgd2lsbCBETUEgKi8KKwkvKiB0aGUgc3RhdGlzdGljcyB0byB0aGlzIGJsb2NrIG9mIG1lbW9yeS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0c0Jsa0hvc3RBZGRyLkhpZ2gsCisJCXBEZXZpY2UtPlN0YXRzQmxrUGh5LkhpZ2gpOworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXRzQmxrSG9zdEFkZHIuTG93LAorCQlwRGV2aWNlLT5TdGF0c0Jsa1BoeS5Mb3cpOwogCi0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0c0NvYWxlc2NpbmdUaWNrcywKLQlwRGV2aWNlLT5TdGF0c0NvYWxlc2NpbmdUaWNrcyk7CisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHNDb2FsZXNjaW5nVGlja3MsCisJCXBEZXZpY2UtPlN0YXRzQ29hbGVzY2luZ1RpY2tzKTsKIAotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHNCbGtOaWNBZGRyLCAweDMwMCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0dXNCbGtOaWNBZGRyLDB4YjAwKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0c0Jsa05pY0FkZHIsIDB4MzAwKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0dXNCbGtOaWNBZGRyLCAweGIwMCk7CiAKLSAgICAvKiBFbmFibGUgSG9zdCBDb2FsZXNpbmcgc3RhdGUgbWFjaGluZSAqLwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSwgSE9TVF9DT0FMRVNDRV9FTkFCTEUgfAotCXBEZXZpY2UtPkNvYWxlc2NlTW9kZSk7CisJLyogRW5hYmxlIEhvc3QgQ29hbGVzaW5nIHN0YXRlIG1hY2hpbmUgKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlLCBIT1NUX0NPQUxFU0NFX0VOQUJMRSB8CisJCXBEZXZpY2UtPkNvYWxlc2NlTW9kZSk7CiAKLSAgICAvKiBFbmFibGUgdGhlIFJlY2VpdmUgQkQgQ29tcGxldGlvbiBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSwgUkNWX0JEX0NPTVBfTU9ERV9FTkFCTEUgfAotCVJDVl9CRF9DT01QX01PREVfQVRUTl9FTkFCTEUpOworCS8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBCRCBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSwgUkNWX0JEX0NPTVBfTU9ERV9FTkFCTEUgfAorCQlSQ1ZfQkRfQ09NUF9NT0RFX0FUVE5fRU5BQkxFKTsKIAotICAgIC8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBMaXN0IFBsYWNlbWVudCBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Nb2RlLCBSQ1ZfTElTVF9QTE1UX01PREVfRU5BQkxFKTsKKwkvKiBFbmFibGUgdGhlIFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQgc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUsIFJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEUpOwogCi0gICAgLyogRW5hYmxlIHRoZSBSZWNlaXZlIExpc3QgU2VsZWN0b3Igc3RhdGUgbWFjaGluZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFNlbC5Nb2RlLCBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUgfAotCVJDVl9MSVNUX1NFTF9NT0RFX0FUVE5fRU5BQkxFKTsKKwkvKiBFbmFibGUgdGhlIFJlY2VpdmUgTGlzdCBTZWxlY3RvciBzdGF0ZSBtYWNoaW5lLiAqLworCVJFR19XUiAocERldmljZSwgUmN2TGlzdFNlbC5Nb2RlLCBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUgfAorCQlSQ1ZfTElTVF9TRUxfTU9ERV9BVFROX0VOQUJMRSk7CiAKLSAgICAvKiBFbmFibGUgdHJhbnNtaXQgRE1BLCBjbGVhciBzdGF0aXN0aWNzLiAqLwotICAgIHBEZXZpY2UtPk1hY01vZGUgPSAgTUFDX01PREVfRU5BQkxFX1RYX1NUQVRJU1RJQ1MgfAotCU1BQ19NT0RFX0VOQUJMRV9SWF9TVEFUSVNUSUNTIHwgTUFDX01PREVfRU5BQkxFX1RERSB8Ci0JTUFDX01PREVfRU5BQkxFX1JERSB8IE1BQ19NT0RFX0VOQUJMRV9GSERFOwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUgfAotCU1BQ19NT0RFX0NMRUFSX1JYX1NUQVRJU1RJQ1MgfCBNQUNfTU9ERV9DTEVBUl9UWF9TVEFUSVNUSUNTKTsKKwkvKiBFbmFibGUgdHJhbnNtaXQgRE1BLCBjbGVhciBzdGF0aXN0aWNzLiAqLworCXBEZXZpY2UtPk1hY01vZGUgPSBNQUNfTU9ERV9FTkFCTEVfVFhfU1RBVElTVElDUyB8CisJICAgIE1BQ19NT0RFX0VOQUJMRV9SWF9TVEFUSVNUSUNTIHwgTUFDX01PREVfRU5BQkxFX1RERSB8CisJICAgIE1BQ19NT0RFX0VOQUJMRV9SREUgfCBNQUNfTU9ERV9FTkFCTEVfRkhERTsKKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSB8CisJCU1BQ19NT0RFX0NMRUFSX1JYX1NUQVRJU1RJQ1MgfCBNQUNfTU9ERV9DTEVBUl9UWF9TVEFUSVNUSUNTKTsKIAotICAgIC8qIEdSQyBtaXNjZWxsYW5lb3VzIGxvY2FsIGNvbnRyb2wgcmVnaXN0ZXIuICovCi0gICAgcERldmljZS0+R3JjTG9jYWxDdHJsID0gR1JDX01JU0NfTE9DQUxfQ1RSTF9JTlRfT05fQVRUTiB8Ci0JR1JDX01JU0NfTE9DQUxfQ1RSTF9BVVRPX1NFRVBST007CisJLyogR1JDIG1pc2NlbGxhbmVvdXMgbG9jYWwgY29udHJvbCByZWdpc3Rlci4gKi8KKwlwRGV2aWNlLT5HcmNMb2NhbEN0cmwgPSBHUkNfTUlTQ19MT0NBTF9DVFJMX0lOVF9PTl9BVFROIHwKKwkgICAgR1JDX01JU0NfTE9DQUxfQ1RSTF9BVVRPX1NFRVBST007CiAKLSAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCi0gICAgewotCXBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8PSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKLQkgICAgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDE7Ci0gICAgfQotCi0gICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCk7Ci0gICAgTU1fV2FpdCg0MCk7Ci0KLSAgICAvKiBSZXNldCBSWCBjb3VudGVycy4gKi8KLSAgICBmb3IoaiA9IDA7IGogPCBzaXplb2YoTE1fUlhfQ09VTlRFUlMpOyBqKyspCi0gICAgewotCSgoUExNX1VJTlQ4KSAmcERldmljZS0+UnhDb3VudGVycylbal0gPSAwOwotICAgIH0KLQotICAgIC8qIFJlc2V0IFRYIGNvdW50ZXJzLiAqLwotICAgIGZvcihqID0gMDsgaiA8IHNpemVvZihMTV9UWF9DT1VOVEVSUyk7IGorKykKLSAgICB7Ci0JKChQTE1fVUlOVDgpICZwRGV2aWNlLT5UeENvdW50ZXJzKVtqXSA9IDA7Ci0gICAgfQotCi0gICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guSW50ZXJydXB0WzBdLkxvdywgMCk7Ci0KLSAgICAvKiBFbmFibGUgdGhlIERNQSBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIERtYUNvbXAuTW9kZSwgRE1BX0NPTVBfTU9ERV9FTkFCTEUpOwotCi0gICAgLyogRW5hYmxlIHRoZSBETUEgV3JpdGUgc3RhdGUgbWFjaGluZS4gKi8KLSAgICBWYWx1ZTMyID0gRE1BX1dSSVRFX01PREVfRU5BQkxFIHwKLQlETUFfV1JJVEVfTU9ERV9UQVJHRVRfQUJPUlRfQVRUTl9FTkFCTEUgfAotCURNQV9XUklURV9NT0RFX01BU1RFUl9BQk9SVF9BVFROX0VOQUJMRSB8Ci0JRE1BX1dSSVRFX01PREVfUEFSSVRZX0VSUk9SX0FUVE5fRU5BQkxFIHwKLQlETUFfV1JJVEVfTU9ERV9BRERSX09WRVJGTE9XX0FUVE5fRU5BQkxFIHwKLQlETUFfV1JJVEVfTU9ERV9GSUZPX09WRVJSVU5fQVRUTl9FTkFCTEUgfAotCURNQV9XUklURV9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgfAotCURNQV9XUklURV9NT0RFX0ZJRk9fT1ZFUlJFQURfQVRUTl9FTkFCTEUgfAotCURNQV9XUklURV9NT0RFX0xPTkdfUkVBRF9BVFROX0VOQUJMRTsKLSAgICBSRUdfV1IocERldmljZSwgRG1hV3JpdGUuTW9kZSwgVmFsdWUzMik7Ci0KLSAgICBpZiAoIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKQotICAgIHsKLQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkKLQl7Ci0JICAgIFZhbHVlMTYgPSBSRUdfUkQocERldmljZSwgUGNpQ2ZnLlBjaVhDb21tYW5kKTsKLQkgICAgVmFsdWUxNiAmPSB+KFBDSVhfQ01EX01BWF9TUExJVF9NQVNLIHwgUENJWF9DTURfTUFYX0JVUlNUX01BU0spOwotCSAgICBWYWx1ZTE2IHw9ICgoUENJWF9DTURfTUFYX0JVUlNUX0NQSU9CIDw8IFBDSVhfQ01EX01BWF9CVVJTVF9TSEwpICYKLQkJUENJWF9DTURfTUFYX0JVUlNUX01BU0spOwotCSAgICBpZiAocERldmljZS0+U3BsaXRNb2RlRW5hYmxlID09IFNQTElUX01PREVfRU5BQkxFKQotCSAgICB7Ci0JCVZhbHVlMTYgfD0gKHBEZXZpY2UtPlNwbGl0TW9kZU1heFJlcSA8PCBQQ0lYX0NNRF9NQVhfU1BMSVRfU0hMKQotCQkgICAmIFBDSVhfQ01EX01BWF9TUExJVF9NQVNLOwotCSAgICB9Ci0JICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuUGNpWENvbW1hbmQsIFZhbHVlMTYpOworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCXBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8PSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKKwkJICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxOwogCX0KLSAgICB9CiAKLSAgICAvKiBFbmFibGUgdGhlIFJlYWQgRE1BIHN0YXRlIG1hY2hpbmUuICovCi0gICAgVmFsdWUzMiA9IERNQV9SRUFEX01PREVfRU5BQkxFIHwKLQlETUFfUkVBRF9NT0RFX1RBUkdFVF9BQk9SVF9BVFROX0VOQUJMRSB8Ci0JRE1BX1JFQURfTU9ERV9NQVNURVJfQUJPUlRfQVRUTl9FTkFCTEUgfAotCURNQV9SRUFEX01PREVfUEFSSVRZX0VSUk9SX0FUVE5fRU5BQkxFIHwKLQlETUFfUkVBRF9NT0RFX0FERFJfT1ZFUkZMT1dfQVRUTl9FTkFCTEUgfAotCURNQV9SRUFEX01PREVfRklGT19PVkVSUlVOX0FUVE5fRU5BQkxFIHwKLQlETUFfUkVBRF9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgfAotCURNQV9SRUFEX01PREVfRklGT19PVkVSUkVBRF9BVFROX0VOQUJMRSB8Ci0JRE1BX1JFQURfTU9ERV9MT05HX1JFQURfQVRUTl9FTkFCTEU7CisJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwpOworCU1NX1dhaXQgKDQwKTsKIAotICAgIGlmIChwRGV2aWNlLT5TcGxpdE1vZGVFbmFibGUgPT0gU1BMSVRfTU9ERV9FTkFCTEUpCi0gICAgewotCVZhbHVlMzIgfD0gRE1BX1JFQURfTU9ERV9TUExJVF9FTkFCTEU7Ci0gICAgfQotICAgIFJFR19XUihwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIFZhbHVlMzIpOworCS8qIFJlc2V0IFJYIGNvdW50ZXJzLiAqLworCWZvciAoaiA9IDA7IGogPCBzaXplb2YgKExNX1JYX0NPVU5URVJTKTsgaisrKSB7CisJCSgoUExNX1VJTlQ4KSAmIHBEZXZpY2UtPlJ4Q291bnRlcnMpW2pdID0gMDsKKwl9CiAKLSAgICAvKiBFbmFibGUgdGhlIFJlY2VpdmUgRGF0YSBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFDb21wLk1vZGUsIFJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEUgfAotCVJDVl9EQVRBX0NPTVBfTU9ERV9BVFROX0VOQUJMRSk7CisJLyogUmVzZXQgVFggY291bnRlcnMuICovCisJZm9yIChqID0gMDsgaiA8IHNpemVvZiAoTE1fVFhfQ09VTlRFUlMpOyBqKyspIHsKKwkJKChQTE1fVUlOVDgpICYgcERldmljZS0+VHhDb3VudGVycylbal0gPSAwOworCX0KIAotICAgIC8qIEVuYWJsZSB0aGUgTWJ1ZiBDbHVzdGVyIEZyZWUgc3RhdGUgbWFjaGluZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUsIE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFKTsKKwlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guSW50ZXJydXB0WzBdLkxvdywgMCk7CiAKLSAgICAvKiBFbmFibGUgdGhlIFNlbmQgRGF0YSBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUsIFNORF9EQVRBX0NPTVBfTU9ERV9FTkFCTEUpOworCS8qIEVuYWJsZSB0aGUgRE1BIENvbXBsZXRpb24gc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIERtYUNvbXAuTW9kZSwgRE1BX0NPTVBfTU9ERV9FTkFCTEUpOwogCi0gICAgLyogRW5hYmxlIHRoZSBTZW5kIEJEIENvbXBsZXRpb24gc3RhdGUgbWFjaGluZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgU25kQmRDb21wLk1vZGUsIFNORF9CRF9DT01QX01PREVfRU5BQkxFIHwKLQlTTkRfQkRfQ09NUF9NT0RFX0FUVE5fRU5BQkxFKTsKKwkvKiBFbmFibGUgdGhlIERNQSBXcml0ZSBzdGF0ZSBtYWNoaW5lLiAqLworCVZhbHVlMzIgPSBETUFfV1JJVEVfTU9ERV9FTkFCTEUgfAorCSAgICBETUFfV1JJVEVfTU9ERV9UQVJHRVRfQUJPUlRfQVRUTl9FTkFCTEUgfAorCSAgICBETUFfV1JJVEVfTU9ERV9NQVNURVJfQUJPUlRfQVRUTl9FTkFCTEUgfAorCSAgICBETUFfV1JJVEVfTU9ERV9QQVJJVFlfRVJST1JfQVRUTl9FTkFCTEUgfAorCSAgICBETUFfV1JJVEVfTU9ERV9BRERSX09WRVJGTE9XX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1dSSVRFX01PREVfRklGT19PVkVSUlVOX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1dSSVRFX01PREVfRklGT19VTkRFUlJVTl9BVFROX0VOQUJMRSB8CisJICAgIERNQV9XUklURV9NT0RFX0ZJRk9fT1ZFUlJFQURfQVRUTl9FTkFCTEUgfAorCSAgICBETUFfV1JJVEVfTU9ERV9MT05HX1JFQURfQVRUTl9FTkFCTEU7CisJUkVHX1dSIChwRGV2aWNlLCBEbWFXcml0ZS5Nb2RlLCBWYWx1ZTMyKTsKIAotICAgIC8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBCRCBJbml0aWF0b3Igc3RhdGUgbWFjaGluZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2QmRJbi5Nb2RlLCBSQ1ZfQkRfSU5fTU9ERV9FTkFCTEUgfAotCVJDVl9CRF9JTl9NT0RFX0JEX0lOX0RJQUJMRURfUkNCX0FUVE5fRU5BQkxFKTsKKwlpZiAoIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKSB7CisJCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKSB7CisJCQlWYWx1ZTE2ID0gUkVHX1JEIChwRGV2aWNlLCBQY2lDZmcuUGNpWENvbW1hbmQpOworCQkJVmFsdWUxNiAmPQorCQkJICAgIH4oUENJWF9DTURfTUFYX1NQTElUX01BU0sgfAorCQkJICAgICAgUENJWF9DTURfTUFYX0JVUlNUX01BU0spOworCQkJVmFsdWUxNiB8PQorCQkJICAgICgoUENJWF9DTURfTUFYX0JVUlNUX0NQSU9CIDw8CisJCQkgICAgICBQQ0lYX0NNRF9NQVhfQlVSU1RfU0hMKSAmCisJCQkgICAgIFBDSVhfQ01EX01BWF9CVVJTVF9NQVNLKTsKKwkJCWlmIChwRGV2aWNlLT5TcGxpdE1vZGVFbmFibGUgPT0gU1BMSVRfTU9ERV9FTkFCTEUpIHsKKwkJCQlWYWx1ZTE2IHw9CisJCQkJICAgIChwRGV2aWNlLT4KKwkJCQkgICAgIFNwbGl0TW9kZU1heFJlcSA8PCBQQ0lYX0NNRF9NQVhfU1BMSVRfU0hMKQorCQkJCSAgICAmIFBDSVhfQ01EX01BWF9TUExJVF9NQVNLOworCQkJfQorCQkJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuUGNpWENvbW1hbmQsIFZhbHVlMTYpOworCQl9CisJfQogCi0gICAgLyogRW5hYmxlIHRoZSBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUsIFJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFIHwKLQlSQ1ZfREFUQV9CRF9JTl9NT0RFX0lOVkFMSURfUklOR19TSVpFKTsKKwkvKiBFbmFibGUgdGhlIFJlYWQgRE1BIHN0YXRlIG1hY2hpbmUuICovCisJVmFsdWUzMiA9IERNQV9SRUFEX01PREVfRU5BQkxFIHwKKwkgICAgRE1BX1JFQURfTU9ERV9UQVJHRVRfQUJPUlRfQVRUTl9FTkFCTEUgfAorCSAgICBETUFfUkVBRF9NT0RFX01BU1RFUl9BQk9SVF9BVFROX0VOQUJMRSB8CisJICAgIERNQV9SRUFEX01PREVfUEFSSVRZX0VSUk9SX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1JFQURfTU9ERV9BRERSX09WRVJGTE9XX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1JFQURfTU9ERV9GSUZPX09WRVJSVU5fQVRUTl9FTkFCTEUgfAorCSAgICBETUFfUkVBRF9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgfAorCSAgICBETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJFQURfQVRUTl9FTkFCTEUgfAorCSAgICBETUFfUkVBRF9NT0RFX0xPTkdfUkVBRF9BVFROX0VOQUJMRTsKIAotICAgIC8qIEVuYWJsZSB0aGUgU2VuZCBEYXRhIEluaXRpYXRvciBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSwgVDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEUpOworCWlmIChwRGV2aWNlLT5TcGxpdE1vZGVFbmFibGUgPT0gU1BMSVRfTU9ERV9FTkFCTEUpIHsKKwkJVmFsdWUzMiB8PSBETUFfUkVBRF9NT0RFX1NQTElUX0VOQUJMRTsKKwl9CisJUkVHX1dSIChwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIFZhbHVlMzIpOwogCi0gICAgLyogRW5hYmxlIHRoZSBTZW5kIEJEIEluaXRpYXRvciBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZEluLk1vZGUsIFNORF9CRF9JTl9NT0RFX0VOQUJMRSB8Ci0JU05EX0JEX0lOX01PREVfQVRUTl9FTkFCTEUpOworCS8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBEYXRhIENvbXBsZXRpb24gc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFDb21wLk1vZGUsIFJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEUgfAorCQlSQ1ZfREFUQV9DT01QX01PREVfQVRUTl9FTkFCTEUpOwogCi0gICAgLyogRW5hYmxlIHRoZSBTZW5kIEJEIFNlbGVjdG9yIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUsIFNORF9CRF9TRUxfTU9ERV9FTkFCTEUgfAotCVNORF9CRF9TRUxfTU9ERV9BVFROX0VOQUJMRSk7CisJLyogRW5hYmxlIHRoZSBNYnVmIENsdXN0ZXIgRnJlZSBzdGF0ZSBtYWNoaW5lLiAqLworCVJFR19XUiAocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUsIE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFKTsKKworCS8qIEVuYWJsZSB0aGUgU2VuZCBEYXRhIENvbXBsZXRpb24gc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUsIFNORF9EQVRBX0NPTVBfTU9ERV9FTkFCTEUpOworCisJLyogRW5hYmxlIHRoZSBTZW5kIEJEIENvbXBsZXRpb24gc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFNuZEJkQ29tcC5Nb2RlLCBTTkRfQkRfQ09NUF9NT0RFX0VOQUJMRSB8CisJCVNORF9CRF9DT01QX01PREVfQVRUTl9FTkFCTEUpOworCisJLyogRW5hYmxlIHRoZSBSZWNlaXZlIEJEIEluaXRpYXRvciBzdGF0ZSBtYWNoaW5lLiAqLworCVJFR19XUiAocERldmljZSwgUmN2QmRJbi5Nb2RlLCBSQ1ZfQkRfSU5fTU9ERV9FTkFCTEUgfAorCQlSQ1ZfQkRfSU5fTU9ERV9CRF9JTl9ESUFCTEVEX1JDQl9BVFROX0VOQUJMRSk7CisKKwkvKiBFbmFibGUgdGhlIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3Igc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUsIFJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFIHwKKwkJUkNWX0RBVEFfQkRfSU5fTU9ERV9JTlZBTElEX1JJTkdfU0laRSk7CisKKwkvKiBFbmFibGUgdGhlIFNlbmQgRGF0YSBJbml0aWF0b3Igc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFNuZERhdGFJbi5Nb2RlLCBUM19TTkRfREFUQV9JTl9NT0RFX0VOQUJMRSk7CisKKwkvKiBFbmFibGUgdGhlIFNlbmQgQkQgSW5pdGlhdG9yIHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBTbmRCZEluLk1vZGUsIFNORF9CRF9JTl9NT0RFX0VOQUJMRSB8CisJCVNORF9CRF9JTl9NT0RFX0FUVE5fRU5BQkxFKTsKKworCS8qIEVuYWJsZSB0aGUgU2VuZCBCRCBTZWxlY3RvciBzdGF0ZSBtYWNoaW5lLiAqLworCVJFR19XUiAocERldmljZSwgU25kQmRTZWwuTW9kZSwgU05EX0JEX1NFTF9NT0RFX0VOQUJMRSB8CisJCVNORF9CRF9TRUxfTU9ERV9BVFROX0VOQUJMRSk7CiAKICNpZiBJTkNMVURFXzU3MDFfQVhfRklYCi0gICAgLyogTG9hZCB0aGUgZmlybXdhcmUgZm9yIHRoZSA1NzAxX0EwIHdvcmthcm91bmQuICovCi0gICAgaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCkKLSAgICB7Ci0JTE1fTG9hZFJsc0Zpcm13YXJlKHBEZXZpY2UpOwotICAgIH0KKwkvKiBMb2FkIHRoZSBmaXJtd2FyZSBmb3IgdGhlIDU3MDFfQTAgd29ya2Fyb3VuZC4gKi8KKwlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCkgeworCQlMTV9Mb2FkUmxzRmlybXdhcmUgKHBEZXZpY2UpOworCX0KICNlbmRpZgogCi0gICAgLyogRW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KLSAgICBwRGV2aWNlLT5UeE1vZGUgPSBUWF9NT0RFX0VOQUJMRTsKLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeE1vZGUsIHBEZXZpY2UtPlR4TW9kZSk7CisJLyogRW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KKwlwRGV2aWNlLT5UeE1vZGUgPSBUWF9NT0RFX0VOQUJMRTsKKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlLCBwRGV2aWNlLT5UeE1vZGUpOwogCi0gICAgLyogRW5hYmxlIHRoZSByZWNlaXZlci4gKi8KLSAgICBwRGV2aWNlLT5SeE1vZGUgPSBSWF9NT0RFX0VOQUJMRTsKLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIHBEZXZpY2UtPlJ4TW9kZSk7CisJLyogRW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwlwRGV2aWNlLT5SeE1vZGUgPSBSWF9NT0RFX0VOQUJMRTsKKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBwRGV2aWNlLT5SeE1vZGUpOwogCi0gICAgaWYgKHBEZXZpY2UtPlJlc3RvcmVPbldha2VVcCkKLSAgICB7Ci0JcERldmljZS0+UmVzdG9yZU9uV2FrZVVwID0gRkFMU0U7Ci0JcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBwRGV2aWNlLT5XYWtlVXBEaXNhYmxlQXV0b05lZzsKLQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPSBwRGV2aWNlLT5XYWtlVXBSZXF1ZXN0ZWRNZWRpYVR5cGU7Ci0gICAgfQotCi0gICAgLyogRGlzYWJsZSBhdXRvIHBvbGxpbmcuICovCi0gICAgcERldmljZS0+TWlNb2RlID0gMHhjMDAwMDsKLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7Ci0KLSAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKLQlUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCi0gICAgewotCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWlmKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfT1VUUFVUKQotCXsKLQkgICAgVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzI7CisJaWYgKHBEZXZpY2UtPlJlc3RvcmVPbldha2VVcCkgeworCQlwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXAgPSBGQUxTRTsKKwkJcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBwRGV2aWNlLT5XYWtlVXBEaXNhYmxlQXV0b05lZzsKKwkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gcERldmljZS0+V2FrZVVwUmVxdWVzdGVkTWVkaWFUeXBlOwogCX0KLQllbHNlCi0JewotCSAgICBWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKworCS8qIERpc2FibGUgYXV0byBwb2xsaW5nLiAqLworCXBEZXZpY2UtPk1pTW9kZSA9IDB4YzAwMDA7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlKTsKKworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzE7CisJfSBlbHNlIHsKKwkJaWYgKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfT1VUUFVUKSB7CisJCQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMjsKKwkJfSBlbHNlIHsKKwkJCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOworCQl9CiAJfQotICAgIH0KLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBWYWx1ZTMyKTsKKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgVmFsdWUzMik7CiAKLSAgICAvKiBBY3RpdmF0ZSBMaW5rIHRvIGVuYWJsZSBNQUMgc3RhdGUgbWFjaGluZSAqLwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1pU3RhdHVzLCBNSV9TVEFUVVNfRU5BQkxFX0xJTktfU1RBVFVTX0FUVE4pOworCS8qIEFjdGl2YXRlIExpbmsgdG8gZW5hYmxlIE1BQyBzdGF0ZSBtYWNoaW5lICovCisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1pU3RhdHVzLCBNSV9TVEFUVVNfRU5BQkxFX0xJTktfU1RBVFVTX0FUVE4pOwogCi0gICAgaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBSWF9NT0RFX1JFU0VUKTsKLQlNTV9XYWl0KDEwKTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIHBEZXZpY2UtPlJ4TW9kZSk7Ci0JaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDNfQTEpCi0JewotCSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5TZXJkZXNDZmcsIDB4NjE2MDAwKTsKKwlpZiAocERldmljZS0+RW5hYmxlVGJpKSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIFJYX01PREVfUkVTRVQpOworCQlNTV9XYWl0ICgxMCk7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIHBEZXZpY2UtPlJ4TW9kZSk7CisJCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0ExKSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuU2VyZGVzQ2ZnLCAweDYxNjAwMCk7CisJCX0KIAl9Ci0gICAgfQotICAgIC8qIFNldHVwIHRoZSBwaHkgY2hpcC4gKi8KLSAgICBMTV9TZXR1cFBoeShwRGV2aWNlKTsKKwkvKiBTZXR1cCB0aGUgcGh5IGNoaXAuICovCisJTE1fU2V0dXBQaHkgKHBEZXZpY2UpOwogCi0gICAgaWYgKCFwRGV2aWNlLT5FbmFibGVUYmkpIHsKLQkvKiBDbGVhciBDUkMgc3RhdHMgKi8KLQlMTV9SZWFkUGh5KHBEZXZpY2UsIDB4MWUsICZWYWx1ZTMyKTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDFlLCBWYWx1ZTMyIHwgMHg4MDAwKTsKLQlMTV9SZWFkUGh5KHBEZXZpY2UsIDB4MTQsICZWYWx1ZTMyKTsKLSAgICB9CisJaWYgKCFwRGV2aWNlLT5FbmFibGVUYmkpIHsKKwkJLyogQ2xlYXIgQ1JDIHN0YXRzICovCisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIDB4MWUsICZWYWx1ZTMyKTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MWUsIFZhbHVlMzIgfCAweDgwMDApOworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCAweDE0LCAmVmFsdWUzMik7CisJfQogCi0gICAgLyogU2V0IHVwIHRoZSByZWNlaXZlIG1hc2suICovCi0gICAgTE1fU2V0UmVjZWl2ZU1hc2socERldmljZSwgcERldmljZS0+UmVjZWl2ZU1hc2spOworCS8qIFNldCB1cCB0aGUgcmVjZWl2ZSBtYXNrLiAqLworCUxNX1NldFJlY2VpdmVNYXNrIChwRGV2aWNlLCBwRGV2aWNlLT5SZWNlaXZlTWFzayk7CiAKLSAgICAvKiBRdWV1ZSBSeCBwYWNrZXQgYnVmZmVycy4gKi8KLSAgICBpZihwRGV2aWNlLT5RdWV1ZVJ4UGFja2V0cykKLSAgICB7Ci0JTE1fUXVldWVSeFBhY2tldHMocERldmljZSk7Ci0gICAgfQorCS8qIFF1ZXVlIFJ4IHBhY2tldCBidWZmZXJzLiAqLworCWlmIChwRGV2aWNlLT5RdWV1ZVJ4UGFja2V0cykgeworCQlMTV9RdWV1ZVJ4UGFja2V0cyAocERldmljZSk7CisJfQogCi0gICAgLyogRW5hYmxlIGludGVycnVwdCB0byB0aGUgaG9zdC4gKi8KLSAgICBpZihwRGV2aWNlLT5Jbml0RG9uZSkKLSAgICB7Ci0JTE1fRW5hYmxlSW50ZXJydXB0KHBEZXZpY2UpOwotICAgIH0KKwkvKiBFbmFibGUgaW50ZXJydXB0IHRvIHRoZSBob3N0LiAqLworCWlmIChwRGV2aWNlLT5Jbml0RG9uZSkgeworCQlMTV9FbmFibGVJbnRlcnJ1cHQgKHBEZXZpY2UpOworCX0KIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0gLyogTE1fUmVzZXRBZGFwdGVyICovCi0KKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX1Jlc2V0QWRhcHRlciAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI5NzksMTggKzI3NjIsMTUgQEAKIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1NUQVRVUwotTE1fRGlzYWJsZUludGVycnVwdCgKLSAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTE1fRGlzYWJsZUludGVycnVwdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsLCBwRGV2aWNlLT5NaXNjSG9zdEN0cmwgfAotCU1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCk7Ci0gICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guSW50ZXJydXB0WzBdLkxvdywgMSk7CisJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsLCBwRGV2aWNlLT5NaXNjSG9zdEN0cmwgfAorCQlNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpOworCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93LCAxKTsKIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGlzIHJvdXRpbmUgZW5hYmxlcyB0aGUgYWRhcHRlciB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzLiAgICAgICAgICAgICAgICAqLwpAQCAtMjk5OCwyNCArMjc3OCwyMCBAQAogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9FbmFibGVJbnRlcnJ1cHQoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTE1fU1RBVFVTIExNX0VuYWJsZUludGVycnVwdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsLCBwRGV2aWNlLT5NaXNjSG9zdEN0cmwgJgotCX5NSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpOwotICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIDApOworCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCwgcERldmljZS0+TWlzY0hvc3RDdHJsICYKKwkJfk1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCk7CisJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIDApOwogCi0gICAgaWYocERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyAmIFNUQVRVU19CTE9DS19VUERBVEVEKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsIHwKLQkgICAgR1JDX01JU0NfTE9DQUxfQ1RSTF9TRVRfSU5UKTsKLSAgICB9CisJaWYgKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJiBTVEFUVVNfQkxPQ0tfVVBEQVRFRCkgeworCQlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8CisJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX1NFVF9JTlQpOworCX0KIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGlzIHJvdXRpbmUgcHV0cyBhIHBhY2tldCBvbiB0aGUgd2lyZSBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IERNQSAgICAgICAqLwpAQCAtMzAyNywzMDYgKzI4MDMsMjc5IEBACiAvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZiAwCi1MTV9TVEFUVVMKLUxNX1NlbmRQYWNrZXQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCitMTV9TVEFUVVMgTE1fU2VuZFBhY2tldCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCiB7Ci0gICAgTE1fVUlOVDMyIEZyYWdDb3VudDsKLSAgICBQVDNfU05EX0JEIHBTZW5kQmQ7Ci0gICAgUFQzX1NORF9CRCBwU2hhZG93U2VuZEJkOwotICAgIExNX1VJTlQzMiBWYWx1ZTMyLCBMZW47Ci0gICAgTE1fVUlOVDMyIElkeDsKKwlMTV9VSU5UMzIgRnJhZ0NvdW50OworCVBUM19TTkRfQkQgcFNlbmRCZDsKKwlQVDNfU05EX0JEIHBTaGFkb3dTZW5kQmQ7CisJTE1fVUlOVDMyIFZhbHVlMzIsIExlbjsKKwlMTV9VSU5UMzIgSWR4OwogCi0gICAgaWYgKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgewotCXJldHVybiBMTV81NzAwU2VuZFBhY2tldChwRGV2aWNlLCBwUGFja2V0KTsKLSAgICB9CisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKKwkJcmV0dXJuIExNXzU3MDBTZW5kUGFja2V0IChwRGV2aWNlLCBwUGFja2V0KTsKKwl9CiAKLSAgICAvKiBVcGRhdGUgdGhlIFNlbmRCZExlZnQgY291bnQuICovCi0gICAgYXRvbWljX3N1YihwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOworCS8qIFVwZGF0ZSB0aGUgU2VuZEJkTGVmdCBjb3VudC4gKi8KKwlhdG9taWNfc3ViIChwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOwogCi0gICAgLyogSW5pdGFsaXplIHRoZSBzZW5kIGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KLSAgICBJZHggPSBwRGV2aWNlLT5TZW5kUHJvZElkeDsKKwkvKiBJbml0YWxpemUgdGhlIHNlbmQgYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworCUlkeCA9IHBEZXZpY2UtPlNlbmRQcm9kSWR4OwogCi0gICAgcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFtJZHhdOworCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbSWR4XTsKIAotICAgIC8qIE5leHQgcHJvZHVjZXIgaW5kZXguICovCi0gICAgaWYgKHBEZXZpY2UtPk5pY1NlbmRCZCA9PSBUUlVFKQotICAgIHsKLQlUM182NEJJVF9IT1NUX0FERFIgcGFkZHI7CisJLyogTmV4dCBwcm9kdWNlciBpbmRleC4gKi8KKwlpZiAocERldmljZS0+TmljU2VuZEJkID09IFRSVUUpIHsKKwkJVDNfNjRCSVRfSE9TVF9BRERSIHBhZGRyOwogCi0JcFNoYWRvd1NlbmRCZCA9ICZwRGV2aWNlLT5TaGFkb3dTZW5kQmRbSWR4XTsKLQlmb3IoRnJhZ0NvdW50ID0gMDsgOyApCi0JewotCSAgICBNTV9NYXBUeERtYShwRGV2aWNlLCBwUGFja2V0LCAmcGFkZHIsICZMZW4sIEZyYWdDb3VudCk7Ci0JICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXIgdG8gdGhlIHNlbmQgYnVmZmVyIGZyYWdtZW50LiAqLwotCSAgICBpZiAocGFkZHIuSGlnaCAhPSBwU2hhZG93U2VuZEJkLT5Ib3N0QWRkci5IaWdoKQotCSAgICB7Ci0JCV9fcmF3X3dyaXRlbChwYWRkci5IaWdoLCAmKHBTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpKTsKLQkJcFNoYWRvd1NlbmRCZC0+SG9zdEFkZHIuSGlnaCA9IHBhZGRyLkhpZ2g7Ci0JICAgIH0KLQkgICAgX19yYXdfd3JpdGVsKHBhZGRyLkxvdywgJihwU2VuZEJkLT5Ib3N0QWRkci5Mb3cpKTsKKwkJcFNoYWRvd1NlbmRCZCA9ICZwRGV2aWNlLT5TaGFkb3dTZW5kQmRbSWR4XTsKKwkJZm9yIChGcmFnQ291bnQgPSAwOzspIHsKKwkJCU1NX01hcFR4RG1hIChwRGV2aWNlLCBwUGFja2V0LCAmcGFkZHIsICZMZW4sIEZyYWdDb3VudCk7CisJCQkvKiBJbml0aWFsaXplIHRoZSBwb2ludGVyIHRvIHRoZSBzZW5kIGJ1ZmZlciBmcmFnbWVudC4gKi8KKwkJCWlmIChwYWRkci5IaWdoICE9IHBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpIHsKKwkJCQlfX3Jhd193cml0ZWwgKHBhZGRyLkhpZ2gsCisJCQkJCSAgICAgICYocFNlbmRCZC0+SG9zdEFkZHIuSGlnaCkpOworCQkJCXBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2ggPSBwYWRkci5IaWdoOworCQkJfQorCQkJX19yYXdfd3JpdGVsIChwYWRkci5Mb3csICYocFNlbmRCZC0+SG9zdEFkZHIuTG93KSk7CiAKLQkgICAgLyogU2V0dXAgdGhlIGNvbnRyb2wgZmxhZ3MgYW5kIHNlbmQgYnVmZmVyIHNpemUuICovCi0JICAgIFZhbHVlMzIgPSAoTGVuIDw8IDE2KSB8IHBQYWNrZXQtPkZsYWdzOworCQkJLyogU2V0dXAgdGhlIGNvbnRyb2wgZmxhZ3MgYW5kIHNlbmQgYnVmZmVyIHNpemUuICovCisJCQlWYWx1ZTMyID0gKExlbiA8PCAxNikgfCBwUGFja2V0LT5GbGFnczsKIAotCSAgICBJZHggPSAoSWR4ICsgMSkgJiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworCQkJSWR4ID0gKElkeCArIDEpICYgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKIAotCSAgICBGcmFnQ291bnQrKzsKLQkgICAgaWYgKEZyYWdDb3VudCA+PSBwUGFja2V0LT51LlR4LkZyYWdDb3VudCkKLQkgICAgewotCQlWYWx1ZTMyIHw9IFNORF9CRF9GTEFHX0VORDsKLQkJaWYgKFZhbHVlMzIgIT0gcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzKQotCQl7Ci0JCSAgICBfX3Jhd193cml0ZWwoVmFsdWUzMiwgJihwU2VuZEJkLT51MS5MZW5fRmxhZ3MpKTsKLQkJICAgIHBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7Ci0JCX0KLQkJaWYgKHBQYWNrZXQtPkZsYWdzICYgU05EX0JEX0ZMQUdfVkxBTl9UQUcpIHsKLQkJICAgIF9fcmF3X3dyaXRlbChwUGFja2V0LT5WbGFuVGFnLCAmKHBTZW5kQmQtPnUyLlZsYW5UYWcpKTsKLQkJfQotCQlicmVhazsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJaWYgKFZhbHVlMzIgIT0gcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzKQotCQl7Ci0JCSAgICBfX3Jhd193cml0ZWwoVmFsdWUzMiwgJihwU2VuZEJkLT51MS5MZW5fRmxhZ3MpKTsKLQkJICAgIHBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7Ci0JCX0KLQkJaWYgKHBQYWNrZXQtPkZsYWdzICYgU05EX0JEX0ZMQUdfVkxBTl9UQUcpIHsKLQkJICAgIF9fcmF3X3dyaXRlbChwUGFja2V0LT5WbGFuVGFnLCAmKHBTZW5kQmQtPnUyLlZsYW5UYWcpKTsKLQkJfQotCSAgICB9CisJCQlGcmFnQ291bnQrKzsKKwkJCWlmIChGcmFnQ291bnQgPj0gcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpIHsKKwkJCQlWYWx1ZTMyIHw9IFNORF9CRF9GTEFHX0VORDsKKwkJCQlpZiAoVmFsdWUzMiAhPSBwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MpIHsKKwkJCQkJX19yYXdfd3JpdGVsIChWYWx1ZTMyLAorCQkJCQkJICAgICAgJihwU2VuZEJkLT51MS5MZW5fRmxhZ3MpKTsKKwkJCQkJcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzID0gVmFsdWUzMjsKKwkJCQl9CisJCQkJaWYgKHBQYWNrZXQtPkZsYWdzICYgU05EX0JEX0ZMQUdfVkxBTl9UQUcpIHsKKwkJCQkJX19yYXdfd3JpdGVsIChwUGFja2V0LT5WbGFuVGFnLAorCQkJCQkJICAgICAgJihwU2VuZEJkLT51Mi5WbGFuVGFnKSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoVmFsdWUzMiAhPSBwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MpIHsKKwkJCQkJX19yYXdfd3JpdGVsIChWYWx1ZTMyLAorCQkJCQkJICAgICAgJihwU2VuZEJkLT51MS5MZW5fRmxhZ3MpKTsKKwkJCQkJcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzID0gVmFsdWUzMjsKKwkJCQl9CisJCQkJaWYgKHBQYWNrZXQtPkZsYWdzICYgU05EX0JEX0ZMQUdfVkxBTl9UQUcpIHsKKwkJCQkJX19yYXdfd3JpdGVsIChwUGFja2V0LT5WbGFuVGFnLAorCQkJCQkJICAgICAgJihwU2VuZEJkLT51Mi5WbGFuVGFnKSk7CisJCQkJfQorCQkJfQogCi0JICAgIHBTZW5kQmQrKzsKLQkgICAgcFNoYWRvd1NlbmRCZCsrOwotCSAgICBpZiAoSWR4ID09IDApCi0JICAgIHsKLQkJcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKLQkJcFNoYWRvd1NlbmRCZCA9ICZwRGV2aWNlLT5TaGFkb3dTZW5kQmRbMF07Ci0JICAgIH0KLQl9IC8qIGZvciAqLworCQkJcFNlbmRCZCsrOworCQkJcFNoYWRvd1NlbmRCZCsrOworCQkJaWYgKElkeCA9PSAwKSB7CisJCQkJcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKKwkJCQlwU2hhZG93U2VuZEJkID0gJnBEZXZpY2UtPlNoYWRvd1NlbmRCZFswXTsKKwkJCX0KKwkJfQkJLyogZm9yICovCiAKLQkvKiBQdXQgdGhlIHBhY2tldCBkZXNjcmlwdG9yIGluIHRoZSBBY3RpdmVRLiAqLwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbiB0aGUgQWN0aXZlUS4gKi8KKwkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotCXdtYigpOwotCU1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKKwkJd21iICgpOworCQlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guU2VuZE5pY1Byb2RJZHhbMF0uTG93LCBJZHgpOwogCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JZm9yKEZyYWdDb3VudCA9IDA7IDsgKQotCXsKLQkgICAgLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlciB0byB0aGUgc2VuZCBidWZmZXIgZnJhZ21lbnQuICovCi0JICAgIE1NX01hcFR4RG1hKHBEZXZpY2UsIHBQYWNrZXQsICZwU2VuZEJkLT5Ib3N0QWRkciwgJkxlbiwgRnJhZ0NvdW50KTsKKwl9IGVsc2UgeworCQlmb3IgKEZyYWdDb3VudCA9IDA7OykgeworCQkJLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlciB0byB0aGUgc2VuZCBidWZmZXIgZnJhZ21lbnQuICovCisJCQlNTV9NYXBUeERtYSAocERldmljZSwgcFBhY2tldCwgJnBTZW5kQmQtPkhvc3RBZGRyLCAmTGVuLAorCQkJCSAgICAgRnJhZ0NvdW50KTsKIAotCSAgICBwU2VuZEJkLT51Mi5WbGFuVGFnID0gcFBhY2tldC0+VmxhblRhZzsKKwkJCXBTZW5kQmQtPnUyLlZsYW5UYWcgPSBwUGFja2V0LT5WbGFuVGFnOwogCi0JICAgIC8qIFNldHVwIHRoZSBjb250cm9sIGZsYWdzIGFuZCBzZW5kIGJ1ZmZlciBzaXplLiAqLwotCSAgICBWYWx1ZTMyID0gKExlbiA8PCAxNikgfCBwUGFja2V0LT5GbGFnczsKKwkJCS8qIFNldHVwIHRoZSBjb250cm9sIGZsYWdzIGFuZCBzZW5kIGJ1ZmZlciBzaXplLiAqLworCQkJVmFsdWUzMiA9IChMZW4gPDwgMTYpIHwgcFBhY2tldC0+RmxhZ3M7CiAKLQkgICAgSWR4ID0gKElkeCArIDEpICYgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKwkJCUlkeCA9IChJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CiAKLQkgICAgRnJhZ0NvdW50Kys7Ci0JICAgIGlmIChGcmFnQ291bnQgPj0gcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpCi0JICAgIHsKLQkJcFNlbmRCZC0+dTEuTGVuX0ZsYWdzID0gVmFsdWUzMiB8IFNORF9CRF9GTEFHX0VORDsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCXBTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7Ci0JICAgIH0KLQkgICAgcFNlbmRCZCsrOwotCSAgICBpZiAoSWR4ID09IDApCi0JICAgIHsKLQkJcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKLQkgICAgfQotCX0gLyogZm9yICovCisJCQlGcmFnQ291bnQrKzsKKwkJCWlmIChGcmFnQ291bnQgPj0gcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpIHsKKwkJCQlwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPQorCQkJCSAgICBWYWx1ZTMyIHwgU05EX0JEX0ZMQUdfRU5EOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOworCQkJfQorCQkJcFNlbmRCZCsrOworCQkJaWYgKElkeCA9PSAwKSB7CisJCQkJcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKKwkJCX0KKwkJfQkJLyogZm9yICovCiAKLQkvKiBQdXQgdGhlIHBhY2tldCBkZXNjcmlwdG9yIGluIHRoZSBBY3RpdmVRLiAqLwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbiB0aGUgQWN0aXZlUS4gKi8KKwkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotCXdtYigpOwotCU1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmRIb3N0UHJvZElkeFswXS5Mb3csIElkeCk7CisJCXdtYiAoKTsKKwkJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlNlbmRIb3N0UHJvZElkeFswXS5Mb3csIElkeCk7CiAKLSAgICB9CisJfQogCi0gICAgLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KLSAgICBwRGV2aWNlLT5TZW5kUHJvZElkeCA9IElkeDsKKwkvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4LiAqLworCXBEZXZpY2UtPlNlbmRQcm9kSWR4ID0gSWR4OwogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KICNlbmRpZgogCi1MTV9TVEFUVVMKLUxNX1NlbmRQYWNrZXQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCitMTV9TVEFUVVMgTE1fU2VuZFBhY2tldCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCiB7Ci0gICAgTE1fVUlOVDMyIEZyYWdDb3VudDsKLSAgICBQVDNfU05EX0JEIHBTZW5kQmQsIHBUbXBTZW5kQmQsIHBTaGFkb3dTZW5kQmQ7Ci0gICAgVDNfU05EX0JEIE5pY1NlbmRCZEFycltNQVhfRlJBR01FTlRfQ09VTlRdOwotICAgIExNX1VJTlQzMiBTdGFydElkeCwgSWR4OworCUxNX1VJTlQzMiBGcmFnQ291bnQ7CisJUFQzX1NORF9CRCBwU2VuZEJkLCBwVG1wU2VuZEJkLCBwU2hhZG93U2VuZEJkOworCVQzX1NORF9CRCBOaWNTZW5kQmRBcnJbTUFYX0ZSQUdNRU5UX0NPVU5UXTsKKwlMTV9VSU5UMzIgU3RhcnRJZHgsIElkeDsKIAotICAgIHdoaWxlICgxKQotICAgIHsKLQkvKiBJbml0YWxpemUgdGhlIHNlbmQgYnVmZmVyIGRlc2NyaXB0b3JzLiAqLwotCVN0YXJ0SWR4ID0gSWR4ID0gcERldmljZS0+U2VuZFByb2RJZHg7CisJd2hpbGUgKDEpIHsKKwkJLyogSW5pdGFsaXplIHRoZSBzZW5kIGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKwkJU3RhcnRJZHggPSBJZHggPSBwRGV2aWNlLT5TZW5kUHJvZElkeDsKIAotCWlmIChwRGV2aWNlLT5OaWNTZW5kQmQpCi0JewotCSAgICBwVG1wU2VuZEJkID0gcFNlbmRCZCA9ICZOaWNTZW5kQmRBcnJbMF07Ci0JfQotCWVsc2UKLQl7Ci0JICAgIHBUbXBTZW5kQmQgPSBwU2VuZEJkID0gJnBEZXZpY2UtPnBTZW5kQmRWaXJ0W0lkeF07Ci0JfQotCi0JLyogTmV4dCBwcm9kdWNlciBpbmRleC4gKi8KLQlmb3IoRnJhZ0NvdW50ID0gMDsgOyApCi0JewotCSAgICBMTV9VSU5UMzIgVmFsdWUzMiwgTGVuOwotCi0JICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXIgdG8gdGhlIHNlbmQgYnVmZmVyIGZyYWdtZW50LiAqLwotCSAgICBNTV9NYXBUeERtYShwRGV2aWNlLCBwUGFja2V0LCAmcFNlbmRCZC0+SG9zdEFkZHIsICZMZW4sIEZyYWdDb3VudCk7Ci0KLQkgICAgcFNlbmRCZC0+dTIuVmxhblRhZyA9IHBQYWNrZXQtPlZsYW5UYWc7Ci0KLQkgICAgLyogU2V0dXAgdGhlIGNvbnRyb2wgZmxhZ3MgYW5kIHNlbmQgYnVmZmVyIHNpemUuICovCi0JICAgIFZhbHVlMzIgPSAoTGVuIDw8IDE2KSB8IHBQYWNrZXQtPkZsYWdzOwotCi0JICAgIElkeCA9IChJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7Ci0KLQkgICAgRnJhZ0NvdW50Kys7Ci0JICAgIGlmIChGcmFnQ291bnQgPj0gcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpCi0JICAgIHsKLQkJcFNlbmRCZC0+dTEuTGVuX0ZsYWdzID0gVmFsdWUzMiB8IFNORF9CRF9GTEFHX0VORDsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCXBTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7Ci0JICAgIH0KLQkgICAgcFNlbmRCZCsrOwotCSAgICBpZiAoKElkeCA9PSAwKSAmJiAhcERldmljZS0+TmljU2VuZEJkKQotCSAgICB7Ci0JCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07Ci0JICAgIH0KLQl9IC8qIGZvciAqLwotCWlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCi0JewotCSAgICBpZiAoTE1fVGVzdDRHQm91bmRhcnkocERldmljZSwgcFBhY2tldCwgcFRtcFNlbmRCZCkgPT0KLQkJTE1fU1RBVFVTX1NVQ0NFU1MpCi0JICAgIHsKLQkJaWYgKE1NX0NvYWxlc2NlVHhCdWZmZXIocERldmljZSwgcFBhY2tldCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJICAgIFFRX1B1c2hIZWFkKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7Ci0JCSAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCWlmIChwRGV2aWNlLT5OaWNTZW5kQmQpIHsKKwkJCXBUbXBTZW5kQmQgPSBwU2VuZEJkID0gJk5pY1NlbmRCZEFyclswXTsKKwkJfSBlbHNlIHsKKwkJCXBUbXBTZW5kQmQgPSBwU2VuZEJkID0gJnBEZXZpY2UtPnBTZW5kQmRWaXJ0W0lkeF07CiAJCX0KLQkJY29udGludWU7Ci0JICAgIH0KKworCQkvKiBOZXh0IHByb2R1Y2VyIGluZGV4LiAqLworCQlmb3IgKEZyYWdDb3VudCA9IDA7OykgeworCQkJTE1fVUlOVDMyIFZhbHVlMzIsIExlbjsKKworCQkJLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlciB0byB0aGUgc2VuZCBidWZmZXIgZnJhZ21lbnQuICovCisJCQlNTV9NYXBUeERtYSAocERldmljZSwgcFBhY2tldCwgJnBTZW5kQmQtPkhvc3RBZGRyLCAmTGVuLAorCQkJCSAgICAgRnJhZ0NvdW50KTsKKworCQkJcFNlbmRCZC0+dTIuVmxhblRhZyA9IHBQYWNrZXQtPlZsYW5UYWc7CisKKwkJCS8qIFNldHVwIHRoZSBjb250cm9sIGZsYWdzIGFuZCBzZW5kIGJ1ZmZlciBzaXplLiAqLworCQkJVmFsdWUzMiA9IChMZW4gPDwgMTYpIHwgcFBhY2tldC0+RmxhZ3M7CisKKwkJCUlkeCA9IChJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisKKwkJCUZyYWdDb3VudCsrOworCQkJaWYgKEZyYWdDb3VudCA+PSBwUGFja2V0LT51LlR4LkZyYWdDb3VudCkgeworCQkJCXBTZW5kQmQtPnUxLkxlbl9GbGFncyA9CisJCQkJICAgIFZhbHVlMzIgfCBTTkRfQkRfRkxBR19FTkQ7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXBTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7CisJCQl9CisJCQlwU2VuZEJkKys7CisJCQlpZiAoKElkeCA9PSAwKSAmJiAhcERldmljZS0+TmljU2VuZEJkKSB7CisJCQkJcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKKwkJCX0KKwkJfQkJLyogZm9yICovCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCQlpZiAoTE1fVGVzdDRHQm91bmRhcnkgKHBEZXZpY2UsIHBQYWNrZXQsIHBUbXBTZW5kQmQpID09CisJCQkgICAgTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlpZiAoTU1fQ29hbGVzY2VUeEJ1ZmZlciAocERldmljZSwgcFBhY2tldCkgIT0KKwkJCQkgICAgTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJUVFfUHVzaEhlYWQgKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLgorCQkJCQkJICAgICBDb250YWluZXIsIHBQYWNrZXQpOworCQkJCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWJyZWFrOwogCX0KLQlicmVhazsKLSAgICB9Ci0gICAgLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbiB0aGUgQWN0aXZlUS4gKi8KLSAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbiB0aGUgQWN0aXZlUS4gKi8KKwlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlR4UGFja2V0QWN0aXZlUS5Db250YWluZXIsIHBQYWNrZXQpOwogCi0gICAgaWYgKHBEZXZpY2UtPk5pY1NlbmRCZCkKLSAgICB7Ci0JcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFtTdGFydElkeF07Ci0JcFNoYWRvd1NlbmRCZCA9ICZwRGV2aWNlLT5TaGFkb3dTZW5kQmRbU3RhcnRJZHhdOworCWlmIChwRGV2aWNlLT5OaWNTZW5kQmQpIHsKKwkJcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFtTdGFydElkeF07CisJCXBTaGFkb3dTZW5kQmQgPSAmcERldmljZS0+U2hhZG93U2VuZEJkW1N0YXJ0SWR4XTsKIAotCXdoaWxlIChTdGFydElkeCAhPSBJZHgpCi0JewotCSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKwkJd2hpbGUgKFN0YXJ0SWR4ICE9IElkeCkgeworCQkJTE1fVUlOVDMyIFZhbHVlMzI7CiAKLQkgICAgaWYgKChWYWx1ZTMyID0gcFRtcFNlbmRCZC0+SG9zdEFkZHIuSGlnaCkgIT0KLQkJcFNoYWRvd1NlbmRCZC0+SG9zdEFkZHIuSGlnaCkKLQkgICAgewotCQlfX3Jhd193cml0ZWwoVmFsdWUzMiwgJihwU2VuZEJkLT5Ib3N0QWRkci5IaWdoKSk7Ci0JCXBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2ggPSBWYWx1ZTMyOwotCSAgICB9CisJCQlpZiAoKFZhbHVlMzIgPSBwVG1wU2VuZEJkLT5Ib3N0QWRkci5IaWdoKSAhPQorCQkJICAgIHBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpIHsKKwkJCQlfX3Jhd193cml0ZWwgKFZhbHVlMzIsCisJCQkJCSAgICAgICYocFNlbmRCZC0+SG9zdEFkZHIuSGlnaCkpOworCQkJCXBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2ggPSBWYWx1ZTMyOworCQkJfQogCi0JICAgIF9fcmF3X3dyaXRlbChwVG1wU2VuZEJkLT5Ib3N0QWRkci5Mb3csICYocFNlbmRCZC0+SG9zdEFkZHIuTG93KSk7CisJCQlfX3Jhd193cml0ZWwgKHBUbXBTZW5kQmQtPkhvc3RBZGRyLkxvdywKKwkJCQkgICAgICAmKHBTZW5kQmQtPkhvc3RBZGRyLkxvdykpOwogCi0JICAgIGlmICgoVmFsdWUzMiA9IHBUbXBTZW5kQmQtPnUxLkxlbl9GbGFncykgIT0KLQkJcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzKQotCSAgICB7Ci0JCV9fcmF3X3dyaXRlbChWYWx1ZTMyLCAmKHBTZW5kQmQtPnUxLkxlbl9GbGFncykpOwotCQlwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOwotCSAgICB9CisJCQlpZiAoKFZhbHVlMzIgPSBwVG1wU2VuZEJkLT51MS5MZW5fRmxhZ3MpICE9CisJCQkgICAgcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzKSB7CisJCQkJX19yYXdfd3JpdGVsIChWYWx1ZTMyLAorCQkJCQkgICAgICAmKHBTZW5kQmQtPnUxLkxlbl9GbGFncykpOworCQkJCXBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7CisJCQl9CiAKLQkgICAgaWYgKHBQYWNrZXQtPkZsYWdzICYgU05EX0JEX0ZMQUdfVkxBTl9UQUcpCi0JICAgIHsKLQkJX19yYXdfd3JpdGVsKHBUbXBTZW5kQmQtPnUyLlZsYW5UYWcsICYocFNlbmRCZC0+dTIuVmxhblRhZykpOwotCSAgICB9CisJCQlpZiAocFBhY2tldC0+RmxhZ3MgJiBTTkRfQkRfRkxBR19WTEFOX1RBRykgeworCQkJCV9fcmF3X3dyaXRlbCAocFRtcFNlbmRCZC0+dTIuVmxhblRhZywKKwkJCQkJICAgICAgJihwU2VuZEJkLT51Mi5WbGFuVGFnKSk7CisJCQl9CiAKLQkgICAgU3RhcnRJZHggPSAoU3RhcnRJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7Ci0JICAgIGlmIChTdGFydElkeCA9PSAwKQotCQlwU2VuZEJkID0gJnBEZXZpY2UtPnBTZW5kQmRWaXJ0WzBdOwotCSAgICBlbHNlCi0JCXBTZW5kQmQrKzsKLQkgICAgcFRtcFNlbmRCZCsrOworCQkJU3RhcnRJZHggPQorCQkJICAgIChTdGFydElkeCArIDEpICYgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKwkJCWlmIChTdGFydElkeCA9PSAwKQorCQkJCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07CisJCQllbHNlCisJCQkJcFNlbmRCZCsrOworCQkJcFRtcFNlbmRCZCsrOworCQl9CisJCXdtYiAoKTsKKwkJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKKworCQlpZiAoVDNfQ0hJUF9SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQ0hJUF9SRVZfNTcwMF9CWCkgeworCQkJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKKwkJfQorCX0gZWxzZSB7CisJCXdtYiAoKTsKKwkJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlNlbmRIb3N0UHJvZElkeFswXS5Mb3csIElkeCk7CisKKwkJaWYgKFQzX0NISVBfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0NISVBfUkVWXzU3MDBfQlgpIHsKKwkJCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5TZW5kSG9zdFByb2RJZHhbMF0uTG93LAorCQkJCSAgIElkeCk7CisJCX0KIAl9Ci0Jd21iKCk7Ci0JTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guU2VuZE5pY1Byb2RJZHhbMF0uTG93LCBJZHgpOwogCi0JaWYoVDNfQ0hJUF9SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19DSElQX1JFVl81NzAwX0JYKQotCXsKLQkgICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guU2VuZE5pY1Byb2RJZHhbMF0uTG93LCBJZHgpOwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQl3bWIoKTsKLQlNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5TZW5kSG9zdFByb2RJZHhbMF0uTG93LCBJZHgpOworCS8qIFVwZGF0ZSB0aGUgU2VuZEJkTGVmdCBjb3VudC4gKi8KKwlhdG9taWNfc3ViIChwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOwogCi0JaWYoVDNfQ0hJUF9SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19DSElQX1JFVl81NzAwX0JYKQotCXsKLQkgICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guU2VuZEhvc3RQcm9kSWR4WzBdLkxvdywgSWR4KTsKLQl9Ci0gICAgfQorCS8qIFVwZGF0ZSB0aGUgcHJvZHVjZXIgaW5kZXguICovCisJcERldmljZS0+U2VuZFByb2RJZHggPSBJZHg7CiAKLSAgICAvKiBVcGRhdGUgdGhlIFNlbmRCZExlZnQgY291bnQuICovCi0gICAgYXRvbWljX3N1YihwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOwotCi0gICAgLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KLSAgICBwRGV2aWNlLT5TZW5kUHJvZElkeCA9IElkeDsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIFNUQVRJQyBMTV9TVEFUVVMKLUxNX1Rlc3Q0R0JvdW5kYXJ5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0LAotICAgIFBUM19TTkRfQkQgcFNlbmRCZCkKK0xNX1Rlc3Q0R0JvdW5kYXJ5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCwKKwkJICAgUFQzX1NORF9CRCBwU2VuZEJkKQogewotICAgIGludCBGcmFnQ291bnQ7Ci0gICAgTE1fVUlOVDMyIElkeCwgQmFzZSwgTGVuOworCWludCBGcmFnQ291bnQ7CisJTE1fVUlOVDMyIElkeCwgQmFzZSwgTGVuOwogCi0gICAgSWR4ID0gcERldmljZS0+U2VuZFByb2RJZHg7Ci0gICAgZm9yKEZyYWdDb3VudCA9IDA7IDsgKQotICAgIHsKLQlMZW4gPSBwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPj4gMTY7Ci0JaWYgKCgoQmFzZSA9IHBTZW5kQmQtPkhvc3RBZGRyLkxvdykgPiAweGZmZmZkY2MwKSAmJgotCSAgICAocFNlbmRCZC0+SG9zdEFkZHIuSGlnaCA9PSAwKSAmJgotCSAgICAoKEJhc2UgKyA4ICsgTGVuKSA8IEJhc2UpKQotCXsKLQkgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCUlkeCA9IHBEZXZpY2UtPlNlbmRQcm9kSWR4OworCWZvciAoRnJhZ0NvdW50ID0gMDs7KSB7CisJCUxlbiA9IHBTZW5kQmQtPnUxLkxlbl9GbGFncyA+PiAxNjsKKwkJaWYgKCgoQmFzZSA9IHBTZW5kQmQtPkhvc3RBZGRyLkxvdykgPiAweGZmZmZkY2MwKSAmJgorCQkgICAgKHBTZW5kQmQtPkhvc3RBZGRyLkhpZ2ggPT0gMCkgJiYKKwkJICAgICgoQmFzZSArIDggKyBMZW4pIDwgQmFzZSkpIHsKKwkJCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCQlGcmFnQ291bnQrKzsKKwkJaWYgKEZyYWdDb3VudCA+PSBwUGFja2V0LT51LlR4LkZyYWdDb3VudCkgeworCQkJYnJlYWs7CisJCX0KKwkJcFNlbmRCZCsrOworCQlpZiAoIXBEZXZpY2UtPk5pY1NlbmRCZCkgeworCQkJSWR4ID0gKElkeCArIDEpICYgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKwkJCWlmIChJZHggPT0gMCkgeworCQkJCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07CisJCQl9CisJCX0KIAl9Ci0JRnJhZ0NvdW50Kys7Ci0JaWYgKEZyYWdDb3VudCA+PSBwUGFja2V0LT51LlR4LkZyYWdDb3VudCkKLQl7Ci0JICAgIGJyZWFrOwotCX0KLQlwU2VuZEJkKys7Ci0JaWYgKCFwRGV2aWNlLT5OaWNTZW5kQmQpCi0JewotCSAgICBJZHggPSAoSWR4ICsgMSkgJiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOwotCSAgICBpZiAoSWR4ID09IDApCi0JICAgIHsKLQkJcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMzMzUsMzUgKzMwODQsMzAgQEAKIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogX19pbmxpbmUgc3RhdGljIHVuc2lnbmVkIGxvbmcKLUNvbXB1dGVDcmMzMigKLXVuc2lnbmVkIGNoYXIgKnBCdWZmZXIsCi11bnNpZ25lZCBsb25nIEJ1ZmZlclNpemUpIHsKLSAgICB1bnNpZ25lZCBsb25nIFJlZzsKLSAgICB1bnNpZ25lZCBsb25nIFRtcDsKLSAgICB1bnNpZ25lZCBsb25nIGosIGs7CitDb21wdXRlQ3JjMzIgKHVuc2lnbmVkIGNoYXIgKnBCdWZmZXIsIHVuc2lnbmVkIGxvbmcgQnVmZmVyU2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIFJlZzsKKwl1bnNpZ25lZCBsb25nIFRtcDsKKwl1bnNpZ25lZCBsb25nIGosIGs7CiAKLSAgICBSZWcgPSAweGZmZmZmZmZmOworCVJlZyA9IDB4ZmZmZmZmZmY7CiAKLSAgICBmb3IoaiA9IDA7IGogPCBCdWZmZXJTaXplOyBqKyspCi0gICAgewotCVJlZyBePSBwQnVmZmVyW2pdOworCWZvciAoaiA9IDA7IGogPCBCdWZmZXJTaXplOyBqKyspIHsKKwkJUmVnIF49IHBCdWZmZXJbal07CiAKLQlmb3IoayA9IDA7IGsgPCA4OyBrKyspCi0JewotCSAgICBUbXAgPSBSZWcgJiAweDAxOworCQlmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisJCQlUbXAgPSBSZWcgJiAweDAxOwogCi0JICAgIFJlZyA+Pj0gMTsKKwkJCVJlZyA+Pj0gMTsKIAotCSAgICBpZihUbXApCi0JICAgIHsKLQkJUmVnIF49IDB4ZWRiODgzMjA7Ci0JICAgIH0KKwkJCWlmIChUbXApIHsKKwkJCQlSZWcgXj0gMHhlZGI4ODMyMDsKKwkJCX0KKwkJfQogCX0KLSAgICB9CiAKLSAgICByZXR1cm4gflJlZzsKLX0gLyogQ29tcHV0ZUNyYzMyICovCi0KKwlyZXR1cm4gflJlZzsKK30JCQkJLyogQ29tcHV0ZUNyYzMyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzM3MiwxNDkgKzMxMTYsMTM5IEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX1NldFJlY2VpdmVNYXNrKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotTE1fVUlOVDMyIE1hc2spIHsKLSAgICBMTV9VSU5UMzIgUmVjZWl2ZU1hc2s7Ci0gICAgTE1fVUlOVDMyIFJ4TW9kZTsKLSAgICBMTV9VSU5UMzIgaiwgazsKK0xNX1NUQVRVUyBMTV9TZXRSZWNlaXZlTWFzayAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWFzaykKK3sKKwlMTV9VSU5UMzIgUmVjZWl2ZU1hc2s7CisJTE1fVUlOVDMyIFJ4TW9kZTsKKwlMTV9VSU5UMzIgaiwgazsKIAotICAgIFJlY2VpdmVNYXNrID0gTWFzazsKKwlSZWNlaXZlTWFzayA9IE1hc2s7CiAKLSAgICBSeE1vZGUgPSBwRGV2aWNlLT5SeE1vZGU7CisJUnhNb2RlID0gcERldmljZS0+UnhNb2RlOwogCi0gICAgaWYoTWFzayAmIExNX0FDQ0VQVF9VTklDQVNUKQotICAgIHsKLQlNYXNrICY9IH5MTV9BQ0NFUFRfVU5JQ0FTVDsKLSAgICB9Ci0KLSAgICBpZihNYXNrICYgTE1fQUNDRVBUX01VTFRJQ0FTVCkKLSAgICB7Ci0JTWFzayAmPSB+TE1fQUNDRVBUX01VTFRJQ0FTVDsKLSAgICB9Ci0KLSAgICBpZihNYXNrICYgTE1fQUNDRVBUX0FMTF9NVUxUSUNBU1QpCi0gICAgewotCU1hc2sgJj0gfkxNX0FDQ0VQVF9BTExfTVVMVElDQVNUOwotICAgIH0KLQotICAgIGlmKE1hc2sgJiBMTV9BQ0NFUFRfQlJPQURDQVNUKQotICAgIHsKLQlNYXNrICY9IH5MTV9BQ0NFUFRfQlJPQURDQVNUOwotICAgIH0KLQotICAgIFJ4TW9kZSAmPSB+UlhfTU9ERV9QUk9NSVNDVU9VU19NT0RFOwotICAgIGlmKE1hc2sgJiBMTV9QUk9NSVNDVU9VU19NT0RFKQotICAgIHsKLQlSeE1vZGUgfD0gUlhfTU9ERV9QUk9NSVNDVU9VU19NT0RFOwotCU1hc2sgJj0gfkxNX1BST01JU0NVT1VTX01PREU7Ci0gICAgfQotCi0gICAgUnhNb2RlICY9IH4oUlhfTU9ERV9BQ0NFUFRfUlVOVFMgfCBSWF9NT0RFX0FDQ0VQVF9PVkVSU0laRUQpOwotICAgIGlmKE1hc2sgJiBMTV9BQ0NFUFRfRVJST1JfUEFDS0VUKQotICAgIHsKLQlSeE1vZGUgfD0gUlhfTU9ERV9BQ0NFUFRfUlVOVFMgfCBSWF9NT0RFX0FDQ0VQVF9PVkVSU0laRUQ7Ci0JTWFzayAmPSB+TE1fQUNDRVBUX0VSUk9SX1BBQ0tFVDsKLSAgICB9Ci0KLSAgICAvKiBNYWtlIHN1cmUgYWxsIHRoZSBiaXRzIGFyZSB2YWxpZCBiZWZvcmUgY29tbWl0dGluZyBjaGFuZ2VzLiAqLwotICAgIGlmKE1hc2spCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLSAgICB9Ci0KLSAgICAvKiBDb21taXQgdGhlIG5ldyBmaWx0ZXIuICovCi0gICAgcERldmljZS0+UnhNb2RlID0gUnhNb2RlOwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgUnhNb2RlKTsKLQotICAgIHBEZXZpY2UtPlJlY2VpdmVNYXNrID0gUmVjZWl2ZU1hc2s7Ci0KLSAgICAvKiBTZXQgdXAgdGhlIE1DIGhhc2ggdGFibGUuICovCi0gICAgaWYoUmVjZWl2ZU1hc2sgJiBMTV9BQ0NFUFRfQUxMX01VTFRJQ0FTVCkKLSAgICB7Ci0JZm9yKGsgPSAwOyBrIDwgNDsgaysrKQotCXsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuSGFzaFJlZ1trXSwgMHhmZmZmZmZmZik7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmKFJlY2VpdmVNYXNrICYgTE1fQUNDRVBUX01VTFRJQ0FTVCkKLSAgICB7Ci0JTE1fVUlOVDMyIEhhc2hSZWdbNF07Ci0KLQlIYXNoUmVnWzBdID0gMDsgSGFzaFJlZ1sxXSA9IDA7IEhhc2hSZWdbMl0gPSAwOyBIYXNoUmVnWzNdID0gMDsKLQlmb3IoaiA9IDA7IGogPCBwRGV2aWNlLT5NY0VudHJ5Q291bnQ7IGorKykKLQl7Ci0JICAgIExNX1VJTlQzMiBSZWdJbmRleDsKLQkgICAgTE1fVUlOVDMyIEJpdHBvczsKLQkgICAgTE1fVUlOVDMyIENyYzMyOwotCi0JICAgIENyYzMyID0gQ29tcHV0ZUNyYzMyKHBEZXZpY2UtPk1jVGFibGVbal0sIEVUSEVSTkVUX0FERFJFU1NfU0laRSk7Ci0KLQkgICAgLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgNyBiaXRzIG9mIHRoZSBDUkMzMiAobm8gaW52ZXJzaW9uKSwgKi8KLQkgICAgLyogYXJlIHVzZWQgdG8gaW5kZXggaW50byBvbmUgb2YgdGhlIHBvc3NpYmxlIDEyOCBiaXQgcG9zaXRpb25zLiAqLwotCSAgICBCaXRwb3MgPSB+Q3JjMzIgJiAweDdmOwotCi0JICAgIC8qIEhhc2ggcmVnaXN0ZXIgaW5kZXguICovCi0JICAgIFJlZ0luZGV4ID0gKEJpdHBvcyAmIDB4NjApID4+IDU7Ci0KLQkgICAgLyogQml0IHRvIHR1cm4gb24gd2l0aGluIGEgaGFzaCByZWdpc3Rlci4gKi8KLQkgICAgQml0cG9zICY9IDB4MWY7Ci0KLQkgICAgLyogRW5hYmxlIHRoZSBtdWx0aWNhc3QgYml0LiAqLwotCSAgICBIYXNoUmVnW1JlZ0luZGV4XSB8PSAoMSA8PCBCaXRwb3MpOworCWlmIChNYXNrICYgTE1fQUNDRVBUX1VOSUNBU1QpIHsKKwkJTWFzayAmPSB+TE1fQUNDRVBUX1VOSUNBU1Q7CiAJfQogCi0JLyogUkVWX0FYIGhhcyBwcm9ibGVtIHdpdGggbXVsdGljYXN0IGZpbHRlcmluZyB3aGVyZSBpdCB1c2VzIGJvdGggKi8KLQkvKiBEQSBhbmQgU0EgdG8gcGVyZm9ybSBoYXNoaW5nLiAqLwotCWZvcihrID0gMDsgayA8IDQ7IGsrKykKLQl7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkhhc2hSZWdba10sIEhhc2hSZWdba10pOworCWlmIChNYXNrICYgTE1fQUNDRVBUX01VTFRJQ0FTVCkgeworCQlNYXNrICY9IH5MTV9BQ0NFUFRfTVVMVElDQVNUOwogCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkvKiBSZWplY3QgYWxsIG11bHRpY2FzdCBmcmFtZXMuICovCi0JZm9yKGogPSAwOyBqIDwgNDsgaisrKQotCXsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuSGFzaFJlZ1tqXSwgMCk7CisKKwlpZiAoTWFzayAmIExNX0FDQ0VQVF9BTExfTVVMVElDQVNUKSB7CisJCU1hc2sgJj0gfkxNX0FDQ0VQVF9BTExfTVVMVElDQVNUOwogCX0KLSAgICB9CiAKLSAgICAvKiBCeSBkZWZhdWx0LCBUaWdvbjMgd2lsbCBhY2NlcHQgYnJvYWRjYXN0IGZyYW1lcy4gIFdlIG5lZWQgdG8gc2V0dXAgKi8KLSAgICBpZihSZWNlaXZlTWFzayAmIExNX0FDQ0VQVF9CUk9BRENBU1QpCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKLQkgICAgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9SVUxFICYgUkNWX0RJU0FCTEVfUlVMRV9NQVNLKTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTFfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlZhbHVlLAotCSAgICBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1ZBTFVFICYgUkNWX0RJU0FCTEVfUlVMRV9NQVNLKTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTJfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlJ1bGUsCi0JICAgIFJFSkVDVF9CUk9BRENBU1RfUlVMRTFfUlVMRSAmIFJDVl9ESVNBQkxFX1JVTEVfTUFTSyk7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYXS5WYWx1ZSwKLQkgICAgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9WQUxVRSAmIFJDVl9ESVNBQkxFX1JVTEVfTUFTSyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUxX1JFSkVDVF9CUk9BRENBU1RfSURYXS5SdWxlLAotCSAgICBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1JVTEUpOwotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uVmFsdWUsCi0JICAgIFJFSkVDVF9CUk9BRENBU1RfUlVMRTFfVkFMVUUpOwotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMl9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKLQkgICAgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMl9SVUxFKTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTJfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlZhbHVlLAotCSAgICBSRUpFQ1RfQlJPQURDQVNUX1JVTEUyX1ZBTFVFKTsKLSAgICB9CisJaWYgKE1hc2sgJiBMTV9BQ0NFUFRfQlJPQURDQVNUKSB7CisJCU1hc2sgJj0gfkxNX0FDQ0VQVF9CUk9BRENBU1Q7CisJfQogCi0gICAgLyogZGlzYWJsZSB0aGUgcmVzdCBvZiB0aGUgcnVsZXMuICovCi0gICAgZm9yKGogPSBSQ1ZfTEFTVF9SVUxFX0lEWDsgaiA8IDE2OyBqKyspCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW2pdLlJ1bGUsIDApOwotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW2pdLlZhbHVlLCAwKTsKLSAgICB9CisJUnhNb2RlICY9IH5SWF9NT0RFX1BST01JU0NVT1VTX01PREU7CisJaWYgKE1hc2sgJiBMTV9QUk9NSVNDVU9VU19NT0RFKSB7CisJCVJ4TW9kZSB8PSBSWF9NT0RFX1BST01JU0NVT1VTX01PREU7CisJCU1hc2sgJj0gfkxNX1BST01JU0NVT1VTX01PREU7CisJfQogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9TZXRSZWNlaXZlTWFzayAqLworCVJ4TW9kZSAmPSB+KFJYX01PREVfQUNDRVBUX1JVTlRTIHwgUlhfTU9ERV9BQ0NFUFRfT1ZFUlNJWkVEKTsKKwlpZiAoTWFzayAmIExNX0FDQ0VQVF9FUlJPUl9QQUNLRVQpIHsKKwkJUnhNb2RlIHw9IFJYX01PREVfQUNDRVBUX1JVTlRTIHwgUlhfTU9ERV9BQ0NFUFRfT1ZFUlNJWkVEOworCQlNYXNrICY9IH5MTV9BQ0NFUFRfRVJST1JfUEFDS0VUOworCX0KIAorCS8qIE1ha2Ugc3VyZSBhbGwgdGhlIGJpdHMgYXJlIHZhbGlkIGJlZm9yZSBjb21taXR0aW5nIGNoYW5nZXMuICovCisJaWYgKE1hc2spIHsKKwkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCX0KKworCS8qIENvbW1pdCB0aGUgbmV3IGZpbHRlci4gKi8KKwlwRGV2aWNlLT5SeE1vZGUgPSBSeE1vZGU7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgUnhNb2RlKTsKKworCXBEZXZpY2UtPlJlY2VpdmVNYXNrID0gUmVjZWl2ZU1hc2s7CisKKwkvKiBTZXQgdXAgdGhlIE1DIGhhc2ggdGFibGUuICovCisJaWYgKFJlY2VpdmVNYXNrICYgTE1fQUNDRVBUX0FMTF9NVUxUSUNBU1QpIHsKKwkJZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLkhhc2hSZWdba10sIDB4ZmZmZmZmZmYpOworCQl9CisJfSBlbHNlIGlmIChSZWNlaXZlTWFzayAmIExNX0FDQ0VQVF9NVUxUSUNBU1QpIHsKKwkJTE1fVUlOVDMyIEhhc2hSZWdbNF07CisKKwkJSGFzaFJlZ1swXSA9IDA7CisJCUhhc2hSZWdbMV0gPSAwOworCQlIYXNoUmVnWzJdID0gMDsKKwkJSGFzaFJlZ1szXSA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBwRGV2aWNlLT5NY0VudHJ5Q291bnQ7IGorKykgeworCQkJTE1fVUlOVDMyIFJlZ0luZGV4OworCQkJTE1fVUlOVDMyIEJpdHBvczsKKwkJCUxNX1VJTlQzMiBDcmMzMjsKKworCQkJQ3JjMzIgPQorCQkJICAgIENvbXB1dGVDcmMzMiAocERldmljZS0+TWNUYWJsZVtqXSwKKwkJCQkJICBFVEhFUk5FVF9BRERSRVNTX1NJWkUpOworCisJCQkvKiBUaGUgbW9zdCBzaWduaWZpY2FudCA3IGJpdHMgb2YgdGhlIENSQzMyIChubyBpbnZlcnNpb24pLCAqLworCQkJLyogYXJlIHVzZWQgdG8gaW5kZXggaW50byBvbmUgb2YgdGhlIHBvc3NpYmxlIDEyOCBiaXQgcG9zaXRpb25zLiAqLworCQkJQml0cG9zID0gfkNyYzMyICYgMHg3ZjsKKworCQkJLyogSGFzaCByZWdpc3RlciBpbmRleC4gKi8KKwkJCVJlZ0luZGV4ID0gKEJpdHBvcyAmIDB4NjApID4+IDU7CisKKwkJCS8qIEJpdCB0byB0dXJuIG9uIHdpdGhpbiBhIGhhc2ggcmVnaXN0ZXIuICovCisJCQlCaXRwb3MgJj0gMHgxZjsKKworCQkJLyogRW5hYmxlIHRoZSBtdWx0aWNhc3QgYml0LiAqLworCQkJSGFzaFJlZ1tSZWdJbmRleF0gfD0gKDEgPDwgQml0cG9zKTsKKwkJfQorCisJCS8qIFJFVl9BWCBoYXMgcHJvYmxlbSB3aXRoIG11bHRpY2FzdCBmaWx0ZXJpbmcgd2hlcmUgaXQgdXNlcyBib3RoICovCisJCS8qIERBIGFuZCBTQSB0byBwZXJmb3JtIGhhc2hpbmcuICovCisJCWZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKKwkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5IYXNoUmVnW2tdLCBIYXNoUmVnW2tdKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFJlamVjdCBhbGwgbXVsdGljYXN0IGZyYW1lcy4gKi8KKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLkhhc2hSZWdbal0sIDApOworCQl9CisJfQorCisJLyogQnkgZGVmYXVsdCwgVGlnb24zIHdpbGwgYWNjZXB0IGJyb2FkY2FzdCBmcmFtZXMuICBXZSBuZWVkIHRvIHNldHVwICovCisJaWYgKFJlY2VpdmVNYXNrICYgTE1fQUNDRVBUX0JST0FEQ0FTVCkgeworCQlSRUdfV1IgKHBEZXZpY2UsCisJCQlNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKKwkJCVJFSkVDVF9CUk9BRENBU1RfUlVMRTFfUlVMRSAmIFJDVl9ESVNBQkxFX1JVTEVfTUFTSyk7CisJCVJFR19XUiAocERldmljZSwKKwkJCU1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUxX1JFSkVDVF9CUk9BRENBU1RfSURYXS5WYWx1ZSwKKwkJCVJFSkVDVF9CUk9BRENBU1RfUlVMRTFfVkFMVUUgJiBSQ1ZfRElTQUJMRV9SVUxFX01BU0spOworCQlSRUdfV1IgKHBEZXZpY2UsCisJCQlNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMl9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKKwkJCVJFSkVDVF9CUk9BRENBU1RfUlVMRTFfUlVMRSAmIFJDVl9ESVNBQkxFX1JVTEVfTUFTSyk7CisJCVJFR19XUiAocERldmljZSwKKwkJCU1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYXS5WYWx1ZSwKKwkJCVJFSkVDVF9CUk9BRENBU1RfUlVMRTFfVkFMVUUgJiBSQ1ZfRElTQUJMRV9SVUxFX01BU0spOworCX0gZWxzZSB7CisJCVJFR19XUiAocERldmljZSwKKwkJCU1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUxX1JFSkVDVF9CUk9BRENBU1RfSURYXS5SdWxlLAorCQkJUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9SVUxFKTsKKwkJUkVHX1dSIChwRGV2aWNlLAorCQkJTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTFfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlZhbHVlLAorCQkJUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9WQUxVRSk7CisJCVJFR19XUiAocERldmljZSwKKwkJCU1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYXS5SdWxlLAorCQkJUkVKRUNUX0JST0FEQ0FTVF9SVUxFMl9SVUxFKTsKKwkJUkVHX1dSIChwRGV2aWNlLAorCQkJTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTJfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlZhbHVlLAorCQkJUkVKRUNUX0JST0FEQ0FTVF9SVUxFMl9WQUxVRSk7CisJfQorCisJLyogZGlzYWJsZSB0aGUgcmVzdCBvZiB0aGUgcnVsZXMuICovCisJZm9yIChqID0gUkNWX0xBU1RfUlVMRV9JRFg7IGogPCAxNjsgaisrKSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tqXS5SdWxlLCAwKTsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW2pdLlZhbHVlLCAwKTsKKwl9CisKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX1NldFJlY2VpdmVNYXNrICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzUyNSwxMzggKzMyNTksMTM1IEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX0Fib3J0KAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTE1fU1RBVFVTIExNX0Fib3J0IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgUExNX1BBQ0tFVCBwUGFja2V0OwotICAgIExNX1VJTlQgSWR4OworCVBMTV9QQUNLRVQgcFBhY2tldDsKKwlMTV9VSU5UIElkeDsKIAotICAgIExNX0Rpc2FibGVJbnRlcnJ1cHQocERldmljZSk7CisJTE1fRGlzYWJsZUludGVycnVwdCAocERldmljZSk7CiAKLSAgICAvKiBEaXNhYmxlIGFsbCB0aGUgc3RhdGUgbWFjaGluZXMuICovCi0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX01BQ19SWF9FTkdJTkUsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1JYX0JEX0lOSVRJQVRPUixMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfUlhfTElTVF9QTE1ULExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19SWF9MSVNUX1NFTEVDVE9SLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19SWF9EQVRBX0lOSVRJQVRPUixMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfUlhfREFUQV9DT01QLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19SWF9CRF9DT01QLExNX0RJU0FCTEUpOworCS8qIERpc2FibGUgYWxsIHRoZSBzdGF0ZSBtYWNoaW5lcy4gKi8KKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19NQUNfUlhfRU5HSU5FLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19SWF9CRF9JTklUSUFUT1IsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1JYX0xJU1RfUExNVCwgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfUlhfTElTVF9TRUxFQ1RPUiwgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfUlhfREFUQV9JTklUSUFUT1IsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1JYX0RBVEFfQ09NUCwgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfUlhfQkRfQ09NUCwgTE1fRElTQUJMRSk7CiAKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfU0VORF9CRF9TRUxFQ1RPUixMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfU0VORF9CRF9JTklUSUFUT1IsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1NFTkRfREFUQV9JTklUSUFUT1IsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX0RNQV9SRCxMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfU0VORF9EQVRBX0NPTVAsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX0RNQV9DT01QLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19TRU5EX0JEX0NPTVAsTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfU0VORF9CRF9TRUxFQ1RPUiwgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfU0VORF9CRF9JTklUSUFUT1IsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1NFTkRfREFUQV9JTklUSUFUT1IsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX0RNQV9SRCwgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfU0VORF9EQVRBX0NPTVAsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX0RNQV9DT01QLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19TRU5EX0JEX0NPTVAsIExNX0RJU0FCTEUpOwogCi0gICAgLyogQ2xlYXIgVERFIGJpdCAqLwotICAgIHBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX0VOQUJMRV9UREU7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CisJLyogQ2xlYXIgVERFIGJpdCAqLworCXBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX0VOQUJMRV9UREU7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOwogCi0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX01BQ19UWF9FTkdJTkUsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX0hPU1RfQ09BTEVTSU5HLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19ETUFfV1IsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX01CVUZfQ0xVU1RFUl9GUkVFLExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX01BQ19UWF9FTkdJTkUsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX0hPU1RfQ09BTEVTSU5HLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19ETUFfV1IsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX01CVUZfQ0xVU1RFUl9GUkVFLCBMTV9ESVNBQkxFKTsKIAotICAgIC8qIFJlc2V0IGFsbCBGVFFzICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEZ0cS5SZXNldCwgMHhmZmZmZmZmZik7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEZ0cS5SZXNldCwgMHgwKTsKKwkvKiBSZXNldCBhbGwgRlRRcyAqLworCVJFR19XUiAocERldmljZSwgRnRxLlJlc2V0LCAweGZmZmZmZmZmKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEZ0cS5SZXNldCwgMHgwKTsKIAotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19NQlVGX01BTkFHRVIsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX01FTV9BUkJJVE9SLExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX01CVUZfTUFOQUdFUiwgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfTUVNX0FSQklUT1IsIExNX0RJU0FCTEUpOwogCi0gICAgTU1fQUNRVUlSRV9JTlRfTE9DSyhwRGV2aWNlKTsKKwlNTV9BQ1FVSVJFX0lOVF9MT0NLIChwRGV2aWNlKTsKIAotICAgIC8qIEFib3J0IHBhY2tldHMgdGhhdCBoYXZlIGFscmVhZHkgcXVldWVkIHRvIGdvIG91dC4gKi8KLSAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlR4UGFja2V0QWN0aXZlUS5Db250YWluZXIpOwotICAgIHdoaWxlKHBQYWNrZXQpCi0gICAgeworCS8qIEFib3J0IHBhY2tldHMgdGhhdCBoYXZlIGFscmVhZHkgcXVldWVkIHRvIGdvIG91dC4gKi8KKwlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyKTsKKwl3aGlsZSAocFBhY2tldCkgewogCi0JcFBhY2tldC0+UGFja2V0U3RhdHVzID0gTE1fU1RBVFVTX1RSQU5TTUlUX0FCT1JURUQ7Ci0JcERldmljZS0+VHhDb3VudGVycy5UeFBhY2tldEFib3J0ZWRDbnQrKzsKKwkJcFBhY2tldC0+UGFja2V0U3RhdHVzID0gTE1fU1RBVFVTX1RSQU5TTUlUX0FCT1JURUQ7CisJCXBEZXZpY2UtPlR4Q291bnRlcnMuVHhQYWNrZXRBYm9ydGVkQ250Kys7CiAKLQlhdG9taWNfYWRkKHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50LCAmcERldmljZS0+U2VuZEJkTGVmdCk7CisJCWF0b21pY19hZGQgKHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50LCAmcERldmljZS0+U2VuZEJkTGVmdCk7CiAKLQlRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRYbWl0dGVkUS5Db250YWluZXIsIHBQYWNrZXQpOworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlR4UGFja2V0WG1pdHRlZFEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkKLQkgICAgUVFfUG9wSGVhZCgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lcik7Ci0gICAgfQotCi0gICAgLyogQ2xlYW51cCB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZ3MuICovCi0gICAgTE1fU2VydmljZVJ4SW50ZXJydXB0KHBEZXZpY2UpOwotCi0gICAgLyogRG9uJ3Qgd2FudCB0byBpbmRpY2F0ZSByeCBwYWNrZXRzIGluIE5kaXMgbWluaXBvcnQgc2h1dGRvd24gY29udGV4dC4gKi8KLSAgICAvKiBEb2luZyBzbyBtYXkgY2F1c2Ugc3lzdGVtIGNyYXNoLiAqLwotICAgIGlmKCFwRGV2aWNlLT5TaHV0dGluZ0Rvd24pCi0gICAgewotCS8qIEluZGljYXRlIHBhY2tldHMgdG8gdGhlIHByb3RvY29sLiAqLwotCU1NX0luZGljYXRlVHhQYWNrZXRzKHBEZXZpY2UpOwotCi0JLyogSW5kaWNhdGUgcmVjZWl2ZWQgcGFja2V0cyB0byB0aGUgcHJvdG9jb2xzLiAqLwotCU1NX0luZGljYXRlUnhQYWNrZXRzKHBEZXZpY2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCS8qIE1vdmUgdGhlIHJlY2VpdmUgcGFja2V0IGRlc2NyaXB0b3JzIGluIHRoZSBSZWNlaXZlZFEgdG8gdGhlICovCi0JLyogZnJlZSBxdWV1ZS4gKi8KLQlmb3IoOyA7KQotCXsKLQkgICAgcFBhY2tldCA9IChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkKAotCQkmcERldmljZS0+UnhQYWNrZXRSZWNlaXZlZFEuQ29udGFpbmVyKTsKLQkgICAgaWYocFBhY2tldCA9PSBOVUxMKQotCSAgICB7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIFFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkKKwkJICAgIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyKTsKIAl9Ci0gICAgfQogCi0gICAgLyogQ2xlYW4gdXAgdGhlIFN0ZCBSZWNlaXZlIFByb2R1Y2VyIHJpbmcuICovCi0gICAgSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdlN0ZENvbklkeDsKKwkvKiBDbGVhbnVwIHRoZSByZWNlaXZlIHJldHVybiByaW5ncy4gKi8KKwlMTV9TZXJ2aWNlUnhJbnRlcnJ1cHQgKHBEZXZpY2UpOwogCi0gICAgd2hpbGUoSWR4ICE9IHBEZXZpY2UtPlJ4U3RkUHJvZElkeCkgewotCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgKE1NX1VJTlRfUFRSKHBEZXZpY2UtPnBQYWNrZXREZXNjQmFzZSkgKwotCSAgICBNTV9VSU5UX1BUUihwRGV2aWNlLT5wUnhTdGRCZFZpcnRbSWR4XS5PcGFxdWUpKTsKKwkvKiBEb24ndCB3YW50IHRvIGluZGljYXRlIHJ4IHBhY2tldHMgaW4gTmRpcyBtaW5pcG9ydCBzaHV0ZG93biBjb250ZXh0LiAqLworCS8qIERvaW5nIHNvIG1heSBjYXVzZSBzeXN0ZW0gY3Jhc2guICovCisJaWYgKCFwRGV2aWNlLT5TaHV0dGluZ0Rvd24pIHsKKwkJLyogSW5kaWNhdGUgcGFja2V0cyB0byB0aGUgcHJvdG9jb2wuICovCisJCU1NX0luZGljYXRlVHhQYWNrZXRzIChwRGV2aWNlKTsKIAotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCS8qIEluZGljYXRlIHJlY2VpdmVkIHBhY2tldHMgdG8gdGhlIHByb3RvY29scy4gKi8KKwkJTU1fSW5kaWNhdGVSeFBhY2tldHMgKHBEZXZpY2UpOworCX0gZWxzZSB7CisJCS8qIE1vdmUgdGhlIHJlY2VpdmUgcGFja2V0IGRlc2NyaXB0b3JzIGluIHRoZSBSZWNlaXZlZFEgdG8gdGhlICovCisJCS8qIGZyZWUgcXVldWUuICovCisJCWZvciAoOzspIHsKKwkJCXBQYWNrZXQgPQorCQkJICAgIChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkICgmcERldmljZS0+CisJCQkJCQkgICAgIFJ4UGFja2V0UmVjZWl2ZWRRLgorCQkJCQkJICAgICBDb250YWluZXIpOworCQkJaWYgKHBQYWNrZXQgPT0gTlVMTCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwKKwkJCQkgICAgIHBQYWNrZXQpOworCQl9CisJfQogCi0JSWR4ID0gKElkeCArIDEpICYgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKLSAgICB9IC8qIHdoaWxlICovCisJLyogQ2xlYW4gdXAgdGhlIFN0ZCBSZWNlaXZlIFByb2R1Y2VyIHJpbmcuICovCisJSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdlN0ZENvbklkeDsKIAotICAgIC8qIFJlaW5pdGlhbGl6ZSBvdXIgY29weSBvZiB0aGUgaW5kaWNlcy4gKi8KLSAgICBwRGV2aWNlLT5SeFN0ZFByb2RJZHggPSAwOworCXdoaWxlIChJZHggIT0gcERldmljZS0+UnhTdGRQcm9kSWR4KSB7CisJCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgKE1NX1VJTlRfUFRSIChwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpICsKKwkJCQkJTU1fVUlOVF9QVFIgKHBEZXZpY2UtPnBSeFN0ZEJkVmlydFtJZHhdLgorCQkJCQkJICAgICBPcGFxdWUpKTsKKworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKworCQlJZHggPSAoSWR4ICsgMSkgJiBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworCX0JCQkvKiB3aGlsZSAqLworCisJLyogUmVpbml0aWFsaXplIG91ciBjb3B5IG9mIHRoZSBpbmRpY2VzLiAqLworCXBEZXZpY2UtPlJ4U3RkUHJvZElkeCA9IDA7CiAKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgLyogQ2xlYW4gdXAgdGhlIEp1bWJvIFJlY2VpdmUgUHJvZHVjZXIgcmluZy4gKi8KLSAgICBJZHggPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2SnVtYm9Db25JZHg7CisJLyogQ2xlYW4gdXAgdGhlIEp1bWJvIFJlY2VpdmUgUHJvZHVjZXIgcmluZy4gKi8KKwlJZHggPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2SnVtYm9Db25JZHg7CiAKLSAgICB3aGlsZShJZHggIT0gcERldmljZS0+UnhKdW1ib1Byb2RJZHgpIHsKLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIChNTV9VSU5UX1BUUihwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpICsKLQkgICAgTU1fVUlOVF9QVFIocERldmljZS0+cFJ4SnVtYm9CZFZpcnRbSWR4XS5PcGFxdWUpKTsKKwl3aGlsZSAoSWR4ICE9IHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4KSB7CisJCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgKE1NX1VJTlRfUFRSIChwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpICsKKwkJCQkJTU1fVUlOVF9QVFIgKHBEZXZpY2UtPgorCQkJCQkJICAgICBwUnhKdW1ib0JkVmlydFtJZHhdLgorCQkJCQkJICAgICBPcGFxdWUpKTsKIAotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwogCi0JSWR4ID0gKElkeCArIDEpICYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVF9NQVNLOwotICAgIH0gLyogd2hpbGUgKi8KKwkJSWR4ID0gKElkeCArIDEpICYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworCX0JCQkvKiB3aGlsZSAqLwogCi0gICAgLyogUmVpbml0aWFsaXplIG91ciBjb3B5IG9mIHRoZSBpbmRpY2VzLiAqLwotICAgIHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4ID0gMDsKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisJLyogUmVpbml0aWFsaXplIG91ciBjb3B5IG9mIHRoZSBpbmRpY2VzLiAqLworCXBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4ID0gMDsKKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCiAKLSAgICBNTV9SRUxFQVNFX0lOVF9MT0NLKHBEZXZpY2UpOworCU1NX1JFTEVBU0VfSU5UX0xPQ0sgKHBEZXZpY2UpOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGlzIEJsb2NrICovCi0gICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyA9IDA7Ci0gICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdlN0ZENvbklkeCA9IDA7Ci0gICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdkp1bWJvQ29uSWR4ID0gMDsKLSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2TWluaUNvbklkeCA9IDA7CisJLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGlzIEJsb2NrICovCisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyA9IDA7CisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdlN0ZENvbklkeCA9IDA7CisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdkp1bWJvQ29uSWR4ID0gMDsKKwlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2TWluaUNvbklkeCA9IDA7CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19IC8qIExNX0Fib3J0ICovCi0KKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX0Fib3J0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzY2NywxNDAgKzMzOTgsMTMwIEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX0hhbHQoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpIHsKLSAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7Ci0gICAgTE1fVUlOVDMyIEVudHJ5Q250OwotCi0gICAgTE1fQWJvcnQocERldmljZSk7Ci0KLSAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBxdWV1ZS4gKi8KLSAgICBFbnRyeUNudCA9IFFRX0dldEVudHJ5Q250KCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7Ci0KLSAgICAvKiBNYWtlIHN1cmUgYWxsIHRoZSBwYWNrZXRzIGhhdmUgYmVlbiBhY2NvdW50ZWQgZm9yLiAqLwotICAgIGZvcihFbnRyeUNudCA9IDA7IEVudHJ5Q250IDwgcERldmljZS0+UnhQYWNrZXREZXNjQ250OyBFbnRyeUNudCsrKQotICAgIHsKLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKLQlpZiAocFBhY2tldCA9PSAwKQotCSAgICBicmVhazsKLQotCU1NX0ZyZWVSeEJ1ZmZlcihwRGV2aWNlLCBwUGFja2V0KTsKLQotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7Ci0gICAgfQotCi0gICAgTE1fUmVzZXRDaGlwKHBEZXZpY2UpOwotCi0gICAgLyogUmVzdG9yZSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBQQ0lfQ0FDSEVfTElORV9TSVpFX1JFRywKLQlwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyk7Ci0gICAgTE1fUmVnV3JJbmQocERldmljZSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSURfUkVHLAotCShwRGV2aWNlLT5TdWJzeXN0ZW1JZCA8PCAxNikgfCBwRGV2aWNlLT5TdWJzeXN0ZW1WZW5kb3JJZCk7Ci0KLSAgICAvKiBSZXByb2dyYW0gdGhlIE1BQyBhZGRyZXNzLiAqLwotICAgIExNX1NldE1hY0FkZHJlc3MocERldmljZSwgcERldmljZS0+Tm9kZUFkZHJlc3MpOwotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9IYWx0ICovCi0KLQotU1RBVElDIExNX1NUQVRVUwotTE1fUmVzZXRDaGlwKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBMTV9IYWx0IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDMyIGo7CisJUExNX1BBQ0tFVCBwUGFja2V0OworCUxNX1VJTlQzMiBFbnRyeUNudDsKIAotICAgIC8qIFdhaXQgZm9yIGFjY2VzcyB0byB0aGUgbnZyYW0gaW50ZXJmYWNlIGJlZm9yZSByZXNldHRpbmcuICBUaGlzIGlzICovCi0gICAgLyogYSB3b3JrYXJvdW5kIHRvIHByZXZlbnQgRUVQUk9NIGNvcnJ1cHRpb24uICovCi0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAwICYmCi0JVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAxKQotICAgIHsKLQkvKiBSZXF1ZXN0IGFjY2VzcyB0byB0aGUgZmxhc2ggaW50ZXJmYWNlLiAqLwotCVJFR19XUihwRGV2aWNlLCBOdnJhbS5Td0FyYiwgU1dfQVJCX1JFUV9TRVQxKTsKKwlMTV9BYm9ydCAocERldmljZSk7CiAKLQlmb3IoaiA9IDA7IGogPCAxMDAwMDA7IGorKykKLQl7Ci0JICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTnZyYW0uU3dBcmIpOwotCSAgICBpZihWYWx1ZTMyICYgU1dfQVJCX0dOVDEpCi0JICAgIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgTU1fV2FpdCgxMCk7CisJLyogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcXVldWUuICovCisJRW50cnlDbnQgPSBRUV9HZXRFbnRyeUNudCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKworCS8qIE1ha2Ugc3VyZSBhbGwgdGhlIHBhY2tldHMgaGF2ZSBiZWVuIGFjY291bnRlZCBmb3IuICovCisJZm9yIChFbnRyeUNudCA9IDA7IEVudHJ5Q250IDwgcERldmljZS0+UnhQYWNrZXREZXNjQ250OyBFbnRyeUNudCsrKSB7CisJCXBQYWNrZXQgPQorCQkgICAgKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7CisJCWlmIChwUGFja2V0ID09IDApCisJCQlicmVhazsKKworCQlNTV9GcmVlUnhCdWZmZXIgKHBEZXZpY2UsIHBQYWNrZXQpOworCisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwogCX0KLSAgICB9CiAKLSAgICAvKiBHbG9iYWwgcmVzZXQuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5NaXNjQ2ZnLCBHUkNfTUlTQ19DRkdfQ09SRV9DTE9DS19SRVNFVCk7Ci0gICAgTU1fV2FpdCg0MCk7IE1NX1dhaXQoNDApOyBNTV9XYWl0KDQwKTsKKwlMTV9SZXNldENoaXAgKHBEZXZpY2UpOwogCi0gICAgLyogbWFrZSBzdXJlIHdlIHJlLWVuYWJsZSBpbmRpcmVjdCBhY2Nlc3NlcyAqLwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01JU0NfSE9TVF9DVFJMX1JFRywKLQlwRGV2aWNlLT5NaXNjSG9zdEN0cmwpOworCS8qIFJlc3RvcmUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9DQUNIRV9MSU5FX1NJWkVfUkVHLAorCQkJICBwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyk7CisJTE1fUmVnV3JJbmQgKHBEZXZpY2UsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lEX1JFRywKKwkJICAgICAocERldmljZS0+U3Vic3lzdGVtSWQgPDwgMTYpIHwgcERldmljZS0+U3Vic3lzdGVtVmVuZG9ySWQpOwogCi0gICAgLyogU2V0IE1BWCBQQ0kgcmV0cnkgdG8gemVyby4gKi8KLSAgICBWYWx1ZTMyID0gVDNfUENJX1NUQVRFX1BDSV9ST01fRU5BQkxFIHwgVDNfUENJX1NUQVRFX1BDSV9ST01fUkVUUllfRU5BQkxFOwotICAgIGlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKQotICAgIHsKLQlpZiAoIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKQotCXsKLQkgICAgVmFsdWUzMiB8PSBUM19QQ0lfU1RBVEVfUkVUUllfU0FNRV9ETUE7CisJLyogUmVwcm9ncmFtIHRoZSBNQUMgYWRkcmVzcy4gKi8KKwlMTV9TZXRNYWNBZGRyZXNzIChwRGV2aWNlLCBwRGV2aWNlLT5Ob2RlQWRkcmVzcyk7CisKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX0hhbHQgKi8KKworU1RBVElDIExNX1NUQVRVUyBMTV9SZXNldENoaXAgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9VSU5UMzIgajsKKworCS8qIFdhaXQgZm9yIGFjY2VzcyB0byB0aGUgbnZyYW0gaW50ZXJmYWNlIGJlZm9yZSByZXNldHRpbmcuICBUaGlzIGlzICovCisJLyogYSB3b3JrYXJvdW5kIHRvIHByZXZlbnQgRUVQUk9NIGNvcnJ1cHRpb24uICovCisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDAgJiYKKwkgICAgVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQkvKiBSZXF1ZXN0IGFjY2VzcyB0byB0aGUgZmxhc2ggaW50ZXJmYWNlLiAqLworCQlSRUdfV1IgKHBEZXZpY2UsIE52cmFtLlN3QXJiLCBTV19BUkJfUkVRX1NFVDEpOworCisJCWZvciAoaiA9IDA7IGogPCAxMDAwMDA7IGorKykgeworCQkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTnZyYW0uU3dBcmIpOworCQkJaWYgKFZhbHVlMzIgJiBTV19BUkJfR05UMSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJTU1fV2FpdCAoMTApOworCQl9CiAJfQotICAgIH0KLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9TVEFURV9SRUcsIFZhbHVlMzIpOwogCi0gICAgLyogUmVzdG9yZSBQQ0kgY29tbWFuZCByZWdpc3Rlci4gKi8KLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFBDSV9DT01NQU5EX1JFRywKLQlwRGV2aWNlLT5QY2lDb21tYW5kU3RhdHVzV29yZHMpOworCS8qIEdsb2JhbCByZXNldC4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEdyYy5NaXNjQ2ZnLCBHUkNfTUlTQ19DRkdfQ09SRV9DTE9DS19SRVNFVCk7CisJTU1fV2FpdCAoNDApOworCU1NX1dhaXQgKDQwKTsKKwlNTV9XYWl0ICg0MCk7CiAKLSAgICAvKiBEaXNhYmxlIFBDSS1YIHJlbGF4ZWQgb3JkZXJpbmcgYml0LiAqLwotICAgIE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBQQ0lYX0NBUF9SRUcsICZWYWx1ZTMyKTsKLSAgICBWYWx1ZTMyICY9IH5QQ0lYX0VOQUJMRV9SRUxBWEVEX09SREVSSU5HOwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgUENJWF9DQVBfUkVHLCBWYWx1ZTMyKTsKKwkvKiBtYWtlIHN1cmUgd2UgcmUtZW5hYmxlIGluZGlyZWN0IGFjY2Vzc2VzICovCisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgVDNfUENJX01JU0NfSE9TVF9DVFJMX1JFRywKKwkJCSAgcERldmljZS0+TWlzY0hvc3RDdHJsKTsKIAotICAgIC8qIEVuYWJsZSBtZW1vcnkgYXJiaXRlci4gKi8KLSAgICBSRUdfV1IocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLCBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSk7CisJLyogU2V0IE1BWCBQQ0kgcmV0cnkgdG8gemVyby4gKi8KKwlWYWx1ZTMyID0KKwkgICAgVDNfUENJX1NUQVRFX1BDSV9ST01fRU5BQkxFIHwgVDNfUENJX1NUQVRFX1BDSV9ST01fUkVUUllfRU5BQkxFOworCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKSB7CisJCWlmICghKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkpIHsKKwkJCVZhbHVlMzIgfD0gVDNfUENJX1NUQVRFX1JFVFJZX1NBTUVfRE1BOworCQl9CisJfQorCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9TVEFURV9SRUcsIFZhbHVlMzIpOwogCi0jaWZkZWYgQklHX0VORElBTl9QQ0kgICAgICAvKiBUaGlzIGZyb20gamZkICovCi0JVmFsdWUzMiA9IEdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBfAotCQkgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQTsKKwkvKiBSZXN0b3JlIFBDSSBjb21tYW5kIHJlZ2lzdGVyLiAqLworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9DT01NQU5EX1JFRywKKwkJCSAgcERldmljZS0+UGNpQ29tbWFuZFN0YXR1c1dvcmRzKTsKKworCS8qIERpc2FibGUgUENJLVggcmVsYXhlZCBvcmRlcmluZyBiaXQuICovCisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBQQ0lYX0NBUF9SRUcsICZWYWx1ZTMyKTsKKwlWYWx1ZTMyICY9IH5QQ0lYX0VOQUJMRV9SRUxBWEVEX09SREVSSU5HOworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFBDSVhfQ0FQX1JFRywgVmFsdWUzMik7CisKKwkvKiBFbmFibGUgbWVtb3J5IGFyYml0ZXIuICovCisJUkVHX1dSIChwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUsIFQzX01FTV9BUkJJVEVSX01PREVfRU5BQkxFKTsKKworI2lmZGVmIEJJR19FTkRJQU5fUENJCQkvKiBUaGlzIGZyb20gamZkICovCisJVmFsdWUzMiA9IEdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBIHwgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBOwogI2Vsc2UKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLSAgICAvKiBSZWNvbmZpZ3VyZSB0aGUgbW9kZSByZWdpc3Rlci4gKi8KLSAgICBWYWx1ZTMyID0gR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBIHwKLQkgICAgICBHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfAotCSAgICAgIEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBIHwKLQkgICAgICBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQTsKKwkvKiBSZWNvbmZpZ3VyZSB0aGUgbW9kZSByZWdpc3Rlci4gKi8KKwlWYWx1ZTMyID0gR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBIHwKKwkgICAgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBIHwKKwkgICAgR1JDX01PREVfQllURV9TV0FQX0RBVEEgfCBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQTsKICNlbHNlCi0gICAgLyogUmVjb25maWd1cmUgdGhlIG1vZGUgcmVnaXN0ZXIuICovCi0gICAgVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8IEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBOworCS8qIFJlY29uZmlndXJlIHRoZSBtb2RlIHJlZ2lzdGVyLiAqLworCVZhbHVlMzIgPSBHUkNfTU9ERV9CWVRFX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfCBHUkNfTU9ERV9CWVRFX1NXQVBfREFUQTsKICNlbmRpZgogI2VuZGlmCi0gICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Nb2RlLCBWYWx1ZTMyKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Nb2RlLCBWYWx1ZTMyKTsKIAotICAgIC8qIFByZXZlbnQgUFhFIGZyb20gcmVzdGFydGluZy4gKi8KLSAgICBNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIDB4MGI1MCwgVDNfTUFHSUNfTlVNKTsKKwkvKiBQcmV2ZW50IFBYRSBmcm9tIHJlc3RhcnRpbmcuICovCisJTUVNX1dSX09GRlNFVCAocERldmljZSwgMHgwYjUwLCBUM19NQUdJQ19OVU0pOwogCi0gICAgaWYocERldmljZS0+RW5hYmxlVGJpKSB7Ci0JcERldmljZS0+TWFjTW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgTUFDX01PREVfUE9SVF9NT0RFX1RCSSk7Ci0gICAgfQotICAgIGVsc2UgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIDApOwotICAgIH0KLQotICAgIC8qIFdhaXQgZm9yIHRoZSBmaXJtd2FyZSB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24uICovCi0gICAgZm9yKGogPSAwOyBqIDwgMTAwMDAwOyBqKyspCi0gICAgewotCU1NX1dhaXQoMTApOwotCi0JVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQocERldmljZSwgMHgwYjUwKTsKLQlpZihWYWx1ZTMyID09IH5UM19NQUdJQ19OVU0pCi0JewotCSAgICBicmVhazsKKwlpZiAocERldmljZS0+RW5hYmxlVGJpKSB7CisJCXBEZXZpY2UtPk1hY01vZGUgPSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgTUFDX01PREVfUE9SVF9NT0RFX1RCSSk7CisJfSBlbHNlIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIDApOwogCX0KLSAgICB9Ci0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCisJLyogV2FpdCBmb3IgdGhlIGZpcm13YXJlIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbi4gKi8KKwlmb3IgKGogPSAwOyBqIDwgMTAwMDAwOyBqKyspIHsKKwkJTU1fV2FpdCAoMTApOworCisJCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUIChwRGV2aWNlLCAweDBiNTApOworCQlpZiAoVmFsdWUzMiA9PSB+VDNfTUFHSUNfTlVNKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zODA4LDE2MSArMzUyOSwxNDMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9faW5saW5lIHN0YXRpYyB2b2lkCi1MTV9TZXJ2aWNlVHhJbnRlcnJ1cHQoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpIHsKLSAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7Ci0gICAgTE1fVUlOVDMyIEh3Q29uSWR4OwotICAgIExNX1VJTlQzMiBTd0NvbklkeDsKK19faW5saW5lIHN0YXRpYyB2b2lkIExNX1NlcnZpY2VUeEludGVycnVwdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworCVBMTV9QQUNLRVQgcFBhY2tldDsKKwlMTV9VSU5UMzIgSHdDb25JZHg7CisJTE1fVUlOVDMyIFN3Q29uSWR4OwogCi0gICAgSHdDb25JZHggPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4WzBdLlNlbmRDb25JZHg7Ci0KLSAgICAvKiBHZXQgb3VyIGNvcHkgb2YgdGhlIGNvbnN1bWVyIGluZGV4LiAgVGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLwotICAgIC8qIHRoYXQgYXJlIGluIGJldHdlZW4gdGhlIGNvbnN1bWVyIGluZGljZXMgYXJlIGZyZWVkLiAqLwotICAgIFN3Q29uSWR4ID0gcERldmljZS0+U2VuZENvbklkeDsKLQotICAgIC8qIE1vdmUgdGhlIHBhY2tldHMgZnJvbSB0aGUgVHhQYWNrZXRBY3RpdmVRIHRoYXQgYXJlIHNlbnQgb3V0IHRvICovCi0gICAgLyogdGhlIFR4UGFja2V0WG1pdHRlZFEuICBQYWNrZXRzIHRoYXQgYXJlIHNlbnQgdXNlIHRoZSAqLwotICAgIC8qIGRlc2NyaXB0b3JzIHRoYXQgYXJlIGJldHdlZW4gU3dDb25JZHggYW5kIEh3Q29uSWR4LiAqLwotICAgIHdoaWxlKFN3Q29uSWR4ICE9IEh3Q29uSWR4KQotICAgIHsKLQkvKiBHZXQgdGhlIHBhY2tldCB0aGF0IHdhcyBzZW50IGZyb20gdGhlIFR4UGFja2V0QWN0aXZlUS4gKi8KLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQoCi0JICAgICZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyKTsKLQotCS8qIFNldCB0aGUgcmV0dXJuIHN0YXR1cy4gKi8KLQlwUGFja2V0LT5QYWNrZXRTdGF0dXMgPSBMTV9TVEFUVVNfU1VDQ0VTUzsKLQotCS8qIFB1dCB0aGUgcGFja2V0IGluIHRoZSBUeFBhY2tldFhtaXR0ZWRRIGZvciBpbmRpY2F0aW9uIGxhdGVyLiAqLwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lciwgcFBhY2tldCk7Ci0KLQkvKiBNb3ZlIHRvIHRoZSBuZXh0IHBhY2tldCdzIEJELiAqLwotCVN3Q29uSWR4ID0gKFN3Q29uSWR4ICsgcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpICYKLQkgICAgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKLQotCS8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBCRHMuICovCi0JYXRvbWljX2FkZChwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOwotCi0JLyogR2V0IHRoZSBuZXcgdXBkYXRlZCBId0NvbklkeC4gKi8KIAlId0NvbklkeCA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5JZHhbMF0uU2VuZENvbklkeDsKLSAgICB9IC8qIHdoaWxlICovCiAKLSAgICAvKiBTYXZlIHRoZSBuZXcgU3dDb25JZHguICovCi0gICAgcERldmljZS0+U2VuZENvbklkeCA9IFN3Q29uSWR4OworCS8qIEdldCBvdXIgY29weSBvZiB0aGUgY29uc3VtZXIgaW5kZXguICBUaGUgYnVmZmVyIGRlc2NyaXB0b3JzICovCisJLyogdGhhdCBhcmUgaW4gYmV0d2VlbiB0aGUgY29uc3VtZXIgaW5kaWNlcyBhcmUgZnJlZWQuICovCisJU3dDb25JZHggPSBwRGV2aWNlLT5TZW5kQ29uSWR4OwogCi19IC8qIExNX1NlcnZpY2VUeEludGVycnVwdCAqLworCS8qIE1vdmUgdGhlIHBhY2tldHMgZnJvbSB0aGUgVHhQYWNrZXRBY3RpdmVRIHRoYXQgYXJlIHNlbnQgb3V0IHRvICovCisJLyogdGhlIFR4UGFja2V0WG1pdHRlZFEuICBQYWNrZXRzIHRoYXQgYXJlIHNlbnQgdXNlIHRoZSAqLworCS8qIGRlc2NyaXB0b3JzIHRoYXQgYXJlIGJldHdlZW4gU3dDb25JZHggYW5kIEh3Q29uSWR4LiAqLworCXdoaWxlIChTd0NvbklkeCAhPSBId0NvbklkeCkgeworCQkvKiBHZXQgdGhlIHBhY2tldCB0aGF0IHdhcyBzZW50IGZyb20gdGhlIFR4UGFja2V0QWN0aXZlUS4gKi8KKwkJcFBhY2tldCA9CisJCSAgICAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCAoJnBEZXZpY2UtPlR4UGFja2V0QWN0aXZlUS4KKwkJCQkJICAgICBDb250YWluZXIpOwogCisJCS8qIFNldCB0aGUgcmV0dXJuIHN0YXR1cy4gKi8KKwkJcFBhY2tldC0+UGFja2V0U3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7CisKKwkJLyogUHV0IHRoZSBwYWNrZXQgaW4gdGhlIFR4UGFja2V0WG1pdHRlZFEgZm9yIGluZGljYXRpb24gbGF0ZXIuICovCisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+VHhQYWNrZXRYbWl0dGVkUS5Db250YWluZXIsIHBQYWNrZXQpOworCisJCS8qIE1vdmUgdG8gdGhlIG5leHQgcGFja2V0J3MgQkQuICovCisJCVN3Q29uSWR4ID0gKFN3Q29uSWR4ICsgcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpICYKKwkJICAgIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisKKwkJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgdW51c2VkIEJEcy4gKi8KKwkJYXRvbWljX2FkZCAocFBhY2tldC0+dS5UeC5GcmFnQ291bnQsICZwRGV2aWNlLT5TZW5kQmRMZWZ0KTsKKworCQkvKiBHZXQgdGhlIG5ldyB1cGRhdGVkIEh3Q29uSWR4LiAqLworCQlId0NvbklkeCA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5JZHhbMF0uU2VuZENvbklkeDsKKwl9CQkJLyogd2hpbGUgKi8KKworCS8qIFNhdmUgdGhlIG5ldyBTd0NvbklkeC4gKi8KKwlwRGV2aWNlLT5TZW5kQ29uSWR4ID0gU3dDb25JZHg7CisKK30JCQkJLyogTE1fU2VydmljZVR4SW50ZXJydXB0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX19pbmxpbmUgc3RhdGljIHZvaWQKLUxNX1NlcnZpY2VSeEludGVycnVwdCgKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkgewotICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKLSAgICBQVDNfUkNWX0JEIHBSY3ZCZDsKLSAgICBMTV9VSU5UMzIgSHdSY3ZSZXRQcm9kSWR4OwotICAgIExNX1VJTlQzMiBTd1JjdlJldENvbklkeDsKK19faW5saW5lIHN0YXRpYyB2b2lkIExNX1NlcnZpY2VSeEludGVycnVwdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworCVBMTV9QQUNLRVQgcFBhY2tldDsKKwlQVDNfUkNWX0JEIHBSY3ZCZDsKKwlMTV9VSU5UMzIgSHdSY3ZSZXRQcm9kSWR4OworCUxNX1VJTlQzMiBTd1JjdlJldENvbklkeDsKIAotICAgIC8qIExvb3AgdGhydSB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZ3MgZm9yIHJlY2VpdmVkIHBhY2tldHMuICovCi0gICAgSHdSY3ZSZXRQcm9kSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFswXS5SY3ZQcm9kSWR4OwotCi0gICAgU3dSY3ZSZXRDb25JZHggPSBwRGV2aWNlLT5SY3ZSZXRDb25JZHg7Ci0gICAgd2hpbGUoU3dSY3ZSZXRDb25JZHggIT0gSHdSY3ZSZXRQcm9kSWR4KQotICAgIHsKLQlwUmN2QmQgPSAmcERldmljZS0+cFJjdlJldEJkVmlydFtTd1JjdlJldENvbklkeF07Ci0KLQkvKiBHZXQgdGhlIHJlY2VpdmVkIHBhY2tldCBkZXNjcmlwdG9yLiAqLwotCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgKE1NX1VJTlRfUFRSKHBEZXZpY2UtPnBQYWNrZXREZXNjQmFzZSkgKwotCSAgICBNTV9VSU5UX1BUUihwUmN2QmQtPk9wYXF1ZSkpOwotCi0JLyogQ2hlY2sgdGhlIGVycm9yIGZsYWcuICovCi0JaWYocFJjdkJkLT5FcnJvckZsYWcgJiYKLQkgICAgcFJjdkJkLT5FcnJvckZsYWcgIT0gUkNWX0JEX0VSUl9PRERfTklCQkxFRF9SQ1ZEX01JSSkKLQl7Ci0JICAgIHBQYWNrZXQtPlBhY2tldFN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOwotCi0JICAgIHBEZXZpY2UtPlJ4Q291bnRlcnMuUnhQYWNrZXRFcnJDbnQrKzsKLQotCSAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfQkFEX0NSQykKLQkgICAgewotCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyQ3JjQ250Kys7Ci0JICAgIH0KLQotCSAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfQ09MTF9ERVRFQ1QpCi0JICAgIHsKLQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyckNvbGxDbnQrKzsKLQkgICAgfQotCi0JICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9MSU5LX0xPU1RfRFVSSU5HX1BLVCkKLQkgICAgewotCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyTGlua0xvc3RDbnQrKzsKLQkgICAgfQotCi0JICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9QSFlfREVDT0RFX0VSUikKLQkgICAgewotCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyUGh5RGVjb2RlQ250Kys7Ci0JICAgIH0KLQotCSAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfT0REX05JQkJMRURfUkNWRF9NSUkpCi0JICAgIHsKLQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyck9kZE5pYmJsZUNudCsrOwotCSAgICB9Ci0KLQkgICAgaWYocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX01BQ19BQk9SVCkKLQkgICAgewotCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyTWFjQWJvcnRDbnQrKzsKLQkgICAgfQotCi0JICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9MRU5fTFRfNjQpCi0JICAgIHsKLQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyclNob3J0UGFja2V0Q250Kys7Ci0JICAgIH0KLQotCSAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfVFJVTkNfTk9fUkVTT1VSQ0VTKQotCSAgICB7Ci0JCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJOb1Jlc291cmNlQ250Kys7Ci0JICAgIH0KLQotCSAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfR0lBTlRfRlJBTUVfUkNWRCkKLQkgICAgewotCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyTGFyZ2VQYWNrZXRDbnQrKzsKLQkgICAgfQotCX0KLQllbHNlCi0JewotCSAgICBwUGFja2V0LT5QYWNrZXRTdGF0dXMgPSBMTV9TVEFUVVNfU1VDQ0VTUzsKLQkgICAgcFBhY2tldC0+UGFja2V0U2l6ZSA9IHBSY3ZCZC0+TGVuIC0gNDsKLQotCSAgICBwUGFja2V0LT5GbGFncyA9IHBSY3ZCZC0+RmxhZ3M7Ci0JICAgIGlmKHBSY3ZCZC0+RmxhZ3MgJiBSQ1ZfQkRfRkxBR19WTEFOX1RBRykKLQkgICAgewotCQlwUGFja2V0LT5WbGFuVGFnID0gcFJjdkJkLT5WbGFuVGFnOwotCSAgICB9Ci0KLQkgICAgcFBhY2tldC0+dS5SeC5UY3BVZHBDaGVja3N1bSA9IHBSY3ZCZC0+VGNwVWRwQ2tzdW07Ci0JfQotCi0JLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBjb250YWluaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQgKi8KLQkvKiBidWZmZXIgaW4gdGhlIFJ4UGFja2V0UmVjZWl2ZWRRIGZvciBpbmRpY2F0aW9uIGxhdGVyLiAqLwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIsIHBQYWNrZXQpOwotCi0JLyogR28gdG8gdGhlIG5leHQgYnVmZmVyIGRlc2NyaXB0b3IuICovCi0JU3dSY3ZSZXRDb25JZHggPSAoU3dSY3ZSZXRDb25JZHggKyAxKSAmCi0JICAgIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UX01BU0s7Ci0KLQkvKiBHZXQgdGhlIHVwZGF0ZWQgSHdSY3ZSZXRQcm9kSWR4LiAqLworCS8qIExvb3AgdGhydSB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZ3MgZm9yIHJlY2VpdmVkIHBhY2tldHMuICovCiAJSHdSY3ZSZXRQcm9kSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFswXS5SY3ZQcm9kSWR4OwotICAgIH0gLyogd2hpbGUgKi8KIAotICAgIHBEZXZpY2UtPlJjdlJldENvbklkeCA9IFN3UmN2UmV0Q29uSWR4OworCVN3UmN2UmV0Q29uSWR4ID0gcERldmljZS0+UmN2UmV0Q29uSWR4OworCXdoaWxlIChTd1JjdlJldENvbklkeCAhPSBId1JjdlJldFByb2RJZHgpIHsKKwkJcFJjdkJkID0gJnBEZXZpY2UtPnBSY3ZSZXRCZFZpcnRbU3dSY3ZSZXRDb25JZHhdOwogCi0gICAgLyogVXBkYXRlIHRoZSByZWNlaXZlIHJldHVybiByaW5nIGNvbnN1bWVyIGluZGV4LiAqLwotICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlJjdlJldENvbklkeFswXS5Mb3csIFN3UmN2UmV0Q29uSWR4KTsKLX0gLyogTE1fU2VydmljZVJ4SW50ZXJydXB0ICovCisJCS8qIEdldCB0aGUgcmVjZWl2ZWQgcGFja2V0IGRlc2NyaXB0b3IuICovCisJCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgKE1NX1VJTlRfUFRSIChwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpICsKKwkJCQkJTU1fVUlOVF9QVFIgKHBSY3ZCZC0+T3BhcXVlKSk7CiAKKwkJLyogQ2hlY2sgdGhlIGVycm9yIGZsYWcuICovCisJCWlmIChwUmN2QmQtPkVycm9yRmxhZyAmJgorCQkgICAgcFJjdkJkLT5FcnJvckZsYWcgIT0gUkNWX0JEX0VSUl9PRERfTklCQkxFRF9SQ1ZEX01JSSkgeworCQkJcFBhY2tldC0+UGFja2V0U3RhdHVzID0gTE1fU1RBVFVTX0ZBSUxVUkU7CisKKwkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhQYWNrZXRFcnJDbnQrKzsKKworCQkJaWYgKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9CQURfQ1JDKSB7CisJCQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyckNyY0NudCsrOworCQkJfQorCisJCQlpZiAocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX0NPTExfREVURUNUKSB7CisJCQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyckNvbGxDbnQrKzsKKwkJCX0KKworCQkJaWYgKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9MSU5LX0xPU1RfRFVSSU5HX1BLVCkgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJMaW5rTG9zdENudCsrOworCQkJfQorCisJCQlpZiAocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX1BIWV9ERUNPREVfRVJSKSB7CisJCQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyclBoeURlY29kZUNudCsrOworCQkJfQorCisJCQlpZiAocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX09ERF9OSUJCTEVEX1JDVkRfTUlJKSB7CisJCQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyck9kZE5pYmJsZUNudCsrOworCQkJfQorCisJCQlpZiAocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX01BQ19BQk9SVCkgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJNYWNBYm9ydENudCsrOworCQkJfQorCisJCQlpZiAocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX0xFTl9MVF82NCkgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJTaG9ydFBhY2tldENudCsrOworCQkJfQorCisJCQlpZiAocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX1RSVU5DX05PX1JFU09VUkNFUykgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJOb1Jlc291cmNlQ250Kys7CisJCQl9CisKKwkJCWlmIChwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfR0lBTlRfRlJBTUVfUkNWRCkgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJMYXJnZVBhY2tldENudCsrOworCQkJfQorCQl9IGVsc2UgeworCQkJcFBhY2tldC0+UGFja2V0U3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7CisJCQlwUGFja2V0LT5QYWNrZXRTaXplID0gcFJjdkJkLT5MZW4gLSA0OworCisJCQlwUGFja2V0LT5GbGFncyA9IHBSY3ZCZC0+RmxhZ3M7CisJCQlpZiAocFJjdkJkLT5GbGFncyAmIFJDVl9CRF9GTEFHX1ZMQU5fVEFHKSB7CisJCQkJcFBhY2tldC0+VmxhblRhZyA9IHBSY3ZCZC0+VmxhblRhZzsKKwkJCX0KKworCQkJcFBhY2tldC0+dS5SeC5UY3BVZHBDaGVja3N1bSA9IHBSY3ZCZC0+VGNwVWRwQ2tzdW07CisJCX0KKworCQkvKiBQdXQgdGhlIHBhY2tldCBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIHBhY2tldCAqLworCQkvKiBidWZmZXIgaW4gdGhlIFJ4UGFja2V0UmVjZWl2ZWRRIGZvciBpbmRpY2F0aW9uIGxhdGVyLiAqLworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lciwgcFBhY2tldCk7CisKKwkJLyogR28gdG8gdGhlIG5leHQgYnVmZmVyIGRlc2NyaXB0b3IuICovCisJCVN3UmN2UmV0Q29uSWR4ID0gKFN3UmN2UmV0Q29uSWR4ICsgMSkgJgorCQkgICAgVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKworCQkvKiBHZXQgdGhlIHVwZGF0ZWQgSHdSY3ZSZXRQcm9kSWR4LiAqLworCQlId1JjdlJldFByb2RJZHggPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4WzBdLlJjdlByb2RJZHg7CisJfQkJCS8qIHdoaWxlICovCisKKwlwRGV2aWNlLT5SY3ZSZXRDb25JZHggPSBTd1JjdlJldENvbklkeDsKKworCS8qIFVwZGF0ZSB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZyBjb25zdW1lciBpbmRleC4gKi8KKwlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guUmN2UmV0Q29uSWR4WzBdLkxvdywgU3dSY3ZSZXRDb25JZHgpOworfQkJCQkvKiBMTV9TZXJ2aWNlUnhJbnRlcnJ1cHQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOTcyLDIwNyArMzY3NSwxODAgQEAKIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1NUQVRVUwotTE1fU2VydmljZUludGVycnVwdHMoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTE1fU1RBVFVTIExNX1NlcnZpY2VJbnRlcnJ1cHRzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgaW50IFNlcnZpY2VQaHlJbnQgPSBGQUxTRTsKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlpbnQgU2VydmljZVBoeUludCA9IEZBTFNFOwogCi0gICAgLyogU2V0dXAgdGhlIHBoeSBjaGlwIHdoZW5ldmVyIHRoZSBsaW5rIHN0YXR1cyBjaGFuZ2VzLiAqLwotICAgIGlmKHBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9PSBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX1JFRykKLSAgICB7Ci0JVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7Ci0JaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUKQotCXsKLQkgICAgaWYgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVCkKLQkgICAgewotCQlTZXJ2aWNlUGh5SW50ID0gVFJVRTsKLQkgICAgfQorCS8qIFNldHVwIHRoZSBwaHkgY2hpcCB3aGVuZXZlciB0aGUgbGluayBzdGF0dXMgY2hhbmdlcy4gKi8KKwlpZiAocERldmljZS0+TGlua0NobmdNb2RlID09IFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHKSB7CisJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKKwkJaWYgKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVCkgeworCQkJaWYgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVCkgeworCQkJCVNlcnZpY2VQaHlJbnQgPSBUUlVFOworCQkJfQorCQl9IGVsc2UgaWYgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX0xJTktfU1RBVEVfQ0hBTkdFRCkgeworCQkJU2VydmljZVBoeUludCA9IFRSVUU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPgorCQkgICAgU3RhdHVzICYgU1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMpIHsKKwkJCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPQorCQkJICAgIFNUQVRVU19CTE9DS19VUERBVEVEIHwgKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT4KKwkJCQkJCSAgICBTdGF0dXMgJgorCQkJCQkJICAgIH5TVEFUVVNfQkxPQ0tfTElOS19DSEFOR0VEX1NUQVRVUyk7CisJCQlTZXJ2aWNlUGh5SW50ID0gVFJVRTsKKwkJfQogCX0KLQllbHNlIGlmKFZhbHVlMzIgJiBNQUNfU1RBVFVTX0xJTktfU1RBVEVfQ0hBTkdFRCkKLQl7Ci0JICAgIFNlcnZpY2VQaHlJbnQgPSBUUlVFOwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgU1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMpCi0JewotCSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0gU1RBVFVTX0JMT0NLX1VQREFURUQgfAotCQkocERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyAmIH5TVEFUVVNfQkxPQ0tfTElOS19DSEFOR0VEX1NUQVRVUyk7Ci0JICAgIFNlcnZpY2VQaHlJbnQgPSBUUlVFOwotCX0KLSAgICB9CiAjaWYgSU5DTFVERV9UQklfU1VQUE9SVAotICAgIGlmIChwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlID09IFRSVUUpCi0gICAgewotCVNlcnZpY2VQaHlJbnQgPSBGQUxTRTsKLSAgICB9CisJaWYgKHBEZXZpY2UtPklnbm9yZVRiaUxpbmtDaGFuZ2UgPT0gVFJVRSkgeworCQlTZXJ2aWNlUGh5SW50ID0gRkFMU0U7CisJfQogI2VuZGlmCi0gICAgaWYgKFNlcnZpY2VQaHlJbnQgPT0gVFJVRSkKLSAgICB7Ci0JTE1fU2V0dXBQaHkocERldmljZSk7Ci0gICAgfQotCi0gICAgLyogU2VydmljZSByZWNlaXZlIGFuZCB0cmFuc21pdCBpbnRlcnJ1cHRzLiAqLwotICAgIExNX1NlcnZpY2VSeEludGVycnVwdChwRGV2aWNlKTsKLSAgICBMTV9TZXJ2aWNlVHhJbnRlcnJ1cHQocERldmljZSk7Ci0KLSAgICAvKiBObyBzcGlubG9jayBmb3IgdGhpcyBxdWV1ZSBzaW5jZSB0aGlzIHJvdXRpbmUgaXMgc2VyaWFsaXplZC4gKi8KLSAgICBpZighUVFfRW1wdHkoJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lcikpCi0gICAgewotCS8qIEluZGljYXRlIHJlY2VpdmUgcGFja2V0cy4gKi8KLQlNTV9JbmRpY2F0ZVJ4UGFja2V0cyhwRGV2aWNlKTsKLQkvKiAgICAgICBMTV9RdWV1ZVJ4UGFja2V0cyhwRGV2aWNlKTsgKi8KLSAgICB9Ci0KLSAgICAvKiBObyBzcGlubG9jayBmb3IgdGhpcyBxdWV1ZSBzaW5jZSB0aGlzIHJvdXRpbmUgaXMgc2VyaWFsaXplZC4gKi8KLSAgICBpZighUVFfRW1wdHkoJnBEZXZpY2UtPlR4UGFja2V0WG1pdHRlZFEuQ29udGFpbmVyKSkKLSAgICB7Ci0JTU1fSW5kaWNhdGVUeFBhY2tldHMocERldmljZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9TZXJ2aWNlSW50ZXJydXB0cyAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9NdWx0aWNhc3RBZGQoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1QTE1fVUlOVDggcE1jQWRkcmVzcykgewotICAgIFBMTV9VSU5UOCBwRW50cnk7Ci0gICAgTE1fVUlOVDMyIGo7Ci0KLSAgICBwRW50cnkgPSBwRGV2aWNlLT5NY1RhYmxlWzBdOwotICAgIGZvcihqID0gMDsgaiA8IHBEZXZpY2UtPk1jRW50cnlDb3VudDsgaisrKQotICAgIHsKLQlpZihJU19FVEhfQUREUkVTU19FUVVBTChwRW50cnksIHBNY0FkZHJlc3MpKQotCXsKLQkgICAgLyogRm91bmQgYSBtYXRjaCwgaW5jcmVtZW50IHRoZSBpbnN0YW5jZSBjb3VudC4gKi8KLQkgICAgcEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSArPSAxOwotCi0JICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlpZiAoU2VydmljZVBoeUludCA9PSBUUlVFKSB7CisJCUxNX1NldHVwUGh5IChwRGV2aWNlKTsKIAl9CiAKLQlwRW50cnkgKz0gTE1fTUNfRU5UUllfU0laRTsKLSAgICB9CisJLyogU2VydmljZSByZWNlaXZlIGFuZCB0cmFuc21pdCBpbnRlcnJ1cHRzLiAqLworCUxNX1NlcnZpY2VSeEludGVycnVwdCAocERldmljZSk7CisJTE1fU2VydmljZVR4SW50ZXJydXB0IChwRGV2aWNlKTsKIAotICAgIGlmKHBEZXZpY2UtPk1jRW50cnlDb3VudCA+PSBMTV9NQVhfTUNfVEFCTEVfU0laRSkKLSAgICB7Ci0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotICAgIH0KLQotICAgIHBFbnRyeSA9IHBEZXZpY2UtPk1jVGFibGVbcERldmljZS0+TWNFbnRyeUNvdW50XTsKLQotICAgIENPUFlfRVRIX0FERFJFU1MocE1jQWRkcmVzcywgcEVudHJ5KTsKLSAgICBwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdID0gMTsKLQotICAgIHBEZXZpY2UtPk1jRW50cnlDb3VudCsrOwotCi0gICAgTE1fU2V0UmVjZWl2ZU1hc2socERldmljZSwgcERldmljZS0+UmVjZWl2ZU1hc2sgfCBMTV9BQ0NFUFRfTVVMVElDQVNUKTsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0gLyogTE1fTXVsdGljYXN0QWRkICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX011bHRpY2FzdERlbCgKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLVBMTV9VSU5UOCBwTWNBZGRyZXNzKSB7Ci0gICAgUExNX1VJTlQ4IHBFbnRyeTsKLSAgICBMTV9VSU5UMzIgajsKLQotICAgIHBFbnRyeSA9IHBEZXZpY2UtPk1jVGFibGVbMF07Ci0gICAgZm9yKGogPSAwOyBqIDwgcERldmljZS0+TWNFbnRyeUNvdW50OyBqKyspCi0gICAgewotCWlmKElTX0VUSF9BRERSRVNTX0VRVUFMKHBFbnRyeSwgcE1jQWRkcmVzcykpCi0JewotCSAgICAvKiBGb3VuZCBhIG1hdGNoLCBkZWNyZW1lbnQgdGhlIGluc3RhbmNlIGNvdW50LiAqLwotCSAgICBwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdIC09IDE7Ci0KLQkgICAgLyogTm8gbW9yZSBpbnN0YW5jZSBsZWZ0LCByZW1vdmUgdGhlIGFkZHJlc3MgZnJvbSB0aGUgdGFibGUuICovCi0JICAgIC8qIE1vdmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHRhYmxlIHRvIHRoZSBkZWxldGUgc2xvdC4gKi8KLQkgICAgaWYocEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSA9PSAwICYmCi0JCXBEZXZpY2UtPk1jRW50cnlDb3VudCA+IDEpCi0JICAgIHsKLQotCQlDT1BZX0VUSF9BRERSRVNTKAotCQkgICAgcERldmljZS0+TWNUYWJsZVtwRGV2aWNlLT5NY0VudHJ5Q291bnQtMV0sIHBFbnRyeSk7Ci0JCXBFbnRyeVtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF0gPQotCQkgICAgcERldmljZS0+TWNUYWJsZVtwRGV2aWNlLT5NY0VudHJ5Q291bnQtMV0KLQkJICAgIFtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF07Ci0JICAgIH0KLQkgICAgcERldmljZS0+TWNFbnRyeUNvdW50LS07Ci0KLQkgICAgLyogVXBkYXRlIHRoZSByZWNlaXZlIG1hc2sgaWYgdGhlIHRhYmxlIGlzIGVtcHR5LiAqLwotCSAgICBpZihwRGV2aWNlLT5NY0VudHJ5Q291bnQgPT0gMCkKLQkgICAgewotCQlMTV9TZXRSZWNlaXZlTWFzayhwRGV2aWNlLAotCQkgICAgcERldmljZS0+UmVjZWl2ZU1hc2sgJiB+TE1fQUNDRVBUX01VTFRJQ0FTVCk7Ci0JICAgIH0KLQotCSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJLyogTm8gc3BpbmxvY2sgZm9yIHRoaXMgcXVldWUgc2luY2UgdGhpcyByb3V0aW5lIGlzIHNlcmlhbGl6ZWQuICovCisJaWYgKCFRUV9FbXB0eSAoJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lcikpIHsKKwkJLyogSW5kaWNhdGUgcmVjZWl2ZSBwYWNrZXRzLiAqLworCQlNTV9JbmRpY2F0ZVJ4UGFja2V0cyAocERldmljZSk7CisJCS8qICAgICAgIExNX1F1ZXVlUnhQYWNrZXRzKHBEZXZpY2UpOyAqLwogCX0KIAotCXBFbnRyeSArPSBMTV9NQ19FTlRSWV9TSVpFOwotICAgIH0KKwkvKiBObyBzcGlubG9jayBmb3IgdGhpcyBxdWV1ZSBzaW5jZSB0aGlzIHJvdXRpbmUgaXMgc2VyaWFsaXplZC4gKi8KKwlpZiAoIVFRX0VtcHR5ICgmcERldmljZS0+VHhQYWNrZXRYbWl0dGVkUS5Db250YWluZXIpKSB7CisJCU1NX0luZGljYXRlVHhQYWNrZXRzIChwRGV2aWNlKTsKKwl9CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci19IC8qIExNX011bHRpY2FzdERlbCAqLwotCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9TZXJ2aWNlSW50ZXJydXB0cyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1NUQVRVUwotTE1fTXVsdGljYXN0Q2xlYXIoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpIHsKLSAgICBwRGV2aWNlLT5NY0VudHJ5Q291bnQgPSAwOwotCi0gICAgTE1fU2V0UmVjZWl2ZU1hc2socERldmljZSwgcERldmljZS0+UmVjZWl2ZU1hc2sgJiB+TE1fQUNDRVBUX01VTFRJQ0FTVCk7Ci0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19IC8qIExNX011bHRpY2FzdENsZWFyICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX1NldE1hY0FkZHJlc3MoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotICAgIFBMTV9VSU5UOCBwTWFjQWRkcmVzcykKK0xNX1NUQVRVUyBMTV9NdWx0aWNhc3RBZGQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBNY0FkZHJlc3MpCiB7Ci0gICAgTE1fVUlOVDMyIGo7CisJUExNX1VJTlQ4IHBFbnRyeTsKKwlMTV9VSU5UMzIgajsKIAotICAgIGZvcihqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWFjQWRkcltqXS5IaWdoLAotCSAgICAocE1hY0FkZHJlc3NbMF0gPDwgOCkgfCBwTWFjQWRkcmVzc1sxXSk7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWFjQWRkcltqXS5Mb3csCi0JICAgIChwTWFjQWRkcmVzc1syXSA8PCAyNCkgfCAocE1hY0FkZHJlc3NbM10gPDwgMTYpIHwKLQkgICAgKHBNYWNBZGRyZXNzWzRdIDw8IDgpIHwgcE1hY0FkZHJlc3NbNV0pOwotICAgIH0KKwlwRW50cnkgPSBwRGV2aWNlLT5NY1RhYmxlWzBdOworCWZvciAoaiA9IDA7IGogPCBwRGV2aWNlLT5NY0VudHJ5Q291bnQ7IGorKykgeworCQlpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwgKHBFbnRyeSwgcE1jQWRkcmVzcykpIHsKKwkJCS8qIEZvdW5kIGEgbWF0Y2gsIGluY3JlbWVudCB0aGUgaW5zdGFuY2UgY291bnQuICovCisJCQlwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdICs9IDE7CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJCQlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJCX0KKworCQlwRW50cnkgKz0gTE1fTUNfRU5UUllfU0laRTsKKwl9CisKKwlpZiAocERldmljZS0+TWNFbnRyeUNvdW50ID49IExNX01BWF9NQ19UQUJMRV9TSVpFKSB7CisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlwRW50cnkgPSBwRGV2aWNlLT5NY1RhYmxlW3BEZXZpY2UtPk1jRW50cnlDb3VudF07CisKKwlDT1BZX0VUSF9BRERSRVNTIChwTWNBZGRyZXNzLCBwRW50cnkpOworCXBFbnRyeVtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF0gPSAxOworCisJcERldmljZS0+TWNFbnRyeUNvdW50Kys7CisKKwlMTV9TZXRSZWNlaXZlTWFzayAocERldmljZSwgcERldmljZS0+UmVjZWl2ZU1hc2sgfCBMTV9BQ0NFUFRfTVVMVElDQVNUKTsKKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30JCQkJLyogTE1fTXVsdGljYXN0QWRkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTIExNX011bHRpY2FzdERlbCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcE1jQWRkcmVzcykKK3sKKwlQTE1fVUlOVDggcEVudHJ5OworCUxNX1VJTlQzMiBqOworCisJcEVudHJ5ID0gcERldmljZS0+TWNUYWJsZVswXTsKKwlmb3IgKGogPSAwOyBqIDwgcERldmljZS0+TWNFbnRyeUNvdW50OyBqKyspIHsKKwkJaWYgKElTX0VUSF9BRERSRVNTX0VRVUFMIChwRW50cnksIHBNY0FkZHJlc3MpKSB7CisJCQkvKiBGb3VuZCBhIG1hdGNoLCBkZWNyZW1lbnQgdGhlIGluc3RhbmNlIGNvdW50LiAqLworCQkJcEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSAtPSAxOworCisJCQkvKiBObyBtb3JlIGluc3RhbmNlIGxlZnQsIHJlbW92ZSB0aGUgYWRkcmVzcyBmcm9tIHRoZSB0YWJsZS4gKi8KKwkJCS8qIE1vdmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHRhYmxlIHRvIHRoZSBkZWxldGUgc2xvdC4gKi8KKwkJCWlmIChwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdID09IDAgJiYKKwkJCSAgICBwRGV2aWNlLT5NY0VudHJ5Q291bnQgPiAxKSB7CisKKwkJCQlDT1BZX0VUSF9BRERSRVNTIChwRGV2aWNlLT4KKwkJCQkJCSAgTWNUYWJsZVtwRGV2aWNlLT4KKwkJCQkJCQkgIE1jRW50cnlDb3VudCAtIDFdLAorCQkJCQkJICBwRW50cnkpOworCQkJCXBFbnRyeVtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF0gPQorCQkJCSAgICBwRGV2aWNlLT5NY1RhYmxlW3BEZXZpY2UtPk1jRW50cnlDb3VudCAtIDFdCisJCQkJICAgIFtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF07CisJCQl9CisJCQlwRGV2aWNlLT5NY0VudHJ5Q291bnQtLTsKKworCQkJLyogVXBkYXRlIHRoZSByZWNlaXZlIG1hc2sgaWYgdGhlIHRhYmxlIGlzIGVtcHR5LiAqLworCQkJaWYgKHBEZXZpY2UtPk1jRW50cnlDb3VudCA9PSAwKSB7CisJCQkJTE1fU2V0UmVjZWl2ZU1hc2sgKHBEZXZpY2UsCisJCQkJCQkgICBwRGV2aWNlLT4KKwkJCQkJCSAgIFJlY2VpdmVNYXNrICYKKwkJCQkJCSAgIH5MTV9BQ0NFUFRfTVVMVElDQVNUKTsKKwkJCX0KKworCQkJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCQl9CisKKwkJcEVudHJ5ICs9IExNX01DX0VOVFJZX1NJWkU7CisJfQorCisJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworfQkJCQkvKiBMTV9NdWx0aWNhc3REZWwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMgTE1fTXVsdGljYXN0Q2xlYXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKwlwRGV2aWNlLT5NY0VudHJ5Q291bnQgPSAwOworCisJTE1fU2V0UmVjZWl2ZU1hc2sgKHBEZXZpY2UsCisJCQkgICBwRGV2aWNlLT5SZWNlaXZlTWFzayAmIH5MTV9BQ0NFUFRfTVVMVElDQVNUKTsKKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30JCQkJLyogTE1fTXVsdGljYXN0Q2xlYXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMgTE1fU2V0TWFjQWRkcmVzcyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcE1hY0FkZHJlc3MpCit7CisJTE1fVUlOVDMyIGo7CisKKwlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NYWNBZGRyW2pdLkhpZ2gsCisJCQkocE1hY0FkZHJlc3NbMF0gPDwgOCkgfCBwTWFjQWRkcmVzc1sxXSk7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NYWNBZGRyW2pdLkxvdywKKwkJCShwTWFjQWRkcmVzc1syXSA8PCAyNCkgfCAocE1hY0FkZHJlc3NbM10gPDwgMTYpIHwKKwkJCShwTWFjQWRkcmVzc1s0XSA8PCA4KSB8IHBNYWNBZGRyZXNzWzVdKTsKKwl9CisKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBTZXRzIHVwIHRoZSBkZWZhdWx0IGxpbmUgc3BlZWQsIGFuZCBkdXBsZXggbW9kZXMgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCAqLwpAQCAtNDE4Miw5MyArMzg1OCw5MyBAQAogLyogICAgTm9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgTE1fU1RBVFVTCi1MTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUoCi1MTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUsCi1QTE1fTUVESUFfVFlQRSBwTWVkaWFUeXBlLAotUExNX0xJTkVfU1BFRUQgcExpbmVTcGVlZCwKLVBMTV9EVVBMRVhfTU9ERSBwRHVwbGV4TW9kZSkgewotICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9BVVRPOwotICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF9VTktOT1dOOwotICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX1VOS05PV047CitMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUgKExNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSwKKwkJCQlQTE1fTUVESUFfVFlQRSBwTWVkaWFUeXBlLAorCQkJCVBMTV9MSU5FX1NQRUVEIHBMaW5lU3BlZWQsCisJCQkJUExNX0RVUExFWF9NT0RFIHBEdXBsZXhNb2RlKQoreworCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9BVVRPOworCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF9VTktOT1dOOworCSpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX1VOS05PV047CiAKLSAgICAvKiBkZXRlcm1pbmUgbWVkaWEgdHlwZSAqLwotICAgIHN3aXRjaChSZXF1ZXN0ZWRNZWRpYVR5cGUpIHsKKwkvKiBkZXRlcm1pbmUgbWVkaWEgdHlwZSAqLworCXN3aXRjaCAoUmVxdWVzdGVkTWVkaWFUeXBlKSB7CiAJY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9CTkM6Ci0JICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9CTkM7Ci0JICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7Ci0JICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7Ci0JICAgIGJyZWFrOworCQkqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfQk5DOworCQkqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOworCQkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworCQlicmVhazsKIAogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE86Ci0JICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7Ci0JICAgIGJyZWFrOworCQkqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOworCQlicmVhazsKIAogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQUzoKLQkgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKLQkgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisJCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7CisJCSpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisJCWJyZWFrOwogCiAJY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTX0ZVTExfRFVQTEVYOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOwotCSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOwotCSAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCSAgICBicmVhazsKKwkJKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKwkJKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwTUJQUzsKKwkJKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKKwkJYnJlYWs7CiAKIAljYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDBNQlBTOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOwotCSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisJCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOworCQkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworCQlicmVhazsKIAogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwME1CUFNfRlVMTF9EVVBMRVg6Ci0JICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7Ci0JICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOwotCSAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCSAgICBicmVhazsKKwkJKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKwkJKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7CisJCSpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisJCWJyZWFrOwogCiAJY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwME1CUFM6Ci0JICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7Ci0JICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisJCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKKwkJKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKKwkJYnJlYWs7CiAKIAljYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDAwTUJQU19GVUxMX0RVUExFWDoKLQkgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKLQkgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOwotCSAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCSAgICBicmVhazsKKwkJKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKwkJKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOworCQkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworCQlicmVhazsKIAogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfRklCRVJfMTAwTUJQUzoKLQkgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0ZJQkVSOwotCSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9GSUJFUjsKKwkJKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7CisJCSpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisJCWJyZWFrOwogCiAJY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9GSUJFUl8xMDBNQlBTX0ZVTExfRFVQTEVYOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfRklCRVI7Ci0JICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOwotCSAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCSAgICBicmVhazsKKwkJKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0ZJQkVSOworCQkqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKKwkJKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKKwkJYnJlYWs7CiAKIAljYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0ZJQkVSXzEwMDBNQlBTOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfRklCRVI7Ci0JICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9GSUJFUjsKKwkJKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOworCQkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworCQlicmVhazsKIAogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfRklCRVJfMTAwME1CUFNfRlVMTF9EVVBMRVg6Ci0JICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9GSUJFUjsKLQkgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOwotCSAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCSAgICBicmVhazsKKwkJKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0ZJQkVSOworCQkqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7CisJCSpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgfSAvKiBzd2l0Y2ggKi8KKwkJYnJlYWs7CisJfQkJCS8qIHN3aXRjaCAqLwogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUgKi8KKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX1RyYW5zbGF0ZVJlcXVlc3RlZE1lZGlhVHlwZSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQyNzcsMjg1ICszOTUzLDI4NCBAQAogLyogICAgTE1fU1RBVFVTX0xJTktfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExNX1NUQVRVU19MSU5LX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIExNX1NUQVRVUwotTE1fSW5pdEJjbTU0MHhQaHkoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitzdGF0aWMgTE1fU1RBVFVTIExNX0luaXRCY201NDB4UGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgTE1fTElORV9TUEVFRCBDdXJyZW50TGluZVNwZWVkOwotICAgIExNX0RVUExFWF9NT0RFIEN1cnJlbnREdXBsZXhNb2RlOwotICAgIExNX1NUQVRVUyBDdXJyZW50TGlua1N0YXR1czsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKLSAgICBMTV9VSU5UMzIgajsKKwlMTV9MSU5FX1NQRUVEIEN1cnJlbnRMaW5lU3BlZWQ7CisJTE1fRFVQTEVYX01PREUgQ3VycmVudER1cGxleE1vZGU7CisJTE1fU1RBVFVTIEN1cnJlbnRMaW5rU3RhdHVzOworCUxNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1VJTlQzMiBqOwogCi0jaWYgMSAgLyogam1iOiBidWdmaXggLS0gbW92ZWQgaGVyZSwgb3V0IG9mIGNvZGUgdGhhdCBzZXRzIGluaXRpYWwgcHdyIHN0YXRlICovCi0gICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgMHgyKTsKKyNpZiAxCQkJCS8qIGptYjogYnVnZml4IC0tIG1vdmVkIGhlcmUsIG91dCBvZiBjb2RlIHRoYXQgc2V0cyBpbml0aWFsIHB3ciBzdGF0ZSAqLworCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDIpOwogI2VuZGlmCi0gICAgaWYoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDAxX1BIWV9JRCkKLSAgICB7Ci0JTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKwlpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDAxX1BIWV9JRCkgeworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwogCi0JaWYoIXBEZXZpY2UtPkluaXREb25lKQotCXsKLQkgICAgVmFsdWUzMiA9IDA7Ci0JfQotCi0JaWYoIShWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpKQotCXsKLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgIDB4MGMyMCk7Ci0KLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMik7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTgwNCk7Ci0KLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMyk7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTIwNCk7Ci0KLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDEzMik7Ci0KLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDIzMik7Ci0KLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MjAxZik7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MGEyMCk7Ci0KLQkgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotCSAgICBmb3IoaiA9IDA7IGogPCAxMDAwOyBqKyspCi0JICAgIHsKLQkJTU1fV2FpdCgxMCk7Ci0KLQkJTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotCQlpZihWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpCi0JCXsKLQkJICAgIE1NX1dhaXQoNDApOwotCQkgICAgYnJlYWs7CisJCWlmICghcERldmljZS0+SW5pdERvbmUpIHsKKwkJCVZhbHVlMzIgPSAwOwogCQl9Ci0JICAgIH0KIAotCSAgICBpZigocERldmljZS0+UGh5SWQgJiBQSFlfSURfUkVWX01BU0spID09IFBIWV9CQ001NDAxX0IwX1JFVikKLQkgICAgewotCQlpZighKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykgJiYKLQkJICAgIChwRGV2aWNlLT5PbGRMaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDAwTUJQUykpCi0JCXsKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgUEhZX0NUUkxfUEhZX1JFU0VUKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IDEwMDsgaisrKQotCQkgICAgewotCQkJTU1fV2FpdCgxMCk7CisJCWlmICghKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykpIHsKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDBjMjApOwogCi0JCQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOwotCQkJaWYoIShWYWx1ZTMyICYgUEhZX0NUUkxfUEhZX1JFU0VUKSkKLQkJCXsKLQkJCSAgICBNTV9XYWl0KDQwKTsKLQkJCSAgICBicmVhazsKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHgwMDEyKTsKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDE4MDQpOworCisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMyk7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxMjA0KTsKKworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDEzMik7CisKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHg4MDA2KTsKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAyMzIpOworCisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MjAxZik7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwYTIwKTsKKworCQkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKwkJCWZvciAoaiA9IDA7IGogPCAxMDAwOyBqKyspIHsKKwkJCQlNTV9XYWl0ICgxMCk7CisKKwkJCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCQkJCWlmIChWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpIHsKKwkJCQkJTU1fV2FpdCAoNDApOworCQkJCQlicmVhazsKKwkJCQl9CiAJCQl9Ci0JCSAgICB9CiAKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsICAweDBjMjApOworCQkJaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9SRVZfTUFTSykgPT0KKwkJCSAgICBQSFlfQkNNNTQwMV9CMF9SRVYpIHsKKwkJCQlpZiAoIShWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpCisJCQkJICAgICYmIChwRGV2aWNlLT5PbGRMaW5lU3BlZWQgPT0KKwkJCQkJTE1fTElORV9TUEVFRF8xMDAwTUJQUykpIHsKKwkJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIFBIWV9DVFJMX1JFRywKKwkJCQkJCSAgICAgUEhZX0NUUkxfUEhZX1JFU0VUKTsKKwkJCQkJZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKSB7CisJCQkJCQlNTV9XYWl0ICgxMCk7CiAKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTIpOwotCQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxODA0KTsKKwkJCQkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsCisJCQkJCQkJICAgIFBIWV9DVFJMX1JFRywKKwkJCQkJCQkgICAgJlZhbHVlMzIpOworCQkJCQkJaWYgKCEKKwkJCQkJCSAgICAoVmFsdWUzMiAmCisJCQkJCQkgICAgIFBIWV9DVFJMX1BIWV9SRVNFVCkpIHsKKwkJCQkJCQlNTV9XYWl0ICg0MCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KIAotCQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMyk7Ci0JCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDEyMDQpOworCQkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwKKwkJCQkJCSAgICAgMHgwYzIwKTsKIAotCQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7Ci0JCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAxMzIpOworCQkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwKKwkJCQkJCSAgICAgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsCisJCQkJCQkgICAgIDB4MDAxMik7CisJCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLAorCQkJCQkJICAgICBCQ001NDBYX0RTUF9SV19QT1JULAorCQkJCQkJICAgICAweDE4MDQpOwogCi0JCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHg4MDA2KTsKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDIzMik7CisJCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLAorCQkJCQkJICAgICBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywKKwkJCQkJCSAgICAgMHgwMDEzKTsKKwkJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsCisJCQkJCQkgICAgIEJDTTU0MFhfRFNQX1JXX1BPUlQsCisJCQkJCQkgICAgIDB4MTIwNCk7CiAKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDIwMWYpOwotCQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwYTIwKTsKKwkJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsCisJCQkJCQkgICAgIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLAorCQkJCQkJICAgICAweDgwMDYpOworCQkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwKKwkJCQkJCSAgICAgQkNNNTQwWF9EU1BfUldfUE9SVCwKKwkJCQkJCSAgICAgMHgwMTMyKTsKKworCQkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwKKwkJCQkJCSAgICAgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsCisJCQkJCQkgICAgIDB4ODAwNik7CisJCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLAorCQkJCQkJICAgICBCQ001NDBYX0RTUF9SV19QT1JULAorCQkJCQkJICAgICAweDAyMzIpOworCisJCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLAorCQkJCQkJICAgICBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywKKwkJCQkJCSAgICAgMHgyMDFmKTsKKwkJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsCisJCQkJCQkgICAgIEJDTTU0MFhfRFNQX1JXX1BPUlQsCisJCQkJCQkgICAgIDB4MGEyMCk7CisJCQkJfQorCQkJfQogCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGVsc2UgaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAotCXBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjApCi0gICAgewotCS8qIEJ1ZzogNTcwMSBBMCwgQjAgVFggQ1JDIHdvcmthcm91bmQuICovCi0JTE1fV3JpdGVQaHkocERldmljZSwgMHgxNSwgMHgwYTc1KTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDFjLCAweDhjNjgpOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MWMsIDB4OGQ2OCk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgMHgxYywgMHg4YzY4KTsKLSAgICB9Ci0KLSAgICAvKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHRzLiAqLwotICAgIExNX1JlYWRQaHkocERldmljZSwgQkNNNTQwWF9JTlRfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotICAgIExNX1JlYWRQaHkocERldmljZSwgQkNNNTQwWF9JTlRfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotCi0gICAgLyogQ29uZmlndXJlIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KLSAgICBpZihwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQpCi0gICAgewotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfSU5UX01BU0tfUkVHLCB+QkNNNTQwWF9JTlRfTElOS19DSEFOR0UpOwotICAgIH0KLQotICAgIC8qIENvbmZpZ3VyZSBQSFkgbGVkIG1vZGUuICovCi0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxIHx8Ci0JKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkpCi0gICAgewotCWlmKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfVEhSRUVfTElOSykKLQl7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRVhUX0NUUkxfUkVHLAotCQlCQ001NDBYX0VYVF9DVFJMX0xJTkszX0xFRF9NT0RFKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9FWFRfQ1RSTF9SRUcsIDApOwotCX0KLSAgICB9Ci0KLSAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047Ci0KLSAgICAvKiBHZXQgY3VycmVudCBsaW5rIGFuZCBkdXBsZXggbW9kZS4gKi8KLSAgICBmb3IoaiA9IDA7IGogPCAxMDA7IGorKykKLSAgICB7Ci0JTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQotCWlmKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykKLQl7Ci0JICAgIGJyZWFrOwotCX0KLQlNTV9XYWl0KDQwKTsKLSAgICB9Ci0KLSAgICBpZihWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpCi0gICAgewotCi0JLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxpbmUgYW5kIGR1cGxleCBzZXR0aW5ncy4gKi8KLQlMTV9SZWFkUGh5KHBEZXZpY2UsIEJDTTU0MFhfQVVYX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQlmb3IoaiA9IDA7IGogPCAyMDAwOyBqKyspCi0JewotCSAgICBNTV9XYWl0KDEwKTsKLQotCSAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIEJDTTU0MFhfQVVYX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQkgICAgaWYoVmFsdWUzMikKLQkgICAgewotCQlicmVhazsKLQkgICAgfQorCX0gZWxzZSBpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorCQkgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwKSB7CisJCS8qIEJ1ZzogNTcwMSBBMCwgQjAgVFggQ1JDIHdvcmthcm91bmQuICovCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDE1LCAweDBhNzUpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxYywgMHg4YzY4KTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MWMsIDB4OGQ2OCk7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDFjLCAweDhjNjgpOwogCX0KIAotCXN3aXRjaChWYWx1ZTMyICYgQkNNNTQwWF9BVVhfU1BFRURfTUFTSykKLQl7Ci0JICAgIGNhc2UgQkNNNTQwWF9BVVhfMTBCQVNFVF9IRDoKLQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOwotCQlDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7Ci0JCWJyZWFrOworCS8qIEFja25vd2xlZGdlIGludGVycnVwdHMuICovCisJTE1fUmVhZFBoeSAocERldmljZSwgQkNNNTQwWF9JTlRfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCUxNX1JlYWRQaHkgKHBEZXZpY2UsIEJDTTU0MFhfSU5UX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKIAotCSAgICBjYXNlIEJDTTU0MFhfQVVYXzEwQkFTRVRfRkQ6Ci0JCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwTUJQUzsKLQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCQlicmVhazsKLQotCSAgICBjYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUWF9IRDoKLQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKLQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOwotCQlicmVhazsKLQotCSAgICBjYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUWF9GRDoKLQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKLQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCQlicmVhazsKLQotCSAgICBjYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUX0hEOgotCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKLQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOwotCQlicmVhazsKLQotCSAgICBjYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUX0ZEOgotCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKLQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCi0JCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEX1VOS05PV047Ci0JCUN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfVU5LTk9XTjsKLQkJYnJlYWs7CisJLyogQ29uZmlndXJlIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpZiAocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUKSB7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0lOVF9NQVNLX1JFRywKKwkJCSAgICAgfkJDTTU0MFhfSU5UX0xJTktfQ0hBTkdFKTsKIAl9CiAKLQkvKiBNYWtlIHN1cmUgd2UgYXJlIGluIGF1dG8tbmVnIG1vZGUuICovCi0JZm9yIChqID0gMDsgaiA8IDIwMDsgaisrKQotCXsKLQkgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKLQkgICAgaWYoVmFsdWUzMiAmJiBWYWx1ZTMyICE9IDB4N2ZmZikKLQkgICAgewotCQlicmVhazsKLQkgICAgfQotCi0JICAgIGlmKFZhbHVlMzIgPT0gMCAmJiBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0KLQkJTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQUykKLQkgICAgewotCQlicmVhazsKLQkgICAgfQotCi0JICAgIE1NX1dhaXQoMTApOwotCX0KLQotCS8qIFVzZSB0aGUgY3VycmVudCBsaW5lIHNldHRpbmdzIGZvciAiYXV0byIgbW9kZS4gKi8KLQlpZihwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTyB8fAotCSAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE8pCi0JewotCSAgICBpZihWYWx1ZTMyICYgUEhZX0NUUkxfQVVUT19ORUdfRU5BQkxFKQotCSAgICB7Ci0JCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOwotCi0JCS8qIFdlIG1heSBiZSBleGl0aW5nIGxvdyBwb3dlciBtb2RlIGFuZCB0aGUgbGluayBpcyBpbiAqLwotCQkvKiAxMG1iLiAgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHJlc3RhcnQgYXV0b25lZy4gKi8KLQkJTE1fUmVhZFBoeShwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgJlZhbHVlMzIpOwotCQlwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOwotCQkvKiA1NzAyRkUgc3VwcG9ydHMgMTAvMTAwTWIgb25seS4gKi8KLQkJaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAzIHx8Ci0JCSAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMkZFKQotCQl7Ci0JCSAgICBpZighKFZhbHVlMzIgJiAoQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRiB8Ci0JCQlCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9GVUxMKSkpCi0JCSAgICB7Ci0JCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7Ci0JCSAgICB9CisJLyogQ29uZmlndXJlIFBIWSBsZWQgbW9kZS4gKi8KKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSB8fAorCSAgICAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkpIHsKKwkJaWYgKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfVEhSRUVfTElOSykgeworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRVhUX0NUUkxfUkVHLAorCQkJCSAgICAgQkNNNTQwWF9FWFRfQ1RSTF9MSU5LM19MRURfTU9ERSk7CisJCX0gZWxzZSB7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9FWFRfQ1RSTF9SRUcsIDApOwogCQl9Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfU0VUVElOR19NSVNNQVRDSDsKLQkgICAgfQotCX0KLQllbHNlCi0JewotCSAgICAvKiBGb3JjZSBsaW5lIHNldHRpbmdzLiAqLwotCSAgICAvKiBVc2UgdGhlIGN1cnJlbnQgc2V0dGluZyBpZiBpdCBtYXRjaGVzIHRoZSB1c2VyJ3MgcmVxdWVzdGVkICovCi0JICAgIC8qIHNldHRpbmcuICovCi0JICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCAmVmFsdWUzMik7Ci0JICAgIGlmKChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gQ3VycmVudExpbmVTcGVlZCkgJiYKLQkJKHBEZXZpY2UtPkR1cGxleE1vZGUgPT0gQ3VycmVudER1cGxleE1vZGUpKQotCSAgICB7Ci0JCWlmICgocERldmljZS0+RGlzYWJsZUF1dG9OZWcgJiYKLQkJICAgICEoVmFsdWUzMiAmIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSkpIHx8Ci0JCSAgICAoIXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnICYmCi0JCSAgICAoVmFsdWUzMiAmIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSkpKQotCQl7Ci0JCSAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfU0VUVElOR19NSVNNQVRDSDsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7Ci0JICAgIH0KIAl9CiAKLQkvKiBTYXZlIGxpbmUgc2V0dGluZ3MuICovCi0JcERldmljZS0+TGluZVNwZWVkID0gQ3VycmVudExpbmVTcGVlZDsKLQlwRGV2aWNlLT5EdXBsZXhNb2RlID0gQ3VycmVudER1cGxleE1vZGU7Ci0JcERldmljZS0+TWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7Ci0gICAgfQorCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKIAotICAgIHJldHVybiBDdXJyZW50TGlua1N0YXR1czsKLX0gLyogTE1fSW5pdEJjbTU0MHhQaHkgKi8KKwkvKiBHZXQgY3VycmVudCBsaW5rIGFuZCBkdXBsZXggbW9kZS4gKi8KKwlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspIHsKKwkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKwkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKworCQlpZiAoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKSB7CisJCQlicmVhazsKKwkJfQorCQlNTV9XYWl0ICg0MCk7CisJfQorCisJaWYgKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykgeworCisJCS8qIERldGVybWluZSB0aGUgY3VycmVudCBsaW5lIGFuZCBkdXBsZXggc2V0dGluZ3MuICovCisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIEJDTTU0MFhfQVVYX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKwkJZm9yIChqID0gMDsgaiA8IDIwMDA7IGorKykgeworCQkJTU1fV2FpdCAoMTApOworCisJCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBCQ001NDBYX0FVWF9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJCQlpZiAoVmFsdWUzMikgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJc3dpdGNoIChWYWx1ZTMyICYgQkNNNTQwWF9BVVhfU1BFRURfTUFTSykgeworCQljYXNlIEJDTTU0MFhfQVVYXzEwQkFTRVRfSEQ6CisJCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7CisJCQlDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisJCQlicmVhazsKKworCQljYXNlIEJDTTU0MFhfQVVYXzEwQkFTRVRfRkQ6CisJCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7CisJCQlDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisJCQlicmVhazsKKworCQljYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUWF9IRDoKKwkJCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7CisJCQlDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisJCQlicmVhazsKKworCQljYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUWF9GRDoKKwkJCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7CisJCQlDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisJCQlicmVhazsKKworCQljYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUX0hEOgorCQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7CisJCQlDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisJCQlicmVhazsKKworCQljYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUX0ZEOgorCQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7CisJCQlDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF9VTktOT1dOOworCQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9VTktOT1dOOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBNYWtlIHN1cmUgd2UgYXJlIGluIGF1dG8tbmVnIG1vZGUuICovCisJCWZvciAoaiA9IDA7IGogPCAyMDA7IGorKykgeworCQkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX0NUUkxfUkVHLCAmVmFsdWUzMik7CisJCQlpZiAoVmFsdWUzMiAmJiBWYWx1ZTMyICE9IDB4N2ZmZikgeworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoVmFsdWUzMiA9PSAwICYmIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PQorCQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xME1CUFMpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJTU1fV2FpdCAoMTApOworCQl9CisKKwkJLyogVXNlIHRoZSBjdXJyZW50IGxpbmUgc2V0dGluZ3MgZm9yICJhdXRvIiBtb2RlLiAqLworCQlpZiAocERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8KKwkJICAgIHx8IHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PQorCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE8pIHsKKwkJCWlmIChWYWx1ZTMyICYgUEhZX0NUUkxfQVVUT19ORUdfRU5BQkxFKSB7CisJCQkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7CisKKwkJCQkvKiBXZSBtYXkgYmUgZXhpdGluZyBsb3cgcG93ZXIgbW9kZSBhbmQgdGhlIGxpbmsgaXMgaW4gKi8KKwkJCQkvKiAxMG1iLiAgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHJlc3RhcnQgYXV0b25lZy4gKi8KKwkJCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywKKwkJCQkJICAgICZWYWx1ZTMyKTsKKwkJCQlwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOworCQkJCS8qIDU3MDJGRSBzdXBwb3J0cyAxMC8xMDBNYiBvbmx5LiAqLworCQkJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSAhPQorCQkJCSAgICBUM19BU0lDX1JFVl81NzAzCisJCQkJICAgIHx8IHBEZXZpY2UtPkJvbmRJZCAhPQorCQkJCSAgICBHUkNfTUlTQ19CRF9JRF81NzAyRkUpIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChWYWx1ZTMyICYKKwkJCQkJICAgICAoQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRiB8CisJCQkJCSAgICAgIEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0ZVTEwpKSkgeworCQkJCQkJQ3VycmVudExpbmtTdGF0dXMgPQorCQkJCQkJICAgIExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUN1cnJlbnRMaW5rU3RhdHVzID0KKwkJCQkgICAgTE1fU1RBVFVTX0xJTktfU0VUVElOR19NSVNNQVRDSDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEZvcmNlIGxpbmUgc2V0dGluZ3MuICovCisJCQkvKiBVc2UgdGhlIGN1cnJlbnQgc2V0dGluZyBpZiBpdCBtYXRjaGVzIHRoZSB1c2VyJ3MgcmVxdWVzdGVkICovCisJCQkvKiBzZXR0aW5nLiAqLworCQkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX0NUUkxfUkVHLCAmVmFsdWUzMik7CisJCQlpZiAoKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBDdXJyZW50TGluZVNwZWVkKSAmJgorCQkJICAgIChwRGV2aWNlLT5EdXBsZXhNb2RlID09IEN1cnJlbnREdXBsZXhNb2RlKSkgeworCQkJCWlmICgocERldmljZS0+RGlzYWJsZUF1dG9OZWcgJiYKKwkJCQkgICAgICEoVmFsdWUzMiAmIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSkpIHx8CisJCQkJICAgICghcERldmljZS0+RGlzYWJsZUF1dG9OZWcgJiYKKwkJCQkgICAgIChWYWx1ZTMyICYgUEhZX0NUUkxfQVVUT19ORUdfRU5BQkxFKSkpIHsKKwkJCQkJQ3VycmVudExpbmtTdGF0dXMgPQorCQkJCQkgICAgTE1fU1RBVFVTX0xJTktfQUNUSVZFOworCQkJCX0gZWxzZSB7CisJCQkJCUN1cnJlbnRMaW5rU3RhdHVzID0KKwkJCQkJICAgIExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlDdXJyZW50TGlua1N0YXR1cyA9CisJCQkJICAgIExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7CisJCQl9CisJCX0KKworCQkvKiBTYXZlIGxpbmUgc2V0dGluZ3MuICovCisJCXBEZXZpY2UtPkxpbmVTcGVlZCA9IEN1cnJlbnRMaW5lU3BlZWQ7CisJCXBEZXZpY2UtPkR1cGxleE1vZGUgPSBDdXJyZW50RHVwbGV4TW9kZTsKKwkJcERldmljZS0+TWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisJfQorCisJcmV0dXJuIEN1cnJlbnRMaW5rU3RhdHVzOworfQkJCQkvKiBMTV9Jbml0QmNtNTQweFBoeSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ1NjMsMTA2NSArNDIzOCw5MzUgQEAKIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTE1fU1RBVFVTCi1MTV9TZXRGbG93Q29udHJvbCgKLSAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0gICAgTE1fVUlOVDMyIExvY2FsUGh5QWQsCi0gICAgTE1fVUlOVDMyIFJlbW90ZVBoeUFkKQorTE1fU2V0Rmxvd0NvbnRyb2wgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJICAgTE1fVUlOVDMyIExvY2FsUGh5QWQsIExNX1VJTlQzMiBSZW1vdGVQaHlBZCkKIHsKLSAgICBMTV9GTE9XX0NPTlRST0wgRmxvd0NhcDsKKwlMTV9GTE9XX0NPTlRST0wgRmxvd0NhcDsKIAotICAgIC8qIFJlc29sdmUgZmxvdyBjb250cm9sLiAqLwotICAgIEZsb3dDYXAgPSBMTV9GTE9XX0NPTlRST0xfTk9ORTsKKwkvKiBSZXNvbHZlIGZsb3cgY29udHJvbC4gKi8KKwlGbG93Q2FwID0gTE1fRkxPV19DT05UUk9MX05PTkU7CiAKLSAgICAvKiBTZWUgVGFibGUgMjhCLTMgb2YgODAyLjNhYi0xOTk5IHNwZWMuICovCi0gICAgaWYocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRSkKLSAgICB7Ci0JaWYoTG9jYWxQaHlBZCAmIFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFKQotCXsKLQkgICAgaWYoTG9jYWxQaHlBZCAmIFBIWV9BTl9BRF9BU1lNX1BBVVNFKQotCSAgICB7Ci0JCWlmKFJlbW90ZVBoeUFkICYgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFKQotCQl7Ci0JCSAgICBGbG93Q2FwID0gTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFIHwKLQkJCUxNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOworCS8qIFNlZSBUYWJsZSAyOEItMyBvZiA4MDIuM2FiLTE5OTkgc3BlYy4gKi8KKwlpZiAocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRSkgeworCQlpZiAoTG9jYWxQaHlBZCAmIFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFKSB7CisJCQlpZiAoTG9jYWxQaHlBZCAmIFBIWV9BTl9BRF9BU1lNX1BBVVNFKSB7CisJCQkJaWYgKFJlbW90ZVBoeUFkICYKKwkJCQkgICAgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFKSB7CisJCQkJCUZsb3dDYXAgPQorCQkJCQkgICAgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFIHwKKwkJCQkJICAgIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOworCQkJCX0gZWxzZSBpZiAoUmVtb3RlUGh5QWQgJgorCQkJCQkgICBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0UpIHsKKwkJCQkJRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKFJlbW90ZVBoeUFkICYKKwkJCQkgICAgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFKSB7CisJCQkJCUZsb3dDYXAgPQorCQkJCQkgICAgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFIHwKKwkJCQkJICAgIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChMb2NhbFBoeUFkICYgUEhZX0FOX0FEX0FTWU1fUEFVU0UpIHsKKwkJCWlmICgoUmVtb3RlUGh5QWQgJiBQSFlfTElOS19QQVJUTkVSX1BBVVNFX0NBUEFCTEUpICYmCisJCQkgICAgKFJlbW90ZVBoeUFkICYgUEhZX0xJTktfUEFSVE5FUl9BU1lNX1BBVVNFKSkgeworCQkJCUZsb3dDYXAgPSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0U7CisJCQl9CiAJCX0KLQkJZWxzZSBpZihSZW1vdGVQaHlBZCAmIFBIWV9MSU5LX1BBUlRORVJfQVNZTV9QQVVTRSkKLQkJewotCQkgICAgRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCWlmKFJlbW90ZVBoeUFkICYgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFKQotCQl7Ci0JCSAgICBGbG93Q2FwID0gTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFIHwKLQkJCUxNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOwotCQl9Ci0JICAgIH0KKwl9IGVsc2UgeworCQlGbG93Q2FwID0gcERldmljZS0+Rmxvd0NvbnRyb2xDYXA7CiAJfQotCWVsc2UgaWYoTG9jYWxQaHlBZCAmIFBIWV9BTl9BRF9BU1lNX1BBVVNFKQotCXsKLQkgICAgaWYoKFJlbW90ZVBoeUFkICYgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFKSAmJgotCQkoUmVtb3RlUGh5QWQgJiBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0UpKQotCSAgICB7Ci0JCUZsb3dDYXAgPSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0U7Ci0JICAgIH0KKworCS8qIEVuYWJsZS9kaXNhYmxlIHJ4IFBBVVNFLiAqLworCXBEZXZpY2UtPlJ4TW9kZSAmPSB+UlhfTU9ERV9FTkFCTEVfRkxPV19DT05UUk9MOworCWlmIChGbG93Q2FwICYgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UgJiYKKwkgICAgKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID09IExNX0ZMT1dfQ09OVFJPTF9BVVRPX1BBVVNFIHx8CisJICAgICBwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFKSkgeworCQlwRGV2aWNlLT5GbG93Q29udHJvbCB8PSBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKKwkJcERldmljZS0+UnhNb2RlIHw9IFJYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTDsKKwogCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlGbG93Q2FwID0gcERldmljZS0+Rmxvd0NvbnRyb2xDYXA7Ci0gICAgfQorCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIHBEZXZpY2UtPlJ4TW9kZSk7CiAKLSAgICAvKiBFbmFibGUvZGlzYWJsZSByeCBQQVVTRS4gKi8KLSAgICBwRGV2aWNlLT5SeE1vZGUgJj0gflJYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTDsKLSAgICBpZihGbG93Q2FwICYgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UgJiYKLQkocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPT0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UgfHwKLQlwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFKSkKLSAgICB7Ci0JcERldmljZS0+Rmxvd0NvbnRyb2wgfD0gTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0U7Ci0JcERldmljZS0+UnhNb2RlIHw9IFJYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTDsKKwkvKiBFbmFibGUvZGlzYWJsZSB0eCBQQVVTRS4gKi8KKwlwRGV2aWNlLT5UeE1vZGUgJj0gflRYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTDsKKwlpZiAoRmxvd0NhcCAmIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSAmJgorCSAgICAocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPT0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UgfHwKKwkgICAgIHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFKSkgeworCQlwRGV2aWNlLT5GbG93Q29udHJvbCB8PSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0U7CisJCXBEZXZpY2UtPlR4TW9kZSB8PSBUWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0w7CiAKLSAgICB9Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBwRGV2aWNlLT5SeE1vZGUpOworCX0KKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlLCBwRGV2aWNlLT5UeE1vZGUpOwogCi0gICAgLyogRW5hYmxlL2Rpc2FibGUgdHggUEFVU0UuICovCi0gICAgcERldmljZS0+VHhNb2RlICY9IH5UWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0w7Ci0gICAgaWYoRmxvd0NhcCAmIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSAmJgotCShwRGV2aWNlLT5GbG93Q29udHJvbENhcCA9PSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRSB8fAotCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFKSkKLSAgICB7Ci0JcERldmljZS0+Rmxvd0NvbnRyb2wgfD0gTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFOwotCXBEZXZpY2UtPlR4TW9kZSB8PSBUWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0w7Ci0KLSAgICB9Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlLCBwRGV2aWNlLT5UeE1vZGUpOwotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiAjaWYgSU5DTFVERV9UQklfU1VQUE9SVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TVEFUSUMgTE1fU1RBVFVTCi1MTV9Jbml0QmNtODAweFBoeSgKLSAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitTVEFUSUMgTE1fU1RBVFVTIExNX0luaXRCY204MDB4UGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDMyIGo7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fVUlOVDMyIGo7CiAKLSAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKKwlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7CiAKLSAgICAvKiBSZXNldCB0aGUgU0VSREVTIGR1cmluZyBpbml0IGFuZCB3aGVuIHdlIGhhdmUgbGluay4gKi8KLSAgICBpZighcERldmljZS0+SW5pdERvbmUgfHwgVmFsdWUzMiAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkKLSAgICB7Ci0JLyogU2V0IFBMTCBsb2NrIHJhbmdlLiAqLwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTYsIDB4ODAwNyk7CisJLyogUmVzZXQgdGhlIFNFUkRFUyBkdXJpbmcgaW5pdCBhbmQgd2hlbiB3ZSBoYXZlIGxpbmsuICovCisJaWYgKCFwRGV2aWNlLT5Jbml0RG9uZSB8fCBWYWx1ZTMyICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSB7CisJCS8qIFNldCBQTEwgbG9jayByYW5nZS4gKi8KKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTYsIDB4ODAwNyk7CiAKLQkvKiBTb2Z0d2FyZSByZXNldC4gKi8KLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDAwLCAweDgwMDApOworCQkvKiBTb2Z0d2FyZSByZXNldC4gKi8KKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MDAsIDB4ODAwMCk7CiAKLQkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KLQlmb3IoaiA9IDA7IGogPCA1MDA7IGorKykKLQl7Ci0JICAgIE1NX1dhaXQoMTApOworCQkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KKwkJZm9yIChqID0gMDsgaiA8IDUwMDsgaisrKSB7CisJCQlNTV9XYWl0ICgxMCk7CisJCX0KKworCQkvKiBDb25maWcgbW9kZTsgc2VsZXRjdCBQTUEvQ2ggMSByZWdzLiAqLworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxMCwgMHg4NDExKTsKKworCQkvKiBFbmFibGUgYXV0by1sb2NrIGFuZCBjb21kZXQsIHNlbGVjdCB0eGNsayBmb3IgdHguICovCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDExLCAweDBhMTApOworCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDE4LCAweDAwYTApOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxNiwgMHg0MWZmKTsKKworCQkvKiBBc3NlcnQgYW5kIGRlYXNzZXJ0IFBPUi4gKi8KKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTMsIDB4MDQwMCk7CisJCU1NX1dhaXQgKDQwKTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTMsIDB4MDAwMCk7CisKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTEsIDB4MGE1MCk7CisJCU1NX1dhaXQgKDQwKTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTEsIDB4MGExMCk7CisKKwkJLyogRGVsYXkgZm9yIHNpZ25hbCB0byBzdGFiaWxpemUuICovCisJCWZvciAoaiA9IDA7IGogPCAxNTAwMDsgaisrKSB7CisJCQlNTV9XYWl0ICgxMCk7CisJCX0KKworCQkvKiBEZXNlbGVjdCB0aGUgY2hhbm5lbCByZWdpc3RlciBzbyB3ZSBjYW4gcmVhZCB0aGUgUEhZIGlkIGxhdGVyLiAqLworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxMCwgMHg4MDExKTsKIAl9CiAKLQkvKiBDb25maWcgbW9kZTsgc2VsZXRjdCBQTUEvQ2ggMSByZWdzLiAqLwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTAsIDB4ODQxMSk7Ci0KLQkvKiBFbmFibGUgYXV0by1sb2NrIGFuZCBjb21kZXQsIHNlbGVjdCB0eGNsayBmb3IgdHguICovCi0JTE1fV3JpdGVQaHkocERldmljZSwgMHgxMSwgMHgwYTEwKTsKLQotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTgsIDB4MDBhMCk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgMHgxNiwgMHg0MWZmKTsKLQotCS8qIEFzc2VydCBhbmQgZGVhc3NlcnQgUE9SLiAqLwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTMsIDB4MDQwMCk7Ci0JTU1fV2FpdCg0MCk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgMHgxMywgMHgwMDAwKTsKLQotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTEsIDB4MGE1MCk7Ci0JTU1fV2FpdCg0MCk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgMHgxMSwgMHgwYTEwKTsKLQotCS8qIERlbGF5IGZvciBzaWduYWwgdG8gc3RhYmlsaXplLiAqLwotCWZvcihqID0gMDsgaiA8IDE1MDAwOyBqKyspCi0JewotCSAgICBNTV9XYWl0KDEwKTsKLQl9Ci0KLQkvKiBEZXNlbGVjdCB0aGUgY2hhbm5lbCByZWdpc3RlciBzbyB3ZSBjYW4gcmVhZCB0aGUgUEhZIGlkIGxhdGVyLiAqLwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTAsIDB4ODAxMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVNUQVRJQyBMTV9TVEFUVVMKLUxNX1NldHVwRmliZXJQaHkoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorU1RBVElDIExNX1NUQVRVUyBMTV9TZXR1cEZpYmVyUGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgTE1fU1RBVFVTIEN1cnJlbnRMaW5rU3RhdHVzOwotICAgIEFVVE9ORUdfU1RBVFVTIEFuU3RhdHVzID0gMDsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKLSAgICBMTV9VSU5UMzIgQ250OwotICAgIExNX1VJTlQzMiBqLCBrOworCUxNX1NUQVRVUyBDdXJyZW50TGlua1N0YXR1czsKKwlBVVRPTkVHX1NUQVRVUyBBblN0YXR1cyA9IDA7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fVUlOVDMyIENudDsKKwlMTV9VSU5UMzIgaiwgazsKIAotICAgIHBEZXZpY2UtPk1hY01vZGUgJj0gfihNQUNfTU9ERV9IQUxGX0RVUExFWCB8IE1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLKTsKKwlwRGV2aWNlLT5NYWNNb2RlICY9IH4oTUFDX01PREVfSEFMRl9EVVBMRVggfCBNQUNfTU9ERV9QT1JUX01PREVfTUFTSyk7CiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSBzZW5kX2NvbmZpZyByZWdpc3Rlci4gKi8KLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeEF1dG9OZWcsIDApOworCS8qIEluaXRpYWxpemUgdGhlIHNlbmRfY29uZmlnIHJlZ2lzdGVyLiAqLworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5UeEF1dG9OZWcsIDApOwogCi0gICAgLyogRW5hYmxlIFRCSSBhbmQgZnVsbCBkdXBsZXggbW9kZS4gKi8KLSAgICBwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CisJLyogRW5hYmxlIFRCSSBhbmQgZnVsbCBkdXBsZXggbW9kZS4gKi8KKwlwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgQkNNODAwMiBTRVJERVMgUEhZLiAqLwotICAgIHN3aXRjaChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKQotICAgIHsKKwkvKiBJbml0aWFsaXplIHRoZSBCQ004MDAyIFNFUkRFUyBQSFkuICovCisJc3dpdGNoIChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSB7CiAJY2FzZSBQSFlfQkNNODAwMl9QSFlfSUQ6Ci0JICAgIExNX0luaXRCY204MDB4UGh5KHBEZXZpY2UpOwotCSAgICBicmVhazsKKwkJTE1fSW5pdEJjbTgwMHhQaHkgKHBEZXZpY2UpOworCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIEVuYWJsZSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWFjRXZlbnQsIE1BQ19FVkVOVF9FTkFCTEVfTElOS19TVEFURV9DSEFOR0VEX0FUVE4pOwotCi0gICAgLyogRGVmYXVsdCB0byBsaW5rIGRvd24uICovCi0gICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOwotCi0gICAgLyogR2V0IHRoZSBsaW5rIHN0YXR1cy4gKi8KLSAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKLSAgICBpZihWYWx1ZTMyICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKQotICAgIHsKLQlpZigocERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8pIHx8Ci0JICAgIChwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9PSBGQUxTRSkpCi0JewotCSAgICAvKiBhdXRvLW5lZ290aWF0aW9uIG1vZGUuICovCi0JICAgIC8qIEluaXRpYWxpemUgdGhlIGF1dG9uZWcgZGVmYXVsdCBjYXBhaWJsaXRpZXMuICovCi0JICAgIEF1dG9uZWdJbml0KCZwRGV2aWNlLT5BbkluZm8pOwotCi0JICAgIC8qIFNldCB0aGUgY29udGV4dCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBtYWluIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JICAgIHBEZXZpY2UtPkFuSW5mby5wQ29udGV4dCA9IHBEZXZpY2U7Ci0KLQkgICAgLyogU2V0dXAgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIuICovCi0JICAgIFZhbHVlMzIgPSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKHBEZXZpY2UpOwotCSAgICBpZihWYWx1ZTMyICYgUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEUpCi0JICAgIHsKLQkJcERldmljZS0+QW5JbmZvLm1yX2Fkdl9zeW1fcGF1c2UgPSAxOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlwRGV2aWNlLT5BbkluZm8ubXJfYWR2X3N5bV9wYXVzZSA9IDA7Ci0JICAgIH0KLQotCSAgICBpZihWYWx1ZTMyICYgUEhZX0FOX0FEX0FTWU1fUEFVU0UpCi0JICAgIHsKLQkJcERldmljZS0+QW5JbmZvLm1yX2Fkdl9hc3ltX3BhdXNlID0gMTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJcERldmljZS0+QW5JbmZvLm1yX2Fkdl9hc3ltX3BhdXNlID0gMDsKLQkgICAgfQotCi0JICAgIC8qIFRyeSB0byBhdXRvbmVnIHVwIHRvIHNpeCB0aW1lcy4gKi8KLQkgICAgaWYgKHBEZXZpY2UtPklnbm9yZVRiaUxpbmtDaGFuZ2UpCi0JICAgIHsKLQkJQ250ID0gMTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJQ250ID0gNjsKLQkgICAgfQotCSAgICBmb3IgKGogPSAwOyBqIDwgQ250OyBqKyspCi0JICAgIHsKLQkJUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhBdXRvTmVnLCAwKTsKLQotCQlWYWx1ZTMyID0gcERldmljZS0+TWFjTW9kZSAmIH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKLQkJUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgVmFsdWUzMik7Ci0JCU1NX1dhaXQoMjApOwotCi0JCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUgfAotCQkgICAgTUFDX01PREVfU0VORF9DT05GSUdTKTsKLQotCQlNTV9XYWl0KDIwKTsKLQotCQlwRGV2aWNlLT5BbkluZm8uU3RhdGUgPSBBTl9TVEFURV9VTktOT1dOOwotCQlwRGV2aWNlLT5BbkluZm8uQ3VycmVudFRpbWVfdXMgPSAwOwotCi0JCVJFR19XUihwRGV2aWNlLCBHcmMuVGltZXIsIDApOwotCQlmb3IoayA9IDA7IChwRGV2aWNlLT5BbkluZm8uQ3VycmVudFRpbWVfdXMgPCA3NTAwMCkgJiYKLQkJICAgIChrIDwgNzUwMDApOyBrKyspCi0JCXsKLQkJICAgIEFuU3RhdHVzID0gQXV0b25lZzgwMjN6KCZwRGV2aWNlLT5BbkluZm8pOwotCi0JCSAgICBpZigoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRE9ORSkgfHwKLQkJCShBblN0YXR1cyA9PSBBVVRPTkVHX1NUQVRVU19GQUlMRUQpKQotCQkgICAgewotCQkJYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICAgIHBEZXZpY2UtPkFuSW5mby5DdXJyZW50VGltZV91cyA9IFJFR19SRChwRGV2aWNlLCBHcmMuVGltZXIpOwotCi0JCX0KLQkJaWYoKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0RPTkUpIHx8Ci0JCSAgICAoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRkFJTEVEKSkKLQkJewotCQkgICAgYnJlYWs7Ci0JCX0KLQkJaWYgKGogPj0gMSkKLQkJewotCQkgICAgaWYgKCEoUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKSAmCi0JCQlNQUNfU1RBVFVTX1BDU19TWU5DRUQpKSB7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgICAgLyogU3RvcCBzZW5kaW5nIGNvbmZpZ3MuICovCi0JICAgIE1NX0FuVHhJZGxlKCZwRGV2aWNlLT5BbkluZm8pOwotCi0JICAgIC8qIFJlc29sdmUgZmxvdyBjb250cm9sIHNldHRpbmdzLiAqLwotCSAgICBpZigoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRE9ORSkgJiYKLQkJcERldmljZS0+QW5JbmZvLm1yX2FuX2NvbXBsZXRlICYmIHBEZXZpY2UtPkFuSW5mby5tcl9saW5rX29rICYmCi0JCXBEZXZpY2UtPkFuSW5mby5tcl9scF9hZHZfZnVsbF9kdXBsZXgpCi0JCXsKLQkJTE1fVUlOVDMyIFJlbW90ZVBoeUFkOwotCQlMTV9VSU5UMzIgTG9jYWxQaHlBZDsKLQotCQlMb2NhbFBoeUFkID0gMDsKLQkJaWYocERldmljZS0+QW5JbmZvLm1yX2Fkdl9zeW1fcGF1c2UpCi0JCXsKLQkJICAgIExvY2FsUGh5QWQgfD0gUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEU7Ci0JCX0KLQotCQlpZihwRGV2aWNlLT5BbkluZm8ubXJfYWR2X2FzeW1fcGF1c2UpCi0JCXsKLQkJICAgIExvY2FsUGh5QWQgfD0gUEhZX0FOX0FEX0FTWU1fUEFVU0U7Ci0JCX0KLQotCQlSZW1vdGVQaHlBZCA9IDA7Ci0JCWlmKHBEZXZpY2UtPkFuSW5mby5tcl9scF9hZHZfc3ltX3BhdXNlKQotCQl7Ci0JCSAgICBSZW1vdGVQaHlBZCB8PSBQSFlfTElOS19QQVJUTkVSX1BBVVNFX0NBUEFCTEU7Ci0JCX0KLQotCQlpZihwRGV2aWNlLT5BbkluZm8ubXJfbHBfYWR2X2FzeW1fcGF1c2UpCi0JCXsKLQkJICAgIFJlbW90ZVBoeUFkIHw9IFBIWV9MSU5LX1BBUlRORVJfQVNZTV9QQVVTRTsKLQkJfQotCi0JCUxNX1NldEZsb3dDb250cm9sKHBEZXZpY2UsIExvY2FsUGh5QWQsIFJlbW90ZVBoeUFkKTsKLQotCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKLQkgICAgfQotCSAgICBmb3IgKGogPSAwOyBqIDwgMzA7IGorKykKLQkgICAgewotCQlNTV9XYWl0KDIwKTsKLQkJUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzLCBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8Ci0JCSAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKTsKLQkJTU1fV2FpdCgyMCk7Ci0JCWlmICgoUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKSAmCi0JCSAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSkgPT0gMCkKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChwRGV2aWNlLT5Qb2xsVGJpTGluaykKLQkgICAgewotCQlWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKLQkJaWYgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1JFQ0VJVklOR19DRkcpCi0JCXsKLQkJICAgIHBEZXZpY2UtPklnbm9yZVRiaUxpbmtDaGFuZ2UgPSBUUlVFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkgICAgcERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSA9IEZBTFNFOwotCQl9Ci0JICAgIH0KLQkgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7Ci0JICAgIGlmIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19ET1dOICYmCi0JCSAoVmFsdWUzMiAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgJiYKLQkJICgoVmFsdWUzMiAmIE1BQ19TVEFUVVNfUkVDRUlWSU5HX0NGRykgPT0gMCkpCi0JICAgIHsKLQkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7Ci0JICAgIH0KKwkJYnJlYWs7CiAJfQotCWVsc2UKLQl7Ci0JICAgIC8qIFdlIGFyZSBmb3JjaW5nIGxpbmUgc3BlZWQuICovCi0JICAgIHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICY9IH5MTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRTsKLQkgICAgTE1fU2V0Rmxvd0NvbnRyb2wocERldmljZSwgMCwgMCk7CiAKLQkgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUgfAotCQlNQUNfTU9ERV9TRU5EX0NPTkZJR1MpOwotCX0KLSAgICB9Ci0gICAgLyogU2V0IHRoZSBsaW5rIHBvbGFyaXR5IGJpdC4gKi8KLSAgICBwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9MSU5LX1BPTEFSSVRZOwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCS8qIEVuYWJsZSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1hY0V2ZW50LAorCQlNQUNfRVZFTlRfRU5BQkxFX0xJTktfU1RBVEVfQ0hBTkdFRF9BVFROKTsKIAotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPSBTVEFUVVNfQkxPQ0tfVVBEQVRFRCB8Ci0JKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJiB+U1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMpOwotCi0gICAgZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5TdGF0dXMsIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKLQkgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7Ci0JTU1fV2FpdCg1KTsKLQlpZiAoKFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cykgJgotCSAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSkgPT0gMCkKLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7Ci0gICAgaWYoKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpID09IDApCi0gICAgeworCS8qIERlZmF1bHQgdG8gbGluayBkb3duLiAqLwogCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKLQlpZiAocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UpCi0JewotCSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlIHwKLQkJTUFDX01PREVfU0VORF9DT05GSUdTKTsKLQkgICAgTU1fV2FpdCgxKTsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CisKKwkvKiBHZXQgdGhlIGxpbmsgc3RhdHVzLiAqLworCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKKwlpZiAoVmFsdWUzMiAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgeworCQlpZiAoKHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PQorCQkgICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8pCisJCSAgICB8fCAocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UpKSB7CisJCQkvKiBhdXRvLW5lZ290aWF0aW9uIG1vZGUuICovCisJCQkvKiBJbml0aWFsaXplIHRoZSBhdXRvbmVnIGRlZmF1bHQgY2FwYWlibGl0aWVzLiAqLworCQkJQXV0b25lZ0luaXQgKCZwRGV2aWNlLT5BbkluZm8pOworCisJCQkvKiBTZXQgdGhlIGNvbnRleHQgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbWFpbiBkZXZpY2Ugc3RydWN0dXJlLiAqLworCQkJcERldmljZS0+QW5JbmZvLnBDb250ZXh0ID0gcERldmljZTsKKworCQkJLyogU2V0dXAgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIuICovCisJCQlWYWx1ZTMyID0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyAocERldmljZSk7CisJCQlpZiAoVmFsdWUzMiAmIFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFKSB7CisJCQkJcERldmljZS0+QW5JbmZvLm1yX2Fkdl9zeW1fcGF1c2UgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlwRGV2aWNlLT5BbkluZm8ubXJfYWR2X3N5bV9wYXVzZSA9IDA7CisJCQl9CisKKwkJCWlmIChWYWx1ZTMyICYgUEhZX0FOX0FEX0FTWU1fUEFVU0UpIHsKKwkJCQlwRGV2aWNlLT5BbkluZm8ubXJfYWR2X2FzeW1fcGF1c2UgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlwRGV2aWNlLT5BbkluZm8ubXJfYWR2X2FzeW1fcGF1c2UgPSAwOworCQkJfQorCisJCQkvKiBUcnkgdG8gYXV0b25lZyB1cCB0byBzaXggdGltZXMuICovCisJCQlpZiAocERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSkgeworCQkJCUNudCA9IDE7CisJCQl9IGVsc2UgeworCQkJCUNudCA9IDY7CisJCQl9CisJCQlmb3IgKGogPSAwOyBqIDwgQ250OyBqKyspIHsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuVHhBdXRvTmVnLCAwKTsKKworCQkJCVZhbHVlMzIgPQorCQkJCSAgICBwRGV2aWNlLT5NYWNNb2RlICYgfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLOworCQkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5Nb2RlLCBWYWx1ZTMyKTsKKwkJCQlNTV9XYWl0ICgyMCk7CisKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwKKwkJCQkJcERldmljZS0+CisJCQkJCU1hY01vZGUgfCBNQUNfTU9ERV9TRU5EX0NPTkZJR1MpOworCisJCQkJTU1fV2FpdCAoMjApOworCisJCQkJcERldmljZS0+QW5JbmZvLlN0YXRlID0gQU5fU1RBVEVfVU5LTk9XTjsKKwkJCQlwRGV2aWNlLT5BbkluZm8uQ3VycmVudFRpbWVfdXMgPSAwOworCisJCQkJUkVHX1dSIChwRGV2aWNlLCBHcmMuVGltZXIsIDApOworCQkJCWZvciAoayA9IDA7CisJCQkJICAgICAocERldmljZS0+QW5JbmZvLkN1cnJlbnRUaW1lX3VzIDwgNzUwMDApCisJCQkJICAgICAmJiAoayA8IDc1MDAwKTsgaysrKSB7CisJCQkJCUFuU3RhdHVzID0KKwkJCQkJICAgIEF1dG9uZWc4MDIzeiAoJnBEZXZpY2UtPkFuSW5mbyk7CisKKwkJCQkJaWYgKChBblN0YXR1cyA9PSBBVVRPTkVHX1NUQVRVU19ET05FKSB8fAorCQkJCQkgICAgKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0ZBSUxFRCkpCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJcERldmljZS0+QW5JbmZvLkN1cnJlbnRUaW1lX3VzID0KKwkJCQkJICAgIFJFR19SRCAocERldmljZSwgR3JjLlRpbWVyKTsKKworCQkJCX0KKwkJCQlpZiAoKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0RPTkUpIHx8CisJCQkJICAgIChBblN0YXR1cyA9PSBBVVRPTkVHX1NUQVRVU19GQUlMRUQpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoaiA+PSAxKSB7CisJCQkJCWlmICghKFJFR19SRCAocERldmljZSwgTWFjQ3RybC5TdGF0dXMpICYKKwkJCQkJICAgICAgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qIFN0b3Agc2VuZGluZyBjb25maWdzLiAqLworCQkJTU1fQW5UeElkbGUgKCZwRGV2aWNlLT5BbkluZm8pOworCisJCQkvKiBSZXNvbHZlIGZsb3cgY29udHJvbCBzZXR0aW5ncy4gKi8KKwkJCWlmICgoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRE9ORSkgJiYKKwkJCSAgICBwRGV2aWNlLT5BbkluZm8ubXJfYW5fY29tcGxldGUKKwkJCSAgICAmJiBwRGV2aWNlLT5BbkluZm8ubXJfbGlua19vaworCQkJICAgICYmIHBEZXZpY2UtPkFuSW5mby5tcl9scF9hZHZfZnVsbF9kdXBsZXgpIHsKKwkJCQlMTV9VSU5UMzIgUmVtb3RlUGh5QWQ7CisJCQkJTE1fVUlOVDMyIExvY2FsUGh5QWQ7CisKKwkJCQlMb2NhbFBoeUFkID0gMDsKKwkJCQlpZiAocERldmljZS0+QW5JbmZvLm1yX2Fkdl9zeW1fcGF1c2UpIHsKKwkJCQkJTG9jYWxQaHlBZCB8PSBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRTsKKwkJCQl9CisKKwkJCQlpZiAocERldmljZS0+QW5JbmZvLm1yX2Fkdl9hc3ltX3BhdXNlKSB7CisJCQkJCUxvY2FsUGh5QWQgfD0gUEhZX0FOX0FEX0FTWU1fUEFVU0U7CisJCQkJfQorCisJCQkJUmVtb3RlUGh5QWQgPSAwOworCQkJCWlmIChwRGV2aWNlLT5BbkluZm8ubXJfbHBfYWR2X3N5bV9wYXVzZSkgeworCQkJCQlSZW1vdGVQaHlBZCB8PQorCQkJCQkgICAgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFOworCQkJCX0KKworCQkJCWlmIChwRGV2aWNlLT5BbkluZm8ubXJfbHBfYWR2X2FzeW1fcGF1c2UpIHsKKwkJCQkJUmVtb3RlUGh5QWQgfD0KKwkJCQkJICAgIFBIWV9MSU5LX1BBUlRORVJfQVNZTV9QQVVTRTsKKwkJCQl9CisKKwkJCQlMTV9TZXRGbG93Q29udHJvbCAocERldmljZSwgTG9jYWxQaHlBZCwKKwkJCQkJCSAgIFJlbW90ZVBoeUFkKTsKKworCQkJCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOworCQkJfQorCQkJZm9yIChqID0gMDsgaiA8IDMwOyBqKyspIHsKKwkJCQlNTV9XYWl0ICgyMCk7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cywKKwkJCQkJTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJCQlNQUNfU1RBVFVTX0NGR19DSEFOR0VEKTsKKwkJCQlNTV9XYWl0ICgyMCk7CisJCQkJaWYgKChSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKSAmCisJCQkJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJCSAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKSA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwRGV2aWNlLT5Qb2xsVGJpTGluaykgeworCQkJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKKwkJCQlpZiAoVmFsdWUzMiAmIE1BQ19TVEFUVVNfUkVDRUlWSU5HX0NGRykgeworCQkJCQlwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlID0gVFJVRTsKKwkJCQl9IGVsc2UgeworCQkJCQlwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlID0gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTWFjQ3RybC5TdGF0dXMpOworCQkJaWYgKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0RPV04gJiYKKwkJCSAgICAoVmFsdWUzMiAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgJiYKKwkJCSAgICAoKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1JFQ0VJVklOR19DRkcpID09IDApKSB7CisJCQkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBXZSBhcmUgZm9yY2luZyBsaW5lIHNwZWVkLiAqLworCQkJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJj0gfkxNX0ZMT1dfQ09OVFJPTF9BVVRPX1BBVVNFOworCQkJTE1fU2V0Rmxvd0NvbnRyb2wgKHBEZXZpY2UsIDAsIDApOworCisJCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKKwkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlIHwKKwkJCQlNQUNfTU9ERV9TRU5EX0NPTkZJR1MpOworCQl9CiAJfQotICAgIH0KKwkvKiBTZXQgdGhlIGxpbmsgcG9sYXJpdHkgYml0LiAqLworCXBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY3VycmVudCBsaW5rIHN0YXR1cy4gKi8KLSAgICBpZihDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpCi0gICAgewotCXBEZXZpY2UtPkxpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7Ci0JcERldmljZS0+RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAotCSAgICBMRURfQ1RSTF8xMDAwTUJQU19MRURfT04pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXBEZXZpY2UtPkxpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfVU5LTk9XTjsKLQlwRGV2aWNlLT5EdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfVU5LTk9XTjsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBMRURfQ1RSTF9PVkVSUklERV9MSU5LX0xFRCB8Ci0JICAgIExFRF9DVFJMX09WRVJSSURFX1RSQUZGSUNfTEVEKTsKLSAgICB9CisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyA9IFNUQVRVU19CTE9DS19VUERBVEVEIHwKKwkgICAgKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT4KKwkgICAgIFN0YXR1cyAmIH5TVEFUVVNfQkxPQ0tfTElOS19DSEFOR0VEX1NUQVRVUyk7CiAKLSAgICAvKiBJbmRpY2F0ZSBsaW5rIHN0YXR1cy4gKi8KLSAgICBpZiAocERldmljZS0+TGlua1N0YXR1cyAhPSBDdXJyZW50TGlua1N0YXR1cykgewotCXBEZXZpY2UtPkxpbmtTdGF0dXMgPSBDdXJyZW50TGlua1N0YXR1czsKLQlNTV9JbmRpY2F0ZVN0YXR1cyhwRGV2aWNlLCBDdXJyZW50TGlua1N0YXR1cyk7Ci0gICAgfQorCWZvciAoaiA9IDA7IGogPCAxMDA7IGorKykgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzLCBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8CisJCQlNQUNfU1RBVFVTX0NGR19DSEFOR0VEKTsKKwkJTU1fV2FpdCAoNSk7CisJCWlmICgoUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cykgJgorCQkgICAgIChNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8IE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKSA9PSAwKQorCQkJYnJlYWs7CisJfQogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKKwlpZiAoKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpID09IDApIHsKKwkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworCQlpZiAocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UpIHsKKwkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlIHwKKwkJCQlNQUNfTU9ERV9TRU5EX0NPTkZJR1MpOworCQkJTU1fV2FpdCAoMSk7CisJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBjdXJyZW50IGxpbmsgc3RhdHVzLiAqLworCWlmIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpIHsKKwkJcERldmljZS0+TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKKwkJcERldmljZS0+RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBMRURfQ1RSTF9PVkVSUklERV9MSU5LX0xFRCB8CisJCQlMRURfQ1RSTF8xMDAwTUJQU19MRURfT04pOworCX0gZWxzZSB7CisJCXBEZXZpY2UtPkxpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfVU5LTk9XTjsKKwkJcERldmljZS0+RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX1VOS05PV047CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBMRURfQ1RSTF9PVkVSUklERV9MSU5LX0xFRCB8CisJCQlMRURfQ1RSTF9PVkVSUklERV9UUkFGRklDX0xFRCk7CisJfQorCisJLyogSW5kaWNhdGUgbGluayBzdGF0dXMuICovCisJaWYgKHBEZXZpY2UtPkxpbmtTdGF0dXMgIT0gQ3VycmVudExpbmtTdGF0dXMpIHsKKwkJcERldmljZS0+TGlua1N0YXR1cyA9IEN1cnJlbnRMaW5rU3RhdHVzOworCQlNTV9JbmRpY2F0ZVN0YXR1cyAocERldmljZSwgQ3VycmVudExpbmtTdGF0dXMpOworCX0KKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KLSNlbmRpZiAvKiBJTkNMVURFX1RCSV9TVVBQT1JUICovCi0KKyNlbmRpZgkJCQkvKiBJTkNMVURFX1RCSV9TVVBQT1JUICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9TZXR1cENvcHBlclBoeSgKLSAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTE1fU2V0dXBDb3BwZXJQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBMTV9TVEFUVVMgQ3VycmVudExpbmtTdGF0dXM7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fU1RBVFVTIEN1cnJlbnRMaW5rU3RhdHVzOworCUxNX1VJTlQzMiBWYWx1ZTMyOwogCi0gICAgLyogQXNzdW1lIHRoZXJlIGlzIG5vdCBsaW5rIGZpcnN0LiAqLwotICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKKwkvKiBBc3N1bWUgdGhlcmUgaXMgbm90IGxpbmsgZmlyc3QuICovCisJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOwogCi0gICAgLyogRGlzYWJsZSBwaHkgbGluayBjaGFuZ2UgYXR0ZW50aW9uLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1hY0V2ZW50LCAwKTsKKwkvKiBEaXNhYmxlIHBoeSBsaW5rIGNoYW5nZSBhdHRlbnRpb24uICovCisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1hY0V2ZW50LCAwKTsKIAotICAgIC8qIENsZWFyIGxpbmsgY2hhbmdlIGF0dGVudGlvbi4gKi8KLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5TdGF0dXMsIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKLQlNQUNfU1RBVFVTX0NGR19DSEFOR0VEKTsKKwkvKiBDbGVhciBsaW5rIGNoYW5nZSBhdHRlbnRpb24uICovCisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cywgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQlNQUNfU1RBVFVTX0NGR19DSEFOR0VEKTsKIAotICAgIC8qIERpc2FibGUgYXV0by1wb2xsaW5nIGZvciB0aGUgbW9tZW50LiAqLwotICAgIHBEZXZpY2UtPk1pTW9kZSA9IDB4YzAwMDA7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOwotICAgIE1NX1dhaXQoNDApOworCS8qIERpc2FibGUgYXV0by1wb2xsaW5nIGZvciB0aGUgbW9tZW50LiAqLworCXBEZXZpY2UtPk1pTW9kZSA9IDB4YzAwMDA7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlKTsKKwlNTV9XYWl0ICg0MCk7CiAKLSAgICAvKiBEZXRlcm1pbmUgdGhlIHJlcXVlc3RlZCBsaW5lIHNwZWVkIGFuZCBkdXBsZXguICovCi0gICAgcERldmljZS0+T2xkTGluZVNwZWVkID0gcERldmljZS0+TGluZVNwZWVkOwotICAgIExNX1RyYW5zbGF0ZVJlcXVlc3RlZE1lZGlhVHlwZShwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUsCi0JJnBEZXZpY2UtPk1lZGlhVHlwZSwgJnBEZXZpY2UtPkxpbmVTcGVlZCwgJnBEZXZpY2UtPkR1cGxleE1vZGUpOworCS8qIERldGVybWluZSB0aGUgcmVxdWVzdGVkIGxpbmUgc3BlZWQgYW5kIGR1cGxleC4gKi8KKwlwRGV2aWNlLT5PbGRMaW5lU3BlZWQgPSBwRGV2aWNlLT5MaW5lU3BlZWQ7CisJTE1fVHJhbnNsYXRlUmVxdWVzdGVkTWVkaWFUeXBlIChwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUsCisJCQkJCSZwRGV2aWNlLT5NZWRpYVR5cGUsCisJCQkJCSZwRGV2aWNlLT5MaW5lU3BlZWQsCisJCQkJCSZwRGV2aWNlLT5EdXBsZXhNb2RlKTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIHBoeSBjaGlwLiAqLwotICAgIHN3aXRjaChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKQotICAgIHsKKwkvKiBJbml0aWFsaXplIHRoZSBwaHkgY2hpcC4gKi8KKwlzd2l0Y2ggKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spIHsKIAljYXNlIFBIWV9CQ001NDAwX1BIWV9JRDoKIAljYXNlIFBIWV9CQ001NDAxX1BIWV9JRDoKIAljYXNlIFBIWV9CQ001NDExX1BIWV9JRDoKIAljYXNlIFBIWV9CQ001NzAxX1BIWV9JRDoKIAljYXNlIFBIWV9CQ001NzAzX1BIWV9JRDoKIAljYXNlIFBIWV9CQ001NzA0X1BIWV9JRDoKLQkgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9Jbml0QmNtNTQweFBoeShwRGV2aWNlKTsKLQkgICAgYnJlYWs7CisJCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fSW5pdEJjbTU0MHhQaHkgKHBEZXZpY2UpOworCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgIH0KKwkJYnJlYWs7CisJfQogCi0gICAgaWYoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfU0VUVElOR19NSVNNQVRDSCkKLSAgICB7Ci0JQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOwotICAgIH0KKwlpZiAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfU0VUVElOR19NSVNNQVRDSCkgeworCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047CisJfQogCi0gICAgLyogU2V0dXAgZmxvdyBjb250cm9sLiAqLwotICAgIHBEZXZpY2UtPkZsb3dDb250cm9sID0gTE1fRkxPV19DT05UUk9MX05PTkU7Ci0gICAgaWYoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKQotICAgIHsKLQlMTV9GTE9XX0NPTlRST0wgRmxvd0NhcDsgICAgIC8qIEZsb3cgY29udHJvbCBjYXBhYmlsaXR5LiAqLworCS8qIFNldHVwIGZsb3cgY29udHJvbC4gKi8KKwlwRGV2aWNlLT5GbG93Q29udHJvbCA9IExNX0ZMT1dfQ09OVFJPTF9OT05FOworCWlmIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpIHsKKwkJTE1fRkxPV19DT05UUk9MIEZsb3dDYXA7CS8qIEZsb3cgY29udHJvbCBjYXBhYmlsaXR5LiAqLwogCi0JRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9OT05FOworCQlGbG93Q2FwID0gTE1fRkxPV19DT05UUk9MX05PTkU7CiAKLQlpZihwRGV2aWNlLT5EdXBsZXhNb2RlID09IExNX0RVUExFWF9NT0RFX0ZVTEwpCi0JewotCSAgICBpZihwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9PSBGQUxTRSB8fAotCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTyB8fAotCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE8pCi0JICAgIHsKLQkJTE1fVUlOVDMyIEV4cGVjdGVkUGh5QWQ7Ci0JCUxNX1VJTlQzMiBMb2NhbFBoeUFkOwotCQlMTV9VSU5UMzIgUmVtb3RlUGh5QWQ7CisJCWlmIChwRGV2aWNlLT5EdXBsZXhNb2RlID09IExNX0RVUExFWF9NT0RFX0ZVTEwpIHsKKwkJCWlmIChwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9PSBGQUxTRSB8fAorCQkJICAgIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PQorCQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8KKwkJCSAgICB8fCBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0KKwkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfQVVUTykgeworCQkJCUxNX1VJTlQzMiBFeHBlY3RlZFBoeUFkOworCQkJCUxNX1VJTlQzMiBMb2NhbFBoeUFkOworCQkJCUxNX1VJTlQzMiBSZW1vdGVQaHlBZDsKIAotCQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsICZMb2NhbFBoeUFkKTsKLQkJcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBMb2NhbFBoeUFkOwotCQlMb2NhbFBoeUFkICY9IChQSFlfQU5fQURfQVNZTV9QQVVTRSB8IFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFKTsKKwkJCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfQU5fQURfUkVHLAorCQkJCQkgICAgJkxvY2FsUGh5QWQpOworCQkJCXBEZXZpY2UtPmFkdmVydGlzaW5nID0gTG9jYWxQaHlBZDsKKwkJCQlMb2NhbFBoeUFkICY9CisJCQkJICAgIChQSFlfQU5fQURfQVNZTV9QQVVTRSB8CisJCQkJICAgICBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRSk7CiAKLQkJRXhwZWN0ZWRQaHlBZCA9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7CisJCQkJRXhwZWN0ZWRQaHlBZCA9CisJCQkJICAgIEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKHBEZXZpY2UpOwogCi0JCWlmKExvY2FsUGh5QWQgIT0gRXhwZWN0ZWRQaHlBZCkKLQkJewotCQkgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworCQkJCWlmIChMb2NhbFBoeUFkICE9IEV4cGVjdGVkUGh5QWQpIHsKKwkJCQkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworCQkJCX0gZWxzZSB7CisJCQkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsCisJCQkJCQkgICAgUEhZX0xJTktfUEFSVE5FUl9BQklMSVRZX1JFRywKKwkJCQkJCSAgICAmUmVtb3RlUGh5QWQpOworCisJCQkJCUxNX1NldEZsb3dDb250cm9sIChwRGV2aWNlLCBMb2NhbFBoeUFkLAorCQkJCQkJCSAgIFJlbW90ZVBoeUFkKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICY9CisJCQkJICAgIH5MTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRTsKKwkJCQlMTV9TZXRGbG93Q29udHJvbCAocERldmljZSwgMCwgMCk7CisJCQl9CiAJCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9MSU5LX1BBUlRORVJfQUJJTElUWV9SRUcsCi0JCQkmUmVtb3RlUGh5QWQpOworCX0KIAotCQkgICAgTE1fU2V0Rmxvd0NvbnRyb2wocERldmljZSwgTG9jYWxQaHlBZCwgUmVtb3RlUGh5QWQpOworCWlmIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19ET1dOKSB7CisJCUxNX0ZvcmNlQXV0b05lZyAocERldmljZSwgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlKTsKKworCQkvKiBJZiB3ZSBmb3JjZSBsaW5lIHNwZWVkLCB3ZSBtYWtlIGdldCBsaW5rIHJpZ2h0IGF3YXkuICovCisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJCWlmIChWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpIHsKKwkJCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOwogCQl9Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICY9IH5MTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRTsKLQkJTE1fU2V0Rmxvd0NvbnRyb2wocERldmljZSwgMCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgaWYoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTikKLSAgICB7Ci0JTE1fRm9yY2VBdXRvTmVnKHBEZXZpY2UsIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSk7Ci0KLQkvKiBJZiB3ZSBmb3JjZSBsaW5lIHNwZWVkLCB3ZSBtYWtlIGdldCBsaW5rIHJpZ2h0IGF3YXkuICovCi0JTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQlpZihWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpCi0JewotCSAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKLQl9Ci0gICAgfQotCi0gICAgLyogR01JSSBpbnRlcmZhY2UuICovCi0gICAgcERldmljZS0+TWFjTW9kZSAmPSB+TUFDX01PREVfUE9SVF9NT0RFX01BU0s7Ci0gICAgaWYoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKQotICAgIHsKLQlpZihwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDBNQlBTIHx8Ci0JICAgIHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwTUJQUykKLQl7Ci0JICAgIHBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX01JSTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotCXBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBNQUMgdG8gb3BlcmF0ZSBpbiB0aGUgYXBwcm9wcmlhdGUgZHVwbGV4IG1vZGUuICovCi0gICAgcERldmljZS0+TWFjTW9kZSAmPSB+TUFDX01PREVfSEFMRl9EVVBMRVg7Ci0gICAgaWYocERldmljZS0+RHVwbGV4TW9kZSA9PSBMTV9EVVBMRVhfTU9ERV9IQUxGKQotICAgIHsKLQlwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX0hBTEZfRFVQTEVYOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgbGluayBwb2xhcml0eSBiaXQuICovCi0gICAgcERldmljZS0+TWFjTW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKLSAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCi0gICAgewotCWlmKChwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX0xJTksxMCkgfHwKLQkgICAgIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUgJiYKLQkgICAgIHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwTUJQUykpCi0JewotCSAgICBwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWlmIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpCi0JewotCSAgICBwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CiAJfQogCi0JLyogU2V0IExFRCBtb2RlLiAqLwotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAotCSAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCi0JewotCSAgICBWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKwkvKiBHTUlJIGludGVyZmFjZS4gKi8KKwlwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKKwlpZiAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKSB7CisJCWlmIChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDBNQlBTIHx8CisJCSAgICBwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xME1CUFMpIHsKKwkJCXBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX01JSTsKKwkJfSBlbHNlIHsKKwkJCXBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7CisJCX0KKwl9IGVsc2UgeworCQlwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOwogCX0KLQllbHNlCi0JewotCSAgICBpZihwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX09VVFBVVCkKLQkgICAgewotCQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMjsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzE7Ci0JICAgIH0KKworCS8qIFNldCB0aGUgTUFDIHRvIG9wZXJhdGUgaW4gdGhlIGFwcHJvcHJpYXRlIGR1cGxleCBtb2RlLiAqLworCXBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX0hBTEZfRFVQTEVYOworCWlmIChwRGV2aWNlLT5EdXBsZXhNb2RlID09IExNX0RVUExFWF9NT0RFX0hBTEYpIHsKKwkJcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9IQUxGX0RVUExFWDsKIAl9Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgVmFsdWUzMik7Ci0gICAgfQogCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CisJLyogU2V0IHRoZSBsaW5rIHBvbGFyaXR5IGJpdC4gKi8KKwlwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCWlmICgocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9MSU5LMTApIHx8CisJCSAgICAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFICYmCisJCSAgICAgcERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTBNQlBTKSkgeworCQkJcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkgeworCQkJcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCQl9CiAKLSAgICAvKiBFbmFibGUgYXV0byBwb2xsaW5nLiAqLwotICAgIGlmKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElORykKLSAgICB7Ci0JcERldmljZS0+TWlNb2RlIHw9IE1JX01PREVfQVVUT19QT0xMSU5HX0VOQUJMRTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7Ci0gICAgfQotCi0gICAgLyogRW5hYmxlIHBoeSBsaW5rIGNoYW5nZSBhdHRlbnRpb24uICovCi0gICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5NYWNFdmVudCwgTUFDX0VWRU5UX0VOQUJMRV9NSV9JTlRFUlJVUFQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1hY0V2ZW50LAotCSAgICBNQUNfRVZFTlRfRU5BQkxFX0xJTktfU1RBVEVfQ0hBTkdFRF9BVFROKTsKLSAgICB9Ci0gICAgaWYgKChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApICYmCi0JKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkgJiYKLQkocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwME1CUFMpICYmCi0JKCgocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSAmJgotCSAgKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0JVU19TUEVFRF9ISUdIKSkgfHwKLQkgIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKSkKLSAgICB7Ci0JTU1fV2FpdCgxMjApOwotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cywgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAotCSAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKTsKLQlNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIFQzX0ZJUk1XQVJFX01BSUxCT1gsCi0JICAgIFQzX01BR0lDX05VTV9ESVNBQkxFX0RNQVdfT05fTElOS19DSEFOR0UpOwotICAgIH0KLQotICAgIC8qIEluZGljYXRlIGxpbmsgc3RhdHVzLiAqLwotICAgIGlmIChwRGV2aWNlLT5MaW5rU3RhdHVzICE9IEN1cnJlbnRMaW5rU3RhdHVzKSB7Ci0JcERldmljZS0+TGlua1N0YXR1cyA9IEN1cnJlbnRMaW5rU3RhdHVzOwotCU1NX0luZGljYXRlU3RhdHVzKHBEZXZpY2UsIEN1cnJlbnRMaW5rU3RhdHVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19IC8qIExNX1NldHVwQ29wcGVyUGh5ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9TZXR1cFBoeSgKLSAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCi17Ci0gICAgTE1fU1RBVFVTIExtU3RhdHVzOwotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotCi0jaWYgSU5DTFVERV9UQklfU1VQUE9SVAotICAgIGlmKHBEZXZpY2UtPkVuYWJsZVRiaSkKLSAgICB7Ci0JTG1TdGF0dXMgPSBMTV9TZXR1cEZpYmVyUGh5KHBEZXZpY2UpOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLyogSU5DTFVERV9UQklfU1VQUE9SVCAqLwotICAgIHsKLQlMbVN0YXR1cyA9IExNX1NldHVwQ29wcGVyUGh5KHBEZXZpY2UpOwotICAgIH0KLSAgICBpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkKLSAgICB7Ci0JaWYgKCEocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSkKLQl7Ci0JICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgUGNpQ2ZnLlBjaVN0YXRlKTsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSwKLQkJVmFsdWUzMiB8IFQzX1BDSV9TVEFURV9SRVRSWV9TQU1FX0RNQSk7CisJCS8qIFNldCBMRUQgbW9kZS4gKi8KKwkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKwkJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOworCQl9IGVsc2UgeworCQkJaWYgKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfT1VUUFVUKSB7CisJCQkJVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzI7CisJCQl9IGVsc2UgeworCQkJCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOworCQkJfQorCQl9CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBWYWx1ZTMyKTsKIAl9Ci0gICAgfQotICAgIGlmICgocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwME1CUFMpICYmCi0JKHBEZXZpY2UtPkR1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfSEFMRikpCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlR4TGVuZ3RocywgMHgyNmZmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeExlbmd0aHMsIDB4MjYyMCk7Ci0gICAgfQogCi0gICAgcmV0dXJuIExtU3RhdHVzOwotfQorCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlKTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9WT0lECi1MTV9SZWFkUGh5KAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotTE1fVUlOVDMyIFBoeVJlZywKLVBMTV9VSU5UMzIgcERhdGEzMikgewotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1VJTlQzMiBqOwotCi0gICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSAmCi0JICAgIH5NSV9NT0RFX0FVVE9fUE9MTElOR19FTkFCTEUpOwotCU1NX1dhaXQoNDApOwotICAgIH0KLQotICAgIFZhbHVlMzIgPSAocERldmljZS0+UGh5QWRkciA8PCBNSV9DT01fRklSU1RfUEhZX0FERFJfQklUKSB8Ci0JKChQaHlSZWcgJiBNSV9DT01fUEhZX1JFR19BRERSX01BU0spIDw8IE1JX0NPTV9GSVJTVF9QSFlfUkVHX0FERFJfQklUKSB8Ci0JTUlfQ09NX0NNRF9SRUFEIHwgTUlfQ09NX1NUQVJUOwotCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlDb20sIFZhbHVlMzIpOwotCi0gICAgZm9yKGogPSAwOyBqIDwgMjA7IGorKykKLSAgICB7Ci0JTU1fV2FpdCgyNSk7Ci0KLQlWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuTWlDb20pOwotCi0JaWYoIShWYWx1ZTMyICYgTUlfQ09NX0JVU1kpKQotCXsKLQkgICAgTU1fV2FpdCg1KTsKLQkgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLk1pQ29tKTsKLQkgICAgVmFsdWUzMiAmPSBNSV9DT01fUEhZX0RBVEFfTUFTSzsKLQkgICAgYnJlYWs7CisJLyogRW5hYmxlIGF1dG8gcG9sbGluZy4gKi8KKwlpZiAocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKSB7CisJCXBEZXZpY2UtPk1pTW9kZSB8PSBNSV9NT0RFX0FVVE9fUE9MTElOR19FTkFCTEU7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7CiAJfQotICAgIH0KIAotICAgIGlmKFZhbHVlMzIgJiBNSV9DT01fQlVTWSkKLSAgICB7Ci0JVmFsdWUzMiA9IDA7Ci0gICAgfQotCi0gICAgKnBEYXRhMzIgPSBWYWx1ZTMyOwotCi0gICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7Ci0JTU1fV2FpdCg0MCk7Ci0gICAgfQotfSAvKiBMTV9SZWFkUGh5ICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9WT0lECi1MTV9Xcml0ZVBoeSgKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLUxNX1VJTlQzMiBQaHlSZWcsCi1MTV9VSU5UMzIgRGF0YTMyKSB7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDMyIGo7Ci0KLSAgICBpZihwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlICYKLQkgICAgfk1JX01PREVfQVVUT19QT0xMSU5HX0VOQUJMRSk7Ci0JTU1fV2FpdCg0MCk7Ci0gICAgfQotCi0gICAgVmFsdWUzMiA9IChwRGV2aWNlLT5QaHlBZGRyIDw8IE1JX0NPTV9GSVJTVF9QSFlfQUREUl9CSVQpIHwKLQkoKFBoeVJlZyAmIE1JX0NPTV9QSFlfUkVHX0FERFJfTUFTSykgPDwgTUlfQ09NX0ZJUlNUX1BIWV9SRUdfQUREUl9CSVQpIHwKLQkoRGF0YTMyICYgTUlfQ09NX1BIWV9EQVRBX01BU0spIHwgTUlfQ09NX0NNRF9XUklURSB8IE1JX0NPTV9TVEFSVDsKLQotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1pQ29tLCBWYWx1ZTMyKTsKLQotICAgIGZvcihqID0gMDsgaiA8IDIwOyBqKyspCi0gICAgewotCU1NX1dhaXQoMjUpOwotCi0JVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLk1pQ29tKTsKLQotCWlmKCEoVmFsdWUzMiAmIE1JX0NPTV9CVVNZKSkKLQl7Ci0JICAgIE1NX1dhaXQoNSk7Ci0JICAgIGJyZWFrOworCS8qIEVuYWJsZSBwaHkgbGluayBjaGFuZ2UgYXR0ZW50aW9uLiAqLworCWlmIChwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQpIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1hY0V2ZW50LAorCQkJTUFDX0VWRU5UX0VOQUJMRV9NSV9JTlRFUlJVUFQpOworCX0gZWxzZSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NYWNFdmVudCwKKwkJCU1BQ19FVkVOVF9FTkFCTEVfTElOS19TVEFURV9DSEFOR0VEX0FUVE4pOwogCX0KLSAgICB9CisJaWYgKChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSAmJgorCSAgICAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKSAmJgorCSAgICAocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwME1CUFMpICYmCisJICAgICgoKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkgJiYKKwkgICAgICAocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQlVTX1NQRUVEX0hJR0gpKSB8fAorCSAgICAgIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKSkgeworCQlNTV9XYWl0ICgxMjApOworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzLCBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8CisJCQlNQUNfU1RBVFVTX0NGR19DSEFOR0VEKTsKKwkJTUVNX1dSX09GRlNFVCAocERldmljZSwgVDNfRklSTVdBUkVfTUFJTEJPWCwKKwkJCSAgICAgICBUM19NQUdJQ19OVU1fRElTQUJMRV9ETUFXX09OX0xJTktfQ0hBTkdFKTsKKwl9CiAKLSAgICBpZihwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlKTsKLQlNTV9XYWl0KDQwKTsKLSAgICB9Ci19IC8qIExNX1dyaXRlUGh5ICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX1NldFBvd2VyU3RhdGUoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1MTV9QT1dFUl9TVEFURSBQb3dlckxldmVsKSB7Ci0gICAgTE1fVUlOVDMyIFBtZVN1cHBvcnQ7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDMyIFBtQ3RybDsKLQotICAgIC8qIG1ha2Ugc3VyZWluZGlyZWN0IGFjY2Vzc2VzIGFyZSBlbmFibGVkKi8KLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NSVNDX0hPU1RfQ1RSTF9SRUcsIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCk7Ci0KLSAgICAvKiBDbGVhciB0aGUgUE1FX0FTU0VSVCBiaXQgYW5kIHRoZSBwb3dlciBzdGF0ZSBiaXRzLiAgQWxzbyBlbmFibGUgKi8KLSAgICAvKiB0aGUgUE1FIGJpdC4gKi8KLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgJlBtQ3RybCk7Ci0KLSAgICBQbUN0cmwgfD0gVDNfUE1fUE1FX0FTU0VSVEVEOwotICAgIFBtQ3RybCAmPSB+VDNfUE1fUE9XRVJfU1RBVEVfTUFTSzsKLQotICAgIC8qIFNldCB0aGUgYXBwcm9wcmlhdGUgcG93ZXIgc3RhdGUuICovCi0gICAgaWYoUG93ZXJMZXZlbCA9PSBMTV9QT1dFUl9TVEFURV9EMCkKLSAgICB7Ci0KLQkvKiBCcmluZyB0aGUgY2FyZCBvdXQgb2YgbG93IHBvd2VyIG1vZGUuICovCi0JUG1DdHJsIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QwOwotCU1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgUG1DdHJsKTsKLQotCVJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwpOwotCU1NX1dhaXQgKDQwKTsKLSNpZiAwICAgLyogQnVnZml4IGJ5IGptYi4uLmNhbid0IGNhbGwgV3JpdGVQaHkgaGVyZSBiZWNhdXNlIHBEZXZpY2Ugbm90IGZ1bGx5IGluaXRpYWxpemVkICovCi0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgMHgwMik7Ci0jZW5kaWYKKwkvKiBJbmRpY2F0ZSBsaW5rIHN0YXR1cy4gKi8KKwlpZiAocERldmljZS0+TGlua1N0YXR1cyAhPSBDdXJyZW50TGlua1N0YXR1cykgeworCQlwRGV2aWNlLT5MaW5rU3RhdHVzID0gQ3VycmVudExpbmtTdGF0dXM7CisJCU1NX0luZGljYXRlU3RhdHVzIChwRGV2aWNlLCBDdXJyZW50TGlua1N0YXR1cyk7CisJfQogCiAJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotICAgIH0KLSAgICBlbHNlIGlmKFBvd2VyTGV2ZWwgPT0gTE1fUE9XRVJfU1RBVEVfRDEpCi0gICAgewotCVBtQ3RybCB8PSBUM19QTV9QT1dFUl9TVEFURV9EMTsKLSAgICB9Ci0gICAgZWxzZSBpZihQb3dlckxldmVsID09IExNX1BPV0VSX1NUQVRFX0QyKQotICAgIHsKLQlQbUN0cmwgfD0gVDNfUE1fUE9XRVJfU1RBVEVfRDI7Ci0gICAgfQotICAgIGVsc2UgaWYoUG93ZXJMZXZlbCA9PSBMTV9QT1dFUl9TVEFURV9EMykKLSAgICB7Ci0JUG1DdHJsIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLSAgICB9Ci0gICAgUG1DdHJsIHw9IFQzX1BNX1BNRV9FTkFCTEU7Ci0KLSAgICAvKiBNYXNrIG91dCBhbGwgaW50ZXJydXB0cyBzbyBMTV9TZXR1cFBoeSB3b24ndCBiZSBjYWxsZWQgd2hpbGUgd2UgYXJlICovCi0gICAgLyogc2V0dGluZyBuZXcgbGluZSBzcGVlZC4gKi8KLSAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5NaXNjSG9zdEN0cmwpOwotICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsLCBWYWx1ZTMyIHwgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKTsKLQotICAgIGlmKCFwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXApCi0gICAgewotCXBEZXZpY2UtPlJlc3RvcmVPbldha2VVcCA9IFRSVUU7Ci0JcERldmljZS0+V2FrZVVwRGlzYWJsZUF1dG9OZWcgPSBwRGV2aWNlLT5EaXNhYmxlQXV0b05lZzsKLQlwRGV2aWNlLT5XYWtlVXBSZXF1ZXN0ZWRNZWRpYVR5cGUgPSBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGU7Ci0gICAgfQotCi0gICAgLyogRm9yY2UgYXV0by1uZWdvdGlhdGlvbiB0byAxMCBsaW5lIHNwZWVkLiAqLwotICAgIHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7Ci0gICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQUzsKLSAgICBMTV9TZXR1cFBoeShwRGV2aWNlKTsKLQotICAgIC8qIFB1dCB0aGUgZHJpdmVyIGluIHRoZSBpbml0aWFsIHN0YXRlLCBhbmQgZ28gdGhyb3VnaCB0aGUgcG93ZXIgZG93biAqLwotICAgIC8qIHNlcXVlbmNlLiAqLwotICAgIExNX0hhbHQocERldmljZSk7Ci0KLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX0NBUF9SRUcsICZQbWVTdXBwb3J0KTsKLQotICAgIGlmIChwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwICE9IExNX1dBS0VfVVBfTU9ERV9OT05FKQotICAgIHsKLQotCS8qIEVuYWJsZSBXT0wuICovCi0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgMHg1YSk7Ci0JTU1fV2FpdCg0MCk7Ci0KLQkvKiBTZXQgTEVEIG1vZGUuICovCi0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKLQl7Ci0JICAgIFZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOwotCX0KLQllbHNlCi0JewotCSAgICBpZihwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX09VVFBVVCkKLQkgICAgewotCQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMjsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzE7Ci0JICAgIH0KLQl9Ci0KLQlWYWx1ZTMyID0gTUFDX01PREVfUE9SVF9NT0RFX01JSTsKLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCi0JewotCSAgICBpZihwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX0xJTksxMCB8fAotCQlwRGV2aWNlLT5Xb2xTcGVlZCA9PSBXT0xfU1BFRURfMTBNQikKLQkgICAgewotCQlWYWx1ZTMyIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7Ci0JICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkgICAgVmFsdWUzMiB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOwotCX0KLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBWYWx1ZTMyKTsKLQlNTV9XYWl0KDQwKTsgTU1fV2FpdCg0MCk7IE1NX1dhaXQoNDApOwotCi0JLyogQWx3YXlzIGVuYWJsZSBtYWdpYyBwYWNrZXQgd2FrZS11cCBpZiB3ZSBoYXZlIHZhdXguICovCi0JaWYoKFBtZVN1cHBvcnQgJiBUM19QQ0lfUE1fQ0FQX1BNRV9EM0NPTEQpICYmCi0JICAgIChwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwICYgTE1fV0FLRV9VUF9NT0RFX01BR0lDX1BBQ0tFVCkpCi0JewotCSAgICBWYWx1ZTMyIHw9IE1BQ19NT0RFX0RFVEVDVF9NQUdJQ19QQUNLRVRfRU5BQkxFOwotCX0KLQotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIFZhbHVlMzIpOwotCi0JLyogRW5hYmxlIHRoZSByZWNlaXZlci4gKi8KLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIFJYX01PREVfRU5BQkxFKTsKLSAgICB9Ci0KLSAgICAvKiBEaXNhYmxlIHR4L3J4IGNsb2NrcywgYW5kIHNlbGV0ZWN0IGFuIGFsdGVybmF0ZSBjbG9jay4gKi8KLSAgICBpZihwRGV2aWNlLT5Xb2xTcGVlZCA9PSBXT0xfU1BFRURfMTAwTUIpCi0gICAgewotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAotCSAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCi0JewotCSAgICBWYWx1ZTMyID0gVDNfUENJX0RJU0FCTEVfUlhfQ0xPQ0sgfCBUM19QQ0lfRElTQUJMRV9UWF9DTE9DSyB8Ci0JCVQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLOwotCX0KLQllbHNlCi0JewotCSAgICBWYWx1ZTMyID0gVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0s7Ci0JfQotCVJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyKTsKLQotCU1NX1dhaXQoNDApOwotCi0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKLQl7Ci0JICAgIFZhbHVlMzIgPSBUM19QQ0lfRElTQUJMRV9SWF9DTE9DSyB8IFQzX1BDSV9ESVNBQkxFX1RYX0NMT0NLIHwKLQkJVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfCBUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSzsKLQl9Ci0JZWxzZQotCXsKLQkgICAgVmFsdWUzMiA9IFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLIHwKLQkJVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0s7Ci0JfQotCi0JUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFZhbHVlMzIpOwotCi0JTU1fV2FpdCg0MCk7Ci0KLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKLQkgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQotCXsKLQkgICAgVmFsdWUzMiA9IFQzX1BDSV9ESVNBQkxFX1JYX0NMT0NLIHwgVDNfUENJX0RJU0FCTEVfVFhfQ0xPQ0sgfAotCQlUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSzsKLQl9Ci0JZWxzZQotCXsKLQkgICAgVmFsdWUzMiA9IFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLOwotCX0KLQotCVJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKLQkgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQotCXsKLQkgICAgVmFsdWUzMiA9IFQzX1BDSV9ESVNBQkxFX1JYX0NMT0NLIHwgVDNfUENJX0RJU0FCTEVfVFhfQ0xPQ0sgfAotCQlUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyB8Ci0JCVQzX1BDSV9QT1dFUl9ET1dOX1BDSV9QTEwxMzM7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIFZhbHVlMzIgPSBUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyB8Ci0JCVQzX1BDSV9QT1dFUl9ET1dOX1BDSV9QTEwxMzM7Ci0JfQotCi0JUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFZhbHVlMzIpOwotICAgIH0KLQotICAgIE1NX1dhaXQoNDApOwotCi0gICAgaWYoIXBEZXZpY2UtPkVlcHJvbVdwICYmIChwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwICE9IExNX1dBS0VfVVBfTU9ERV9OT05FKSkKLSAgICB7Ci0JLyogU3dpdGNoIGFkYXB0ZXIgdG8gYXV4aWxsaWFyeSBwb3dlci4gKi8KLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKLQkgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQotCXsKLQkgICAgLyogR1BJTzAgPSAxLCBHUElPMSA9IDEsIEdQSU8yID0gMC4gKi8KLQkgICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMiB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDEpOwotCQlNTV9XYWl0KDQwKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgLyogR1BJTzAgPSAwLCBHUElPMSA9IDEsIEdQSU8yID0gMS4gKi8KLQkgICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMiB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDIpOwotCQlNTV9XYWl0KDQwKTsKLQotCSAgICAvKiBHUElPMCA9IDEsIEdQSU8xID0gMSwgR1BJTzIgPSAxLiAqLwotCSAgICBSRUdfV1IocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMCB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UyIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDAgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQyKTsKLQkJTU1fV2FpdCg0MCk7Ci0KLQkgICAgLyogR1BJTzAgPSAxLCBHUElPMSA9IDEsIEdQSU8yID0gMC4gKi8KLQkgICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMiB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDEpOwotCQlNTV9XYWl0KDQwKTsKLQl9Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwaHkgdG8gbG93IHBvd2VyIG1vZGUuICovCi0gICAgLyogUHV0IHRoZSB0aGUgaGFyZHdhcmUgaW4gbG93IHBvd2VyIG1vZGUuICovCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfUE1fU1RBVFVTX0NUUkxfUkVHLCBQbUN0cmwpOwotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9TZXRQb3dlclN0YXRlICovCi0KK30JCQkJLyogTE1fU2V0dXBDb3BwZXJQaHkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTE1fVUlOVDMyCi1HZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKAotICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBMTV9TZXR1cFBoeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIExNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1NUQVRVUyBMbVN0YXR1czsKKwlMTV9VSU5UMzIgVmFsdWUzMjsKIAotICAgIFZhbHVlMzIgPSAwOworI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKKwlpZiAocERldmljZS0+RW5hYmxlVGJpKSB7CisJCUxtU3RhdHVzID0gTE1fU2V0dXBGaWJlclBoeSAocERldmljZSk7CisJfSBlbHNlCisjZW5kaWYJCQkJLyogSU5DTFVERV9UQklfU1VQUE9SVCAqLworCXsKKwkJTG1TdGF0dXMgPSBMTV9TZXR1cENvcHBlclBoeSAocERldmljZSk7CisJfQorCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKSB7CisJCWlmICghKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkpIHsKKwkJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSk7CisJCQlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSwKKwkJCQlWYWx1ZTMyIHwgVDNfUENJX1NUQVRFX1JFVFJZX1NBTUVfRE1BKTsKKwkJfQorCX0KKwlpZiAoKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKSAmJgorCSAgICAocERldmljZS0+RHVwbGV4TW9kZSA9PSBMTV9EVVBMRVhfTU9ERV9IQUxGKSkgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuVHhMZW5ndGhzLCAweDI2ZmYpOworCX0gZWxzZSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5UeExlbmd0aHMsIDB4MjYyMCk7CisJfQogCi0gICAgLyogQXV0byBuZWdvdGlhdGlvbiBmbG93IGNvbnRyb2wgb25seSB3aGVuIGF1dG9uZWdvdGlhdGlvbiBpcyBlbmFibGVkLiAqLwotICAgIGlmKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID09IEZBTFNFIHx8Ci0JcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8gfHwKLQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE8pCi0gICAgewotCS8qIFBsZWFzZSByZWZlciB0byBUYWJsZSAyOEItMyBvZiB0aGUgODAyLjNhYi0xOTk5IHNwZWMuICovCi0JaWYoKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID09IExNX0ZMT1dfQ09OVFJPTF9BVVRPX1BBVVNFKSB8fAotCSAgICAoKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UpICYmCi0JICAgIChwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSkpKQotCXsKLQkgICAgVmFsdWUzMiB8PSBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRTsKLQl9Ci0JZWxzZSBpZihwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSkKLQl7Ci0JICAgIFZhbHVlMzIgfD0gUEhZX0FOX0FEX0FTWU1fUEFVU0U7Ci0JfQotCWVsc2UgaWYocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkKLQl7Ci0JICAgIFZhbHVlMzIgfD0gUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEUgfCBQSFlfQU5fQURfQVNZTV9QQVVTRTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIFZhbHVlMzI7CisJcmV0dXJuIExtU3RhdHVzOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1ZPSUQKK0xNX1JlYWRQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFBoeVJlZywgUExNX1VJTlQzMiBwRGF0YTMyKQoreworCUxNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1VJTlQzMiBqOworCisJaWYgKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElORykgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUgJgorCQkJfk1JX01PREVfQVVUT19QT0xMSU5HX0VOQUJMRSk7CisJCU1NX1dhaXQgKDQwKTsKKwl9CisKKwlWYWx1ZTMyID0gKHBEZXZpY2UtPlBoeUFkZHIgPDwgTUlfQ09NX0ZJUlNUX1BIWV9BRERSX0JJVCkgfAorCSAgICAoKFBoeVJlZyAmIE1JX0NPTV9QSFlfUkVHX0FERFJfTUFTSykgPDwKKwkgICAgIE1JX0NPTV9GSVJTVF9QSFlfUkVHX0FERFJfQklUKSB8IE1JX0NPTV9DTURfUkVBRCB8IE1JX0NPTV9TVEFSVDsKKworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaUNvbSwgVmFsdWUzMik7CisKKwlmb3IgKGogPSAwOyBqIDwgMjA7IGorKykgeworCQlNTV9XYWl0ICgyNSk7CisKKwkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTWFjQ3RybC5NaUNvbSk7CisKKwkJaWYgKCEoVmFsdWUzMiAmIE1JX0NPTV9CVVNZKSkgeworCQkJTU1fV2FpdCAoNSk7CisJCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLk1pQ29tKTsKKwkJCVZhbHVlMzIgJj0gTUlfQ09NX1BIWV9EQVRBX01BU0s7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChWYWx1ZTMyICYgTUlfQ09NX0JVU1kpIHsKKwkJVmFsdWUzMiA9IDA7CisJfQorCisJKnBEYXRhMzIgPSBWYWx1ZTMyOworCisJaWYgKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElORykgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOworCQlNTV9XYWl0ICg0MCk7CisJfQorfQkJCQkvKiBMTV9SZWFkUGh5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fVk9JRAorTE1fV3JpdGVQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFBoeVJlZywgTE1fVUlOVDMyIERhdGEzMikKK3sKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9VSU5UMzIgajsKKworCWlmIChwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlICYKKwkJCX5NSV9NT0RFX0FVVE9fUE9MTElOR19FTkFCTEUpOworCQlNTV9XYWl0ICg0MCk7CisJfQorCisJVmFsdWUzMiA9IChwRGV2aWNlLT5QaHlBZGRyIDw8IE1JX0NPTV9GSVJTVF9QSFlfQUREUl9CSVQpIHwKKwkgICAgKChQaHlSZWcgJiBNSV9DT01fUEhZX1JFR19BRERSX01BU0spIDw8CisJICAgICBNSV9DT01fRklSU1RfUEhZX1JFR19BRERSX0JJVCkgfCAoRGF0YTMyICYgTUlfQ09NX1BIWV9EQVRBX01BU0spIHwKKwkgICAgTUlfQ09NX0NNRF9XUklURSB8IE1JX0NPTV9TVEFSVDsKKworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaUNvbSwgVmFsdWUzMik7CisKKwlmb3IgKGogPSAwOyBqIDwgMjA7IGorKykgeworCQlNTV9XYWl0ICgyNSk7CisKKwkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTWFjQ3RybC5NaUNvbSk7CisKKwkJaWYgKCEoVmFsdWUzMiAmIE1JX0NPTV9CVVNZKSkgeworCQkJTU1fV2FpdCAoNSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlKTsKKwkJTU1fV2FpdCAoNDApOworCX0KK30JCQkJLyogTE1fV3JpdGVQaHkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMgTE1fU2V0UG93ZXJTdGF0ZSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9QT1dFUl9TVEFURSBQb3dlckxldmVsKQoreworCUxNX1VJTlQzMiBQbWVTdXBwb3J0OworCUxNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1VJTlQzMiBQbUN0cmw7CisKKwkvKiBtYWtlIHN1cmVpbmRpcmVjdCBhY2Nlc3NlcyBhcmUgZW5hYmxlZCAqLworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NSVNDX0hPU1RfQ1RSTF9SRUcsCisJCQkgIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCk7CisKKwkvKiBDbGVhciB0aGUgUE1FX0FTU0VSVCBiaXQgYW5kIHRoZSBwb3dlciBzdGF0ZSBiaXRzLiAgQWxzbyBlbmFibGUgKi8KKwkvKiB0aGUgUE1FIGJpdC4gKi8KKwlNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsICZQbUN0cmwpOworCisJUG1DdHJsIHw9IFQzX1BNX1BNRV9BU1NFUlRFRDsKKwlQbUN0cmwgJj0gflQzX1BNX1BPV0VSX1NUQVRFX01BU0s7CisKKwkvKiBTZXQgdGhlIGFwcHJvcHJpYXRlIHBvd2VyIHN0YXRlLiAqLworCWlmIChQb3dlckxldmVsID09IExNX1BPV0VSX1NUQVRFX0QwKSB7CisKKwkJLyogQnJpbmcgdGhlIGNhcmQgb3V0IG9mIGxvdyBwb3dlciBtb2RlLiAqLworCQlQbUN0cmwgfD0gVDNfUE1fUE9XRVJfU1RBVEVfRDA7CisJCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsIFBtQ3RybCk7CisKKwkJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwpOworCQlNTV9XYWl0ICg0MCk7CisjaWYgMAkJCQkvKiBCdWdmaXggYnkgam1iLi4uY2FuJ3QgY2FsbCBXcml0ZVBoeSBoZXJlIGJlY2F1c2UgcERldmljZSBub3QgZnVsbHkgaW5pdGlhbGl6ZWQgKi8KKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsIDB4MDIpOworI2VuZGlmCisKKwkJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSBpZiAoUG93ZXJMZXZlbCA9PSBMTV9QT1dFUl9TVEFURV9EMSkgeworCQlQbUN0cmwgfD0gVDNfUE1fUE9XRVJfU1RBVEVfRDE7CisJfSBlbHNlIGlmIChQb3dlckxldmVsID09IExNX1BPV0VSX1NUQVRFX0QyKSB7CisJCVBtQ3RybCB8PSBUM19QTV9QT1dFUl9TVEFURV9EMjsKKwl9IGVsc2UgaWYgKFBvd2VyTGV2ZWwgPT0gTE1fUE9XRVJfU1RBVEVfRDMpIHsKKwkJUG1DdHJsIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QzOworCX0gZWxzZSB7CisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwl9CisJUG1DdHJsIHw9IFQzX1BNX1BNRV9FTkFCTEU7CisKKwkvKiBNYXNrIG91dCBhbGwgaW50ZXJydXB0cyBzbyBMTV9TZXR1cFBoeSB3b24ndCBiZSBjYWxsZWQgd2hpbGUgd2UgYXJlICovCisJLyogc2V0dGluZyBuZXcgbGluZSBzcGVlZC4gKi8KKwlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsKTsKKwlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5NaXNjSG9zdEN0cmwsCisJCVZhbHVlMzIgfCBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpOworCisJaWYgKCFwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXApIHsKKwkJcERldmljZS0+UmVzdG9yZU9uV2FrZVVwID0gVFJVRTsKKwkJcERldmljZS0+V2FrZVVwRGlzYWJsZUF1dG9OZWcgPSBwRGV2aWNlLT5EaXNhYmxlQXV0b05lZzsKKwkJcERldmljZS0+V2FrZVVwUmVxdWVzdGVkTWVkaWFUeXBlID0gcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlOworCX0KKworCS8qIEZvcmNlIGF1dG8tbmVnb3RpYXRpb24gdG8gMTAgbGluZSBzcGVlZC4gKi8KKwlwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOworCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xME1CUFM7CisJTE1fU2V0dXBQaHkgKHBEZXZpY2UpOworCisJLyogUHV0IHRoZSBkcml2ZXIgaW4gdGhlIGluaXRpYWwgc3RhdGUsIGFuZCBnbyB0aHJvdWdoIHRoZSBwb3dlciBkb3duICovCisJLyogc2VxdWVuY2UuICovCisJTE1fSGFsdCAocERldmljZSk7CisKKwlNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9QTV9DQVBfUkVHLCAmUG1lU3VwcG9ydCk7CisKKwlpZiAocERldmljZS0+V2FrZVVwTW9kZUNhcCAhPSBMTV9XQUtFX1VQX01PREVfTk9ORSkgeworCisJCS8qIEVuYWJsZSBXT0wuICovCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDVhKTsKKwkJTU1fV2FpdCAoNDApOworCisJCS8qIFNldCBMRUQgbW9kZS4gKi8KKwkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKwkJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOworCQl9IGVsc2UgeworCQkJaWYgKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfT1VUUFVUKSB7CisJCQkJVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzI7CisJCQl9IGVsc2UgeworCQkJCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOworCQkJfQorCQl9CisKKwkJVmFsdWUzMiA9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCQlpZiAocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9MSU5LMTAgfHwKKwkJCSAgICBwRGV2aWNlLT5Xb2xTcGVlZCA9PSBXT0xfU1BFRURfMTBNQikgeworCQkJCVZhbHVlMzIgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVZhbHVlMzIgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwkJfQorCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgVmFsdWUzMik7CisJCU1NX1dhaXQgKDQwKTsKKwkJTU1fV2FpdCAoNDApOworCQlNTV9XYWl0ICg0MCk7CisKKwkJLyogQWx3YXlzIGVuYWJsZSBtYWdpYyBwYWNrZXQgd2FrZS11cCBpZiB3ZSBoYXZlIHZhdXguICovCisJCWlmICgoUG1lU3VwcG9ydCAmIFQzX1BDSV9QTV9DQVBfUE1FX0QzQ09MRCkgJiYKKwkJICAgIChwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwICYgTE1fV0FLRV9VUF9NT0RFX01BR0lDX1BBQ0tFVCkpIHsKKwkJCVZhbHVlMzIgfD0gTUFDX01PREVfREVURUNUX01BR0lDX1BBQ0tFVF9FTkFCTEU7CisJCX0KKworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgVmFsdWUzMik7CisKKwkJLyogRW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgUlhfTU9ERV9FTkFCTEUpOworCX0KKworCS8qIERpc2FibGUgdHgvcnggY2xvY2tzLCBhbmQgc2VsZXRlY3QgYW4gYWx0ZXJuYXRlIGNsb2NrLiAqLworCWlmIChwRGV2aWNlLT5Xb2xTcGVlZCA9PSBXT0xfU1BFRURfMTAwTUIpIHsKKwkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKwkJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJCVZhbHVlMzIgPQorCQkJICAgIFQzX1BDSV9ESVNBQkxFX1JYX0NMT0NLIHwgVDNfUENJX0RJU0FCTEVfVFhfQ0xPQ0sgfAorCQkJICAgIFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLOworCQl9IGVsc2UgeworCQkJVmFsdWUzMiA9IFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLOworCQl9CisJCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVmFsdWUzMik7CisKKwkJTU1fV2FpdCAoNDApOworCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCQlWYWx1ZTMyID0KKwkJCSAgICBUM19QQ0lfRElTQUJMRV9SWF9DTE9DSyB8IFQzX1BDSV9ESVNBQkxFX1RYX0NMT0NLIHwKKwkJCSAgICBUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyB8CisJCQkgICAgVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0s7CisJCX0gZWxzZSB7CisJCQlWYWx1ZTMyID0gVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAorCQkJICAgIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLOworCQl9CisKKwkJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyKTsKKworCQlNTV9XYWl0ICg0MCk7CisKKwkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKwkJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJCVZhbHVlMzIgPQorCQkJICAgIFQzX1BDSV9ESVNBQkxFX1JYX0NMT0NLIHwgVDNfUENJX0RJU0FCTEVfVFhfQ0xPQ0sgfAorCQkJICAgIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLOworCQl9IGVsc2UgeworCQkJVmFsdWUzMiA9IFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLOworCQl9CisKKwkJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyKTsKKwl9IGVsc2UgeworCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorCQkgICAgVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQkJVmFsdWUzMiA9CisJCQkgICAgVDNfUENJX0RJU0FCTEVfUlhfQ0xPQ0sgfCBUM19QQ0lfRElTQUJMRV9UWF9DTE9DSyB8CisJCQkgICAgVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAorCQkJICAgIFQzX1BDSV9QT1dFUl9ET1dOX1BDSV9QTEwxMzM7CisJCX0gZWxzZSB7CisJCQlWYWx1ZTMyID0gVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAorCQkJICAgIFQzX1BDSV9QT1dFUl9ET1dOX1BDSV9QTEwxMzM7CisJCX0KKworCQlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFZhbHVlMzIpOworCX0KKworCU1NX1dhaXQgKDQwKTsKKworCWlmICghcERldmljZS0+RWVwcm9tV3AKKwkgICAgJiYgKHBEZXZpY2UtPldha2VVcE1vZGVDYXAgIT0gTE1fV0FLRV9VUF9NT0RFX05PTkUpKSB7CisJCS8qIFN3aXRjaCBhZGFwdGVyIHRvIGF1eGlsbGlhcnkgcG93ZXIuICovCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCQkvKiBHUElPMCA9IDEsIEdQSU8xID0gMSwgR1BJTzIgPSAwLiAqLworCQkJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSk7CisJCQlNTV9XYWl0ICg0MCk7CisJCX0gZWxzZSB7CisJCQkvKiBHUElPMCA9IDAsIEdQSU8xID0gMSwgR1BJTzIgPSAxLiAqLworCQkJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMik7CisJCQlNTV9XYWl0ICg0MCk7CisKKwkJCS8qIEdQSU8wID0gMSwgR1BJTzEgPSAxLCBHUElPMiA9IDEuICovCisJCQlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMCB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMSB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMiB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDAgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMik7CisJCQlNTV9XYWl0ICg0MCk7CisKKwkJCS8qIEdQSU8wID0gMSwgR1BJTzEgPSAxLCBHUElPMiA9IDAuICovCisJCQlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMCB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMSB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMiB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDAgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxKTsKKwkJCU1NX1dhaXQgKDQwKTsKKwkJfQorCX0KKworCS8qIFNldCB0aGUgcGh5IHRvIGxvdyBwb3dlciBtb2RlLiAqLworCS8qIFB1dCB0aGUgdGhlIGhhcmR3YXJlIGluIGxvdyBwb3dlciBtb2RlLiAqLworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsIFBtQ3RybCk7CisKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX1NldFBvd2VyU3RhdGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTE1fVUlOVDMyIEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKworCVZhbHVlMzIgPSAwOworCisJLyogQXV0byBuZWdvdGlhdGlvbiBmbG93IGNvbnRyb2wgb25seSB3aGVuIGF1dG9uZWdvdGlhdGlvbiBpcyBlbmFibGVkLiAqLworCWlmIChwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9PSBGQUxTRSB8fAorCSAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTyB8fAorCSAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE8pIHsKKwkJLyogUGxlYXNlIHJlZmVyIHRvIFRhYmxlIDI4Qi0zIG9mIHRoZSA4MDIuM2FiLTE5OTkgc3BlYy4gKi8KKwkJaWYgKChwRGV2aWNlLT5GbG93Q29udHJvbENhcCA9PSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRSkgfHwKKwkJICAgICgocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkKKwkJICAgICAmJiAocERldmljZS0+CisJCQkgRmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpKSkgeworCQkJVmFsdWUzMiB8PSBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRTsKKwkJfSBlbHNlIGlmIChwRGV2aWNlLT4KKwkJCSAgIEZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFKSB7CisJCQlWYWx1ZTMyIHw9IFBIWV9BTl9BRF9BU1lNX1BBVVNFOworCQl9IGVsc2UgaWYgKHBEZXZpY2UtPgorCQkJICAgRmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkgeworCQkJVmFsdWUzMiB8PQorCQkJICAgIFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFIHwgUEhZX0FOX0FEX0FTWU1fUEFVU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gVmFsdWUzMjsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NjMyLDE5NSArNTE3NywxNjkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIExNX1NUQVRVUwotTE1fRm9yY2VBdXRvTmVnQmNtNTQweFBoeSgKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLUxNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSkKK0xNX0ZvcmNlQXV0b05lZ0JjbTU0MHhQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJCSAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSkKIHsKLSAgICBMTV9NRURJQV9UWVBFIE1lZGlhVHlwZTsKLSAgICBMTV9MSU5FX1NQRUVEIExpbmVTcGVlZDsKLSAgICBMTV9EVVBMRVhfTU9ERSBEdXBsZXhNb2RlOwotICAgIExNX1VJTlQzMiBOZXdQaHlDdHJsOwotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1VJTlQzMiBDbnQ7CisJTE1fTUVESUFfVFlQRSBNZWRpYVR5cGU7CisJTE1fTElORV9TUEVFRCBMaW5lU3BlZWQ7CisJTE1fRFVQTEVYX01PREUgRHVwbGV4TW9kZTsKKwlMTV9VSU5UMzIgTmV3UGh5Q3RybDsKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9VSU5UMzIgQ250OwogCi0gICAgLyogR2V0IHRoZSBpbnRlcmZhY2UgdHlwZSwgbGluZSBzcGVlZCwgYW5kIGR1cGxleCBtb2RlLiAqLwotICAgIExNX1RyYW5zbGF0ZVJlcXVlc3RlZE1lZGlhVHlwZShSZXF1ZXN0ZWRNZWRpYVR5cGUsICZNZWRpYVR5cGUsICZMaW5lU3BlZWQsCi0JJkR1cGxleE1vZGUpOworCS8qIEdldCB0aGUgaW50ZXJmYWNlIHR5cGUsIGxpbmUgc3BlZWQsIGFuZCBkdXBsZXggbW9kZS4gKi8KKwlMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUgKFJlcXVlc3RlZE1lZGlhVHlwZSwgJk1lZGlhVHlwZSwKKwkJCQkJJkxpbmVTcGVlZCwgJkR1cGxleE1vZGUpOwogCi0gICAgaWYgKHBEZXZpY2UtPlJlc3RvcmVPbldha2VVcCkKLSAgICB7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIDApOwotCXBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IDA7Ci0JVmFsdWUzMiA9IFBIWV9BTl9BRF8xMEJBU0VUX0ZVTEwgfCBQSFlfQU5fQURfMTBCQVNFVF9IQUxGOwotCWlmIChwRGV2aWNlLT5Xb2xTcGVlZCA9PSBXT0xfU1BFRURfMTAwTUIpCi0JewotCSAgICBWYWx1ZTMyIHw9IFBIWV9BTl9BRF8xMDBCQVNFVFhfRlVMTCB8IFBIWV9BTl9BRF8xMDBCQVNFVFhfSEFMRjsKKwlpZiAocERldmljZS0+UmVzdG9yZU9uV2FrZVVwKSB7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgMCk7CisJCXBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IDA7CisJCVZhbHVlMzIgPSBQSFlfQU5fQURfMTBCQVNFVF9GVUxMIHwgUEhZX0FOX0FEXzEwQkFTRVRfSEFMRjsKKwkJaWYgKHBEZXZpY2UtPldvbFNwZWVkID09IFdPTF9TUEVFRF8xMDBNQikgeworCQkJVmFsdWUzMiB8PQorCQkJICAgIFBIWV9BTl9BRF8xMDBCQVNFVFhfRlVMTCB8IFBIWV9BTl9BRF8xMDBCQVNFVFhfSEFMRjsKKwkJfQorCQlWYWx1ZTMyIHw9IFBIWV9BTl9BRF9QUk9UT0NPTF84MDJfM19DU01BX0NEOworCQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKHBEZXZpY2UpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7CisJCXBEZXZpY2UtPmFkdmVydGlzaW5nID0gVmFsdWUzMjsKIAl9Ci0JVmFsdWUzMiB8PSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRDsKLQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7Ci0JcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOwotICAgIH0KLSAgICAvKiBTZXR1cCB0aGUgYXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLiAqLwotICAgIGVsc2UgaWYoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfVU5LTk9XTikKLSAgICB7Ci0JLyogU2V0dXAgdGhlIDEwLzEwMCBNYnBzIGF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCByZWdpc3Rlci4gKi8KLQlWYWx1ZTMyID0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0QgfAotCSAgICBQSFlfQU5fQURfMTBCQVNFVF9IQUxGIHwgUEhZX0FOX0FEXzEwQkFTRVRfRlVMTCB8Ci0JICAgIFBIWV9BTl9BRF8xMDBCQVNFVFhfRlVMTCB8IFBIWV9BTl9BRF8xMDBCQVNFVFhfSEFMRjsKLQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7CisJLyogU2V0dXAgdGhlIGF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCByZWdpc3Rlci4gKi8KKwllbHNlIGlmIChMaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF9VTktOT1dOKSB7CisJCS8qIFNldHVwIHRoZSAxMC8xMDAgTWJwcyBhdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIuICovCisJCVZhbHVlMzIgPSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRCB8CisJCSAgICBQSFlfQU5fQURfMTBCQVNFVF9IQUxGIHwgUEhZX0FOX0FEXzEwQkFTRVRfRlVMTCB8CisJCSAgICBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEwgfCBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7CisJCVZhbHVlMzIgfD0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyAocERldmljZSk7CiAKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKLQlwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKKwkJcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOwogCi0JLyogQWR2ZXJ0aXNlIDEwMDBNYnBzICovCi0JVmFsdWUzMiA9IEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0hBTEYgfCBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9GVUxMOworCQkvKiBBZHZlcnRpc2UgMTAwME1icHMgKi8KKwkJVmFsdWUzMiA9CisJCSAgICBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9IQUxGIHwgQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTDsKIAogI2lmIElOQ0xVREVfNTcwMV9BWF9GSVgKLQkvKiBCdWc6IHdvcmthcm91bmQgZm9yIENSQyBlcnJvciBpbiBnaWdhYml0IG1vZGUgd2hlbiB3ZSBhcmUgaW4gKi8KLQkvKiBzbGF2ZSBtb2RlLiAgVGhpcyB3aWxsIGZvcmNlIHRoZSBQSFkgdG8gb3BlcmF0ZSBpbiAqLwotCS8qIG1hc3RlciBtb2RlLiAqLwotCWlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKLQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkKLQl7Ci0JICAgIFZhbHVlMzIgfD0gQkNNNTQwWF9DT05GSUdfQVNfTUFTVEVSIHwKLQkJQkNNNTQwWF9FTkFCTEVfQ09ORklHX0FTX01BU1RFUjsKLQl9CisJCS8qIEJ1Zzogd29ya2Fyb3VuZCBmb3IgQ1JDIGVycm9yIGluIGdpZ2FiaXQgbW9kZSB3aGVuIHdlIGFyZSBpbiAqLworCQkvKiBzbGF2ZSBtb2RlLiAgVGhpcyB3aWxsIGZvcmNlIHRoZSBQSFkgdG8gb3BlcmF0ZSBpbiAqLworCQkvKiBtYXN0ZXIgbW9kZS4gKi8KKwkJaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKKwkJICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjApIHsKKwkJCVZhbHVlMzIgfD0gQkNNNTQwWF9DT05GSUdfQVNfTUFTVEVSIHwKKwkJCSAgICBCQ001NDBYX0VOQUJMRV9DT05GSUdfQVNfTUFTVEVSOworCQl9CiAjZW5kaWYKIAotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfMTAwMEJBU0VUX0NUUkxfUkVHLCBWYWx1ZTMyKTsKLQlwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWlmKExpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKQotCXsKLQkgICAgVmFsdWUzMiA9IFBIWV9BTl9BRF9QUk9UT0NPTF84MDJfM19DU01BX0NEOwotCSAgICBWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgVmFsdWUzMik7CisJCXBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IFZhbHVlMzI7CisJfSBlbHNlIHsKKwkJaWYgKExpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKSB7CisJCQlWYWx1ZTMyID0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0Q7CisJCQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKHBEZXZpY2UpOwogCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOwotCSAgICBwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7CisJCQlwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CiAKLQkgICAgaWYoRHVwbGV4TW9kZSAhPSBMTV9EVVBMRVhfTU9ERV9GVUxMKQotCSAgICB7Ci0JCVZhbHVlMzIgPSBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9IQUxGOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlWYWx1ZTMyID0gQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTDsKLQkgICAgfQorCQkJaWYgKER1cGxleE1vZGUgIT0gTE1fRFVQTEVYX01PREVfRlVMTCkgeworCQkJCVZhbHVlMzIgPSBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9IQUxGOworCQkJfSBlbHNlIHsKKwkJCQlWYWx1ZTMyID0gQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTDsKKwkJCX0KIAotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgVmFsdWUzMik7Ci0JICAgIHBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IFZhbHVlMzI7Ci0JfQotCWVsc2UgaWYoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwTUJQUykKLQl7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfMTAwMEJBU0VUX0NUUkxfUkVHLCAwKTsKLQkgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gMDsKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywKKwkJCQkgICAgIFZhbHVlMzIpOworCQkJcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gVmFsdWUzMjsKKwkJfSBlbHNlIGlmIChMaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDBNQlBTKSB7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIDApOworCQkJcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gMDsKIAotCSAgICBpZihEdXBsZXhNb2RlICE9IExNX0RVUExFWF9NT0RFX0ZVTEwpCi0JICAgIHsKLQkJVmFsdWUzMiA9IFBIWV9BTl9BRF8xMDBCQVNFVFhfSEFMRjsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJVmFsdWUzMiA9IFBIWV9BTl9BRF8xMDBCQVNFVFhfRlVMTDsKLQkgICAgfQorCQkJaWYgKER1cGxleE1vZGUgIT0gTE1fRFVQTEVYX01PREVfRlVMTCkgeworCQkJCVZhbHVlMzIgPSBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7CisJCQl9IGVsc2UgeworCQkJCVZhbHVlMzIgPSBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEw7CisJCQl9CiAKLQkgICAgVmFsdWUzMiB8PSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRDsKLQkgICAgVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKHBEZXZpY2UpOworCQkJVmFsdWUzMiB8PSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRDsKKwkJCVZhbHVlMzIgfD0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyAocERldmljZSk7CiAKLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7Ci0JICAgIHBEZXZpY2UtPmFkdmVydGlzaW5nID0gVmFsdWUzMjsKLQl9Ci0JZWxzZSBpZihMaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xME1CUFMpCi0JewotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgMCk7Ci0JICAgIHBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IDA7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7CisJCQlwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CisJCX0gZWxzZSBpZiAoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTBNQlBTKSB7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIDApOworCQkJcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gMDsKIAotCSAgICBpZihEdXBsZXhNb2RlICE9IExNX0RVUExFWF9NT0RFX0ZVTEwpCi0JICAgIHsKLQkJVmFsdWUzMiA9IFBIWV9BTl9BRF8xMEJBU0VUX0hBTEY7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCVZhbHVlMzIgPSBQSFlfQU5fQURfMTBCQVNFVF9GVUxMOwotCSAgICB9CisJCQlpZiAoRHVwbGV4TW9kZSAhPSBMTV9EVVBMRVhfTU9ERV9GVUxMKSB7CisJCQkJVmFsdWUzMiA9IFBIWV9BTl9BRF8xMEJBU0VUX0hBTEY7CisJCQl9IGVsc2UgeworCQkJCVZhbHVlMzIgPSBQSFlfQU5fQURfMTBCQVNFVF9GVUxMOworCQkJfQogCi0JICAgIFZhbHVlMzIgfD0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0Q7Ci0JICAgIFZhbHVlMzIgfD0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhwRGV2aWNlKTsKKwkJCVZhbHVlMzIgfD0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0Q7CisJCQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKHBEZXZpY2UpOwogCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOwotCSAgICBwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7Ci0JfQotICAgIH0KLQotICAgIC8qIEZvcmNlIGxpbmUgc3BlZWQgaWYgYXV0by1uZWdvdGlhdGlvbiBpcyBkaXNhYmxlZC4gKi8KLSAgICBpZihwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyAmJiBMaW5lU3BlZWQgIT0gTE1fTElORV9TUEVFRF9VTktOT1dOKQotICAgIHsKLQkvKiBUaGlzIGNvZGUgcGF0aCBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlcmUgaXMgbGluay4gKi8KLQlwRGV2aWNlLT5NZWRpYVR5cGUgPSBNZWRpYVR5cGU7Ci0JcERldmljZS0+TGluZVNwZWVkID0gTGluZVNwZWVkOwotCXBEZXZpY2UtPkR1cGxleE1vZGUgPSBEdXBsZXhNb2RlOwotCi0JLyogRm9yY2UgbGluZSBzZWVwZC4gKi8KLQlOZXdQaHlDdHJsID0gMDsKLQlzd2l0Y2goTGluZVNwZWVkKQotCXsKLQkgICAgY2FzZSBMTV9MSU5FX1NQRUVEXzEwTUJQUzoKLQkJTmV3UGh5Q3RybCB8PSBQSFlfQ1RSTF9TUEVFRF9TRUxFQ1RfMTBNQlBTOwotCQlicmVhazsKLQkgICAgY2FzZSBMTV9MSU5FX1NQRUVEXzEwME1CUFM6Ci0JCU5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfU1BFRURfU0VMRUNUXzEwME1CUFM7Ci0JCWJyZWFrOwotCSAgICBjYXNlIExNX0xJTkVfU1BFRURfMTAwME1CUFM6Ci0JCU5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfU1BFRURfU0VMRUNUXzEwMDBNQlBTOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJTmV3UGh5Q3RybCB8PSBQSFlfQ1RSTF9TUEVFRF9TRUxFQ1RfMTAwME1CUFM7Ci0JCWJyZWFrOwotCX0KLQotCWlmKER1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfRlVMTCkKLQl7Ci0JICAgIE5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfRlVMTF9EVVBMRVhfTU9ERTsKLQl9Ci0KLQkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgUEhZX0NUUkwgaXMgYWxyZWFkeSB3aGF0IHdlIHdhbnRlZC4gKi8KLQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOwotCWlmKFZhbHVlMzIgIT0gTmV3UGh5Q3RybCkKLQl7Ci0JICAgIC8qIFRlbXBvcmFyeSBicmluZyB0aGUgbGluayBkb3duIGJlZm9yZSBmb3JjaW5nIGxpbmUgc3BlZWQuICovCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgUEhZX0NUUkxfTE9PUEJBQ0tfTU9ERSk7Ci0KLQkgICAgLyogV2FpdCBmb3IgbGluayB0byBnbyBkb3duLiAqLwotCSAgICBmb3IoQ250ID0gMDsgQ250IDwgMTUwMDA7IENudCsrKQotCSAgICB7Ci0JCU1NX1dhaXQoMTApOwotCi0JCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQkJTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOwotCi0JCWlmKCEoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKSkKLQkJewotCQkgICAgTU1fV2FpdCg0MCk7Ci0JCSAgICBicmVhazsKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKKwkJCXBEZXZpY2UtPmFkdmVydGlzaW5nID0gVmFsdWUzMjsKIAkJfQotCSAgICB9Ci0KLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCBOZXdQaHlDdHJsKTsKLQkgICAgTU1fV2FpdCg0MCk7CiAJfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgUEhZX0NUUkxfQVVUT19ORUdfRU5BQkxFIHwKLQkgICAgUEhZX0NUUkxfUkVTVEFSVF9BVVRPX05FRyk7Ci0gICAgfQogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9Gb3JjZUF1dG9OZWdCY201NDB4UGh5ICovCisJLyogRm9yY2UgbGluZSBzcGVlZCBpZiBhdXRvLW5lZ290aWF0aW9uIGlzIGRpc2FibGVkLiAqLworCWlmIChwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyAmJiBMaW5lU3BlZWQgIT0gTE1fTElORV9TUEVFRF9VTktOT1dOKSB7CisJCS8qIFRoaXMgY29kZSBwYXRoIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBsaW5rLiAqLworCQlwRGV2aWNlLT5NZWRpYVR5cGUgPSBNZWRpYVR5cGU7CisJCXBEZXZpY2UtPkxpbmVTcGVlZCA9IExpbmVTcGVlZDsKKwkJcERldmljZS0+RHVwbGV4TW9kZSA9IER1cGxleE1vZGU7CiAKKwkJLyogRm9yY2UgbGluZSBzZWVwZC4gKi8KKwkJTmV3UGh5Q3RybCA9IDA7CisJCXN3aXRjaCAoTGluZVNwZWVkKSB7CisJCWNhc2UgTE1fTElORV9TUEVFRF8xME1CUFM6CisJCQlOZXdQaHlDdHJsIHw9IFBIWV9DVFJMX1NQRUVEX1NFTEVDVF8xME1CUFM7CisJCQlicmVhazsKKwkJY2FzZSBMTV9MSU5FX1NQRUVEXzEwME1CUFM6CisJCQlOZXdQaHlDdHJsIHw9IFBIWV9DVFJMX1NQRUVEX1NFTEVDVF8xMDBNQlBTOworCQkJYnJlYWs7CisJCWNhc2UgTE1fTElORV9TUEVFRF8xMDAwTUJQUzoKKwkJCU5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfU1BFRURfU0VMRUNUXzEwMDBNQlBTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlOZXdQaHlDdHJsIHw9IFBIWV9DVFJMX1NQRUVEX1NFTEVDVF8xMDAwTUJQUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKER1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfRlVMTCkgeworCQkJTmV3UGh5Q3RybCB8PSBQSFlfQ1RSTF9GVUxMX0RVUExFWF9NT0RFOworCQl9CisKKwkJLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIFBIWV9DVFJMIGlzIGFscmVhZHkgd2hhdCB3ZSB3YW50ZWQuICovCisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOworCQlpZiAoVmFsdWUzMiAhPSBOZXdQaHlDdHJsKSB7CisJCQkvKiBUZW1wb3JhcnkgYnJpbmcgdGhlIGxpbmsgZG93biBiZWZvcmUgZm9yY2luZyBsaW5lIHNwZWVkLiAqLworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIFBIWV9DVFJMX1JFRywKKwkJCQkgICAgIFBIWV9DVFJMX0xPT1BCQUNLX01PREUpOworCisJCQkvKiBXYWl0IGZvciBsaW5rIHRvIGdvIGRvd24uICovCisJCQlmb3IgKENudCA9IDA7IENudCA8IDE1MDAwOyBDbnQrKykgeworCQkJCU1NX1dhaXQgKDEwKTsKKworCQkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJCQkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKworCQkJCWlmICghKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykpIHsKKwkJCQkJTU1fV2FpdCAoNDApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsIE5ld1BoeUN0cmwpOworCQkJTU1fV2FpdCAoNDApOworCQl9CisJfSBlbHNlIHsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgUEhZX0NUUkxfQVVUT19ORUdfRU5BQkxFIHwKKwkJCSAgICAgUEhZX0NUUkxfUkVTVEFSVF9BVVRPX05FRyk7CisJfQorCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9Gb3JjZUF1dG9OZWdCY201NDB4UGh5ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTgyOCwyMTggKzUzNDcsMTk5IEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBMTV9TVEFUVVMKLUxNX0ZvcmNlQXV0b05lZygKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLUxNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSkKK0xNX0ZvcmNlQXV0b05lZyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlKQogewotICAgIExNX1NUQVRVUyBMbVN0YXR1czsKKwlMTV9TVEFUVVMgTG1TdGF0dXM7CiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSBwaHkgY2hpcC4gKi8KLSAgICBzd2l0Y2gocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykKLSAgICB7CisJLyogSW5pdGlhbGl6ZSB0aGUgcGh5IGNoaXAuICovCisJc3dpdGNoIChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSB7CiAJY2FzZSBQSFlfQkNNNTQwMF9QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTQwMV9QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTQxMV9QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTcwMV9QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTcwM19QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTcwNF9QSFlfSUQ6Ci0JICAgIExtU3RhdHVzID0gTE1fRm9yY2VBdXRvTmVnQmNtNTQweFBoeShwRGV2aWNlLCBSZXF1ZXN0ZWRNZWRpYVR5cGUpOwotCSAgICBicmVhazsKKwkJTG1TdGF0dXMgPQorCQkgICAgTE1fRm9yY2VBdXRvTmVnQmNtNTQweFBoeSAocERldmljZSwgUmVxdWVzdGVkTWVkaWFUeXBlKTsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCSAgICBMbVN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOwotCSAgICBicmVhazsKLSAgICB9CisJCUxtU3RhdHVzID0gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCWJyZWFrOworCX0KIAotICAgIHJldHVybiBMbVN0YXR1czsKLX0gLyogTE1fRm9yY2VBdXRvTmVnICovCisJcmV0dXJuIExtU3RhdHVzOworfQkJCQkvKiBMTV9Gb3JjZUF1dG9OZWcgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMgTE1fTG9hZEZpcm13YXJlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLQkJCSAgUFQzX0ZXSU1HX0lORk8gcEZ3SW1nLAotCQkJICBMTV9VSU5UMzIgTG9hZENwdSwKLQkJCSAgTE1fVUlOVDMyIFN0YXJ0Q3B1KQorTE1fU1RBVFVTIExNX0xvYWRGaXJtd2FyZSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkJICAgUFQzX0ZXSU1HX0lORk8gcEZ3SW1nLAorCQkJICAgTE1fVUlOVDMyIExvYWRDcHUsIExNX1VJTlQzMiBTdGFydENwdSkKIHsKLSAgICBMTV9VSU5UMzIgaTsKLSAgICBMTV9VSU5UMzIgYWRkcmVzczsKKwlMTV9VSU5UMzIgaTsKKwlMTV9VSU5UMzIgYWRkcmVzczsKIAotICAgIGlmIChMb2FkQ3B1ICYgVDNfUlhfQ1BVX0lEKQotICAgIHsKLQlpZiAoTE1fSGFsdENwdShwRGV2aWNlLFQzX1JYX0NQVV9JRCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0JewotCSAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJaWYgKExvYWRDcHUgJiBUM19SWF9DUFVfSUQpIHsKKwkJaWYgKExNX0hhbHRDcHUgKHBEZXZpY2UsIFQzX1JYX0NQVV9JRCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwkJfQorCisJCS8qIEZpcnN0IG9mIGFsbCBjbGVhciBzY3JhY2ggcGFkIG1lbW9yeSAqLworCQlmb3IgKGkgPSAwOyBpIDwgVDNfUlhfQ1BVX1NQQURfU0laRTsgaSArPSA0KSB7CisJCQlMTV9SZWdXckluZCAocERldmljZSwgVDNfUlhfQ1BVX1NQQURfQUREUiArIGksIDApOworCQl9CisKKwkJLyogQ29weSBjb2RlIGZpcnN0ICovCisJCWFkZHJlc3MgPSBUM19SWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+VGV4dC5PZmZzZXQgJiAweGZmZmYpOworCQlmb3IgKGkgPSAwOyBpIDw9IHBGd0ltZy0+VGV4dC5MZW5ndGg7IGkgKz0gNCkgeworCQkJTE1fUmVnV3JJbmQgKHBEZXZpY2UsIGFkZHJlc3MgKyBpLAorCQkJCSAgICAgKChMTV9VSU5UMzIgKikgcEZ3SW1nLT5UZXh0LkJ1ZmZlcilbaSAvCisJCQkJCQkJCQkgNF0pOworCQl9CisKKwkJYWRkcmVzcyA9CisJCSAgICBUM19SWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+Uk9ubHlEYXRhLk9mZnNldCAmIDB4ZmZmZik7CisJCWZvciAoaSA9IDA7IGkgPD0gcEZ3SW1nLT5ST25seURhdGEuTGVuZ3RoOyBpICs9IDQpIHsKKwkJCUxNX1JlZ1dySW5kIChwRGV2aWNlLCBhZGRyZXNzICsgaSwKKwkJCQkgICAgICgoTE1fVUlOVDMyICopIHBGd0ltZy0+Uk9ubHlEYXRhLgorCQkJCSAgICAgIEJ1ZmZlcilbaSAvIDRdKTsKKwkJfQorCisJCWFkZHJlc3MgPSBUM19SWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+RGF0YS5PZmZzZXQgJiAweGZmZmYpOworCQlmb3IgKGkgPSAwOyBpIDw9IHBGd0ltZy0+RGF0YS5MZW5ndGg7IGkgKz0gNCkgeworCQkJTE1fUmVnV3JJbmQgKHBEZXZpY2UsIGFkZHJlc3MgKyBpLAorCQkJCSAgICAgKChMTV9VSU5UMzIgKikgcEZ3SW1nLT5EYXRhLkJ1ZmZlcilbaSAvCisJCQkJCQkJCQkgNF0pOworCQl9CiAJfQogCi0JLyogRmlyc3Qgb2YgYWxsIGNsZWFyIHNjcmFjaCBwYWQgbWVtb3J5ICovCi0JZm9yIChpID0gMDsgaSA8IFQzX1JYX0NQVV9TUEFEX1NJWkU7IGkrPTQpCi0JewotCSAgICBMTV9SZWdXckluZChwRGV2aWNlLFQzX1JYX0NQVV9TUEFEX0FERFIraSwwKTsKKwlpZiAoTG9hZENwdSAmIFQzX1RYX0NQVV9JRCkgeworCQlpZiAoTE1fSGFsdENwdSAocERldmljZSwgVDNfVFhfQ1BVX0lEKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCQl9CisKKwkJLyogRmlyc3Qgb2YgYWxsIGNsZWFyIHNjcmFjaCBwYWQgbWVtb3J5ICovCisJCWZvciAoaSA9IDA7IGkgPCBUM19UWF9DUFVfU1BBRF9TSVpFOyBpICs9IDQpIHsKKwkJCUxNX1JlZ1dySW5kIChwRGV2aWNlLCBUM19UWF9DUFVfU1BBRF9BRERSICsgaSwgMCk7CisJCX0KKworCQkvKiBDb3B5IGNvZGUgZmlyc3QgKi8KKwkJYWRkcmVzcyA9IFQzX1RYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5UZXh0Lk9mZnNldCAmIDB4ZmZmZik7CisJCWZvciAoaSA9IDA7IGkgPD0gcEZ3SW1nLT5UZXh0Lkxlbmd0aDsgaSArPSA0KSB7CisJCQlMTV9SZWdXckluZCAocERldmljZSwgYWRkcmVzcyArIGksCisJCQkJICAgICAoKExNX1VJTlQzMiAqKSBwRndJbWctPlRleHQuQnVmZmVyKVtpIC8KKwkJCQkJCQkJCSA0XSk7CisJCX0KKworCQlhZGRyZXNzID0KKwkJICAgIFQzX1RYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5ST25seURhdGEuT2Zmc2V0ICYgMHhmZmZmKTsKKwkJZm9yIChpID0gMDsgaSA8PSBwRndJbWctPlJPbmx5RGF0YS5MZW5ndGg7IGkgKz0gNCkgeworCQkJTE1fUmVnV3JJbmQgKHBEZXZpY2UsIGFkZHJlc3MgKyBpLAorCQkJCSAgICAgKChMTV9VSU5UMzIgKikgcEZ3SW1nLT5ST25seURhdGEuCisJCQkJICAgICAgQnVmZmVyKVtpIC8gNF0pOworCQl9CisKKwkJYWRkcmVzcyA9IFQzX1RYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5EYXRhLk9mZnNldCAmIDB4ZmZmZik7CisJCWZvciAoaSA9IDA7IGkgPD0gcEZ3SW1nLT5EYXRhLkxlbmd0aDsgaSArPSA0KSB7CisJCQlMTV9SZWdXckluZCAocERldmljZSwgYWRkcmVzcyArIGksCisJCQkJICAgICAoKExNX1VJTlQzMiAqKSBwRndJbWctPkRhdGEuQnVmZmVyKVtpIC8KKwkJCQkJCQkJCSA0XSk7CisJCX0KIAl9CiAKLQkvKiBDb3B5IGNvZGUgZmlyc3QgKi8KLQlhZGRyZXNzID0gVDNfUlhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPlRleHQuT2Zmc2V0ICYgMHhmZmZmKTsKLQlmb3IgKGkgPSAwOyBpIDw9IHBGd0ltZy0+VGV4dC5MZW5ndGg7IGkrPTQpCi0JewotCSAgICBMTV9SZWdXckluZChwRGV2aWNlLGFkZHJlc3MraSwKLQkJCSgoTE1fVUlOVDMyICopcEZ3SW1nLT5UZXh0LkJ1ZmZlcilbaS80XSk7CisJaWYgKFN0YXJ0Q3B1ICYgVDNfUlhfQ1BVX0lEKSB7CisJCS8qIFN0YXJ0IFJ4IENQVSAqLworCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisJCVJFR19XUiAocERldmljZSwgcnhDcHUucmVnLlBDLCBwRndJbWctPlN0YXJ0QWRkcmVzcyk7CisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWlmIChwRndJbWctPlN0YXJ0QWRkcmVzcyA9PQorCQkJICAgIFJFR19SRCAocERldmljZSwgcnhDcHUucmVnLlBDKSkKKwkJCQlicmVhazsKKworCQkJUkVHX1dSIChwRGV2aWNlLCByeENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworCQkJUkVHX1dSIChwRGV2aWNlLCByeENwdS5yZWcubW9kZSwgQ1BVX01PREVfSEFMVCk7CisJCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5QQywgcEZ3SW1nLT5TdGFydEFkZHJlc3MpOworCQkJTU1fV2FpdCAoMTAwMCk7CisJCX0KKworCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisJCVJFR19XUiAocERldmljZSwgcnhDcHUucmVnLm1vZGUsIDApOwogCX0KIAotCWFkZHJlc3MgPSBUM19SWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+Uk9ubHlEYXRhLk9mZnNldCAmIDB4ZmZmZik7Ci0JZm9yIChpID0gMDsgaSA8PSBwRndJbWctPlJPbmx5RGF0YS5MZW5ndGg7IGkrPTQpCi0JewotCSAgICBMTV9SZWdXckluZChwRGV2aWNlLGFkZHJlc3MraSwKLQkJCSgoTE1fVUlOVDMyICopcEZ3SW1nLT5ST25seURhdGEuQnVmZmVyKVtpLzRdKTsKKwlpZiAoU3RhcnRDcHUgJiBUM19UWF9DUFVfSUQpIHsKKwkJLyogU3RhcnQgVHggQ1BVICovCisJCVJFR19XUiAocERldmljZSwgdHhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKKwkJUkVHX1dSIChwRGV2aWNlLCB0eENwdS5yZWcuUEMsIHBGd0ltZy0+U3RhcnRBZGRyZXNzKTsKKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJaWYgKHBGd0ltZy0+U3RhcnRBZGRyZXNzID09CisJCQkgICAgUkVHX1JEIChwRGV2aWNlLCB0eENwdS5yZWcuUEMpKQorCQkJCWJyZWFrOworCisJCQlSRUdfV1IgKHBEZXZpY2UsIHR4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisJCQlSRUdfV1IgKHBEZXZpY2UsIHR4Q3B1LnJlZy5tb2RlLCBDUFVfTU9ERV9IQUxUKTsKKwkJCVJFR19XUiAocERldmljZSwgdHhDcHUucmVnLlBDLCBwRndJbWctPlN0YXJ0QWRkcmVzcyk7CisJCQlNTV9XYWl0ICgxMDAwKTsKKwkJfQorCisJCVJFR19XUiAocERldmljZSwgdHhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKKwkJUkVHX1dSIChwRGV2aWNlLCB0eENwdS5yZWcubW9kZSwgMCk7CiAJfQogCi0JYWRkcmVzcyA9IFQzX1JYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5EYXRhLk9mZnNldCAmIDB4ZmZmZik7Ci0JZm9yIChpPSAwOyBpIDw9IHBGd0ltZy0+RGF0YS5MZW5ndGg7IGkrPTQpCi0JewotCSAgICBMTV9SZWdXckluZChwRGV2aWNlLGFkZHJlc3MraSwKLQkJCSgoTE1fVUlOVDMyICopcEZ3SW1nLT5EYXRhLkJ1ZmZlcilbaS80XSk7Ci0JfQotICAgIH0KLQotICAgIGlmIChMb2FkQ3B1ICYgVDNfVFhfQ1BVX0lEKQotICAgIHsKLQlpZiAoTE1fSGFsdENwdShwRGV2aWNlLFQzX1RYX0NQVV9JRCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0JewotCSAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLyogRmlyc3Qgb2YgYWxsIGNsZWFyIHNjcmFjaCBwYWQgbWVtb3J5ICovCi0JZm9yIChpID0gMDsgaSA8IFQzX1RYX0NQVV9TUEFEX1NJWkU7IGkrPTQpCi0JewotCSAgICBMTV9SZWdXckluZChwRGV2aWNlLFQzX1RYX0NQVV9TUEFEX0FERFIraSwwKTsKLQl9Ci0KLQkvKiBDb3B5IGNvZGUgZmlyc3QgKi8KLQlhZGRyZXNzID0gVDNfVFhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPlRleHQuT2Zmc2V0ICYgMHhmZmZmKTsKLQlmb3IgKGk9IDA7IGkgPD0gcEZ3SW1nLT5UZXh0Lkxlbmd0aDsgaSs9NCkKLQl7Ci0JICAgIExNX1JlZ1dySW5kKHBEZXZpY2UsYWRkcmVzcytpLAotCQkJKChMTV9VSU5UMzIgKilwRndJbWctPlRleHQuQnVmZmVyKVtpLzRdKTsKLQl9Ci0KLQlhZGRyZXNzID0gVDNfVFhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPlJPbmx5RGF0YS5PZmZzZXQgJiAweGZmZmYpOwotCWZvciAoaT0gMDsgaSA8PSBwRndJbWctPlJPbmx5RGF0YS5MZW5ndGg7IGkrPTQpCi0JewotCSAgICBMTV9SZWdXckluZChwRGV2aWNlLGFkZHJlc3MraSwKLQkJCSgoTE1fVUlOVDMyICopcEZ3SW1nLT5ST25seURhdGEuQnVmZmVyKVtpLzRdKTsKLQl9Ci0KLQlhZGRyZXNzID0gVDNfVFhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPkRhdGEuT2Zmc2V0ICYgMHhmZmZmKTsKLQlmb3IgKGk9IDA7IGkgPD0gcEZ3SW1nLT5EYXRhLkxlbmd0aDsgaSs9NCkKLQl7Ci0JICAgIExNX1JlZ1dySW5kKHBEZXZpY2UsYWRkcmVzcytpLAotCQkJKChMTV9VSU5UMzIgKilwRndJbWctPkRhdGEuQnVmZmVyKVtpLzRdKTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKFN0YXJ0Q3B1ICYgVDNfUlhfQ1BVX0lEKQotICAgIHsKLQkvKiBTdGFydCBSeCBDUFUgKi8KLQlSRUdfV1IocERldmljZSxyeENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOwotCVJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5QQyxwRndJbWctPlN0YXJ0QWRkcmVzcyk7Ci0JZm9yIChpID0gMCA7IGkgPCA1OyBpKyspCi0JewotCSAgaWYgKHBGd0ltZy0+U3RhcnRBZGRyZXNzID09IFJFR19SRChwRGV2aWNlLHJ4Q3B1LnJlZy5QQykpCi0JICAgICBicmVhazsKLQotCSAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQkgIFJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5tb2RlLENQVV9NT0RFX0hBTFQpOwotCSAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLlBDLHBGd0ltZy0+U3RhcnRBZGRyZXNzKTsKLQkgIE1NX1dhaXQoMTAwMCk7Ci0JfQotCi0JUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQlSRUdfV1IocERldmljZSxyeENwdS5yZWcubW9kZSwgMCk7Ci0gICAgfQotCi0gICAgaWYgKFN0YXJ0Q3B1ICYgVDNfVFhfQ1BVX0lEKQotICAgIHsKLQkvKiBTdGFydCBUeCBDUFUgKi8KLQlSRUdfV1IocERldmljZSx0eENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOwotCVJFR19XUihwRGV2aWNlLHR4Q3B1LnJlZy5QQyxwRndJbWctPlN0YXJ0QWRkcmVzcyk7Ci0JZm9yIChpID0gMCA7IGkgPCA1OyBpKyspCi0JewotCSAgaWYgKHBGd0ltZy0+U3RhcnRBZGRyZXNzID09IFJFR19SRChwRGV2aWNlLHR4Q3B1LnJlZy5QQykpCi0JICAgICBicmVhazsKLQotCSAgUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQkgIFJFR19XUihwRGV2aWNlLHR4Q3B1LnJlZy5tb2RlLENQVV9NT0RFX0hBTFQpOwotCSAgUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLlBDLHBGd0ltZy0+U3RhcnRBZGRyZXNzKTsKLQkgIE1NX1dhaXQoMTAwMCk7Ci0JfQotCi0JUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQlSRUdfV1IocERldmljZSx0eENwdS5yZWcubW9kZSwgMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAotU1RBVElDIExNX1NUQVRVUyBMTV9IYWx0Q3B1KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSxMTV9VSU5UMzIgY3B1X251bWJlcikKK1NUQVRJQyBMTV9TVEFUVVMgTE1fSGFsdENwdSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgY3B1X251bWJlcikKIHsKLSAgICBMTV9VSU5UMzIgaTsKKwlMTV9VSU5UMzIgaTsKIAotICAgIGlmIChjcHVfbnVtYmVyID09IFQzX1JYX0NQVV9JRCkKLSAgICB7Ci0JZm9yIChpID0gMCA7IGkgPCAxMDAwMDsgaSsrKQotCXsKLQkgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQkgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLm1vZGUsQ1BVX01PREVfSEFMVCk7CisJaWYgKGNwdV9udW1iZXIgPT0gVDNfUlhfQ1BVX0lEKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisJCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5tb2RlLCBDUFVfTU9ERV9IQUxUKTsKIAotCSAgICBpZiAoUkVHX1JEKHBEZXZpY2UscnhDcHUucmVnLm1vZGUpICYgQ1BVX01PREVfSEFMVCkKLQkgICAgICBicmVhazsKKwkJCWlmIChSRUdfUkQgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5tb2RlKSAmIENQVV9NT0RFX0hBTFQpCisJCQkJYnJlYWs7CisJCX0KKworCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisJCVJFR19XUiAocERldmljZSwgcnhDcHUucmVnLm1vZGUsIENQVV9NT0RFX0hBTFQpOworCQlNTV9XYWl0ICgxMCk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJCVJFR19XUiAocERldmljZSwgdHhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKKwkJCVJFR19XUiAocERldmljZSwgdHhDcHUucmVnLm1vZGUsIENQVV9NT0RFX0hBTFQpOworCisJCQlpZiAoUkVHX1JEIChwRGV2aWNlLCB0eENwdS5yZWcubW9kZSkgJiBDUFVfTU9ERV9IQUxUKQorCQkJCWJyZWFrOworCQl9CiAJfQogCi0JUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQlSRUdfV1IocERldmljZSxyeENwdS5yZWcubW9kZSxDUFVfTU9ERV9IQUxUKTsKLQlNTV9XYWl0KDEwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlmb3IgKGkgPSAwIDsgaSA8IDEwMDAwOyBpKyspCi0JewotCSAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOwotCSAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcubW9kZSxDUFVfTU9ERV9IQUxUKTsKLQotCSAgICBpZiAoUkVHX1JEKHBEZXZpY2UsdHhDcHUucmVnLm1vZGUpICYgQ1BVX01PREVfSEFMVCkKLQkgICAgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKCggaSA9PSAxMDAwMCkgPyBMTV9TVEFUVVNfRkFJTFVSRSA6IExNX1NUQVRVU19TVUNDRVNTKTsKKwlyZXR1cm4gKChpID09IDEwMDAwKSA/IExNX1NUQVRVU19GQUlMVVJFIDogTE1fU1RBVFVTX1NVQ0NFU1MpOwogfQogCi0KLWludAotTE1fQmxpbmtMRUQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxpbmtEdXJhdGlvblNlYykKK2ludCBMTV9CbGlua0xFRCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxpbmtEdXJhdGlvblNlYykKIHsKIAlMTV9VSU5UMzIgT2xkY2ZnOwogCWludCBqOwogCWludCByZXQgPSAwOwogCi0JaWYoQmxpbmtEdXJhdGlvblNlYyA9PSAwKQotCXsKKwlpZiAoQmxpbmtEdXJhdGlvblNlYyA9PSAwKSB7CiAJCXJldHVybiAwOwogCX0KLQlpZihCbGlua0R1cmF0aW9uU2VjID4gMTIwKQotCXsKKwlpZiAoQmxpbmtEdXJhdGlvblNlYyA+IDEyMCkgewogCQlCbGlua0R1cmF0aW9uU2VjID0gMTIwOwogCX0KIAotCU9sZGNmZyA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwpOwotCWZvcihqID0gMDsgaiA8IEJsaW5rRHVyYXRpb25TZWMgKiAyOyBqKyspCi0JewotCQlpZihqICUgMikKLQkJeworCU9sZGNmZyA9IFJFR19SRCAocERldmljZSwgTWFjQ3RybC5MZWRDdHJsKTsKKwlmb3IgKGogPSAwOyBqIDwgQmxpbmtEdXJhdGlvblNlYyAqIDI7IGorKykgeworCQlpZiAoaiAlIDIpIHsKIAkJCS8qIFR1cm4gb24gdGhlIExFRHMuICovCi0JCQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLAorCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsCiAJCQkJTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAogCQkJCUxFRF9DVFJMXzEwMDBNQlBTX0xFRF9PTiB8CiAJCQkJTEVEX0NUUkxfMTAwTUJQU19MRURfT04gfApAQCAtNjA0NywxNTQgKzU1NDcsMTUzIEBACiAJCQkJTEVEX0NUUkxfT1ZFUlJJREVfVFJBRkZJQ19MRUQgfAogCQkJCUxFRF9DVFJMX0JMSU5LX1RSQUZGSUNfTEVEIHwKIAkJCQlMRURfQ1RSTF9UUkFGRklDX0xFRCk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQkvKiBUdXJuIG9mZiB0aGUgTEVEcy4gKi8KLQkJCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsCisJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwKIAkJCQlMRURfQ1RSTF9PVkVSUklERV9MSU5LX0xFRCB8CiAJCQkJTEVEX0NUUkxfT1ZFUlJJREVfVFJBRkZJQ19MRUQpOwogCQl9CiAKICNpZm5kZWYgRU1CRURERUQKIAkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCWlmIChzY2hlZHVsZV90aW1lb3V0KEhaLzIpICE9IDApIHsKKwkJaWYgKHNjaGVkdWxlX3RpbWVvdXQgKEhaIC8gMikgIT0gMCkgewogCQkJcmV0ID0gLUVJTlRSOwogCQkJYnJlYWs7CiAJCX0KICNlbHNlCi0JCXVkZWxheSgxMDAwMDApOyAgLyogMXMgc2xlZXAgKi8KKwkJdWRlbGF5ICgxMDAwMDApOwkvKiAxcyBzbGVlcCAqLwogI2VuZGlmCiAJfQotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsIE9sZGNmZyk7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsIE9sZGNmZyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHQzX2RvX2RtYShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0JCSAgIExNX1BIWVNJQ0FMX0FERFJFU1MgaG9zdF9hZGRyX3BoeSwgaW50IGxlbmd0aCwKLQkJICAgaW50IGRtYV9yZWFkKQoraW50IHQzX2RvX2RtYSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCSAgICAgICBMTV9QSFlTSUNBTF9BRERSRVNTIGhvc3RfYWRkcl9waHksIGludCBsZW5ndGgsIGludCBkbWFfcmVhZCkKIHsKLSAgICBUM19ETUFfREVTQyBkbWFfZGVzYzsKLSAgICBpbnQgaTsKLSAgICBMTV9VSU5UMzIgZG1hX2Rlc2NfYWRkcjsKLSAgICBMTV9VSU5UMzIgdmFsdWUzMjsKKwlUM19ETUFfREVTQyBkbWFfZGVzYzsKKwlpbnQgaTsKKwlMTV9VSU5UMzIgZG1hX2Rlc2NfYWRkcjsKKwlMTV9VSU5UMzIgdmFsdWUzMjsKIAotICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTW9kZSwgMCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEZ0cS5SZXNldCwgMCk7CisJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTW9kZSwgMCk7CisJUkVHX1dSIChwRGV2aWNlLCBGdHEuUmVzZXQsIDApOwogCi0gICAgZG1hX2Rlc2MuaG9zdF9hZGRyLkhpZ2ggPSBob3N0X2FkZHJfcGh5LkhpZ2g7Ci0gICAgZG1hX2Rlc2MuaG9zdF9hZGRyLkxvdyA9IGhvc3RfYWRkcl9waHkuTG93OwotICAgIGRtYV9kZXNjLm5pY19tYnVmID0gMHgyMTAwOwotICAgIGRtYV9kZXNjLmxlbiA9IGxlbmd0aDsKLSAgICBkbWFfZGVzYy5mbGFncyA9IDB4MDAwMDAwMDQ7IC8qIEdlbmVyYXRlIFJ4LUNQVSBldmVudCAqLworCWRtYV9kZXNjLmhvc3RfYWRkci5IaWdoID0gaG9zdF9hZGRyX3BoeS5IaWdoOworCWRtYV9kZXNjLmhvc3RfYWRkci5Mb3cgPSBob3N0X2FkZHJfcGh5LkxvdzsKKwlkbWFfZGVzYy5uaWNfbWJ1ZiA9IDB4MjEwMDsKKwlkbWFfZGVzYy5sZW4gPSBsZW5ndGg7CisJZG1hX2Rlc2MuZmxhZ3MgPSAweDAwMDAwMDA0OwkvKiBHZW5lcmF0ZSBSeC1DUFUgZXZlbnQgKi8KIAotICAgIGlmIChkbWFfcmVhZCkKLSAgICB7Ci0JZG1hX2Rlc2MuY3FpZF9zcWlkID0gKFQzX1FJRF9SWF9CRF9DT01QIDw8IDgpIHwKLQkgICAgVDNfUUlEX0RNQV9ISUdIX1BSSV9SRUFEOwotCVJFR19XUihwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIERNQV9SRUFEX01PREVfRU5BQkxFKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlkbWFfZGVzYy5jcWlkX3NxaWQgPSAoVDNfUUlEX1JYX0RBVEFfQ09NUCA8PCA4KSB8Ci0JICAgIFQzX1FJRF9ETUFfSElHSF9QUklfV1JJVEU7Ci0JUkVHX1dSKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUsIERNQV9XUklURV9NT0RFX0VOQUJMRSk7Ci0gICAgfQorCWlmIChkbWFfcmVhZCkgeworCQlkbWFfZGVzYy5jcWlkX3NxaWQgPSAoVDNfUUlEX1JYX0JEX0NPTVAgPDwgOCkgfAorCQkgICAgVDNfUUlEX0RNQV9ISUdIX1BSSV9SRUFEOworCQlSRUdfV1IgKHBEZXZpY2UsIERtYVJlYWQuTW9kZSwgRE1BX1JFQURfTU9ERV9FTkFCTEUpOworCX0gZWxzZSB7CisJCWRtYV9kZXNjLmNxaWRfc3FpZCA9IChUM19RSURfUlhfREFUQV9DT01QIDw8IDgpIHwKKwkJICAgIFQzX1FJRF9ETUFfSElHSF9QUklfV1JJVEU7CisJCVJFR19XUiAocERldmljZSwgRG1hV3JpdGUuTW9kZSwgRE1BX1dSSVRFX01PREVfRU5BQkxFKTsKKwl9CiAKLSAgICBkbWFfZGVzY19hZGRyID0gVDNfTklDX0RNQV9ERVNDX1BPT0xfQUREUjsKKwlkbWFfZGVzY19hZGRyID0gVDNfTklDX0RNQV9ERVNDX1BPT0xfQUREUjsKIAotICAgIC8qIFdyaXRpbmcgdGhpcyBETUEgZGVzY3JpcHRvciB0byBETUEgbWVtb3J5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihUM19ETUFfREVTQyk7IGkgKz0gNCkKLSAgICB7Ci0JdmFsdWUzMiA9ICooKFBMTV9VSU5UMzIpICgoKFBMTV9VSU5UOCkgJmRtYV9kZXNjKSArIGkpKTsKLQlNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBkbWFfZGVzY19hZGRyK2kpOwotCU1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fREFUQV9SRUcsIGNwdV90b19sZTMyKHZhbHVlMzIpKTsKLSAgICB9Ci0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9BRERSX1JFRywgMCk7CisJLyogV3JpdGluZyB0aGlzIERNQSBkZXNjcmlwdG9yIHRvIERNQSBtZW1vcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChUM19ETUFfREVTQyk7IGkgKz0gNCkgeworCQl2YWx1ZTMyID0gKigoUExNX1VJTlQzMikgKCgoUExNX1VJTlQ4KSAmIGRtYV9kZXNjKSArIGkpKTsKKwkJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgVDNfUENJX01FTV9XSU5fQUREUl9SRUcsCisJCQkJICBkbWFfZGVzY19hZGRyICsgaSk7CisJCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0RBVEFfUkVHLAorCQkJCSAgY3B1X3RvX2xlMzIgKHZhbHVlMzIpKTsKKwl9CisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgVDNfUENJX01FTV9XSU5fQUREUl9SRUcsIDApOwogCi0gICAgaWYgKGRtYV9yZWFkKQotCVJFR19XUihwRGV2aWNlLCBGdHEuRG1hSGlnaFJlYWRGdHFGaWZvRW5xdWV1ZURlcXVldWUsIGRtYV9kZXNjX2FkZHIpOwotICAgIGVsc2UKLQlSRUdfV1IocERldmljZSwgRnRxLkRtYUhpZ2hXcml0ZUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZSwgZG1hX2Rlc2NfYWRkcik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykKLSAgICB7CiAJaWYgKGRtYV9yZWFkKQotCSAgICB2YWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEZ0cS5SY3ZCZENvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWUpOworCQlSRUdfV1IgKHBEZXZpY2UsIEZ0cS5EbWFIaWdoUmVhZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZSwKKwkJCWRtYV9kZXNjX2FkZHIpOwogCWVsc2UKLQkgICAgdmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBGdHEuUmN2RGF0YUNvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWUpOworCQlSRUdfV1IgKHBEZXZpY2UsIEZ0cS5EbWFIaWdoV3JpdGVGdHFGaWZvRW5xdWV1ZURlcXVldWUsCisJCQlkbWFfZGVzY19hZGRyKTsKIAotCWlmICgodmFsdWUzMiAmIDB4ZmZmZikgPT0gZG1hX2Rlc2NfYWRkcikKLQkgICAgYnJlYWs7CisJZm9yIChpID0gMDsgaSA8IDQwOyBpKyspIHsKKwkJaWYgKGRtYV9yZWFkKQorCQkJdmFsdWUzMiA9CisJCQkgICAgUkVHX1JEIChwRGV2aWNlLAorCQkJCSAgICBGdHEuUmN2QmRDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlKTsKKwkJZWxzZQorCQkJdmFsdWUzMiA9CisJCQkgICAgUkVHX1JEIChwRGV2aWNlLAorCQkJCSAgICBGdHEuUmN2RGF0YUNvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWUpOwogCi0JTU1fV2FpdCgxMCk7Ci0gICAgfQorCQlpZiAoKHZhbHVlMzIgJiAweGZmZmYpID09IGRtYV9kZXNjX2FkZHIpCisJCQlicmVhazsKIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwkJTU1fV2FpdCAoMTApOworCX0KKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAogU1RBVElDIExNX1NUQVRVUwotTE1fRG1hVGVzdChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwQnVmZmVyVmlydCwKLQkgICBMTV9QSFlTSUNBTF9BRERSRVNTIEJ1ZmZlclBoeSwgTE1fVUlOVDMyIEJ1ZmZlclNpemUpCitMTV9EbWFUZXN0IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwQnVmZmVyVmlydCwKKwkgICAgTE1fUEhZU0lDQUxfQUREUkVTUyBCdWZmZXJQaHksIExNX1VJTlQzMiBCdWZmZXJTaXplKQogewotICAgIGludCBqOwotICAgIExNX1VJTlQzMiAqcHRyOwotICAgIGludCBkbWFfc3VjY2VzcyA9IDA7CisJaW50IGo7CisJTE1fVUlOVDMyICpwdHI7CisJaW50IGRtYV9zdWNjZXNzID0gMDsKIAotICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMCAmJgotCVQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMSkKLSAgICB7CisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDAgJiYKKwkgICAgVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJfQorCXdoaWxlICghZG1hX3N1Y2Nlc3MpIHsKKwkJLyogRmlsbCBkYXRhIHdpdGggaW5jcmVtZW50YWwgcGF0dGVybnMgKi8KKwkJcHRyID0gKExNX1VJTlQzMiAqKSBwQnVmZmVyVmlydDsKKwkJZm9yIChqID0gMDsgaiA8IEJ1ZmZlclNpemUgLyA0OyBqKyspCisJCQkqcHRyKysgPSBqOworCisJCWlmICh0M19kb19kbWEgKHBEZXZpY2UsIEJ1ZmZlclBoeSwgQnVmZmVyU2l6ZSwgMSkgPT0KKwkJICAgIExNX1NUQVRVU19GQUlMVVJFKSB7CisJCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCX0KKworCQlNTV9XYWl0ICg0MCk7CisJCXB0ciA9IChMTV9VSU5UMzIgKikgcEJ1ZmZlclZpcnQ7CisJCS8qIEZpbGwgZGF0YSB3aXRoIHplcm8gKi8KKwkJZm9yIChqID0gMDsgaiA8IEJ1ZmZlclNpemUgLyA0OyBqKyspCisJCQkqcHRyKysgPSAwOworCisJCWlmICh0M19kb19kbWEgKHBEZXZpY2UsIEJ1ZmZlclBoeSwgQnVmZmVyU2l6ZSwgMCkgPT0KKwkJICAgIExNX1NUQVRVU19GQUlMVVJFKSB7CisJCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCX0KKworCQlNTV9XYWl0ICg0MCk7CisJCS8qIENoZWNrIGZvciBkYXRhICovCisJCXB0ciA9IChMTV9VSU5UMzIgKikgcEJ1ZmZlclZpcnQ7CisJCWZvciAoaiA9IDA7IGogPCBCdWZmZXJTaXplIC8gNDsgaisrKSB7CisJCQlpZiAoKnB0cisrICE9IGopIHsKKwkJCQlpZiAoKHBEZXZpY2UtPgorCQkJCSAgICAgRG1hUmVhZFdyaXRlQ3RybCAmCisJCQkJICAgICBETUFfQ1RSTF9XUklURV9CT1VOREFSWV9NQVNLKQorCQkJCSAgICA9PSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV9ESVNBQkxFKSB7CisJCQkJCXBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPQorCQkJCQkgICAgKHBEZXZpY2UtPgorCQkJCQkgICAgIERtYVJlYWRXcml0ZUN0cmwgJgorCQkJCQkgICAgIH5ETUFfQ1RSTF9XUklURV9CT1VOREFSWV9NQVNLKSB8CisJCQkJCSAgICBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8xNjsKKwkJCQkJUkVHX1dSIChwRGV2aWNlLAorCQkJCQkJUGNpQ2ZnLkRtYVJlYWRXcml0ZUN0cmwsCisJCQkJCQlwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaiA9PSAoQnVmZmVyU2l6ZSAvIDQpKQorCQkJZG1hX3N1Y2Nlc3MgPSAxOworCX0KIAlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci0gICAgfQotICAgIHdoaWxlICghZG1hX3N1Y2Nlc3MpCi0gICAgewotCS8qIEZpbGwgZGF0YSB3aXRoIGluY3JlbWVudGFsIHBhdHRlcm5zICovCi0JcHRyID0gKExNX1VJTlQzMiAqKXBCdWZmZXJWaXJ0OwotCWZvciAoaiA9IDA7IGogPCBCdWZmZXJTaXplLzQ7IGorKykKLQkgICAgKnB0cisrID0gajsKLQotCWlmICh0M19kb19kbWEocERldmljZSxCdWZmZXJQaHksQnVmZmVyU2l6ZSwgMSkgPT0gTE1fU1RBVFVTX0ZBSUxVUkUpCi0JewotCSAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JTU1fV2FpdCg0MCk7Ci0JcHRyID0gKExNX1VJTlQzMiAqKXBCdWZmZXJWaXJ0OwotCS8qIEZpbGwgZGF0YSB3aXRoIHplcm8gKi8KLQlmb3IgKGogPSAwOyBqIDwgQnVmZmVyU2l6ZS80OyBqKyspCi0JICAgICpwdHIrKyA9IDA7Ci0KLQlpZiAodDNfZG9fZG1hKHBEZXZpY2UsQnVmZmVyUGh5LEJ1ZmZlclNpemUsIDApID09IExNX1NUQVRVU19GQUlMVVJFKQotCXsKLQkgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCU1NX1dhaXQoNDApOwotCS8qIENoZWNrIGZvciBkYXRhICovCi0JcHRyID0gKExNX1VJTlQzMiAqKXBCdWZmZXJWaXJ0OwotCWZvciAoaiA9IDA7IGogPCBCdWZmZXJTaXplLzQ7IGorKykKLQl7Ci0JICAgIGlmICgqcHRyKysgIT0gaikKLQkgICAgewotCQlpZiAoKHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgJiBETUFfQ1RSTF9XUklURV9CT1VOREFSWV9NQVNLKQotCQkgICAgPT0gRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfRElTQUJMRSkKLQkJewotCQkgICAgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCA9IChwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsICYKLQkJCSB+RE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfTUFTSykgfAotCQkJICBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8xNjsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuRG1hUmVhZFdyaXRlQ3RybCwKLQkJCSAgIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwpOwotCQkgICAgYnJlYWs7Ci0JCSB9Ci0JCSBlbHNlCi0JCSB7Ci0JCSAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotCQkgfQotCSAgICB9Ci0JfQotCWlmIChqID09IChCdWZmZXJTaXplLzQpKQotCSAgICBkbWFfc3VjY2VzcyA9IDE7Ci0gICAgfQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCwgIUNPTkZJR19ORVRfTVVMVEksIENPTkZJR19USUdPTjMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RpZ29uMy5oIGIvZHJpdmVycy90aWdvbjMuaAppbmRleCBlYTQzNjdkLi5jMDMzNDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RpZ29uMy5oCisrKyBiL2RyaXZlcnMvdGlnb24zLmgKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJiY201NzB4X2F1dG9uZWcuaCIKICNlbmRpZgogCi0KIC8qIGlvIGRlZmluZXMgKi8KICNpZiAhZGVmaW5lZChCSUdfRU5ESUFOX0hPU1QpCiAjZGVmaW5lIHJlYWRsKGFkZHIpIFwKQEAgLTI5LDcgKzI4LDcgQEAKICNkZWZpbmUgd3JpdGVsKGIsYWRkcikgXAogCSAgICAgICgoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcikpID0gKExPTkdTV0FQKGIpKSkKICNlbHNlCi0jaWYgMCAvKiAhZGVmaW5lZChQUEM2MDMpICovCisjaWYgMAkJCQkvKiAhZGVmaW5lZChQUEM2MDMpICovCiAjZGVmaW5lIHJlYWRsKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKDB4YTAwMDAwMDAgKyAodW5zaWduZWQgbG9uZykoYWRkcikpKQogI2RlZmluZSB3cml0ZWwoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgbG9uZykoYWRkcikgKyAweGEwMDAwMDAwKSkgPSAoYikpCiAjZWxzZQpAQCAtMzcsMjUgKzM2LDI4IEBACiAjZGVmaW5lIHJlYWRsKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKGFkZHIpKQogI2RlZmluZSB3cml0ZWwoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkgPSAoYikpCiAjZWxzZQotZXh0ZXJuIGludCBzcHJpbnRmKGNoYXIqIGJ1ZiwgY29uc3QgY2hhciogZiwgLi4uKTsKLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQgcmVhZGwodm9pZCogYWRkcil7Ci0gICAgY2hhciBidWZbMTI4XTsKLSAgICB1bnNpZ25lZCBpbnQgdG1wID0gKCoodm9sYXRpbGUgdW5zaWduZWQgaW50KikoYWRkcikpOwotICAgIHNwcmludGYoYnVmLCIlczolczogcmVhZCAweCV4IGZyb20gMHgleFxuIixfX0ZJTEVfXyxfX0xJTkVfXyx0bXAsYWRkciwwLDApOwotICAgIHN5c1NlcmlhbFByaW50U3RyaW5nKGJ1Zik7Ci0gICAgcmV0dXJuIHRtcDsKK2V4dGVybiBpbnQgc3ByaW50ZiAoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmLCAuLi4pOworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludCByZWFkbCAodm9pZCAqYWRkcikKK3sKKwljaGFyIGJ1ZlsxMjhdOworCXVuc2lnbmVkIGludCB0bXAgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcikpOworCXNwcmludGYgKGJ1ZiwgIiVzOiVzOiByZWFkIDB4JXggZnJvbSAweCV4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHRtcCwKKwkJIGFkZHIsIDAsIDApOworCXN5c1NlcmlhbFByaW50U3RyaW5nIChidWYpOworCXJldHVybiB0bXA7CiB9Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCB3cml0ZWwodW5zaWduZWQgaW50IGIsIHVuc2lnbmVkIGludCBhZGRyKXsKLSAgICBjaGFyIGJ1ZlsxMjhdOwotICAgICgoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKGFkZHIpKSA9IChiKSk7Ci0gICAgc3ByaW50ZihidWYsIiVzOiVzOiB3cml0ZSAweCV4IHRvIDB4JXhcbiIsX19GSUxFX18sX19MSU5FX18sYixhZGRyLDAsMCk7Ci0gICAgc3lzU2VyaWFsUHJpbnRTdHJpbmcoYnVmKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIHdyaXRlbCAodW5zaWduZWQgaW50IGIsIHVuc2lnbmVkIGludCBhZGRyKQoreworCWNoYXIgYnVmWzEyOF07CisJKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShhZGRyKSkgPSAoYikpOworCXNwcmludGYgKGJ1ZiwgIiVzOiVzOiB3cml0ZSAweCV4IHRvIDB4JXhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgYiwKKwkJIGFkZHIsIDAsIDApOworCXN5c1NlcmlhbFByaW50U3RyaW5nIChidWYpOwogfQogI2VuZGlmCi0jZW5kaWYgLyogUFBDNjAzICovCisjZW5kaWYJCQkJLyogUFBDNjAzICovCiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQ29uc3RhbnRzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTkwLDcgKzkyLDcgQEAKIAogLyogQjAgYnVnLiAqLwogI2RlZmluZSBCQ001NzAwX0JYX01JTl9GUkFHX1NJWkUgICAgICAgICAgICAxMAotI2RlZmluZSBCQ001NzAwX0JYX01JTl9GUkFHX0JVRl9TSVpFICAgICAgICAxNiAgLyogbmljZSBhbGlnbmVkIHNpemUuICovCisjZGVmaW5lIEJDTTU3MDBfQlhfTUlOX0ZSQUdfQlVGX1NJWkUgICAgICAgIDE2CS8qIG5pY2UgYWxpZ25lZCBzaXplLiAqLwogI2RlZmluZSBCQ001NzAwX0JYX01JTl9GUkFHX0JVRl9TSVpFX01BU0sgICAoQkNNNTcwMF9CWF9NSU5fRlJBR19CVUZfU0laRS0xKQogI2RlZmluZSBCQ001NzAwX0JYX1RYX0NPUFlfQlVGX1NJWkUgICAgICAgICAoQkNNNTcwMF9CWF9NSU5fRlJBR19CVUZfU0laRSAqIFwKIAkJCQkJICAgIE1BWF9GUkFHTUVOVF9DT1VOVCkKQEAgLTE2MSwzMiArMTYzLDMyIEBACiAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgU3RhbmRhcmQgUmVjZWl2ZSBSQ0IuICBNdXN0IGJlIDUxMiBlbnRyaWVzLiAqLwogI2RlZmluZSBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVCAgICAgICAgICA1MTIKICNkZWZpbmUgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSyAgICAgKFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5ULTEpCi0jZGVmaW5lIERFRkFVTFRfU1REX1JDVl9ERVNDX0NPVU5UICAgICAgICAgIDIwMCAgICAvKiBNdXN0IGJlIDwgNTEyLiAqLworI2RlZmluZSBERUZBVUxUX1NURF9SQ1ZfREVTQ19DT1VOVCAgICAgICAgICAyMDAJLyogTXVzdCBiZSA8IDUxMi4gKi8KICNkZWZpbmUgTUFYX1NURF9SQ1ZfQlVGRkVSX1NJWkUgICAgICAgICAgICAgMHg2MDAKIAogLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIE1pbmkgUmVjZWl2ZSBSQ0IuICBUaGlzIHZhbHVlIGNhbiBlaXRoZXIgYmUgKi8KIC8qIDAsIDEwMjQuICBDdXJyZW50bHkgTWluaSBSZWNlaXZlIFJDQiBpcyBkaXNhYmxlZC4gKi8KICNpZm5kZWYgVDNfTUlOSV9SQ1ZfUkNCX0VOVFJZX0NPVU5UCiAjZGVmaW5lIFQzX01JTklfUkNWX1JDQl9FTlRSWV9DT1VOVCAgICAgICAgIDAKLSNlbmRpZiAvKiBUM19NSU5JX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKyNlbmRpZgkJCQkvKiBUM19NSU5JX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KICNkZWZpbmUgVDNfTUlOSV9SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0sgICAgKFQzX01JTklfUkNWX1JDQl9FTlRSWV9DT1VOVC0xKQogI2RlZmluZSBNQVhfTUlOSV9SQ1ZfQlVGRkVSX1NJWkUgICAgICAgICAgICA1MTIKICNkZWZpbmUgREVGQVVMVF9NSU5JX1JDVl9CVUZGRVJfU0laRSAgICAgICAgNjQKLSNkZWZpbmUgREVGQVVMVF9NSU5JX1JDVl9ERVNDX0NPVU5UICAgICAgICAgMTAwICAgIC8qIE11c3QgYmUgPCAxMDI0LiAqLworI2RlZmluZSBERUZBVUxUX01JTklfUkNWX0RFU0NfQ09VTlQgICAgICAgICAxMDAJLyogTXVzdCBiZSA8IDEwMjQuICovCiAKIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBKdW1ibyBSZWNlaXZlIFJDQi4gIFRoaXMgdmFsdWUgbXVzdCAyNTYgb3IgMC4gKi8KIC8qIEN1cnJlbnRseSwgSnVtYm8gUmVjZWl2ZSBSQ0IgaXMgZGlzYWJsZWQuICovCiAjaWZuZGVmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKICNkZWZpbmUgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAgICAgICAgMAotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCiAjZGVmaW5lIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSyAgIChUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5ULTEpCiAKLSNkZWZpbmUgTUFYX0pVTUJPX1JDVl9CVUZGRVJfU0laRSAgICAgICAgICAgKDEwICogMTAyNCkgLyogPiAxNTE0ICovCi0jZGVmaW5lIERFRkFVTFRfSlVNQk9fUkNWX0JVRkZFUl9TSVpFICAgICAgICg0ICogMTAyNCkgLyogPiAxNTE0ICovCi0jZGVmaW5lIERFRkFVTFRfSlVNQk9fUkNWX0RFU0NfQ09VTlQgICAgICAgIDEyOCAgICAgLyogTXVzdCBiZSA8IDI1Ni4gKi8KKyNkZWZpbmUgTUFYX0pVTUJPX1JDVl9CVUZGRVJfU0laRSAgICAgICAgICAgKDEwICogMTAyNCkJLyogPiAxNTE0ICovCisjZGVmaW5lIERFRkFVTFRfSlVNQk9fUkNWX0JVRkZFUl9TSVpFICAgICAgICg0ICogMTAyNCkJLyogPiAxNTE0ICovCisjZGVmaW5lIERFRkFVTFRfSlVNQk9fUkNWX0RFU0NfQ09VTlQgICAgICAgIDEyOAkvKiBNdXN0IGJlIDwgMjU2LiAqLwogCi0jZGVmaW5lIE1BWF9KVU1CT19UWF9CVUZGRVJfU0laRSAgICAgICAgICAgICg4ICogMTAyNCkgLyogPiAxNTE0ICovCi0jZGVmaW5lIERFRkFVTFRfSlVNQk9fVFhfQlVGRkVSX1NJWkUgICAgICAgICg0ICogMTAyNCkgLyogPiAxNTE0ICovCisjZGVmaW5lIE1BWF9KVU1CT19UWF9CVUZGRVJfU0laRSAgICAgICAgICAgICg4ICogMTAyNCkJLyogPiAxNTE0ICovCisjZGVmaW5lIERFRkFVTFRfSlVNQk9fVFhfQlVGRkVSX1NJWkUgICAgICAgICg0ICogMTAyNCkJLyogPiAxNTE0ICovCiAKIC8qIE51bWJlciBvZiByZWNlaXZlIHJldHVybiBSQ0JzLiAgTWF5YmUgMS0xNiBidXQgZm9yIG5vdywgb25seSBzdXBwb3J0IG9uZS4gKi8KICNkZWZpbmUgVDNfTUFYX1JDVl9SRVRVUk5fUkNCX0NPVU5UICAgICAgICAgMTYKQEAgLTE5NSwxMCArMTk3LDkgQEAKIC8qIG9yIDIwNDguICovCiAjaWZuZGVmIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UCiAjZGVmaW5lIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UICAgICAgIDEwMjQKLSNlbmRpZiAvKiBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqLworI2VuZGlmCQkJCS8qIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UICovCiAjZGVmaW5lIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UX01BU0sgIChUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVC0xKQogCi0KIC8qIERlZmF1bHQgY29hbGVzY2luZyBwYXJhbWV0ZXJzLiAqLwogI2RlZmluZSBERUZBVUxUX1JYX0NPQUxFU0NJTkdfVElDS1MgICAgICAgICAxMDAKICNkZWZpbmUgTUFYX1JYX0NPQUxFU0NJTkdfVElDS1MgICAgICAgICAgICAgNTAwCkBAIC0yMjcsNyArMjI4LDYgQEAKICNkZWZpbmUgREVGQVVMVF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTICAgICAgMTAwMDAwMAogI2RlZmluZSBNQVhfU1RBVFNfQ09BTEVTQ0lOR19USUNLUyAgICAgICAgICAzNjAwMDAwMDAwVQogCi0KIC8qIFJlY2VpdmUgQkQgUmVwbGVuaXNoIHRocmVzaG9sZHMuICovCiAjZGVmaW5lIERFRkFVTFRfUkNWX1NURF9CRF9SRVBMRU5JU0hfVEhSRVNIT0xEICAgICAgNAogI2RlZmluZSBERUZBVUxUX1JDVl9KVU1CT19CRF9SRVBMRU5JU0hfVEhSRVNIT0xEICAgIDQKQEAgLTI0MCwxMiArMjQwLDEwIEBACiAvKiBNYXhpbXVtIHBoeXNpY2FsIGZyYWdtZW50IHNpemUuICovCiAjZGVmaW5lIE1BWF9GUkFHTUVOVF9TSVpFICAgICAgICAgICAgICAgICAgICg2NCAqIDEwMjQpCiAKLQogLyogU3RhbmRhcmQgdmlldy4gKi8KICNkZWZpbmUgVDNfU1REX1ZJRVdfU0laRSAgICAgICAgICAgICAgICAgICAgKDY0ICogMTAyNCkKICNkZWZpbmUgVDNfRkxBVF9WSUVXX1NJWkUgICAgICAgICAgICAgICAgICAgKDMyICogMTAyNCAqIDEwMjQpCiAKLQogLyogQnVmZmVyIGRlc2NyaXB0b3IgYmFzZSBhZGRyZXNzIG9uIHRoZSBOSUMncyBtZW1vcnkuICovCiAKICNkZWZpbmUgVDNfTklDX1NORF9CVUZGRVJfREVTQ19BRERSICAgICAgICAgMHg0MDAwCkBAIC0yNjUsMTkgKzI2MywxNyBAQAogI2RlZmluZSBUM19OSUNfSlVNQk9fUkNWX0JVRkZFUl9ERVNDX1NJWkUgICAoVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqIFwKIAkJCQkJICAgIHNpemVvZihUM19FWFRfUkNWX0JEKSAvIDQpCiAKLQogLyogTUJVRiBwb29sLiAqLwogI2RlZmluZSBUM19OSUNfTUJVRl9QT09MX0FERFIgICAgICAgICAgICAgICAweDgwMDAKIC8qICNkZWZpbmUgVDNfTklDX01CVUZfUE9PTF9TSVpFICAgICAgICAgICAgICAgMHgxODAwMCAqLwogI2RlZmluZSBUM19OSUNfTUJVRl9QT09MX1NJWkU5NiAgICAgICAgICAgICAweDE4MDAwCiAjZGVmaW5lIFQzX05JQ19NQlVGX1BPT0xfU0laRTY0ICAgICAgICAgICAgIDB4MTAwMDAKIAotCiAjZGVmaW5lIFQzX05JQ19NQlVGX1BPT0xfQUREUl9FWFRfTUVNICAgICAgIDB4MjAwMDAKIAogLyogRE1BIGRlc2NyaXB0b3IgcG9vbCAqLwogI2RlZmluZSBUM19OSUNfRE1BX0RFU0NfUE9PTF9BRERSICAgICAgICAgICAweDIwMDAKLSNkZWZpbmUgVDNfTklDX0RNQV9ERVNDX1BPT0xfU0laRSAgICAgICAgICAgMHgyMDAwICAgICAgLyogOEtCLiAqLworI2RlZmluZSBUM19OSUNfRE1BX0RFU0NfUE9PTF9TSVpFICAgICAgICAgICAweDIwMDAJLyogOEtCLiAqLwogCiAjZGVmaW5lIFQzX0RFRl9ETUFfTUJVRl9MT1dfV01BUksgICAgICAgICAgIDB4NDAKICNkZWZpbmUgVDNfREVGX1JYX01BQ19NQlVGX0xPV19XTUFSSyAgICAgICAgMHgyMApAQCAtMzAxLDI0ICsyOTcsMjEgQEAKICNkZWZpbmUgVDNfVFhfQ1BVX1NQQURfQUREUiAgMHgzNDAwMAogI2RlZmluZSBUM19UWF9DUFVfU1BBRF9TSVpFICAweDQwMDAKIAotdHlwZWRlZiBzdHJ1Y3QgVDNfRElSX0VOVFJZCi17Ci0gIFBMTV9VSU5UOCBCdWZmZXI7Ci0gIExNX1VJTlQzMiBPZmZzZXQ7Ci0gIExNX1VJTlQzMiBMZW5ndGg7Ci19IFQzX0RJUl9FTlRSWSwqUFQzX0RJUl9FTlRSWTsKK3R5cGVkZWYgc3RydWN0IFQzX0RJUl9FTlRSWSB7CisJUExNX1VJTlQ4IEJ1ZmZlcjsKKwlMTV9VSU5UMzIgT2Zmc2V0OworCUxNX1VJTlQzMiBMZW5ndGg7Cit9IFQzX0RJUl9FTlRSWSwgKlBUM19ESVJfRU5UUlk7CiAKLXR5cGVkZWYgc3RydWN0IFQzX0ZXSU1HX0lORk8KLXsKLSAgTE1fVUlOVDMyIFN0YXJ0QWRkcmVzczsKLSAgVDNfRElSX0VOVFJZIFRleHQ7Ci0gIFQzX0RJUl9FTlRSWSBST25seURhdGE7Ci0gIFQzX0RJUl9FTlRSWSBEYXRhOwotICBUM19ESVJfRU5UUlkgU2JzczsKLSAgVDNfRElSX0VOVFJZIEJzczsKK3R5cGVkZWYgc3RydWN0IFQzX0ZXSU1HX0lORk8geworCUxNX1VJTlQzMiBTdGFydEFkZHJlc3M7CisJVDNfRElSX0VOVFJZIFRleHQ7CisJVDNfRElSX0VOVFJZIFJPbmx5RGF0YTsKKwlUM19ESVJfRU5UUlkgRGF0YTsKKwlUM19ESVJfRU5UUlkgU2JzczsKKwlUM19ESVJfRU5UUlkgQnNzOwogfSBUM19GV0lNR19JTkZPLCAqUFQzX0ZXSU1HX0lORk87CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFRpZ29uMyBQQ0kgUmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM2Miw3ICszNTUsNiBAQAogI2RlZmluZSBUM19BU0lDX1JFVl81NzAzICAgICAgICAgICAgICAgICAgICAweDAxCiAjZGVmaW5lIFQzX0FTSUNfUkVWXzU3MDQgICAgICAgICAgICAgICAgICAgIDB4MDIKIAotCiAvKiBDaGlwIGlkIGFuZCByZXZpc2lvbi4gKi8KICNkZWZpbmUgVDNfQ0hJUF9SRVYoX0NoaXBSZXZJZCkgICAgICAgICAgICAgKChfQ2hpcFJldklkKSA+PiA4KQogI2RlZmluZSBUM19DSElQX1JFVl81NzAwX0FYICAgICAgICAgICAgICAgICAweDcwCkBAIC0zODYsNyArMzc4LDYgQEAKICNkZWZpbmUgVDNfUENJX1BPV0VSX0RPV05fUENJX1BMTDEzMyAgICAgICAgQklUXzE1CiAjZGVmaW5lIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLICAgICAgICAgICAgIEJJVF8xOAogCi0KICNkZWZpbmUgVDNfUENJX1JFR19BRERSX1JFRyAgICAgICAgICAgICAgICAgMHg3OAogI2RlZmluZSBUM19QQ0lfUkVHX0RBVEFfUkVHICAgICAgICAgICAgICAgICAweDgwCiAKQEAgLTQwOSw3ICs0MDAsNiBAQAogI2RlZmluZSBUM19QTV9QTUVfRU5BQkxFICAgICAgICAgICAgICAgICAgICBCSVRfOAogI2RlZmluZSBUM19QTV9QTUVfQVNTRVJURUQgICAgICAgICAgICAgICAgICBCSVRfMTUKIAotCiAvKiBQQ0kgc3RhdGUgcmVnaXN0ZXIuICovCiAjZGVmaW5lIFQzX1BDSV9TVEFURV9SRUcgICAgICAgICAgICAgICAgICAgIDB4NzAKIApAQCAtNDE5LDE3ICs0MDksMTYgQEAKICNkZWZpbmUgVDNfUENJX1NUQVRFX0JVU19TUEVFRF9ISUdIICAgICAgICAgQklUXzMKICNkZWZpbmUgVDNfUENJX1NUQVRFXzMyQklUX1BDSV9CVVMgICAgICAgICAgQklUXzQKIAotCiAvKiBCcm9hZGNvbSBzdWJzeXN0ZW0vc3VidmVuZG9yIElEcy4gKi8KICNkZWZpbmUgVDNfU1ZJRF9CUk9BRENPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0ZTQKIAogI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwQTYgICAgICAgICAgICAgICAgIDB4MTY0NAogI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTUgICAgICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwVDYgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQkNNODAwMiAqLwotI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwQTkgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogQWdpbGVudCAqLworI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwVDYgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBCQ004MDAyICovCisjZGVmaW5lIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDBBOSAgICAgICAgICAgICAgICAgMHgwMDAzCS8qIEFnaWxlbnQgKi8KICNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMVQxICAgICAgICAgICAgICAgICAweDAwMDUKICNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMVQ4ICAgICAgICAgICAgICAgICAweDAwMDYKLSNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUE3ICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEFnaWxlbnQgKi8KKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUE3ICAgICAgICAgICAgICAgICAweDAwMDcJLyogQWdpbGVudCAqLwogI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTEwICAgICAgICAgICAgICAgIDB4MDAwOAogI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTEyICAgICAgICAgICAgICAgIDB4ODAwOAogI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAzQXgxICAgICAgICAgICAgICAgIDB4MDAwOQpAQCAtNDQ5LDcgKzQzOCw2IEBACiAjZGVmaW5lIFQzX1NTSURfM0NPTV8zQzk5NlNYICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA0CiAjZGVmaW5lIFQzX1NTSURfM0NPTV8zQzk5N1NYICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA1CiAKLQogLyogRGVsbCBzdWJzeXN0ZW0vc3VidmVuZG9yIElEcy4gKi8KIAogI2RlZmluZSBUM19TVklEX0RFTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAyOApAQCAtNDY5LDcgKzQ1Nyw2IEBACiAjZGVmaW5lIFQzX1NTSURfQ09NUEFRX05DNzc4MCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDg1CiAjZGVmaW5lIFQzX1NTSURfQ09NUEFRX05DNzc4MF8yICAgICAgICAgICAgICAgICAgICAgMHgwMDk5CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE1JSSByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDkwLDE0ICs0NzcsMTIgQEAKICNkZWZpbmUgUEhZX0NUUkxfTE9PUEJBQ0tfTU9ERSAgICAgICAgICAgICAgICAgICAgICBCSVRfMTQKICNkZWZpbmUgUEhZX0NUUkxfUEhZX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTUKIAotCiAvKiBTdGF0dXMgcmVnaXN0ZXIuICovCiAjZGVmaW5lIFBIWV9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQogCiAjZGVmaW5lIFBIWV9TVEFUVVNfTElOS19QQVNTICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKICNkZWZpbmUgUEhZX1NUQVRVU19BVVRPX05FR19DT01QTEVURSAgICAgICAgICAgICAgICBCSVRfNQogCi0KIC8qIFBoeSBJZCByZWdpc3RlcnMuICovCiAjZGVmaW5lIFBIWV9JRDFfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgogI2RlZmluZSBQSFlfSUQxX09VSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgpAQCAtNTA3LDcgKzQ5Miw2IEBACiAjZGVmaW5lIFBIWV9JRDJfTU9ERUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwM2YwCiAjZGVmaW5lIFBIWV9JRDJfT1VJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmYzAwCiAKLQogLyogQXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLiAqLwogI2RlZmluZSBQSFlfQU5fQURfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKIApAQCAtNTE5LDE4ICs1MDMsMTUgQEAKICNkZWZpbmUgUEhZX0FOX0FEXzEwMEJBU0VUWF9GVUxMICAgICAgICAgICAgICAgICAgICBCSVRfOAogI2RlZmluZSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRCAgICAgICAgICAgIDB4MDEKIAotCiAvKiBBdXRvLW5lZ290aWF0aW9uIExpbmsgUGFydG5lciBBYmlsaXR5IHJlZ2lzdGVyLiAqLwogI2RlZmluZSBQSFlfTElOS19QQVJUTkVSX0FCSUxJVFlfUkVHICAgICAgICAgICAgICAgIDB4MDUKIAogI2RlZmluZSBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0UgICAgICAgICAgICAgICAgIEJJVF8xMQogI2RlZmluZSBQSFlfTElOS19QQVJUTkVSX1BBVVNFX0NBUEFCTEUgICAgICAgICAgICAgIEJJVF8xMAogCi0KIC8qIEF1dG8tbmVnb3RpYXRpb24gZXhwYW5zaW9uIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBQSFlfQU5fRVhQQU5TSU9OX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQkNNNTQwMCBhbmQgQkNNNTQwMSBwaHkgaW5mby4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NTcsNyArNTM4LDYgQEAKICNkZWZpbmUgUEhZX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUEhZX0lEX09VSV9NQVNLIHwgICAgICBcCiAJCQkJCQkgICAgUEhZX0lEX01PREVMX01BU0spCiAKLQogI2RlZmluZSBVTktOT1dOX1BIWV9JRCh4KSAgICgoKCh4KSAmIFBIWV9JRF9NQVNLKSAhPSBQSFlfQkNNNTQwMF9QSFlfSUQpICYmIFwKIAkJCSAgICAoKCh4KSAmIFBIWV9JRF9NQVNLKSAhPSBQSFlfQkNNNTQwMV9QSFlfSUQpICYmIFwKIAkJCSAgICAoKCh4KSAmIFBIWV9JRF9NQVNLKSAhPSBQSFlfQkNNNTQxMV9QSFlfSUQpICYmIFwKQEAgLTU2Niw3ICs1NDYsNiBAQAogCQkJICAgICgoKHgpICYgUEhZX0lEX01BU0spICE9IFBIWV9CQ001NzA0X1BIWV9JRCkgJiYgXAogCQkJICAgICgoKHgpICYgUEhZX0lEX01BU0spICE9IFBIWV9CQ004MDAyX1BIWV9JRCkpCiAKLQogLyogMTAwMEJhc2UtVCBjb250cm9sIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRyAgICAgICAgICAgICAgICAgIDB4MDkKIApAQCAtNTc1LDcgKzU1NCw2IEBACiAjZGVmaW5lIEJDTTU0MFhfQ09ORklHX0FTX01BU1RFUiAgICAgICAgICAgICAgICAgICAgQklUXzExCiAjZGVmaW5lIEJDTTU0MFhfRU5BQkxFX0NPTkZJR19BU19NQVNURVIgICAgICAgICAgICAgQklUXzEyCiAKLQogLyogRXh0ZW5kZWQgY29udHJvbCByZWdpc3Rlci4gKi8KICNkZWZpbmUgQkNNNTQwWF9FWFRfQ1RSTF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDEwCiAKQEAgLTU4NywxMSArNTY1LDkgQEAKIAogI2RlZmluZSBCQ001NDBYX0VYVF9TVEFUVVNfTElOS19QQVNTICAgICAgICAgICAgICAgIEJJVF84CiAKLQogLyogRFNQIENvZWZmaWNpZW50IFJlYWQvV3JpdGUgUG9ydC4gKi8KICNkZWZpbmUgQkNNNTQwWF9EU1BfUldfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1CiAKLQogLyogRFNQIENvZWZpY2llbnQgQWRkcmVzcyBSZWdpc3Rlci4gKi8KICNkZWZpbmUgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcgICAgICAgICAgICAgICAgICAgICAweDE3CiAKQEAgLTYzMSw3ICs2MDcsNiBAQAogCiAjZGVmaW5lIEJDTTU0MFhfQ09OVFJPTF9BTExfQ0hBTk5FTFMgICAgICAgICAgICAgICAgQklUXzE1CiAKLQogLyogQXV4aWxsaWFyeSBDb250cm9sIFJlZ2lzdGVyIChTaGFkb3cgUmVnaXN0ZXIpICovCiAjZGVmaW5lIEJDTTU0MDFfQVVYX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOAogCkBAIC02NDQsNyArNjE5LDYgQEAKICNkZWZpbmUgQkNNNTQwMV9TSEFET1dfU0VMX01JU0NfVEVTVDIgICAgICAgICAgICAgICAweDA1CiAjZGVmaW5lIEJDTTU0MDFfU0hBRE9XX1NFTF9JUF9QSE9ORV9TRUVEICAgICAgICAgICAgMHgwNgogCi0KIC8qIFNoYWRvdyByZWdpc3RlciBzZWxlY3RvciA9PSAnMDAwJyAqLwogI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX0RJQUdfTU9ERSAgICAgICAgICAgICAgIEJJVF8zCiAjZGVmaW5lIEJDTTU0MDFfU0hEV19OT1JNQUxfRElTQUJMRV9NQlAgICAgICAgICAgICAgQklUXzQKQEAgLTY2NCw3ICs2MzgsNiBAQAogI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX0VYVF9QQUNLRVRfTEVOR1RIICAgICAgIEJJVF8xNAogI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX0VYVEVSTkFMX0xPT1BCQUNLICAgICAgIEJJVF8xNQogCi0KIC8qIEF1eGlsbGlhcnkgc3RhdHVzIHN1bW1hcnkuICovCiAjZGVmaW5lIEJDTTU0MFhfQVVYX1NUQVRVU19SRUcgICAgICAgICAgICAgICAgICAgICAgMHgxOQogCkBAIC02NzgsNyArNjUxLDYgQEAKICNkZWZpbmUgQkNNNTQwWF9BVVhfMTAwQkFTRVRfSEQgICAgICAgICAgICAgICAgICAgICAoQklUXzkgfCBCSVRfMTApCiAjZGVmaW5lIEJDTTU0MFhfQVVYXzEwMEJBU0VUX0ZEICAgICAgICAgICAgICAgICAgICAgKEJJVF84IHwgQklUXzkgfCBCSVRfMTApCiAKLQogLyogSW50ZXJydXB0IHN0YXR1cy4gKi8KICNkZWZpbmUgQkNNNTQwWF9JTlRfU1RBVFVTX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDFhCiAKQEAgLTY4NywxMSArNjU5LDkgQEAKICNkZWZpbmUgQkNNNTQwWF9JTlRfRFVQTEVYX0NIQU5HRSAgICAgICAgICAgICAgICAgICBCSVRfMwogI2RlZmluZSBCQ001NDBYX0lOVF9BVVRPX05FR19QQUdFX1JYICAgICAgICAgICAgICAgIEJJVF8xMAogCi0KIC8qIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBCQ001NDBYX0lOVF9NQVNLX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MWIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzAxLDkgKzY3MSw5IEBACiB0eXBlZGVmIHZvbGF0aWxlIExNX1VJTlQzMiBUM18zMkJJVF9SRUdJU1RFUiwgKlBUM18zMkJJVF9SRUdJU1RFUjsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIEJpZyBlbmRpYW4gZm9ybWF0LiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEhpZ2g7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTG93OworCS8qIEJpZyBlbmRpYW4gZm9ybWF0LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIEhpZ2g7CisJVDNfMzJCSVRfUkVHSVNURVIgTG93OwogfSBUM182NEJJVF9SRUdJU1RFUiwgKlBUM182NEJJVF9SRUdJU1RFUjsKIAogdHlwZWRlZiBUM182NEJJVF9SRUdJU1RFUiBUM182NEJJVF9IT1NUX0FERFIsICpQVDNfNjRCSVRfSE9TVF9BRERSOwpAQCAtNzExLDQ3ICs2ODEsNDQgQEAKICNkZWZpbmUgVDNfTlVNX09GX0RNQV9ERVNDICAgIDI1NgogI2RlZmluZSBUM19OVU1fT0ZfTUJVRiAgICAgICAgNzY4CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFQzXzY0QklUX1JFR0lTVEVSIGhvc3RfYWRkcjsKLSAgVDNfMzJCSVRfUkVHSVNURVIgbmljX21idWY7Ci0gIFQzXzE2QklUX1JFR0lTVEVSIGxlbjsKLSAgVDNfMTZCSVRfUkVHSVNURVIgY3FpZF9zcWlkOwotICBUM18zMkJJVF9SRUdJU1RFUiBmbGFnczsKLSAgVDNfMzJCSVRfUkVHSVNURVIgb3BhcXVlMTsKLSAgVDNfMzJCSVRfUkVHSVNURVIgb3BhcXVlMjsKLSAgVDNfMzJCSVRfUkVHSVNURVIgb3BhcXVlMzsKLX1UM19ETUFfREVTQywgKlBUM19ETUFfREVTQzsKLQordHlwZWRlZiBzdHJ1Y3QgeworCVQzXzY0QklUX1JFR0lTVEVSIGhvc3RfYWRkcjsKKwlUM18zMkJJVF9SRUdJU1RFUiBuaWNfbWJ1ZjsKKwlUM18xNkJJVF9SRUdJU1RFUiBsZW47CisJVDNfMTZCSVRfUkVHSVNURVIgY3FpZF9zcWlkOworCVQzXzMyQklUX1JFR0lTVEVSIGZsYWdzOworCVQzXzMyQklUX1JFR0lTVEVSIG9wYXF1ZTE7CisJVDNfMzJCSVRfUkVHSVNURVIgb3BhcXVlMjsKKwlUM18zMkJJVF9SRUdJU1RFUiBvcGFxdWUzOworfSBUM19ETUFfREVTQywgKlBUM19ETUFfREVTQzsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJpbmcgY29udHJvbCBibG9jay4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBIb3N0UmluZ0FkZHI7CisJVDNfNjRCSVRfUkVHSVNURVIgSG9zdFJpbmdBZGRyOwogCi0gICAgdW5pb24gewotCXN0cnVjdCB7CisJdW5pb24geworCQlzdHJ1Y3QgewogI2lmZGVmIEJJR19FTkRJQU5fSE9TVAotCSAgICBUM18xNkJJVF9SRUdJU1RFUiBNYXhMZW47Ci0JICAgIFQzXzE2QklUX1JFR0lTVEVSIEZsYWdzOwotI2Vsc2UgLyogQklHX0VORElBTl9IT1NUICovCi0JICAgIFQzXzE2QklUX1JFR0lTVEVSIEZsYWdzOwotCSAgICBUM18xNkJJVF9SRUdJU1RFUiBNYXhMZW47CisJCQlUM18xNkJJVF9SRUdJU1RFUiBNYXhMZW47CisJCQlUM18xNkJJVF9SRUdJU1RFUiBGbGFnczsKKyNlbHNlCQkJCS8qIEJJR19FTkRJQU5fSE9TVCAqLworCQkJVDNfMTZCSVRfUkVHSVNURVIgRmxhZ3M7CisJCQlUM18xNkJJVF9SRUdJU1RFUiBNYXhMZW47CiAjZW5kaWYKLQl9IHM7CisJCX0gczsKIAotCVQzXzMyQklUX1JFR0lTVEVSIE1heExlbl9GbGFnczsKLSAgICB9IHU7CisJCVQzXzMyQklUX1JFR0lTVEVSIE1heExlbl9GbGFnczsKKwl9IHU7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNSaW5nQWRkcjsKKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNSaW5nQWRkcjsKIH0gVDNfUkNCLCAqUFQzX1JDQjsKIAogI2RlZmluZSBUM19SQ0JfRkxBR19VU0VfRVhUX1JFQ1ZfQkQgICAgICAgICAgICAgICAgICAgICBCSVRfMAogI2RlZmluZSBUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTdGF0dXMgYmxvY2suICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzYzLDk4ICs3MzAsOTUgQEAKICNkZWZpbmUgVDNfU1RBVFVTX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICB2b2xhdGlsZSBMTV9VSU5UMzIgU3RhdHVzOwotICAgICNkZWZpbmUgU1RBVFVTX0JMT0NLX1VQREFURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBTVEFUVVNfQkxPQ0tfTElOS19DSEFOR0VEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFNUQVRVU19CTE9DS19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorCXZvbGF0aWxlIExNX1VJTlQzMiBTdGF0dXM7CisjZGVmaW5lIFNUQVRVU19CTE9DS19VUERBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBTVEFUVVNfQkxPQ0tfTElOS19DSEFOR0VEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgU1RBVFVTX0JMT0NLX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICB2b2xhdGlsZSBMTV9VSU5UMzIgU3RhdHVzVGFnOworCXZvbGF0aWxlIExNX1VJTlQzMiBTdGF0dXNUYWc7CiAKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmN2U3RkQ29uSWR4OwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSY3ZKdW1ib0NvbklkeDsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgUmN2U3RkQ29uSWR4OworCXZvbGF0aWxlIExNX1VJTlQxNiBSY3ZKdW1ib0NvbklkeDsKIAotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSZXNlcnZlZDI7Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IFJjdk1pbmlDb25JZHg7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFJlc2VydmVkMjsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgUmN2TWluaUNvbklkeDsKIAotICAgIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgTE1fVUlOVDE2IFNlbmRDb25JZHg7ICAgLyogU2VuZCBjb25zdW1lciBpbmRleC4gKi8KLQl2b2xhdGlsZSBMTV9VSU5UMTYgUmN2UHJvZElkeDsgICAvKiBSZWNlaXZlIHByb2R1Y2VyIGluZGV4LiAqLwotICAgIH0gSWR4WzE2XTsKLSNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSY3ZKdW1ib0NvbklkeDsKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmN2U3RkQ29uSWR4OworCXN0cnVjdCB7CisJCXZvbGF0aWxlIExNX1VJTlQxNiBTZW5kQ29uSWR4OwkvKiBTZW5kIGNvbnN1bWVyIGluZGV4LiAqLworCQl2b2xhdGlsZSBMTV9VSU5UMTYgUmN2UHJvZElkeDsJLyogUmVjZWl2ZSBwcm9kdWNlciBpbmRleC4gKi8KKwl9IElkeFsxNl07CisjZWxzZQkJCQkvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKwl2b2xhdGlsZSBMTV9VSU5UMTYgUmN2SnVtYm9Db25JZHg7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFJjdlN0ZENvbklkeDsKIAotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSY3ZNaW5pQ29uSWR4OwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSZXNlcnZlZDI7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFJjdk1pbmlDb25JZHg7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFJlc2VydmVkMjsKIAotICAgIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgTE1fVUlOVDE2IFJjdlByb2RJZHg7ICAgLyogUmVjZWl2ZSBwcm9kdWNlciBpbmRleC4gKi8KLQl2b2xhdGlsZSBMTV9VSU5UMTYgU2VuZENvbklkeDsgICAvKiBTZW5kIGNvbnN1bWVyIGluZGV4LiAqLwotICAgIH0gSWR4WzE2XTsKKwlzdHJ1Y3QgeworCQl2b2xhdGlsZSBMTV9VSU5UMTYgUmN2UHJvZElkeDsJLyogUmVjZWl2ZSBwcm9kdWNlciBpbmRleC4gKi8KKwkJdm9sYXRpbGUgTE1fVUlOVDE2IFNlbmRDb25JZHg7CS8qIFNlbmQgY29uc3VtZXIgaW5kZXguICovCisJfSBJZHhbMTZdOwogI2VuZGlmCiB9IFQzX1NUQVRVU19CTE9DSywgKlBUM19TVEFUVVNfQkxPQ0s7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzY0QklUX0hPU1RfQUREUiBIb3N0QWRkcjsKKwlUM182NEJJVF9IT1NUX0FERFIgSG9zdEFkZHI7CiAKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgSW5kZXg7Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IExlbjsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgSW5kZXg7CisJdm9sYXRpbGUgTE1fVUlOVDE2IExlbjsKIAotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBUeXBlOwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBGbGFnczsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgVHlwZTsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgRmxhZ3M7CiAKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgSXBDa3N1bTsKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVGNwVWRwQ2tzdW07CisJdm9sYXRpbGUgTE1fVUlOVDE2IElwQ2tzdW07CisJdm9sYXRpbGUgTE1fVUlOVDE2IFRjcFVkcENrc3VtOwogCi0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IEVycm9yRmxhZzsKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVmxhblRhZzsKLSNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBMZW47Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IEluZGV4OworCXZvbGF0aWxlIExNX1VJTlQxNiBFcnJvckZsYWc7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFZsYW5UYWc7CisjZWxzZQkJCQkvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKwl2b2xhdGlsZSBMTV9VSU5UMTYgTGVuOworCXZvbGF0aWxlIExNX1VJTlQxNiBJbmRleDsKIAotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBGbGFnczsKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVHlwZTsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgRmxhZ3M7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFR5cGU7CiAKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVGNwVWRwQ2tzdW07Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IElwQ2tzdW07CisJdm9sYXRpbGUgTE1fVUlOVDE2IFRjcFVkcENrc3VtOworCXZvbGF0aWxlIExNX1VJTlQxNiBJcENrc3VtOwogCi0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IFZsYW5UYWc7Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IEVycm9yRmxhZzsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgVmxhblRhZzsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgRXJyb3JGbGFnOwogI2VuZGlmCiAKLSAgICB2b2xhdGlsZSBMTV9VSU5UMzIgUmVzZXJ2ZWQ7Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDMyIE9wYXF1ZTsKKwl2b2xhdGlsZSBMTV9VSU5UMzIgUmVzZXJ2ZWQ7CisJdm9sYXRpbGUgTE1fVUlOVDMyIE9wYXF1ZTsKIH0gVDNfUkNWX0JELCAqUFQzX1JDVl9CRDsKIAotCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfNjRCSVRfSE9TVF9BRERSIEhvc3RBZGRyWzNdOworCVQzXzY0QklUX0hPU1RfQUREUiBIb3N0QWRkclszXTsKIAogI2lmZGVmIEJJR19FTkRJQU5fSE9TVAotICAgIExNX1VJTlQxNiBMZW4xOwotICAgIExNX1VJTlQxNiBMZW4yOworCUxNX1VJTlQxNiBMZW4xOworCUxNX1VJTlQxNiBMZW4yOwogCi0gICAgTE1fVUlOVDE2IExlbjM7Ci0gICAgTE1fVUlOVDE2IFJlc2VydmVkMTsKLSNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLwotICAgIExNX1VJTlQxNiBMZW4yOwotICAgIExNX1VJTlQxNiBMZW4xOworCUxNX1VJTlQxNiBMZW4zOworCUxNX1VJTlQxNiBSZXNlcnZlZDE7CisjZWxzZQkJCQkvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKwlMTV9VSU5UMTYgTGVuMjsKKwlMTV9VSU5UMTYgTGVuMTsKIAotICAgIExNX1VJTlQxNiBSZXNlcnZlZDE7Ci0gICAgTE1fVUlOVDE2IExlbjM7CisJTE1fVUlOVDE2IFJlc2VydmVkMTsKKwlMTV9VSU5UMTYgTGVuMzsKICNlbmRpZgogCi0gICAgVDNfUkNWX0JEIFN0ZFJjdkJkOworCVQzX1JDVl9CRCBTdGRSY3ZCZDsKIH0gVDNfRVhUX1JDVl9CRCwgKlBUM19FWFRfUkNWX0JEOwogCi0KIC8qIEVycm9yIGZsYWdzLiAqLwogI2RlZmluZSBSQ1ZfQkRfRVJSX0JBRF9DUkMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBSQ1ZfQkRfRVJSX0NPTExfREVURUNUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgpAQCAtODY2LDcgKzgzMCw2IEBACiAjZGVmaW5lIFJDVl9CRF9FUlJfVFJVTkNfTk9fUkVTT1VSQ0VTICAgICAgICAgICAgICAgMHgwMDgwCiAjZGVmaW5lIFJDVl9CRF9FUlJfR0lBTlRfRlJBTUVfUkNWRCAgICAgICAgICAgICAgICAgMHgwMTAwCiAKLQogLyogQnVmZmVyIGRlc2NyaXB0b3IgZmxhZ3MuICovCiAjZGVmaW5lIFJDVl9CRF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CiAjZGVmaW5lIFJDVl9CRF9GTEFHX0pVTUJPX1JJTkcgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCkBAIC04NzcsNDQgKzg0MCw0MiBAQAogI2RlZmluZSBSQ1ZfQkRfRkxBR19UQ1BfVURQX0NIS1NVTV9GSUVMRCAgICAgICAgICAgIDB4MjAwMAogI2RlZmluZSBSQ1ZfQkRfRkxBR19UQ1BfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTZW5kIGJ1ZmZlciBkZXNjcmlwdG9yLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzY0QklUX0hPU1RfQUREUiBIb3N0QWRkcjsKKwlUM182NEJJVF9IT1NUX0FERFIgSG9zdEFkZHI7CiAKLSAgICB1bmlvbiB7Ci0Jc3RydWN0IHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0JICAgIExNX1VJTlQxNiBMZW47Ci0JICAgIExNX1VJTlQxNiBGbGFnczsKLSNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLwotCSAgICBMTV9VSU5UMTYgRmxhZ3M7Ci0JICAgIExNX1VJTlQxNiBMZW47CisJCQlMTV9VSU5UMTYgTGVuOworCQkJTE1fVUlOVDE2IEZsYWdzOworI2Vsc2UJCQkJLyogQklHX0VORElBTl9IT1NUICovCisJCQlMTV9VSU5UMTYgRmxhZ3M7CisJCQlMTV9VSU5UMTYgTGVuOwogI2VuZGlmCi0JfSBzMTsKKwkJfSBzMTsKIAotCUxNX1VJTlQzMiBMZW5fRmxhZ3M7Ci0gICAgfSB1MTsKKwkJTE1fVUlOVDMyIExlbl9GbGFnczsKKwl9IHUxOwogCi0gICAgdW5pb24gewotCXN0cnVjdCB7CisJdW5pb24geworCQlzdHJ1Y3QgewogI2lmZGVmIEJJR19FTkRJQU5fSE9TVAotCSAgICBMTV9VSU5UMTYgUmVzZXJ2ZWQ7Ci0JICAgIExNX1VJTlQxNiBWbGFuVGFnOwotI2Vsc2UgLyogQklHX0VORElBTl9IT1NUICovCi0JICAgIExNX1VJTlQxNiBWbGFuVGFnOwotCSAgICBMTV9VSU5UMTYgUmVzZXJ2ZWQ7CisJCQlMTV9VSU5UMTYgUmVzZXJ2ZWQ7CisJCQlMTV9VSU5UMTYgVmxhblRhZzsKKyNlbHNlCQkJCS8qIEJJR19FTkRJQU5fSE9TVCAqLworCQkJTE1fVUlOVDE2IFZsYW5UYWc7CisJCQlMTV9VSU5UMTYgUmVzZXJ2ZWQ7CiAjZW5kaWYKLQl9IHMyOworCQl9IHMyOwogCi0JTE1fVUlOVDMyIFZsYW5UYWc7Ci0gICAgfSB1MjsKKwkJTE1fVUlOVDMyIFZsYW5UYWc7CisJfSB1MjsKIH0gVDNfU05EX0JELCAqUFQzX1NORF9CRDsKIAotCiAvKiBTZW5kIGJ1ZmZlciBkZXNjcmlwdG9yIGZsYWdzLiAqLwogI2RlZmluZSBTTkRfQkRfRkxBR19UQ1BfVURQX0NLU1VNICAgICAgICAgICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBTTkRfQkRfRkxBR19JUF9DS1NVTSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgpAQCAtOTMyLDQzNSArODkzLDQyNiBAQAogLyogTUJVRnMgKi8KIHR5cGVkZWYgc3RydWN0IFQzX01CVUZfRlJBTUVfREVTQyB7CiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0gIExNX1VJTlQzMiBzdGF0dXNfY29udHJvbDsKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBMTV9VSU5UOCBjcWlkOwotICAgICAgTE1fVUlOVDggcmVzZXJ2ZWQxOwotICAgICAgTE1fVUlOVDE2IGxlbmd0aDsKLSAgICB9czE7Ci0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11MTsKLSAgdW5pb24gewotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIExNX1VJTlQxNiBpcF9oZHJfc3RhcnQ7Ci0gICAgICBMTV9VSU5UMTYgdGNwX3VkcF9oZHJfc3RhcnQ7Ci0gICAgfXMyOworCUxNX1VJTlQzMiBzdGF0dXNfY29udHJvbDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UOCBjcWlkOworCQkJTE1fVUlOVDggcmVzZXJ2ZWQxOworCQkJTE1fVUlOVDE2IGxlbmd0aDsKKwkJfSBzMTsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1MTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgaXBfaGRyX3N0YXJ0OworCQkJTE1fVUlOVDE2IHRjcF91ZHBfaGRyX3N0YXJ0OworCQl9IHMyOwogCi0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11MjsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1MjsKIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiBkYXRhX3N0YXJ0OwotICAgICAgTE1fVUlOVDE2IHZsYW5faWQ7Ci0gICAgfXMzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQxNiBkYXRhX3N0YXJ0OworCQkJTE1fVUlOVDE2IHZsYW5faWQ7CisJCX0gczM7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXUzOworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHUzOwogCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDE2IGlwX2NoZWNrc3VtOwotICAgICAgTE1fVUlOVDE2IHRjcF91ZHBfY2hlY2tzdW07Ci0gICAgfXM0OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQxNiBpcF9jaGVja3N1bTsKKwkJCUxNX1VJTlQxNiB0Y3BfdWRwX2NoZWNrc3VtOworCQl9IHM0OwogCi0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11NDsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1NDsKIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiBwc2V1ZG9fY2hlY2tzdW07Ci0gICAgICBMTV9VSU5UMTYgY2hlY2tzdW1fc3RhdHVzOwotICAgIH1zNTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgcHNldWRvX2NoZWNrc3VtOworCQkJTE1fVUlOVDE2IGNoZWNrc3VtX3N0YXR1czsKKwkJfSBzNTsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTU7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTU7CiAKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBMTV9VSU5UMTYgcnVsZV9tYXRjaDsKLSAgICAgIExNX1VJTlQ4IGNsYXNzOwotICAgICAgTE1fVUlOVDggcnVwdDsKLSAgICB9czY7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDE2IHJ1bGVfbWF0Y2g7CisJCQlMTV9VSU5UOCBjbGFzczsKKwkJCUxNX1VJTlQ4IHJ1cHQ7CisJCX0gczY7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXU2OworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHU2OwogCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDE2IHJlc2VydmVkMjsKLSAgICAgIExNX1VJTlQxNiBtYnVmX251bTsKLSAgICB9czc7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDE2IHJlc2VydmVkMjsKKwkJCUxNX1VJTlQxNiBtYnVmX251bTsKKwkJfSBzNzsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTc7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTc7CiAKLSAgTE1fVUlOVDMyIHJlc2VydmVkMzsKLSAgTE1fVUlOVDMyIHJlc2VydmVkNDsKKwlMTV9VSU5UMzIgcmVzZXJ2ZWQzOworCUxNX1VJTlQzMiByZXNlcnZlZDQ7CiAjZWxzZQotICBMTV9VSU5UMzIgc3RhdHVzX2NvbnRyb2w7Ci0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDE2IGxlbmd0aDsKLSAgICAgIExNX1VJTlQ4ICByZXNlcnZlZDE7Ci0gICAgICBMTV9VSU5UOCAgY3FpZDsKLSAgICB9czE7Ci0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11MTsKLSAgdW5pb24gewotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIExNX1VJTlQxNiB0Y3BfdWRwX2hkcl9zdGFydDsKLSAgICAgIExNX1VJTlQxNiBpcF9oZHJfc3RhcnQ7Ci0gICAgfXMyOworCUxNX1VJTlQzMiBzdGF0dXNfY29udHJvbDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgbGVuZ3RoOworCQkJTE1fVUlOVDggcmVzZXJ2ZWQxOworCQkJTE1fVUlOVDggY3FpZDsKKwkJfSBzMTsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1MTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgdGNwX3VkcF9oZHJfc3RhcnQ7CisJCQlMTV9VSU5UMTYgaXBfaGRyX3N0YXJ0OworCQl9IHMyOwogCi0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11MjsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1MjsKIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiB2bGFuX2lkOwotICAgICAgTE1fVUlOVDE2IGRhdGFfc3RhcnQ7Ci0gICAgfXMzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQxNiB2bGFuX2lkOworCQkJTE1fVUlOVDE2IGRhdGFfc3RhcnQ7CisJCX0gczM7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXUzOworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHUzOwogCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDE2IHRjcF91ZHBfY2hlY2tzdW07Ci0gICAgICBMTV9VSU5UMTYgaXBfY2hlY2tzdW07Ci0gICAgfXM0OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQxNiB0Y3BfdWRwX2NoZWNrc3VtOworCQkJTE1fVUlOVDE2IGlwX2NoZWNrc3VtOworCQl9IHM0OwogCi0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11NDsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1NDsKIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiBjaGVja3N1bV9zdGF0dXM7Ci0gICAgICBMTV9VSU5UMTYgcHNldWRvX2NoZWNrc3VtOwotICAgIH1zNTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgY2hlY2tzdW1fc3RhdHVzOworCQkJTE1fVUlOVDE2IHBzZXVkb19jaGVja3N1bTsKKwkJfSBzNTsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTU7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTU7CiAKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBMTV9VSU5UOCBydXB0OwotICAgICAgTE1fVUlOVDggY2xhc3M7Ci0gICAgICBMTV9VSU5UMTYgcnVsZV9tYXRjaDsKLSAgICB9czY7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDggcnVwdDsKKwkJCUxNX1VJTlQ4IGNsYXNzOworCQkJTE1fVUlOVDE2IHJ1bGVfbWF0Y2g7CisJCX0gczY7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXU2OworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHU2OwogCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDE2IG1idWZfbnVtOwotICAgICAgTE1fVUlOVDE2IHJlc2VydmVkMjsKLSAgICB9czc7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDE2IG1idWZfbnVtOworCQkJTE1fVUlOVDE2IHJlc2VydmVkMjsKKwkJfSBzNzsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTc7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTc7CiAKLSAgTE1fVUlOVDMyIHJlc2VydmVkMzsKLSAgTE1fVUlOVDMyIHJlc2VydmVkNDsKKwlMTV9VSU5UMzIgcmVzZXJ2ZWQzOworCUxNX1VJTlQzMiByZXNlcnZlZDQ7CiAjZW5kaWYKLX1UM19NQlVGX0ZSQU1FX0RFU0MsKlBUM19NQlVGX0ZSQU1FX0RFU0M7Cit9IFQzX01CVUZfRlJBTUVfREVTQywgKlBUM19NQlVGX0ZSQU1FX0RFU0M7CiAKIHR5cGVkZWYgc3RydWN0IFQzX01CVUZfSERSIHsKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICB1bnNpZ25lZCBpbnQgQzoxOwotICAgICAgdW5zaWduZWQgaW50IEY6MTsKLSAgICAgIHVuc2lnbmVkIGludCByZXNlcnZlZDE6NzsKLSAgICAgIHVuc2lnbmVkIGludCBuZXh0X21idWY6MTY7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOjc7Ci0gICAgfXMxOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGludCBDOjE7CisJCQl1bnNpZ25lZCBpbnQgRjoxOworCQkJdW5zaWduZWQgaW50IHJlc2VydmVkMTo3OworCQkJdW5zaWduZWQgaW50IG5leHRfbWJ1ZjoxNjsKKwkJCXVuc2lnbmVkIGludCBsZW5ndGg6NzsKKwkJfSBzMTsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTE7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTE7CiAKLSAgTE1fVUlOVDMyIG5leHRfZnJhbWVfcHRyOwotfVQzX01CVUZfSERSLCAqUFQzX01CVUZfSERSOworCUxNX1VJTlQzMiBuZXh0X2ZyYW1lX3B0cjsKK30gVDNfTUJVRl9IRFIsICpQVDNfTUJVRl9IRFI7CiAKLXR5cGVkZWYgc3RydWN0IFQzX01CVUYKLXsKLSAgVDNfTUJVRl9IRFIgaGRyOwotICB1bmlvbgotICB7Ci0gICAgc3RydWN0IHsKLSAgICAgIFQzX01CVUZfRlJBTUVfREVTQyBmcmFtZV9oZHI7Ci0gICAgICBMTV9VSU5UMzIgZGF0YVsyMF07Ci0gICAgfXMxOwordHlwZWRlZiBzdHJ1Y3QgVDNfTUJVRiB7CisJVDNfTUJVRl9IRFIgaGRyOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCVQzX01CVUZfRlJBTUVfREVTQyBmcmFtZV9oZHI7CisJCQlMTV9VSU5UMzIgZGF0YVsyMF07CisJCX0gczE7CiAKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDMyIGRhdGFbMzBdOwotICAgIH1zMjsKLSAgfWJvZHk7Ci19VDNfTUJVRiwgKlBUM19NQlVGOworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDMyIGRhdGFbMzBdOworCQl9IHMyOworCX0gYm9keTsKK30gVDNfTUJVRiwgKlBUM19NQlVGOwogCiAjZGVmaW5lIFQzX01CVUZfQkFTRSAgIChUM19OSUNfTUJVRl9QT09MX0FERFIgPj4gNykKICNkZWZpbmUgVDNfTUJVRl9FTkQgICAgKChUM19OSUNfTUJVRl9QT09MX0FERFIgKyBUM19OSUNfTUJVRl9QT09MX1NJWkUpID4+IDcpCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFN0YXRpc3RpY3MgYmxvY2suICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgTE1fVUlOVDggUmVzZXJ2ZWQwWzB4NDAwLTB4MzAwXTsKKwlMTV9VSU5UOCBSZXNlcnZlZDBbMHg0MDAgLSAweDMwMF07CiAKLSAgICAvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBNQUMuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgaWZIQ0luT2N0ZXRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFJlc2VydmVkMTsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzRnJhZ21lbnRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENJblVjYXN0UGt0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBpZkhDSW5NdWx0aWNhc3RQa3RzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENJbkJyb2FkY2FzdFBrdHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzRkNTRXJyb3JzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0FsaWdubWVudEVycm9yczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiB4b25QYXVzZUZyYW1lc1JlY2VpdmVkOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIHhvZmZQYXVzZUZyYW1lc1JlY2VpdmVkOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG1hY0NvbnRyb2xGcmFtZXNSZWNlaXZlZDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiB4b2ZmU3RhdGVFbnRlcmVkOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0ZyYW1lc1Rvb0xvbmc7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c0phYmJlcnM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1VuZGVyc2l6ZVBrdHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgaW5SYW5nZUxlbmd0aEVycm9yOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG91dFJhbmdlTGVuZ3RoRXJyb3I7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM2NE9jdGV0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czY1T2N0ZXRzdG8xMjdPY3RldHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHMxMjhPY3RldHN0bzI1NU9jdGV0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czI1Nk9jdGV0c3RvNTExT2N0ZXRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzNTEyT2N0ZXRzdG8xMDIzT2N0ZXRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMTAyNE9jdGV0c3RvMTUyMk9jdGV0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czE1MjNPY3RldHN0bzIwNDdPY3RldHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHMyMDQ4T2N0ZXRzdG80MDk1T2N0ZXRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzNDA5Nk9jdGV0c3RvODE5MU9jdGV0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czgxOTJPY3RldHN0bzkwMjJPY3RldHM7CisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFJlY2VpdmUgTUFDLiAqLworCVQzXzY0QklUX1JFR0lTVEVSIGlmSENJbk9jdGV0czsKKwlUM182NEJJVF9SRUdJU1RFUiBSZXNlcnZlZDE7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c0ZyYWdtZW50czsKKwlUM182NEJJVF9SRUdJU1RFUiBpZkhDSW5VY2FzdFBrdHM7CisJVDNfNjRCSVRfUkVHSVNURVIgaWZIQ0luTXVsdGljYXN0UGt0czsKKwlUM182NEJJVF9SRUdJU1RFUiBpZkhDSW5Ccm9hZGNhc3RQa3RzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0ZDU0Vycm9yczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNBbGlnbm1lbnRFcnJvcnM7CisJVDNfNjRCSVRfUkVHSVNURVIgeG9uUGF1c2VGcmFtZXNSZWNlaXZlZDsKKwlUM182NEJJVF9SRUdJU1RFUiB4b2ZmUGF1c2VGcmFtZXNSZWNlaXZlZDsKKwlUM182NEJJVF9SRUdJU1RFUiBtYWNDb250cm9sRnJhbWVzUmVjZWl2ZWQ7CisJVDNfNjRCSVRfUkVHSVNURVIgeG9mZlN0YXRlRW50ZXJlZDsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNGcmFtZXNUb29Mb25nOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNKYWJiZXJzOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNVbmRlcnNpemVQa3RzOworCVQzXzY0QklUX1JFR0lTVEVSIGluUmFuZ2VMZW5ndGhFcnJvcjsKKwlUM182NEJJVF9SRUdJU1RFUiBvdXRSYW5nZUxlbmd0aEVycm9yOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzNjRPY3RldHM7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM2NU9jdGV0c3RvMTI3T2N0ZXRzOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMTI4T2N0ZXRzdG8yNTVPY3RldHM7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHMyNTZPY3RldHN0bzUxMU9jdGV0czsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czUxMk9jdGV0c3RvMTAyM09jdGV0czsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czEwMjRPY3RldHN0bzE1MjJPY3RldHM7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHMxNTIzT2N0ZXRzdG8yMDQ3T2N0ZXRzOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMjA0OE9jdGV0c3RvNDA5NU9jdGV0czsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czQwOTZPY3RldHN0bzgxOTFPY3RldHM7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM4MTkyT2N0ZXRzdG85MDIyT2N0ZXRzOwogCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgVW51c2VkMVszN107CisJVDNfNjRCSVRfUkVHSVNURVIgVW51c2VkMVszN107CiAKLSAgICAvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgVHJhbnNtaXQgTUFDLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENPdXRPY3RldHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgUmVzZXJ2ZWQyOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNDb2xsaXNpb25zOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG91dFhvblNlbnQ7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgb3V0WG9mZlNlbnQ7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZmxvd0NvbnRyb2xEb25lOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0ludGVybmFsTWFjVHJhbnNtaXRFcnJvcnM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzU2luZ2xlQ29sbGlzaW9uRnJhbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c011bHRpcGxlQ29sbGlzaW9uRnJhbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0RlZmVycmVkVHJhbnNtaXNzaW9uczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBSZXNlcnZlZDM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzRXhjZXNzaXZlQ29sbGlzaW9uczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNMYXRlQ29sbGlzaW9uczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQyVGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkM1RpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDRUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ1VGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkNlRpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDdUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ4VGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkOVRpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDEwVGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTFUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxMlRpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDEzVGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTRUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxNVRpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENPdXRVY2FzdFBrdHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgaWZIQ091dE11bHRpY2FzdFBrdHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgaWZIQ091dEJyb2FkY2FzdFBrdHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzQ2FycmllclNlbnNlRXJyb3JzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmT3V0RGlzY2FyZHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgaWZPdXRFcnJvcnM7CisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFRyYW5zbWl0IE1BQy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBpZkhDT3V0T2N0ZXRzOworCVQzXzY0QklUX1JFR0lTVEVSIFJlc2VydmVkMjsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzQ29sbGlzaW9uczsKKwlUM182NEJJVF9SRUdJU1RFUiBvdXRYb25TZW50OworCVQzXzY0QklUX1JFR0lTVEVSIG91dFhvZmZTZW50OworCVQzXzY0QklUX1JFR0lTVEVSIGZsb3dDb250cm9sRG9uZTsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNJbnRlcm5hbE1hY1RyYW5zbWl0RXJyb3JzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c1NpbmdsZUNvbGxpc2lvbkZyYW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNNdWx0aXBsZUNvbGxpc2lvbkZyYW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNEZWZlcnJlZFRyYW5zbWlzc2lvbnM7CisJVDNfNjRCSVRfUkVHSVNURVIgUmVzZXJ2ZWQzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0V4Y2Vzc2l2ZUNvbGxpc2lvbnM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzTGF0ZUNvbGxpc2lvbnM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMlRpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDNUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ0VGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkNVRpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDZUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ3VGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkOFRpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDlUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxMFRpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDExVGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTJUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxM1RpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDE0VGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTVUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBpZkhDT3V0VWNhc3RQa3RzOworCVQzXzY0QklUX1JFR0lTVEVSIGlmSENPdXRNdWx0aWNhc3RQa3RzOworCVQzXzY0QklUX1JFR0lTVEVSIGlmSENPdXRCcm9hZGNhc3RQa3RzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0NhcnJpZXJTZW5zZUVycm9yczsKKwlUM182NEJJVF9SRUdJU1RFUiBpZk91dERpc2NhcmRzOworCVQzXzY0QklUX1JFR0lTVEVSIGlmT3V0RXJyb3JzOwogCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgVW51c2VkMlszMV07CisJVDNfNjRCSVRfUkVHSVNURVIgVW51c2VkMlszMV07CiAKLSAgICAvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBMaXN0IFBsYWNlbWVudC4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBDT1NJZkhDSW5Qa3RzWzE2XTsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBDT1NGcmFtZXNEcm9wcGVkRHVlVG9GaWx0ZXJzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVdyaXRlUXVldWVGdWxsOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVdyaXRlSGlnaFByaVF1ZXVlRnVsbDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNOb01vcmVSeEJEczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBpZkluRGlzY2FyZHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgaWZJbkVycm9yczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNSZWN2VGhyZXNob2xkSGl0OworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIExpc3QgUGxhY2VtZW50LiAqLworCVQzXzY0QklUX1JFR0lTVEVSIENPU0lmSENJblBrdHNbMTZdOworCVQzXzY0QklUX1JFR0lTVEVSIENPU0ZyYW1lc0Ryb3BwZWREdWVUb0ZpbHRlcnM7CisJVDNfNjRCSVRfUkVHSVNURVIgbmljRG1hV3JpdGVRdWV1ZUZ1bGw7CisJVDNfNjRCSVRfUkVHSVNURVIgbmljRG1hV3JpdGVIaWdoUHJpUXVldWVGdWxsOworCVQzXzY0QklUX1JFR0lTVEVSIG5pY05vTW9yZVJ4QkRzOworCVQzXzY0QklUX1JFR0lTVEVSIGlmSW5EaXNjYXJkczsKKwlUM182NEJJVF9SRUdJU1RFUiBpZkluRXJyb3JzOworCVQzXzY0QklUX1JFR0lTVEVSIG5pY1JlY3ZUaHJlc2hvbGRIaXQ7CiAKLSAgICBUM182NEJJVF9SRUdJU1RFUiBVbnVzZWQzWzldOworCVQzXzY0QklUX1JFR0lTVEVSIFVudXNlZDNbOV07CiAKLSAgICAvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgU2VuZCBEYXRhIEluaXRpYXRvci4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBDT1NJZkhDT3V0UGt0c1sxNl07Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljRG1hUmVhZFF1ZXVlRnVsbDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNEbWFSZWFkSGlnaFByaVF1ZXVlRnVsbDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNTZW5kRGF0YUNvbXBRdWV1ZUZ1bGw7CisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFNlbmQgRGF0YSBJbml0aWF0b3IuICovCisJVDNfNjRCSVRfUkVHSVNURVIgQ09TSWZIQ091dFBrdHNbMTZdOworCVQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVJlYWRRdWV1ZUZ1bGw7CisJVDNfNjRCSVRfUkVHSVNURVIgbmljRG1hUmVhZEhpZ2hQcmlRdWV1ZUZ1bGw7CisJVDNfNjRCSVRfUkVHSVNURVIgbmljU2VuZERhdGFDb21wUXVldWVGdWxsOwogCi0gICAgLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IEhvc3QgQ29hbGVzY2luZy4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNSaW5nU2V0U2VuZFByb2RJbmRleDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNSaW5nU3RhdHVzVXBkYXRlOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0ludGVycnVwdHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljQXZvaWRlZEludGVycnVwdHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljU2VuZFRocmVzaG9sZEhpdDsKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgSG9zdCBDb2FsZXNjaW5nLiAqLworCVQzXzY0QklUX1JFR0lTVEVSIG5pY1JpbmdTZXRTZW5kUHJvZEluZGV4OworCVQzXzY0QklUX1JFR0lTVEVSIG5pY1JpbmdTdGF0dXNVcGRhdGU7CisJVDNfNjRCSVRfUkVHSVNURVIgbmljSW50ZXJydXB0czsKKwlUM182NEJJVF9SRUdJU1RFUiBuaWNBdm9pZGVkSW50ZXJydXB0czsKKwlUM182NEJJVF9SRUdJU1RFUiBuaWNTZW5kVGhyZXNob2xkSGl0OwogCi0gICAgTE1fVUlOVDggUmVzZXJ2ZWQ0WzB4YjAwLTB4OWMwXTsKKwlMTV9VSU5UOCBSZXNlcnZlZDRbMHhiMDAgLSAweDljMF07CiB9IFQzX1NUQVRTX0JMT0NLLCAqUFQzX1NUQVRTX0JMT0NLOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMTZCSVRfUkVHSVNURVIgVmVuZG9ySWQ7Ci0gICAgVDNfMTZCSVRfUkVHSVNURVIgRGV2aWNlSWQ7CisJVDNfMTZCSVRfUkVHSVNURVIgVmVuZG9ySWQ7CisJVDNfMTZCSVRfUkVHSVNURVIgRGV2aWNlSWQ7CiAKLSAgICBUM18xNkJJVF9SRUdJU1RFUiBDb21tYW5kOwotICAgIFQzXzE2QklUX1JFR0lTVEVSIFN0YXR1czsKKwlUM18xNkJJVF9SRUdJU1RFUiBDb21tYW5kOworCVQzXzE2QklUX1JFR0lTVEVSIFN0YXR1czsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIENsYXNzQ29kZVJldklkOworCVQzXzMyQklUX1JFR0lTVEVSIENsYXNzQ29kZVJldklkOwogCi0gICAgVDNfOEJJVF9SRUdJU1RFUiBDYWNoZUxpbmVTaXplOwotICAgIFQzXzhCSVRfUkVHSVNURVIgTGF0ZW5jeVRpbWVyOwotICAgIFQzXzhCSVRfUkVHSVNURVIgSGVhZGVyVHlwZTsKLSAgICBUM184QklUX1JFR0lTVEVSIEJpc3Q7CisJVDNfOEJJVF9SRUdJU1RFUiBDYWNoZUxpbmVTaXplOworCVQzXzhCSVRfUkVHSVNURVIgTGF0ZW5jeVRpbWVyOworCVQzXzhCSVRfUkVHSVNURVIgSGVhZGVyVHlwZTsKKwlUM184QklUX1JFR0lTVEVSIEJpc3Q7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNZW1CYXNlQWRkckxvdzsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNZW1CYXNlQWRkckhpZ2g7CisJVDNfMzJCSVRfUkVHSVNURVIgTWVtQmFzZUFkZHJMb3c7CisJVDNfMzJCSVRfUkVHSVNURVIgTWVtQmFzZUFkZHJIaWdoOwogCi0gICAgTE1fVUlOVDggVW51c2VkMVsyMF07CisJTE1fVUlOVDggVW51c2VkMVsyMF07CiAKLSAgICBUM18xNkJJVF9SRUdJU1RFUiBTdWJzeXN0ZW1WZW5kb3JJZDsKLSAgICBUM18xNkJJVF9SRUdJU1RFUiBTdWJzeXN0ZW1JZDsKKwlUM18xNkJJVF9SRUdJU1RFUiBTdWJzeXN0ZW1WZW5kb3JJZDsKKwlUM18xNkJJVF9SRUdJU1RFUiBTdWJzeXN0ZW1JZDsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJvbUJhc2VBZGRyOworCVQzXzMyQklUX1JFR0lTVEVSIFJvbUJhc2VBZGRyOwogCi0gICAgVDNfOEJJVF9SRUdJU1RFUiBQY2lYQ2FwaWJsaXR5UHRyOwotICAgIExNX1VJTlQ4IFVudXNlZDJbN107CisJVDNfOEJJVF9SRUdJU1RFUiBQY2lYQ2FwaWJsaXR5UHRyOworCUxNX1VJTlQ4IFVudXNlZDJbN107CiAKLSAgICBUM184QklUX1JFR0lTVEVSIEludExpbmU7Ci0gICAgVDNfOEJJVF9SRUdJU1RFUiBJbnRQaW47Ci0gICAgVDNfOEJJVF9SRUdJU1RFUiBNaW5HbnQ7Ci0gICAgVDNfOEJJVF9SRUdJU1RFUiBNYXhMYXQ7CisJVDNfOEJJVF9SRUdJU1RFUiBJbnRMaW5lOworCVQzXzhCSVRfUkVHSVNURVIgSW50UGluOworCVQzXzhCSVRfUkVHSVNURVIgTWluR250OworCVQzXzhCSVRfUkVHSVNURVIgTWF4TGF0OwogCi0gICAgVDNfOEJJVF9SRUdJU1RFUiBQY2lYQ2FwYWJpbGl0aWVzOwotICAgIFQzXzhCSVRfUkVHSVNURVIgUG1DYXBhYmlsaXR5UHRyOwotICAgIFQzXzE2QklUX1JFR0lTVEVSIFBjaVhDb21tYW5kOworCVQzXzhCSVRfUkVHSVNURVIgUGNpWENhcGFiaWxpdGllczsKKwlUM184QklUX1JFR0lTVEVSIFBtQ2FwYWJpbGl0eVB0cjsKKwlUM18xNkJJVF9SRUdJU1RFUiBQY2lYQ29tbWFuZDsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFBjaVhTdGF0dXM7CisJVDNfMzJCSVRfUkVHSVNURVIgUGNpWFN0YXR1czsKIAotICAgIFQzXzhCSVRfUkVHSVNURVIgUG1DYXBhYmlsaXR5SWQ7Ci0gICAgVDNfOEJJVF9SRUdJU1RFUiBWcGRDYXBhYmlsaXR5UHRyOwotICAgIFQzXzE2QklUX1JFR0lTVEVSIFBtQ2FwYWJpbGl0aWVzOworCVQzXzhCSVRfUkVHSVNURVIgUG1DYXBhYmlsaXR5SWQ7CisJVDNfOEJJVF9SRUdJU1RFUiBWcGRDYXBhYmlsaXR5UHRyOworCVQzXzE2QklUX1JFR0lTVEVSIFBtQ2FwYWJpbGl0aWVzOwogCi0gICAgVDNfMTZCSVRfUkVHSVNURVIgUG1DdHJsU3RhdHVzOwotICAgICNkZWZpbmUgUE1fQ1RSTF9QTUVfU1RBVFVTICAgICAgICAgICAgQklUXzE1Ci0gICAgI2RlZmluZSBQTV9DVFJMX1BNRV9FTkFCTEUgICAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgUE1fQ1RSTF9QTUVfUE9XRVJfU1RBVEVfRDAgICAgMAotICAgICNkZWZpbmUgUE1fQ1RSTF9QTUVfUE9XRVJfU1RBVEVfRDEgICAgMQotICAgICNkZWZpbmUgUE1fQ1RSTF9QTUVfUE9XRVJfU1RBVEVfRDIgICAgMgotICAgICNkZWZpbmUgUE1fQ1RSTF9QTUVfUE9XRVJfU1RBVEVfRDNIICAgMworCVQzXzE2QklUX1JFR0lTVEVSIFBtQ3RybFN0YXR1czsKKyNkZWZpbmUgUE1fQ1RSTF9QTUVfU1RBVFVTICAgICAgICAgICAgQklUXzE1CisjZGVmaW5lIFBNX0NUUkxfUE1FX0VOQUJMRSAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QwICAgIDAKKyNkZWZpbmUgUE1fQ1RSTF9QTUVfUE9XRVJfU1RBVEVfRDEgICAgMQorI2RlZmluZSBQTV9DVFJMX1BNRV9QT1dFUl9TVEFURV9EMiAgICAyCisjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QzSCAgIDMKIAotICAgIFQzXzhCSVRfUkVHSVNURVIgQnJpZGdlU3VwcG9ydEV4dDsKLSAgICBUM184QklUX1JFR0lTVEVSIFBtRGF0YTsKKwlUM184QklUX1JFR0lTVEVSIEJyaWRnZVN1cHBvcnRFeHQ7CisJVDNfOEJJVF9SRUdJU1RFUiBQbURhdGE7CiAKLSAgICBUM184QklUX1JFR0lTVEVSIFZwZENhcGFiaWxpdHlJZDsKLSAgICBUM184QklUX1JFR0lTVEVSIE1zaUNhcGFiaWxpdHlQdHI7Ci0gICAgVDNfMTZCSVRfUkVHSVNURVIgVnBkQWRkckZsYWc7Ci0gICAgI2RlZmluZSBWUERfRkxBR19XUklURSAgICAgICgxIDw8IDE1KQotICAgICNkZWZpbmUgVlBEX0ZMQUdfUldfTUFTSyAgICAoMSA8PCAxNSkKLSAgICAjZGVmaW5lIFZQRF9GTEFHX1JFQUQgICAgICAgMAorCVQzXzhCSVRfUkVHSVNURVIgVnBkQ2FwYWJpbGl0eUlkOworCVQzXzhCSVRfUkVHSVNURVIgTXNpQ2FwYWJpbGl0eVB0cjsKKwlUM18xNkJJVF9SRUdJU1RFUiBWcGRBZGRyRmxhZzsKKyNkZWZpbmUgVlBEX0ZMQUdfV1JJVEUgICAgICAoMSA8PCAxNSkKKyNkZWZpbmUgVlBEX0ZMQUdfUldfTUFTSyAgICAoMSA8PCAxNSkKKyNkZWZpbmUgVlBEX0ZMQUdfUkVBRCAgICAgICAwCiAKKwlUM18zMkJJVF9SRUdJU1RFUiBWcGREYXRhOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVnBkRGF0YTsKKwlUM184QklUX1JFR0lTVEVSIE1zaUNhcGFiaWxpdHlJZDsKKwlUM184QklUX1JFR0lTVEVSIE5leHRDYXBhYmlsaXR5UHRyOworCVQzXzE2QklUX1JFR0lTVEVSIE1zaUN0cmw7CisjZGVmaW5lIE1TSV9DVFJMXzY0QklUX0NBUCAgICAgKDEgPDwgNykKKyNkZWZpbmUgTVNJX0NUUkxfTVNHX0VOQUJMRSh4KSAoeCA8PCA0KQorI2RlZmluZSBNU0lfQ1RSTF9NU0dfQ0FQKHgpICAgICh4IDw8IDEpCisjZGVmaW5lIE1TSV9DVFJMX0VOQUJMRSAgICAgICAgKDEgPDwgMCkKIAotICAgIFQzXzhCSVRfUkVHSVNURVIgTXNpQ2FwYWJpbGl0eUlkOwotICAgIFQzXzhCSVRfUkVHSVNURVIgTmV4dENhcGFiaWxpdHlQdHI7Ci0gICAgVDNfMTZCSVRfUkVHSVNURVIgTXNpQ3RybDsKLSAgICAjZGVmaW5lIE1TSV9DVFJMXzY0QklUX0NBUCAgICAgKDEgPDwgNykKLSAgICAjZGVmaW5lIE1TSV9DVFJMX01TR19FTkFCTEUoeCkgKHggPDwgNCkKLSAgICAjZGVmaW5lIE1TSV9DVFJMX01TR19DQVAoeCkgICAgKHggPDwgMSkKLSAgICAjZGVmaW5lIE1TSV9DVFJMX0VOQUJMRSAgICAgICAgKDEgPDwgMCkKKwlUM18zMkJJVF9SRUdJU1RFUiBNc2lBZGRyTG93OworCVQzXzMyQklUX1JFR0lTVEVSIE1zaUFkZHJIaWdoOwogCisJVDNfMTZCSVRfUkVHSVNURVIgTXNpRGF0YTsKKwlUM18xNkJJVF9SRUdJU1RFUiBVbnVzZWQzOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTXNpQWRkckxvdzsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNc2lBZGRySGlnaDsKKwlUM18zMkJJVF9SRUdJU1RFUiBNaXNjSG9zdEN0cmw7CisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0NMRUFSX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9FTkRJQU5fQllURV9TV0FQICAgICAgICAgIEJJVF8yCisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9FTkRJQU5fV09SRF9TV0FQICAgICAgICAgIEJJVF8zCisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9QQ0lfU1RBVEVfUkVHX1JXICAgICAgICAgIEJJVF80CisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9DTEtfUkVHX1JXICAgICAgICAgICAgICAgIEJJVF81CisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9SRUdfV09SRF9TV0FQICAgICAgICAgICAgIEJJVF82CisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTkRJUkVDVF9BQ0NFU1MgICAgICAgICAgIEJJVF83CisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTlRfTUFTS19NT0RFICAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9UQUdHRURfU1RBVFVTX01PREUgICAgICAgIEJJVF85CiAKLSAgICBUM18xNkJJVF9SRUdJU1RFUiBNc2lEYXRhOwotICAgIFQzXzE2QklUX1JFR0lTVEVSIFVudXNlZDM7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hUmVhZFdyaXRlQ3RybDsKKyNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfTUFTSyAgICAgICAgICAgIChCSVRfMTEgfCBCSVRfMTIgfCBCSVRfMTMpCisjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZX0RJU0FCTEUgICAgICAgICAwCisjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzE2ICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMzIgICAgICAgICAgICAgIEJJVF8xMgorI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV82NCAgICAgICAgICAgICAgKEJJVF8xMiB8IEJJVF8xMSkKKyNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMTI4ICAgICAgICAgICAgIEJJVF8xMworI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8yNTYgICAgICAgICAgICAgKEJJVF8xMyB8IEJJVF8xMSkKKyNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfNTEyICAgICAgICAgICAgIChCSVRfMTMgfCBCSVRfMTIpCisjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzEwMjQgICAgICAgICAgICAoQklUXzEzIHwgQklUXzEyIHwgQklUXzExKQorI2RlZmluZSBETUFfQ1RSTF9XUklURV9PTkVfRE1BX0FUX09OQ0UgICAgICAgICAgQklUXzE0CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNaXNjSG9zdEN0cmw7Ci0gICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9DTEVBUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9FTkRJQU5fQllURV9TV0FQICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX1BDSV9TVEFURV9SRUdfUlcgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9DTEtfUkVHX1JXICAgICAgICAgICAgICAgIEJJVF81Ci0gICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfUkVHX1dPUkRfU1dBUCAgICAgICAgICAgICBCSVRfNgotICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0lORElSRUNUX0FDQ0VTUyAgICAgICAgICAgQklUXzcKLSAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTlRfTUFTS19NT0RFICAgICAgICAgICAgIEJJVF84Ci0gICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfVEFHR0VEX1NUQVRVU19NT0RFICAgICAgICBCSVRfOQorCVQzXzMyQklUX1JFR0lTVEVSIFBjaVN0YXRlOworI2RlZmluZSBUM19QQ0lfU1RBVEVfRk9SQ0VfUENJX1JFU0VUICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBUM19QQ0lfU1RBVEVfSU5URVJSVVBUX05PVF9BQ1RJVkUgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBUM19QQ0lfU1RBVEVfTk9UX1BDSV9YX0JVUyAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBUM19QQ0lfU1RBVEVfSElHSF9CVVNfU1BFRUQgICAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBUM19QQ0lfU1RBVEVfMzJCSVRfUENJX0JVUyAgICAgICAgICAgICAgICAgICAgICBCSVRfNAorI2RlZmluZSBUM19QQ0lfU1RBVEVfUENJX1JPTV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBCSVRfNQorI2RlZmluZSBUM19QQ0lfU1RBVEVfUENJX1JPTV9SRVRSWV9FTkFCTEUgICAgICAgICAgICAgICBCSVRfNgorI2RlZmluZSBUM19QQ0lfU1RBVEVfRkxBVF9WSUVXICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBUM19QQ0lfU1RBVEVfUkVUUllfU0FNRV9ETUEgICAgICAgICAgICAgICAgICAgICBCSVRfMTMKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYVJlYWRXcml0ZUN0cmw7Ci0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV9NQVNLICAgICAgICAgICAgKEJJVF8xMSB8IEJJVF8xMiB8IEJJVF8xMykKLSAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZX0RJU0FCTEUgICAgICAgICAwCi0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8xNiAgICAgICAgICAgICAgQklUXzExCi0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8zMiAgICAgICAgICAgICAgQklUXzEyCi0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV82NCAgICAgICAgICAgICAgKEJJVF8xMiB8IEJJVF8xMSkKLSAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzEyOCAgICAgICAgICAgICBCSVRfMTMKLSAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzI1NiAgICAgICAgICAgICAoQklUXzEzIHwgQklUXzExKQotICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfNTEyICAgICAgICAgICAgIChCSVRfMTMgfCBCSVRfMTIpCi0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8xMDI0ICAgICAgICAgICAgKEJJVF8xMyB8IEJJVF8xMiB8IEJJVF8xMSkKLSAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX09ORV9ETUFfQVRfT05DRSAgICAgICAgICBCSVRfMTQKKwlUM18zMkJJVF9SRUdJU1RFUiBDbG9ja0N0cmw7CisjZGVmaW5lIFQzX1BDSV9DTEtDVFJMX1RYQ1BVX0NMS19ESVNBQkxFICAgICAgICAgICAgICAgIEJJVF8xMQorI2RlZmluZSBUM19QQ0lfQ0xLQ1RSTF9SWENQVV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgVDNfUENJX0NMS0NUUkxfQ09SRV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgICAgQklUXzkKIAorCVQzXzMyQklUX1JFR0lTVEVSIFJlZ0Jhc2VBZGRyOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUGNpU3RhdGU7Ci0gICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfRk9SQ0VfUENJX1JFU0VUICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgVDNfUENJX1NUQVRFX0lOVEVSUlVQVF9OT1RfQUNUSVZFICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV9OT1RfUENJX1hfQlVTICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfSElHSF9CVVNfU1BFRUQgICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgVDNfUENJX1NUQVRFXzMyQklUX1BDSV9CVVMgICAgICAgICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV9QQ0lfUk9NX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEJJVF81Ci0gICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfUENJX1JPTV9SRVRSWV9FTkFCTEUgICAgICAgICAgICAgICBCSVRfNgotICAgICNkZWZpbmUgVDNfUENJX1NUQVRFX0ZMQVRfVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzgKLSAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV9SRVRSWV9TQU1FX0RNQSAgICAgICAgICAgICAgICAgICAgIEJJVF8xMwotCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQ2xvY2tDdHJsOwotICAgICNkZWZpbmUgVDNfUENJX0NMS0NUUkxfVFhDUFVfQ0xLX0RJU0FCTEUgICAgICAgICAgICAgICAgQklUXzExCi0gICAgI2RlZmluZSBUM19QQ0lfQ0xLQ1RSTF9SWENQVV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgICBCSVRfMTAKLSAgICAjZGVmaW5lIFQzX1BDSV9DTEtDVFJMX0NPUkVfQ0xLX0RJU0FCTEUgICAgICAgICAgICAgICAgIEJJVF85Ci0KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSZWdCYXNlQWRkcjsKLQotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1lbVdpbmRvd0Jhc2VBZGRyOworCVQzXzMyQklUX1JFR0lTVEVSIE1lbVdpbmRvd0Jhc2VBZGRyOwogCiAjaWZkZWYgTklDX0NQVV9WSUVXCi0gIC8qIFRoZXNlIHJlZ2lzdGVycyBhcmUgT05MWSB2aXNpYmxlIHRvIE5JQyBDUFUgKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBQb3dlckNvbnN1bWVkOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFBvd2VyRGlzc2lwYXRlZDsKLSNlbHNlIC8qIE5JQ19DUFVfVklFVyAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJlZ0RhdGE7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWVtV2luZG93RGF0YTsKLSNlbmRpZiAvKiAhTklDX0NQVV9WSUVXICovCisJLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBPTkxZIHZpc2libGUgdG8gTklDIENQVSAqLworCVQzXzMyQklUX1JFR0lTVEVSIFBvd2VyQ29uc3VtZWQ7CisJVDNfMzJCSVRfUkVHSVNURVIgUG93ZXJEaXNzaXBhdGVkOworI2Vsc2UJCQkJLyogTklDX0NQVV9WSUVXICovCisJVDNfMzJCSVRfUkVHSVNURVIgUmVnRGF0YTsKKwlUM18zMkJJVF9SRUdJU1RFUiBNZW1XaW5kb3dEYXRhOworI2VuZGlmCQkJCS8qICFOSUNfQ1BVX1ZJRVcgKi8KIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGVDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIE1vZGVDdHJsOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWlzY0NmZzsKKwlUM18zMkJJVF9SRUdJU1RFUiBNaXNjQ2ZnOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWlzY0xvY2FsQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBNaXNjTG9jYWxDdHJsOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVW51c2VkNDsKKwlUM18zMkJJVF9SRUdJU1RFUiBVbnVzZWQ0OwogCi0gICAgLyogTk9URTogQmlnL0xpdHRsZS1lbmRpYW4gY2xhcmlmaWNhdGlvbiBuZWVkZWQuICBBcmUgdGhlc2UgcmVnaXN0ZXIgKi8KLSAgICAvKiBpbiBiaWcgb3IgbGl0dGxlIGVuZGlhbiBmb3JtYXRlLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFN0ZFJpbmdQcm9kSWR4OwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFJjdlJldFJpbmdDb25JZHg7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgU25kUHJvZElkeDsKKwkvKiBOT1RFOiBCaWcvTGl0dGxlLWVuZGlhbiBjbGFyaWZpY2F0aW9uIG5lZWRlZC4gIEFyZSB0aGVzZSByZWdpc3RlciAqLworCS8qIGluIGJpZyBvciBsaXR0bGUgZW5kaWFuIGZvcm1hdGUuICovCisJVDNfNjRCSVRfUkVHSVNURVIgU3RkUmluZ1Byb2RJZHg7CisJVDNfNjRCSVRfUkVHSVNURVIgUmN2UmV0UmluZ0NvbklkeDsKKwlUM182NEJJVF9SRUdJU1RFUiBTbmRQcm9kSWR4OwogCi0gICAgTE1fVUlOVDggVW51c2VkNVs4MF07CisJTE1fVUlOVDggVW51c2VkNVs4MF07CiB9IFQzX1BDSV9DT05GSUdVUkFUSU9OLCAqUFQzX1BDSV9DT05GSUdVUkFUSU9OOwogCiAjZGVmaW5lIFBDSVhfQ01EX01BWF9TUExJVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MApAQCAtMTM3NCwxMzgyICsxMzI2LDEzNDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBNQUMgbW9kZSBjb250cm9sLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9HTE9CQUxfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBNQUNfTU9ERV9IQUxGX0RVUExFWCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgIChCSVRfMiB8IEJJVF8zKQotICAgICNkZWZpbmUgTUFDX01PREVfUE9SVF9NT0RFX1RCSSAgICAgICAgICAgICAgICAgICAgICAoQklUXzIgfCBCSVRfMykKLSAgICAjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJICAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9NSUkgICAgICAgICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9OT05FICAgICAgICAgICAgICAgICAgICAgQklUX05PTkUKLSAgICAjZGVmaW5lIE1BQ19NT0RFX1BPUlRfSU5URVJOQUxfTE9PUEJBQ0sgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIE1BQ19NT0RFX1RBR0dFRF9NQUNfQ09OVFJPTCAgICAgICAgICAgICAgICAgQklUXzcKLSAgICAjZGVmaW5lIE1BQ19NT0RFX1RYX0JVUlNUSU5HICAgICAgICAgICAgICAgICAgICAgICAgQklUXzgKLSAgICAjZGVmaW5lIE1BQ19NT0RFX01BWF9ERUZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzkKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0xJTktfUE9MQVJJVFkgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCi0gICAgI2RlZmluZSBNQUNfTU9ERV9FTkFCTEVfUlhfU1RBVElTVElDUyAgICAgICAgICAgICAgIEJJVF8xMQotICAgICNkZWZpbmUgTUFDX01PREVfQ0xFQVJfUlhfU1RBVElTVElDUyAgICAgICAgICAgICAgICBCSVRfMTIKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0ZMVVNIX1JYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzEzCi0gICAgI2RlZmluZSBNQUNfTU9ERV9FTkFCTEVfVFhfU1RBVElTVElDUyAgICAgICAgICAgICAgIEJJVF8xNAotICAgICNkZWZpbmUgTUFDX01PREVfQ0xFQVJfVFhfU1RBVElTVElDUyAgICAgICAgICAgICAgICBCSVRfMTUKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0ZMVVNIX1RYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzE2Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9TRU5EX0NPTkZJR1MgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNwotICAgICNkZWZpbmUgTUFDX01PREVfREVURUNUX01BR0lDX1BBQ0tFVF9FTkFCTEUgICAgICAgICBCSVRfMTgKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0FDUElfUE9XRVJfT05fRU5BQkxFICAgICAgICAgICAgICAgQklUXzE5Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9FTkFCTEVfTUlQICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yMAotICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1RERSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjEKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9SREUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIyCi0gICAgI2RlZmluZSBNQUNfTU9ERV9FTkFCTEVfRkhERSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yMworCS8qIE1BQyBtb2RlIGNvbnRyb2wuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgTUFDX01PREVfR0xPQkFMX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBNQUNfTU9ERV9IQUxGX0RVUExFWCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAgKEJJVF8yIHwgQklUXzMpCisjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9UQkkgICAgICAgICAgICAgICAgICAgICAgKEJJVF8yIHwgQklUXzMpCisjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgTUFDX01PREVfUE9SVF9NT0RFX01JSSAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfTk9ORSAgICAgICAgICAgICAgICAgICAgIEJJVF9OT05FCisjZGVmaW5lIE1BQ19NT0RFX1BPUlRfSU5URVJOQUxfTE9PUEJBQ0sgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgTUFDX01PREVfVEFHR0VEX01BQ19DT05UUk9MICAgICAgICAgICAgICAgICBCSVRfNworI2RlZmluZSBNQUNfTU9ERV9UWF9CVVJTVElORyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIE1BQ19NT0RFX01BWF9ERUZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzkKKyNkZWZpbmUgTUFDX01PREVfTElOS19QT0xBUklUWSAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1JYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgTUFDX01PREVfQ0xFQVJfUlhfU1RBVElTVElDUyAgICAgICAgICAgICAgICBCSVRfMTIKKyNkZWZpbmUgTUFDX01PREVfRkxVU0hfUlhfU1RBVElTVElDUyAgICAgICAgICAgICAgICBCSVRfMTMKKyNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1RYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICBCSVRfMTQKKyNkZWZpbmUgTUFDX01PREVfQ0xFQVJfVFhfU1RBVElTVElDUyAgICAgICAgICAgICAgICBCSVRfMTUKKyNkZWZpbmUgTUFDX01PREVfRkxVU0hfVFhfU1RBVElTVElDUyAgICAgICAgICAgICAgICBCSVRfMTYKKyNkZWZpbmUgTUFDX01PREVfU0VORF9DT05GSUdTICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTcKKyNkZWZpbmUgTUFDX01PREVfREVURUNUX01BR0lDX1BBQ0tFVF9FTkFCTEUgICAgICAgICBCSVRfMTgKKyNkZWZpbmUgTUFDX01PREVfQUNQSV9QT1dFUl9PTl9FTkFCTEUgICAgICAgICAgICAgICBCSVRfMTkKKyNkZWZpbmUgTUFDX01PREVfRU5BQkxFX01JUCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjAKKyNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1RERSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjEKKyNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1JERSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjIKKyNkZWZpbmUgTUFDX01PREVfRU5BQkxFX0ZIREUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjMKIAotICAgIC8qIE1BQyBzdGF0dXMgKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBNQUNfU1RBVFVTX1BDU19TWU5DRUQgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBNQUNfU1RBVFVTX1NJR05BTF9ERVRFQ1RFRCAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBNQUNfU1RBVFVTX1JFQ0VJVklOR19DRkcgICAgICAgICAgICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBNQUNfU1RBVFVTX0NGR19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgIEJJVF80Ci0gICAgI2RlZmluZSBNQUNfU1RBVFVTX1BPUlRfREVDT0RFX0VSUk9SICAgICAgICAgICAgICAgIEJJVF8xMAotICAgICNkZWZpbmUgTUFDX1NUQVRVU19MSU5LX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgICBCSVRfMTIKLSAgICAjZGVmaW5lIE1BQ19TVEFUVVNfTUlfQ09NUExFVElPTiAgICAgICAgICAgICAgICAgICAgQklUXzIyCi0gICAgI2RlZmluZSBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgIEJJVF8yMwotICAgICNkZWZpbmUgTUFDX1NUQVRVU19BUF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjQKLSAgICAjZGVmaW5lIE1BQ19TVEFUVVNfT0RJX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI1Ci0gICAgI2RlZmluZSBNQUNfU1RBVFVTX1JYX1NUQVRTX09WRVJSVU4gICAgICAgICAgICAgICAgIEJJVF8yNgotICAgICNkZWZpbmUgTUFDX1NUQVRVU19UWF9TVEFUU19PVkVSUlVOICAgICAgICAgICAgICAgICBCSVRfMjcKKwkvKiBNQUMgc3RhdHVzICovCisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworI2RlZmluZSBNQUNfU1RBVFVTX1BDU19TWU5DRUQgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIE1BQ19TVEFUVVNfU0lHTkFMX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgTUFDX1NUQVRVU19SRUNFSVZJTkdfQ0ZHICAgICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBNQUNfU1RBVFVTX0NGR19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgTUFDX1NUQVRVU19QT1JUX0RFQ09ERV9FUlJPUiAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgTUFDX1NUQVRVU19MSU5LX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgICBCSVRfMTIKKyNkZWZpbmUgTUFDX1NUQVRVU19NSV9DT01QTEVUSU9OICAgICAgICAgICAgICAgICAgICBCSVRfMjIKKyNkZWZpbmUgTUFDX1NUQVRVU19NSV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICBCSVRfMjMKKyNkZWZpbmUgTUFDX1NUQVRVU19BUF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjQKKyNkZWZpbmUgTUFDX1NUQVRVU19PRElfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjUKKyNkZWZpbmUgTUFDX1NUQVRVU19SWF9TVEFUU19PVkVSUlVOICAgICAgICAgICAgICAgICBCSVRfMjYKKyNkZWZpbmUgTUFDX1NUQVRVU19UWF9TVEFUU19PVkVSUlVOICAgICAgICAgICAgICAgICBCSVRfMjcKIAotICAgIC8qIEV2ZW50IEVuYWJsZSAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1hY0V2ZW50OwotICAgICNkZWZpbmUgTUFDX0VWRU5UX0VOQUJMRV9QT1JUX0RFQ09ERV9FUlIgICAgICAgICAgICBCSVRfMTAKLSAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfTElOS19TVEFURV9DSEFOR0VEX0FUVE4gICAgQklUXzEyCi0gICAgI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX01JX0NPTVBMRVRJT04gICAgICAgICAgICAgIEJJVF8yMgotICAgICNkZWZpbmUgTUFDX0VWRU5UX0VOQUJMRV9NSV9JTlRFUlJVUFQgICAgICAgICAgICAgICBCSVRfMjMKLSAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfQVBfRVJST1IgICAgICAgICAgICAgICAgICAgQklUXzI0Ci0gICAgI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX09ESV9FUlJPUiAgICAgICAgICAgICAgICAgIEJJVF8yNQotICAgICNkZWZpbmUgTUFDX0VWRU5UX0VOQUJMRV9SWF9TVEFUU19PVkVSUlVOICAgICAgICAgICBCSVRfMjYKLSAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfVFhfU1RBVFNfT1ZFUlJVTiAgICAgICAgICAgQklUXzI3CisJLyogRXZlbnQgRW5hYmxlICovCisJVDNfMzJCSVRfUkVHSVNURVIgTWFjRXZlbnQ7CisjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfUE9SVF9ERUNPREVfRVJSICAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfTElOS19TVEFURV9DSEFOR0VEX0FUVE4gICAgQklUXzEyCisjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfTUlfQ09NUExFVElPTiAgICAgICAgICAgICAgQklUXzIyCisjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfTUlfSU5URVJSVVBUICAgICAgICAgICAgICAgQklUXzIzCisjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfQVBfRVJST1IgICAgICAgICAgICAgICAgICAgQklUXzI0CisjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfT0RJX0VSUk9SICAgICAgICAgICAgICAgICAgQklUXzI1CisjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfUlhfU1RBVFNfT1ZFUlJVTiAgICAgICAgICAgQklUXzI2CisjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfVFhfU1RBVFNfT1ZFUlJVTiAgICAgICAgICAgQklUXzI3CiAKLSAgICAvKiBMZWQgY29udHJvbC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBMZWRDdHJsOwotICAgICNkZWZpbmUgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgTEVEX0NUUkxfMTAwME1CUFNfTEVEX09OICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgTEVEX0NUUkxfMTAwTUJQU19MRURfT04gICAgICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgTEVEX0NUUkxfMTBNQlBTX0xFRF9PTiAgICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgTEVEX0NUUkxfT1ZFUlJJREVfVFJBRkZJQ19MRUQgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgTEVEX0NUUkxfQkxJTktfVFJBRkZJQ19MRUQgICAgICAgICAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgTEVEX0NUUkxfVFJBRkZJQ19MRUQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNgotICAgICNkZWZpbmUgTEVEX0NUUkxfMTAwME1CUFNfTEVEX1NUQVRVUyAgICAgICAgICAgICAgICBCSVRfNwotICAgICNkZWZpbmUgTEVEX0NUUkxfMTAwTUJQU19MRURfU1RBVFVTICAgICAgICAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgTEVEX0NUUkxfMTBNQlBTX0xFRF9TVEFUVVMgICAgICAgICAgICAgICAgICBCSVRfOQotICAgICNkZWZpbmUgTEVEX0NUUkxfVFJBRkZJQ19MRURfU1RBVFVTICAgICAgICAgICAgICAgICBCSVRfMTAKLSAgICAjZGVmaW5lIExFRF9DVFJMX01BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUX05PTkUKLSAgICAjZGVmaW5lIExFRF9DVFJMX1BIWV9NT0RFXzEgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzExCi0gICAgI2RlZmluZSBMRURfQ1RSTF9QSFlfTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMgotICAgICNkZWZpbmUgTEVEX0NUUkxfQkxJTktfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDdmZjgwMDAwCi0gICAgI2RlZmluZSBMRURfQ1RSTF9PVkVSUklERV9CTElOS19QRVJJT0QgICAgICAgICAgICAgIEJJVF8xOQotICAgICNkZWZpbmUgTEVEX0NUUkxfT1ZFUlJJREVfQkxJTktfUkFURSAgICAgICAgICAgICAgICBCSVRfMzEKKwkvKiBMZWQgY29udHJvbC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBMZWRDdHJsOworI2RlZmluZSBMRURfQ1RSTF9PVkVSUklERV9MSU5LX0xFRCAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIExFRF9DVFJMXzEwMDBNQlBTX0xFRF9PTiAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgTEVEX0NUUkxfMTAwTUJQU19MRURfT04gICAgICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBMRURfQ1RSTF8xME1CUFNfTEVEX09OICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIExFRF9DVFJMX09WRVJSSURFX1RSQUZGSUNfTEVEICAgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgTEVEX0NUUkxfQkxJTktfVFJBRkZJQ19MRUQgICAgICAgICAgICAgICAgICBCSVRfNQorI2RlZmluZSBMRURfQ1RSTF9UUkFGRklDX0xFRCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF82CisjZGVmaW5lIExFRF9DVFJMXzEwMDBNQlBTX0xFRF9TVEFUVVMgICAgICAgICAgICAgICAgQklUXzcKKyNkZWZpbmUgTEVEX0NUUkxfMTAwTUJQU19MRURfU1RBVFVTICAgICAgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBMRURfQ1RSTF8xME1CUFNfTEVEX1NUQVRVUyAgICAgICAgICAgICAgICAgIEJJVF85CisjZGVmaW5lIExFRF9DVFJMX1RSQUZGSUNfTEVEX1NUQVRVUyAgICAgICAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIExFRF9DVFJMX01BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUX05PTkUKKyNkZWZpbmUgTEVEX0NUUkxfUEhZX01PREVfMSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgTEVEX0NUUkxfUEhZX01PREVfMiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTIKKyNkZWZpbmUgTEVEX0NUUkxfQkxJTktfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDdmZjgwMDAwCisjZGVmaW5lIExFRF9DVFJMX09WRVJSSURFX0JMSU5LX1BFUklPRCAgICAgICAgICAgICAgQklUXzE5CisjZGVmaW5lIExFRF9DVFJMX09WRVJSSURFX0JMSU5LX1JBVEUgICAgICAgICAgICAgICAgQklUXzMxCiAKLSAgICAvKiBNQUMgYWRkcmVzc2VzLiAqLwotICAgIHN0cnVjdCB7Ci0JVDNfMzJCSVRfUkVHSVNURVIgSGlnaDsgICAgICAgICAgICAgLyogVXBwZXIgMiBieXRlcy4gKi8KLQlUM18zMkJJVF9SRUdJU1RFUiBMb3c7ICAgICAgICAgICAgICAvKiBMb3dlciA0IGJ5dGVzLiAqLwotICAgIH0gTWFjQWRkcls0XTsKKwkvKiBNQUMgYWRkcmVzc2VzLiAqLworCXN0cnVjdCB7CisJCVQzXzMyQklUX1JFR0lTVEVSIEhpZ2g7CS8qIFVwcGVyIDIgYnl0ZXMuICovCisJCVQzXzMyQklUX1JFR0lTVEVSIExvdzsJLyogTG93ZXIgNCBieXRlcy4gKi8KKwl9IE1hY0FkZHJbNF07CiAKLSAgICAvKiBBQ1BJIE1idWYgcG9pbnRlci4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBBY3BpTWJ1ZlB0cjsKKwkvKiBBQ1BJIE1idWYgcG9pbnRlci4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBBY3BpTWJ1ZlB0cjsKIAotICAgIC8qIEFDUEkgTGVuZ3RoIGFuZCBPZmZzZXQuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQWNwaUxlbmd0aE9mZnNldDsKLSAgICAjZGVmaW5lIEFDUElfTEVOR1RIX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCi0gICAgI2RlZmluZSBBQ1BJX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGZmZjAwMDAKLSAgICAjZGVmaW5lIEFDUElfTEVOR1RIKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeAotICAgICNkZWZpbmUgQUNQSV9PRkZTRVQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDE2KQorCS8qIEFDUEkgTGVuZ3RoIGFuZCBPZmZzZXQuICovCisJVDNfMzJCSVRfUkVHSVNURVIgQWNwaUxlbmd0aE9mZnNldDsKKyNkZWZpbmUgQUNQSV9MRU5HVEhfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgQUNQSV9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBmZmYwMDAwCisjZGVmaW5lIEFDUElfTEVOR1RIKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeAorI2RlZmluZSBBQ1BJX09GRlNFVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMTYpCiAKLSAgICAvKiBUcmFuc21pdCByYW5kb20gYmFja29mZi4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeEJhY2tvZmZTZWVkOwotICAgICNkZWZpbmUgTUFDX1RYX0JBQ0tPRkZfU0VFRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDNmZgorCS8qIFRyYW5zbWl0IHJhbmRvbSBiYWNrb2ZmLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFR4QmFja29mZlNlZWQ7CisjZGVmaW5lIE1BQ19UWF9CQUNLT0ZGX1NFRURfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgzZmYKIAotICAgIC8qIFJlY2VpdmUgTVRVICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTXR1U2l6ZTsKLSAgICAjZGVmaW5lIE1BQ19SWF9NVFVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisJLyogUmVjZWl2ZSBNVFUgKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBNdHVTaXplOworI2RlZmluZSBNQUNfUlhfTVRVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgogCi0gICAgLyogR2lnYWJpdCBQQ1MgVGVzdC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBQY3NUZXN0OwotICAgICNkZWZpbmUgTUFDX1BDU19URVNUX0RBVEFfUEFUVEVSTl9NQVNLICAgICAgICAgICAgICAweDBmZmZmZgotICAgICNkZWZpbmUgTUFDX1BDU19URVNUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjAKKwkvKiBHaWdhYml0IFBDUyBUZXN0LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFBjc1Rlc3Q7CisjZGVmaW5lIE1BQ19QQ1NfVEVTVF9EQVRBX1BBVFRFUk5fTUFTSyAgICAgICAgICAgICAgMHgwZmZmZmYKKyNkZWZpbmUgTUFDX1BDU19URVNUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjAKIAotICAgIC8qIFRyYW5zbWl0IEdpZ2FiaXQgQXV0by1OZWdvdGlhdGlvbi4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeEF1dG9OZWc7Ci0gICAgI2RlZmluZSBNQUNfQU5fVFhfQU5fREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCS8qIFRyYW5zbWl0IEdpZ2FiaXQgQXV0by1OZWdvdGlhdGlvbi4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBUeEF1dG9OZWc7CisjZGVmaW5lIE1BQ19BTl9UWF9BTl9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCiAKLSAgICAvKiBSZWNlaXZlIEdpZ2FiaXQgQXV0by1OZWdvdGlhdGlvbi4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeEF1dG9OZWc7Ci0gICAgI2RlZmluZSBNQUNfQU5fUlhfQU5fREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCS8qIFJlY2VpdmUgR2lnYWJpdCBBdXRvLU5lZ290aWF0aW9uLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFJ4QXV0b05lZzsKKyNkZWZpbmUgTUFDX0FOX1JYX0FOX0RBVEFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKIAotICAgIC8qIE1JIENvbW11bmljYXRpb24uICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWlDb207Ci0gICAgI2RlZmluZSBNSV9DT01fQ01EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRfMjYgfCBCSVRfMjcpCi0gICAgI2RlZmluZSBNSV9DT01fQ01EX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNgotICAgICNkZWZpbmUgTUlfQ09NX0NNRF9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjcKLSAgICAjZGVmaW5lIE1JX0NPTV9SRUFEX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI4Ci0gICAgI2RlZmluZSBNSV9DT01fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yOQotICAgICNkZWZpbmUgTUlfQ09NX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjkKKwkvKiBNSSBDb21tdW5pY2F0aW9uLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1pQ29tOworI2RlZmluZSBNSV9DT01fQ01EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRfMjYgfCBCSVRfMjcpCisjZGVmaW5lIE1JX0NPTV9DTURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI2CisjZGVmaW5lIE1JX0NPTV9DTURfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI3CisjZGVmaW5lIE1JX0NPTV9SRUFEX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI4CisjZGVmaW5lIE1JX0NPTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI5CisjZGVmaW5lIE1JX0NPTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI5CiAKLSAgICAjZGVmaW5lIE1JX0NPTV9QSFlfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgxZgotICAgICNkZWZpbmUgTUlfQ09NX0ZJUlNUX1BIWV9BRERSX0JJVCAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBNSV9DT01fUEhZX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYKKyNkZWZpbmUgTUlfQ09NX0ZJUlNUX1BIWV9BRERSX0JJVCAgICAgICAgICAgICAgICAgICAyMQogCi0gICAgI2RlZmluZSBNSV9DT01fUEhZX1JFR19BRERSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MWYKLSAgICAjZGVmaW5lIE1JX0NPTV9GSVJTVF9QSFlfUkVHX0FERFJfQklUICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTUlfQ09NX1BIWV9SRUdfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDFmCisjZGVmaW5lIE1JX0NPTV9GSVJTVF9QSFlfUkVHX0FERFJfQklUICAgICAgICAgICAgICAgMTYKIAotICAgICNkZWZpbmUgTUlfQ09NX1BIWV9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgTUlfQ09NX1BIWV9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKIAotICAgIC8qIE1JIFN0YXR1cy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNaVN0YXR1czsKLSAgICAjZGVmaW5lIE1JX1NUQVRVU19FTkFCTEVfTElOS19TVEFUVVNfQVRUTiAgICAgICAgICAgQklUXzAKKwkvKiBNSSBTdGF0dXMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTWlTdGF0dXM7CisjZGVmaW5lIE1JX1NUQVRVU19FTkFCTEVfTElOS19TVEFUVVNfQVRUTiAgICAgICAgICAgQklUXzAKIAotICAgIC8qIE1JIE1vZGUuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWlNb2RlOwotICAgICNkZWZpbmUgTUlfTU9ERV9DTE9DS19TUEVFRF8xME1IWiAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgTUlfTU9ERV9VU0VfU0hPUlRfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgTUlfTU9ERV9BVVRPX1BPTExJTkdfRU5BQkxFICAgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgTUlfTU9ERV9DT1JFX0NMT0NLX1NQRUVEXzYyTUhaICAgICAgICAgICAgICBCSVRfMTUKKwkvKiBNSSBNb2RlLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1pTW9kZTsKKyNkZWZpbmUgTUlfTU9ERV9DTE9DS19TUEVFRF8xME1IWiAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBNSV9NT0RFX1VTRV9TSE9SVF9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIE1JX01PREVfQVVUT19QT0xMSU5HX0VOQUJMRSAgICAgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgTUlfTU9ERV9DT1JFX0NMT0NLX1NQRUVEXzYyTUhaICAgICAgICAgICAgICBCSVRfMTUKIAotICAgIC8qIEF1dG8tcG9sbGluZyBzdGF0dXMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQXV0b1BvbGxTdGF0dXM7Ci0gICAgI2RlZmluZSBBVVRPX1BPTExfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisJLyogQXV0by1wb2xsaW5nIHN0YXR1cy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBBdXRvUG9sbFN0YXR1czsKKyNkZWZpbmUgQVVUT19QT0xMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAogCi0gICAgLyogVHJhbnNtaXQgTUFDIG1vZGUuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhNb2RlOwotICAgICNkZWZpbmUgVFhfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgVFhfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgVFhfTU9ERV9FTkFCTEVfRkxPV19DT05UUk9MICAgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgVFhfTU9ERV9FTkFCTEVfQklHX0JBQ0tPRkYgICAgICAgICAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgVFhfTU9ERV9FTkFCTEVfTE9OR19QQVVTRSAgICAgICAgICAgICAgICAgICBCSVRfNgorCS8qIFRyYW5zbWl0IE1BQyBtb2RlLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFR4TW9kZTsKKyNkZWZpbmUgVFhfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBUWF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFRYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgVFhfTU9ERV9FTkFCTEVfQklHX0JBQ0tPRkYgICAgICAgICAgICAgICAgICBCSVRfNQorI2RlZmluZSBUWF9NT0RFX0VOQUJMRV9MT05HX1BBVVNFICAgICAgICAgICAgICAgICAgIEJJVF82CiAKLSAgICAvKiBUcmFuc21pdCBNQUMgc3RhdHVzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4U3RhdHVzOwotICAgICNkZWZpbmUgVFhfU1RBVFVTX1JYX0NVUlJFTlRMWV9YT0ZGRUQgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgVFhfU1RBVFVTX1NFTlRfWE9GRiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgVFhfU1RBVFVTX1NFTlRfWE9OICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgVFhfU1RBVFVTX0xJTktfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgVFhfU1RBVFVTX09ESV9VTkRFUlJVTiAgICAgICAgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgVFhfU1RBVFVTX09ESV9PVkVSUlVOICAgICAgICAgICAgICAgICAgICAgICBCSVRfNQorCS8qIFRyYW5zbWl0IE1BQyBzdGF0dXMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgVHhTdGF0dXM7CisjZGVmaW5lIFRYX1NUQVRVU19SWF9DVVJSRU5UTFlfWE9GRkVEICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgVFhfU1RBVFVTX1NFTlRfWE9GRiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBUWF9TVEFUVVNfU0VOVF9YT04gICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIFRYX1NUQVRVU19MSU5LX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgVFhfU1RBVFVTX09ESV9VTkRFUlJVTiAgICAgICAgICAgICAgICAgICAgICBCSVRfNAorI2RlZmluZSBUWF9TVEFUVVNfT0RJX09WRVJSVU4gICAgICAgICAgICAgICAgICAgICAgIEJJVF81CiAKLSAgICAvKiBUcmFuc21pdCBNQUMgbGVuZ3RoLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4TGVuZ3RoczsKLSAgICAjZGVmaW5lIFRYX0xFTl9TTE9UX1RJTUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHhmZgotICAgICNkZWZpbmUgVFhfTEVOX0lQR19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBmMDAKLSAgICAjZGVmaW5lIFRYX0xFTl9JUEdfQ1JTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVF8xMiB8IEJJVF8xMykKKwkvKiBUcmFuc21pdCBNQUMgbGVuZ3RoLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFR4TGVuZ3RoczsKKyNkZWZpbmUgVFhfTEVOX1NMT1RfVElNRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIFRYX0xFTl9JUEdfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZjAwCisjZGVmaW5lIFRYX0xFTl9JUEdfQ1JTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVF8xMiB8IEJJVF8xMykKIAotICAgIC8qIFJlY2VpdmUgTUFDIG1vZGUuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUnhNb2RlOwotICAgICNkZWZpbmUgUlhfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgUlhfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgUlhfTU9ERV9FTkFCTEVfRkxPV19DT05UUk9MICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgUlhfTU9ERV9LRUVQX01BQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgUlhfTU9ERV9LRUVQX1BBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgUlhfTU9ERV9BQ0NFUFRfT1ZFUlNJWkVEICAgICAgICAgICAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgUlhfTU9ERV9BQ0NFUFRfUlVOVFMgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNgotICAgICNkZWZpbmUgUlhfTU9ERV9MRU5HVEhfQ0hFQ0sgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNwotICAgICNkZWZpbmUgUlhfTU9ERV9QUk9NSVNDVU9VU19NT0RFICAgICAgICAgICAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgUlhfTU9ERV9OT19DUkNfQ0hFQ0sgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOQotICAgICNkZWZpbmUgUlhfTU9ERV9LRUVQX1ZMQU5fVEFHICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKKwkvKiBSZWNlaXZlIE1BQyBtb2RlLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFJ4TW9kZTsKKyNkZWZpbmUgUlhfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBSWF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFJYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgUlhfTU9ERV9LRUVQX01BQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBSWF9NT0RFX0tFRVBfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIFJYX01PREVfQUNDRVBUX09WRVJTSVpFRCAgICAgICAgICAgICAgICAgICAgQklUXzUKKyNkZWZpbmUgUlhfTU9ERV9BQ0NFUFRfUlVOVFMgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNgorI2RlZmluZSBSWF9NT0RFX0xFTkdUSF9DSEVDSyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF83CisjZGVmaW5lIFJYX01PREVfUFJPTUlTQ1VPVVNfTU9ERSAgICAgICAgICAgICAgICAgICAgQklUXzgKKyNkZWZpbmUgUlhfTU9ERV9OT19DUkNfQ0hFQ0sgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOQorI2RlZmluZSBSWF9NT0RFX0tFRVBfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMAogCi0gICAgLyogUmVjZWl2ZSBNQUMgc3RhdHVzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4U3RhdHVzOwotICAgICNkZWZpbmUgUlhfU1RBVFVTX1JFTU9URV9UUkFOU01JVFRFUl9YT0ZGRUQgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgUlhfU1RBVFVTX1hPRkZfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgUlhfU1RBVFVTX1hPTl9SRUNFSVZFRCAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorCS8qIFJlY2VpdmUgTUFDIHN0YXR1cy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBSeFN0YXR1czsKKyNkZWZpbmUgUlhfU1RBVFVTX1JFTU9URV9UUkFOU01JVFRFUl9YT0ZGRUQgICAgICAgICBCSVRfMAorI2RlZmluZSBSWF9TVEFUVVNfWE9GRl9SRUNFSVZFRCAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFJYX1NUQVRVU19YT05fUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIC8qIEhhc2ggcmVnaXN0ZXJzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEhhc2hSZWdbNF07CisJLyogSGFzaCByZWdpc3RlcnMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgSGFzaFJlZ1s0XTsKIAotICAgIC8qIFJlY2VpdmUgcGxhY2VtZW50IHJ1bGVzIHJlZ2lzdGVycy4gKi8KLSAgICBzdHJ1Y3QgewotCVQzXzMyQklUX1JFR0lTVEVSIFJ1bGU7Ci0JVDNfMzJCSVRfUkVHSVNURVIgVmFsdWU7Ci0gICAgfSBSY3ZSdWxlc1sxNl07CisJLyogUmVjZWl2ZSBwbGFjZW1lbnQgcnVsZXMgcmVnaXN0ZXJzLiAqLworCXN0cnVjdCB7CisJCVQzXzMyQklUX1JFR0lTVEVSIFJ1bGU7CisJCVQzXzMyQklUX1JFR0lTVEVSIFZhbHVlOworCX0gUmN2UnVsZXNbMTZdOwogCi0gICAgI2RlZmluZSBSQ1ZfRElTQUJMRV9SVUxFX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4N2ZmZmZmZmYKKyNkZWZpbmUgUkNWX0RJU0FCTEVfUlVMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDdmZmZmZmZmCiAKLSAgICAjZGVmaW5lIFJDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWCAgICAgICAgICAgICAgMHgwMAotICAgICNkZWZpbmUgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9SVUxFICAgICAgICAgICAgICAgICAweGMyMDAwMDAwCi0gICAgI2RlZmluZSBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1ZBTFVFICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgUkNWX1JVTEUxX1JFSkVDVF9CUk9BRENBU1RfSURYICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFJFSkVDVF9CUk9BRENBU1RfUlVMRTFfUlVMRSAgICAgICAgICAgICAgICAgMHhjMjAwMDAwMAorI2RlZmluZSBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1ZBTFVFICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKIAotICAgICNkZWZpbmUgUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYICAgICAgICAgICAgICAweDAxCi0gICAgI2RlZmluZSBSRUpFQ1RfQlJPQURDQVNUX1JVTEUyX1JVTEUgICAgICAgICAgICAgICAgIDB4ODYwMDAwMDQKLSAgICAjZGVmaW5lIFJFSkVDVF9CUk9BRENBU1RfUlVMRTJfVkFMVUUgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBSQ1ZfUlVMRTJfUkVKRUNUX0JST0FEQ0FTVF9JRFggICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMl9SVUxFICAgICAgICAgICAgICAgICAweDg2MDAwMDA0CisjZGVmaW5lIFJFSkVDVF9CUk9BRENBU1RfUlVMRTJfVkFMVUUgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgogCiAjaWYgSU5DTFVERV81NzAxX0FYX0ZJWAotICAgICNkZWZpbmUgUkNWX0xBU1RfUlVMRV9JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFJDVl9MQVNUX1JVTEVfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAogI2Vsc2UKLSAgICAjZGVmaW5lIFJDVl9MQVNUX1JVTEVfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSQ1ZfTEFTVF9SVUxFX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKICNlbmRpZgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2UnVsZUNmZzsKLSAgICAjZGVmaW5lIFJYX1JVTEVfREVGQVVMVF9DTEFTUyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZSdWxlQ2ZnOworI2RlZmluZSBSWF9SVUxFX0RFRkFVTFRfQ0xBU1MgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCiAKLSAgICBMTV9VSU5UOCBSZXNlcnZlZDFbMTQwXTsKKwlMTV9VSU5UOCBSZXNlcnZlZDFbMTQwXTsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlcmRlc0NmZzsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZXJkZXNTdGF0dXM7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VyZGVzQ2ZnOworCVQzXzMyQklUX1JFR0lTVEVSIFNlcmRlc1N0YXR1czsKIAotICAgIExNX1VJTlQ4IFJlc2VydmVkMlsxMDRdOworCUxNX1VJTlQ4IFJlc2VydmVkMlsxMDRdOwogCi0gICAgdm9sYXRpbGUgTE1fVUlOVDggVHhNYWNTdGF0ZVsxNl07Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDggUnhNYWNTdGF0ZVsyMF07CisJdm9sYXRpbGUgTE1fVUlOVDggVHhNYWNTdGF0ZVsxNl07CisJdm9sYXRpbGUgTE1fVUlOVDggUnhNYWNTdGF0ZVsyMF07CiAKLSAgICBMTV9VSU5UOCBSZXNlcnZlZDNbNDc2XTsKKwlMTV9VSU5UOCBSZXNlcnZlZDNbNDc2XTsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4U3RhdHNbMjZdOworCVQzXzMyQklUX1JFR0lTVEVSIFJ4U3RhdHNbMjZdOwogCi0gICAgTE1fVUlOVDggUmVzZXJ2ZWQ0WzI0XTsKKwlMTV9VSU5UOCBSZXNlcnZlZDRbMjRdOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhTdGF0c1syOF07CisJVDNfMzJCSVRfUkVHSVNURVIgVHhTdGF0c1syOF07CiAKLSAgICBMTV9VSU5UOCBSZXNlcnZlZDVbNzg0XTsKKwlMTV9VSU5UOCBSZXNlcnZlZDVbNzg0XTsKIH0gVDNfTUFDX0NPTlRST0wsICpQVDNfTUFDX0NPTlRST0w7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNlbmQgZGF0YSBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBUM19TTkRfREFUQV9JTl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fTU9ERV9TVEFUU19PRkxXX0FUVE5fRU5BQkxFICAgICAgQklUXzIKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBUM19TTkRfREFUQV9JTl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBUM19TTkRfREFUQV9JTl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBUM19TTkRfREFUQV9JTl9NT0RFX1NUQVRTX09GTFdfQVRUTl9FTkFCTEUgICAgICBCSVRfMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fU1RBVFVTX1NUQVRTX09GTFdfQVRUTiAgICAgICAgICAgQklUXzIKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRVU19TVEFUU19PRkxXX0FUVE4gICAgICAgICAgIEJJVF8yCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0N0cmw7Ci0gICAgI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0VOQUJMRSAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fU1RBVFNfQ1RSTF9GQVNURVJfVVBEQVRFICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfQ0xFQVIgICAgICAgICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0ZMVVNIICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fU1RBVFNfQ1RSTF9GT1JDRV9aRVJPICAgICAgICAgICAgQklUXzQKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0N0cmw7CisjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRU5BQkxFICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRkFTVEVSX1VQREFURSAgICAgICAgIEJJVF8xCisjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfQ0xFQVIgICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRkxVU0ggICAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRk9SQ0VfWkVSTyAgICAgICAgICAgIEJJVF80CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0VuYWJsZU1hc2s7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNJbmNNYXNrOworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXRzRW5hYmxlTWFzazsKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0luY01hc2s7CiAKLSAgICBMTV9VSU5UOCBSZXNlcnZlZFsxMDhdOworCUxNX1VJTlQ4IFJlc2VydmVkWzEwOF07CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBDbGFzc09mU2VydkNudFsxNl07Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hUmVhZFFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYVByaW9yaXR5UmVhZFFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNkY1FGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIENsYXNzT2ZTZXJ2Q250WzE2XTsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFSZWFkUUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hUHJpb3JpdHlSZWFkUUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgU2RjUUZ1bGxDbnQ7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNSaW5nU2V0U2VuZFByb2RJZHhDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzVXBkYXRlZENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBJbnRlcnJ1cHRzQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEF2b2lkSW50ZXJydXB0c0NudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kVGhyZXNob2xkSGl0Q250OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY1JpbmdTZXRTZW5kUHJvZElkeENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXNVcGRhdGVkQ250OworCVQzXzMyQklUX1JFR0lTVEVSIEludGVycnVwdHNDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgQXZvaWRJbnRlcnJ1cHRzQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmRUaHJlc2hvbGRIaXRDbnQ7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzgwMF07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFs4MDBdOwogfSBUM19TRU5EX0RBVEFfSU5JVElBVE9SLCAqUFQzX1NFTkRfREFUQV9JTklUSUFUT1I7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNlbmQgZGF0YSBjb21wbGV0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBTTkRfREFUQV9DT01QX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgU05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBTTkRfREFUQV9DT01QX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBTTkRfREFUQV9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFsxMDIwXTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzEwMjBdOwogfSBUM19TRU5EX0RBVEFfQ09NUExFVElPTiwgKlBUM19TRU5EX0RBVEFfQ09NUExFVElPTjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU2VuZCBCRCBSaW5nIFNlbGVjdG9yIENvbnRyb2wgUmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBTTkRfQkRfU0VMX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgU05EX0JEX1NFTF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFNORF9CRF9TRUxfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgU05EX0JEX1NFTF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgU05EX0JEX1NFTF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgU05EX0JEX1NFTF9NT0RFX0FUVE5fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKLSAgICAjZGVmaW5lIFNORF9CRF9TRUxfU1RBVFVTX0VSUk9SX0FUVE4gICAgICAgICAgICAgICAgICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworI2RlZmluZSBTTkRfQkRfU0VMX1NUQVRVU19FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgSHdEaWFnOworCVQzXzMyQklUX1JFR0lTVEVSIEh3RGlhZzsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQxWzUyXTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkMVs1Ml07CiAKLSAgICAvKiBTZW5kIEJEIFJpbmcgU2VsZWN0b3IgTG9jYWwgTklDIFNlbmQgQkQgQ29uc3VtZXIgSW5kZXguICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljU2VuZEJkU2VsQ29uSWR4WzE2XTsKKwkvKiBTZW5kIEJEIFJpbmcgU2VsZWN0b3IgTG9jYWwgTklDIFNlbmQgQkQgQ29uc3VtZXIgSW5kZXguICovCisJVDNfMzJCSVRfUkVHSVNURVIgTmljU2VuZEJkU2VsQ29uSWR4WzE2XTsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQyWzg5Nl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDJbODk2XTsKIH0gVDNfU0VORF9CRF9TRUxFQ1RPUiwgKlBUM19TRU5EX0JEX1NFTEVDVE9SOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTZW5kIEJEIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgU05EX0JEX0lOX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFNORF9CRF9JTl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBTTkRfQkRfSU5fTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFNORF9CRF9JTl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFNORF9CRF9JTl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFNORF9CRF9JTl9NT0RFX0FUVE5fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBTTkRfQkRfSU5fU1RBVFVTX0VSUk9SX0FUVE4gICAgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgU05EX0JEX0lOX1NUQVRVU19FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIC8qIFNlbmQgQkQgaW5pdGlhdG9yIGxvY2FsIE5JQyBzZW5kIEJEIHByb2R1Y2VyIGluZGV4LiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY1NlbmRCZEluUHJvZElkeFsxNl07CisJLyogU2VuZCBCRCBpbml0aWF0b3IgbG9jYWwgTklDIHNlbmQgQkQgcHJvZHVjZXIgaW5kZXguICovCisJVDNfMzJCSVRfUkVHSVNURVIgTmljU2VuZEJkSW5Qcm9kSWR4WzE2XTsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQyWzk1Ml07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDJbOTUyXTsKIH0gVDNfU0VORF9CRF9JTklUSUFUT1IsICpQVDNfU0VORF9CRF9JTklUSUFUT1I7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNlbmQgQkQgQ29tcGxldGlvbiBDb250cm9sLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBTTkRfQkRfQ09NUF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgU05EX0JEX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFNORF9CRF9DT01QX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgU05EX0JEX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgU05EX0JEX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgU05EX0JEX0NPTVBfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQyWzEwMjBdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQyWzEwMjBdOwogfSBUM19TRU5EX0JEX0NPTVBMRVRJT04sICpQVDNfU0VORF9CRF9DT01QTEVUSU9OOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZWNlaXZlIGxpc3QgcGxhY2VtZW50IGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIE1vZGUuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBSQ1ZfTElTVF9QTE1UX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX0NMQVNTMF9BVFROX0VOQUJMRSAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9NQVBQSU5HX09PUl9BVFROX0VOQUJMRSAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBSQ1ZfTElTVF9QTE1UX01PREVfU1RBVFNfT0ZMT1dfQVRUTl9FTkFCTEUgICAgICBCSVRfNAorCS8qIE1vZGUuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX0NMQVNTMF9BVFROX0VOQUJMRSAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX01BUFBJTkdfT09SX0FUVE5fRU5BQkxFICAgICAgQklUXzMKKyNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX1NUQVRTX09GTE9XX0FUVE5fRU5BQkxFICAgICAgQklUXzQKIAotICAgIC8qIFN0YXR1cy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBSQ1ZfTElTVF9QTE1UX1NUQVRVU19DTEFTUzBfQVRUTiAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgUkNWX0xJU1RfUExNVF9TVEFUVVNfTUFQUElOR19BVFROICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1BMTVRfU1RBVFVTX1NUQVRTX09GTE9XX0FUVE4gICAgICAgICAgIEJJVF80CisJLyogU3RhdHVzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgUkNWX0xJU1RfUExNVF9TVEFUVVNfQ0xBU1MwX0FUVE4gICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgUkNWX0xJU1RfUExNVF9TVEFUVVNfTUFQUElOR19BVFROICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgUkNWX0xJU1RfUExNVF9TVEFUVVNfU1RBVFNfT0ZMT1dfQVRUTiAgICAgICAgICAgQklUXzQKIAotICAgIC8qIFJlY2VpdmUgc2VsZWN0b3IgbGlzdCBsb2NrIHJlZ2lzdGVyLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIExvY2s7Ci0gICAgI2RlZmluZSBSQ1ZfTElTVF9TRUxfTE9DS19SRVFVRVNUX01BU0sgICAgICAgICAgICAgICAgICAweGZmZmYKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1NFTF9MT0NLX0dSQU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKwkvKiBSZWNlaXZlIHNlbGVjdG9yIGxpc3QgbG9jayByZWdpc3Rlci4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBMb2NrOworI2RlZmluZSBSQ1ZfTElTVF9TRUxfTE9DS19SRVFVRVNUX01BU0sgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgUkNWX0xJU1RfU0VMX0xPQ0tfR1JBTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAogCi0gICAgLyogU2VsZWN0b3Igbm9uLWVtcHR5IGJpdHMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTm9uRW1wdHlCaXRzOwotICAgICNkZWZpbmUgUkNWX0xJU1RfU0VMX05PTl9FTVBUWV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisJLyogU2VsZWN0b3Igbm9uLWVtcHR5IGJpdHMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTm9uRW1wdHlCaXRzOworI2RlZmluZSBSQ1ZfTElTVF9TRUxfTk9OX0VNUFRZX01BU0sgICAgICAgICAgICAgICAgICAgICAweGZmZmYKIAotICAgIC8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBDb25maWc7CisJLyogUmVjZWl2ZSBsaXN0IHBsYWNlbWVudCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIENvbmZpZzsKIAotICAgIC8qIFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQgc3RhdGlzdGljcyBDb250cm9sLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXRzQ3RybDsKKwkvKiBSZWNlaXZlIExpc3QgUGxhY2VtZW50IHN0YXRpc3RpY3MgQ29udHJvbC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0N0cmw7CiAjZGVmaW5lIFJDVl9MSVNUX1NUQVRTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAogI2RlZmluZSBSQ1ZfTElTVF9TVEFUU19GQVNUX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKIAotICAgIC8qIFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQgc3RhdGlzdGljcyBFbmFibGUgTWFzay4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0VuYWJsZU1hc2s7CisJLyogUmVjZWl2ZSBMaXN0IFBsYWNlbWVudCBzdGF0aXN0aWNzIEVuYWJsZSBNYXNrLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXRzRW5hYmxlTWFzazsKIAotICAgIC8qIFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQgc3RhdGlzdGljcyBJbmNyZW1lbnQgTWFzay4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0luY01hc2s7Ci0KLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMVsyMjRdOwotCi0gICAgc3RydWN0IHsKLQlUM18zMkJJVF9SRUdJU1RFUiBIZWFkOwotCVQzXzMyQklUX1JFR0lTVEVSIFRhaWw7Ci0JVDNfMzJCSVRfUkVHSVNURVIgQ291bnQ7CisJLyogUmVjZWl2ZSBMaXN0IFBsYWNlbWVudCBzdGF0aXN0aWNzIEluY3JlbWVudCBNYXNrLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXRzSW5jTWFzazsKIAogCS8qIFVudXNlZCBzcGFjZS4gKi8KLQlMTV9VSU5UOCBVbnVzZWRbNF07Ci0gICAgfSBSY3ZTZWxlY3Rvckxpc3RbMTZdOworCUxNX1VJTlQ4IFVudXNlZDFbMjI0XTsKIAotICAgIC8qIExvY2FsIHN0YXRpc3RpY3MgY291bnRlci4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBDbGFzc09mU2VydkNudFsxNl07CisJc3RydWN0IHsKKwkJVDNfMzJCSVRfUkVHSVNURVIgSGVhZDsKKwkJVDNfMzJCSVRfUkVHSVNURVIgVGFpbDsKKwkJVDNfMzJCSVRfUkVHSVNURVIgQ291bnQ7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEcm9wRHVlVG9GaWx0ZXJDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hV3JpdGVRRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoUHJpb3JpdHlXcml0ZVFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5vTW9yZVJlY2VpdmVCZENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBJZkluRGlzY2FyZHNDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSWZJbkVycm9yc0NudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZUaHJlc2hvbGRIaXRDbnQ7CisJCS8qIFVudXNlZCBzcGFjZS4gKi8KKwkJTE1fVUlOVDggVW51c2VkWzRdOworCX0gUmN2U2VsZWN0b3JMaXN0WzE2XTsKIAotICAgIC8qIEFub3RoZXIgdW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZDJbNDIwXTsKKwkvKiBMb2NhbCBzdGF0aXN0aWNzIGNvdW50ZXIuICovCisJVDNfMzJCSVRfUkVHSVNURVIgQ2xhc3NPZlNlcnZDbnRbMTZdOworCisJVDNfMzJCSVRfUkVHSVNURVIgRHJvcER1ZVRvRmlsdGVyQ250OworCVQzXzMyQklUX1JFR0lTVEVSIERtYVdyaXRlUUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFByaW9yaXR5V3JpdGVRRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBOb01vcmVSZWNlaXZlQmRDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgSWZJbkRpc2NhcmRzQ250OworCVQzXzMyQklUX1JFR0lTVEVSIElmSW5FcnJvcnNDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2VGhyZXNob2xkSGl0Q250OworCisJLyogQW5vdGhlciB1bnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkMls0MjBdOwogfSBUM19SQ1ZfTElTVF9QTEFDRU1FTlQsICpQVDNfUkNWX0xJU1RfUExBQ0VNRU5UOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogTW9kZS4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9KVU1CT19CRF9ORUVERUQgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9GUkFNRV9UT09fQklHICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9JTlZBTElEX1JJTkdfU0laRSAgICAgICBCSVRfNAorCS8qIE1vZGUuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX01PREVfSlVNQk9fQkRfTkVFREVEICAgICAgICAgQklUXzIKKyNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9GUkFNRV9UT09fQklHICAgICAgICAgICBCSVRfMworI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9NT0RFX0lOVkFMSURfUklOR19TSVpFICAgICAgIEJJVF80CiAKLSAgICAvKiBTdGF0dXMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fU1RBVFVTX0pVTUJPX0JEX05FRURFRCAgICAgICBCSVRfMgotICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fU1RBVFVTX0ZSQU1FX1RPT19CSUcgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fU1RBVFVTX0lOVkFMSURfUklOR19TSVpFICAgICBCSVRfNAorCS8qIFN0YXR1cy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX1NUQVRVU19KVU1CT19CRF9ORUVERUQgICAgICAgQklUXzIKKyNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fU1RBVFVTX0ZSQU1FX1RPT19CSUcgICAgICAgICBCSVRfMworI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9TVEFUVVNfSU5WQUxJRF9SSU5HX1NJWkUgICAgIEJJVF80CiAKLSAgICAvKiBTcGxpdCBmcmFtZSBtaW5pdW0gc2l6ZS4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTcGxpdEZyYW1lTWluU2l6ZTsKKwkvKiBTcGxpdCBmcmFtZSBtaW5pdW0gc2l6ZS4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTcGxpdEZyYW1lTWluU2l6ZTsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQxWzB4MjQ0MC0weDI0MGNdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQxWzB4MjQ0MCAtIDB4MjQwY107CiAKLSAgICAvKiBSZWNlaXZlIFJDQnMuICovCi0gICAgVDNfUkNCIEp1bWJvUmN2UmNiOwotICAgIFQzX1JDQiBTdGRSY3ZSY2I7Ci0gICAgVDNfUkNCIE1pbmlSY3ZSY2I7CisJLyogUmVjZWl2ZSBSQ0JzLiAqLworCVQzX1JDQiBKdW1ib1JjdlJjYjsKKwlUM19SQ0IgU3RkUmN2UmNiOworCVQzX1JDQiBNaW5pUmN2UmNiOwogCi0gICAgLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIFJpbmcgSW5pdGlhdG9yIExvY2FsIE5JQyBSZWNlaXZlICovCi0gICAgLyogQkQgQ29uc3VtYmVyIEluZGV4LiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY0p1bWJvQ29uSWR4OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY1N0ZENvbklkeDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNNaW5pQ29uSWR4OworCS8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBSaW5nIEluaXRpYXRvciBMb2NhbCBOSUMgUmVjZWl2ZSAqLworCS8qIEJEIENvbnN1bWJlciBJbmRleC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNKdW1ib0NvbklkeDsKKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNTdGRDb25JZHg7CisJVDNfMzJCSVRfUkVHSVNURVIgTmljTWluaUNvbklkeDsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQyWzRdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQyWzRdOwogCi0gICAgLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBMb2NhbCBSZWNlaXZlIFJldHVybiBQcm9kSWR4LiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZFByb2RJZHhbMTZdOworCS8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3IgTG9jYWwgUmVjZWl2ZSBSZXR1cm4gUHJvZElkeC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQmRQcm9kSWR4WzE2XTsKIAotICAgIC8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3IgSGFyZHdhcmUgRGlhZ25vc3RpYy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBId0RpYWc7CisJLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBIYXJkd2FyZSBEaWFnbm9zdGljLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIEh3RGlhZzsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQzWzgyOF07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDNbODI4XTsKIH0gVDNfUkNWX0RBVEFfQkRfSU5JVElBVE9SLCAqUFQzX1JDVl9EQVRBX0JEX0lOSVRJQVRPUjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVjZWl2ZSBEYXRhIENvbXBsZXRpb24gQ29udHJvbCBSZWdpc3Rlcy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgUkNWX0RBVEFfQ09NUF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBSQ1ZfREFUQV9DT01QX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFJDVl9EQVRBX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFJDVl9EQVRBX0NPTVBfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICAvKiBVbnVzZWQgc3BhY2VkLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFsxMDIwXTsKKwkvKiBVbnVzZWQgc3BhY2VkLiAqLworCUxNX1VJTlQ4IFVudXNlZFsxMDIwXTsKIH0gVDNfUkNWX0RBVEFfQ09NUExFVElPTiwgKlBUM19SQ1ZfREFUQV9DT01QTEVUSU9OOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBSQ1ZfQkRfSU5fTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgUkNWX0JEX0lOX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFJDVl9CRF9JTl9NT0RFX0JEX0lOX0RJQUJMRURfUkNCX0FUVE5fRU5BQkxFICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgUkNWX0JEX0lOX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgUkNWX0JEX0lOX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgUkNWX0JEX0lOX01PREVfQkRfSU5fRElBQkxFRF9SQ0JfQVRUTl9FTkFCTEUgICAgQklUXzIKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKLSAgICAjZGVmaW5lIFJDVl9CRF9JTl9TVEFUVVNfQkRfSU5fRElBQkxFRF9SQ0JfQVRUTiAgICAgICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworI2RlZmluZSBSQ1ZfQkRfSU5fU1RBVFVTX0JEX0lOX0RJQUJMRURfUkNCX0FUVE4gICAgICAgICBCSVRfMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljSnVtYm9SY3ZQcm9kSWR4OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY1N0ZFJjdlByb2RJZHg7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljTWluaVJjdlByb2RJZHg7CisJVDNfMzJCSVRfUkVHSVNURVIgTmljSnVtYm9SY3ZQcm9kSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY1N0ZFJjdlByb2RJZHg7CisJVDNfMzJCSVRfUkVHSVNURVIgTmljTWluaVJjdlByb2RJZHg7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNaW5pUmN2VGhyZXNob2xkOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0ZFJjdlRocmVzaG9sZDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBKdW1ib1JjdlRocmVzaG9sZDsKKwlUM18zMkJJVF9SRUdJU1RFUiBNaW5pUmN2VGhyZXNob2xkOworCVQzXzMyQklUX1JFR0lTVEVSIFN0ZFJjdlRocmVzaG9sZDsKKwlUM18zMkJJVF9SRUdJU1RFUiBKdW1ib1JjdlRocmVzaG9sZDsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbOTkyXTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzk5Ml07CiB9IFQzX1JDVl9CRF9JTklUSUFUT1IsICpQVDNfUkNWX0JEX0lOSVRJQVRPUjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVjZWl2ZSBCRCBDb21wbGV0aW9uIENvbnRyb2wgUmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBSQ1ZfQkRfQ09NUF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgUkNWX0JEX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFJDVl9CRF9DT01QX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgUkNWX0JEX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgUkNWX0JEX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgUkNWX0JEX0NPTVBfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKLSAgICAjZGVmaW5lIFJDVl9CRF9DT01QX1NUQVRVU19FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworI2RlZmluZSBSQ1ZfQkRfQ09NUF9TVEFUVVNfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgICBCSVRfMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgIE5pY0p1bWJvUmN2QmRQcm9kSWR4OwotICAgIFQzXzMyQklUX1JFR0lTVEVSICBOaWNTdGRSY3ZCZFByb2RJZHg7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgIE5pY01pbmlSY3ZCZFByb2RJZHg7CisJVDNfMzJCSVRfUkVHSVNURVIgTmljSnVtYm9SY3ZCZFByb2RJZHg7CisJVDNfMzJCSVRfUkVHSVNURVIgTmljU3RkUmN2QmRQcm9kSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY01pbmlSY3ZCZFByb2RJZHg7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzEwMDRdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbMTAwNF07CiB9IFQzX1JDVl9CRF9DT01QTEVUSU9OLCAqUFQzX1JDVl9CRF9DT01QTEVUSU9OOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZWNlaXZlIGxpc3Qgc2VsZWN0b3IgY29udHJvbCByZWdpc3Rlci4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgUkNWX0xJU1RfU0VMX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1NFTF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBSQ1ZfTElTVF9TRUxfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFJDVl9MSVNUX1NFTF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFJDVl9MSVNUX1NFTF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFJDVl9MSVNUX1NFTF9NT0RFX0FUVE5fRU5BQkxFICAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBSQ1ZfTElTVF9TRUxfU1RBVFVTX0VSUk9SX0FUVE4gICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgUkNWX0xJU1RfU0VMX1NUQVRVU19FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbMTAxNl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFsxMDE2XTsKIH0gVDNfUkNWX0xJU1RfU0VMRUNUT1IsICpQVDNfUkNWX0xJU1RfU0VMRUNUT1I7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE1idWYgY2x1c3RlciBmcmVlIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CiAjZGVmaW5lIE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfUkVTRVQgICAgQklUXzAKICNkZWZpbmUgTUJVRl9DTFVTVEVSX0ZSRUVfTU9ERV9FTkFCTEUgICBCSVRfMQogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbMTAxNl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFsxMDE2XTsKIH0gVDNfTUJVRl9DTFVTVEVSX0ZSRUUsICpQVDNfTUJVRl9DTFVTVEVSX0ZSRUU7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEhvc3QgY29hbGVzY2luZyBjb250cm9sIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBNb2RlLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX0FUVE4gICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX05PVyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX0ZVTExfU1RBVFVTX01PREUgICAgICAgICAgICAgIEJJVF9OT05FCi0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFXzY0X0JZVEVfU1RBVFVTX01PREUgICAgICAgICAgIEJJVF83Ci0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFXzMyX0JZVEVfU1RBVFVTX01PREUgICAgICAgICAgIEJJVF84Ci0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX0NMRUFSX1RJQ0tTX09OX1JYX0JEX0VWRU5UICAgIEJJVF85Ci0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX0NMRUFSX1RJQ0tTX09OX1RYX0JEX0VWRU5UICAgIEJJVF8xMAotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9OT19JTlRfT05fQ09BTEVTQ0VfTk9XX01PREUgICBCSVRfMTEKLSAgICAjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfTk9fSU5UX09OX0ZPUkNFX0RNQURfTU9ERSAgICAgQklUXzEyCisJLyogTW9kZS4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBIT1NUX0NPQUxFU0NFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV9BVFROICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBIT1NUX0NPQUxFU0NFX05PVyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfRlVMTF9TVEFUVVNfTU9ERSAgICAgICAgICAgICAgQklUX05PTkUKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV82NF9CWVRFX1NUQVRVU19NT0RFICAgICAgICAgICBCSVRfNworI2RlZmluZSBIT1NUX0NPQUxFU0NFXzMyX0JZVEVfU1RBVFVTX01PREUgICAgICAgICAgIEJJVF84CisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfQ0xFQVJfVElDS1NfT05fUlhfQkRfRVZFTlQgICAgQklUXzkKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV9DTEVBUl9USUNLU19PTl9UWF9CRF9FVkVOVCAgICBCSVRfMTAKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV9OT19JTlRfT05fQ09BTEVTQ0VfTk9XX01PREUgICBCSVRfMTEKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV9OT19JTlRfT05fRk9SQ0VfRE1BRF9NT0RFICAgICBCSVRfMTIKIAotICAgIC8qIFN0YXR1cy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX0VSUk9SX0FUVE4gICAgICAgICAgICAgICAgICAgIEJJVF8yCisJLyogU3RhdHVzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV9FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMgogCi0gICAgLyogUmVjZWl2ZSBjb2FsZXNjaW5nIHRpY2tzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q29hbGVzY2luZ1RpY2tzOworCS8qIFJlY2VpdmUgY29hbGVzY2luZyB0aWNrcy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBSeENvYWxlc2NpbmdUaWNrczsKIAotICAgIC8qIFNlbmQgY29hbGVzY2luZyB0aWNrcy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeENvYWxlc2NpbmdUaWNrczsKKwkvKiBTZW5kIGNvYWxlc2NpbmcgdGlja3MuICovCisJVDNfMzJCSVRfUkVHSVNURVIgVHhDb2FsZXNjaW5nVGlja3M7CiAKLSAgICAvKiBSZWNlaXZlIG1heCBjb2FsZXNjZWQgZnJhbWVzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4TWF4Q29hbGVzY2VkRnJhbWVzOworCS8qIFJlY2VpdmUgbWF4IGNvYWxlc2NlZCBmcmFtZXMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgUnhNYXhDb2FsZXNjZWRGcmFtZXM7CiAKLSAgICAvKiBTZW5kIG1heCBjb2FsZXNjZWQgZnJhbWVzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4TWF4Q29hbGVzY2VkRnJhbWVzOworCS8qIFNlbmQgbWF4IGNvYWxlc2NlZCBmcmFtZXMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgVHhNYXhDb2FsZXNjZWRGcmFtZXM7CiAKLSAgICAvKiBSZWNlaXZlIGNvYWxlc2NpbmcgdGlja3MgZHVyaW5nIGludGVycnVwdC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeENvYWxlc2NlZFRpY2tEdXJpbmdJbnQ7CisJLyogUmVjZWl2ZSBjb2FsZXNjaW5nIHRpY2tzIGR1cmluZyBpbnRlcnJ1cHQuICovCisJVDNfMzJCSVRfUkVHSVNURVIgUnhDb2FsZXNjZWRUaWNrRHVyaW5nSW50OwogCi0gICAgLyogU2VuZCBjb2FsZXNjaW5nIHRpY2tzIGR1cmluZyBpbnRlcnJ1cHQuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhDb2FsZXNjZWRUaWNrRHVyaW5nSW50OworCS8qIFNlbmQgY29hbGVzY2luZyB0aWNrcyBkdXJpbmcgaW50ZXJydXB0LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFR4Q29hbGVzY2VkVGlja0R1cmluZ0ludDsKIAotICAgIC8qIFJlY2VpdmUgbWF4IGNvYWxlc2NlZCBmcmFtZXMgZHVyaW5nIGludGVycnVwdC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludDsKKwkvKiBSZWNlaXZlIG1heCBjb2FsZXNjZWQgZnJhbWVzIGR1cmluZyBpbnRlcnJ1cHQuICovCisJVDNfMzJCSVRfUkVHSVNURVIgUnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQ7CiAKLSAgICAvKiBTZW5kIG1heCBjb2FsZXNjZWQgZnJhbWVzIGR1cmluZyBpbnRlcnJ1cHQuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQ7CisJLyogU2VuZCBtYXggY29hbGVzY2VkIGZyYW1lcyBkdXJpbmcgaW50ZXJydXB0LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OwogCi0gICAgLyogU3RhdGlzdGljcyB0aWNrLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXRzQ29hbGVzY2luZ1RpY2tzOworCS8qIFN0YXRpc3RpY3MgdGljay4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0NvYWxlc2NpbmdUaWNrczsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQyWzRdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQyWzRdOwogCi0gICAgLyogU3RhdGlzdGljcyBob3N0IGFkZHJlc3MuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgU3RhdHNCbGtIb3N0QWRkcjsKKwkvKiBTdGF0aXN0aWNzIGhvc3QgYWRkcmVzcy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBTdGF0c0Jsa0hvc3RBZGRyOwogCi0gICAgLyogU3RhdHVzIGJsb2NrIGhvc3QgYWRkcmVzcy4qLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFN0YXR1c0Jsa0hvc3RBZGRyOworCS8qIFN0YXR1cyBibG9jayBob3N0IGFkZHJlc3MuICovCisJVDNfNjRCSVRfUkVHSVNURVIgU3RhdHVzQmxrSG9zdEFkZHI7CiAKLSAgICAvKiBTdGF0aXN0aWNzIE5JQyBhZGRyZXNzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXRzQmxrTmljQWRkcjsKKwkvKiBTdGF0aXN0aWNzIE5JQyBhZGRyZXNzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXRzQmxrTmljQWRkcjsKIAotICAgIC8qIFN0YXR1c3QgYmxvY2sgTklDIGFkZHJlc3MuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzQmxrTmljQWRkcjsKKwkvKiBTdGF0dXN0IGJsb2NrIE5JQyBhZGRyZXNzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1c0Jsa05pY0FkZHI7CiAKLSAgICAvKiBGbG93IGF0dGVudGlvbiByZWdpc3RlcnMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRmxvd0F0dG47CisJLyogRmxvdyBhdHRlbnRpb24gcmVnaXN0ZXJzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIEZsb3dBdHRuOwogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZDNbNF07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDNbNF07CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNKdW1ib1JjdkJkQ29uSWR4OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY1N0ZFJjdkJkQ29uSWR4OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY01pbmlSY3ZCZENvbklkeDsKKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNKdW1ib1JjdkJkQ29uSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY1N0ZFJjdkJkQ29uSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY01pbmlSY3ZCZENvbklkeDsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQ0WzM2XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkNFszNl07CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNSZXRQcm9kSWR4WzE2XTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNTbmRCZENvbklkeFsxNl07CisJVDNfMzJCSVRfUkVHSVNURVIgTmljUmV0UHJvZElkeFsxNl07CisJVDNfMzJCSVRfUkVHSVNURVIgTmljU25kQmRDb25JZHhbMTZdOwogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZDVbNzY4XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkNVs3NjhdOwogfSBUM19IT1NUX0NPQUxFU0NJTkcsICpQVDNfSE9TVF9DT0FMRVNDSU5HOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNZW1vcnkgYXJiaXRlciByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwogI2RlZmluZSBUM19NRU1fQVJCSVRFUl9NT0RFX1JFU0VUICAgICAgIEJJVF8wCiAjZGVmaW5lIFQzX01FTV9BUkJJVEVSX01PREVfRU5BQkxFICAgICAgQklUXzEKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBBcmJUcmFwQWRkckxvdzsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBBcmJUcmFwQWRkckhpZ2g7CisJVDNfMzJCSVRfUkVHSVNURVIgQXJiVHJhcEFkZHJMb3c7CisJVDNfMzJCSVRfUkVHSVNURVIgQXJiVHJhcEFkZHJIaWdoOwogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFsxMDA4XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzEwMDhdOwogfSBUM19NRU1fQVJCSVRFUiwgKlBUM19NRU1fQVJCSVRFUjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQnVmZmVyIG1hbmFnZXIgY29udHJvbCByZWdpc3Rlci4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgQlVGTUdSX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgQlVGTUdSX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgQlVGTUdSX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgQlVGTUdSX01PREVfQk1fVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgQlVGTUdSX01PREVfTUJVRl9MT1dfQVRUTl9FTkFCTEUgICAgICAgICAgICBCSVRfNAorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIEJVRk1HUl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgQlVGTUdSX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBCVUZNR1JfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIEJVRk1HUl9NT0RFX0JNX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgQlVGTUdSX01PREVfTUJVRl9MT1dfQVRUTl9FTkFCTEUgICAgICAgICAgICBCSVRfNAogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgQlVGTUdSX1NUQVRVU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgQlVGTUdSX1NUQVRVU19NQlVGX0xPVyAgICAgICAgICAgICAgICAgICAgICBCSVRfNAorCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgQlVGTUdSX1NUQVRVU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBCVUZNR1JfU1RBVFVTX01CVUZfTE9XICAgICAgICAgICAgICAgICAgICAgIEJJVF80CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmUG9vbEFkZHI7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZlBvb2xTaXplOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZSZWFkRG1hTG93V2F0ZXJNYXJrOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZNYWNSeExvd1dhdGVyTWFyazsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmSGlnaFdhdGVyTWFyazsKKwlUM18zMkJJVF9SRUdJU1RFUiBNYnVmUG9vbEFkZHI7CisJVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZlBvb2xTaXplOworCVQzXzMyQklUX1JFR0lTVEVSIE1idWZSZWFkRG1hTG93V2F0ZXJNYXJrOworCVQzXzMyQklUX1JFR0lTVEVSIE1idWZNYWNSeExvd1dhdGVyTWFyazsKKwlUM18zMkJJVF9SRUdJU1RFUiBNYnVmSGlnaFdhdGVyTWFyazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1TWJ1ZkFsbG9jUmVxOwotICAgICNkZWZpbmUgQlVGTUdSX01CVUZfQUxMT0NfQklUICAgICAgICAgICAgICAgICAgICAgQklUXzMxCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVNYnVmQWxsb2NSZXNwOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1TWJ1ZkFsbG9jUmVxOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1TWJ1ZkFsbG9jUmVzcDsKKwlUM18zMkJJVF9SRUdJU1RFUiBSeENwdU1idWZBbGxvY1JlcTsKKyNkZWZpbmUgQlVGTUdSX01CVUZfQUxMT0NfQklUICAgICAgICAgICAgICAgICAgICAgQklUXzMxCisJVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVNYnVmQWxsb2NSZXNwOworCVQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1TWJ1ZkFsbG9jUmVxOworCVQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1TWJ1ZkFsbG9jUmVzcDsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYURlc2NQb29sQWRkcjsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFEZXNjUG9vbFNpemU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTG93V2F0ZXJNYXJrOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXYXRlck1hcms7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hRGVzY1Bvb2xBZGRyOworCVQzXzMyQklUX1JFR0lTVEVSIERtYURlc2NQb29sU2l6ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFMb3dXYXRlck1hcms7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFdhdGVyTWFyazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1RG1hQWxsb2NSZXE7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVEbWFBbGxvY1Jlc3A7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhDcHVEbWFBbGxvY1JlcTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeENwdURtYUFsbG9jUmVzcDsKKwlUM18zMkJJVF9SRUdJU1RFUiBSeENwdURtYUFsbG9jUmVxOworCVQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1RG1hQWxsb2NSZXNwOworCVQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1RG1hQWxsb2NSZXE7CisJVDNfMzJCSVRfUkVHSVNURVIgVHhDcHVEbWFBbGxvY1Jlc3A7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBId2RpYWdbM107CisJVDNfMzJCSVRfUkVHSVNURVIgSHdkaWFnWzNdOwogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFs5MzZdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbOTM2XTsKIH0gVDNfQlVGRkVSX01BTkFHRVIsICpQVDNfQlVGRkVSX01BTkFHRVI7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJlYWQgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX1RBUkdFVF9BQk9SVF9BVFROX0VOQUJMRSAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX01BU1RFUl9BQk9SVF9BVFROX0VOQUJMRSAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX1BBUklUWV9FUlJPUl9BVFROX0VOQUJMRSAgICAgIEJJVF80Ci0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0FERFJfT1ZFUkZMT1dfQVRUTl9FTkFCTEUgICAgIEJJVF81Ci0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJVTl9BVFROX0VOQUJMRSAgICAgIEJJVF82Ci0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgICAgIEJJVF83Ci0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJFQURfQVRUTl9FTkFCTEUgICAgIEJJVF84Ci0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0xPTkdfUkVBRF9BVFROX0VOQUJMRSAgICAgICAgIEJJVF85Ci0gICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX1NQTElUX0VOQUJMRSAgICAgICAgICAgICAgICAgIEJJVF8xMQotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9TUExJVF9SRVNFVCAgICAgICAgICAgICAgICAgICBCSVRfMTIKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBETUFfUkVBRF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIERNQV9SRUFEX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgRE1BX1JFQURfTU9ERV9UQVJHRVRfQUJPUlRfQVRUTl9FTkFCTEUgICAgICBCSVRfMgorI2RlZmluZSBETUFfUkVBRF9NT0RFX01BU1RFUl9BQk9SVF9BVFROX0VOQUJMRSAgICAgIEJJVF8zCisjZGVmaW5lIERNQV9SRUFEX01PREVfUEFSSVRZX0VSUk9SX0FUVE5fRU5BQkxFICAgICAgQklUXzQKKyNkZWZpbmUgRE1BX1JFQURfTU9ERV9BRERSX09WRVJGTE9XX0FUVE5fRU5BQkxFICAgICBCSVRfNQorI2RlZmluZSBETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJVTl9BVFROX0VOQUJMRSAgICAgIEJJVF82CisjZGVmaW5lIERNQV9SRUFEX01PREVfRklGT19VTkRFUlJVTl9BVFROX0VOQUJMRSAgICAgQklUXzcKKyNkZWZpbmUgRE1BX1JFQURfTU9ERV9GSUZPX09WRVJSRUFEX0FUVE5fRU5BQkxFICAgICBCSVRfOAorI2RlZmluZSBETUFfUkVBRF9NT0RFX0xPTkdfUkVBRF9BVFROX0VOQUJMRSAgICAgICAgIEJJVF85CisjZGVmaW5lIERNQV9SRUFEX01PREVfU1BMSVRfRU5BQkxFICAgICAgICAgICAgICAgICAgQklUXzExCisjZGVmaW5lIERNQV9SRUFEX01PREVfU1BMSVRfUkVTRVQgICAgICAgICAgICAgICAgICAgQklUXzEyCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfVEFSR0VUX0FCT1JUX0FUVE4gICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfTUFTVEVSX0FCT1JUX0FUVE4gICAgICAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfUEFSSVRZX0VSUk9SX0FUVE4gICAgICAgICAgIEJJVF80Ci0gICAgI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfQUREUl9PVkVSRkxPV19BVFROICAgICAgICAgIEJJVF81Ci0gICAgI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfRklGT19PVkVSUlVOX0FUVE4gICAgICAgICAgIEJJVF82Ci0gICAgI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfRklGT19VTkRFUlJVTl9BVFROICAgICAgICAgIEJJVF83Ci0gICAgI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfRklGT19PVkVSUkVBRF9BVFROICAgICAgICAgIEJJVF84Ci0gICAgI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfTE9OR19SRUFEX0FUVE4gICAgICAgICAgICAgIEJJVF85CisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfVEFSR0VUX0FCT1JUX0FUVE4gICAgICAgICAgIEJJVF8yCisjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19NQVNURVJfQUJPUlRfQVRUTiAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX1BBUklUWV9FUlJPUl9BVFROICAgICAgICAgICBCSVRfNAorI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfQUREUl9PVkVSRkxPV19BVFROICAgICAgICAgIEJJVF81CisjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19GSUZPX09WRVJSVU5fQVRUTiAgICAgICAgICAgQklUXzYKKyNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX0ZJRk9fVU5ERVJSVU5fQVRUTiAgICAgICAgICBCSVRfNworI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfRklGT19PVkVSUkVBRF9BVFROICAgICAgICAgIEJJVF84CisjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19MT05HX1JFQURfQVRUTiAgICAgICAgICAgICAgQklUXzkKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbMTAxNl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFsxMDE2XTsKIH0gVDNfRE1BX1JFQUQsICpQVDNfRE1BX1JFQUQ7CiAKLXR5cGVkZWYgdW5pb24gVDNfQ1BVCi17Ci0gIHN0cnVjdAotICB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgbW9kZTsKLSAgICAjZGVmaW5lIENQVV9NT0RFX0hBTFQgICBCSVRfMTAKLSAgICAjZGVmaW5lIENQVV9NT0RFX1JFU0VUICBCSVRfMAotICAgIFQzXzMyQklUX1JFR0lTVEVSIHN0YXRlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEV2ZW50TWFzazsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiByZXNlcnZlZDFbNF07Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUEM7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSW5zdHJ1Y3Rpb247Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3BhZFVuZGVyZmxvdzsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ0NsZWFyOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFdhdGNoZG9nVmVjdG9yOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFdhdGNoZG9nU2F2ZWRQQzsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBIYXJkd2FyZUJwOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIHJlc2VydmVkMlszXTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ1NhdmVkU3RhdGU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTGFzdEJyY2hBZGRyOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNwYWRVbmRlcmZsb3dTZXQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgcmVzZXJ2ZWQzWygweDIwMC0weDUwKS80XTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSZWdzWzMyXTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiByZXNlcnZlZDRbKDB4NDAwLTB4MjgwKS80XTsKLSAgfXJlZzsKLX1UM19DUFUsICpQVDNfQ1BVOwordHlwZWRlZiB1bmlvbiBUM19DUFUgeworCXN0cnVjdCB7CisJCVQzXzMyQklUX1JFR0lTVEVSIG1vZGU7CisjZGVmaW5lIENQVV9NT0RFX0hBTFQgICBCSVRfMTAKKyNkZWZpbmUgQ1BVX01PREVfUkVTRVQgIEJJVF8wCisJCVQzXzMyQklUX1JFR0lTVEVSIHN0YXRlOworCQlUM18zMkJJVF9SRUdJU1RFUiBFdmVudE1hc2s7CisJCVQzXzMyQklUX1JFR0lTVEVSIHJlc2VydmVkMVs0XTsKKwkJVDNfMzJCSVRfUkVHSVNURVIgUEM7CisJCVQzXzMyQklUX1JFR0lTVEVSIEluc3RydWN0aW9uOworCQlUM18zMkJJVF9SRUdJU1RFUiBTcGFkVW5kZXJmbG93OworCQlUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ0NsZWFyOworCQlUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ1ZlY3RvcjsKKwkJVDNfMzJCSVRfUkVHSVNURVIgV2F0Y2hkb2dTYXZlZFBDOworCQlUM18zMkJJVF9SRUdJU1RFUiBIYXJkd2FyZUJwOworCQlUM18zMkJJVF9SRUdJU1RFUiByZXNlcnZlZDJbM107CisJCVQzXzMyQklUX1JFR0lTVEVSIFdhdGNoZG9nU2F2ZWRTdGF0ZTsKKwkJVDNfMzJCSVRfUkVHSVNURVIgTGFzdEJyY2hBZGRyOworCQlUM18zMkJJVF9SRUdJU1RFUiBTcGFkVW5kZXJmbG93U2V0OworCQlUM18zMkJJVF9SRUdJU1RFUiByZXNlcnZlZDNbKDB4MjAwIC0gMHg1MCkgLyA0XTsKKwkJVDNfMzJCSVRfUkVHSVNURVIgUmVnc1szMl07CisJCVQzXzMyQklUX1JFR0lTVEVSIHJlc2VydmVkNFsoMHg0MDAgLSAweDI4MCkgLyA0XTsKKwl9IHJlZzsKK30gVDNfQ1BVLCAqUFQzX0NQVTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFdyaXRlIERNQSBjb250cm9sIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfVEFSR0VUX0FCT1JUX0FUVE5fRU5BQkxFICAgICBCSVRfMgotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfTUFTVEVSX0FCT1JUX0FUVE5fRU5BQkxFICAgICBCSVRfMwotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfUEFSSVRZX0VSUk9SX0FUVE5fRU5BQkxFICAgICBCSVRfNAotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfQUREUl9PVkVSRkxPV19BVFROX0VOQUJMRSAgICBCSVRfNQotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfRklGT19PVkVSUlVOX0FUVE5fRU5BQkxFICAgICBCSVRfNgotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfRklGT19VTkRFUlJVTl9BVFROX0VOQUJMRSAgICBCSVRfNwotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfRklGT19PVkVSUkVBRF9BVFROX0VOQUJMRSAgICBCSVRfOAotICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfTE9OR19SRUFEX0FUVE5fRU5BQkxFICAgICAgICBCSVRfOQorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIERNQV9XUklURV9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgRE1BX1dSSVRFX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBETUFfV1JJVEVfTU9ERV9UQVJHRVRfQUJPUlRfQVRUTl9FTkFCTEUgICAgIEJJVF8yCisjZGVmaW5lIERNQV9XUklURV9NT0RFX01BU1RFUl9BQk9SVF9BVFROX0VOQUJMRSAgICAgQklUXzMKKyNkZWZpbmUgRE1BX1dSSVRFX01PREVfUEFSSVRZX0VSUk9SX0FUVE5fRU5BQkxFICAgICBCSVRfNAorI2RlZmluZSBETUFfV1JJVEVfTU9ERV9BRERSX09WRVJGTE9XX0FUVE5fRU5BQkxFICAgIEJJVF81CisjZGVmaW5lIERNQV9XUklURV9NT0RFX0ZJRk9fT1ZFUlJVTl9BVFROX0VOQUJMRSAgICAgQklUXzYKKyNkZWZpbmUgRE1BX1dSSVRFX01PREVfRklGT19VTkRFUlJVTl9BVFROX0VOQUJMRSAgICBCSVRfNworI2RlZmluZSBETUFfV1JJVEVfTU9ERV9GSUZPX09WRVJSRUFEX0FUVE5fRU5BQkxFICAgIEJJVF84CisjZGVmaW5lIERNQV9XUklURV9NT0RFX0xPTkdfUkVBRF9BVFROX0VOQUJMRSAgICAgICAgQklUXzkKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKLSAgICAjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfVEFSR0VUX0FCT1JUX0FUVE4gICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfTUFTVEVSX0FCT1JUX0FUVE4gICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfUEFSSVRZX0VSUk9SX0FUVE4gICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfQUREUl9PVkVSRkxPV19BVFROICAgICAgICAgQklUXzUKLSAgICAjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfRklGT19PVkVSUlVOX0FUVE4gICAgICAgICAgQklUXzYKLSAgICAjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfRklGT19VTkRFUlJVTl9BVFROICAgICAgICAgQklUXzcKLSAgICAjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfRklGT19PVkVSUkVBRF9BVFROICAgICAgICAgQklUXzgKLSAgICAjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfTE9OR19SRUFEX0FUVE4gICAgICAgICAgICAgQklUXzkKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfVEFSR0VUX0FCT1JUX0FUVE4gICAgICAgICAgQklUXzIKKyNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19NQVNURVJfQUJPUlRfQVRUTiAgICAgICAgICBCSVRfMworI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX1BBUklUWV9FUlJPUl9BVFROICAgICAgICAgIEJJVF80CisjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfQUREUl9PVkVSRkxPV19BVFROICAgICAgICAgQklUXzUKKyNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19GSUZPX09WRVJSVU5fQVRUTiAgICAgICAgICBCSVRfNgorI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX0ZJRk9fVU5ERVJSVU5fQVRUTiAgICAgICAgIEJJVF83CisjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfRklGT19PVkVSUkVBRF9BVFROICAgICAgICAgQklUXzgKKyNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19MT05HX1JFQURfQVRUTiAgICAgICAgICAgICBCSVRfOQogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFsxMDE2XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzEwMTZdOwogfSBUM19ETUFfV1JJVEUsICpQVDNfRE1BX1dSSVRFOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNYWlsYm94IHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBJbnRlcnJ1cHQgbWFpbGJveCByZWdpc3RlcnMuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgSW50ZXJydXB0WzRdOworCS8qIEludGVycnVwdCBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBJbnRlcnJ1cHRbNF07CiAKLSAgICAvKiBHZW5lcmFsIG1haWxib3ggcmVnaXN0ZXJzLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIEdlbmVyYWxbOF07CisJLyogR2VuZXJhbCBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBHZW5lcmFsWzhdOwogCi0gICAgLyogUmVsb2FkIHN0YXRpc3RpY3MgbWFpbGJveC4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBSZWxvYWRTdGF0OworCS8qIFJlbG9hZCBzdGF0aXN0aWNzIG1haWxib3guICovCisJVDNfNjRCSVRfUkVHSVNURVIgUmVsb2FkU3RhdDsKIAotICAgIC8qIFJlY2VpdmUgQkQgcmluZyBwcm9kdWNlciBpbmRleCByZWdpc3RlcnMuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgUmN2U3RkUHJvZElkeDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBSY3ZKdW1ib1Byb2RJZHg7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgUmN2TWluaVByb2RJZHg7CisJLyogUmVjZWl2ZSBCRCByaW5nIHByb2R1Y2VyIGluZGV4IHJlZ2lzdGVycy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBSY3ZTdGRQcm9kSWR4OworCVQzXzY0QklUX1JFR0lTVEVSIFJjdkp1bWJvUHJvZElkeDsKKwlUM182NEJJVF9SRUdJU1RFUiBSY3ZNaW5pUHJvZElkeDsKIAotICAgIC8qIFJlY2VpdmUgcmV0dXJuIHJpbmcgY29uc3VtZXIgaW5kZXggcmVnaXN0ZXJzLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFJjdlJldENvbklkeFsxNl07CisJLyogUmVjZWl2ZSByZXR1cm4gcmluZyBjb25zdW1lciBpbmRleCByZWdpc3RlcnMuICovCisJVDNfNjRCSVRfUkVHSVNURVIgUmN2UmV0Q29uSWR4WzE2XTsKIAotICAgIC8qIFNlbmQgQkQgcmluZyBob3N0IHByb2R1Y2VyIGluZGV4IHJlZ2lzdGVycy4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBTZW5kSG9zdFByb2RJZHhbMTZdOworCS8qIFNlbmQgQkQgcmluZyBob3N0IHByb2R1Y2VyIGluZGV4IHJlZ2lzdGVycy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBTZW5kSG9zdFByb2RJZHhbMTZdOwogCi0gICAgLyogU2VuZCBCRCByaW5nIG5pYyBwcm9kdWNlciBpbmRleCByZWdpc3RlcnMuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgU2VuZE5pY1Byb2RJZHhbMTZdOwotfVQzX01BSUxCT1gsICpQVDNfTUFJTEJPWDsKKwkvKiBTZW5kIEJEIHJpbmcgbmljIHByb2R1Y2VyIGluZGV4IHJlZ2lzdGVycy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBTZW5kTmljUHJvZElkeFsxNl07Cit9IFQzX01BSUxCT1gsICpQVDNfTUFJTEJPWDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzX01BSUxCT1ggTWFpbGJveDsKKwlUM19NQUlMQk9YIE1haWxib3g7CiAKLSAgICAvKiBQcmlvcml0eSBtYWlsYm94IHJlZ2lzdGVycy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBIaWdoUHJpb3JpdHlFdmVudFZlY3RvcjsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBIaWdoUHJpb3JpdHlFdmVudE1hc2s7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTG93UHJpb3JpdHlFdmVudFZlY3RvcjsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBMb3dQcmlvcml0eUV2ZW50TWFzazsKKwkvKiBQcmlvcml0eSBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBIaWdoUHJpb3JpdHlFdmVudFZlY3RvcjsKKwlUM18zMkJJVF9SRUdJU1RFUiBIaWdoUHJpb3JpdHlFdmVudE1hc2s7CisJVDNfMzJCSVRfUkVHSVNURVIgTG93UHJpb3JpdHlFdmVudFZlY3RvcjsKKwlUM18zMkJJVF9SRUdJU1RFUiBMb3dQcmlvcml0eUV2ZW50TWFzazsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbNDk2XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzQ5Nl07CiB9IFQzX0dSQ19NQUlMQk9YLCAqUFQzX0dSQ19NQUlMQk9YOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGbG93IHRocm91Z2ggcXVldWVzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJlc2V0OworCVQzXzMyQklUX1JFR0lTVEVSIFJlc2V0OwogCi0gICAgTE1fVUlOVDggVW51c2VkWzEyXTsKKwlMTV9VSU5UOCBVbnVzZWRbMTJdOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxSZWFkRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxSZWFkRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxSZWFkRnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxSZWFkRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFJlYWRGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFJlYWRGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hSZWFkRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoUmVhZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoUmVhZEZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFJlYWRGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hSZWFkRnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoUmVhZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoUmVhZEZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFDb21wRGlzY2FyZEZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hQ29tcERpc2NhcmRGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUNvbXBEaXNjYXJkRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUNvbXBEaXNjYXJkRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFDb21wRGlzY2FyZEZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hQ29tcERpc2NhcmRGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIERtYUNvbXBEaXNjYXJkRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIERtYUNvbXBEaXNjYXJkRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmRCZENvbXBGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmRCZENvbXBGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmRCZENvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZEJkQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZEJkQ29tcEZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZEJkQ29tcEZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZEJkQ29tcEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBTZW5kQmRDb21wRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhSW5pdGlhdG9yRnRxQ3RybDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUluaXRpYXRvckZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFJbml0aWF0b3JGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFJbml0aWF0b3JGdHFGaWZvV3JpdGVQZWVrOworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhSW5pdGlhdG9yRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUluaXRpYXRvckZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFJbml0aWF0b3JGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFJbml0aWF0b3JGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsV3JpdGVGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFdyaXRlRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxXcml0ZUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxXcml0ZUZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsV3JpdGVGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFdyaXRlRnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxXcml0ZUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxXcml0ZUZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoV3JpdGVGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXcml0ZUZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFdyaXRlRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXcml0ZUZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFdyaXRlRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoV3JpdGVGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXcml0ZUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoV3JpdGVGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMUZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMUZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUxRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUxRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUxRnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUxRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTFGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFDb21wRnRxQ3RybDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUNvbXBGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhQ29tcEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUNvbXBGdHFGaWZvV3JpdGVQZWVrOworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhQ29tcEZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFDb21wRnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUNvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFDb21wRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIEhvc3RDb2FsZXNjZUZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSG9zdENvYWxlc2NlRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBIb3N0Q29hbGVzY2VGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSG9zdENvYWxlc2NlRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBIb3N0Q29hbGVzY2VGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIEhvc3RDb2FsZXNjZUZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgSG9zdENvYWxlc2NlRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIEhvc3RDb2FsZXNjZUZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYWNUeEZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWFjVHhGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1hY1R4RnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1hY1R4RnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBNYWNUeEZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgTWFjVHhGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIE1hY1R4RnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIE1hY1R4RnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZkNsdXN0RnJlZUZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZkNsdXN0RnJlZUZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZkNsdXN0RnJlZUZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZkNsdXN0RnJlZUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBNYnVmQ2x1c3RGcmVlRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkJkQ29tcEZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2QmRDb21wRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZCZENvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2QmRDb21wRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZCZENvbXBGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkJkQ29tcEZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2QmRDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkJkQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZMaXN0UGxtdEZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2TGlzdFBsbXRGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkxpc3RQbG10RnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkxpc3RQbG10RnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZMaXN0UGxtdEZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2TGlzdFBsbXRGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkxpc3RQbG10RnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkxpc3RQbG10RnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZEluaXRpYXRvckZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUJkSW5pdGlhdG9yRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQmRJbml0aWF0b3JGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUJkSW5pdGlhdG9yRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQmRJbml0aWF0b3JGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZEluaXRpYXRvckZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUJkSW5pdGlhdG9yRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZEluaXRpYXRvckZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQ29tcEZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUNvbXBGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFDb21wRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQ29tcEZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUNvbXBGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFDb21wRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTJGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTJGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTJGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMkZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMkZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMkZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMkZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUyRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQyWzczNl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDJbNzM2XTsKIH0gVDNfRlRRLCAqUFQzX0ZUUTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHQgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKICNkZWZpbmUgTVNJX01PREVfUkVTRVQgICAgICAgQklUXzAKICNkZWZpbmUgTVNJX01PREVfRU5BQkxFICAgICAgQklUXzEKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTXNpRmlmb0FjY2VzczsKKwlUM18zMkJJVF9SRUdJU1RFUiBNc2lGaWZvQWNjZXNzOwogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFsxMDEyXTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzEwMTJdOwogfSBUM19NU0dfU0lHTkFMRURfSU5ULCAqUFQzX01TR19TSUdOQUxFRF9JTlQ7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERNQSBDb21wbGV0aW9uIHJlZ2lzdGVzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBETUFfQ09NUF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBETUFfQ09NUF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgRE1BX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBETUFfQ09NUF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzEwMjBdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbMTAyMF07CiB9IFQzX0RNQV9DT01QTEVUSU9OLCAqUFQzX0RNQV9DT01QTEVUSU9OOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBHUkMgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIE1vZGUgY29udHJvbCByZWdpc3Rlci4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgR1JDX01PREVfVVBEQVRFX09OX0NPQUxFU0NJTkcgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgR1JDX01PREVfQllURV9TV0FQX0RBVEEgICAgICAgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgR1JDX01PREVfV09SRF9TV0FQX0RBVEEgICAgICAgICAgICAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgR1JDX01PREVfU1BMSVRfSEVBREVSX01PREUgICAgICAgICAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgR1JDX01PREVfTk9fRlJBTUVfQ1JBQ0tJTkcgICAgICAgICAgICAgICAgICBCSVRfOQotICAgICNkZWZpbmUgR1JDX01PREVfSU5DTFVERV9DUkMgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0FMTE9XX0JBRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgQklUXzExCi0gICAgI2RlZmluZSBHUkNfTU9ERV9OT19JTlRFUlJVUFRfT05fU0VORFMgICAgICAgICAgICAgIEJJVF8xMwotICAgICNkZWZpbmUgR1JDX01PREVfTk9fSU5URVJSVVBUX09OX1JFQ0VJVkUgICAgICAgICAgICBCSVRfMTQKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0ZPUkNFXzMyQklUX1BDSV9CVVNfTU9ERSAgICAgICAgICAgQklUXzE1Ci0gICAgI2RlZmluZSBHUkNfTU9ERV9IT1NUX1NUQUNLX1VQICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNgotICAgICNkZWZpbmUgR1JDX01PREVfSE9TVF9TRU5EX0JEUyAgICAgICAgICAgICAgICAgICAgICBCSVRfMTcKLSAgICAjZGVmaW5lIEdSQ19NT0RFX1RYX05PX1BTRVVET19IRUFERVJfQ0hLU1VNICAgICAgICAgQklUXzIwCi0gICAgI2RlZmluZSBHUkNfTU9ERV9SWF9OT19QU0VVRE9fSEVBREVSX0NIS1NVTSAgICAgICAgIEJJVF8yMwotICAgICNkZWZpbmUgR1JDX01PREVfSU5UX09OX1RYX0NQVV9BVFROICAgICAgICAgICAgICAgICBCSVRfMjQKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0lOVF9PTl9SWF9DUFVfQVRUTiAgICAgICAgICAgICAgICAgQklUXzI1Ci0gICAgI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fTUFDX0FUVE4gICAgICAgICAgICAgICAgICAgIEJJVF8yNgotICAgICNkZWZpbmUgR1JDX01PREVfSU5UX09OX0RNQV9BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMjcKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0lOVF9PTl9GTE9XX0FUVE4gICAgICAgICAgICAgICAgICAgQklUXzI4Ci0gICAgI2RlZmluZSBHUkNfTU9ERV80WF9OSUNfQkFTRURfU0VORF9SSU5HUyAgICAgICAgICAgIEJJVF8yOQotICAgICNkZWZpbmUgR1JDX01PREVfTVVMVElDQVNUX0ZSQU1FX0VOQUJMRSAgICAgICAgICAgICBCSVRfMzAKKwkvKiBNb2RlIGNvbnRyb2wgcmVnaXN0ZXIuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgR1JDX01PREVfVVBEQVRFX09OX0NPQUxFU0NJTkcgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBHUkNfTU9ERV9CWVRFX1NXQVBfTk9OX0ZSQU1FX0RBVEEgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgR1JDX01PREVfQllURV9TV0FQX0RBVEEgICAgICAgICAgICAgICAgICAgICBCSVRfNAorI2RlZmluZSBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSAgICAgICAgICAgICAgICAgICAgIEJJVF81CisjZGVmaW5lIEdSQ19NT0RFX1NQTElUX0hFQURFUl9NT0RFICAgICAgICAgICAgICAgICAgQklUXzgKKyNkZWZpbmUgR1JDX01PREVfTk9fRlJBTUVfQ1JBQ0tJTkcgICAgICAgICAgICAgICAgICBCSVRfOQorI2RlZmluZSBHUkNfTU9ERV9JTkNMVURFX0NSQyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMAorI2RlZmluZSBHUkNfTU9ERV9BTExPV19CQURfRlJBTUVTICAgICAgICAgICAgICAgICAgIEJJVF8xMQorI2RlZmluZSBHUkNfTU9ERV9OT19JTlRFUlJVUFRfT05fU0VORFMgICAgICAgICAgICAgIEJJVF8xMworI2RlZmluZSBHUkNfTU9ERV9OT19JTlRFUlJVUFRfT05fUkVDRUlWRSAgICAgICAgICAgIEJJVF8xNAorI2RlZmluZSBHUkNfTU9ERV9GT1JDRV8zMkJJVF9QQ0lfQlVTX01PREUgICAgICAgICAgIEJJVF8xNQorI2RlZmluZSBHUkNfTU9ERV9IT1NUX1NUQUNLX1VQICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNgorI2RlZmluZSBHUkNfTU9ERV9IT1NUX1NFTkRfQkRTICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNworI2RlZmluZSBHUkNfTU9ERV9UWF9OT19QU0VVRE9fSEVBREVSX0NIS1NVTSAgICAgICAgIEJJVF8yMAorI2RlZmluZSBHUkNfTU9ERV9SWF9OT19QU0VVRE9fSEVBREVSX0NIS1NVTSAgICAgICAgIEJJVF8yMworI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fVFhfQ1BVX0FUVE4gICAgICAgICAgICAgICAgIEJJVF8yNAorI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fUlhfQ1BVX0FUVE4gICAgICAgICAgICAgICAgIEJJVF8yNQorI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fTUFDX0FUVE4gICAgICAgICAgICAgICAgICAgIEJJVF8yNgorI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fRE1BX0FUVE4gICAgICAgICAgICAgICAgICAgIEJJVF8yNworI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fRkxPV19BVFROICAgICAgICAgICAgICAgICAgIEJJVF8yOAorI2RlZmluZSBHUkNfTU9ERV80WF9OSUNfQkFTRURfU0VORF9SSU5HUyAgICAgICAgICAgIEJJVF8yOQorI2RlZmluZSBHUkNfTU9ERV9NVUxUSUNBU1RfRlJBTUVfRU5BQkxFICAgICAgICAgICAgIEJJVF8zMAogCi0gICAgLyogTWlzYyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1pc2NDZmc7Ci0gICAgI2RlZmluZSBHUkNfTUlTQ19DRkdfQ09SRV9DTE9DS19SRVNFVCAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBHUkNfTUlTQ19QUkVTQ0FMQVJfVElNRVJfTUFTSyAgICAgICAgICAgICAgIDB4ZmUKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0JEX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxZTAwMAotICAgICNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDFlMDAwCi0gICAgI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzAxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotICAgICNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwM1MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0gICAgI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzAyRkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotICAgICNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwNENJT0JFICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisJLyogTWlzYyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1pc2NDZmc7CisjZGVmaW5lIEdSQ19NSVNDX0NGR19DT1JFX0NMT0NLX1JFU0VUICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgR1JDX01JU0NfUFJFU0NBTEFSX1RJTUVSX01BU0sgICAgICAgICAgICAgICAweGZlCisjZGVmaW5lIEdSQ19NSVNDX0JEX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxZTAwMAorI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzAwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMWUwMDAKKyNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzAzUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwMkZFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzA0Q0lPQkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKIAotICAgIC8qIE1pc2NlbGxhbmVvdXMgbG9jYWwgY29udHJvbCByZWdpc3Rlci4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBMb2NhbEN0cmw7Ci0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0lOVF9BQ1RJVkUgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0NMRUFSX0lOVCAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX1NFVF9JTlQgICAgICAgICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0lOVF9PTl9BVFROICAgICAgICAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fSU5QVVQwICAgICAgICAgICAgIEJJVF84Ci0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fSU5QVVQxICAgICAgICAgICAgIEJJVF85Ci0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fSU5QVVQyICAgICAgICAgICAgIEJJVF8xMAotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMCAgICAgICAgICAgICAgICBCSVRfMTEKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgICAgICAgICAgICAgICAgQklUXzEyCi0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UyICAgICAgICAgICAgICAgIEJJVF8xMwotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDAgICAgICAgICAgICBCSVRfMTQKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxICAgICAgICAgICAgQklUXzE1Ci0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMiAgICAgICAgICAgIEJJVF8xNgotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9FTkFCTEVfRVhUX01FTU9SWSAgICAgICBCSVRfMTcKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQkFOS19TRUxFQ1QgICAgICAgICAgICAgQklUXzIxCi0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX1NTUkFNX1RZUEUgICAgICAgICAgICAgIEJJVF8yMgorCS8qIE1pc2NlbGxhbmVvdXMgbG9jYWwgY29udHJvbCByZWdpc3Rlci4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBMb2NhbEN0cmw7CisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfSU5UX0FDVElWRSAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9DTEVBUl9JTlQgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX1NFVF9JTlQgICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfSU5UX09OX0FUVE4gICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX0lOUFVUMCAgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fSU5QVVQxICAgICAgICAgICAgIEJJVF85CisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19JTlBVVDIgICAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgICAgICAgICAgICAgICAgQklUXzExCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgICAgICAgICAgICAgICAgQklUXzEyCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgICAgICAgICAgICAgICAgQklUXzEzCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwICAgICAgICAgICAgQklUXzE0CisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxICAgICAgICAgICAgQklUXzE1CisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQyICAgICAgICAgICAgQklUXzE2CisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfRU5BQkxFX0VYVF9NRU1PUlkgICAgICAgQklUXzE3CisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQkFOS19TRUxFQ1QgICAgICAgICAgICAgQklUXzIxCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfU1NSQU1fVFlQRSAgICAgICAgICAgICAgQklUXzIyCiAKLSAgICAjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfMjU2SyAgICAgMAotICAgICNkZWZpbmUgR1JDX01JU0NfTUVNU0laRV81MTJLICAgICAoMSA8PCAxOCkKLSAgICAjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfMTAyNEsgICAgKDIgPDwgMTgpCi0gICAgI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzIwNDhLICAgICgzIDw8IDE4KQotICAgICNkZWZpbmUgR1JDX01JU0NfTUVNU0laRV80MDk2SyAgICAoNCA8PCAxOCkKLSAgICAjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfODE5MksgICAgKDUgPDwgMTgpCi0gICAgI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzE2TSAgICAgICg2IDw8IDE4KQotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9BVVRPX1NFRVBST00gICAgICAgICAgICBCSVRfMjQKKyNkZWZpbmUgR1JDX01JU0NfTUVNU0laRV8yNTZLICAgICAwCisjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfNTEySyAgICAgKDEgPDwgMTgpCisjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfMTAyNEsgICAgKDIgPDwgMTgpCisjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfMjA0OEsgICAgKDMgPDwgMTgpCisjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfNDA5NksgICAgKDQgPDwgMTgpCisjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfODE5MksgICAgKDUgPDwgMTgpCisjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfMTZNICAgICAgKDYgPDwgMTgpCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQVVUT19TRUVQUk9NICAgICAgICAgICAgQklUXzI0CiAKKwlUM18zMkJJVF9SRUdJU1RFUiBUaW1lcjsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFRpbWVyOworCVQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1RXZlbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgUnhUaW1lclJlZjsKKwlUM18zMkJJVF9SRUdJU1RFUiBSeENwdVNlbWFwaG9yZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSZW1vdGVSeENwdUF0dG47CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeENwdUV2ZW50OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4VGltZXJSZWY7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVTZW1hcGhvcmU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmVtb3RlUnhDcHVBdHRuOworCVQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1RXZlbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgVHhUaW1lclJlZjsKKwlUM18zMkJJVF9SRUdJU1RFUiBUeENwdVNlbWFwaG9yZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSZW1vdGVUeENwdUF0dG47CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeENwdUV2ZW50OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4VGltZXJSZWY7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhDcHVTZW1hcGhvcmU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmVtb3RlVHhDcHVBdHRuOworCVQzXzY0QklUX1JFR0lTVEVSIE1lbW9yeVBvd2VyVXA7CiAKLSAgICBUM182NEJJVF9SRUdJU1RFUiBNZW1vcnlQb3dlclVwOworCVQzXzMyQklUX1JFR0lTVEVSIEVlcHJvbUFkZHI7CisjZGVmaW5lIFNFRVBST01fQUREUl9XUklURSAgICAgICAwCisjZGVmaW5lIFNFRVBST01fQUREUl9SRUFEICAgICAgICAoMSA8PCAzMSkKKyNkZWZpbmUgU0VFUFJPTV9BRERSX1JXX01BU0sgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgU0VFUFJPTV9BRERSX0NPTVBMRVRFICAgICgxIDw8IDMwKQorI2RlZmluZSBTRUVQUk9NX0FERFJfRlNNX1JFU0VUICAgKDEgPDwgMjkpCisjZGVmaW5lIFNFRVBST01fQUREUl9ERVZfSUQoeCkgICAoeCA8PCAyNikKKyNkZWZpbmUgU0VFUFJPTV9BRERSX0RFVl9JRF9NQVNLIDB4MWMwMDAwMDAKKyNkZWZpbmUgU0VFUFJPTV9BRERSX1NUQVJUICAgICAgICgxIDw8IDI1KQorI2RlZmluZSBTRUVQUk9NX0FERFJfQ0xLX1BFUkQoeCkgKHggPDwgMTYpCisjZGVmaW5lIFNFRVBST01fQUREUl9BRERSRVNTKHgpICAoeCAmIDB4ZmZmYykKKyNkZWZpbmUgU0VFUFJPTV9BRERSX0FERFJFU1NfTUFTSyAweDAwMDBmZmZmCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBFZXByb21BZGRyOwotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX1dSSVRFICAgICAgIDAKLSAgICAjZGVmaW5lIFNFRVBST01fQUREUl9SRUFEICAgICAgICAoMSA8PCAzMSkKLSAgICAjZGVmaW5lIFNFRVBST01fQUREUl9SV19NQVNLICAgICAweDgwMDAwMDAwCi0gICAgI2RlZmluZSBTRUVQUk9NX0FERFJfQ09NUExFVEUgICAgKDEgPDwgMzApCi0gICAgI2RlZmluZSBTRUVQUk9NX0FERFJfRlNNX1JFU0VUICAgKDEgPDwgMjkpCi0gICAgI2RlZmluZSBTRUVQUk9NX0FERFJfREVWX0lEKHgpICAgKHggPDwgMjYpCi0gICAgI2RlZmluZSBTRUVQUk9NX0FERFJfREVWX0lEX01BU0sgMHgxYzAwMDAwMAotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX1NUQVJUICAgICAgICgxIDw8IDI1KQotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0NMS19QRVJEKHgpICh4IDw8IDE2KQotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0FERFJFU1MoeCkgICh4ICYgMHhmZmZjKQotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0FERFJFU1NfTUFTSyAweDAwMDBmZmZmCisjZGVmaW5lIFNFRVBST01fQ0xPQ0tfUEVSSU9EICAgICAgICA2MAorI2RlZmluZSBTRUVQUk9NX0NISVBfU0laRSAgICAgICAgICAgKDY0ICogMTAyNCkKIAotICAgICNkZWZpbmUgU0VFUFJPTV9DTE9DS19QRVJJT0QgICAgICAgIDYwCi0gICAgI2RlZmluZSBTRUVQUk9NX0NISVBfU0laRSAgICAgICAgICAgKDY0ICogMTAyNCkKKwlUM18zMkJJVF9SRUdJU1RFUiBFZXByb21EYXRhOworCVQzXzMyQklUX1JFR0lTVEVSIEVlcHJvbUN0cmw7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBFZXByb21EYXRhOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEVlcHJvbUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgTWRpQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBTZXByb21EZWxheTsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1kaUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2Vwcm9tRGVsYXk7Ci0KLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzk0OF07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFs5NDhdOwogfSBUM19HUkMsICpQVDNfR1JDOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBOVlJBTSBjb250cm9sIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgQ21kOwotICAgICNkZWZpbmUgTlZSQU1fQ01EX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgTlZSQU1fQ01EX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgTlZSQU1fQ01EX0RPX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgTlZSQU1fQ01EX1dSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgTlZSQU1fQ01EX1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfTk9ORQotICAgICNkZWZpbmUgTlZSQU1fQ01EX0VSQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNgotICAgICNkZWZpbmUgTlZSQU1fQ01EX0ZJUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNwotICAgICNkZWZpbmUgTlZSQU1fQ01EX0xBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOAordHlwZWRlZiBzdHJ1Y3QgeworCVQzXzMyQklUX1JFR0lTVEVSIENtZDsKKyNkZWZpbmUgTlZSQU1fQ01EX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBOVlJBTV9DTURfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIE5WUkFNX0NNRF9ET19JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgTlZSQU1fQ01EX1dSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNQorI2RlZmluZSBOVlJBTV9DTURfUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF9OT05FCisjZGVmaW5lIE5WUkFNX0NNRF9FUkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKKyNkZWZpbmUgTlZSQU1fQ01EX0ZJUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNworI2RlZmluZSBOVlJBTV9DTURfTEFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF84CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgV3JpdGVEYXRhOworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKwlUM18zMkJJVF9SRUdJU1RFUiBXcml0ZURhdGE7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBBZGRyOwotICAgICNkZWZpbmUgTlZSQU1fQUREUkVTU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmZmZgorCVQzXzMyQklUX1JFR0lTVEVSIEFkZHI7CisjZGVmaW5lIE5WUkFNX0FERFJFU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmYKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJlYWREYXRhOworCVQzXzMyQklUX1JFR0lTVEVSIFJlYWREYXRhOwogCi0gICAgLyogRmxhc2ggY29uZmlnIDEgcmVnaXN0ZXIuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQ29uZmlnMTsKLSAgICAjZGVmaW5lIEZMQVNIX0lOVEVSRkFDRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIEZMQVNIX1NTUkFNX0JVRkZFUlJFRF9NT0RFICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIEZMQVNIX1BBU1NfVEhSVV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIEZMQVNIX0JJVF9CQU5HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIEZMQVNIX0NPTVBBVF9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMxCisJLyogRmxhc2ggY29uZmlnIDEgcmVnaXN0ZXIuICovCisJVDNfMzJCSVRfUkVHSVNURVIgQ29uZmlnMTsKKyNkZWZpbmUgRkxBU0hfSU5URVJGQUNFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBGTEFTSF9TU1JBTV9CVUZGRVJSRURfTU9ERSAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIEZMQVNIX1BBU1NfVEhSVV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgRkxBU0hfQklUX0JBTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBGTEFTSF9DT01QQVRfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zMQogCi0gICAgLyogQnVmZmVyZWQgZmxhc2ggKEF0bWVsOiBBVDQ1REIwMTFCKSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotICAgICNkZWZpbmUgQlVGRkVSRURfRkxBU0hfUEFHRV9QT1MgICAgICAgICA5Ci0gICAgI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9CWVRFX0FERFJfTUFTSyAgICgoMTw8QlVGRkVSRURfRkxBU0hfUEFHRV9QT1MpIC0gMSkKLSAgICAjZGVmaW5lIEJVRkZFUkVEX0ZMQVNIX1BBR0VfU0laRSAgICAgICAgMjY0Ci0gICAgI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9QSFlfUEFHRV9TSVpFICAgIDUxMgorCS8qIEJ1ZmZlcmVkIGZsYXNoIChBdG1lbDogQVQ0NURCMDExQikgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgQlVGRkVSRURfRkxBU0hfUEFHRV9QT1MgICAgICAgICA5CisjZGVmaW5lIEJVRkZFUkVEX0ZMQVNIX0JZVEVfQUREUl9NQVNLICAgKCgxPDxCVUZGRVJFRF9GTEFTSF9QQUdFX1BPUykgLSAxKQorI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUgICAgICAgIDI2NAorI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9QSFlfUEFHRV9TSVpFICAgIDUxMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQ29uZmlnMjsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBDb25maWczOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3QXJiOwotICAgICNkZWZpbmUgU1dfQVJCX1JFUV9TRVQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgU1dfQVJCX1JFUV9TRVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgU1dfQVJCX1JFUV9TRVQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgU1dfQVJCX1JFUV9TRVQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgU1dfQVJCX1JFUV9DTFIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgU1dfQVJCX1JFUV9DTFIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgU1dfQVJCX1JFUV9DTFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNgotICAgICNkZWZpbmUgU1dfQVJCX1JFUV9DTFIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNwotICAgICNkZWZpbmUgU1dfQVJCX0dOVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgU1dfQVJCX0dOVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOQotICAgICNkZWZpbmUgU1dfQVJCX0dOVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKLSAgICAjZGVmaW5lIFNXX0FSQl9HTlQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzExCi0gICAgI2RlZmluZSBTV19BUkJfUkVRMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMgotICAgICNkZWZpbmUgU1dfQVJCX1JFUTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTMKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzE0Ci0gICAgI2RlZmluZSBTV19BUkJfUkVRMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNQorCVQzXzMyQklUX1JFR0lTVEVSIENvbmZpZzI7CisJVDNfMzJCSVRfUkVHSVNURVIgQ29uZmlnMzsKKwlUM18zMkJJVF9SRUdJU1RFUiBTd0FyYjsKKyNkZWZpbmUgU1dfQVJCX1JFUV9TRVQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBTV19BUkJfUkVRX1NFVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgU1dfQVJCX1JFUV9TRVQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBTV19BUkJfUkVRX0NMUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzUKKyNkZWZpbmUgU1dfQVJCX1JFUV9DTFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNgorI2RlZmluZSBTV19BUkJfUkVRX0NMUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF83CisjZGVmaW5lIFNXX0FSQl9HTlQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzgKKyNkZWZpbmUgU1dfQVJCX0dOVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOQorI2RlZmluZSBTV19BUkJfR05UMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMAorI2RlZmluZSBTV19BUkJfR05UMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMQorI2RlZmluZSBTV19BUkJfUkVRMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMgorI2RlZmluZSBTV19BUkJfUkVRMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMworI2RlZmluZSBTV19BUkJfUkVRMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNAorI2RlZmluZSBTV19BUkJfUkVRMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNQogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFs5ODhdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbOTg4XTsKIH0gVDNfTlZSQU0sICpQVDNfTlZSQU07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE5JQydzIGludGVybmFsIG1lbW9yeS4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBQYWdlIHplcm8gZm9yIHRoZSBpbnRlcm5hbCBDUFVzLiAqLwotICAgIExNX1VJTlQ4IFBhZ2VaZXJvWzB4MTAwXTsgICAgICAgICAgICAgICAvKiAweDAwMDAgKi8KKwkvKiBQYWdlIHplcm8gZm9yIHRoZSBpbnRlcm5hbCBDUFVzLiAqLworCUxNX1VJTlQ4IFBhZ2VaZXJvWzB4MTAwXTsJLyogMHgwMDAwICovCiAKLSAgICAvKiBTZW5kIFJDQnMuICovCi0gICAgVDNfUkNCIFNlbmRSY2JbMTZdOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDEwMCAqLworCS8qIFNlbmQgUkNCcy4gKi8KKwlUM19SQ0IgU2VuZFJjYlsxNl07CS8qIDB4MDEwMCAqLwogCi0gICAgLyogUmVjZWl2ZSBSZXR1cm4gUkNCcy4gKi8KLSAgICBUM19SQ0IgUmN2UmV0UmNiWzE2XTsgICAgICAgICAgICAgICAgICAgLyogMHgwMjAwICovCisJLyogUmVjZWl2ZSBSZXR1cm4gUkNCcy4gKi8KKwlUM19SQ0IgUmN2UmV0UmNiWzE2XTsJLyogMHgwMjAwICovCiAKLSAgICAvKiBTdGF0aXN0aWNzIGJsb2NrLiAqLwotICAgIFQzX1NUQVRTX0JMT0NLIFN0YXRzQmxrOyAgICAgICAgICAgICAgICAvKiAweDAzMDAgKi8KKwkvKiBTdGF0aXN0aWNzIGJsb2NrLiAqLworCVQzX1NUQVRTX0JMT0NLIFN0YXRzQmxrOwkvKiAweDAzMDAgKi8KIAotICAgIC8qIFN0YXR1cyBibG9jay4gKi8KLSAgICBUM19TVEFUVVNfQkxPQ0sgU3RhdHVzQmxrOyAgICAgICAgICAgICAgLyogMHgwYjAwICovCisJLyogU3RhdHVzIGJsb2NrLiAqLworCVQzX1NUQVRVU19CTE9DSyBTdGF0dXNCbGs7CS8qIDB4MGIwMCAqLwogCi0gICAgLyogUmVzZXJ2ZWQgZm9yIHNvZnR3YXJlLiAqLwotICAgIExNX1VJTlQ4IFJlc2VydmVkWzEyMDBdOyAgICAgICAgICAgICAgICAvKiAweDBiNTAgKi8KKwkvKiBSZXNlcnZlZCBmb3Igc29mdHdhcmUuICovCisJTE1fVUlOVDggUmVzZXJ2ZWRbMTIwMF07CS8qIDB4MGI1MCAqLwogCi0gICAgLyogVW5tYXBwZWQgcmVnaW9uLiAqLwotICAgIExNX1VJTlQ4IFVubWFwcGVkWzQwOTZdOyAgICAgICAgICAgICAgICAvKiAweDEwMDAgKi8KKwkvKiBVbm1hcHBlZCByZWdpb24uICovCisJTE1fVUlOVDggVW5tYXBwZWRbNDA5Nl07CS8qIDB4MTAwMCAqLwogCi0gICAgLyogRE1BIGRlc2NyaXB0b3JzLiAqLwotICAgIExNX1VJTlQ4IERtYURlc2NbODE5Ml07ICAgICAgICAgICAgICAgICAvKiAweDIwMDAgKi8KKwkvKiBETUEgZGVzY3JpcHRvcnMuICovCisJTE1fVUlOVDggRG1hRGVzY1s4MTkyXTsJLyogMHgyMDAwICovCiAKLSAgICAvKiBCdWZmZXIgZGVzY3JpcHRvcnMuICovCi0gICAgTE1fVUlOVDggQnVmZmVyRGVzY1sxNjM4NF07ICAgICAgICAgICAgIC8qIDB4NDAwMCAqLworCS8qIEJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKwlMTV9VSU5UOCBCdWZmZXJEZXNjWzE2Mzg0XTsJLyogMHg0MDAwICovCiB9IFQzX0ZJUlNUXzMyS19TUkFNLCAqUFQzX0ZJUlNUXzMyS19TUkFNOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNZW1vcnkgbGF5b3V0LiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4gKi8KLSAgICBUM19QQ0lfQ09ORklHVVJBVElPTiBQY2lDZmc7CisJLyogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworCVQzX1BDSV9DT05GSUdVUkFUSU9OIFBjaUNmZzsKIAotICAgIC8qIFVudXNlZC4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQxWzB4MTAwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMTAwICovCisJLyogVW51c2VkLiAqLworCUxNX1VJTlQ4IFVudXNlZDFbMHgxMDBdOwkvKiAweDAxMDAgKi8KIAotICAgIC8qIE1haWxib3ggLiAqLwotICAgIFQzX01BSUxCT1ggTWFpbGJveDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAyMDAgKi8KKwkvKiBNYWlsYm94IC4gKi8KKwlUM19NQUlMQk9YIE1haWxib3g7CS8qIDB4MDIwMCAqLwogCi0gICAgLyogTUFDIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotICAgIFQzX01BQ19DT05UUk9MIE1hY0N0cmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDA0MDAgKi8KKwkvKiBNQUMgY29udHJvbCByZWdpc3RlcnMuICovCisJVDNfTUFDX0NPTlRST0wgTWFjQ3RybDsJLyogMHgwNDAwICovCiAKLSAgICAvKiBTZW5kIGRhdGEgaW5pdGlhdG9yIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotICAgIFQzX1NFTkRfREFUQV9JTklUSUFUT1IgU25kRGF0YUluOyAgICAgICAgICAgICAgICAgICAvKiAweDBjMDAgKi8KKwkvKiBTZW5kIGRhdGEgaW5pdGlhdG9yIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCVQzX1NFTkRfREFUQV9JTklUSUFUT1IgU25kRGF0YUluOwkvKiAweDBjMDAgKi8KIAotICAgIC8qIFNlbmQgZGF0YSBjb21wbGV0aW9uIENvbnRyb2wgcmVnaXN0ZXJzLiAqLwotICAgIFQzX1NFTkRfREFUQV9DT01QTEVUSU9OIFNuZERhdGFDb21wOyAgICAgICAgICAgICAgICAvKiAweDEwMDAgKi8KKwkvKiBTZW5kIGRhdGEgY29tcGxldGlvbiBDb250cm9sIHJlZ2lzdGVycy4gKi8KKwlUM19TRU5EX0RBVEFfQ09NUExFVElPTiBTbmREYXRhQ29tcDsJLyogMHgxMDAwICovCiAKLSAgICAvKiBTZW5kIEJEIHJpbmcgc2VsZWN0b3IuICovCi0gICAgVDNfU0VORF9CRF9TRUxFQ1RPUiBTbmRCZFNlbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTQwMCAqLworCS8qIFNlbmQgQkQgcmluZyBzZWxlY3Rvci4gKi8KKwlUM19TRU5EX0JEX1NFTEVDVE9SIFNuZEJkU2VsOwkvKiAweDE0MDAgKi8KIAotICAgIC8qIFNlbmQgQkQgaW5pdGlhdG9yIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotICAgIFQzX1NFTkRfQkRfSU5JVElBVE9SIFNuZEJkSW47ICAgICAgICAgICAgICAgICAgICAgICAvKiAweDE4MDAgKi8KKwkvKiBTZW5kIEJEIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlUM19TRU5EX0JEX0lOSVRJQVRPUiBTbmRCZEluOwkvKiAweDE4MDAgKi8KIAotICAgIC8qIFNlbmQgQkQgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19TRU5EX0JEX0NPTVBMRVRJT04gU25kQmRDb21wOyAgICAgICAgICAgICAgICAgICAgLyogMHgxYzAwICovCisJLyogU2VuZCBCRCBjb21wbGV0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCVQzX1NFTkRfQkRfQ09NUExFVElPTiBTbmRCZENvbXA7CS8qIDB4MWMwMCAqLwogCi0gICAgLyogUmVjZWl2ZSBsaXN0IHBsYWNlbWVudCBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19SQ1ZfTElTVF9QTEFDRU1FTlQgUmN2TGlzdFBsbXQ7ICAgICAgICAgICAgICAgICAgLyogMHgyMDAwICovCisJLyogUmVjZWl2ZSBsaXN0IHBsYWNlbWVudCBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlUM19SQ1ZfTElTVF9QTEFDRU1FTlQgUmN2TGlzdFBsbXQ7CS8qIDB4MjAwMCAqLwogCi0gICAgLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sLiAqLwotICAgIFQzX1JDVl9EQVRBX0JEX0lOSVRJQVRPUiBSY3ZEYXRhQmRJbjsgICAgICAgICAgICAgICAvKiAweDI0MDAgKi8KKwkvKiBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wuICovCisJVDNfUkNWX0RBVEFfQkRfSU5JVElBVE9SIFJjdkRhdGFCZEluOwkvKiAweDI0MDAgKi8KIAotICAgIC8qIFJlY2VpdmUgRGF0YSBDb21wbGV0aW9uIENvbnRyb2wgKi8KLSAgICBUM19SQ1ZfREFUQV9DT01QTEVUSU9OIFJjdkRhdGFDb21wOyAgICAgICAgICAgICAgICAgLyogMHgyODAwICovCisJLyogUmVjZWl2ZSBEYXRhIENvbXBsZXRpb24gQ29udHJvbCAqLworCVQzX1JDVl9EQVRBX0NPTVBMRVRJT04gUmN2RGF0YUNvbXA7CS8qIDB4MjgwMCAqLwogCi0gICAgLyogUmVjZWl2ZSBCRCBJbml0aWF0b3IgQ29udHJvbCBSZWdpc3RlcnMuICovCi0gICAgVDNfUkNWX0JEX0lOSVRJQVRPUiBSY3ZCZEluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MmMwMCAqLworCS8qIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wgUmVnaXN0ZXJzLiAqLworCVQzX1JDVl9CRF9JTklUSUFUT1IgUmN2QmRJbjsJLyogMHgyYzAwICovCiAKLSAgICAvKiBSZWNlaXZlIEJEIENvbXBsZXRpb24gQ29udHJvbCBSZWdpc3RlcnMuICovCi0gICAgVDNfUkNWX0JEX0NPTVBMRVRJT04gUmN2QmRDb21wOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAwMCAqLworCS8qIFJlY2VpdmUgQkQgQ29tcGxldGlvbiBDb250cm9sIFJlZ2lzdGVycy4gKi8KKwlUM19SQ1ZfQkRfQ09NUExFVElPTiBSY3ZCZENvbXA7CS8qIDB4MzAwMCAqLwogCi0gICAgLyogUmVjZWl2ZSBsaXN0IHNlbGVjdG9yIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotICAgIFQzX1JDVl9MSVNUX1NFTEVDVE9SIFJjdkxpc3RTZWw7ICAgICAgICAgICAgICAgICAgICAvKiAweDM0MDAgKi8KKwkvKiBSZWNlaXZlIGxpc3Qgc2VsZWN0b3IgY29udHJvbCByZWdpc3RlcnMuICovCisJVDNfUkNWX0xJU1RfU0VMRUNUT1IgUmN2TGlzdFNlbDsJLyogMHgzNDAwICovCiAKLSAgICAvKiBNYnVmIGNsdXN0ZXIgZnJlZSByZWdpc3RlcnMuICovCi0gICAgVDNfTUJVRl9DTFVTVEVSX0ZSRUUgTWJ1ZkNsdXN0ZXJGcmVlOyAgICAgICAgICAgICAgIC8qIDB4MzgwMCAqLworCS8qIE1idWYgY2x1c3RlciBmcmVlIHJlZ2lzdGVycy4gKi8KKwlUM19NQlVGX0NMVVNURVJfRlJFRSBNYnVmQ2x1c3RlckZyZWU7CS8qIDB4MzgwMCAqLwogCi0gICAgLyogSG9zdCBjb2FsZXNjaW5nIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotICAgIFQzX0hPU1RfQ09BTEVTQ0lORyBIb3N0Q29hbGVzY2U7ICAgICAgICAgICAgICAgICAgICAvKiAweDNjMDAgKi8KKwkvKiBIb3N0IGNvYWxlc2NpbmcgY29udHJvbCByZWdpc3RlcnMuICovCisJVDNfSE9TVF9DT0FMRVNDSU5HIEhvc3RDb2FsZXNjZTsJLyogMHgzYzAwICovCiAKLSAgICAvKiBNZW1vcnkgYXJiaXRlciBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19NRU1fQVJCSVRFUiBNZW1BcmJpdGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg0MDAwICovCisJLyogTWVtb3J5IGFyYml0ZXIgY29udHJvbCByZWdpc3RlcnMuICovCisJVDNfTUVNX0FSQklURVIgTWVtQXJiaXRlcjsJLyogMHg0MDAwICovCiAKLSAgICAvKiBCdWZmZXIgbWFuZ2VyIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotICAgIFQzX0JVRkZFUl9NQU5BR0VSIEJ1Zk1ncjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDQ0MDAgKi8KKwkvKiBCdWZmZXIgbWFuZ2VyIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCVQzX0JVRkZFUl9NQU5BR0VSIEJ1Zk1ncjsJLyogMHg0NDAwICovCiAKLSAgICAvKiBSZWFkIERNQSBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19ETUFfUkVBRCBEbWFSZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg0ODAwICovCisJLyogUmVhZCBETUEgY29udHJvbCByZWdpc3RlcnMuICovCisJVDNfRE1BX1JFQUQgRG1hUmVhZDsJLyogMHg0ODAwICovCiAKLSAgICAvKiBXcml0ZSBETUEgY29udHJvbCByZWdpc3RlcnMuICovCi0gICAgVDNfRE1BX1dSSVRFIERtYVdyaXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NGMwMCAqLworCS8qIFdyaXRlIERNQSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlUM19ETUFfV1JJVEUgRG1hV3JpdGU7CS8qIDB4NGMwMCAqLwogCi0gICAgVDNfQ1BVIHJ4Q3B1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NTAwMCAqLwotICAgIFQzX0NQVSB0eENwdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDU0MDAgKi8KKwlUM19DUFUgcnhDcHU7CQkvKiAweDUwMDAgKi8KKwlUM19DUFUgdHhDcHU7CQkvKiAweDU0MDAgKi8KIAotICAgIC8qIE1haWxib3hlcy4gKi8KLSAgICBUM19HUkNfTUFJTEJPWCBHcmNNYWlsYm94OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg1ODAwICovCisJLyogTWFpbGJveGVzLiAqLworCVQzX0dSQ19NQUlMQk9YIEdyY01haWxib3g7CS8qIDB4NTgwMCAqLwogCi0gICAgLyogRmxvdyBUaHJvdWdoIHF1ZXVlcy4gKi8KLSAgICBUM19GVFEgRnRxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg1YzAwICovCisJLyogRmxvdyBUaHJvdWdoIHF1ZXVlcy4gKi8KKwlUM19GVFEgRnRxOwkJLyogMHg1YzAwICovCiAKLSAgICAvKiBNZXNzYWdlIHNpZ25hbGVkIGludGVycnVwdCByZWdpc3Rlcy4gKi8KLSAgICBUM19NU0dfU0lHTkFMRURfSU5UIE1zaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg2MDAwICovCisJLyogTWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHQgcmVnaXN0ZXMuICovCisJVDNfTVNHX1NJR05BTEVEX0lOVCBNc2k7CS8qIDB4NjAwMCAqLwogCi0gICAgLyogRE1BIGNvbXBsZXRpb24gcmVnaXN0ZXJzLiAqLwotICAgIFQzX0RNQV9DT01QTEVUSU9OIERtYUNvbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDY0MDAgKi8KKwkvKiBETUEgY29tcGxldGlvbiByZWdpc3RlcnMuICovCisJVDNfRE1BX0NPTVBMRVRJT04gRG1hQ29tcDsJLyogMHg2NDAwICovCiAKLSAgICAvKiBHUkMgcmVnaXN0ZXJzLiAqLwotICAgIFQzX0dSQyBHcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDY4MDAgKi8KKwkvKiBHUkMgcmVnaXN0ZXJzLiAqLworCVQzX0dSQyBHcmM7CQkvKiAweDY4MDAgKi8KIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQyWzEwMjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg2YzAwICovCisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDJbMTAyNF07CS8qIDB4NmMwMCAqLwogCi0gICAgLyogTlZSQU0gcmVnaXN0ZXJzLiAqLwotICAgIFQzX05WUkFNIE52cmFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDcwMDAgKi8KKwkvKiBOVlJBTSByZWdpc3RlcnMuICovCisJVDNfTlZSQU0gTnZyYW07CQkvKiAweDcwMDAgKi8KIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQzWzMwNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg3NDAwICovCisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDNbMzA3Ml07CS8qIDB4NzQwMCAqLwogCi0gICAgLyogVGhlIDMyayBtZW1vcnkgd2luZG93IGludG8gdGhlIE5JQydzICovCi0gICAgLyogaW50ZXJuYWwgbWVtb3J5LiAgVGhlIG1lbW9yeSB3aW5kb3cgaXMgKi8KLSAgICAvKiBjb250cm9sbGVkIGJ5IHRoZSBNZW1vcnkgV2luZG93IEJhc2UgKi8KLSAgICAvKiBBZGRyZXNzIHJlZ2lzdGVyLiAgVGhpcyByZWdpc3RlciBpcyBsb2NhdGVkICovCi0gICAgLyogaW4gdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLiAqLwotICAgIHVuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDgwMDAgKi8KLQlUM19GSVJTVF8zMktfU1JBTSBGaXJzdDMyazsKKwkvKiBUaGUgMzJrIG1lbW9yeSB3aW5kb3cgaW50byB0aGUgTklDJ3MgKi8KKwkvKiBpbnRlcm5hbCBtZW1vcnkuICBUaGUgbWVtb3J5IHdpbmRvdyBpcyAqLworCS8qIGNvbnRyb2xsZWQgYnkgdGhlIE1lbW9yeSBXaW5kb3cgQmFzZSAqLworCS8qIEFkZHJlc3MgcmVnaXN0ZXIuICBUaGlzIHJlZ2lzdGVyIGlzIGxvY2F0ZWQgKi8KKwkvKiBpbiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UuICovCisJdW5pb24gewkJCS8qIDB4ODAwMCAqLworCQlUM19GSVJTVF8zMktfU1JBTSBGaXJzdDMyazsKIAotCS8qIFVzZSB0aGUgbWVtb3J5IHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIHRoZSAqLwotCS8qIE1CVUYgc2VnbWVudC4gKi8KLQlMTV9VSU5UMzIgTWJ1ZlszMjc2OC80XTsKLQlMTV9VSU5UMzIgTWVtQmxvY2szMktbMzI3NjgvNF07Ci0gICAgfSB1SW50TWVtOworCQkvKiBVc2UgdGhlIG1lbW9yeSB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIHRvIGRldGVybWluZSB0aGUgKi8KKwkJLyogTUJVRiBzZWdtZW50LiAqLworCQlMTV9VSU5UMzIgTWJ1ZlszMjc2OCAvIDRdOworCQlMTV9VSU5UMzIgTWVtQmxvY2szMktbMzI3NjggLyA0XTsKKwl9IHVJbnRNZW07CiB9IFQzX1NURF9NRU1fTUFQLCAqUFQzX1NURF9NRU1fTUFQOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBBZGFwdGVyIGluZm8uICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIExNX1VJTlQxNiBTdmlkOwotICAgIExNX1VJTlQxNiBTc2lkOwotICAgIExNX1VJTlQzMiBQaHlJZDsKLSAgICBMTV9VSU5UMzIgU2VyZGVzOyAgIC8qIDAgPSBjb3BwZXIgUEhZLCAxID0gU2VyZGVzICovCit0eXBlZGVmIHN0cnVjdCB7CisJTE1fVUlOVDE2IFN2aWQ7CisJTE1fVUlOVDE2IFNzaWQ7CisJTE1fVUlOVDMyIFBoeUlkOworCUxNX1VJTlQzMiBTZXJkZXM7CS8qIDAgPSBjb3BwZXIgUEhZLCAxID0gU2VyZGVzICovCiB9IExNX0FEQVBURVJfSU5GTywgKlBMTV9BREFQVEVSX0lORk87CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFBhY2tldCBxdWV1ZXMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1ERUNMQVJFX1FVRVVFX1RZUEUoTE1fUlhfUEFDS0VUX1EsIE1BWF9SWF9QQUNLRVRfREVTQ19DT1VOVCk7Ci1ERUNMQVJFX1FVRVVFX1RZUEUoTE1fVFhfUEFDS0VUX1EsIE1BWF9UWF9QQUNLRVRfREVTQ19DT1VOVCk7Ci0KK0RFQ0xBUkVfUVVFVUVfVFlQRSAoTE1fUlhfUEFDS0VUX1EsIE1BWF9SWF9QQUNLRVRfREVTQ19DT1VOVCk7CitERUNMQVJFX1FVRVVFX1RZUEUgKExNX1RYX1BBQ0tFVF9RLCBNQVhfVFhfUEFDS0VUX0RFU0NfQ09VTlQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVHggY291bnRlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgTE1fQ09VTlRFUiBUeFBhY2tldEdvb2RDbnQ7Ci0gICAgTE1fQ09VTlRFUiBUeEJ5dGVzR29vZENudDsKLSAgICBMTV9DT1VOVEVSIFR4UGFja2V0QWJvcnRlZENudDsKLSAgICBMTV9DT1VOVEVSIE5vU2VuZEJkTGVmdENudDsKLSAgICBMTV9DT1VOVEVSIE5vTWFwUmVnaXN0ZXJMZWZ0Q250OwotICAgIExNX0NPVU5URVIgVG9vTWFueUZyYWdtZW50c0NudDsKLSAgICBMTV9DT1VOVEVSIE5vVHhQYWNrZXREZXNjQ250OworCUxNX0NPVU5URVIgVHhQYWNrZXRHb29kQ250OworCUxNX0NPVU5URVIgVHhCeXRlc0dvb2RDbnQ7CisJTE1fQ09VTlRFUiBUeFBhY2tldEFib3J0ZWRDbnQ7CisJTE1fQ09VTlRFUiBOb1NlbmRCZExlZnRDbnQ7CisJTE1fQ09VTlRFUiBOb01hcFJlZ2lzdGVyTGVmdENudDsKKwlMTV9DT1VOVEVSIFRvb01hbnlGcmFnbWVudHNDbnQ7CisJTE1fQ09VTlRFUiBOb1R4UGFja2V0RGVzY0NudDsKIH0gTE1fVFhfQ09VTlRFUlMsICpQTE1fVFhfQ09VTlRFUlM7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJ4IGNvdW50ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIExNX0NPVU5URVIgUnhQYWNrZXRHb29kQ250OwotICAgIExNX0NPVU5URVIgUnhCeXRlc0dvb2RDbnQ7Ci0gICAgTE1fQ09VTlRFUiBSeFBhY2tldEVyckNudDsKLSAgICBMTV9DT1VOVEVSIFJ4RXJyQ3JjQ250OwotICAgIExNX0NPVU5URVIgUnhFcnJDb2xsQ250OwotICAgIExNX0NPVU5URVIgUnhFcnJMaW5rTG9zdENudDsKLSAgICBMTV9DT1VOVEVSIFJ4RXJyUGh5RGVjb2RlQ250OwotICAgIExNX0NPVU5URVIgUnhFcnJPZGROaWJibGVDbnQ7Ci0gICAgTE1fQ09VTlRFUiBSeEVyck1hY0Fib3J0Q250OwotICAgIExNX0NPVU5URVIgUnhFcnJTaG9ydFBhY2tldENudDsKLSAgICBMTV9DT1VOVEVSIFJ4RXJyTm9SZXNvdXJjZUNudDsKLSAgICBMTV9DT1VOVEVSIFJ4RXJyTGFyZ2VQYWNrZXRDbnQ7CisJTE1fQ09VTlRFUiBSeFBhY2tldEdvb2RDbnQ7CisJTE1fQ09VTlRFUiBSeEJ5dGVzR29vZENudDsKKwlMTV9DT1VOVEVSIFJ4UGFja2V0RXJyQ250OworCUxNX0NPVU5URVIgUnhFcnJDcmNDbnQ7CisJTE1fQ09VTlRFUiBSeEVyckNvbGxDbnQ7CisJTE1fQ09VTlRFUiBSeEVyckxpbmtMb3N0Q250OworCUxNX0NPVU5URVIgUnhFcnJQaHlEZWNvZGVDbnQ7CisJTE1fQ09VTlRFUiBSeEVyck9kZE5pYmJsZUNudDsKKwlMTV9DT1VOVEVSIFJ4RXJyTWFjQWJvcnRDbnQ7CisJTE1fQ09VTlRFUiBSeEVyclNob3J0UGFja2V0Q250OworCUxNX0NPVU5URVIgUnhFcnJOb1Jlc291cmNlQ250OworCUxNX0NPVU5URVIgUnhFcnJMYXJnZVBhY2tldENudDsKIH0gTE1fUlhfQ09VTlRFUlMsICpQTE1fUlhfQ09VTlRFUlM7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJlY2VpdmUgcHJvZHVjZXIgcmluZ3MuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIGVudW0gewotICAgIFQzX1VOS05PV05fUkNWX1BST0RfUklORyAgICA9IDAsCi0gICAgVDNfU1REX1JDVl9QUk9EX1JJTkcgICAgICAgID0gMSwKLSAgICBUM19NSU5JX1JDVl9QUk9EX1JJTkcgICAgICAgPSAyLAotICAgIFQzX0pVTUJPX1JDVl9QUk9EX1JJTkcgICAgICA9IDMKKwlUM19VTktOT1dOX1JDVl9QUk9EX1JJTkcgPSAwLAorCVQzX1NURF9SQ1ZfUFJPRF9SSU5HID0gMSwKKwlUM19NSU5JX1JDVl9QUk9EX1JJTkcgPSAyLAorCVQzX0pVTUJPX1JDVl9QUk9EX1JJTkcgPSAzCiB9IFQzX1JDVl9QUk9EX1JJTkcsICpQVDNfUkNWX1BST0RfUklORzsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUGFja2V0IGRlc2NyaXB0b3IuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjc1OCwzMzEgKzI2NzUsMzI4IEBACiAjZGVmaW5lIExNX1BBQ0tFVF9TSUdOQVRVUkVfUlggICAgICAgICAgICAgIDB4NmI3NjYxNjgKIAogdHlwZWRlZiBzdHJ1Y3QgX0xNX1BBQ0tFVCB7Ci0gICAgLyogU2V0IGluIExNLiAqLwotICAgIExNX1NUQVRVUyBQYWNrZXRTdGF0dXM7CisJLyogU2V0IGluIExNLiAqLworCUxNX1NUQVRVUyBQYWNrZXRTdGF0dXM7CiAKLSAgICAvKiBTZXQgaW4gTE0gZm9yIFJ4LCBpbiBVTSBmb3IgVHguICovCi0gICAgTE1fVUlOVDMyIFBhY2tldFNpemU7CisJLyogU2V0IGluIExNIGZvciBSeCwgaW4gVU0gZm9yIFR4LiAqLworCUxNX1VJTlQzMiBQYWNrZXRTaXplOwogCi0gICAgTE1fVUlOVDE2IEZsYWdzOworCUxNX1VJTlQxNiBGbGFnczsKIAotICAgIExNX1VJTlQxNiBWbGFuVGFnOworCUxNX1VJTlQxNiBWbGFuVGFnOwogCi0gICAgdW5pb24gewotCS8qIFNlbmQgaW5mby4gKi8KLQlzdHJ1Y3QgewotCSAgICAvKiBTZXQgdXAgYnkgVU0uICovCi0JICAgIExNX1VJTlQzMiBGcmFnQ291bnQ7CisJdW5pb24geworCQkvKiBTZW5kIGluZm8uICovCisJCXN0cnVjdCB7CisJCQkvKiBTZXQgdXAgYnkgVU0uICovCisJCQlMTV9VSU5UMzIgRnJhZ0NvdW50OwogCi0JfSBUeDsKKwkJfSBUeDsKIAotCS8qIFJlY2VpdmUgaW5mby4gKi8KLQlzdHJ1Y3QgewotCSAgICAvKiBUaGlzIGRlc2NyaXB0b3IgYmVsb25ncyB0byBlaXRoZXIgU3RkLCBNaW5pLCBvciBKdW1ibyByaW5nLiAqLwotCSAgICBUM19SQ1ZfUFJPRF9SSU5HIFJjdlByb2RSaW5nOworCQkvKiBSZWNlaXZlIGluZm8uICovCisJCXN0cnVjdCB7CisJCQkvKiBUaGlzIGRlc2NyaXB0b3IgYmVsb25ncyB0byBlaXRoZXIgU3RkLCBNaW5pLCBvciBKdW1ibyByaW5nLiAqLworCQkJVDNfUkNWX1BST0RfUklORyBSY3ZQcm9kUmluZzsKIAotCSAgICAvKiBSZWNlaXZlIGJ1ZmZlciBzaXplICovCi0JICAgIExNX1VJTlQzMiBSeEJ1ZmZlclNpemU7CisJCQkvKiBSZWNlaXZlIGJ1ZmZlciBzaXplICovCisJCQlMTV9VSU5UMzIgUnhCdWZmZXJTaXplOwogCi0JICAgIC8qIENoZWNrc3VtIGluZm9ybWF0aW9uLiAqLwotCSAgICBMTV9VSU5UMTYgSXBDaGVja3N1bTsKLQkgICAgTE1fVUlOVDE2IFRjcFVkcENoZWNrc3VtOworCQkJLyogQ2hlY2tzdW0gaW5mb3JtYXRpb24uICovCisJCQlMTV9VSU5UMTYgSXBDaGVja3N1bTsKKwkJCUxNX1VJTlQxNiBUY3BVZHBDaGVja3N1bTsKIAotCX0gUng7Ci0gICAgfSB1OworCQl9IFJ4OworCX0gdTsKIH0gTE1fUEFDS0VUOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBUaWdvbjMgZGV2aWNlIGJsb2NrLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX0xNX0RFVklDRV9CTE9DSyB7Ci0gICAgaW50IGluZGV4OyAvKiBEZXZpY2UgSUQgKi8KLSAgICAvKiBNZW1vcnkgdmlldy4gKi8KLSAgICBQVDNfU1REX01FTV9NQVAgcE1lbVZpZXc7CisJaW50IGluZGV4OwkJLyogRGV2aWNlIElEICovCisJLyogTWVtb3J5IHZpZXcuICovCisJUFQzX1NURF9NRU1fTUFQIHBNZW1WaWV3OwogCi0gICAgLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBibG9jayBvZiBtZW1vcnkgaW4gd2hpY2ggdGhlIExNX1BBQ0tFVCBkZXNjcmlwdG9ycyAqLwotICAgIC8qIGFyZSBhbGxvY2F0ZWQgZnJvbS4gKi8KLSAgICBQTE1fVk9JRCBwUGFja2V0RGVzY0Jhc2U7CisJLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBibG9jayBvZiBtZW1vcnkgaW4gd2hpY2ggdGhlIExNX1BBQ0tFVCBkZXNjcmlwdG9ycyAqLworCS8qIGFyZSBhbGxvY2F0ZWQgZnJvbS4gKi8KKwlQTE1fVk9JRCBwUGFja2V0RGVzY0Jhc2U7CiAKLSAgICBMTV9VSU5UMzIgTWlzY0hvc3RDdHJsOwotICAgIExNX1VJTlQzMiBHcmNMb2NhbEN0cmw7Ci0gICAgTE1fVUlOVDMyIERtYVJlYWRXcml0ZUN0cmw7Ci0gICAgTE1fVUlOVDMyIFBjaVN0YXRlOworCUxNX1VJTlQzMiBNaXNjSG9zdEN0cmw7CisJTE1fVUlOVDMyIEdyY0xvY2FsQ3RybDsKKwlMTV9VSU5UMzIgRG1hUmVhZFdyaXRlQ3RybDsKKwlMTV9VSU5UMzIgUGNpU3RhdGU7CiAKLSAgICAvKiBSeCBpbmZvICovCi0gICAgTE1fVUlOVDMyIFJ4U3RkRGVzY0NudDsKLSAgICBMTV9VSU5UMzIgUnhTdGRRdWV1ZWRDbnQ7Ci0gICAgTE1fVUlOVDMyIFJ4U3RkUHJvZElkeDsKKwkvKiBSeCBpbmZvICovCisJTE1fVUlOVDMyIFJ4U3RkRGVzY0NudDsKKwlMTV9VSU5UMzIgUnhTdGRRdWV1ZWRDbnQ7CisJTE1fVUlOVDMyIFJ4U3RkUHJvZElkeDsKIAotICAgIFBUM19SQ1ZfQkQgcFJ4U3RkQmRWaXJ0OwotICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgUnhTdGRCZFBoeTsKKwlQVDNfUkNWX0JEIHBSeFN0ZEJkVmlydDsKKwlMTV9QSFlTSUNBTF9BRERSRVNTIFJ4U3RkQmRQaHk7CiAKLSAgICBMTV9VSU5UMzIgUnhQYWNrZXREZXNjQ250OwotICAgIExNX1JYX1BBQ0tFVF9RIFJ4UGFja2V0RnJlZVE7Ci0gICAgTE1fUlhfUEFDS0VUX1EgUnhQYWNrZXRSZWNlaXZlZFE7CisJTE1fVUlOVDMyIFJ4UGFja2V0RGVzY0NudDsKKwlMTV9SWF9QQUNLRVRfUSBSeFBhY2tldEZyZWVROworCUxNX1JYX1BBQ0tFVF9RIFJ4UGFja2V0UmVjZWl2ZWRROwogCi0gICAgLyogUmVjZWl2ZSBpbmZvLiAqLwotICAgIFBUM19SQ1ZfQkQgcFJjdlJldEJkVmlydDsKLSAgICBMTV9QSFlTSUNBTF9BRERSRVNTIFJjdlJldEJkUGh5OwotICAgIExNX1VJTlQzMiBSY3ZSZXRDb25JZHg7CisJLyogUmVjZWl2ZSBpbmZvLiAqLworCVBUM19SQ1ZfQkQgcFJjdlJldEJkVmlydDsKKwlMTV9QSFlTSUNBTF9BRERSRVNTIFJjdlJldEJkUGh5OworCUxNX1VJTlQzMiBSY3ZSZXRDb25JZHg7CiAKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgTE1fVUlOVDMyIFJ4SnVtYm9EZXNjQ250OwotICAgIExNX1VJTlQzMiBSeEp1bWJvQnVmZmVyU2l6ZTsKLSAgICBMTV9VSU5UMzIgUnhKdW1ib1F1ZXVlZENudDsKKwlMTV9VSU5UMzIgUnhKdW1ib0Rlc2NDbnQ7CisJTE1fVUlOVDMyIFJ4SnVtYm9CdWZmZXJTaXplOworCUxNX1VJTlQzMiBSeEp1bWJvUXVldWVkQ250OwogCi0gICAgTE1fVUlOVDMyIFJ4SnVtYm9Qcm9kSWR4OworCUxNX1VJTlQzMiBSeEp1bWJvUHJvZElkeDsKIAotICAgIFBUM19SQ1ZfQkQgcFJ4SnVtYm9CZFZpcnQ7Ci0gICAgTE1fUEhZU0lDQUxfQUREUkVTUyBSeEp1bWJvQmRQaHk7Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCVBUM19SQ1ZfQkQgcFJ4SnVtYm9CZFZpcnQ7CisJTE1fUEhZU0lDQUxfQUREUkVTUyBSeEp1bWJvQmRQaHk7CisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLwogCi0gICAgLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IHRoZSB1cHBlciBtb2R1bGUgdG8gaW5mb3JtIHRoZSBwcm90b2NvbCAqLwotICAgIC8qIG9mIHRoZSBtYXhpbXVtIHRyYW5zbWl0L3JlY2VpdmUgcGFja2V0IHNpemUuICovCi0gICAgTE1fVUlOVDMyIFR4TXR1OyAgICAvKiBEb2VzIG5vdCBpbmNsdWRlIENSQy4gKi8KLSAgICBMTV9VSU5UMzIgUnhNdHU7ICAgIC8qIERvZXMgbm90IGluY2x1ZGUgQ1JDLiAqLworCS8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSB0aGUgdXBwZXIgbW9kdWxlIHRvIGluZm9ybSB0aGUgcHJvdG9jb2wgKi8KKwkvKiBvZiB0aGUgbWF4aW11bSB0cmFuc21pdC9yZWNlaXZlIHBhY2tldCBzaXplLiAqLworCUxNX1VJTlQzMiBUeE10dTsJLyogRG9lcyBub3QgaW5jbHVkZSBDUkMuICovCisJTE1fVUlOVDMyIFJ4TXR1OwkvKiBEb2VzIG5vdCBpbmNsdWRlIENSQy4gKi8KIAotICAgIC8qIFdlIG5lZWQgdG8gc2hhZG93IHRoZSBFTUFDLCBSeCwgVHggbW9kZSByZWdpc3RlcnMuICBXaXRoIEIwIHNpbGljb24sICovCi0gICAgLyogd2UgbWF5IGhhdmUgcHJvYmxlbXMgcmVhZGluZyBhbnkgTUFDIHJlZ2lzdGVycyBpbiAxMG1iIG1vZGUuICovCi0gICAgTE1fVUlOVDMyIE1hY01vZGU7Ci0gICAgTE1fVUlOVDMyIFJ4TW9kZTsKLSAgICBMTV9VSU5UMzIgVHhNb2RlOworCS8qIFdlIG5lZWQgdG8gc2hhZG93IHRoZSBFTUFDLCBSeCwgVHggbW9kZSByZWdpc3RlcnMuICBXaXRoIEIwIHNpbGljb24sICovCisJLyogd2UgbWF5IGhhdmUgcHJvYmxlbXMgcmVhZGluZyBhbnkgTUFDIHJlZ2lzdGVycyBpbiAxMG1iIG1vZGUuICovCisJTE1fVUlOVDMyIE1hY01vZGU7CisJTE1fVUlOVDMyIFJ4TW9kZTsKKwlMTV9VSU5UMzIgVHhNb2RlOwogCi0gICAgLyogTWlNb2RlIHJlZ2lzdGVyLiAqLwotICAgIExNX1VJTlQzMiBNaU1vZGU7CisJLyogTWlNb2RlIHJlZ2lzdGVyLiAqLworCUxNX1VJTlQzMiBNaU1vZGU7CiAKLSAgICAvKiBIb3N0IGNvYWxlc2NlIG1vZGUgcmVnaXN0ZXIuICovCi0gICAgTE1fVUlOVDMyIENvYWxlc2NlTW9kZTsKKwkvKiBIb3N0IGNvYWxlc2NlIG1vZGUgcmVnaXN0ZXIuICovCisJTE1fVUlOVDMyIENvYWxlc2NlTW9kZTsKIAotICAgIC8qIFNlbmQgaW5mby4gKi8KLSAgICBMTV9VSU5UMzIgVHhQYWNrZXREZXNjQ250OworCS8qIFNlbmQgaW5mby4gKi8KKwlMTV9VSU5UMzIgVHhQYWNrZXREZXNjQ250OwogCi0gICAgLyogVHggaW5mby4gKi8KLSAgICBMTV9UWF9QQUNLRVRfUSBUeFBhY2tldEZyZWVROwotICAgIExNX1RYX1BBQ0tFVF9RIFR4UGFja2V0QWN0aXZlUTsKLSAgICBMTV9UWF9QQUNLRVRfUSBUeFBhY2tldFhtaXR0ZWRROworCS8qIFR4IGluZm8uICovCisJTE1fVFhfUEFDS0VUX1EgVHhQYWNrZXRGcmVlUTsKKwlMTV9UWF9QQUNLRVRfUSBUeFBhY2tldEFjdGl2ZVE7CisJTE1fVFhfUEFDS0VUX1EgVHhQYWNrZXRYbWl0dGVkUTsKIAotICAgIC8qIFBvaW50ZXJzIHRvIFNlbmRCZC4gKi8KLSAgICBQVDNfU05EX0JEIHBTZW5kQmRWaXJ0OwotICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgU2VuZEJkUGh5OyAgLyogT25seSB2YWxpZCBmb3IgSG9zdCBiYXNlZCBTZW5kIEJELiAqLworCS8qIFBvaW50ZXJzIHRvIFNlbmRCZC4gKi8KKwlQVDNfU05EX0JEIHBTZW5kQmRWaXJ0OworCUxNX1BIWVNJQ0FMX0FERFJFU1MgU2VuZEJkUGh5OwkvKiBPbmx5IHZhbGlkIGZvciBIb3N0IGJhc2VkIFNlbmQgQkQuICovCiAKLSAgICAvKiBTZW5kIHByb2R1Y2VyIGFuZCBjb25zdW1lciBpbmRpY2VzLiAqLwotICAgIExNX1VJTlQzMiBTZW5kUHJvZElkeDsKLSAgICBMTV9VSU5UMzIgU2VuZENvbklkeDsKKwkvKiBTZW5kIHByb2R1Y2VyIGFuZCBjb25zdW1lciBpbmRpY2VzLiAqLworCUxNX1VJTlQzMiBTZW5kUHJvZElkeDsKKwlMTV9VSU5UMzIgU2VuZENvbklkeDsKIAotICAgIC8qIE51bWJlciBvZiBCRCBsZWZ0LiAqLwotICAgIGF0b21pY190IFNlbmRCZExlZnQ7CisJLyogTnVtYmVyIG9mIEJEIGxlZnQuICovCisJYXRvbWljX3QgU2VuZEJkTGVmdDsKIAotICAgIFQzX1NORF9CRCBTaGFkb3dTZW5kQmRbVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRdOworCVQzX1NORF9CRCBTaGFkb3dTZW5kQmRbVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRdOwogCi0gICAgLyogQ291bnRlcnMuICovCi0gICAgTE1fUlhfQ09VTlRFUlMgUnhDb3VudGVyczsKLSAgICBMTV9UWF9DT1VOVEVSUyBUeENvdW50ZXJzOworCS8qIENvdW50ZXJzLiAqLworCUxNX1JYX0NPVU5URVJTIFJ4Q291bnRlcnM7CisJTE1fVFhfQ09VTlRFUlMgVHhDb3VudGVyczsKIAotICAgIC8qIEhvc3QgY29hbGVzY2luZyBwYXJhbWV0ZXJzLiAqLwotICAgIExNX1VJTlQzMiBSeENvYWxlc2NpbmdUaWNrczsKLSAgICBMTV9VSU5UMzIgVHhDb2FsZXNjaW5nVGlja3M7Ci0gICAgTE1fVUlOVDMyIFJ4TWF4Q29hbGVzY2VkRnJhbWVzOwotICAgIExNX1VJTlQzMiBUeE1heENvYWxlc2NlZEZyYW1lczsKLSAgICBMTV9VSU5UMzIgU3RhdHNDb2FsZXNjaW5nVGlja3M7Ci0gICAgTE1fVUlOVDMyIFJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50OwotICAgIExNX1VJTlQzMiBUeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludDsKLSAgICBMTV9VSU5UMzIgUnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQ7Ci0gICAgTE1fVUlOVDMyIFR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OworCS8qIEhvc3QgY29hbGVzY2luZyBwYXJhbWV0ZXJzLiAqLworCUxNX1VJTlQzMiBSeENvYWxlc2NpbmdUaWNrczsKKwlMTV9VSU5UMzIgVHhDb2FsZXNjaW5nVGlja3M7CisJTE1fVUlOVDMyIFJ4TWF4Q29hbGVzY2VkRnJhbWVzOworCUxNX1VJTlQzMiBUeE1heENvYWxlc2NlZEZyYW1lczsKKwlMTV9VSU5UMzIgU3RhdHNDb2FsZXNjaW5nVGlja3M7CisJTE1fVUlOVDMyIFJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50OworCUxNX1VJTlQzMiBUeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludDsKKwlMTV9VSU5UMzIgUnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQ7CisJTE1fVUlOVDMyIFR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OwogCi0gICAgLyogRE1BIHdhdGVyIG1hcmtzLiAqLwotICAgIExNX1VJTlQzMiBEbWFNYnVmTG93TWFyazsKLSAgICBMTV9VSU5UMzIgUnhNYWNNYnVmTG93TWFyazsKLSAgICBMTV9VSU5UMzIgTWJ1ZkhpZ2hNYXJrOworCS8qIERNQSB3YXRlciBtYXJrcy4gKi8KKwlMTV9VSU5UMzIgRG1hTWJ1Zkxvd01hcms7CisJTE1fVUlOVDMyIFJ4TWFjTWJ1Zkxvd01hcms7CisJTE1fVUlOVDMyIE1idWZIaWdoTWFyazsKIAotICAgIC8qIFN0YXR1cyBibG9jay4gKi8KLSAgICBQVDNfU1RBVFVTX0JMT0NLIHBTdGF0dXNCbGtWaXJ0OwotICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgU3RhdHVzQmxrUGh5OworCS8qIFN0YXR1cyBibG9jay4gKi8KKwlQVDNfU1RBVFVTX0JMT0NLIHBTdGF0dXNCbGtWaXJ0OworCUxNX1BIWVNJQ0FMX0FERFJFU1MgU3RhdHVzQmxrUGh5OwogCi0gICAgLyogU3RhdGlzdGljcyBibG9jay4gKi8KLSAgICBQVDNfU1RBVFNfQkxPQ0sgcFN0YXRzQmxrVmlydDsKLSAgICBMTV9QSFlTSUNBTF9BRERSRVNTIFN0YXRzQmxrUGh5OworCS8qIFN0YXRpc3RpY3MgYmxvY2suICovCisJUFQzX1NUQVRTX0JMT0NLIHBTdGF0c0Jsa1ZpcnQ7CisJTE1fUEhZU0lDQUxfQUREUkVTUyBTdGF0c0Jsa1BoeTsKIAotICAgIC8qIEN1cnJlbnQgcmVjZWl2ZSBtYXNrLiAqLwotICAgIExNX1VJTlQzMiBSZWNlaXZlTWFzazsKKwkvKiBDdXJyZW50IHJlY2VpdmUgbWFzay4gKi8KKwlMTV9VSU5UMzIgUmVjZWl2ZU1hc2s7CiAKLSAgICAvKiBUYXNrIG9mZmxvYWQgY2FwYWJpbGl0aWVzLiAqLwotICAgIExNX1RBU0tfT0ZGTE9BRCBUYXNrT2ZmbG9hZENhcDsKKwkvKiBUYXNrIG9mZmxvYWQgY2FwYWJpbGl0aWVzLiAqLworCUxNX1RBU0tfT0ZGTE9BRCBUYXNrT2ZmbG9hZENhcDsKIAotICAgIC8qIFRhc2sgb2ZmbG9hZCBzZWxlY3RlZC4gKi8KLSAgICBMTV9UQVNLX09GRkxPQUQgVGFza1RvT2ZmbG9hZDsKKwkvKiBUYXNrIG9mZmxvYWQgc2VsZWN0ZWQuICovCisJTE1fVEFTS19PRkZMT0FEIFRhc2tUb09mZmxvYWQ7CiAKLSAgICAvKiBXYWtlIHVwIGNhcGFiaWxpdHkuICovCi0gICAgTE1fV0FLRV9VUF9NT0RFIFdha2VVcE1vZGVDYXA7CisJLyogV2FrZSB1cCBjYXBhYmlsaXR5LiAqLworCUxNX1dBS0VfVVBfTU9ERSBXYWtlVXBNb2RlQ2FwOwogCi0gICAgLyogV2FrZSB1cCBjYXBhYmlsaXR5LiAqLwotICAgIExNX1dBS0VfVVBfTU9ERSBXYWtlVXBNb2RlOworCS8qIFdha2UgdXAgY2FwYWJpbGl0eS4gKi8KKwlMTV9XQUtFX1VQX01PREUgV2FrZVVwTW9kZTsKIAotICAgIC8qIEZsb3cgY29udHJvbC4gKi8KLSAgICBMTV9GTE9XX0NPTlRST0wgRmxvd0NvbnRyb2xDYXA7Ci0gICAgTE1fRkxPV19DT05UUk9MIEZsb3dDb250cm9sOworCS8qIEZsb3cgY29udHJvbC4gKi8KKwlMTV9GTE9XX0NPTlRST0wgRmxvd0NvbnRyb2xDYXA7CisJTE1fRkxPV19DT05UUk9MIEZsb3dDb250cm9sOwogCi0gICAgLyogRW5hYmxlIG9yIGRpc2FibGUgUENJIE1XSS4gKi8KLSAgICBMTV9VSU5UMzIgRW5hYmxlTVdJOworCS8qIEVuYWJsZSBvciBkaXNhYmxlIFBDSSBNV0kuICovCisJTE1fVUlOVDMyIEVuYWJsZU1XSTsKIAotICAgIC8qIEVuYWJsZSA1NzAxIHRhZ2dlZCBzdGF0dXMgbW9kZS4gKi8KLSAgICBMTV9VSU5UMzIgVXNlVGFnZ2VkU3RhdHVzOworCS8qIEVuYWJsZSA1NzAxIHRhZ2dlZCBzdGF0dXMgbW9kZS4gKi8KKwlMTV9VSU5UMzIgVXNlVGFnZ2VkU3RhdHVzOwogCi0gICAgLyogTklDIHdpbGwgbm90IGNvbXB1dGUgdGhlIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uICBUaGUgZHJpdmVyIG9yIE9TICovCi0gICAgLyogbXVzdCBzZWVkIHRoZSBjaGVja3N1bSBmaWVsZCB3aXRoIHRoZSBwc2V1ZG8gY2hlY2tzdW0uICovCi0gICAgTE1fVUlOVDMyIE5vVHhQc2V1ZG9IZHJDaGtzdW07CisJLyogTklDIHdpbGwgbm90IGNvbXB1dGUgdGhlIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uICBUaGUgZHJpdmVyIG9yIE9TICovCisJLyogbXVzdCBzZWVkIHRoZSBjaGVja3N1bSBmaWVsZCB3aXRoIHRoZSBwc2V1ZG8gY2hlY2tzdW0uICovCisJTE1fVUlOVDMyIE5vVHhQc2V1ZG9IZHJDaGtzdW07CiAKLSAgICAvKiBUaGUgcmVjZWl2ZSBjaGVja3N1bSBpbiB0aGUgQkQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcHNldWRvIGNoZWNrc3VtLiAqLwotICAgIC8qIFRoZSBPUyBvciB0aGUgZHJpdmVyIG11c3QgY2FsY3VsYXRlIHRoZSBwc2V1ZG8gY2hlY2tzdW0gYW5kIGFkZCBpdCB0byAqLwotICAgIC8qIHRoZSBjaGVja3N1bSBpbiB0aGUgQkQuICovCi0gICAgTE1fVUlOVDMyIE5vUnhQc2V1ZG9IZHJDaGtzdW07CisJLyogVGhlIHJlY2VpdmUgY2hlY2tzdW0gaW4gdGhlIEJEIGRvZXMgbm90IGluY2x1ZGUgdGhlIHBzZXVkbyBjaGVja3N1bS4gKi8KKwkvKiBUaGUgT1Mgb3IgdGhlIGRyaXZlciBtdXN0IGNhbGN1bGF0ZSB0aGUgcHNldWRvIGNoZWNrc3VtIGFuZCBhZGQgaXQgdG8gKi8KKwkvKiB0aGUgY2hlY2tzdW0gaW4gdGhlIEJELiAqLworCUxNX1VJTlQzMiBOb1J4UHNldWRvSGRyQ2hrc3VtOwogCi0gICAgLyogQ3VycmVudCBub2RlIGFkZHJlc3MuICovCi0gICAgTE1fVUlOVDggTm9kZUFkZHJlc3NbOF07CisJLyogQ3VycmVudCBub2RlIGFkZHJlc3MuICovCisJTE1fVUlOVDggTm9kZUFkZHJlc3NbOF07CiAKLSAgICAvKiBUaGUgYWRhcHRlcidzIG5vZGUgYWRkcmVzcy4gKi8KLSAgICBMTV9VSU5UOCBQZXJtYW5lbnROb2RlQWRkcmVzc1s4XTsKKwkvKiBUaGUgYWRhcHRlcidzIG5vZGUgYWRkcmVzcy4gKi8KKwlMTV9VSU5UOCBQZXJtYW5lbnROb2RlQWRkcmVzc1s4XTsKIAotICAgIC8qIEFkYXB0ZXIgaW5mby4gKi8KLSAgICBMTV9VSU5UMTYgQnVzTnVtOwotICAgIExNX1VJTlQ4IERldk51bTsKLSAgICBMTV9VSU5UOCBGdW5jdE51bTsKLSAgICBMTV9VSU5UMTYgUGNpVmVuZG9ySWQ7Ci0gICAgTE1fVUlOVDE2IFBjaURldmljZUlkOwotICAgIExNX1VJTlQzMiBCb25kSWQ7Ci0gICAgTE1fVUlOVDggSXJxOwotICAgIExNX1VJTlQ4IEludFBpbjsKLSAgICBMTV9VSU5UOCBDYWNoZUxpbmVTaXplOwotICAgIExNX1VJTlQ4IFBjaVJldklkOworCS8qIEFkYXB0ZXIgaW5mby4gKi8KKwlMTV9VSU5UMTYgQnVzTnVtOworCUxNX1VJTlQ4IERldk51bTsKKwlMTV9VSU5UOCBGdW5jdE51bTsKKwlMTV9VSU5UMTYgUGNpVmVuZG9ySWQ7CisJTE1fVUlOVDE2IFBjaURldmljZUlkOworCUxNX1VJTlQzMiBCb25kSWQ7CisJTE1fVUlOVDggSXJxOworCUxNX1VJTlQ4IEludFBpbjsKKwlMTV9VSU5UOCBDYWNoZUxpbmVTaXplOworCUxNX1VJTlQ4IFBjaVJldklkOwogI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKIAlMTV9VSU5UMzIgRW5hYmxlUGNpWEZpeDsKICNlbmRpZgotICAgIExNX1VJTlQzMiBVbmRpRml4OyAgIC8qIG5ldywgamltbXkgKi8KLSAgICBMTV9VSU5UMzIgUGNpQ29tbWFuZFN0YXR1c1dvcmRzOwotICAgIExNX1VJTlQzMiBDaGlwUmV2SWQ7Ci0gICAgTE1fVUlOVDE2IFN1YnN5c3RlbVZlbmRvcklkOwotICAgIExNX1VJTlQxNiBTdWJzeXN0ZW1JZDsKLSNpZiAwICAvKiBKaW1teSwgZGVsZXRlZCBpbiBuZXcgZHJpdmVyICovCi0gICAgTE1fVUlOVDMyIE1lbUJhc2VMb3c7Ci0gICAgTE1fVUlOVDMyIE1lbUJhc2VIaWdoOwotICAgIExNX1VJTlQzMiBNZW1CYXNlU2l6ZTsKKwlMTV9VSU5UMzIgVW5kaUZpeDsJLyogbmV3LCBqaW1teSAqLworCUxNX1VJTlQzMiBQY2lDb21tYW5kU3RhdHVzV29yZHM7CisJTE1fVUlOVDMyIENoaXBSZXZJZDsKKwlMTV9VSU5UMTYgU3Vic3lzdGVtVmVuZG9ySWQ7CisJTE1fVUlOVDE2IFN1YnN5c3RlbUlkOworI2lmIDAJCQkJLyogSmltbXksIGRlbGV0ZWQgaW4gbmV3IGRyaXZlciAqLworCUxNX1VJTlQzMiBNZW1CYXNlTG93OworCUxNX1VJTlQzMiBNZW1CYXNlSGlnaDsKKwlMTV9VSU5UMzIgTWVtQmFzZVNpemU7CiAjZW5kaWYKLSAgICBQTE1fVUlOVDggcE1hcHBlZE1lbUJhc2U7CisJUExNX1VJTlQ4IHBNYXBwZWRNZW1CYXNlOwogCi0gICAgLyogU2F2ZWQgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGZvciByZXN0b3JpbmcgYWZ0ZXIgYSByZXNldC4gKi8KLSAgICBMTV9VSU5UMzIgU2F2ZWRDYWNoZUxpbmVSZWc7CisJLyogU2F2ZWQgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGZvciByZXN0b3JpbmcgYWZ0ZXIgYSByZXNldC4gKi8KKwlMTV9VSU5UMzIgU2F2ZWRDYWNoZUxpbmVSZWc7CiAKLSAgICAvKiBQaHkgaW5mby4gKi8KLSAgICBMTV9VSU5UMzIgUGh5QWRkcjsKLSAgICBMTV9VSU5UMzIgUGh5SWQ7CisJLyogUGh5IGluZm8uICovCisJTE1fVUlOVDMyIFBoeUFkZHI7CisJTE1fVUlOVDMyIFBoeUlkOwogCi0gICAgLyogUmVxdWVzdGVkIHBoeSBzZXR0aW5ncy4gKi8KLSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGU7CisJLyogUmVxdWVzdGVkIHBoeSBzZXR0aW5ncy4gKi8KKwlMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGU7CiAKLSAgICAvKiBEaXNhYmxlIGF1dG8tbmVnb3RpYXRpb24uICovCi0gICAgTE1fVUlOVDMyIERpc2FibGVBdXRvTmVnOworCS8qIERpc2FibGUgYXV0by1uZWdvdGlhdGlvbi4gKi8KKwlMTV9VSU5UMzIgRGlzYWJsZUF1dG9OZWc7CiAKLSAgICAvKiBXYXlzIGZvciB0aGUgTUFDIHRvIGdldCBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCi0gICAgTE1fVUlOVDMyIFBoeUludE1vZGU7Ci0gICAgI2RlZmluZSBUM19QSFlfSU5UX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgIDAKLSAgICAjZGVmaW5lIFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgMQotICAgICNkZWZpbmUgVDNfUEhZX0lOVF9NT0RFX0xJTktfUkVBRFkgICAgICAgICAgICAgICAgICAyCi0gICAgI2RlZmluZSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HICAgICAgICAgICAgICAgIDMKKwkvKiBXYXlzIGZvciB0aGUgTUFDIHRvIGdldCBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCisJTE1fVUlOVDMyIFBoeUludE1vZGU7CisjZGVmaW5lIFQzX1BIWV9JTlRfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVDNfUEhZX0lOVF9NT0RFX0xJTktfUkVBRFkgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcgICAgICAgICAgICAgICAgMwogCi0gICAgLyogV2F5cyB0byBkZXRlcm1pbmUgbGluayBjaGFuZ2Ugc3RhdHVzLiAqLwotICAgIExNX1VJTlQzMiBMaW5rQ2huZ01vZGU7Ci0gICAgI2RlZmluZSBUM19MSU5LX0NITkdfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgIDAKLSAgICAjZGVmaW5lIFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHICAgICAgICAgICAgMQotICAgICNkZWZpbmUgVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19CTE9DSyAgICAgICAgICAyCisJLyogV2F5cyB0byBkZXRlcm1pbmUgbGluayBjaGFuZ2Ugc3RhdHVzLiAqLworCUxNX1VJTlQzMiBMaW5rQ2huZ01vZGU7CisjZGVmaW5lIFQzX0xJTktfQ0hOR19NT0RFX0FVVE8gICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX1JFRyAgICAgICAgICAgIDEKKyNkZWZpbmUgVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19CTE9DSyAgICAgICAgICAyCiAKKwkvKiBMRUQgbW9kZS4gKi8KKwlMTV9VSU5UMzIgTGVkTW9kZTsKIAotICAgIC8qIExFRCBtb2RlLiAqLwotICAgIExNX1VJTlQzMiBMZWRNb2RlOworI2RlZmluZSBMRURfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKIAotICAgICNkZWZpbmUgTEVEX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisJLyogNTcwMC8wMSBMRUQgbW9kZS4gKi8KKyNkZWZpbmUgTEVEX01PREVfVEhSRUVfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExFRF9NT0RFX0xJTksxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgogCi0gICAgLyogNTcwMC8wMSBMRUQgbW9kZS4gKi8KLSAgICAjZGVmaW5lIExFRF9NT0RFX1RIUkVFX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgMQotICAgICNkZWZpbmUgTEVEX01PREVfTElOSzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisJLyogNTcwMy8wMi8wNCBMRUQgbW9kZS4gKi8KKyNkZWZpbmUgTEVEX01PREVfT1BFTl9EUkFJTiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExFRF9NT0RFX09VVFBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgogCi0gICAgLyogNTcwMy8wMi8wNCBMRUQgbW9kZS4gKi8KLSAgICAjZGVmaW5lIExFRF9NT0RFX09QRU5fRFJBSU4gICAgICAgICAgICAgICAgICAgICAgICAgMQotICAgICNkZWZpbmUgTEVEX01PREVfT1VUUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisJLyogV09MIFNwZWVkICovCisJTE1fVUlOVDMyIFdvbFNwZWVkOworI2RlZmluZSBXT0xfU1BFRURfMTBNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV09MX1NQRUVEXzEwME1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAKLSAgICAvKiBXT0wgU3BlZWQgKi8KLSAgICBMTV9VSU5UMzIgV29sU3BlZWQ7Ci0gICAgI2RlZmluZSBXT0xfU1BFRURfMTBNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSAgICAjZGVmaW5lIFdPTF9TUEVFRF8xMDBNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCS8qIFJlc2V0IHRoZSBQSFkgb24gaW5pdGlhbGl6YXRpb24uICovCisJTE1fVUlOVDMyIFJlc2V0UGh5T25Jbml0OwogCi0gICAgLyogUmVzZXQgdGhlIFBIWSBvbiBpbml0aWFsaXphdGlvbi4gKi8KLSAgICBMTV9VSU5UMzIgUmVzZXRQaHlPbkluaXQ7CisJTE1fVUlOVDMyIFJlc3RvcmVPbldha2VVcDsKKwlMTV9SRVFVRVNURURfTUVESUFfVFlQRSBXYWtlVXBSZXF1ZXN0ZWRNZWRpYVR5cGU7CisJTE1fVUlOVDMyIFdha2VVcERpc2FibGVBdXRvTmVnOwogCi0gICAgTE1fVUlOVDMyIFJlc3RvcmVPbldha2VVcDsKLSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRSBXYWtlVXBSZXF1ZXN0ZWRNZWRpYVR5cGU7Ci0gICAgTE1fVUlOVDMyIFdha2VVcERpc2FibGVBdXRvTmVnOworCS8qIEN1cnJlbnQgcGh5IHNldHRpbmdzLiAqLworCUxNX01FRElBX1RZUEUgTWVkaWFUeXBlOworCUxNX0xJTkVfU1BFRUQgTGluZVNwZWVkOworCUxNX0xJTkVfU1BFRUQgT2xkTGluZVNwZWVkOworCUxNX0RVUExFWF9NT0RFIER1cGxleE1vZGU7CisJTE1fU1RBVFVTIExpbmtTdGF0dXM7CisJTE1fVUlOVDMyIGFkdmVydGlzaW5nOwkvKiBKaW1teSwgbmV3ISAqLworCUxNX1VJTlQzMiBhZHZlcnRpc2luZzEwMDA7CS8qIEppbW15LCBuZXchICovCiAKLSAgICAvKiBDdXJyZW50IHBoeSBzZXR0aW5ncy4gKi8KLSAgICBMTV9NRURJQV9UWVBFIE1lZGlhVHlwZTsKLSAgICBMTV9MSU5FX1NQRUVEIExpbmVTcGVlZDsKLSAgICBMTV9MSU5FX1NQRUVEIE9sZExpbmVTcGVlZDsKLSAgICBMTV9EVVBMRVhfTU9ERSBEdXBsZXhNb2RlOwotICAgIExNX1NUQVRVUyBMaW5rU3RhdHVzOwotICAgIExNX1VJTlQzMiBhZHZlcnRpc2luZzsgICAgIC8qIEppbW15LCBuZXchICovCi0gICAgTE1fVUlOVDMyIGFkdmVydGlzaW5nMTAwMDsgLyogSmltbXksIG5ldyEgKi8KKwkvKiBNdWx0aWNhc3QgYWRkcmVzcyBsaXN0LiAqLworCUxNX1VJTlQzMiBNY0VudHJ5Q291bnQ7CisJTE1fVUlOVDggTWNUYWJsZVtMTV9NQVhfTUNfVEFCTEVfU0laRV1bTE1fTUNfRU5UUllfU0laRV07CiAKLSAgICAvKiBNdWx0aWNhc3QgYWRkcmVzcyBsaXN0LiAqLwotICAgIExNX1VJTlQzMiBNY0VudHJ5Q291bnQ7Ci0gICAgTE1fVUlOVDggTWNUYWJsZVtMTV9NQVhfTUNfVEFCTEVfU0laRV1bTE1fTUNfRU5UUllfU0laRV07CisJLyogVXNlIE5JQyBvciBIb3N0IGJhc2VkIHNlbmQgQkQuICovCisJTE1fVUlOVDMyIE5pY1NlbmRCZDsKIAotICAgIC8qIFVzZSBOSUMgb3IgSG9zdCBiYXNlZCBzZW5kIEJELiAqLwotICAgIExNX1VJTlQzMiBOaWNTZW5kQmQ7CisJLyogQXRobG9uIGZpeC4gKi8KKwlMTV9VSU5UMzIgRGVsYXlQY2lHcmFudDsKIAotICAgIC8qIEF0aGxvbiBmaXguICovCi0gICAgTE1fVUlOVDMyIERlbGF5UGNpR3JhbnQ7CisJLyogRW5hYmxlIE9uZURtYUF0T25jZSAqLworCUxNX1VJTlQzMiBPbmVEbWFBdE9uY2U7CiAKLSAgICAvKiBFbmFibGUgT25lRG1hQXRPbmNlICovCi0gICAgTE1fVUlOVDMyIE9uZURtYUF0T25jZTsKKwkvKiBTcGxpdCBNb2RlIGZsYWdzLCBKaW1teSBuZXcgKi8KKwlMTV9VSU5UMzIgU3BsaXRNb2RlRW5hYmxlOworCUxNX1VJTlQzMiBTcGxpdE1vZGVNYXhSZXE7CiAKLSAgICAvKiBTcGxpdCBNb2RlIGZsYWdzLCBKaW1teSBuZXcgKi8KLSAgICBMTV9VSU5UMzIgU3BsaXRNb2RlRW5hYmxlOwotICAgIExNX1VJTlQzMiBTcGxpdE1vZGVNYXhSZXE7CisJLyogSW5pdCBmbGFnLiAqLworCUxNX0JPT0wgSW5pdERvbmU7CiAKLSAgICAvKiBJbml0IGZsYWcuICovCi0gICAgTE1fQk9PTCBJbml0RG9uZTsKKwkvKiBTaHV0ZG93biBmbGFnLiAgU2V0IGJ5IHRoZSB1cHBlciBtb2R1bGUuICovCisJTE1fQk9PTCBTaHV0dGluZ0Rvd247CiAKLSAgICAvKiBTaHV0ZG93biBmbGFnLiAgU2V0IGJ5IHRoZSB1cHBlciBtb2R1bGUuICovCi0gICAgTE1fQk9PTCBTaHV0dGluZ0Rvd247CisJLyogRmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjYWxsIExNX1F1ZXVlUnhQYWNrZXRzIG9yIG5vdCBpbiAqLworCS8qIExNX1Jlc2V0QWRhcHRlciByb3V0aW5lLiAqLworCUxNX0JPT0wgUXVldWVSeFBhY2tldHM7CiAKLSAgICAvKiBGbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGNhbGwgTE1fUXVldWVSeFBhY2tldHMgb3Igbm90IGluICovCi0gICAgLyogTE1fUmVzZXRBZGFwdGVyIHJvdXRpbmUuICovCi0gICAgTE1fQk9PTCBRdWV1ZVJ4UGFja2V0czsKKwlMTV9VSU5UMzIgTWJ1ZkJhc2U7CisJTE1fVUlOVDMyIE1idWZTaXplOwogCi0gICAgTE1fVUlOVDMyIE1idWZCYXNlOwotICAgIExNX1VJTlQzMiBNYnVmU2l6ZTsKKwkvKiBUUlVFIGlmIHdlIGhhdmUgYSBTRVJERVMgUEhZLiAqLworCUxNX1VJTlQzMiBFbmFibGVUYmk7CiAKLSAgICAvKiBUUlVFIGlmIHdlIGhhdmUgYSBTRVJERVMgUEhZLiAqLwotICAgIExNX1VJTlQzMiBFbmFibGVUYmk7CisJLyogRXRoZXJuZXRAV2lyZVNwZWVkLiAqLworCUxNX1VJTlQzMiBFbmFibGVXaXJlU3BlZWQ7CiAKLSAgICAvKiBFdGhlcm5ldEBXaXJlU3BlZWQuICovCi0gICAgTE1fVUlOVDMyIEVuYWJsZVdpcmVTcGVlZDsKLQotICAgIExNX1VJTlQzMiBFZXByb21XcDsKKwlMTV9VSU5UMzIgRWVwcm9tV3A7CiAKICNpZiBJTkNMVURFX1RCSV9TVVBQT1JUCi0gICAgLyogQXV0b25lZyBzdGF0ZSBpbmZvLiAqLwotICAgIEFOX1NUQVRFX0lORk8gQW5JbmZvOwotICAgIExNX1VJTlQzMiBQb2xsVGJpTGluazsKLSAgICBMTV9VSU5UMzIgSWdub3JlVGJpTGlua0NoYW5nZTsKKwkvKiBBdXRvbmVnIHN0YXRlIGluZm8uICovCisJQU5fU1RBVEVfSU5GTyBBbkluZm87CisJTE1fVUlOVDMyIFBvbGxUYmlMaW5rOworCUxNX1VJTlQzMiBJZ25vcmVUYmlMaW5rQ2hhbmdlOwogI2VuZGlmCi0gICAgY2hhciBQYXJ0Tm9bMjRdOwotICAgIGNoYXIgQm9vdENvZGVWZXJbMTZdOwotICAgIGNoYXIgQnVzU3BlZWRTdHJbMjRdOyAvKiBKaW1teSwgbmV3ISAqLwotICAgIExNX1VJTlQzMiBQaHlDcmNDb3VudDsKKwljaGFyIFBhcnROb1syNF07CisJY2hhciBCb290Q29kZVZlclsxNl07CisJY2hhciBCdXNTcGVlZFN0clsyNF07CS8qIEppbW15LCBuZXchICovCisJTE1fVUlOVDMyIFBoeUNyY0NvdW50OwogfSBMTV9ERVZJQ0VfQkxPQ0s7CiAKLQogI2RlZmluZSBUM19SRUdfQ1BVX1ZJRVcgICAgICAgICAgICAgICAweGMwMDAwMDAwCiAKICNkZWZpbmUgVDNfQkxPQ0tfRE1BX1JEICAgICAgICAgICAgICAgKDEgPDwgMCkKQEAgLTMyMTYsNyArMzEzMCw2IEBACiAjZGVmaW5lIFRYX0NQVV9FVlRfU1cxMiAgICAgICAgICAgICAzMAogI2RlZmluZSBUWF9DUFVfRVZUX1NXMTMgICAgICAgICAgICAgMzEKIAotCiAvKiBUWC1DUFUgZXZlbnQgKi8KICNkZWZpbmUgVFhfQ1BVX0VWRU5UX1NXX0VWRU5UMCAgICAgICgxIDw8IFRYX0NQVV9FVlRfU1cwKQogI2RlZmluZSBUWF9DUFVfRVZFTlRfU1dfRVZFTlQxICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TVzEpCkBAIC0zMjUxLDEyICszMTY0LDEwIEBACiAjZGVmaW5lIFRYX0NQVV9FVkVOVF9TV19FVkVOVDEyICAgICAoMSA8PCBUWF9DUFVfRVZUX1NXMTIpCiAjZGVmaW5lIFRYX0NQVV9FVkVOVF9TV19FVkVOVDEzICAgICAoMSA8PCBUWF9DUFVfRVZUX1NXMTMpCiAKLQogI2RlZmluZSBUWF9DUFVfTUFTSyAoVFhfQ1BVX0VWRU5UX1NXX0VWRU5UMCB8IFwKIAkJICAgICBUWF9DUFVfRVZFTlRfU0RJICB8IFwKIAkJICAgICBUWF9DUFVfRVZFTlRfU0RDKQogCi0KICNkZWZpbmUgVDNfRlRRX1RZUEUxX1VOREVSRkxPV19CSVQgICAoMSA8PCAyOSkKICNkZWZpbmUgVDNfRlRRX1RZUEUxX1BBU1NfQklUICAgICAgICAoMSA8PCAzMCkKICNkZWZpbmUgVDNfRlRRX1RZUEUxX1NLSVBfQklUICAgICAgICAoMSA8PCAzMSkKQEAgLTMyODMsMjUgKzMxOTQsMjQgQEAKICNkZWZpbmUgVDNfUUlEX1JYX0RBVEFfQ09NUCAgICAgICAgICAgMTYKICNkZWZpbmUgVDNfUUlEX1NXX1RZUEUyICAgICAgICAgICAgICAgMTcKIAotTE1fU1RBVFVTIExNX0xvYWRGaXJtd2FyZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0JCQkgIFBUM19GV0lNR19JTkZPIHBGd0ltZywKLQkJCSAgTE1fVUlOVDMyIExvYWRDcHUsCi0JCQkgIExNX1VJTlQzMiBTdGFydENwdSk7CitMTV9TVEFUVVMgTE1fTG9hZEZpcm13YXJlIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkgICBQVDNfRldJTUdfSU5GTyBwRndJbWcsCisJCQkgICBMTV9VSU5UMzIgTG9hZENwdSwgTE1fVUlOVDMyIFN0YXJ0Q3B1KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE5JQyByZWdpc3RlciByZWFkL3dyaXRlIG1hY3Jvcy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAwICAvKiBKaW1teSAqLworI2lmIDAJCQkJLyogSmltbXkgKi8KIC8qIE1BQyByZWdpc3RlciBhY2Nlc3MuICovCi1MTV9VSU5UMzIgTE1fUmVnUmRJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUmVnaXN0ZXIpOwotTE1fVk9JRCBMTV9SZWdXckluZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBSZWdpc3RlciwKLSAgICBMTV9VSU5UMzIgVmFsdWUzMik7CitMTV9VSU5UMzIgTE1fUmVnUmRJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyKTsKK0xNX1ZPSUQgTE1fUmVnV3JJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyLAorCQkgICAgIExNX1VJTlQzMiBWYWx1ZTMyKTsKIAogLyogTUFDIG1lbW9yeSBhY2Nlc3MuICovCi1MTV9VSU5UMzIgTE1fTWVtUmRJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWVtQWRkcik7Ci1MTV9WT0lEIExNX01lbVdySW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIsCi0gICAgTE1fVUlOVDMyIFZhbHVlMzIpOworTE1fVUlOVDMyIExNX01lbVJkSW5kIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNZW1BZGRyKTsKK0xNX1ZPSUQgTE1fTWVtV3JJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIsCisJCSAgICAgTE1fVUlOVDMyIFZhbHVlMzIpOwogCiAjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAogCkBAIC0zMzQyLDcgKzMyNTIsNyBAQAogI2RlZmluZSBNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikgICAgICAgICAgICAgICAgICBcCiAgICAgTE1fTWVtV3JJbmQocERldmljZSwgT2Zmc2V0LCBWYWx1ZTMyKQogCi0jZWxzZSAvKiBub3JtYWwgdGFyZ2V0IGFjY2VzcyBwYXRoIGJlbG93ICovCisjZWxzZQkJCQkvKiBub3JtYWwgdGFyZ2V0IGFjY2VzcyBwYXRoIGJlbG93ICovCiAKIC8qIFJlZ2lzdGVyIGFjY2Vzcy4gKi8KICNkZWZpbmUgUkVHX1JEKHBEZXZpY2UsIE9mZnNldE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMzU1LDcgKzMyNjUsNiBAQAogI2RlZmluZSBSRUdfV1JfT0ZGU0VUKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB3cml0ZWwoVmFsdWUzMiwgKChMTV9VSU5UOCAqKSAocERldmljZSktPnBNZW1WaWV3ICsgT2Zmc2V0KSkKIAotCiAvKiBUaGVyZSBjb3VsZCBiZSBwcm9ibGVtIGFjY2VzcyB0aGUgbWVtb3J5IHdpbmRvdyBkaXJlY3RseS4gIEZvciBub3csICovCiAvKiB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBNRU1fUkQocERldmljZSwgQWRkck5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMzNjgsOSArMzI3Nyw5IEBACiAjZGVmaW5lIE1FTV9XUl9PRkZTRVQocERldmljZSwgT2Zmc2V0LCBWYWx1ZTMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIExNX01lbVdySW5kKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikKIAotI2VuZGlmICAvKiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5EICovCisjZW5kaWYJCQkJLyogUENJWF9UQVJHRVRfV09SS0FST1VORCAqLwogCi0jZW5kaWYgIC8qIEppbW15LCBtZXJnaW5nICovCisjZW5kaWYJCQkJLyogSmltbXksIG1lcmdpbmcgKi8KIAogICAvKiBKaW1teS4uLnJlc3Qgb2YgZmlsZSBpcyBuZXcgc3R1ZmYhICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzM3OCwxNCArMzI4NywxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogTUFDIHJlZ2lzdGVyIGFjY2Vzcy4gKi8KLUxNX1VJTlQzMiBMTV9SZWdSZEluZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBSZWdpc3Rlcik7Ci1MTV9WT0lEIExNX1JlZ1dySW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyLAotICAgIExNX1VJTlQzMiBWYWx1ZTMyKTsKK0xNX1VJTlQzMiBMTV9SZWdSZEluZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUmVnaXN0ZXIpOworTE1fVk9JRCBMTV9SZWdXckluZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUmVnaXN0ZXIsCisJCSAgICAgTE1fVUlOVDMyIFZhbHVlMzIpOwogCiAvKiBNQUMgbWVtb3J5IGFjY2Vzcy4gKi8KLUxNX1VJTlQzMiBMTV9NZW1SZEluZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNZW1BZGRyKTsKLUxNX1ZPSUQgTE1fTWVtV3JJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWVtQWRkciwKLSAgICBMTV9VSU5UMzIgVmFsdWUzMik7CitMTV9VSU5UMzIgTE1fTWVtUmRJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIpOworTE1fVk9JRCBMTV9NZW1XckluZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWVtQWRkciwKKwkJICAgICBMTV9VSU5UMzIgVmFsdWUzMik7CiAKICNkZWZpbmUgTUJfUkVHX1dSKHBEZXZpY2UsIE9mZnNldE5hbWUsIFZhbHVlMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAoKHBEZXZpY2UpLT5VbmRpRml4KSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM0MjcsNCArMzMzNiw0IEBACiAjZGVmaW5lIE1FTV9XUl9PRkZTRVQocERldmljZSwgT2Zmc2V0LCBWYWx1ZTMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIExNX01lbVdySW5kKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikKIAotI2VuZGlmIC8qIFRJR09OM19IICovCisjZW5kaWYJCQkJLyogVElHT04zX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHFtOHh4X3BjbWNpYS5jIGIvZHJpdmVycy90cW04eHhfcGNtY2lhLmMKaW5kZXggYTBmNTNjZC4uMTMyYzdhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90cW04eHhfcGNtY2lhLmMKKysrIGIvZHJpdmVycy90cW04eHhfcGNtY2lhLmMKQEAgLTEwLDExICsxMCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTI0MSw3ICsyNDEsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl1X2xvbmcgcmVnOwpAQCAtMjYzLDcgKzI2Myw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHNlYy5jIGIvZHJpdmVycy90c2VjLmMKaW5kZXggMTI5ODQ3OC4uZmQyMWVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90c2VjLmMKKysrIGIvZHJpdmVycy90c2VjLmMKQEAgLTcxLDYgKzcxLDcgQEAKICNlbHNlCiAJe1RTRUMxX1BIWV9BRERSLCBUU0VDX0dJR0FCSVQsIFRTRUMxX1BIWUlEWH0sCiAjZW5kaWYKKyNlbHNlCiAJezAsIDAsIDB9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfVFNFQzIpCkBAIC03OSw2ICs4MCw3IEBACiAjZWxzZQogCXtUU0VDMl9QSFlfQUREUiwgVFNFQ19HSUdBQklULCBUU0VDMl9QSFlJRFh9LAogI2VuZGlmCisjZWxzZQogCXswLCAwLCAwfSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19NUEM4NVhYX0ZFQwpAQCAtMTI3LDYgKzEyOSw5IEBACiAJCQkgICAgIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CiBzdGF0aWMgaW50IHRzZWNfbWlpcGh5X3JlYWQoY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBhZGRyLAogCQkJICAgIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBzaG9ydCAqdmFsdWUpOworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCitzdGF0aWMgaW50IHRzZWNfbWNhc3RfYWRkciAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdTggbWNhc3RfbWFjLCB1OCBzZXQpOworI2VuZGlmCiAKIC8qIEluaXRpYWxpemUgZGV2aWNlIHN0cnVjdHVyZS4gUmV0dXJucyBzdWNjZXNzIGlmIFBIWQogICogaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkIChpLmUuIGlmIGl0IHJlY29nbml6ZXMgdGhlIFBIWSkKQEAgLTE2NSw2ICsxNzAsOSBAQAogCWRldi0+aGFsdCA9IHRzZWNfaGFsdDsKIAlkZXYtPnNlbmQgPSB0c2VjX3NlbmQ7CiAJZGV2LT5yZWN2ID0gdHNlY19yZWN2OworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJZGV2LT5tY2FzdCA9IHRzZWNfbWNhc3RfYWRkcjsKKyNlbmRpZgogCiAJLyogVGVsbCB1LWJvb3QgdG8gZ2V0IHRoZSBhZGRyIGZyb20gdGhlIGVudiAqLwogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCkBAIC0xNzYsNyArMTg0LDcgQEAKIAlwcml2LT5yZWdzLT5tYWNjZmcxIHw9IE1BQ0NGRzFfU09GVF9SRVNFVDsKIAlwcml2LT5yZWdzLT5tYWNjZmcxICY9IH4oTUFDQ0ZHMV9TT0ZUX1JFU0VUKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSBcCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSBcCiAJJiYgIWRlZmluZWQoQklUQkFOR01JSSkKIAltaWlwaHlfcmVnaXN0ZXIoZGV2LT5uYW1lLCB0c2VjX21paXBoeV9yZWFkLCB0c2VjX21paXBoeV93cml0ZSk7CiAjZW5kaWYKQEAgLTI5Niw5ICszMDQsOSBAQAogCXZvbGF0aWxlIHRzZWNfdCAqcmVncyA9ICh2b2xhdGlsZSB0c2VjX3QgKikoVFNFQ19CQVNFX0FERFIpOwogCiAJLyogQXNzaWduIGEgUGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgVEJJICovCi0JcmVncy0+dGJpcGEgPSBUQklQQV9WQUxVRTsKKwlyZWdzLT50YmlwYSA9IENGR19UQklQQV9WQUxVRTsKIAlyZWdzID0gKHZvbGF0aWxlIHRzZWNfdCAqKShUU0VDX0JBU0VfQUREUiArIFRTRUNfU0laRSk7Ci0JcmVncy0+dGJpcGEgPSBUQklQQV9WQUxVRTsKKwlyZWdzLT50YmlwYSA9IENGR19UQklQQV9WQUxVRTsKIAlhc20oInN5bmMiKTsKIAogCS8qIFJlc2V0IE1JSSAoZHVlIHRvIG5ldyBhZGRyZXNzZXMpICovCkBAIC04OTgsNiArOTA2LDM5IEBACiAJCXBoeV9ydW5fY29tbWFuZHMocHJpdiwgcHJpdi0+cGh5aW5mby0+c2h1dGRvd24pOwogfQogCitzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fTTg4RTExNDlTID0geworCTB4MTQxMGNhLAorCSJNYXJ2ZWxsIDg4RTExNDlTIiwKKwk0LAorCShzdHJ1Y3QgcGh5X2NtZFtdKXsgICAgIC8qIGNvbmZpZyAqLworCQkvKiBSZXNldCBhbmQgY29uZmlndXJlIHRoZSBQSFkgKi8KKwkJe01JSU1fQ09OVFJPTCwgTUlJTV9DT05UUk9MX1JFU0VULCBOVUxMfSwKKwkJezB4MWQsIDB4MWYsIE5VTEx9LAorCQl7MHgxZSwgMHgyMDBjLCBOVUxMfSwKKwkJezB4MWQsIDB4NSwgTlVMTH0sCisJCXsweDFlLCAweDAsIE5VTEx9LAorCQl7MHgxZSwgMHgxMDAsIE5VTEx9LAorCQl7TUlJTV9HQklUX0NPTlRST0wsIE1JSU1fR0JJVF9DT05UUk9MX0lOSVQsIE5VTEx9LAorCQl7TUlJTV9BTkFSLCBNSUlNX0FOQVJfSU5JVCwgTlVMTH0sCisJCXtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9SRVNFVCwgTlVMTH0sCisJCXtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9JTklULCAmbWlpX2NyX2luaXR9LAorCQl7bWlpbV9lbmQsfQorCX0sCisJKHN0cnVjdCBwaHlfY21kW10peyAgICAgLyogc3RhcnR1cCAqLworCQkvKiBTdGF0dXMgaXMgcmVhZCBvbmNlIHRvIGNsZWFyIG9sZCBsaW5rIHN0YXRlICovCisJCXtNSUlNX1NUQVRVUywgbWlpbV9yZWFkLCBOVUxMfSwKKwkJLyogQXV0by1uZWdvdGlhdGUgKi8KKwkJe01JSU1fU1RBVFVTLCBtaWltX3JlYWQsICZtaWlfcGFyc2Vfc3J9LAorCQkvKiBSZWFkIHRoZSBzdGF0dXMgKi8KKwkJe01JSU1fODhFMTAxMV9QSFlfU1RBVFVTLCBtaWltX3JlYWQsCisJCSAmbWlpX3BhcnNlXzg4RTEwMTFfcHNyfSwKKwkJe21paW1fZW5kLH0KKwl9LAorCShzdHJ1Y3QgcGh5X2NtZFtdKXsgICAgIC8qIHNodXRkb3duICovCisJCXttaWltX2VuZCx9CisJfSwKK307CisKIC8qIFRoZSA1NDExIGlkIGlzIDB4MjA2MDcwLCB0aGUgNTQyMSBpcyAweDIwNjBlMCAqLwogc3RydWN0IHBoeV9pbmZvIHBoeV9pbmZvX0JDTTU0NjFTID0gewogCTB4MDIwNjBjMSwJLyogNTQ2MSBJRCAqLwpAQCAtOTkzLDExICsxMDM0LDYgQEAKIAkoc3RydWN0IHBoeV9jbWRbXSl7CS8qIGNvbmZpZyAqLwogCQkJICAgLyogUmVzZXQgYW5kIGNvbmZpZ3VyZSB0aGUgUEhZICovCiAJCQkgICB7TUlJTV9DT05UUk9MLCBNSUlNX0NPTlRST0xfUkVTRVQsIE5VTEx9LAotCQkJICAgezB4MWQsIDB4MWYsIE5VTEx9LAotCQkJICAgezB4MWUsIDB4MjAwYywgTlVMTH0sCi0JCQkgICB7MHgxZCwgMHg1LCBOVUxMfSwKLQkJCSAgIHsweDFlLCAweDAsIE5VTEx9LAotCQkJICAgezB4MWUsIDB4MTAwLCBOVUxMfSwKIAkJCSAgIHsweDE0LCAweDBjZDIsIE5VTEx9LCAvKiBEZWxheSBSR01JSSBUWCBhbmQgUlggKi8KIAkJCSAgIHtNSUlNX0dCSVRfQ09OVFJPTCwgTUlJTV9HQklUX0NPTlRST0xfSU5JVCwgTlVMTH0sCiAJCQkgICB7TUlJTV9BTkFSLCBNSUlNX0FOQVJfSU5JVCwgTlVMTH0sCkBAIC0xMDM3LDE0ICsxMDczLDE2IEBACiAJIk1hcnZlbGwgODhFMTE0NSIsCiAJNCwKIAkoc3RydWN0IHBoeV9jbWRbXSl7CS8qIGNvbmZpZyAqLworCQkJICAgLyogUmVzZXQgdGhlIFBIWSAqLworCQkJICAge01JSU1fQ09OVFJPTCwgTUlJTV9DT05UUk9MX1JFU0VULCBOVUxMfSwKKwogCQkJICAgLyogRXJyYXRhIEUwLCBFMSAqLwogCQkJICAgezI5LCAweDAwMWIsIE5VTEx9LAogCQkJICAgezMwLCAweDQxOGYsIE5VTEx9LAogCQkJICAgezI5LCAweDAwMTYsIE5VTEx9LAogCQkJICAgezMwLCAweGEyZGEsIE5VTEx9LAogCi0JCQkgICAvKiBSZXNldCBhbmQgY29uZmlndXJlIHRoZSBQSFkgKi8KLQkJCSAgIHtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9SRVNFVCwgTlVMTH0sCisJCQkgICAvKiBDb25maWd1cmUgdGhlIFBIWSAqLwogCQkJICAge01JSU1fR0JJVF9DT05UUk9MLCBNSUlNX0dCSVRfQ09OVFJPTF9JTklULCBOVUxMfSwKIAkJCSAgIHtNSUlNX0FOQVIsIE1JSU1fQU5BUl9JTklULCBOVUxMfSwKIAkJCSAgIHtNSUlNXzg4RTEwMTFfUEhZX1NDUiwgTUlJTV84OEUxMDExX1BIWV9NRElfWF9BVVRPLApAQCAtMTMyMSw2ICsxMzU5LDcgQEAKIAkmcGh5X2luZm9fTTg4RTEwMTFTLAogCSZwaHlfaW5mb19NODhFMTExMVMsCiAJJnBoeV9pbmZvX004OEUxMTQ1LAorCSZwaHlfaW5mb19NODhFMTE0OVMsCiAJJnBoeV9pbmZvX2RtOTE2MSwKIAkmcGh5X2luZm9fbHh0OTcxLAogCSZwaHlfaW5mb19WU0M4MjQ0LApAQCAtMTM1MSw4ICsxMzkwLDEwIEBACiAJLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUga25vd24gUEhZIHR5cGVzLCBhbmQgZmluZCBvbmUgdGhhdCAqLwogCS8qIG1hdGNoZXMgdGhlIElEIHdlIHJlYWQgZnJvbSB0aGUgUEhZLiAqLwogCWZvciAoaSA9IDA7IHBoeV9pbmZvW2ldOyBpKyspIHsKLQkJaWYgKHBoeV9pbmZvW2ldLT5pZCA9PSAocGh5X0lEID4+IHBoeV9pbmZvW2ldLT5zaGlmdCkpCisJCWlmIChwaHlfaW5mb1tpXS0+aWQgPT0gKHBoeV9JRCA+PiBwaHlfaW5mb1tpXS0+c2hpZnQpKSB7CiAJCQl0aGVJbmZvID0gcGh5X2luZm9baV07CisJCQlicmVhazsKKwkJfQogCX0KIAogCWlmICh0aGVJbmZvID09IE5VTEwpIHsKQEAgLTE0NDMsNyArMTQ4NCw3IEBACiAJcmVsb2NhdGVkID0gMTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSBcCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSBcCiAJJiYgIWRlZmluZWQoQklUQkFOR01JSSkKIAogc3RydWN0IHRzZWNfcHJpdmF0ZSAqZ2V0X3ByaXZfZm9yX3BoeSh1bnNpZ25lZCBjaGFyIHBoeWFkZHIpCkBAIC0xNTAyLDcgKzE1NDMsNDggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQotCQkmJiAhZGVmaW5lZChCSVRCQU5HTUlJKSAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCisvKiBDUkVESVRTOiBsaW51eCBnaWFuZmFyIGRyaXZlciwgc2xpZ2h0bHkgYWRqdXN0ZWQuLi4gdGhhbnguICovCisKKy8qIFNldCB0aGUgYXBwcm9wcmlhdGUgaGFzaCBiaXQgZm9yIHRoZSBnaXZlbiBhZGRyICovCisKKy8qIFRoZSBhbGdvcml0aG0gd29ya3MgbGlrZSBzbzoKKyAqIDEpIFRha2UgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MgKGllIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyksIGFuZAorICogZG8gYSBDUkMgb24gaXQgKGxpdHRsZSBlbmRpYW4pLCBhbmQgcmV2ZXJzZSB0aGUgYml0cyBvZiB0aGUKKyAqIHJlc3VsdC4KKyAqIDIpIFVzZSB0aGUgOCBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXMgYSBoYXNoIGludG8gYSAyNTYtZW50cnkKKyAqIHRhYmxlLiAgVGhlIHRhYmxlIGlzIGNvbnRyb2xsZWQgdGhyb3VnaCA4IDMyLWJpdCByZWdpc3RlcnM6CisgKiBnYWRkcjAtNy4gIGdhZGRyMCdzIE1TQiBpcyBlbnRyeSAwLCBhbmQgZ2FkZHI3J3MgTFNCIGlzCisgKiBnYWRkcjcuICBUaGlzIG1lYW5zIHRoYXQgdGhlIDMgbW9zdCBzaWduaWZpY2FudCBiaXRzIGluIHRoZQorICogaGFzaCBpbmRleCB3aGljaCBnYWRkciByZWdpc3RlciB0byB1c2UsIGFuZCB0aGUgNSBvdGhlciBiaXRzCisgKiBpbmRpY2F0ZSB3aGljaCBiaXQgKGFzc3VtaW5nIGFuIElCTSBudW1iZXJpbmcgc2NoZW1lLCB3aGljaAorICogZm9yIFBvd2VyUEMgKHRtKSBpcyB1c3VhbGx5IHRoZSBjYXNlKSBpbiB0aGUgdHJlZ2lzdGVyIGhvbGRzCisgKiB0aGUgZW50cnkuICovCitzdGF0aWMgaW50Cit0c2VjX21jYXN0X2FkZHIgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHU4IG1jYXN0X21hYywgdTggc2V0KQoreworIHN0cnVjdCB0c2VjX3ByaXZhdGUgKnByaXYgPSBwcml2bGlzdFsxXTsKKyB2b2xhdGlsZSB0c2VjX3QgKnJlZ3MgPSBwcml2LT5yZWdzOworIHZvbGF0aWxlIHUzMiAgKnJlZ19hcnJheSwgdmFsdWU7CisgdTggcmVzdWx0LCB3aGljaGJpdCwgd2hpY2hyZWc7CisKKwlyZXN1bHQgPSAodTgpKChldGhlcl9jcmMoTUFDX0FERFJfTEVOLG1jYXN0X21hYykgPj4gMjQpICYgMHhmZik7CisJd2hpY2hiaXQgPSByZXN1bHQgJiAweDFmOwkvKiB0aGUgNSBMU0IgPSB3aGljaCBiaXQgdG8gc2V0ICovCisJd2hpY2hyZWcgPSByZXN1bHQgPj4gNTsJCS8qIHRoZSAzIE1TQiA9IHdoaWNoIHJlZyB0byBzZXQgaXQgaW4gKi8KKwl2YWx1ZSA9ICgxIDw8ICgzMS13aGljaGJpdCkpOworCisJcmVnX2FycmF5ID0gJihyZWdzLT5oYXNoLmdhZGRyMCk7CisKKwlpZiAoc2V0KSB7CisJCXJlZ19hcnJheVt3aGljaHJlZ10gfD0gdmFsdWU7CisJfSBlbHNlIHsKKwkJcmVnX2FycmF5W3doaWNocmVnXSAmPSB+dmFsdWU7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIE11bHRpY2FzdCBURlRQID8gKi8KIAogI2VuZGlmIC8qIENPTkZJR19UU0VDX0VORVQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHNlYy5oIGIvZHJpdmVycy90c2VjLmgKaW5kZXggN2JmM2RlZS4uMmYwMDkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90c2VjLmgKKysrIGIvZHJpdmVycy90c2VjLmgKQEAgLTcwLDcgKzcwLDkgQEAKICNkZWZpbmUgbWlpbV9lbmQgLTIKICNkZWZpbmUgbWlpbV9yZWFkIC0xCiAKLSNkZWZpbmUgVEJJUEFfVkFMVUUJCTB4MWYKKyNpZm5kZWYgQ0ZHX1RCSVBBX1ZBTFVFCisgICAgI2RlZmluZSBDRkdfVEJJUEFfVkFMVUUJMHgxZgorI2VuZGlmCiAjZGVmaW5lIE1JSU1DRkdfSU5JVF9WQUxVRQkweDAwMDAwMDAzCiAjZGVmaW5lIE1JSU1DRkdfUkVTRVQJCTB4ODAwMDAwMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90c2kxMDhfZXRoLmMgYi9kcml2ZXJzL3RzaTEwOF9ldGguYwppbmRleCA0NzM0MWJlLi41MjRlOWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RzaTEwOF9ldGguYworKysgYi9kcml2ZXJzL3RzaTEwOF9ldGguYwpAQCAtMjcsNyArMjcsNyBAQAogCiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAogCSYmIGRlZmluZWQoQ09ORklHX1RTSTEwOF9FVEgpCiAKICNpZiAhZGVmaW5lZChDT05GSUdfVFNJMTA4X0VUSF9OVU1fUE9SVFMpIHx8IChDT05GSUdfVFNJMTA4X0VUSF9OVU1fUE9SVFMgPiAyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90c2kxMDhfaTJjLmMgYi9kcml2ZXJzL3RzaTEwOF9pMmMuYwppbmRleCBlYjUyY2I2Li4zYTNiNzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RzaTEwOF9pMmMuYworKysgYi9kcml2ZXJzL3RzaTEwOF9pMmMuYwpAQCAtMjgsNyArMjgsNyBAQAogI2lmZGVmIENPTkZJR19UU0kxMDhfSTJDCiAjaW5jbHVkZSA8dHNpMTA4Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAogI2RlZmluZSBJMkNfREVMQVkJMTAwMDAwCiAjdW5kZWYgIERFQlVHX0kyQwpAQCAtMjc5LDUgKzI3OSw1IEBACiAJcmV0dXJuIGkyY19yZWFkIChjaGlwLCAwLCAxLCAoY2hhciAqKSZ0bXAsIDEpOwogfQogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKSAqLworI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1RTSTEwOF9JMkMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiX29oY2kuYyBiL2RyaXZlcnMvdXNiX29oY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGEzN2IyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Jfb2hjaS5jCkBAIC0wLDAgKzEsMTkxOCBAQAorLyoKKyAqIFVSQiBPSENJIEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikgZm9yIFVTQiBvbiB0aGUgQVQ5MVJNOTIwMCBhbmQgUENJIGJ1cy4KKyAqCisgKiBJbnRlcnJ1cHQgc3VwcG9ydCBpcyBhZGRlZC4gTm93LCBpdCBoYXMgYmVlbiB0ZXN0ZWQKKyAqIG9uIFVMSTE1NzUgY2hpcCBhbmQgd29ya3Mgd2VsbCB3aXRoIFVTQiBrZXlib2FyZC4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIFpoYW5nIFdlaSwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPGdqQGRlbnguZGU+CisgKgorICogTm90ZTogTXVjaCBvZiB0aGlzIGNvZGUgaGFzIGJlZW4gZGVyaXZlZCBmcm9tIExpbnV4IDIuNAorICogKEMpIENvcHlyaWdodCAxOTk5IFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyIERhdmlkIEJyb3duZWxsCisgKgorICogTW9kaWZpZWQgZm9yIHRoZSBNUDJVU0IgYnkgKEMpIENvcHlyaWdodCAyMDA1IEVyaWMgQmVuYXJkCisgKiBlYmVuYXJkQGV1a3JlYS5jb20gLSBiYXNlZCBvbiBzM2MyNHgwJ3MgZHJpdmVyCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKy8qCisgKiBJTVBPUlRBTlQgTk9URVMKKyAqIDEgLSBSZWFkIGRvYy9SRUFETUUuZ2VuZXJpY191c2Jfb2hjaQorICogMiAtIHRoaXMgZHJpdmVyIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBVU0IgTWFzcyBTdG9yYWdlIERldmljZXMKKyAqICAgICAoQkJCKSBhbmQgVVNCIGtleWJvYXJkLiBUaGVyZSBpcyBOTyBzdXBwb3J0IGZvciBJc29jaHJvbm91cyBwaXBlcyEKKyAqIDIgLSB3aGVuIHJ1bm5pbmcgb24gYSBQUUZQMjA4IEFUOTFSTTkyMDAsIGRlZmluZSBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKKyAqICAgICB0byBhY3RpdmF0ZSB3b3JrYXJvdW5kIGZvciBidWcgIzQxIG9yIHRoaXMgZHJpdmVyIHdpbGwgTk9UIHdvcmshCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1VTQl9PSENJX05FVworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJX09IQ0kpCisjIGluY2x1ZGUgPHBjaS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDx1c2IuaD4KKyNpbmNsdWRlICJ1c2Jfb2hjaS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJNOTIwVCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1MzQzI0MDApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TM0MyNDEwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19QQ0lfT0hDSSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01QQzUyMDApCisjIGRlZmluZSBPSENJX1VTRV9OUFMJCS8qIGZvcmNlIE5vUG93ZXJTd2l0Y2hpbmcgbW9kZSAqLworI2VuZGlmCisKKyN1bmRlZiBPSENJX1ZFUkJPU0VfREVCVUcJLyogbm90IGFsd2F5cyBoZWxwZnVsICovCisjdW5kZWYgREVCVUcKKyN1bmRlZiBTSE9XX0lORk8KKyN1bmRlZiBPSENJX0ZJTExfVFJBQ0UKKworLyogRm9yIGluaXRpYWxpemluZyBjb250cm9sbGVyIChtYXNrIGluIGFuIEhDRlMgbW9kZSB0b28pICovCisjZGVmaW5lIE9IQ0lfQ09OVFJPTF9JTklUIFwKKwkoT0hDSV9DVFJMX0NCU1IgJiAweDMpIHwgT0hDSV9DVFJMX0lFIHwgT0hDSV9DVFJMX1BMRQorCisvKgorICogZS5nLiBQQ0kgY29udHJvbGxlcnMgbmVlZCB0aGlzCisgKi8KKyNpZmRlZiBDRkdfT0hDSV9TV0FQX1JFR19BQ0NFU1MKKyMgZGVmaW5lIHJlYWRsKGEpIF9fc3dhcF8zMigqKCh2dV9sb25nICopKGEpKSkKKyMgZGVmaW5lIHdyaXRlbChhLCBiKSAoKigodnVfbG9uZyAqKShiKSkgPSBfX3N3YXBfMzIoKHZ1X2xvbmcpYSkpCisjZWxzZQorIyBkZWZpbmUgcmVhZGwoYSkgKCooKHZ1X2xvbmcgKikoYSkpKQorIyBkZWZpbmUgd3JpdGVsKGEsIGIpICgqKCh2dV9sb25nICopKGIpKSA9ICgodnVfbG9uZylhKSkKKyNlbmRpZiAvKiBDRkdfT0hDSV9TV0FQX1JFR19BQ0NFU1MgKi8KKworI2RlZmluZSBtaW5fdCh0eXBlLHgseSkgKHsgdHlwZSBfX3ggPSAoeCk7IHR5cGUgX195ID0gKHkpOyBfX3ggPCBfX3kgPyBfX3g6IF9feTsgfSkKKworI2lmZGVmIENPTkZJR19QQ0lfT0hDSQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9oY2lfcGNpX2lkc1tdID0geworCXsweDEwYjksIDB4NTIzN30sCS8qIFVMSTE1NzUgUENJIE9IQ0kgbW9kdWxlIGlkcyAqLworCS8qIFBsZWFzZSBhZGQgc3VwcG9ydGVkIFBDSSBPSENJIGNvbnRyb2xsZXIgaWRzIGhlcmUgKi8KKwl7MCwgMH0KK307CisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJERUJVRzogIiBmb3JtYXQgIlxuIiwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmIC8qIERFQlVHICovCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJFUlJPUjogIiBmb3JtYXQgIlxuIiwgIyMgYXJnKQorI3VuZGVmIFNIT1dfSU5GTworI2lmZGVmIFNIT1dfSU5GTworI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGYoIklORk86ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIENGR19PSENJX0JFX0NPTlRST0xMRVIKKyMgZGVmaW5lIG0xNl9zd2FwKHgpIGNwdV90b19iZTE2KHgpCisjIGRlZmluZSBtMzJfc3dhcCh4KSBjcHVfdG9fYmUzMih4KQorI2Vsc2UKKyMgZGVmaW5lIG0xNl9zd2FwKHgpIGNwdV90b19sZTE2KHgpCisjIGRlZmluZSBtMzJfc3dhcCh4KSBjcHVfdG9fbGUzMih4KQorI2VuZGlmIC8qIENGR19PSENJX0JFX0NPTlRST0xMRVIgKi8KKworLyogZ2xvYmFsIG9oY2lfdCAqLworc3RhdGljIG9oY2lfdCBnb2hjaTsKKy8qIHRoaXMgbXVzdCBiZSBhbGlnbmVkIHRvIGEgMjU2IGJ5dGUgYm91bmRhcnkgKi8KK3N0cnVjdCBvaGNpX2hjY2EgZ2hjY2FbMV07CisvKiBhIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgc3RvcmFnZSAqLworc3RydWN0IG9oY2lfaGNjYSAqcGhjY2E7CisvKiB0aGlzIGFsbG9jYXRlcyBFRHMgZm9yIGFsbCBwb3NzaWJsZSBlbmRwb2ludHMgKi8KK3N0cnVjdCBvaGNpX2RldmljZSBvaGNpX2RldjsKKy8qIFJIU0MgZmxhZyAqLworaW50IGdvdF9yaHNjOworLyogZGV2aWNlIHdoaWNoIHdhcyBkaXNjb25uZWN0ZWQgKi8KK3N0cnVjdCB1c2JfZGV2aWNlICpkZXZnb25lOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBTUQtNzU2IChEMiByZXYpIHJlcG9ydHMgY29ycnVwdCByZWdpc3RlciBjb250ZW50cyBpbiBzb21lIGNhc2VzLgorICogVGhlIGVycmF0dW0gKCM0KSBkZXNjcmlwdGlvbiBpcyBpbmNvcnJlY3QuICBBTUQncyB3b3JrYXJvdW5kIHdhaXRzCisgKiB0aWxsIHNvbWUgYml0cyAobW9zdGx5IHJlc2VydmVkKSBhcmUgY2xlYXI7IG9rIGZvciBhbGwgcmV2cy4KKyAqLworI2RlZmluZSBPSENJX1FVSVJLX0FNRDc1NiAweGFiY2QKKyNkZWZpbmUgcmVhZF9yb290aHViKGhjLCByZWdpc3RlciwgbWFzaykgKHsgXAorCXUzMiB0ZW1wID0gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5yZWdpc3Rlcik7IFwKKwlpZiAoaGMtPmZsYWdzICYgT0hDSV9RVUlSS19BTUQ3NTYpIFwKKwkJd2hpbGUgKHRlbXAgJiBtYXNrKSBcCisJCQl0ZW1wID0gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5yZWdpc3Rlcik7IFwKKwl0ZW1wOyB9KQorCitzdGF0aWMgdTMyIHJvb3RodWJfYSAoc3RydWN0IG9oY2kgKmhjKQorCXsgcmV0dXJuIHJlYWRfcm9vdGh1YiAoaGMsIGEsIDB4ZmMwZmUwMDApOyB9CitzdGF0aWMgaW5saW5lIHUzMiByb290aHViX2IgKHN0cnVjdCBvaGNpICpoYykKKwl7IHJldHVybiByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLmIpOyB9CitzdGF0aWMgaW5saW5lIHUzMiByb290aHViX3N0YXR1cyAoc3RydWN0IG9oY2kgKmhjKQorCXsgcmV0dXJuIHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIuc3RhdHVzKTsgfQorc3RhdGljIHUzMiByb290aHViX3BvcnRzdGF0dXMgKHN0cnVjdCBvaGNpICpoYywgaW50IGkpCisJeyByZXR1cm4gcmVhZF9yb290aHViIChoYywgcG9ydHN0YXR1cyBbaV0sIDB4ZmZlMGZjZTApOyB9CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgaGNfaW50ZXJydXB0ICh2b2lkKTsKK3N0YXRpYyB2b2lkCit0ZF9zdWJtaXRfam9iIChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICogYnVmZmVyLAorCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICogc2V0dXAsIHVyYl9wcml2X3QgKiB1cmIsIGludCBpbnRlcnZhbCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIFVSQiBzdXBwb3J0IGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZnJlZSBIQ0QtcHJpdmF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFVSQiAqLworCitzdGF0aWMgdm9pZCB1cmJfZnJlZV9wcml2ICh1cmJfcHJpdl90ICogdXJiKQoreworCWludAkJaTsKKwlpbnQJCWxhc3Q7CisJc3RydWN0IHRkCSogdGQ7CisKKwlsYXN0ID0gdXJiLT5sZW5ndGggLSAxOworCWlmIChsYXN0ID49IDApIHsKKwkJZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCXRkID0gdXJiLT50ZFtpXTsKKwkJCWlmICh0ZCkgeworCQkJCXRkLT51c2JfZGV2ID0gTlVMTDsKKwkJCQl1cmItPnRkW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlmcmVlKHVyYik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBERUJVRworc3RhdGljIGludCBzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKHN0cnVjdCB1c2JfZGV2aWNlICogZGV2KTsKKworLyogZGVidWd8IHByaW50IHRoZSBtYWluIGNvbXBvbmVudHMgb2YgYW4gVVJCCisgKiBzbWFsbDogMCkgaGVhZGVyICsgZGF0YSBwYWNrZXRzIDEpIGp1c3QgaGVhZGVyICovCisKK3N0YXRpYyB2b2lkIHBrdF9wcmludCAodXJiX3ByaXZfdCAqcHVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICogYnVmZmVyLAorCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICogc2V0dXAsIGNoYXIgKiBzdHIsIGludCBzbWFsbCkKK3sKKwlkYmcoIiVzIFVSQjpbJTR4XSBkZXY6JTJkLGVwOiUyZC0lYyx0eXBlOiVzLGxlbjolZC8lZCBzdGF0OiUjbHgiLAorCQkJc3RyLAorCQkJc29oY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyIChkZXYpLAorCQkJdXNiX3BpcGVkZXZpY2UgKHBpcGUpLAorCQkJdXNiX3BpcGVlbmRwb2ludCAocGlwZSksCisJCQl1c2JfcGlwZW91dCAocGlwZSk/ICdPJzogJ0knLAorCQkJdXNiX3BpcGV0eXBlIChwaXBlKSA8IDI/ICh1c2JfcGlwZWludCAocGlwZSk/ICJJTlRSIjogIklTT0MiKToKKwkJCQkodXNiX3BpcGVjb250cm9sIChwaXBlKT8gIkNUUkwiOiAiQlVMSyIpLAorCQkJKHB1cmIgPyBwdXJiLT5hY3R1YWxfbGVuZ3RoIDogMCksCisJCQl0cmFuc2Zlcl9sZW4sIGRldi0+c3RhdHVzKTsKKyNpZmRlZglPSENJX1ZFUkJPU0VfREVCVUcKKwlpZiAoIXNtYWxsKSB7CisJCWludCBpLCBsZW47CisKKwkJaWYgKHVzYl9waXBlY29udHJvbCAocGlwZSkpIHsKKwkJCXByaW50ZiAoX19GSUxFX18gIjogY21kKDgpOiIpOworCQkJZm9yIChpID0gMDsgaSA8IDggOyBpKyspCisJCQkJcHJpbnRmICgiICUwMngiLCAoKF9fdTggKikgc2V0dXApIFtpXSk7CisJCQlwcmludGYgKCJcbiIpOworCQl9CisJCWlmICh0cmFuc2Zlcl9sZW4gPiAwICYmIGJ1ZmZlcikgeworCQkJcHJpbnRmIChfX0ZJTEVfXyAiOiBkYXRhKCVkLyVkKToiLAorCQkJCShwdXJiID8gcHVyYi0+YWN0dWFsX2xlbmd0aCA6IDApLAorCQkJCXRyYW5zZmVyX2xlbik7CisJCQlsZW4gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQkJCXRyYW5zZmVyX2xlbjoKKwkJCQkJKHB1cmIgPyBwdXJiLT5hY3R1YWxfbGVuZ3RoIDogMCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgaSA8IGxlbjsgaSsrKQorCQkJCXByaW50ZiAoIiAlMDJ4IiwgKChfX3U4ICopIGJ1ZmZlcikgW2ldKTsKKwkJCXByaW50ZiAoIiVzXG4iLCBpIDwgbGVuPyAiLi4uIjogIiIpOworCQl9CisJfQorI2VuZGlmCit9CisKKy8qIGp1c3QgZm9yIGRlYnVnZ2luZzsgcHJpbnRzIG5vbi1lbXB0eSBicmFuY2hlcyBvZiB0aGUgaW50IGVkIHRyZWUgaW5jbHVzaXZlIGlzbyBlZHMqLwordm9pZCBlcF9wcmludF9pbnRfZWRzIChvaGNpX3QgKm9oY2ksIGNoYXIgKiBzdHIpIHsKKwlpbnQgaSwgajsKKwkgX191MzIgKiBlZF9wOworCWZvciAoaT0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaiA9IDU7CisJCWVkX3AgPSAmKG9oY2ktPmhjY2EtPmludF90YWJsZSBbaV0pOworCQlpZiAoKmVkX3AgPT0gMCkKKwkJICAgIGNvbnRpbnVlOworCQlwcmludGYgKF9fRklMRV9fICI6ICVzIGJyYW5jaCBpbnQgJTJkKCUyeCk6Iiwgc3RyLCBpLCBpKTsKKwkJd2hpbGUgKCplZF9wICE9IDAgJiYgai0tKSB7CisJCQllZF90ICplZCA9IChlZF90ICopbTMyX3N3YXAoZWRfcCk7CisJCQlwcmludGYgKCIgZWQ6ICU0eDsiLCBlZC0+aHdJTkZPKTsKKwkJCWVkX3AgPSAmZWQtPmh3TmV4dEVEOworCQl9CisJCXByaW50ZiAoIlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfaW50cl9tYXNrIChjaGFyICpsYWJlbCwgX191MzIgbWFzaykKK3sKKwlkYmcgKCIlczogMHglMDh4JXMlcyVzJXMlcyVzJXMlcyVzIiwKKwkJbGFiZWwsCisJCW1hc2ssCisJCShtYXNrICYgT0hDSV9JTlRSX01JRSkgPyAiIE1JRSIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfT0MpID8gIiBPQyIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfUkhTQykgPyAiIFJIU0MiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX0ZOTykgPyAiIEZOTyIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfVUUpID8gIiBVRSIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfUkQpID8gIiBSRCIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfU0YpID8gIiBTRiIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfV0RIKSA/ICIgV0RIIiA6ICIiLAorCQkobWFzayAmIE9IQ0lfSU5UUl9TTykgPyAiIFNPIiA6ICIiCisJCSk7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3ByaW50X2VkcyAoY2hhciAqbGFiZWwsIF9fdTMyIHZhbHVlKQoreworCWVkX3QgKmVkcCA9IChlZF90ICopdmFsdWU7CisKKwlpZiAodmFsdWUpIHsKKwkJZGJnICgiJXMgJTA4eCIsIGxhYmVsLCB2YWx1ZSk7CisJCWRiZyAoIiUwOHgiLCBlZHAtPmh3SU5GTyk7CisJCWRiZyAoIiUwOHgiLCBlZHAtPmh3VGFpbFApOworCQlkYmcgKCIlMDh4IiwgZWRwLT5od0hlYWRQKTsKKwkJZGJnICgiJTA4eCIsIGVkcC0+aHdOZXh0RUQpOworCX0KK30KKworc3RhdGljIGNoYXIgKiBoY2ZzMnN0cmluZyAoaW50IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBPSENJX1VTQl9SRVNFVDoJcmV0dXJuICJyZXNldCI7CisJCWNhc2UgT0hDSV9VU0JfUkVTVU1FOglyZXR1cm4gInJlc3VtZSI7CisJCWNhc2UgT0hDSV9VU0JfT1BFUjoJcmV0dXJuICJvcGVyYXRpb25hbCI7CisJCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoJcmV0dXJuICJzdXNwZW5kIjsKKwl9CisJcmV0dXJuICI/IjsKK30KKworLyogZHVtcCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfc3RhdHVzIChvaGNpX3QgKmNvbnRyb2xsZXIpCit7CisJc3RydWN0IG9oY2lfcmVncwkqcmVncyA9IGNvbnRyb2xsZXItPnJlZ3M7CisJX191MzIJCQl0ZW1wOworCisJdGVtcCA9IHJlYWRsICgmcmVncy0+cmV2aXNpb24pICYgMHhmZjsKKwlpZiAodGVtcCAhPSAweDEwKQorCQlkYmcgKCJzcGVjICVkLiVkIiwgKHRlbXAgPj4gNCksICh0ZW1wICYgMHgwZikpOworCisJdGVtcCA9IHJlYWRsICgmcmVncy0+Y29udHJvbCk7CisJZGJnICgiY29udHJvbDogMHglMDh4JXMlcyVzIEhDRlM9JXMlcyVzJXMlcyBDQlNSPSVkIiwgdGVtcCwKKwkJKHRlbXAgJiBPSENJX0NUUkxfUldFKSA/ICIgUldFIiA6ICIiLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9SV0MpID8gIiBSV0MiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX0lSKSA/ICIgSVIiIDogIiIsCisJCWhjZnMyc3RyaW5nICh0ZW1wICYgT0hDSV9DVFJMX0hDRlMpLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9CTEUpID8gIiBCTEUiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX0NMRSkgPyAiIENMRSIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NUUkxfSUUpID8gIiBJRSIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NUUkxfUExFKSA/ICIgUExFIiA6ICIiLAorCQl0ZW1wICYgT0hDSV9DVFJMX0NCU1IKKwkJKTsKKworCXRlbXAgPSByZWFkbCAoJnJlZ3MtPmNtZHN0YXR1cyk7CisJZGJnICgiY21kc3RhdHVzOiAweCUwOHggU09DPSVkJXMlcyVzJXMiLCB0ZW1wLAorCQkodGVtcCAmIE9IQ0lfU09DKSA+PiAxNiwKKwkJKHRlbXAgJiBPSENJX09DUikgPyAiIE9DUiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0JMRikgPyAiIEJMRiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NMRikgPyAiIENMRiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0hDUikgPyAiIEhDUiIgOiAiIgorCQkpOworCisJb2hjaV9kdW1wX2ludHJfbWFzayAoImludHJzdGF0dXMiLCByZWFkbCAoJnJlZ3MtPmludHJzdGF0dXMpKTsKKwlvaGNpX2R1bXBfaW50cl9tYXNrICgiaW50cmVuYWJsZSIsIHJlYWRsICgmcmVncy0+aW50cmVuYWJsZSkpOworCisJbWF5YmVfcHJpbnRfZWRzICgiZWRfcGVyaW9kY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfcGVyaW9kY3VycmVudCkpOworCisJbWF5YmVfcHJpbnRfZWRzICgiZWRfY29udHJvbGhlYWQiLCByZWFkbCAoJnJlZ3MtPmVkX2NvbnRyb2xoZWFkKSk7CisJbWF5YmVfcHJpbnRfZWRzICgiZWRfY29udHJvbGN1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX2NvbnRyb2xjdXJyZW50KSk7CisKKwltYXliZV9wcmludF9lZHMgKCJlZF9idWxraGVhZCIsIHJlYWRsICgmcmVncy0+ZWRfYnVsa2hlYWQpKTsKKwltYXliZV9wcmludF9lZHMgKCJlZF9idWxrY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfYnVsa2N1cnJlbnQpKTsKKworCW1heWJlX3ByaW50X2VkcyAoImRvbmVoZWFkIiwgcmVhZGwgKCZyZWdzLT5kb25laGVhZCkpOworfQorCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfcm9vdGh1YiAob2hjaV90ICpjb250cm9sbGVyLCBpbnQgdmVyYm9zZSkKK3sKKwlfX3UzMgkJCXRlbXAsIG5kcCwgaTsKKworCXRlbXAgPSByb290aHViX2EgKGNvbnRyb2xsZXIpOworCW5kcCA9ICh0ZW1wICYgUkhfQV9ORFApOworI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRworCW5kcCA9IChuZHAgPT0gMikgPyAxOjA7CisjZW5kaWYKKwlpZiAodmVyYm9zZSkgeworCQlkYmcgKCJyb290aHViLmE6ICUwOHggUE9UUEdUPSVkJXMlcyVzJXMlcyBORFA9JWQiLCB0ZW1wLAorCQkJKCh0ZW1wICYgUkhfQV9QT1RQR1QpID4+IDI0KSAmIDB4ZmYsCisJCQkodGVtcCAmIFJIX0FfTk9DUCkgPyAiIE5PQ1AiIDogIiIsCisJCQkodGVtcCAmIFJIX0FfT0NQTSkgPyAiIE9DUE0iIDogIiIsCisJCQkodGVtcCAmIFJIX0FfRFQpID8gIiBEVCIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfQV9OUFMpID8gIiBOUFMiIDogIiIsCisJCQkodGVtcCAmIFJIX0FfUFNNKSA/ICIgUFNNIiA6ICIiLAorCQkJbmRwCisJCQkpOworCQl0ZW1wID0gcm9vdGh1Yl9iIChjb250cm9sbGVyKTsKKwkJZGJnICgicm9vdGh1Yi5iOiAlMDh4IFBQQ009JTA0eCBEUj0lMDR4IiwKKwkJCXRlbXAsCisJCQkodGVtcCAmIFJIX0JfUFBDTSkgPj4gMTYsCisJCQkodGVtcCAmIFJIX0JfRFIpCisJCQkpOworCQl0ZW1wID0gcm9vdGh1Yl9zdGF0dXMgKGNvbnRyb2xsZXIpOworCQlkYmcgKCJyb290aHViLnN0YXR1czogJTA4eCVzJXMlcyVzJXMlcyIsCisJCQl0ZW1wLAorCQkJKHRlbXAgJiBSSF9IU19DUldFKSA/ICIgQ1JXRSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfT0NJQykgPyAiIE9DSUMiIDogIiIsCisJCQkodGVtcCAmIFJIX0hTX0xQU0MpID8gIiBMUFNDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9IU19EUldFKSA/ICIgRFJXRSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfT0NJKSA/ICIgT0NJIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9IU19MUFMpID8gIiBMUFMiIDogIiIKKwkJCSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5kcDsgaSsrKSB7CisJCXRlbXAgPSByb290aHViX3BvcnRzdGF0dXMgKGNvbnRyb2xsZXIsIGkpOworCQlkYmcgKCJyb290aHViLnBvcnRzdGF0dXMgWyVkXSA9IDB4JTA4eCVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyIsCisJCQlpLAorCQkJdGVtcCwKKwkJCSh0ZW1wICYgUkhfUFNfUFJTQykgPyAiIFBSU0MiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX09DSUMpID8gIiBPQ0lDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QU1NDKSA/ICIgUFNTQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUEVTQykgPyAiIFBFU0MiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX0NTQykgPyAiIENTQyIgOiAiIiwKKworCQkJKHRlbXAgJiBSSF9QU19MU0RBKSA/ICIgTFNEQSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUFBTKSA/ICIgUFBTIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QUlMpID8gIiBQUlMiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BPQ0kpID8gIiBQT0NJIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QU1MpID8gIiBQU1MiIDogIiIsCisKKwkJCSh0ZW1wICYgUkhfUFNfUEVTKSA/ICIgUEVTIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19DQ1MpID8gIiBDQ1MiIDogIiIKKwkJCSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvaGNpX2R1bXAgKG9oY2lfdCAqY29udHJvbGxlciwgaW50IHZlcmJvc2UpCit7CisJZGJnICgiT0hDSSBjb250cm9sbGVyIHVzYi0lcyBzdGF0ZSIsIGNvbnRyb2xsZXItPnNsb3RfbmFtZSk7CisKKwkvKiBkdW1wcyBzb21lIG9mIHRoZSBzdGF0ZSB3ZSBrbm93IGFib3V0ICovCisJb2hjaV9kdW1wX3N0YXR1cyAoY29udHJvbGxlcik7CisJaWYgKHZlcmJvc2UpCisJCWVwX3ByaW50X2ludF9lZHMgKGNvbnRyb2xsZXIsICJoY2NhIik7CisJZGJnICgiaGNjYSBmcmFtZSAjJTA0eCIsIGNvbnRyb2xsZXItPmhjY2EtPmZyYW1lX25vKTsKKwlvaGNpX2R1bXBfcm9vdGh1YiAoY29udHJvbGxlciwgMSk7CisKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBJbnRlcmZhY2UgZnVuY3Rpb25zIChVUkIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBnZXQgYSB0cmFuc2ZlciByZXF1ZXN0ICovCisKK2ludCBzb2hjaV9zdWJtaXRfam9iKHVyYl9wcml2X3QgKnVyYiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwKQoreworCW9oY2lfdCAqb2hjaTsKKwllZF90ICogZWQ7CisJdXJiX3ByaXZfdCAqcHVyYl9wcml2ID0gdXJiOworCWludCBpLCBzaXplID0gMDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gdXJiLT5kZXY7CisJdW5zaWduZWQgbG9uZyBwaXBlID0gdXJiLT5waXBlOworCXZvaWQgKmJ1ZmZlciA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWludCB0cmFuc2Zlcl9sZW4gPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CisJaW50IGludGVydmFsID0gdXJiLT5pbnRlcnZhbDsKKworCW9oY2kgPSAmZ29oY2k7CisKKwkvKiB3aGVuIGNvbnRyb2xsZXIncyBodW5nLCBwZXJtaXQgb25seSByb290aHViIGNsZWFudXAgYXR0ZW1wdHMKKwkgKiBzdWNoIGFzIHBvd2VyaW5nIGRvd24gcG9ydHMgKi8KKwlpZiAob2hjaS0+ZGlzYWJsZWQpIHsKKwkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFUElQRSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogd2UncmUgYWJvdXQgdG8gYmVnaW4gYSBuZXcgdHJhbnNhY3Rpb24gaGVyZSBzbyBtYXJrIHRoZSBVUkIgdW5maW5pc2hlZCAqLworCXVyYi0+ZmluaXNoZWQgPSAwOworCisJLyogZXZlcnkgZW5kcG9pbnQgaGFzIGEgZWQsIGxvY2F0ZSBhbmQgZmlsbCBpdCAqLworCWlmICghKGVkID0gZXBfYWRkX2VkIChkZXYsIHBpcGUsIGludGVydmFsLCAxKSkpIHsKKwkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFTk9NRU0iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGZvciB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBVUkIgd2UgbmVlZCB0aGUgbnVtYmVyIG9mIFREcyAoc2l6ZSkgKi8KKwlzd2l0Y2ggKHVzYl9waXBldHlwZSAocGlwZSkpIHsKKwkJY2FzZSBQSVBFX0JVTEs6IC8qIG9uZSBURCBmb3IgZXZlcnkgNDA5NiBCeXRlICovCisJCQlzaXplID0gKHRyYW5zZmVyX2xlbiAtIDEpIC8gNDA5NiArIDE7CisJCQlicmVhazsKKwkJY2FzZSBQSVBFX0NPTlRST0w6IC8qIDEgVEQgZm9yIHNldHVwLCAxIGZvciBBQ0sgYW5kIDEgZm9yIGV2ZXJ5IDQwOTYgQiAqLworCQkJc2l6ZSA9ICh0cmFuc2Zlcl9sZW4gPT0gMCk/IDI6CisJCQkJCQkodHJhbnNmZXJfbGVuIC0gMSkgLyA0MDk2ICsgMzsKKwkJCWJyZWFrOworCQljYXNlIFBJUEVfSU5URVJSVVBUOiAvKiAxIFREICovCisJCQlzaXplID0gMTsKKwkJCWJyZWFrOworCX0KKworCWVkLT5wdXJiID0gdXJiOworCisJaWYgKHNpemUgPj0gKE5fVVJCX1REIC0gMSkpIHsKKwkJZXJyKCJuZWVkICVkIFREcywgb25seSBoYXZlICVkIiwgc2l6ZSwgTl9VUkJfVEQpOworCQlyZXR1cm4gLTE7CisJfQorCXB1cmJfcHJpdi0+cGlwZSA9IHBpcGU7CisKKwkvKiBmaWxsIHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIFVSQiAqLworCXB1cmJfcHJpdi0+bGVuZ3RoID0gc2l6ZTsKKwlwdXJiX3ByaXYtPmVkID0gZWQ7CisJcHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCS8qIGFsbG9jYXRlIHRoZSBURHMgKi8KKwkvKiBub3RlIHRoYXQgdGRbMF0gd2FzIGFsbG9jYXRlZCBpbiBlcF9hZGRfZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXB1cmJfcHJpdi0+dGRbaV0gPSB0ZF9hbGxvYyAoZGV2KTsKKwkJaWYgKCFwdXJiX3ByaXYtPnRkW2ldKSB7CisJCQlwdXJiX3ByaXYtPmxlbmd0aCA9IGk7CisJCQl1cmJfZnJlZV9wcml2IChwdXJiX3ByaXYpOworCQkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFTk9NRU0iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChlZC0+c3RhdGUgPT0gRURfTkVXIHx8IChlZC0+c3RhdGUgJiBFRF9ERUwpKSB7CisJCXVyYl9mcmVlX3ByaXYgKHB1cmJfcHJpdik7CisJCWVycigic29oY2lfc3VibWl0X2pvYjogRUlOVkFMIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBsaW5rIHRoZSBlZCBpbnRvIGEgY2hhaW4gaWYgaXMgbm90IGFscmVhZHkgKi8KKwlpZiAoZWQtPnN0YXRlICE9IEVEX09QRVIpCisJCWVwX2xpbmsgKG9oY2ksIGVkKTsKKworCS8qIGZpbGwgdGhlIFREcyBhbmQgbGluayBpdCB0byB0aGUgZWQgKi8KKwl0ZF9zdWJtaXRfam9iKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCBwdXJiX3ByaXYsIGludGVydmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzb2hjaV9yZXR1cm5fam9iKHN0cnVjdCBvaGNpICpoYywgdXJiX3ByaXZfdCAqdXJiKQoreworCXN0cnVjdCBvaGNpX3JlZ3MgKnJlZ3MgPSBoYy0+cmVnczsKKworCXN3aXRjaCAodXNiX3BpcGV0eXBlICh1cmItPnBpcGUpKSB7CisJY2FzZSBQSVBFX0lOVEVSUlVQVDoKKwkJLyogaW1wbGljaXRseSByZXF1ZXVlZCAqLworCQlpZiAodXJiLT5kZXYtPmlycV9oYW5kbGUgJiYKKwkJCQkodXJiLT5kZXYtPmlycV9hY3RfbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgeworCQkJd3JpdGVsIChPSENJX0lOVFJfV0RILCAmcmVncy0+aW50cmVuYWJsZSk7CisJCQlyZWFkbCAoJnJlZ3MtPmludHJlbmFibGUpOyAvKiBQQ0kgcG9zdGluZyBmbHVzaCAqLworCQkJdXJiLT5kZXYtPmlycV9oYW5kbGUodXJiLT5kZXYpOworCQkJd3JpdGVsIChPSENJX0lOVFJfV0RILCAmcmVncy0+aW50cmRpc2FibGUpOworCQkJcmVhZGwgKCZyZWdzLT5pbnRyZGlzYWJsZSk7IC8qIFBDSSBwb3N0aW5nIGZsdXNoICovCisJCX0KKwkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJdGRfc3VibWl0X2pvYiAoCisJCQkJdXJiLT5kZXYsCisJCQkJdXJiLT5waXBlLAorCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQlOVUxMLAorCQkJCXVyYiwKKwkJCQl1cmItPmludGVydmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJY2FzZSBQSVBFX0JVTEs6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCisvKiB0ZWxsIHVzIHRoZSBjdXJyZW50IFVTQiBmcmFtZSBudW1iZXIgKi8KKworc3RhdGljIGludCBzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQoreworCW9oY2lfdCAqb2hjaSA9ICZnb2hjaTsKKworCXJldHVybiBtMTZfc3dhcCAob2hjaS0+aGNjYS0+ZnJhbWVfbm8pOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEVEIGhhbmRsaW5nIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc2VhcmNoIGZvciB0aGUgcmlnaHQgYnJhbmNoIHRvIGluc2VydCBhbiBpbnRlcnJ1cHQgZWQgaW50byB0aGUgaW50IHRyZWUKKyAqIGRvIHNvbWUgbG9hZCBiYWxsYW5jaW5nOworICogcmV0dXJucyB0aGUgYnJhbmNoIGFuZAorICogc2V0cyB0aGUgaW50ZXJ2YWwgdG8gaW50ZXJ2YWwgPSAyXmludGVnZXIgKGxkIChpbnRlcnZhbCkpICovCisKK3N0YXRpYyBpbnQgZXBfaW50X2JhbGxhbmNlIChvaGNpX3QgKiBvaGNpLCBpbnQgaW50ZXJ2YWwsIGludCBsb2FkKQoreworCWludCBpLCBicmFuY2ggPSAwOworCisJLyogc2VhcmNoIGZvciB0aGUgbGVhc3QgbG9hZGVkIGludGVycnVwdCBlbmRwb2ludAorCSAqIGJyYW5jaCBvZiBhbGwgMzIgYnJhbmNoZXMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJaWYgKG9oY2ktPm9oY2lfaW50X2xvYWQgW2JyYW5jaF0gPiBvaGNpLT5vaGNpX2ludF9sb2FkIFtpXSkKKwkJCWJyYW5jaCA9IGk7CisKKwlicmFuY2ggPSBicmFuY2ggJSBpbnRlcnZhbDsKKwlmb3IgKGkgPSBicmFuY2g7IGkgPCAzMjsgaSArPSBpbnRlcnZhbCkKKwkJb2hjaS0+b2hjaV9pbnRfbG9hZCBbaV0gKz0gbG9hZDsKKworCXJldHVybiBicmFuY2g7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICAyXmludCggbGQgKGludGVyKSkgKi8KKworc3RhdGljIGludCBlcF8yX25faW50ZXJ2YWwgKGludCBpbnRlcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyAoKGludGVyID4+IGkpID4gMSApICYmIChpIDwgNSk7IGkrKyk7CisJcmV0dXJuIDEgPDwgaTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogdGhlIGludCB0cmVlIGlzIGEgYmluYXJ5IHRyZWUKKyAqIGluIG9yZGVyIHRvIHByb2Nlc3MgaXQgc2VxdWVudGlhbGx5IHRoZSBpbmRleGVzIG9mIHRoZSBicmFuY2hlcyBoYXZlIHRvIGJlIG1hcHBlZAorICogdGhlIG1hcHBpbmcgcmV2ZXJzZXMgdGhlIGJpdHMgb2YgYSB3b3JkIG9mIG51bV9iaXRzIGxlbmd0aCAqLworCitzdGF0aWMgaW50IGVwX3JldiAoaW50IG51bV9iaXRzLCBpbnQgd29yZCkKK3sKKwlpbnQgaSwgd291dCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2JpdHM7IGkrKykKKwkJd291dCB8PSAoKCh3b3JkID4+IGkpICYgMSkgPDwgKG51bV9iaXRzIC0gaSAtIDEpKTsKKwlyZXR1cm4gd291dDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogRUQgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBsaW5rIGFuIGVkIGludG8gb25lIG9mIHRoZSBIQyBjaGFpbnMgKi8KKworc3RhdGljIGludCBlcF9saW5rIChvaGNpX3QgKm9oY2ksIGVkX3QgKmVkaSkKK3sKKwl2b2xhdGlsZSBlZF90ICplZCA9IGVkaTsKKwlpbnQgaW50X2JyYW5jaDsKKwlpbnQgaTsKKwlpbnQgaW50ZXI7CisJaW50IGludGVydmFsOworCWludCBsb2FkOworCV9fdTMyICogZWRfcDsKKworCWVkLT5zdGF0ZSA9IEVEX09QRVI7CisJZWQtPmludF9pbnRlcnZhbCA9IDA7CisKKwlzd2l0Y2ggKGVkLT50eXBlKSB7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJCWVkLT5od05leHRFRCA9IDA7CisJCWlmIChvaGNpLT5lZF9jb250cm9sdGFpbCA9PSBOVUxMKSB7CisJCQl3cml0ZWwgKGVkLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOworCQl9IGVsc2UgeworCQkJb2hjaS0+ZWRfY29udHJvbHRhaWwtPmh3TmV4dEVEID0gbTMyX3N3YXAgKCh1bnNpZ25lZCBsb25nKWVkKTsKKwkJfQorCQllZC0+ZWRfcHJldiA9IG9oY2ktPmVkX2NvbnRyb2x0YWlsOworCQlpZiAoIW9oY2ktPmVkX2NvbnRyb2x0YWlsICYmICFvaGNpLT5lZF9ybV9saXN0WzBdICYmCisJCQkhb2hjaS0+ZWRfcm1fbGlzdFsxXSAmJiAhb2hjaS0+c2xlZXBpbmcpIHsKKwkJCW9oY2ktPmhjX2NvbnRyb2wgfD0gT0hDSV9DVFJMX0NMRTsKKwkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQl9CisJCW9oY2ktPmVkX2NvbnRyb2x0YWlsID0gZWRpOworCQlicmVhazsKKworCWNhc2UgUElQRV9CVUxLOgorCQllZC0+aHdOZXh0RUQgPSAwOworCQlpZiAob2hjaS0+ZWRfYnVsa3RhaWwgPT0gTlVMTCkgeworCQkJd3JpdGVsIChlZCwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCW9oY2ktPmVkX2J1bGt0YWlsLT5od05leHRFRCA9IG0zMl9zd2FwICgodW5zaWduZWQgbG9uZyllZCk7CisJCX0KKwkJZWQtPmVkX3ByZXYgPSBvaGNpLT5lZF9idWxrdGFpbDsKKwkJaWYgKCFvaGNpLT5lZF9idWxrdGFpbCAmJiAhb2hjaS0+ZWRfcm1fbGlzdFswXSAmJgorCQkJIW9oY2ktPmVkX3JtX2xpc3RbMV0gJiYgIW9oY2ktPnNsZWVwaW5nKSB7CisJCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9CTEU7CisJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJfQorCQlvaGNpLT5lZF9idWxrdGFpbCA9IGVkaTsKKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQlsb2FkID0gZWQtPmludF9sb2FkOworCQlpbnRlcnZhbCA9IGVwXzJfbl9pbnRlcnZhbCAoZWQtPmludF9wZXJpb2QpOworCQllZC0+aW50X2ludGVydmFsID0gaW50ZXJ2YWw7CisJCWludF9icmFuY2ggPSBlcF9pbnRfYmFsbGFuY2UgKG9oY2ksIGludGVydmFsLCBsb2FkKTsKKwkJZWQtPmludF9icmFuY2ggPSBpbnRfYnJhbmNoOworCisJCWZvciAoaSA9IDA7IGkgPCBlcF9yZXYgKDYsIGludGVydmFsKTsgaSArPSBpbnRlcikgeworCQkJaW50ZXIgPSAxOworCQkJZm9yIChlZF9wID0gJihvaGNpLT5oY2NhLT5pbnRfdGFibGVbZXBfcmV2ICg1LCBpKSArIGludF9icmFuY2hdKTsKKwkJCQkoKmVkX3AgIT0gMCkgJiYgKCgoZWRfdCAqKWVkX3ApLT5pbnRfaW50ZXJ2YWwgPj0gaW50ZXJ2YWwpOworCQkJCWVkX3AgPSAmKCgoZWRfdCAqKWVkX3ApLT5od05leHRFRCkpCisJCQkJCWludGVyID0gZXBfcmV2ICg2LCAoKGVkX3QgKillZF9wKS0+aW50X2ludGVydmFsKTsKKwkJCWVkLT5od05leHRFRCA9ICplZF9wOworCQkJKmVkX3AgPSBtMzJfc3dhcChlZCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzY2FuIHRoZSBwZXJpb2RpYyB0YWJsZSB0byBmaW5kIGFuZCB1bmxpbmsgdGhpcyBFRCAqLworc3RhdGljIHZvaWQgcGVyaW9kaWNfdW5saW5rICggc3RydWN0IG9oY2kgKm9oY2ksIHZvbGF0aWxlIHN0cnVjdCBlZCAqZWQsCisJCXVuc2lnbmVkIGluZGV4LCB1bnNpZ25lZCBwZXJpb2QpCit7CisJZm9yICg7IGluZGV4IDwgTlVNX0lOVFM7IGluZGV4ICs9IHBlcmlvZCkgeworCQlfX3UzMgkqZWRfcCA9ICZvaGNpLT5oY2NhLT5pbnRfdGFibGUgW2luZGV4XTsKKworCQkvKiBFRCBtaWdodCBoYXZlIGJlZW4gdW5saW5rZWQgdGhyb3VnaCBhbm90aGVyIHBhdGggKi8KKwkJd2hpbGUgKCplZF9wICE9IDApIHsKKwkJCWlmICgoKHN0cnVjdCBlZCAqKW0zMl9zd2FwIChlZF9wKSkgPT0gZWQpIHsKKwkJCQkqZWRfcCA9IGVkLT5od05leHRFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVkX3AgPSAmICgoKHN0cnVjdCBlZCAqKW0zMl9zd2FwIChlZF9wKSktPmh3TmV4dEVEKTsKKwkJfQorCX0KK30KKworLyogdW5saW5rIGFuIGVkIGZyb20gb25lIG9mIHRoZSBIQyBjaGFpbnMuCisgKiBqdXN0IHRoZSBsaW5rIHRvIHRoZSBlZCBpcyB1bmxpbmtlZC4KKyAqIHRoZSBsaW5rIGZyb20gdGhlIGVkIHN0aWxsIHBvaW50cyB0byBhbm90aGVyIG9wZXJhdGlvbmFsIGVkIG9yIDAKKyAqIHNvIHRoZSBIQyBjYW4gZXZlbnR1YWxseSBmaW5pc2ggdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHVubGlua2VkIGVkICovCisKK3N0YXRpYyBpbnQgZXBfdW5saW5rIChvaGNpX3QgKm9oY2ksIGVkX3QgKmVkaSkKK3sKKwl2b2xhdGlsZSBlZF90ICplZCA9IGVkaTsKKwlpbnQgaTsKKworCWVkLT5od0lORk8gfD0gbTMyX3N3YXAgKE9IQ0lfRURfU0tJUCk7CisKKwlzd2l0Y2ggKGVkLT50eXBlKSB7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJCWlmIChlZC0+ZWRfcHJldiA9PSBOVUxMKSB7CisJCQlpZiAoIWVkLT5od05leHRFRCkgeworCQkJCW9oY2ktPmhjX2NvbnRyb2wgJj0gfk9IQ0lfQ1RSTF9DTEU7CisJCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJCQl9CisJCQl3cml0ZWwgKG0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSwgJm9oY2ktPnJlZ3MtPmVkX2NvbnRyb2xoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCWVkLT5lZF9wcmV2LT5od05leHRFRCA9IGVkLT5od05leHRFRDsKKwkJfQorCQlpZiAob2hjaS0+ZWRfY29udHJvbHRhaWwgPT0gZWQpIHsKKwkJCW9oY2ktPmVkX2NvbnRyb2x0YWlsID0gZWQtPmVkX3ByZXY7CisJCX0gZWxzZSB7CisJCQkoKGVkX3QgKiltMzJfc3dhcCAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSkpLT5lZF9wcmV2ID0gZWQtPmVkX3ByZXY7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfQlVMSzoKKwkJaWYgKGVkLT5lZF9wcmV2ID09IE5VTEwpIHsKKwkJCWlmICghZWQtPmh3TmV4dEVEKSB7CisJCQkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX0JMRTsKKwkJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJCX0KKwkJCXdyaXRlbCAobTMyX3N3YXAgKCooKF9fdTMyICopJmVkLT5od05leHRFRCkpLCAmb2hjaS0+cmVncy0+ZWRfYnVsa2hlYWQpOworCQl9IGVsc2UgeworCQkJZWQtPmVkX3ByZXYtPmh3TmV4dEVEID0gZWQtPmh3TmV4dEVEOworCQl9CisJCWlmIChvaGNpLT5lZF9idWxrdGFpbCA9PSBlZCkgeworCQkJb2hjaS0+ZWRfYnVsa3RhaWwgPSBlZC0+ZWRfcHJldjsKKwkJfSBlbHNlIHsKKwkJCSgoZWRfdCAqKW0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSktPmVkX3ByZXYgPSBlZC0+ZWRfcHJldjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUElQRV9JTlRFUlJVUFQ6CisJCXBlcmlvZGljX3VubGluayAob2hjaSwgZWQsIDAsIDEpOworCQlmb3IgKGkgPSBlZC0+aW50X2JyYW5jaDsgaSA8IDMyOyBpICs9IGVkLT5pbnRfaW50ZXJ2YWwpCisJCSAgICBvaGNpLT5vaGNpX2ludF9sb2FkW2ldIC09IGVkLT5pbnRfbG9hZDsKKwkJYnJlYWs7CisJfQorCWVkLT5zdGF0ZSA9IEVEX1VOTElOSzsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogYWRkL3JlaW5pdCBhbiBlbmRwb2ludDsgdGhpcyBzaG91bGQgYmUgZG9uZSBvbmNlIGF0IHRoZQorICogdXNiX3NldF9jb25maWd1cmF0aW9uIGNvbW1hbmQsIGJ1dCB0aGUgVVNCIHN0YWNrIGlzIGEgbGl0dGxlIGJpdAorICogc3RhdGVsZXNzIHNvIHdlIGRvIGl0IGF0IGV2ZXJ5IHRyYW5zYWN0aW9uIGlmIHRoZSBzdGF0ZSBvZiB0aGUgZWQKKyAqIGlzIEVEX05FVyB0aGVuIGEgZHVtbXkgdGQgaXMgYWRkZWQgYW5kIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkIHRvCisgKiBFRF9VTkxJTksgaW4gYWxsIG90aGVyIGNhc2VzIHRoZSBzdGF0ZSBpcyBsZWZ0IHVuY2hhbmdlZCB0aGUgZWQKKyAqIGluZm8gZmllbGRzIGFyZSBzZXR0ZWQgYW55d2F5IGV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlbSBzaG91bGQgbm90CisgKiBjaGFuZ2UKKyAqLworc3RhdGljIGVkX3QgKiBlcF9hZGRfZWQgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCWludCBpbnRlcnZhbCwgaW50IGxvYWQpCit7CisJdGRfdCAqdGQ7CisJZWRfdCAqZWRfcmV0OworCXZvbGF0aWxlIGVkX3QgKmVkOworCisJZWQgPSBlZF9yZXQgPSAmb2hjaV9kZXYuZWRbKHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpIDw8IDEpIHwKKwkJCSh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpPyAwOiB1c2JfcGlwZW91dCAocGlwZSkpXTsKKworCWlmICgoZWQtPnN0YXRlICYgRURfREVMKSB8fCAoZWQtPnN0YXRlICYgRURfVVJCX0RFTCkpIHsKKwkJZXJyKCJlcF9hZGRfZWQ6IHBlbmRpbmcgZGVsZXRlIik7CisJCS8qIHBlbmRpbmcgZGVsZXRlIHJlcXVlc3QgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGVkLT5zdGF0ZSA9PSBFRF9ORVcpIHsKKwkJZWQtPmh3SU5GTyA9IG0zMl9zd2FwIChPSENJX0VEX1NLSVApOyAvKiBza2lwIGVkICovCisJCS8qIGR1bW15IHRkOyBlbmQgb2YgdGQgbGlzdCBmb3IgZWQgKi8KKwkJdGQgPSB0ZF9hbGxvYyAodXNiX2Rldik7CisJCWVkLT5od1RhaWxQID0gbTMyX3N3YXAgKCh1bnNpZ25lZCBsb25nKXRkKTsKKwkJZWQtPmh3SGVhZFAgPSBlZC0+aHdUYWlsUDsKKwkJZWQtPnN0YXRlID0gRURfVU5MSU5LOworCQllZC0+dHlwZSA9IHVzYl9waXBldHlwZSAocGlwZSk7CisJCW9oY2lfZGV2LmVkX2NudCsrOworCX0KKworCWVkLT5od0lORk8gPSBtMzJfc3dhcCAodXNiX3BpcGVkZXZpY2UgKHBpcGUpCisJCQl8IHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpIDw8IDcKKwkJCXwgKHVzYl9waXBlaXNvYyAocGlwZSk/IDB4ODAwMDogMCkKKwkJCXwgKHVzYl9waXBlY29udHJvbCAocGlwZSk/IDA6ICh1c2JfcGlwZW91dCAocGlwZSk/IDB4ODAwOiAweDEwMDApKQorCQkJfCB1c2JfcGlwZXNsb3cgKHBpcGUpIDw8IDEzCisJCQl8IHVzYl9tYXhwYWNrZXQgKHVzYl9kZXYsIHBpcGUpIDw8IDE2KTsKKworCWlmIChlZC0+dHlwZSA9PSBQSVBFX0lOVEVSUlVQVCAmJiBlZC0+c3RhdGUgPT0gRURfVU5MSU5LKSB7CisJCWVkLT5pbnRfcGVyaW9kID0gaW50ZXJ2YWw7CisJCWVkLT5pbnRfbG9hZCA9IGxvYWQ7CisJfQorCisJcmV0dXJuIGVkX3JldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogVEQgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnF1ZXVlIG5leHQgVEQgZm9yIHRoaXMgVVJCIChPSENJIHNwZWMgNS4yLjguMikgKi8KKworc3RhdGljIHZvaWQgdGRfZmlsbCAob2hjaV90ICpvaGNpLCB1bnNpZ25lZCBpbnQgaW5mbywKKwl2b2lkICpkYXRhLCBpbnQgbGVuLAorCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpbmRleCwgdXJiX3ByaXZfdCAqdXJiX3ByaXYpCit7CisJdm9sYXRpbGUgdGRfdCAgKnRkLCAqdGRfcHQ7CisjaWZkZWYgT0hDSV9GSUxMX1RSQUNFCisJaW50IGk7CisjZW5kaWYKKworCWlmIChpbmRleCA+IHVyYl9wcml2LT5sZW5ndGgpIHsKKwkJZXJyKCJpbmRleCA+IGxlbmd0aCIpOworCQlyZXR1cm47CisJfQorCS8qIHVzZSB0aGlzIHRkIGFzIHRoZSBuZXh0IGR1bW15ICovCisJdGRfcHQgPSB1cmJfcHJpdi0+dGQgW2luZGV4XTsKKwl0ZF9wdC0+aHdOZXh0VEQgPSAwOworCisJLyogZmlsbCB0aGUgb2xkIGR1bW15IFREICovCisJdGQgPSB1cmJfcHJpdi0+dGQgW2luZGV4XSA9ICh0ZF90ICopKG0zMl9zd2FwICh1cmJfcHJpdi0+ZWQtPmh3VGFpbFApICYgfjB4Zik7CisKKwl0ZC0+ZWQgPSB1cmJfcHJpdi0+ZWQ7CisJdGQtPm5leHRfZGxfdGQgPSBOVUxMOworCXRkLT5pbmRleCA9IGluZGV4OworCXRkLT5kYXRhID0gKF9fdTMyKWRhdGE7CisjaWZkZWYgT0hDSV9GSUxMX1RSQUNFCisJaWYgKCh1c2JfcGlwZXR5cGUodXJiX3ByaXYtPnBpcGUpID09IFBJUEVfQlVMSykgJiYgdXNiX3BpcGVvdXQodXJiX3ByaXYtPnBpcGUpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJcHJpbnRmKCJ0ZC0+ZGF0YVslZF0gJSMyeCAiLGksICgodW5zaWduZWQgY2hhciAqKXRkLT5kYXRhKVtpXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisjZW5kaWYKKwlpZiAoIWxlbikKKwkJZGF0YSA9IDA7CisKKwl0ZC0+aHdJTkZPID0gbTMyX3N3YXAgKGluZm8pOworCXRkLT5od0NCUCA9IG0zMl9zd2FwICgodW5zaWduZWQgbG9uZylkYXRhKTsKKwlpZiAoZGF0YSkKKwkJdGQtPmh3QkUgPSBtMzJfc3dhcCAoKHVuc2lnbmVkIGxvbmcpKGRhdGEgKyBsZW4gLSAxKSk7CisJZWxzZQorCQl0ZC0+aHdCRSA9IDA7CisJdGQtPmh3TmV4dFREID0gbTMyX3N3YXAgKCh1bnNpZ25lZCBsb25nKXRkX3B0KTsKKworCS8qIGFwcGVuZCB0byBxdWV1ZSAqLworCXRkLT5lZC0+aHdUYWlsUCA9IHRkLT5od05leHRURDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogcHJlcGFyZSBhbGwgVERzIG9mIGEgdHJhbnNmZXIgKi8KKworc3RhdGljIHZvaWQgdGRfc3VibWl0X2pvYiAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwLCB1cmJfcHJpdl90ICp1cmIsIGludCBpbnRlcnZhbCkKK3sKKwlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7CisJaW50IGRhdGFfbGVuID0gdHJhbnNmZXJfbGVuOworCXZvaWQgKmRhdGE7CisJaW50IGNudCA9IDA7CisJX191MzIgaW5mbyA9IDA7CisJdW5zaWduZWQgaW50IHRvZ2dsZSA9IDA7CisKKwkvKiBPSENJIGhhbmRsZXMgdGhlIERBVEEtdG9nZ2xlcyBpdHNlbGYsIHdlIGp1c3QgdXNlIHRoZSBVU0ItdG9nZ2xlIGJpdHMgZm9yIHJlc2V0aW5nICovCisJaWYodXNiX2dldHRvZ2dsZShkZXYsIHVzYl9waXBlZW5kcG9pbnQocGlwZSksIHVzYl9waXBlb3V0KHBpcGUpKSkgeworCQl0b2dnbGUgPSBURF9UX1RPR0dMRTsKKwl9IGVsc2UgeworCQl0b2dnbGUgPSBURF9UX0RBVEEwOworCQl1c2Jfc2V0dG9nZ2xlKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwgdXNiX3BpcGVvdXQocGlwZSksIDEpOworCX0KKwl1cmItPnRkX2NudCA9IDA7CisJaWYgKGRhdGFfbGVuKQorCQlkYXRhID0gYnVmZmVyOworCWVsc2UKKwkJZGF0YSA9IDA7CisKKwlzd2l0Y2ggKHVzYl9waXBldHlwZSAocGlwZSkpIHsKKwljYXNlIFBJUEVfQlVMSzoKKwkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KKwkJCVREX0NDIHwgVERfRFBfT1VUIDogVERfQ0MgfCBURF9EUF9JTiA7CisJCXdoaWxlKGRhdGFfbGVuID4gNDA5NikgeworCQkJdGRfZmlsbCAob2hjaSwgaW5mbyB8IChjbnQ/IFREX1RfVE9HR0xFOnRvZ2dsZSksIGRhdGEsIDQwOTYsIGRldiwgY250LCB1cmIpOworCQkJZGF0YSArPSA0MDk2OyBkYXRhX2xlbiAtPSA0MDk2OyBjbnQrKzsKKwkJfQorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJVERfQ0MgfCBURF9EUF9PVVQgOiBURF9DQyB8IFREX1IgfCBURF9EUF9JTiA7CisJCXRkX2ZpbGwgKG9oY2ksIGluZm8gfCAoY250PyBURF9UX1RPR0dMRTp0b2dnbGUpLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQsIHVyYik7CisJCWNudCsrOworCisJCWlmICghb2hjaS0+c2xlZXBpbmcpCisJCQl3cml0ZWwgKE9IQ0lfQkxGLCAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsgLyogc3RhcnQgYnVsayBsaXN0ICovCisJCWJyZWFrOworCisJY2FzZSBQSVBFX0NPTlRST0w6CisJCWluZm8gPSBURF9DQyB8IFREX0RQX1NFVFVQIHwgVERfVF9EQVRBMDsKKwkJdGRfZmlsbCAob2hjaSwgaW5mbywgc2V0dXAsIDgsIGRldiwgY250KyssIHVyYik7CisJCWlmIChkYXRhX2xlbiA+IDApIHsKKwkJCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQkJVERfQ0MgfCBURF9SIHwgVERfRFBfT1VUIHwgVERfVF9EQVRBMSA6IFREX0NDIHwgVERfUiB8IFREX0RQX0lOIHwgVERfVF9EQVRBMTsKKwkJCS8qIE5PVEU6ICBtaXNoYW5kbGVzIHRyYW5zZmVycyA+OEssIHNvbWUgPjRLICovCisJCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQrKywgdXJiKTsKKwkJfQorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJVERfQ0MgfCBURF9EUF9JTiB8IFREX1RfREFUQTE6IFREX0NDIHwgVERfRFBfT1VUIHwgVERfVF9EQVRBMTsKKwkJdGRfZmlsbCAob2hjaSwgaW5mbywgZGF0YSwgMCwgZGV2LCBjbnQrKywgdXJiKTsKKwkJaWYgKCFvaGNpLT5zbGVlcGluZykKKwkJCXdyaXRlbCAoT0hDSV9DTEYsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiBzdGFydCBDb250cm9sIGxpc3QgKi8KKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHVyYi0+cGlwZSk/CisJCQlURF9DQyB8IFREX0RQX09VVCB8IHRvZ2dsZToKKwkJCVREX0NDIHwgVERfUiB8IFREX0RQX0lOIHwgdG9nZ2xlOworCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQrKywgdXJiKTsKKwkJYnJlYWs7CisJfQorCWlmICh1cmItPmxlbmd0aCAhPSBjbnQpCisJCWRiZygiVEQgTEVOR1RIICVkICE9IENOVCAlZCIsIHVyYi0+bGVuZ3RoLCBjbnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBEb25lIExpc3QgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjYWxjdWxhdGUgdGhlIHRyYW5zZmVyIGxlbmd0aCBhbmQgdXBkYXRlIHRoZSB1cmIgKi8KKworc3RhdGljIHZvaWQgZGxfdHJhbnNmZXJfbGVuZ3RoKHRkX3QgKiB0ZCkKK3sKKwlfX3UzMiB0ZElORk8sIHRkQkUsIHRkQ0JQOworCXVyYl9wcml2X3QgKmx1cmJfcHJpdiA9IHRkLT5lZC0+cHVyYjsKKworCXRkSU5GTyA9IG0zMl9zd2FwICh0ZC0+aHdJTkZPKTsKKwl0ZEJFICAgPSBtMzJfc3dhcCAodGQtPmh3QkUpOworCXRkQ0JQICA9IG0zMl9zd2FwICh0ZC0+aHdDQlApOworCisJaWYgKCEodXNiX3BpcGV0eXBlIChsdXJiX3ByaXYtPnBpcGUpID09IFBJUEVfQ09OVFJPTCAmJgorCSAgICAoKHRkLT5pbmRleCA9PSAwKSB8fCAodGQtPmluZGV4ID09IGx1cmJfcHJpdi0+bGVuZ3RoIC0gMSkpKSkgeworCQlpZiAodGRCRSAhPSAwKSB7CisJCQlpZiAodGQtPmh3Q0JQID09IDApCisJCQkJbHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoICs9IHRkQkUgLSB0ZC0+ZGF0YSArIDE7CisJCQllbHNlCisJCQkJbHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoICs9IHRkQ0JQIC0gdGQtPmRhdGE7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlcGxpZXMgdG8gdGhlIHJlcXVlc3QgaGF2ZSB0byBiZSBvbiBhIEZJRk8gYmFzaXMgc28KKyAqIHdlIHJldmVyc2UgdGhlIHJldmVyc2VkIGRvbmUtbGlzdCAqLworCitzdGF0aWMgdGRfdCAqIGRsX3JldmVyc2VfZG9uZV9saXN0IChvaGNpX3QgKm9oY2kpCit7CisJX191MzIgdGRfbGlzdF9oYzsKKwl0ZF90ICp0ZF9yZXYgPSBOVUxMOworCXRkX3QgKnRkX2xpc3QgPSBOVUxMOworCXVyYl9wcml2X3QgKmx1cmJfcHJpdiA9IE5VTEw7CisKKwl0ZF9saXN0X2hjID0gbTMyX3N3YXAgKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCkgJiAweGZmZmZmZmYwOworCW9oY2ktPmhjY2EtPmRvbmVfaGVhZCA9IDA7CisKKwl3aGlsZSAodGRfbGlzdF9oYykgeworCQl0ZF9saXN0ID0gKHRkX3QgKil0ZF9saXN0X2hjOworCisJCWlmIChURF9DQ19HRVQgKG0zMl9zd2FwICh0ZF9saXN0LT5od0lORk8pKSkgeworCQkJbHVyYl9wcml2ID0gdGRfbGlzdC0+ZWQtPnB1cmI7CisJCQlkYmcoIiBVU0ItZXJyb3Ivc3RhdHVzOiAleCA6ICVwIiwKKwkJCQkJVERfQ0NfR0VUIChtMzJfc3dhcCAodGRfbGlzdC0+aHdJTkZPKSksIHRkX2xpc3QpOworCQkJaWYgKHRkX2xpc3QtPmVkLT5od0hlYWRQICYgbTMyX3N3YXAgKDB4MSkpIHsKKwkJCQlpZiAobHVyYl9wcml2ICYmICgodGRfbGlzdC0+aW5kZXggKyAxKSA8IGx1cmJfcHJpdi0+bGVuZ3RoKSkgeworCQkJCQl0ZF9saXN0LT5lZC0+aHdIZWFkUCA9CisJCQkJCQkobHVyYl9wcml2LT50ZFtsdXJiX3ByaXYtPmxlbmd0aCAtIDFdLT5od05leHRURCAmIG0zMl9zd2FwICgweGZmZmZmZmYwKSkgfAorCQkJCQkJCQkJKHRkX2xpc3QtPmVkLT5od0hlYWRQICYgbTMyX3N3YXAgKDB4MikpOworCQkJCQlsdXJiX3ByaXYtPnRkX2NudCArPSBsdXJiX3ByaXYtPmxlbmd0aCAtIHRkX2xpc3QtPmluZGV4IC0gMTsKKwkJCQl9IGVsc2UKKwkJCQkJdGRfbGlzdC0+ZWQtPmh3SGVhZFAgJj0gbTMyX3N3YXAgKDB4ZmZmZmZmZjIpOworCQkJfQorI2lmZGVmIENPTkZJR19NUEM1MjAwCisJCQl0ZF9saXN0LT5od05leHRURCA9IDA7CisjZW5kaWYKKwkJfQorCisJCXRkX2xpc3QtPm5leHRfZGxfdGQgPSB0ZF9yZXY7CisJCXRkX3JldiA9IHRkX2xpc3Q7CisJCXRkX2xpc3RfaGMgPSBtMzJfc3dhcCAodGRfbGlzdC0+aHdOZXh0VEQpICYgMHhmZmZmZmZmMDsKKwl9CisJcmV0dXJuIHRkX2xpc3Q7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHRkIGRvbmUgbGlzdCAqLworc3RhdGljIGludCBkbF9kb25lX2xpc3QgKG9oY2lfdCAqb2hjaSwgdGRfdCAqdGRfbGlzdCkKK3sKKwl0ZF90ICp0ZF9saXN0X25leHQgPSBOVUxMOworCWVkX3QgKmVkOworCWludCBjYyA9IDA7CisJaW50IHN0YXQgPSAwOworCS8qIHVyYl90ICp1cmI7ICovCisJdXJiX3ByaXZfdCAqbHVyYl9wcml2OworCV9fdTMyIHRkSU5GTywgZWRIZWFkUCwgZWRUYWlsUDsKKworCXdoaWxlICh0ZF9saXN0KSB7CisJCXRkX2xpc3RfbmV4dCA9IHRkX2xpc3QtPm5leHRfZGxfdGQ7CisKKwkJdGRJTkZPID0gbTMyX3N3YXAgKHRkX2xpc3QtPmh3SU5GTyk7CisKKwkJZWQgPSB0ZF9saXN0LT5lZDsKKwkJbHVyYl9wcml2ID0gZWQtPnB1cmI7CisKKwkJZGxfdHJhbnNmZXJfbGVuZ3RoKHRkX2xpc3QpOworCisJCS8qIGVycm9yIGNvZGUgb2YgdHJhbnNmZXIgKi8KKwkJY2MgPSBURF9DQ19HRVQgKHRkSU5GTyk7CisJCWlmIChjYyAhPSAwKSB7CisJCQlkYmcoIkNvbmRpdGlvbkNvZGUgJSN4IiwgY2MpOworCQkJc3RhdCA9IGNjX3RvX2Vycm9yW2NjXTsKKwkJfQorCisJCS8qIHNlZSBpZiB0aGlzIGRvbmUgbGlzdCBtYWtlcyBmb3IgYWxsIFREJ3Mgb2YgY3VycmVudCBVUkIsCisJCSAqIGFuZCBtYXJrIHRoZSBVUkIgZmluaXNoZWQgaWYgc28gKi8KKwkJaWYgKCsrKGx1cmJfcHJpdi0+dGRfY250KSA9PSBsdXJiX3ByaXYtPmxlbmd0aCkgeworI2lmIDEKKwkJCWlmICgoZWQtPnN0YXRlICYgKEVEX09QRVIgfCBFRF9VTkxJTkspKSAmJgorCQkJICAgIChsdXJiX3ByaXYtPnN0YXRlICE9IFVSQl9ERUwpKQorI2Vsc2UKKwkJCWlmICgoZWQtPnN0YXRlICYgKEVEX09QRVIgfCBFRF9VTkxJTkspKSkKKyNlbmRpZgorCQkJCWx1cmJfcHJpdi0+ZmluaXNoZWQgPSBzb2hjaV9yZXR1cm5fam9iKG9oY2ksCisJCQkJCQlsdXJiX3ByaXYpOworCQkJZWxzZQorCQkJCWRiZygiZGxfZG9uZV9saXN0OiBzdHJhbmdlLi4sIEVEIHN0YXRlICV4LCBlZC0+c3RhdGVcbiIpOworCQl9IGVsc2UKKwkJCWRiZygiZGxfZG9uZV9saXN0OiBwcm9jZXNzaW5nIFREICV4LCBsZW4gJXhcbiIsIGx1cmJfcHJpdi0+dGRfY250LAorCQkJCWx1cmJfcHJpdi0+bGVuZ3RoKTsKKwkJaWYgKGVkLT5zdGF0ZSAhPSBFRF9ORVcgJiYKKwkJCSAgKHVzYl9waXBldHlwZSAobHVyYl9wcml2LT5waXBlKSAhPSBQSVBFX0lOVEVSUlVQVCkpIHsKKwkJCWVkSGVhZFAgPSBtMzJfc3dhcCAoZWQtPmh3SGVhZFApICYgMHhmZmZmZmZmMDsKKwkJCWVkVGFpbFAgPSBtMzJfc3dhcCAoZWQtPmh3VGFpbFApOworCisJCQkvKiB1bmxpbmsgZWRzIGlmIHRoZXkgYXJlIG5vdCBidXN5ICovCisJCQlpZiAoKGVkSGVhZFAgPT0gZWRUYWlsUCkgJiYgKGVkLT5zdGF0ZSA9PSBFRF9PUEVSKSkKKwkJCQllcF91bmxpbmsgKG9oY2ksIGVkKTsKKwkJfQorCisJCXRkX2xpc3QgPSB0ZF9saXN0X25leHQ7CisJfQorCXJldHVybiBzdGF0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBWaXJ0dWFsIFJvb3QgSHViCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBEZXZpY2UgZGVzY3JpcHRvciAqLworc3RhdGljIF9fdTggcm9vdF9odWJfZGV2X2Rlc1tdID0KK3sKKwkweDEyLAkgICAgLyoJX191OCAgYkxlbmd0aDsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgYkRlc2NyaXB0b3JUeXBlOyBEZXZpY2UgKi8KKwkweDEwLAkgICAgLyoJX191MTYgYmNkVVNCOyB2MS4xICovCisJMHgwMSwKKwkweDA5LAkgICAgLyoJX191OCAgYkRldmljZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJICAgIC8qCV9fdTggIGJEZXZpY2VTdWJDbGFzczsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgYkRldmljZVByb3RvY29sOyAqLworCTB4MDgsCSAgICAvKglfX3U4ICBiTWF4UGFja2V0U2l6ZTA7IDggQnl0ZXMgKi8KKwkweDAwLAkgICAgLyoJX191MTYgaWRWZW5kb3I7ICovCisJMHgwMCwKKwkweDAwLAkgICAgLyoJX191MTYgaWRQcm9kdWN0OyAqLworCTB4MDAsCisJMHgwMCwJICAgIC8qCV9fdTE2IGJjZERldmljZTsgKi8KKwkweDAwLAorCTB4MDAsCSAgICAvKglfX3U4ICBpTWFudWZhY3R1cmVyOyAqLworCTB4MDEsCSAgICAvKglfX3U4ICBpUHJvZHVjdDsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaVNlcmlhbE51bWJlcjsgKi8KKwkweDAxCSAgICAvKglfX3U4ICBiTnVtQ29uZmlndXJhdGlvbnM7ICovCit9OworCisvKiBDb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2NvbmZpZ19kZXNbXSA9Cit7CisJMHgwOSwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCisJMHgwMiwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgQ29uZmlndXJhdGlvbiAqLworCTB4MTksCSAgICAvKglfX3UxNiB3VG90YWxMZW5ndGg7ICovCisJMHgwMCwKKwkweDAxLAkgICAgLyoJX191OCAgYk51bUludGVyZmFjZXM7ICovCisJMHgwMSwJICAgIC8qCV9fdTggIGJDb25maWd1cmF0aW9uVmFsdWU7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlDb25maWd1cmF0aW9uOyAqLworCTB4NDAsCSAgICAvKglfX3U4ICBibUF0dHJpYnV0ZXM7CisJCSBCaXQgNzogQnVzLXBvd2VyZWQsIDY6IFNlbGYtcG93ZXJlZCwgNSBSZW1vdGUtd2Frd3VwLCA0Li4wOiByZXN2ZCAqLworCTB4MDAsCSAgICAvKglfX3U4ICBNYXhQb3dlcjsgKi8KKworCS8qIGludGVyZmFjZSAqLworCTB4MDksCSAgICAvKglfX3U4ICBpZl9iTGVuZ3RoOyAqLworCTB4MDQsCSAgICAvKglfX3U4ICBpZl9iRGVzY3JpcHRvclR5cGU7IEludGVyZmFjZSAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlTnVtYmVyOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iQWx0ZXJuYXRlU2V0dGluZzsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgaWZfYk51bUVuZHBvaW50czsgKi8KKwkweDA5LAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VTdWJDbGFzczsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZVByb3RvY29sOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9pSW50ZXJmYWNlOyAqLworCisJLyogZW5kcG9pbnQgKi8KKwkweDA3LAkgICAgLyoJX191OCAgZXBfYkxlbmd0aDsgKi8KKwkweDA1LAkgICAgLyoJX191OCAgZXBfYkRlc2NyaXB0b3JUeXBlOyBFbmRwb2ludCAqLworCTB4ODEsCSAgICAvKglfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCisJMHgwMywJICAgIC8qCV9fdTggIGVwX2JtQXR0cmlidXRlczsgSW50ZXJydXB0ICovCisJMHgwMiwJICAgIC8qCV9fdTE2IGVwX3dNYXhQYWNrZXRTaXplOyAoKE1BWF9ST09UX1BPUlRTICsgMSkgLyA4ICovCisJMHgwMCwKKwkweGZmCSAgICAvKglfX3U4ICBlcF9iSW50ZXJ2YWw7IDI1NSBtcyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MFtdID0KK3sKKwkweDA0LAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDMsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgU3RyaW5nLWRlc2NyaXB0b3IgKi8KKwkweDA5LAkJCS8qICBfX3U4ICBsYW5nIElEICovCisJMHgwNCwJCQkvKiAgX191OCAgbGFuZyBJRCAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MVtdID0KK3sKKwkyOCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJJ08nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdDJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0knLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdSJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd0JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd1JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ2InLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KK307CisKKy8qIEh1YiBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9yIGlzIGNvbnN0cnVjdGVkIGR5bmFtaWNhbGx5ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgT0soeCkJCQlsZW4gPSAoeCk7IGJyZWFrCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgV1JfUkhfU1RBVCh4KQkJe2luZm8oIldSOnN0YXR1cyAlIzh4IiwgKHgpKTt3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5zdGF0dXMpO30KKyNkZWZpbmUgV1JfUkhfUE9SVFNUQVQoeCkJe2luZm8oIldSOnBvcnRzdGF0dXNbJWRdICUjOHgiLCB3SW5kZXgtMSwgKHgpKTt3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzW3dJbmRleC0xXSk7fQorI2Vsc2UKKyNkZWZpbmUgV1JfUkhfU1RBVCh4KQkJd3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIuc3RhdHVzKQorI2RlZmluZSBXUl9SSF9QT1JUU1RBVCh4KQl3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzW3dJbmRleC0xXSkKKyNlbmRpZgorI2RlZmluZSBSRF9SSF9TVEFUCQlyb290aHViX3N0YXR1cygmZ29oY2kpCisjZGVmaW5lIFJEX1JIX1BPUlRTVEFUCQlyb290aHViX3BvcnRzdGF0dXMoJmdvaGNpLHdJbmRleC0xKQorCisvKiByZXF1ZXN0IHRvIHZpcnR1YWwgcm9vdCBodWIgKi8KKworaW50IHJoX2NoZWNrX3BvcnRfc3RhdHVzKG9oY2lfdCAqY29udHJvbGxlcikKK3sKKwlfX3UzMiB0ZW1wLCBuZHAsIGk7CisJaW50IHJlczsKKworCXJlcyA9IC0xOworCXRlbXAgPSByb290aHViX2EgKGNvbnRyb2xsZXIpOworCW5kcCA9ICh0ZW1wICYgUkhfQV9ORFApOworI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRworCW5kcCA9IChuZHAgPT0gMikgPyAxOjA7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgbmRwOyBpKyspIHsKKwkJdGVtcCA9IHJvb3RodWJfcG9ydHN0YXR1cyAoY29udHJvbGxlciwgaSk7CisJCS8qIGNoZWNrIGZvciBhIGRldmljZSBkaXNjb25uZWN0ICovCisJCWlmICgoKHRlbXAgJiAoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpID09CisJCQkoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpICYmCisJCQkoKHRlbXAgJiBSSF9QU19DQ1MpID09IDApKSB7CisJCQlyZXMgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBvaGNpX3N1Ym1pdF9yaF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLAorCQl2b2lkICpidWZmZXIsIGludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpjbWQpCit7CisJdm9pZCAqIGRhdGEgPSBidWZmZXI7CisJaW50IGxlbmkgPSB0cmFuc2Zlcl9sZW47CisJaW50IGxlbiA9IDA7CisJaW50IHN0YXQgPSAwOworCV9fdTMyIGRhdGFiWzRdOworCV9fdTggKmRhdGFfYnVmID0gKF9fdTggKilkYXRhYjsKKwlfX3UxNiBibVJUeXBlX2JSZXE7CisJX191MTYgd1ZhbHVlOworCV9fdTE2IHdJbmRleDsKKwlfX3UxNiB3TGVuZ3RoOworCisjaWZkZWYgREVCVUcKK3BrdF9wcmludChOVUxMLCBkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBjbWQsICJTVUIocmgpIiwgdXNiX3BpcGVpbihwaXBlKSk7CisjZWxzZQorCXdhaXRfbXMoMSk7CisjZW5kaWYKKwlpZiAoKHBpcGUgJiBQSVBFX0lOVEVSUlVQVCkgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJaW5mbygiUm9vdC1IdWIgc3VibWl0IElSUTogTk9UIGltcGxlbWVudGVkIik7CisJCXJldHVybiAwOworCX0KKworCWJtUlR5cGVfYlJlcSAgPSBjbWQtPnJlcXVlc3R0eXBlIHwgKGNtZC0+cmVxdWVzdCA8PCA4KTsKKwl3VmFsdWUJICAgICAgPSBjcHVfdG9fbGUxNiAoY21kLT52YWx1ZSk7CisJd0luZGV4CSAgICAgID0gY3B1X3RvX2xlMTYgKGNtZC0+aW5kZXgpOworCXdMZW5ndGgJICAgICAgPSBjcHVfdG9fbGUxNiAoY21kLT5sZW5ndGgpOworCisJaW5mbygiUm9vdC1IdWI6IGFkcjogJTJ4IGNtZCglMXgpOiAlMDh4ICUwNHggJTA0eCAlMDR4IiwKKwkJZGV2LT5kZXZudW0sIDgsIGJtUlR5cGVfYlJlcSwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgpOworCisJc3dpdGNoIChibVJUeXBlX2JSZXEpIHsKKwkvKiBSZXF1ZXN0IERlc3RpbmF0aW9uOgorCSAgIHdpdGhvdXQgZmxhZ3M6IERldmljZSwKKwkgICBSSF9JTlRFUkZBQ0U6IGludGVyZmFjZSwKKwkgICBSSF9FTkRQT0lOVDogZW5kcG9pbnQsCisJICAgUkhfQ0xBU1MgbWVhbnMgSFVCIGhlcmUsCisJICAgUkhfT1RIRVIgfCBSSF9DTEFTUwlhbG1vc3QgZXZlciBtZWFucyBIVUJfUE9SVCBoZXJlCisJKi8KKworCWNhc2UgUkhfR0VUX1NUQVRVUzoKKwkJCSooX191MTYgKikgZGF0YV9idWYgPSBjcHVfdG9fbGUxNiAoMSk7IE9LICgyKTsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9JTlRFUkZBQ0U6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gY3B1X3RvX2xlMTYgKDApOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfRU5EUE9JTlQ6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gY3B1X3RvX2xlMTYgKDApOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfQ0xBU1M6CisJCQkqKF9fdTMyICopIGRhdGFfYnVmID0gY3B1X3RvX2xlMzIgKAorCQkJCVJEX1JIX1NUQVQgJiB+KFJIX0hTX0NSV0UgfCBSSF9IU19EUldFKSk7CisJCQlPSyAoNCk7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJCSooX191MzIgKikgZGF0YV9idWYgPSBjcHVfdG9fbGUzMiAoUkRfUkhfUE9SVFNUQVQpOyBPSyAoNCk7CisKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9FTkRQT0lOVDoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX0VORFBPSU5UX1NUQUxMKTogT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfQ0xBU1M6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIFJIX0NfSFVCX0xPQ0FMX1BPV0VSOgorCQkJCU9LKDApOworCQkJY2FzZSAoUkhfQ19IVUJfT1ZFUl9DVVJSRU5UKToKKwkJCQkJV1JfUkhfU1RBVChSSF9IU19PQ0lDKTsgT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX1BPUlRfRU5BQkxFKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NDUyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUE9DSSk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX1BPUlRfUE9XRVIpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfTFNEQSk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX0NfUE9SVF9DT05ORUNUSU9OKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NTQyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfRU5BQkxFKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BFU0MpOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfU1VTUEVORCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1NDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19PQ0lDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX1JFU0VUKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BSU0MpOyBPSyAoMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX1BPUlRfU1VTUEVORCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1MgKTsgT0sgKDApOworCQkJY2FzZSAoUkhfUE9SVF9SRVNFVCk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCisJCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKKwkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QUlMpOworCQkJCQlPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1BPV0VSKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BQUyApOworCQkJCQl3YWl0X21zKDEwMCk7CisJCQkJCU9LICgwKTsKKwkJCWNhc2UgKFJIX1BPUlRfRU5BQkxFKTogLyogQlVHIElOIEhVUCBDT0RFICoqKioqKioqKi8KKwkJCQkJaWYgKFJEX1JIX1BPUlRTVEFUICYgUkhfUFNfQ0NTKQorCQkJCQkgICAgV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BFUyApOworCQkJCQlPSyAoMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJIX1NFVF9BRERSRVNTOiBnb2hjaS5yaC5kZXZudW0gPSB3VmFsdWU7IE9LKDApOworCisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUjoKKwkJc3dpdGNoICgod1ZhbHVlICYgMHhmZjAwKSA+PiA4KSB7CisJCQljYXNlICgweDAxKTogLyogZGV2aWNlIGRlc2NyaXB0b3IgKi8KKwkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCSAgbGVuaSwKKwkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfZGV2X2RlcyksCisJCQkJCSAgICAgIHdMZW5ndGgpKTsKKwkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX2Rldl9kZXM7IE9LKGxlbik7CisJCQljYXNlICgweDAyKTogLyogY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yICovCisJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgIGxlbmksCisJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX2NvbmZpZ19kZXMpLAorCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJZGF0YV9idWYgPSByb290X2h1Yl9jb25maWdfZGVzOyBPSyhsZW4pOworCQkJY2FzZSAoMHgwMyk6IC8qIHN0cmluZyBkZXNjcmlwdG9ycyAqLworCQkJCWlmKHdWYWx1ZT09MHgwMzAwKSB7CisJCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgbGVuaSwKKwkJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9zdHJfaW5kZXgwKSwKKwkJCQkJCSAgICAgIHdMZW5ndGgpKTsKKwkJCQkJZGF0YV9idWYgPSByb290X2h1Yl9zdHJfaW5kZXgwOworCQkJCQlPSyhsZW4pOworCQkJCX0KKwkJCQlpZih3VmFsdWU9PTB4MDMwMSkgeworCQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgIGxlbmksCisJCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfc3RyX2luZGV4MSksCisJCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfc3RyX2luZGV4MTsKKwkJCQkJT0sobGVuKTsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUiB8IFJIX0NMQVNTOgorCXsKKwkJX191MzIgdGVtcCA9IHJvb3RodWJfYSAoJmdvaGNpKTsKKworCQlkYXRhX2J1ZiBbMF0gPSA5OwkJLyogbWluIGxlbmd0aDsgKi8KKwkJZGF0YV9idWYgWzFdID0gMHgyOTsKKwkJZGF0YV9idWYgWzJdID0gdGVtcCAmIFJIX0FfTkRQOworI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRworCQlkYXRhX2J1ZiBbMl0gPSAoZGF0YV9idWYgWzJdID09IDIpID8gMTowOworI2VuZGlmCisJCWRhdGFfYnVmIFszXSA9IDA7CisJCWlmICh0ZW1wICYgUkhfQV9QU00pCS8qIHBlci1wb3J0IHBvd2VyIHN3aXRjaGluZz8gKi8KKwkJCWRhdGFfYnVmIFszXSB8PSAweDE7CisJCWlmICh0ZW1wICYgUkhfQV9OT0NQKQkvKiBubyBvdmVyY3VycmVudCByZXBvcnRpbmc/ICovCisJCQlkYXRhX2J1ZiBbM10gfD0gMHgxMDsKKwkJZWxzZSBpZiAodGVtcCAmIFJIX0FfT0NQTSkJLyogcGVyLXBvcnQgb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLworCQkJZGF0YV9idWYgWzNdIHw9IDB4ODsKKworCQkvKiBjb3JyZXNwb25kcyB0byBkYXRhX2J1Zls0LTddICovCisJCWRhdGFiIFsxXSA9IDA7CisJCWRhdGFfYnVmIFs1XSA9ICh0ZW1wICYgUkhfQV9QT1RQR1QpID4+IDI0OworCQl0ZW1wID0gcm9vdGh1Yl9iICgmZ29oY2kpOworCQlkYXRhX2J1ZiBbN10gPSB0ZW1wICYgUkhfQl9EUjsKKwkJaWYgKGRhdGFfYnVmIFsyXSA8IDcpIHsKKwkJCWRhdGFfYnVmIFs4XSA9IDB4ZmY7CisJCX0gZWxzZSB7CisJCQlkYXRhX2J1ZiBbMF0gKz0gMjsKKwkJCWRhdGFfYnVmIFs4XSA9ICh0ZW1wICYgUkhfQl9EUikgPj4gODsKKwkJCWRhdGFfYnVmIFsxMF0gPSBkYXRhX2J1ZiBbOV0gPSAweGZmOworCQl9CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW5pLAorCQkJICAgIG1pbl90KHVuc2lnbmVkIGludCwgZGF0YV9idWYgWzBdLCB3TGVuZ3RoKSk7CisJCU9LIChsZW4pOworCX0KKworCWNhc2UgUkhfR0VUX0NPTkZJR1VSQVRJT046CSooX191OCAqKSBkYXRhX2J1ZiA9IDB4MDE7IE9LICgxKTsKKworCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046CVdSX1JIX1NUQVQgKDB4MTAwMDApOyBPSyAoMCk7CisKKwlkZWZhdWx0OgorCQlkYmcgKCJ1bnN1cHBvcnRlZCByb290IGh1YiBjb21tYW5kIik7CisJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwl9CisKKyNpZmRlZglERUJVRworCW9oY2lfZHVtcF9yb290aHViICgmZ29oY2ksIDEpOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisKKwlsZW4gPSBtaW5fdChpbnQsIGxlbiwgbGVuaSk7CisJaWYgKGRhdGEgIT0gZGF0YV9idWYpCisJICAgIG1lbWNweSAoZGF0YSwgZGF0YV9idWYsIGxlbik7CisJZGV2LT5hY3RfbGVuID0gbGVuOworCWRldi0+c3RhdHVzID0gc3RhdDsKKworI2lmZGVmIERFQlVHCisJcGt0X3ByaW50KE5VTEwsIGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIGNtZCwgIlJFVChyaCkiLCAwLyp1c2JfcGlwZWluKHBpcGUpKi8pOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisKKwlyZXR1cm4gc3RhdDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogY29tbW9uIGNvZGUgZm9yIGhhbmRsaW5nIHN1Ym1pdCBtZXNzYWdlcyAtIHVzZWQgZm9yIGFsbCBidXQgcm9vdCBodWIgKi8KKy8qIGFjY2Vzc2VzLiAqLworaW50IHN1Ym1pdF9jb21tb25fbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXAsIGludCBpbnRlcnZhbCkKK3sKKwlpbnQgc3RhdCA9IDA7CisJaW50IG1heHNpemUgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7CisJaW50IHRpbWVvdXQ7CisJdXJiX3ByaXZfdCAqdXJiOworCisJdXJiID0gbWFsbG9jKHNpemVvZih1cmJfcHJpdl90KSk7CisJbWVtc2V0KHVyYiwgMCwgc2l6ZW9mKHVyYl9wcml2X3QpKTsKKworCXVyYi0+ZGV2ID0gZGV2OworCXVyYi0+cGlwZSA9IHBpcGU7CisJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBidWZmZXI7CisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdHJhbnNmZXJfbGVuOworCXVyYi0+aW50ZXJ2YWwgPSBpbnRlcnZhbDsKKworCS8qIGRldmljZSBwdWxsZWQ/IFNob3J0Y3V0IHRoZSBhY3Rpb24uICovCisJaWYgKGRldmdvbmUgPT0gZGV2KSB7CisJCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIERFQlVHCisJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwlwa3RfcHJpbnQodXJiLCBkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgIlNVQiIsIHVzYl9waXBlaW4ocGlwZSkpOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisJaWYgKCFtYXhzaXplKSB7CisJCWVycigic3VibWl0X2NvbW1vbl9tZXNzYWdlOiBwaXBlc2l6ZSBmb3IgcGlwZSAlbHggaXMgemVybyIsCisJCQlwaXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzb2hjaV9zdWJtaXRfam9iKHVyYiwgc2V0dXApIDwgMCkgeworCQllcnIoInNvaGNpX3N1Ym1pdF9qb2IgZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZiAwCisJd2FpdF9tcygxMCk7CisJLyogb2hjaV9kdW1wX3N0YXR1cygmZ29oY2kpOyAqLworI2VuZGlmCisKKwkvKiBhbGxvdyBtb3JlIHRpbWUgZm9yIGEgQlVMSyBkZXZpY2UgdG8gcmVhY3QgLSBzb21lIGFyZSBzbG93ICovCisjZGVmaW5lIEJVTEtfVE8JIDUwMDAJLyogdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KKwlpZiAodXNiX3BpcGV0eXBlIChwaXBlKSA9PSBQSVBFX0JVTEspCisJCXRpbWVvdXQgPSBCVUxLX1RPOworCWVsc2UKKwkJdGltZW91dCA9IDEwMDsKKworCS8qIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCisJZm9yICg7OykgeworCQkvKiBjaGVjayB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIGRvbmUgKi8KKwkJc3RhdCA9IGhjX2ludGVycnVwdCgpOworCQlpZiAoc3RhdCA8IDApIHsKKwkJCXN0YXQgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTk9URTogc2luY2Ugd2UgYXJlIG5vdCBpbnRlcnJ1cHQgZHJpdmVuIGluIFUtQm9vdCBhbmQgYWx3YXlzCisJCSAqIGhhbmRsZSBvbmx5IG9uZSBVUkIgYXQgYSB0aW1lLCB3ZSBjYW5ub3QgYXNzdW1lIHRoZQorCQkgKiB0cmFuc2FjdGlvbiBmaW5pc2hlZCBvbiB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbQorCQkgKiBoY19pbnRlcnJ1cHQoKS4uIHVubGVzcyB0aGUgZmxhZyBmb3IgY3VycmVudCBVUkIgaXMgc2V0LAorCQkgKiBtZWFuaW5nIHRoYXQgYWxsIFREJ3MgdG8vZnJvbSBkZXZpY2UgZ290IGFjdHVhbGx5CisJCSAqIHRyYW5zZmVycmVkIGFuZCBwcm9jZXNzZWQuIElmIHRoZSBjdXJyZW50IFVSQiBpcyBub3QKKwkJICogZmluaXNoZWQgd2UgbmVlZCB0byByZS1pdGVyYXRlIHRoaXMgbG9vcCBzbyBhcworCQkgKiBoY19pbnRlcnJ1cHQoKSBnZXRzIGNhbGxlZCBhZ2FpbiBhcyB0aGVyZSBuZWVkcyB0byBiZSBzb21lCisJCSAqIG1vcmUgVEQncyB0byBwcm9jZXNzIHN0aWxsICovCisJCWlmICgoc3RhdCA+PSAwKSAmJiAoc3RhdCAhPSAweGZmKSAmJiAodXJiLT5maW5pc2hlZCkpIHsKKwkJCS8qIDB4ZmYgaXMgcmV0dXJuZWQgZm9yIGFuIFNGLWludGVycnVwdCAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoLS10aW1lb3V0KSB7CisJCQl3YWl0X21zKDEpOworCQkJaWYgKCF1cmItPmZpbmlzaGVkKQorCQkJCWRiZygiXCUiKTsKKworCQl9IGVsc2UgeworCQkJZXJyKCJDVEw6VElNRU9VVCAiKTsKKwkJCWRiZygic3VibWl0X2NvbW1vbl9tc2c6IFRPIHN0YXR1cyAleFxuIiwgc3RhdCk7CisJCQl1cmItPmZpbmlzaGVkID0gMTsKKwkJCXN0YXQgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGV2LT5zdGF0dXMgPSBzdGF0OworCWRldi0+YWN0X2xlbiA9IHRyYW5zZmVyX2xlbjsKKworI2lmZGVmIERFQlVHCisJcGt0X3ByaW50KHVyYiwgZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJSRVQoY3RscikiLCB1c2JfcGlwZWluKHBpcGUpKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCisJLyogZnJlZSBURHMgaW4gdXJiX3ByaXYgKi8KKwlpZiAodXNiX3BpcGV0eXBlIChwaXBlKSAhPSBQSVBFX0lOVEVSUlVQVCkKKwkJdXJiX2ZyZWVfcHJpdiAodXJiKTsKKwlyZXR1cm4gMDsKK30KKworLyogc3VibWl0IHJvdXRpbmVzIGNhbGxlZCBmcm9tIHVzYi5jICovCitpbnQgc3VibWl0X2J1bGtfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQlpbnQgdHJhbnNmZXJfbGVuKQoreworCWluZm8oInN1Ym1pdF9idWxrX21zZyIpOworCXJldHVybiBzdWJtaXRfY29tbW9uX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBOVUxMLCAwKTsKK30KKworaW50IHN1Ym1pdF9jb250cm9sX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwKQoreworCWludCBtYXhzaXplID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUpOworCisJaW5mbygic3VibWl0X2NvbnRyb2xfbXNnIik7CisjaWZkZWYgREVCVUcKKwlwa3RfcHJpbnQoTlVMTCwgZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJTVUIiLCB1c2JfcGlwZWluKHBpcGUpKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCWlmICghbWF4c2l6ZSkgeworCQllcnIoInN1Ym1pdF9jb250cm9sX21lc3NhZ2U6IHBpcGVzaXplIGZvciBwaXBlICVseCBpcyB6ZXJvIiwKKwkJCXBpcGUpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICgoKHBpcGUgPj4gOCkgJiAweDdmKSA9PSBnb2hjaS5yaC5kZXZudW0pIHsKKwkJZ29oY2kucmguZGV2ID0gZGV2OworCQkvKiByb290IGh1YiAtIHJlZGlyZWN0ICovCisJCXJldHVybiBvaGNpX3N1Ym1pdF9yaF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwKKwkJCXNldHVwKTsKKwl9CisKKwlyZXR1cm4gc3VibWl0X2NvbW1vbl9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsIDApOworfQorCitpbnQgc3VibWl0X2ludF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCWludCB0cmFuc2Zlcl9sZW4sIGludCBpbnRlcnZhbCkKK3sKKwlpbmZvKCJzdWJtaXRfaW50X21zZyIpOworCXJldHVybiBzdWJtaXRfY29tbW9uX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBOVUxMLAorCQkJaW50ZXJ2YWwpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBIQyBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlc2V0IHRoZSBIQyBhbmQgQlVTICovCisKK3N0YXRpYyBpbnQgaGNfcmVzZXQgKG9oY2lfdCAqb2hjaSkKK3sKKwlpbnQgdGltZW91dCA9IDMwOworCWludCBzbW1fdGltZW91dCA9IDUwOyAvKiAwLDUgc2VjICovCisKKwlkYmcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKHJlYWRsICgmb2hjaS0+cmVncy0+Y29udHJvbCkgJiBPSENJX0NUUkxfSVIpIHsgLyogU01NIG93bnMgdGhlIEhDICovCisJCXdyaXRlbCAoT0hDSV9PQ1IsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiByZXF1ZXN0IG93bmVyc2hpcCAqLworCQlpbmZvKCJVU0IgSEMgVGFrZU92ZXIgZnJvbSBTTU0iKTsKKwkJd2hpbGUgKHJlYWRsICgmb2hjaS0+cmVncy0+Y29udHJvbCkgJiBPSENJX0NUUkxfSVIpIHsKKwkJCXdhaXRfbXMgKDEwKTsKKwkJCWlmICgtLXNtbV90aW1lb3V0ID09IDApIHsKKwkJCQllcnIoIlVTQiBIQyBUYWtlT3ZlciBmYWlsZWQhIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJLyogRGlzYWJsZSBIQyBpbnRlcnJ1cHRzICovCisJd3JpdGVsIChPSENJX0lOVFJfTUlFLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOworCisJZGJnKCJVU0IgSEMgcmVzZXRfaGMgdXNiLSVzOiBjdHJsID0gMHglWCA7XG4iLAorCQlvaGNpLT5zbG90X25hbWUsCisJCXJlYWRsKCZvaGNpLT5yZWdzLT5jb250cm9sKSk7CisKKwkvKiBSZXNldCBVU0IgKG5lZWRlZCBieSBzb21lIGNvbnRyb2xsZXJzKSAqLworCW9oY2ktPmhjX2NvbnRyb2wgPSAwOworCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCisJLyogSEMgUmVzZXQgcmVxdWlyZXMgbWF4IDEwIHVzIGRlbGF5ICovCisJd3JpdGVsIChPSENJX0hDUiwgICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOworCXdoaWxlICgocmVhZGwgKCZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpICYgT0hDSV9IQ1IpICE9IDApIHsKKwkJaWYgKC0tdGltZW91dCA9PSAwKSB7CisJCQllcnIoIlVTQiBIQyByZXNldCB0aW1lZCBvdXQhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdWRlbGF5ICgxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN0YXJ0IGFuIE9IQ0kgY29udHJvbGxlciwgc2V0IHRoZSBCVVMgb3BlcmF0aW9uYWwKKyAqIGVuYWJsZSBpbnRlcnJ1cHRzCisgKiBjb25uZWN0IHRoZSB2aXJ0dWFsIHJvb3QgaHViICovCisKK3N0YXRpYyBpbnQgaGNfc3RhcnQgKG9oY2lfdCAqIG9oY2kpCit7CisJX191MzIgbWFzazsKKwl1bnNpZ25lZCBpbnQgZm1pbnRlcnZhbDsKKworCW9oY2ktPmRpc2FibGVkID0gMTsKKworCS8qIFRlbGwgdGhlIGNvbnRyb2xsZXIgd2hlcmUgdGhlIGNvbnRyb2wgYW5kIGJ1bGsgbGlzdHMgYXJlCisJICogVGhlIGxpc3RzIGFyZSBlbXB0eSBub3cuICovCisKKwl3cml0ZWwgKDAsICZvaGNpLT5yZWdzLT5lZF9jb250cm9saGVhZCk7CisJd3JpdGVsICgwLCAmb2hjaS0+cmVncy0+ZWRfYnVsa2hlYWQpOworCisJd3JpdGVsICgoX191MzIpb2hjaS0+aGNjYSwgJm9oY2ktPnJlZ3MtPmhjY2EpOyAvKiBhIHJlc2V0IGNsZWFycyB0aGlzICovCisKKwlmbWludGVydmFsID0gMHgyZWRmOworCXdyaXRlbCAoKGZtaW50ZXJ2YWwgKiA5KSAvIDEwLCAmb2hjaS0+cmVncy0+cGVyaW9kaWNzdGFydCk7CisJZm1pbnRlcnZhbCB8PSAoKCgoZm1pbnRlcnZhbCAtIDIxMCkgKiA2KSAvIDcpIDw8IDE2KTsKKwl3cml0ZWwgKGZtaW50ZXJ2YWwsICZvaGNpLT5yZWdzLT5mbWludGVydmFsKTsKKwl3cml0ZWwgKDB4NjI4LCAmb2hjaS0+cmVncy0+bHN0aHJlc2gpOworCisJLyogc3RhcnQgY29udHJvbGxlciBvcGVyYXRpb25zICovCisJb2hjaS0+aGNfY29udHJvbCA9IE9IQ0lfQ09OVFJPTF9JTklUIHwgT0hDSV9VU0JfT1BFUjsKKwlvaGNpLT5kaXNhYmxlZCA9IDA7CisJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJbWFzayA9IChPSENJX0lOVFJfU08gfCBPSENJX0lOVFJfV0RIIHwgT0hDSV9JTlRSX1NGIHwgT0hDSV9JTlRSX1JEIHwKKwkJCU9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9GTk8gfCBPSENJX0lOVFJfUkhTQyB8CisJCQlPSENJX0lOVFJfT0MgfCBPSENJX0lOVFJfTUlFKTsKKwl3cml0ZWwgKG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CisJLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwltYXNrICY9IH5PSENJX0lOVFJfTUlFOworCXdyaXRlbCAobWFzaywgJm9oY2ktPnJlZ3MtPmludHJzdGF0dXMpOworCS8qIENob29zZSB0aGUgaW50ZXJydXB0cyB3ZSBjYXJlIGFib3V0IG5vdyAgLSBidXQgdy9vIE1JRSAqLworCW1hc2sgPSBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9XREggfCBPSENJX0lOVFJfU087CisJd3JpdGVsIChtYXNrLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSk7CisKKyNpZmRlZglPSENJX1VTRV9OUFMKKwkvKiByZXF1aXJlZCBmb3IgQU1ELTc1NiBhbmQgc29tZSBNYWMgcGxhdGZvcm1zICovCisJd3JpdGVsICgocm9vdGh1Yl9hIChvaGNpKSB8IFJIX0FfTlBTKSAmIH5SSF9BX1BTTSwKKwkJJm9oY2ktPnJlZ3MtPnJvb3RodWIuYSk7CisJd3JpdGVsIChSSF9IU19MUFNDLCAmb2hjaS0+cmVncy0+cm9vdGh1Yi5zdGF0dXMpOworI2VuZGlmCS8qIE9IQ0lfVVNFX05QUyAqLworCisjZGVmaW5lIG1kZWxheShuKSAoe3Vuc2lnbmVkIGxvbmcgbXNlYz0obik7IHdoaWxlIChtc2VjLS0pIHVkZWxheSgxMDAwKTt9KQorCS8qIFBPVFBHVCBkZWxheSBpcyBiaXRzIDI0LTMxLCBpbiAyIG1zIHVuaXRzLiAqLworCW1kZWxheSAoKHJvb3RodWJfYSAob2hjaSkgPj4gMjMpICYgMHgxZmUpOworCisJLyogY29ubmVjdCB0aGUgdmlydHVhbCByb290IGh1YiAqLworCW9oY2ktPnJoLmRldm51bSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUG9sbCBVU0IgaW50ZXJydXB0LiAqLwordm9pZCB1c2JfZXZlbnRfcG9sbCh2b2lkKQoreworCWhjX2ludGVycnVwdCgpOworfQorCisvKiBhbiBpbnRlcnJ1cHQgaGFwcGVucyAqLworCitzdGF0aWMgaW50IGhjX2ludGVycnVwdCAodm9pZCkKK3sKKwlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7CisJc3RydWN0IG9oY2lfcmVncyAqcmVncyA9IG9oY2ktPnJlZ3M7CisJaW50IGludHM7CisJaW50IHN0YXQgPSAtMTsKKworCWlmICgob2hjaS0+aGNjYS0+ZG9uZV9oZWFkICE9IDApICYmCisJICAgICEobTMyX3N3YXAgKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCkgJiAweDAxKSkgeworCQlpbnRzID0gIE9IQ0lfSU5UUl9XREg7CisJfSBlbHNlIGlmICgoaW50cyA9IHJlYWRsICgmcmVncy0+aW50cnN0YXR1cykpID09IH4odTMyKTApIHsKKwkJb2hjaS0+ZGlzYWJsZWQrKzsKKwkJZXJyICgiJXMgZGV2aWNlIHJlbW92ZWQhIiwgb2hjaS0+c2xvdF9uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAoKGludHMgJj0gcmVhZGwgKCZyZWdzLT5pbnRyZW5hYmxlKSkgPT0gMCkgeworCQlkYmcoImhjX2ludGVycnVwdDogcmV0dXJuaW5nLi5cbiIpOworCQlyZXR1cm4gMHhmZjsKKwl9CisKKwkvKiBkYmcoIkludGVycnVwdDogJXggZnJhbWU6ICV4IiwgaW50cywgbGUxNl90b19jcHUgKG9oY2ktPmhjY2EtPmZyYW1lX25vKSk7ICovCisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9SSFNDKSB7CisJCWdvdF9yaHNjID0gMTsKKwkJc3RhdCA9IDB4ZmY7CisJfQorCisJaWYgKGludHMgJiBPSENJX0lOVFJfVUUpIHsKKwkJb2hjaS0+ZGlzYWJsZWQrKzsKKwkJZXJyICgiT0hDSSBVbnJlY292ZXJhYmxlIEVycm9yLCBjb250cm9sbGVyIHVzYi0lcyBkaXNhYmxlZCIsCisJCQlvaGNpLT5zbG90X25hbWUpOworCQkvKiBlLmcuIGR1ZSB0byBQQ0kgTWFzdGVyL1RhcmdldCBBYm9ydCAqLworCisjaWZkZWYJREVCVUcKKwkJb2hjaV9kdW1wIChvaGNpLCAxKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCQkvKiBGSVhNRTogYmUgb3B0aW1pc3RpYywgaG9wZSB0aGF0IGJ1ZyB3b24ndCByZXBlYXQgb2Z0ZW4uICovCisJCS8qIE1ha2Ugc29tZSBub24taW50ZXJydXB0IGNvbnRleHQgcmVzdGFydCB0aGUgY29udHJvbGxlci4gKi8KKwkJLyogQ291bnQgYW5kIGxpbWl0IHRoZSByZXRyaWVzIHRob3VnaDsgZWl0aGVyIGhhcmR3YXJlIG9yICovCisJCS8qIHNvZnR3YXJlIGVycm9ycyBjYW4gZ28gZm9yZXZlci4uLiAqLworCQloY19yZXNldCAob2hjaSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9XREgpIHsKKwkJd2FpdF9tcygxKTsKKwkJd3JpdGVsIChPSENJX0lOVFJfV0RILCAmcmVncy0+aW50cmRpc2FibGUpOworCQkodm9pZClyZWFkbCAoJnJlZ3MtPmludHJkaXNhYmxlKTsgLyogZmx1c2ggKi8KKwkJc3RhdCA9IGRsX2RvbmVfbGlzdCAoJmdvaGNpLCBkbF9yZXZlcnNlX2RvbmVfbGlzdCAoJmdvaGNpKSk7CisJCXdyaXRlbCAoT0hDSV9JTlRSX1dESCwgJnJlZ3MtPmludHJlbmFibGUpOworCQkodm9pZClyZWFkbCAoJnJlZ3MtPmludHJkaXNhYmxlKTsgLyogZmx1c2ggKi8KKwl9CisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9TTykgeworCQlkYmcoIlVTQiBTY2hlZHVsZSBvdmVycnVuXG4iKTsKKwkJd3JpdGVsIChPSENJX0lOVFJfU08sICZyZWdzLT5pbnRyZW5hYmxlKTsKKwkJc3RhdCA9IC0xOworCX0KKworCS8qIEZJWE1FOiAgdGhpcyBhc3N1bWVzIFNPRiAoMS9tcykgaW50ZXJydXB0cyBkb24ndCBnZXQgbG9zdC4uLiAqLworCWlmIChpbnRzICYgT0hDSV9JTlRSX1NGKSB7CisJCXVuc2lnbmVkIGludCBmcmFtZSA9IG0xNl9zd2FwIChvaGNpLT5oY2NhLT5mcmFtZV9ubykgJiAxOworCQl3YWl0X21zKDEpOworCQl3cml0ZWwgKE9IQ0lfSU5UUl9TRiwgJnJlZ3MtPmludHJkaXNhYmxlKTsKKwkJaWYgKG9oY2ktPmVkX3JtX2xpc3RbZnJhbWVdICE9IE5VTEwpCisJCQl3cml0ZWwgKE9IQ0lfSU5UUl9TRiwgJnJlZ3MtPmludHJlbmFibGUpOworCQlzdGF0ID0gMHhmZjsKKwl9CisKKwl3cml0ZWwgKGludHMsICZyZWdzLT5pbnRyc3RhdHVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRGUtYWxsb2NhdGUgYWxsIHJlc291cmNlcy4uICovCisKK3N0YXRpYyB2b2lkIGhjX3JlbGVhc2Vfb2hjaSAob2hjaV90ICpvaGNpKQoreworCWRiZyAoIlVTQiBIQyByZWxlYXNlIG9oY2kgdXNiLSVzIiwgb2hjaS0+c2xvdF9uYW1lKTsKKworCWlmICghb2hjaS0+ZGlzYWJsZWQpCisJCWhjX3Jlc2V0IChvaGNpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIGxvdyBsZXZlbCBpbml0YWxpc2F0aW9uIHJvdXRpbmUsIGNhbGxlZCBmcm9tIHVzYi5jCisgKi8KK3N0YXRpYyBjaGFyIG9oY2lfaW5pdGVkID0gMDsKKworaW50IHVzYl9sb3dsZXZlbF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BDSV9PSENJCisJcGNpX2Rldl90IHBkZXY7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9DUFVfSU5JVAorCS8qIGNwdSBkZXBlbmRhbnQgaW5pdCAqLworCWlmKHVzYl9jcHVfaW5pdCgpKQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisJLyogIGJvYXJkIGRlcGVuZGFudCBpbml0ICovCisJaWYodXNiX2JvYXJkX2luaXQoKSkKKwkJcmV0dXJuIC0xOworI2VuZGlmCisJbWVtc2V0ICgmZ29oY2ksIDAsIHNpemVvZiAob2hjaV90KSk7CisKKwkvKiBhbGlnbiB0aGUgc3RvcmFnZSAqLworCWlmICgoX191MzIpJmdoY2NhWzBdICYgMHhmZikgeworCQllcnIoIkhDQ0Egbm90IGFsaWduZWQhISIpOworCQlyZXR1cm4gLTE7CisJfQorCXBoY2NhID0gJmdoY2NhWzBdOworCWluZm8oImFsaWduZWQgZ2hjY2EgJXAiLCBwaGNjYSk7CisJbWVtc2V0KCZvaGNpX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBvaGNpX2RldmljZSkpOworCWlmICgoX191MzIpJm9oY2lfZGV2LmVkWzBdICYgMHg3KSB7CisJCWVycigiRURzIG5vdCBhbGlnbmVkISEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoZ3RkLCAwLCBzaXplb2YodGRfdCkgKiAoTlVNX1REICsgMSkpOworCWlmICgoX191MzIpZ3RkICYgMHg3KSB7CisJCWVycigiVERzIG5vdCBhbGlnbmVkISEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwdGQgPSBndGQ7CisJZ29oY2kuaGNjYSA9IHBoY2NhOworCW1lbXNldCAocGhjY2EsIDAsIHNpemVvZiAoc3RydWN0IG9oY2lfaGNjYSkpOworCisJZ29oY2kuZGlzYWJsZWQgPSAxOworCWdvaGNpLnNsZWVwaW5nID0gMDsKKwlnb2hjaS5pcnEgPSAtMTsKKyNpZmRlZiBDT05GSUdfUENJX09IQ0kKKwlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlcyhvaGNpX3BjaV9pZHMsIDApOworCisJaWYgKHBkZXYgIT0gLTEpIHsKKwkJdTE2IHZpZCwgZGlkOworCQl1MzIgYmFzZTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1ZFTkRPUl9JRCwgJnZpZCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9ERVZJQ0VfSUQsICZkaWQpOworCQlwcmludGYoIk9IQ0kgcGNpIGNvbnRyb2xsZXIgKCUwNHgsICUwNHgpIGZvdW5kIEAoJWQ6JWQ6JWQpXG4iLAorCQkJCXZpZCwgZGlkLCAocGRldiA+PiAxNikgJiAweGZmLAorCQkJCShwZGV2ID4+IDExKSAmIDB4MWYsIChwZGV2ID4+IDgpICYgMHg3KTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJmJhc2UpOworCQlwcmludGYoIk9IQ0kgcmVncyBhZGRyZXNzIDB4JTA4eFxuIiwgYmFzZSk7CisJCWdvaGNpLnJlZ3MgPSAoc3RydWN0IG9oY2lfcmVncyAqKWJhc2U7CisJfSBlbHNlCisJCXJldHVybiAtMTsKKyNlbHNlCisJZ29oY2kucmVncyA9IChzdHJ1Y3Qgb2hjaV9yZWdzICopQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRTsKKyNlbmRpZgorCisJZ29oY2kuZmxhZ3MgPSAwOworCWdvaGNpLnNsb3RfbmFtZSA9IENGR19VU0JfT0hDSV9TTE9UX05BTUU7CisKKwlpZiAoaGNfcmVzZXQgKCZnb2hjaSkgPCAwKSB7CisJCWhjX3JlbGVhc2Vfb2hjaSAoJmdvaGNpKTsKKwkJZXJyICgiY2FuJ3QgcmVzZXQgdXNiLSVzIiwgZ29oY2kuc2xvdF9uYW1lKTsKKyNpZmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorCQkvKiBib2FyZCBkZXBlbmRhbnQgY2xlYW51cCAqLworCQl1c2JfYm9hcmRfaW5pdF9mYWlsKCk7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9DUFVfSU5JVAorCQkvKiBjcHUgZGVwZW5kYW50IGNsZWFudXAgKi8KKwkJdXNiX2NwdV9pbml0X2ZhaWwoKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogRklYTUUgdGhpcyBpcyBhIHNlY29uZCBIQyByZXNldDsgd2h5Pz8gKi8KKwkvKiB3cml0ZWwoZ29oY2kuaGNfY29udHJvbCA9IE9IQ0lfVVNCX1JFU0VULCAmZ29oY2kucmVncy0+Y29udHJvbCk7CisJICAgd2FpdF9tcygxMCk7ICovCisJaWYgKGhjX3N0YXJ0ICgmZ29oY2kpIDwgMCkgeworCQllcnIgKCJjYW4ndCBzdGFydCB1c2ItJXMiLCBnb2hjaS5zbG90X25hbWUpOworCQloY19yZWxlYXNlX29oY2kgKCZnb2hjaSk7CisJCS8qIEluaXRpYWxpemF0aW9uIGZhaWxlZCAqLworI2lmZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisJCS8qIGJvYXJkIGRlcGVuZGFudCBjbGVhbnVwICovCisJCXVzYl9ib2FyZF9zdG9wKCk7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9DUFVfSU5JVAorCQkvKiBjcHUgZGVwZW5kYW50IGNsZWFudXAgKi8KKwkJdXNiX2NwdV9zdG9wKCk7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmCURFQlVHCisJb2hjaV9kdW1wICgmZ29oY2ksIDEpOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisJb2hjaV9pbml0ZWQgPSAxOworCXJldHVybiAwOworfQorCitpbnQgdXNiX2xvd2xldmVsX3N0b3Aodm9pZCkKK3sKKwkvKiB0aGlzIGdldHMgY2FsbGVkIHJlYWxseSBlYXJseSAtIGJlZm9yZSB0aGUgY29udHJvbGxlciBoYXMgKi8KKwkvKiBldmVuIGJlZW4gaW5pdGlhbGl6ZWQhICovCisJaWYgKCFvaGNpX2luaXRlZCkKKwkJcmV0dXJuIDA7CisJLyogVE9ETyByZWxlYXNlIGFueSBpbnRlcnJ1cHRzLCBldGMuICovCisJLyogY2FsbCBoY19yZWxlYXNlX29oY2koKSBoZXJlID8gKi8KKwloY19yZXNldCAoJmdvaGNpKTsKKworI2lmZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisJLyogYm9hcmQgZGVwZW5kYW50IGNsZWFudXAgKi8KKwlpZih1c2JfYm9hcmRfc3RvcCgpKQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9DUFVfSU5JVAorCS8qIGNwdSBkZXBlbmRhbnQgY2xlYW51cCAqLworCWlmKHVzYl9jcHVfc3RvcCgpKQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19VU0JfT0hDSV9ORVcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiX29oY2kuaCBiL2RyaXZlcnMvdXNiX29oY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBjYjRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Jfb2hjaS5oCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogVVJCIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+CisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMSBEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiB1c2Itb2hjaS5oCisgKi8KKworLyogZnVuY3Rpb25zIGZvciBkb2luZyBib2FyZCBvciBDUFUgc3BlY2lmaWMgc2V0dXAvY2xlYW51cCAqLworZXh0ZXJuIGludCB1c2JfYm9hcmRfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdXNiX2JvYXJkX3N0b3Aodm9pZCk7CitleHRlcm4gaW50IHVzYl9ib2FyZF9pbml0X2ZhaWwodm9pZCk7CisKK2V4dGVybiBpbnQgdXNiX2NwdV9pbml0KHZvaWQpOworZXh0ZXJuIGludCB1c2JfY3B1X3N0b3Aodm9pZCk7CitleHRlcm4gaW50IHVzYl9jcHVfaW5pdF9mYWlsKHZvaWQpOworCisKK3N0YXRpYyBpbnQgY2NfdG9fZXJyb3JbMTZdID0geworCisvKiBtYXBwaW5nIG9mIHRoZSBPSENJIENDIHN0YXR1cyB0byBlcnJvciBjb2RlcyAqLworCS8qIE5vICBFcnJvciAgKi8JICAgICAgIDAsCisJLyogQ1JDIEVycm9yICAqLwkgICAgICAgVVNCX1NUX0NSQ19FUlIsCisJLyogQml0IFN0dWZmICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCisJLyogRGF0YSBUb2dnICAqLwkgICAgICAgVVNCX1NUX0NSQ19FUlIsCisJLyogU3RhbGwgICAgICAqLwkgICAgICAgVVNCX1NUX1NUQUxMRUQsCisJLyogRGV2Tm90UmVzcCAqLwkgICAgICAgLTEsCisJLyogUElEQ2hlY2sgICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCisJLyogVW5FeHBQSUQgICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCisJLyogRGF0YU92ZXIgICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCisJLyogRGF0YVVuZGVyICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCisJLyogcmVzZXJ2ZCAgICAqLwkgICAgICAgLTEsCisJLyogcmVzZXJ2ZCAgICAqLwkgICAgICAgLTEsCisJLyogQnVmZmVyT3ZlciAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCisJLyogQnVmZlVuZGVyICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCisJLyogTm90IEFjY2VzcyAqLwkgICAgICAgLTEsCisJLyogTm90IEFjY2VzcyAqLwkgICAgICAgLTEKK307CisKKy8qIEVEIFN0YXRlcyAqLworCisjZGVmaW5lIEVEX05FVwkJMHgwMAorI2RlZmluZSBFRF9VTkxJTksJMHgwMQorI2RlZmluZSBFRF9PUEVSCQkweDAyCisjZGVmaW5lIEVEX0RFTAkJMHgwNAorI2RlZmluZSBFRF9VUkJfREVMCTB4MDgKKworLyogdXNiX29oY2lfZWQgKi8KK3N0cnVjdCBlZCB7CisJX191MzIgaHdJTkZPOworCV9fdTMyIGh3VGFpbFA7CisJX191MzIgaHdIZWFkUDsKKwlfX3UzMiBod05leHRFRDsKKworCXN0cnVjdCBlZCAqZWRfcHJldjsKKwlfX3U4IGludF9wZXJpb2Q7CisJX191OCBpbnRfYnJhbmNoOworCV9fdTggaW50X2xvYWQ7CisJX191OCBpbnRfaW50ZXJ2YWw7CisJX191OCBzdGF0ZTsKKwlfX3U4IHR5cGU7CisJX191MTYgbGFzdF9pc287CisJc3RydWN0IGVkICplZF9ybV9saXN0OworCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CisJdm9pZCAqcHVyYjsKKwlfX3UzMiB1bnVzZWRbMl07Cit9IF9fYXR0cmlidXRlKChhbGlnbmVkKDE2KSkpOwordHlwZWRlZiBzdHJ1Y3QgZWQgZWRfdDsKKworCisvKiBURCBpbmZvIGZpZWxkICovCisjZGVmaW5lIFREX0NDCSAgICAweGYwMDAwMDAwCisjZGVmaW5lIFREX0NDX0dFVCh0ZF9wKSAoKHRkX3AgPj4yOCkgJiAweDBmKQorI2RlZmluZSBURF9DQ19TRVQodGRfcCwgY2MpICh0ZF9wKSA9ICgodGRfcCkgJiAweDBmZmZmZmZmKSB8ICgoKGNjKSAmIDB4MGYpIDw8IDI4KQorI2RlZmluZSBURF9FQwkgICAgMHgwQzAwMDAwMAorI2RlZmluZSBURF9UCSAgICAweDAzMDAwMDAwCisjZGVmaW5lIFREX1RfREFUQTAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgVERfVF9EQVRBMSAgMHgwMzAwMDAwMAorI2RlZmluZSBURF9UX1RPR0dMRSAweDAwMDAwMDAwCisjZGVmaW5lIFREX1IJICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgVERfREkJICAgIDB4MDBFMDAwMDAKKyNkZWZpbmUgVERfRElfU0VUKFgpICgoKFgpICYgMHgwNyk8PCAyMSkKKyNkZWZpbmUgVERfRFAJICAgIDB4MDAxODAwMDAKKyNkZWZpbmUgVERfRFBfU0VUVVAgMHgwMDAwMDAwMAorI2RlZmluZSBURF9EUF9JTiAgICAweDAwMTAwMDAwCisjZGVmaW5lIFREX0RQX09VVCAgIDB4MDAwODAwMDAKKworI2RlZmluZSBURF9JU08JICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgVERfREVMCSAgICAweDAwMDIwMDAwCisKKy8qIENDIENvZGVzICovCisjZGVmaW5lIFREX0NDX05PRVJST1IJICAgMHgwMAorI2RlZmluZSBURF9DQ19DUkMJICAgMHgwMQorI2RlZmluZSBURF9DQ19CSVRTVFVGRklORyAgMHgwMgorI2RlZmluZSBURF9DQ19EQVRBVE9HR0xFTSAgMHgwMworI2RlZmluZSBURF9DQ19TVEFMTAkgICAweDA0CisjZGVmaW5lIFREX0RFVk5PVFJFU1AJICAgMHgwNQorI2RlZmluZSBURF9QSURDSEVDS0ZBSUwJICAgMHgwNgorI2RlZmluZSBURF9VTkVYUEVDVEVEUElEICAgMHgwNworI2RlZmluZSBURF9EQVRBT1ZFUlJVTgkgICAweDA4CisjZGVmaW5lIFREX0RBVEFVTkRFUlJVTgkgICAweDA5CisjZGVmaW5lIFREX0JVRkZFUk9WRVJSVU4gICAweDBDCisjZGVmaW5lIFREX0JVRkZFUlVOREVSUlVOICAweDBECisjZGVmaW5lIFREX05PVEFDQ0VTU0VECSAgIDB4MEYKKworCisjZGVmaW5lIE1BWFBTVyAxCisKK3N0cnVjdCB0ZCB7CisJX191MzIgaHdJTkZPOworCV9fdTMyIGh3Q0JQOwkJLyogQ3VycmVudCBCdWZmZXIgUG9pbnRlciAqLworCV9fdTMyIGh3TmV4dFREOwkJLyogTmV4dCBURCBQb2ludGVyICovCisJX191MzIgaHdCRTsJCS8qIE1lbW9yeSBCdWZmZXIgRW5kIFBvaW50ZXIgKi8KKworLyogI2lmbmRlZiBDT05GSUdfTVBDNTIwMCAvXCogdGhpcyBzZWVtcyB3cm9uZyAqXC8gKi8KKwlfX3UxNiBod1BTV1tNQVhQU1ddOworLyogI2VuZGlmICovCisJX191OCB1bnVzZWQ7CisJX191OCBpbmRleDsKKwlzdHJ1Y3QgZWQgKmVkOworCXN0cnVjdCB0ZCAqbmV4dF9kbF90ZDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlpbnQgdHJhbnNmZXJfbGVuOworCV9fdTMyIGRhdGE7CisKKwlfX3UzMiB1bnVzZWQyWzJdOworfSBfX2F0dHJpYnV0ZSgoYWxpZ25lZCgzMikpKTsKK3R5cGVkZWYgc3RydWN0IHRkIHRkX3Q7CisKKyNkZWZpbmUgT0hDSV9FRF9TS0lQCSgxIDw8IDE0KQorCisvKgorICogVGhlIEhDQ0EgKEhvc3QgQ29udHJvbGxlciBDb21tdW5pY2F0aW9ucyBBcmVhKSBpcyBhIDI1NiBieXRlCisgKiBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGUgT0hDSSBzcGVjLiB0aGF0IHRoZSBob3N0IGNvbnRyb2xsZXIgaXMKKyAqIHRvbGQgdGhlIGJhc2UgYWRkcmVzcyBvZi4gIEl0IG11c3QgYmUgMjU2LWJ5dGUgYWxpZ25lZC4KKyAqLworCisjZGVmaW5lIE5VTV9JTlRTIDMyCS8qIHBhcnQgb2YgdGhlIE9IQ0kgc3RhbmRhcmQgKi8KK3N0cnVjdCBvaGNpX2hjY2EgeworCV9fdTMyCWludF90YWJsZVtOVU1fSU5UU107CS8qIEludGVycnVwdCBFRCB0YWJsZSAqLworI2lmIGRlZmluZWQoQ09ORklHX01QQzUyMDApCisJX191MTYJcGFkMTsJCQkvKiBzZXQgdG8gMCBvbiBlYWNoIGZyYW1lX25vIGNoYW5nZSAqLworCV9fdTE2CWZyYW1lX25vOwkJLyogY3VycmVudCBmcmFtZSBudW1iZXIgKi8KKyNlbHNlCisJX191MTYJZnJhbWVfbm87CQkvKiBjdXJyZW50IGZyYW1lIG51bWJlciAqLworCV9fdTE2CXBhZDE7CQkJLyogc2V0IHRvIDAgb24gZWFjaCBmcmFtZV9ubyBjaGFuZ2UgKi8KKyNlbmRpZgorCV9fdTMyCWRvbmVfaGVhZDsJCS8qIGluZm8gcmV0dXJuZWQgZm9yIGFuIGludGVycnVwdCAqLworCXU4CQlyZXNlcnZlZF9mb3JfaGNbMTE2XTsKK30gX19hdHRyaWJ1dGUoKGFsaWduZWQoMjU2KSkpOworCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiByb290IGh1YiBwb3J0cy4KKyAqLworI2lmbmRlZiBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMKKyMgZXJyb3IgIkNGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUyB1bmRlZmluZWQhIgorI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE9IQ0kgY29udHJvbGxlcidzIG1lbW9yeSBtYXBwZWQgSS9PCisgKiByZWdpb24uICBUaGlzIGlzIE1lbW9yeSBNYXBwZWQgSS9PLglZb3UgbXVzdCB1c2UgdGhlIHJlYWRsKCkgYW5kCisgKiB3cml0ZWwoKSBtYWNyb3MgZGVmaW5lZCBpbiBhc20vaW8uaCB0byBhY2Nlc3MgdGhlc2UhIQorICovCitzdHJ1Y3Qgb2hjaV9yZWdzIHsKKwkvKiBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCisJX191MzIJcmV2aXNpb247CisJX191MzIJY29udHJvbDsKKwlfX3UzMgljbWRzdGF0dXM7CisJX191MzIJaW50cnN0YXR1czsKKwlfX3UzMglpbnRyZW5hYmxlOworCV9fdTMyCWludHJkaXNhYmxlOworCS8qIG1lbW9yeSBwb2ludGVycyAqLworCV9fdTMyCWhjY2E7CisJX191MzIJZWRfcGVyaW9kY3VycmVudDsKKwlfX3UzMgllZF9jb250cm9saGVhZDsKKwlfX3UzMgllZF9jb250cm9sY3VycmVudDsKKwlfX3UzMgllZF9idWxraGVhZDsKKwlfX3UzMgllZF9idWxrY3VycmVudDsKKwlfX3UzMglkb25laGVhZDsKKwkvKiBmcmFtZSBjb3VudGVycyAqLworCV9fdTMyCWZtaW50ZXJ2YWw7CisJX191MzIJZm1yZW1haW5pbmc7CisJX191MzIJZm1udW1iZXI7CisJX191MzIJcGVyaW9kaWNzdGFydDsKKwlfX3UzMglsc3RocmVzaDsKKwkvKiBSb290IGh1YiBwb3J0cyAqLworCXN0cnVjdAlvaGNpX3Jvb3RodWJfcmVncyB7CisJCV9fdTMyCWE7CisJCV9fdTMyCWI7CisJCV9fdTMyCXN0YXR1czsKKwkJX191MzIJcG9ydHN0YXR1c1tDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFNdOworCX0gcm9vdGh1YjsKK30gX19hdHRyaWJ1dGUoKGFsaWduZWQoMzIpKSk7CisKKworLyogT0hDSSBDT05UUk9MIEFORCBTVEFUVVMgUkVHSVNURVIgTUFTS1MgKi8KKworLyoKKyAqIEhjQ29udHJvbCAoY29udHJvbCkgcmVnaXN0ZXIgbWFza3MKKyAqLworI2RlZmluZSBPSENJX0NUUkxfQ0JTUgkoMyA8PCAwKQkvKiBjb250cm9sL2J1bGsgc2VydmljZSByYXRpbyAqLworI2RlZmluZSBPSENJX0NUUkxfUExFCSgxIDw8IDIpCS8qIHBlcmlvZGljIGxpc3QgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9JRQkoMSA8PCAzKQkvKiBpc29jaHJvbm91cyBlbmFibGUgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX0NMRQkoMSA8PCA0KQkvKiBjb250cm9sIGxpc3QgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9CTEUJKDEgPDwgNSkJLyogYnVsayBsaXN0IGVuYWJsZSAqLworI2RlZmluZSBPSENJX0NUUkxfSENGUwkoMyA8PCA2KQkvKiBob3N0IGNvbnRyb2xsZXIgZnVuY3Rpb25hbCBzdGF0ZSAqLworI2RlZmluZSBPSENJX0NUUkxfSVIJKDEgPDwgOCkJLyogaW50ZXJydXB0IHJvdXRpbmcgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX1JXQwkoMSA8PCA5KQkvKiByZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAqLworI2RlZmluZSBPSENJX0NUUkxfUldFCSgxIDw8IDEwKQkvKiByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLworCisvKiBwcmUtc2hpZnRlZCB2YWx1ZXMgZm9yIEhDRlMgKi8KKyMJZGVmaW5lIE9IQ0lfVVNCX1JFU0VUCSgwIDw8IDYpCisjCWRlZmluZSBPSENJX1VTQl9SRVNVTUUJKDEgPDwgNikKKyMJZGVmaW5lIE9IQ0lfVVNCX09QRVIJKDIgPDwgNikKKyMJZGVmaW5lIE9IQ0lfVVNCX1NVU1BFTkQgKDMgPDwgNikKKworLyoKKyAqIEhjQ29tbWFuZFN0YXR1cyAoY21kc3RhdHVzKSByZWdpc3RlciBtYXNrcworICovCisjZGVmaW5lIE9IQ0lfSENSCSgxIDw8IDApCS8qIGhvc3QgY29udHJvbGxlciByZXNldCAqLworI2RlZmluZSBPSENJX0NMRgkoMSA8PCAxKQkvKiBjb250cm9sIGxpc3QgZmlsbGVkICovCisjZGVmaW5lIE9IQ0lfQkxGCSgxIDw8IDIpCS8qIGJ1bGsgbGlzdCBmaWxsZWQgKi8KKyNkZWZpbmUgT0hDSV9PQ1IJKDEgPDwgMykJLyogb3duZXJzaGlwIGNoYW5nZSByZXF1ZXN0ICovCisjZGVmaW5lIE9IQ0lfU09DCSgzIDw8IDE2KQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gY291bnQgKi8KKworLyoKKyAqIG1hc2tzIHVzZWQgd2l0aCBpbnRlcnJ1cHQgcmVnaXN0ZXJzOgorICogSGNJbnRlcnJ1cHRTdGF0dXMgKGludHJzdGF0dXMpCisgKiBIY0ludGVycnVwdEVuYWJsZSAoaW50cmVuYWJsZSkKKyAqIEhjSW50ZXJydXB0RGlzYWJsZSAoaW50cmRpc2FibGUpCisgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1NPCSgxIDw8IDApCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biAqLworI2RlZmluZSBPSENJX0lOVFJfV0RICSgxIDw8IDEpCS8qIHdyaXRlYmFjayBvZiBkb25lX2hlYWQgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1NGCSgxIDw8IDIpCS8qIHN0YXJ0IGZyYW1lICovCisjZGVmaW5lIE9IQ0lfSU5UUl9SRAkoMSA8PCAzKQkvKiByZXN1bWUgZGV0ZWN0ICovCisjZGVmaW5lIE9IQ0lfSU5UUl9VRQkoMSA8PCA0KQkvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCisjZGVmaW5lIE9IQ0lfSU5UUl9GTk8JKDEgPDwgNSkJLyogZnJhbWUgbnVtYmVyIG92ZXJmbG93ICovCisjZGVmaW5lIE9IQ0lfSU5UUl9SSFNDCSgxIDw8IDYpCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX09DCSgxIDw8IDMwKQkvKiBvd25lcnNoaXAgY2hhbmdlICovCisjZGVmaW5lIE9IQ0lfSU5UUl9NSUUJKDEgPDwgMzEpCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisKKworLyogVmlydHVhbCBSb290IEhVQiAqLworc3RydWN0IHZpcnRfcm9vdF9odWIgeworCWludCBkZXZudW07IC8qIEFkZHJlc3Mgb2YgUm9vdCBIdWIgZW5kcG9pbnQgKi8KKwl2b2lkICpkZXY7ICAvKiB3YXMgdXJiICovCisJdm9pZCAqaW50X2FkZHI7CisJaW50IHNlbmQ7CisJaW50IGludGVydmFsOworfTsKKworLyogVVNCIEhVQiBDT05TVEFOVFMgKG5vdCBPSENJLXNwZWNpZmljOyBzZWUgaHViLmgpICovCisKKy8qIGRlc3RpbmF0aW9uIG9mIHJlcXVlc3QgKi8KKyNkZWZpbmUgUkhfSU5URVJGQUNFCQkgICAweDAxCisjZGVmaW5lIFJIX0VORFBPSU5UCQkgICAweDAyCisjZGVmaW5lIFJIX09USEVSCQkgICAweDAzCisKKyNkZWZpbmUgUkhfQ0xBU1MJCSAgIDB4MjAKKyNkZWZpbmUgUkhfVkVORE9SCQkgICAweDQwCisKKy8qIFJlcXVlc3RzOiBiUmVxdWVzdCA8PCA4IHwgYm1SZXF1ZXN0VHlwZSAqLworI2RlZmluZSBSSF9HRVRfU1RBVFVTCQkweDAwODAKKyNkZWZpbmUgUkhfQ0xFQVJfRkVBVFVSRQkweDAxMDAKKyNkZWZpbmUgUkhfU0VUX0ZFQVRVUkUJCTB4MDMwMAorI2RlZmluZSBSSF9TRVRfQUREUkVTUwkJMHgwNTAwCisjZGVmaW5lIFJIX0dFVF9ERVNDUklQVE9SCTB4MDY4MAorI2RlZmluZSBSSF9TRVRfREVTQ1JJUFRPUgkweDA3MDAKKyNkZWZpbmUgUkhfR0VUX0NPTkZJR1VSQVRJT04JMHgwODgwCisjZGVmaW5lIFJIX1NFVF9DT05GSUdVUkFUSU9OCTB4MDkwMAorI2RlZmluZSBSSF9HRVRfU1RBVEUJCTB4MDI4MAorI2RlZmluZSBSSF9HRVRfSU5URVJGQUNFCTB4MEE4MAorI2RlZmluZSBSSF9TRVRfSU5URVJGQUNFCTB4MEIwMAorI2RlZmluZSBSSF9TWU5DX0ZSQU1FCQkweDBDODAKKy8qIE91ciBWZW5kb3IgU3BlY2lmaWMgUmVxdWVzdCAqLworI2RlZmluZSBSSF9TRVRfRVAJCTB4MjAwMAorCisKKy8qIEh1YiBwb3J0IGZlYXR1cmVzICovCisjZGVmaW5lIFJIX1BPUlRfQ09OTkVDVElPTgkgICAweDAwCisjZGVmaW5lIFJIX1BPUlRfRU5BQkxFCQkgICAweDAxCisjZGVmaW5lIFJIX1BPUlRfU1VTUEVORAkJICAgMHgwMgorI2RlZmluZSBSSF9QT1JUX09WRVJfQ1VSUkVOVAkgICAweDAzCisjZGVmaW5lIFJIX1BPUlRfUkVTRVQJCSAgIDB4MDQKKyNkZWZpbmUgUkhfUE9SVF9QT1dFUgkJICAgMHgwOAorI2RlZmluZSBSSF9QT1JUX0xPV19TUEVFRAkgICAweDA5CisKKyNkZWZpbmUgUkhfQ19QT1JUX0NPTk5FQ1RJT04JICAgMHgxMAorI2RlZmluZSBSSF9DX1BPUlRfRU5BQkxFCSAgIDB4MTEKKyNkZWZpbmUgUkhfQ19QT1JUX1NVU1BFTkQJICAgMHgxMgorI2RlZmluZSBSSF9DX1BPUlRfT1ZFUl9DVVJSRU5UCSAgIDB4MTMKKyNkZWZpbmUgUkhfQ19QT1JUX1JFU0VUCQkgICAweDE0CisKKy8qIEh1YiBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9DX0hVQl9MT0NBTF9QT1dFUgkgICAweDAwCisjZGVmaW5lIFJIX0NfSFVCX09WRVJfQ1VSUkVOVAkgICAweDAxCisKKyNkZWZpbmUgUkhfREVWSUNFX1JFTU9URV9XQUtFVVAJICAgMHgwMAorI2RlZmluZSBSSF9FTkRQT0lOVF9TVEFMTAkgICAweDAxCisKKyNkZWZpbmUgUkhfQUNLCQkJICAgMHgwMQorI2RlZmluZSBSSF9SRVFfRVJSCQkgICAtMQorI2RlZmluZSBSSF9OQUNLCQkJICAgMHgwMAorCisKKy8qIE9IQ0kgUk9PVCBIVUIgUkVHSVNURVIgTUFTS1MgKi8KKworLyogcm9vdGh1Yi5wb3J0c3RhdHVzIFtpXSBiaXRzICovCisjZGVmaW5lIFJIX1BTX0NDUwkgICAgIDB4MDAwMDAwMDEJCS8qIGN1cnJlbnQgY29ubmVjdCBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfUFNfUEVTCSAgICAgMHgwMDAwMDAwMgkJLyogcG9ydCBlbmFibGUgc3RhdHVzKi8KKyNkZWZpbmUgUkhfUFNfUFNTCSAgICAgMHgwMDAwMDAwNAkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyAqLworI2RlZmluZSBSSF9QU19QT0NJCSAgICAgMHgwMDAwMDAwOAkJLyogcG9ydCBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yICovCisjZGVmaW5lIFJIX1BTX1BSUwkgICAgIDB4MDAwMDAwMTAJCS8qIHBvcnQgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX1BQUwkgICAgIDB4MDAwMDAxMDAJCS8qIHBvcnQgcG93ZXIgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX0xTREEJICAgICAweDAwMDAwMjAwCQkvKiBsb3cgc3BlZWQgZGV2aWNlIGF0dGFjaGVkICovCisjZGVmaW5lIFJIX1BTX0NTQwkgICAgIDB4MDAwMTAwMDAJCS8qIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9QU19QRVNDCSAgICAgMHgwMDAyMDAwMAkJLyogcG9ydCBlbmFibGUgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9QU19QU1NDCSAgICAgMHgwMDA0MDAwMAkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgUkhfUFNfT0NJQwkgICAgIDB4MDAwODAwMDAJCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgY2hhbmdlICovCisjZGVmaW5lIFJIX1BTX1BSU0MJICAgICAweDAwMTAwMDAwCQkvKiBwb3J0IHJlc2V0IHN0YXR1cyBjaGFuZ2UgKi8KKworLyogcm9vdGh1Yi5zdGF0dXMgYml0cyAqLworI2RlZmluZSBSSF9IU19MUFMJICAgICAweDAwMDAwMDAxCQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfSFNfT0NJCSAgICAgMHgwMDAwMDAwMgkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciAqLworI2RlZmluZSBSSF9IU19EUldFCSAgICAgMHgwMDAwODAwMAkJLyogZGV2aWNlIHJlbW90ZSB3YWtldXAgZW5hYmxlICovCisjZGVmaW5lIFJIX0hTX0xQU0MJICAgICAweDAwMDEwMDAwCQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lIFJIX0hTX09DSUMJICAgICAweDAwMDIwMDAwCQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZSAqLworI2RlZmluZSBSSF9IU19DUldFCSAgICAgMHg4MDAwMDAwMAkJLyogY2xlYXIgcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KKworLyogcm9vdGh1Yi5iIG1hc2tzICovCisjZGVmaW5lIFJIX0JfRFIJCTB4MDAwMGZmZmYJCS8qIGRldmljZSByZW1vdmFibGUgZmxhZ3MgKi8KKyNkZWZpbmUgUkhfQl9QUENNCTB4ZmZmZjAwMDAJCS8qIHBvcnQgcG93ZXIgY29udHJvbCBtYXNrICovCisKKy8qIHJvb3RodWIuYSBtYXNrcyAqLworI2RlZmluZSBSSF9BX05EUAkoMHhmZiA8PCAwKQkJLyogbnVtYmVyIG9mIGRvd25zdHJlYW0gcG9ydHMgKi8KKyNkZWZpbmUgUkhfQV9QU00JKDEgPDwgOCkJCS8qIHBvd2VyIHN3aXRjaGluZyBtb2RlICovCisjZGVmaW5lIFJIX0FfTlBTCSgxIDw8IDkpCQkvKiBubyBwb3dlciBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgUkhfQV9EVAkJKDEgPDwgMTApCQkvKiBkZXZpY2UgdHlwZSAobWJ6KSAqLworI2RlZmluZSBSSF9BX09DUE0JKDEgPDwgMTEpCQkvKiBvdmVyIGN1cnJlbnQgcHJvdGVjdGlvbiBtb2RlICovCisjZGVmaW5lIFJIX0FfTk9DUAkoMSA8PCAxMikJCS8qIG5vIG92ZXIgY3VycmVudCBwcm90ZWN0aW9uICovCisjZGVmaW5lIFJIX0FfUE9UUEdUCSgweGZmIDw8IDI0KQkJLyogcG93ZXIgb24gdG8gcG93ZXIgZ29vZCB0aW1lICovCisKKy8qIHVyYiAqLworI2RlZmluZSBOX1VSQl9URCA0OAordHlwZWRlZiBzdHJ1Y3QKK3sKKwllZF90ICplZDsKKwlfX3UxNiBsZW5ndGg7CS8qIG51bWJlciBvZiB0ZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCAqLworCV9fdTE2IHRkX2NudDsJLyogbnVtYmVyIG9mIHRkcyBhbHJlYWR5IHNlcnZpY2VkICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlpbnQgICBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHBpcGU7CisJdm9pZCAqdHJhbnNmZXJfYnVmZmVyOworCWludCB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCWludCBpbnRlcnZhbDsKKwlpbnQgYWN0dWFsX2xlbmd0aDsKKwlpbnQgZmluaXNoZWQ7CisJdGRfdCAqdGRbTl9VUkJfVERdOwkvKiBsaXN0IHBvaW50ZXIgdG8gYWxsIGNvcnJlc3BvbmRpbmcgVERzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgKi8KK30gdXJiX3ByaXZfdDsKKyNkZWZpbmUgVVJCX0RFTCAxCisKKy8qCisgKiBUaGlzIGlzIHRoZSBmdWxsIG9oY2kgY29udHJvbGxlciBkZXNjcmlwdGlvbgorICoKKyAqIE5vdGUgaG93IHRoZSAicHJvcGVyIiBVU0IgaW5mb3JtYXRpb24gaXMganVzdAorICogYSBzdWJzZXQgb2Ygd2hhdCB0aGUgZnVsbCBpbXBsZW1lbnRhdGlvbiBuZWVkcy4gKExpbnVzKQorICovCisKKwordHlwZWRlZiBzdHJ1Y3Qgb2hjaSB7CisJc3RydWN0IG9oY2lfaGNjYSAqaGNjYTsJCS8qIGhjY2EgKi8KKwkvKmRtYV9hZGRyX3QgaGNjYV9kbWE7Ki8KKworCWludCBpcnE7CisJaW50IGRpc2FibGVkOwkJCS8qIGUuZy4gZ290IGEgVUUsIHdlJ3JlIGh1bmcgKi8KKwlpbnQgc2xlZXBpbmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIGZvciBIQyBidWdzICovCisKKwlzdHJ1Y3Qgb2hjaV9yZWdzICpyZWdzOyAvKiBPSENJIGNvbnRyb2xsZXIncyBtZW1vcnkgKi8KKworCWludCBvaGNpX2ludF9sb2FkWzMyXTsJIC8qIGxvYWQgb2YgdGhlIDMyIEludGVycnVwdCBDaGFpbnMgKGZvciBsb2FkIGJhbGFuY2luZykqLworCWVkX3QgKmVkX3JtX2xpc3RbMl07CSAvKiBsaXN0cyBvZiBhbGwgZW5kcG9pbnRzIHRvIGJlIHJlbW92ZWQgKi8KKwllZF90ICplZF9idWxrdGFpbDsJIC8qIGxhc3QgZW5kcG9pbnQgb2YgYnVsayBsaXN0ICovCisJZWRfdCAqZWRfY29udHJvbHRhaWw7CSAvKiBsYXN0IGVuZHBvaW50IG9mIGNvbnRyb2wgbGlzdCAqLworCWludCBpbnRyc3RhdHVzOworCV9fdTMyIGhjX2NvbnRyb2w7CQkvKiBjb3B5IG9mIHRoZSBoYyBjb250cm9sIHJlZyAqLworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZbMzJdOworCXN0cnVjdCB2aXJ0X3Jvb3RfaHViIHJoOworCisJY29uc3QgY2hhcgkqc2xvdF9uYW1lOworfSBvaGNpX3Q7CisKKyNkZWZpbmUgTlVNX0VEUyA4CQkvKiBudW0gb2YgcHJlYWxsb2NhdGVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisKK3N0cnVjdCBvaGNpX2RldmljZSB7CisJZWRfdAllZFtOVU1fRURTXTsKKwlpbnQgZWRfY250OworfTsKKworLyogaGNkICovCisvKiBlbmRwb2ludCAqLworc3RhdGljIGludCBlcF9saW5rKG9oY2lfdCAqIG9oY2ksIGVkX3QgKiBlZCk7CitzdGF0aWMgaW50IGVwX3VubGluayhvaGNpX3QgKiBvaGNpLCBlZF90ICogZWQpOworc3RhdGljIGVkX3QgKiBlcF9hZGRfZWQoc3RydWN0IHVzYl9kZXZpY2UgKiB1c2JfZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCWludCBpbnRlcnZhbCwgaW50IGxvYWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB3ZSBuZWVkIG1vcmUgVERzIHRoYW4gRURzICovCisjZGVmaW5lIE5VTV9URCA2NAorCisvKiArMSBzbyB3ZSBjYW4gYWxpZ24gdGhlIHN0b3JhZ2UgKi8KK3RkX3QgZ3RkW05VTV9URCsxXTsKKy8qIHBvaW50ZXJzIHRvIGFsaWduZWQgc3RvcmFnZSAqLwordGRfdCAqcHRkOworCisvKiBURHMgLi4uICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZCAqCit0ZF9hbGxvYyAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCit7CisJaW50IGk7CisJc3RydWN0IHRkCSp0ZDsKKworCXRkID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1REOyBpKyspCisJeworCQlpZiAocHRkW2ldLnVzYl9kZXYgPT0gTlVMTCkKKwkJeworCQkJdGQgPSAmcHRkW2ldOworCQkJdGQtPnVzYl9kZXYgPSB1c2JfZGV2OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gdGQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZWRfZnJlZSAoc3RydWN0IGVkICplZCkKK3sKKwllZC0+dXNiX2RldiA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYmRjb3JlX2VwMC5jIGIvZHJpdmVycy91c2JkY29yZV9lcDAuYwppbmRleCAyNjBiZWZlLi4xZTQ0ZjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYmRjb3JlX2VwMC5jCisrKyBiL2RyaXZlcnMvdXNiZGNvcmVfZXAwLmMKQEAgLTIsNiArMiw5IEBACiAgKiAoQykgQ29weXJpZ2h0IDIwMDMKICAqIEdlcnJ5IEhhbWVsLCBnZWhAdGkuY29tLCBUZXhhcyBJbnN0cnVtZW50cwogICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogQnJ5YW4gTydEb25vZ2h1ZSwgZGVja2FyZEBDb2RlSGVybWl0LmllCisgKgogICogQmFzZWQgb24KICAqIGxpbnV4L2RyaXZlcnMvdXNiZC9lcDAuYwogICoKQEAgLTM5LDExICs0MiwxNyBAQAogICogZnVuY3Rpb24gZHJpdmVyLiBUaGlzIG1heSBuZWVkIHRvIGNoYW5nZS4KICAqCiAgKiBYWFgKKyAqCisgKiBBcyBhbGx1ZGVkIHRvIGFib3ZlLCBhIHNpbXBsZSBjYWxsYmFjayBjZGNfcmVjdl9zZXR1cCBoYXMgYmVlbiBpbXBsZW1lbnRlZAorICogaW4gdGhlIHVzYl9kZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgdG8gZmFjaWxpY2F0ZSBwYXNzaW5nCisgKiBDb21tb24gRGV2aWNlIENsYXNzIHBhY2tldHMgdG8gYSBmdW5jdGlvbiBkcml2ZXIuCisgKgorICogWFhYCiAgKi8KIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfT01BUDE1MTApICYmIGRlZmluZWQoQ09ORklHX1VTQl9ERVZJQ0UpCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0RFVklDRSkKICNpbmNsdWRlICJ1c2JkY29yZS5oIgogCiAjaWYgMApAQCAtNjksNyArNzgsNyBAQAogCWNoYXIgKmNwOwogCiAJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMjsKLQljcCA9IHVyYi0+YnVmZmVyOworCWNwID0gKGNoYXIqKXVyYi0+YnVmZmVyOwogCWNwWzBdID0gY3BbMV0gPSAwOwogCiAJc3dpdGNoIChyZXF1ZXN0dHlwZSkgewpAQCAtMTE1LDcgKzEyNCw3IEBACiAgKgogICogQ29weSBjb25maWd1cmF0aW9uIGRhdGEgdG8gdXJiIHRyYW5zZmVyIGJ1ZmZlciBpZiB0aGVyZSBpcyByb29tIGZvciBpdC4KICAqLwotc3RhdGljIHZvaWQgY29weV9jb25maWcgKHN0cnVjdCB1cmIgKnVyYiwgdm9pZCAqZGF0YSwgaW50IG1heF9sZW5ndGgsCit2b2lkIGNvcHlfY29uZmlnIChzdHJ1Y3QgdXJiICp1cmIsIHZvaWQgKmRhdGEsIGludCBtYXhfbGVuZ3RoLAogCQkJIGludCBtYXhfYnVmKQogewogCWludCBhdmFpbGFibGU7CkBAIC0xMjgsMTAgKzEzNyw3IEBACiAJCWRiZ19lcDAgKDEsICJkYXRhIGlzIE5VTEwiKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoIShsZW5ndGggPSAqKHVuc2lnbmVkIGNoYXIgKikgZGF0YSkpIHsKLQkJZGJnX2VwMCAoMSwgImxlbmd0aCBpcyB6ZXJvIik7Ci0JCXJldHVybjsKLQl9CisJbGVuZ3RoID0gbWF4X2xlbmd0aDsKIAogCWlmIChsZW5ndGggPiBtYXhfbGVuZ3RoKSB7CiAJCWRiZ19lcDAgKDEsICJsZW5ndGg6ICVkID49IG1heF9sZW5ndGg6ICVkIiwgbGVuZ3RoLApAQCAtMTkyLDcgKzE5OCw3IEBACiAKIAkvKiBzZXR1cCB0eCB1cmIgKi8KIAl1cmItPmFjdHVhbF9sZW5ndGggPSAwOwotCWNwID0gdXJiLT5idWZmZXI7CisJY3AgPSAoY2hhciopdXJiLT5idWZmZXI7CiAKIAlkYmdfZXAwICgyLCAiJXMiLCBVU0JEX0RFVklDRV9ERVNDUklQVE9SUyAoZGVzY3JpcHRvcl90eXBlKSk7CiAKQEAgLTIwMCw3ICsyMDYsNiBAQAogCWNhc2UgVVNCX0RFU0NSSVBUT1JfVFlQRV9ERVZJQ0U6CiAJCXsKIAkJCXN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKmRldmljZV9kZXNjcmlwdG9yOwotCiAJCQlpZiAoIQogCQkJICAgIChkZXZpY2VfZGVzY3JpcHRvciA9CiAJCQkgICAgIHVzYmRfZGV2aWNlX2RldmljZV9kZXNjcmlwdG9yIChkZXZpY2UsIHBvcnQpKSkgewpAQCAtMjE0LDIwICsyMTksMTYgQEAKIAkJCS8qIGNvcnJlY3QgdGhlIGNvcnJlY3QgY29udHJvbCBlbmRwb2ludCAwIG1heCBwYWNrZXQgc2l6ZSBpbnRvIHRoZSBkZXNjcmlwdG9yICovCiAJCQlkZXZpY2VfZGVzY3JpcHRvciA9CiAJCQkJKHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKikgdXJiLT5idWZmZXI7Ci0JCQlkZXZpY2VfZGVzY3JpcHRvci0+Yk1heFBhY2tldFNpemUwID0KLQkJCQl1cmItPmRldmljZS0+YnVzLT5tYXhwYWNrZXRzaXplOwogCiAJCX0KLQkJLypkYmdfZXAwKDMsICJjb3BpZWQgZGV2aWNlIGNvbmZpZ3VyYXRpb24sIGFjdHVhbF9sZW5ndGg6ICV4IiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsgKi8KKwkJZGJnX2VwMCgzLCAiY29waWVkIGRldmljZSBjb25maWd1cmF0aW9uLCBhY3R1YWxfbGVuZ3RoOiAweCV4IiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfQ09ORklHVVJBVElPTjoKIAkJewotCQkJaW50IGJOdW1JbnRlcmZhY2U7CiAJCQlzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcgogCQkJCSpjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3I7CiAJCQlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXZpY2VfZGVzY3JpcHRvcjsKLQogCQkJaWYgKCEKIAkJCSAgICAoZGV2aWNlX2Rlc2NyaXB0b3IgPQogCQkJICAgICB1c2JkX2RldmljZV9kZXZpY2VfZGVzY3JpcHRvciAoZGV2aWNlLCBwb3J0KSkpIHsKQEAgLTI1MSwxMzAgKzI1MiwzNSBAQAogCQkJCQkgaW5kZXgpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KKwkJCWRiZ19lcDAoMCwgImF0dGVtcHQgdG8gY29weSAlZCBieXRlcyB0byB1cmJcbiIsY3B1X3RvX2xlMTYoY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yLT53VG90YWxMZW5ndGgpKTsKIAkJCWNvcHlfY29uZmlnICh1cmIsIGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciwKLQkJCQkgICAgIHNpemVvZiAoc3RydWN0Ci0JCQkJCSAgICAgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciksCisKKwkJCQkJY3B1X3RvX2xlMTYoY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yLT53VG90YWxMZW5ndGgpLAogCQkJCSAgICAgbWF4KTsKLQotCi0JCQkvKiBpdGVyYXRlIGFjcm9zcyBpbnRlcmZhY2VzIGZvciBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiAqLwotCQkJZGJnX2VwMCAoMCwgImJOdW1JbnRlcmZhY2VzOiAlZCIsCi0JCQkJIGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvci0+Yk51bUludGVyZmFjZXMpOwotCQkJZm9yIChiTnVtSW50ZXJmYWNlID0gMDsKLQkJCSAgICAgYk51bUludGVyZmFjZSA8Ci0JCQkgICAgIGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvci0+Yk51bUludGVyZmFjZXM7Ci0JCQkgICAgIGJOdW1JbnRlcmZhY2UrKykgewotCi0JCQkJaW50IGJBbHRlcm5hdGVTZXR0aW5nOwotCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2luc3RhbmNlCi0JCQkJCSppbnRlcmZhY2VfaW5zdGFuY2U7Ci0KLQkJCQlkYmdfZXAwICgzLCAiWyVkXSBiTnVtSW50ZXJmYWNlczogJWQiLAotCQkJCQkgYk51bUludGVyZmFjZSwKLQkJCQkJIGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvci0+Yk51bUludGVyZmFjZXMpOwotCi0JCQkJaWYgKCEgKGludGVyZmFjZV9pbnN0YW5jZSA9IHVzYmRfZGV2aWNlX2ludGVyZmFjZV9pbnN0YW5jZSAoZGV2aWNlLAotCQkJCQkJCQkgICAgIHBvcnQsIGluZGV4LCBiTnVtSW50ZXJmYWNlKSkpCi0JCQkJewotCQkJCQlkYmdfZXAwICgzLCAiWyVkXSBpbnRlcmZhY2VfaW5zdGFuY2UgTlVMTCIsCi0JCQkJCQkgYk51bUludGVyZmFjZSk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJLyogaXRlcmF0ZSBhY3Jvc3MgaW50ZXJmYWNlIGFsdGVybmF0ZXMgKi8KLQkJCQlmb3IgKGJBbHRlcm5hdGVTZXR0aW5nID0gMDsKLQkJCQkgICAgIGJBbHRlcm5hdGVTZXR0aW5nIDwgaW50ZXJmYWNlX2luc3RhbmNlLT5hbHRlcm5hdGVzOwotCQkJCSAgICAgYkFsdGVybmF0ZVNldHRpbmcrKykgewotCQkJCQkvKmludCBjbGFzczsgKi8KLQkJCQkJaW50IGJOdW1FbmRwb2ludDsKLQkJCQkJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaW50ZXJmYWNlX2Rlc2NyaXB0b3I7Ci0KLQkJCQkJc3RydWN0IHVzYl9hbHRlcm5hdGVfaW5zdGFuY2UgKmFsdGVybmF0ZV9pbnN0YW5jZTsKLQotCQkJCQlkYmdfZXAwICgzLCAiWyVkOiVkXSBhbHRlcm5hdGVzOiAlZCIsCi0JCQkJCQkgYk51bUludGVyZmFjZSwKLQkJCQkJCSBiQWx0ZXJuYXRlU2V0dGluZywKLQkJCQkJCSBpbnRlcmZhY2VfaW5zdGFuY2UtPmFsdGVybmF0ZXMpOwotCi0JCQkJCWlmICghIChhbHRlcm5hdGVfaW5zdGFuY2UgPSB1c2JkX2RldmljZV9hbHRlcm5hdGVfaW5zdGFuY2UgKGRldmljZSwgcG9ydCwgaW5kZXgsIGJOdW1JbnRlcmZhY2UsIGJBbHRlcm5hdGVTZXR0aW5nKSkpIHsKLQkJCQkJCWRiZ19lcDAgKDMsICJbJWRdIGFsdGVybmF0ZV9pbnN0YW5jZSBOVUxMIiwKLQkJCQkJCQkgYk51bUludGVyZmFjZSk7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQkJLyogY29weSBkZXNjcmlwdG9yIGZvciB0aGlzIGludGVyZmFjZSAqLwotCQkJCQljb3B5X2NvbmZpZyAodXJiLCBhbHRlcm5hdGVfaW5zdGFuY2UtPmludGVyZmFjZV9kZXNjcmlwdG9yLAotCQkJCQkJICAgICBzaXplb2YgKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpLAotCQkJCQkJICAgICBtYXgpOwotCi0JCQkJCS8qZGJnX2VwMCgzLCAiWyVkOiVkXSBjbGFzc2VzOiAlZCBlbmRwb2ludHM6ICVkIiwgYk51bUludGVyZmFjZSwgYkFsdGVybmF0ZVNldHRpbmcsICovCi0JCQkJCS8qICAgICAgICBhbHRlcm5hdGVfaW5zdGFuY2UtPmNsYXNzZXMsIGFsdGVybmF0ZV9pbnN0YW5jZS0+ZW5kcG9pbnRzKTsgKi8KLQotCQkJCQkvKiBpdGVyYXRlIGFjcm9zcyBjbGFzc2VzIGZvciB0aGlzIGFsdGVybmF0ZSBpbnRlcmZhY2UgKi8KLSNpZiAwCi0JCQkJCWZvciAoY2xhc3MgPSAwOwotCQkJCQkgICAgIGNsYXNzIDwgYWx0ZXJuYXRlX2luc3RhbmNlLT5jbGFzc2VzOwotCQkJCQkgICAgIGNsYXNzKyspIHsKLQkJCQkJCXN0cnVjdCB1c2JfY2xhc3NfZGVzY3JpcHRvciAqY2xhc3NfZGVzY3JpcHRvcjsKLQkJCQkJCS8qZGJnX2VwMCgzLCAiWyVkOiVkOiVkXSBjbGFzc2VzOiAlZCIsIGJOdW1JbnRlcmZhY2UsIGJBbHRlcm5hdGVTZXR0aW5nLCAqLwotCQkJCQkJLyogICAgICAgIGNsYXNzLCBhbHRlcm5hdGVfaW5zdGFuY2UtPmNsYXNzZXMpOyAqLwotCQkJCQkJaWYgKCEoY2xhc3NfZGVzY3JpcHRvciA9IHVzYmRfZGV2aWNlX2NsYXNzX2Rlc2NyaXB0b3JfaW5kZXggKGRldmljZSwgcG9ydCwgaW5kZXgsIGJOdW1JbnRlcmZhY2UsIGJBbHRlcm5hdGVTZXR0aW5nLCBjbGFzcykpKSB7Ci0JCQkJCQkJZGJnX2VwMCAoMywgIlslZF0gY2xhc3MgTlVMTCIsCi0JCQkJCQkJCSBjbGFzcyk7Ci0JCQkJCQkJcmV0dXJuIC0xOwotCQkJCQkJfQotCQkJCQkJLyogY29weSBkZXNjcmlwdG9yIGZvciB0aGlzIGNsYXNzICovCi0JCQkJCQljb3B5X2NvbmZpZyAodXJiLCBjbGFzc19kZXNjcmlwdG9yLAotCQkJCQkJCXNpemVvZiAoc3RydWN0IHVzYl9jbGFzc19kZXNjcmlwdG9yKSwKLQkJCQkJCQltYXgpOwotCQkJCQl9Ci0jZW5kaWYKLQotCQkJCQkvKiBpdGVyYXRlIGFjcm9zcyBlbmRwb2ludHMgZm9yIHRoaXMgYWx0ZXJuYXRlIGludGVyZmFjZSAqLwotCQkJCQlpbnRlcmZhY2VfZGVzY3JpcHRvciA9IGFsdGVybmF0ZV9pbnN0YW5jZS0+aW50ZXJmYWNlX2Rlc2NyaXB0b3I7Ci0JCQkJCWZvciAoYk51bUVuZHBvaW50ID0gMDsKLQkJCQkJICAgICBiTnVtRW5kcG9pbnQgPCBhbHRlcm5hdGVfaW5zdGFuY2UtPmVuZHBvaW50czsKLQkJCQkJICAgICBiTnVtRW5kcG9pbnQrKykgewotCQkJCQkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludF9kZXNjcmlwdG9yOwotCQkJCQkJZGJnX2VwMCAoMywgIlslZDolZDolZF0gZW5kcG9pbnQ6ICVkIiwKLQkJCQkJCQkgYk51bUludGVyZmFjZSwKLQkJCQkJCQkgYkFsdGVybmF0ZVNldHRpbmcsCi0JCQkJCQkJIGJOdW1FbmRwb2ludCwKLQkJCQkJCQkgaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPgotCQkJCQkJCSBiTnVtRW5kcG9pbnRzKTsKLQkJCQkJCWlmICghKGVuZHBvaW50X2Rlc2NyaXB0b3IgPSB1c2JkX2RldmljZV9lbmRwb2ludF9kZXNjcmlwdG9yX2luZGV4IChkZXZpY2UsIHBvcnQsIGluZGV4LCBiTnVtSW50ZXJmYWNlLCBiQWx0ZXJuYXRlU2V0dGluZywgYk51bUVuZHBvaW50KSkpIHsKLQkJCQkJCQlkYmdfZXAwICgzLCAiWyVkXSBlbmRwb2ludCBOVUxMIiwKLQkJCQkJCQkJIGJOdW1FbmRwb2ludCk7Ci0JCQkJCQkJcmV0dXJuIC0xOwotCQkJCQkJfQotCQkJCQkJLyogY29weSBkZXNjcmlwdG9yIGZvciB0aGlzIGVuZHBvaW50ICovCi0JCQkJCQljb3B5X2NvbmZpZyAodXJiLCBlbmRwb2ludF9kZXNjcmlwdG9yLAotCQkJCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAotCQkJCQkJCSAgICAgbWF4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRiZ19lcDAgKDMsICJsZW5ndGhzOiAlZCAlZCIsCi0JCQkJIGxlMTZfdG9fY3B1IChjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3ItPndUb3RhbExlbmd0aCksCi0JCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCX0KKwogCQlicmVhazsKIAogCWNhc2UgVVNCX0RFU0NSSVBUT1JfVFlQRV9TVFJJTkc6CiAJCXsKIAkJCXN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKnN0cmluZ19kZXNjcmlwdG9yOwotCiAJCQlpZiAoIShzdHJpbmdfZGVzY3JpcHRvciA9IHVzYmRfZ2V0X3N0cmluZyAoaW5kZXgpKSkgeworCQkJCXNlcmlhbF9wcmludGYoIkludmFsaWQgc3RyaW5nIGluZGV4ICVkXG4iLCBpbmRleCk7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQotCQkJLypkYmdfZXAwKDMsICJzdHJpbmdfZGVzY3JpcHRvcjogJXAiLCBzdHJpbmdfZGVzY3JpcHRvcik7ICovCisJCQlkYmdfZXAwKDMsICJzdHJpbmdfZGVzY3JpcHRvcjogJXAgbGVuZ3RoICVkIiwgc3RyaW5nX2Rlc2NyaXB0b3IsIHN0cmluZ19kZXNjcmlwdG9yLT5iTGVuZ3RoKTsKIAkJCWNvcHlfY29uZmlnICh1cmIsIHN0cmluZ19kZXNjcmlwdG9yLCBzdHJpbmdfZGVzY3JpcHRvci0+Ykxlbmd0aCwgbWF4KTsKIAkJfQogCQlicmVhazsKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfSU5URVJGQUNFOgorCXNlcmlhbF9wcmludGYoIlVTQl9ERVNDUklQVE9SX1RZUEVfSU5URVJGQUNFIC0gZXJyb3Igbm90IGltcGxlbWVudGVkXG4iKTsKIAkJcmV0dXJuIC0xOwogCWNhc2UgVVNCX0RFU0NSSVBUT1JfVFlQRV9FTkRQT0lOVDoKKwkJc2VyaWFsX3ByaW50ZigiVVNCX0RFU0NSSVBUT1JfVFlQRV9FTkRQT0lOVCAtIGVycm9yIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJCXJldHVybiAtMTsKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfSElEOgogCQl7CisJCQlzZXJpYWxfcHJpbnRmKCJVU0JfREVTQ1JJUFRPUl9UWVBFX0hJRCAtIGVycm9yIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJCQlyZXR1cm4gLTE7CS8qIHVuc3VwcG9ydGVkIGF0IHRoaXMgdGltZSAqLwogI2lmIDAKIAkJCWludCBiTnVtSW50ZXJmYWNlID0KQEAgLTQwMyw2ICszMDksNyBAQAogCQlicmVhazsKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfUkVQT1JUOgogCQl7CisJCQlzZXJpYWxfcHJpbnRmKCJVU0JfREVTQ1JJUFRPUl9UWVBFX1JFUE9SVCAtIGVycm9yIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJCQlyZXR1cm4gLTE7CS8qIHVuc3VwcG9ydGVkIGF0IHRoaXMgdGltZSAqLwogI2lmIDAKIAkJCWludCBiTnVtSW50ZXJmYWNlID0KQEAgLTQzNCwxMiArMzQxLDE5IEBACiAjZW5kaWYKIAkJfQogCQlicmVhazsKKwljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfREVWSUNFX1FVQUxJRklFUjoKKwkJeworCQkJLyogSWYgYSBVU0IgZGV2aWNlIHN1cHBvcnRzIGJvdGggYSBmdWxsIHNwZWVkIGFuZCBsb3cgc3BlZWQgb3BlcmF0aW9uCisJCQkgKiB3ZSBtdXN0IHNlbmQgYSBEZXZpY2VfUXVhbGlmaWVyIGRlc2NyaXB0b3IgaGVyZQorCQkJICovCisJCQlyZXR1cm4gLTE7CisJCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CiAJfQogCiAKLQlkYmdfZXAwICgxLCAidXJiOiBidWZmZXI6ICVwIGJ1ZmZlcl9sZW5ndGg6ICUyZCBhY3R1YWxfbGVuZ3RoOiAlMmQgcGFja2V0IHNpemU6ICUyZCIsCisJZGJnX2VwMCAoMSwgInVyYjogYnVmZmVyOiAlcCBidWZmZXJfbGVuZ3RoOiAlMmQgYWN0dWFsX2xlbmd0aDogJTJkIHR4X3BhY2tldFNpemU6ICUyZCIsCiAJCSB1cmItPmJ1ZmZlciwgdXJiLT5idWZmZXJfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgsCiAJCSBkZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXlbMF0udHhfcGFja2V0U2l6ZSk7CiAvKgpAQCAtNDk1LDYgKzQwOSwxMiBAQAogCiAJLyogaGFuZGxlIFVTQiBTdGFuZGFyZCBSZXF1ZXN0IChjLmYuIFVTQiBTcGVjIHRhYmxlIDktMikgKi8KIAlpZiAoKHJlcXVlc3QtPmJtUmVxdWVzdFR5cGUgJiBVU0JfUkVRX1RZUEVfTUFTSykgIT0gMCkgeworCQlpZihkZXZpY2UtPmRldmljZV9zdGF0ZSA8PSBTVEFURV9DT05GSUdVUkVEKXsKKwkJCS8qCUF0dGVtcHQgdG8gaGFuZGxlIGEgQ0RDIHNwZWNpZmljIHJlcXVlc3QgaWYgd2UgYXJlCisJCQkgKglpbiB0aGUgY29uZmlndXJlZCBzdGF0ZS4KKwkJCSAqLworCQkJcmV0dXJuIGRldmljZS0+Y2RjX3JlY3Zfc2V0dXAocmVxdWVzdCx1cmIpOworCQl9CiAJCWRiZ19lcDAgKDEsICJub24gc3RhbmRhcmQgcmVxdWVzdDogJXgiLAogCQkJIHJlcXVlc3QtPmJtUmVxdWVzdFR5cGUgJiBVU0JfUkVRX1RZUEVfTUFTSyk7CiAJCXJldHVybiAtMTsJLyogU3RhbGwgaGVyZSAqLwpAQCAtNTY3LDYgKzQ4Nyw3IEBACiAJCQkJCQkgICBsZTE2X3RvX2NwdSAocmVxdWVzdC0+d1ZhbHVlKSAmIDB4ZmYpOwogCiAJCWNhc2UgVVNCX1JFUV9HRVRfQ09ORklHVVJBVElPTjoKKwkJCXNlcmlhbF9wcmludGYoImdldCBjb25maWcgJWRcbiIsIGRldmljZS0+Y29uZmlndXJhdGlvbik7CiAJCQlyZXR1cm4gZXAwX2dldF9vbmUgKGRldmljZSwgdXJiLAogCQkJCQkgICAgZGV2aWNlLT5jb25maWd1cmF0aW9uKTsKIApAQCAtNjQyLDcgKzU2Myw2IEBACiAJCQkvKmRiZ19lcDAoMiwgImFkZHJlc3M6ICVkICVkICVkIiwgKi8KIAkJCS8qICAgICAgICByZXF1ZXN0LT53VmFsdWUsIGxlMTZfdG9fY3B1KHJlcXVlc3QtPndWYWx1ZSksIGRldmljZS0+YWRkcmVzcyk7ICovCiAKLQkJCXNlcmlhbF9wcmludGYgKCJERVZJQ0VfQUREUkVTU19BU1NJR05FRC4uIGV2ZW50P1xuIik7CiAJCQlyZXR1cm4gMDsKIAogCQljYXNlIFVTQl9SRVFfU0VUX0RFU0NSSVBUT1I6CS8qIFhYWCBzaG91bGQgd2Ugc3VwcG9ydCB0aGlzPyAqLwpAQCAtNjUzLDkgKzU3MywxMCBAQAogCQkJLyogYy5mLiA5LjQuNyAtIHRoZSB0b3AgaGFsZiBvZiB3VmFsdWUgaXMgcmVzZXJ2ZWQgKi8KIAkJCS8qICovCiAJCQlpZiAoKGRldmljZS0+Y29uZmlndXJhdGlvbiA9Ci0JCQkgICAgIGxlMTZfdG9fY3B1IChyZXF1ZXN0LT53VmFsdWUpICYgMHg3ZikgIT0gMCkgeworCQkJCWxlMTZfdG9fY3B1IChyZXF1ZXN0LT53VmFsdWUpICYgMHhGRjgwKSAhPSAwKSB7CiAJCQkJLyogYy5mLiA5LjQuNyAtIHplcm8gaXMgdGhlIGRlZmF1bHQgb3IgYWRkcmVzc2VkIHN0YXRlLCBpbiBvdXIgY2FzZSB0aGlzICovCiAJCQkJLyogaXMgdGhlIHNhbWUgaXMgY29uZmlndXJhdGlvbiB6ZXJvICovCisJCQkJc2VyaWFsX3ByaW50ZigiZXJyb3Igc2V0dGluZyBkZXYtPmNvbmZpZyB0byB6ZXJvIVxuIik7CiAJCQkJZGV2aWNlLT5jb25maWd1cmF0aW9uID0gMDsJLyogVEJSIC0gPz8/Pz8/ICovCiAJCQl9CiAJCQkvKiByZXNldCBpbnRlcmZhY2UgYW5kIGFsdGVybmF0ZSBzZXR0aW5ncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2JkY29yZV9tcGM4eHguYyBiL2RyaXZlcnMvdXNiZGNvcmVfbXBjOHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3Mjg0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiZGNvcmVfbXBjOHh4LmMKQEAgLTAsMCArMSwxNDAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IEJyeWFuIE8nRG9ub2dodWUsIENvZGVIZXJtaXQKKyAqIGJvZG9ub2dodWVAQ29kZUhlcm1pdC5pZQorICoKKyAqIFJlZmVyZW5jZXMKKyAqIERhc1VCb290L2RyaXZlcnMvdXNiZGNvcmVfb21hcDE1MTAuYywgZm9yIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gaWRlYXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisvKgorICogTm90ZXMgOgorICogMS4JI2RlZmluZSBfX1NJTVVMQVRFX0VSUk9SX18gdG8gaW5qZWN0IGEgQ1JDIGVycm9yIGludG8gZXZlcnkgMm5kIFRYCisgKgkJcGFja2V0IHRvIGZvcmNlIHRoZSBVU0IgcmUtdHJhbnNtaXQgcHJvdG9jb2wuCisgKgorICogMi4JI2RlZmluZSBfX0RFQlVHX1VEQ19fIHRvIHN3aXRjaCBvbiBkZWJ1ZyB0cmFjaW5nIHRvIHNlcmlhbCBjb25zb2xlCisgKgliZSBjYXJlZnVsIHRoYXQgdHJhY2luZyBkb2Vzbid0IGNyZWF0ZSBIaWVzZW4tYnVncyB3aXRoIHJlc3BlY3QgdG8KKyAqCXJlc3BvbnNlIHRpbWVvdXRzIHRvIGNvbnRyb2wgcmVxdWVzdHMuCisgKgorICogMy4JVGhpcyBkcml2ZXIgc2hvdWxkIGJlIGFibGUgdG8gc3VwcG9ydCBhbnkgaGlnaGVyIGxldmVsIGRyaXZlciB0aGF0CisgKgl0aGF0IHdhbnRzIHRvIGRvIGVpdGhlciBvZiB0aGUgdHdvIHN0YW5kYXJkIFVEQyBpbXBsZW1lbnRhdGlvbnMKKyAqCUNvbnRyb2wtQnVsay1JbnRlcnJ1cHQgb3IgIEJ1bGstSU4vQnVsay1PdXQgc3RhbmRhcmRzLiBIZW5jZQorICoJZ3NlcmlhbCBhbmQgY2RjX2FjbSBzaG91bGQgd29yayB3aXRoIHRoaXMgY29kZS4KKyAqCisgKiA0LglOQUsgZXZlbnRzIG5ldmVyIGFjdHVhbGx5IGdldCByYWlzZWQgYXQgYWxsLCB0aGUgZG9jdW1lbnRhdGlvbgorICoJaXMganVzdCB3cm9uZyAhCisgKgorICogNS4JRm9yIHNvbWUgcmVhc29uLCBjYmRfZGF0bGVuIGlzICphbHdheXMqICsyIHRoZSB2YWx1ZSBpdCBzaG91bGQgYmUuCisgKgl0aGlzIG1lYW5zIHRoYXQgaGF2aW5nIGFuIFJYIGNiZCBvZiAxNiBieXRlcyBpcyBub3QgcG9zc2libGUsIHNpbmNlCisgKgl0aGUgc2FtZSBzaXplIGlzIHJlcG9ydGVkIGZvciAxNCBieXRlcyByZWNlaXZlZCBhcyAxNiBieXRlcyByZWNlaXZlZAorICoJdW50aWwgd2UgY2FuIGZpbmQgb3V0IHdoeSB0aGlzIGhhcHBlbnMsIFJYIGNiZHMgbXVzdCBiZSBsaW1pdGVkIHRvIDgKKyAqCWJ5dGVzLiBUT0RPOiBjaGVjayBlcnJhdGEgZm9yIHRoaXMgYmVoYXZpb3VyLgorICoKKyAqIDYuCVJpZ2h0IG5vdyB0aGlzIGNvZGUgZG9lc24ndCBzdXBwb3J0IHByb3Blcmx5IHBvd2VyaW5nIHVwIHdpdGggdGhlIFVTQgorICoJY2FibGUgYXR0YWNoZWQgdG8gdGhlIFVTQiBob3N0IG15IGRldmVsb3BtZW50IGJvYXJkIHRoZSBBZGRlcjg3eCBkb2Vzbid0CisgKgloYXZlIGEgcHVsbC11cCBmaXR0ZWQgdG8gYWxsb3cgdGhpcywgc28gaXQgaXMgbmVjZXNzYXJ5IHRvIHBvd2VyIHRoZQorICoJYm9hcmQgYW5kICp0aGVuKiBhdHRhY2hlZCB0aGUgVVNCIGNhYmxlIHRvIHRoZSBob3N0LiBIb3dldmVyIHNvbWVib2R5CisgKgl3aXRoIGEgZGlmZmVyZW50IGRlc2lnbiBpbiB0aGVpciBib2FyZCBtYXkgYmUgYWJsZSB0byBrZWVwIHRoZSBjYWJsZQorICoJY29uc3RhbnRseSBjb25uZWN0ZWQgYW5kIHNpbXBseSBlbmFibGUvZGlzYWJsZSBhIHB1bGwtdXAgIHJlCisgKglmaWd1cmUgMzEuMSBpbiBNUEM4ODVSTS5wZGYgaW5zdGVhZCBvZiBoYXZpbmcgdG8gcG93ZXIgdXAgdGhlIGJvYXJkIGFuZAorICoJdGhlbiBhdHRhY2ggdGhlIGNhYmxlICEKKyAqCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX01QQzg4NV9GQU1JTFkpICYmIGRlZmluZWQoQ09ORklHX1VTQl9ERVZJQ0UpCisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlICJ1c2JkY29yZS5oIgorI2luY2x1ZGUgInVzYmRjb3JlX21wYzh4eC5oIgorI2luY2x1ZGUgInVzYmRjb3JlX2VwMC5oIgorCisjZGVmaW5lIEVSUihmbXQsIGFyZ3MuLi4pXAorCXNlcmlhbF9wcmludGYoIkVSUk9SIDogWyVzXSAlczolZDogImZtdCxcCisJCQkJX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLCAjI2FyZ3MpCisjaWZkZWYgX19ERUJVR19VRENfXworI2RlZmluZSBEQkcoZm10LGFyZ3MuLi4pXAorCQlzZXJpYWxfcHJpbnRmKCJbJXNdICVzOiVkOiAiZm10LFwKKwkJCQlfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sICMjYXJncykKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQsYXJncy4uLikKKyNlbmRpZgorCisvKiBTdGF0aWMgRGF0YSAqLworI2lmZGVmIF9fU0lNVUxBVEVfRVJST1JfXworc3RhdGljIGNoYXIgZXJyX3BvaXNvbl90ZXN0ID0gMDsKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBtcGM4eHhfZXAgZXBfcmVmW01BWF9FTkRQT0lOVFNdOworc3RhdGljIHUzMiBhZGRyZXNzX2Jhc2UgPSBTVEFURV9OT1RfUkVBRFk7CitzdGF0aWMgbXBjOHh4X3VkY19zdGF0ZV90IHVkY19zdGF0ZSA9IDA7CitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKnVkY19kZXZpY2UgPSAwOworc3RhdGljIHZvbGF0aWxlIHVzYl9lcGJfdCAqZW5kcG9pbnRzW01BWF9FTkRQT0lOVFNdOworc3RhdGljIHZvbGF0aWxlIGNiZF90ICp0eF9jYmRbVFhfUklOR19TSVpFXTsKK3N0YXRpYyB2b2xhdGlsZSBjYmRfdCAqcnhfY2JkW1JYX1JJTkdfU0laRV07CitzdGF0aWMgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IDA7CitzdGF0aWMgdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gMDsKK3N0YXRpYyB2b2xhdGlsZSB1c2JfcHJhbV90ICp1c2JfcGFyYW1wID0gMDsKK3N0YXRpYyB2b2xhdGlsZSB1c2JfdCAqdXNicCA9IDA7CitzdGF0aWMgaW50IHJ4X2N0ID0gMDsKK3N0YXRpYyBpbnQgdHhfY3QgPSAwOworCisvKiBTdGF0aWMgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX3N0YXRlX3RyYW5zaXRpb25fdXAgKHVzYl9kZXZpY2Vfc3RhdGVfdCBpbml0aWFsLAorCQkJCQkgICAgdXNiX2RldmljZV9zdGF0ZV90IGZpbmFsKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl9kb3duICh1c2JfZGV2aWNlX3N0YXRlX3QgaW5pdGlhbCwKKwkJCQkJICAgICAgdXNiX2RldmljZV9zdGF0ZV90IGZpbmFsKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc3RhbGwgKHVuc2lnbmVkIGludCBlcCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2ZsdXNoX3R4X2ZpZm8gKGludCBlcGlkKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZmx1c2hfcnhfZmlmbyAodm9pZCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NsZWFyX3J4YmQgKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2luaXRfdHggKHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVwaSwKKwkJCQlzdHJ1Y3QgdXJiICp0eF91cmIpOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19kdW1wX3JlcXVlc3QgKHN0cnVjdCB1c2JfZGV2aWNlX3JlcXVlc3QgKnJlcXVlc3QpOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jbG9ja19pbml0ICh2b2xhdGlsZSBpbW1hcF90ICogaW1tciwKKwkJCQkgICB2b2xhdGlsZSBjcG04eHhfdCAqIGNwKTsKK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcF90eCAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpKTsKK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcG5fcnggKHVuc2lnbmVkIGludCBlcGlkLCB2b2xhdGlsZSBjYmRfdCAqIHJ4X2NiZHApOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19lcDBfcnggKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NiZF9pbml0ICh2b2lkKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZW5kcG9pbnRfaW5pdCAodm9pZCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGludCBlcCwgdWNoYXIgdHhfc2l6ZSwgdWNoYXIgcnhfc2l6ZSk7CitzdGF0aWMgdTMyIG1wYzh4eF91ZGNfYWxsb2MgKHUzMiBkYXRhX3NpemUsIHUzMiBhbGlnbm1lbnQpOworc3RhdGljIGludCBtcGM4eHhfdWRjX2VwMF9yeF9zZXR1cCAodm9sYXRpbGUgY2JkX3QgKiByeF9jYmRwKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc2V0X25hayAodW5zaWduZWQgaW50IGVwKTsKK3N0YXRpYyBzaG9ydCBtcGM4eHhfdWRjX2hhbmRsZV90eGVyciAodm9pZCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2FkdmFuY2VfcnggKHZvbGF0aWxlIGNiZF90ICoqIHJ4X2NiZHAsIGludCBlcGlkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJICAgICAgIEdsb2JhbCBMaW5rYWdlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHVkY19pbml0CisgKgorICogRG8gaW5pdGlhbCBidXMgZ2x1aW5nCisgKi8KK2ludCB1ZGNfaW5pdCAodm9pZCkKK3sKKwkvKiBJbml0IHZhcmlvdXMgcG9pbnRlcnMgKi8KKwlpbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJY3AgPSAoY3BtOHh4X3QgKikgJiAoaW1tci0+aW1fY3BtKTsKKwl1c2JfcGFyYW1wID0gKHVzYl9wcmFtX3QgKikgJiAoY3AtPmNwX2RwYXJhbVtQUk9GRl9VU0JdKTsKKwl1c2JwID0gKHVzYl90ICopICYgKGNwLT5jcF9zY2NbMF0pOworCisJbWVtc2V0IChlcF9yZWYsIDB4MDAsIChzaXplb2YgKHN0cnVjdCBtcGM4eHhfZXApICogTUFYX0VORFBPSU5UUykpOworCisJdWRjX2RldmljZSA9IDA7CisJdWRjX3N0YXRlID0gU1RBVEVfTk9UX1JFQURZOworCisJdXNicC0+dXNtb2QgPSAweDAwOworCXVzYnAtPnVzY29tID0gMDsKKworCS8qIFNldCBVU0IgRnJhbWUgIzAsIFJlc3BvbmQgYXQgQWRkcmVzcyAmIEdldCBhIGNsb2NrIHNvdXJjZSAgKi8KKwl1c2JwLT51c2FkZHIgPSAweDAwOworCW1wYzh4eF91ZGNfY2xvY2tfaW5pdCAoaW1tciwgY3ApOworCisJLyogUEExNSwgUEExNCBhcyBwZXJoaXBlcmFsIFVTQlJYRCBhbmQgVVNCT0UgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4weDAwMDM7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAweDAwMDM7CisKKwkvKiBQQzExL1BDMTAgYXMgcGVyaXBoZXJhbCBVU0JSWFAgVVNCUlhOICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wY3NvIHw9IDB4MDAzMDsKKworCS8qIFBDNy9QQzYgYXMgcGVyaGlwZXJhbCBVU0JUWFAgYW5kIFVTQlRYTiAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0gMHgwMzAwOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgfD0gMHgwMzAwOworCisJLyogU2V0IHRoZSBiYXNlIGFkZHJlc3MgKi8KKwlhZGRyZXNzX2Jhc2UgPSAodTMyKSAoY3AtPmNwX2RwbWVtICsgQ1BNX1VTQl9CQVNFKTsKKworCS8qIEluaXRpYWxpc2UgZW5kcG9pbnRzIGFuZCBjaXJjdWxhciBidWZmZXJzICovCisJbXBjOHh4X3VkY19lbmRwb2ludF9pbml0ICgpOworCW1wYzh4eF91ZGNfY2JkX2luaXQgKCk7CisKKwkvKiBBc3NpZ24gYWxsb2NhdGVkIER1YWwgUG9ydCBFbmRwb2ludCBkZXNjcmlwdG9ycyAqLworCXVzYl9wYXJhbXAtPmVwMHB0ciA9ICh1MzIpIGVuZHBvaW50c1swXTsKKwl1c2JfcGFyYW1wLT5lcDFwdHIgPSAodTMyKSBlbmRwb2ludHNbMV07CisJdXNiX3BhcmFtcC0+ZXAycHRyID0gKHUzMikgZW5kcG9pbnRzWzJdOworCXVzYl9wYXJhbXAtPmVwM3B0ciA9ICh1MzIpIGVuZHBvaW50c1szXTsKKwl1c2JfcGFyYW1wLT5mcmFtZV9uID0gMDsKKworCURCRyAoImVwMHB0cj0weCUwOHggZXAxcHRyPTB4JTA4eCBlcDJwdHI9MHglMDh4IGVwM3B0cj0weCUwOHhcbiIsCisJICAgICB1c2JfcGFyYW1wLT5lcDBwdHIsIHVzYl9wYXJhbXAtPmVwMXB0ciwgdXNiX3BhcmFtcC0+ZXAycHRyLAorCSAgICAgdXNiX3BhcmFtcC0+ZXAzcHRyKTsKKworCXJldHVybiAwOworfQorCisvKiB1ZGNfaXJxCisgKgorICogUG9sbCBmb3Igd2hhdGV2ZXIgZXZlbnRzIG1heSBoYXZlIG9jY3VyZWQKKyAqLwordm9pZCB1ZGNfaXJxICh2b2lkKQoreworCWludCBlcGlkID0gMDsKKwl2b2xhdGlsZSBjYmRfdCAqcnhfY2JkcCA9IDA7CisJdm9sYXRpbGUgY2JkX3QgKnJ4X2NiZHBfYmFzZSA9IDA7CisKKwlpZiAodWRjX3N0YXRlICE9IFNUQVRFX1JFQURZKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9CU1kpIHsKKwkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiBJZiBpdCBkb2VzIHRoZW4gaXQncyBhIGJ1ZyAhICovCisJCXVzYnAtPnVzYmVyIHw9IFVTQl9FX0JTWTsKKwkJbXBjOHh4X3VkY19mbHVzaF9yeF9maWZvICgpOworCX0KKworCS8qIFNjYW4gYWxsIFJYL0JpZGlyZWN0aW9uYWwgRW5kcG9pbnRzIGZvciBSWCBkYXRhLiAqLworCWZvciAoZXBpZCA9IDA7IGVwaWQgPCBNQVhfRU5EUE9JTlRTOyBlcGlkKyspIHsKKwkJaWYgKCFlcF9yZWZbZXBpZF0ucHJ4KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlyeF9jYmRwID0gcnhfY2JkcF9iYXNlID0gZXBfcmVmW2VwaWRdLnByeDsKKworCQlkbyB7CisJCQlpZiAoIShyeF9jYmRwLT5jYmRfc2MgJiBSWF9CRF9FKSkgeworCisJCQkJaWYgKHJ4X2NiZHAtPmNiZF9zYyAmIDB4MUYpIHsKKwkJCQkJLyogQ29ycnVwdCBkYXRhIGRpc2NhcmQgaXQuCisJCQkJCSAqIENvbnRyb2xsZXIgaGFzIE5BSydkIHRoaXMgcGFja2V0LgorCQkJCQkgKi8KKwkJCQkJbXBjOHh4X3VkY19jbGVhcl9yeGJkIChyeF9jYmRwKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghZXBpZCkgeworCQkJCQkJbXBjOHh4X3VkY19lcDBfcnggKHJ4X2NiZHApOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBQcm9jZXNzIGRhdGEgKi8KKwkJCQkJCW1wYzh4eF91ZGNfc2V0X25hayAoZXBpZCk7CisJCQkJCQltcGM4eHhfdWRjX2Vwbl9yeCAoZXBpZCwgcnhfY2JkcCk7CisJCQkJCQltcGM4eHhfdWRjX2NsZWFyX3J4YmQgKHJ4X2NiZHApOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogQWR2YW5jZSBSWCBDQkQgcG9pbnRlciAqLworCQkJCW1wYzh4eF91ZGNfYWR2YW5jZV9yeCAoJnJ4X2NiZHAsIGVwaWQpOworCQkJCWVwX3JlZltlcGlkXS5wcnggPSByeF9jYmRwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBZHZhbmNlIFJYIENCRCBwb2ludGVyICovCisJCQkJbXBjOHh4X3VkY19hZHZhbmNlX3J4ICgmcnhfY2JkcCwgZXBpZCk7CisJCQl9CisKKwkJfSB3aGlsZSAocnhfY2JkcCAhPSByeF9jYmRwX2Jhc2UpOworCX0KKworCS8qIEhhbmRsZSBUWCBldmVudHMgYXMgYXBwcm9waWF0ZSwgdGhlIGNvcnJlY3QgcGxhY2UgdG8gZG8gdGhpcyBpcworCSAqIGluIGEgdHggcm91dGluZS4gUGVyaGFwcyBUWCBvbiBlcG4gd2FzIHByZS1lbXB0ZWQgYnkgZXAwCisJICovCisKKwlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9UWEIpIHsKKwkJdXNicC0+dXNiZXIgfD0gVVNCX0VfVFhCOworCX0KKworCWlmICh1c2JwLT51c2JlciAmIChVU0JfVFhfRVJSTUFTSykpIHsKKwkJbXBjOHh4X3VkY19oYW5kbGVfdHhlcnIgKCk7CisJfQorCisJLyogU3dpdGNoIHRvIHRoZSBkZWZhdWx0IHN0YXRlLCByZXNwb25kIGF0IHRoZSBkZWZhdWx0IGFkZHJlc3MgKi8KKwlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9SRVNFVCkgeworCQl1c2JwLT51c2JlciB8PSBVU0JfRV9SRVNFVDsKKwkJdXNicC0+dXNhZGRyID0gMHgwMDsKKwkJdWRjX2RldmljZS0+ZGV2aWNlX3N0YXRlID0gU1RBVEVfREVGQVVMVDsKKwl9CisKKwkvKiBpZih1c2JwLT51c2JlciZVU0JfRV9JRExFKXsKKwkgICBXZSBjb3VsZCBzdXNwZW5kIGhlcmUgIQorCSAgIHVzYnAtPnVzYmVyfD1VU0JfRV9JRExFOworCSAgIERCRygiaWRsZSBzdGF0ZSBjaGFuZ2VcbiIpOworCSAgIH0KKwkgICBpZih1c2JwLT51c2JzKXsKKwkgICBXZSBjb3VsZCByZXN1bWUgaGVyZSB3aGVuIElETEUgaXMgZGVhc3NlcnRlZCAhCisJICAgTm90IHdvcnRoIGRvaW5nLCBzbyBsb25nIGFzIHdlIGFyZSBzZWxmIHBvd2VyZWQgdGhvdWdoLgorCSAgIH0KKwkqLworCisJcmV0dXJuOworfQorCisvKiB1ZGNfZW5kcG9pbnRfd3JpdGUKKyAqCisgKiBXcml0ZSBzb21lIGRhdGEgdG8gYW4gZW5kcG9pbnQKKyAqLworaW50IHVkY19lbmRwb2ludF93cml0ZSAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpKQoreworCWludCBlcCA9IDA7CisJc2hvcnQgZXBpZCA9IDEsIHVubmFrID0gMCwgcmV0ID0gMDsKKworCWlmICh1ZGNfc3RhdGUgIT0gU1RBVEVfUkVBRFkpIHsKKwkJRVJSICgiaW52YWxpZCB1ZGNfc3RhdGUgIT0gU1RBVEVfUkVBRFkhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghdWRjX2RldmljZSB8fCAhZXBpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodWRjX2RldmljZS0+ZGV2aWNlX3N0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWVwID0gZXBpLT5lbmRwb2ludF9hZGRyZXNzICYgMHgwMzsKKwlpZiAoZXAgPj0gTUFYX0VORFBPSU5UUykgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2V0IE5BSyBmb3IgYWxsIFJYIGVuZHBvaW50cyBkdXJpbmcgVFggKi8KKwlmb3IgKGVwaWQgPSAxOyBlcGlkIDwgTUFYX0VORFBPSU5UUzsgZXBpZCsrKSB7CisKKwkJLyogRG9uJ3Qgc2V0IE5BSyBvbiBEQVRBIElOL0NPTlRST0wgZW5kcG9pbnRzICovCisJCWlmIChlcF9yZWZbZXBpZF0uc2MgJiBVU0JfRElSX0lOKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKHVzYnAtPnVzZXBbZXBpZF0gJiAoVVNFUF9USFNfTkFLIHwgVVNFUF9SSFNfTkFLKSkpIHsKKwkJCXVubmFrIHw9IDEgPDwgZXBpZDsKKwkJfQorCisJCW1wYzh4eF91ZGNfc2V0X25hayAoZXBpZCk7CisJfQorCisJbXBjOHh4X3VkY19pbml0X3R4ICgmdWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJheVtlcF0sCisJCQkgICAgZXBpLT50eF91cmIpOworCXJldCA9IG1wYzh4eF91ZGNfZXBfdHggKCZ1ZGNfZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5W2VwXSk7CisKKwkvKiBSZW1vdmUgdGVtcG9yYXJ5IE5BSyAqLworCWZvciAoZXBpZCA9IDE7IGVwaWQgPCBNQVhfRU5EUE9JTlRTOyBlcGlkKyspIHsKKwkJaWYgKHVubmFrICYgKDEgPDwgZXBpZCkpIHsKKwkJCXVkY191bnNldF9uYWsgKGVwaWQpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogbXBjOHh4X3VkY19hc3NpZ25fdXJiCisgKgorICogQXNzb2NpYXRlIGEgZ2l2ZW4gdXJiIHRvIGFuIGVuZHBvaW50IFRYIG9yIFJYIHRyYW5zbWl0L3JlY2VpdmUgYnVmZmVycworICovCitzdGF0aWMgaW50IG1wYzh4eF91ZGNfYXNzaWduX3VyYiAoaW50IGVwLCBjaGFyIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplcGkgPSAwOworCisJaWYgKGVwID49IE1BWF9FTkRQT0lOVFMpIHsKKwkJZ290byBlcnI7CisJfQorCWVwaSA9ICZ1ZGNfZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5W2VwXTsKKwlpZiAoIWVwaSkgeworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIWVwX3JlZltlcF0udXJiKSB7CisJCWVwX3JlZltlcF0udXJiID0gdXNiZF9hbGxvY191cmIgKHVkY19kZXZpY2UsIHVkY19kZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXkpOworCQlpZiAoIWVwX3JlZltlcF0udXJiKSB7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCWVwX3JlZltlcF0udXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwl9CisKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCWNhc2UgVVNCX0RJUl9JTjoKKwkJZXBpLT50eF91cmIgPSBlcF9yZWZbZXBdLnVyYjsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRElSX09VVDoKKwkJZXBpLT5yY3ZfdXJiID0gZXBfcmVmW2VwXS51cmI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZXJyOworCX0KKwlyZXR1cm4gMDsKKworICAgICAgZXJyOgorCXVkY19zdGF0ZSA9IFNUQVRFX0VSUk9SOworCXJldHVybiAtMTsKK30KKworLyogdWRjX3NldHVwX2VwCisgKgorICogQXNzb2NpYXRlIFUtQm9vdCBzb2Z0d2FyZSBlbmRwb2ludHMgdG8gbXBjOHh4IGVuZHBvaW50IHBhcmFtZXRlciByYW0KKyAqIElzb2Nocm9ub3VzIGVuZHBvaW50cyBhcmVuJ3QgeWV0IHN1cHBvcnRlZCEKKyAqLwordm9pZCB1ZGNfc2V0dXBfZXAgKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBlcCwKKwkJICAgc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpKQoreworCXVjaGFyIGRpcmVjdGlvbiA9IDA7CisJaW50IGVwX2F0dHJpYiA9IDA7CisKKwlpZiAoZXBpICYmIChlcCA8IE1BWF9FTkRQT0lOVFMpKSB7CisKKwkJaWYgKGVwID09IDApIHsKKwkJCWlmIChlcGktPnJjdl9hdHRyaWJ1dGVzICE9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wKKwkJCSAgICB8fCBlcGktPnR4X2F0dHJpYnV0ZXMgIT0KKwkJCSAgICBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKSB7CisKKwkJCQkvKiBlcDAgbXVzdCBiZSBhIGNvbnRyb2wgZW5kcG9pbnQgKi8KKwkJCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJCQlyZXR1cm47CisKKwkJCX0KKwkJCWlmICghKGVwX3JlZltlcF0uc2MgJiBFUF9BVFRBQ0hFRCkpIHsKKwkJCQltcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGVwLCBlcGktPnR4X3BhY2tldFNpemUsCisJCQkJCQkgICAgICAgZXBpLT5yY3ZfcGFja2V0U2l6ZSk7CisJCQl9CisJCQl1c2JwLT51c2VwW2VwXSA9IDB4MDAwMDsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgoZXBpLT5lbmRwb2ludF9hZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorCQkgICAgPT0gVVNCX0RJUl9JTikgeworCisJCQlkaXJlY3Rpb24gPSAxOworCQkJZXBfYXR0cmliID0gZXBpLT50eF9hdHRyaWJ1dGVzOworCQkJZXBpLT5yY3ZfcGFja2V0U2l6ZSA9IDA7CisJCQllcF9yZWZbZXBdLnNjIHw9IFVTQl9ESVJfSU47CisJCX0gZWxzZSB7CisKKwkJCWRpcmVjdGlvbiA9IDA7CisJCQllcF9hdHRyaWIgPSBlcGktPnJjdl9hdHRyaWJ1dGVzOworCQkJZXBpLT50eF9wYWNrZXRTaXplID0gMDsKKwkJCWVwX3JlZltlcF0uc2MgJj0gflVTQl9ESVJfSU47CisJCX0KKworCQlpZiAobXBjOHh4X3VkY19hc3NpZ25fdXJiIChlcCwgZXBpLT5lbmRwb2ludF9hZGRyZXNzCisJCQkJCSAgICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJc3dpdGNoIChlcF9hdHRyaWIpIHsKKwkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgorCQkJaWYgKCEoZXBfcmVmW2VwXS5zYyAmIEVQX0FUVEFDSEVEKSkgeworCQkJCW1wYzh4eF91ZGNfY2JkX2F0dGFjaCAoZXAsCisJCQkJCQkgICAgICAgZXBpLT50eF9wYWNrZXRTaXplLAorCQkJCQkJICAgICAgIGVwaS0+cmN2X3BhY2tldFNpemUpOworCQkJfQorCQkJdXNicC0+dXNlcFtlcF0gPSBlcCA8PCAxMjsKKwkJCWVwaS0+cmN2X3VyYiA9IGVwaS0+dHhfdXJiID0gZXBfcmVmW2VwXS51cmI7CisKKwkJCWJyZWFrOworCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CisJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgorCQkJaWYgKCEoZXBfcmVmW2VwXS5zYyAmIEVQX0FUVEFDSEVEKSkgeworCQkJCWlmIChkaXJlY3Rpb24pIHsKKwkJCQkJbXBjOHh4X3VkY19jYmRfYXR0YWNoIChlcCwKKwkJCQkJCQkgICAgICAgZXBpLT50eF9wYWNrZXRTaXplLAorCQkJCQkJCSAgICAgICAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQltcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGVwLAorCQkJCQkJCSAgICAgICAwLAorCQkJCQkJCSAgICAgICBlcGktPnJjdl9wYWNrZXRTaXplKTsKKwkJCQl9CisJCQl9CisJCQl1c2JwLT51c2VwW2VwXSA9IChlcCA8PCAxMikgfCAoKGVwX2F0dHJpYikgPDwgOCk7CisKKwkJCWJyZWFrOworCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCWRlZmF1bHQ6CisJCQlzZXJpYWxfcHJpbnRmICgiRXJyb3IgZW5kcG9pbnQgYXR0cmliICVkPjNcbiIsIGVwX2F0dHJpYik7CisJCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisJfQorCit9CisKKy8qIHVkY19jb25uZWN0CisgKgorICogTW92ZSBzdGF0ZSwgc3dpdGNoIG9uIHRoZSBVU0IKKyAqLwordm9pZCB1ZGNfY29ubmVjdCAodm9pZCkKK3sKKwkvKiBFbmFibGUgcHVsbC11cCByZXNpc3RvciBvbiBEKworCSAqIFRPRE86IGZpdCBhIHB1bGwtdXAgcmVzaXN0b3IgdG8gZHJpdmUgU0UwIGZvciA+IDIuNXVzCisJICovCisKKwlpZiAodWRjX3N0YXRlICE9IFNUQVRFX0VSUk9SKSB7CisJCXVkY19zdGF0ZSA9IFNUQVRFX1JFQURZOworCQl1c2JwLT51c21vZCB8PSBVU01PRF9FTjsKKwl9Cit9CisKKy8qIHVkY19kaXNjb25uZWN0CisgKgorICogRGlzY29ubmVjdCBpcyBub3QgdXNlZCBidXQsIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MKKyAqLwordm9pZCB1ZGNfZGlzY29ubmVjdCAodm9pZCkKK3sKKwkvKiBEaXNhYmxlIHB1bGwtdXAgcmVzaXN0b3Igb24gRC0KKwkgKiBUT0RPOiBmaXggYSBwdWxsdXAgcmVzaXN0b3IgdG8gY29udHJvbCB0aGlzCisJICovCisKKwlpZiAodWRjX3N0YXRlICE9IFNUQVRFX0VSUk9SKSB7CisJCXVkY19zdGF0ZSA9IFNUQVRFX05PVF9SRUFEWTsKKwl9CisJdXNicC0+dXNtb2QgJj0gflVTTU9EX0VOOworfQorCisvKiB1ZGNfZW5hYmxlCisgKgorICogR3JhYiBhbiBFUDAgVVJCLCByZWdpc3RlciBpbnRlcmVzdCBpbiBhIHN1YnNldCBvZiBVU0IgZXZlbnRzCisgKi8KK3ZvaWQgdWRjX2VuYWJsZSAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSkKK3sKKwlpZiAodWRjX3N0YXRlID09IFNUQVRFX0VSUk9SKSB7CisJCXJldHVybjsKKwl9CisKKwl1ZGNfZGV2aWNlID0gZGV2aWNlOworCisJaWYgKCFlcF9yZWZbMF0udXJiKSB7CisJCWVwX3JlZlswXS51cmIgPSB1c2JkX2FsbG9jX3VyYiAoZGV2aWNlLCBkZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXkpOworCX0KKworCS8qIFJlZ2lzdGVyIGludGVyZXN0IGluIGFsbCBldmVudHMgZXhjZXB0IFNPRiwgZW5hYmxlIHRyYW5zY2VpdmVyICovCisJdXNicC0+dXNiZXIgPSAweDAzRkY7CisJdXNicC0+dXNibXIgPSAweDAyRjc7CisKKwlyZXR1cm47Cit9CisKKy8qIHVkY19kaXNhYmxlCisgKgorICogZGlzYWJsZSB0aGUgY3VycmVudGx5IGhvb2tlZCBkZXZpY2UKKyAqLwordm9pZCB1ZGNfZGlzYWJsZSAodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAodWRjX3N0YXRlID09IFNUQVRFX0VSUk9SKSB7CisJCURCRyAoIldvbid0IGRpc2FibGUgVURDLiB1ZGNfc3RhdGU9PVNUQVRFX0VSUk9SICFcbiIpOworCQlyZXR1cm47CisJfQorCisJdWRjX2RldmljZSA9IDA7CisKKwlmb3IgKDsgaSA8IE1BWF9FTkRQT0lOVFM7IGkrKykgeworCQlpZiAoZXBfcmVmW2ldLnVyYikgeworCQkJdXNiZF9kZWFsbG9jX3VyYiAoZXBfcmVmW2ldLnVyYik7CisJCQllcF9yZWZbaV0udXJiID0gMDsKKwkJfQorCX0KKworCXVzYnAtPnVzYm1yID0gMHgwMDsKKwl1c2JwLT51c21vZCA9IH5VU01PRF9FTjsKKwl1ZGNfc3RhdGUgPSBTVEFURV9OT1RfUkVBRFk7Cit9CisKKy8qIHVkY19zdGFydHVwX2V2ZW50cworICoKKyAqIEVuYWJsZSB0aGUgc3BlY2lmaWVkIGRldmljZQorICovCit2b2lkIHVkY19zdGFydHVwX2V2ZW50cyAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSkKK3sKKwl1ZGNfZW5hYmxlIChkZXZpY2UpOworCWlmICh1ZGNfc3RhdGUgPT0gU1RBVEVfUkVBRFkpIHsKKwkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxIChkZXZpY2UsIERFVklDRV9DUkVBVEUsIDApOworCX0KK30KKworLyogdWRjX3NldF9uYWsKKyAqCisgKiBBbGxvdyB1cHBlciBsYXllcnMgdG8gc2lnbmFsIGxvd2VyIGxheWVycyBzaG91bGQgbm90IGFjY2VwdCBtb3JlIFJYIGRhdGEKKyAqCisgKi8KK3ZvaWQgdWRjX3NldF9uYWsgKGludCBlcGlkKQoreworCWlmIChlcGlkKSB7CisJCW1wYzh4eF91ZGNfc2V0X25hayAoZXBpZCk7CisJfQorfQorCisvKiB1ZGNfdW5zZXRfbmFrCisgKgorICogU3VzcGVuZCBzZW5kaW5nIG9mIE5BSyB0b2tlbnMgZm9yIERBVEEgT1VUIHRva2VucyBvbiBhIGdpdmVuIGVuZHBvaW50LgorICogU3dpdGNoIG9mZiBOQUtpbmcgb24gdGhpcyBlbmRwb2ludCB0byBhY2NlcHQgbW9yZSBkYXRhIG91dHB1dCBmcm9tIGhvc3QuCisgKgorICovCit2b2lkIHVkY191bnNldF9uYWsgKGludCBlcGlkKQoreworCWlmIChlcGlkID4gTUFYX0VORFBPSU5UUykgeworCQlyZXR1cm47CisJfQorCisJaWYgKHVzYnAtPnVzZXBbZXBpZF0gJiAoVVNFUF9USFNfTkFLIHwgVVNFUF9SSFNfTkFLKSkgeworCQl1c2JwLT51c2VwW2VwaWRdICY9IH4oVVNFUF9USFNfTkFLIHwgVVNFUF9SSFNfTkFLKTsKKwkJX19hc21fXyAoImVpZWlvIik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkgICAgICBTdGF0aWMgTGlua2FnZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB1ZGNfc3RhdGVfdHJhbnNpdGlvbl91cAorICogdWRjX3N0YXRlX3RyYW5zaXRpb25fZG93bgorICoKKyAqIEhlbHBlciBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IGRldmljZSBzdGF0ZSBjaGFuZ2VzLglUaGUgZGV2aWNlIHN0YXRlcyBhbmQKKyAqIHRoZSBldmVudHMgdGhhdCB0cmFuc2l0aW9uIGJldHdlZW4gdGhlbSBhcmU6CisgKgorICoJCQkJU1RBVEVfQVRUQUNIRUQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJREVWSUNFX0hVQl9DT05GSUdVUkVECQkJREVWSUNFX0hVQl9SRVNFVAorICoJCQkJfHwJL1wKKyAqCQkJCVwvCXx8CisgKgkJCQlTVEFURV9QT1dFUkVECisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCURFVklDRV9SRVNFVAkJCQlERVZJQ0VfUE9XRVJfSU5URVJSVVBUSU9OCisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCQkJCVNUQVRFX0RFRkFVTFQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJREVWSUNFX0FERFJFU1NfQVNTSUdORUQJCQlERVZJQ0VfUkVTRVQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJCQkJU1RBVEVfQUREUkVTU0VECisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCURFVklDRV9DT05GSUdVUkVECQkJREVWSUNFX0RFX0NPTkZJR1VSRUQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJCQkJU1RBVEVfQ09ORklHVVJFRAorICoKKyAqIHVkY19zdGF0ZV90cmFuc2l0aW9uX3VwIHRyYW5zaXRpb25zIHVwIChpbiB0aGUgZGlyZWN0aW9uIGZyb20gU1RBVEVfQVRUQUNIRUQKKyAqIHRvIFNUQVRFX0NPTkZJR1VSRUQpIGZyb20gdGhlIHNwZWNpZmllZCBpbml0aWFsIHN0YXRlIHRvIHRoZSBzcGVjaWZpZWQgZmluYWwKKyAqIHN0YXRlLCBwYXNzaW5nIHRocm91Z2ggZWFjaCBpbnRlcm1lZGlhdGUgc3RhdGUgb24gdGhlIHdheS4gIElmIHRoZSBpbml0aWFsCisgKiBzdGF0ZSBpcyBhdCBvciBhYm92ZSAoaS5lLiBuZWFyZXIgdG8gU1RBVEVfQ09ORklHVVJFRCkgdGhlIGZpbmFsIHN0YXRlLCB0aGVuCisgKiBubyBzdGF0ZSB0cmFuc2l0aW9ucyB3aWxsIHRha2UgcGxhY2UuCisgKgorICogdWRjX3N0YXRlX3RyYW5zaXRpb25fZG93biB0cmFuc2l0aW9ucyBkb3duIChpbiB0aGUgZGlyZWN0aW9uIGZyb20KKyAqIFNUQVRFX0NPTkZJR1VSRUQgdG8gU1RBVEVfQVRUQUNIRUQpIGZyb20gdGhlIHNwZWNpZmllZCBpbml0aWFsIHN0YXRlIHRvIHRoZQorICogc3BlY2lmaWVkIGZpbmFsIHN0YXRlLCBwYXNzaW5nIHRocm91Z2ggZWFjaCBpbnRlcm1lZGlhdGUgc3RhdGUgb24gdGhlIHdheS4KKyAqIElmIHRoZSBpbml0aWFsIHN0YXRlIGlzIGF0IG9yIGJlbG93IChpLmUuIG5lYXJlciB0byBTVEFURV9BVFRBQ0hFRCkgdGhlIGZpbmFsCisgKiBzdGF0ZSwgdGhlbiBubyBzdGF0ZSB0cmFuc2l0aW9ucyB3aWxsIHRha2UgcGxhY2UuCisgKgorICovCisKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl91cCAodXNiX2RldmljZV9zdGF0ZV90IGluaXRpYWwsCisJCQkJCSAgICB1c2JfZGV2aWNlX3N0YXRlX3QgZmluYWwpCit7CisJaWYgKGluaXRpYWwgPCBmaW5hbCkgeworCQlzd2l0Y2ggKGluaXRpYWwpIHsKKwkJY2FzZSBTVEFURV9BVFRBQ0hFRDoKKwkJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAodWRjX2RldmljZSwKKwkJCQkJICAgICAgIERFVklDRV9IVUJfQ09ORklHVVJFRCwgMCk7CisJCQlpZiAoZmluYWwgPT0gU1RBVEVfUE9XRVJFRCkKKwkJCQlicmVhazsKKwkJY2FzZSBTVEFURV9QT1dFUkVEOgorCQkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxICh1ZGNfZGV2aWNlLCBERVZJQ0VfUkVTRVQsIDApOworCQkJaWYgKGZpbmFsID09IFNUQVRFX0RFRkFVTFQpCisJCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfREVGQVVMVDoKKwkJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAodWRjX2RldmljZSwKKwkJCQkJICAgICAgIERFVklDRV9BRERSRVNTX0FTU0lHTkVELCAwKTsKKwkJCWlmIChmaW5hbCA9PSBTVEFURV9BRERSRVNTRUQpCisJCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfQUREUkVTU0VEOgorCQkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxICh1ZGNfZGV2aWNlLCBERVZJQ0VfQ09ORklHVVJFRCwKKwkJCQkJICAgICAgIDApOworCQljYXNlIFNUQVRFX0NPTkZJR1VSRUQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX3N0YXRlX3RyYW5zaXRpb25fZG93biAodXNiX2RldmljZV9zdGF0ZV90IGluaXRpYWwsCisJCQkJCSAgICAgIHVzYl9kZXZpY2Vfc3RhdGVfdCBmaW5hbCkKK3sKKwlpZiAoaW5pdGlhbCA+IGZpbmFsKSB7CisJCXN3aXRjaCAoaW5pdGlhbCkgeworCQljYXNlIFNUQVRFX0NPTkZJR1VSRUQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsCisJCQkJCSAgICAgICBERVZJQ0VfREVfQ09ORklHVVJFRCwgMCk7CisJCQlpZiAoZmluYWwgPT0gU1RBVEVfQUREUkVTU0VEKQorCQkJCWJyZWFrOworCQljYXNlIFNUQVRFX0FERFJFU1NFRDoKKwkJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAodWRjX2RldmljZSwgREVWSUNFX1JFU0VULCAwKTsKKwkJCWlmIChmaW5hbCA9PSBTVEFURV9ERUZBVUxUKQorCQkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RFRkFVTFQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsCisJCQkJCSAgICAgICBERVZJQ0VfUE9XRVJfSU5URVJSVVBUSU9OLCAwKTsKKwkJCWlmIChmaW5hbCA9PSBTVEFURV9QT1dFUkVEKQorCQkJCWJyZWFrOworCQljYXNlIFNUQVRFX1BPV0VSRUQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsIERFVklDRV9IVUJfUkVTRVQsCisJCQkJCSAgICAgICAwKTsKKwkJY2FzZSBTVEFURV9BVFRBQ0hFRDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIG1wYzh4eF91ZGNfc3RhbGwKKyAqCisgKiBGb3JjZSByZXR1cm5pbmcgb2YgU1RBTEwgdG9rZW5zIG9uIHRoZSBnaXZlbiBlbmRwb2ludC4gUHJvdG9jb2wgb3IgZnVuY3Rpb24KKyAqIFNUQUxMIGNvbmRpdGlvbnMgYXJlIHBlcm1pc3NhYmxlIGhlcmUKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19zdGFsbCAodW5zaWduZWQgaW50IGVwKQoreworCXVzYnAtPnVzZXBbZXBdIHw9IFNUQUxMX0JJVE1BU0s7Cit9CisKKy8qIG1wYzh4eF91ZGNfc2V0X25haworICoKKyAqIEZvcmNlIHJldHVybmluZyBvZiBOQUsgcmVzcG9uc2VzIGZvciB0aGUgZ2l2ZW4gZW5kcG9pbnQgYXMgYSBraW5kIG9mIHZlcnkKKyAqIHNpbXBsZSBmbG93IGNvbnRyb2wKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19zZXRfbmFrICh1bnNpZ25lZCBpbnQgZXApCit7CisJdXNicC0+dXNlcFtlcF0gfD0gTkFLX0JJVE1BU0s7CisJX19hc21fXyAoImVpZWlvIik7Cit9CisKKy8qIG1wYzh4eF91ZGNfaGFuZGxlX3R4ZXJyCisgKgorICogSGFuZGxlIGVycm9ycyByZWxldmFudCB0byBUWC4gUmV0dXJuIGEgc3RhdHVzIGNvZGUgdG8gYWxsb3cgY2FsbGluZworICogaW5kaWNhdGl2ZSBvZiB3aGF0IGlmIGFueXRoaW5nIGhhcHBlbmVkCisgKi8KK3N0YXRpYyBzaG9ydCBtcGM4eHhfdWRjX2hhbmRsZV90eGVyciAoKQoreworCXNob3J0IGVwID0gMCwgcmV0ID0gMDsKKworCWZvciAoOyBlcCA8IFRYX1JJTkdfU0laRTsgZXArKykgeworCQlpZiAodXNicC0+dXNiZXIgJiAoMHgxMCA8PCBlcCkpIHsKKworCQkJLyogVGltZW91dCBvciB1bmRlcnJ1biAqLworCQkJaWYgKHR4X2NiZFtlcF0tPmNiZF9zYyAmIDB4MDYpIHsKKwkJCQlyZXQgPSAxOworCQkJCW1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbyAoZXApOworCisJCQl9IGVsc2UgeworCQkJCWlmICh1c2JwLT51c2VwW2VwXSAmIFNUQUxMX0JJVE1BU0spIHsKKwkJCQkJaWYgKCFlcCkgeworCQkJCQkJdXNicC0+dXNlcFtlcF0gJj0gflNUQUxMX0JJVE1BU0s7CisJCQkJCX0KKwkJCQl9CS8qIGVsc2UgTkFLICovCisJCQl9CisJCQl1c2JwLT51c2JlciB8PSAoMHgxMCA8PCBlcCk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogbXBjOHh4X3VkY19hZHZhbmNlX3J4CisgKgorICogQWR2YW5jZSBjYmQgcngKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19hZHZhbmNlX3J4ICh2b2xhdGlsZSBjYmRfdCAqKiByeF9jYmRwLCBpbnQgZXBpZCkKK3sKKwlpZiAoKCpyeF9jYmRwKS0+Y2JkX3NjICYgUlhfQkRfVykgeworCQkqcnhfY2JkcCA9ICh2b2xhdGlsZSBjYmRfdCAqKSAoZW5kcG9pbnRzW2VwaWRdLT5yYmFzZSArIENGR19JTU1SKTsKKworCX0gZWxzZSB7CisJCSgqcnhfY2JkcCkrKzsKKwl9Cit9CisKKworLyogbXBjOHh4X3VkY19mbHVzaF90eF9maWZvCisgKgorICogRmx1c2ggYSBnaXZlbiBUWCBmaWZvLiBBc3N1bWVzIG9uZSB0eCBjYmQgcGVyIGVuZHBvaW50CisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbyAoaW50IGVwaWQpCit7CisJdm9sYXRpbGUgY2JkX3QgKnR4X2NiZHAgPSAwOworCisJaWYgKGVwaWQgPiBNQVhfRU5EUE9JTlRTKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBUWCBzdG9wICovCisJaW1tci0+aW1fY3BtLmNwX2NwY3IgPSAoKGVwaWQgPDwgMikgfCAweDFEMDEpOworCV9fYXNtX18gKCJlaWVpbyIpOworCXdoaWxlIChpbW1yLT5pbV9jcG0uY3BfY3BjciAmIDB4MDEpOworCisJdXNicC0+dXNjb20gPSAweDQwIHwgMDsKKworCS8qIHJlc2V0IHJpbmcgKi8KKwl0eF9jYmRwID0gKGNiZF90ICopIChlbmRwb2ludHNbZXBpZF0tPnRicHRyICsgQ0ZHX0lNTVIpOworCXR4X2NiZHAtPmNiZF9zYyA9IChUWF9CRF9JIHwgVFhfQkRfVyk7CisKKworCWVuZHBvaW50c1tlcGlkXS0+dHB0ciA9IGVuZHBvaW50c1tlcGlkXS0+dGJhc2U7CisJZW5kcG9pbnRzW2VwaWRdLT50c3RhdGUgPSAweDAwOworCWVuZHBvaW50c1tlcGlkXS0+dGJjbnQgPSAweDAwOworCisJLyogVFggc3RhcnQgKi8KKwlpbW1yLT5pbV9jcG0uY3BfY3BjciA9ICgoZXBpZCA8PCAyKSB8IDB4MkQwMSk7CisJX19hc21fXyAoImVpZWlvIik7CisJd2hpbGUgKGltbXItPmltX2NwbS5jcF9jcGNyICYgMHgwMSk7CisKKwlyZXR1cm47Cit9CisKKy8qIG1wYzh4eF91ZGNfZmx1c2hfcnhfZmlmbworICoKKyAqIEZvciB0aGUgc2FrZSBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIG5hbWVzcGFjZSwgaXQgc2VlbXMgbGlrZQorICogYSBnb29kLWRlc2lnbi1kZWNpc2lvbiAodG0pIHRvIGluY2x1ZGUgbXBjOHh4X3VkY19mbHVzaF9yeF9maWZvKCk7CisgKiBJZiBSWF9CRF9FIGlzIHRydWUgPT4gYSBkcml2ZXIgYnVnIGVpdGhlciBoZXJlIG9yIGluIGFuIHVwcGVyIGxheWVyCisgKiBub3QgcG9sbGluZyBmcmVxdWVudGx5IGVub3VnaC4gSWYgUlhfQkRfRSBpcyB0cnVlIHdlIGhhdmUgdG9sZCB0aGUgaG9zdAorICogd2UgaGF2ZSBhY2NlcHRlZCBkYXRhIGJ1dCwgdGhlIENQTSBmb3VuZCBpdCBoYWQgbm8td2hlcmUgdG8gcHV0IHRoYXQgZGF0YQorICogd2hpY2ggbmVlZGxlc3MgdG8gc2F5IHdvdWxkIGJlIGEgYmFkIHRoaW5nLgorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2ZsdXNoX3J4X2ZpZm8gKCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKCEocnhfY2JkW2ldLT5jYmRfc2MgJiBSWF9CRF9FKSkgeworCQkJRVJSICgiYnVmICVwIHVzZWQgcnggZGF0YSBsZW4gPSAweCV4IHNjPTB4JXghXG4iLAorCQkJICAgICByeF9jYmRbaV0sIHJ4X2NiZFtpXS0+Y2JkX2RhdGxlbiwKKwkJCSAgICAgcnhfY2JkW2ldLT5jYmRfc2MpOworCisJCX0KKwl9CisJRVJSICgiQlVHIDogSW5wdXQgb3Zlci1ydW5cbiIpOworfQorCisvKiBtcGM4eHhfdWRjX2NsZWFyX3J4YmQKKyAqCisgKiBSZWxlYXNlIGNvbnRyb2wgb2YgUlggQ0JEIHRvIENQLgorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NsZWFyX3J4YmQgKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCkKK3sKKwlyeF9jYmRwLT5jYmRfZGF0bGVuID0gMHgwMDAwOworCXJ4X2NiZHAtPmNiZF9zYyA9ICgocnhfY2JkcC0+Y2JkX3NjICYgUlhfQkRfVykgfCAoUlhfQkRfRSB8IFJYX0JEX0kpKTsKKwlfX2FzbV9fICgiZWllaW8iKTsKK30KKworLyogbXBjOHh4X3VkY190eF9pcnEKKyAqCisgKiBQYXJzZSBmb3IgdHggdGltZW91dCwgY29udHJvbCBSWCBvciBVU0IgcmVzZXQvYnVzeSBjb25kaXRpb25zCisgKiBSZXR1cm4gLTEgb24gdGltZW91dCwgLTIgb24gZmF0YWwgZXJyb3IsIGVsc2UgcmV0dXJuIHplcm8KKyAqLworc3RhdGljIGludCBtcGM4eHhfdWRjX3R4X2lycSAoaW50IGVwKQoreworCWludCBpID0gMDsKKworCWlmICh1c2JwLT51c2JlciAmIChVU0JfVFhfRVJSTUFTSykpIHsKKwkJaWYgKG1wYzh4eF91ZGNfaGFuZGxlX3R4ZXJyICgpKSB7CisJCQkvKiBUaW1lb3V0LCBjb250cm9sbGluZyBmdW5jdGlvbiBtdXN0IHJldHJ5IHNlbmQgKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmICh1c2JwLT51c2JlciAmIChVU0JfRV9SRVNFVCB8IFVTQl9FX0JTWSkpIHsKKwkJLyogRmF0YWwsIGFiYW5kb24gVFggdHJhbnNhY3Rpb24gKi8KKwkJcmV0dXJuIC0yOworCX0KKworCWlmICh1c2JwLT51c2JlciAmIFVTQl9FX1JYQikgeworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCWlmICghKHJ4X2NiZFtpXS0+Y2JkX3NjICYgUlhfQkRfRSkpIHsKKwkJCQlpZiAoKHJ4X2NiZFtpXSA9PSBlcF9yZWZbMF0ucHJ4KSB8fCBlcCkgeworCQkJCQlyZXR1cm4gLTI7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIG1wYzh4eF91ZGNfZXBfdHgKKyAqCisgKiBUcmFuc21pdCBpbiBhIHJlLWVudHJhbnQgZmFzaGlvbiBvdXRib3VuZCBVU0IgcGFja2V0cy4KKyAqIEltcGxlbWVudCByZXRyeS90aW1lb3V0IG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gVVNCIHNwZWNpZmljYXRpb24KKyAqIFRvZ2dsZSBEQVRBMC9EQVRBMSBwaWRzIGFzIG5lY2Vzc2FyeQorICogSW50cm9kdWNlcyBub24tc3RhbmRhcmQgdHhfcmV0cnkuIFRoZSBVU0Igc3RhbmRhcmQgaGFzIG5vIHNjb3BlIGZvciBzbGF2ZQorICogZGV2aWNlcyB0byBnaXZlIHVwIFRYLCBob3dldmVyIHR4X3JldHJ5IHN0b3BzIHVzIGdldHRpbmcgc3R1Y2sgaW4gYW4gZW5kbGVzcworICogVFggbG9vcC4KKyAqLworc3RhdGljIGludCBtcGM4eHhfdWRjX2VwX3R4IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplcGkpCit7CisJc3RydWN0IHVyYiAqdXJiID0gZXBpLT50eF91cmI7CisJdm9sYXRpbGUgY2JkX3QgKnR4X2NiZHAgPSAwOworCXVuc2lnbmVkIGludCBlcCA9IDAsIHBrdF9sZW4gPSAwLCB4ID0gMCwgdHhfcmV0cnkgPSAwOworCWludCByZXQgPSAwOworCisJaWYgKCFlcGkgfHwgKGVwaS0+ZW5kcG9pbnRfYWRkcmVzcyAmIDB4MDMpID49IE1BWF9FTkRQT0lOVFMgfHwgIXVyYikgeworCQlyZXR1cm4gLTE7CisJfQorCisJZXAgPSBlcGktPmVuZHBvaW50X2FkZHJlc3MgJiAweDAzOworCXR4X2NiZHAgPSAoY2JkX3QgKikgKGVuZHBvaW50c1tlcF0tPnRicHRyICsgQ0ZHX0lNTVIpOworCisJaWYgKHR4X2NiZHAtPmNiZF9zYyAmIFRYX0JEX1IgfHwgdXNicC0+dXNiZXIgJiBVU0JfRV9UWEIpIHsKKwkJbXBjOHh4X3VkY19mbHVzaF90eF9maWZvIChlcCk7CisJCXVzYnAtPnVzYmVyIHw9IFVTQl9FX1RYQjsKKwl9OworCisJd2hpbGUgKHR4X3JldHJ5KysgPCAxMDApIHsKKwkJcmV0ID0gbXBjOHh4X3VkY190eF9pcnEgKGVwKTsKKwkJaWYgKHJldCA9PSAtMSkgeworCQkJLyogaWdub3JlIHRpbWVvdXQgaGVyZSAqLworCQl9IGVsc2UgaWYgKHJldCA9PSAtMikgeworCQkJLyogQWJhbmRvbiBUWCAqLworCQkJbXBjOHh4X3VkY19mbHVzaF90eF9maWZvIChlcCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl0eF9jYmRwID0gKGNiZF90ICopIChlbmRwb2ludHNbZXBdLT50YnB0ciArIENGR19JTU1SKTsKKwkJd2hpbGUgKHR4X2NiZHAtPmNiZF9zYyAmIFRYX0JEX1IpIHsKKwkJfTsKKwkJdHhfY2JkcC0+Y2JkX3NjID0gKHR4X2NiZHAtPmNiZF9zYyAmIFRYX0JEX1cpOworCisJCXBrdF9sZW4gPSB1cmItPmFjdHVhbF9sZW5ndGggLSBlcGktPnNlbnQ7CisKKwkJaWYgKHBrdF9sZW4gPiBlcGktPnR4X3BhY2tldFNpemUgfHwgcGt0X2xlbiA+IEVQX01BWF9QS1QpIHsKKwkJCXBrdF9sZW4gPSBNSU4gKGVwaS0+dHhfcGFja2V0U2l6ZSwgRVBfTUFYX1BLVCk7CisJCX0KKworCQlmb3IgKHggPSAwOyB4IDwgcGt0X2xlbjsgeCsrKSB7CisJCQkqKCh1bnNpZ25lZCBjaGFyICopICh0eF9jYmRwLT5jYmRfYnVmYWRkciArIHgpKSA9CisJCQkJdXJiLT5idWZmZXJbZXBpLT5zZW50ICsgeF07CisJCX0KKwkJdHhfY2JkcC0+Y2JkX2RhdGxlbiA9IHBrdF9sZW47CisJCXR4X2NiZHAtPmNiZF9zYyB8PSAoQ0JEX1RYX0JJVE1BU0sgfCBlcF9yZWZbZXBdLnBpZCk7CisJCV9fYXNtX18gKCJlaWVpbyIpOworCisjaWZkZWYgX19TSU1VTEFURV9FUlJPUl9fCisJCWlmICgrK2Vycl9wb2lzb25fdGVzdCA9PSAyKSB7CisJCQllcnJfcG9pc29uX3Rlc3QgPSAwOworCQkJdHhfY2JkcC0+Y2JkX3NjICY9IH5UWF9CRF9UQzsKKwkJfQorI2VuZGlmCisKKwkJdXNicC0+dXNjb20gPSAoVVNDT01fU1RSIHwgZXApOworCisJCXdoaWxlICghKHVzYnAtPnVzYmVyICYgVVNCX0VfVFhCKSkgeworCQkJcmV0ID0gbXBjOHh4X3VkY190eF9pcnEgKGVwKTsKKwkJCWlmIChyZXQgPT0gLTEpIHsKKwkJCQkvKiBUWCB0aW1lb3V0ICovCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHJldCA9PSAtMikgeworCQkJCWlmICh1c2JwLT51c2JlciAmIFVTQl9FX1RYQikgeworCQkJCQl1c2JwLT51c2JlciB8PSBVU0JfRV9UWEI7CisJCQkJfQorCQkJCW1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbyAoZXApOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfTsKKworCQlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9UWEIpIHsKKwkJCXVzYnAtPnVzYmVyIHw9IFVTQl9FX1RYQjsKKwkJfQorCisJCS8qIEFDSyBtdXN0IGJlIHByZXNlbnQgPD0gMThiaXQgdGltZXMgZnJvbSBUWCAqLworCQlpZiAocmV0ID09IC0xKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRYIEFDSyA6IFVTQiAyLjAgOC43LjIsIFRvZ2dsZSBQSUQsIEFkdmFuY2UgVFggKi8KKwkJZXBpLT5zZW50ICs9IHBrdF9sZW47CisJCWVwaS0+bGFzdCA9IE1JTiAodXJiLT5hY3R1YWxfbGVuZ3RoIC0gZXBpLT5zZW50LCBlcGktPnR4X3BhY2tldFNpemUpOworCQlUT0dHTEVfVFhfUElEIChlcF9yZWZbZXBdLnBpZCk7CisKKwkJaWYgKGVwaS0+c2VudCA+PSBlcGktPnR4X3VyYi0+YWN0dWFsX2xlbmd0aCkgeworCisJCQllcGktPnR4X3VyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJCQllcGktPnNlbnQgPSAwOworCisJCQlpZiAoZXBfcmVmW2VwXS5zYyAmIEVQX1NFTkRfWkxQKSB7CisJCQkJZXBfcmVmW2VwXS5zYyAmPSB+RVBfU0VORF9aTFA7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJRVJSICgiVFggZmFpbCwgZW5kcG9pbnQgMHgleCB0eCBieXRlcyAweCV4LzB4JXhcbiIsIGVwLCBlcGktPnNlbnQsCisJICAgICBlcGktPnR4X3VyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIG1wYzh4eF91ZGNfZHVtcF9yZXF1ZXN0CisgKgorICogRHVtcCBhIGNvbnRyb2wgcmVxdWVzdCB0byBjb25zb2xlCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZHVtcF9yZXF1ZXN0IChzdHJ1Y3QgdXNiX2RldmljZV9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCURCRyAoImJtUmVxdWVzdFR5cGU6JTAyeCBiUmVxdWVzdDolMDJ4IHdWYWx1ZTolMDR4ICIKKwkgICAgICJ3SW5kZXg6JTA0eCB3TGVuZ3RoOiUwNHggP1xuIiwKKwkgICAgIHJlcXVlc3QtPmJtUmVxdWVzdFR5cGUsCisJICAgICByZXF1ZXN0LT5iUmVxdWVzdCwKKwkgICAgIHJlcXVlc3QtPndWYWx1ZSwgcmVxdWVzdC0+d0luZGV4LCByZXF1ZXN0LT53TGVuZ3RoKTsKKworCXJldHVybjsKK30KKworLyogbXBjOHh4X3VkY19lcDBfcnhfc2V0dXAKKyAqCisgKiBEZWNvZGUgcmVjZWl2ZWQgZXAwIFNFVFVQIHBhY2tldC4gcmV0dXJuIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcDBfcnhfc2V0dXAgKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCkKK3sKKwl1bnNpZ25lZCBpbnQgeCA9IDA7CisJc3RydWN0IHVyYiAqcHVyYiA9IGVwX3JlZlswXS51cmI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpID0KKwkJJnVkY19kZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXlbMF07CisKKwlmb3IgKDsgeCA8IHJ4X2NiZHAtPmNiZF9kYXRsZW47IHgrKykgeworCQkqKCgodW5zaWduZWQgY2hhciAqKSAmZXBfcmVmWzBdLnVyYi0+ZGV2aWNlX3JlcXVlc3QpICsgeCkgPQorCQkJKigodW5zaWduZWQgY2hhciAqKSAocnhfY2JkcC0+Y2JkX2J1ZmFkZHIgKyB4KSk7CisJfQorCisJbXBjOHh4X3VkY19jbGVhcl9yeGJkIChyeF9jYmRwKTsKKworCWlmIChlcDBfcmVjdl9zZXR1cCAocHVyYikpIHsKKwkJbXBjOHh4X3VkY19kdW1wX3JlcXVlc3QgKCZwdXJiLT5kZXZpY2VfcmVxdWVzdCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKHB1cmItPmRldmljZV9yZXF1ZXN0LmJtUmVxdWVzdFR5cGUgJiBVU0JfUkVRX0RJUkVDVElPTl9NQVNLKQorCSAgICA9PSBVU0JfUkVRX0hPU1QyREVWSUNFKSB7CisKKwkJc3dpdGNoIChwdXJiLT5kZXZpY2VfcmVxdWVzdC5iUmVxdWVzdCkgeworCQljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCQkvKiBTZW5kIHRoZSBTdGF0dXMgT1VUIFpMUCAqLworCQkJZXBfcmVmWzBdLnBpZCA9IFRYX0JEX1BJRF9EQVRBMTsKKwkJCXB1cmItPmFjdHVhbF9sZW5ndGggPSAwOworCQkJbXBjOHh4X3VkY19pbml0X3R4IChlcGksIHB1cmIpOworCQkJbXBjOHh4X3VkY19lcF90eCAoZXBpKTsKKworCQkJLyogTW92ZSB0byB0aGUgYWRkcmVzc2VkIHN0YXRlICovCisJCQl1c2JwLT51c2FkZHIgPSB1ZGNfZGV2aWNlLT5hZGRyZXNzOworCQkJbXBjOHh4X3VkY19zdGF0ZV90cmFuc2l0aW9uX3VwICh1ZGNfZGV2aWNlLT5kZXZpY2Vfc3RhdGUsCisJCQkJCQkJU1RBVEVfQUREUkVTU0VEKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjoKKwkJCWlmICghcHVyYi0+ZGV2aWNlX3JlcXVlc3Qud1ZhbHVlKSB7CisJCQkJLyogUmVzcG9uZCBhdCBkZWZhdWx0IGFkZHJlc3MgKi8KKwkJCQl1c2JwLT51c2FkZHIgPSAweDAwOworCQkJCW1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl9kb3duICh1ZGNfZGV2aWNlLT5kZXZpY2Vfc3RhdGUsCisJCQkJCQkJCSAgU1RBVEVfQUREUkVTU0VEKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVE9ETzogU3VwcG9ydCBtdWx0aXBsZSBjb25maWd1cmF0aW9ucyAqLworCQkJCW1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl91cCAodWRjX2RldmljZS0+ZGV2aWNlX3N0YXRlLAorCQkJCQkJCQlTVEFURV9DT05GSUdVUkVEKTsKKwkJCQlmb3IgKHggPSAxOyB4IDwgTUFYX0VORFBPSU5UUzsgeCsrKSB7CisJCQkJCWlmICgodWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJheVt4XS5lbmRwb2ludF9hZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorCQkJCQkgICAgPT0gVVNCX0RJUl9JTikgeworCQkJCQkJZXBfcmVmW3hdLnBpZCA9IFRYX0JEX1BJRF9EQVRBMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVwX3JlZlt4XS5waWQgPSBSWF9CRF9QSURfREFUQTA7CisJCQkJCX0KKwkJCQkJLyogU2V0IGNvbmZpZ3VyYXRpb24gbXVzdCB1bnN0YWxsIGVuZHBvaW50cyAqLworCQkJCQl1c2JwLT51c2VwW3hdICY9IH5TVEFMTF9CSVRNQVNLOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogQ0RDL1ZlbmRvciBzcGVjaWZpYyAqLworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTZW5kIFpMUCBhcyBBQ0sgaW4gU3RhdHVzIE9VVCBwaGFzZSAqLworCQllcF9yZWZbMF0ucGlkID0gVFhfQkRfUElEX0RBVEExOworCQlwdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJbXBjOHh4X3VkY19pbml0X3R4IChlcGksIHB1cmIpOworCQltcGM4eHhfdWRjX2VwX3R4IChlcGkpOworCisJfSBlbHNlIHsKKworCQlpZiAocHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQkJZXBfcmVmWzBdLnBpZCA9IFRYX0JEX1BJRF9EQVRBMTsKKwkJCW1wYzh4eF91ZGNfaW5pdF90eCAoZXBpLCBwdXJiKTsKKworCQkJaWYgKCEocHVyYi0+YWN0dWFsX2xlbmd0aCAlIEVQMF9NQVhfUEFDS0VUX1NJWkUpKSB7CisJCQkJZXBfcmVmWzBdLnNjIHw9IEVQX1NFTkRfWkxQOworCQkJfQorCisJCQlpZiAocHVyYi0+ZGV2aWNlX3JlcXVlc3Qud1ZhbHVlID09CisJCQkgICAgVVNCX0RFU0NSSVBUT1JfVFlQRV9ERVZJQ0UpIHsKKwkJCQlpZiAobGUxNl90b19jcHUgKHB1cmItPmRldmljZV9yZXF1ZXN0LndMZW5ndGgpCisJCQkJICAgID4gcHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQkJCQkvKiBTZW5kIEVQMF9NQVhfUEFDS0VUX1NJWkUgYnl0ZXMKKwkJCQkJICogdW5sZXNzIGNvcnJlY3Qgc2l6ZSByZXF1ZXN0ZWQuCisJCQkJCSAqLworCQkJCQlpZiAocHVyYi0+YWN0dWFsX2xlbmd0aCA+IGVwaS0+dHhfcGFja2V0U2l6ZSkgeworCQkJCQkJcHVyYi0+YWN0dWFsX2xlbmd0aCA9IGVwaS0+dHhfcGFja2V0U2l6ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCW1wYzh4eF91ZGNfZXBfdHggKGVwaSk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIENvcnJ1cHQgU0VUVVAgcGFja2V0PyAqLworCQkJRVJSICgiWmVybyBsZW5ndGggZGF0YSBvciBTRVRVUCB3aXRoIERBVEEtSU4gcGhhc2UgP1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogbXBjOHh4X3VkY19pbml0X3R4CisgKgorICogU2V0dXAgc29tZSBiYXNpYyBwYXJhbWV0ZXJzIGZvciBhIFRYIHRyYW5zYWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfaW5pdF90eCAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpLAorCQkJCXN0cnVjdCB1cmIgKnR4X3VyYikKK3sKKwllcGktPnNlbnQgPSAwOworCWVwaS0+bGFzdCA9IDA7CisJZXBpLT50eF91cmIgPSB0eF91cmI7Cit9CisKKy8qIG1wYzh4eF91ZGNfZXAwX3J4CisgKgorICogUmVjZWl2ZSBlcDAvY29udHJvbCBVU0IgZGF0YS4gUGFyc2UgYW5kIHBvc3NpYmx5IHNlbmQgYSByZXNwb25zZS4KKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19lcDBfcnggKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCkKK3sKKwlpZiAocnhfY2JkcC0+Y2JkX3NjICYgUlhfQkRfUElEX1NFVFVQKSB7CisKKwkJLyogVW5jb25kaXRpb25hbGx5IGFjY2VwdCBTRVRVUCBwYWNrZXRzICovCisJCWlmIChtcGM4eHhfdWRjX2VwMF9yeF9zZXR1cCAocnhfY2JkcCkpIHsKKwkJCW1wYzh4eF91ZGNfc3RhbGwgKDApOworCQl9CisKKwl9IGVsc2UgeworCisJCW1wYzh4eF91ZGNfY2xlYXJfcnhiZCAocnhfY2JkcCk7CisKKwkJaWYgKChyeF9jYmRwLT5jYmRfZGF0bGVuIC0gMikpIHsKKwkJCS8qIFNFVFVQIHdpdGggYSBEQVRBIHBoYXNlCisJCQkgKiBvdXRzaWRlIG9mIFNFVFVQIHBhY2tldC4KKwkJCSAqIFJlcGx5IHdpdGggU1RBTEwuCisJCQkgKi8KKwkJCW1wYzh4eF91ZGNfc3RhbGwgKDApOworCQl9CisJfQorfQorCisvKiBtcGM4eHhfdWRjX2Vwbl9yeAorICoKKyAqIFJlY2VpdmUgc29tZSBkYXRhIGZyb20gY2JkIGludG8gVVNCIHN5c3RlbSB1cmIgZGF0YSBhYnN0cmFjdGlvbgorICogVXBwZXIgbGF5ZXJzIHNob3VsZCBOQUsgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IFJYIGRhdGEgc3BhY2UKKyAqLworc3RhdGljIGludCBtcGM4eHhfdWRjX2Vwbl9yeCAodW5zaWduZWQgaW50IGVwaWQsIHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCkKK3sKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplcGkgPSAwOworCXN0cnVjdCB1cmIgKnVyYiA9IDA7CisJdW5zaWduZWQgaW50IHggPSAwOworCisJaWYgKGVwaWQgPj0gTUFYX0VORFBPSU5UUyB8fCAhcnhfY2JkcC0+Y2JkX2RhdGxlbikgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVU0IgMi4wIFBERiBzZWN0aW9uIDguNi40CisJICogRGlzY2FyZCBkYXRhIHdpdGggaW52YWxpZCBQSUQgaXQgaXMgYSByZXNlbmQuCisJICovCisJaWYgKGVwX3JlZltlcGlkXS5waWQgIT0gKHJ4X2NiZHAtPmNiZF9zYyAmIDB4QzApKSB7CisJCXJldHVybiAxOworCX0KKwlUT0dHTEVfUlhfUElEIChlcF9yZWZbZXBpZF0ucGlkKTsKKworCWVwaSA9ICZ1ZGNfZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5W2VwaWRdOworCXVyYiA9IGVwaS0+cmN2X3VyYjsKKworCWZvciAoOyB4IDwgKHJ4X2NiZHAtPmNiZF9kYXRsZW4gLSAyKTsgeCsrKSB7CisJCSooKHVuc2lnbmVkIGNoYXIgKikgKHVyYi0+YnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoICsgeCkpID0KKwkJCSooKHVuc2lnbmVkIGNoYXIgKikgKHJ4X2NiZHAtPmNiZF9idWZhZGRyICsgeCkpOworCX0KKworCWlmICh4KSB7CisJCXVzYmRfcmN2X2NvbXBsZXRlIChlcGksIHgsIDApOworCQlpZiAoZXBfcmVmW2VwaWRdLnVyYi0+c3RhdHVzID09IFJFQ1ZfRVJST1IpIHsKKwkJCURCRyAoIlJYIGVycm9yIHVuc2V0IE5BS1xuIik7CisJCQl1ZGNfdW5zZXRfbmFrIChlcGlkKTsKKwkJfQorCX0KKwlyZXR1cm4geDsKK30KKworLyogbXBjOHh4X3VkY19jbG9ja19pbml0CisgKgorICogT2J0YWluIGEgY2xvY2sgcmVmZXJlbmNlIGZvciBGdWxsIFNwZWVkIFNpZ25hbGluZworICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2Nsb2NrX2luaXQgKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yLAorCQkJCSAgIHZvbGF0aWxlIGNwbTh4eF90ICogY3ApCit7CisKKyNpZiBkZWZpbmVkKENGR19VU0JfRVhUQ19DTEspCisKKwkvKiBUaGlzIGhhcyBiZWVuIHRlc3RlZCB3aXRoIGEgNDhNSHogY3J5c3RhbCBvbiBDTEs2ICovCisJc3dpdGNoIChDRkdfVVNCX0VYVENfQ0xLKSB7CisJY2FzZSAxOgorCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9IDB4MDEwMDsKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+MHgwMTAwOworCQljcC0+Y3Bfc2ljciB8PSAweDI0OworCQlicmVhazsKKwljYXNlIDI6CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gMHgwMjAwOworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4weDAyMDA7CisJCWNwLT5jcF9zaWNyIHw9IDB4MkQ7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAweDA0MDA7CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgJj0gfjB4MDQwMDsKKwkJY3AtPmNwX3NpY3IgfD0gMHgzNjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9IDB4MDgwMDsKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+MHgwODAwOworCQljcC0+Y3Bfc2ljciB8PSAweDNGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisjZWxpZiBkZWZpbmVkKENGR19VU0JfQlJHQ0xLKQorCisJLyogVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBicmdjbGsgPT0gNTBNSHogKi8KKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwlpbnQgZGl2aXNvciA9IDA7CisKKwlpZiAoZ2QtPmNwdV9jbGsgPCA0ODAwMDAwMEwpIHsKKwkJRVJSICgiYnJnY2xrIGlzIHRvbyBzbG93IGZvciBmdWxsLXNwZWVkIFVTQiFcbiIpOworCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCS8qIEFzc3VtZSB0aGUgYnJnY2xrIGlzICdnb29kIGVub3VnaCcsIHdlIHdhbnQgIShnZC0+Y3B1X2NsayU0OE1oeikKKwkgKiBidXQsIGNhbiAvcHJvYmFibHkvIGxpdmUgd2l0aCBjbG9zZS1pc2ggYWx0ZXJuYXRpdmUgcmF0ZXMuCisJICovCisJZGl2aXNvciA9IChnZC0+Y3B1X2NsayAvIDQ4MDAwMDAwTCkgLSAxOworCWNwLT5jcF9zaWNyICY9IH4weDAwMDAwMDNGOworCisJc3dpdGNoIChDRkdfVVNCX0JSR0NMSykgeworCWNhc2UgMToKKwkJY3AtPmNwX2JyZ2MxIHw9IChkaXZpc29yIHwgQ1BNX0JSR19FTik7CisJCWNwLT5jcF9zaWNyICY9IH4weDJGOworCQlicmVhazsKKwljYXNlIDI6CisJCWNwLT5jcF9icmdjMiB8PSAoZGl2aXNvciB8IENQTV9CUkdfRU4pOworCQljcC0+Y3Bfc2ljciB8PSAweDAwMDAwMDA5OworCQlicmVhazsKKwljYXNlIDM6CisJCWNwLT5jcF9icmdjMyB8PSAoZGl2aXNvciB8IENQTV9CUkdfRU4pOworCQljcC0+Y3Bfc2ljciB8PSAweDAwMDAwMDEyOworCQlicmVhazsKKwljYXNlIDQ6CisJCWNwLT5jcF9icmdjNCA9IChkaXZpc29yIHwgQ1BNX0JSR19FTik7CisJCWNwLT5jcF9zaWNyIHw9IDB4MDAwMDAwMUI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVkY19zdGF0ZSA9IFNUQVRFX0VSUk9SOworCQlicmVhazsKKwl9CisKKyNlbHNlCisjZXJyb3IgIkNGR19VU0JfRVhUQ19DTEsgb3IgQ0ZHX1VTQl9CUkdDTEsgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKK30KKworLyogbXBjOHh4X3VkY19jYmRfYXR0YWNoCisgKgorICogYXR0YWNoIGEgY2JkIHRvIGFuZCBlbmRwb2ludAorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGludCBlcCwgdWNoYXIgdHhfc2l6ZSwgdWNoYXIgcnhfc2l6ZSkKK3sKKworCWlmICghdHhfY2JkW2VwXSB8fCAhcnhfY2JkW2VwXSB8fCBlcCA+PSBNQVhfRU5EUE9JTlRTKSB7CisJCXVkY19zdGF0ZSA9IFNUQVRFX0VSUk9SOworCQlyZXR1cm47CisJfQorCisJaWYgKHR4X3NpemUgPiBVU0JfTUFYX1BLVCB8fCByeF9zaXplID4gVVNCX01BWF9QS1QgfHwKKwkgICAgKCF0eF9zaXplICYmICFyeF9zaXplKSkgeworCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCS8qIEF0dGFjaCBDQkQgdG8gYXBwcm9waWF0ZSBQYXJhbWV0ZXIgUkFNIEVuZHBvaW50IGRhdGEgc3RydWN0dXJlICovCisJaWYgKHJ4X3NpemUpIHsKKwkJZW5kcG9pbnRzW2VwXS0+cmJhc2UgPSAodTMyKSByeF9jYmRbcnhfY3RdOworCQllbmRwb2ludHNbZXBdLT5yYnB0ciA9ICh1MzIpIHJ4X2NiZFtyeF9jdF07CisJCXJ4X2N0Kys7CisKKwkJaWYgKCFlcCkgeworCisJCQllbmRwb2ludHNbZXBdLT5yYnB0ciA9ICh1MzIpIHJ4X2NiZFtyeF9jdF07CisJCQlyeF9jYmRbcnhfY3RdLT5jYmRfc2MgfD0gUlhfQkRfVzsKKwkJCXJ4X2N0Kys7CisKKwkJfSBlbHNlIHsKKwkJCXJ4X2N0ICs9IDI7CisJCQllbmRwb2ludHNbZXBdLT5yYnB0ciA9ICh1MzIpIHJ4X2NiZFtyeF9jdF07CisJCQlyeF9jYmRbcnhfY3RdLT5jYmRfc2MgfD0gUlhfQkRfVzsKKwkJCXJ4X2N0Kys7CisJCX0KKworCQkvKiBXaGVyZSB3ZSBleHBlY3QgdG8gUlggZGF0YSBvbiB0aGlzIGVuZHBvaW50ICovCisJCWVwX3JlZltlcF0ucHJ4ID0gcnhfY2JkW3J4X2N0IC0gMV07CisJfSBlbHNlIHsKKworCQllcF9yZWZbZXBdLnByeCA9IDA7CisJCWVuZHBvaW50c1tlcF0tPnJiYXNlID0gMDsKKwkJZW5kcG9pbnRzW2VwXS0+cmJwdHIgPSAwOworCX0KKworCWlmICh0eF9zaXplKSB7CisJCWVuZHBvaW50c1tlcF0tPnRiYXNlID0gKHUzMikgdHhfY2JkW3R4X2N0XTsKKwkJZW5kcG9pbnRzW2VwXS0+dGJwdHIgPSAodTMyKSB0eF9jYmRbdHhfY3RdOworCQl0eF9jdCsrOworCX0gZWxzZSB7CisJCWVuZHBvaW50c1tlcF0tPnRiYXNlID0gMDsKKwkJZW5kcG9pbnRzW2VwXS0+dGJwdHIgPSAwOworCX0KKworCWVuZHBvaW50c1tlcF0tPnRzdGF0ZSA9IDA7CisJZW5kcG9pbnRzW2VwXS0+dGJjbnQgPSAwOworCWVuZHBvaW50c1tlcF0tPm1yYmxyID0gRVBfTUFYX1BLVDsKKwllbmRwb2ludHNbZXBdLT5yZmNyID0gMHgxODsKKwllbmRwb2ludHNbZXBdLT50ZmNyID0gMHgxODsKKwllcF9yZWZbZXBdLnNjIHw9IEVQX0FUVEFDSEVEOworCisJREJHICgiZXAgJWQgcmJhc2UgMHglMDh4IHJicHRyIDB4JTA4eCB0YmFzZSAweCUwOHggdGJwdHIgMHglMDh4IHByeCA9ICVwXG4iLAorCQllcCwgZW5kcG9pbnRzW2VwXS0+cmJhc2UsIGVuZHBvaW50c1tlcF0tPnJicHRyLAorCQllbmRwb2ludHNbZXBdLT50YmFzZSwgZW5kcG9pbnRzW2VwXS0+dGJwdHIsCisJCWVwX3JlZltlcF0ucHJ4KTsKKworCXJldHVybjsKK30KKworLyogbXBjOHh4X3VkY19jYmRfaW5pdAorICoKKyAqIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNiZCBhbmQgYWxsb2NhdGUgVFgvUlggZGF0YSBzcGFjZQorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NiZF9pbml0ICh2b2lkKQoreworCWludCBpID0gMDsKKworCWZvciAoOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdHhfY2JkW2ldID0gKGNiZF90ICopCisJCQltcGM4eHhfdWRjX2FsbG9jIChzaXplb2YgKGNiZF90KSwgc2l6ZW9mIChpbnQpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJcnhfY2JkW2ldID0gKGNiZF90ICopCisJCQltcGM4eHhfdWRjX2FsbG9jIChzaXplb2YgKGNiZF90KSwgc2l6ZW9mIChpbnQpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdHhfY2JkW2ldLT5jYmRfYnVmYWRkciA9CisJCQltcGM4eHhfdWRjX2FsbG9jIChFUF9NQVhfUEtULCBzaXplb2YgKGludCkpOworCisJCXR4X2NiZFtpXS0+Y2JkX3NjID0gKFRYX0JEX0kgfCBUWF9CRF9XKTsKKwkJdHhfY2JkW2ldLT5jYmRfZGF0bGVuID0gMHgwMDAwOworCX0KKworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJ4X2NiZFtpXS0+Y2JkX2J1ZmFkZHIgPQorCQkJbXBjOHh4X3VkY19hbGxvYyAoRVBfTUFYX1BLVCwgc2l6ZW9mIChpbnQpKTsKKwkJcnhfY2JkW2ldLT5jYmRfc2MgPSAoUlhfQkRfSSB8IFJYX0JEX0UpOworCQlyeF9jYmRbaV0tPmNiZF9kYXRsZW4gPSAweDAwMDA7CisKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIG1wYzh4eF91ZGNfZW5kcG9pbnRfaW5pdAorICoKKyAqIEF0dGFjaCBhbiBlbmRwb2ludCB0byBzb21lIGRwcmFtCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZW5kcG9pbnRfaW5pdCAodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKDsgaSA8IE1BWF9FTkRQT0lOVFM7IGkrKykgeworCQllbmRwb2ludHNbaV0gPSAodXNiX2VwYl90ICopCisJCQltcGM4eHhfdWRjX2FsbG9jIChzaXplb2YgKHVzYl9lcGJfdCksIDMyKTsKKwl9Cit9CisKKy8qIG1wYzh4eF91ZGNfYWxsb2MKKyAqCisgKiBHcmFiIHRoZSBhZGRyZXNzIG9mIHNvbWUgZHByYW0KKyAqLworc3RhdGljIHUzMiBtcGM4eHhfdWRjX2FsbG9jICh1MzIgZGF0YV9zaXplLCB1MzIgYWxpZ25tZW50KQoreworCXUzMiByZXRhZGRyID0gYWRkcmVzc19iYXNlOworCisJd2hpbGUgKHJldGFkZHIgJSBhbGlnbm1lbnQpIHsKKwkJcmV0YWRkcisrOworCX0KKwlhZGRyZXNzX2Jhc2UgKz0gZGF0YV9zaXplOworCisJcmV0dXJuIHJldGFkZHI7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTVBDODg1X0ZBTUlMWSAmJiBDT05GSUdfVVNCX0RFVklDRSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiZGNvcmVfb21hcDE1MTAuYyBiL2RyaXZlcnMvdXNiZGNvcmVfb21hcDE1MTAuYwppbmRleCAxZDU0YTYzLi44NGJiOTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYmRjb3JlX29tYXAxNTEwLmMKKysrIGIvZHJpdmVycy91c2JkY29yZV9vbWFwMTUxMC5jCkBAIC0xNTE3LDQgKzE1MTcsMzEgQEAKIAl1ZGNfZW5hYmxlIChkZXZpY2UpOwogfQogCisvKioKKyAqIHVkY19pcnEgLSBkbyBwc2V1ZG8gaW50ZXJydXB0cworICovCit2b2lkIHVkY19pcnEodm9pZCkKK3sKKwkvKiBMb29wIHdoaWxlIHdlIGhhdmUgaW50ZXJydXB0cy4KKwkgKiBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGUgaW5wdXQgY2hhaW4KKwkgKiBwb2xsaW5nIGRlbGF5IGlzIGxpa2VseSB0byBtaXNzCisJICogaG9zdCByZXF1ZXN0cy4KKwkgKi8KKwl3aGlsZSAoaW53IChVRENfSVJRX1NSQykgJiB+VURDX1NPRl9GbGcpIHsKKwkJLyogSGFuZGxlIGFueSBuZXcgSVJRcyAqLworCQlvbWFwMTUxMF91ZGNfaXJxICgpOworCQlvbWFwMTUxMF91ZGNfbm9uaXNvX2lycSAoKTsKKwl9Cit9CisKKy8qIEZsb3cgY29udHJvbCAqLwordm9pZCB1ZGNfc2V0X25hayhpbnQgZXBpZCkKK3sKKwkvKiBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGluIG9tYXAxNTEwICovCit9CisKK3ZvaWQgdWRjX3Vuc2V0X25hayAoaW50IGVwaWQpCit7CisJLyogVE9ETzogaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBvbWFwMTUxMCAqLworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYnR0eS5jIGIvZHJpdmVycy91c2J0dHkuYwppbmRleCBjZTRhMTJlLi5hM2I1MDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYnR0eS5jCisrKyBiL2RyaXZlcnMvdXNidHR5LmMKQEAgLTIsNiArMiw5IEBACiAgKiAoQykgQ29weXJpZ2h0IDIwMDMKICAqIEdlcnJ5IEhhbWVsLCBnZWhAdGkuY29tLCBUZXhhcyBJbnN0cnVtZW50cwogICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogQnJ5YW4gTydEb25vZ2h1ZSwgYm9kb25vZ2h1ZUBjb2RlaGVybWl0LmllCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMjUsMjAgKzI4LDQyIEBACiAjaW5jbHVkZSA8Y2lyY2J1Zi5oPgogI2luY2x1ZGUgPGRldmljZXMuaD4KICNpbmNsdWRlICJ1c2J0dHkuaCIKKyNpbmNsdWRlICJ1c2JfY2RjX2FjbS5oIgorI2luY2x1ZGUgInVzYmRlc2NyaXB0b3JzLmgiCisjaW5jbHVkZSA8Y29uZmlnLmg+CQkvKiBJZiBkZWZpbmVkLCBvdmVycmlkZSBMaW51eCBpZGVudGlmaWVycyB3aXRoCisJCQkgICAJICogdmVuZG9yIHNwZWNpZmljIG9uZXMgKi8KIAogI2lmIDAKLSNkZWZpbmUgVFRZREJHKGZtdCxhcmdzLi4uKSBzZXJpYWxfcHJpbnRmKCJbJXNdICVzICVkOiAiZm10LCBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sIyNhcmdzKQorI2RlZmluZSBUVFlEQkcoZm10LGFyZ3MuLi4pXAorCXNlcmlhbF9wcmludGYoIlslc10gJXMgJWQ6ICJmbXQsIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXywjI2FyZ3MpCiAjZWxzZQogI2RlZmluZSBUVFlEQkcoZm10LGFyZ3MuLi4pIGRve313aGlsZSgwKQogI2VuZGlmCiAKLSNpZiAwCi0jZGVmaW5lIFRUWUVSUihmbXQsYXJncy4uLikgc2VyaWFsX3ByaW50ZigiRVJST1IhWyVzXSAlcyAlZDogImZtdCwgX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLCMjYXJncykKKyNpZiAxCisjZGVmaW5lIFRUWUVSUihmbXQsYXJncy4uLilcCisJc2VyaWFsX3ByaW50ZigiRVJST1IhWyVzXSAlcyAlZDogImZtdCwgX19GSUxFX18sX19GVU5DVElPTl9fLFwKKwlfX0xJTkVfXywjI2FyZ3MpCiAjZWxzZQogI2RlZmluZSBUVFlFUlIoZm10LGFyZ3MuLi4pIGRve313aGlsZSgwKQogI2VuZGlmCiAKIC8qCisgKiBEZWZpbmVzCisgKi8KKyNkZWZpbmUgTlVNX0NPTkZJR1MgICAgMQorI2RlZmluZSBNQVhfSU5URVJGQUNFUyAyCisjZGVmaW5lIE5VTV9FTkRQT0lOVFMgIDMKKyNkZWZpbmUgQUNNX1RYX0VORFBPSU5UIDMKKyNkZWZpbmUgQUNNX1JYX0VORFBPSU5UIDIKKyNkZWZpbmUgR1NFUklBTF9UWF9FTkRQT0lOVCAyCisjZGVmaW5lIEdTRVJJQUxfUlhfRU5EUE9JTlQgMQorI2RlZmluZSBOVU1fQUNNX0lOVEVSRkFDRVMgMgorI2RlZmluZSBOVU1fR1NFUklBTF9JTlRFUkZBQ0VTIDEKKyNkZWZpbmUgQ09ORklHX1VTQkRfREFUQV9JTlRFUkZBQ0VfU1RSICJCdWxrIERhdGEgSW50ZXJmYWNlIgorI2RlZmluZSBDT05GSUdfVVNCRF9DVFJMX0lOVEVSRkFDRV9TVFIgIkNvbnRyb2wgSW50ZXJmYWNlIgorCisvKgogICogQnVmZmVycyB0byBob2xkIGlucHV0IGFuZCBvdXRwdXQgZGF0YQogICovCiAjZGVmaW5lIFVTQlRUWV9CVUZGRVJfU0laRSAyNTYKQEAgLTUwLDE1NyArNzUsMzM2IEBACiAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKICAqLwogc3RhdGljIGRldmljZV90IHVzYnR0eWRldjsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZQkgZGV2aWNlX2luc3RhbmNlWzFdOwotc3RhdGljIHN0cnVjdCB1c2JfYnVzX2luc3RhbmNlCQkgYnVzX2luc3RhbmNlWzFdOworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlIGRldmljZV9pbnN0YW5jZVsxXTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2J1c19pbnN0YW5jZSBidXNfaW5zdGFuY2VbMV07CiBzdGF0aWMgc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2luc3RhbmNlIGNvbmZpZ19pbnN0YW5jZVtOVU1fQ09ORklHU107Ci1zdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfaW5zdGFuY2UJIGludGVyZmFjZV9pbnN0YW5jZVtOVU1fSU5URVJGQUNFU107Ci1zdGF0aWMgc3RydWN0IHVzYl9hbHRlcm5hdGVfaW5zdGFuY2UJIGFsdGVybmF0ZV9pbnN0YW5jZVtOVU1fSU5URVJGQUNFU107Ci1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZQkgZW5kcG9pbnRfaW5zdGFuY2VbTlVNX0VORFBPSU5UUysxXTsgLyogb25lIGV4dHJhIGZvciBjb250cm9sIGVuZHBvaW50ICovCi0KLS8qCi0gKiBTdGF0aWMgYWxsb2NhdGlvbiBvZiB1cmJzCi0gKi8KLSNkZWZpbmUgUkVDVl9FTkRQT0lOVCAxCi0jZGVmaW5lIFRYX0VORFBPSU5UIDIKK3N0YXRpYyBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9pbnN0YW5jZSBpbnRlcmZhY2VfaW5zdGFuY2VbTUFYX0lOVEVSRkFDRVNdOworc3RhdGljIHN0cnVjdCB1c2JfYWx0ZXJuYXRlX2luc3RhbmNlIGFsdGVybmF0ZV9pbnN0YW5jZVtNQVhfSU5URVJGQUNFU107CisvKiBvbmUgZXh0cmEgZm9yIGNvbnRyb2wgZW5kcG9pbnQgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlIGVuZHBvaW50X2luc3RhbmNlW05VTV9FTkRQT0lOVFMrMV07CiAKIC8qCiAgKiBHbG9iYWwgZmxhZwogICovCiBpbnQgdXNidHR5X2NvbmZpZ3VyZWRfZmxhZyA9IDA7CiAKLQogLyoKICAqIFNlcmlhbCBudW1iZXIKICAqLwogc3RhdGljIGNoYXIgc2VyaWFsX251bWJlclsxNl07CiAKKwogLyoKLSAqIERlc2NyaXB0b3JzCisgKiBEZXNjcmlwdG9ycywgU3RyaW5ncywgTG9jYWwgdmFyaWFibGVzLgogICovCisKKy8qIGRlZmluZWQgYW5kIHVzZWQgYnkgdXNiZGNvcmVfZXAwLmMgKi8KK2V4dGVybiBzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICoqdXNiX3N0cmluZ3M7CisKKy8qIEluZGljaWVzLCBSZWZlcmVuY2VzICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcnhfZW5kcG9pbnQgPSAwOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHR4X2VuZHBvaW50ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnRlcmZhY2VfY291bnQgPSAwOworc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKnVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX0NPVU5UXTsKKworLyogVVNCIERlc2NyaXB0b3IgU3RyaW5ncyAqLwogc3RhdGljIHU4IHdzdHJMYW5nWzRdID0gezQsVVNCX0RUX1NUUklORywweDksMHg0fTsKIHN0YXRpYyB1OCB3c3RyTWFudWZhY3R1cmVyWzIgKyAyKihzaXplb2YoQ09ORklHX1VTQkRfTUFOVUZBQ1RVUkVSKS0xKV07CiBzdGF0aWMgdTggd3N0clByb2R1Y3RbMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUpLTEpXTsKIHN0YXRpYyB1OCB3c3RyU2VyaWFsWzIgKyAyKihzaXplb2Yoc2VyaWFsX251bWJlcikgLSAxKV07CiBzdGF0aWMgdTggd3N0ckNvbmZpZ3VyYXRpb25bMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9DT05GSUdVUkFUSU9OX1NUUiktMSldOwotc3RhdGljIHU4IHdzdHJJbnRlcmZhY2VbMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9JTlRFUkZBQ0VfU1RSKS0xKV07CitzdGF0aWMgdTggd3N0ckRhdGFJbnRlcmZhY2VbMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9EQVRBX0lOVEVSRkFDRV9TVFIpLTEpXTsKK3N0YXRpYyB1OCB3c3RyQ3RybEludGVyZmFjZVsyICsgMiooc2l6ZW9mKENPTkZJR19VU0JEX0RBVEFfSU5URVJGQUNFX1NUUiktMSldOwogCi1zdGF0aWMgc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqdXNidHR5X3N0cmluZ190YWJsZVtdID0gewotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0ckxhbmcsCi0gIChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yKil3c3RyTWFudWZhY3R1cmVyLAotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0clByb2R1Y3QsCi0gIChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yKil3c3RyU2VyaWFsLAotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0ckNvbmZpZ3VyYXRpb24sCi0gIChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yKil3c3RySW50ZXJmYWNlCi19OwotZXh0ZXJuIHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKip1c2Jfc3RyaW5nczsgLyogZGVmaW5lZCBhbmQgdXNlZCBieSBvbWFwMTUxMF9lcDAuYyAqLwotCisvKiBTdGFuZGFyZCBVU0IgRGF0YSBTdHJ1Y3R1cmVzICovCitzdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRlcmZhY2VfZGVzY3JpcHRvcnNbTUFYX0lOVEVSRkFDRVNdOworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfZGVzY3JpcHRvcl9wdHJzW05VTV9FTkRQT0lOVFNdOworc3RhdGljIHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yCSpjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IgPSAwOwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgZGV2aWNlX2Rlc2NyaXB0b3IgPSB7Ci0gIGJMZW5ndGg6CSAgICAgIHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yKSwKLSAgYkRlc2NyaXB0b3JUeXBlOiAgICBVU0JfRFRfREVWSUNFLAotICBiY2RVU0I6CSAgICAgIFVTQl9CQ0RfVkVSU0lPTiwKLSAgYkRldmljZUNsYXNzOgkgICAgICBVU0JUVFlfREVWSUNFX0NMQVNTLAotICBiRGV2aWNlU3ViQ2xhc3M6ICAgIFVTQlRUWV9ERVZJQ0VfU1VCQ0xBU1MsCi0gIGJEZXZpY2VQcm90b2NvbDogICAgVVNCVFRZX0RFVklDRV9QUk9UT0NPTCwKLSAgYk1heFBhY2tldFNpemUwOiAgICBFUDBfTUFYX1BBQ0tFVF9TSVpFLAotICBpZFZlbmRvcjoJICAgICAgQ09ORklHX1VTQkRfVkVORE9SSUQsCi0gIGlkUHJvZHVjdDoJICAgICAgQ09ORklHX1VTQkRfUFJPRFVDVElELAotICBiY2REZXZpY2U6CSAgICAgIFVTQlRUWV9CQ0RfREVWSUNFLAotICBpTWFudWZhY3R1cmVyOiAgICAgIFNUUl9NQU5VRkFDVFVSRVIsCi0gIGlQcm9kdWN0OgkgICAgICBTVFJfUFJPRFVDVCwKLSAgaVNlcmlhbE51bWJlcjogICAgICBTVFJfU0VSSUFMLAotICBiTnVtQ29uZmlndXJhdGlvbnM6IE5VTV9DT05GSUdTCi0gIH07Ci1zdGF0aWMgc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IgY29uZmlnX2Rlc2NyaXB0b3JzW05VTV9DT05GSUdTXSA9IHsKLSAgewotICAgIGJMZW5ndGg6CQkgc2l6ZW9mKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yKSwKLSAgICBiRGVzY3JpcHRvclR5cGU6CSBVU0JfRFRfQ09ORklHLAotICAgIHdUb3RhbExlbmd0aDoJIChzaXplb2Yoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IpKk5VTV9DT05GSUdTKSArCi0JCQkgKHNpemVvZihzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yKSpOVU1fSU5URVJGQUNFUykgKwotCQkJIChzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSpOVU1fRU5EUE9JTlRTKSwKLSAgICBiTnVtSW50ZXJmYWNlczoJIE5VTV9JTlRFUkZBQ0VTLAotICAgIGJDb25maWd1cmF0aW9uVmFsdWU6IDEsCi0gICAgaUNvbmZpZ3VyYXRpb246CSBTVFJfQ09ORklHLAotICAgIGJtQXR0cmlidXRlczoJIEJNQVRUUklCVVRFX1NFTEZfUE9XRVJFRCB8IEJNQVRUUklCVVRFX1JFU0VSVkVELAotICAgIGJNYXhQb3dlcjoJCSBVU0JUVFlfTUFYUE9XRVIKLSAgfSwKKwkuYkxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0RFVklDRSwKKwkuYmNkVVNCID0gCQljcHVfdG9fbGUxNihVU0JfQkNEX1ZFUlNJT04pLAorCS5iRGV2aWNlU3ViQ2xhc3MgPQkweDAwLAorCS5iRGV2aWNlUHJvdG9jb2wgPQkweDAwLAorCS5iTWF4UGFja2V0U2l6ZTAgPQlFUDBfTUFYX1BBQ0tFVF9TSVpFLAorCS5pZFZlbmRvciA9CQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9WRU5ET1JJRCksCisJLmJjZERldmljZSA9CQljcHVfdG9fbGUxNihVU0JUVFlfQkNEX0RFVklDRSksCisJLmlNYW51ZmFjdHVyZXIgPQlTVFJfTUFOVUZBQ1RVUkVSLAorCS5pUHJvZHVjdCA9CQlTVFJfUFJPRFVDVCwKKwkuaVNlcmlhbE51bWJlciA9CVNUUl9TRVJJQUwsCisJLmJOdW1Db25maWd1cmF0aW9ucyA9CU5VTV9DT05GSUdTCiB9Owotc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50ZXJmYWNlX2Rlc2NyaXB0b3JzW05VTV9JTlRFUkZBQ0VTXSA9IHsKLSAgewotICAgIGJMZW5ndGg6CQkgc2l6ZW9mKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpLAotICAgIGJEZXNjcmlwdG9yVHlwZToJIFVTQl9EVF9JTlRFUkZBQ0UsCi0gICAgYkludGVyZmFjZU51bWJlcjoJIDAsCi0gICAgYkFsdGVybmF0ZVNldHRpbmc6CSAwLAotICAgIGJOdW1FbmRwb2ludHM6CSBOVU1fRU5EUE9JTlRTLAotICAgIGJJbnRlcmZhY2VDbGFzczoJIFVTQlRUWV9JTlRFUkZBQ0VfQ0xBU1MsCi0gICAgYkludGVyZmFjZVN1YkNsYXNzOgkgVVNCVFRZX0lOVEVSRkFDRV9TVUJDTEFTUywKLSAgICBiSW50ZXJmYWNlUHJvdG9jb2w6CSBVU0JUVFlfSU5URVJGQUNFX1BST1RPQ09MLAotICAgIGlJbnRlcmZhY2U6CQkgU1RSX0lOVEVSRkFDRQotICB9LAorCisKKy8qCisgKiBTdGF0aWMgQ0RDIEFDTSBzcGVjaWZpYyBkZXNjcmlwdG9ycworICovCisKK3N0cnVjdCBhY21fY29uZmlnX2Rlc2MgeworCXN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb25fZGVzYzsKKworCS8qIE1hc3RlciBJbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGludGVyZmFjZV9kZXNjOworCisJc3RydWN0IHVzYl9jbGFzc19oZWFkZXJfZnVuY3Rpb25fZGVzY3JpcHRvciB1c2JfY2xhc3NfaGVhZGVyOworCXN0cnVjdCB1c2JfY2xhc3NfY2FsbF9tYW5hZ2VtZW50X2Rlc2NyaXB0b3IgdXNiX2NsYXNzX2NhbGxfbWd0OworCXN0cnVjdCB1c2JfY2xhc3NfYWJzdHJhY3RfY29udHJvbF9kZXNjcmlwdG9yIHVzYl9jbGFzc19hY207CisJc3RydWN0IHVzYl9jbGFzc191bmlvbl9mdW5jdGlvbl9kZXNjcmlwdG9yIHVzYl9jbGFzc191bmlvbjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igbm90aWZpY2F0aW9uX2VuZHBvaW50OworCisJLyogU2xhdmUgSW50ZXJmYWNlICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBkYXRhX2NsYXNzX2ludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKKwkJZGF0YV9lbmRwb2ludHNbTlVNX0VORFBPSU5UUy0xXSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBzdHJ1Y3QgYWNtX2NvbmZpZ19kZXNjIGFjbV9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzW05VTV9DT05GSUdTXSA9IHsKKwl7CisJCS5jb25maWd1cmF0aW9uX2Rlc2MgPXsKKwkJCS5iTGVuZ3RoID0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IpLAorICAgIAkJCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfQ09ORklHLAorCQkJLndUb3RhbExlbmd0aCA9CisJCQkJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBhY21fY29uZmlnX2Rlc2MpKSwKKwkgICAgCQkuYk51bUludGVyZmFjZXMgPSBOVU1fQUNNX0lOVEVSRkFDRVMsCisgICAgCQkJLmJDb25maWd1cmF0aW9uVmFsdWUgPSAxLAorCQkJLmlDb25maWd1cmF0aW9uID0gU1RSX0NPTkZJRywKKwkJCS5ibUF0dHJpYnV0ZXMgPQorCQkJCUJNQVRUUklCVVRFX1NFTEZfUE9XRVJFRHxCTUFUVFJJQlVURV9SRVNFUlZFRCwKKwkJCS5iTWF4UG93ZXIgPSBVU0JUVFlfTUFYUE9XRVIKKwkJfSwKKwkJLyogSW50ZXJmYWNlIDEgKi8KKwkJLmludGVyZmFjZV9kZXNjID0geworCQkJLmJMZW5ndGggID0gc2l6ZW9mKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCQkuYkludGVyZmFjZU51bWJlciA9IDAsCisJCQkuYkFsdGVybmF0ZVNldHRpbmcgPSAwLAorCQkJLmJOdW1FbmRwb2ludHMgPSAweDAxLAorCQkJLmJJbnRlcmZhY2VDbGFzcyA9CisJCQkJQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX0NPTlRST0wsCisJCQkuYkludGVyZmFjZVN1YkNsYXNzID0gQ09NTVVOSUNBVElPTlNfQUNNX1NVQkNMQVNTLAorCQkJLmJJbnRlcmZhY2VQcm90b2NvbCA9IENPTU1VTklDQVRJT05TX1YyNVRFUl9QUk9UT0NPTCwKKwkJCS5pSW50ZXJmYWNlID0gU1RSX0NUUkxfSU5URVJGQUNFLAorCQl9LAorCQkudXNiX2NsYXNzX2hlYWRlciA9IHsKKwkJCS5iRnVuY3Rpb25MZW5ndGgJPQorCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2NsYXNzX2hlYWRlcl9mdW5jdGlvbl9kZXNjcmlwdG9yKSwKKwkJCS5iRGVzY3JpcHRvclR5cGUJPSBDU19JTlRFUkZBQ0UsCisJCQkuYkRlc2NyaXB0b3JTdWJ0eXBlCT0gVVNCX1NUX0hFQURFUiwKKwkJCS5iY2RDREMJPSBjcHVfdG9fbGUxNigxMTApLAorCQl9LAorCQkudXNiX2NsYXNzX2NhbGxfbWd0ID0geworCQkJLmJGdW5jdGlvbkxlbmd0aAk9CisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY2xhc3NfY2FsbF9tYW5hZ2VtZW50X2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZQk9IENTX0lOVEVSRkFDRSwKKwkJCS5iRGVzY3JpcHRvclN1YnR5cGUJPSBVU0JfU1RfQ01GLAorCQkJLmJtQ2FwYWJpbGl0aWVzCQk9IDB4MDAsCisJCQkuYkRhdGFJbnRlcmZhY2UJCT0gMHgwMSwKKwkJfSwKKwkJLnVzYl9jbGFzc19hY20gPSB7CisJCQkuYkZ1bmN0aW9uTGVuZ3RoCT0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9jbGFzc19hYnN0cmFjdF9jb250cm9sX2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZQk9IENTX0lOVEVSRkFDRSwKKwkJCS5iRGVzY3JpcHRvclN1YnR5cGUJPSBVU0JfU1RfQUNNRiwKKwkJCS5ibUNhcGFiaWxpdGllcwkJPSAweDAwLAorCQl9LAorCQkudXNiX2NsYXNzX3VuaW9uID0geworCQkJLmJGdW5jdGlvbkxlbmd0aAk9CisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY2xhc3NfdW5pb25fZnVuY3Rpb25fZGVzY3JpcHRvciksCisJCQkuYkRlc2NyaXB0b3JUeXBlCT0gQ1NfSU5URVJGQUNFLAorCQkJLmJEZXNjcmlwdG9yU3VidHlwZQk9IFVTQl9TVF9VRiwKKwkJCS5iTWFzdGVySW50ZXJmYWNlCT0gMHgwMCwKKwkJCS5iU2xhdmVJbnRlcmZhY2UwCT0gMHgwMSwKKwkJfSwKKwkJLm5vdGlmaWNhdGlvbl9lbmRwb2ludCA9IHsKKwkJCS5iTGVuZ3RoID0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKKwkJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfRU5EUE9JTlQsCisJCQkuYkVuZHBvaW50QWRkcmVzcwk9IDB4MDEgfCBVU0JfRElSX0lOLAorCQkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJCQkud01heFBhY2tldFNpemUKKwkJCQk9IGNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9JTlRfUEtUU0laRSksCisJCQkuYkludGVydmFsCQk9IDB4RkYsCisJCX0sCisKKwkJLyogSW50ZXJmYWNlIDIgKi8KKwkJLmRhdGFfY2xhc3NfaW50ZXJmYWNlID0geworCQkJLmJMZW5ndGgJCT0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciksCisJCQkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0lOVEVSRkFDRSwKKwkJCS5iSW50ZXJmYWNlTnVtYmVyCT0gMHgwMSwKKwkJCS5iQWx0ZXJuYXRlU2V0dGluZwk9IDB4MDAsCisJCQkuYk51bUVuZHBvaW50cwkJPSAweDAyLAorCQkJLmJJbnRlcmZhY2VDbGFzcwk9CisJCQkJQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX0RBVEEsCisJCQkuYkludGVyZmFjZVN1YkNsYXNzCT0gREFUQV9JTlRFUkZBQ0VfU1VCQ0xBU1NfTk9ORSwKKwkJCS5iSW50ZXJmYWNlUHJvdG9jb2wJPSBEQVRBX0lOVEVSRkFDRV9QUk9UT0NPTF9OT05FLAorCQkJLmlJbnRlcmZhY2UJCT0gU1RSX0RBVEFfSU5URVJGQUNFLAorCQl9LAorCQkuZGF0YV9lbmRwb2ludHMgPSB7CisJCQl7CisJCQkJLmJMZW5ndGgJCT0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9FTkRQT0lOVCwKKwkJCQkuYkVuZHBvaW50QWRkcmVzcwk9IDB4MDIgfCBVU0JfRElSX09VVCwKKwkJCQkuYm1BdHRyaWJ1dGVzCQk9CisJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJCQkJLndNYXhQYWNrZXRTaXplCQk9CisJCQkJCWNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9CVUxLX1BLVFNJWkUpLAorCQkJCS5iSW50ZXJ2YWwJCT0gMHhGRiwKKwkJCX0sCisJCQl7CisJCQkJLmJMZW5ndGgJCT0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9FTkRQT0lOVCwKKwkJCQkuYkVuZHBvaW50QWRkcmVzcwk9IDB4MDMgfCBVU0JfRElSX0lOLAorCQkJCS5ibUF0dHJpYnV0ZXMJCT0KKwkJCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkJCQkud01heFBhY2tldFNpemUJCT0KKwkJCQkJY3B1X3RvX2xlMTYoQ09ORklHX1VTQkRfU0VSSUFMX0JVTEtfUEtUU0laRSksCisJCQkJLmJJbnRlcnZhbAkJPSAweEZGLAorCQkJfSwKKwkJfSwKKwl9LAogfTsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZXBfZGVzY3JpcHRvcnNbTlVNX0VORFBPSU5UU10gPSB7Ci0gIHsKLSAgICBiTGVuZ3RoOgkJIHNpemVvZihzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAotICAgIGJEZXNjcmlwdG9yVHlwZToJIFVTQl9EVF9FTkRQT0lOVCwKLSAgICBiRW5kcG9pbnRBZGRyZXNzOgkgQ09ORklHX1VTQkRfU0VSSUFMX09VVF9FTkRQT0lOVCB8IFVTQl9ESVJfT1VULAotICAgIGJtQXR0cmlidXRlczoJIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgd01heFBhY2tldFNpemU6CSBDT05GSUdfVVNCRF9TRVJJQUxfT1VUX1BLVFNJWkUsCi0gICAgYkludGVydmFsOgkJIDAKLSAgfSwKLSAgewotICAgIGJMZW5ndGg6CQkgc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCi0gICAgYkRlc2NyaXB0b3JUeXBlOgkgVVNCX0RUX0VORFBPSU5ULAotICAgIGJFbmRwb2ludEFkZHJlc3M6CSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fRU5EUE9JTlQgfCBVU0JfRElSX0lOLAotICAgIGJtQXR0cmlidXRlczoJIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgd01heFBhY2tldFNpemU6CSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fUEtUU0laRSwKLSAgICBiSW50ZXJ2YWw6CQkgMAotICB9LAotICB7Ci0gICAgYkxlbmd0aDoJCSBzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKLSAgICBiRGVzY3JpcHRvclR5cGU6CSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgYkVuZHBvaW50QWRkcmVzczoJIENPTkZJR19VU0JEX1NFUklBTF9JTlRfRU5EUE9JTlQgfCBVU0JfRElSX0lOLAotICAgIGJtQXR0cmlidXRlczoJIFVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLSAgICB3TWF4UGFja2V0U2l6ZToJIENPTkZJR19VU0JEX1NFUklBTF9JTlRfUEtUU0laRSwKLSAgICBiSW50ZXJ2YWw6CQkgMAotICB9LAorCitzdGF0aWMgc3RydWN0IHJzMjMyX2VtdSByczIzMl9kZXNjPXsKKwkJLmR0ZXIgCQk9ICAJMTE1MjAwLAorCSAgIAkuc3RvcF9iaXRzCT0JMHgwMCwKKwkgICAJLnBhcml0eQkJPQkweDAwLAorCQkuZGF0YV9iaXRzCT0JMHgwOAogfTsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2Rlc2NyaXB0b3JfcHRyc1tOVU1fRU5EUE9JTlRTXSA9IHsKLSAgJihlcF9kZXNjcmlwdG9yc1swXSksCi0gICYoZXBfZGVzY3JpcHRvcnNbMV0pLAotICAmKGVwX2Rlc2NyaXB0b3JzWzJdKSwKKworCisvKgorICogU3RhdGljIEdlbmVyaWMgU2VyaWFsIHNwZWNpZmljIGRhdGEKKyAqLworCisKK3N0cnVjdCBnc2VyaWFsX2NvbmZpZ19kZXNjIHsKKworCXN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb25fZGVzYzsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yCisJCWludGVyZmFjZV9kZXNjW05VTV9HU0VSSUFMX0lOVEVSRkFDRVNdIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgorCQlkYXRhX2VuZHBvaW50c1tOVU1fRU5EUE9JTlRTXSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljIHN0cnVjdCBnc2VyaWFsX2NvbmZpZ19kZXNjCitnc2VyaWFsX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnNbTlVNX0NPTkZJR1NdID17CisJeworCQkuY29uZmlndXJhdGlvbl9kZXNjID17CisJCQkuYkxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciksCisJCQkuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0NPTkZJRywKKwkJCS53VG90YWxMZW5ndGggPQorCQkJCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgZ3NlcmlhbF9jb25maWdfZGVzYykpLAorCQkJLmJOdW1JbnRlcmZhY2VzID0gTlVNX0dTRVJJQUxfSU5URVJGQUNFUywKKwkJCS5iQ29uZmlndXJhdGlvblZhbHVlID0gMSwKKwkJCS5pQ29uZmlndXJhdGlvbiA9IFNUUl9DT05GSUcsCisJCQkuYm1BdHRyaWJ1dGVzID0KKwkJCQlCTUFUVFJJQlVURV9TRUxGX1BPV0VSRUR8Qk1BVFRSSUJVVEVfUkVTRVJWRUQsCisJCQkuYk1heFBvd2VyID0gVVNCVFRZX01BWFBPV0VSCisJCX0sCisJCS5pbnRlcmZhY2VfZGVzYyA9IHsKKwkJCXsKKwkJCQkuYkxlbmd0aCAgPQorCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCQkJLmJJbnRlcmZhY2VOdW1iZXIgPSAwLAorCQkJCS5iQWx0ZXJuYXRlU2V0dGluZyA9IDAsCisJCQkJLmJOdW1FbmRwb2ludHMgPSBOVU1fRU5EUE9JTlRTLAorCQkJCS5iSW50ZXJmYWNlQ2xhc3MgPQorCQkJCQlDT01NVU5JQ0FUSU9OU19JTlRFUkZBQ0VfQ0xBU1NfVkVORE9SLAorCQkJCS5iSW50ZXJmYWNlU3ViQ2xhc3MgPQorCQkJCQlDT01NVU5JQ0FUSU9OU19OT19TVUJDTEFTUywKKwkJCQkuYkludGVyZmFjZVByb3RvY29sID0KKwkJCQkJQ09NTVVOSUNBVElPTlNfTk9fUFJPVE9DT0wsCisJCQkJLmlJbnRlcmZhY2UgPSBTVFJfREFUQV9JTlRFUkZBQ0UKKwkJCX0sCisgIAkJfSwKKwkJLmRhdGFfZW5kcG9pbnRzICA9IHsKKwkJCXsKKwkJCQkuYkxlbmd0aCA9CisJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAorCQkJCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisJCQkJLmJFbmRwb2ludEFkZHJlc3MgPQkweDAxIHwgVVNCX0RJUl9PVVQsCisJCQkJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCQkJCS53TWF4UGFja2V0U2l6ZSA9CisJCQkJCWNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9PVVRfUEtUU0laRSksCisJCQkJLmJJbnRlcnZhbD0JCTB4RkYsCisJCQl9LAorCQkJeworCQkJCS5iTGVuZ3RoID0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKwkJCQkuYkVuZHBvaW50QWRkcmVzcyA9CTB4MDIgfCBVU0JfRElSX0lOLAorCQkJCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkJCQkud01heFBhY2tldFNpemUgPQorCQkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9TRVJJQUxfSU5fUEtUU0laRSksCisJCQkJLmJJbnRlcnZhbCA9IAkJMHhGRiwKKwkJCX0sCisJCQl7CisJCQkJLmJMZW5ndGggPQorCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKKwkJCQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCQkJCS5iRW5kcG9pbnRBZGRyZXNzID0JMHgwMyB8IFVTQl9ESVJfSU4sCisJCQkJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisgICAgCQkJCS53TWF4UGFja2V0U2l6ZSA9CisJCQkJCWNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9JTlRfUEtUU0laRSksCisJCQkJLmJJbnRlcnZhbCA9CQkweEZGLAorCQkJfSwKKwkJfSwKKwl9LAogfTsKIAorLyoKKyAqIFN0YXRpYyBGdW5jdGlvbiBQcm90b3R5cGVzCisgKi8KKworc3RhdGljIHZvaWQgdXNidHR5X2luaXRfc3RyaW5ncyAodm9pZCk7CitzdGF0aWMgdm9pZCB1c2J0dHlfaW5pdF9pbnN0YW5jZXMgKHZvaWQpOworc3RhdGljIHZvaWQgdXNidHR5X2luaXRfZW5kcG9pbnRzICh2b2lkKTsKK3N0YXRpYyB2b2lkIHVzYnR0eV9pbml0X3Rlcm1pbmFsX3R5cGUoc2hvcnQgdHlwZSk7CitzdGF0aWMgdm9pZCB1c2J0dHlfZXZlbnRfaGFuZGxlciAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwKKwkJCQl1c2JfZGV2aWNlX2V2ZW50X3QgZXZlbnQsIGludCBkYXRhKTsKK3N0YXRpYyBpbnQgdXNidHR5X2NkY19zZXR1cChzdHJ1Y3QgdXNiX2RldmljZV9yZXF1ZXN0ICpyZXF1ZXN0LAorCQkJCXN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgaW50IHVzYnR0eV9jb25maWd1cmVkICh2b2lkKTsKK3N0YXRpYyBpbnQgd3JpdGVfYnVmZmVyIChjaXJjYnVmX3QgKiBidWYpOworc3RhdGljIGludCBmaWxsX2J1ZmZlciAoY2lyY2J1Zl90ICogYnVmKTsKKwordm9pZCB1c2J0dHlfcG9sbCAodm9pZCk7CisKIC8qIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgY2hhciogdG8gd2lkZSBzdHJpbmcgdXNlZCBieSBVU0IgKi8KIHN0YXRpYyB2b2lkIHN0cjJ3aWRlIChjaGFyICpzdHIsIHUxNiAqIHdpZGUpCiB7CiAJaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3RybGVuIChzdHIpICYmIHN0cltpXTsgaSsrKQotCQl3aWRlW2ldID0gKHUxNikgc3RyW2ldOworCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4gKHN0cikgJiYgc3RyW2ldOyBpKyspeworCQkjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJCQl3aWRlW2ldID0gKHUxNikgc3RyW2ldOworCQkjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwkJCXdpZGVbaV0gPSAoKHUxNikoc3RyW2ldKTw8OCk7CisJCSNlbHNlCisJCQkjZXJyb3IgIl9fTElUVExFX0VORElBTiBvciBfX0JJR19FTkRJQU4gdW5kZWZpbmVkIgorCQkjZW5kaWYKKwl9CiB9CiAKIC8qCi0gKiBQcm90b3R5cGVzCi0gKi8KLXN0YXRpYyB2b2lkIHVzYnR0eV9pbml0X3N0cmluZ3MgKHZvaWQpOwotc3RhdGljIHZvaWQgdXNidHR5X2luaXRfaW5zdGFuY2VzICh2b2lkKTsKLXN0YXRpYyB2b2lkIHVzYnR0eV9pbml0X2VuZHBvaW50cyAodm9pZCk7Ci0KLXN0YXRpYyB2b2lkIHVzYnR0eV9ldmVudF9oYW5kbGVyIChzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZSAqZGV2aWNlLAotCQkJCSAgdXNiX2RldmljZV9ldmVudF90IGV2ZW50LCBpbnQgZGF0YSk7Ci1zdGF0aWMgaW50IHVzYnR0eV9jb25maWd1cmVkICh2b2lkKTsKLQotc3RhdGljIGludCB3cml0ZV9idWZmZXIgKGNpcmNidWZfdCAqIGJ1Zik7Ci1zdGF0aWMgaW50IGZpbGxfYnVmZmVyIChjaXJjYnVmX3QgKiBidWYpOwotCi12b2lkIHVzYnR0eV9wb2xsICh2b2lkKTsKLXN0YXRpYyB2b2lkIHByZXRlbmRfaW50ZXJydXB0cyAodm9pZCk7Ci0KLQotLyoKICAqIFRlc3Qgd2hldGhlciBhIGNoYXJhY3RlciBpcyBpbiB0aGUgUlggYnVmZmVyCiAgKi8KKwogaW50IHVzYnR0eV90c3RjICh2b2lkKQogeworCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50ID0KKwkJJmVuZHBvaW50X2luc3RhbmNlW3J4X2VuZHBvaW50XTsKKworCS8qIElmIG5vIGlucHV0IGRhdGEgZXhpc3RzLCBhbGxvdyBtb3JlIFJYIHRvIGJlIGFjY2VwdGVkICovCisJaWYodXNidHR5X2lucHV0LnNpemUgPD0gMCl7CisJCXVkY191bnNldF9uYWsoZW5kcG9pbnQtPmVuZHBvaW50X2FkZHJlc3MmMHgwMyk7CisJfQorCiAJdXNidHR5X3BvbGwgKCk7CiAJcmV0dXJuICh1c2J0dHlfaW5wdXQuc2l6ZSA+IDApOwogfQpAQCAtMjEwLDE1ICs0MTQsMjEgQEAKICAqIG90aGVyd2lzZS4gV2hlbiB0aGUgZnVuY3Rpb24gaXMgc3VjY2VzZnVsbCwgdGhlIGNoYXJhY3RlciByZWFkIGlzCiAgKiB3cml0dGVuIGludG8gaXRzIGFyZ3VtZW50IGMuCiAgKi8KKwogaW50IHVzYnR0eV9nZXRjICh2b2lkKQogewogCWNoYXIgYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCA9CisJCSZlbmRwb2ludF9pbnN0YW5jZVtyeF9lbmRwb2ludF07CiAKIAl3aGlsZSAodXNidHR5X2lucHV0LnNpemUgPD0gMCkgeworCQl1ZGNfdW5zZXRfbmFrKGVuZHBvaW50LT5lbmRwb2ludF9hZGRyZXNzJjB4MDMpOwogCQl1c2J0dHlfcG9sbCAoKTsKIAl9CiAKIAlidWZfcG9wICgmdXNidHR5X2lucHV0LCAmYywgMSk7CisJdWRjX3NldF9uYWsoZW5kcG9pbnQtPmVuZHBvaW50X2FkZHJlc3MmMHgwMyk7CisKIAlyZXR1cm4gYzsKIH0KIApAQCAtMjM4LDcgKzQ0OCw2IEBACiAJfQogfQogCi0KIC8qIHVzYnR0eV9wdXRzKCkgaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIHRoZSBuZXh0ICdcbicgaW4gYSBzdHJpbmcgKi8KIHN0YXRpYyBpbnQgbmV4dF9ubF9wb3MgKGNvbnN0IGNoYXIgKnMpCiB7CkBAIC0yNTIsOCArNDYxLDkgQEAKIH0KIAogLyoKLSAqIE91dHB1dCBhIHN0cmluZyB0byB0aGUgdXNiIGNsaWVudCBwb3J0LgorICogT3V0cHV0IGEgc3RyaW5nIHRvIHRoZSB1c2IgY2xpZW50IHBvcnQgLSBpbXBsZW1lbnRpbmcgZmxvdyBjb250cm9sCiAgKi8KKwogc3RhdGljIHZvaWQgX191c2J0dHlfcHV0cyAoY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQogewogCWludCBtYXhsZW4gPSB1c2J0dHlfb3V0cHV0LnRvdGFsc2l6ZTsKQEAgLTI2MSwyMiArNDcxLDE5IEBACiAKIAkvKiBicmVhayBzdHIgaW50byBjaHVua3MgPCBidWZmZXIgc2l6ZSwgaWYgbmVlZGVkICovCiAJd2hpbGUgKGxlbiA+IDApIHsKKwkJdXNidHR5X3BvbGwgKCk7CisKIAkJc3BhY2UgPSBtYXhsZW4gLSB1c2J0dHlfb3V0cHV0LnNpemU7Ci0KIAkJLyogRW1wdHkgYnVmZmVyIGhlcmUsIGlmIG5lZWRlZCwgdG8gZW5zdXJlIHNwYWNlLi4uICovCi0JCWlmIChzcGFjZSA8PSAwKSB7CisJCWlmIChzcGFjZSkgewogCQkJd3JpdGVfYnVmZmVyICgmdXNidHR5X291dHB1dCk7Ci0JCQlzcGFjZSA9IG1heGxlbiAtIHVzYnR0eV9vdXRwdXQuc2l6ZTsKLQkJCWlmIChzcGFjZSA8PSAwKSB7Ci0JCQkJc3BhY2UgPSBsZW47CS8qIGFsbG93IG9sZCBkYXRhIHRvIGJlIG92ZXJ3cml0dGVuLiAqLwotCQkJfQorCisJCQluID0gTUlOIChzcGFjZSwgTUlOIChsZW4sIG1heGxlbikpOworCQkJYnVmX3B1c2ggKCZ1c2J0dHlfb3V0cHV0LCBzdHIsIG4pOworCisJCQlzdHIgKz0gbjsKKwkJCWxlbiAtPSBuOwogCQl9Ci0KLQkJbiA9IE1JTiAoc3BhY2UsIE1JTiAobGVuLCBtYXhsZW4pKTsKLQkJYnVmX3B1c2ggKCZ1c2J0dHlfb3V0cHV0LCBzdHIsIG4pOwotCi0JCXN0ciArPSBuOwotCQlsZW4gLT0gbjsKIAl9CiB9CiAKQEAgLTMxMyw4ICs1MjAsMTAgQEAKIHsKIAlpbnQgcmM7CiAJY2hhciAqIHNuOworCWNoYXIgKiB0dDsKIAlpbnQgc25sZW47CiAKKwkvKiBHZXIgc2VpcmFsIG51bWJlciAqLwogCWlmICghKHNuID0gZ2V0ZW52KCJzZXJpYWwjIikpKSB7CiAJCXNuID0gIjAwMDAwMDAwMDAwMCI7CiAJfQpAQCAtMzI3LDYgKzUzNiwxNCBAQAogCW1lbWNweSAoc2VyaWFsX251bWJlciwgc24sIHNubGVuKTsKIAlzZXJpYWxfbnVtYmVyW3NubGVuXSA9ICdcMCc7CiAKKwkvKiBEZWNpZGUgb24gd2hpY2ggdHlwZSBvZiBVREMgZGV2aWNlIHRvIGJlLgorCSAqLworCisJaWYoISh0dCA9IGdldGVudigidXNidHR5IikpKSB7CisJCXR0ID0gImdlbmVyaWMiOworCX0KKwl1c2J0dHlfaW5pdF90ZXJtaW5hbF90eXBlKHN0cmNtcCh0dCwiY2RjX2FjbSIpKTsKKwogCS8qIHByZXBhcmUgYnVmZmVycy4uLiAqLwogCWJ1Zl9pbml0ICgmdXNidHR5X2lucHV0LCBVU0JUVFlfQlVGRkVSX1NJWkUpOwogCWJ1Zl9pbml0ICgmdXNidHR5X291dHB1dCwgVVNCVFRZX0JVRkZFUl9TSVpFKTsKQEAgLTMzNyw3ICs1NTQsNyBAQAogCXVzYnR0eV9pbml0X3N0cmluZ3MgKCk7CiAJdXNidHR5X2luaXRfaW5zdGFuY2VzICgpOwogCi0JdWRjX3N0YXJ0dXBfZXZlbnRzIChkZXZpY2VfaW5zdGFuY2UpOwkvKiBFbmFibGUgb3VyIGRldmljZSwgaW5pdGlhbGl6ZSB1ZGMgcG9pbnRlcnMgKi8KKwl1ZGNfc3RhcnR1cF9ldmVudHMgKGRldmljZV9pbnN0YW5jZSk7LyogRW5hYmxlIGRldiwgaW5pdCB1ZGMgcG9pbnRlcnMgKi8KIAl1ZGNfY29ubmVjdCAoKTsJCS8qIEVuYWJsZSBwdWxsdXAgZm9yIGhvc3QgZGV0ZWN0aW9uICovCiAKIAl1c2J0dHlfaW5pdF9lbmRwb2ludHMgKCk7CkBAIC0zNjIsMzAgKzU3OSw0OCBAQAogewogCXN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKnN0cmluZzsKIAorCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX0xBTkddID0KKwkJKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IqKXdzdHJMYW5nOworCiAJc3RyaW5nID0gKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKikgd3N0ck1hbnVmYWN0dXJlcjsKLQlzdHJpbmctPmJMZW5ndGggPSBzaXplb2YgKHdzdHJNYW51ZmFjdHVyZXIpOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZih3c3RyTWFudWZhY3R1cmVyKTsKIAlzdHJpbmctPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TVFJJTkc7CiAJc3RyMndpZGUgKENPTkZJR19VU0JEX01BTlVGQUNUVVJFUiwgc3RyaW5nLT53RGF0YSk7CisJdXNidHR5X3N0cmluZ190YWJsZVtTVFJfTUFOVUZBQ1RVUkVSXT1zdHJpbmc7CisKIAogCXN0cmluZyA9IChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICopIHdzdHJQcm9kdWN0OwotCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZiAod3N0clByb2R1Y3QpOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZih3c3RyUHJvZHVjdCk7CiAJc3RyaW5nLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1RSSU5HOwogCXN0cjJ3aWRlIChDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUsIHN0cmluZy0+d0RhdGEpOworCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX1BST0RVQ1RdPXN0cmluZzsKKwogCiAJc3RyaW5nID0gKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKikgd3N0clNlcmlhbDsKLQlzdHJpbmctPmJMZW5ndGggPSAyICsgMipzdHJsZW4oc2VyaWFsX251bWJlcik7CisJc3RyaW5nLT5iTGVuZ3RoID0gc2l6ZW9mKHNlcmlhbF9udW1iZXIpOwogCXN0cmluZy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NUUklORzsKIAlzdHIyd2lkZSAoc2VyaWFsX251bWJlciwgc3RyaW5nLT53RGF0YSk7CisJdXNidHR5X3N0cmluZ190YWJsZVtTVFJfU0VSSUFMXT1zdHJpbmc7CisKIAogCXN0cmluZyA9IChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICopIHdzdHJDb25maWd1cmF0aW9uOwotCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZiAod3N0ckNvbmZpZ3VyYXRpb24pOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZih3c3RyQ29uZmlndXJhdGlvbik7CiAJc3RyaW5nLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1RSSU5HOwogCXN0cjJ3aWRlIChDT05GSUdfVVNCRF9DT05GSUdVUkFUSU9OX1NUUiwgc3RyaW5nLT53RGF0YSk7CisJdXNidHR5X3N0cmluZ190YWJsZVtTVFJfQ09ORklHXT1zdHJpbmc7CiAKLQlzdHJpbmcgPSAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqKSB3c3RySW50ZXJmYWNlOwotCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZiAod3N0ckludGVyZmFjZSk7CisKKwlzdHJpbmcgPSAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqKSB3c3RyRGF0YUludGVyZmFjZTsKKwlzdHJpbmctPmJMZW5ndGggPSBzaXplb2Yod3N0ckRhdGFJbnRlcmZhY2UpOwogCXN0cmluZy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NUUklORzsKLQlzdHIyd2lkZSAoQ09ORklHX1VTQkRfSU5URVJGQUNFX1NUUiwgc3RyaW5nLT53RGF0YSk7CisJc3RyMndpZGUgKENPTkZJR19VU0JEX0RBVEFfSU5URVJGQUNFX1NUUiwgc3RyaW5nLT53RGF0YSk7CisJdXNidHR5X3N0cmluZ190YWJsZVtTVFJfREFUQV9JTlRFUkZBQ0VdPXN0cmluZzsKKworCXN0cmluZyA9IChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICopIHdzdHJDdHJsSW50ZXJmYWNlOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZih3c3RyQ3RybEludGVyZmFjZSk7CisJc3RyaW5nLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1RSSU5HOworCXN0cjJ3aWRlIChDT05GSUdfVVNCRF9DVFJMX0lOVEVSRkFDRV9TVFIsIHN0cmluZy0+d0RhdGEpOworCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX0NUUkxfSU5URVJGQUNFXT1zdHJpbmc7CiAKIAkvKiBOb3csIGluaXRpYWxpemUgdGhlIHN0cmluZyB0YWJsZSBmb3IgZXAwIGhhbmRsaW5nICovCiAJdXNiX3N0cmluZ3MgPSB1c2J0dHlfc3RyaW5nX3RhYmxlOwpAQCAtNDAwLDYgKzYzNSw3IEBACiAJZGV2aWNlX2luc3RhbmNlLT5kZXZpY2Vfc3RhdGUgPSBTVEFURV9JTklUOwogCWRldmljZV9pbnN0YW5jZS0+ZGV2aWNlX2Rlc2NyaXB0b3IgPSAmZGV2aWNlX2Rlc2NyaXB0b3I7CiAJZGV2aWNlX2luc3RhbmNlLT5ldmVudCA9IHVzYnR0eV9ldmVudF9oYW5kbGVyOworCWRldmljZV9pbnN0YW5jZS0+Y2RjX3JlY3Zfc2V0dXAgPSB1c2J0dHlfY2RjX3NldHVwOwogCWRldmljZV9pbnN0YW5jZS0+YnVzID0gYnVzX2luc3RhbmNlOwogCWRldmljZV9pbnN0YW5jZS0+Y29uZmlndXJhdGlvbnMgPSBOVU1fQ09ORklHUzsKIAlkZXZpY2VfaW5zdGFuY2UtPmNvbmZpZ3VyYXRpb25faW5zdGFuY2VfYXJyYXkgPSBjb25maWdfaW5zdGFuY2U7CkBAIC00MTUsOCArNjUxLDggQEAKIAkvKiBjb25maWd1cmF0aW9uIGluc3RhbmNlICovCiAJbWVtc2V0IChjb25maWdfaW5zdGFuY2UsIDAsCiAJCXNpemVvZiAoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2luc3RhbmNlKSk7Ci0JY29uZmlnX2luc3RhbmNlLT5pbnRlcmZhY2VzID0gTlVNX0lOVEVSRkFDRVM7Ci0JY29uZmlnX2luc3RhbmNlLT5jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IgPSBjb25maWdfZGVzY3JpcHRvcnM7CisJY29uZmlnX2luc3RhbmNlLT5pbnRlcmZhY2VzID0gaW50ZXJmYWNlX2NvdW50OworCWNvbmZpZ19pbnN0YW5jZS0+Y29uZmlndXJhdGlvbl9kZXNjcmlwdG9yID0gY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yOwogCWNvbmZpZ19pbnN0YW5jZS0+aW50ZXJmYWNlX2luc3RhbmNlX2FycmF5ID0gaW50ZXJmYWNlX2luc3RhbmNlOwogCiAJLyogaW50ZXJmYWNlIGluc3RhbmNlICovCkBAIC00NDcsMTcgKzY4MywyMiBAQAogCQkJc2l6ZW9mIChzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlKSk7CiAKIAkJZW5kcG9pbnRfaW5zdGFuY2VbaV0uZW5kcG9pbnRfYWRkcmVzcyA9Ci0JCQllcF9kZXNjcmlwdG9yc1tpIC0gMV0uYkVuZHBvaW50QWRkcmVzczsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPmJFbmRwb2ludEFkZHJlc3M7CisKKwkJZW5kcG9pbnRfaW5zdGFuY2VbaV0ucmN2X2F0dHJpYnV0ZXMgPQorCQkJZXBfZGVzY3JpcHRvcl9wdHJzW2kgLSAxXS0+Ym1BdHRyaWJ1dGVzOwogCiAJCWVuZHBvaW50X2luc3RhbmNlW2ldLnJjdl9wYWNrZXRTaXplID0KLQkJCWVwX2Rlc2NyaXB0b3JzW2kgLSAxXS53TWF4UGFja2V0U2l6ZTsKLQkJZW5kcG9pbnRfaW5zdGFuY2VbaV0ucmN2X2F0dHJpYnV0ZXMgPQotCQkJZXBfZGVzY3JpcHRvcnNbaSAtIDFdLmJtQXR0cmlidXRlczsKKwkJCWxlMTZfdG9fY3B1KGVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPndNYXhQYWNrZXRTaXplKTsKKworCQllbmRwb2ludF9pbnN0YW5jZVtpXS50eF9hdHRyaWJ1dGVzID0KKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPmJtQXR0cmlidXRlczsKIAogCQllbmRwb2ludF9pbnN0YW5jZVtpXS50eF9wYWNrZXRTaXplID0KLQkJCWVwX2Rlc2NyaXB0b3JzW2kgLSAxXS53TWF4UGFja2V0U2l6ZTsKKwkJCWxlMTZfdG9fY3B1KGVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPndNYXhQYWNrZXRTaXplKTsKKwogCQllbmRwb2ludF9pbnN0YW5jZVtpXS50eF9hdHRyaWJ1dGVzID0KLQkJCWVwX2Rlc2NyaXB0b3JzW2kgLSAxXS5ibUF0dHJpYnV0ZXM7CisJCQllcF9kZXNjcmlwdG9yX3B0cnNbaSAtIDFdLT5ibUF0dHJpYnV0ZXM7CiAKIAkJdXJiX2xpbmtfaW5pdCAoJmVuZHBvaW50X2luc3RhbmNlW2ldLnJjdik7CiAJCXVyYl9saW5rX2luaXQgKCZlbmRwb2ludF9pbnN0YW5jZVtpXS5yZHkpOwpAQCAtNDgwLDEzICs3MjEsNzkgQEAKIAlpbnQgaTsKIAogCWJ1c19pbnN0YW5jZS0+bWF4X2VuZHBvaW50cyA9IE5VTV9FTkRQT0lOVFMgKyAxOwotCWZvciAoaSA9IDA7IGkgPD0gTlVNX0VORFBPSU5UUzsgaSsrKSB7CisJZm9yIChpID0gMTsgaSA8PSBOVU1fRU5EUE9JTlRTOyBpKyspIHsKIAkJdWRjX3NldHVwX2VwIChkZXZpY2VfaW5zdGFuY2UsIGksICZlbmRwb2ludF9pbnN0YW5jZVtpXSk7CiAJfQogfQogCisvKiB1c2J0dHlfaW5pdF90ZXJtaW5hbF90eXBlCisgKgorICogRG8gc29tZSBsYXRlIGJpbmRpbmcgZm9yIG91ciBkZXZpY2UgdHlwZS4KKyAqLworc3RhdGljIHZvaWQgdXNidHR5X2luaXRfdGVybWluYWxfdHlwZShzaG9ydCB0eXBlKQoreworCXN3aXRjaCh0eXBlKXsKKwkJLyogQ0RDIEFDTSAqLworCQljYXNlIDA6CisJCQkvKiBBc3NpZ24gZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1swXSA9CisJCQkJJmFjbV9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzWzBdLm5vdGlmaWNhdGlvbl9lbmRwb2ludDsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1sxXSA9CisJCQkJJmFjbV9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzWzBdLmRhdGFfZW5kcG9pbnRzWzBdOworCQkJZXBfZGVzY3JpcHRvcl9wdHJzWzJdID0KKwkJCQkmYWNtX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnNbMF0uZGF0YV9lbmRwb2ludHNbMV07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCQkvKiBFbnVtZXJhdGUgRGV2aWNlIERlc2NyaXB0b3IgKi8KKwkJCWRldmljZV9kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyA9CisJCQkJQ09NTVVOSUNBVElPTlNfREVWSUNFX0NMQVNTOworCQkJZGV2aWNlX2Rlc2NyaXB0b3IuaWRQcm9kdWN0ID0KKwkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9QUk9EVUNUSURfQ0RDQUNNKTsKKworCQkJLyogQXNzaWduIGVuZHBvaW50IGluZGljZXMgKi8KKwkJCXR4X2VuZHBvaW50ID0gQUNNX1RYX0VORFBPSU5UOworCQkJcnhfZW5kcG9pbnQgPSBBQ01fUlhfRU5EUE9JTlQ7CisKKwkJCS8qIENvbmZpZ3VyYXRpb24gRGVzY3JpcHRvciAqLworCQkJY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yID0KKwkJCQkoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IqKQorCQkJCSZhY21fY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yczsKKworCQkJLyogSW50ZXJmYWNlIGNvdW50ICovCisJCQlpbnRlcmZhY2VfY291bnQgPSBOVU1fQUNNX0lOVEVSRkFDRVM7CisJCWJyZWFrOworCisJCS8qIEJVTEsgSU4vT1VUICYgRGVmYXVsdCAqLworCQljYXNlIDE6CisJCWRlZmF1bHQ6CisJCQkvKiBBc3NpZ24gZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1swXSA9CisJCQkJJmdzZXJpYWxfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1swXS5kYXRhX2VuZHBvaW50c1swXTsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1sxXSA9CisJCQkJJmdzZXJpYWxfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1swXS5kYXRhX2VuZHBvaW50c1sxXTsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1syXSA9CisJCQkJJmdzZXJpYWxfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1swXS5kYXRhX2VuZHBvaW50c1syXTsKKworCQkJLyogRW51bWVyYXRlIERldmljZSBEZXNjcmlwdG9yICovCisJCQlkZXZpY2VfZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgPSAweEZGOworCQkJZGV2aWNlX2Rlc2NyaXB0b3IuaWRQcm9kdWN0ID0KKwkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9QUk9EVUNUSURfR1NFUklBTCk7CisKKwkJCS8qIEFzc2lnbiBlbmRwb2ludCBpbmRpY2VzICovCisJCQl0eF9lbmRwb2ludCA9IEdTRVJJQUxfVFhfRU5EUE9JTlQ7CisJCQlyeF9lbmRwb2ludCA9IEdTRVJJQUxfUlhfRU5EUE9JTlQ7CisKKwkJCS8qIENvbmZpZ3VyYXRpb24gRGVzY3JpcHRvciAqLworCQkJY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yID0KKwkJCQkoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IqKQorCQkJCSZnc2VyaWFsX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnM7CisKKwkJCS8qIEludGVyZmFjZSBjb3VudCAqLworCQkJaW50ZXJmYWNlX2NvdW50ID0gTlVNX0dTRVJJQUxfSU5URVJGQUNFUzsKKwkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgc3RydWN0IHVyYiAqbmV4dF91cmIgKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UsCiAJCQkgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50KQpAQCAtNTI2LDI3ICs4MzMsMzkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGJ1Zi0+c2l6ZSkgeworCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50ID0KKwkJCSZlbmRwb2ludF9pbnN0YW5jZVt0eF9lbmRwb2ludF07CisJc3RydWN0IHVyYiAqY3VycmVudF91cmIgPSBOVUxMOwogCi0JCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50ID0KLQkJCSZlbmRwb2ludF9pbnN0YW5jZVtUWF9FTkRQT0lOVF07Ci0JCXN0cnVjdCB1cmIgKmN1cnJlbnRfdXJiID0gTlVMTDsKKwljdXJyZW50X3VyYiA9IG5leHRfdXJiIChkZXZpY2VfaW5zdGFuY2UsIGVuZHBvaW50KTsKKwkvKiBUWCBkYXRhIHN0aWxsIGV4aXN0cyAtIHNlbmQgaXQgbm93CisJICovCisJaWYoZW5kcG9pbnQtPnNlbnQgPCBjdXJyZW50X3VyYi0+YWN0dWFsX2xlbmd0aCl7CisJCWlmKHVkY19lbmRwb2ludF93cml0ZSAoZW5kcG9pbnQpKXsKKwkJCS8qIFdyaXRlIHByZS1lbXB0ZWQgYnkgUlggKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChidWYtPnNpemUpIHsKIAkJY2hhciAqZGVzdDsKIAogCQlpbnQgc3BhY2VfYXZhaWw7CiAJCWludCBwb3BudW0sIHBvcHBlZDsKIAkJaW50IHRvdGFsID0gMDsKIAotCQkvKiBCcmVhayBidWZmZXIgaW50byB1cmIgc2l6ZWQgcGllY2VzLCBhbmQgbGluayBlYWNoIHRvIHRoZSBlbmRwb2ludCAqLworCQkvKiBCcmVhayBidWZmZXIgaW50byB1cmIgc2l6ZWQgcGllY2VzLAorCQkgKiBhbmQgbGluayBlYWNoIHRvIHRoZSBlbmRwb2ludAorCQkgKi8KIAkJd2hpbGUgKGJ1Zi0+c2l6ZSA+IDApIHsKLQkJCWN1cnJlbnRfdXJiID0gbmV4dF91cmIgKGRldmljZV9pbnN0YW5jZSwgZW5kcG9pbnQpOworCiAJCQlpZiAoIWN1cnJlbnRfdXJiKSB7CiAJCQkJVFRZRVJSICgiY3VycmVudF91cmIgaXMgTlVMTCwgYnVmLT5zaXplICVkXG4iLAogCQkJCQlidWYtPnNpemUpOwogCQkJCXJldHVybiB0b3RhbDsKIAkJCX0KIAotCQkJZGVzdCA9IGN1cnJlbnRfdXJiLT5idWZmZXIgKworCQkJZGVzdCA9IChjaGFyKiljdXJyZW50X3VyYi0+YnVmZmVyICsKIAkJCQljdXJyZW50X3VyYi0+YWN0dWFsX2xlbmd0aDsKIAogCQkJc3BhY2VfYXZhaWwgPQpAQCAtNTYyLDE0ICs4ODEsMTkgQEAKIAkJCWN1cnJlbnRfdXJiLT5hY3R1YWxfbGVuZ3RoICs9IHBvcHBlZDsKIAkJCXRvdGFsICs9IHBvcHBlZDsKIAotCQkJLyogSWYgZW5kcG9pbnQtPmxhc3QgPT0gMCwgdGhlbiB0cmFuc2ZlcnMgaGF2ZSBub3Qgc3RhcnRlZCBvbiB0aGlzIGVuZHBvaW50ICovCisJCQkvKiBJZiBlbmRwb2ludC0+bGFzdCA9PSAwLCB0aGVuIHRyYW5zZmVycyBoYXZlCisJCQkgKiBub3Qgc3RhcnRlZCBvbiB0aGlzIGVuZHBvaW50CisJCQkgKi8KIAkJCWlmIChlbmRwb2ludC0+bGFzdCA9PSAwKSB7Ci0JCQkJdWRjX2VuZHBvaW50X3dyaXRlIChlbmRwb2ludCk7CisJCQkJaWYodWRjX2VuZHBvaW50X3dyaXRlIChlbmRwb2ludCkpeworCQkJCQkvKiBXcml0ZSBwcmUtZW1wdGVkIGJ5IFJYICovCisJCQkJCXJldHVybiAtMTsKKwkJCQl9CiAJCQl9CiAKLQkJfQkJLyogZW5kIHdoaWxlICovCisJCX0vKiBlbmQgd2hpbGUgKi8KIAkJcmV0dXJuIHRvdGFsOwotCX0JCQkvKiBlbmQgaWYgdHhfdXJiICovCisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzcsMTggKzkwMSwyMiBAQAogc3RhdGljIGludCBmaWxsX2J1ZmZlciAoY2lyY2J1Zl90ICogYnVmKQogewogCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50ID0KLQkJJmVuZHBvaW50X2luc3RhbmNlW1JFQ1ZfRU5EUE9JTlRdOworCQkmZW5kcG9pbnRfaW5zdGFuY2VbcnhfZW5kcG9pbnRdOwogCiAJaWYgKGVuZHBvaW50LT5yY3ZfdXJiICYmIGVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCXVuc2lnbmVkIGludCBuYiA9IGVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgbmIgPSAwOwogCQljaGFyICpzcmMgPSAoY2hhciAqKSBlbmRwb2ludC0+cmN2X3VyYi0+YnVmZmVyOworCQl1bnNpZ25lZCBpbnQgcnhfYXZhaWwgPSBidWYtPnRvdGFsc2l6ZSAtIGJ1Zi0+c2l6ZTsKIAotCQlidWZfcHVzaCAoYnVmLCBzcmMsIG5iKTsKLQkJZW5kcG9pbnQtPnJjdl91cmItPmFjdHVhbF9sZW5ndGggPSAwOworCQlpZihyeF9hdmFpbCA+PSBlbmRwb2ludC0+cmN2X3VyYi0+YWN0dWFsX2xlbmd0aCl7CiAKKwkJCW5iID0gZW5kcG9pbnQtPnJjdl91cmItPmFjdHVhbF9sZW5ndGg7CisJCQlidWZfcHVzaCAoYnVmLCBzcmMsIG5iKTsKKwkJCWVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCQl9CiAJCXJldHVybiBuYjsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTk3LDcgKzkyNSw3IEBACiAJcmV0dXJuIHVzYnR0eV9jb25maWd1cmVkX2ZsYWc7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZCB1c2J0dHlfZXZlbnRfaGFuZGxlciAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwKIAkJCQkgIHVzYl9kZXZpY2VfZXZlbnRfdCBldmVudCwgaW50IGRhdGEpCkBAIC02MTksOCArOTQ3LDM0IEBACiAJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAoraW50IHVzYnR0eV9jZGNfc2V0dXAoc3RydWN0IHVzYl9kZXZpY2VfcmVxdWVzdCAqcmVxdWVzdCwgc3RydWN0IHVyYiAqdXJiKQoreworCXN3aXRjaCAocmVxdWVzdC0+YlJlcXVlc3QpeworCisJICAgCWNhc2UgQUNNX1NFVF9DT05UUk9MX0xJTkVfU1RBVEU6CS8qIEltcGxpZXMgRFRFIHJlYWR5ICovCisJCQlicmVhazsKKwkgICAJY2FzZSBBQ01fU0VORF9FTkNBUFNVTEFURURfQ09NTUFORCA6CS8qIFJlcXVpcmVkICovCisJCQlicmVhazsKKwkJY2FzZSBBQ01fU0VUX0xJTkVfRU5DT0RJTkcgOgkJLyogRFRFIHN0b3AvcGFyaXR5IGJpdHMKKwkJCQkJCQkgKiBwZXIgY2hhcmFjdGVyICovCisJCQlicmVhazsKKwkgICAJY2FzZSBBQ01fR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRSA6CS8qIHJlcXVlc3QgcmVzcG9uc2UgKi8KKwkJCWJyZWFrOworCQljYXNlIEFDTV9HRVRfTElORV9FTkNPRElORyA6CQkvKiByZXF1ZXN0IERURSByYXRlLAorCQkJCQkJCSAqIHN0b3AvcGFyaXR5IGJpdHMgKi8KKwkJCW1lbWNweSAodXJiLT5idWZmZXIgLCAmcnMyMzJfZGVzYywgc2l6ZW9mKHJzMjMyX2Rlc2MpKTsKKwkJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IHNpemVvZihyczIzMl9kZXNjKTsKKworCQkJYnJlYWs7CisJIAlkZWZhdWx0OgorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgogICogU2luY2UgaW50ZXJydXB0IGhhbmRsaW5nIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQsIHdlIHVzZSB0aGlzIGZ1bmN0aW9uCkBAIC02MzAsMzYgKzk4NCwyOSBAQAogdm9pZCB1c2J0dHlfcG9sbCAodm9pZCkKIHsKIAkvKiBOZXcgaW50ZXJydXB0cz8gKi8KLQlwcmV0ZW5kX2ludGVycnVwdHMgKCk7CisJdWRjX2lycSgpOwogCi0JLyogV3JpdGUgYW55IG91dHB1dCBkYXRhIHRvIGhvc3QgYnVmZmVyIChkbyB0aGlzIGJlZm9yZSBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGF2b2lkIG1pc3Npbmcgb25lKSAqLworCS8qIFdyaXRlIGFueSBvdXRwdXQgZGF0YSB0byBob3N0IGJ1ZmZlcgorCSAqIChkbyB0aGlzIGJlZm9yZSBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGF2b2lkIG1pc3Npbmcgb25lKQorCSAqLwogCWlmICh1c2J0dHlfY29uZmlndXJlZCAoKSkgewogCQl3cml0ZV9idWZmZXIgKCZ1c2J0dHlfb3V0cHV0KTsKIAl9CiAKIAkvKiBOZXcgaW50ZXJydXB0cz8gKi8KLQlwcmV0ZW5kX2ludGVycnVwdHMgKCk7CisJdWRjX2lycSgpOwogCi0JLyogQ2hlY2sgZm9yIG5ldyBkYXRhIGZyb20gaG9zdC4uIChkbyB0aGlzIGFmdGVyIGNoZWNraW5nIGludGVycnVwdHMgdG8gZ2V0IGxhdGVzdCBkYXRhKSAqLworCS8qIENoZWNrIGZvciBuZXcgZGF0YSBmcm9tIGhvc3QuLgorCSAqIChkbyB0aGlzIGFmdGVyIGNoZWNraW5nIGludGVycnVwdHMgdG8gZ2V0IGxhdGVzdCBkYXRhKQorCSAqLwogCWlmICh1c2J0dHlfY29uZmlndXJlZCAoKSkgewogCQlmaWxsX2J1ZmZlciAoJnVzYnR0eV9pbnB1dCk7CiAJfQogCiAJLyogTmV3IGludGVycnVwdHM/ICovCi0JcHJldGVuZF9pbnRlcnJ1cHRzICgpOworCXVkY19pcnEoKTsKKwogfQogCi1zdGF0aWMgdm9pZCBwcmV0ZW5kX2ludGVycnVwdHMgKHZvaWQpCi17Ci0JLyogTG9vcCB3aGlsZSB3ZSBoYXZlIGludGVycnVwdHMuCi0JICogSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlIGlucHV0IGNoYWluCi0JICogcG9sbGluZyBkZWxheSBpcyBsaWtlbHkgdG8gbWlzcwotCSAqIGhvc3QgcmVxdWVzdHMuCi0JICovCi0Jd2hpbGUgKGludyAoVURDX0lSUV9TUkMpICYgflVEQ19TT0ZfRmxnKSB7Ci0JCS8qIEhhbmRsZSBhbnkgbmV3IElSUXMgKi8KLQkJb21hcDE1MTBfdWRjX2lycSAoKTsKLQkJb21hcDE1MTBfdWRjX25vbmlzb19pcnEgKCk7Ci0JfQotfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNidHR5LmggYi9kcml2ZXJzL3VzYnR0eS5oCmluZGV4IDc5YzJmZTUuLjgxNTRlMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNidHR5LmgKKysrIGIvZHJpdmVycy91c2J0dHkuaApAQCAtMiw2ICsyLDkgQEAKICAqIChDKSBDb3B5cmlnaHQgMjAwMwogICogR2VycnkgSGFtZWwsIGdlaEB0aS5jb20sIFRleGFzIEluc3RydW1lbnRzCiAgKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBCcnlhbiBPJ0Rvbm9naHVlLCBib2Rvbm9naHVlQGNvZGVoZXJtaXQuaWUsIENvZGVIZXJtaXQKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0yMSw0NCArMjQsNDcgQEAKICNpZm5kZWYgX19VU0JfVFRZX0hfXwogI2RlZmluZSBfX1VTQl9UVFlfSF9fCiAKLQogI2luY2x1ZGUgInVzYmRjb3JlLmgiCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKQorI2luY2x1ZGUgInVzYmRjb3JlX21wYzh4eC5oIgorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJNKQogI2luY2x1ZGUgInVzYmRjb3JlX29tYXAxNTEwLmgiCisjZW5kaWYKIAorI2luY2x1ZGUgPHZlcnNpb25fYXV0b2dlbmVyYXRlZC5oPgogCi0jZGVmaW5lIE5VTV9DT05GSUdTICAgIDEKLSNkZWZpbmUgTlVNX0lOVEVSRkFDRVMgMQotI2RlZmluZSBOVU1fRU5EUE9JTlRTICAzCisvKiBJZiBubyBWZW5kb3JJRC9Qcm9kdWN0SUQgaXMgZGVmaW5lZCBpbiBjb25maWcuaCwgcHJldGVuZCB0byBiZSBMaW51eAorICogRE8gTk9UIFJldXNlIHRoaXMgVmVuZG9yL1Byb2R1Y3Qgc2V0dXAgd2l0aCBwcm90b2NvbCBpbmNvbXBhdGlibGUgZGV2aWNlcyAqLwogCi0jZGVmaW5lIEVQMF9NQVhfUEFDS0VUX1NJWkUgNjQKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQgMHgwNTI1IAkvKiBMaW51eC9OZXRDaGlwICovCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRF9HU0VSSUFMIDB4YTRhNgkvKiBnc2VyaWFsICovCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRF9DRENBQ00gIDB4YTRhNwkvKiBDREMgQUNNICovCisjZGVmaW5lIENPTkZJR19VU0JEX01BTlVGQUNUVVJFUiAiRGFzIFUtQm9vdCIKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FIFVfQk9PVF9WRVJTSU9OCisKIAogI2RlZmluZSBDT05GSUdfVVNCRF9DT05GSUdVUkFUSU9OX1NUUiAiVFRZIHZpYSBVU0IiCi0jZGVmaW5lIENPTkZJR19VU0JEX0lOVEVSRkFDRV9TVFIgICAgICJTaW1wbGUgU2VyaWFsIERhdGEgSW50ZXJmYWNlIC0gQnVsayBNb2RlIgogCi0KLSNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX09VVF9FTkRQT0lOVCAyCi0jZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9PVVRfUEtUU0laRQk2NAotI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fRU5EUE9JTlQJMQotI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fUEtUU0laRQk2NAotI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5UX0VORFBPSU5UIDUKLSNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0lOVF9QS1RTSVpFCTE2Ci0KKyNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX09VVF9FTkRQT0lOVCBVRENfT1VUX0VORFBPSU5UCisjZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9PVVRfUEtUU0laRQlVRENfT1VUX1BBQ0tFVF9TSVpFCisjZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9JTl9FTkRQT0lOVAlVRENfSU5fRU5EUE9JTlQKKyNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0lOX1BLVFNJWkUJVURDX0lOX1BBQ0tFVF9TSVpFCisjZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9JTlRfRU5EUE9JTlQgVURDX0lOVF9FTkRQT0lOVAorI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5UX1BLVFNJWkUJVURDX0lOVF9QQUNLRVRfU0laRQorI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfQlVMS19QS1RTSVpFCVVEQ19CVUxLX1BBQ0tFVF9TSVpFCiAKICNkZWZpbmUgVVNCVFRZX0RFVklDRV9DTEFTUwlDT01NVU5JQ0FUSU9OU19ERVZJQ0VfQ0xBU1MKLSNkZWZpbmUgVVNCVFRZX0RFVklDRV9TVUJDTEFTUwlDT01NVU5JQ0FUSU9OU19OT19TVUJDTEFTUwotI2RlZmluZSBVU0JUVFlfREVWSUNFX1BST1RPQ09MCUNPTU1VTklDQVRJT05TX05PX1BST1RPQ09MCiAKLSNkZWZpbmUgVVNCVFRZX0lOVEVSRkFDRV9DTEFTUwkgICAweEZGIC8qIFZlbmRvciBTcGVjaWZpYyAqLwotI2RlZmluZSBVU0JUVFlfSU5URVJGQUNFX1NVQkNMQVNTICAweDAyCi0jZGVmaW5lIFVTQlRUWV9JTlRFUkZBQ0VfUFJPVE9DT0wgIDB4MDEKKyNkZWZpbmUgVVNCVFRZX0JDRF9ERVZJQ0UgCTB4MDAKKyNkZWZpbmUgVVNCVFRZX01BWFBPV0VSCSAgCTB4MDAKIAotI2RlZmluZSBVU0JUVFlfQkNEX0RFVklDRSAweDAKLSNkZWZpbmUgVVNCVFRZX01BWFBPV0VSCSAgMHgwCi0KLSNkZWZpbmUgU1RSX01BTlVGQUNUVVJFUiAxCi0jZGVmaW5lIFNUUl9QUk9EVUNUCSAyCi0jZGVmaW5lIFNUUl9TRVJJQUwJIDMKLSNkZWZpbmUgU1RSX0NPTkZJRwkgNAotI2RlZmluZSBTVFJfSU5URVJGQUNFCSA1CisjZGVmaW5lIFNUUl9MQU5HCQkweDAwCisjZGVmaW5lIFNUUl9NQU5VRkFDVFVSRVIJMHgwMQorI2RlZmluZSBTVFJfUFJPRFVDVAkJMHgwMgorI2RlZmluZSBTVFJfU0VSSUFMCQkweDAzCisjZGVmaW5lIFNUUl9DT05GSUcJCTB4MDQKKyNkZWZpbmUgU1RSX0RBVEFfSU5URVJGQUNFCTB4MDUKKyNkZWZpbmUgU1RSX0NUUkxfSU5URVJGQUNFCTB4MDYKKyNkZWZpbmUgU1RSX0NPVU5UCQkweDA3CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHR0L01ha2VmaWxlIGIvZHR0L01ha2VmaWxlCmluZGV4IGU2Y2IxMjguLmM2YTY3MGEgMTAwNjQ0Ci0tLSBhL2R0dC9NYWtlZmlsZQorKysgYi9kdHQvTWFrZWZpbGUKQEAgLTMwLDcgKzMwLDcgQEAKIAogTElCCT0gJChvYmopbGliZHR0LmEKIAotQ09CSlMJPSBsbTc1Lm8gZHMxNjIxLm8gYWRtMTAyMS5vIGxtODEubworQ09CSlMJPSBsbTc1Lm8gZHMxNjIxLm8gYWRtMTAyMS5vIGxtODEubyBkczE3NzUubwogCiBTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2R0dC9kczE3NzUuYyBiL2R0dC9kczE3NzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDRjZWUzCi0tLSAvZGV2L251bGwKKysrIGIvZHR0L2RzMTc3NS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERhbGxhcyBTZW1pY29uZHVjdG9yJ3MgRFMxNzc1IERpZ2l0YWwgVGhlcm1vbWV0ZXIgYW5kIFRoZXJtb3N0YXQKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfRFRUX0RTMTc3NQorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGR0dC5oPgorCisjZGVmaW5lIERUVF9JMkNfREVWX0NPREUgMHg0OQkJLyogRGFsbGFzIFNlbWkncyBEUzE3NzUgZGV2aWNlIGNvZGUgKi8KKworaW50IGR0dF9yZWFkKGludCBzZW5zb3IsIGludCByZWcpCit7CisJaW50IGRsZW47CisJdWNoYXIgZGF0YVsyXTsKKworCS8qCisJICogQ2FsY3VsYXRlIHNlbnNvciBhZGRyZXNzIGFuZCBjb21tYW5kCisJICovCisJc2Vuc29yID0gRFRUX0kyQ19ERVZfQ09ERSArIChzZW5zb3IgJiAweDA3KTsgLyogQ2FsY3VsYXRlIGFkZHIgb2YgZHMxNzc1ICovCisKKwkvKgorCSAqIFByZXBhcmUgdG8gaGFuZGxlIDIgYnl0ZSByZXN1bHQKKwkgKi8KKwlpZiAoKHJlZyA9PSBEVFRfUkVBRF9URU1QKSB8fAorCSAgICAocmVnID09IERUVF9URU1QX09TKSB8fCAocmVnID09IERUVF9URU1QX0hZU1QpKQorCQlkbGVuID0gMjsKKwllbHNlCisJCWRsZW4gPSAxOworCisJLyoKKwkgKiBOb3cgdHJ5IHRvIHJlYWQgdGhlIHJlZ2lzdGVyCisJICovCisJaWYgKGkyY19yZWFkKHNlbnNvciwgcmVnLCAxLCBkYXRhLCBkbGVuKSAhPSAwKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogSGFuZGxlIDIgYnl0ZSByZXN1bHQKKwkgKi8KKwlpZiAoZGxlbiA9PSAyKQorCQlyZXR1cm4gKChpbnQpKChzaG9ydClkYXRhWzFdICsgKCgoc2hvcnQpZGF0YVswXSkgPDwgOCkpKTsKKworCXJldHVybiAoaW50KSBkYXRhWzBdOworfQorCisKK2ludCBkdHRfd3JpdGUoaW50IHNlbnNvciwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlpbnQgZGxlbjsKKwl1Y2hhciBkYXRhWzJdOworCisJLyoKKwkgKiBDYWxjdWxhdGUgc2Vuc29yIGFkZHJlc3MgYW5kIHJlZ2lzdGVyCisJICovCisJc2Vuc29yID0gRFRUX0kyQ19ERVZfQ09ERSArIChzZW5zb3IgJiAweDA3KTsKKworCS8qCisJICogSGFuZGxlIHZhcmlvdXMgZGF0YSBzaXplcworCSAqLworCWlmICgocmVnID09IERUVF9SRUFEX1RFTVApIHx8CisJICAgIChyZWcgPT0gRFRUX1RFTVBfT1MpIHx8IChyZWcgPT0gRFRUX1RFTVBfSFlTVCkpIHsKKwkJZGxlbiA9IDI7CisJCWRhdGFbMF0gPSAoY2hhcikoKHZhbCA+PiA4KSAmIDB4ZmYpOyAvKiBNU0IgZmlyc3QgKi8KKwkJZGF0YVsxXSA9IChjaGFyKSh2YWwgJiAweGZmKTsKKwl9IGVsc2UgeworCQlkbGVuID0gMTsKKwkJZGF0YVswXSA9IChjaGFyKSh2YWwgJiAweGZmKTsKKwl9CisKKwkvKgorCSAqIFdyaXRlIHZhbHVlIHRvIGRldmljZQorCSAqLworCWlmIChpMmNfd3JpdGUoc2Vuc29yLCByZWcsIDEsIGRhdGEsIGRsZW4pICE9IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfZHR0X2luaXQoaW50IHNlbnNvcikKK3sKKwlpbnQgdmFsOworCisJLyoKKwkgKiBTZXR1cCBIaWdoIFRlbXAKKwkgKi8KKwl2YWwgPSAoKENGR19EVFRfTUFYX1RFTVAgKiAyKSA8PCA3KSAmIDB4ZmY4MDsKKwlpZiAoZHR0X3dyaXRlKHNlbnNvciwgRFRUX1RFTVBfT1MsIHZhbCkgIT0gMCkKKwkJcmV0dXJuIDE7CisJdWRlbGF5KDUwMDAwKTsJCQkvKiBNYXggNTBtcyAqLworCisJLyoKKwkgKiBTZXR1cCBMb3cgVGVtcCAtIGh5c3RlcmVzaXMKKwkgKi8KKwl2YWwgPSAoKChDRkdfRFRUX01BWF9URU1QIC0gQ0ZHX0RUVF9IWVNURVJFU0lTKSAqIDIpIDw8IDcpICYgMHhmZjgwOworCWlmIChkdHRfd3JpdGUoc2Vuc29yLCBEVFRfVEVNUF9IWVNULCB2YWwpICE9IDApCisJCXJldHVybiAxOworCXVkZWxheSg1MDAwMCk7CQkJLyogTWF4IDUwbXMgKi8KKworCS8qCisJICogU2V0dXAgY29uZmlndXJhdG9uIHJlZ2lzdGVyCisJICoKKwkgKiBGYXVsdCBUb2xlcmFuY2UgbGltaXRzIDQsIFRoZXJtb21ldGVyIHJlc29sdXRpb24gYml0cyBpcyA5LAorCSAqIFBvbGFyaXR5ID0gQWN0aXZlIExvdyxjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSwgVGhlcm1vc3RhdAorCSAqIG1vZGUgaXMgaW50ZXJydXB0IG1vZGUKKwkgKi8KKwl2YWwgPSAweGE7CisJaWYgKGR0dF93cml0ZShzZW5zb3IsIERUVF9DT05GSUcsIHZhbCkgIT0gMCkKKwkJcmV0dXJuIDE7CisJdWRlbGF5KDUwMDAwKTsJCQkvKiBNYXggNTBtcyAqLworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGR0dF9pbml0ICh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgc2Vuc29yc1tdID0gQ09ORklHX0RUVF9TRU5TT1JTOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzZW5zb3JzKTsgaSsrKSB7CisJCWlmIChfZHR0X2luaXQoc2Vuc29yc1tpXSkgIT0gMCkKKwkJCXByaW50ZigiRFRUJWQ6ICBGQUlMRURcbiIsIGkrMSk7CisJCWVsc2UKKwkJCXByaW50ZigiRFRUJWQ6ICAlaSBDXG4iLCBpKzEsIGR0dF9nZXRfdGVtcChzZW5zb3JzW2ldKSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworCitpbnQgZHR0X2dldF90ZW1wKGludCBzZW5zb3IpCit7CisJcmV0dXJuIChkdHRfcmVhZChzZW5zb3IsIERUVF9SRUFEX1RFTVApIC8gMjU2KTsKK30KKworCisjZW5kaWYgLyogQ09ORklHX0RUVF9EUzE3NzUgKi8KZGlmZiAtLWdpdCBhL2ZzL2NyYW1mcy9jcmFtZnMuYyBiL2ZzL2NyYW1mcy9jcmFtZnMuYwppbmRleCA0OGU3ZjYzLi4zNjlkMWYxIDEwMDY0NAotLS0gYS9mcy9jcmFtZnMvY3JhbWZzLmMKKysrIGIvZnMvY3JhbWZzL2NyYW1mcy5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL3VuY29tcHJlc3MuYyBiL2ZzL2NyYW1mcy91bmNvbXByZXNzLmMKaW5kZXggMTcwODMyYS4uMmU5MDZlYiAxMDA2NDQKLS0tIGEvZnMvY3JhbWZzL3VuY29tcHJlc3MuYworKysgYi9mcy9jcmFtZnMvdW5jb21wcmVzcy5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KICNpbmNsdWRlIDx6bGliLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKIHN0YXRpYyB6X3N0cmVhbSBzdHJlYW07CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZGV2LmMgYi9mcy9leHQyL2Rldi5jCmluZGV4IDE0NjllOTguLjY0M2ExYTggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZGV2LmMKKysrIGIvZnMvZXh0Mi9kZXYuYwpAQCAtMjUsNyArMjUsNyBAQAogCiAKICNpbmNsdWRlIDxjb21tb24uaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FWFQyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FWFQyKQogCiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8ZXh0MmZzLmg+CkBAIC0xMjMsNCArMTIzLDQgQEAKIAl9CiAJcmV0dXJuICgxKTsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0VYVDJGUyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9leHQyL2V4dDJmcy5jIGIvZnMvZXh0Mi9leHQyZnMuYwppbmRleCA5Y2YyZmI3Li41MTNhMmY5IDEwMDY0NAotLS0gYS9mcy9leHQyL2V4dDJmcy5jCisrKyBiL2ZzL2V4dDIvZXh0MmZzLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRVhUMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRVhUMikKICNpbmNsdWRlIDxleHQyZnMuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CkBAIC04NzUsNCArODc1LDQgQEAKIAlyZXR1cm4gKDApOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9FWFQyRlMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdC5jIGIvZnMvZmF0L2ZhdC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMzAwNzYwOC4uZTk4ZTUwYQotLS0gYS9mcy9mYXQvZmF0LmMKKysrIGIvZnMvZmF0L2ZhdC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPHBhcnQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkFUKQogCiAvKgogICogQ29udmVydCBhIHN0cmluZyB0byBsb3dlcmNhc2UuCkBAIC03MCwxMCArNzAsMTEgQEAKIGZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKQogewogCXVuc2lnbmVkIGNoYXIgYnVmZmVyW1NFQ1RPUl9TSVpFXTsKKwlkaXNrX3BhcnRpdGlvbl90IGluZm87CiAKIAlpZiAoIWRldl9kZXNjLT5ibG9ja19yZWFkKQogCQlyZXR1cm4gLTE7Ci0JY3VyX2Rldj1kZXZfZGVzYzsKKwljdXJfZGV2ID0gZGV2X2Rlc2M7CiAJLyogY2hlY2sgaWYgd2UgaGF2ZSBhIE1CUiAob24gZmxvcHBpZXMgd2UgaGF2ZSBvbmx5IGEgUEJSKSAqLwogCWlmIChkZXZfZGVzYy0+YmxvY2tfcmVhZCAoZGV2X2Rlc2MtPmRldiwgMCwgMSwgKHVsb25nICopIGJ1ZmZlcikgIT0gMSkgewogCQlwcmludGYgKCIqKiBDYW4ndCByZWFkIGZyb20gZGV2aWNlICVkICoqXG4iLCBkZXZfZGVzYy0+ZGV2KTsKQEAgLTg4LDMwICs4OSw0MCBAQAogCQkvKiBvaywgd2UgYXNzdW1lIHdlIGFyZSBvbiBhIFBCUiBvbmx5ICovCiAJCWN1cl9wYXJ0ID0gMTsKIAkJcGFydF9vZmZzZXQ9MDsKLQl9Ci0JZWxzZSB7Ci0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorCX0gZWxzZSB7CisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICAoZGVmaW5lZChDT05GSUdfTU1DKSAmJiBkZWZpbmVkKENPTkZJR19MUEMyMjkyKSkgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICAgICAgICAgICkKLQkJZGlza19wYXJ0aXRpb25fdCBpbmZvOwotCQlpZighZ2V0X3BhcnRpdGlvbl9pbmZvKGRldl9kZXNjLCBwYXJ0X25vLCAmaW5mbykpIHsKKwkJLyogRmlyc3Qgd2UgYXNzdW1lLCB0aGVyZSBpcyBhIE1CUiAqLworCQlpZiAoIWdldF9wYXJ0aXRpb25faW5mbyAoZGV2X2Rlc2MsIHBhcnRfbm8sICZpbmZvKSkgewogCQkJcGFydF9vZmZzZXQgPSBpbmZvLnN0YXJ0OwogCQkJY3VyX3BhcnQgPSBwYXJ0X25vOwotCQl9Ci0JCWVsc2UgewotCQkJcHJpbnRmICgiKiogUGFydGl0aW9uICVkIG5vdCB2YWxpZCBvbiBkZXZpY2UgJWQgKipcbiIscGFydF9ubyxkZXZfZGVzYy0+ZGV2KTsKKwkJfSBlbHNlIGlmICghc3RybmNtcCgoY2hhciAqKSZidWZmZXJbRE9TX0ZTX1RZUEVfT0ZGU0VUXSwgIkZBVCIsIDMpKSB7CisJCQkvKiBvaywgd2UgYXNzdW1lIHdlIGFyZSBvbiBhIFBCUiBvbmx5ICovCisJCQljdXJfcGFydCA9IDE7CisJCQlwYXJ0X29mZnNldCA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCIqKiBQYXJ0aXRpb24gJWQgbm90IHZhbGlkIG9uIGRldmljZSAlZCAqKlxuIiwKKwkJCQlwYXJ0X25vLCBkZXZfZGVzYy0+ZGV2KTsKIAkJCXJldHVybiAtMTsKIAkJfQogI2Vsc2UKLQkJLyogRklYTUUgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHN0YXJ0IGJsb2NrIG9mIHRoZQotCQkgKiBwYXJ0aXRpb24gd2hlcmUgdGhlIERPUyBGUyByZXNpZGVzLiBUaGlzIGNhbiBiZSBkb25lCi0JCSAqIGJ5IHVzaW5nIHRoZSBnZXRfcGFydGl0aW9uX2luZm8gcm91dGluZS4gRm9yIHRoaXMKLQkJICogcHVycG9zZSB0aGUgbGlicGFydCBtdXN0IGJlIGluY2x1ZGVkLgotCQkgKi8KLQkJcGFydF9vZmZzZXQ9MzI7Ci0JCWN1cl9wYXJ0ID0gMTsKKwkJaWYoIXN0cm5jbXAoKGNoYXIgKikmYnVmZmVyW0RPU19GU19UWVBFX09GRlNFVF0sIkZBVCIsMykpIHsKKwkJCS8qIG9rLCB3ZSBhc3N1bWUgd2UgYXJlIG9uIGEgUEJSIG9ubHkgKi8KKwkJCWN1cl9wYXJ0ID0gMTsKKwkJCXBhcnRfb2Zmc2V0ID0gMDsKKwkJCWluZm8uc3RhcnQgPSBwYXJ0X29mZnNldDsKKwkJfSBlbHNlIHsKKwkJCS8qIEZJWE1FIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdGFydCBibG9jayBvZiB0aGUKKwkJCSAqIHBhcnRpdGlvbiB3aGVyZSB0aGUgRE9TIEZTIHJlc2lkZXMuIFRoaXMgY2FuIGJlIGRvbmUKKwkJCSAqIGJ5IHVzaW5nIHRoZSBnZXRfcGFydGl0aW9uX2luZm8gcm91dGluZS4gRm9yIHRoaXMKKwkJCSAqIHB1cnBvc2UgdGhlIGxpYnBhcnQgbXVzdCBiZSBpbmNsdWRlZC4KKwkJCSAqLworCQkJcGFydF9vZmZzZXQgPSAzMjsKKwkJCWN1cl9wYXJ0ID0gMTsKKwkJfQogI2VuZGlmCiAJfQogCXJldHVybiAwOwpAQCAtOTc1LDggKzk4NiwxMCBAQAogCQlwcmludGYoIk5vIGN1cnJlbnQgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgfHwgXAotICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgfHwgKENPTkZJR19NTUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAorICAgIChDT05GSUdfTU1DKQogCXByaW50ZigiSW50ZXJmYWNlOiAgIik7CiAJc3dpdGNoKGN1cl9kZXYtPmlmX3R5cGUpIHsKIAkJY2FzZSBJRl9UWVBFX0lERSA6CXByaW50ZigiSURFIik7IGJyZWFrOwpAQCAtMTAxNyw0ICsxMDMwLDQgQEAKIAlyZXR1cm4gZG9fZmF0X3JlYWQoZmlsZW5hbWUsIGJ1ZmZlciwgbWF4c2l6ZSwgTFNfTk8pOwogfQogCi0jZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZpbGUuYyBiL2ZzL2ZhdC9maWxlLmMKaW5kZXggZjk5OWFjNS4uNTE0ZGJhZSAxMDA2NDQKLS0tIGEvZnMvZmF0L2ZpbGUuYworKysgYi9mcy9mYXQvZmlsZS5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkFUKQogCiAvKiBTdXBwb3J0ZWQgZmlsZXN5c3RlbXMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZXN5c3RlbSBmaWxlc3lzdGVtc1tdID0gewpAQCAtMjA1LDQgKzIwNSw0IEBACiAJcmV0dXJuIGZpbGVzeXN0ZW1zW2N1cnJlbnRfZmlsZXN5c3RlbV0ucmVhZChhcmcsIGJ1ZmZlciwgbWF4c2l6ZSk7CiB9CiAKLSNlbmRpZiAvKiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9mZG9zL2Rldi5jIGIvZnMvZmRvcy9kZXYuYwppbmRleCA1ZGVhNWNkLi4yNzFkMGU3IDEwMDY0NAotLS0gYS9mcy9mZG9zL2Rldi5jCisrKyBiL2ZzL2Zkb3MvZGV2LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlICJkb3MuaCIKICNpbmNsdWRlICJmZG9zLmgiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQogCiAjZGVmaW5lIE5CX0hFQURTICAgICAgICAyCiAjZGVmaW5lIE5CX1RSQUNLUyAgICAgICA4MApkaWZmIC0tZ2l0IGEvZnMvZmRvcy9mYXQuYyBiL2ZzL2Zkb3MvZmF0LmMKaW5kZXggMmVmMjM3MS4uMmUyZDJiOCAxMDA2NDQKLS0tIGEvZnMvZmRvcy9mYXQuYworKysgYi9mcy9mZG9zL2ZhdC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQogCiAjaW5jbHVkZSAiZG9zLmgiCiAjaW5jbHVkZSAiZmRvcy5oIgpkaWZmIC0tZ2l0IGEvZnMvZmRvcy9mZG9zLmMgYi9mcy9mZG9zL2Zkb3MuYwppbmRleCBhMjlmNDNkLi41YmU2YTk2IDEwMDY0NAotLS0gYS9mcy9mZG9zL2Zkb3MuYworKysgYi9mcy9mZG9zL2Zkb3MuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbmZpZy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlICJkb3MuaCIKICNpbmNsdWRlICJmZG9zLmgiCmRpZmYgLS1naXQgYS9mcy9mZG9zL2ZzLmMgYi9mcy9mZG9zL2ZzLmMKaW5kZXggM2I5ZDA5ZS4uYWRlZDY3MCAxMDA2NDQKLS0tIGEvZnMvZmRvcy9mcy5jCisrKyBiL2ZzL2Zkb3MvZnMuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogI2luY2x1ZGUgImRvcy5oIgogI2luY2x1ZGUgImZkb3MuaCIKZGlmZiAtLWdpdCBhL2ZzL2Zkb3Mvc3ViZGlyLmMgYi9mcy9mZG9zL3N1YmRpci5jCmluZGV4IDk3YjI1MDQuLjQ5N2Y1NTQgMTAwNjQ0Ci0tLSBhL2ZzL2Zkb3Mvc3ViZGlyLmMKKysrIGIvZnMvZmRvcy9zdWJkaXIuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogI2luY2x1ZGUgImRvcy5oIgogI2luY2x1ZGUgImZkb3MuaCIKZGlmZiAtLWdpdCBhL2ZzL2Zkb3MvdmZhdC5jIGIvZnMvZmRvcy92ZmF0LmMKaW5kZXggNDZhNDY0Yi4uMGU3ODgzYiAxMDA2NDQKLS0tIGEvZnMvZmRvcy92ZmF0LmMKKysrIGIvZnMvZmRvcy92ZmF0LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZET1MpCiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAogI2luY2x1ZGUgImRvcy5oIgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHJfbHphcmkuYyBiL2ZzL2pmZnMyL2NvbXByX2x6YXJpLmMKaW5kZXggODI4YjZlNS4uZjY0YmM3NCAxMDA2NDQKLS0tIGEvZnMvamZmczIvY29tcHJfbHphcmkuYworKysgYi9mcy9qZmZzMi9jb21wcl9semFyaS5jCkBAIC01MCw3ICs1MCw3IEBACiAKIAogI2luY2x1ZGUgPGNvbmZpZy5oPgotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfTFpPX0xaQVJJKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkKIAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CkBAIC0yNTksNCArMjU5LDQgQEAKIHsKICAgICByZXR1cm4gRGVjb2RlKGRhdGFfaW4sIGNwYWdlX291dCwgc3JjbGVuLCBkZXN0bGVuKTsKIH0KLSNlbmRpZiAvKiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX2x6by5jIGIvZnMvamZmczIvY29tcHJfbHpvLmMKaW5kZXggYjZjNTkwYS4uYTMyYjk5MyAxMDA2NDQKLS0tIGEvZnMvamZmczIvY29tcHJfbHpvLmMKKysrIGIvZnMvamZmczIvY29tcHJfbHpvLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAogCiAjaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9MWk9fTFpBUkkpKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfTFpPX0xaQVJJKQogCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KQEAgLTQwMiw0ICs0MDIsNCBAQAogCXJldHVybiBsem8xeF9kZWNvbXByZXNzIChkYXRhX2luLCBzcmNsZW4sIGNwYWdlX291dCwgJm91dGxlbiwgTlVMTCk7CiB9CiAKLSNlbmRpZiAvKiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMgYi9mcy9qZmZzMi9jb21wcl9ydGltZS5jCmluZGV4IDliYjRmMWIuLjE0NDI2M2MgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMKKysrIGIvZnMvamZmczIvY29tcHJfcnRpbWUuYwpAQCAtNDYsNyArNDYsNyBAQAogICovCiAKICNpbmNsdWRlIDxjb25maWcuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgogCkBAIC04OCw0ICs4OCw0IEBACiAJfQogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5jIGIvZnMvamZmczIvY29tcHJfcnViaW4uYwppbmRleCA3NDU3N2Q5Li5mNmYzZmExIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5jCisrKyBiL2ZzL2pmZnMyL2NvbXByX3J1YmluLmMKQEAgLTM5LDcgKzM5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KICNpbmNsdWRlIDxqZmZzMi9jb21wcl9ydWJpbi5oPgpAQCAtMTIzLDQgKzEyMyw0IEBACiAJcnViaW5fZG9fZGVjb21wcmVzcyhiaXRzLCBkYXRhX2luKzgsIGNwYWdlX291dCwgZHN0bGVuKTsKIH0KIAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHJfemxpYi5jIGIvZnMvamZmczIvY29tcHJfemxpYi5jCmluZGV4IGQ4OGQwZjguLjI5ZGZlMWIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX3psaWIuYworKysgYi9mcy9qZmZzMi9jb21wcl96bGliLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbmZpZy5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CiAjaW5jbHVkZSA8amZmczIvbWluaV9pbmZsYXRlLmg+CkBAIC00OSw0ICs0OSw0IEBACiAKIH0KIAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvamZmczJfMXBhc3MuYyBiL2ZzL2pmZnMyL2pmZnMyXzFwYXNzLmMKaW5kZXggNDFmZjRjMS4uNTMxNjY2OCAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfMXBhc3MuYworKysgYi9mcy9qZmZzMi9qZmZzMl8xcGFzcy5jCkBAIC0xMTcsNyArMTE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KICNpbmNsdWRlIDxqZmZzMi9qZmZzMl8xcGFzcy5oPgpAQCAtMTQzLDcgKzE0Myw4IEBACiAvKiBrZWVwcyBwb2ludGVyIHRvIGN1cnJlbnRsdSBwcm9jZXNzZWQgcGFydGl0aW9uICovCiBzdGF0aWMgc3RydWN0IHBhcnRfaW5mbyAqY3VycmVudF9wYXJ0OwogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiAoZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgKQogI2lmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogI2Vsc2UKQEAgLTI3NCwxMCArMjc1LDEwIEBACiB7CiAJZnJlZShidWYpOwogfQotI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIC8qCiAgKiBTdXBwb3J0IGZvciBqZmZzMiBvbiB0b3Agb2YgTk9SLWZsYXNoCiAgKgpAQCAtMzAwLDcgKzMwMSw3IEBACiB7CiAJcmV0dXJuICh2b2lkKilnZXRfZmxfbWVtX25vcihvZmYpOwogfQotI2VuZGlmIC8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkgKi8KKyNlbmRpZgogCiAKIC8qCkBAIC0zMTEsMTIgKzMxMiwxMiBAQAogewogCXN0cnVjdCBtdGRpZHMgKmlkID0gY3VycmVudF9wYXJ0LT5kZXYtPmlkOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTk9SKQogCQlyZXR1cm4gZ2V0X2ZsX21lbV9ub3Iob2ZmKTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05BTkQpCiAJCXJldHVybiBnZXRfZmxfbWVtX25hbmQob2ZmLCBzaXplLCBleHRfYnVmKTsKICNlbmRpZgpAQCAtMzI5LDEyICszMzAsMTMgQEAKIHsKIAlzdHJ1Y3QgbXRkaWRzICppZCA9IGN1cnJlbnRfcGFydC0+ZGV2LT5pZDsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05PUikKIAkJcmV0dXJuIGdldF9ub2RlX21lbV9ub3Iob2ZmKTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiBcCisgICAgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJaWYgKGlkLT50eXBlID09IE1URF9ERVZfVFlQRV9OQU5EKQogCQlyZXR1cm4gZ2V0X25vZGVfbWVtX25hbmQob2ZmKTsKICNlbmRpZgpAQCAtMzQ1LDcgKzM0Nyw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZmxfbWVtKHZvaWQgKmJ1ZikKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIFwKKyAgICBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlzdHJ1Y3QgbXRkaWRzICppZCA9IGN1cnJlbnRfcGFydC0+ZGV2LT5pZDsKIAogCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkKQEAgLTEzOTQsNCArMTM5Nyw0IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2pmZnMyX25hbmRfMXBhc3MuYyBiL2ZzL2pmZnMyL2pmZnMyX25hbmRfMXBhc3MuYwppbmRleCBlNzhhZjc1Li4zYTRjNjQ5IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9qZmZzMl9uYW5kXzFwYXNzLmMKKysrIGIvZnMvamZmczIvamZmczJfbmFuZF8xcGFzcy5jCkBAIC0xLDYgKzEsNiBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpICYmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KQEAgLTEwMzMsNCArMTAzMyw0IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL21pbmlfaW5mbGF0ZS5jIGIvZnMvamZmczIvbWluaV9pbmZsYXRlLmMKaW5kZXggNGY1MTFlYy4uNGM1MGZjMyAxMDA2NDQKLS0tIGEvZnMvamZmczIvbWluaV9pbmZsYXRlLmMKKysrIGIvZnMvamZmczIvbWluaV9pbmZsYXRlLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGNvbmZpZy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAjaW5jbHVkZSA8amZmczIvbWluaV9pbmZsYXRlLmg+CiAKQEAgLTM5Myw0ICszOTMsNCBAQAogCXJldHVybiBzdHJlYW0uZXJyb3IgPyAtc3RyZWFtLmVycm9yIDogc3RyZWFtLmRlY29kZWQ7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2Rldi5jIGIvZnMvcmVpc2VyZnMvZGV2LmMKaW5kZXggNmY2MDU2Zi4uNmIzNmMwNiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZGV2LmMKKysrIGIvZnMvcmVpc2VyZnMvZGV2LmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVJU0VSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SRUlTRVIpCiAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxyZWlzZXJmcy5oPgpAQCAtMTIwLDQgKzEyMCw0IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX1JFSVNFUkZTICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL21vZGVfc3RyaW5nLmMgYi9mcy9yZWlzZXJmcy9tb2RlX3N0cmluZy5jCmluZGV4IGJjNTY1ZmIuLmFlOTg4MzQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL21vZGVfc3RyaW5nLmMKKysrIGIvZnMvcmVpc2VyZnMvbW9kZV9zdHJpbmcuYwpAQCAtMjYsNyArMjYsNyBAQAogCiAKICNpbmNsdWRlIDxjb21tb24uaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9SRUlTRVIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1JFSVNFUikKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAKICNpZiAoIFNfSVNVSUQgIT0gMDQwMDAgKSB8fCAoIFNfSVNHSUQgIT0gMDIwMDAgKSB8fCAoIFNfSVNWVFggIT0gMDEwMDAgKSBcCkBAIC0xMzksNCArMTM5LDQgQEAKIAogI2VuZGlmCiAKLSNlbmRpZiAvKiBDRkdfQ01EX1JFSVNFUiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9yZWlzZXJmcy5jIGIvZnMvcmVpc2VyZnMvcmVpc2VyZnMuYwppbmRleCAzMWMyNWViLi5hYTk2MzYxIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9yZWlzZXJmcy5jCisrKyBiL2ZzL3JlaXNlcmZzL3JlaXNlcmZzLmMKQEAgLTI5LDcgKzI5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVJU0VSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SRUlTRVIpCiAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpAQCAtOTgzLDQgKzk4Myw0IEBACiAJcmV0dXJuIGZpbGVtYXg7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX1JFSVNFUiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL19leHBvcnRzLmggYi9pbmNsdWRlL19leHBvcnRzLmgKaW5kZXggMmI4ZWMzZC4uYWY0Mzg4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9fZXhwb3J0cy5oCisrKyBiL2luY2x1ZGUvX2V4cG9ydHMuaApAQCAtMTQsOCArMTQsMTMgQEAKIEVYUE9SVF9GVU5DKGRvX3Jlc2V0KQogRVhQT1JUX0ZVTkMoZ2V0ZW52KQogRVhQT1JUX0ZVTkMoc2V0ZW52KQorI2lmZGVmIENPTkZJR19IQVNfVUlECitFWFBPUlRfRlVOQyhmb3JjZWVudikKKyNlbmRpZgogRVhQT1JUX0ZVTkMoc2ltcGxlX3N0cnRvdWwpCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorRVhQT1JUX0ZVTkMoc2ltcGxlX3N0cnRvbCkKK0VYUE9SVF9GVU5DKHN0cmNtcCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogRVhQT1JUX0ZVTkMoaTJjX3dyaXRlKQogRVhQT1JUX0ZVTkMoaTJjX3JlYWQpCi0jZW5kaWYJLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9BVDkxUk05MjAwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL0FUOTFSTTkyMDAuaAppbmRleCA5N2Q0NzA0Li4wZTAxMDA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL0FUOTFSTTkyMDAuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL0FUOTFSTTkyMDAuaApAQCAtMjcsOSArMjcsOSBAQAogCiB0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGludCBBVDkxX1JFRzsJCS8qIEhhcmR3YXJlIHJlZ2lzdGVyIGRlZmluaXRpb24gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICBTT0ZUV0FSRSBBUEkgREVGSU5JVElPTiAgRk9SIFRpbWVyIENvdW50ZXIgQ2hhbm5lbCBJbnRlcmZhY2UgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgIFNPRlRXQVJFIEFQSSBERUZJTklUSU9OICBGT1IgVGltZXIgQ291bnRlciBDaGFubmVsIEludGVyZmFjZSAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBzdHJ1Y3QgX0FUOTFTX1RDCiB7CiAJQVQ5MV9SRUcJIFRDX0NDUjsgCS8qIENoYW5uZWwgQ29udHJvbCBSZWdpc3RlciAqLwpAQCAtNDUsMjQgKzQ1LDI0IEBACiAJQVQ5MV9SRUcJIFRDX0lNUjsgCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCiB9IEFUOTFTX1RDLCAqQVQ5MVBTX1RDOwogCi0jZGVmaW5lIEFUOTFDX1RDX1RJTUVSX0RJVjFfQ0xPQ0sJKCh1bnNpZ25lZCBpbnQpIDB4MCA8PCAgMCkgLyogKFRDKSBNQ0svMiAqLwotI2RlZmluZSBBVDkxQ19UQ19USU1FUl9ESVYyX0NMT0NLCSgodW5zaWduZWQgaW50KSAweDEgPDwgIDApIC8qIChUQykgTUNLLzggKi8KLSNkZWZpbmUgQVQ5MUNfVENfVElNRVJfRElWM19DTE9DSwkoKHVuc2lnbmVkIGludCkgMHgyIDw8ICAwKSAvKiAoVEMpIE1DSy8zMiAqLwotI2RlZmluZSBBVDkxQ19UQ19USU1FUl9ESVY0X0NMT0NLCSgodW5zaWduZWQgaW50KSAweDMgPDwgIDApIC8qIChUQykgTUNLLzEyOCAqLwotI2RlZmluZSBBVDkxQ19UQ19TTE9XX0NMT0NLCQkoKHVuc2lnbmVkIGludCkgMHg0IDw8ICAwKSAvKiAoVEMpIFNMT1cgQ0xLICovCi0jZGVmaW5lIEFUOTFDX1RDX1hDMF9DTE9DSwkJKCh1bnNpZ25lZCBpbnQpIDB4NSA8PCAgMCkgLyogKFRDKSBYQzAgKi8KLSNkZWZpbmUgQVQ5MUNfVENfWEMxX0NMT0NLCQkoKHVuc2lnbmVkIGludCkgMHg2IDw8ICAwKSAvKiAoVEMpIFhDMSAqLwotI2RlZmluZSBBVDkxQ19UQ19YQzJfQ0xPQ0sJCSgodW5zaWduZWQgaW50KSAweDcgPDwgIDApIC8qIChUQykgWEMyICovCi0jZGVmaW5lIEFUOTFDX1RDQl9UQzBYQzBTX05PTkUJCSgodW5zaWduZWQgaW50KSAweDEpICAgICAgIC8qIChUQ0IpIE5vbmUgc2lnbmFsIGNvbm5lY3RlZCB0byBYQzAgKi8KLSNkZWZpbmUgQVQ5MUNfVENCX1RDMVhDMVNfTk9ORQkJKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgMikgLyogKFRDQikgTm9uZSBzaWduYWwgY29ubmVjdGVkIHRvIFhDMSAqLwotI2RlZmluZSBBVDkxQ19UQ0JfVEMyWEMyU19OT05FCQkoKHVuc2lnbmVkIGludCkgMHgxIDw8ICA0KSAvKiAoVENCKSBOb25lIHNpZ25hbCBjb25uZWN0ZWQgdG8gWEMyICovCi0jZGVmaW5lIEFUOTFDX1RDX0NMS0RJUwkJCSgodW5zaWduZWQgaW50KSAweDEgPDwgIDEpIC8qIChUQykgQ291bnRlciBDbG9jayBEaXNhYmxlIENvbW1hbmQgKi8KLSNkZWZpbmUgQVQ5MUNfVENfU1dUUkcJCQkoKHVuc2lnbmVkIGludCkgMHgxIDw8ICAyKSAvKiAoVEMpIFNvZnR3YXJlIFRyaWdnZXIgQ29tbWFuZCAqLwotI2RlZmluZSBBVDkxQ19UQ19DTEtFTgkJCSgodW5zaWduZWQgaW50KSAweDEgPDwgIDApIC8qIChUQykgQ291bnRlciBDbG9jayBFbmFibGUgQ29tbWFuZCAqLworI2RlZmluZSBBVDkxQ19UQ19USU1FUl9ESVYxX0NMT0NLICgodW5zaWduZWQgaW50KSAweDAgPDwgIDApIC8qIChUQykgTUNLLzIgKi8KKyNkZWZpbmUgQVQ5MUNfVENfVElNRVJfRElWMl9DTE9DSyAoKHVuc2lnbmVkIGludCkgMHgxIDw8ICAwKSAvKiAoVEMpIE1DSy84ICovCisjZGVmaW5lIEFUOTFDX1RDX1RJTUVSX0RJVjNfQ0xPQ0sgKCh1bnNpZ25lZCBpbnQpIDB4MiA8PCAgMCkgLyogKFRDKSBNQ0svMzIgKi8KKyNkZWZpbmUgQVQ5MUNfVENfVElNRVJfRElWNF9DTE9DSyAoKHVuc2lnbmVkIGludCkgMHgzIDw8ICAwKSAvKiAoVEMpIE1DSy8xMjggKi8KKyNkZWZpbmUgQVQ5MUNfVENfU0xPV19DTE9DSwkgICgodW5zaWduZWQgaW50KSAweDQgPDwgIDApIC8qIChUQykgU0xPVyBDTEsqLworI2RlZmluZSBBVDkxQ19UQ19YQzBfQ0xPQ0sJICAoKHVuc2lnbmVkIGludCkgMHg1IDw8ICAwKSAvKiAoVEMpIFhDMCAqLworI2RlZmluZSBBVDkxQ19UQ19YQzFfQ0xPQ0sJICAoKHVuc2lnbmVkIGludCkgMHg2IDw8ICAwKSAvKiAoVEMpIFhDMSAqLworI2RlZmluZSBBVDkxQ19UQ19YQzJfQ0xPQ0sJICAoKHVuc2lnbmVkIGludCkgMHg3IDw8ICAwKSAvKiAoVEMpIFhDMiAqLworI2RlZmluZSBBVDkxQ19UQ0JfVEMwWEMwU19OT05FCSAgKCh1bnNpZ25lZCBpbnQpIDB4MSkgICAgICAgLyogKFRDQikgTm9uZSBzaWduYWwgY29ubmVjdGVkIHRvIFhDMCAqLworI2RlZmluZSBBVDkxQ19UQ0JfVEMxWEMxU19OT05FCSAgKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgMikgLyogKFRDQikgTm9uZSBzaWduYWwgY29ubmVjdGVkIHRvIFhDMSAqLworI2RlZmluZSBBVDkxQ19UQ0JfVEMyWEMyU19OT05FCSAgKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgNCkgLyogKFRDQikgTm9uZSBzaWduYWwgY29ubmVjdGVkIHRvIFhDMiAqLworI2RlZmluZSBBVDkxQ19UQ19DTEtESVMJCSAgKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgMSkgLyogKFRDKSBDb3VudGVyIENsb2NrIERpc2FibGUgQ29tbWFuZCAqLworI2RlZmluZSBBVDkxQ19UQ19TV1RSRwkJICAoKHVuc2lnbmVkIGludCkgMHgxIDw8ICAyKSAvKiAoVEMpIFNvZnR3YXJlIFRyaWdnZXIgQ29tbWFuZCAqLworI2RlZmluZSBBVDkxQ19UQ19DTEtFTgkJICAoKHVuc2lnbmVkIGludCkgMHgxIDw8ICAwKSAvKiAoVEMpIENvdW50ZXIgQ2xvY2sgRW5hYmxlIENvbW1hbmQgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBVc2FydCAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgREVGSU5JVElPTiAgRk9SIFVzYXJ0ICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBzdHJ1Y3QgX0FUOTFTX1VTQVJUCiB7CiAJQVQ5MV9SRUcJIFVTX0NSOyAJLyogQ29udHJvbCBSZWdpc3RlciAqLwpAQCAtOTQsOSArOTQsOSBAQAogCUFUOTFfUkVHCSBVU19QVFNSOyAJLyogUERDIFRyYW5zZmVyIFN0YXR1cyBSZWdpc3RlciAqLwogfSBBVDkxU19VU0FSVCwgKkFUOTFQU19VU0FSVDsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgIFNPRlRXQVJFIEFQSSBERUZJTklUSU9OICBGT1IgQ2xvY2sgR2VuZXJhdG9yIENvbnRyb2xlciAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBDbG9jayBHZW5lcmF0b3IgQ29udHJvbGVyICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBzdHJ1Y3QgX0FUOTFTX0NLR1IKIHsKIAlBVDkxX1JFRwkgQ0tHUl9NT1I7IAkvKiBNYWluIE9zY2lsbGF0b3IgUmVnaXN0ZXIgKi8KQEAgLTE0MSw5ICsxNDEsOSBAQAogI2RlZmluZSBBVDkxQ19DS0dSX1VTQl85Nk0JKCh1bnNpZ25lZCBpbnQpIDB4MSAgIDw8IDI4KQkvKiAoQ0tHUikgRGl2aWRlciBmb3IgVVNCIFBvcnRzICovCiAjZGVmaW5lIEFUOTFDX0NLR1JfVVNCX1BMTAkoKHVuc2lnbmVkIGludCkgMHgxICAgPDwgMjkpCS8qIChDS0dSKSBQTEwgVXNlICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBQYXJhbGxlbCBJbnB1dCBPdXRwdXQgQ29udHJvbGVyICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICBTT0ZUV0FSRSBBUEkgREVGSU5JVElPTiAgRk9SIFBhcmFsbGVsIElucHV0IE91dHB1dCBDb250cm9sZXIgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgc3RydWN0IF9BVDkxU19QSU8KIHsKIAlBVDkxX1JFRwkgUElPX1BFUjsgCS8qIFBJTyBFbmFibGUgUmVnaXN0ZXIgKi8KQEAgLTE4NCw5ICsxODQsOSBAQAogfSBBVDkxU19QSU8sICpBVDkxUFNfUElPOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBEZWJ1ZyBVbml0ICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgREVGSU5JVElPTiAgRk9SIERlYnVnIFVuaXQgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgc3RydWN0IF9BVDkxU19EQkdVCiB7CiAJQVQ5MV9SRUcJIERCR1VfQ1I7IAkvKiBDb250cm9sIFJlZ2lzdGVyICovCkBAIC0yNDIsOSArMjQyLDkgQEAKICNkZWZpbmUgQVQ5MUNfVVNfUEFSX05PTkUJKCh1bnNpZ25lZCBpbnQpIDB4NCA8PCAgOSkgLyogKERCR1UpIE5vIFBhcml0eSAqLwogI2RlZmluZSBBVDkxQ19VU19OQlNUT1BfMV9CSVQJKCh1bnNpZ25lZCBpbnQpIDB4MCA8PCAxMikgLyogKFVTQVJUKSAxIHN0b3AgYml0ICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgIFNPRlRXQVJFIEFQSSBERUZJTklUSU9OICBGT1IgU3RhdGljIE1lbW9yeSBDb250cm9sbGVyIDIgSW50ZXJmYWNlICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBTdGF0aWMgTWVtb3J5IENvbnRyb2xsZXIgMiBJbnRlcmZhY2UgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgc3RydWN0IF9BVDkxU19TTUMyCiB7CiAJQVQ5MV9SRUcJIFNNQzJfQ1NSWzhdOyAJLyogU01DMiBDaGlwIFNlbGVjdCBSZWdpc3RlciAqLwpAQCAtMjY3LDkgKzI2Nyw5IEBACiAjZGVmaW5lIEFUOTFDX1NNQzJfUldTRVRVUAkJKCh1bnNpZ25lZCBpbnQpIDB4NyA8PCAyNCkgLyogKFNNQzIpIFJlYWQgYW5kIFdyaXRlIFNpZ25hbCBTZXR1cCBUaW1lICovCiAjZGVmaW5lIEFUOTFDX1NNQzJfUldIT0xECQkoKHVuc2lnbmVkIGludCkgMHg3IDw8IDI5KSAvKiAoU01DMikgUmVhZCBhbmQgV3JpdGUgU2lnbmFsIEhvbGQgVGltZSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgIFNPRlRXQVJFIEFQSSBERUZJTklUSU9OICBGT1IgUG93ZXIgTWFuYWdlbWVudCBDb250cm9sZXIgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2xlciAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0eXBlZGVmIHN0cnVjdCBfQVQ5MVNfUE1DCiB7CiAJQVQ5MV9SRUcJIFBNQ19TQ0VSOyAJLyogU3lzdGVtIENsb2NrIEVuYWJsZSBSZWdpc3RlciAqLwpAQCAtMzQxLDkgKzM0MSw5IEBACiAvKi0tLS0tLS0tIFBNQ19TUiA6IChQTUMgT2Zmc2V0OiAweDY4KSBQTUMgU3RhdHVzIFJlZ2lzdGVyIC0tLS0tLS0tKi8KIC8qLS0tLS0tLS0gUE1DX0lNUiA6IChQTUMgT2Zmc2V0OiAweDZjKSBQTUMgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgLS0tLS0tLS0qLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBERUZJTklUSU9OICBGT1IgRXRoZXJuZXQgTUFDICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBFdGhlcm5ldCBNQUMgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0eXBlZGVmIHN0cnVjdCBfQVQ5MVNfRU1BQwogewogCUFUOTFfUkVHCSBFTUFDX0NUTDsgCS8qIE5ldHdvcmsgQ29udHJvbCBSZWdpc3RlciAqLwpAQCAtNDI0LDExICs0MjQsMTEgQEAKICNkZWZpbmUgQVQ5MUNfRU1BQ19NRElPCQkoKHVuc2lnbmVkIGludCkgMHgxIDw8ICAxKSAvKiAoRU1BQykgKi8KICNkZWZpbmUgQVQ5MUNfRU1BQ19JRExFCQkoKHVuc2lnbmVkIGludCkgMHgxIDw8ICAyKSAvKiAoRU1BQykgKi8KIAotLyogLS0tLS0tLS0gRU1BQ19UQ1IgOiAoRU1BQyBPZmZzZXQ6IDB4MTApIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tIEVNQUNfVENSIDogKEVNQUMgT2Zmc2V0OiAweDEwKSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyIC0tLS0tLS0gKi8KICNkZWZpbmUgQVQ5MUNfRU1BQ19MRU4JCSgodW5zaWduZWQgaW50KSAweDdGRiA8PCAgMCkgLyogKEVNQUMpICovCiAjZGVmaW5lIEFUOTFDX0VNQUNfTkNSQwkJKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAxNSkgLyogKEVNQUMpICovCiAKLS8qIC0tLS0tLS0tIEVNQUNfVFNSIDogKEVNQUMgT2Zmc2V0OiAweDE0KSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyIC0tLS0tLS0tICovCisvKiAtLS0tLS0tLSBFTUFDX1RTUiA6IChFTUFDIE9mZnNldDogMHgxNCkgVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAtLS0tLS0tICovCiAjZGVmaW5lIEFUOTFDX0VNQUNfT1ZSCQkoKHVuc2lnbmVkIGludCkgMHgxIDw8ICAwKSAvKiAoRU1BQykgKi8KICNkZWZpbmUgQVQ5MUNfRU1BQ19DT0wJCSgodW5zaWduZWQgaW50KSAweDEgPDwgIDEpIC8qIChFTUFDKSAqLwogI2RlZmluZSBBVDkxQ19FTUFDX1JMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgMikgLyogKEVNQUMpICovCkBAIC00NDIsNyArNDQyLDcgQEAKICNkZWZpbmUgQVQ5MUNfRU1BQ19SRUMJCSgodW5zaWduZWQgaW50KSAweDEgPDwgIDEpIC8qIChFTUFDKSAqLwogI2RlZmluZSBBVDkxQ19FTUFDX1JTUl9PVlIJKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgMikgLyogKEVNQUMpICovCiAKLS8qIC0tLS0tLS0tIEVNQUNfSVNSIDogKEVNQUMgT2Zmc2V0OiAweDI0KSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIC0tLS0tLS0tICovCisvKiAtLS0tLS0tLSBFTUFDX0lTUiA6IChFTUFDIE9mZnNldDogMHgyNCkgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAtLS0tLS0tICovCiAjZGVmaW5lIEFUOTFDX0VNQUNfRE9ORQkJKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgMCkgLyogKEVNQUMpICovCiAjZGVmaW5lIEFUOTFDX0VNQUNfUkNPTQkJKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgMSkgLyogKEVNQUMpICovCiAjZGVmaW5lIEFUOTFDX0VNQUNfUkJOQQkJKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAgMikgLyogKEVNQUMpICovCkBAIC00NTYsOCArNDU2LDggQEAKICNkZWZpbmUgQVQ5MUNfRU1BQ19ST1ZSCQkoKHVuc2lnbmVkIGludCkgMHgxIDw8IDEwKSAvKiAoRU1BQykgKi8KICNkZWZpbmUgQVQ5MUNfRU1BQ19IUkVTUAkoKHVuc2lnbmVkIGludCkgMHgxIDw8IDExKSAvKiAoRU1BQykgKi8KIAotLyogLS0tLS0tLS0gRU1BQ19JRVIgOiAoRU1BQyBPZmZzZXQ6IDB4MjgpIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tIEVNQUNfSURSIDogKEVNQUMgT2Zmc2V0OiAweDJjKSBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAtLS0tLS0tLSAqLworLyogLS0tLS0tLS0gRU1BQ19JRVIgOiAoRU1BQyBPZmZzZXQ6IDB4MjgpIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgLS0tLS0tLSAqLworLyogLS0tLS0tLS0gRU1BQ19JRFIgOiAoRU1BQyBPZmZzZXQ6IDB4MmMpIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyIC0tLS0tLSAqLwogLyogLS0tLS0tLS0gRU1BQ19JTVIgOiAoRU1BQyBPZmZzZXQ6IDB4MzApIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIC0tLS0tLS0tICovCiAvKiAtLS0tLS0tLSBFTUFDX01BTiA6IChFTUFDIE9mZnNldDogMHgzNCkgUEhZIE1haW50ZW5hbmNlIFJlZ2lzdGVyIC0tLS0tLS0tICovCiAjZGVmaW5lIEFUOTFDX0VNQUNfREFUQQkJKCh1bnNpZ25lZCBpbnQpIDB4RkZGRiA8PCAgMCkgLyogKEVNQUMpICovCkBAIC00NzEsOSArNDcxLDkgQEAKICNkZWZpbmUgQVQ5MUNfRU1BQ19ISUdICQkoKHVuc2lnbmVkIGludCkgMHgxICA8PCAzMCkgLyogKEVNQUMpICovCiAjZGVmaW5lIEFUOTFDX0VNQUNfTE9XCQkoKHVuc2lnbmVkIGludCkgMHgxICA8PCAzMSkgLyogKEVNQUMpICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBTZXJpYWwgUGFyYWxsZWwgSW50ZXJmYWNlICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICBTT0ZUV0FSRSBBUEkgREVGSU5JVElPTiAgRk9SIFNlcmlhbCBQYXJhbGxlbCBJbnRlcmZhY2UgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgc3RydWN0IF9BVDkxU19TUEkKIHsKIAlBVDkxX1JFRwkgU1BJX0NSOyAJLyogQ29udHJvbCBSZWdpc3RlciAqLwpAQCAtNTM2LDcgKzUzNiw3IEBACiAjZGVmaW5lIEFUOTFDX1NQSV9TUElFTlMJKCh1bnNpZ25lZCBpbnQpIDB4MSA8PCAxNikgLyogKFNQSSkgRW5hYmxlIFN0YXR1cyAqLwogCiAvKiAtLS0tLS0tLSBTUElfSUVSIDogKFNQSSBPZmZzZXQ6IDB4MTQpIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tIFNQSV9JRFIgOiAoU1BJIE9mZnNldDogMHgxOCkgSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tIFNQSV9JRFIgOiAoU1BJIE9mZnNldDogMHgxOCkgSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgLS0tLS0tLSAqLwogLyogLS0tLS0tLS0gU1BJX0lNUiA6IChTUEkgT2Zmc2V0OiAweDFjKSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAtLS0tLS0tLSAqLwogLyogLS0tLS0tLS0gU1BJX0NTUiA6IChTUEkgT2Zmc2V0OiAweDMwKSBDaGlwIFNlbGVjdCBSZWdpc3RlciAtLS0tLS0tLSAqLwogI2RlZmluZSBBVDkxQ19TUElfQ1BPTAkJKCh1bnNpZ25lZCBpbnQpIDB4MSAgPDwgIDApIC8qIChTUEkpIENsb2NrIFBvbGFyaXR5ICovCkBAIC01NTUsOSArNTU1LDkgQEAKICNkZWZpbmUgQVQ5MUNfU1BJX0RMWUJTCQkoKHVuc2lnbmVkIGludCkgMHhGRiA8PCAxNikgLyogKFNQSSkgU2VyaWFsIENsb2NrIEJhdWQgUmF0ZSAqLwogI2RlZmluZSBBVDkxQ19TUElfRExZQkNUCSgodW5zaWduZWQgaW50KSAweEZGIDw8IDI0KSAvKiAoU1BJKSBEZWxheSBCZXR3ZWVuIENvbnNlY3V0aXZlIFRyYW5zZmVycyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgIFNPRlRXQVJFIEFQSSBERUZJTklUSU9OICBGT1IgUGVyaXBoZXJhbCBEYXRhIENvbnRyb2xsZXIgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgU09GVFdBUkUgQVBJIERFRklOSVRJT04gIEZPUiBQZXJpcGhlcmFsIERhdGEgQ29udHJvbGxlciAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0eXBlZGVmIHN0cnVjdCBfQVQ5MVNfUERDCiB7CiAJQVQ5MV9SRUcJIFBEQ19SUFI7IAkvKiBSZWNlaXZlIFBvaW50ZXIgUmVnaXN0ZXIgKi8KQEAgLTY5MiwxMSArNjkyLDE1IEBACiAjZGVmaW5lIEFUOTFDX1BJT19QQTcJCSgodW5zaWduZWQgaW50KSAxIDw8ICA3KQkvKiBQaW4gQ29udHJvbGxlZCBieSBQQTcgKi8KICNkZWZpbmUgQVQ5MUNfUEE3X0VUWENLX0VSRUZDSwkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUElPX1BBNykJLyogRXRoZXJuZXQgTUFDIFRyYW5zbWl0IENsb2NrL1JlZmVyZW5jZSBDbG9jayAqLwogCisjZGVmaW5lIEFUOTFDX1BJT19QQjAJCSgodW5zaWduZWQgaW50KSAxIDw8ICAwKQkvKiBQaW4gQ29udHJvbGxlZCBieSBQQjMgKi8KKyNkZWZpbmUgQVQ5MUNfUElPX1BCMQkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgIDEpCS8qIFBpbiBDb250cm9sbGVkIGJ5IFBCMyAqLworI2RlZmluZSBBVDkxQ19QSU9fUEIyCQkoKHVuc2lnbmVkIGludCkgMSA8PCAgMikJLyogUGluIENvbnRyb2xsZWQgYnkgUEIzICovCiAjZGVmaW5lIEFUOTFDX1BJT19QQjMJCSgodW5zaWduZWQgaW50KSAxIDw8ICAzKQkvKiBQaW4gQ29udHJvbGxlZCBieSBQQjMgKi8KICNkZWZpbmUgQVQ5MUNfUElPX1BCNAkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgIDQpCS8qIFBpbiBDb250cm9sbGVkIGJ5IFBCNCAqLwogI2RlZmluZSBBVDkxQ19QSU9fUEI1CQkoKHVuc2lnbmVkIGludCkgMSA8PCAgNSkJLyogUGluIENvbnRyb2xsZWQgYnkgUEI1ICovCiAjZGVmaW5lIEFUOTFDX1BJT19QQjYJCSgodW5zaWduZWQgaW50KSAxIDw8ICA2KQkvKiBQaW4gQ29udHJvbGxlZCBieSBQQjYgKi8KICNkZWZpbmUgQVQ5MUNfUElPX1BCNwkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgIDcpCS8qIFBpbiBDb250cm9sbGVkIGJ5IFBCNyAqLworI2RlZmluZSBBVDkxQ19QSU9fUEIyMgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgMjIpIAkvKiBQaW4gQ29udHJvbGxlZCBieSBQQjIyICovCiAjZGVmaW5lIEFUOTFDX1BJT19QQjI1CQkoKHVuc2lnbmVkIGludCkgMSA8PCAyNSkJLyogUGluIENvbnRyb2xsZWQgYnkgUEIyNSAqLwogI2RlZmluZSBBVDkxQ19QQjI1X0RTUjEJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QSU9fUEIyNSkJLyogVVNBUlQgMSBEYXRhIFNldCByZWFkeSAqLwogI2RlZmluZSBBVDkxQ19QQjI1X0VGMTAwCSgodW5zaWduZWQgaW50KSBBVDkxQ19QSU9fUEIyNSkJLyogRXRoZXJuZXQgTUFDIEZvcmNlIDEwMCBNYml0cyAqLwpAQCAtNzM3LDE5ICs3NDEsMzYgQEAKICNkZWZpbmUgQVQ5MUNfUElPQ19DT0RSCQkoKEFUOTFfUkVHICopCTB4RkZGRkY4MzQpIC8qIChQSU9DKSBDbGVhciBPdXRwdXQgRGF0YSBSZWdpc3RlciAqLwogI2RlZmluZSBBVDkxQ19QSU9DX1BEU1IJCSgoQVQ5MV9SRUcgKikJMHhGRkZGRjgzQykgLyogKFBJT0MpIFBpbiBEYXRhIFN0YXR1cyBSZWdpc3RlciAqLwogCi0jZGVmaW5lIEFUOTFDX0JBU0VfU1BJCQkoKEFUOTFQU19TUEkpCTB4RkZGRTAwMDApIC8qIChTUEkpIEJhc2UgQWRkcmVzcyAqLwotI2RlZmluZSBBVDkxQ19CQVNFX0VNQUMJCSgoQVQ5MVBTX0VNQUMpCTB4RkZGQkMwMDApIC8qIChFTUFDKSBCYXNlIEFkZHJlc3MgKi8KLSNkZWZpbmUgQVQ5MUNfQkFTRV9QTUMJCSgoQVQ5MVBTX1BNQykJMHhGRkZGRkMwMCkgLyogKFBNQykgQmFzZSBBZGRyZXNzICovCi0jZGVmaW5lIEFUOTFDX0JBU0VfVEMwCQkoKEFUOTFQU19UQykJMHhGRkZBMDAwMCkgLyogKFRDMCkgQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIEFUOTFDX0JBU0VfQUlDCQkoKEFUOTFQU19BSUMpCTB4RkZGRkYwMDApIC8qIChBSUMpIEJhc2UgQWRkcmVzcyAqLwogI2RlZmluZSBBVDkxQ19CQVNFX0RCR1UJCSgoQVQ5MVBTX0RCR1UpCTB4RkZGRkYyMDApIC8qIChEQkdVKSBCYXNlIEFkZHJlc3MgKi8KLSNkZWZpbmUgQVQ5MUNfQkFTRV9DS0dSCQkoKEFUOTFQU19DS0dSKQkweEZGRkZGQzIwKSAvKiAoQ0tHUikgQmFzZSBBZGRyZXNzICovCi0jZGVmaW5lIEFUOTFDX0JBU0VfUElPQwkJKChBVDkxUFNfUElPKQkweEZGRkZGODAwKSAvKiAoUElPQykgQmFzZSBBZGRyZXNzICovCi0jZGVmaW5lIEFUOTFDX0JBU0VfUElPQgkJKChBVDkxUFNfUElPKQkweEZGRkZGNjAwKSAvKiAoUElPQikgQmFzZSBBZGRyZXNzICovCiAjZGVmaW5lIEFUOTFDX0JBU0VfUElPQQkJKChBVDkxUFNfUElPKQkweEZGRkZGNDAwKSAvKiAoUElPQSkgQmFzZSBBZGRyZXNzICovCi0jZGVmaW5lIEFUOTFDX0VCSV9DU0EJCSgoQVQ5MV9SRUcgKikJMHhGRkZGRkY2MCkgLyogKEVCSSkgQ2hpcCBTZWxlY3QgQXNzaWdubWVudCBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxQ19CQVNFX1NNQzIJCSgoQVQ5MVBTX1NNQzIpCTB4RkZGRkZGNzApIC8qIChTTUMyKSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MUNfQkFTRV9QSU9CCQkoKEFUOTFQU19QSU8pCTB4RkZGRkY2MDApIC8qIChQSU9CKSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MUNfQkFTRV9QSU9DCQkoKEFUOTFQU19QSU8pCTB4RkZGRkY4MDApIC8qIChQSU9DKSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MUNfQkFTRV9QSU9ECQkoKEFUOTFQU19QSU8pCTB4RkZGRkZBMDApIC8qIChQSU9DKSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MUNfQkFTRV9QTUMJCSgoQVQ5MVBTX1BNQykJMHhGRkZGRkMwMCkgLyogKFBNQykgQmFzZSBBZGRyZXNzICovCisjaWYJMAorI2RlZmluZSBBVDkxQ19CQVNFX1NUCQkoKEFUOTFQU19TVCkJMHhGRkZGRkQwMCkgLyogKFBNQykgQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIEFUOTFDX0JBU0VfUlRDCQkoKEFUOTFQU19SVEMpCTB4RkZGRkZFMDApIC8qIChQTUMpIEJhc2UgQWRkcmVzcyAqLworI2RlZmluZSBBVDkxQ19CQVNFX01DCQkoKEFUOTFQU19NQykJMHhGRkZGRkYwMCkgLyogKFBNQykgQmFzZSBBZGRyZXNzICovCisjZW5kaWYKKworI2RlZmluZSBBVDkxQ19CQVNFX1RDMAkJKChBVDkxUFNfVEMpCTB4RkZGQTAwMDApIC8qIChUQzApIEJhc2UgQWRkcmVzcyAqLworI2RlZmluZSBBVDkxQ19CQVNFX1RDMQkJKChBVDkxUFNfVEMpCTB4RkZGQTQwMDApIC8qIChUQzApIEJhc2UgQWRkcmVzcyAqLworI2lmCTAKKyNkZWZpbmUgQVQ5MUNfQkFTRV9VRFAJCSgoQVQ5MVBTX1VEUCkJMHhGRkZCMDAwMCkgLyogKFRDMCkgQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIEFUOTFDX0JBU0VfTUNJCQkoKEFUOTFQU19NQ0kpCTB4RkZGQjQwMDApIC8qIChUQzApIEJhc2UgQWRkcmVzcyAqLworI2RlZmluZSBBVDkxQ19CQVNFX1RXSQkJKChBVDkxUFNfVFdJKQkweEZGRkI4MDAwKSAvKiAoVEMwKSBCYXNlIEFkZHJlc3MgKi8KKyNlbmRpZgorI2RlZmluZSBBVDkxQ19CQVNFX0VNQUMJCSgoQVQ5MVBTX0VNQUMpCTB4RkZGQkMwMDApIC8qIChFTUFDKSBCYXNlIEFkZHJlc3MgKi8KICNkZWZpbmUgQVQ5MUNfQkFTRV9VUzAJCSgoQVQ5MVBTX1VTQVJUKQkweEZGRkMwMDAwKSAvKiAoVVMwKSBCYXNlIEFkZHJlc3MgKi8KICNkZWZpbmUgQVQ5MUNfQkFTRV9VUzEJCSgoQVQ5MVBTX1VTQVJUKSAweEZGRkM0MDAwKSAvKiAoVVMxKSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MUNfQkFTRV9VUzIJCSgoQVQ5MVBTX1VTQVJUKSAweEZGRkM4MDAwKSAvKiAoVVMxKSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MUNfQkFTRV9VUzMJCSgoQVQ5MVBTX1VTQVJUKSAweEZGRkNDMDAwKSAvKiAoVVMxKSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MUNfQkFTRV9TUEkJCSgoQVQ5MVBTX1NQSSkJMHhGRkZFMDAwMCkgLyogKFNQSSkgQmFzZSBBZGRyZXNzICovCisKKyNkZWZpbmUgQVQ5MUNfQkFTRV9DS0dSCQkoKEFUOTFQU19DS0dSKQkweEZGRkZGQzIwKSAvKiAoQ0tHUikgQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIEFUOTFDX0VCSV9DU0EJCSgoQVQ5MV9SRUcgKikJMHhGRkZGRkY2MCkgLyogKEVCSSkgQ2hpcCBTZWxlY3QgQXNzaWdubWVudCBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxQ19CQVNFX1NNQzIJCSgoQVQ5MVBTX1NNQzIpCTB4RkZGRkZGNzApIC8qIChTTUMyKSBCYXNlIEFkZHJlc3MgKi8KICNkZWZpbmUgQVQ5MUNfVENCMF9CTVIJCSgoQVQ5MV9SRUcgKikJMHhGRkZBMDBDNCkgLyogKFRDQjApIFRDIEJsb2NrIE1vZGUgUmVnaXN0ZXIgKi8KICNkZWZpbmUgQVQ5MUNfVENCMF9CQ1IJCSgoQVQ5MV9SRUcgKikJMHhGRkZBMDBDMCkgLyogKFRDQjApIFRDIEJsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgQVQ5MUNfUElPQ19QRFIJCSgoQVQ5MV9SRUcgKikJMHhGRkZGRjgwNCkgLyogKFBJT0MpIFBJTyBEaXNhYmxlIFJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2VtYWNfZGVmcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9lbWFjX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTEwMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9lbWFjX2RlZnMuaApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBCYXNlZCBvbjoKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogZG02NDR4X2VtYWMuaAorICoKKyAqIFRJIERhVmluY2kgKERNNjQ0WCkgRU1BQyBwZXJpcGhlcmFsIGRyaXZlciBoZWFkZXIgZm9yIERWLUVWTQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiB2ZXIuIDEuMDogU2VwIDIwMDUsIFRJIFBTUCBUZWFtIC0gQ3JlYXRlZCBFTUFDIHZlcnNpb24gZm9yIHVCb290LgorICoKKyAqLworCisjaWZuZGVmIF9ETTY0NFhfRU1BQ19IXworI2RlZmluZSBfRE02NDRYX0VNQUNfSF8KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgRU1BQ19CQVNFX0FERFIJCQkoMHgwMWM4MDAwMCkKKyNkZWZpbmUgRU1BQ19XUkFQUEVSX0JBU0VfQUREUgkJKDB4MDFjODEwMDApCisjZGVmaW5lIEVNQUNfV1JBUFBFUl9SQU1fQUREUgkJKDB4MDFjODIwMDApCisjZGVmaW5lIEVNQUNfTURJT19CQVNFX0FERFIJCSgweDAxYzg0MDAwKQorCisvKiBNRElPIG1vZHVsZSBpbnB1dCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgRU1BQ19NRElPX0JVU19GUkVRCQk5OTAwMDAwMAkvKiBQTEwvNiAtIDk5IE1IeiAqLworLyogTURJTyBjbG9jayBvdXRwdXQgZnJlcXVlbmN5ICovCisjZGVmaW5lIEVNQUNfTURJT19DTE9DS19GUkVRCQkyMDAwMDAwCQkvKiAyLjAgTUh6ICovCisKKy8qIEV0aGVybmV0IE1pbi9NYXggcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgRU1BQ19NSU5fRVRIRVJORVRfUEtUX1NJWkUJNjAKKyNkZWZpbmUgRU1BQ19NQVhfRVRIRVJORVRfUEtUX1NJWkUJMTUxOAorI2RlZmluZSBFTUFDX1BLVF9BTElHTgkJCTE4CS8qIDE1MTggKyAxOCA9IDE1MzYgKHBhY2tldCBhbGlnbmVkIG9uIDMyIGJ5dGUgYm91bmRyeSkgKi8KKworLyogTnVtYmVyIG9mIFJYIHBhY2tldCBidWZmZXJzCisgKiBOT1RFOiBPbmx5IDEgYnVmZmVyIHN1cHBvcnRlZCBhcyBvZiBub3cKKyAqLworI2RlZmluZSBFTUFDX01BWF9SWF9CVUZGRVJTCQkxMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqIEludGVybmFsbHkgdXNlZCBtYWNyb3MgKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRU1BQ19DSF9UWAkJCTEKKyNkZWZpbmUgRU1BQ19DSF9SWAkJCTAKKworLyogRWFjaCBkZXNjcmlwdG9yIG9jY3VwaWVzIDQgd29yZHMsIGxldHMgc3RhcnQgUlggZGVzYydzIGF0IDAgYW5kCisgKiByZXNlcnZlIHNwYWNlIGZvciA2NCBkZXNjcmlwdG9ycyBtYXgKKyAqLworI2RlZmluZSBFTUFDX1JYX0RFU0NfQkFTRQkJMHgwCisjZGVmaW5lIEVNQUNfVFhfREVTQ19CQVNFCQkweDEwMDAKKworLyogRU1BQyBUZWFyZG93biB2YWx1ZSAqLworI2RlZmluZSBFTUFDX1RFQVJET1dOX1ZBTFVFCQkweGZmZmZmZmZjCisKKy8qIE1JSSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1NUQVRVU19SRUcJCQkxCisKKy8qIE51bWJlciBvZiBzdGF0aXN0aWNzIHJlZ2lzdGVycyAqLworI2RlZmluZSBFTUFDX05VTV9TVEFUUwkJCTM2CisKKworLyogRU1BQyBEZXNjcmlwdG9yICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBfZW1hY19kZXNjCit7CisJdV9pbnQzMl90CW5leHQ7CQkvKiBQb2ludGVyIHRvIG5leHQgZGVzY3JpcHRvciBpbiBjaGFpbiAqLworCXVfaW50OF90CSpidWZmZXI7CS8qIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKi8KKwl1X2ludDMyX3QJYnVmZl9vZmZfbGVuOwkvKiBCdWZmZXIgT2Zmc2V0KE1TVykgYW5kIExlbmd0aChMU1cpICovCisJdV9pbnQzMl90CXBrdF9mbGFnX2xlbjsJLyogUGFja2V0IEZsYWdzKE1TVykgYW5kIExlbmd0aChMU1cpICovCit9IGVtYWNfZGVzYzsKKworLyogQ1BQSSBiaXQgcG9zaXRpb25zICovCisjZGVmaW5lIEVNQUNfQ1BQSV9TT1BfQklUCQkoMHg4MDAwMDAwMCkKKyNkZWZpbmUgRU1BQ19DUFBJX0VPUF9CSVQJCSgweDQwMDAwMDAwKQorI2RlZmluZSBFTUFDX0NQUElfT1dORVJTSElQX0JJVAkJKDB4MjAwMDAwMDApCisjZGVmaW5lIEVNQUNfQ1BQSV9FT1FfQklUCQkoMHgxMDAwMDAwMCkKKyNkZWZpbmUgRU1BQ19DUFBJX1RFQVJET1dOX0NPTVBMRVRFX0JJVAkoMHgwODAwMDAwMCkKKyNkZWZpbmUgRU1BQ19DUFBJX1BBU1NfQ1JDX0JJVAkJKDB4MDQwMDAwMDApCisKKyNkZWZpbmUgRU1BQ19DUFBJX1JYX0VSUk9SX0ZSQU1FCSgweDAzZmMwMDAwKQorCisjZGVmaW5lIEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEUJCSgweDIwKQorI2RlZmluZSBFTUFDX01BQ0NPTlRST0xfRlVMTERVUExFWF9FTkFCTEUJKDB4MSkKKworI2RlZmluZSBFTUFDX1JYTUJQRU5BQkxFX1JYQ0FGRU5fRU5BQkxFCSgweDIwMDAwMCkKKyNkZWZpbmUgRU1BQ19SWE1CUEVOQUJMRV9SWEJST0FERU4JKDB4MjAwMCkKKworCisjZGVmaW5lIE1ESU9fQ09OVFJPTF9JRExFCQkoMHg4MDAwMDAwMCkKKyNkZWZpbmUgTURJT19DT05UUk9MX0VOQUJMRQkJKDB4NDAwMDAwMDApCisjZGVmaW5lIE1ESU9fQ09OVFJPTF9GQVVMVF9FTkFCTEUJKDB4NDAwMDApCisjZGVmaW5lIE1ESU9fQ09OVFJPTF9GQVVMVAkJKDB4ODAwMDApCisjZGVmaW5lIE1ESU9fVVNFUkFDQ0VTUzBfR08JCSgweDgwMDAwMDAwKQorI2RlZmluZSBNRElPX1VTRVJBQ0NFU1MwX1dSSVRFX1JFQUQJKDB4MCkKKyNkZWZpbmUgTURJT19VU0VSQUNDRVNTMF9XUklURV9XUklURQkoMHg0MDAwMDAwMCkKKyNkZWZpbmUgTURJT19VU0VSQUNDRVNTMF9BQ0sJCSgweDIwMDAwMDAwKQorCisvKiBFdGhlcm5ldCBNQUMgUmVnaXN0ZXJzIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgIHsKKwlkdl9yZWcJCVRYSURWRVI7CisJZHZfcmVnCQlUWENPTlRST0w7CisJZHZfcmVnCQlUWFRFQVJET1dOOworCXVfaW50OF90CVJTVkQwWzRdOworCWR2X3JlZwkJUlhJRFZFUjsKKwlkdl9yZWcJCVJYQ09OVFJPTDsKKwlkdl9yZWcJCVJYVEVBUkRPV047CisJdV9pbnQ4X3QJUlNWRDFbMTAwXTsKKwlkdl9yZWcJCVRYSU5UU1RBVFJBVzsKKwlkdl9yZWcJCVRYSU5UU1RBVE1BU0tFRDsKKwlkdl9yZWcJCVRYSU5UTUFTS1NFVDsKKwlkdl9yZWcJCVRYSU5UTUFTS0NMRUFSOworCWR2X3JlZwkJTUFDSU5WRUNUT1I7CisJdV9pbnQ4X3QJUlNWRDJbMTJdOworCWR2X3JlZwkJUlhJTlRTVEFUUkFXOworCWR2X3JlZwkJUlhJTlRTVEFUTUFTS0VEOworCWR2X3JlZwkJUlhJTlRNQVNLU0VUOworCWR2X3JlZwkJUlhJTlRNQVNLQ0xFQVI7CisJZHZfcmVnCQlNQUNJTlRTVEFUUkFXOworCWR2X3JlZwkJTUFDSU5UU1RBVE1BU0tFRDsKKwlkdl9yZWcJCU1BQ0lOVE1BU0tTRVQ7CisJZHZfcmVnCQlNQUNJTlRNQVNLQ0xFQVI7CisJdV9pbnQ4X3QJUlNWRDNbNjRdOworCWR2X3JlZwkJUlhNQlBFTkFCTEU7CisJZHZfcmVnCQlSWFVOSUNBU1RTRVQ7CisJZHZfcmVnCQlSWFVOSUNBU1RDTEVBUjsKKwlkdl9yZWcJCVJYTUFYTEVOOworCWR2X3JlZwkJUlhCVUZGRVJPRkZTRVQ7CisJZHZfcmVnCQlSWEZJTFRFUkxPV1RIUkVTSDsKKwl1X2ludDhfdAlSU1ZENFs4XTsKKwlkdl9yZWcJCVJYMEZMT1dUSFJFU0g7CisJZHZfcmVnCQlSWDFGTE9XVEhSRVNIOworCWR2X3JlZwkJUlgyRkxPV1RIUkVTSDsKKwlkdl9yZWcJCVJYM0ZMT1dUSFJFU0g7CisJZHZfcmVnCQlSWDRGTE9XVEhSRVNIOworCWR2X3JlZwkJUlg1RkxPV1RIUkVTSDsKKwlkdl9yZWcJCVJYNkZMT1dUSFJFU0g7CisJZHZfcmVnCQlSWDdGTE9XVEhSRVNIOworCWR2X3JlZwkJUlgwRlJFRUJVRkZFUjsKKwlkdl9yZWcJCVJYMUZSRUVCVUZGRVI7CisJZHZfcmVnCQlSWDJGUkVFQlVGRkVSOworCWR2X3JlZwkJUlgzRlJFRUJVRkZFUjsKKwlkdl9yZWcJCVJYNEZSRUVCVUZGRVI7CisJZHZfcmVnCQlSWDVGUkVFQlVGRkVSOworCWR2X3JlZwkJUlg2RlJFRUJVRkZFUjsKKwlkdl9yZWcJCVJYN0ZSRUVCVUZGRVI7CisJZHZfcmVnCQlNQUNDT05UUk9MOworCWR2X3JlZwkJTUFDU1RBVFVTOworCWR2X3JlZwkJRU1DT05UUk9MOworCWR2X3JlZwkJRklGT0NPTlRST0w7CisJZHZfcmVnCQlNQUNDT05GSUc7CisJZHZfcmVnCQlTT0ZUUkVTRVQ7CisJdV9pbnQ4X3QJUlNWRDVbODhdOworCWR2X3JlZwkJTUFDU1JDQUREUkxPOworCWR2X3JlZwkJTUFDU1JDQUREUkhJOworCWR2X3JlZwkJTUFDSEFTSDE7CisJZHZfcmVnCQlNQUNIQVNIMjsKKwlkdl9yZWcJCUJPRkZURVNUOworCWR2X3JlZwkJVFBBQ0VURVNUOworCWR2X3JlZwkJUlhQQVVTRTsKKwlkdl9yZWcJCVRYUEFVU0U7CisJdV9pbnQ4X3QJUlNWRDZbMTZdOworCWR2X3JlZwkJUlhHT09ERlJBTUVTOworCWR2X3JlZwkJUlhCQ0FTVEZSQU1FUzsKKwlkdl9yZWcJCVJYTUNBU1RGUkFNRVM7CisJZHZfcmVnCQlSWFBBVVNFRlJBTUVTOworCWR2X3JlZwkJUlhDUkNFUlJPUlM7CisJZHZfcmVnCQlSWEFMSUdOQ09ERUVSUk9SUzsKKwlkdl9yZWcJCVJYT1ZFUlNJWkVEOworCWR2X3JlZwkJUlhKQUJCRVI7CisJZHZfcmVnCQlSWFVOREVSU0laRUQ7CisJZHZfcmVnCQlSWEZSQUdNRU5UUzsKKwlkdl9yZWcJCVJYRklMVEVSRUQ7CisJZHZfcmVnCQlSWFFPU0ZJTFRFUkVEOworCWR2X3JlZwkJUlhPQ1RFVFM7CisJZHZfcmVnCQlUWEdPT0RGUkFNRVM7CisJZHZfcmVnCQlUWEJDQVNURlJBTUVTOworCWR2X3JlZwkJVFhNQ0FTVEZSQU1FUzsKKwlkdl9yZWcJCVRYUEFVU0VGUkFNRVM7CisJZHZfcmVnCQlUWERFRkVSUkVEOworCWR2X3JlZwkJVFhDT0xMSVNJT047CisJZHZfcmVnCQlUWFNJTkdMRUNPTEw7CisJZHZfcmVnCQlUWE1VTFRJQ09MTDsKKwlkdl9yZWcJCVRYRVhDRVNTSVZFQ09MTDsKKwlkdl9yZWcJCVRYTEFURUNPTEw7CisJZHZfcmVnCQlUWFVOREVSUlVOOworCWR2X3JlZwkJVFhDQVJSSUVSU0VOU0U7CisJZHZfcmVnCQlUWE9DVEVUUzsKKwlkdl9yZWcJCUZSQU1FNjQ7CisJZHZfcmVnCQlGUkFNRTY1VDEyNzsKKwlkdl9yZWcJCUZSQU1FMTI4VDI1NTsKKwlkdl9yZWcJCUZSQU1FMjU2VDUxMTsKKwlkdl9yZWcJCUZSQU1FNTEyVDEwMjM7CisJZHZfcmVnCQlGUkFNRTEwMjRUVVA7CisJZHZfcmVnCQlORVRPQ1RFVFM7CisJZHZfcmVnCQlSWFNPRk9WRVJSVU5TOworCWR2X3JlZwkJUlhNT0ZPVkVSUlVOUzsKKwlkdl9yZWcJCVJYRE1BT1ZFUlJVTlM7CisJdV9pbnQ4X3QJUlNWRDdbNjI0XTsKKwlkdl9yZWcJCU1BQ0FERFJMTzsKKwlkdl9yZWcJCU1BQ0FERFJISTsKKwlkdl9yZWcJCU1BQ0lOREVYOworCXVfaW50OF90CVJTVkQ4WzI0NF07CisJZHZfcmVnCQlUWDBIRFA7CisJZHZfcmVnCQlUWDFIRFA7CisJZHZfcmVnCQlUWDJIRFA7CisJZHZfcmVnCQlUWDNIRFA7CisJZHZfcmVnCQlUWDRIRFA7CisJZHZfcmVnCQlUWDVIRFA7CisJZHZfcmVnCQlUWDZIRFA7CisJZHZfcmVnCQlUWDdIRFA7CisJZHZfcmVnCQlSWDBIRFA7CisJZHZfcmVnCQlSWDFIRFA7CisJZHZfcmVnCQlSWDJIRFA7CisJZHZfcmVnCQlSWDNIRFA7CisJZHZfcmVnCQlSWDRIRFA7CisJZHZfcmVnCQlSWDVIRFA7CisJZHZfcmVnCQlSWDZIRFA7CisJZHZfcmVnCQlSWDdIRFA7CisJZHZfcmVnCQlUWDBDUDsKKwlkdl9yZWcJCVRYMUNQOworCWR2X3JlZwkJVFgyQ1A7CisJZHZfcmVnCQlUWDNDUDsKKwlkdl9yZWcJCVRYNENQOworCWR2X3JlZwkJVFg1Q1A7CisJZHZfcmVnCQlUWDZDUDsKKwlkdl9yZWcJCVRYN0NQOworCWR2X3JlZwkJUlgwQ1A7CisJZHZfcmVnCQlSWDFDUDsKKwlkdl9yZWcJCVJYMkNQOworCWR2X3JlZwkJUlgzQ1A7CisJZHZfcmVnCQlSWDRDUDsKKwlkdl9yZWcJCVJYNUNQOworCWR2X3JlZwkJUlg2Q1A7CisJZHZfcmVnCQlSWDdDUDsKK30gZW1hY19yZWdzOworCisvKiBFTUFDIFdyYXBwZXIgUmVnaXN0ZXJzIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgIHsKKwl1X2ludDhfdAlSU1ZEMFs0MTAwXTsKKwlkdl9yZWcJCUVXQ1RMOworCWR2X3JlZwkJRVdJTlRUQ05UOworfSBld3JhcF9yZWdzOworCisKKy8qIEVNQUMgTURJTyBSZWdpc3RlcnMgU3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCAgeworCWR2X3JlZwkJVkVSU0lPTjsKKwlkdl9yZWcJCUNPTlRST0w7CisJZHZfcmVnCQlBTElWRTsKKwlkdl9yZWcJCUxJTks7CisJZHZfcmVnCQlMSU5LSU5UUkFXOworCWR2X3JlZwkJTElOS0lOVE1BU0tFRDsKKwl1X2ludDhfdAlSU1ZEMFs4XTsKKwlkdl9yZWcJCVVTRVJJTlRSQVc7CisJZHZfcmVnCQlVU0VSSU5UTUFTS0VEOworCWR2X3JlZwkJVVNFUklOVE1BU0tTRVQ7CisJZHZfcmVnCQlVU0VSSU5UTUFTS0NMRUFSOworCXVfaW50OF90CVJTVkQxWzgwXTsKKwlkdl9yZWcJCVVTRVJBQ0NFU1MwOworCWR2X3JlZwkJVVNFUlBIWVNFTDA7CisJZHZfcmVnCQlVU0VSQUNDRVNTMTsKKwlkdl9yZWcJCVVTRVJQSFlTRUwxOworfSBtZGlvX3JlZ3M7CisKK2ludCBkbTY0NHhfZXRoX3BoeV9yZWFkKHVfaW50OF90IHBoeV9hZGRyLCB1X2ludDhfdCByZWdfbnVtLCB1X2ludDE2X3QgKmRhdGEpOworaW50IGRtNjQ0eF9ldGhfcGh5X3dyaXRlKHVfaW50OF90IHBoeV9hZGRyLCB1X2ludDhfdCByZWdfbnVtLCB1X2ludDE2X3QgZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisJY2hhcgluYW1lWzY0XTsKKwlpbnQJKCppbml0KShpbnQgcGh5X2FkZHIpOworCWludAkoKmlzX3BoeV9jb25uZWN0ZWQpKGludCBwaHlfYWRkcik7CisJaW50CSgqZ2V0X2xpbmtfc3BlZWQpKGludCBwaHlfYWRkcik7CisJaW50CSgqYXV0b19uZWdvdGlhdGUpKGludCBwaHlfYWRkcik7Cit9IHBoeV90OworCisjZGVmaW5lIFBIWV9MWFQ5NzIJKDB4MDAxMzc4ZTIpCitpbnQgbHh0OTcyX2lzX3BoeV9jb25uZWN0ZWQoaW50IHBoeV9hZGRyKTsKK2ludCBseHQ5NzJfZ2V0X2xpbmtfc3BlZWQoaW50IHBoeV9hZGRyKTsKK2ludCBseHQ5NzJfaW5pdF9waHkoaW50IHBoeV9hZGRyKTsKK2ludCBseHQ5NzJfYXV0b19uZWdvdGlhdGUoaW50IHBoeV9hZGRyKTsKKworI2RlZmluZSBQSFlfRFA4Mzg0OAkoMHgyMDAwNWM5MCkKK2ludCBkcDgzODQ4X2lzX3BoeV9jb25uZWN0ZWQoaW50IHBoeV9hZGRyKTsKK2ludCBkcDgzODQ4X2dldF9saW5rX3NwZWVkKGludCBwaHlfYWRkcik7CitpbnQgZHA4Mzg0OF9pbml0X3BoeShpbnQgcGh5X2FkZHIpOworaW50IGRwODM4NDhfYXV0b19uZWdvdGlhdGUoaW50IHBoeV9hZGRyKTsKKworI2VuZGlmICAvKiBfRE02NDRYX0VNQUNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvZW1pZl9kZWZzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2VtaWZfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmZjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2VtaWZfZGVmcy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0VNSUZfREVGU19IXworI2RlZmluZSBfRU1JRl9ERUZTX0hfCisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJZHZfcmVnCQlFUkNTUjsKKwlkdl9yZWcJCUFXQ0NSOworCWR2X3JlZwkJU0RCQ1I7CisJZHZfcmVnCQlTRFJDUjsKKwlkdl9yZWcJCUFCMUNSOworCWR2X3JlZwkJQUIyQ1I7CisJZHZfcmVnCQlBQjNDUjsKKwlkdl9yZWcJCUFCNENSOworCWR2X3JlZwkJU0RUSU1SOworCWR2X3JlZwkJRERSU1I7CisJZHZfcmVnCQlERFJQSFlDUjsKKwlkdl9yZWcJCUREUlBIWVNSOworCWR2X3JlZwkJVE9UQVI7CisJZHZfcmVnCQlUT1RBQ1RSOworCWR2X3JlZwkJRERSUEhZSURfUkVWOworCWR2X3JlZwkJU0RTUkVUUjsKKwlkdl9yZWcJCUVJUlI7CisJZHZfcmVnCQlFSU1SOworCWR2X3JlZwkJRUlNU1I7CisJZHZfcmVnCQlFSU1DUjsKKwlkdl9yZWcJCUlPQ1RSTFI7CisJZHZfcmVnCQlJT1NUQVRSOworCXVfaW50OF90CVJTVkQwWzhdOworCWR2X3JlZwkJTkFOREZDUjsKKwlkdl9yZWcJCU5BTkRGU1I7CisJdV9pbnQ4X3QJUlNWRDFbOF07CisJZHZfcmVnCQlOQU5ERjFFQ0M7CisJZHZfcmVnCQlOQU5ERjJFQ0M7CisJZHZfcmVnCQlOQU5ERjNFQ0M7CisJZHZfcmVnCQlOQU5ERjRFQ0M7Cit9IGVtaWZfcmVnaXN0ZXJzOworCit0eXBlZGVmIGVtaWZfcmVnaXN0ZXJzCSplbWlmcmVnczsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9oYXJkd2FyZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2RjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2hhcmR3YXJlLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogQmFzZWQgb246CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2hhcmR3YXJlLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKyNkZWZpbmUJUkVHKGFkZHIpCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShhZGRyKSkKKyNkZWZpbmUgUkVHX1AoYWRkcikJKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcikpCisKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgaW50CWR2X3JlZzsKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgaW50ICoJZHZfcmVnX3A7CisKKy8qCisgKiBCYXNlIHJlZ2lzdGVyIGFkZHJlc3NlcworICovCisjZGVmaW5lIERBVklOQ0lfRE1BXzNQQ0NfQkFTRQkJCSgweDAxYzAwMDAwKQorI2RlZmluZSBEQVZJTkNJX0RNQV8zUFRDMF9CQVNFCQkJKDB4MDFjMTAwMDApCisjZGVmaW5lIERBVklOQ0lfRE1BXzNQVEMxX0JBU0UJCQkoMHgwMWMxMDQwMCkKKyNkZWZpbmUgREFWSU5DSV9VQVJUMF9CQVNFCQkJKDB4MDFjMjAwMDApCisjZGVmaW5lIERBVklOQ0lfVUFSVDFfQkFTRQkJCSgweDAxYzIwNDAwKQorI2RlZmluZSBEQVZJTkNJX1VBUlQyX0JBU0UJCQkoMHgwMWMyMDgwMCkKKyNkZWZpbmUgREFWSU5DSV9JMkNfQkFTRQkJCSgweDAxYzIxMDAwKQorI2RlZmluZSBEQVZJTkNJX1RJTUVSMF9CQVNFCQkJKDB4MDFjMjE0MDApCisjZGVmaW5lIERBVklOQ0lfVElNRVIxX0JBU0UJCQkoMHgwMWMyMTgwMCkKKyNkZWZpbmUgREFWSU5DSV9XRE9HX0JBU0UJCQkoMHgwMWMyMWMwMCkKKyNkZWZpbmUgREFWSU5DSV9QV00wX0JBU0UJCQkoMHgwMWMyMjAwMCkKKyNkZWZpbmUgREFWSU5DSV9QV00xX0JBU0UJCQkoMHgwMWMyMjQwMCkKKyNkZWZpbmUgREFWSU5DSV9QV00yX0JBU0UJCQkoMHgwMWMyMjgwMCkKKyNkZWZpbmUgREFWSU5DSV9TWVNURU1fTU9EVUxFX0JBU0UJCSgweDAxYzQwMDAwKQorI2RlZmluZSBEQVZJTkNJX1BMTF9DTlRSTDBfQkFTRQkJCSgweDAxYzQwODAwKQorI2RlZmluZSBEQVZJTkNJX1BMTF9DTlRSTDFfQkFTRQkJCSgweDAxYzQwYzAwKQorI2RlZmluZSBEQVZJTkNJX1BXUl9TTEVFUF9DTlRSTF9CQVNFCQkoMHgwMWM0MTAwMCkKKyNkZWZpbmUgREFWSU5DSV9TWVNURU1fREZUX0JBU0UJCQkoMHgwMWM0MjAwMCkKKyNkZWZpbmUgREFWSU5DSV9BUk1fSU5UQ19CQVNFCQkJKDB4MDFjNDgwMDApCisjZGVmaW5lIERBVklOQ0lfSUVFRTEzOTRfQkFTRQkJCSgweDAxYzYwMDAwKQorI2RlZmluZSBEQVZJTkNJX1VTQl9PVEdfQkFTRQkJCSgweDAxYzY0MDAwKQorI2RlZmluZSBEQVZJTkNJX0NGQ19BVEFfQkFTRQkJCSgweDAxYzY2MDAwKQorI2RlZmluZSBEQVZJTkNJX1NQSV9CQVNFCQkJKDB4MDFjNjY4MDApCisjZGVmaW5lIERBVklOQ0lfR1BJT19CQVNFCQkJKDB4MDFjNjcwMDApCisjZGVmaW5lIERBVklOQ0lfVUhQSV9CQVNFCQkJKDB4MDFjNjc4MDApCisjZGVmaW5lIERBVklOQ0lfVlBTU19SRUdTX0JBU0UJCQkoMHgwMWM3MDAwMCkKKyNkZWZpbmUgREFWSU5DSV9FTUFDX0NOVFJMX1JFR1NfQkFTRQkJKDB4MDFjODAwMDApCisjZGVmaW5lIERBVklOQ0lfRU1BQ19XUkFQUEVSX0NOVFJMX1JFR1NfQkFTRQkoMHgwMWM4MTAwMCkKKyNkZWZpbmUgREFWSU5DSV9FTUFDX1dSQVBQRVJfUkFNX0JBU0UJCSgweDAxYzgyMDAwKQorI2RlZmluZSBEQVZJTkNJX01ESU9fQ05UUkxfUkVHU19CQVNFCQkoMHgwMWM4NDAwMCkKKyNkZWZpbmUgREFWSU5DSV9JTUNPUF9CQVNFCQkJKDB4MDFjYzAwMDApCisjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9DTlRSTF9CQVNFCQkoMHgwMWUwMDAwMCkKKyNkZWZpbmUgREFWSU5DSV9WTFlOUV9CQVNFCQkJKDB4MDFlMDEwMDApCisjZGVmaW5lIERBVklOQ0lfTUNCU1BfQkFTRQkJCSgweDAxZTAyMDAwKQorI2RlZmluZSBEQVZJTkNJX01NQ19TRF9CQVNFCQkJKDB4MDFlMTAwMDApCisjZGVmaW5lIERBVklOQ0lfTVNfQkFTRQkJCQkoMHgwMWUyMDAwMCkKKyNkZWZpbmUgREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UwX0JBU0UJKDB4MDIwMDAwMDApCisjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9EQVRBX0NFMV9CQVNFCSgweDA0MDAwMDAwKQorI2RlZmluZSBEQVZJTkNJX0FTWU5DX0VNSUZfREFUQV9DRTJfQkFTRQkoMHgwNjAwMDAwMCkKKyNkZWZpbmUgREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UzX0JBU0UJKDB4MDgwMDAwMDApCisjZGVmaW5lIERBVklOQ0lfVkxZTlFfUkVNT1RFX0JBU0UJCSgweDBjMDAwMDAwKQorCisvKiBQb3dlciBhbmQgU2xlZXAgQ29udHJvbGxlciAoUFNDKSBEb21haW5zICovCisjZGVmaW5lIERBVklOQ0lfR1BTQ19BUk1ET01BSU4JCTAKKyNkZWZpbmUgREFWSU5DSV9HUFNDX0RTUERPTUFJTgkJMQorCisjZGVmaW5lIERBVklOQ0lfTFBTQ19WUFNTTVNUUgkJMAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVlBTU1NMVgkJMQorI2RlZmluZSBEQVZJTkNJX0xQU0NfVFBDQwkJMgorI2RlZmluZSBEQVZJTkNJX0xQU0NfVFBUQzAJCTMKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RQVEMxCQk0CisjZGVmaW5lIERBVklOQ0lfTFBTQ19FTUFDCQk1CisjZGVmaW5lIERBVklOQ0lfTFBTQ19FTUFDX1dSQVBQRVIJNgorI2RlZmluZSBEQVZJTkNJX0xQU0NfTURJTwkJNworI2RlZmluZSBEQVZJTkNJX0xQU0NfSUVFRTEzOTQJCTgKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1VTQgkJOQorI2RlZmluZSBEQVZJTkNJX0xQU0NfQVRBCQkxMAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVkxZTlEJCTExCisjZGVmaW5lIERBVklOQ0lfTFBTQ19VSFBJCQkxMgorI2RlZmluZSBEQVZJTkNJX0xQU0NfRERSX0VNSUYJCTEzCisjZGVmaW5lIERBVklOQ0lfTFBTQ19BRU1JRgkJMTQKKyNkZWZpbmUgREFWSU5DSV9MUFNDX01NQ19TRAkJMTUKKyNkZWZpbmUgREFWSU5DSV9MUFNDX01FTVNUSUNLCQkxNgorI2RlZmluZSBEQVZJTkNJX0xQU0NfTWNCU1AJCTE3CisjZGVmaW5lIERBVklOQ0lfTFBTQ19JMkMJCTE4CisjZGVmaW5lIERBVklOQ0lfTFBTQ19VQVJUMAkJMTkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1VBUlQxCQkyMAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVUFSVDIJCTIxCisjZGVmaW5lIERBVklOQ0lfTFBTQ19TUEkJCTIyCisjZGVmaW5lIERBVklOQ0lfTFBTQ19QV00wCQkyMworI2RlZmluZSBEQVZJTkNJX0xQU0NfUFdNMQkJMjQKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1BXTTIJCTI1CisjZGVmaW5lIERBVklOQ0lfTFBTQ19HUElPCQkyNgorI2RlZmluZSBEQVZJTkNJX0xQU0NfVElNRVIwCQkyNworI2RlZmluZSBEQVZJTkNJX0xQU0NfVElNRVIxCQkyOAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVElNRVIyCQkyOQorI2RlZmluZSBEQVZJTkNJX0xQU0NfU1lTVEVNX1NVQlNZUwkzMAorI2RlZmluZSBEQVZJTkNJX0xQU0NfQVJNCQkzMQorI2RlZmluZSBEQVZJTkNJX0xQU0NfU0NSMgkJMzIKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1NDUjMJCTMzCisjZGVmaW5lIERBVklOQ0lfTFBTQ19TQ1I0CQkzNAorI2RlZmluZSBEQVZJTkNJX0xQU0NfQ1JPU1NCQVIJCTM1CisjZGVmaW5lIERBVklOQ0lfTFBTQ19DRkcyNwkJMzYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0NGRzMJCTM3CisjZGVmaW5lIERBVklOQ0lfTFBTQ19DRkc1CQkzOAorI2RlZmluZSBEQVZJTkNJX0xQU0NfR0VNCQkzOQorI2RlZmluZSBEQVZJTkNJX0xQU0NfSU1DT1AJCTQwCisKKy8qIFNvbWUgUFNDIGRlZmluZXMgKi8KKyNkZWZpbmUgUFNDX0NIUF9TSFJUU1cJCQkoMHgwMWM0MDAzOCkKKyNkZWZpbmUgUFNDX0dCTENUTAkJCSgweDAxYzQxMDEwKQorI2RlZmluZSBQU0NfRVBDUFIJCQkoMHgwMWM0MTA3MCkKKyNkZWZpbmUgUFNDX0VQQ0NSCQkJKDB4MDFjNDEwNzgpCisjZGVmaW5lIFBTQ19QVENNRAkJCSgweDAxYzQxMTIwKQorI2RlZmluZSBQU0NfUFRTVEFUCQkJKDB4MDFjNDExMjgpCisjZGVmaW5lIFBTQ19QRFNUQVQJCQkoMHgwMWM0MTIwMCkKKyNkZWZpbmUgUFNDX1BEU1RBVDEJCQkoMHgwMWM0MTIwNCkKKyNkZWZpbmUgUFNDX1BEQ1RMCQkJKDB4MDFjNDEzMDApCisjZGVmaW5lIFBTQ19QRENUTDEJCQkoMHgwMWM0MTMwNCkKKworI2RlZmluZSBQU0NfTURDVExfQkFTRQkJCSgweDAxYzQxYTAwKQorI2RlZmluZSBQU0NfTURTVEFUX0JBU0UJCQkoMHgwMWM0MTgwMCkKKworI2RlZmluZSBWREQzUDNWX1BXRE4JCQkoMHgwMWM0MDA0OCkKKyNkZWZpbmUgVUFSVDBfUFdSRU1VX01HTVQJCSgweDAxYzIwMDMwKQorCisjZGVmaW5lIFBTQ19TSUxWRVJfQlVMTEVUCQkoMHgwMWM0MWEyMCkKKworLyogU29tZSBQTEwgZGVmaW5lcyAqLworI2RlZmluZSBQTEwxX1BMTE0JCQkoMHgwMWM0MDkxMCkKKyNkZWZpbmUgUExMMl9QTExNCQkJKDB4MDFjNDBkMTApCisjZGVmaW5lIFBMTDJfRElWMgkJCSgweDAxYzQwZDFjKQorCisvKiBNaXNjZWxsYW5pYS4uLiAqLworI2RlZmluZSBWQlBSCQkJCSgweDIwMDAwMDIwKQorI2RlZmluZSBQSU5NVVgwCQkJCSgweDAxYzQwMDAwKQorI2RlZmluZSBQSU5NVVgxCQkJCSgweDAxYzQwMDA0KQorCisjZW5kaWYgLyogX19BU01fQVJDSF9IQVJEV0FSRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2kyY19kZWZzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2kyY19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5MDJlMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvaTJjX2RlZnMuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKgorICogU29tZSBjaGFuZ2VzIGNvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfREFWSU5DSV9JMkNfSF8KKyNkZWZpbmUgX0RBVklOQ0lfSTJDX0hfCisKKyNkZWZpbmUgSTJDX1dSSVRFCQkwCisjZGVmaW5lIEkyQ19SRUFECQkxCisKKyNkZWZpbmUgSTJDX0JBU0UJCTB4MDFjMjEwMDAKKworI2RlZmluZQlJMkNfT0EJCQkoSTJDX0JBU0UgKyAweDAwKQorI2RlZmluZSBJMkNfSUUJCQkoSTJDX0JBU0UgKyAweDA0KQorI2RlZmluZSBJMkNfU1RBVAkJKEkyQ19CQVNFICsgMHgwOCkKKyNkZWZpbmUgSTJDX1NDTEwJCShJMkNfQkFTRSArIDB4MGMpCisjZGVmaW5lIEkyQ19TQ0xICQkoSTJDX0JBU0UgKyAweDEwKQorI2RlZmluZSBJMkNfQ05UCQkJKEkyQ19CQVNFICsgMHgxNCkKKyNkZWZpbmUgSTJDX0RSUgkJCShJMkNfQkFTRSArIDB4MTgpCisjZGVmaW5lIEkyQ19TQQkJCShJMkNfQkFTRSArIDB4MWMpCisjZGVmaW5lIEkyQ19EWFIJCQkoSTJDX0JBU0UgKyAweDIwKQorI2RlZmluZSBJMkNfQ09OCQkJKEkyQ19CQVNFICsgMHgyNCkKKyNkZWZpbmUgSTJDX0lWCQkJKEkyQ19CQVNFICsgMHgyOCkKKyNkZWZpbmUgSTJDX1BTQwkJCShJMkNfQkFTRSArIDB4MzApCisKKy8qIEkyQyBtYXNrcyAqLworCisvKiBJMkMgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoSTJDX0lFKTogKi8KKyNkZWZpbmUgSTJDX0lFX1NDRF9JRQkoMSA8PCA1KQkvKiBTdG9wIGNvbmRpdGlvbiBkZXRlY3QgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJMkNfSUVfWFJEWV9JRQkoMSA8PCA0KQkvKiBUcmFuc21pdCBkYXRhIHJlYWR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX1JSRFlfSUUJKDEgPDwgMykJLyogUmVjZWl2ZSBkYXRhIHJlYWR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX0FSRFlfSUUJKDEgPDwgMikJLyogUmVnaXN0ZXIgYWNjZXNzIHJlYWR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX05BQ0tfSUUJKDEgPDwgMSkJLyogTm8gYWNrbm93bGVkZ21lbnQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJMkNfSUVfQUxfSUUJKDEgPDwgMCkJLyogQXJiaXRyYXRpb24gbG9zdCBpbnRlcnJ1cHQgZW5hYmxlICovCisKKy8qIEkyQyBTdGF0dXMgUmVnaXN0ZXIgKEkyQ19TVEFUKTogKi8KKworI2RlZmluZSBJMkNfU1RBVF9CQgkoMSA8PCAxMikJLyogQnVzIGJ1c3kgKi8KKyNkZWZpbmUgSTJDX1NUQVRfUk9WUgkoMSA8PCAxMSkJLyogUmVjZWl2ZSBvdmVycnVuICovCisjZGVmaW5lIEkyQ19TVEFUX1hVREYJKDEgPDwgMTApCS8qIFRyYW5zbWl0IHVuZGVyZmxvdyAqLworI2RlZmluZSBJMkNfU1RBVF9BQVMJKDEgPDwgOSkJLyogQWRkcmVzcyBhcyBzbGF2ZSAqLworI2RlZmluZSBJMkNfU1RBVF9TQ0QJKDEgPDwgNSkJLyogU3RvcCBjb25kaXRpb24gZGV0ZWN0ICovCisjZGVmaW5lIEkyQ19TVEFUX1hSRFkJKDEgPDwgNCkJLyogVHJhbnNtaXQgZGF0YSByZWFkeSAqLworI2RlZmluZSBJMkNfU1RBVF9SUkRZCSgxIDw8IDMpCS8qIFJlY2VpdmUgZGF0YSByZWFkeSAqLworI2RlZmluZSBJMkNfU1RBVF9BUkRZCSgxIDw8IDIpCS8qIFJlZ2lzdGVyIGFjY2VzcyByZWFkeSAqLworI2RlZmluZSBJMkNfU1RBVF9OQUNLCSgxIDw8IDEpCS8qIE5vIGFja25vd2xlZGdtZW50IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQUwJKDEgPDwgMCkJLyogQXJiaXRyYXRpb24gbG9zdCBpbnRlcnJ1cHQgZW5hYmxlICovCisKKworLyogSTJDIEludGVycnVwdCBDb2RlIFJlZ2lzdGVyIChJMkNfSU5UQ09ERSk6ICovCisKKyNkZWZpbmUgSTJDX0lOVENPREVfTUFTSwk3CisjZGVmaW5lIEkyQ19JTlRDT0RFX05PTkUJMAorI2RlZmluZSBJMkNfSU5UQ09ERV9BTAkJMQkvKiBBcmJpdHJhdGlvbiBsb3N0ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX05BSwkJMgkvKiBObyBhY2tub3dsZWRnZW1lbnQvZ2VuZXJhbCBjYWxsICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX0FSRFkJMwkvKiBSZWdpc3RlciBhY2Nlc3MgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX0lOVENPREVfUlJEWQk0CS8qIFJjdiBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX1hSRFkJNQkvKiBYbWl0IGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX0lOVENPREVfU0NECQk2CS8qIFN0b3AgY29uZGl0aW9uIGRldGVjdCAqLworCisKKy8qIEkyQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChJMkNfQ09OKTogKi8KKworI2RlZmluZSBJMkNfQ09OX0VOCSgxIDw8IDUpCS8qIEkyQyBtb2R1bGUgZW5hYmxlICovCisjZGVmaW5lIEkyQ19DT05fU1RCCSgxIDw8IDQpCS8qIFN0YXJ0IGJ5dGUgbW9kZSAobWFzdGVyIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgSTJDX0NPTl9NU1QJKDEgPDwgMTApCS8qIE1hc3Rlci9zbGF2ZSBtb2RlICovCisjZGVmaW5lIEkyQ19DT05fVFJYCSgxIDw8IDkpCS8qIFRyYW5zbWl0dGVyL3JlY2VpdmVyIG1vZGUgKG1hc3RlciBtb2RlIG9ubHkpICovCisjZGVmaW5lIEkyQ19DT05fWEEJKDEgPDwgOCkJLyogRXhwYW5kIGFkZHJlc3MgKi8KKyNkZWZpbmUgSTJDX0NPTl9TVFAJKDEgPDwgMTEpCS8qIFN0b3AgY29uZGl0aW9uIChtYXN0ZXIgbW9kZSBvbmx5KSAqLworI2RlZmluZSBJMkNfQ09OX1NUVAkoMSA8PCAxMykJLyogU3RhcnQgY29uZGl0aW9uIChtYXN0ZXIgbW9kZSBvbmx5KSAqLworCisjZGVmaW5lIEkyQ19USU1FT1VUCTB4ZmZmZjAwMDAJLyogVGltZW91dCBtYXNrIGZvciBwb2xsX2kyY19pcnEoKSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvbmFuZF9kZWZzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL25hbmRfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWJkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL25hbmRfZGVmcy5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFBhcnRzIHNoYW1lbGVzbHkgc3RvbGVuIGZyb20gTGludXggS2VybmVsIHNvdXJjZSB0cmVlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9OQU5EX0RFRlNfSF8KKyNkZWZpbmUgX05BTkRfREVGU19IXworCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKworI2RlZmluZQlNQVNLX0NMRQkweDEwCisjZGVmaW5lCU1BU0tfQUxFCTB4MGEKKworI2RlZmluZSBOQU5EX0NFMENMRQkoKHZvbGF0aWxlIHVfaW50OF90ICopKENGR19OQU5EX0JBU0UgKyAweDEwKSkKKyNkZWZpbmUgTkFORF9DRTBBTEUJKCh2b2xhdGlsZSB1X2ludDhfdCAqKShDRkdfTkFORF9CQVNFICsgMHgwYSkpCisjZGVmaW5lIE5BTkRfQ0UwREFUQQkoKHZvbGF0aWxlIHVfaW50OF90ICopQ0ZHX05BTkRfQkFTRSkKKwordHlwZWRlZiBzdHJ1Y3QgIHsKKwl1X2ludDMyX3QJTlJDU1I7CisJdV9pbnQzMl90CUFXQ0NSOworCXVfaW50OF90CVJTVkQwWzhdOworCXVfaW50MzJfdAlBQjFDUjsKKwl1X2ludDMyX3QJQUIyQ1I7CisJdV9pbnQzMl90CUFCM0NSOworCXVfaW50MzJfdAlBQjRDUjsKKwl1X2ludDhfdAlSU1ZEMVszMl07CisJdV9pbnQzMl90CU5JUlI7CisJdV9pbnQzMl90CU5JTVI7CisJdV9pbnQzMl90CU5JTVNSOworCXVfaW50MzJfdAlOSU1DUjsKKwl1X2ludDhfdAlSU1ZEMlsxNl07CisJdV9pbnQzMl90CU5BTkRGQ1I7CisJdV9pbnQzMl90CU5BTkRGU1I7CisJdV9pbnQ4X3QJUlNWRDNbOF07CisJdV9pbnQzMl90CU5BTkRGMUVDQzsKKwl1X2ludDMyX3QJTkFOREYyRUNDOworCXVfaW50MzJfdAlOQU5ERjNFQ0M7CisJdV9pbnQzMl90CU5BTkRGNEVDQzsKKwl1X2ludDhfdAlSU1ZENFs0XTsKKwl1X2ludDMyX3QJSU9ERlRFQ1I7CisJdV9pbnQzMl90CUlPREZUR0NSOworCXVfaW50OF90CVJTVkQ1WzRdOworCXVfaW50MzJfdAlJT0RGVE1STFI7CisJdV9pbnQzMl90CUlPREZUTVJNUjsKKwl1X2ludDMyX3QJSU9ERlRNUk1TQlI7CisJdV9pbnQ4X3QJUlNWRDZbMjBdOworCXVfaW50MzJfdAlNT0RSTlI7CisJdV9pbnQ4X3QJUlNWRDdbNzZdOworCXVfaW50MzJfdAlDRTBEQVRBOworCXVfaW50MzJfdAlDRTBBTEU7CisJdV9pbnQzMl90CUNFMENMRTsKKwl1X2ludDhfdAlSU1ZEOFs0XTsKKwl1X2ludDMyX3QJQ0UxREFUQTsKKwl1X2ludDMyX3QJQ0UxQUxFOworCXVfaW50MzJfdAlDRTFDTEU7CisJdV9pbnQ4X3QJUlNWRDlbNF07CisJdV9pbnQzMl90CUNFMkRBVEE7CisJdV9pbnQzMl90CUNFMkFMRTsKKwl1X2ludDMyX3QJQ0UyQ0xFOworCXVfaW50OF90CVJTVkQxMFs0XTsKKwl1X2ludDMyX3QJQ0UzREFUQTsKKwl1X2ludDMyX3QJQ0UzQUxFOworCXVfaW50MzJfdAlDRTNDTEU7Cit9IG5hbmRfcmVnaXN0ZXJzOworCit0eXBlZGVmIHZvbGF0aWxlIG5hbmRfcmVnaXN0ZXJzCSpuYW5kcmVnczsKKworI2RlZmluZSBOQU5EX1JFQURfU1RBUlQJCTB4MDAKKyNkZWZpbmUgTkFORF9SRUFEX0VORAkJMHgzMAorI2RlZmluZSBOQU5EX1NUQVRVUwkJMHg3MAorCisjaWZkZWYgQ0ZHX05BTkRfSFdfRUNDCisjZGVmaW5lIE5BTkRfRWNjX1AxZQkJKDEgPDwgMCkKKyNkZWZpbmUgTkFORF9FY2NfUDJlCQkoMSA8PCAxKQorI2RlZmluZSBOQU5EX0VjY19QNGUJCSgxIDw8IDIpCisjZGVmaW5lIE5BTkRfRWNjX1A4ZQkJKDEgPDwgMykKKyNkZWZpbmUgTkFORF9FY2NfUDE2ZQkJKDEgPDwgNCkKKyNkZWZpbmUgTkFORF9FY2NfUDMyZQkJKDEgPDwgNSkKKyNkZWZpbmUgTkFORF9FY2NfUDY0ZQkJKDEgPDwgNikKKyNkZWZpbmUgTkFORF9FY2NfUDEyOGUJCSgxIDw8IDcpCisjZGVmaW5lIE5BTkRfRWNjX1AyNTZlCQkoMSA8PCA4KQorI2RlZmluZSBOQU5EX0VjY19QNTEyZQkJKDEgPDwgOSkKKyNkZWZpbmUgTkFORF9FY2NfUDEwMjRlCQkoMSA8PCAxMCkKKyNkZWZpbmUgTkFORF9FY2NfUDIwNDhlCQkoMSA8PCAxMSkKKworI2RlZmluZSBOQU5EX0VjY19QMW8JCSgxIDw8IDE2KQorI2RlZmluZSBOQU5EX0VjY19QMm8JCSgxIDw8IDE3KQorI2RlZmluZSBOQU5EX0VjY19QNG8JCSgxIDw8IDE4KQorI2RlZmluZSBOQU5EX0VjY19QOG8JCSgxIDw8IDE5KQorI2RlZmluZSBOQU5EX0VjY19QMTZvCQkoMSA8PCAyMCkKKyNkZWZpbmUgTkFORF9FY2NfUDMybwkJKDEgPDwgMjEpCisjZGVmaW5lIE5BTkRfRWNjX1A2NG8JCSgxIDw8IDIyKQorI2RlZmluZSBOQU5EX0VjY19QMTI4bwkJKDEgPDwgMjMpCisjZGVmaW5lIE5BTkRfRWNjX1AyNTZvCQkoMSA8PCAyNCkKKyNkZWZpbmUgTkFORF9FY2NfUDUxMm8JCSgxIDw8IDI1KQorI2RlZmluZSBOQU5EX0VjY19QMTAyNG8JCSgxIDw8IDI2KQorI2RlZmluZSBOQU5EX0VjY19QMjA0OG8JCSgxIDw8IDI3KQorCisjZGVmaW5lIFRGKHYpCQkJKHYgPyAxIDogMCkKKworI2RlZmluZSBQMjA0OGUoYSkJCShURihhICYgTkFORF9FY2NfUDIwNDhlKSA8PCAwKQorI2RlZmluZSBQMjA0OG8oYSkJCShURihhICYgTkFORF9FY2NfUDIwNDhvKSA8PCAxKQorI2RlZmluZSBQMWUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AxZSkgPDwgMikKKyNkZWZpbmUgUDFvKGEpCQkJKFRGKGEgJiBOQU5EX0VjY19QMW8pIDw8IDMpCisjZGVmaW5lIFAyZShhKQkJCShURihhICYgTkFORF9FY2NfUDJlKSA8PCA0KQorI2RlZmluZSBQMm8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AybykgPDwgNSkKKyNkZWZpbmUgUDRlKGEpCQkJKFRGKGEgJiBOQU5EX0VjY19QNGUpIDw8IDYpCisjZGVmaW5lIFA0byhhKQkJCShURihhICYgTkFORF9FY2NfUDRvKSA8PCA3KQorCisjZGVmaW5lIFA4ZShhKQkJCShURihhICYgTkFORF9FY2NfUDhlKSA8PCAwKQorI2RlZmluZSBQOG8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A4bykgPDwgMSkKKyNkZWZpbmUgUDE2ZShhKQkJCShURihhICYgTkFORF9FY2NfUDE2ZSkgPDwgMikKKyNkZWZpbmUgUDE2byhhKQkJCShURihhICYgTkFORF9FY2NfUDE2bykgPDwgMykKKyNkZWZpbmUgUDMyZShhKQkJCShURihhICYgTkFORF9FY2NfUDMyZSkgPDwgNCkKKyNkZWZpbmUgUDMybyhhKQkJCShURihhICYgTkFORF9FY2NfUDMybykgPDwgNSkKKyNkZWZpbmUgUDY0ZShhKQkJCShURihhICYgTkFORF9FY2NfUDY0ZSkgPDwgNikKKyNkZWZpbmUgUDY0byhhKQkJCShURihhICYgTkFORF9FY2NfUDY0bykgPDwgNykKKworI2RlZmluZSBQMTI4ZShhKQkJKFRGKGEgJiBOQU5EX0VjY19QMTI4ZSkgPDwgMCkKKyNkZWZpbmUgUDEyOG8oYSkJCShURihhICYgTkFORF9FY2NfUDEyOG8pIDw8IDEpCisjZGVmaW5lIFAyNTZlKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AyNTZlKSA8PCAyKQorI2RlZmluZSBQMjU2byhhKQkJKFRGKGEgJiBOQU5EX0VjY19QMjU2bykgPDwgMykKKyNkZWZpbmUgUDUxMmUoYSkJCShURihhICYgTkFORF9FY2NfUDUxMmUpIDw8IDQpCisjZGVmaW5lIFA1MTJvKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1A1MTJvKSA8PCA1KQorI2RlZmluZSBQMTAyNGUoYSkJCShURihhICYgTkFORF9FY2NfUDEwMjRlKSA8PCA2KQorI2RlZmluZSBQMTAyNG8oYSkJCShURihhICYgTkFORF9FY2NfUDEwMjRvKSA8PCA3KQorCisjZGVmaW5lIFA4ZV9zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1A4ZSkgPDwgMCkKKyNkZWZpbmUgUDhvX3MoYSkJCShURihhICYgTkFORF9FY2NfUDhvKSA8PCAxKQorI2RlZmluZSBQMTZlX3MoYSkJCShURihhICYgTkFORF9FY2NfUDE2ZSkgPDwgMikKKyNkZWZpbmUgUDE2b19zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxNm8pIDw8IDMpCisjZGVmaW5lIFAxZV9zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxZSkgPDwgNCkKKyNkZWZpbmUgUDFvX3MoYSkJCShURihhICYgTkFORF9FY2NfUDFvKSA8PCA1KQorI2RlZmluZSBQMmVfcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QMmUpIDw8IDYpCisjZGVmaW5lIFAyb19zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AybykgPDwgNykKKworI2RlZmluZSBQNGVfcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QNGUpIDw8IDApCisjZGVmaW5lIFA0b19zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1A0bykgPDwgMSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgKaW5kZXggZWJkYTcxOS4uZThjYjI5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgKQEAgLTU5Miw5ICs1OTIsMTEgQEAKICNkZWZpbmUgUE1DX1JFR19CQVNFCV9fUkVHKDB4NDA1MDA0MDApICAvKiBQcmltYXJ5IE1vZGVtIENvZGVjICovCiAjZGVmaW5lIFNNQ19SRUdfQkFTRQlfX1JFRygweDQwNTAwNTAwKSAgLyogU2Vjb25kYXJ5IE1vZGVtIENvZGVjICovCiAKKwogLyoKICAqIFVTQiBEZXZpY2UgQ29udHJvbGxlcgogICovCisjaWZuZGVmIENPTkZJR19DUFVfTU9OQUhBTlMKICNkZWZpbmUgVURDX1JFUzEJX19SRUcoMHg0MDYwMDAwNCkgIC8qIFVEQyBVbmRvY3VtZW50ZWQgLSBSZXNlcnZlZDEgKi8KICNkZWZpbmUgVURDX1JFUzIJX19SRUcoMHg0MDYwMDAwOCkgIC8qIFVEQyBVbmRvY3VtZW50ZWQgLSBSZXNlcnZlZDIgKi8KICNkZWZpbmUgVURDX1JFUzMJX19SRUcoMHg0MDYwMDAwQykgIC8qIFVEQyBVbmRvY3VtZW50ZWQgLSBSZXNlcnZlZDMgKi8KQEAgLTc0OSwxMSArNzUxLDI4IEBACiAjZGVmaW5lIFVTSVIxX0lSMTMJKDEgPDwgNSkJLyogSW50ZXJydXAgcmVxdWVzdCBlcCAxMyAqLwogI2RlZmluZSBVU0lSMV9JUjE0CSgxIDw8IDYpCS8qIEludGVycnVwIHJlcXVlc3QgZXAgMTQgKi8KICNkZWZpbmUgVVNJUjFfSVIxNQkoMSA8PCA3KQkvKiBJbnRlcnJ1cCByZXF1ZXN0IGVwIDE1ICovCisjZW5kaWYgLyogISBDT05GSUdfQ1BVX01PTkFIQU5TICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19QWEEyN1gpCisjaWYgZGVmaW5lZChDT05GSUdfUFhBMjdYKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfTU9OQUhBTlMpCisKKy8qCisgKiBVU0IgQ2xpZW50IENvbnRyb2xsZXIgKGluY29tcGxldGUpCisgKi8KKyNkZWZpbmUgVURDQ1IJCV9fUkVHKDB4NDA2MDAwMDApCisjZGVmaW5lIFVEQ0lDUjAJCV9fUkVHKDB4NDA2MDAwMDQpCisjZGVmaW5lIFVEQ0NJUjAJCV9fUkVHKDB4NDA2MDAwMDgpCisjZGVmaW5lIFVEQ0lTUjAJCV9fUkVHKDB4NDA2MDAwMGMpCisjZGVmaW5lIFVEQ1NJUjEJCV9fUkVHKDB4NDA2MDAwMTApCisjZGVmaW5lIFVEQ0ZOUgkJX19SRUcoMHg0MDYwMDAxNCkKKyNkZWZpbmUgVURDT1RHSUNSCV9fUkVHKDB4NDA2MDAwMTgpCisjZGVmaW5lIFVEQ09UR0lTUglfX1JFRygweDQwNjAwMDFjKQorI2RlZmluZSBVUDJPQ1IJCV9fUkVHKDB4NDA2MDAwMjApCisjZGVmaW5lIFVQM09DUgkJX19SRUcoMHg0MDYwMDAyNCkKKwogLyoKICAqIFVTQiBIb3N0IENvbnRyb2xsZXIKICAqLworI2RlZmluZSBPSENJX1JFR1NfQkFTRQkweDRDMDAwMDAwCS8qIHJlcXVpcmVkIGZvciBvaGNpIGRyaXZlciAqLwogI2RlZmluZSBVSENSRVYJCV9fUkVHKDB4NEMwMDAwMDApCiAjZGVmaW5lIFVIQ0hDT04JCV9fUkVHKDB4NEMwMDAwMDQpCiAjZGVmaW5lIFVIQ0NPTVMJCV9fUkVHKDB4NEMwMDAwMDgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC10eXBlcy5oIGIvaW5jbHVkZS9hc20tYXJtL21hY2gtdHlwZXMuaAppbmRleCA3ZDc4ODhlLi5mNmE1YjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC10eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9tYWNoLXR5cGVzLmgKQEAgLTczNiw3ICs3MzYsMTEgQEAKICNkZWZpbmUgTUFDSF9UWVBFX0xOMjQxMFNCQyAgICAgICAgICAgIDcyNQogI2RlZmluZSBNQUNIX1RZUEVfQ0IzUlVGQyAgICAgICAgICAgICAgNzI2CiAjZGVmaW5lIE1BQ0hfVFlQRV9NUDJVU0IgICAgICAgICAgICAgICA3MjcKKyNkZWZpbmUgTUFDSF9UWVBFX0FUOTFTQU05MjYxRUsgICAgICAgIDg0OAogI2RlZmluZSBNQUNIX1RZUEVfUEROQjMgICAgICAgICAgICAgICAxMDAyCisjZGVmaW5lIE1BQ0hfVFlQRV9BVDkxU0FNOTI2MEVLICAgICAgIDEwOTkKKyNkZWZpbmUgTUFDSF9UWVBFX0FUOTFSTTkyMDBERiAgICAgICAgMTExOQorI2RlZmluZSBNQUNIX1RZUEVfQVQ5MVNBTTkyNjNFSyAgICAgICAxMjAyCiAKICNpZmRlZiBDT05GSUdfQVJDSF9FQlNBMTEwCiAjIGlmZGVmIG1hY2hpbmVfYXJjaF90eXBlCkBAIC05NDAyLDYgKzk0MDYsNzEgQEAKICMgZGVmaW5lIG1hY2hpbmVfaXNfbXAydXNiKCkJKDApCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19NQUNIX0FUOTFTQU05MjYxRUsKKyMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIHVuZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJX19tYWNoaW5lX2FyY2hfdHlwZQorIyBlbHNlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJTUFDSF9UWVBFX0FUOTFTQU05MjYxRUsKKyMgZW5kaWYKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXQ5MXNhbTkyNjFlaygpCVwKKwkJKG1hY2hpbmVfYXJjaF90eXBlID09IE1BQ0hfVFlQRV9BVDkxU0FNOTI2MUVLKQorI2Vsc2UKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXQ5MXNhbTkyNjFlaygpCSgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9BVDkxU0FNOTI2MEVLCisjIGlmZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICB1bmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlCV9fbWFjaGluZV9hcmNoX3R5cGUKKyMgZWxzZQorIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlCU1BQ0hfVFlQRV9BVDkxU0FNOTI2MEVLCisjIGVuZGlmCisjIGRlZmluZSBtYWNoaW5lX2lzX2F0OTFzYW05MjYwZWsoKQlcCisJCShtYWNoaW5lX2FyY2hfdHlwZSA9PSBNQUNIX1RZUEVfQVQ5MVNBTTkyNjBFSykKKyNlbHNlCisjIGRlZmluZSBtYWNoaW5lX2lzX2F0OTFzYW05MjYwZWsoKQkoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfQVQ5MVNBTTkyNjNFSworIyBpZmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgdW5kZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlfX21hY2hpbmVfYXJjaF90eXBlCisjIGVsc2UKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlNQUNIX1RZUEVfQVQ5MVNBTTkyNjNFSworIyBlbmRpZgorIyBkZWZpbmUgbWFjaGluZV9pc19hdDkxc2FtOTI2M2VrKCkJXAorCShtYWNoaW5lX2FyY2hfdHlwZSA9PSBNQUNIX1RZUEVfQVQ5MVNBTTkyNjNFSykKKyNlbHNlCisjIGRlZmluZSBtYWNoaW5lX2lzX2F0OTFzYW05MjYzZWsoKQkoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfQVQ5MVJNOTIwMERGCisjIGlmZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICB1bmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlCV9fbWFjaGluZV9hcmNoX3R5cGUKKyMgZWxzZQorIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlCU1BQ0hfVFlQRV9BVDkxUk05MjAwREYKKyMgZW5kaWYKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXQ5MXJtOTIwMGRmKCkJXAorCShtYWNoaW5lX2FyY2hfdHlwZSA9PSBNQUNIX1RZUEVfQVQ5MVJNOTIwMERGKQorI2Vsc2UKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXQ5MXJtOTIwMGRmKCkJKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX0FUOTFTQU05MjYzRUsKKyMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIHVuZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJX19tYWNoaW5lX2FyY2hfdHlwZQorIyBlbHNlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJTUFDSF9UWVBFX0FUOTFTQU05MjYzRUsKKyMgZW5kaWYKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXQ5MXNhbTkyNjNlaygpCVwKKwkobWFjaGluZV9hcmNoX3R5cGUgPT0gTUFDSF9UWVBFX0FUOTFTQU05MjYzRUspCisjZWxzZQorIyBkZWZpbmUgbWFjaGluZV9pc19hdDkxc2FtOTI2M2VrKCkJKDApCisjZW5kaWYKKwogLyoKICAqIFRoZXNlIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWljcm9ibGF6ZS9hc20uaCBiL2luY2x1ZGUvYXNtLW1pY3JvYmxhemUvYXNtLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2UzMDAuaCBiL2luY2x1ZGUvYXNtLXBwYy9lMzAwLmgKaW5kZXggZDFiYjE1OS4uZGU4MjM5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2UzMDAuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZTMwMC5oCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBQVlJfRTMwMEMxCTB4ODA4MzAwMDAKICNkZWZpbmUgUFZSX0UzMDBDMgkweDgwODQwMDAwCiAjZGVmaW5lIFBWUl9FMzAwQzMJMHg4MDg1MDAwMAorI2RlZmluZSBQVlJfRTMwMEM0CTB4ODA4NjAwMDAKIAogLyoKICAqIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLURlcGVuZGVudCBSZWdpc3RlciAwIChISUQwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2dsb2JhbF9kYXRhLmggYi9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaAppbmRleCBjZDI0NjM2Li4xZjE1ODNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaApAQCAtNzEsMjAgKzcxLDI0IEBACiAJdTMyIGxjbGtfY2xrOwogCXUzMiBkZHJfY2xrOwogCXUzMiBwY2lfY2xrOworI2lmIGRlZmluZWQoQ09ORklHX01QQzgzNjApCisJdTMyICBkZHJfc2VjX2NsazsKKyNlbmRpZiAvKiBDT05GSUdfTVBDODM2MCAqLworI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfUUUpCiAJdTMyIHFlX2NsazsKIAl1MzIgYnJnX2NsazsKIAl1aW50IG1wX2FsbG9jX2Jhc2U7CiAJdWludCBtcF9hbGxvY190b3A7CiAjZW5kaWYgLyogQ09ORklHX1FFICovCi0jaWYgZGVmaW5lZCAoQ09ORklHX01QQzgzNjApCi0JdTMyICBkZHJfc2VjX2NsazsKLSNlbmRpZiAvKiBDT05GSUdfTVBDODM2MCAqLwotI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTVBDNXh4eCkKIAl1bnNpZ25lZCBsb25nCWlwYl9jbGs7CiAJdW5zaWduZWQgbG9uZwlwY2lfY2xrOwogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTVBDNTEyWCkKKwl1MzIgaXBiX2NsazsKKwl1MzIgY3NiX2NsazsKKyNlbmRpZiAvKiBDT05GSUdfTVBDNTEyWCAqLwogI2lmIGRlZmluZWQoQ09ORklHX01QQzgyMjApCiAJdW5zaWduZWQgbG9uZyAgIGJFeHRVYXJ0OwogCXVuc2lnbmVkIGxvbmcgICBpbnBfY2xrOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzUxMnguaCBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF81MTJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkMTBkNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF81MTJ4LmgKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIE1QQzUxMnggSW50ZXJuYWwgTWVtb3J5IE1hcAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQmFzZWQgb24gdGhlIE1QQzgzeHggaGVhZGVyLgorICovCisKKyNpZm5kZWYgX19JTU1BUF81MTJ4X18KKyNkZWZpbmUgX19JTU1BUF81MTJ4X18KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCit0eXBlZGVmIHN0cnVjdCBsYXc1MTJ4IHsKKwl1MzIgYmFyOwkvKiBCYXNlIEFkZHIgUmVnaXN0ZXIgKi8KKwl1MzIgYXI7CQkvKiBBdHRyaWJ1dGVzIFJlZ2lzdGVyICovCit9IGxhdzUyMXhfdDsKKworLyoKKyAqIFN5c3RlbSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICovCit0eXBlZGVmIHN0cnVjdCBzeXNjb25mNTEyeCB7CisJdTMyIGltbXJiYXI7CQkvKiBJbnRlcm5hbCBtZW1vcnkgbWFwIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCXU4IHJlczBbMHgxY107CisJdTMyIGxwYmF3OwkJLyogTFAgQm9vdCBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3MwYXc7CQkvKiBMUCBDUzAgQWNjZXNzIFdpbmRvdyAqLworCXUzMiBscGNzMWF3OwkJLyogTFAgQ1MxIEFjY2VzcyBXaW5kb3cgKi8KKwl1MzIgbHBjczJhdzsJCS8qIExQIENTMiBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3MzYXc7CQkvKiBMUCBDUzMgQWNjZXNzIFdpbmRvdyAqLworCXUzMiBscGNzNGF3OwkJLyogTFAgQ1M0IEFjY2VzcyBXaW5kb3cgKi8KKwl1MzIgbHBjczVhdzsJCS8qIExQIENTNSBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3M2YXc7CQkvKiBMUCBDUzYgQWNjZXNzIFdpbmRvdyAqLworCXUzMiBscGNzN2F3OwkJLyogTFAgQ1M3IEFjY2VzcyBXaW5kb3cgKi8KKwl1OCByZXMxWzB4MWNdOworCWxhdzUyMXhfdCBwY2lsYXdbM107CS8qIFBDSSBMb2NhbCBBY2Nlc3MgV2luZG93IDAtMiBSZWdpc3RlcnMgKi8KKwl1OCByZXMyWzB4MjhdOworCWxhdzUyMXhfdCBkZHJsYXc7CS8qIEREUiBMb2NhbCBBY2Nlc3MgV2luZG93ICovCisJdTggcmVzM1sweDE4XTsKKwl1MzIgbWJ4YmFyOwkJLyogTUJYIEJhc2UgQWRkcmVzcyAqLworCXUzMiBzcmFtYmFyOwkJLyogU1JBTSBCYXNlIEFkZHJlc3MgKi8KKwl1MzIgbmZjYmFyOwkJLyogTkZDIEJhc2UgQWRkcmVzcyAqLworCXU4IHJlczRbMHgzNF07CisJdTMyIHNwcmlkcjsJCS8qIFN5c3RlbSBQYXJ0IGFuZCBSZXZpc2lvbiBJRCBSZWdpc3RlciAqLworCXUzMiBzcGNyOwkJLyogU3lzdGVtIFByaW9yaXR5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1OCByZXM1WzB4ZjhdOworfSBzeXNjb25mNTEyeF90OworCisvKgorICogV2F0Y2ggRG9nIFRpbWVyIChXRFQpIFJlZ2lzdGVycworICovCit0eXBlZGVmIHN0cnVjdCB3ZHQ1MTJ4IHsKKwl1OCByZXMwWzRdOworCXUzMiBzd2NycjsJCS8qIFN5c3RlbSB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyICovCisJdTMyIHN3Y25yOwkJLyogU3lzdGVtIHdhdGNoZG9nIGNvdW50IHJlZ2lzdGVyICovCisJdTggcmVzMVsyXTsKKwl1MTYgc3dzcnI7CQkvKiBTeXN0ZW0gd2F0Y2hkb2cgc2VydmljZSByZWdpc3RlciAqLworCXU4IHJlczJbMHhGMF07Cit9IHdkdDUxMnhfdDsKKworLyoKKyAqIFJUQyBNb2R1bGUgUmVnaXN0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IHJ0Y2xrNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBydGNsazUxMnhfdDsKKworLyoKKyAqIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorICovCit0eXBlZGVmIHN0cnVjdCBncHQ1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IGdwdDUxMnhfdDsKKworLyoKKyAqIEludGVncmF0ZWQgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IGlwaWM1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IGlwaWM1MTJ4X3Q7CisKKy8qCisgKiBTeXN0ZW0gQXJiaXRlciBSZWdpc3RlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXJiaXRlcjUxMnggeworCXUzMiBhY3I7CQkvKiBBcmJpdGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIgYXRyOwkJLyogQXJiaXRlciBUaW1lcnMgUmVnaXN0ZXIgKi8KKwl1MzIgYXRlcjsJCS8qIEFyYml0ZXIgVHJhbnNmZXIgRXJyb3IgUmVnaXN0ZXIgKi8KKwl1MzIgYWVyOwkJLyogQXJiaXRlciBFdmVudCBSZWdpc3RlciAqLworCXUzMiBhaWRyOwkJLyogQXJiaXRlciBJbnRlcnJ1cHQgRGVmaW5pdGlvbiBSZWdpc3RlciAqLworCXUzMiBhbXI7CQkvKiBBcmJpdGVyIE1hc2sgUmVnaXN0ZXIgKi8KKwl1MzIgYWVhdHI7CQkvKiBBcmJpdGVyIEV2ZW50IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgKi8KKwl1MzIgYWVhZHI7CQkvKiBBcmJpdGVyIEV2ZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIgYWVycjsJCS8qIEFyYml0ZXIgRXZlbnQgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKwl1OCByZXMxWzB4RENdOworfSBhcmJpdGVyNTEyeF90OworCisvKgorICogUmVzZXQgTW9kdWxlCisgKi8KK3R5cGVkZWYgc3RydWN0IHJlc2V0NTEyeCB7CisJdTMyIHJjd2w7CQkvKiBSZXNldCBDb25maWd1cmF0aW9uIFdvcmQgTG93IFJlZ2lzdGVyICovCisJdTMyIHJjd2g7CQkvKiBSZXNldCBDb25maWd1cmF0aW9uIFdvcmQgSGlnaCBSZWdpc3RlciAqLworCXU4IHJlczBbOF07CisJdTMyIHJzcjsJCS8qIFJlc2V0IFN0YXR1cyBSZWdpc3RlciAqLworCXUzMiBybXI7CQkvKiBSZXNldCBNb2RlIFJlZ2lzdGVyICovCisJdTMyIHJwcjsJCS8qIFJlc2V0IHByb3RlY3Rpb24gUmVnaXN0ZXIgKi8KKwl1MzIgcmNyOwkJLyogUmVzZXQgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMiByY2VyOwkJLyogUmVzZXQgQ29udHJvbCBFbmFibGUgUmVnaXN0ZXIgKi8KKwl1OCByZXMxWzB4RENdOworfSByZXNldDUxMnhfdDsKKworLyoKKyAqIENsb2NrIE1vZHVsZQorICovCit0eXBlZGVmIHN0cnVjdCBjbGs1MTJ4IHsKKwl1MzIgc3BtcjsJCS8qIFN5c3RlbSBQTEwgTW9kZSBSZWdpc3RlciAqLworCXUzMiBzY2NyWzJdOwkJLyogU3lzdGVtIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdTMyIHNjZnJbMl07CQkvKiBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IFJlZ2lzdGVycyAqLworCXU4IHJlczBbNF07CisJdTMyIGJjcjsJCS8qIEJyZWFkIENydW1iIFJlZ2lzdGVyICovCisJdTMyIHBzY2NjclsxMl07CQkvKiBQU0MwLTExIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdTMyIHNwY2NyOwkJLyogU1BESUYgQ2xvY2sgQ29udHJvbCBSZWdpc3RlcnMgKi8KKwl1MzIgY2NjcjsJCS8qIENGTSBDbG9jayBDb250cm9sIFJlZ2lzdGVycyAqLworCXUzMiBkY2NyOwkJLyogRElVIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdTggcmVzMVsweGE4XTsKK30gY2xrNTEyeF90OworCisvKgorICogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIE1vZHVsZQorICovCit0eXBlZGVmIHN0cnVjdCBwbWM1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IHBtYzUxMnhfdDsKKworLyoKKyAqIEdlbmVyYWwgcHVycG9zZSBJL08gbW9kdWxlCisgKi8KK3R5cGVkZWYgc3RydWN0IGdwaW81MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IGdwaW81MTJ4X3Q7CisKKy8qCisgKiBERFIgTWVtb3J5IENvbnRyb2xsZXIgTWVtb3J5IE1hcAorICovCit0eXBlZGVmIHN0cnVjdCBkZHI1MTJ4IHsKKwl1MzIgZGRyX3N5c19jb25maWc7CS8qIFN5c3RlbSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyIGRkcl90aW1lX2NvbmZpZzA7CS8qIFRpbWluZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyIGRkcl90aW1lX2NvbmZpZzE7CS8qIFRpbWluZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyIGRkcl90aW1lX2NvbmZpZzI7CS8qIFRpbWluZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyIGRkcl9jb21tYW5kOwkvKiBDb21tYW5kIFJlZ2lzdGVyICovCisJdTMyIGRkcl9jb21wYWN0X2NvbW1hbmQ7CS8qIENvbXBhY3QgQ29tbWFuZCBSZWdpc3RlciAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzA7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzE7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzI7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzM7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzQ7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzU7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzY7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzc7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBEUVNfY29uZmlnX29mZnNldF9jb3VudDsJLyogRFFTIENvbmZpZyBPZmZzZXQgQ291bnQgKi8KKwl1MzIgRFFTX2NvbmZpZ19vZmZzZXRfdGltZTsJLyogRFFTIENvbmZpZyBPZmZzZXQgVGltZSAqLworCXUzMiBEUVNfZGVsYXlfc3RhdHVzOwkvKiBEUVMgRGVsYXkgU3RhdHVzICovCisJdTMyIHJlczBbMHhGXTsKKwl1MzIgcHJpb21hbl9jb25maWcxOwkvKiBQcmlvcml0eSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gKi8KKwl1MzIgcHJpb21hbl9jb25maWcyOwkvKiBQcmlvcml0eSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gKi8KKwl1MzIgaGlwcmlvX2NvbmZpZzsJLyogSGlnaCBQcmlvcml0eSBDb25maWd1cmF0aW9uICovCisJdTMyIGx1dF90YWJsZTBfbWFpbl91cHBlcjsJLyogTFVUMCBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTFfbWFpbl91cHBlcjsJLyogTFVUMSBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTJfbWFpbl91cHBlcjsJLyogTFVUMiBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTNfbWFpbl91cHBlcjsJLyogTFVUMyBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTRfbWFpbl91cHBlcjsJLyogTFVUNCBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTBfbWFpbl9sb3dlcjsJLyogTFVUMCBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTFfbWFpbl9sb3dlcjsJLyogTFVUMSBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTJfbWFpbl9sb3dlcjsJLyogTFVUMiBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTNfbWFpbl9sb3dlcjsJLyogTFVUMyBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTRfbWFpbl9sb3dlcjsJLyogTFVUNCBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTBfYWx0ZXJuYXRlX3VwcGVyOwkvKiBMVVQwIEFsdGVybmF0ZSBVcHBlciAqLworCXUzMiBsdXRfdGFibGUxX2FsdGVybmF0ZV91cHBlcjsgLyogTFVUMSBBbHRlcm5hdGUgVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlMl9hbHRlcm5hdGVfdXBwZXI7IC8qIExVVDIgQWx0ZXJuYXRlIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTNfYWx0ZXJuYXRlX3VwcGVyOyAvKiBMVVQzIEFsdGVybmF0ZSBVcHBlciAqLworCXUzMiBsdXRfdGFibGU0X2FsdGVybmF0ZV91cHBlcjsgLyogTFVUNCBBbHRlcm5hdGUgVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlMF9hbHRlcm5hdGVfbG93ZXI7IC8qIExVVDAgQWx0ZXJuYXRlIExvd2VyICovCisJdTMyIGx1dF90YWJsZTFfYWx0ZXJuYXRlX2xvd2VyOyAvKiBMVVQxIEFsdGVybmF0ZSBMb3dlciAqLworCXUzMiBsdXRfdGFibGUyX2FsdGVybmF0ZV9sb3dlcjsgLyogTFVUMiBBbHRlcm5hdGUgTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlM19hbHRlcm5hdGVfbG93ZXI7IC8qIExVVDMgQWx0ZXJuYXRlIExvd2VyICovCisJdTMyIGx1dF90YWJsZTRfYWx0ZXJuYXRlX2xvd2VyOyAvKiBMVVQ0IEFsdGVybmF0ZSBMb3dlciAqLworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yX2NvbmZpZzsKKwl1MzIgZXZlbnRfdGltZV9jb3VudGVyOworCXUzMiBldmVudF90aW1lX3ByZXNldDsKKwl1MzIgcGVyZm9ybWFuY2VfbW9uaXRvcjFfYWRkcmVzc19sb3c7CisJdTMyIHBlcmZvcm1hbmNlX21vbml0b3IyX2FkZHJlc3NfbG93OworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMV9hZGRyZXNzX2hpOworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMl9hZGRyZXNzX2hpOworCXUzMiByZXMxWzJdOworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMV9yZWFkX2NvdW50ZXI7CisJdTMyIHBlcmZvcm1hbmNlX21vbml0b3IyX3JlYWRfY291bnRlcjsKKwl1MzIgcGVyZm9ybWFuY2VfbW9uaXRvcjFfd3JpdGVfY291bnRlcjsKKwl1MzIgcGVyZm9ybWFuY2VfbW9uaXRvcjJfd3JpdGVfY291bnRlcjsKKwl1MzIgZ3JhbnRlZF9hY2tfY291bnRlcjA7CisJdTMyIGdyYW50ZWRfYWNrX2NvdW50ZXIxOworCXUzMiBncmFudGVkX2Fja19jb3VudGVyMjsKKwl1MzIgZ3JhbnRlZF9hY2tfY291bnRlcjM7CisJdTMyIGdyYW50ZWRfYWNrX2NvdW50ZXI0OworCXUzMiBjdW11bGF0aXZlX3dhaXRfY291bnRlcjA7CisJdTMyIGN1bXVsYXRpdmVfd2FpdF9jb3VudGVyMTsKKwl1MzIgY3VtdWxhdGl2ZV93YWl0X2NvdW50ZXIyOworCXUzMiBjdW11bGF0aXZlX3dhaXRfY291bnRlcjM7CisJdTMyIGN1bXVsYXRpdmVfd2FpdF9jb3VudGVyNDsKKwl1MzIgc3VtbWVkX3ByaW9yaXR5X2NvdW50ZXIwOworCXUzMiBzdW1tZWRfcHJpb3JpdHlfY291bnRlcjE7CisJdTMyIHN1bW1lZF9wcmlvcml0eV9jb3VudGVyMjsKKwl1MzIgc3VtbWVkX3ByaW9yaXR5X2NvdW50ZXIzOworCXUzMiBzdW1tZWRfcHJpb3JpdHlfY291bnRlcjQ7CisJdTMyIHJlczJbMHgzQURdOworfSBkZHI1MTJ4X3Q7CisKKworLyoKKyAqIERNQS9NZXNzYWdpbmcgVW5pdAorICovCit0eXBlZGVmIHN0cnVjdCBkbWE1MTJ4IHsKKwl1OCBmaXhtZVsweDE4MDBdOworfSBkbWE1MTJ4X3Q7CisKKy8qCisgKiBQQ0kgU29mdHdhcmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGNpY29uZjUxMnggeworCXU4IGZpeG1lWzB4ODBdOworfSBwY2ljb25mNTEyeF90OworCisvKgorICogU2VxdWVuY2VyCisgKi8KK3R5cGVkZWYgc3RydWN0IGlvczUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gaW9zNTEyeF90OworCisvKgorICogUENJIENvbnRyb2xsZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGNpY3RybDUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gcGNpY3RybDUxMnhfdDsKKworCisvKgorICogTVNDQU4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbXNjYW41MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IG1zY2FuNTEyeF90OworCisvKgorICogQkRMQworICovCit0eXBlZGVmIHN0cnVjdCBiZGxjNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBiZGxjNTEyeF90OworCisvKgorICogU0RIQworICovCit0eXBlZGVmIHN0cnVjdCBzZGhjNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBzZGhjNTEyeF90OworCisvKgorICogU1BESUYKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3BkaWY1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IHNwZGlmNTEyeF90OworCisvKgorICogSTJDCisgKi8KK3R5cGVkZWYgc3RydWN0IGkyYzUxMnhfZGV2IHsKKwl2b2xhdGlsZSB1MzIgbWFkcjsJCS8qIEkyQ24gKyAweDAwICovCisJdm9sYXRpbGUgdTMyIG1mZHI7CQkvKiBJMkNuICsgMHgwNCAqLworCXZvbGF0aWxlIHUzMiBtY3I7CQkvKiBJMkNuICsgMHgwOCAqLworCXZvbGF0aWxlIHUzMiBtc3I7CQkvKiBJMkNuICsgMHgwQyAqLworCXZvbGF0aWxlIHUzMiBtZHI7CQkvKiBJMkNuICsgMHgxMCAqLworCXU4IHJlczBbMHgwQ107Cit9IGkyYzUxMnhfZGV2X3Q7CisKK3R5cGVkZWYgc3RydWN0IGkyYzUxMnggeworCWkyYzUxMnhfZGV2X3QgZGV2WzNdOworCXZvbGF0aWxlIHUzMiBpY3I7CisJdm9sYXRpbGUgdTMyIG1pZnI7CisJdTggcmVzMFsweDk4XTsKK30gaTJjNTEyeF90OworCisvKgorICogQVhFCisgKi8KK3R5cGVkZWYgc3RydWN0IGF4ZTUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gYXhlNTEyeF90OworCisvKgorICogRElVCisgKi8KK3R5cGVkZWYgc3RydWN0IGRpdTUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gZGl1NTEyeF90OworCisvKgorICogQ0ZNCisgKi8KK3R5cGVkZWYgc3RydWN0IGNmbTUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gY2ZtNTEyeF90OworCisvKgorICogRkVDCisgKi8KK3R5cGVkZWYgc3RydWN0IGZlYzUxMnggeworCXU4IGZpeG1lWzB4ODAwXTsKK30gZmVjNTEyeF90OworCisvKgorICogVUxQSQorICovCit0eXBlZGVmIHN0cnVjdCB1bHBpNTEyeCB7CisJdTggZml4bWVbMHg2MDBdOworfSB1bHBpNTEyeF90OworCisvKgorICogVVRNSQorICovCit0eXBlZGVmIHN0cnVjdCB1dG1pNTEyeCB7CisJdTggZml4bWVbMHgzMDAwXTsKK30gdXRtaTUxMnhfdDsKKworLyoKKyAqIFBDSSBETUEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGNpZG1hNTEyeCB7CisJdTggZml4bWVbMHgzMDBdOworfSBwY2lkbWE1MTJ4X3Q7CisKKy8qCisgKiBJTyBDb250cm9sCisgKi8KK3R5cGVkZWYgc3RydWN0IGlvY3RybDUxMnggeworCXUzMiByZWdzWzB4NDAwXTsKK30gaW9jdHJsNTEyeF90OworCisvKgorICogSUlNCisgKi8KK3R5cGVkZWYgc3RydWN0IGlpbTUxMnggeworCXU4IGZpeG1lWzB4MTAwMF07Cit9IGlpbTUxMnhfdDsKKworLyoKKyAqIExQQworICovCit0eXBlZGVmIHN0cnVjdCBscGM1MTJ4IHsKKwl1MzIJY3NfY2ZnWzhdOwkvKiBDaGlwIFNlbGVjdCBOIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzCisJCQkJICAgTm8gZGVkaWNhdGVkIGVudHJ5IGZvciBDUyBCb290IGFzID09IENTMCAqLworCXUzMgljc19jcjsJCS8qIENoaXAgU2VsZWN0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJY3Nfc3I7CQkvKiBDaGlwIFNlbGVjdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJY3NfYmNyOwkJLyogQ2hpcCBTZWxlY3QgQnVyc3QgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgljc19kY2NyOwkvKiBDaGlwIFNlbGVjdCBEZWFkY3ljbGUgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgljc19oY2NyOwkvKiBDaGlwIFNlbGVjdCBIb2xkY3ljbGUgQ29udHJvbCBSZWdpc3RlciAqLworCXU4CXJlczBbMHhjY107CisJdTMyCXNjbHBjX3BzcjsJLyogU0NMUEMgUGFja2V0IFNpemUgUmVnaXN0ZXIgKi8KKwl1MzIJc2NscGNfc2FyOwkvKiBTQ0xQQyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisJdTMyCXNjbHBjX2NyOwkvKiBTQ0xQQyBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCXNjbHBjX2VyOwkvKiBTQ0xQQyBFbmFibGUgUmVnaXN0ZXIgKi8KKwl1MzIJc2NscGNfbmFyOwkvKiBTQ0xQQyBOZXh0QWRkcmVzcyBSZWdpc3RlciAqLworCXUzMglzY2xwY19zcjsJLyogU0NMUEMgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyCXNjbHBjX2JkcjsJLyogU0NMUEMgQnl0ZXMgRG9uZSBSZWdpc3RlciAqLworCXUzMgllbWJfc2NyOwkvKiBFTUIgU2hhcmUgQ291bnRlciBSZWdpc3RlciAqLworCXUzMgllbWJfcGNyOwkvKiBFTUIgUGF1c2UgQ29udHJvbCBSZWdpc3RlciAqLworCXU4CXJlczFbMHgxY107CisJdTMyCWxwY19mZHdyOwkvKiBMUEMgUlgvVFggRklGTyBEYXRhIFdvcmQgUmVnaXN0ZXIgKi8KKwl1MzIJbHBjX2ZzcjsJLyogTFBDIFJYL1RYIEZJRk8gU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyCWxwY19jcjsJCS8qIExQQyBSWC9UWCBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJbHBjX2FyOwkJLyogTFBDIFJYL1RYIEZJRk8gQWxhcm0gUmVnaXN0ZXIgKi8KKwl1OAlyZXMyWzB4YjBdOworfSBscGM1MTJ4X3Q7CisKKy8qCisgKiBQQVRBCisgKi8KK3R5cGVkZWYgc3RydWN0IHBhdGE1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IHBhdGE1MTJ4X3Q7CisKKy8qCisgKiBQU0MKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcHNjNTEyeCB7CisJdm9sYXRpbGUgdTgJbW9kZTsJCS8qIFBTQyArIDB4MDAgKi8KKwl2b2xhdGlsZSB1OAlyZXMwWzNdOworCXVuaW9uIHsJCQkJLyogUFNDICsgMHgwNCAqLworCQl2b2xhdGlsZSB1MTYJc3RhdHVzOworCQl2b2xhdGlsZSB1MTYJY2xvY2tfc2VsZWN0OworCX0gc3JfY3NyOworI2RlZmluZSBwc2Nfc3RhdHVzCXNyX2Nzci5zdGF0dXMKKyNkZWZpbmUgcHNjX2Nsb2NrX3NlbGVjdCBzcl9jc3IuY2xvY2tfc2VsZWN0CisJdm9sYXRpbGUgdTE2CXJlczE7CisJdm9sYXRpbGUgdTgJY29tbWFuZDsJLyogUFNDICsgMHgwOCAqLworCXZvbGF0aWxlIHU4CXJlczJbM107CisJdW5pb24gewkJCQkvKiBQU0MgKyAweDBjICovCisJCXZvbGF0aWxlIHU4CWJ1ZmZlcl84OworCQl2b2xhdGlsZSB1MTYJYnVmZmVyXzE2OworCQl2b2xhdGlsZSB1MzIJYnVmZmVyXzMyOworCX0gYnVmZmVyOworI2RlZmluZSBwc2NfYnVmZmVyXzgJYnVmZmVyLmJ1ZmZlcl84CisjZGVmaW5lIHBzY19idWZmZXJfMTYJYnVmZmVyLmJ1ZmZlcl8xNgorI2RlZmluZSBwc2NfYnVmZmVyXzMyCWJ1ZmZlci5idWZmZXJfMzIKKwl1bmlvbiB7CQkJCS8qIFBTQyArIDB4MTAgKi8KKwkJdm9sYXRpbGUgdTgJaXBjcjsKKwkJdm9sYXRpbGUgdTgJYWNyOworCX0gaXBjcl9hY3I7CisjZGVmaW5lIHBzY19pcGNyCWlwY3JfYWNyLmlwY3IKKyNkZWZpbmUgcHNjX2FjcgkJaXBjcl9hY3IuYWNyCisJdm9sYXRpbGUgdTgJcmVzM1szXTsKKwl1bmlvbiB7CQkJCS8qIFBTQyArIDB4MTQgKi8KKwkJdm9sYXRpbGUgdTE2CWlzcjsKKwkJdm9sYXRpbGUgdTE2CWltcjsKKwl9IGlzcl9pbXI7CisjZGVmaW5lIHBzY19pc3IJCWlzcl9pbXIuaXNyCisjZGVmaW5lIHBzY19pbXIJCWlzcl9pbXIuaW1yCisJdm9sYXRpbGUgdTE2CXJlczQ7CisJdm9sYXRpbGUgdTgJY3R1cjsJCS8qIFBTQyArIDB4MTggKi8KKwl2b2xhdGlsZSB1OAlyZXM1WzNdOworCXZvbGF0aWxlIHU4CWN0bHI7CQkvKiBQU0MgKyAweDFjICovCisJdm9sYXRpbGUgdTgJcmVzNlszXTsKKwl2b2xhdGlsZSB1MzIJY2NyOwkJLyogUFNDICsgMHgyMCAqLworCXZvbGF0aWxlIHU4CXJlczdbMTJdOworCXZvbGF0aWxlIHU4CWl2cjsJCS8qIFBTQyArIDB4MzAgKi8KKwl2b2xhdGlsZSB1OAlyZXM4WzNdOworCXZvbGF0aWxlIHU4CWlwOwkJLyogUFNDICsgMHgzNCAqLworCXZvbGF0aWxlIHU4CXJlczlbM107CisJdm9sYXRpbGUgdTgJb3AxOwkJLyogUFNDICsgMHgzOCAqLworCXZvbGF0aWxlIHU4CXJlczEwWzNdOworCXZvbGF0aWxlIHU4CW9wMDsJCS8qIFBTQyArIDB4M2MgKi8KKwl2b2xhdGlsZSB1OAlyZXMxMVszXTsKKwl2b2xhdGlsZSB1MzIJc2ljcjsJCS8qIFBTQyArIDB4NDAgKi8KKwl2b2xhdGlsZSB1OAlyZXMxMls2MF07CisJdm9sYXRpbGUgdTMyCXRmY21kOwkJLyogUFNDICsgMHg4MCAqLworCXZvbGF0aWxlIHUzMgl0ZmFsYXJtOwkvKiBQU0MgKyAweDg0ICovCisJdm9sYXRpbGUgdTMyCXRmc3RhdDsJCS8qIFBTQyArIDB4ODggKi8KKwl2b2xhdGlsZSB1MzIJdGZpbnRzdGF0OwkvKiBQU0MgKyAweDhDICovCisJdm9sYXRpbGUgdTMyCXRmaW50bWFzazsJLyogUFNDICsgMHg5MCAqLworCXZvbGF0aWxlIHUzMgl0ZmNvdW50OwkvKiBQU0MgKyAweDk0ICovCisJdm9sYXRpbGUgdTE2CXRmd3B0cjsJCS8qIFBTQyArIDB4OTggKi8KKwl2b2xhdGlsZSB1MTYJdGZycHRyOwkJLyogUFNDICsgMHg5QSAqLworCXZvbGF0aWxlIHUzMgl0ZnNpemU7CQkvKiBQU0MgKyAweDlDICovCisJdm9sYXRpbGUgdTgJcmVzMTNbMjhdOworCXVuaW9uIHsJCQkJLyogUFNDICsgMHhCQyAqLworCQl2b2xhdGlsZSB1OAlidWZmZXJfODsKKwkJdm9sYXRpbGUgdTE2CWJ1ZmZlcl8xNjsKKwkJdm9sYXRpbGUgdTMyCWJ1ZmZlcl8zMjsKKwl9IHRmZGF0YV9idWZmZXI7CisjZGVmaW5lIHRmZGF0YV84CXRmZGF0YV9idWZmZXIuYnVmZmVyXzgKKyNkZWZpbmUgdGZkYXRhXzE2CXRmZGF0YV9idWZmZXIuYnVmZmVyXzE2CisjZGVmaW5lIHRmZGF0YV8zMgl0ZmRhdGFfYnVmZmVyLmJ1ZmZlcl8zMgorCisJdm9sYXRpbGUgdTMyCXJmY21kOwkJLyogUFNDICsgMHhDMCAqLworCXZvbGF0aWxlIHUzMglyZmFsYXJtOwkvKiBQU0MgKyAweEM0ICovCisJdm9sYXRpbGUgdTMyCXJmc3RhdDsJCS8qIFBTQyArIDB4QzggKi8KKwl2b2xhdGlsZSB1MzIJcmZpbnRzdGF0OwkvKiBQU0MgKyAweENDICovCisJdm9sYXRpbGUgdTMyCXJmaW50bWFzazsJLyogUFNDICsgMHhEMCAqLworCXZvbGF0aWxlIHUzMglyZmNvdW50OwkvKiBQU0MgKyAweEQ0ICovCisJdm9sYXRpbGUgdTE2CXJmd3B0cjsJCS8qIFBTQyArIDB4RDggKi8KKwl2b2xhdGlsZSB1MTYJcmZycHRyOwkJLyogUFNDICsgMHhEQSAqLworCXZvbGF0aWxlIHUzMglyZnNpemU7CQkvKiBQU0MgKyAweERDICovCisJdm9sYXRpbGUgdTgJcmVzMThbMjhdOworCXVuaW9uIHsJCQkJLyogUFNDICsgMHhGQyAqLworCQl2b2xhdGlsZSB1OAlidWZmZXJfODsKKwkJdm9sYXRpbGUgdTE2CWJ1ZmZlcl8xNjsKKwkJdm9sYXRpbGUgdTMyCWJ1ZmZlcl8zMjsKKwl9IHJmZGF0YV9idWZmZXI7CisjZGVmaW5lIHJmZGF0YV84CXJmZGF0YV9idWZmZXIuYnVmZmVyXzgKKyNkZWZpbmUgcmZkYXRhXzE2CXJmZGF0YV9idWZmZXIuYnVmZmVyXzE2CisjZGVmaW5lIHJmZGF0YV8zMglyZmRhdGFfYnVmZmVyLmJ1ZmZlcl8zMgorfSBwc2M1MTJ4X3Q7CisKKy8qCisgKiBGSUZPQworICovCit0eXBlZGVmIHN0cnVjdCBmaWZvYzUxMnggeworCXUzMiBmaWZvY19jbWQ7CisJdTMyIGZpZm9jX2ludDsKKwl1MzIgZmlmb2NfZG1hOworCXUzMiBmaWZvY19heGU7CisJdTMyIGZpZm9jX2RlYnVnOworCXU4IGZpeG1lWzB4RUNdOworfSBmaWZvYzUxMnhfdDsKKworLyoKKyAqIFNBVEEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2F0YTUxMnggeworCXU4IGZpeG1lWzB4MjAwMF07Cit9IHNhdGE1MTJ4X3Q7CisKK3R5cGVkZWYgc3RydWN0IGltbWFwIHsKKwlzeXNjb25mNTEyeF90CQlzeXNjb25mOwkvKiBTeXN0ZW0gY29uZmlndXJhdGlvbiAqLworCXU4CQkJcmVzMFsweDcwMF07CisJd2R0NTEyeF90CQl3ZHQ7CQkvKiBXYXRjaCBEb2cgVGltZXIgKFdEVCkgKi8KKwlydGNsazUxMnhfdAkJcnRjOwkJLyogUmVhbCBUaW1lIENsb2NrIE1vZHVsZSAqLworCWdwdDUxMnhfdAkJZ3B0OwkJLyogR2VuZXJhbCBQdXJwb3NlIFRpbWVyICovCisJaXBpYzUxMnhfdAkJaXBpYzsJCS8qIEludGVncmF0ZWQgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyICovCisJYXJiaXRlcjUxMnhfdAkJYXJiaXRlcjsJLyogQ1NCIEFyYml0ZXIgKi8KKwlyZXNldDUxMnhfdAkJcmVzZXQ7CQkvKiBSZXNldCBNb2R1bGUgKi8KKwljbGs1MTJ4X3QJCWNsazsJCS8qIENsb2NrIE1vZHVsZSAqLworCXBtYzUxMnhfdAkJcG1jOwkJLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIE1vZHVsZSAqLworCWdwaW81MTJ4X3QJCWdwaW87CQkvKiBHZW5lcmFsIHB1cnBvc2UgSS9PIG1vZHVsZSAqLworCXU4CQkJcmVzMVsweDEwMF07CisJbXNjYW41MTJ4X3QJCW1zY2FuOwkJLyogTVNDQU4gKi8KKwliZGxjNTEyeF90CQliZGxjOwkJLyogQkRMQyAqLworCXNkaGM1MTJ4X3QJCXNkaGM7CQkvKiBTREhDICovCisJc3BkaWY1MTJ4X3QJCXNwZGlmOwkJLyogU1BESUYgKi8KKwlpMmM1MTJ4X3QJCWkyYzsJCS8qIEkyQyBDb250cm9sbGVycyAqLworCXU4CQkJcmVzMlsweDgwMF07CisJYXhlNTEyeF90CQlheGU7CQkvKiBBWEUgKi8KKwlkaXU1MTJ4X3QJCWRpdTsJCS8qIERpc3BsYXkgSW50ZXJmYWNlIFVuaXQgKi8KKwljZm01MTJ4X3QJCWNmbTsJCS8qIENsb2NrIEZyZXF1ZW5jeSBNZWFzdXJlbWVudCAqLworCXU4CQkJcmVzM1sweDUwMF07CisJZmVjNTEyeF90CQlmZWM7CQkvKiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwl1bHBpNTEyeF90CQl1bHBpOwkJLyogVVNCIFVMUEkgKi8KKwl1OAkJCXJlczRbMHhhMDBdOworCXV0bWk1MTJ4X3QJCXV0bWk7CQkvKiBVU0IgVVRNSSAqLworCXU4CQkJcmVzNVsweDEwMDBdOworCXBjaWRtYTUxMnhfdAkJcGNpX2RtYTsJLyogUENJIERNQSAqLworCXBjaWNvbmY1MTJ4X3QJCXBjaV9jb25mOwkvKiBQQ0kgQ29uZmlndXJhdGlvbiAqLworCXU4CQkJcmVzNlsweDgwXTsKKwlpb3M1MTJ4X3QJCWlvczsJCS8qIFBDSSBTZXF1ZW5jZXIgKi8KKwlwY2ljdHJsNTEyeF90CQlwY2lfY3RybDsJLyogUENJIENvbnRyb2xsZXIgQ29udHJvbCBhbmQgU3RhdHVzICovCisJdTgJCQlyZXM3WzB4YTAwXTsKKwlkZHI1MTJ4X3QJCW1kZHJjOwkJLyogTXVsdGktcG9ydCBERFIgTWVtb3J5IENvbnRyb2xsZXIgKi8KKwlpb2N0cmw1MTJ4X3QJCWlvX2N0cmw7CS8qIElPIENvbnRyb2wgKi8KKwlpaW01MTJ4X3QJCWlpbTsJCS8qIElDIElkZW50aWZpY2F0aW9uIG1vZHVsZSAqLworCXU4CQkJcmVzOFsweDQwMDBdOworCWxwYzUxMnhfdAkJbHBjOwkJLyogTG9jYWxQbHVzIENvbnRyb2xsZXIgKi8KKwlwYXRhNTEyeF90CQlwYXRhOwkJLyogUGFyYWxsZWwgQVRBICovCisJdTgJCQlyZXM5WzB4ZDAwXTsKKwlwc2M1MTJ4X3QJCXBzY1sxMl07CS8qIFBTQ3MgKi8KKwl1OAkJCXJlczEwWzB4MzAwXTsKKwlmaWZvYzUxMnhfdAkJZmlmb2M7CQkvKiBGSUZPIENvbnRyb2xsZXIgKi8KKwl1OAkJCXJlczExWzB4MjAwMF07CisJZG1hNTEyeF90CQlkbWE7CQkvKiBETUEgKi8KKwl1OAkJCXJlczEyWzB4YTgwMF07CisJc2F0YTUxMnhfdAkJc2F0YTsJCS8qIFNlcmlhbCBBVEEgKi8KKwl1OAkJCXJlczEzWzB4ZGUwMDBdOworfSBpbW1hcF90OworI2VuZGlmIC8qIF9fSU1NQVBfNTEyeF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODV4eC5oIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzg1eHguaAppbmRleCA1Mzc3YzJlLi4zZDQ4MTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODV4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84NXh4LmgKQEAgLTEsNiArMSw4IEBACiAvKgogICogTVBDODV4eCBJbnRlcm5hbCBNZW1vcnkgTWFwCiAgKgorICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKgogICogQ29weXJpZ2h0KGMpIDIwMDIsMjAwMyBNb3Rvcm9sYSBJbmMuCiAgKiBYaWFuZ2h1YSBYaWFvICh4LnhpYW9AbW90b3JvbGEuY29tKQogICoKQEAgLTE1MjAsMTQgKzE1MjIsMzkgQEAKIAljaGFyCXJlczU4WzYwMTc2XTsKIH0gY2Nzcl9yaW9fdDsKIAorLyogUXVpY2sgRW5naW5lIEJsb2NrIFBpbiBNdXhpbmcgUmVnaXN0ZXJzICgweGVfMDEwMCAtIDB4ZV8wMWJmKSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFyX2lvIHsKKwl1aW50CWNwb2RyOwkJLyogMHgxMDAgKi8KKwl1aW50CWNwZGF0OwkJLyogMHgxMDQgKi8KKwl1aW50CWNwZGlyMTsJCS8qIDB4MTA4ICovCisJdWludAljcGRpcjI7CQkvKiAweDEwYyAqLworCXVpbnQJY3BwYXIxOwkJLyogMHgxMTAgKi8KKwl1aW50CWNwcGFyMjsJCS8qIDB4MTE0ICovCisJY2hhcglyZXNbOF07Cit9cGFyX2lvX3Q7CisKIC8qCiAgKiBHbG9iYWwgVXRpbGl0aWVzIFJlZ2lzdGVyIEJsb2NrKDB4ZV8wMDAwLTB4Zl9mZmZmKQogICovCiB0eXBlZGVmIHN0cnVjdCBjY3NyX2d1ciB7CiAJdWludAlwb3JwbGxzcjsJLyogMHhlMDAwMCAtIFBPUiBQTEwgcmF0aW8gc3RhdHVzIHJlZ2lzdGVyICovCiAJdWludAlwb3JibXNyOwkvKiAweGUwMDA0IC0gUE9SIGJvb3QgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVBDODV4eF9QT1JCTVNSX0hBIAkJMHgwMDA3MDAwMAogCXVpbnQJcG9yaW1wc2NyOwkvKiAweGUwMDA4IC0gUE9SIEkvTyBpbXBlZGFuY2Ugc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVyICovCiAJdWludAlwb3JkZXZzcjsJLyogMHhlMDAwYyAtIFBPUiBJL08gZGV2aWNlIHN0YXR1cyByZWdzaXRlciAqLworI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1NHTUlJMV9ESVMJMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1NHTUlJMl9ESVMJMHgxMDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1NHTUlJM19ESVMJMHgwODAwMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1NHTUlJNF9ESVMJMHgwNDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX0lPX1NFTAkJMHgwMDM4MDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1BDSTJfQVJCIAkweDAwMDQwMDAwCisjZGVmaW5lIE1QQzg1eHhfUE9SREVWU1JfUENJMV9BUkIgCTB4MDAwMjAwMDAKKyNkZWZpbmUgTVBDODV4eF9QT1JERVZTUl9QQ0kxX1BDSTMyIAkweDAwMDEwMDAwCisjZGVmaW5lIE1QQzg1eHhfUE9SREVWU1JfUENJMV9TUEQgCTB4MDAwMDgwMDAKKyNkZWZpbmUgTVBDODV4eF9QT1JERVZTUl9QQ0kyX1NQRCAJMHgwMDAwNDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX0RSQU1fUlRZUEUJMHgwMDAwMDA2MAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1JJT19DVExTIAkweDAwMDAwMDA4CisjZGVmaW5lIE1QQzg1eHhfUE9SREVWU1JfUklPX0RFVl9JRAkweDAwMDAwMDA3CiAJdWludAlwb3JkYmdtc3I7CS8qIDB4ZTAwMTAgLSBQT1IgZGVidWcgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczFbMTJdOwogCXVpbnQJZ3Bwb3JjcjsJLyogMHhlMDAyMCAtIEdlbmVyYWwtcHVycG9zZSBQT1IgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwpAQCAtMTU0MSw2ICsxNTY4LDI1IEBACiAJdWludAlwbXV4Y3I7CQkvKiAweGUwMDYwIC0gQWx0ZXJuYXRlIGZ1bmN0aW9uIHNpZ25hbCBtdWx0aXBsZXggY29udHJvbCAqLwogCWNoYXIJcmVzNlsxMl07CiAJdWludAlkZXZkaXNyOwkvKiAweGUwMDcwIC0gRGV2aWNlIGRpc2FibGUgY29udHJvbCAqLworI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUENJMQkJMHg4MDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUENJMgkJMHg0MDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUENJRQkJMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfTEJDCQkweDA4MDAwMDAwCisjZGVmaW5lIE1QQzg1eHhfREVWRElTUl9QQ0lFMgkJMHgwNDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUENJRTMJCTB4MDIwMDAwMDAKKyNkZWZpbmUgTVBDODV4eF9ERVZESVNSX1NFQwkJMHgwMTAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfU1JJTwkJMHgwMDA4MDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUk1TRwkJMHgwMDA0MDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfRERSIAkJMHgwMDAxMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfQ1BVIAkJMHgwMDAwODAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfVEIgCQkweDAwMDA0MDAwCisjZGVmaW5lIE1QQzg1eHhfREVWRElTUl9ETUEJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTVBDODV4eF9ERVZESVNSX1RTRUMxCQkweDAwMDAwMDgwCisjZGVmaW5lIE1QQzg1eHhfREVWRElTUl9UU0VDMgkJMHgwMDAwMDA0MAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfVFNFQzMJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTVBDODV4eF9ERVZESVNSX1RTRUM0CQkweDAwMDAwMDEwCisjZGVmaW5lIE1QQzg1eHhfREVWRElTUl9JMkMJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTVBDODV4eF9ERVZESVNSX0RVQVJUCQkweDAwMDAwMDAyCiAJY2hhcglyZXM3WzEyXTsKIAl1aW50CXBvd21ndGNzcjsJLyogMHhlMDA4MCAtIFBvd2VyIG1hbmFnZW1lbnQgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVyICovCiAJY2hhcglyZXM4WzEyXTsKQEAgLTE1NDgsNyArMTU5NCwxNSBAQAogCWNoYXIJcmVzOVsxMl07CiAJdWludAlwdnI7CQkvKiAweGUwMGEwIC0gUHJvY2Vzc29yIHZlcnNpb24gcmVnaXN0ZXIgKi8KIAl1aW50CXN2cjsJCS8qIDB4ZTAwYTQgLSBTeXN0ZW0gdmVyc2lvbiByZWdpc3RlciAqLwotCWNoYXIJcmVzMTBbMzQxNl07CisJY2hhcglyZXMxMGFbOF07CisJdWludAlyc3RjcjsJCS8qIDB4ZTAwYjAgLSBSZXNldCBjb250cm9sIHJlZ2lzdGVyICovCisjaWZkZWYgTVBDODU2OAorCWNoYXIJcmVzMTBiWzc2XTsKKwlwYXJfaW9fdCBxZV9wYXJfaW9bN107ICAvKiAweGUwMTAwIC0gMHhlMDFiZiAqLworCWNoYXIJcmVzMTBjWzMxMzZdOworI2Vsc2UKKwljaGFyCXJlczEwYlszNDA0XTsKKyNlbmRpZgogCXVpbnQJY2xrb2NyOwkJLyogMHhlMGUwMCAtIENsb2NrIG91dCBzZWxlY3QgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczExWzEyXTsKIAl1aW50CWRkcmRsbGNyOwkvKiAweGUwZTEwIC0gRERSIERMTCBjb250cm9sIHJlZ2lzdGVyICovCkBAIC0xNTYwLDcgKzE2MTQsNyBAQAogCXVpbnQJZGRyaW9vdmNyOwkvKiAweGUwZjI0IC0gRERSIElPIE92ZXJyaWRlIENvbnRyb2wgKi8KIAl1aW50CXJlczE0OwkJLyogMHhlMGYyOCAqLwogCXVpbnQJdHNlYzM0aW9vdmNyOwkvKiAweGUwZjJjIC0gZVRTRUMgMy80IElPIG92ZXJyaWRlIGNvbnRyb2wgKi8KLQljaGFyCXJlczE1WzYxNjUxXTsKKwljaGFyCXJlczE1WzYxNjQ4XTsJLyogMHhlMGYzMCB0byAweGVmZmZmZiAqLwogfSBjY3NyX2d1cl90OwogCiAjZGVmaW5lIFBPUkRFVlNSX1BDSQkoMHgwMDgwMDAwMCkJLyogUENJIE1vZGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84Nnh4LmggYi9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODZ4eC5oCmluZGV4IDBlM2ZjMzQuLjE2OTcyNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84Nnh4LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzg2eHguaApAQCAtMTI1Nyw5ICsxMjU3LDEyIEBACiAJdWludAlwb3JwbGxzcjsJLyogMHhlMDAwMCAtIFBPUiBQTEwgcmF0aW8gc3RhdHVzIHJlZ2lzdGVyICovCiAJdWludAlwb3JibXNyOwkvKiAweGUwMDA0IC0gUE9SIGJvb3QgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKi8KICNkZWZpbmUgTVBDODZ4eF9QT1JCTVNSX0hBICAgICAgMHgwMDA2MDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkJNU1JfSEEJCTB4MDAwNzAwMDAKIAl1aW50CXBvcmltcHNjcjsJLyogMHhlMDAwOCAtIFBPUiBJL08gaW1wZWRhbmNlIHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlciAqLwogCXVpbnQJcG9yZGV2c3I7CS8qIDB4ZTAwMGMgLSBQT1IgSS9PIGRldmljZSBzdGF0dXMgcmVnc2l0ZXIgKi8KLSNkZWZpbmUgTVBDODZ4eF9QT1JERVZTUl9JT19TRUwgMHgwMDBGMDAwMAorI2RlZmluZSBNUEM4Nnh4X1BPUkRFVlNSX0lPX1NFTAkJMHgwMDBGMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX0lPX1NFTAkJMHgwMDM4MDAwMCAvKiA4NXh4IHBsYXRmb3JtIHR5cGUgKi8KKyNkZWZpbmUgTVBDODZ4eF9QT1JERVZTUl9DT1JFMVRFCTB4MDAwMDAwODAgLyogQVNNUCAoQ29yZTEgYWRkciB0cmFucykgKi8KIAl1aW50CXBvcmRiZ21zcjsJLyogMHhlMDAxMCAtIFBPUiBkZWJ1ZyBtb2RlIHN0YXR1cyByZWdpc3RlciAqLwogCWNoYXIJcmVzMVsxMl07CiAJdWludAlncHBvcmNyOwkvKiAweGUwMDIwIC0gR2VuZXJhbC1wdXJwb3NlIFBPUiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCkBAIC0xMjczLDggKzEyNzYsMTEgQEAKIAl1aW50CXBtdXhjcjsJCS8qIDB4ZTAwNjAgLSBBbHRlcm5hdGUgZnVuY3Rpb24gc2lnbmFsIG11bHRpcGxleCBjb250cm9sICovCiAJY2hhcglyZXM2WzEyXTsKIAl1aW50CWRldmRpc3I7CS8qIDB4ZTAwNzAgLSBEZXZpY2UgZGlzYWJsZSBjb250cm9sICovCi0jZGVmaW5lIE1QQzg2eHhfREVWRElTUl9QQ0lFWDEgIDB4ODAwMDAwMDAKLSNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUVYMiAgMHg0MDAwMDAwMAorI2RlZmluZSBNUEM4Nnh4X0RFVkRJU1JfUENJRVgxCTB4ODAwMDAwMDAKKyNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUVYMgkweDQwMDAwMDAwCisjZGVmaW5lIE1QQzg2eHhfREVWRElTUl9QQ0kxCTB4ODAwMDAwMDAKKyNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUUxCTB4NDAwMDAwMDAKKyNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUUyCTB4MjAwMDAwMDAKIAljaGFyCXJlczdbMTJdOwogCXVpbnQJcG93bWd0Y3NyOwkvKiAweGUwMDgwIC0gUG93ZXIgbWFuYWdlbWVudCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczhbMTJdOwpAQCAtMTI4Miw3ICsxMjg4LDkgQEAKIAljaGFyCXJlczlbMTJdOwogCXVpbnQJcHZyOwkJLyogMHhlMDBhMCAtIFByb2Nlc3NvciB2ZXJzaW9uIHJlZ2lzdGVyICovCiAJdWludAlzdnI7CQkvKiAweGUwMGE0IC0gU3lzdGVtIHZlcnNpb24gcmVnaXN0ZXIgKi8KLQljaGFyCXJlczEwWzM0MTZdOworCWNoYXIJcmVzMTBhWzE4ODBdOworCXVpbnQJY2xrZHZkcjsJLyogMHhlMDgwMCAtIENsb2NrIERpdmlkZSByZWdpc3RlciAqLworCWNoYXIJcmVzMTBiWzE1MzJdOwogCXVpbnQJY2xrb2NyOwkJLyogMHhlMGUwMCAtIENsb2NrIG91dCBzZWxlY3QgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczExWzEyXTsKIAl1aW50CWRkcmRsbGNyOwkvKiAweGUwZTEwIC0gRERSIERMTCBjb250cm9sIHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfZnNsX3BjaS5oIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwX2ZzbF9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDczMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwX2ZzbF9wY2kuaApAQCAtMCwwICsxLDE1MCBAQAorLyogKEMpIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19JTU1BUF84NXh4X2ZzbF9wY2lfXworI2RlZmluZSBfX0lNTUFQXzg1eHhfZnNsX3BjaV9fCisKKy8qCisgKiBDb21tb24gUENJL1BDSUUgUmVnaXN0ZXIgc3RydWN0dXJlIGZvciBtcGM4NXh4IGFuZCBtcGM4Nnh4CisgKi8KKworLyoKKyAqIFBDSSBUcmFuc2xhdGlvbiBSZWdpc3RlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGNpX291dGJvdW5kX3dpbmRvdyB7CisJdTMyCXBvdGFyOwkJLyogMHgwMCAtIEFkZHJlc3MgKi8KKwl1MzIJcG90ZWFyOwkJLyogMHgwNCAtIEFkZHJlc3MgRXh0ZW5kZWQgKi8KKwl1MzIJcG93YmFyOwkJLyogMHgwOCAtIFdpbmRvdyBCYXNlIEFkZHJlc3MgKi8KKwl1MzIJcmVzMTsKKwl1MzIJcG93YXI7CQkvKiAweDEwIC0gV2luZG93IEF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgUE9XQVJfRU4JMHg4MDAwMDAwMAorI2RlZmluZSBQT1dBUl9JT19SRUFECTB4MDAwODAwMDAKKyNkZWZpbmUgUE9XQVJfTUVNX1JFQUQJMHgwMDA0MDAwMAorI2RlZmluZSBQT1dBUl9JT19XUklURQkweDAwMDA4MDAwCisjZGVmaW5lIFBPV0FSX01FTV9XUklURQkweDAwMDA0MDAwCisJdTMyCXJlczJbM107Cit9IHBvdF90OworCit0eXBlZGVmIHN0cnVjdCBwY2lfaW5ib3VuZF93aW5kb3cgeworCXUzMglwaXRhcjsJCS8qIDB4MDAgLSBBZGRyZXNzICovCisJdTMyCXJlczE7CisJdTMyCXBpd2JhcjsJCS8qIDB4MDggLSBXaW5kb3cgQmFzZSBBZGRyZXNzICovCisJdTMyCXBpd2JlYXI7CS8qIDB4MGMgLSBXaW5kb3cgQmFzZSBBZGRyZXNzIEV4dGVuZGVkICovCisJdTMyCXBpd2FyOwkJLyogMHgxMCAtIFdpbmRvdyBBdHRyaWJ1dGVzICovCisjZGVmaW5lIFBJV0FSX0VOCQkweDgwMDAwMDAwCisjZGVmaW5lIFBJV0FSX1BGCQkweDIwMDAwMDAwCisjZGVmaW5lIFBJV0FSX0xPQ0FMCQkweDAwZjAwMDAwCisjZGVmaW5lIFBJV0FSX1JFQURfU05PT1AJMHgwMDA1MDAwMAorI2RlZmluZSBQSVdBUl9XUklURV9TTk9PUAkweDAwMDA1MDAwCisJdTMyCXJlczJbM107Cit9IHBpdF90OworCisvKiBQQ0kvUENJIEV4cHJlc3MgUmVnaXN0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBjY3NyX3BjaSB7CisJdTMyCWNmZ19hZGRyOwkvKiAweDAwMCAtIFBDSSBDb25maWd1cmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIJY2ZnX2RhdGE7CS8qIDB4MDA0IC0gUENJIENvbmZpZ3VyYXRpb24gRGF0YSBSZWdpc3RlciAqLworCXUzMglpbnRfYWNrOwkvKiAweDAwOCAtIFBDSSBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgKi8KKwl1MzIJb3V0X2NvbXBfdG87CS8qIDB4MDBDIC0gUENJIE91dGJvdW5kIENvbXBsZXRpb24gVGltZW91dCBSZWdpc3RlciAqLworCXUzMglvdXRfY29uZl90bzsJLyogMHgwMTAgLSBQQ0kgQ29uZmlndXJhdGlvbiBUaW1lb3V0IFJlZ2lzdGVyICovCisJdTMyCWNvbmZpZzsJCS8qIDB4MDE0IC0gUENJRSBDT05GSUcgUmVnaXN0ZXIgKi8KKwljaGFyCXJlczJbOF07CisJdTMyCXBtZV9tc2dfZGV0OwkvKiAweDAyMCAtIFBDSUUgUE1FICYgbWVzc2FnZSBkZXRlY3QgcmVnaXN0ZXIgKi8KKwl1MzIJcG1lX21zZ19kaXM7CS8qIDB4MDI0IC0gUENJRSBQTUUgJiBtZXNzYWdlIGRpc2FibGUgcmVnaXN0ZXIgKi8KKwl1MzIJcG1lX21zZ19pbnRfZW47CS8qIDB4MDI4IC0gUENJRSBQTUUgJiBtZXNzYWdlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1MzIJcG1fY29tbWFuZDsJLyogMHgwMmMgLSBQQ0lFIFBNIENvbW1hbmQgcmVnaXN0ZXIgKi8KKwljaGFyCXJlczRbMzAxNl07CS8qICAgICAoLSAjeGJmOAkgI3gzMCkzMDE2ICovCisJdTMyCWJsb2NrX3JldjE7CS8qIDB4YmY4IC0gUENJRSBCbG9jayBSZXZpc2lvbiByZWdpc3RlciAxICovCisJdTMyCWJsb2NrX3JldjI7CS8qIDB4YmZjIC0gUENJRSBCbG9jayBSZXZpc2lvbiByZWdpc3RlciAyICovCisKKwlwb3RfdAlwb3RbNV07CQkvKiAweGMwMCAtIDB4YzlmIE91dGJvdW5kIEFUTVUncyAwLCAxLCAyLCAzLCBhbmQgNCAqLworCXUzMglyZXM1WzY0XTsKKwlwaXRfdAlwaXRbM107CQkvKiAweGRhMCAtIDB4ZGZmIEluYm91bmQgQVRNVSdzIDMsIDIsIGFuZCAxICovCisjZGVmaW5lIFBJVDMgMAorI2RlZmluZSBQSVQyIDEKKyNkZWZpbmUgUElUMSAyCisKKyNpZiAwCisJdTMyCXBvdGFyMDsJCS8qIDB4YzAwIC0gUENJIE91dGJvdW5kIFRyYW5zYWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMCAqLworCXUzMglwb3RlYXIwOwkvKiAweGMwNCAtIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBFeHRlbmRlZCBBZGRyZXNzIFJlZ2lzdGVyIDAgKi8KKwljaGFyCXJlczVbOF07CisJdTMyCXBvd2FyMDsJCS8qIDB4YzEwIC0gUENJIE91dGJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDAgKi8KKwljaGFyCXJlczZbMTJdOworCXUzMglwb3RhcjE7CQkvKiAweGMyMCAtIFBDSSBPdXRib3VuZCBUcmFuc2FjdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDEgKi8KKwl1MzIJcG90ZWFyMTsJLyogMHhjMjQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAxICovCisJdTMyCXBvd2JhcjE7CS8qIDB4YzI4IC0gUENJIE91dGJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzN1s0XTsKKwl1MzIJcG93YXIxOwkJLyogMHhjMzAgLSBQQ0kgT3V0Ym91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzOFsxMl07CisJdTMyCXBvdGFyMjsJCS8qIDB4YzQwIC0gUENJIE91dGJvdW5kIFRyYW5zYWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCXUzMglwb3RlYXIyOwkvKiAweGM0NCAtIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBFeHRlbmRlZCBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKwl1MzIJcG93YmFyMjsJLyogMHhjNDggLSBQQ0kgT3V0Ym91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAyICovCisJY2hhcglyZXM5WzRdOworCXUzMglwb3dhcjI7CQkvKiAweGM1MCAtIFBDSSBPdXRib3VuZCBXaW5kb3cgQXR0cmlidXRlcyBSZWdpc3RlciAyICovCisJY2hhcglyZXMxMFsxMl07CisJdTMyCXBvdGFyMzsJCS8qIDB4YzYwIC0gUENJIE91dGJvdW5kIFRyYW5zYWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMyAqLworCXUzMglwb3RlYXIzOwkvKiAweGM2NCAtIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBFeHRlbmRlZCBBZGRyZXNzIFJlZ2lzdGVyIDMgKi8KKwl1MzIJcG93YmFyMzsJLyogMHhjNjggLSBQQ0kgT3V0Ym91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAzICovCisJY2hhcglyZXMxMVs0XTsKKwl1MzIJcG93YXIzOwkJLyogMHhjNzAgLSBQQ0kgT3V0Ym91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMyAqLworCWNoYXIJcmVzMTJbMTJdOworCXUzMglwb3RhcjQ7CQkvKiAweGM4MCAtIFBDSSBPdXRib3VuZCBUcmFuc2FjdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDQgKi8KKwl1MzIJcG90ZWFyNDsJLyogMHhjODQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciA0ICovCisJdTMyCXBvd2JhcjQ7CS8qIDB4Yzg4IC0gUENJIE91dGJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgNCAqLworCWNoYXIJcmVzMTNbNF07CisJdTMyCXBvd2FyNDsJCS8qIDB4YzkwIC0gUENJIE91dGJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDQgKi8KKwljaGFyCXJlczE0WzI2OF07CisJdTMyCXBpdGFyMzsJCS8qIDB4ZGEwIC0gUENJIEluYm91bmQgVHJhbnNsYXRpb24gQWRkcmVzcyBSZWdpc3RlciAzICovCisJY2hhcglyZXMxNVs0XTsKKwl1MzIJcGl3YmFyMzsJLyogMHhkYTggLSBQQ0kgSW5ib3VuZCBXaW5kb3cgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDMgKi8KKwl1MzIJcGl3YmVhcjM7CS8qIDB4ZGFjIC0gUENJIEluYm91bmQgV2luZG93IEJhc2UgRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAzICovCisJdTMyCXBpd2FyMzsJCS8qIDB4ZGIwIC0gUENJIEluYm91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMyAqLworCWNoYXIJcmVzMTZbMTJdOworCXUzMglwaXRhcjI7CQkvKiAweGRjMCAtIFBDSSBJbmJvdW5kIFRyYW5zbGF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCWNoYXIJcmVzMTdbNF07CisJdTMyCXBpd2JhcjI7CS8qIDB4ZGM4IC0gUENJIEluYm91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAyICovCisJdTMyCXBpd2JlYXIyOwkvKiAweGRjYyAtIFBDSSBJbmJvdW5kIFdpbmRvdyBCYXNlIEV4dGVuZGVkIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCXUzMglwaXdhcjI7CQkvKiAweGRkMCAtIFBDSSBJbmJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDIgKi8KKwljaGFyCXJlczE4WzEyXTsKKwl1MzIJcGl0YXIxOwkJLyogMHhkZTAgLSBQQ0kgSW5ib3VuZCBUcmFuc2xhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDEgKi8KKwljaGFyCXJlczE5WzRdOworCXUzMglwaXdiYXIxOwkvKiAweGRlOCAtIFBDSSBJbmJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzMjBbNF07CisJdTMyCXBpd2FyMTsJCS8qIDB4ZGYwIC0gUENJIEluYm91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzMjFbMTJdOworI2VuZGlmCisJdTMyCXBlZHI7CQkvKiAweGUwMCAtIFBDSSBFcnJvciBEZXRlY3QgUmVnaXN0ZXIgKi8KKwl1MzIJcGVjZHI7CQkvKiAweGUwNCAtIFBDSSBFcnJvciBDYXB0dXJlIERpc2FibGUgUmVnaXN0ZXIgKi8KKwl1MzIJcGVlcjsJCS8qIDB4ZTA4IC0gUENJIEVycm9yIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKwl1MzIJcGVhdHRyY3I7CS8qIDB4ZTBjIC0gUENJIEVycm9yIEF0dHJpYnV0ZXMgQ2FwdHVyZSBSZWdpc3RlciAqLworCXUzMglwZWFkZHJjcjsJLyogMHhlMTAgLSBQQ0kgRXJyb3IgQWRkcmVzcyBDYXB0dXJlIFJlZ2lzdGVyICovCisvKgl1MzIJcGVycl9kaXNyCSAqIDB4ZTEwIC0gUENJRSBFcm9yciBEaXNhYmxlIFJlZ2lzdGVyICovCisJdTMyCXBlZXh0YWRkcmNyOwkvKiAweGUxNCAtIFBDSQlFcnJvciBFeHRlbmRlZCBBZGRyZXNzIENhcHR1cmUgUmVnaXN0ZXIgKi8KKwl1MzIJcGVkbGNyOwkJLyogMHhlMTggLSBQQ0kgRXJyb3IgRGF0YSBMb3cgQ2FwdHVyZSBSZWdpc3RlciAqLworCXUzMglwZWRoY3I7CQkvKiAweGUxYyAtIFBDSSBFcnJvciBFcnJvciBEYXRhIEhpZ2ggQ2FwdHVyZSBSZWdpc3RlciAqLworCXUzMglnYXNfdGltcjsJLyogMHhlMjAgLSBQQ0kgR2Fza2V0IFRpbWVyIFJlZ2lzdGVyICovCisvKgl1MzIJcGVycl9jYXBfc3RhdDsJICogMHhlMjAgLSBQQ0lFIEVycm9yIENhcHR1cmUgU3RhdHVzIFJlZ2lzdGVyICovCisJY2hhcglyZXMyMls0XTsKKwl1MzIJcGVycl9jYXAwOwkvKiAweGUyOCAtIFBDSUUgRXJyb3IgQ2FwdHVyZSBSZWdpc3RlciAwICovCisJdTMyCXBlcnJfY2FwMTsJLyogMHhlMmMgLSBQQ0lFIEVycm9yIENhcHR1cmUgUmVnaXN0ZXIgMSAqLworCXUzMglwZXJyX2NhcDI7CS8qIDB4ZTMwIC0gUENJRSBFcnJvciBDYXB0dXJlIFJlZ2lzdGVyIDIgKi8KKwl1MzIJcGVycl9jYXAzOwkvKiAweGUzNCAtIFBDSUUgRXJyb3IgQ2FwdHVyZSBSZWdpc3RlciAzICovCisJY2hhcglyZXMyM1s0NTZdOwkvKiAgICAgKC0gI3gxMDAwICN4ZTM4KSA0NTYgKi8KK30gY2Nzcl9mc2xfcGNpX3Q7CisKKyNlbmRpZiAvKl9fSU1NQVBfZnNsX3BjaV9fKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF9xZS5oIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwX3FlLmgKaW5kZXggOTUwYjk0OS4uYTE2YTZkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2ltbWFwX3FlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwX3FlLmgKQEAgLTI4MSw2ICsyODEsMTcgQEAKIAl1OCByZXM0WzB4MjAwIC0gMHgwOTFdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX3Nsb3dfdDsKIAordHlwZWRlZiBzdHJ1Y3QgdWNjX21paV9tbmcgeworCXUzMiBtaWltY2ZnOwkJLyogTUlJIG1hbmFnZW1lbnQgY29uZmlndXJhdGlvbiByZWcgICAgKi8KKwl1MzIgbWlpbWNvbTsJCS8qIE1JSSBtYW5hZ2VtZW50IGNvbW1hbmQgcmVnICAgICAgICAgICovCisJdTMyIG1paW1hZGQ7CQkvKiBNSUkgbWFuYWdlbWVudCBhZGRyZXNzIHJlZyAgICAgICAgICAqLworCXUzMiBtaWltY29uOwkJLyogTUlJIG1hbmFnZW1lbnQgY29udHJvbCByZWcgICAgICAgICAgKi8KKwl1MzIgbWlpbXN0YXQ7CQkvKiBNSUkgbWFuYWdlbWVudCBzdGF0dXMgcmVnICAgICAgICAgICAqLworCXUzMiBtaWltaW5kOwkJLyogTUlJIG1hbmFnZW1lbnQgaW5kaWNhdGlvbiByZWcgICAgICAgKi8KKwl1MzIgaWZjdGw7CQkvKiBpbnRlcmZhY2UgY29udHJvbCByZWcgICAgICAgICAgICAgICAqLworCXUzMiBpZnN0YXQ7CQkvKiBpbnRlcmZhY2Ugc3RhdHV4IHJlZyAgICAgICAgICAgICAgICAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSl1ZWNfbWlpX3Q7CisKIHR5cGVkZWYgc3RydWN0IHVjY19ldGhlcm5ldCB7CiAJdTMyIG1hY2NmZzE7CQkvKiBtYWMgY29uZmlndXJhdGlvbiByZWcuIDEgICAgICAgICAgICAqLwogCXUzMiBtYWNjZmcyOwkJLyogbWFjIGNvbmZpZ3VyYXRpb24gcmVnLiAyICAgICAgICAgICAgKi8KQEAgLTU0MCwxNCArNTUxLDIxIEBACiAJdTggcmVzMTRbMHgzMDBdOwogCXU4IHJlczE1WzB4M0EwMF07CiAJdTggcmVzMTZbMHg4MDAwXTsJLyogMHgxMDgwMDAgLSAgMHgxMTAwMDAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NTY4KQorCXU4IG11cmFtWzB4MTAwMDBdOwkvKiAweDFfMDAwMCAtICAweDJfMDAwMCBNdWx0aS11c2VyIFJBTSAqLworCXU4IHJlczE3WzB4MjAwMDBdOwkvKiAweDJfMDAwMCAtICAweDRfMDAwMCAqLworI2Vsc2UKIAl1OCBtdXJhbVsweEMwMDBdOwkvKiAweDExMDAwMCAtICAweDExQzAwMCBNdWx0aS11c2VyIFJBTSAqLwogCXU4IHJlczE3WzB4MjQwMDBdOwkvKiAweDExQzAwMCAtICAweDE0MDAwMCAqLwogCXU4IHJlczE4WzB4QzAwMDBdOwkvKiAweDE0MDAwMCAtICAweDIwMDAwMCAqLworI2VuZGlmCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBxZV9tYXBfdDsKIAogZXh0ZXJuIHFlX21hcF90ICpxZV9pbW1yOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODM2MCkKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NTY4KQorI2RlZmluZSBRRV9NVVJBTV9TSVpFCQkweDEwMDAwVUwKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgzNjApCiAjZGVmaW5lIFFFX01VUkFNX1NJWkUJCTB4YzAwMFVMCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4MzJYKQogI2RlZmluZSBRRV9NVVJBTV9TSVpFCQkweDQwMDBVTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21tdS5oIGIvaW5jbHVkZS9hc20tcHBjL21tdS5oCmluZGV4IDQ4ZmQ5ODIuLmIzY2ZhOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbW11LmgKQEAgLTY0NSw2ICs2NDUsOSBAQAogdW5zaWduZWQgbG9uZyBtZnRsYjEodW5zaWduZWQgbG9uZyBpbmRleCk7CiB1bnNpZ25lZCBsb25nIG1mdGxiMih1bnNpZ25lZCBsb25nIGluZGV4KTsKIHVuc2lnbmVkIGxvbmcgbWZ0bGIzKHVuc2lnbmVkIGxvbmcgaW5kZXgpOworCit2b2lkIHByb2dyYW1fdGxiKHUzMiBwaHlzX2FkZHIsIHUzMiB2aXJ0X2FkZHIsIHUzMiBzaXplLCB1MzIgdGxiX3dvcmQyX2lfdmFsdWUpOwordm9pZCByZW1vdmVfdGxiKHUzMiB2YWRkciwgdTMyIHNpemUpOwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogQ09ORklHXzQ0MCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcHBjL3Byb2Nlc3Nvci5oCmluZGV4IDk3ODBmZTEuLjBhMTYwZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcHJvY2Vzc29yLmgKQEAgLTU4LDcgKzU4LDYgQEAKICNlbHNlCiAjZGVmaW5lIE1TUl9LRVJORUwJTVNSX01FCiAjZW5kaWYKLSNkZWZpbmUgTVNSX1VTRVIJTVNSX0tFUk5FTHxNU1JfUFJ8TVNSX0VFCiAKIC8qIEZsb2F0aW5nIFBvaW50IFN0YXR1cyBhbmQgQ29udHJvbCBSZWdpc3RlciAoRlBTQ1IpIEZpZWxkcyAqLwogCkBAIC0yMTgsMTIgKzIxNywxNCBAQAogI2RlZmluZSAgIEhJRDBfRFBNCSgxPDwyMCkKICNkZWZpbmUgICBISUQwX0lDRQkoMTw8SElEMF9JQ0VfU0hJRlQpCS8qIEluc3RydWN0aW9uIENhY2hlIEVuYWJsZSAqLwogI2RlZmluZSAgIEhJRDBfRENFCSgxPDxISUQwX0RDRV9TSElGVCkJLyogRGF0YSBDYWNoZSBFbmFibGUgKi8KKyNkZWZpbmUgICBISUQwX1RCRU4JKDE8PDE0KQkJLyogVGltZSBCYXNlIEVuYWJsZSAqLwogI2RlZmluZSAgIEhJRDBfSUxPQ0sJKDE8PDEzKQkJLyogSW5zdHJ1Y3Rpb24gQ2FjaGUgTG9jayAqLwogI2RlZmluZSAgIEhJRDBfRExPQ0sJKDE8PEhJRDBfRExPQ0tfU0hJRlQpCS8qIERhdGEgQ2FjaGUgTG9jayAqLwogI2RlZmluZSAgIEhJRDBfSUNGSQkoMTw8MTEpCQkvKiBJbnN0ci4gQ2FjaGUgRmxhc2ggSW52YWxpZGF0ZSAqLwogI2RlZmluZSAgIEhJRDBfRENGSQkoMTw8MTApCQkvKiBEYXRhIENhY2hlIEZsYXNoIEludmFsaWRhdGUgKi8KICNkZWZpbmUgICBISUQwX0RDSQlISUQwX0RDRkkKICNkZWZpbmUgICBISUQwX1NQRAkoMTw8OSkJCS8qIFNwZWN1bGF0aXZlIGRpc2FibGUgKi8KKyNkZWZpbmUgICBISUQwX0VOTUFTNwkoMTw8NykJCS8qIEVuYWJsZSBNQVM3IFVwZGF0ZSBmb3IgMzYtYml0IHBoeXMgKi8KICNkZWZpbmUgICBISUQwX1NHRQkoMTw8NykJCS8qIFN0b3JlIEdhdGhlcmluZyBFbmFibGUgKi8KICNkZWZpbmUgICBISUQwX1NJRUQJSElEX1NHRQkJLyogU2VyaWFsIEluc3RyLiBFeGVjdXRpb24gW0Rpc2FibGVdICovCiAjZGVmaW5lICAgSElEMF9EQ0ZBCSgxPDw2KQkJLyogRGF0YSBDYWNoZSBGbHVzaCBBc3Npc3QgKi8KQEAgLTQ1MSw2ICs0NTIsNyBAQAogI2RlZmluZSBTUFJOX1BJRDEgICAgICAgMHgyNzkgICAvKiBQcm9jZXNzIElEIFJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgU1BSTl9QSUQyICAgICAgIDB4MjdhICAgLyogUHJvY2VzcyBJRCBSZWdpc3RlciAyICovCiAjZGVmaW5lIFNQUk5fTUNTUgkweDIzYwkvKiBNYWNoaW5lIENoZWNrIFN5bmRyb21lIHJlZ2lzdGVyICovCisjZGVmaW5lIFNQUk5fTUNBUgkweDIzZAkvKiBNYWNoaW5lIENoZWNrIEFkZHJlc3MgcmVnaXN0ZXIgKi8KICNpZmRlZiBDT05GSUdfNDQwCiAjZGVmaW5lIE1DU1JfTUNTCTB4ODAwMDAwMDAJLyogTWFjaGluZSBDaGVjayBTdW1tYXJ5ICovCiAjZGVmaW5lIE1DU1JfSUIJCTB4NDAwMDAwMDAJLyogSW5zdHJ1Y3Rpb24gUExCIEVycm9yICovCkBAIC00NjUsNyArNDY3LDggQEAKICNkZWZpbmUgRVNSX1NUICAgICAgICAgIDB4MDA4MDAwMDAgICAgICAvKiBTdG9yZSBPcGVyYXRpb24gKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX01QQzg2eHgpCi0jZGVmaW5lIFNQUk5fTVNTQ1JPCTB4M2Y2CisjZGVmaW5lIFNQUk5fTVNTQ1IwCTB4M2Y2CisjZGVmaW5lIFNQUk5fTVNTU1IwCTB4M2Y3CiAjZW5kaWYKIAogCkBAIC01MzIsNyArNTM1LDcgQEAKICNkZWZpbmUgTFIJU1BSTl9MUgogI2RlZmluZSBNQkFSICAgIFNQUk5fTUJBUiAgICAgICAvKiBTeXN0ZW0gbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwogI2lmIGRlZmluZWQoQ09ORklHX01QQzg2eHgpCi0jZGVmaW5lIE1TU0NSMAlTUFJOX01TU0NSTworI2RlZmluZSBNU1NDUjAJU1BSTl9NU1NDUjAKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0U1MDApIHx8IGRlZmluZWQoQ09ORklHX01QQzg2eHgpCiAjZGVmaW5lIFBJUglTUFJOX1BJUgpAQCAtNjI4LDYgKzYzMSwxMiBAQAogI2RlZmluZSBNQVM2CVNQUk5fTUFTNgogI2RlZmluZSBNQVM3CVNQUk5fTUFTNwogCisjaWYgZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR180NHgpIHx8IGRlZmluZWQoQ09ORklHX01QQzg1eHgpCisjZGVmaW5lIERBUl9ERUFSIERFQVIKKyNlbHNlCisjZGVmaW5lIERBUl9ERUFSIERBUgorI2VuZGlmCisKIC8qIERldmljZSBDb250cm9sIFJlZ2lzdGVycyAqLwogCiAjZGVmaW5lIERDUk5fQkVBUgkweDA5MAkvKiBCdXMgRXJyb3IgQWRkcmVzcyBSZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hdDQ1LmggYi9pbmNsdWRlL2F0NDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGJiNGEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hdDQ1LmgKQEAgLTAsMCArMSw2OSBAQAorCisjaWZuZGVmCV9BVDQ1X0hfCisjZGVmaW5lCV9BVDQ1X0hfCisjaWZkZWYJREFUQUZMQVNIX01NQ19TRUxFQ1QKK2V4dGVybgl2b2lkIEFUOTFGX1NlbGVjdE1NQyh2b2lkKTsKK2V4dGVybgl2b2lkIEFUOTFGX1NlbGVjdFNQSSh2b2lkKTsKK2V4dGVybglpbnQgQVQ5MUZfR2V0TXV4U3RhdHVzKHZvaWQpOworI2VuZGlmCitleHRlcm4Jdm9pZCBBVDkxRl9TcGlJbml0KHZvaWQpOworZXh0ZXJuCXZvaWQgQVQ5MUZfU3BpRW5hYmxlKGludCBjcyk7CitleHRlcm4JdW5zaWduZWQgaW50IEFUOTFGX1NwaVdyaXRlICggQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MgKTsKK2V4dGVybglBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoU2VuZENvbW1hbmQoCisJCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKKwkJdW5zaWduZWQgY2hhciBPcENvZGUsCisJCXVuc2lnbmVkIGludCBDbWRTaXplLAorCQl1bnNpZ25lZCBpbnQgRGF0YWZsYXNoQWRkcmVzcyk7CitleHRlcm4JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX0RhdGFGbGFzaEdldFN0YXR1cyAoCisJQVQ5MVBTX0RhdGFmbGFzaERlc2MgcERlc2MpOworZXh0ZXJuCUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hXYWl0UmVhZHkgKAorCUFUOTFQU19EYXRhZmxhc2hEZXNjIHBEYXRhRmxhc2hEZXNjLAorCXVuc2lnbmVkIGludCB0aW1lb3V0KTsKK2V4dGVybglBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoQ29udGludW91c1JlYWQgKAorCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKKwlpbnQgc3JjLAorCXVuc2lnbmVkIGNoYXIgKmRhdGFCdWZmZXIsCisJaW50IHNpemVUb1JlYWQgKTsKK2V4dGVybglBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoUGFnZVBnbUJ1ZigKKwlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCisJdW5zaWduZWQgY2hhciAqc3JjLAorCXVuc2lnbmVkIGludCBkZXN0LAorCXVuc2lnbmVkIGludCBTaXplVG9Xcml0ZSk7CitleHRlcm4JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX01haW5NZW1vcnlUb0J1ZmZlclRyYW5zZmVydCgKKwlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCisJdW5zaWduZWQgY2hhciBCdWZmZXJDb21tYW5kLAorCXVuc2lnbmVkIGludCBwYWdlKTsKK2V4dGVybglBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfRGF0YUZsYXNoV3JpdGVCdWZmZXIgKAorCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKKwl1bnNpZ25lZCBjaGFyIEJ1ZmZlckNvbW1hbmQsCisJdW5zaWduZWQgY2hhciAqZGF0YUJ1ZmZlciwKKwl1bnNpZ25lZCBpbnQgYnVmZmVyQWRkcmVzcywKKwlpbnQgU2l6ZVRvV3JpdGUgKTsKK2V4dGVybglBVDkxU19EYXRhRmxhc2hTdGF0dXMgQVQ5MUZfUGFnZUVyYXNlKAorCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKKwl1bnNpZ25lZCBpbnQgcGFnZSk7CitleHRlcm4JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX0Jsb2NrRXJhc2UoCisJQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAorCXVuc2lnbmVkIGludCBibG9jayk7CitleHRlcm4JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX1dyaXRlQnVmZmVyVG9NYWluICgKKwlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCisJdW5zaWduZWQgY2hhciBCdWZmZXJDb21tYW5kLAorCXVuc2lnbmVkIGludCBkZXN0ICk7CitleHRlcm4JQVQ5MVNfRGF0YUZsYXNoU3RhdHVzIEFUOTFGX1BhcnRpYWxQYWdlV3JpdGUgKAorCUFUOTFQU19EYXRhRmxhc2ggcERhdGFGbGFzaCwKKwl1bnNpZ25lZCBjaGFyICpzcmMsCisJdW5zaWduZWQgaW50IGRlc3QsCisJdW5zaWduZWQgaW50IHNpemUpOworZXh0ZXJuCUFUOTFTX0RhdGFGbGFzaFN0YXR1cyBBVDkxRl9EYXRhRmxhc2hXcml0ZSgKKwlBVDkxUFNfRGF0YUZsYXNoIHBEYXRhRmxhc2gsCisJdW5zaWduZWQgY2hhciAqc3JjLAorCWludCBkZXN0LAorCWludCBzaXplICk7CitleHRlcm4JaW50IEFUOTFGX0RhdGFGbGFzaFJlYWQoCisJQVQ5MVBTX0RhdGFGbGFzaCBwRGF0YUZsYXNoLAorCXVuc2lnbmVkIGxvbmcgYWRkciwKKwl1bnNpZ25lZCBsb25nIHNpemUsCisJY2hhciAqYnVmZmVyKTsKK2V4dGVybglpbnQgQVQ5MUZfRGF0YWZsYXNoUHJvYmUoaW50IGNzLCBBVDkxUFNfRGF0YWZsYXNoRGVzYyBwRGVzYyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbWRfY29uZmRlZnMuaCBiL2luY2x1ZGUvY21kX2NvbmZkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzY2NkY2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jbWRfY29uZmRlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotLyoKLSAqIERlZmluaXRpb25zIGZvciBDb25maWd1cmluZyB0aGUgbW9uaXRvciBjb21tYW5kcwotICovCi0jaWZuZGVmIF9DTURfQ09ORklHX0gKLSNkZWZpbmUgX0NNRF9DT05GSUdfSAotCi0vKgotICogQ29uZmlndXJhYmxlIG1vbml0b3IgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDRkdfQ01EX0JESQkJMHgwMDAwMDAwMVVMTAkvKiBiZGluZm8JCQkqLwotI2RlZmluZSBDRkdfQ01EX0xPQURTCQkweDAwMDAwMDAyVUxMCS8qIGxvYWRzCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9MT0FEQgkJMHgwMDAwMDAwNFVMTAkvKiBsb2FkYgkJCSovCi0jZGVmaW5lIENGR19DTURfSU1JCQkweDAwMDAwMDA4VUxMCS8qIGltaW5mbwkJCSovCi0jZGVmaW5lIENGR19DTURfQ0FDSEUJCTB4MDAwMDAwMTBVTEwJLyogaWNhY2hlLCBkY2FjaGUJCSovCi0jZGVmaW5lIENGR19DTURfRkxBU0gJCTB4MDAwMDAwMjBVTEwJLyogZmxpbmZvLCBlcmFzZSwgcHJvdGVjdAkqLwotI2RlZmluZSBDRkdfQ01EX01FTU9SWQkJMHgwMDAwMDA0MFVMTAkvKiBtZCwgbW0sIG5tLCBtdywgY3AsIGNtcCwJKi8KLQkJCQkJCS8qIGNyYywgYmFzZSwgbG9vcCwgbXRlc3QJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9ORVQJCTB4MDAwMDAwODBVTEwJLyogYm9vdHAsIHRmdHBib290LCByYXJwYm9vdAkqLwotI2RlZmluZSBDRkdfQ01EX0VOVgkJMHgwMDAwMDEwMFVMTAkvKiBzYXZlZW52CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9LR0RCCQkweDAwMDAwMDAwMDAwMDAyMDBVTEwJLyoga2dkYgkJCQkqLwotI2RlZmluZSBDRkdfQ01EX1BDTUNJQQkJMHgwMDAwMDQwMFVMTAkvKiBQQ01DSUEgc3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JREUJCTB4MDAwMDA4MDBVTEwJLyogSURFIGhhcmRkaXNrIHN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfUENJCQkweDAwMDAxMDAwVUxMCS8qIHBjaWluZm8JCQkqLwotI2RlZmluZSBDRkdfQ01EX0lSUQkJMHgwMDAwMjAwMFVMTAkvKiBpcnFpbmZvCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9CT09URAkJMHgwMDAwNDAwMFVMTAkvKiBib290ZAkJCSovCi0jZGVmaW5lIENGR19DTURfQ09OU09MRQkJMHgwMDAwODAwMFVMTAkvKiBjb25pbmZvCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9FRVBST00JCTB4MDAwMTAwMDBVTEwJLyogRUVQUk9NIHJlYWQvd3JpdGUgc3VwcG9ydAkqLwotI2RlZmluZSBDRkdfQ01EX0FTS0VOVgkJMHgwMDAyMDAwMFVMTAkvKiBhc2sgZm9yIGVudiB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9SVU4JCTB4MDAwNDAwMDBVTEwJLyogcnVuIGNvbW1hbmQgaW4gZW52IHZhcmlhYmxlCSovCi0jZGVmaW5lIENGR19DTURfRUNITwkJMHgwMDA4MDAwMFVMTAkvKiBlY2hvIGFyZ3VtZW50cwkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JMkMJCTB4MDAxMDAwMDBVTEwJLyogSTJDIHNlcmlhbCBidXMgc3VwcG9ydAkqLwotI2RlZmluZSBDRkdfQ01EX1JFR0lORk8JCTB4MDAyMDAwMDBVTEwJLyogUmVnaXN0ZXIgZHVtcAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JTU1BUAkJMHgwMDQwMDAwMFVMTAkvKiBJTU1SIGR1bXAgc3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9EQVRFCQkweDAwODAwMDAwVUxMCS8qIHN1cHBvcnQgZm9yIFJUQywgZGF0ZS90aW1lLi4uKi8KLSNkZWZpbmUgQ0ZHX0NNRF9ESENQCQkweDAxMDAwMDAwVUxMCS8qIERIQ1AgU3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfQkVEQlVHCQkweDAyMDAwMDAwVUxMCS8qIEluY2x1ZGUgQmVkQnVnIERlYnVnZ2VyCSovCi0jZGVmaW5lIENGR19DTURfRkRDCQkweDA0MDAwMDAwVUxMCS8qIEZsb3BweSBEaXNrIFN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfU0NTSQkJMHgwODAwMDAwMFVMTAkvKiBTQ1NJIFN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX0FVVE9TQ1JJUFQJMHgxMDAwMDAwMFVMTAkvKiBBdXRvc2NyaXB0IFN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfTUlJCQkweDIwMDAwMDAwVUxMCS8qIE1JSSBzdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9TRVRHRVREQ1IJMHg0MDAwMDAwMFVMTAkvKiBEQ1Igc3VwcG9ydCBvbiA0eHgJCSovCi0jZGVmaW5lIENGR19DTURfQlNQCQkweDgwMDAwMDAwVUxMCS8qIEJvYXJkIFNwZWNpZmljIGZ1bmN0aW9ucwkqLwotCi0jZGVmaW5lIENGR19DTURfRUxGCTB4MDAwMDAwMDEwMDAwMDAwMFVMTAkvKiBFTEYgKFZ4V29ya3MpIGxvYWQvYm9vdCBjbWQJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9NSVNDCTB4MDAwMDAwMDIwMDAwMDAwMFVMTAkvKiBNaXNjIGZ1bmN0aW9ucyBsaWtlIHNsZWVwIGV0YyovCi0jZGVmaW5lIENGR19DTURfVVNCCTB4MDAwMDAwMDQwMDAwMDAwMFVMTAkvKiBVU0IgU3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfRE9DCTB4MDAwMDAwMDgwMDAwMDAwMFVMTAkvKiBEaXNrLU9uLUNoaXAgU3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9KRkZTMgkweDAwMDAwMDEwMDAwMDAwMDBVTEwJLyogSkZGUzIgU3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9EVFQJMHgwMDAwMDAyMDAwMDAwMDAwVUxMCS8qIERpZ2l0YWwgVGhlcm0gYW5kIFRoZXJtb3N0YXQgKi8KLSNkZWZpbmUgQ0ZHX0NNRF9TRFJBTQkweDAwMDAwMDQwMDAwMDAwMDBVTEwJLyogU0RSQU0gRElNTSBTUEQgaW5mbyBwcmludG91dCAqLwotI2RlZmluZSBDRkdfQ01EX0RJQUcJMHgwMDAwMDA4MDAwMDAwMDAwVUxMCS8qIERpYWdub3N0aWNzCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9GUEdBCTB4MDAwMDAxMDAwMDAwMDAwMFVMTAkvKiBGUEdBIGNvbmZpZ3VyYXRpb24gU3VwcG9ydAkqLwotI2RlZmluZSBDRkdfQ01EX0hXRkxPVwkweDAwMDAwMjAwMDAwMDAwMDBVTEwJLyogUlRTL0NUUyBodyBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9TQVZFUwkweDAwMDAwNDAwMDAwMDAwMDBVTEwJLyogc2F2ZSBTIHJlY29yZCBkdW1wCQkqLwotI2RlZmluZSBDRkdfQ01EX1NQSQkweDAwMDAxMDAwMDAwMDAwMDBVTEwJLyogU1BJIHV0aWxpdHkJCQkqLwotI2RlZmluZSBDRkdfQ01EX0ZET1MJMHgwMDAwMjAwMDAwMDAwMDAwVUxMCS8qIEZsb3BweSBET1Mgc3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9WRkQJMHgwMDAwNDAwMDAwMDAwMDAwVUxMCS8qIFZGRCBzdXBwb3J0IChUUkFCKQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9OQU5ECTB4MDAwMDgwMDAwMDAwMDAwMFVMTAkvKiBOQU5EIHN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX0JNUAkweDAwMDEwMDAwMDAwMDAwMDBVTEwJLyogQk1QIHN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX1BPUlRJTwkweDAwMDIwMDAwMDAwMDAwMDBVTEwJLyogUG9ydCBJL08JCQkqLwotI2RlZmluZSBDRkdfQ01EX1BJTkcJMHgwMDA0MDAwMDAwMDAwMDAwVUxMCS8qIHBpbmcgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfTU1DCTB4MDAwODAwMDAwMDAwMDAwMFVMTAkvKiBNTUMgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfRkFUCTB4MDAxMDAwMDAwMDAwMDAwMFVMTAkvKiBGQVQgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfSU1MUwkweDAwMjAwMDAwMDAwMDAwMDBVTEwJLyogTGlzdCBhbGwgZm91bmQgaW1hZ2VzCSovCi0jZGVmaW5lIENGR19DTURfSVRFU1QJMHgwMDQwMDAwMDAwMDAwMDAwVUxMCS8qIEludGVnZXIgKGFuZCBzdHJpbmcpIHRlc3QJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9ORlMJMHgwMDgwMDAwMDAwMDAwMDAwVUxMCS8qIE5GUyBzdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9SRUlTRVIJMHgwMTAwMDAwMDAwMDAwMDAwVUxMCS8qIFJlaXNlcmZzIHN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfQ0RQCTB4MDIwMDAwMDAwMDAwMDAwMFVMTAkvKiBDaXNjbyBEaXNjb3ZlcnkgUHJvdG9jb2wgCSovCi0jZGVmaW5lIENGR19DTURfWElNRwkweDA0MDAwMDAwMDAwMDAwMDBVTEwJLyogTG9hZCBwYXJ0IG9mIE11bHRpIEltYWdlCSovCi0jZGVmaW5lIENGR19DTURfVU5JVkVSU0UgMHgwODAwMDAwMDAwMDAwMDAwVUxMCS8qIFR1bmRyYSBVbml2ZXJzZSBTdXBwb3J0ICAgICAgKi8KLSNkZWZpbmUgQ0ZHX0NNRF9FWFQyCTB4MTAwMDAwMDAwMDAwMDAwMFVMTAkvKiBFWFQyIFN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX1NOVFAJMHgyMDAwMDAwMDAwMDAwMDAwVUxMCS8qIFNOVFAgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfRElTUExBWQkweDQwMDAwMDAwMDAwMDAwMDBVTEwJLyogRGlzcGxheSBzdXBwb3J0CQkqLwotI2RlZmluZSBDRkdfQ01EX01GU0wJMHg4MDAwMDAwMDAwMDAwMDAwVUxMCS8qIEZTTCBzdXBwb3J0IGZvciBNaWNyb2JsYXplCSovCi0KLSNkZWZpbmUgQ0ZHX0NNRF9BTEwJMHhGRkZGRkZGRkZGRkZGRkZGVUxMCS8qIEFMTCBjb21tYW5kcwkJCSovCi0KLS8qIENvbW1hbmRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgIm5vbi1zdGFuZGFyZCIgZm9yIHNvbWUgcmVhc29uCi0gKiAobWVtb3J5IGhvZ3MsIHJlcXVpcmVzIHNwZWNpYWwgaGFyZHdhcmUsIG5vdCBmdWxseSB0ZXN0ZWQsIGV0Yy4pCi0gKi8KLSNkZWZpbmUgQ0ZHX0NNRF9OT05TVEQgKENGR19DTURfQVNLRU5WCXwgXAotCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQlDRkdfQ01EX0JNUAl8IFwKLQkJCUNGR19DTURfQlNQCXwgXAotCQkJQ0ZHX0NNRF9DQUNIRQl8IFwKLQkJCUNGR19DTURfQ0RQCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJQ0ZHX0NNRF9ESVNQTEFZCXwgXAotCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQlDRkdfQ01EX0RUVAl8IFwKLQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQlDRkdfQ01EX0ZEQwl8IFwKLQkJCUNGR19DTURfRkFUCXwgXAotCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJQ0ZHX0NNRF9IV0ZMT1cJfCBcCi0JCQlDRkdfQ01EX0kyQwl8IFwKLQkJCUNGR19DTURfSURFCXwgXAotCQkJQ0ZHX0NNRF9JTU1BUAl8IFwKLQkJCUNGR19DTURfSVJRCXwgXAotCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCUNGR19DTURfS0dEQgl8IFwKLQkJCUNGR19DTURfTUZTTAl8IFwKLQkJCUNGR19DTURfTUlJCXwgXAotCQkJQ0ZHX0NNRF9NTUMJfCBcCi0JCQlDRkdfQ01EX05BTkQJfCBcCi0JCQlDRkdfQ01EX1BDSQl8IFwKLQkJCUNGR19DTURfUENNQ0lBCXwgXAotCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJQ0ZHX0NNRF9QT1JUSU8JfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQlDRkdfQ01EX1JFSVNFUgl8IFwKLQkJCUNGR19DTURfU0FWRVMJfCBcCi0JCQlDRkdfQ01EX1NDU0kJfCBcCi0JCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQlDRkdfQ01EX1VOSVZFUlNFIHwgXAotCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQlDRkdfQ01EX1ZGRAkpCi0KLS8qIERlZmF1bHQgY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENPTkZJR19DTURfREZMCShDRkdfQ01EX0FMTCAmIH5DRkdfQ01EX05PTlNURCkKLQotI2lmbmRlZiBDT05GSUdfQ09NTUFORFMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIENPTkZJR19DTURfREZMCi0jZW5kaWYKLQotCi0vKgotICogb3B0aW9uYWwgQk9PVFAgZmllbGRzCi0gKi8KLQotI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSwkJMHgwMDAwMDAwMQotI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQkJMHgwMDAwMDAwMgotI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUJCTB4MDAwMDAwMDQKLSNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgkJMHgwMDAwMDAwOAotI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgJCTB4MDAwMDAwMTAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQkweDAwMDAwMDIwCi0jZGVmaW5lIENPTkZJR19CT09UUF9ETlMJCTB4MDAwMDAwNDAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIJCTB4MDAwMDAwODAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUJMHgwMDAwMDEwMAotI2RlZmluZSBDT05GSUdfQk9PVFBfTlRQU0VSVkVSCQkweDAwMDAwMjAwCi0jZGVmaW5lIENPTkZJR19CT09UUF9USU1FT0ZGU0VUCQkweDAwMDAwNDAwCi0KLSNkZWZpbmUgQ09ORklHX0JPT1RQX1ZFTkRPUkVYCQkweDgwMDAwMDAwCi0KLSNkZWZpbmUgQ09ORklHX0JPT1RQX0FMTAkJKH5DT05GSUdfQk9PVFBfVkVORE9SRVgpCi0KLQotI2RlZmluZSBDT05GSUdfQk9PVFBfREVGQVVMVAkJKENPTkZJR19CT09UUF9TVUJORVRNQVNLIHwgXAotCQkJCQlDT05GSUdfQk9PVFBfR0FURVdBWQkgfCBcCi0JCQkJCUNPTkZJR19CT09UUF9IT1NUTkFNRQkgfCBcCi0JCQkJCUNPTkZJR19CT09UUF9CT09UUEFUSCkKLQotI2lmbmRlZiBDT05GSUdfQk9PVFBfTUFTSwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJQ09ORklHX0JPT1RQX0RFRkFVTFQKLSNlbmRpZgotCi0jZW5kaWYJLyogX0NNRF9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tYW5kLmggYi9pbmNsdWRlL2NvbW1hbmQuaAppbmRleCBhMjkzNmFkLi4wNTk3YzEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1hbmQuaAorKysgYi9pbmNsdWRlL2NvbW1hbmQuaApAQCAtODQsMTIgKzg0LDYgQEAKICNkZWZpbmUgQ01EX0ZMQUdfUkVQRUFUCQkweDAwMDEJLyogcmVwZWF0IGxhc3QgY29tbWFuZAkJKi8KICNkZWZpbmUgQ01EX0ZMQUdfQk9PVEQJCTB4MDAwMgkvKiBjb21tYW5kIGlzIGZyb20gYm9vdGQJKi8KIAotLyoKLSAqIENvbmZpZ3VyYWJsZSBtb25pdG9yIGNvbW1hbmRzIGRlZmluaXRpb25zIGhhdmUgYmVlbiBtb3ZlZAotICogdG8gaW5jbHVkZS9jbWRfY29uZmRlZnMuaAotICovCi0KLQogI2RlZmluZSBTdHJ1Y3RfU2VjdGlvbiAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCxzZWN0aW9uICgiLnVfYm9vdF9jbWQiKSkpCiAKICNpZmRlZiAgQ0ZHX0xPTkdIRUxQCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1vbi5oIGIvaW5jbHVkZS9jb21tb24uaAppbmRleCBkOGI2YjQ2Li4yN2E2NjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvY29tbW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDQKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA3CiAgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgogICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCkBAIC02MywxMCArNjMsMTkgQEAKICNlbmRpZgogI2VsaWYgZGVmaW5lZChDT05GSUdfNXh4KQogI2luY2x1ZGUgPGFzbS81eHhfaW1tYXAuaD4KKyNkZWZpbmUgQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM1eHh4KQogI2luY2x1ZGUgPG1wYzV4eHguaD4KKyNkZWZpbmUgQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTCisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM1MTJYKQorI2luY2x1ZGUgPG1wYzUxMnguaD4KKyNpbmNsdWRlIDxhc20vaW1tYXBfNTEyeC5oPgorI2RlZmluZSBDT05GSUdfUkVMT0NfRklYVVBfV09SS1MKICNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgyMjApCiAjaW5jbHVkZSA8YXNtL2ltbWFwXzgyMjAuaD4KKyNkZWZpbmUgQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTCisjZWxpZiBkZWZpbmVkKENPTkZJR184MjRYKQorI2RlZmluZSBDT05GSUdfUkVMT0NfRklYVVBfV09SS1MKICNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCiAjaWYgICBkZWZpbmVkKENPTkZJR19NUEM4MjQ3KSBcCiAgICB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjQ4KSBcCkBAIC03OCw2ICs4Nyw3IEBACiAjZGVmaW5lIENPTkZJR19NUEM4MjYwCTEKICNlbmRpZgogI2luY2x1ZGUgPGFzbS9pbW1hcF84MjYwLmg+CisjZGVmaW5lIENPTkZJR19SRUxPQ19GSVhVUF9XT1JLUwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX01QQzg2eHgKICNpbmNsdWRlIDxtcGM4Nnh4Lmg+CkBAIC05MCw2ICsxMDAsNyBAQAogI2lmZGVmIENPTkZJR19NUEM4M1hYCiAjaW5jbHVkZSA8bXBjODN4eC5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF84M3h4Lmg+CisjZGVmaW5lIENPTkZJR19SRUxPQ19GSVhVUF9XT1JLUwogI2VuZGlmCiAjaWZkZWYJQ09ORklHXzR4eAogI2luY2x1ZGUgPHBwYzR4eC5oPgpAQCAtMjMwLDYgKzI0MSw5IEBACiB2b2lkIGlubGluZSBzZXRlbnYgICAoY2hhciAqLCBjaGFyICopOwogI2Vsc2UKIHZvaWQJc2V0ZW52CSAgICAgKGNoYXIgKiwgY2hhciAqKTsKKyNpZmRlZiBDT05GSUdfSEFTX1VJRAordm9pZAlmb3JjZWVudiAgICAgKGNoYXIgKiwgY2hhciAqKTsKKyNlbmRpZgogI2VuZGlmIC8qIENPTkZJR19QUEMgKi8KICNpZmRlZiBDT05GSUdfQVJNCiAjIGluY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC00NDgsNiArNDYyLDkgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX01QQzV4eHgpCiBpbnQJcHJ0X21wYzV4eHhfY2xrcyAodm9pZCk7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM1MTJ4KQoraW50CXBydF9tcGM1MTJ4eHhfY2xrcyAodm9pZCk7CisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjIwKQogaW50CXBydF9tcGM4MjIwX2Nsa3MgKHZvaWQpOwogI2VuZGlmCkBAIC01MTIsNiArNTI5LDggQEAKIGludAljcHVfaW5pdF9yICAgICh2b2lkKTsKICNpZiBkZWZpbmVkKENPTkZJR184MjYwKQogaW50CXBydF84MjYwX3JzciAgKHZvaWQpOworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODNYWCkKK2ludAlwcnRfODN4eF9yc3IgICh2b2lkKTsKICNlbmRpZgogCiAvKiAkKENQVSkvaW50ZXJydXB0cy5jICovCkBAIC02MjYsOSArNjQ1LDEzIEBACiAKIGludAlwY21jaWFfaW5pdCAodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCi12b2lkCXNob3dfYm9vdF9wcm9ncmVzcyAoaW50IHN0YXR1cyk7CisjaWZkZWYgQ09ORklHX1NUQVRVU19MRUQKKyMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2VuZGlmCisvKgorICogQm9hcmQtc3BlY2lmaWMgUGxhdGZvcm0gY29kZSBjYW4gcmVpbXBsZW1lbnQgc2hvd19ib290X3Byb2dyZXNzICgpIGlmIG5lZWRlZAorICovCit2b2lkIGlubGluZSBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCB2YWwpOwogCiAjaWZkZWYgQ09ORklHX0lOSVRfQ1JJVElDQUwKICNlcnJvciBDT05GSUdfSU5JVF9DUklUSUNBTCBpcyBkZXByZWNhdGVkIQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdfY21kX2FsbC5oIGIvaW5jbHVkZS9jb25maWdfY21kX2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTFlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ19jbWRfYWxsLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIFZlcnNpb24gMi4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9DT05GSUdfQ01EX0FMTF9ICisjZGVmaW5lIF9DT05GSUdfQ01EX0FMTF9ICisKKy8qCisgKiBBbHBoYWJldGljYWwgbGlzdCBvZiBhbGwgcG9zc2libGUgY29tbWFuZHMuCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgkvKiBhc2sgZm9yIGVudiB2YXJpYWJsZQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCS8qIEF1dG9zY3JpcHQgU3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkJICAgICAgIAkvKiBiZGluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRwkvKiBJbmNsdWRlIEJlZEJ1ZyBEZWJ1Z2dlcgkqLworI2RlZmluZSBDT05GSUdfQ01EX0JNUAkJLyogQk1QIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECS8qIGJvb3RkCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AJCS8qIEJvYXJkIFNwZWNpZmljIGZ1bmN0aW9ucwkqLworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCS8qIGljYWNoZSwgZGNhY2hlCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0NEUAkJLyogQ2lzY28gRGlzY292ZXJ5IFByb3RvY29sIAkqLworI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUJLyogY29uaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfREFURQkJLyogc3VwcG9ydCBmb3IgUlRDLCBkYXRlL3RpbWUuLi4qLworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AJCS8qIERIQ1AgU3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfRElBRwkJLyogRGlhZ25vc3RpY3MJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0RJU1BMQVkJLyogRGlzcGxheSBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX0RPQwkJLyogRGlzay1Pbi1DaGlwIFN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfRFRUCQkvKiBEaWdpdGFsIFRoZXJtIGFuZCBUaGVybW9zdGF0ICovCisjZGVmaW5lIENPTkZJR19DTURfRUNITwkJLyogZWNobyBhcmd1bWVudHMJCSovCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCS8qIEVFUFJPTSByZWFkL3dyaXRlIHN1cHBvcnQJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYJCS8qIEVMRiAoVnhXb3JrcykgbG9hZC9ib290IGNtZAkqLworI2RlZmluZSBDT05GSUdfQ01EX0VOVgkJLyogc2F2ZWVudgkJCSovCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgkJLyogRVhUMiBTdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQJCS8qIEZBVCBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9GREMJCS8qIEZsb3BweSBEaXNrIFN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfRkRPUwkJLyogRmxvcHB5IERPUyBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICS8qIGZsaW5mbywgZXJhc2UsIHByb3RlY3QJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9GUEdBCQkvKiBGUEdBIGNvbmZpZ3VyYXRpb24gU3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfQ01EX0hXRkxPVwkvKiBSVFMvQ1RTIGh3IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBDT05GSUdfQ01EX0kyQwkJLyogSTJDIHNlcmlhbCBidXMgc3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfQ01EX0lERQkJLyogSURFIGhhcmRkaXNrIHN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfSU1JCQkvKiBpbWluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0lNTFMJCS8qIExpc3QgYWxsIGZvdW5kIGltYWdlcwkqLworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCS8qIElNTVIgZHVtcCBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX0lSUQkJLyogaXJxaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfSVRFU1QJLyogSW50ZWdlciAoYW5kIHN0cmluZykgdGVzdAkqLworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCS8qIEpGRlMyIFN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfS0dEQgkJLyoga2dkYgkJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCS8qIGxvYWRiCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUwkvKiBsb2FkcwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCS8qIG1kIG1tIG5tIG13IGNwIGNtcCBjcmMgYmFzZSBsb29wIG10ZXN0ICovCisjZGVmaW5lIENPTkZJR19DTURfTUZTTAkJLyogRlNMIHN1cHBvcnQgZm9yIE1pY3JvYmxhemUJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkJCS8qIE1JSSBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCQkvKiBNaXNjIGZ1bmN0aW9ucyBsaWtlIHNsZWVwIGV0YyovCisjZGVmaW5lIENPTkZJR19DTURfTU1DCQkvKiBNTUMgc3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfTkFORAkJLyogTkFORCBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQJCS8qIGJvb3RwLCB0ZnRwYm9vdCwgcmFycGJvb3QJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMJCS8qIE5GUyBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kJCS8qIHBjaWluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQkvKiBQQ01DSUEgc3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCQkvKiBwaW5nIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1BPUlRJTwkvKiBQb3J0IEkvTwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTwkvKiBSZWdpc3RlciBkdW1wCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1JFSVNFUgkvKiBSZWlzZXJmcyBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX1JVTgkJLyogcnVuIGNvbW1hbmQgaW4gZW52IHZhcmlhYmxlCSovCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMJLyogc2F2ZSBTIHJlY29yZCBkdW1wCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1NDU0kJCS8qIFNDU0kgU3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0JLyogU0RSQU0gRElNTSBTUEQgaW5mbyBwcmludG91dCAqLworI2RlZmluZSBDT05GSUdfQ01EX1NFVEdFVERDUgkvKiBEQ1Igc3VwcG9ydCBvbiA0eHgJCSovCisjZGVmaW5lIENPTkZJR19DTURfU05UUAkJLyogU05UUCBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9TUEkJCS8qIFNQSSB1dGlsaXR5CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9VTklWRVJTRQkvKiBUdW5kcmEgVW5pdmVyc2UgU3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfQ01EX1VTQgkJLyogVVNCIFN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1ZGRAkJLyogVkZEIHN1cHBvcnQgKFRSQUIpCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1hJTUcJCS8qIExvYWQgcGFydCBvZiBNdWx0aSBJbWFnZQkqLworI2RlZmluZSBDT05GSUdfQ01EX01VWAkJLyogQVQ5MSBNTUMvU1BJIE11eCBTdXBwb3J0ICAgICAqLworCisjZW5kaWYJLyogX0NPTkZJR19DTURfQUxMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlnX2NtZF9kZWZhdWx0LmggYi9pbmNsdWRlL2NvbmZpZ19jbWRfZGVmYXVsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWNmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ19jbWRfZGVmYXVsdC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBWZXJzaW9uIDIuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfQ09ORklHX0NNRF9ERUZBVUxUX0gKKyNkZWZpbmUgX0NPTkZJR19DTURfREVGQVVMVF9ICisKKy8qCisgKiBBbHBoYWJldGljYWwgbGlzdCBvZiBhbGwgY29tbWFuZHMgdGhhdCBhcmUgY29uZmlndXJlZCBieSBkZWZhdWx0LgorICogVGhpcyBpcyBlc3NlbnRpYWxseSBhbGwgY29tbWFuZHMgbWludXMgdGhvc2UgdGhhdCBhcmUgY29uc2lkZXJlZAorICogIm5vbi1zdGFuZGFyZCIgZm9yIHNvbWUgcmVhc29uIChtZW1vcnkgaG9ncywgcmVxdWlyZXMgc3BlY2lhbAorICogaGFyZHdhcmUsIG5vdCBmdWxseSB0ZXN0ZWQsIGV0Yy4pLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCS8qIEF1dG9zY3JpcHQgU3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkJICAgICAgIAkvKiBiZGluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECS8qIGJvb3RkCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCS8qIGNvbmluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0VDSE8JCS8qIGVjaG8gYXJndW1lbnRzCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0VOVgkJLyogc2F2ZWVudgkJCSovCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gJLyogZmxpbmZvLCBlcmFzZSwgcHJvdGVjdAkqLworI2RlZmluZSBDT05GSUdfQ01EX0ZQR0EJCS8qIEZQR0EgY29uZmlndXJhdGlvbiBTdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR19DTURfSU1JCQkvKiBpbWluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0lNTFMJCS8qIExpc3QgYWxsIGZvdW5kIGltYWdlcwkqLworI2RlZmluZSBDT05GSUdfQ01EX0lURVNUCS8qIEludGVnZXIgKGFuZCBzdHJpbmcpIHRlc3QJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgkvKiBsb2FkYgkJCSovCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMJLyogbG9hZHMJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQkvKiBtZCBtbSBubSBtdyBjcCBjbXAgY3JjIGJhc2UgbG9vcCBtdGVzdCAqLworI2RlZmluZSBDT05GSUdfQ01EX01JU0MJCS8qIE1pc2MgZnVuY3Rpb25zIGxpa2Ugc2xlZXAgZXRjKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQJCS8qIGJvb3RwLCB0ZnRwYm9vdCwgcmFycGJvb3QJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMJCS8qIE5GUyBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4JCS8qIHJ1biBjb21tYW5kIGluIGVudiB2YXJpYWJsZQkqLworI2RlZmluZSBDT05GSUdfQ01EX1NFVEdFVERDUgkvKiBEQ1Igc3VwcG9ydCBvbiA0eHgJCSovCisjZGVmaW5lIENPTkZJR19DTURfWElNRwkJLyogTG9hZCBwYXJ0IG9mIE11bHRpIEltYWdlCSovCisKKyNlbmRpZgkvKiBfQ09ORklHX0NNRF9ERUZBVUxUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BMzAwMC5oIGIvaW5jbHVkZS9jb25maWdzL0EzMDAwLmgKaW5kZXggY2E5NTkyYy4uMGE5YTFmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0EzMDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0EzMDAwLmgKQEAgLTUyLDIzICs1MiwyMCBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogCi0jaWYgMAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgIENGR19DTURfQlNQICAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJICBDRkdfQ01EX0kyQyAJIHwgXAotCQkJCSAgQ0ZHX0NNRF9GTEFTSCB8IFwKLQkJCQkgIENGR19DTURfQkVEQlVHIHwgXAotCQkJCSAgQ0ZHX0NNRF9ORVQgICAgfCBcCi0JCQkJICBDRkdfQ01EX1BDSSApCi0jZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAJKi8KIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKIAogLyoKQEAgLTMwOSw3ICszMDYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FEQ0lPUC5oIGIvaW5jbHVkZS9jb25maWdzL0FEQ0lPUC5oCmluZGV4IDgyMWVmZTUuLjQ2MzI5OTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BRENJT1AuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQURDSU9QLmgKQEAgLTU5LDIxICs1OSwzMiBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxMC4wLjE4LjIyMgogI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTEwLjAuMTguMTkwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTg1LDcgKzE5Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkyMDQ4CS8qIEZvciBQTFggSU9QNDgwCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBBTUNDIDQwMS80MDMgQ1BVcwkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQUROUEVTQzEuaCBiL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCmluZGV4IDJlZmNhMTAuLjc3OTM4YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCkBAIC00MDEsMTUgKzQwMSw4IEBACiAjZGVmaW5lCUNPTkZJR19SVENfRFMxMzA2CTEJLyogRGFsbGFzIDEzMDYgcmVhbCB0aW1lIGNsb2NrCSovCiAjZGVmaW5lIENGR19TUElfUlRDX0RFVklECTAJLyogICAgICAgIGFzIDFzdCBTUEkgZGV2aWNlCSovCiAKLSNkZWZpbmUJX19TUElfQ01EX09GRgkJMAkvKiBhbGxvdyBkZWZhdWx0IGNvbW1hbmRzOgkqLwotCQkJCQkvKglDRkdfQ01EX1NQSQkJKi8KLQkJCQkJLyoJQ0ZHX0NNRF9EQVRFCQkqLwotCiAjZWxzZQogI3VuZGVmCUNPTkZJR19OSU9TX1NQSQkJCQkvKiBOTyBTUEkgc3VwcG9ydAkqLwotI2RlZmluZQlfX1NQSV9DTURfT0ZGCSgJQ0ZHX0NNRF9TUEkJXAotCQkJfAlDRkdfQ01EX0RBVEUJXAotCQkJKQogI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01NzAsNDUgKzU2Myw1NSBAQAogI2RlZmluZQlDT05GSUdfUE9TVAkJCUNGR19QT1NUX1JUQwogI2RlZmluZQlDRkdfTklPU19QT1NUX1dPUkRfQUREUgkJKENGR19NT05JVE9SX0JBU0UgKyBDRkdfTU9OSVRPUl9MRU4pCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9BTEwgJiB+KCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUJfCBcCi0JCQkJIENGR19DTURfRE9DCXwgXAotCQkJCSBDRkdfQ01EX0RUVAl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfRUxGICAgIHwgXAotCQkJCSBDRkdfQ01EX0ZBVAl8IFwKLQkJCQkgQ0ZHX0NNRF9GREMJfCBcCi0JCQkJIENGR19DTURfRkRPUwl8IFwKLQkJCQkgQ0ZHX0NNRF9IV0ZMT1cJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkgQ0ZHX0NNRF9LR0RCCXwgXAotCQkJCSBDRkdfQ01EX05BTkQJfCBcCi0JCQkJIENGR19DTURfTkZTCXwgXAotCQkJCSBDRkdfQ01EX01NQwl8IFwKLQkJCQkgQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJIENGR19DTURfUENJCXwgXAotCQkJCSBDRkdfQ01EX1BDTUNJQSB8IFwKLQkJCQkgQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJCSBDRkdfQ01EX1ZGRAl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfWElNRwl8IFwKLQkJCQkgX19TUElfQ01EX09GRgkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfYWxsLmg+CiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyN1bmRlZiBDT05GSUdfQ01EX0FTS0VOVgorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9CTVAKKyN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0ZBVAorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSTJDCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTkFORAorI3VuZGVmIENPTkZJR19DTURfTkZTCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX01JSQorI3VuZGVmIENPTkZJR19DTURfUENJCisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX1NDU0kKKyN1bmRlZiBDT05GSUdfQ01EX1ZGRAorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKKyNpZiAoQ0ZHX05JT1NfQ1BVX1NQSV9OVU1TICE9IDEpCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX0RBVEUKKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogS0dEQgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQk5NjAwCiAjZW5kaWYKIApAQCAtNjUxLDcgKzY1NCw2IEBACiAjdW5kZWYJQ0ZHX0xPQURfQUREUgkJLyogZm9yY2UgZXJyb3IgYnJlYWsgKi8KICNlbmRpZgogCi0KIC8qIE1FTSB0ZXN0IGFyZWEgKi8KICNpZgkoQ0ZHX1NEUkFNX1NJWkUgIT0gMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FEUzg2MC5oIGIvaW5jbHVkZS9jb25maWdzL0FEUzg2MC5oCmluZGV4IGRmMjA5NjUuLjJlZThjNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BRFM4NjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQURTODYwLmgKQEAgLTM3LDEzICszNywxOSBAQAogCiAjZGVmaW5lIENPTkZJR19EUkFNXzUwTUhaCQkxCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDT05GSUdfQ01EX0RGTCAgIFwKLQkJCSB8IENGR19DTURfREhDUCAgIFwKLQkJCSB8IENGR19DTURfSU1NQVAgIFwKLQkJCSB8IENGR19DTURfUENNQ0lBIFwKLQkJCSB8IENGR19DTURfUElORyAgIFwKLQkJCSkKIAorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ01DSUEKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKy8qIFRoaXMgaXMgcGlja2VkIHVwIGFnYWluIGluIGZhZHMuaCAqLworI2RlZmluZSBGQURTX0NPTU1BTkRTX0FMUkVBRFlfREVGSU5FRAogCiAjaW5jbHVkZSAiZmFkcy5oIgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQU1YODYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQU1YODYwLmgKaW5kZXggMTRkNTZiZi4uNmY2NDAzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FNWDg2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BTVg4NjAuaApAQCAtNjEsNyArNjEsMjUgQEAKIAogI3VuZGVmIENPTkZJR19CT09UQVJHUwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KKworI2RlZmluZQlDT05GSUdfU0NDMV9FTkVUCTEJLyogdXNlIFNDQzEgZXRoZXJuZXQgKi8KKworI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZQlDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC03MCwyOSArODgsMjIgQEAKICNlbmRpZgogCiAKLSN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCiAKLSNkZWZpbmUJQ09ORklHX1NDQzFfRU5FVAkxCS8qIHVzZSBTQ0MxIGV0aGVybmV0ICovCi0KLSNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCi0KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTk2LDcgKzIwNyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BUDEwMDAuaCBiL2luY2x1ZGUvY29uZmlncy9BUDEwMDAuaAppbmRleCBiYTRiMWEyLi5kMjVhYTc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQVAxMDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0FQMTAwMC5oCkBAIC02NiwxOCArNjYsMjggQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTVZFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCVwKLQkJCSAgICAgICApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01WRU5WCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkgICAgKi8KIApAQCAtODksNyArOTksNyBAQAogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4OCw3ICsxOTgsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICovCiAjZW5kaWYKIApAQCAtMjI4LDcgKzIzOCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BUEM0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9BUEM0MDUuaAppbmRleCAzZGY5OWEwLi5mNjQ5NWU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQVBDNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0FQQzQwNS5oCkBAIC02NywyNyArNjcsMzggQEAKIAogI2RlZmluZSBDT05GSUdfUEhZX0NMS19GUkVRCUVNQUNfU1RBQ1JfQ0xLXzY2TUhaIC8qIDY2IE1IeiBPUEIgY2xvY2sqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NICApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYgIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19SVENfTUMxNDY4MTggICAgICAgICAgICAgLyogRFMxNjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtMTA2LDcgKzExNyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2Niw3ICsyNzcsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MgICAqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZSAgICAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FSNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvQVI0MDUuaAppbmRleCAxY2QwMjgwLi4wZjMwMWVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQVI0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQVI0MDUuaApAQCAtNzEsMTcgKzcxLDI5IEBACiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTkyLDcgKzEwNCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwNyw3ICsyMTksNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FTSDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0FTSDQwNS5oCmluZGV4IDU4NGY0OTAuLjA3MThjODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BU0g0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQVNINDA1LmgKQEAgLTYzLDE5ICs2MywzMSBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTk1LDcgKzEwNyw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI1MSw3ICsyNjMsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FkZGVyLmggYi9pbmNsdWRlL2NvbmZpZ3MvQWRkZXIuaAppbmRleCAwZTZiNTBmLi40MzA0ZWNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQWRkZXIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQWRkZXIuaApAQCAtNTIsMTUgKzUyLDI2IEBACiAjZGVmaW5lIENGR184eHhfQ1BVQ0xLX01BWAkJMTMzMDAwMDAwCiAjZW5kaWYgLyogQ09ORklHX01QQzg1MlQgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgXAotCQkJCXwgQ0ZHX0NNRF9JTU1BUCAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgXAotCQkJCSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkJLyogQXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gZmUwNDAwMDAiCS8qIEF1dG9ib290IGNvbW1hbmQJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BZGRlclVTQi5oIGIvaW5jbHVkZS9jb25maWdzL0FkZGVyVVNCLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmN2Y5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9BZGRlclVTQi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ29kZUhlcm1pdC4KKyAqIEJyeWFuIE8nRG9ub2dodWUgPGJvZG9ub2dodWVAY29kZWhlcm1pdC5pZT4KKyAqCisgKiBQcm92aWRlcyBzdXBwb3J0IGZvciBVU0IgY29uc29sZSBvbiB0aGUgQW5hbG9ndWUgJiBNaWNybyBBZGRlcjg3eAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19BRERFUlVTQl9fCisjZGVmaW5lIF9fQURERVJVU0JfXworCisvKiBJbmNsdWRlIHRoZSBib2FyZCBwb3J0ICovCisjaW5jbHVkZSAiQWRkZXIuaCIKKworI2RlZmluZSBDT05GSUdfVVNCX0RFVklDRQkJLyogSW5jbHVkZSBVREMgZHJpdmVyICovCisjZGVmaW5lIENPTkZJR19VU0JfVFRZCQkJLyogQmluZCB0aGUgVFRZIGRyaXZlciB0byBVREMgKi8KKyNkZWZpbmUgQ0ZHX1VTQl9FWFRDX0NMSyAweDAyCQkvKiBPc2NpbGxhdG9yIG9uIEVYVENfQ0xLIDIgKi8KKyNkZWZpbmUgQ0ZHX1VTQl9CUkdfQ0xLCTB4MDQJCS8qIG9yIHVzZSBCYXVkIHJhdGUgZ2VuZXJhdG9yIDB4MDQgKi8KKyNkZWZpbmUgQ0ZHX0NPTlNPTEVfSVNfSU5fRU5WCQkvKiBDb25zb2xlIGlzIGluIGVudiAqLworCisvKiBJZiB5b3UgaGF2ZSBhIFVTQi1JRiBhc3NpZ25lZCBWZW5kb3JJRCB0aGVuIHlvdSBtYXkgd2lzaCB0byBkZWZpbmUKKyAqIHlvdXIgb3duIHZlbmRvciBzcGVjaWZpYyB2YWx1ZXMgZWl0aGVyIGluIEJvYXJkTmFtZS5oIG9yIGRpcmVjdGx5IGluCisgKiB1c2JkX3ZlbmRvcl9pbmZvLmgKKyAqLworCisvKgorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIkNvZGVIZXJtaXQuaWUiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiRGFzIFUtQm9vdCIKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4RkZGRgorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSURfR1NFUklBTAkweEZGRkYKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVElEX0NEQ0FDTQkweEZGRkUKKyovCisKKyNlbmRpZiAvKiBfX0FEREVSVVNCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FsYXNrYTgyMjAuaCBiL2luY2x1ZGUvY29uZmlncy9BbGFza2E4MjIwLmgKaW5kZXggYzA4YjJjMy4uM2YyZjYxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FsYXNrYTgyMjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQWxhc2thODIyMC5oCkBAIC0zOSwxMiArMzksNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjIwIENQVXMgKi8KLQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1ICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC03MCwzMSArNjQsNDAgQEAKIAogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCQkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCisKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JPT1RECXwgXAotCQkJCUNGR19DTURfQ0FDSEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQogI2RlZmluZSBDT05GSUdfTUlJCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIEF1dG9ib290aW5nCiAgKi8KQEAgLTI4Miw3ICsyODUsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCSAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkgICAgLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yOTgsNiArMzAxLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkgICAgLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1ICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FtaWdhT25lRzNTRS5oIGIvaW5jbHVkZS9jb25maWdzL0FtaWdhT25lRzNTRS5oCmluZGV4IGVhNTBmNDEuLmQ5MTRkY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BbWlnYU9uZUczU0UuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQW1pZ2FPbmVHM1NFLmgKQEAgLTU2LDM4ICs1Niw0NiBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9yYW0gcncgcmFtZGlzaz00MDk2IgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfQU1JR0FfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JTUAl8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX05FVAl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIENGR19DTURfRkRDCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0NPTlNPTEV8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX1BDSQkpCiAKLS8qCQkJCSAgICBDRkdfQ01EX01JSQkgICB8IFwgKi8KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GREMKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEV8CisjZGVmaW5lIENPTkZJR19DTURfVVNCCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisKIAogI2RlZmluZSBDT05GSUdfUENJCQkxCiAvKiAjZGVmaW5lIENPTkZJR19QQ0lfU0NBTl9TSE9XIDEgKi8KICNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCTEJLyogUENJIHBsdWctYW5kLXBsYXkgKi8KIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KKyNkZWZpbmUgYXRvaSh4KQkJc2ltcGxlX3N0cnRvdWwoeCxOVUxMLDEwKQogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMjQ3LDcgKzI1NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNDgsOCArMzU2LDYgQEAKIAogI2RlZmluZSBDT05GSUdfM0NPTQogLyogI2RlZmluZSBDT05GSUdfQk9PVFBfUkFORE9NX0RFTEFZICovCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKIAogLyoKICAqIFVTQiBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQjIuaCBiL2luY2x1ZGUvY29uZmlncy9CMi5oCmluZGV4IGU1NTg1OGQuLmYxNDExZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9CMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9CMi5oCkBAIC03MiwxNiArNzIsMjYgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJCQkJCUNGR19DTURfREFURSB8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCQkJCQlDRkdfQ01EX0kyQwkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAjZGVmaW5lIENPTkZJR19FVEhBRERSCTAwOjUwOmMyOjFlOmFmOmZiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQkFCN3h4LmggYi9pbmNsdWRlL2NvbmZpZ3MvQkFCN3h4LmgKaW5kZXggNDZiZGZhMi4uYzExZTljOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0JBQjd4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9CQUI3eHguaApAQCAtNjYsMTQgKzY2LDMwIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPICAgICAgIDAgICAgICAgLyogZWNobyBvZmYgZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UgICAgICAgICAgIC8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZXMgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyAgICAgICAoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0pGRlMyIHxcCi0JCQkJIENGR19DTURfU0NTSSAgIHwgQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0RBVEUgIHxcCi0JCQkJIENGR19DTURfRkRDICAgIHwgQ0ZHX0NNRF9FTEYpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfU0NTSQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9GREMKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtODYsNyArMTAyLDcgQEAKICAqLwogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAxCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRSAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQzNiw3ICs0NTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgICAgMzIgICAgLyogRm9yIGFsbCBNUEM3NHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgICAgICA1ICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0JDMzQ1MC5oIGIvaW5jbHVkZS9jb25maWdzL0JDMzQ1MC5oCmluZGV4IGJjMzA5NzcuLjVjMmJmYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9CQzM0NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQkMzNDUwLmgKQEAgLTYxLDExICs2MSw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCSAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAgICAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTEwNiwxMiArMTAxLDYgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJOAkvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAJKi8KICNkZWZpbmUgQ09ORklHX05TODM4MlgJCTEKIAotI2lmZGVmIENPTkZJR19QQ0kKLSMgZGVmaW5lIEFERF9QQ0lfQ01ECQlDRkdfQ01EX1BDSQotI2Vsc2UKLSMgZGVmaW5lIEFERF9QQ0lfQ01ECQkwCi0jZW5kaWYKLQogLyoKICAqIFZpZGVvIGNvbnNvbGUKICAqLwpAQCAtMTI2LDEyICsxMTUsNiBAQAogIyBkZWZpbmUgQ09ORklHX1NQTEFTSF9TQ1JFRU4KICMgZGVmaW5lIENGR19DT05TT0xFX0lTX0lOX0VOVgogCi0jaWZkZWYgQ09ORklHX1ZJREVPCi0jIGRlZmluZSBBRERfQk1QX0NNRAkJQ0ZHX0NNRF9CTVAKLSNlbHNlCi0jIGRlZmluZSBBRERfQk1QX0NNRAkJMAotI2VuZGlmCi0KIC8qCiAgKiBQYXJ0aXRpb25zCiAgKi8KQEAgLTE0NCwxMCArMTI3LDcgQEAKICAqLwogI2lmZGVmIENPTkZJR19CQzM0NTBfVVNCCiAjIGRlZmluZSBDT05GSUdfVVNCX09IQ0kKLSMgZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQgogIyBkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZSAvKiAhQ09ORklHX0JDMzQ1MF9VU0IgKi8KLSMgZGVmaW5lIEFERF9VU0JfQ01ECQkwCiAjZW5kaWYgLyogQ09ORklHX0JDMzQ1MF9VU0IgKi8KIAogLyoKQEAgLTE1OCw2NiArMTM4LDY5IEBACiAJCQkJIENGR19QT1NUX0kyQykKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jIGRlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICMgZGVmaW5lIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUgTVBDNVhYWF9TUkFNX1NJWkUtNAotI2Vsc2UKLSMgZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKICNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwogCisKIC8qCi0gKiBJREUKKyAqIEJPT1RQIG9wdGlvbnMKICAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKKyNpZmRlZiBDT05GSUdfVklERU8KKyAgICAjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19CQzM0NTBfSURFCi0jIGRlZmluZSBBRERfSURFX0NNRAkJQ0ZHX0NNRF9JREUKLSNlbHNlCi0jIGRlZmluZSBBRERfSURFX0NNRAkJMAotI2VuZGlmIC8qIENPTkZJR19CQzM0NTBfSURFICovCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2VuZGlmCiAKLS8qCi0gKiBGaWxlc3lzdGVtIHN1cHBvcnQKLSAqLwotI2lmIGRlZmluZWQgKENPTkZJR19CQzM0NTBfSURFKSB8fCBkZWZpbmVkIChDT05GSUdfQkMzNDUwX1VTQikKLSNpZmRlZiBDT05GSUdfRkFUCi0jIGRlZmluZSBBRERfRkFUX0NNRAkJQ0ZHX0NNRF9GQVQKLSNlbHNlCi0jIGRlZmluZSBBRERfRkFUX0NNRAkJMAotI2VuZGlmIC8qIENPTkZJR19GQVQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19CQzM0NTBfSURFKSB8fCBkZWZpbmVkKENPTkZJR19CQzM0NTBfVVNCKQorICAgICNpZmRlZiBDT05GSUdfRkFUCisJI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorICAgICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0VYVDIKLSMgZGVmaW5lIEFERF9FWFQyX0NNRAkJQ0ZHX0NNRF9FWFQyCi0jZWxzZQotIyBkZWZpbmUgQUREX0VYVDJfQ01ECQkwCi0jZW5kaWYgLyogQ09ORklHX0VYVDIgKi8KLSNlbmRpZiAvKiBDT05GSUdfQkMzNDUwX0lERSAvIF9VU0IgKi8KKyAgICAjaWZkZWYgQ09ORklHX0VYVDIKKwkjZGVmaW5lIENPTkZJR19DTURfRVhUMgorICAgICNlbmRpZgorI2VuZGlmCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfQk1QX0NNRAl8IFwKLQkJCQlBRERfSURFX0NNRAl8IFwKLQkJCQlBRERfRkFUX0NNRAl8IFwKLQkJCQlBRERfRVhUMl9DTUQJfCBcCi0JCQkJQUREX1BDSV9DTUQJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VDSE8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX0JTUCkKKyNpZmRlZiBDT05GSUdfQkMzNDUwX1VTQgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWZkZWYgQ09ORklHX1BDSQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BPU1QKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtNDUwLDcgKzQzMyw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtNDY5LDkgKzQ1MiwxMyBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJCS8qIGRlYyBmcmVxOiAxbXMgdGlja3MJICAgICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCSAgICAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAgICAqLworI2VuZGlmCisKIC8qCi0gKiBFbmFibGUgbG9vcHcgY29tbWFuZG8uIFRoaXMgaGFzIG9ubHkgYWZmZWN0LCBpZiBDRkdfQ01EX01FTSBpcyBkZWZpbmVkLAotICogd2hpY2ggaXMgbm9ybWFsbHkgcGFydCBvZiB0aGUgZGVmYXVsdCBjb21tYW5kcyAoQ0ZWX0NNRF9ERkwpCisgKiBFbmFibGUgbG9vcHcgY29tbWFuZC4KICAqLwogI2RlZmluZSBDT05GSUdfTE9PUFcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0JNVy5oIGIvaW5jbHVkZS9jb25maWdzL0JNVy5oCmluZGV4IDNiZDQzZDguLmJiNzg1NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9CTVcuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQk1XLmgKQEAgLTY0LDI4ICs2NCwzNSBAQAogI2RlZmluZSBDRkdfRE9DX1NVUFBPUlRfMjAwMCAgICAxCiAjZGVmaW5lIENGR19ET0NfU1VQUE9SVF9NSUxMRU5OSVVNIDEKICNkZWZpbmUgQ0ZHX0RPQ19TSE9SVF9USU1FT1VUICAgIDEKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRE9DCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCTAgKQogCi0vKiBDRkdfQ01EX0RPQyByZXF1aXJlZCBsZWdhY3kgTkFORCBzdXBwb3J0ICovCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKKworLyogQ09ORklHX0NNRF9ET0MgcmVxdWlyZWQgbGVnYWN5IE5BTkQgc3VwcG9ydCAqLwogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIAogI2lmIDAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAgKENPTkZJR19DTURfREZMCXwgQ0ZHX0NNRF9ESENQIHwgXAotCQkJCSBDRkdfQ01EX1BDSSB8IENGR19DTURfRE9DIHwgQ0ZHX0NNRF9EQVRFKQotCiAjZGVmaW5lIENPTkZJR19QQ0kJCTEKICNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCTEJLyogUENJIHBsdWctYW5kLXBsYXkgKi8KICNlbmRpZgogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCi0gKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0yOTMsNyArMzAwLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAgICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NBTkJULmggYi9pbmNsdWRlL2NvbmZpZ3MvQ0FOQlQuaAppbmRleCBlMDI2MmE4Li5hZTMyZjZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ0FOQlQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ0FOQlQuaApAQCAtNTYsMTMgKzU2LDI2IEBACiAKICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAoKCBDT05GSUdfQ01EX0RGTAl8CVwKLQkJCQlDRkdfQ01EX0lSUQl8CVwKLQkJCQlDRkdfQ01EX0VFUFJPTQkgICAgKSAmIFwKLQkJCSAgICAgICB+Q0ZHX0NNRF9ORVQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC03Myw3ICs4Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE3Myw3ICsxODYsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DQVRjZW50ZXIuaCBiL2luY2x1ZGUvY29uZmlncy9DQVRjZW50ZXIuaAppbmRleCA3ZWM0NTk5Li42MmEyZWFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ0FUY2VudGVyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NBVGNlbnRlci5oCkBAIC0xMTksMjQgKzExOSwzNiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAogI2RlZmluZSBDT05GSUdfUlRDX01DMTQ2ODE4CQkvKiBEUzE2ODUgaXMgTUMxNDY4MTggY29tcGF0aWJsZSovCkBAIC0xNTUsNyArMTY3LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDEzLDcgKzQyNSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ0NNLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ0NNLmgKaW5kZXggZTg5OTRmZi4uOWYwNjk1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NDTS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DQ00uaApAQCAtOTQsMjcgKzk0LDM1IEBACiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCQkvKiBub2QgdXNlZCB5ZXQJCQkqLwogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NNUzcwMC5oIGIvaW5jbHVkZS9jb25maWdzL0NNUzcwMC5oCmluZGV4IDk2OTUyMTEuLjFmZDJiNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DTVM3MDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ01TNzAwLmgKQEAgLTYwLDI2ICs2MCwzNSBAQAogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KICNkZWZpbmUgQ09ORklHX1JFU0VUX1BIWV9SICAgICAgMSAgICAgICAvKiB1c2UgcmVzZXRfcGh5KCkgdG8gZGlzYWJsZSBwaHkgc2xlZXAgbW9kZSAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUyB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC05OCw3ICsxMDcsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNjgsNyArMjc3LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUEM0NS5oIGIvaW5jbHVkZS9jb25maWdzL0NQQzQ1LmgKaW5kZXggYjg4MmY3YS4uYWVhODUyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQzQ1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQzQ1LmgKQEAgLTU0LDI3ICs1NCwzNiBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9GTEFTSAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisvKgorICogQk9PVFAgb3B0aW9ucwogICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAogCiAvKgpAQCAtMzI1LDcgKzMzNCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTJEUC5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0kyRFAuaAppbmRleCA1NmZkOWE2Li5hMzcxN2I5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTJEUC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJMkRQLmgKQEAgLTU0LDE2ICs1NCwyOSBAQAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCAoQ09ORklHX0NNRF9ERkwJJiB+Q0ZHX0NNRF9ORVQpIHwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC04MCw3ICs5Myw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIxNiw3ICsyMjksNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1LmgKaW5kZXggOWMwNDEyOS4uMWI5NDhmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNS5oCkBAIC02MCwyOSArNjAsMzggQEAKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCiAjdW5kZWYgIENPTkZJR19IQVNfRVRIMQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUyB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLwpAQCAtOTgsNyArMTA3LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjYyLDcgKzI3MSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNTIuaAppbmRleCAyYTMyOGE2Li5mYjcxYzVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNTIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNTIuaApAQCAtNjQsMjUgKzY0LDM3IEBACiAKICNkZWZpbmUgQ09ORklHX1JUQ19NNDhUMzVBCTEJCS8qIFNUIEVsZWN0cm9uaWNzIE00OCB0aW1la2VlcGVyICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TMiB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNpZiAwIC8qIHRlc3Qtb25seSAqLwogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQpAQCAtMTAyLDkgKzExNCw2IEBACiAjZGVmaW5lIENPTkZJR19BVVRPX1VQREFURSAgICAgIDEgICAgICAgLyogYXV0b3VwZGF0ZSB2aWEgY29tcGFjdGZsYXNoICAqLwogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAJKi8KQEAgLTEyMCw3ICsxMjksNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTQsNyArMzIzLDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1QUIuaCBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1QUIuaAppbmRleCA2OTQ2Njg2Li40OTk0MzE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNUFCLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVBQi5oCkBAIC02NCwzMyArNjQsNDIgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMyIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLwpAQCAtMTA2LDcgKzExNSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4NSw3ICsyOTQsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVEVC5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVEVC5oCmluZGV4IDRhZTI0MGUuLjI5ZjkyOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1RFQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNURULmgKQEAgLTYzLDI1ICs2MywzNyBAQAogCiAjZGVmaW5lIENPTkZJR19SVENfTTQ4VDM1QQkxCQkvKiBTVCBFbGVjdHJvbmljcyBNNDggdGltZWtlZXBlciAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUyB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjaWYgMCAvKiB0ZXN0LW9ubHkgKi8KICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUKQEAgLTk5LDkgKzExMSw2IEBACiAKICN1bmRlZiAgQ09ORklHX0FVVE9fVVBEQVRFICAgICAgICAgICAgICAvKiBhdXRvdXBkYXRlIHZpYSBjb21wYWN0Zmxhc2ggICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAJKi8KQEAgLTExNyw3ICsxMjYsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTYsNyArMzI1LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDQwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQ0MC5oCmluZGV4IDdiNWY3MjguLjMxOGFkYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DUENJNDQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0NDAuaApAQCAtMTcyLDI5ICsxNzIsMjcgQEAKICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkxCS8qIFBIWSBhZGRyZXNzCQkJKi8KICNkZWZpbmUgQ09ORklHX0xYVDk3MV9OT19TTEVFUCAgMSAgICAgICAvKiBkaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxICovCiAKLSNpZiAwIC8qIHRlc3Qtb25seSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0tHREIJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0VMRgkpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQotLyogdGVzdC1vbmx5OiBzdXBwb3J0IGZlaGx0IGJpc2hlci4uLiAqLwotLyoJCQkJQ0ZHX0NNRF9JREUJfCBcKi8KLS8qCQkJCUNGR19DTURfUENJCXwgXCovCi0jZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTIwNSw3ICsyMDMsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNjksNyArMjY3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CS8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjkxLDcgKzI4OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTc1MC5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k3NTAuaAppbmRleCBiYzIzZmMwLi40OGUyOWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTc1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNzUwLmgKQEAgLTEzMywzMCArMTMzLDM3IEBACiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAjdW5kZWYJQ09ORklHX0FMVElWRUMJCQkvKiB1bmRlZiB0byBkaXNhYmxlCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMCSAgIFwKLQkJCSB8IENGR19DTURfQVNLRU5WICBcCi0JCQkgfCBDRkdfQ01EX0kyQwkgICBcCi0JCQkgfCBDRkdfQ01EX0NBQ0hFICAgXAotCQkJIHwgQ0ZHX0NNRF9FRVBST00gIFwKLQkJCSB8IENGR19DTURfUENJCSAgIFwKLQkJCSB8IENGR19DTURfRUxGCSAgIFwKLQkJCSB8IENGR19DTURfREFURQkgICBcCi0JCQkgfCBDRkdfQ01EX05FVAkgICBcCi0JCQkgfCBDRkdfQ01EX1BJTkcJICAgXAotCQkJIHwgQ0ZHX0NNRF9JREUJICAgXAotCQkJIHwgQ0ZHX0NNRF9GQVQJICAgXAotCQkJIHwgQ0ZHX0NNRF9FWFQyCSAgIFwKLQkJCQkJKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorCiAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19VU0VfQ1BDSURWSQogCiAjaWZkZWYJQ09ORklHX1VTRV9DUENJRFZJCkBAIC0xNzksNyArMTg2LDcgQEAKICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCQkJLyogYWxzbyBmb3IgSlRBRyBldmVuIHdpdGggb25lIGNwdSAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNTg1LDcgKzU5Miw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBhbGwgTVBDNzR4eCBDUFVzCQkgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSUlTRVI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSUlTRVI0LmgKaW5kZXggOTNkNDlmMy4uYzdiNjIzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0lJU0VSNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJSVNFUjQuaApAQCAtNTQsMTUgKzU0LDM2IEBACiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC03Myw3ICs5NCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4OSw3ICsyMTAsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUFU4Ni5oIGIvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKaW5kZXggMTZhOWVhNS4uYzU4OWYyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKQEAgLTY4LDkgKzY4LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgotICoKKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICAgICAqLwogI2RlZmluZQlDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gRkNDICAgICAgICovCkBAIC0xNjMsMjcgKzE2MSwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI3VuZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQkJLyogZG9uJ3QgYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNDgsNyArMzU2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAgICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQVTg3LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaAppbmRleCBjZTk2OWVjLi5iMDg3ZWJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaApAQCAtNjksOSArNjksNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCi0gKgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gU0NDCSovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MJKi8KQEAgLTE2NywyNyArMTY1LDMxIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjdW5kZWYJQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCiAKICNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0RPQwl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX1BDSSkKLSNlbHNlCS8qICEgUENJICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0RPQwl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfSTJDCSkKLSNlbmRpZgkvKiBDT05GSUdfUENJICovCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTk2LDcgKzE5OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM2OSw3ICszNzEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUkFZTDEuaCBiL2luY2x1ZGUvY29uZmlncy9DUkFZTDEuaAppbmRleCA2M2Q3YTkyLi5hOTY1YzEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1JBWUwxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NSQVlMMS5oCkBAIC03NSwzOCArNzUsNDIgQEAKICNkZWZpbmUgQ09ORklHX0FVVE9TQ1JJUFQJCTEKIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgKFwKLQlDRkdfQ01EX0JESXxcCi0JQ0ZHX0NNRF9JTUl8XAotCUNGR19DTURfRkxBU0h8XAotCUNGR19DTURfTUVNT1JZfFwKLQlDRkdfQ01EX05FVHxcCi0JQ0ZHX0NNRF9FTlZ8XAotCUNGR19DTURfQ09OU09MRXxcCi0JQ0ZHX0NNRF9BU0tFTlZ8XAotCUNGR19DTURfRUNIT3xcCi0JQ0ZHX0NNRF9JTU1BUHxcCi0JQ0ZHX0NNRF9SRUdJTkZPfFwKLQlDRkdfQ01EX0RIQ1B8XAotCUNGR19DTURfREFURXxcCi0JQ0ZHX0NNRF9SVU58XAotCUNGR19DTURfSTJDfFwKLQlDRkdfQ01EX0VFUFJPTXxcCi0JQ0ZHX0NNRF9ESUFHfFwKLQlDRkdfQ01EX0FVVE9TQ1JJUFR8XAotCUNGR19DTURfU0VUR0VURENSKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorI2RlZmluZSBDT05GSUdfQ01EX1NFVEdFVERDUgorCiAKIC8qCi0gKiBvcHRpb25hbCBCT09UUCAvIERIQ1AgZmllbGRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgKFwKLQlDT05GSUdfQk9PVFBfVkVORE9SRVh8XAotCUNPTkZJR19CT09UUF9TVUJORVRNQVNLfFwKLQlDT05GSUdfQk9PVFBfR0FURVdBWXxcCi0JQ09ORklHX0JPT1RQX0ROU3xcCi0JQ09ORklHX0JPT1RQX0hPU1ROQU1FfFwKLQlDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFfFwKLQlDT05GSUdfQk9PVFBfQk9PVFBBVEgpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1ZFTkRPUkVYCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCiAgKiBob3cgbWFueSB0aW1lIHRvIGZhaWwgJiByZXN0YXJ0IGEgbmV0LVRGVFAgYmVmb3JlIGdpdmluZyB1cCAmIHJlc2V0dGluZwpAQCAtMTIzLDkgKzEyNyw2IEBACiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAogICAgIHszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDB9CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NVODI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaAppbmRleCBhY2M4NDg0Li42OGU4MTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaApAQCAtNTUsMjEgKzU1LDI5IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gRkUwMjAwMDAiCS8qIGF1dG9ib290IGNvbW1hbmQJKi8KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcgIHwgXAotCQkJCTAgLyogQ0ZHX0NNRF9EQVRFICovCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKIAogLyoKQEAgLTI3OCw3ICsyODYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RBU0FfU0lNLmggYi9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaAppbmRleCA5OTdlMWJhLi42MjdlYTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaApAQCAtNTcsMzIgKzU3LDM1IEBACiAjZGVmaW5lIENPTkZJR19JUEFERFIJCTEwLjAuMTguMjIyCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTAuMC4xOC4xOTAKIAotI2lmIDAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCSkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQlNQCSkKLSNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKIAogI2lmIDAgLyogRG9lcyBub3QgYXBwZWFyIHRvIGJlIHVzZWQ/ISAgSWYgaXQgaXMgdXNlZCwgbmVlZHMgdG8gYmUgZml4ZWQgKi8KICNkZWZpbmUgQ09ORklHX1NPRlRfSTJDCQkJLyogU29mdHdhcmUgSTJDIHN1cHBvcnQgZW5hYmxlZCAqLwogI2VuZGlmCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xODQsNyArMTg3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTIwNDgJLyogRm9yIFBMWCBJT1A0ODAJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIEFNQ0MgNDAxLzQwMyBDUFVzCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EQjY0MzYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvREI2NDM2MC5oCmluZGV4IGJkN2FmZjEuLmRiMmU5NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EQjY0MzYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RCNjQzNjAuaApAQCAtMjE1LDggKzIxNSwxNiBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDCQkJLyogdW5kZWYgdG8gZGlzYWJsZQkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCiAgKgpAQCAtMjM5LDE3ICsyNDcsMjAgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9ZGI2NDM2MC0xOi0oamZmczIpIgogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIFwKLQkJCSB8IENGR19DTURfQVNLRU5WIFwKLQkJCSB8IENGR19DTURfSTJDIFwKLQkJCSB8IENGR19DTURfRUVQUk9NIFwKLQkJCSB8IENGR19DTURfQ0FDSEUgXAotCQkJIHwgQ0ZHX0NNRF9KRkZTMiBcCi0JCQkgfCBDRkdfQ01EX1BDSSBcCi0JCQkgfCBDRkdfQ01EX05FVCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0yNjEsNyArMjcyLDcgQEAKIC8qICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCSBhbHNvIGZvciBKVEFHIGV2ZW4gd2l0aCBvbmUgY3B1ICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC01NTgsNyArNTY5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EQjY0NDYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvREI2NDQ2MC5oCmluZGV4IDRiNzJlOWIuLmI1ZDNmNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EQjY0NDYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RCNjQ0NjAuaApAQCAtMTUzLDggKzE1MywxNiBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDCQkJLyogdW5kZWYgdG8gZGlzYWJsZQkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCiAgKgpAQCAtMTc3LDE3ICsxODUsMjAgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9ZGI2NDQ2MC0xOi0oamZmczIpIgogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIFwKLQkJCSB8IENGR19DTURfQVNLRU5WIFwKLQkJCSB8IENGR19DTURfSTJDIFwKLQkJCSB8IENGR19DTURfRUVQUk9NIFwKLQkJCSB8IENGR19DTURfQ0FDSEUgXAotCQkJIHwgQ0ZHX0NNRF9KRkZTMiBcCi0JCQkgfCBDRkdfQ01EX1BDSSBcCi0JCQkgfCBDRkdfQ01EX05FVCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xOTksNyArMjEwLDcgQEAKIC8qICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCSBhbHNvIGZvciBKVEFHIGV2ZW4gd2l0aCBvbmUgY3B1ICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00OTYsNyArNTA3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ESzFDMjAuaCBiL2luY2x1ZGUvY29uZmlncy9ESzFDMjAuaAppbmRleCBiNTg4NDZkLi4wZGRmMGUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvREsxQzIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RLMUMyMC5oCkBAIC00NDYsNDYgKzQ0Niw1NSBAQAogI2RlZmluZSBDT05GSUdfTklPU19BU01JCQkJICAgLyogRW5hYmxlIEFTTUkJKi8KICNkZWZpbmUgQ0ZHX05JT1NfQVNNSUJBU0UJQ0ZHX05JT1NfQ1BVX0FTTUkwIC8qIEFTTUkgYmFzZSBhZGRyZXNzCSovCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9BTEwgJiB+KCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfRE9DCXwgXAotCQkJCSBDRkdfQ01EX0RUVAl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfRUxGICAgIHwgXAotCQkJCSBDRkdfQ01EX0ZEQwl8IFwKLQkJCQkgQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCSBDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfSkZGUzIJfCBcCi0JCQkJIENGR19DTURfS0dEQgl8IFwKLQkJCQkgQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCSBDRkdfQ01EX05GUwl8IFwKLQkJCQkgQ0ZHX0NNRF9NTUMJfCBcCi0JCQkJIENGR19DTURfTUlJCXwgXAotCQkJCSBDRkdfQ01EX1BDSQl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ01DSUEgfCBcCi0JCQkJIENGR19DTURfUkVJU0VSCXwgXAotCQkJCSBDRkdfQ01EX1NDU0kJfCBcCi0JCQkJIENGR19DTURfU1BJCXwgXAotCQkJCSBDRkdfQ01EX1ZGRAl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfWElNRwkpICkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9BU0tFTlYKKyN1bmRlZiBDT05GSUdfQ01EX0JFREJVRworI3VuZGVmIENPTkZJR19DTURfQk1QCisjdW5kZWYgQ09ORklHX0NNRF9CU1AKKyN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCisjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0ZEQworI3VuZGVmIENPTkZJR19DTURfRkRPUworI3VuZGVmIENPTkZJR19DTURfSFdGTE9XCisjdW5kZWYgQ09ORklHX0NNRF9JMkMKKyN1bmRlZiBDT05GSUdfQ01EX0pGRlMyCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9ORlMKKyN1bmRlZiBDT05GSUdfQ01EX01NQworI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUkVJU0VSCisjdW5kZWYgQ09ORklHX0NNRF9TQ1NJCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX1ZGRAorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIENPTVBBQ1QgRkxBU0gKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjZGVmaW5lIENPTkZJR19JREVfUFJFSU5JVAkJCS8qIEltcGxlbWVudCBpZF9wcmVpbml0CSovCiAjZGVmaW5lIENGR19JREVfTUFYQlVTCQkxCQkvKiAxIElERSBidXMJCSovCiAjZGVmaW5lIENGR19JREVfTUFYREVWSUNFCTEJCS8qIDEgZHJpdmUgcGVyIElERSBidXMJKi8KQEAgLTUwMywxMiArNTEyLDEyIEBACiAjZGVmaW5lIENGR19DRl9QT1dFUgkJMHgwMDkyMDljMAkvKiBDRiBQb3dlciBGRVQgUElPIGJhc2UqLwogI2RlZmluZSBDRkdfQ0ZfQVRBU0VMCQkweDAwOTIwOWQwCS8qIENGIEFUQVNFTCBQSU8gYmFzZQkqLwogCi0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUgKi8KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogS0dEQgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQk5NjAwCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RLMVMxMC5oIGIvaW5jbHVkZS9jb25maWdzL0RLMVMxMC5oCmluZGV4IDNlMzgwM2MuLjAwMzJmZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ESzFTMTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREsxUzEwLmgKQEAgLTQ1NCw0NyArNDU0LDU1IEBACiAKICNlbmRpZgkvKiBDRkdfTklPU19DUFVfUElPX05VTVMgKi8KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0FMTCAmIH4oIFwKLQkJCQkgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJIENGR19DTURfQkVEQlVHIHwgXAotCQkJCSBDRkdfQ01EX0JNUAl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUJfCBcCi0JCQkJIENGR19DTURfREFURQl8IFwKLQkJCQkgQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJIENGR19DTURfRFRUCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJIENGR19DTURfRkFUCXwgXAotCQkJCSBDRkdfQ01EX0ZEQwl8IFwKLQkJCQkgQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCSBDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0tHREIJfCBcCi0JCQkJIENGR19DTURfTkFORAl8IFwKLQkJCQkgQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJIENGR19DTURfTU1DCXwgXAotCQkJCSBDRkdfQ01EX01JSQl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19DTURfUENNQ0lBIHwgXAotCQkJCSBDRkdfQ01EX1NDU0kJfCBcCi0JCQkJIENGR19DTURfU1BJCXwgXAotCQkJCSBDRkdfQ01EX1ZGRAl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfWElNRwkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KKworI3VuZGVmIENPTkZJR19DTURfQVNLRU5WCisjdW5kZWYgQ09ORF9DTURfQkVEQlVHCisjdW5kZWYgQ09ORF9DTURfQk1QCisjdW5kZWYgQ09ORF9DTURfQlNQCisjdW5kZWYgQ09ORF9DTURfQ0FDSEUKKyN1bmRlZiBDT05EX0NNRF9EQVRFCisjdW5kZWYgQ09ORF9DTURfRE9DCisjdW5kZWYgQ09ORF9DTURfRFRUCisjdW5kZWYgQ09ORF9DTURfRUVQUk9NCisjdW5kZWYgQ09ORF9DTURfRUxGCisjdW5kZWYgQ09ORF9DTURfRkFUCisjdW5kZWYgQ09ORF9DTURfRkRDCisjdW5kZWYgQ09ORF9DTURfRkRPUworI3VuZGVmIENPTkRfQ01EX0hXRkxPVworI3VuZGVmIENPTkRfQ01EX0lERQorI3VuZGVmIENPTkRfQ01EX0kyQworI3VuZGVmIENPTkRfQ01EX0pGRlMyCisjdW5kZWYgQ09ORF9DTURfS0dEQgorI3VuZGVmIENPTkRfQ01EX05BTkQKKyN1bmRlZiBDT05EX0NNRF9ORlMKKyN1bmRlZiBDT05EX0NNRF9NTUMKKyN1bmRlZiBDT05EX0NNRF9NSUkKKyN1bmRlZiBDT05EX0NNRF9QQ0kKKyN1bmRlZiBDT05EX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05EX0NNRF9TQ1NJCisjdW5kZWYgQ09ORF9DTURfU1BJCisjdW5kZWYgQ09ORF9DTURfVkZECisjdW5kZWYgQ09ORF9DTURfVVNCCisjdW5kZWYgQ09ORF9DTURfWElNRworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBLR0RCCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTk2MDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRFA0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCmluZGV4IDJhZTc5NGQuLjJlYWRiZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCkBAIC01NSwxNyArNTUsMjkgQEAKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtODcsNyArOTksNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzUsNyArMjQ3LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EVTQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKaW5kZXggNTQ4OWE1My4uNWM1OTVmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKQEAgLTU4LDIxICs1OCwzMyBAQAogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOAkJLyogQlEzMjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtODUsNyArOTcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjUsNyArMjM3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRUIrTUNGLUVWMTIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvRUIrTUNGLUVWMTIzLmgKaW5kZXggNzIwYjMzNS4uYTg2OTdlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VCK01DRi1FVjEyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FQitNQ0YtRVYxMjMuaApAQCAtNjgsMTcgKzY4LDI5IEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLS8qI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICggQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0xPQURCKSApICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgKCBDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9MT0FEQikpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURCCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKICNkZWZpbmUgQ0ZHX1BST01QVAkJIlxuRVYxMjMgVS1Cb290PiAiCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRUxQUEMuaCBiL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCmluZGV4IDJjOTliNGIuLmJiNzcxODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCkBAIC02NiwxMiArNjYsMjUgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8gICAgICAgMCAgICAgICAvKiBlY2hvIG9mZiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRSAgICAgICAgICAgLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlcyAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSkZGUzIpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTg0LDcgKzk3LDcgQEAKICAqLwogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAxCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRSAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTMxNyw3ICszMzAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgICAgMzIgICAgLyogRm9yIGFsbCBNUEM3NHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgICAgICA1ICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VMUFQ4NjAuaCBiL2luY2x1ZGUvY29uZmlncy9FTFBUODYwLmgKaW5kZXggZTczYmNlYy4uZjkyN2EyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VMUFQ4NjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRUxQVDg2MC5oCkBAIC04MSw3ICs4MSwxNSBAQAogICAgICIiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIHJhbWJvb3QiCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI3VuZGVmCSAgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICN1bmRlZgkgIENPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KQEAgLTkxLDEyICs5OSwxNSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI3VuZGVmCSAgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOViB8IFwKLQkJCQkgIENGR19DTURfREFURQkgKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTA0LDcgKzExNSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUICAgICAiTEVPWF9lbHB0ODYwOiAiIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFCSAyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjQsNyArMjM1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJICAgICAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCSA0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FUDFDMjAuaCBiL2luY2x1ZGUvY29uZmlncy9FUDFDMjAuaAppbmRleCA1NTA3ZjM1Li5jZmE2MzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVAxQzIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VQMUMyMC5oCkBAIC0xNjAsMjUgKzE2MCwzNiBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjIuMjEKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjIuMTYKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSBDRkdfQ01EX0VDSE8JfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNICXwgXAotCQkJCSBDRkdfQ01EX0lNSQl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfTE9BRFMJfCBcCi0JCQkJIENGR19DTURfTE9BREIJfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX01JU0MJfCBcCi0JCQkJIENGR19DTURfTkVUCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfUlVOCXwgXAotCQkJCSBDRkdfQ01EX1NBVkVTCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKworI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI3VuZGVmIENPTkZJR19DTURfQk9PVEQKKyN1bmRlZiBDT05GSUdfQ01EX0NPTlNPTEUKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX0lNTFMKKyN1bmRlZiBDT05GSUdfQ01EX0lURVNUCisjdW5kZWYgQ09ORklHX0NNRF9ORlMKKyN1bmRlZiBDT05GSUdfQ01EX1NFVEdFVERDUgorI3VuZGVmIENPTkZJR19DTURfWElNRworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBNSVNDCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVAxUzEwLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVAxUzEwLmgKaW5kZXggNmVjYTlmMi4uN2M1MjZmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VQMVMxMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FUDFTMTAuaApAQCAtMTU0LDI1ICsxNTQsMzUgQEAKICNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC4yLjIxCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTkyLjE2OC4yLjE2CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSAl8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkJfCBcCi0JCQkJIENGR19DTURfSVJRCXwgXAotCQkJCSBDRkdfQ01EX0xPQURTCXwgXAotCQkJCSBDRkdfQ01EX0xPQURCCXwgXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8IFwKLQkJCQkgQ0ZHX0NNRF9NSVNDCXwgXAotCQkJCSBDRkdfQ01EX05FVAl8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCSBDRkdfQ01EX1JVTgl8IFwKLQkJCQkgQ0ZHX0NNRF9TQVZFUwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JVTgorI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1JU0MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FUDFTNDAuaCBiL2luY2x1ZGUvY29uZmlncy9FUDFTNDAuaAppbmRleCA5NzZlNzlhLi4xZmU4ZjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVAxUzQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VQMVM0MC5oCkBAIC0xNTQsMjUgKzE1NCwzNSBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjIuMjEKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjIuMTYKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSBDRkdfQ01EX0VDSE8JfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNICXwgXAotCQkJCSBDRkdfQ01EX0lNSQl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfTE9BRFMJfCBcCi0JCQkJIENGR19DTURfTE9BREIJfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX01JU0MJfCBcCi0JCQkJIENGR19DTURfTkVUCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfUlVOCXwgXAotCQkJCSBDRkdfQ01EX1NBVkVTCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTUlTQwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VQODh4LmggYi9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaAppbmRleCA3Mzg3NjNiLi44OWUwZWViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaApAQCAtNTAsMTUgKzUwLDI1IEBACiAjZGVmaW5lIENGR184eHhfQ1BVQ0xLX01JTgkJNDAwMDAwMDAKICNkZWZpbmUgQ0ZHXzh4eF9DUFVDTEtfTUFYCQkxMzMwMDAwMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgXAotCQkJCXwgQ0ZHX0NNRF9JTU1BUCAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgXAotCQkJCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIEF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZlMDYwMDAwIgkvKiBBdXRvYm9vdCBjb21tYW5kCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVJJQy5oIGIvaW5jbHVkZS9jb25maWdzL0VSSUMuaAppbmRleCBjMjAzYWVhLi41ZDQ4ZDJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVJJQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FUklDLmgKQEAgLTk2LDIzICs5NiwyNiBAQAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkxCS8qIFBIWSBhZGRyZXNzCQkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VOVgl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNIKQogCiAvKgotICogI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0lSUSB8IFwKLSAqCQkJCSBDRkdfQ01EX0tHREIgfCBDRkdfQ01EX0kyQyB8IENGR19DTURfRUVQUk9NIHwgXAotICoJCQkJIENGR19DTURfRU5WIHwgQ0ZHX0NNRF9GTEFTSCkKKyAqIEJPT1RQIG9wdGlvbnMKICAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogQ0ZHX0NNRF9FTlYgZXN0IGRlZmluaWUgKi8KLS8qCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSVJRIHwgQ0ZHX0NNRF9LR0RCKSAmIH4oQ0ZHX0NNRF9FTlYpKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMjEsNyArMTI0LDcgQEAKICAqLwogI3VuZGVmCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMjUsNyArMzI4LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNjUsNyArMzY4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FU1RFRU0xOTJFLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVNURUVNMTkyRS5oCmluZGV4IGIxNzZjNmYuLjY2ZTEyMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FU1RFRU0xOTJFLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VTVEVFTTE5MkUuaApAQCAtNzAsMTAgKzcwLDIxIEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSJCT09UOiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FVFgwOTQuaCBiL2luY2x1ZGUvY29uZmlncy9FVFgwOTQuaAppbmRleCBkNTVlYjdkLi5lZDQzOWIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVRYMDk0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VUWDA5NC5oCkBAIC04MiwxNyArODIsMjkgQEAKIAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE3OSw3ICsxOTEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVZCNjQyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCmluZGV4IDc4ZTU3MTYuLjFjNDRhMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCkBAIC0xMDMsMjEgKzEwMywzMCBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDICAgICAgICAgICAgICAgICAgLyogdW5kZWYgdG8gZGlzYWJsZSAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9BU0tFTlYpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM5MSw3ICs0MDAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcwkJICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VYQklUR0VOLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaAppbmRleCBkODViZTQyLi5hM2YzOGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaApAQCAtODIsMTAgKzgyLDIxIEBACiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtOTQsNyArMTA1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjA2LDcgKzIxNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRkFEUzgyMy5oIGIvaW5jbHVkZS9jb25maWdzL0ZBRFM4MjMuaAppbmRleCAxYjU2MmQ2Li5hNTYyYjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRkFEUzgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9GQURTODIzLmgKQEAgLTQ2LDcgKzQ2LDYgQEAKICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCiAKLS8qTm93IGluY2x1ZGVkIGJ5IENGR19DTURfUENNQ0lBICovCiAvKiNkZWZpbmUgQ09ORklHX1BDTUNJQQkJMQkvICogVG8gZW5hYmxlIFBDTUNJQSBzdXBwb3J0ICovCiAKIC8qIFZpZGVvIHJlbGF0ZWQgKi8KQEAgLTEwNSwxNyArMTA0LDM5IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIjo+IgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTAsNyArMjExLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ZBRFM4NTBTQVIuaCBiL2luY2x1ZGUvY29uZmlncy9GQURTODUwU0FSLmgKaW5kZXggMmE5ODZmMC4uYzhjZTI1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0ZBRFM4NTBTQVIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRkFEUzg1MFNBUi5oCkBAIC02MSwxNSArNjEsMjggQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI3VuZGVmCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCQkiOj4iCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNDgsNyArMTYxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ZMQUdBRE0uaCBiL2luY2x1ZGUvY29uZmlncy9GTEFHQURNLmgKaW5kZXggOGJhYmVlMS4uNDMxODQ0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0ZMQUdBRE0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRkxBR0FETS5oCkBAIC02MiwyMSArNjIsMzkgQEAKIC8qI2RlZmluZQlDT05GSUdfV0FUQ0hET0cqLwkvKiB3YXRjaGRvZyBlbmFibGVkCQkqLwogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0lNSSB8IENGR19DTURfQ0FDSEUgfCBcCi0JCUNGR19DTURfTUVNT1JZIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTE9BREIgfCBDRkdfQ01EX0xPQURTIHwgXAotCQlDRkdfQ01EX0VOViB8IENGR19DTURfUkVHSU5GTyB8IENGR19DTURfSU1NQVAgfCBDRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIkVFRz4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTUyLDcgKzE3MCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9GUFM4NTBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvRlBTODUwTC5oCmluZGV4IDBkZDIxYmMuLjMyMjE1OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9GUFM4NTBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ZQUzg1MEwuaApAQCAtNjAsMjQgKzYwLDQ1IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAoIENPTkZJR19DTURfREZMICYJCX4oIFwKLQkJCQkJQ0ZHX0NNRF9DT05TT0xFCXwgXAotCQkJCQlDRkdfQ01EX0JESQl8IFwKLQkJCQkJQ0ZHX0NNRF9MT0FEUwl8IFwKLQkJCQkJQ0ZHX0NNRF9MT0FEQgl8IFwKLQkJCQkJQ0ZHX0NNRF9DQUNIRQkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI3VuZGVmIENPTkZJR19DTURfQ09OU09MRQorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKyN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTYwLDcgKzE4MSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9GUFM4NjBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvRlBTODYwTC5oCmluZGV4IDQyM2Q3NGUuLmY4Njk4YjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9GUFM4NjBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ZQUzg2MEwuaApAQCAtNTgsMjYgKzU4LDQ1IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTlRQU0VSVkVSCisjZGVmaW5lIENPTkZJR19CT09UUF9USU1FT0ZGU0VUCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNjAsNyArMTc5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0cyMDAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaAppbmRleCBkYjQyZmQwLi45YzcxM2M2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaApAQCAtODgsMjAgKzg4LDMyIEBACiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTEyMCw3ICsxMzIsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMjQsNyArMzM2LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HRU44NjBULmggYi9pbmNsdWRlL2NvbmZpZ3MvR0VOODYwVC5oCmluZGV4IDY2MTNmOTAuLmJmYmYzYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9HRU44NjBULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dFTjg2MFQuaApAQCAtMTMyLDkgKzEzMiwxMiBAQAogLyoKICAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJCQkoIENPTkZJR19CT09UUF9ERUZBVUxUCQl8IFwKLQkJCQkJCQkJCSAgCSAgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSAgIFwKLQkJCQkJCQkJCQkpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCiAgKiBUaGUgR0VOODYwVCBuZXR3b3JrIGludGVyZmFjZSB1c2VzIHRoZSBvbi1jaGlwIDEwLzEwMCBGRUMgd2l0aApAQCAtMjIyLDM1ICsyMjUsMzAgQEAKIAkJCQkJCQkJQ0ZHX1BPU1RfVUFSVAkJfCBcCiAJCQkJCQkJCUNGR19QT1NUX1NQUiApCiAKLSNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHCQkwCi0jZW5kaWYKIAogLyoKLSAqIExpc3Qgb2YgYXZhaWxhYmxlIG1vbml0b3IgY29tbWFuZHMuICBVc2UgdGhlIHN5c3RlbSBkZWZhdWx0IGxpc3QKLSAqIHBsdXMgYWRkIHNvbWUgb2YgdGhlICJub24tc3RhbmRhcmQiIGNvbW1hbmRzIGJhY2sgaW4uCi0gKiBTZWUgLi9jbWRfY29uZmRlZnMuaAorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNkZWZpbmUgQkFTRV9DT05GSUdfQ09NTUFORFMJKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9JMkMJCXwgXAotCQkJCQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCQkJCQlDRkdfQ01EX0VMRgkJfCBcCi0JCQkJCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9GUEdBCXwgXAotCQkJCQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCQkJCQlDRkdfQ01EX1BPU1RfRElBRyApCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0ZQR0EKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKIAogI2lmICFkZWZpbmVkKENPTkZJR19TQykKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTICggQkFTRV9DT05GSUdfQ09NTUFORFMgfCBDRkdfQ01EX0RPQyApCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJQkFTRV9DT05GSUdfQ09NTUFORFMKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QT1NUCisjZGVmaW5lIENPTkZJR19DTURfRElBRwogI2VuZGlmCiAKIC8qCkBAIC0yNzksMTEgKzI3Nyw2IEBACiAjZGVmaW5lIENGR19GUEdBX1BST0dfRkVFREJBQ0sKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgYW55IENPTkZJR19DT01NQU5EUwotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKIC8qCkBAIC0zMDYsNyArMjk5LDcgQEAKIC8qCiAgKiBTZXQgYnVmZmVyIHNpemUgZm9yIGNvbnNvbGUgSS9PCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkJMTAyNAogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJCTI1NgpAQCAtNDcxLDcgKzQ2NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAkJNAkvKiBsb2cgYmFzZSAyIG9mIGFib3ZlIHZhbHVlCQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HRU5JRVRWLmggYi9pbmNsdWRlL2NvbmZpZ3MvR0VOSUVUVi5oCmluZGV4IDhjMDFkOTcuLjc4NTM1NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9HRU5JRVRWLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dFTklFVFYuaApAQCAtMTA1LDE1ICsxMDUsMjggQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI6PiIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkzLDcgKzIwNiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HVEguaCBiL2luY2x1ZGUvY29uZmlncy9HVEguaAppbmRleCAwM2I5NjU5Li43OWY1NzE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvR1RILmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dUSC5oCkBAIC05NywxOCArOTcsMzIgQEAKICNlcnJvciBCb3RoIENPTkZJR19TQ0MxX0VORVQgYW5kIENPTkZJR19GRUNfRU5FVCBjb25maWd1cmVkCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0lERSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorCisKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI9PiIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkwLDcgKzIwNCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ISDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKaW5kZXggZjM2Nzc3YS4uZWE4ZTYxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKQEAgLTk4LDI2ICs5OCw0MCBAQAogI2RlZmluZSBDT05GSUdfVklERU9fQk1QX0daSVAJCS8qIGd6aXAgY29tcHJlc3NlZCBibXAgaW1hZ2VzCSovCiAjZGVmaW5lIENGR19WSURFT19MT0dPX01BWF9TSVpFCSgyIDw8IDIwKQkvKiBmb3IgZGVjb21wcmVzc2VkIGltZyAqLwogCi0jZGVmaW5lIEFERF9CTVBfQ01ECQlDRkdfQ01EX0JNUAotI2Vsc2UKLSNkZWZpbmUgQUREX0JNUF9DTUQJCTAKICNlbmRpZiAvKiBDT05GSUdfVklERU8gKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUFERF9CTVBfQ01ECXwgXAotCQkJCUNGR19DTURfRUVQUk9NICApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisjaWZkZWYgQ09ORklHX1ZJREVPCisjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTI3LDkgKzE0MSw2IEBACiAjZGVmaW5lIENPTkZJR19BVVRPX1VQREFURSAgICAgIDEgICAgICAgLyogYXV0b3VwZGF0ZSB2aWEgY29tcGFjdGZsYXNoICAqLwogI3VuZGVmIENPTkZJR19BVVRPX1VQREFURV9TSE9XICAgICAgICAgIC8qIHVzZSBib2FyZCBzaG93IHJvdXRpbmUgICAgICAgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYgIENPTkZJR19CWklQMgkgLyogaW5jbHVkZSBzdXBwb3J0IGZvciBiemlwMiBjb21wcmVzc2VkIGltYWdlcyAqLwogI3VuZGVmICBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMTQ2LDcgKzE1Nyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM1Niw3ICszNjcsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MgICAgKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUgICAgICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ISURERU5fRFJBR09OLmggYi9pbmNsdWRlL2NvbmZpZ3MvSElEREVOX0RSQUdPTi5oCmluZGV4IDY4NjQ3NDAuLjI2ZGQ5NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ISURERU5fRFJBR09OLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0hJRERFTl9EUkFHT04uaApAQCAtNTIsMTYgKzUyLDI3IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogI2RlZmluZSBDT05GSUdfRFJBTV9TUEVFRAkxMDAJCS8qIE1IegkJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgIENGR19DTURfRUVQUk9NIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJICBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgIENGR19DTURfTkVUCXwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMzYzLDcgKzM3NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSE1JMTAuaCBiL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCmluZGV4IDdjY2U4NzYuLjAyYWU1ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCkBAIC0xMTcsNyArMTE3LDE1IEBACiAKICNkZWZpbmUgQ09ORklHX0NBTl9EUklWRVIJMQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZW5hYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTEyNSwzMSArMTMzLDI1IEBACiAjZGVmaW5lIENPTkZJR19SVENfRFMxMzM3CQkvKiBVc2UgZHMxMzM3IHJ0YyB2aWEgaTJjCSovCiAjZGVmaW5lIENGR19JMkNfUlRDX0FERFIgMHg2OAkJLyogYXQgYWRkcmVzcyAweDY4CQkqLwogCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKICNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTE2NCw3ICsxNjYsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNDcsNyArMjQ5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0hVQjQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0hVQjQwNS5oCmluZGV4IDg4Y2M2YTQuLmVkNjY5YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9IVUI0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSFVCNDA1LmgKQEAgLTYwLDE4ICs2MCwzMCBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC04OCw3ICsxMDAsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNTAsNyArMjYyLDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JQUQyMTAuaCBiL2luY2x1ZGUvY29uZmlncy9JQUQyMTAuaAppbmRleCAzNWQ4NGFlLi5iZDA4OTRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvSUFEMjEwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lBRDIxMC5oCkBAIC04NCw3ICs4NCwxNSBAQAogCiAvKiAjZGVmaW5lCUNPTkZJR19TVEFUVVNfTEVECTEqLwkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogIyB1bmRlZiAgQ09ORklHX1NDQzFfRU5FVAkJLyogZGlzYWJsZSBTQ0MxIGV0aGVybmV0ICovCiAjIGRlZmluZSBDT05GSUdfRkVDX0VORVQgICAgMQkvKiB1c2UgRkVDIGV0aGVybmV0ICAqLwpAQCAtMTIzLDIwICsxMzEsMjMgQEAKIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIxNyw3ICsyMjgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSUNVODYyLmggYi9pbmNsdWRlL2NvbmZpZ3MvSUNVODYyLmgKaW5kZXggY2QxNzkzNS4uMjdhNWJjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lDVTg2Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9JQ1U4NjIuaApAQCAtODEsNyArODEsMTUgQEAKIAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjdW5kZWYJQ09ORklHX1NDQzFfRU5FVAkJLyogZGlzYWJsZSBTQ0MxIGV0aGVybmV0ICovCiAjZGVmaW5lCUNPTkZJR19GRUNfRU5FVAkJMQkvKiB1c2UgRkVDIGV0aGVybmV0ICAqLwpAQCAtMTIzLDI1ICsxMzEsMjggQEAKIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI4LDcgKzIzOSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JRFM4MjQ3LmggYi9pbmNsdWRlL2NvbmZpZ3MvSURTODI0Ny5oCmluZGV4IDI5ZWI4NzQuLjg1ZDJiYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9JRFM4MjQ3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lEUzgyNDcuaApAQCAtMTI4LDkgKzEyOCw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KLSAqCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MgICAgICAgKi8KICNkZWZpbmUJQ09ORklHX0VUSEVSX09OX0ZDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIEZDQyAgICAgICAqLwpAQCAtMTU5LDI0ICsxNTcsMzQgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzQsNyArMjQyLDcgQEAKICAqIE5BTkQtRkxBU0ggc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAjZGVmaW5lIENGR19OQU5EMF9CQVNFIDB4RTEwMDAwMDAKQEAgLTI5NSw3ICszMDMsNyBAQAogI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgZG97ICoodm9sYXRpbGUgX191OCAqKSgodW5zaWduZWQgbG9uZykoYWRyICsgMHgwKSkgPSAoX191OClkOyB9IHdoaWxlKDApCiAjZGVmaW5lIFJFQURfTkFORChhZHIpICgodm9sYXRpbGUgdW5zaWduZWQgY2hhcikoKih2b2xhdGlsZSBfX3U4ICopKHVuc2lnbmVkIGxvbmcpKGFkciArIDB4MCkpKQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYgLyogQ09ORklHX0NNRF9OQU5EICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEhhcmQgUmVzZXQgQ29uZmlndXJhdGlvbiBXb3JkcwpAQCAtMzU1LDcgKzM2Myw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgICAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTQ3NCw3ICs0ODIsNyBAQAogI2RlZmluZSBDRkdfT1IwX1BSRUxJTSAgKE1FR19UT19BTShDRkdfRkxBU0hfU0laRSkgICAgICB8XAogCQkJIE9SeEdfU0NZXzZfQ0xLICAgICAgICAgICAgICAgICApCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogLyogQmFuayAxIC0gTkFORCBGbGFzaAogKi8KICNkZWZpbmUJQ0ZHX05BTkRfQkFTRQkJQ0ZHX05BTkQwX0JBU0UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JUDg2MC5oIGIvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKaW5kZXggMGUyMGU1Ni4uYmQ5NjFkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKQEAgLTg4LDI4ICs4OCwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDIsNyArMjA2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0lQSEFTRTQ1MzkuaCBiL2luY2x1ZGUvY29uZmlncy9JUEhBU0U0NTM5LmgKaW5kZXggYzE1NjVmYy4uNmZlZTQ1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lQSEFTRTQ1MzkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSVBIQVNFNDUzOS5oCkBAIC02Nyw4ICs2Nyw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLwpAQCAtOTUsNyArOTQsMTQgQEAKICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjY2NjY2NjYJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxOTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogLyoKICAqIHNlbGVjdCBpMmMgc3VwcG9ydCBjb25maWd1cmF0aW9uCkBAIC0xMjQsMTcgKzEzMCwxOCBAQAogI2RlZmluZSBJMkNfREVMQVkJdWRlbGF5KDUpCS8qIDEvNCBJMkMgY2xvY2sgZHVyYXRpb24gKi8KICNlbmRpZiAvKiBDT05GSUdfU09GVF9JMkMgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCUNPTkZJR19DTURfREZMCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDEwMDAwMCIJLyogYXV0b2Jvb3QgY29tbWFuZCAqLwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvcmFtIHJ3IgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xNDksNyArMTU2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjU3LDcgKzI2NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyICAgICAvKiBGb3IgTVBDODI2MCBDUFUJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0lTUEFOLmggYi9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaAppbmRleCA3MDZiZGI5Li45NjViNTE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaApAQCAtNTgsOCArNTgsNyBAQAogICogZm9yIEZDQykuCiAgKgogICogSWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIEV0aGVybmV0IHJvdXRpbmVzIG11c3QKLSAqIGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBEZWZpbmUgaWYgRXRoZXJuZXQgb24gU0NDCQkqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBEZWZpbmUgaWYgRXRoZXJuZXQgb24gRkNDCQkqLwpAQCAtMTA2LDE3ICsxMDUsMjggQEAKICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjU1MzYwMDAJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCAgXAotCQkJCXwgQ0ZHX0NNRF9BU0tFTlYgIFwKLQkJCQl8IENGR19DTURfREhDUCAgICBcCi0JCQkJfCBDRkdfQ01EX0lNTUFQICAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgIFwKLQkJCQl8IENGR19DTURfUElORyAgICBcCi0JCQkJfCBDRkdfQ01EX1JFR0lORk8gXAotCQkJCSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZlMDEwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSVZNTDI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvSVZNTDI0LmgKaW5kZXggYTBjYjFkZC4uMTE0MmYyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lWTUwyNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9JVk1MMjQuaApAQCAtNzIsMjQgKzcyLDMzIEBACiAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0lERSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKworCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgXAotICAgICgoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKSAmIH5DT05GSUdfQk9PVFBfR0FURVdBWSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTgyLDcgKzE5MSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JVk1TOC5oIGIvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKaW5kZXggNDZiNGQ1My4uYmQxOWRhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKQEAgLTcyLDI0ICs3MiwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19TVEFUVVNfTEVECTEJLyogU3RhdHVzIExFRCBlbmFibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9JREUpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorCisKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyBcCi0gICAgKChDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpICYgfkNPTkZJR19CT09UUF9HQVRFV0FZKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNzksNyArMTg3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ljZUN1YmUuaCBiL2luY2x1ZGUvY29uZmlncy9JY2VDdWJlLmgKaW5kZXggNzNiZTA2OS4uNTMyNjE1NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9JY2VDdWJlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ljZUN1YmUuaApAQCAtMzcsMTEgKzM3LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC02OSw3ICs2NCw2IEBACiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fQlVTCTB4NTAwMDAwMDAKICNkZWZpbmUgQ09ORklHX1BDSV9JT19QSFlTCUNPTkZJR19QQ0lfSU9fQlVTCiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fU0laRQkweDAxMDAwMDAwCi0jZGVmaW5lIEFERF9QQ0lfQ01EIAkJQ0ZHX0NNRF9QQ0kKICNlbmRpZgogCiAjZGVmaW5lIENGR19YTEJfUElQRUxJTklORwkxCkBAIC04MCwxMSArNzQsOCBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4ICAvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAgICovCiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAKLSNlbHNlCS8qIE1QQzUxMDAgKi8KLQorI2Vsc2UKICNkZWZpbmUgQ09ORklHX01JSQkJMQotI2RlZmluZSBBRERfUENJX0NNRAkJMCAgLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KLQogI2VuZGlmCiAKIC8qIFBhcnRpdGlvbnMgKi8KQEAgLTkzLDMxICs4NCw0NCBAQAogI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTgogCiAvKiBVU0IgKi8KLSNpZiAxCi0jZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICBDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICAwCi0jZW5kaWYKKyNkZWZpbmUgQ0ZHX09IQ0lfQkVfQ09OVFJPTExFUgorI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkxCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJTVBDNVhYWF9VU0IKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkibXBjNTIwMCIKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTCTE1CiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUFERF9QQ0lfQ01ECXwgXAotCQkJCUFERF9VU0JfQ01ECSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorCiAKICNpZiAoVEVYVF9CQVNFID09IDB4RkYwMDAwMDApCQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCSAgICAgICAgMQpAQCAtMzEyLDcgKzMxNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0zMjgsNiArMzMyLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0pTRS5oIGIvaW5jbHVkZS9jb25maWdzL0pTRS5oCmluZGV4IDdmYTllZDIuLmVhM2IwYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9KU0UuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSlNFLmgKQEAgLTEzNSwyMCArMTM1LDMyIEBACiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTEJLyogUEhZIGFkZHJlc3MJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNICXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogICAvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogI3VuZGVmIENPTkZJR19XQVRDSERPRwpAQCAtMTY3LDcgKzE3OSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI3Miw3ICsyODQsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1R1ByIENQVXMJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtMjk4LDcgKzMxMCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvS0FSRUYuaCBiL2luY2x1ZGUvY29uZmlncy9LQVJFRi5oCmluZGV4IDQ4Yjk0ZWUuLjM2NDRlNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9LQVJFRi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9LQVJFRi5oCkBAIC0xNzgsMjMgKzE3OCwzNCBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUiAgICAgMzIJICAgICAvKiAjZXRoIHJ4IGJ1ZmYgJiBkZXNjcnMJKi8KIAogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb25zb2xlL0NvbW1hbmRzL1BhcnNlcgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKwogCiAvKiBJbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQpAQCAtMjAzLDEwICsyMTQsNiBAQAogI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURSAxCiAjZGVmaW5lIENGR19BTFRfTUVNVEVTVAkgICAgIDEJICAgICAvKiB1c2UgcmVhbCBtZW1vcnkgdGVzdAkgKi8KIAotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJICAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICJLYVJlZkRlcz0+ICIgIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIApAQCAtMjE3LDcgKzIyNCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBDb25zb2xlIEJ1ZmZlcgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgIDEwMjQJICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAyNTYJICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMjc5LDcgKzI4Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCSAgICAgIDgxOTIJICAgICAvKiBGb3IgQU1DQyA0MDUgQ1BVcwkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgNQkJICAgICAvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSAqLwogI2VuZGlmCiAKQEAgLTI5MSw3ICsyOTgsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECSAgICAgIDB4MDEJICAgICAvKiBOb3JtYWwgUG93ZXJPbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JICAgICAgMHgwMgkgICAgIC8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUgIDIzMDQwMAkgICAgIC8qIGtnZGIgc2VyaWFsIHBvcnQgYmF1ZAkqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVggMgkJICAgICAvKiBrZ2RiIHNlcmlhbCBwb3J0CSovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9LVVA0Sy5oIGIvaW5jbHVkZS9jb25maWdzL0tVUDRLLmgKaW5kZXggOWI5NTBmYy4uZjZjMzFlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0tVUDRLLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0tVUDRLLmgKQEAgLTg5LDcgKzg5LDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTU2LDMyICsxNjQsMzEgQEAKICNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9DUFUJICAgfCBcCiAJCQkJIENGR19QT1NUX1JUQwkgICB8IFwKIAkJCQkgQ0ZHX1BPU1RfSTJDKQorI2VuZGlmCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCiAjZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNjksNyArMjc2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0tVUDRYLmggYi9pbmNsdWRlL2NvbmZpZ3MvS1VQNFguaAppbmRleCBjZDM4YjBmLi5lNTU4YWE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvS1VQNFguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvS1VQNFguaApAQCAtOTksNyArOTksMTUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xNjcsMzQgKzE3NSwzMyBAQAogI2RlZmluZSBDT05GSUdfUE9TVAkJKENGR19QT1NUX0NQVQkgICB8IFwKIAkJCQkgQ0ZHX1BPU1RfUlRDCSAgIHwgXAogCQkJCSBDRkdfUE9TVF9JMkMpCisjZW5kaWYKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorI2RlZmluZSBDT05GSUdfQ01EX1VTQgogCiAjaWZkZWYgQ09ORklHX1BPU1QKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgQ0ZHX0NNRF9ESUFHCi0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKICNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BPU1RfRElBRwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQkJQ0ZHX0NNRF9VU0IJKQotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4MSw3ICsyODgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTEFOVEVDLmggYi9pbmNsdWRlL2NvbmZpZ3MvTEFOVEVDLmgKaW5kZXggZTQ0ZjFjYy4uNDZlZGQwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0xBTlRFQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9MQU5URUMuaApAQCAtNzQsNjQgKzc0LDY4IEBACiAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NNRF9NSU5JTUFMCTAKLSNkZWZpbmUgQ09ORklHX0NNRF9USU5ZCQkoQ0ZHX0NNRF9GTEFTSCAgfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX0xPQURTICB8IFwKLQkJCQkgQ0ZHX0NNRF9MT0FEQikKLSNkZWZpbmUgQ09ORklHX0NNRF9OT1JNQUwJKENPTkZJR19DTURfREZMICYgfkNGR19DTURfQk9PVEQgJiB+Q0ZHX0NNRF9SRUlTRVIpCi0jZGVmaW5lIENPTkZJR19DTURfR0RCCQkoQ09ORklHX0NNRF9OT1JNQUwgfCBDRkdfQ01EX0tHREIpCi0jZGVmaW5lIENPTkZJR19DTURfRlVMTAkJKENGR19DTURfQUxMICYgfkNGR19DTURfQkVEQlVHCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0JNUAlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9CU1AJXAotCQkJCQkgICAgICYgfkNGR19DTURfRElTUExBWQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9ET0MJXAotCQkJCQkgICAgICYgfkNGR19DTURfRFRUCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0VFUFJPTQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9FTEYJXAotCQkJCQkgICAgICYgfkNGR19DTURfRVhUMglcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9GREMJXAotCQkJCQkgICAgICYgfkNGR19DTURfRkRPUwlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9IV0ZMT1cJXAotCQkJCQkgICAgICYgfkNGR19DTURfSTJDCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0lERQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9JUlEJXAotCQkJCQkgICAgICYgfkNGR19DTURfSkZGUzIJXAotCQkJCQkgICAgICYgfkNGR19DTURfS0dEQglcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9NSUkJXAotCQkJCQkgICAgICYgfkNGR19DTURfTU1DCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX05BTkQJXAotCQkJCQkgICAgICYgfkNGR19DTURfUENJCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX1BDTUNJQQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9SRUlTRVIJXAotCQkJCQkgICAgICYgfkNGR19DTURfU0NTSQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9TUEkJXAotCQkJCQkgICAgICYgfkNGR19DTURfVU5JVkVSU0VcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9VU0IJXAotCQkJCQkgICAgICYgfkNGR19DTURfVkZECVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX1hJTUcJKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKKyN1bmRlZiBDT05GSUdfQ01EX0JNUAorI3VuZGVmIENPTkZJR19DTURfQlNQCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0VYVDIKKyN1bmRlZiBDT05GSUdfQ01EX0ZEQworI3VuZGVmIENPTkZJR19DTURfRkRPUworI3VuZGVmIENPTkZJR19DTURfSFdGTE9XCisjdW5kZWYgQ09ORklHX0NNRF9JMkMKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSVJRCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX1BDSQorI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisjdW5kZWYgQ09ORklHX0NNRF9SRUlTRVIKKyN1bmRlZiBDT05GSUdfQ01EX1NDU0kKKyN1bmRlZiBDT05GSUdfQ01EX1NQSQorI3VuZGVmIENPTkZJR19DTURfVU5JVkVSU0UKKyN1bmRlZiBDT05GSUdfQ01EX1VTQgorI3VuZGVmIENPTkZJR19DTURfVkZECisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKKyNpZiAhKENPTkZJR19MQU5URUMgPj0gMikKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisgICAgI3VuZGVmIENPTkZJR19DTURfTkVUCisjZW5kaWYKKwogCiAjaWYgQ09ORklHX0xBTlRFQyA+PSAyCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogI2VuZGlmCiAKLSNpZiBDT05GSUdfTEFOVEVDID49IDIKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwlDT05GSUdfQ01EX0ZVTEwKLSNlbHNlCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfRlVMTCAmIH5DRkdfQ01EX0RBVEUgJiB+Q0ZHX0NNRF9ORVQpCi0jZW5kaWYKLQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDMsNyArMjA3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL001MjcxRVZCLmggYi9pbmNsdWRlL2NvbmZpZ3MvTTUyNzFFVkIuaAppbmRleCBmMGZjMDEzLi44ODVhODgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTTUyNzFFVkIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTTUyNzFFVkIuaApAQCAtNjUsMTUgKzY1LDMxIEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9ORVQgKSAmIH4oQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfTE9BREIpKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKworI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURCCisKIAogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL001MjcyQzMuaCBiL2luY2x1ZGUvY29uZmlncy9NNTI3MkMzLmgKaW5kZXggNWZkNmE5NS4uY2M0NTZkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL001MjcyQzMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTTUyNzJDMy5oCkBAIC02MCwxNyArNjAsMzMgQEAKICNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICggQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0xPQURCKSB8IFwKLQkJCSAgIENGR19DTURfTUlJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorCisKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKICNkZWZpbmUgQ0ZHX1BST01QVAkJIi0+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NNTI4MkVWQi5oIGIvaW5jbHVkZS9jb25maWdzL001MjgyRVZCLmgKaW5kZXggY2JiM2UzYi4uZjJhNzY0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL001MjgyRVZCLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL001MjgyRVZCLmgKQEAgLTUxLDE2ICs1MSwzMCBAQAogI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgKCBDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfTE9BREIpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorCisKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKICNkZWZpbmUgQ0ZHX1BST01QVAkJIi0+ICIKICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NQlguaCBiL2luY2x1ZGUvY29uZmlncy9NQlguaAppbmRleCBkNmUzZmI4Li5kOWYyYWRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUJYLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01CWC5oCkBAIC03MSwxNCArNzEsMjggQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDRkdfQ01EX05FVCB8IENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9TRFJBTSB8IFwKLQkJCSAgICAgIENGR19DTURfUENNQ0lBIHwgQ0ZHX0NNRF9JREUgKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0RGTAorI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisjZGVmaW5lIENPTkZJR19DTURfSURFCisKIAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTg4LDcgKzEwMiw3IEBACiAjaWZkZWYJQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xODcsNyArMjAxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01CWDg2MFQuaCBiL2luY2x1ZGUvY29uZmlncy9NQlg4NjBULmgKaW5kZXggMGNhMDk3MC4uNjlkMTk1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01CWDg2MFQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUJYODYwVC5oCkBAIC0xNTEsNyArMTUxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01FVFJPQk9YLmggYi9pbmNsdWRlL2NvbmZpZ3MvTUVUUk9CT1guaAppbmRleCA3YWFlMmJkLi44ZDdlYzU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUVUUk9CT1guaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUVUUk9CT1guaApAQCAtMjQyLDI2ICsyNDIsMzMgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIgICAgIDMyCSAgICAgLyogI2V0aCByeCBidWZmICYgZGVzY3JzCSovCiAKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29uc29sZS9Db21tYW5kcy9QYXJzZXIKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVCkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRicyAwOS1NYXJjaC0yMDA1IFJlbW92ZWQgdG8gYmUgYWJsZSB0byB1c2UgMm5kIHNlcmlhbCAqLwotLyoJCQkJICBDRkdfQ01EX0tHREIJICB8IFwgKi8KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCiAKIAogLyogSW5jbHVkZSBOZXRDb25zb2xlIHN1cHBvcnQgKi8KQEAgLTI3MiwxMCArMjc5LDYgQEAKICNkZWZpbmUgQ09ORklHX0FVVE9fQ09NUExFVEUgMQogI2RlZmluZSBDRkdfQUxUX01FTVRFU1QJICAgICAxCSAgICAgLyogdXNlIHJlYWwgbWVtb3J5IHRlc3QJICovCiAKLQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCSAgICAgLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAiTWV0cm9Cb3g9PiAiICAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCiAKQEAgLTI4Niw3ICsyODksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ29uc29sZSBCdWZmZXIKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAxMDI0CSAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgMjU2CSAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTM0OCw3ICszNTEsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkgICAgICA4MTkyCSAgICAgLyogRm9yIEFNQ0MgNDA1IENQVXMJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgIDMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVCAgIDUJCSAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgKi8KICNlbmRpZgogCkBAIC0zNjAsNyArMzYzLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkgICAgICAweDAxCSAgICAgLyogTm9ybWFsIFBvd2VyT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCSAgICAgIDB4MDIJICAgICAvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFICAyMzA0MDAJICAgICAvKiBrZ2RiIHNlcmlhbCBwb3J0IGJhdWQJKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYIDIJCSAgICAgLyoga2dkYiBzZXJpYWwgcG9ydAkqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTUhQQy5oIGIvaW5jbHVkZS9jb25maWdzL01IUEMuaAppbmRleCA1MzY4NGNhLi5kZGU3NzQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUhQQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NSFBDLmgKQEAgLTExNSwyNSArMTE1LDM2IEBACiAKICNkZWZpbmUgQ09ORklHX0JSMF9XT1JLQVJPVU5ECTEKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAoIENPTkZJR19DTURfREZMICB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0RBVEUgICAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9FRVBST00gIHwgXAotCQkJICAgICAgIENGR19DTURfRUxGICAgICB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0kyQyAgICAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9KRkZTMiAgIHwgXAotCQkJICAgICAgIENGR19DTURfUkVHSU5GTyApCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI1LDcgKzIzNiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NSVA0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9NSVA0MDUuaAppbmRleCA3ZTU3YTBmLi41YjUyNmEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUlQNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01JUDQwNS5oCkBAIC01MCw0MSArNTAsNDMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkzMzAwMDAwMCAvKiBleHRlcm5hbCBmcmVxdWVuY3kgdG8gcGxsICAgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1JUDQwNV9DT01NT05fQ01EUyBcCi0JCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQlDRkdfQ01EX0VMRgl8IFwKLQkJCUNGR19DTURfRkFUCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX0lERQl8IFwKLQkJCUNGR19DTURfSVJRCXwgXAotCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCUNGR19DTURfTUlJCXwgXAotCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQlDRkdfQ01EX1NBVkVTCXwgXAotCQkJQ0ZHX0NNRF9CU1AJKQogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQNDA1VCkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCQlNSVA0MDVfQ09NTU9OX0NNRFMKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkJKE1JUDQwNV9DT01NT05fQ01EUyB8IFwKLQkJCUNGR19DTURfVVNCCXwgXAotCQkJQ0ZHX0NNRF9ET0MJKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKworI2lmICFkZWZpbmVkKENPTkZJR19NSVA0MDVUKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRE9DCiAjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTY1LDcgKzE2Nyw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2MCw3ICsyNjIsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMHg0MDAwCS8qIEZvciBBTUNDIDQwNUdQciBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDI2LDcgKzQyOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEZWJ1ZyBzdXBwb3J0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01MMi5oIGIvaW5jbHVkZS9jb25maWdzL01MMi5oCmluZGV4IGQ4ODA1ZWEuLmY0ODgyNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NTDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUwyLmgKQEAgLTc2LDIwICs3NiwzMSBAQAogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKChDT05GSUdfQ01EX0RGTCAmIFwKLQkJCQkgICAgIH4oIENGR19DTURfTkVUIHwgXAotCQkJCQlDRkdfQ01EX1JUQyB8IFwKLQkJCQkJQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJCUNGR19DTURfSTJDICAgXAotCQkJCSAgICAgICkgKSB8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0tHREIJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgkgICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisjdW5kZWYgQ09ORklHX0NNRF9SVEMKKyN1bmRlZiBDT05GSUdfQ01EX1BDSQorI3VuZGVmIENPTkZJR19DTURfSTJDCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMDIsNyArMTEzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTk1LDcgKzIwNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjM2LDcgKzI0Nyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTU9VU1NFLmggYi9pbmNsdWRlL2NvbmZpZ3MvTU9VU1NFLmgKaW5kZXggNmFkMmZlYi4uOTM3MGMyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01PVVNTRS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NT1VTU0UuaApAQCAtNTgsMTQgKzU4LDMxIEBACiAjZW5kaWYKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgICAgImNvbnNvbGU9dHR5UzAgcm9vdD0vZGV2L25mcyBydyBuZnNyb290PTIwOS4xMjguOTMuMTMzOi9ib290IG5mc2FkZHJzPTIwOS4xMjguOTMuMTMzOjIwOS4xMjguOTMuMTM4IgogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZICAgICAzCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgIChDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0FTS0VOVnxDRkdfQ01EX0RBVEUpCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKworCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFIDEKICNkZWZpbmUgQ09ORklHX0VUSF9BRERSICAgICAgIjAwOjEwOjE4OjEwOjAwOjA2IgogCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OICAxIC8qIE1TRE9TIGJvb3RhYmxlIHBhcnRpdGlpb24gc3VwcG9ydCAqLwotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKICNpbmNsdWRlICIuLi9ib2FyZC9tb3Vzc2UvbW91c3NlLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2MEFEUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzgyNjBBRFMuaAppbmRleCA2MTk1YmNhLi43MTM1MThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2MEFEUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4MjYwQURTLmgKQEAgLTEwMSw4ICsxMDEsNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MgICAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gRkNDICAgKi8KQEAgLTE5OCw1OSArMTk3LDY5IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDRkdfRVhDTFVERQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRElTUExBWSB8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9GREMJfCBcCi0JCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCUNGR19DTURfSFdGTE9XCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfS0dEQgl8IFwKLQkJCQlDRkdfQ01EX01NQwl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQkJQ0ZHX0NNRF9SRUlTRVIJfCBcCi0JCQkJQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJCUNGR19DTURfU1BJCXwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX1VOSVZFUlNFIHwgXAotCQkJCUNGR19DTURfVVNCCXwgXAotCQkJCUNGR19DTURfVkZECXwgXAotCQkJCUNGR19DTURfWElNRworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKKyN1bmRlZiBDT05GSUdfQ01EX0JNUAorI3VuZGVmIENPTkZJR19DTURfQlNQCisjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0VYVDIKKyN1bmRlZiBDT05GSUdfQ01EX0ZBVAorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX1JFSVNFUgorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9TTlRQCisjdW5kZWYgQ09ORklHX0NNRF9VTklWRVJTRQorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKIAogI2lmIENPTkZJR19BRFNUWVBFID09IENGR184MjcyQURTCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJICAgICAgICAgQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19FWENMVURFCSkgKQorICAgICN1bmRlZiBDT05GSUdfQ01EX1NEUkFNCisgICAgI3VuZGVmIENPTkZJR19DTURfSTJDCisKICNlbGlmIENPTkZJR19BRFNUWVBFID49IENGR19QUTJGQURTCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJCSBDRkdfQ01EX1NEUkFNCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19FWENMVURFCSkgKQorICAgICN1bmRlZiBDT05GSUdfQ01EX1NEUkFNCisgICAgI3VuZGVmIENPTkZJR19DTURfSTJDCisgICAgI3VuZGVmIENPTkZJR19DTURfUENJCisKICNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJCSBDTURfQ0ZHX1BDSSAJfCBcCi0JCQkJIENGR19FWENMVURFIAkpICkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKwogI2VuZGlmIC8qIENPTkZJR19BRFNUWVBFID49IENGR19QUTJGQURTICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZmZjgwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kICovCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazIiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTI2OCw3ICsyNzcsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyICI+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzg0LDcgKzM5Myw3IEBACiAjZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0zOTcsOSArNDA2LDkgQEAKICNkZWZpbmUgQ0ZHX0JDUgkJCTB4MTAwQzAwMDAKICNkZWZpbmUgQ0ZHX1NJVU1DUgkJMHgwQTIwMDAwMAogI2RlZmluZSBDRkdfU0NDUgkJU0NDUl9ERkJSRzAxCi0jZGVmaW5lIENGR19CUjBfUFJFTElNCQlDRkdfRkxBU0hfQkFTRSB8IDB4MDAwMDE4MDEKKyNkZWZpbmUgQ0ZHX0JSMF9QUkVMSU0JCShDRkdfRkxBU0hfQkFTRSB8IDB4MDAwMDE4MDEpCiAjZGVmaW5lIENGR19PUjBfUFJFTElNCQkweEZGODAwODc2Ci0jZGVmaW5lIENGR19CUjFfUFJFTElNCQlDRkdfQkNTUiB8IDB4MDAwMDE4MDEKKyNkZWZpbmUgQ0ZHX0JSMV9QUkVMSU0JCShDRkdfQkNTUiB8IDB4MDAwMDE4MDEpCiAjZGVmaW5lIENGR19PUjFfUFJFTElNCQkweEZGRkY4MDEwCiAKIC8qV2UgbmVlZCB0byBjb25maWd1cmUgY2hpcCBzZWxlY3QgdG8gdXNlIENQTEQgUENJIElDIG9uIE1QQzgyNzJBRFMqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgyNjZBRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MjY2QURTLmgKaW5kZXggNDk1M2I3MC4uMTRiMDQxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzgyNjZBRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2NkFEUy5oCkBAIC04Myw4ICs4Myw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLwpAQCAtMTQxLDQwICsxNDAsNDMgQEAKICAqLwogI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MJMHg1MAogCi0KICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjYwMDAwMDAJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDRkdfQ01EX0FMTCAmIH4oIFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElTUExBWSB8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GREMJfCBcCi0JCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCUNGR19DTURfSFdGTE9XCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9LR0RCCXwgXAotCQkJCUNGR19DTURfTU1DCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX1BDTUNJQQl8IFwKLQkJCQlDRkdfQ01EX1JFSVNFUgl8IFwKLQkJCQlDRkdfQ01EX1NDU0kJfCBcCi0JCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUNGR19DTURfVkZECXwgXAotCQkJCUNGR19DTURfVU5JVkVSU0UgfCBcCi0JCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJQ0ZHX0NNRF9YSU1HCSkgKQorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9CTVAKKyN1bmRlZiBDT05GSUdfQ01EX0JTUAorI3VuZGVmIENPTkZJR19DTURfREFURQorI3VuZGVmIENPTkZJR19DTURfREhDUAorI3VuZGVmIENPTkZJR19DTURfRElTUExBWQorI3VuZGVmIENPTkZJR19DTURfRE9DCisjdW5kZWYgQ09ORklHX0NNRF9EVFQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfRUxGCisjdW5kZWYgQ09ORklHX0NNRF9FWFQyCisjdW5kZWYgQ09ORklHX0NNRF9GREMKKyN1bmRlZiBDT05GSUdfQ01EX0ZET1MKKyN1bmRlZiBDT05GSUdfQ01EX0hXRkxPVworI3VuZGVmIENPTkZJR19DTURfSURFCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX1JFSVNFUgorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9TTlRQCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1VOSVZFUlNFCisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKIAogLyogRGVmaW5lIGEgY29tbWFuZCBzdHJpbmcgdGhhdCBpcyBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIHdoZW4gbm8gY2hhcmFjdGVyCiAgKiBpcyByZWFkIG9uIHRoZSBjb25zb2xlIGludGVyZmFjZSB3aXRoaW5nICJCb290IERlbGF5IiBhZnRlciByZXNldC4KQEAgLTIwMiwyMSArMjA0LDE5IEBACiAJImJvb3RtIgogI2VuZGlmIC8qIENPTkZJR19CT09UX1JPT1RfTkZTICovCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TKQotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTIzMSw3ICsyMzEsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTI4Myw3ICsyODMsNiBAQAogCiAjZGVmaW5lIFNEUkFNX1NQRF9BRERSIDB4NTAKIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBCUjIsQlIzIC0gQmFzZSBSZWdpc3RlcgogICogICAgIFJlZjogU2VjdGlvbiAxMC4zLjEgb24gcGFnZSAxMC0xNApAQCAtMzgxLDcgKzM4MCw2IEBACiAjZXJyb3IgIklOVkFMSUQgU0RSQU0gQ09ORklHVVJBVElPTiIKICNlbmRpZgogCi0KICNkZWZpbmUgUlMyMzJFTl8xCQkweDAyMDAwMDAyCiAjZGVmaW5lIFJTMjMyRU5fMgkJMHgwMTAwMDAwMQogI2RlZmluZSBGRVRISUVOCQkJMHgwODAwMDAwOApAQCAtMzkzLDcgKzM5MSw2IEBACiAjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKICNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKIAotCiAvKiBVc2UgdGhpcyBIUkNXIGZvciBib290aW5nIGZyb20gYWRkcmVzcyAweGZlMDAwMDAgKEpQMyBpbiBzZXR0aW5nIDEtMikgICovCiAvKiAweDBFQjJCNjQ1ICovCiAjZGVmaW5lIENGR19IUkNXX01BU1RFUiAoKCBIUkNXX0JQUzExIHwgSFJDV19DSVAgKQkJCQl8XApAQCAtNDUwLDEzICs0NDcsMTEgQEAKICMgIGRlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwCiAjZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KIAotCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSElEeCAtIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBSZWdpc3RlcnMJCQkgMi0xMQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgzMTNFUkRCLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaAppbmRleCA3ZTEwMDVjLi44MWRiOTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaApAQCAtMjY1LDcgKzI2NSw3IEBACiAjZGVmaW5lIENPTkZJR19JMkNfQ01EX1RSRUUKICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCi0jZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJezB4Njl9CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJe3swLDB4Njl9fSAvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLwogI2RlZmluZSBDRkdfSTJDX09GRlNFVAkJMHgzMDAwCiAjZGVmaW5lIENGR19JMkMyX09GRlNFVAkJMHgzMTAwCiAKQEAgLTM0MSwyNiArMzQxLDM0IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jZGVmaW5lIENGR19CQVNFX0NPTU1BTkRTCSggQ09ORklHX0NNRF9ERkwJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0RIQ1AJCVwKLQkJCQl8IENGR19DTURfSTJDCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX1BDSSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgogCiAjZGVmaW5lIENPTkZJR19DTURMSU5FX0VESVRJTkcgMQogCi0jZGVmaW5lIENGR19SQU1CT09UX0NPTU1BTkRTCShDRkdfQkFTRV9DT01NQU5EUyAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IENGR19DTURfTE9BRFMpKQotCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIENGR19SQU1CT09UX0NPTU1BTkRTCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgQ0ZHX0JBU0VfQ09NTUFORFMKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyM0VSREIuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MzIzRVJEQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Njk3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyM0VSREIuaApAQCAtMCwwICsxLDU4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworI3VuZGVmIERFQlVHCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19FMzAwCQkxCS8qIEUzMDAgZmFtaWx5ICovCisjZGVmaW5lIENPTkZJR19RRQkJMQkvKiBIYXMgUUUgKi8KKyNkZWZpbmUgQ09ORklHX01QQzgzWFgJCTEJLyogTVBDODN4eCBmYW1pbHkgKi8KKyNkZWZpbmUgQ09ORklHX01QQzgzMlgJCTEJLyogTVBDODMyeCBDUFUgc3BlY2lmaWMgKi8KKworI2RlZmluZSBDT05GSUdfUENJCQkxCisjZGVmaW5lIENPTkZJR184M1hYX0dFTkVSSUNfUENJCTEKKworLyoKKyAqIFN5c3RlbSBDbG9jayBTZXR1cAorICovCisjZGVmaW5lIENPTkZJR184M1hYX0NMS0lOCTY2NjY2NjY3CS8qIGluIEh6ICovCisKKyNpZm5kZWYgQ09ORklHX1NZU19DTEtfRlJFUQorI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCUNPTkZJR184M1hYX0NMS0lOCisjZW5kaWYKKworLyoKKyAqIEhhcmR3YXJlIFJlc2V0IENvbmZpZ3VyYXRpb24gV29yZAorICovCisjZGVmaW5lIENGR19IUkNXX0xPVyAoXAorCUhSQ1dMX0xDTF9CVVNfVE9fU0NCX0NMS18xWDEgfFwKKwlIUkNXTF9ERFJfVE9fU0NCX0NMS18yWDEgfFwKKwlIUkNXTF9WQ09fMVgyIHxcCisJSFJDV0xfQ1NCX1RPX0NMS0lOXzJYMSB8XAorCUhSQ1dMX0NPUkVfVE9fQ1NCXzJfNVgxIHxcCisJSFJDV0xfQ0VfUExMX1ZDT19ESVZfMiB8XAorCUhSQ1dMX0NFX1BMTF9ESVZfMVgxIHxcCisJSFJDV0xfQ0VfVE9fUExMXzFYMykKKworI2RlZmluZSBDRkdfSFJDV19ISUdIIChcCisJSFJDV0hfUENJX0hPU1QgfFwKKwlIUkNXSF9QQ0kxX0FSQklURVJfRU5BQkxFIHxcCisJSFJDV0hfQ09SRV9FTkFCTEUgfFwKKwlIUkNXSF9GUk9NXzBYMDAwMDAxMDAgfFwKKwlIUkNXSF9CT09UU0VRX0RJU0FCTEUgfFwKKwlIUkNXSF9TV19XQVRDSERPR19ESVNBQkxFIHxcCisJSFJDV0hfUk9NX0xPQ19MT0NBTF8xNkJJVCB8XAorCUhSQ1dIX0JJR19FTkRJQU4gfFwKKwlIUkNXSF9MQUxFX05PUk1BTCkKKworLyoKKyAqIFN5c3RlbSBJTyBDb25maWcKKyAqLworI2RlZmluZSBDRkdfU0lDUkwJCTB4MDAwMDAwMDAKKworI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GCS8qIGNhbGwgYm9hcmRfcHJlX2luaXQgKi8KKworLyoKKyAqIElNTVIgbmV3IGFkZHJlc3MKKyAqLworI2RlZmluZSBDRkdfSU1NUgkJMHhFMDAwMDAwMAorCisvKgorICogRERSIFNldHVwCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9CQVNFCQkweDAwMDAwMDAwCS8qIEREUiBpcyBzeXN0ZW0gbWVtb3J5ICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQlDRkdfRERSX0JBU0UKKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9CQVNFCUNGR19ERFJfQkFTRQorI2RlZmluZSBDRkdfRERSQ0RSCQkweDczMDAwMDAyCS8qIEREUiBJSSB2b2x0YWdlIGlzIDEuOFYgKi8KKworI3VuZGVmIENPTkZJR19TUERfRUVQUk9NCisjaWYgZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKy8qIERldGVybWluZSBERFIgY29uZmlndXJhdGlvbiBmcm9tIEkyQyBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MJMHg1MQkvKiBERFIgU09ESU1NICovCisjZWxzZQorLyogTWFudWFsbHkgc2V0IHVwIEREUiBwYXJhbWV0ZXJzCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9TSVpFCQk2NAkvKiBNQiAqLworI2RlZmluZSBDRkdfRERSX0NTMF9DT05GSUcJMHg4MDg0MDEwMQorI2RlZmluZSBDRkdfRERSX1RJTUlOR18wCTB4MDAyMjA4MDIKKyNkZWZpbmUgQ0ZHX0REUl9USU1JTkdfMQkweDM5MzVkMzIyCisjZGVmaW5lIENGR19ERFJfVElNSU5HXzIJMHgwZjkwNDhjYQorI2RlZmluZSBDRkdfRERSX1RJTUlOR18zCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0REUl9DTEtfQ05UTAkweDAyMDAwMDAwCisjZGVmaW5lIENGR19ERFJfTU9ERQkJMHg0NDQwMDIzMgorI2RlZmluZSBDRkdfRERSX01PREUyCQkweDgwMDBjMDAwCisjZGVmaW5lIENGR19ERFJfSU5URVJWQUwJMHgwMzIwMDA2NAorI2RlZmluZSBDRkdfRERSX0NTMF9CTkRTCTB4MDAwMDAwMDMKKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9DRkcJMHg0MzA4MDAwMAorI2RlZmluZSBDRkdfRERSX1NEUkFNX0NGRzIJMHgwMDQwMTAwMAorI2VuZGlmCisKKy8qCisgKiBNZW1vcnkgdGVzdAorICovCisjdW5kZWYgQ0ZHX0RSQU1fVEVTVAkJLyogbWVtb3J5IHRlc3QsIHRha2VzIHRpbWUgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDAzMDAwMAkvKiBtZW10ZXN0IHJlZ2lvbiAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDNmMDAwMDAKKworLyoKKyAqIFRoZSByZXNlcnZlZCBtZW1vcnkKKyAqLworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQkvKiBzdGFydCBvZiBtb25pdG9yICovCisKKyNpZiAoQ0ZHX01PTklUT1JfQkFTRSA8IENGR19GTEFTSF9CQVNFKQorI2RlZmluZSBDRkdfUkFNQk9PVAorI2Vsc2UKKyN1bmRlZiAgQ0ZHX1JBTUJPT1QKKyNlbmRpZgorCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb24gKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgxMjggKiAxMDI0KQkvKiBSZXNlcnZlZCBmb3IgbWFsbG9jICovCisKKy8qCisgKiBJbml0aWFsIFJBTSBCYXNlIEFkZHJlc3MgU2V0dXAKKyAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fTE9DSwkxCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCTB4RTYwMDAwMDAJLyogSW5pdGlhbCBSQU0gYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4MTAwMAkJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0gKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMHgxMDAJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorCisvKgorICogTG9jYWwgQnVzIENvbmZpZ3VyYXRpb24gJiBDbG9jayBTZXR1cAorICovCisjZGVmaW5lIENGR19MQ1JSCQkoTENSUl9EQllQIHwgTENSUl9DTEtESVZfMikKKyNkZWZpbmUgQ0ZHX0xCQ19MQkNSCQkweDAwMDAwMDAwCisKKy8qCisgKiBGTEFTSCBvbiB0aGUgTG9jYWwgQnVzCisgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSQkJLyogdXNlIHRoZSBDb21tb24gRmxhc2ggSW50ZXJmYWNlICovCisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCS8qIHVzZSB0aGUgQ0ZJIGRyaXZlciAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRTAwMDAwMAkvKiBGTEFTSCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1NJWkUJCTE2CS8qIEZMQVNIIHNpemUgaXMgMTZNICovCisKKyNkZWZpbmUgQ0ZHX0xCTEFXQkFSMF9QUkVMSU0JQ0ZHX0ZMQVNIX0JBU0UJLyogV2luZG93IGJhc2UgYXQgZmxhc2ggYmFzZSAqLworI2RlZmluZSBDRkdfTEJMQVdBUjBfUFJFTElNCTB4ODAwMDAwMTgJLyogMzJNQiB3aW5kb3cgc2l6ZSAqLworCisjZGVmaW5lIENGR19CUjBfUFJFTElNCShDRkdfRkxBU0hfQkFTRSB8CS8qIEZsYXNoIEJhc2UgYWRkcmVzcyAqLyBcCisJCQkoMiA8PCBCUl9QU19TSElGVCkgfAkvKiAxNiBiaXQgcG9ydCBzaXplICovIFwKKwkJCUJSX1YpCQkJLyogdmFsaWQgKi8KKyNkZWZpbmUgQ0ZHX09SMF9QUkVMSU0JCTB4ZmUwMDZmZjcJLyogMTZNQiBGbGFzaCBzaXplICovCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBudW1iZXIgb2YgYmFua3MgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTEyOAkJLyogc2VjdG9ycyBwZXIgZGV2aWNlICovCisKKyN1bmRlZiBDRkdfRkxBU0hfQ0hFQ0tTVU0KKworLyoKKyAqIFNEUkFNIG9uIHRoZSBMb2NhbCBCdXMKKyAqLworI3VuZGVmIENGR19MQl9TRFJBTQkJLyogVGhlIGJvYXJkIGhhcyBub3QgU1JEQU0gb24gbG9jYWwgYnVzICovCisKKyNpZmRlZiBDRkdfTEJfU0RSQU0KKyNkZWZpbmUgQ0ZHX0xCQ19TRFJBTV9CQVNFCTB4RjAwMDAwMDAJLyogU0RSQU0gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIENGR19MQkNfU0RSQU1fU0laRQk2NAkJLyogTEJDIFNEUkFNIGlzIDY0TUIgKi8KKworI2RlZmluZSBDRkdfTEJMQVdCQVIyX1BSRUxJTQlDRkdfTEJDX1NEUkFNX0JBU0UKKyNkZWZpbmUgQ0ZHX0xCTEFXQVIyX1BSRUxJTQkweDgwMDAwMDE5CS8qIDY0TUIgKi8KKworLypsb2NhbCBidXMgQlIyLCBPUjIgZGVmaW5pdGlvbiBmb3IgU0RSQU0gaWYgc29sZGVyZWQgb24gdGhlIEVQQiBib2FyZCAqLworLyoKKyAqIEJhc2UgUmVnaXN0ZXIgMiBhbmQgT3B0aW9uIFJlZ2lzdGVyIDIgY29uZmlndXJlIFNEUkFNLgorICogVGhlIFNEUkFNIGJhc2UgYWRkcmVzcywgQ0ZHX0xCQ19TRFJBTV9CQVNFLCBpcyAweGYwMDAwMDAwLgorICoKKyAqIEZvciBCUjIsIG5lZWQ6CisgKiAgICBCYXNlIGFkZHJlc3Mgb2YgMHhmMDAwMDAwMCA9IEJSWzA6MTZdID0gMTExMSAwMDAwIDAwMDAgMDAwMCAwCisgKiAgICBwb3J0IHNpemUgPSAzMi1iaXRzID0gQlIyWzE5OjIwXSA9IDExCisgKiAgICBubyBwYXJpdHkgY2hlY2tpbmcgPSBCUjJbMjE6MjJdID0gMDAKKyAqICAgIFNEUkFNIGZvciBNU0VMID0gQlIyWzI0OjI2XSA9IDAxMQorICogICAgVmFsaWQgPSBCUlszMV0gPSAxCisgKgorICogMCAgICA0ICAgIDggICAgMTIgICAxNiAgIDIwICAgMjQgICAyOAorICogMTExMSAwMDAwIDAwMDAgMDAwMCAwMDAxIDEwMDAgMDExMCAwMDAxID0gZjAwMDE4NjEKKyAqCisgKiBDRkdfTEJDX1NEUkFNX0JBU0Ugc2hvdWxkIGJlIG1hc2tlZCBhbmQgT1InZWQgaW50bworICogdGhlIHRvcCAxNyBiaXRzIG9mIEJSMi4KKyAqLworCisjZGVmaW5lIENGR19CUjJfUFJFTElNCTB4ZjAwMDE4NjEJLypQb3J0IHNpemU9MzJiaXQsIE1TRUw9U0RSQU0gKi8KKworLyoKKyAqIFRoZSBTRFJBTSBzaXplIGluIE1CLCBDRkdfTEJDX1NEUkFNX1NJWkUsIGlzIDY0LgorICoKKyAqIEZvciBPUjIsIG5lZWQ6CisgKiAgICA2NE1CIG1hc2sgZm9yIEFNLCBPUjJbMDo3XSA9IDExMTEgMTEwMAorICogICAgICAgICAgICAgICAgIFhBTSwgT1IyWzE3OjE4XSA9IDExCisgKiAgICA5IGNvbHVtbnMgT1IyWzE5LTIxXSA9IDAxMAorICogICAgMTMgcm93cyAgIE9SMlsyMy0yNV0gPSAxMDAKKyAqICAgIEVBRCBzZXQgZm9yIGV4dHJhIHRpbWUgT1JbMzFdID0gMQorICoKKyAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKKyAqIDExMTEgMTEwMCAwMDAwIDAwMDAgMDExMCAxMDAxIDAwMDAgMDAwMSA9IGZjMDA2OTAxCisgKi8KKworI2RlZmluZSBDRkdfT1IyX1BSRUxJTQkweGZjMDA2OTAxCisKKyNkZWZpbmUgQ0ZHX0xCQ19MU1JUCTB4MzIwMDAwMDAJLyogTEIgc2RyYW0gcmVmcmVzaCB0aW1lciwgYWJvdXQgNnVzICovCisjZGVmaW5lIENGR19MQkNfTVJUUFIJMHgyMDAwMDAwMAkvKiBMQiByZWZyZXNoIHRpbWVyIHByZXNjYWwsIDI2Nk1Iei8zMiAqLworCisvKgorICogTFNETVIgbWFza3MKKyAqLworI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX05PUk1BTAkoMCA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9BUkZSU0gJKDEgPDwgKDMxIC0gNCkpCisjZGVmaW5lIENGR19MQkNfTFNETVJfT1BfU1JGUlNICSgyIDw8ICgzMSAtIDQpKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX01SVwkoMyA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9QUkVDSAkoNCA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9QQ0hBTEwJKDUgPDwgKDMxIC0gNCkpCisjZGVmaW5lIENGR19MQkNfTFNETVJfT1BfQUNUQk5LCSg2IDw8ICgzMSAtIDQpKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX1JXSU5WCSg3IDw8ICgzMSAtIDQpKQorCisjZGVmaW5lIENGR19MQkNfTFNETVJfQ09NTU9OCTB4MDA2M2I3MjMKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgY29uZmlndXJhdGlvbiBzZXF1ZW5jZS4KKyAqLworI2RlZmluZSBDRkdfTEJDX0xTRE1SXzEJCSggQ0ZHX0xCQ19MU0RNUl9DT01NT04gXAorCQkJCXwgQ0ZHX0xCQ19MU0RNUl9PUF9QQ0hBTEwpCisjZGVmaW5lIENGR19MQkNfTFNETVJfMgkJKCBDRkdfTEJDX0xTRE1SX0NPTU1PTiBcCisJCQkJfCBDRkdfTEJDX0xTRE1SX09QX0FSRlJTSCkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl8zCQkoIENGR19MQkNfTFNETVJfQ09NTU9OIFwKKwkJCQl8IENGR19MQkNfTFNETVJfT1BfQVJGUlNIKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SXzQJCSggQ0ZHX0xCQ19MU0RNUl9DT01NT04gXAorCQkJCXwgQ0ZHX0xCQ19MU0RNUl9PUF9NUlcpCisjZGVmaW5lIENGR19MQkNfTFNETVJfNQkJKCBDRkdfTEJDX0xTRE1SX0NPTU1PTiBcCisJCQkJfCBDRkdfTEJDX0xTRE1SX09QX05PUk1BTCkKKworI2VuZGlmCisKKy8qCisgKiBXaW5kb3dzIHRvIGFjY2VzcyBQSUIgdmlhIGxvY2FsIGJ1cworICovCisjZGVmaW5lIENGR19MQkxBV0JBUjNfUFJFTElNCTB4ZjgwMDgwMDAJLyogd2luZG93cyBiYXNlIDB4ZjgwMDgwMDAgKi8KKyNkZWZpbmUgQ0ZHX0xCTEFXQVIzX1BSRUxJTQkweDgwMDAwMDBmCS8qIHdpbmRvd3Mgc2l6ZSA2NEtCICovCisKKy8qCisgKiBTZXJpYWwgUG9ydAorICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEKKyN1bmRlZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCTEKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQlnZXRfYnVzX2ZyZXEoMCkKKworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgIFwKKwl7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwxMTUyMDB9CisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0lNTVIrMHg0NTAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00yCShDRkdfSU1NUisweDQ2MDApCisKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeSAqLworLyogVXNlIHRoZSBIVVNIIHBhcnNlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNpZmRlZiBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCisjZW5kaWYKKworLyogcGFzcyBvcGVuIGZpcm13YXJlIGZsYXQgdHJlZSAqLworI2RlZmluZSBDT05GSUdfT0ZfTElCRkRUCTEKKyNkZWZpbmUgQ09ORklHX09GX0JPQVJEX1NFVFVQCTEKKworI2RlZmluZSBPRl9DUFUJCQkiUG93ZXJQQyw4MzIzQDAiCisjZGVmaW5lIE9GX1NPQwkJCSJzb2M4MzIzQGUwMDAwMDAwIgorI2RlZmluZSBPRl9RRQkJCSJxZUBlMDEwMDAwMCIKKyNkZWZpbmUgT0ZfVEJDTEsJCShiZC0+YmlfYnVzZnJlcSAvIDQpCisjZGVmaW5lIE9GX1NURE9VVF9QQVRICQkiL3NvYzgzMjNAZTAwMDAwMDAvc2VyaWFsQDQ1MDAiCisKKy8qIEkyQyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfU09GVF9JMkMJCS8qIEkyQyBiaXQtYmFuZ2VkICovCisjZGVmaW5lIENPTkZJR19GU0xfSTJDCisjZGVmaW5lIENGR19JMkNfU1BFRUQJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCTB4N0YKKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7MHg1MX0JLyogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19PRkZTRVQJMHgzMDAwCisKKy8qCisgKiBDb25maWcgb24tYm9hcmQgUlRDCisgKi8KKyNkZWZpbmUgQ09ORklHX1JUQ19EUzEzNzQJCS8qIHVzZSBkczEzNzQgcnRjIHZpYSBpMmMgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUgkweDY4CS8qIGF0IGFkZHJlc3MgMHg2OCAqLworCisvKgorICogR2VuZXJhbCBQQ0kKKyAqIEFkZHJlc3NlcyBhcmUgbWFwcGVkIDEtMS4KKyAqLworI2RlZmluZSBDRkdfUENJMV9NRU1fQkFTRQkweDgwMDAwMDAwCisjZGVmaW5lIENGR19QQ0kxX01FTV9QSFlTCUNGR19QQ0kxX01FTV9CQVNFCisjZGVmaW5lIENGR19QQ0kxX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLworI2RlZmluZSBDRkdfUENJMV9NTUlPX0JBU0UJMHg5MDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9NTUlPX1BIWVMJQ0ZHX1BDSTFfTU1JT19CQVNFCisjZGVmaW5lIENGR19QQ0kxX01NSU9fU0laRQkweDEwMDAwMDAwCS8qIDI1Nk0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkJMHhkMDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCQlDRkdfUENJMV9JT19CQVNFCisjZGVmaW5lIENGR19QQ0kxX0lPX1NJWkUJCTB4MDQwMDAwMDAJLyogNjRNICovCisKKyNpZmRlZiBDT05GSUdfUENJCisKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfUENJX1BOUAkJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgKi8KKworI3VuZGVmIENPTkZJR19FRVBSTzEwMAorI3VuZGVmIENPTkZJR19QQ0lfU0NBTl9TSE9XCS8qIHNob3cgcGNpIGRldmljZXMgb24gc3RhcnR1cCAqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRAkweDE5NTcJLyogRnJlZXNjYWxlICovCisKKyNlbmRpZgkvKiBDT05GSUdfUENJICovCisKKworI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQorI2VuZGlmCisKKy8qCisgKiBRRSBVRUMgZXRoZXJuZXQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19VRUNfRVRICisjZGVmaW5lIENPTkZJR19FVEhQUklNRQkJIkZyZWVzY2FsZSBHRVRIIgorCisjZGVmaW5lIENPTkZJR19VRUNfRVRIMQkJLyogRVRIMyAqLworCisjaWZkZWYgQ09ORklHX1VFQ19FVEgxCisjZGVmaW5lIENGR19VRUMxX1VDQ19OVU0JMgkvKiBVQ0MzICovCisjZGVmaW5lIENGR19VRUMxX1JYX0NMSwkJUUVfQ0xLOQorI2RlZmluZSBDRkdfVUVDMV9UWF9DTEsJCVFFX0NMSzEwCisjZGVmaW5lIENGR19VRUMxX0VUSF9UWVBFCUZBU1RfRVRICisjZGVmaW5lIENGR19VRUMxX1BIWV9BRERSCTQKKyNkZWZpbmUgQ0ZHX1VFQzFfSU5URVJGQUNFX01PREUJRU5FVF8xMDBfTUlJCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfVUVDX0VUSDIJCS8qIEVUSDQgKi8KKworI2lmZGVmIENPTkZJR19VRUNfRVRIMgorI2RlZmluZSBDRkdfVUVDMl9VQ0NfTlVNCTEJLyogVUNDMiAqLworI2RlZmluZSBDRkdfVUVDMl9SWF9DTEsJCVFFX0NMSzE2CisjZGVmaW5lIENGR19VRUMyX1RYX0NMSwkJUUVfQ0xLMworI2RlZmluZSBDRkdfVUVDMl9FVEhfVFlQRQlGQVNUX0VUSAorI2RlZmluZSBDRkdfVUVDMl9QSFlfQUREUgkwCisjZGVmaW5lIENGR19VRUMyX0lOVEVSRkFDRV9NT0RFCUVORVRfMTAwX01JSQorI2VuZGlmCisKKy8qCisgKiBFbnZpcm9ubWVudAorICovCisjaWZuZGVmIENGR19SQU1CT09UCisJI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKwkjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgKyAweDQwMDAwKQorCSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHg0MDAwMAkvKiAyNTZLKG9uZSBzZWN0b3IpIGZvciBlbnYgKi8KKwkjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCisjZWxzZQorCSNkZWZpbmUgQ0ZHX05PX0ZMQVNICQkxCS8qIEZsYXNoIGlzIG5vdCB1c2FibGUgbm93ICovCisJI2RlZmluZSBDRkdfRU5WX0lTX05PV0hFUkUJMQkvKiBTdG9yZSBFTlYgaW4gbWVtb3J5IG9ubHkgKi8KKwkjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgLSAweDEwMDApCisJI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwMAorI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCSNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisJI3VuZGVmIENPTkZJR19DTURfRU5WCisJI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCisjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KKworI2lmIChDT05GSUdfQ01EX0tHREIpCisJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbHNlCisJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLworI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpCS8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncyAqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMW1zIHRpY2tzICovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKy8qCisgKiBDb3JlIEhJRCBTZXR1cAorICovCisjZGVmaW5lIENGR19ISUQwX0lOSVQJCTB4MDAwMDAwMDAwCisjZGVmaW5lIENGR19ISUQwX0ZJTkFMCQlISUQwX0VOQUJMRV9NQUNISU5FX0NIRUNLCisjZGVmaW5lIENGR19ISUQyCQlISUQyX0hCRQorCisvKgorICogQ2FjaGUgQ29uZmlnCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCisvKgorICogTU1VIFNldHVwCisgKi8KKworLyogRERSOiBjYWNoZSBjYWNoZWFibGUgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQwTAkoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMFUJKENGR19TRFJBTV9CQVNFIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19EQkFUMEwJQ0ZHX0lCQVQwTAorI2RlZmluZSBDRkdfREJBVDBVCUNGR19JQkFUMFUKKworLyogSU1NUkJBUiAmIFBDSSBJTzogY2FjaGUtaW5oaWJpdCBhbmQgZ3VhcmRlZCAqLworI2RlZmluZSBDRkdfSUJBVDFMCShDRkdfSU1NUiB8IEJBVExfUFBfMTAgfCBcCisJCQlCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19JQkFUMVUJKENGR19JTU1SIHwgQkFUVV9CTF80TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfREJBVDFMCUNGR19JQkFUMUwKKyNkZWZpbmUgQ0ZHX0RCQVQxVQlDRkdfSUJBVDFVCisKKy8qIEZMQVNIOiBpY2FjaGUgY2FjaGVhYmxlLCBidXQgZGNhY2hlLWluaGliaXQgYW5kIGd1YXJkZWQgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQyTAkoQ0ZHX0ZMQVNIX0JBU0UgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMlUJKENGR19GTEFTSF9CQVNFIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQyTAkoQ0ZHX0ZMQVNIX0JBU0UgfCBCQVRMX1BQXzEwIHwgXAorCQkJQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDJVCUNGR19JQkFUMlUKKworI2RlZmluZSBDRkdfSUJBVDNMCSgwKQorI2RlZmluZSBDRkdfSUJBVDNVCSgwKQorI2RlZmluZSBDRkdfREJBVDNMCUNGR19JQkFUM0wKKyNkZWZpbmUgQ0ZHX0RCQVQzVQlDRkdfSUJBVDNVCisKKy8qIFN0YWNrIGluIGRjYWNoZTogY2FjaGVhYmxlLCBubyBtZW1vcnkgY29oZXJlbmNlICovCisjZGVmaW5lIENGR19JQkFUNEwJKENGR19JTklUX1JBTV9BRERSIHwgQkFUTF9QUF8xMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ0VQkoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQ0TAlDRkdfSUJBVDRMCisjZGVmaW5lIENGR19EQkFUNFUJQ0ZHX0lCQVQ0VQorCisjaWZkZWYgQ09ORklHX1BDSQorLyogUENJIE1FTSBzcGFjZTogY2FjaGVhYmxlICovCisjZGVmaW5lIENGR19JQkFUNUwJKENGR19QQ0kxX01FTV9QSFlTIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDVVCShDRkdfUENJMV9NRU1fUEhZUyB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfREJBVDVMCUNGR19JQkFUNUwKKyNkZWZpbmUgQ0ZHX0RCQVQ1VQlDRkdfSUJBVDVVCisvKiBQQ0kgTU1JTyBzcGFjZTogY2FjaGUtaW5oaWJpdCBhbmQgZ3VhcmRlZCAqLworI2RlZmluZSBDRkdfSUJBVDZMCShDRkdfUENJMV9NTUlPX1BIWVMgfCBCQVRMX1BQXzEwIHwgXAorCQkJQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfSUJBVDZVCShDRkdfUENJMV9NTUlPX1BIWVMgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQ2TAlDRkdfSUJBVDZMCisjZGVmaW5lIENGR19EQkFUNlUJQ0ZHX0lCQVQ2VQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lCQVQ1TAkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ1VQkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ2TAkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ2VQkoMCkKKyNkZWZpbmUgQ0ZHX0RCQVQ1TAlDRkdfSUJBVDVMCisjZGVmaW5lIENGR19EQkFUNVUJQ0ZHX0lCQVQ1VQorI2RlZmluZSBDRkdfREJBVDZMCUNGR19JQkFUNkwKKyNkZWZpbmUgQ0ZHX0RCQVQ2VQlDRkdfSUJBVDZVCisjZW5kaWYKKworLyogTm90aGluZyBpbiBCQVQ3ICovCisjZGVmaW5lIENGR19JQkFUN0wJKDApCisjZGVmaW5lIENGR19JQkFUN1UJKDApCisjZGVmaW5lIENGR19EQkFUN0wJQ0ZHX0lCQVQ3TAorI2RlZmluZSBDRkdfREJBVDdVCUNGR19JQkFUN1UKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCisKKyNpZiAoQ09ORklHX0NNRF9LR0RCKQorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgb2Yga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKgorICogRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJMDA6MDQ6OWY6ZWY6MDM6MDEKKyNkZWZpbmUgQ09ORklHX0hBU19FVEgxCQkJCS8qIGFkZCBzdXBwb3J0IGZvciAiZXRoMWFkZHIiICovCisjZGVmaW5lIENPTkZJR19FVEgxQUREUgkwMDowNDo5ZjplZjowMzowMgorCisjZGVmaW5lIENPTkZJR19JUEFERFIJCTEwLjAuMC4yCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTAuMC4wLjEKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkxMC4wLjAuMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJMjU1LjAuMC4wCisjZGVmaW5lIENPTkZJR19ORVRERVYJCWV0aDEKKworI2RlZmluZSBDT05GSUdfSE9TVE5BTUUJCW1wYzgzMjNlcmRiCisjZGVmaW5lIENPTkZJR19ST09UUEFUSAkJL25mc3Jvb3QKKyNkZWZpbmUgQ09ORklHX1JBTURJU0tGSUxFCXJvb3Rmcy5leHQyLmd6LnVib290CisjZGVmaW5lIENPTkZJR19CT09URklMRQkJdUltYWdlCisjZGVmaW5lIENPTkZJR19VQk9PVFBBVEgJdS1ib290LmJpbgkvKiBVLUJvb3QgaW1hZ2Ugb24gVEZUUCBzZXJ2ZXIgKi8KKyNkZWZpbmUgQ09ORklHX0ZEVEZJTEUJCW1wYzgzMnhfcmRiLmR0YgorCisjZGVmaW5lIENPTkZJR19MT0FEQUREUgkJMjAwMDAwCS8qIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRmdHAgYW5kIGJvb3RtICovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogLTEgZGlzYWJsZXMgYXV0by1ib290ICovCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCisKKyNkZWZpbmUgWE1LX1NUUih4KQkjeAorI2RlZmluZSBNS19TVFIoeCkJWE1LX1NUUih4KQorCisjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MgXAorCSJuZXRkZXY9IiBNS19TVFIoQ09ORklHX05FVERFVikgIlwwIgkJCQlcCisJInVib290PSIgTUtfU1RSKENPTkZJR19VQk9PVFBBVEgpICJcMCIJCQkJXAorCSJ0ZnRwZmxhc2g9dGZ0cCAkbG9hZGFkZHIgJHVib290OyIJCQkJXAorCQkicHJvdGVjdCBvZmYgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJXAorCQkiZXJhc2UgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJCVwKKwkJImNwLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemU7ICIJXAorCQkicHJvdGVjdCBvbiAiIE1LX1NUUihURVhUX0JBU0UpICIgKyRmaWxlc2l6ZTsgIgkJXAorCQkiY21wLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemVcMCIJXAorCSJmZHRhZGRyPTQwMDAwMFwwIgkJCQkJCVwKKwkiZmR0ZmlsZT0iIE1LX1NUUihDT05GSUdfRkRURklMRSkgIlwwIgkJCQlcCisJInJhbWRpc2thZGRyPTEwMDAwMDBcMCIJCQkJCQlcCisJInJhbWRpc2tmaWxlPSIgTUtfU1RSKENPTkZJR19SQU1ESVNLRklMRSkgIlwwIgkJCVwKKwkiY29uc29sZT10dHlTMFwwIgkJCQkJCVwKKwkic2V0Ym9vdGFyZ3M9c2V0ZW52IGJvb3RhcmdzICIJCQkJCVwKKwkJInJvb3Q9JHJvb3RkZXYgcncgY29uc29sZT0kY29uc29sZSwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzXDAiIFwKKwkic2V0aXBhcmdzPXNldGVudiBib290YXJncyBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIglcCisJCSJpcD0kaXBhZGRyOiRzZXJ2ZXJpcDokZ2F0ZXdheWlwOiRuZXRtYXNrOiRob3N0bmFtZTokbmV0ZGV2Om9mZiAiIFwKKwkJInJvb3Q9JHJvb3RkZXYgcncgY29uc29sZT0kY29uc29sZSwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzXDAiCisKKyNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECQkJCQkJXAorCSJzZXRlbnYgcm9vdGRldiAvZGV2L25mczsiCQkJCQlcCisJInJ1biBzZXRib290YXJnczsiCQkJCQkJXAorCSJydW4gc2V0aXBhcmdzOyIJCQkJCQlcCisJInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiCQkJCQlcCisJInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJXAorCSJib290bSAkbG9hZGFkZHIgLSAkZmR0YWRkciIKKworI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQJCQkJCQlcCisJInNldGVudiByb290ZGV2IC9kZXYvcmFtOyIJCQkJCVwKKwkicnVuIHNldGJvb3RhcmdzOyIJCQkJCQlcCisJInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiCQkJCVwKKwkidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCVwKKwkidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQkJCQlcCisJImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIgJGZkdGFkZHIiCisKKyN1bmRlZiBNS19TVFIKKyN1bmRlZiBYTUtfU1RSCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyWEVNRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MzJYRU1EUy5oCmluZGV4IGNlY2IyMjUuLmY2MmNhMmM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyWEVNRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyWEVNRFMuaApAQCAtNDIzLDQxICs0MjMsMzMgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX0kyQykgXAotCQkJCSYgXAotCQkJCX4oQ0ZHX0NNRF9FTlYgXAotCQkJCXwgQ0ZHX0NNRF9MT0FEUykpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfQVNLRU5WIFwKLQkJCQl8IENGR19DTURfSTJDKSBcCi0JCQkJJiBcCi0JCQkJfihDRkdfQ01EX0VOViBcCi0JCQkJfCBDRkdfQ01EX0xPQURTKSkKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQyAgKQotI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00NjgsNyArNDYwLDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDk4LDcgKzQ5MCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTU3NSw3ICs1NjcsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4MzQ5RU1EUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNDlFTURTLmgKaW5kZXggMjBjNmQ1YS4uMTU2N2ZjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzgzNDlFTURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNDlFTURTLmgKQEAgLTQ3NSw0NCArNDc1LDM1IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQyAgICAgICAgICBcCi0JCQkJIHwgQ0ZHX0NNRF9EQVRFKQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMJCVwKLQkJCQkgfCBDRkdfQ01EX0RBVEUpCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotI2VuZGlmCi0jZWxzZQotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfUENJCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDCQlcCi0JCQkJfCBDRkdfQ01EX0RBVEUJCVwKLQkJCQkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQyAgICAgICAJXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgICAgCVwKLQkJCQl8IENGR19DTURfREFURQkJXAotCQkJCSkKLSNlbmRpZgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTUyMyw3ICs1MTQsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKIAkjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNTQ0LDcgKzUzNSw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTY5NSw3ICs2ODYsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4MzQ5SVRYLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODM0OUlUWC5oCmluZGV4IDgzNDkzNGQuLjQ0NjQ5ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4MzQ5SVRYLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNDlJVFguaApAQCAtMjg5LDYgKzI4OSw3IEBACiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAogCXszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCAxMTUyMDB9CiAKKyNkZWZpbmUgQ09ORklHX0NPTlNPTEUJCXR0eVMwCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKICNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0lNTVIgKyAweDQ1MDApCkBAIC0zNzIsNyArMzczLDcgQEAKIAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19NSUkKLSNkZWZpbmUgQ09ORklHX1BIWV9HSUdFCQkvKiBJbiBjYXNlIENGR19DTURfTUlJIGlzIHNwZWNpZmllZCAqLworI2RlZmluZSBDT05GSUdfUEhZX0dJR0UJCS8qIEluIGNhc2UgQ09ORklHX0NNRF9NSUkgaXMgc3BlY2lmaWVkICovCiAKICNkZWZpbmUgQ09ORklHX1RTRUMxCiAKQEAgLTQwOCw2ICs0MDksNyBAQAogICAjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCiAjZWxzZQogICAjZGVmaW5lIENGR19OT19GTEFTSAkJLyogRmxhc2ggaXMgbm90IHVzYWJsZSBub3cgKi8KKyAgI3VuZGVmICBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgogICAjZGVmaW5lIENGR19FTlZfSVNfTk9XSEVSRQkvKiBTdG9yZSBFTlYgaW4gbWVtb3J5IG9ubHkgKi8KICAgI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFIC0gMHgxMDAwKQogICAjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCkBAIC00MTYsNDAgKzQxOCw0MSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0vKiBDT05GSUdfQ09NTUFORFMgKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KIAogI2lmZGVmIENPTkZJR19DT01QQUNUX0ZMQVNICi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19DRgkoQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0ZBVCkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19DRgkwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0lERQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9GQVQKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfUENJCUNGR19DTURfUENJCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfUENJCTAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19IQVJEX0kyQwotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfSTJDCUNGR19DTURfSTJDCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfSTJDCTAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSTJDCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfQ0YJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19JMkMJfCBcCi0JCQkJQ09ORklHX0NPTU1BTkRTX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCUNGR19DTURfSVJRKQotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKiBXYXRjaGRvZyAqLwotCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCiAvKgpAQCAtNDY5LDcgKzQ3Miw3IEBACiAjZGVmaW5lIENGR19QUk9NUFQJIk1QQzgzNDlFLW1JVFgtR1A+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDkyLDcgKzQ5NSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC02MTcsNyArNjIwLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCBvZiBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC02NzAsOSArNjczLDEwIEBACiAJIiBpcD0iIE1LX1NUUihDT05GSUdfSVBBRERSKSAiOiIgTUtfU1RSKENPTkZJR19TRVJWRVJJUCkgIjoiIAlcCiAJCU1LX1NUUihDT05GSUdfR0FURVdBWUlQKSAiOiIgTUtfU1RSKENPTkZJR19ORVRNQVNLKSAiOiIgXAogCQlNS19TVFIoQ09ORklHX0hPU1ROQU1FKSAiOiIgTUtfU1RSKENPTkZJR19ORVRERVYpICI6b2ZmIiBcCi0JIiBjb25zb2xlPXR0eVMwLCIgTUtfU1RSKENPTkZJR19CQVVEUkFURSkKKwkiIGNvbnNvbGU9IiBNS19TVFIoQ09ORklHX0NPTlNPTEUpICIsIiBNS19TVFIoQ09ORklHX0JBVURSQVRFKQogCiAjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MgXAorCSJjb25zb2xlPSIgTUtfU1RSKENPTkZJR19DT05TT0xFKSAiXDAiIAkJCQlcCiAJIm5ldGRldj0iIE1LX1NUUihDT05GSUdfTkVUREVWKSAiXDAiIAkJCQlcCiAJInVib290PSIgTUtfU1RSKENPTkZJR19VQk9PVFBBVEgpICJcMCIgCQkJCVwKIAkidGZ0cGZsYXNoPXRmdHBib290ICRsb2FkYWRkciAkdWJvb3Q7ICIgCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgzNjBFTURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODM2MEVNRFMuaAppbmRleCA3OTkzN2RjLi40YjMyYTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODM2MEVNRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODM2MEVNRFMuaApAQCAtNDU3LDQxICs0NTcsMzMgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUJIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX0kyQykgXAotCQkJCSYgXAotCQkJCX4oQ0ZHX0NNRF9FTlYgXAotCQkJCXwgQ0ZHX0NNRF9MT0FEUykpCi0jZWxzZQotI2RlZmluZQkgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfQVNLRU5WIFwKLQkJCQl8IENGR19DTURfSTJDKSBcCi0JCQkJJiBcCi0JCQkJfihDRkdfQ01EX0VOViBcCi0JCQkJfCBDRkdfQ01EX0xPQURTKSkKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lCSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSNlbHNlCi0jZGVmaW5lCSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQyAgKQotI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC01MDIsNyArNDk0LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgyMDAwMDAwIC8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NiAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNTMyLDcgKzUyNCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUgLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTYxMCw3ICs2MDIsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEgLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyIC8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQwQURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MEFEUy5oCmluZGV4IDkxNzZiZTMuLjVhN2M4NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQwQURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDBBRFMuaApAQCAtNDA3LDM3ICs0MDcsMzMgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX1BDSQkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0gICNlbHNlCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0gICNlbmRpZgotI2Vsc2UKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BDSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSAgI2Vsc2UKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQotICAjZW5kaWYKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00NDgsNyArNDQ0LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQ2OSw3ICs0NjUsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC00ODEsNyArNDc3LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC01MjAsNyArNTE2LDcgQEAKICNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkgICAgICAgIFwKICAgICJuZXRkZXY9ZXRoMFwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJjb25zb2xlZGV2PXR0eVMwXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrYWRkcj02MDAwMDBcMCIJCQkJCQlcCisgICAicmFtZGlza2FkZHI9MTAwMDAwMFwwIgkJCQkJCVwKICAgICJyYW1kaXNrZmlsZT15b3VyLnJhbWRpc2sudS1ib290XDAiCQkJCQlcCiAgICAiZmR0YWRkcj00MDAwMDBcMCIJCQkJCQkJXAogICAgImZkdGZpbGU9eW91ci5mZHQuZHRiXDAiCkBAIC01NDAsNyArNTM2LDcgQEAKICAgICJ0ZnRwICRyYW1kaXNrYWRkciAkcmFtZGlza2ZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRmZHRhZGRyICRmZHRmaWxlOyIJCQkJCQlcCi0gICAiYm9vdG0gJGxvYWRhZGRyICRyYW1kaXNrYWRkciIKKyAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyICRmZHRhZGRyIgogCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCAgQ09ORklHX05GU0JPT1RDT01NQU5ECiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQwRVZBTC5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDBFVkFMLmgKaW5kZXggYjU2OGNiNC4uMGNlMjVjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg1NDBFVkFMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDBFVkFMLmgKQEAgLTI1OSwyNiArMjU5LDMzIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkgfHwgZGVmaW5lZChDT05GSUdfUkFNX0FTX0ZMQVNIKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0kyQyApICYgXAotCQkJCSB+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9MT0FEUyApKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDICkgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0xPQURTICkpCi0jZW5kaWYKLSNlbHNlCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyB8IENGR19DTURfSTJDICkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMgKQotI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKSB8fCBkZWZpbmVkKENPTkZJR19SQU1fQVNfRkxBU0gpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjg4LDcgKzI5NSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSICAgMHgyMDAwMDAwICAgICAgIC8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIk1QQzg1NDBFVkFMPT4gIi8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMwOCw3ICszMTUsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtMzIwLDcgKzMyNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQxQ0RTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MUNEUy5oCmluZGV4IGUwNDdlMjUuLjIzMmYxNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQxQ0RTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDFDRFMuaApAQCAtMzUwLDYgKzM1MCwxMyBAQAogI2RlZmluZSBDRkdfUENJMl9JT19QSFlTCTB4ZTIxMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTJfSU9fU0laRQkweDEwMDAwMAkvKiAxTSAqLwogCisjaWZkZWYgQ09ORklHX0xFR0FDWQorI2RlZmluZSBCUklER0VfSUQgMTcKKyNkZWZpbmUgVklBX0lEIDIKKyNlbHNlCisjZGVmaW5lIEJSSURHRV9JRCAyOAorI2RlZmluZSBWSUFfSUQgNAorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiAKQEAgLTQwMSwxOSArNDA4LDI4IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQyMyw3ICs0MzksNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC00NDMsNyArNDU5LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC00NTUsNyArNDcxLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0NERTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0NERTLmgKaW5kZXggN2NkNjJlOS4uMzI5MzRlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg1NDREUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTQ0RFMuaApAQCAtMzQsMTQgKzM0LDE0IEBACiAjZGVmaW5lIENPTkZJR19NUEM4NTQ0CQkxCiAjZGVmaW5lIENPTkZJR19NUEM4NTQ0RFMJMQogCi0jdW5kZWYgQ09ORklHX1BDSQkJCS8qIEVuYWJsZSBQQ0kvUENJRSAqLwotI3VuZGVmIENPTkZJR19QQ0kxCQkJLyogUENJIGNvbnRyb2xsZXIgMSAqLwotI3VuZGVmIENPTkZJR19QQ0lFMQkJCS8qIFBDSUUgY29udHJvbGVyIDEgKHNsb3QgMSkgKi8KLSN1bmRlZiBDT05GSUdfUENJRTIJCQkvKiBQQ0lFIGNvbnRyb2xlciAyIChzbG90IDIpICovCi0jdW5kZWYgQ09ORklHX1BDSUUzCQkJLyogUENJRSBjb250cm9sZXIgMyAoVUxJIGJyaWRnZSkgKi8KLSN1bmRlZiBDT05GSUdfRlNMX1BDSV9JTklUCQkvKiBVc2UgY29tbW9uIEZTTCBpbml0IGNvZGUgKi8KKyNkZWZpbmUgQ09ORklHX1BDSQkJMQkvKiBFbmFibGUgUENJL1BDSUUgKi8KKyNkZWZpbmUgQ09ORklHX1BDSTEJCTEJLyogUENJIGNvbnRyb2xsZXIgMSAqLworI2RlZmluZSBDT05GSUdfUENJRTEJCTEJLyogUENJRSBjb250cm9sZXIgMSAoc2xvdCAxKSAqLworI2RlZmluZSBDT05GSUdfUENJRTIJCTEJLyogUENJRSBjb250cm9sZXIgMiAoc2xvdCAyKSAqLworI2RlZmluZSBDT05GSUdfUENJRTMJCTEJLyogUENJRSBjb250cm9sZXIgMyAoVUxJIGJyaWRnZSkgKi8KKyNkZWZpbmUgQ09ORklHX0ZTTF9QQ0lfSU5JVAkxCS8qIFVzZSBjb21tb24gRlNMIGluaXQgY29kZSAqLwogCi0jZGVmaW5lIENPTkZJR19UU0VDX0VORVQgCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVAkJLyogdHNlYyBldGhlcm5ldCBzdXBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCiAjZGVmaW5lIENPTkZJR19TUERfRUVQUk9NCQkvKiBVc2UgU1BEIEVFUFJPTSBmb3IgRERSIHNldHVwICovCiAjdW5kZWYgQ09ORklHX0REUl9ETEwKQEAgLTUyLDYgKzUyLDcgQEAKICNkZWZpbmUgQ09ORklHX01FTV9JTklUX1ZBTFVFCQkweERlYWRCZWVmCiAKICNkZWZpbmUgQ09ORklHX0REUl9FQ0NfQ01ECisjZGVmaW5lIENPTkZJR19JTlRFUlJVUFRTCQkvKiBlbmFibGUgcGNpLCBzcmlvLCBkZHIgaW50ZXJydXB0cyAqLwogCiAvKgogICogV2hlbiBpbml0aWFsaXppbmcgZmxhc2gsIGlmIHdlIGNhbm5vdCBmaW5kIHRoZSBtYW51ZmFjdHVyZXIgSUQsCkBAIC03MCw3ICs3MSw3IEBACiAvKgogICogVGhlc2UgY2FuIGJlIHRvZ2dsZWQgZm9yIHBlcmZvcm1hbmNlIGFuYWx5c2lzLCBvdGhlcndpc2UgdXNlIGRlZmF1bHQuCiAgKi8KLSNkZWZpbmUgQ09ORklHX0wyX0NBQ0hFCQkJLyogdG9nZ2xlIEwyIGNhY2hlIAkqLworI2RlZmluZSBDT05GSUdfTDJfQ0FDSEUJCQkvKiB0b2dnbGUgTDIgY2FjaGUgKi8KICNkZWZpbmUgQ09ORklHX0JUQgkJCS8qIHRvZ2dsZSBicmFuY2ggcHJlZGl0aW9uICovCiAjZGVmaW5lIENPTkZJR19BRERSX1NUUkVBTUlORwkJLyogdG9nZ2xlIGFkZHIgc3RyZWFtaW5nICovCiAjZGVmaW5lIENPTkZJR19DTEVBUl9MQVcwCQkvKiBDbGVhciBMQVcwIGluIGNwdV9pbml0X3IgKi8KQEAgLTg2LDEzICs4NywxMyBAQAogI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwMjAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24gKi8KICNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDAwNDAwMDAwCiAjZGVmaW5lIENGR19BTFRfTUVNVEVTVAotI2RlZmluZSBDT05GSUdfUEFOSUNfSEFORyAJLyogZG8gbm90IHJlc2V0IGJvYXJkIG9uIHBhbmljICovCisjZGVmaW5lIENPTkZJR19QQU5JQ19IQU5HCS8qIGRvIG5vdCByZXNldCBib2FyZCBvbiBwYW5pYyAqLwogCiAvKgogICogQmFzZSBhZGRyZXNzZXMgLS0gTm90ZSB0aGVzZSBhcmUgZWZmZWN0aXZlIGFkZHJlc3NlcyB3aGVyZSB0aGUKICAqIGFjdHVhbCByZXNvdXJjZXMgZ2V0IG1hcHBlZCAobm90IHBoeXNpY2FsIGFkZHJlc3NlcykKICAqLwotI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUIAkweGZmNzAwMDAwCS8qIENDU1JCQVIgRGVmYXVsdCAqLworI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUCTB4ZmY3MDAwMDAJLyogQ0NTUkJBUiBEZWZhdWx0ICovCiAjZGVmaW5lIENGR19DQ1NSQkFSCQkweGUwMDAwMDAwCS8qIHJlbG9jYXRlZCBDQ1NSQkFSICovCiAjZGVmaW5lIENGR19JTU1SCQlDRkdfQ0NTUkJBUgkvKiBQUUlJIHVzZXMgQ0ZHX0lNTVIgKi8KIApAQCAtMzQ0LDcgKzM0NSw3IEBACiAjZGVmaW5lIENPTkZJR19TQVRBX1VMSTUyODgKICNkZWZpbmUgQ0ZHX1NDU0lfTUFYX1NDU0lfSUQJNAogI2RlZmluZSBDRkdfU0NTSV9NQVhfTFVOCTEKLSNkZWZpbmUgQ0ZHX1NDU0lfTUFYX0RFVklDRSAJKENGR19TQ1NJX01BWF9TQ1NJX0lEICogQ0ZHX1NDU0lfTUFYX0xVTikKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYX0RFVklDRQkoQ0ZHX1NDU0lfTUFYX1NDU0lfSUQgKiBDRkdfU0NTSV9NQVhfTFVOKQogI2RlZmluZSBDRkdfU0NTSV9NQVhERVZJQ0UJQ0ZHX1NDU0lfTUFYX0RFVklDRQogI2VuZGlmIC8qIFNDU0NJICovCiAKQEAgLTM1NCw3ICszNTUsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKIAogI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCi0jZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgCTEKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLwpAQCAtMzY1LDYgKzM2NiwxMCBAQAogI2RlZmluZSBDT05GSUdfVFNFQzNfTkFNRQkiZVRTRUMzIgogI3VuZGVmIENPTkZJR19NUEM4NVhYX0ZFQwogCisjZGVmaW5lIENPTkZJR19UU0VDX1RCSQkJMQkvKiBlbmFibGUgaW50ZXJuYWwgVEJJIHBoeSAqLworI2RlZmluZSBDT05GSUdfU0dNSUlfUklTRVIKKyNkZWZpbmUgVFNFQzFfU0dNSUlfUEhZX0FERFJfT0ZGU0VUCTB4MWMJLyogc2dtaWkgcGh5IGJhc2UgKi8KKwogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMAogI2RlZmluZSBUU0VDM19QSFlfQUREUgkJMQogCkBAIC0zNzQsNyArMzc5LDYgQEAKICNkZWZpbmUgQ09ORklHX0VUSFBSSU1FCQkiZVRTRUMxIgogCiAjZGVmaW5lIENPTkZJR19QSFlfR0lHRQkJMQkvKiBJbmNsdWRlIEdiRSBzcGVlZC9kdXBsZXggZGV0ZWN0aW9uICovCi0KICNlbmRpZgkvKiBDT05GSUdfVFNFQ19FTkVUICovCiAKIC8qCkBAIC0zOTIsMjEgKzM5NiwzMiBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgXAotCQkJCXwgQ0ZHX0NNRF9CRURCVUcgXAotCQkJCXwgQ0ZHX0NNRF9ORVQpCi0jZWxzZQotI2RlZmluZQlDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworICAgICNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyAgICAjZGVmaW5lIENPTkZJR19DTURfU0NTSQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCiAjZW5kaWYKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtNDE2LDcgKzQzMSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSovCiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQzMSwxMiArNDQ2LDEyIEBACiAgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcwogICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgogICovCi0jZGVmaW5lIENGR19CT09UTUFQU1oJKDggPDwgMjApIAkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4Ki8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCovCiAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCTMyNzY4CisjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQ0OCw3ICs0NjMsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKQEAgLTQ3Miw3ICs0ODcsOCBAQAogCiAjZGVmaW5lIENPTkZJR19IT1NUTkFNRQk4NTQ0ZHNfdW5rbm93bgogI2RlZmluZSBDT05GSUdfUk9PVFBBVEgJL25mcy9tcGM4NXh4Ci0jZGVmaW5lIENPTkZJR19CT09URklMRQk4NTQ0ZHNfdG10L3VJbWFnZS51Ym9vdAorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJODU0NGRzL3VJbWFnZS51Ym9vdAorI2RlZmluZSBDT05GSUdfVUJPT1RQQVRICTg1NDRkcy91LWJvb3QuYmluCS8qIFRGVFAgc2VydmVyICovCiAKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCTE5Mi4xNjguMC4xCiAjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAgMTkyLjE2OC4wLjEKQEAgLTQ4MSw3ICs0OTcsNyBAQAogI2RlZmluZSBDT05GSUdfTE9BREFERFIJMTAwMDAwMAkvKmRlZmF1bHQgbG9jYXRpb24gZm9yIHRmdHAgYW5kIGJvb3RtKi8KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZIDEwCS8qIC0xIGRpc2FibGVzIGF1dG8tYm9vdCAqLwotI3VuZGVmCUNPTkZJR19CT09UQVJHUwkvKiB0aGUgYm9vdCBjb21tYW5kIHdpbGwgc2V0IGJvb3RhcmdzKi8KKyN1bmRlZglDT05GSUdfQk9PVEFSR1MJCS8qIHRoZSBib290IGNvbW1hbmQgd2lsbCBzZXQgYm9vdGFyZ3MqLwogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkxMTUyMDAKIApAQCAtNDg5LDEwICs1MDUsNyBAQAogI2RlZmluZSBQQ0lFX0VOViBcCiAgInBjaWVyZWc9bWQgJHthfTAwMCA2OyBtZCAke2F9MDIwIDQ7IG1kICR7YX1iZjggMjsgZWNobyBvO21kICR7YX1jMDAgMjU7IiBcCiAJImVjaG8gaTsgbWQgJHthfWRhMCAxNTsgZWNobyBlO21kICR7YX1lMDAgZTsgZWNobyBkOyBtZCAke2F9ZjAwIGNcMCIgXAotICJwY2llMXJlZ3M9c2V0ZW52IGEgZTAwMGE7IHJ1biBwY2llcmVnXDAiCVwKLSAicGNpZTJyZWdzPXNldGVudiBhIGUwMDA5OyBydW4gcGNpZXJlZ1wwIglcCi0gInBjaWUzcmVncz1zZXRlbnYgYSBlMDAwYjsgcnVuIHBjaWVyZWdcMCIJXAotICJwY2llZXJyPW1kICR7YX0wMjAgMTsgbWQgJHthfWUwMDsiCQlcCisgInBjaWVlcnI9bWQgJHthfTAyMCAxOyBtZCAke2F9ZTAwIGU7IgkJXAogCSJwY2kgZC5iICRiLjAgNyAxOyBwY2kgZC53ICRiLjAgMWUgMTsiCVwKIAkicGNpIGQudyAkYi4wIDU2IDE7IgkJCVwKIAkicGNpIGQgJGIuMCAxMDQgMTtwY2kgZCAkYi4wIDExMCAxO3BjaSBkICRiLjAgMTMwIDFcMCIgXApAQCAtNTAxLDEyICs1MTQsMTggQEAKIAkicGNpIHcgJGIuMCAxMDQgZmZmZmZmZmY7IHBjaSB3ICRiLjAgMTEwIGZmZmZmZmZmOyIgXAogCSJwY2kgdyAkYi4wIDEzMCBmZmZmZmZmZlwwIiBcCiAgInBjaWVjZmc9cGNpIGQgJGIuMCAwIDIwOyBwY2kgZCAkYi4wIDEwMCBlOyBwY2kgZCAkYi4wIDQwMCA2OVwwIglcCi0gInBjaWUxZXJyPXNldGVudiBhIGUwMDBhOyBydW4gcGNpZWVyclwwIglcCi0gInBjaWUyZXJyPXNldGVudiBhIGUwMDA5OyBydW4gcGNpZWVyclwwIglcCi0gInBjaWUzZXJyPXNldGVudiBhIGUwMDBiOyBydW4gcGNpZWVyclwwIglcCi0gInBjaWUxZXJyYz1zZXRlbnYgYSBlMDAwYTsgcnVuIHBjaWVlcnJjXDAiCVwKLSAicGNpZTJlcnJjPXNldGVudiBhIGUwMDA5OyBydW4gcGNpZWVycmNcMCIJXAotICJwY2llM2VycmM9c2V0ZW52IGEgZTAwMGI7IHJ1biBwY2llZXJyY1wwIgorICJwY2llMXJlZ3M9c2V0ZW52IGEgZTAwMGE7IHJ1biBwY2llcmVnXDAiCVwKKyAicGNpZTJyZWdzPXNldGVudiBhIGUwMDA5OyBydW4gcGNpZXJlZ1wwIglcCisgInBjaWUzcmVncz1zZXRlbnYgYSBlMDAwYjsgcnVuIHBjaWVyZWdcMCIJXAorICJwY2llMWNmZz1zZXRlbnYgYiAzOyBydW4gcGNpZWNmZ1wwIiBcCisgInBjaWUyY2ZnPXNldGVudiBiIDU7IHJ1biBwY2llY2ZnXDAiIFwKKyAicGNpZTNjZmc9c2V0ZW52IGIgMDsgcnVuIHBjaWVjZmdcMCIgXAorICJwY2llMWVycj1zZXRlbnYgYSBlMDAwYTsgc2V0ZW52IGIgMzsgcnVuIHBjaWVlcnJcMCIJXAorICJwY2llMmVycj1zZXRlbnYgYSBlMDAwOTsgc2V0ZW52IGIgNTsgcnVuIHBjaWVlcnJcMCIJXAorICJwY2llM2Vycj1zZXRlbnYgYSBlMDAwYjsgc2V0ZW52IGIgMDsgcnVuIHBjaWVlcnJcMCIJXAorICJwY2llMWVycmM9c2V0ZW52IGEgZTAwMGE7IHNldGVudiBiIDM7IHJ1biBwY2llZXJyY1wwIglcCisgInBjaWUyZXJyYz1zZXRlbnYgYSBlMDAwOTsgc2V0ZW52IGIgNTsgcnVuIHBjaWVlcnJjXDAiCVwKKyAicGNpZTNlcnJjPXNldGVudiBhIGUwMDBiOyBzZXRlbnYgYiAwOyBydW4gcGNpZWVycmNcMCIKICNlbHNlCiAjZGVmaW5lCVBDSUVfRU5WICIiCiAjZW5kaWYKQEAgLTUxNCwxNCArNTMzLDE0IEBACiAjaWYgZGVmaW5lZChDT05GSUdfUENJMSkKICNkZWZpbmUgUENJX0VOViBcCiAgInBjaXJlZz1tZCAke2F9MDAwIDM7IGVjaG8gbzttZCAke2F9YzAwIDI1OyBlY2hvIGk7IG1kICR7YX1kYTAgMTU7IiBcCi0JImVjaG8gZTttZCAke2F9ZTAwIDlcMCIgCQlcCisJImVjaG8gZTttZCAke2F9ZTAwIDlcMCIJCQlcCiAgInBjaTFyZWdzPXNldGVudiBhIGUwMDA4OyBydW4gcGNpcmVnXDAiCVwKICAicGNpZXJyPW1kICR7YX1lMDAgODsgcGNpIGQuYiAkYi4wIDcgMTsgcGNpIGQudyAkYi4wIDFlIDE7IiBcCiAJInBjaSBkLncgJGIuMCA1NiAxXDAiCQkJXAotICJwY2llcnJjPW13ICR7YX1lMDAgZmZmZmZmZmY7IHBjaSB3LmIgJGIuMCA3IGZmOyBwY2kgdy53ICRiLjAgMWUgZmZmZjsiIFwKLQkicGNpIHcudyAkYi4wIDU2IGZmZmZcMCIJCVwKLSAicGNpMWVycj1zZXRlbnYgYSBlMDAwODsgcnVuIHBjaWVyclwwIgkJXAotICJwY2kxZXJyYz1zZXRlbnYgYSBlMDAwODsgcnVuIHBjaWVycmNcMCIKKyAicGNpZXJyYz1tdyAke2F9ZTAwIGZmZmZmZmZmOyBtdyAke2F9ZTBjIDA7IHBjaSB3LmIgJGIuMCA3IGZmOyIgXAorCSJwY2kgdy53ICRiLjAgMWUgZmZmZjsgcGNpIHcudyAkYi4wIDU2IGZmZmZcMCIJCVwKKyAicGNpMWVycj1zZXRlbnYgYSBlMDAwODsgc2V0ZW52IGIgNzsgcnVuIHBjaWVyclwwIgkJXAorICJwY2kxZXJyYz1zZXRlbnYgYSBlMDAwODsgc2V0ZW52IGIgNzsgcnVuIHBjaWVycmNcMCIKICNlbHNlCiAjZGVmaW5lCVBDSV9FTlYgIiIKICNlbmRpZgpAQCAtNTQxLDI1ICs1NjAsMzkgQEAKICNkZWZpbmUgRU5FVF9FTlYgIiIKICNlbmRpZgogCi0jZGVmaW5lCUNPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJCVwKLSAibmV0ZGV2PWV0aDBcMCIJCQkJXAorI2RlZmluZQlDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCVwKKyAibmV0ZGV2PWV0aDBcMCIJCQkJCQlcCisgInVib290PSIgTUtfU1RSKENPTkZJR19VQk9PVFBBVEgpICJcMCIJCQkJXAorICJ0ZnRwZmxhc2g9dGZ0cGJvb3QgJGxvYWRhZGRyICR1Ym9vdDsgIgkJCVwKKwkicHJvdGVjdCBvZmYgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJXAorCSJlcmFzZSAiIE1LX1NUUihURVhUX0JBU0UpICIgKyRmaWxlc2l6ZTsgIgkJXAorCSJjcC5iICRsb2FkYWRkciAiIE1LX1NUUihURVhUX0JBU0UpICIgJGZpbGVzaXplOyAiCVwKKwkicHJvdGVjdCBvbiAiIE1LX1NUUihURVhUX0JBU0UpICIgKyRmaWxlc2l6ZTsgIgkJXAorCSJjbXAuYiAkbG9hZGFkZHIgIiBNS19TVFIoVEVYVF9CQVNFKSAiICRmaWxlc2l6ZVwwIglcCiAgImNvbnNvbGVkZXY9dHR5UzBcMCIJCQkJXAogICJyYW1kaXNrYWRkcj0yMDAwMDAwXDAiCQkJXAotICJyYW1kaXNrZmlsZT04NTQ0ZHNfdG10L3JhbWRpc2sudWJvb3RcMCIJXAotICJmZHRhZGRyPTQwMDAwMFwwIgkJCQlcCi0gImZkdGZpbGU9ODU0NGRzX3RtdC9tcGM4NTQ0ZHMuZHRiXDAiCQlcCi0gImVvaT1tdyBlMDA0MDBiMCAwXDAiIAkJCQlcCi0gImlhY2s9bWQgZTAwNDAwYTAgMVwwIiAJCQlcCisgInJhbWRpc2tmaWxlPTg1NDRkcy9yYW1kaXNrLnVib290XDAiCQlcCisgImR0YmFkZHI9YzAwMDAwXDAiCQkJCVwKKyAiZHRiZmlsZT04NTQ0ZHMvbXBjODU0NGRzLmR0YlwwIgkJXAorICJiZGV2PXNkYTNcMCIJCQkJCVwKKyAiZW9pPW13IGUwMDQwMGIwIDBcMCIJCQkJXAorICJpYWNrPW1kIGUwMDQwMGEwIDFcMCIJCQkJXAogICJkZHJyZWc9bWQgJHthfTAwMCA4OyBtZCAke2F9MDgwIDg7bWQgJHthfTEwMCBkOyBtZCAke2F9MTQwIDQ7IG1kICR7YX1iZjAgNDsiIFwKIAkibWQgJHthfWUwMCAzOyBtZCAke2F9ZTIwIDM7IG1kICR7YX1lNDAgNzsgbWQgJHthfWYwMCA1XDAiIFwKLSAiZGRycmVncz1zZXRlbnYgYSBlMDAwMjsgcnVuIGRkcnJlZ1wwIiAJXAorICJkZHJyZWdzPXNldGVudiBhIGUwMDAyOyBydW4gZGRycmVnXDAiCQlcCiAgImd1cmVnPW1kICR7YX0wMDAgMmM7IG1kICR7YX0wYjAgMTsgbWQgJHthfTBjMCAxOyBtZCAke2F9YjIwIDM7IiBcCi0JIm1kICR7YX1lMDAgMTsgbWQgJHthfWU2MCAxOyBtZCAke2F9ZWYwIDE1XDAiIAlcCi0gImd1cmVncz1zZXRlbnYgYSBlMDBlMDsgcnVuIGd1cmVnXDAiIAkJXAorCSJtZCAke2F9ZTAwIDE7IG1kICR7YX1lNjAgMTsgbWQgJHthfWVmMCAxNVwwIglcCisgImd1cmVncz1zZXRlbnYgYSBlMDBlMDsgcnVuIGd1cmVnXDAiCQlcCiAgImVjbXJlZz1tZCAke2F9MDAwIDE7IG1kICR7YX0wMTAgMTsgbWQgJHthfWJmOCAyOyBtZCAke2F9ZTAwIDZcMCIgXAotICJlY21yZWdzPXNldGVudiBhIGUwMDAxOyBydW4gZWNtcmVnXDAiIAlcCi0gUENJRV9FTlYgCVwKLSBQQ0lfRU5WIAlcCisgImVjbXJlZ3M9c2V0ZW52IGEgZTAwMDE7IHJ1biBlY21yZWdcMCIJCVwKKyAibGF3cmVncz1tZCBlMDAwMGMwOCA0YlwwIiBcCisgImxiY3JlZ3M9bWQgZTAwMDUwMDAgMzZcMCIgXAorICJkbWEwcmVncz1tZCBlMDAyMTEwMCAxMlwwIiBcCisgImRtYTFyZWdzPW1kIGUwMDIxMTgwIDEyXDAiIFwKKyAiZG1hMnJlZ3M9bWQgZTAwMjEyMDAgMTJcMCIgXAorICJkbWEzcmVncz1tZCBlMDAyMTI4MCAxMlwwIiBcCisgUENJRV9FTlYJXAorIFBDSV9FTlYJXAogIEVORVRfRU5WCiAKIApAQCAtNTY5LDIzICs2MDIsMjMgQEAKICAiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIiBcCiAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCVwKICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCVwKLSAidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQlcCi0gImJvb3RtICRsb2FkYWRkciAtICRmZHRhZGRyIgorICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCVwKKyAiYm9vdG0gJGxvYWRhZGRyIC0gJGR0YmFkZHIiCiAKIAotI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQgCQlcCisjZGVmaW5lIENPTkZJR19SQU1CT09UQ09NTUFORAkJXAogICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiCVwKICAiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJXAogICJ0ZnRwICRyYW1kaXNrYWRkciAkcmFtZGlza2ZpbGU7IglcCiAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiCQlcCi0gInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJXAotICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyICRmZHRhZGRyIgorICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCVwKKyAiYm9vdG0gJGxvYWRhZGRyICRyYW1kaXNrYWRkciAkZHRiYWRkciIKIAotI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQgCQlcCi0gInNldGVudiBib290YXJncyByb290PS9kZXYvc2RhMyBydyAiCVwKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECQlcCisgInNldGVudiBib290YXJncyByb290PS9kZXYvJGJkZXYgcncgIglcCiAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCVwKICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCVwKLSAidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQlcCi0gImJvb3RtICRsb2FkYWRkciAtICRmZHRhZGRyIgorICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCVwKKyAiYm9vdG0gJGxvYWRhZGRyIC0gJGR0YmFkZHIiCiAKICNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0OENEUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDhDRFMuaAppbmRleCBhMGQyOTFlLi5jZGE5ZmQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0OENEUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTQ4Q0RTLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KICAqCiAgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogICogcHJvamVjdC4KQEAgLTExLDcgKzExLDcgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0zNiw4ICszNiwxNCBAQAogI2RlZmluZSBDT05GSUdfTVBDODU0OAkJMQkvKiBNUEM4NTQ4IHNwZWNpZmljICovCiAjZGVmaW5lIENPTkZJR19NUEM4NTQ4Q0RTCTEJLyogTVBDODU0OENEUyBib2FyZCBzcGVjaWZpYyAqLwogCi0jZGVmaW5lIENPTkZJR19QQ0kKLSNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLworI2RlZmluZSBDT05GSUdfUENJCQkvKiBlbmFibGUgYW55IHBjaSB0eXBlIGRldmljZXMgKi8KKyNkZWZpbmUgQ09ORklHX1BDSTEJCS8qIFBDSSBjb250cm9sbGVyIDEgKi8KKyNkZWZpbmUgQ09ORklHX1BDSUUxCQkvKiBQQ0lFIGNvbnRyb2xlciAxIChzbG90IDEpICovCisjdW5kZWYgQ09ORklHX1JJTworI3VuZGVmIENPTkZJR19QQ0kyCisjZGVmaW5lIENPTkZJR19GU0xfUENJX0lOSVQJMQkvKiBVc2UgY29tbW9uIEZTTCBpbml0IGNvZGUgKi8KKworI2RlZmluZSBDT05GSUdfVFNFQ19FTkVUCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKICNkZWZpbmUgQ09ORklHX1NQRF9FRVBST00JCS8qIFVzZSBTUEQgRUVQUk9NIGZvciBERFIgc2V0dXAqLwogI2RlZmluZSBDT05GSUdfRERSX0RMTAkJCS8qIHBvc3NpYmxlIERMTCBmaXggbmVlZGVkICovCkBAIC00Niw2ICs1Miw3IEBACiAjZGVmaW5lIENPTkZJR19ERFJfRUNDCQkJLyogb25seSBmb3IgRUNDIEREUiBtb2R1bGUgKi8KICNkZWZpbmUgQ09ORklHX0VDQ19JTklUX1ZJQV9ERFJDT05UUk9MTEVSCS8qIEREUiBjb250cm9sbGVyIG9yIERNQT8gKi8KICNkZWZpbmUgQ09ORklHX01FTV9JTklUX1ZBTFVFCQkweERlYWRCZWVmCisjZGVmaW5lIENPTkZJR19JTlRFUlJVUFRTCQkvKiBlbmFibGUgcGNpLCBzcmlvLCBkZHIgaW50ZXJydXB0cyAqLwogCiAKIC8qCkBAIC02NSwxNiArNzIsMTYgQEAKIC8qCiAgKiBUaGVzZSBjYW4gYmUgdG9nZ2xlZCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMsIG90aGVyd2lzZSB1c2UgZGVmYXVsdC4KICAqLwotI2RlZmluZSBDT05GSUdfTDJfQ0FDSEUJCSAgICAJICAgIC8qIHRvZ2dsZSBMMiBjYWNoZSAJKi8KLSNkZWZpbmUgQ09ORklHX0JUQgkJCSAgICAvKiB0b2dnbGUgYnJhbmNoIHByZWRpdGlvbiAqLwotI2RlZmluZSBDT05GSUdfQUREUl9TVFJFQU1JTkcJCSAgICAvKiB0b2dnbGUgYWRkciBzdHJlYW1pbmcgICAqLworI2RlZmluZSBDT05GSUdfTDJfQ0FDSEUJCQkvKiB0b2dnbGUgTDIgY2FjaGUgKi8KKyNkZWZpbmUgQ09ORklHX0JUQgkJCS8qIHRvZ2dsZSBicmFuY2ggcHJlZGl0aW9uICovCisjZGVmaW5lIENPTkZJR19BRERSX1NUUkVBTUlORwkJLyogdG9nZ2xlIGFkZHIgc3RyZWFtaW5nICovCisjZGVmaW5lIENPTkZJR19DTEVBUl9MQVcwCQkvKiBDbGVhciBMQVcwIGluIGNwdV9pbml0X3IgKi8KIAogLyoKICAqIE9ubHkgcG9zc2libGUgb24gRTUwMCBWZXJzaW9uIDIgb3IgbmV3ZXIgY29yZXMuCiAgKi8KICNkZWZpbmUgQ09ORklHX0VOQUJMRV8zNkJJVF9QSFlTCTEKIAotCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJMQkvKiBDYWxsIGJvYXJkX3ByZV9pbml0ICovCiAKICN1bmRlZglDRkdfRFJBTV9URVNUCQkJLyogbWVtb3J5IHRlc3QsIHRha2VzIHRpbWUgKi8KQEAgLTg1LDEwICs5MiwxNCBAQAogICogQmFzZSBhZGRyZXNzZXMgLS0gTm90ZSB0aGVzZSBhcmUgZWZmZWN0aXZlIGFkZHJlc3NlcyB3aGVyZSB0aGUKICAqIGFjdHVhbCByZXNvdXJjZXMgZ2V0IG1hcHBlZCAobm90IHBoeXNpY2FsIGFkZHJlc3NlcykKICAqLwotI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUIAkweGZmNzAwMDAwCS8qIENDU1JCQVIgRGVmYXVsdCAqLworI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUCTB4ZmY3MDAwMDAJLyogQ0NTUkJBUiBEZWZhdWx0ICovCiAjZGVmaW5lIENGR19DQ1NSQkFSCQkweGUwMDAwMDAwCS8qIHJlbG9jYXRlZCBDQ1NSQkFSICovCiAjZGVmaW5lIENGR19JTU1SCQlDRkdfQ0NTUkJBUgkvKiBQUUlJIHVzZXMgQ0ZHX0lNTVIgKi8KIAorI2RlZmluZSBDRkdfUENJMV9BRERSCShDRkdfQ0NTUkJBUisweDgwMDApCisjZGVmaW5lIENGR19QQ0kyX0FERFIJKENGR19DQ1NSQkFSKzB4OTAwMCkKKyNkZWZpbmUgQ0ZHX1BDSUUxX0FERFIJKENGR19DQ1NSQkFSKzB4YTAwMCkKKwogLyoKICAqIEREUiBTZXR1cAogICovCkBAIC0xMDYsNyArMTE3LDYgQEAKIAogI3VuZGVmIENPTkZJR19DTE9DS1NfSU5fTUhaCiAKLQogLyoKICAqIExvY2FsIEJ1cyBEZWZpbml0aW9ucwogICovCkBAIC0xMjQsOSArMTM0LDkgQEAKICAqICAgIFVzZSBHUENNID0gQlJ4WzI0OjI2XSA9IDAwMAogICogICAgVmFsaWQgPSBCUnhbMzFdID0gMQogICoKLSAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKLSAqIDExMTEgMTExMSAxMDAwIDAwMDAgMDAwMSAwMDAwIDAwMDAgMDAwMSA9IGZmODAxMDAxICAgIEJSMAotICogMTExMSAxMTExIDAwMDAgMDAwMCAwMDAxIDAwMDAgMDAwMCAwMDAxID0gZmYwMDEwMDEgICAgQlIxCisgKiAwCTQgICAgOAkgIDEyICAgMTYgICAyMAkgMjQgICAyOAorICogMTExMSAxMTExIDEwMDAgMDAwMCAwMDAxIDAwMDAgMDAwMCAwMDAxID0gZmY4MDEwMDEJIEJSMAorICogMTExMSAxMTExIDAwMDAgMDAwMCAwMDAxIDAwMDAgMDAwMCAwMDAxID0gZmYwMDEwMDEJIEJSMQogICoKICAqIE9SMCwgT1IxOgogICogICAgQWRkciBNYXNrID0gOE0gPSBPUnhbMDoxNl0gPSAxMTExIDExMTEgMTAwMCAwMDAwIDAKQEAgLTEzNywxMSArMTQ3LDEyIEBACiAgKiAgICBUUkxYID0gdXNlIHJlbGF4ZWQgdGltaW5nID0gT1J4WzI5XSA9IDEKICAqICAgIEVBRCA9IHVzZSBleHRlcm5hbCBhZGRyZXNzIGxhdGNoIGRlbGF5ID0gT1JbMzFdID0gMQogICoKLSAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKLSAqIDExMTEgMTExMSAxMDAwIDAwMDAgMDExMCAxMTEwIDAxMTAgMDEwMSA9IGZmODA2ZTY1ICAgIE9SeAorICogMAk0ICAgIDgJICAxMiAgIDE2ICAgMjAJIDI0ICAgMjgKKyAqIDExMTEgMTExMSAxMDAwIDAwMDAgMDExMCAxMTEwIDAxMTAgMDEwMSA9IGZmODA2ZTY1CSBPUngKICAqLwogCi0jZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweGZmMDAwMDAwCS8qIHN0YXJ0IG9mIEZMQVNIIDhNICovCisjZGVmaW5lIENGR19CT09UX0JMT0NLCQkweGZmMDAwMDAwCS8qIGJvb3QgVExCIGJsb2NrICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQlDRkdfQk9PVF9CTE9DSwkvKiBzdGFydCBvZiBGTEFTSCAxNk0gKi8KIAogI2RlZmluZSBDRkdfQlIwX1BSRUxJTQkJMHhmZjgwMTAwMQogI2RlZmluZSBDRkdfQlIxX1BSRUxJTQkJMHhmZjAwMTAwMQpAQCAtMTU2LDcgKzE2Nyw3IEBACiAjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTYwMDAwCS8qIEZsYXNoIEVyYXNlIFRpbWVvdXQgKG1zKSAqLwogI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogRmxhc2ggV3JpdGUgVGltZW91dCAobXMpICovCiAKLSNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRSAgICAJVEVYVF9CQVNFCS8qIHN0YXJ0IG9mIG1vbml0b3IgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UJLyogc3RhcnQgb2YgbW9uaXRvciAqLwogCiAjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCiAjZGVmaW5lIENGR19GTEFTSF9DRkkKQEAgLTE2Niw3ICsxNzcsMTIgQEAKIC8qCiAgKiBTRFJBTSBvbiB0aGUgTG9jYWwgQnVzCiAgKi8KLSNkZWZpbmUgQ0ZHX0xCQ19TRFJBTV9CQVNFCTB4ZjAwMDAwMDAJLyogTG9jYWxidXMgU0RSQU0gKi8KKyNkZWZpbmUgQ0ZHX0xCQ19DQUNIRV9CQVNFCTB4ZjAwMDAwMDAJLyogTG9jYWxidXMgY2FjaGVhYmxlICovCisjZGVmaW5lIENGR19MQkNfQ0FDSEVfU0laRQk2NAorI2RlZmluZSBDRkdfTEJDX05PTkNBQ0hFX0JBU0UJMHhmODAwMDAwMAkvKiBMb2NhbGJ1cyBub24tY2FjaGVhYmxlICovCisjZGVmaW5lIENGR19MQkNfTk9OQ0FDSEVfU0laRQk2NAorCisjZGVmaW5lIENGR19MQkNfU0RSQU1fQkFTRQlDRkdfTEJDX0NBQ0hFX0JBU0UJLyogTG9jYWxidXMgU0RSQU0gKi8KICNkZWZpbmUgQ0ZHX0xCQ19TRFJBTV9TSVpFCTY0CQkvKiBMQkMgU0RSQU0gaXMgNjRNQiAqLwogCiAvKgpAQCAtMTgwLDE0ICsxOTYsMTQgQEAKICAqICAgIFNEUkFNIGZvciBNU0VMID0gQlIyWzI0OjI2XSA9IDAxMQogICogICAgVmFsaWQgPSBCUlszMV0gPSAxCiAgKgotICogMCAgICA0ICAgIDggICAgMTIgICAxNiAgIDIwICAgMjQgICAyOAorICogMAk0ICAgIDgJICAxMiAgIDE2ICAgMjAJIDI0ICAgMjgKICAqIDExMTEgMDAwMCAwMDAwIDAwMDAgMDAwMSAxMDAwIDAxMTAgMDAwMSA9IGYwMDAxODYxCiAgKgogICogRklYTUU6IENGR19MQkNfU0RSQU1fQkFTRSBzaG91bGQgYmUgbWFza2VkIGFuZCBPUidlZCBpbnRvCiAgKiBGSVhNRTogdGhlIHRvcCAxNyBiaXRzIG9mIEJSMi4KICAqLwogCi0jZGVmaW5lIENGR19CUjJfUFJFTElNICAgICAgICAgIDB4ZjAwMDE4NjEKKyNkZWZpbmUgQ0ZHX0JSMl9QUkVMSU0JCTB4ZjAwMDE4NjEKIAogLyoKICAqIFRoZSBTRFJBTSBzaXplIGluIE1CLCBDRkdfTEJDX1NEUkFNX1NJWkUsIGlzIDY0LgpAQCAtMTk2LDE5ICsyMTIsMTkgQEAKICAqICAgIDY0TUIgbWFzayBmb3IgQU0sIE9SMlswOjddID0gMTExMSAxMTAwCiAgKgkJICAgWEFNLCBPUjJbMTc6MThdID0gMTEKICAqICAgIDkgY29sdW1ucyBPUjJbMTktMjFdID0gMDEwCi0gKiAgICAxMyByb3dzICAgT1IyWzIzLTI1XSA9IDEwMAorICogICAgMTMgcm93cwlPUjJbMjMtMjVdID0gMTAwCiAgKiAgICBFQUQgc2V0IGZvciBleHRyYSB0aW1lIE9SWzMxXSA9IDEKICAqCi0gKiAwICAgIDQgICAgOCAgICAxMiAgIDE2ICAgMjAgICAyNCAgIDI4CisgKiAwCTQgICAgOAkgIDEyICAgMTYgICAyMAkgMjQgICAyOAogICogMTExMSAxMTAwIDAwMDAgMDAwMCAwMTEwIDEwMDEgMDAwMCAwMDAxID0gZmMwMDY5MDEKICAqLwogCiAjZGVmaW5lIENGR19PUjJfUFJFTElNCQkweGZjMDA2OTAxCiAKLSNkZWZpbmUgQ0ZHX0xCQ19MQ1JSCQkweDAwMDMwMDA0ICAgIC8qIExCIGNsb2NrIHJhdGlvIHJlZyAqLwotI2RlZmluZSBDRkdfTEJDX0xCQ1IJCTB4MDAwMDAwMDAgICAgLyogTEIgY29uZmlnIHJlZyAqLwotI2RlZmluZSBDRkdfTEJDX0xTUlQJCTB4MjAwMDAwMDAgIC8qIExCIHNkcmFtIHJlZnJlc2ggdGltZXIgKi8KLSNkZWZpbmUgQ0ZHX0xCQ19NUlRQUgkJMHgwMDAwMDAwMCAgLyogTEIgcmVmcmVzaCB0aW1lciBwcmVzY2FsKi8KKyNkZWZpbmUgQ0ZHX0xCQ19MQ1JSCQkweDAwMDMwMDA0CS8qIExCIGNsb2NrIHJhdGlvIHJlZyAqLworI2RlZmluZSBDRkdfTEJDX0xCQ1IJCTB4MDAwMDAwMDAJLyogTEIgY29uZmlnIHJlZyAqLworI2RlZmluZSBDRkdfTEJDX0xTUlQJCTB4MjAwMDAwMDAJLyogTEIgc2RyYW0gcmVmcmVzaCB0aW1lciAqLworI2RlZmluZSBDRkdfTEJDX01SVFBSCQkweDAwMDAwMDAwCS8qIExCIHJlZnJlc2ggdGltZXIgcHJlc2NhbCovCiAKIC8qCiAgKiBMU0RNUiBtYXNrcwpAQCAtMjM2LDcgKzI1Miw3IEBACiAvKgogICogQ29tbW9uIHNldHRpbmdzIGZvciBhbGwgTG9jYWwgQnVzIFNEUkFNIGNvbW1hbmRzLgogICogQXQgcnVuIHRpbWUsIGVpdGhlciBCU01BMTUxNiAoZm9yIENQVSAxLjEpCi0gKiAgICAgICAgICAgICAgICAgIG9yIEJTTUExNjE3IChmb3IgQ1BVIDEuMCkgKG9sZCkKKyAqCQkgICAgb3IgQlNNQTE2MTcgKGZvciBDUFUgMS4wKSAob2xkKQogICogaXMgT1InZWQgaW4gdG9vLgogICovCiAjZGVmaW5lIENGR19MQkNfTFNETVJfQ09NTU9OCSggQ0ZHX0xCQ19MU0RNUl9SRkNSMTYJCVwKQEAgLTI1Niw2MSArMjcyLDYzIEBACiAgKiAgICBCYXNlIGFkZHJlc3Mgb2YgMHhmODAwMDAwMCA9IEJSWzA6MTZdID0gMTExMSAxMDAwIDAwMDAgMDAwMCAwCiAgKiAgICBwb3J0LXNpemUgPSA4LWJpdHMgID0gQlJbMTk6MjBdID0gMDEKICAqICAgIG5vIHBhcml0eSBjaGVja2luZyAgPSBCUlsyMToyMl0gPSAwMAotICogICAgR1BNQyBmb3IgTVNFTCAgICAgICA9IEJSWzI0OjI2XSA9IDAwMAotICogICAgVmFsaWQgICAgICAgICAgICAgICA9IEJSWzMxXSAgICA9IDEKKyAqICAgIEdQTUMgZm9yIE1TRUwJICA9IEJSWzI0OjI2XSA9IDAwMAorICogICAgVmFsaWQJCSAgPSBCUlszMV0gICAgPSAxCiAgKgotICogMCAgICA0ICAgIDggICAgMTIgICAxNiAgIDIwICAgMjQgICAyOAorICogMAk0ICAgIDgJICAxMiAgIDE2ICAgMjAJIDI0ICAgMjgKICAqIDExMTEgMTAwMCAwMDAwIDAwMDAgMDAwMCAxMDAwIDAwMDAgMDAwMSA9IGY4MDAwODAxCiAgKgogICogRm9yIE9SMywgbmVlZDoKLSAqICAgIDEgTUIgbWFzayBmb3IgQU0sICAgT1JbMDoxNl0gID0gMTExMSAxMTExIDExMTEgMDAwMCAwCisgKiAgICAxIE1CIG1hc2sgZm9yIEFNLAkgIE9SWzA6MTZdICA9IDExMTEgMTExMSAxMTExIDAwMDAgMAogICogICAgZGlzYWJsZSBidWZmZXIgY3RybCBPUlsxOV0gICAgPSAwCi0gKiAgICBDU05UICAgICAgICAgICAgICAgIE9SWzIwXSAgICA9IDEKLSAqICAgIEFDUyAgICAgICAgICAgICAgICAgT1JbMjE6MjJdID0gMTEKLSAqICAgIFhBQ1MgICAgICAgICAgICAgICAgT1JbMjNdICAgID0gMQorICogICAgQ1NOVAkJICBPUlsyMF0gICAgPSAxCisgKiAgICBBQ1MJCSAgT1JbMjE6MjJdID0gMTEKKyAqICAgIFhBQ1MJCSAgT1JbMjNdICAgID0gMQogICogICAgU0NZIDE1IHdhaXQgc3RhdGVzICBPUlsyNDoyN10gPSAxMTExCW1heCBpcyBzdWJvcHRpbWFsIGJ1dCBzYWZlCi0gKiAgICBTRVRBICAgICAgICAgICAgICAgIE9SWzI4XSAgICA9IDAKLSAqICAgIFRSTFggICAgICAgICAgICAgICAgT1JbMjldICAgID0gMQotICogICAgRUhUUiAgICAgICAgICAgICAgICBPUlszMF0gICAgPSAxCi0gKiAgICBFQUQgZXh0cmEgdGltZSAgICAgIE9SWzMxXSAgICA9IDEKKyAqICAgIFNFVEEJCSAgT1JbMjhdICAgID0gMAorICogICAgVFJMWAkJICBPUlsyOV0gICAgPSAxCisgKiAgICBFSFRSCQkgIE9SWzMwXSAgICA9IDEKKyAqICAgIEVBRCBleHRyYSB0aW1lCSAgT1JbMzFdICAgID0gMQogICoKLSAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKKyAqIDAJNCAgICA4CSAgMTIgICAxNiAgIDIwCSAyNCAgIDI4CiAgKiAxMTExIDExMTEgMTExMSAwMDAwIDAwMDAgMTExMSAxMTExIDAxMTEgPSBmZmYwMGZmNwogICovCiAKICNkZWZpbmUgQ0FETVVTX0JBU0VfQUREUiAweGY4MDAwMDAwCi0jZGVmaW5lIENGR19CUjNfUFJFTElNICAgMHhmODAwMDgwMQotI2RlZmluZSBDRkdfT1IzX1BSRUxJTSAgIDB4ZmZmMDBmZjcKKyNkZWZpbmUgQ0ZHX0JSM19QUkVMSU0JIDB4ZjgwMDA4MDEKKyNkZWZpbmUgQ0ZHX09SM19QUkVMSU0JIDB4ZmZmMDBmZjcKIAogI2RlZmluZSBDT05GSUdfTDFfSU5JVF9SQU0KLSNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0xPQ0sgCTEKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0xPQ0sJMQogI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkweGU0MDEwMDAwCS8qIEluaXRpYWwgUkFNIGFkZHJlc3MgKi8KLSNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORCAgICAJMHg0MDAwCSAgICAvKiBFbmQgb2YgdXNlZCBhcmVhIGluIFJBTSAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4NDAwMAkJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0gKi8KIAotI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgCTEyOAkgICAgLyogbnVtIGJ5dGVzIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfSU5JVF9MMl9BRERSCTB4ZjhmODAwMDAJLyogcmVsb2NhdGUgYm9vdCBMMlNSQU0gKi8KKworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KICNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQogI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAogCi0jZGVmaW5lIENGR19NT05JVE9SX0xFTgkgICAgCSgyNTYgKiAxMDI0KSAvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uICovCi0jZGVmaW5lIENGR19NQUxMT0NfTEVOCSAgICAJKDEyOCAqIDEwMjQpCS8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMjU2ICogMTAyNCkgLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbiAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDEyOCAqIDEwMjQpCS8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KIAogLyogU2VyaWFsIFBvcnQgKi8KLSNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgIDIKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMgogI3VuZGVmCUNPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTwogI2RlZmluZSBDRkdfTlMxNjU1MAogI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKLSNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgMQorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkxCiAjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJZ2V0X2J1c19mcmVxKDApCiAKLSNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFICBcCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSBcCiAJezMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsMTE1MjAwfQogCi0jZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgIChDRkdfQ0NTUkJBUisweDQ1MDApCi0jZGVmaW5lIENGR19OUzE2NTUwX0NPTTIgICAgICAgIChDRkdfQ0NTUkJBUisweDQ2MDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJKENGR19DQ1NSQkFSKzB4NDUwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMgkoQ0ZHX0NDU1JCQVIrMHg0NjAwKQogCiAvKiBVc2UgdGhlIEhVU0ggcGFyc2VyICovCiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgotI2lmZGVmICBDRkdfSFVTSF9QQVJTRVIKKyNpZmRlZglDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCiAjZW5kaWYKIApAQCAtMzMxLDU1ICszNDksNzQgQEAKICAqLwogI2RlZmluZSBDT05GSUdfRlNMX0kyQwkJLyogVXNlIEZTTCBjb21tb24gSTJDIGRyaXZlciAqLwogI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQqLwotI3VuZGVmCUNPTkZJR19TT0ZUX0kyQwkJCS8qIEkyQyBiaXQtYmFuZ2VkICovCisjdW5kZWYJQ09ORklHX1NPRlRfSTJDCQkvKiBJMkMgYml0LWJhbmdlZCAqLwogI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzICovCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1NwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCi0jZGVmaW5lIENGR19JMkNfTk9QUk9CRVMgICAgICAgIHsweDY5fQkvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLworI2RlZmluZSBDRkdfSTJDX05PUFJPQkVTCXsweDY5fQkvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLwogI2RlZmluZSBDRkdfSTJDX09GRlNFVAkJMHgzMDAwCiAKIC8qCiAgKiBHZW5lcmFsIFBDSQogICogTWVtb3J5IHNwYWNlIGlzIG1hcHBlZCAxLTEsIGJ1dCBJL08gc3BhY2UgbXVzdCBzdGFydCBmcm9tIDAuCiAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QSFlTCQkweDgwMDAwMDAwCS8qIDFHIFBDSSBUTEIgKi8KKwogI2RlZmluZSBDRkdfUENJMV9NRU1fQkFTRQkweDgwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kxX01FTV9QSFlTCUNGR19QQ0kxX01FTV9CQVNFCi0jZGVmaW5lIENGR19QQ0kxX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLworI2RlZmluZSBDRkdfUENJMV9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KICNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkweDAwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kxX0lPX1BIWVMJMHhlMjAwMDAwMAotI2RlZmluZSBDRkdfUENJMV9JT19TSVpFCTB4MDA4MDAwMDAJLyogOE0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDAwMTAwMDAwCS8qIDFNICovCiAKLSNkZWZpbmUgQ0ZHX1BDSTJfTUVNX0JBU0UJMHg5MDAwMDAwMAorI2lmZGVmIENPTkZJR19QQ0kyCisjZGVmaW5lIENGR19QQ0kyX01FTV9CQVNFCTB4YTAwMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTJfTUVNX1BIWVMJQ0ZHX1BDSTJfTUVNX0JBU0UKLSNkZWZpbmUgQ0ZHX1BDSTJfTUVNX1NJWkUJMHgxMDAwMDAwMAkvKiAyNTZNICovCisjZGVmaW5lIENGR19QQ0kyX01FTV9TSVpFCTB4MjAwMDAwMDAJLyogNTEyTSAqLwogI2RlZmluZSBDRkdfUENJMl9JT19CQVNFCTB4MDAwMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTJfSU9fUEhZUwkweGUyODAwMDAwCi0jZGVmaW5lIENGR19QQ0kyX0lPX1NJWkUJMHgwMDgwMDAwMAkvKiA4TSAqLworI2RlZmluZSBDRkdfUENJMl9JT19TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKyNlbmRpZgogCi0jZGVmaW5lIENGR19QRVhfTUVNX0JBU0UJMHhhMDAwMDAwMAotI2RlZmluZSBDRkdfUEVYX01FTV9QSFlTCUNGR19QRVhfTUVNX0JBU0UKLSNkZWZpbmUgQ0ZHX1BFWF9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KLSNkZWZpbmUgQ0ZHX1BFWF9JT19CQVNFCQkweDAwMDAwMDAwCi0jZGVmaW5lIENGR19QRVhfSU9fUEhZUwkJMHhlMzAwMDAwMAotI2RlZmluZSBDRkdfUEVYX0lPX1NJWkUJCTB4MDEwMDAwMDAJLyogMTZNICovCisjaWZkZWYgQ09ORklHX1BDSUUxCisjZGVmaW5lIENGR19QQ0lFMV9NRU1fQkFTRQkweGEwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lFMV9NRU1fUEhZUwlDRkdfUENJRTFfTUVNX0JBU0UKKyNkZWZpbmUgQ0ZHX1BDSUUxX01FTV9TSVpFCTB4MjAwMDAwMDAJLyogNTEyTSAqLworI2RlZmluZSBDRkdfUENJRTFfSU9fQkFTRQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lFMV9JT19QSFlTCTB4ZTMwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSUUxX0lPX1NJWkUJMHgwMDEwMDAwMAkvKiAgIDFNICovCisjZW5kaWYKIAorI2lmZGVmIENPTkZJR19SSU8KIC8qCiAgKiBSYXBpZElPIE1NVQogICovCiAjZGVmaW5lIENGR19SSU9fTUVNX0JBU0UJMHhDMDAwMDAwMAogI2RlZmluZSBDRkdfUklPX01FTV9TSVpFCTB4MjAwMDAwMDAJLyogNTEyTSAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVHQUNZCisjZGVmaW5lIEJSSURHRV9JRCAxNworI2RlZmluZSBWSUFfSUQgMgorI2Vsc2UKKyNkZWZpbmUgQlJJREdFX0lEIDI4CisjZGVmaW5lIFZJQV9JRCA0CisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCi0jZGVmaW5lIENPTkZJR19QQ0lfUE5QCSAgICAgICAgICAgICAgIAkvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheSAqLwotI2RlZmluZSBDT05GSUdfODVYWF9QQ0kyCisjZGVmaW5lIENPTkZJR19QQ0lfUE5QCQkJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgKi8KIAogI3VuZGVmIENPTkZJR19FRVBSTzEwMAogI3VuZGVmIENPTkZJR19UVUxJUAogCiAjdW5kZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cJCS8qIHNob3cgcGNpIGRldmljZXMgb24gc3RhcnR1cCAqLwotI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEwNTcgIC8qIE1vdG9yb2xhICovCisKKy8qIFBDSSB2aWV3IG9mIFN5c3RlbSBNZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfQlVTCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfUEhZUwkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX1NJWkUJMHg4MDAwMDAwMAogCiAjZW5kaWYJLyogQ09ORklHX1BDSSAqLwogCkBAIC0zODcsNyArNDI0LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCiAKICNpZm5kZWYgQ09ORklHX05FVF9NVUxUSQotI2RlZmluZSBDT05GSUdfTkVUX01VTFRJIAkxCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQogI2VuZGlmCiAKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KQEAgLTM5Nyw3ICs0MzQsNyBAQAogI2RlZmluZSBDT05GSUdfVFNFQzJfTkFNRQkiZVRTRUMxIgogI2RlZmluZSBDT05GSUdfVFNFQzMJMQogI2RlZmluZSBDT05GSUdfVFNFQzNfTkFNRQkiZVRTRUMyIgotI3VuZGVmIENPTkZJR19UU0VDNAorI2RlZmluZSBDT05GSUdfVFNFQzQKICNkZWZpbmUgQ09ORklHX1RTRUM0X05BTUUJImVUU0VDMyIKICN1bmRlZiBDT05GSUdfTVBDODVYWF9GRUMKIApAQCAtNDEzLDcgKzQ1MCw3IEBACiAKIC8qIE9wdGlvbnMgYXJlOiBlVFNFQ1swLTNdICovCiAjZGVmaW5lIENPTkZJR19FVEhQUklNRQkJImVUU0VDMCIKLQorI2RlZmluZSBDT05GSUdfUEhZX0dJR0UJCTEJLyogSW5jbHVkZSBHYkUgc3BlZWQvZHVwbGV4IGRldGVjdGlvbiAqLwogI2VuZGlmCS8qIENPTkZJR19UU0VDX0VORVQgKi8KIAogLyoKQEAgLTQyNywxOSArNDY0LDI4IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQ0OSw3ICs0OTUsNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC00NjQsMTIgKzUxMCwxMiBAQAogICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKICAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KICAqLwotI2RlZmluZSBDRkdfQk9PVE1BUFNaCSg4IDw8IDIwKSAJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCovCisjZGVmaW5lIENGR19CT09UTUFQU1oJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXgqLwogCiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNDgxLDcgKzUyNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtNDkyLDU4ICs1MzgsMTU2IEBACiAKIC8qIFRoZSBtYWMgYWRkcmVzc2VzIGZvciBhbGwgZXRoZXJuZXQgaW50ZXJmYWNlICovCiAjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQotI2RlZmluZSBDT05GSUdfRVRIQUREUiAgIDAwOkUwOjBDOjAwOjAwOkZECisjZGVmaW5lIENPTkZJR19FVEhBRERSCSAwMDpFMDowQzowMDowMDpGRAogI2RlZmluZSBDT05GSUdfSEFTX0VUSDEKLSNkZWZpbmUgQ09ORklHX0VUSDFBRERSICAwMDpFMDowQzowMDowMTpGRAorI2RlZmluZSBDT05GSUdfRVRIMUFERFIJIDAwOkUwOjBDOjAwOjAxOkZECiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMgotI2RlZmluZSBDT05GSUdfRVRIMkFERFIgIDAwOkUwOjBDOjAwOjAyOkZECisjZGVmaW5lIENPTkZJR19FVEgyQUREUgkgMDA6RTA6MEM6MDA6MDI6RkQKICNkZWZpbmUgQ09ORklHX0hBU19FVEgzCi0jZGVmaW5lIENPTkZJR19FVEgzQUREUiAgMDA6RTA6MEM6MDA6MDM6RkQKKyNkZWZpbmUgQ09ORklHX0VUSDNBRERSCSAwMDpFMDowQzowMDowMzpGRAogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0lQQUREUiAgICAxOTIuMTY4LjEuMjUzCisjZGVmaW5lIENPTkZJR19JUEFERFIJIDE5Mi4xNjguMS4yNTMKIAotI2RlZmluZSBDT05GSUdfSE9TVE5BTUUgIHVua25vd24KLSNkZWZpbmUgQ09ORklHX1JPT1RQQVRIICAvbmZzcm9vdAotI2RlZmluZSBDT05GSUdfQk9PVEZJTEUgIHlvdXIudUltYWdlCisjZGVmaW5lIENPTkZJR19IT1NUTkFNRQkgdW5rbm93bgorI2RlZmluZSBDT05GSUdfUk9PVFBBVEgJIC9uZnNyb290CisjZGVmaW5lIENPTkZJR19CT09URklMRQk4NTQ4Y2RzL3VJbWFnZS51Ym9vdAorI2RlZmluZSBDT05GSUdfVUJPT1RQQVRICTg1NDhjZHMvdS1ib290LmJpbgkvKiBURlRQIHNlcnZlciAqLwogCi0jZGVmaW5lIENPTkZJR19TRVJWRVJJUCAgMTkyLjE2OC4xLjEKKyNkZWZpbmUgQ09ORklHX1NFUlZFUklQCSAxOTIuMTY4LjEuMQogI2RlZmluZSBDT05GSUdfR0FURVdBWUlQIDE5Mi4xNjguMS4xCi0jZGVmaW5lIENPTkZJR19ORVRNQVNLICAgMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkgMjU1LjI1NS4yNTUuMAogCi0jZGVmaW5lIENPTkZJR19MT0FEQUREUiAgMjAwMDAwICAgLypkZWZhdWx0IGxvY2F0aW9uIGZvciB0ZnRwIGFuZCBib290bSovCisjZGVmaW5lIENPTkZJR19MT0FEQUREUgkxMDAwMDAwCS8qZGVmYXVsdCBsb2NhdGlvbiBmb3IgdGZ0cCBhbmQgYm9vdG0qLwogCi0jZGVmaW5lIENPTkZJR19CT09UREVMQVkgMTAgICAgICAgLyogLTEgZGlzYWJsZXMgYXV0by1ib290ICovCi0jdW5kZWYgIENPTkZJR19CT09UQVJHUyAgICAgICAgICAgLyogdGhlIGJvb3QgY29tbWFuZCB3aWxsIHNldCBib290YXJncyovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkgMTAJLyogLTEgZGlzYWJsZXMgYXV0by1ib290ICovCisjdW5kZWYJQ09ORklHX0JPT1RBUkdTCQkvKiB0aGUgYm9vdCBjb21tYW5kIHdpbGwgc2V0IGJvb3RhcmdzKi8KIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCiAKLSNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkgICAgICAgIFwKLSAgICJuZXRkZXY9ZXRoMFwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJjb25zb2xlZGV2PXR0eVMxXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrYWRkcj02MDAwMDBcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrZmlsZT15b3VyLnJhbWRpc2sudS1ib290XDAiCQkJCQlcCi0gICAiZmR0YWRkcj00MDAwMDBcMCIJCQkJCQkJXAotICAgImZkdGZpbGU9eW91ci5mZHQuZHRiXDAiCisjaWYgZGVmaW5lZChDT05GSUdfUENJRTEpCisjZGVmaW5lIFBDSUVfRU5WIFwKKyAicGNpZXJlZz1tZCAke2F9MDAwIDY7IG1kICR7YX0wMjAgNDsgbWQgJHthfWJmOCAyOyBlY2hvIG87bWQgJHthfWMwMCAyNTsiIFwKKwkiZWNobyBpOyBtZCAke2F9ZGEwIDE1OyBlY2hvIGU7bWQgJHthfWUwMCBlOyBlY2hvIGQ7IG1kICR7YX1mMDAgY1wwIiBcCisgInBjaWVlcnI9bWQgJHthfTAyMCAxOyBtZCAke2F9ZTAwIGU7IHBjaSBkLmIgJGIuMCA3IDE7IHBjaSBkLncgJGIuMCAxZSAxOyIgXAorCSJwY2kgZC53ICRiLjAgNTYgMTsgcGNpIGQgJGIuMCAxMDQgMTsgcGNpIGQgJGIuMCAxMTAgMTsiIFwKKwkicGNpIGQgJGIuMCAxMzAgMVwwIiBcCisgInBjaWVlcnJjPW13ICR7YX0wMjAgZmZmZmZmZmY7IG13ICR7YX1lMDAgZmZmZmZmZmY7IHBjaSB3LmIgJGIuMCA3IGZmOyIgXAorCSJwY2kgdy53ICRiLjAgMWUgZmZmZjsgcGNpIHcudyAkYi4wIDU2IGZmZmY7IHBjaSB3ICRiLjAgMTA0IGZmZmZmZmZmOyJcCisJInBjaSB3ICRiLjAgMTEwIGZmZmZmZmZmOyBwY2kgdyAkYi4wIDEzMCBmZmZmZmZmZlwwIiBcCisgInBjaWVjZmc9cGNpIGQgJGIuMCAwIDIwOyBwY2kgZCAkYi4wIDEwMCBlOyBwY2kgZCAkYi4wIDQwMCA2OVwwIiBcCisgInBjaWUxcmVncz1zZXRlbnYgYSBlMDAwYTsgcnVuIHBjaWVyZWdcMCIgXAorICJwY2llMWNmZz1zZXRlbnYgYiAzOyBydW4gcGNpZWNmZ1wwIiBcCisgInBjaWUxZXJyPXNldGVudiBhIGUwMDBhOyBzZXRlbnYgYiAzOyBydW4gcGNpZWVyclwwIiBcCisgInBjaWUxZXJyYz1zZXRlbnYgYSBlMDAwYTsgc2V0ZW52IGIgMzsgcnVuIHBjaWVlcnJjXDAiCisjZWxzZQorI2RlZmluZQlQQ0lFX0VOViAiIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kxKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kyKQorI2RlZmluZSBQQ0lfRU5WIFwKKyAicGNpcmVnPW1kICR7YX0wMDAgMzsgZWNobyBvO21kICR7YX1jMDAgMjU7IGVjaG8gaTsgbWQgJHthfWRhMCAxNTsiIFwKKwkiZWNobyBlO21kICR7YX1lMDAgOVwwIiBcCisgInBjaWVycj1tZCAke2F9ZTAwIDg7IHBjaSBkLmIgJGIuMCA3IDE7cGNpIGQudyAkYi4wIDFlIDE7IiBcCisJInBjaSBkLncgJGIuMCA1NiAxXDAiIFwKKyAicGNpZXJyYz1tdyAke2F9ZTAwIGZmZmZmZmZmOyBtdyAke2F9ZTBjIDA7IHBjaSB3LmIgJGIuMCA3IGZmOyIgXAorCSJwY2kgdy53ICRiLjAgMWUgZmZmZjsgcGNpIHcudyAkYi4wIDU2IGZmZmZcMCIKKyNlbHNlCisjZGVmaW5lCVBDSV9FTlYgIiIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJMSkKKyNkZWZpbmUgUENJX0VOVjEgXAorICJwY2kxcmVncz1zZXRlbnYgYSBlMDAwODsgcnVuIHBjaXJlZ1wwIiBcCisgInBjaTFlcnI9c2V0ZW52IGEgZTAwMDg7IHNldGVudiBiIDA7IHJ1biBwY2llcnJcMCIgXAorICJwY2kxZXJyYz1zZXRlbnYgYSBlMDAwODsgc2V0ZW52IGIgMDsgcnVuIHBjaWVycmNcMCIKKyNlbHNlCisjZGVmaW5lCVBDSV9FTlYxICIiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSTIpCisjZGVmaW5lIFBDSV9FTlYyIFwKKyAicGNpMnJlZ3M9c2V0ZW52IGEgZTAwMDk7IHJ1biBwY2lyZWdcMCIgXAorICJwY2kyZXJyPXNldGVudiBhIGUwMDA5OyBzZXRlbnYgYiAxMjM7IHJ1biBwY2llcnJcMCIJXAorICJwY2kyZXJyYz1zZXRlbnYgYSBlMDAwOTsgc2V0ZW52IGIgMTIzOyBydW4gcGNpZXJyY1wwIgorI2Vsc2UKKyNkZWZpbmUJUENJX0VOVjIgIiIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQorI2RlZmluZSBFTkVUX0VOViBcCisgImVuZXRyZWcxPW1kICR7YX0wMDAgMjsgbWQgJHthfTAxMCA5OyBtZCAke2F9MDUwIDQ7IG1kICR7YX0wOGMgMTsiIFwKKwkibWQgJHthfTA5OCAyXDAiIFwKKyAiZW5ldHJlZ3Q9ZWNobyB0O21kICR7YX0xMDAgNjsgbWQgJHthfTE0MCAyOyBtZCAke2F9MTgwIDEwOyBtZCAke2F9MjAwIDEwXDAiIFwKKyAiZW5ldHJlZ3I9ZWNobyByO21kICR7YX0zMDAgNjsgbWQgJHthfTMzMCA1OyBtZCAke2F9MzgwIDEwOyBtZCAke2F9NDAwIDEwXDAiIFwKKyAiZW5ldHJlZ209ZWNobyBtYWM7bWQgJHthfTUwMCA1OyBtZCAke2F9NTIwIDI4O2VjaG8gZmlmbzttZCAke2F9YTAwIDE7IiBcCisJImVjaG8gbWliO21kICR7YX02ODAgMzFcMCIgXAorICJlbmV0cmVnPXJ1biBlbmV0cmVnMTsgcnVuIGVuZXRyZWdtOyBydW4gZW5ldHJlZ3Q7IHJ1biBlbmV0cmVnclwwIiBcCisgImVuZXQxcmVncz1zZXRlbnYgYSBlMDAyNDsgcnVuIGVuZXRyZWdcMCIgXAorICJlbmV0MnJlZ3M9c2V0ZW52IGEgZTAwMjU7IHJ1biBlbmV0cmVnXDAiIFwKKyAiZW5ldDNyZWdzPXNldGVudiBhIGUwMDI2OyBydW4gZW5ldHJlZ1wwIiBcCisgImVuZXQ0cmVncz1zZXRlbnYgYSBlMDAyNzsgcnVuIGVuZXRyZWdcMCIKKyNlbHNlCisjZGVmaW5lIEVORVRfRU5WICIiCisjZW5kaWYKKworI2lmIDAKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQlcCisgIm5ldGRldj1ldGgwXDAiCQkJCQkJXAorICJ1Ym9vdD0iIE1LX1NUUihDT05GSUdfVUJPT1RQQVRIKSAiXDAiCQkJCVwKKyAidGZ0cGZsYXNoPXRmdHBib290ICRsb2FkYWRkciAkdWJvb3Q7ICIJCQlcCisJInByb3RlY3Qgb2ZmICIgTUtfU1RSKFRFWFRfQkFTRSkgIiArJGZpbGVzaXplOyAiCVwKKwkiZXJhc2UgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJCVwKKwkiY3AuYiAkbG9hZGFkZHIgIiBNS19TVFIoVEVYVF9CQVNFKSAiICRmaWxlc2l6ZTsgIglcCisJInByb3RlY3Qgb24gIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJCVwKKwkiY21wLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemVcMCIJXAorICJjb25zb2xlZGV2PXR0eVMxXDAiCQkJCVwKKyAicmFtZGlza2FkZHI9MjAwMDAwMFwwIgkJCVwKKyAicmFtZGlza2ZpbGU9cmFtZGlzay51Ym9vdFwwIgkJCVwKKyAiZHRiYWRkcj1jMDAwMDBcMCIJCQkJXAorICJkdGJmaWxlPW1wYzg1NDhjZHMuZHRiXDAiCQkJXAorICJlb2k9bXcgZTAwNDAwYjAgMFwwIgkJCQlcCisgImlhY2s9bWQgZTAwNDAwYTAgMVwwIgkJCQlcCisgImRkcnJlZz1tZCAke2F9MDAwIDg7IG1kICR7YX0wODAgODttZCAke2F9MTAwIGQ7IG1kICR7YX0xNDAgNDsgbWQgJHthfWJmMCA0OyIgXAorCSJtZCAke2F9ZTAwIDM7IG1kICR7YX1lMjAgMzsgbWQgJHthfWU0MCA3OyBtZCAke2F9ZjAwIDVcMCIgXAorICJkZHJyZWdzPXNldGVudiBhIGUwMDAyOyBydW4gZGRycmVnXDAiCQlcCisgImd1cmVnPW1kICR7YX0wMDAgMmM7IG1kICR7YX0wYjAgMTsgbWQgJHthfTBjMCAxOyBtZCAke2F9YjIwIDM7IiBcCisJIm1kICR7YX1lMDAgMTsgbWQgJHthfWU2MCAxOyBtZCAke2F9ZWYwIDE1XDAiCVwKKyAiZ3VyZWdzPXNldGVudiBhIGUwMGUwOyBydW4gZ3VyZWdcMCIJCVwKKyAiZWNtcmVnPW1kICR7YX0wMDAgMTsgbWQgJHthfTAxMCAxOyBtZCAke2F9YmY4IDI7IG1kICR7YX1lMDAgNlwwIiBcCisgImVjbXJlZ3M9c2V0ZW52IGEgZTAwMDE7IHJ1biBlY21yZWdcMCIgXAorICJsYXdyZWdzPW1kIGUwMDAwYzA4IDRiXDAiIFwKKyAibGJjcmVncz1tZCBlMDAwNTAwMCAzNlwwIiBcCisgImRtYTByZWdzPW1kIGUwMDIxMTAwIDEyXDAiIFwKKyAiZG1hMXJlZ3M9bWQgZTAwMjExODAgMTJcMCIgXAorICJkbWEycmVncz1tZCBlMDAyMTIwMCAxMlwwIiBcCisgImRtYTNyZWdzPW1kIGUwMDIxMjgwIDEyXDAiIFwKKyBQQ0lFX0VOViBcCisgUENJX0VOViBcCisgUENJX0VOVjEgXAorIFBDSV9FTlYyIFwKKyBFTkVUX0VOVgorI2VuZGlmCiAKIAotI2RlZmluZSBDT05GSUdfTkZTQk9PVENPTU1BTkQJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICJuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECQkJCQkJXAorICAgInNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQkJCVwKKyAgICAgICJuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgkJCQkJXAogICAgICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIgXAotICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiICAgICAgICAgICAgICAgICAgICAgXAotICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJCVwKLSAgICJib290bSAkbG9hZGFkZHIgLSAkZmR0YWRkciIKKyAgICAgICJjb25zb2xlPSRjb25zb2xlZGV2LCRiYXVkcmF0ZSAkb3RoYm9vdGFyZ3M7IgkJCVwKKyAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IgkJCQkJCVwKKyAgICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCQkJCQlcCisgICAiYm9vdG0gJGxvYWRhZGRyIC0gJGR0YmFkZHIiCiAKIAogI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQgXAotICAgInNldGVudiBib290YXJncyByb290PS9kZXYvcmFtIHJ3ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiICAgICAgICAgICAgICAgICAgICAgXAotICAgInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIiCisgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcncgIgkJCQkJXAorICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCQkJXAorICAgInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiCQkJCQlcCisgICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCQlcCisgICAidGZ0cCAkZHRiYWRkciAkZHRiZmlsZTsiCQkJCQkJXAorICAgImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIgJGR0YmFkZHIiCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5EICBDT05GSUdfTkZTQk9PVENPTU1BTkQKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECUNPTkZJR19ORlNCT09UQ09NTUFORAogCiAjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzg1NTVDRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTU1Q0RTLmgKaW5kZXggYjdlNzAzYy4uZThmZTk5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg1NTVDRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU1NUNEUy5oCkBAIC0zNTAsNiArMzUwLDEzIEBACiAjZGVmaW5lIENGR19QQ0kyX0lPX1BIWVMJMHhlMjEwMDAwMAogI2RlZmluZSBDRkdfUENJMl9JT19TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KIAorI2lmZGVmIENPTkZJR19MRUdBQ1kKKyNkZWZpbmUgQlJJREdFX0lEIDE3CisjZGVmaW5lIFZJQV9JRCAyCisjZWxzZQorI2RlZmluZSBCUklER0VfSUQgMjgKKyNkZWZpbmUgVklBX0lEIDQKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCkBAIC00MDEsMTkgKzQwOCwyOCBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QQ0kgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDIFwKLQkJCQl8IENGR19DTURfTUlJKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDIFwKLQkJCQl8IENGR19DTURfTUlJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00MjMsNyArNDM5LDcgQEAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDQzLDcgKzQ1OSw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNDU1LDcgKzQ3MSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzg1NjBBRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTYwQURTLmgKaW5kZXggMDQzMzk3Zi4uYzEwZTU1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg1NjBBRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU2MEFEUy5oCkBAIC00Myw5ICs0Myw3IEBACiAKICNkZWZpbmUgQ09ORklHX1BDSQogI2RlZmluZSBDT05GSUdfVFNFQ19FTkVUIAkJLyogdHNlYyBldGhlcm5ldCBzdXBwb3J0ICovCi0jdW5kZWYgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLwotI3VuZGVmICBDT05GSUdfRVRIRVJfT05fRkNDICAgICAgICAgICAgIC8qIGNwbSBGQ0MgZXRoZXJuZXQgc3VwcG9ydCAqLwotI2RlZmluZSAgQ09ORklHX0VUSEVSX09OX0ZDQyAgICAgICAgICAgICAvKiBjcG0gRkNDIGV0aGVybmV0IHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfRVRIRVJfT05fRkNDICAgICAgICAgICAgIC8qIGNwbSBGQ0MgZXRoZXJuZXQgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQogI2RlZmluZSBDT05GSUdfU1BEX0VFUFJPTQkJLyogVXNlIFNQRCBFRVBST00gZm9yIEREUiBzZXR1cCovCiAjZGVmaW5lIENPTkZJR19ERFJfRExMCQkJLyogcG9zc2libGUgRExMIGZpeCBuZWVkZWQgKi8KQEAgLTM0OSwxMyArMzQ3LDE1IEBACiAjZW5kaWYJLyogQ09ORklHX1BDSSAqLwogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCisjaWZkZWYgQ09ORklHX1RTRUNfRU5FVAogCiAjaWZuZGVmIENPTkZJR19ORVRfTVVMVEkKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSSAJMQogI2VuZGlmCiAKKyNpZm5kZWYgQ09ORklHX01JSQogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLworI2VuZGlmCiAjZGVmaW5lIENPTkZJR19UU0VDMQkxCiAjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FCSJUU0VDMCIKICNkZWZpbmUgQ09ORklHX1RTRUMyCTEKQEAgLTM2OSw5ICszNjksMTAgQEAKIC8qIE9wdGlvbnMgYXJlOiBUU0VDWzAtMV0gKi8KICNkZWZpbmUgQ09ORklHX0VUSFBSSU1FCQkiVFNFQzAiCiAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykJLyogQ1BNIEZDQyBFdGhlcm5ldCAqLworI2VuZGlmIC8qIENPTkZJR19UU0VDX0VORVQgKi8KIAotI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLworI2lmZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MJLyogQ1BNIEZDQyBFdGhlcm5ldCAqLworCiAjdW5kZWYgIENPTkZJR19FVEhFUl9OT05FCS8qIGRlZmluZSBpZiBldGhlciBvbiBzb21ldGhpbmcgZWxzZSAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfSU5ERVggICAgICAyICAgICAgIC8qIHdoaWNoIGNoYW5uZWwgZm9yIGV0aGVyICovCiAKQEAgLTM5Miw3ICszOTMsMTAgQEAKICAgI2RlZmluZSBGRVRIM19SU1QJCTB4ODAKICNlbmRpZiAgCQkJCS8qIENPTkZJR19FVEhFUl9JTkRFWCAqLwogCi0jZGVmaW5lIENPTkZJR19NSUkJCQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KKyNpZm5kZWYgQ09ORklHX01JSQorI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLworI2VuZGlmCisKICNkZWZpbmUgQ09ORklHX0JJVEJBTkdNSUkJCS8qIGJpdC1iYW5nIE1JSSBQSFkgbWFuYWdlbWVudCAqLwogCiAvKgpAQCAtNDMyLDQ2ICs0MzYsMzYgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX1BDSQkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQkJXAotCQkJCSYgfihDRkdfQ01EX0VOVikpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmIH4oQ0ZHX0NNRF9FTlYpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKKyAgICAjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00ODIsNyArNDc2LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDEwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTUwMyw3ICs0OTcsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC01MTUsNyArNTA5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC01NTMsOSArNTQ3LDExIEBACiAKICNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkgICAgICAgIFwKICAgICJuZXRkZXY9ZXRoMFwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJjb25zb2xlZGV2PXR0eVMwXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrYWRkcj00MDAwMDBcMCIJCQkJCQlcCi0gICAicmFtZGlza2ZpbGU9eW91ci5yYW1kaXNrLnUtYm9vdFwwIgorICAgImNvbnNvbGVkZXY9dHR5Q1BNXDAiCQkJCQkJXAorICAgInJhbWRpc2thZGRyPTEwMDAwMDBcMCIJCQkJCQlcCisgICAicmFtZGlza2ZpbGU9eW91ci5yYW1kaXNrLnUtYm9vdFwwIgkJCQkJXAorICAgImZkdGFkZHI9NDAwMDAwXDAiCQkJCQkJCVwKKyAgICJmZHRmaWxlPW1wYzg1NjBhZHMuZHRiXDAiCiAKICNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NjMsMTQgKzU1OSwxNiBAQAogICAgICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIgXAogICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiICAgICAgICAgICAgICAgICAgICAgXAogICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgImJvb3RtICRsb2FkYWRkciIKKyAgICJ0ZnRwICRmZHRhZGRyICRmZHRmaWxlOyIJCQkJCQlcCisgICAiYm9vdG0gJGxvYWRhZGRyIC0gJGZkdGFkZHIiCiAKICNkZWZpbmUgQ09ORklHX1JBTUJPT1RDT01NQU5EIFwKICAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICJjb25zb2xlPSRjb25zb2xlZGV2LCRiYXVkcmF0ZSAkb3RoYm9vdGFyZ3M7IiAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRyYW1kaXNrYWRkciAkcmFtZGlza2ZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyIgorICAgInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJCVwKKyAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyICRmZHRhZGRyIgogCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCAgQ09ORklHX05GU0JPT1RDT01NQU5ECiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTY4TURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU2OE1EUy5oCmluZGV4IDBmZjA0MTYuLmRjOWNiMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTY4TURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NjhNRFMuaApAQCAtMjgsMjAgKzI4LDIxIEBACiAKIC8qIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zICovCiAjZGVmaW5lIENPTkZJR19CT09LRQkJMQkvKiBCT09LRSAqLwotI2RlZmluZSBDT05GSUdfRTUwMAkJCTEJLyogQk9PS0UgZTUwMCBmYW1pbHkgKi8KKyNkZWZpbmUgQ09ORklHX0U1MDAJCTEJLyogQk9PS0UgZTUwMCBmYW1pbHkgKi8KICNkZWZpbmUgQ09ORklHX01QQzg1eHgJCTEJLyogTVBDODU0MC82MC81NS80MS80OC82OCAqLwogI2RlZmluZSBDT05GSUdfTVBDODU2OAkJMQkvKiBNUEM4NTY4IHNwZWNpZmljICovCiAjZGVmaW5lIENPTkZJR19NUEM4NTY4TURTCTEJLyogTVBDODU2OE1EUyBib2FyZCBzcGVjaWZpYyAqLwogCi0jdW5kZWYgQ09ORklHX1BDSQorI2RlZmluZSBDT05GSUdfUENJCiAjZGVmaW5lIENPTkZJR19UU0VDX0VORVQgCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfUUUJCQkvKiBFbmFibGUgUUUgKi8KICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKICNkZWZpbmUgQ09ORklHX1NQRF9FRVBST00JCS8qIFVzZSBTUEQgRUVQUk9NIGZvciBERFIgc2V0dXAqLwogI2RlZmluZSBDT05GSUdfRERSX0RMTAkJCS8qIHBvc3NpYmxlIERMTCBmaXggbmVlZGVkICovCiAvKiNkZWZpbmUgQ09ORklHX0REUl8yVF9USU1JTkcJCSBTZXRzIHRoZSAyVCB0aW1pbmcgYml0ICovCiAKIC8qI2RlZmluZSBDT05GSUdfRERSX0VDQyovCQkJLyogb25seSBmb3IgRUNDIEREUiBtb2R1bGUgKi8KLS8qI2RlZmluZSBDT05GSUdfRUNDX0lOSVRfVklBX0REUkNPTlRST0xMRVIqLwkvKiAJIEREUiBjb250cm9sbGVyIG9yIERNQT8gKi8KKy8qI2RlZmluZSBDT05GSUdfRUNDX0lOSVRfVklBX0REUkNPTlRST0xMRVIqLwkvKiBERFIgY29udHJvbGxlciBvciBETUE/ICovCiAjZGVmaW5lIENPTkZJR19NRU1fSU5JVF9WQUxVRQkJMHhEZWFkQmVlZgogCiAKQEAgLTI5Nyw2ICsyOTgsNyBAQAogCiAjZGVmaW5lIE9GX0NQVQkJCSJQb3dlclBDLDg1NjhAMCIKICNkZWZpbmUgT0ZfU09DCQkJInNvYzg1NjhAZTAwMDAwMDAiCisjZGVmaW5lIE9GX1FFCQkJInFlQGUwMDgwMDAwIgogI2RlZmluZSBPRl9UQkNMSwkJKGJkLT5iaV9idXNmcmVxIC8gOCkKICNkZWZpbmUgT0ZfU1RET1VUX1BBVEgJCSIvc29jODU2OEBlMDAwMDAwMC9zZXJpYWxANDYwMCIKIApAQCAtMzA2LDExICszMDgsMTQgQEAKICNkZWZpbmUgQ09ORklHX0ZTTF9JMkMJCS8qIFVzZSBGU0wgY29tbW9uIEkyQyBkcml2ZXIgKi8KICNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0Ki8KICN1bmRlZglDT05GSUdfU09GVF9JMkMJCQkvKiBJMkMgYml0LWJhbmdlZCAqLworI2RlZmluZSBDT05GSUdfSTJDX01VTFRJX0JVUworI2RlZmluZSBDT05GSUdfSTJDX0NNRF9UUkVFCiAjZGVmaW5lIENGR19JMkNfU1BFRUQJCTQwMDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MgKi8KLSNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDU3CisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1MgogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCi0jZGVmaW5lIENGR19JMkNfTk9QUk9CRVMgICAgICAgIHsweDY5fQkvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLworI2RlZmluZSBDRkdfSTJDX05PUFJPQkVTICAgICAgICB7ezAsMHg2OX19CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCiAjZGVmaW5lIENGR19JMkNfT0ZGU0VUCQkweDMwMDAKKyNkZWZpbmUgQ0ZHX0kyQzJfT0ZGU0VUCQkweDMxMDAKIAogLyoKICAqIEdlbmVyYWwgUENJCkBAIC0zMTgsNyArMzIzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfUENJMV9NRU1fQkFTRQkweDgwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kxX01FTV9QSFlTCUNGR19QQ0kxX01FTV9CQVNFCi0jZGVmaW5lIENGR19QQ0kxX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLworI2RlZmluZSBDRkdfUENJMV9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KICNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkweDAwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kxX0lPX1BIWVMJMHhlMjAwMDAwMAogI2RlZmluZSBDRkdfUENJMV9JT19TSVpFCTB4MDA4MDAwMDAJLyogOE0gKi8KQEAgLTMzNyw2ICszNDIsNDQgQEAKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQogI2RlZmluZSBDT05GSUdfUENJX1BOUAkgICAgICAgICAgICAgICAJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgKi8KIAorI2lmZGVmIENPTkZJR19RRQorLyoKKyAqIFFFIFVFQyBldGhlcm5ldCBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1VFQ19FVEgKKyNpZm5kZWYgQ09ORklHX1RTRUNfRU5FVAorI2RlZmluZSBDT05GSUdfRVRIUFJJTUUgICAgICAgICAiRnJlZXNjYWxlIEdFVEgiCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX1BIWV9NT0RFX05FRURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19lVFNFQ19NRElPX0JVUworCisjaWZkZWYgQ09ORklHX2VUU0VDX01ESU9fQlVTCisjZGVmaW5lIENPTkZJR19NSUlNX0FERFJFU1MgCTB4RTAwMjQ1MjAKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19VRUNfRVRIMSAgICAgICAgIC8qIEdFVEgxICovCisKKyNpZmRlZiBDT05GSUdfVUVDX0VUSDEKKyNkZWZpbmUgQ0ZHX1VFQzFfVUNDX05VTSAgICAgICAgMCAgICAgICAvKiBVQ0MxICovCisjZGVmaW5lIENGR19VRUMxX1JYX0NMSyAgICAgICAgIFFFX0NMS19OT05FCisjZGVmaW5lIENGR19VRUMxX1RYX0NMSyAgICAgICAgIFFFX0NMSzE2CisjZGVmaW5lIENGR19VRUMxX0VUSF9UWVBFICAgICAgIEdJR0FfRVRICisjZGVmaW5lIENGR19VRUMxX1BIWV9BRERSICAgICAgIDcKKyNkZWZpbmUgQ0ZHX1VFQzFfSU5URVJGQUNFX01PREUgRU5FVF8xMDAwX0dNSUkKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19VRUNfRVRIMiAgICAgICAgIC8qIEdFVEgyICovCisKKyNpZmRlZiBDT05GSUdfVUVDX0VUSDIKKyNkZWZpbmUgQ0ZHX1VFQzJfVUNDX05VTSAgICAgICAgMSAgICAgICAvKiBVQ0MyICovCisjZGVmaW5lIENGR19VRUMyX1JYX0NMSyAgICAgICAgIFFFX0NMS19OT05FCisjZGVmaW5lIENGR19VRUMyX1RYX0NMSyAgICAgICAgIFFFX0NMSzE2CisjZGVmaW5lIENGR19VRUMyX0VUSF9UWVBFICAgICAgIEdJR0FfRVRICisjZGVmaW5lIENGR19VRUMyX1BIWV9BRERSICAgICAgIDEKKyNkZWZpbmUgQ0ZHX1VFQzJfSU5URVJGQUNFX01PREUgRU5FVF8xMDAwX0dNSUkKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19RRSAqLworCiAjdW5kZWYgQ09ORklHX0VFUFJPMTAwCiAjdW5kZWYgQ09ORklHX1RVTElQCiAKQEAgLTM0NSwxMyArMzg4LDEyIEBACiAKICNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKLQotI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLQogI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgCTEKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQorCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCiAjZGVmaW5lIENPTkZJR19UU0VDMQkxCiAjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FCSJlVFNFQzAiCkBAIC0zODMsMTkgKzQyNSwyOSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQwNSw3ICs0NTcsNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDI1LDcgKzQ3Nyw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNDM3LDcgKzQ4OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtNDQ3LDEyICs0OTksMTUgQEAKICAqLwogCiAvKiBUaGUgbWFjIGFkZHJlc3NlcyBmb3IgYWxsIGV0aGVybmV0IGludGVyZmFjZSAqLwotI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX1VFQ19FVEgpCisjZGVmaW5lIENPTkZJR19IQVNfRVRIMAogI2RlZmluZSBDT05GSUdfRVRIQUREUiAgIDAwOkUwOjBDOjAwOjAwOkZECiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMQogI2RlZmluZSBDT05GSUdfRVRIMUFERFIgIDAwOkUwOjBDOjAwOjAxOkZECiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMgogI2RlZmluZSBDT05GSUdfRVRIMkFERFIgIDAwOkUwOjBDOjAwOjAyOkZECisjZGVmaW5lIENPTkZJR19IQVNfRVRIMworI2RlZmluZSBDT05GSUdfRVRIM0FERFIgIDAwOkUwOjBDOjAwOjAzOkZECiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfSVBBRERSICAgIDE5Mi4xNjguMS4yNTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NjQxSFBDTi5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKaW5kZXggMTJhZjI0Zi4uNjRkY2JkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKQEAgLTQ2LDggKzQ2LDEwIEBACiAKICNkZWZpbmUgQ0ZHX1JFU0VUX0FERFJFU1MgICAgMHhmZmYwMDEwMAogCi0vKiN1bmRlZiBDT05GSUdfUENJKi8KLSNkZWZpbmUgQ09ORklHX1BDSQorI2RlZmluZSBDT05GSUdfUENJCQkxCS8qIEVuYWJsZSBQQ0kvUENJRSAqLworI2RlZmluZSBDT05GSUdfUENJMQkJMQkvKiBQQ0lFIGNvbnRyb2xlciAxIChVTEkgYnJpZGdlKSAqLworI2RlZmluZSBDT05GSUdfUENJMgkJMQkvKiBQQ0lFIGNvbnRyb2xlciAyIChzbG90KSAqLworI2RlZmluZSBDT05GSUdfRlNMX1BDSV9JTklUCTEJLyogVXNlIGNvbW1vbiBGU0wgaW5pdCBjb2RlICovCiAKICNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQpAQCAtNzYsNiArNzgsOSBAQAogI2RlZmluZSBMMl9FTkFCTEUJKEwyQ1JfTDJFKQogCiAjaWZuZGVmIENPTkZJR19TWVNfQ0xLX0ZSRVEKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfYm9hcmRfc3lzX2Nsayh1bnNpZ25lZCBsb25nIGR1bW15KTsKKyNlbmRpZgogI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAgICBnZXRfYm9hcmRfc3lzX2NsaygwKQogI2VuZGlmCiAKQEAgLTkzLDYgKzk4LDkgQEAKICNkZWZpbmUgQ0ZHX0NDU1JCQVIJCTB4ZjgwMDAwMDAJLyogcmVsb2NhdGVkIENDU1JCQVIgKi8KICNkZWZpbmUgQ0ZHX0lNTVIJCUNGR19DQ1NSQkFSCS8qIFBRSUkgdXNlcyBDRkdfSU1NUiAqLwogCisjZGVmaW5lIENGR19QQ0kxX0FERFIJCShDRkdfQ0NTUkJBUisweDgwMDApCisjZGVmaW5lIENGR19QQ0kyX0FERFIJCShDRkdfQ0NTUkJBUisweDkwMDApCisKIC8qCiAgKiBERFIgU2V0dXAKICAqLwpAQCAtMjMyLDcgKzI0MCw3IEBACiAjZGVmaW5lIENGR19JTklUX1NQX09GRlNFVAlDRkdfR0JMX0RBVEFfT0ZGU0VUCiAKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCSAgICAJKDI1NiAqIDEwMjQpICAgIC8qIFJlc2VydmUgMjU2IGtCIGZvciBNb24gKi8KLSNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JICAgIAkoMTI4ICogMTAyNCkgICAgLyogUmVzZXJ2ZWQgZm9yIG1hbGxvYyAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkgICAgCSgxMDI0ICogMTAyNCkgICAgLyogUmVzZXJ2ZWQgZm9yIG1hbGxvYyAqLwogCiAvKiBTZXJpYWwgUG9ydCAqLwogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgMQpAQCAtMjk2LDkgKzMwNCw5IEBACiAjZGVmaW5lIENGR19QQ0kxX01FTV9CQVNFCTB4ODAwMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1BIWVMJQ0ZHX1BDSTFfTUVNX0JBU0UKICNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1NJWkUJMHgyMDAwMDAwMAkvKiA1MTJNICovCi0jZGVmaW5lIENGR19QQ0kxX0lPX0JBU0UJMHhlMjAwMDAwMAotI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCUNGR19QQ0kxX0lPX0JBU0UKLSNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDEwMDAwMDAJLyogMTZNICovCisjZGVmaW5lIENGR19QQ0kxX0lPX0JBU0UJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCTB4ZTIwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDAwMTAwMDAwCS8qIDFNICovCiAKIC8qIFBDSSB2aWV3IG9mIFN5c3RlbSBNZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfQlVTICAgICAgMHgwMDAwMDAwMApAQCAtMzExLDEwICszMTksMTAgQEAKIAogI2RlZmluZSBDRkdfUENJMl9NRU1fQkFTRQkweGEwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kyX01FTV9QSFlTCUNGR19QQ0kyX01FTV9CQVNFCi0jZGVmaW5lIENGR19QQ0kyX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLwotI2RlZmluZSBDRkdfUENJMl9JT19CQVNFCTB4ZTMwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSTJfSU9fUEhZUwlDRkdfUENJMl9JT19CQVNFCi0jZGVmaW5lIENGR19QQ0kyX0lPX1NJWkUJMHgxMDAwMDAwCS8qIDE2TSAqLworI2RlZmluZSBDRkdfUENJMl9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTJfSU9fQkFTRQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0kyX0lPX1BIWVMJMHhlMzAwMDAwMAorI2RlZmluZSBDRkdfUENJMl9JT19TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIApAQCAtMzMwLDEyICszMzgsNDMgQEAKICN1bmRlZiBDT05GSUdfRUVQUk8xMDAKICN1bmRlZiBDT05GSUdfVFVMSVAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCIHN1cHBvcnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTkZJR19QQ0lfT0hDSQkJMQorI2RlZmluZSBDT05GSUdfVVNCX09IQ0lfTkVXCQkxCisjZGVmaW5lIENPTkZJR19VU0JfS0VZQk9BUkQJMQorI2RlZmluZSBDRkdfREVWSUNFX0RFUkVHSVNURVIKKyNkZWZpbmUgQ0ZHX1VTQl9FVkVOVF9QT0xMCTEKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRSAJIm9oY2lfcGNpIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMgMTUKKwogI2lmICFkZWZpbmVkKENPTkZJR19QQ0lfUE5QKQogICAgICNkZWZpbmUgUENJX0VORVQwX0lPQUREUgkweGUwMDAwMDAwCiAgICAgI2RlZmluZSBQQ0lfRU5FVDBfTUVNQUREUgkweGUwMDAwMDAwCiAgICAgI2RlZmluZSBQQ0lfSURTRUxfTlVNQkVSCTB4MGMgCS8qIHNsb3QwLT4zKElEU0VMKT0xMi0+MTUgKi8KICNlbmRpZgogCisvKlBDSUUgdmlkZW8gY2FyZCB1c2VkKi8KKyNkZWZpbmUgVklERU9fSU9fT0ZGU0VUCQlDRkdfUENJMl9JT19QSFlTCisKKy8qUENJIHZpZGVvIGNhcmQgdXNlZCovCisvKiNkZWZpbmUgVklERU9fSU9fT0ZGU0VUCUNGR19QQ0kxX0lPX1BIWVMqLworCisvKiB2aWRlbyAqLworI2RlZmluZSBDT05GSUdfVklERU8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPKQorI2RlZmluZSBDT05GSUdfQklPU0VNVQorI2RlZmluZSBDT05GSUdfQ0ZCX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX1ZJREVPX1NXX0NVUlNPUgorI2RlZmluZSBDT05GSUdfVkdBX0FTX1NJTkdMRV9ERVZJQ0UKKyNkZWZpbmUgQ09ORklHX0FUSV9SQURFT05fRkIKKyNkZWZpbmUgQ09ORklHX1ZJREVPX0xPR08KKy8qI2RlZmluZSBDT05GSUdfQ09OU09MRV9DVVJTT1IqLworI2RlZmluZSBDRkdfSVNBX0lPX0JBU0VfQUREUkVTUyBDRkdfUENJMl9JT19QSFlTCisjZW5kaWYKKwogI3VuZGVmIENPTkZJR19QQ0lfU0NBTl9TSE9XCQkvKiBzaG93IHBjaSBkZXZpY2VzIG9uIHN0YXJ0dXAgKi8KIAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMzQ5LDYgKzM4OCw4IEBACiAjZGVmaW5lIENGR19TQ1NJX01BWERFVklDRQlDRkdfU0NTSV9NQVhfREVWSUNFCiAjZW5kaWYKIAorI2RlZmluZSBDT05GSUdfTVBDODZYWF9QQ0kyCisKICNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCkBAIC0zOTYsMjAgKzQzNywyMCBAQAogICogMHhhMDAwXzAwMDAgIDUxMk0gICBQQ0ktRXhwcmVzcyAyIE1lbW9yeQogICoJQ2hhbmdlZCBpdCBmb3Igb3BlcmF0aW5nIGZyb20gMHhkMDAwMDAwMAogICovCi0jZGVmaW5lIENGR19EQkFUMUwgICAgICAoIENGR19QQ0kxX01FTV9CQVNFIHwgQkFUTF9QUF9SVyBcCisjZGVmaW5lIENGR19EQkFUMUwgICAgICAoIENGR19QQ0kxX01FTV9QSFlTIHwgQkFUTF9QUF9SVyBcCiAJCQl8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9HVUFSREVEU1RPUkFHRSkKLSNkZWZpbmUgQ0ZHX0RCQVQxVSAgICAgIChDRkdfUENJMV9NRU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQotI2RlZmluZSBDRkdfSUJBVDFMICAgICAgKENGR19QQ0kxX01FTV9CQVNFIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfREJBVDFVCShDRkdfUENJMV9NRU1fUEhZUyB8IEJBVFVfQkxfMUcgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQxTAkoQ0ZHX1BDSTFfTUVNX1BIWVMgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCiAjZGVmaW5lIENGR19JQkFUMVUgICAgICBDRkdfREJBVDFVCiAKIC8qCiAgKiBCQVQyICAgICAgICAgNTEyTSAgIENhY2hlLWluaGliaXRlZCwgZ3VhcmRlZAogICogMHhjMDAwXzAwMDAgIDUxMk0gICBSYXBpZElPIE1lbW9yeQogICovCi0jZGVmaW5lIENGR19EQkFUMkwgICAgICAoQ0ZHX1JJT19NRU1fQkFTRSB8IEJBVExfUFBfUlcgXAorI2RlZmluZSBDRkdfREJBVDJMICAgICAgKENGR19SSU9fTUVNX1BIWVMgfCBCQVRMX1BQX1JXIFwKIAkJCXwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQotI2RlZmluZSBDRkdfREJBVDJVICAgICAgKENGR19SSU9fTUVNX0JBU0UgfCBCQVRVX0JMXzUxMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKLSNkZWZpbmUgQ0ZHX0lCQVQyTCAgICAgIChDRkdfUklPX01FTV9CQVNFIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfREJBVDJVCShDRkdfUklPX01FTV9QSFlTIHwgQkFUVV9CTF81MTJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUMkwJKENGR19SSU9fTUVNX1BIWVMgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCiAjZGVmaW5lIENGR19JQkFUMlUgICAgICBDRkdfREJBVDJVCiAKIC8qCkBAIC00MjgsMTAgKzQ2OSwxMCBAQAogICogMHhlMzAwXzAwMDAgIDE2TSAgICBQQ0ktRXhwcmVzcyAyIEkvMAogICogICAgTm90ZSB0aGF0IHRoaXMgaXMgYXQgMHhlMDAwMDAwMAogICovCi0jZGVmaW5lIENGR19EQkFUNEwgICAgICAoIENGR19QQ0kxX0lPX0JBU0UgfCBCQVRMX1BQX1JXIFwKKyNkZWZpbmUgQ0ZHX0RCQVQ0TCAgICAgICggQ0ZHX1BDSTFfSU9fUEhZUyB8IEJBVExfUFBfUlcgXAogCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCi0jZGVmaW5lIENGR19EQkFUNFUgICAgICAoQ0ZHX1BDSTFfSU9fQkFTRSB8IEJBVFVfQkxfMzJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCi0jZGVmaW5lIENGR19JQkFUNEwgICAgICAoQ0ZHX1BDSTFfSU9fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0RCQVQ0VQkoQ0ZHX1BDSTFfSU9fUEhZUyB8IEJBVFVfQkxfMzJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUNEwJKENGR19QQ0kxX0lPX1BIWVMgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCiAjZGVmaW5lIENGR19JQkFUNFUgICAgICBDRkdfREJBVDRVCiAKIC8qCkBAIC00NjMsOCArNTA0LDggQEAKICAqLwogI2lmbmRlZiBDRkdfUkFNQk9PVAogICAgICNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCi0gICAgI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFICsgMHg0MDAwMCkKLSAgICAjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCQkweDQwMDAwCS8qIDI1Nksob25lIHNlY3RvcikgZm9yIGVudiAqLworICAgICNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRSArIDB4NjAwMDApCisgICAgI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkJMHgxMDAwMAkvKiA2NEsob25lIHNlY3RvcikgZm9yIGVudiAqLwogICAgICNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDIwMDAKICNlbHNlCiAgICAgI2RlZmluZSBDRkdfRU5WX0lTX05PV0hFUkUJMQkvKiBTdG9yZSBFTlYgaW4gbWVtb3J5IG9ubHkgKi8KQEAgLTQ3NSwzOSArNTE2LDM0IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisKICNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX1BDSQkJXAotCQkJCSB8IENGR19DTURfSTJDCQlcCi0JCQkJIHwgQ0ZHX0NNRF9TQ1NJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9FWFQyKQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVikpCi0gICNlbHNlCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMJCVwKLQkJCQl8IENGR19DTURfU0NTSQkJXAotCQkJCXwgQ0ZHX0NNRF9FWFQyKQotICAjZWxzZQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9TQ1NJCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC01MTgsNyArNTU0LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTUzOSw4ICs1NzUsOCBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyAgICAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCiAvKgpAQCAtNTUxLDkgKzU4Nyw5IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwotI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyAgICAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworICAgICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NVVNFTktJLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVVTRU5LSS5oCmluZGV4IGRhNTJlMGUuLmY4Y2YwMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NVVNFTktJLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01VU0VOS0kuaApAQCAtNTIsMTEgKzUyLDIwIEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgCSovCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCiAKIC8qCkBAIC0yODAsNyArMjg5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NVkJMVUUuaCBiL2luY2x1ZGUvY29uZmlncy9NVkJMVUUuaAppbmRleCA4OGVlZmExLi4wZGVmYWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVZCTFVFLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01WQkxVRS5oCkBAIC03NiwxNSArNzYsNDQgQEAKICNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCiAjZGVmaW5lIENPTkZJR19SRVNFVF9UT19SRVRSWQkJNjAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ0ZHX0NNRF9BU0tFTlYgfCBDRkdfQ01EX0JPT1REIHwgQ0ZHX0NNRF9DQUNIRSB8IENGR19DTURfREhDUAl8IFwKLQkJCQkgIENGR19DTURfRUNITwkgfCBDRkdfQ01EX0VOViAgIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfSU1JCXwgXAotCQkJCSAgQ0ZHX0NNRF9JUlEJIHwgQ0ZHX0NNRF9ORVQJIHwgQ0ZHX0NNRF9QQ0kJIHwgQ0ZHX0NNRF9SVU4gICApCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KIAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgKCAweGZmZmZmZmZmICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAJKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTMxMCw3ICszMzksNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NVlMxLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVZTMS5oCmluZGV4IDU5OTU5MTguLjc1ZWZkMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NVlMxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01WUzEuaApAQCAtNjMsMjcgKzYzLDM2IEBACiAKICN1bmRlZiAgQ09ORklHX0NBTl9EUklWRVIgICAgICAgLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkICAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9WRU5ET1JFWCApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfVkVORE9SRVgKIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotLyogTVZzZW5zb3IgdXNlcyBhIHJlYWxseSBtaW5pbWFsIFUtQm9vdCAhICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENGR19DTURfTE9BRFMJfCBcCi0JCQkJQ0ZHX0NNRF9MT0FEQgl8IFwKLQkJCQlDRkdfQ01EX0lNSQl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNICXwgXAotCQkJCUNGR19DTURfTUVNT1JZCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JPT1RECXwgXAotCQkJCUNGR19DTURfUlVOCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTk2LDcgKzEwNSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgICAgICI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNzIsNyArMTgxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05DNjUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaAppbmRleCBhMTJjOGRhLi5jMDUxYTM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaApAQCAtODUsNyArODUsMTUgQEAKIAogI3VuZGVmCUNPTkZJR19TVEFUVVNfTEVECQkvKiBTdGF0dXMgTEVEIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUJQ09ORklHX0ZFQ19FTkVUCQkxCS8qIHVzZSBGRUMgZXRoZXJuZXQgICovCiAjZGVmaW5lIEZFQ19FTkVUCkBAIC0xMzQsMjUgKzE0MiwyOCBAQAogI2RlZmluZSBDT05GSUdfUlRDX1BDRjg1NjMKICNkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUgkJMHg1MQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzAsNyArMjQxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05FVFBIT05FLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkVUUEhPTkUuaAppbmRleCA0NDRmNzIxLi5iYjNkMTlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkVUUEhPTkUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTkVUUEhPTkUuaApAQCAtODIsNyArODIsMTUgQEAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAjZGVmaW5lIENPTkZJR19CT0FSRF9TUEVDSUZJQ19MRUQJLyogdmVyc2lvbiBoYXMgYm9hcmQgc3BlY2lmaWMgbGVkcyAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgQ09ORklHX0JPT1RQX05JU0RPTUFJTikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9OSVNET01BSU4KIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTEwNSwyMCArMTEzLDIyIEBACiAKICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUJMQkvKiBhbGxvdyBtb2RpZmljYXRpb24gb2YgdmVuZG9yIHBhcmFtcyAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICAJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkgCXwgXAotCQkJCUNGR19DTURfQ0RQCSAgXAotCQkJCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9DRFAKKwogCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJMQogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0xMjgsNyArMTM4LDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCTEKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyMCw3ICsyMzAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEuaCBiL2luY2x1ZGUvY29uZmlncy9ORVRUQS5oCmluZGV4IDI1YjYzNDUuLjE5NzQzYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ORVRUQS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ORVRUQS5oCkBAIC03Nyw3ICs3NywxNiBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgQ09ORklHX0JPT1RQX05JU0RPTUFJTikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9OSVNET01BSU4KKwogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTExLDI2ICsxMjAsMjggQEAKIAkJCQkgQ0ZHX1BPU1RfQ09ERUMJICAgfCBcCiAJCQkJIENGR19QT1NUX0RTUAkgICApCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9DRFAJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRyAgICB8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTUlJIAl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICAJfCBcCi0JCQkJMCkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9DRFAKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJMQogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0xNDAsNyArMTUxLDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCTEKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyMyw3ICsyMzQsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEyLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEyLmgKaW5kZXggZTIwZTcyNC4uZmI4MDg1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL05FVFRBMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ORVRUQTIuaApAQCAtODIsNyArODIsMTYgQEAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAjZGVmaW5lIENPTkZJR19CT0FSRF9TUEVDSUZJQ19MRUQJLyogdmVyc2lvbiBoYXMgYm9hcmQgc3BlY2lmaWMgbGVkcyAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgQ09ORklHX0JPT1RQX05JU0RPTUFJTikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9OSVNET01BSU4KKwogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTA1LDIwICsxMTQsMjIgQEAKIAogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCS8qIGFsbG93IG1vZGlmaWNhdGlvbiBvZiB2ZW5kb3IgcGFyYW1zICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcgIAl8IFwKLQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJQ0ZHX0NNRF9DRFAJICBcCi0JCQkJKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0NEUAorCiAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRgkxCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTEyOCw3ICsxMzksNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJMQogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjIwLDcgKzIzMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ORVRWSUEuaCBiL2luY2x1ZGUvY29uZmlncy9ORVRWSUEuaAppbmRleCBlMzBiZTA5Li5kNGNiOWU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVklBLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL05FVFZJQS5oCkBAIC04MSwzNSArODEsNDUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSB8IENPTkZJR19CT09UUF9OSVNET01BSU4pCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisKIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfQkFTRSAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUElORwogCiAjaWYgZGVmaW5lZChDT05GSUdfTkVUVklBX1ZFUlNJT04pICYmIENPTkZJR19ORVRWSUFfVkVSU0lPTiA+PSAyCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DT01NQU5EU19CQVNFIHwgQ0ZHX0NNRF9OQU5EKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlDT05GSUdfQ09NTUFORFNfQkFTRQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKICNlbmRpZgogCisKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRiAxCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5Miw3ICsyMDIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTlNDVS5oIGIvaW5jbHVkZS9jb25maWdzL05TQ1UuaAppbmRleCBkOTk0NDIwLi40Y2Q0NDcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTlNDVS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9OU0NVLmgKQEAgLTg0LDcgKzg0LDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtOTMsMTYgKzEwMSwxOSBAQAogCiAjZGVmaW5lCUNPTkZJR19JU1AxMzYyX1VTQgkJLyogSVNQMTM2MiBVU0IgT1RHIGNvbnRyb2xsZXIJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExNyw3ICsxMjgsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDEsNyArMjEyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05YODIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvTlg4MjMuaAppbmRleCAxY2I4YjhmLi41MjRhYTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTlg4MjMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTlg4MjMuaApAQCAtNTUsMjIgKzU1LDM1IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjdW5kZWYJQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCwgZm9yIG5vdwkgICAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9BVVRPU0NSSVBUKQogI2RlZmluZSBDT05GSUdfQVVUT1NDUklQVAogCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorCisKIC8qIGNhbGwgdmFyaW91cyBnZW5lcmljIGZ1bmN0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMTUyLDcgKzE2NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL09DUlRDLmggYi9pbmNsdWRlL2NvbmZpZ3MvT0NSVEMuaAppbmRleCBhYTlkMWJhLi41ODQwZWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvT0NSVEMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvT0NSVEMuaApAQCAtNTQsMjAgKzU0LDMyIEBACiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLwpAQCAtNzcsNyArODksNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTUsNyArMjI3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvT1JTRy5oIGIvaW5jbHVkZS9jb25maWdzL09SU0cuaAppbmRleCAyZTdjNTA1Li45MzdkZjIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvT1JTRy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9PUlNHLmgKQEAgLTU0LDIwICs1NCwzMiBAQAogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAJKi8KQEAgLTc3LDcgKzg5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjEzLDcgKzIyNSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL09YQy5oIGIvaW5jbHVkZS9jb25maWdzL09YQy5oCmluZGV4IDc4NzQwN2MuLjhkNjFiY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9PWEMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvT1hDLmgKQEAgLTUxLDEwICs1MSwyMyBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfRUxGKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTI5OSw3ICszMTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI0MCBDUFUJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1AzRzQuaCBiL2luY2x1ZGUvY29uZmlncy9QM0c0LmgKaW5kZXggYTkzM2UxYi4uZWY5NzBmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1AzRzQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUDNHNC5oCkBAIC0xMjAsMzAgKzEyMCw0MCBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDICAgICAgICAgICAgICAgICAgLyogdW5kZWYgdG8gZGlzYWJsZSAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1VOSVZFUlNFfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfVU5JVkVSU0UKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zOTYsNyArNDA2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QQVRJLmggYi9pbmNsdWRlL2NvbmZpZ3MvUEFUSS5oCmluZGV4IGQ4OGZmZjMuLjBkZTc1OTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QQVRJLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BBVEkuaApAQCAtMzksMTQgKzM5LDM1IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9NRU1PUlkgfCBDRkdfQ01EX0xPQURCIHwgQ0ZHX0NNRF9SRUdJTkZPIHwgCQlcCi0JCQkJIENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0xPQURTIHwgQ0ZHX0NNRF9FTlYgfCAgQ0ZHX0NNRF9SRUdJTkZPCXwgCQlcCi0JCQkJIENGR19DTURfQkRJIHwgQ0ZHX0NNRF9DT05TT0xFIHwgQ0ZHX0NNRF9SVU4gfCBDRkdfQ01EX0JTUCB8CVwKLQkJCQkgQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX0VFUFJPTSAgfCBDRkdfQ01EX0lSUSB8IENGR19DTURfTUlTQyBcCi0pCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlTQworCiAKICNpZiAwCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJCS8qIGF1dG9ib290IGRpc2FibGVkCQkJKi8KQEAgLTcxLDcgKzkyLDcgQEAKIAogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSJwYXRpPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUENJNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUENJNDA1LmgKaW5kZXggMDI3ZGQyMi4uZDZlNzA4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BDSTQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QQ0k0MDUuaApAQCAtNjgsMTcgKzY4LDI5IEBACiAKICNkZWZpbmUgQ09ORklHX1JUQ19NNDhUMzVBCTEJCS8qIFNUIEVsZWN0cm9uaWNzIE00OCB0aW1la2VlcGVyICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTk3LDcgKzEwOSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI0NCw3ICsyNTYsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QQ0k1NDQxLmggYi9pbmNsdWRlL2NvbmZpZ3MvUENJNTQ0MS5oCmluZGV4IDNhN2Y3ZjAuLjI0YjI1ZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QQ0k1NDQxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BDSTU0NDEuaApAQCAtMTIyLDIyICsxMjIsMzIgQEAKICNkZWZpbmUgQ0ZHX05JT1NfVE1SQ05UCShDRkdfTklPU19UTVJNUyAqIChDT05GSUdfU1lTX0NMS19GUkVRLzEwMDApKQogI2RlZmluZQlDRkdfSFoJCShDT05GSUdfU1lTX0NMS19GUkVRLyhDRkdfTklPU19UTVJDTlQgKyAxKSkKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSAl8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkJfCBcCi0JCQkJIENGR19DTURfSVJRCXwgXAotCQkJCSBDRkdfQ01EX0xPQURTCXwgXAotCQkJCSBDRkdfQ01EX0xPQURCCXwgXAotCQkJCSBDRkdfQ01EX01FTU9SWQl8IFwKLQkJCQkgQ0ZHX0NNRF9NSVNDCXwgXAotCQkJCSBDRkdfQ01EX1JVTgl8IFwKLQkJCQkgQ0ZHX0NNRF9TQVZFUwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9TQVZFUworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBNSVNDCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDMi5oIGIvaW5jbHVkZS9jb25maWdzL1BDSVBQQzIuaAppbmRleCAzYTk3ZmJjLi4yNjhiMDM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QQ0lQUEMyLmgKQEAgLTUzLDMwICs1MywzNyBAQAogI2RlZmluZSBDT05GSUdfUFJFQk9PVAkJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAogI2RlZmluZSBDT05GSUdfUENJCQkxCiAjZGVmaW5lIENPTkZJR19QQ0lfUE5QCQkxCS8qIFBDSSBwbHVnLWFuZC1wbGF5ICovCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkKLSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAvKgpAQCAtMjIzLDcgKzIzMCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDNi5oIGIvaW5jbHVkZS9jb25maWdzL1BDSVBQQzYuaAppbmRleCAxMzBiZWI3Li4yNTBiNTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDNi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QQ0lQUEM2LmgKQEAgLTUzLDMyICs1MywzOSBAQAogI2RlZmluZSBDT05GSUdfUFJFQk9PVAkJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ET0MKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9TQ1NJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCiAKICNkZWZpbmUgQ09ORklHX1BDSQkJMQogI2RlZmluZSBDT05GSUdfUENJX1BOUAkJMQkvKiBQQ0kgcGx1Zy1hbmQtcGxheSAqLwogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCi0gKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIAogLyoKQEAgLTIyNSw3ICsyMzIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BJUDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1BJUDQwNS5oCmluZGV4IDgwNmU5NWYuLmVmYTAxNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QSVA0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUElQNDA1LmgKQEAgLTQwLDMzICs0MCw0MiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCTMzMDAwMDAwIC8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwJKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQlDRkdfQ01EX1BDSQl8IFwKLQkJCUNGR19DTURfQ0FDSEUJfCBcCi0JCQlDRkdfQ01EX0lSUQl8IFwKLQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQlDRkdfQ01EX0ZEQwl8IFwKLQkJCUNGR19DTURfU0NTSQl8IFwKLQkJCUNGR19DTURfRkFUIAl8IFwKLQkJCUNGR19DTURfREFURQl8IFwKLQkJCUNGR19DTURfRUxGCXwgXAotCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQlDRkdfQ01EX01JSQl8IFwKLQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQlDRkdfQ01EX0RPQwl8IFwKLQkJCUNGR19DTURfUElORwl8IFwKLQkJCUNGR19DTURfU0FWRVMgICB8IFwKLQkJCUNGR19DTURfQlNQCSkKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRkRDCisjZGVmaW5lIENPTkZJR19DTURfU0NTSQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TQVZFUworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCiAKICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKQEAgLTE1MCw3ICsxNTksNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjcsNyArMjM2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNjYsNyArMzc1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERlYnVnIHN1cHBvcnQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUEsxQzIwLmggYi9pbmNsdWRlL2NvbmZpZ3MvUEsxQzIwLmgKaW5kZXggODNhN2VjMi4uZDkwMzUxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BLMUMyMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QSzFDMjAuaApAQCAtMTYwLDMwICsxNjAsNDEgQEAKICNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC4yLjIxCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTkyLjE2OC4yLjE2CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSAl8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkJfCBcCi0JCQkJIENGR19DTURfSVJRCXwgXAotCQkJCSBDRkdfQ01EX0xPQURTCXwgXAotCQkJCSBDRkdfQ01EX0xPQURCCXwgXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8IFwKLQkJCQkgQ0ZHX0NNRF9NSVNDCXwgXAotCQkJCSBDRkdfQ01EX05FVAl8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCSBDRkdfQ01EX1JVTgl8IFwKLQkJCQkgQ0ZHX0NNRF9TQVZFUwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ09NUEFDVCBGTEFTSAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNkZWZpbmUgQ09ORklHX0lERV9QUkVJTklUCQkJLyogSW1wbGVtZW50IGlkX3ByZWluaXQJKi8KICNkZWZpbmUgQ0ZHX0lERV9NQVhCVVMJCTEJCS8qIDEgSURFIGJ1cwkJKi8KICNkZWZpbmUgQ0ZHX0lERV9NQVhERVZJQ0UJMQkJLyogMSBkcml2ZSBwZXIgSURFIGJ1cwkqLwpAQCAtMjAxLDEyICsyMTIsMTIgQEAKICNkZWZpbmUgQ0ZHX0NGX1BPV0VSCQkweDAwOTAwODkwCS8qIENGIFBvd2VyIEZFVCBQSU8gYmFzZSovCiAjZGVmaW5lIENGR19DRl9BVEFTRUwJCTB4MDA5MDA4YTAJLyogQ0YgQVRBU0VMIFBJTyBiYXNlCSovCiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSAqLworI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBKRkZTMgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAjZGVmaW5lIENGR19KRkZTX0NVU1RPTV9QQVJUCQkJLyogYm9hcmQgZGVmaW5lZCBwYXJ0CSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BMVTQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1BMVTQwNS5oCmluZGV4IGVmNWVjYmEuLjRhY2JjZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTFU0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUExVNDA1LmgKQEAgLTYxLDE5ICs2MSwzNCBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC04Miw5ICs5Nyw2IEBACiAKICNkZWZpbmUgQ09ORklHX0FVVE9fVVBEQVRFICAgICAgMSAgICAgICAvKiBhdXRvdXBkYXRlIHZpYSBjb21wYWN0Zmxhc2ggICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19SVENfTUMxNDY4MTgJCS8qIERTMTY4NSBpcyBNQzE0NjgxOCBjb21wYXRpYmxlKi8KQEAgLTEwMyw3ICsxMTUsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yOTIsNyArMzA0LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QTTUyMC5oIGIvaW5jbHVkZS9jb25maWdzL1BNNTIwLmgKaW5kZXggN2Q5MWEwMS4uNWJhOGY0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNNTIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BNNTIwLmgKQEAgLTQwLDExICs0MCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzcsMTIgKzcyLDYgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJOCAgLyogdXNlIDggcnggYnVmZmVyIG9uIGVlcHJvMTAwICAqLwogI3VuZGVmICBDT05GSUdfTlM4MzgyWAogCi0jZGVmaW5lIEFERF9QQ0lfQ01EIAkJQ0ZHX0NNRF9QQ0kKLQotI2Vsc2UJLyogTVBDNTEwMCAqLwotCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQkwICAvKiBubyBDRkdfQ01EX1BDSSAqLwotCiAjZW5kaWYKIAogLyogUGFydGl0aW9ucyAqLwpAQCAtOTEsMzkgKzgwLDQ4IEBACiAvKiBVU0IgKi8KICNpZiAxCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICBDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQotI2Vsc2UKLSNkZWZpbmUgQUREX1VTQl9DTUQgICAgICAgICAgICAgMAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CT09UX1JPTSkKLSNkZWZpbmUgQUREX0RPQ19DTUQgICAgICAgICAgICAgMAotI2Vsc2UKLSNkZWZpbmUgQUREX0RPQ19DTUQgICAgICAgICAgICAgQ0ZHX0NNRF9ET0MKKyNpZiAhZGVmaW5lZChDT05GSUdfQk9PVF9ST00pCiAvKiBEb0MgcmVxdWlyZXMgbGVnYWN5IE5BTkQgZm9yIG5vdyAqLwogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQUREX0RPQ19DTUQJfCBcCi0JCQkJQUREX1BDSV9DTUQJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQk9PVF9ST00pCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01QQzUyMDApCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKwogCiAvKgogICogQXV0b2Jvb3RpbmcKQEAgLTI5NCw3ICsyOTIsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzEwLDYgKzMwOCwxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QTTgyNi5oIGIvaW5jbHVkZS9jb25maWdzL1BNODI2LmgKaW5kZXggODhmZGI1MS4uYzgwYjE1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNODI2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BNODI2LmgKQEAgLTEwMyw4ICsxMDMsNyBAQAogICogICAtIENPTkZJR19ORVRfTVVMVEkgbXVzdCBiZSBkZWZpbmVkCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICNkZWZpbmUJQ09ORklHX05FVF9NVUxUSQogI3VuZGVmCUNPTkZJR19FVEhFUl9OT05FCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTE1MiwzMyArMTUxLDM0IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAogI2lmZGVmIENPTkZJR19QQ0kKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotI2Vsc2UJLyogISBQQ0kgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotI2VuZGlmCS8qIENPTkZJR19QQ0kgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNDUsNyArMzQ1LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAgICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QTTgyOC5oIGIvaW5jbHVkZS9jb25maWdzL1BNODI4LmgKaW5kZXggMzdlZTk3Ny4uOGY1YmU1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNODI4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BNODI4LmgKQEAgLTEwMyw4ICsxMDMsNyBAQAogICogICAtIENPTkZJR19ORVRfTVVMVEkgbXVzdCBiZSBkZWZpbmVkCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQogI3VuZGVmCUNPTkZJR19FVEhFUl9OT05FCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTE1MiwzMyArMTUxLDM0IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAogI2lmZGVmIENPTkZJR19QQ0kKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotI2Vsc2UJLyogISBQQ0kgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotI2VuZGlmCS8qIENPTkZJR19QQ0kgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBEaXNrLU9uLUNoaXAgY29uZmlndXJhdGlvbgpAQCAtMTk2LDcgKzE5Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMzOCw3ICszMzgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE04NTQuaCBiL2luY2x1ZGUvY29uZmlncy9QTTg1NC5oCmluZGV4IDhmMTMwZjUuLmRiZjk0MjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTTg1NC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTTg1NC5oCkBAIC0zMDMsNDMgKzMwMywzNiBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfUENJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSAgI2Vsc2UKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSAgI2VuZGlmCi0jZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfRUVQUk9NCVwKLQkJCQl8IENGR19DTURfREFURQkJXAotCQkJCXwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQl8IENGR19DTURfUENJCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQotICAjZWxzZQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfRUVQUk9NCVwKLQkJCQl8IENGR19DTURfREFURQkJXAotCQkJCXwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC0zNTAsNyArMzQzLDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTM3Miw3ICszNjUsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC0zODQsNyArMzc3LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE04NTYuaCBiL2luY2x1ZGUvY29uZmlncy9QTTg1Ni5oCmluZGV4IDAyODZiNTMuLjZiZGZhNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTTg1Ni5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTTg1Ni5oCkBAIC0zMDYsNDEgKzMwNiwzNSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfUENJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSAgI2Vsc2UKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSAgI2VuZGlmCi0jZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfRUVQUk9NCVwKLQkJCQl8IENGR19DTURfREFURQkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbHNlCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9FRVBST00JXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQotICAjZW5kaWYKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtMzUxLDcgKzM0NSw3IEBACiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgxMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC0zNzMsNyArMzY3LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtMzg1LDcgKzM3OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BNQzQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1BNQzQwNS5oCmluZGV4IDZlMGJkN2YuLmIyOWYzNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTUM0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUE1DNDA1LmgKQEAgLTYzLDI1ICs2MywzNyBAQAogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCQkvKiBpbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1VOSVZFUlNFIHwgXAotCQkJCUNGR19DTURfRUVQUk9NICApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfVU5JVkVSU0UKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19SVENfTUMxNDY4MTggICAgICAgICAgICAgLyogRFMxNjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtMTAwLDcgKzExMiw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2Myw3ICsyNzUsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BONjIuaCBiL2luY2x1ZGUvY29uZmlncy9QTjYyLmgKaW5kZXggYTcxNzY1OS4uNzJhY2Y1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BONjIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUE42Mi5oCkBAIC00MiwxNSArNDIsMjkgQEAKICNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMQogCiAKLSNkZWZpbmUgUkVNT1ZFX0NPTU1BTkRTICAgICAgICAgKCBDRkdfQ01EX0FVVE9TQ1JJUFQJfCBcCi0gCQkJCSAgQ0ZHX0NNRF9MT0FEUwkJfCBcCi0gCQkJCSAgQ0ZHX0NNRF9FTlYJCXwgXAotIAkJCQkgIENGR19DTURfRkxBU0gJCXwgXAotCQkJCSAgQ0ZHX0NNRF9JTUxTCQkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCAoQ09ORklHX0NNRF9ERkwgJiB+UkVNT1ZFX0NPTU1BTkRTKSB8XAotCQkJCSAgQ0ZHX0NNRF9QQ0kgfFwKLQkJCQkgIENGR19DTURfQlNQKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfRU5WCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfSU1MUworCiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxOTIwMAkvKiBjb25zb2xlIGJhdWRyYXRlCQkqLwogCkBAIC04MiwxMCArOTYsNiBAQAogCQkJImxvYWRwIDIwMDAwMDsgYm9vdG0iCiAjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTI4Nyw3ICsyOTcsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI0MCBDUFUJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BQQ2hhbWVsZW9uRVZCLmggYi9pbmNsdWRlL2NvbmZpZ3MvUFBDaGFtZWxlb25FVkIuaAppbmRleCAxNmUyY2M2Li5kZDFkZWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUFBDaGFtZWxlb25FVkIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUFBDaGFtZWxlb25FVkIuaApAQCAtMTEzLDI2ICsxMTMsMzggQEAKICNlbmRpZgogI2RlZmluZSBDT05GSUdfUEhZX0NMS19GUkVRCUVNQUNfU1RBQ1JfQ0xLXzY2TUhaCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAogI2RlZmluZSBDT05GSUdfUlRDX000MVQxMQkxCS8qIHVzZXMgYSBNNDFUMDAgUlRDCQkqLwpAQCAtMTYyLDcgKzE3NCw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTQ0Niw3ICs0NTgsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1FTODIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvUVM4MjMuaAppbmRleCAyMzViYzQ4Li4zNjU3ZmVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUVM4MjMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUVM4MjMuaApAQCAtMTg5LDI3ICsxODksMzcgQEAKICN1bmRlZiBDT05GSUdfU1RBVFVTX0xFRAkJLyogU3RhdHVzIExFRCBkaXNhYmxlZCAqLwogI3VuZGVmIENPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19SVENfTVBDOHh4CS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4ICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkJfCBcCi0JQ0ZHX0NNRF9CT09URAl8IFwKLQlDRkdfQ01EX0NPTlNPTEUJfCBcCi0JQ0ZHX0NNRF9EQVRFCXwgXAotCUNGR19DTURfRU5WCXwgXAotCUNGR19DTURfRkxBU0gJfCBcCi0JQ0ZHX0NNRF9JTUkJfCBcCi0JQ0ZHX0NNRF9JTU1BUAl8IFwKLQlDRkdfQ01EX01FTU9SWQl8IFwKLQlDRkdfQ01EX05FVAl8IFwKLQlDRkdfQ01EX1JVTikKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBzdG9yYWdlIGlzIGluIEZMQVNILCBvbmUgc2VjdG9yIGJlZm9yZSBVLWJvb3QKQEAgLTIyOCw3ICsyMzgsNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJCTEJCS8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIgKi8KICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzAzLDcgKzMxMyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CQkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9RUzg1MC5oIGIvaW5jbHVkZS9jb25maWdzL1FTODUwLmgKaW5kZXggOTY3NTgyYi4uM2RiNTM5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1FTODUwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1FTODUwLmgKQEAgLTE4OSwyNyArMTg5LDM3IEBACiAjdW5kZWYgQ09ORklHX1NUQVRVU19MRUQJCS8qIFN0YXR1cyBMRUQgZGlzYWJsZWQgKi8KICN1bmRlZiBDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKICN1bmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgogI3VuZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NUEM4eHgJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHggKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQlDRkdfQ01EX0JPT1RECXwgXAotCUNGR19DTURfQ09OU09MRQl8IFwKLQlDRkdfQ01EX0RBVEUJfCBcCi0JQ0ZHX0NNRF9FTlYJfCBcCi0JQ0ZHX0NNRF9GTEFTSAl8IFwKLQlDRkdfQ01EX0lNSQl8IFwKLQlDRkdfQ01EX0lNTUFQCXwgXAotCUNGR19DTURfTUVNT1JZCXwgXAotCUNGR19DTURfTkVUCXwgXAotCUNGR19DTURfUlVOKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECisjZGVmaW5lIENPTkZJR19DTURfQ09OU09MRQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRW52aXJvbm1lbnQgdmFyaWFibGUgc3RvcmFnZSBpcyBpbiBGTEFTSCwgb25lIHNlY3RvciBiZWZvcmUgVS1ib290CkBAIC0yMjgsNyArMjM4LDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCQkxCQkvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyICovCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTMwMyw3ICszMTMsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkJLyogRm9yIGFsbCBNUEM4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUVM4NjBULmggYi9pbmNsdWRlL2NvbmZpZ3MvUVM4NjBULmgKaW5kZXggMzJmYWE2MS4uYjM0NDJkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1FTODYwVC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9RUzg2MFQuaApAQCAtOTIsMjMgKzkyLDMzIEBACiAKICN1bmRlZiBDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19SVENfTVBDOHh4CS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4ICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENPTkZJR19DTURfREZMIHwgXAotCUNGR19DTURfUkVHSU5GTwl8IFwKLQlDRkdfQ01EX0lNTUFQCXwgXAotCUNGR19DTURfQVNLRU5WCXwgXAotCUNGR19DTURfTkVUCXwgXAotCUNGR19DTURfREhDUAl8IFwKLQlDRkdfQ01EX0RBVEUJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCiAKIAogLyogVE9ETyAqLwpAQCAtMTM2LDcgKzE0Niw3IEBACiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgkJMQkJLyogdXNlICJodXNoIiBjb21tYW5kIHBhcnNlciAqLwogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC0yMTAsNyArMjIwLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJCS8qIEZvciBhbGwgTVBDOHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJCS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1IzNjBNUEkuaCBiL2luY2x1ZGUvY29uZmlncy9SMzYwTVBJLmgKaW5kZXggODIyMjhjMC4uNTE2ZWM2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1IzNjBNUEkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUjM2ME1QSS5oCkBAIC03OSw3ICs3OSwxNCBAQAogCiAjZGVmaW5lCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZW5hYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMTEsMjAgKzExOCwyMyBAQAogI2RlZmluZSBDRkdfSTJDX0tFWV9BRERSCTB4OQkvKiBLZXlib2FyZCBjb3Byb2Nlc3NvciAqLwogI2RlZmluZSBDRkdfSTJDX1RFTV9BRERSCTB4NDkJLyogVGVtcGVyYXR1cmUgU2Vuc29ycyAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQk1QCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDTUNJQQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ01DSUEKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTEzNCw3ICsxNDQsNyBAQAogCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjgsNyArMjM4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1JCQzgyMy5oIGIvaW5jbHVkZS9jb25maWdzL1JCQzgyMy5oCmluZGV4IDI0MmM4MzcuLjJmNmRlODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9SQkM4MjMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUkJDODIzLmgKQEAgLTc5LDcgKzc5LDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC05NCw0MiArMTAyLDQ1IEBACiAjZGVmaW5lIENGR19FRVBST01fV1JJVEVfQklUUwkJNAogI2RlZmluZSBDRkdfRUVQUk9NX1dSSVRFX0RFTEFZX01TCTEwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ0ZHX0NNRF9BTEwJJiBcCi0JCQkJfkNGR19DTURfQlNQCSYgXAotCQkJCX5DRkdfQ01EX0RBVEUJJiBcCi0JCQkJfkNGR19DTURfRElTUExBWSYgXAotCQkJCX5DRkdfQ01EX0RUVAkmIFwKLQkJCQl+Q0ZHX0NNRF9FWFQyCSYgXAotCQkJCX5DRkdfQ01EX0ZEQwkmIFwKLQkJCQl+Q0ZHX0NNRF9GRE9TCSYgXAotCQkJCX5DRkdfQ01EX0hXRkxPVwkmIFwKLQkJCQl+Q0ZHX0NNRF9JREUJJiBcCi0JCQkJfkNGR19DTURfSVJRCSYgXAotCQkJCX5DRkdfQ01EX0pGRlMyCSYgXAotCQkJCX5DRkdfQ01EX01JSQkmIFwKLQkJCQl+Q0ZHX0NNRF9NTUMJJiBcCi0JCQkJfkNGR19DTURfTkFORAkmIFwKLQkJCQl+Q0ZHX0NNRF9QQ0kJJiBcCi0JCQkJfkNGR19DTURfUENNQ0lBCSYgXAotCQkJCX5DRkdfQ01EX1JFSVNFUgkmIFwKLQkJCQl+Q0ZHX0NNRF9TQ1NJCSYgXAotCQkJCX5DRkdfQ01EX1NFVEdFVERDUiAmIFwKLQkJCQl+Q0ZHX0NNRF9TTlRQCSYgXAotCQkJCX5DRkdfQ01EX1NQSQkmIFwKLQkJCQl+Q0ZHX0NNRF9VTklWRVJTRSAmIFwKLQkJCQl+Q0ZHX0NNRF9VU0IJJiBcCi0JCQkJfkNGR19DTURfVkZECSYgXAotCQkJCX5DRkdfQ01EX1hJTUcJKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI3VuZGVmIENPTkZJR19DTURfQlNQCisjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9EVFQKKyN1bmRlZiBDT05GSUdfQ01EX0VYVDIKKyN1bmRlZiBDT05GSUdfQ01EX0ZEQworI3VuZGVmIENPTkZJR19DTURfRkRPUworI3VuZGVmIENPTkZJR19DTURfSFdGTE9XCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKyN1bmRlZiBDT05GSUdfQ01EX0lSUQorI3VuZGVmIENPTkZJR19DTURfSkZGUzIKKyN1bmRlZiBDT05GSUdfQ01EX01JSQorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUkVJU0VSCisjdW5kZWYgQ09ORklHX0NNRF9TQ1NJCisjdW5kZWYgQ09ORklHX0NNRF9TRVRHRVREQ1IKKyN1bmRlZiBDT05GSUdfQ01EX1NOVFAKKyN1bmRlZiBDT05GSUdfQ01EX1NQSQorI3VuZGVmIENPTkZJR19DTURfVU5JVkVSU0UKKyN1bmRlZiBDT05GSUdfQ01EX1VTQgorI3VuZGVmIENPTkZJR19DTURfVkZECisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjA1LDcgKzIxNiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9SUFhDbGFzc2ljLmggYi9pbmNsdWRlL2NvbmZpZ3MvUlBYQ2xhc3NpYy5oCmluZGV4IDU5MTM4MmMuLjc5M2IxZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9SUFhDbGFzc2ljLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1JQWENsYXNzaWMuaApAQCAtODgsMTUgKzg4LDI2IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lCUNPTkZJR19DTE9DS1NfSU5fTUhaCTEJLyogY2xvY2tzIHBhc3NzZWQgdG8gTGludXggaW4gTUh6ICovCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKChDRkdfQ01EX0FMTCAmIH5DRkdfQ01EX05PTlNURCkgfCBDRkdfQ01EX0VMRikKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTEwNCw3ICsxMTUsNyBAQAogI2RlZmluZSBDRkdfUkVTRVRfQUREUkVTUwkweDgwMDAwMDAwCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xODIsNyArMTkzLDcgQEAKICNkZWZpbmUJQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJMHhGRjAwMDAwMAogCi0jaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZCAoQ09ORklHX1ZJREVPX1NFRDEzODA2KSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZCAoQ09ORklHX1ZJREVPX1NFRDEzODA2KSB8fCBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2RlZmluZQlDRkdfTU9OSVRPUl9MRU4JCSgyNTYgPDwgMTApCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCiAjZWxzZQogI2RlZmluZQlDRkdfTU9OSVRPUl9MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBNb25pdG9yCSovCkBAIC0yMjIsNyArMjMzLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1JQWGxpdGUuaCBiL2luY2x1ZGUvY29uZmlncy9SUFhsaXRlLmgKaW5kZXggNDhhZGEwZS4uM2M1ZTZiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JQWGxpdGUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZS5oCkBAIC02MiwxNyArNjIsMjggQEAKICNkZWZpbmUgQ09ORklHX0JaSVAyCQkvKiBJbmNsdWRlIHN1cHBvcnQgZm9yIGJ6aXAyIGNvbXByZXNzZWQgaW1hZ2VzICAqLwogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE1NCw3ICsxNjUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZV9EVy5oIGIvaW5jbHVkZS9jb25maWdzL1JQWGxpdGVfRFcuaAppbmRleCAzMTAyNTQ3Li44NzI3NjVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZV9EVy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SUFhsaXRlX0RXLmgKQEAgLTExNSwyOSArMTE1LDM2IEBACiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAjdW5kZWYJQ09ORklHX1NUQVRVU19MRUQJCS8qIGRpc3R1cmJzIGRpc3BsYXkuIFN0YXR1cyBMRUQgZGlzYWJsZWQuICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2lmIDEJICAgICAgIC8qIEVuYWJsZSB0aGlzIHN0dWZmIGNvdWxkIG1ha2UgaW1hZ2UgZW5sYXJnZSBhYm91dCAyNUtCLiBNYXNrIGl0IGlmIHlvdQogCQkgIGRvbid0IHdhbnQgdGhlIGFkdmFuY2VkIGZ1bmN0aW9uICovCiAKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCiAjaWZkZWYJQ09ORklHX1NQTEFTSF9TQ1JFRU4KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfREhDUAkpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCSkKLSNlbmRpZgkvKiBDT05GSUdfU1BMQVNIX1NDUkVFTiAqLworI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2VuZGlmCisKIAogLyogdGVzdC1vbmx5ICovCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCTAJICAgIC8qIHVzZSBmb3IgSkZGUzIgKi8KQEAgLTE0NywxNiArMTU0LDEzIEBACiAKICNlbmRpZgkvKiAxICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkidS1ib290PiIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwMCw3ICsyMDQsNyBAQAogI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAogI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRjAwMDAwMAogCi0jaWYgZGVmaW5lZChERUJVRykgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IJKi8KICNlbHNlCiAjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDEyOCA8PCAxMCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIE1vbml0b3IgKi8KQEAgLTIzOSw3ICsyNDMsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUlBYc3VwZXIuaCBiL2luY2x1ZGUvY29uZmlncy9SUFhzdXBlci5oCmluZGV4IDQ1OTA3YWEuLmRmYWRkMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9SUFhzdXBlci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SUFhzdXBlci5oCkBAIC05MSw4ICs5MSw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYgIENPTkZJR19FVEhFUl9PTl9TQ0MgICAgICAgICAgIC8qIGRlZmluZSBpZiBldGhlcm5ldCBvbiBTQ0MgICAgKi8KICNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZDQyAgICAgICAgICAgLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIEZDQyAgICAqLwpAQCAtMTUwLDEzICsxNDksMjggQEAKIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVCAgICAgICAgICAgICAgIj0+ICIKIAotLyogV2hhdCBVLUJvb3Qgc3Vic3l0ZW1zIGRvIHlvdSB3YW50IGVuYWJsZWQ/ICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgICggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICBDRkdfQ01EX0lNTUFQICB8IFwKLQkJCQkgIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSAgQ0ZHX0NNRF9JMkMgICAgfCBcCi0JCQkJICBDRkdfQ01EX1JFR0lORk8gJiBcCi0JCQkJIH5DRkdfQ01EX0tHREIgKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKKyN1bmRlZiBDT05GSUdfQ01EX0tHREIKKwogCiAvKiBXaGVyZSBkbyB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJzIGxpdmU/ICovCiAjZGVmaW5lIENGR19JTU1SICAgICAgICAgICAgICAgMHhGMDAwMDAwMApAQCAtMTc2LDEzICsxOTAsMTAgQEAKIAogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GIDEJLyogQ2FsbCBib2FyZF9lYXJseV9pbml0X2YJKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAxMDI0ICAgICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAgICAgKi8KICNlbHNlCiAjICBkZWZpbmUgQ0ZHX0NCU0laRSAgICAgICAgICAgICAgMjU2ICAgICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgICAgICovCkBAIC0zMTAsNyArMzIxLDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgICA1ICAgICAvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9SUnZpc2lvbi5oIGIvaW5jbHVkZS9jb25maWdzL1JSdmlzaW9uLmgKaW5kZXggMzg4NWJjZC4uMWU2ZThjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JSdmlzaW9uLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1JSdmlzaW9uLmgKQEAgLTkyLDcgKzkyLDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTM1LDIzICsxNDMsMjYgQEAKICNlbmRpZgkvKiBDT05GSUdfU09GVF9JMkMgKi8KIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgKCAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJKSAmIFwKLQkJCSAgICAgfiggQ0ZHX0NNRF9QQ01DSUEgIHwgXAotCQkJICAgICAgICBDRkdfQ01EX0lERQkpICkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKworI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjgsNyArMjM5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1JhdHRsZXIuaCBiL2luY2x1ZGUvY29uZmlncy9SYXR0bGVyLmgKaW5kZXggZGJjNTdlOC4uZDc2NTJmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JhdHRsZXIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUmF0dGxlci5oCkBAIC02Miw4ICs2Miw4IEBACiAgKiBTQ0MsIDEtMyBmb3IgRkNDKQogICoKICAqIElmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcwotICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdAotICogYmUgcmVtb3ZlZCBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIG11c3QgYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUCisgKiBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogRXRoZXJuZXQgaXMgbm90IG9uIFNDQyAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBFdGhlcm5ldCBpcyBvbiBGQ0MgICAgICovCkBAIC0xMjUsMjIgKzEyNSwzMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgIFwKLQkJCQl8IENGR19DTURfREhDUCAgICBcCi0JCQkJfCBDRkdfQ01EX0lNTUFQICAgXAotCQkJCXwgQ0ZHX0NNRF9KRkZTMiAgIFwKLQkJCQl8IENGR19DTURfTUlJICAgICBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgICAgXAotCQkJCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIEZFMDQwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kICovCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazIgcncgbXRkcGFydHM9cGh5czoxTShST00pcm8sLShyb290KSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjdW5kZWYJQ09ORklHX0tHREJfT05fU01DCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTTUMgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfT05fU0NDCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTQ0MgKi8KICN1bmRlZglDT05GSUdfS0dEQl9OT05FCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBzb21ldGhpbmcgZWxzZSAqLwpAQCAtMTU4LDcgKzE2OSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTE4NCw3ICsxOTUsNyBAQAogCiAjZGVmaW5lCUNGR19ESVJFQ1RfRkxBU0hfVEZUUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCUNGR19NQVhfRkxBU0hfQkFOS1MKICNkZWZpbmUgQ0ZHX0pGRlMyX1NPUlRfRlJBR01FTlRTCiAKQEAgLTIwNSw3ICsyMTYsNyBAQAogI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9cmF0dGxlci0wIgogI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1yYXR0bGVyLTA6LUAxbShqZmZzMikiCiAqLwotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ01EX0pGRlMyICovCiAKICNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UKICNpZiAoQ0ZHX01PTklUT1JfQkFTRSA8IENGR19GTEFTSF9CQVNFKQpAQCAtMjU2LDcgKzI2Nyw3IEBACiAjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCiAKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TQkM4NTQwLmggYi9pbmNsdWRlL2NvbmZpZ3MvU0JDODU0MC5oCmluZGV4IGY4ZTMzOTcuLmYyYzM2OTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TQkM4NTQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NCQzg1NDAuaApAQCAtMzM4LDI4ICszMzgsMzcgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKSB8fCBkZWZpbmVkKENPTkZJR19SQU1fQVNfRkxBU0gpCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBcCi0JCQkJICBDRkdfQ01EX0xPQURTICkpCi0gICNlbGlmIChkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01JSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykgJiBcCi0JCQkJfihDRkdfQ01EX0VOVikpCi0gICNlbmRpZgotI2Vsc2UKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbGlmIChkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKQotICAjZW5kaWYKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0zNjgsNyArMzc3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiU0JDODU0MD0+ICIgLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM4OSw3ICszOTgsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtNDAxLDcgKzQxMCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogICAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU0NNLmggYi9pbmNsdWRlL2NvbmZpZ3MvU0NNLmgKaW5kZXggZTI2M2RiNi4uZjkwMDk2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NDTS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9TQ00uaApAQCAtMTMzLDggKzEzMyw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICoKICAqIChPbiBUUU04MjYwIGVpdGhlciBTQ0MxIG9yIEZDQzIgbWF5IGJlIGNob3NlbjogU0NDMSBpcyBoYXJkd2lyZWQgdG8gdGhlCiAgKiBYLjI5IGNvbm5lY3RvciwgYW5kIEZDQzIgaXMgaGFyZHdpcmVkIHRvIHRoZSBYLjEgY29ubmVjdG9yKQpAQCAtMTkxLDIzICsxOTAsMzMgQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJIENGR19DTURfQlNQKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNTMsNyArMzYyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAgICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NMODI0NS5oIGIvaW5jbHVkZS9jb25maWdzL1NMODI0NS5oCmluZGV4IDYxODk2ZDAuLjRkOWQ0MWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TTDgyNDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU0w4MjQ1LmgKQEAgLTUzLDExICs1MywyMiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpIAkqLworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQogCiAKIC8qCkBAIC0yNTUsNyArMjY2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TTTg1MC5oIGIvaW5jbHVkZS9jb25maWdzL1NNODUwLmgKaW5kZXggNDk3NzYyOS4uNDFhNTRmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NNODUwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NNODUwLmgKQEAgLTY4LDIzICs2OCwzNCBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENPTkZJR19DTURfREZMCXwgXAotCQkJCSAgQ0ZHX0NNRF9ESENQCQl8IFwKLQkJCQkgIENGR19DTURfREFURQkJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpICYmIGRlZmluZWQoS0dEQl9ERUJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikgJiYgZGVmaW5lZChLR0RCX0RFQlVHKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE2Nyw3ICsxNzgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU01ONDIuaCBiL2luY2x1ZGUvY29uZmlncy9TTU40Mi5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZDU4ODgxOC4uYTVkM2Q2OQotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU01ONDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU01ONDIuaApAQCAtNjYsNyArNjYsMTUgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAvKiBlbmFibGUgSTJDIGFuZCBzZWxlY3QgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIGRyaXZlciAqLwogI3VuZGVmCUNPTkZJR19IQVJEX0kyQwkJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQJKi8KQEAgLTEwMSwyMiArMTA5LDIxIEBACiAJCQkJCQkgIFBVVDMyKElPMERJUiwgaTJjdG1wKTsgfQogI2VuZGlmIC8qIENPTkZJR19TT0ZUX0kyQyAqLwogCisKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0ZBVAkJfCBcCi0JCQkJQ0ZHX0NNRF9NTUMJCXwgXAotCQkJCUNGR19DTURfTkVUCQl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcpCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX01NQworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TUEQ4MjNUUy5oIGIvaW5jbHVkZS9jb25maWdzL1NQRDgyM1RTLmgKaW5kZXggYWU0ZGNjMi4uMzk1YzdhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NQRDgyM1RTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NQRDgyM1RTLmgKQEAgLTU5LDE1ICs1OSwyOSBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIFwKLSgoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfRkxBU0gpKSB8IENGR19DTURfSURFKSAvKiBubyBGbGFzaCwgYnV0IElERSAqLworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorCisKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDA6RDA6OTM6MDA6MDE6Q0IKQEAgLTgyLDcgKzk2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTYwLDcgKzE3NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TWDEuaCBiL2luY2x1ZGUvY29uZmlncy9TWDEuaAppbmRleCA2ZWQ5OGI4Li4wNWNlZjg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU1gxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NYMS5oCkBAIC05MywxMiArOTMsMjYgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoIENPTkZJR19DTURfREZMIHwgXAotCQkJCSAgIENGR19DTURfSTJDICkgJiBcCi0JCQkJICB+Q0ZHX0NNRF9ORVQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKKwogI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJtZW09MTZNIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcm9vdD0vZGV2L210ZGJsb2NrMyBydyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oIGIvaW5jbHVkZS9jb25maWdzL1NYTkk4NTVULmgKaW5kZXggYTg0NTRkOS4uOGYyYTVlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NYTkk4NTVULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NYTkk4NTVULmgKQEAgLTE0NiwxNCArMTQ2LDI2IEBACiAKICNkZWZpbmUgQ0ZHX0RJU0NPVkVSX1BIWQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCQl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00JCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCQl8IFwKLQkJCQkgQ0ZHX0NNRF9OQU5ECQl8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAKICNkZWZpbmUgQ0ZHX0pGRlMyX1NPUlRfRlJBR01FTlRTCiAKQEAgLTIyNiw3ICsyMzgsNyBAQAogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgYSBsaXR0bGUgbWVtb3J5ICovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI9PiIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzA5LDcgKzMyMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQwLmggYi9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0MC5oCmluZGV4IGY0MzM5ZWMuLjViYmUzYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDAuaApAQCAtODAsMTggKzgwLDMwIEBACiAJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfc2VsZiIKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUgQ09ORklHX0RSQU1fU1BFRUQJMTAwCQkvKiBNSHoJCQkJKi8KIApAQCAtMzg0LDcgKzM5Niw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0NS5oIGIvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDUuaAppbmRleCBkNDJiZDY5Li5hMDg0NTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0NS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQ1LmgKQEAgLTUxLDE3ICs1MSwyOCBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKIAogLyoKQEAgLTM2Myw3ICszNzQsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI0MCBDUFUJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RBU1JFRy5oIGIvaW5jbHVkZS9jb25maWdzL1RBU1JFRy5oCmluZGV4IDExOWJjMjQuLjJiMmFlMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UQVNSRUcuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVEFTUkVHLmgKQEAgLTUwLDIwICs1MCwzNCBAQAogCiAjdW5kZWYgQ09ORklHX01PTklUT1JfSVNfSU5fUkFNCSAgICAgICAgICAgICAgLyogbm8gcHJlLWxvYWRlciByZXF1aXJlZCEhISA7LSkgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKChDT05GSUdfQ01EX0RGTCAgICAgICAgfCAgICBcCi0JCQkJQ0ZHX0NNRF9CU1AgICAgICAgICAgIHwgICAgXAotCQkJCUNGR19DTURfRUVQUk9NICAgICAgICB8ICAgIFwKLQkJCQlDRkdfQ01EX0kyQyAgICAgICAgICAgICkgJiBcCi0JCQkgICAgICAgfihDRkdfQ01EX05FVCkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKKwogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIAogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RCNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL1RCNTIwMC5oCmluZGV4IDcxMjY2OGEuLjFjNmE5YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UQjUyMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVEI1MjAwLmgKQEAgLTQyLDExICs0Miw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzIsMTIgKzY3LDYgQEAKICNkZWZpbmUgQ0ZHX0NPTlNPTEVfSVNfSU5fRU5WCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19WSURFTwotI2RlZmluZSBBRERfQk1QX0NNRAkJQ0ZHX0NNRF9CTVAKLSNlbHNlCi0jZGVmaW5lIEFERF9CTVBfQ01ECQkwCi0jZW5kaWYKLQogLyogUGFydGl0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtODUsNyArNzQsNiBAQAogCiAvKiBVU0IgKi8KICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQogCiAvKiBQT1NUIHN1cHBvcnQgKi8KQEAgLTk0LDQxICs4Miw1MSBAQAogCQkJCSBDRkdfUE9TVF9JMkMpCiAKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICNkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSBNUEM1WFhYX1NSQU1fU0laRS00Ci0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCiAjZW5kaWYKIAotLyogSURFICovCi0jZGVmaW5lIEFERF9JREVfQ01ECQkoQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfRVhUMikKIAogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUFERF9CTVBfQ01ECXwgXAotCQkJCUFERF9JREVfQ01ECXwgXAotCQkJCUFERF9QQ0lfQ01ECXwgXAotCQkJCUFERF9VU0JfQ01ECXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1ApCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKKyNpZmRlZiBDT05GSUdfVklERU8KKyNkZWZpbmUgQ09ORklHX0NNRF9CTVAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BPU1QKKyNkZWZpbmUgQ09ORklHX19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtMzk0LDcgKzM5Miw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC00MDMsNiArNDAxLDExIEBACiAjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLwogI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyogRW5hYmxlIGFuIGFsdGVybmF0ZSwgbW9yZSBleHRlbnNpdmUgbWVtb3J5IHRlc3QgKi8KICNkZWZpbmUgQ0ZHX0FMVF9NRU1URVNUCiAKQEAgLTQxNCw4ICs0MTcsNyBAQAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVE9QNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL1RPUDUyMDAuaAppbmRleCAxY2M5Y2U5Li43MjQwY2UxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVE9QNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UT1A1MjAwLmgKQEAgLTUwLDExICs1MCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtODEsMTIgKzc2LDYgQEAKICMgIGRlZmluZSBDT05GSUdfUENJX0lPX1BIWVMJQ09ORklHX1BDSV9JT19CVVMKICMgIGRlZmluZSBDT05GSUdfUENJX0lPX1NJWkUJMHgwMTAwMDAwMAogCi0jICBkZWZpbmUgQUREX1BDSV9DTUQgCQlDRkdfQ01EX1BDSQotCi0jZWxzZQkvKiBubyBFdmFsdWF0aW9uIGJvYXJkICovCi0KLSMgIGRlZmluZSBBRERfUENJX0NNRAkJMCAgLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KLQogI2VuZGlmCiAKIC8qIFVTQiAqLwpAQCAtOTksNDkgKzg4LDQ5IEBACiAjICBlbHNlCiAjICAgIGRlZmluZSBDT05GSUdfVVNCX0NPTkZJRwkweDAwMDAxMDAwCiAjICBlbmRpZgotIyAgZGVmaW5lIEFERF9VU0JfQ01EICAgICAgICAgICAgIENGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICMgIGRlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogIyAgZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQogCi0jZWxzZQotCi0jICBkZWZpbmUgQUREX1VTQl9DTUQJCTAKLQogI2VuZGlmCiAKIC8qIElERSAqLwogI2lmIGRlZmluZWQgKENPTkZJR19FVkFMNTIwMCkgfHwgZGVmaW5lZCAoQ09ORklHX0xJVEU1MjAwKQotCi0jICBkZWZpbmUgQUREX0lERV9DTUQgICAgICAgICAgICAgQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0ZBVAogIyAgZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCi0KLSNlbHNlCi0KLSMgIGRlZmluZSBBRERfSURFX0NNRAkJMAotCiAjZW5kaWYKIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUFERF9QQ0lfQ01ECXwgXAotCQkJCUFERF9VU0JfQ01ECXwgXAotCQkJCUFERF9JREVfQ01ECXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkgCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCVwKLQkJCSAgICAgICkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKKyNpZiBkZWZpbmVkIChDT05GSUdfRVZBTDUyMDApIHx8IGRlZmluZWQgKENPTkZJR19MSVRFNTIwMCkKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorCiAKIC8qCiAgKiBNVVNUIGJlIGxvdyBib290IC0gSElHSEJPT1QgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlCkBAIC0zMzYsNyArMzI1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0zNTIsNiArMzQxLDEyIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCisKICNpZmRlZiBDT05GSUdfRVZBTDUyMDAJCS8qIE00OFQwOCBpcyBhdmFpbGFibGUgd2l0aCB0aGUgRXZhbHVhdGlvbiBib2FyZCBvbmx5ICovCiAgICNkZWZpbmUgQ09ORklHX1JUQ19NSzQ4VDU5CTEJLyogdXNlIE00OFQwOCBvbiBFVkFMNTIwMCAqLwogICAjZGVmaW5lIFJUQyhyZWcpCQkoMHhmMDAxMDAwMCtyZWcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVE9QODYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVE9QODYwLmgKaW5kZXggMjM0NGI5Ni4uNjZmN2ExMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RPUDg2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UT1A4NjAuaApAQCAtMTA3LDMwICsxMDcsMjggQEAKICAqLwogI2RlZmluZSBDRkdfTUFUQ0hfUEFSVElBTF9DTUQKIAorCiAvKgotICogTGlzdCBvZiBhdmFpbGFibGUgbW9uaXRvciBjb21tYW5kcy4gIFVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgbGlzdAotICogcGx1cyBhZGQgc29tZSBvZiB0aGUgIm5vbi1zdGFuZGFyZCIgY29tbWFuZHMgYmFjayBpbi4KLSAqIFNlZSAuL2NtZF9jb25mZGVmcy5oCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9JMkMJCXwgXAotCQkJCQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCQkJCQlDRkdfQ01EX0VMRgkJfCBcCi0JCQkJCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9NSUkgCXwgXAotCQkJCQkJCQlDRkdfQ01EX0JFREJVRwlcCi0JCQkJCQkgICAgICApCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworCiAKICNkZWZpbmUJQ09ORklHX0FVVE9TQ1JJUFQJCTEKICNkZWZpbmUJQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEKICN1bmRlZglDT05GSUdfTE9BRFNfRUNITwkJCS8qIE5PIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KQEAgLTE0MSw3ICsxMzksNyBAQAogICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzksNyArMjM3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDExLDEwICs0MDksMTEgQEAKIC8qCiAgKiBCT09UUCBvcHRpb25zCiAgKi8KLSN1bmRlZglDT05GSUdfQk9PVFBfTUFTSwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJCQkoIENPTkZJR19CT09UUF9ERUZBVUxUCQl8IFwKLQkJCQkJCQkJCSAgCSAgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSAgIFwKLQkJCQkJCQkJCQkpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTUyMDAuaAppbmRleCBhYTM2MjdiLi4zZDk4NTAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU01MjAwLmgKQEAgLTQ3LDExICs0Nyw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTEwNSwxMiArMTAwLDYgQEAKICNkZWZpbmUgQ09ORklHX05TODM4MlgJCTEKICNlbmRpZgkvKiBDT05GSUdfU1RLNTJYWCAqLwogCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBBRERfUENJX0NNRAkJQ0ZHX0NNRF9QQ0kKLSNlbHNlCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQkwCi0jZW5kaWYKLQogLyoKICAqIFZpZGVvIGNvbnNvbGUKICAqLwpAQCAtMTMzLDExICsxMjIsNiBAQAogI2RlZmluZSBDRkdfQ09OU09MRV9JU19JTl9FTlYKICNlbmRpZiAvKiAjaWZuZGVmIENPTkZJR19UUU01MjAwUyAqLwogCi0jaWZkZWYgQ09ORklHX1ZJREVPCi0jZGVmaW5lIEFERF9CTVBfQ01ECQlDRkdfQ01EX0JNUAotI2Vsc2UKLSNkZWZpbmUgQUREX0JNUF9DTUQJCTAKLSNlbmRpZgogCiAvKiBQYXJ0aXRpb25zICovCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCkBAIC0xNDYsMTEgKzEzMCwxNyBAQAogCiAvKiBVU0IgKi8KICNpZiBkZWZpbmVkKENPTkZJR19TVEs1MlhYKSB8fCBkZWZpbmVkKENPTkZJR19GTzMwMCkKLSNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRAkJMAorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorCisjdW5kZWYgQ0ZHX1VTQl9PSENJX0JPQVJEX0lOSVQKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX0NQVV9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJTVBDNVhYWF9VU0IKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkibXBjNTIwMCIKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTCTE1CisKICNlbmRpZgogCiAjaWZuZGVmIENPTkZJR19DQU01MjAwCkBAIC0xNjEsNDQgKzE1MSw2MSBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICNkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSBNUEM1WFhYX1NSQU1fU0laRS00Ci0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCiAjZW5kaWYKIAotLyogSURFICovCi0jaWYgZGVmaW5lZCAoQ09ORklHX01JTklGQVApIHx8IGRlZmluZWQgKENPTkZJR19TVEs1MlhYKSB8fCBkZWZpbmVkKENPTkZJR19GTzMwMCkKLSNkZWZpbmUgQUREX0lERV9DTUQJCShDRkdfQ01EX0lERSB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9FWFQyKQotI2Vsc2UKLSNkZWZpbmUgQUREX0lERV9DTUQJCTAKLSNlbmRpZgogCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQUREX0JNUF9DTUQJfCBcCi0JCQkJQUREX0lERV9DTUQJfCBcCi0JCQkJQUREX1BDSV9DTUQJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1BPU1RfRElBRyB8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUNGR19DTURfQlNQKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKworI2lmZGVmIENPTkZJR19WSURFTworICAgICNkZWZpbmUgQ09ORklHX0NNRF9CTVAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0NNRF9QQ0kKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTUlOSUZBUCkgfHwgZGVmaW5lZChDT05GSUdfU1RLNTJYWCkgfHwgZGVmaW5lZChDT05GSUdfRk8zMDApCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0lERQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TVEs1MlhYKSB8fCBkZWZpbmVkKENPTkZJR19GTzMwMCkKKyAgICAjZGVmaW5lIENPTkZJR19DRkdfVVNCCisgICAgI2RlZmluZSBDT05GSUdfQ0ZHX0ZBVAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE9TVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZW5kaWYKKwogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIGRpc3BsYXkgaW1hZ2UgdGltZXN0YW1wcyAqLwogCkBAIC01NjYsNyArNTczLDEyIEBACiAjZGVmaW5lCUNGR19IVVNIX1BBUlNFUgkJMQkvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyCSovCiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtNTg2LDggKzU5OCw3IEBACiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04MjNMLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODIzTC5oCmluZGV4IDI0N2Y3MDUuLjJiZGNmMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04MjNMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTgyM0wuaApAQCAtODgsMzQgKzg4LDM4IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKICNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTEyOSw3ICsxMzMsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTIsNyArMjE2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTgyM00uaCBiL2luY2x1ZGUvY29uZmlncy9UUU04MjNNLmgKaW5kZXggMTQ2MWI1Zi4uNThiYzVkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTgyM00uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODIzTS5oCkBAIC04OCwyMyArODgsMzQgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMTgsNyArMTI5LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjAyLDcgKzIxMyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODI2MC5oCmluZGV4IGZmZDVjMGIuLjNiNzgzMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04MjYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTgyNjAuaApAQCAtMTY3LDggKzE2Nyw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICoKICAqIChPbiBUUU04MjYwIGVpdGhlciBTQ0MxIG9yIEZDQzIgbWF5IGJlIGNob3NlbjogU0NDMSBpcyBoYXJkd2lyZWQgdG8gdGhlCiAgKiBYLjI5IGNvbm5lY3RvciwgYW5kIEZDQzIgaXMgaGFyZHdpcmVkIHRvIHRoZSBYLjEgY29ubmVjdG9yKQpAQCAtMjIwLDE3ICsyMTksMjggQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMjQ0LDcgKzI1NCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM4NSw3ICszOTUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICAgICAgICAgICAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODI3Mi5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTgyNzIuaAppbmRleCA5MjViZjM0Li41MGY2NzUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODI3Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04MjcyLmgKQEAgLTk3LDEwICs5Nyw2IEBACiAvKiBlbmFibGUgSTJDIGFuZCBzZWxlY3QgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIGRyaXZlciAqLwogI3VuZGVmICBDT05GSUdfSEFSRF9JMkMJCQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0CSovCiAjZGVmaW5lIENPTkZJR19TT0ZUX0kyQwkJMQkvKiBJMkMgYml0LWJhbmdlZAkJKi8KLSNkZWZpbmUgQUREX0NNRF9JMkMJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfREFURQl8XAotCQkJCUNGR19DTURfRFRUCXxcCi0JCQkJQ0ZHX0NNRF9FRVBST00KICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcwkqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCiAKQEAgLTE0MCw3ICsxMzYsNiBAQAogI2Vsc2UKICN1bmRlZiBDT05GSUdfSEFSRF9JMkMKICN1bmRlZiBDT05GSUdfU09GVF9JMkMKLSNkZWZpbmUgQUREX0NNRF9JMkMJCTAKICNlbmRpZgogCiAvKgpAQCAtMTc3LDggKzE3Miw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICoKICAqIChPbiBUUU04MjcyIGVpdGhlciBTQ0MxIG9yIEZDQzIgbWF5IGJlIGNob3NlbjogU0NDMSBpcyBoYXJkd2lyZWQgdG8gdGhlCiAgKiBYLjI5IGNvbm5lY3RvciwgYW5kIEZDQzIgaXMgaGFyZHdpcmVkIHRvIHRoZSBYLjEgY29ubmVjdG9yKQpAQCAtMjcyLDIwICsyNjYsMzcgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUFERF9DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWYgQ09ORklHX0kyQworICAgICNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyAgICAjZGVmaW5lIENPTkZJR19DTURfREFURQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZW5kaWYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMzAxLDcgKzMxMiw3IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zOTIsNyArNDAzLDcgQEAKICAqIE5BTkQtRkxBU0ggc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNkZWZpbmUgQ0ZHX05BTkRfQ1NfRElTVAkJMHg4MAogI2RlZmluZSBDRkdfTkFORF9VUE1fV1JJVEVfQ01EX09GUwkweDIwCkBAIC00MzAsNyArNDQxLDcgQEAKIAlXUklURV9OQU5EKGQsIGFkZHIpOyBcCiB9IHdoaWxlKDApCiAKLSNlbmRpZiAvKiBDRkdfQ01EX05BTkQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ01EX05BTkQgKi8KIAogI2RlZmluZQlDT05GSUdfUENJCiAjaWZkZWYgQ09ORklHX1BDSQpAQCAtNTAyLDcgKzUxMyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgICAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04MzR4LmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODM0eC5oCmluZGV4IDRhNWY4YjYuLjY2MTcxMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04MzR4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTgzNHguaApAQCAtMjgsOSArMjgsNiBAQAogI2lmbmRlZiBfX0NPTkZJR19ICiAjZGVmaW5lIF9fQ09ORklHX0gKIAotI2RlZmluZSBERUJVRwotI3VuZGVmIERFQlVHCi0KIC8qCiAgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucwogICovCkBAIC0yODEsNyArMjc4LDYgQEAKICNkZWZpbmUgQ0ZHX1BDSTFfSU9fUEhZUyAgICAgICAgQ0ZHX1BDSTFfSU9fQkFTRQogI2RlZmluZSBDRkdfUENJMV9JT19TSVpFICAgICAgICAweDEwMDAwMDAgICAgICAgLyogMTZNICovCiAKLQogI3VuZGVmIENPTkZJR19FRVBSTzEwMAogI2RlZmluZSBDT05GSUdfRUVQUk8xMDAKICN1bmRlZiBDT05GSUdfVFVMSVAKQEAgLTMxNiwzOSArMzEyLDM3IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCQkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLS8qIENvbW1vbiBjb21tYW5kcyAqLwotI2RlZmluZSBDRkdfQ01EX1RRTTgzNDlfQ09NTU9OCUNGR19DTURfREFURSB8IENGR19DTURfSTJDIHwgQ0ZHX0NNRF9EVFRcCi0JCQkJfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0VFUFJPTQkJXAotCQkJCXwgQ0ZHX0NNRF9NSUkgfCBDRkdfQ01EX0pGRlMyCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RUVAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLQotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kJXAotCQkJCXwgQ0ZHX0NNRF9UUU04MzQ5X0NPTU1PTikJXAotCQkJCSYJCQkJXAotCQkJCX4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0xPQURTKSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9UUU04MzQ5X0NPTU1PTikJXAotCQkJCSYJCQkJXAotCQkJCX4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0xPQURTKSkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUwogI2VuZGlmCiAKLSNlbHNlIC8qIENGR19SQU1CT09UICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kJXAotCQkJCXwgQ0ZHX0NNRF9UUU04MzQ5X0NPTU1PTikKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQkJXAotCQkJCXwgQ0ZHX0NNRF9UUU04MzQ5X0NPTU1PTikKLSNlbmRpZgotCi0jZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KLQotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0zNjIsNyArMzU2LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC0zODcsNyArMzgxLDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC00OTUsNyArNDg5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NTBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODUwTC5oCmluZGV4IDkwZWNiYWQuLjc0YjE2YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NTBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1MEwuaApAQCAtODAsMjMgKzgwLDMzIEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExMCw3ICsxMjAsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTMsNyArMjAzLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg1ME0uaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NTBNLmgKaW5kZXggYjNmOGY4ZC4uZTM5MzZjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg1ME0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODUwTS5oCkBAIC03OCwyMyArNzgsMzMgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTA4LDcgKzExOCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5Miw3ICsyMDIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODU1TC5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1NUwuaAppbmRleCA0OWFhZWVhLi5hZTIyYjc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODU1TC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NTVMLmgKQEAgLTgzLDIzICs4MywzNCBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExMyw3ICsxMjQsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTYsNyArMjA3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg1NU0uaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NTVNLmgKaW5kZXggNTBkZjQ5ZS4uNWQ1NGY4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg1NU0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODU1TS5oCkBAIC0xMTYsMjQgKzExNiwzNSBAQAogI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUwk1CiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xNDcsNyArMTU4LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjMxLDcgKzI0Miw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NXh4LmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODV4eC5oCmluZGV4IGIwYjlkZDMuLmQ1Y2UzYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NXh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1eHguaApAQCAtMzU3LDI0ICszNTcsMzUgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdHMJKi8KIAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0RUVAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotIyBkZWZpbmUgQUREX1BDSV9DTUQJCShDRkdfQ01EX1BDSSkKLSNlbHNlCi0jIGRlZmluZSBBRERfUENJX0NNRAkJMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfTkZTCXwgXAotCQkJCSBDRkdfQ01EX1NOVFAJfCBcCi0JCQkJIEFERF9QQ0lfQ01ECXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgQ0ZHX0NNRF9EVFQJfCBcCi0JCQkJIENGR19DTURfTUlJCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJKQotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTM4NSw3ICszOTYsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcwkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTQwNiw3ICs0MTcsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDE4LDcgKzQyOSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZQkqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTC5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2MEwuaAppbmRleCA5YmU1ZGIxLi40MGMwOTQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NjBMLmgKQEAgLTgzLDI3ICs4MywzOCBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTExNiw3ICsxMjcsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTksNyArMjEwLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg2ME0uaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NjBNLmgKaW5kZXggMzdmNmM5OC4uNDgxZTNkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg2ME0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTS5oCkBAIC04MywyNCArODMsMzUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMTQsNyArMTI1LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTk4LDcgKzIwOSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NjJMLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODYyTC5oCmluZGV4IGYwMzY5MGEuLmJiM2IxY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NjJMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2MkwuaApAQCAtODYsMjMgKzg2LDM0IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTE2LDcgKzEyNyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwMCw3ICsyMTEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODYyTS5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2Mk0uaAppbmRleCA0OTU5MzQwLi5kNjg3ZDA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODYyTS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NjJNLmgKQEAgLTg2LDIzICs4NiwzNCBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExNiw3ICsxMjcsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDEsNyArMjEyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg2Nk0uaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NjZNLmgKaW5kZXggMTQ4NDkwYi4uZmYwMGMxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg2Nk0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODY2TS5oCkBAIC0xMjUsNyArMTI1LDE1IEBACiAjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTCTQKICNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTEwCS8qIGFuZCB0YWtlcyB1cCB0byAxMCBtc2VjICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTM0LDE2ICsxNDIsMTkgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBidXQgcHJpbnQgaW1hZ2UgdGltZXN0bXBzCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTE1Nyw3ICsxNjgsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNDEsNyArMjUyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg4NUQuaCBiL2luY2x1ZGUvY29uZmlncy9UUU04ODVELmgKaW5kZXggZDQ3MGFkZS4uZjM2YjcyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg4NUQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODg1RC5oCkBAIC0xMzEsNyArMTMxLDE1IEBACiAjIGRlZmluZSBDT05GSUdfUlRDX0RTMTMzNyAxCiAjIGRlZmluZSBDRkdfSTJDX1JUQ19BRERSIDB4NjgKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xNDAsMTkgKzE0OCwyMiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIGJ1dCBwcmludCBpbWFnZSB0aW1lc3RtcHMJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORyApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTE2Niw3ICsxNzcsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xODcsOCArMTk4LDcgQEAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBlZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCkBAIC0yNTgsNyArMjY4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDc4LDcgKzQ4OCw3IEBACiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GRUMxCQkvKiAuLi4gZm9yIEZFQzEgKi8KICNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZFQzIJCS8qIC4uLiBmb3IgRkVDMiAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjZGVmaW5lIENGR19ESVNDT1ZFUl9QSFkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVG90YWw1MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVG90YWw1MjAwLmgKaW5kZXggZDg2ODZkZC4uOWVkZjc5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RvdGFsNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9Ub3RhbDUyMDAuaApAQCAtNDgsMTEgKzQ4LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC02Myw3ICs1OCw2IEBACiAvKgogICogVmlkZW8gY29uc29sZQogICovCi0jaWYgMQogI2RlZmluZSBDT05GSUdfVklERU8KICNkZWZpbmUgQ09ORklHX1ZJREVPX1NFRDEzODA2CiAjZGVmaW5lIENPTkZJR19WSURFT19TRUQxMzgwNl8xNkJQUApAQCAtNzYsMTAgKzcwLDYgQEAKICNkZWZpbmUgQ09ORklHX1ZJREVPX1NXX0NVUlNPUgogI2RlZmluZSBDT05GSUdfU1BMQVNIX1NDUkVFTgogCi0jZGVmaW5lIEFERF9WSURFT19DTUQJQ0ZHX0NNRF9CTVAKLSNlbHNlCi0jZGVmaW5lIEFERF9WSURFT19DTUQJMAotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTVBDNTIwMAkvKiBNR1Q1MTAwIFBDSSBpcyBub3Qgc3VwcG9ydGVkIHlldC4gKi8KIC8qCkBAIC0xMDUsMTIgKzk1LDkgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJOCAgLyogdXNlIDggcnggYnVmZmVyIG9uIGVlcHJvMTAwICAqLwogI2RlZmluZSBDT05GSUdfTlM4MzgyWAkJMQogCi0jZGVmaW5lIEFERF9QQ0lfQ01EIAkJQ0ZHX0NNRF9QQ0kKLQogI2Vsc2UJLyogTUdUNTEwMCAqLwogCiAjZGVmaW5lIENPTkZJR19NSUkJCTEKLSNkZWZpbmUgQUREX1BDSV9DTUQJCTAgIC8qIG5vIENGR19DTURfUENJICovCiAKICNlbmRpZgogCkBAIC0xMTksMjkgKzEwNiwzNiBAQAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAvKiBVU0IgKi8KLSNpZiAxCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICBDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQotI2Vsc2UKLSNkZWZpbmUgQUREX1VTQl9DTUQgICAgICAgICAgICAgMAotI2VuZGlmCisKIAogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBBRERfVklERU9fQ01EICB8IFwKLQkJCQkgQUREX1BDSV9DTUQJfCBcCi0JCQkJIEFERF9VU0JfQ01EKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX01QQzUyMDApCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CTVAKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKIAogI2lmIChURVhUX0JBU0UgPT0gMHhGRTAwMDAwMCkJCS8qIEJvb3QgbG93ICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCQkxCkBAIC0zMDMsNyArMjk3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTMxOSw2ICszMTMsMTIgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9WQ01BOS5oIGIvaW5jbHVkZS9jb25maWdzL1ZDTUE5LmgKaW5kZXggNWY0OGE3MC4uZGY2ODk0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1ZDTUE5LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1ZDTUE5LmgKQEAgLTQ4LDI3ICs0OCwzMyBAQAogI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgMQogI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkgMQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1hbmQgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgXAotCQkJKENPTkZJR19DTURfREZMCSB8IFwKLQkJCUNGR19DTURfQ0FDSEUJIHwgXAotCQkJLypDRkdfQ01EX0pGRlMyCSB8Ki8gXAotCQkJLypDRkdfQ01EX05BTkQJIHwqLyBcCi0JCQlDRkdfQ01EX0VFUFJPTQkgfCBcCi0JCQlDRkdfQ01EX0kyQwkgfCBcCi0JCQlDRkdfQ01EX1VTQgkgfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8gIHwgXAotCQkJQ0ZHX0NNRF9GQVQJIHwgXAotCQkJQ0ZHX0NNRF9EQVRFCSB8IFwKLQkJCUNGR19DTURfRUxGCSB8IFwKLQkJCUNGR19DTURfREhDUAkgfCBcCi0JCQlDRkdfQ01EX1BJTkcJIHwgXAotCQkJQ0ZHX0NNRF9CU1ApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBhZnRlciB0aGUgZGVmaW5pdG9uIG9mIENPTkZJR19DT01NQU5EUyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCiAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgIj4gIgpAQCAtMTQ1LDcgKzE1MSw3IEBACiAjZGVmaW5lIENPTkZJR19JUEFERFIJCTEwLjAuMC4xMTAKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxMC4wLjAuMQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogLyogd2hhdCdzIHRoaXMgPyBpdCdzIG5vdCB1c2VkIGFueXdoZXJlICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KQEAgLTI0Niw3ICsyNTIsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTkFORCBmbGFzaCBzZXR0aW5ncwogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKICNkZWZpbmUgQ0ZHX01BWF9OQU5EX0RFVklDRQkxCS8qIE1heCBudW1iZXIgb2YgTkFORCBkZXZpY2VzCQkqLwpAQCAtMjgwLDYgKzI4Niw2IEBACiAjZGVmaW5lIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUJMQogI2RlZmluZSBDT05GSUdfTVREX05BTkRfRUNDX0pGRlMyCTEKIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCAqLworI2VuZGlmCiAKICNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVk9INDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvVk9INDA1LmgKaW5kZXggYWJkMWVmNC4uMzg4MGVjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1ZPSDQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9WT0g0MDUuaApAQCAtNTgsMjggKzU4LDQwIEBACiAKICNkZWZpbmUgQ09ORklHX1BIWV9DTEtfRlJFUQlFTUFDX1NUQUNSX0NMS182Nk1IWiAvKiA2NiBNSHogT1BCIGNsb2NrKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19SVENfTUMxNDY4MTgJCS8qIERTMTY4NSBpcyBNQzE0NjgxOCBjb21wYXRpYmxlKi8KQEAgLTk4LDcgKzExMCw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI5OCw3ICszMTAsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1ZPTTQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1ZPTTQwNS5oCmluZGV4IGYyZjNlYTcuLjU1MTJmNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9WT000MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVk9NNDA1LmgKQEAgLTYwLDI0ICs2MCwzMyBAQAogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KICNkZWZpbmUgQ09ORklHX1JFU0VUX1BIWV9SICAgICAgMSAgICAgICAvKiB1c2UgcmVzZXRfcGh5KCkgdG8gZGlzYWJsZSBwaHkgc2xlZXAgbW9kZSAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUyB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTk2LDcgKzEwNSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI0NCw3ICsyNTMsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1ZvVlBOLUdXLmggYi9pbmNsdWRlL2NvbmZpZ3MvVm9WUE4tR1cuaAppbmRleCA5MmJhZGU1Li4xNDA1Nzg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVm9WUE4tR1cuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVm9WUE4tR1cuaApAQCAtOTUsOCArOTUsNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MKICNkZWZpbmUJQ09ORklHX0VUSEVSX09OX0ZDQwpAQCAtMTM4LDI0ICsxMzcsMzQgQEAKIAogI2VuZGlmCiAKLS8qIGNvbmZpZ3VyZSBjb21tYW5kcyAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgJQ0ZHX0NNRF9BVVRPU0NSSVBUCXwgXAotCQkJCQlDRkdfQ01EX0JESQkJfCBcCi0JCQkJCUNGR19DTURfQ09OU09MRQkJfCBcCi0JCQkJCUNGR19DTURfRUNITwkJfCBcCi0JCQkJCUNGR19DTURfRU5WCQl8IFwKLQkJCQkJQ0ZHX0NNRF9GTEFTSAkJfCBcCi0JCQkJCUNGR19DTURfSU1JCQl8IFwKLQkJCQkJQ0ZHX0NNRF9JTUxTCQl8IFwKLQkJCQkJQ0ZHX0NNRF9MT0FEQgkJfCBcCi0JCQkJCUNGR19DTURfTUVNT1JZCQl8IFwKLQkJCQkJQ0ZHX0NNRF9NSVNDCQl8IFwKLQkJCQkJQ0ZHX0NNRF9ORVQJCXwgXAotCQkJCQlDRkdfQ01EX1BJTkcJCXwgXAotCQkJCQlDRkdfQ01EX1JVTgkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUxTCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JVTgorCiAKIC8qCiAgKiBib290IG9wdGlvbnMgJiBlbnZpcm9ubWVudApAQCAtMjA2LDcgKzIxNSw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFQJCQkiPT4gIgogCiAvKiBjb25zb2xlIGkvbyBidWZmZXIgc2l6ZSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCQkxMDI0CiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkJMjU2CkBAIC0zMDUsNyArMzE0LDcgQEAKIAogLyogY2FjaGUgY29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJCTMyICAgICAgLyogZm9yIE1QQzgyNjAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCQk1CS8qIGxvZyBiYXNlIDIgb2YgYWJvdmUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVzdPTE1DLmggYi9pbmNsdWRlL2NvbmZpZ3MvVzdPTE1DLmgKaW5kZXggOGRjNjIzZS4uZmMxNzdmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1c3T0xNQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9XN09MTUMuaApAQCAtNzAsMTMgKzcwLDMxIEBACiAKICNkZWZpbmUgQ09ORklHX1JUQ19NNDhUMzVBCTEJCS8qIFNUIEVsZWN0cm9uaWNzIE00OCB0aW1la2VlcGVyICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0lSUSB8IENGR19DTURfQVNLRU5WIHwgXAotCSBDRkdfQ01EX0RIQ1AgfCBDRkdfQ01EX0JFREJVRyB8IENGR19DTURfREFURSB8IENGR19DTURfSTJDIHwgXAotCSBDRkdfQ01EX0VFUFJPTSB8IENGR19DTURfRUxGIHwgQ0ZHX0NNRF9CU1AgfCBDRkdfQ01EX1JFR0lORk8pCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAjZGVmaW5lIENPTkZJR19IV19XQVRDSERPRwkJCS8qIEhXIFdhdGNoZG9nLCBib2FyZCBzcGVjaWZpYwkqLwpAQCAtOTIsNyArMTEwLDcgQEAKICNpZmRlZiAgQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgICAgICI+ICIKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNzcsNyArMjk1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCQkvKiAuLi4JCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWwuICovCiAjZW5kaWYKIApAQCAtMzA5LDcgKzMyNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZQkqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVzdPTE1HLmggYi9pbmNsdWRlL2NvbmZpZ3MvVzdPTE1HLmgKaW5kZXggMmJkOThiMy4uMjBkNjkzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1c3T0xNRy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9XN09MTUcuaApAQCAtNzUsMTQgKzc1LDM0IEBACiAjZGVmaW5lIENGR19EVFRfTE9XX1RFTVAJLTMwCiAjZGVmaW5lIENGR19EVFRfSFlTVEVSRVNJUwkzCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0lSUSB8IENGR19DTURfQVNLRU5WIHwgXAotCSBDRkdfQ01EX0RIQ1AgfCBDRkdfQ01EX0JFREJVRyB8IENGR19DTURfREFURSB8IENGR19DTURfSTJDIHwgXAotCSBDRkdfQ01EX0VFUFJPTSB8IENGR19DTURfRUxGIHwgQ0ZHX0NNRF9CU1AgfCBDRkdfQ01EX1JFR0lORk8gfCBcCi0JIENGR19DTURfRFRUKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICNkZWZpbmUgQ09ORklHX0hXX1dBVENIRE9HCQkJLyogSFcgV2F0Y2hkb2csIGJvYXJkIHNwZWNpZmljCSovCkBAIC05OCw3ICsxMTgsNyBAQAogI2lmZGVmICBDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAgICAgIj4gIgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI3OCw3ICsyOTgsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJCS8qIC4uLgkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJCS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbC4gKi8KICNlbmRpZgogCkBAIC0zMTAsNyArMzMwLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlCSovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9XVUg0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9XVUg0MDUuaAppbmRleCA1MmJmZjQwLi42NTY3ODRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvV1VINDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1dVSDQwNS5oCkBAIC02MCwxOSArNjAsMzEgQEAKIAogI2RlZmluZSBDT05GSUdfUEhZX0NMS19GUkVRCUVNQUNfU1RBQ1JfQ0xLXzY2TUhaIC8qIDY2IE1IeiBPUEIgY2xvY2sqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC05Miw3ICsxMDQsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNDgsNyArMjYwLDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9YUEVESVRFMUsuaCBiL2luY2x1ZGUvY29uZmlncy9YUEVESVRFMUsuaAppbmRleCBmMmFkMDk3Li42MTFmNWE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvWFBFRElURTFLLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1hQRURJVEUxSy5oCkBAIC0xODIsMjUgKzE4MiwzMyBAQAogI2RlZmluZSBDT05GSUdfSEFTX0VUSDIJCTEJLyogYWRkIHN1cHBvcnQgZm9yICJldGgyYWRkciIJKi8KICNkZWZpbmUgQ09ORklHX0hBU19FVEgzCQkxCS8qIGFkZCBzdXBwb3J0IGZvciAiZXRoM2FkZHIiCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfUElORyB8IFwKLQkJCQlDRkdfQ01EX0VMRiB8IFwKLQkJCQlDRkdfQ01EX01JSSB8IFwKLQkJCQlDRkdfQ01EX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9GQVQgKQogCi0vKgkJCQlDRkdfQ01EX0RIQ1AJfCBcICovCi0vKgkJCQlDRkdfQ01EX0tHREIJfCBcICovCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0yMDksNyArMjE3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjU0LDcgKzI2Miw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyIC8qIEZvciBBTUNDIDQ0MEdYIENQVXMgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjY2LDcgKzI3NCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvWXVrb244MjIwLmggYi9pbmNsdWRlL2NvbmZpZ3MvWXVrb244MjIwLmgKaW5kZXggMzdlZjEwNS4uMDBjNGZmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1l1a29uODIyMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ZdWtvbjgyMjAuaApAQCAtMzksMTIgKzM5LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCi0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzAsMzEgKzY0LDQwIEBACiAKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAkJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAorCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CT09URAl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKICNkZWZpbmUgQ09ORklHX01JSQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBBdXRvYm9vdGluZwogICovCkBAIC0yOTMsNyArMjk2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkgICAgLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJICAgIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CSAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CSAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzA5LDYgKzMxMiwxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJICAgIC8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyMjAgQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9aUEMxOTAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvWlBDMTkwMC5oCmluZGV4IGE1MDg1Y2YuLjdjMWE1YjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9aUEMxOTAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1pQQzE5MDAuaApAQCAtNTUsOCArNTUsOCBAQAogICogU0NDLCAxLTMgZm9yIEZDQykKICAqCiAgKiBJZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMKLSAqIG11c3QgYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QKLSAqIGJlIHJlbW92ZWQgZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBtdXN0IGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVAorICogbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIEV0aGVybmV0IGlzIG5vdCBvbiBTQ0MgKi8KICNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZDQwkJLyogRXRoZXJuZXQgaXMgb24gRkNDICAgICAqLwpAQCAtMTA2LDIyICsxMDYsMzMgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTM4NDAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgICBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgIFwKLQkJCQl8IENGR19DTURfSU1NQVAgICBcCi0JCQkJfCBDRkdfQ01EX01JSSAgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgIFwKLQkJCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiZGhjcDtib290bSIJLyogYXV0b2Jvb3QgY29tbWFuZCAqLwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvbmZzIHJ3IGlwPTo6Ojo6ZXRoMDpkaGNwIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xMzksNyArMTUwLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjIzLDcgKzIzNCw3IEBACiAjZW5kaWYKIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0yNDgsMTggKzI1OSwxOCBAQAogI2RlZmluZSBDRkdfTFNSVAkJMHgwRgogI2RlZmluZSBDRkdfTVBUUFIJCTB4NDAwMAogCi0jZGVmaW5lIENGR19QU0RSQU1fQlIJCUNGR19TRFJBTV9CQVNFIHwgMHgwMDAwMDA0MQorI2RlZmluZSBDRkdfUFNEUkFNX0JSCQkoQ0ZHX1NEUkFNX0JBU0UgfCAweDAwMDAwMDQxKQogI2RlZmluZSBDRkdfUFNEUkFNX09SCQkweEZDMDAyOEMwCi0jZGVmaW5lIENGR19MU0RSQU1fQlIJCUNGR19MU0RSQU1fQkFTRSB8IDB4MDAwMDE4NjEKKyNkZWZpbmUgQ0ZHX0xTRFJBTV9CUgkJKENGR19MU0RSQU1fQkFTRSB8IDB4MDAwMDE4NjEpCiAjZGVmaW5lIENGR19MU0RSQU1fT1IJCTB4RkY4MDM0ODAKIAotI2RlZmluZSBDRkdfQlIwX1BSRUxJTQkJQ0ZHX0ZMQVNIX0JBU0UgfCAweDAwMDAwODAxCisjZGVmaW5lIENGR19CUjBfUFJFTElNCQkoQ0ZHX0ZMQVNIX0JBU0UgfCAweDAwMDAwODAxKQogI2RlZmluZSBDRkdfT1IwX1BSRUxJTQkJMHhGRkUwMDg1NgotI2RlZmluZSBDRkdfQlI1X1BSRUxJTQkJQ0ZHX0VFUFJPTSB8IDB4MDAwMDA4MDEKKyNkZWZpbmUgQ0ZHX0JSNV9QUkVMSU0JCShDRkdfRUVQUk9NIHwgMHgwMDAwMDgwMSkKICNkZWZpbmUgQ0ZHX09SNV9QUkVMSU0JCTB4RkZGRjAzRjYKLSNkZWZpbmUgQ0ZHX0JSNl9QUkVMSU0JCUNGR19GTFNJTU1fQkFTRSB8IDB4MDAwMDE4MDEKKyNkZWZpbmUgQ0ZHX0JSNl9QUkVMSU0JCShDRkdfRkxTSU1NX0JBU0UgfCAweDAwMDAxODAxKQogI2RlZmluZSBDRkdfT1I2X1BSRUxJTQkJMHhGRjAwMDg1NgotI2RlZmluZSBDRkdfQlI3X1BSRUxJTQkJQ0ZHX0JDU1IgfCAweDAwMDAwODAxCisjZGVmaW5lIENGR19CUjdfUFJFTElNCQkoQ0ZHX0JDU1IgfCAweDAwMDAwODAxKQogI2RlZmluZSBDRkdfT1I3X1BSRUxJTQkJMHhGRkZGODNGNgogCiAjZGVmaW5lIENGR19SRVNFVF9BRERSRVNTCTB4QzAwMDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9aVU1BLmggYi9pbmNsdWRlL2NvbmZpZ3MvWlVNQS5oCmluZGV4IGYxNjNkMDAuLjViYThkMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9aVU1BLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1pVTUEuaApAQCAtMTAxLDE3ICsxMDEsMjkgQEAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICN1bmRlZglDT05GSUdfQUxUSVZFQwkJCS8qIHVuZGVmIHRvIGRpc2FibGUJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogI2RlZmluZSBDT05GSUdfTUlJCQkvKiBlbmFibGUgTUlJIGNvbW1hbmRzICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JTUAl8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkgQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJIENGR19DTURfREFURSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogSkZGUzIgcGFydGl0aW9ucwpAQCAtMTMxLDE1ICsxNDMsMTIgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9enVtYS0xOi0oamZmczIpLHp1bWEtMjotKHVzZXIpIgogKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNDksNyArMzU4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hY2FkaWEuaCBiL2luY2x1ZGUvY29uZmlncy9hY2FkaWEuaAppbmRleCA1MTdkMTMwLi5lM2Y2ZTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYWNhZGlhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2FjYWRpYS5oCkBAIC0xMjMsMTAgKzEyMyw4IEBACiAjZGVmaW5lIENGR19GTEFTSF9VU0VfQlVGRkVSX1dSSVRFIDEJLyogdXNlIGJ1ZmZlcmVkIHdyaXRlcyAoMjB4IGZhc3RlcikJKi8KICNkZWZpbmUgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8JCS8qIHByaW50ICdFJyBmb3IgZW1wdHkgc2VjdG9yIG9uIGZsaW5mbyAqLwogCi0jZGVmaW5lCV9DRkdfQ01EX0lOQ0xVREUJKENGR19DTURfQUxMKQogI2Vsc2UKICNkZWZpbmUJQ0ZHX05PX0ZMQVNICQkxCS8qIE5vIE5PUiBvbiBBY2FkaWEgd2hlbiBOQU5ELWJvb3RpbmcJKi8KLSNkZWZpbmUJX0NGR19DTURfSU5DTFVERQkoKENGR19DTURfQUxMKSAmIH4oQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfSU1MUykpCiAjZW5kaWYKIAogI2lmZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKQEAgLTMwMSwyNyArMjk5LDQ1IEBACiAKICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMICYgX0NGR19DTURfSU5DTFVERSkJfAlcCi0JCQkgQ0ZHX0NNRF9BU0tFTlYJfAkJCQlcCi0JCQkgQ0ZHX0NNRF9ESENQCXwJCQkJXAotCQkJIENGR19DTURfRFRUCXwJCQkJXAotCQkJIENGR19DTURfRElBRwl8CQkJCVwKLQkJCSBDRkdfQ01EX0VFUFJPTQl8CQkJCVwKLQkJCSBDRkdfQ01EX0VMRgl8CQkJCVwKLQkJCSBDRkdfQ01EX0ZBVAl8CQkJCVwKLQkJCSBDRkdfQ01EX0kyQwl8CQkJCVwKLQkJCSBDRkdfQ01EX0lSUQl8CQkJCVwKLQkJCSBDRkdfQ01EX01JSQl8CQkJCVwKLQkJCSBDRkdfQ01EX05BTkQJfAkJCQlcCi0JCQkgQ0ZHX0NNRF9ORVQJfAkJCQlcCi0JCQkgQ0ZHX0NNRF9ORlMJfAkJCQlcCi0JCQkgQ0ZHX0NNRF9QQ0kJfAkJCQlcCi0JCQkgQ0ZHX0NNRF9QSU5HCXwJCQkJXAotCQkJIENGR19DTURfUkVHSU5GTyB8CQkJCVwKLQkJCSBDRkdfQ01EX1VTQikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1VTQgorCisvKgorICogTm8gTk9SIG9uIEFjYWRpYSB3aGVuIE5BTkQtYm9vdGluZworICovCisjaWYgZGVmaW5lZChDT05GSUdfTkFORF9VX0JPT1QpIHx8IGRlZmluZWQoQ09ORklHX05BTkRfU1BMKQorI3VuZGVmIENPTkZJR19DTURfRkxBU0gKKyN1bmRlZiBDT05GSUdfQ01EX0lNTFMKKyNlbmRpZgogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMzMwLDcgKzM0Niw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzczLDcgKzM4OSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkJLyogRm9yIEFNQ0MgNDA1RVogQ1BVCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJCS8qIC4uLgkJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQ4OSw3ICs1MDUsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAgICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hZHM1MTIxLmggYi9pbmNsdWRlL2NvbmZpZ3MvYWRzNTEyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWFjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYWRzNTEyMS5oCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQURTNTEyMSBib2FyZCBjb25maWd1cmF0aW9uIGZpbGUKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisjZGVmaW5lIERFQlVHCisjdW5kZWYgREVCVUcKKworLyoKKyAqIE1lbW9yeSBtYXAgZm9yIHRoZSBBRFM1MTIxIGJvYXJkOgorICoKKyAqIDB4MDAwMF8wMDAwIC0gMHgwRkZGX0ZGRkYJRERSIFJBTSAoMjU2IE1CKQorICogMHgzMDAwXzAwMDAgLSAweDMwMDFfRkZGRglTUkFNICgxMjggS0IpCisgKiAweDgwMDBfMDAwMCAtIDB4ODAzRl9GRkZGCUlNTVIgKDQgTUIpCisgKiAweDgyMDBfMDAwMCAtIDB4ODIwMF8wMDFGCUNQTEQgKDMyIEIpCisgKiAweEZDMDBfMDAwMCAtIDB4RkZGRl9GRkZGCU5PUiBCb290IEZMQVNIICg2NCBNQikKKyAqLworCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfRTMwMAkJMQkvKiBFMzAwIEZhbWlseSAqLworI2RlZmluZSBDT05GSUdfTVBDNTEyWAkJMQkvKiBNUEM1MTJYIGZhbWlseSAqLworCisjdW5kZWYgQ09ORklHX1BDSQorCisjZGVmaW5lIENGR19NUEM1MTJYX0NMS0lOCTY2MDAwMDAwCS8qIGluIEh6ICovCisKKyNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRgkJLyogY2FsbCBib2FyZF9lYXJseV9pbml0X2YoKSAqLworCisjZGVmaW5lIENGR19JTU1SCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDIwMDAwMCAgICAgIC8qIG1lbXRlc3QgcmVnaW9uICovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwMDQwMDAwMAorCisvKgorICogRERSIFNldHVwIC0gbWFudWFsbHkgc2V0IGFsbCBwYXJhbWV0ZXJzIGFzIHRoZXJlJ3Mgbm8gU1BEIGV0Yy4KKyAqLworI2RlZmluZSBDRkdfRERSX1NJWkUJCTI1NgkJLyogTUIgKi8KKyNkZWZpbmUgQ0ZHX0REUl9CQVNFCQkweDAwMDAwMDAwCS8qIEREUiBpcyBzeXN0ZW0gbWVtb3J5Ki8KKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCUNGR19ERFJfQkFTRQorCisvKiBERFIgQ29udHJvbGxlciBDb25maWd1cmF0aW9uCisgKgorICogU1lTX0NGRzoKKyAqCVszMTozMV0JTUREUkMgU29mdCBSZXNldDoJRGlhYmxlZAorICoJWzMwOjMwXQlEUkFNIENLRSBwaW46CQlFbmFibGVkCisgKglbMjk6MjldCURSQU0gQ0xLOgkJRW5hYmxlZAorICoJWzI4OjI4XQlDb21tYW5kIE1vZGU6CQlFbmFibGVkIChGb3IgaW5pdGlhbGl6YXRpb24gb25seSkKKyAqCVsyNzoyNV0JRFJBTSBSb3cgU2VsZWN0OglkcmFtX3Jvd1sxNTowXSA9IG1hZ2VudGFfYWRkcmVzc1syNToxMF0KKyAqCVsyNDoyMV0JRFJBTSBCYW5rIFNlbGVjdDoJZHJhbV9iYW5rWzE6MF0gPSBtYWdlbnRhX2FkZHJlc3NbMTE6MTBdCisgKglbMjA6MTldCVJlYWQgVGVzdDoJCURPTidUIFVTRQorICoJWzE4OjE4XQlTZWxmIFJlZnJlc2g6CQlFbmFibGVkCisgKglbMTc6MTddCTE2Yml0IE1vZGU6CQlEaXNhYmxlZAorICoJWzE2OjEzXSBSZWFkeSBEZWxheToJCTIKKyAqCVsxMjoxMl0JSGFsZiBEUVMgRGVsYXk6CQlEaXNhYmxlZAorICoJWzExOjExXQlRdWFydGVyIERRUyBEZWxheToJRGlzYWJsZWQKKyAqCVsxMDowOF0JV3JpdGUgRGVsYXk6CQkyCisgKglbMDc6MDddCUVhcmx5IE9EVDoJCURpc2FibGVkCisgKglbMDY6MDZdCU9uIERJRSBUZXJtaW5hdGlvbjoJRGlzYWJsZWQKKyAqCVswNTowNV0JRklGTyBPdmVyZmxvdyBDbGVhcjoJRE9OJ1QgVVNFIGhlcmUKKyAqCVswNDowNF0JRklGTyBVbmRlcmZsb3cgQ2xlYXI6CURPTidUIFVTRSBoZXJlCisgKglbMDM6MDNdCUZJRk8gT3ZlcmZsb3cgUGVuZGluZzoJRE9OJ1QgVVNFIGhlcmUKKyAqCVswMjowMl0JRklGTyBVbmRlcmxmb3cgUGVuZGluZzoJRE9OJ1QgVVNFIGhlcmUKKyAqCVswMTowMV0JRklGTyBPdmVybGZvdyBFbmFibGVkOglFbmFibGVkCisgKglbMDA6MDBdCUZJRk8gVW5kZXJmbG93IEVuYWJsZWQ6CUVuYWJsZWQKKyAqIFRJTUVfQ0ZHMAorICoJWzMxOjE2XQlEUkFNIFJlZnJlc2ggVGltZToJMCBDU0IgY2xvY2tzCisgKglbMTU6OF0JRFJBTSBDb21tYW5kIFRpbWU6CTAgQ1NCIGNsb2NrcworICoJWzA3OjAwXQlEUkFNIFByZWNoYXJnZSBUaW1lOgkwIENTQiBjbG9ja3MKKyAqIFRJTUVfQ0ZHMQorICoJWzMxOjI2XQlEUkFNIHRSRkM6CisgKglbMjU6MjFdCURSQU0gdFdSMToKKyAqCVsyMDoxN10JRFJBTSB0V1JUMToKKyAqCVsxNjoxMV0JRFJBTSB0RFJSOgorICoJWzEwOjA1XQlEUkFNIHRSQzoKKyAqCVswNDowMF0JRFJBTSB0UkFTOgorICogVElNRV9DRkcyCisgKglbMzE6MjhdCURSQU0gdFJDRDoKKyAqCVsyNzoyM10JRFJBTSB0RkFXOgorICoJWzIyOjE5XQlEUkFNIHRSVFcxOgorICoJWzE4OjE1XQlEUkFNIHRDQ0Q6CisgKglbMTQ6MTBdIERSQU0gdFJUUDoKKyAqCVswOTowNV0JRFJBTSB0UlA6CisgKglbMDQ6MDBdIERSQU0gdFJQQQorICovCisKKyNkZWZpbmUgQ0ZHX01ERFJDX1NZU19DRkcJMHhGODYwNDIwMAorI2RlZmluZSBDRkdfTUREUkNfU1lTX0NGR19SVU4JMHhFODYwNDIwMAorI2RlZmluZSBDRkdfTUREUkNfU1lTX0NGR19FTgkweDMwMDAwMDAwCisjZGVmaW5lIENGR19NRERSQ19USU1FX0NGRzAJMHgwMDAwMjgxRQorI2RlZmluZSBDRkdfTUREUkNfVElNRV9DRkcwX1JVTgkweDAxRjQyODFFCisjZGVmaW5lIENGR19NRERSQ19USU1FX0NGRzEJMHg1NEVDMTE2OAorI2RlZmluZSBDRkdfTUREUkNfVElNRV9DRkcyCTB4MzUyMTA4NjQKKworI2RlZmluZSBDRkdfTUlDUk9OX05PUAkJMHgwMTM4MDAwMAorI2RlZmluZSBDRkdfTUlDUk9OX1BDSEdfQUxMCTB4MDExMDA0MDAKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9NUgkJMHgwMTAwMDAyMgorI2RlZmluZSBDRkdfTUlDUk9OX0VNMgkJMHgwMTAyMDAwMAorI2RlZmluZSBDRkdfTUlDUk9OX0VNMwkJMHgwMTAzMDAwMAorI2RlZmluZSBDRkdfTUlDUk9OX0VOX0RMTAkweDAxMDEwMDAwCisjZGVmaW5lIENGR19NSUNST05fUlNUX0RMTAkweDAxMDAwOTMyCisjZGVmaW5lIENGR19NSUNST05fUkZTSAkJMHgwMTA4MDAwMAorI2RlZmluZSBDRkdfTUlDUk9OX0lOSVRfREVWX09QCTB4MDEwMDA4MzIKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9PQ0RfREVGQVVMVAkweDAxMDEwNzgwCisjZGVmaW5lIENGR19NSUNST05fT0NEX0VYSVQJMHgwMTAxMDQwMAorCisvKiBERFIgUHJpb3JpdHkgTWFuYWdlciBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIENGR19NRERSQ0dSUF9QTV9DRkcxCTB4MDAwNzc3QUEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX1BNX0NGRzIJMHgwMDAwMDA1NQorI2RlZmluZSBDRkdfTUREUkNHUlBfSElQUklPX0NGRwkweDAwMDAwMDAwCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQwX01VICAgIDB4MTExMTExMTcKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDBfTUwJMHg3Nzc3Nzc3QQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMV9NVSAgICAweDQ0NDRFRUVFCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQxX01MCTB4RUVFRUVFRUUKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDJfTVUgICAgMHg0NDQ0NDQ0NAorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMl9NTAkweDQ0NDQ0NDQ0CisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQzX01VICAgIDB4NTU1NTU1NTUKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDNfTUwJMHg1NTU1NTU1OAorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUNF9NVSAgICAweDExMTExMTExCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQ0X01MCTB4MTExMTExN0MKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDBfQVUgICAgMHgzMzMzMzM3NworI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMF9BTAkweDc3NzdFRUVFCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQxX0FVICAgIDB4MTExMTExMTEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDFfQUwJMHgxMTExMTExMQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMl9BVSAgICAweDExMTExMTExCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQyX0FMCTB4MTExMTExMTEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDNfQVUgICAgMHgxMTExMTExMQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUM19BTAkweDExMTExMTExCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQ0X0FVICAgIDB4MTExMTExMTEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDRfQUwJMHgxMTExMTExMQorCisvKgorICogTk9SIEZMQVNIIG9uIHRoZSBMb2NhbCBCdXMKKyAqLworI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCQkJCS8qIHVzZSB0aGUgQ29tbW9uIEZsYXNoIEludGVyZmFjZSAqLworI2RlZmluZSBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgkJCS8qIHVzZSB0aGUgQ0ZJIGRyaXZlciAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGQzAwMDAwMAkvKiBzdGFydCBvZiBGTEFTSCAgICovCisjZGVmaW5lIENGR19GTEFTSF9TSVpFCQkweDA0MDAwMDAwCS8qIG1heCBmbGFzaCBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIENGR19GTEFTSF9VU0VfQlVGRkVSX1dSSVRFCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBudW1iZXIgb2YgYmFua3MgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBTktTX0xJU1QgCXtDRkdfRkxBU0hfQkFTRX0KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTI1NgkJLyogbWF4IHNlY3RvcnMgcGVyIGRldmljZSAqLworCisjdW5kZWYgQ0ZHX0ZMQVNIX0NIRUNLU1VNCisKKy8qCisgKiBDUExEIHJlZ2lzdGVycyBhcmVhIGlzIHJlYWxseSBvbmx5IDMyIGJ5dGVzIGluIHNpemUsIGJ1dCB0aGUgc21hbGxlc3QgcG9zc2libGUgTFAKKyAqIHdpbmRvdyBpcyA2NEtCCisgKi8KKyNkZWZpbmUgQ0ZHX0NQTERfQkFTRQkJMHg4MjAwMDAwMAorI2RlZmluZSBDRkdfQ1BMRF9TSVpFCQkweDAwMDEwMDAwCS8qIDY0IEtCICovCisKKyNkZWZpbmUgQ0ZHX1NSQU1fQkFTRQkJMHgzMDAwMDAwMAorI2RlZmluZSBDRkdfU1JBTV9TSVpFCQkweDAwMDIwMDAwCS8qIDEyOCBLQiAqLworCisjZGVmaW5lIENGR19DUzBfQ0ZHCQkweDA1MDU5MzEwCS8qIEFMRSBhY3RpdmUgbG93LCBkYXRhIHNpemUgNGJ5dGVzICovCisjZGVmaW5lIENGR19DUzJfQ0ZHCQkweDA1MDU5MDEwCS8qIEFMRSBhY3RpdmUgbG93LCBkYXRhIHNpemUgMWJ5dGUgKi8KKworLyogVXNlIFNSQU0gZm9yIGluaXRpYWwgc3RhY2sgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJQ0ZHX1NSQU1fQkFTRQkJLyogSW5pdGlhbCBSQU0gYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECUNGR19TUkFNX1NJWkUJCS8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNICovCisKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMHgxMDAJCQkvKiBudW0gYnl0ZXMgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQkJLyogU3RhcnQgb2YgbW9uaXRvciAqLworI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgyNTYgKiAxMDI0KQkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbiAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDUxMiAqIDEwMjQpCQkvKiBSZXNlcnZlZCBmb3IgbWFsbG9jICovCisKKy8qCisgKiBTZXJpYWwgUG9ydAorICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAxCisjdW5kZWYgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPCisKKy8qCisgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1BTQ19DT05TT0xFCTMJLyogY29uc29sZSBpcyBvbiBQU0MzICovCisjaWYgQ09ORklHX1BTQ19DT05TT0xFICE9IDMKKyNlcnJvciBDT05GSUdfUFNDX0NPTlNPTEUgbXVzdCBiZSAzCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAJLyogLi4uIGF0IDExNTIwMCBicHMgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFICBcCisJezMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsMTE1MjAwfQorCisjZGVmaW5lIENPTlNPTEVfRklGT19UWF9TSVpFCUZJRk9DX1BTQzNfVFhfU0laRQorI2RlZmluZSBDT05TT0xFX0ZJRk9fVFhfQUREUglGSUZPQ19QU0MzX1RYX0FERFIKKyNkZWZpbmUgQ09OU09MRV9GSUZPX1JYX1NJWkUJRklGT0NfUFNDM19SWF9TSVpFCisjZGVmaW5lIENPTlNPTEVfRklGT19SWF9BRERSCUZJRk9DX1BTQzNfUlhfQUREUgorCisjZGVmaW5lIENPTkZJR19DTURMSU5FX0VESVRJTkcJMQkvKiBhZGQgY29tbWFuZCBsaW5lIGhpc3RvcnkJKi8KKy8qIFVzZSB0aGUgSFVTSCBwYXJzZXIgKi8KKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCisjaWZkZWYgIENGR19IVVNIX1BBUlNFUgorI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyICI+ICIKKyNlbmRpZgorCisvKiBJMkMgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAqLworI3VuZGVmIENPTkZJR19TT0ZUX0kyQwkJCS8qIHNvIGRpc2FibGUgYml0LWJhbmdlZCBJMkMgKi8KKyNkZWZpbmUgQ09ORklHX0kyQ19NVUxUSV9CVVMKKyNkZWZpbmUgQ09ORklHX0kyQ19DTURfVFJFRQorI2RlZmluZSBDRkdfSTJDX1NQRUVECQkxMDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzICovCisjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKKyNpZiAwCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJe3swLDB4Njl9fQkqIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCisjZW5kaWYKKworLyoKKyAqIEV0aGVybmV0IGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfTVBDNTEyeF9GRUMJMQorI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMHgxCisjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLworCisjaWYgMAorLyoKKyAqIENvbmZpZ3VyZSBvbi1ib2FyZCBSVEMKKyAqLworI2RlZmluZSBDT05GSUdfUlRDX0RTMTM3NAkJCS8qIHVzZSBkczEzNzQgcnRjIHZpYSBpMmMJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUgkJMHg2OAkvKiBhdCBhZGRyZXNzIDB4NjgJCSovCisjZW5kaWYKKworLyoKKyAqIEVudmlyb25tZW50CisgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCisvKiBUaGlzIGhhcyB0byBiZSBhIG11bHRpcGxlIG9mIHRoZSBGbGFzaCBzZWN0b3Igc2l6ZSAqLworI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFICsgQ0ZHX01PTklUT1JfTEVOKQorI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwMAorI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDQwMDAwCS8qIG9uZSBzZWN0b3IgKDI1NkspIGZvciBlbnYgKi8KKworLyogQWRkcmVzcyBhbmQgc2l6ZSBvZiBSZWR1bmRhbnQgRW52aXJvbm1lbnQgU2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJKENGR19FTlZfQUREUiArIENGR19FTlZfU0VDVF9TSVpFKQorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECShDRkdfRU5WX1NJWkUpCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCisKKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKy8qCisgKiBXYXRjaGRvZyB0aW1lb3V0ID0gQ0ZHX1dBVENIRE9HX1ZBTFVFICogNjU1MzYgLyBJUFMgY2xvY2suCisgKiBGb3IgZXhhbXBsZSwgd2hlbiBJUFMgaXMgc2V0IHRvIDY2TUh6IGFuZCBDRkdfV0FUQ0hET0dfVkFMVUUgaXMgc2V0CisgKiB0byAweEZGRkYsIHdhdGNoZG9nIHRpbWVvdXRzIGFmdGVyIGFib3V0IDY0cy4gRm9yIGRldGFpbHMgcmVmZXIKKyAqIHRvIGNoYXB0ZXIgMzYgb2YgdGhlIE1QQzUxMjFlIFJlZmVyZW5jZSBNYW51YWwuCisgKi8KKyNkZWZpbmUgQ09ORklHX1dBVENIRE9HCQkJLyogZW5hYmxlIHdhdGNoZG9nICovCisjZGVmaW5lIENGR19XQVRDSERPR19WQUxVRSAweEZGRkYKKworIC8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCisjZWxzZQorCSNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCisjZW5kaWYKKworCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUgKyBzaXplb2YoQ0ZHX1BST01QVCkgKyAxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzICovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX0haCQkxMDAwCQkvKiBkZWNyZW1lbnRlciBmcmVxOiAxbXMgdGlja3MgKi8KKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCovCisKKy8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLworI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0hJRDBfSU5JVAkweDAwMDAwMDAwMAorI2RlZmluZSBDRkdfSElEMF9GSU5BTAlISUQwX0VOQUJMRV9NQUNISU5FX0NIRUNLCisjZGVmaW5lIENGR19ISUQyCUhJRDJfSEJFCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdCAqLworCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCBvZiBrZ2RiIHNlcmlhbCBwb3J0ICovCisjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLworI2VuZGlmCisKKy8qCisgKiBFbnZpcm9ubWVudCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworI2RlZmluZSBDT05GSUdfSE9TVE5BTUUJCWFkczUxMjEKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQl1SW1hZ2UKKworI2RlZmluZSBDT05GSUdfTE9BREFERFIJCTIwMDAwMAkvKiBkZWZhdWx0IGxvY2F0aW9uIGZvciB0ZnRwIGFuZCBib290bSAqLworCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiAtMSBkaXNhYmxlcyBhdXRvLWJvb3QgKi8KKyN1bmRlZiAgQ09ORklHX0JPT1RBUkdTCQkJLyogdGhlIGJvb3QgY29tbWFuZCB3aWxsIHNldCBib290YXJncyAqLworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCisKKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87IglcCisJImVjaG8gVHlwZSBcInJ1biBmbGFzaF9uZnNcIiB0byBtb3VudCByb290IGZpbGVzeXN0ZW0gb3ZlciBORlM7IiBcCisJImVjaG8iCisKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAorCSJuZXRkZXY9ZXRoMFwwIgkJCQkJCQlcCisJIm5mc2FyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIgkJCVwKKwkJIm5mc3Jvb3Q9JHtzZXJ2ZXJpcH06JHtyb290cGF0aH1cMCIJCQlcCisJInJhbWFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcndcMCIJCQlcCisJImFkZGlwPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAiCQkJCVwKKwkJImlwPSR7aXBhZGRyfToke3NlcnZlcmlwfToke2dhdGV3YXlpcH06JHtuZXRtYXNrfSIJXAorCQkiOiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgcGFuaWM9MVwwIgkJCVwKKwkiYWRkdHR5PXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSBjb25zb2xlPXR0eVMwLCR7YmF1ZHJhdGV9XDAiXAorCSJmbGFzaF9uZnM9cnVuIG5mc2FyZ3MgYWRkaXAgYWRkdHR5OyIJCQkJXAorCQkiYm9vdG0gJHtrZXJuZWxfYWRkcn1cMCIJCQkJXAorCSJmbGFzaF9zZWxmPXJ1biByYW1hcmdzIGFkZGlwIGFkZHR0eTsiCQkJCVwKKwkJImJvb3RtICR7a2VybmVsX2FkZHJ9ICR7cmFtZGlza19hZGRyfVwwIgkJXAorCSJuZXRfbmZzPXRmdHAgMjAwMDAwICR7Ym9vdGZpbGV9O3J1biBuZnNhcmdzIGFkZGlwIGFkZHR0eTsiCVwKKwkJImJvb3RtXDAiCQkJCQkJXAorCSJsb2FkPXRmdHAgMjAwMDAwIC90ZnRwYm9vdC9hZHM1MTIxL3UtYm9vdC5iaW5cMCIJCVwKKwkidXBkYXRlPXByb3RlY3Qgb2ZmIEZGRjAwMDAwICske2ZpbGVzaXplfTsiCQkJXAorCQkiZXJhIEZGRjAwMDAwICske2ZpbGVzaXplfTtjcC5iIDIwMDAwMCBGRkYwMDAwMCAke2ZpbGVzaXplfVwwIiBcCisJInVwZD1ydW4gbG9hZDtydW4gdXBkYXRlXDAiCQkJCQlcCisJIiIKKworI2RlZmluZSBDT05GSUdfTkZTQk9PVENPTU1BTkQJCQkJCQlcCisJInNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQkJXAorCQkibmZzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICIJCQkJXAorCQkiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIiBcCisJCSJjb25zb2xlPSRjb25zb2xlZGV2LCRiYXVkcmF0ZSAkb3RoYm9vdGFyZ3M7IgkJXAorCSJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IgkJCQkJXAorCSJ0ZnRwICRmZHRhZGRyICRmZHRmaWxlOyIJCQkJCVwKKwkiYm9vdG0gJGxvYWRhZGRyIC0gJGZkdGFkZHIiCisKKyNkZWZpbmUgQ09ORklHX1JBTUJPT1RDT01NQU5ECQkJCQkJXAorCSJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiCQkJCVwKKwkJImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCQlcCisJInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiCQkJCVwKKwkidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCVwKKwkidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQkJCQlcCisJImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIgJGZkdGFkZHIiCisKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfc2VsZiIKKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hZHN2aXguaCBiL2luY2x1ZGUvY29uZmlncy9hZHN2aXguaAppbmRleCBjNDEwODkxLi43MDNkMzEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYWRzdml4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2Fkc3ZpeC5oCkBAIC02OCwxMCArNjgsMjggQEAKIAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTiAgIDEKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoQ09ORklHX0NNRF9ERkwgJiB+Q0ZHX0NNRF9ORVQpIHwgQ0ZHX0NNRF9NTUMgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfSURFIHwgQ0ZHX0NNRF9QQ01DSUEpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9NTUMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ01DSUEKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI3VuZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKIApAQCAtMTYyLDcgKzE4MCw3IEBACiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkgMQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcwkqLwogLyogI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkgMSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hZXYuaCBiL2luY2x1ZGUvY29uZmlncy9hZXYuaAppbmRleCBmNmY1MzBjLi41YmFiNzkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYWV2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2Fldi5oCkBAIC00NCwxMSArNDQsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTkxLDM0ICs4Niw0MiBAQAogCQkJCSBDRkdfUE9TVF9JMkMpCiAKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICNkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSBNUEM1WFhYX1NSQU1fU0laRS00Ci0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCiAjZW5kaWYKIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUFERF9CTVBfQ01ECXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1BPU1RfRElBRyB8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWZkZWYgQ09ORklHX1BPU1QKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZW5kaWYKKwogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIGRpc3BsYXkgaW1hZ2UgdGltZXN0YW1wcyAqLwogCkBAIC0zMjQsNyArMzI3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTM0Myw5ICszNDYsMTMgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCi0gKiBFbmFibGUgbG9vcHcgY29tbWFuZG8uIFRoaXMgaGFzIG9ubHkgYWZmZWN0LCBpZiBDRkdfQ01EX01FTSBpcyBkZWZpbmVkLAotICogd2hpY2ggaXMgbm9ybWFsbHkgcGFydCBvZiB0aGUgZGVmYXVsdCBjb21tYW5kcyAoQ0ZWX0NNRF9ERkwpCisgKiBFbmFibGUgbG9vcHcgY29tbWFuZC4KICAqLwogI2RlZmluZSBDT05GSUdfTE9PUFcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FscHIuaCBiL2luY2x1ZGUvY29uZmlncy9hbHByLmgKaW5kZXggZGYwNTdkOS4uZDg4YzNhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2FscHIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYWxwci5oCkBAIC0yMTAsMjUgKzIxMCwzNyBAQAogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCQkvKiBpbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRlBHQQl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GUEdBCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0yMzcsNyArMjQ5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzU4LDcgKzM3MCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRpbGxvLmggYi9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRpbGxvLmgKaW5kZXggOWExYzU1OS4uNzNhODg4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2FybWFkaWxsby5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hcm1hZGlsbG8uaApAQCAtNzEsMTIgKzcxLDIxIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyAgICAgICAoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwpIC8qIHwgQ0ZHX0NNRF9KRkZTMikqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PS9kZXYvcmFtMCByb290ZnN0eXBlPWV4dDIgY29uc29sZT10dHlBTTAsMTE1MjAwIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2Fzc2FiZXQuaCBiL2luY2x1ZGUvY29uZmlncy9hc3NhYmV0LmgKaW5kZXggMWE2OWViZS4uMjI2YWQ1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2Fzc2FiZXQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXNzYWJldC5oCkBAIC02NiwxOCArNjYsMzAgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQKQotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfREVGQVVMVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJjb25zb2xlPXR0eVNBMCwxMTUyMDBuOCByb290PS9kZXYvbmZzIGlwPWJvb3RwIgogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RwO3RmdHA7Ym9vdG0iCiAjZGVmaW5lIENGR19BVVRPTE9BRCAgICAgICAgICAgICJuIgkvKiBObyBhdXRvbG9hZCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrLmggYi9pbmNsdWRlL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrLmgKaW5kZXggOGZhZDU1ZC4uYTY1YzVmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2F0OTFybTkyMDBkay5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hdDkxcm05MjAwZGsuaApAQCAtOTcsMTggKzk3LDMxIEBACiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAzCiAvKiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCTEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkJICAgICAgICgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01JSSB8XAotCQkJQ0ZHX0NNRF9ESENQICkgJiBcCi0JCSAgICAgIH4oQ0ZHX0NNRF9CREkgfCBcCi0JCQlDRkdfQ01EX0lNSSB8IFwKLQkJCUNGR19DTURfQVVUT1NDUklQVCB8IFwKLQkJCUNGR19DTURfRlBHQSB8IFwKLQkJCUNGR19DTURfTUlTQyB8IFwKLQkJCUNGR19DTURfTE9BRFMgKSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9JTUkKKyN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX01JU0MKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisKIAogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCiAjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCkBAIC0xNTAsNiArMTYzLDExIEBACiAjZGVmaW5lIENPTkZJR19ORVRfUkVUUllfQ09VTlQJCTIwCiAjZGVmaW5lIENPTkZJR19BVDkxQ19VU0VfUk1JSQogCisvKiBBQyBDaGFyYWN0ZXJpc3RpY3MgKi8KKy8qIERMWUJTID0gdENTUyA9IDI1MG5zIG1pbiBhbmQgRExZQkNUID0gdENTSCA9IDI1MG5zICovCisjZGVmaW5lIERBVEFGTEFTSF9UQ1NTCSgweEMgPDwgMTYpCisjZGVmaW5lIERBVEFGTEFTSF9UQ0hTCSgweDEgPDwgMjQpCisKICNkZWZpbmUgQ09ORklHX0hBU19EQVRBRkxBU0gJCTEKICNkZWZpbmUgQ0ZHX1NQSV9XUklURV9UT1VUCQkoNSpDRkdfSFopCiAjZGVmaW5lIENGR19NQVhfREFUQUZMQVNIX0JBTktTIAkyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXRjLmggYi9pbmNsdWRlL2NvbmZpZ3MvYXRjLmgKaW5kZXggYmY2YzE3MC4uM2ZmNGI2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2F0Yy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hdGMuaApAQCAtNjQsOSArNjQsNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCi0gKgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gU0NDICAgICAgICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX05PTkUJCS8qIGRlZmluZSBpZiBldGhlciBvbiBzb21ldGhpbmcgZWxzZSAqLwpAQCAtMTI0LDI3ICsxMjIsMzcgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICN1bmRlZglDRkdfTE9BRFNfQkFVRF9DSEFOR0UJCS8qIGRvbid0IGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJIENGR19DTURfUENNQ0lBIHwgXAotCQkJCSBDRkdfQ01EX0RBVEUgfCBcCi0JCQkJIENGR19DTURfSURFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKIAogCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjg1LDcgKzI5Myw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgICAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hdHN0azEwMDIuaCBiL2luY2x1ZGUvY29uZmlncy9hdHN0azEwMDIuaAppbmRleCBiZWFmMzg1Li5lMWQ4Zjc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXRzdGsxMDAyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2F0c3RrMTAwMi5oCkBAIC0xMDgsNDcgKzEwOCwyOSBAQAogI2RlZmluZSBDT05GSUdfT1ZFUldSSVRFX0VUSEFERFJfT05DRQkxCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJCTEKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJKENPTkZJR19CT09UUF9TVUJORVRNQVNLCVwKLQkJCQkJIHwgQ09ORklHX0JPT1RQX0dBVEVXQVkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkJKENGR19DTURfQkRJCQkJXAotCQkJCQkgfCBDRkdfQ01EX0xPQURTCQlcCi0JCQkJCSB8IENGR19DTURfTE9BREIJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9JTUkJCQlcCi0JCQkJCSAvKiB8IENGR19DTURfQ0FDSEUgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9GTEFTSAkJXAotCQkJCQkgfCBDRkdfQ01EX01FTU9SWQkJXAotCQkJCQkgfCBDRkdfQ01EX05FVAkJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9FTlYJCQlcCi0JCQkJCSAvKiB8IENGR19DTURfSVJRICovCQlcCi0JCQkJCSB8IENGR19DTURfQk9PVEQJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9DT05TT0xFCQlcCi0JCQkJCSAvKiB8IENGR19DTURfRUVQUk9NICovCQlcCi0JCQkJCSB8IENGR19DTURfQVNLRU5WCQlcCi0JCQkJCSB8IENGR19DTURfUlVOCQkJXAotCQkJCQkgfCBDRkdfQ01EX0VDSE8JCQlcCi0JCQkJCSAvKiB8IENGR19DTURfSTJDICovCQlcCi0JCQkJCSB8IENGR19DTURfUkVHSU5GTwkJXAotCQkJCQkgLyogfCBDRkdfQ01EX0RBVEUgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9ESENQCQkJXAotCQkJCQkgLyogfCBDRkdfQ01EX0FVVE9TQ1JJUFQgKi8JXAotCQkJCQkgLyogfCBDRkdfQ01EX01JSSAqLwkJXAotCQkJCQkgfCBDRkdfQ01EX01JU0MJCQlcCi0JCQkJCSAvKiB8IENGR19DTURfU0RSQU0gKi8JCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9ESUFHICovCQlcCi0JCQkJCSAvKiB8IENGR19DTURfSFdGTE9XICovCQlcCi0JCQkJCSAvKiB8IENGR19DTURfU0FWRVMgKi8JCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9TUEkgKi8JCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9QSU5HICovCQlcCi0JCQkJCSB8IENGR19DTURfTU1DCQkJXAotCQkJCQkgfCBDRkdfQ01EX0ZBVAkJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9JTUxTCQkJXAotCQkJCQkgLyogfCBDRkdfQ01EX0lURVNUICovCQlcCi0JCQkJCSB8IENGR19DTURfRVhUMgkJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9KRkZTMgkJXAotCQkpCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01NQworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKworI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI3VuZGVmIENPTkZJR19DTURfU0VUR0VURENSCisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCiAKICNkZWZpbmUgQ09ORklHX0FUTUVMX1VTQVJUCQkxCiAjZGVmaW5lIENPTkZJR19NQUNCCQkJMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2JhbWJvby5oIGIvaW5jbHVkZS9jb25maWdzL2JhbWJvby5oCmluZGV4IGQ1ODM0NGQuLjE0YzU2MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9iYW1ib28uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYmFtYm9vLmgKQEAgLTIyMiw2ICsyMjIsOCBAQAogI2RlZmluZSBDRkdfU0lNVUxBVEVfU1BEX0VFUFJPTQkweGZmCS8qIHNpbXVsYXRlIHNwZCBlZXByb20gb24gdGhpcyBhZGRyZXNzCSovCiAjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUwl7Q0ZHX1NJTVVMQVRFX1NQRF9FRVBST00sIDB4NTAsIDB4NTF9CiAjZGVmaW5lIENGR19NQllURVNfU0RSQU0JKDY0KQkvKiA2NE1CIGZpeGVkIHNpemUgZm9yIGVhcmx5LXNkcmFtLWluaXQgKi8KKyNkZWZpbmUgQ09ORklHX1BST0dfU0RSQU1fVExCCisjdW5kZWYgIENGR19EUkFNX1RFU1QKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSTJDCkBAIC0zMTYsNDUgKzMxOCw1NSBAQAogI2RlZmluZSBVU0JfMl8wX0RFVklDRQogI2VuZGlmIC8qQ09ORklHXzQ0MEVQKi8KIAotI2lmZGVmIENPTkZJR19CQU1CT09fTkFORAotI2RlZmluZSBfQ0ZHX0NNRF9OQU5EIENGR19DTURfTkFORAotI2Vsc2UKLSNkZWZpbmUgX0NGR19DTURfTkFORCAwCi0jZW5kaWYgLyogQ09ORklHX0JBTUJPT19OQU5EICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfVVNCCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRVhUMgl8IFwKLQkJCQlfQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfU05UUAkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI2lmZGVmIENPTkZJR19CQU1CT09fTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNlbmRpZgorCiAKICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTQwNyw3ICs0MTksNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJKDMyPDwxMCkgLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MTksNyArNDMxLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9iYXJjby5oIGIvaW5jbHVkZS9jb25maWdzL2JhcmNvLmgKaW5kZXggNjI0ZmExZC4uMGJiNDQ2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2JhcmNvLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2JhcmNvLmgKQEAgLTcwLDIyICs3MCwzMCBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAibWVtPTMyTSIKIAotLyogQWRkIHN1cHBvcnQgZm9yIGEgZmV3IGV4dHJhIGJvb3RwIG9wdGlvbnMgbGlrZToKLSAqCS0gRmlsZSBzaXplCi0gKgktIEROUworCisvKgorICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUykKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICBDRkdfQ01EX0VMRiAgICB8IFwKLQkJCQkgIENGR19DTURfSTJDIAkgfCBcCi0JCQkJICBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgIENGR19DTURfUENJICAgICkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI2RlZmluZSBDT05GSUdfSFVTSF9QQVJTRVIJMSAvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyICovCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgCTEKQEAgLTExMCw3ICsxMTgsNiBAQAogICovCiAjZGVmaW5lIENPTkZJR19QQ0kJCQkJLyogaW5jbHVkZSBwY2kgc3VwcG9ydAkJKi8KICN1bmRlZiBDT05GSUdfUENJX1BOUAotI3VuZGVmIENGR19DTURfTkVUCiAKICNkZWZpbmUgUENJX0VORVQwX0lPQUREUgkweDgwMDAwMDAwCiAjZGVmaW5lIFBDSV9FTkVUMF9NRU1BRERSCTB4ODAwMDAwMDAKQEAgLTM0MCw3ICszNDcsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI0MCBDUFUJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2JmNTMzLWV6a2l0LmggYi9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtZXpraXQuaAppbmRleCA2NWRmYzgxLi42Y2I2YmM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtZXpraXQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtZXpraXQuaApAQCAtOTcsMTkgKzk3LDMxIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEKIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkJIENGR19DTURfUElORwl8IFwKLQkJCQkJIENGR19DTURfRUxGCXwgXAotCQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCQkgQ0ZHX0NNRF9EQVRFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKworCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAicm9vdD0vZGV2L210ZGJsb2NrMCBpcD0xOTIuMTY4LjAuMTU6MTkyLjE2OC4wLjI6MTkyLjE2OC4wLjE6MjU1LjI1NS4yNTUuMDplemtpdDpldGgwOm9mZiBjb25zb2xlPXR0eUJGMCw1NzYwMCIKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lCUNGR19QUk9NUFQJCSJlemtpdD4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtc3RhbXAuaCBiL2luY2x1ZGUvY29uZmlncy9iZjUzMy1zdGFtcC5oCmluZGV4IDc5YTE0MDQuLmNjZTZlZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9iZjUzMy1zdGFtcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9iZjUzMy1zdGFtcC5oCkBAIC0yNDAsMjMgKzI0MCw2IEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L210ZGJsb2NrMCBydyBjb25zb2xlPXR0eUJGMCw1NzYwMCIKIAotI2lmIChDT05GSUdfRFJJVkVSX1NNQzkxMTExKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMxCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HICAgfCBcCi0JCQkJIENGR19DTURfRUxGICAgIHwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFICB8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMiAgfCBcCi0JCQkJIENGR19DTURfRUVQUk9NIHwgXAotCQkJCSBDRkdfQ01EX0RBVEUpCi0KLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUzEJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0VMRiAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9DQUNIRSAgfCBcCi0JCQkJIENGR19DTURfSkZGUzIgIHwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFKQotI2VuZGlmCiAKICNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzNfQllQQVNTX0JPT1QpCiAjaWYgKENPTkZJR19EUklWRVJfU01DOTExMTEpCkBAIC0zMDUsMjAgKzI4OCwzOSBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmIChDT05GSUdfU09GVF9JMkMpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUzIgICBDRkdfQ01EX0kyQwotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTMiAwCi0jZW5kaWYgLyogQ09ORklHX1NPRlRfSTJDICovCiAKLSNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzNfQllQQVNTX0JPT1QpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgKCBDT05GSUdfQ09NTUFORFMxIHwgQ09ORklHX0NPTU1BTkRTMiB8IENGR19DTURfREhDUCkKLSNlbGlmIChCRklOX0JPT1RfTU9ERSA9PSBCRjUzM19TUElfQk9PVCkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAoIENPTkZJR19DT01NQU5EUzEgfCBDT05GSUdfQ09NTUFORFMyKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisKKyNpZiAoQ09ORklHX0RSSVZFUl9TTUM5MTExMSkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCiAjZW5kaWYKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIChDT05GSUdfU09GVF9JMkMpCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZW5kaWYKKworI2lmIChCRklOX0JPT1RfTU9ERSA9PSBCRjUzM19CWVBBU1NfQk9PVCkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZW5kaWYKKwogCiAvKgogICogQ29uc29sZSBzZXR0aW5ncwpAQCAtMzQ1LDcgKzM0Nyw3IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC0zOTUsNyArMzk3LDcgQEAKIC8qIEVuYWJsZWQgYmVsb3cgb3B0aW9uIGZvciBDRiBzdXBwb3J0ICovCiAvKiAjZGVmaW5lIENPTkZJR19TVEFNUF9DRgkxICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TVEFNUF9DRikgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX1NUQU1QX0NGKSAmJiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgkxCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9iZjUzNy1zdGFtcC5oIGIvaW5jbHVkZS9jb25maWdzL2JmNTM3LXN0YW1wLmgKaW5kZXggZjY3NTVhYy4uYjlhOWUzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2JmNTM3LXN0YW1wLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2JmNTM3LXN0YW1wLmgKQEAgLTE0NCwxMSArMTQ0LDggQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BPU1QKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcJQ0ZHX0NNRF9ESUFHCiAjZGVmaW5lIEZMQVNIX1NUQVJUX1BPU1RfQkxPQ0sJMTEJLyogU2hvdWxkID4gPSAxMSAqLwogI2RlZmluZSBGTEFTSF9FTkRfUE9TVF9CTE9DSwk3MQkvKiBTaG91bGQgPCA9IDcxICovCi0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRwkwCiAjZW5kaWYKIAogLyogQ0YtQ0FSRCBJREUtSEREIFN1cHBvcnQgKi8KQEAgLTE1OSw1MSArMTU2LDY1IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0NGX0lERSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9IRERfSURFKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1RSVUVfSURFKQogIyBkZWZpbmUgQ09ORklHX0JGSU5fSURFCTEKLSMgZGVmaW5lIEFERF9JREVfQ01ECQlDRkdfQ01EX0lERQotI2Vsc2UKLSMgZGVmaW5lIEFERF9JREVfQ01ECQkwCiAjZW5kaWYKIAogLyojZGVmaW5lIENPTkZJR19CRjUzN19OQU5EICovCQkvKiBBZGQgbmFuZCBmbGFzaCBzdXBwb3J0ICovCiAKLSNpZmRlZiBDT05GSUdfQkY1MzdfTkFORAotIyBkZWZpbmUgQUREX05BTkRfQ01ECQlDRkdfQ01EX05BTkQKLSNlbHNlCi0jIGRlZmluZSBBRERfTkFORF9DTUQJCTAKLSNlbmRpZgotCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCTEKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCiAKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfQllQQVNTX0JPT1QpIHx8IChCRklOX0JPT1RfTU9ERSA9PSBCRjUzN19TUElfTUFTVEVSX0JPT1QpCisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAjaWYgKEJGSU5fQ1BVID09IEFEU1BfQkY1MzQpCi0jZGVmaW5lIENPTkZJR19CRklOX0NNRAkJKENPTkZJR19DTURfREZMICYgfkNGR19DTURfTkVUKQorI3VuZGVmIENPTkZJR19DTURfTkVUCiAjZWxzZQotI2RlZmluZSBDT05GSUdfQkZJTl9DTUQJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fQ0ZfSURFKSBcCisJfHwgZGVmaW5lZChDT05GSUdfQkZJTl9IRERfSURFKSBcCisJfHwgZGVmaW5lZChDT05GSUdfQkZJTl9UUlVFX0lERSkKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNlbmRpZgorCiAjZW5kaWYKIAogI2lmIChCRklOX0JPT1RfTU9ERSA9PSBCRjUzN19CWVBBU1NfQk9PVCkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0JGSU5fQ01EfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9DQUNIRSAgfCBcCi0JCQkJIENGR19DTURfSkZGUzIJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NIHwgXAotCQkJCSBDRkdfQ01EX0RIQ1AgICB8IFwKLQkJCQkgQUREX0lERV9DTUQJfCBcCi0JCQkJIEFERF9OQU5EX0NNRAl8IFwKLQkJCQkgQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJIENGR19DTURfREFURSkKLSNlbGlmIChCRklOX0JPT1RfTU9ERSA9PSBCRjUzN19TUElfTUFTVEVSX0JPT1QpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19CRklOX0NNRHwgXAotCQkJCSBDRkdfQ01EX0VMRgl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUgIHwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQUREX0lERV9DTUQJfCBcCi0JCQkJIENGR19DTURfREFURSkKKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworI2lmIGRlZmluZWQoQ09ORklHX1BPU1QpCisjZGVmaW5lIENPTkZJR19DTURfRElBRwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQkY1MzdfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNlbmRpZgorCisjZW5kaWYKKworCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAicm9vdD0vZGV2L210ZGJsb2NrMCBydyBjb25zb2xlPXR0eUJGMCw1NzYwMCIKICNkZWZpbmUgQ09ORklHX0xPQURBRERSCTB4MTAwMDAwMAogCkBAIC0yNTYsOSArMjY3LDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2lmIChCRklOX0JPT1RfTU9ERSA9PSBCRjUzN19TUElfTUFTVEVSX0JPT1QpCiAjaWYgKEJGSU5fQ1BVID09IEFEU1BfQkY1MzQpCiAjZGVmaW5lCUNGR19QUk9NUFQJCSJzZXJpYWxfYmY1MzQ+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwpAQCAtMjc3LDcgKzI4NSw3IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYmY1NjEtZXpraXQuaCBiL2luY2x1ZGUvY29uZmlncy9iZjU2MS1lemtpdC5oCmluZGV4IDhkODI2ZmEuLjI5NjYyNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9iZjU2MS1lemtpdC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9iZjU2MS1lemtpdC5oCkBAIC0xNjQsMTIgKzE2NCw2IEBACiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazAgcncgY29uc29sZT10dHlCRjAsNTc2MDAiCiAKICNpZiAoQ09ORklHX0RSSVZFUl9TTUM5MTExMSkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTMQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfUElORwl8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUJfCBcCi0JCQkJIENGR19DTURfSkZGUzIJfCBcCi0JCQkJIENGR19DTURfREhDUCkKICNkZWZpbmUgQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUyBcCiAJInJhbWFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9tdGRibG9jazAgcncgY29uc29sZT10dHlCRjAsNTc2MDBcMCIgCQlcCiAJIm5mc2FyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgbmZzcm9vdD0kKHNlcnZlcmlwKToiCVwKQEAgLTE4NiwyMCArMTgwLDM2IEBACiAJCSJjcC5iICQobG9hZGFkZHIpIDB4MjAwMDAwMDAgJChmaWxlc2l6ZSlcMCIgXAogCSIiCiAjZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMxCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUJfCBcCi0JCQkJIENGR19DTURfSkZGUzIpCiAjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MgXAogCSJyYW1hcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbXRkYmxvY2swIHJ3IGNvbnNvbGU9dHR5QkYwLDU3NjAwXDAiCQlcCiAJImZsYXNoYm9vdD1ib290bSAweDIwMTAwMDAwXDAiCQkJCQlcCiAJIiIKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoIENPTkZJR19DT01NQU5EUzEgfCBDT05GSUdfQ09NTUFORFMyICkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKworI2lmIGRlZmluZWQoQ09ORklHX0RSSVZFUl9TTUM5MTExMSkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2VuZGlmCisKIAogLyoKICAqIENvbnNvbGUgc2V0dGluZ3MKQEAgLTIwOCw3ICsyMTgsNyBAQAogCiAjZGVmaW5lCUNGR19QUk9NUFQJCSJlemtpdD4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2J1YmluZ2EuaCBiL2luY2x1ZGUvY29uZmlncy9idWJpbmdhLmgKaW5kZXggMTBjNDgxNDMuLjc3MzZhMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9idWJpbmdhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2J1YmluZ2EuaApAQCAtMTM3LDI1ICsxMzcsMzcgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX0RTMTc0eAkxCS8qIHVzZSBEUzE3NDMgUlRDIGluIEJ1YmluZ2EJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTE2Niw3ICsxNzgsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTksNyArMjMxLDcgQEAKICNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7IDB4NjkgfQkvKiBhdm9pZCBpcHJvYmUgaGFuZ3VwICh3aHk/KSAqLwogI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMJNgkvKiAyNEMwMiByZXF1aXJlcyA1bXMgZGVsYXkgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VFUFJPTSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRUVQUk9NKQogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCTB4NTAJLyogSTJDIGJvb3QgRUVQUk9NICgyNEMwMlcpCSovCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KICNlbmRpZgpAQCAtMzE0LDcgKzMyNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDVFUCBDUFUJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MjYsNyArNDM4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jMm1vbi5oIGIvaW5jbHVkZS9jb25maWdzL2MybW9uLmgKaW5kZXggYWU3NTUzOS4uYTlhNTI1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2MybW9uLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2MybW9uLmgKQEAgLTY4LDcgKzY4LDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtNzcsMTUgKzg1LDE4IEBACiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC05OCw3ICsxMDksNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNzQsNyArMTg1LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2Nhbm1iLmggYi9pbmNsdWRlL2NvbmZpZ3MvY2FubWIuaAppbmRleCBlYzZkNTdlLi5kNTc3Yjk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY2FubWIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY2FubWIuaApAQCAtMzgsMTEgKzM4LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX1IKIAogLyoKQEAgLTUyLDIxICs0NywzMCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAkvKiAuLi4gYXQgMTE1MjAwIGJwcyAqLwogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCB9CiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkgCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1VU1QgYmUgbG93IGJvb3QgLSBISUdIQk9PVCBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUKQEAgLTE4MSw3ICsxODUsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTE5OSw2ICsyMDMsMTEgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX01QQzUyMDAJMQkvKiB1c2UgaW50ZXJuYWwgTVBDNTIwMCBSVEMgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY2VyZjI1MC5oIGIvaW5jbHVkZS9jb25maWdzL2NlcmYyNTAuaAppbmRleCA2OTk3YzdhLi5lMDY3MzVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY2VyZjI1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jZXJmMjUwLmgKQEAgLTYxLDEwICs2MSwyMSBAQAogCiAvKiBhbGxvdyB0byBvdmVyd3JpdGUgc2VyaWFsIGFuZCBldGhhZGRyICovCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwMDpEMDpDQTpGMTozQzpEMgpAQCAtNzUsNyArODYsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvbXRkYmxvY2szIHJvb3Rmc3R5cGU9amZmczIgY29uc29sZT10dHlTMCwzODQwMCIKICNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY200MDA4LmggYi9pbmNsdWRlL2NvbmZpZ3MvY200MDA4LmgKaW5kZXggNTk0N2MyYS4uYWU0MGIzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NtNDAwOC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jbTQwMDguaApAQCAtNTgsMTAgKzU4LDIzIEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLSN1bmRlZiBDT05GSUdfQ09NTUFORFMKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTk9OU1REIHwgQ0ZHX0NNRF9FTlYpKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9FTlYKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJtZW09MTZNIGNvbnNvbGU9dHR5QU0wLDExNTIwMCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbTQxeHguaCBiL2luY2x1ZGUvY29uZmlncy9jbTQxeHguaAppbmRleCBlNjJmYzA2Li5jMWRkMzNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY200MXh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtNDF4eC5oCkBAIC01OCwxMCArNTgsMjMgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotI3VuZGVmIENPTkZJR19DT01NQU5EUwotI2RlZmluZQlDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9OT05TVEQgfCBDRkdfQ01EX0VOVikpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0VOVgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkwCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJIm1lbT0zMk0gY29uc29sZT10dHlBTTAsMTE1MjAwIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NtNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL2NtNTIwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTQzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY201MjAwLmgKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfTVBDNXh4eAkJMQkvKiBUaGlzIGlzIGFuIE1QQzV4eHggQ1BVICovCisjZGVmaW5lIENPTkZJR19NUEM1MjAwCQkxCS8qIChtb3JlIHByZWNpc2VseSBhbiBNUEM1MjAwIENQVSkgKi8KKyNkZWZpbmUgQ09ORklHX0NNNTIwMAkJMQkvKiAuLi4gb24gQ001MjAwIHBsYXRmb3JtICovCisKKy8qCisgKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworLyoKKyAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfUFNDX0NPTlNPTEUJMQkvKiBjb25zb2xlIGlzIG9uIFBTQzEgKi8KKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk1NzYwMAkvKiAuLi4gYXQgNTc2MDAgYnBzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwIH0KKyNkZWZpbmUgQ09ORklHX1NJTEVOVF9DT05TT0xFCTEJLyogbmVlZGVkIHRvIHNpbGVuY2UgaTJjX2luaXQoKSAqLworCisvKgorICogRXRoZXJuZXQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19NUEM1eHh4X0ZFQwkxCisjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMHgwMAorI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCS8qIGFsbG93IG92ZXJ3cml0aW5nIG9mIGV0aGFkZHIgKi8KKy8qIHVzZSBtaXNjX2luaXRfcigpIHRvIHJlYWQgZXRoYWRkciBmcm9tIEkyQyBFRVBST00gKHNlZSBDRkdfSTJDX0VFUFJPTSkgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEKKyNkZWZpbmUgQ09ORklHX01BQ19PRkZTRVQJMHgzNQkvKiBNQUMgYWRkcmVzcyBvZmZzZXQgaW4gSTJDIEVFUFJPTSAqLworCisvKgorICogUE9TVCBzdXBwb3J0CisgKi8KKyNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9NRU1PUlkgfCBDRkdfUE9TVF9DUFUgfCBDRkdfUE9TVF9JMkMpCisjZGVmaW5lIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUJKE1QQzVYWFhfU1JBTV9TSVpFIC0gNCkKKy8qIExpc3Qgb2YgSTJDIGFkZHJlc3NlcyB0byBiZSB2ZXJpZmllZCBieSBQT1NUICovCisjZGVmaW5lIEkyQ19BRERSX0xJU1QJCXsgQ0ZHX0kyQ19TTEFWRSwgQ0ZHX0kyQ19JTywgQ0ZHX0kyQ19FRVBST00gfQorCisvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KKyNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAkxCisKKy8qCisgKiBBdXRvYm9vdGluZworICovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMgKi8KKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87IiBcCisJImVjaG8gVHlwZSBcInJ1biBuZXRfbmZzX2ZkdFwiIHRvIG1vdW50IHJvb3QgZmlsZXN5c3RlbSBvdmVyIE5GUzsiIFwKKwkiZWNobyIKKyN1bmRlZiBDT05GSUdfQk9PVEFSR1MKKworLyoKKyAqIERlZmF1bHQgZW52aXJvbm1lbnQgc2V0dGluZ3MKKyAqLworI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCisJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKKwkibmV0bWFzaz0yNTUuMjU1LjAuMFwwIgkJCQkJCVwKKwkiaXBhZGRyPTE5Mi4xNjguMTYwLjMzXDAiCQkJCQlcCisJInNlcnZlcmlwPTE5Mi4xNjguMS4xXDAiCQkJCQlcCisJImdhdGV3YXlpcD0xOTIuMTY4LjEuMVwwIgkJCQkJXAorCSJjb25zb2xlPXR0eVBTQzBcMCIJCQkJCQlcCisJInUtYm9vdF9hZGRyPTEwMDAwMFwwIgkJCQkJCVwKKwkia2VybmVsX2FkZHI9MjAwMDAwXDAiCQkJCQkJXAorCSJrZXJuZWxfYWRkcl9mbGFzaD1mYzBjMDAwMFwwIgkJCQkJXAorCSJmZHRfYWRkcj00MDAwMDBcMCIJCQkJCQlcCisJImZkdF9hZGRyX2ZsYXNoPWZjMGEwMDAwXDAiCQkJCQlcCisJInJhbWRpc2tfYWRkcj01MDAwMDBcMCIJCQkJCQlcCisJInJvb3RwYXRoPS9vcHQvZWxkay00LjEvcHBjXzZ4eFwwIgkJCQlcCisJInUtYm9vdD0vdGZ0cGJvb3QvY201MjAwL3UtYm9vdC5iaW5cMCIJCQkJXAorCSJib290ZmlsZV9mZHQ9L3RmdHBib290L2NtNTIwMC91SW1hZ2VcMCIJCQlcCisJImZkdF9maWxlPS90ZnRwYm9vdC9jbTUyMDAvY201MjAwLmR0YlwwIgkJCVwKKwkibG9hZD10ZnRwICR7dS1ib290X2FkZHJ9ICR7dS1ib290fVwwIgkJCQlcCisJInVwZGF0ZT1wcm90IG9mZiBmYzAwMDAwMCArJHtmaWxlc2l6ZX07ICIJCQlcCisJCSJlcmEgZmMwMDAwMDAgKyR7ZmlsZXNpemV9OyAiCQkJCVwKKwkJImNwLmIgJHt1LWJvb3RfYWRkcn0gZmMwMDAwMDAgJHtmaWxlc2l6ZX07ICIJCVwKKwkJInByb3Qgb24gZmMwMDAwMDAgKyR7ZmlsZXNpemV9XDAiCQkJXAorCSJuZnNhcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQlcCisJCSJuZnNyb290PSR7c2VydmVyaXB9OiR7cm9vdHBhdGh9XDAiCQkJXAorCSJmbGFzaGFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9tdGRibG9jazUgcndcMCIJCVwKKwkiYWRkbXRkPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAke210ZHBhcnRzfVwwIgkJXAorCSJhZGRpbml0PXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSBpbml0PS9saW51eHJjXDAiCQlcCisJImFkZGNvbnM9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAorCQkiY29uc29sZT0ke2NvbnNvbGV9LCR7YmF1ZHJhdGV9XDAiCQkJXAorCSJhZGRpcD1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gIgkJCQlcCisJCSJpcD0ke2lwYWRkcn06JHtzZXJ2ZXJpcH06JHtnYXRld2F5aXB9OiIJCVwKKwkJIiR7bmV0bWFza306JHtob3N0bmFtZX06JHtuZXRkZXZ9Om9mZiBwYW5pYz0xXDAiCVwKKwkiZmxhc2hfZmxhc2g9cnVuIGZsYXNoYXJncyBhZGRpbml0IGFkZGlwIGFkZGNvbnM7IgkJXAorCQkiYm9vdG0gJHtrZXJuZWxfYWRkcl9mbGFzaH0gLSAke2ZkdF9hZGRyX2ZsYXNofVwwIglcCisJIm5ldF9uZnNfZmR0PXRmdHAgJHtrZXJuZWxfYWRkcn0gJHtib290ZmlsZV9mZHR9OyAiCQlcCisJCSJ0ZnRwICR7ZmR0X2FkZHJ9ICR7ZmR0X2ZpbGV9OyBydW4gbmZzYXJncyBhZGRpcCAiCVwKKwkJImFkZGNvbnM7IGJvb3RtICR7a2VybmVsX2FkZHJ9IC0gJHtmZHRfYWRkcn1cMCIJCVwKKwkiIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9mbGFzaCIKKworLyoKKyAqIExvdyBsZXZlbCBjb25maWd1cmF0aW9uCisgKi8KKworLyoKKyAqIENsb2NrIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfTVBDNVhYWF9DTEtJTgkzMzAwMDAwMAkvKiBTWVNfWFRBTF9JTiA9IDMzTUh6ICovCisjZGVmaW5lIENGR19JUEJDTEtfRVFVQUxTX1hMQkNMSwkxCS8qIElQQiA9IDEzM01IeiAqLworCisvKgorICogTWVtb3J5IG1hcAorICovCisjZGVmaW5lIENGR19NQkFSCQkweEYwMDAwMDAwCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19ERUZBVUxUX01CQVIJMHg4MDAwMDAwMAorCisjZGVmaW5lIENGR19MT1dCT09UCQkxCisKKy8qIFVzZSBPTi1DaGlwIFNSQU0gdW50aWwgUkFNIHdpbGwgYmUgYXZhaWxhYmxlICovCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCU1QQzVYWFhfU1JBTQorI2lmZGVmIENPTkZJR19QT1NUCisvKiBwcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHBvc3Rfd29yZCBhdCBlbmQgb2Ygb24tY2hpcCBTUkFNICovCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJTVBDNVhYWF9TUkFNX1BPU1RfU0laRQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAlNUEM1WFhYX1NSQU1fU0laRQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgZm9yIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENPTkZJR19CT0FSRF9UWVBFUwkxCS8qIHdlIHVzZSBib2FyZF90eXBlICovCisKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgzODQgPDwgMTApCS8qIDM4NCBrQiBmb3IgTW9uaXRvciAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDI1NiA8PCAxMCkJLyogMjU2IGtCIGZvciBtYWxsb2MoKSAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogaW5pdGlhbCBtZW0gbWFwIGZvciBMaW51eCAqLworCisvKgorICogRmxhc2ggY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19GTEFTSF9DRkkJCTEKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIJMQorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhmYzAwMDAwMAorLyogd2UgbmVlZCB0aGVzZSBkZXNwaXRlIHVzaW5nIENGSSAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bSBvZiBmbGFzaCBiYW5rcyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CS8qIG1heCBudW0gb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJMHgwMjAwMDAwMCAvKiAzMiBNaUIgKi8KKworCisjaWYgKENGR19NT05JVE9SX0JBU0UgPCBDRkdfRkxBU0hfQkFTRSkKKyNkZWZpbmUgQ0ZHX1JBTUJPT1QJCTEKKyN1bmRlZiBDRkdfTE9XQk9PVAorI2VuZGlmCisKKworLyoKKyAqIENoaXAgc2VsZWN0cyBjb25maWd1cmF0aW9uCisgKi8KKy8qIEJvb3QgQ2hpcHNlbGVjdCAqLworI2RlZmluZSBDRkdfQk9PVENTX1NUQVJUCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19CT09UQ1NfU0laRQkJQ0ZHX0ZMQVNIX1NJWkUKKyNkZWZpbmUgQ0ZHX0JPT1RDU19DRkcJCTB4MDAwODdEMzEJLyogZm9yIHBjaV9jbGsgPSAzMyBNSHogKi8KKy8qIHVzZSBib2FyZF9lYXJseV9pbml0X3IgdG8gZW5hYmxlIGZsYXNoIHdyaXRlIGluIENTX0JPT1QgKi8KKyNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfUgorCisvKiBGbGFzaCBtZW1vcnkgYWRkcmVzc2luZyAqLworI2RlZmluZSBDRkdfQ1MwX1NUQVJUCQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfQ1MwX1NJWkUJCUNGR19GTEFTSF9TSVpFCisKKy8qIE5vIGJ1cnN0LCBkZWFkIGN5Y2xlID0gMSBmb3IgQ1MwIChGbGFzaCkgKi8KKyNkZWZpbmUgQ0ZHX0NTX0JVUlNUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19DU19ERUFEQ1lDTEUJMHgwMDAwMDAwMQorCisvKgorICogU0RSQU0gY29uZmlndXJhdGlvbgorICogc2V0dGluZ3MgZm9yIGs0czU2MTYzMkUteHg3NSwgYXNzdW1pbmcgWExCID0gMTMyIE1IegorICovCisjZGVmaW5lIFNEUkFNX01PREUJMHgwMENEMDAwMAkvKiBDQVNMIDMsIGJ1cnN0IGxlbmd0aCA4ICovCisjZGVmaW5lIFNEUkFNX0NPTlRST0wJMHg1MTRGMDAwMAorI2RlZmluZSBTRFJBTV9DT05GSUcxCTB4RTIzMzM5MDAKKyNkZWZpbmUgU0RSQU1fQ09ORklHMgkweDhFRTcwMDAwCisKKy8qCisgKiBNVEQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCTEKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWNtNTIwMC0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1jbTUyMDAtMDoiCQkJXAorCQkJCQkiMzg0ayh1Ym9vdCksMTI4ayhlbnYpLCIJXAorCQkJCQkiMTI4ayhyZWR1bmRfZW52KSwxMjhrKGR0YiksIglcCisJCQkJCSIybShrZXJuZWwpLDI3OTA0ayhyb290ZnMpLCIJXAorCQkJCQkiLShjb25maWcpIgorCisvKgorICogSTJDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCTEJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAqLworI2RlZmluZSBDRkdfSTJDX01PRFVMRQkJMgkvKiBTZWxlY3QgSTJDIG1vZHVsZSAjMiAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMAkvKiA0MCBrSHogKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHgwCisjZGVmaW5lIENGR19JMkNfSU8JCTB4MzgJLyogUENBOTU1NEFEIEkyQyBJL08gcG9ydCBhZGRyZXNzICovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NCQkweDUzCS8qIEkyQyBFRVBST00gZGV2aWNlIGFkZHJlc3MgKi8KKworLyoKKyAqIFJUQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1JUQ19NUEM1MjAwCTEJLyogdXNlIGludGVybmFsIE1QQzUyMDAgUlRDICovCisKKy8qCisgKiBVU0IgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSQkJMQorI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UJMQorI2RlZmluZSBDT05GSUdfVVNCX0NMT0NLCTB4MDAwMUJCQkIKKyNkZWZpbmUgQ09ORklHX1VTQl9DT05GSUcJMHgwMDAwMTAwMAorLyogUGFydGl0aW9ucyAoZm9yIFVTQikgKi8KKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04JMQorI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCisjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCTEKKworLyoKKyAqIEludm9rZSBvdXIgbGFzdF9zdGFnZV9pbml0IGZ1bmN0aW9uIC0gbmVlZGVkIGJ5IGZ3dXBkYXRlCisgKi8KKyNkZWZpbmUgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAkxCisKKy8qCisgKiBFbnZpcm9ubWVudCBzZXR0aW5ncworICovCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MTAwMDAKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgyMDAwMAorI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfRkxBU0hfQkFTRSArIENGR19NT05JVE9SX0xFTikKKy8qIENvbmZpZ3VyYXRpb24gb2YgcmVkdW5kYW50IGVudmlyb25tZW50ICovCisjZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJKENGR19FTlZfQUREUiArIENGR19FTlZfU0VDVF9TSVpFKQorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECShDRkdfRU5WX1NJWkUpCisKKy8qCisgKiBQaW4gbXVsdGlwbGV4aW5nIGNvbmZpZ3VyYXRpb24KKyAqLworCisvKgorICogQ1MxL0dQSU9fV0tVUF82OiBHUElPIChkZWZhdWx0KQorICogQUxUczogQ0FOMSBvbiBJMkMxLCBDQU4yIG9uIFRJTUVSMC8xCisgKiBJUkRBL1BTQzY6IFVBUlQKKyAqIEV0aGVyOiBFdGhlcm5ldCAxMDBNYml0IHdpdGggTUQKKyAqIFBDSV9ESVM6IFBDSSBjb250cm9sbGVyIGRpc2FibGVkCisgKiBVU0I6IFVTQgorICogUFNDMzogU1BJIHdpdGggVUFSVDMKKyAqIFBTQzI6IFVBUlQKKyAqIFBTQzE6IFVBUlQKKyAqLworI2RlZmluZSBDRkdfR1BTX1BPUlRfQ09ORklHCTB4MTA1NTlDNDQKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCTEJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUgKi8KKworI2RlZmluZSBDRkdfQUxUX01FTVRFU1QJCTEKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDEwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uICovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwM2YwMDAwMAkvKiAxIC4uIDYzIE1pQiBpbiBTRFJBTSAqLworCisjZGVmaW5lIENPTkZJR19MT09QVwkJMQorCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MTAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLworCisvKgorICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKKyAqLworI2RlZmluZSBDRkdfSElEMF9JTklUCQlISUQwX0lDRSB8IEhJRDBfSUNGSQorI2RlZmluZSBDRkdfSElEMF9GSU5BTAkJSElEMF9JQ0UKKworI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCisKKyNkZWZpbmUgQ0ZHX1hMQl9QSVBFTElOSU5HCTEJLyogZW5hYmxlIHRyYW5zYWN0aW9uIHBpcGVsaW5nICovCisKKy8qCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKworLyoKKyAqIEZsYXQgRGV2aWNlIFRyZWUgc3VwcG9ydAorICovCisjZGVmaW5lIENPTkZJR19PRl9MSUJGRFQJMQorI2RlZmluZSBDT05GSUdfT0ZfQk9BUkRfU0VUVVAJMQorI2RlZmluZSBPRl9DUFUJCQkiUG93ZXJQQyw1MjAwQDAiCisjZGVmaW5lIE9GX1NPQwkJCSJzb2M1MjAwQGYwMDAwMDAwIgorI2RlZmluZSBPRl9UQkNMSwkJKGJkLT5iaV9idXNmcmVxIC8gNCkKKyNkZWZpbmUgT0ZfU1RET1VUX1BBVEgJCSIvc29jNTIwMEBmMDAwMDAwMC9zZXJpYWxAMjAwMCIKKworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbWNfcHUyLmggYi9pbmNsdWRlL2NvbmZpZ3MvY21jX3B1Mi5oCmluZGV4IDU3MmE3MGYuLmYzMmM4YzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jbWNfcHUyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtY19wdTIuaApAQCAtMTA0LDM1ICsxMDQsNDQgQEAKICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDEKICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAogI2VuZGlmCiAvKiBzdGlsbCBhYm91dCAyMCBrQiBmcmVlIHdpdGggdGhpcyBkZWZpbmVkICovCiAjZGVmaW5lIENGR19MT05HSEVMUAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAxCiAKLSNpZmRlZiBDT05GSUdfSEFSRF9JMkMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCSAgICAgICAoKENPTkZJR19DTURfREZMCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQIAl8IFwKLQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX05GUwl8IFwKLQkJCUNGR19DTURfU05UUCAgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0ZQR0EgfCBDRkdfQ01EX01JU0MpICkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCUNGR19DTURfREhDUCAJfCBcCi0JCQlDRkdfQ01EX05GUwl8IFwKLQkJCUNGR19DTURfU05UUCAgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0ZQR0EgfCBDRkdfQ01EX01JU0MpICkKLSNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAotI2VuZGlmCi0jZGVmaW5lIENGR19MT05HSEVMUAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfTUlTQworCisjaWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2VuZGlmCisKKworI2RlZmluZSBDRkdfTE9OR0hFTFAKIAogI2RlZmluZSBBVDkxX1NNQVJUX01FRElBX0FMRQkoMSA8PCAyMikJLyogb3VyIEFMRSBpcyBBRDIyICovCiAjZGVmaW5lIEFUOTFfU01BUlRfTUVESUFfQ0xFCSgxIDw8IDIxKQkvKiBvdXIgQ0xFIGlzIEFEMjEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbWlfbXBjNXh4LmggYi9pbmNsdWRlL2NvbmZpZ3MvY21pX21wYzV4eC5oCmluZGV4IGU0NTk5MTkuLmNkOTJhZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jbWlfbXBjNXh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtaV9tcGM1eHguaApAQCAtNDQsMTMgKzQ0LDMzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk1NzYwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfTUVNT1JZIHwgQ0ZHX0NNRF9MT0FEQiB8IENGR19DTURfUkVHSU5GTyB8IAkJXAotCQkJCSBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfQVNLRU5WIHwgICAJCVwKLQkJCQkgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0NPTlNPTEUgfCBDRkdfQ01EX0VOViB8IENGR19DTURfUlVOIHwJXAotCQkJCSBDRkdfQ01EX0lNSSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisKIAogI2lmIDAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQkJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCQkqLwpAQCAtNzMsNyArOTMsNyBAQAogCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NvYnJhNTI3Mi5oIGIvaW5jbHVkZS9jb25maWdzL2NvYnJhNTI3Mi5oCmluZGV4IDkwMzNmYTguLjUxMDUyNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jb2JyYTUyNzIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY29icmE1MjcyLmgKQEAgLTEzMCwxNiArMTMwLDI3IEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLS8qIC0tLQotICogRGVmaW5lIHdoaWNoIGNvbW1tYW5kcyBzaG91bGQgYmUgYXZhaWxhYmxlIGF0IHUtYm9vdCBjb21tYW5kIHByb21wdAotICogLS0tCisKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAoIENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HICYgfihDRkdfQ01EX0xPQURTIHwgXAotQ0ZHX0NNRF9MT0FEQikgfCBDRkdfQ01EX01JSSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorI3VuZGVmIENPTkZJR19DTURfTUlJCisKIAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE4NCw3ICsxOTUsNyBAQAogCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCmluZGV4IGFlYTJlNjQuLjg0ZDUwYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCkBAIC03MSw4ICs3MSw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQwkqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MJKi8KQEAgLTg4LDEwICs4NywyNSBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0tHREIpJn5DRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0tHREIKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCkBAIC0xMDIsNyArMTE2LDcgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvcmFtIHJ3IgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ09ORklHX0tHREJfT05fU01DCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTTUMgKi8KICN1bmRlZglDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xMjQsNyArMTM4LDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjU2LDcgKzI3MCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzh4eC5oIGIvaW5jbHVkZS9jb25maWdzL2NvZ2VudF9tcGM4eHguaAppbmRleCA4MDk2MmQzLi5jZTM4YWYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzh4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjOHh4LmgKQEAgLTU5LDEwICs1OSwyNSBAQAogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0tHREIgfCBDRkdfQ01EX0kyQykgJiB+Q0ZHX0NNRF9ORVQpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfS0dEQgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKwogCiAjaWYgMAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCS0xCS8qIGF1dG9ib290IGRpc2FibGVkCQkqLwpAQCAtNzMsNyArODgsNyBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9yYW0gcnciCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjdW5kZWYJQ09ORklHX0tHREJfT05fU0NDCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTQ0MgKi8KICNkZWZpbmUJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTg4LDcgKzEwMyw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwMCw3ICsyMTUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3BjaTUyMDAuaCBiL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCmluZGV4IGY1ZWZjZDkuLmNlNGVhMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCkBAIC01MCwxMSArNTAsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTkyLDEyICs4Nyw2IEBACiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAjZW5kaWYKIAotI2RlZmluZSBBRERfUENJX0NNRAkJQ0ZHX0NNRF9QQ0kKLQotI2Vsc2UJCQkJLyogTVBDNTEwMCAqLwotCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQkwCS8qIG5vIENGR19DTURfUENJICovCi0KICNlbmRpZgogCiAvKiBQYXJ0aXRpb25zICovCkBAIC0xMDcsMjggKzk2LDM1IEBACiAvKiBVU0IgKi8KICNpZiAwCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRAkJQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01ECQkwCiAjZW5kaWYKIAogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0VYVDIJfCBcCi0JCQkJIENGR19DTURfREFURQl8IFwKLQkJCQkgQUREX1BDSV9DTUQJICApCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfREFURQogCiAjaWYgKFRFWFRfQkFTRSA9PSAweEZGMDAwMDAwKQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCQkxCkBAIC0yNzcsNyArMjczLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjk1LDYgKzI5MSwxMSBAQAogCiAjZGVmaW5lIENGR19WWFdPUktTX01BQ19QVFIJMHgwMDAwMDAwMAkvKiBQYXNzIEV0aGVybmV0IE1BQyB0byBWeFdvcmtzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NyYWRsZS5oIGIvaW5jbHVkZS9jb25maWdzL2NyYWRsZS5oCmluZGV4IDc3NmUxZDIuLmViOTNhOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jcmFkbGUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY3JhZGxlLmgKQEAgLTYxLDEwICs2MSwyMSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgIDExNTIwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgIChDT05GSUdfQ01EX0RGTCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAgIDMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgICAgICAgInJvb3Q9L2Rldi9tdGRibG9jazIgY29uc29sZT10dHlTMCwxMTUyMDAiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiMjI2LmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiMjI2LmgKaW5kZXggZjA0MTAyZS4uMGJlMGYyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjIyNi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2IyMjYuaApAQCAtNTcsMTAgKzU3LDM0IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTkyMDAKICN1bmRlZiAgQ09ORklHX01JU0NfSU5JVF9SCQkvKiBub3QgdXNlZCB5ZXQgICAgICAgICAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9CREl8Q0ZHX0NNRF9MT0FEQnxDRkdfQ01EX0lNSXxDRkdfQ01EX0ZMQVNIfENGR19DTURfTUVNT1JZfENGR19DTURfTkVUfENGR19DTURfRU5WfENGR19DTURfUlVOfENGR19DTURfQVNLRU5WfENGR19DTURfRUNIT3xDRkdfQ01EX0RIQ1B8Q0ZHX0NNRF9DQUNIRSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkiY29uc29sZT10dHlTMCwxOTIwMCBpcD0xOTIuMTY4LjEuMTAsMTkyLjE2OC4xLjUsLDI1NSwyNTUsMjU1LDAsY3NiIHJvb3Q9L2Rldi9uZnMsIGV0aGVyPTAsMHgwODAwMDAwMCxldGgwIgpAQCAtNzMsNyArOTcsNyBAQAogCiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkxCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxOTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiMjcyLmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiMjcyLmgKaW5kZXggMjdkNjRjMS4uYzQzYjQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjI3Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2IyNzIuaApAQCAtNzMsMzAgKzczLDMyIEBACiAjZW5kaWYKIAogLyoKLSAqIEJPT1RQL0RIQ1AgcHJvdG9jb2wgY29uZmlndXJhdGlvbgotICoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoIENPTkZJR19CT09UUF9ERUZBVUxUCQl8IFwKLQkJCQkgIENPTkZJR19CT09UUF9ETlMyCQl8IFwKLQkJCQkgIENPTkZJR19CT09UUF9CT09URklMRVNJWkUJKQotLyoKLSAqIFUtQm9vdCBNb25pdG9yIENvbW1hbmQgTGluZSBGdW5jdGlvbnMgQ29uZmlndXJhdGlvbgotICoKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQkgIENGR19DTURfQkVEQlVHCXwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYJCXwgXAotCQkJCSAgQ0ZHX0NNRF9JUlEJCXwgXAotCQkJCSAgQ0ZHX0NNRF9JMkMJCXwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kJCXwgXAotCQkJCSAgQ0ZHX0NNRF9EQVRFCQl8IFwKLQkJCQkgIENGR19DTURfTUlJCQl8IFwKLQkJCQkgIENGR19DTURfUElORwkJfCBcCi0JCQkJICBDRkdfQ01EX0RIQ1AJCSApCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKIAogLyoKICAqIFNlcmlhbCBkb3dubG9hZCBjb25maWd1cmF0aW9uCkBAIC0xMDksNyArMTExLDcgQEAKICAqIEtHREIgQ29uZmlndXJhdGlvbgogICoKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtMTI1LDcgKzEyNyw3IEBACiAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NzYjQ3Mi5oIGIvaW5jbHVkZS9jb25maWdzL2NzYjQ3Mi5oCmluZGV4IDA5ZDUyZGUuLmE3MTIwYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jc2I0NzIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY3NiNDcyLmgKQEAgLTczLDMwICs3MywzMSBAQAogI2VuZGlmCiAKIC8qCi0gKiBCT09UUC9ESENQIHByb3RvY29sIGNvbmZpZ3VyYXRpb24KLSAqCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKCBDT05GSUdfQk9PVFBfREVGQVVMVAkJfCBcCi0JCQkJICBDT05GSUdfQk9PVFBfRE5TMgkJfCBcCi0JCQkJICBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCSkKLS8qCi0gKiBVLUJvb3QgTW9uaXRvciBDb21tYW5kIExpbmUgRnVuY3Rpb25zIENvbmZpZ3VyYXRpb24KLSAqCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENPTkZJR19DTURfREZMCXwgXAotCQkJCSAgQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJICBDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQkgIENGR19DTURfRUxGCQl8IFwKLQkJCQkgIENGR19DTURfSVJRCQl8IFwKLQkJCQkgIENGR19DTURfSTJDCQl8IFwKLQkJCQkgIENGR19DTURfUENJCQl8IFwKLQkJCQkgIENGR19DTURfREFURQkJfCBcCi0JCQkJICBDRkdfQ01EX01JSQkJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9ESENQCQkgKQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAogCiAvKgogICogU2VyaWFsIGRvd25sb2FkIGNvbmZpZ3VyYXRpb24KQEAgLTEwOSw3ICsxMTAsNyBAQAogICogS0dEQiBDb25maWd1cmF0aW9uCiAgKgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC0xMjUsNyArMTI2LDcgQEAKIAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiNjM3LmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiNjM3LmgKaW5kZXggMDcxZDViNy4uOTc2ZGFlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjYzNy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2I2MzcuaApAQCAtOTksMjAgKzk5LDMyIEBACiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAzCiAvKiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCTEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkJICAgICAgICgoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQlDRkdfQ01EX0pGRlMyIHwgXAotCQkJQ0ZHX0NNRF9ESENQIHwgXAotCQkJQ0ZHX0NNRF9QSU5HICkgJiBcCi0JCSAgICAgIH4oQ0ZHX0NNRF9CREkgfCBcCi0JCQlDRkdfQ01EX0lNSSB8IFwKLQkJCUNGR19DTURfQVVUT1NDUklQVCB8IFwKLQkJCUNGR19DTURfRlBHQSB8IFwKLQkJCUNGR19DTURfTUlTQyB8IFwKLQkJCUNGR19DTURfTE9BRFMgKSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9JTUkKKyN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX01JU0MKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisKIAogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCiAjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZGF2aW5jaV9kdmV2bS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfZHZldm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNkMDU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfZHZldm0uaApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisvKgorICogRGVmaW5lIHRoaXMgdG8gbWFrZSBVLUJvb3Qgc2tpcCBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gd2hlbiBsb2FkZWQKKyAqIGJ5IGluaXRpYWwgYm9vdGxvYWRlci4gTm90IHJlcXVpcmVkIGJ5IE5BTkQgVS1Cb290IHZlcnNpb24gYnV0IElTCisgKiByZXF1aXJlZCBmb3IgYSBOT1IgdmVyc2lvbiB1c2VkIHRvIGJ1cm4gdGhlIHJlYWwgTk9SIFUtQm9vdCBpbnRvCisgKiBOT1IgRmxhc2guIE5BTkQgYW5kIE5PUiBzdXBwb3J0IGZvciBEYVZpbmNpIGNoaXBzIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZQorICogc28gaXQgaXMgTk9UIHBvc3NpYmxlIHRvIGJ1aWxkIGEgVS1Cb290IHdpdGggYm90aCBOQU5EIGFuZCBOT1Igcm91dGluZXMuCisgKiBOT1IgVS1Cb290IGlzIGxvYWRlZCBkaXJlY3RseSBmcm9tIEZsYXNoIHNvIGl0IG11c3QgcGVyZm9ybSBhbGwgdGhlCisgKiBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gaXRzZWxmLiBOQU5EIHZlcnNpb24gaXMgbG9hZGVkIGJ5IGFuIGluaXRpYWwKKyAqIGJvb3Rsb2FkZXIgKFVCTCBpbiBUSS1lc2UpIHRoYXQgcGVyZm9ybXMgc3VjaCBhbiBpbml0aWFsaXphdGlvbiBzbyBpdCdzCisgKiBza2lwcGVkIGluIE5BTkQgdmVyc2lvbi4gVGhlIHRoaXJkIERhVmluY2kgYm9vdCBtb2RlIGxvYWRzIGEgYm9vdGxvYWRlcgorICogdmlhIFVBUlQwIGFuZCB0aGF0IGJvb3Rsb2FkZXIgaW4gdHVybiBsb2FkcyBhbmQgcnVucyBVLUJvb3QgKG9yIHdoYXRldmVyKQorICogcGVyZm9ybWluZyBsb3cgbGV2ZWwgaW5pdCBwcmlvciB0byBsb2FkaW5nLiBBbGwgdGhhdCBtZWFucyB3ZSBjYW4gTk9UIHVzZQorICogTkFORCB2ZXJzaW9uIHRvIHB1dCBVLUJvb3QgaW50byBOT1IgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgTk9SIHN1cHBvcnQgYW5kCisgKiB3ZSBjYW4gTk9UIHVzZSBOT1IgdmVyc2lvbiBiZWNhdXNlIGl0IHBlcmZvcm1zIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbgorICogZWZmZWN0aXZlbHkgZGVzdHJveWluZyBpdHNlbGYgaW4gRERSIG1lbW9yeS4gVGhhdCdzIHdoeSBhIHNlcGFyYXRlIE5PUgorICogdmVyc2lvbiB3aXRoIHRoaXMgZGVmaW5lIGlzIG5lZWRlZC4gSXQgaXMgbG9hZGVkIHZpYSBVQVJULCB0aGVuIG9uZSB1c2VzCisgKiBpdCB0byBzb21laG93IGRvd25sb2FkIGEgcHJvcGVyIE5PUiB2ZXJzaW9uIGJ1aWx0IFdJVEhPVVQgdGhpcyBkZWZpbmUgdG8KKyAqIFJBTSAodGZ0cD8pIGFuZCBidXJuIGl0IHRvIE5PUiBGbGFzaC4gSSB3b3VsZCBiZSBwcm9iYWJseSBhYmxlIHRvIHNxdWVlemUKKyAqIE5PUiBzdXBwb3J0IGludG8gdGhlIGluaXRpYWwgYm9vdGxvYWRlciBzbyBpdCB3b24ndCBiZSBuZWVkZWQgYnV0IERhVmluY2kKKyAqIHN0YXRpYyBSQU0gbWlnaHQgYmUgdG9vIHNtYWxsIGZvciB0aGlzIChJIGhhdmUgc29tZXRoaW5nIGxpa2UgMktieXRlcyBsZWZ0CisgKiBhcyBvZiBub3csIHdpdGhvdXQgTk9SIHN1cHBvcnQpIHNvIHRoaXMgbWlnaHQndmUgbm90IGhhcHBlbmVkLi4uCisgKgorI2RlZmluZSBDT05GSUdfTk9SX1VBUlRfQk9PVAorICovCisKKy8qPT09PT09PSovCisvKiBCb2FyZCAqLworLyo9PT09PT09Ki8KKyNkZWZpbmUgRFZfRVZNCisjZGVmaW5lIENGR19OQU5EX1NNQUxMUEFHRQorI2RlZmluZSBDRkdfVVNFX05PUgorLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIFNvQyBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCQkJLyogYXJtOTI2ZWpzIENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMjk3MDAwMDAwCS8qIEFybSBDbG9jayBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgQ0ZHX1RJTUVSQkFTRQkJMHgwMWMyMTQwMAkvKiB1c2UgdGltZXIgMCAqLworI2RlZmluZSBDRkdfSFpfQ0xPQ0sJCTI3MDAwMDAwCS8qIFRpbWVyIElucHV0IGNsb2NrIGZyZXEgKi8KKyNkZWZpbmUgQ0ZHX0haCQkJMTAwMAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEVFUFJPTSBkZWZpbml0aW9ucyBmb3IgQXRtZWwgMjRDMjU2Qk4gU0VFUFJPTSBjaGlwICovCisvKiBvbiBTb25hdGEvRFZfRVZNIGJvYXJkLiBObyBFRVBST00gb24gc2NobW9vZ2llLiAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4JCTIKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkJMHg1MAorI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUwk2CisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUwkyMAorLyo9PT09PT09PT09PT09Ki8KKy8qIE1lbW9yeSBJbmZvICovCisvKj09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDB4MTAwMDAgKyAxMjgqMTAyNCkJLyogbWFsbG9jKCkgbGVuICovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTEyOAkJLyogcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDgwMDAwMDAwCS8qIG1lbXRlc3Qgc3RhcnQgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4ODEwMDAwMDAJLyogMTZNQiBSQU0gdGVzdCAqLworI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCQkvKiB3ZSBoYXZlIDEgYmFuayBvZiBEUkFNICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDI1NioxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMQkJMHg4MDAwMDAwMAkvKiBERFIgU3RhcnQgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHgxMDAwMDAwMAkvKiBERFIgc2l6ZSAyNTZNQiAqLworI2RlZmluZSBERFJfOEJBTktTCQkJCS8qIDgtYmFuayBERFIyICgyNTZNQikgKi8KKy8qPT09PT09PT09PT09PT09PT09PT0qLworLyogU2VyaWFsIERyaXZlciBpbmZvICovCisvKj09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCTQJCS8qIE5TMTY1NTAgcmVnaXN0ZXIgc2l6ZSAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCTB4MDFjMjAwMDAJLyogQmFzZSBhZGRyZXNzIG9mIFVBUlQwICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJMjcwMDAwMDAJLyogSW5wdXQgY2xvY2sgdG8gTlMxNjU1MCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCQkvKiB1c2UgVUFSVDAgZm9yIGNvbnNvbGUgKi8KKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAJCS8qIERlZmF1bHQgYmF1ZCByYXRlICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisvKj09PT09PT09PT09PT09PT09PT0qLworLyogSTJDIENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQworI2RlZmluZSBDT05GSUdfRFJJVkVSX0RBVklOQ0lfSTJDCisjZGVmaW5lIENGR19JMkNfU1BFRUQJCTgwMDAwCS8qIDEwMEticHMgd29uJ3Qgd29yaywgc2lsaWNvbiBidWcgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMTAJLyogQm9ndXMsIG1hc3Rlci1vbmx5IGluIFUtQm9vdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIE5ldHdvcmsgJiBFdGhlcm5ldCBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfRFJJVkVSX1RJX0VNQUMKKyNkZWZpbmUgQ09ORklHX01JSQorI2RlZmluZSBDT05GSUdfQk9PVFBfREVGQVVMVAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19ORVRfUkVUUllfQ09VTlQJMTAKKy8qPT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEZsYXNoICYgRW52aXJvbm1lbnQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZmRlZiBDRkdfVVNFX05BTkQKKyN1bmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNICisjZGVmaW5lIENGR19OT19GTEFTSAorI2RlZmluZSBDRkdfRU5WX0lTX0lOX05BTkQJCS8qIFUtQm9vdCBlbnYgaW4gTkFORCBGbGFzaCAgKi8KKyNpZmRlZiBDRkdfTkFORF9TTUFMTFBBR0UKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJNTEyCS8qIEVudiBzZWN0b3IgU2l6ZSAqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCVNaXzE2SworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMjA0OAkvKiBFbnYgc2VjdG9yIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQlTWl8xMjhLCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAkvKiBVLUJvb3QgaXMgbG9hZGVkIGJ5IGEgYm9vdGxvYWRlciAqLworI2RlZmluZSBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVAkvKiB0byBhIHByb3BlciBhZGRyZXNzLCBpbml0IGRvbmUgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfQkFTRQkJMHgwMjAwMDAwMAorI2RlZmluZSBDRkdfTkFORF9IV19FQ0MKKyNkZWZpbmUgQ0ZHX01BWF9OQU5EX0RFVklDRQkxCS8qIE1heCBudW1iZXIgb2YgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIE5BTkRfTUFYX0NISVBTCQkxCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkweDAJLyogQmxvY2sgMC0tbm90IHVzZWQgYnkgYm9vdGNvZGUgKi8KKyNkZWZpbmUgREVGX0JPT1RNCQkiIgorI2VsaWYgZGVmaW5lZChDRkdfVVNFX05PUikKKyNpZmRlZiBDT05GSUdfTk9SX1VBUlRfQk9PVAorI2RlZmluZSBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCS8qIFUtQm9vdCBpcyBsb2FkZWQgYnkgYSBib290bG9hZGVyICovCisjZGVmaW5lIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCS8qIHRvIGEgcHJvcGVyIGFkZHJlc3MsIGluaXQgZG9uZSAqLworI2Vsc2UKKyN1bmRlZiBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCisjdW5kZWYgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QKKyNlbmRpZgorI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICisjdW5kZWYgQ0ZHX05PX0ZMQVNICisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCisjZGVmaW5lIENGR19GTEFTSF9DRkkKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBtYXggbnVtYmVyIG9mIGZsYXNoIGJhbmtzICovCisjZGVmaW5lIENGR19GTEFTSF9TRUNUX1NaCTB4MTAwMDAJCS8qIDY0S0Igc2VjdCBzaXplIEFNRCBGbGFzaCAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJKENGR19GTEFTSF9TRUNUX1NaKjMpCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgwMjAwMDAwMAkvKiBDUzIgQmFzZSBhZGRyZXNzIAkgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQkvKiBGbGFzaCBCYXNlIGZvciBVLUJvb3QgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF9TSVpFCQkweDIwMDAwMDAJLyogRmxhc2ggc2l6ZSAzMk1CIAkgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCShQSFlTX0ZMQVNIX1NJWkUvQ0ZHX0ZMQVNIX1NFQ1RfU1opCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCUNGR19GTEFTSF9TRUNUX1NaCS8qIEVudiBzZWN0b3IgU2l6ZSAqLworI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgZ2VuZXJhbCBjb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjdW5kZWYgCUNPTkZJR19VU0VfSVJRCQkJLyogTm8gSVJRL0ZJUSBpbiBVLUJvb3QgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCisjdW5kZWYgQ09ORklHX0JPT1RERUxBWQorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJ1SW1hZ2UiCS8qIEJvb3QgZmlsZSBuYW1lICovCisjZGVmaW5lIENGR19QUk9NUFQJCSJVLUJvb3QgPiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KKyNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCisjZGVmaW5lIENGR19QQlNJWkUJCShDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikJLyogUHJpbnQgYnVmZmVyIHN6ICovCisjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHg4MDcwMDAwMAkvKiBkZWZhdWx0IExpbnV4IGtlcm5lbCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ09ORklHX1ZFUlNJT05fVkFSSUFCTEUKKyNkZWZpbmUgQ09ORklHX0FVVE9fQ09NUExFVEUJCS8qIFdvbid0IHdvcmsgd2l0aCBodXNoIHNvIGZhciwgbWF5IGJlIGxhdGVyICovCisjZGVmaW5lIENGR19IVVNIX1BBUlNFUgorI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORworI2RlZmluZSBDRkdfTE9OR0hFTFAKKyNkZWZpbmUgQ09ORklHX0NSQzMyX1ZFUklGWQorI2RlZmluZSBDT05GSUdfTVhfQ1lDTElDCisvKj09PT09PT09PT09PT09PT09PT0qLworLyogTGludXggSW5mb3JtYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIExJTlVYX0JPT1RfUEFSQU1fQUREUgkweDgwMDAwMTAwCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKKyNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkibWVtPTEyME0gY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvaGRhMSBydyBub2luaXRyZCBpcD1kaGNwIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInNldGVudiBzZXRib290IHNldGVudiBib290YXJncyBcXCQoYm9vdGFyZ3MpIHZpZGVvPWRtNjR4eGZiOm91dHB1dD1cXCQodmlkZW9zdGQpO3J1biBzZXRib290OyBib290bSAweDIwNTAwMDAiCisvKj09PT09PT09PT09PT09PT09Ki8KKy8qIFUtQm9vdCBjb21tYW5kcyAqLworLyo9PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyN1bmRlZiBDT05GSUdfQ01EX0JESQorI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfU0VUR0VURENSCisjaWZkZWYgQ0ZHX1VTRV9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfSU1MUworI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNlbGlmIGRlZmluZWQoQ0ZHX1VTRV9OT1IpCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNlbHNlCisjZXJyb3IgIkVpdGhlciBDRkdfVVNFX05BTkQgb3IgQ0ZHX1VTRV9OT1IgX01VU1RfIGJlIGRlZmluZWQgISEhIgorI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEtHREIgc3VwcG9ydCAoaWYgYW55KSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NjaG1vb2dpZS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfc2NobW9vZ2llLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjOWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NjaG1vb2dpZS5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKy8qPT09PT09PSovCisvKiBCb2FyZCAqLworLyo9PT09PT09Ki8KKyNkZWZpbmUgU0NITU9PR0lFCisjZGVmaW5lIENGR19OQU5EX0xBUkdFUEFHRQorI2RlZmluZSBDRkdfVVNFX05BTkQKKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBTb0MgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkJCS8qIGFybTkyNmVqcyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCTI5NzAwMDAwMAkvKiBBcm0gQ2xvY2sgZnJlcXVlbmN5ICovCisjZGVmaW5lIENGR19USU1FUkJBU0UJCTB4MDFjMjE0MDAJLyogdXNlIHRpbWVyIDAgKi8KKyNkZWZpbmUgQ0ZHX0haX0NMT0NLCQkyNzAwMDAwMAkvKiBUaW1lciBJbnB1dCBjbG9jayBmcmVxICovCisjZGVmaW5lIENGR19IWgkJCTEwMDAKKy8qPT09PT09PT09PT09PSovCisvKiBNZW1vcnkgSW5mbyAqLworLyo9PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgweDEwMDAwICsgMjU2KjEwMjQpCS8qIG1hbGxvYygpIGxlbiAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgJCS8qIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHg4MDAwMDAwMAkvKiBtZW10ZXN0IHN0YXJ0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDgxMDAwMDAwCS8qIDE2TUIgUkFNIHRlc3QgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkJLyogd2UgaGF2ZSAxIGJhbmsgb2YgRFJBTSAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgyNTYqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4ODAwMDAwMDAJLyogRERSIFN0YXJ0ICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpFCTB4MDgwMDAwMDAJLyogRERSIHNpemUgMTI4TUIgKi8KKyNkZWZpbmUgRERSXzRCQU5LUwkJCQkvKiA0LWJhbmsgRERSMiAoMTI4TUIpICovCisvKj09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFNlcmlhbCBEcml2ZXIgaW5mbyAqLworLyo9PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQk0CQkvKiBOUzE2NTUwIHJlZ2lzdGVyIHNpemUgKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkweDAxYzIwMDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMCAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCTI3MDAwMDAwCS8qIElucHV0IGNsb2NrIHRvIE5TMTY1NTAgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMQkJLyogdXNlIFVBUlQwIGZvciBjb25zb2xlICovCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCQkvKiBEZWZhdWx0IGJhdWQgcmF0ZSAqLworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIEkyQyBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9EQVZJTkNJX0kyQworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk4MDAwMAkvKiAxMDBLYnBzIHdvbid0IHdvcmssIHNpbGljb24gYnVnICovCisjZGVmaW5lIENGR19JMkNfU0xBVkUJCTEwCS8qIEJvZ3VzLCBtYXN0ZXItb25seSBpbiBVLUJvb3QgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBOZXR3b3JrICYgRXRoZXJuZXQgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9USV9FTUFDCisjZGVmaW5lIENPTkZJR19NSUkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0RFRkFVTFQKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfTkVUX1JFVFJZX0NPVU5UCTEwCisjZGVmaW5lIENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFCisvKj09PT09PT09PT09PT09PT09PT09PSovCisvKiBGbGFzaCAmIEVudmlyb25tZW50ICovCisvKj09PT09PT09PT09PT09PT09PT09PSovCisjdW5kZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAorI2RlZmluZSBDRkdfTk9fRkxBU0gKKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9OQU5ECQkvKiBVLUJvb3QgZW52IGluIE5BTkQgRmxhc2ggICovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTIwNDgJLyogRW52IHNlY3RvciBTaXplICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJU1pfMTI4SworI2RlZmluZSBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCS8qIFUtQm9vdCBpcyBsb2FkZWQgYnkgYSBib290bG9hZGVyICovCisjZGVmaW5lIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCS8qIHRvIGEgcHJvcGVyIGFkZHJlc3MsIGluaXQgZG9uZSAqLworI2RlZmluZSBDRkdfTkFORF9CQVNFCQkweDAyMDAwMDAwCisjZGVmaW5lIENGR19OQU5EX0hXX0VDQworI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgTkFORF9NQVhfQ0hJUFMJCTEKKyNkZWZpbmUgQ0ZHX0VOVl9PRkZTRVQJCTB4MAkvKiBCbG9jayAwLS1ub3QgdXNlZCBieSBib290Y29kZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworLyogQm9hcmQgcmVsYXRlZCBzdHVmZiAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfUlRDX0RTMTMwNwkJLyogUlRDIGNoaXAgb24gU0NITU9PR0lFICovCisjZGVmaW5lIENGR19JMkNfUlRDX0FERFIJMHg2ZgkvKiBSVEMgY2hpcCBJMkMgYWRkcmVzcyAqLworI2RlZmluZSBDT05GSUdfSEFTX1VJRAorI2RlZmluZSBDT05GSUdfVUlEX0RTMjhDTTAwCQkvKiBVbmlxdWUgSUQgb24gU0NITU9PR0lFICovCisjZGVmaW5lIENGR19VSURfQUREUgkJMHg1MAkvKiBVSUQgY2hpcCBJMkMgYWRkcmVzcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogVS1Cb290IGdlbmVyYWwgY29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI3VuZGVmIAlDT05GSUdfVVNFX0lSUQkJCS8qIE5vIElSUS9GSVEgaW4gVS1Cb290ICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgorI3VuZGVmIENPTkZJR19CT09UREVMQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkidUltYWdlIgkvKiBCb290IGZpbGUgbmFtZSAqLworI2RlZmluZSBDRkdfUFJPTVBUCQkiVS1Cb290ID4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCisjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLworI2RlZmluZSBDRkdfUEJTSVpFCQkoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpCS8qIFByaW50IGJ1ZmZlciBzeiAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzICovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4ODA3MDAwMDAJLyogZGVmYXVsdCBMaW51eCBrZXJuZWwgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFCisjZGVmaW5lIENPTkZJR19BVVRPX0NPTVBMRVRFCQkvKiBXb24ndCB3b3JrIHdpdGggaHVzaCBzbyBmYXIsIG1heSBiZSBsYXRlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCisjZGVmaW5lIENPTkZJR19DTURMSU5FX0VESVRJTkcKKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCisjZGVmaW5lIENPTkZJR19DUkMzMl9WRVJJRlkKKyNkZWZpbmUgQ09ORklHX01YX0NZQ0xJQworLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIExpbnV4IEluZm9ybWF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBMSU5VWF9CT09UX1BBUkFNX0FERFIJMHg4MDAwMDEwMAorI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcKKyNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCisjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJIm1lbT01Nk0gY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvaGRhMSBydyBub2luaXRyZCBpcD1kaGNwIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInNldGVudiBzZXRib290IHNldGVudiBib290YXJncyBcXCQoYm9vdGFyZ3MpIHZpZGVvPWRtNjR4eGZiOm91dHB1dD1cXCQodmlkZW9zdGQpO3J1biBzZXRib290IgorLyo9PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgY29tbWFuZHMgKi8KKy8qPT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9TRVRHRVREQ1IKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9JTUxTCisvKj09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEtHREIgc3VwcG9ydCAoaWYgYW55KSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NvbmF0YS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfc29uYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4YzRmYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NvbmF0YS5oCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKy8qCisgKiBEZWZpbmUgdGhpcyB0byBtYWtlIFUtQm9vdCBza2lwIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiB3aGVuIGxvYWRlZAorICogYnkgaW5pdGlhbCBib290bG9hZGVyLiBOb3QgcmVxdWlyZWQgYnkgTkFORCBVLUJvb3QgdmVyc2lvbiBidXQgSVMKKyAqIHJlcXVpcmVkIGZvciBhIE5PUiB2ZXJzaW9uIHVzZWQgdG8gYnVybiB0aGUgcmVhbCBOT1IgVS1Cb290IGludG8KKyAqIE5PUiBGbGFzaC4gTkFORCBhbmQgTk9SIHN1cHBvcnQgZm9yIERhVmluY2kgY2hpcHMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlCisgKiBzbyBpdCBpcyBOT1QgcG9zc2libGUgdG8gYnVpbGQgYSBVLUJvb3Qgd2l0aCBib3RoIE5BTkQgYW5kIE5PUiByb3V0aW5lcy4KKyAqIE5PUiBVLUJvb3QgaXMgbG9hZGVkIGRpcmVjdGx5IGZyb20gRmxhc2ggc28gaXQgbXVzdCBwZXJmb3JtIGFsbCB0aGUKKyAqIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiBpdHNlbGYuIE5BTkQgdmVyc2lvbiBpcyBsb2FkZWQgYnkgYW4gaW5pdGlhbAorICogYm9vdGxvYWRlciAoVUJMIGluIFRJLWVzZSkgdGhhdCBwZXJmb3JtcyBzdWNoIGFuIGluaXRpYWxpemF0aW9uIHNvIGl0J3MKKyAqIHNraXBwZWQgaW4gTkFORCB2ZXJzaW9uLiBUaGUgdGhpcmQgRGFWaW5jaSBib290IG1vZGUgbG9hZHMgYSBib290bG9hZGVyCisgKiB2aWEgVUFSVDAgYW5kIHRoYXQgYm9vdGxvYWRlciBpbiB0dXJuIGxvYWRzIGFuZCBydW5zIFUtQm9vdCAob3Igd2hhdGV2ZXIpCisgKiBwZXJmb3JtaW5nIGxvdyBsZXZlbCBpbml0IHByaW9yIHRvIGxvYWRpbmcuIEFsbCB0aGF0IG1lYW5zIHdlIGNhbiBOT1QgdXNlCisgKiBOQU5EIHZlcnNpb24gdG8gcHV0IFUtQm9vdCBpbnRvIE5PUiBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBOT1Igc3VwcG9ydCBhbmQKKyAqIHdlIGNhbiBOT1QgdXNlIE5PUiB2ZXJzaW9uIGJlY2F1c2UgaXQgcGVyZm9ybXMgbG93IGxldmVsIGluaXRpYWxpemF0aW9uCisgKiBlZmZlY3RpdmVseSBkZXN0cm95aW5nIGl0c2VsZiBpbiBERFIgbWVtb3J5LiBUaGF0J3Mgd2h5IGEgc2VwYXJhdGUgTk9SCisgKiB2ZXJzaW9uIHdpdGggdGhpcyBkZWZpbmUgaXMgbmVlZGVkLiBJdCBpcyBsb2FkZWQgdmlhIFVBUlQsIHRoZW4gb25lIHVzZXMKKyAqIGl0IHRvIHNvbWVob3cgZG93bmxvYWQgYSBwcm9wZXIgTk9SIHZlcnNpb24gYnVpbHQgV0lUSE9VVCB0aGlzIGRlZmluZSB0bworICogUkFNICh0ZnRwPykgYW5kIGJ1cm4gaXQgdG8gTk9SIEZsYXNoLiBJIHdvdWxkIGJlIHByb2JhYmx5IGFibGUgdG8gc3F1ZWV6ZQorICogTk9SIHN1cHBvcnQgaW50byB0aGUgaW5pdGlhbCBib290bG9hZGVyIHNvIGl0IHdvbid0IGJlIG5lZWRlZCBidXQgRGFWaW5jaQorICogc3RhdGljIFJBTSBtaWdodCBiZSB0b28gc21hbGwgZm9yIHRoaXMgKEkgaGF2ZSBzb21ldGhpbmcgbGlrZSAyS2J5dGVzIGxlZnQKKyAqIGFzIG9mIG5vdywgd2l0aG91dCBOT1Igc3VwcG9ydCkgc28gdGhpcyBtaWdodCd2ZSBub3QgaGFwcGVuZWQuLi4KKyAqCisjZGVmaW5lIENPTkZJR19OT1JfVUFSVF9CT09UCisgKi8KKworLyo9PT09PT09Ki8KKy8qIEJvYXJkICovCisvKj09PT09PT0qLworI2RlZmluZSBTT05BVEFfQk9BUkQKKyNkZWZpbmUgQ0ZHX05BTkRfU01BTExQQUdFCisjZGVmaW5lIENGR19VU0VfTk9SCisvKj09PT09PT09PT09PT09PT09PT0qLworLyogU29DIENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19BUk05MjZFSlMJCQkvKiBhcm05MjZlanMgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkyOTcwMDAwMDAJLyogQXJtIENsb2NrIGZyZXF1ZW5jeSAqLworI2RlZmluZSBDRkdfVElNRVJCQVNFCQkweDAxYzIxNDAwCS8qIHVzZSB0aW1lciAwICovCisjZGVmaW5lIENGR19IWl9DTE9DSwkJMjcwMDAwMDAJLyogVGltZXIgSW5wdXQgY2xvY2sgZnJlcSAqLworI2RlZmluZSBDRkdfSFoJCQkxMDAwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRUVQUk9NIGRlZmluaXRpb25zIGZvciBBdG1lbCAyNEMyNTZCTiBTRUVQUk9NIGNoaXAgKi8KKy8qIG9uIFNvbmF0YS9EVl9FVk0gYm9hcmQuIE5vIEVFUFJPTSBvbiBzY2htb29naWUuICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTgkJMgorI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCQkweDUwCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTCTYKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTIwCisvKj09PT09PT09PT09PT0qLworLyogTWVtb3J5IEluZm8gKi8KKy8qPT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMHgxMDAwMCArIDEyOCoxMDI0KQkvKiBtYWxsb2MoKSBsZW4gKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CQkvKiByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4ODAwMDAwMDAJLyogbWVtdGVzdCBzdGFydCBhZGRyZXNzICovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHg4MTAwMDAwMAkvKiAxNk1CIFJBTSB0ZXN0ICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJCS8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMjU2KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDgwMDAwMDAwCS8qIEREUiBTdGFydCAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDA4MDAwMDAwCS8qIEREUiBzaXplIDEyOE1CICovCisjZGVmaW5lIEREUl80QkFOS1MJCQkJLyogNC1iYW5rIEREUjIgKDEyOE1CKSAqLworLyo9PT09PT09PT09PT09PT09PT09PSovCisvKiBTZXJpYWwgRHJpdmVyIGluZm8gKi8KKy8qPT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJNAkJLyogTlMxNjU1MCByZWdpc3RlciBzaXplICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJMHgwMWMyMDAwMAkvKiBCYXNlIGFkZHJlc3Mgb2YgVUFSVDAgKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkyNzAwMDAwMAkvKiBJbnB1dCBjbG9jayB0byBOUzE2NTUwICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEJCS8qIHVzZSBVQVJUMCBmb3IgY29uc29sZSAqLworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAkJLyogRGVmYXVsdCBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBJMkMgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19EUklWRVJfREFWSU5DSV9JMkMKKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJODAwMDAJLyogMTAwS2JwcyB3b24ndCB3b3JrLCBzaWxpY29uIGJ1ZyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkxMAkvKiBCb2d1cywgbWFzdGVyLW9ubHkgaW4gVS1Cb290ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogTmV0d29yayAmIEV0aGVybmV0IENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19EUklWRVJfVElfRU1BQworI2RlZmluZSBDT05GSUdfTUlJCisjZGVmaW5lIENPTkZJR19CT09UUF9ERUZBVUxUCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX05FVF9SRVRSWV9DT1VOVAkxMAorLyo9PT09PT09PT09PT09PT09PT09PT0qLworLyogRmxhc2ggJiBFbnZpcm9ubWVudCAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENGR19VU0VfTkFORAorI3VuZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKKyNkZWZpbmUgQ0ZHX05PX0ZMQVNICisjZGVmaW5lIENGR19FTlZfSVNfSU5fTkFORAkJLyogVS1Cb290IGVudiBpbiBOQU5EIEZsYXNoICAqLworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQk1MTIJLyogRW52IHNlY3RvciBTaXplICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJU1pfMTZLCisjZGVmaW5lIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQJLyogVS1Cb290IGlzIGxvYWRlZCBieSBhIGJvb3Rsb2FkZXIgKi8KKyNkZWZpbmUgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QJLyogdG8gYSBwcm9wZXIgYWRkcmVzcywgaW5pdCBkb25lICovCisjZGVmaW5lIENGR19OQU5EX0JBU0UJCTB4MDIwMDAwMDAKKyNkZWZpbmUgQ0ZHX05BTkRfSFdfRUNDCisjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBOQU5EX01BWF9DSElQUwkJMQorI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJMHgwCS8qIEJsb2NrIDAtLW5vdCB1c2VkIGJ5IGJvb3Rjb2RlICovCisjZGVmaW5lIERFRl9CT09UTQkJIiIKKyNlbGlmIGRlZmluZWQoQ0ZHX1VTRV9OT1IpCisjaWZkZWYgQ09ORklHX05PUl9VQVJUX0JPT1QKKyNkZWZpbmUgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAkvKiBVLUJvb3QgaXMgbG9hZGVkIGJ5IGEgYm9vdGxvYWRlciAqLworI2RlZmluZSBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVAkvKiB0byBhIHByb3BlciBhZGRyZXNzLCBpbml0IGRvbmUgKi8KKyNlbHNlCisjdW5kZWYgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAorI3VuZGVmIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCisjZW5kaWYKKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAorI3VuZGVmIENGR19OT19GTEFTSAorI2RlZmluZSBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgorI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkJLyogbWF4IG51bWJlciBvZiBmbGFzaCBiYW5rcyAqLworI2RlZmluZSBDRkdfRkxBU0hfU0VDVF9TWgkweDIwMDAwCQkvKiAxMjhLQiBzZWN0IHNpemUgQU1EIEZsYXNoICovCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkoQ0ZHX0ZMQVNIX1NFQ1RfU1oqMikKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDAyMDAwMDAwCS8qIENTMiBCYXNlIGFkZHJlc3MgCSAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCS8qIEZsYXNoIEJhc2UgZm9yIFUtQm9vdCAqLworI2RlZmluZSBQSFlTX0ZMQVNIX1NJWkUJCTB4MjAwMDAwMAkvKiBGbGFzaCBzaXplIDMyTUIgCSAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJKFBIWVNfRkxBU0hfU0laRS9DRkdfRkxBU0hfU0VDVF9TWikKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJQ0ZHX0ZMQVNIX1NFQ1RfU1oJLyogRW52IHNlY3RvciBTaXplICovCisjZW5kaWYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFUtQm9vdCBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyN1bmRlZiAJQ09ORklHX1VTRV9JUlEJCQkvKiBObyBJUlEvRklRIGluIFUtQm9vdCAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKKyN1bmRlZiBDT05GSUdfQk9PVERFTEFZCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJInVJbWFnZSIJLyogQm9vdCBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkJIlUtQm9vdCA+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KKyNkZWZpbmUgQ0ZHX1BCU0laRQkJKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KQkvKiBQcmludCBidWZmZXIgc3ogKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncyAqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDgwNzAwMDAwCS8qIGRlZmF1bHQgTGludXgga2VybmVsIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDT05GSUdfVkVSU0lPTl9WQVJJQUJMRQorI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURQkJLyogV29uJ3Qgd29yayB3aXRoIGh1c2ggc28gZmFyLCBtYXkgYmUgbGF0ZXIgKi8KKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgorI2RlZmluZSBDT05GSUdfQ01ETElORV9FRElUSU5HCisjZGVmaW5lIENGR19MT05HSEVMUAorI2RlZmluZSBDT05GSUdfQ1JDMzJfVkVSSUZZCisjZGVmaW5lIENPTkZJR19NWF9DWUNMSUMKKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBMaW51eCBJbmZvcm1hdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgTElOVVhfQk9PVF9QQVJBTV9BRERSCTB4ODAwMDAxMDAKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCisjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJtZW09NTZNIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcm9vdD0vZGV2L2hkYTEgcncgbm9pbml0cmQgaXA9ZGhjcCIKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJzZXRlbnYgc2V0Ym9vdCBzZXRlbnYgYm9vdGFyZ3MgXFwkKGJvb3RhcmdzKSB2aWRlbz1kbTY0eHhmYjpvdXRwdXQ9XFwkKHZpZGVvc3RkKTtydW4gc2V0Ym9vdDsgYm9vdG0gMHgyMDYwMDAwIgorLyo9PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgY29tbWFuZHMgKi8KKy8qPT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9CREkKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX1NFVEdFVERDUgorI2lmZGVmIENGR19VU0VfTkFORAorI3VuZGVmIENPTkZJR19DTURfRkxBU0gKKyN1bmRlZiBDT05GSUdfQ01EX0lNTFMKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZWxpZiBkZWZpbmVkKENGR19VU0VfTk9SKQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZWxzZQorI2Vycm9yICJFaXRoZXIgQ0ZHX1VTRV9OQU5EIG9yIENGR19VU0VfTk9SIF9NVVNUXyBiZSBkZWZpbmVkICEhISIKKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBLR0RCIHN1cHBvcnQgKGlmIGFueSkgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENPTkZJR19DTURfS0dEQgorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCisjZW5kaWYKKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZGJhdTF4MDAuaCBiL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCmluZGV4IDRjYzUwODUuLmIyZjYwNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCkBAIC03NSwyMSArNzUsNTcgQEAKICNpZmRlZiBDT05GSUdfREJBVTE1NTAKIC8qIEJvb3QgZnJvbSBmbGFzaCBieSBkZWZhdWx0LCByZXZlcnQgdG8gYm9vdHAgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAweGJmYzIwMDAwOyBib290cDsgYm9vdG0iCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTE9BREIgfCBDRkdfQ01EX05FVCkgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfRlBHQSB8IENGR19DTURfSURFIHwgXAotCQkJCSAgIENGR19DTURfTUlJIHwgQ0ZHX0NNRF9SVU4gfCBDRkdfQ01EX0JESSB8IENGR19DTURfQkVEQlVHIHwgXAotCQkJCSAgIENGR19DTURfTkZTIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BDTUNJQSB8IENGR19DTURfSTJDKSkKICNlbHNlIC8qIENPTkZJR19EQkFVMTU1MCAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RwO2Jvb3RtIgotCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfSURFIHwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9FTEYpICYgXAotCQkJCSB+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9GUEdBIHwgXAotCQkJCSAgIENGR19DTURfTUlJIHwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfUlVOIHwgQ0ZHX0NNRF9MT0FEQiB8IFwKLQkJCQkgICBDRkdfQ01EX0VMRiB8IENGR19DTURfQkRJIHwgQ0ZHX0NNRF9CRURCVUcpKQogI2VuZGlmIC8qIENPTkZJR19EQkFVMTU1MCAqLwogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0JESQorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0VOVgorI3VuZGVmIENPTkZJR19DTURfRkFUCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9NSUkKKyN1bmRlZiBDT05GSUdfQ01EX1JVTgorCisKKyNpZmRlZiBDT05GSUdfREJBVTE1NTAKKworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKworI3VuZGVmIENPTkZJR19DTURfSTJDCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKyN1bmRlZiBDT05GSUdfQ01EX05GUworI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisKKyNlbHNlCisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKworI2VuZGlmCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kZWJyaXMuaCBiL2luY2x1ZGUvY29uZmlncy9kZWJyaXMuaAppbmRleCA4ZmY5NjNmLi43NjY3ZTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZGVicmlzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RlYnJpcy5oCkBAIC0xMjIsMjMgKzEyMiwzNSBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKICNkZWZpbmUgQ09ORklHX0RSQU1fU1BFRUQJMTAwCQkvKiBNSHogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQkgIENGR19DTURfQ0FDSEUJCXwgXAotCQkJCSAgQ0ZHX0NNRF9EQVRFCQl8IFwKLQkJCQkgIENGR19DTURfREhDUAkJfCBcCi0JCQkJICBDRkdfQ01EX0RJQUcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJICBDRkdfQ01EX0VMRgkJfCBcCi0JCQkJICBDRkdfQ01EX0kyQwkJfCBcCi0JCQkJICBDRkdfQ01EX0pGRlMyCQl8IFwKLQkJCQkgIENGR19DTURfS0dCRAkJfCBcCi0JCQkJICBDRkdfQ01EX1BDSQkJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9TQVZFUwkJfCBcCi0JCQkJICBDRkdfQ01EX1NEUkFNKQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0tHQkQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQogCiAKIC8qCkBAIC00MzUsNyArNDQ3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNDAgQ1BVCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kZWx0YS5oIGIvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKaW5kZXggMTU2ODEyMC4uMDk2NjdlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKQEAgLTg3LDIyICs4Nyw0OSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLS8qICNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTU1DIHwgQ0ZHX0NNRF9GQVQpICovCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKICNpZmRlZiBUVVJOX09OX0VUSEVSTkVUCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykKKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogI2Vsc2UKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQkgIHwgQ0ZHX0NNRF9FTlYgXAotCQkJCSAgfCBDRkdfQ01EX05BTkQgXAotCQkJCSAgfCBDRkdfQ01EX0kyQykgXAotCQkJCSAmIH4oQ0ZHX0NNRF9ORVQgXAotCQkJCSAgICAgfCBDRkdfQ01EX0ZMQVNIIFwKLQkJCQkgICAgIHwgQ0ZHX0NNRF9JTUxTKSkKKworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfSU1MUworCiAjZW5kaWYKIAorLyogVVNCICovCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcJMQorI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UgICAgICAxCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OICAgIDEKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkxCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJT0hDSV9SRUdTX0JBU0UKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkiZGVsdGEiCisjZGVmaW5lIENGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUwkzCisKKyNkZWZpbmUgTElUVExFRU5ESUFOICAgICAgICAgICAgMSAgICAgICAvKiB1c2VkIGJ5IHVzYl9vaGNpLmMgICovCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDg6MDA6M2U6MjY6MGE6NWIKQEAgLTExNCw3ICsxNDEsNyBAQAogI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kbnAxMTEwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZG5wMTExMC5oCmluZGV4IDlhYzI4NTYuLmQzMmUwNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9kbnAxMTEwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RucDExMTAuaApAQCAtNjYsMTAgKzY2LDIxIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PXJhbWZzIGRldmZzPW1vdW50IGNvbnNvbGU9dHR5U0EwLDExNTIwMCIKQEAgLTgwLDcgKzkxLDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiZG5wMTExMCIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwOyBib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZVhhbGlvbi5oIGIvaW5jbHVkZS9jb25maWdzL2VYYWxpb24uaAppbmRleCBhMDE0YzdjLi5mOGUyYzg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZVhhbGlvbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lWGFsaW9uLmgKQEAgLTU4LDE3ICs1OCwyNyBAQAogCiAJCQkJCQkgICAgLyojZGVmaW5lIENPTkZJR19EUkFNX1NQRUVECSAgICAgIDY2ICAgKi8gLyogTUh6CQkJICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCAgIENPTkZJR19DTURfREZMICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9GTEFTSCAgIHwgXAotCQkJCSAgICBDRkdfQ01EX1NEUkFNICAgfCBcCi0JCQkJICAgIENGR19DTURfSTJDCSAgICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9JREUJICAgIHwgXAotCQkJCSAgICBDRkdfQ01EX0ZBVAkgICAgfCBcCi0JCQkJICAgIENGR19DTURfRU5WCSAgICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9QQ0kgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zOTgsNyArNDA4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9lYm9ueS5oIGIvaW5jbHVkZS9jb25maWdzL2Vib255LmgKaW5kZXggNGExMzg1Yy4uMmM2MjZhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2Vib255LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2Vib255LmgKQEAgLTIwOCwyNiArMjA4LDM4IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjM2LDcgKzI0OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4Niw3ICsyOTgsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTI5OCw3ICszMTAsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2VwNzMxMi5oIGIvaW5jbHVkZS9jb25maWdzL2VwNzMxMi5oCmluZGV4IGJkZGE2MjkuLmY1Y2Y0NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9lcDczMTIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZXA3MzEyLmgKQEAgLTYyLDEyICs2MiwyMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfSkZGUzIpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJkZXZmcz1tb3VudCByb290PXJhbWZzIGNvbnNvbGU9dHR5UzAsOTYwMCIKQEAgLTc4LDcgKzg5LDcgQEAKIC8qI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJImltcGE3IgkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RwO2Jvb3RtIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9lcDgyNDguaCBiL2luY2x1ZGUvY29uZmlncy9lcDgyNDguaAppbmRleCAwNDE0N2E1Li44NWFkNzBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZXA4MjQ4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2VwODI0OC5oCkBAIC02MCw4ICs2MCw4IEBACiAgKiBTQ0MsIDEtMyBmb3IgRkNDKQogICoKICAqIElmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcwotICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdAotICogYmUgcmVtb3ZlZCBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIG11c3QgYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUCisgKiBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogRXRoZXJuZXQgaXMgbm90IG9uIFNDQyAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBFdGhlcm5ldCBpcyBvbiBGQ0MgICAgICovCkBAIC0xMjMsMjMgKzEyMywzNCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgIFwKLQkJCQl8IENGR19DTURfREhDUCAgICBcCi0JCQkJfCBDRkdfQ01EX0VDSE8gICAgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgICAgIFwKLQkJCQl8IENGR19DTURfSU1NQVAgICBcCi0JCQkJfCBDRkdfQ01EX01JSSAgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgIFwKLQkJCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIEZGODYwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kICovCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazEgcncgbXRkcGFydHM9cGh5czo3TShyb290KSwtKHJvb3Qpcm8iCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTE1Nyw3ICsxNjgsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0xODMsMjAgKzE5NCwyMCBAQAogCiAjZGVmaW5lCUNGR19ESVJFQ1RfRkxBU0hfVEZUUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkwCiAjZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJQ0ZHX01BWF9GTEFTSF9CQU5LUwogI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SICAwCiAjZGVmaW5lIENGR19KRkZTMl9MQVNUX1NFQ1RPUiAgIDYyCiAjZGVmaW5lIENGR19KRkZTMl9TT1JUX0ZSQUdNRU5UUwogI2RlZmluZSBDRkdfSkZGU19DVVNUT01fUEFSVAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkvKiBUbyBlbmFibGUgSTJDIHN1cHBvcnQJKi8KICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJMTAwMDAwCS8qIEkyQyBzcGVlZAkJCSovCiAjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YJLyogSTJDIHNsYXZlIGFkZHJlc3MJCSovCi0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogCiAjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCiAjaWYgKENGR19NT05JVE9SX0JBU0UgPCBDRkdfRkxBU0hfQkFTRSkKQEAgLTI0MCw3ICsyNTEsNyBAQAogI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLwogCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmgKaW5kZXggNjg2MjUxOS4uMDI1YzI0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2VwODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lcDgyNjAuaApAQCAtMTgzLDggKzE4Myw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYgIENPTkZJR19FVEhFUl9PTl9TQ0MgICAgICAgICAgIC8qIGRlZmluZSBpZiBldGhlcm5ldCBvbiBTQ0MgICAgKi8KICNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZDQyAgICAgICAgICAgLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIEZDQyAgICAqLwpAQCAtMjkxLDM3ICsyOTAsNDkgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0vKiBXaGF0IFUtQm9vdCBzdWJzeXRlbXMgZG8geW91IHdhbnQgZW5hYmxlZD8gKi8KKwogLyoKLSovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDRkdfQ01EX0FMTCAgICAgJiBcCi0JCQkJICB+KAlDRkdfQ01EX0JNUAl8IFwKLQkJCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJCUNGR19DTURfRENSCXwgXAotCQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJCUNGR19DTURfRElTUExBWQl8IFwKLQkJCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJCUNGR19DTURfRFRUCXwgXAotCQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCQlDRkdfQ01EX0ZEQwl8IFwKLQkJCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCQlDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJCUNGR19DTURfS0dEQgl8IFwKLQkJCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJCUNGR19DTURfTU1DCXwgXAotCQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJCUNGR19DTURfUENJCXwgXAotCQkJCQlDRkdfQ01EX1BDTUNJQQl8IFwKLQkJCQkJQ0ZHX0NNRF9SRUlTRVIJfCBcCi0JCQkJCUNGR19DTURfU0NTSQl8IFwKLQkJCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJCUNGR19DTURfVU5JVkVSU0V8IFwKLQkJCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJCUNGR19DTURfVkZECXwgXAotCQkJCQlDRkdfQ01EX1hJTUcJKSApCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KKworI3VuZGVmIENPTkZJR19DTURfQk1QCisjdW5kZWYgQ09ORklHX0NNRF9CU1AKKyN1bmRlZiBDT05GSUdfQ01EX0RDUgorI3VuZGVmIENPTkZJR19DTURfREhDUAorI3VuZGVmIENPTkZJR19DTURfRElTUExBWQorI3VuZGVmIENPTkZJR19DTURfRE9DCisjdW5kZWYgQ09ORklHX0NNRF9EVFQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfRVhUMgorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSkZGUzIKKyN1bmRlZiBDT05GSUdfQ01EX0tHREIKKyN1bmRlZiBDT05GSUdfQ01EX01JSQorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUkVJU0VSCisjdW5kZWYgQ09ORklHX0NNRF9TQ1NJCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX1VOSVZFUlNFCisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1ZGRAorI3VuZGVmIENPTkZJR19DTURfWElNRwogCiAKIC8qIFdoZXJlIGRvIHRoZSBpbnRlcm5hbCByZWdpc3RlcnMgbGl2ZT8gKi8KQEAgLTM0MiwxMyArMzUzLDEwIEBACiAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRiAxCSAgICAvKiBDYWxsIGJvYXJkX2Vhcmx5X2luaXRfZgkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUgICAgICAgICAgICAgIDEwMjQgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICAgICAqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAyNTYgICAgICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAgICAgKi8KQEAgLTQ5Niw3ICs1MDQsNyBAQAogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQgICAgIDUgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2VwODJ4eG0uaCBiL2luY2x1ZGUvY29uZmlncy9lcDgyeHhtLmgKaW5kZXggYTc3Y2NlZi4uNGZlYmQzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2VwODJ4eG0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZXA4Mnh4bS5oCkBAIC02MCw4ICs2MCw4IEBACiAgKiBTQ0MsIDEtMyBmb3IgRkNDKQogICoKICAqIElmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcwotICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdAotICogYmUgcmVtb3ZlZCBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIG11c3QgYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUCisgKiBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogRXRoZXJuZXQgaXMgbm90IG9uIFNDQyAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBFdGhlcm5ldCBpcyBvbiBGQ0MgICAgICovCkBAIC0xMDgsMjIgKzEwOCwzNCBAQAogCiAjZGVmaW5lIENGR19WWFdPUktTX01BQ19QVFIgMHg0MzAwIC8qIFBhc3MgRXRoZXJuZXQgTUFDIHRvIFZ4V29ya3MgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgIFwKLQkJCQl8IENGR19DTURfREhDUCAgICBcCi0JCQkJfCBDRkdfQ01EX0VDSE8gICAgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgICAgIFwKLQkJCQl8IENGR19DTURfSU1NQVAgICBcCi0JCQkJfCBDRkdfQ01EX01JSSAgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgIFwKLQkJCQl8IENGR19DTURfREFURSAgICBcCi0JCQkJfCBDRkdfQ01EX0RUVAkgIFwKLQkJCQl8IENGR19DTURfRUVQUk9NICBcCi0JCQkJfCBDRkdfQ01EX1BDSQkgIFwKLQkJCQl8IENGR19DTURfRElBRwkgIFwKLQkJCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RUVAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKwogCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwMDoxMDpFQzowMDo4ODo2NQogI2RlZmluZSBDT05GSUdfSEFTX0VUSDEKQEAgLTEzOCw3ICsxNTAsNyBAQAogI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURQkxCiAjZGVmaW5lCUNPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJImV0aHByaW1lPUZDQzMgRVRIRVJORVQiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTE1Niw3ICsxNjgsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSJlcDgyeHhtPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzA4LDIwICszMjAsMjAgQEAKIAogI2RlZmluZQlDRkdfRElSRUNUX0ZMQVNIX1RGVFAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKICNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAogI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCUNGR19NQVhfRkxBU0hfQkFOS1MKICNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUiAgMAogI2RlZmluZSBDRkdfSkZGUzJfTEFTVF9TRUNUT1IgICA2MgogI2RlZmluZSBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKICNkZWZpbmUgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCTEJLyogVG8gZW5hYmxlIEkyQyBzdXBwb3J0CSovCiAjZGVmaW5lIENGR19JMkNfU1BFRUQJCTEwMDAwMAkvKiBJMkMgc3BlZWQJCQkqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCS8qIEkyQyBzbGF2ZSBhZGRyZXNzCQkqLwotI2VuZGlmIC8qIENGR19DTURfSTJDICovCisjZW5kaWYKIAogI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQogI2lmIChDRkdfTU9OSVRPUl9CQVNFIDwgQ0ZHX0ZMQVNIX0JBU0UpCkBAIC0zNTgsNyArMzcwLDcgQEAKICNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ldmI0NTEwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZXZiNDUxMC5oCmluZGV4IDg4YzJjNzQuLjY2NTAwYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ldmI0NTEwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2V2YjQ1MTAuaApAQCAtNzIsMTIgKzcyLDIzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxOTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDA6NDA6OTU6MzY6MzU6MzMKICNkZWZpbmUgQ09ORklHX05FVE1BU0sJCTI1NS4yNTUuMjU1LjAKQEAgLTg5LDcgKzEwMCw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cCAxMDAwMDAgdUltYWdlIgogLyogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJjb25zb2xlPXR0eVMwLDE5MjAwIGluaXRyZD0weDEwMGEwMDQwLDUzMEsgcm9vdD0vZGV2L3JhbSBrZWVwaW5pdHJkIiAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTkyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2djcGx1cy5oIGIvaW5jbHVkZS9jb25maWdzL2djcGx1cy5oCmluZGV4IGI2OGEyZGMuLmUxMWNlNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9nY3BsdXMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZ2NwbHVzLmgKQEAgLTc5LDE4ICs3OSwzMCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCkKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkiY29uc29sZT10dHlTQTAsMzg0MDBuOCBtdGRwYXJ0cz1zYTExMDAtZmxhc2g6MW1AMCh6SW1hZ2UpLDNtQDFtKHJhbWRpc2suZ3opLDEybUA0bSh1c2VyZnMpIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdHA7dGZ0cDtib290bSIKICNkZWZpbmUgQ0ZHX0FVVE9MT0FEICAgICAgICAgICAgIm4iICAgICAgICAgICAgIC8qIE5vIGF1dG9sb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkzODQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZ3RoMi5oIGIvaW5jbHVkZS9jb25maWdzL2d0aDIuaAppbmRleCBhNDllZDNiLi5jMmE1MGMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZ3RoMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ndGgyLmgKQEAgLTcxLDEyICs3MSwzNyBAQAogLyogQm9vdCBmcm9tIENvbXBhY3QgZmxhc2ggcGFydGl0aW9uIDIgYXMgZGVmYXVsdCAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImlkZSByZXNldDtkaXNrIDB4ODEwMDAwMDAgMDoyO3J1biBhZGRtaXNjO2Jvb3RtIgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0RIQ1AgKSAmIFwKLSB+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9GUEdBIHwgXAotICAgQ0ZHX0NNRF9NSUkgfCBDRkdfQ01EX0xPQURTCXwgQ0ZHX0NNRF9MT0FEQiB8IENGR19DTURfRUxGIHwgXAotICAgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0JFREJVRyB8IENGR19DTURfTkZTIHwgQ0ZHX0NNRF9BVVRPU0NSSVBUICkpCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyN1bmRlZiBDT05GSUdfQ01EX0VOVgorI3VuZGVmIENPTkZJR19DTURfRkFUCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKyN1bmRlZiBDT05GSUdfQ01EX0VMRgorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKKyN1bmRlZiBDT05GSUdfQ01EX05GUworI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZ3c4MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZ3c4MjYwLmgKaW5kZXggNGY4M2IxOS4uZmY1NzI0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2d3ODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ndzgyNjAuaApAQCAtMTk0LDggKzE5NCw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAKICN1bmRlZiAgQ09ORklHX0VUSEVSX09OX1NDQwpAQCAtMjg2LDEzICsyODUsMTYgQEAKICN1bmRlZiAgQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUgogI2RlZmluZSBERUJVR19CT09US0VZUyAgICAgIDAKIAotLyogQWRkIHN1cHBvcnQgZm9yIGEgZmV3IGV4dHJhIGJvb3RwIG9wdGlvbnMgbGlrZToKLSAqICAtIEZpbGUgc2l6ZQotICogIC0gRE5TCisvKgorICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJICAgICBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgXAotCQkJICAgICBDT05GSUdfQk9PVFBfRE5TKQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCiAKIC8qIHVuZGVmIHRoaXMgdG8gc2F2ZSBtZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCkBAIC0zMDAsMTQgKzMwMiwyMSBAQAogLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogI2RlZmluZSBDRkdfUFJPTVBUICAgICAgIj0+ICIKIAotLyogV2hhdCBVLUJvb3Qgc3Vic3l0ZW1zIGRvIHlvdSB3YW50IGVuYWJsZWQ/ICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgKCgoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfS0dEQikpKSB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0JFREJVRyAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9FTEYgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9BU0tFTlYgIHwgXAotCQkJICAgICAgIENGR19DTURfUkVHSU5GTyB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0lNTUFQICAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9NSUkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKKyN1bmRlZiBDT05GSUdfQ01EX0tHREIKKwogCiAvKiBXaGVyZSBkbyB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJzIGxpdmU/ICovCiAjZGVmaW5lIENGR19JTU1SICAgICAgICAweGYwMDAwMDAwCkBAIC0zMzEsMTMgKzM0MCwxMCBAQAogI2RlZmluZSBDT05GSUdfR1c4MjYwICAgICAgIDEgICAvKiBvbiBhbiBHVzgyNjAgQm9hcmQgICovCiAjZGVmaW5lIENPTkZJR19DUE0yCQkxCS8qIEhhcyBhIENQTTIgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0JTSVpFICAgICAgICAxMDI0ICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAgICAgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUgICAgICAgIDI1NiAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICAgICAgKi8KQEAgLTQ3Myw3ICs0NzksNyBAQAogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgIDUgICAvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9oY3U0LmggYi9pbmNsdWRlL2NvbmZpZ3MvaGN1NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3N2Y0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaGN1NC5oCkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICooQykgQ29weXJpZ2h0IDIwMDUtMjAwNyBOZXRzdGFsIE1hc2NoaW5lbiBBRworICogICAgTmlrbGF1cyBHaWdlciAoTmlrbGF1cy5HaWdlckBuZXRzdGFsLmNvbSkKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGhjdTQuaCAtIGNvbmZpZ3VyYXRpb24gZm9yIEhDVTQgYm9hcmQgKHNpbWlsYXIgdG8gaGN1NS5oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ09ORklHX0hDVTQJCTEJCS8qIEJvYXJkIGlzIEhDVTQJKi8KKyNkZWZpbmUgQ09ORklHXzR4eAkJMQkJLyogLi4uIFBQQzR4eCBmYW1pbHkJKi8KKyNkZWZpbmUgQ09ORklHXzQwNUdQciAxIC8qIEhDVTQgaGFzIGEgNDA1R1ByICovCisjZGVmaW5lIENPTkZJR180MDVHUCAxCisjZGVmaW5lIENPTkZJR180eHggICAxCisKKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkzMzMzMzMzMwkvKiBleHRlcm5hbCBmcmVxIHRvIHBsbAkqLworCisjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkJLyogQ2FsbCBib2FyZF9lYXJseV9pbml0X2YgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEJCS8qIENhbGwgbWlzY19pbml0X3IJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmFzZSBhZGRyZXNzZXMgLS0gTm90ZSB0aGVzZSBhcmUgZWZmZWN0aXZlIGFkZHJlc3NlcyB3aGVyZSB0aGUKKyAqIGFjdHVhbCByZXNvdXJjZXMgZ2V0IG1hcHBlZCAobm90IHBoeXNpY2FsIGFkZHJlc3NlcykKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMzg0ICogMTAyNCkJLyogUmVzZXJ2ZSAzODQga0IgZm9yIE1vbml0b3IJKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgyNTYgKiAxMDI0KQkvKiBSZXNlcnZlIDI1NiBrQiBmb3IgbWFsbG9jKCkJKi8KKworCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCS8qIF9tdXN0XyBiZSAwCQkqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhmZmY4MDAwMAkvKiBzdGFydCBvZiBGTEFTSAkqLworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQorCisvKiAuLi4gd2l0aCBvbi1jaGlwIG1lbW9yeSBoZXJlICg0S0J5dGVzKSAqLworI2RlZmluZSBDRkdfT0NNX0RBVEFfQUREUiAweEY0MDAwMDAwCisjZGVmaW5lIENGR19PQ01fREFUQV9TSVpFIDB4MDAwMDEwMDAKKy8qIERvIG5vdCBzZXQgdXAgbG9ja2VkIGRjYWNoZSBhcyBpbml0IHJhbS4gKi8KKyN1bmRlZiBDRkdfSU5JVF9EQ0FDSEVfQ1MKKworLyogVXNlIHRoZSBPbi1DaGlwLU1lbW9yeSAoT0NNKSBhcyBhIHRlbXBvcmFyeSBzdGFjayBmb3IgdGhlIHN0YXJ0dXAgY29kZS4gKi8KKyNkZWZpbmUgQ0ZHX1RFTVBfU1RBQ0tfT0NNIDEKKworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUglDRkdfT0NNX0RBVEFfQUREUgkvKiBPQ00JCSovCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJQ0ZHX09DTV9EQVRBX1NJWkUKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMjU2CQkvKiBudW0gYnl0ZXMgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VyaWFsIFBvcnQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogSWYgQ0ZHX0VYVF9TRVJJQUxfQ0xPQ0ssIHRoZW4gdGhlIFVBUlQgZGl2aXNvciBpcyAxLgorICogSWYgQ0ZHXzQwNV9VQVJUX0VSUkFUQV81OSwgdGhlbiBVQVJUIGRpdmlzb3IgaXMgMzEuCisgKiBPdGhlcndpc2UsIFVBUlQgZGl2aXNvciBpcyBkZXRlcm1pbmVkIGJ5IENQVSBDbG9jayBhbmQgQ0ZHX0JBU0VfQkFVRCB2YWx1ZS4KKyAqIFRoZSBMaW51eCBCQVNFX0JBVUQgZGVmaW5lIHNob3VsZCBtYXRjaCB0aGlzIGNvbmZpZ3VyYXRpb24uCisgKiAgICBiYXNlQmF1ZCA9IGNwdUNsb2NrLyh1YXJ0RGl2aXNvcioxNikKKyAqIElmIENGR180MDVfVUFSVF9FUlJBVEFfNTkgYW5kIDIwME1IeiBDUFUgY2xvY2ssCisgKiBzZXQgTGludXggQkFTRV9CQVVEIHRvIDQwMzIwMC4KKyAqLworI3VuZGVmIENGR19FWFRfU0VSSUFMX0NMT0NLCSAgICAgICAvKiBleHRlcm5hbCBzZXJpYWwgY2xvY2sgKi8KKyN1bmRlZiBDT05GSUdfU0VSSUFMX01VTFRJICAgICAgICAgICAgLyogbmVlZGVkIHRvIGJlIGFibGUgdG8gZGVmaW5lCisJCQkJCSAgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPICovCisjdW5kZWYJQ0ZHXzQwNV9VQVJUX0VSUkFUQV81OQkgICAgICAgLyogNDA1R1AvQ1IgUmV2LiBEIHNpbGljb24gKi8KKyNkZWZpbmUgQ0ZHX0JBU0VfQkFVRAkgICAgNjkxMjAwCisKKy8qIFNpemUgKGJ5dGVzKSBvZiBpbnRlcnJ1cHQgZHJpdmVuIHNlcmlhbCBwb3J0IGJ1ZmZlci4KKyAqIFNldCB0byAwIHRvIHVzZSBwb2xsaW5nIGluc3RlYWQgb2YgaW50ZXJydXB0cy4KKyAqIFNldHRpbmcgdG8gMCB3aWxsIGFsc28gZGlzYWJsZSBSVFMvQ1RTIGhhbmRzaGFraW5nLgorICovCisjdW5kZWYgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPCisKKy8qIFNldCBjb25zb2xlIGJhdWRyYXRlIHRvIDk2MDAgKi8KKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCisKKworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJCQkJCQlcCisJezMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVudmlyb25tZW50CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjdW5kZWYJQ0ZHX0VOVl9JU19JTl9OVlJBTQorI3VuZGVmICBDRkdfRU5WX0lTX0lOX0ZMQVNICisjZGVmaW5lCUNGR19FTlZfSVNfSU5fRUVQUk9NCisjdW5kZWYgIENGR19FTlZfSVNfTk9XSEVSRQorCisjaWZkZWYgIENGR19FTlZfSVNfSU5fRUVQUk9NCisvKiBQdXQgdGhlIGVudmlyb25tZW50IGFmdGVyIHRoZSBTRFJBTSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFBST01fU0laRSAJMjA0OAorI2RlZmluZSBDRkdfRU5WX09GRlNFVAkgNTEyCisjZGVmaW5lIENGR19FTlZfU0laRQkoUFJPTV9TSVpFLUNGR19FTlZfT0ZGU0VUKQorI2VuZGlmCisKKyNpZmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNICisvKiBQdXQgdGhlIGVudmlyb25tZW50IGluIEZsYXNoICovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MTAwMDAgCS8qIHNpemUgb2Ygb25lIGNvbXBsZXRlIHNlY3RvcgkqLworI2RlZmluZSBDRkdfRU5WX0FERFIJCSgoLUNGR19NT05JVE9SX0xFTiktQ0ZHX0VOVl9TRUNUX1NJWkUpCisjZGVmaW5lCUNGR19FTlZfU0laRQkJMHgxMDAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworCisvKiBBZGRyZXNzIGFuZCBzaXplIG9mIFJlZHVuZGFudCBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSX1JFRFVORAkoQ0ZHX0VOVl9BRERSLUNGR19FTlZfU0VDVF9TSVpFKQorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECShDRkdfRU5WX1NJWkUpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSTJDIHN0dWZmIGZvciBhIEFUTUVMIEFUMjRDMTYgKDJrQiBob2xkaW5nIEVOViwgd2UgYXJlIHVzaW5nIHRoZQorICogdGhlIGZpcnN0IGludGVybmFsIEkyQyBjb250cm9sbGVyIG9mIHRoZSBQUEM0NDBFUHgKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENGR19TUERfQlVTX05VTQkJMAorCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0CSovCisjdW5kZWYJQ09ORklHX1NPRlRfSTJDCQkJLyogSTJDIGJpdC1iYW5nZWQJCSovCisjZGVmaW5lIENGR19JMkNfU1BFRUQJCTQwMDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgorCisvKiBUaGlzIGlzIHRoZSA3Yml0IGFkZHJlc3Mgb2YgdGhlIGRldmljZSwgbm90IGluY2x1ZGluZyBQLiAqLworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSIDB4NTAKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4gMQorCisvKiBUaGUgRUVQUk9NIGNhbiBkbyAxNmJ5dGUgKCAxIDw8IDQgKSBwYWdlIHdyaXRlcy4gKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVwkweDA3CisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTIDQKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TIDEwCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9FTkFCTEUKKyN1bmRlZiBDRkdfSTJDX01VTFRJX0VFUFJPTVMKKworCisjZGVmaW5lIENPTkZJR19QUkVCT09UCSJlY2hvOyIJCQkJCQlcCisJImVjaG8gVHlwZSBcInJ1biBmbGFzaF9uZnNcIiB0byBtb3VudCByb290IGZpbGVzeXN0ZW0gb3ZlciBORlM7IiBcCisJImVjaG8iCisKKyN1bmRlZglDT05GSUdfQk9PVEFSR1MKKworLyogU2V0dXAgc29tZSBib2FyZCBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBkZWZhdWx0IGVudmlyb25tZW50IHZhcmlhYmxlcyAqLworI2RlZmluZSBDT05GSUdfSE9TVE5BTUUJCWhjdTQKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTcyLjI1LjEuNDIKKyNkZWZpbmUgQ09ORklHX0VUSEFERFIgICAgICAwMDo2MDoxMzowMDowMDowMCAgIC8qIE5ldHN0YWwgTWFjaGluZXMgQUcgTUFDICovCisjZGVmaW5lIENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTcyLjI1LjEuMworCisjZGVmaW5lIENGR19URlRQX0xPQURBRERSIDB4MDEwMDAwMDAgLyogQDE2IE1CICovCisKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAorCSJuZXRkZXY9ZXRoMFwwIgkJCQkJCQlcCisJImxvYWRhZGRyPTB4MDEwMDAwMDBcMCIJCQkJCQlcCisJIm5mc2FyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIgkJCVwKKwkJIm5mc3Jvb3Q9JHtzZXJ2ZXJpcH06JHtyb290cGF0aH1cMCIJCQlcCisJInJhbWFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcndcMCIJCQlcCisJImFkZGlwPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAiCQkJCVwKKwkJImlwPSR7aXBhZGRyfToke3NlcnZlcmlwfToke2dhdGV3YXlpcH06JHtuZXRtYXNrfSIJXAorCQkiOiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgcGFuaWM9MVwwIgkJCVwKKwkiYWRkdHR5PXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSBjb25zb2xlPXR0eVMwLCR7YmF1ZHJhdGV9XDAiXAorCSJuZnM9dGZ0cCAyMDAwMDAgJHtib290ZmlsZX07cnVuIG5mc2FyZ3MgYWRkaXAgYWRkdHR5OyIJCVwKKwkgICAgICAgICJib290bVwwIgkJCQkJCVwKKwkicm9vdHBhdGg9L2hvbWUvZGlhZ25vc2UvZWxkay9wcGNfNHh4XDAiCQkJXAorCSJib290ZmlsZT0vdGZ0cGJvb3QvaGN1NC91SW1hZ2VcMCIJCQkJXAorCSJsb2FkPXRmdHAgMTAwMDAwIGhjdTQvdS1ib290LmJpblwwIgkJCVwKKwkidXBkYXRlPXByb3RlY3Qgb2ZmIEZGRmEwMDAwIEZGRkZGRkZGO2VyYSBGRkZhMDAwMCBGRkZGRkZGRjsiCVwKKwkJImNwLmIgMTAwMDAwIEZGRmEwMDAwIDYwMDAwXDAiCQkJICAgICAgICBcCisJInVwZD1ydW4gbG9hZDtydW4gdXBkYXRlXDAiCQkJCQlcCisJInZ4PXRmdHAgJHtsb2FkYWRkcn0gaGN1NF92eF9yb207IgkJCQlcCisJInNldGVudiBib290YXJncyBlbWFjKDAsMCloY3U0X3Z4X3JvbSBlPSR7aXBhZGRyfSAiCQlcCisJIiBoPSR7c2VydmVyaXB9IHU9ZHB1IHB3PW5ldHN0YWw4NzUyIHRuPWhjdTQgZj0weDMwMDg7IgkJXAorCSJib290dnggJHtsb2FkYWRkcn1cMCIgCQkJCQkJXAorCSIiCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIHZ4IgorCisjaWYgMAorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCS0xCS8qIGF1dG9ib290IGRpc2FibGVkCQkqLworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLworI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCisKKyNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCisjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMQkvKiBQSFkgYWRkcmVzcwkJCSovCisKKyNkZWZpbmUgQ09ORklHX1BIWV9SRVNFVCAgICAgICAgMQkvKiByZXNldCBwaHkgdXBvbiBzdGFydHVwICAgICAgICAgKi8KKworI2RlZmluZSBDT05GSUdfSEFTX0VUSDAKKyNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJMTYJLyogTnVtYmVyIG9mIGV0aGVybmV0IHJ4IGJ1ZmZlcnMgJiBkZXNjcmlwdG9ycyAqLworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCisvKiBTUEQgRUVQUk9NIChzZHJhbSBzcGVlZCBjb25maWcpIGRpc2FibGVkICovCisjZGVmaW5lIENPTkZJR19TUERfRUVQUk9NICAgICAgICAgIDEKKyNkZWZpbmUgU1BEX0VFUFJPTV9BRERSRVNTICAgICAgMHg1MAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCSNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2Vsc2UKKwkjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2VuZGlmCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDQwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwQzAwMDAwCS8qIDQgLi4uIDEyIE1CIGluIERSQU0JKi8KKworCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MTAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19FWFRCRElORk8JCTEJLyogVG8gdXNlIGV4dGVuZGVkIGJvYXJkX2ludG8gKGJkX3QpICovCisKKyNkZWZpbmUgQ0ZHX0haCQkxMDAwCQkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCisKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeQkqLworI2RlZmluZSBDT05GSUdfTE9PUFcgICAgICAgICAgICAxICAgICAgIC8qIGVuYWJsZSBsb29wdyBjb21tYW5kICAgICAgICAgKi8KKyNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGNoZWNrIGZvciBrZXlwcmVzcyBvbiBib290ZGVsYXk9PTAgKi8KKyNkZWZpbmUgQ09ORklHX1ZFUlNJT05fVkFSSUFCTEUgMQkvKiBpbmNsdWRlIHZlcnNpb24gZW52IHZhcmlhYmxlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIChFQkMpIFNldHVwCisgKi8KKworLyogTWVtb3J5IEJhbmsgMCAoRmxhc2ggQmFuayAwKSBpbml0aWFsaXphdGlvbgkJCQkJKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjBBUAkJMHgwMjAwNTQwMAorI2RlZmluZSBDRkdfRUJDX1BCMENSCQkweEZGRjE4MDAwICAvKiBCQVM9MHhGRkYsQlM9MU1CLEJVPVIvVyxCVz04Yml0CSovCisKKyNkZWZpbmUgQ0ZHX0VCQ19QQjFBUAkJMHgwMzA0MTIwMAorI2RlZmluZSBDRkdfRUJDX1BCMUNSCQkweDcwMDlBMDAwICAvKiBCQVM9LEJTPU1CLEJVPVIvVyxCVz1iaXQJKi8KKworI2RlZmluZSBDRkdfRUJDX1BCMkFQCQkweDAyMDU0NTAwCisjZGVmaW5lIENGR19FQkNfUEIyQ1IJCTB4NzgwMTgwMDAgIC8qIEJBUz0sQlM9TUIsQlU9Ui9XLEJXPWJpdAkqLworCisjZGVmaW5lIENGR19FQkNfUEIzQVAJCTB4MDE4NDAzMDAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjNDUgkJMHg3YzBiYTAwMCAgLyogQkFTPSxCUz1NQixCVT1SL1csQlc9Yml0CSovCisKKyNkZWZpbmUgQ0ZHX0VCQ19QQjRBUAkJMHgwMTgwMDMwMAorI2RlZmluZSBDRkdfRUJDX1BCNENSCQkweDdlMGJhMDAwICAvKiBCQVM9LEJTPU1CLEJVPVIvVyxCVz1iaXQJKi8KKworI2RlZmluZSBDRkdfR1BJTzBfVENSCQkweDdmZmUwMDAwICAvKiBHUElPIHZhbHVlICovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTI1NgkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAJKi8KKworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKy8qIEluaXQgTWVtb3J5IENvbnRyb2xsZXI6CisgKgorICogQlIwLzEgYW5kIE9SMC8xIChGTEFTSCkKKyAqLworCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQlDRkdfRkxBU0hfQkFTRQkvKiBGTEFTSCBiYW5rICMwCSovCisjZGVmaW5lIEZMQVNIX0JBU0UxX1BSRUxJTQkwCQkvKiBGTEFTSCBiYW5rICMxCSovCisKKworLyogQ29uZmlndXJhdGlvbiBQb3J0IGxvY2F0aW9uICovCisjZGVmaW5lIENPTkZJR19QT1JUX0FERFIJMHhGMDAwMDUwMAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIElCTSA0MDVHUHIgQ1BVcwkqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CSAgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KKworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIgICAgICAgICAgICAgICAgIC8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIgICAgKi8KKyNpZmRlZiAgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCisjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCSAgICAvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9oY3U1LmggYi9pbmNsdWRlL2NvbmZpZ3MvaGN1NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYmYyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaGN1NS5oCkBAIC0wLDAgKzEsMzkzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3IE5ldHN0YWwgTWFzY2hpbmVuIEFHCisgKiBOaWtsYXVzIEdpZ2VyIChOaWtsYXVzLkdpZ2VyQG5ldHN0YWwuY29tKQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNi0yMDA3CisgKiBTdGVmYW4gUm9lc2UsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHNyQGRlbnguZGUuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBKYWNxdWVsaW5lIFBpcmEtRmVycmlvbCwgQU1DQy9JQk0sIGpwaXJhLWZlcnJpb2xAZnIuaWJtLmNvbQorICogQWxhaW4gU2F1cmVsLCAgICAgICAgICAgIEFNQ0MvSUJNLCBhbGFpbi5zYXVyZWxAZnIuaWJtLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaGN1NS5oIC0gY29uZmlndXJhdGlvbiBmb3IgSENVNSBib2FyZCAoZGVyaXZlZCBmcm9tIHNlcXVvaWEuaCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENPTkZJR19IQ1U1CQkxCQkvKiBCb2FyZCBpcyBIQ1U1CSovCisjZGVmaW5lIENPTkZJR180NDBFUFgJCTEJCS8qIFNwZWNpZmljIFBQQzQ0MEVQeAkqLworI2RlZmluZSBDT05GSUdfNDQwCQkxCQkvKiAuLi4gUFBDNDQwIGZhbWlseQkqLworI2RlZmluZSBDT05GSUdfNHh4CQkxCQkvKiAuLi4gUFBDNHh4IGZhbWlseQkqLworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCTMzMzMzMzMzCS8qIGV4dGVybmFsIGZyZXEgdG8gcGxsCSovCisKKyNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRiAxCQkvKiBDYWxsIGJvYXJkX2Vhcmx5X2luaXRfZiAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IJMQkJLyogQ2FsbCBtaXNjX2luaXRfcgkqLworI2RlZmluZSBDT05GSUdfQUREX1JBTV9JTkZPCTEJLyogUHJpbnQgYWRkaXRpb25hbCBpbmZvCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJhc2UgYWRkcmVzc2VzIC0tIE5vdGUgdGhlc2UgYXJlIGVmZmVjdGl2ZSBhZGRyZXNzZXMgd2hlcmUgdGhlCisgKiBhY3R1YWwgcmVzb3VyY2VzIGdldCBtYXBwZWQgKG5vdCBwaHlzaWNhbCBhZGRyZXNzZXMpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgzODQgKiAxMDI0KQkvKiBSZXNlcnZlIDM4NCBrQiBmb3IgTW9uaXRvcgkqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBtYWxsb2MoKQkqLworCisjZGVmaW5lIENGR19CT09UX0JBU0VfQUREUgkweGZmZjAwMDAwCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCS8qIF9tdXN0XyBiZSAwCQkqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhmZmY4MDAwMAkvKiBzdGFydCBvZiBGTEFTSAkqLworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQorI2RlZmluZSBDRkdfT0NNX0JBU0UJCTB4ZTAwMTAwMDAgICAgICAvKiBvY20JCQkqLworI2RlZmluZSBDRkdfUENJX0JBU0UJCTB4ZTAwMDAwMDAgICAgICAvKiBJbnRlcm5hbCBQQ0kgcmVncwkqLworI2RlZmluZSBDRkdfUENJX01FTUJBU0UJCTB4ODAwMDAwMDAJLyogbWFwcGVkIHBjaSBtZW1vcnkJKi8KKyNkZWZpbmUgQ0ZHX1BDSV9NRU1CQVNFMQlDRkdfUENJX01FTUJBU0UgICsgMHgxMDAwMDAwMAorI2RlZmluZSBDRkdfUENJX01FTUJBU0UyCUNGR19QQ0lfTUVNQkFTRTEgKyAweDEwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNQkFTRTMJQ0ZHX1BDSV9NRU1CQVNFMiArIDB4MTAwMDAwMDAKKworLyogRG9uJ3QgY2hhbmdlIGVpdGhlciBvZiB0aGVzZSAqLworI2RlZmluZSBDRkdfUEVSSVBIRVJBTF9CQVNFCTB4ZWY2MDAwMDAJLyogaW50ZXJuYWwgcGVyaXBoZXJhbHMJKi8KKworI2RlZmluZSBDRkdfVVNCMkQwX0JBU0UJCTB4ZTAwMDAxMDAKKyNkZWZpbmUgQ0ZHX1VTQl9ERVZJQ0UJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1VTQl9IT1NUCQkweGUwMDAwNDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluaXRpYWwgUkFNICYgc3RhY2sgcG9pbnRlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIDQ0MEVQeC80NDBHUnggaGF2ZSAxNktCIG9mIGludGVybmFsIFNSQU0sIHNvIG5vIG5lZWQgZm9yIEQtQ2FjaGUJKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX09DTQkxCQkvKiBPQ00gYXMgaW5pdCByYW0JKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJQ0ZHX09DTV9CQVNFCS8qIE9DTQkJCSovCisKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAkoNCA8PCAxMCkKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMjU2CQkvKiBudW0gYnl0ZXMgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VyaWFsIFBvcnQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjdW5kZWYgQ0ZHX0VYVF9TRVJJQUxfQ0xPQ0sJICAgICAgIC8qIGV4dGVybmFsIHNlcmlhbCBjbG9jayAqLworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKKyN1bmRlZiBDT05GSUdfU0VSSUFMX01VTFRJICAgICAgICAgICAgLyogbmVlZGVkIHRvIGJlIGFibGUgdG8gZGVmaW5lCisJQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPLCBidXQKKwlDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gKDE2KSBkb2VzIG5vdCB3b3JrICovCisvKiBTaXplIChieXRlcykgb2YgaW50ZXJydXB0IGRyaXZlbiBzZXJpYWwgcG9ydCBidWZmZXIuCisgKiBTZXQgdG8gMCB0byB1c2UgcG9sbGluZyBpbnN0ZWFkIG9mIGludGVycnVwdHMuCisgKiBTZXR0aW5nIHRvIDAgd2lsbCBhbHNvIGRpc2FibGUgUlRTL0NUUyBoYW5kc2hha2luZy4KKyAqLworI3VuZGVmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTworI3VuZGVmIENPTkZJR19VQVJUMV9DT05TT0xFCisKKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCQkJCQkJXAorCXszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbnZpcm9ubWVudAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3VuZGVmCUNGR19FTlZfSVNfSU5fTlZSQU0KKyN1bmRlZiAgQ0ZHX0VOVl9JU19JTl9GTEFTSAorI2RlZmluZQlDRkdfRU5WX0lTX0lOX0VFUFJPTQorI3VuZGVmICBDRkdfRU5WX0lTX05PV0hFUkUKKworI2lmZGVmICBDRkdfRU5WX0lTX0lOX0VFUFJPTQorLyogUHV0IHRoZSBlbnZpcm9ubWVudCBhZnRlciB0aGUgU0RSQU0gYW5kIGJvb3RzdHJhcCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFBST01fU0laRSAJMjA0OAorI2RlZmluZSBDRkdfQk9PU1RSQVBfT1BUSU9OX09GRlNFVAkgNTEyCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCSAoQ0ZHX0JPT1NUUkFQX09QVElPTl9PRkZTRVQgKyAweDEwKQorI2RlZmluZSBDRkdfRU5WX1NJWkUJKFBST01fU0laRS1DRkdfRU5WX09GRlNFVCkKKyNlbmRpZgorCisjaWZkZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAorLyogUHV0IHRoZSBlbnZpcm9ubWVudCBpbiBGbGFzaCAqLworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDEwMDAwIAkvKiBzaXplIG9mIG9uZSBjb21wbGV0ZSBzZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoKC1DRkdfTU9OSVRPUl9MRU4pLUNGR19FTlZfU0VDVF9TSVpFKQorI2RlZmluZQlDRkdfRU5WX1NJWkUJCTB4MTAwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKworLyogQWRkcmVzcyBhbmQgc2l6ZSBvZiBSZWR1bmRhbnQgRW52aXJvbm1lbnQgU2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJKENGR19FTlZfQUREUi1DRkdfRU5WX1NFQ1RfU0laRSkKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFX1JFRFVORAkoQ0ZHX0VOVl9TSVpFKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEREUiBTRFJBTQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX01CWVRFU19TRFJBTSAgICAgICAgKDEyOCkJCS8qIDEyOCBNQiBvciAyNTYgTUIgIAkJKi8KKyNkZWZpbmUgQ0ZHX0REUl9DQUNIRURfQUREUgkweDQwMDAwMDAwCS8qIHNldHVwIDJuZCBUTEIgY2FjaGVkIGhlcmUJKi8KKyN1bmRlZiAgQ09ORklHX0REUl9EQVRBX0VZRQkJCS8qIERvIG5vdCB1c2UgRERSMiBvcHRpbWl6YXRpb24JKi8KKyNkZWZpbmUgQ09ORklHX0REUl9FQ0MJCTEJCS8qIGVuYWJsZSBFQ0MJCQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMgc3R1ZmYgZm9yIGEgQVRNRUwgQVQyNEMxNiAoMmtCIGhvbGRpbmcgRU5WLCB3ZSBhcmUgdXNpbmcgdGhlCisgKiB0aGUgc2Vjb25kIGludGVybmFsIEkyQyBjb250cm9sbGVyIG9mIHRoZSBQUEM0NDBFUHgKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENGR19TUERfQlVTX05VTQkJMQorCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0CSovCisjdW5kZWYJQ09ORklHX1NPRlRfSTJDCQkJLyogSTJDIGJpdC1iYW5nZWQJCSovCisjZGVmaW5lIENGR19JMkNfU1BFRUQJCTQwMDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgorCisvKiBUaGlzIGlzIHRoZSA3Yml0IGFkZHJlc3Mgb2YgdGhlIGRldmljZSwgbm90IGluY2x1ZGluZyBQLiAqLworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSIDB4NTAKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4gMQorCisvKiBUaGUgRUVQUk9NIGNhbiBkbyAxNmJ5dGUgKCAxIDw8IDQgKSBwYWdlIHdyaXRlcy4gKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVwkweDA3CisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTIDQKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TIDEwCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9FTkFCTEUKKyN1bmRlZiBDRkdfSTJDX01VTFRJX0VFUFJPTVMKKworCisjZGVmaW5lIENPTkZJR19QUkVCT09UCSJlY2hvOyIJCQkJCQlcCisJImVjaG8gVHlwZSBcInJ1biBuZnNcIiB0byBtb3VudCBMaW51eCByb290IGZpbGVzeXN0ZW0gb3ZlciBORlM7IlwKKwkiZWNobyIKKworI3VuZGVmCUNPTkZJR19CT09UQVJHUworCisvKiBTZXR1cCBzb21lIGJvYXJkIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisjZGVmaW5lIENPTkZJR19IT1NUTkFNRQkJaGN1NQorI2RlZmluZSBDT05GSUdfSVBBRERSCQkxNzIuMjUuMS40MgorI2RlZmluZSBDT05GSUdfRVRIQUREUiAgICAgIAkwMDo2MDoxMzowMDowMDowMCAgIC8qIE5ldHN0YWwgTWFjaGluZXMgQUcgTUFDICovCisjZGVmaW5lIENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTcyLjI1LjEuMworCisjZGVmaW5lIENGR19URlRQX0xPQURBRERSIDB4MDEwMDAwMDAgLyogQDE2IE1CICovCisKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAorCSJuZXRkZXY9ZXRoMFwwIgkJCQkJCQlcCisJImxvYWRhZGRyPTB4MDEwMDAwMDBcMCIJCQkJCQlcCisJIm5mc2FyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIgkJCVwKKwkJIm5mc3Jvb3Q9JHtzZXJ2ZXJpcH06JHtyb290cGF0aH1cMCIJCQlcCisJInJhbWFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcndcMCIJCQlcCisJImFkZGlwPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAiCQkJCVwKKwkJImlwPSR7aXBhZGRyfToke3NlcnZlcmlwfToke2dhdGV3YXlpcH06JHtuZXRtYXNrfSIJXAorCQkiOiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgcGFuaWM9MVwwIgkJCVwKKwkiYWRkdHR5PXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSBjb25zb2xlPXR0eVMwLCR7YmF1ZHJhdGV9XDAiXAorCSJuZnM9dGZ0cCAyMDAwMDAgJHtib290ZmlsZX07cnVuIG5mc2FyZ3MgYWRkaXAgYWRkdHR5OyIgCVwKKwkJImJvb3RtXDAiCQkJCQkJXAorCQkiYm9vdGZpbGU9aGN1NS91SW1hZ2VcMCIgCQkJCVwKKwkJInJvb3RwYXRoPS9ob21lL2hjdS9lbGRrL3BwY180eHhGUFwwIgkJIAlcCisJCSJsb2FkPXRmdHAgMTAwMDAwIGhjdTUvdS1ib290LmJpblwwIgkJIAlcCisJInVwZGF0ZT1wcm90ZWN0IG9mZiBGRkZhMDAwMCBGRkZGRkZGRjtlcmEgRkZGYTAwMDAgRkZGRkZGRkY7IglcCisJCSJjcC5iIDEwMDAwMCBGRkZhMDAwMCA2MDAwMFwwIgkJCSAgICAgICAgXAorCSJ1cGQ9cnVuIGxvYWQ7cnVuIHVwZGF0ZVwwIgkJCQkJXAorCSJ2eD10ZnRwICR7bG9hZGFkZHJ9IGhjdTUvaGN1NV92eF9yb207IiAJCQlcCisJInNldGVudiBib290YXJncyBlbWFjKDAsMCloY3U1X3Z4X3JvbSBlPSR7aXBhZGRyfSAiIAkgCVwKKwkJIiBoPSR7c2VydmVyaXB9IHU9ZHB1IHB3PW5ldHN0YWw4NzUyIHRuPWhjdTUgZj0weDMwMDg7IiBcCisJImJvb3R2eCAke2xvYWRhZGRyfVwwIiBcCisJIiIKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gdngiCisKKyNpZiAwCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KKworI2RlZmluZSBDT05GSUdfTTg4RTExMTFfUEhZCTEKKyNkZWZpbmUJQ09ORklHX0lCTV9FTUFDNF9WNAkxCisjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLworI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MsIFNlZSBzY2hlbWF0aWNzCSovCisKKyNkZWZpbmUgQ09ORklHX1BIWV9SRVNFVCAgICAgICAgMQkvKiByZXNldCBwaHkgdXBvbiBzdGFydHVwICAgICAgICAgKi8KKworI2RlZmluZSBDT05GSUdfSEFTX0VUSDAKKyNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJMzIJLyogTnVtYmVyIG9mIGV0aGVybmV0IHJ4IGJ1ZmZlcnMgJiBkZXNjcmlwdG9ycyAqLworCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQorI2RlZmluZSBDT05GSUdfSEFTX0VUSDEJCTEJLyogYWRkIHN1cHBvcnQgZm9yICJldGgxYWRkciIJKi8KKyNkZWZpbmUgQ09ORklHX1BIWTFfQUREUgkxCisKKy8qIFVTQiAqLworI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKKyNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCisKKy8qIENvbW1lbnQgdGhpcyBvdXQgdG8gZW5hYmxlIFVTQiAxLjEgZGV2aWNlICovCisjZGVmaW5lIFVTQl8yXzBfREVWSUNFCisKKy8qIFBhcnRpdGlvbnMgKi8KKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0lTT19QQVJUSVRJT04KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKKyNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbHNlCisjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCSAgICAgICAgMTYJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCSAgICAgICAgQ0ZHX0NCU0laRSAvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwNDAwMDAwIC8qIG1lbXRlc3Qgd29ya3Mgb24JCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwQzAwMDAwIC8qIDQgLi4uIDEyIE1CIGluIERSQU0JKi8KKworI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDEwMDAwMCAgLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0VYVEJESU5GTwkJMQkvKiBUbyB1c2UgZXh0ZW5kZWQgYm9hcmRfaW50byAoYmRfdCkgKi8KKworI2RlZmluZSBDRkdfSFoJCSAgICAgICAgMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzCSovCisKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeQkqLworI2RlZmluZSBDT05GSUdfTE9PUFcgICAgICAgICAgICAxICAgICAgIC8qIGVuYWJsZSBsb29wdyBjb21tYW5kICAgICAgICAgKi8KKyNkZWZpbmUgQ09ORklHX01YX0NZQ0xJQyAgICAgICAgMSAgICAgICAvKiBlbmFibGUgbWRjL213YyBjb21tYW5kcyAgICAgICovCisjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBjaGVjayBmb3Iga2V5cHJlc3Mgb24gYm9vdGRlbGF5PT0wICovCisjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFIDEJLyogaW5jbHVkZSB2ZXJzaW9uIGVudiB2YXJpYWJsZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQQ0kgc3R1ZmYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBHZW5lcmFsIFBDSSAqLworI2RlZmluZSBDT05GSUdfUENJCQkJLyogaW5jbHVkZSBwY2kgc3VwcG9ydAkgICAgICAgICovCisjdW5kZWYgQ09ORklHX1BDSV9QTlAJCQkvKiBkbyAobm90KSBwY2kgcGx1Zy1hbmQtcGxheSAgICovCisjZGVmaW5lIENPTkZJR19QQ0lfU0NBTl9TSE9XCQkvKiBzaG93IHBjaSBkZXZpY2VzIG9uIHN0YXJ0dXAgICovCisjZGVmaW5lIENGR19QQ0lfVEFSR0JBU0UgICAgICAgIDB4ODAwMDAwMDAgLyogUENJYWRkciBtYXBwZWQgdG8gQ0ZHX1BDSV9NRU1CQVNFKi8KKworLyogQm9hcmQtc3BlY2lmaWMgUENJICovCisjZGVmaW5lIENGR19QQ0lfVEFSR0VUX0lOSVQKKyNkZWZpbmUgQ0ZHX1BDSV9NQVNURVJfSU5JVAorCisjZGVmaW5lIENGR19QQ0lfU1VCU1lTX1ZFTkRPUklEIDB4MTBlOAkvKiBBTUNDCQkJCSovCisjZGVmaW5lIENGR19QQ0lfU1VCU1lTX0lEICAgICAgIDB4Y2FmZQkvKiBXaGF0ZXZlcgkJCSovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIChFQkMpIFNldHVwCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfRkxBU0gJCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19DU18xCQkweEM4MDAwMDAwIC8qIENBTiAqLworI2RlZmluZSBDRkdfQ1NfMgkJMHhDQzAwMDAwMCAvKiBDUExEIGFuZCBJTUMtQnVzIFN0YW5kYXJkICovCisjZGVmaW5lIENGR19DUExECQlDRkdfQ1NfMgorI2RlZmluZSBDRkdfQ1NfMwkJMHhDRDAwMDAwMCAvKiBDUExEIGFuZCBJTUMtQnVzIEZhc3QgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICogTWVtb3J5IEJhbmsgMCAoQk9PVC1GTEFTSCkgaW5pdGlhbGl6YXRpb24KKyAqLworI2RlZmluZSBDRkdfQk9PVEZMQVNIX0NTCQkwCS8qIEJvb3QgRmxhc2ggY2hpcCBjb25uZWN0ZWQgdG8gQ1N4CSovCisjZGVmaW5lIENGR19FQkNfUEIwQVAJCTB4MDIwMDU0MDAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjBDUgkJMHhGRkYxODAwMCAvKiAoQ0ZHX0ZMQVNIIHwgMHhkYTAwMCkgICovCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQlDRkdfRkxBU0hfQkFTRQkvKiBGTEFTSCBiYW5rICMwCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTMyCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMTIwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykJKi8KKworLyogTWVtb3J5IEJhbmsgMSBDQU4tQ2hpcHMgaW5pdGlhbGl6YXRpb24JCQkJCQkqLworI2RlZmluZSBDRkdfRUJDX1BCMUFQCQkweDAyMDU0NTAwCisjZGVmaW5lIENGR19FQkNfUEIxQ1IJCTB4QzgwMTgwMDAKKworLyogTWVtb3J5IEJhbmsgMiBDUExEL0lNQy1CdXMgc3RhbmRhcmQgaW5pdGlhbGl6YXRpb24JCQkJCQkqLworI2RlZmluZSBDRkdfRUJDX1BCMkFQCQkweDAxODQwMzAwCisjZGVmaW5lIENGR19FQkNfUEIyQ1IJCTB4Q0MwQkEwMDAKKworLyogTWVtb3J5IEJhbmsgMyBJTUMtQnVzIGZhc3QgbW9kZSBpbml0aWFsaXphdGlvbgkJCQkJCSovCisjZGVmaW5lIENGR19FQkNfUEIzQVAJCTB4MDE4MDAzMDAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjNDUgkJMHhDRTBCQTAwMAorCisvKiBNZW1vcnkgQmFuayA0IChub3QgdXNlZCkgaW5pdGlhbGl6YXRpb24JCQkJCQkqLworI3VuZGVmIENGR19FQkNfUEI0QVAKKyN1bmRlZiBDRkdfRUJDX1BCNENSCisKKy8qIE1lbW9yeSBCYW5rIDUgKG5vdCB1c2VkKSBpbml0aWFsaXphdGlvbgkJCQkJCSovCisjdW5kZWYgQ0ZHX0VCQ19QQjVBUAorI3VuZGVmIENGR19FQkNfUEI1Q1IKKworI2RlZmluZSBIQ1VfQ1BMRF9WRVJTSU9OX1JFR0lTVEVSICggQ0ZHX0NQTEQgKyAweDBGMDAwMDAgKQorI2RlZmluZSBIQ1VfSFdfVkVSU0lPTl9SRUdJU1RFUiAgICggQ0ZHX0NQTEQgKyAweDE0MDAwMDAgKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApICAvKiBGb3IgQU1DQyA0NDAgQ1BVcwkJCSovCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkgICAgICAvKiAuLi4JCQkgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJICAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjZGVmaW5lIENGR19IVVNIX1BBUlNFUiAgICAgICAgICAgICAgICAgLyogdXNlICJodXNoIiBjb21tYW5kIHBhcnNlciAgICAqLworI2lmZGVmICBDRkdfSFVTSF9QQVJTRVIKKwkjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgICAgICI+ICIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkgICAgLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCisjZW5kaWYKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaGVybWVzLmggYi9pbmNsdWRlL2NvbmZpZ3MvaGVybWVzLmgKaW5kZXggOTExMTdiYS4uZTNhMmVkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2hlcm1lcy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9oZXJtZXMuaApAQCAtNjQsMjMgKzY0LDI4IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCUNPTkZJR19DTURfREZMCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTU3LDcgKzE2Miw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9obWkxMDAxLmggYi9pbmNsdWRlL2NvbmZpZ3MvaG1pMTAwMS5oCmluZGV4IDRkODEzZDguLjZjMTViNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9obWkxMDAxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2htaTEwMDEuaApAQCAtMzgsMTEgKzM4LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCi0jZW5kaWYKLQogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9SCiAKIC8qCkBAIC01NSwyMiArNTAsMzEgQEAKIC8qIFBhcnRpdGlvbnMgKi8KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RJU1BMQVkJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRElTUExBWQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCTEJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCkBAIC0yMjIsNyArMjI2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTIzMSw2ICsyMzUsMTEgQEAKICNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCiAjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLworI2VuZGlmCisKIC8qIEVuYWJsZSBhbiBhbHRlcm5hdGUsIG1vcmUgZXh0ZW5zaXZlIG1lbW9yeSB0ZXN0ICovCiAjZGVmaW5lIENGR19BTFRfTUVNVEVTVAogCkBAIC0yNDIsOCArMjUxLDcgQEAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKIC8qCi0gKiBFbmFibGUgbG9vcHcgY29tbWFuZG8uIFRoaXMgaGFzIG9ubHkgYWZmZWN0LCBpZiBDRkdfQ01EX01FTSBpcyBkZWZpbmVkLAotICogd2hpY2ggaXMgbm9ybWFsbHkgcGFydCBvZiB0aGUgZGVmYXVsdCBjb21tYW5kcyAoQ0ZWX0NNRF9ERkwpCisgKiBFbmFibGUgbG9vcHcgY29tbWFuZC4KICAqLwogI2RlZmluZSBDT05GSUdfTE9PUFcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2h5bW9kLmggYi9pbmNsdWRlL2NvbmZpZ3MvaHltb2QuaAppbmRleCA4Y2FkOThkLi4yZjY0ZWMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaHltb2QuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaHltb2QuaApAQCAtNjksOCArNjksNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MJKi8KICNkZWZpbmUJQ09ORklHX0VUSEVSX09OX0ZDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIEZDQwkqLwpAQCAtMTc0LDMyICsxNzMsNDQgQEAKIAogI2RlZmluZSBDT05GSUdfTEFTVF9TVEFHRV9JTklUCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9BTEwgJiB+KCBcCi0JCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQkJQ0ZHX0NNRF9ESVNQTEFZCXwgXAotCQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCQlDRkdfQ01EX0ZEQwl8IFwKLQkJCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCQlDRkdfQ01EX0ZQR0EgICAgfCBcCi0JCQkJCUNGR19DTURfSFdGTE9XCXwgXAotCQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCQlDRkdfQ01EX01NQwl8IFwKLQkJCQkJQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQkJCUNGR19DTURfUENJCXwgXAotCQkJCQlDRkdfQ01EX1VTQgl8IFwKLQkJCQkJQ0ZHX0NNRF9SRUlTRVIJfCBcCi0JCQkJCUNGR19DTURfU0NTSQl8IFwKLQkJCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJCUNGR19DTURfVU5JVkVSU0V8IFwKLQkJCQkJQ0ZHX0NNRF9WRkQJfCBcCi0JCQkJCUNGR19DTURfWElNRwkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KKworI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9CTVAKKyN1bmRlZiBDT05GSUdfQ01EX0RJU1BMQVkKKyN1bmRlZiBDT05GSUdfQ01EX0RPQworI3VuZGVmIENPTkZJR19DTURfRVhUMgorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSkZGUzIKKyN1bmRlZiBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX01GU0wKKyN1bmRlZiBDT05GSUdfQ01EX01NQworI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1VTQgorI3VuZGVmIENPTkZJR19DTURfUkVJU0VSCisjdW5kZWYgQ09ORklHX0NNRF9TQ1NJCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX1VOSVZFUlNFCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKKwogCiAjaWZkZWYgREVCVUcKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQkvKiBhdXRvYm9vdCBkaXNhYmxlZAkJKi8KQEAgLTIxOCw3ICsyMjksNyBAQAogI2RlZmluZSBERUJVR19CT09US0VZUwkJMAogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lCUNPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTI0Nyw3ICsyNTgsNyBAQAogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00MDAsNyArNDExLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2lkbXIuaCBiL2luY2x1ZGUvY29uZmlncy9pZG1yLmgKaW5kZXggYjFkYmUyYy4uMWFiN2IyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2lkbXIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaWRtci5oCkBAIC03OCwxOCArNzgsMjcgQEAKIAkidS1ib290PS90ZnRwYm9vdC9pZG1yL3UtYm9vdC5iaW5cMCIJCQkJXAogCSIiCiAKLS8qCi0gKiBDb21tYW5kcycgZGVmaW5pdGlvbgotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTAkJfCBcCi0JCQkJCUNGR19DTURfUElORwkJfCBcCi0JCQkJCUNGR19DTURfSkZGUzIJCXwgXAotCQkJCQlDRkdfQ01EX05FVCkJCSYgXAotCQkJCQl+KENGR19DTURfTE9BRFMJCXwgXAotCQkJCQkJQ0ZHX0NNRF9MT0FEQikpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKworI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURCCiAKIAogLyoKQEAgLTExNSwxMSArMTI0LDExIEBACiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KLSNlbHNlIC8qICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKSAqLworI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpICovCisjZW5kaWYKIAogI2RlZmluZSBDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KICNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncyAqLwpAQCAtMjA2LDggKzIxNSw4IEBACiAJCQkJCQkiMm0ocm9vdGZzKSwiCVwKIAkJCQkJCSItKHVzZXIpIjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogI2Vycm9yIE1JSSBjb21tYW5kcyBkb24ndCB3b3JrIG9uIGlETVIgYm9hcmQgYW5kIHNob2x1ZCBub3QgYmUgZW5hYmxlZC4KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogI2VuZGlmIC8qIF9JRE1SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbXBhNy5oIGIvaW5jbHVkZS9jb25maWdzL2ltcGE3LmgKaW5kZXggOGI4NDFmZi4uMGU1MmZmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2ltcGE3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2ltcGE3LmgKQEAgLTYxLDEyICs2MSwyMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfSkZGUzIpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJkZXZmcz1tb3VudCByb290PXJhbWZzIGNvbnNvbGU9dHR5UzAsOTYwMCIKQEAgLTc3LDcgKzg4LDcgQEAKIC8qI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJImltcGE3IgkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RwO2Jvb3RtIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbmNhaXAuaCBiL2luY2x1ZGUvY29uZmlncy9pbmNhaXAuaAppbmRleCAxYzYyMTZiLi40Y2FmNTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaW5jYWlwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2luY2FpcC5oCkBAIC04MSwxNSArODEsMjkgQEAKIAkiIgogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9zZWxmIgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2lua2E0eDAuaCBiL2luY2x1ZGUvY29uZmlncy9pbmthNHgwLmgKaW5kZXggYWQzY2YwNi4uMGZhYzI4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2lua2E0eDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaW5rYTR4MC5oCkBAIC00MCwxMSArNDAsNiBAQAogCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfRgkxCS8qIFVzZSBtaXNjX2luaXRfZigpCQkJKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC03NiwyMSArNzEsMzAgQEAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0lTT19QQVJUSVRJT04KIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUNGR19DTURfVVNCCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkxCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIApAQCAtMjM5LDcgKzI0Myw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yNDgsNiArMjUyLDExIEBACiAjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLwogI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCiAvKiBFbmFibGUgYW4gYWx0ZXJuYXRlLCBtb3JlIGV4dGVuc2l2ZSBtZW1vcnkgdGVzdCAqLwogI2RlZmluZSBDRkdfQUxUX01FTVRFU1QKIApAQCAtMjU5LDggKzI2OCw3IEBACiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbm5va29tLmggYi9pbmNsdWRlL2NvbmZpZ3MvaW5ub2tvbS5oCmluZGV4IDNjYjllYmMuLjUzMTBlMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9pbm5va29tLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2lubm9rb20uaApAQCAtNTQsMTAgKzU0LDM0IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTkyMDAKICNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEJLyogd2UgaGF2ZSBhIG1pc2NfaW5pdF9yKCkgZnVuY3Rpb24gKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENGR19DTURfQkRJfENGR19DTURfTE9BREJ8Q0ZHX0NNRF9JTUl8Q0ZHX0NNRF9GTEFTSHxDRkdfQ01EX01FTU9SWXxDRkdfQ01EX05FVHxDRkdfQ01EX0VOVnxDRkdfQ01EX1JVTnxDRkdfQ01EX0FTS0VOVnxDRkdfQ01EX0VDSE98Q0ZHX0NNRF9JMkN8Q0ZHX0NNRF9ESENQfENGR19DTURfQ0FDSEUpCi0vKiBDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0kyQ3xDRkdfQ01EX0VFUFJPTXxDRkdfQ01EX05FVHxDRkdfQ01EX0pGRlMyfENGR19DTURfREhDUCkgKi8KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgICAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogLyogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJInJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAgY29uc29sZT10dHlTMCwxOTIwMCIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yYXAuaCBiL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yYXAuaAppbmRleCAyZjZlMzk5Li4xNDUyYmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaW50ZWdyYXRvcmFwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2ludGVncmF0b3JhcC5oCkBAIC02NiwxNSArNjYsMjYgQEAKICNkZWZpbmUgQ0ZHX1NFUklBTDAJCTB4MTYwMDAwMDAKICNkZWZpbmUgQ0ZHX1NFUklBTDEJCTB4MTcwMDAwMDAKIAotLyojZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX05FVCB8IENGR19DTURfUElORyB8IENGR19DTURfQkRJIHwgQ0ZHX0NNRF9QQ0kpICovCiAvKiNkZWZpbmUgQ09ORklHX05FVF9NVUxUSSAqLwotLyojZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCSAgQ09ORklHX0JPT1RQX0RFRkFVTFQgKi8KLQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENGR19DTURfSU1JIHwgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX01FTU9SWSkKIAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTIKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L210ZGJsb2NrMCBtZW09MzJNIGNvbnNvbGU9dHR5QU0wIGNvbnNvbGU9dHR5IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2ludGVncmF0b3JjcC5oIGIvaW5jbHVkZS9jb25maWdzL2ludGVncmF0b3JjcC5oCmluZGV4IDQxODlmOWMuLjY5MzEwZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yY3AuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaW50ZWdyYXRvcmNwLmgKQEAgLTcwLDE3ICs3MCwyOCBAQAogI2RlZmluZSBDRkdfU0VSSUFMMAkJMHgxNjAwMDAwMAogI2RlZmluZSBDRkdfU0VSSUFMMQkJMHgxNzAwMDAwMAogCisKIC8qCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kpCi0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0RIQ1AgfCBDRkdfQ01EX0lNSSB8IENGR19DTURfTkVUIHwgQ0ZHX0NNRF9QSU5HIHwgXAotCQkJCSBDRkdfQ01EX0JESSB8IENGR19DTURfTUVNT1JZIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfRU5WIFwKLQkJCQkpCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qICNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNpZiAwCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2l4ZHA0MjUuaCBiL2luY2x1ZGUvY29uZmlncy9peGRwNDI1LmgKaW5kZXggOWY5ZmRiMi4uYmM1ZjllMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2l4ZHA0MjUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaXhkcDQyNS5oCkBAIC01MywxNCArNTMsMjggQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0VMRiB8IENGR19DTURfUENJKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfUENJCisKIAogI2RlZmluZSBDT05GSUdfUENJCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKICNkZWZpbmUgQ09ORklHX0VFUFJPMTAwCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0vKiBUaGVzZSBhcmUgdS1ib290IGdlbmVyaWMgcGFyYW1ldGVycyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAgIDMKIC8qI2RlZmluZSBDT05GSUdfRVRIQUREUiAgICAgICAgICAwODowMDozZToyNjowYTo1YiovCkBAIC03MSw3ICs4NSw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAgICAgICJyb290PS9kZXYvbXRkYmxvY2syIHJvb3Rmc3R5cGU9Y3JhbWZzIGNvbnNvbGU9dHR5UzAsMTE1MjAwIgogI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFICAgIDIzMDQwMCAgICAgICAgICAvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVggICAyICAgICAgICAgICAgICAgLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9peGRwZzQyNS5oIGIvaW5jbHVkZS9jb25maWdzL2l4ZHBnNDI1LmgKaW5kZXggYWY0ZWNmNi4uZGE1OTIzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2l4ZHBnNDI1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2l4ZHBnNDI1LmgKQEAgLTc1LDE2ICs3NSwyNyBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAxMTUyMDAKICNkZWZpbmUgQ0ZHX0lYUDQyNV9DT05TT0xFCUlYUDQyNV9VQVJUMSAgIC8qIHdlIHVzZSBVQVJUMSBmb3IgY29uc29sZSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcpCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLS8qIFRoZXNlIGFyZSB1LWJvb3QgZ2VuZXJpYyBwYXJhbWV0ZXJzICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBjaGVjayBmb3Iga2V5cHJlc3Mgb24gYm9vdGRlbGF5PT0wICovCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9qdXBpdGVyLmggYi9pbmNsdWRlL2NvbmZpZ3MvanVwaXRlci5oCmluZGV4IDViOTc1MjYuLmI2OGM1YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9qdXBpdGVyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2p1cGl0ZXIuaApAQCAtNDEsMTEgKzQxLDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC03MSw3ICs2Niw2IEBACiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fQlVTCTB4NTAwMDAwMDAKICNkZWZpbmUgQ09ORklHX1BDSV9JT19QSFlTCUNPTkZJR19QQ0lfSU9fQlVTCiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fU0laRQkweDAxMDAwMDAwCi0jZGVmaW5lIEFERF9QQ0lfQ01EIAkJQ0ZHX0NNRF9QQ0kKICNlbmRpZgogCiAjZGVmaW5lIENGR19YTEJfUElQRUxJTklORwkxCkBAIC04NywxNSArODEsMjggQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisjZGVmaW5lIENPREZJR19DTURfUENJCisjZW5kaWYKKwogCiAvKgogICogQXV0b2Jvb3RpbmcKQEAgLTI1NCw3ICsyNjEsNyBAQAogI2lmZGVmCUNGR19IVVNIX1BBUlNFUgogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yNzEsNiArMjc4LDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2thdG1haS5oIGIvaW5jbHVkZS9jb25maWdzL2thdG1haS5oCmluZGV4IGE3ZWRhMDcuLjExMGFkNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9rYXRtYWkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mva2F0bWFpLmgKQEAgLTIxMCwyOCArMjEwLDQwIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRFRUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRVhUMgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCUNGR19DTURfU0RSQU0pCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCiAKICNkZWZpbmUJQ09ORklHX0lCTV9FTUFDNF9WNAkxCS8qIDQ0MFNQZSBoYXMgdGhpcyBFTUFDIHZlcnNpb24JKi8KICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCkBAIC0yNTQsNyArMjY2LDcgQEAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTQyMCw3ICs0MzIsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTQzMiw3ICs0NDQsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9rYjkyMDIuaCBiL2luY2x1ZGUvY29uZmlncy9rYjkyMDIuaAppbmRleCA2NTkwZjZmLi43NWQ5YzNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mva2I5MjAyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2tiOTIwMi5oCkBAIC03OCwxNyArNzgsMjkgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCTEKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkJICAgICAgICgoQ09ORklHX0NNRF9ERkwgfCBcCi0JCSAgICAgICAgQ0ZHX0NNRF9JMkMgfCBcCi0JCQlDRkdfQ01EX1BJTkcgfCBcCi0JCQlDRkdfQ01EX0RIQ1AgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0JESSB8IFwKLQkJCUNGR19DTURfRlBHQSB8IFwKLQkJCUNGR19DTURfTUlTQykpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisjdW5kZWYgQ09ORklHX0NNRF9CREkKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX01JU0MKKwogCiAjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTIDEKICNkZWZpbmUgUEhZU19TRFJBTSAweDIwMDAwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mva3ZtZTA4MC5oIGIvaW5jbHVkZS9jb25maWdzL2t2bWUwODAuaAppbmRleCA2MWNmNzA1Li41Njk4MDBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mva3ZtZTA4MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9rdm1lMDgwLmgKQEAgLTYwLDMzICs2MCw0NSBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19SVENfRFMxNjR4CiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENPTkZJR19DTURfREZMCXwgXAotCQkJCSAgQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJICBDRkdfQ01EX0NBQ0hFCQl8IFwKLQkJCQkgIENGR19DTURfREFURQkJfCBcCi0JCQkJICBDRkdfQ01EX0RIQ1AJCXwgXAotCQkJCSAgQ0ZHX0NNRF9ESUFHCQl8IFwKLQkJCQkgIENGR19DTURfRUVQUk9NCXwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYJCXwgXAotCQkJCSAgQ0ZHX0NNRF9JMkMJCXwgXAotCQkJCSAgQ0ZHX0NNRF9KRkZTMgkJfCBcCi0JCQkJICBDRkdfQ01EX05GUwkJfCBcCi0JCQkJICBDRkdfQ01EX1BDSQkJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9TRFJBTQkJfCBcCi0JCQkJICBDRkdfQ01EX1NOVFApCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDRkdfTE9OR0hFTFAKICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CkBAIC0xNzgsNyArMTkwLDcgQEAKICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkzMzMzMzMzMwogCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQgorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9sYXJ0LmggYi9pbmNsdWRlL2NvbmZpZ3MvbGFydC5oCmluZGV4IGEwMDY0MGIuLjhmMThjOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9sYXJ0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2xhcnQuaApAQCAtNTksMTAgKzU5LDIxIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkicm9vdD1yYW1mcyBkZXZmcz1tb3VudCBjb25zb2xlPXR0eVNBMCw5NjAwIgpAQCAtNzMsNyArODQsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJlbGlub3MtbGFydCIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwOyBib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbG9nb2RsLmggYi9pbmNsdWRlL2NvbmZpZ3MvbG9nb2RsLmgKaW5kZXggNzE1ZWQ3NC4uMmIyZDM3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2xvZ29kbC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9sb2dvZGwuaApAQCAtNTQsMTAgKzU0LDI2IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTkyMDAKICN1bmRlZiBDT05GSUdfTUlTQ19JTklUX1IJCS8qIEZJWE1FOiBtaXNjX2luaXRfcigpIG1pc3NpbmcgICAgICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDRkdfQ01EX0ZMQVNIfENGR19DTURfTUVNT1JZfENGR19DTURfRU5WfENGR19DTURfUlVOfENGR19DTURfQVNLRU5WfENGR19DTURfRUNITykKLS8qIENPTkZJR19DTURfREZMfENGR19DTURfSTJDfENGR19DTURfRUVQUk9NfENGR19DTURfTkVUfENGR19DTURfSkZGUzJ8Q0ZHX0NNRF9ESENQKSAqLwotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAgICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIC8qICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCSJyb290PS9kZXYvbmZzIGlwPWJvb3RwIGNvbnNvbGU9dHR5UzAsMTkyMDAiICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbHBjMjI5MnNvZGltbS5oIGIvaW5jbHVkZS9jb25maWdzL2xwYzIyOTJzb2RpbW0uaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDdiNmM2OTUuLmUzZmVmNWUKLS0tIGEvaW5jbHVkZS9jb25maWdzL2xwYzIyOTJzb2RpbW0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHBjMjI5MnNvZGltbS5oCkBAIC02NiwyNCArNjYsMzEgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9NTUMJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HKQorI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX01NQworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9scGQ3YTQwMC5oIGIvaW5jbHVkZS9jb25maWdzL2xwZDdhNDAwLmgKaW5kZXggZDdkMDQ2MC4uMDQxNDg4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2xwZDdhNDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2xwZDdhNDAwLmgKQEAgLTU1LDE5ICs1NSwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJMQkvKiBQcmludCB0aW1lc3RhbXAgaW5mbyBmb3IgaW1hZ2VzICovCiAKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogI2lmbmRlZiBVU0VfOTIwVF9NTVUKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcpICYgfihDRkdfQ01EX0NBQ0hFKSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUElORworICAgICN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCiAjZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9EQVRFKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCiAjZW5kaWYKIAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2xwZDdhNDA0LmggYi9pbmNsdWRlL2NvbmZpZ3MvbHBkN2E0MDQuaAppbmRleCA0MDAyZTY4Li4xMWVkZTk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbHBkN2E0MDQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHBkN2E0MDQuaApAQCAtNTUsMTkgKzU1LDMyIEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkxCS8qIFByaW50IHRpbWVzdGFtcCBpbmZvIGZvciBpbWFnZXMgKi8KIAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAjaWZuZGVmIFVTRV85MjBUX01NVQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykgJiB+KENGR19DTURfQ0FDSEUpKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QSU5HKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCiAjZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9EQVRFKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCiAjZW5kaWYKIAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2x1YW4uaCBiL2luY2x1ZGUvY29uZmlncy9sdWFuLmgKaW5kZXggY2JiNTljNS4uMjZkYmVjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2x1YW4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHVhbi5oCkBAIC0xMzYsNyArMTM2LDYgQEAKICNkZWZpbmUgQ09ORklHX1NQRF9FRVBST00JMQkvKiBVc2UgU1BEIEVFUFJPTSBmb3Igc2V0dXAJKi8KICNkZWZpbmUgU1BEX0VFUFJPTV9BRERSRVNTCXsweDUzLCAweDUyfQkvKiBTUEQgaTJjIHNwZCBhZGRyZXNzZXMqLwogI2RlZmluZSBDT05GSUdfRERSX0VDQwkJMQkvKiB3aXRoIEVDQyBzdXBwb3J0CQkqLwotI2RlZmluZSBDRkdfNDR4X0REUjJfQ0tUUl8xODAJMQkvKiB1c2UgMTgwIGRlZyBhZHZhbmNlCQkqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJMkMKQEAgLTIxMywzMSArMjEyLDM4IEBACiAjZGVmaW5lIENPTkZJR19IV19XQVRDSERPRwkJCS8qIHdhdGNoZG9nICovCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAkJfAlcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJCXwJXAotCQkJCUNGR19DTURfREhDUAkJfAlcCi0JCQkJQ0ZHX0NNRF9FTEYJCXwJXAotCQkJCUNGR19DTURfRUVQUk9NCQl8CVwKLQkJCQlDRkdfQ01EX0kyQwkJfAlcCi0JCQkJQ0ZHX0NNRF9JUlEJCXwJXAotCQkJCUNGR19DTURfTUlJCQl8CVwKLQkJCQlDRkdfQ01EX05FVAkJfAlcCi0JCQkJQ0ZHX0NNRF9ORlMJCXwJXAotCQkJCUNGR19DTURfUENJCQl8CVwKLQkJCQlDRkdfQ01EX1BJTkcJCXwJXAotCQkJCUNGR19DTURfUkVHSU5GTwkJfAlcCi0JCQkJQ0ZHX0NNRF9TRFJBTQkJfAlcCi0JCQkJMCkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjY1LDcgKzI3MSw3IEBACiAgKiBQQ0kgc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENJKQogCiAvKiBHZW5lcmFsIFBDSSAqLwogI2RlZmluZSBDT05GSUdfUENJCQkJLyogaW5jbHVkZSBwY2kgc3VwcG9ydAkgICAgICAgICovCkBAIC0yNzksNyArMjg1LDcgQEAKICNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQgMHgxMGU4CS8qIEFNQ0MgKi8KICNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfREVWSUNFSUQgMHg0NDAzCS8qIHdoYXRldmVyICovCiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDSSAqLworI2VuZGlmCiAKIC8qCiAgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCkBAIC0yOTMsNyArMjk5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApIC8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzA1LDcgKzMxMSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbHViYm9jay5oIGIvaW5jbHVkZS9jb25maWdzL2x1YmJvY2suaAppbmRleCBhZDEwMzViLi40YWRmMjU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbHViYm9jay5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9sdWJib2NrLmgKQEAgLTY3LDEwICs2NywyNCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01NQyB8IENGR19DTURfRkFUKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTU1DCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCTA4OjAwOjNlOjI2OjBhOjViCkBAIC04Miw3ICs5Niw3IEBACiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2x3bW9uLmggYi9pbmNsdWRlL2NvbmZpZ3MvbHdtb24uaAppbmRleCA5YjRjMDA0Li44YTgyNzAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbHdtb24uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHdtb24uaApAQCAtMTcwLDM0ICsxNzAsNDEgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX1BDRjg1NjMJCS8qIHVzZSBQaGlsaXBzIFBDRjg1NjMgUlRDCSovCiAKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CTVAKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgMAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQk1QCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKwogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0yMTAsNyArMjE3LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjc2LDcgKzI4Myw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4NDAwMDAwMDAKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMjU2IDw8IDEwKQkvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMTI4IDw8IDEwKQkvKiBSZXNlcnZlIDEyOCBrQiBmb3IgTW9uaXRvcgkqLwpAQCAtMzcwLDcgKzM3Nyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9sd21vbjUuaCBiL2luY2x1ZGUvY29uZmlncy9sd21vbjUuaAppbmRleCAxZDg3YzczLi42MDRiN2QxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbHdtb241LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2x3bW9uNS5oCkBAIC00Niw3ICs0Niw3IEBACiAKICNkZWZpbmUgQ0ZHX0JPT1RfQkFTRV9BRERSCTB4ZjAwMDAwMDAKICNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAJLyogX211c3RfIGJlIDAJCSovCi0jZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweGZjMDAwMDAwCS8qIHN0YXJ0IG9mIEZMQVNICSovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweGY4MDAwMDAwCS8qIHN0YXJ0IG9mIEZMQVNICSovCiAjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCiAjZGVmaW5lIENGR19MSU1FX0JBU0VfMCAgICAgICAgIDB4YzAwMDAwMDAKICNkZWZpbmUgQ0ZHX0xJTUVfQkFTRV8xICAgICAgICAgMHhjMTAwMDAwMApAQCAtNzQsMTEgKzc0LDEzIEBACiAvKiA0NDBFUHgvNDQwR1J4IGhhdmUgMTZLQiBvZiBpbnRlcm5hbCBTUkFNLCBzbyBubyBuZWVkIGZvciBELUNhY2hlCSovCiAjZGVmaW5lIENGR19JTklUX1JBTV9PQ00JMQkJLyogT0NNIGFzIGluaXQgcmFtCSovCiAjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCUNGR19PQ01fQkFTRQkvKiBPQ00JCQkqLworI2RlZmluZSBDRkdfT0NNX0RBVEFfQUREUglDRkdfT0NNX0JBU0UKIAogI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECSg0IDw8IDEwKQogI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkyNTYJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KICNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQotI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAorI2RlZmluZSBDRkdfUE9TVF9XT1JEX0FERFIJKENGR19HQkxfREFUQV9PRkZTRVQgLSAweDQpCisjZGVmaW5lIENGR19JTklUX1NQX09GRlNFVAlDRkdfUE9TVF9XT1JEX0FERFIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogU2VyaWFsIFBvcnQKQEAgLTEwMyw5ICsxMDUsMTEgQEAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSQkJCQkvKiBUaGUgZmxhc2ggaXMgQ0ZJIGNvbXBhdGlibGUJKi8KICNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIJCQkvKiBVc2UgY29tbW9uIENGSSBkcml2ZXIJKi8KIAotI2RlZmluZSBDRkdfRkxBU0hfQkFOS1NfTElTVAl7IENGR19GTEFTSF9CQVNFIH0KKyNkZWZpbmUgQ0ZHX0ZMQVNIMAkJMHhGQzAwMDAwMAorI2RlZmluZSBDRkdfRkxBU0gxCQkweEY4MDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQU5LU19MSVNUCXsgQ0ZHX0ZMQVNIMSwgQ0ZHX0ZMQVNIMCB9CiAKLSNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTIJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCiAjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAk1MTIJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCiAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMTIwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykJKi8KQEAgLTEzMyw4ICsxMzcsMjYgQEAKICNkZWZpbmUgQ09ORklHX0REUl9EQVRBX0VZRQkxCQkvKiB1c2UgRERSMiBvcHRpbWl6YXRpb24JKi8KICNpZiAwIC8qIHRlc3Qtb25seTogZGlzYWJsZSBFQ0MgZm9yIG5vdyAqLwogI2RlZmluZSBDT05GSUdfRERSX0VDQwkJMQkJLyogZW5hYmxlIEVDQwkJCSovCisjZGVmaW5lIENGR19QT1NUX0VDQ19PTgkJQ0ZHX1BPU1RfRUNDCisjZWxzZQorI2RlZmluZSBDRkdfUE9TVF9FQ0NfT04JCTAKICNlbmRpZgogCisvKiBQT1NUIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9NRU1PUlkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfRUNDX09OICAgfCBcCisJCQkJIENGR19QT1NUX0NQVQkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfVUFSVAkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfSTJDCSAgIHwgXAorCQkJCSBDRkdfUE9TVF9DQUNIRQkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfRlBVCSAgIHwgXAorCQkJCSBDRkdfUE9TVF9FVEhFUgkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfU1BSKQorCisjZGVmaW5lIENGR19QT1NUX0NBQ0hFX0FERFIJMHgxMDAwMDAwMAkvKiBmcmVlIHZpcnR1YWwgYWRkcmVzcwkJKi8KKyNkZWZpbmUgQ09ORklHX0xPR0JVRkZFUgorI2RlZmluZSBDRkdfQ09OU09MRV9JU19JTl9FTlYgLyogT3RoZXJ3aXNlIGl0IGNhdGNoZXMgbG9nYnVmZmVyIGFzIG91dHB1dCAqLworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJMkMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNjIsNiArMTg0LDggQEAKICNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAogCSJob3N0bmFtZT1sd21vbjVcMCIJCQkJCQlcCiAJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKKwkidW5sb2NrPXllc1wwIgkJCQkJCQlcCisJImxvZ3ZlcnNpb249MlwwIgkJCQkJCVwKIAkibmZzYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiCQkJXAogCQkibmZzcm9vdD0ke3NlcnZlcmlwfToke3Jvb3RwYXRofVwwIgkJCVwKIAkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSByd1wwIgkJCVwKQEAgLTE4Myw2ICsyMDcsOCBAQAogCSJ1cGRhdGU9cHJvdGVjdCBvZmYgRkZGODAwMDAgRkZGRkZGRkY7ZXJhIEZGRjgwMDAwIEZGRkZGRkZGOyIJXAogCQkiY3AuYiAyMDAwMDAgRkZGODAwMDAgODAwMDBcMCIJCQkgICAgICAgIFwKIAkidXBkPXJ1biBsb2FkO3J1biB1cGRhdGVcMCIJCQkJCVwKKwkibHdlX2Vudj10ZnRwIDIwMDAwMCAvdGZ0cGJvb3QuZGV2L2x3bW9uNS9lbnZfdWJvb3QuYmluOyIJXAorCQkiYXV0b3NjciAyMDAwMDBcMCIJCQkJCVwKIAkiIgogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9zZWxmIgogCkBAIC0yMTYsOSArMjQyLDYgQEAKIC8qIENvbW1lbnQgdGhpcyBvdXQgdG8gZW5hYmxlIFVTQiAxLjEgZGV2aWNlICovCiAjZGVmaW5lIFVTQl8yXzBfREVWSUNFCiAKLSNkZWZpbmUgQ01EX1VTQgkJCUNGR19DTURfVVNCCi0jZWxzZQotI2RlZmluZSBDTURfVVNCCQkJMAkvKiBubyBVU0Igb24gNDQwR1J4CQkqLwogI2VuZGlmIC8qIENPTkZJR180NDBFUFggKi8KIAogLyogUGFydGl0aW9ucyAqLwpAQCAtMjI2LDM2ICsyNDksNDkgQEAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0lTT19QQVJUSVRJT04KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgKENPTkZJR19DTURfREZMCXwJXAotCQkJICAgICAgIENGR19DTURfQVNLRU5WCXwJXAotCQkJICAgICAgIENGR19DTURfREFURQl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0RIQ1AJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9ESUFHCXwJXAotCQkJICAgICAgIENGR19DTURfRUVQUk9NCXwJXAotCQkJICAgICAgIENGR19DTURfRUxGCXwJXAotCQkJICAgICAgIENGR19DTURfRkFUCXwJXAotCQkJICAgICAgIENGR19DTURfSTJDCXwJXAotCQkJICAgICAgIENGR19DTURfSVJRCXwJXAotCQkJICAgICAgIENGR19DTURfTUlJCXwJXAotCQkJICAgICAgIENGR19DTURfTkVUCXwJXAotCQkJICAgICAgIENGR19DTURfTkZTCXwJXAotCQkJICAgICAgIENGR19DTURfUENJCXwJXAotCQkJICAgICAgIENGR19DTURfUElORwl8CVwKLQkJCSAgICAgICBDRkdfQ01EX1JFR0lORk8JfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9TRFJBTQl8CVwKLQkJCSAgICAgICBDTURfVVNCKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0xPRworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKworI2lmZGVmIENPTkZJR180NDBFUFgKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCisKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMxMCw3ICszNDYsNyBAQAogCiAvKiBNZW1vcnkgQmFuayAwIChOT1ItRkxBU0gpIGluaXRpYWxpemF0aW9uCQkJCQkqLwogI2RlZmluZSBDRkdfRUJDX1BCMEFQCQkweDAzMDUwMjAwCi0jZGVmaW5lIENGR19FQkNfUEIwQ1IJCShDRkdfRkxBU0ggfCAweGRjMDAwKQorI2RlZmluZSBDRkdfRUJDX1BCMENSCQkoQ0ZHX0ZMQVNIIHwgMHhmYzAwMCkKIAogLyogTWVtb3J5IEJhbmsgMSAoTGltZSkgaW5pdGlhbGl6YXRpb24JCQkJCQkqLwogI2RlZmluZSBDRkdfRUJDX1BCMUFQCQkweDAxMDA0MzgwCkBAIC0zMzAsMTQgKzM2NiwyNCBAQAogICogR3JhcGhpY3MgKEZ1aml0c3UgTGltZSkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBTRFJBTSBDbG9jayBmcmVxdWVuY3kgYWRqdXN0bWVudCByZWdpc3RlciAqLwotI2RlZmluZSBDRkdfTElNRV9TRFJBTV9DTE9DSwkweEMxRkMwMDAwCi0vKiBMaW1lIENsb2NrIGZyZXF1ZW5jeSBpcyB0byBzZXQgMTMzTUh6ICovCisjZGVmaW5lIENGR19MSU1FX1NEUkFNX0NMT0NLCTB4QzFGQzAwMzgKKy8qIExpbWUgQ2xvY2sgZnJlcXVlbmN5IGlzIHRvIHNldCAxMDBNSHogKi8KKyNkZWZpbmUgQ0ZHX0xJTUVfQ0xPQ0tfMTAwTUhaCTB4MDAwMDAKKyNpZiAwCisvKiBMaW1lIENsb2NrIGZyZXF1ZW5jeSBmb3IgMTMzTUh6ICovCiAjZGVmaW5lIENGR19MSU1FX0NMT0NLXzEzM01IWgkweDEwMDAwCisjZW5kaWYKIAogLyogU0RSQU0gUGFyYW1ldGVyIHJlZ2lzdGVyICovCiAjZGVmaW5lIENGR19MSU1FX01NUgkJMHhDMUZDRkZGQwotLyogU0RSQU0gcGFyYW1ldGVyIHZhbHVlICovCisvKiBTRFJBTSBwYXJhbWV0ZXIgdmFsdWU7IHdhcyAweDQxNEZCN0YyLCBjYXVzZWQgc2V2ZXJhbCB2ZXJ0aWNhbCBiYXJzCisgICBhbmQgcGl4ZWwgZmxhcmUgb24gZGlzcGxheSB3aGVuIDEzM01IeiB3YXMgY29uZmlndXJlZC4gQWNjb3JkaW5nIHRvCisgICBTRFJBTSBjaGlwIGRhdGFzaGVldCBDQVMgTGF0ZW5jeSBpcyAzIGZvciAxMzNNSHogYW5kIC03NSBTcGVlZCBHcmFkZSAqLworI2lmZGVmIENGR19MSU1FX0NMT0NLXzEzM01IWgorI2RlZmluZSBDRkdfTElNRV9NTVJfVkFMVUUJMHg0MTRGQjdGMworI2Vsc2UKICNkZWZpbmUgQ0ZHX0xJTUVfTU1SX1ZBTFVFCTB4NDE0RkI3RjIKKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBHUElPIFNldHVwCkBAIC00MzAsNyArNDc2LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJKDMyPDwxMCkgIC8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCSAgICAgIC8qIC4uLgkJCSAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CSAgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDQyLDcgKzQ4OCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCSAgICAvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL21jYzIwMC5oIGIvaW5jbHVkZS9jb25maWdzL21jYzIwMC5oCmluZGV4IGMyMzI0YTAuLmNjMmRiY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tY2MyMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbWNjMjAwLmgKQEAgLTQwLDExICs0MCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKgpAQCAtOTIsMjcgKzg3LDM3IEBACiAKIC8qIFVTQiAqLwogI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKLSNkZWZpbmUgQUREX1VTQl9DTUQJCUNGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCiAvKiBhdXRvbWF0aWMgc29mdHdhcmUgdXBkYXRlcyAoc2VlIGJvYXJkL21jYzIwMC9hdXRvX3VwZGF0ZS5jKSAqLwogI2RlZmluZSBDT05GSUdfQVVUT19VUERBVEUgMQogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworI3VuZGVmCUNPTkZJR19DTURfTkVUCisKIAogLyoKICAqIEF1dG9ib290aW5nCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTEJLyogYXV0b2Jvb3QgYWZ0ZXIgMSBzZWNvbmQgKi8KIAogI2RlZmluZSBDT05GSUdfUFJFQk9PVAkiZWNobzsiCVwKIAkiZWNobyBUeXBlIFwicnVuIGZsYXNoX25mc1wiIHRvIG1vdW50IHJvb3QgZmlsZXN5c3RlbSBvdmVyIE5GUzsiIFwKQEAgLTEyOCwyMCArMTMzLDMwIEBACiAjIGRlZmluZSBDRkdfX0xJTlVYX0NPTlNPTEUJInR0eVMwIgogI2Vsc2UKICMgZGVmaW5lIENGR19fQk9BUkROQU1FCQkibWNjMjAwIgotIyBkZWZpbmUgQ0ZHX19MSU5VWF9DT05TT0xFCSJ0dHlFVTciCisjIGRlZmluZSBDRkdfX0xJTlVYX0NPTlNPTEUJInR0eUVVNSIKICNlbmRpZgogCisvKiBOZXR3b3JrICovCisjZGVmaW5lIENPTkZJR19FVEhBRERSCTAwOjE3OjE3OmZmOjAwOjAwCisjZGVmaW5lIENPTkZJR19JUEFERFIJMTAuNzYuOS4yOQorI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJMTAuNzYuOS4xCisKKyNpbmNsdWRlIDx2ZXJzaW9uLmg+IC8qIEZvciBVLUJvb3QgdmVyc2lvbiAqLworCiAjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJCQkJCVwKKwkidWJvb3R2ZXI9IiBVX0JPT1RfVkVSU0lPTiAiXDAiCQkJCQlcCiAJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKIAkiaG9zdG5hbWU9IiBDRkdfX0JPQVJETkFNRSAiXDAiCQkJCQlcCiAJIm5mc2FyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIgkJCVwKIAkJIm5mc3Jvb3Q9JHtzZXJ2ZXJpcH06JHtyb290cGF0aH1cMCIJCQlcCi0JInJhbWFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcndcMCIJCQlcCisJInJhbWFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9tdGRibG9jazIgIgkJCVwKKwkJInJvb3Rmc3R5cGU9Y3JhbWZzXDAiCQkJCQlcCiAJImFkZGlwPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAiCQkJCVwKIAkJImlwPSR7aXBhZGRyfToke3NlcnZlcmlwfToke2dhdGV3YXlpcH06JHtuZXRtYXNrfSIJXAogCQkiOiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgcGFuaWM9MVwwIgkJCVwKIAkiYWRkY29ucz1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gIgkJCQlcCi0JCSJjb25zb2xlPSR7Y29uc29sZX0sJHtiYXVkcmF0ZX1cMCIJCQlcCisJCSJjb25zb2xlPSR7Y29uc29sZX0sJHtiYXVkcmF0ZX0gIgkJXAorCQkidWJvb3R2ZXI9JHt1Ym9vdHZlcn0gYm9hcmQ9JHtib2FyZH1cMCIJXAogCSJmbGFzaF9uZnM9cnVuIG5mc2FyZ3MgYWRkaXAgYWRkY29uczsiCQkJCVwKIAkJImJvb3RtICR7a2VybmVsX2FkZHJ9XDAiCQkJCVwKIAkiZmxhc2hfc2VsZj1ydW4gcmFtYXJncyBhZGRpcCBhZGRjb25zOyIJCQkJXApAQCAtMTUzLDYgKzE2OCw3IEBACiAJImJvb3RmaWxlPS90ZnRwYm9vdC8iIENGR19fQk9BUkROQU1FICIvdUltYWdlXDAiCQlcCiAJImxvYWQ9dGZ0cCAyMDAwMDAgL3RmdHBib290LyIgQ0ZHX19CT0FSRE5BTUUgIi91LWJvb3QuYmluXDAiCVwKIAkidGV4dF9iYXNlPSIgTUtfU1RSKFRFWFRfQkFTRSkgIlwwIgkJCQlcCisJImtlcm5lbF9hZGRyPTB4RkMwQzAwMDBcMCIJCQkJCVwKIAkidXBkYXRlPXByb3RlY3Qgb2ZmICR7dGV4dF9iYXNlfSArJHtmaWxlc2l6ZX07IgkJCVwKIAkJImVyYSAke3RleHRfYmFzZX0gKyR7ZmlsZXNpemV9OyIJCQlcCiAJCSJjcC5iIDIwMDAwMCAke3RleHRfYmFzZX0gJHtmaWxlc2l6ZX1cMCIJCVwKQEAgLTI1Myw3ICsyNjksNyBAQAogLyoKICAqIEV0aGVybmV0IGNvbmZpZ3VyYXRpb24KICAqLwotI2RlZmluZSBDT05GSUdfTVBDNXh4eF9GRUMJMQorLyojZGVmaW5lIENPTkZJR19NUEM1eHh4X0ZFQwkxKi8KIC8qCiAgKiBEZWZpbmUgQ09ORklHX0ZFQ18xME1CSVQgdG8gZm9yY2UgRkVDIGF0IDEwTWIKICAqLwpAQCAtMjkxLDcgKzMwNyw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMwNyw2ICszMjMsMTEgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJCSovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KQEAgLTMyOSw2ICszNTAsMTMgQEAKICNkZWZpbmUgQ0ZHX0NTMV9TSVpFCQkweDAwMDAxMDAwCiAjZGVmaW5lIENGR19DUzFfQ0ZHCQkweDFkMzAwCiAKKy8qIExlaWNhIC0gYnVpbGQgcmV2aXNpb24gcmVzaXN0b3JzICovCisvKgorI2RlZmluZSBDRkdfQ1MzX1NUQVJUCQkweDgwMDIwMDAwCisjZGVmaW5lIENGR19DUzNfU0laRQkJMHgwMDAwMDAwNAorI2RlZmluZSBDRkdfQ1MzX0NGRwkJMHgxZDMwMAorKi8KKwogLyoKICAqICBTZWxlY3Qgb25lIG9mIHF1YXJ0cyBhcyBhIGRlZmF1bHQKICAqIGNvbnNvbGUuIElmIHVuZGVmaW5lZCAtIFBTQyBjb25zb2xlCkBAIC0zODQsNCArNDEyLDggQEAKICNkZWZpbmUgQ09ORklHX1VTQl9DTE9DSwkweDAwMDFCQkJCCiAjZGVmaW5lIENPTkZJR19VU0JfQ09ORklHCTB4MDAwMDUwMDAKIAorI2RlZmluZSBDT05GSUdfQVVUT0JPT1RfS0VZRUQJCS8qIHVzZSBrZXkgc3RyaW5ncyB0byBzdG9wIGF1dG9ib290CSovCisjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9TVE9QX1NUUgkiNDMyIgorI2RlZmluZSBDT05GSUdfU0lMRU5UX0NPTlNPTEUJMQorCiAjZW5kaWYgLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL21lY3A1MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvbWVjcDUyMDAuaAppbmRleCAwYzEwMjk0Li40OTkxOWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbWVjcDUyMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbWVjcDUyMDAuaApAQCAtNTAsMTEgKzUwLDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC04OCwyNiArODMsMzIgQEAKIC8qIFVTQiAqLwogI2lmIDAKICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQotI2Vsc2UKLSNkZWZpbmUgQUREX1VTQl9DTUQJCTAKICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NCXwgXAotCQkJCSBDRkdfQ01EX0ZBVAl8IFwKLQkJCQkgQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX0VMRikKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAjaWYgKFRFWFRfQkFTRSA9PSAweEZGMDAwMDAwKQkJLyogQm9vdCBsb3cgd2l0aCAxNiBNQiBGbGFzaCAqLwogIyAgIGRlZmluZSBDRkdfTE9XQk9PVAkJMQpAQCAtMjU4LDcgKzI1OSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yNzYsNiArMjc3LDExIEBACiAKICNkZWZpbmUgQ0ZHX1ZYV09SS1NfTUFDX1BUUgkweDAwMDAwMDAwCS8qIFBhc3MgRXRoZXJuZXQgTUFDIHRvIFZ4V29ya3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbWwzMDAuaCBiL2luY2x1ZGUvY29uZmlncy9tbDMwMC5oCmluZGV4IDY3NjJjZDYuLjAxODMwNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tbDMwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tbDMwMC5oCkBAIC04NywxMyArODcsMjggQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgUkVNT1ZFX0NPTU1BTkRTCSAgICAgICAoQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0ZBVCB8IFwKLQkJCQlDRkdfQ01EX0lNTFMgKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgICgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX05FVCkgXAotCQkJCSYgflJFTU9WRV9DT01NQU5EUykKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX05FVAorCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyN1bmRlZiBDT05GSUdfQ01EX0ZBVAorI3VuZGVmIENPTkZJR19DTURfSU1MUworCiAKIC8qICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSBYUEFSX0NPUkVfQ0xPQ0tfRlJFUV9IWiAqLwogLyogMzAwMDAwMDAwICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbWw0MDEuaCBiL2luY2x1ZGUvY29uZmlncy9tbDQwMS5oCmluZGV4IDNkYjI4NzcuLjdlZWFlNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tbDQwMS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tbDQwMS5oCkBAIC0xNDUsODIgKzE0NSw1MCBAQAogCSNkZWZpbmUJQ0ZHX0ZMQVNIX1BST1RFQ1RJT04JCS8qIGhhcmR3YXJlIGZsYXNoIHByb3RlY3Rpb24gKi8KICNlbmRpZiAvKiAhRkxBU0ggKi8KIAotI2lmZGVmCUZMQVNICi0JI2lmZGVmCVJBTUVOVgotCSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCShDT05GSUdfX0NNRF9ERkwgfFwKLQkJCQlDRkdfQ01EX01FTU9SWSB8XAotCQkJCUNGR19DTURfTUlTQyB8XAotCQkJCUNGR19DTURfQVVUT1NDUklQVCB8XAotCQkJCUNGR19DTURfSVJRIHxcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYgfFwKLQkJCQlDRkdfQ01EX0JESSB8XAotCQkJCUNGR19DTURfUlVOIHxcCi0JCQkJQ0ZHX0NNRF9MT0FEUyB8XAotCQkJCUNGR19DTURfTE9BREIgfFwKLQkJCQlDRkdfQ01EX0lNSSB8XAotCQkJCUNGR19DTURfTkVUIHxcCi0JCQkJQ0ZHX0NNRF9DQUNIRSB8XAotCQkJCUNGR19DTURfRkFUIHxcCi0JCQkJQ0ZHX0NNRF9FWFQyIHxcCi0JCQkJQ0ZHX0NNRF9KRkZTMiB8XAotCQkJCUNGR19DTURfRUNITyB8XAotCQkJCUNGR19DTURfSU1MUyB8XAotCQkJCUNGR19DTURfRkxBU0ggfFwKLQkJCQlDRkdfQ01EX01GU0wgfFwKLQkJCQlDRkdfQ01EX1BJTkcgXAotCQkJCSkKLQkjZWxzZQkvKiAhUkFNRU5WICovCi0JI2RlZmluZQlDT05GSUdfQ09NTUFORFMJKENPTkZJR19fQ01EX0RGTCB8XAotCQkJCUNGR19DTURfTUVNT1JZIHxcCi0JCQkJQ0ZHX0NNRF9NSVNDIHxcCi0JCQkJQ0ZHX0NNRF9BVVRPU0NSSVBUIHxcCi0JCQkJQ0ZHX0NNRF9JUlEgfFwKLQkJCQlDRkdfQ01EX0FTS0VOViB8XAotCQkJCUNGR19DTURfQkRJIHxcCi0JCQkJQ0ZHX0NNRF9SVU4gfFwKLQkJCQlDRkdfQ01EX0xPQURTIHxcCi0JCQkJQ0ZHX0NNRF9MT0FEQiB8XAotCQkJCUNGR19DTURfSU1JIHxcCi0JCQkJQ0ZHX0NNRF9ORVQgfFwKLQkJCQlDRkdfQ01EX0NBQ0hFIHxcCi0JCQkJQ0ZHX0NNRF9JTUxTIHxcCi0JCQkJQ0ZHX0NNRF9GTEFTSCB8XAotCQkJCUNGR19DTURfUElORyB8XAotCQkJCUNGR19DTURfRU5WIHxcCi0JCQkJQ0ZHX0NNRF9GQVQgfFwKLQkJCQlDRkdfQ01EX0VYVDIgfFwKLQkJCQlDRkdfQ01EX0pGRlMyIHxcCi0JCQkJQ0ZHX0NNRF9FQ0hPIHxcCi0JCQkJQ0ZHX0NNRF9NRlNMIHxcCi0JCQkJQ0ZHX0NNRF9TQVZFUyBcCi0JCQkJKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTUlTQworI2RlZmluZSBDT05GSUdfQ01EX01GU0wKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKKyNpZiBkZWZpbmVkKEZMQVNIKQorCSNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisJI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisJI2RlZmluZSBDT05GSUdfQ01EX0lNTFMKKwkjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKworCSNpZiAhZGVmaW5lZChSQU1FTlYpCisJCSNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKwkJI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCiAJI2VuZGlmCisjZW5kaWYKIAotI2Vsc2UJLyogIUZMQVNIICovCi0JI2RlZmluZQlDT05GSUdfQ09NTUFORFMJKENPTkZJR19fQ01EX0RGTCB8XAotCQkJCUNGR19DTURfTUVNT1JZIHxcCi0JCQkJQ0ZHX0NNRF9NSVNDIHxcCi0JCQkJQ0ZHX0NNRF9BVVRPU0NSSVBUIHxcCi0JCQkJQ0ZHX0NNRF9JUlEgfFwKLQkJCQlDRkdfQ01EX0FTS0VOViB8XAotCQkJCUNGR19DTURfQkRJIHxcCi0JCQkJQ0ZHX0NNRF9SVU4gfFwKLQkJCQlDRkdfQ01EX0xPQURTIHxcCi0JCQkJQ0ZHX0NNRF9GQVQgfFwKLQkJCQlDRkdfQ01EX0VYVDIgfFwKLQkJCQlDRkdfQ01EX0xPQURCIHxcCi0JCQkJQ0ZHX0NNRF9JTUkgfFwKLQkJCQlDRkdfQ01EX05FVCB8XAotCQkJCUNGR19DTURfQ0FDSEUgfFwKLQkJCQlDRkdfQ01EX01GU0wgfFwKLQkJCQlDRkdfQ01EX1BJTkcgXAotCQkJCSkKLSNlbmRpZgkvKiAhRkxBU0ggKi8KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIC8qIEpGRlMyIHBhcnRpdGlvbnMgKi8KICNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUJLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KICNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPW1sNDAxLTAiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbW9kbmV0NTAuaCBiL2luY2x1ZGUvY29uZmlncy9tb2RuZXQ1MC5oCmluZGV4IDIwMjg3NjcuLjQ0NjFiZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tb2RuZXQ1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tb2RuZXQ1MC5oCkBAIC02MywxMiArNjMsMjMgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTM4NDAwCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgICAgICAgKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfSkZGUzIpKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKIAogI2RlZmluZSBDT05GSUdfTkVUTUFTSyAgICAgICAgICAyNTUuMjU1LjI1NS4wCiAjZGVmaW5lIENPTkZJR19JUEFERFIJCTE5Mi4xNjguMzAuMgpAQCAtODEsNyArOTIsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDB4MTAwMjAwMDAgMHgxMDBhMDAwMCIKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkiY29uc29sZT10dHlTMCwzODQwMCBpbml0cmQ9MHgxMDBhMDA0MCw1MzBLIHJvb3Q9L2Rldi9yYW0ga2VlcGluaXRyZCIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbW90aW9ucHJvLmggYi9pbmNsdWRlL2NvbmZpZ3MvbW90aW9ucHJvLmgKaW5kZXggZTM4OTlhNS4uZTBhODI3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL21vdGlvbnByby5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tb3Rpb25wcm8uaApAQCAtMzcsMjggKzM3LDM1IEBACiAKIAogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9JTU1BUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9EVFQpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL21wMnVzYi5oIGIvaW5jbHVkZS9jb25maWdzL21wMnVzYi5oCmluZGV4IDA0ZjFmMjQuLmVhNWE0NGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tcDJ1c2IuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbXAydXNiLmgKQEAgLTEwMSwxMiArMTAxLDE4IEBACiAKICN1bmRlZglDT05GSUdfTU9ERU1fU1VQUE9SVAkJLyogZGlzYWJsZSBtb2RlbSBpbml0aWFsaXphdGlvbiBzdHVmZiAqLwogCi0jZGVmaW5lIENPTkZJR19VU0JfT0hDSQkJMQorI2RlZmluZSBDT05GSUdfVVNCX09IQ0lfTkVXCTEKICNkZWZpbmUgQ09ORklHX1VTQl9LRVlCT0FSRAkxCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQkxCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCTEKICNkZWZpbmUgQ09ORklHX0FUOTFDX1BRRlBfVUhQQlVHIDEKIAorI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkJMQorI2RlZmluZSBDRkdfVVNCX09IQ0lfUkVHU19CQVNFCQlBVDkxX1VTQl9IT1NUX0JBU0UKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkJImF0OTFybTkyMDAiCisjZGVmaW5lIENGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUwkxNQorCiAjdW5kZWYgQ09ORklHX0hBUkRfSTJDCiAKICNpZmRlZiBDT05GSUdfSEFSRF9JMkMKQEAgLTEyMyw0MCArMTI5LDU2IEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWSAgICAgIDMKIAotI2lmZGVmIENPTkZJR19IQVJEX0kyQwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkJICAgICAgICgoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQlDRkdfQ01EX0RIQ1AgCXwgXAotCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQlDRkdfQ01EX0kyQwl8IFwKLQkJCUNGR19DTURfTkZTCXwgXAotCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJQ0ZHX0NNRF9NSVNDKSkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCUNGR19DTURfREhDUCAJfCBcCi0JCQlDRkdfQ01EX05GUwl8IFwKLQkJCUNGR19DTURfU05UUAl8IFwKLQkJCUNGR19DTURfVVNCICAgICAgfCBcCi0JCQlDRkdfQ01EX0NBQ0hFKQkmIFwKLQkJICAgICAgfihDRkdfQ01EX0JESSB8IFwKLQkJCUNGR19DTURfSU1JIHwgXAotCQkJQ0ZHX0NNRF9BVVRPU0NSSVBUIHwgXAotCQkJQ0ZHX0NNRF9GUEdBIHwgXAotCQkJQ0ZHX0NNRF9NSVNDIHwgXAotCQkJQ0ZHX0NNRF9MT0FEUyApKQorI2lmICFkZWZpbmVkKENPTkZJR19IQVJEX0kyQykKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAogI2VuZGlmCi0jZGVmaW5lIENGR19MT05HSEVMUAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpCisKKyAgICAjZGVmaW5lIENPTkZJR19DTURfREFURQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyAgICAjZGVmaW5lIENPTkZJR19DTURfSTJDCisgICAgI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKworI2Vsc2UKKworICAgICNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyAgICAjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKworICAgICN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9CREkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisgICAgI3VuZGVmIENPTkZJR19DTURfSU1JCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9NSVNDCisKKyNlbmRpZgorCisKKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCiAKICNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQogI2RlZmluZSBQSFlTX1NEUkFNCQkweDIwMDAwMDAwCi0jZGVmaW5lIFBIWVNfU0RSQU1fU0laRQkJMHgwODAwMDAwMCAJLyogMTI4IG1lZ3MgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV9TSVpFCQkweDA4MDAwMDAwCS8qIDEyOCBtZWdzICovCiAKICNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJUEhZU19TRFJBTQogI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCUNGR19NRU1URVNUX1NUQVJUICsgUEhZU19TRFJBTV9TSVpFIC0gMjYyMTQ0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbXBjNzQ0OGhwYzIuaCBiL2luY2x1ZGUvY29uZmlncy9tcGM3NDQ4aHBjMi5oCmluZGV4IDI0M2EzZjYuLmY0ZjMzZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tcGM3NDQ4aHBjMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tcGM3NDQ4aHBjMi5oCkBAIC0xNDYsMjUgKzE0NiwzNCBAQAogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQlDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIFwKLQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCXwgQ0ZHX0NNRF9DQUNIRSBcCi0JCXwgQ0ZHX0NNRF9QQ0kgXAotCQl8IENGR19DTURfSTJDIFwKLQkJfCBDRkdfQ01EX1NEUkFNIFwKLQkJfCBDRkdfQ01EX0VFUFJPTSBcCi0JCXwgQ0ZHX0NNRF9GTEFTSCBcCi0JCXwgQ0ZHX0NNRF9FTlYgXAotCQl8IENGR19DTURfQlNQIFwKLQkJfCBDRkdfQ01EX0RIQ1AgXAotCQl8IENGR19DTURfUElORyBcCi0JCXwgQ0ZHX0NNRF9EQVRFKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAKIC8qc2V0IGRhdGUgaW4gdS1ib290Ki8KICNkZWZpbmUgQ09ORklHX1JUQ19NNDhUMzVBCkBAIC0xODIsNyArMTkxLDcgQEAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeSAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0IGF0ICovCiAjZWxzZQpAQCAtMzY2LDkgKzM3NSw5IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGTEFTSCBvcmdhbml6YXRpb24KICAqLwotI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEvKiBGbGFzaCBjYW4gYmUgYXQgb25lIG9mIHR3byBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBGbGFzaCBjYW4gYmUgYXQgb25lIG9mIHR3byBhZGRyZXNzZXMgKi8KICNkZWZpbmUgRkxBU0hfQkFOS19TSVpFCQkweDAxMDAwMDAwCS8qIDE2IE1CIFRvdGFsICovCi0jZGVmaW5lIENGR19GTEFTSF9CQU5LU19MSVNUIHtDRkdfRkxBU0hfQkFTRSwgQ0ZHX0ZMQVNIX0JBU0UyfQorI2RlZmluZSBDRkdfRkxBU0hfQkFOS1NfTElTVAl7IENGR19GTEFTSF9CQVNFLCAvKiBDRkdfRkxBU0hfQkFTRTIgKi8gfQogCiAjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCiAjZGVmaW5lIENGR19GTEFTSF9DRkkKQEAgLTM4Nyw3ICszOTYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9teDFhZHMuaCBiL2luY2x1ZGUvY29uZmlncy9teDFhZHMuaAppbmRleCA3ZjNkZmQ1Li41MTI1YjIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbXgxYWRzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL214MWFkcy5oCkBAIC03OCwyNSArNzgsMzIgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1hbmQgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyBcCi0JCQkoQ09ORklHX0NNRF9ERkwJIHwgXAotCQkJQ0ZHX0NNRF9DQUNIRQkgfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8JIHwgXAotCQkJQ0ZHX0NNRF9FTEYpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L21zZGsgbWVtPTQ4TSIKICNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkibXgxYWRzIgogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInRmdHA7IGJvb3RtIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogCQkJCQkJLyogd2hhdCdzIHRoaXMgPyBpdCdzIG5vdCB1c2VkIGFueXdoZXJlICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9teDFmczIuaCBiL2luY2x1ZGUvY29uZmlncy9teDFmczIuaAppbmRleCA5ODE2YmU4Li5kNTI3ZDA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbXgxZnMyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL214MWZzMi5oCkBAIC0zNCwyMiArMzQsMzAgQEAKICN1bmRlZglfQ09ORklHX1VBUlQ0IC8qIGludGVybmFsIHVhcnQgNCAqLwogI3VuZGVmCUNPTkZJR19TSUxFTlRfQ09OU09MRSAgLyogdXNlIHRoaXMgdG8gZGlzYWJsZSBvdXRwdXQgKi8KIAotLyoKLSAqIERlZmluaXRpb24gb2YgdS1ib290IGJ1aWxkIGluIGNvbW1hbmRzLiBDaGVjayBvdXQgQ09ORklHX0NNRF9ERkwgaWYKLSAqIG5lY2Nlc3NhcnkgaW4gaW5jbHVkZS9jbWRfY29uZmRlZnMuaCBmaWxlLiAoVW4pY29tbWVudCBmb3IgZ2V0dGluZwotICogZnVuY3Rpb25hbGl0eSBvciBzaXplIG9mIHUtYm9vdCBjb2RlLgotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCQkgXAotCQkJCSYgfkNGR19DTURfTE9BRFMJIFwKLQkJCQkmIH5DRkdfQ01EX0NPTlNPTEUJIFwKLQkJCQkmIH5DRkdfQ01EX0FVVE9TQ1JJUFQJIFwKLQkJCQkmIH5DRkdfQ01EX05FVAkJIFwKLQkJCQkmIH5DRkdfQ01EX1BJTkcJCSBcCi0JCQkJJiB+Q0ZHX0NNRF9ESENQCQkgXAotCQkJCXwgQ0ZHX0NNRF9KRkZTMgkJIFwKLQkJCQkpCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfQ09OU09MRQorI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI3VuZGVmIENPTkZJR19DTURfTkVUCisjdW5kZWYgQ09ORklHX0NNRF9QSU5HCisjdW5kZWYgQ09ORklHX0NNRF9ESENQCisKIAogLyoKICAqIEJvb3Qgb3B0aW9ucy4gU2V0dGluZyBkZWxheSB0byAtMSBzdG9wcyBhdXRvc3RhcnQgY291bnQgZG93bi4KQEAgLTE2MCw3ICsxNjgsNyBAQAogICogUmlnaHQgbm93IHRoZXJlIGlzIG5vIGdhaW4gZm9yIHVzZXIsIGJ1dCBsYXRlciBvbiBib290aW5nIGtlcm5lbCBtaWdodCBiZQogICogcG9zc2libGUuIENvbnNpZGVyIHVzaW5nIFhJUCBrZXJuZWwgcnVubmluZyBmcm9tIGZsYXNoIHRvIHNhdmUgUkFNCiAgKiBmb290cHJpbnQuCi0gKiBOT1RFOiBFbmFibGUgQ0ZHX0NNRF9KRkZTMiBmb3IgSkZGUzIgc3VwcG9ydC4KKyAqIE5PVEU6IEVuYWJsZSBDT05GSUdfQ01EX0pGRlMyIGZvciBKRkZTMiBzdXBwb3J0LgogICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbmV0c3Rhci5oIGIvaW5jbHVkZS9jb25maWdzL25ldHN0YXIuaAppbmRleCA2OTc3OTZhLi4zMzE1OWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbmV0c3Rhci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9uZXRzdGFyLmgKQEAgLTE0MCw0MyArMTQwLDM4IEBACiAjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1vbWFwZmxhc2guMCxuYW5kMD1vbWFwbmFuZC4wIgogI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1vbWFwZmxhc2guMDo4a0AxNmsoZW52KSw4ayhyX2VudiksNDQ4a0A1NzZrKHUtYm9vdCk7b21hcG5hbmQuMDo0OE0ocm9vdGZzMCksNDhNKHJvb3RmczEpLC0oZGF0YSkiCiAKLSNpZiAwCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQkRJICAgIHwgXAotCQkJCSBDRkdfQ01EX0JPT1REICB8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQICAgfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNIICB8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkgICAgfCBcCi0JCQkJIENGR19DTURfTE9BREIgIHwgXAotCQkJCSBDRkdfQ01EX05FVCAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9NRU1PUlkgfCBcCi0JCQkJIENGR19DTURfUElORyAgIHwgXAotCQkJCSBDRkdfQ01EX1JVTikKIAotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkgICAgfCBcCi0JCQkJIENGR19DTURfQk9PVEQgIHwgXAotCQkJCSBDRkdfQ01EX0RIQ1AgICB8IFwKLQkJCQkgQ0ZHX0NNRF9FTlYJfCBcCi0JCQkJIENGR19DTURfRkxBU0ggIHwgXAotCQkJCSBDRkdfQ01EX05BTkQJfCBcCi0JCQkJIENGR19DTURfSU1JICAgIHwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0xPQURCICB8IFwKLQkJCQkgQ0ZHX0NNRF9ORVQgICAgfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX1BJTkcgICB8IFwKLQkJCQkgQ0ZHX0NNRF9SVU4pCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogI2RlZmluZSBDT05GSUdfSkZGUzJfTkFORAkxCS8qIGpmZnMyIG9uIG5hbmQgc3VwcG9ydCAqLwotI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCiAjZGVmaW5lIENPTkZJR19MT09QVwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBhbGxvdyB0byBicmVhayBpbiBhbHdheXMgKi8KICN1bmRlZiAgQ09ORklHX0JPT1RBUkdTCQkvKiB0aGUgYm9vdCBjb21tYW5kIHdpbGwgc2V0IGJvb3RhcmdzKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9uczk3NTBkZXYuaCBiL2luY2x1ZGUvY29uZmlncy9uczk3NTBkZXYuaAppbmRleCAwYjE1NDFkLi4xZDY5MWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbnM5NzUwZGV2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL25zOTc1MGRldi5oCkBAIC02OSwzMyArNjksMjggQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTM4NDAwCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29tbWFuZCBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgMCAvKiBAVE9ETyAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgXAotCQkJKENPTkZJR19DTURfREZMCSB8IFwKLQkJCUNGR19DTURfQ0FDSEUJIHwgXAotCQkJLypDRkdfQ01EX05BTkQJIHwqLyBcCi0JCQkvKkNGR19DTURfRUVQUk9NIHwqLyBcCi0JCQkvKkNGR19DTURfSTJDCSB8Ki8gXAotCQkJLypDRkdfQ01EX1VTQgkgfCovIFwKLQkJCUNGR19DTURfUkVHSU5GTyAgfCBcCi0JCQlDRkdfQ01EX0RBVEUJIHwgXAotCQkJQ0ZHX0NNRF9FTEYpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgXAotCQkJKENPTkZJR19DTURfQkRJIHwgXAotCQkJQ0ZHX0NNRF9ORVQgfCBcCi0JCQlDRkdfQ01EX1BJTkcJIHwgXAotCQkJQ0ZHX0NNRF9DT05TT0xFCSB8IFwKLQkJCUNGR19DTURfTE9BREIJIHwgXAotCQkJQ0ZHX0NNRF9MT0FEUwkgfCBcCi0JCQlDRkdfQ01EX01FTU9SWSkKLSNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQ09OU09MRQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIC8qI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PXJhbWZzIGRldmZzPW1vdW50IGNvbnNvbGU9dHR5U0EwLDk2MDAiICovCkBAIC0xMDgsNyArMTAzLDcgQEAKIC8qI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJImVsaW5vcy1sYXJ0IiAqLwogLyojZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cDsgYm9vdG0iICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL28yZG50LmggYi9pbmNsdWRlL2NvbmZpZ3MvbzJkbnQuaAppbmRleCA2M2QwZGE3Li5mMWQ3M2U0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbzJkbnQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbzJkbnQuaApAQCAtMzcsMTEgKzM3LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC03Myw4ICs2OCw2IEBACiAjZGVmaW5lIENGR19SWF9FVEhfQlVGRkVSCTggIC8qIHVzZSA4IHJ4IGJ1ZmZlciBvbiBlZXBybzEwMCAgKi8KICNkZWZpbmUgQ09ORklHX05TODM4MlgJCTEKIAotI2RlZmluZSBBRERfUENJX0NNRCAJCUNGR19DTURfUENJCi0KIC8qIFBhcnRpdGlvbnMgKi8KICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTgyLDIwICs3NSwyOSBAQAogCiAjZGVmaW5lIENPTkZJR19USU1FU1RBTVAJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUFERF9QQ0lfQ01ECSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKwogCiAjaWYgKFRFWFRfQkFTRSA9PSAweEZGMDAwMDAwKQkJLyogQm9vdCBsb3cgd2l0aCAxNiBNQiBGbGFzaCAqLwogIyAgIGRlZmluZSBDRkdfTE9XQk9PVAkJMQpAQCAtMjQ2LDcgKzI0OCw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yNjIsNiArMjY0LDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL29jb3RlYS5oIGIvaW5jbHVkZS9jb25maWdzL29jb3RlYS5oCmluZGV4IDY4ZThjZWMuLmJjMmZkMzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vY290ZWEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvb2NvdGVhLmgKQEAgLTIzMiwyNiArMjMyLDM4IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjYwLDcgKzI3Miw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMxMCw3ICszMjIsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgJLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zMjIsNyArMzM0LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMGlubi5oIGIvaW5jbHVkZS9jb25maWdzL29tYXAxNTEwaW5uLmgKaW5kZXggMDE2ZDNkOC4uODYyM2VkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29tYXAxNTEwaW5uLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL29tYXAxNTEwaW5uLmgKQEAgLTg2LDExICs4NiwyNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQKQotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfREVGQVVMVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKworCiAjaW5jbHVkZSA8Y29uZmlncy9vbWFwMTUxMC5oPgogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwpAQCAtOTgsNyArMTExLDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290cDt0ZnRwO2Jvb3RtIgogI2RlZmluZSBDRkdfQVVUT0xPQUQJCSJuIgkJLyogTm8gYXV0b2xvYWQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIC8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE2MTBoMi5oIGIvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaDIuaAppbmRleCBjNmNhNjg5Li43NGJiYTA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE2MTBoMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9vbWFwMTYxMGgyLmgKQEAgLTgxLDExICs4MSwyNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCkKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKwogI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKQEAgLTkzLDcgKzEwNiw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCAgICAgICJib290cDt0ZnRwO2Jvb3RtIgogI2RlZmluZSBDRkdfQVVUT0xPQUQgICAgICAgICAgICAibiIgICAgICAgICAgICAgLyogTm8gYXV0b2xvYWQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaW5uLmggYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE2MTBpbm4uaAppbmRleCBmMjhlZGUwLi43MzRmMzU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE2MTBpbm4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE2MTBpbm4uaApAQCAtODIsMTEgKzgyLDI0IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkxMTUyMDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQKQotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfREVGQVVMVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKworCiAjaW5jbHVkZSA8Y29uZmlncy9vbWFwMTUxMC5oPgogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwpAQCAtOTgsNyArMTExLDcgQEAKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCTE1Ni4xMTcuOTcuMTM5CS8qIGN1cnJlbnQgSVAgb2YgbXkgZGV2IHBjICovCiAjZGVmaW5lIENPTkZJR19CT09URklMRQkidUltYWdlIgkvKiBmaWxlIHRvIGxvYWQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaCBiL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmgKaW5kZXggNTgzNzQ2MS4uOGFlOGVmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oCkBAIC0xMTksMTUgKzExOSwzNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgICAgICB7OTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwfQogCi0jaWZkZWYgQ0ZHX05BTkRfQk9PVAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9JMkMgfCBDRkdfQ01EX05BTkQgfCBDRkdfQ01EX0pGRlMyKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgICgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0RIQ1AgfCBDRkdfQ01EX0kyQyB8IENGR19DTURfSkZGUzIpICYgfkNGR19DTURfQVVUT1NDUklQVCkKLSNlbmRpZgotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyAgICAgICAgQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNpZmRlZiBDRkdfTkFORF9CT09UCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSTJDCisgICAgI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNlbHNlCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSTJDCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjZW5kaWYKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKwogCiAvKgogICogIEJvYXJkIE5BTkQgSW5mby4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vbWFwNTkxMm9zay5oIGIvaW5jbHVkZS9jb25maWdzL29tYXA1OTEyb3NrLmgKaW5kZXggNWRiNGY1Mi4uMTZjZTJmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29tYXA1OTEyb3NrLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL29tYXA1OTEyb3NrLmgKQEAgLTg2LDExICs4NiwyNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCkKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKwogI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKQEAgLTEwMiw3ICsxMTUsNyBAQAogI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJMTU2LjExNy45Ny4xMzkJLyogY3VycmVudCBJUCBvZiBteSBkZXYgcGMgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCSJ1SW1hZ2UiCS8qIGZpbGUgdG8gbG9hZCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvb21hcDczMHAyLmggYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDczMHAyLmgKaW5kZXggZmRhNTVjZi4uYzRkMjUzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29tYXA3MzBwMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9vbWFwNzMwcDIuaApAQCAtOTAsMTQgKzkwLDI0IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJICAgMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQkgICB7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0RIQ1ApCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCSAgIENPTkZJR19CT09UUF9ERUZBVUxUCiAKIC8qCi0gKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KICAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCisKICNpbmNsdWRlIDxjb25maWdzL29tYXA3MzAuaD4KICNpbmNsdWRlIDxjb25maWdzL2gyX3AyX2RiZ19ib2FyZC5oPgogCkBAIC0xMTIsNyArMTIyLDcgQEAKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkgICAxOTIuMTUwLjAuMTAwCiAjZGVmaW5lIENPTkZJR19CT09URklMRQkJICAgInVJbWFnZSIgIC8qIEZpbGUgdG8gbG9hZCAqLwogCi0jaWYgZGVmaW5lZCAoQ09ORklHX0NPTU1BTkRTKSAmJiBkZWZpbmVkIChDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCSAgIDExNTIwMCAgICAvKiBTcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJICAgMQkgICAgIC8qIFdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcDNteC5oIGIvaW5jbHVkZS9jb25maWdzL3AzbXguaAppbmRleCA1NDQ2MmYwLi44YWUzOGNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcDNteC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9wM214LmgKQEAgLTI1MSwyNiArMjUxLDM2IEBACiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfQ0FDSEUgICB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMjgwLDcgKzI5MCw3IEBACiAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTQyMSw3ICs0MzEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcwkJICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3AzcDQ0MC5oIGIvaW5jbHVkZS9jb25maWdzL3AzcDQ0MC5oCmluZGV4IDIyZjlmODQuLjUxZjE5YTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wM3A0NDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcDNwNDQwLmgKQEAgLTE2OCwyNSArMTY4LDM3IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xOTUsNyArMjA3LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMDQsNyArMzE2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTMxNiw3ICszMjgsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3BiMXgwMC5oIGIvaW5jbHVkZS9jb25maWdzL3BiMXgwMC5oCmluZGV4IGVkMTg5M2YuLjgxMGUwZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wYjF4MDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcGIxeDAwLmgKQEAgLTEzMiwxMSArMTMyLDggQEAKIC8qLS0tVVNCIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2lmIDAKICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01EICAgICAgICAgICAgIENGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICAwCiAjZW5kaWYKIAogLyotLS1BVEEgUENNQ0lBIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNzksMTEgKzE3NiwzNiBAQAogI2RlZmluZSBDRkdfSUNBQ0hFX1NJWkUJCTE2Mzg0CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwlcCi0gICgoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX01JSSB8IENGR19DTURfUElORykgJiBcCi0gfihDRkdfQ01EX0VOViB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfRlBHQSB8IENGR19DTURfSURFIHwgXAotICAgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfUlVOIHwgQ0ZHX0NNRF9MT0FEQiB8IENGR19DTURfRUxGIHwgXAotICAgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0JFREJVRykpIHwgQUREX1VTQl9DTUQpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCisjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyN1bmRlZiBDT05GSUdfQ01EX0ZBVAorI3VuZGVmIENPTkZJR19DTURfRkxBU0gKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyN1bmRlZiBDT05GSUdfQ01EX1JVTgorI3VuZGVmIENPTkZJR19DTURfTE9BREIKKyN1bmRlZiBDT05GSUdfQ01EX0VMRgorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKIAogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wY3M0NDBlcC5oIGIvaW5jbHVkZS9jb25maWdzL3BjczQ0MGVwLmgKaW5kZXggNzUxYjUxMi4uOGU1MWQyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BjczQ0MGVwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BjczQ0MGVwLmgKQEAgLTEwNiwxOSArMTA2LDI2IEBACiAjaWZkZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAogI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDEwMDAwCS8qIHNpemUgb2Ygb25lIGNvbXBsZXRlIHNlY3RvcgkJKi8KICNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRS1DRkdfRU5WX1NFQ1RfU0laRSkKLSNkZWZpbmUJQ0ZHX0VOVl9TSVpFCQkweDIwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDIwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKworI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCiAKIC8qIEFkZHJlc3MgYW5kIHNpemUgb2YgUmVkdW5kYW50IEVudmlyb25tZW50IFNlY3RvcgkqLwogI2RlZmluZSBDRkdfRU5WX0FERFJfUkVEVU5ECShDRkdfRU5WX0FERFItQ0ZHX0VOVl9TRUNUX1NJWkUpCiAjZGVmaW5lIENGR19FTlZfU0laRV9SRURVTkQJKENGR19FTlZfU0laRSkKICNlbmRpZiAvKiBDRkdfRU5WX0lTX0lOX0ZMQVNIICovCiAKKyNkZWZpbmUgRU5WX05BTUVfUkVWTEVWCSJyZXZpc2lvbl9sZXZlbCIKKyNkZWZpbmUgRU5WX05BTUVfU09MREVSCSJzb2xkZXJfc3dpdGNoIgorI2RlZmluZSBFTlZfTkFNRV9ESVAJImRpcCIKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRERSIFNEUkFNCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDT05GSUdfU1BEX0VFUFJPTSAgICAgICAgICAgICAgIC8qIFVzZSBTUEQgRUVQUk9NIGZvciBzZXR1cCAgICAgICAgICAgICAqLwogI3VuZGVmIENPTkZJR19ERFJfRUNDCQkJLyogZG9uJ3QgdXNlIEVDQwkJCSovCiAjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUyAgICAgIHsweDUwfQorI2RlZmluZQlDT05GSUdfUFJPR19TRFJBTV9UTEIJMQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJMkMKQEAgLTE0Myw2ICsxNTAsOCBAQAogI2RlZmluZQlDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCiAJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKIAkiaG9zdG5hbWU9cGNzNDQwZXBcMCIJCQkJCQlcCisJInVzZV9lZXByb21fZXRoYWRkcj1kZWZhdWx0XDAiCQkJCQlcCisJImNzX3Rlc3Q9b2ZmXDAiCQkJCQkJCVwKIAkibmZzYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiCQkJXAogCQkibmZzcm9vdD0ke3NlcnZlcmlwfToke3Jvb3RwYXRofVwwIgkJCVwKIAkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSByd1wwIgkJCVwKQEAgLTE3Myw2ICsxODIsMzYgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogI2VuZGlmCiAKKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87IiBcCisJImVjaG8gVHlwZSBcInJ1biBmbGFzaF9uZnNcIiB0byBtb3VudCByb290IGZpbGVzeXN0ZW0gb3ZlciBORlM7IiBcCisJImVjaG8iCisKKy8qIGNoZWNrIFUtQm9vdCBpbWFnZSB3aXRoIFNIQTEgc3VtICovCisjZGVmaW5lIENPTkZJR19TSEExX0NIRUNLX1VCX0lNRwkxCisjZGVmaW5lIENPTkZJR19TSEExX1NUQVJUCQlDRkdfTU9OSVRPUl9CQVNFCisjZGVmaW5lIENPTkZJR19TSEExX0xFTgkJCUNGR19NT05JVE9SX0xFTgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9ucyBmb3Igc3RhdHVzIExFRAorICovCisjZGVmaW5lIENPTkZJR19TVEFUVVNfTEVECTEJLyogU3RhdHVzIExFRCBlbmFibGVkCQkqLworI2RlZmluZSBDT05GSUdfQk9BUkRfU1BFQ0lGSUNfTEVECTEKKworI2RlZmluZSBTVEFUVVNfTEVEX0JJVAkJMHgwOAkJCS8qIERJQUcxIGlzIG9uIEdQSU9fUFBDXzEgKi8KKyNkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QJKChDRkdfSFogLyAyKSAvIDUpCS8qIGJsaW5rIGF0IDUgSHogKi8KKyNkZWZpbmUgU1RBVFVTX0xFRF9TVEFURQlTVEFUVVNfTEVEX09GRgorI2RlZmluZSBTVEFUVVNfTEVEX0JJVDEJCTB4MDQJCQkvKiBESUFHMiBpcyBvbiBHUElPX1BQQ18yICovCisjZGVmaW5lIFNUQVRVU19MRURfUEVSSU9EMQkoKENGR19IWiAvIDIpIC8gNSkJLyogYmxpbmsgYXQgNSBIeiAqLworI2RlZmluZSBTVEFUVVNfTEVEX1NUQVRFMQlTVEFUVVNfTEVEX09OCisjZGVmaW5lIFNUQVRVU19MRURfQklUMgkJMHgwMgkJCS8qIERJQUczIGlzIG9uIEdQSU9fUFBDXzMgKi8KKyNkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QyCSgoQ0ZHX0haIC8gMikgLyA1KQkvKiBibGluayBhdCA1IEh6ICovCisjZGVmaW5lIFNUQVRVU19MRURfU1RBVEUyCVNUQVRVU19MRURfT0ZGCisjZGVmaW5lIFNUQVRVU19MRURfQklUMwkJMHgwMQkJCS8qIERJQUc0IGlzIG9uIEdQSU9fUFBDXzQgKi8KKyNkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QzCSgoQ0ZHX0haIC8gMikgLyA1KQkvKiBibGluayBhdCA1IEh6ICovCisjZGVmaW5lIFNUQVRVU19MRURfU1RBVEUzCVNUQVRVU19MRURfT0ZGCisKKyNkZWZpbmUgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwkxCisKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwpAQCAtMjA4LDM3ICsyNDcsNDcgQEAKICNkZWZpbmUgQ09ORklHX0hXX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgKi8KICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfRVhUMgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX1VTQgkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX1VTQgogCiAKICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM5Myw3ICs0NDIsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJKDMyPDwxMCkgLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MDUsOSArNDU0LDQ0IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCiAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElERS9BVEEgc3R1ZmYgU3VwcG9ydHMgSURFIGhhcmRkaXNrCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI3VuZGVmICBDT05GSUdfSURFXzh4eF9QQ0NBUkQJCS8qIFVzZSBJREUgd2l0aCBQQyBDYXJkCUFkYXB0ZXIJKi8KKworI3VuZGVmICBDT05GSUdfSURFXzh4eF9ESVJFQ1QJCS8qIERpcmVjdCBJREUgICAgbm90IHN1cHBvcnRlZAkqLworI3VuZGVmICBDT05GSUdfSURFX0xFRAkJCS8qIExFRCAgIGZvciBpZGUgbm90IHN1cHBvcnRlZAkqLworCisjZGVmaW5lIENGR19JREVfTUFYQlVTCQkxCS8qIG1heC4gMSBJREUgYnVzCQkqLworI2RlZmluZSBDRkdfSURFX01BWERFVklDRQkxCS8qIG1heC4gMiBkcml2ZXMgcGVyIElERSBidXMJKi8KKworI2RlZmluZSBDT05GSUdfSURFX1BSRUlOSVQJMQorI2RlZmluZSBDT05GSUdfSURFX1JFU0VUCTEKKworI2RlZmluZSBDRkdfQVRBX0lERTBfT0ZGU0VUCTB4MDAwMAorCisjZGVmaW5lIENGR19BVEFfQkFTRV9BRERSCUNGR19DRjEKKworLyogT2Zmc2V0IGZvciBkYXRhIEkvTwkJCSovCisjZGVmaW5lIENGR19BVEFfREFUQV9PRkZTRVQJMAorCisvKiBPZmZzZXQgZm9yIG5vcm1hbCByZWdpc3RlciBhY2Nlc3NlcwkqLworI2RlZmluZSBDRkdfQVRBX1JFR19PRkZTRVQJKENGR19BVEFfREFUQV9PRkZTRVQpCisKKy8qIE9mZnNldCBmb3IgYWx0ZXJuYXRlIHJlZ2lzdGVycwkqLworI2RlZmluZSBDRkdfQVRBX0FMVF9PRkZTRVQJKDB4MDAwMCkKKworLyogVGhlc2UgYWRkcmVzc2VzIG5lZWQgdG8gYmUgc2hpZnRlZCBvbmUgcGxhY2UgdG8gdGhlIGxlZnQKKyAqICggYnVzIHBlcl9hZGRyIDIwIC0zMCBpcyBjb25uZWN0c2Qgb24gQ0YgYnVzIEExMC1BMCkKKyAqIFRoZXNlIHZhbHVlcyBhcmUgc2hpZnRlZAorICovCisjZGVmaW5lIENGR19BVEFfUE9SVF9BRERSKHBvcnQpICgocG9ydCkgPDwgMSkKKwogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wY3VfZS5oIGIvaW5jbHVkZS9jb25maWdzL3BjdV9lLmgKaW5kZXggNzNhYTNhOC4uZTNjODg0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BjdV9lLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BjdV9lLmgKQEAgLTg5LDI4ICs4OSwzNCBAQAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogI2RlZmluZSBDRkdfU1BJX0lOSVRfT0ZGU0VUCQkweEIwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKAlDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJCUNGR19DTURfU05UUAkpCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgXAotICAgICgoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKSAmIH5DT05GSUdfQk9PVFBfR0FURVdBWSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wZG5iMy5oIGIvaW5jbHVkZS9jb25maWdzL3BkbmIzLmgKaW5kZXggMDZjNjY1Mi4uNWI1YjBlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BkbmIzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BkbmIzLmgKQEAgLTcxLDI1ICs3MSwzMyBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAxMTUyMDAKICNkZWZpbmUgQ0ZHX0lYUDQyNV9DT05TT0xFCUlYUDQyNV9VQVJUMSAgIC8qIHdlIHVzZSBVQVJUMSBmb3IgY29uc29sZSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfU0NQVSkKLSNkZWZpbmUgQ01EX05BTkRfQURECQkwCi0jZWxzZQotI2RlZmluZSBDTURfTkFORF9BREQJCUNGR19DTURfTkFORAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU0NQVSkKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNNRF9OQU5EX0FERAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX1BJTkcpCi0KLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLS8qIFRoZXNlIGFyZSB1LWJvb3QgZ2VuZXJpYyBwYXJhbWV0ZXJzICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGNoZWNrIGZvciBrZXlwcmVzcyBvbiBib290ZGVsYXk9PTAgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3BmNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL3BmNTIwMC5oCmluZGV4IDcxNTFhOWUuLjE4ZDBjODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wZjUyMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcGY1MjAwLmgKQEAgLTQ5LDExICs0OSw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtOTAsMTMgKzg1LDYgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJOAkvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAJKi8KICNkZWZpbmUgQ09ORklHX05TODM4MlgJCTEKICNlbmRpZgotCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQlDRkdfQ01EX1BDSQotCi0jZWxzZQkJCQkvKiBNUEM1MTAwICovCi0KLSNkZWZpbmUgQUREX1BDSV9DTUQJCTAJLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KLQogI2VuZGlmCiAKIC8qIFBhcnRpdGlvbnMgKi8KQEAgLTEwNiwyNiArOTQsMzUgQEAKIC8qIFVTQiAqLwogI2lmIDAKICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQotI2Vsc2UKLSNkZWZpbmUgQUREX1VTQl9DTUQJCTAKICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NCXwgXAotCQkJCSBDRkdfQ01EX0ZBVAl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX0JTUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJIEFERF9QQ0lfQ01ECSAgKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisKKyNpZmRlZiBDT05GSUdfTVBDNTIwMAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKIAogI2lmIChURVhUX0JBU0UgPT0gMHhGRjAwMDAwMCkJLyogQm9vdCBsb3cgd2l0aCAxNiBNQiBGbGFzaCAqLwogIyAgIGRlZmluZSBDRkdfTE9XQk9PVAkJMQpAQCAtMjYzLDcgKzI2MCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTI4MSw2ICsyNzgsMTEgQEAKIAogI2RlZmluZSBDRkdfVlhXT1JLU19NQUNfUFRSCTB4MDAwMDAwMDAJLyogUGFzcyBFdGhlcm5ldCBNQUMgdG8gVnhXb3JrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wbGViMi5oIGIvaW5jbHVkZS9jb25maWdzL3BsZWIyLmgKaW5kZXggYTZjMjM3MS4uODYzMDI5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BsZWIyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BsZWIyLmgKQEAgLTY2LDEwICs2NiwyMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgJiB+Q0ZHX0NNRF9ORVQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwODowMDozZToyNjowYTo1YgpAQCAtODMsNyArOTYsNyBAQAogI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwogI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcHBtYzd4eC5oIGIvaW5jbHVkZS9jb25maWdzL3BwbWM3eHguaAppbmRleCAwNzJiOWRkLi5mZTdkZTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcHBtYzd4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9wcG1jN3h4LmgKQEAgLTI1LDc1ICsyNSw5MSBAQAogLyoKICAqIERlYnVnCiAgKgotICogREVCVUcJCQktIERlZmluZSB0aGlzIGlzIHlvdSB3YW50IGV4dHJhIGRlYnVnIGluZm8KLSAqIEdUUkVHUkVBRAkJCS0gUmVxdWlyZWQgdG8gYnVpbGQgd2l0aCBkZWJ1ZwotICogZG9fYmRpbmZvCQkJLSBSZXF1aXJlZCB0byBidWlsZCB3aXRoIGRlYnVnCisgKiBERUJVRwkJLSBEZWZpbmUgdGhpcyBpcyB5b3Ugd2FudCBleHRyYSBkZWJ1ZyBpbmZvCisgKiBHVFJFR1JFQUQJCS0gUmVxdWlyZWQgdG8gYnVpbGQgd2l0aCBkZWJ1ZworICogZG9fYmRpbmZvCQktIFJlcXVpcmVkIHRvIGJ1aWxkIHdpdGggZGVidWcKICAqLwogCiAjdW5kZWYJREVCVUcKLSNkZWZpbmUJR1RSRUdSRUFEKHgpCQkJMHhGRkZGRkZGRgorI2lmZGVmCURFQlVHCisjZGVmaW5lCUdUUkVHUkVBRCh4KQkweEZGRkZGRkZGCiAjZGVmaW5lCWRvX2JkaW5mbyhhLGIsYyxkKQotCisjZW5kaWYKIAogLyoKICAqIENQVSB0eXBlCiAgKgotICogQ09ORklHXzd4eAkJCS0gV2UgaGF2ZSBhIDc1MCBvciA3NTUgQ1BVCi0gKiBDT05GSUdfNzR4eAkJCS0gV2UgaGF2ZSBhIDc0MDAgQ1BVCi0gKiBDT05GSUdfQUxUSVZFQwkJLSBXZSBoYXZlIGFsdGl2ZWMgZW5hYmxlZCBDUFUgKG9ubHkgNzQwMCkKLSAqIENPTkZJR19CVVNfQ0xLCQktIFN5c3RlbSBidXMgY2xvY2sgaW4gSHoKKyAqIENPTkZJR183eHgJCS0gV2UgaGF2ZSBhIDc1MCBvciA3NTUgQ1BVCisgKiBDT05GSUdfNzR4eAkJLSBXZSBoYXZlIGEgNzQwMCBDUFUKKyAqIENPTkZJR19BTFRJVkVDCS0gV2UgaGF2ZSBhbHRpdmVjIGVuYWJsZWQgQ1BVIChvbmx5IDc0MDApCisgKiBDT05GSUdfQlVTX0NMSwktIFN5c3RlbSBidXMgY2xvY2sgaW4gSHoKICAqLwogCiAjZGVmaW5lCUNPTkZJR183eHgKICN1bmRlZglDT05GSUdfNzR4eAogI3VuZGVmCUNPTkZJR19BTFRJVkVDCi0jZGVmaW5lIENPTkZJR19CVVNfQ0xLCQkJNjYwMDAwMDAKKyNkZWZpbmUgQ09ORklHX0JVU19DTEsJNjYwMDAwMDAKIAogCiAvKgogICogTW9uaXRvciBjb25maWd1cmF0aW9uCiAgKgotICogQ09ORklHX0NPTU1BTkRTCQktIExpc3Qgb2YgY29tbWFuZCBzZXRzIHRvIGluY2x1ZGUgaW4gc2hlbGwKKyAqIExpc3Qgb2YgY29tbWFuZCBzZXRzIHRvIGluY2x1ZGUgaW4gc2hlbGwKICAqCiAgKiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgc2V0cyBoYXZlIGJlZW4gdGVzdGVkIGFuZCBrbm93biB0byB3b3JrOgogICoKLSAqIENGR19DTURfQ0FDSEUJCS0gQ2FjaGUgY29udHJvbCBjb21tYW5kcwotICogQ0ZHX0NNRF9NRU1PUlkJCS0gTWVtb3J5IGRpc3BsYXksIGNoYW5nZSBhbmQgdGVzdCBjb21tYW5kcwotICogQ0ZHX0NNRF9GTEFTSAkJLSBFcmFzZSBhbmQgcHJvZ3JhbSBmbGFzaAotICogQ0ZHX0NNRF9FTlYJCQktIEVudmlyb25tZW50IGNvbW1hbmRzCi0gKiBDRkdfQ01EX1JVTgkJCS0gUnVuIGNvbW1hbmRzIHN0b3JlZCBpbiBlbnYgdmFycwotICogQ0ZHX0NNRF9FTEYJCQktIExvYWQgRUxGIGZpbGVzCi0gKiBDRkdfQ01EX05FVAkJCS0gTmV0d29ya2luZy9maWxlIGRvd25sb2FkIGNvbW1hbmRzCi0gKiBDRkdfQ01EX1BJTkcJCQktIElDTVAgRWNobyBSZXF1ZXN0IGNvbW1hbmQKLSAqIENGR19DTURfUENJCQkJLSBQQ0kgQnVzIHNjYW5uaW5nIGNvbW1hbmQKKyAqIENNRF9DQUNIRQkJLSBDYWNoZSBjb250cm9sIGNvbW1hbmRzCisgKiBDTURfTUVNT1JZCQktIE1lbW9yeSBkaXNwbGF5LCBjaGFuZ2UgYW5kIHRlc3QgY29tbWFuZHMKKyAqIENNRF9GTEFTSAkJLSBFcmFzZSBhbmQgcHJvZ3JhbSBmbGFzaAorICogQ01EX0VOVgkJLSBFbnZpcm9ubWVudCBjb21tYW5kcworICogQ01EX1JVTgkJLSBSdW4gY29tbWFuZHMgc3RvcmVkIGluIGVudiB2YXJzCisgKiBDTURfRUxGCQktIExvYWQgRUxGIGZpbGVzCisgKiBDTURfTkVUCQktIE5ldHdvcmtpbmcvZmlsZSBkb3dubG9hZCBjb21tYW5kcworICogQ01EX1BJTgkJLSBJQ01QIEVjaG8gUmVxdWVzdCBjb21tYW5kCisgKiBDTURfUENJCQktIFBDSSBCdXMgc2Nhbm5pbmcgY29tbWFuZAogICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIChDRkdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9LR0RCKSkgfAlcCi0JCQkJCQkgICBDRkdfQ01EX0ZMQVNIIHwJXAotCQkJCQkJICAgQ0ZHX0NNRF9FTlYgfAlcCi0JCQkJCQkgICBDRkdfQ01EX1JVTiB8CVwKLQkJCQkJCSAgIENGR19DTURfRUxGIHwJXAotCQkJCQkJICAgQ0ZHX0NNRF9ORVQgfAlcCi0JCQkJCQkgICBDRkdfQ01EX1BJTkcgfAlcCi0JCQkJCQkgICBDRkdfQ01EX1BDSSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JVTgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKworI3VuZGVmIENPTkZJR19DTURfS0dEQgogCiAKIC8qCiAgKiBTZXJpYWwgY29uZmlndXJhdGlvbgogICoKICAqIENPTkZJR19DT05TX0lOREVYCQktIFNlcmlhbCBjb25zb2xlIHBvcnQgbnVtYmVyIChDT00xKQotICogQ09ORklHX0JBVURSQVRFCQkJLSBTZXJpYWwgc3BlZWQKKyAqIENPTkZJR19CQVVEUkFURQkJLSBTZXJpYWwgc3BlZWQKICAqLwogCi0jZGVmaW5lIENPTkZJR19DT05TX0lOREVYCQkxCi0jZGVmaW5lIENPTkZJR19CQVVEUkFURQkJCTk2MDAKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMQorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAogCiAvKgogICogUENJIGNvbmZpZwogICoKLSAqIENPTkZJR19QQ0kJCQkJLSBFbmFibGUgUENJIGJ1cwotICogQ09ORklHX1BDSV9QTlAJCQktIEVuYWJsZSBQbHVnICYgUGxheSBzdXBwb3J0CisgKiBDT05GSUdfUENJCQkJLSBFbmFibGUgUENJIGJ1cworICogQ09ORklHX1BDSV9QTlAJCS0gRW5hYmxlIFBsdWcgJiBQbGF5IHN1cHBvcnQKICAqIENPTkZJR19QQ0lfU0NBTl9TSE9XCQktIEVuYWJsZSBkaXNwbGF5IG9mIGRldmljZXMgYXQgc3RhcnR1cAogICovCiAKQEAgLTEwNSw5ICsxMjEsOSBAQAogLyoKICAqIE5ldHdvcmsgY29uZmlnCiAgKgotICogQ09ORklHX05FVF9NVUxUSQkJCS0gU3VwcG9ydCBmb3IgbXVsdGlwbGUgbmV0d29yayBpbnRlcmZhY2VzCi0gKiBDT05GSUdfRUVQUk8xMDAJCQktIEludGVsIDgyNTV4IEV0aGVybmV0IENvbnRyb2xsZXIKLSAqIENPTkZJR19FRVBSTzEwMF9TUk9NX1dSSVRFIC0gRW5hYmxlIHdyaXRpbmcgdG8gbmV0d29yayBjYXJkIFJPTQorICogQ09ORklHX05FVF9NVUxUSQkJLSBTdXBwb3J0IGZvciBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZXMKKyAqIENPTkZJR19FRVBSTzEwMAkJLSBJbnRlbCA4MjU1eCBFdGhlcm5ldCBDb250cm9sbGVyCisgKiBDT05GSUdfRUVQUk8xMDBfU1JPTV9XUklURQktIEVuYWJsZSB3cml0aW5nIHRvIG5ldHdvcmsgY2FyZCBST00KICAqLwogCiAjZGVmaW5lCUNPTkZJR19ORVRfTVVMVEkKQEAgLTEzMCw3ICsxNDYsNyBAQAogICogQm9vdCBjb25maWcKICAqCiAgKiBDT05GSUdfQk9PVENPTU1BTkQJCS0gQ29tbWFuZChzKSB0byBleGVjdXRlIHRvIGF1dG8tYm9vdAotICogQ09ORklHX0JPT1RERUxBWQkJCS0gSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgYXV0by1ib290IChpbiBzZWMpCisgKiBDT05GSUdfQk9PVERFTEFZCQktIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGF1dG8tYm9vdCAoaW4gc2VjKQogICovCiAKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECQlcCkBAIC0xNDksODcgKzE2NSw4NCBAQAogICovCiAKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0KIC8qCiAgKiBNZW1vcnkgbWFwCiAgKgogICogVGhpcyBib2FyZCBydW5zIGluIGEgc3RhbmRhcmQgQ0hSUCAoTWFwLUIpIGNvbmZpZ3VyYXRpb24uCiAgKgotICoJVHlwZQkJU3RhcnQJCUVuZAkJCVNpemUJV2lkdGgJQ2hpcCBTZWwKKyAqCVR5cGUJICAgIFN0YXJ0CUVuZAkgICAgU2l6ZSAgICBXaWR0aCAgIENoaXAgU2VsCiAgKgktLS0tLS0tLS0tLSAtLS0tLS0tLS0tLSAtLS0tLS0tLS0tLSAtLS0tLS0tIC0tLS0tLS0gLS0tLS0tLS0KLSAqCVNEUkFNCQkweDAwMDAwMDAwCTB4MDQwMDAwMDAJNjRNQgk2NGIJCVNEUkFNQ1MwCi0gKglVc2VyIExFRCdzCTB4NzgwMDAwMDAJCQkJCQlSQ1MzCi0gKglVQVJUCQkweDdDMDAwMDAwCQkJCQkJUkNTMgotICoJTWFpbGJveAkJMHhGRjAwMDAwMAkJCQkJCVJDUzEKLSAqCUZsYXNoCQkweEZGQzAwMDAwCTB4RkZGRkZGRkYJNE1CCTY0YgkJUkNTMAorICoJU0RSQU0JICAgIDB4MDAwMDAwMDAJMHgwNDAwMDAwMCAgNjRNQiAgICA2NGIJICAgIFNEUkFNQ1MwCisgKglVc2VyIExFRCdzICAweDc4MDAwMDAwCQkJCSAgICBSQ1MzCisgKglVQVJUCSAgICAweDdDMDAwMDAwCQkJCSAgICBSQ1MyCisgKglNYWlsYm94CSAgICAweEZGMDAwMDAwCQkJCSAgICBSQ1MxCisgKglGbGFzaAkgICAgMHhGRkMwMDAwMAkweEZGRkZGRkZGICAgNE1CICAgIDY0YgkgICAgUkNTMAogICoKICAqIEZsYXNoIHNlY3RvcnMgYXJlIGxhaWQgb3V0IGFzIGZvbGxvd3MuCiAgKgotICoJU2VjdG9yCVN0YXJ0CQlFbmQJCQlTaXplCUNvbW1lbnRzCisgKglTZWN0b3IJU3RhcnQJCUVuZAlTaXplCUNvbW1lbnRzCiAgKgktLS0tLS0tIC0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tIC0tLS0tLS0gLS0tLS0tLS0tLS0KLSAqCSAwCQkweEZGQzAwMDAwCTB4RkZDM0ZGRkYJMjU2S0IKLSAqICAgMQkJMHhGRkM0MDAwMAkweEZGQzdGRkZGCTI1NktCCi0gKgkgMgkJMHhGRkM4MDAwMAkweEZGQ0JGRkZGCTI1NktCCi0gKgkgMwkJMHhGRkNDMDAwMAkweEZGQ0ZGRkZGCTI1NktCCi0gKgkgNAkJMHhGRkQwMDAwMAkweEZGRDNGRkZGCTI1NktCCi0gKgkgNQkJMHhGRkQ0MDAwMAkweEZGRDdGRkZGCTI1NktCCi0gKgkgNgkJMHhGRkQ4MDAwMAkweEZGREJGRkZGCTI1NktCCi0gKgkgNwkJMHhGRkRDMDAwMAkweEZGREZGRkZGCTI1NktCCi0gKiAgIDgJCTB4RkZFMDAwMDAJMHhGRkUzRkZGRgkyNTZLQgotICoJIDkJCTB4RkZFNDAwMDAJMHhGRkU3RkZGRgkyNTZLQgotICogIDEwCQkweEZGRTgwMDAwCTB4RkZFQkZGRkYJMjU2S0IKLSAqICAxMQkJMHhGRkVDMDAwMAkweEZGRUZGRkZGCTI1NktCCi0gKiAgMTIJCTB4RkZGMDAwMDAJMHhGRkYzRkZGRgkyNTZLQglVLUJvb3QgY29kZSBoZXJlCi0gKiAgMTMJCTB4RkZGNDAwMDAJMHhGRkY3RkZGRgkyNTZLQgotICogIDE0CQkweEZGRjgwMDAwCTB4RkZGQkZGRkYJMjU2S0IKLSAqICAxNQkJMHhGRkZDMDAwMAkweEZGRkRGRkZGCTEyOEtCCi0gKiAgMTYJCTB4RkZGRTAwMDAJMHhGRkZFN0ZGRgkgMzJLQglVLUJvb3QgZW52IHZhcnMgaGVyZQotICogIDE3CQkweEZGRkU4MDAwCTB4RkZGRUZGRkYJIDMyS0IJVS1Cb290IGJhY2t1cCBjb3B5IG9mIGVudiB2YXJzIGhlcmUKLSAqICAxOAkJMHhGRkZGMDAwMAkweEZGRkZGRkZGCSA2NEtCCisgKgkgMAkweEZGQzAwMDAwICAweEZGQzNGRkZGCTI1NktCCisgKgkgMQkweEZGQzQwMDAwICAweEZGQzdGRkZGCTI1NktCCisgKgkgMgkweEZGQzgwMDAwICAweEZGQ0JGRkZGCTI1NktCCisgKgkgMwkweEZGQ0MwMDAwICAweEZGQ0ZGRkZGCTI1NktCCisgKgkgNAkweEZGRDAwMDAwICAweEZGRDNGRkZGCTI1NktCCisgKgkgNQkweEZGRDQwMDAwICAweEZGRDdGRkZGCTI1NktCCisgKgkgNgkweEZGRDgwMDAwICAweEZGREJGRkZGCTI1NktCCisgKgkgNwkweEZGREMwMDAwICAweEZGREZGRkZGCTI1NktCCisgKgkgOAkweEZGRTAwMDAwICAweEZGRTNGRkZGCTI1NktCCisgKgkgOQkweEZGRTQwMDAwICAweEZGRTdGRkZGCTI1NktCCisgKgkxMAkweEZGRTgwMDAwICAweEZGRUJGRkZGCTI1NktCCisgKgkxMQkweEZGRUMwMDAwICAweEZGRUZGRkZGCTI1NktCCisgKgkxMgkweEZGRjAwMDAwICAweEZGRjNGRkZGCTI1NktCCVUtQm9vdCBjb2RlIGhlcmUKKyAqCTEzCTB4RkZGNDAwMDAgIDB4RkZGN0ZGRkYJMjU2S0IKKyAqCTE0CTB4RkZGODAwMDAgIDB4RkZGQkZGRkYJMjU2S0IKKyAqCTE1CTB4RkZGQzAwMDAgIDB4RkZGREZGRkYJMTI4S0IKKyAqCTE2CTB4RkZGRTAwMDAgIDB4RkZGRTdGRkYJIDMyS0IJVS1Cb290IGVudiB2YXJzIGhlcmUKKyAqCTE3CTB4RkZGRTgwMDAgIDB4RkZGRUZGRkYJIDMyS0IJVS1Cb290IGJhY2t1cCBjb3B5IG9mIGVudiB2YXJzIGhlcmUKKyAqCTE4CTB4RkZGRjAwMDAgIDB4RkZGRkZGRkYJIDY0S0IKICAqLwogCiAKIC8qCiAgKiBTRFJBTSBjb25maWcgLSBzZWUgbWVtb3J5IG1hcCBkZXRhaWxzIGFib3ZlLgogICoKLSAqIENGR19TRFJBTV9CQVNFCQkJLSBTdGFydCBhZGRyZXNzIG9mIFNEUkFNLCB0aGlzIF9tdXN0XyBiZSB6ZXJvIQotICogQ0ZHX1NEUkFNX1NJWkUJCQktIFRvdGFsIHNpemUgb2YgY29udGlndW91cyBTRFJBTSBiYW5rKHMpCisgKiBDRkdfU0RSQU1fQkFTRQkJLSBTdGFydCBhZGRyZXNzIG9mIFNEUkFNLCB0aGlzIF9tdXN0XyBiZSB6ZXJvIQorICogQ0ZHX1NEUkFNX1NJWkUJCS0gVG90YWwgc2l6ZSBvZiBjb250aWd1b3VzIFNEUkFNIGJhbmsocykKICAqLwogCi0jZGVmaW5lIENGR19TRFJBTV9CQVNFCQkJMHgwMDAwMDAwMAotI2RlZmluZSBDRkdfU0RSQU1fU0laRQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NEUkFNX1NJWkUJCTB4MDQwMDAwMDAKIAogCiAvKgogICogRmxhc2ggY29uZmlnIC0gc2VlIG1lbW9yeSBtYXAgZGV0YWlscyBhYm92ZS4KICAqCi0gKiBDRkdfRkxBU0hfQkFTRQkJCS0gU3RhcnQgYWRkcmVzcyBvZiBmbGFzaCBtZW1vcnkKLSAqIENGR19GTEFTSF9TSVpFCQkJLSBUb3RhbCBzaXplIG9mIGNvbnRpZ3VvdXMgZmxhc2ggbWVtCisgKiBDRkdfRkxBU0hfQkFTRQkJLSBTdGFydCBhZGRyZXNzIG9mIGZsYXNoIG1lbW9yeQorICogQ0ZHX0ZMQVNIX1NJWkUJCS0gVG90YWwgc2l6ZSBvZiBjb250aWd1b3VzIGZsYXNoIG1lbQogICogQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJCS0gRXJhc2UgdGltZW91dCBpbiBtcwogICogQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJCS0gV3JpdGUgdGltZW91dCBpbiBtcwogICogQ0ZHX01BWF9GTEFTSF9CQU5LUwkJLSBOdW1iZXIgb2YgYmFua3Mgb2YgZmxhc2ggb24gYm9hcmQKICAqIENGR19NQVhfRkxBU0hfU0VDVAkJLSBOdW1iZXIgb2Ygc2VjdG9ycyBpbiBhIGJhbmsKICAqLwogCi0jZGVmaW5lIENGR19GTEFTSF9CQVNFCQkJMHhGRkMwMDAwMAotI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkZDMDAwMDAKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1NJWkUJCTB4MDA0MDAwMDAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMjUwMDAwCiAjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMDAKLSNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkJMQotI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJCTE5CisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQorI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMTkKIAogCiAvKgogICogTW9uaXRvciBjb25maWcgLSBzZWUgbWVtb3J5IG1hcCBkZXRhaWxzIGFib3ZlCiAgKgotICogQ0ZHX01PTklUT1JfQkFTRQkJCS0gQmFzZSBhZGRyZXNzIG9mIG1vbml0b3IgY29kZQotICogQ0ZHX01BTExPQ19MRU4JCQktIFNpemUgb2YgbWFsbG9jIHBvb2wgKDEyOEtCKQorICogQ0ZHX01PTklUT1JfQkFTRQkJLSBCYXNlIGFkZHJlc3Mgb2YgbW9uaXRvciBjb2RlCisgKiBDRkdfTUFMTE9DX0xFTgkJLSBTaXplIG9mIG1hbGxvYyBwb29sICgxMjhLQikKICAqLwogCi0jZGVmaW5lIENGR19NT05JVE9SX0JBU0UJCVRFWFRfQkFTRQotI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJCTB4MjAwMDAKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UKKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCTB4MjAwMDAKIAogCiAvKgpAQCAtMjQ3LDE2ICsyNjAsMTYgQEAKICAqIENGR19QUk9NUFQJCQktIFByb21wdCBzdHJpbmcKICAqLwogCi0jZGVmaW5lIENGR19CQVJHU0laRQkJCTEwMjQKLSNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJCTB4ODAwMDAwCi0jZGVmaW5lIENGR19DQlNJWkUJCQkxMDI0Ci0jZGVmaW5lIENGR19MT0FEX0FERFIJCQkweDEwMDAwMAorI2RlZmluZSBDRkdfQkFSR1NJWkUJCTEwMjQKKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJMHg4MDAwMDAKKyNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAorI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDEwMDAwMAogI2RlZmluZSBDRkdfTE9OR0hFTFAKLSNkZWZpbmUgQ0ZHX01BWEFSR1MJCQkxNgotI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkJMHgwMDA0MDAwMAotI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCQkweDAwMDQwMTAwCi0jZGVmaW5lIENGR19QQlNJWkUJCQkxMDI0Ci0jZGVmaW5lIENGR19QUk9NUFQJCQkiPT4gIgorI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDA0MDAwMAorI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDAwNDAxMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRQkJMTAyNAorI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgogCiAKIC8qCkBAIC0yNjgsMTIgKzI4MSwxMiBAQAogICogQ0ZHX0VOVl9TRUNUX1NJWkUJCS0gU2l6ZSBvZiBzZWN0b3IgY29udGFpbmluZyBlbnYgdmFycyAoMzJLQikKICAqLwogCi0jZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJCTEKLSNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkJMHhGRkZFMDAwMAotI2RlZmluZSBDRkdfRU5WX1NJWkUJCQkweDEwMDAKLSNkZWZpbmUgQ0ZHX0VOVl9BRERSX1JFRFVORAkJMHhGRkZFODAwMAotI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECQkweDEwMDAKLSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJCTB4ODAwMAorI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkweEZGRkUwMDAwCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgxMDAwCisjZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJMHhGRkZFODAwMAorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECTB4MTAwMAorI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDgwMDAKIAogCiAvKgpAQCAtMjg0LDE1ICsyOTcsMTUgQEAKICAqIGNvcGllZCB0byB0b3Agb2YgUkFNIGJ5IHRoZSBpbml0IGNvZGUuCiAgKgogICogQ0ZHX0lOSVRfUkFNX0FERFIJCS0gQWRkcmVzcyBvZiBJbml0IFJBTSwgYWJvdmUgZXhjZXB0aW9uIHZlY3QKLSAqIENGR19JTklUX1JBTV9FTkQJCQktIFNpemUgb2YgSW5pdCBSQU0KKyAqIENGR19JTklUX1JBTV9FTkQJCS0gU2l6ZSBvZiBJbml0IFJBTQogICogQ0ZHX0dCTF9EQVRBX1NJWkUJCS0gQW1tb3VudCBvZiBSQU0gdG8gcmVzZXJ2ZSBmb3IgZ2xvYmFsIGRhdGEKICAqIENGR19HQkxfREFUQV9PRkZTRVQJCS0gU3RhcnQgb2YgZ2xvYmFsIGRhdGEsIHRvcCBvZiBzdGFjawogICovCiAKLSNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJCShDRkdfU0RSQU1fQkFTRSArIDB4NDAwMCkKLSNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAkJMHg0MDAwCi0jZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCQkxMjgKLSNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJKENGR19TRFJBTV9CQVNFICsgMHg0MDAwKQorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4NDAwMAorI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQogCiAKIC8qCkBAIC0zMjksNzEgKzM0Miw3MSBAQAogICogQ2FjaGUgY29uZmlnCiAgKgogICogQ0ZHX0NBQ0hFTElORV9TSVpFCQktIFNpemUgb2YgYSBjYWNoZSBsaW5lIChDUFUgc3BlY2lmaWMpCi0gKiBDRkdfTDIJCQkJCS0gTDIgY2FjaGUgZW5hYmxlZCBpZiBkZWZpbmVkCi0gKiBMMl9JTklUCQkJCQktIEwyIGNhY2hlIGluaXQgZmxhZ3MKLSAqIEwyX0VOQUJMRQkJCQktIEwyIGNhY2hlIGVuYWJsZSBmbGFncworICogQ0ZHX0wyCQkJLSBMMiBjYWNoZSBlbmFibGVkIGlmIGRlZmluZWQKKyAqIEwyX0lOSVQJCQktIEwyIGNhY2hlIGluaXQgZmxhZ3MKKyAqIEwyX0VOQUJMRQkJCS0gTDIgY2FjaGUgZW5hYmxlIGZsYWdzCiAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJCTMyCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgogI3VuZGVmCUNGR19MMgotI2RlZmluZSBMMl9JTklUCQkJCQkwCi0jZGVmaW5lIEwyX0VOQUJMRQkJCQkwCisjZGVmaW5lIEwyX0lOSVQJCQkwCisjZGVmaW5lIEwyX0VOQUJMRQkJMAogCiAKIC8qCiAgKiBDbG9ja3MgY29uZmlnCiAgKgotICogQ0ZHX0JVU19IWgkJCQktIEJ1cyBjbG9jayBmcmVxdWVuY3kgaW4gSHoKLSAqIENGR19CVVNfQ0xLCQkJCS0gQXMgYWJvdmUgKD8pCi0gKiBDRkdfSFoJCQkJCS0gRGVjcmVtZW50ZXIgZnJlcSBpbiBIegorICogQ0ZHX0JVU19IWgkJCS0gQnVzIGNsb2NrIGZyZXF1ZW5jeSBpbiBIegorICogQ0ZHX0JVU19DTEsJCQktIEFzIGFib3ZlICg/KQorICogQ0ZHX0haCQkJLSBEZWNyZW1lbnRlciBmcmVxIGluIEh6CiAgKi8KIAotI2RlZmluZSBDRkdfQlVTX0haCQkJCUNPTkZJR19CVVNfQ0xLCi0jZGVmaW5lIENGR19CVVNfQ0xLCQkJCUNPTkZJR19CVVNfQ0xLCi0jZGVmaW5lIENGR19IWgkJCQkJMTAwMAorI2RlZmluZSBDRkdfQlVTX0haCQlDT05GSUdfQlVTX0NMSworI2RlZmluZSBDRkdfQlVTX0NMSwkJQ09ORklHX0JVU19DTEsKKyNkZWZpbmUgQ0ZHX0haCQkJMTAwMAogCiAKIC8qCiAgKiBTZXJpYWwgcG9ydCBjb25maWcKICAqCiAgKiBDRkdfQkFVRFJBVEVfVEFCTEUJCS0gTGlzdCBvZiB2YWxpZCBiYXVkIHJhdGVzCi0gKiBDRkdfTlMxNjU1MAkJCQktIEluY2x1ZGUgdGhlIE5TMTY1NTAgZHJpdmVyCisgKiBDRkdfTlMxNjU1MAkJCS0gSW5jbHVkZSB0aGUgTlMxNjU1MCBkcml2ZXIKICAqIENGR19OUzE2NTUwX1NFUklBTAkJLSBJbmNsdWRlIHRoZSBzZXJpYWwgKHdyYXBwZXIpIGRyaXZlcgotICogQ0ZHX05TMTY1NTBfQ0xLCQkJLSBGcmVxdWVuY3kgb2YgcmVmZXJlbmNlIGNsb2NrCisgKiBDRkdfTlMxNjU1MF9DTEsJCS0gRnJlcXVlbmN5IG9mIHJlZmVyZW5jZSBjbG9jawogICogQ0ZHX05TMTY1NTBfUkVHX1NJWkUJCS0gNjQtYml0IGFjY2Vzc2VzIHRvIDgtYml0IHBvcnQKLSAqIENGR19OUzE2NTUwX0NPTTEJCQktIEJhc2UgYWRkcmVzcyBvZiAxc3Qgc2VyaWFsIHBvcnQKKyAqIENGR19OUzE2NTUwX0NPTTEJCS0gQmFzZSBhZGRyZXNzIG9mIDFzdCBzZXJpYWwgcG9ydAogICovCiAKLSNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAjZGVmaW5lIENGR19OUzE2NTUwCiAjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAotI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCQkzNjg2NDAwCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJMzY4NjQwMAogI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQktOAotI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCQkweDdDMDAwMDAwCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJMHg3QzAwMDAwMAogCiAKIC8qCiAgKiBQQ0kgQ29uZmlnIC0gQWRkcmVzcyBNYXAgQiAoQ0hSUCkKICAqLwogCi0jZGVmaW5lIENGR19QQ0lfTUVNT1JZX0JVUyAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfUEhZUyAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDRkdfUENJX01FTU9SWV9TSVpFICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIENGR19QQ0lfTUVNX0JVUyAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSV9NRU1fUEhZUyAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBDRkdfUENJX01FTV9TSVpFICAgICAgICAweDdEMDAwMDAwCi0jZGVmaW5lIENGR19JU0FfTUVNX0JVUyAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0ZHX0lTQV9NRU1fUEhZUyAgICAgICAgMHhGRDAwMDAwMAotI2RlZmluZSBDRkdfSVNBX01FTV9TSVpFICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIENGR19QQ0lfSU9fQlVTICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSV9JT19QSFlTICAgICAgICAgMHhGRTgwMDAwMAotI2RlZmluZSBDRkdfUENJX0lPX1NJWkUgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIENGR19JU0FfSU9fQlVTICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0ZHX0lTQV9JT19QSFlTICAgICAgICAgMHhGRTAwMDAwMAotI2RlZmluZSBDRkdfSVNBX0lPX1NJWkUgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX0JVUwkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX1BIWVMJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfUENJX01FTU9SWV9TSVpFCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1fQlVTCQkweDgwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNX1BIWVMJMHg4MDAwMDAwMAorI2RlZmluZSBDRkdfUENJX01FTV9TSVpFCTB4N0QwMDAwMDAKKyNkZWZpbmUgQ0ZHX0lTQV9NRU1fQlVTCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19JU0FfTUVNX1BIWVMJMHhGRDAwMDAwMAorI2RlZmluZSBDRkdfSVNBX01FTV9TSVpFCTB4MDEwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9JT19CVVMJCTB4MDA4MDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9JT19QSFlTCQkweEZFODAwMDAwCisjZGVmaW5lIENGR19QQ0lfSU9fU0laRQkJMHgwMDQwMDAwMAorI2RlZmluZSBDRkdfSVNBX0lPX0JVUwkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfSVNBX0lPX1BIWVMJCTB4RkUwMDAwMDAKKyNkZWZpbmUgQ0ZHX0lTQV9JT19TSVpFCQkweDAwODAwMDAwCiAjZGVmaW5lIENGR19JU0FfSU9fQkFTRV9BRERSRVNTIENGR19JU0FfSU9fUEhZUwotI2RlZmluZSBDRkdfSVNBX0lPICAgICAgICAgICAgICBDRkdfSVNBX0lPX1BIWVMKLSNkZWZpbmUgQ0ZHXzYwWF9QQ0lfSU9fT0ZGU0VUICAgQ0ZHX0lTQV9JT19QSFlTCisjZGVmaW5lIENGR19JU0FfSU8JCUNGR19JU0FfSU9fUEhZUworI2RlZmluZSBDRkdfNjBYX1BDSV9JT19PRkZTRVQJQ0ZHX0lTQV9JT19QSFlTCiAKIAogLyoKQEAgLTQwOCwxMiArNDIxLDEyIEBACiAvKgogICogQm9vdCBmbGFncwogICoKLSAqIEJPT1RGTEFHX0NPTEQJCQktIEluZGljYXRlcyBhIHBvd2VyLW9uIGJvb3QKLSAqIEJPT1RGTEFHX1dBUk0JCQktIEluZGljYXRlcyBhIHNvZnR3YXJlIHJlc2V0CisgKiBCT09URkxBR19DT0xECQktIEluZGljYXRlcyBhIHBvd2VyLW9uIGJvb3QKKyAqIEJPT1RGTEFHX1dBUk0JCS0gSW5kaWNhdGVzIGEgc29mdHdhcmUgcmVzZXQKICAqLwogCi0jZGVmaW5lIEJPT1RGTEFHX0NPTEQJCQkweDAxCi0jZGVmaW5lIEJPT1RGTEFHX1dBUk0JCQkweDAyCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEKKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgogCiAKICNlbmRpZiAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcHBtYzgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9wcG1jODI2MC5oCmluZGV4IGQ2NzFkY2MuLmZiNWFlOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wcG1jODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9wcG1jODI2MC5oCkBAIC0xNjksOCArMTY5LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KIAogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlcm5ldCBvbiBTQ0MJKi8KQEAgLTI2MSwxMyArMjYwLDE3IEBACiAJImJvb3RtIgogI2VuZGlmIC8qIENPTkZJR19CT09UX1JPT1RfTkZTICovCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisKIAogLyogdW5kZWYgdGhpcyB0byBzYXZlIG1lbW9yeSAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAKQEAgLTI3NSwxNCArMjc4LDIwIEBACiAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCiAKLS8qIFdoYXQgVS1Cb290IHN1YnN5dGVtcyBkbyB5b3Ugd2FudCBlbmFibGVkPyAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoKENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfTUVNVEVTVCB8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX0lNTUFQKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1URVNUCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKworI3VuZGVmIENPTkZJR19DTURfS0dEQgogCiAKIC8qIFdoZXJlIGRvIHRoZSBpbnRlcm5hbCByZWdpc3RlcnMgbGl2ZT8gKi8KQEAgLTI5OCwxMyArMzA3LDEwIEBACiAjZGVmaW5lIENPTkZJR19QUE1DODI2MAkJMQkvKiBvbiBhbiBXaW5kIFJpdmVyIFBQTUM4MjYwIEJvYXJkICAqLwogI2RlZmluZSBDT05GSUdfQ1BNMgkJMQkvKiBIYXMgYSBDUE0yICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCkBAIC00NzcsNyArNDgzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3B1cnBsZS5oIGIvaW5jbHVkZS9jb25maWdzL3B1cnBsZS5oCmluZGV4IDJlY2I3ZmIuLjZlYjYxOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wdXJwbGUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcHVycGxlLmgKQEAgLTgxLDggKzgxLDIzIEBACiAJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfc2VsZiIKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9FTEYpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDgwMDAwMDAwCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9weGEyNTVfaWRwLmggYi9pbmNsdWRlL2NvbmZpZ3MvcHhhMjU1X2lkcC5oCmluZGV4IGU1ZTI3NzIuLjBlODg0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9weGEyNTVfaWRwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3B4YTI1NV9pZHAuaApAQCAtMTAyLDEwICsxMDIsMjUgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NTUMgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfREhDUCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9NTUMKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSA0MDAwMCIKQEAgLTE5Miw3ICsyMDcsNyBAQAogLyoJCQkicHJvdGVjdCBvZmYiCSovCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcXVhbnR1bS5oIGIvaW5jbHVkZS9jb25maWdzL3F1YW50dW0uaAppbmRleCAyMWVjNWFjLi5mNDllMmIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcXVhbnR1bS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9xdWFudHVtLmgKQEAgLTkyLDE4ICs5MiwyOCBAQAogI2RlZmluZSBDRkdfTlZSQU1fU0laRSAyMDQ4CiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX0FVVE9CT09UX0tFWUVECS8qIEVuYWJsZSBwYXNzd29yZCBwcm90ZWN0aW9uICovCiAjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9QUk9NUFQJCSJcbkVudGVyIHBhc3N3b3JkIC0gYXV0b2Jvb3QgaW4gJWQgc2VjLi4uXG4iCkBAIC0xMTMsNyArMTIzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTcyLDcgKzE4Miw3IEBACiAjZW5kaWYKIAogLyolJSUgI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkYwMDAwMCAqLwotI2lmIGRlZmluZWQoREVCVUcpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgyNTYgPDwgMTApCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCiAjZWxzZQogI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBNb25pdG9yCSovCkBAIC0yMjIsNyArMjMyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3I1MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvcjUyMDAuaAppbmRleCBlMWU0MDZiLi4wZTc0M2JiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcjUyMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcjUyMDAuaApAQCAtNjYsMTAgKzY2LDI3IEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9ORVQgKSAmIH4oQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfTE9BREIpKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX05FVAorCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKwogCiAvKiBOb3RlOiBXZSBvbmx5IGNvcHkgb25lIHNlY3RvcnMgd29ydGggb2YgYXBwbGljYXRpb24gY29kZSBmcm9tIGxvY2F0aW9uCiAgKiAxMDIwMDAwMCBmb3Igc3BlZWQgcHVycG9zZXMuICBJbmNyZWFzZSB0aGUgc2l6ZSBpZiBuZWNlc3NhcnkgKi8KQEAgLTc5LDcgKzk2LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVAkJInUtYm9vdD4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3JtdS5oIGIvaW5jbHVkZS9jb25maWdzL3JtdS5oCmluZGV4IGIzMTljZjQuLjJjYTYwYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ybXUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvcm11LmgKQEAgLTg3LDE3ICs4NywyOCBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZQlDT05GSUdfQVVUT0JPT1RfS0VZRUQJCS8qIEVuYWJsZSBwYXNzd29yZCBwcm90ZWN0aW9uICovCiAjZGVmaW5lCUNPTkZJR19BVVRPQk9PVF9QUk9NUFQJCSJcbkVudGVyIHBhc3N3b3JkIC0gYXV0b2Jvb3QgaW4gJWQgc2VjLi4uXG4iCkBAIC0xMDgsNyArMTE5LDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTUyLDcgKzE2Myw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCSgwLWZsYXNoX2luZm9bMF0uc2l6ZSkJLyogUHV0IGZsYXNoIGF0IGVuZAkqLwotI2lmIGRlZmluZWQoREVCVUcpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2RlZmluZQlDRkdfTU9OSVRPUl9MRU4JCSgyNTYgPDwgMTApCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCiAjZWxzZQogI2RlZmluZQlDRkdfTU9OSVRPUl9MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBNb25pdG9yCSovCkBAIC0xOTMsNyArMjA0LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3JzZHByb3RvLmggYi9pbmNsdWRlL2NvbmZpZ3MvcnNkcHJvdG8uaAppbmRleCA2YzllMzkyLi44MTQwODJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcnNkcHJvdG8uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcnNkcHJvdG8uaApAQCAtNjQsOCArNjQsNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlcm5ldCBvbiBTQ0MJKi8KICNkZWZpbmUJQ09ORklHX0VUSEVSX09OX0ZDQwkJLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIEZDQwkqLwpAQCAtMTAyLDcgKzEwMSwyMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgJiB+Q0ZHX0NNRF9LR0RCKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCisKIAogLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gYm9vdCBmcm9tIDB4MDAwMDAxMDAuIElmIHlvdSBkb24ndCBkZWZpbmUKICAqIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcHJvZ3JhbSB0aGUgYm9vdGxvYWRlciB0byAweGZmZjAwMDAwLCBhbmQKQEAgLTExMiwxNSArMTI3LDEyIEBACiAgKi8KICNkZWZpbmUgQ0ZHX1JTRF9CT09UX0xPVyAxCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkiZGV2ZnM9bW91bnQgcm9vdD1yYW1mcyIKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCTA4OjAwOjNlOjI2OjBhOjVhCiAjZGVmaW5lIENPTkZJR19ORVRNQVNLICAgICAgICAgIDI1NS4yNTUuMC4wCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtMTMwLDcgKzE0Miw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODcsNyArMjk5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2Fjc25nLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2Fjc25nLmgKaW5kZXggOTdiNTJmYS4uYzQ3NGFjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NhY3NuZy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zYWNzbmcuaApAQCAtMTU5LDggKzE1OSw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAKICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCkBAIC00NzAsMTYgKzQ2OSwxOCBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UUF9SQU5ET01fREVMQVkgICAgICAgLyogUmFuZG9taXplIHRoZSBCT09UUCByZXRyeSBkZWxheSAqLwogCi0vKiBBZGQgc3VwcG9ydCBmb3IgYSBmZXcgZXh0cmEgYm9vdHAgb3B0aW9ucyBsaWtlOgotICoJLSBGaWxlIHNpemUKLSAqCS0gRE5TICh1cCB0byAyIHNlcnZlcnMpCi0gKiAgICAgIC0gU2VuZCBob3N0bmFtZSB0byBESENQIHNlcnZlcgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMyIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lICBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lICBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSAgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKKwogCiAvKiB1bmRlZiB0aGlzIHRvIHNhdmUgbWVtb3J5ICovCiAjZGVmaW5lIENGR19MT05HSEVMUApAQCAtNTAyLDMxICs1MDMsMjggQEAKICAqLwogI2RlZmluZSBDT05GSUdfVkVSU0lPTl9WQVJJQUJMRQogCi0vKiBXaGF0IFUtQm9vdCBzdWJzeXRlbXMgZG8geW91IHdhbnQgZW5hYmxlZD8gKi8KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9TUEkKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI3VuZGVmIENPTkZJR19DTURfS0dEQgorCiAjaWZkZWYgQ09ORklHX0VUSEVSX09OX0ZDQwotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoKENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTSAgIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX01JSQkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoKENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTSAgIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfUElORwkpCi0jZW5kaWYgLyogQ09ORklHX0VUSEVSX09OX0ZDQyAqLworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2VuZGlmCisKIAogLyogV2hlcmUgZG8gdGhlIGludGVybmFsIHJlZ2lzdGVycyBsaXZlPyAqLwogI2RlZmluZSBDRkdfSU1NUgkJMHhGMDAwMDAwMApAQCAtNTQ0LDEwICs1NDIsNiBAQAogI2RlZmluZSBDT05GSUdfU0FDU25nCQkxCS8qIG11bmdlZCBmb3IgdGhlIFNBQ1NuZyAqLwogI2RlZmluZSBDT05GSUdfQ1BNMgkJMQkvKiBIYXMgYSBDUE0yICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC01ODksNyArNTgzLDcgQEAKICNkZWZpbmUgQ0ZHX1RGVFBfVElNRU9VVF9DT1VOVCA1ICAgICAgICAvKiBIb3cgbWFueSB0aW1lb3V0cyBURlRQIHdpbGwgYWxsb3cgKi8KIAkJCQkJLyogYmVmb3JlIGl0IGdpdmVzIHVwLiAgICAgICAgICAgICAgICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJICAgICAqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJICAgICAqLwpAQCAtNzMyLDcgKzcyNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYmMyNDEweC5oIGIvaW5jbHVkZS9jb25maWdzL3NiYzI0MTB4LmgKaW5kZXggODY2ZjdiMC4uYjRhMDYzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzI0MTB4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzI0MTB4LmgKQEAgLTgyLDI0ICs4MiwyOSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29tbWFuZCBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyBcCi0JCQkoQ09ORklHX0NNRF9ERkwJIHwgXAotCQkJQ0ZHX0NNRF9DQUNIRQkgfCBcCi0JCQkvKkNGR19DTURfTkFORAkgfCovIFwKLQkJCS8qQ0ZHX0NNRF9FRVBST00gfCovIFwKLQkJCS8qQ0ZHX0NNRF9JMkMJIHwqLyBcCi0JCQkvKkNGR19DTURfVVNCCSB8Ki8gXAotCQkJQ0ZHX0NNRF9SRUdJTkZPICB8IFwKLQkJCUNGR19DTURfREFURQkgfCBcCi0JCQlDRkdfQ01EX1BJTkcgICAgIHwgXAotCQkJQ0ZHX0NNRF9ESENQICAgICB8IFwKLQkJCUNGR19DTURfRUxGKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkiY29uc29sZT10dHlTQUMwIHJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xOTIuMTY4LjAuMTovZnJpZW5kbHktYXJtL3Jvb3Rmc19uZXRzZXJ2IGlwPTE5Mi4xNjguMC42OToxOTIuMTY4LjAuMToxOTIuMTY4LjAuMToyNTUuMjU1LjI1NS4wOmRlYmlhbjpldGgwOm9mZiIKQEAgLTExMCw3ICsxMTUsNyBAQAogLyojZGVmaW5lIENPTkZJR19CT09URklMRQkiZWxpbm9zLWxhcnQiICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiZGhjcDsgYm9vdG0iCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpAQCAtMTkzLDcgKzE5OCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBOQU5EIGZsYXNoIHNldHRpbmdzCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCiAjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCiAKQEAgLTIxOSw3ICsyMjQsNyBAQAogI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUobmFuZHB0cikKICNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKG5hbmRwdHIpCiAvKiAjdW5kZWYgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSAqLwotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCAqLworI2VuZGlmCS8qIENPTkZJR19DTURfTkFORCAqLwogCiAjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUwogI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzQwNS5oIGIvaW5jbHVkZS9jb25maWdzL3NiYzQwNS5oCmluZGV4IGJlZmYyOGEuLmRjOTA2YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYmM0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjNDA1LmgKQEAgLTg0LDIzICs4NCwzMyBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJMCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMjMsNyArMTMzLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI5LDcgKzIzOSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYmM4MjQwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODI0MC5oCmluZGV4IGQ4OTFlMDcuLjBlODc4ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYmM4MjQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzgyNDAuaApAQCAtNzUsMjQgKzc1LDMzIEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoIENPTkZJR19DTURfREZMIHwgXAotCQkJCSAgQ0ZHX0NNRF9CU1AgICAgfCBcCi0JCQkJICBDRkdfQ01EX0RJQUcgICB8IFwKLQkJCQkgIENGR19DTURfRUxGICAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTlYgICAgfCBcCi0JCQkJICBDRkdfQ01EX0ZMQVNIICB8IFwKLQkJCQkgIENGR19DTURfUENJICAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9QSU5HICAgfCBcCi0JCQkJICBDRkdfQ01EX1NEUkFNICB8IFwKLQkJCQkgIDAgKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0zNDAsNyArMzQ5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYmM4MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODI2MC5oCmluZGV4IDljZjA2NTQuLmIxZDQxYTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYmM4MjYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzgyNjAuaApAQCAtMTgyLDggKzE4Miw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAKICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCkBAIC00MTIsMTYgKzQxMSwxOCBAQAogCSJib290bSIKICNlbmRpZiAvKiBDT05GSUdfQk9PVF9ST09UX05GUyAqLwogCi0vKiBBZGQgc3VwcG9ydCBmb3IgYSBmZXcgZXh0cmEgYm9vdHAgb3B0aW9ucyBsaWtlOgotICoJLSBGaWxlIHNpemUKLSAqCS0gRE5TICh1cCB0byAyIHNlcnZlcnMpCi0gKgktIFNlbmQgaG9zdG5hbWUgdG8gREhDUCBzZXJ2ZXIKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TICB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FKQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorCiAKIC8qIHVuZGVmIHRoaXMgdG8gc2F2ZSBtZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCkBAIC00NDQsMjcgKzQ0NSwyNiBAQAogICovCiAjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFCiAKLS8qIFdoYXQgVS1Cb290IHN1YnN5dGVtcyBkbyB5b3Ugd2FudCBlbmFibGVkPyAqLwotI2lmZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKChDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9LR0RCKSkpIHwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNICAgKQotI2Vsc2UKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKChDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9LR0RCKSkpIHwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNICAgKQotI2VuZGlmIC8qIENPTkZJR19FVEhFUl9PTl9GQ0MgKi8KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKworI3VuZGVmIENPTkZJR19DTURfS0dEQgorCisjaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9DTURfTUlJCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJCS8qIGRpc2FibGUgdGhlIHdhdGNoZG9nICovCiAKQEAgLTQ4MSwxMyArNDgxLDExIEBACiAjZGVmaW5lIENPTkZJR19TQkM4MjYwCQkxCS8qIG9uIGFuIEVTVCBTQkM4MjYwIEJvYXJkICAqLwogI2RlZmluZSBDT05GSUdfQ1BNMgkJMQkvKiBIYXMgYSBDUE0yICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCkBAIC02MjcsNyArNjI1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzgzNDkuaCBiL2luY2x1ZGUvY29uZmlncy9zYmM4MzQ5LmgKaW5kZXggZTZlMzg2Ni4uMTgzMWJlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzgzNDkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODM0OS5oCkBAIC0zMjgsNyArMzI4LDcgQEAKICNkZWZpbmUgQ09ORklHX0kyQ19DTURfVFJFRQogI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzICovCiAjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKLSNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7ezAsMHg2OX19CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJezB4Njl9CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCiAjZGVmaW5lIENGR19JMkMxX09GRlNFVAkJMHgzMDAwCiAjZGVmaW5lIENGR19JMkMyX09GRlNFVAkJMHgzMTAwCiAjZGVmaW5lIENGR19JMkNfT0ZGU0VUCQlDRkdfSTJDMl9PRkZTRVQKQEAgLTQzOSw0MCArNDM5LDM0IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX1BDSQkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0jZW5kaWYKLSNlbHNlCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMJCVwKLQkJCQkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQwkJXAotCQkJCXwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQkpCi0jZW5kaWYKKyAgICAjZGVmaW5lIENPTkZHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQ4Myw3ICs0NzcsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKIAkjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNTA0LDcgKzQ5OCw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTY1NSw3ICs2NDksNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYmM4NTYwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODU2MC5oCmluZGV4IDZlNGZkYjIuLmRlZmM0MjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYmM4NTYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzg1NjAuaApAQCAtMzIwLDI4ICszMjAsMzcgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKSB8fCBkZWZpbmVkKENPTkZJR19SQU1fQVNfRkxBU0gpCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBcCi0JCQkJICBDRkdfQ01EX0xPQURTICkpCi0gICNlbGlmIChkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01JSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykgJiBcCi0JCQkJfihDRkdfQ01EX0VOVikpCi0gICNlbmRpZgotI2Vsc2UKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbGlmIChkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKQotICAjZW5kaWYKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkgfHwgZGVmaW5lZChDT05GSUdfUkFNX0FTX0ZMQVNIKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTM1MCw3ICszNTksNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSJTQkM4NTYwPT4gIiAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzcxLDcgKzM4MCw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0zODMsNyArMzkyLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAgICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYmM4NjQxZC5oIGIvaW5jbHVkZS9jb25maWdzL3NiYzg2NDFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkMzFjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9zYmM4NjQxZC5oCkBAIC0wLDAgKzEsNjA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgV2luZCBSaXZlciBTeXN0ZW1zIDx3d3cud2luZHJpdmVyLmNvbT4KKyAqIENvcHlyaWdodCAyMDA3IEVtYmVkZGVkIFNwZWNpYWx0aWVzLCBJbmMuCisgKiBKb2UgSGFtbWFuIDxqb2UuaGFtbWFuQGVtYmVkZGVkc3BlY2lhbHRpZXMuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgorICoKKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gKHNyaWthbnRoLnNyaW5pdmFzYW5AZnJlZXNjYWxlLmNvbSkKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogU0JDODY0MUQgYm9hcmQgY29uZmlndXJhdGlvbiBmaWxlCisgKgorICogTWFrZSBzdXJlIHlvdSBjaGFuZ2UgdGhlIE1BQyBhZGRyZXNzIGFuZCBvdGhlciBuZXR3b3JrIHBhcmFtcyBmaXJzdCwKKyAqIHNlYXJjaCBmb3IgQ09ORklHX0VUSEFERFIsIENPTkZJR19TRVJWRVJJUCwgZXRjIGluIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucyAqLworI2RlZmluZSBDT05GSUdfTVBDODZ4eAkJMQkvKiBNUEM4Nnh4ICovCisjZGVmaW5lIENPTkZJR19NUEM4NjQxCQkxCS8qIE1QQzg2NDEgc3BlY2lmaWMgKi8KKyNkZWZpbmUgQ09ORklHX1NCQzg2NDFECQkxCS8qIFNCQzg2NDFEIGJvYXJkIHNwZWNpZmljICovCisjZGVmaW5lIENPTkZJR19OVU1fQ1BVUyAgICAgICAgIDIgICAgICAgLyogTnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbSAqLworI2RlZmluZSBDT05GSUdfTElOVVhfUkVTRVRfVkVDICAweDEwMCAgIC8qIFJlc2V0IHZlY3RvciB1c2VkIGJ5IExpbnV4ICovCisKKyNpZmRlZiBSVU5fRElBRworI2RlZmluZSBDRkdfRElBR19BRERSICAgICAgICAweGZmODAwMDAwCisjZW5kaWYKKworI2RlZmluZSBDRkdfUkVTRVRfQUREUkVTUyAgICAweGZmZjAwMTAwCisKKyNkZWZpbmUgQ09ORklHX1BDSQkJMQkvKiBFbmFibGUgUENJRSAqLworI2RlZmluZSBDT05GSUdfUENJMQkJMQkvKiBQQ0lFIGNvbnRyb2xlciAxIChzbG90IDEpICovCisjZGVmaW5lIENPTkZJR19QQ0kyCQkxCS8qIFBDSUUgY29udHJvbGVyIDIgKHNsb3QgMikgKi8KKyNkZWZpbmUgQ09ORklHX0ZTTF9QQ0lfSU5JVAkxCS8qIFVzZSBjb21tb24gRlNMIGluaXQgY29kZSAqLworCisjZGVmaW5lIENPTkZJR19UU0VDX0VORVQgCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworI3VuZGVmIENPTkZJR19TUERfRUVQUk9NCQkvKiBEbyBub3QgdXNlIFNQRCBFRVBST00gZm9yIEREUiBzZXR1cCovCisjdW5kZWYgQ09ORklHX0REUl9ETEwJCQkvKiBwb3NzaWJsZSBETEwgZml4IG5lZWRlZCAqLworI2RlZmluZSBDT05GSUdfRERSXzJUX1RJTUlORwkJLyogU2V0cyB0aGUgMlQgdGltaW5nIGJpdCAqLworI3VuZGVmIENPTkZJR19ERFJfRUNDICAJCQkvKiBvbmx5IGZvciBFQ0MgRERSIG1vZHVsZSAqLworI2RlZmluZSBDT05GSUdfRUNDX0lOSVRfVklBX0REUkNPTlRST0xMRVIJLyogRERSIGNvbnRyb2xsZXIgb3IgRE1BPyAqLworI2RlZmluZSBDT05GSUdfTUVNX0lOSVRfVkFMVUUJCTB4RGVhZEJlZWYKKyNkZWZpbmUgQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlMgICAgIDIKKyNkZWZpbmUgQ0FDSEVfTElORV9JTlRFUkxFQVZJTkcJCTB4MjAwMDAwMDAKKyNkZWZpbmUgUEFHRV9JTlRFUkxFQVZJTkcJCTB4MjEwMDAwMDAKKyNkZWZpbmUgQkFOS19JTlRFUkxFQVZJTkcJCTB4MjIwMDAwMDAKKyNkZWZpbmUgU1VQRVJfQkFOS19JTlRFUkxFQVZJTkcJCTB4MjMwMDAwMDAKKworCisjZGVmaW5lIENPTkZJR19BTFRJVkVDICAgICAgICAgIDEKKworLyoKKyAqIEwyQ1Igc2V0dXAgLS0gbWFrZSBzdXJlIHRoaXMgaXMgcmlnaHQgZm9yIHlvdXIgYm9hcmQhCisgKi8KKyNkZWZpbmUgQ0ZHX0wyCisjZGVmaW5lIEwyX0lOSVQJCTAKKyNkZWZpbmUgTDJfRU5BQkxFCShMMkNSX0wyRSkKKworI2lmbmRlZiBDT05GSUdfU1lTX0NMS19GUkVRCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgIGdldF9ib2FyZF9zeXNfY2xrKDApCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GCTEJLyogQ2FsbCBib2FyZF9wcmVfaW5pdCAqLworCisjdW5kZWYJQ0ZHX0RSQU1fVEVTVAkJCQkvKiBtZW1vcnkgdGVzdCwgdGFrZXMgdGltZSAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwMjAwMDAwCS8qIG1lbXRlc3QgcmVnaW9uICovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwMDQwMDAwMAorCisvKgorICogQmFzZSBhZGRyZXNzZXMgLS0gTm90ZSB0aGVzZSBhcmUgZWZmZWN0aXZlIGFkZHJlc3NlcyB3aGVyZSB0aGUKKyAqIGFjdHVhbCByZXNvdXJjZXMgZ2V0IG1hcHBlZCAobm90IHBoeXNpY2FsIGFkZHJlc3NlcykKKyAqLworI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUIAkweGZmNzAwMDAwCS8qIENDU1JCQVIgRGVmYXVsdCAqLworI2RlZmluZSBDRkdfQ0NTUkJBUgkJMHhmODAwMDAwMAkvKiByZWxvY2F0ZWQgQ0NTUkJBUiAqLworI2RlZmluZSBDRkdfSU1NUgkJQ0ZHX0NDU1JCQVIJLyogUFFJSSB1c2VzIENGR19JTU1SICovCisKKyNkZWZpbmUgQ0ZHX1BDSTFfQUREUgkJKENGR19DQ1NSQkFSKzB4ODAwMCkKKyNkZWZpbmUgQ0ZHX1BDSTJfQUREUgkJKENGR19DQ1NSQkFSKzB4OTAwMCkKKworLyoKKyAqIEREUiBTZXR1cAorICovCisjZGVmaW5lIENGR19ERFJfU0RSQU1fQkFTRQkweDAwMDAwMDAwCS8qIEREUiBpcyBzeXN0ZW0gbWVtb3J5ICovCisjZGVmaW5lIENGR19ERFJfU0RSQU1fQkFTRTIJMHgxMDAwMDAwMAkvKiBERFIgYmFuayAyICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQlDRkdfRERSX1NEUkFNX0JBU0UKKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UyCQlDRkdfRERSX1NEUkFNX0JBU0UyCisjZGVmaW5lIENPTkZJR19WRVJZX0JJR19SQU0KKworI2RlZmluZSBNUEM4Nnh4X0REUl9TRFJBTV9DTEtfQ05UTAorCisjaWYgZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKyAgICAvKgorICAgICAqIERldGVybWluZSBERFIgY29uZmlndXJhdGlvbiBmcm9tIEkyQyBpbnRlcmZhY2UuCisgICAgICovCisgICAgI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MxCQkweDUxCQkvKiBERFIgRElNTSAqLworICAgICNkZWZpbmUgU1BEX0VFUFJPTV9BRERSRVNTMgkJMHg1MgkJLyogRERSIERJTU0gKi8KKyAgICAjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUzMJCTB4NTMJCS8qIEREUiBESU1NICovCisgICAgI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1M0CQkweDU0CQkvKiBERFIgRElNTSAqLworCisjZWxzZQorICAgIC8qCisgICAgICogTWFudWFsbHkgc2V0IHVwIEREUjEgJiBERFIyIHBhcmFtZXRlcnMKKyAgICAgKi8KKworICAgICNkZWZpbmUgQ0ZHX1NEUkFNX1NJWkUJNTEyCQkvKiBERFIgaXMgNTEyTUIgKi8KKworICAgICNkZWZpbmUgQ0ZHX0REUl9DUzBfQk5EUwkweDAwMDAwMDBGCisgICAgI2RlZmluZSBDRkdfRERSX0NTMV9CTkRTCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ1MyX0JORFMJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9DUzNfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0NTMF9DT05GSUcJMHg4MDAxMDEwMgorICAgICNkZWZpbmUgQ0ZHX0REUl9DUzFfQ09ORklHCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ1MyX0NPTkZJRwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0NTM19DT05GSUcJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9FWFRfUkVGUkVTSCAweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX1RJTUlOR18wCTB4MDAyMjA4MDIKKyAgICAjZGVmaW5lIENGR19ERFJfVElNSU5HXzEJMHgzODM3NzMyMgorICAgICNkZWZpbmUgQ0ZHX0REUl9USU1JTkdfMgkweDAwMjA0MGM3CisgICAgI2RlZmluZSBDRkdfRERSX0NGR18xQQkweDQzMDA4MDA4CisgICAgI2RlZmluZSBDRkdfRERSX0NGR18yCTB4MjQ0MDEwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfTU9ERV8xCTB4MjNjMDA1NDIKKyAgICAjZGVmaW5lIENGR19ERFJfTU9ERV8yCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfTU9ERV9DVEwJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9JTlRFUlZBTAkweDA1MDgwMTAwCisgICAgI2RlZmluZSBDRkdfRERSX0RBVEFfSU5JVAkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0NMS19DVFJMCTB4MDM4MDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ0ZHXzFCCTB4QzMwMDgwMDgKKworICAgICNkZWZpbmUgQ0ZHX0REUjJfQ1MwX0JORFMJMHgwMDEwMDAxRgorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ1MxX0JORFMJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ1MyX0JORFMJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ1MzX0JORFMJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ1MwX0NPTkZJRwkweDgwMDEwMTAyCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzFfQ09ORklHCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX0NTMl9DT05GSUcJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ1MzX0NPTkZJRwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9FWFRfUkVGUkVTSCAweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9USU1JTkdfMAkweDAwMjIwODAyCisgICAgI2RlZmluZSBDRkdfRERSMl9USU1JTkdfMQkweDM4Mzc3MzIyCisgICAgI2RlZmluZSBDRkdfRERSMl9USU1JTkdfMgkweDAwMjA0MGM3CisgICAgI2RlZmluZSBDRkdfRERSMl9DRkdfMUEJMHg0MzAwODAwOAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ0ZHXzIJMHgyNDQwMTAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfTU9ERV8xCTB4MjNjMDA1NDIKKyAgICAjZGVmaW5lIENGR19ERFIyX01PREVfMgkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9NT0RFX0NUTAkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9JTlRFUlZBTAkweDA1MDgwMTAwCisgICAgI2RlZmluZSBDRkdfRERSMl9EQVRBX0lOSVQJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ0xLX0NUUkwJMHgwMzgwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ0ZHXzFCCTB4QzMwMDgwMDgKKworCisjZW5kaWYKKworLyogI2RlZmluZSBDRkdfSURfRUVQUk9NCTEKKyNkZWZpbmUgSURfRUVQUk9NX0FERFIgMHg1NyAqLworCisvKgorICogVGhlIFNCQzg2NDFEIGNvbnRhaW5zIDE2TUIgZmxhc2ggc3BhY2UgYXQgZmYwMDAwMDAuCisgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UgICAgICAweGZmMDAwMDAwICAvKiBzdGFydCBvZiBGTEFTSCAxNk0gKi8KKworLyogRmxhc2ggKi8KKyNkZWZpbmUgQ0ZHX0JSMF9QUkVMSU0JCTB4ZmYwMDEwMDEJLyogcG9ydCBzaXplIDE2Yml0ICovCisjZGVmaW5lIENGR19PUjBfUFJFTElNCQkweGZmMDA2ZTY1CS8qIDE2TUIgQm9vdCBGbGFzaCBhcmVhICovCisKKy8qIDY0S0IgRUVQUk9NICovCisjZGVmaW5lIENGR19CUjFfUFJFTElNCQkweGYwMDAwODAxCS8qIHBvcnQgc2l6ZSAxNmJpdCAqLworI2RlZmluZSBDRkdfT1IxX1BSRUxJTQkJMHhmZmZmNmU2NQkvKiA2NEsgRUVQUk9NIGFyZWEgKi8KKworLyogRVBMRCAtIFVzZXIgc3dpdGNoZXMsIGJvYXJkIGlkLCBMRURzICovCisjZGVmaW5lIENGR19CUjJfUFJFTElNCQkweGYxMDAwODAxCS8qIHBvcnQgc2l6ZSAxNmJpdCAqLworI2RlZmluZSBDRkdfT1IyX1BSRUxJTQkJMHhmZmYwNmU2NQkvKiBFUExEIChzd2l0Y2hlcywgYm9hcmQgSUQsIExFRHMpIGFyZWEgKi8KKworLyogTG9jYWwgYnVzIFNEUkFNIDEyOE1CICovCisjZGVmaW5lIENGR19CUjNfUFJFTElNCQkweGUwMDAxODYxCS8qIHBvcnQgc2l6ZSA/Yml0ICovCisjZGVmaW5lIENGR19PUjNfUFJFTElNCQkweGZjMDA2Y2MwCS8qIDEyOE1CIGxvY2FsIGJ1cyBTRFJBTSBhcmVhICgxc3QgaGFsZikgKi8KKyNkZWZpbmUgQ0ZHX0JSNF9QUkVMSU0JCTB4ZTQwMDE4NjEJLyogcG9ydCBzaXplID9iaXQgKi8KKyNkZWZpbmUgQ0ZHX09SNF9QUkVMSU0JCTB4ZmMwMDZjYzAJLyogMTI4TUIgbG9jYWwgYnVzIFNEUkFNIGFyZWEgKDJuZCBoYWxmKSAqLworCisvKiBEaXNrIG9uIENoaXAgKERPQykgMTI4TUIgKi8KKyNkZWZpbmUgQ0ZHX0JSNV9QUkVMSU0JCTB4ZTgwMDEwMDEJLyogcG9ydCBzaXplID9iaXQgKi8KKyNkZWZpbmUgQ0ZHX09SNV9QUkVMSU0JCTB4ZjgwMDZlNjUJLyogMTI4TUIgbG9jYWwgYnVzIFNEUkFNIGFyZWEgKDJuZCBoYWxmKSAqLworCisvKiBMQ0QgKi8KKyNkZWZpbmUgQ0ZHX0JSNl9QUkVMSU0JCTB4ZjQwMDA4MDEJLyogcG9ydCBzaXplID9iaXQgKi8KKyNkZWZpbmUgQ0ZHX09SNl9QUkVMSU0JCTB4ZmZmMDZlNjUJLyogMTI4TUIgbG9jYWwgYnVzIFNEUkFNIGFyZWEgKDJuZCBoYWxmKSAqLworCisvKiBDb250cm9sIGxvZ2ljICYgbWlzYyBwZXJpcGhlcmFscyAqLworI2RlZmluZSBDRkdfQlI3X1BSRUxJTQkJMHhmMjAwMDgwMQkvKiBwb3J0IHNpemUgP2JpdCAqLworI2RlZmluZSBDRkdfT1I3X1BSRUxJTQkJMHhmZmYwNmU2NQkvKiAxMjhNQiBsb2NhbCBidXMgU0RSQU0gYXJlYSAoMm5kIGhhbGYpICovCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBudW1iZXIgb2YgYmFua3MgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTEzMQkJLyogc2VjdG9ycyBwZXIgZGV2aWNlICovCisKKyN1bmRlZglDRkdfRkxBU0hfQ0hFQ0tTVU0KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJNjAwMDAJLyogRmxhc2ggRXJhc2UgVGltZW91dCAobXMpICovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBGbGFzaCBXcml0ZSBUaW1lb3V0IChtcykgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRSAgICAJVEVYVF9CQVNFCS8qIHN0YXJ0IG9mIG1vbml0b3IgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgorI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCisjZGVmaW5lIENGR19XUklURV9TV0FQUEVEX0RBVEEKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1BST1RFQ1RJT04KKworI3VuZGVmIENPTkZJR19DTE9DS1NfSU5fTUhaCisKKyNkZWZpbmUgQ09ORklHX0wxX0lOSVRfUkFNCisjZGVmaW5lIENGR19JTklUX1JBTV9MT0NLCTEKKyNpZm5kZWYgQ0ZHX0lOSVRfUkFNX0xPQ0sKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJMHgwZmQwMDAwMAkvKiBJbml0aWFsIFJBTSBhZGRyZXNzICovCisjZWxzZQorI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkweGY4NDAwMDAwCS8qIEluaXRpYWwgUkFNIGFkZHJlc3MgKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgIAkweDQwMDAJICAgIAkvKiBFbmQgb2YgdXNlZCBhcmVhIGluIFJBTSAqLworCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFICAJMTI4CQkvKiBudW0gYnl0ZXMgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JICAgIAkoMjU2ICogMTAyNCkgICAgLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbiAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkgICAgCSgxMjggKiAxMDI0KSAgICAvKiBSZXNlcnZlZCBmb3IgbWFsbG9jICovCisKKy8qIFNlcmlhbCBQb3J0ICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAxCisjdW5kZWYJQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRSAgICAxCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJZ2V0X2J1c19mcmVxKDApCisKKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFICBcCisJezMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsMTE1MjAwfQorCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgIChDRkdfQ0NTUkJBUisweDQ1MDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTIgICAgICAgIChDRkdfQ0NTUkJBUisweDQ2MDApCisKKy8qIFVzZSB0aGUgSFVTSCBwYXJzZXIgKi8KKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCisjaWZkZWYgIENGR19IVVNIX1BBUlNFUgorI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyICI+ICIKKyNlbmRpZgorCisvKgorICogUGFzcyBvcGVuIGZpcm13YXJlIGZsYXQgdHJlZSB0byBrZXJuZWwKKyAqLworI2RlZmluZSBDT05GSUdfT0ZfRkxBVF9UUkVFCTEKKyNkZWZpbmUgQ09ORklHX09GX0JPQVJEX1NFVFVQCTEKKworLyogbWF4aW11bSBzaXplIG9mIHRoZSBmbGF0IHRyZWUgKDhLKSAqLworI2RlZmluZSBPRl9GTEFUX1RSRUVfTUFYX1NJWkUJODE5MgorCisjZGVmaW5lIE9GX0NQVQkJIlBvd2VyUEMsODY0MUAwIgorI2RlZmluZSBPRl9TT0MJCSJzb2NAZjgwMDAwMDAiCisjZGVmaW5lIE9GX1RCQ0xLCShiZC0+YmlfYnVzZnJlcSAvIDQpCisjZGVmaW5lIE9GX1NURE9VVF9QQVRICSIvc29jQGY4MDAwMDAwL3NlcmlhbEA0NTAwIgorCisjZGVmaW5lIENGR182NEJJVF9WU1BSSU5URgkxCisjZGVmaW5lIENGR182NEJJVF9TVFJUT1VMCTEKKworLyoKKyAqIEkyQworICovCisjZGVmaW5lCUNPTkZJR19GU0xfSTJDCQkvKiBVc2UgRlNMIGNvbW1vbiBJMkMgZHJpdmVyICovCisjZGVmaW5lCUNPTkZJR19IQVJEX0kyQwkJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydCovCisjdW5kZWYJQ09ORklHX1NPRlRfSTJDCQkJLyogSTJDIGJpdC1iYW5nZWQgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMgICAgICAgIHsweDY5fQkvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLworI2RlZmluZSBDRkdfSTJDX09GRlNFVAkJMHgzMTAwCisKKy8qCisgKiBSYXBpZElPIE1NVQorICovCisjZGVmaW5lIENGR19SSU9fTUVNX0JBU0UJMHhjMDAwMDAwMAkvKiBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX1JJT19NRU1fUEhZUwlDRkdfUklPX01FTV9CQVNFCisjZGVmaW5lIENGR19SSU9fTUVNX1NJWkUJMHgyMDAwMDAwMAkvKiAxMjhNICovCisKKy8qCisgKiBHZW5lcmFsIFBDSQorICogQWRkcmVzc2VzIGFyZSBtYXBwZWQgMS0xLgorICovCisjZGVmaW5lIENGR19QQ0kxX01FTV9CQVNFCTB4ODAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1BIWVMJQ0ZHX1BDSTFfTUVNX0JBU0UKKyNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1NJWkUJMHgyMDAwMDAwMAkvKiA1MTJNICovCisjZGVmaW5lIENGR19QQ0kxX0lPX0JBU0UJMHhlMjAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCUNGR19QQ0kxX0lPX0JBU0UKKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDEwMDAwMDAJLyogMTZNICovCisKKy8qIFBDSSB2aWV3IG9mIFN5c3RlbSBNZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfQlVTICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfUENJX01FTU9SWV9QSFlTICAgICAweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX1NJWkUgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBDRkdfUENJMl9NRU1fQkFTRQkweGEwMDAwMDAwCisjZGVmaW5lIENGR19QQ0kyX01FTV9QSFlTCUNGR19QQ0kyX01FTV9CQVNFCisjZGVmaW5lIENGR19QQ0kyX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLworI2RlZmluZSBDRkdfUENJMl9JT19CQVNFCTB4ZTMwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTJfSU9fUEhZUwlDRkdfUENJMl9JT19CQVNFCisjZGVmaW5lIENGR19QQ0kyX0lPX1NJWkUJMHgxMDAwMDAwCS8qIDE2TSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCisjZGVmaW5lIENPTkZJR19QQ0lfU0NBTl9TSE9XICAgICAgICAgICAgLyogc2hvdyBwY2kgZGV2aWNlcyBvbiBzdGFydHVwICovCisKKyN1bmRlZiBDRkdfU0NTSV9TQ0FOX0JVU19SRVZFUlNFCisKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfUENJX1BOUAkgICAgICAgICAgICAgICAJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgKi8KKworI3VuZGVmIENPTkZJR19FRVBSTzEwMAorI3VuZGVmIENPTkZJR19UVUxJUAorCisjaWYgIWRlZmluZWQoQ09ORklHX1BDSV9QTlApCisgICAgI2RlZmluZSBQQ0lfRU5FVDBfSU9BRERSCTB4ZTAwMDAwMDAKKyAgICAjZGVmaW5lIFBDSV9FTkVUMF9NRU1BRERSCTB4ZTAwMDAwMDAKKyAgICAjZGVmaW5lIFBDSV9JRFNFTF9OVU1CRVIJMHgwYyAJLyogc2xvdDAtPjMoSURTRUwpPTEyLT4xNSAqLworI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cJCS8qIHNob3cgcGNpIGRldmljZXMgb24gc3RhcnR1cCAqLworCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCisjdW5kZWYgQ09ORklHX1NDU0lfQUhDSQorCisjaWZkZWYgQ09ORklHX1NDU0lfQUhDSQorI2RlZmluZSBDT05GSUdfU0FUQV9VTEk1Mjg4CisjZGVmaW5lIENGR19TQ1NJX01BWF9TQ1NJX0lECTQKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYX0xVTgkxCisjZGVmaW5lIENGR19TQ1NJX01BWF9ERVZJQ0UgCShDRkdfU0NTSV9NQVhfU0NTSV9JRCAqIENGR19TQ1NJX01BWF9MVU4pCisjZGVmaW5lIENGR19TQ1NJX01BWERFVklDRQlDRkdfU0NTSV9NQVhfREVWSUNFCisjZW5kaWYKKworI2VuZGlmCS8qIENPTkZJR19QQ0kgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKKworI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgCTEKKyNlbmRpZgorCisvKiAjZGVmaW5lIENPTkZJR19NSUkJCTEgKi8JLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCisKKyNkZWZpbmUgQ09ORklHX1RTRUMxICAgIDEKKyNkZWZpbmUgQ09ORklHX1RTRUMxX05BTUUgICAgICAgImVUU0VDMSIKKyNkZWZpbmUgQ09ORklHX1RTRUMyICAgIDEKKyNkZWZpbmUgQ09ORklHX1RTRUMyX05BTUUgICAgICAgImVUU0VDMiIKKyNkZWZpbmUgQ09ORklHX1RTRUMzICAgIDEKKyNkZWZpbmUgQ09ORklHX1RTRUMzX05BTUUgICAgICAgImVUU0VDMyIKKyNkZWZpbmUgQ09ORklHX1RTRUM0ICAgIDEKKyNkZWZpbmUgQ09ORklHX1RTRUM0X05BTUUgICAgICAgImVUU0VDNCIKKworI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMHgxRgorI2RlZmluZSBUU0VDMl9QSFlfQUREUgkJMHgwMAorI2RlZmluZSBUU0VDM19QSFlfQUREUgkJMHgwMQorI2RlZmluZSBUU0VDNF9QSFlfQUREUgkJMHgwMgorI2RlZmluZSBUU0VDMV9QSFlJRFgJCTAKKyNkZWZpbmUgVFNFQzJfUEhZSURYCQkwCisjZGVmaW5lIFRTRUMzX1BIWUlEWAkJMAorI2RlZmluZSBUU0VDNF9QSFlJRFgJCTAKKworI2RlZmluZSBDRkdfVEJJUEFfVkFMVUUJMHgxZQkvKiBTZXQgVEJJIGFkZHJlc3Mgbm90IHRvIGNvbmZsaWN0IHdpdGggVFNFQzFfUEhZX0FERFIgKi8KKworI2RlZmluZSBDT05GSUdfRVRIUFJJTUUJCSJlVFNFQzEiCisKKyNlbmRpZgkvKiBDT05GSUdfVFNFQ19FTkVUICovCisKKy8qCisgKiBCQVQwICAgICAgICAgMkcgICAgIENhY2hlYWJsZSwgbm9uLWd1YXJkZWQKKyAqIDB4MDAwMF8wMDAwICAyRyAgICAgRERSCisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQwTAkoQkFUTF9QUF9SVyB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfREJBVDBVCShCQVRVX0JMXzJHIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUMEwJKEJBVExfUFBfUlcgfCBCQVRMX01FTUNPSEVSRU5DRSApCisjZGVmaW5lIENGR19JQkFUMFUJQ0ZHX0RCQVQwVQorCisvKgorICogQkFUMSAgICAgICAgIDFHICAgICBDYWNoZS1pbmhpYml0ZWQsIGd1YXJkZWQKKyAqIDB4ODAwMF8wMDAwICA1MTJNICAgUENJLUV4cHJlc3MgMSBNZW1vcnkKKyAqIDB4YTAwMF8wMDAwICA1MTJNICAgUENJLUV4cHJlc3MgMiBNZW1vcnkKKyAqCUNoYW5nZWQgaXQgZm9yIG9wZXJhdGluZyBmcm9tIDB4ZDAwMDAwMDAKKyAqLworI2RlZmluZSBDRkdfREJBVDFMCSggQ0ZHX1BDSTFfTUVNX0JBU0UgfCBCQVRMX1BQX1JXIFwKKwkJCXwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDFVCShDRkdfUENJMV9NRU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfSUJBVDFMCShDRkdfUENJMV9NRU1fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQxVQlDRkdfREJBVDFVCisKKy8qCisgKiBCQVQyICAgICAgICAgNTEyTSAgIENhY2hlLWluaGliaXRlZCwgZ3VhcmRlZAorICogMHhjMDAwXzAwMDAgIDUxMk0gICBSYXBpZElPIE1lbW9yeQorICovCisjZGVmaW5lIENGR19EQkFUMkwJKENGR19SSU9fTUVNX0JBU0UgfCBCQVRMX1BQX1JXIFwKKwkJCXwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDJVCShDRkdfUklPX01FTV9CQVNFIHwgQkFUVV9CTF81MTJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUMkwJKENGR19SSU9fTUVNX0JBU0UgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCisjZGVmaW5lIENGR19JQkFUMlUJQ0ZHX0RCQVQyVQorCisvKgorICogQkFUMyAgICAgICAgIDRNICAgICBDYWNoZS1pbmhpYml0ZWQsIGd1YXJkZWQKKyAqIDB4ZjgwMF8wMDAwICA0TSAgICAgQ0NTUgorICovCisjZGVmaW5lIENGR19EQkFUM0wJKCBDRkdfQ0NTUkJBUiB8IEJBVExfUFBfUlcgXAorCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUM1UJKENGR19DQ1NSQkFSIHwgQkFUVV9CTF80TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfSUJBVDNMCShDRkdfQ0NTUkJBUiB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQzVQlDRkdfREJBVDNVCisKKy8qCisgKiBCQVQ0ICAgICAgICAgMzJNICAgIENhY2hlLWluaGliaXRlZCwgZ3VhcmRlZAorICogMHhlMjAwXzAwMDAgIDE2TSAgICBQQ0ktRXhwcmVzcyAxIEkvTworICogMHhlMzAwXzAwMDAgIDE2TSAgICBQQ0ktRXhwcmVzcyAyIEkvMAorICogICAgTm90ZSB0aGF0IHRoaXMgaXMgYXQgMHhlMDAwMDAwMAorICovCisjZGVmaW5lIENGR19EQkFUNEwJKCBDRkdfUENJMV9JT19CQVNFIHwgQkFUTF9QUF9SVyBcCisJCQl8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9HVUFSREVEU1RPUkFHRSkKKyNkZWZpbmUgQ0ZHX0RCQVQ0VQkoQ0ZHX1BDSTFfSU9fQkFTRSB8IEJBVFVfQkxfMzJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUNEwJKENGR19QQ0kxX0lPX0JBU0UgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCisjZGVmaW5lIENGR19JQkFUNFUJQ0ZHX0RCQVQ0VQorCisvKgorICogQkFUNSAgICAgICAgIDEyOEsgICBDYWNoZWFibGUsIG5vbi1ndWFyZGVkCisgKiAweGU0MDFfMDAwMCAgMTI4SyAgIEluaXQgUkFNIGZvciBzdGFjayBpbiB0aGUgQ1BVIERDYWNoZSAobm8gYmFja2luZyBtZW1vcnkpCisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQ1TAkoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRMX1BQX1JXIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19EQkFUNVUJKENGR19JTklUX1JBTV9BRERSIHwgQkFUVV9CTF8xMjhLIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUNUwJQ0ZHX0RCQVQ1TAorI2RlZmluZSBDRkdfSUJBVDVVCUNGR19EQkFUNVUKKworLyoKKyAqIEJBVDYgICAgICAgICAzMk0gICAgQ2FjaGUtaW5oaWJpdGVkLCBndWFyZGVkCisgKiAweGZlMDBfMDAwMCAgMzJNICAgIEZMQVNICisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQ2TAkoKENGR19GTEFTSF9CQVNFICYgMHhmZTAwMDAwMCkgfCBCQVRMX1BQX1JXIFwKKwkJCXwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDZVCSgoQ0ZHX0ZMQVNIX0JBU0UgJiAweGZlMDAwMDAwKSB8IEJBVFVfQkxfMzJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUNkwJKChDRkdfRkxBU0hfQkFTRSAmIDB4ZmUwMDAwMDApIHwgQkFUTF9QUF9SVyB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDZVCUNGR19EQkFUNlUKKworI2RlZmluZSBDRkdfREJBVDdMCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0RCQVQ3VQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19JQkFUN0wJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfSUJBVDdVCTB4MDAwMDAwMDAKKworLyoKKyAqIEVudmlyb25tZW50CisgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCisjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgKyAweDQwMDAwKQorI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDQwMDAwCS8qIDI1Nksob25lIHNlY3RvcikgZm9yIGVudiAqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwMAorCisjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCisjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLworCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSTJDCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSovCisjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCisjZWxzZQorICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCisjZW5kaWYKKworI2RlZmluZSBDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzICovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX0haCQkxMDAwCQkvKiBkZWNyZW1lbnRlciBmcmVxOiAxbXMgdGlja3MgKi8KKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCovCisKKy8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCisjZW5kaWYKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKgorICogRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvbgorICovCisKKy8qIFRoZSBtYWMgYWRkcmVzc2VzIGZvciBhbGwgZXRoZXJuZXQgaW50ZXJmYWNlICovCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQorI2RlZmluZSBDT05GSUdfRVRIQUREUiAgIDAyOkUwOjBDOjAwOjAwOjAxCisjZGVmaW5lIENPTkZJR19FVEgxQUREUiAgMDI6RTA6MEM6MDA6MDE6RkQKKyNkZWZpbmUgQ09ORklHX0VUSDJBRERSICAwMjpFMDowQzowMDowMjpGRAorI2RlZmluZSBDT05GSUdfRVRIM0FERFIgIDAyOkUwOjBDOjAwOjAzOkZECisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfSEFTX0VUSDEJCTEKKyNkZWZpbmUgQ09ORklHX0hBU19FVEgyCQkxCisjZGVmaW5lIENPTkZJR19IQVNfRVRIMwkJMQorCisjZGVmaW5lIENPTkZJR19JUEFERFIJCTE5Mi4xNjguMC41MAorCisjZGVmaW5lIENPTkZJR19IT1NUTkFNRQkJc2JjODY0MWQKKyNkZWZpbmUgQ09ORklHX1JPT1RQQVRICQkvb3B0L2VsZGsvcHBjXzc0eHgKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQl1SW1hZ2UKKworI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTE5Mi4xNjguMC4yCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJMTkyLjE2OC4wLjEKKyNkZWZpbmUgQ09ORklHX05FVE1BU0sJCTI1NS4yNTUuMjU1LjAKKworLyogZGVmYXVsdCBsb2NhdGlvbiBmb3IgdGZ0cCBhbmQgYm9vdG0gKi8KKyNkZWZpbmUgQ09ORklHX0xPQURBRERSCQkxMDAwMDAwCisKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWSAxMAkvKiAtMSBkaXNhYmxlcyBhdXRvLWJvb3QgKi8KKyN1bmRlZiAgQ09ORklHX0JPT1RBUkdTCQkvKiB0aGUgYm9vdCBjb21tYW5kIHdpbGwgc2V0IGJvb3RhcmdzICovCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCTExNTIwMAorCisjZGVmaW5lCUNPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJCQkJCVwKKyAgICJuZXRkZXY9ZXRoMFwwIgkJCQkJCQlcCisgICAiY29uc29sZWRldj10dHlTMFwwIgkJCQkJCQlcCisgICAicmFtZGlza2FkZHI9MjAwMDAwMFwwIgkJCQkJCVwKKyAgICJyYW1kaXNrZmlsZT11UmFtZGlza1wwIgkJCQkJCVwKKyAgICJkdGJhZGRyPTQwMDAwMFwwIgkJCQkJCQlcCisgICAiZHRiZmlsZT1zYmM4NjQxZC5kdGJcMCIJCQkJCQlcCisgICAiZW4td2Q9bXcuYiBmODEwMDAxMCAweDA4OyBlY2hvIC1leHBlY3Q6LSAwODsgbWQuYiBmODEwMDAxMCAxXDAiCVwKKyAgICJkaXMtd2Q9bXcuYiBmODEwMDAxMCAweDAwOyBlY2hvIC1leHBlY3Q6LSAwMDsgbWQuYiBmODEwMDAxMCAxXDAiCVwKKyAgICJtYXhjcHVzPTEiCisKKyNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECQkJCQkJXAorICAgInNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQkJCVwKKyAgICAgICJuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgkJCQkJXAorICAgICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIJXAorICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCQkJXAorICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiCQkJCQkJXAorICAgInRmdHAgJGR0YmFkZHIgJGR0YmZpbGU7IgkJCQkJCVwKKyAgICJib290bSAkbG9hZGFkZHIgLSAkZHRiYWRkciIKKworI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQJCQkJCQlcCisgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcncgIgkJCQkJXAorICAgICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIJXAorICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCQkJXAorICAgInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiCQkJCQlcCisgICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCQlcCisgICAidGZ0cCAkZHRiYWRkciAkZHRiZmlsZTsiCQkJCQkJXAorICAgImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIgJGR0YmFkZHIiCisKKyNkZWZpbmUgQ09ORklHX0ZMQVNIQk9PVENPTU1BTkQJCQkJCQlcCisgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcncgIgkJCQkJXAorICAgICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIJXAorICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCQkJXAorICAgImJvb3RtIGZmZDAwMDAwIGZmYjAwMDAwIGZmYTAwMDAwIgorCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCAgQ09ORklHX0ZMQVNIQk9PVENPTU1BTkQKKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYzMuaCBiL2luY2x1ZGUvY29uZmlncy9zYzMuaAppbmRleCBlNDM1N2IwLi5jYjIyNTM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2MzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NjMy5oCkBAIC02OCw4ICs2OCw3IEBACiAgKiBEZWZpbmUgSURFX1VTRVNfSVNBX0VNVUxBVElPTiBmb3Igc2xvd2VyIElERSBhY2Nlc3MgaW4gdGhlIElTQS1JTyBhZGRyZXNzIHJhbmdlCiAgKiBJZiB1bmRlZmluZWQsIElERSBhY2Nlc3MgdXNlcyBhIHNlcGVyYXQgZW11bGF0aW9uIHdpdGggaGlnaGVyIGFjY2VzcyBzcGVlZC4KICAqIENvbnNpZGVyIHRvIGluZm9ybSB5b3VyIExpbnV4IElERSBkcml2ZXIgYWJvdXQgdGhlIGRpZmZlcmVudCBhZGRyZXNzZXMhCi0gKiBJREVfVVNFU19JU0FfRU1VTEFUSU9OIGlzIG9ubHkgdXNlZCBpZiB5b3VyIENPTkZJR19DT01NQU5EUyBtYWNybyBpbmNsdWRlcwotICogdGhlIENGR19DTURfSURFIG1hY3JvIQorICogSURFX1VTRVNfSVNBX0VNVUxBVElPTiBpcyBvbmx5IHVzZWQgaWYgeW91IGRlZmluZSBDT05GSUdfQ01EX0lERSEKICAqLwogI2RlZmluZSBJREVfVVNFU19JU0FfRU1VTEFUSU9OCiAKQEAgLTE2OSwyNSArMTY4LDM2IEBACiAjZGVmaW5lIENPTkZJR19NSUkgMQkJCS8qIGFkZCA0MDVHUCBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCiAjZGVmaW5lIENPTkZJR19QSFlfQUREUiAxCS8qIHRoZSBjb25uZWN0ZWQgUGh5IGRlZmF1bHRzIHRvIGFkZHJlc3MgMSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgIFwKLQkgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQlDRkdfQ01EX0FVVE9TQ1JJUFQJfCBcCi0JCQlDRkdfQ01EX1BDSQkJfCBcCi0JCQlDRkdfQ01EX0lSUQkJfCBcCi0JCQlDRkdfQ01EX05FVAkJfCBcCi0JCQlDRkdfQ01EX01JSQkJfCBcCi0JCQlDRkdfQ01EX1BJTkcJCXwgXAotCQkJQ0ZHX0NNRF9OQU5ECQl8IFwKLQkJCUNGR19DTURfSkZGUzIJCXwgXAotCQkJQ0ZHX0NNRF9JMkMJCXwgXAotCQkJQ0ZHX0NNRF9JREUJCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCQl8IFwKLQkJCUNGR19DTURfREhDUAkJfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCQl8IFwKLQkJCUNGR19DTURfRUxGCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKworI2RlZmluZSBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjc3LDcgKzI4Nyw3IEBACiAgKiBFeHRlcm5hbCBwZXJpcGhlcmFsIGJhc2UgYWRkcmVzcwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jaWYgIShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiAhZGVmaW5lZChDT05GSUdfQ01EX0lERSkKIAogI3VuZGVmCUNPTkZJR19JREVfTEVECQkJLyogbm8gbGVkIGZvciBpZGUgc3VwcG9ydGVkCSovCiAjdW5kZWYJQ09ORklHX0lERV9SRVNFVAkJLyogbm8gcmVzZXQgZm9yIGlkZSBzdXBwb3J0ZWQJKi8KQEAgLTI4Niw3ICsyOTYsNyBAQAogICogSURFL0FUQSBzdHVmZgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jZWxzZSAvKiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAqLworI2Vsc2UKICNkZWZpbmUgQ09ORklHX1NUQVJUX0lERQkxCS8qIGNoZWNrLCBpZiB1c2UgSURFICovCiAKICN1bmRlZglDT05GSUdfSURFXzh4eF9ESVJFQ1QJCS8qIG5vIHBjbWNpYSBpbnRlcmZhY2UgcmVxdWlyZWQgKi8KQEAgLTM0Niw3ICszNTYsNyBAQAogCiAjZW5kaWYgLyogSURFX1VTRVNfSVNBX0VNVUxBVElPTiAqLwogCi0jZW5kaWYgLyogIShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgKi8KKyNlbmRpZgogCiAvKgogI2RlZmluZQlDRkdfS0VZX1JFR19CQVNFX0FERFIJMHhGMDEwMDAwMApAQCAtNDM3LDcgKzQ0Nyw3IEBACiAKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFIDMyCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NjNTIwX2NkcC5oIGIvaW5jbHVkZS9jb25maWdzL3NjNTIwX2NkcC5oCmluZGV4IDhiMmVjMDcuLjg0OTFkOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYzUyMF9jZHAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfY2RwLmgKQEAgLTY0LDI0ICs2NCwzNyBAQAogICovCiAjZGVmaW5lIENPTkZJR19NQUxMT0NfU0laRQkoQ0ZHX0VOVl9TSVpFICsgMTI4KjEwMjQpCiAKLQogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSkZGUzIgfCBDRkdfQ01EX0lERSB8IENGR19DTURfTkVUIHwgQ0ZHX0NNRF9FRVBST00pCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTE1CiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9L2Rldi9tdGRibG9jazAgY29uc29sZT10dHlTMCw5NjAwIgogLyogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDM4MDAwMDAwIiAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKIAotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0xMDQsNyArMTE3LDYgQEAKIAkJCQkJCS8qIHZhbGlkIGJhdWRyYXRlcyAqLwogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFBoeXNpY2FsIE1lbW9yeSBNYXAKICAqLwpAQCAtMTEzLDggKzEyNSw2IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGTEFTSCBhbmQgZW52aXJvbm1lbnQgb3JnYW5pemF0aW9uCiAgKi8KLQotCiAjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMwkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KICNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTY0CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLwogCkBAIC0xMjUsMTEgKzEzNSw5IEBACiAjZGVmaW5lIENPTkZJR19TUElfRUVQUk9NICAgICAgLyogU3VwcG9ydCBmb3IgU1BJIEVFUFJPTXMgKEFUMjUxMjgpICovCiAjZGVmaW5lIENPTkZJR19NV19FRVBST00gICAgICAgLyogU3VwcG9ydCBmb3IgTWljcm9XaXJlIEVFUFJPTXMgKEFUOTNMQzQ2KSAqLwogCi0KIC8qIGFsbG93IHRvIG92ZXJ3cml0ZSBzZXJpYWwgYW5kIGV0aGFkZHIgKi8KICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKIAotCiAvKiBFbnZpcm9ubWVudCBpbiBFRVBST00gKi8KICNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9FRVBST00gICAxCiAjZGVmaW5lIENPTkZJR19TUEkKQEAgLTIwOSw3ICsyMTcsNiBAQAogI2RlZmluZSBDT05GSUdfSTgwNDJfS0JECiAjZGVmaW5lIENGR19JU0FfSU8gMAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJUQwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NjNTIwX3NwdW5rLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfc3B1bmsuaAppbmRleCBhOGUzNTU1Li5jNmY3ZjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfc3B1bmsuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfc3B1bmsuaApAQCAtNjQsMTYgKzY0LDM0IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0pGRlMyIHwgQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX05FVCB8IENGR19DTURfUENNQ0lBIHwgQ0ZHX0NNRF9FRVBST00pCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkxNQogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PS9kZXYvbXRkYmxvY2sxIGNvbnNvbGU9dHR5UzAsOTYwMCBtdGRwYXJ0cz1waHlzOjc5MzZrKHJvb3QpLDI1NmsodWJvb3QpICIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBpcD1hdXRvY29uZiBjb25zb2xlPXR0eVMwLDk2MDAgbXRkcGFydHM9cGh5czo3ODA4ayhyb290KSwxMjhrKGVudiksMjU2ayh1Ym9vdCk7IGJvb3RwOyBib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2NiOTMyOC5oIGIvaW5jbHVkZS9jb25maWdzL3NjYjkzMjguaAppbmRleCBhNDI0OWM0Li5kMTQwMjQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2NiOTMyOC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zY2I5MzI4LmgKQEAgLTM2LDIwICszNiwyNyBAQAogCiAKIC8qCi0gKiBEZWZpbml0aW9uIG9mIHUtYm9vdCBidWlsZCBpbiBjb21tYW5kcy4gQ2hlY2sgb3V0IENPTkZJR19DTURfREZMIGlmCi0gKiBuZWNjZXNzYXJ5IGluIGluY2x1ZGUvY21kX2NvbmZkZWZzLmggZmlsZS4gKFVuKWNvbW1lbnQgZm9yIGdldHRpbmcKLSAqIGZ1bmN0aW9uYWxpdHkgb3Igc2l6ZSBvZiB1LWJvb3QgY29kZS4KKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCSYgfkNGR19DTURfTE9BRFMJXAotCQkJCSYgfkNGR19DTURfQ09OU09MRQlcCi0JCQkJJiB+Q0ZHX0NNRF9BVVRPU0NSSVBUCVwKLQkJCQl8IENGR19DTURfTkVUCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfREhDUAkJXAotCQkJCSkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfQ09OU09MRQorI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorCiAKIC8qCiAgKiBCb290IG9wdGlvbnMuIFNldHRpbmcgZGVsYXkgdG8gLTEgc3RvcHMgYXV0b3N0YXJ0IGNvdW50IGRvd24uCkBAIC0xODIsNyArMTg5LDcgQEAKICAqIFJpZ2h0IG5vdyB0aGVyZSBpcyBubyBnYWluIGZvciB1c2VyLCBidXQgbGF0ZXIgb24gYm9vdGluZyBrZXJuZWwgbWlnaHQgYmUKICAqIHBvc3NpYmxlLiBDb25zaWRlciB1c2luZyBYSVAga2VybmVsIHJ1bm5pbmcgZnJvbSBmbGFzaCB0byBzYXZlIFJBTQogICogZm9vdHByaW50LgotICogTk9URTogRW5hYmxlIENGR19DTURfSkZGUzIgZm9yIEpGRlMyIHN1cHBvcnQuCisgKiBOT1RFOiBFbmFibGUgQ09ORklHX0NNRF9KRkZTMiBmb3IgSkZGUzIgc3VwcG9ydC4KICAqLwogI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkJMAogI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SCQk1CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2VxdW9pYS5oIGIvaW5jbHVkZS9jb25maWdzL3NlcXVvaWEuaAppbmRleCAzMjE5OTkyLi4zZjc1YTQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2VxdW9pYS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zZXF1b2lhLmgKQEAgLTI5OSw5ICsyOTksNiBAQAogLyogQ29tbWVudCB0aGlzIG91dCB0byBlbmFibGUgVVNCIDEuMSBkZXZpY2UgKi8KICNkZWZpbmUgVVNCXzJfMF9ERVZJQ0UKIAotI2RlZmluZSBDTURfVVNCCQkJQ0ZHX0NNRF9VU0IKLSNlbHNlCi0jZGVmaW5lIENNRF9VU0IJCQkwCS8qIG5vIFVTQiBvbiA0NDBHUngJCSovCiAjZW5kaWYgLyogQ09ORklHXzQ0MEVQWCAqLwogCiAvKiBQYXJ0aXRpb25zICovCkBAIC0zMDksMjUgKzMwNiw0MyBAQAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAoQ09ORklHX0NNRF9ERkwJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9BU0tFTlYJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9ESENQCXwJXAotCQkJICAgICAgIENGR19DTURfRFRUCXwJXAotCQkJICAgICAgIENGR19DTURfRElBRwl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0VFUFJPTQl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0VMRgl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0ZBVAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0kyQwl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0lSUQl8CVwKLQkJCSAgICAgICBDRkdfQ01EX01JSQl8CVwKLQkJCSAgICAgICBDRkdfQ01EX05BTkQJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9ORVQJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9ORlMJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9QQ0kJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9QSU5HCXwJXAotCQkJICAgICAgIENGR19DTURfUkVHSU5GTwl8CVwKLQkJCSAgICAgICBDRkdfQ01EX1NEUkFNCXwJXAotCQkJICAgICAgIENNRF9VU0IpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisKKyNpZmRlZiBDT05GSUdfNDQwRVBYCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisjZW5kaWYKKwogCiAvKiBQT1NUIHN1cHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9NRU1PUlkgICB8IFwKQEAgLTM0NywxNSArMzYyLDEyIEBACiAKICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00NDUsNyArNDU3LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJKDMyPDwxMCkgIC8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCSAgICAgIC8qIC4uLgkJCSAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CSAgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDU3LDcgKzQ2OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCSAgICAvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NoYW5ub24uaCBiL2luY2x1ZGUvY29uZmlncy9zaGFubm9uLmgKaW5kZXggNTcyOTg1Yi4uYzFmYTUzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NoYW5ub24uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2hhbm5vbi5oCkBAIC02NiwyMSArNjYsMjggQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jaWYgMCAvKiBYWFggLSBjYW5ub3QgdGVzdCBJREUgYW55d2F5LCBzbyBkaXNhYmxlZCBmb3Igbm93IC0gd2QgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfUENNQ0lBCXwgXAotCQkJCSBDRkdfQ01EX0lERSkKLSNlbmRpZiAvKiAwICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkicm9vdD1yYW1mcyBkZXZmcz1tb3VudCBjb25zb2xlPXR0eVNBMCwxMTUyMDAiCiAjZGVmaW5lIENPTkZJR19ORVRNQVNLICAgICAgICAgIDI1NS4yNTUuMC4wCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiaGVscCIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc21kazI0MDAuaCBiL2luY2x1ZGUvY29uZmlncy9zbWRrMjQwMC5oCmluZGV4IGExMzdmOWQuLjA1ZjYwNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zbWRrMjQwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zbWRrMjQwMC5oCkBAIC04NiwyNCArODYsMzIgQEAKIC8qIFVzZSBzM2MyNDAwJ3MgUlRDICovCiAjZGVmaW5lIENPTkZJR19SVENfUzNDMjRYMAkxCiAKLSNpZm5kZWYgVVNFXzkyMFRfTU1VCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU190bXAgICAgKChDT05GSUdfQ01EX0RGTCAmIH5DRkdfQ01EX0NBQ0hFKSB8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU190bXAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI2lmIGRlZmluZWQoQ09ORklHX0hXRkxPVykKKyAgICAjZGVmaW5lIENPTkZJR19DT05GSUdfSFdGTE9XCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19IV0ZMT1cKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NPTU1BTkRTX3RtcCB8IENGR19DTURfSFdGTE9XKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlDT05GSUdfQ09NTUFORFNfdG1wCisjaWYgIWRlZmluZWQoVVNFXzkyMFRfTU1VKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCiAjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2lmIDAKQEAgLTExOCw3ICsxMjYsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInRmdHA7IGJvb3RtIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NtZGsyNDEwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc21kazI0MTAuaAppbmRleCA3ZWRlYzBkLi5jYTQwNGZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc21kazI0MTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc21kazI0MTAuaApAQCAtNzIsMjIgKzcyLDI2IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIFwKLQkJCShDT05GSUdfQ01EX0RGTAkgfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCSB8IFwKLQkJCS8qQ0ZHX0NNRF9OQU5ECSB8Ki8gXAotCQkJLypDRkdfQ01EX0VFUFJPTSB8Ki8gXAotCQkJLypDRkdfQ01EX0kyQwkgfCovIFwKLQkJCS8qQ0ZHX0NNRF9VU0IJIHwqLyBcCi0JCQlDRkdfQ01EX1JFR0lORk8gIHwgXAotCQkJQ0ZHX0NNRF9EQVRFCSB8IFwKLQkJCUNGR19DTURfRUxGKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAvKiNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkicm9vdD1yYW1mcyBkZXZmcz1tb3VudCBjb25zb2xlPXR0eVNBMCw5NjAwIiAqLwpAQCAtOTgsNyArMTAyLDcgQEAKIC8qI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJImVsaW5vcy1sYXJ0IiAqLwogLyojZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cDsgYm9vdG0iICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NtbWFjbzQuaCBiL2luY2x1ZGUvY29uZmlncy9zbW1hY280LmgKaW5kZXggMTg1YzJkNC4uYWQ2OGM3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NtbWFjbzQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc21tYWNvNC5oCkBAIC00MiwxMSArNDIsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTY1LDMzICs2MCw0MSBAQAogCQkJCSBDRkdfUE9TVF9JMkMpCiAKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICNkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSBNUEM1WFhYX1NSQU1fU0laRS00Ci0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCiAjZW5kaWYKIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZmRlZiBDT05GSUdfUE9TVAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNlbmRpZgorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogZGlzcGxheSBpbWFnZSB0aW1lc3RhbXBzICovCiAKQEAgLTMxOSw3ICszMjIsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzM4LDkgKzM0MSwxMyBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc29yY2VyeS5oIGIvaW5jbHVkZS9jb25maWdzL3NvcmNlcnkuaAppbmRleCA0OTM3NjM4Li5mZTAxNGVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc29yY2VyeS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zb3JjZXJ5LmgKQEAgLTM5LDEyICszOSw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyMjAgQ1BVcyAqLwotCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUgICAJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC02OSwzMCArNjMsMzUgQEAKICNkZWZpbmUgQ09ORklHX1BDSV9DRkdfUEhZUwlDT05GSUdfUENJX0NGR19CVVMKICNkZWZpbmUgQ09ORklHX1BDSV9DRkdfU0laRQkweDAxMDAwMDAwCiAKKwogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQk9PVEQJfCBcCi0JCQkJQ0ZHX0NNRF9DQUNIRQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQkJMCkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qCQkJQ0ZHX0NNRF9NSUkJfCBcICovCi0vKgkJCSAgICAgICBDRkdfQ01EX1VTQgl8IFwgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBEZWZhdWx0IEVudmlyb25tZW50CkBAIC0yNjgsNyArMjY3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkgICAgLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJICAgIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CSAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CSAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjg0LDYgKzI4MywxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJICAgIC8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyMjAgQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgIAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc3BjMTkyMC5oIGIvaW5jbHVkZS9jb25maWdzL3NwYzE5MjAuaAppbmRleCAwOWJiZWJkLi5iNGFiOWFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3BjMTkyMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zcGMxOTIwLmgKQEAgLTgwLDI0ICs4MCwzMyBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI2RlZmluZSBDT05GSUdfQlpJUDIJIC8qIGluY2x1ZGUgc3VwcG9ydCBmb3IgYnppcDIgY29tcHJlc3NlZCBpbWFnZXMgKi8KIAotI2lmbmRlZiBDT05GSUdfQ09NTUFORFMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCAgIFwKLQkJCSB8IENGR19DTURfQVNLRU5WIFwKLQkJCSB8IENGR19DTURfREFURSBcCi0JCQkgfCBDRkdfQ01EX0VDSE8gICBcCi0JCQkgfCBDRkdfQ01EX0lNTUFQICBcCi0JCQkgfCBDRkdfQ01EX0pGRlMyIFwKLQkJCSB8IENGR19DTURfUElORyBcCi0JCQkgfCBDRkdfQ01EX0RIQ1AgXAotCQkJIHwgQ0ZHX0NNRF9JMkMgXAotCQkJIHwgQ0ZHX0NNRF9NSUkpCi0JCQkvKiAmIH4oIENGR19DTURfTkVUKSkgKi8KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAogCi0jZW5kaWYgLyogIUNPTkZJR19DT01NQU5EUyAqLworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTA3LDcgKzExNiw3IEBACiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTQsNyArMjAzLDcgQEAKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KIAotI2lmZGVmIENGR19DTURfREFURQorI2lmZGVmIENPTkZJR19DTURfREFURQogIyBkZWZpbmUgQ09ORklHX1JUQ19EUzMyMzEKICMgZGVmaW5lIENGR19JMkNfUlRDX0FERFIgICAgICAweDY4CiAjZW5kaWYKQEAgLTIwMiw3ICsyMTEsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSTJDIGNvbmZpZ3VyYXRpb24KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogLyogZW5hYmxlIEkyQyBhbmQgc2VsZWN0IHRoZSBoYXJkd2FyZS9zb2Z0d2FyZSBkcml2ZXIgKi8KICN1bmRlZiBDT05GSUdfSEFSRF9JMkMgICAgICAgICAgICAgICAgIC8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgICAgKi8KICNkZWZpbmUgQ09ORklHX1NPRlRfSTJDICAgICAgICAgICAgICAgIDEgICAgICAgLyogSTJDIGJpdC1iYW5nZWQgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NwaWV2YWwuaCBiL2luY2x1ZGUvY29uZmlncy9zcGlldmFsLmgKaW5kZXggOTg4OGQxMS4uNGI2MThmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NwaWV2YWwuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc3BpZXZhbC5oCkBAIC00NCwxMSArNDQsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTg4LDEyICs4Myw2IEBACiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAjZW5kaWYJLyogQ09ORklHX1NUSzUyWFggKi8KIAotI2lmZGVmIENPTkZJR19QQ0kKLSNkZWZpbmUgQUREX1BDSV9DTUQJCUNGR19DTURfUENJCi0jZWxzZQotI2RlZmluZSBBRERfUENJX0NNRAkJMAotI2VuZGlmCi0KIC8qCiAgKiBWaWRlbyBjb25zb2xlCiAgKi8KQEAgLTExMCwxMiArOTksNiBAQAogI2RlZmluZSBDRkdfQ09OU09MRV9JU19JTl9FTlYKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1ZJREVPCi0jZGVmaW5lIEFERF9CTVBfQ01ECQlDRkdfQ01EX0JNUAotI2Vsc2UKLSNkZWZpbmUgQUREX0JNUF9DTUQJCTAKLSNlbmRpZgotCiAvKiBQYXJ0aXRpb25zICovCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMjQsMTAgKzEwNyw3IEBACiAvKiBVU0IgKi8KICNpZmRlZiBDT05GSUdfU1RLNTJYWAogI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKLSNkZWZpbmUgQUREX1VTQl9DTUQJCUNGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRAkJMAogI2VuZGlmCiAKIC8qIFBPU1Qgc3VwcG9ydCAqLwpAQCAtMTM2LDQzICsxMTYsNjAgQEAKIAkJCQkgQ0ZHX1BPU1RfSTJDKQogCiAjaWZkZWYgQ09ORklHX1BPU1QKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgQ0ZHX0NNRF9ESUFHCiAvKiBwcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHBvc3Rfd29yZCBhdCBlbmQgb2Ygb24tY2hpcCBTUkFNICovCiAjZGVmaW5lIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUgTVBDNVhYWF9TUkFNX1NJWkUtNAotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgMAogI2VuZGlmCiAKLS8qIElERSAqLwotI2lmIGRlZmluZWQgKENPTkZJR19NSU5JRkFQKSB8fCBkZWZpbmVkIChDT05GSUdfU1RLNTJYWCkKLSNkZWZpbmUgQUREX0lERV9DTUQJCShDRkdfQ01EX0lERSB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9FWFQyKQotI2Vsc2UKLSNkZWZpbmUgQUREX0lERV9DTUQJCTAKLSNlbmRpZgogCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQUREX0JNUF9DTUQJfCBcCi0JCQkJQUREX0lERV9DTUQJfCBcCi0JCQkJQUREX1BDSV9DTUQJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VDSE8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWYgZGVmaW5lZChDT05GSUdfTUlOSUZBUCkgfHwgZGVmaW5lZChDT05GSUdfU1RLNTJYWCkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSURFCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEs1MlhYCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1VTQgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZJREVPCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE9TVAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNlbmRpZgorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogZGlzcGxheSBpbWFnZSB0aW1lc3RhbXBzICovCiAKQEAgLTQwNiw3ICs0MDMsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtNDI1LDkgKzQyMiwxMyBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc3R4Z3AzLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc3R4Z3AzLmgKaW5kZXggMjEwNjViOS4uMWY0MWNmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3N0eGdwMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zdHhncDMuaApAQCAtMjk4LDM0ICsyOTgsMzggQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisKICNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IFwKLQkJCQkgIENGR19DTURfTE9BRFMgKSkKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORyB8IFwKLQkJCQlDRkdfQ01EX01JSSB8IENGR19DTURfSTJDICkgJiBcCi0JCQkJfihDRkdfQ01EX0VOVikpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKLSAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01JSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykgJiBcCi0JCQkJfihDRkdfQ01EX0VOVikpCi0gICNlbmRpZgorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCiAjZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgXAotCQkJCUNGR19DTURfRUxGIHwgQ0ZHX0NNRF9NSUkgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NSUkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VMRgogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKKyAgICAjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTMzNCw3ICszMzgsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSJHUFBQPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNTUsNyArMzU5LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0zNjcsNyArMzcxLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3N0eHNzYS5oIGIvaW5jbHVkZS9jb25maWdzL3N0eHNzYS5oCmluZGV4IDJlNTI3YjIuLjU1ZTJjOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zdHhzc2EuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc3R4c3NhLmgKQEAgLTMyNSwzNCArMzI1LDM5IEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRzCSovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IFwKLQkJCQkgIENGR19DTURfTE9BRFMgKSkKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORyB8IFwKLQkJCQlDRkdfQ01EX01JSSB8IENGR19DTURfSTJDICkgJiBcCi0JCQkJfihDRkdfQ01EX0VOVikpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKLSAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01JSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykgJiBcCi0JCQkJfihDRkdfQ01EX0VOVikpCi0gICNlbmRpZgotI2Vsc2UKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgXAotCQkJCUNGR19DTURfRUxGIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLSAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORyB8IFwKLQkJCQlDRkdfQ01EX0VMRiB8IENGR19DTURfTUlJIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKLSAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfRUxGIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKSB8fCBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZWxzZQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMzYxLDcgKzM2Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIlNTQT0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzgyLDcgKzM4Nyw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtMzk0LDcgKzM5OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zdHh4dGMuaCBiL2luY2x1ZGUvY29uZmlncy9zdHh4dGMuaAppbmRleCA2MTRhMDQ2Li4wZGJmNGI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3R4eHRjLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3N0eHh0Yy5oCkBAIC03Nyw3ICs3NywxNiBAQAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KICNkZWZpbmUgQ09ORklHX0JPQVJEX1NQRUNJRklDX0xFRAkvKiB2ZXJzaW9uIGhhcyBib2FyZCBzcGVjaWZpYyBsZWRzICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBDT05GSUdfQk9PVFBfTklTRE9NQUlOKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgorCiAKICN1bmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgogI3VuZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMDAsMTkgKzEwOSwyMiBAQAogCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCTEJLyogYWxsb3cgbW9kaWZpY2F0aW9uIG9mIHZlbmRvciBwYXJhbXMgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUElORyAgCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRgkxCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTEyMiw3ICsxMzQsNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJMQogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjEzLDcgKzIyNSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc3V6YWt1LmggYi9pbmNsdWRlL2NvbmZpZ3Mvc3V6YWt1LmgKaW5kZXggODIyNDU1NS4uMDhhYzljYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3N1emFrdS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zdXpha3UuaApAQCAtNTUsMTAgKzU1LDIxIEBACiAjZGVmaW5lIE1JQ1JPQkxBWkVfU1lTUkVHX0JBU0VfQUREUiAweEZGRkZBMDAwCiAjZGVmaW5lIE1JQ1JPQkxBWkVfU1lTUkVHX1JFQ09ORklHVVJFICgxIDw8IDApCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICNkZWZpbmUgQ0ZHX1VBUlQxX0JBU0UJCSgweEZGRkYyMDAwKQogI2RlZmluZSBDT05GSUdfU0VSSUFMX0JBU0UJQ0ZHX1VBUlQxX0JBU0UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zdm1fc2M4eHguaCBiL2luY2x1ZGUvY29uZmlncy9zdm1fc2M4eHguaAppbmRleCA5MmVlOGNiLi4zYjkwZjNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3ZtX3NjOHh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3N2bV9zYzh4eC5oCkBAIC0xMjUsMjIgKzEyNSwzMiBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYgIHwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLS8qCQkJCUNGR19DTURfSURFICAgICB8Ki8gXAotCQkJCUNGR19DTURfREFURQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKworCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAvKgpAQCAtMTUzLDcgKzE2Myw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgICAgICI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNDYsNyArMjU2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3RhaWh1LmggYi9pbmNsdWRlL2NvbmZpZ3MvdGFpaHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjIzZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL3RhaWh1LmgKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDUtMjAwNworICogQmVpamluZyBVRCBUZWNobm9sb2d5IENvLiwgTHRkLiwgdGFpaHVzdXBwb3J0QGFtY2MuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworCisjZGVmaW5lIENPTkZJR180MDVFUAkJMQkvKiB0aGlzIGlzIGEgUFBDNDA1IENQVSAqLworI2RlZmluZSBDT05GSUdfNHh4CQkxCS8qICBtZW1iZXIgb2YgUFBDNHh4IGZhbWlseSAqLworI2RlZmluZSBDT05GSUdfVEFJSFUJICAgICAgICAxCS8qICBvbiBhIHRhaWh1IGJvYXJkICovCisKKyNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRiAxCS8qIGNhbGwgYm9hcmRfZWFybHlfaW5pdF9mICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgMzMwMDAwMDAgLyogZXh0ZXJuYWwgZnJlcXVlbmN5IHRvIHBsbCAgICovCisKKyNkZWZpbmUgQ09ORklHX05PX1NFUklBTF9FRVBST00KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBDT05GSUdfTk9fU0VSSUFMX0VFUFJPTQorCisvKgorIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyEgUExMIHNldHRpbmdzIGZvciAzMzNNSHogQ1BVLCAxMTFNSHogUExCL1NEUkFNLCA1NU1IeiBFQkMsIDMzTUh6IFBDSSwKKyEgYXNzdW1pbmcgYSAzM01IeiBpbnB1dCBjbG9jayB0byB0aGUgNDA1RVAgZnJvbSB0aGUgQzk1MzEuCishLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgUExMTVIwXzMzM18xMTFfNTVfMzcgKFBMTF9DUFVESVZfMSB8IFBMTF9QTEJESVZfMyB8ICBcCisJCQkgICAgICBQTExfT1BCRElWXzIgfCBQTExfRVhUQlVTRElWXzIgfCAgXAorCQkJICAgICAgUExMX01BTERJVl8xIHwgUExMX1BDSURJVl8zKQorI2RlZmluZSBQTExNUjFfMzMzXzExMV81NV8zNyAoUExMX0ZCS0RJVl8xMCAgfCAgXAorCQkJICAgICAgUExMX0ZXRERJVkFfMyB8IFBMTF9GV0RESVZCXzMgfCAgXAorCQkJICAgICAgUExMX1RVTkVfMTVfTV80MCB8IFBMTF9UVU5FX1ZDT19ISSkKKyNkZWZpbmUgUExMTVIwXzMzM18xMTFfNTVfMTExIChQTExfQ1BVRElWXzEgfCBQTExfUExCRElWXzMgfCAgXAorCQkJICAgICAgIFBMTF9PUEJESVZfMiB8IFBMTF9FWFRCVVNESVZfMiB8ICBcCisJCQkgICAgICAgUExMX01BTERJVl8xIHwgUExMX1BDSURJVl8xKQorI2RlZmluZSBQTExNUjFfMzMzXzExMV81NV8xMTEgKFBMTF9GQktESVZfMTAgIHwgIFwKKwkJCSAgICAgICBQTExfRldERElWQV8zIHwgUExMX0ZXRERJVkJfMyB8ICBcCisJCQkgICAgICAgUExMX1RVTkVfMTVfTV80MCB8IFBMTF9UVU5FX1ZDT19ISSkKKworI2RlZmluZSBQTExNUjBfREVGQVVMVAkJUExMTVIwXzMzM18xMTFfNTVfMzcKKyNkZWZpbmUgUExMTVIxX0RFRkFVTFQJCVBMTE1SMV8zMzNfMTExXzU1XzM3CisjZGVmaW5lIFBMTE1SMF9ERUZBVUxUX1BDSTY2CVBMTE1SMF8zMzNfMTExXzU1XzExMQorI2RlZmluZSBQTExNUjFfREVGQVVMVF9QQ0k2NglQTExNUjFfMzMzXzExMV81NV8xMTEKKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0ggICAgIDEJLyogdXNlIEZMQVNIIGZvciBlbnZpcm9ubWVudCB2YXJzICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUgMQorI2RlZmluZSBDT05GSUdfUFJFQk9PVAkiZWNobzsiCVwKKwkiZWNobyBUeXBlIFwicnVuIGZsYXNoX25mc1wiIHRvIG1vdW50IHJvb3QgZmlsZXN5c3RlbSBvdmVyIE5GUzsiIFwKKwkiZWNobyIKKworI3VuZGVmCUNPTkZJR19CT09UQVJHUworI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCisJImJvb3RmaWxlPS90ZnRwYm9vdC90YWlodS91SW1hZ2VcMCIJCQkJXAorCSJyb290cGF0aD0vb3B0L2VsZGsvcHBjXzR4eFwwIgkJCQkJXAorCSJuZXRkZXY9ZXRoMFwwIgkJCQkJCQlcCisJIm5mc2FyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIgkJCVwKKwkJIm5mc3Jvb3Q9JHtzZXJ2ZXJpcH06JHtyb290cGF0aH1cMCIJCQlcCisJInJhbWFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcndcMCIJCQlcCisJImFkZGlwPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAiCQkJCVwKKwkJImlwPSR7aXBhZGRyfToke3NlcnZlcmlwfToke2dhdGV3YXlpcH06JHtuZXRtYXNrfSIJXAorCQkiOiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgcGFuaWM9MVwwIgkJCVwKKwkiYWRkdHR5PXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSBjb25zb2xlPXR0eVMwLCR7YmF1ZHJhdGV9XDAiXAorCSJmbGFzaF9uZnM9cnVuIG5mc2FyZ3MgYWRkaXAgYWRkdHR5OyIJCQkJXAorCQkiYm9vdG0gJHtrZXJuZWxfYWRkcn1cMCIJCQkJXAorCSJmbGFzaF9zZWxmPXJ1biByYW1hcmdzIGFkZGlwIGFkZHR0eTsiCQkJCVwKKwkJImJvb3RtICR7a2VybmVsX2FkZHJ9ICR7cmFtZGlza19hZGRyfVwwIgkJXAorCSJuZXRfbmZzPXRmdHAgMjAwMDAwICR7Ym9vdGZpbGV9O3J1biBuZnNhcmdzIGFkZGlwIGFkZHR0eTsiICAgICBcCisJICAgICAgICAiYm9vdG1cMCIJCQkJCQlcCisJImtlcm5lbF9hZGRyPUZDMDAwMDAwXDAiCQkJCQlcCisJInJhbWRpc2tfYWRkcj1GQzE4MDAwMFwwIgkJCQkJXAorCSJsb2FkPXRmdHAgMjAwMDAwIC90ZnRwYm9vdC90YWlodS91LWJvb3QuYmluXDAiCQkJXAorCSJ1cGRhdGU9cHJvdGVjdCBvZmYgRkZGQzAwMDAgRkZGRkZGRkY7ZXJhIEZGRkMwMDAwIEZGRkZGRkZGOyIJXAorCQkiY3AuYiAyMDAwMDAgRkZGQzAwMDAgNDAwMDBcMCIJCQkJXAorCSJ1cGQ9cnVuIGxvYWQ7cnVuIHVwZGF0ZVwwIgkJCQkJXAorCSIiCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIGZsYXNoX3NlbGYiCisKKyNpZiAwCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KKworI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KKyNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkweDE0CS8qIFBIWSBhZGRyZXNzCQkJKi8KKyNkZWZpbmUgQ09ORklHX0hBU19FVEgxCisjZGVmaW5lIENPTkZJR19QSFkxX0FERFIJMHgxMAkvKiBFTUFDMSBQSFkgYWRkcmVzcwkJKi8KKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCisjZGVmaW5lIENGR19SWF9FVEhfQlVGRkVSCTE2CS8qIE51bWJlciBvZiBldGhlcm5ldCByeCBidWZmZXJzICYgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQ09ORklHX1BIWV9SRVNFVAkxCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NQSQorCisjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KKworI3VuZGVmIENPTkZJR19TUERfRUVQUk9NCQkvKiB1c2UgU1BEIEVFUFJPTSBmb3Igc2V0dXAgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX1NJWkVfUEVSX0JBTksgMHgwNDAwMDAwMCAvKiA2NE1CICovCisjZGVmaW5lIENGR19TRFJBTV9CQU5LUwkgICAgICAgIDIKKworLyoKKyAqIFNEUkFNIGNvbmZpZ3VyYXRpb24gKHBsZWFzZSBzZWUgY3B1L3BwYy9zZHJhbS5bY2hdKQorICovCisjZGVmaW5lIENPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAgKi8KKyNkZWZpbmUgQ09ORklHX1NEUkFNX0JBTksxCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMSAqLworCisvKiBTRFJBTSB0aW1pbmdzIHVzZWQgaW4gZGF0YXNoZWV0ICovCisjZGVmaW5lIENGR19TRFJBTV9DTCAgICAgICAgICAgIDMJLyogQ0FTIGxhdGVuY3kgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX3RSUCAgICAgICAgICAgMjAJLyogUFJFQ0hBUkdFIGNvbW1hbmQgcGVyaW9kICovCisjZGVmaW5lIENGR19TRFJBTV90UkMgICAgICAgICAgIDY2CS8qIEFDVElWRS10by1BQ1RJVkUgY29tbWFuZCBwZXJpb2QgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX3RSQ0QgICAgICAgICAgMjAJLyogQUNUSVZFLXRvLVJFQUQgZGVsYXkgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX3RSRkMJCTY2CS8qIEF1dG8gcmVmcmVzaCBwZXJpb2QgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZWxzZQorI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogcHJpbnQgYnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVCAgMHgwNDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECSAgIDB4MEMwMDAwMAkvKiA0IC4uLiAxMiBNQiBpbiBEUkFNCSovCisKKy8qCisgKiBJZiBDRkdfRVhUX1NFUklBTF9DTE9DSywgdGhlbiB0aGUgVUFSVCBkaXZpc29yIGlzIDEuCisgKiBJZiBDRkdfNDA1X1VBUlRfRVJSQVRBXzU5LCB0aGVuIFVBUlQgZGl2aXNvciBpcyAzMS4KKyAqIE90aGVyd2lzZSwgVUFSVCBkaXZpc29yIGlzIGRldGVybWluZWQgYnkgQ1BVIENsb2NrIGFuZCBDRkdfQkFTRV9CQVVEIHZhbHVlLgorICogVGhlIExpbnV4IEJBU0VfQkFVRCBkZWZpbmUgc2hvdWxkIG1hdGNoIHRoaXMgY29uZmlndXJhdGlvbi4KKyAqICAgIGJhc2VCYXVkID0gY3B1Q2xvY2svKHVhcnREaXZpc29yKjE2KQorICogSWYgQ0ZHXzQwNV9VQVJUX0VSUkFUQV81OSBhbmQgMjAwTUh6IENQVSBjbG9jaywKKyAqIHNldCBMaW51eCBCQVNFX0JBVUQgdG8gNDAzMjAwLgorICovCisjdW5kZWYJQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPCisjdW5kZWYgIENGR19FWFRfU0VSSUFMX0NMT0NLICAgICAgICAgICAvKiBleHRlcm5hbCBzZXJpYWwgY2xvY2sgKi8KKyN1bmRlZiAgQ0ZHXzQwNV9VQVJUX0VSUkFUQV81OSAgICAgICAgIC8qIDQwNUdQL0NSIFJldi4gRCBzaWxpY29uICovCisjZGVmaW5lIENGR19CQVNFX0JBVUQJCTY5MTIwMAorCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCisKKyNkZWZpbmUgQ09ORklHX1VBUlQxX0NPTlNPTEUJMQorCisvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGluY2x1ZGVzIHRoZSBzdXBwb3J0ZWQgYmF1ZHJhdGVzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAorICAgIHszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDB9CisKKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkgICAgMHgxMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0VYVEJESU5GTwkJMQkvKiBUbyB1c2UgZXh0ZW5kZWQgYm9hcmRfaW50byAoYmRfdCkgKi8KKworI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MJKi8KKworI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURQkxICAgICAgIC8qIGFkZCBhdXRvY29tcGxldGlvbiBzdXBwb3J0ICAgKi8KKyNkZWZpbmUgQ09ORklHX0xPT1BXICAgICAgICAgICAgMSAgICAgICAvKiBlbmFibGUgbG9vcHcgY29tbWFuZCAgICAgICAgICovCisjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBjaGVjayBmb3Iga2V5cHJlc3Mgb24gYm9vdGRlbGF5PT0wICovCisjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFIDEJLyogaW5jbHVkZSB2ZXJzaW9uIGVudiB2YXJpYWJsZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMgc3R1ZmYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCTEJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydAkqLworI3VuZGVmICBDT05GSUdfU09GVF9JMkMJCQkvKiBJMkMgYml0LWJhbmdlZAkJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisKKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7IDB4NjkgfSAvKiBhdm9pZCBpcHJvYmUgaGFuZ3VwICh3aHk/KSAqLworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMJNiAvKiAyNEMwMiByZXF1aXJlcyA1bXMgZGVsYXkgKi8KKworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCTB4NTAJLyogSTJDIGJvb3QgRUVQUk9NICgyNEMwMlcpCSovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KKworI2RlZmluZSBDT05GSUdfU09GVF9TUEkKKyNkZWZpbmUgU1BJX1NDTCAgc3BpX3NjbAorI2RlZmluZSBTUElfU0RBICBzcGlfc2RhCisjZGVmaW5lIFNQSV9SRUFEIHNwaV9yZWFkKCkKKyNkZWZpbmUgU1BJX0RFTEFZIHVkZWxheSgyKQorI2lmbmRlZiBfX0FTU0VNQkxZX18KK3ZvaWQgc3BpX3NjbChpbnQpOwordm9pZCBzcGlfc2RhKGludCk7Cit1bnNpZ25lZCBjaGFyIHNwaV9yZWFkKHZvaWQpOworI2VuZGlmCisKKy8qIHN0YW5kYXJkIGR0dCBzZW5zb3IgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDT05GSUdfRFRUX0RTMTc3NQkxCisjZGVmaW5lIENPTkZJR19EVFRfU0VOU09SUwl7IDAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQQ0kgc3R1ZmYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBQQ0lfSE9TVF9BREFQVEVSIDAJCS8qIGNvbmZpZ3VyZSBhciBwY2kgYWRhcHRlciAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9GT1JDRSAgIDEJCS8qIGNvbmZpZ3VyZSBhcyBwY2kgaG9zdCAgICAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9BVVRPICAgIDIJCS8qIGRldGVjdGVkIHZpYSBhcmJpdGVyIGVuYWJsZSAqLworCisjZGVmaW5lIENPTkZJR19QQ0kJCQkvKiBpbmNsdWRlIHBjaSBzdXBwb3J0CSAgICAgICAqLworI2RlZmluZSBDT05GSUdfUENJX0hPU1QJUENJX0hPU1RfRk9SQ0UgIC8qIHNlbGVjdCBwY2kgaG9zdCBmdW5jdGlvbiAgICAqLworI2RlZmluZSBDT05GSUdfUENJX1BOUAkJCS8qIGRvIHBjaSBwbHVnLWFuZC1wbGF5ICAgICAgICAqLworCQkJCQkvKiByZXNvdXJjZSBjb25maWd1cmF0aW9uICAgICAgKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cgICAgICAgICAgICAvKiBzaG93IHBjaSBkZXZpY2VzIG9uIHN0YXJ0dXAgKi8KKworI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEwZTgJLyogQU1DQyAqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19ERVZJQ0VJRCAweGNhZmUJLyogV2hhdGV2ZXIgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9DTEFTU0NPREUgICAgICAgMHgwNjAwICAvKiBQQ0kgQ2xhc3MgQ29kZTogYnJpZGdlL2hvc3QgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xTEEJICAgIDB4MDAwMDAwMDAJLyogcG9pbnQgdG8gc2RyYW0gICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMU1TICAgICAgMHg4MDAwMDAwMQkvKiAyR0IsIGVuYWJsZSBoYXJkLXdpcmVkIHRvIDEgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xUENJICAgICAweDAwMDAwMDAwCS8qIEhvc3Q6IHVzZSB0aGlzIHBjaSBhZGRyZXNzICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJMQSAgICAgIDB4MDAwMDAwMDAJLyogZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMk1TCSAgICAweDAwMDAwMDAwCS8qIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJQQ0kgICAgIDB4MDQwMDAwMDAJLyogSG9zdDogdXNlIHRoaXMgcGNpIGFkZHJlc3MgICovCisjZGVmaW5lIENPTkZJR19FRVBSTzEwMAkJMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGRTAwMDAwCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMTI4ICogMTAyNCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIG1hbGxvYygpCSovCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJKC1DRkdfTU9OSVRPUl9MRU4pCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkyCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FERFIwICAgICAgICAgMHg1NTUKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FERFIxICAgICAgICAgMHgyYWEKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAgICAgdW5zaWduZWQgc2hvcnQKKworI2lmZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgxMDAwMAkvKiBzaXplIG9mIG9uZSBjb21wbGV0ZSBzZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRS1DRkdfRU5WX1NFQ1RfU0laRSkKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDQwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKworLyogQWRkcmVzcyBhbmQgc2l6ZSBvZiBSZWR1bmRhbnQgRW52aXJvbm1lbnQgU2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJKENGR19FTlZfQUREUi1DRkdfRU5WX1NFQ1RfU0laRSkKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFX1JFRFVORAkoQ0ZHX0VOVl9TSVpFKQorI2VuZGlmIC8qIENGR19FTlZfSVNfSU5fRkxBU0ggKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTlZSQU0gb3JnYW5pemF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX05WUkFNX0JBU0VfQUREUgkweGYwMDAwMDAwCS8qIE5WUkFNIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfTlZSQU1fU0laRQkJMHgxZmY4CQkvKiBOVlJBTSBzaXplICovCisKKyNpZmRlZiBDRkdfRU5WX0lTX0lOX05WUkFNCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgwZmY4CQkvKiBTaXplIG9mIEVudmlyb25tZW50IHZhcnMgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQlcCisJKENGR19OVlJBTV9CQVNFX0FERFIrQ0ZHX05WUkFNX1NJWkUtQ0ZHX0VOVl9TSVpFKQkvKiBFbnYqLworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBQQzQwNSBHUElPIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfNDQwX0dQSU9fVEFCTEUgeyAvKgkJCQlHUElPCUFsdGVybmF0ZTEJCSovCVwKK3sJCQkJCQkJCQkJCQlcCisvKiBHUElPIENvcmUgMCAqLwkJCQkJCQkJCQlcCit7IEdQSU9fQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMLCAgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8wCVBlckJMYXN0ICAgIFNQSSBDUwkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8xCVRTMUUJCQkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8yCVRTMkUJCQkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8zCVRTMU8JCQkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU80CVRTMk8JCQkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU81CVRTMwkJCSovCVwKK3sgR1BJT19CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEcgfSwgLyogR1BJTzYJVFM0CQkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPNwlUUzUJCQkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU84CVRTNgkJCSovCVwKK3sgR1BJT19CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEcgfSwgLyogR1BJTzkJVHJjQ2xrCQkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMTAJUGVyQ1MxCQkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMTEJUGVyQ1MyCQkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMTIJUGVyQ1MzCQkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMTMJUGVyQ1M0CQkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMTQJUGVyQWRkcjAzICAgU1BJIFNDTEsJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCwgIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMTUJUGVyQWRkcjA0ICAgU1BJIERJCSovCVwKK3sgR1BJT19CQVNFLCBHUElPX09VVCwgR1BJT19TRUwsICBHUElPX09VVF9OT19DSEcgfSwgLyogR1BJTzE2CVBlckFkZHIwNSAgIFNQSSBETwkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8xNwlJUlEwCSAgICBQQ0kgSU5UQQkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8xOAlJUlExCSAgICBQQ0kgSU5UQgkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8xOQlJUlEyCSAgICBQQ0kgSU5UQwkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8yMAlJUlEzCSAgICBQQ0kgSU5URAkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8yMQlJUlE0CSAgICBVU0IJCSovCVwKK3sgR1BJT19CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEcgfSwgLyogR1BJTzIyCUlSUTUJICAgIEVCQwkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMjMJSVJRNgkgICAgdW51c2VkCSovCVwKK3sgR1BJT19CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEcgfSwgLyogR1BJTzI0CVVBUlQwX0RDRCAgIFVBUlQxCSovCVwKK3sgR1BJT19CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEcgfSwgLyogR1BJTzI1CVVBUlQwX0RTUgkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMjYJVUFSVDBfUkkJCSovCVwKK3sgR1BJT19CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEcgfSwgLyogR1BJTzI3CVVBUlQwX0RUUgkJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMjgJVUFSVDFfUnggICAgVUFSVDAgCSovCVwKK3sgR1BJT19CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEcgfSwgLyogR1BJTzI5CVVBUlQxX1R4CQkqLwlcCit7IEdQSU9fQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMLCAgR1BJT19PVVRfTk9fQ0hHIH0sIC8qIEdQSU8zMAlSZWplY3RQa3QwICBVc2VyIExFRDEJKi8JXAoreyBHUElPX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgIEdQSU9fT1VUX05PX0NIRyB9LCAvKiBHUElPMzEJUmVqZWN0UGt0MSAgVXNlciBMRUQyCSovCVwKK30JCQkJCQkJCQkJCQlcCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBJQk0gNDA1RVAgQ1BVICovCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKworLyoKKyAqIEluaXQgTWVtb3J5IENvbnRyb2xsZXI6CisgKgorICogQlIwLzEgYW5kIE9SMC8xIChGTEFTSCkKKyAqLworCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTSBDRkdfRkxBU0hfQkFTRSAvKiBGTEFTSCBiYW5rICMwICovCisjZGVmaW5lIEZMQVNIX0JBU0UxX1BSRUxJTSAgMHhGQzAwMDAwMAkvKiBGTEFTSCBiYW5rICMxICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gZGF0YSBjYWNoZSkKKyAqLworLyogdXNlIG9uIGNoaXAgbWVtb3J5IChPQ00pIGZvciB0ZW1wZXJhcnkgc3RhY2sgdW50aWwgc2RyYW0gaXMgdGVzdGVkICovCisjZGVmaW5lIENGR19URU1QX1NUQUNLX09DTSAgICAgICAgMQorCisvKiBPbiBDaGlwIE1lbW9yeSBsb2NhdGlvbiAqLworI2RlZmluZSBDRkdfT0NNX0RBVEFfQUREUgkweEY4MDAwMDAwCisjZGVmaW5lIENGR19PQ01fREFUQV9TSVpFCTB4MTAwMAorI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUglDRkdfT0NNX0RBVEFfQUREUiAvKiBpbnNpZGUgb2YgU0RSQU0JCSovCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJQ0ZHX09DTV9EQVRBX1NJWkUgLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0JKi8KKworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgICAgIDEyOCAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgICAgKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUICAgICAgQ0ZHX0dCTF9EQVRBX09GRlNFVAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBCdXMgQ29udHJvbGxlciAoRUJDKSBTZXR1cAorICovCisKKy8qIE1lbW9yeSBCYW5rIDAgKEZsYXNoL1NSQU0pIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIENGR19FQkNfUEIwQVAgICAgICAgICAgIDB4MDM4MTU2MDAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjBDUiAgICAgICAgICAgMHhGRkUzQTAwMCAgLyogQkFTPTB4RkZFLEJTPTJNQixCVT1SL1csQlc9MTZiaXQgKi8KKworLyogTWVtb3J5IEJhbmsgMSAoTlZSQU0vUlRDKSBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBDRkdfRUJDX1BCMUFQICAgICAgICAgICAweDA1ODE1NjAwCisjZGVmaW5lIENGR19FQkNfUEIxQ1IgICAgICAgICAgIDB4RkMwQkEwMDAgIC8qIEJBUz0weEZjMCxCUz0zMk1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKiBNZW1vcnkgQmFuayAyIChVU0IgZGV2aWNlKSBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBDRkdfRUJDX1BCMkFQICAgICAgICAgICAweDAzMDE2NjAwCisjZGVmaW5lIENGR19FQkNfUEIyQ1IgICAgICAgICAgIDB4NTAwMTgwMDAgLyogQkFTPTB4NTAwLEJTPTFNQixCVT1SL1csQlc9OGJpdCAqLworCisvKiBNZW1vcnkgQmFuayAzIChMQ00gYW5kIEQtZmxpcC1mbG9wKSBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBDRkdfRUJDX1BCM0FQICAgICAgICAgICAweDE1OEZGNjAwCisjZGVmaW5lIENGR19FQkNfUEIzQ1IgICAgICAgICAgIDB4NTAxMTgwMDAgLyogQkFTPTB4NTAxLEJTPTFNQixCVT1SL1csQlc9OGJpdCAqLworCisvKiBNZW1vcnkgQmFuayA0IChub3QgaW5zdGFsbCkgaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjRBUCAgICAgICAgICAgMHgxNThGRjYwMAorI2RlZmluZSBDRkdfRUJDX1BCNENSICAgICAgICAgICAweDUwMjFBMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBHUElPIHNldHVwIChQUEM0MDVFUCBzcGVjaWZpYykKKyAqCisgKiBHUElPMFswXSAgICAgLSBFeHRlcm5hbCBCdXMgQ29udHJvbGxlciBCTEFTVCBvdXRwdXQKKyAqIEdQSU8wWzEtOV0gICAtIEluc3RydWN0aW9uIHRyYWNlIG91dHB1dHMKKyAqIEdQSU8wWzEwLTEzXSAtIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIENTXzEgLSBDU180IG91dHB1dHMKKyAqIEdQSU8wWzE0LTE2XSAtIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIEFCVVMzLUFCVVM1IG91dHB1dHMKKyAqIEdQSU8wWzE3LTIzXSAtIEV4dGVybmFsIEludGVycnVwdHMgSVJRMCAtIElSUTYgaW5wdXRzCisgKiBHUElPMFsyNC0yN10gLSBVQVJUMCBjb250cm9sIHNpZ25hbCBpbnB1dHMvb3V0cHV0cworICogR1BJTzBbMjgtMjldIC0gVUFSVDEgZGF0YSBzaWduYWwgaW5wdXQvb3V0cHV0CisgKiBHUElPMFszMC0zMV0gLSBFTUFDMCBhbmQgRU1BQzEgcmVqZWN0IHBhY2tldCBpbnB1dHMKKyAqLworI2RlZmluZSBDRkdfR1BJTzBfT1NSSAkweDE1NTU1NTUwCS8qIG91dHB1dCBzZWxlY3QgaGlnaC9sb3cgKi8KKyNkZWZpbmUgQ0ZHX0dQSU8wX09TUkwJMHgwMDAwMDExMAorI2RlZmluZSBDRkdfR1BJTzBfSVNSMUgJMHgwMDAwMDAwMQkvKiBpbnB1dCBzZWxlY3QgaGlnaC9sb3cgKi8KKyNkZWZpbmUgQ0ZHX0dQSU8wX0lTUjFMCTB4MTU1NDU0NDAKKyNkZWZpbmUgQ0ZHX0dQSU8wX1RTUkgJMHgwMDAwMDAwMAkvKiB0aHJlZS1zdGF0ZSBzZWxlY3QgaGlnaC9sb3cgKi8KKyNkZWZpbmUgQ0ZHX0dQSU8wX1RTUkwJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfR1BJTzBfVENSCTB4RkZGRTgxMTcJLyogdGhyZWUtc3RhdGUgY29udHJvbCAqLworI2RlZmluZSBDRkdfR1BJTzBfT0RSCTB4MDAwMDAwMDAJLyogb3BlbiBkcmFpbiAqLworCisjZGVmaW5lIEdQSU8wCQkwCQkvKiBHUElPIGNvbnRyb2xsZXIgMCAqLworCisvKiB0aGUgR1BJTyBtYWNyb3MgaW4gaW5jbHVkZS9wcGM0MDUuaCBmb3IgSGlnaC9Mb3cgcmVnaXN0ZXJzIGFyZSBiYWNrd2FyZHMgKi8KKworI2RlZmluZSBHUElPeF9PU0wJKEdQSU8wX09TUkgtR1BJT19CQVNFKQorI2RlZmluZSBHUElPeF9UU0wJKEdQSU8wX1RTUkgtR1BJT19CQVNFKQorI2RlZmluZSBHUElPeF9JUzFMCShHUElPMF9JU1IxSC1HUElPX0JBU0UpCisjZGVmaW5lIEdQSU94X0lTMkwJKEdQSU8wX0lTUjFILUdQSU9fQkFTRSkKKyNkZWZpbmUgR1BJT3hfSVMzTAkoR1BJTzBfSVNSMUgtR1BJT19CQVNFKQorCisjZGVmaW5lIEdQSU9fT1MoeCkJKHgrR1BJT3hfT1NMKQkvKiBHUElPIG91dHB1dCBzZWxlY3QgKi8KKyNkZWZpbmUgR1BJT19UUyh4KQkoeCtHUElPeF9UU0wpCS8qIEdQSU8gdGhyZWUtc3RhdGUgc2VsZWN0ICovCisjZGVmaW5lIEdQSU9fSVMxKHgpCSh4K0dQSU94X0lTMUwpCS8qIEdQSU8gaW5wdXQgc2VsZWN0ICovCisjZGVmaW5lIEdQSU9fSVMyKHgpCSh4K0dQSU94X0lTMUwpCisjZGVmaW5lIEdQSU9fSVMzKHgpCSh4K0dQSU94X0lTMUwpCisKKyNkZWZpbmUgQ1BMRF9SRUcwX0FERFIJMHg1MDEwMDAwMAorI2RlZmluZSBDUExEX1JFRzFfQUREUgkweDUwMTAwMDAxCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3RhaXNoYW4uaCBiL2luY2x1ZGUvY29uZmlncy90YWlzaGFuLmgKaW5kZXggZDc1NmJlNy4uYmFhNGZiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3RhaXNoYW4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdGFpc2hhbi5oCkBAIC0yMzQsMjcgKzIzNCwzNiBAQAogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCQkvKiBpbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydAkqLwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb25zb2xlL0NvbW1hbmRzL1BhcnNlcgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjYzLDcgKzI3Miw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzE1LDcgKzMyNCw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CS8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzI3LDcgKzMzNiw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdGIwMjI5LmggYi9pbmNsdWRlL2NvbmZpZ3MvdGIwMjI5LmgKaW5kZXggZGFjMWViNy4uYTIxYWYyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3RiMDIyOS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy90YjAyMjkuaApAQCAtODcsMTMgKzg3LDI3IEBACiAvKiNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfbG9jYWwiICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIG5ldGJvb3QiCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfUElORwl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19DTURfRUxGCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy90cmFiLmggYi9pbmNsdWRlL2NvbmZpZ3MvdHJhYi5oCmluZGV4IGEyZGM4ZTcuLmRiY2NlYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy90cmFiLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3RyYWIuaApAQCAtODAsMTAgKzgwLDE3IEBACiAjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUyAxMAogCiAvKiBVU0Igc3R1ZmYgKi8KLSNkZWZpbmUgQ09ORklHX1VTQl9PSENJCQkxCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcJMQogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UJMQogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCiAKKyN1bmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorI2RlZmluZSBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQJMQorCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJMHgxNDIwMDAwMAorI2RlZmluZSBDRkdfVVNCX09IQ0lfU0xPVF9OQU1FCSJzM2MyNDAwIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMJMTUKKwogLyoKICAqIFNpemUgb2YgbWFsbG9jKCkgcG9vbAogICovCkBAIC0xMzAsNjAgKzEzNyw1MCBAQAogLyogVXNlIHMzYzI0MDAncyBSVEMgKi8KICNkZWZpbmUgQ09ORklHX1JUQ19TM0MyNFgwCTEKIAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKICNpZmRlZiBDT05GSUdfSFdGTE9XCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19BRERfSFdGTE9XCUNGR19DTURfSFdGTE9XCi0jZWxzZQotI2RlZmluZQlDT05GSUdfQ09NTUFORFNfQUREX0hXRkxPVwkwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0hXRkxPVwogI2VuZGlmCiAKICNpZmRlZglDT05GSUdfVkZECi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19BRERfVkZECQlDRkdfQ01EX1ZGRAotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0FERF9WRkQJCTAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfVkZECiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19EUklWRVJfUzNDMjRYMF9JMkMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0FERF9FRVBST00JQ0ZHX0NNRF9FRVBST00KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0kyQwkJQ0ZHX0NNRF9JMkMKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19BRERfRUVQUk9NCTAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0kyQwkJMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyAgICAjZGVmaW5lIENPTkZJR19DTURfSTJDCiAjZW5kaWYKIAogI2lmbmRlZiBVU0VfOTIwVF9NTVUKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoKENPTkZJR19DTURfREZMICYgfkNGR19DTURfQ0FDSEUpIHwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfSFdGTE9XCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfVkZECQl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfQUREX0VFUFJPTQl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfSTJDCQl8IFwKLQkJCQlDRkdfQ01EX0JTUAkJCXwgXAotCQkJCUNGR19DTURfREFURQkJCXwgXAotCQkJCUNGR19DTURfREhDUAkJCXwgXAotCQkJCUNGR19DTURfRkFUCQkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJCQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJCQl8IFwKLQkJCQlDRkdfQ01EX1VTQgkpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAkJCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfSFdGTE9XCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfVkZECQl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfQUREX0VFUFJPTQl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfSTJDCQl8IFwKLQkJCQlDRkdfQ01EX0JTUAkJCXwgXAotCQkJCUNGR19DTURfREFURQkJCXwgXAotCQkJCUNGR19DTURfREhDUAkJCXwgXAotCQkJCUNGR19DTURfRkFUCQkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJCQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJCQl8IFwKLQkJCQlDRkdfQ01EX1VTQgkpCisgICAgI3VuZGVmIENPTkZJR19DTURfQ0FDSEUKICNlbmRpZgogCisKIC8qIG1vdmVkIHVwICovCiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgkJMQkvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyCSovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKICNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGFsbG93IHRvIGJyZWFrIGluIGFsd2F5cyAqLwogI2RlZmluZSBDT05GSUdfUFJFQk9PVAkJImVjaG87ZWNobyAqKiogYm9vdGluZyAqKio7ZWNobyIKQEAgLTI5Niw3ICsyOTMsNyBAQAogI2RlZmluZSBDT05GSUdfQVVUT0JPT1RfREVMQVlfU1RSCSJSIgkvKiAxc3QgInBhc3N3b3JkIgkqLwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3VjMTAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvdWMxMDAuaAppbmRleCBjNGU2MjlhLi45MjE0OGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdWMxMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdWMxMDAuaApAQCAtOTgsNyArOTgsMTUgQEAKIAogI3VuZGVmIENPTkZJR19TVEFUVVNfTEVEICAgICAgICAgICAgICAgIC8qIG5vIHN0YXR1cy1sZWQgICAgICAgICAgICAgICAgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMTcsMzIgKzEyNSwzMiBAQAogCQkJCUNGR19QT1NUX1NQUiApCiAjdW5kZWYgIENPTkZJR19QT1NUCiAKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAgICAgICBDRkdfQ01EX0RJQUcKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHCTAKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUgICAgfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1BPU1RfRElBRyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMTU2LDcgKzE2NCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI0Niw3ICsyNTQsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdWMxMDEuaCBiL2luY2x1ZGUvY29uZmlncy91YzEwMS5oCmluZGV4IGZmMDYxZWUuLjNiNDcxZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy91YzEwMS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy91YzEwMS5oCkBAIC0zOCwxMSArMzgsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KLSNlbmRpZgotCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX1IKIAogLyoKQEAgLTU1LDI1ICs1MCwzNCBAQAogLyogUGFydGl0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRElTUExBWQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfRFRUCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRElTUExBWQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkxCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIApAQCAtMjQ1LDcgKzI0OSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yNjQsOSArMjY4LDEzIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLworI2VuZGlmCisKIC8qCi0gKiBFbmFibGUgbG9vcHcgY29tbWFuZG8uIFRoaXMgaGFzIG9ubHkgYWZmZWN0LCBpZiBDRkdfQ01EX01FTSBpcyBkZWZpbmVkLAotICogd2hpY2ggaXMgbm9ybWFsbHkgcGFydCBvZiB0aGUgZGVmYXVsdCBjb21tYW5kcyAoQ0ZWX0NNRF9ERkwpCisgKiBFbmFibGUgbG9vcHcgY29tbWFuZC4KICAqLwogI2RlZmluZSBDT05GSUdfTE9PUFcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3V0eDgyNDUuaCBiL2luY2x1ZGUvY29uZmlncy91dHg4MjQ1LmgKaW5kZXggZTVkNDM5Ny4uY2QwMGM0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3V0eDgyNDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdXR4ODI0NS5oCkBAIC04NiwxOCArODYsMzYgQEAKIAogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfREZMIHwgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX1BDSSBcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTUVNT1JZIFwKLQkJCQkJCQkJfCBDRkdfQ01EX0VOViB8IENGR19DTURfQ09OU09MRSBcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfTE9BREIgXAotCQkJCQkJCQl8IENGR19DTURfSU1JIHwgQ0ZHX0NNRF9DQUNIRSBcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9SRUdJTkZPIHwgQ0ZHX0NNRF9ORVRcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9JMkMgXAotCQkJCQkJCQl8IENGR19DTURfREFURSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ09OU09MRQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREFURQogCiAKIC8qCkBAIC00MDMsNyArNDIxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy92MzcuaCBiL2luY2x1ZGUvY29uZmlncy92MzcuaAppbmRleCBhMmU5OWI1Li4wNDA3MjUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdjM3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3YzNy5oCkBAIC03NiwxNiArNzYsMzAgQEAKIAogI2RlZmluZQlDT05GSUdfQ0FOX0RSSVZFUgkxCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBlbmFibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogSkZGUzIgcGFydGl0aW9ucwpAQCAtMTA1LDE1ICsxMTksMTIgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9djM3LTE6LShqZmZzMikiCiAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5NCw3ICsyMDUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdjM4Yi5oIGIvaW5jbHVkZS9jb25maWdzL3YzOGIuaAppbmRleCAwYjdiMTllLi5jMGIxYTE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdjM4Yi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy92MzhiLmgKQEAgLTQ2LDExICs0Niw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTg5LDI5ICs4NCwzOCBAQAogI2RlZmluZSBDT05GSUdfVVNCX0NMT0NLCTB4MDAwMUJCQkIKICNkZWZpbmUgQ09ORklHX1VTQl9DT05GSUcJMHgwMDAwMTAwMAogCisKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0lERQl8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfRElBRwl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfSkZGUzIJfCBcCi0JCQkJIENGR19DTURfTUlJCXwgXAotCQkJCSBDRkdfQ01EX1NEUkFNCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfVVNCCXwgXAotCQkJCSBDRkdfQ01EX0ZBVCkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorCiAKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoCiAgKi8KQEAgLTI1NCw3ICsyNTgsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5ICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTI3MCw2ICsyNzQsMTEgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdmVyc2F0aWxlLmggYi9pbmNsdWRlL2NvbmZpZ3MvdmVyc2F0aWxlLmgKaW5kZXggMTZkYjQzYi4uZDI1MDE1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3ZlcnNhdGlsZS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy92ZXJzYXRpbGUuaApAQCAtOTYsMTQgKzk2LDI5IEBACiAjZGVmaW5lIENGR19TRVJJQUwwCQkweDEwMUYxMDAwCiAjZGVmaW5lIENGR19TRVJJQUwxCQkweDEwMUYyMDAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDRkdfQ01EX0RIQ1AgfCBDRkdfQ01EX0lNSSB8IENGR19DTURfTkVUIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX01FTU9SWSB8IENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0VOVikKIAotLyojZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX0JESSB8IENGR19DTURfTUVNT1JZKSAqLworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfRU5WCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTIKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICJyb290PS9kZXYvbmZzIG1lbT0xMjhNIGlwPWRoY3AgbmV0ZGV2PTI1LDAsMHhmMTAxMDAwMCwweGYxMDEwMDEwLGV0aDAiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdmlydGxhYjIuaCBiL2luY2x1ZGUvY29uZmlncy92aXJ0bGFiMi5oCmluZGV4IDA2ZDg1MzYuLjU2MWE4YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy92aXJ0bGFiMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy92aXJ0bGFiMi5oCkBAIC04OSwzNCArODksMzggQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9CTVAKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMzEsNyArMTM1LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjE0LDcgKzIxOCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy92b2ljZWJsdWUuaCBiL2luY2x1ZGUvY29uZmlncy92b2ljZWJsdWUuaAppbmRleCA0ZTk3YjAxLi43Y2FiMzFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvdm9pY2VibHVlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3ZvaWNlYmx1ZS5oCkBAIC0xMzEsMzMgKzEzMSwzOCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jaWZkZWYgVk9JQ0VCTFVFX1NNQUxMX0ZMQVNICi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQkRJICAgIHwJXAotCQkJCSBDRkdfQ01EX0xPQURCICB8CVwKLQkJCQkgQ0ZHX0NNRF9JTUkgICAgfAlcCi0JCQkJIENGR19DTURfRkxBU0ggIHwJXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8CVwKLQkJCQkgQ0ZHX0NNRF9ORVQgICAgfAlcCi0JCQkJIENGR19DTURfQk9PVEQgIHwJXAotCQkJCSBDRkdfQ01EX0RIQ1AgICB8CVwKLQkJCQkgQ0ZHX0NNRF9QSU5HICAgfAlcCi0JCQkJIENGR19DTURfUlVOKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkgICAgfAlcCi0JCQkJIENGR19DTURfTE9BREIgIHwJXAotCQkJCSBDRkdfQ01EX0lNSSAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9GTEFTSCAgfAlcCi0JCQkJIENGR19DTURfTUVNT1JZIHwJXAotCQkJCSBDRkdfQ01EX05FVCAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9FTlYgICAgfAlcCi0JCQkJIENGR19DTURfQk9PVEQgIHwJXAotCQkJCSBDRkdfQ01EX0RIQ1AgICB8CVwKLQkJCQkgQ0ZHX0NNRF9QSU5HICAgfAlcCi0JCQkJIENGR19DTURfUlVOICAgIHwJXAotCQkJCSBDRkdfQ01EX0pGRlMyKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKKyNpZiAhZGVmaW5lZChWT0lDRUJMVUVfU01BTExfRkxBU0gpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VOVgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKwogI2RlZmluZSBDT05GSUdfTE9PUFcKIAogI2lmZGVmIFZPSUNFQkxVRV9TTUFMTF9GTEFTSApAQCAtMjIwLDggKzIyNSw2IEBACiAKICNlbmRpZgkvKiBWT0lDRUJMVUVfU01BTExfRkxBU0ggKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3dhbG51dC5oIGIvaW5jbHVkZS9jb25maWdzL3dhbG51dC5oCmluZGV4IGIzNGRjNzEuLjE4MDU0OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy93YWxudXQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvd2FsbnV0LmgKQEAgLTk4LDI2ICs5OCwzOCBAQAogCiAjZGVmaW5lIENPTkZJR19SVENfRFMxNzR4CTEJLyogdXNlIERTMTc0MyBSVEMgaW4gV2FsbnV0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMTI4LDcgKzE0MCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4Myw3ICsyOTUsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzQwLDcgKzM1Miw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvd2VwZXAyNTAuaCBiL2luY2x1ZGUvY29uZmlncy93ZXBlcDI1MC5oCmluZGV4IDQ3MjUxYmIuLmM2N2IzMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy93ZXBlcDI1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy93ZXBlcDI1MC5oCkBAIC0zNiwxOCArMzYsMjQgQEAKIAogCiAvKgotICogRGVmaW5pdGlvbiBvZiB1LWJvb3QgYnVpbGQgaW4gY29tbWFuZHMuIENoZWNrIG91dCBDT05GSUdfQ01EX0RGTCBpZgotICogbmVjY2Vzc2FyeSBpbiBpbmNsdWRlL2NtZF9jb25mZGVmcy5oIGZpbGUuIChVbiljb21tZW50IGZvciBnZXR0aW5nCi0gKiBmdW5jdGlvbmFsaXR5IG9yIHNpemUgb2YgdS1ib290IGNvZGUuCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKENPTkZJR19DTURfREZMCQlcCi0JCQkJJiB+Q0ZHX0NNRF9ORVQgCQlcCi0JCQkJJiB+Q0ZHX0NNRF9MT0FEUwlcCi0JCQkJJiB+Q0ZHX0NNRF9DT05TT0xFCVwKLQkJCQkmIH5DRkdfQ01EX0FVVE9TQ1JJUFQJXAotLyoJCQkJfCBDRkdfQ01EX0pGRlMyICovCVwKLQkJCQkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9DT05TT0xFCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisKIAogLyoKICAqIEJvb3Qgb3B0aW9ucy4gU2V0dGluZyBkZWxheSB0byAtMSBzdG9wcyBhdXRvc3RhcnQgY291bnQgZG93bi4KQEAgLTE1Miw3ICsxNTgsNyBAQAogICogUmlnaHQgbm93IHRoZXJlIGlzIG5vIGdhaW4gZm9yIHVzZXIsIGJ1dCBsYXRlciBvbiBib290aW5nIGtlcm5lbCBtaWdodCBiZQogICogcG9zc2libGUuIENvbnNpZGVyIHVzaW5nIFhJUCBrZXJuZWwgcnVubmluZyBmcm9tIGZsYXNoIHRvIHNhdmUgUkFNCiAgKiBmb290cHJpbnQuCi0gKiBOT1RFOiBFbmFibGUgQ0ZHX0NNRF9KRkZTMiBmb3IgSkZGUzIgc3VwcG9ydC4KKyAqIE5PVEU6IEVuYWJsZSBDT05GSUdfQ01EX0pGRlMyIGZvciBKRkZTMiBzdXBwb3J0LgogICovCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCQkwCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IJCTUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy94YWVuaWF4LmggYi9pbmNsdWRlL2NvbmZpZ3MveGFlbmlheC5oCmluZGV4IDEwMzk3NjIuLjc0MTg5ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy94YWVuaWF4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3hhZW5pYXguaApAQCAtNjQsMTUgKzY0LDI5IEBACiAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0gLyogdmFsaWQgYmF1ZHJhdGVzICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoKENPTkZJR19DTURfREZMICYgfkNGR19DTURfRFRUKSB8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorCiAKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCTA4OjAwOjNlOjI2OjBhOjViCiAjZGVmaW5lIENPTkZJR19ORVRNQVNLCQkyNTUuMjU1LjI1NS4wCkBAIC04Niw3ICsxMDAsNyBAQAogI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgCTEKICNkZWZpbmUgQ09ORklHX0lOSVRSRF9UQUcJCTEKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy94bTI1MC5oIGIvaW5jbHVkZS9jb25maWdzL3htMjUwLmgKaW5kZXggODI1YmZkMS4uYmNkMTZlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3htMjUwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3htMjUwLmgKQEAgLTgxLDE0ICs4MSwyNiBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0kyQwkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3hzZW5naW5lLmggYi9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaAppbmRleCBkYzcwMmNmLi41NzMzOTMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaApAQCAtMTAyLDEwICsxMDIsMjYgQEAKIAogLyogYWxsb3cgdG8gb3ZlcndyaXRlIHNlcmlhbCBhbmQgZXRoYWRkciAqLwogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NTUMgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfUElORyB8IENGR19DTURfSkZGUzIpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9NTUMKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJCTMKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCQlGRjpGRjpGRjpGRjpGRjpGRgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3h1cHYycC5oIGIvaW5jbHVkZS9jb25maWdzL3h1cHYycC5oCmluZGV4IGI0YzcyMGQuLjM1MDAxZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy94dXB2MnAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveHVwdjJwLmgKQEAgLTExOCwyNyArMTE4LDM5IEBACiAjZGVmaW5lCUNGR19FTlZfSVNfTk9XSEVSRQkxCiAjZGVmaW5lCUNGR19FTlZfU0laRQkJMHgxMDAwCiAjZGVmaW5lCUNGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgLSBDRkdfRU5WX1NJWkUpCi0jZGVmaW5lCUNPTkZJR19DT01NQU5EUwkoQ09ORklHX19DTURfREZMIHxcCi0JCQlDRkdfQ01EX01FTU9SWSB8XAotCQkJQ0ZHX0NNRF9JUlEgfFwKLQkJCUNGR19DTURfQkRJIHxcCi0JCQlDRkdfQ01EX05FVCB8XAotCQkJQ0ZHX0NNRF9JTUkgfFwKLQkJCUNGR19DTURfRUNITyB8XAotCQkJQ0ZHX0NNRF9DQUNIRSB8XAotCQkJQ0ZHX0NNRF9SVU4gfFwKLQkJCUNGR19DTURfQVVUT1NDUklQVCB8XAotCQkJQ0ZHX0NNRF9BU0tFTlYgfFwKLQkJCUNGR19DTURfTE9BRFMgfFwKLQkJCUNGR19DTURfTE9BREIgfFwKLQkJCUNGR19DTURfTUlTQyB8XAotCQkJQ0ZHX0NNRF9GQVQgfFwKLQkJCUNGR19DTURfRVhUMiB8XAotCQkJQ0ZHX0NNRF9QSU5HIFwKLQkJCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAvKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zICovCiAjZGVmaW5lCUNGR19QUk9NUFQJIlUtQm9vdC1tT05TdFI+ICIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy95b3NlbWl0ZS5oIGIvaW5jbHVkZS9jb25maWdzL3lvc2VtaXRlLmgKaW5kZXggM2IxMDZlZi4uNmE1YjdmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3lvc2VtaXRlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3lvc2VtaXRlLmgKQEAgLTIzMywxNyArMjMzLDIwIEBACiAKICNpZmRlZiBDT05GSUdfNDQwRVAKIC8qIFVTQiAqLwotI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKKyNkZWZpbmUgQ09ORklHX1VTQl9PSENJX05FVwogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKKyNkZWZpbmUgQ0ZHX09IQ0lfQkVfQ09OVFJPTExFUgorCisjdW5kZWYgQ0ZHX1VTQl9PSENJX0JPQVJEX0lOSVQKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX0NQVV9JTklUCTEKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRQkoQ0ZHX1BFUklQSEVSQUxfQkFTRSB8IDB4MTAwMCkKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkicHBjNDQwIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMJMTUKIAogLyogQ29tbWVudCB0aGlzIG91dCB0byBlbmFibGUgVVNCIDEuMSBkZXZpY2UgKi8KICNkZWZpbmUgVVNCXzJfMF9ERVZJQ0UKIAotI2RlZmluZSBDTURfVVNCCQkJKENGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0VYVDIpCi0KICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAotI2Vsc2UKLSNkZWZpbmUgQ01EX1VTQgkJCTAJLyogbm8gVVNCIG9uIDQ0MEdSCQkqLwogI2VuZGlmIC8qIENPTkZJR180NDBFUCAqLwogCiAjaWZkZWYgREVCVUcKQEAgLTI1MiwzMiArMjU1LDQ5IEBACiAjZGVmaW5lIENPTkZJR19IV19XQVRDSERPRwkJCS8qIHdhdGNoZG9nICovCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDTURfVVNCKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisKKyNpZmRlZiBDT05GSUdfNDQwRVAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfVVNCCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZW5kaWYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNDQsNyArMzY0LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApIC8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzU2LDcgKzM3Niw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MveXVjY2EuaCBiL2luY2x1ZGUvY29uZmlncy95dWNjYS5oCmluZGV4IDFmZGNjNGIuLjljNTM2ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy95dWNjYS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy95dWNjYS5oCkBAIC0xMzYsNyArMTM2LDcgQEAKIC8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCiAjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJezB4NTAsIDB4NTIsIDB4NTMsIDB4NTR9CiAKLS8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FRVBST00pICovCisvKiAjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VFUFJPTSkgKi8KIC8qICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwICovCS8qIEkyQyBib290IEVFUFJPTQkJKi8KICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4JMgkvKiBCeXRlcyBvZiBhZGRyZXNzCQkqLwogLyogI2VuZGlmICovCkBAIC0xOTEsMjQgKzE5MSwzNiBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKwogCiAjZGVmaW5lCUNPTkZJR19JQk1fRU1BQzRfVjQJMQogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KQEAgLTIzMiw3ICsyNDQsNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzEzLDcgKzMyNSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtMzI1LDcgKzMzNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3pldXMuaCBiL2luY2x1ZGUvY29uZmlncy96ZXVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1NzU1YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy96ZXVzLmgKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIFN0ZWZhbiBSb2VzZSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgc3JAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB6ZXVzLmggLSBjb25maWd1cmF0aW9uIGZvciBaZXVzIGJvYXJkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ09ORklHX1pFVVMJCTEJCS8qIEJvYXJkIGlzIFpldXMJKi8KKyNkZWZpbmUgQ09ORklHXzR4eAkJMQkJLyogLi4uIFBQQzR4eCBmYW1pbHkJKi8KKyNkZWZpbmUgQ09ORklHXzQwNUVQCQkxCQkvKiBTcGVjaWZjIDQwNUVQIHN1cHBvcnQqLworCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgIDMzMDAwMDAwIC8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwgICAqLworCisjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkJLyogQ2FsbCBib2FyZF9lYXJseV9pbml0X2YgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEJCS8qIENhbGwgbWlzY19pbml0X3IJKi8KKworI2RlZmluZSBQTExNUjBfREVGQVVMVAkJUExMTVIwXzMzM18xMTFfNTVfMTExCisjZGVmaW5lIFBMTE1SMV9ERUZBVUxUCQlQTExNUjFfMzMzXzExMV81NV8xMTEKKworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNIICAgICAxCS8qIHVzZSBGTEFTSCBmb3IgZW52aXJvbm1lbnQgdmFycwkqLworCisjZGVmaW5lIENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFCTEKKworI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KKyNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkweDAxCS8qIFBIWSBhZGRyZXNzCQkJKi8KKyNkZWZpbmUgQ09ORklHX0hBU19FVEgxCQkxCisjZGVmaW5lIENPTkZJR19QSFkxX0FERFIJMHgxMQkvKiBFTUFDMSBQSFkgYWRkcmVzcwkJKi8KKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCisjZGVmaW5lIENGR19SWF9FVEhfQlVGRkVSCTE2CS8qIE51bWJlciBvZiBldGhlcm5ldCByeCBidWZmZXJzICYgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQ09ORklHX1BIWV9SRVNFVAkxCisjZGVmaW5lIENPTkZJR19QSFlfUkVTRVRfREVMQVkJMzAwCS8qIFBIWSBSRVNFVCByZWNvdmVyeSBkZWxheQkqLworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0cKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworCisvKiBQT1NUIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9NRU1PUlkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfQ1BVCSAgIHwgXAorCQkJCSBDRkdfUE9TVF9DQUNIRQkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfVUFSVAkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfRVRIRVIpCisKKyNkZWZpbmUgQ0ZHX1BPU1RfRVRIRVJfRVhUX0xPT1BCQUNLCS8qIGV0aCBQT1NUIHVzaW5nIGV4dCBsb29wYWNrIGNvbm5lY3RvcgkqLworCisvKiBEZWZpbmUgaGVyZSB0aGUgYmFzZS1hZGRyZXNzZXMgb2YgdGhlIFVBUlRzIHRvIHRlc3QgaW4gUE9TVCAqLworI2RlZmluZSBDRkdfUE9TVF9VQVJUX1RBQkxFCXtVQVJUMF9CQVNFfQorCisjZGVmaW5lIENPTkZJR19MT0dCVUZGRVIKKyNkZWZpbmUgQ0ZHX1BPU1RfQ0FDSEVfQUREUgkweDAwODAwMDAwIC8qIGZyZWUgdmlydHVhbCBhZGRyZXNzCSovCisKKyNkZWZpbmUgQ0ZHX0NPTlNPTEVfSVNfSU5fRU5WIC8qIE90aGVyd2lzZSBpdCBjYXRjaGVzIGxvZ2J1ZmZlciBhcyBvdXRwdXQgKi8KKworI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTRFJBTQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTRFJBTSBjb25maWd1cmF0aW9uIChwbGVhc2Ugc2VlIGNwdS9wcGMvc2RyYW0uW2NoXSkKKyAqLworI2RlZmluZSBDT05GSUdfU0RSQU1fQkFOSzAJMQkvKiBpbml0IG9uYm9hcmQgU0RSQU0gYmFuayAwICovCisjZGVmaW5lIENPTkZJR19TRFJBTV9CQU5LMQkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDEgKi8KKworLyogU0RSQU0gdGltaW5ncyB1c2VkIGluIGRhdGFzaGVldCAqLworI2RlZmluZSBDRkdfU0RSQU1fQ0wgICAgICAgICAgICAzCS8qIENBUyBsYXRlbmN5ICovCisjZGVmaW5lIENGR19TRFJBTV90UlAgICAgICAgICAgIDIwCS8qIFBSRUNIQVJHRSBjb21tYW5kIHBlcmlvZCAqLworI2RlZmluZSBDRkdfU0RSQU1fdFJDICAgICAgICAgICA2NgkvKiBBQ1RJVkUtdG8tQUNUSVZFIGNvbW1hbmQgcGVyaW9kICovCisjZGVmaW5lIENGR19TRFJBTV90UkNEICAgICAgICAgIDIwCS8qIEFDVElWRS10by1SRUFEIGRlbGF5ICovCisjZGVmaW5lIENGR19TRFJBTV90UkZDCQk2NgkvKiBBdXRvIHJlZnJlc2ggcGVyaW9kICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNlcmlhbCBQb3J0CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3VuZGVmCUNGR19FWFRfU0VSSUFMX0NMT0NLCQkJLyogZXh0ZXJuYWwgc2VyaWFsIGNsb2NrICovCisjZGVmaW5lIENGR19CQVNFX0JBVUQJCTY5MTIwMAorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAorI2RlZmluZSBDT05GSUdfU0VSSUFMX01VTFRJCisKKy8qIFRoZSBmb2xsb3dpbmcgdGFibGUgaW5jbHVkZXMgdGhlIHN1cHBvcnRlZCBiYXVkcmF0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCVwKKwl7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbHNlCisjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCSAgICAgICAgMTYJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCSAgICAgICAgQ0ZHX0NCU0laRSAvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwNDAwMDAwIC8qIG1lbXRlc3Qgd29ya3Mgb24JCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwQzAwMDAwIC8qIDQgLi4uIDEyIE1CIGluIERSQU0JKi8KKworI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDEwMDAwMCAgLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0VYVEJESU5GTwkJMQkvKiBUbyB1c2UgZXh0ZW5kZWQgYm9hcmRfaW50byAoYmRfdCkgKi8KKworI2RlZmluZSBDRkdfSFoJCSAgICAgICAgMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzCSovCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCisKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeQkqLworI2RlZmluZSBDT05GSUdfTE9PUFcgICAgICAgICAgICAxICAgICAgIC8qIGVuYWJsZSBsb29wdyBjb21tYW5kICAgICAgICAgKi8KKyNkZWZpbmUgQ09ORklHX01YX0NZQ0xJQyAgICAgICAgMSAgICAgICAvKiBlbmFibGUgbWRjL213YyBjb21tYW5kcyAgICAgICovCisjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBjaGVjayBmb3Iga2V5cHJlc3Mgb24gYm9vdGRlbGF5PT0wICovCisjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFIDEJLyogaW5jbHVkZSB2ZXJzaW9uIGVudiB2YXJpYWJsZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydAkqLworI3VuZGVmCUNPTkZJR19TT0ZUX0kyQwkJCQkvKiBJMkMgYml0LWJhbmdlZAkJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCQkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgorCisvKiB0aGVzZSBhcmUgZm9yIHRoZSBTVCBNMjRDMDIgMmtiaXQgc2VyaWFsIGkyYyBlZXByb20gKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCQkvKiBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4JMQkJLyogYnl0ZXMgb2YgYWRkcmVzcyAqLworLyogbWFzayBvZiBhZGRyZXNzIGJpdHMgdGhhdCBvdmVyZmxvdyBpbnRvIHRoZSAiRUVQUk9NIGNoaXAgYWRkcmVzcyIgICAgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVwkweDA3CisKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0VOQUJMRQkxCS8qIHdyaXRlIGVlcHJvbSBpbiBwYWdlcyAqLworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUwkzCS8qIDggYnl0ZSB3cml0ZSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTEwCS8qIGFuZCB0YWtlcyB1cCB0byAxMCBtc2VjICovCisKKy8qCisgKiBUaGUgbGF5b3V0IG9mIHRoZSBJMkMgRUVQUk9NLCB1c2VkIGZvciBib290c3RyYXAgc2V0dXAgYW5kIGZvciBib2FyZC0KKyAqIHNwZWNpZmljIHZhbHVlcywgbGlrZSBldGhhZGRyLi4uIHRoYXQgY2FuIGJlIHJlc3RvcmVkIHZpYSB0aGUgc3ctcmVzZXQKKyAqIGJ1dHRvbgorICovCisjZGVmaW5lIEZBQ1RPUllfUkVTRVRfSTJDX0VFUFJPTQkweDUwCisjZGVmaW5lIEZBQ1RPUllfUkVTRVRfRU5WX09GRlMJCTB4ODAKKyNkZWZpbmUgRkFDVE9SWV9SRVNFVF9FTlZfU0laRQkJMHg4MAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGMDAwMDAwCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMTI4ICogMTAyNCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIG1hbGxvYygpCSovCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJKC1DRkdfTU9OSVRPUl9MRU4pCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19GTEFTSF9DRkkJCQkJLyogVGhlIGZsYXNoIGlzIENGSSBjb21wYXRpYmxlCSovCisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCQkJLyogVXNlIGNvbW1vbiBDRkkgZHJpdmVyCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBTktTX0xJU1QJeyBDRkdfRkxBU0hfQkFTRSB9CisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJNTEyCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUgMQkvKiB1c2UgYnVmZmVyZWQgd3JpdGVzICgyMHggZmFzdGVyKQkqLworI2RlZmluZSBDRkdfRkxBU0hfUFJPVEVDVElPTgkxCS8qIHVzZSBoYXJkd2FyZSBmbGFzaCBwcm90ZWN0aW9uCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8JCS8qIHByaW50ICdFJyBmb3IgZW1wdHkgc2VjdG9yIG9uIGZsaW5mbyAqLworI2RlZmluZSBDRkdfRkxBU0hfUVVJRVRfVEVTVAkxCS8qIGRvbid0IHdhcm4gdXBvbiB1bmtub3duIGZsYXNoCSovCisKKyNpZmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNICisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MjAwMDAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCQkqLworI2RlZmluZSBDRkdfRU5WX0FERFIJCSgoLUNGR19NT05JVE9SX0xFTiktQ0ZHX0VOVl9TRUNUX1NJWkUpCisjZGVmaW5lCUNGR19FTlZfU0laRQkJMHgyMDAwCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yCSovCisKKy8qIEFkZHJlc3MgYW5kIHNpemUgb2YgUmVkdW5kYW50IEVudmlyb25tZW50IFNlY3RvcgkqLworI2RlZmluZSBDRkdfRU5WX0FERFJfUkVEVU5ECShDRkdfRU5WX0FERFItQ0ZHX0VOVl9TRUNUX1NJWkUpCisjZGVmaW5lIENGR19FTlZfU0laRV9SRURVTkQJKENGR19FTlZfU0laRSkKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgSUJNIDQwNUVQIENQVQkJCSovCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIGluaXRpYWwgc3RhY2sgcG9pbnRlciBhbmQgZGF0YSBhcmVhIChpbiBkYXRhIGNhY2hlKQorICovCisvKiB1c2Ugb24gY2hpcCBtZW1vcnkgKE9DTSkgZm9yIHRlbXBlcmFyeSBzdGFjayB1bnRpbCBzZHJhbSBpcyB0ZXN0ZWQgKi8KKyNkZWZpbmUgQ0ZHX1RFTVBfU1RBQ0tfT0NNCTEKKworLyogT24gQ2hpcCBNZW1vcnkgbG9jYXRpb24gKi8KKyNkZWZpbmUgQ0ZHX09DTV9EQVRBX0FERFIJMHhGODAwMDAwMAorI2RlZmluZSBDRkdfT0NNX0RBVEFfU0laRQkweDEwMDAKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJQ0ZHX09DTV9EQVRBX0FERFIgLyogaW5zaWRlIG9mIE9DTQkJKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAlDRkdfT0NNX0RBVEFfU0laRSAvKiBFbmQgb2YgdXNlZCBhcmVhIGluIFJBTQkqLworCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTEyOCAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKy8qIHJlc2VydmUgc29tZSBtZW1vcnkgZm9yIFBPU1QgYW5kIEJPT1QgbGltaXQgaW5mbyAqLworI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJKENGR19HQkxfREFUQV9PRkZTRVQgLSAxNikKKworLyogZXh0cmEgZGF0YSBpbiBPQ00gKi8KKyNkZWZpbmUgQ0ZHX1BPU1RfV09SRF9BRERSCShDRkdfR0JMX0RBVEFfT0ZGU0VUIC0gNCkKKyNkZWZpbmUgQ0ZHX1BPU1RfTUFHSUMJCShDRkdfT0NNX0RBVEFfQUREUiArIENGR19HQkxfREFUQV9PRkZTRVQgLSA4KQorI2RlZmluZSBDRkdfUE9TVF9WQUwJCShDRkdfT0NNX0RBVEFfQUREUiArIENGR19HQkxfREFUQV9PRkZTRVQgLSAxMikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXh0ZXJuYWwgQnVzIENvbnRyb2xsZXIgKEVCQykgU2V0dXAKKyAqLworCisvKiBNZW1vcnkgQmFuayAwIChGbGFzaCAxNk0pIGluaXRpYWxpemF0aW9uCQkJCQkqLworI2RlZmluZSBDRkdfRUJDX1BCMEFQCQkweDA1ODE1NjAwCisjZGVmaW5lIENGR19FQkNfUEIwQ1IJCTB4RkYwOUEwMDAgIC8qIEJBUz0weEZGMCxCUz0xNk1CLEJVPVIvVyxCVz0xNmJpdCAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIEdQSU8gc2V0dXAgKFBQQzQwNUVQIHNwZWNpZmljKQorICoKKyAqIEdQSU8wWzBdICAgICAtIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIEJMQVNUIG91dHB1dAorICogR1BJTzBbMS05XSAgIC0gSW5zdHJ1Y3Rpb24gdHJhY2Ugb3V0cHV0cworICogR1BJTzBbMTAtMTNdIC0gRXh0ZXJuYWwgQnVzIENvbnRyb2xsZXIgQ1NfMSAtIENTXzQgb3V0cHV0cworICogR1BJTzBbMTQtMTZdIC0gRXh0ZXJuYWwgQnVzIENvbnRyb2xsZXIgQUJVUzMtQUJVUzUgb3V0cHV0cworICogR1BJTzBbMTctMjNdIC0gRXh0ZXJuYWwgSW50ZXJydXB0cyBJUlEwIC0gSVJRNiBpbnB1dHMKKyAqIEdQSU8wWzI0LTI3XSAtIFVBUlQwIGNvbnRyb2wgc2lnbmFsIGlucHV0cy9vdXRwdXRzCisgKiBHUElPMFsyOC0yOV0gLSBVQVJUMSBkYXRhIHNpZ25hbCBpbnB1dC9vdXRwdXQKKyAqIEdQSU8wWzMwLTMxXSAtIEVNQUMwIGFuZCBFTUFDMSByZWplY3QgcGFja2V0IGlucHV0cworICovCisjZGVmaW5lIENGR19HUElPMF9PU1JICQkweDE1NTU1NTUwCS8qIENoaXAgc2VsZWN0cyAqLworI2RlZmluZSBDRkdfR1BJTzBfT1NSTAkJMHgwMDAwMDExMAkvKiBVQVJUX0RUUi1waW4gMjcgYWx0IG91dCAqLworI2RlZmluZSBDRkdfR1BJTzBfSVNSMUgJCTB4MTAwMDAwNDEJLyogUGluIDIsIDEyIGlzIGlucHV0ICovCisjZGVmaW5lIENGR19HUElPMF9JU1IxTAkJMHgxNTUwNTQ0MAkvKiBPVVQ6IExFRHMgMjIvMjM7IElOOiBwaW4xMiwyLCBOVkFMSUQjICovCisjZGVmaW5lIENGR19HUElPMF9UU1JICQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19HUElPMF9UU1JMCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19HUElPMF9UQ1IJCTB4QkZGNjgzMTcJLyogMy1zdGF0ZSBPVVQ6IDIyLzIzLzI5OyAxMiwyIGlzIG5vdCAzLXN0YXRlICovCisjZGVmaW5lIENGR19HUElPMF9PRFIJCTB4MDAwMDAwMDAKKworI2RlZmluZSBDRkdfR1BJT19TV19SRVNFVAkxCisjZGVmaW5lIENGR19HUElPX1pFVVNfUEUJMTIKKyNkZWZpbmUgQ0ZHX0dQSU9fTEVEX1JFRAkyMgorI2RlZmluZSBDRkdfR1BJT19MRURfR1JFRU4JMjMKKworLyogVGltZSBpbiBtaWxsaS1zZWNvbmRzICovCisjZGVmaW5lIENGR19USU1FX1BPU1QJCTUwMDAKKyNkZWZpbmUgQ0ZHX1RJTUVfRkFDVE9SWV9SRVNFVAkxMDAwMAorCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCisjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKiBFTlZJUk9OTUVOVCBWQVJTICovCisKKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJCSJlY2hvO2VjaG8gV2VsY29tZSB0byBCdWxsZXRlbmRwb2ludHMgYm9hcmQgdjEuMTtlY2hvIgorI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjEuMTAKKyNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjEuMTAwCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJMTkyLjE2OC4xLjEwMAorI2RlZmluZSBDT05GSUdfRVRIQUREUgkJNTA6MDA6MDA6MDA6MDY6MDAKKyNkZWZpbmUgQ09ORklHX0VUSDFBRERSCQk1MDowMDowMDowMDowNjowMQorI2lmIDAKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQkvKiBhdXRvYm9vdCBkaXNhYmxlZCAgICAgICAgKi8KKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMgKi8KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJCQkJCVwKKwkibG9ndmVyc2lvbj0yXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSJob3N0bmFtZT16ZXVzXDAiCQkJCQkJXAorCSJuZXRkZXY9ZXRoMFwwIgkJCQkJCQlcCisJImV0aGFjdD1wcGNfNHh4X2V0aDBcMCIJCQkJCQlcCisJIm5ldG1hc2s9MjU1LjI1NS4yNTUuMFwwIgkJCQkJXAorCSJyYW1kaXNrX3NpemU9NTAwMDBcMCIJCQkJCQlcCisJIm5mc2FyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcnciCQkJXAorCQkiIG5mc3Jvb3Q9JHtzZXJ2ZXJpcH06JHtyb290cGF0aH1cMCIJCQlcCisJInJhbWFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcnciCQkJXAorCQkiIHJhbWRpc2s9JHtyYW1kaXNrX3NpemV9XDAiCQkJCVwKKwkiYWRkaXA9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAorCQkiaXA9JHtpcGFkZHJ9OiR7c2VydmVyaXB9OiR7Z2F0ZXdheWlwfToke25ldG1hc2t9IglcCisJICAgICAgICAiOiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgcGFuaWM9MVwwIgkJCVwKKwkiYWRkdHR5PXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSBjb25zb2xlPXR0eVMwLCIJCVwKKwkJIiR7YmF1ZHJhdGV9XDAiCQkJCQkJXAorCSJuZXRfbmZzPXRmdHAgJHtrZXJuZWxfbWVtX2FkZHJ9ICR7ZmlsZV9rZXJuZWx9OyIJCVwKKwkJInJ1biBuZnNhcmdzIGFkZGlwIGFkZHR0eTtib290bVwwIgkJCVwKKwkibmV0X3JhbT10ZnRwICR7a2VybmVsX21lbV9hZGRyfSAke2ZpbGVfa2VybmVsfTsiCQlcCisJCSJ0ZnRwICR7cmFtZGlza19tZW1fYWRkcn0gJHtmaWxlX2ZzfTsiCQkJXAorCQkicnVuIHJhbWFyZ3MgYWRkaXAgYWRkdHR5OyIJCQkJXAorCQkiYm9vdG0gJHtrZXJuZWxfbWVtX2FkZHJ9ICR7cmFtZGlza19tZW1fYWRkcn1cMCIJXAorCSJyb290cGF0aD0vdGFyZ2V0X2ZzL3pldXNcMCIJCQkJCVwKKwkia2VybmVsX2ZsX2FkZHI9ZmYwMDAwMDBcMCIJCQkJCVwKKwkia2VybmVsX21lbV9hZGRyPTIwMDAwMFwwIgkJCQkJXAorCSJyYW1kaXNrX2ZsX2FkZHI9ZmYzMDAwMDBcMCIJCQkJCVwKKwkicmFtZGlza19tZW1fYWRkcj00MDAwMDAwXDAiCQkJCQlcCisJInVib290X2ZsX2FkZHI9ZmZmYzAwMDBcMCIJCQkJCVwKKwkidWJvb3RfbWVtX2FkZHI9MTAwMDAwXDAiCQkJCQlcCisJImZpbGVfdWJvb3Q9L3pldXMvdS1ib290LmJpblwwIgkJCQkJXAorCSJ0ZnRwX3Vib290PXRmdHAgMTAwMDAwICR7ZmlsZV91Ym9vdH1cMCIJCQlcCisJInVwZGF0ZV91Ym9vdD1wcm90ZWN0IG9mZiBmZmZjMDAwMCBmZmZmZmZmZjsiCQkJXAorCQkiZXJhIGZmZmMwMDAwIGZmZmZmZmZmO2NwLmIgMTAwMDAwIGZmZmMwMDAwIDQwMDAwOyIJXAorCQkicHJvdGVjdCBvbiBmZmZjMDAwMCBmZmZmZmZmZlwwIgkJCVwKKwkidXBkX3Vib290PXJ1biB0ZnRwX3Vib290O3J1biB1cGRhdGVfdWJvb3RcMCIJCQlcCisJImZpbGVfa2VybmVsPS96ZXVzL3VJbWFnZV9iYVwwIgkJCQkJXAorCSJ0ZnRwX2tlcm5lbD10ZnRwIDEwMDAwMCAke2ZpbGVfa2VybmVsfVwwIgkJCVwKKwkidXBkYXRlX2tlcm5lbD1wcm90ZWN0IG9mZiBmZjAwMDAwMCBmZjE3ZmZmZjsiCQkJXAorCQkiZXJhIGZmMDAwMDAwIGZmMTdmZmZmO2NwLmIgMTAwMDAwIGZmMDAwMDAwIDE4MDAwMFwwIglcCisJInVwZF9rZXJuZWw9cnVuIHRmdHBfa2VybmVsO3J1biB1cGRhdGVfa2VybmVsXDAiCQlcCisJImZpbGVfZnM9L3pldXMvcm9vdGZzX2JhLmltZ1wwIgkJCQkJXAorCSJ0ZnRwX2ZzPXRmdHAgMTAwMDAwICR7ZmlsZV9mc31cMCIJCQkJXAorCSJ1cGRhdGVfZnM9cHJvdGVjdCBvZmYgZmYzMDAwMDAgZmY4N2ZmZmY7ZXJhIGZmMzAwMDAwIGZmODdmZmZmOyJcCisJICAgICAgICAiY3AuYiAxMDAwMDAgZmYzMDAwMDAgNTgwMDAwXDAiCQkJCVwKKwkidXBkX2ZzPXJ1biB0ZnRwX2ZzO3J1biB1cGRhdGVfZnNcMCIJCQkJXAorCSJib290Y21kPWNoa3Jlc2V0O3J1biByYW1hcmdzIGFkZGlwIGFkZHR0eSBhZGRtaXNjOyIJCVwKKwkJImJvb3RtICR7a2VybmVsX2ZsX2FkZHJ9ICR7cmFtZGlza19mbF9hZGRyfVwwIgkJXAorCSIiCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvenlsb25pdGUuaCBiL2luY2x1ZGUvY29uZmlncy96eWxvbml0ZS5oCmluZGV4IDFlOGVkN2EuLjUxN2VjYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy96eWxvbml0ZS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy96eWxvbml0ZS5oCkBAIC03NiwxOSArNzYsMzIgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKICNpZmRlZiBUVVJOX09OX0VUSEVSTkVUCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUElORwogI2Vsc2UKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQkgIHwgQ0ZHX0NNRF9FTlYgXAotCQkJCSAgfCBDRkdfQ01EX05BTkQpIFwKLQkJCQkgJiB+KENGR19DTURfTkVUIFwKLQkJCQkgICAgIHwgQ0ZHX0NNRF9GTEFTSCBcCi0JCQkJICAgICB8IENGR19DTURfSU1MUykpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VOVgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9ORVQKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorICAgICN1bmRlZiBDT05GSUdfQ01EX0lNTFMKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDg6MDA6M2U6MjY6MGE6NWIKQEAgLTEwMCw3ICsxMTMsNyBAQAogI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGE5MDMwLmggYi9pbmNsdWRlL2RhOTAzMC5oCmluZGV4IDQxMTA4YjkuLjNlM2IyMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGE5MDMwLmgKKysrIGIvaW5jbHVkZS9kYTkwMzAuaApAQCAtMTA0LDMgKzEwNCwxNSBAQAogI2RlZmluZSBTWVNfQ09OVFJPTF9BX0hXUkVTX0VOQUJMRQkJKDE8PDIpCiAjZGVmaW5lIFNZU19DT05UUk9MX0FfV0RPR19BQ1RJT04JCSgxPDwzKQogI2RlZmluZSBTWVNfQ09OVFJPTF9BX1dBVENIRE9HCQkJKDE8PDcpCisKKyNkZWZpbmUgTUlTQ19DT05UUk9MQl9VU0JfSU5UX1JJU0lORwkJKDE8PDIpCisjZGVmaW5lIE1JU0NfQ09OVFJPTEJfU0VTU0lPTl9WQUxJRF9FTgkJKDE8PDMpCisKKyNkZWZpbmUgVVNCX1BVTVBfVVNCVkUJCQkJKDE8PDApCisjZGVmaW5lIFVTQl9QVU1QX1VTQlZFUAkJCQkoMTw8MSkKKyNkZWZpbmUgVVNCX1BVTVBfU1JQX0RFVEVDVAkJCSgxPDwyKQorI2RlZmluZSBVU0JfUFVNUF9TRVNTSU9OX1ZBTElECQkJKDE8PDMpCisjZGVmaW5lIFVTQl9QVU1QX1ZCVVNfVkFMSURfNF8wCQkJKDE8PDQpCisjZGVmaW5lIFVTQl9QVU1QX1ZCVVNfVkFMSURfNF80CQkJKDE8PDUpCisjZGVmaW5lIFVTQl9QVU1QX0VOX1VTQlZFCQkJKDE8PDYpCisjZGVmaW5lIFVTQl9QVU1QX0VOX1VTQlZFUAkJCSgxPDw3KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kYXRhZmxhc2guaCBiL2luY2x1ZGUvZGF0YWZsYXNoLmgKaW5kZXggNjUwNDU0ZS4uZmJkNWUxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kYXRhZmxhc2guaAorKysgYi9pbmNsdWRlL2RhdGFmbGFzaC5oCkBAIC0zOCwxMyArMzgsNDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKIAogLypudW1iZXIgb2YgcHJvdGVjdGVkIGFyZWEqLwotI2RlZmluZSBOQl9EQVRBRkxBU0hfQVJFQQk0CisjaWZkZWYJQ09ORklHX05FV19QQVJUSVRJT04KKyMgZGVmaW5lIE5CX0RBVEFGTEFTSF9BUkVBCTYKKyNlbHNlCisjIGRlZmluZSBOQl9EQVRBRkxBU0hfQVJFQQk0CisjZW5kaWYKKworI2lmZGVmIENGR19OT19GTEFTSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZXR1cm4gY29kZXMgZnJvbSBmbGFzaF93cml0ZSgpOgorICovCisjIGRlZmluZSBFUlJfT0sJCQkJMAorIyBkZWZpbmUgRVJSX1RJTU9VVAkJCTEKKyMgZGVmaW5lIEVSUl9OT1RfRVJBU0VECQkJMgorIyBkZWZpbmUgRVJSX1BST1RFQ1RFRAkJCTQKKyMgZGVmaW5lIEVSUl9JTlZBTAkJCTgKKyMgZGVmaW5lIEVSUl9BTElHTgkJCTE2CisjIGRlZmluZSBFUlJfVU5LTk9XTl9GTEFTSF9WRU5ET1IJMzIKKyMgZGVmaW5lIEVSUl9VTktOT1dOX0ZMQVNIX1RZUEUJCTY0CisjIGRlZmluZSBFUlJfUFJPR19FUlJPUgkJCTEyOAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcm90ZWN0aW9uIEZsYWdzIGZvciBmbGFzaF9wcm90ZWN0KCk6CisgKi8KKyMgZGVmaW5lIEZMQUdfUFJPVEVDVF9TRVQJCTB4MDEKKyMgZGVmaW5lIEZMQUdfUFJPVEVDVF9DTEVBUgkJMHgwMgorIyBkZWZpbmUgRkxBR19QUk9URUNUX0lOVkFMSUQJCTB4MDMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2V0IEVudmlyb25tZW50IGFjY29yZGluZyB0byBsYWJlbDoKKyAqLworIyBkZWZpbmUJRkxBR19TRVRFTlYJCTB4ODAKKyNlbmRpZiAvKiBDRkdfTk9fRkxBU0ggKi8KIAogLypkZWZpbmUgdGhlIGFyZWEgc3RydWN0dXJlKi8KIHR5cGVkZWYgc3RydWN0IHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgZW5kOwogCXVuc2lnbmVkIGNoYXIgcHJvdGVjdGVkOworCXVuc2lnbmVkIGNoYXIgc2V0ZW52OworCXVuc2lnbmVkIGNoYXIgbGFiZWxbMjBdOwogfSBkYXRhZmxhc2hfcHJvdGVjdF90OwogCiB0eXBlZGVmIHVuc2lnbmVkIGludCBBVDkxU19EYXRhRmxhc2hTdGF0dXM7CkBAIC05Niw2ICsxMzAsNyBAQAogCUFUOTFTX0RhdGFmbGFzaERlc2MgRGVzYzsKIAlBVDkxU19EYXRhZmxhc2hGZWF0dXJlcyBEZXZpY2U7IC8qIFBvaW50ZXIgb24gYSBkYXRhZmxhc2ggZmVhdHVyZXMgYXJyYXkgKi8KIAl1bnNpZ25lZCBsb25nIGxvZ2ljYWxfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGVuZF9hZGRyZXNzOwogCXVuc2lnbmVkIGludCBpZDsJCQkvKiBkZXZpY2UgaWQgKi8KIH0gQVQ5MVNfREFUQUZMQVNIX0lORk8sICpBVDkxUFNfREFUQUZMQVNIX0lORk87CiAKQEAgLTEwNiw2ICsxNDEsNyBAQAogI2RlZmluZSBBVDQ1REIzMjEJMHgzNAogI2RlZmluZSBBVDQ1REI2NDIJMHgzYwogI2RlZmluZSBBVDQ1REIxMjgJMHgxMAorI2RlZmluZQlQQUdFU19QRVJfQkxPQ0sJOAogCiAjZGVmaW5lIEFUOTFDX0RBVEFGTEFTSF9USU1FT1VUCQkxMDAwMAkvKiBGb3IgQVQ5MUZfRGF0YUZsYXNoV2FpdFJlYWR5ICovCiAKQEAgLTE2OCw2ICsyMDQsNyBAQAogCiBleHRlcm4gaW50IHNpemVfZGF0YWZsYXNoIChBVDkxUFNfRGF0YUZsYXNoIHBkYXRhRmxhc2gsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiBpbnQgcHJvdF9kYXRhZmxhc2ggKEFUOTFQU19EYXRhRmxhc2ggcGRhdGFGbGFzaCwgdW5zaWduZWQgbG9uZyBhZGRyKTsKK2V4dGVybiBpbnQgYWRkcjJyYW0odWxvbmcgYWRkcik7CiBleHRlcm4gaW50IGRhdGFmbGFzaF9yZWFsX3Byb3RlY3QgKGludCBmbGFnLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIpOwogZXh0ZXJuIGludCBhZGRyX2RhdGFmbGFzaCAodW5zaWduZWQgbG9uZyBhZGRyKTsKIGV4dGVybiBpbnQgcmVhZF9kYXRhZmxhc2ggKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBjaGFyICpyZXN1bHQpOwpAQCAtMTc1LDQgKzIxMiw4IEBACiBleHRlcm4gdm9pZCBkYXRhZmxhc2hfcHJpbnRfaW5mbyAodm9pZCk7CiBleHRlcm4gdm9pZCBkYXRhZmxhc2hfcGVycm9yIChpbnQgZXJyKTsKIAorI2lmZGVmCUNPTkZJR19ORVdfREZfUEFSVElUSU9OCitleHRlcm4gaW50IEFUOTFGX0RhdGFmbGFzaFNldEVudiAodm9pZCk7ICNlbmRpZgorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvZGl2NjQuaCBiL2luY2x1ZGUvZGl2NjQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXZyMzIvZGl2NjQuaApyZW5hbWUgdG8gaW5jbHVkZS9kaXY2NC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RtOTE2MS5oIGIvaW5jbHVkZS9kbTkxNjEuaAppbmRleCBmNWJmYjE5Li5kNWQwZThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RtOTE2MS5oCisrKyBiL2luY2x1ZGUvZG05MTYxLmgKQEAgLTQzLDkgKzQzLDkgQEAKICNkZWZpbmUgRE05MTYxX0NPTExJU0lPTl9URVNUICAgICgxIDw8IDcpCiAKIC8qLS1CaXQgZGVmaW5pdGlvbnM6IERNOTE2MV9CTVNSICovCi0jZGVmaW5lIERNOTE2MV8xMDBCQVNFX1Q0ICAgICAgICAoMSA8PCAxNSkKKyNkZWZpbmUgRE05MTYxXzEwMEJBU0VfVFggICAgICAgICgxIDw8IDE1KQogI2RlZmluZSBETTkxNjFfMTAwQkFTRV9UWF9GRCAgICAgKDEgPDwgMTQpCi0jZGVmaW5lIERNOTE2MV8xMDBCQVNFX1Q0X0hEICAgICAoMSA8PCAxMykKKyNkZWZpbmUgRE05MTYxXzEwMEJBU0VfVFhfSEQgICAgICgxIDw8IDEzKQogI2RlZmluZSBETTkxNjFfMTBCQVNFX1RfRkQgICAgICAgKDEgPDwgMTIpCiAjZGVmaW5lIERNOTE2MV8xMEJBU0VfVF9IRCAgICAgICAoMSA8PCAxMSkKICNkZWZpbmUgRE05MTYxX01GX1BSRUFNQl9TVVBQUiAgICgxIDw8IDYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RwODM4NDguaCBiL2luY2x1ZGUvZHA4Mzg0OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NGJjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RwODM4NDguaApAQCAtMCwwICsxLDg4IEBACisvKgorICogRFA4Mzg0OCBldGhlcm5ldCBQaHlzaWNhbCBsYXllcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisKKy8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEhZU0lDQUwgTEFZRVIgVFJBTlNDRUlWRVIgRFA4Mzg0OCAqLworCisjZGVmaW5lIERQODM4NDhfQ1RMX1JFRwkJMHgwCS8qIEJhc2ljIE1vZGUgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgRFA4Mzg0OF9TVEFUX1JFRwkJMHgxCS8qIEJhc2ljIE1vZGUgU3RhdHVzIFJlZyAqLworI2RlZmluZSBEUDgzODQ4X1BIWUlEMV9SRUcJCTB4MgkvKiBQSFkgSWRlbmRpZmllciBSZWcgMSAqLworI2RlZmluZSBEUDgzODQ4X1BIWUlEMl9SRUcJCTB4MwkvKiBQSFkgSWRlbmRpZmllciBSZWcgMiAqLworI2RlZmluZSBEUDgzODQ4X0FOQV9SRUcJCQkweDQJLyogQXV0b19OZWcgQWR2dCBSZWcgICovCisjZGVmaW5lIERQODM4NDhfQU5MUEFfUkVHCQkweDUJLyogQXV0b19uZWcgTGluayBQYXJ0bmVyIEFiaWxpdHkgUmVnICovCisjZGVmaW5lIERQODM4NDhfQU5FX1JFRwkJCTB4NgkvKiBBdXRvLW5lZyBFeHBhbnNpb24gUmVnICAqLworI2RlZmluZSBEUDgzODQ4X1BIWV9TVEFUX1JFRwkJMHgxMAkvKiBQSFkgU3RhdHVzIFJlZ2lzdGVyICAqLworI2RlZmluZSBEUDgzODQ4X1BIWV9JTlRSX0NUUkxfUkVHCTB4MTEJLyogUEhZIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIERQODM4NDhfUEhZX0NUUkxfUkVHCQkweDE5CS8qIFBIWSBTdGF0dXMgUmVnaXN0ZXIgICovCisKKy8qLS1CaXQgZGVmaW5pdGlvbnM6IERQODM4NDhfQ1RMX1JFRyAqLworI2RlZmluZSBEUDgzODQ4X1JFU0VUCQkoMSA8PCAxNSkgIC8qIDE9IFMvVyBSZXNldCAqLworI2RlZmluZSBEUDgzODQ4X0xPT1BCQUNLCSgxIDw8IDE0KSAgLyogMT1sb29wYmFjayBFbmFibGVkICovCisjZGVmaW5lIERQODM4NDhfU1BFRURfU0VMRUNUCSgxIDw8IDEzKQorI2RlZmluZSBEUDgzODQ4X0FVVE9ORUcJCSgxIDw8IDEyKQorI2RlZmluZSBEUDgzODQ4X1BPV0VSX0RPV04JKDEgPDwgMTEpCisjZGVmaW5lIERQODM4NDhfSVNPTEFURQkJKDEgPDwgMTApCisjZGVmaW5lIERQODM4NDhfUkVTVEFSVF9BVVRPTkVHCSgxIDw8IDkpCisjZGVmaW5lIERQODM4NDhfRFVQTEVYX01PREUJKDEgPDwgOCkKKyNkZWZpbmUgRFA4Mzg0OF9DT0xMSVNJT05fVEVTVAkoMSA8PCA3KQorCisvKi0tQml0IGRlZmluaXRpb25zOiBEUDgzODQ4X1NUQVRfUkVHICovCisjZGVmaW5lIERQODM4NDhfMTAwQkFTRV9UNAkoMSA8PCAxNSkKKyNkZWZpbmUgRFA4Mzg0OF8xMDBCQVNFX1RYX0ZECSgxIDw8IDE0KQorI2RlZmluZSBEUDgzODQ4XzEwMEJBU0VfVFhfSEQJKDEgPDwgMTMpCisjZGVmaW5lIERQODM4NDhfMTBCQVNFX1RfRkQJKDEgPDwgMTIpCisjZGVmaW5lIERQODM4NDhfMTBCQVNFX1RfSEQJKDEgPDwgMTEpCisjZGVmaW5lIERQODM4NDhfTUZfUFJFQU1CX1NVUFBSCSgxIDw8IDYpCisjZGVmaW5lIERQODM4NDhfQVVUT05FR19DT01QCSgxIDw8IDUpCisjZGVmaW5lIERQODM4NDhfUk1UX0ZBVUxUCSgxIDw8IDQpCisjZGVmaW5lIERQODM4NDhfQVVUT05FR19BQklMSVRZCSgxIDw8IDMpCisjZGVmaW5lIERQODM4NDhfTElOS19TVEFUVVMJKDEgPDwgMikKKyNkZWZpbmUgRFA4Mzg0OF9KQUJCRVJfREVURUNUCSgxIDw8IDEpCisjZGVmaW5lIERQODM4NDhfRVhURU5EX0NBUEFCCSgxIDw8IDApCisKKy8qLS1kZWZpbml0aW9uczogRFA4Mzg0OF9QSFlJRDEgKi8KKyNkZWZpbmUgRFA4Mzg0OF9QSFlJRDFfT1VJCTB4MjAwMAorI2RlZmluZSBEUDgzODQ4X1BIWUlEMl9PVUkJMHg1YzkwCisKKy8qLS1CaXQgZGVmaW5pdGlvbnM6IERQODM4NDhfQU5BUiwgRFA4Mzg0OF9BTkxQQVIgKi8KKyNkZWZpbmUgRFA4Mzg0OF9OUAkJKDEgPDwgMTUpCisjZGVmaW5lIERQODM4NDhfQUNLCQkoMSA8PCAxNCkKKyNkZWZpbmUgRFA4Mzg0OF9SRgkJKDEgPDwgMTMpCisjZGVmaW5lIERQODM4NDhfUEFVU0UJCSgxIDw8IDEwKQorI2RlZmluZSBEUDgzODQ4X1Q0CQkoMSA8PCA5KQorI2RlZmluZSBEUDgzODQ4X1RYX0ZEWAkJKDEgPDwgOCkKKyNkZWZpbmUgRFA4Mzg0OF9UWF9IRFgJCSgxIDw8IDcpCisjZGVmaW5lIERQODM4NDhfMTBfRkRYCQkoMSA8PCA2KQorI2RlZmluZSBEUDgzODQ4XzEwX0hEWAkJKDEgPDwgNSkKKyNkZWZpbmUgRFA4Mzg0OF9BTl9JRUVFXzgwMl8zCTB4MDAwMQorCisvKi0tQml0IGRlZmluaXRpb25zOiBEUDgzODQ4X0FORVIgKi8KKyNkZWZpbmUgRFA4Mzg0OF9QREYJCSgxIDw8IDQpCisjZGVmaW5lIERQODM4NDhfTFBfTlBfQUJMRQkoMSA8PCAzKQorI2RlZmluZSBEUDgzODQ4X05QX0FCTEUJCSgxIDw8IDIpCisjZGVmaW5lIERQODM4NDhfUEFHRV9SWAkJKDEgPDwgMSkKKyNkZWZpbmUgRFA4Mzg0OF9MUF9BTl9BQkxFCSgxIDw8IDApCisKKy8qLS1CaXQgZGVmaW5pdGlvbnM6IERQODM4NDhfUEhZX1NUQVQgKi8KKyNkZWZpbmUgRFA4Mzg0OF9SWF9FUlJfTEFUQ0gJCSgxIDw8IDEzKQorI2RlZmluZSBEUDgzODQ4X1BPTEFSSVRZX1NUQVQJCSgxIDw8IDEyKQorI2RlZmluZSBEUDgzODQ4X0ZBTFNFX0NBUl9TRU5TRQkJKDEgPDwgMTEpCisjZGVmaW5lIERQODM4NDhfU0lHX0RFVEVDVAkJKDEgPDwgMTApCisjZGVmaW5lIERQODM4NDhfREVTQ1JBTV9MT0NLCQkoMSA8PCA5KQorI2RlZmluZSBEUDgzODQ4X1BBR0VfUkNWCQkoMSA8PCA4KQorI2RlZmluZSBEUDgzODQ4X1BIWV9STVRfRkFVTFQJCSgxIDw8IDYpCisjZGVmaW5lIERQODM4NDhfSkFCQkVSCQkJKDEgPDwgNSkKKyNkZWZpbmUgRFA4Mzg0OF9BVVRPTkVHX0NPTVBMRVRFCSgxIDw8IDQpCisjZGVmaW5lIERQODM4NDhfTE9PUEJBQ0tfU1RBVAkJKDEgPDwgMykKKyNkZWZpbmUgRFA4Mzg0OF9EVVBMRVgJCQkoMSA8PCAyKQorI2RlZmluZSBEUDgzODQ4X1NQRUVECQkJKDEgPDwgMSkKKyNkZWZpbmUgRFA4Mzg0OF9MSU5LCQkJKDEgPDwgMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHR0LmggYi9pbmNsdWRlL2R0dC5oCmluZGV4IDg0MmE3NjEuLjJlOGM2OTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHR0LmgKKysrIGIvaW5jbHVkZS9kdHQuaApAQCAtMjksNiArMjksNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfRFRUX0xNNzUpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19EVFRfRFMxNjIxKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfRFRUX0RTMTc3NSkgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX0RUVF9MTTgxKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfRFRUX0FETTEwMjEpCiAKQEAgLTc4LDYgKzc5LDEzIEBACiAjZGVmaW5lIERUVF9DT05GSUcJCTB4QUMKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfRFRUX0RTMTc3NSkKKyNkZWZpbmUgRFRUX1JFQURfVEVNUAkJMHgwCisjZGVmaW5lIERUVF9DT05GSUcJCTB4MQorI2RlZmluZSBEVFRfVEVNUF9IWVNUCQkweDIKKyNkZWZpbmUgRFRUX1RFTVBfT1MJCTB4MworI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19EVFRfQURNMTAyMSkKICNkZWZpbmUgRFRUX1JFQURfTE9DX1ZBTFVFCTB4MDAKICNkZWZpbmUgRFRUX1JFQURfUkVNX1ZBTFVFCTB4MDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXhwb3J0cy5oIGIvaW5jbHVkZS9leHBvcnRzLmgKaW5kZXggOGY3ZjYxNy4uZDY1MTJjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9leHBvcnRzLmgKKysrIGIvaW5jbHVkZS9leHBvcnRzLmgKQEAgLTIzLDEwICsyMywxNSBAQAogdW5zaWduZWQgbG9uZyBzaW1wbGVfc3RydG91bChjb25zdCBjaGFyICpjcCxjaGFyICoqZW5kcCx1bnNpZ25lZCBpbnQgYmFzZSk7CiBjaGFyICpnZXRlbnYgKGNoYXIgKm5hbWUpOwogdm9pZCBzZXRlbnYgKGNoYXIgKnZhcm5hbWUsIGNoYXIgKnZhcnZhbHVlKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCitsb25nIHNpbXBsZV9zdHJ0b2woY29uc3QgY2hhciAqY3AsY2hhciAqKmVuZHAsdW5zaWduZWQgaW50IGJhc2UpOworaW50IHN0cmNtcChjb25zdCBjaGFyICogY3MsY29uc3QgY2hhciAqIGN0KTsKKyNpZmRlZiBDT05GSUdfSEFTX1VJRAordm9pZCBmb3JjZWVudiAoY2hhciAqdmFybmFtZSwgY2hhciAqdmFydmFsdWUpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIGludCBpMmNfd3JpdGUgKHVjaGFyLCB1aW50LCBpbnQgLCB1Y2hhciogLCBpbnQpOwogaW50IGkyY19yZWFkICh1Y2hhciwgdWludCwgaW50ICwgdWNoYXIqICwgaW50KTsKLSNlbmRpZgkvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCiAKIHZvaWQgYXBwX3N0YXJ0dXAoY2hhciAqKik7CiAKQEAgLTQwLDcgKzQ1LDcgQEAKIAlYRl9NQVgKIH07CiAKLSNkZWZpbmUgWEZfVkVSU0lPTgkzCisjZGVmaW5lIFhGX1ZFUlNJT04JNAogCiAjaWYgZGVmaW5lZChDT05GSUdfSTM4NikKIGV4dGVybiBnZF90ICpnbG9iYWxfZGF0YTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmR0X3N1cHBvcnQuaCBiL2luY2x1ZGUvZmR0X3N1cHBvcnQuaAppbmRleCBhMjc2ODM0Li42MGZhNDIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZkdF9zdXBwb3J0LmgKKysrIGIvaW5jbHVkZS9mZHRfc3VwcG9ydC5oCkBAIC0zOCw1ICszOCwxMSBAQAogaW50IGZkdF9iZF90KHZvaWQgKmZkdCk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19PRl9CT0FSRF9TRVRVUAordm9pZCBmdF9ib2FyZF9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCk7Cit2b2lkIGZ0X2NwdV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCk7Cit2b2lkIGZ0X3BjaV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCk7CisjZW5kaWYKKwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19PRl9MSUJGRFQgKi8KICNlbmRpZiAvKiBpZm5kZWYgX19GRFRfU1VQUE9SVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZsYXNoLmggYi9pbmNsdWRlL2ZsYXNoLmgKaW5kZXggNDNiOWM2Yi4uYjBiZjczMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mbGFzaC5oCisrKyBiL2luY2x1ZGUvZmxhc2guaApAQCAtMTE5LDYgKzExOSwxMSBAQAogICovCiAjZGVmaW5lIEZMQUdfUFJPVEVDVF9TRVQJMHgwMQogI2RlZmluZSBGTEFHX1BST1RFQ1RfQ0xFQVIJMHgwMgorI2RlZmluZQlGTEFHX1BST1RFQ1RfSU5WQUxJRAkweDAzCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZXQgRW52aXJvbm1lbnQgYWNjb3JkaW5nIHRvIGxhYmVsOgorICovCisjZGVmaW5lCUZMQUdfU0VURU5WCQkweDgwCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERldmljZSBJRHMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGNkLmggYi9pbmNsdWRlL2xjZC5oCmluZGV4IGI2ODg1ODMuLjhhNDI3M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGNkLmgKKysrIGIvaW5jbHVkZS9sY2QuaApAQCAtMTczLDEwICsxNzMsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAqKiBCSVRNQVAgRElTUExBWSBTVVBQT1JUCQkJCQkJKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAjIGluY2x1ZGUgPGJtcF9sYXlvdXQuaD4KICMgaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkgfHwgQ09ORklHX1NQTEFTSF9TQ1JFRU4gKi8KKyNlbmRpZgogCiAvKgogICogIEluZm9ybWF0aW9uIGFib3V0IGRpc3BsYXlzIHdlIGFyZSB1c2luZy4gVGhpcyBpcyBmb3IgY29uZmlndXJpbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGVkLmggYi9pbmNsdWRlL2xlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YzJiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xlZC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIEF0bWVsIE5vcmRpYyBBQiA8d3d3LmF0bWVsLmNvbT4KKyAqIFVsZiBTYW11ZWxzc29uIDx1bGZAYXRtZWwuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19MRURfSAorI2RlZmluZSBfX0xFRF9ICisKKyNpZm5kZWYJX19BU1NFTUJMWV9fCitleHRlcm4gdm9pZAlMRURfaW5pdCAodm9pZCk7CitleHRlcm4gdm9pZAlyZWRfTEVEX29uKHZvaWQpOworZXh0ZXJuIHZvaWQJcmVkX0xFRF9vZmYodm9pZCk7CitleHRlcm4gdm9pZAlncmVlbl9MRURfb24odm9pZCk7CitleHRlcm4gdm9pZAlncmVlbl9MRURfb2ZmKHZvaWQpOworZXh0ZXJuIHZvaWQJeWVsbG93X0xFRF9vbih2b2lkKTsKK2V4dGVybiB2b2lkCXllbGxvd19MRURfb2ZmKHZvaWQpOworI2Vsc2UKKwkuZXh0ZXJuIExFRF9pbml0CisJLmV4dGVybiByZWRfTEVEX29uCisJLmV4dGVybiByZWRfTEVEX29mZgorCS5leHRlcm4geWVsbG93X0xFRF9vbgorCS5leHRlcm4geWVsbG93X0xFRF9vZmYKKwkuZXh0ZXJuIGdyZWVuX0xFRF9vbgorCS5leHRlcm4gZ3JlZW5fTEVEX29mZgorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliZmR0LmggYi9pbmNsdWRlL2xpYmZkdC5oCmluZGV4IGY4YmFjNzMuLjM0MGU4OWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGliZmR0LmgKKysrIGIvaW5jbHVkZS9saWJmZHQuaApAQCAtNzcsNyArNzcsMTMgQEAKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CiBpbnQgZmR0X3N1Ym5vZGVfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgaW50IHBhcmVudG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CiAKLWludCBmZHRfcGF0aF9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKTsKK2ludCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKTsKK2ludCBmZHRfZmluZF9ub2RlX2J5X3R5cGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqdHlwZSk7CisKK2ludCBmZHRfbm9kZV9pc19jb21wYXRpYmxlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQkgICBjb25zdCBjaGFyICpjb21wYXQpOworaW50IGZkdF9maW5kX2NvbXBhdGlibGVfbm9kZShjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LAorCQkJICAgICBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpjb21wYXQpOwogCiBzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpmZHRfZ2V0X3Byb3BlcnR5KGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCiAJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50ICpsZW5wKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliZmR0X2Vudi5oIGIvaW5jbHVkZS9saWJmZHRfZW52LmgKaW5kZXggZTc0NjMxNC4uNzhmNzI1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJmZHRfZW52LmgKKysrIGIvaW5jbHVkZS9saWJmZHRfZW52LmgKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKLXN0cnVjdCBmZHRfaGVhZGVyICpmZHQ7ICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgd29ya2luZyBmZHQgKi8KK2V4dGVybiBzdHJ1Y3QgZmR0X2hlYWRlciAqZmR0OyAgLyogUG9pbnRlciB0byB0aGUgd29ya2luZyBmZHQgKi8KIAogI2RlZmluZSBmZHQzMl90b19jcHUoeCkJCV9fYmUzMl90b19jcHUoeCkKICNkZWZpbmUgY3B1X3RvX2ZkdDMyKHgpCQlfX2NwdV90b19iZTMyKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL21rNDh0NTkuaCBiL2luY2x1ZGUvbWs0OHQ1OS5oCmluZGV4IDAzYzk5MmUuLmE0NDU5YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWs0OHQ1OS5oCisrKyBiL2luY2x1ZGUvbWs0OHQ1OS5oCkBAIC0yNiw3ICsyNiw3IEBACiAgKi8KIAogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX01LNDhUNTkpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX01LNDhUNTkpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAjZGVmaW5lIFJUQ19QT1JUX0FERFIwCQlDRkdfSVNBX0lPICsgIDB4NzAKICNkZWZpbmUgUlRDX1BPUlRfQUREUjEJCVJUQ19QT1JUX0FERFIwICsgIDB4MQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGM1MTJ4LmggYi9pbmNsdWRlL21wYzUxMnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTAwYjIyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcGM1MTJ4LmgKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDODN4eCBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfX01QQzUxMlhfSF9fCisjZGVmaW5lIF9fTVBDNTEyWF9IX18KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmIGRlZmluZWQoQ09ORklHX0UzMDApCisjaW5jbHVkZSA8YXNtL2UzMDAuaD4KKyNlbmRpZgorCisvKiBTeXN0ZW0gcmVzZXQgb2Zmc2V0IChQb3dlclBDIHN0YW5kYXJkKQorICovCisjZGVmaW5lIEVYQ19PRkZfU1lTX1JFU0VUCQkweDAxMDAKKyNkZWZpbmUJX1NUQVJUX09GRlNFVAkJCUVYQ19PRkZfU1lTX1JFU0VUCisKKworLyogSU1NUkJBUiAtIEludGVybmFsIE1lbW9yeSBSZWdpc3RlciBCYXNlIEFkZHJlc3MKKyAqLworI2RlZmluZSBDT05GSUdfREVGQVVMVF9JTU1SCQkweEZGNDAwMDAwCS8qIERlZmF1bHQgSU1NUiBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU1NUkJBUgkJCQkweDAwMDAJCS8qIFJlZ2lzdGVyIG9mZnNldCB0byBpbW1yICovCisjZGVmaW5lIElNTVJCQVJfQkFTRV9BRERSCQkweEZGRjAwMDAwCS8qIEJhc2UgYWRkcmVzcyBtYXNrICovCisjZGVmaW5lIElNTVJCQVJfUkVTCQkJfihJTU1SQkFSX0JBU0VfQUREUikKKworLyogTEFXQkFSIC0gTG9jYWwgQWNjZXNzIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBMUEJBVwkJCTB4MDAyMAkJLyogUmVnaXN0ZXIgb2Zmc2V0IHRvIGltbXIgKi8KKyNkZWZpbmUgTFBDUzBBVwkJCTB4MDAyNAorI2RlZmluZSBMUENTMUFXCQkJMHgwMDI4CisjZGVmaW5lIExQQ1MyQVcJCQkweDAwMkMKKyNkZWZpbmUgTFBDUzNBVwkJCTB4MDAzMAorI2RlZmluZSBMUENTNEFXCQkJMHgwMDM0CisjZGVmaW5lIExQQ1M1QVcJCQkweDAwMzgKKyNkZWZpbmUgTFBDUzZBVwkJCTB4MDAzQworI2RlZmluZSBMUENBN0FXCQkJMHgwMDQwCisjZGVmaW5lIFNSQU1CQVIJCQkweDAwQzQKKworI2RlZmluZSBMUENfT0ZGU0VUCQkweDEwMDAwCisKKyNkZWZpbmUgQ1MwX0NPTkZJRwkJMHgwMDAwMAorI2RlZmluZSBDUzFfQ09ORklHCQkweDAwMDA0CisjZGVmaW5lIENTMl9DT05GSUcJCTB4MDAwMDgKKyNkZWZpbmUgQ1MzX0NPTkZJRwkJMHgwMDAwQworI2RlZmluZSBDUzRfQ09ORklHCQkweDAwMDEwCisjZGVmaW5lIENTNV9DT05GSUcJCTB4MDAwMTQKKyNkZWZpbmUgQ1M2X0NPTkZJRwkJMHgwMDAxOAorI2RlZmluZSBDUzdfQ09ORklHCQkweDAwMDFDCisKKyNkZWZpbmUgQ1NfQ1RSTAkJCTB4MDAwMjAKKyNkZWZpbmUgQ1NfQ1RSTF9NRQkJMHgwMTAwMDAwMAkvKiBDUyBNYXN0ZXIgRW5hYmxlIGJpdCAqLworI2RlZmluZSBDU19DVFJMX0lFCQkweDA4MDAwMDAwCS8qIENTIEludGVycnVwdCBFbmFibGUgYml0ICovCisKKy8qIFNQUklEUiAtIFN5c3RlbSBQYXJ0IGFuZCBSZXZpc2lvbiBJRCBSZWdpc3RlcgorICovCisjZGVmaW5lIFNQUklEUl9QQVJUSUQJCTB4RkZGRjAwMDAJLyogUGFydCBJZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSBTUFJJRFJfUkVWSUQJCTB4MDAwMEZGRkYJLyogUmV2aXNpb24gSWRlbnRpZmljYXRpb24gKi8KKworI2RlZmluZSBTUFJfNTEyMUUJCTB4ODAxODAwMDAKKworLyogU1BDUiAtIFN5c3RlbSBQcmlvcml0eSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1BDUl9QQ0lIUEUJCQkweDEwMDAwMDAwCS8qIFBDSSBIaWdoZXN0IFByaW9yaXR5IEVuYWJsZSAqLworI2RlZmluZSBTUENSX1BDSUhQRV9TSElGVAkJKDMxLTMpCisjZGVmaW5lIFNQQ1JfUENJUFIJCQkweDAzMDAwMDAwCS8qIFBDSSBicmlkZ2Ugc3lzdGVtIGJ1cyByZXF1ZXN0IHByaW9yaXR5ICovCisjZGVmaW5lIFNQQ1JfUENJUFJfU0hJRlQJCSgzMS03KQorI2RlZmluZSBTUENSX1RCRU4JCQkweDAwNDAwMDAwCS8qIEUzMDAgUG93ZXJQQyBjb3JlIHRpbWUgYmFzZSB1bml0IGVuYWJsZSAqLworI2RlZmluZSBTUENSX1RCRU5fU0hJRlQJCQkoMzEtOSkKKyNkZWZpbmUgU1BDUl9DT1JFUFIJCQkweDAwMzAwMDAwCS8qIEUzMDAgUG93ZXJQQyBDb3JlIHN5c3RlbSBidXMgcmVxdWVzdCBwcmlvcml0eSAqLworI2RlZmluZSBTUENSX0NPUkVQUl9TSElGVAkJKDMxLTExKQorCisvKiBTV0NSUiAtIFN5c3RlbSBXYXRjaGRvZyBDb250cm9sIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1dDUlIJCQkJMHgwOTA0CQkvKiBSZWdpc3RlciBvZmZzZXQgdG8gaW1tciAqLworI2RlZmluZSBTV0NSUl9TV1RDCQkJMHhGRkZGMDAwMAkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lIENvdW50ICovCisjZGVmaW5lIFNXQ1JSX1NXRU4JCQkweDAwMDAwMDA0CS8qIFdhdGNoZG9nIEVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgU1dDUlJfU1dSSQkJCTB4MDAwMDAwMDIJLyogU29mdHdhcmUgV2F0Y2hkb2cgUmVzZXQvSW50ZXJydXB0IFNlbGVjdCBiaXQgKi8KKyNkZWZpbmUgU1dDUlJfU1dQUgkJCTB4MDAwMDAwMDEJLyogU29mdHdhcmUgV2F0Y2hkb2cgQ291bnRlciBQcmVzY2FsZSBiaXQgKi8KKyNkZWZpbmUgU1dDUlJfUkVTCQkJfihTV0NSUl9TV1RDIHwgU1dDUlJfU1dFTiB8IFNXQ1JSX1NXUkkgfCBTV0NSUl9TV1BSKQorCisvKiBTV0NOUiAtIFN5c3RlbSBXYXRjaGRvZyBDb3VudGVyIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1dDTlIJCQkJMHgwOTA4CQkvKiBSZWdpc3RlciBvZmZzZXQgdG8gaW1tciAqLworI2RlZmluZSBTV0NOUl9TV0NOCQkJMHgwMDAwRkZGRgkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBDb3VudCBtYXNrICovCisjZGVmaW5lIFNXQ05SX1JFUwkJCX4oU1dDTlJfU1dDTikKKworLyogU1dTUlIgLSBTeXN0ZW0gV2F0Y2hkb2cgU2VydmljZSBSZWdpc3RlcgorICovCisjZGVmaW5lIFNXU1JSCQkJCTB4MDkwRQkJLyogUmVnaXN0ZXIgb2Zmc2V0IHRvIGltbXIgKi8KKworLyogQUNSIC0gQXJiaXRlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQUNSX0NPUkVESVMJCQkweDEwMDAwMDAwCS8qIENvcmUgZGlzYWJsZSAqLworI2RlZmluZSBBQ1JfQ09SRURJU19TSElGVAkJKDMxLTcpCisjZGVmaW5lIEFDUl9QSVBFX0RFUAkJCTB4MDAwNzAwMDAJLyogUGlwZWxpbmUgZGVwdGggKi8KKyNkZWZpbmUgQUNSX1BJUEVfREVQX1NISUZUCQkoMzEtMTUpCisjZGVmaW5lIEFDUl9QQ0lfUlBUQ05UCQkJMHgwMDAwNzAwMAkvKiBQQ0kgcmVwZWF0IGNvdW50ICovCisjZGVmaW5lIEFDUl9QQ0lfUlBUQ05UX1NISUZUCQkoMzEtMTkpCisjZGVmaW5lIEFDUl9SUFRDTlQJCQkweDAwMDAwNzAwCS8qIFJlcGVhdCBjb3VudCAqLworI2RlZmluZSBBQ1JfUlBUQ05UX1NISUZUCQkoMzEtMjMpCisjZGVmaW5lIEFDUl9BUEFSSwkJCTB4MDAwMDAwMzAJLyogQWRkcmVzcyBwYXJraW5nICovCisjZGVmaW5lIEFDUl9BUEFSS19TSElGVAkJCSgzMS0yNykKKyNkZWZpbmUgQUNSX1BBUktNCQkJMHgwMDAwMDAwRgkvKiBQYXJraW5nIG1hc3RlciAqLworI2RlZmluZSBBQ1JfUEFSS01fU0hJRlQJCQkoMzEtMzEpCisKKy8qIEFUUiAtIEFyYml0ZXIgVGltZXJzIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVRSX0RUTwkJCQkweDAwRkYwMDAwCS8qIERhdGEgdGltZSBvdXQgKi8KKyNkZWZpbmUgQVRSX0FUTwkJCQkweDAwMDAwMEZGCS8qIEFkZHJlc3MgdGltZSBvdXQgKi8KKworLyogQUVSIC0gQXJiaXRlciBFdmVudCBSZWdpc3RlcgorICovCisjZGVmaW5lIEFFUl9FVEVBCQkJMHgwMDAwMDAyMAkvKiBUcmFuc2ZlciBlcnJvciAqLworI2RlZmluZSBBRVJfUkVTCQkJCTB4MDAwMDAwMTAJLyogUmVzZXJ2ZWQgdHJhbnNmZXIgdHlwZSAqLworI2RlZmluZSBBRVJfRUNXCQkJCTB4MDAwMDAwMDgJLyogRXh0ZXJuYWwgY29udHJvbCB3b3JkIHRyYW5zZmVyIHR5cGUgKi8KKyNkZWZpbmUgQUVSX0FPCQkJCTB4MDAwMDAwMDQJLyogQWRkcmVzcyBPbmx5IHRyYW5zZmVyIHR5cGUgKi8KKyNkZWZpbmUgQUVSX0RUTwkJCQkweDAwMDAwMDAyCS8qIERhdGEgdGltZSBvdXQgKi8KKyNkZWZpbmUgQUVSX0FUTwkJCQkweDAwMDAwMDAxCS8qIEFkZHJlc3MgdGltZSBvdXQgKi8KKworLyogQUVBVFIgLSBBcmJpdGVyIEV2ZW50IEFkZHJlc3MgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBBRUFUUl9FVkVOVAkJCTB4MDcwMDAwMDAJLyogRXZlbnQgdHlwZSAqLworI2RlZmluZSBBRUFUUl9NU1RSX0lECQkJMHgwMDFGMDAwMAkvKiBNYXN0ZXIgSWQgKi8KKyNkZWZpbmUgQUVBVFJfVEJTVAkJCTB4MDAwMDA4MDAJLyogVHJhbnNmZXIgYnVyc3QgKi8KKyNkZWZpbmUgQUVBVFJfVFNJWkUJCQkweDAwMDAwNzAwCS8qIFRyYW5zZmVyIFNpemUgKi8KKyNkZWZpbmUgQUVBVFJfVFRZUEUJCQkweDAwMDAwMDFGCS8qIFRyYW5zZmVyIFR5cGUgKi8KKworLyogUlNSIC0gUmVzZXQgU3RhdHVzIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgUlNSX1NXU1IJCQkweDAwMDAyMDAwCS8qIHNvZnR3YXJlIHNvZnQgcmVzZXQgKi8KKyNkZWZpbmUgUlNSX1NXU1JfU0hJRlQJCQkxMworI2RlZmluZSBSU1JfU1dIUgkJCTB4MDAwMDEwMDAJLyogc29mdHdhcmUgaGFyZCByZXNldCAqLworI2RlZmluZSBSU1JfU1dIUl9TSElGVAkJCTEyCisjZGVmaW5lIFJTUl9KSFJTCQkJMHgwMDAwMDIwMAkvKiBqdGFnIGhyZXNldCAqLworI2RlZmluZSBSU1JfSkhSU19TSElGVAkJCTkKKyNkZWZpbmUgUlNSX0pTUlMJCQkweDAwMDAwMTAwCS8qIGp0YWcgc3Jlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSU1JfSlNSU19TSElGVAkJCTgKKyNkZWZpbmUgUlNSX0NTSFIJCQkweDAwMDAwMDEwCS8qIGNoZWNrc3RvcCByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNSX0NTSFJfU0hJRlQJCQk0CisjZGVmaW5lIFJTUl9TV1JTCQkJMHgwMDAwMDAwOAkvKiBzb2Z0d2FyZSB3YXRjaGRvZyByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNSX1NXUlNfU0hJRlQJCQkzCisjZGVmaW5lIFJTUl9CTVJTCQkJMHgwMDAwMDAwNAkvKiBidXMgbW9uaXRvcCByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNSX0JNUlNfU0hJRlQJCQkyCisjZGVmaW5lIFJTUl9TUlMJCQkJMHgwMDAwMDAwMgkvKiBzb2Z0IHJlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSU1JfU1JTX1NISUZUCQkJMQorI2RlZmluZSBSU1JfSFJTCQkJCTB4MDAwMDAwMDEJLyogaGFyZCByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNSX0hSU19TSElGVAkJCTAKKyNkZWZpbmUgUlNSX1JFUwkJCQl+KFJTUl9TV1NSIHwgUlNSX1NXSFIgfFwKKwkJCQkJIFJTUl9KSFJTIHwgUlNSX0pTUlMgfCBSU1JfQ1NIUiB8IFJTUl9TV1JTIHxcCisJCQkJCSBSU1JfQk1SUyB8IFJTUl9TUlMgfCBSU1JfSFJTKQorLyogUk1SIC0gUmVzZXQgTW9kZSBSZWdpc3RlcgorICovCisjZGVmaW5lIFJNUl9DU1JFCQkJMHgwMDAwMDAwMQkvKiBjaGVja3N0b3AgcmVzZXQgZW5hYmxlICovCisjZGVmaW5lIFJNUl9DU1JFX1NISUZUCQkJMAorI2RlZmluZSBSTVJfUkVTCQkJCX4oUk1SX0NTUkUpCisKKy8qIFJDUiAtIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBSQ1JfU1dIUgkJCTB4MDAwMDAwMDIJLyogc29mdHdhcmUgaGFyZCByZXNldCAqLworI2RlZmluZSBSQ1JfU1dTUgkJCTB4MDAwMDAwMDEJLyogc29mdHdhcmUgc29mdCByZXNldCAqLworI2RlZmluZSBSQ1JfUkVTCQkJCX4oUkNSX1NXSFIgfCBSQ1JfU1dTUikKKworLyogUkNFUiAtIFJlc2V0IENvbnRyb2wgRW5hYmxlIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgUkNFUl9DUkUJCQkweDAwMDAwMDAxCS8qIHNvZnR3YXJlIGhhcmQgcmVzZXQgKi8KKyNkZWZpbmUgUkNFUl9SRVMJCQl+KFJDRVJfQ1JFKQorCisvKiBTUE1SIC0gU3lzdGVtIFBMTCBNb2RlIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1BNUl9TUE1GCQkJMHgwRjAwMDAwMAorI2RlZmluZSBTUE1SX1NQTUZfU0hJRlQJCQkyNAorI2RlZmluZSBTUE1SX0NQTUYJCQkweDAwMEYwMDAwCisjZGVmaW5lIFNQTVJfQ1BNRl9TSElGVAkJCTE2CisKKy8qIFNDRlIxIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgUmVnaXN0ZXIgMQorICovCisjZGVmaW5lIFNDRlIxX0lQU19ESVYJCQkweDIKKyNkZWZpbmUgU0NGUjFfSVBTX0RJVl9NQVNLCQkweDAzODAwMDAwCisjZGVmaW5lIFNDRlIxX0lQU19ESVZfU0hJRlQJCTIzCisKKy8qIFNDRlIyIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgUmVnaXN0ZXIgMgorICovCisjZGVmaW5lIFNDRlIyX1NZU19ESVYJCQkweEZDMDAwMDAwCisjZGVmaW5lIFNDRlIyX1NZU19ESVZfU0hJRlQJCTI2CisKKy8qIFNDQ1IgLSBTeXN0ZW0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlcnMKKyAqLworCisvKiBTeXN0ZW0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAxIGNvbW1hbmRzICovCisjZGVmaW5lIENMT0NLX1NDQ1IxX0NGR19FTgkJMHg4MDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9MUENfRU4JCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfTkZDX0VOCQkweDIwMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX1BBVEFfRU4JCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfUFNDX0VOKGNuKQkJKDB4MDgwMDAwMDAgPj4gKGNuKSkKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfUFNDRklGT19FTgkJMHgwMDAwODAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9TQVRBX0VOCQkweDAwMDA0MDAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX0ZFQ19FTgkJMHgwMDAwMjAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9UUFJfRU4JCTB4MDAwMDEwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfUENJX0VOCQkweDAwMDAwODAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX0REUl9FTgkJMHgwMDAwMDQwMAorCisvKiBTeXN0ZW0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAyIGNvbW1hbmRzICovCisjZGVmaW5lIENMT0NLX1NDQ1IyX0RJVV9FTgkJMHg4MDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9BWEVfRU4JCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfTUVNX0VOCQkweDIwMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX1VTQjJfRU4JCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfVVNCMV9FTgkJMHgwODAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9JMkNfRU4JCTB4MDQwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfQkRMQ19FTgkJMHgwMjAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9TREhDX0VOCQkweDAxMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX1NQRElGX0VOCQkweDAwODAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX01CWF9CVVNfRU4JCTB4MDA0MDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfTUJYX0VOCQkweDAwMjAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX01CWF8zRF9FTgkJMHgwMDEwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9JSU1fRU4JCTB4MDAwODAwMDAKKworLyogUFNDIEZJRk8gQ29tbWFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgUFNDX0ZJRk9fUkVTRVRfU0xJQ0UJCTB4ODAKKyNkZWZpbmUgUFNDX0ZJRk9fRU5BQkxFX1NMSUNFCQkweDAxCisKKy8qIFBTQyBGSUZPIENvbnRyb2xsZXIgQ29tbWFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgRklGT0NfRU5BQkxFX0NMT0NLX0dBVEUJCTB4MDEKKyNkZWZpbmUgRklGT0NfRElTQUJMRV9DTE9DS19HQVRFCTB4MDAKKworLyogUFNDIEZJRk8gc3RhdHVzICovCisjZGVmaW5lIFBTQ19GSUZPX0VNUFRZCQkJMHgwMQorCisvKiBQU0MgQ29tbWFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgUFNDX1JYX0VOQUJMRQkJMHgwMQorI2RlZmluZSBQU0NfUlhfRElTQUJMRQkJMHgwMgorI2RlZmluZSBQU0NfVFhfRU5BQkxFCQkweDA0CisjZGVmaW5lIFBTQ19UWF9ESVNBQkxFCQkweDA4CisjZGVmaW5lIFBTQ19TRUxfTU9ERV9SRUdfMQkweDEwCisjZGVmaW5lIFBTQ19SU1RfUlgJCTB4MjAKKyNkZWZpbmUgUFNDX1JTVF9UWAkJMHgzMAorI2RlZmluZSBQU0NfUlNUX0VSUl9TVEFUCTB4NDAKKyNkZWZpbmUgUFNDX1JTVF9CUktfQ0hHX0lOVAkweDUwCisjZGVmaW5lIFBTQ19TVEFSVF9CUksJCTB4NjAKKyNkZWZpbmUgUFNDX1NUT1BfQlJLCQkweDcwCisKKy8qIFBTQyBzdGF0dXMgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBQU0NfU1JfQ0RFCQkweDAwODAKKyNkZWZpbmUgUFNDX1NSX1RYRU1QCQkweDA4MDAKKyNkZWZpbmUgUFNDX1NSX09FCQkweDEwMDAKKyNkZWZpbmUgUFNDX1NSX1BFCQkweDIwMDAKKyNkZWZpbmUgUFNDX1NSX0ZFCQkweDQwMDAKKyNkZWZpbmUgUFNDX1NSX1JCCQkweDgwMDAKKworLyogUFNDIG1vZGUgZmllbGRzICovCisjZGVmaW5lIFBTQ19NT0RFXzVfQklUUwkJMHgwMAorI2RlZmluZSBQU0NfTU9ERV82X0JJVFMJCTB4MDEKKyNkZWZpbmUgUFNDX01PREVfN19CSVRTCQkweDAyCisjZGVmaW5lIFBTQ19NT0RFXzhfQklUUwkJMHgwMworI2RlZmluZSBQU0NfTU9ERV9QQVJFVkVOCTB4MDAKKyNkZWZpbmUgUFNDX01PREVfUEFST0RECQkweDA0CisjZGVmaW5lIFBTQ19NT0RFX1BBUkZPUkNFCTB4MDgKKyNkZWZpbmUgUFNDX01PREVfUEFSTk9ORQkweDEwCisjZGVmaW5lIFBTQ19NT0RFX0VOVElNRU9VVAkweDIwCisjZGVmaW5lIFBTQ19NT0RFX1JYUlRTCQkweDgwCisjZGVmaW5lIFBTQ19NT0RFXzFfU1RPUEJJVAkweDA3CisKKy8qCisgKiBDZW50cmFsaXplZCBGSUZPIENvbnRyb2xsZXIgaGFzIGludGVybmFsIG1lbW9yeSBmb3IgYWxsIDEyIFBTQ3MgRklGT3MKKyAqCisgKiBOT1RFOiBpbmRpdmlkdWFsIFBTQyB1bml0cyBhcmUgZnJlZSB0byB1c2Ugd2hhdGV2ZXIgYXJlYSAoYW5kIHNpemUpIG9mIHRoZQorICogRklGT0MgaW50ZXJuYWwgbWVtb3J5LCBzbyBtYWtlIHN1cmUgbWVtb3J5IGFyZWFzIGZvciBGSUZPIHNsaWNlcyB1c2VkIGJ5CisgKiBkaWZmZXJlbnQgUFNDcyBkbyBub3Qgb3ZlcmxhcCEKKyAqCisgKiBPdmVyYWxsIHNpemUgb2YgRklGT0MgbWVtb3J5IGlzIG5vdCBkb2N1bWVudGVkIGluIHRoZSBNUEM1MTIxZSBSTSwgYnV0CisgKiB0ZXN0cyBpbmRpY2F0ZSB0aGF0IGl0IGlzIDEwMjQgd29yZHMgdG90YWwuCisgKi8KKyNkZWZpbmUgRklGT0NfUFNDMF9UWF9TSVpFCTB4MAkvKiBudW1iZXIgb2YgNC1ieXRlIHdvcmRzIGZvciBGSUZPIHNsaWNlICovCisjZGVmaW5lIEZJRk9DX1BTQzBfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDMF9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MwX1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDMV9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxX1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzFfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMV9SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzJfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMl9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0MyX1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzJfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0MzX1RYX1NJWkUJMHgwNAorI2RlZmluZSBGSUZPQ19QU0MzX1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzNfUlhfU0laRQkweDA0CisjZGVmaW5lIEZJRk9DX1BTQzNfUlhfQUREUgkweDEwCisKKyNkZWZpbmUgRklGT0NfUFNDNF9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M0X1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzRfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDNF9SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzVfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDNV9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0M1X1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzVfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0M2X1RYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzZfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDNl9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M2X1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDN19UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M3X1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzdfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDN19SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzhfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDOF9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0M4X1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzhfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0M5X1RYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzlfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDOV9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M5X1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDMTBfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMTBfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDMTBfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMTBfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0MxMV9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMV9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMV9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMV9SWF9BRERSCTB4MAorCisvKiBJTyBDb250cm9sIFJlZ2lzdGVyCisgKi8KKworLyogSW5kZXhlcyBpbiByZWdzIGFycmF5ICovCisjZGVmaW5lIE1FTV9JRFgJCQkweDAwCisjZGVmaW5lIFNQRElGX1RYQ0xPQ0tfSURYCTB4NzMKKyNkZWZpbmUgU1BESUZfVFhfSURYCQkweDc0CisjZGVmaW5lIFNQRElGX1JYX0lEWAkJMHg3NQorI2RlZmluZSBQU0MwXzBfSURYCQkweDgzCisjZGVmaW5lIFBTQzBfMV9JRFgJCTB4ODQKKyNkZWZpbmUgUFNDMF8yX0lEWAkJMHg4NQorI2RlZmluZSBQU0MwXzNfSURYCQkweDg2CisjZGVmaW5lIFBTQzBfNF9JRFgJCTB4ODcKKyNkZWZpbmUgUFNDMV8wX0lEWAkJMHg4OAorI2RlZmluZSBQU0MxXzFfSURYCQkweDg5CisjZGVmaW5lIFBTQzFfMl9JRFgJCTB4OGEKKyNkZWZpbmUgUFNDMV8zX0lEWAkJMHg4YgorI2RlZmluZSBQU0MxXzRfSURYCQkweDhjCisjZGVmaW5lIFBTQzJfMF9JRFgJCTB4OGQKKyNkZWZpbmUgUFNDMl8xX0lEWAkJMHg4ZQorI2RlZmluZSBQU0MyXzJfSURYCQkweDhmCisjZGVmaW5lIFBTQzJfM19JRFgJCTB4OTAKKyNkZWZpbmUgUFNDMl80X0lEWAkJMHg5MQorCisjZGVmaW5lIElPQ1RSTF9GVU5DTVVYX1NISUZUCTcKKyNkZWZpbmUgSU9DVFJMX0ZVTkNNVVhfRkVDCTEKKyNkZWZpbmUgSU9DVFJMX01VWF9GRUMJCShJT0NUUkxfRlVOQ01VWF9GRUMgPDwgSU9DVFJMX0ZVTkNNVVhfU0hJRlQpCisKKy8qIFNldCBmb3IgRERSICovCisjZGVmaW5lIElPQ1RSTF9NVVhfRERSCQkweDAwMDAwMDM2CisKKyAvKiBSZWdpc3RlciBPZmZzZXQgQmFzZSAqLworI2RlZmluZSBNUEM1MTJYX0ZFQwkJKENGR19JTU1SICsgMHgwMjgwMCkKKworLyogTnVtYmVyIG9mIEkyQyBidXNlcyAqLworI2RlZmluZSBJMkNfQlVTX0NOVAkzCisKKy8qIEkyQ24gY29udHJvbCByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIEkyQ19FTgkJMHg4MAorI2RlZmluZSBJMkNfSUVOCQkweDQwCisjZGVmaW5lIEkyQ19TVEEJCTB4MjAKKyNkZWZpbmUgSTJDX1RYCQkweDEwCisjZGVmaW5lIEkyQ19UWEFLCTB4MDgKKyNkZWZpbmUgSTJDX1JTVEEJMHgwNAorI2RlZmluZSBJMkNfSU5JVF9NQVNLCShJMkNfRU4gfCBJMkNfU1RBIHwgSTJDX1RYIHwgSTJDX1JTVEEpCisKKy8qIEkyQ24gc3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgSTJDX0NGCQkweDgwCisjZGVmaW5lIEkyQ19BQVMJCTB4NDAKKyNkZWZpbmUgSTJDX0JCCQkweDIwCisjZGVmaW5lIEkyQ19BTAkJMHgxMAorI2RlZmluZSBJMkNfU1JXCQkweDA0CisjZGVmaW5lIEkyQ19JRgkJMHgwMgorI2RlZmluZSBJMkNfUlhBSwkweDAxCisKKyNlbmRpZgkvKiBfX01QQzUxMlhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wYzgzeHguaCBiL2luY2x1ZGUvbXBjODN4eC5oCmluZGV4IDMzNmMwYWMuLjgyOWRiZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXBjODN4eC5oCisrKyBiL2luY2x1ZGUvbXBjODN4eC5oCkBAIC04Niw2ICs4Niw4IEBACiAjZGVmaW5lIFNQUl84MzYwX1JFVjEyCQkJMHg4MDQ5MDAxMgogI2RlZmluZSBTUFJfODM2MEVfUkVWMjAJCQkweDgwNDgwMDIwCiAjZGVmaW5lIFNQUl84MzYwX1JFVjIwCQkJMHg4MDQ5MDAyMAorI2RlZmluZSBTUFJfODM2MEVfUkVWMjEJCQkweDgwNDgwMDIxCisjZGVmaW5lIFNQUl84MzYwX1JFVjIxCQkJMHg4MDQ5MDAyMQogCiAjZGVmaW5lIFNQUl84MzIzRV9SRVYxMAkJCTB4ODA2MjAwMTAKICNkZWZpbmUgU1BSXzgzMjNfUkVWMTAJCQkweDgwNjMwMDEwCkBAIC02MDAsNyArNjAyLDkgQEAKICNkZWZpbmUgU0NDUl9UU0VDMUNNXzMJCQkweEMwMDAwMDAwCiAKICNkZWZpbmUgU0NDUl9UU0VDMU9OCQkJMHgyMDAwMDAwMAorI2RlZmluZSBTQ0NSX1RTRUMxT05fU0hJRlQJCTI5CiAjZGVmaW5lIFNDQ1JfVFNFQzJPTgkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgU0NDUl9UU0VDMk9OX1NISUZUCQkyOAogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGM4NXh4LmggYi9pbmNsdWRlL21wYzg1eHguaAppbmRleCA2ZmJkNTA0Li4zMjFiMjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21wYzg1eHguaAorKysgYi9pbmNsdWRlL21wYzg1eHguaApAQCAtMSwxNCArMSwxNCBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgorICogQ29weXJpZ2h0IDIwMDQsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCiAgKiBDb3B5cmlnaHQoYykgMjAwMyBNb3Rvcm9sYSBJbmMuCi0gKiBYaWFuZ2h1YSBYaWFvICh4LnhpYW9AbW90b3JvbGEuY29tKQogICovCiAKICNpZm5kZWYJX19NUEM4NXh4X0hfXwogI2RlZmluZSBfX01QQzg1eHhfSF9fCiAKLSNkZWZpbmUgRVhDX09GRl9TWVNfUkVTRVQJMHgwMTAwCS8qIFN5c3RlbSByZXNldAkqLwotI2RlZmluZQlfU1RBUlRfT0ZGU0VUCQlFWENfT0ZGX1NZU19SRVNFVAorLyogZGVmaW5lIGZvciBjb21tb24gcHBjX2FzbS50bXBsICovCisjZGVmaW5lIEVYQ19PRkZfU1lTX1JFU0VUCTB4MTAwCS8qIFN5c3RlbSByZXNldCAqLworI2RlZmluZSBfU1RBUlRfT0ZGU0VUCQkwCiAKICNpZiBkZWZpbmVkKENPTkZJR19FNTAwKQogI2luY2x1ZGUgPGU1MDAuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0LmggYi9pbmNsdWRlL25ldC5oCmluZGV4IDQ2MWUwMzguLjYwMzQ1MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0LmgKKysrIGIvaW5jbHVkZS9uZXQuaApAQCAtOTksMTAgKzk5LDEyIEBACiAJaW50IHN0YXRlOwogCiAJaW50ICAoKmluaXQpIChzdHJ1Y3QgZXRoX2RldmljZSosIGJkX3QqKTsKLQlpbnQgICgqc2VuZCkgKHN0cnVjdCBldGhfZGV2aWNlKiwgdm9sYXRpbGUgdm9pZCogcGFjaGV0LCBpbnQgbGVuZ3RoKTsKKwlpbnQgICgqc2VuZCkgKHN0cnVjdCBldGhfZGV2aWNlKiwgdm9sYXRpbGUgdm9pZCogcGFja2V0LCBpbnQgbGVuZ3RoKTsKIAlpbnQgICgqcmVjdikgKHN0cnVjdCBldGhfZGV2aWNlKik7CiAJdm9pZCAoKmhhbHQpIChzdHJ1Y3QgZXRoX2RldmljZSopOwotCisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKwlpbnQgKCptY2FzdCkgKHN0cnVjdCBldGhfZGV2aWNlKiwgdTMyIGlwLCB1OCBzZXQpOworI2VuZGlmCiAJc3RydWN0IGV0aF9kZXZpY2UgKm5leHQ7CiAJdm9pZCAqcHJpdjsKIH07CkBAIC0xMjQsNiArMTI2LDExIEBACiBleHRlcm4gdm9pZCBldGhfaGFsdCh2b2lkKTsJCQkvKiBzdG9wIFNDQwkJCSovCiBleHRlcm4gY2hhciAqZXRoX2dldF9uYW1lKHZvaWQpOwkJLyogZ2V0IG5hbWUgb2YgY3VycmVudCBkZXZpY2UJKi8KIAorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCitpbnQgZXRoX21jYXN0X2pvaW4oIElQYWRkcl90IG1jYXN0X2FkZHIsIHU4IGpvaW4pOwordTMyIGV0aGVyX2NyYyAoc2l6ZV90IGxlbiwgdW5zaWduZWQgY2hhciBjb25zdCAqcCk7CisjZW5kaWYKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCkBAIC0yOTYsNyArMzAzLDcgQEAKIGV4dGVybiBJUGFkZHJfdAkJTmV0T3VyR2F0ZXdheUlQOwkvKiBPdXIgZ2F0ZXdheSBJUCBhZGRyZXNzZQkqLwogZXh0ZXJuIElQYWRkcl90CQlOZXRPdXJTdWJuZXRNYXNrOwkvKiBPdXIgc3VibmV0IG1hc2sgKDAgPSB1bmtub3duKSovCiBleHRlcm4gSVBhZGRyX3QJCU5ldE91ckROU0lQOwkgLyogT3VyIERvbWFpbiBOYW1lIFNlcnZlciAoMCA9IHVua25vd24pKi8KLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfRE5TMikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMyKQogZXh0ZXJuIElQYWRkcl90CQlOZXRPdXJETlMySVA7CSAvKiBPdXIgMm5kIERvbWFpbiBOYW1lIFNlcnZlciAoMCA9IHVua25vd24pKi8KICNlbmRpZgogZXh0ZXJuIGNoYXIJCU5ldE91ck5JU0RvbWFpblszMl07CS8qIE91ciBOSVMgZG9tYWluCQkqLwpAQCAtMzQxLDE3ICszNDgsMTcgQEAKIC8qIGZyb20gbmV0L25ldC5jICovCiBleHRlcm4gY2hhcglCb290RmlsZVsxMjhdOwkJCS8qIEJvb3QgRmlsZSBuYW1lCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIGV4dGVybiBJUGFkZHJfdAlOZXRQaW5nSVA7CQkJLyogdGhlIGlwIGFkZHJlc3MgdG8gcGluZyAJCSovCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogLyogd2hlbiBDRFAgY29tcGxldGVzIHRoZXNlIGhvbGQgdGhlIHJldHVybiB2YWx1ZXMgKi8KIGV4dGVybiB1c2hvcnQgQ0RQTmF0aXZlVkxBTjsKIGV4dGVybiB1c2hvcnQgQ0RQQXBwbGlhbmNlVkxBTjsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIGV4dGVybiBJUGFkZHJfdAlOZXROdHBTZXJ2ZXJJUDsJCQkvKiB0aGUgaXAgYWRkcmVzcyB0byBOVFAgCSovCiBleHRlcm4gaW50IE5ldFRpbWVPZmZzZXQ7CQkJLyogb2Zmc2V0IHRpbWUgZnJvbSBVVEMJCSovCiAjZW5kaWYKQEAgLTQzNSw2ICs0NDIsMjkgQEAKIAltZW1jcHkoKHZvaWQqKXRvLCAodm9pZCopZnJvbSwgc2l6ZW9mKHVsb25nKSk7CiB9CiAKKy8qKgorICogaXNfemVyb19ldGhlcl9hZGRyIC0gRGV0ZXJtaW5lIGlmIGdpdmUgRXRoZXJuZXQgYWRkcmVzcyBpcyBhbGwgemVyb3MuCisgKiBAYWRkcjogUG9pbnRlciB0byBhIHNpeC1ieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIEV0aGVybmV0IGFkZHJlc3MKKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhbGwgemVyb2VzLgorICovCitzdGF0aWMgaW5saW5lIGludCBpc196ZXJvX2V0aGVyX2FkZHIoY29uc3QgdTggKmFkZHIpCit7CisJcmV0dXJuICEoYWRkclswXSB8IGFkZHJbMV0gfCBhZGRyWzJdIHwgYWRkclszXSB8IGFkZHJbNF0gfCBhZGRyWzVdKTsKK30KKworLyoqCisgKiBpc19tdWx0aWNhc3RfZXRoZXJfYWRkciAtIERldGVybWluZSBpZiB0aGUgRXRoZXJuZXQgYWRkcmVzcyBpcyBhIG11bHRpY2FzdC4KKyAqIEBhZGRyOiBQb2ludGVyIHRvIGEgc2l4LWJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgRXRoZXJuZXQgYWRkcmVzcworICoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgKiBCeSBkZWZpbml0aW9uIHRoZSBicm9hZGNhc3QgYWRkcmVzcyBpcyBhbHNvIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworCXJldHVybiAoMHgwMSAmIGFkZHJbMF0pOworfQorCiAvKiBDb252ZXJ0IGFuIElQIGFkZHJlc3MgdG8gYSBzdHJpbmcgKi8KIGV4dGVybiB2b2lkCWlwX3RvX3N0cmluZyAoSVBhZGRyX3QgeCwgY2hhciAqcyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNpLmggYi9pbmNsdWRlL3BjaS5oCmluZGV4IDdjOWEwZTMuLjhlNWRhY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNpLmgKKysrIGIvaW5jbHVkZS9wY2kuaApAQCAtMzAyLDYgKzMwMiwxMiBAQAogI2RlZmluZSBQQ0lfTUFYX1BDSV9ERVZJQ0VTCTMyCiAjZGVmaW5lIFBDSV9NQVhfUENJX0ZVTkNUSU9OUwk4CiAKKyNkZWZpbmUgUENJX0RDUgkJMHg1NCAgICAvKiBQQ0llIERldmljZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9EU1IJCTB4NTYgICAgLyogUENJZSBEZXZpY2UgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9MU1IJCTB4NWUgICAgLyogUENJZSBMaW5rIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfTFRTU00JMHg0MDQgICAvKiBQQ0llIExpbmsgVHJhaW5pbmcsIFN0YXR1cyBTdGF0ZSBNYWNoaW5lICovCisjZGVmaW5lICBQQ0lfTFRTU01fTDAJMHgxNiAgICAvKiBMMCBzdGF0ZSAqLworCiAvKiBJbmNsdWRlIHRoZSBJRCBsaXN0ICovCiAKICNpbmNsdWRlIDxwY2lfaWRzLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS5oIGIvaW5jbHVkZS9wY21jaWEuaAppbmRleCA4ZjU2NGRhLi43MzA1ODA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS5oCisrKyBiL2luY2x1ZGUvcGNtY2lhLmgKQEAgLTMxLDggKzMxLDggQEAKICAqIEFsbG93IGNvbmZpZ3VyYXRpb24gdG8gc2VsZWN0IFBDTUNJQSBzbG90LAogICogb3IgdHJ5IHRvIGdlbmVyYXRlIGEgdXNlZnVsIGRlZmF1bHQKICAqLwotI2lmICggQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpIHx8IFwKLSAgICAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkgfHwgXAorICAgIChkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBcCiAJKGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKSB8fCBkZWZpbmVkKENPTkZJR19JREVfOHh4X0RJUkVDVCkgKSApCiAKICNpZiAhZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQSkgJiYgIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0IpCkBAIC0zMDYsMTQgKzMwNiwxNCBAQAogI2RlZmluZSBDSVNUUExfSURFX0hBU19JTkRFWAkweDIwCiAjZGVmaW5lIENJU1RQTF9JREVfSU9JUzE2CTB4NDAKIAotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBIHx8IENGR19DTURfSURFICYmIChDT05GSUdfSURFXzh4eF9QQ0NBUkQgfHwgQ09ORklHX0lERV84eHhfRElSRUNUKSAqLworI2VuZGlmCiAKICNpZmRlZglDT05GSUdfOHh4CiBleHRlcm4gdV9pbnQgKnBjbWNpYV9wZ2NyeFtdOwogI2RlZmluZQlQQ01DSUFfUEdDUlgoc2xvdCkJKCpwY21jaWFfcGdjcnhbc2xvdF0pCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkgXAogCXx8IGRlZmluZWQoQ09ORklHX1BYQV9QQ01DSUEpCiBleHRlcm4gaW50IGNoZWNrX2lkZV9kZXZpY2UoaW50IHNsb3QpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Bvc3QuaCBiL2luY2x1ZGUvcG9zdC5oCmluZGV4IDgyNTllNWQuLmM4MDYyYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcG9zdC5oCisrKyBiL2luY2x1ZGUvcG9zdC5oCkBAIC05Miw2ICs5Miw3IEBACiAjZGVmaW5lIENGR19QT1NUX0RTUAkJMHgwMDAwMTAwMAogI2RlZmluZSBDRkdfUE9TVF9DT0RFQwkJMHgwMDAwMjAwMAogI2RlZmluZSBDRkdfUE9TVF9GUFUJCTB4MDAwMDQwMDAKKyNkZWZpbmUgQ0ZHX1BPU1RfRUNDCQkweDAwMDA4MDAwCiAKICNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BwYzQwNS5oIGIvaW5jbHVkZS9wcGM0MDUuaAppbmRleCA4ZTY0NzMxLi4wYzdiZjNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BwYzQwNS5oCisrKyBiL2luY2x1ZGUvcHBjNDA1LmgKQEAgLTU0MSw2ICs1NDEsMTggQEAKICNkZWZpbmUgUExMTVIxXzI2Nl82Nl8zM18zMyAoUExMX0ZCS0RJVl84ICB8ICBcCiAJCQkgICAgICBQTExfRldERElWQV8zIHwgUExMX0ZXRERJVkJfMyB8ICBcCiAJCQkgICAgICBQTExfVFVORV8xNV9NXzQwIHwgUExMX1RVTkVfVkNPX0xPVykKKyNkZWZpbmUgUExMTVIwXzMzM18xMTFfNTVfMzcgKFBMTF9DUFVESVZfMSB8IFBMTF9QTEJESVZfMyB8ICBcCisJCQkgICAgICBQTExfT1BCRElWXzIgfCBQTExfRVhUQlVTRElWXzIgfCAgXAorCQkJICAgICAgUExMX01BTERJVl8xIHwgUExMX1BDSURJVl8zKQorI2RlZmluZSBQTExNUjFfMzMzXzExMV81NV8zNyAoUExMX0ZCS0RJVl8xMCAgfCAgXAorCQkJICAgICAgUExMX0ZXRERJVkFfMyB8IFBMTF9GV0RESVZCXzMgfCAgXAorCQkJICAgICAgUExMX1RVTkVfMTVfTV80MCB8IFBMTF9UVU5FX1ZDT19ISSkKKyNkZWZpbmUgUExMTVIwXzMzM18xMTFfNTVfMTExIChQTExfQ1BVRElWXzEgfCBQTExfUExCRElWXzMgfCAgXAorCQkJICAgICAgUExMX09QQkRJVl8yIHwgUExMX0VYVEJVU0RJVl8yIHwgIFwKKwkJCSAgICAgIFBMTF9NQUxESVZfMSB8IFBMTF9QQ0lESVZfMSkKKyNkZWZpbmUgUExMTVIxXzMzM18xMTFfNTVfMTExIChQTExfRkJLRElWXzEwICB8ICBcCisJCQkgICAgICBQTExfRldERElWQV8zIHwgUExMX0ZXRERJVkJfMyB8ICBcCisJCQkgICAgICBQTExfVFVORV8xNV9NXzQwIHwgUExMX1RVTkVfVkNPX0hJKQogCiAvKgogICogUExMIFZvbHRhZ2UgQ29udHJvbGxlZCBPc2NpbGxhdG9yIChWQ08pIGRlZmluaXRpb25zCkBAIC02MTcsNiArNjI5LDggQEAKICNkZWZpbmUgQ1BSX0NMS1VQRF9FTkRWQ0hfRU4gICAweDIwMDAwMDAwICAgICAvKiBFbmFibGUgQ1BSIFN5cy4gRGl2LiBDaGFuZ2VzICovCiAjZGVmaW5lIENQUl9QRVJEMF9TUElEVl9NQVNLICAgMHgwMDBGMDAwMCAgICAgLyogU1BJIENsb2NrIERpdmlkZXIgKi8KIAorI2RlZmluZSBQTExDX1NSQ19NQVNLICAgICAgICAgIDB4MjAwMDAwMDAgICAgIC8qIFBMTCBmZWVkYmFjayBzb3VyY2UgKi8KKwogI2RlZmluZSBQTExEX0ZCRFZfTUFTSyAgICAgICAgIDB4MUYwMDAwMDAgICAgIC8qIFBMTCBmZWVkYmFjayBkaXZpZGVyIHZhbHVlICovCiAjZGVmaW5lIFBMTERfRldEVkFfTUFTSyAgICAgICAgMHgwMDBGMDAwMCAgICAgLyogUExMIGZvcndhcmQgZGl2aWRlciBBIHZhbHVlICovCiAjZGVmaW5lIFBMTERfRldEVkJfTUFTSyAgICAgICAgMHgwMDAwMDcwMCAgICAgLyogUExMIGZvcndhcmQgZGl2aWRlciBCIHZhbHVlICovCkBAIC0xMjI2LDYgKzEyNDAsOCBAQAogI2RlZmluZSBtdGViYyhyZWcsIGRhdGEpICBtdGRjcihlYmNjZmdhLHJlZyk7bXRkY3IoZWJjY2ZnZCxkYXRhKQogI2RlZmluZSBtZmViYyhyZWcsIGRhdGEpICBtdGRjcihlYmNjZmdhLHJlZyk7ZGF0YSA9IG1mZGNyKGViY2NmZ2QpCiAKKyNkZWZpbmUgbXRzZHJhbShyZWcsIGRhdGEpCWRvIHsgbXRkY3IobWVtY2ZnYSxyZWcpO210ZGNyKG1lbWNmZ2QsZGF0YSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIG1mc2RyYW0ocmVnLCBkYXRhKQlkbyB7IG10ZGNyKG1lbWNmZ2EscmVnKTtkYXRhID0gbWZkY3IobWVtY2ZnZCk7IH0gd2hpbGUgKDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHBjNDQwLmggYi9pbmNsdWRlL3BwYzQ0MC5oCmluZGV4IDkzYzEwZjEuLjM4ODA5ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHBjNDQwLmgKKysrIGIvaW5jbHVkZS9wcGM0NDAuaApAQCAtMzM1NCw2ICszMzU0LDE5IEBACiAJdW5zaWduZWQgbG9uZyBwY2lDbGtTeW5jOyAgICAgICAgICAgICAvKiBQQ0kgY2xvY2sgaXMgc3luY2hyb25vdXMgICAgICAgICovCiB9IFBQQzQ0MF9TWVNfSU5GTzsKIAorc3RhdGljIGlubGluZSB1MzIgZ2V0X21jc3Iodm9pZCkKK3sKKwl1MzIgdmFsOworCisJYXNtIHZvbGF0aWxlKCJtZnNwciAlMCwgMHgyM2MiIDogIj1yIiAodmFsKSA6KTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21jc3IodTMyIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm10c3ByIDB4MjNjLCAlMCIgOiAiPXIiICh2YWwpIDopOworfQorCiAjZW5kaWYJLyogX0FTTUxBTkdVQUdFICovCiAKICNkZWZpbmUgUkVTRVRfVkVDVE9SCQkweGZmZmZmZmZjCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BwY19hc20udG1wbCBiL2luY2x1ZGUvcHBjX2FzbS50bXBsCmluZGV4IDlmNDAyOWYuLjAwMTlkNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHBjX2FzbS50bXBsCisrKyBiL2luY2x1ZGUvcHBjX2FzbS50bXBsCkBAIC0yMzUsNyArMjM1LDcgQEAKIAlzdHcJcjIyLF9DVFIocjIxKTsJXAogCW1mc3ByCXIyMCxYRVI7CVwKIAlzdHcJcjIwLF9YRVIocjIxKTsJXAotCW1mc3ByCXIyMCxERUFSOwlcCisJbWZzcHIJcjIwLCBEQVJfREVBUjsJXAogCXN0dwlyMjAsX0RBUihyMjEpOwlcCiAJbWZzcHIJcjIyLHJlZzE7CVwKIAltZnNwcglyMjMscmVnMjsJXApAQCAtMjg1LDcgKzI4NSw2IEBACiAJLmxvbmcJaGRsciAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQ7CQkJXAogCS5sb25nCWNyaXRfcmV0dXJuIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCi0jaWZkZWYgQ09ORklHXzQ0MAogI2RlZmluZSBNQ0tfRVhDRVBUSU9OKG4sIGxhYmVsLCBoZGxyKQkJCQlcCiAJLiA9IG47CQkJCQkJCVwKIGxhYmVsOgkJCQkJCQkJXApAQCAtMjk5LDYgKzI5OCw1IEBACiAuTF8gIyMgbGFiZWwgOgkJCQkJCQlcCiAJLmxvbmcJaGRsciAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQ7CQkJXAogCS5sb25nCW1ja19yZXR1cm4gLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCi0jZW5kaWYgLyogQ09ORklHXzQ0MCAgKi8KIAogI2VuZGlmCS8qIF9fUFBDX0FTTV9UTVBMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkZW9uLmggYi9pbmNsdWRlL3JhZGVvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTFiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3JhZGVvbi5oCkBAIC0wLDAgKzEsMTk4NCBAQAorI2lmbmRlZiBfUkFERU9OX0gKKyNkZWZpbmUgX1JBREVPTl9ICisKKworI2RlZmluZSBSQURFT05fUkVHU0laRQkJCTB4NDAwMAorCisKKyNkZWZpbmUgTU1fSU5ERVgJCQkweDAwMDAKKyNkZWZpbmUgTU1fREFUQQkJCQkweDAwMDQKKyNkZWZpbmUgQlVTX0NOVEwJCQkweDAwMzAKKyNkZWZpbmUgSElfU1RBVAkJCQkweDAwNEMKKyNkZWZpbmUgQlVTX0NOVEwxCQkJMHgwMDM0CisjZGVmaW5lIEkyQ19DTlRMXzEJCQkweDAwOTQKKyNkZWZpbmUgQ09ORklHX0NOVEwJCQkweDAwRTAKKyNkZWZpbmUgQ09ORklHX01FTVNJWkUJCQkweDAwRjgKKyNkZWZpbmUgQ09ORklHX0FQRVJfMF9CQVNFCQkweDAxMDAKKyNkZWZpbmUgQ09ORklHX0FQRVJfMV9CQVNFCQkweDAxMDQKKyNkZWZpbmUgQ09ORklHX0FQRVJfU0laRQkJMHgwMTA4CisjZGVmaW5lIENPTkZJR19SRUdfMV9CQVNFCQkweDAxMEMKKyNkZWZpbmUgQ09ORklHX1JFR19BUEVSX1NJWkUJCTB4MDExMAorI2RlZmluZSBQQURfQUdQSU5QVVRfREVMQVkJCTB4MDE2NAorI2RlZmluZSBQQURfQ1RMUl9TVFJFTkdUSAkJMHgwMTY4CisjZGVmaW5lIFBBRF9DVExSX1VQREFURQkJCTB4MDE2QworI2RlZmluZSBQQURfQ1RMUl9NSVNDCQkJMHgwYWEwCisjZGVmaW5lIEFHUF9DTlRMCQkJMHgwMTc0CisjZGVmaW5lIEJNX1NUQVRVUwkJCTB4MDE2MAorI2RlZmluZSBDQVAwX1RSSUdfQ05UTAkJCTB4MDk1MAorI2RlZmluZSBDQVAxX1RSSUdfQ05UTAkJCTB4MDljMAorI2RlZmluZSBWSVBIX0NPTlRST0wJCQkweDBDNDAKKyNkZWZpbmUgVkVORE9SX0lECQkJMHgwRjAwCisjZGVmaW5lIERFVklDRV9JRAkJCTB4MEYwMgorI2RlZmluZSBDT01NQU5ECQkJCTB4MEYwNAorI2RlZmluZSBTVEFUVVMJCQkJMHgwRjA2CisjZGVmaW5lIFJFVklTSU9OX0lECQkJMHgwRjA4CisjZGVmaW5lIFJFR1BST0dfSU5GCQkJMHgwRjA5CisjZGVmaW5lIFNVQl9DTEFTUwkJCTB4MEYwQQorI2RlZmluZSBCQVNFX0NPREUJCQkweDBGMEIKKyNkZWZpbmUgQ0FDSEVfTElORQkJCTB4MEYwQworI2RlZmluZSBMQVRFTkNZCQkJCTB4MEYwRAorI2RlZmluZSBIRUFERVIJCQkJMHgwRjBFCisjZGVmaW5lIEJJU1QJCQkJMHgwRjBGCisjZGVmaW5lIFJFR19NRU1fQkFTRQkJCTB4MEYxMAorI2RlZmluZSBSRUdfSU9fQkFTRQkJCTB4MEYxNAorI2RlZmluZSBSRUdfUkVHX0JBU0UJCQkweDBGMTgKKyNkZWZpbmUgQURBUFRFUl9JRAkJCTB4MEYyQworI2RlZmluZSBCSU9TX1JPTQkJCTB4MEYzMAorI2RlZmluZSBDQVBBQklMSVRJRVNfUFRSCQkweDBGMzQKKyNkZWZpbmUgSU5URVJSVVBUX0xJTkUJCQkweDBGM0MKKyNkZWZpbmUgSU5URVJSVVBUX1BJTgkJCTB4MEYzRAorI2RlZmluZSBNSU5fR1JBTlQJCQkweDBGM0UKKyNkZWZpbmUgTUFYX0xBVEVOQ1kJCQkweDBGM0YKKyNkZWZpbmUgQURBUFRFUl9JRF9XCQkJMHgwRjRDCisjZGVmaW5lIFBNSV9DQVBfSUQJCQkweDBGNTAKKyNkZWZpbmUgUE1JX05YVF9DQVBfUFRSCQkJMHgwRjUxCisjZGVmaW5lIFBNSV9QTUNfUkVHCQkJMHgwRjUyCisjZGVmaW5lIFBNX1NUQVRVUwkJCTB4MEY1NAorI2RlZmluZSBQTUlfREFUQQkJCTB4MEY1NworI2RlZmluZSBBR1BfQ0FQX0lECQkJMHgwRjU4CisjZGVmaW5lIEFHUF9TVEFUVVMJCQkweDBGNUMKKyNkZWZpbmUgQUdQX0NPTU1BTkQJCQkweDBGNjAKKyNkZWZpbmUgQUlDX0NUUkwJCQkweDAxRDAKKyNkZWZpbmUgQUlDX1NUQVQJCQkweDAxRDQKKyNkZWZpbmUgQUlDX1BUX0JBU0UJCQkweDAxRDgKKyNkZWZpbmUgQUlDX0xPX0FERFIJCQkweDAxREMKKyNkZWZpbmUgQUlDX0hJX0FERFIJCQkweDAxRTAKKyNkZWZpbmUgQUlDX1RMQl9BRERSCQkJMHgwMUU0CisjZGVmaW5lIEFJQ19UTEJfREFUQQkJCTB4MDFFOAorI2RlZmluZSBEQUNfQ05UTAkJCTB4MDA1OAorI2RlZmluZSBEQUNfQ05UTDIJCQkweDAwN2MKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTAkJCTB4MDA1MAorI2RlZmluZSBNRU1fQ05UTAkJCTB4MDE0MAorI2RlZmluZSBNQ19DTlRMCQkJCTB4MDE0MAorI2RlZmluZSBFWFRfTUVNX0NOVEwJCQkweDAxNDQKKyNkZWZpbmUgTUNfVElNSU5HX0NOVEwJCQkweDAxNDQKKyNkZWZpbmUgTUNfQUdQX0xPQ0FUSU9OCQkJMHgwMTRDCisjZGVmaW5lIE1FTV9JT19DTlRMX0EwCQkJMHgwMTc4CisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVEwJCTB4MDE3OAorI2RlZmluZSBNRU1fSU5JVF9MQVRFTkNZX1RJTUVSCQkweDAxNTQKKyNkZWZpbmUgTUNfSU5JVF9HRlhfTEFUX1RJTUVSCQkweDAxNTQKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHCQkweDAxNTgKKyNkZWZpbmUgQUdQX0JBU0UJCQkweDAxNzAKKyNkZWZpbmUgTUVNX0lPX0NOVExfQTEJCQkweDAxN0MKKyNkZWZpbmUgTUNfUkVBRF9DTlRMX0FCCQkJMHgwMTdDCisjZGVmaW5lIE1FTV9JT19DTlRMX0IwCQkJMHgwMTgwCisjZGVmaW5lIE1DX0lOSVRfTUlTQ19MQVRfVElNRVIJCTB4MDE4MAorI2RlZmluZSBNRU1fSU9fQ05UTF9CMQkJCTB4MDE4NAorI2RlZmluZSBNQ19JT1BBRF9DTlRMCQkJMHgwMTg0CisjZGVmaW5lIE1DX0RFQlVHCQkJMHgwMTg4CisjZGVmaW5lIE1DX1NUQVRVUwkJCTB4MDE1MAorI2RlZmluZSBNRU1fSU9fT0VfQ05UTAkJCTB4MDE4QworI2RlZmluZSBNQ19DSElQX0lPX09FX0NOVExfQUIJCTB4MDE4QworI2RlZmluZSBNQ19GQl9MT0NBVElPTgkJCTB4MDE0OAorLyogI2RlZmluZSBNQ19GQl9MT0NBVElPTgkJMHgwMTg4ICovCisjZGVmaW5lIEhPU1RfUEFUSF9DTlRMCQkJMHgwMTMwCisjZGVmaW5lIE1FTV9WR0FfV1BfU0VMCQkJMHgwMDM4CisjZGVmaW5lIE1FTV9WR0FfUlBfU0VMCQkJMHgwMDNDCisjZGVmaW5lIEhEUF9ERUJVRwkJCTB4MDEzOAorI2RlZmluZSBTV19TRU1BUEhPUkUJCQkweDAxM0MKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVEwJCQkweDAzZjgKKyNkZWZpbmUgQ1JUQzJfRElTUExBWV9CQVNFX0FERFIJCTB4MDMzYworI2RlZmluZSBTVVJGQUNFX0NOVEwJCQkweDBCMDAKKyNkZWZpbmUgU1VSRkFDRTBfTE9XRVJfQk9VTkQJCTB4MEIwNAorI2RlZmluZSBTVVJGQUNFMV9MT1dFUl9CT1VORAkJMHgwQjE0CisjZGVmaW5lIFNVUkZBQ0UyX0xPV0VSX0JPVU5ECQkweDBCMjQKKyNkZWZpbmUgU1VSRkFDRTNfTE9XRVJfQk9VTkQJCTB4MEIzNAorI2RlZmluZSBTVVJGQUNFNF9MT1dFUl9CT1VORAkJMHgwQjQ0CisjZGVmaW5lIFNVUkZBQ0U1X0xPV0VSX0JPVU5ECQkweDBCNTQKKyNkZWZpbmUgU1VSRkFDRTZfTE9XRVJfQk9VTkQJCTB4MEI2NAorI2RlZmluZSBTVVJGQUNFN19MT1dFUl9CT1VORAkJMHgwQjc0CisjZGVmaW5lIFNVUkZBQ0UwX1VQUEVSX0JPVU5ECQkweDBCMDgKKyNkZWZpbmUgU1VSRkFDRTFfVVBQRVJfQk9VTkQJCTB4MEIxOAorI2RlZmluZSBTVVJGQUNFMl9VUFBFUl9CT1VORAkJMHgwQjI4CisjZGVmaW5lIFNVUkZBQ0UzX1VQUEVSX0JPVU5ECQkweDBCMzgKKyNkZWZpbmUgU1VSRkFDRTRfVVBQRVJfQk9VTkQJCTB4MEI0OAorI2RlZmluZSBTVVJGQUNFNV9VUFBFUl9CT1VORAkJMHgwQjU4CisjZGVmaW5lIFNVUkZBQ0U2X1VQUEVSX0JPVU5ECQkweDBCNjgKKyNkZWZpbmUgU1VSRkFDRTdfVVBQRVJfQk9VTkQJCTB4MEI3OAorI2RlZmluZSBTVVJGQUNFMF9JTkZPCQkJMHgwQjBDCisjZGVmaW5lIFNVUkZBQ0UxX0lORk8JCQkweDBCMUMKKyNkZWZpbmUgU1VSRkFDRTJfSU5GTwkJCTB4MEIyQworI2RlZmluZSBTVVJGQUNFM19JTkZPCQkJMHgwQjNDCisjZGVmaW5lIFNVUkZBQ0U0X0lORk8JCQkweDBCNEMKKyNkZWZpbmUgU1VSRkFDRTVfSU5GTwkJCTB4MEI1QworI2RlZmluZSBTVVJGQUNFNl9JTkZPCQkJMHgwQjZDCisjZGVmaW5lIFNVUkZBQ0U3X0lORk8JCQkweDBCN0MKKyNkZWZpbmUgU1VSRkFDRV9BQ0NFU1NfRkxBR1MJCTB4MEJGOAorI2RlZmluZSBTVVJGQUNFX0FDQ0VTU19DTFIJCTB4MEJGQworI2RlZmluZSBHRU5fSU5UX0NOVEwJCQkweDAwNDAKKyNkZWZpbmUgR0VOX0lOVF9TVEFUVVMJCQkweDAwNDQKKyNkZWZpbmUgQ1JUQ19FWFRfQ05UTAkJCTB4MDA1NAorI2RlZmluZSBSQjNEX0NOVEwJCQkweDFDM0MKKyNkZWZpbmUgV0FJVF9VTlRJTAkJCTB4MTcyMAorI2RlZmluZSBJU1lOQ19DTlRMCQkJMHgxNzI0CisjZGVmaW5lIFJCQk1fR1VJQ05UTAkJCTB4MTcyQworI2RlZmluZSBSQkJNX1NUQVRVUwkJCTB4MEU0MAorI2RlZmluZSBSQkJNX1NUQVRVU19hbHRfMQkJMHgxNzQwCisjZGVmaW5lIFJCQk1fQ05UTAkJCTB4MDBFQworI2RlZmluZSBSQkJNX0NOVExfYWx0XzEJCQkweDBFNDQKKyNkZWZpbmUgUkJCTV9TT0ZUX1JFU0VUCQkJMHgwMEYwCisjZGVmaW5lIFJCQk1fU09GVF9SRVNFVF9hbHRfMQkJMHgwRTQ4CisjZGVmaW5lIE5RV0FJVF9VTlRJTAkJCTB4MEU1MAorI2RlZmluZSBSQkJNX0RFQlVHCQkJMHgwRTZDCisjZGVmaW5lIFJCQk1fQ01ERklGT19BRERSCQkweDBFNzAKKyNkZWZpbmUgUkJCTV9DTURGSUZPX0RBVEFMCQkweDBFNzQKKyNkZWZpbmUgUkJCTV9DTURGSUZPX0RBVEFICQkweDBFNzgKKyNkZWZpbmUgUkJCTV9DTURGSUZPX1NUQVQJCTB4MEU3QworI2RlZmluZSBDUlRDX1NUQVRVUwkJCTB4MDA1QworI2RlZmluZSBHUElPX1ZHQV9EREMJCQkweDAwNjAKKyNkZWZpbmUgR1BJT19EVklfRERDCQkJMHgwMDY0CisjZGVmaW5lIEdQSU9fTU9OSUQJCQkweDAwNjgKKyNkZWZpbmUgR1BJT19DUlQyX0REQwkJCTB4MDA2YworI2RlZmluZSBQQUxFVFRFX0lOREVYCQkJMHgwMEIwCisjZGVmaW5lIFBBTEVUVEVfREFUQQkJCTB4MDBCNAorI2RlZmluZSBQQUxFVFRFXzMwX0RBVEEJCQkweDAwQjgKKyNkZWZpbmUgQ1JUQ19IX1RPVEFMX0RJU1AJCTB4MDIwMAorI2RlZmluZSBDUlRDX0hfU1lOQ19TVFJUX1dJRAkJMHgwMjA0CisjZGVmaW5lIENSVENfVl9UT1RBTF9ESVNQCQkweDAyMDgKKyNkZWZpbmUgQ1JUQ19WX1NZTkNfU1RSVF9XSUQJCTB4MDIwQworI2RlZmluZSBDUlRDX1ZMSU5FX0NSTlRfVkxJTkUJCTB4MDIxMAorI2RlZmluZSBDUlRDX0NSTlRfRlJBTUUJCQkweDAyMTQKKyNkZWZpbmUgQ1JUQ19HVUlfVFJJR19WTElORQkJMHgwMjE4CisjZGVmaW5lIENSVENfREVCVUcJCQkweDAyMUMKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfUklHSFQJCTB4MDIyMAorI2RlZmluZSBDUlRDX09GRlNFVAkJCTB4MDIyNAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMCQkweDAyMjgKKyNkZWZpbmUgQ1JUQ19QSVRDSAkJCTB4MDIyQworI2RlZmluZSBPVlJfQ0xSCQkJCTB4MDIzMAorI2RlZmluZSBPVlJfV0lEX0xFRlRfUklHSFQJCTB4MDIzNAorI2RlZmluZSBPVlJfV0lEX1RPUF9CT1RUT00JCTB4MDIzOAorI2RlZmluZSBESVNQTEFZX0JBU0VfQUREUgkJMHgwMjNDCisjZGVmaW5lIFNOQVBTSE9UX1ZIX0NPVU5UUwkJMHgwMjQwCisjZGVmaW5lIFNOQVBTSE9UX0ZfQ09VTlQJCTB4MDI0NAorI2RlZmluZSBOX1ZJRl9DT1VOVAkJCTB4MDI0OAorI2RlZmluZSBTTkFQU0hPVF9WSUZfQ09VTlQJCTB4MDI0QworI2RlZmluZSBGUF9DUlRDX0hfVE9UQUxfRElTUAkJMHgwMjUwCisjZGVmaW5lIEZQX0NSVENfVl9UT1RBTF9ESVNQCQkweDAyNTQKKyNkZWZpbmUgQ1JUX0NSVENfSF9TWU5DX1NUUlRfV0lECTB4MDI1OAorI2RlZmluZSBDUlRfQ1JUQ19WX1NZTkNfU1RSVF9XSUQJMHgwMjVDCisjZGVmaW5lIENVUl9PRkZTRVQJCQkweDAyNjAKKyNkZWZpbmUgQ1VSX0hPUlpfVkVSVF9QT1NOCQkweDAyNjQKKyNkZWZpbmUgQ1VSX0hPUlpfVkVSVF9PRkYJCTB4MDI2OAorI2RlZmluZSBDVVJfQ0xSMAkJCTB4MDI2QworI2RlZmluZSBDVVJfQ0xSMQkJCTB4MDI3MAorI2RlZmluZSBGUF9IT1JaX1ZFUlRfQUNUSVZFCQkweDAyNzgKKyNkZWZpbmUgQ1JUQ19NT1JFX0NOVEwJCQkweDAyN0MKKyNkZWZpbmUgQ1JUQ19IX0NVVE9GRl9BQ1RJVkVfRU4JCSgxPDw0KQorI2RlZmluZSBDUlRDX1ZfQ1VUT0ZGX0FDVElWRV9FTgkJKDE8PDUpCisjZGVmaW5lIERBQ19FWFRfQ05UTAkJCTB4MDI4MAorI2RlZmluZSBGUF9HRU5fQ05UTAkJCTB4MDI4NAorI2RlZmluZSBGUF9IT1JaX1NUUkVUQ0gJCQkweDAyOEMKKyNkZWZpbmUgRlBfVkVSVF9TVFJFVENICQkJMHgwMjkwCisjZGVmaW5lIEZQX0hfU1lOQ19TVFJUX1dJRAkJMHgwMkM0CisjZGVmaW5lIEZQX1ZfU1lOQ19TVFJUX1dJRAkJMHgwMkM4CisjZGVmaW5lIEFVWF9XSU5ET1dfSE9SWl9DTlRMCQkweDAyRDgKKyNkZWZpbmUgQVVYX1dJTkRPV19WRVJUX0NOVEwJCTB4MDJEQworLyogI2RlZmluZSBEREFfQ09ORklHCQkJMHgwMmUwICovCisvKiAjZGVmaW5lIEREQV9PTl9PRkYJCQkweDAyZTQgKi8KKyNkZWZpbmUgRFZJX0kyQ19DTlRMXzEJCQkweDAyZTQKKyNkZWZpbmUgR1JQSF9CVUZGRVJfQ05UTAkJMHgwMkYwCisjZGVmaW5lIEdSUEgyX0JVRkZFUl9DTlRMCQkweDAzRjAKKyNkZWZpbmUgVkdBX0JVRkZFUl9DTlRMCQkJMHgwMkY0CisjZGVmaW5lIE9WMF9ZX1hfU1RBUlQJCQkweDA0MDAKKyNkZWZpbmUgT1YwX1lfWF9FTkQJCQkweDA0MDQKKyNkZWZpbmUgT1YwX1BJUEVMSU5FX0NOVEwJCTB4MDQwOAorI2RlZmluZSBPVjBfUkVHX0xPQURfQ05UTAkJMHgwNDEwCisjZGVmaW5lIE9WMF9TQ0FMRV9DTlRMCQkJMHgwNDIwCisjZGVmaW5lIE9WMF9WX0lOQwkJCTB4MDQyNAorI2RlZmluZSBPVjBfUDFfVl9BQ0NVTV9JTklUCQkweDA0MjgKKyNkZWZpbmUgT1YwX1AyM19WX0FDQ1VNX0lOSVQJCTB4MDQyQworI2RlZmluZSBPVjBfUDFfQkxBTktfTElORVNfQVRfVE9QCTB4MDQzMAorI2RlZmluZSBPVjBfUDIzX0JMQU5LX0xJTkVTX0FUX1RPUAkweDA0MzQKKyNkZWZpbmUgT1YwX0JBU0VfQUREUgkJCTB4MDQzQworI2RlZmluZSBPVjBfVklEX0JVRjBfQkFTRV9BRFJTCQkweDA0NDAKKyNkZWZpbmUgT1YwX1ZJRF9CVUYxX0JBU0VfQURSUwkJMHgwNDQ0CisjZGVmaW5lIE9WMF9WSURfQlVGMl9CQVNFX0FEUlMJCTB4MDQ0OAorI2RlZmluZSBPVjBfVklEX0JVRjNfQkFTRV9BRFJTCQkweDA0NEMKKyNkZWZpbmUgT1YwX1ZJRF9CVUY0X0JBU0VfQURSUwkJMHgwNDUwCisjZGVmaW5lIE9WMF9WSURfQlVGNV9CQVNFX0FEUlMJCTB4MDQ1NAorI2RlZmluZSBPVjBfVklEX0JVRl9QSVRDSDBfVkFMVUUJMHgwNDYwCisjZGVmaW5lIE9WMF9WSURfQlVGX1BJVENIMV9WQUxVRQkweDA0NjQKKyNkZWZpbmUgT1YwX0FVVE9fRkxJUF9DTlRSTAkJMHgwNDcwCisjZGVmaW5lIE9WMF9ERUlOVEVSTEFDRV9QQVRURVJOCQkweDA0NzQKKyNkZWZpbmUgT1YwX1NVQk1JVF9ISVNUT1JZCQkweDA0NzgKKyNkZWZpbmUgT1YwX0hfSU5DCQkJMHgwNDgwCisjZGVmaW5lIE9WMF9TVEVQX0JZCQkJMHgwNDg0CisjZGVmaW5lIE9WMF9QMV9IX0FDQ1VNX0lOSVQJCTB4MDQ4OAorI2RlZmluZSBPVjBfUDIzX0hfQUNDVU1fSU5JVAkJMHgwNDhDCisjZGVmaW5lIE9WMF9QMV9YX1NUQVJUX0VORAkJMHgwNDk0CisjZGVmaW5lIE9WMF9QMl9YX1NUQVJUX0VORAkJMHgwNDk4CisjZGVmaW5lIE9WMF9QM19YX1NUQVJUX0VORAkJMHgwNDlDCisjZGVmaW5lIE9WMF9GSUxURVJfQ05UTAkJCTB4MDRBMAorI2RlZmluZSBPVjBfRk9VUl9UQVBfQ09FRl8wCQkweDA0QjAKKyNkZWZpbmUgT1YwX0ZPVVJfVEFQX0NPRUZfMQkJMHgwNEI0CisjZGVmaW5lIE9WMF9GT1VSX1RBUF9DT0VGXzIJCTB4MDRCOAorI2RlZmluZSBPVjBfRk9VUl9UQVBfQ09FRl8zCQkweDA0QkMKKyNkZWZpbmUgT1YwX0ZPVVJfVEFQX0NPRUZfNAkJMHgwNEMwCisjZGVmaW5lIE9WMF9GTEFHX0NOVFJMCQkJMHgwNERDCisjZGVmaW5lIE9WMF9TTElDRV9DTlRMCQkJMHgwNEUwCisjZGVmaW5lIE9WMF9WSURfS0VZX0NMUl9MT1cJCTB4MDRFNAorI2RlZmluZSBPVjBfVklEX0tFWV9DTFJfSElHSAkJMHgwNEU4CisjZGVmaW5lIE9WMF9HUlBIX0tFWV9DTFJfTE9XCQkweDA0RUMKKyNkZWZpbmUgT1YwX0dSUEhfS0VZX0NMUl9ISUdICQkweDA0RjAKKyNkZWZpbmUgT1YwX0tFWV9DTlRMCQkJMHgwNEY0CisjZGVmaW5lIE9WMF9URVNUCQkJMHgwNEY4CisjZGVmaW5lIFNVQlBJQ19DTlRMCQkJMHgwNTQwCisjZGVmaW5lIFNVQlBJQ19ERUZDT0xDT04JCTB4MDU0NAorI2RlZmluZSBTVUJQSUNfWV9YX1NUQVJUCQkweDA1NEMKKyNkZWZpbmUgU1VCUElDX1lfWF9FTkQJCQkweDA1NTAKKyNkZWZpbmUgU1VCUElDX1ZfSU5DCQkJMHgwNTU0CisjZGVmaW5lIFNVQlBJQ19IX0lOQwkJCTB4MDU1OAorI2RlZmluZSBTVUJQSUNfQlVGMF9PRkZTRVQJCTB4MDU1QworI2RlZmluZSBTVUJQSUNfQlVGMV9PRkZTRVQJCTB4MDU2MAorI2RlZmluZSBTVUJQSUNfTEMwX09GRlNFVAkJMHgwNTY0CisjZGVmaW5lIFNVQlBJQ19MQzFfT0ZGU0VUCQkweDA1NjgKKyNkZWZpbmUgU1VCUElDX1BJVENICQkJMHgwNTZDCisjZGVmaW5lIFNVQlBJQ19CVE5fSExJX0NPTENPTgkJMHgwNTcwCisjZGVmaW5lIFNVQlBJQ19CVE5fSExJX1lfWF9TVEFSVAkweDA1NzQKKyNkZWZpbmUgU1VCUElDX0JUTl9ITElfWV9YX0VORAkJMHgwNTc4CisjZGVmaW5lIFNVQlBJQ19QQUxFVFRFX0lOREVYCQkweDA1N0MKKyNkZWZpbmUgU1VCUElDX1BBTEVUVEVfREFUQQkJMHgwNTgwCisjZGVmaW5lIFNVQlBJQ19IX0FDQ1VNX0lOSVQJCTB4MDU4NAorI2RlZmluZSBTVUJQSUNfVl9BQ0NVTV9JTklUCQkweDA1ODgKKyNkZWZpbmUgRElTUF9NSVNDX0NOVEwJCQkweDBEMDAKKyNkZWZpbmUgREFDX01BQ1JPX0NOVEwJCQkweDBEMDQKKyNkZWZpbmUgRElTUF9QV1JfTUFOCQkJMHgwRDA4CisjZGVmaW5lIERJU1BfVEVTVF9ERUJVR19DTlRMCQkweDBEMTAKKyNkZWZpbmUgRElTUF9IV19ERUJVRwkJCTB4MEQxNAorI2RlZmluZSBEQUNfQ1JDX1NJRzEJCQkweDBEMTgKKyNkZWZpbmUgREFDX0NSQ19TSUcyCQkJMHgwRDFDCisjZGVmaW5lIE9WMF9MSU5fVFJBTlNfQQkJCTB4MEQyMAorI2RlZmluZSBPVjBfTElOX1RSQU5TX0IJCQkweDBEMjQKKyNkZWZpbmUgT1YwX0xJTl9UUkFOU19DCQkJMHgwRDI4CisjZGVmaW5lIE9WMF9MSU5fVFJBTlNfRAkJCTB4MEQyQworI2RlZmluZSBPVjBfTElOX1RSQU5TX0UJCQkweDBEMzAKKyNkZWZpbmUgT1YwX0xJTl9UUkFOU19GCQkJMHgwRDM0CisjZGVmaW5lIE9WMF9HQU1NQV8wX0YJCQkweDBENDAKKyNkZWZpbmUgT1YwX0dBTU1BXzEwXzFGCQkJMHgwRDQ0CisjZGVmaW5lIE9WMF9HQU1NQV8yMF8zRgkJCTB4MEQ0OAorI2RlZmluZSBPVjBfR0FNTUFfNDBfN0YJCQkweDBENEMKKyNkZWZpbmUgT1YwX0dBTU1BXzM4MF8zQkYJCTB4MEQ1MAorI2RlZmluZSBPVjBfR0FNTUFfM0MwXzNGRgkJMHgwRDU0CisjZGVmaW5lIERJU1BfTUVSR0VfQ05UTAkJCTB4MEQ2MAorI2RlZmluZSBESVNQX09VVFBVVF9DTlRMCQkweDBENjQKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9BCQkweDBEODAKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9CCQkweDBEODQKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9DCQkweDBEODgKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9ECQkweDBEOEMKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9FCQkweDBEOTAKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9GCQkweDBEOTQKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfVklEX0EJCTB4MEQ5OAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19WSURfQgkJMHgwRDlDCisjZGVmaW5lIERJU1BfTElOX1RSQU5TX1ZJRF9DCQkweDBEQTAKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfVklEX0QJCTB4MERBNAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19WSURfRQkJMHgwREE4CisjZGVmaW5lIERJU1BfTElOX1RSQU5TX1ZJRF9GCQkweDBEQUMKKyNkZWZpbmUgUk1YX0hPUlpfRklMVEVSXzBUQVBfQ09FRgkweDBEQjAKKyNkZWZpbmUgUk1YX0hPUlpfRklMVEVSXzFUQVBfQ09FRgkweDBEQjQKKyNkZWZpbmUgUk1YX0hPUlpfRklMVEVSXzJUQVBfQ09FRgkweDBEQjgKKyNkZWZpbmUgUk1YX0hPUlpfUEhBU0UJCQkweDBEQkMKKyNkZWZpbmUgREFDX0VNQkVEREVEX1NZTkNfQ05UTAkJMHgwREMwCisjZGVmaW5lIERBQ19CUk9BRF9QVUxTRQkJCTB4MERDNAorI2RlZmluZSBEQUNfU0tFV19DTEtTCQkJMHgwREM4CisjZGVmaW5lIERBQ19JTkNSCQkJMHgwRENDCisjZGVmaW5lIERBQ19ORUdfU1lOQ19MRVZFTAkJMHgwREQwCisjZGVmaW5lIERBQ19QT1NfU1lOQ19MRVZFTAkJMHgwREQ0CisjZGVmaW5lIERBQ19CTEFOS19MRVZFTAkJCTB4MEREOAorI2RlZmluZSBDTE9DS19DTlRMX0lOREVYCQkweDAwMDgKKyNkZWZpbmUgQ0xPQ0tfQ05UTF9EQVRBCQkJMHgwMDBDCisjZGVmaW5lIENQX1JCX0NOVEwJCQkweDA3MDQKKyNkZWZpbmUgQ1BfUkJfQkFTRQkJCTB4MDcwMAorI2RlZmluZSBDUF9SQl9SUFRSX0FERFIJCQkweDA3MEMKKyNkZWZpbmUgQ1BfUkJfUlBUUgkJCTB4MDcxMAorI2RlZmluZSBDUF9SQl9XUFRSCQkJMHgwNzE0CisjZGVmaW5lIENQX1JCX1dQVFJfREVMQVkJCTB4MDcxOAorI2RlZmluZSBDUF9JQl9CQVNFCQkJMHgwNzM4CisjZGVmaW5lIENQX0lCX0JVRlNaCQkJMHgwNzNDCisjZGVmaW5lIFNDUkFUQ0hfUkVHMAkJCTB4MTVFMAorI2RlZmluZSBHVUlfU0NSQVRDSF9SRUcwCQkweDE1RTAKKyNkZWZpbmUgU0NSQVRDSF9SRUcxCQkJMHgxNUU0CisjZGVmaW5lIEdVSV9TQ1JBVENIX1JFRzEJCTB4MTVFNAorI2RlZmluZSBTQ1JBVENIX1JFRzIJCQkweDE1RTgKKyNkZWZpbmUgR1VJX1NDUkFUQ0hfUkVHMgkJMHgxNUU4CisjZGVmaW5lIFNDUkFUQ0hfUkVHMwkJCTB4MTVFQworI2RlZmluZSBHVUlfU0NSQVRDSF9SRUczCQkweDE1RUMKKyNkZWZpbmUgU0NSQVRDSF9SRUc0CQkJMHgxNUYwCisjZGVmaW5lIEdVSV9TQ1JBVENIX1JFRzQJCTB4MTVGMAorI2RlZmluZSBTQ1JBVENIX1JFRzUJCQkweDE1RjQKKyNkZWZpbmUgR1VJX1NDUkFUQ0hfUkVHNQkJMHgxNUY0CisjZGVmaW5lIFNDUkFUQ0hfVU1TSwkJCTB4MDc3MAorI2RlZmluZSBTQ1JBVENIX0FERFIJCQkweDA3NzQKKyNkZWZpbmUgRFBfQlJVU0hfRlJHRF9DTFIJCTB4MTQ3QworI2RlZmluZSBEUF9CUlVTSF9CS0dEX0NMUgkJMHgxNDc4CisjZGVmaW5lIERTVF9MSU5FX1NUQVJUCQkJMHgxNjAwCisjZGVmaW5lIERTVF9MSU5FX0VORAkJCTB4MTYwNAorI2RlZmluZSBTUkNfT0ZGU0VUCQkJMHgxNUFDCisjZGVmaW5lIFNSQ19QSVRDSAkJCTB4MTVCMAorI2RlZmluZSBTUkNfVElMRQkJCTB4MTcwNAorI2RlZmluZSBTUkNfUElUQ0hfT0ZGU0VUCQkweDE0MjgKKyNkZWZpbmUgU1JDX1gJCQkJMHgxNDE0CisjZGVmaW5lIFNSQ19ZCQkJCTB4MTQxOAorI2RlZmluZSBTUkNfWF9ZCQkJCTB4MTU5MAorI2RlZmluZSBTUkNfWV9YCQkJCTB4MTQzNAorI2RlZmluZSBEU1RfWV9YCQkJCTB4MTQzOAorI2RlZmluZSBEU1RfV0lEVEhfSEVJR0hUCQkweDE1OTgKKyNkZWZpbmUgRFNUX0hFSUdIVF9XSURUSAkJMHgxNDNjCisjZGVmaW5lIERTVF9PRkZTRVQJCQkweDE0MDQKKyNkZWZpbmUgU1JDX0NMVVRfQUREUkVTUwkJMHgxNzgwCisjZGVmaW5lIFNSQ19DTFVUX0RBVEEJCQkweDE3ODQKKyNkZWZpbmUgU1JDX0NMVVRfREFUQV9SRAkJMHgxNzg4CisjZGVmaW5lIEhPU1RfREFUQTAJCQkweDE3QzAKKyNkZWZpbmUgSE9TVF9EQVRBMQkJCTB4MTdDNAorI2RlZmluZSBIT1NUX0RBVEEyCQkJMHgxN0M4CisjZGVmaW5lIEhPU1RfREFUQTMJCQkweDE3Q0MKKyNkZWZpbmUgSE9TVF9EQVRBNAkJCTB4MTdEMAorI2RlZmluZSBIT1NUX0RBVEE1CQkJMHgxN0Q0CisjZGVmaW5lIEhPU1RfREFUQTYJCQkweDE3RDgKKyNkZWZpbmUgSE9TVF9EQVRBNwkJCTB4MTdEQworI2RlZmluZSBIT1NUX0RBVEFfTEFTVAkJCTB4MTdFMAorI2RlZmluZSBEUF9TUkNfRU5ESUFOCQkJMHgxNUQ0CisjZGVmaW5lIERQX1NSQ19GUkdEX0NMUgkJCTB4MTVEOAorI2RlZmluZSBEUF9TUkNfQktHRF9DTFIJCQkweDE1REMKKyNkZWZpbmUgU0NfTEVGVAkJCQkweDE2NDAKKyNkZWZpbmUgU0NfUklHSFQJCQkweDE2NDQKKyNkZWZpbmUgU0NfVE9QCQkJCTB4MTY0OAorI2RlZmluZSBTQ19CT1RUT00JCQkweDE2NEMKKyNkZWZpbmUgU1JDX1NDX1JJR0hUCQkJMHgxNjU0CisjZGVmaW5lIFNSQ19TQ19CT1RUT00JCQkweDE2NUMKKyNkZWZpbmUgRFBfQ05UTAkJCQkweDE2QzAKKyNkZWZpbmUgRFBfQ05UTF9YRElSX1lESVJfWU1BSk9SCTB4MTZEMAorI2RlZmluZSBEUF9EQVRBVFlQRQkJCTB4MTZDNAorI2RlZmluZSBEUF9NSVgJCQkJMHgxNkM4CisjZGVmaW5lIERQX1dSSVRFX01TSwkJCTB4MTZDQworI2RlZmluZSBEUF9YT1AJCQkJMHgxN0Y4CisjZGVmaW5lIENMUl9DTVBfQ0xSX1NSQwkJCTB4MTVDNAorI2RlZmluZSBDTFJfQ01QX0NMUl9EU1QJCQkweDE1QzgKKyNkZWZpbmUgQ0xSX0NNUF9DTlRMCQkJMHgxNUMwCisjZGVmaW5lIENMUl9DTVBfTVNLCQkJMHgxNUNDCisjZGVmaW5lIERTVENBQ0hFX01PREUJCQkweDE3MTAKKyNkZWZpbmUgRFNUQ0FDSEVfQ1RMU1RBVAkJMHgxNzE0CisjZGVmaW5lIERFRkFVTFRfUElUQ0hfT0ZGU0VUCQkweDE2RTAKKyNkZWZpbmUgREVGQVVMVF9TQ19CT1RUT01fUklHSFQJCTB4MTZFOAorI2RlZmluZSBERUZBVUxUX1NDX1RPUF9MRUZUCQkweDE2RUMKKyNkZWZpbmUgU1JDX1BJVENIX09GRlNFVAkJMHgxNDI4CisjZGVmaW5lIERTVF9QSVRDSF9PRkZTRVQJCTB4MTQyQworI2RlZmluZSBEUF9HVUlfTUFTVEVSX0NOVEwJCTB4MTQ2QworI2RlZmluZSBTQ19UT1BfTEVGVAkJCTB4MTZFQworI2RlZmluZSBTQ19CT1RUT01fUklHSFQJCQkweDE2RjAKKyNkZWZpbmUgU1JDX1NDX0JPVFRPTV9SSUdIVAkJMHgxNkY0CisjZGVmaW5lIFJCMkRfRFNUQ0FDSEVfTU9ERQkJMHgzNDI4CisjZGVmaW5lIFJCMkRfRFNUQ0FDSEVfQ1RMU1RBVAkJMHgzNDJDCisjZGVmaW5lIExWRFNfR0VOX0NOVEwJCQkweDAyZDAKKyNkZWZpbmUgTFZEU19QTExfQ05UTAkJCTB4MDJkNAorI2RlZmluZSBGUDJfR0VOX0NOVEwJCQkweDAyODgKKyNkZWZpbmUgVE1EU19DTlRMCQkJMHgwMjk0CisjZGVmaW5lIFRNRFNfQ1JDCQkJMHgwMmEwCisjZGVmaW5lIFRNRFNfVFJBTlNNSVRURVJfQ05UTAkJMHgwMmE0CisjZGVmaW5lIE1QUF9UQl9DT05GSUcJCQkweDAxYzAKKyNkZWZpbmUgUEFNQUMwX0RMWV9DTlRMCQkJMHgwYTk0CisjZGVmaW5lIFBBTUFDMV9ETFlfQ05UTAkJCTB4MGE5OAorI2RlZmluZSBQQU1BQzJfRExZX0NOVEwJCQkweDBhOWMKKyNkZWZpbmUgRldfQ05UTAkJCQkweDAxMTgKKyNkZWZpbmUgRkNQX0NOVEwJCQkweDA5MTAKKyNkZWZpbmUgVkdBX0REQV9PTl9PRkYJCQkweDAyZWMKKyNkZWZpbmUgVFZfTUFTVEVSX0NOVEwJCQkweDA4MDAKKworLyogI2RlZmluZSBCQVNFX0NPREUJCQkweDBmMGIgKi8KKyNkZWZpbmUgQklPU18wX1NDUkFUQ0gJCQkweDAwMTAKKyNkZWZpbmUgQklPU18xX1NDUkFUQ0gJCQkweDAwMTQKKyNkZWZpbmUgQklPU18yX1NDUkFUQ0gJCQkweDAwMTgKKyNkZWZpbmUgQklPU18zX1NDUkFUQ0gJCQkweDAwMWMKKyNkZWZpbmUgQklPU180X1NDUkFUQ0gJCQkweDAwMjAKKyNkZWZpbmUgQklPU181X1NDUkFUQ0gJCQkweDAwMjQKKyNkZWZpbmUgQklPU182X1NDUkFUQ0gJCQkweDAwMjgKKyNkZWZpbmUgQklPU183X1NDUkFUQ0gJCQkweDAwMmMKKworI2RlZmluZSBIRFBfU09GVF9SRVNFVAkJCSgxIDw8IDI2KQorCisjZGVmaW5lIFRWX0RBQ19DTlRMCQkJMHgwODhjCisjZGVmaW5lIEdQSU9QQURfTUFTSwkJCTB4MDE5OAorI2RlZmluZSBHUElPUEFEX0EJCQkweDAxOWMKKyNkZWZpbmUgR1BJT1BBRF9FTgkJCTB4MDFhMAorI2RlZmluZSBHUElPUEFEX1kJCQkweDAxYTQKKyNkZWZpbmUgWlZfTENEUEFEX01BU0sJCQkweDAxYTgKKyNkZWZpbmUgWlZfTENEUEFEX0EJCQkweDAxYWMKKyNkZWZpbmUgWlZfTENEUEFEX0VOCQkJMHgwMWIwCisjZGVmaW5lIFpWX0xDRFBBRF9ZCQkJMHgwMWI0CisKKy8qIFBMTCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ0xLX1BJTl9DTlRMCQkJMHgwMDAxCisjZGVmaW5lIFBQTExfQ05UTAkJCTB4MDAwMgorI2RlZmluZSBQUExMX1JFRl9ESVYJCQkweDAwMDMKKyNkZWZpbmUgUFBMTF9ESVZfMAkJCTB4MDAwNAorI2RlZmluZSBQUExMX0RJVl8xCQkJMHgwMDA1CisjZGVmaW5lIFBQTExfRElWXzIJCQkweDAwMDYKKyNkZWZpbmUgUFBMTF9ESVZfMwkJCTB4MDAwNworI2RlZmluZSBWQ0xLX0VDUF9DTlRMCQkJMHgwMDA4CisjZGVmaW5lIEhUT1RBTF9DTlRMCQkJMHgwMDA5CisjZGVmaW5lIE1fU1BMTF9SRUZfRkJfRElWCQkweDAwMGEKKyNkZWZpbmUgQUdQX1BMTF9DTlRMCQkJMHgwMDBiCisjZGVmaW5lIFNQTExfQ05UTAkJCTB4MDAwYworI2RlZmluZSBTQ0xLX0NOVEwJCQkweDAwMGQKKyNkZWZpbmUgTVBMTF9DTlRMCQkJMHgwMDBlCisjZGVmaW5lIE1ETExfQ0tPCQkJMHgwMDBmCisjZGVmaW5lIE1ETExfUkRDS0EJCQkweDAwMTAKKyNkZWZpbmUgTUNMS19DTlRMCQkJMHgwMDEyCisjZGVmaW5lIEFHUF9QTExfQ05UTAkJCTB4MDAwYgorI2RlZmluZSBQTExfVEVTVF9DTlRMCQkJMHgwMDEzCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTAkJCTB4MDAxNAorI2RlZmluZSBQTExfUFdSTUdUX0NOVEwJCQkweDAwMTUKKyNkZWZpbmUgTUNMS19NSVNDCQkJMHgwMDFmCisjZGVmaW5lIFAyUExMX0NOVEwJCQkweDAwMmEKKyNkZWZpbmUgUDJQTExfUkVGX0RJVgkJCTB4MDAyYgorI2RlZmluZSBQSVhDTEtTX0NOVEwJCQkweDAwMmQKKyNkZWZpbmUgU0NMS19NT1JFX0NOVEwJCQkweDAwMzUKKworLyogTUNMS19DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRk9SQ0VPTl9NQ0xLQQkJCSgxIDw8IDE2KQorI2RlZmluZSBGT1JDRU9OX01DTEtCCQkJKDEgPDwgMTcpCisjZGVmaW5lIEZPUkNFT05fWUNMS0EJCQkoMSA8PCAxOCkKKyNkZWZpbmUgRk9SQ0VPTl9ZQ0xLQgkJCSgxIDw8IDE5KQorI2RlZmluZSBGT1JDRU9OX01DCQkJKDEgPDwgMjApCisjZGVmaW5lIEZPUkNFT05fQUlDCQkJKDEgPDwgMjEpCisKKy8qIFNDTEtfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIERZTl9TVE9QX0xBVF9NQVNLCQkweDAwMDA3ZmY4CisjZGVmaW5lIENQX01BWF9EWU5fU1RPUF9MQVQJCTB4MDAwOAorI2RlZmluZSBTQ0xLX0ZPUkNFT05fTUFTSwkJMHhmZmZmODAwMAorCisvKiBTQ0xLX01PUkVfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIFNDTEtfTU9SRV9GT1JDRU9OCQkweDA3MDAKKworLyogQlVTX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBCVVNfREJMX1JFU1lOQwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQlVTX01TVFJfUkVTRVQJCQkweDAwMDAwMDAyCisjZGVmaW5lIEJVU19GTFVTSF9CVUYJCQkweDAwMDAwMDA0CisjZGVmaW5lIEJVU19TVE9QX1JFUV9ESVMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQlVTX1JPVEFUSU9OX0RJUwkJMHgwMDAwMDAxMAorI2RlZmluZSBCVVNfTUFTVEVSX0RJUwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQlVTX1JPTV9XUlRfRU4JCQkweDAwMDAwMDgwCisjZGVmaW5lIEJVU19ESVNfUk9NCQkJMHgwMDAwMTAwMAorI2RlZmluZSBCVVNfUENJX1JFQURfUkVUUllfRU4JCTB4MDAwMDIwMDAKKyNkZWZpbmUgQlVTX0FHUF9BRF9TVEVQUElOR19FTgkJMHgwMDAwNDAwMAorI2RlZmluZSBCVVNfUENJX1dSVF9SRVRSWV9FTgkJMHgwMDAwODAwMAorI2RlZmluZSBCVVNfTVNUUl9SRF9NVUxUCQkweDAwMTAwMDAwCisjZGVmaW5lIEJVU19NU1RSX1JEX0xJTkUJCTB4MDAyMDAwMDAKKyNkZWZpbmUgQlVTX1NVU1BFTkQJCQkweDAwNDAwMDAwCisjZGVmaW5lIExBVF8xNlgJCQkJMHgwMDgwMDAwMAorI2RlZmluZSBCVVNfUkRfRElTQ0FSRF9FTgkJMHgwMTAwMDAwMAorI2RlZmluZSBCVVNfUkRfQUJPUlRfRU4JCQkweDAyMDAwMDAwCisjZGVmaW5lIEJVU19NU1RSX1dTCQkJMHgwNDAwMDAwMAorI2RlZmluZSBCVVNfUEFSS0lOR19ESVMJCQkweDA4MDAwMDAwCisjZGVmaW5lIEJVU19NU1RSX0RJU0NPTk5FQ1RfRU4JCTB4MTAwMDAwMDAKKyNkZWZpbmUgQlVTX1dSVF9CVVJTVAkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgQlVTX1JFQURfQlVSU1QJCQkweDQwMDAwMDAwCisjZGVmaW5lIEJVU19SRFlfUkVBRF9ETFkJCTB4ODAwMDAwMDAKKworLyogUElYQ0xLU19DTlRMICovCisjZGVmaW5lIFBJWDJDTEtfU1JDX1NFTF9NQVNLCQkweDAzCisjZGVmaW5lIFBJWDJDTEtfU1JDX1NFTF9DUFVDTEsJCTB4MDAKKyNkZWZpbmUgUElYMkNMS19TUkNfU0VMX1BTQ0FOQ0xLCTB4MDEKKyNkZWZpbmUgUElYMkNMS19TUkNfU0VMX0JZVEVDTEsJCTB4MDIKKyNkZWZpbmUgUElYMkNMS19TUkNfU0VMX1AyUExMQ0xLCTB4MDMKKyNkZWZpbmUgUElYMkNMS19BTFdBWVNfT05iCQkoMTw8NikKKyNkZWZpbmUgUElYMkNMS19EQUNfQUxXQVlTX09OYgkJKDE8PDcpCisjZGVmaW5lIFBJWENMS19UVl9TUkNfU0VMCQkoMSA8PCA4KQorI2RlZmluZSBQSVhDTEtfTFZEU19BTFdBWVNfT05iCQkoMSA8PCAxNCkKKyNkZWZpbmUgUElYQ0xLX1RNRFNfQUxXQVlTX09OYgkJKDEgPDwgMTUpCisKKworLyogQ0xPQ0tfQ05UTF9JTkRFWCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIFBMTF9XUl9FTgkJCTB4MDAwMDAwODAKKworLyogQ09ORklHX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBDRkdfVkdBX1JBTV9FTgkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ0ZHX0FUSV9SRVZfSURfTUFTSwkJKDB4ZiA8PCAxNikKKyNkZWZpbmUgQ0ZHX0FUSV9SRVZfQTExCQkJKDAgPDwgMTYpCisjZGVmaW5lIENGR19BVElfUkVWX0ExMgkJCSgxIDw8IDE2KQorI2RlZmluZSBDRkdfQVRJX1JFVl9BMTMJCQkoMiA8PCAxNikKKworLyogQ1JUQ19FWFRfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIFZHQV9BVElfTElORUFSCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWR0FfMTI4S0FQX1BBR0lORwkJMHgwMDAwMDAxMAorI2RlZmluZSBYQ1JUX0NOVF9FTgkJCSgxIDw8IDYpCisjZGVmaW5lIENSVENfSFNZTkNfRElTCQkJKDEgPDwgOCkKKyNkZWZpbmUgQ1JUQ19WU1lOQ19ESVMJCQkoMSA8PCA5KQorI2RlZmluZSBDUlRDX0RJU1BMQVlfRElTCQkoMSA8PCAxMCkKKyNkZWZpbmUgQ1JUQ19DUlRfT04JCQkoMSA8PCAxNSkKKworCisvKiBEU1RDQUNIRV9DVExTVEFUIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgUkIyRF9EQ19GTFVTSAkJCSgzIDw8IDApCisjZGVmaW5lIFJCMkRfRENfRkxVU0hfQUxMCQkweGYKKyNkZWZpbmUgUkIyRF9EQ19CVVNZCQkJKDEgPDwgMzEpCisKKworLyogQ1JUQ19HRU5fQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIENSVENfREJMX1NDQU5fRU4JCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JUQ19DVVJfRU4JCQkweDAwMDEwMDAwCisjZGVmaW5lIENSVENfSU5URVJMQUNFX0VOCQkoMSA8PCAxKQorI2RlZmluZSBDUlRDX0JZUEFTU19MVVRfRU4JCSgxIDw8IDE0KQorI2RlZmluZSBDUlRDX0VYVF9ESVNQX0VOCQkoMSA8PCAyNCkKKyNkZWZpbmUgQ1JUQ19FTgkJCQkoMSA8PCAyNSkKKyNkZWZpbmUgQ1JUQ19ESVNQX1JFUV9FTl9CCQkoMSA8PCAyNikKKworLyogQ1JUQ19TVEFUVVMgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBDUlRDX1ZCTEFOSwkJCTB4MDAwMDAwMDEKKworLyogQ1JUQzJfR0VOX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBDUlQyX09OCQkJCSgxIDw8IDcpCisjZGVmaW5lIENSVEMyX0RJU1BMQVlfRElTCQkoMSA8PCAyMykKKyNkZWZpbmUgQ1JUQzJfRU4JCQkoMSA8PCAyNSkKKyNkZWZpbmUgQ1JUQzJfRElTUF9SRVFfRU5fQgkJKDEgPDwgMjYpCisKKy8qIENVUl9PRkZTRVQsIENVUl9IT1JaX1ZFUlRfUE9TTiwgQ1VSX0hPUlpfVkVSVF9PRkYgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBDVVJfTE9DSwkJCTB4ODAwMDAwMDAKKworLyogR1BJTyBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIEdQSU9fQV8wCQkJKDEgPDwgIDApCisjZGVmaW5lIEdQSU9fQV8xCQkJKDEgPDwgIDEpCisjZGVmaW5lIEdQSU9fWV8wCQkJKDEgPDwgIDgpCisjZGVmaW5lIEdQSU9fWV8xCQkJKDEgPDwgIDkpCisjZGVmaW5lIEdQSU9fRU5fMAkJCSgxIDw8IDE2KQorI2RlZmluZSBHUElPX0VOXzEJCQkoMSA8PCAxNykKKyNkZWZpbmUgR1BJT19NQVNLXzAJCQkoMSA8PCAyNCkKKyNkZWZpbmUgR1BJT19NQVNLXzEJCQkoMSA8PCAyNSkKKyNkZWZpbmUgVkdBX0REQ19EQVRBX09VVFBVVAkJR1BJT19BXzAKKyNkZWZpbmUgVkdBX0REQ19DTEtfT1VUUFVUCQlHUElPX0FfMQorI2RlZmluZSBWR0FfRERDX0RBVEFfSU5QVVQJCUdQSU9fWV8wCisjZGVmaW5lIFZHQV9ERENfQ0xLX0lOUFVUCQlHUElPX1lfMQorI2RlZmluZSBWR0FfRERDX0RBVEFfT1VUX0VOCQlHUElPX0VOXzAKKyNkZWZpbmUgVkdBX0REQ19DTEtfT1VUX0VOCQlHUElPX0VOXzEKKworCisvKiBGUCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIEZQX0NSVENfSF9UT1RBTF9NQVNLCQkwMDAwMDNmZgorI2RlZmluZSBGUF9DUlRDX0hfRElTUF9NQVNLCQkweDAxZmYwMDAwCisjZGVmaW5lIEZQX0NSVENfVl9UT1RBTF9NQVNLCQkweDAwMDAwZmZmCisjZGVmaW5lIEZQX0NSVENfVl9ESVNQX01BU0sJCTB4MGZmZjAwMDAKKyNkZWZpbmUgRlBfSF9TWU5DX1NUUlRfQ0hBUl9NQVNLCTB4MDAwMDFmZjgKKyNkZWZpbmUgRlBfSF9TWU5DX1dJRF9NQVNLCQkweDAwM2YwMDAwCisjZGVmaW5lIEZQX1ZfU1lOQ19TVFJUX01BU0sJCTB4MDAwMDBmZmYKKyNkZWZpbmUgRlBfVl9TWU5DX1dJRF9NQVNLCQkweDAwMWYwMDAwCisjZGVmaW5lIEZQX0NSVENfSF9UT1RBTF9TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBGUF9DUlRDX0hfRElTUF9TSElGVAkJMHgwMDAwMDAxMAorI2RlZmluZSBGUF9DUlRDX1ZfVE9UQUxfU0hJRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRlBfQ1JUQ19WX0RJU1BfU0hJRlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRlBfSF9TWU5DX1NUUlRfQ0hBUl9TSElGVAkweDAwMDAwMDAzCisjZGVmaW5lIEZQX0hfU1lOQ19XSURfU0hJRlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRlBfVl9TWU5DX1NUUlRfU0hJRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRlBfVl9TWU5DX1dJRF9TSElGVAkJMHgwMDAwMDAxMAorCisvKiBGUF9HRU5fQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIEZQX0ZQT04JCQkJKDEgPDwgMCkKKyNkZWZpbmUgRlBfVE1EU19FTgkJCSgxIDw8IDIpCisjZGVmaW5lIEZQX1BBTkVMX0ZPUk1BVAkJCSgxIDw8IDMpCisjZGVmaW5lIEZQX0VOX1RNRFMJCQkoMSA8PCA3KQorI2RlZmluZSBGUF9ERVRFQ1RfU0VOU0UJCQkoMSA8PCA4KQorI2RlZmluZSBSMjAwX0ZQX1NPVVJDRV9TRUxfTUFTSwkJKDMgPDwgMTApCisjZGVmaW5lIFIyMDBfRlBfU09VUkNFX1NFTF9DUlRDMQkoMCA8PCAxMCkKKyNkZWZpbmUgUjIwMF9GUF9TT1VSQ0VfU0VMX0NSVEMyCSgxIDw8IDEwKQorI2RlZmluZSBSMjAwX0ZQX1NPVVJDRV9TRUxfUk1YCQkoMiA8PCAxMCkKKyNkZWZpbmUgUjIwMF9GUF9TT1VSQ0VfU0VMX1RSQU5TCSgzIDw8IDEwKQorI2RlZmluZSBGUF9TRUxfQ1JUQzEJCQkoMCA8PCAxMykKKyNkZWZpbmUgRlBfU0VMX0NSVEMyCQkJKDEgPDwgMTMpCisjZGVmaW5lIEZQX1VTRV9WR0FfSFNZTkMJCSgxIDw8IDE0KQorI2RlZmluZSBGUF9DUlRDX0RPTlRfU0hBRE9XX0hQQVIJKDEgPDwgMTUpCisjZGVmaW5lIEZQX0NSVENfRE9OVF9TSEFET1dfVlBBUgkoMSA8PCAxNikKKyNkZWZpbmUgRlBfQ1JUQ19ET05UX1NIQURPV19IRU5ECSgxIDw8IDE3KQorI2RlZmluZSBGUF9DUlRDX1VTRV9TSEFET1dfVkVORAkJKDEgPDwgMTgpCisjZGVmaW5lIEZQX1JNWF9IVlNZTkNfQ09OVFJPTF9FTgkoMSA8PCAyMCkKKyNkZWZpbmUgRlBfREZQX1NZTkNfU0VMCQkJKDEgPDwgMjEpCisjZGVmaW5lIEZQX0NSVENfTE9DS184RE9UCQkoMSA8PCAyMikKKyNkZWZpbmUgRlBfQ1JUX1NZTkNfU0VMCQkJKDEgPDwgMjMpCisjZGVmaW5lIEZQX1VTRV9TSEFET1dfRU4JCSgxIDw8IDI0KQorI2RlZmluZSBGUF9DUlRfU1lOQ19BTFQJCQkoMSA8PCAyNikKKworLyogRlAyX0dFTl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRlAyX0JMQU5LX0VOCQkJKDEgPDwJMSkKKyNkZWZpbmUgRlAyX09OCQkJCSgxIDw8CTIpCisjZGVmaW5lIEZQMl9QQU5FTF9GT1JNQVQJCSgxIDw8CTMpCisjZGVmaW5lIEZQMl9TT1VSQ0VfU0VMX01BU0sJCSgzIDw8IDEwKQorI2RlZmluZSBGUDJfU09VUkNFX1NFTF9DUlRDMgkJKDEgPDwgMTApCisjZGVmaW5lIEZQMl9TUkNfU0VMX01BU0sJCSgzIDw8IDEzKQorI2RlZmluZSBGUDJfU1JDX1NFTF9DUlRDMgkJKDEgPDwgMTMpCisjZGVmaW5lIEZQMl9GUF9QT0wJCQkoMSA8PCAxNikKKyNkZWZpbmUgRlAyX0xQX1BPTAkJCSgxIDw8IDE3KQorI2RlZmluZSBGUDJfU0NLX1BPTAkJCSgxIDw8IDE4KQorI2RlZmluZSBGUDJfTENEX0NOVExfTUFTSwkJKDcgPDwgMTkpCisjZGVmaW5lIEZQMl9QQURfRkxPUF9FTgkJCSgxIDw8IDIyKQorI2RlZmluZSBGUDJfQ1JDX0VOCQkJKDEgPDwgMjMpCisjZGVmaW5lIEZQMl9DUkNfUkVBRF9FTgkJCSgxIDw8IDI0KQorI2RlZmluZSBGUDJfRFYwX0VOCQkJKDEgPDwgMjUpCisjZGVmaW5lIEZQMl9EVjBfUkFURV9TRUxfU0RSCQkoMSA8PCAyNikKKworCisvKiBMVkRTX0dFTl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTFZEU19PTgkJCQkoMSA8PCAwKQorI2RlZmluZSBMVkRTX0RJU1BMQVlfRElTCQkoMSA8PCAxKQorI2RlZmluZSBMVkRTX1BBTkVMX1RZUEUJCQkoMSA8PCAyKQorI2RlZmluZSBMVkRTX1BBTkVMX0ZPUk1BVAkJKDEgPDwgMykKKyNkZWZpbmUgTFZEU19FTgkJCQkoMSA8PCA3KQorI2RlZmluZSBMVkRTX0JMX01PRF9MRVZFTF9NQVNLCQkweDAwMDBmZjAwCisjZGVmaW5lIExWRFNfQkxfTU9EX0xFVkVMX1NISUZUCQk4CisjZGVmaW5lIExWRFNfQkxfTU9EX0VOCQkJKDEgPDwgMTYpCisjZGVmaW5lIExWRFNfRElHT04JCQkoMSA8PCAxOCkKKyNkZWZpbmUgTFZEU19CTE9OCQkJKDEgPDwgMTkpCisjZGVmaW5lIExWRFNfU0VMX0NSVEMyCQkJKDEgPDwgMjMpCisjZGVmaW5lIExWRFNfU1RBVEVfTUFTSyBcCisJKExWRFNfT04gfCBMVkRTX0RJU1BMQVlfRElTIHwgTFZEU19CTF9NT0RfTEVWRUxfTUFTSyB8IExWRFNfQkxPTikKKworLyogTFZEU19QTExfQ05UTCBiaXQgY29uc3RhdG5zICovCisjZGVmaW5lIEhTWU5DX0RFTEFZX1NISUZUCQkweDFjCisjZGVmaW5lIEhTWU5DX0RFTEFZX01BU0sJCSgweGYgPDwgMHgxYykKKworLyogVE1EU19UUkFOU01JVFRFUl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVE1EU19QTExfRU4JCQkoMSA8PCAwKQorI2RlZmluZSBUTURTX1BMTFJTVAkJCSgxIDw8IDEpCisjZGVmaW5lIFRNRFNfUkFOX1BBVF9SU1QJCSgxIDw8IDcpCisjZGVmaW5lIFRNRFNfSUNIQ1NFTAkJCSgxIDw8IDI4KQorCisvKiBGUF9IT1JaX1NUUkVUQ0ggYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBIT1JaX1NUUkVUQ0hfUkFUSU9fTUFTSwkJMHhmZmZmCisjZGVmaW5lIEhPUlpfU1RSRVRDSF9SQVRJT19NQVgJCTQwOTYKKyNkZWZpbmUgSE9SWl9QQU5FTF9TSVpFCQkJKDB4MWZmIDw8IDE2KQorI2RlZmluZSBIT1JaX1BBTkVMX1NISUZUCQkxNgorI2RlZmluZSBIT1JaX1NUUkVUQ0hfUElYUkVQCQkoMCA8PCAyNSkKKyNkZWZpbmUgSE9SWl9TVFJFVENIX0JMRU5ECQkoMSA8PCAyNikKKyNkZWZpbmUgSE9SWl9TVFJFVENIX0VOQUJMRQkJKDEgPDwgMjUpCisjZGVmaW5lIEhPUlpfQVVUT19SQVRJTwkJCSgxIDw8IDI3KQorI2RlZmluZSBIT1JaX0ZQX0xPT1BfU1RSRVRDSAkJKDB4NyA8PCAyOCkKKyNkZWZpbmUgSE9SWl9BVVRPX1JBVElPX0lOQwkJKDEgPDwgMzEpCisKKworLyogRlBfVkVSVF9TVFJFVENIIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVkVSVF9TVFJFVENIX1JBVElPX01BU0sJCTB4ZmZmCisjZGVmaW5lIFZFUlRfU1RSRVRDSF9SQVRJT19NQVgJCTQwOTYKKyNkZWZpbmUgVkVSVF9QQU5FTF9TSVpFCQkJKDB4ZmZmIDw8IDEyKQorI2RlZmluZSBWRVJUX1BBTkVMX1NISUZUCQkxMgorI2RlZmluZSBWRVJUX1NUUkVUQ0hfTElOUkVQCQkoMCA8PCAyNikKKyNkZWZpbmUgVkVSVF9TVFJFVENIX0JMRU5ECQkoMSA8PCAyNikKKyNkZWZpbmUgVkVSVF9TVFJFVENIX0VOQUJMRQkJKDEgPDwgMjUpCisjZGVmaW5lIFZFUlRfQVVUT19SQVRJT19FTgkJKDEgPDwgMjcpCisjZGVmaW5lIFZFUlRfRlBfTE9PUF9TVFJFVENICQkoMHg3IDw8IDI4KQorI2RlZmluZSBWRVJUX1NUUkVUQ0hfUkVTRVJWRUQJCTB4ZjEwMDAwMDAKKworLyogREFDX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEQUNfOEJJVF9FTgkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgREFDXzRCUFBfUElYX09SREVSCQkweDAwMDAwMjAwCisjZGVmaW5lIERBQ19DUkNfRU4JCQkweDAwMDgwMDAwCisjZGVmaW5lIERBQ19NQVNLX0FMTAkJCSgweGZmIDw8IDI0KQorI2RlZmluZSBEQUNfUERXTgkJCSgxIDw8IDE1KQorI2RlZmluZSBEQUNfRVhQQU5EX01PREUJCQkoMSA8PCAxNCkKKyNkZWZpbmUgREFDX1ZHQV9BRFJfRU4JCQkoMSA8PCAxMykKKyNkZWZpbmUgREFDX1JBTkdFX0NOVEwJCQkoMyA8PCAgMCkKKyNkZWZpbmUgREFDX1JBTkdFX0NOVExfTUFTSwkJMHgwMworI2RlZmluZSBEQUNfQkxBTktJTkcJCQkoMSA8PCAgMikKKyNkZWZpbmUgREFDX0NNUF9FTgkJCSgxIDw8ICAzKQorI2RlZmluZSBEQUNfQ01QX09VVFBVVAkJCSgxIDw8ICA3KQorCisvKiBEQUNfQ05UTDIgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEQUMyX0VYUEFORF9NT0RFCQkoMSA8PCAxNCkKKyNkZWZpbmUgREFDMl9DTVBfRU4JCQkoMSA8PCA3KQorI2RlZmluZSBEQUMyX1BBTEVUVEVfQUNDRVNTX0NOVEwJKDEgPDwgNSkKKworLyogREFDX0VYVF9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgREFDX0ZPUkNFX0JMQU5LX09GRl9FTgkJKDEgPDwgNCkKKyNkZWZpbmUgREFDX0ZPUkNFX0RBVEFfRU4JCSgxIDw8IDUpCisjZGVmaW5lIERBQ19GT1JDRV9EQVRBX1NFTF9NQVNLCQkoMyA8PCA2KQorI2RlZmluZSBEQUNfRk9SQ0VfREFUQV9NQVNLCQkweDAwMDNmZjAwCisjZGVmaW5lIERBQ19GT1JDRV9EQVRBX1NISUZUCQk4CisKKy8qIEdFTl9SRVNFVF9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgU09GVF9SRVNFVF9HVUkJCQkweDAwMDAwMDAxCisjZGVmaW5lIFNPRlRfUkVTRVRfVkNMSwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgU09GVF9SRVNFVF9QQ0xLCQkJMHgwMDAwMDIwMAorI2RlZmluZSBTT0ZUX1JFU0VUX0VDUAkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU09GVF9SRVNFVF9ESVNQRU5HX1hDTEsJCTB4MDAwMDA4MDAKKworLyogTUVNX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBNRU1fQ1RMUl9TVEFUVVNfSURMRQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRU1fQ1RMUl9TVEFUVVNfQlVTWQkJMHgwMDEwMDAwMAorI2RlZmluZSBNRU1fU0VRTkNSX1NUQVRVU19JRExFCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FTV9TRVFOQ1JfU1RBVFVTX0JVU1kJCTB4MDAyMDAwMDAKKyNkZWZpbmUgTUVNX0FSQklURVJfU1RBVFVTX0lETEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVNX0FSQklURVJfU1RBVFVTX0JVU1kJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTUVNX1JFUV9VTkxPQ0sJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FTV9SRVFfTE9DSwkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUVNX05VTV9DSEFOTkVMU19NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FTV9VU0VfQl9DSF9PTkxZCQkweDAwMDAwMDAyCisjZGVmaW5lIFJWMTAwX01FTV9IQUxGX01PREUJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUjMwMF9NRU1fTlVNX0NIQU5ORUxTX01BU0sJMHgwMDAwMDAwMworI2RlZmluZSBSMzAwX01FTV9VU0VfQ0RfQ0hfT05MWQkJMHgwMDAwMDAwNAorCisKKy8qIFJCQk1fU09GVF9SRVNFVCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIFNPRlRfUkVTRVRfQ1AJCQkoMSA8PCAgMCkKKyNkZWZpbmUgU09GVF9SRVNFVF9ISQkJCSgxIDw8ICAxKQorI2RlZmluZSBTT0ZUX1JFU0VUX1NFCQkJKDEgPDwgIDIpCisjZGVmaW5lIFNPRlRfUkVTRVRfUkUJCQkoMSA8PCAgMykKKyNkZWZpbmUgU09GVF9SRVNFVF9QUAkJCSgxIDw8ICA0KQorI2RlZmluZSBTT0ZUX1JFU0VUX0UyCQkJKDEgPDwgIDUpCisjZGVmaW5lIFNPRlRfUkVTRVRfUkIJCQkoMSA8PCAgNikKKyNkZWZpbmUgU09GVF9SRVNFVF9IRFAJCQkoMSA8PCAgNykKKworLyogU1VSRkFDRV9DTlRMIGJpdCBjb25zYW50cyAqLworI2RlZmluZSBTVVJGX1RSQU5TTEFUSU9OX0RJUwkJKDEgPDwgOCkKKyNkZWZpbmUgTk9OU1VSRl9BUDBfU1dQXzE2QlBQCQkoMSA8PCAyMCkKKyNkZWZpbmUgTk9OU1VSRl9BUDBfU1dQXzMyQlBQCQkoMSA8PCAyMSkKKyNkZWZpbmUgTk9OU1VSRl9BUDFfU1dQXzE2QlBQCQkoMSA8PCAyMikKKyNkZWZpbmUgTk9OU1VSRl9BUDFfU1dQXzMyQlBQCQkoMSA8PCAyMykKKworLyogREVGQVVMVF9TQ19CT1RUT01fUklHSFQgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBERUZBVUxUX1NDX1JJR0hUX01BWAkJKDB4MWZmZiA8PCAwKQorI2RlZmluZSBERUZBVUxUX1NDX0JPVFRPTV9NQVgJCSgweDFmZmYgPDwgMTYpCisKKy8qIE1NX0lOREVYIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTU1fQVBFUgkJCQkweDgwMDAwMDAwCisKKy8qIENMUl9DTVBfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIENPTVBBUkVfU1JDX0ZBTFNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENPTVBBUkVfU1JDX1RSVUUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ09NUEFSRV9TUkNfTk9UX0VRVUFMCQkweDAwMDAwMDA0CisjZGVmaW5lIENPTVBBUkVfU1JDX0VRVUFMCQkweDAwMDAwMDA1CisjZGVmaW5lIENPTVBBUkVfU1JDX0VRVUFMX0ZMSVAJCTB4MDAwMDAwMDcKKyNkZWZpbmUgQ09NUEFSRV9EU1RfRkFMU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ09NUEFSRV9EU1RfVFJVRQkJMHgwMDAwMDEwMAorI2RlZmluZSBDT01QQVJFX0RTVF9OT1RfRVFVQUwJCTB4MDAwMDA0MDAKKyNkZWZpbmUgQ09NUEFSRV9EU1RfRVFVQUwJCTB4MDAwMDA1MDAKKyNkZWZpbmUgQ09NUEFSRV9ERVNUSU5BVElPTgkJMHgwMDAwMDAwMAorI2RlZmluZSBDT01QQVJFX1NPVVJDRQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgQ09NUEFSRV9TUkNfQU5EX0RTVAkJMHgwMjAwMDAwMAorCisKKy8qIERQX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEU1RfWF9SSUdIVF9UT19MRUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9YX0xFRlRfVE9fUklHSFQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRFNUX1lfQk9UVE9NX1RPX1RPUAkJMHgwMDAwMDAwMAorI2RlZmluZSBEU1RfWV9UT1BfVE9fQk9UVE9NCQkweDAwMDAwMDAyCisjZGVmaW5lIERTVF9YX01BSk9SCQkJMHgwMDAwMDAwMAorI2RlZmluZSBEU1RfWV9NQUpPUgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRFNUX1hfVElMRQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRFNUX1lfVElMRQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRFNUX0xBU1RfUEVMCQkJMHgwMDAwMDAyMAorI2RlZmluZSBEU1RfVFJBSUxfWF9SSUdIVF9UT19MRUZUCTB4MDAwMDAwMDAKKyNkZWZpbmUgRFNUX1RSQUlMX1hfTEVGVF9UT19SSUdIVAkweDAwMDAwMDQwCisjZGVmaW5lIERTVF9UUkFQX0ZJTExfUklHSFRfVE9fTEVGVAkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9UUkFQX0ZJTExfTEVGVF9UT19SSUdIVAkweDAwMDAwMDgwCisjZGVmaW5lIERTVF9CUkVTX1NJR04JCQkweDAwMDAwMTAwCisjZGVmaW5lIERTVF9IT1NUX0JJR19FTkRJQU5fRU4JCTB4MDAwMDAyMDAKKyNkZWZpbmUgRFNUX1BPTFlMSU5FX05PTkxBU1QJCTB4MDAwMDgwMDAKKyNkZWZpbmUgRFNUX1JBU1RFUl9TVEFMTAkJMHgwMDAxMDAwMAorI2RlZmluZSBEU1RfUE9MWV9FREdFCQkJMHgwMDA0MDAwMAorCisKKy8qIERQX0NOVExfWURJUl9YRElSX1lNQUpPUiBiaXQgY29uc3RhbnRzIChzaG9ydCB2ZXJzaW9uIG9mIERQX0NOVEwpICovCisjZGVmaW5lIERTVF9YX01BSk9SX1MJCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9ZX01BSk9SX1MJCQkweDAwMDAwMDAxCisjZGVmaW5lIERTVF9ZX0JPVFRPTV9UT19UT1BfUwkJMHgwMDAwMDAwMAorI2RlZmluZSBEU1RfWV9UT1BfVE9fQk9UVE9NX1MJCTB4MDAwMDgwMDAKKyNkZWZpbmUgRFNUX1hfUklHSFRfVE9fTEVGVF9TCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9YX0xFRlRfVE9fUklHSFRfUwkJMHg4MDAwMDAwMAorCisKKy8qIERQX0RBVEFUWVBFIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRFNUXzhCUFAJCQkweDAwMDAwMDAyCisjZGVmaW5lIERTVF8xNUJQUAkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgRFNUXzE2QlBQCQkJMHgwMDAwMDAwNAorI2RlZmluZSBEU1RfMjRCUFAJCQkweDAwMDAwMDA1CisjZGVmaW5lIERTVF8zMkJQUAkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgRFNUXzhCUFBfUkdCMzMyCQkJMHgwMDAwMDAwNworI2RlZmluZSBEU1RfOEJQUF9ZOAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRFNUXzhCUFBfUkdCOAkJCTB4MDAwMDAwMDkKKyNkZWZpbmUgRFNUXzE2QlBQX1ZZVVk0MjIJCTB4MDAwMDAwMGIKKyNkZWZpbmUgRFNUXzE2QlBQX1lWWVU0MjIJCTB4MDAwMDAwMGMKKyNkZWZpbmUgRFNUXzMyQlBQX0FZVVY0NDQJCTB4MDAwMDAwMGUKKyNkZWZpbmUgRFNUXzE2QlBQX0FSR0I0NDQ0CQkweDAwMDAwMDBmCisjZGVmaW5lIEJSVVNIX1NPTElEQ09MT1IJCTB4MDAwMDBkMDAKKyNkZWZpbmUgU1JDX01PTk8JCQkweDAwMDAwMDAwCisjZGVmaW5lIFNSQ19NT05PX0xCS0dECQkJMHgwMDAxMDAwMAorI2RlZmluZSBTUkNfRFNUQ09MT1IJCQkweDAwMDMwMDAwCisjZGVmaW5lIEJZVEVfT1JERVJfTVNCX1RPX0xTQgkJMHgwMDAwMDAwMAorI2RlZmluZSBCWVRFX09SREVSX0xTQl9UT19NU0IJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRFBfQ09OVkVSU0lPTl9URU1QCQkweDgwMDAwMDAwCisjZGVmaW5lIEhPU1RfQklHX0VORElBTl9FTgkJKDEgPDwgMjkpCisKKworLyogRFBfR1VJX01BU1RFUl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgR01DX1NSQ19QSVRDSF9PRkZTRVRfREVGQVVMVAkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19TUkNfUElUQ0hfT0ZGU0VUX0xFQVZFCTB4MDAwMDAwMDEKKyNkZWZpbmUgR01DX0RTVF9QSVRDSF9PRkZTRVRfREVGQVVMVAkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19EU1RfUElUQ0hfT0ZGU0VUX0xFQVZFCTB4MDAwMDAwMDIKKyNkZWZpbmUgR01DX1NSQ19DTElQX0RFRkFVTFQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX1NSQ19DTElQX0xFQVZFCQkweDAwMDAwMDA0CisjZGVmaW5lIEdNQ19EU1RfQ0xJUF9ERUZBVUxUCQkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19EU1RfQ0xJUF9MRUFWRQkJMHgwMDAwMDAwOAorI2RlZmluZSBHTUNfQlJVU0hfOHg4TU9OTwkJMHgwMDAwMDAwMAorI2RlZmluZSBHTUNfQlJVU0hfOHg4TU9OT19MQktHRAkJMHgwMDAwMDAxMAorI2RlZmluZSBHTUNfQlJVU0hfOHgxTU9OTwkJMHgwMDAwMDAyMAorI2RlZmluZSBHTUNfQlJVU0hfOHgxTU9OT19MQktHRAkJMHgwMDAwMDAzMAorI2RlZmluZSBHTUNfQlJVU0hfMXg4TU9OTwkJMHgwMDAwMDA0MAorI2RlZmluZSBHTUNfQlJVU0hfMXg4TU9OT19MQktHRAkJMHgwMDAwMDA1MAorI2RlZmluZSBHTUNfQlJVU0hfMzJ4MU1PTk8JCTB4MDAwMDAwNjAKKyNkZWZpbmUgR01DX0JSVVNIXzMyeDFNT05PX0xCS0dECTB4MDAwMDAwNzAKKyNkZWZpbmUgR01DX0JSVVNIXzMyeDMyTU9OTwkJMHgwMDAwMDA4MAorI2RlZmluZSBHTUNfQlJVU0hfMzJ4MzJNT05PX0xCS0dECTB4MDAwMDAwOTAKKyNkZWZpbmUgR01DX0JSVVNIXzh4OENPTE9SCQkweDAwMDAwMGEwCisjZGVmaW5lIEdNQ19CUlVTSF84eDFDT0xPUgkJMHgwMDAwMDBiMAorI2RlZmluZSBHTUNfQlJVU0hfMXg4Q09MT1IJCTB4MDAwMDAwYzAKKyNkZWZpbmUgR01DX0JSVVNIX1NPTElEX0NPTE9SCQkweDAwMDAwMGQwCisjZGVmaW5lIEdNQ19EU1RfOEJQUAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgR01DX0RTVF8xNUJQUAkJCTB4MDAwMDAzMDAKKyNkZWZpbmUgR01DX0RTVF8xNkJQUAkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgR01DX0RTVF8yNEJQUAkJCTB4MDAwMDA1MDAKKyNkZWZpbmUgR01DX0RTVF8zMkJQUAkJCTB4MDAwMDA2MDAKKyNkZWZpbmUgR01DX0RTVF84QlBQX1JHQjMzMgkJMHgwMDAwMDcwMAorI2RlZmluZSBHTUNfRFNUXzhCUFBfWTgJCQkweDAwMDAwODAwCisjZGVmaW5lIEdNQ19EU1RfOEJQUF9SR0I4CQkweDAwMDAwOTAwCisjZGVmaW5lIEdNQ19EU1RfMTZCUFBfVllVWTQyMgkJMHgwMDAwMGIwMAorI2RlZmluZSBHTUNfRFNUXzE2QlBQX1lWWVU0MjIJCTB4MDAwMDBjMDAKKyNkZWZpbmUgR01DX0RTVF8zMkJQUF9BWVVWNDQ0CQkweDAwMDAwZTAwCisjZGVmaW5lIEdNQ19EU1RfMTZCUFBfQVJHQjQ0NDQJCTB4MDAwMDBmMDAKKyNkZWZpbmUgR01DX1NSQ19NT05PCQkJMHgwMDAwMDAwMAorI2RlZmluZSBHTUNfU1JDX01PTk9fTEJLR0QJCTB4MDAwMDEwMDAKKyNkZWZpbmUgR01DX1NSQ19EU1RDT0xPUgkJMHgwMDAwMzAwMAorI2RlZmluZSBHTUNfQllURV9PUkRFUl9NU0JfVE9fTFNCCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX0JZVEVfT1JERVJfTFNCX1RPX01TQgkweDAwMDA0MDAwCisjZGVmaW5lIEdNQ19EUF9DT05WRVJTSU9OX1RFTVBfOTMwMAkweDAwMDA4MDAwCisjZGVmaW5lIEdNQ19EUF9DT05WRVJTSU9OX1RFTVBfNjUwMAkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19EUF9TUkNfUkVDVAkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgR01DX0RQX1NSQ19IT1NUCQkJMHgwMzAwMDAwMAorI2RlZmluZSBHTUNfRFBfU1JDX0hPU1RfQllURUFMSUdOCTB4MDQwMDAwMDAKKyNkZWZpbmUgR01DXzNEX0ZDTl9FTl9DTFIJCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DXzNEX0ZDTl9FTl9TRVQJCTB4MDgwMDAwMDAKKyNkZWZpbmUgR01DX0RTVF9DTFJfQ01QX0ZDTl9MRUFWRQkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19EU1RfQ0xSX0NNUF9GQ05fQ0xFQVIJMHgxMDAwMDAwMAorI2RlZmluZSBHTUNfQVVYX0NMSVBfTEVBVkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX0FVWF9DTElQX0NMRUFSCQkweDIwMDAwMDAwCisjZGVmaW5lIEdNQ19XUklURV9NQVNLX0xFQVZFCQkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19XUklURV9NQVNLX1NFVAkJMHg0MDAwMDAwMAorI2RlZmluZSBHTUNfQ0xSX0NNUF9DTlRMX0RJUwkJKDEgPDwgMjgpCisjZGVmaW5lIEdNQ19TUkNfREFUQVRZUEVfQ09MT1IJCSgzIDw8IDEyKQorI2RlZmluZSBST1AzX1MJCQkJMHgwMGNjMDAwMAorI2RlZmluZSBST1AzX1NSQ0NPUFkJCQkweDAwY2MwMDAwCisjZGVmaW5lIFJPUDNfUAkJCQkweDAwZjAwMDAwCisjZGVmaW5lIFJPUDNfUEFUQ09QWQkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgRFBfU1JDX1NPVVJDRV9NQVNLCQkoNyAgPDwgMjQpCisjZGVmaW5lIEdNQ19CUlVTSF9OT05FCQkJKDE1IDw8ICA0KQorI2RlZmluZSBEUF9TUkNfU09VUkNFX01FTU9SWQkJKDIgIDw8IDI0KQorI2RlZmluZSBHTUNfQlJVU0hfU09MSURDT0xPUgkJMHgwMDAwMDBkMAorCisvKiBEUF9NSVggYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEUF9TUkNfUkVDVAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgRFBfU1JDX0hPU1QJCQkweDAwMDAwMzAwCisjZGVmaW5lIERQX1NSQ19IT1NUX0JZVEVBTElHTgkJMHgwMDAwMDQwMAorCisvKiBNUExMX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBNUExMX1JFU0VUCQkJMHgwMDAwMDAwMQorCisvKiBNRExMX0NLTyBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIE1DS09BX1NMRUVQCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNQ0tPQV9SRVNFVAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUNLT0FfUkVGX1NLRVdfTUFTSwkJMHgwMDAwMDcwMAorI2RlZmluZSBNQ0tPQV9GQl9TS0VXX01BU0sJCTB4MDAwMDcwMDAKKworLyogTURMTF9SRENLQSBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIE1SRENLQTBfU0xFRVAJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1SRENLQTBfUkVTRVQJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1SRENLQTFfU0xFRVAJCQkweDAwMDEwMDAwCisjZGVmaW5lIE1SRENLQTFfUkVTRVQJCQkweDAwMDIwMDAwCisKKy8qIFZDTEtfRUNQX0NOVEwgY29uc3RhbnRzICovCisjZGVmaW5lIFZDTEtfU1JDX1NFTF9NQVNLCQkweDAzCisjZGVmaW5lIFZDTEtfU1JDX1NFTF9DUFVDTEsJCTB4MDAKKyNkZWZpbmUgVkNMS19TUkNfU0VMX1BTQ0FOQ0xLCQkweDAxCisjZGVmaW5lIFZDTEtfU1JDX1NFTF9CWVRFQ0xLCQkweDAyCisjZGVmaW5lIFZDTEtfU1JDX1NFTF9QUExMQ0xLCQkweDAzCisjZGVmaW5lIFBJWENMS19BTFdBWVNfT05iCQkweDAwMDAwMDQwCisjZGVmaW5lIFBJWENMS19EQUNfQUxXQVlTX09OYgkJMHgwMDAwMDA4MAorCisvKiBCVVNfQ05UTDEgY29uc3RhbnRzICovCisjZGVmaW5lIEJVU19DTlRMMV9NT0JJTEVfUExBVEZPUk1fU0VMX01BU0sJMHgwYzAwMDAwMAorI2RlZmluZSBCVVNfQ05UTDFfTU9CSUxFX1BMQVRGT1JNX1NFTF9TSElGVAkyNgorI2RlZmluZSBCVVNfQ05UTDFfQUdQQ0xLX1ZBTElECQkJMHg4MDAwMDAwMAorCisvKiBQTExfUFdSTUdUX0NOVEwgY29uc3RhbnRzICovCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9TUExMX1RVUk5PRkYJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX1BQTExfVFVSTk9GRgkJMHgwMDAwMDAwNAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfUDJQTExfVFVSTk9GRgkJMHgwMDAwMDAwOAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfVFZQTExfVFVSTk9GRgkJMHgwMDAwMDAxMAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfTU9CSUxFX1NVCQkweDAwMDEwMDAwCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9TVV9TQ0xLX1VTRV9CQ0xLCTB4MDAwMjAwMDAKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX1NVX01DTEtfVVNFX0JDTEsJMHgwMDA0MDAwMAorCisvKiBUVl9EQUNfQ05UTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVFZfREFDX0NOVExfQkdTTEVFUAkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFZfREFDX0NOVExfREVURUNUCQkJMHgwMDAwMDAxMAorI2RlZmluZSBUVl9EQUNfQ05UTF9CR0FESl9NQVNLCQkJMHgwMDBmMDAwMAorI2RlZmluZSBUVl9EQUNfQ05UTF9EQUNBREpfTUFTSwkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgVFZfREFDX0NOVExfQkdBREpfX1NISUZUCQkxNgorI2RlZmluZSBUVl9EQUNfQ05UTF9EQUNBREpfX1NISUZUCQkyMAorI2RlZmluZSBUVl9EQUNfQ05UTF9SREFDUEQJCQkweDAxMDAwMDAwCisjZGVmaW5lIFRWX0RBQ19DTlRMX0dEQUNQRAkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgVFZfREFDX0NOVExfQkRBQ1BECQkJMHgwNDAwMDAwMAorCisvKiBESVNQX01JU0NfQ05UTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9HUlBIX1BQCSgxIDw8IDApCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfU1VCUElDX1BQCSgxIDw8IDEpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfT1YwX1BQCSgxIDw8IDIpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfR1JQSF9TQ0xLCSgxIDw8IDQpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfU1VCUElDX1NDTEsJKDEgPDwgNSkKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9PVjBfU0NMSwkoMSA8PCA2KQorI2RlZmluZSBESVNQX01JU0NfQ05UTF9TT0ZUX1JFU0VUX0dSUEgyX1BQCSgxIDw8IDEyKQorI2RlZmluZSBESVNQX01JU0NfQ05UTF9TT0ZUX1JFU0VUX0dSUEgyX1NDTEsJKDEgPDwgMTUpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfTFZEUwkJKDEgPDwgMTYpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfVE1EUwkJKDEgPDwgMTcpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfRElHX1RNRFMJKDEgPDwgMTgpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfVFYJCSgxIDw8IDE5KQorCisvKiBESVNQX1BXUl9NQU4gY29uc3RhbnRzICovCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX1BXUl9NQU5fRDNfQ1JUQ19FTgkoMSA8PCAwKQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUDJfUFdSX01BTl9EM19DUlRDMl9FTgkoMSA8PCA0KQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EM19SU1QJCSgxIDw8IDE2KQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EM19SRUdfUlNUCQkoMSA8PCAxNykKKyNkZWZpbmUgRElTUF9QV1JfTUFOX0RJU1BfRDNfR1JQSF9SU1QJCSgxIDw8IDE4KQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EM19TVUJQSUNfUlNUCQkoMSA8PCAxOSkKKyNkZWZpbmUgRElTUF9QV1JfTUFOX0RJU1BfRDNfT1YwX1JTVAkJKDEgPDwgMjApCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX0QxRDJfR1JQSF9SU1QJCSgxIDw8IDIxKQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EMUQyX1NVQlBJQ19SU1QJKDEgPDwgMjIpCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX0QxRDJfT1YwX1JTVAkJKDEgPDwgMjMpCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESUdfVE1EU19FTkFCTEVfUlNUCSgxIDw8IDI0KQorI2RlZmluZSBESVNQX1BXUl9NQU5fVFZfRU5BQkxFX1JTVAkJKDEgPDwgMjUpCisjZGVmaW5lIERJU1BfUFdSX01BTl9BVVRPX1BXUlVQX0VOCQkoMSA8PCAyNikKKworLyogbWFza3MgKi8KKworI2RlZmluZSBDT05GSUdfTUVNU0laRV9NQVNLCQkweDFmMDAwMDAwCisjZGVmaW5lIE1FTV9DRkdfVFlQRQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRFNUX09GRlNFVF9NQVNLCQkJMHgwMDNmZmZmZgorI2RlZmluZSBEU1RfUElUQ0hfTUFTSwkJCTB4M2ZjMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9USUxFX01BU0sJCTB4YzAwMDAwMDAKKyNkZWZpbmUgUFBMTF9ESVZfU0VMX01BU0sJCTB4MDAwMDAzMDAKKyNkZWZpbmUgUFBMTF9SRVNFVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUFBMTF9TTEVFUAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUFBMTF9BVE9NSUNfVVBEQVRFX0VOCQkweDAwMDEwMDAwCisjZGVmaW5lIFBQTExfUkVGX0RJVl9NQVNLCQkweDAwMDAwM2ZmCisjZGVmaW5lIFBQTExfRkIzX0RJVl9NQVNLCQkweDAwMDAwN2ZmCisjZGVmaW5lIFBQTExfUE9TVDNfRElWX01BU0sJCTB4MDAwNzAwMDAKKyNkZWZpbmUgUFBMTF9BVE9NSUNfVVBEQVRFX1IJCTB4MDAwMDgwMDAKKyNkZWZpbmUgUFBMTF9BVE9NSUNfVVBEQVRFX1cJCTB4MDAwMDgwMDAKKyNkZWZpbmUgUFBMTF9WR0FfQVRPTUlDX1VQREFURV9FTgkweDAwMDIwMDAwCisjZGVmaW5lIFIzMDBfUFBMTF9SRUZfRElWX0FDQ19NQVNLCSgweDNmZiA8PCAxOCkKKyNkZWZpbmUgUjMwMF9QUExMX1JFRl9ESVZfQUNDX1NISUZUCTE4CisKKyNkZWZpbmUgR1VJX0FDVElWRQkJCTB4ODAwMDAwMDAKKworCisjZGVmaW5lIE1DX0lORF9JTkRFWAkJCTB4MDFGOAorI2RlZmluZSBNQ19JTkRfREFUQQkJCTB4MDFGQworCisvKiBQQURfQ1RMUl9TVFJFTkdUSCAqLworI2RlZmluZSBQQURfTUFOVUFMX09WRVJSSURFCQkweDgwMDAwMDAwCisKKy8qIHBsbENMS19QSU5fQ05UTCAqLworI2RlZmluZSBDTEtfUElOX0NOVExfX09TQ19FTl9NQVNLCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19PU0NfRU4JCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19YVExfTE9XX0dBSU5fTUFTSwkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fWFRMX0xPV19HQUlOCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19ET05UX1VTRV9YVEFMSU5fTUFTSwkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19ET05UX1VTRV9YVEFMSU4JCQkweDAwMDAwMDEwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX1NMT1dfQ0xPQ0tfU09VUkNFX01BU0sJCTB4MDAwMDAwMjBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fU0xPV19DTE9DS19TT1VSQ0UJCQkweDAwMDAwMDIwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX0NMS19UT19PVVRQSU5fTUFTSwkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19DR19DTEtfVE9fT1VUUElOCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19DR19DT1VOVF9VUF9UT19PVVRQSU5fTUFTSwkweDAwMDAxMDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX0NPVU5UX1VQX1RPX09VVFBJTgkJMHgwMDAwMTAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19BQ0NFU1NfUkVHU19JTl9TVVNQRU5EX01BU0sJMHgwMDAwMjAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19BQ0NFU1NfUkVHU19JTl9TVVNQRU5ECQkweDAwMDAyMDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX1NQQVJFX01BU0sJCQkweDAwMDA0MDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX1NQQVJFCQkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fU0NMS19EWU5fU1RBUlRfQ05UTF9NQVNLCQkweDAwMDA4MDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX1NDTEtfRFlOX1NUQVJUX0NOVEwJCTB4MDAwMDgwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fQ1BfQ0xLX1JVTk5JTkdfTUFTSwkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19DUF9DTEtfUlVOTklORwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fQ0dfU1BBUkVfUkRfTUFTSwkJCTB4MDAwNjAwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fWFRBTElOX0FMV0FZU19PTmJfTUFTSwkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19YVEFMSU5fQUxXQVlTX09OYgkJCTB4MDAwODAwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fUFdSU0VRX0RFTEFZX01BU0sJCQkweGZmMDAwMDAwTAorCisvKiBwbGxDTEtfUFdSTUdUX0NOVEwgKi8KKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NUExMX1BXUk1HVF9PRkZfX1NISUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fU1BMTF9QV1JNR1RfT0ZGX19TSElGVAkJMHgwMDAwMDAwMQorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1BQTExfUFdSTUdUX09GRl9fU0hJRlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QMlBMTF9QV1JNR1RfT0ZGX19TSElGVAkweDAwMDAwMDAzCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNMS19UVVJOT0ZGX19TSElGVAkJMHgwMDAwMDAwNAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1NDTEtfVFVSTk9GRl9fU0hJRlQJCTB4MDAwMDAwMDUKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QQ0xLX1RVUk5PRkZfX1NISUZUCQkweDAwMDAwMDA2CisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUDJDTEtfVFVSTk9GRl9fU0hJRlQJCTB4MDAwMDAwMDcKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19DSF9NT0RFX19TSElGVAkJMHgwMDAwMDAwOAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RFU1RfTU9ERV9fU0hJRlQJCTB4MDAwMDAwMDkKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19HTE9CQUxfUE1BTl9FTl9fU0hJRlQJCTB4MDAwMDAwMGEKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19FTkdJTkVfRFlOQ0xLX01PREVfX1NISUZUCTB4MDAwMDAwMGMKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19BQ1RJVkVfSElMT19MQVRfX1NISUZUCQkweDAwMDAwMDBkCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRElTUF9EWU5fU1RPUF9MQVRfX1NISUZUCTB4MDAwMDAwMGYKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19CVVNZX19TSElGVAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19JTlRfQ05UTF9fU0hJRlQJCTB4MDAwMDAwMTEKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19TV0lUQ0hfX1NISUZUCQkweDAwMDAwMDEyCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRExMX1JFQURZX19TSElGVAkJMHgwMDAwMDAxMworI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RJU1BfUE1fX1NISUZUCQkJMHgwMDAwMDAxNAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RZTl9TVE9QX01PREVfX1NISUZUCQkweDAwMDAwMDE1CisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fQ0dfTk8xX0RFQlVHX19TSElGVAkJMHgwMDAwMDAxOAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWUExMX1BXUk1HVF9PRkZfX1NISUZUCTB4MDAwMDAwMWUKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19UVkNMS19UVVJOT0ZGX19TSElGVAkJMHgwMDAwMDAxZgorCisvKiBwbGxQMlBMTF9DTlRMICovCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1JFU0VUX01BU0sJCQkweDAwMDAwMDAxTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9SRVNFVAkJCQkweDAwMDAwMDAxTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9TTEVFUF9NQVNLCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfU0xFRVAJCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfVFNUX0VOX01BU0sJCQkweDAwMDAwMDA0TAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UU1RfRU4JCQkweDAwMDAwMDA0TAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9SRUZDTEtfU0VMX01BU0sJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1JFRkNMS19TRUwJCQkweDAwMDAwMDEwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9GQkNMS19TRUxfTUFTSwkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfRkJDTEtfU0VMCQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfVENQT0ZGX01BU0sJCQkweDAwMDAwMDQwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UQ1BPRkYJCQkweDAwMDAwMDQwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UVkNPTUFYX01BU0sJCQkweDAwMDAwMDgwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UVkNPTUFYCQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfUENQX01BU0sJCQkweDAwMDAwNzAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9QVkdfTUFTSwkJCTB4MDAwMDM4MDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1BEQ19NQVNLCQkJMHgwMDAwYzAwMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfQVRPTUlDX1VQREFURV9FTl9NQVNLCQkweDAwMDEwMDAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9BVE9NSUNfVVBEQVRFX0VOCQkweDAwMDEwMDAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9BVE9NSUNfVVBEQVRFX1NZTkNfTUFTSwkweDAwMDQwMDAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9BVE9NSUNfVVBEQVRFX1NZTkMJCTB4MDAwNDAwMDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX0RJU0FCTEVfQVVUT19SRVNFVF9NQVNLCTB4MDAwODAwMDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX0RJU0FCTEVfQVVUT19SRVNFVAkJMHgwMDA4MDAwMEwKKworLyogcGxsUElYQ0xLU19DTlRMICovCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19TUkNfU0VMX19TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWDJDTEtfSU5WRVJUX19TSElGVAkJMHgwMDAwMDAwNAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWDJDTEtfU1JDX0lOVkVSVF9fU0hJRlQJCTB4MDAwMDAwMDUKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX0FMV0FZU19PTmJfX1NISUZUCQkweDAwMDAwMDA2CisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19EQUNfQUxXQVlTX09OYl9fU0hJRlQJMHgwMDAwMDAwNworI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19UVl9TUkNfU0VMX19TSElGVAkJMHgwMDAwMDAwOAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19CTEVORF9BTFdBWVNfT05iX19TSElGVAkweDAwMDAwMDBiCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0dWX0FMV0FZU19PTmJfX1NISUZUCTB4MDAwMDAwMGMKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfRElHX1RNRFNfQUxXQVlTX09OYl9fU0hJRlQJMHgwMDAwMDAwZAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19MVkRTX0FMV0FZU19PTmJfX1NISUZUCTB4MDAwMDAwMGUKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfVE1EU19BTFdBWVNfT05iX19TSElGVAkweDAwMDAwMDBmCisKKworLyogcGxsUElYQ0xLU19DTlRMICovCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19TUkNfU0VMX01BU0sJCTB4MDAwMDAwMDNMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19JTlZFUlQJCQkweDAwMDAwMDEwTAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWDJDTEtfU1JDX0lOVkVSVAkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX0FMV0FZU19PTmIJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19EQUNfQUxXQVlTX09OYgkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfVFZfU1JDX1NFTAkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0JMRU5EX0FMV0FZU19PTmIJCTB4MDAwMDA4MDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0dWX0FMV0FZU19PTmIJCTB4MDAwMDEwMDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0RJR19UTURTX0FMV0FZU19PTmIJMHgwMDAwMjAwMEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfTFZEU19BTFdBWVNfT05iCQkweDAwMDA0MDAwTAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19UTURTX0FMV0FZU19PTmIJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fRElTUF9UVk9VVF9QSVhDTEtfVFZfQUxXQVlTX09OYgkoMSA8PCA5KQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfRFZPQ0xLX0FMV0FZU19PTmIJCSgxIDw8IDEwKQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfUElYQ0xLX0RWT19BTFdBWVNfT05iCSgxIDw8IDEzKQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfUElYQ0xLX1RSQU5TX0FMV0FZU19PTmIJKDEgPDwgMTYpCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUjMwMF9QSVhDTEtfVFZPX0FMV0FZU19PTmIJKDEgPDwgMTcpCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUjMwMF9QMkcyQ0xLX0FMV0FZU19PTmIJCSgxIDw8IDE4KQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfUDJHMkNMS19EQUNfQUxXQVlTX09OYgkoMSA8PCAxOSkKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19SMzAwX0RJU1BfREFDX1BJWENMS19EQUMyX0JMQU5LX09GRiAoMSA8PCAyMykKKworCisvKiBwbGxQMlBMTF9ESVZfMCAqLworI2RlZmluZSBQMlBMTF9ESVZfMF9fUDJQTExfRkJfRElWX01BU0sJCQkweDAwMDAwN2ZmTAorI2RlZmluZSBQMlBMTF9ESVZfMF9fUDJQTExfQVRPTUlDX1VQREFURV9XX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFAyUExMX0RJVl8wX19QMlBMTF9BVE9NSUNfVVBEQVRFX1cJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFAyUExMX0RJVl8wX19QMlBMTF9BVE9NSUNfVVBEQVRFX1JfTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUDJQTExfRElWXzBfX1AyUExMX0FUT01JQ19VUERBVEVfUgkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUDJQTExfRElWXzBfX1AyUExMX1BPU1RfRElWX01BU0sJCTB4MDAwNzAwMDBMCisKKy8qIHBsbFNDTEtfQ05UTCAqLworI2RlZmluZSBTQ0xLX0NOVExfX1NDTEtfU1JDX1NFTF9NQVNLCQkJMHgwMDAwMDAwN0wKKyNkZWZpbmUgU0NMS19DTlRMX19DUF9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgU0NMS19DTlRMX19IRFBfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFNDTEtfQ05UTF9fVFZfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDAwMjBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRTJfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fU0VfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDAwODBMCisjZGVmaW5lIFNDTEtfQ05UTF9fSURDVF9NQVhfRFlOX1NUT1BfTEFUCQkweDAwMDAwMTAwTAorI2RlZmluZSBTQ0xLX0NOVExfX1ZJUF9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19SRV9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19QQl9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19UQU1fTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDEwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fVERNX01BWF9EWU5fU1RPUF9MQVQJCQkweDAwMDAyMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX1JCX01BWF9EWU5fU1RPUF9MQVQJCQkweDAwMDA0MDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0RZTl9TVE9QX0xBVF9NQVNLCQkJMHgwMDAwN2ZmOAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX0RJU1AyCQkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfQ1AJCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9IRFAJCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9ESVNQMQkJCQkweDAwMDQwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1RPUAkJCQkweDAwMDgwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX0UyCQkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfU0UJCQkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9JRENUCQkJCTB4MDA0MDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfVklQCQkJCTB4MDA4MDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfUkUJCQkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9QQgkJCQkweDAyMDAwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1RBTQkJCQkweDA0MDAwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1RETQkJCQkweDA4MDAwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1JCCQkJCTB4MTAwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfVFZfU0NMSwkJCTB4MjAwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfU1VCUElDCQkJCTB4NDAwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfT1YwCQkJCTB4ODAwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fUjMwMF9GT1JDRV9WQVAJCQkoMTw8MjEpCisjZGVmaW5lIFNDTEtfQ05UTF9fUjMwMF9GT1JDRV9TUgkJCSgxPDwyNSkKKyNkZWZpbmUgU0NMS19DTlRMX19SMzAwX0ZPUkNFX1BYCQkJKDE8PDI2KQorI2RlZmluZSBTQ0xLX0NOVExfX1IzMDBfRk9SQ0VfVFgJCQkoMTw8MjcpCisjZGVmaW5lIFNDTEtfQ05UTF9fUjMwMF9GT1JDRV9VUwkJCSgxPDwyOCkKKyNkZWZpbmUgU0NMS19DTlRMX19SMzAwX0ZPUkNFX1NVCQkJKDE8PDMwKQorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFT05fTUFTSwkJCQkweGZmZmY4MDAwTAorCisvKiBwbGxTQ0xLX0NOVEwyICovCisjZGVmaW5lIFNDTEtfQ05UTDJfX1IzMDBfVENMX01BWF9EWU5fU1RPUF9MQVQJCSgxPDwxMCkKKyNkZWZpbmUgU0NMS19DTlRMMl9fUjMwMF9HQV9NQVhfRFlOX1NUT1BfTEFUCQkoMTw8MTEpCisjZGVmaW5lIFNDTEtfQ05UTDJfX1IzMDBfQ0JBX01BWF9EWU5fU1RPUF9MQVQJCSgxPDwxMikKKyNkZWZpbmUgU0NMS19DTlRMMl9fUjMwMF9GT1JDRV9UQ0wJCQkoMTw8MTMpCisjZGVmaW5lIFNDTEtfQ05UTDJfX1IzMDBfRk9SQ0VfQ0JBCQkJKDE8PDE0KQorI2RlZmluZSBTQ0xLX0NOVEwyX19SMzAwX0ZPUkNFX0dBCQkJKDE8PDE1KQorCisvKiBTQ0xLX01PUkVfQ05UTCAqLworI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fRElTUFJFR1NfTUFYX0RZTl9TVE9QX0xBVAkweDAwMDAwMDAxTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fTUNfR1VJX01BWF9EWU5fU1RPUF9MQVQJCTB4MDAwMDAwMDJMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19NQ19IT1NUX01BWF9EWU5fU1RPUF9MQVQJMHgwMDAwMDAwNEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0ZPUkNFX0RJU1BSRUdTCQkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0ZPUkNFX01DX0dVSQkJCTB4MDAwMDAyMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19GT1JDRV9NQ19IT1NUCQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX1NUT1BfU0NMS19FTgkJCTB4MDAwMDEwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19TVE9QX1NDTEtfQQkJCTB4MDAwMDIwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19TVE9QX1NDTEtfQgkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19TVE9QX1NDTEtfQwkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19IQUxGX1NQRUVEX1NDTEsJCQkweDAwMDEwMDAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fSU9fQ0dfVk9MVEFHRV9EUk9QCQkweDAwMDIwMDAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fVFZGQl9TT0ZUX1JFU0VUCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX1ZPTFRBR0VfRFJPUF9TWU5DCQkweDAwMDgwMDAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fSURMRV9ERUxBWV9IQUxGX1NDTEsJCTB4MDA0MDAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19BR1BfQlVTWV9IQUxGX1NDTEsJCTB4MDA4MDAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19DR19TUEFSRV9SRF9DX01BU0sJCTB4ZmYwMDAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19GT1JDRU9OCQkJCTB4MDAwMDA3MDBMCisKKy8qIE1DTEtfQ05UTCAqLworI2RlZmluZSBNQ0xLX0NOVExfX01DTEtBX1NSQ19TRUxfTUFTSwkJCTB4MDAwMDAwMDdMCisjZGVmaW5lIE1DTEtfQ05UTF9fWUNMS0FfU1JDX1NFTF9NQVNLCQkJMHgwMDAwMDA3MEwKKyNkZWZpbmUgTUNMS19DTlRMX19NQ0xLQl9TUkNfU0VMX01BU0sJCQkweDAwMDAwNzAwTAorI2RlZmluZSBNQ0xLX0NOVExfX1lDTEtCX1NSQ19TRUxfTUFTSwkJCTB4MDAwMDcwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfTUNMS0FfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfTUNMS0EJCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQ0xLQl9NQVNLCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQ0xLQgkJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX1lDTEtBX01BU0sJCQkweDAwMDQwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX1lDTEtBCQkJCTB4MDAwNDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfWUNMS0JfTUFTSwkJCTB4MDAwODAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfWUNMS0IJCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQ19NQVNLCQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQwkJCQkweDAwMTAwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX0FJQ19NQVNLCQkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9BSUMJCQkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19NUkRDS0EwX1NPVVRTRUxfTUFTSwkJCTB4MDMwMDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fTVJEQ0tBMV9TT1VUU0VMX01BU0sJCQkweDBjMDAwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX01SRENLQjBfU09VVFNFTF9NQVNLCQkJMHgzMDAwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19NUkRDS0IxX1NPVVRTRUxfTUFTSwkJCTB4YzAwMDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fUjMwMF9ESVNBQkxFX01DX01DTEtBCQkoMSA8PCAyMSkKKyNkZWZpbmUgTUNMS19DTlRMX19SMzAwX0RJU0FCTEVfTUNfTUNMS0IJCSgxIDw8IDIxKQorCisvKiBNQ0xLX01JU0MgKi8KKyNkZWZpbmUgTUNMS19NSVNDX19TQ0xLX1NPVVJDRURfRlJPTV9NUExMX1NFTF9NQVNLCTB4MDAwMDAwMDNMCisjZGVmaW5lIE1DTEtfTUlTQ19fTUNMS19GUk9NX1NQTExfRElWX1NFTF9NQVNLCQkweDAwMDAwMDA0TAorI2RlZmluZSBNQ0xLX01JU0NfX01DTEtfRlJPTV9TUExMX0RJVl9TRUwJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1DTEtfTUlTQ19fRU5BQkxFX1NDTEtfRlJPTV9NUExMX01BU0sJCTB4MDAwMDAwMDhMCisjZGVmaW5lIE1DTEtfTUlTQ19fRU5BQkxFX1NDTEtfRlJPTV9NUExMCQkweDAwMDAwMDA4TAorI2RlZmluZSBNQ0xLX01JU0NfX01QTExfTU9ERUFfTU9ERUNfSFdfU0VMX0VOX01BU0sJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNMS19NSVNDX19NUExMX01PREVBX01PREVDX0hXX1NFTF9FTgkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNMS19NSVNDX19ETExfUkVBRFlfTEFUX01BU0sJCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0RMTF9SRUFEWV9MQVQJCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ0xLX01JU0NfX01DX01DTEtfTUFYX0RZTl9TVE9QX0xBVF9NQVNLCTB4MDAwMDEwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fTUNfTUNMS19NQVhfRFlOX1NUT1BfTEFUCQkweDAwMDAxMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0lPX01DTEtfTUFYX0RZTl9TVE9QX0xBVF9NQVNLCTB4MDAwMDIwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fSU9fTUNMS19NQVhfRFlOX1NUT1BfTEFUCQkweDAwMDAyMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX01DX01DTEtfRFlOX0VOQUJMRV9NQVNLCQkweDAwMDA0MDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX01DX01DTEtfRFlOX0VOQUJMRQkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fSU9fTUNMS19EWU5fRU5BQkxFX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fSU9fTUNMS19EWU5fRU5BQkxFCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19DR01fQ0xLX1RPX09VVFBJTl9NQVNLCQkweDAwMDEwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0NHTV9DTEtfVE9fT1VUUElOCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19DTEtfT1JfQ09VTlRfU0VMX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fQ0xLX09SX0NPVU5UX1NFTAkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fRU5fTUNMS19UUklTVEFURV9JTl9TVVNQRU5EX01BU0sJMHgwMDA0MDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19FTl9NQ0xLX1RSSVNUQVRFX0lOX1NVU1BFTkQJCTB4MDAwNDAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fQ0dNX1NQQVJFX1JEX01BU0sJCQkweDAwMzAwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0NHTV9TUEFSRV9BX1JEX01BU0sJCQkweDAwYzAwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX1RDTEtfVE9fWUNMS0JfRU5fTUFTSwkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19UQ0xLX1RPX1lDTEtCX0VOCQkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19DR01fU1BBUkVfQV9NQVNLCQkJMHgwZTAwMDAwMEwKKworLyogVkNMS19FQ1BfQ05UTCAqLworI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19WQ0xLX1NSQ19TRUxfTUFTSwkJMHgwMDAwMDAwM0wKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fVkNMS19JTlZFUlQJCQkweDAwMDAwMDEwTAorI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19QSVhDTEtfU1JDX0lOVkVSVAkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fUElYQ0xLX0FMV0FZU19PTmIJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFZDTEtfRUNQX0NOVExfX1BJWENMS19EQUNfQUxXQVlTX09OYgkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fRUNQX0RJVl9NQVNLCQkJMHgwMDAwMDMwMEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fRUNQX0ZPUkNFX09OCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fU1VCQ0xLX0ZPUkNFX09OCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fUjMwMF9ESVNQX0RBQ19QSVhDTEtfREFDX0JMQU5LX09GRiAgKDE8PDIzKQorCisvKiBQTExfUFdSTUdUX0NOVEwgKi8KKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19NUExMX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19NUExMX1RVUk5PRkYJCQkweDAwMDAwMDAxTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NQTExfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NQTExfVFVSTk9GRgkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUFBMTF9UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMDRMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUFBMTF9UVVJOT0ZGCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19QMlBMTF9UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMDhMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUDJQTExfVFVSTk9GRgkJCTB4MDAwMDAwMDhMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fVFZQTExfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDEwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1RWUExMX1RVUk5PRkYJCQkweDAwMDAwMDEwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0FHUENMS19EWU5fU1RPUF9MQVRfTUFTSwkweDAwMDAwMWUwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0FQTV9QT1dFUl9TVEFURV9NQVNLCQkweDAwMDAwNjAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0FQTV9QV1JTVEFURV9SRF9NQVNLCQkweDAwMDAxODAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1BNX01PREVfU0VMX01BU0sJCTB4MDAwMDIwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUE1fTU9ERV9TRUwJCQkweDAwMDAyMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0VOX1BXUlNFUV9ET05FX0NPTkRfTUFTSwkweDAwMDA0MDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0VOX1BXUlNFUV9ET05FX0NPTkQJCTB4MDAwMDQwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fRU5fRElTUF9QQVJLRURfQ09ORF9NQVNLCTB4MDAwMDgwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fRU5fRElTUF9QQVJLRURfQ09ORAkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19NT0JJTEVfU1VfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fTU9CSUxFX1NVCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19TVV9TQ0xLX1VTRV9CQ0xLX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fU1VfU0NMS19VU0VfQkNMSwkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19TVV9NQ0xLX1VTRV9CQ0xLX01BU0sJCTB4MDAwNDAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fU1VfTUNMS19VU0VfQkNMSwkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19TVV9TVVNUQUlOX0RJU0FCTEVfTUFTSwkweDAwMDgwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NVX1NVU1RBSU5fRElTQUJMRQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19UQ0xfQllQQVNTX0RJU0FCTEVfTUFTSwkweDAwMTAwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1RDTF9CWVBBU1NfRElTQUJMRQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19UQ0xfQ0xPQ0tfQ1RJVkVfUkRfTUFTSwkweDAwMjAwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1RDTF9DTE9DS19BQ1RJVkVfUkQJCTB4MDAyMDAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fQ0dfTk8yX0RFQlVHX01BU0sJCTB4ZmYwMDAwMDBMCisKKy8qIENMS19QV1JNR1RfQ05UTCAqLworI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01QTExfUFdSTUdUX09GRl9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01QTExfUFdSTUdUX09GRgkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19TUExMX1BXUk1HVF9PRkZfTUFTSwkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19TUExMX1BXUk1HVF9PRkYJCTB4MDAwMDAwMDJMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUFBMTF9QV1JNR1RfT0ZGX01BU0sJCTB4MDAwMDAwMDRMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUFBMTF9QV1JNR1RfT0ZGCQkweDAwMDAwMDA0TAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1AyUExMX1BXUk1HVF9PRkZfTUFTSwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QMlBMTF9QV1JNR1RfT0ZGCQkweDAwMDAwMDA4TAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DTEtfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDEwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DTEtfVFVSTk9GRgkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fU0NMS19UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMjBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fU0NMS19UVVJOT0ZGCQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QQ0xLX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QQ0xLX1RVUk5PRkYJCQkweDAwMDAwMDQwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1AyQ0xLX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QMkNMS19UVVJOT0ZGCQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19DSF9NT0RFX01BU0sJCTB4MDAwMDAxMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNfQ0hfTU9ERQkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fVEVTVF9NT0RFX01BU0sJCQkweDAwMDAwMjAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RFU1RfTU9ERQkJCTB4MDAwMDAyMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fR0xPQkFMX1BNQU5fRU5fTUFTSwkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19HTE9CQUxfUE1BTl9FTgkJCTB4MDAwMDA0MDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRU5HSU5FX0RZTkNMS19NT0RFX01BU0sJMHgwMDAwMTAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19FTkdJTkVfRFlOQ0xLX01PREUJCTB4MDAwMDEwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fQUNUSVZFX0hJTE9fTEFUX01BU0sJCTB4MDAwMDYwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRElTUF9EWU5fU1RPUF9MQVRfTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19ESVNQX0RZTl9TVE9QX0xBVAkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19CVVNZX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0JVU1kJCQkweDAwMDEwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0lOVF9DTlRMX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNfSU5UX0NOVEwJCQkweDAwMDIwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX1NXSVRDSF9NQVNLCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19TV0lUQ0gJCQkweDAwMDQwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RMTF9SRUFEWV9NQVNLCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19ETExfUkVBRFkJCQkweDAwMDgwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RJU1BfUE1fTUFTSwkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRElTUF9QTQkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRFlOX1NUT1BfTU9ERV9NQVNLCQkweDAwZTAwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0NHX05PMV9ERUJVR19NQVNLCQkweDNmMDAwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWUExMX1BXUk1HVF9PRkZfTUFTSwkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19UVlBMTF9QV1JNR1RfT0ZGCQkweDQwMDAwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWQ0xLX1RVUk5PRkZfTUFTSwkJMHg4MDAwMDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19UVkNMS19UVVJOT0ZGCQkJMHg4MDAwMDAwMEwKKworLyogQlVTX0NOVEwxICovCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0lPX0RJU0FCTEVfTUFTSwkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0lPX0RJU0FCTEUJCQkweDAwMDAwMDAxTAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9NRU1fRElTQUJMRV9NQVNLCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfTUVNX0RJU0FCTEUJCQkweDAwMDAwMDAyTAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9CTV9ESVNBQkxFX01BU0sJCQkweDAwMDAwMDA0TAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9CTV9ESVNBQkxFCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfSU5UX0RJU0FCTEVfTUFTSwkJCTB4MDAwMDAwMDhMCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0lOVF9ESVNBQkxFCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0lNTUVESUFURV9QTUlfRElTQUJMRV9NQVNLCTB4MDAwMDAwMjBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9JTU1FRElBVEVfUE1JX0RJU0FCTEUJCTB4MDAwMDAwMjBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9WR0FfUkVHX0NPSEVSRU5DWV9ESVNfTUFTSwkweDAwMDAwMTAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfVkdBX1JFR19DT0hFUkVOQ1lfRElTCQkweDAwMDAwMTAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfVkdBX01FTV9DT0hFUkVOQ1lfRElTX01BU0sJMHgwMDAwMDIwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX1ZHQV9NRU1fQ09IRVJFTkNZX0RJUwkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0hEUF9SRUdfQ09IRVJFTkNZX0RJU19NQVNLCTB4MDAwMDA0MDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9IRFBfUkVHX0NPSEVSRU5DWV9ESVMJCTB4MDAwMDA0MDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9HVUlfSU5JVElBVE9SX0NPSEVSRU5DWV9ESVNfTUFTSyAweDAwMDAwODAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfR1VJX0lOSVRJQVRPUl9DT0hFUkVOQ1lfRElTCTB4MDAwMDA4MDBMCisjZGVmaW5lIEJVU19DTlRMMV9fTU9CSUxFX1BMQVRGT1JNX1NFTF9NQVNLCQkweDBjMDAwMDAwTAorI2RlZmluZSBCVVNfQ05UTDFfX1NFTkRfU0JBX0xBVEVOQ1lfTUFTSwkJMHg3MDAwMDAwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19BR1BDTEtfVkFMSURfTUFTSwkJCTB4ODAwMDAwMDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQUdQQ0xLX1ZBTElECQkJCTB4ODAwMDAwMDBMCisKKy8qIEJVU19DTlRMMSAqLworI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9JT19ESVNBQkxFX19TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9NRU1fRElTQUJMRV9fU0hJRlQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfQk1fRElTQUJMRV9fU0hJRlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfSU5UX0RJU0FCTEVfX1NISUZUCQkweDAwMDAwMDAzCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9JTU1FRElBVEVfUE1JX0RJU0FCTEVfX1NISUZUCTB4MDAwMDAwMDUKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX1ZHQV9SRUdfQ09IRVJFTkNZX0RJU19fU0hJRlQJMHgwMDAwMDAwOAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfVkdBX01FTV9DT0hFUkVOQ1lfRElTX19TSElGVAkweDAwMDAwMDA5CisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9IRFBfUkVHX0NPSEVSRU5DWV9ESVNfX1NISUZUCTB4MDAwMDAwMGEKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0dVSV9JTklUSUFUT1JfQ09IRVJFTkNZX0RJU19fU0hJRlQgMHgwMDAwMDAwYgorI2RlZmluZSBCVVNfQ05UTDFfX01PQklMRV9QTEFURk9STV9TRUxfX1NISUZUCQkweDAwMDAwMDFhCisjZGVmaW5lIEJVU19DTlRMMV9fU0VORF9TQkFfTEFURU5DWV9fU0hJRlQJCTB4MDAwMDAwMWMKKyNkZWZpbmUgQlVTX0NOVEwxX19BR1BDTEtfVkFMSURfX1NISUZUCQkJMHgwMDAwMDAxZgorCisvKiBDUlRDX09GRlNFVF9DTlRMICovCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfVElMRV9MSU5FX01BU0sJCTB4MDAwMDAwMGZMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfVElMRV9MSU5FX1JJR0hUX01BU0sJMHgwMDAwMDBmMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19USUxFX0VOX1JJR0hUX01BU0sJMHgwMDAwNDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19USUxFX0VOX1JJR0hUCQkweDAwMDA0MDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1RJTEVfRU5fTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19USUxFX0VOCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMX01BU0sJMHgwMDAxMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMCQkweDAwMDEwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1NURVJFT19PRkZTRVRfRU5fTUFTSwkweDAwMDIwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1NURVJFT19PRkZTRVRfRU4JCTB4MDAwMjAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX1NZTkNfRU5fTUFTSwkweDAwMGMwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1NURVJFT19TWU5DX09VVF9FTl9NQVNLCTB4MDAxMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX1NZTkNfT1VUX0VOCTB4MDAxMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX1NZTkNfTUFTSwkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19TVEVSRU9fU1lOQwkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19HVUlfVFJJR19PRkZTRVRfTEVGVF9FTl9NQVNLIDB4MTAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfR1VJX1RSSUdfT0ZGU0VUX0xFRlRfRU4JMHgxMDAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19HVUlfVFJJR19PRkZTRVRfUklHSFRfRU5fTUFTSyAweDIwMDAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX0dVSV9UUklHX09GRlNFVF9SSUdIVF9FTgkweDIwMDAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX0dVSV9UUklHX09GRlNFVF9NQVNLCTB4NDAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfR1VJX1RSSUdfT0ZGU0VUCQkweDQwMDAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX09GRlNFVF9MT0NLX01BU0sJCTB4ODAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfT0ZGU0VUX0xPQ0sJCTB4ODAwMDAwMDBMCisKKy8qIENSVENfR0VOX0NOVEwgKi8KKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19EQkxfU0NBTl9FTl9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0RCTF9TQ0FOX0VOCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19JTlRFUkxBQ0VfRU5fTUFTSwkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19JTlRFUkxBQ0VfRU4JCTB4MDAwMDAwMDJMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfQ19TWU5DX0VOX01BU0sJCTB4MDAwMDAwMTBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfQ19TWU5DX0VOCQkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19QSVhfV0lEVEhfTUFTSwkJMHgwMDAwMGYwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19JQ09OX0VOX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfSUNPTl9FTgkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfQ1VSX0VOX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0NVUl9FTgkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfVlNUQVRfTU9ERV9NQVNLCQkweDAwMDYwMDAwTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0NVUl9NT0RFX01BU0sJCTB4MDA3MDAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfRVhUX0RJU1BfRU5fTUFTSwkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19FWFRfRElTUF9FTgkJCTB4MDEwMDAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfRU5fTUFTSwkJCTB4MDIwMDAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfRU4JCQkJMHgwMjAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19ESVNQX1JFUV9FTl9CX01BU0sJCTB4MDQwMDAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfRElTUF9SRVFfRU5fQgkJMHgwNDAwMDAwMEwKKworLyogQ1JUQzJfR0VOX0NOVEwgKi8KKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0RCTF9TQ0FOX0VOX01BU0sJCTB4MDAwMDAwMDFMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9EQkxfU0NBTl9FTgkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0lOVEVSTEFDRV9FTl9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSU5URVJMQUNFX0VOCQkweDAwMDAwMDAyTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfU1lOQ19UUklTVEFURV9NQVNLCTB4MDAwMDAwMTBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9TWU5DX1RSSVNUQVRFCQkweDAwMDAwMDEwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSFNZTkNfVFJJU1RBVEVfTUFTSwkweDAwMDAwMDIwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSFNZTkNfVFJJU1RBVEUJCTB4MDAwMDAwMjBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9WU1lOQ19UUklTVEFURV9NQVNLCTB4MDAwMDAwNDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9WU1lOQ19UUklTVEFURQkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVDJfT05fTUFTSwkJCTB4MDAwMDAwODBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlQyX09OCQkJCTB4MDAwMDAwODBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9QSVhfV0lEVEhfTUFTSwkJMHgwMDAwMGYwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0lDT05fRU5fTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0lDT05fRU4JCQkweDAwMDA4MDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfQ1VSX0VOX01BU0sJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9DVVJfRU4JCQkweDAwMDEwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfQ1VSX01PREVfTUFTSwkJMHgwMDcwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0RJU1BMQVlfRElTX01BU0sJCTB4MDA4MDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9ESVNQTEFZX0RJUwkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0VOX01BU0sJCQkweDAyMDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfRU4JCQkweDAyMDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfRElTUF9SRVFfRU5fQl9NQVNLCTB4MDQwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9ESVNQX1JFUV9FTl9CCQkweDA0MDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfQ19TWU5DX0VOX01BU0sJCTB4MDgwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9DX1NZTkNfRU4JCQkweDA4MDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSFNZTkNfRElTX01BU0sJCTB4MTAwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9IU1lOQ19ESVMJCQkweDEwMDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfVlNZTkNfRElTX01BU0sJCTB4MjAwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9WU1lOQ19ESVMJCQkweDIwMDAwMDAwTAorCisvKiBBR1BfQ05UTCAqLworI2RlZmluZSBBR1BfQ05UTF9fTUFYX0lETEVfQ0xLX01BU0sJCQkweDAwMDAwMGZmTAorI2RlZmluZSBBR1BfQ05UTF9fSE9MRF9SRF9GSUZPX01BU0sJCQkweDAwMDAwMTAwTAorI2RlZmluZSBBR1BfQ05UTF9fSE9MRF9SRF9GSUZPCQkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JRX0ZJRk9fTUFTSwkJCTB4MDAwMDAyMDBMCisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JRX0ZJRk8JCQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0VOXzJYX1NUQkJfTUFTSwkJCTB4MDAwMDA0MDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl8yWF9TVEJCCQkJCTB4MDAwMDA0MDBMCisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9GVUxMX1NCQV9NQVNLCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0ZVTExfU0JBCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1NCQV9ESVNfTUFTSwkJCQkweDAwMDAxMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fU0JBX0RJUwkJCQkweDAwMDAxMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fQUdQX1JFVl9JRF9NQVNLCQkJMHgwMDAwMjAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0FHUF9SRVZfSUQJCQkJMHgwMDAwMjAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1JFR19DUklQUExFX0FHUDRYX01BU0sJCTB4MDAwMDQwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19SRUdfQ1JJUFBMRV9BR1A0WAkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19SRUdfQ1JJUFBMRV9BR1AyWDRYX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19SRUdfQ1JJUFBMRV9BR1AyWDRYCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0lOVF9WUkVGX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfSU5UX1ZSRUYJCQkweDAwMDEwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fUEVORElOR19TTE9UU19WQUxfTUFTSwkJMHgwMDA2MDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1BFTkRJTkdfU0xPVFNfU0VMX01BU0sJCTB4MDAwODAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19QRU5ESU5HX1NMT1RTX1NFTAkJCTB4MDAwODAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl9FWFRFTkRFRF9BRF9TVEJfMlhfTUFTSwkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0VOX0VYVEVOREVEX0FEX1NUQl8yWAkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19ESVNfUVVFVUVEX0dOVF9GSVhfTUFTSwkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RJU19RVUVVRURfR05UX0ZJWAkJCTB4MDAyMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl9SREFUQTJYNFhfTVVMVElSRVNFVF9NQVNLCQkweDAwNDAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRU5fUkRBVEEyWDRYX01VTFRJUkVTRVQJCTB4MDA0MDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl9SQkZDQUxNX01BU0sJCQkweDAwODAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRU5fUkJGQ0FMTQkJCQkweDAwODAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfRVhUX1ZSRUZfTUFTSwkJCTB4MDEwMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9FWFRfVlJFRgkJCTB4MDEwMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19ESVNfUkJGX01BU0sJCQkJMHgwMjAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RJU19SQkYJCQkJMHgwMjAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RFTEFZX0ZJUlNUX1NCQV9FTl9NQVNLCQkweDA0MDAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fREVMQVlfRklSU1RfU0JBX0VOCQkJMHgwNDAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RFTEFZX0ZJUlNUX1NCQV9WQUxfTUFTSwkJMHgzODAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0FHUF9NSVNDX01BU0sJCQkJMHhjMDAwMDAwMEwKKworLyogQUdQX0NOVEwgKi8KKyNkZWZpbmUgQUdQX0NOVExfX01BWF9JRExFX0NMS19fU0hJRlQJCQkweDAwMDAwMDAwCisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JEX0ZJRk9fX1NISUZUCQkJMHgwMDAwMDAwOAorI2RlZmluZSBBR1BfQ05UTF9fSE9MRF9SUV9GSUZPX19TSElGVAkJCTB4MDAwMDAwMDkKKyNkZWZpbmUgQUdQX0NOVExfX0VOXzJYX1NUQkJfX1NISUZUCQkJMHgwMDAwMDAwYQorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfRlVMTF9TQkFfX1NISUZUCQkJMHgwMDAwMDAwYgorI2RlZmluZSBBR1BfQ05UTF9fU0JBX0RJU19fU0hJRlQJCQkweDAwMDAwMDBjCisjZGVmaW5lIEFHUF9DTlRMX19BR1BfUkVWX0lEX19TSElGVAkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgQUdQX0NOVExfX1JFR19DUklQUExFX0FHUDRYX19TSElGVAkJMHgwMDAwMDAwZQorI2RlZmluZSBBR1BfQ05UTF9fUkVHX0NSSVBQTEVfQUdQMlg0WF9fU0hJRlQJCTB4MDAwMDAwMGYKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0lOVF9WUkVGX19TSElGVAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQUdQX0NOVExfX1BFTkRJTkdfU0xPVFNfVkFMX19TSElGVAkJMHgwMDAwMDAxMQorI2RlZmluZSBBR1BfQ05UTF9fUEVORElOR19TTE9UU19TRUxfX1NISUZUCQkweDAwMDAwMDEzCisjZGVmaW5lIEFHUF9DTlRMX19FTl9FWFRFTkRFRF9BRF9TVEJfMlhfX1NISUZUCQkweDAwMDAwMDE0CisjZGVmaW5lIEFHUF9DTlRMX19ESVNfUVVFVUVEX0dOVF9GSVhfX1NISUZUCQkweDAwMDAwMDE1CisjZGVmaW5lIEFHUF9DTlRMX19FTl9SREFUQTJYNFhfTVVMVElSRVNFVF9fU0hJRlQJMHgwMDAwMDAxNgorI2RlZmluZSBBR1BfQ05UTF9fRU5fUkJGQ0FMTV9fU0hJRlQJCQkweDAwMDAwMDE3CisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9FWFRfVlJFRl9fU0hJRlQJCQkweDAwMDAwMDE4CisjZGVmaW5lIEFHUF9DTlRMX19ESVNfUkJGX19TSElGVAkJCTB4MDAwMDAwMTkKKyNkZWZpbmUgQUdQX0NOVExfX0RFTEFZX0ZJUlNUX1NCQV9FTl9fU0hJRlQJCTB4MDAwMDAwMWEKKyNkZWZpbmUgQUdQX0NOVExfX0RFTEFZX0ZJUlNUX1NCQV9WQUxfX1NISUZUCQkweDAwMDAwMDFiCisjZGVmaW5lIEFHUF9DTlRMX19BR1BfTUlTQ19fU0hJRlQJCQkweDAwMDAwMDFlCisKKy8qIERJU1BfTUlTQ19DTlRMICovCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0dSUEhfUFBfTUFTSwkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfR1JQSF9QUAkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfU1VCUElDX1BQX01BU0sJMHgwMDAwMDAwMkwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfU1VCUElDX1BQCQkweDAwMDAwMDAyTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9PVjBfUFBfTUFTSwkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfT1YwX1BQCQkweDAwMDAwMDA0TAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIX1NDTEtfTUFTSwkweDAwMDAwMDEwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIX1NDTEsJCTB4MDAwMDAwMTBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX1NVQlBJQ19TQ0xLX01BU0sJMHgwMDAwMDAyMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfU1VCUElDX1NDTEsJCTB4MDAwMDAwMjBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX09WMF9TQ0xLX01BU0sJMHgwMDAwMDA0MEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfT1YwX1NDTEsJCTB4MDAwMDAwNDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TWU5DX1NUUkVOR1RIX01BU0sJCTB4MDAwMDAzMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TWU5DX1BBRF9GTE9QX0VOX01BU0sJCTB4MDAwMDA0MDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TWU5DX1BBRF9GTE9QX0VOCQkweDAwMDAwNDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIMl9QUF9NQVNLCTB4MDAwMDEwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0dSUEgyX1BQCQkweDAwMDAxMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIMl9TQ0xLX01BU0sJMHgwMDAwODAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfR1JQSDJfU0NMSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfTFZEU19NQVNLCQkweDAwMDEwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9MVkRTCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfVE1EU19NQVNLCQkweDAwMDIwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9UTURTCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfRElHX1RNRFNfTUFTSwkweDAwMDQwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9ESUdfVE1EUwkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfVFZfTUFTSwkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfVFYJCQkweDAwMDgwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fUEFMRVRURTJfTUVNX1JEX01BUkdJTl9NQVNLCTB4MDBmMDAwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19QQUxFVFRFX01FTV9SRF9NQVJHSU5fTUFTSwkweDBmMDAwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fUk1YX0JVRl9NRU1fUkRfTUFSR0lOX01BU0sJMHhmMDAwMDAwMEwKKworLyogRElTUF9QV1JfTUFOICovCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9QV1JfTUFOX0QzX0NSVENfRU5fTUFTSwkweDAwMDAwMDAxTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfUFdSX01BTl9EM19DUlRDX0VOCQkweDAwMDAwMDAxTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1AyX1BXUl9NQU5fRDNfQ1JUQzJfRU5fTUFTSwkweDAwMDAwMDEwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1AyX1BXUl9NQU5fRDNfQ1JUQzJfRU4JCTB4MDAwMDAwMTBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9QV1JfTUFOX0RQTVNfTUFTSwkJMHgwMDAwMDMwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX1JTVF9NQVNLCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX1JTVAkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19SRUdfUlNUX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19SRUdfUlNUCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX0dSUEhfUlNUX01BU0sJCTB4MDAwNDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19HUlBIX1JTVAkJCTB4MDAwNDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19TVUJQSUNfUlNUX01BU0sJCTB4MDAwODAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19TVUJQSUNfUlNUCQkweDAwMDgwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDNfT1YwX1JTVF9NQVNLCQkweDAwMTAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDNfT1YwX1JTVAkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX0dSUEhfUlNUX01BU0sJCTB4MDAyMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX0dSUEhfUlNUCQkweDAwMjAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDFEMl9TVUJQSUNfUlNUX01BU0sJCTB4MDA0MDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX1NVQlBJQ19SU1QJCTB4MDA0MDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX09WMF9SU1RfTUFTSwkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QxRDJfT1YwX1JTVAkJCTB4MDA4MDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElHX1RNRFNfRU5BQkxFX1JTVF9NQVNLCQkweDAxMDAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJR19UTURTX0VOQUJMRV9SU1QJCTB4MDEwMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fVFZfRU5BQkxFX1JTVF9NQVNLCQkweDAyMDAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX1RWX0VOQUJMRV9SU1QJCQkweDAyMDAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0FVVE9fUFdSVVBfRU5fTUFTSwkJMHgwNDAwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19BVVRPX1BXUlVQX0VOCQkJMHgwNDAwMDAwMEwKKworLyogTUNfSU5EX0lOREVYICovCisjZGVmaW5lIE1DX0lORF9JTkRFWF9fTUNfSU5EX0FERFJfTUFTSwkJCTB4MDAwMDAwMWZMCisjZGVmaW5lIE1DX0lORF9JTkRFWF9fTUNfSU5EX1dSX0VOX01BU0sJCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ19JTkRfSU5ERVhfX01DX0lORF9XUl9FTgkJCTB4MDAwMDAxMDBMCisKKy8qIE1DX0lORF9EQVRBICovCisjZGVmaW5lIE1DX0lORF9EQVRBX19NQ19JTkRfREFUQV9NQVNLCQkJMHhmZmZmZmZmZkwKKworLyogTUNfQ0hQX0lPX0NOVExfQTEgKi8KKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9DS0FfX1NISUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fQUFfX1NISUZUCQkweDAwMDAwMDAxCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fRFFNQV9fU0hJRlQJMHgwMDAwMDAwMgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0RRU0FfX1NISUZUCTB4MDAwMDAwMDMKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9DS0FfX1NISUZUCQkweDAwMDAwMDA0CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfQUFfX1NISUZUCQkweDAwMDAwMDA1CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFNQV9fU0hJRlQJMHgwMDAwMDAwNgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0RRU0FfX1NISUZUCTB4MDAwMDAwMDcKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfQUFfX1NISUZUCQkweDAwMDAwMDA4CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0RRTUFfX1NISUZUCTB4MDAwMDAwMDkKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfRFFTQV9fU0hJRlQJMHgwMDAwMDAwYQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX0lPX01PREVBX19TSElGVAkJMHgwMDAwMDAwYworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19DS0FfX1NISUZUCQkweDAwMDAwMDBlCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUkVDX0FBX19TSElGVAkJMHgwMDAwMDAxMAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19EUU1BX19TSElGVAkJMHgwMDAwMDAxMgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19EUVNBX19TSElGVAkJMHgwMDAwMDAxNAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NZTkNfUEhBU0VBX19TSElGVAkweDAwMDAwMDE2CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU1lOQ19DRU5URVJBX19TSElGVAkweDAwMDAwMDE3CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU1lOQ19FTkFfX1NISUZUCQkweDAwMDAwMDE4CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ0xLX1NFTEFfX1NISUZUCQkweDAwMDAwMDFhCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ0xLX0lOVkFfX1NISUZUCQkweDAwMDAwMDFjCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fREFUQV9FTklNUF9BX19TSElGVAkweDAwMDAwMDFlCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ05UTF9FTklNUF9BX19TSElGVAkweDAwMDAwMDFmCisKKy8qIE1DX0NIUF9JT19DTlRMX0IxICovCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQ0tCX19TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0FCX19TSElGVAkJMHgwMDAwMDAwMQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRTUJfX1NISUZUCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9EUVNCX19TSElGVAkweDAwMDAwMDAzCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfQ0tCX19TSElGVAkJMHgwMDAwMDAwNAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0FCX19TSElGVAkJMHgwMDAwMDAwNQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0RRTUJfX1NISUZUCTB4MDAwMDAwMDYKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9EUVNCX19TSElGVAkweDAwMDAwMDA3CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUFJFQU1QX0FCX19TSElGVAkJMHgwMDAwMDAwOAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1BSRUFNUF9EUU1CX19TSElGVAkweDAwMDAwMDA5CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUFJFQU1QX0RRU0JfX1NISUZUCTB4MDAwMDAwMGEKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9JT19NT0RFQl9fU0hJRlQJCTB4MDAwMDAwMGMKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9SRUNfQ0tCX19TSElGVAkJMHgwMDAwMDAwZQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19BQl9fU0hJRlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9SRUNfRFFNQl9fU0hJRlQJCTB4MDAwMDAwMTIKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9SRUNfRFFTQl9fU0hJRlQJCTB4MDAwMDAwMTQKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TWU5DX1BIQVNFQl9fU0hJRlQJMHgwMDAwMDAxNgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfQ0VOVEVSQl9fU0hJRlQJMHgwMDAwMDAxNworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfRU5CX19TSElGVAkJMHgwMDAwMDAxOAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NMS19TRUxCX19TSElGVAkJMHgwMDAwMDAxYQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NMS19JTlZCX19TSElGVAkJMHgwMDAwMDAxYworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0RBVEFfRU5JTVBfQl9fU0hJRlQJMHgwMDAwMDAxZQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NOVExfRU5JTVBfQl9fU0hJRlQJMHgwMDAwMDAxZgorCisvKiBNQ19DSFBfSU9fQ05UTF9BMSAqLworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0NLQV9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0NLQQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9BQV9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0FBCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9EUU1BX01BU0sJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fRFFNQQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9EUVNBX01BU0sJCTB4MDAwMDAwMDhMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fRFFTQQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9DS0FfTUFTSwkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9DS0EJCTB4MDAwMDAwMTBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfQUFfTUFTSwkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9BQQkJCTB4MDAwMDAwMjBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFNQV9NQVNLCQkweDAwMDAwMDQwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0RRTUEJCTB4MDAwMDAwNDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFTQV9NQVNLCQkweDAwMDAwMDgwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0RRU0EJCTB4MDAwMDAwODBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0FBX01BU0sJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0FBCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1BSRUFNUF9EUU1BX01BU0sJCTB4MDAwMDAyMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0RRTUEJCTB4MDAwMDAyMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0RRU0FfTUFTSwkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfRFFTQQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9JT19NT0RFQV9NQVNLCQkweDAwMDAzMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19DS0FfTUFTSwkJMHgwMDAwYzAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9SRUNfQUFfTUFTSwkJMHgwMDAzMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9SRUNfRFFNQV9NQVNLCQkweDAwMGMwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19EUVNBX01BU0sJCTB4MDAzMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU1lOQ19QSEFTRUFfTUFTSwkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX1BIQVNFQQkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX0NFTlRFUkFfTUFTSwkweDAwODAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NZTkNfQ0VOVEVSQQkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX0VOQV9NQVNLCQkweDAzMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX0NMS19TRUxBX01BU0sJCTB4MGMwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ0xLX0lOVkFfTUFTSwkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTEtfSU5WQQkJCTB4MTAwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fREFUQV9FTklNUF9BX01BU0sJMHg0MDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9EQVRBX0VOSU1QX0EJCTB4NDAwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ05UTF9FTklNUF9BX01BU0sJMHg4MDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTlRMX0VOSU1QX0EJCTB4ODAwMDAwMDBMCisKKy8qIE1DX0NIUF9JT19DTlRMX0IxICovCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQ0tCX01BU0sJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQ0tCCQkweDAwMDAwMDAxTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0FCX01BU0sJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQUIJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRTUJfTUFTSwkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9EUU1CCQkweDAwMDAwMDA0TAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRU0JfTUFTSwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9EUVNCCQkweDAwMDAwMDA4TAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0NLQl9NQVNLCQkweDAwMDAwMDEwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0NLQgkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9BQl9NQVNLCQkweDAwMDAwMDIwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0FCCQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9EUU1CX01BU0sJCTB4MDAwMDAwNDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfRFFNQgkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9EUVNCX01BU0sJCTB4MDAwMDAwODBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfRFFTQgkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfQUJfTUFTSwkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfQUIJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUFJFQU1QX0RRTUJfTUFTSwkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfRFFNQgkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfRFFTQl9NQVNLCQkweDAwMDAwNDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1BSRUFNUF9EUVNCCQkweDAwMDAwNDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0lPX01PREVCX01BU0sJCTB4MDAwMDMwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUkVDX0NLQl9NQVNLCQkweDAwMDBjMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19BQl9NQVNLCQkweDAwMDMwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19EUU1CX01BU0sJCTB4MDAwYzAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUkVDX0RRU0JfTUFTSwkJMHgwMDMwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TWU5DX1BIQVNFQl9NQVNLCQkweDAwNDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfUEhBU0VCCQkweDAwNDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfQ0VOVEVSQl9NQVNLCTB4MDA4MDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU1lOQ19DRU5URVJCCQkweDAwODAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfRU5CX01BU0sJCTB4MDMwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fQ0xLX1NFTEJfTUFTSwkJMHgwYzAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9DTEtfSU5WQl9NQVNLCQkweDEwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NMS19JTlZCCQkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9EQVRBX0VOSU1QX0JfTUFTSwkweDQwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0RBVEFfRU5JTVBfQgkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9DTlRMX0VOSU1QX0JfTUFTSwkweDgwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NOVExfRU5JTVBfQgkJMHg4MDAwMDAwMEwKKworLyogTUVNX1NEUkFNX01PREVfUkVHICovCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX01PREVfUkVHX01BU0sJCTB4MDAwMDdmZmZMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1dSX0xBVEVOQ1lfTUFTSwkJMHgwMDBmMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fQ0FTX0xBVEVOQ1lfTUFTSwkweDAwNzAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DTURfTEFURU5DWV9NQVNLCTB4MDA4MDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0NNRF9MQVRFTkNZCQkweDAwODAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9TVFJfTEFURU5DWV9NQVNLCTB4MDEwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1NUUl9MQVRFTkNZCQkweDAxMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9DTURfTUFTSwkweDAyMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9DTUQJCTB4MDIwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX0RBVEFfTUFTSwkweDA0MDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9EQVRBCQkweDA0MDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9TVFJfTUFTSwkweDA4MDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9TVFIJCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUNfSU5JVF9DT01QTEVURV9NQVNLCTB4MTAwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUNfSU5JVF9DT01QTEVURQkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fRERSX0RMTF9NQVNLCQkweDIwMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9ERFJfRExMCQkJMHgyMDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fQ0ZHX1RZUEVfTUFTSwkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fQ0ZHX1RZUEUJCTB4NDAwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1NEUkFNX1JFU0VUX01BU0sJMHg4MDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fU0RSQU1fUkVTRVQJCTB4ODAwMDAwMDBMCisKKy8qIE1FTV9TRFJBTV9NT0RFX1JFRyAqLworI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9NT0RFX1JFR19fU0hJRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fV1JfTEFURU5DWV9fU0hJRlQJMHgwMDAwMDAxMAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DQVNfTEFURU5DWV9fU0hJRlQJMHgwMDAwMDAxNAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DTURfTEFURU5DWV9fU0hJRlQJMHgwMDAwMDAxNworI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9TVFJfTEFURU5DWV9fU0hJRlQJMHgwMDAwMDAxOAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9DTURfX1NISUZUCTB4MDAwMDAwMTkKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fRkFMTF9PVVRfREFUQV9fU0hJRlQJMHgwMDAwMDAxYQorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9TVFJfX1NISUZUCTB4MDAwMDAwMWIKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NQ19JTklUX0NPTVBMRVRFX19TSElGVAkweDAwMDAwMDFjCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0REUl9ETExfX1NISUZUCQkweDAwMDAwMDFkCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0NGR19UWVBFX19TSElGVAkJMHgwMDAwMDAxZQorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9TRFJBTV9SRVNFVF9fU0hJRlQJMHgwMDAwMDAxZgorCisvKiBNRU1fUkVGUkVTSF9DTlRMICovCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9SRUZSRVNIX1JBVEVfTUFTSwkJMHgwMDAwMDBmZkwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX1JFRlJFU0hfRElTX01BU0sJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9SRUZSRVNIX0RJUwkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0RZTkFNSUNfQ0tFX01BU0sJCTB4MDAwMDAyMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9EWU5BTUlDX0NLRQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX1RSRkNfTUFTSwkJCTB4MDAwMGYwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBMF9FTkFCTEVfTUFTSwkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0EwX0VOQUJMRQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0EwYl9FTkFCTEVfTUFTSwkweDAwMDIwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTBiX0VOQUJMRQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0ExX0VOQUJMRV9NQVNLCQkweDAwMDQwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTFfRU5BQkxFCQkweDAwMDQwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTFiX0VOQUJMRV9NQVNLCTB4MDAwODAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBMWJfRU5BQkxFCQkweDAwMDgwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQUZCX0VOQUJMRV9NQVNLCTB4MDAxMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBRkJfRU5BQkxFCQkweDAwMTAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19ETExfRkJfU0xDVF9DS0FfTUFTSwkJMHgwMGMwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0IwX0VOQUJMRV9NQVNLCQkweDAxMDAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQjBfRU5BQkxFCQkweDAxMDAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQjBiX0VOQUJMRV9NQVNLCTB4MDIwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMGJfRU5BQkxFCQkweDAyMDAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQjFfRU5BQkxFX01BU0sJCTB4MDQwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMV9FTkFCTEUJCTB4MDQwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMWJfRU5BQkxFX01BU0sJMHgwODAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0IxYl9FTkFCTEUJCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCRkJfRU5BQkxFX01BU0sJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0JGQl9FTkFCTEUJCTB4MTAwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX0RMTF9GQl9TTENUX0NLQl9NQVNLCQkweGMwMDAwMDAwTAorCisvKiBNQ19TVEFUVVMgKi8KKyNkZWZpbmUgTUNfU1RBVFVTX19NRU1fUFdSVVBfQ09NUExfQV9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBNQ19TVEFUVVNfX01FTV9QV1JVUF9DT01QTF9BCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTUNfU1RBVFVTX19NRU1fUFdSVVBfQ09NUExfQl9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBNQ19TVEFUVVNfX01FTV9QV1JVUF9DT01QTF9CCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTUNfU1RBVFVTX19NQ19JRExFX01BU0sJCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNfU1RBVFVTX19NQ19JRExFCQkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1DX1NUQVRVU19fSU1QX05fVkFMVUVfUl9CQUNLX01BU0sJCTB4MDAwMDAwNzhMCisjZGVmaW5lIE1DX1NUQVRVU19fSU1QX1BfVkFMVUVfUl9CQUNLX01BU0sJCTB4MDAwMDA3ODBMCisjZGVmaW5lIE1DX1NUQVRVU19fVEVTVF9PVVRfUl9CQUNLX01BU0sJCQkweDAwMDAwODAwTAorI2RlZmluZSBNQ19TVEFUVVNfX1RFU1RfT1VUX1JfQkFDSwkJCTB4MDAwMDA4MDBMCisjZGVmaW5lIE1DX1NUQVRVU19fRFVNTVlfT1VUX1JfQkFDS19NQVNLCQkweDAwMDAxMDAwTAorI2RlZmluZSBNQ19TVEFUVVNfX0RVTU1ZX09VVF9SX0JBQ0sJCQkweDAwMDAxMDAwTAorI2RlZmluZSBNQ19TVEFUVVNfX0lNUF9OX1ZBTFVFX0FfUl9CQUNLX01BU0sJCTB4MDAwMWUwMDBMCisjZGVmaW5lIE1DX1NUQVRVU19fSU1QX1BfVkFMVUVfQV9SX0JBQ0tfTUFTSwkJMHgwMDFlMDAwMEwKKyNkZWZpbmUgTUNfU1RBVFVTX19JTVBfTl9WQUxVRV9DS19SX0JBQ0tfTUFTSwkJMHgwMWUwMDAwMEwKKyNkZWZpbmUgTUNfU1RBVFVTX19JTVBfUF9WQUxVRV9DS19SX0JBQ0tfTUFTSwkJMHgxZTAwMDAwMEwKKworLyogTURMTF9DS08gKi8KKyNkZWZpbmUgTURMTF9DS09fX01DS09BX1NMRUVQX01BU0sJCQkweDAwMDAwMDAxTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfU0xFRVAJCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX1JFU0VUX01BU0sJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfUkVTRVQJCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX1JBTkdFX01BU0sJCQkweDAwMDAwMDBjTAorI2RlZmluZSBNRExMX0NLT19fRVJTVEFfU09VVFNFTF9NQVNLCQkJMHgwMDAwMDAzMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX0ZCX1NFTF9NQVNLCQkJMHgwMDAwMDBjMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX1JFRl9TS0VXX01BU0sJCQkweDAwMDAwNzAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfRkJfU0tFV19NQVNLCQkJMHgwMDAwNzAwMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX0JQX1NFTF9NQVNLCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX0JQX1NFTAkJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfU0xFRVBfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9TTEVFUAkJCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfUkVTRVRfTUFTSwkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9SRVNFVAkJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfUkFOR0VfTUFTSwkJCTB4MDAwYzAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19FUlNUQl9TT1VUU0VMX01BU0sJCQkweDAwMzAwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfRkJfU0VMX01BU0sJCQkweDAwYzAwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfUkVGX1NLRVdfTUFTSwkJCTB4MDcwMDAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9GQl9TS0VXX01BU0sJCQkweDcwMDAwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfQlBfU0VMX01BU0sJCQkweDgwMDAwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfQlBfU0VMCQkJCTB4ODAwMDAwMDBMCisKKy8qIE1ETExfUkRDS0EgKi8KKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9TTEVFUF9NQVNLCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9TTEVFUAkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfUkVTRVRfTUFTSwkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfUkVTRVQJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX1JBTkdFX01BU0sJCQkweDAwMDAwMDBjTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX1JFRl9TRUxfTUFTSwkJMHgwMDAwMDAzMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9GQl9TRUxfTUFTSwkJCTB4MDAwMDAwYzBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfUkVGX1NLRVdfTUFTSwkJMHgwMDAwMDcwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9TSU5TRUxfTUFTSwkJCTB4MDAwMDA4MDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfU0lOU0VMCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9GQl9TS0VXX01BU0sJCTB4MDAwMDcwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfQlBfU0VMX01BU0sJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX0JQX1NFTAkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfU0xFRVBfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfU0xFRVAJCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1JFU0VUX01BU0sJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1JFU0VUCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9SQU5HRV9NQVNLCQkJMHgwMDBjMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9SRUZfU0VMX01BU0sJCTB4MDAzMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfRkJfU0VMX01BU0sJCQkweDAwYzAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1JFRl9TS0VXX01BU0sJCTB4MDcwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfU0lOU0VMX01BU0sJCQkweDA4MDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1NJTlNFTAkJCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfRkJfU0tFV19NQVNLCQkweDcwMDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX0JQX1NFTF9NQVNLCQkJMHg4MDAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9CUF9TRUwJCQkweDgwMDAwMDAwTAorCisvKiBNRExMX1JEQ0tCICovCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfU0xFRVBfTUFTSwkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfU0xFRVAJCQkweDAwMDAwMDAxTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1JFU0VUX01BU0sJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1JFU0VUCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9SQU5HRV9NQVNLCQkJMHgwMDAwMDAwY0wKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9SRUZfU0VMX01BU0sJCTB4MDAwMDAwMzBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfRkJfU0VMX01BU0sJCQkweDAwMDAwMGMwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1JFRl9TS0VXX01BU0sJCTB4MDAwMDA3MDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfU0lOU0VMX01BU0sJCQkweDAwMDAwODAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1NJTlNFTAkJCTB4MDAwMDA4MDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfRkJfU0tFV19NQVNLCQkweDAwMDA3MDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX0JQX1NFTF9NQVNLCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9CUF9TRUwJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1NMRUVQX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1NMRUVQCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9SRVNFVF9NQVNLCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9SRVNFVAkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfUkFOR0VfTUFTSwkJCTB4MDAwYzAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfUkVGX1NFTF9NQVNLCQkweDAwMzAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX0ZCX1NFTF9NQVNLCQkJMHgwMGMwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9SRUZfU0tFV19NQVNLCQkweDA3MDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1NJTlNFTF9NQVNLCQkJMHgwODAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9TSU5TRUwJCQkweDA4MDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX0ZCX1NLRVdfTUFTSwkJMHg3MDAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9CUF9TRUxfTUFTSwkJCTB4ODAwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfQlBfU0VMCQkJMHg4MDAwMDAwMEwKKworI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tBX1NMRUVQCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTURMTF9SMzAwX1JEQ0tfX01SRENLQV9SRVNFVAkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1ETExfUjMwMF9SRENLX19NUkRDS0JfU0xFRVAJCQkweDAwMDAwMDA0TAorI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tCX1JFU0VUCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgTURMTF9SMzAwX1JEQ0tfX01SRENLQ19TTEVFUAkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIE1ETExfUjMwMF9SRENLX19NUkRDS0NfUkVTRVQJCQkweDAwMDAwMDIwTAorI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tEX1NMRUVQCQkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgTURMTF9SMzAwX1JEQ0tfX01SRENLRF9SRVNFVAkJCTB4MDAwMDAwODBMCisKKyNkZWZpbmUgcGxsQ0xLX1BJTl9DTlRMCQkJCTB4MDAwMQorI2RlZmluZSBwbGxQUExMX0NOVEwJCQkJMHgwMDAyCisjZGVmaW5lIHBsbFBQTExfUkVGX0RJVgkJCQkweDAwMDMKKyNkZWZpbmUgcGxsUFBMTF9ESVZfMAkJCQkweDAwMDQKKyNkZWZpbmUgcGxsUFBMTF9ESVZfMQkJCQkweDAwMDUKKyNkZWZpbmUgcGxsUFBMTF9ESVZfMgkJCQkweDAwMDYKKyNkZWZpbmUgcGxsUFBMTF9ESVZfMwkJCQkweDAwMDcKKyNkZWZpbmUgcGxsVkNMS19FQ1BfQ05UTAkJCTB4MDAwOAorI2RlZmluZSBwbGxIVE9UQUxfQ05UTAkJCQkweDAwMDkKKyNkZWZpbmUgcGxsTV9TUExMX1JFRl9GQl9ESVYJCQkweDAwMEEKKyNkZWZpbmUgcGxsQUdQX1BMTF9DTlRMCQkJCTB4MDAwQgorI2RlZmluZSBwbGxTUExMX0NOVEwJCQkJMHgwMDBDCisjZGVmaW5lIHBsbFNDTEtfQ05UTAkJCQkweDAwMEQKKyNkZWZpbmUgcGxsTVBMTF9DTlRMCQkJCTB4MDAwRQorI2RlZmluZSBwbGxNRExMX0NLTwkJCQkweDAwMEYKKyNkZWZpbmUgcGxsTURMTF9SRENLQQkJCQkweDAwMTAKKyNkZWZpbmUgcGxsTURMTF9SRENLQgkJCQkweDAwMTEKKyNkZWZpbmUgcGxsTUNMS19DTlRMCQkJCTB4MDAxMgorI2RlZmluZSBwbGxQTExfVEVTVF9DTlRMCQkJMHgwMDEzCisjZGVmaW5lIHBsbENMS19QV1JNR1RfQ05UTAkJCTB4MDAxNAorI2RlZmluZSBwbGxQTExfUFdSTUdUX0NOVEwJCQkweDAwMTUKKyNkZWZpbmUgcGxsQ0dfVEVTVF9NQUNST19SV19XUklURQkJMHgwMDE2CisjZGVmaW5lIHBsbENHX1RFU1RfTUFDUk9fUldfUkVBRAkJMHgwMDE3CisjZGVmaW5lIHBsbENHX1RFU1RfTUFDUk9fUldfREFUQQkJMHgwMDE4CisjZGVmaW5lIHBsbENHX1RFU1RfTUFDUk9fUldfQ05UTAkJMHgwMDE5CisjZGVmaW5lIHBsbERJU1BfVEVTVF9NQUNST19SV19XUklURQkJMHgwMDFBCisjZGVmaW5lIHBsbERJU1BfVEVTVF9NQUNST19SV19SRUFECQkweDAwMUIKKyNkZWZpbmUgcGxsRElTUF9URVNUX01BQ1JPX1JXX0RBVEEJCTB4MDAxQworI2RlZmluZSBwbGxESVNQX1RFU1RfTUFDUk9fUldfQ05UTAkJMHgwMDFECisjZGVmaW5lIHBsbFNDTEtfQ05UTDIJCQkJMHgwMDFFCisjZGVmaW5lIHBsbE1DTEtfTUlTQwkJCQkweDAwMUYKKyNkZWZpbmUgcGxsVFZfUExMX0ZJTkVfQ05UTAkJCTB4MDAyMAorI2RlZmluZSBwbGxUVl9QTExfQ05UTAkJCQkweDAwMjEKKyNkZWZpbmUgcGxsVFZfUExMX0NOVEwxCQkJCTB4MDAyMgorI2RlZmluZSBwbGxUVl9EVE9fSU5DUkVNRU5UUwkJCTB4MDAyMworI2RlZmluZSBwbGxTUExMX0FVWF9DTlRMCQkJMHgwMDI0CisjZGVmaW5lIHBsbE1QTExfQVVYX0NOVEwJCQkweDAwMjUKKyNkZWZpbmUgcGxsUDJQTExfQ05UTAkJCQkweDAwMkEKKyNkZWZpbmUgcGxsUDJQTExfUkVGX0RJVgkJCTB4MDAyQgorI2RlZmluZSBwbGxQMlBMTF9ESVZfMAkJCQkweDAwMkMKKyNkZWZpbmUgcGxsUElYQ0xLU19DTlRMCQkJCTB4MDAyRAorI2RlZmluZSBwbGxIVE9UQUwyX0NOVEwJCQkJMHgwMDJFCisjZGVmaW5lIHBsbFNTUExMX0NOVEwJCQkJMHgwMDMwCisjZGVmaW5lIHBsbFNTUExMX1JFRl9ESVYJCQkweDAwMzEKKyNkZWZpbmUgcGxsU1NQTExfRElWXzAJCQkJMHgwMDMyCisjZGVmaW5lIHBsbFNTX0lOVF9DTlRMCQkJCTB4MDAzMworI2RlZmluZSBwbGxTU19UU1RfQ05UTAkJCQkweDAwMzQKKyNkZWZpbmUgcGxsU0NMS19NT1JFX0NOVEwJCQkweDAwMzUKKworI2RlZmluZSBpeE1DX1BFUkZfQ05UTAkJCQkweDAwMDAKKyNkZWZpbmUgaXhNQ19QRVJGX1NFTAkJCQkweDAwMDEKKyNkZWZpbmUgaXhNQ19QRVJGX1JFR0lPTl8wCQkJMHgwMDAyCisjZGVmaW5lIGl4TUNfUEVSRl9SRUdJT05fMQkJCTB4MDAwMworI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfMAkJCTB4MDAwNAorI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfMQkJCTB4MDAwNQorI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfMgkJCTB4MDAwNgorI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfMwkJCTB4MDAwNworI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfTUVNQ0hfQQkJCTB4MDAwOAorI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfTUVNQ0hfQgkJCTB4MDAwOQorI2RlZmluZSBpeE1DX0lNUF9DTlRMCQkJCTB4MDAwQQorI2RlZmluZSBpeE1DX0NIUF9JT19DTlRMX0EwCQkJMHgwMDBCCisjZGVmaW5lIGl4TUNfQ0hQX0lPX0NOVExfQTEJCQkweDAwMEMKKyNkZWZpbmUgaXhNQ19DSFBfSU9fQ05UTF9CMAkJCTB4MDAwRAorI2RlZmluZSBpeE1DX0NIUF9JT19DTlRMX0IxCQkJMHgwMDBFCisjZGVmaW5lIGl4TUNfSU1QX0NOVExfMAkJCQkweDAwMEYKKyNkZWZpbmUgaXhUQ19NSVNNQVRDSF8xCQkJCTB4MDAxMAorI2RlZmluZSBpeFRDX01JU01BVENIXzIJCQkJMHgwMDExCisjZGVmaW5lIGl4TUNfQklTVF9DVFJMCQkJCTB4MDAxMgorI2RlZmluZSBpeFJFR19DT0xMQVJfV1JJVEUJCQkweDAwMTMKKyNkZWZpbmUgaXhSRUdfQ09MTEFSX1JFQUQJCQkweDAwMTQKKyNkZWZpbmUgaXhSMzAwX01DX0lNUF9DTlRMCQkJMHgwMDE4CisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9BMAkJMHgwMDE5CisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9BMQkJMHgwMDFhCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9CMAkJMHgwMDFiCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9CMQkJMHgwMDFjCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9DMAkJMHgwMDFkCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9DMQkJMHgwMDFlCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9EMAkJMHgwMDFmCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9EMQkJMHgwMDIwCisjZGVmaW5lIGl4UjMwMF9NQ19JTVBfQ05UTF8wCQkJMHgwMDIxCisjZGVmaW5lIGl4UjMwMF9NQ19FTFBJREFfQ05UTAkJCTB4MDAyMgorI2RlZmluZSBpeFIzMDBfTUNfQ0hQX0lPX09FX0NOVExfQ0QJCTB4MDAyMworI2RlZmluZSBpeFIzMDBfTUNfUkVBRF9DTlRMX0NECQkJMHgwMDI0CisjZGVmaW5lIGl4UjMwMF9NQ19NQ19JTklUX1dSX0xBVF9USU1FUgkJMHgwMDI1CisjZGVmaW5lIGl4UjMwMF9NQ19ERUJVR19DTlRMCQkJMHgwMDI2CisjZGVmaW5lIGl4UjMwMF9NQ19CSVNUX0NOVExfMAkJCTB4MDAyOAorI2RlZmluZSBpeFIzMDBfTUNfQklTVF9DTlRMXzEJCQkweDAwMjkKKyNkZWZpbmUgaXhSMzAwX01DX0JJU1RfQ05UTF8yCQkJMHgwMDJhCisjZGVmaW5lIGl4UjMwMF9NQ19CSVNUX0NOVExfMwkJCTB4MDAyYgorI2RlZmluZSBpeFIzMDBfTUNfQklTVF9DTlRMXzQJCQkweDAwMmMKKyNkZWZpbmUgaXhSMzAwX01DX0JJU1RfQ05UTF81CQkJMHgwMDJkCisjZGVmaW5lIGl4UjMwMF9NQ19JTVBfU1RBVFVTCQkJMHgwMDJlCisjZGVmaW5lIGl4UjMwMF9NQ19ETExfQ05UTAkJCTB4MDAyZgorI2RlZmluZSBOQl9UT00JCQkJCTB4MTVDCisKKyNlbmRpZgkvKiBfUkFERU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2hhMS5oIGIvaW5jbHVkZS9zaGExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlYTEzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2hhMS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKioKKyAqIFxmaWxlIHNoYTEuaAorICogYmFzZWQgZnJvbSBodHRwOi8veHlzc2wub3JnL2NvZGUvc291cmNlL3NoYTEvCisgKiAgRklQUy0xODAtMSBjb21wbGlhbnQgU0hBLTEgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSwgdmVyc2lvbiAyLjEgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqICBNQQkwMjExMC0xMzAxICBVU0EKKyAqLworLyoKKyAqICBUaGUgU0hBLTEgc3RhbmRhcmQgd2FzIHB1Ymxpc2hlZCBieSBOSVNUIGluIDE5OTMuCisgKgorICogIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2ZpcHNwdWJzL2ZpcDE4MC0xLmh0bQorICovCisjaWZuZGVmIF9TSEExX0gKKyNkZWZpbmUgX1NIQTFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU0hBMV9TVU1fUE9TCS0weDIwCisjZGVmaW5lIFNIQTFfU1VNX0xFTgkyMAorCisvKioKKyAqIFxicmllZgkgICBTSEEtMSBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxbMl07CS8qITwgbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZAkqLworICAgIHVuc2lnbmVkIGxvbmcgc3RhdGVbNV07CS8qITwgaW50ZXJtZWRpYXRlIGRpZ2VzdCBzdGF0ZQkqLworICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XTsJLyohPCBkYXRhIGJsb2NrIGJlaW5nIHByb2Nlc3NlZCAqLworfQorc2hhMV9jb250ZXh0OworCisvKioKKyAqIFxicmllZgkgICBTSEEtMSBjb250ZXh0IHNldHVwCisgKgorICogXHBhcmFtIGN0eAkgICBTSEEtMSBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKi8KK3ZvaWQgc2hhMV9zdGFydHMoIHNoYTFfY29udGV4dCAqY3R4ICk7CisKKy8qKgorICogXGJyaWVmCSAgIFNIQS0xIHByb2Nlc3MgYnVmZmVyCisgKgorICogXHBhcmFtIGN0eAkgICBTSEEtMSBjb250ZXh0CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbgkgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqLwordm9pZCBzaGExX3VwZGF0ZSggc2hhMV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApOworCisvKioKKyAqIFxicmllZgkgICBTSEEtMSBmaW5hbCBkaWdlc3QKKyAqCisgKiBccGFyYW0gY3R4CSAgIFNIQS0xIGNvbnRleHQKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGExX2ZpbmlzaCggc2hhMV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSApOworCisvKioKKyAqIFxicmllZgkgICBPdXRwdXQgPSBTSEEtMSggaW5wdXQgYnVmZmVyICkKKyAqCisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbgkgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGExX2NzdW0oIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwKKwkJdW5zaWduZWQgY2hhciBvdXRwdXRbMjBdICk7CisKKy8qKgorICogXGJyaWVmCSAgIE91dHB1dCA9IFNIQS0xKCBmaWxlIGNvbnRlbnRzICkKKyAqCisgKiBccGFyYW0gcGF0aAkgICBpbnB1dCBmaWxlIG5hbWUKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBjaGVja3N1bSByZXN1bHQKKyAqIFxyZXR1cm4JICAgMCBpZiBzdWNjZXNzZnVsLCBvciAxIGlmIGZvcGVuIGZhaWxlZAorICovCitpbnQgc2hhMV9maWxlKCBjaGFyICpwYXRoLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0gKTsKKworLyoqCisgKiBcYnJpZWYJICAgT3V0cHV0ID0gSE1BQy1TSEEtMSggaW5wdXQgYnVmZmVyLCBobWFjIGtleSApCisgKgorICogXHBhcmFtIGtleQkgICBITUFDIHNlY3JldCBrZXkKKyAqIFxwYXJhbSBrZXlsZW4gICBsZW5ndGggb2YgdGhlIEhNQUMga2V5CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbgkgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBITUFDLVNIQS0xIHJlc3VsdAorICovCit2b2lkIHNoYTFfaG1hYyggdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLAorCQl1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisJCXVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSApOworCisvKioKKyAqIFxicmllZgkgICBDaGVja3VwIHJvdXRpbmUKKyAqCisgKiBccmV0dXJuCSAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBpZiB0aGUgdGVzdCBmYWlsZWQKKyAqLworaW50IHNoYTFfc2VsZl90ZXN0KCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBzaGExLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3BhcnRhbjMuaCBiL2luY2x1ZGUvc3BhcnRhbjMuaAppbmRleCBiMTRkYjAzLi42NWEzZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NwYXJ0YW4zLmgKKysrIGIvaW5jbHVkZS9zcGFydGFuMy5oCkBAIC03Myw2ICs3MywxMyBAQAogI2RlZmluZSBYSUxJTlhfWEMzUzQwMDBfU0laRSAJMTEzMTY4NjQvOAogI2RlZmluZSBYSUxJTlhfWEMzUzUwMDBfU0laRSAJMTMyNzE5MzYvOAogCisvKiBTcGFydGFuLTNFICh2My40KSAqLworI2RlZmluZQlYSUxJTlhfWEMzUzEwMEVfU0laRQk1ODEzNDQvOAorI2RlZmluZQlYSUxJTlhfWEMzUzI1MEVfU0laRQkxMzUzNzI4LzgKKyNkZWZpbmUJWElMSU5YX1hDM1M1MDBFX1NJWkUJMjI3MDIwOC84CisjZGVmaW5lCVhJTElOWF9YQzNTMTIwMEVfU0laRQkzODQxMTg0LzgKKyNkZWZpbmUJWElMSU5YX1hDM1MxNjAwRV9TSVpFCTU5Njk2OTYvOAorCiAvKiBEZXNjcmlwdG9yIE1hY3JvcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNwYXJ0YW4tSUkgZGV2aWNlcyAqLwpAQCAtMTAwLDQgKzEwNywyMSBAQAogI2RlZmluZSBYSUxJTlhfWEMzUzUwMDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAogeyBYaWxpbnhfU3BhcnRhbjMsIGlmYWNlLCBYSUxJTlhfWEMzUzUwMDBFX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQogCisKKy8qIFNwYXJ0YW4tM0UgZGV2aWNlcyAqLworI2RlZmluZSBYSUxJTlhfWEMzUzEwMEVfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfU3BhcnRhbjMsIGlmYWNlLCBYSUxJTlhfWEMzUzEwMEVfU0laRSwgZm5fdGFibGUsIGNvb2tpZSB9CisKKyNkZWZpbmUgWElMSU5YX1hDM1MyNTBFX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4zLCBpZmFjZSwgWElMSU5YX1hDM1MyNTBFX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCisjZGVmaW5lIFhJTElOWF9YQzNTNTAwRV9ERVNDKGlmYWNlLCBmbl90YWJsZSwgY29va2llKSBcCit7IFhpbGlueF9TcGFydGFuMywgaWZhY2UsIFhJTElOWF9YQzNTNTAwRV9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMzUzEyMDBFX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4zLCBpZmFjZSwgWElMSU5YX1hDM1MxMjAwRV9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMzUzE2MDBFX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4zLCBpZmFjZSwgWElMSU5YX1hDM1MxNjAwRV9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKwogI2VuZGlmIC8qIF9TUEFSVEFOM19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGF0dXNfbGVkLmggYi9pbmNsdWRlL3N0YXR1c19sZWQuaAppbmRleCA3MWEyMDJmLi5hNjQ2ODE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0YXR1c19sZWQuaAorKysgYi9pbmNsdWRlL3N0YXR1c19sZWQuaApAQCAtMzY3LDYgKzM2NywxMyBAQAogCiAjZGVmaW5lIFNUQVRVU19MRURfQk9PVAkJMAkvKiBMRUQgMCB1c2VkIGZvciBib290IHN0YXR1cyAqLwogCisjZWxpZiBkZWZpbmVkKENPTkZJR19CT0FSRF9TUEVDSUZJQ19MRUQpCisvKiBsZWRfaWRfdCBpcyB1bnNpZ25lZCBsb25nIG1hc2sgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsZWRfaWRfdDsKKworZXh0ZXJuIHZvaWQgX19sZWRfdG9nZ2xlIChsZWRfaWRfdCBtYXNrKTsKK2V4dGVybiB2b2lkIF9fbGVkX2luaXQgKGxlZF9pZF90IG1hc2ssIGludCBzdGF0ZSk7CitleHRlcm4gdm9pZCBfX2xlZF9zZXQgKGxlZF9pZF90IG1hc2ssIGludCBzdGF0ZSk7CiAjZWxzZQogIyBlcnJvciBTdGF0dXMgTEVEIGNvbmZpZ3VyYXRpb24gbWlzc2luZwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYi5oIGIvaW5jbHVkZS91c2IuaAppbmRleCBiZjcxNTU0Li40ZTE1MzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VzYi5oCisrKyBiL2luY2x1ZGUvdXNiLmgKQEAgLTE2OSw3ICsxNjksMTAgQEAKICAqIHRoaXMgaXMgaG93IHRoZSBsb3dsZXZlbCBwYXJ0IGNvbW11bmljYXRlIHdpdGggdGhlIG91dGVyIHdvcmxkCiAgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9VSENJKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgfHwgZGVmaW5lZCAoQ09ORklHX1VTQl9TTDgxMUhTKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9VSENJKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgfHwgZGVmaW5lZCAoQ09ORklHX1VTQl9TTDgxMUhTKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVVNCX0lTUDExNlhfSENEKQorCiBpbnQgdXNiX2xvd2xldmVsX2luaXQodm9pZCk7CiBpbnQgdXNiX2xvd2xldmVsX3N0b3Aodm9pZCk7CiBpbnQgc3VibWl0X2J1bGtfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLGludCB0cmFuc2Zlcl9sZW4pOwpAQCAtMTc3LDYgKzE4MCw3IEBACiAJCQlpbnQgdHJhbnNmZXJfbGVuLHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCk7CiBpbnQgc3VibWl0X2ludF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCiAJCQlpbnQgdHJhbnNmZXJfbGVuLCBpbnQgaW50ZXJ2YWwpOwordm9pZCB1c2JfZXZlbnRfcG9sbCh2b2lkKTsKIAogLyogRGVmaW5lcyAqLwogI2RlZmluZSBVU0JfVUhDSV9WRU5EX0lEIDB4ODA4NgpAQCAtMjMwLDE2ICsyMzQsMTIgQEAKIAogLyogYmlnIGVuZGlhbiAtPiBsaXR0bGUgZW5kaWFuIGNvbnZlcnNpb24gKi8KIC8qIHNvbWUgQ1BVcyBhcmUgYWxyZWFkeSBsaXR0bGUgZW5kaWFuIGUuZy4gdGhlIEFSTTkyMFQgKi8KLSNpZmRlZiBMSVRUTEVFTkRJQU4KLSNkZWZpbmUgc3dhcF8xNih4KSAoKHVuc2lnbmVkIHNob3J0KSh4KSkKLSNkZWZpbmUgc3dhcF8zMih4KSAoKHVuc2lnbmVkIGxvbmcpKHgpKQotI2Vsc2UKLSNkZWZpbmUgc3dhcF8xNih4KSBcCisjZGVmaW5lIF9fc3dhcF8xNih4KSBcCiAJKHsgdW5zaWduZWQgc2hvcnQgeF8gPSAodW5zaWduZWQgc2hvcnQpeDsgXAogCSAodW5zaWduZWQgc2hvcnQpKCBcCiAJCSgoeF8gJiAweDAwRkZVKSA8PCA4KSB8ICgoeF8gJiAweEZGMDBVKSA+PiA4KSApOyBcCiAJfSkKLSNkZWZpbmUgc3dhcF8zMih4KSBcCisjZGVmaW5lIF9fc3dhcF8zMih4KSBcCiAJKHsgdW5zaWduZWQgbG9uZyB4XyA9ICh1bnNpZ25lZCBsb25nKXg7IFwKIAkgKHVuc2lnbmVkIGxvbmcpKCBcCiAJCSgoeF8gJiAweDAwMDAwMEZGVUwpIDw8IDI0KSB8IFwKQEAgLTI0Nyw2ICsyNDcsMTMgQEAKIAkJKCh4XyAmIDB4MDBGRjAwMDBVTCkgPj4JIDgpIHwgXAogCQkoKHhfICYgMHhGRjAwMDAwMFVMKSA+PiAyNCkgKTsgXAogCX0pCisKKyNpZmRlZiBMSVRUTEVFTkRJQU4KKyMgZGVmaW5lIHN3YXBfMTYoeCkgKHgpCisjIGRlZmluZSBzd2FwXzMyKHgpICh4KQorI2Vsc2UKKyMgZGVmaW5lIHN3YXBfMTYoeCkgX19zd2FwXzE2KHgpCisjIGRlZmluZSBzd2FwXzMyKHgpIF9fc3dhcF8zMih4KQogI2VuZGlmIC8qIExJVFRMRUVORElBTiAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91c2JfY2RjX2FjbS5oIGIvaW5jbHVkZS91c2JfY2RjX2FjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmY1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VzYl9jZGNfYWNtLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogQnJ5YW4gTydEb25vZ2h1ZSwgZGVja2FyZEBjb2RlaGVybWl0LmllLCBDb2RlSGVybWl0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKy8qIEFDTSBDb250cm9sIFJlcXVlc3RzICovCisjZGVmaW5lIEFDTV9TRU5EX0VOQ0FQU1VMQVRFRF9DT01NQU5ECTB4MDAKKyNkZWZpbmUgQUNNX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UJMHgwMQorI2RlZmluZSBBQ01fU0VUX0NPTU1fRkVBVFVSRQkJMHgwMgorI2RlZmluZSBBQ01fR0VUX0NPTU1fRkVBVFJVRQkJMHgwMworI2RlZmluZSBBQ01fQ0xFQVJfQ09NTV9GRUFUVVJFCQkweDA0CisjZGVmaW5lIEFDTV9TRVRfTElORV9FTkNPRElORwkJMHgyMAorI2RlZmluZSBBQ01fR0VUX0xJTkVfRU5DT0RJTkcJCTB4MjEKKyNkZWZpbmUgQUNNX1NFVF9DT05UUk9MX0xJTkVfU1RBVEUJMHgyMgorI2RlZmluZSBBQ01fU0VORF9CUkVBSwkJCTB4MjMKKworLyogQUNNIE5vdGlmaWNhdGlvbiBDb2RlcyAqLworI2RlZmluZSBBQ01fTkVUV09SS19DT05ORUNUSU9OCQkweDAwCisjZGVmaW5lIEFDTV9SRVNQT05TRV9BVkFJTEFCTEUJCTB4MDEKKyNkZWZpbmUgQUNNX1NFUklBTF9TVEFURQkJMHgyMAorCisvKiBGb3JtYXQgb2YgcmVzcG9uc2UgZXhwZWN0ZWQgYnkgYSBBQ01fR0VUX0xJTkVfRU5DT0RJTkcgcmVxdWVzdCAqLworc3RydWN0IHJzMjMyX2VtdXsKKwkJdW5zaWduZWQgbG9uZyBkdGVyOworCQl1bnNpZ25lZCBjaGFyIHN0b3BfYml0czsKKwkJdW5zaWduZWQgY2hhciBwYXJpdHk7CisJCXVuc2lnbmVkIGNoYXIgZGF0YV9iaXRzOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91c2JkY29yZS5oIGIvaW5jbHVkZS91c2JkY29yZS5oCmluZGV4IDZlOTJkZjEuLmNiMmJlNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXNiZGNvcmUuaAorKysgYi9pbmNsdWRlL3VzYmRjb3JlLmgKQEAgLTU3Niw2ICs1NzYsOSBAQAogCiAJdm9pZCAoKmV2ZW50KSAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwgdXNiX2RldmljZV9ldmVudF90IGV2ZW50LCBpbnQgZGF0YSk7CiAKKwkvKiBEbyBjZGMgZGV2aWNlIHNwZWNpZmljIGNvbnRyb2wgcmVxdWVzdHMgKi8KKwlpbnQgKCpjZGNfcmVjdl9zZXR1cCkoc3RydWN0IHVzYl9kZXZpY2VfcmVxdWVzdCAqcmVxdWVzdCwgc3RydWN0IHVyYiAqdXJiKTsKKwogCS8qIGJ1cyBpbnRlcmZhY2UgKi8KIAlzdHJ1Y3QgdXNiX2J1c19pbnN0YW5jZSAqYnVzOwkvKiB3aGljaCBidXMgaW50ZXJmYWNlIGRyaXZlciAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYmRjb3JlX21wYzh4eC5oIGIvaW5jbHVkZS91c2JkY29yZV9tcGM4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGY2MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91c2JkY29yZV9tcGM4eHguaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBCcnlhbiBPJ0Rvbm9naHVlLCBDb2RlSGVybWl0CisgKiBib2Rvbm9naHVlQGNvZGVoZXJtaXQuaWUKKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKworLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBVU01PRF9FTgkweDAxCisjZGVmaW5lIFVTTU9EX0hPU1QJMHgwMgorI2RlZmluZSBVU01PRF9URVNUCTB4MDQKKyNkZWZpbmUgVVNNT0RfU0ZURQkweDA4CisjZGVmaW5lIFVTTU9EX1JFU1VNRQkweDQwCisjZGVmaW5lIFVTTU9EX0xTUwkweDgwCisKKy8qIEVuZHBvaW50IFJlZ2lzdGVycyAqLworI2RlZmluZSBVU0VQX1JIU19OT1JNCTB4MDAKKyNkZWZpbmUgVVNFUF9SSFNfSUdOT1JFCTB4MDEKKyNkZWZpbmUgVVNFUF9SSFNfTkFLCTB4MDIKKyNkZWZpbmUgVVNFUF9SSFNfU1RBTEwJMHgwMworCisjZGVmaW5lIFVTRVBfVEhTX05PUk0JMHgwMAorI2RlZmluZSBVU0VQX1RIU19JR05PUkUJMHgwNAorI2RlZmluZSBVU0VQX1RIU19OQUsJMHgwOAorI2RlZmluZSBVU0VQX1RIU19TVEFMTAkweDBDCisKKyNkZWZpbmUgVVNFUF9SVEUJMHgxMAorI2RlZmluZSBVU0VQX01GCQkweDIwCisKKyNkZWZpbmUgVVNFUF9UTV9DT05UUk9MCTB4MDAKKyNkZWZpbmUgVVNFUF9UTV9JTlQJMHgxMDAKKyNkZWZpbmUgVVNFUF9UTV9CVUxLCTB4MjAwCisjZGVmaW5lIFVTRVBfVE1fSVNPCTB4MzAwCisKKy8qIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVVNDT01fRVAwCTB4MDAKKyNkZWZpbmUgVVNDT01fRVAxCTB4MDEKKyNkZWZpbmUgVVNDT01fRVAyCTB4MDIKKyNkZWZpbmUgVVNDT01fRVAzCTB4MDMKKworI2RlZmluZSBVU0NPTV9GTFVTSAkweDQwCisjZGVmaW5lIFVTQ09NX1NUUgkweDgwCisKKy8qIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFVTQl9FX1JYQgkweDAwMDEKKyNkZWZpbmUgVVNCX0VfVFhCCTB4MDAwMgorI2RlZmluZSBVU0JfRV9CU1kJMHgwMDA0CisjZGVmaW5lIFVTQl9FX1NPRgkweDAwMDgKKyNkZWZpbmUgVVNCX0VfVFhFMQkweDAwMTAKKyNkZWZpbmUgVVNCX0VfVFhFMgkweDAwMjAKKyNkZWZpbmUgVVNCX0VfVFhFMwkweDAwNDAKKyNkZWZpbmUgVVNCX0VfVFhFNAkweDAwODAKKyNkZWZpbmUgVVNCX1RYX0VSUk1BU0sgKFVTQl9FX1RYRTF8VVNCX0VfVFhFMnxVU0JfRV9UWEUzfFVTQl9FX1RYRTQpCisjZGVmaW5lIFVTQl9FX0lETEUJMHgwMTAwCisjZGVmaW5lIFVTQl9FX1JFU0VUCTB4MDIwMAorCisvKiBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFVTQlNfSURMRQkweDAxCisKKy8qIFJYIEJ1ZmZlciBEZXNjcmlwdG9yICovCisjZGVmaW5lIFJYX0JEX09WCTB4MDIKKyNkZWZpbmUgUlhfQkRfQ1IJMHgwNAorI2RlZmluZSBSWF9CRF9BQgkweDA4CisjZGVmaW5lIFJYX0JEX05PCTB4MTAKKyNkZWZpbmUgUlhfQkRfUElEX0RBVEEwCTB4MDAKKyNkZWZpbmUgUlhfQkRfUElEX0RBVEExCTB4NDAKKyNkZWZpbmUgUlhfQkRfUElEX1NFVFVQCTB4ODAKKyNkZWZpbmUgUlhfQkRfRgkJMHg0MDAKKyNkZWZpbmUgUlhfQkRfTAkJMHg4MDAKKyNkZWZpbmUgUlhfQkRfSQkJMHgxMDAwCisjZGVmaW5lIFJYX0JEX1cJCTB4MjAwMAorI2RlZmluZSBSWF9CRF9FCQkweDgwMDAKKworLyogVXNlZnVsIG1hc2tzICovCisjZGVmaW5lIFJYX0JEX1BJRF9CSVRNQVNLIChSWF9CRF9QSURfREFUQTEgfCBSWF9CRF9QSURfU0VUVVApCisjZGVmaW5lIFNUQUxMX0JJVE1BU0sgKFVTRVBfVEhTX1NUQUxMIHwgVVNFUF9SSFNfU1RBTEwpCisjZGVmaW5lIE5BS19CSVRNQVNLIChVU0VQX1RIU19OQUsgfCBVU0VQX1JIU19OQUspCisjZGVmaW5lIENCRF9UWF9CSVRNQVNLIChUWF9CRF9SIHwgVFhfQkRfTCB8IFRYX0JEX1RDIHwgVFhfQkRfSSB8IFRYX0JEX0NORikKKworLyogVFggQnVmZmVyIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVFhfQkRfVU4JMHgwMgorI2RlZmluZSBUWF9CRF9UTwkweDA0CisjZGVmaW5lIFRYX0JEX05PX1BJRAkweDAwCisjZGVmaW5lIFRYX0JEX1BJRF9EQVRBMAkweDgwCisjZGVmaW5lIFRYX0JEX1BJRF9EQVRBMQkweEMwCisjZGVmaW5lIFRYX0JEX0NORgkweDIwMAorI2RlZmluZSBUWF9CRF9UQwkweDQwMAorI2RlZmluZSBUWF9CRF9MCQkweDgwMAorI2RlZmluZSBUWF9CRF9JCQkweDEwMDAKKyNkZWZpbmUgVFhfQkRfVwkJMHgyMDAwCisjZGVmaW5lIFRYX0JEX1IJCTB4ODAwMAorCisvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBkZWZpbmVzICovCisKKyNkZWZpbmUgRVBfTUlOX1BBQ0tFVF9TSVpFIDB4MDgKKyNkZWZpbmUgTUFYX0VORFBPSU5UUwkweDA0CisjZGVmaW5lIEZJRk9fU0laRQkweDEwCisjZGVmaW5lIEVQX01BWF9QS1QJRklGT19TSVpFCisjZGVmaW5lIFRYX1JJTkdfU0laRQkweDA0CisjZGVmaW5lIFJYX1JJTkdfU0laRQkweDA2CisjZGVmaW5lIFVTQl9NQVhfUEtUCTB4NDAKKyNkZWZpbmUgVE9HR0xFX1RYX1BJRCh4KSB4PSAoKH54KSYweDQwKXwweDgwCisjZGVmaW5lIFRPR0dMRV9SWF9QSUQoeCkgeF49IDB4NDAKKyNkZWZpbmUgRVBfQVRUQUNIRUQJMHgwMQkvKiBFbmRwb2ludCBoYXMgYSB1cmIgYXR0YWNoZWQgb3Igbm90ICovCisjZGVmaW5lIEVQX1NFTkRfWkxQCTB4MDIJLyogU2VuZCBaTFAgeS9uID8gKi8KKworI2RlZmluZSBQUk9GRl9VU0IJMHgwMDAwMDAwMAorI2RlZmluZSBDUE1fVVNCX0JBU0UJMHgwMDAwMEEwMAorCisvKiBVREMgZGV2aWNlIGRlZmluZXMgKi8KKyNkZWZpbmUgRVAwX01BWF9QQUNLRVRfU0laRQlFUF9NQVhfUEtUCisjZGVmaW5lIFVEQ19PVVRfRU5EUE9JTlQJMHgwMgorI2RlZmluZSBVRENfT1VUX1BBQ0tFVF9TSVpFCUVQX01JTl9QQUNLRVRfU0laRQorI2RlZmluZSBVRENfSU5fRU5EUE9JTlQJCTB4MDMKKyNkZWZpbmUgVURDX0lOX1BBQ0tFVF9TSVpFCUVQX01JTl9QQUNLRVRfU0laRQorI2RlZmluZSBVRENfSU5UX0VORFBPSU5UCTB4MDEKKyNkZWZpbmUgVURDX0lOVF9QQUNLRVRfU0laRQlVRENfSU5fUEFDS0VUX1NJWkUKKyNkZWZpbmUgVURDX0JVTEtfUEFDS0VUX1NJWkUJRVBfTUlOX1BBQ0tFVF9TSVpFCisKK3N0cnVjdCBtcGM4eHhfZXAgeworCXN0cnVjdCB1cmIgKiB1cmI7CisJdW5zaWduZWQgY2hhciBwaWQ7CisJdW5zaWduZWQgY2hhciBzYzsKKwl2b2xhdGlsZSBjYmRfdCAqIHByeDsKK307CisKK3R5cGVkZWYgc3RydWN0IG1wYzh4eF91c2J7CisJY2hhciB1c21vZDsJLyogTW9kZSBSZWdpc3RlciAqLworCWNoYXIgdXNhZGRyOwkvKiBTbGF2ZSBBZGRyZXNzIFJlZ2lzdGVyICovCisJY2hhciB1c2NvbTsJLyogQ29tbWFuZCBSZWdpc3RlciAqLworCWNoYXIgcmVzMTsJLyogUmVzZXJ2ZWQgKi8KKwl1c2hvcnQgdXNlcFs0XTsKKwl1bG9uZyByZXMyOwkvKiBSZXNlcnZlZCAqLworCXVzaG9ydCB1c2JlcjsJLyogRXZlbnQgUmVnaXN0ZXIgKi8KKwl1c2hvcnQgcmVzMzsJLyogUmVzZXJ2ZWQgKi8KKwl1c2hvcnQgdXNibXI7CS8qIE1hc2sgUmVnaXN0ZXIgKi8KKwljaGFyIHJlczQ7CS8qIFJlc2VydmVkICovCisJY2hhciB1c2JzOwkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKwljaGFyIHJlczVbOF07CS8qIFJlc2VydmVkICovCit9dXNiX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1wYzh4eF9wYXJhbWV0ZXJfcmFteworCXVzaG9ydCBlcDBwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMCAqLworCXVzaG9ydCBlcDFwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMSAqLworCXVzaG9ydCBlcDJwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMiAqLworCXVzaG9ydCBlcDNwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMyAqLworCXVpbnQgcnN0YXRlOwkvKiBSZWNlaXZlIHN0YXRlICovCisJdWludCBycHRyOwkvKiBSZWNlaXZlIGludGVybmFsIGRhdGEgcG9pbnRlciAqLworCXVzaG9ydCBmcmFtZV9uOwkvKiBGcmFtZSBudW1iZXIgKi8KKwl1c2hvcnQgcmJjbnQ7CS8qIFJlY2VpdmUgYnl0ZSBjb3VudCAqLworCXVpbnQgcnRlbXA7CS8qIFJlY2VpdmUgdGVtcCBjcCB1c2Ugb25seSAqLworCXVpbnQgcnh1c2I7CS8qIFJ4IERhdGEgVGVtcCAqLworCXVzaG9ydCByeHVwdHI7CS8qIFJ4IG1pY3JvY29kZSByZXR1cm4gYWRkcmVzcyB0ZW1wICovCit9dXNiX3ByYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZW5kcG9pbnRfcGFyYW1ldGVyX2Jsb2NrX3BvaW50ZXJ7CisJdXNob3J0IHJiYXNlOwkvKiBSeEJEIGJhc2UgYWRkcmVzcyAqLworCXVzaG9ydCB0YmFzZTsJLyogVHhCRCBiYXNlIGFkZHJlc3MgKi8KKwljaGFyIHJmY3I7CS8qIFJ4IEZ1bmN0aW9uIGNvZGUgKi8KKwljaGFyIHRmY3I7CS8qIFR4IEZ1bmN0aW9uIGNvZGUgKi8KKwl1c2hvcnQgbXJibHI7CS8qIE1heGltdW0gUmVjZWl2ZSBCdWZmZXIgTGVuZ3RoICovCisJdXNob3J0IHJicHRyOyAJLyogUnhCRCBwb2ludGVyIE5leHQgQnVmZmVyIERlc2NyaXB0b3IgKi8KKwl1c2hvcnQgdGJwdHI7CS8qIFR4QkQgcG9pbnRlciBOZXh0IEJ1ZmZlciBEZXNjcmlwdG9yICAqLworCXVsb25nIHRzdGF0ZTsJLyogVHJhbnNtaXQgaW50ZXJuYWwgc3RhdGUgKi8KKwl1bG9uZyB0cHRyOwkvKiBUcmFuc21pdCBpbnRlcm5hbCBkYXRhIHBvaW50ZXIgKi8KKwl1c2hvcnQgdGNyYzsJLyogVHJhbnNtaXQgdGVtcCBDUkMgKi8KKwl1c2hvcnQgdGJjbnQ7CS8qIFRyYW5zbWl0IGludGVybmFsIGJ5ZSBjb3VudCAqLworCXVsb25nIHR0ZW1wOwkvKiBUeCB0ZW1wICovCisJdXNob3J0IHR4dXB0cjsJLyogVHggbWljcm9jb2RlIHJldHVybiBhZGRyZXNzICovCisJdXNob3J0IHJlczE7CS8qIFJlc2VydmVkICovCit9dXNiX2VwYl90OworCit0eXBlZGVmIGVudW0gbXBjOHh4X3VkY19zdGF0ZXsKKwlTVEFURV9OT1RfUkVBRFksCisJU1RBVEVfRVJST1IsCisJU1RBVEVfUkVBRFksCit9bXBjOHh4X3VkY19zdGF0ZV90OworCisvKiBEZWNsYXJhdGlvbnMgKi8KK2ludCB1ZGNfaW5pdCh2b2lkKTsKK3ZvaWQgdWRjX2lycSh2b2lkKTsKK2ludCB1ZGNfZW5kcG9pbnRfd3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZW5kcG9pbnQpOwordm9pZCB1ZGNfc2V0dXBfZXAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwgdW5zaWduZWQgaW50IGVwLAorCQkgIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50KTsKK3ZvaWQgdWRjX2Nvbm5lY3Qodm9pZCk7Cit2b2lkIHVkY19kaXNjb25uZWN0KHZvaWQpOwordm9pZCB1ZGNfZW5hYmxlKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpOwordm9pZCB1ZGNfZGlzYWJsZSh2b2lkKTsKK3ZvaWQgdWRjX3N0YXJ0dXBfZXZlbnRzKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpOworCisvKiBGbG93IGNvbnRyb2wgKi8KK3ZvaWQgdWRjX3NldF9uYWsoaW50IGVwaWQpOwordm9pZCB1ZGNfdW5zZXRfbmFrIChpbnQgZXBpZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYmRjb3JlX29tYXAxNTEwLmggYi9pbmNsdWRlL3VzYmRjb3JlX29tYXAxNTEwLmgKaW5kZXggNmVhMzMzMS4uNTI2ZmNkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91c2JkY29yZV9vbWFwMTUxMC5oCisrKyBiL2luY2x1ZGUvdXNiZGNvcmVfb21hcDE1MTAuaApAQCAtMTYxLDEwICsxNjEsMjAgQEAKICNkZWZpbmUgVURDX1ZCVVNfQ1RSTAkgICAgKDEgPDwgMTkpCiAjZGVmaW5lIFVEQ19WQlVTX01PREUJICAgICgxIDw8IDE4KQogCisvKiBPTUFQIEVuZHBvaW50IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgRVAwX01BWF9QQUNLRVRfU0laRSA2NAorI2RlZmluZSBVRENfT1VUX0VORFBPSU5UIDIKKyNkZWZpbmUgVURDX09VVF9QQUNLRVRfU0laRSA2NAorI2RlZmluZSBVRENfSU5fRU5EUE9JTlQJMQorI2RlZmluZSBVRENfSU5fUEFDS0VUX1NJWkUgNjQKKyNkZWZpbmUgVURDX0lOVF9FTkRQT0lOVCA1CisjZGVmaW5lIFVEQ19JTlRfUEtUU0laRQkxNgorI2RlZmluZSBVRENfQlVMS19QS1RTSVpFIDE2CiAKLXZvaWQgb21hcDE1MTBfdWRjX2lycSh2b2lkKTsKLXZvaWQgb21hcDE1MTBfdWRjX25vbmlzb19pcnEodm9pZCk7Ci0KK3ZvaWQgdWRjX2lycSAodm9pZCk7CisvKiBGbG93IGNvbnRyb2wgKi8KK3ZvaWQgdWRjX3NldF9uYWsoaW50IGVwaWQpOwordm9pZCB1ZGNfdW5zZXRfbmFrIChpbnQgZXBpZCk7CiAKIC8qIEhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgZm9yIGFic3RyYWN0aW5nIGF3YXkgZnJvbSBzcGVjaWZpYyBkZXZpY2UgKi8KIHZvaWQgdWRjX2VuZHBvaW50X3dyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXNiZGVzY3JpcHRvcnMuaCBiL2luY2x1ZGUvdXNiZGVzY3JpcHRvcnMuaAppbmRleCAyZDlmNzM5Li5hNzUyMDk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VzYmRlc2NyaXB0b3JzLmgKKysrIGIvaW5jbHVkZS91c2JkZXNjcmlwdG9ycy5oCkBAIC05MiwzMyArOTIsNDIgQEAKICNkZWZpbmUgQ09NTVVOSUNBVElPTlNfREVWSUNFX0NMQVNTCTB4MDIKIAogLyogYy5mLiBDREMgNC4yIFRhYmxlIDE1ICovCi0jZGVmaW5lIENPTU1VTklDQVRJT05TX0lOVEVSRkFDRV9DTEFTUwkweDAyCisjZGVmaW5lIENPTU1VTklDQVRJT05TX0lOVEVSRkFDRV9DTEFTU19DT05UUk9MCTB4MDIKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX0RBVEEJCTB4MEEKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX1ZFTkRPUgkweDBGRgogCiAvKiBjLmYuIENEQyA0LjMgVGFibGUgMTYgKi8KLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fU1VCQ0xBU1MJMHgwMAorI2RlZmluZSBDT01NVU5JQ0FUSU9OU19OT19TVUJDTEFTUwkJMHgwMAogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19ETENNX1NVQkNMQVNTCTB4MDEKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQUNNX1NVQkNMQVNTCTB4MDIKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfVENNX1NVQkNMQVNTCTB4MDMKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQUNNX1NVQkNMQVNTCQkweDAyCisjZGVmaW5lIENPTU1VTklDQVRJT05TX1RDTV9TVUJDTEFTUwkJMHgwMwogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19NQ0NNX1NVQkNMQVNTCTB4MDQKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQ0NNX1NVQkNMQVNTCTB4MDUKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQ0NNX1NVQkNMQVNTCQkweDA1CiAjZGVmaW5lIENPTU1VTklDQVRJT05TX0VOQ01fU1VCQ0xBU1MJMHgwNgogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19BTkNNX1NVQkNMQVNTCTB4MDcKIAogLyogYy5mLiBXTUNEIDUuMSAqLwogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19XSENNX1NVQkNMQVNTCTB4MDgKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfRE1NX1NVQkNMQVNTCTB4MDkKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfRE1NX1NVQkNMQVNTCQkweDA5CiAjZGVmaW5lIENPTU1VTklDQVRJT05TX01ETE1fU1VCQ0xBU1MJMHgwYQogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19PQkVYX1NVQkNMQVNTCTB4MGIKIAotLyogYy5mLiBDREMgNC42IFRhYmxlIDE4ICovCisvKiBjLmYuIENEQyA0LjQgVGFibGUgMTcgKi8KKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fUFJPVE9DT0wJCTB4MDAKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfVjI1VEVSX1BST1RPQ09MCTB4MDEJLypDb21tb24gQVQgSGF5ZXMgY29tcGF0aWJsZSovCisKKy8qIGMuZi4gQ0RDIDQuNSBUYWJsZSAxOCAqLwogI2RlZmluZSBEQVRBX0lOVEVSRkFDRV9DTEFTUwkJMHgwYQogCisvKiBjLmYuIENEQyA0LjYgTm8gVGFibGUgKi8KKyNkZWZpbmUgREFUQV9JTlRFUkZBQ0VfU1VCQ0xBU1NfTk9ORQkweDAwCS8qIE5vIHN1YmNsYXNzIHBlcnRpbmVudCAqLworCiAvKiBjLmYuIENEQyA0LjcgVGFibGUgMTkgKi8KLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fUFJPVE9DT0wJMHgwMAorI2RlZmluZSBEQVRBX0lOVEVSRkFDRV9QUk9UT0NPTF9OT05FCTB4MDAJLyogTm8gY2xhc3MgcHJvdGNvbCByZXF1aXJlZCAqLwogCiAKIC8qIGMuZi4gQ0RDIDUuMi4zIFRhYmxlIDI0ICovCi0jZGVmaW5lIENTX0lOVEVSRkFDRQkJCTB4MjQKKyNkZWZpbmUgQ1NfSU5URVJGQUNFCQkweDI0CiAjZGVmaW5lIENTX0VORFBPSU5UCQkJMHgyNQogCiAvKgpAQCAtMTI4LDcgKzEzNyw3IEBACiAgKiBjLmYuIFdNQ0QgNS4zIFRhYmxlIDUuMwogICovCiAKLSNkZWZpbmUgVVNCX1NUX0hFQURFUgkJCTB4MDAKKyNkZWZpbmUgVVNCX1NUX0hFQURFUgkJMHgwMAogI2RlZmluZSBVU0JfU1RfQ01GCQkJMHgwMQogI2RlZmluZSBVU0JfU1RfQUNNRgkJCTB4MDIKICNkZWZpbmUgVVNCX1NUX0RMTUYJCQkweDAzCkBAIC0xMzcsMTggKzE0NiwxOCBAQAogI2RlZmluZSBVU0JfU1RfVUYJCQkweDA2CiAjZGVmaW5lIFVTQl9TVF9DU0YJCQkweDA3CiAjZGVmaW5lIFVTQl9TVF9UT01GCQkJMHgwOAotI2RlZmluZSBVU0JfU1RfVVNCVEYJCQkweDA5CisjZGVmaW5lIFVTQl9TVF9VU0JURgkJMHgwOQogI2RlZmluZSBVU0JfU1RfTkNUCQkJMHgwYQogI2RlZmluZSBVU0JfU1RfUFVGCQkJMHgwYgogI2RlZmluZSBVU0JfU1RfRVVGCQkJMHgwYwogI2RlZmluZSBVU0JfU1RfTUNNRgkJCTB4MGQKICNkZWZpbmUgVVNCX1NUX0NDTUYJCQkweDBlCiAjZGVmaW5lIFVTQl9TVF9FTkYJCQkweDBmCi0jZGVmaW5lIFVTQl9TVF9BVE1ORgkJCTB4MTAKKyNkZWZpbmUgVVNCX1NUX0FUTU5GCQkweDEwCiAKICNkZWZpbmUgVVNCX1NUX1dIQ00JCQkweDExCiAjZGVmaW5lIFVTQl9TVF9NRExNCQkJMHgxMgotI2RlZmluZSBVU0JfU1RfTURMTUQJCQkweDEzCisjZGVmaW5lIFVTQl9TVF9NRExNRAkJMHgxMwogI2RlZmluZSBVU0JfU1RfRE1NCQkJMHgxNAogI2RlZmluZSBVU0JfU1RfT0JFWAkJCTB4MTUKICNkZWZpbmUgVVNCX1NUX0NTCQkJMHgxNgpAQCAtMzEyLDcgKzMyMSw4IEBACiAJdTggYkRlc2NyaXB0b3JUeXBlOwogCXU4IGJEZXNjcmlwdG9yU3VidHlwZTsJLyogMHgwNiAqLwogCXU4IGJNYXN0ZXJJbnRlcmZhY2U7Ci0JdTggYlNsYXZlSW50ZXJmYWNlMFswXTsKKwkvKiB1OCBiU2xhdmVJbnRlcmZhY2UwWzBdOyAqLworCXU4IGJTbGF2ZUludGVyZmFjZTA7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IHVzYl9jbGFzc19jb3VudHJ5X3NlbGVjdGlvbl9kZXNjcmlwdG9yIHsKZGlmZiAtLWdpdCBhL2xpYl9hcm0vYXJtbGludXguYyBiL2xpYl9hcm0vYXJtbGludXguYwppbmRleCA1NmI3ZmNhLi42ZDMyYTQxIDEwMDY0NAotLS0gYS9saWJfYXJtL2FybWxpbnV4LmMKKysrIGIvbGliX2FybS9hcm1saW51eC5jCkBAIC02NiwxMyArNjYsNiBAQAogc3RhdGljIHN0cnVjdCB0YWcgKnBhcmFtczsKICNlbmRpZiAvKiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgfHwgQ09ORklHX0NNRExJTkVfVEFHIHx8IENPTkZJR19JTklUUkRfVEFHICovCiAKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCi0jIGluY2x1ZGUgPHN0YXR1c19sZWQuaD4KLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCi0jZWxzZQotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykKLSNlbmRpZgotCiBleHRlcm4gaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOwkvKiBmcm9tIGNtZF9ib290bS5jICovCiAKIApAQCAtOTYsNyArODksNyBAQAogCSAqIENoZWNrIGlmIHRoZXJlIGlzIGFuIGluaXRyZCBpbWFnZQogCSAqLwogCWlmIChhcmdjID49IDMpIHsKLQkJU0hPV19CT09UX1BST0dSRVNTICg5KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICg5KTsKIAogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKIApAQCAtMTE0LDcgKzEwNyw3IEBACiAKIAkJaWYgKG50b2hsIChoZHItPmloX21hZ2ljKSAhPSBJSF9NQUdJQykgewogCQkJcHJpbnRmICgiQmFkIE1hZ2ljIE51bWJlclxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMCk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMCk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKQEAgLTEyNiwxMSArMTE5LDExIEBACiAKIAkJaWYgKGNyYzMyICgwLCAodW5zaWduZWQgY2hhciAqKSBkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CiAJCQlwcmludGYgKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTExKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTExKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDEwKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMCk7CiAKIAkJcHJpbnRfaW1hZ2VfaGRyIChoZHIpOwogCkBAIC0xNTEsMTkgKzE0NCwxOSBAQAogCQkJY3N1bSA9IGNyYzMyICgwLCAodW5zaWduZWQgY2hhciAqKSBkYXRhLCBsZW4pOwogCQkJaWYgKGNzdW0gIT0gbnRvaGwgKGhkci0+aWhfZGNyYykpIHsKIAkJCQlwcmludGYgKCJCYWQgRGF0YSBDUkNcbiIpOwotCQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEyKTsKKwkJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMik7CiAJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAkJCXByaW50ZiAoIk9LXG4iKTsKIAkJfQogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDExKTsKIAogCQlpZiAoKGhkci0+aWhfb3MgIT0gSUhfT1NfTElOVVgpIHx8CiAJCSAgICAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9BUk0pIHx8CiAJCSAgICAoaGRyLT5paF90eXBlICE9IElIX1RZUEVfUkFNRElTSykpIHsKIAkJCXByaW50ZiAoIk5vIExpbnV4IEFSTSBSYW1kaXNrIEltYWdlXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEzKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEzKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIApAQCAtMTgyLDcgKzE3NSw3IEBACiAJCXVsb25nIHRhaWwgPSBudG9obCAobGVuX3B0clswXSkgJSA0OwogCQlpbnQgaTsKIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDEzKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMyk7CiAKIAkJLyogc2tpcCBrZXJuZWwgbGVuZ3RoIGFuZCB0ZXJtaW5hdG9yICovCiAJCWRhdGEgPSAodWxvbmcpICgmbGVuX3B0clsyXSk7CkBAIC0yMDEsNyArMTk0LDcgQEAKIAkJLyoKIAkJICogbm8gaW5pdHJkIGltYWdlCiAJCSAqLwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDE0KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxNCk7CiAKIAkJbGVuID0gZGF0YSA9IDA7CiAJfQpAQCAtMjIwLDcgKzIxMyw3IEBACiAJCWluaXRyZF9lbmQgPSAwOwogCX0KIAotCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTUpOworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTUpOwogCiAJZGVidWcgKCIjIyBUcmFuc2ZlcnJpbmcgY29udHJvbCB0byBMaW51eCAoYXQgYWRkcmVzcyAlMDhseCkgLi4uXG4iLAogCSAgICAgICAodWxvbmcpIHRoZUtlcm5lbCk7CmRpZmYgLS1naXQgYS9saWJfYXJtL2JvYXJkLmMgYi9saWJfYXJtL2JvYXJkLmMKaW5kZXggYmFiYzI1NC4uZDM3ZTVkYSAxMDA2NDQKLS0tIGEvbGliX2FybS9ib2FyZC5jCisrKyBiL2xpYl9hcm0vYm9hcmQuYwpAQCAtNTQsNyArNTQsNyBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiB2b2lkIG5hbmRfaW5pdCAodm9pZCk7CiAjZW5kaWYKIApAQCAtMjk2LDcgKzI5Niw3IEBACiAJLyogYXJtYm9vdF9zdGFydCBpcyBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0ICovCiAJbWVtX21hbGxvY19pbml0IChfYXJtYm9vdF9zdGFydCAtIENGR19NQUxMT0NfTEVOKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJcHV0cyAoIk5BTkQ6ICAiKTsKIAluYW5kX2luaXQoKTsJCS8qIGdvIGluaXQgdGhlIE5BTkQgKi8KICNlbmRpZgpAQCAtMzY0LDYgKzM2NCwxMyBAQAogCWVuYWJsZV9pbnRlcnJ1cHRzICgpOwogCiAJLyogUGVyZm9ybSBuZXR3b3JrIGNhcmQgaW5pdGlhbGlzYXRpb24gaWYgbmVjZXNzYXJ5ICovCisjaWZkZWYgQ09ORklHX0RSSVZFUl9USV9FTUFDCitleHRlcm4gdm9pZCBkbTY0NHhfZXRoX3NldF9tYWNfYWRkciAoY29uc3QgdV9pbnQ4X3QgKmFkZHIpOworCWlmIChnZXRlbnYgKCJldGhhZGRyIikpIHsKKwkJZG02NDR4X2V0aF9zZXRfbWFjX2FkZHIoZ2QtPmJkLT5iaV9lbmV0YWRkcik7CisJfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfRFJJVkVSX0NTODkwMAogCWNzODkwMF9nZXRfZW5ldGFkZHIgKGdkLT5iZC0+YmlfZW5ldGFkZHIpOwogI2VuZGlmCkBAIC0zNzgsMTYgKzM4NSwxNiBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZgkvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKICNpZmRlZiBCT0FSRF9MQVRFX0lOSVQKIAlib2FyZF9sYXRlX2luaXQgKCk7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpZiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAJcHV0cyAoIk5ldDogICAiKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliX2F2cjMyL01ha2VmaWxlIGIvbGliX2F2cjMyL01ha2VmaWxlCmluZGV4IGNmMjA4MzYuLmJiMjkzOGYgMTAwNjQ0Ci0tLSBhL2xpYl9hdnIzMi9NYWtlZmlsZQorKysgYi9saWJfYXZyMzIvTWFrZWZpbGUKQEAgLTI5LDcgKzI5LDcgQEAKIAogU09CSlMJPSBtZW1zZXQubwogCi1DT0JKUwk9IGJvYXJkLm8gaW50ZXJydXB0cy5vIGF2cjMyX2xpbnV4Lm8gZGl2NjQubworQ09CSlMJPSBib2FyZC5vIGludGVycnVwdHMubyBhdnIzMl9saW51eC5vCiAKIFNSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvbGliX2F2cjMyL2F2cjMyX2xpbnV4LmMgYi9saWJfYXZyMzIvYXZyMzJfbGludXguYwppbmRleCA2MDk1ZTJmLi42MmFmYmQyIDEwMDY0NAotLS0gYS9saWJfYXZyMzIvYXZyMzJfbGludXguYworKysgYi9saWJfYXZyMzIvYXZyMzJfbGludXguYwpAQCAtMzYsMTMgKzM2LDYgQEAKIC8qIENQVS1zcGVjaWZpYyBob29rIHRvIGFsbG93IGZsdXNoaW5nIG9mIGNhY2hlcywgZXRjLiAqLwogZXh0ZXJuIHZvaWQgcHJlcGFyZV90b19ib290KHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKSBzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQotI2Vsc2UKLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCi0jZW5kaWYKLQogZXh0ZXJuIGltYWdlX2hlYWRlcl90IGhlYWRlcjsJCS8qIGZyb20gY21kX2Jvb3RtLmMgKi8KIAogc3RhdGljIHN0cnVjdCB0YWcgKnNldHVwX3N0YXJ0X3RhZyhzdHJ1Y3QgdGFnICpwYXJhbXMpCkBAIC0yMDQsNyArMTk3LDcgQEAKIAkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBpbml0cmQgaW1hZ2UKIAkgKi8KIAlpZiAoYXJnYyA+PSAzKSB7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyg5KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICg5KTsKIAogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwogCkBAIC0yMTUsNyArMjA4LDcgQEAKIAogCQlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKIAkJCXB1dHMoIkJhZCBNYWdpYyBOdW1iZXJcbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTKC0xMCk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMCk7CiAJCQlkb19yZXNldChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIApAQCAtMjI2LDExICsyMTksMTEgQEAKIAogCQlpZiAoY3JjMzIoMCwgKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CiAJCQlwdXRzKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUygtMTEpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTEpOwogCQkJZG9fcmVzZXQoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTKDEwKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMCk7CiAKIAkJcHJpbnRfaW1hZ2VfaGRyKGhkcik7CiAKQEAgLTI0NCwyNiArMjM3LDI2IEBACiAJCQljc3VtID0gY3JjMzIoMCwgKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBsZW4pOwogCQkJaWYgKGNzdW0gIT0gbnRvaGwoaGRyLT5paF9kY3JjKSkgewogCQkJCXB1dHMoIkJhZCBEYXRhIENSQ1xuIik7Ci0JCQkJU0hPV19CT09UX1BST0dSRVNTKC0xMik7CisJCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTIpOwogCQkJCWRvX3Jlc2V0KGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAkJCXB1dHMoIk9LXG4iKTsKIAkJfQogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUygxMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTEpOwogCiAJCWlmICgoaGRyLT5paF9vcyAhPSBJSF9PU19MSU5VWCkgfHwKIAkJICAgIChoZHItPmloX2FyY2ggIT0gSUhfQ1BVX0FWUjMyKSB8fAogCQkgICAgKGhkci0+aWhfdHlwZSAhPSBJSF9UWVBFX1JBTURJU0spKSB7CiAJCQlwdXRzKCJOb3QgYSBMaW51eC9BVlIzMiBSQU1ESVNLIGltYWdlXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUygtMTMpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTMpOwogCQkJZG9fcmVzZXQoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAJfSBlbHNlIGlmICgoaGRyLT5paF90eXBlID09IElIX1RZUEVfTVVMVEkpICYmIChsZW5fcHRyWzFdKSkgewogCQl1bG9uZyB0YWlsID0gbnRvaGwgKGxlbl9wdHJbMF0pICUgNDsKIAkJaW50IGk7CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMyk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTMpOwogCiAJCS8qIHNraXAga2VybmVsIGxlbmd0aCBhbmQgdGVybWluYXRvciAqLwogCQlkYXRhID0gKHVsb25nKSAoJmxlbl9wdHJbMl0pOwpAQCAtMjc5LDcgKzI3Miw3IEBACiAJCWxlbiA9IG50b2hsIChsZW5fcHRyWzFdKTsKIAl9IGVsc2UgewogCQkvKiBubyBpbml0cmQgaW1hZ2UgKi8KLQkJU0hPV19CT09UX1BST0dSRVNTKDE0KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxNCk7CiAJCWxlbiA9IGRhdGEgPSAwOwogCX0KIApAQCAtMjkxLDcgKzI4NCw3IEBACiAJCWluaXRyZF9lbmQgPSAwOwogCX0KIAotCVNIT1dfQk9PVF9QUk9HUkVTUygxNSk7CisJc2hvd19ib290X3Byb2dyZXNzICgxNSk7CiAKIAlwYXJhbXMgPSBwYXJhbXNfc3RhcnQgPSAoc3RydWN0IHRhZyAqKWdkLT5iZC0+YmlfYm9vdF9wYXJhbXM7CiAJcGFyYW1zID0gc2V0dXBfc3RhcnRfdGFnKHBhcmFtcyk7CmRpZmYgLS1naXQgYS9saWJfYXZyMzIvYm9hcmQuYyBiL2xpYl9hdnIzMi9ib2FyZC5jCmluZGV4IDI2NTMyOGEuLjhiOWNhMzggMTAwNjQ0Ci0tLSBhL2xpYl9hdnIzMi9ib2FyZC5jCisrKyBiL2xpYl9hdnIzMi9ib2FyZC5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAlqdW1wdGFibGVfaW5pdCgpOwogCWNvbnNvbGVfaW5pdF9yKCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpZiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAJcHV0cygiTmV0OiAgICIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfYXZyMzIvZGl2NjQuYyBiL2xpYl9hdnIzMi9kaXY2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTcyNmUzLi4wMDAwMDAwCi0tLSBhL2xpYl9hdnIzMi9kaXY2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBCZXJuYXJkbyBJbm5vY2VudGkgPGJlcm5pZUBkZXZlbGVyLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBmb3JtZXIgZG9fZGl2KCkgaW1wbGVtZW50YXRpb24gZnJvbSBhc20tcGFyaXNjL2RpdjY0Lmg6Ci0gKglDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvCi0gKglDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotICoKLSAqCi0gKiBHZW5lcmljIEMgdmVyc2lvbiBvZiA2NGJpdC8zMmJpdCBkaXZpc2lvbiBhbmQgbW9kdWxvLCB3aXRoCi0gKiA2NGJpdCByZXN1bHQgYW5kIDMyYml0IHJlbWFpbmRlci4KLSAqCi0gKiBUaGUgZmFzdCBjYXNlIGZvciAobj4+MzIgPT0gMCkgaXMgaGFuZGxlZCBpbmxpbmUgYnkgZG9fZGl2KCkuCi0gKgotICogQ29kZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgdmVyeSBpbmVmZmljaWVudAotICogZm9yIHNvbWUgQ1BVcy4gX19kaXY2NF8zMigpIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGxpbmtpbmcgYXJjaC1zcGVjaWZpYwotICogYXNzZW1ibHkgdmVyc2lvbnMgc3VjaCBhcyBhcmNoL3BwYy9saWIvZGl2NjQuUyBhbmQgYXJjaC9zaC9saWIvZGl2NjQuUy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCi11aW50MzJfdCBfX2RpdjY0XzMyKHVpbnQ2NF90ICpuLCB1aW50MzJfdCBiYXNlKQotewotCXVpbnQ2NF90IHJlbSA9ICpuOwotCXVpbnQ2NF90IGIgPSBiYXNlOwotCXVpbnQ2NF90IHJlcywgZCA9IDE7Ci0JdWludDMyX3QgaGlnaCA9IHJlbSA+PiAzMjsKLQotCS8qIFJlZHVjZSB0aGUgdGhpbmcgYSBiaXQgZmlyc3QgKi8KLQlyZXMgPSAwOwotCWlmIChoaWdoID49IGJhc2UpIHsKLQkJaGlnaCAvPSBiYXNlOwotCQlyZXMgPSAodWludDY0X3QpIGhpZ2ggPDwgMzI7Ci0JCXJlbSAtPSAodWludDY0X3QpIChoaWdoKmJhc2UpIDw8IDMyOwotCX0KLQotCXdoaWxlICgoaW50NjRfdCliID4gMCAmJiBiIDwgcmVtKSB7Ci0JCWIgPSBiK2I7Ci0JCWQgPSBkK2Q7Ci0JfQotCi0JZG8gewotCQlpZiAocmVtID49IGIpIHsKLQkJCXJlbSAtPSBiOwotCQkJcmVzICs9IGQ7Ci0JCX0KLQkJYiA+Pj0gMTsKLQkJZCA+Pj0gMTsKLQl9IHdoaWxlIChkKTsKLQotCSpuID0gcmVzOwotCXJldHVybiByZW07Ci19CmRpZmYgLS1naXQgYS9saWJfYmxhY2tmaW4vYmY1MzNfbGludXguYyBiL2xpYl9ibGFja2Zpbi9iZjUzM19saW51eC5jCmluZGV4IDNiOWM0ZGYuLjgwYTNkYzcgMTAwNjQ0Ci0tLSBhL2xpYl9ibGFja2Zpbi9iZjUzM19saW51eC5jCisrKyBiL2xpYl9ibGFja2Zpbi9iZjUzM19saW51eC5jCkBAIC0zNiwxMyArMzYsNiBAQAogI2RlZmluZQlMSU5VWF9NQVhfRU5WUwkJMjU2CiAjZGVmaW5lCUxJTlVYX01BWF9BUkdTCQkyNTYKIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSNpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCi0jZWxzZQotI2RlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KICNkZWZpbmUgQ01EX0xJTkVfQUREUiAweEZGOTAwMDAwCS8qIEwxIHNjcmF0Y2hwYWQgKi8KIAogI2lmZGVmIFNIQVJFRF9SRVNPVVJDRVMKZGlmZiAtLWdpdCBhL2xpYl9ibGFja2Zpbi9ib2FyZC5jIGIvbGliX2JsYWNrZmluL2JvYXJkLmMKaW5kZXggMTUzOGRhMy4uMzZhOTY5ZSAxMDA2NDQKLS0tIGEvbGliX2JsYWNrZmluL2JvYXJkLmMKKysrIGIvbGliX2JsYWNrZmluL2JvYXJkLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCX0KIAogCWNoZWNrYm9hcmQoKTsKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfQkY1MzMpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0JGNTMzKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAlydGNfaW5pdCgpOwogI2VuZGlmCiAJdGltZXJfaW5pdCgpOwpAQCAtMzkxLDEzICszOTEsMTMgQEAKIAlpZiAoKHMgPSBnZXRlbnYoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMTYpOwogCX0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlpZiAoKHMgPSBnZXRlbnYoImJvb3RmaWxlIikpICE9IE5VTEwpIHsKIAkJY29weV9maWxlbmFtZShCb290RmlsZSwgcywgc2l6ZW9mKEJvb3RGaWxlKSk7CiAJfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCXB1dHMoIk5BTkQ6ICAiKTsKIAluYW5kX2luaXQoKTsJCS8qIGdvIGluaXQgdGhlIE5BTkQgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliX2JsYWNrZmluL3Bvc3QuYyBiL2xpYl9ibGFja2Zpbi9wb3N0LmMKaW5kZXggMGU3NjAyNi4uN2M5NDc4ZCAxMDA2NDQKLS0tIGEvbGliX2JsYWNrZmluL3Bvc3QuYworKysgYi9saWJfYmxhY2tmaW4vcG9zdC5jCkBAIC0xMzIsOSArMTMyLDcgQEAKIAkJCQlwb3N0X2xvZygiUEFTU0VEXG4iKTsKIAkJCWVsc2UgewogCQkJCXBvc3RfbG9nKCJGQUlMRURcbiIpOwotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLQkJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MoLTMxKTsKLSNlbmRpZgorCQkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTMxKTsKIAkJCX0KIAkJfQogCX0KQEAgLTI0NSw5ICsyNDMsNyBAQAogCQl9IGVsc2UgewogCQkJaWYgKCgqdGVzdC0+dGVzdCkgKGZsYWdzKSAhPSAwKSB7CiAJCQkJcG9zdF9sb2coIkZBSUxFRFxuIik7Ci0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotCQkJCXNob3dfYm9vdF9wcm9ncmVzcygtMzIpOwotI2VuZGlmCisJCQkJc2hvd19ib290X3Byb2dyZXNzICgtMzIpOwogCQkJfSBlbHNlCiAJCQkJcG9zdF9sb2coIlBBU1NFRFxuIik7CiAJCX0KZGlmZiAtLWdpdCBhL2xpYl9nZW5lcmljL01ha2VmaWxlIGIvbGliX2dlbmVyaWMvTWFrZWZpbGUKaW5kZXggZjAxMmNhYi4uYmYzNzc1MiAxMDA2NDQKLS0tIGEvbGliX2dlbmVyaWMvTWFrZWZpbGUKKysrIGIvbGliX2dlbmVyaWMvTWFrZWZpbGUKQEAgLTI3LDcgKzI3LDcgQEAKIAogQ09CSlMJPSBiemxpYi5vIGJ6bGliX2NyY3RhYmxlLm8gYnpsaWJfZGVjb21wcmVzcy5vIFwKIAkgIGJ6bGliX3JhbmR0YWJsZS5vIGJ6bGliX2h1ZmZtYW4ubyBcCi0JICBjcmMzMi5vIGN0eXBlLm8gZGlzcGxheV9vcHRpb25zLm8gbGRpdi5vIFwKKwkgIGNyYzMyLm8gY3R5cGUubyBkaXNwbGF5X29wdGlvbnMubyBkaXY2NC5vIGxkaXYubyBzaGExLm8gXAogCSAgc3RyaW5nLm8gdnNwcmludGYubyB6bGliLm8KIAogU1JDUyAJOj0gJChDT0JKUzoubz0uYykKZGlmZiAtLWdpdCBhL2xpYl9nZW5lcmljL2NyYzMyLmMgYi9saWJfZ2VuZXJpYy9jcmMzMi5jCmluZGV4IDNkOTliNjkuLmRmMGRiY2EgMTAwNjQ0Ci0tLSBhL2xpYl9nZW5lcmljL2NyYzMyLmMKKysrIGIvbGliX2dlbmVyaWMvY3JjMzIuYwpAQCAtOSw3ICs5LDcgQEAKICAqLwogCiAjaWZuZGVmIFVTRV9IT1NUQ0MJLyogU2h1dCBkb3duICJBTlNJIGRvZXMgbm90IHBlcm1pdC4uLiIgd2FybmluZ3MgKi8KLSNpbmNsdWRlIDxjb21tb24uaD4JLyogdG8gZ2V0IGNvbW1hbmQgZGVmaW5pdGlvbnMgbGlrZSBDRkdfQ01EX0pGRlMyICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgInpsaWIuaCIKQEAgLTE3MSw4ICsxNzEsOSBAQAogICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmTDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSB8fCBcCi0JKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSB8fCBcCisJKGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSBcCisJJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSkKIAogLyogTm8gb25lcyBjb21wbGVtZW50IHZlcnNpb24uIEpGRlMyIChhbmQgb3RoZXIgdGhpbmdzID8pCiAgKiBkb24ndCB1c2Ugb25lcyBjb21wbGltZW50IGluIHRoZWlyIENSQyBjYWxjdWxhdGlvbnMuCkBAIC0xOTUsNCArMTk2LDQgQEAKICAgICByZXR1cm4gY3JjOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfZ2VuZXJpYy9kaXY2NC5jIGIvbGliX2dlbmVyaWMvZGl2NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk1MWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliX2dlbmVyaWMvZGl2NjQuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJlcm5hcmRvIElubm9jZW50aSA8YmVybmllQGRldmVsZXIuY29tPgorICoKKyAqIEJhc2VkIG9uIGZvcm1lciBkb19kaXYoKSBpbXBsZW1lbnRhdGlvbiBmcm9tIGFzbS1wYXJpc2MvZGl2NjQuaDoKKyAqCUNvcHlyaWdodCAoQykgMTk5OSBIZXdsZXR0LVBhY2thcmQgQ28KKyAqCUNvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CisgKgorICoKKyAqIEdlbmVyaWMgQyB2ZXJzaW9uIG9mIDY0Yml0LzMyYml0IGRpdmlzaW9uIGFuZCBtb2R1bG8sIHdpdGgKKyAqIDY0Yml0IHJlc3VsdCBhbmQgMzJiaXQgcmVtYWluZGVyLgorICoKKyAqIFRoZSBmYXN0IGNhc2UgZm9yIChuPj4zMiA9PSAwKSBpcyBoYW5kbGVkIGlubGluZSBieSBkb19kaXYoKS4KKyAqCisgKiBDb2RlIGdlbmVyYXRlZCBmb3IgdGhpcyBmdW5jdGlvbiBtaWdodCBiZSB2ZXJ5IGluZWZmaWNpZW50CisgKiBmb3Igc29tZSBDUFVzLiBfX2RpdjY0XzMyKCkgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbGlua2luZyBhcmNoLXNwZWNpZmljCisgKiBhc3NlbWJseSB2ZXJzaW9ucyBzdWNoIGFzIGFyY2gvcHBjL2xpYi9kaXY2NC5TIGFuZCBhcmNoL3NoL2xpYi9kaXY2NC5TLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit1aW50MzJfdCBfX2RpdjY0XzMyKHVpbnQ2NF90ICpuLCB1aW50MzJfdCBiYXNlKQoreworCXVpbnQ2NF90IHJlbSA9ICpuOworCXVpbnQ2NF90IGIgPSBiYXNlOworCXVpbnQ2NF90IHJlcywgZCA9IDE7CisJdWludDMyX3QgaGlnaCA9IHJlbSA+PiAzMjsKKworCS8qIFJlZHVjZSB0aGUgdGhpbmcgYSBiaXQgZmlyc3QgKi8KKwlyZXMgPSAwOworCWlmIChoaWdoID49IGJhc2UpIHsKKwkJaGlnaCAvPSBiYXNlOworCQlyZXMgPSAodWludDY0X3QpIGhpZ2ggPDwgMzI7CisJCXJlbSAtPSAodWludDY0X3QpIChoaWdoKmJhc2UpIDw8IDMyOworCX0KKworCXdoaWxlICgoaW50NjRfdCliID4gMCAmJiBiIDwgcmVtKSB7CisJCWIgPSBiK2I7CisJCWQgPSBkK2Q7CisJfQorCisJZG8geworCQlpZiAocmVtID49IGIpIHsKKwkJCXJlbSAtPSBiOworCQkJcmVzICs9IGQ7CisJCX0KKwkJYiA+Pj0gMTsKKwkJZCA+Pj0gMTsKKwl9IHdoaWxlIChkKTsKKworCSpuID0gcmVzOworCXJldHVybiByZW07Cit9CmRpZmYgLS1naXQgYS9saWJfZ2VuZXJpYy9zaGExLmMgYi9saWJfZ2VuZXJpYy9zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmZmE2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9nZW5lcmljL3NoYTEuYwpAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqICBIZWlrbyBTY2hvY2hlciwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgaHNAZGVueC5kZS4KKyAqICBiYXNlZCBvbjoKKyAqICBGSVBTLTE4MC0xIGNvbXBsaWFudCBTSEEtMSBpbXBsZW1lbnRhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLCB2ZXJzaW9uIDIuMSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworLyoKKyAqICBUaGUgU0hBLTEgc3RhbmRhcmQgd2FzIHB1Ymxpc2hlZCBieSBOSVNUIGluIDE5OTMuCisgKgorICogIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2ZpcHNwdWJzL2ZpcDE4MC0xLmh0bQorICovCisKKyNpZm5kZWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgInNoYTEuaCIKKworLyoKKyAqIDMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbiBtYWNyb3MgKGJpZyBlbmRpYW4pCisgKi8KKyNpZm5kZWYgR0VUX1VJTlQzMl9CRQorI2RlZmluZSBHRVRfVUlOVDMyX0JFKG4sYixpKSB7CQkJCVwKKwkobikgPSAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICAgIF0gPDwgMjQgKQlcCisJICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDFdIDw8IDE2ICkJXAorCSAgICB8ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgKyAyXSA8PCAgOCApCVwKKwkgICAgfCAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICsgM10gICAgICAgKTsJXAorfQorI2VuZGlmCisjaWZuZGVmIFBVVF9VSU5UMzJfQkUKKyNkZWZpbmUgUFVUX1VJTlQzMl9CRShuLGIsaSkgewkJCQlcCisJKGIpWyhpKSAgICBdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDI0ICk7CVwKKwkoYilbKGkpICsgMV0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gMTYgKTsJXAorCShiKVsoaSkgKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAgOCApOwlcCisJKGIpWyhpKSArIDNdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pICAgICAgICk7CVwKK30KKyNlbmRpZgorCisvKgorICogU0hBLTEgY29udGV4dCBzZXR1cAorICovCit2b2lkIHNoYTFfc3RhcnRzIChzaGExX2NvbnRleHQgKiBjdHgpCit7CisJY3R4LT50b3RhbFswXSA9IDA7CisJY3R4LT50b3RhbFsxXSA9IDA7CisKKwljdHgtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKwljdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKwljdHgtPnN0YXRlWzJdID0gMHg5OEJBRENGRTsKKwljdHgtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKKwljdHgtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKK30KKworc3RhdGljIHZvaWQgc2hhMV9wcm9jZXNzIChzaGExX2NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGNoYXIgZGF0YVs2NF0pCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wLCBXWzE2XSwgQSwgQiwgQywgRCwgRTsKKworCUdFVF9VSU5UMzJfQkUgKFdbMF0sIGRhdGEsIDApOworCUdFVF9VSU5UMzJfQkUgKFdbMV0sIGRhdGEsIDQpOworCUdFVF9VSU5UMzJfQkUgKFdbMl0sIGRhdGEsIDgpOworCUdFVF9VSU5UMzJfQkUgKFdbM10sIGRhdGEsIDEyKTsKKwlHRVRfVUlOVDMyX0JFIChXWzRdLCBkYXRhLCAxNik7CisJR0VUX1VJTlQzMl9CRSAoV1s1XSwgZGF0YSwgMjApOworCUdFVF9VSU5UMzJfQkUgKFdbNl0sIGRhdGEsIDI0KTsKKwlHRVRfVUlOVDMyX0JFIChXWzddLCBkYXRhLCAyOCk7CisJR0VUX1VJTlQzMl9CRSAoV1s4XSwgZGF0YSwgMzIpOworCUdFVF9VSU5UMzJfQkUgKFdbOV0sIGRhdGEsIDM2KTsKKwlHRVRfVUlOVDMyX0JFIChXWzEwXSwgZGF0YSwgNDApOworCUdFVF9VSU5UMzJfQkUgKFdbMTFdLCBkYXRhLCA0NCk7CisJR0VUX1VJTlQzMl9CRSAoV1sxMl0sIGRhdGEsIDQ4KTsKKwlHRVRfVUlOVDMyX0JFIChXWzEzXSwgZGF0YSwgNTIpOworCUdFVF9VSU5UMzJfQkUgKFdbMTRdLCBkYXRhLCA1Nik7CisJR0VUX1VJTlQzMl9CRSAoV1sxNV0sIGRhdGEsIDYwKTsKKworI2RlZmluZSBTKHgsbikJKCh4IDw8IG4pIHwgKCh4ICYgMHhGRkZGRkZGRikgPj4gKDMyIC0gbikpKQorCisjZGVmaW5lIFIodCkgKAkJCQkJCVwKKwl0ZW1wID0gV1sodCAtICAzKSAmIDB4MEZdIF4gV1sodCAtIDgpICYgMHgwRl0gXglcCisJICAgICAgIFdbKHQgLSAxNCkgJiAweDBGXSBeIFdbIHQgICAgICAmIDB4MEZdLAlcCisJKCBXW3QgJiAweDBGXSA9IFModGVtcCwxKSApCQkJXAorKQorCisjZGVmaW5lIFAoYSxiLGMsZCxlLHgpCXsJCQkJXAorCWUgKz0gUyhhLDUpICsgRihiLGMsZCkgKyBLICsgeDsgYiA9IFMoYiwzMCk7CVwKK30KKworCUEgPSBjdHgtPnN0YXRlWzBdOworCUIgPSBjdHgtPnN0YXRlWzFdOworCUMgPSBjdHgtPnN0YXRlWzJdOworCUQgPSBjdHgtPnN0YXRlWzNdOworCUUgPSBjdHgtPnN0YXRlWzRdOworCisjZGVmaW5lIEYoeCx5LHopICh6IF4gKHggJiAoeSBeIHopKSkKKyNkZWZpbmUgSyAweDVBODI3OTk5CisKKwlQIChBLCBCLCBDLCBELCBFLCBXWzBdKTsKKwlQIChFLCBBLCBCLCBDLCBELCBXWzFdKTsKKwlQIChELCBFLCBBLCBCLCBDLCBXWzJdKTsKKwlQIChDLCBELCBFLCBBLCBCLCBXWzNdKTsKKwlQIChCLCBDLCBELCBFLCBBLCBXWzRdKTsKKwlQIChBLCBCLCBDLCBELCBFLCBXWzVdKTsKKwlQIChFLCBBLCBCLCBDLCBELCBXWzZdKTsKKwlQIChELCBFLCBBLCBCLCBDLCBXWzddKTsKKwlQIChDLCBELCBFLCBBLCBCLCBXWzhdKTsKKwlQIChCLCBDLCBELCBFLCBBLCBXWzldKTsKKwlQIChBLCBCLCBDLCBELCBFLCBXWzEwXSk7CisJUCAoRSwgQSwgQiwgQywgRCwgV1sxMV0pOworCVAgKEQsIEUsIEEsIEIsIEMsIFdbMTJdKTsKKwlQIChDLCBELCBFLCBBLCBCLCBXWzEzXSk7CisJUCAoQiwgQywgRCwgRSwgQSwgV1sxNF0pOworCVAgKEEsIEIsIEMsIEQsIEUsIFdbMTVdKTsKKwlQIChFLCBBLCBCLCBDLCBELCBSICgxNikpOworCVAgKEQsIEUsIEEsIEIsIEMsIFIgKDE3KSk7CisJUCAoQywgRCwgRSwgQSwgQiwgUiAoMTgpKTsKKwlQIChCLCBDLCBELCBFLCBBLCBSICgxOSkpOworCisjdW5kZWYgSworI3VuZGVmIEYKKworI2RlZmluZSBGKHgseSx6KSAoeCBeIHkgXiB6KQorI2RlZmluZSBLIDB4NkVEOUVCQTEKKworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDIwKSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoMjEpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICgyMikpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDIzKSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoMjQpKTsKKwlQIChBLCBCLCBDLCBELCBFLCBSICgyNSkpOworCVAgKEUsIEEsIEIsIEMsIEQsIFIgKDI2KSk7CisJUCAoRCwgRSwgQSwgQiwgQywgUiAoMjcpKTsKKwlQIChDLCBELCBFLCBBLCBCLCBSICgyOCkpOworCVAgKEIsIEMsIEQsIEUsIEEsIFIgKDI5KSk7CisJUCAoQSwgQiwgQywgRCwgRSwgUiAoMzApKTsKKwlQIChFLCBBLCBCLCBDLCBELCBSICgzMSkpOworCVAgKEQsIEUsIEEsIEIsIEMsIFIgKDMyKSk7CisJUCAoQywgRCwgRSwgQSwgQiwgUiAoMzMpKTsKKwlQIChCLCBDLCBELCBFLCBBLCBSICgzNCkpOworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDM1KSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoMzYpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICgzNykpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDM4KSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoMzkpKTsKKworI3VuZGVmIEsKKyN1bmRlZiBGCisKKyNkZWZpbmUgRih4LHkseikgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQorI2RlZmluZSBLIDB4OEYxQkJDREMKKworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDQwKSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoNDEpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICg0MikpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDQzKSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoNDQpKTsKKwlQIChBLCBCLCBDLCBELCBFLCBSICg0NSkpOworCVAgKEUsIEEsIEIsIEMsIEQsIFIgKDQ2KSk7CisJUCAoRCwgRSwgQSwgQiwgQywgUiAoNDcpKTsKKwlQIChDLCBELCBFLCBBLCBCLCBSICg0OCkpOworCVAgKEIsIEMsIEQsIEUsIEEsIFIgKDQ5KSk7CisJUCAoQSwgQiwgQywgRCwgRSwgUiAoNTApKTsKKwlQIChFLCBBLCBCLCBDLCBELCBSICg1MSkpOworCVAgKEQsIEUsIEEsIEIsIEMsIFIgKDUyKSk7CisJUCAoQywgRCwgRSwgQSwgQiwgUiAoNTMpKTsKKwlQIChCLCBDLCBELCBFLCBBLCBSICg1NCkpOworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDU1KSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoNTYpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICg1NykpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDU4KSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoNTkpKTsKKworI3VuZGVmIEsKKyN1bmRlZiBGCisKKyNkZWZpbmUgRih4LHkseikgKHggXiB5IF4geikKKyNkZWZpbmUgSyAweENBNjJDMUQ2CisKKwlQIChBLCBCLCBDLCBELCBFLCBSICg2MCkpOworCVAgKEUsIEEsIEIsIEMsIEQsIFIgKDYxKSk7CisJUCAoRCwgRSwgQSwgQiwgQywgUiAoNjIpKTsKKwlQIChDLCBELCBFLCBBLCBCLCBSICg2MykpOworCVAgKEIsIEMsIEQsIEUsIEEsIFIgKDY0KSk7CisJUCAoQSwgQiwgQywgRCwgRSwgUiAoNjUpKTsKKwlQIChFLCBBLCBCLCBDLCBELCBSICg2NikpOworCVAgKEQsIEUsIEEsIEIsIEMsIFIgKDY3KSk7CisJUCAoQywgRCwgRSwgQSwgQiwgUiAoNjgpKTsKKwlQIChCLCBDLCBELCBFLCBBLCBSICg2OSkpOworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDcwKSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoNzEpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICg3MikpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDczKSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoNzQpKTsKKwlQIChBLCBCLCBDLCBELCBFLCBSICg3NSkpOworCVAgKEUsIEEsIEIsIEMsIEQsIFIgKDc2KSk7CisJUCAoRCwgRSwgQSwgQiwgQywgUiAoNzcpKTsKKwlQIChDLCBELCBFLCBBLCBCLCBSICg3OCkpOworCVAgKEIsIEMsIEQsIEUsIEEsIFIgKDc5KSk7CisKKyN1bmRlZiBLCisjdW5kZWYgRgorCisJY3R4LT5zdGF0ZVswXSArPSBBOworCWN0eC0+c3RhdGVbMV0gKz0gQjsKKwljdHgtPnN0YXRlWzJdICs9IEM7CisJY3R4LT5zdGF0ZVszXSArPSBEOworCWN0eC0+c3RhdGVbNF0gKz0gRTsKK30KKworLyoKKyAqIFNIQS0xIHByb2Nlc3MgYnVmZmVyCisgKi8KK3ZvaWQgc2hhMV91cGRhdGUgKHNoYTFfY29udGV4dCAqIGN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuKQoreworCWludCBmaWxsOworCXVuc2lnbmVkIGxvbmcgbGVmdDsKKworCWlmIChpbGVuIDw9IDApCisJCXJldHVybjsKKworCWxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKKwlmaWxsID0gNjQgLSBsZWZ0OworCisJY3R4LT50b3RhbFswXSArPSBpbGVuOworCWN0eC0+dG90YWxbMF0gJj0gMHhGRkZGRkZGRjsKKworCWlmIChjdHgtPnRvdGFsWzBdIDwgKHVuc2lnbmVkIGxvbmcpIGlsZW4pCisJCWN0eC0+dG90YWxbMV0rKzsKKworCWlmIChsZWZ0ICYmIGlsZW4gPj0gZmlsbCkgeworCQltZW1jcHkgKCh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCAqKSBpbnB1dCwgZmlsbCk7CisJCXNoYTFfcHJvY2VzcyAoY3R4LCBjdHgtPmJ1ZmZlcik7CisJCWlucHV0ICs9IGZpbGw7CisJCWlsZW4gLT0gZmlsbDsKKwkJbGVmdCA9IDA7CisJfQorCisJd2hpbGUgKGlsZW4gPj0gNjQpIHsKKwkJc2hhMV9wcm9jZXNzIChjdHgsIGlucHV0KTsKKwkJaW5wdXQgKz0gNjQ7CisJCWlsZW4gLT0gNjQ7CisJfQorCisJaWYgKGlsZW4gPiAwKSB7CisJCW1lbWNweSAoKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkICopIGlucHV0LCBpbGVuKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNoYTFfcGFkZGluZ1s2NF0gPSB7CisJMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworLyoKKyAqIFNIQS0xIGZpbmFsIGRpZ2VzdAorICovCit2b2lkIHNoYTFfZmluaXNoIChzaGExX2NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSkKK3sKKwl1bnNpZ25lZCBsb25nIGxhc3QsIHBhZG47CisJdW5zaWduZWQgbG9uZyBoaWdoLCBsb3c7CisJdW5zaWduZWQgY2hhciBtc2dsZW5bOF07CisKKwloaWdoID0gKGN0eC0+dG90YWxbMF0gPj4gMjkpCisJCXwgKGN0eC0+dG90YWxbMV0gPDwgMyk7CisJbG93ID0gKGN0eC0+dG90YWxbMF0gPDwgMyk7CisKKwlQVVRfVUlOVDMyX0JFIChoaWdoLCBtc2dsZW4sIDApOworCVBVVF9VSU5UMzJfQkUgKGxvdywgbXNnbGVuLCA0KTsKKworCWxhc3QgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKKwlwYWRuID0gKGxhc3QgPCA1NikgPyAoNTYgLSBsYXN0KSA6ICgxMjAgLSBsYXN0KTsKKworCXNoYTFfdXBkYXRlIChjdHgsICh1bnNpZ25lZCBjaGFyICopIHNoYTFfcGFkZGluZywgcGFkbik7CisJc2hhMV91cGRhdGUgKGN0eCwgbXNnbGVuLCA4KTsKKworCVBVVF9VSU5UMzJfQkUgKGN0eC0+c3RhdGVbMF0sIG91dHB1dCwgMCk7CisJUFVUX1VJTlQzMl9CRSAoY3R4LT5zdGF0ZVsxXSwgb3V0cHV0LCA0KTsKKwlQVVRfVUlOVDMyX0JFIChjdHgtPnN0YXRlWzJdLCBvdXRwdXQsIDgpOworCVBVVF9VSU5UMzJfQkUgKGN0eC0+c3RhdGVbM10sIG91dHB1dCwgMTIpOworCVBVVF9VSU5UMzJfQkUgKGN0eC0+c3RhdGVbNF0sIG91dHB1dCwgMTYpOworfQorCisvKgorICogT3V0cHV0ID0gU0hBLTEoIGlucHV0IGJ1ZmZlciApCisgKi8KK3ZvaWQgc2hhMV9jc3VtICh1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSkKK3sKKwlzaGExX2NvbnRleHQgY3R4OworCisJc2hhMV9zdGFydHMgKCZjdHgpOworCXNoYTFfdXBkYXRlICgmY3R4LCBpbnB1dCwgaWxlbik7CisJc2hhMV9maW5pc2ggKCZjdHgsIG91dHB1dCk7Cit9CisKKy8qCisgKiBPdXRwdXQgPSBITUFDLVNIQS0xKCBpbnB1dCBidWZmZXIsIGhtYWMga2V5ICkKKyAqLwordm9pZCBzaGExX2htYWMgKHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwKKwkJdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0pCit7CisJaW50IGk7CisJc2hhMV9jb250ZXh0IGN0eDsKKwl1bnNpZ25lZCBjaGFyIGtfaXBhZFs2NF07CisJdW5zaWduZWQgY2hhciBrX29wYWRbNjRdOworCXVuc2lnbmVkIGNoYXIgdG1wYnVmWzIwXTsKKworCW1lbXNldCAoa19pcGFkLCAweDM2LCA2NCk7CisJbWVtc2V0IChrX29wYWQsIDB4NUMsIDY0KTsKKworCWZvciAoaSA9IDA7IGkgPCBrZXlsZW47IGkrKykgeworCQlpZiAoaSA+PSA2NCkKKwkJCWJyZWFrOworCisJCWtfaXBhZFtpXSBePSBrZXlbaV07CisJCWtfb3BhZFtpXSBePSBrZXlbaV07CisJfQorCisJc2hhMV9zdGFydHMgKCZjdHgpOworCXNoYTFfdXBkYXRlICgmY3R4LCBrX2lwYWQsIDY0KTsKKwlzaGExX3VwZGF0ZSAoJmN0eCwgaW5wdXQsIGlsZW4pOworCXNoYTFfZmluaXNoICgmY3R4LCB0bXBidWYpOworCisJc2hhMV9zdGFydHMgKCZjdHgpOworCXNoYTFfdXBkYXRlICgmY3R4LCBrX29wYWQsIDY0KTsKKwlzaGExX3VwZGF0ZSAoJmN0eCwgdG1wYnVmLCAyMCk7CisJc2hhMV9maW5pc2ggKCZjdHgsIG91dHB1dCk7CisKKwltZW1zZXQgKGtfaXBhZCwgMCwgNjQpOworCW1lbXNldCAoa19vcGFkLCAwLCA2NCk7CisJbWVtc2V0ICh0bXBidWYsIDAsIDIwKTsKKwltZW1zZXQgKCZjdHgsIDAsIHNpemVvZiAoc2hhMV9jb250ZXh0KSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIF9zaGExX3NyY1tdID0gIl9zaGExX3NyYyI7CisKKyNpZmRlZiBTRUxGX1RFU1QKKy8qCisgKiBGSVBTLTE4MC0xIHRlc3QgdmVjdG9ycworICovCitzdGF0aWMgY29uc3QgY2hhciBzaGExX3Rlc3Rfc3RyWzNdWzU3XSA9IHsKKwl7ImFiYyJ9LAorCXsiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEifSwKKwl7IiJ9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaGExX3Rlc3Rfc3VtWzNdWzIwXSA9IHsKKwl7MHhBOSwgMHg5OSwgMHgzRSwgMHgzNiwgMHg0NywgMHgwNiwgMHg4MSwgMHg2QSwgMHhCQSwgMHgzRSwKKwkgMHgyNSwgMHg3MSwgMHg3OCwgMHg1MCwgMHhDMiwgMHg2QywgMHg5QywgMHhEMCwgMHhEOCwgMHg5RH0sCisJezB4ODQsIDB4OTgsIDB4M0UsIDB4NDQsIDB4MUMsIDB4M0IsIDB4RDIsIDB4NkUsIDB4QkEsIDB4QUUsCisJIDB4NEEsIDB4QTEsIDB4RjksIDB4NTEsIDB4MjksIDB4RTUsIDB4RTUsIDB4NDYsIDB4NzAsIDB4RjF9LAorCXsweDM0LCAweEFBLCAweDk3LCAweDNDLCAweEQ0LCAweEM0LCAweERBLCAweEE0LCAweEY2LCAweDFFLAorCSAweEVCLCAweDJCLCAweERCLCAweEFELCAweDI3LCAweDMxLCAweDY1LCAweDM0LCAweDAxLCAweDZGfQorfTsKKworLyoKKyAqIENoZWNrdXAgcm91dGluZQorICovCitpbnQgc2hhMV9zZWxmX3Rlc3QgKHZvaWQpCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgY2hhciBidWZbMTAwMF07CisJdW5zaWduZWQgY2hhciBzaGExc3VtWzIwXTsKKwlzaGExX2NvbnRleHQgY3R4OworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlwcmludGYgKCIgIFNIQS0xIHRlc3QgIyVkOiAiLCBpICsgMSk7CisKKwkJc2hhMV9zdGFydHMgKCZjdHgpOworCisJCWlmIChpIDwgMikKKwkJCXNoYTFfdXBkYXRlICgmY3R4LCAodW5zaWduZWQgY2hhciAqKSBzaGExX3Rlc3Rfc3RyW2ldLAorCQkJCSAgICAgc3RybGVuIChzaGExX3Rlc3Rfc3RyW2ldKSk7CisJCWVsc2UgeworCQkJbWVtc2V0IChidWYsICdhJywgMTAwMCk7CisJCQlmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKQorCQkJCXNoYTFfdXBkYXRlICgmY3R4LCBidWYsIDEwMDApOworCQl9CisKKwkJc2hhMV9maW5pc2ggKCZjdHgsIHNoYTFzdW0pOworCisJCWlmIChtZW1jbXAgKHNoYTFzdW0sIHNoYTFfdGVzdF9zdW1baV0sIDIwKSAhPSAwKSB7CisJCQlwcmludGYgKCJmYWlsZWRcbiIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCisJCXByaW50ZiAoInBhc3NlZFxuIik7CisJfQorCisJcHJpbnRmICgiXG4iKTsKKwlyZXR1cm4gKDApOworfQorI2Vsc2UKK2ludCBzaGExX3NlbGZfdGVzdCAodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9ib2FyZC5jIGIvbGliX2kzODYvYm9hcmQuYwppbmRleCA0MTc1ZmRiMWMuLjQ3ZmJhYjQgMTAwNjQ0Ci0tLSBhL2xpYl9pMzg2L2JvYXJkLmMKKysrIGIvbGliX2kzODYvYm9hcmQuYwpAQCAtMzEzLDEzICszMTMsMTMgQEAKIAltaXNjX2luaXRfcigpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkgJiYgIWRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAlwdXRzICgiUENNQ0lBOiIpOwogCXBjbWNpYV9pbml0KCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAlwdXRzKCJLR0RCOiAgIik7CiAJa2dkYl9pbml0KCk7CkBAIC0zNDgsMzMgKzM0OCwzMyBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKIAlXQVRDSERPR19SRVNFVCgpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAlwdXRzKCJJREU6ICAgIik7CiAJaWRlX2luaXQoKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0lERSAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cygiU0NTSTogICIpOwogCXNjc2lfaW5pdCgpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIAlXQVRDSERPR19SRVNFVCgpOwogCXB1dHMoIkRPQzogICAiKTsKIAlkb2NfaW5pdCgpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpZiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAlwdXRzKCJOZXQ6ICAgIik7CkBAIC0zODIsNyArMzgyLDcgQEAKIAlldGhfaW5pdGlhbGl6ZShnZC0+YmQpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmICgwKQorI2lmICggZGVmaW5lZChDT05GSUdfQ01EX05FVCkpICYmICgwKQogCVdBVENIRE9HX1JFU0VUKCk7CiAjIGlmZGVmIERFQlVHCiAJcHV0cyAoIlJlc2V0IEV0aGVybmV0IFBIWVxuIik7CmRpZmYgLS1naXQgYS9saWJfbTY4ay9ib2FyZC5jIGIvbGliX202OGsvYm9hcmQuYwppbmRleCA2YWFmNjA5Li4yOTNmZDA0IDEwMDY0NAotLS0gYS9saWJfbTY4ay9ib2FyZC5jCisrKyBiL2xpYl9tNjhrL2JvYXJkLmMKQEAgLTM0LDIwICszNCwyMCBAQAogI2luY2x1ZGUgPGFzbS9pbW1hcF81MjcyLmg+CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2luY2x1ZGUgPGlkZS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkKICNpbmNsdWRlIDxzY3NpLmg+CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2luY2x1ZGUgPGtnZGIuaD4KICNlbmRpZgogI2lmZGVmIENPTkZJR19TVEFUVVNfTEVECiAjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2VuZGlmCiAjaW5jbHVkZSA8bmV0Lmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAjaW5jbHVkZSA8Y21kX2JlZGJ1Zy5oPgogI2VuZGlmCiAjaWZkZWYgQ0ZHX0FMTE9DX0RQUkFNCkBAIC01ODQsNyArNTg0LDcgQEAKIAltaXNjX2luaXRfciAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlXQVRDSERPR19SRVNFVCAoKTsKIAlwdXRzICgiS0dEQjogICIpOwogCWtnZGJfaW5pdCAoKTsKQEAgLTYyMCwyNyArNjIwLDI3IEBACiAJaWYgKChzID0gZ2V0ZW52ICgibG9hZGFkZHIiKSkgIT0gTlVMTCkgewogCQlsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bCAocywgTlVMTCwgMTYpOwogCX0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlpZiAoKHMgPSBnZXRlbnYgKCJib290ZmlsZSIpKSAhPSBOVUxMKSB7CiAJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBzLCBzaXplb2YgKEJvb3RGaWxlKSk7CiAJfQotI2VuZGlmIC8qIENGR19DTURfTkVUICovCisjZW5kaWYKIAogCVdBVENIRE9HX1JFU0VUICgpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIkRPQzogICAiKTsKIAlkb2NfaW5pdCAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlXQVRDSERPR19SRVNFVCAoKTsKIAlwdXRzICgiTkFORDogICIpOwogCW5hbmRfaW5pdCgpOwkJLyogZ28gaW5pdCB0aGUgTkFORCAqLwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoRkVDX0VORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChGRUNfRU5FVCkKIAlXQVRDSERPR19SRVNFVCgpOwogCWV0aF9pbml0KGJkKTsKICNlbmRpZgpAQCAtNjU5LDcgKzY1OSw3IEBACiAJbGFzdF9zdGFnZV9pbml0ICgpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIAlXQVRDSERPR19SRVNFVCAoKTsKIAliZWRidWdfaW5pdCAoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliX202OGsvbTY4a19saW51eC5jIGIvbGliX202OGsvbTY4a19saW51eC5jCmluZGV4IGY4N2Y1NmUuLjZjMTk0ZjggMTAwNjQ0Ci0tLSBhL2xpYl9tNjhrL202OGtfbGludXguYworKysgYi9saWJfbTY4ay9tNjhrX2xpbnV4LmMKQEAgLTM0LDEzICszNCw2IEBACiAjZGVmaW5lIExJTlVYX01BWF9FTlZTCQkyNTYKICNkZWZpbmUgTElOVVhfTUFYX0FSR1MJCTI1NgogCi0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQlzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQotI2Vsc2UKLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCi0jZW5kaWYKLQogZXh0ZXJuIGltYWdlX2hlYWRlcl90IGhlYWRlcjsJLyogZnJvbSBjbWRfYm9vdG0uYyAqLwogCiBleHRlcm4gaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOwpAQCAtNzMsNyArNjYsNyBAQAogCSAqIENoZWNrIGlmIHRoZXJlIGlzIGFuIGluaXRyZCBpbWFnZQogCSAqLwogCWlmIChhcmdjID49IDMpIHsKLQkJU0hPV19CT09UX1BST0dSRVNTICg5KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICg5KTsKIAogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKIApAQCAtODQsNyArNzcsNyBAQAogCiAJCWlmIChudG9obCAoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKIAkJCXByaW50ZiAoIkJhZCBNYWdpYyBOdW1iZXJcbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTApOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTApOwogCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQogCkBAIC05NiwxMSArODksMTEgQEAKIAogCQlpZiAoY3JjMzIgKDAsIChjaGFyICopIGRhdGEsIGxlbikgIT0gY2hlY2tzdW0pIHsKIAkJCXByaW50ZiAoIkJhZCBIZWFkZXIgQ2hlY2tzdW1cbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTEpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTEpOwogCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTApOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDEwKTsKIAogCQlwcmludF9pbWFnZV9oZHIgKGhkcik7CiAKQEAgLTExNCwxOSArMTA3LDE5IEBACiAJCQljc3VtID0gY3JjMzIgKDAsIChjaGFyICopIGRhdGEsIGxlbik7CiAJCQlpZiAoY3N1bSAhPSBudG9obCAoaGRyLT5paF9kY3JjKSkgewogCQkJCXByaW50ZiAoIkJhZCBEYXRhIENSQ1xuIik7Ci0JCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTIpOworCQkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEyKTsKIAkJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQkJfQogCQkJcHJpbnRmICgiT0tcbiIpOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTEpOwogCiAJCWlmICgoaGRyLT5paF9vcyAhPSBJSF9PU19MSU5VWCkgfHwKIAkJICAgIChoZHItPmloX2FyY2ggIT0gSUhfQ1BVX002OEspIHx8CiAJCSAgICAoaGRyLT5paF90eXBlICE9IElIX1RZUEVfUkFNRElTSykpIHsKIAkJCXByaW50ZiAoIk5vIExpbnV4IE02OEsgUmFtZGlzayBJbWFnZVxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMyk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMyk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKQEAgLTEzNyw3ICsxMzAsNyBAQAogCQl1bG9uZyB0YWlsID0gbnRvaGwgKGxlbl9wdHJbMF0pICUgNDsKIAkJaW50IGk7CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMyk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTMpOwogCiAJCS8qIHNraXAga2VybmVsIGxlbmd0aCBhbmQgdGVybWluYXRvciAqLwogCQlkYXRhID0gKHVsb25nKSAoJmxlbl9wdHJbMl0pOwpAQCAtMTU2LDcgKzE0OSw3IEBACiAJCS8qCiAJCSAqIG5vIGluaXRyZCBpbWFnZQogCQkgKi8KLQkJU0hPV19CT09UX1BST0dSRVNTICgxNCk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTQpOwogCiAJCWRhdGEgPSAwOwogCX0KQEAgLTE3NSw3ICsxNjgsNyBAQAogCQlpbml0cmRfZW5kID0gMDsKIAl9CiAKLQlTSE9XX0JPT1RfUFJPR1JFU1MgKDE1KTsKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE1KTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRmICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4bHgpIC4uLlxuIiwKZGlmZiAtLWdpdCBhL2xpYl9taWNyb2JsYXplL2JvYXJkLmMgYi9saWJfbWljcm9ibGF6ZS9ib2FyZC5jCmluZGV4IGM5NTEyNWEuLjA5ZDRkOTQgMTAwNjQ0Ci0tLSBhL2xpYl9taWNyb2JsYXplL2JvYXJkLmMKKysrIGIvbGliX21pY3JvYmxhemUvYm9hcmQuYwpAQCAtNDAsNyArNDAsNyBAQAogI2lmZGVmIENGR19JTlRDXzAKIGV4dGVybiBpbnQgaW50ZXJydXB0c19pbml0ICh2b2lkKTsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogZXh0ZXJuIGludCBldGhfaW5pdCAoYmRfdCAqIGJpcyk7CiBleHRlcm4gaW50IGdldGVudl9JUGFkZHIgKGNoYXIgKik7CiAjZW5kaWYKQEAgLTEwOCw3ICsxMDgsNyBAQAogCWJkX3QgKmJkOwogCWluaXRfZm5jX3QgKippbml0X2ZuY19wdHI7CiAJZ2QgPSAoZ2RfdCAqKSBDRkdfR0JMX0RBVEFfT0ZGU0VUOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAl1bG9uZyBmbGFzaF9zaXplID0gMDsKICNlbmRpZgogCWFzbSAoIm5vcCIpOwkvKiBGSVhNRSBnZCBpcyBub3QgaW5pdGlhbGl6ZSAtIHdhaXQgKi8KQEAgLTEzMCw3ICsxMzAsNyBAQAogCQl9CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCWJkLT5iaV9mbGFzaHN0YXJ0ID0gQ0ZHX0ZMQVNIX0JBU0U7CiAJaWYgKDAgPCAoZmxhc2hfc2l6ZSA9IGZsYXNoX2luaXQgKCkpKSB7CiAJCWJkLT5iaV9mbGFzaHNpemUgPSBmbGFzaF9zaXplOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAljaGFyICpzLCAqZTsKIAlpbnQgaTsKIAkvKiBib2FyZCBNQUMgYWRkcmVzcyAqLwpkaWZmIC0tZ2l0IGEvbGliX21pY3JvYmxhemUvbWljcm9ibGF6ZV9saW51eC5jIGIvbGliX21pY3JvYmxhemUvbWljcm9ibGF6ZV9saW51eC5jCmluZGV4IDJjNzg4NWMuLjY4YjU4ZDQgMTAwNjQ0Ci0tLSBhL2xpYl9taWNyb2JsYXplL21pY3JvYmxhemVfbGludXguYworKysgYi9saWJfbWljcm9ibGF6ZS9taWNyb2JsYXplX2xpbnV4LmMKQEAgLTMyLDEzICszMiw2IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKSAgICAgICAgc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KIGV4dGVybiBpbWFnZV9oZWFkZXJfdCBoZWFkZXI7CS8qIGZyb20gY21kX2Jvb3RtLmMgKi8KIC8qY21kX2Jvb3QuYyovCiBleHRlcm4gaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOwpAQCAtNTksNyArNTIsNyBAQAogCiAJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gaW5pdHJkIGltYWdlICovCiAJaWYgKGFyZ2MgPj0gMykgewotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDkpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDkpOwogCiAJCWFkZHIgPSBzaW1wbGVfc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMTYpOwogCkBAIC03MCw3ICs2Myw3IEBACiAKIAkJaWYgKG50b2hsIChoZHItPmloX21hZ2ljKSAhPSBJSF9NQUdJQykgewogCQkJcHJpbnRmICgiQmFkIE1hZ2ljIE51bWJlclxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMCk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMCk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKQEAgLTgyLDExICs3NSwxMSBAQAogCiAJCWlmIChjcmMzMiAoMCwgKGNoYXIgKilkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CiAJCQlwcmludGYgKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTExKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTExKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDEwKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMCk7CiAKIAkJcHJpbnRfaW1hZ2VfaGRyIChoZHIpOwogCkBAIC0xMDAsMTkgKzkzLDE5IEBACiAJCQljc3VtID0gY3JjMzIgKDAsIChjaGFyICopZGF0YSwgbGVuKTsKIAkJCWlmIChjc3VtICE9IG50b2hsIChoZHItPmloX2RjcmMpKSB7CiAJCQkJcHJpbnRmICgiQmFkIERhdGEgQ1JDXG4iKTsKLQkJCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMik7CisJCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTIpOwogCQkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCQl9CiAJCQlwcmludGYgKCJPS1xuIik7CiAJCX0KIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDExKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMSk7CiAKIAkJaWYgKChoZHItPmloX29zICE9IElIX09TX0xJTlVYKSB8fAogCQkgICAgKGhkci0+aWhfYXJjaCAhPSBJSF9DUFVfTUlDUk9CTEFaRSkgfHwKIAkJICAgIChoZHItPmloX3R5cGUgIT0gSUhfVFlQRV9SQU1ESVNLKSkgewogCQkJcHJpbnRmICgiTm8gTGludXggTWljcm9ibGF6ZSBSYW1kaXNrIEltYWdlXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEzKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEzKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIApAQCAtMTIyLDcgKzExNSw3IEBACiAJfSBlbHNlIGlmICgoaGRyLT5paF90eXBlID09IElIX1RZUEVfTVVMVEkpICYmIChsZW5fcHRyWzFdKSkgewogCQl1bG9uZyB0YWlsID0gbnRvaGwgKGxlbl9wdHJbMF0pICUgNDsKIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDEzKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMyk7CiAKIAkJLyogc2tpcCBrZXJuZWwgbGVuZ3RoIGFuZCB0ZXJtaW5hdG9yICovCiAJCWRhdGEgPSAodWxvbmcpICgmbGVuX3B0clsyXSk7CkBAIC0xNDEsNyArMTM0LDcgQEAKIAkJLyoKIAkJICogbm8gaW5pdHJkIGltYWdlCiAJCSAqLwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDE0KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxNCk7CiAKIAkJZGF0YSA9IDA7CiAJfQpAQCAtMTYwLDcgKzE1Myw3IEBACiAJCWluaXRyZF9lbmQgPSAwOwogCX0KIAotCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTUpOworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTUpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGYgKCIjIyBUcmFuc2ZlcnJpbmcgY29udHJvbCB0byBMaW51eCAoYXQgYWRkcmVzcyAlMDhseCkgLi4uXG4iLApkaWZmIC0tZ2l0IGEvbGliX21pcHMvYm9hcmQuYyBiL2xpYl9taXBzL2JvYXJkLmMKaW5kZXggYjdkMzM1Ni4uOTFjY2VjMCAxMDA2NDQKLS0tIGEvbGliX21pcHMvYm9hcmQuYworKysgYi9saWJfbWlwcy9ib2FyZC5jCkBAIC0zOTksMTggKzM5OSwxOCBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZgkvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NSVNDX0lOSVRfUikKIAkvKiBtaXNjZWxsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMgKi8KIAltaXNjX2luaXRfciAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAjaWYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQogCXB1dHMgKCJOZXQ6ICAgIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYl9taXBzL21pcHNfbGludXguYyBiL2xpYl9taXBzL21pcHNfbGludXguYwppbmRleCA5NTJkNWE5Li41NTZiMTgwIDEwMDY0NAotLS0gYS9saWJfbWlwcy9taXBzX2xpbnV4LmMKKysrIGIvbGliX21pcHMvbWlwc19saW51eC5jCkBAIC0zMywxMyArMzMsNiBAQAogI2RlZmluZQlMSU5VWF9NQVhfRU5WUwkJMjU2CiAjZGVmaW5lCUxJTlVYX01BWF9BUkdTCQkyNTYKIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KIGV4dGVybiBpbWFnZV9oZWFkZXJfdCBoZWFkZXI7ICAgICAgICAgICAvKiBmcm9tIGNtZF9ib290bS5jICovCiAKIGV4dGVybiBpbnQgZG9fcmVzZXQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKQEAgLTczLDcgKzY2LDcgQEAKIAkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBpbml0cmQgaW1hZ2UKIAkgKi8KIAlpZiAoYXJnYyA+PSAzKSB7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoOSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoOSk7CiAKIAkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzJdLCBOVUxMLCAxNik7CiAKQEAgLTg0LDcgKzc3LDcgQEAKIAogCQlpZiAobnRvaGwgKGhkci0+aWhfbWFnaWMpICE9IElIX01BR0lDKSB7CiAJCQlwcmludGYgKCJCYWQgTWFnaWMgTnVtYmVyXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEwKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEwKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIApAQCAtOTYsMTEgKzg5LDExIEBACiAKIAkJaWYgKGNyYzMyICgwLCAodWNoYXIgKikgZGF0YSwgbGVuKSAhPSBjaGVja3N1bSkgewogCQkJcHJpbnRmICgiQmFkIEhlYWRlciBDaGVja3N1bVxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMSk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMSk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMCk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTApOwogCiAJCXByaW50X2ltYWdlX2hkciAoaGRyKTsKIApAQCAtMTE0LDE5ICsxMDcsMTkgQEAKIAkJCWNzdW0gPSBjcmMzMiAoMCwgKHVjaGFyICopIGRhdGEsIGxlbik7CiAJCQlpZiAoY3N1bSAhPSBudG9obCAoaGRyLT5paF9kY3JjKSkgewogCQkJCXByaW50ZiAoIkJhZCBEYXRhIENSQ1xuIik7Ci0JCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTIpOworCQkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEyKTsKIAkJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQkJfQogCQkJcHJpbnRmICgiT0tcbiIpOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTEpOwogCiAJCWlmICgoaGRyLT5paF9vcyAhPSBJSF9PU19MSU5VWCkgfHwKIAkJICAgIChoZHItPmloX2FyY2ggIT0gSUhfQ1BVX01JUFMpIHx8CiAJCSAgICAoaGRyLT5paF90eXBlICE9IElIX1RZUEVfUkFNRElTSykpIHsKIAkJCXByaW50ZiAoIk5vIExpbnV4IE1JUFMgUmFtZGlzayBJbWFnZVxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMyk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMyk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKQEAgLTEzNyw3ICsxMzAsNyBAQAogCQl1bG9uZyB0YWlsID0gbnRvaGwgKGxlbl9wdHJbMF0pICUgNDsKIAkJaW50IGk7CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMyk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTMpOwogCiAJCS8qIHNraXAga2VybmVsIGxlbmd0aCBhbmQgdGVybWluYXRvciAqLwogCQlkYXRhID0gKHVsb25nKSAoJmxlbl9wdHJbMl0pOwpAQCAtMTU2LDcgKzE0OSw3IEBACiAJCS8qCiAJCSAqIG5vIGluaXRyZCBpbWFnZQogCQkgKi8KLQkJU0hPV19CT09UX1BST0dSRVNTICgxNCk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTQpOwogCiAJCWRhdGEgPSAwOwogCX0KQEAgLTE3NSw3ICsxNjgsNyBAQAogCQlpbml0cmRfZW5kID0gMDsKIAl9CiAKLQlTSE9XX0JPT1RfUFJPR1JFU1MgKDE1KTsKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE1KTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRmICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4bHgpIC4uLlxuIiwKZGlmZiAtLWdpdCBhL2xpYl9wcGMvYm9hcmQuYyBiL2xpYl9wcGMvYm9hcmQuYwppbmRleCBjNGZjNTgwLi5jODdkNDZjIDEwMDY0NAotLS0gYS9saWJfcHBjL2JvYXJkLmMKKysrIGIvbGliX3BwYy9ib2FyZC5jCkBAIC0zNSwxMyArMzUsMTMgQEAKICNpZmRlZiBDT05GSUdfTVBDNXh4eAogI2luY2x1ZGUgPG1wYzV4eHguaD4KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2luY2x1ZGUgPGlkZS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkKICNpbmNsdWRlIDxzY3NpLmg+CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2luY2x1ZGUgPGtnZGIuaD4KICNlbmRpZgogI2lmZGVmIENPTkZJR19TVEFUVVNfTEVECkBAIC04MCwxNCArODAsMTQgQEAKIGV4dGVybiB2b2lkIHNjM19yZWFkX2VlcHJvbSh2b2lkKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiB2b2lkIGRvY19pbml0ICh2b2lkKTsKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0hBUkRfSTJDKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU09GVF9JMkMpCiAjaW5jbHVkZSA8aTJjLmg+CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogdm9pZCBuYW5kX2luaXQgKHZvaWQpOwogI2VuZGlmCiAKQEAgLTExOCw3ICsxMTgsNyBAQAogZXh0ZXJuIHVsb25nIF9lbmQ7CiB1bG9uZyBtb25pdG9yX2ZsYXNoX2xlbjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogI2luY2x1ZGUgPGJlZGJ1Zy90eXBlLmg+CiAjZW5kaWYKIApAQCAtMTM5LDEwICsxMzksMTAgQEAKICAqLwogc3RhdGljIHZvaWQgbWVtX21hbGxvY19pbml0ICh2b2lkKQogewotCXVsb25nIGRlc3RfYWRkciA9IENGR19NT05JVE9SX0JBU0UgKyBnZC0+cmVsb2Nfb2ZmOwotCi0JbWVtX21hbGxvY19lbmQgPSBkZXN0X2FkZHI7Ci0JbWVtX21hbGxvY19zdGFydCA9IGRlc3RfYWRkciAtIFRPVEFMX01BTExPQ19MRU47CisjaWYgIWRlZmluZWQoQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTKQorCW1lbV9tYWxsb2NfZW5kID0gQ0ZHX01PTklUT1JfQkFTRSArIGdkLT5yZWxvY19vZmY7CisjZW5kaWYKKwltZW1fbWFsbG9jX3N0YXJ0ID0gbWVtX21hbGxvY19lbmQgLSBUT1RBTF9NQUxMT0NfTEVOOwogCW1lbV9tYWxsb2NfYnJrID0gbWVtX21hbGxvY19zdGFydDsKIAogCW1lbXNldCAoKHZvaWQgKikgbWVtX21hbGxvY19zdGFydCwKQEAgLTMwOSw3ICszMDksOSBAQAogCXBydF84MjYwX3JzciwKIAlwcnRfODI2MF9jbGtzLAogI2VuZGlmIC8qIENPTkZJR184MjYwICovCi0KKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4M1hYKQorCXBydF84M3h4X3JzciwKKyNlbmRpZgogCWNoZWNrY3B1LAogI2lmIGRlZmluZWQoQ09ORklHX01QQzV4eHgpCiAJcHJ0X21wYzV4eHhfY2xrcywKQEAgLTM3Niw3ICszNzgsNyBAQAogCS8qIGNvbXBpbGVyIG9wdGltaXphdGlvbiBiYXJyaWVyIG5lZWRlZCBmb3IgR0NDID49IDMuNCAqLwogCV9fYXNtX18gX192b2xhdGlsZV9fKCIiOiA6IDoibWVtb3J5Iik7CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfQ1BNMikKKyNpZiAhZGVmaW5lZChDT05GSUdfQ1BNMikgJiYgIWRlZmluZWQoQ09ORklHX01QQzgzWFgpCiAJLyogQ2xlYXIgaW5pdGlhbCBnbG9iYWwgZGF0YSAqLwogCW1lbXNldCAoKHZvaWQgKikgZ2QsIDAsIHNpemVvZiAoZ2RfdCkpOwogI2VuZGlmCkBAIC02MjAsNyArNjIyLDEzIEBACiAJYmQgPSBnZC0+YmQ7CiAKIAlnZC0+ZmxhZ3MgfD0gR0RfRkxHX1JFTE9DOwkvKiB0ZWxsIG90aGVyczogcmVsb2NhdGlvbiBkb25lICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19SRUxPQ19GSVhVUF9XT1JLUykKKwlnZC0+cmVsb2Nfb2ZmID0gMDsKKwltZW1fbWFsbG9jX2VuZCA9IGRlc3RfYWRkcjsKKyNlbHNlCiAJZ2QtPnJlbG9jX29mZiA9IGRlc3RfYWRkciAtIENGR19NT05JVE9SX0JBU0U7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfTVVMVEkKIAlzZXJpYWxfaW5pdGlhbGl6ZSgpOwpAQCAtNzc5LDcgKzc4Nyw3IEBACiAJc3BpX2luaXRfciAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlXQVRDSERPR19SRVNFVCAoKTsKIAlwdXRzICgiTkFORDogICIpOwogCW5hbmRfaW5pdCgpOwkJLyogZ28gaW5pdCB0aGUgTkFORCAqLwpAQCAtODk2LDcgKzkwNCw4IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19UUU04eHhMKSB8fCBkZWZpbmVkKENPTkZJR19UUU04MjYwKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfVFFNODI3MikgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NDTSkgfHwgZGVmaW5lZChDT05GSUdfS1VQNEspIHx8IGRlZmluZWQoQ09ORklHX0tVUDRYKQorICAgIGRlZmluZWQoQ09ORklHX0NDTSkgfHwgZGVmaW5lZChDT05GSUdfS1VQNEspIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19LVVA0WCkgfHwgZGVmaW5lZChDT05GSUdfUENTNDQwRVApCiAJbG9hZF9zZXJudW1fZXRoYWRkciAoKTsKICNlbmRpZgogCS8qIElQIEFkZHJlc3MgKi8KQEAgLTk0MSw3ICs5NTAsNyBAQAogCQloZXJtZXNfc3RhcnRfbHh0OTgwICgoaW50KSBiZC0+YmlfZXRoc3BlZWQpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJLR0RCOiAgIik7CiAJa2dkYl9pbml0ICgpOwpAQCAtOTYxLDcgKzk3MCw3IEBACiAJc2VyaWFsX2J1ZmZlcmVkX2luaXQoKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NUQVRVU19MRUQKKyNpZiBkZWZpbmVkKENPTkZJR19TVEFUVVNfTEVEKSAmJiBkZWZpbmVkKFNUQVRVU19MRURfQk9PVCkKIAlzdGF0dXNfbGVkX3NldCAoU1RBVFVTX0xFRF9CT09ULCBTVEFUVVNfTEVEX0JMSU5LSU5HKTsKICNlbmRpZgogCkBAIC05NzMsMjcgKzk4MiwyNyBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKIAlXQVRDSERPR19SRVNFVCAoKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIlNDU0k6ICAiKTsKIAlzY3NpX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJET0M6ICAgIik7CiAJZG9jX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogI2lmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAlXQVRDSERPR19SRVNFVCAoKTsKIAlwdXRzICgiTmV0OiAgICIpOwpAQCAtMTAwMSw3ICsxMDEwLDcgQEAKIAlldGhfaW5pdGlhbGl6ZSAoYmQpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmICggXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmICggXAogICAgIGRlZmluZWQoQ09ORklHX0NDTSkJCXx8IFwKICAgICBkZWZpbmVkKENPTkZJR19FTFBUODYwKQl8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfRVA4MjYwKQl8fCBcCkBAIC0xMDI2LDEzICsxMDM1LDE0IEBACiAJcG9zdF9ydW4gKE5VTEwsIFBPU1RfUkFNIHwgcG9zdF9ib290bW9kZV9nZXQoMCkpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkgXAorICAgICYmICFkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJQQ01DSUE6Iik7CiAJcGNtY2lhX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUICgpOwogIyBpZmRlZglDT05GSUdfSURFXzh4eF9QQ0NBUkQKIAlwdXRzICgiUENNQ0lBOiIpOwpAQCAtMTA0NSw3ICsxMDU1LDcgQEAKICNlbHNlCiAJaWRlX2luaXQgKCk7CiAjZW5kaWYKLSNlbmRpZiAvKiBDRkdfQ01EX0lERSAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTEFTVF9TVEFHRV9JTklUCiAJV0FUQ0hET0dfUkVTRVQgKCk7CkBAIC0xMDU3LDcgKzEwNjcsNyBAQAogCWxhc3Rfc3RhZ2VfaW5pdCAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJYmVkYnVnX2luaXQgKCk7CiAjZW5kaWYKQEAgLTExMTYsOSArMTEyNiw3IEBACiB2b2lkIGhhbmcgKHZvaWQpCiB7CiAJcHV0cyAoIiMjIyBFUlJPUiAjIyMgUGxlYXNlIFJFU0VUIHRoZSBib2FyZCAjIyNcbiIpOwotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKIAlzaG93X2Jvb3RfcHJvZ3Jlc3MoLTMwKTsKLSNlbmRpZgogCWZvciAoOzspOwogfQogCmRpZmYgLS1naXQgYS9saWJfcHBjL2V4dGFibGUuYyBiL2xpYl9wcGMvZXh0YWJsZS5jCmluZGV4IDgzNTQ0MTEuLjJkOTk1ZmEgMTAwNjQ0Ci0tLSBhL2xpYl9wcGMvZXh0YWJsZS5jCisrKyBiL2xpYl9wcGMvZXh0YWJsZS5jCkBAIC04OSw3ICs4OSw3IEBACiAJLyogaWYgdGhlIHNlcmlhbCBwb3J0IGRvZXMgbm90IGhhbmcgaW4gZXhjZXB0aW9uLCBwcmludGYgY2FuIGJlIHVzZWQgKi8KICNpZiAhZGVmaW5lZChDRkdfU0VSSUFMX0hBTkdfSU5fRVhDRVBUSU9OKQogCWlmIChleF90YWJfbWVzc2FnZSkKLQkJcHJpbnRmKCJCdXMgRmF1bHQgQCAweCUwOGx4LCBmaXh1cCAweCUwOGx4XG4iLCBhZGRyLCByZXQpOworCQlkZWJ1ZygiQnVzIEZhdWx0IEAgMHglMDhseCwgZml4dXAgMHglMDhseFxuIiwgYWRkciwgcmV0KTsKICNlbmRpZgogCWlmIChyZXQpIHJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2xpYl9wcGMva2dkYi5jIGIvbGliX3BwYy9rZ2RiLmMKaW5kZXggNGM1ZDc5YS4uNzhjMmYwYyAxMDA2NDQKLS0tIGEvbGliX3BwYy9rZ2RiLmMKKysrIGIvbGliX3BwYy9rZ2RiLmMKQEAgLTEsNyArMSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAogI2luY2x1ZGUgPGtnZGIuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CkBAIC0zMjMsNCArMzIzLDQgQEAKIAkgICAgIik7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliZmR0L2ZkdC5jIGIvbGliZmR0L2ZkdC5jCmluZGV4IDIxMmI4MzguLjFlZTY3YWQgMTAwNjQ0Ci0tLSBhL2xpYmZkdC9mZHQuYworKysgYi9saWJmZHQvZmR0LmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC04MywzICs4Niw1IEBACiAJbWVtbW92ZShidWYsIGZkdCwgZmR0X3RvdGFsc2l6ZShmZHQpKTsKIAlyZXR1cm4gMDsKIH0KKworI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KZGlmZiAtLWdpdCBhL2xpYmZkdC9mZHRfcm8uYyBiL2xpYmZkdC9mZHRfcm8uYwppbmRleCA0ZTJjMzI1Li40NmQ1MjVkIDEwMDY0NAotLS0gYS9saWJmZHQvZmR0X3JvLmMKKysrIGIvbGliZmR0L2ZkdF9yby5jCkBAIC0xNiw2ICsxNiw5IEBACiAgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIENPTkZJR19PRl9MSUJGRFQKKwogI2luY2x1ZGUgImxpYmZkdF9lbnYuaCIKIAogI2luY2x1ZGUgPGZkdC5oPgpAQCAtNDgsNiArNTEsMzMgQEAKIH0KIAogLyoKKyAqIENoZWNrcyBpZiB0aGUgcHJvcGVydHkgbmFtZSBtYXRjaGVzLgorICovCitzdGF0aWMgaW50IHByb3BfbmFtZV9lcShjb25zdCB2b2lkICpmZHQsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICoqcHJvcCwgaW50ICpsZW5wKQoreworCWludCBuYW1lc3Ryb2ZmLCBsZW47CisKKwkqcHJvcCA9IGZkdF9vZmZzZXRfcHRyX3R5cGVkKGZkdCwgb2Zmc2V0LCAqcHJvcCk7CisJaWYgKCEgKnByb3ApCisJCXJldHVybiAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7CisKKwluYW1lc3Ryb2ZmID0gZmR0MzJfdG9fY3B1KCgqcHJvcCktPm5hbWVvZmYpOworCWlmIChzdHJlcShmZHRfc3RyaW5nKGZkdCwgbmFtZXN0cm9mZiksIG5hbWUpKSB7CisJCWxlbiA9IGZkdDMyX3RvX2NwdSgoKnByb3ApLT5sZW4pOworCQkqcHJvcCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zmc2V0LAorCQkJCSAgICAgICBzaXplb2YoKipwcm9wKSArIGxlbik7CisJCWlmICgqcHJvcCkgeworCQkJaWYgKGxlbnApCisJCQkJKmxlbnAgPSBsZW47CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUZEVF9FUlJfQkFEU1RSVUNUVVJFOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKICAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIG9mZnNldC4KICAqLwogY2hhciAqZmR0X3N0cmluZyhjb25zdCB2b2lkICpmZHQsIGludCBzdHJvZmZzZXQpCkBAIC01Niw2ICs4NiwxMTggQEAKIH0KIAogLyoKKyAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBjb21wYXRpYmxlIGJ5IGNvbXBhcmluZyB0aGUgdG9rZW5zCisgKiBpbiBpdHMgImNvbXBhdGlibGUiIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmc6CisgKgorICogICBub2Rlb2Zmc2V0IC0gc3RhcnRpbmcgcGxhY2Ugb2YgdGhlIG5vZGUKKyAqICAgY29tcGF0ICAgICAtIHRoZSBzdHJpbmcgdG8gbWF0Y2ggdG8gb25lIG9mIHRoZSB0b2tlbnMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAiY29tcGF0aWJsZSIgbGlzdC4KKyAqLworaW50IGZkdF9ub2RlX2lzX2NvbXBhdGlibGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwKKwkJCSAgIGNvbnN0IGNoYXIgKmNvbXBhdCkKK3sKKwljb25zdCBjaGFyKiBjcDsKKwlpbnQgY3BsZW4sIGxlbjsKKworCWNwID0gZmR0X2dldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCAiY29tcGF0aWJsZSIsICZjcGxlbik7CisJaWYgKGNwID09IE5VTEwpCisJCXJldHVybiAwOworCXdoaWxlIChjcGxlbiA+IDApIHsKKwkJaWYgKHN0cm5jbXAoY3AsIGNvbXBhdCwgc3RybGVuKGNvbXBhdCkpID09IDApCisJCQlyZXR1cm4gMTsKKwkJbGVuID0gc3RybGVuKGNwKSArIDE7CisJCWNwICs9IGxlbjsKKwkJY3BsZW4gLT0gbGVuOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRmluZCBhIG5vZGUgYnkgaXRzIGRldmljZSB0eXBlIHByb3BlcnR5LiBPbiBzdWNjZXNzLCB0aGUgb2Zmc2V0IG9mIHRoYXQKKyAqIG5vZGUgaXMgcmV0dXJuZWQgb3IgYW4gZXJyb3IgY29kZSBvdGhlcndpc2U6CisgKgorICogICBub2Rlb2Zmc2V0IC0gdGhlIG5vZGUgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gb3IgMCwgdGhlIG5vZGUgeW91IHBhc3MKKyAqICAgICAgICAgICAgICAgIHdpbGwgbm90IGJlIHNlYXJjaGVkLCBvbmx5IHRoZSBuZXh0IG9uZSB3aWxsOyB0eXBpY2FsbHksCisgKiAgICAgICAgICAgICAgICB5b3UgcGFzcyAwIHRvIHN0YXJ0IHRoZSBzZWFyY2ggYW5kIHRoZW4gd2hhdCB0aGUgcHJldmlvdXMKKyAqICAgICAgICAgICAgICAgIGNhbGwgcmV0dXJuZWQuCisgKiAgIHR5cGUgICAgICAgLSB0aGUgZGV2aWNlIHR5cGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QuCisgKi8KK2ludCBmZHRfZmluZF9ub2RlX2J5X3R5cGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpbnQgb2Zmc2V0LCBuZXh0b2Zmc2V0OworCXN0cnVjdCBmZHRfcHJvcGVydHkgKnByb3A7CisJdWludDMyX3QgdGFnOworCWludCBsZW4sIHJldDsKKworCUNIRUNLX0hFQURFUihmZHQpOworCisJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgbm9kZW9mZnNldCwgJm5leHRvZmZzZXQsIE5VTEwpOworCWlmICh0YWcgIT0gRkRUX0JFR0lOX05PREUpCisJCXJldHVybiAtRkRUX0VSUl9CQURPRkZTRVQ7CisJaWYgKG5vZGVvZmZzZXQpCisJCW5vZGVvZmZzZXQgPSAwOwkvKiBzdGFydCBzZWFyY2hpbmcgd2l0aCBuZXh0IG5vZGUgKi8KKworCXdoaWxlICgxKSB7CisJCW9mZnNldCA9IG5leHRvZmZzZXQ7CisJCXRhZyA9IGZkdF9uZXh0X3RhZyhmZHQsIG9mZnNldCwgJm5leHRvZmZzZXQsIE5VTEwpOworCisJCXN3aXRjaCAodGFnKSB7CisJCWNhc2UgRkRUX0JFR0lOX05PREU6CisJCQlub2Rlb2Zmc2V0ID0gb2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBGRFRfUFJPUDoKKwkJCWlmIChub2Rlb2Zmc2V0ID09IDApCisJCQkJYnJlYWs7CisJCQlyZXQgPSBwcm9wX25hbWVfZXEoZmR0LCBvZmZzZXQsICJkZXZpY2VfdHlwZSIsCisJCQkJCSAgICZwcm9wLCAmbGVuKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQllbHNlIGlmIChyZXQgPiAwICYmCisJCQkJIHN0cm5jbXAocHJvcC0+ZGF0YSwgdHlwZSwgbGVuIC0gMSkgPT0gMCkKKwkJCSAgICByZXR1cm4gbm9kZW9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgRkRUX0VORF9OT0RFOgorCQljYXNlIEZEVF9OT1A6CisJCQlicmVhazsKKworCQljYXNlIEZEVF9FTkQ6CisJCQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7CisJCX0KKwl9Cit9CisKKy8qCisgKiBGaW5kIGEgbm9kZSBiYXNlZCBvbiBpdHMgZGV2aWNlIHR5cGUgYW5kIG9uZSBvZiB0aGUgdG9rZW5zIGluIGl0cyBpdHMKKyAqICJjb21wYXRpYmxlIiBwcm9wZXJ0eS4gT24gc3VjY2VzcywgdGhlIG9mZnNldCBvZiB0aGF0IG5vZGUgaXMgcmV0dXJuZWQKKyAqIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlOgorICoKKyAqICAgbm9kZW9mZnNldCAtIHRoZSBub2RlIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIG9yIDAsIHRoZSBub2RlIHlvdSBwYXNzCisgKiAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSBzZWFyY2hlZCwgb25seSB0aGUgbmV4dCBvbmUgd2lsbDsgdHlwaWNhbGx5LAorICogICAgICAgICAgICAgICAgeW91IHBhc3MgMCB0byBzdGFydCB0aGUgc2VhcmNoIGFuZCB0aGVuIHdoYXQgdGhlIHByZXZpb3VzCisgKiAgICAgICAgICAgICAgICBjYWxsIHJldHVybmVkLgorICogICB0eXBlICAgICAgIC0gdGhlIGRldmljZSB0eXBlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0LgorICogICBjb21wYXQgICAgIC0gdGhlIHN0cmluZyB0byBtYXRjaCB0byBvbmUgb2YgdGhlIHRva2VucyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICJjb21wYXRpYmxlIiBsaXN0LgorICovCitpbnQgZmR0X2ZpbmRfY29tcGF0aWJsZV9ub2RlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQkgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbXBhdCkKK3sKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV90eXBlKGZkdCwgbm9kZW9mZnNldCwgdHlwZSk7CisJaWYgKG9mZnNldCA8IDAgfHwgZmR0X25vZGVfaXNfY29tcGF0aWJsZShmZHQsIG9mZnNldCwgY29tcGF0KSkKKwkJcmV0dXJuIG9mZnNldDsKKworCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKK30KKworLyoKICAqIFJldHVybiB0aGUgbm9kZSBvZmZzZXQgb2YgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5OgogICogICBwYXJlbnRvZmZzZXQgLSBzdGFydGluZyBwbGFjZSAoMCB0byBzdGFydCBhdCB0aGUgcm9vdCkKICAqICAgbmFtZSAgICAgICAgIC0gbmFtZSBiZWluZyBzZWFyY2hlZCBmb3IKQEAgLTEyOSw3ICsyNzEsNyBAQAogICogU2VhcmNoZXMgZm9yIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHBhdGggYW5kIHJldHVybnMgdGhlCiAgKiBvZmZzZXQgb2YgdGhhdCBub2RlLgogICovCi1pbnQgZmR0X3BhdGhfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgY29uc3QgY2hhciAqcGF0aCkKK2ludCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKQogewogCWNvbnN0IGNoYXIgKmVuZCA9IHBhdGggKyBzdHJsZW4ocGF0aCk7CiAJY29uc3QgY2hhciAqcCA9IHBhdGg7CkBAIC0xNDEsNiArMjgzLDEwIEBACiAJaWYgKCpwYXRoICE9ICcvJykKIAkJcmV0dXJuIC1GRFRfRVJSX0JBRFBBVEg7CiAKKwkvKiBIYW5kbGUgdGhlIHJvb3QgcGF0aDogcm9vdCBvZmZzZXQgaXMgMCAqLworCWlmIChzdHJjbXAocGF0aCwgIi8iKSA9PSAwKQorCQlyZXR1cm4gMDsKKwogCXdoaWxlICgqcCkgewogCQljb25zdCBjaGFyICpxOwogCkBAIC0xODQsNyArMzMwLDYgQEAKIAlpbnQgbGV2ZWwgPSAwOwogCXVpbnQzMl90IHRhZzsKIAlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpwcm9wOwotCWludCBuYW1lc3Ryb2ZmOwogCWludCBvZmZzZXQsIG5leHRvZmZzZXQ7CiAJaW50IGVycjsKIApAQCAtMjI0LDI0ICszNjksMTEgQEAKIAkJCWlmIChsZXZlbCAhPSAwKQogCQkJCWNvbnRpbnVlOwogCi0JCQllcnIgPSAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7Ci0JCQlwcm9wID0gZmR0X29mZnNldF9wdHJfdHlwZWQoZmR0LCBvZmZzZXQsIHByb3ApOwotCQkJaWYgKCEgcHJvcCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQluYW1lc3Ryb2ZmID0gZmR0MzJfdG9fY3B1KHByb3AtPm5hbWVvZmYpOwotCQkJaWYgKHN0cmVxKGZkdF9zdHJpbmcoZmR0LCBuYW1lc3Ryb2ZmKSwgbmFtZSkpIHsKLQkJCQkvKiBGb3VuZCBpdCEgKi8KLQkJCQlpbnQgbGVuID0gZmR0MzJfdG9fY3B1KHByb3AtPmxlbik7Ci0JCQkJcHJvcCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zmc2V0LAotCQkJCQkJICAgICAgc2l6ZW9mKCpwcm9wKStsZW4pOwotCQkJCWlmICghIHByb3ApCi0JCQkJCWdvdG8gZmFpbDsKLQotCQkJCWlmIChsZW5wKQotCQkJCQkqbGVucCA9IGxlbjsKLQorCQkJZXJyID0gcHJvcF9uYW1lX2VxKGZkdCwgb2Zmc2V0LCBuYW1lLCAmcHJvcCwgbGVucCk7CisJCQlpZiAoZXJyID4gMCkKIAkJCQlyZXR1cm4gcHJvcDsKLQkJCX0KKwkJCWVsc2UgaWYgKGVyciA8IDApCisJCQkJZ290byBmYWlsOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBGRFRfTk9QOgpAQCAtNDAwLDMgKzUzMiw1IEBACiAJfQogCXJldHVybiAwOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvbGliZmR0L2ZkdF9ydy5jIGIvbGliZmR0L2ZkdF9ydy5jCmluZGV4IGFhYWZjNTMuLjY5M2JmZTQgMTAwNjQ0Ci0tLSBhL2xpYmZkdC9mZHRfcncuYworKysgYi9saWJmZHQvZmR0X3J3LmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC0yOTEsMyArMjk0LDUgQEAKIAlmZHRfc2V0X2hlYWRlcihmZHQsIHRvdGFsc2l6ZSwgX2Jsb2JfZGF0YV9zaXplKGZkdCkpOwogCXJldHVybiAwOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvbGliZmR0L2ZkdF9zdHJlcnJvci5jIGIvbGliZmR0L2ZkdF9zdHJlcnJvci5jCmluZGV4IDdmMjMxY2UuLmI0OWM5NTIgMTAwNjQ0Ci0tLSBhL2xpYmZkdC9mZHRfc3RyZXJyb3IuYworKysgYi9saWJmZHQvZmR0X3N0cmVycm9yLmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC02MiwzICs2NSw1IEBACiAKIAlyZXR1cm4gIjx1bmtub3duIGVycm9yPiI7CiB9CisKKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCmRpZmYgLS1naXQgYS9saWJmZHQvZmR0X3N3LmMgYi9saWJmZHQvZmR0X3N3LmMKaW5kZXggNjcyZjRkZC4uYzdlZWE4ZiAxMDA2NDQKLS0tIGEvbGliZmR0L2ZkdF9zdy5jCisrKyBiL2xpYmZkdC9mZHRfc3cuYwpAQCAtMTYsNiArMTYsOSBAQAogICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBDT05GSUdfT0ZfTElCRkRUCisKICNpbmNsdWRlICJsaWJmZHRfZW52LmgiCiAKICNpbmNsdWRlIDxmZHQuaD4KQEAgLTIyNCwzICsyMjcsNSBAQAogCWZkdF9zZXRfaGVhZGVyKGZkdCwgbWFnaWMsIEZEVF9NQUdJQyk7CiAJcmV0dXJuIDA7CiB9CisKKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCmRpZmYgLS1naXQgYS9saWJmZHQvZmR0X3dpcC5jIGIvbGliZmR0L2ZkdF93aXAuYwppbmRleCAyZDJlZDM3Li4yZDM5YWFiIDEwMDY0NAotLS0gYS9saWJmZHQvZmR0X3dpcC5jCisrKyBiL2xpYmZkdC9mZHRfd2lwLmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC0xMzUsMyArMTM4LDUgQEAKIAogCXJldHVybiAwOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2Jvb3RwLmMgYi9uZXQvYm9vdHAuYwppbmRleCAxZGU5YThmLi5iZTFlZTMzIDEwMDY0NAotLS0gYS9uZXQvYm9vdHAuYworKysgYi9uZXQvYm9vdHAuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjZGVmaW5lIEJPT1RQX1ZFTkRPUl9NQUdJQwkweDYzODI1MzYzCS8qIFJGQzEwNDggTWFnaWMgQ29va2llCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKICNkZWZpbmUgVElNRU9VVAkJNQkJLyogU2Vjb25kcyBiZWZvcmUgdHJ5aW5nIEJPT1RQIGFnYWluCSovCiAjaWZuZGVmIENPTkZJR19ORVRfUkVUUllfQ09VTlQKQEAgLTUzLDcgKzUzLDcgQEAKIHVsb25nCQlzZWVkMSwgc2VlZDI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiBkaGNwX3N0YXRlX3QgZGhjcF9zdGF0ZSA9IElOSVQ7CiB1bnNpZ25lZCBsb25nIGRoY3BfbGVhc2V0aW1lID0gMDsKIElQYWRkcl90IE5ldERIQ1BTZXJ2ZXJJUCA9IDA7CkBAIC03NiwxMiArNzYsMTIgQEAKIH0KICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQogZXh0ZXJuIHU4ICpkaGNwX3ZlbmRvcmV4X3ByZXAgKHU4ICplKTsgLypydG4gbmV3IGUgYWZ0ZXIgYWRkIG93biBvcHRzLiAqLwogZXh0ZXJuIHU4ICpkaGNwX3ZlbmRvcmV4X3Byb2MgKHU4ICplKTsgLypydG4gbmV4dCBlIGlmIG1pbmUsZWxzZSBOVUxMICAqLwogI2VuZGlmCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiBzdGF0aWMgaW50IEJvb3RwQ2hlY2tQa3QodWNoYXIgKnBrdCwgdW5zaWduZWQgZGVzdCwgdW5zaWduZWQgc3JjLCB1bnNpZ25lZCBsZW4pCiB7CkBAIC0xMjAsMTAgKzEyMCwxMiBAQAogCUlQYWRkcl90IHRtcF9pcDsKIAogCU5ldENvcHlJUCgmTmV0T3VySVAsICZicC0+YnBfeWlhZGRyKTsKKyNpZiAhZGVmaW5lZChDT05GSUdfQk9PVFBfU0VSVkVSSVApCiAJTmV0Q29weUlQKCZ0bXBfaXAsICZicC0+YnBfc2lhZGRyKTsKIAlpZiAodG1wX2lwICE9IDApCiAJCU5ldENvcHlJUCgmTmV0U2VydmVySVAsICZicC0+YnBfc2lhZGRyKTsKIAltZW1jcHkgKE5ldFNlcnZlckV0aGVyLCAoKEV0aGVybmV0X3QgKilOZXRSeFBrdCktPmV0X3NyYywgNik7CisjZW5kaWYKIAlpZiAoc3RybGVuKGJwLT5icF9maWxlKSA+IDApCiAJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBicC0+YnBfZmlsZSwgc2l6ZW9mKEJvb3RGaWxlKSk7CiAKQEAgLTE0OCw3ICsxNTAsNyBAQAogCXJldHVybiAoY3VybGVuKTsKIH0KIAotI2lmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmICFkZWZpbmVkKENPTkZJR19DTURfREhDUCkKIAogc3RhdGljIHZvaWQgQm9vdHBWZW5kb3JGaWVsZFByb2Nlc3MgKHU4ICogZXh0KQogewpAQCAtMTgxLDcgKzE4Myw3IEBACiAJCWlmIChOZXRPdXJETlNJUCA9PSAwKSB7CiAJCQlOZXRDb3B5SVAgKCZOZXRPdXJETlNJUCwgKElQYWRkcl90ICopIChleHQgKyAyKSk7CiAJCX0KLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfRE5TMikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMyKQogCQlpZiAoKE5ldE91ckROUzJJUCA9PSAwKSAmJiAoc2l6ZSA+IDQpKSB7CiAJCQlOZXRDb3B5SVAgKCZOZXRPdXJETlMySVAsIChJUGFkZHJfdCAqKSAoZXh0ICsgMiArIDQpKTsKIAkJfQpAQCAtMzQ0LDcgKzM0Niw3IEBACiAJCQkgKi8KIAkJCU5ldFN0YXRlID0gTkVUTE9PUF9TVUNDRVNTOwogCQkJcmV0dXJuOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogCQl9IGVsc2UgaWYgKHN0cmNtcChzLCAiTkZTIikgPT0gMCkgewogCQkJLyoKIAkJCSAqIFVzZSBORlMgdG8gbG9hZCB0aGUgYm9vdGZpbGUuCkBAIC0zNTcsNyArMzU5LDcgQEAKIAogCVRmdHBTdGFydCgpOwogfQotI2VuZGlmCS8qICFDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiAvKgogICoJVGltZW91dCBvbiBCT09UUC9ESENQIHJlcXVlc3QuCkBAIC0zNzcsMTYgKzM3OSwxNiBAQAogLyoKICAqCUluaXRpYWxpemUgQk9PVFAgZXh0ZW5zaW9uIGZpZWxkcyBpbiB0aGUgcmVxdWVzdC4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiBzdGF0aWMgaW50IERoY3BFeHRlbmRlZCAodTggKiBlLCBpbnQgbWVzc2FnZV90eXBlLCBJUGFkZHJfdCBTZXJ2ZXJJRCwgSVBhZGRyX3QgUmVxdWVzdGVkSVApCiB7CiAJdTggKnN0YXJ0ID0gZTsKIAl1OCAqY250OwogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQogCXU4ICp4OwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSkKIAljaGFyICpob3N0bmFtZTsKICNlbmRpZgogCkBAIC00MjUsNyArNDI3LDcgQEAKIAkJKmUrKyA9IHRtcCA+PiA4OwogCQkqZSsrID0gdG1wICYgMHhmZjsKIAl9Ci0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSkKIAlpZiAoKGhvc3RuYW1lID0gZ2V0ZW52ICgiaG9zdG5hbWUiKSkpIHsKIAkJaW50IGhvc3RuYW1lbGVuID0gc3RybGVuIChob3N0bmFtZSk7CiAKQEAgLTQzNiw3ICs0MzgsNyBAQAogCX0KICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQogCWlmICgoeCA9IGRoY3BfdmVuZG9yZXhfcHJlcCAoZSkpKQogCQlyZXR1cm4geCAtIHN0YXJ0OwogI2VuZGlmCkBAIC00NDQsMzkgKzQ0NiwzOSBAQAogCSplKysgPSA1NTsJCS8qIFBhcmFtZXRlciBSZXF1ZXN0IExpc3QgKi8KIAkgY250ID0gZSsrOwkJLyogUG9pbnRlciB0byBjb3VudCBvZiByZXF1ZXN0ZWQgaXRlbXMgKi8KIAkqY250ID0gMDsKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSykKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9TVUJORVRNQVNLKQogCSplKysgID0gMTsJCS8qIFN1Ym5ldCBNYXNrICovCiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfVElNRU9GRlNFVCkKIAkqZSsrICA9IDI7CiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0dBVEVXQVkpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfR0FURVdBWSkKIAkqZSsrICA9IDM7CQkvKiBSb3V0ZXIgT3B0aW9uICovCiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0ROUykKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMpCiAJKmUrKyAgPSA2OwkJLyogRE5TIFNlcnZlcihzKSAqLwogCSpjbnQgKz0gMTsKICNlbmRpZgotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9IT1NUTkFNRSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9IT1NUTkFNRSkKIAkqZSsrICA9IDEyOwkJLyogSG9zdG5hbWUgKi8KIAkqY250ICs9IDE7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKIAkqZSsrICA9IDEzOwkJLyogQm9vdCBGaWxlIFNpemUgKi8KIAkqY250ICs9IDE7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfQk9PVFBBVEgpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfQk9PVFBBVEgpCiAJKmUrKyAgPSAxNzsJCS8qIEJvb3QgcGF0aCAqLwogCSpjbnQgKz0gMTsKICNlbmRpZgotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9OSVNET01BSU4pCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfTklTRE9NQUlOKQogCSplKysgID0gNDA7CQkvKiBOSVMgRG9tYWluIG5hbWUgcmVxdWVzdCAqLwogCSpjbnQgKz0gMTsKICNlbmRpZgotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9OVFBTRVJWRVIpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfTlRQU0VSVkVSKQogCSplKysgID0gNDI7CiAJKmNudCArPSAxOwogI2VuZGlmCkBAIC00OTEsOSArNDkzLDkgQEAKIAlyZXR1cm4gZSAtIHN0YXJ0OwogfQogCi0jZWxzZQkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbHNlCiAvKgotICoJV2FybmluZzogbm8gZmllbGQgc2l6ZSBjaGVjayAtIGNoYW5nZSBDT05GSUdfQk9PVFBfTUFTSyBhdCB5b3VyIG93biByaXNrIQorICoJV2FybmluZzogbm8gZmllbGQgc2l6ZSBjaGVjayAtIGNoYW5nZSBDT05GSUdfQk9PVFBfKiBhdCB5b3VyIG93biByaXNrIQogICovCiBzdGF0aWMgaW50IEJvb3RwRXh0ZW5kZWQgKHU4ICogZSkKIHsKQEAgLTUwNCw3ICs1MDYsNyBAQAogCSplKysgPSA4MzsKIAkqZSsrID0gOTk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogCSplKysgPSA1MzsJCS8qIERIQ1AgTWVzc2FnZSBUeXBlICovCiAJKmUrKyA9IDE7CiAJKmUrKyA9IERIQ1BfRElTQ09WRVI7CkBAIC01MTMsNDUgKzUxNSw0NSBAQAogCSplKysgPSAyOwogCSplKysgPSAoNTc2IC0gMzEyICsgT1BUX1NJWkUpID4+IDE2OwogCSplKysgPSAoNTc2IC0gMzEyICsgT1BUX1NJWkUpICYgMHhmZjsKLSNlbmRpZiAvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0spCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfU1VCTkVUTUFTSykKIAkqZSsrID0gMTsJCS8qIFN1Ym5ldCBtYXNrIHJlcXVlc3QgKi8KIAkqZSsrID0gNDsKIAllICAgKz0gNDsKICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0dBVEVXQVkpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfR0FURVdBWSkKIAkqZSsrID0gMzsJCS8qIERlZmF1bHQgZ2F0ZXdheSByZXF1ZXN0ICovCiAJKmUrKyA9IDQ7CiAJZSAgICs9IDQ7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9ETlMpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfRE5TKQogCSplKysgPSA2OwkJLyogRG9tYWluIE5hbWUgU2VydmVyICovCiAJKmUrKyA9IDQ7CiAJZSAgICs9IDQ7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9IT1NUTkFNRSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9IT1NUTkFNRSkKIAkqZSsrID0gMTI7CQkvKiBIb3N0IG5hbWUgcmVxdWVzdCAqLwogCSplKysgPSAzMjsKIAllICAgKz0gMzI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQogCSplKysgPSAxMzsJCS8qIEJvb3QgZmlsZSBzaXplICovCiAJKmUrKyA9IDI7CiAJZSAgICs9IDI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9CT09UUEFUSCkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9CT09UUEFUSCkKIAkqZSsrID0gMTc7CQkvKiBCb290IHBhdGggKi8KIAkqZSsrID0gMzI7CiAJZSAgICs9IDMyOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfTklTRE9NQUlOKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX05JU0RPTUFJTikKIAkqZSsrID0gNDA7CQkvKiBOSVMgRG9tYWluIG5hbWUgcmVxdWVzdCAqLwogCSplKysgPSAzMjsKIAllICAgKz0gMzI7CkBAIC01NjEsNyArNTYzLDcgQEAKIAogCXJldHVybiBlIC0gc3RhcnQ7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ESENQICovCisjZW5kaWYKIAogdm9pZAogQm9vdHBSZXF1ZXN0ICh2b2lkKQpAQCAtNTcwLDcgKzU3Miw3IEBACiAJQm9vdHBfdCAqYnA7CiAJaW50IGV4dF9sZW4sIHBrdGxlbiwgaXBsZW47CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogCWRoY3Bfc3RhdGUgPSBJTklUOwogI2VuZGlmCiAKQEAgLTY3OCwxMSArNjgwLDExIEBACiAJY29weV9maWxlbmFtZSAoYnAtPmJwX2ZpbGUsIEJvb3RGaWxlLCBzaXplb2YoYnAtPmJwX2ZpbGUpKTsKIAogCS8qIFJlcXVlc3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCT09UUC9ESENQIHNlcnZlciAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiAJZXh0X2xlbiA9IERoY3BFeHRlbmRlZCgodTggKilicC0+YnBfdmVuZCwgREhDUF9ESVNDT1ZFUiwgMCwgMCk7CiAjZWxzZQogCWV4dF9sZW4gPSBCb290cEV4dGVuZGVkKCh1OCAqKWJwLT5icF92ZW5kKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiAJLyoKIAkgKglCb290cCBJRCBpcyB0aGUgbG93ZXIgNCBieXRlcyBvZiBvdXIgZXRoZXJuZXQgYWRkcmVzcwpAQCAtNzA1LDE2ICs3MDcsMTYgQEAKIAlOZXRTZXRJUChpcGhkciwgMHhGRkZGRkZGRkwsIFBPUlRfQk9PVFBTLCBQT1JUX0JPT1RQQywgaXBsZW4pOwogCU5ldFNldFRpbWVvdXQoU0VMRUNUX1RJTUVPVVQgKiBDRkdfSFosIEJvb3RwVGltZW91dCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogCWRoY3Bfc3RhdGUgPSBTRUxFQ1RJTkc7CiAJTmV0U2V0SGFuZGxlcihEaGNwSGFuZGxlcik7CiAjZWxzZQogCU5ldFNldEhhbmRsZXIoQm9vdHBIYW5kbGVyKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCU5ldFNlbmRQYWNrZXQoTmV0VHhQYWNrZXQsIHBrdGxlbik7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogc3RhdGljIHZvaWQgRGhjcE9wdGlvbnNQcm9jZXNzICh1Y2hhciAqIHBvcHQsIEJvb3RwX3QgKmJwKQogewogCXVjaGFyICplbmQgPSBwb3B0ICsgQk9PVFBfSERSX1NJWkU7CkBAIC03MjYsNyArNzI4LDcgQEAKIAkJY2FzZSAxOgogCQkJTmV0Q29weUlQICgmTmV0T3VyU3VibmV0TWFzaywgKHBvcHQgKyAyKSk7CiAJCQlicmVhazsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKSAmJiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfVElNRU9GRlNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkgJiYgZGVmaW5lZChDT05GSUdfQk9PVFBfVElNRU9GRlNFVCkKIAkJY2FzZSAyOgkJLyogVGltZSBvZmZzZXQJKi8KIAkJCU5ldENvcHlMb25nICgmTmV0VGltZU9mZnNldCwgKHVsb25nICopIChwb3B0ICsgMikpOwogCQkJTmV0VGltZU9mZnNldCA9IG50b2hsIChOZXRUaW1lT2Zmc2V0KTsKQEAgLTczNyw3ICs3MzksNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgNjoKIAkJCU5ldENvcHlJUCAoJk5ldE91ckROU0lQLCAocG9wdCArIDIpKTsKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfRE5TMikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMyKQogCQkJaWYgKCoocG9wdCArIDEpID4gNCkgewogCQkJCU5ldENvcHlJUCAoJk5ldE91ckROUzJJUCwgKHBvcHQgKyAyICsgNCkpOwogCQkJfQpAQCAtNzU1LDcgKzc1Nyw3IEBACiAJCQltZW1jcHkgKCZOZXRPdXJSb290UGF0aCwgcG9wdCArIDIsIHNpemUpOwogCQkJTmV0T3VyUm9vdFBhdGhbc2l6ZV0gPSAwOwogCQkJYnJlYWs7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkgJiYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX05UUFNFUlZFUikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkgJiYgZGVmaW5lZChDT05GSUdfQk9PVFBfTlRQU0VSVkVSKQogCQljYXNlIDQyOgkvKiBOVFAgc2VydmVyIElQICovCiAJCQlOZXRDb3B5SVAgKCZOZXROdHBTZXJ2ZXJJUCwgKHBvcHQgKyAyKSk7CiAJCQlicmVhazsKQEAgLTgwMSw3ICs4MDMsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQogCQkJaWYgKGRoY3BfdmVuZG9yZXhfcHJvYyAocG9wdCkpCiAJCQkJYnJlYWs7CiAjZW5kaWYKQEAgLTk1MCw3ICs5NTIsNyBAQAogCQkJCQkgKi8KIAkJCQkJTmV0U3RhdGUgPSBORVRMT09QX1NVQ0NFU1M7CiAJCQkJCXJldHVybjsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAkJCQl9IGVsc2UgaWYgKHN0cmNtcChzLCAiTkZTIikgPT0gMCkgewogCQkJCQkvKgogCQkJCQkgKiBVc2UgTkZTIHRvIGxvYWQgdGhlIGJvb3RmaWxlLgpAQCAtOTc1LDYgKzk3Nyw2IEBACiB7CiAJQm9vdHBSZXF1ZXN0KCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ESENQICovCisjZW5kaWYKIAotI2VuZGlmIC8qIENGR19DTURfTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9ib290cC5oIGIvbmV0L2Jvb3RwLmgKaW5kZXggMGIzMTYzOS4uYmE5ODI2ZSAxMDA2NDQKLS0tIGEvbmV0L2Jvb3RwLmgKKysrIGIvbmV0L2Jvb3RwLmgKQEAgLTE4LDcgKzE4LDcgQEAKIC8qCiAgKglCT09UUCBoZWFkZXIuCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogI2RlZmluZSBPUFRfU0laRSAzMTIJLyogTWluaW11bSBESENQIE9wdGlvbnMgc2l6ZSBwZXIgUkZDMjEzMSAtIHJlc3VsdHMgaW4gNTc2IGJ5dGUgcGt0ICovCiAjZWxzZQogI2RlZmluZSBPUFRfU0laRSA2NApkaWZmIC0tZ2l0IGEvbmV0L2V0aC5jIGIvbmV0L2V0aC5jCmluZGV4IGFiNTZkY2YuLmMyYzIzZjYgMTAwNjQ0Ci0tLSBhL25ldC9ldGguYworKysgYi9uZXQvZXRoLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxuZXQuaD4KICNpbmNsdWRlIDxtaWlwaHkuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAogI2lmZGVmIENGR19HVF82NDI2eAogZXh0ZXJuIGludCBndDY0MjZ4X2V0aF9pbml0aWFsaXplKGJkX3QgKmJpcyk7CkBAIC00MCw2ICs0MCw3IEBACiBleHRlcm4gaW50IGZlY19pbml0aWFsaXplKGJkX3QqKTsKIGV4dGVybiBpbnQgaW5jYV9zd2l0Y2hfaW5pdGlhbGl6ZShiZF90Kik7CiBleHRlcm4gaW50IG1wYzV4eHhfZmVjX2luaXRpYWxpemUoYmRfdCopOworZXh0ZXJuIGludCBtcGM1MTJ4X2ZlY19pbml0aWFsaXplKGJkX3QqKTsKIGV4dGVybiBpbnQgbXBjODIyMF9mZWNfaW5pdGlhbGl6ZShiZF90Kik7CiBleHRlcm4gaW50IG12NjQzNnhfZXRoX2luaXRpYWxpemUoYmRfdCAqKTsKIGV4dGVybiBpbnQgbXY2NDQ2eF9ldGhfaW5pdGlhbGl6ZShiZF90ICopOwpAQCAtMTQyLDcgKzE0Myw4IEBACiAJZXRoX2RldmljZXMgPSBOVUxMOwogCWV0aF9jdXJyZW50ID0gTlVMTDsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNjQpOworI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfaW5pdCgpOwogI2VuZGlmCiAKQEAgLTE2Nyw2ICsxNjksOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX01QQzV4eHhfRkVDKQogCW1wYzV4eHhfZmVjX2luaXRpYWxpemUoYmlzKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzUxMnhfRkVDKQorCW1wYzUxMnhfZmVjX2luaXRpYWxpemUgKGJpcyk7CisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjIwX0ZFQykKIAltcGM4MjIwX2ZlY19pbml0aWFsaXplKGJpcyk7CiAjZW5kaWYKQEAgLTI0NywxMCArMjUyLDEyIEBACiAKIAlpZiAoIWV0aF9kZXZpY2VzKSB7CiAJCXB1dHMgKCJObyBldGhlcm5ldCBmb3VuZC5cbiIpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC02NCk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGV0aF9kZXZpY2UgKmRldiA9IGV0aF9kZXZpY2VzOwogCQljaGFyICpldGhwcmltZSA9IGdldGVudiAoImV0aHByaW1lIik7CiAKKwkJc2hvd19ib290X3Byb2dyZXNzICg2NSk7CiAJCWRvIHsKIAkJCWlmIChldGhfbnVtYmVyKQogCQkJCXB1dHMgKCIsICIpOwpAQCAtMzQ2LDYgKzM1Myw1MSBAQAogCiAJbWVtY3B5KGRldi0+ZW5ldGFkZHIsIGVuZXRhZGRyLCA2KTsKIH0KKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorLyogTXVsdGljYXN0LgorICogbWNhc3RfYWRkcjogbXVsdGljYXN0IGlwYWRkciBmcm9tIHdoaWNoIG11bHRpY2FzdCBNYWMgaXMgbWFkZQorICogam9pbjogMT1qb2luLCAwPWxlYXZlLgorICovCitpbnQgZXRoX21jYXN0X2pvaW4oIElQYWRkcl90IG1jYXN0X2lwLCB1OCBqb2luKQoreworIHU4IG1jYXN0X21hY1s2XTsKKwlpZiAoIWV0aF9jdXJyZW50IHx8ICFldGhfY3VycmVudC0+bWNhc3QpCisJCXJldHVybiAtMTsKKwltY2FzdF9tYWNbNV0gPSBodG9ubChtY2FzdF9pcCkgJiAweGZmOworCW1jYXN0X21hY1s0XSA9IChodG9ubChtY2FzdF9pcCk+PjgpICYgMHhmZjsKKwltY2FzdF9tYWNbM10gPSAoaHRvbmwobWNhc3RfaXApPj4xNikgJiAweDdmOworCW1jYXN0X21hY1syXSA9IDB4NWU7CisJbWNhc3RfbWFjWzFdID0gMHgwOworCW1jYXN0X21hY1swXSA9IDB4MTsKKwlyZXR1cm4gZXRoX2N1cnJlbnQtPm1jYXN0KGV0aF9jdXJyZW50LCBtY2FzdF9tYWMsIGpvaW4pOworfQorCisvKiB0aGUgJ3dheScgZm9yIGV0aGVybmV0LUNSQy0zMi4gU3BsaWNlZCBpbiBmcm9tIExpbnV4IGxpYi9jcmMzMi5jCisgKiBhbmQgdGhpcyBpcyB0aGUgZXRoZXJuZXQtY3JjIG1ldGhvZCBuZWVkZWQgZm9yIFRTRUMgLS0gYW5kIHBlcmhhcHMKKyAqIHNvbWUgb3RoZXIgYWRhcHRlciAtLSBoYXNoIHRhYmxlcworICovCisjZGVmaW5lIENSQ1BPTFlfTEUgMHhlZGI4ODMyMAordTMyIGV0aGVyX2NyYyAoc2l6ZV90IGxlbiwgdW5zaWduZWQgY2hhciBjb25zdCAqcCkKK3sKKwlpbnQgaTsKKwl1MzIgY3JjOworCWNyYyA9IH4wOworCXdoaWxlIChsZW4tLSkgeworCQljcmMgXj0gKnArKzsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWNyYyA9IChjcmMgPj4gMSkgXiAoKGNyYyAmIDEpID8gQ1JDUE9MWV9MRSA6IDApOworCX0KKwkvKiBhbiByZXZlcnNlIHRoZSBiaXRzLCBjdXogb2Ygd2F5IHRoZXkgYXJyaXZlIC0tIGxhc3QtZmlyc3QgKi8KKwljcmMgPSAoY3JjID4+IDE2KSB8IChjcmMgPDwgMTYpOworCWNyYyA9IChjcmMgPj4gOCAmIDB4MDBmZjAwZmYpIHwgKGNyYyA8PCA4ICYgMHhmZjAwZmYwMCk7CisJY3JjID0gKGNyYyA+PiA0ICYgMHgwZjBmMGYwZikgfCAoY3JjIDw8IDQgJiAweGYwZjBmMGYwKTsKKwljcmMgPSAoY3JjID4+IDIgJiAweDMzMzMzMzMzKSB8IChjcmMgPDwgMiAmIDB4Y2NjY2NjY2MpOworCWNyYyA9IChjcmMgPj4gMSAmIDB4NTU1NTU1NTUpIHwgKGNyYyA8PCAxICYgMHhhYWFhYWFhYSk7CisJcmV0dXJuIGNyYzsKK30KKworI2VuZGlmCisKIAogaW50IGV0aF9pbml0KGJkX3QgKmJpcykKIHsKQEAgLTQ1MSwxNiArNTAzLDE4IEBACiB7CiAJcmV0dXJuIChldGhfY3VycmVudCA/IGV0aF9jdXJyZW50LT5uYW1lIDogInVua25vd24iKTsKIH0KLSNlbGlmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmICFkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAKIGV4dGVybiBpbnQgYXQ5MXJtOTIwMF9taWlwaHlfaW5pdGlhbGl6ZShiZF90ICpiaXMpOwogZXh0ZXJuIGludCBlbWFjNHh4X21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcyk7CiBleHRlcm4gaW50IG1jZjUyeDJfbWlpcGh5X2luaXRpYWxpemUoYmRfdCAqYmlzKTsKIGV4dGVybiBpbnQgbnM3NTIwX21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcyk7CitleHRlcm4gaW50IGRtNjQ0eF9ldGhfbWlpcGh5X2luaXRpYWxpemUoYmRfdCAqYmlzKTsKKwogCiBpbnQgZXRoX2luaXRpYWxpemUoYmRfdCAqYmlzKQogewotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfaW5pdCgpOwogI2VuZGlmCiAKQEAgLTQ3Nyw2ICs1MzEsOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX05FVEFSTSkKIAluczc1MjBfbWlpcGh5X2luaXRpYWxpemUoYmlzKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0RSSVZFUl9USV9FTUFDKQorCWRtNjQ0eF9ldGhfbWlpcGh5X2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbmV0LmMgYi9uZXQvbmV0LmMKaW5kZXggMmZmN2JmYy4uYzQ3NjEwZSAxMDA2NDQKLS0tIGEvbmV0L25ldC5jCisrKyBiL25ldC9uZXQuYwpAQCAtODYsMTEgKzg2LDExIEBACiAjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2luY2x1ZGUgPG1paXBoeS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKICNpbmNsdWRlICJzbnRwLmgiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIApAQCAtMTEwLDcgKzExMCw3IEBACiBJUGFkZHJfdAlOZXRPdXJTdWJuZXRNYXNrPTA7CQkvKiBPdXIgc3VibmV0IG1hc2sgKDA9dW5rbm93bikJKi8KIElQYWRkcl90CU5ldE91ckdhdGV3YXlJUD0wOwkJLyogT3VyIGdhdGV3YXlzIElQIGFkZHJlc3MJKi8KIElQYWRkcl90CU5ldE91ckROU0lQPTA7CQkJLyogT3VyIEROUyBJUCBhZGRyZXNzCQkqLwotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9ETlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0ROUzIpCiBJUGFkZHJfdAlOZXRPdXJETlMySVA9MDsJCQkvKiBPdXIgMm5kIEROUyBJUCBhZGRyZXNzCSovCiAjZW5kaWYKIGNoYXIJCU5ldE91ck5JU0RvbWFpblszMl09ezAsfTsJLyogT3VyIE5JUyBkb21haW4JCSovCkBAIC0xMTgsNiArMTE4LDEwIEBACiBjaGFyCQlOZXRPdXJSb290UGF0aFs2NF09ezAsfTsJLyogT3VyIGJvb3RwYXRoCQkJKi8KIHVzaG9ydAkJTmV0Qm9vdEZpbGVTaXplPTA7CQkvKiBPdXIgYm9vdGZpbGUgc2l6ZSBpbiBibG9ja3MJKi8KIAorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCS8qIE11bHRpY2FzdCBURlRQICovCitJUGFkZHJfdCBNY2FzdF9hZGRyOworI2VuZGlmCisKIC8qKiBFTkQgT0YgQk9PVFAgRVhURU5USU9OUyAqKi8KIAogdWxvbmcJCU5ldEJvb3RGaWxlWGZlclNpemU7CS8qIFRoZSBhY3R1YWwgdHJhbnNmZXJyZWQgc2l6ZSBvZiB0aGUgYm9vdGZpbGUgKGluIGJ5dGVzKSAqLwpAQCAtMTMzLDcgKzEzNyw3IEBACiAJCQl7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKIHVjaGFyCQlOZXRFdGhlck51bGxBZGRyWzZdID0KIAkJCXsgMCwgMCwgMCwgMCwgMCwgMCB9OwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogdWNoYXIJCU5ldENEUEFkZHJbNl0gPQkJLyogRXRoZXJuZXQgYmNhc3QgYWRkcmVzcwkJKi8KIAkJCXsgMHgwMSwgMHgwMCwgMHgwYywgMHhjYywgMHhjYywgMHhjYyB9OwogI2VuZGlmCkBAIC0xNTAsMTcgKzE1NCwxNyBAQAogCiBjaGFyCQlCb290RmlsZVsxMjhdOwkJLyogQm9vdCBGaWxlIG5hbWUJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIElQYWRkcl90CU5ldFBpbmdJUDsJCS8qIHRoZSBpcCBhZGRyZXNzIHRvIHBpbmcgCQkqLwogCiBzdGF0aWMgdm9pZCBQaW5nU3RhcnQodm9pZCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogc3RhdGljIHZvaWQgQ0RQU3RhcnQodm9pZCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiBJUGFkZHJfdAlOZXROdHBTZXJ2ZXJJUDsJCS8qIE5UUCBzZXJ2ZXIgSVAgYWRkcmVzcwkJKi8KIGludAkJTmV0VGltZU9mZnNldD0wOwkvKiBvZmZzZXQgdGltZSBmcm9tIFVUQwkJCSovCiAjZW5kaWYKQEAgLTMyNiwxMyArMzMwLDEzIEBACiAJICovCiAKIAlzd2l0Y2ggKHByb3RvY29sKSB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORlMpCiAJY2FzZSBORlM6CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogCWNhc2UgUElORzoKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiAJY2FzZSBTTlRQOgogI2VuZGlmCiAJY2FzZSBORVRDT05TOgpAQCAtMzQ0LDE5ICszNDgsMTkgQEAKIAkJTmV0T3VyTmF0aXZlVkxBTiA9IGdldGVudl9WTEFOKCJudmxhbiIpOwogCiAJCXN3aXRjaCAocHJvdG9jb2wpIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAkJY2FzZSBORlM6CiAjZW5kaWYKIAkJY2FzZSBORVRDT05TOgogCQljYXNlIFRGVFA6CiAJCQlOZXRTZXJ2ZXJJUCA9IGdldGVudl9JUGFkZHIgKCJzZXJ2ZXJpcCIpOwogCQkJYnJlYWs7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIAkJY2FzZSBQSU5HOgogCQkJLyogbm90aGluZyAqLwogCQkJYnJlYWs7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKQogCQljYXNlIFNOVFA6CiAJCQkvKiBub3RoaW5nICovCiAJCQlicmVhazsKQEAgLTQwNiw3ICs0MTAsNyBAQAogCQkJVGZ0cFN0YXJ0KCk7CiAJCQlicmVhazsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiAJCWNhc2UgREhDUDoKIAkJCS8qIFN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZS4uLiAqLwogCQkJQm9vdHBUcnkgPSAwOwpAQCAtNDE0LDcgKzQxOCw3IEBACiAJCQlOZXRTZXJ2ZXJJUCA9IGdldGVudl9JUGFkZHIgKCJzZXJ2ZXJpcCIpOwogCQkJRGhjcFJlcXVlc3QoKTsJCS8qIEJhc2ljYWxseSBzYW1lIGFzIEJPT1RQICovCiAJCQlicmVhazsKLSNlbmRpZiAvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiAJCWNhc2UgQk9PVFA6CiAJCQlCb290cFRyeSA9IDA7CkBAIC00MjUsMTcgKzQyOSwxNyBAQAogCQkJUmFycFRyeSA9IDA7CiAJCQlSYXJwUmVxdWVzdCAoKTsKIAkJCWJyZWFrOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BJTkcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BJTkcpCiAJCWNhc2UgUElORzoKIAkJCVBpbmdTdGFydCgpOwogCQkJYnJlYWs7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAkJY2FzZSBORlM6CiAJCQlOZnNTdGFydCgpOwogCQkJYnJlYWs7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAkJY2FzZSBDRFA6CiAJCQlDRFBTdGFydCgpOwogCQkJYnJlYWs7CkBAIC00NDUsNyArNDQ5LDcgQEAKIAkJCU5jU3RhcnQoKTsKIAkJCWJyZWFrOwogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIAkJY2FzZSBTTlRQOgogCQkJU250cFN0YXJ0KCk7CiAJCQlicmVhazsKQEAgLTQ1OCw3ICs0NjIsNyBAQAogCQlicmVhazsKIAl9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjaWYgZGVmaW5lZChDRkdfRkFVTFRfRUNIT19MSU5LX0RPV04pICYmIGRlZmluZWQoQ09ORklHX1NUQVRVU19MRUQpICYmIGRlZmluZWQoU1RBVFVTX0xFRF9SRUQpCiAJLyoKIAkgKiBFY2hvIHRoZSBpbnZlcnRlZCBsaW5rIHN0YXRlIHRvIHRoZSBmYXVsdCBMRUQuCkBAIC01MDcsNyArNTExLDcgQEAKIAkJaWYgKHRpbWVIYW5kbGVyICYmICgoZ2V0X3RpbWVyKDApIC0gdGltZVN0YXJ0KSA+IHRpbWVEZWx0YSkpIHsKIAkJCXRoYW5kX2YgKng7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjICBpZiBkZWZpbmVkKENGR19GQVVMVF9FQ0hPX0xJTktfRE9XTikgJiYgXAogICAgICAgZGVmaW5lZChDT05GSUdfU1RBVFVTX0xFRCkgJiYJICAgXAogICAgICAgZGVmaW5lZChTVEFUVVNfTEVEX1JFRCkKQEAgLTY4Nyw3ICs2OTEsNyBAQAogCXJldHVybiAwOwkvKiB0cmFuc21pdHRlZCAqLwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIHN0YXRpYyB1c2hvcnQgUGluZ1NlcU5vOwogCiBpbnQgUGluZ1NlbmQodm9pZCkKQEAgLTc3NSw5ICs3NzksOSBAQAogCiAJUGluZ1NlbmQoKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BJTkcgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0RQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCiAKICNkZWZpbmUgQ0RQX0RFVklDRV9JRF9UTFYJCTB4MDAwMQogI2RlZmluZSBDRFBfQUREUkVTU19UTFYJCQkweDAwMDIKQEAgLTExMjgsNyArMTEzMiw3IEBACiAKIAlDRFBTZW5kVHJpZ2dlcigpOwogfQotI2VuZGlmCS8qIENGR19DTURfQ0RQICovCisjZW5kaWYKIAogCiB2b2lkCkBAIC0xMTQwLDcgKzExNDQsNyBAQAogCUlQYWRkcl90IHRtcDsKIAlpbnQJeDsKIAl1Y2hhciAqcGt0OwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCWludCBpc2NkcDsKICNlbmRpZgogCXVzaG9ydCBjdGkgPSAwLCB2bGFuaWQgPSBWTEFOX05PTkUsIG15dmxhbmlkLCBteW52bGFuaWQ7CkBAIC0xMTU3LDcgKzExNjEsNyBAQAogCWlmIChsZW4gPCBFVEhFUl9IRFJfU0laRSkKIAkJcmV0dXJuOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0RQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCiAJLyoga2VlcCB0cmFjayBpZiBwYWNrZXQgaXMgQ0RQICovCiAJaXNjZHAgPSBtZW1jbXAoZXQtPmV0X2Rlc3QsIE5ldENEUEFkZHIsIDYpID09IDA7CiAjZW5kaWYKQEAgLTEyMDAsNyArMTIwNCw3IEBACiAKIAkJLyogaWYgbm8gVkxBTiBhY3RpdmUgKi8KIAkJaWYgKChudG9ocyhOZXRPdXJWTEFOKSAmIFZMQU5fSURNQVNLKSA9PSBWTEFOX05PTkUKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAkJCQkmJiBpc2NkcCA9PSAwCiAjZW5kaWYKIAkJCQkpCkBAIC0xMjE4LDcgKzEyMjIsNyBAQAogCXByaW50ZigiUmVjZWl2ZSBmcm9tIHByb3RvY29sIDB4JXhcbiIsIHgpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAlpZiAoaXNjZHApIHsKIAkJQ0RQSGFuZGxlcigodWNoYXIgKilpcCwgbGVuKTsKIAkJcmV0dXJuOwpAQCAtMTM4Niw2ICsxMzkwLDkgQEAKIAkJfQogCQl0bXAgPSBOZXRSZWFkSVAoJmlwLT5pcF9kc3QpOwogCQlpZiAoTmV0T3VySVAgJiYgdG1wICE9IE5ldE91cklQICYmIHRtcCAhPSAweEZGRkZGRkZGKSB7CisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKwkJCWlmIChNY2FzdF9hZGRyICE9IHRtcCkKKyNlbmRpZgogCQkJcmV0dXJuOwogCQl9CiAJCS8qCkBAIC0xNDE2LDcgKzE0MjMsNyBAQAogCQkJCXByaW50X0lQYWRkcihpY21waC0+dW4uZ2F0ZXdheSk7CiAJCQkJcHV0YygnICcpOwogCQkJCXJldHVybjsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogCQkJY2FzZSBJQ01QX0VDSE9fUkVQTFk6CiAJCQkJLyoKIAkJCQkgKglJUCBoZWFkZXIgT0suICBQYXNzIHRoZSBwYWNrZXQgdG8gdGhlIGN1cnJlbnQgaGFuZGxlci4KQEAgLTE0OTIsNiArMTQ5OSw3IEBACiAJCX0KICNlbmRpZgogCisKICNpZmRlZiBDT05GSUdfTkVUQ09OU09MRQogCQluY19pbnB1dF9wYWNrZXQoKHVjaGFyICopaXAgK0lQX0hEUl9TSVpFLAogCQkJCQkJbnRvaHMoaXAtPnVkcF9kc3QpLApAQCAtMTUxNiw3ICsxNTI0LDcgQEAKIHsKIAlzd2l0Y2ggKHByb3RvY29sKSB7CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BJTkcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BJTkcpCiAJY2FzZSBQSU5HOgogCQlpZiAoTmV0UGluZ0lQID09IDApIHsKIAkJCXB1dHMgKCIqKiogRVJST1I6IHBpbmcgYWRkcmVzcyBub3QgZ2l2ZW5cbiIpOwpAQCAtMTUyNCw3ICsxNTMyLDcgQEAKIAkJfQogCQlnb3RvIGNvbW1vbjsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiAJY2FzZSBTTlRQOgogCQlpZiAoTmV0TnRwU2VydmVySVAgPT0gMCkgewogCQkJcHV0cyAoIioqKiBFUlJPUjogTlRQIHNlcnZlciBhZGRyZXNzIG5vdCBnaXZlblxuIik7CkBAIC0xNTMyLDcgKzE1NDAsNyBAQAogCQl9CiAJCWdvdG8gY29tbW9uOwogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORlMpCiAJY2FzZSBORlM6CiAjZW5kaWYKIAljYXNlIE5FVENPTlM6CkBAIC0xNTQxLDcgKzE1NDksNyBAQAogCQkJcHV0cyAoIioqKiBFUlJPUjogYHNlcnZlcmlwJyBub3Qgc2V0XG4iKTsKIAkJCXJldHVybiAoMSk7CiAJCX0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgKENGR19DTURfUElORyB8IENGR19DTURfU05UUCkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BJTkcpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKQogICAgIGNvbW1vbjoKICNlbmRpZgogCkBAIC0xNjkzLDcgKzE3MDEsNyBAQAogCSpkc3QgPSAnXDAnOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiB2b2lkIGlwX3RvX3N0cmluZyAoSVBhZGRyX3QgeCwgY2hhciAqcykKIHsKZGlmZiAtLWdpdCBhL25ldC9uZnMuYyBiL25ldC9uZnMuYwppbmRleCBkZTc4OWUxLi5kZjJjYWFjIDEwMDY0NAotLS0gYS9uZXQvbmZzLmMKKysrIGIvbmV0L25mcy5jCkBAIC0zMSw3ICszMSw3IEBACiAKIC8qI2RlZmluZSBORlNfREVCVUcqLwogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogCiAjZGVmaW5lIEhBU0hFU19QRVJfTElORSA2NQkvKiBOdW1iZXIgb2YgImxvYWRpbmciIGhhc2hlcyBwZXIgbGluZQkqLwogI2RlZmluZSBORlNfVElNRU9VVCA2MApAQCAtNzc1LDQgKzc3NSw0IEBACiAJTmZzU2VuZCAoKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9yYXJwLmMgYi9uZXQvcmFycC5jCmluZGV4IDFiYTYwZTguLjIxZGZhNTIgMTAwNjQ0Ci0tLSBhL25ldC9yYXJwLmMKKysrIGIvbmV0L3JhcnAuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgInJhcnAuaCIKICNpbmNsdWRlICJ0ZnRwLmgiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogI2RlZmluZSBUSU1FT1VUCQk1CQkvKiBTZWNvbmRzIGJlZm9yZSB0cnlpbmcgQk9PVFAgYWdhaW4gKi8KICNpZm5kZWYJQ09ORklHX05FVF9SRVRSWV9DT1VOVApAQCAtNTksNyArNTksNyBAQAogCQkJICovCiAJCQlOZXRTdGF0ZSA9IE5FVExPT1BfU1VDQ0VTUzsKIAkJCXJldHVybjsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAkJfSBlbHNlIGlmICgocyAhPSBOVUxMKSAmJiAhc3RyY21wKHMsICJORlMiKSkgewogCQkJTmZzU3RhcnQoKTsKIAkJCXJldHVybjsKQEAgLTExOSw0ICsxMTksNCBAQAogCU5ldFNldEhhbmRsZXIoUmFycEhhbmRsZXIpOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3NudHAuYyBiL25ldC9zbnRwLmMKaW5kZXggZGI4YzJjMi4uOTVlNzU0MiAxMDA2NDQKLS0tIGEvbmV0L3NudHAuYworKysgYi9uZXQvc250cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAKICNpbmNsdWRlICJzbnRwLmgiCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIAogI2RlZmluZSBTTlRQX1RJTUVPVVQgMTAKIApAQCAtNjcsNyArNjcsNyBAQAogCW1lbWNweSAoJnNlY29uZHMsICZycGt0cC0+dHJhbnNtaXRfdGltZXN0YW1wLCBzaXplb2YodWxvbmcpKTsKIAogCXRvX3RtKG50b2hsKHNlY29uZHMpIC0gMjIwODk4ODgwMFVMICsgTmV0VGltZU9mZnNldCwgJnRtKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCXJ0Y19zZXQgKCZ0bSk7CiAjZW5kaWYKIAlwcmludGYgKCJEYXRlOiAlNGQtJTAyZC0lMDJkIFRpbWU6ICUyZDolMDJkOiUwMmRcbiIsCkBAIC04OSw0ICs4OSw0IEBACiAJU250cFNlbmQgKCk7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFAgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RmdHAuYyBiL25ldC90ZnRwLmMKaW5kZXggZjNhNTQ3MS4uODg4ZWM5OCAxMDA2NDQKLS0tIGEvbmV0L3RmdHAuYworKysgYi9uZXQvdGZ0cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAKICN1bmRlZglFVF9ERUJVRwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKICNkZWZpbmUgV0VMTF9LTk9XTl9QT1JUCTY5CQkvKiBXZWxsIGtub3duIFRGVFAgcG9ydCAjCQkqLwogI2RlZmluZSBUSU1FT1VUCQk1CQkvKiBTZWNvbmRzIHRvIHRpbWVvdXQgZm9yIGEgbG9zdCBwa3QJKi8KQEAgLTYxLDEwICs2MSw0MyBAQAogZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107CiAjZW5kaWYKIAorLyogNTEyIGlzIHBvb3IgY2hvaWNlIGZvciBldGhlcm5ldCwgTVRVIGlzIHR5cGljYWxseSAxNTAwLgorICogTWludXMgZXRoLmhkcnMgdGhhdHMgMTQ2OC4gIENhbiBnZXQgMnggYmV0dGVyIHRocm91Z2hwdXQgd2l0aAorICogYWxtb3N0LU1UVSBibG9jayBzaXplcy4gIEF0IGxlYXN0IHRyeS4uLiBmYWxsIGJhY2sgdG8gNTEyIGlmIG5lZWQgYmUuCisgKi8KKyNkZWZpbmUgVEZUUF9NVFVfQkxPQ0tTSVpFIDE0NjgKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBUZnRwQmxrU2l6ZT1URlRQX0JMT0NLX1NJWkU7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgVGZ0cEJsa1NpemVPcHRpb249VEZUUF9NVFVfQkxPQ0tTSVpFOworCisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNkZWZpbmUgTVRGVFBfQklUTUFQU0laRQkweDEwMDAKK3N0YXRpYyB1bnNpZ25lZCAqQml0bWFwOworc3RhdGljIGludCBQcmV2Qml0bWFwSG9sZSxNYXBzaXplPU1URlRQX0JJVE1BUFNJWkU7CitzdGF0aWMgdWNoYXIgUHJvaGliaXRNY2FzdD0wLCBNYXN0ZXJDbGllbnQ9MDsKK3N0YXRpYyB1Y2hhciBNdWx0aWNhc3Q9MDsKK2V4dGVybiBJUGFkZHJfdCBNY2FzdF9hZGRyOworc3RhdGljIGludCBNY2FzdF9wb3J0Oworc3RhdGljIHVsb25nIFRmdHBFbmRpbmdCbG9jazsgLyogY2FuIGdldCAnbGFzdCcgYmxvY2sgYmVmb3JlIGRvbmUuLiovCisKK3N0YXRpYyB2b2lkIHBhcnNlX211bHRpY2FzdF9vYWNrKGNoYXIgKnBrdCxpbnQgbGVuKTsKKworc3RhdGljIHZvaWQKK21jYXN0X2NsZWFudXAodm9pZCkKK3sKKwlpZiAoTWNhc3RfYWRkcikgZXRoX21jYXN0X2pvaW4oTWNhc3RfYWRkciwgMCk7CisJaWYgKEJpdG1hcCkgZnJlZShCaXRtYXApOworCUJpdG1hcD1OVUxMOworCU1jYXN0X2FkZHIgPSBNdWx0aWNhc3QgPSBNY2FzdF9wb3J0ID0gMDsKKwlUZnRwRW5kaW5nQmxvY2sgPSAtMTsKK30KKworI2VuZGlmCS8qIENPTkZJR19NQ0FTVF9URlRQICovCisKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQKIHN0b3JlX2Jsb2NrICh1bnNpZ25lZCBibG9jaywgdWNoYXIgKiBzcmMsIHVuc2lnbmVkIGxlbikKIHsKLQl1bG9uZyBvZmZzZXQgPSBibG9jayAqIFRGVFBfQkxPQ0tfU0laRSArIFRmdHBCbG9ja1dyYXBPZmZzZXQ7CisJdWxvbmcgb2Zmc2V0ID0gYmxvY2sgKiBUZnRwQmxrU2l6ZSArIFRmdHBCbG9ja1dyYXBPZmZzZXQ7CiAJdWxvbmcgbmV3c2l6ZSA9IG9mZnNldCArIGxlbjsKICNpZmRlZiBDRkdfRElSRUNUX0ZMQVNIX1RGVFAKIAlpbnQgaSwgcmMgPSAwOwpAQCAtOTAsNiArMTIzLDEwIEBACiAJewogCQkodm9pZCltZW1jcHkoKHZvaWQgKikobG9hZF9hZGRyICsgb2Zmc2V0KSwgc3JjLCBsZW4pOwogCX0KKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCWlmIChNdWx0aWNhc3QpCisJCWV4dDJfc2V0X2JpdChibG9jaywgQml0bWFwKTsKKyNlbmRpZgogCiAJaWYgKE5ldEJvb3RGaWxlWGZlclNpemUgPCBuZXdzaXplKQogCQlOZXRCb290RmlsZVhmZXJTaXplID0gbmV3c2l6ZTsKQEAgLTEwOCw2ICsxNDUsMTMgQEAKIAlpbnQJCQlsZW4gPSAwOwogCXZvbGF0aWxlIHVzaG9ydCAqczsKIAorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJLyogTXVsdGljYXN0IFRGVFAuLiBub24tTWFzdGVyQ2xpZW50cyBkbyBub3QgQUNLIGRhdGEuICovCisJaWYgKE11bHRpY2FzdAorCSAmJiAoVGZ0cFN0YXRlID09IFNUQVRFX0RBVEEpCisJICYmIChNYXN0ZXJDbGllbnQgPT0gMCkpCisJCXJldHVybjsKKyNlbmRpZgogCS8qCiAJICoJV2Ugd2lsbCBhbHdheXMgYmUgc2VuZGluZyBzb21lIHNvcnQgb2YgcGFja2V0LCBzbwogCSAqCWNvYmJsZSB0b2dldGhlciB0aGUgcGFja2V0IGhlYWRlcnMgbm93LgpAQCAtMTMyLDExICsxNzYsMzAgQEAKIAkJcHJpbnRmKCJzZW5kIG9wdGlvbiBcInRpbWVvdXQgJXNcIlxuIiwgKGNoYXIgKilwa3QpOwogI2VuZGlmCiAJCXBrdCArPSBzdHJsZW4oKGNoYXIgKilwa3QpICsgMTsKKwkJLyogdHJ5IGZvciBtb3JlIGVmZmljLiBibGsgc2l6ZSAqLworCQlwa3QgKz0gc3ByaW50ZigoY2hhciAqKXBrdCwiYmxrc2l6ZSVjJWQlYyIsCisJCQkJMCxodG9ucyhUZnRwQmxrU2l6ZU9wdGlvbiksMCk7CisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKwkJLyogQ2hlY2sgYWxsIHByZWNvbmRpdGlvbnMgYmVmb3JlIGV2ZW4gdHJ5aW5nIHRoZSBvcHRpb24gKi8KKwkJaWYgKCFQcm9oaWJpdE1jYXN0CisJCSAmJiAoQml0bWFwPW1hbGxvYyhNYXBzaXplKSkKKwkJICYmIGV0aF9nZXRfZGV2KCktPm1jYXN0KSB7CisJCQlmcmVlKEJpdG1hcCk7CisJCQlCaXRtYXA9TlVMTDsKKwkJCXBrdCArPSBzcHJpbnRmKChjaGFyICopcGt0LCJtdWx0aWNhc3QlYyVjIiwwLDApOworCQl9CisjZW5kaWYgLyogQ09ORklHX01DQVNUX1RGVFAgKi8KIAkJbGVuID0gcGt0IC0geHA7CiAJCWJyZWFrOwogCi0JY2FzZSBTVEFURV9EQVRBOgogCWNhc2UgU1RBVEVfT0FDSzoKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCQkvKiBNeSB0dXJuISAgU3RhcnQgYXQgd2hlcmUgSSBuZWVkIGJsb2NrcyBJIG1pc3NlZC4qLworCQlpZiAoTXVsdGljYXN0KQorCQkJVGZ0cEJsb2NrPWV4dDJfZmluZF9uZXh0X3plcm9fYml0KEJpdG1hcCwoTWFwc2l6ZSo4KSwwKTsKKwkJLyouLmZhbGxpbmcuLiovCisjZW5kaWYKKwljYXNlIFNUQVRFX0RBVEE6CiAJCXhwID0gcGt0OwogCQlzID0gKHVzaG9ydCAqKXBrdDsKIAkJKnMrKyA9IGh0b25zKFRGVFBfQUNLKTsKQEAgLTE3Nyw4ICsyNDAsMTMgQEAKIHsKIAl1c2hvcnQgcHJvdG87CiAJdXNob3J0ICpzOworCWludCBpOwogCiAJaWYgKGRlc3QgIT0gVGZ0cE91clBvcnQpIHsKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCQlpZiAoTXVsdGljYXN0CisJCSAmJiAoIU1jYXN0X3BvcnQgfHwgKGRlc3QgIT0gTWNhc3RfcG9ydCkpKQorI2VuZGlmCiAJCXJldHVybjsKIAl9CiAJaWYgKFRmdHBTdGF0ZSAhPSBTVEFURV9SUlEgJiYgc3JjICE9IFRmdHBTZXJ2ZXJQb3J0KSB7CkBAIC0yMDgsNiArMjc2LDI0IEBACiAjZW5kaWYKIAkJVGZ0cFN0YXRlID0gU1RBVEVfT0FDSzsKIAkJVGZ0cFNlcnZlclBvcnQgPSBzcmM7CisJCS8qIENoZWNrIGZvciAnYmxrc2l6ZScgb3B0aW9uICovCisJCWZvciAoaT0wO2k8bGVuLTg7aSsrKSB7CisJCQlpZiAoc3RyY21wICgoY2hhciopcGt0K2ksImJsa3NpemUiKSA9PSAwKSB7CisJCQkJVGZ0cEJsa1NpemUgPSAodW5zaWduZWQgc2hvcnQpCisJCQkJCXNpbXBsZV9zdHJ0b3VsKChjaGFyKilwa3QraSs4LE5VTEwsMTApOworI2lmZGVmIEVUX0RFQlVHCisJCQkJcHJpbnRmICgiQmxvY2tzaXplIGFjazogJXMsICVkXG4iLAorCQkJCQkoY2hhciopcGt0K2krOCxUZnRwQmxrU2l6ZSk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCXBhcnNlX211bHRpY2FzdF9vYWNrKChjaGFyICopcGt0LGxlbi0xKTsKKwkJaWYgKChNdWx0aWNhc3QpICYmICghTWFzdGVyQ2xpZW50KSkKKwkJCVRmdHBTdGF0ZSA9IFNUQVRFX0RBVEE7CS8qIHBhc3NpdmUuLiAqLworCQllbHNlCisjZW5kaWYKIAkJVGZ0cFNlbmQgKCk7IC8qIFNlbmQgQUNLICovCiAJCWJyZWFrOwogCWNhc2UgVEZUUF9EQVRBOgpAQCAtMjI0LDcgKzMxMCw3IEBACiAJCSAqLwogCQlpZiAoVGZ0cEJsb2NrID09IDApIHsKIAkJCVRmdHBCbG9ja1dyYXArKzsKLQkJCVRmdHBCbG9ja1dyYXBPZmZzZXQgKz0gVEZUUF9CTE9DS19TSVpFICogVEZUUF9TRVFVRU5DRV9TSVpFOworCQkJVGZ0cEJsb2NrV3JhcE9mZnNldCArPSBUZnRwQmxrU2l6ZSAqIFRGVFBfU0VRVUVOQ0VfU0laRTsKIAkJCXByaW50ZiAoIlxuXHQgJWx1IE1CIHJlY2VpdmVkXG5cdCAiLCBUZnRwQmxvY2tXcmFwT2Zmc2V0Pj4yMCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoKChUZnRwQmxvY2sgLSAxKSAlIDEwKSA9PSAwKSB7CkBAIC0yNDgsNiArMzM0LDExIEBACiAJCQlUZnRwQmxvY2tXcmFwID0gMDsKIAkJCVRmdHBCbG9ja1dyYXBPZmZzZXQgPSAwOwogCisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKwkJCWlmIChNdWx0aWNhc3QpIHsgLyogc3RhcnQhPTEgY29tbW9uIGlmIG1jYXN0ICovCisJCQkJVGZ0cExhc3RCbG9jayA9IFRmdHBCbG9jayAtIDE7CisJCQl9IGVsc2UKKyNlbmRpZgogCQkJaWYgKFRmdHBCbG9jayAhPSAxKSB7CS8qIEFzc2VydGlvbiAqLwogCQkJCXByaW50ZiAoIlxuVEZUUCBlcnJvcjogIgogCQkJCQkiRmlyc3QgYmxvY2sgaXMgbm90IGJsb2NrIDEgKCVsZClcbiIKQEAgLTI3NCw5ICszNjUsNDQgQEAKIAkJICoJQWNrbm9sZWRnZSB0aGUgYmxvY2sganVzdCByZWNlaXZlZCwgd2hpY2ggd2lsbCBwcm9tcHQKIAkJICoJdGhlIHNlcnZlciBmb3IgdGhlIG5leHQgb25lLgogCQkgKi8KKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCQkvKiBpZiBJIGFtIHRoZSBNYXN0ZXJDbGllbnQsIGFjdGl2ZWx5IGNhbGN1bGF0ZSB3aGF0IG15IG5leHQKKwkJICogbmVlZGVkIGJsb2NrIGlzOyBlbHNlIEknbSBwYXNzaXZlOyBub3QgQUNLSU5HCisgCQkgKi8KKwkJaWYgKE11bHRpY2FzdCkgeworCQkJaWYgKGxlbiA8IFRmdHBCbGtTaXplKSAgeworCQkJCVRmdHBFbmRpbmdCbG9jayA9IFRmdHBCbG9jazsKKwkJCX0gZWxzZSBpZiAoTWFzdGVyQ2xpZW50KSB7CisJCQkJVGZ0cEJsb2NrID0gUHJldkJpdG1hcEhvbGUgPQorCQkJCQlleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdCgKKwkJCQkJCUJpdG1hcCwKKwkJCQkJCShNYXBzaXplKjgpLAorCQkJCQkJUHJldkJpdG1hcEhvbGUpOworCQkJCWlmIChUZnRwQmxvY2sgPiAoKE1hcHNpemUqOCkgLSAxKSkgeworCQkJCQlwcmludGYgKCJ0ZnRwZmlsZSB0b28gYmlnXG4iKTsKKwkJCQkJLyogdHJ5IHRvIGRvdWJsZSBpdCBhbmQgcmV0cnkgKi8KKwkJCQkJTWFwc2l6ZTw8PTE7CisJCQkJCW1jYXN0X2NsZWFudXAoKTsKKwkJCQkJTmV0U3RhcnRBZ2FpbiAoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlUZnRwTGFzdEJsb2NrID0gVGZ0cEJsb2NrOworCQkJfQorCQl9CisjZW5kaWYKIAkJVGZ0cFNlbmQgKCk7CiAKLQkJaWYgKGxlbiA8IFRGVFBfQkxPQ0tfU0laRSkgeworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCWlmIChNdWx0aWNhc3QpIHsKKwkJCWlmIChNYXN0ZXJDbGllbnQgJiYgKFRmdHBCbG9jayA+PSBUZnRwRW5kaW5nQmxvY2spKSB7CisJCQkJcHV0cyAoIlxuTXVsdGljYXN0IHRmdHAgZG9uZVxuIik7CisJCQkJbWNhc3RfY2xlYW51cCgpOworCQkJCU5ldFN0YXRlID0gTkVUTE9PUF9TVUNDRVNTOworCQkJfQorCQl9CisJCWVsc2UKKyNlbmRpZgorCQlpZiAobGVuIDwgVGZ0cEJsa1NpemUpIHsKIAkJCS8qCiAJCQkgKglXZSByZWNlaXZlZCB0aGUgd2hvbGUgdGhpbmcuICBUcnkgdG8KIAkJCSAqCXJ1biBpdC4KQEAgLTI5MCw2ICs0MTYsOSBAQAogCQlwcmludGYgKCJcblRGVFAgZXJyb3I6ICclcycgKCVkKVxuIiwKIAkJCQkJcGt0ICsgMiwgbnRvaHMoKih1c2hvcnQgKilwa3QpKTsKIAkJcHV0cyAoIlN0YXJ0aW5nIGFnYWluXG5cbiIpOworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCW1jYXN0X2NsZWFudXAoKTsKKyNlbmRpZgogCQlOZXRTdGFydEFnYWluICgpOwogCQlicmVhazsKIAl9CkBAIC0zMDEsNiArNDMwLDkgQEAKIHsKIAlpZiAoKytUZnRwVGltZW91dENvdW50ID4gVElNRU9VVF9DT1VOVCkgewogCQlwdXRzICgiXG5SZXRyeSBjb3VudCBleGNlZWRlZDsgc3RhcnRpbmcgYWdhaW5cbiIpOworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCW1jYXN0X2NsZWFudXAoKTsKKyNlbmRpZgogCQlOZXRTdGFydEFnYWluICgpOwogCX0gZWxzZSB7CiAJCXB1dHMgKCJUICIpOwpAQCAtMzcwLDYgKzUwMiw3IEBACiAJVGZ0cFN0YXRlID0gU1RBVEVfUlJROwogCS8qIFVzZSBhIHBzZXVkby1yYW5kb20gcG9ydCB1bmxlc3MgYSBzcGVjaWZpYyBwb3J0IGlzIHNldCAqLwogCVRmdHBPdXJQb3J0ID0gMTAyNCArIChnZXRfdGltZXIoMCkgJSAzMDcyKTsKKwogI2lmZGVmIENPTkZJR19URlRQX1BPUlQKIAlpZiAoKGVwID0gZ2V0ZW52KCJ0ZnRwZHN0cCIpKSAhPSBOVUxMKSB7CiAJCVRmdHBTZXJ2ZXJQb3J0ID0gc2ltcGxlX3N0cnRvbChlcCwgTlVMTCwgMTApOwpAQCAtMzgyLDggKzUxNSwxMDMgQEAKIAogCS8qIHplcm8gb3V0IHNlcnZlciBldGhlciBpbiBjYXNlIHRoZSBzZXJ2ZXIgaXAgaGFzIGNoYW5nZWQgKi8KIAltZW1zZXQoTmV0U2VydmVyRXRoZXIsIDAsIDYpOworCS8qIFJldmVydCBUZnRwQmxrU2l6ZSB0byBkZmx0ICovCisJVGZ0cEJsa1NpemUgPSBURlRQX0JMT0NLX1NJWkU7CisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKyAgICAJbWNhc3RfY2xlYW51cCgpOworI2VuZGlmCiAKIAlUZnRwU2VuZCAoKTsKIH0KIAorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisvKiBDcmVkaXRzOiBhdGZ0cCBwcm9qZWN0LgorICovCisKKy8qIHBpY2sgdXAgQmNhc3RBZGRyLCBQb3J0LCBhbmQgd2hldGhlciBJIGFtIFtub3ddIHRoZSBtYXN0ZXItY2xpZW50LiAqCisgKiBGcmFtZToKKyAqICAgICstLS0tLS0tKy0tLS0tLS0tLS0tKy0tLSstLS0tLS0tfn4tLS0tLS0tKy0tLSsKKyAqICAgIHwgIG9wYyAgfCBtdWx0aWNhc3QgfCAwIHwgYWRkciwgcG9ydCwgbWMgfCAwIHwKKyAqICAgICstLS0tLS0tKy0tLS0tLS0tLS0tKy0tLSstLS0tLS0tfn4tLS0tLS0tKy0tLSsKKyAqIFRoZSBtdWx0aWNhc3QgYWRkci9wb3J0IGJlY29tZXMgd2hhdCBJIGxpc3RlbiB0bywgYW5kIGlmICdtYycgaXMgJzEnIHRoZW4KKyAqIEkgYW0gdGhlIG5ldyBtYXN0ZXItY2xpZW50IHNvIG11c3Qgc2VuZCBBQ0tzIHRvIERhdGFCbG9ja3MuICBJZiBJIGFtIG5vdAorICogbWFzdGVyLWNsaWVudCwgSSdtIGEgcGFzc2l2ZSBjbGllbnQsIGdhdGhlcmluZyB3aGF0IERhdGFCbG9ja3MgSSBtYXkgYW5kCisgKiBtYWtpbmcgbm90ZSBvZiB3aGljaCBvbmVzIEkgZ290IGluIG15IGJpdG1hc2suCisgKiBJbiB0aGVvcnksIEkgbmV2ZXIgZ28gZnJvbSBtYXN0ZXItPnBhc3NpdmUuLgorICogLi4gdGhpcyBjb21lcyBpbiB3aXRoIHBrdCBhbHJlYWR5IHBvaW50aW5nIGp1c3QgcGFzdCBvcGMKKyAqLworc3RhdGljIHZvaWQgcGFyc2VfbXVsdGljYXN0X29hY2soY2hhciAqcGt0LCBpbnQgbGVuKQoreworIGludCBpOworIElQYWRkcl90IGFkZHI7CisgY2hhciAqbWNfYWRyLCAqcG9ydCwgICptYzsKKworCW1jX2Fkcj1wb3J0PW1jPU5VTEw7CisJLyogbWFyY2ggYWxvbmcgbG9va2luZyBmb3IgJ211bHRpY2FzdFwwJywgd2hpY2ggaGFzIHRvIHN0YXJ0IGF0IGxlYXN0CisJICogMTQgYnl0ZXMgYmFjayBmcm9tIHRoZSBlbmQuCisJICovCisJZm9yIChpPTA7aTxsZW4tMTQ7aSsrKQorCQlpZiAoc3RyY21wIChwa3QraSwibXVsdGljYXN0IikgPT0gMCkKKwkJCWJyZWFrOworCWlmIChpID49IChsZW4tMTQpKSAvKiBub24tTXVsdGljYXN0IE9BQ0ssIGlnbi4gKi8KKwkJcmV0dXJuOworCisJaSs9MTA7IC8qIHN0cmxlbiBtdWx0aWNhc3QgKi8KKwltY19hZHIgPSBwa3QraTsKKwlmb3IgKDtpPGxlbjtpKyspIHsKKwkJaWYgKCoocGt0K2kpID09ICcsJykgeworCQkJKihwa3QraSkgPSAnXDAnOworCQkJaWYgKHBvcnQpIHsKKwkJCQltYyA9IHBrdCtpKzE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXBvcnQgPSBwa3QraSsxOworCQkJfQorCQl9CisJfQorCWlmICghcG9ydCB8fCAhbWNfYWRyIHx8ICFtYyApIHJldHVybjsKKwlpZiAoTXVsdGljYXN0ICYmIE1hc3RlckNsaWVudCkgeworCQlwcmludGYgKCJJIGdvdCBhIE9BQ0sgYXMgbWFzdGVyIENsaWVudCwgV1JPTkchXG4iKTsKKwkJcmV0dXJuOworCX0KKwkvKiAuLkkgbm93IGFjY2VwdCBwYWNrZXRzIGRlc3RpbmVkIGZvciB0aGlzIE1DQVNUIGFkZHIsIHBvcnQgKi8KKwlpZiAoIU11bHRpY2FzdCkgeworCQlpZiAoQml0bWFwKSB7CisJCQlwcmludGYgKCJJbnRlcm5hbCBmYWlsdXJlISBubyBtY2FzdC5cbiIpOworCQkJZnJlZShCaXRtYXApOworCQkJQml0bWFwPU5VTEw7CisJCQlQcm9oaWJpdE1jYXN0PTE7CisJCQlyZXR1cm4gOworCQl9CisJCS8qIEkgbWFsbG9jIGluc3RlYWQgb2YgcHJlLWRlY2xhcmU7IHNvIHRoYXQgaWYgdGhlIGZpbGUgZW5kcworCQkgKiB1cCBiZWluZyB0b28gYmlnIGZvciB0aGlzIGJpdG1hcCBJIGNhbiByZXRyeQorCQkgKi8KKwkJaWYgKCEoQml0bWFwID0gbWFsbG9jIChNYXBzaXplKSkpIHsKKwkJCXByaW50ZiAoIk5vIEJpdG1hcCwgbm8gbXVsdGljYXN0LiBTb3JyeS5cbiIpOworCQkJUHJvaGliaXRNY2FzdD0xOworCQkJcmV0dXJuOworCQl9CisJCW1lbXNldCAoQml0bWFwLDAsTWFwc2l6ZSk7CisJCVByZXZCaXRtYXBIb2xlID0gMDsKKwkJTXVsdGljYXN0ID0gMTsKKwl9CisJYWRkciA9IHN0cmluZ190b19pcChtY19hZHIpOworCWlmIChNY2FzdF9hZGRyICE9IGFkZHIpIHsKKwkJaWYgKE1jYXN0X2FkZHIpCisJCQlldGhfbWNhc3Rfam9pbihNY2FzdF9hZGRyLCAwKTsKKwkJaWYgKGV0aF9tY2FzdF9qb2luKE1jYXN0X2FkZHI9YWRkciwgMSkpIHsKKwkJCXByaW50ZiAoIkZhaWwgdG8gc2V0IG1jYXN0LCByZXZlcnQgdG8gVEZUUFxuIik7CisJCQlQcm9oaWJpdE1jYXN0PTE7CisJCQltY2FzdF9jbGVhbnVwKCk7CisJCQlOZXRTdGFydEFnYWluKCk7CisJCX0KKwl9CisJTWFzdGVyQ2xpZW50ID0gKHVuc2lnbmVkIGNoYXIpc2ltcGxlX3N0cnRvdWwoKGNoYXIgKiltYyxOVUxMLDEwKTsKKwlNY2FzdF9wb3J0ID0gKHVuc2lnbmVkIHNob3J0KXNpbXBsZV9zdHJ0b3VsKHBvcnQsTlVMTCwxMCk7CisJcHJpbnRmICgiTXVsdGljYXN0OiAlczolZCBbJWRdXG4iLCBtY19hZHIsIE1jYXN0X3BvcnQsIE1hc3RlckNsaWVudCk7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogTXVsdGljYXN0IFRGVFAgKi8KKwogI2VuZGlmIC8qIENGR19DTURfTkVUICovCmRpZmYgLS1naXQgYS9wb3N0L2JvYXJkL2x3bW9uNS9NYWtlZmlsZSBiL3Bvc3QvYm9hcmQvbHdtb241L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjU0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2JvYXJkL2x3bW9uNS9NYWtlZmlsZQpAQCAtMCwwICsxLDI5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA3CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKworTElCCT0gbGlicG9zdGx3bW9uNS5hCisKK0NPQkpTCT0gZWNjLm8KKworaW5jbHVkZSAkKFRPUERJUikvcG9zdC9ydWxlcy5tawpkaWZmIC0tZ2l0IGEvcG9zdC9ib2FyZC9sd21vbjUvZWNjLmMgYi9wb3N0L2JvYXJkL2x3bW9uNS9lY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmEzYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9ib2FyZC9sd21vbjUvZWNjLmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIERldmVsb3BlZCBmb3IgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyBHbWJILgorICoKKyAqIEF1dGhvcjogUGF2ZWwgS29sZXNuaWtvdiA8Y29uY29yZEBlbWNyYWZ0LmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBkZWZpbmUgREVCVUcgZm9yIGRlYnVnZ2luZyBvdXRwdXQgKG9idmlvdXNseSA7LSkpICovCisjaWYgMAorI2RlZmluZSBERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRUNDCisKKy8qCisgKiBNRU1PUlkgRUNDIHRlc3QKKyAqCisgKiBUaGlzIHRlc3QgcGVyZm9ybXMgdGhlIGNoZWNrcyBFQ0MgZmFjaWxpdHkgb2YgbWVtb3J5LgorICovCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwcGM0NDAuaD4KKworI2luY2x1ZGUgIi4uLy4uLy4uL2JvYXJkL2x3bW9uNS9zZHJhbS5oIgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworY29uc3Qgc3RhdGljIHVuc2lnbmVkIGNoYXIgc3luZHJvbWVfY29kZXNbXSA9IHsKKwkweEY0LCAwWEYxLCAwWEVDICwwWEVBLCAwWEU5LCAwWEU2LCAwWEU1LCAwWEUzLAorCTBYREMsIDBYREEsIDBYRDksIDBYRDYsIDBYRDUsIDBYRDMsIDBYQ0UsIDBYQ0IsCisJMHhCNSwgMFhCMCwgMFhBRCwgMFhBQiwgMFhBOCwgMFhBNywgMFhBNCwgMFhBMiwKKwkwWDlELCAwWDlCLCAwWDk4LCAwWDk3LCAwWDk0LCAwWDkyLCAwWDhGLCAwWDhBLAorCTB4NzUsIDB4NzAsIDBYNkQsIDBYNkIsIDBYNjgsIDBYNjcsIDBYNjQsIDBYNjIsCisJMFg1RSwgMFg1QiwgMFg1OCwgMFg1NywgMFg1NCwgMFg1MiwgMFg0RiwgMFg0QSwKKwkweDM0LCAweDMxLCAwWDJDLCAwWDJBLCAwWDI5LCAwWDI2LCAwWDI1LCAwWDIzLAorCTBYMUMsIDBYMUEsIDBYMTksIDBYMTYsIDBYMTUsIDBYMTMsIDBYMEUsIDBYMEIsCisJMHg4MCwgMHg0MCwgMHgyMCwgMHgxMCwgMHgwOCwgMHgwNCwgMHgwMiwgMHgwMQorfTsKKworI2RlZmluZSBFQ0NfU1RBUlRfQUREUgkJMHgxMAorI2RlZmluZSBFQ0NfU1RPUF9BRERSCQkweDIwMDAKKyNkZWZpbmUgRUNDX1BBVFRFUk4JCTB4MDEwMTAxMDEwMTAxMDEwMXVsbAorI2RlZmluZSBFQ0NfUEFUVEVSTl9DT1JSCTB4MDEwMTAxMDEwMTAxMDEwMHVsbAorI2RlZmluZSBFQ0NfUEFUVEVSTl9VTkNPUlIJMHgwMTAxMDEwMTAxMDEwMTBGdWxsCisKK3N0YXRpYyBpbnQgdGVzdF9lY2NfZXJyb3Iodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgaGRhdGEsIGxkYXRhLCBoYWRkciwgbGFkZHI7CisJdW5zaWduZWQgaW50IGJpdDsKKworCWludCByZXQgPSAwOworCisJbWZzZHJhbShERFIwXzIzLCB2YWx1ZSk7CisKKwlmb3IgKGJpdCA9IDA7IGJpdCA8IHNpemVvZihzeW5kcm9tZV9jb2Rlcyk7IGJpdCsrKQorCQlpZiAoc3luZHJvbWVfY29kZXNbYml0XSA9PSAoKHZhbHVlID4+IDE2KSAmIDB4ZmYpKQorCQkJYnJlYWs7CisKKwltZnNkcmFtKEREUjBfMDAsIHZhbHVlKTsKKworCWlmICh2YWx1ZSAmIEREUjBfMDBfSU5UX1NUQVRVU19CSVQwKSB7CisJCWRlYnVnKCJCaXQwLiBBIHNpbmdsZSBhY2Nlc3Mgb3V0c2lkZSB0aGUgZGVmaW5lZCBQSFlTSUNBTCIKKwkJICAgICAgIiBtZW1vcnkgc3BhY2UgZGV0ZWN0ZWRcbiIpOworCQltZnNkcmFtKEREUjBfMzIsIGxhZGRyKTsKKwkJbWZzZHJhbShERFIwXzMzLCBoYWRkcik7CisJCWRlYnVnKCIgICAgICAgIGFkZHIgPSAweCUwOHglMDh4XG4iLCBoYWRkciwgbGFkZHIpOworCQlyZXQgPSAxOworCX0KKwlpZiAodmFsdWUgJiBERFIwXzAwX0lOVF9TVEFUVVNfQklUMSkgeworCQlkZWJ1ZygiQml0MS4gTXVsdGlwbGUgYWNjZXNzZXMgb3V0c2lkZSB0aGUgZGVmaW5lZCBQSFlTSUNBTCIKKwkJICAgICAgIiBtZW1vcnkgc3BhY2UgZGV0ZWN0ZWRcbiIpOworCQlyZXQgPSAyOworCX0KKwlpZiAodmFsdWUgJiBERFIwXzAwX0lOVF9TVEFUVVNfQklUMikgeworCQlkZWJ1ZygiQml0Mi4gU2luZ2xlIGNvcnJlY3RhYmxlIEVDQyBldmVudCBkZXRlY3RlZFxuIik7CisJCW1mc2RyYW0oRERSMF8zOCwgbGFkZHIpOworCQltZnNkcmFtKEREUjBfMzksIGhhZGRyKTsKKwkJbWZzZHJhbShERFIwXzQwLCBsZGF0YSk7CisJCW1mc2RyYW0oRERSMF80MSwgaGRhdGEpOworCQlkZWJ1ZygiICAgICAgICAweCUwOHggLSAweCUwOHglMDh4LCBiaXQgLSAlZFxuIiwKKwkJICAgICAgbGFkZHIsIGhkYXRhLCBsZGF0YSwgYml0KTsKKwkJcmV0ID0gMzsKKwl9CisJaWYgKHZhbHVlICYgRERSMF8wMF9JTlRfU1RBVFVTX0JJVDMpIHsKKwkJZGVidWcoIkJpdDMuIE11bHRpcGxlIGNvcnJlY3RhYmxlIEVDQyBldmVudHMgZGV0ZWN0ZWRcbiIpOworCQltZnNkcmFtKEREUjBfMzgsIGxhZGRyKTsKKwkJbWZzZHJhbShERFIwXzM5LCBoYWRkcik7CisJCW1mc2RyYW0oRERSMF80MCwgbGRhdGEpOworCQltZnNkcmFtKEREUjBfNDEsIGhkYXRhKTsKKwkJZGVidWcoIiAgICAgICAgMHglMDh4IC0gMHglMDh4JTA4eCwgYml0IC0gJWRcbiIsCisJCSAgICAgIGxhZGRyLCBoZGF0YSwgbGRhdGEsIGJpdCk7CisJCXJldCA9IDQ7CisJfQorCWlmICh2YWx1ZSAmIEREUjBfMDBfSU5UX1NUQVRVU19CSVQ0KSB7CisJCWRlYnVnKCJCaXQ0LiBTaW5nbGUgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnQgZGV0ZWN0ZWRcbiIpOworCQltZnNkcmFtKEREUjBfMzQsIGxhZGRyKTsKKwkJbWZzZHJhbShERFIwXzM1LCBoYWRkcik7CisJCW1mc2RyYW0oRERSMF8zNiwgbGRhdGEpOworCQltZnNkcmFtKEREUjBfMzcsIGhkYXRhKTsKKwkJZGVidWcoIiAgICAgICAgMHglMDh4IC0gMHglMDh4JTA4eCwgYml0IC0gJWRcbiIsCisJCSAgICAgIGxhZGRyLCBoZGF0YSwgbGRhdGEsIGJpdCk7CisJCXJldCA9IDU7CisJfQorCWlmICh2YWx1ZSAmIEREUjBfMDBfSU5UX1NUQVRVU19CSVQ1KSB7CisJCWRlYnVnKCJCaXQ1LiBNdWx0aXBsZSB1bmNvcnJlY3RhYmxlIEVDQyBldmVudHMgZGV0ZWN0ZWRcbiIpOworCQltZnNkcmFtKEREUjBfMzQsIGxhZGRyKTsKKwkJbWZzZHJhbShERFIwXzM1LCBoYWRkcik7CisJCW1mc2RyYW0oRERSMF8zNiwgbGRhdGEpOworCQltZnNkcmFtKEREUjBfMzcsIGhkYXRhKTsKKwkJZGVidWcoIiAgICAgICAgMHglMDh4IC0gMHglMDh4JTA4eCwgYml0IC0gJWRcbiIsCisJCSAgICAgIGxhZGRyLCBoZGF0YSwgbGRhdGEsIGJpdCk7CisJCXJldCA9IDY7CisJfQorCWlmICh2YWx1ZSAmIEREUjBfMDBfSU5UX1NUQVRVU19CSVQ2KSB7CisJCWRlYnVnKCJCaXQ2LiBEUkFNIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlXG4iKTsKKwkJcmV0ID0gNzsKKwl9CisKKwkvKiBlcnJvciBzdGF0dXMgY2xlYXJlZCAqLworCW1mc2RyYW0oRERSMF8wMCwgdmFsdWUpOworCW10c2RyYW0oRERSMF8wMCwgdmFsdWUgfCBERFIwXzAwX0lOVF9BQ0tfQUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9lY2ModW5zaWduZWQgbG9uZyBlY2NfYWRkcikKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgKmVjY19tZW07CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGVjY19kYXRhOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmxlY2NfbWVtOworCWludCBwcmV0LCByZXQgPSAwOworCisJc3luYygpOworCWVpZWlvKCk7CisJV0FUQ0hET0dfUkVTRVQoKTsKKworCWVjY19tZW0gPSAodW5zaWduZWQgbG9uZyBsb25nICopZWNjX2FkZHI7CisJbGVjY19tZW0gPSAodWxvbmcgKillY2NfYWRkcjsKKwkqZWNjX21lbSA9IEVDQ19QQVRURVJOOworCXByZXQgPSB0ZXN0X2VjY19lcnJvcigpOworCWlmIChwcmV0ICE9IDApCisJCXJldCA9IDE7CisKKwkvKiBkaXNjb25uZWN0IGVjYyAqLworCW1mc2RyYW0oRERSMF8yMiwgdmFsdWUpOworCW10c2RyYW0oRERSMF8yMiwgKHZhbHVlICZ+IEREUjBfMjJfQ1RSTF9SQVdfTUFTSykKKwkJfCBERFIwXzIyX0NUUkxfUkFXX0VDQ19ESVNBQkxFKTsKKworCS8qIGluamVjdGluZyBlcnJvciAqLworCSplY2NfbWVtID0gRUNDX1BBVFRFUk5fQ09SUjsKKworCS8qIGVuYWJsZSBlY2MgKi8KKwltZnNkcmFtKEREUjBfMjIsIHZhbHVlKTsKKwltdHNkcmFtKEREUjBfMjIsICh2YWx1ZSAmfiBERFIwXzIyX0NUUkxfUkFXX01BU0spCisJCXwgRERSMF8yMl9DVFJMX1JBV19FQ0NfRU5BQkxFKTsKKworCWVjY19kYXRhID0gKmxlY2NfbWVtOworCXByZXQgPSB0ZXN0X2VjY19lcnJvcigpOworCS8qIGlmIHJlYWQgZGF0YSBvaywgMSBjb3JyZWN0YWJsZSBlcnJvciBtdXN0IGJlIGZpeGVkICovCisJaWYgKHByZXQgIT0gMykKKwkJcmV0ID0gMTsKKworCS8qIHRlc3QgZm9yIHVuY29ycmVjdGFibGUgZXJyb3IgKi8KKwkvKiBkaXNjb25uZWN0IGZyb20gZWNjIHN0b3JhZ2UgKi8KKwltZnNkcmFtKEREUjBfMjIsIHZhbHVlKTsKKwltdHNkcmFtKEREUjBfMjIsICh2YWx1ZSAmfiBERFIwXzIyX0NUUkxfUkFXX01BU0spCisJCXwgRERSMF8yMl9DVFJMX1JBV19OT19FQ0NfUkFNKTsKKworCS8qIGluamVjdGluZyBtdWx0aXBseSBiaXQgZXJyb3IgKi8KKworCSplY2NfbWVtID0gRUNDX1BBVFRFUk5fVU5DT1JSOworCisJLyogZW5hYmxlIGVjYyAqLworCW1mc2RyYW0oRERSMF8yMiwgdmFsdWUpOworCW10c2RyYW0oRERSMF8yMiwgKHZhbHVlICZ+IEREUjBfMjJfQ1RSTF9SQVdfTUFTSykKKwkJfCBERFIwXzIyX0NUUkxfUkFXX0VDQ19FTkFCTEUpOworCisJZWNjX2RhdGEgPSAqbGVjY19tZW07CisJLyogd2hhdCB0aGUgZGF0YSBzaG91bGQgYmUgcmVhZD8gKi8KKworCXByZXQgPSB0ZXN0X2VjY19lcnJvcigpOworCS8qIGluZm8gYWJvdXQgdW5jb3JyZWN0YWJsZSBlcnJvciBtdXN0IGFwcGVhciAqLworCWlmIChwcmV0ICE9IDUpCisJCXJldCA9IDE7CisKKwlzeW5jKCk7CisJZWllaW8oKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlY2NfcG9zdF90ZXN0IChpbnQgZmxhZ3MpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGlhZGRyOworCisjaWYgQ09ORklHX0REUl9FQ0MKKwlzeW5jKCk7CisJZWllaW8oKTsKKworCS8qIG1hc2sgYWxsIGludCAqLworCW1mc2RyYW0oRERSMF8wMSwgdmFsdWUpOworCW10c2RyYW0oRERSMF8wMSwgKHZhbHVlICZ+IEREUjBfMDFfSU5UX01BU0tfTUFTSykKKwkJfCBERFIwXzAxX0lOVF9NQVNLX0FMTF9PRkYpOworCisJLyogY2xlYXIgZXJyb3Igc3RhdHVzICovCisJbWZzZHJhbShERFIwXzAwLCB2YWx1ZSk7CisJbXRzZHJhbShERFIwXzAwLCB2YWx1ZSB8IEREUjBfMDBfSU5UX0FDS19BTEwpOworCisJLyogZW5hYmxlIGZ1bGwgc3VwcG9ydCBvZiBFQ0MgKi8KKwltZnNkcmFtKEREUjBfMjIsIHZhbHVlKTsKKwltdHNkcmFtKEREUjBfMjIsICh2YWx1ZSAmfiBERFIwXzIyX0NUUkxfUkFXX01BU0spCisJCXwgRERSMF8yMl9DVFJMX1JBV19FQ0NfRU5BQkxFKTsKKworCWZvciAoaWFkZHIgPSBFQ0NfU1RBUlRfQUREUjsgaWFkZHIgPCBFQ0NfU1RPUF9BRERSOyBpYWRkciArPSBpYWRkcikgeworCQlyZXQgPSB0ZXN0X2VjYyhpYWRkcik7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwkvKiBjbGVhciBlcnJvciBzdGF0dXMgKi8KKwltZnNkcmFtKEREUjBfMDAsIHZhbHVlKTsKKwltdHNkcmFtKEREUjBfMDAsIHZhbHVlIHwgRERSMF8wMF9JTlRfQUNLX0FMTCk7CisKKwkvKgorCSAqIENsZWFyIHBvc3NpYmxlIGVycm9ycyByZXN1bHRpbmcgZnJvbSBFQ0MgdGVzdGluZy4KKwkgKiBJZiBub3QgZG9uZSwgdGhlbiB3ZSBjb3VsZCBnZXQgYW4gaW50ZXJydXB0IGxhdGVyIG9uIHdoZW4KKwkgKiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgorCSAqLworCXNldF9tY3NyKGdldF9tY3NyKCkpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0OworCit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0VDQyAqLworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9wb3N0L2NwdS9wcGM0eHgvY2FjaGUuYyBiL3Bvc3QvY3B1L3BwYzR4eC9jYWNoZS5jCmluZGV4IGUxZjk4OWUuLjEwOWNhMWYgMTAwNjQ0Ci0tLSBhL3Bvc3QvY3B1L3BwYzR4eC9jYWNoZS5jCisrKyBiL3Bvc3QvY3B1L3BwYzR4eC9jYWNoZS5jCkBAIC01MywxNCArNTMsMjUgQEAKIAogc3RhdGljIGludCB0bGIgPSAtMTsJCS8qIGluZGV4IHRvIHRoZSB2aWN0aW0gVExCIGVudHJ5ICovCiAKKyNpZmRlZiBDT05GSUdfNDQwCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0ZXN0YXJlYVtDQUNIRV9QT1NUX1NJWkVdCiBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhDQUNIRV9QT1NUX1NJWkUpKSk7CisjZW5kaWYKIAogaW50IGNhY2hlX3Bvc3RfdGVzdCAoaW50IGZsYWdzKQogewogCXZvaWQqIHZpcnQgPSAodm9pZCopQ0ZHX1BPU1RfQ0FDSEVfQUREUjsKLQlpbnQgaW50cywgaSwgcmVzID0gMDsKLQl1MzIgd29yZDA7CisJaW50IGludHM7CisJaW50IHJlcyA9IDA7CisKKwkvKgorCSAqIEFsbCA0NHggdmFyaWFudHMgZGVhbCB3aXRoIGNhY2hlIG1hbmFnZW1lbnQgZGlmZmVyZW50bHkKKwkgKiBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBhbHdheXMgZW5hYmxlZC4KKwkgKiBUaGUgNDB4IHBwYydzIGRvbid0IHVzZSBhZGRyZXNzIHRyYW5zbGF0aW9uIGluIFUtQm9vdCBhdCBhbGwsCisJICogc28gd2UgaGF2ZSB0byBkaXN0aW5ndWlzaCBoZXJlIGJldHdlZW4gNDB4IGFuZCA0NHguCisJICovCisjaWZkZWYgQ09ORklHXzQ0MAorCWludCB3b3JkMCwgaTsKIAogCWlmICh0bGIgPCAwKSB7CiAJCS8qCkBAIC04Myw2ICs5NCw3IEBACiAJCQl9CiAJCX0KIAl9CisjZW5kaWYKIAlpbnRzID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOwogCiAJV0FUQ0hET0dfUkVTRVQgKCk7CmRpZmYgLS1naXQgYS9wb3N0L2NwdS9wcGM0eHgvY2FjaGVfNHh4LlMgYi9wb3N0L2NwdS9wcGM0eHgvY2FjaGVfNHh4LlMKaW5kZXggNzg1YjhkNi4uZDVjYjA3NSAxMDA2NDQKLS0tIGEvcG9zdC9jcHUvcHBjNHh4L2NhY2hlXzR4eC5TCisrKyBiL3Bvc3QvY3B1L3BwYzR4eC9jYWNoZV80eHguUwpAQCAtMzcsNiArMzcsMTMgQEAKIAogCS50ZXh0CiAKKwkvKgorCSAqIEFsbCA0NHggdmFyaWFudHMgZGVhbCB3aXRoIGNhY2hlIG1hbmFnZW1lbnQgZGlmZmVyZW50bHkKKwkgKiBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBhbHdheXMgZW5hYmxlZC4KKwkgKiBUaGUgNDB4IHBwYydzIGRvbid0IHVzZSBhZGRyZXNzIHRyYW5zbGF0aW9uIGluIFUtQm9vdCBhdCBhbGwsCisJICogc28gd2UgaGF2ZSB0byBkaXN0aW5ndWlzaCBoZXJlIGJldHdlZW4gNDB4IGFuZCA0NHguCisJICovCisjaWZkZWYgQ09ORklHXzQ0MAogLyogdm9pZCBjYWNoZV9wb3N0X2Rpc2FibGUgKGludCB0bGIpCiAgKi8KIGNhY2hlX3Bvc3RfZGlzYWJsZToKQEAgLTY4LDYgKzc1LDQzIEBACiAJc3luYwogCWlzeW5jCiAJYmxyCisjZWxzZQorLyogdm9pZCBjYWNoZV9wb3N0X2Rpc2FibGUgKGludCB0bGIpCisgKi8KK2NhY2hlX3Bvc3RfZGlzYWJsZToKKwlsaXMJcjAsIDB4MDAwMAorCW9yaQlyMCwgcjAsIDB4MDAwMAorCW10ZGNjcglyMAorCXN5bmMKKwlpc3luYworCWJscgorCisvKiB2b2lkIGNhY2hlX3Bvc3Rfd3QgKGludCB0bGIpCisgKi8KK2NhY2hlX3Bvc3Rfd3Q6CisJbGlzCXIwLCAweDgwMDAKKwlvcmkJcjAsIHIwLCAweDAwMDAKKwltdGRjY3IJcjAKKwlsaXMJcjAsIDB4ODAwMAorCW9yaQlyMCwgcjAsIDB4MDAwMAorCW10ZGN3cglyMAorCXN5bmMKKwlpc3luYworCWJscgorCisvKiB2b2lkIGNhY2hlX3Bvc3Rfd2IgKGludCB0bGIpCisgKi8KK2NhY2hlX3Bvc3Rfd2I6CisJbGlzCXIwLCAweDgwMDAKKwlvcmkJcjAsIHIwLCAweDAwMDAKKwltdGRjY3IJcjAKKwlsaXMJcjAsIDB4MDAwMAorCW9yaQlyMCwgcjAsIDB4MDAwMAorCW10ZGN3cglyMAorCXN5bmMKKwlpc3luYworCWJscgorI2VuZGlmCiAKIC8qIHZvaWQgY2FjaGVfcG9zdF9kaW52YWxpZGF0ZSAodm9pZCAqcCwgaW50IHNpemUpCiAgKi8KQEAgLTQzOCw3ICs0ODIsNyBAQAogCWJscgogCiAvKiBUZXN0IGluc3RydWN0aW9ucy4KLSAqLwkKKyAqLwogY2FjaGVfcG9zdF90ZXN0X2luc3Q6CiAJbGkJcjMsIDAKIAlsaQlyMywgLTEKZGlmZiAtLWdpdCBhL3Bvc3QvY3B1L3BwYzR4eC9ldGhlci5jIGIvcG9zdC9jcHUvcHBjNHh4L2V0aGVyLmMKaW5kZXggMzkxYzgxNS4uYWIyM2NhNSAxMDA2NDQKLS0tIGEvcG9zdC9jcHUvcHBjNHh4L2V0aGVyLmMKKysrIGIvcG9zdC9jcHUvcHBjNHh4L2V0aGVyLmMKQEAgLTY4LDEwICs2OCwxMCBAQAogc3RhdGljIHZvaWQgZXRoZXJfcG9zdF9pbml0IChpbnQgZGV2bnVtLCBpbnQgaHdfYWRkcikKIHsKIAlpbnQgaTsKLQl1bnNpZ25lZCBtb2RlX3JlZzsKICNpZiBkZWZpbmVkKENPTkZJR180NDBHWCkgfHwgXAogICAgIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfNDQwU1ApIHx8IGRlZmluZWQoQ09ORklHXzQ0MFNQRSkKKwl1bnNpZ25lZCBtb2RlX3JlZzsKIAlzeXNfaW5mb190IHN5c2luZm87CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKQpAQCAtMTg1LDEwICsxODUsMTcgQEAKIAltdGRjciAobWFscnhjYXNyLCAoTUFMX1RYUlhfQ0FTUiA+PiBkZXZudW0pKTsKIAogCS8qIHNldCBpbnRlcm5hbCBsb29wYmFjayBtb2RlICovCisjaWZkZWYgQ0ZHX1BPU1RfRVRIRVJfRVhUX0xPT1BCQUNLCisJb3V0MzIgKEVNQUNfTTEgKyBod19hZGRyLCBFTUFDX00xX0ZERSB8IDAgfAorCSAgICAgICBFTUFDX00xX1JGU180SyB8IEVNQUNfTTFfVFhfRklGT18ySyB8CisJICAgICAgIEVNQUNfTTFfTUZfMTAwTUJQUyB8IEVNQUNfTTFfSVNUIHwKKwkgICAgICAgaW4zMiAoRU1BQ19NMSkpOworI2Vsc2UKIAlvdXQzMiAoRU1BQ19NMSArIGh3X2FkZHIsIEVNQUNfTTFfRkRFIHwgRU1BQ19NMV9JTEUgfAogCSAgICAgICBFTUFDX00xX1JGU180SyB8IEVNQUNfTTFfVFhfRklGT18ySyB8CiAJICAgICAgIEVNQUNfTTFfTUZfMTAwTUJQUyB8IEVNQUNfTTFfSVNUIHwKIAkgICAgICAgaW4zMiAoRU1BQ19NMSkpOworI2VuZGlmCiAKIAkvKiBzZXQgdHJhbnNtaXQgZW5hYmxlICYgcmVjZWl2ZSBlbmFibGUgKi8KIAlvdXQzMiAoRU1BQ19NMCArIGh3X2FkZHIsIEVNQUNfTTBfVFhFIHwgRU1BQ19NMF9SWEUpOwpkaWZmIC0tZ2l0IGEvcG9zdC9jcHUvcHBjNHh4L2ZwdS5jIGIvcG9zdC9jcHUvcHBjNHh4L2ZwdS5jCmluZGV4IGMyZWI0YTkuLjBjMjZmZTAgMTAwNjQ0Ci0tLSBhL3Bvc3QvY3B1L3BwYzR4eC9mcHUuYworKysgYi9wb3N0L2NwdS9wcGM0eHgvZnB1LmMKQEAgLTI5LDE1ICsyOSwxNSBAQAogI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfNDQwRVBYKQogCi0jaW5jbHVkZSA8cHBjNHh4Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgogCiAKIGludCBmcHVfc3RhdHVzKHZvaWQpCiB7CiAJaWYgKG1mc3ByKGNjcjApICYgQ0NSMF9EQVBVSUIpCiAJCXJldHVybiAwOyAvKiBEaXNhYmxlZCAqLwotCWVsc2UgCisJZWxzZQogCQlyZXR1cm4gMTsgLyogRW5hYmxlZCAqLwogfQogCmRpZmYgLS1naXQgYS9wb3N0L2NwdS9wcGM0eHgvc3ByLmMgYi9wb3N0L2NwdS9wcGM0eHgvc3ByLmMKaW5kZXggYmU1YTcwMS4uM2U3NDYzNCAxMDA2NDQKLS0tIGEvcG9zdC9jcHUvcHBjNHh4L3Nwci5jCisrKyBiL3Bvc3QvY3B1L3BwYzR4eC9zcHIuYwpAQCAtNDMsMTIgKzQzLDExIEBACiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgICBpbnQgbnVtYmVyOwotICAgIGNoYXIgKiBuYW1lOwotICAgIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworc3RhdGljIHN0cnVjdCB7CisJaW50IG51bWJlcjsKKwljaGFyICogbmFtZTsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIH0gc3ByX3Rlc3RfbGlzdCBbXSA9IHsKIAkvKiBTdGFuZGFyZCBTcGVjaWFsLVB1cnBvc2UgUmVnaXN0ZXJzICovCiAKQEAgLTY1LDcgKzY0LDcgQEAKIAl7MHgxMWYsCSJQVlIiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCiAKIAkvKiBBZGRpdGlvbmFsIFNwZWNpYWwtUHVycG9zZSBSZWdpc3RlcnMuCi0JICogVGhlIHZhbHVlcyBtdXN0IG1hdGNoIHRoZSBpbml0aWFsaXphdGlvbiAKKwkgKiBUaGUgdmFsdWVzIG11c3QgbWF0Y2ggdGhlIGluaXRpYWxpemF0aW9uCiAJICogdmFsdWVzIGZyb20gY3B1L3BwYzR4eC9zdGFydC5TCiAJICovCiAJezB4MzAsCSJQSUQiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCmRpZmYgLS1naXQgYS9wb3N0L2NwdS9wcGM0eHgvdWFydC5jIGIvcG9zdC9jcHUvcHBjNHh4L3VhcnQuYwppbmRleCBiMDQ3ZDQyLi43YzNlZDQwIDEwMDY0NAotLS0gYS9wb3N0L2NwdS9wcGM0eHgvdWFydC5jCisrKyBiL3Bvc3QvY3B1L3BwYzR4eC91YXJ0LmMKQEAgLTM4LDI0ICszOCw3NyBAQAogCiAjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9VQVJUCiAKKy8qCisgKiBUaGlzIHRhYmxlIGRlZmluZXMgdGhlIFVBUlQncyB0aGF0IHNob3VsZCBiZSB0ZXN0ZWQgYW5kIGNhbgorICogYmUgb3ZlcnJpZGRlbiBpbiB0aGUgYm9hcmQgY29uZmlnIGZpbGUKKyAqLworI2lmbmRlZiBDRkdfUE9TVF9VQVJUX1RBQkxFCisjZGVmaW5lIENGR19QT1NUX1VBUlRfVEFCTEUJe1VBUlQwX0JBU0UsIFVBUlQxX0JBU0UsIFVBUlQyX0JBU0UsIFVBUlQzX0JBU0V9CisjZW5kaWYKKwogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxzZXJpYWwuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKyNpZiBkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1IpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSWCkKICNkZWZpbmUgVUFSVDBfQkFTRSAgQ0ZHX1BFUklQSEVSQUxfQkFTRSArIDB4MDAwMDAzMDAKICNkZWZpbmUgVUFSVDFfQkFTRSAgQ0ZHX1BFUklQSEVSQUxfQkFTRSArIDB4MDAwMDA0MDAKICNkZWZpbmUgVUFSVDJfQkFTRSAgQ0ZHX1BFUklQSEVSQUxfQkFTRSArIDB4MDAwMDA1MDAKICNkZWZpbmUgVUFSVDNfQkFTRSAgQ0ZHX1BFUklQSEVSQUxfQkFTRSArIDB4MDAwMDA2MDAKKyNlbHNlCisjZGVmaW5lIFVBUlQwX0JBU0UgIENGR19QRVJJUEhFUkFMX0JBU0UgKyAweDAwMDAwMjAwCisjZGVmaW5lIFVBUlQxX0JBU0UgIENGR19QRVJJUEhFUkFMX0JBU0UgKyAweDAwMDAwMzAwCisjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHXzQ0MFNQKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUEUpCisjZGVmaW5lIFVBUlQyX0JBU0UgIENGR19QRVJJUEhFUkFMX0JBU0UgKyAweDAwMDAwNjAwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdQKQorI2RlZmluZSBDUjBfTUFTSyAgICAgICAgMHgzZmZmMDAwMAorI2RlZmluZSBDUjBfRVhUQ0xLX0VOQSAgMHgwMDYwMDAwMAorI2RlZmluZSBDUjBfVURJVl9QT1MgICAgMTYKKyNkZWZpbmUgVURJVl9TVUJUUkFDVAkxCisjZGVmaW5lIFVBUlQwX1NEUgljbnRybDAKKyNkZWZpbmUgTUZSRUcoYSwgZCkJZCA9IG1mZGNyKGEpCisjZGVmaW5lIE1UUkVHKGEsIGQpCW10ZGNyKGEsIGQpCisjZWxzZSAvKiAjaWYgZGVmaW5lZChDT05GSUdfNDQwR1ApICovCisvKiBhbGwgb3RoZXIgNDQwIFBQQydzIGFjY2VzcyBjbG9jayBkaXZpZGVyIHZpYSBzZHIgcmVnaXN0ZXIgKi8KICNkZWZpbmUgQ1IwX01BU0sgICAgICAgIDB4ZGZmZmZmZmYKICNkZWZpbmUgQ1IwX0VYVENMS19FTkEgIDB4MDA4MDAwMDAKICNkZWZpbmUgQ1IwX1VESVZfUE9TICAgIDAKICNkZWZpbmUgVURJVl9TVUJUUkFDVAkwCiAjZGVmaW5lIFVBUlQwX1NEUglzZHJfdWFydDAKICNkZWZpbmUgVUFSVDFfU0RSCXNkcl91YXJ0MQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUHgpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgZGVmaW5lZChDT05GSUdfNDQwR1J4KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwU1ApIHx8IGRlZmluZWQoQ09ORklHXzQ0MFNQZSkKICNkZWZpbmUgVUFSVDJfU0RSCXNkcl91YXJ0MgorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQeCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEdSKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUngpCiAjZGVmaW5lIFVBUlQzX1NEUglzZHJfdWFydDMKKyNlbmRpZgogI2RlZmluZSBNRlJFRyhhLCBkKQltZnNkcihhLCBkKQogI2RlZmluZSBNVFJFRyhhLCBkKQltdHNkcihhLCBkKQorI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR180NDBHUCkgKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHXzQwNUVQKSB8fCBkZWZpbmVkKENPTkZJR180MDVFWikKKyNkZWZpbmUgVUFSVDBfQkFTRSAgICAgIDB4ZWY2MDAzMDAKKyNkZWZpbmUgVUFSVDFfQkFTRSAgICAgIDB4ZWY2MDA0MDAKKyNkZWZpbmUgVUNSMF9NQVNLICAgICAgIDB4MDAwMDAwN2YKKyNkZWZpbmUgVUNSMV9NQVNLICAgICAgIDB4MDAwMDdmMDAKKyNkZWZpbmUgVUNSMF9VRElWX1BPUyAgIDAKKyNkZWZpbmUgVUNSMV9VRElWX1BPUyAgIDgKKyNkZWZpbmUgVURJVl9NQVggICAgICAgIDEyNworI2Vsc2UgLyogQ09ORklHXzQwNUdQIHx8IENPTkZJR180MDVDUiAqLworI2RlZmluZSBVQVJUMF9CQVNFICAgICAgMHhlZjYwMDMwMAorI2RlZmluZSBVQVJUMV9CQVNFICAgICAgMHhlZjYwMDQwMAorI2RlZmluZSBDUjBfTUFTSyAgICAgICAgMHgwMDAwMWZmZgorI2RlZmluZSBDUjBfRVhUQ0xLX0VOQSAgMHgwMDAwMDBjMAorI2RlZmluZSBDUjBfVURJVl9QT1MgICAgMQorI2RlZmluZSBVRElWX01BWCAgICAgICAgMzIKKyNlbmRpZgogCiAjZGVmaW5lIFVBUlRfUkJSICAgIDB4MDAKICNkZWZpbmUgVUFSVF9USFIgICAgMHgwMApAQCAtNzEsOCArMTI0LDggQEAKICNkZWZpbmUgVUFSVF9ETE0gICAgMHgwMQogCiAvKgotICBMaW5lIFN0YXR1cyBSZWdpc3Rlci4KLSovCisgKiBMaW5lIFN0YXR1cyBSZWdpc3Rlci4KKyAqLwogI2RlZmluZSBhc3luY0xTUkRhdGFSZWFkeTEgICAgICAgICAgICAweDAxCiAjZGVmaW5lIGFzeW5jTFNST3ZlcnJ1bkVycm9yMSAgICAgICAgIDB4MDIKICNkZWZpbmUgYXN5bmNMU1JQYXJpdHlFcnJvcjEgICAgICAgICAgMHgwNApAQCAtODQsNiArMTM3LDUwIEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCisjaWYgZGVmaW5lZChDT05GSUdfNDQwKQorI2lmICFkZWZpbmVkKENGR19FWFRfU0VSSUFMX0NMT0NLKQorc3RhdGljIHZvaWQgc2VyaWFsX2RpdnMgKGludCBiYXVkcmF0ZSwgdW5zaWduZWQgbG9uZyAqcHVkaXYsCisJCQkgdW5zaWduZWQgc2hvcnQgKnBiZGl2KQoreworCXN5c19pbmZvX3Qgc3lzaW5mbzsKKwl1bnNpZ25lZCBsb25nIGRpdjsJCS8qIHRvdGFsIGRpdmlzb3IgdWRpdiAqIGJkaXYgKi8KKwl1bnNpZ25lZCBsb25nIHVtaW47CQkvKiBtaW5pbXVtIHVkaXYgKi8KKwl1bnNpZ25lZCBzaG9ydCBkaWZmOwkJLyogc21hbGxlc3QgZGlmZiAqLworCXVuc2lnbmVkIGxvbmcgdWRpdjsJCS8qIGJlc3QgdWRpdiAqLworCXVuc2lnbmVkIHNob3J0IGlkaWZmOwkJLyogY3VycmVudCBkaWZmICovCisJdW5zaWduZWQgc2hvcnQgaWJkaXY7CQkvKiBjdXJyZW50IGJkaXYgKi8KKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBlc3Q7CQkvKiBjdXJyZW50IGVzdGltYXRlICovCisKKwlnZXRfc3lzX2luZm8oJnN5c2luZm8pOworCisJdWRpdiA9IDMyOwkJCS8qIEFzc3VtZSBsb3dlc3QgcG9zc2libGUgc2VyaWFsIGNsayAqLworCWRpdiA9IHN5c2luZm8uZnJlcVBMQiAvICgxNiAqIGJhdWRyYXRlKTsgLyogdG90YWwgZGl2aXNvciAqLworCXVtaW4gPSBzeXNpbmZvLnBsbE9wYkRpdiA8PCAxOwkvKiAyIHggT1BCIGRpdmlzb3IgKi8KKwlkaWZmID0gMzI7CQkJLyogaGlnaGVzdCBwb3NzaWJsZSAqLworCisJLyogaSBpcyB0aGUgdGVzdCB1ZGl2IHZhbHVlIC0tIHN0YXJ0IHdpdGggdGhlIGxhcmdlc3QKKwkgKiBwb3NzaWJsZSAoMzIpIHRvIG1pbmltaXplIHNlcmlhbCBjbG9jayBhbmQgY29uc3RyYWluCisJICogc2VhcmNoIHRvIHVtaW4uCisJICovCisJZm9yIChpID0gMzI7IGkgPiB1bWluOyBpLS0pIHsKKwkJaWJkaXYgPSBkaXYgLyBpOworCQllc3QgPSBpICogaWJkaXY7CisJCWlkaWZmID0gKGVzdCA+IGRpdikgPyAoZXN0LWRpdikgOiAoZGl2LWVzdCk7CisJCWlmIChpZGlmZiA9PSAwKSB7CisJCQl1ZGl2ID0gaTsKKwkJCWJyZWFrOwkvKiBjYW4ndCBkbyBiZXR0ZXIgKi8KKwkJfSBlbHNlIGlmIChpZGlmZiA8IGRpZmYpIHsKKwkJCXVkaXYgPSBpOwkvKiBiZXN0IHNvIGZhciAqLworCQkJZGlmZiA9IGlkaWZmOwkvKiB1cGRhdGUgbG93ZXN0IGRpZmYqLworCQl9CisJfQorCisJKnB1ZGl2ID0gdWRpdjsKKwkqcGJkaXYgPSBkaXYgLyB1ZGl2OworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgdWFydF9wb3N0X2luaXQgKHVuc2lnbmVkIGxvbmcgZGV2X2Jhc2UpCiB7CiAJdW5zaWduZWQgbG9uZyByZWc7CkBAIC0xNDcsNiArMjQ0LDc3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNlbHNlIC8qIENPTkZJR180NDAgKi8KKworc3RhdGljIGludCB1YXJ0X3Bvc3RfaW5pdCAodW5zaWduZWQgbG9uZyBkZXZfYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZzsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIGNsazsKKwl1bnNpZ25lZCBsb25nIHVkaXY7CisJdW5zaWduZWQgc2hvcnQgYmRpdjsKKwl2b2xhdGlsZSBjaGFyIHZhbDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzNTAwOyBpKyspIHsKKwkJaWYgKGluOCAoZGV2X2Jhc2UgKyBVQVJUX0xTUikgJiBhc3luY0xTUlR4SG9sZEVtcHR5MSkKKwkJCWJyZWFrOworCQl1ZGVsYXkgKDEwMCk7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVopCisJc2VyaWFsX2RpdnMoZ2QtPmJhdWRyYXRlLCAmdWRpdiwgJmJkaXYpOworCWNsayA9IHRtcCA9IHJlZyA9IDA7CisjZWxzZQorI2lmZGVmIENPTkZJR180MDVFUAorCXJlZyA9IG1mZGNyKGNwYzBfdWNyKSAmIH4oVUNSMF9NQVNLIHwgVUNSMV9NQVNLKTsKKwljbGsgPSBnZC0+Y3B1X2NsazsKKwl0bXAgPSBDRkdfQkFTRV9CQVVEICogMTY7CisJdWRpdiA9IChjbGsgKyB0bXAgLyAyKSAvIHRtcDsKKwlpZiAodWRpdiA+IFVESVZfTUFYKSAgICAgICAgICAgICAgICAgICAgLyogbWF4LiBuIGJpdHMgZm9yIHVkaXYgKi8KKwkJdWRpdiA9IFVESVZfTUFYOworCXJlZyB8PSAodWRpdikgPDwgVUNSMF9VRElWX1BPUzsJICAgICAgICAvKiBzZXQgdGhlIFVBUlQgZGl2aXNvciAqLworCXJlZyB8PSAodWRpdikgPDwgVUNSMV9VRElWX1BPUzsJICAgICAgICAvKiBzZXQgdGhlIFVBUlQgZGl2aXNvciAqLworCW10ZGNyIChjcGMwX3VjciwgcmVnKTsKKyNlbHNlIC8qIENPTkZJR180MDVFUCAqLworCXJlZyA9IG1mZGNyKGNudHJsMCkgJiB+Q1IwX01BU0s7CisjaWZkZWYgQ0ZHX0VYVF9TRVJJQUxfQ0xPQ0sKKwljbGsgPSBDRkdfRVhUX1NFUklBTF9DTE9DSzsKKwl1ZGl2ID0gMTsKKwlyZWcgfD0gQ1IwX0VYVENMS19FTkE7CisjZWxzZQorCWNsayA9IGdkLT5jcHVfY2xrOworI2lmZGVmIENGR180MDVfVUFSVF9FUlJBVEFfNTkKKwl1ZGl2ID0gMzE7CQkJLyogRXJyYXRhIDU5OiBzdHVjayBhdCAzMSAqLworI2Vsc2UKKwl0bXAgPSBDRkdfQkFTRV9CQVVEICogMTY7CisJdWRpdiA9IChjbGsgKyB0bXAgLyAyKSAvIHRtcDsKKwlpZiAodWRpdiA+IFVESVZfTUFYKSAgICAgICAgICAgICAgICAgICAgLyogbWF4LiBuIGJpdHMgZm9yIHVkaXYgKi8KKwkJdWRpdiA9IFVESVZfTUFYOworI2VuZGlmCisjZW5kaWYKKwlyZWcgfD0gKHVkaXYgLSAxKSA8PCBDUjBfVURJVl9QT1M7CS8qIHNldCB0aGUgVUFSVCBkaXZpc29yICovCisJbXRkY3IgKGNudHJsMCwgcmVnKTsKKyNlbmRpZiAvKiBDT05GSUdfNDA1RVAgKi8KKwl0bXAgPSBnZC0+YmF1ZHJhdGUgKiB1ZGl2ICogMTY7CisJYmRpdiA9IChjbGsgKyB0bXAgLyAyKSAvIHRtcDsKKyNlbmRpZiAvKiBDT05GSUdfNDA1RVogKi8KKworCW91dDgoZGV2X2Jhc2UgKyBVQVJUX0xDUiwgMHg4MCk7CS8qIHNldCBETEFCIGJpdCAqLworCW91dDgoZGV2X2Jhc2UgKyBVQVJUX0RMTCwgYmRpdik7CS8qIHNldCBiYXVkcmF0ZSBkaXZpc29yICovCisJb3V0OChkZXZfYmFzZSArIFVBUlRfRExNLCBiZGl2ID4+IDgpOwkvKiBzZXQgYmF1ZHJhdGUgZGl2aXNvciAqLworCW91dDgoZGV2X2Jhc2UgKyBVQVJUX0xDUiwgMHgwMyk7CS8qIGNsZWFyIERMQUI7IHNldCA4IGJpdHMsIG5vIHBhcml0eSAqLworCW91dDgoZGV2X2Jhc2UgKyBVQVJUX0ZDUiwgMHgwMCk7CS8qIGRpc2FibGUgRklGTyAqLworCW91dDgoZGV2X2Jhc2UgKyBVQVJUX01DUiwgMHgxMCk7CS8qIGVuYWJsZSBsb29wYmFjayBtb2RlICovCisJdmFsID0gaW44KGRldl9iYXNlICsgVUFSVF9MU1IpOwkvKiBjbGVhciBsaW5lIHN0YXR1cyAqLworCXZhbCA9IGluOChkZXZfYmFzZSArIFVBUlRfUkJSKTsJLyogcmVhZCByZWNlaXZlIGJ1ZmZlciAqLworCW91dDgoZGV2X2Jhc2UgKyBVQVJUX1NDUiwgMHgwMCk7CS8qIHNldCBzY3JhdGNocGFkICovCisJb3V0OChkZXZfYmFzZSArIFVBUlRfSUVSLCAweDAwKTsJLyogc2V0IGludGVycnVwdCBlbmFibGUgcmVnICovCisKKwlyZXR1cm4gKDApOworfQorI2VuZGlmIC8qIENPTkZJR180NDAgKi8KKwogc3RhdGljIHZvaWQgdWFydF9wb3N0X3B1dGMgKHVuc2lnbmVkIGxvbmcgZGV2X2Jhc2UsIGNoYXIgYykKIHsKIAlpbnQgaTsKQEAgLTE5OCw5ICszNjYsNyBAQAogaW50IHVhcnRfcG9zdF90ZXN0IChpbnQgZmxhZ3MpCiB7CiAJaW50IGksIHJlcyA9IDA7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFzZVtdID0gewotCQlVQVJUMF9CQVNFLCBVQVJUMV9CQVNFLCBVQVJUMl9CQVNFLCBVQVJUM19CQVNFCi0JfTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBiYXNlW10gPSBDRkdfUE9TVF9VQVJUX1RBQkxFOwogCiAJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoYmFzZSkgLyBzaXplb2YgKGJhc2VbMF0pOyBpKyspIHsKIAkJaWYgKHRlc3RfY3RsciAoYmFzZVtpXSwgaSkpCmRpZmYgLS1naXQgYS9wb3N0L3Bvc3QuYyBiL3Bvc3QvcG9zdC5jCmluZGV4IDI4NDM1Y2MuLjRmZjc1ZWUgMTAwNjQ0Ci0tLSBhL3Bvc3QvcG9zdC5jCisrKyBiL3Bvc3QvcG9zdC5jCkBAIC0xMjksOSArMTI5LDcgQEAKIAkJCQlwb3N0X2xvZyAoIlBBU1NFRFxuIik7CiAJCQllbHNlIHsKIAkJCQlwb3N0X2xvZyAoIkZBSUxFRFxuIik7Ci0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotCQkJCXNob3dfYm9vdF9wcm9ncmVzcygtMzEpOwotI2VuZGlmCisJCQkJc2hvd19ib290X3Byb2dyZXNzICgtMzEpOwogCQkJfQogCQl9CiAJfQpAQCAtMjQxLDkgKzIzOSw3IEBACiAJCX0gZWxzZSB7CiAJCWlmICgoKnRlc3QtPnRlc3QpIChmbGFncykgIT0gMCkgewogCQkJcG9zdF9sb2cgKCJGQUlMRURcbiIpOwotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLQkJCXNob3dfYm9vdF9wcm9ncmVzcygtMzIpOwotI2VuZGlmCisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0zMik7CiAJCX0KIAkJZWxzZQogCQkJcG9zdF9sb2cgKCJQQVNTRURcbiIpOwpkaWZmIC0tZ2l0IGEvcG9zdC90ZXN0cy5jIGIvcG9zdC90ZXN0cy5jCmluZGV4IGYzNjA0YjIuLmUxYzNkMjggMTAwNjQ0Ci0tLSBhL3Bvc3QvdGVzdHMuYworKysgYi9wb3N0L3Rlc3RzLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIGV4dGVybiBpbnQgc3lzbW9uX3Bvc3RfdGVzdCAoaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgZHNwX3Bvc3RfdGVzdCAoaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgY29kZWNfcG9zdF90ZXN0IChpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBlY2NfcG9zdF90ZXN0IChpbnQgZmxhZ3MpOwogCiBleHRlcm4gaW50IHN5c21vbl9pbml0X2YgKHZvaWQpOwogCkBAIC0yMzYsNiArMjM3LDE4IEBACiAJQ0ZHX1BPU1RfQ09ERUMKICAgICB9LAogI2VuZGlmCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9FQ0MKKyAgICB7CisJIkVDQyB0ZXN0IiwKKwkiZWNjIiwKKwkiVGhpcyB0ZXN0IGNoZWNrcyBFQ0MgZmFjaWxpdHkgb2YgbWVtb3J5LiIsCisJUE9TVF9ST00gfCBQT1NUX0FMV0FZUywKKwkmZWNjX3Bvc3RfdGVzdCwKKwlOVUxMLAorCU5VTEwsCisJQ0ZHX1BPU1RfRUNDCisgICAgfSwKKyNlbmRpZgogfTsKIAogdW5zaWduZWQgaW50IHBvc3RfbGlzdF9zaXplID0gc2l6ZW9mIChwb3N0X2xpc3QpIC8gc2l6ZW9mIChzdHJ1Y3QgcG9zdF90ZXN0KTsKZGlmZiAtLWdpdCBhL3J0Yy9iZjV4eF9ydGMuYyBiL3J0Yy9iZjV4eF9ydGMuYwppbmRleCA4NWJiYjU2Li44ODU2YmI5IDEwMDY0NAotLS0gYS9ydGMvYmY1eHhfcnRjLmMKKysrIGIvcnRjL2JmNXh4X3J0Yy5jCkBAIC00OSw3ICs0OSw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHJ0Yy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0JGSU4pICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0JGSU4pICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYmY1eHhfcnRjLmg+CkBAIC0xNDAsNCArMTQwLDQgQEAKIAkgICAgTUlOX1RPX1NFQ1ModG1fbWluKSArIEhSU19UT19TRUNTKHRtX2hvdXIpICsgREFZU19UT19TRUNTKHRtX2RheSk7CiAJdG9fdG0odGltZV9pbl9zZWMsIHRtcCk7CiB9Ci0jZW5kaWYJCQkJLyogQ09ORklHX1JUQ19CRklOICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZGF0ZS5jIGIvcnRjL2RhdGUuYwppbmRleCBiNWY4YzQ4Li5hODNhNzIzIDEwMDY0NAotLS0gYS9ydGMvZGF0ZS5jCisrKyBiL3J0Yy9kYXRlLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkKIAogI2RlZmluZSBGRUJSVUFSWQkJMgogI2RlZmluZQlTVEFSVE9GVElNRQkJMTk3MApAQCAtMTUzLDQgKzE1Myw0IEBACiAJKSo2MCArIHNlYzsgLyogZmluYWxseSBzZWNvbmRzICovCiB9CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMTI4ODcuYyBiL3J0Yy9kczEyODg3LmMKaW5kZXggOGIxMjg5My4uODRmZWNmMCAxMDA2NDQKLS0tIGEvcnRjL2RzMTI4ODcuYworKysgYi9ydGMvZHMxMjg4Ny5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMjg4NykgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMjg4NykgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKICNkZWZpbmUgUlRDX1NFQ09ORFMJCQkweDAwCiAjZGVmaW5lIFJUQ19TRUNPTkRTX0FMQVJNCQkweDAxCkBAIC0yMzUsNCArMjM1LDQgQEAKIAlydGNfd3JpdGUoUlRDX0NPTlRST0xfQixjdHJsX3JnKTsKIH0KIAotI2VuZGlmICAvKiAoQ09ORklHX1JUQ19EUzEyODg3KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZHMxMzAyLmMgYi9ydGMvZHMxMzAyLmMKaW5kZXggOThkY2U4OS4uNTVhZjEzMCAxMDA2NDQKLS0tIGEvcnRjL2RzMTMwMi5jCisrKyBiL3J0Yy9kczEzMDIuYwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMzAyKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMDIpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKiBHUFAgUGlucyAqLwogI2RlZmluZSBEQVRBCQkweDIwMApkaWZmIC0tZ2l0IGEvcnRjL2RzMTMwNi5jIGIvcnRjL2RzMTMwNi5jCmluZGV4IGUwMWUxY2UuLjg5ZTQzM2QgMTAwNjQ0Ci0tLSBhL3J0Yy9kczEzMDYuYworKysgYi9ydGMvZHMxMzA2LmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNpbmNsdWRlIDxzcGkuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMDYpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTMwNikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKICNkZWZpbmUJUlRDX1NFQ09ORFMJCTB4MDAKICNkZWZpbmUJUlRDX01JTlVURVMJCTB4MDEKZGlmZiAtLWdpdCBhL3J0Yy9kczEzMDcuYyBiL3J0Yy9kczEzMDcuYwppbmRleCAzYjI2YTBhLi5jODgyZDc5IDEwMDY0NAotLS0gYS9ydGMvZHMxMzA3LmMKKysrIGIvcnRjL2RzMTMwNy5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8aTJjLmg+CiAKICNpZiAoZGVmaW5lZChDT05GSUdfUlRDX0RTMTMwNykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RTMTMzOCkgKSAmJiBcCi0gICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyAgICBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI3VuZGVmIERFQlVHX1JUQwpAQCAtMjAxLDQgKzIwMSw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX1JUQ19EUzEzMDcgfHwgQ09ORklHX1JUQ19EUzEzMzgpICYmIChDRkdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9kczEzMzcuYyBiL3J0Yy9kczEzMzcuYwppbmRleCA5ZjBjOGMwLi5jNjM2YWM1IDEwMDY0NAotLS0gYS9ydGMvZHMxMzM3LmMKKysrIGIvcnRjL2RzMTMzNy5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAjaW5jbHVkZSA8aTJjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMzM3KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMzcpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjdW5kZWYgREVCVUdfUlRDCkBAIC0xODgsNCArMTg4LDQgQEAKIAlyZXR1cm4gKCgobiAvIDEwKSA8PCA0KSB8IChuICUgMTApKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19SVENfRFMxMzM3ICYmIChDRkdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9kczEzNzQuYyBiL3J0Yy9kczEzNzQuYwppbmRleCA1MGE5OTZjLi5lNzczZGQ5IDEwMDY0NAotLS0gYS9ydGMvZHMxMzc0LmMKKysrIGIvcnRjL2RzMTM3NC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAjaW5jbHVkZSA8aTJjLmg+CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfUlRDX0RTMTM3NCkpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgKGRlZmluZWQoQ09ORklHX1JUQ19EUzEzNzQpKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI3VuZGVmIERFQlVHX1JUQwpAQCAtMjUwLDQgKzI1MCw0IEBACiB7CiAJCWkyY19yZWdfd3JpdGUgKENGR19JMkNfUlRDX0FERFIsIHJlZywgdmFsKTsKIH0KLSNlbmRpZiAvKiAoQ09ORklHX1JUQ19EUzEzNzQpICYmIChDRkdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9kczE1NTYuYyBiL3J0Yy9kczE1NTYuYwppbmRleCBkZDllYTVlLi40MzY1Y2ZiIDEwMDY0NAotLS0gYS9ydGMvZHMxNTU2LmMKKysrIGIvcnRjL2RzMTU1Ni5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAKIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzE1NTYpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTU1NikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIHN0YXRpYyB1Y2hhciBydGNfcmVhZCggdW5zaWduZWQgaW50IGFkZHIgKTsKIHN0YXRpYyB2b2lkICBydGNfd3JpdGUoIHVuc2lnbmVkIGludCBhZGRyLCB1Y2hhciB2YWwpOwpAQCAtMjAzLDQgKzIwMyw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX0RTMTU1NiAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMTY0eC5jIGIvcnRjL2RzMTY0eC5jCmluZGV4IDNjYzc2YWIuLmJmZjIyYjkgMTAwNjQ0Ci0tLSBhL3J0Yy9kczE2NHguYworKysgYi9ydGMvZHMxNjR4LmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxydGMuaD4KIAogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTY0eCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxNjR4KSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogc3RhdGljIHVjaGFyICAgIHJ0Y19yZWFkKHVuc2lnbmVkIGludCBhZGRyICk7CiBzdGF0aWMgdm9pZCAgICAgcnRjX3dyaXRlKHVuc2lnbmVkIGludCBhZGRyLCB1Y2hhciB2YWwpOwpAQCAtMTk3LDQgKzE5Nyw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX0RTMTY0eCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMTc0eC5jIGIvcnRjL2RzMTc0eC5jCmluZGV4IDU4YjEzZTkuLjVmODVhNjggMTAwNjQ0Ci0tLSBhL3J0Yy9kczE3NHguYworKysgYi9ydGMvZHMxNzR4LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxNzR4KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzE3NHgpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBzdGF0aWMgdWNoYXIgcnRjX3JlYWQoIHVuc2lnbmVkIGludCBhZGRyICk7CiBzdGF0aWMgdm9pZCAgcnRjX3dyaXRlKCB1bnNpZ25lZCBpbnQgYWRkciwgdWNoYXIgdmFsKTsKQEAgLTE5OSw0ICsxOTksNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NQzE0NjgxOCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMzIzMS5jIGIvcnRjL2RzMzIzMS5jCmluZGV4IDUwYWVlYjUuLmZlMTFiODYgMTAwNjQ0Ci0tLSBhL3J0Yy9kczMyMzEuYworKysgYi9ydGMvZHMzMjMxLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNpbmNsdWRlIDxpMmMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzMyMzEpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMzIzMSkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICN1bmRlZiBERUJVR19SVEMKQEAgLTE5MCw0ICsxOTAsNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYgLyogKENPTkZJR19SVENfRFMzMjMxKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvbTQxdDExLmMgYi9ydGMvbTQxdDExLmMKaW5kZXggYzcyNWNjOS4uODFkYTMzYSAxMDA2NDQKLS0tIGEvcnRjL200MXQxMS5jCisrKyBiL3J0Yy9tNDF0MTEuYwpAQCAtNDMsNyArNDMsNyBAQAogI2VuZGlmCiAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX000MVQxMSkgJiYgZGVmaW5lZChDRkdfSTJDX1JUQ19BRERSKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NNDFUMTEpICYmIGRlZmluZWQoQ0ZHX0kyQ19SVENfQUREUikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIHN0YXRpYyB1bnNpZ25lZCBiY2QyYmluICh1Y2hhciBuKQogewpAQCAtMTk5LDQgKzE5OSw0IEBACiAJcmV0dXJuIGkyY19yZWFkKCBDRkdfSTJDX1JUQ19BRERSLCBSRUdfQ05UK2FkZHIsIDEsIGRhdGEsIHNpemUgKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19SVENfTTQxVDExICYmIENGR19JMkNfUlRDX0FERFIgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9tNDh0MzVheC5jIGIvcnRjL200OHQzNWF4LmMKaW5kZXggNmMzOGE1My4uMGEwZmZhOCAxMDA2NDQKLS0tIGEvcnRjL200OHQzNWF4LmMKKysrIGIvcnRjL200OHQzNWF4LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NNDhUMzVBKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NNDhUMzVBKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogc3RhdGljIHVjaGFyIHJ0Y19yZWFkICAodWNoYXIgcmVnKTsKIHN0YXRpYyB2b2lkICBydGNfd3JpdGUgKHVjaGFyIHJlZywgdWNoYXIgdmFsKTsKQEAgLTE2Myw0ICsxNjMsNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NNDhUMzVBICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvbWF4NjkwMC5jIGIvcnRjL21heDY5MDAuYwppbmRleCA3MzkxOWNkLi5jNzVhOGUwIDEwMDY0NAotLS0gYS9ydGMvbWF4NjkwMC5jCisrKyBiL3J0Yy9tYXg2OTAwLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNpbmNsdWRlIDxpMmMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NQVg2OTAwKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NQVg2OTAwKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogI2lmbmRlZglDRkdfSTJDX1JUQ19BRERSCiAjZGVmaW5lCUNGR19JMkNfUlRDX0FERFIJMHg1MApAQCAtMTI4LDQgKzEyOCw0IEBACiB7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX01BWDY5MDAgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9tYzE0NjgxOC5jIGIvcnRjL21jMTQ2ODE4LmMKaW5kZXggMjBiMWIzZS4uYWIzNzdlZCAxMDA2NDQKLS0tIGEvcnRjL21jMTQ2ODE4LmMKKysrIGIvcnRjL21jMTQ2ODE4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfTUMxNDY4MTgpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX01DMTQ2ODE4KSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogc3RhdGljIHVjaGFyIHJ0Y19yZWFkICAodWNoYXIgcmVnKTsKIHN0YXRpYyB2b2lkICBydGNfd3JpdGUgKHVjaGFyIHJlZywgdWNoYXIgdmFsKTsKQEAgLTE3NSw0ICsxNzUsNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NQzE0NjgxOCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL21rNDh0NTkuYyBiL3J0Yy9tazQ4dDU5LmMKaW5kZXggNjRmNzUxZi4uYmFjZGI1YiAxMDA2NDQKLS0tIGEvcnRjL21rNDh0NTkuYworKysgYi9ydGMvbWs0OHQ1OS5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJcnRjX3dyaXRlKGQrKywgKnMrKyk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTIzMyw1ICsyMzMsNSBAQAogCXJ0Y193cml0ZShSVENfV0FUQ0hET0csIHdkX3ZhbHVlKTsKIH0KIAotI2VuZGlmCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKICNlbmRpZgkvKiBDT05GSUdfUlRDX01LNDhUNTkgKi8KZGlmZiAtLWdpdCBhL3J0Yy9tcGM1eHh4LmMgYi9ydGMvbXBjNXh4eC5jCmluZGV4IDIwNTNkZjEuLjIxNjM4NmEgMTAwNjQ0Ci0tLSBhL3J0Yy9tcGM1eHh4LmMKKysrIGIvcnRjL21wYzV4eHguYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxydGMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NUEM1MjAwKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NUEM1MjAwKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiB0aGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgZGVmaW5lZCBpbiBtcGM1MjAwLmggLi4uCkBAIC0xMzcsNCArMTM3LDQgQEAKIAlyZXR1cm47CS8qIG5vdGhpbmcgdG8gZG8gKi8KIH0KIAotI2VuZGlmCS8qIENPTkZJR19SVENfTVBDNTIwMCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL21wYzh4eC5jIGIvcnRjL21wYzh4eC5jCmluZGV4IDgzMGU1NmUuLjhkMTBjMGUgMTAwNjQ0Ci0tLSBhL3J0Yy9tcGM4eHguYworKysgYi9ydGMvbXBjOHh4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfTVBDOHh4KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NUEM4eHgpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTcwLDYgKzcwLDQgQEAKIAlyZXR1cm47CS8qIG5vdGhpbmcgdG8gZG8gKi8KIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NUEM4eHggJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9wY2Y4NTYzLmMgYi9ydGMvcGNmODU2My5jCmluZGV4IDA1YWU5N2UuLjJkNzNkNWQgMTAwNjQ0Ci0tLSBhL3J0Yy9wY2Y4NTYzLmMKKysrIGIvcnRjL3BjZjg1NjMuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX1BDRjg1NjMpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX1BDRjg1NjMpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBzdGF0aWMgdWNoYXIgcnRjX3JlYWQgICh1Y2hhciByZWcpOwogc3RhdGljIHZvaWQgIHJ0Y193cml0ZSAodWNoYXIgcmVnLCB1Y2hhciB2YWwpOwpAQCAtMTQxLDQgKzE0MSw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX1BDRjg1NjMgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9yczVjMzcyLmMgYi9ydGMvcnM1YzM3Mi5jCmluZGV4IGI1NjgwOGIuLjNkMTM0NmUgMTAwNjQ0Ci0tLSBhL3J0Yy9yczVjMzcyLmMKKysrIGIvcnRjL3JzNWMzNzIuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX1JTNUMzNzJBKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19SUzVDMzcyQSkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAvKgogICogUmVhZHMgYXJlIGFsd2F5cyBkb25lIHN0YXJ0aW5nIHdpdGggcmVnaXN0ZXIgMTUsIHdoaWNoIHJlcXVpcmVzIHNvbWUKICAqIGp1bXBpbmctdGhyb3VnaC1ob29wcyB0byBhY2Nlc3MgdGhlIGRhdGEgY29ycmVjdGx5LgpAQCAtMjk5LDQgKzI5OSw0IEBACiB7CiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUlRDX1JTNUMzNzJBKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvczNjMjR4MF9ydGMuYyBiL3J0Yy9zM2MyNHgwX3J0Yy5jCmluZGV4IDllMjE5MWUuLjdmOGI0ZmEgMTAwNjQ0Ci0tLSBhL3J0Yy9zM2MyNHgwX3J0Yy5jCisrKyBiL3J0Yy9zM2MyNHgwX3J0Yy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX1MzQzI0WDApICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX1MzQzI0WDApICYmIChkZWZpbmVkKENPTkZJR19DTURfREFURSkpCiAKICNpZiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKQogI2luY2x1ZGUgPHMzYzI0MDAuaD4KQEAgLTE3NSw2ICsxNzUsNCBAQAogCXJ0Yy0+UlRDQ09OICY9IH4oMHgwOHwweDAxKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZW5kaWYJLyogQ09ORklHX1JUQ19TM0MyNFgwICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZSBiL3Rvb2xzL01ha2VmaWxlCmluZGV4IDVlMjZiZDcuLmU4ZTAyODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlCisrKyBiL3Rvb2xzL01ha2VmaWxlCkBAIC0yMSwxMCArMjEsMTAgQEAKICMgTUEgMDIxMTEtMTMwNyBVU0EKICMKIAotQklOX0ZJTEVTCT0gaW1nMnNyZWMkKFNGWCkgbWtpbWFnZSQoU0ZYKSBlbnZjcmMkKFNGWCkgZ2VuX2V0aF9hZGRyJChTRlgpIGJtcF9sb2dvJChTRlgpCitCSU5fRklMRVMJPSBpbWcyc3JlYyQoU0ZYKSBta2ltYWdlJChTRlgpIGVudmNyYyQoU0ZYKSB1YnNoYTEkKFNGWCkgZ2VuX2V0aF9hZGRyJChTRlgpIGJtcF9sb2dvJChTRlgpCiAKLU9CSl9MSU5LUwk9IGVudmlyb25tZW50Lm8gY3JjMzIubwotT0JKX0ZJTEVTCT0gaW1nMnNyZWMubyBta2ltYWdlLm8gZW52Y3JjLm8gZ2VuX2V0aF9hZGRyLm8gYm1wX2xvZ28ubworT0JKX0xJTktTCT0gZW52aXJvbm1lbnQubyBjcmMzMi5vIHNoYTEubworT0JKX0ZJTEVTCT0gaW1nMnNyZWMubyBta2ltYWdlLm8gZW52Y3JjLm8gdWJzaGExLm8gZ2VuX2V0aF9hZGRyLm8gYm1wX2xvZ28ubwogCiBpZmVxICgkKEFSQ0gpLG1pcHMpCiBCSU5fRklMRVMJKz0gaW5jYS1zd2FwLWJ5dGVzJChTRlgpCkBAIC0xMjYsMTQgKzEyNiwxNyBAQAogCiBhbGw6CSQob2JqKS5kZXBlbmQgJChCSU5TKSAkKExPR09fSCkgc3ViZGlycwogCi0kKG9iaillbnZjcmMkKFNGWCk6CSQob2JqKWVudmNyYy5vICQob2JqKWNyYzMyLm8gJChvYmopZW52aXJvbm1lbnQubworJChvYmopZW52Y3JjJChTRlgpOgkkKG9iaillbnZjcmMubyAkKG9iailjcmMzMi5vICQob2JqKWVudmlyb25tZW50Lm8gJChvYmopc2hhMS5vCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAkXgorCiskKG9iail1YnNoYTEkKFNGWCk6CSQob2JqKXVic2hhMS5vICQob2JqKXNoYTEubwogCQkkKENDKSAkKENGTEFHUykgLW8gJEAgJF4KIAogJChvYmopaW1nMnNyZWMkKFNGWCk6CSQob2JqKWltZzJzcmVjLm8KIAkJJChDQykgJChDRkxBR1MpICQoSE9TVF9MREZMQUdTKSAtbyAkQCAkXgogCQkkKFNUUklQKSAkQAogCi0kKG9iailta2ltYWdlJChTRlgpOgkkKG9iailta2ltYWdlLm8gJChvYmopY3JjMzIubworJChvYmopbWtpbWFnZSQoU0ZYKToJJChvYmopbWtpbWFnZS5vICQob2JqKWNyYzMyLm8gJChvYmopc2hhMS5vCiAJCSQoQ0MpICQoQ0ZMQUdTKSAkKEhPU1RfTERGTEFHUykgLW8gJEAgJF4KIAkJJChTVFJJUCkgJEAKIApAQCAtMTYwLDkgKzE2MywxNSBAQAogJChvYmopZW52Y3JjLm86CSQoc3JjKWVudmNyYy5jCiAJCSQoQ0MpIC1nICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAogCiskKG9iail1YnNoYTEubzoJJChzcmMpdWJzaGExLmMKKwkJJChDQykgLWcgJChDRkxBR1MpIC1jIC1vICRAICQ8CisKICQob2JqKWNyYzMyLm86CSQob2JqKWNyYzMyLmMKIAkJJChDQykgLWcgJChDRkxBR1MpIC1jIC1vICRAICQ8CiAKKyQob2JqKXNoYTEubzoJJChvYmopc2hhMS5jCisJCSQoQ0MpIC1nICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAorCiAkKG9iailta2ltYWdlLm86CSQoc3JjKW1raW1hZ2UuYwogCQkkKENDKSAtZyAkKENGTEFHUykgLWMgLW8gJEAgJDwKIApAQCAtMjAzLDYgKzIxMiwxMCBAQAogCQlAcm0gLWYgJChvYmopY3JjMzIuYwogCQlsbiAtcyAkKHNyYykuLi9saWJfZ2VuZXJpYy9jcmMzMi5jICQob2JqKWNyYzMyLmMKIAorJChvYmopc2hhMS5jOgorCQlAcm0gLWYgJChvYmopc2hhMS5jCisJCWxuIC1zICQoc3JjKS4uL2xpYl9nZW5lcmljL3NoYTEuYyAkKG9iailzaGExLmMKKwogJChMT0dPX0gpOgkkKG9iailibXBfbG9nbyAkKExPR09fQk1QKQogCQkkKG9iaikuL2JtcF9sb2dvICQoTE9HT19CTVApID4kQAogCmRpZmYgLS1naXQgYS90b29scy91YnNoYTEuYyBiL3Rvb2xzL3Vic2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzN2IyYjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy91YnNoYTEuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogSGVpa28gU2Nob2NoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxoc0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAic2hhMS5oIgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZQlfX0FTU0VNQkxZX18JCS8qIERpcnR5IHRyaWNrIHRvIGdldCBvbmx5ICNkZWZpbmVzCSovCisjZW5kaWYKKyNpbmNsdWRlIDxjb25maWcuaD4KKyN1bmRlZglfX0FTU0VNQkxZX18KKworI2lmbmRlZglPX0JJTkFSWQkJLyogc2hvdWxkIGJlIGRlZmluZSdkIG9uIF9fV0lOMzJfXyAqLworI2RlZmluZSBPX0JJTkFSWQkwCisjZW5kaWYKKworI2lmbmRlZiBNQVBfRkFJTEVECisjZGVmaW5lIE1BUF9GQUlMRUQgKC0xKQorI2VuZGlmCisKK2V4dGVybiBpbnQgZXJybm87CisKK2V4dGVybiB2b2lkIHNoYTFfY3N1bSAodW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0pOworCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXTsKKwlpbnQgaSwgbGVuOworCisJY2hhcgkqaW1hZ2VmaWxlOworCWNoYXIJKmNtZG5hbWUgPSAqYXJndjsKKwl1bnNpZ25lZCBjaGFyCSpwdHI7CisJdW5zaWduZWQgY2hhcgkqZGF0YTsKKwlzdHJ1Y3Qgc3RhdCBzYnVmOworCXVuc2lnbmVkIGNoYXIJKnB0cm9mZjsKKwlpbnQJaWZkOworCWludAlvZmY7CisKKwlpZiAoYXJnYyA+IDEpIHsKKwkJaW1hZ2VmaWxlID0gYXJndlsxXTsKKwkJaWZkID0gb3BlbiAoaW1hZ2VmaWxlLCBPX1JEV1J8T19CSU5BUlkpOworCQlpZiAoaWZkIDwgMCkgeworCQkJZnByaW50ZiAoc3RkZXJyLCAiJXM6IENhbid0IG9wZW4gJXM6ICVzXG4iLAorCQkJCWNtZG5hbWUsIGltYWdlZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQgKEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJaWYgKGZzdGF0IChpZmQsICZzYnVmKSA8IDApIHsKKwkJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBDYW4ndCBzdGF0ICVzOiAlc1xuIiwKKwkJCQljbWRuYW1lLCBpbWFnZWZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0IChFWElUX0ZBSUxVUkUpOworCQl9CisJCWxlbiA9IHNidWYuc3Rfc2l6ZTsKKwkJcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKDAsIGxlbiwKKwkJCQkgICAgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBpZmQsIDApOworCQlpZiAocHRyID09ICh1bnNpZ25lZCBjaGFyICopTUFQX0ZBSUxFRCkgeworCQkJZnByaW50ZiAoc3RkZXJyLCAiJXM6IENhbid0IHJlYWQgJXM6ICVzXG4iLAorCQkJCWNtZG5hbWUsIGltYWdlZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQgKEVYSVRfRkFJTFVSRSk7CisJCX0KKworCQkvKiBjcmVhdGUgYSBjb3B5LCBzbyB3ZSBjYW4gYmxhbmsgb3V0IHRoZSBzaGExIHN1bSAqLworCQlkYXRhID0gbWFsbG9jIChsZW4pOworCQltZW1jcHkgKGRhdGEsIHB0ciwgbGVuKTsKKwkJb2ZmID0gU0hBMV9TVU1fUE9TOworCQlwdHJvZmYgPSAmZGF0YVtsZW4gKyAgb2ZmXTsKKwkJZm9yIChpID0gMDsgaSA8IFNIQTFfU1VNX0xFTjsgaSsrKSB7CisJCQlwdHJvZmZbaV0gPSAwOworCQl9CisKKwkJc2hhMV9jc3VtICgodW5zaWduZWQgY2hhciAqKSBkYXRhLCBsZW4sICh1bnNpZ25lZCBjaGFyICopb3V0cHV0KTsKKworCQlwcmludGYgKCJVLUJvb3Qgc3VtOlxuIik7CisJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjAgOyBpKyspIHsKKwkgICAgICAgICAgICBwcmludGYgKCIlMDJYICIsIG91dHB1dFtpXSk7CisJICAgICAgICB9CisJICAgICAgICBwcmludGYgKCJcbiIpOworCQkvKiBvdmVyd3JpdGUgdGhlIHN1bSBpbiB0aGUgYmluIGZpbGUsIHdpdGggdGhlIGFjdHVhbCAqLworCQlsc2VlayAoaWZkLCBTSEExX1NVTV9QT1MsIFNFRUtfRU5EKTsKKwkJaWYgKHdyaXRlIChpZmQsIG91dHB1dCwgU0hBMV9TVU1fTEVOKSAhPSBTSEExX1NVTV9MRU4pIHsKKwkJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBDYW4ndCB3cml0ZSAlczogJXNcbiIsCisJCQkJY21kbmFtZSwgaW1hZ2VmaWxlLCBzdHJlcnJvcihlcnJubykpOworCQkJZXhpdCAoRVhJVF9GQUlMVVJFKTsKKwkJfQorCisJCWZyZWUgKGRhdGEpOworCQkodm9pZCkgbXVubWFwKCh2b2lkICopcHRyLCBsZW4pOworCQkodm9pZCkgY2xvc2UgKGlmZCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3VwZGF0ZXIvY21kX2ZsYXNoLmMgYi90b29scy91cGRhdGVyL2NtZF9mbGFzaC5jCmluZGV4IGMwZTU3NzIuLmE5NzZlMGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3VwZGF0ZXIvY21kX2ZsYXNoLmMKKysrIGIvdG9vbHMvdXBkYXRlci9jbWRfZmxhc2guYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxmbGFzaC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCiBleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsJLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMgKi8KIApAQCAtNDI3LDQgKzQyNyw0IEBACiAJcmV0dXJuIHJjb2RlOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9GTEFTSCAqLworI2VuZGlmCg==